diff --git a/.all-contributorsrc b/.all-contributorsrc index c8b79ba30e67..55ff294842e8 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -338,6 +338,173 @@ "contributions": [ "code" ] + }, + { + "login": "tustin2121", + "name": "tustin2121", + "avatar_url": "https://avatars.githubusercontent.com/u/794812?v=4", + "profile": "https://tustin2121.github.io/", + "contributions": [ + "doc", + "code" + ] + }, + { + "login": "Ddaretrogamer", + "name": "Phantonomy", + "avatar_url": "https://avatars.githubusercontent.com/u/131238004?v=4", + "profile": "https://github.com/Ddaretrogamer", + "contributions": [ + "design" + ] + }, + { + "login": "Syreldar", + "name": "Enrico Drago", + "avatar_url": "https://avatars.githubusercontent.com/u/42327659?v=4", + "profile": "https://metin2.dev/index.php", + "contributions": [ + "doc", + "userTesting" + ] + }, + { + "login": "Pyredrid", + "name": "Pyredrid", + "avatar_url": "https://avatars.githubusercontent.com/u/8324784?v=4", + "profile": "https://github.com/Pyredrid", + "contributions": [ + "userTesting", + "maintenance" + ] + }, + { + "login": "mvit", + "name": "mv", + "avatar_url": "https://avatars.githubusercontent.com/u/128863?v=4", + "profile": "https://github.com/mvit", + "contributions": [ + "code", + "design" + ] + }, + { + "login": "Mother-Of-Dragons", + "name": "Avara", + "avatar_url": "https://avatars.githubusercontent.com/u/31101124?v=4", + "profile": "https://github.com/Mother-Of-Dragons", + "contributions": [ + "data" + ] + }, + { + "login": "Doesnty", + "name": "Doesnty", + "avatar_url": "https://avatars.githubusercontent.com/u/6163136?v=4", + "profile": "https://github.com/Doesnty", + "contributions": [ + "design" + ] + }, + { + "login": "FosterProgramming", + "name": "FosterProgramming", + "avatar_url": "https://avatars.githubusercontent.com/u/178871164?v=4", + "profile": "https://github.com/FosterProgramming", + "contributions": [ + "code" + ] + }, + { + "login": "Squeetz", + "name": "Squeetz", + "avatar_url": "https://avatars.githubusercontent.com/u/21145213?v=4", + "profile": "https://github.com/Squeetz", + "contributions": [ + "maintenance" + ] + }, + { + "login": "ghostyboyy97", + "name": "ghostyboyy97", + "avatar_url": "https://avatars.githubusercontent.com/u/106448956?v=4", + "profile": "https://github.com/ghostyboyy97", + "contributions": [ + "code" + ] + }, + { + "login": "HashtagMarky", + "name": "Marky", + "avatar_url": "https://avatars.githubusercontent.com/u/143505183?v=4", + "profile": "http://hashtagmarky.github.io", + "contributions": [ + "code" + ] + }, + { + "login": "MandL27", + "name": "MandL27", + "avatar_url": "https://avatars.githubusercontent.com/u/10366615?v=4", + "profile": "https://github.com/MandL27", + "contributions": [ + "code" + ] + }, + { + "login": "cawtds", + "name": "cawtds", + "avatar_url": "https://avatars.githubusercontent.com/u/38510667?v=4", + "profile": "https://github.com/cawtds", + "contributions": [ + "code" + ] + }, + { + "login": "fdeblasio", + "name": "Frank DeBlasio", + "avatar_url": "https://avatars.githubusercontent.com/u/35279583?v=4", + "profile": "https://github.com/fdeblasio", + "contributions": [ + "code" + ] + }, + { + "login": "leo60228", + "name": "leo60228", + "avatar_url": "https://avatars.githubusercontent.com/u/8355305?v=4", + "profile": "https://vriska.dev", + "contributions": [ + "doc", + "data" + ] + }, + { + "login": "shachar700", + "name": "shachar700", + "avatar_url": "https://avatars.githubusercontent.com/u/48739719?v=4", + "profile": "https://github.com/shachar700", + "contributions": [ + "code" + ] + }, + { + "login": "purrfectdoodle", + "name": "Eva", + "avatar_url": "https://avatars.githubusercontent.com/u/105788407?v=4", + "profile": "http://purrfectdoodle.com", + "contributions": [ + "design" + ] + }, + { + "login": "amiosi", + "name": "amiosi", + "avatar_url": "https://avatars.githubusercontent.com/u/44352097?v=4", + "profile": "https://github.com/amiosi", + "contributions": [ + "data" + ] } ], "contributorsPerLine": 7, diff --git a/.gitattributes b/.gitattributes index 1f2aa0c6da14..a2dcec5e5d33 100644 --- a/.gitattributes +++ b/.gitattributes @@ -18,6 +18,9 @@ Makefile text eol=lf *.md text eol=lf *.ps1 text eol=crlf *.yml text eol=lf +*.party text eol=lf +*.cfg text eol=lf +*.ld text eol=lf *.png binary *.bin binary diff --git a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml index da15109c8c0a..2f25421ea0b4 100644 --- a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml +++ b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml @@ -7,6 +7,7 @@ body: value: | Please fill in all fields with as many details as possible. Once your bug is posted, make sure you and your collaborators are added to `CREDITS.md` by [tagging the bot on GitHub](https://github.com/rh-hideout/pokeemerald-expansion/wiki/CREDITS.md-Frequently-Asked-Questions). EVERY contribution matters, even reporting bugs! + - type: textarea id: description attributes: label: Description @@ -42,15 +43,16 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.12.0 (Latest release) + - 1.14.1 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) - - 1.11.4 - - 1.11.3 - - 1.11.2 - - 1.11.1 - - 1.11.0 - - pre-1.11.0 + - 1.14.0 + - 1.13.4 + - 1.13.3 + - 1.13.2 + - 1.13.1 + - 1.13.0 + - pre-1.13.0 validations: required: true - type: input diff --git a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml index 7b1a489cfb7c..b0ee16702173 100644 --- a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml +++ b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml @@ -43,15 +43,16 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.12.0 (Latest release) + - 1.14.1 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) - - 1.11.4 - - 1.11.3 - - 1.11.2 - - 1.11.1 - - 1.11.0 - - pre-1.11.0 + - 1.14.0 + - 1.13.4 + - 1.13.3 + - 1.13.2 + - 1.13.1 + - 1.13.0 + - pre-1.13.0 validations: required: true - type: input diff --git a/.github/ISSUE_TEMPLATE/04_other_errors.yaml b/.github/ISSUE_TEMPLATE/04_other_errors.yaml index 197791a77620..4dcb2b309336 100644 --- a/.github/ISSUE_TEMPLATE/04_other_errors.yaml +++ b/.github/ISSUE_TEMPLATE/04_other_errors.yaml @@ -43,14 +43,16 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.12.0 (Latest release) + - 1.14.1 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) - - 1.11.4 - - 1.11.3 - - 1.11.1 - - 1.11.0 - - pre-1.11.0 + - 1.14.0 + - 1.13.4 + - 1.13.3 + - 1.13.2 + - 1.13.1 + - 1.13.0 + - pre-1.13.0 validations: required: true - type: input diff --git a/.github/docs_validate/inclusive_summary.py b/.github/docs_validate/inclusive_summary.py new file mode 100755 index 000000000000..76e0218abc41 --- /dev/null +++ b/.github/docs_validate/inclusive_summary.py @@ -0,0 +1,64 @@ +#!/usr/bin/python3 + +""" +Checks that all documentation pages that should be mentioned in +`docs/SUMMARY.md` are mentioned the file +""" + +import glob +import re +import os +from pathlib import Path + +errorLines = [] + +if not os.path.exists("Makefile"): + errorLines.append("Please run this script from your root folder.") + +summaryFile = Path("docs/SUMMARY.md") +if not errorLines: + if not summaryFile.is_file(): + errorLines.append("docs/SUMMARY.md missing") + +summaryContents = [] +if not errorLines: + with open(summaryFile, 'r', encoding='UTF-8') as file: + entry_pattern = re.compile(r" *\- \[[^\]]*\]\(([^\)]*)\)\n") + lineNo = 0 + while line:=file.readline(): + lineNo = lineNo + 1 + if line == "# Summary\n" or line == "\n": + pass + elif match:=entry_pattern.match(line): + if "" != match.group(1): + summaryContents.append(Path(match.group(1))) + else: + if not errorLines: + errorLines.append("## Unexpected lines in docs/SUMMARY.md") + errorLines.append(f"- {lineNo}: {line.strip()}") + +if not errorLines: + for pathName in glob.glob("**/*.md", root_dir="docs", recursive=True): + path = Path(pathName) + if path == Path("SUMMARY.md"): + pass + elif path == Path("changelogs/template.md"): + pass + elif path in summaryContents: + pass + else: + if not errorLines: + errorLines.append("## `docs/**/*.md` files present but not mentioned in `docs/SUMMARY.md`") + errorLines.append("- " + str(path)) + +if errorLines: + for line in errorLines: + print(line) + + if 'GITHUB_STEP_SUMMARY' in os.environ: + with open(os.environ['GITHUB_STEP_SUMMARY'], 'w', encoding='UTF-8') as file: + for line in errorLines: + file.write(line) + file.write('\n') + + quit(1) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index dc900e224e71..21785498fb2d 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -24,6 +24,7 @@ + diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 30231dbd0f5f..da1a943e8333 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,12 +31,30 @@ jobs: env: COMPARE: 0 run: make -j${nproc} -O all + + - name: LTO + run: | + make tidy + make -j${nproc} LTO=1 + # make tidy to purge previous build - name: Test env: TEST: 1 run: | make -j${nproc} check + + docs_validate: + if: github.actor != 'allcontributors[bot]' + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Check that SUMMARY.md includes markdown doc files + run: | + .github/docs_validate/inclusive_summary.py + allcontributors: if: github.actor == 'allcontributors[bot]' runs-on: ubuntu-latest diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 874ebdd5906a..09e7c78c0c00 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -17,7 +17,7 @@ jobs: fetch-depth: 0 - name: Install latest mdbook run: | - tag=$(curl 'https://api.github.com/repos/rust-lang/mdbook/releases/latest' | jq -r '.tag_name') + tag="v0.5.1" url="https://github.com/rust-lang/mdbook/releases/download/${tag}/mdbook-${tag}-x86_64-unknown-linux-gnu.tar.gz" mkdir mdbook curl -sSL $url | tar -xz --directory=./mdbook diff --git a/.github/workflows/labels.yml b/.github/workflows/labels.yml index 325e72950d11..3cc4ee57a785 100644 --- a/.github/workflows/labels.yml +++ b/.github/workflows/labels.yml @@ -3,10 +3,12 @@ name: Labels on: pull_request: types: [opened, synchronize, labeled, unlabeled] + pull_request_review: + types: [submitted] jobs: label: - if: github.actor != 'allcontributors[bot]' + if: ${{ github.actor != 'allcontributors[bot]' && github.event.review.state == 'approved' }} runs-on: ubuntu-latest steps: - name: check labels diff --git a/.gitignore b/.gitignore index 6d9453242aa2..686677dac252 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,9 @@ *.8bpp *.gbapal *.lz +*.smol +*.fastSmol +*.smolTM *.rl *.latfont *.hwjpnfont @@ -40,7 +43,15 @@ prefabs.json *.js /pokeemerald-*.png src/data/map_group_count.h +include/constants/heal_locations.h +include/constants/script_commands.h tools/trainerproc/trainerproc +src/data/battle_partners.h +src/data/trainers.h +src/data/debug_trainers.h +test/battle/trainer_control.h +tools/compresSmol/compresSmol +tools/compresSmol/compresSmolTilemap *.Identifier *.smol *.fastSmol diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b89016fdddac..88ef358dbb20 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,7 +23,7 @@ The best bug reports have enough information that we won't have to contact you f - A maintainer will [label](https://github.com/rh-hideout/pokeemerald-expansion/labels) the bug report. - A maintainer will try to reproduce the bug with your provided steps. - - If there are no reproduction steps or no obvious way to reproduce the issue, somebody will ask you for those steps. Until the bug can be reproduced, the bug will retain the `bug:unconfirmed` label. Unconfirmed bugs are less likely get fixed. + - If there are no reproduction steps or no obvious way to reproduce the issue, somebody will ask you for those steps. Until the bug can be reproduced, the bug will retain the `bug:unconfirmed` label. Unconfirmed bugs are less likely to get fixed. - If the team is able to reproduce the bug, it will be labeled `bug:confirmed`, and the bug will be left to be [fixed by someone](#Pull-Requests). - If the issue is particularly game-breaking, a maintainer will add it to a future version's [milestone](), meaning that version will not be released until the problem is solved. diff --git a/CREDITS.md b/CREDITS.md index ab5c59624876..dfec2d747cdd 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -58,7 +58,31 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Zatsu
Zatsu

πŸ’» poetahto
poetahto

πŸ’» lordraindance2
lordraindance2

πŸ’» - Pablo Pena
Pablo Pena

πŸ’» + Pablo Pena
Pablo Pena

πŸ’» + tustin2121
tustin2121

πŸ“– πŸ’» + Phantonomy
Phantonomy

🎨 + + + Enrico Drago
Enrico Drago

πŸ“– πŸ““ + Pyredrid
Pyredrid

πŸ““ 🚧 + mv
mv

πŸ’» 🎨 + Avara
Avara

πŸ”£ + Doesnty
Doesnty

🎨 + FosterProgramming
FosterProgramming

πŸ’» + Squeetz
Squeetz

🚧 + + + ghostyboyy97
ghostyboyy97

πŸ’» + Marky
Marky

πŸ’» + MandL27
MandL27

πŸ’» + cawtds
cawtds

πŸ’» + Frank DeBlasio
Frank DeBlasio

πŸ’» + leo60228
leo60228

πŸ“– πŸ”£ + shachar700
shachar700

πŸ’» + + + Eva
Eva

🎨 + amiosi
amiosi

πŸ”£ diff --git a/INSTALL.md b/INSTALL.md index d2e511dacee3..47f00cf78fb5 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -14,8 +14,8 @@ After completing the install instructions for your OS, proceed to [Building poke On Windows, the project can be built using the following systems: - WSL2, fastest - WSL1, 7 times slower than WSL2 -- Msys2, 20 times slower than WSL2 (**NOTE**: Currently broken on pret upstream) -- Cygwin, 30 timer slower than WSL2 (**NOTE**: Currently broken on pret upstream) +- Msys2, 20 times slower than WSL2 +- Cygwin, 30 timer slower than WSL2 **NOTE**: Only WSL systems are recommended. @@ -32,6 +32,7 @@ Distributions with instructions: - [Debian](docs/install/linux/DEBIAN.md) - [Arch Linux](docs/install/linux/ARCH_LINUX.md) - [NixOS](docs/install/linux/NIXOS.md) +- [Fedora](docs/install/linux/FEDORA.md) Other distributions have to infer what to do from [general instructions](docs/install/linux/OTHERS.md). @@ -179,6 +180,6 @@ If you targeted a specific version that is not the latest version listed on the # Useful additional tools * [porymap](https://github.com/huderlem/porymap) for viewing and editing maps -* [porytiles](https://github.com/gruntlucas/porytiles) for add new metatiles for maps +* [porytiles](https://github.com/grunt-lucas/porytiles) for add new metatiles for maps * [poryscript](https://github.com/huderlem/poryscript) for scripting ([VS Code extension](https://marketplace.visualstudio.com/items?itemName=karathan.poryscript)) * [Tilemap Studio](https://github.com/Rangi42/tilemap-studio) for viewing and editing tilemaps diff --git a/Makefile b/Makefile index 9cf34b7fa82f..8160f6e1e14d 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,32 @@ +GAME_VERSION ?= EMERALD +TITLE ?= POKEMON EMER +GAME_CODE ?= BPEE +BUILD_NAME ?= emerald +MAP_VERSION ?= emerald + +ifeq (firered,$(MAKECMDGOALS)) + GAME_VERSION := FIRERED + TITLE := POKEMON FIRE + GAME_CODE := BPRE + BUILD_NAME := firered + MAP_VERSION := firered +else +ifeq (leafgreen,$(MAKECMDGOALS)) + GAME_VERSION := LEAFGREEN + TITLE := POKEMON LEAF + GAME_CODE := BPGE + BUILD_NAME := leafgreen + MAP_VERSION := firered +endif +endif + # GBA rom header -TITLE := POKEMON EMER -GAME_CODE := BPEE MAKER_CODE := 01 REVISION := 0 KEEP_TEMPS ?= 0 # `File name`.gba -FILE_NAME := pokeemerald +FILE_NAME := poke$(BUILD_NAME) BUILD_DIR := build # Compares the ROM to a checksum of the original - only makes sense using when non-modern @@ -19,6 +39,11 @@ ANALYZE ?= 0 UNUSED_ERROR ?= 0 # Adds -Og and -g flags, which optimize the build for debugging and include debug info respectively DEBUG ?= 0 +# Adds -flto flag, which increases link time but results in a more efficient binary (especially in audio processing) +LTO ?= 0 +# Makes an optimized build for release, also enabling NDEBUG macro and disabling other debugging features +# Enables LTO by default, but can be changed in the config.mk file +RELEASE ?= 0 ifeq (compare,$(MAKECMDGOALS)) COMPARE := 1 @@ -29,6 +54,11 @@ endif ifeq (debug,$(MAKECMDGOALS)) DEBUG := 1 endif +ifneq (,$(filter release tidyrelease,$(MAKECMDGOALS))) + RELEASE := 1 +endif + +include config.mk # Default make rule all: rom @@ -60,10 +90,15 @@ endif CPP := $(PREFIX)cpp +ifeq ($(RELEASE),1) + FILE_NAME := $(FILE_NAME)-release +endif + ROM_NAME := $(FILE_NAME).gba -OBJ_DIR_NAME := $(BUILD_DIR)/modern -OBJ_DIR_NAME_TEST := $(BUILD_DIR)/modern-test -OBJ_DIR_NAME_DEBUG := $(BUILD_DIR)/modern-debug +OBJ_DIR_NAME := $(BUILD_DIR)/$(BUILD_NAME) +OBJ_DIR_NAME_TEST := $(BUILD_DIR)/$(BUILD_NAME)-test +OBJ_DIR_NAME_DEBUG := $(BUILD_DIR)/$(BUILD_NAME)-debug +OBJ_DIR_NAME_RELEASE := $(BUILD_DIR)/$(BUILD_NAME)-release ELF_NAME := $(ROM_NAME:.gba=.elf) MAP_NAME := $(ROM_NAME:.gba=.map) @@ -83,6 +118,9 @@ endif ifeq ($(DEBUG),1) OBJ_DIR := $(OBJ_DIR_NAME_DEBUG) endif +ifeq ($(RELEASE),1) + OBJ_DIR := $(OBJ_DIR_NAME_RELEASE) +endif ELF := $(ROM:.gba=.elf) MAP := $(ROM:.gba=.map) SYM := $(ROM:.gba=.sym) @@ -106,7 +144,7 @@ TEST_BUILDDIR = $(OBJ_DIR)/$(TEST_SUBDIR) SHELL := bash -o pipefail # Set flags for tools -ASFLAGS := -mcpu=arm7tdmi --defsym MODERN=1 +ASFLAGS := -mcpu=arm7tdmi -march=armv4t -meabi=5 --defsym MODERN=1 --defsym $(GAME_VERSION)=1 INCLUDE_DIRS := include INCLUDE_CPP_ARGS := $(INCLUDE_DIRS:%=-iquote %) @@ -117,11 +155,25 @@ O_LEVEL ?= g else O_LEVEL ?= 2 endif -CPPFLAGS := $(INCLUDE_CPP_ARGS) -Wno-trigraphs -DMODERN=1 -DTESTING=$(TEST) -std=gnu17 +CPPFLAGS := $(INCLUDE_CPP_ARGS) -Wno-trigraphs -DMODERN=1 -DTESTING=$(TEST) -D$(GAME_VERSION) -std=gnu17 +ifeq ($(RELEASE),1) + override CPPFLAGS += -DRELEASE + ifeq ($(USE_LTO_ON_RELEASE),1) + LTO := 1 + endif +endif ARMCC := $(PREFIX)gcc PATH_ARMCC := PATH="$(PATH)" $(ARMCC) CC1 := $(shell $(PATH_ARMCC) --print-prog-name=cc1) -quiet -override CFLAGS += -mthumb -mthumb-interwork -O$(O_LEVEL) -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -Wno-pointer-to-int-cast -std=gnu17 -Werror -Wall -Wno-strict-aliasing -Wno-attribute-alias -Woverride-init + +override CFLAGS += -mthumb -mthumb-interwork -O$(O_LEVEL) -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -Wno-pointer-to-int-cast -std=gnu17 -Werror -Wall -Wno-strict-aliasing -Wno-attribute-alias -Woverride-init -Wnonnull -Wenum-conversion + +ifneq ($(LTO),0) + ifneq ($(TEST),1) + override CFLAGS += -flto=auto -fno-fat-lto-objects -fno-asynchronous-unwind-tables -ffunction-sections -fdata-sections + endif +endif + ifeq ($(ANALYZE),1) override CFLAGS += -fanalyzer endif @@ -151,8 +203,10 @@ endif AUTO_GEN_TARGETS := include make_tools.mk # Tool executables +SMOLTM := $(TOOLS_DIR)/compresSmol/compresSmolTilemap$(EXE) +SMOL := $(TOOLS_DIR)/compresSmol/compresSmol$(EXE) GFX := $(TOOLS_DIR)/gbagfx/gbagfx$(EXE) -AIF := $(TOOLS_DIR)/aif2pcm/aif2pcm$(EXE) +WAV2AGB := $(TOOLS_DIR)/wav2agb/wav2agb$(EXE) MID := $(TOOLS_DIR)/mid2agb/mid2agb$(EXE) SCANINC := $(TOOLS_DIR)/scaninc/scaninc$(EXE) PREPROC := $(TOOLS_DIR)/preproc/preproc$(EXE) @@ -183,10 +237,18 @@ ALL_LEARNABLES_JSON := $(LEARNSET_HELPERS_BUILD_DIR)/all_learnables.json WILD_ENCOUNTERS_TOOL_DIR := $(TOOLS_DIR)/wild_encounters AUTO_GEN_TARGETS += $(DATA_SRC_SUBDIR)/wild_encounters.h +MISC_TOOL_DIR := $(TOOLS_DIR)/misc +AUTO_GEN_TARGETS += $(INCLUDE_DIRS)/constants/script_commands.h + $(DATA_SRC_SUBDIR)/wild_encounters.h: $(DATA_SRC_SUBDIR)/wild_encounters.json $(WILD_ENCOUNTERS_TOOL_DIR)/wild_encounters_to_header.py $(INCLUDE_DIRS)/config/overworld.h $(INCLUDE_DIRS)/config/dexnav.h - python3 $(WILD_ENCOUNTERS_TOOL_DIR)/wild_encounters_to_header.py > $@ + python3 $(WILD_ENCOUNTERS_TOOL_DIR)/wild_encounters_to_header.py + +$(INCLUDE_DIRS)/constants/script_commands.h: $(MISC_TOOL_DIR)/make_scr_cmd_constants.py $(DATA_ASM_SUBDIR)/script_cmd_table.inc + python3 $(MISC_TOOL_DIR)/make_scr_cmd_constants.py $(C_BUILDDIR)/wild_encounter.o: c_dep += $(DATA_SRC_SUBDIR)/wild_encounters.h +$(C_BUILDDIR)/trainer_see.o: c_dep += $(INCLUDE_DIRS)/constants/script_commands.h +$(C_BUILDDIR)/vs_seeker.o: c_dep += $(INCLUDE_DIRS)/constants/script_commands.h PERL := perl SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c @@ -200,8 +262,8 @@ MAKEFLAGS += --no-print-directory # Delete files that weren't built properly .DELETE_ON_ERROR: -RULES_NO_SCAN += libagbsyscall clean clean-assets tidy tidymodern tidycheck generated clean-generated -.PHONY: all rom agbcc modern compare check debug +RULES_NO_SCAN += libagbsyscall clean clean-assets tidy tidymodern tidycheck tidyrelease generated clean-generated +.PHONY: all rom agbcc modern compare check debug release .PHONY: $(RULES_NO_SCAN) infoshell = $(foreach line, $(shell $1 | sed "s/ /__SPACE__/g"), $(info $(subst __SPACE__, ,$(line)))) @@ -228,7 +290,7 @@ ifeq ($(SETUP_PREREQS),1) $(error Errors occurred while building tools. See error messages above for more details) endif # Oh and also generate mapjson sources before we use `SCANINC`. - $(foreach line, $(shell $(MAKE) generated | sed "s/ /__SPACE__/g"), $(info $(subst __SPACE__, ,$(line)))) + $(foreach line, $(shell $(MAKE) MAP_VERSION=$(MAP_VERSION) generated | sed "s/ /__SPACE__/g"), $(info $(subst __SPACE__, ,$(line)))) ifneq ($(.SHELLSTATUS),0) $(error Errors occurred while generating map-related sources. See error messages above for more details) endif @@ -272,6 +334,7 @@ $(shell mkdir -p $(SUBDIRS)) modern: all compare: all debug: all +release: all # Uncomment the next line, and then comment the 4 lines after it to reenable agbcc. #agbcc: all agbcc: @@ -281,14 +344,14 @@ agbcc: LD_SCRIPT_TEST := ld_script_test.ld -$(OBJ_DIR)/ld_script_test.ld: $(LD_SCRIPT_TEST) $(LD_SCRIPT_DEPS) +$(OBJ_DIR)/ld_script_test.ld: $(LD_SCRIPT_TEST) cd $(OBJ_DIR) && sed "s#tools/#../../tools/#g" ../../$(LD_SCRIPT_TEST) > ld_script_test.ld $(TESTELF): $(OBJ_DIR)/ld_script_test.ld $(OBJS) $(TEST_OBJS) libagbsyscall tools check-tools @echo "cd $(OBJ_DIR) && $(LD) -T ld_script_test.ld -o ../../$@ " @cd $(OBJ_DIR) && $(LD) $(TESTLDFLAGS) -T ld_script_test.ld -o ../../$@ $(OBJS_REL) $(TEST_OBJS_REL) $(LIB) $(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) -d0 --silent - $(PATCHELF) $(TESTELF) gTestRunnerArgv "$(TESTS)\0" + $(PATCHELF) $(TESTELF) gTestRunnerArgv "$(TESTS:%*=%)\0" ifeq ($(GITHUB_REPOSITORY_OWNER),rh-hideout) TEST_SKIP_IS_FAIL := \x01 @@ -317,10 +380,10 @@ clean-assets: rm -f $(DATA_ASM_SUBDIR)/layouts/layouts.inc $(DATA_ASM_SUBDIR)/layouts/layouts_table.inc rm -f $(DATA_ASM_SUBDIR)/maps/connections.inc $(DATA_ASM_SUBDIR)/maps/events.inc $(DATA_ASM_SUBDIR)/maps/groups.inc $(DATA_ASM_SUBDIR)/maps/headers.inc $(DATA_SRC_SUBDIR)/map_group_count.h find sound -iname '*.bin' -exec rm {} + - find . \( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' -o -iname '*.rl' -o -iname '*.latfont' -o -iname '*.hwjpnfont' -o -iname '*.fwjpnfont' \) -exec rm {} + + find . \( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' -o -iname '*.smol' -o -iname '*.fastSmol' -o -iname '*.smolTM' -o -iname '*.rl' -o -iname '*.latfont' -o -iname '*.hwjpnfont' -o -iname '*.fwjpnfont' \) -exec rm {} + find $(DATA_ASM_SUBDIR)/maps \( -iname 'connections.inc' -o -iname 'events.inc' -o -iname 'header.inc' \) -exec rm {} + -tidy: tidymodern tidycheck tidydebug +tidy: tidymodern tidycheck tidydebug tidyrelease tidymodern: rm -f $(ROM_NAME) $(ELF_NAME) $(MAP_NAME) @@ -333,12 +396,21 @@ tidycheck: tidydebug: rm -rf $(DEBUG_OBJ_DIR_NAME) +tidyrelease: +ifeq ($(RELEASE),1) + rm -f $(ROM_NAME) $(ELF_NAME) $(MAP_NAME) +else # Manually remove the release files on clean/tidy + rm -f $(FILE_NAME)-release.gba $(FILE_NAME)-release.elf $(FILE_NAME)-release.map +endif + rm -rf $(OBJ_DIR_NAME_RELEASE) + # Other rules include graphics_file_rules.mk include map_data_rules.mk include spritesheet_rules.mk include json_data_rules.mk include audio_rules.mk +include trainer_rules.mk # NOTE: Tools must have been built prior (FIXME) # so you can't really call this rule directly @@ -349,15 +421,18 @@ generated: $(AUTO_GEN_TARGETS) %.s: ; %.png: ; %.pal: ; -%.aif: ; - -%.1bpp: %.png ; $(GFX) $< $@ -%.4bpp: %.png ; $(GFX) $< $@ -%.8bpp: %.png ; $(GFX) $< $@ -%.gbapal: %.pal ; $(GFX) $< $@ -%.gbapal: %.png ; $(GFX) $< $@ -%.lz: % ; $(GFX) $< $@ -%.rl: % ; $(GFX) $< $@ +%.wav: ; + +%.1bpp: %.png ; $(GFX) $< $@ +%.4bpp: %.png ; $(GFX) $< $@ +%.8bpp: %.png ; $(GFX) $< $@ +%.gbapal: %.pal ; $(GFX) $< $@ +%.gbapal: %.png ; $(GFX) $< $@ +%.lz: % ; $(GFX) $< $@ +%.smolTM: % ; $(SMOLTM) $< $@ +%.fastSmol: % ; $(SMOL) -w $< $@ false false false +%.smol: % ; $(SMOL) -w $< $@ +%.rl: % ; $(GFX) $< $@ clean-generated: @rm -f $(AUTO_GEN_TARGETS) @@ -365,11 +440,6 @@ clean-generated: @rm -f $(ALL_LEARNABLES_JSON) @echo "rm -f " -COMPETITIVE_PARTY_SYNTAX := $(shell PATH="$(PATH)"; echo 'COMPETITIVE_PARTY_SYNTAX' | $(CPP) $(CPPFLAGS) -imacros include/gba/defines.h -imacros include/config/general.h | tail -n1) -ifeq ($(COMPETITIVE_PARTY_SYNTAX),1) -%.h: %.party ; $(CPP) $(CPPFLAGS) -traditional-cpp - < $< | $(TRAINERPROC) -o $@ -i $< - -endif - $(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)/berry_crush.o: override CFLAGS += -Wno-address-of-packed-member $(C_BUILDDIR)/agb_flash.o: override CFLAGS += -fno-toplevel-reorder @@ -430,7 +500,7 @@ ifneq ($(NODEP),1) endif $(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.s - $(PREPROC) $< charmap.txt | $(CPP) $(INCLUDE_SCANINC_ARGS) - | $(PREPROC) -ie $< charmap.txt | $(AS) $(ASFLAGS) -o $@ + $(PREPROC) $< charmap.txt | $(CPP) $(CPPFLAGS) $(INCLUDE_SCANINC_ARGS) - | $(PREPROC) -ie $< charmap.txt | $(AS) $(ASFLAGS) -o $@ $(C_BUILDDIR)/%.d: $(C_SUBDIR)/%.s $(SCANINC) -M $@ $(INCLUDE_SCANINC_ARGS) -I "" $< @@ -440,7 +510,7 @@ ifneq ($(NODEP),1) endif $(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s - $(PREPROC) $< charmap.txt | $(CPP) $(INCLUDE_SCANINC_ARGS) - | $(PREPROC) -ie $< charmap.txt | $(AS) $(ASFLAGS) -o $@ + $(PREPROC) $< charmap.txt | $(CPP) $(CPPFLAGS) $(INCLUDE_SCANINC_ARGS) - | $(PREPROC) -ie $< charmap.txt | $(AS) $(ASFLAGS) -o $@ $(DATA_ASM_BUILDDIR)/%.d: $(DATA_ASM_SUBDIR)/%.s $(SCANINC) -M $@ $(INCLUDE_SCANINC_ARGS) -I "" $< @@ -471,25 +541,37 @@ $(DATA_SRC_SUBDIR)/pokemon/teachable_learnsets.h: $(TEACHABLE_DEPS) # Linker script LD_SCRIPT := ld_script_modern.ld -LD_SCRIPT_DEPS := # Final rules libagbsyscall: @$(MAKE) -C libagbsyscall TOOLCHAIN=$(TOOLCHAIN) MODERN=1 -# Elf from object files -LDFLAGS = -Map ../../$(MAP) -$(ELF): $(LD_SCRIPT) $(LD_SCRIPT_DEPS) $(OBJS) libagbsyscall - @cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ../../$< --print-memory-usage -o ../../$@ $(OBJS_REL) $(LIB) | cat - @echo "cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ../../$< --print-memory-usage -o ../../$@ | cat" +# Enable LTO LDFLAGS if set +ifneq ($(LTO),0) +LDFLAGS := -march=armv4t -mabi=apcs-gnu -mcpu=arm7tdmi -Xlinker -Map=../../$(MAP) -Xlinker --print-memory-usage -Xassembler -meabi=5 -Xassembler -march=armv4t -Xassembler -mcpu=arm7tdmi -Xlinker --gc-sections +LDFLAGS += -Xlinker -flto=auto +$(ELF): $(LD_SCRIPT) $(OBJS) libagbsyscall + @echo "cd $(OBJ_DIR) && $(ARMCC) $(LDFLAGS) -T ../../$< -o ../../$@ " + +@cd $(OBJ_DIR) && $(ARMCC) $(LDFLAGS) -T ../../$< -o ../../$@ $(OBJS_REL) $(LIB) $(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) --silent +else +# Output .map file, memory usage readout and gc sections to clean-up unused data +LDFLAGS = -Map ../../$(MAP) --print-memory-usage --gc-sections +$(ELF): $(LD_SCRIPT) $(OBJS) libagbsyscall + @cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ../../$< -o ../../$@ $(OBJS_REL) $(LIB) | cat + @echo "cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ../../$< -o ../../$@ | cat" + $(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) --silent +endif # Builds the rom from the elf file $(ROM): $(ELF) $(OBJCOPY) -O binary $< $@ $(FIX) $@ -p --silent +emerald: all +firered: all +leafgreen: all # Symbol file (`make syms`) $(SYM): $(ELF) $(OBJDUMP) -t $< | sort -u | grep -E "^0[2389]" | $(PERL) -p -e 's/^(\w{8}) (\w).{6} \S+\t(\w{8}) (\S+)$$/\1 \2 \3 \4/g' > $@ diff --git a/README.md b/README.md index 626eea5d7ebb..8094c29e85e5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # About `pokeemerald-expansion` -![Gif that shows debugging functionality that is unique to pokeemerald-expansion such as rerolling Trainer Id, Cheat Start, PC from Debug Menu, Debug PC Fill, Pokemon Sprite Visualizer, Debug Warp to Map, and Battle Debug Menu](https://github.com/user-attachments/assets/cf9dfbee-4c6b-4bca-8e0a-07f116ef891c) ![Gif that shows overworld functionality that is unique to pokeemerald-expansion such as indoor running, BW2 style map popups, overworld followers, DNA Splicers, Gen 1 style fishing, OW Item descriptions, Quick Run from Battle, Use Last Ball, Wild Double Battles, and Catch from EXP](https://github.com/user-attachments/assets/383af243-0904-4d41-bced-721492fbc48e) ![Gif that shows off a number of modern Pokemon battle mechanics happening in the pokeemerald-expansion engine: 2 vs 1 battles, modern Pokemon, items, moves, abilities, fully customizable opponents and partners, Trainer Slides, and generational gimmicks](https://github.com/user-attachments/assets/50c576bc-415e-4d66-a38f-ad712f3316be) +![Gif that shows debugging functionality that is unique to pokeemerald-expansion such as rerolling Trainer ID, Cheat Start, PC from Debug Menu, Debug PC Fill, PokΓ©mon Sprite Visualizer, Debug Warp to Map, and Battle Debug Menu](https://github.com/user-attachments/assets/cf9dfbee-4c6b-4bca-8e0a-07f116ef891c) ![Gif that shows overworld functionality that is unique to pokeemerald-expansion such as indoor running, BW2 style map popups, overworld followers, DNA Splicers, Gen 1 style fishing, OW Item descriptions, Quick Run from Battle, Use Last Ball, Wild Double Battles, and Catch from EXP](https://github.com/user-attachments/assets/383af243-0904-4d41-bced-721492fbc48e) ![Gif that shows off a number of modern PokΓ©mon battle mechanics happening in the pokeemerald-expansion engine: 2 vs 1 battles, modern PokΓ©mon, items, moves, abilities, fully customizable opponents and partners, Trainer Slides, and generational gimmicks](https://github.com/user-attachments/assets/50c576bc-415e-4d66-a38f-ad712f3316be) @@ -8,7 +8,7 @@ # [Features](FEATURES.md) -**`pokeemerald-expansion`** offers hundreds of features from various [core series PokΓ©mon games](https://bulbapedia.bulbagarden.net/wiki/Core_series), along with popular quality-of-life enhancements designed to streamline development and improve the player experience. A full list of those featues can be found in [`FEATURES.md`](FEATURES.md). +**`pokeemerald-expansion`** offers hundreds of features from various [core series PokΓ©mon games](https://bulbapedia.bulbagarden.net/wiki/Core_series), along with popular quality-of-life enhancements designed to streamline development and improve the player experience. A full list of those features can be found in [`FEATURES.md`](FEATURES.md). # [Credits](CREDITS.md) @@ -17,7 +17,7 @@ If you use **`pokeemerald-expansion`**, please credit **RHH (Rom Hacking Hideout)**. Optionally, include the version number for clarity. ``` -Based off RHH's pokeemerald-expansion 1.12.0 https://github.com/rh-hideout/pokeemerald-expansion/ +Based off RHH's pokeemerald-expansion 1.14.1 https://github.com/rh-hideout/pokeemerald-expansion/ ``` Please consider [crediting all contributors](CREDITS.md) involved in the project! @@ -32,7 +32,7 @@ Please consider [crediting all contributors](CREDITS.md) involved in the project ❗❗ **Important**: Do not use GitHub's "Download Zip" option as it will not include commit history. This is necessary if you want to update or merge other feature branches. -If you're new to git and GitHub, [Team Aqua's Asset Repo](https://github.com/Pawkkie/Team-Aquas-Asset-Repo/) has a [guide on forking and cloning the repository](https://github.com/Pawkkie/Team-Aquas-Asset-Repo/wiki/The-Basics-of-GitHub). Then you can follow one of the following guides: +If you're new to git and GitHub, [Team Aqua's Asset Repo](https://github.com/Pawkkie/Team-Aquas-Asset-Repo/) has a [guide to forking and cloning the repository](https://github.com/Pawkkie/Team-Aquas-Asset-Repo/wiki/The-Basics-of-GitHub). Then you can follow one of the following guides: ## πŸ“₯ [Installing **`pokeemerald-expansion`**](INSTALL.md) ## πŸ—οΈ [Building **`pokeemerald-expansion`**](INSTALL.md#Building-pokeemerald-expansion) @@ -50,4 +50,4 @@ If you are looking to [report a bug](CONTRIBUTING.md#Bug-Report), [open a pull r [![](https://dcbadge.limes.pink/api/server/6CzjAG6GZk)](https://discord.gg/6CzjAG6GZk) -Our community uses the [Rom Hacking Hideout (RHH) Discord server](https://discord.gg/6CzjAG6GZk) to communicate and organize. Most of our discussions take place there, and we welcome anybody to join us! +Our community uses the [ROM Hacking Hideout (RHH) Discord server](https://discord.gg/6CzjAG6GZk) to communicate and organize. Most of our discussions take place there, and we welcome anybody to join us! diff --git a/asm/macros/battle_anim_script.inc b/asm/macros/battle_anim_script.inc index 1b35991809e2..3d60680da685 100644 --- a/asm/macros/battle_anim_script.inc +++ b/asm/macros/battle_anim_script.inc @@ -288,7 +288,7 @@ .byte 0x31 .4byte \template .if \anim_battler == ANIM_TARGET - .byte 0x80 | (\subpriority_offset & 0x7F) + .byte ANIMSPRITE_IS_TARGET | (\subpriority_offset & 0x7F) .else .byte (\subpriority_offset & 0x7F) .endif @@ -304,7 +304,7 @@ .byte 0x32 .4byte \template .if \anim_battler == ANIM_TARGET - .byte 0x80 | (\subpriority_offset & 0x7F) + .byte ANIMSPRITE_IS_TARGET | (\subpriority_offset & 0x7F) .else .byte (\subpriority_offset & 0x7F) .endif diff --git a/asm/macros/battle_frontier/battle_pyramid.inc b/asm/macros/battle_frontier/battle_pyramid.inc index bb5069f18a2c..42141d993784 100644 --- a/asm/macros/battle_frontier/battle_pyramid.inc +++ b/asm/macros/battle_frontier/battle_pyramid.inc @@ -69,8 +69,8 @@ .endm @ VAR_RESULT is 1 if player is on a Pyramid floor, 2 if on the Pyramid peak, 0 otherwise - .macro pyramid_inchallenge - setvar VAR_0x8004, BATTLE_PYRAMID_FUNC_IS_IN + .macro pyramid_getlocation + setvar VAR_0x8004, BATTLE_PYRAMID_FUNC_CURRENT_LOCATION special CallBattlePyramidFunction .endm diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index b524104a36f9..7eb3b9d06456 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -9,11 +9,11 @@ .2byte \move .endm - .macro attackstring + .macro printattackstring .byte 0x2 .endm - .macro ppreduce + .macro unused_0x3 .byte 0x3 .endm @@ -45,14 +45,16 @@ .byte 0xa .endm - .macro healthbarupdate battler:req + .macro healthbarupdate battler:req updateState:req .byte 0xb .byte \battler + .byte \updateState .endm - .macro datahpupdate battler:req + .macro datahpupdate battler:req updateState:req .byte 0xc .byte \battler + .byte \updateState .endm .macro critmessage @@ -102,26 +104,28 @@ jumpifhalfword CMP_EQUAL, sMOVE_EFFECT, MOVE_EFFECT_CONTINUE, 1b .endm - .macro seteffectprimary moveEffect=0 + .macro seteffectprimary battler:req, effectBattler:req, moveEffect=0 .if \moveEffect != 0 setmoveeffect \moveEffect .endif .byte 0x16 + .byte \battler + .byte \effectBattler .endm - .macro seteffectsecondary moveEffect=0 + .macro seteffectsecondary battler:req, effectBattler:req, moveEffect=0 .if \moveEffect != 0 setmoveeffect \moveEffect .endif .byte 0x17 + .byte \battler + .byte \effectBattler .endm - .macro clearstatusfromeffect battler:req, moveEffect=0 - .if \moveEffect != 0 - setmoveeffect \moveEffect - .endif + .macro clearvolatile battler:req, volatile:req .byte 0x18 .byte \battler + .byte \volatile .endm .macro tryfaintmon battler:req @@ -155,10 +159,10 @@ .4byte \jumpInstr .endm - .macro jumpifstatus2 battler:req, flags:req, jumpInstr:req + .macro jumpifvolatile battler:req, volatile:req, jumpInstr:req .byte 0x1d .byte \battler - .4byte \flags + .byte \volatile .4byte \jumpInstr .endm @@ -185,11 +189,12 @@ .4byte \jumpInstr .endm - .macro jumpifstatus3condition battler:req, flags:req, jumpIfTrue:req, jumpInstr:req + .macro jumpifstatignorecontrary battler:req, comparison:req, stat:req, value:req, jumpInstr:req .byte 0x21 .byte \battler - .4byte \flags - .byte \jumpIfTrue + .byte \comparison + .byte \stat + .byte \value .4byte \jumpInstr .endm @@ -352,13 +357,16 @@ .2byte \frames .endm + .macro setchargingturn + .byte 0x40 + .endm + .macro waitstate .byte 0x3a .endm - .macro absorbhealthbarupdate battler:req + .macro isdmgblockedbydisguise .byte 0x3b - .byte \battler .endm .macro return @@ -410,15 +418,15 @@ .4byte \argPtr .endm - .macro setgraphicalstatchangevalues + .macro jumpfifsemiinvulnerable battler:req, state:req, jumpInstr:req .byte 0x47 + .byte \battler + .byte \state + .4byte \jumpInstr .endm - .macro playstatchangeanimation battler:req, stats:req, flags:req + .macro unused_0x48 .byte 0x48 - .byte \battler - .byte \stats - .byte \flags .endm .macro moveend endMode:req, endState:req @@ -593,22 +601,15 @@ .byte \notChosenMove .endm - .macro statusanimation battler:req + .macro statusanimation battler:req, status=0, isVolatile=FALSE .byte 0x64 .byte \battler + .4byte \status + .byte \isVolatile .endm - .macro status2animation battler:req, status2:req - .byte 0x65 - .byte \battler - .4byte \status2 - .endm - - .macro chosenstatusanimation battler:req, isStatus2:req, status:req - .byte 0x66 - .byte \battler - .byte \isStatus2 - .4byte \status + .macro volatileanimation battler:req, volatile:req + statusanimation \battler, \volatile, TRUE .endm .macro yesnobox @@ -678,10 +679,8 @@ .byte 0x75 .endm - .macro various battler:req, id:req + .macro unused_0x78 .byte 0x76 - .byte \battler - .byte \id .endm .macro setprotectlike @@ -701,10 +700,10 @@ .4byte \jumpInstr .endm - .macro tryhealhalfhealth failInstr:req, battler:req + .macro tryhealhalfhealth battler:req, failInstr:req .byte 0x7b - .4byte \failInstr .byte \battler + .4byte \failInstr .endm .macro trymirrormove @@ -729,19 +728,16 @@ .byte \mode .endm - .macro trysetrest failInstr:req + .macro trysetrest .byte 0x81 - .4byte \failInstr .endm - .macro jumpifnotfirstturn jumpInstr:req + .macro unused_0x82 .byte 0x82 - .4byte \jumpInstr .endm - .macro setmiracleeye failInstr:req + .macro unused_0x83 .byte 0x83 - .4byte \failInstr .endm .macro jumpifuproarwakes jumpInstr:req @@ -754,9 +750,8 @@ .byte \id .endm - .macro stockpiletobasedamage failInstr:req + .macro stockpiletobasedamage .byte 0x86 - .4byte \failInstr .endm .macro stockpiletohpheal failInstr:req @@ -768,14 +763,16 @@ callnative BS_RemoveStockpileCounters .endm - .macro setdrainedhp + .macro unused_0x88 .byte 0x88 .endm - .macro statbuffchange flags:req, failInstr:req + .macro statbuffchange battler:req, flags:req, failInstr:req, stats=0 .byte 0x89 + .byte \battler .2byte \flags .4byte \failInstr + .byte \stats .endm .macro normalisebuffs @@ -834,16 +831,19 @@ .4byte \failInstr .endm - .macro unused_0x94 + .macro checknonvolatiletrigger nonVolatile:req, failInstr:req .byte 0x94 + .2byte \nonVolatile + .4byte \failInstr .endm .macro copybidedmg .byte 0x95 .endm - .macro unused_96 + .macro animatewildpokemonafterfailedpokeball battler:req .byte 0x96 + .byte \battler .endm .macro tryinfatuating failInstr:req @@ -878,7 +878,7 @@ .4byte \failInstr .endm - .macro metronome + .macro setcalledmove .byte 0x9e .endm @@ -939,7 +939,7 @@ .4byte \failInstr .endm - .macro trysetdestinybondtohappen + .macro unused_0xab .byte 0xab .endm @@ -967,8 +967,11 @@ .4byte \failInstr .endm - .macro setforesight + .macro setvolatile battler:req, volatile:req, value=TRUE .byte 0xb1 + .byte \battler + .byte \volatile + .byte \value .endm .macro trysetperishsong failInstr:req @@ -1012,8 +1015,10 @@ .4byte \jumpInstr .endm - .macro tryrestorehpberry + .macro tryactivateitem battler:req, flag:req .byte 0xbb + .byte \battler + .byte \flag .endm .macro halvehp failInstr:req @@ -1021,19 +1026,14 @@ .4byte \failInstr .endm - .macro copyfoestats unused:req + .macro copyfoestats .byte 0xbd - .4byte \unused .endm .macro rapidspinfree .byte 0xbe .endm - .macro setdefensecurlbit - .byte 0xbf - .endm - .macro recoverbasedonsunlight failInstr:req .byte 0xc0 .4byte \failInstr @@ -1048,12 +1048,11 @@ .byte 0xc2 .endm - .macro trysetfutureattack failInstr:req + .macro setfutureattack .byte 0xc3 - .4byte \failInstr .endm - .macro trydobeatup endInstr, failInstr + .macro trydobeatup endInstr:req, failInstr:req .byte 0xc4 .4byte \endInstr .4byte \failInstr @@ -1083,7 +1082,7 @@ tryfiretwoturnmovenowbyeffect \battler, FALSE, \jumpInstr .endm - .macro setminimize + .macro unused_0xC7 .byte 0xc7 .endm @@ -1100,7 +1099,7 @@ .byte 0xca .endm - .macro setcharge battler:req + .macro unused_0xcb battler:req .byte 0xcb .byte \battler .endm @@ -1189,9 +1188,10 @@ .4byte \failInstr .endm - .macro setuserstatus3 flags:req, failInstr:req + .macro trysetvolatile battler:req, _volatile:req, failInstr:req .byte 0xdd - .4byte \flags + .byte \battler + .byte \_volatile .4byte \failInstr .endm @@ -1226,10 +1226,8 @@ .4byte \jumpInstr .endm - .macro jumpifnotcurrentmoveargtype battler:req, failInstr:req + .macro unused_0xE4 .byte 0xe4 - .byte \battler - .4byte \failInstr .endm .macro pickup @@ -1299,7 +1297,7 @@ .byte 0xf3 .endm - .macro subattackerhpbydmg + .macro unused_0xf4 .byte 0xf4 .endm @@ -1340,11 +1338,12 @@ .4byte \jumpInstr .endm - .macro setnonvolatilestatus + .macro setnonvolatilestatus trigger:req .byte 0xfd + .byte \trigger .endm - .macro tryworryseed failInstr:req + .macro tryoverwriteability failInstr:req .byte 0xfe .4byte \failInstr .endm @@ -1379,21 +1378,6 @@ .4byte \failInstr .endm - .macro jumpifcantfling battler:req, jumpInstr:req - callnative BS_JumpIfCantFling - .byte \battler - .4byte \jumpInstr - .endm - - .macro itemstatchangeeffects battler:req - callnative BS_RunStatChangeItems - .byte \battler - .endm - - .macro tryintimidateejectpack - callnative BS_TryIntimidateEjectPack - .endm - .macro allyswitchswapbattlers callnative BS_AllySwitchSwapBattler .endm @@ -1421,9 +1405,10 @@ .4byte \restoreBattlerInstr .endm - .macro itemcurestatus jumpInstr:req + .macro itemcurestatus jumpInstr:req, restoreBattlerInstr:req callnative BS_ItemCureStatus .4byte \jumpInstr + .4byte \restoreBattlerInstr .endm .macro itemincreasestat @@ -1438,36 +1423,22 @@ callnative BS_TryRevertWeatherForm .endm - .macro trysetoctolock battler:req, failInstr:req + .macro trysetoctolock failInstr:req callnative BS_TrySetOctolock - .byte \battler .4byte \failInstr .endm - .macro setglaiverush - callnative BS_SetGlaiveRush - .endm - - .macro tryrelicsong - callnative BS_TryRelicSong - .endm - .macro setpledge jumpInstr:req callnative BS_SetPledge .4byte \jumpInstr .endm - .macro setpledgestatus battler:req sidestatus:req + .macro setpledgestatus battler:req, sidestatus:req callnative BS_SetPledgeStatus .byte \battler .4byte \sidestatus .endm - .macro trycopycat failInstr:req - callnative BS_TryCopycat - .4byte \failInstr - .endm - .macro setzeffect callnative BS_SetZEffect .endm @@ -1527,14 +1498,8 @@ .4byte \jumpInstr .endm - .macro jumpifmovepropertyargument argument:req, jumpInstr:req - callnative BS_JumpIfMovePropertyArgument - .byte \argument - .4byte \jumpInstr - .endm - - .macro setremoveterrain failInstr:req - callnative BS_SetRemoveTerrain + .macro setterrain failInstr:req + callnative BS_SetTerrain .4byte \failInstr .endm @@ -1656,14 +1621,6 @@ .4byte \failInstr .endm - .macro tryupdaterecoiltracker - callnative BS_TryUpdateRecoilTracker - .endm - - .macro tryupdateleaderscresttracker - callnative BS_TryUpdateLeadersCrestTracker - .endm - .macro trytidyup clear:req, jumpInstr:req callnative BS_TryTidyUp .byte \clear @@ -1697,10 +1654,6 @@ callnative BS_ApplyTerastallization .endm - .macro damagetoquartertargethp - callnative BS_DamageToQuarterTargetHP - .endm - .macro jumpifsleepclause jumpInstr:req callnative BS_JumpIfSleepClause .4byte \jumpInstr @@ -1742,6 +1695,10 @@ .byte \battler .endm + .macro resetterrainabilityflags + callnative BS_ResetTerrainAbilityFlags + .endm + @ Stores Healing Wish effect. .macro storehealingwish battler:req callnative BS_StoreHealingWish @@ -1776,10 +1733,6 @@ callnative BS_WaitFanfare .endm - .macro setbeakblast - callnative BS_SetBeakBlast - .endm - .macro cantarshotwork failInstr:req callnative BS_CanTarShotWork .4byte \failInstr @@ -1803,6 +1756,10 @@ .2byte \flags .endm + .macro clearspecialstatuses + callnative BS_ClearSpecialStatuses + .endm + .macro clearmoveresultflags flags:req callnative BS_ClearMoveResultFlags .2byte \flags @@ -1814,8 +1771,8 @@ .4byte \failInstr .endm - .macro jumpifcriticalhit failInstr:req - callnative BS_JumpIfCriticalHit + .macro jumpifnotcriticalhit failInstr:req + callnative BS_JumpIfNotCriticalHit .4byte \failInstr .endm @@ -1825,650 +1782,611 @@ .4byte \jumpInstr .endm -@ various command changed to more readable macros - .macro cancelmultiturnmoves battler:req - various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES - .endm - - .macro getifcantrunfrombattle battler:req - various \battler, VARIOUS_IS_RUNNING_IMPOSSIBLE + .macro tryflingholdeffect + callnative BS_TryFlingHoldEffect .endm - .macro getmovetarget battler:req - various \battler, VARIOUS_GET_MOVE_TARGET - .endm - - .macro getbattlerfainted battler:req - various \battler, VARIOUS_GET_BATTLER_FAINTED - .endm - - .macro resetswitchinabilitybits battler:req - various \battler, VARIOUS_RESET_SWITCH_IN_ABILITY_BITS - .endm - - .macro updatechoicemoveonlvlup battler:req - various \battler, VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP - .endm - - .macro resetplayerfainted - various BS_ATTACKER, VARIOUS_RESET_PLAYER_FAINTED - .endm - - .macro palaceflavortext battler:req - various \battler, VARIOUS_PALACE_FLAVOR_TEXT - .endm - - .macro arenajudgmentwindow - various BS_ATTACKER, VARIOUS_ARENA_JUDGMENT_WINDOW + .macro swapsidestatuses + callnative BS_CourtChangeSwapSideStatuses .endm - .macro arenaopponentmonlost - various BS_ATTACKER, VARIOUS_ARENA_OPPONENT_MON_LOST + .macro swapstats stat:req + callnative BS_SwapStats + .byte \stat .endm - .macro arenaplayermonlost - various BS_ATTACKER, VARIOUS_ARENA_PLAYER_MON_LOST + .macro restoresavedmove + callnative BS_RestoreSavedMove .endm - .macro arenabothmonlost - various BS_ATTACKER, VARIOUS_ARENA_BOTH_MONS_LOST +@ helpful macros + .macro setstatchanger stat:req, stages:req, down:req + setbyte sSTATCHANGER, \stat | \stages << 3 | \down << 7 .endm - .macro forfeityesnobox battler:req - various \battler, VARIOUS_EMIT_YESNOBOX + .macro setmoveeffect effect:req + sethword sMOVE_EFFECT, \effect .endm - .macro arenadrawreftextbox - various BS_ATTACKER, VARIOUS_DRAW_ARENA_REF_TEXT_BOX + .macro sethword dst:req, value:req + setbyte \dst, (\value) & 0xFF + setbyte \dst + 1, ((\value) >> 8) & 0xFF .endm - .macro arenaerasereftextbox - various BS_ATTACKER, VARIOUS_ERASE_ARENA_REF_TEXT_BOX + .macro setword dst:req, value:req + setbyte \dst, (\value) & 0xFF + setbyte \dst + 1, ((\value) >> 8) & 0xFF + setbyte \dst + 2, ((\value) >> 16) & 0xFF + setbyte \dst + 3, ((\value) >> 24) & 0xFF .endm - .macro arenajudgmentstring id:req - various \id, VARIOUS_ARENA_JUDGMENT_STRING + .macro copybyte dst:req, src:req + copyarray \dst, \src, 0x1 .endm - .macro arenawaitmessage id:req - various \id, VARIOUS_ARENA_WAIT_STRING + .macro copyhword dst:req, src:req + copyarray \dst, \src, 0x2 .endm - .macro waitcry battler:req - various \battler, VARIOUS_WAIT_CRY + .macro copyword dst:req, src:req + copyarray \dst, \src, 0x4 .endm - .macro returnopponentmon1toball battler:req - various \battler, VARIOUS_RETURN_OPPONENT_MON1 + .macro jumpifbytenotequal byte1:req, byte2:req, jumpInstr:req + jumpifarraynotequal \byte1, \byte2, 0x1, \jumpInstr .endm - .macro returnopponentmon2toball battler:req - various \battler, VARIOUS_RETURN_OPPONENT_MON2 + .macro jumpifbyteequal byte1:req, byte2:req, jumpInstr:req + jumpifarrayequal \byte1, \byte2, 0x1, \jumpInstr .endm - .macro volumedown - various BS_ATTACKER, VARIOUS_VOLUME_DOWN + .macro jumpifmove move:req, jumpInstr:req + jumpifhalfword CMP_EQUAL, gCurrentMove, \move, \jumpInstr .endm - .macro volumeup - various BS_ATTACKER, VARIOUS_VOLUME_UP + .macro jumpifnotmove move:req, jumpInstr:req + jumpifhalfword CMP_NOT_EQUAL, gCurrentMove, \move, \jumpInstr .endm - .macro setalreadystatusedmoveattempt battler:req - various \battler, VARIOUS_SET_ALREADY_STATUS_MOVE_ATTEMPT + .macro jumpifnotchosenmove move:req, jumpInstr:req + jumpifhalfword CMP_NOT_EQUAL, gChosenMove, \move, \jumpInstr .endm - .macro palacetryescapestatus battler:req - various \battler, VARIOUS_PALACE_TRY_ESCAPE_STATUS + .macro jumpifmovehadnoeffect jumpInstr:req + jumpifmoveresultflags MOVE_RESULT_NO_EFFECT, \jumpInstr .endm - .macro setoutcomeonteleport battler:req - various \battler, VARIOUS_SET_TELEPORT_OUTCOME + .macro jumpifside battler:req, side:req, equalJumpInstr:req + getbattlerside \battler + jumpifbyte CMP_EQUAL, gBattleCommunication, \side, \equalJumpInstr .endm - .macro playtrainerdefeatbgm battler:req - various \battler, VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC + .macro jumpifbattletype flags:req, jumpInstr:req + jumpifword CMP_COMMON_BITS, gBattleTypeFlags, \flags, \jumpInstr .endm - .macro stattextbuffer battler:req - various \battler, VARIOUS_STAT_TEXT_BUFFER + .macro jumpifnotbattletype flags:req, jumpInstr:req + jumpifword CMP_NO_COMMON_BITS, gBattleTypeFlags, \flags, \jumpInstr .endm - .macro switchinabilities battler:req - various \battler, VARIOUS_SWITCHIN_ABILITIES + .macro dmg_1_8_targethp + manipulatedamage DMG_1_8_TARGET_HP .endm - .macro instanthpdrop battler:req - various \battler, VARIOUS_INSTANT_HP_DROP + .macro dmgtomaxattackerhp + manipulatedamage DMG_FULL_ATTACKER_HP .endm - .macro clearstatus battler:req - various \battler, VARIOUS_CLEAR_STATUS + .macro jumpifflowerveil jumpInstr:req + jumpifnottype BS_TARGET, TYPE_GRASS, 1f + jumpifability BS_TARGET_SIDE, ABILITY_FLOWER_VEIL, \jumpInstr + 1: .endm - .macro restorepp battler:req - various \battler, VARIOUS_RESTORE_PP + .macro jumpifflowerveilattacker jumpInstr:req + jumpifnottype BS_ATTACKER, TYPE_GRASS, 1f + jumpifability BS_ATTACKER_SIDE, ABILITY_FLOWER_VEIL, \jumpInstr + 1: .endm - .macro tryactivatereceiver battler:req - various \battler, VARIOUS_TRY_ACTIVATE_RECEIVER + .macro jumpifabilitycantbereactivated battler:req, jumpInstr:req + callnative BS_JumpIfAbilityCantBeReactivated + .byte \battler + .4byte \jumpInstr .endm - .macro tryactivatesoulheart - various BS_ATTACKER, VARIOUS_TRY_ACTIVATE_SOULHEART + .macro tryactivateabilityshield battler:req + callnative BS_TryActivateAbilityShield + .byte \battler .endm - .macro playmoveanimation battler:req, move:req - various \battler, VARIOUS_PLAY_MOVE_ANIMATION - .2byte \move + .macro trysynchronoise jumpInstr:req + callnative BS_TrySynchronoise + .4byte \jumpInstr .endm - .macro setluckychant battler:req, failInstr:req - various \battler VARIOUS_SET_LUCKY_CHANT - .4byte \failInstr + .macro jumpifroarfails jumpInstr:req + callnative BS_JumpIfRoarFails + .4byte \jumpInstr .endm - .macro suckerpunchcheck failInstr:req - various BS_ATTACKER, VARIOUS_SUCKER_PUNCH_CHECK - .4byte \failInstr + .macro jumpifabsent battler:req, jumpInstr:req + callnative BS_JumpIfAbsent + .byte \battler + .4byte \jumpInstr .endm - .macro setabilitysimple battler:req, failInstr:req - various \battler VARIOUS_SET_SIMPLE_BEAM - .4byte \failInstr + .macro jumpifnoholdeffect battler:req, holdEffect:req, jumpInstr:req + jumpifholdeffect \battler, \holdEffect, \jumpInstr, FALSE .endm - .macro tryentrainment failInstr:req - various BS_ATTACKER, VARIOUS_TRY_ENTRAINMENT - .4byte \failInstr + .macro jumpifholdeffect battler:req, holdEffect:req, jumpInstr:req, equal:req + callnative BS_JumpIfHoldEffect + .byte \battler + .byte \holdEffect + .4byte \jumpInstr + .byte \equal .endm - .macro setlastusedability battler:req - various \battler, VARIOUS_SET_LAST_USED_ABILITY + .macro jumpifnoally battler:req, jumpInstr:req + callnative BS_JumpIfNoAlly + .byte \battler + .4byte \jumpInstr .endm - .macro tryafteryou failInstr:req - various BS_ATTACKER, VARIOUS_AFTER_YOU - .4byte \failInstr + .macro setlastuseditem battler:req + callnative BS_SetLastUsedItem + .byte \battler .endm - .macro trybestow failInstr:req - various BS_ATTACKER, VARIOUS_BESTOW + .macro trysetfairylock failInstr:req + callnative BS_TrySetFairyLock .4byte \failInstr .endm - .macro invertstatstages battler:req - various \battler, VARIOUS_INVERT_STAT_STAGES - .endm - - .macro trymefirst failInstr:req - various BS_ATTACKER, VARIOUS_TRY_ME_FIRST - .4byte \failInstr + .macro getstatvalue stat:req + callnative BS_GetStatValue + .byte \stat .endm - .macro jumpifbattleend jumpInstr:req - various BS_ATTACKER, VARIOUS_JUMP_IF_BATTLE_END + .macro jumpiffullhp battler:req, jumpInstr:req + callnative BS_JumpIfFullHp + .byte \battler .4byte \jumpInstr .endm - .macro tryelectrify failInstr:req - various BS_ATTACKER, VARIOUS_TRY_ELECTRIFY - .4byte \failInstr + .macro tryfriskmessage + callnative BS_TryFriskMessage .endm - .macro trysoak failInstr:req - various BS_ATTACKER, VARIOUS_TRY_SOAK - .4byte \failInstr + .macro settracedability battler:req + callnative BS_SetTracedAbility + .byte \battler .endm - .macro handleformchange battler:req, case:req - various \battler, VARIOUS_HANDLE_FORM_CHANGE - .byte \case + .macro tryillusionoff battler:req + callnative BS_TryIllusionOff + .byte \battler .endm - .macro jumpifcantuselastresort battler:req, jumpInstr:req - various \battler, VARIOUS_TRY_LAST_RESORT - .4byte \jumpInstr + .macro setspriteignore0hp ignore0HP:req + callnative BS_SetSpriteIgnore0Hp + .byte \ignore0HP .endm - .macro tryautotomize battler:req, failInstr:req - various \battler, VARIOUS_TRY_AUTOTOMIZE - .4byte \failInstr + .macro updatenick + callnative BS_UpdateNick .endm - .macro jumpifcantusesynchronoise jumpInstr:req - various BS_ATTACKER, VARIOUS_TRY_SYNCHRONOISE + .macro jumpifnotberry battler:req, jumpInstr:req + callnative BS_JumpIfNotBerry + .byte \battler .4byte \jumpInstr .endm - .macro showabilitypopup battler:req - various \battler, VARIOUS_ABILITY_POPUP + .macro gravityonairbornemons + callnative BS_GravityOnAirborneMons .endm - .macro updateabilitypopup battler:req - various \battler, VARIOUS_UPDATE_ABILITY_POPUP - .endm - - .macro jumpiftargetally jumpInstr:req - various BS_ATTACKER, VARIOUS_JUMP_IF_TARGET_ALLY - .4byte \jumpInstr - .endm - - .macro trypsychoshift failInstr:req sleepClauseFailInstr:req - various BS_ATTACKER, VARIOUS_PSYCHO_SHIFT + .macro tryacupressure failInstr:req + callnative BS_TryAcupressure .4byte \failInstr - .4byte \sleepClauseFailInstr - .endm - - .macro curestatus battler:req - various \battler, VARIOUS_CURE_STATUS .endm - .macro powertrick battler:req - various \battler, VARIOUS_POWER_TRICK + .macro cancelmultiturnmoves + callnative BS_CancelMultiTurnMoves .endm - .macro jumpifnotgrounded battler:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_NOT_GROUNDED - .4byte \jumpInstr + .macro isrunningimpossible + callnative BS_IsRunningImpossible .endm - .macro handletrainerslidemsg battler:req, case:req - various \battler, VARIOUS_HANDLE_TRAINER_SLIDE_MSG - .byte \case + .macro getmovetarget + callnative BS_GetMoveTarget .endm - .macro trytrainerslidefirstdownmsg battler:req - various \battler, VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF + @ Will jump to script pointer if the specified battler has or has not fainted. + .macro jumpiffainted battler:req, value:req, ptr:req + getbattlerfainted \battler + jumpifbyte CMP_EQUAL, gBattleCommunication, \value, \ptr .endm - .macro trytrainerslidelastonmsg battler:req - various \battler, VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON + .macro getbattlerfainted battler:req + callnative BS_GetBattlerFainted + .byte \battler .endm - .macro setauroraveil battler:req - various \battler, VARIOUS_SET_AURORA_VEIL + .macro resetswitchinabilitybits + callnative BS_ResetSwitchInAbilityBits .endm - .macro trysetthirdtype battler:req, failInstr:req - various \battler, VARIOUS_TRY_THIRD_TYPE - .4byte \failInstr + .macro updatechoicemoveonlvlup + callnative BS_UpdateChoiceMoveOnLvlUp .endm - .macro tryaccupressure battler:req, failInstr:req - various \battler, VARIOUS_ACUPRESSURE - .4byte \failInstr + .macro resetplayerfainted + callnative BS_ResetPlayerFainted .endm - .macro setpowder battler:req - various \battler, VARIOUS_SET_POWDER + .macro palaceflavortext + callnative BS_PalaceFlavorText .endm - .macro bringdownairbornebattler battler:req - various \battler, VARIOUS_GRAVITY_ON_AIRBORNE_MONS + .macro arenajudgmentwindow + callnative BS_ArenaJudgmentWindow .endm - .macro checkgrassyterrainheal battler:req, failInstr:req - various \battler, VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS - .4byte \failInstr + .macro arenaopponentmonlost + callnative BS_ArenaOpponentMonLost .endm - .macro jumpifnotberry battler:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_NOT_BERRY - .4byte \jumpInstr + .macro arenaplayermonlost + callnative BS_ArenaPlayerMonLost .endm - .macro jumpifroarfails jumpInstr:req - various BS_ATTACKER, VARIOUS_JUMP_IF_ROAR_FAILS - .4byte \jumpInstr + .macro arenabothmonslost + callnative BS_ArenaBothMonsLost .endm - .macro tryinstruct failInstr:req - various BS_ATTACKER, VARIOUS_TRY_INSTRUCT - .4byte \failInstr + .macro forfeityesnobox + callnative BS_ForfeitYesNoBox .endm - .macro settracedability battler:req - various \battler, VARIOUS_TRACE_ABILITY + .macro drawarenareftextbox + callnative BS_DrawArenaRefTextBox .endm - .macro updatenick battler:req - various \battler, VARIOUS_UPDATE_NICK + .macro erasearenareftextbox + callnative BS_EraseArenaRefTextBox .endm - .macro tryillusionoff battler:req - various \battler, VARIOUS_TRY_ILLUSION_OFF + .macro arenajudgmentstring id:req + callnative BS_ArenaJudgmentString + .byte \id .endm - .macro spriteignore0hp value:req - various BS_ATTACKER, VARIOUS_SET_SPRITEIGNORE0HP - .byte \value + .macro arenawaitmessage + callnative BS_ArenaWaitMessage .endm - .macro getstatvalue battler:req, stat:req - various \battler, VARIOUS_GET_STAT_VALUE - .byte \stat + .macro waitcry + callnative BS_WaitCry .endm - .macro jumpiffullhp battler:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_FULL_HP - .4byte \jumpInstr + .macro returnopponentmon1toball + callnative BS_ReturnOpponentMon1ToBall .endm - .macro losetype battler:req, type:req - various \battler, VARIOUS_LOSE_TYPE - .byte \type + .macro returnopponentmon2toball + callnative BS_ReturnOpponentMon2ToBall .endm - .macro tryfriskmsg battler:req - various \battler, VARIOUS_TRY_FRISK + .macro volumedown + callnative BS_VolumeDown .endm - .macro jumpifshieldsdown battler:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED - .4byte \jumpInstr + .macro volumeup + callnative BS_VolumeUp .endm - .macro trysetfairylock failInstr:req - various BS_ATTACKER, VARIOUS_TRY_FAIRY_LOCK - .4byte \failInstr + .macro setalreadystatusedmoveattempt + callnative BS_SetAlreadyStatusedMoveAttempt .endm - .macro jumpifnoally battler:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_NO_ALLY - .4byte \jumpInstr + .macro palacetryescapestatus + callnative BS_PalaceTryEscapeStatus .endm - .macro jumpifholdeffect battler:req, holdEffect:req, jumpInstr:req, equal=TRUE - various \battler, VARIOUS_JUMP_IF_HOLD_EFFECT - .byte \holdEffect - .4byte \jumpInstr - .byte \equal + .macro setteleportoutcome battler:req + callnative BS_SetTeleportOutcome + .byte \battler .endm - .macro jumpifnoholdeffect battler:req, holdEffect:req, jumpInstr:req - jumpifholdeffect \battler, \holdEffect, \jumpInstr, FALSE + .macro playtrainerdefeatedmusic + callnative BS_PlayTrainerDefeatedMusic .endm - .macro infatuatewithbattler battler:req, infatuateWith:req - various \battler, VARIOUS_INFATUATE_WITH_BATTLER - .byte \infatuateWith + .macro stattextbuffer + callnative BS_StatTextBuffer .endm - .macro setlastuseditem battler:req - various \battler, VARIOUS_SET_LAST_USED_ITEM + .macro switchinabilities battler:req + callnative BS_SwitchinAbilities + .byte \battler .endm - .macro jumpifabsent battler:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_ABSENT - .4byte \jumpInstr + .macro instanthpdrop + callnative BS_InstantHpDrop .endm - .macro destroyabilitypopup - various BS_ABILITY_BATTLER, VARIOUS_DESTROY_ABILITY_POPUP + .macro clearstatus + callnative BS_ClearStatus .endm - .macro gettotemboost jumpInstr:req - various BS_ATTACKER, VARIOUS_TOTEM_BOOST - .4byte \jumpInstr + .macro restoremovepp + callnative BS_RestoreMovePp .endm - .macro consumeberry battler:req, fromBattler:req - various \battler, VARIOUS_CONSUME_BERRY - .byte \fromBattler + .macro tryactivatereceiver battler:req + callnative BS_TryActivateReceiver + .byte \battler .endm - .macro activateitemeffects battler:req - various \battler, VARIOUS_MOVEEND_ITEM_EFFECTS + .macro tryactivatesoulheart + callnative BS_TryActivateSoulheart .endm - .macro pickpocketsteal - various 0, VARIOUS_PICKPOCKET + .macro playmoveanimation move:req + callnative BS_PlayMoveAnimation + .2byte \move .endm - .macro doterrainseed battler:req, failInstr:req - various \battler, VARIOUS_TERRAIN_SEED + .macro setluckychant failInstr:req + callnative BS_SetLuckyChant .4byte \failInstr .endm - .macro makeinvisible battler:req - various \battler, VARIOUS_MAKE_INVISIBLE - .endm - - .macro tryroomservice battler:req, failInstr:req - various \battler, VARIOUS_ROOM_SERVICE + .macro tryentrainment failInstr:req + callnative BS_TryEntrainment .4byte \failInstr .endm - .macro jumpifpranksterblocked battler:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_PRANKSTER_BLOCKED - .4byte \jumpInstr + .macro setlastusedability + callnative BS_SetLastUsedAbility .endm - .macro jumpifteamhealthy battler:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_TEAM_HEALTHY - .4byte \jumpInstr + .macro invertstatstages + callnative BS_InvertStatStages .endm - .macro tryhealquarterhealth battler:req, failInstr:req - various \battler, VARIOUS_TRY_HEAL_QUARTER_HP + .macro tryelectrify failInstr:req + callnative BS_TryElectrify .4byte \failInstr .endm - .macro trytoclearprimalweather - various BS_ATTACKER, VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER + .macro trysoak failInstr:req + callnative BS_TrySoak + .4byte \failInstr .endm - .macro setattackertostickywebuser - various BS_TARGET, VARIOUS_SET_ATTACKER_STICKY_WEB_USER + .macro handleformchange battler:req, case_:req + callnative BS_HandleFormChange + .byte \battler + .byte \case_ .endm - .macro getrototillertargets failInstr:req - various BS_ATTACKER, VARIOUS_GET_ROTOTILLER_TARGETS + .macro tryautotomize failInstr:req + callnative BS_TryAutotomize .4byte \failInstr .endm - .macro jumpifnotrototilleraffected battler:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED - .4byte \jumpInstr + .macro tryinstruct failInstr:req + callnative BS_TryInstruct + .4byte \failInstr .endm - .macro jumpifcantreverttoprimal jumpInstr:req - various BS_ATTACKER, VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL - .4byte \jumpInstr + .macro showabilitypopup + callnative BS_ShowAbilityPopup .endm - .macro jumpifweatheraffected battler:req, flags:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_WEATHER_AFFECTED - .4byte \flags - .4byte \jumpInstr + .macro updateabilitypopup + callnative BS_UpdateAbilityPopup .endm - .macro jumpifspecies battler:req, species:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_SPECIES - .2byte \species + .macro jumpiftargetally jumpInstr:req + callnative BS_JumpIfTargetAlly .4byte \jumpInstr .endm - .macro tryendneutralizinggas battler:req - various \battler, VARIOUS_TRY_END_NEUTRALIZING_GAS - .endm - - .macro trynoretreat battler:req, failInstr:req - various \battler, VARIOUS_TRY_NO_RETREAT + .macro trypsychoshift failInstr:req sleepClauseFailInstr:req + callnative BS_TryPsychoShift .4byte \failInstr + .4byte \sleepClauseFailInstr .endm - .macro checkpoltergeist battler:req, failInstr:req - various \battler, VARIOUS_CHECK_POLTERGEIST - .4byte \failInstr + .macro curestatus battler:req + callnative BS_CureStatus + .byte \battler .endm - .macro cutonethirdhpraisestats failInstr:req - various BS_ATTACKER, VARIOUS_CUT_1_3_HP_RAISE_STATS - .4byte \failInstr + .macro powertrick + callnative BS_PowerTrick .endm - .macro curecertainstatuses battler:req - various \battler, VARIOUS_CURE_CERTAIN_STATUSES + .macro tryafteryou failInstr:req + callnative BS_TryAfterYou + .4byte \failInstr .endm - .macro tryresetnegativestatstages battler:req - various \battler, VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES + .macro trybestow failInstr:req + callnative BS_TryBestow + .4byte \failInstr .endm - .macro jumpiflastuseditemberry jumpInstr:req - various BS_ATTACKER, VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY - .4byte \jumpInstr + .macro handletrainerslidemsg battler:req, case_:req + callnative BS_HandleTrainerSlideMsg + .byte \battler + .byte \case_ .endm - .macro jumpiflastuseditemholdeffect holdEffect:req, secondaryId:req, jumpInstr:req - callnative BS_JumpIfLastUsedItemHoldEffect - .byte \holdEffect - .2byte \secondaryId - .4byte \jumpInstr + .macro trytrainerslidemsgfirstoff battler:req + callnative BS_TryTrainerSlideMsgFirstOff + .byte \battler .endm - .macro savebattleritem battler:req - various \battler, VARIOUS_SAVE_BATTLER_ITEM + .macro trytrainerslidemsglaston battler:req + callnative BS_TryTrainerSlideMsgLastOn + .byte \battler .endm - .macro restorebattleritem battler:req - various \battler, VARIOUS_RESTORE_BATTLER_ITEM + .macro setauroraveil + callnative BS_SetAuroraVeil .endm - .macro battleritemtolastuseditem battler:req - various \battler, VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM + .macro trythirdtype failInstr:req + callnative BS_TryThirdType + .4byte \failInstr .endm - .macro swapsidestatuses - callnative BS_CourtChangeSwapSideStatuses + .macro destroyabilitypopup + callnative BS_DestroyAbilityPopup .endm - .macro swapstats stat:req - callnative BS_SwapStats - .byte \stat + .macro gettotemboost jumpInstr:req + callnative BS_GetTotemBoost + .4byte \jumpInstr .endm - .macro restoresavedmove - callnative BS_RestoreSavedMove + .macro activateitemeffects + callnative BS_ActivateItemEffects .endm -@ helpful macros - .macro setstatchanger stat:req, stages:req, down:req - setbyte sSTATCHANGER, \stat | \stages << 3 | \down << 7 + .macro tryroomservice battler:req, failInstr:req + callnative BS_TryRoomService + .byte \battler + .4byte \failInstr .endm - .macro setmoveeffect effect:req - sethword sMOVE_EFFECT, \effect - sethword sSAVED_MOVE_EFFECT, \effect + .macro tryterrainseed battler:req, failInstr:req + callnative BS_TryTerrainSeed + .byte \battler + .4byte \failInstr .endm - .macro chosenstatus1animation battler:req, status:req - chosenstatusanimation \battler, 0x0, \status + .macro makeinvisible battler:req + callnative BS_MakeInvisible + .byte \battler .endm - .macro chosenstatus2animation battler:req, status:req - chosenstatusanimation \battler, 0x1, \status + .macro jumpifteamhealthy jumpInstr:req + callnative BS_JumpIfTeamHealthy + .4byte \jumpInstr .endm - .macro sethword dst:req, value:req - setbyte \dst, (\value) & 0xFF - setbyte \dst + 1, ((\value) >> 8) & 0xFF + .macro tryhealquarterhealth battler:req, failInstr:req + callnative BS_TryHealQuarterHealth + .byte \battler + .4byte \failInstr .endm - .macro setword dst:req, value:req - setbyte \dst, (\value) & 0xFF - setbyte \dst + 1, ((\value) >> 8) & 0xFF - setbyte \dst + 2, ((\value) >> 16) & 0xFF - setbyte \dst + 3, ((\value) >> 24) & 0xFF + .macro jumpifunder200 jumpInstr:req + callnative BS_JumpIfUnder200 + .4byte \jumpInstr .endm - .macro copybyte dst:req, src:req - copyarray \dst, \src, 0x1 + .macro setskydrop + callnative BS_SetSkyDrop .endm - .macro copyhword dst:req, src:req - copyarray \dst, \src, 0x2 + .macro clearskydrop failInstr:req + callnative BS_ClearSkyDrop + .4byte \failInstr .endm - .macro copyword dst:req, src:req - copyarray \dst, \src, 0x4 + .macro skydropyawn + callnative BS_SkyDropYawn .endm - .macro jumpifbytenotequal byte1:req, byte2:req, jumpInstr:req - jumpifarraynotequal \byte1, \byte2, 0x1, \jumpInstr + .macro jumpifpranksterblocked jumpInstr:req + callnative BS_JumpIfPranksterBlocked + .4byte \jumpInstr .endm - .macro jumpifbyteequal byte1:req, byte2:req, jumpInstr:req - jumpifarrayequal \byte1, \byte2, 0x1, \jumpInstr + .macro trytoclearprimalweather + callnative BS_TryToClearPrimalWeather .endm - .macro jumpifmove move:req, jumpInstr:req - jumpifhalfword CMP_EQUAL, gCurrentMove, \move, \jumpInstr + .macro tryendneutralizinggas + callnative BS_TryEndNeutralizingGas .endm - .macro jumpifnotmove move:req, jumpInstr:req - jumpifhalfword CMP_NOT_EQUAL, gCurrentMove, \move, \jumpInstr + .macro getrototillertargets failInstr:req + callnative BS_GetRototillerTargets + .4byte \failInstr .endm - .macro jumpifnotchosenmove move:req, jumpInstr:req - jumpifhalfword CMP_NOT_EQUAL, gChosenMove, \move, \jumpInstr + .macro jumpifnotrototilleraffected jumpInstr:req + callnative BS_JumpIfNotRototillerAffected + .4byte \jumpInstr .endm - .macro jumpifstatus3 battler:req, flags:req, jumpInstr:req - jumpifstatus3condition \battler, \flags, FALSE, \jumpInstr + .macro consumeberry battler:req, fromBattler:req + callnative BS_ConsumeBerry + .byte \battler + .byte \fromBattler .endm - .macro jumpifnostatus3 battler:req, flags:req, jumpInstr:req - jumpifstatus3condition \battler, \flags, TRUE, \jumpInstr + .macro jumpifweatheraffected flags:req, jumpInstr:req + callnative BS_JumpIfWeatherAffected + .2byte \flags + .4byte \jumpInstr .endm - .macro jumpifmovehadnoeffect jumpInstr:req - jumpifmoveresultflags MOVE_RESULT_NO_EFFECT, \jumpInstr + .macro jumpifspecies species:req, jumpInstr:req + callnative BS_JumpIfSpecies + .2byte \species + .4byte \jumpInstr .endm - .macro jumpifside battler:req, side:req, equalJumpInstr:req - getbattlerside \battler - jumpifbyte CMP_EQUAL, gBattleCommunication, \side, \equalJumpInstr + .macro jumpifabilitypreventsrest battler:req, jumpInstr:req + callnative BS_JumpIfAbilityPreventsRest + .byte \battler + .4byte \jumpInstr .endm - .macro jumpifbattletype flags:req, jumpInstr:req - jumpifword CMP_COMMON_BITS, gBattleTypeFlags, \flags, \jumpInstr + .macro setattackertostickywebuser + callnative BS_SetAttackerToStickyWebUser .endm - .macro jumpifnotbattletype flags:req, jumpInstr:req - jumpifword CMP_NO_COMMON_BITS, gBattleTypeFlags, \flags, \jumpInstr + .macro cutonethirdhpandraisestats failInstr:req + callnative BS_CutOneThirdHpAndRaiseStats + .4byte \failInstr .endm - .macro dmg_1_8_targethp - manipulatedamage DMG_1_8_TARGET_HP + .macro setpoltergeistmessage failInstr:req + callnative BS_SetPoltergeistMessage + .4byte \failInstr .endm - .macro dmgtomaxattackerhp - manipulatedamage DMG_FULL_ATTACKER_HP + .macro tryresetnegativestatstages + callnative BS_TryResetNegativeStatStages .endm - .macro dmgtocurrattackerhp - manipulatedamage DMG_CURR_ATTACKER_HP + .macro jumpiflastuseditemberry jumpInstr:req + callnative BS_JumpIfLastUsedItemBerry + .4byte \jumpInstr .endm - .macro jumpifflowerveil jumpInstr:req - jumpifnottype BS_TARGET, TYPE_GRASS, 1f - jumpifability BS_TARGET_SIDE, ABILITY_FLOWER_VEIL, \jumpInstr - 1: + .macro savebattleritem + callnative BS_SaveBattlerItem .endm - .macro jumpifflowerveilattacker jumpInstr:req - jumpifnottype BS_ATTACKER, TYPE_GRASS, 1f - jumpifability BS_ATTACKER_SIDE, ABILITY_FLOWER_VEIL, \jumpInstr - 1: + .macro restorebattleritem + callnative BS_RestoreBattlerItem .endm - .macro jumpifabilitycantbesuppressed battler:req, jumpInstr:req - callnative BS_JumpIfAbilityCantBeSuppressed - .byte \battler - .4byte \jumpInstr + .macro battleritemtolastuseditem + callnative BS_BattlerItemToLastUsedItem .endm .macro setallytonexttarget jumpInstr:req @@ -2489,40 +2407,12 @@ goto \jumpInstr .endm - .macro jumpifleafguardprotected battler:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED - .4byte \jumpInstr - .endm - .macro jumpifsafeguard jumpInstr:req jumpifability BS_ATTACKER, ABILITY_INFILTRATOR, 1f jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, \jumpInstr 1: .endm - @ Will jump to script pointer if the target weighs less than 200 kg, or 441 lbs. - .macro jumpifunder200 battler:req, failInstr:req - various \battler, VARIOUS_JUMP_IF_UNDER_200 - .4byte \failInstr - .endm - - @ Sets the sky drop status and does all other necessary operations - .macro setskydrop - various 0, VARIOUS_SET_SKY_DROP - .endm - - @ Clears the sky drop status and does all other necessary operations. - @ If the target fainted in before this script is called, it goes to the given script. - .macro clearskydrop failInstr:req - various 0, VARIOUS_CLEAR_SKY_DROP - .4byte \failInstr - .endm - - @ Accounts for if the target of Sky Drop was in confuse_lock when the attacker falls asleep due to Yawn. - .macro skydropyawn - various 0, VARIOUS_SKY_DROP_YAWN - .endm - @ Tries to increase or decrease a battler's stat's stat stage by a specified amount. If impossible, jumps to \script. .macro modifybattlerstatstage battler:req, stat:req, mode:req, amount:req, script:req, animation:req, customString @@ -2535,11 +2425,10 @@ ANIM_ON = TRUE setstatchanger \stat, \amount, \mode - statbuffchange STAT_CHANGE_ALLOW_PTR, \script - setgraphicalstatchangevalues - .if \animation == TRUE - playanimation \battler, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + .if \animation == FALSE + setbyte sSTAT_ANIM_PLAYED, TRUE .endif + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, \script .ifnb \customString printstring \customString .else @@ -2554,12 +2443,6 @@ waitmessage B_WAIT_TIME_LONG .endm - @ Will jump to script pointer if the specified battler has or has not fainted. - .macro jumpiffainted battler:req, value:req, ptr:req - getbattlerfainted \battler - jumpifbyte CMP_EQUAL, gBattleCommunication, \value, \ptr - .endm - .macro flushtextbox printstring STRINGID_EMPTYSTRING3 waitmessage 1 @@ -2569,3 +2452,15 @@ callnative BS_JumpIfNoWhiteOut .4byte \jumpInstr .endm + + .macro tryboosterenergy onFieldStatus:req + callnative BS_TryBoosterEnergy + .byte \onFieldStatus + .endm + + .macro jumpifgenconfiglowerthan tag:req, gen:req, jumpInstr:req + callnative BS_JumpIfGenConfigLowerThan + .2byte \tag + .byte \gen + .4byte \jumpInstr + .endm diff --git a/asm/macros/event.inc b/asm/macros/event.inc index 1cf9c7fca76c..6abaeff2652e 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -169,7 +169,10 @@ .endm @ Copies the value of source into destination. - .macro copyvar destination:req, source:req + .macro copyvar destination:req, source:req, warn=TRUE + .if \warn && !((\source >= VARS_START && \source <= VARS_END) || (\source >= SPECIAL_VARS_START && \source <= SPECIAL_VARS_END)) + .warning "copyvar with a value that is not a VAR_ constant; did you mean setvar instead?" + .endif .byte SCR_OP_COPYVAR .2byte \destination .2byte \source @@ -684,6 +687,14 @@ map \map .endm + @ Set the player object's invisibility to FALSE. + .macro showplayer + .byte SCR_OP_SHOWOBJECTAT + .2byte LOCALID_PLAYER + .byte 0 @ map group + .byte 0 @ map num + .endm + @ Sets the specified object's invisibility to TRUE. .macro hideobjectat localId:req, map:req .byte SCR_OP_HIDEOBJECTAT @@ -691,6 +702,14 @@ map \map .endm + @ Set the player object's invisibility to TRUE. + .macro hideplayer + .byte SCR_OP_HIDEOBJECTAT + .2byte LOCALID_PLAYER + .byte 0 @ map group + .byte 0 @ map num + .endm + @ Turns the currently selected object (if there is one) to face the player. .macro faceplayer .byte SCR_OP_FACEPLAYER @@ -986,7 +1005,7 @@ @ Gives the player a PokΓ©mon of the specified species and level, and allows to customize extra parameters. @ VAR_RESULT will be set to MON_GIVEN_TO_PARTY, MON_GIVEN_TO_PC, or MON_CANT_GIVE depending on the outcome. - .macro givemon species:req, level:req, item, ball, nature, abilityNum, gender, hpEv, atkEv, defEv, speedEv, spAtkEv, spDefEv, hpIv, atkIv, defIv, speedIv, spAtkIv, spDefIv, move1, move2, move3, move4, isShiny, gmaxFactor, teraType, dmaxLevel + .macro givemon species:req, level:req, item, ball, nature, abilityNum, gender, hpEv, atkEv, defEv, speedEv, spAtkEv, spDefEv, hpIv, atkIv, defIv, speedIv, spAtkIv, spDefIv, move1, move2, move3, move4, shinyMode, gmaxFactor, teraType, dmaxLevel callnative ScrCmd_createmon, requests_effects=1 .byte 0 .byte PARTY_SIZE @ assign to first empty slot @@ -1014,7 +1033,7 @@ .ifnb \move2; .set givemon_flags, givemon_flags | (1 << 18); .endif .ifnb \move3; .set givemon_flags, givemon_flags | (1 << 19); .endif .ifnb \move4; .set givemon_flags, givemon_flags | (1 << 20); .endif - .ifnb \isShiny; .set givemon_flags, givemon_flags | (1 << 21); .endif + .ifnb \shinyMode; .set givemon_flags, givemon_flags | (1 << 21); .endif .ifnb \gmaxFactor; .set givemon_flags, givemon_flags | (1 << 22); .endif .ifnb \teraType; .set givemon_flags, givemon_flags | (1 << 23); .endif .ifnb \dmaxLevel; .set givemon_flags, givemon_flags | (1 << 24); .endif @@ -1040,7 +1059,7 @@ .ifnb \move2; .2byte \move2; .endif .ifnb \move3; .2byte \move3; .endif .ifnb \move4; .2byte \move4; .endif - .ifnb \isShiny; .2byte \isShiny; .endif + .ifnb \shinyMode; .2byte \shinyMode; .endif .ifnb \gmaxFactor; .2byte \gmaxFactor; .endif .ifnb \teraType; .2byte \teraType; .endif .ifnb \dmaxLevel; .2byte \dmaxLevel; .endif @@ -1048,7 +1067,7 @@ @ creates a mon for a given party and slot @ otherwise - .macro createmon side:req, slot:req, species:req, level:req, item, ball, nature, abilityNum, gender, hpEv, atkEv, defEv, speedEv, spAtkEv, spDefEv, hpIv, atkIv, defIv, speedIv, spAtkIv, spDefIv, move1, move2, move3, move4, isShiny, gmaxFactor, teraType, dmaxLevel + .macro createmon side:req, slot:req, species:req, level:req, item, ball, nature, abilityNum, gender, hpEv, atkEv, defEv, speedEv, spAtkEv, spDefEv, hpIv, atkIv, defIv, speedIv, spAtkIv, spDefIv, move1, move2, move3, move4, shinyMode, gmaxFactor, teraType, dmaxLevel callnative ScrCmd_createmon, requests_effects=1 .byte \side @ 0 - player, 1 - opponent .byte \slot @ 0-5 @@ -1076,7 +1095,7 @@ .ifnb \move2; .set givemon_flags, givemon_flags | (1 << 18); .endif .ifnb \move3; .set givemon_flags, givemon_flags | (1 << 19); .endif .ifnb \move4; .set givemon_flags, givemon_flags | (1 << 20); .endif - .ifnb \isShiny; .set givemon_flags, givemon_flags | (1 << 21); .endif + .ifnb \shinyMode; .set givemon_flags, givemon_flags | (1 << 21); .endif .ifnb \gmaxFactor; .set givemon_flags, givemon_flags | (1 << 22); .endif .ifnb \teraType; .set givemon_flags, givemon_flags | (1 << 23); .endif .ifnb \dmaxLevel; .set givemon_flags, givemon_flags | (1 << 24); .endif @@ -1102,7 +1121,7 @@ .ifnb \move2; .2byte \move2; .endif .ifnb \move3; .2byte \move3; .endif .ifnb \move4; .2byte \move4; .endif - .ifnb \isShiny; .2byte \isShiny; .endif + .ifnb \shinyMode; .2byte \shinyMode; .endif .ifnb \gmaxFactor; .2byte \gmaxFactor; .endif .ifnb \teraType; .2byte \teraType; .endif .ifnb \dmaxLevel; .2byte \dmaxLevel; .endif @@ -1125,12 +1144,13 @@ .2byte \move .endm - @ Checks if at least one Pokemon in the player's party knows the specified move. If so, VAR_RESULT is set to the + @ Checks if at least one Pokemon in the player's party knows the specified field move and if the field move is unlocked. If so, VAR_RESULT is set to the @ (zero-indexed) slot number of the first Pokemon that knows the move. If not, VAR_RESULT is set to PARTY_SIZE. @ VAR_0x8004 is also set to this Pokemon's species. - .macro checkpartymove move:req - .byte SCR_OP_CHECKPARTYMOVE - .2byte \move + .macro checkfieldmove fieldMove:req, checkUnlocked=FALSE + .byte SCR_OP_CHECKFIELDMOVE + .byte \fieldMove + .byte \checkUnlocked .endm @ Converts STR_VAR_1, STR_VAR_2, or STR_VAR_3 to its corresponding index into sScriptStringVars (0, 1, or 2). @@ -1875,6 +1895,7 @@ @ Displays a multichoice box from which the user can choose a selection, and blocks script execution until a selection is made. @ Lists of options are provided in argv. @ If ignoreBPress is set to a non-zero value, then the user will not be allowed to back out of the multichoice with the B button. + @ For a simple menu supply DYN_MULTICHOICE_CB_NONE in callbacks. .macro dynmultichoice left:req, top:req, ignoreBPress:req, maxBeforeScroll:req, initialSelected:req, callbacks:req argv:vararg _dynmultichoice \left, \top, \ignoreBPress, \maxBeforeScroll, FALSE, \initialSelected, \callbacks, \argv .endm @@ -2174,7 +2195,7 @@ setvar VAR_0x8000, \evoMethod setvar VAR_0x8001, \canStopEvo setvar VAR_0x8002, \tryMultiple - special TrySpecialOverworldEvo + special TrySpecialScriptEvolution .endm .macro ai_vs_ai_battle trainer1:req, trainer2:req @@ -2311,6 +2332,11 @@ callnative ScriptSetDoubleBattleFlag, requests_effects=1 .endm + @ Stop using the ORAS dowsing machine. + .macro stoporasdowsing + callnative EndORASDowsing + .endm + @ ============================ @ @ FAKE RTC MACROS @ Will only function if OW_USE_FAKE_RTC is true. If it has any additional requirements, it will be listed accordingly. @@ -2480,7 +2506,7 @@ @ Hides any follower PokΓ©mon if present, putting them into their PokΓ© Ball; by default waits for their movement to finish. .macro hidefollower wait=1 - callnative ScrFunc_hidefollower + .byte SCR_OP_HIDEFOLLOWER .2byte \wait .endm @@ -2569,7 +2595,7 @@ @ Follower NPCs - @ Sets an NPC up to follow the player. + @ Sets an existing NPC up to follow the player. @ Follower flags are defined in include/constants/follower_npc.h @ If you want to specify a battle partner without specifying a custom script, you can set the script parameter to 0. .macro setfollowernpc localId:req, flags:req, script=0, battlePartner=0 @@ -2597,6 +2623,19 @@ .endif .endm + @ Creates a new follower NPC with the specified graphics id. + .macro createfollowernpc gfx:req, flags:req, script=0, battlePartner=0 + .if FNPC_ENABLE_NPC_FOLLOWERS + callnative ScriptCreateFollowerNPC + .2byte \gfx + .2byte \flags + .4byte \script + .2byte \battlePartner + .else + .error "createfollowernpc unavailable with FNPC_ENABLE_NPC_FOLLOWERS defined as FALSE" + .endif + .endm + @ Remove the follower NPC (assumes there will only ever be one). .macro destroyfollowernpc .if FNPC_ENABLE_NPC_FOLLOWERS @@ -2639,3 +2678,35 @@ callnative ScriptChangeFollowerNPCBattlePartner .2byte \battlePartner .endm + + @ Manually buffer a string as the speaker's name for namebox. + @ The next shown message/msgbox will include a namebox, if the provided string is not NULL. + @ An SP_NAME_* constant can also be used, it'll take the name from gSpeakerNamesTable instead. + .macro setspeaker name:req + callnative SetSpeaker + .4byte \name + .endm + +@ VS Seeker + .macro vsseeker_rematchid rematchId:req + callnative NativeVsSeekerRematchId, requests_effects=1 + .2byte \rematchId + .endm + + @ Sets the move relearner state + .macro setmoverelearnerstate state:req + callnative ScrCmd_setmoverelearnerstate, requests_effects=1 + .2byte \state + .endm + + @ Retrieves the move relearner state and stores it in the specified var + .macro getmoverelearnerstate varId:req + callnative ScrCmd_getmoverelearnerstate, requests_effects=1 + .4byte \varId + .endm + + @ Execute script if bag has TMs and/or HMs + .macro istmrelearneractive destination:req + callnative ScrCmd_istmrelearneractive, requests_effects=1 + .4byte \destination + .endm diff --git a/asm/macros/m4a.inc b/asm/macros/m4a.inc index b22da3d63470..0169a3c033c8 100644 --- a/asm/macros/m4a.inc +++ b/asm/macros/m4a.inc @@ -11,3 +11,41 @@ .space 1 @ Padding .2byte \unknown .endm + + .macro voice_group label:req, starting_note + .align 2 + .ifb \starting_note + .global voicegroup_\label + voicegroup_\label: + .else + .set voicegroup_\label, . - \starting_note * 0xC + .endif + .endm + + .macro keysplit label:req, starting_note + .ifb \starting_note + .global keysplit_\label + keysplit_\label: + .set _last_note, 0 + .else + .set keysplit_\label, . - \starting_note + .set _last_note, \starting_note + .endif + .set _last_split, 0 + .endm + + .macro split index:req, ending_note:req + .if \ending_note < _last_note + .if _last_split == 0 + .error "split's ending_note earlier than previous keysplit's starting_note" + .else + .error "split's ending_note earlier than previous split's ending_note" + .endif + .else + .rept \ending_note - _last_note + .byte \index + .endr + .endif + .set _last_note, \ending_note + .set _last_split, 1 + .endm diff --git a/asm/macros/map.inc b/asm/macros/map.inc index 74d2b5ff4214..56d738723809 100644 --- a/asm/macros/map.inc +++ b/asm/macros/map.inc @@ -2,8 +2,12 @@ @ Takes a MAP constant and outputs the map group and map number as separate bytes .macro map map_id:req + .ifdef \map_id .byte \map_id >> 8 @ map group .byte \map_id & 0xFF @ map num + .else + .error "undefined map (check for typos)" + .endif .endm @ Defines a map script. 'type' is any MAP_SCRIPT_* constant (see include/constants/map_scripts.h) diff --git a/audio_rules.mk b/audio_rules.mk index 3fce08ed3add..70d44664094c 100644 --- a/audio_rules.mk +++ b/audio_rules.mk @@ -20,16 +20,17 @@ $(MID_BUILDDIR)/%.o: $(MID_ASM_DIR)/%.s $(AS) $(ASFLAGS) -I sound -o $@ $< # Compressed cries -$(CRY_BIN_DIR)/%.bin: $(CRY_SUBDIR)/%.aif - $(AIF) $< $@ --compress +$(CRY_BIN_DIR)/%.bin: $(CRY_SUBDIR)/%.wav +# NOTE: If using ipatix's High Quality Audio Mixer, remove "--no-pad" below. + $(WAV2AGB) -b -c -l 1 --no-pad $< $@ # Uncompressed cries $(CRY_BIN_DIR)/uncomp_%.bin: $(CRY_SUBDIR)/uncomp_%.aif $(AIF) $< $@ # Uncompressed sounds -$(SOUND_BIN_DIR)/%.bin: sound/%.aif - $(AIF) $< $@ +$(SOUND_BIN_DIR)/%.bin: sound/%.wav + $(WAV2AGB) -b $< $@ # For each line in midi.cfg, we do some trickery to convert it into a make rule for the `.mid` file described on the line # Data following the colon in said file corresponds to arguments passed into mid2agb diff --git a/charmap.txt b/charmap.txt index 34fb683d0c98..dd2123f8f93b 100644 --- a/charmap.txt +++ b/charmap.txt @@ -379,7 +379,7 @@ B_LAST_ITEM = FD 16 B_LAST_ABILITY = FD 17 B_ATK_ABILITY = FD 18 B_DEF_ABILITY = FD 19 -B_SCR_ACTIVE_ABILITY = FD 1A +B_SCR_ABILITY = FD 1A B_EFF_ABILITY = FD 1B B_TRAINER1_CLASS = FD 1C B_TRAINER1_NAME = FD 1D @@ -424,8 +424,8 @@ B_TRAINER1_NAME_WITH_CLASS = FD 42 B_TRAINER2_NAME_WITH_CLASS = FD 43 B_PARTNER_NAME_WITH_CLASS = FD 44 B_ATK_TRAINER_NAME_WITH_CLASS = FD 45 -B_SCR_TEAM1 = FD 46 -B_SCR_TEAM2 = FD 47 +B_EFF_TEAM1 = FD 46 +B_EFF_TEAM2 = FD 47 @ indicates the end of a town/city name (before " TOWN" or " CITY") NAME_END = FC 00 @@ -459,6 +459,13 @@ JPN = FC 15 ENG = FC 16 PAUSE_MUSIC = FC 17 RESUME_MUSIC = FC 18 +SPEAKER = FC 19 + +@ Speaker names, the order must be matching with include/constants/speaker_names.h +NAME_NONE = 00 +NAME_MOM = 01 +NAME_PLAYER = 02 +NAME_COUNT = 03 @ fonts diff --git a/config.mk b/config.mk new file mode 100644 index 000000000000..7360c158efe2 --- /dev/null +++ b/config.mk @@ -0,0 +1,2 @@ +# Enable LTO when making a release build. Disable by setting to 0. +USE_LTO_ON_RELEASE ?= 1 diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 50a9b51dc763..56236540488c 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -100,26 +100,16 @@ gBattleAnimMove_WakeUpSlap:: end gBattleAnimMove_HammerArm:: - loadspritegfx ANIM_TAG_IMPACT - loadspritegfx ANIM_TAG_ROCKS - loadspritegfx ANIM_TAG_SLAM_HIT - monbg ANIM_TARGET - setalpha 12, 8 - playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_ATTACKER - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 20, 3, 0, 4 - delay 1 - createsprite gSlamHitSpriteTemplate, ANIM_ATTACKER, 2, 0, 0 - delay 3 - setarg 7, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 10, -8, ANIM_TARGET, 1 - playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 5, 1 - createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -12, 32, 3, 4 - createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 8, 31, 2, 2 - createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -4, 28, 2, 3 - createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 12, 30, 4, 3 - createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_TARGET, 2, 0, 0, 5 - clearmonbg ANIM_TARGET + loadspritegfx ANIM_TAG_HORSESHOE_SIDE_FIST @punch + loadspritegfx ANIM_TAG_ICE_CRYSTALS @ice + loadspritegfx ANIM_TAG_ECLIPSING_ORB @gray color + loadspritegfx ANIM_TAG_BLACK_SMOKE @smoke + playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET + createsprite gIceHammerPunchStompTemplate, ANIM_TARGET, 3, 0, -32, 15 + delay 19 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createvisualtask AnimTask_SquishTarget, 2 + waitforvisualfinish blendoff end @@ -181,7 +171,7 @@ gBattleAnimMove_Brine:: playsewithpan SE_M_DIVE, -64 waitforvisualfinish delay 16 - createvisualtask AnimTask_WaterSpoutRain, 5 + createvisualtask AnimTask_BrineRain, 5 playsewithpan SE_M_SURF, +63 clearmonbg ANIM_DEF_PARTNER blendoff @@ -200,7 +190,7 @@ gBattleAnimMove_NaturalGift:: createvisualtask AnimTask_DragonDanceWaver, 5 playsewithpan SE_M_TELEPORT, -64 delay 8 - createvisualtask AnimTask_BlendPalInAndOutByTag, 5, ANIM_TAG_HOLLOW_ORB, 19456, 14, 0, 3 + createvisualtask AnimTask_BlendPalInAndOutByTag, 5, ANIM_TAG_HOLLOW_ORB, RGB(0, 0, 19), 14, 0, 3 createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 0 createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 43 createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 85 @@ -265,23 +255,23 @@ gBattleAnimMove_Tailwind:: createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 4, 4 createvisualtask AnimTask_TraceMonBlended, 2, 0, 4, 7, 10 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER - createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 10, 2304, 96, 0 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 10, 2304, 96, 1 delay 12 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER - createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 90, 2048, 96, 0 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 90, 2048, 96, 1 delay 12 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER - createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 50, 2560, 96, 0 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 50, 2560, 96, 1 delay 12 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER - createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 20, 2304, 96, 0 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 20, 2304, 96, 1 delay 12 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER - createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 70, 1984, 96, 0 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 70, 1984, 96, 1 delay 12 - createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0, 2816, 96, 0 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0, 2816, 96, 1 delay 10 - createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 60, 2560, 96, 0 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 60, 2560, 96, 1 waitforvisualfinish stopsound call UnsetHighSpeedBg @@ -295,23 +285,23 @@ gBattleAnimGeneral_Tailwind:: playsewithpan SE_M_GUST, SOUND_PAN_ATTACKER call SetHighSpeedBg setalpha 12, 8 - createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 10, 2304, 96, 0 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 10, 2304, 96, 1 delay 12 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER - createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 90, 2048, 96, 0 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 90, 2048, 96, 1 delay 12 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER - createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 50, 2560, 96, 0 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 50, 2560, 96, 1 delay 12 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER - createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 20, 2304, 96, 0 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 20, 2304, 96, 1 delay 12 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER - createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 70, 1984, 96, 0 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 70, 1984, 96, 1 delay 12 - createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0, 2816, 96, 0 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0, 2816, 96, 1 delay 10 - createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 60, 2560, 96, 0 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 60, 2560, 96, 1 waitforvisualfinish stopsound call UnsetHighSpeedBg @@ -322,6 +312,7 @@ gBattleAnimGeneral_Tailwind:: gBattleAnimMove_Acupressure:: loadspritegfx ANIM_TAG_ACUPRESSURE loadspritegfx ANIM_TAG_SPARK_2 + playsewithpan SE_M_METRONOME, SOUND_PAN_ATTACKER createsprite gAcupressureSpriteTemplate, ANIM_ATTACKER, 40, 0, -40, 40 waitforvisualfinish call ElectricityEffect @@ -375,33 +366,82 @@ gBattleAnimMove_UTurn:: gBattleAnimMove_CloseCombat:: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET + monbg ANIM_DEF_PARTNER call SetHighSpeedBg createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 - createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 playsewithpan SE_M_COMET_PUNCH, +63 - delay 10 + delay 2 createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 - createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 playsewithpan SE_M_VITAL_THROW2, +63 - delay 10 + delay 2 createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 - createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 playsewithpan SE_M_MEGA_KICK2, +63 - delay 10 + delay 2 createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 - createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 playsewithpan SE_M_COMET_PUNCH, +63 - delay 10 + delay 2 createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 - createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 playsewithpan SE_M_VITAL_THROW2, +63 - delay 10 + delay 2 createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 - createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 playsewithpan SE_M_MEGA_KICK2, +63 - delay 10 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_VITAL_THROW2, +63 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_MEGA_KICK2, +63 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_VITAL_THROW2, +63 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_MEGA_KICK2, +63 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_VITAL_THROW2, +63 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_MEGA_KICK2, +63 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_VITAL_THROW2, +63 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_MEGA_KICK2, +63 + delay 1 call UnsetHighSpeedBg - clearmonbg ANIM_TARGET + clearmonbg ANIM_DEF_PARTNER blendoff delay 1 setarg 7, 0x1000 @@ -617,9 +657,9 @@ gBattleAnimMove_PowerTrick:: loopsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET 0xa 0x3 createvisualtask AnimTask_UproarDistortion 0x2, 0x0 createsprite gPowerTrickSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 0, SOUND_PAN_TARGET, 0 - delay 0x10 + delay 16 createvisualtask AnimTask_UproarDistortion 0x2, 0x0 - delay 0x10 + delay 16 createvisualtask AnimTask_UproarDistortion 0x2, 0x0 waitforvisualfinish end @@ -687,7 +727,7 @@ gBattleAnimMove_MeFirst:: loadspritegfx ANIM_TAG_ORBS loadspritegfx ANIM_TAG_FINGER loadspritegfx ANIM_TAG_THOUGHT_BUBBLE - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ORBS, 0, 12, 12, 0x7FAF + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ORBS, 0, 12, 12, RGB(15, 29, 31) setalpha 11, 5 monbg_static ANIM_DEF_PARTNER splitbgprio_all @@ -848,7 +888,7 @@ gBattleAnimMove_LastResort:: waitbgfadein loadspritegfx ANIM_TAG_IMPACT playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 2, 4, 2, RGB_WHITE, 10, 0, 0 + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 4, 2, RGB_WHITE, 10, RGB_BLACK, 0 waitforvisualfinish delay 10 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER @@ -930,6 +970,7 @@ gBattleAnimMove_HeartSwap:: loadspritegfx ANIM_TAG_RED_HEART loadspritegfx ANIM_TAG_PINKVIO_ORB loadspritegfx ANIM_TAG_SPARKLE_2 + monbg ANIM_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 3, 0, 8, RGB(31, 24, 26) createvisualtask AnimTask_HeartSwap, 3, ANIM_TARGET createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_TARGET, RGB_WHITE, 12, 3, 1 @@ -962,7 +1003,6 @@ gBattleAnimMove_HeartSwap:: createsprite gRedHeartCharmSpriteTemplate, ANIM_ATTACKER, 3, 20, 20 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER waitforvisualfinish - clearmonbg ANIM_ATTACKER clearmonbg ANIM_TARGET blendoff end @@ -1118,7 +1158,7 @@ gBattleAnimMove_FlareBlitz:: createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, -224, -32, 40 createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, 112, -128, 40 playsewithpan SE_M_COMET_PUNCH, +63 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 0, 0, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 0, RGB_BLACK playsewithpan SE_M_COMET_PUNCH, +63 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 9 @@ -1179,7 +1219,7 @@ gBattleAnimMove_RockPolish:: setalpha 12, 8 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 3, 0, 12, RGB_BLACK waitforvisualfinish - loopsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 10, 7 + loopsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER, 10, 7 createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, -10, 3 delay 1 createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, 24, -19 @@ -1217,7 +1257,7 @@ gBattleAnimMove_RockPolish:: createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, -21, -16 delay 2 waitforvisualfinish - playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER createsprite gRockPolishSparkleSpriteTemplate, ANIM_ATTACKER, 2, -20, 9 createsprite gRockPolishSparkleSpriteTemplate, ANIM_ATTACKER, 2, -10, -15 createsprite gRockPolishSparkleSpriteTemplate, ANIM_ATTACKER, 2, 1, 17 @@ -1295,32 +1335,39 @@ gBattleAnimMove_PoisonJab:: end gBattleAnimMove_DarkPulse:: - loadspritegfx ANIM_TAG_THIN_RING + loadspritegfx ANIM_TAG_PURPLE_RING monbg ANIM_TARGET fadetobg BG_DARK waitbgfadein - delay 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1D09, 12 - createvisualtask AnimTask_SpiteTargetShadow, 2 loopsewithpan SE_M_PSYBEAM, SOUND_PAN_TARGET, 20, 3 - delay 8 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1D09, 12 - delay 8 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1D09, 12 - delay 8 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1D09, 12 - delay 8 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1D09, 12 - delay 8 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1D09, 12 - delay 8 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1D09, 12 + createvisualtask AnimTask_SwayMon, ANIM_TARGET, 0, 6, 0x0800, 8, ANIM_TARGET + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 4, 0, 12, RGB(30, 10, 13) + call DarkPulseParticle + call DarkPulseParticle + call DarkPulseParticle waitforvisualfinish + blendoff clearmonbg ANIM_TARGET - delay 1 restorebg waitbgfadein end +DarkPulseParticle: + createsprite gDarkPulseSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + createsprite gDarkPulseSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + createsprite gDarkPulseSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + createsprite gDarkPulseSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + createsprite gDarkPulseSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + createsprite gDarkPulseSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + createsprite gDarkPulseSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + createsprite gDarkPulseSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + return gBattleAnimMove_NightSlash:: loadspritegfx ANIM_TAG_SLASH @@ -1381,7 +1428,7 @@ gBattleAnimMove_AquaTail:: playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET createsprite gAquaTailKnockOffSpriteTemplate, ANIM_ATTACKER, 2, -16, -16 delay 8 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 5, 1, RGB_WHITE, 10, 0, 0 + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 5, 1, RGB_WHITE, 10, RGB_BLACK, 0 createsprite gAquaTailHitSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -12, 10, 0, 3 @@ -1469,7 +1516,7 @@ gBattleAnimMove_XScissor:: playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER delay 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_BLACK, 10, 0, 0 + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 10, RGB_BLACK, 0 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_TARGET @@ -1482,19 +1529,19 @@ gBattleAnimMove_BugBuzz:: monbg ANIM_DEF_PARTNER call SetBugBg createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 29, -12, 0 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -12, -29, 1 delay 16 createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 12, -29, 1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -29, -12, 0 delay 16 createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, -24, 1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, -24, 0 @@ -1546,7 +1593,7 @@ gBattleAnimMove_DragonRush:: playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET createsprite gDragonRushSpriteTemplate, ANIM_ATTACKER, 3, -16, -16 delay 8 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 5, 1, RGB_WHITE, 10, 0, 0 + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 5, 1, RGB_WHITE, 10, RGB_BLACK, 0 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 1 waitforvisualfinish @@ -1561,7 +1608,6 @@ gBattleAnimMove_DragonRush:: createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -30, -18, 8, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 7, 1 waitforvisualfinish - clearmonbg ANIM_DEF_PARTNER blendoff end @@ -1628,7 +1674,7 @@ gBattleAnimMove_VacuumWave:: setalpha 12, 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, -8, ANIM_TARGET, 2 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 8, 0, 8, 1, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 0, 0x7FFF, 3 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 0, RGB_WHITE, 3 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish @@ -1683,7 +1729,7 @@ gBattleAnimMove_BraveBird:: loadspritegfx ANIM_TAG_BIRD call SetSkyBg monbg ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 10, 2, 0, 0, 16, RGB_WHITE + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 0, 16, RGB_WHITE delay 4 createvisualtask AnimTask_AttackerFadeToInvisible, 5, 0 waitforvisualfinish @@ -1695,7 +1741,7 @@ gBattleAnimMove_BraveBird:: delay 20 createvisualtask AnimTask_AttackerFadeFromInvisible, 5, 1 delay 2 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 2, 0, 15, 0, RGB_WHITE + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 15, 0, RGB_WHITE waitforvisualfinish clearmonbg ANIM_ATTACKER call UnsetSkyBg @@ -1706,7 +1752,11 @@ gBattleAnimMove_EarthPower:: loadspritegfx ANIM_TAG_FIRE_PLUME createvisualtask AnimTask_HorizontalShake, 3, ANIM_TARGET, 10, 50 playsewithpan SE_M_EARTHQUAKE, SOUND_PAN_TARGET - delay 40 + delay 32 + fadetobg BG_FISSURE + waitbgfadeout + createvisualtask AnimTask_PositionFissureBgOnBattler, 5, ANIM_TARGET, 5, -1 + waitbgfadein loopsewithpan 145, SOUND_PAN_TARGET 11, 3 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 3, 25, 1 createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 5, 0 @@ -1727,6 +1777,10 @@ gBattleAnimMove_EarthPower:: waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_TARGET, 66, 0, 0, 4 waitforvisualfinish + restorebg + waitbgfadeout + setarg 7, -1 + waitbgfadein end gBattleAnimMove_Switcheroo:: @@ -1925,40 +1979,30 @@ SnowSlide1: delay 2 return +@Credits to Skeli gBattleAnimMove_IceShard:: monbg ANIM_TARGET splitbgprio ANIM_TARGET setalpha 12, 8 loadspritegfx ANIM_TAG_ICE_CRYSTALS - fadetobg BG_ICE - waitbgfadein - createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_BUBBLE_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 4, 4, 0, 10 - createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, -20, 70, 0, 42, 35 - createsprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, -20, 58, 0, 30, 35 - createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, -20, -12, 0, 22, 40 - createsprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, -20, 0, 0, 10, 40 - delay 5 - createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, -10, -30, 10, -12, 45 - createsprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, -10, -42, 10, -24, 45 - createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, -10, -20, 10, -36, 45 - createsprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, -10, -32, 10, -24, 45 - delay 5 - createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, 0, 10, 20, 22, 45 - createsprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, 0, -2, 20, 10, 45 - createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 20, -2, 30 - createsprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, 0, 8, 20, 10, 30 + loadspritegfx ANIM_TAG_IMPACT + createsprite gIceShardSpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30 delay 1 + createsprite gIceShardSpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20 + delay 1 + createsprite gIceShardSpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30 + delay 1 + createsprite gIceShardSpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20 + delay 1 + createsprite gIceShardSpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30 + delay 4 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_TARGET, -31, 0, 7, RGB(0, 20, 31) createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 25, 1 - waitforvisualfinish - delay 20 call IceCrystalEffectShort createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_TARGET, 5, 7, 0, RGB(0, 20, 31) waitforvisualfinish - restorebg - waitbgfadein - clearmonbg ANIM_TARGET blendoff + clearmonbg ANIM_TARGET end gBattleAnimMove_ShadowClaw:: @@ -2028,7 +2072,7 @@ gBattleAnimMove_IceFang:: loadspritegfx ANIM_TAG_SHARP_TEETH loadspritegfx ANIM_TAG_IMPACT createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 7, RGB_BLACK - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 0, 9, RGB(12, 26, 31) + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB(12, 26, 31) delay 20 playsewithpan SE_M_STRING_SHOT, SOUND_PAN_TARGET createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 0 @@ -2049,7 +2093,7 @@ gBattleAnimMove_IceFang:: delay 15 call IceCrystalEffectShort delay 5 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 9, 0, RGB(12, 26, 31) + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 9, 0, RGB(12, 26, 31) waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 7, 0, RGB_BLACK waitforvisualfinish @@ -2064,7 +2108,7 @@ gBattleAnimMove_FireFang:: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 0, 9, RGB_RED + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB_RED createsprite gFireSpiralInwardSpriteTemplate, ANIM_TARGET, 1, 0 createsprite gFireSpiralInwardSpriteTemplate, ANIM_TARGET, 1, 64 createsprite gFireSpiralInwardSpriteTemplate, ANIM_TARGET, 1, 128 @@ -2080,7 +2124,7 @@ gBattleAnimMove_FireFang:: delay 4 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 0, 9, 0, RGB_RED + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0, 9, 0, RGB_RED waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -2094,7 +2138,7 @@ gBattleAnimMove_ShadowSneak:: loadspritegfx ANIM_TAG_POISON_BUBBLE @Poison loadspritegfx ANIM_TAG_HANDS_AND_FEET monbg ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x7, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 7, RGB_BLACK waitforvisualfinish playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 1, 3 @@ -2102,9 +2146,9 @@ gBattleAnimMove_ShadowSneak:: waitforvisualfinish clearmonbg ANIM_ATTACKER invisible ANIM_ATTACKER - delay 0x1 + delay 1 createvisualtask AnimTask_DestinyBondWhiteShadow, 0x5, 0x0, 0x30 - delay 0x30 + delay 48 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 15, RGB_BLACK createsprite gShadowSneakImpactSpriteTemplate, ANIM_TARGET, 2, 0xfff6, 0xfff6, 0x0 call ShadowSneakMovement @@ -2116,13 +2160,13 @@ gBattleAnimMove_ShadowSneak:: call ShadowSneakMovement waitforvisualfinish visible ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x7, 0x0, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 7, 0, RGB_BLACK waitforvisualfinish end ShadowSneakMovement: playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x4 + delay 4 return gBattleAnimMove_MudBomb:: @@ -2184,8 +2228,8 @@ gBattleAnimMove_PsychoCut:: createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CROSS_IMPACT, 0, 9, 9, RGB_PURPLE createvisualtask AnimTask_SwayMon, ANIM_ATTACKER, 0, 6, 2048, 2, ANIM_ATTACKER createsprite gPsychoCutSpiralSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0, 0 - createvisualtask AnimTask_BlendBattleAnimPal, 1, 1, 2, 0, 4, RGB_BLACK - createvisualtask AnimTask_BlendBattleAnimPal, 1, 2, 2, 0, 10, RGB(20, 12, 23) + createvisualtask AnimTask_BlendBattleAnimPal, 1, F_PAL_BG, 2, 0, 4, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 1, F_PAL_ATTACKER, 2, 0, 10, RGB(20, 12, 23) delay 30 clearmonbg ANIM_ATK_PARTNER waitforvisualfinish @@ -2197,8 +2241,8 @@ gBattleAnimMove_PsychoCut:: waitforvisualfinish createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 7, 0, 9, 1 createsprite gCrossImpactSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 20 - createvisualtask AnimTask_BlendBattleAnimPal, 1, 1, 2, 4, 0, RGB_BLACK - createvisualtask AnimTask_BlendBattleAnimPal, 1, 2, 2, 10, 0, RGB(20, 12, 23) + createvisualtask AnimTask_BlendBattleAnimPal, 1, F_PAL_BG, 2, 4, 0, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 1, F_PAL_ATTACKER, 2, 10, 0, RGB(20, 12, 23) clearmonbg ANIM_TARGET blendoff waitforvisualfinish @@ -2245,28 +2289,27 @@ gBattleAnimMove_MirrorShot:: createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 10, RGB_WHITEALPHA createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 12, 12, RGB(21, 21, 21) waitforvisualfinish - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 3 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 3 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 3 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 3 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 3 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 10, 0, RGB_WHITEALPHA createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 waitforvisualfinish - clearmonbg ANIM_ATTACKER blendoff end @@ -2301,7 +2344,7 @@ gBattleAnimMove_FlashCannon:: waitforvisualfinish playsewithpan SE_M_LEER, SOUND_PAN_ATTACKER createvisualtask AnimTask_Flash, 2 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 1, 16, 0, 0x1f + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 16, 0, RGB_RED createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 15, 1 waitforvisualfinish clearmonbg ANIM_TARGET @@ -2349,12 +2392,12 @@ gBattleAnimMove_Defog:: playsewithpan SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER createsprite gLusterPurgeCircleSpriteTemplate, ANIM_ATTACKER, 41, 0, 0, 0, 0 delay 20 - createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, -1 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_WHITE_CIRCLE_OF_LIGHT, 2, 0, 16, -1 waitforvisualfinish waitforvisualfinish delay 16 - createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, -1 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff @@ -2366,7 +2409,7 @@ gBattleAnimGeneral_TrickRoom:: playsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET fadetobg BG_TRICK_ROOM waitbgfadein - delay 0x40 + delay 64 restorebg waitbgfadein blendoff @@ -2700,62 +2743,69 @@ gBattleAnimMove_LeafStorm:: end gBattleAnimMove_PowerWhip:: - loadspritegfx ANIM_TAG_WHIP_HIT + loadspritegfx ANIM_TAG_PUNISHMENT_BLADES + loadspritegfx ANIM_TAG_LEAF @green color + loadspritegfx ANIM_TAG_IMPACT playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 10 delay 6 playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET - createsprite gVineWhipSpriteTemplate, ANIM_TARGET, 2, 0, 0 - delay 6 - call SetImpactBackground - createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1 + createsprite gSpinningVineSpriteTemplate, ANIM_ATTACKER, 2, -42, -25, 0, 0, 25 + createvisualtask AnimTask_IsTargetPlayerSide, 2 + jumpretfalse PowerWhipOnOpponent + goto PowerWhipOnPlayer +PowerWhipOnOpponent: + fadetobg BG_IMPACT_OPPONENT + goto PowerWhipContinue +PowerWhipOnPlayer: + fadetobg BG_IMPACT_PLAYER + goto PowerWhipContinue +PowerWhipContinue: + waitbgfadeout + delay 5 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1 + playsewithpan SE_BANG, SOUND_PAN_TARGET + waitforvisualfinish + delay 20 restorebg waitbgfadein + waitforvisualfinish end gBattleAnimMove_RockWrecker:: - jumpargeq 7, 1, RockWrecker_1 - fadetobg BG_ROCK_WRECKER - waitbgfadeout - createvisualtask AnimTask_StartSlidingBg, 5, -1024, 0, 1, -1 - goto RockWrecker_2 -RockWrecker_1: - fadetobg BG_ROCK_WRECKER - waitbgfadeout - createvisualtask AnimTask_StartSlidingBg, 5, -1024, 0, 0, -1 loadspritegfx ANIM_TAG_ROCKS + loadspritegfx ANIM_TAG_REALLY_BIG_ROCK + loadspritegfx ANIM_TAG_EXPLOSION loadspritegfx ANIM_TAG_IMPACT - createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 6 - delay 3 + fadetobg BG_ROCK_WRECKER + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0xF000, 0, 0, -1 + waitbgfadein + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 46, 1 + delay 6 + playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER + call ContinentalCrushStockpileRocks + createsprite gContinentalCrushGrowingRockSpriteTemplate, ANIM_ATTACKER, 41, 0, 0, 0, 0 + playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER + call ContinentalCrushStockpileRocks + delay 10 + loopsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER, 10, 3 + waitforvisualfinish playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER - createsprite gRockBlastRockSpriteTemplate, ANIM_ATTACKER, 130, 16, 0, 0, 0, 25, (1 << 8) | 1 + createsprite gReallyBigRockBlastRockSpriteTemplate, ANIM_TARGET, 2, 16, 0, 0, 0, 25, 257 waitforvisualfinish createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 131, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_ROCK_THROW SOUND_PAN_TARGET createsprite gRockFragmentSpriteTemplate, ANIM_TARGET, 130, 0, 0, 20, 24, 14, 2 - createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 8, 0, 40, 1 createsprite gRockFragmentSpriteTemplate, ANIM_TARGET, 130, 5, 0, -20, 24, 14, 1 createsprite gRockFragmentSpriteTemplate, ANIM_TARGET, 130, 0, 5, 20, -18, 14, 2 createsprite gRockFragmentSpriteTemplate, ANIM_TARGET, 130, -5, 0, -20, -18, 14, 2 + call OpposingExplosion2 waitforvisualfinish - call UnsetPsychicBg - end -RockWrecker_2: - loadspritegfx ANIM_TAG_ROCKS - loadspritegfx ANIM_TAG_IMPACT - createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 6 - delay 3 - playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER - createsprite gRockBlastRockSpriteTemplate, ANIM_ATTACKER, 2, 16, 0, 0, 0, 25, 257 - waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 - playsewithpan SE_M_ROCK_THROW SOUND_PAN_TARGET - createsprite gRockFragmentSpriteTemplate ANIM_TARGET, 2, 0, 0, 20, 24, 14, 2 - createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 - createsprite gRockFragmentSpriteTemplate ANIM_ATTACKER, 2, 5, 0, -20, 24, 14, 1 - createsprite gRockFragmentSpriteTemplate ANIM_ATTACKER, 2, 0, 5, 20, -18, 14, 2 - createsprite gRockFragmentSpriteTemplate ANIM_ATTACKER, 2, -5, 0, -20, -18, 14, 2 waitforvisualfinish + blendoff call UnsetPsychicBg end @@ -2765,7 +2815,7 @@ gBattleAnimMove_CrossPoison:: monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_WHITE, 10, 0, 10 + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_WHITE, 10, RGB_BLACK, 10 createsprite gCrossImpactSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 20 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 7, 0, 9, 1 waitforvisualfinish @@ -2964,10 +3014,10 @@ gBattleAnimMove_StoneEdge:: playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 delay 4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 @@ -3029,19 +3079,19 @@ gBattleAnimMove_Chatter:: loadspritegfx ANIM_TAG_MUSIC_NOTES monbg ANIM_DEF_PARTNER createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1f, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 0x1d, -12, 0 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -12, 0xffe3, 1 delay 16 createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1f, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 12, 0xffe3, 1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 0xffe3, -12, 0 delay 16 createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1f, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 0x18, 0xffe8, 1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 0xffe8, 0xffe8, 0 @@ -3070,10 +3120,10 @@ gBattleAnimMove_Judgment:: loadspritegfx ANIM_TAG_GUST loadspritegfx ANIM_TAG_ORBS loadspritegfx ANIM_TAG_ELECTRICITY - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_GUST, 0, 14, 14, 0 - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HANDS_AND_FEET, 0, 10, 10, 0 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_GUST, 0, 14, 14, RGB_BLACK + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HANDS_AND_FEET, 0, 10, 10, RGB_BLACK monbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 0, 15, 32767 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 15, RGB_WHITE waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 83, 1 createsprite gJudgmentBlackChargeTemplate, ANIM_TARGET, 1, 1, ANIM_TARGET @@ -3091,7 +3141,7 @@ gBattleAnimMove_Judgment:: call JudgmentInwardSpikes2 delay 5 call JudgmentInwardSpikes2 - delay 0x2F + delay 47 call JudgmentOutwardSpikes delay 5 call JudgmentOutwardSpikes2 @@ -3112,7 +3162,7 @@ gBattleAnimMove_Judgment:: delay 5 call JudgmentOutwardSpikes2 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 15, 0, 32767 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 15, 0, RGB_WHITE waitforvisualfinish clearmonbg ANIM_TARGET end @@ -3286,16 +3336,11 @@ gBattleAnimMove_AquaJet:: loadspritegfx ANIM_TAG_ROUND_SHADOW loadspritegfx ANIM_TAG_SPLASH loadspritegfx ANIM_TAG_SWEAT_BEAD - playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER - createsprite gDiveBallSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 13, 336 + createvisualtask AnimTask_AttackerStretchAndDisappear, 2 + playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER waitforvisualfinish - playsewithpan SE_M_DIVE, SOUND_PAN_ATTACKER - createsprite gDiveWaterSplashSpriteTemplate, ANIM_ATTACKER, 3, 0 - call DiveSetUpWaterDroplets - call DiveSetUpWaterDroplets - call DiveSetUpWaterDroplets - call DiveSetUpWaterDroplets - call DiveSetUpWaterDroplets + delay 1 + createvisualtask AnimTask_SetAttackerInvisibleWaitForSignal, 2 loadspritegfx ANIM_TAG_WATER_IMPACT loadspritegfx ANIM_TAG_SMALL_BUBBLES monbg ANIM_DEF_PARTNER @@ -3310,9 +3355,13 @@ gBattleAnimMove_AquaJet:: delay 12 call RisingWaterHitEffect waitforvisualfinish + createvisualtask AnimTask_ExtremeSpeedMonReappear, 2 + setarg 0x7, 0x1000 + waitforvisualfinish visible ANIM_ATTACKER clearmonbg ANIM_DEF_PARTNER blendoff + setarg 7, 0x1000 end gBattleAnimMove_AttackOrder:: @@ -3348,10 +3397,10 @@ gBattleAnimMove_AttackOrder:: createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 delay 4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 @@ -3487,8 +3536,8 @@ gBattleAnimMove_RoarOfTime:: loadspritegfx ANIM_TAG_ORBS loadspritegfx ANIM_TAG_EXPLOSION loadspritegfx ANIM_TAG_WATER_GUN - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 0, 16, 0 - delay 0x20 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK + delay 32 monbg ANIM_ATK_PARTNER setalpha 0xc, 0x8 loopsewithpan 133, SOUND_PAN_ATTACKER 13 3 @@ -3496,11 +3545,11 @@ gBattleAnimMove_RoarOfTime:: waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 16, 0, 0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB_BLACK waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 0, 16, -1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_WHITEALPHA createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL - delay 0x20 + delay 32 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 20, 1 playsewithpan 170, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 1 @@ -3520,7 +3569,7 @@ gBattleAnimMove_RoarOfTime:: playsewithpan 170, SOUND_PAN_TARGET createsprite gRoarOfTimeBombTemplate, ANIM_ATTACKER, 3, 0xffe8, 0x18, 1, 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 16, 0, -1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB_WHITEALPHA waitforvisualfinish end @@ -3529,7 +3578,7 @@ gBattleAnimMove_SpacialRend:: loadspritegfx ANIM_TAG_PINK_HEART_2 @ANIM_TAG_BERRY_EATEN monbg ANIM_ATK_PARTNER setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 0, 16, 0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK loopsewithpan 133, SOUND_PAN_ATTACKER 13 2 createsprite gSpacialRendBladesTemplate, ANIM_ATTACKER, 3, 0, 0, 0x38, 0 delay 2 @@ -3553,7 +3602,7 @@ gBattleAnimMove_SpacialRend:: waitforvisualfinish restorebg waitbgfadein - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 0, 0, 0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 0, RGB_BLACK clearmonbg ANIM_ATK_PARTNER blendoff end @@ -3684,7 +3733,7 @@ gBattleAnimMove_SeedFlare:: loadspritegfx ANIM_TAG_FLYING_DIRT @heat wave animation monbg ANIM_ATTACKER setalpha 14, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 0, 12, 32767 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_WHITE waitforvisualfinish playsewithpan 133, SOUND_PAN_ATTACKER createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, 0x28, 0x28, 16 @@ -3755,7 +3804,7 @@ gBattleAnimMove_SeedFlare:: delay 10 createsprite gSeedFlareGreenWavesTemplate, ANIM_ATTACKER, 0x28, 0x3c, 0xa00, 0x60, 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 12, 0, 32767 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_WHITE waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff @@ -3769,7 +3818,7 @@ gBattleAnimMove_OminousWind:: monbg ANIM_DEF_PARTNER @bankBG_over_partnerBG delay 0 - createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, 1, 0, 0, 0, 0 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, ANIM_TARGET, 0, 0, 0, RGB_BLACK delay 0 createvisualtask AnimTask_GetAttackerSide, 2 jumpargeq 7, 1, OminousWindFadeToBg @@ -3784,7 +3833,7 @@ OminousWindFadeToBg: goto OminousWindHit OminousWindHit: delay 0 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 0, 4, 4, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 4, 4, RGB_BLACK waitbgfadein createsprite gSilverWindBigSparkSpriteTemplate, ANIM_TARGET, 66, -32, 16, 0, 6, 2, 3, 1 createsprite gSilverWindBigSparkSpriteTemplate, ANIM_TARGET, 66, -8, 18, 64, 3, 2, 2, 1 @@ -3815,7 +3864,7 @@ OminousWindHit: delay 0 restorebg waitbgfadeout - createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, 1, 0, 4, 0, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, ANIM_TARGET, 0, 4, 0, RGB_BLACK setarg 7, -1 waitbgfadein end @@ -3937,7 +3986,7 @@ gBattleAnimMove_WideGuard:: createsprite gWideGuardBlueConversionTemplate, ANIM_ATTACKER, 0x2, 0x8, 0x18 delay 3 createsprite gWideGuardBlueConversionTemplate, ANIM_ATTACKER, 0x2, 0x18, 0x18 - delay 0x14 + delay 20 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET createvisualtask AnimTask_ConversionAlphaBlend, 5 waitforvisualfinish @@ -3947,7 +3996,7 @@ gBattleAnimMove_WideGuard:: gBattleAnimMove_GuardSplit:: loadspritegfx ANIM_TAG_BLUEGREEN_ORB - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK loopsewithpan SE_M_LOCK_ON, SOUND_PAN_ATTACKER, 0x18, 0x3 call GuardSplitLaunch call GuardSplitLaunch @@ -3960,19 +4009,19 @@ gBattleAnimMove_GuardSplit:: call GuardSplitLaunch call GuardSplitLaunch waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish end GuardSplitLaunch: createsprite gGuardSwapOrbs1Template, ANIM_TARGET, 2, 0xfff4, 0x0 createsprite gGuardSwapOrbs2Template, ANIM_TARGET, 0, 0x0, 0x0, 0x0, 0x0, 0x1E, 0x0 - delay 0x5 + delay 5 return gBattleAnimMove_PowerSplit:: loadspritegfx ANIM_TAG_RED_HEART loadspritegfx ANIM_TAG_BLUEGREEN_ORB - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK loopsewithpan SE_M_LOCK_ON, SOUND_PAN_ATTACKER, 0x18, 0x3 call PowerSplitLaunch call PowerSplitLaunch @@ -3985,7 +4034,7 @@ gBattleAnimMove_PowerSplit:: call PowerSplitLaunch call PowerSplitLaunch waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish end PowerSplitLaunch: @@ -4000,7 +4049,7 @@ gBattleAnimGeneral_WonderRoom:: playsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET fadetobg BG_WONDER_ROOM waitbgfadein - delay 0x40 + delay 64 restorebg waitbgfadein blendoff @@ -4120,16 +4169,16 @@ gBattleAnimMove_Autotomize:: playsewithpan SE_ELEVATOR, SOUND_PAN_ATTACKER createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x0 createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x1 - delay 0xc + delay 12 createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x2 createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x3 - delay 0xc + delay 12 createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x0 createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x1 - delay 0xc + delay 12 createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x2 createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x3 - delay 0x18 + delay 24 waitforvisualfinish stopsound clearmonbg ANIM_ATK_PARTNER @@ -4151,28 +4200,28 @@ gBattleAnimMove_RagePowder:: end RagePowderSprinkle: createsprite gRagePowderRedPowderTemplate, ANIM_ATTACKER, 0x2, 0x0, 0xffec, 0x55, 0x50, 0x0 - delay 0xc + delay 12 createsprite gRagePowderRedPowderTemplate, ANIM_ATTACKER, 0x2, 0x0, 0xfff6, 0xaa, 0x50, 0x0 - delay 0xc + delay 12 createsprite gRagePowderRedPowderTemplate, ANIM_ATTACKER, 0x2, 0x0, 0xfff1, 0x0, 0x50, 0x0 - delay 0xc + delay 12 return gBattleAnimMove_Telekinesis:: loadspritegfx ANIM_TAG_SPARKLE_4 @detect - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0x1, 0x0, 0x9, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 9, RGB_BLACK waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0x1, 0x0, 0x9, 0x7fff - delay 0x12 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 9, RGB_WHITE + delay 18 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gSpinningSparkleSpriteTemplate, ANIM_ATTACKER, 0xd, 0x14, 0xffec waitforvisualfinish loopsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 0xa, 0x3 createvisualtask AnimTask_SwayMon, 5, 1, 24, 208, 1, ANIM_TARGET waitforvisualfinish - delay 0xA - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0x1, 0x9, 0x0, 0x0 - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0x2, 0x9, 0x0, 0x7fff + delay 10 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 9, 0, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, RGB_WHITE waitforvisualfinish end @@ -4182,7 +4231,7 @@ gBattleAnimGeneral_MagicRoom:: playsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET fadetobg BG_MAGIC_ROOM waitbgfadein - delay 0x40 + delay 64 restorebg waitbgfadein blendoff @@ -4325,20 +4374,20 @@ gBattleAnimMove_Synchronoise:: loadspritegfx ANIM_TAG_AIR_WAVE_2 @aero particles monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 @Darken + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK @Darken waitforvisualfinish panse SE_M_SCREECH, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 createsprite gSynchronoiseVioletRingTemplate, ANIM_ATTACKER, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 - delay 0x1 + delay 1 createsprite gSynchronoiseBlueRingTemplate, ANIM_ATTACKER, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 - delay 0x1 + delay 1 createsprite gSynchronoiseYellowRingTemplate, ANIM_ATTACKER, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 - delay 0x25 + delay 37 panse SE_M_SCREECH, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 createsprite gSynchronoiseBlueRingTemplate, ANIM_ATTACKER, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 - delay 0x1 + delay 1 createsprite gSynchronoiseVioletRingTemplate, ANIM_ATTACKER, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 - delay 0x1 + delay 1 createsprite gSynchronoiseYellowRingTemplate, ANIM_ATTACKER, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 waitforvisualfinish loopsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET, 0x3, 0x5 @@ -4350,7 +4399,7 @@ gBattleAnimMove_Synchronoise:: createsprite gSynchronoiseAeroWheelTemplate, ANIM_TARGET, 1, 0x0, 0xffef, 0xff20, 0xffe0, 0x28 createsprite gSynchronoiseAeroWheelTemplate, ANIM_TARGET, 1, 0x0, 0xffef, 0x70, 0xff80, 0x28 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 @Darken + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK @Darken waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end @@ -4363,13 +4412,13 @@ gBattleAnimMove_ElectroBall:: setalpha 12, 8 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER createsprite gGrowingChargeOrb2SpriteTemplate, ANIM_ATTACKER, 2, 0 - delay 0x19 + delay 25 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0x14 + delay 20 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0xF + delay 15 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0x6 + delay 6 loopsewithpan SE_M_CHARGE, 0xC, 0x6, 0x5 waitforvisualfinish createsprite gElectroBallCannonBallTemplate, ANIM_TARGET, 2, 16, 16, 8 @@ -4424,24 +4473,24 @@ gBattleAnimMove_FlameCharge:: loopsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER, 0x20, 0x6 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 6, 6, 3 call FlameChargeSwirl - delay 0x9 + delay 9 call FlameChargeSwirl - delay 0x9 + delay 9 call FlameChargeSwirl - delay 0x9 + delay 9 call FlameChargeSwirl - delay 0x9 + delay 9 call FlameChargeSwirl waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 24, 0, 0, 5 - delay 0x3 + delay 3 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 6, 0, 8, 1 call FireSpreadEffect playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_ATTACKER waitforvisualfinish - delay 0x8 + delay 8 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x7 waitforvisualfinish clearmonbg ANIM_TARGET @@ -4454,14 +4503,14 @@ gBattleAnimMove_Coil:: loadspritegfx ANIM_TAG_TENDRILS loopsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET, 0x6, 0x4 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x10, 0x0, 0x2 - delay 0x7 + delay 7 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x0, 0x2 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x8, 0x1, 0x2 - delay 0x7 + delay 7 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xfff8, 0x1, 0x2 - delay 0x8 + delay 8 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x14 + delay 20 createvisualtask AnimTask_ShakeMon2, 131, ANIM_TARGET, 4, 0, 5, 1 createvisualtask AnimTask_StretchTargetUp, 0x3 playsewithpan SE_M_BIND, SOUND_PAN_TARGET @@ -4515,15 +4564,15 @@ gBattleAnimMove_FoulPlay:: monbg ANIM_TARGET setalpha 12, 8 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x4 - delay 0x6 + delay 6 createsprite gFoulPlayImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW SOUND_PAN_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x3, 0xa, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 3, 10, 0, RGB_BLACK createsprite gFoulPlayRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x100, 0x0 - delay 0x8 + delay 8 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x3, 0xa, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 3, 10, 0, RGB_BLACK createsprite gFoulPlayRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x100, 0x0 waitforvisualfinish clearmonbg ANIM_TARGET @@ -4537,12 +4586,12 @@ gBattleAnimMove_SimpleBeam:: loadspritegfx ANIM_TAG_THIN_RING @ring setalpha 8, 8 monbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish playsewithpan SE_M_BUBBLE_BEAM, SOUND_PAN_ATTACKER call SimpleBeamsRegular call SimpleBeamsRegular - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB_WHITE createvisualtask AnimTask_SwayMon, 5, 0, 6, 2048, 4, ANIM_TARGET call SimpleBeamWithRings call SimpleBeamWithRings @@ -4550,42 +4599,42 @@ gBattleAnimMove_SimpleBeam:: call SimpleBeamWithRings call SimpleBeamWithRings createsprite gSimpleBeamBrownRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x0, 0x1F, 0x8 - delay 0x2 + delay 2 createsprite gSimpleBeamPinkRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x0, 0x1F, 0x8 - delay 0x2 + delay 2 stopsound waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x9, 0x0, 0x7FFF - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 9, 0, RGB_WHITE + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET blendoff end SimpleBeamsRegular: createsprite gSimpleBeamBrownTemplate, ANIM_TARGET, 2, 0x10, 0x0, 0x0, 0x0, 0xd, 0x0 - delay 0x2 + delay 2 createsprite gSimpleBeamPinkTemplate, ANIM_TARGET, 2, 0x10, 0x0, 0x0, 0x0, 0xd, 0x0 - delay 0x2 + delay 2 return SimpleBeamWithRings: createsprite gSimpleBeamBrownTemplate, ANIM_TARGET, 2, 0x10, 0x0, 0x0, 0x0, 0xd, 0x0 createsprite gSimpleBeamBrownRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x0, 0x1F, 0x8 - delay 0x2 + delay 2 createsprite gSimpleBeamPinkTemplate, ANIM_TARGET, 2, 0x10, 0x0, 0x0, 0x0, 0xd, 0x0 createsprite gSimpleBeamPinkRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x0, 0x1F, 0x8 - delay 0x2 + delay 2 return gBattleAnimMove_Entrainment:: createvisualtask AnimTask_TeeterDanceMovement, 5 playsewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER - delay 0x18 + delay 24 playsewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER - delay 0x18 + delay 24 playsewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER - delay 0x18 + delay 24 playsewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER - delay 0x18 + delay 24 playsewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 31, 1 waitforvisualfinish @@ -4595,11 +4644,11 @@ gBattleAnimMove_AfterYou:: loadspritegfx ANIM_TAG_ANGER @rage loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @green color createvisualtask AnimTask_SwayMon, 5, 1, 15, 1536, 2, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gAfterYouGreenRageTemplate, ANIM_ATTACKER, 2, 0x0, 0xffec, 0xffe0 createsprite gAfterYouGreenRageTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xffe5 playsewithpan SE_M_SWAGGER2, SOUND_PAN_ATTACKER - delay 0x14 + delay 20 createsprite gAfterYouGreenRageTemplate, ANIM_ATTACKER, 2, 0x0, 0x14, 0xffe0 createsprite gAfterYouGreenRageTemplate, ANIM_ATTACKER, 2, 0x0, 0x23, 0xffe5 playsewithpan SE_M_SWAGGER2, SOUND_PAN_ATTACKER @@ -4639,29 +4688,29 @@ gBattleAnimMove_EchoedVoice:: call MetalSoundPlayNote waitforvisualfinish clearmonbg ANIM_DEF_PARTNER - delay 0x0 + delay 0 waitforvisualfinish end MetalSoundPlayNote: panse SE_M_UPROAR, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 2, 0 createsprite gMetalSoundSpriteTemplate, ANIM_TARGET, 2, 0x10, 0x0, 0x0, 0x0, 0x1e, 0x0 - delay 0x2 + delay 2 return gBattleAnimMove_ChipAway:: loadspritegfx ANIM_TAG_IMPACT - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0x9, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 9, RGB_WHITE waitforvisualfinish monbg ANIM_ATK_PARTNER setalpha 12, 8 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 1, 5 - delay 0x4 + delay 4 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_VITAL_THROW2 SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_ATK_PARTNER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x9, 0x0, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, RGB_WHITE waitforvisualfinish blendoff end @@ -4729,16 +4778,16 @@ gBattleAnimMove_QuickGuard:: loadspritegfx ANIM_TAG_SPARKLE_4 @sparkles setalpha 12, 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 10, RGB_WHITE - delay 0x10 + delay 16 monbg ANIM_ATTACKER - createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 0xE, 0x0, 0x8, 0x0, 0x0 - createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 0xfff2, 0x0, 0x8, 0x0, 0x0 - delay 0x1 - createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 0xE, 0x0, 0x8, 0x0, 0x0 - createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 0xfff2, 0x0, 0x8, 0x0, 0x0 - delay 0x1 - createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 0xE, 0x0, 0x8, 0x0, 0x0 - createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 0xfff2, 0x0, 0x8, 0x0, 0x0 + createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 14, 0, 8, ANIM_ATTACKER, 0 + createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, -14, 0, 8, ANIM_ATTACKER, 0 + delay 1 + createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 14, 0, 8, ANIM_ATTACKER, 0 + createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, -14, 0, 8, ANIM_ATTACKER, 0 + delay 1 + createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 14, 0, 8, ANIM_ATTACKER, 0 + createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, -14, 0, 8, ANIM_ATTACKER, 0 waitforvisualfinish playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gSpinningSparkleSpriteTemplate, ANIM_ATTACKER, 13, 0x0, 0xffe3 @up @@ -4814,24 +4863,25 @@ gBattleAnimMove_ShellSmash:: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_ROCKS loadspritegfx ANIM_TAG_HANDS_AND_FEET - playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER - createsprite gShellSmashRightShellSpriteTemplate, ANIM_ATTACKER, 2, 0xffd7, 0x0, 0x2, 0x333, 0x0, 10, 30 - createsprite gShellSmashLeftShellSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0x0, 0x6, 0xfccd, 0x0, 10, 30 + playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER + createsprite gShellSmashRightShellSpriteTemplate, ANIM_ATTACKER, 2, -41, 0, 2, 819, 0, 10, 30 + createsprite gShellSmashLeftShellSpriteTemplate, ANIM_ATTACKER, 2, 32, 0, 6, -819, 0, 10, 30 delay 10 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 - createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x8, 0x1, 0x0 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + invisible ANIM_ATTACKER + playsewithpan SE_M_STRENGTH, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 waitforvisualfinish - playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET - createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, 0x18, 0xe, 0x2 - createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x5, 0x0, 0xffec, 0x18, 0xe, 0x1 - createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x5, 0x14, 0xffe8, 0xe, 0x2 - createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0xfffb, 0x0, 0xffec, 0xffe8, 0xe, 0x2 - createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0x1e, 0x12, 0x8, 0x2 - createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1e, 0xffee, 0x8, 0x2 - createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xffe2, 0x12, 0x8, 0x2 - createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xffe2, 0xffee, 0x8, 0x2 + playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_ATTACKER + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 + visible ANIM_ATTACKER + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 20, 24, 14, 2 + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 5, 0, -20, 24, 14, 1 + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0, 5, 20, -24, 14, 2 + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, -5, 0, -20, -24, 14, 2 + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0, -5, 30, 18, 8, 2 + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 30, -18, 8, 2 + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -30, 18, 8, 2 + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -30, -18, 8, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 7, 1 waitforvisualfinish end @@ -4841,22 +4891,22 @@ gBattleAnimMove_HealPulse:: loadspritegfx ANIM_TAG_BLUE_STAR loadspritegfx ANIM_TAG_THIN_RING playsewithpan SE_M_MORNING_SUN, SOUND_PAN_TARGET - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 13293, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB(13, 31, 12), 8 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -16, 32, -3, 1 delay 3 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 16, 32, -3, -1 delay 3 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 13293, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB(13, 31, 12), 8 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 32, 32, -3, 1 delay 3 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -32, 32, -3, 1 delay 3 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 13293, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB(13, 31, 12), 8 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 0, 32, -3, 1 delay 3 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -8, 32, -3, 1 delay 3 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 13293, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB(13, 31, 12), 8 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -8, 32, -3, 1 delay 3 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 24, 32, -3, 1 @@ -4870,7 +4920,7 @@ gBattleAnimMove_HealPulse:: gBattleAnimMove_Hex:: loadspritegfx ANIM_TAG_PURPLE_FLAME loadspritegfx ANIM_TAG_GHOSTLY_SPIRIT - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0x10, 0x4C4A @;Deep purple + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 16, RGB(10, 2, 19) @;Deep purple waitforvisualfinish monbg ANIM_TARGET splitbgprio_all @@ -4879,12 +4929,12 @@ gBattleAnimMove_Hex:: createvisualtask AnimTask_PurpleFlamesOnTarget, 0x3 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 2, 0, 37, 1 playsewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET - delay 0x20 + delay 32 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(10, 2, 19) @;Deep purple createsprite gCurseGhostSpriteTemplate, ANIM_TARGET, 4 waitforvisualfinish clearmonbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x10, 0x0, 0x4C4A @;Deep purple + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 16, 0, RGB(10, 2, 19) @;Deep purple waitforvisualfinish end @@ -4898,7 +4948,7 @@ SkyDropSetup: loadspritegfx ANIM_TAG_SMALL_BUBBLES @mist ball loadspritegfx ANIM_TAG_WHITE_FEATHER loadspritegfx ANIM_TAG_ROUND_SHADOW @fly - delay 0x0 + delay 0 playsewithpan SE_M_STRING_SHOT, SOUND_PAN_ATTACKER createsprite gSkyDropFlyBallTemplate, ANIM_TARGET, 0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x0 waitforvisualfinish @@ -4912,7 +4962,7 @@ SkyDropUnleash: setalpha 12, 8 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gBounceBallLandSpriteTemplate, ANIM_TARGET, 3 - delay 0x7 + delay 7 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 11, 1 @@ -4941,17 +4991,17 @@ gBattleAnimMove_CircleThrow:: createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 4, 1, 2 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 20, 0, 0, 4 - delay 0x2 + delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 createsprite gCircleThrowRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x100, 0x0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET - delay 0x1 + delay 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -24, 0, 0, 4 createsprite gCircleThrowRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x100, 0x0 waitforvisualfinish - delay 0x3 + delay 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x7 - delay 0xb + delay 11 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0xa waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -5005,7 +5055,7 @@ gBattleAnimMove_Quash:: setalpha 12, 8 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createsprite gQuashArmHitTemplate, ANIM_TARGET, 3, 0x0, 0xffe0, 0xf - delay 0x13 + delay 19 playsewithpan SE_M_MINIMIZE, SOUND_PAN_ATTACKER createvisualtask AnimTask_SquishTarget, 0x2 waitforvisualfinish @@ -5099,29 +5149,29 @@ gBattleAnimMove_ReflectType:: setalpha 8, 8 playsewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET createsprite gReflectTypeBlueStringTemplate, ANIM_TARGET, 2, 0x0, 0xa - delay 0x4 + delay 4 createsprite gReflectTypeVioletStringTemplate, ANIM_TARGET, 2, 0x0, 0xfffe - delay 0x4 + delay 4 createsprite gReflectTypeWhiteStringTemplate, ANIM_TARGET, 2, 0x0, 0x16 waitforvisualfinish clearmonbg ANIM_TARGET - delay 0x1F + delay 31 monbg ANIM_ATTACKER playsewithpan SE_M_MILK_DRINK, SOUND_PAN_ATTACKER createsprite gReflectTypeWhiteRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gReflectTypePinkRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gReflectTypeVioletRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gReflectTypeBlueRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gReflectTypeWhiteRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gReflectTypePinkRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gReflectTypeVioletRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gReflectTypeBlueRingTemplate, ANIM_ATTACKER, 2 waitforvisualfinish clearmonbg ANIM_ATTACKER @@ -5133,17 +5183,17 @@ gBattleAnimMove_Retaliate:: monbg ANIM_DEF_PARTNER setalpha 9, 8 createvisualtask AnimTask_AttackerPunchWithTrace, 0x2, 0x7128, 0xa - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK waitforvisualfinish playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gGuillotineSpriteTemplate, ANIM_ATTACKER, 2, 0x0 createsprite gGuillotineSpriteTemplate, ANIM_ATTACKER, 2, 0x1 - delay 0x38 + delay 56 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x10, 0x43D + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 16, RGB(29, 1, 1) waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x043D + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB(29, 1, 1) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -5153,26 +5203,26 @@ gBattleAnimMove_FinalGambit:: loadspritegfx ANIM_TAG_PINK_CLOUD @yawn animation loadspritegfx ANIM_TAG_WATER_IMPACT @blue colour loadspritegfx ANIM_TAG_EXPLOSION @explosion animation - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 @Darken + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK @Darken waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 10, 1 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB_WHITE waitforvisualfinish playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_ATTACKER createsprite gFinalGambitBlueYawnTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x25 - delay 0x4 + delay 4 waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 15, 1 createvisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 15, ANIM_TARGET, 1 waitforvisualfinish monbg ANIM_TARGET - delay 0x1 + delay 1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gFinalGambitExplosionTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 waitforvisualfinish clearmonbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish end @@ -5191,14 +5241,14 @@ gBattleAnimMove_Inferno:: call SetImpactBackground loopsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET, 40, 4 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 94, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 1, 0, 9, RGB_RED + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 0, 9, RGB_RED call InfernoAnim call InfernoAnim call InfernoAnim call InfernoAnim call InfernoAnim call InfernoAnim - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 1, 9, 0, RGB_RED + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 9, 0, RGB_RED restorebg waitbgfadein waitforvisualfinish @@ -5596,7 +5646,7 @@ gBattleAnimMove_StruggleBug:: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 9, 0x0a1f + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 9, RGB(31, 16, 2) waitforvisualfinish createvisualtask AnimTask_FlailMovement, 2, ANIM_ATTACKER createsprite gMovementWavesSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 2 @@ -5607,7 +5657,7 @@ gBattleAnimMove_StruggleBug:: createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 0x1e, 1, 0 createvisualtask AnimTask_ShakeTargetPartnerBasedOnMovePowerOrDmg, 2, FALSE, 1, 0x1e, 1, 0 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, 0x0a1f + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, RGB(31, 16, 2) delay 5 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 1 delay 5 @@ -5619,7 +5669,7 @@ gBattleAnimMove_StruggleBug:: gBattleAnimMove_Bulldoze:: createvisualtask AnimTask_Splash, 2, ANIM_ATTACKER, 3 - delay 0x8 + delay 8 goto gBattleAnimMove_Earthquake gBattleAnimMove_FrostBreath:: @@ -5641,19 +5691,19 @@ gBattleAnimMove_FrostBreath:: loopsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET, 0xb, 0x3 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 3, 25, 1 createsprite gFrostBreathBlueRageTemplate, ANIM_TARGET, 66, 0x1, 0x5, 0x0 - delay 0x1 + delay 1 createsprite gFrostBreathBlueRageTemplate, ANIM_TARGET, 66, 0x1, 0xfff6, 0xfff1 - delay 0x1 + delay 1 createsprite gFrostBreathBlueRageTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x19 - delay 0x1 + delay 1 createsprite gFrostBreathBlueRageTemplate, ANIM_TARGET, 66, 0x1, 0xf, 0x5 - delay 0x1 + delay 1 createsprite gFrostBreathBlueRageTemplate, ANIM_TARGET, 66, 0x1, 0xffe7, 0x0 - delay 0x1 + delay 1 createsprite gFrostBreathBlueRageTemplate, ANIM_TARGET, 2, 0x1, 0x1e, 0x1e - delay 0x1 + delay 1 createsprite gFrostBreathBlueRageTemplate, ANIM_TARGET, 2, 0x1, 0xffe5, 0x19 - delay 0x1 + delay 1 createsprite gFrostBreathBlueRageTemplate, ANIM_TARGET, 66, 0x1, 0x0, 0x8 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_TARGET, 66, 0x0, 0x0, 0x4 @@ -5666,23 +5716,23 @@ gBattleAnimMove_DragonTail:: loadspritegfx ANIM_TAG_SLAM_HIT loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_SLAM_HIT, 0x2, 0xD, 0xD, 0x5CAE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SLAM_HIT, 2, 13, 13, RGB(14, 5, 23) waitforvisualfinish setalpha 12, 8 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 20, 3, 0, 4 - delay 0x1 - createsprite gSlamHitSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 - delay 0x3 + delay 1 + createsprite gSlamHitSpriteTemplate, ANIM_ATTACKER, 2, 0, 0 + delay 3 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -12, 10, 0, 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 call TailWhackDown - delay 0x3 + delay 3 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 0, 3, 6, 1 waitforvisualfinish - delay 0x5 + delay 5 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x6 waitforvisualfinish clearmonbg ANIM_TARGET @@ -5761,7 +5811,7 @@ gBattleAnimMove_WildCharge:: setalpha 12, 8 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER createsprite gGrowingShockWaveOrbSpriteTemplate, ANIM_ATTACKER, 2 @electric circle - delay 0x1e + delay 30 waitforvisualfinish loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 0x1c, 0x2 call ScreenFlash @@ -5771,9 +5821,9 @@ gBattleAnimMove_WildCharge:: playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 0x6, 0x1, 0x0 waitforvisualfinish - delay 0xb + delay 11 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 26, 0, 0, 5 - delay 0x6 + delay 6 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 16, 1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET @@ -5785,7 +5835,7 @@ gBattleAnimMove_WildCharge:: blendoff end ScreenFlash: - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x07FE + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB(30, 31, 1) return gBattleAnimMove_DrillRun:: @@ -5798,7 +5848,7 @@ gBattleAnimMove_DrillRun:: createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0x0 playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER waitforvisualfinish - delay 0x2 + delay 2 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0x1 createsprite gHornHitSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0xc waitforvisualfinish @@ -5807,37 +5857,37 @@ gBattleAnimMove_DrillRun:: createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 40, 1 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x2, 0x1, 0x3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xfffc, 0x3, 0x1, 0x3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xfff8, 0xfffb, 0x1, 0x3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x4, 0xfff4, 0x1, 0x3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x0, 0x1, 0x3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x5, 0x12, 0x1, 0x3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xffef, 0xc, 0x1, 0x2 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xffeb, 0xfff1, 0x1, 0x2 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x8, 0xffe5, 0x1, 0x2 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x20, 0x0, 0x1, 0x2 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0x2 waitforvisualfinish call UnsetPsychicBg @@ -5852,10 +5902,10 @@ gBattleAnimMove_DualChop:: setalpha 12, 8 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x4 - delay 0x6 + delay 6 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 - createsprite gKarateChopSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x0, 0x0, 0x0, 0xa, 0x1, 0x3, 0x0 @left - createsprite gKarateChopSpriteTemplate, ANIM_ATTACKER, 2, 0x0515, 0x0, 0x0, 0x0, 0xa, 0x1, 0x3, 0x0 @right + createsprite gKarateChopSpriteTemplate, ANIM_ATTACKER, 2, -32, 0, 0, 0, 10, 1, 3, 0 @left + createsprite gKarateChopSpriteTemplate, ANIM_ATTACKER, 2, 1301, 0, 0, 0, 10, 1, 3, 0 @right waitforvisualfinish playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gDualChopImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 @@ -5870,7 +5920,7 @@ gBattleAnimMove_HeartStamp:: monbg ANIM_TARGET loopsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER, 0xc, 0x3 createsprite gHeartStampSpinningHeartTemplate, ANIM_TARGET, 0, 0x0, 0x0, 0x1, 0x1e - delay 0x1E + delay 30 clearmonbg ANIM_TARGET playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 131, ANIM_TARGET, 4, 0, 5, 1 @@ -5904,16 +5954,16 @@ gBattleAnimMove_SacredSword:: setalpha 12, 8 playsewithpan SE_M_SWORDS_DANCE, SOUND_PAN_ATTACKER createsprite gSwordsDanceBladeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 - delay 0x16 - createvisualtask AnimTask_FlashAnimTagWithColor, 0x2, 0x2715, 0x2, 0x2, 0x7ff2, 0x10, 0x0, 0x0 + delay 22 + createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_SWORD, 2, 2, RGB(18, 31, 31), 16, 0, 0 waitforvisualfinish clearmonbg ANIM_ATTACKER - delay 0x1 + delay 1 monbg ANIM_TARGET playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSacredSwordBladesTemplate, ANIM_TARGET, 1, 0x0, 0xa, 0x0, 0xFF00, 0xA createsprite gSacredSwordCutTemplate, ANIM_ATTACKER, 2, 0x28, 0xffe0, 0x0 - delay 0x5 + delay 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 waitforvisualfinish clearmonbg ANIM_TARGET @@ -5928,7 +5978,7 @@ gBattleAnimMove_RazorShell:: createsprite gRazorShellTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x0, 25, 0 playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 1, 0x28, 0xffe0, 0x0 - delay 0x5 + delay 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 waitforvisualfinish clearmonbg ANIM_TARGET @@ -5943,11 +5993,11 @@ gBattleAnimMove_HeatCrash:: setalpha 12, 8 playsewithpan SE_SUCCESS, SOUND_PAN_TARGET createsprite gHeatCrashEruptionRockTemplate, ANIM_ATTACKER, 3, 0x0, 0xffe0, 0xf - delay 0x13 + delay 19 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, -8, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 9, 1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - delay 0x5 + delay 5 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 10, -8, ANIM_TARGET, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 5, 1 @@ -5977,17 +6027,17 @@ gBattleAnimMove_LeafTornado:: end LeafTornadoVortex: createsprite gLeafTornadoVortexTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, 0x1 - delay 0x2 + delay 2 createsprite gLeafTornadoVortexTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, 0x1 - delay 0x2 + delay 2 createsprite gLeafTornadoVortexTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, 0x1 - delay 0x2 + delay 2 createsprite gLeafTornadoVortexTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, 0x1 - delay 0x2 + delay 2 createsprite gLeafTornadoVortexTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, 0x1 - delay 0x2 + delay 2 createsprite gLeafTornadoVortexTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, 0x1 - delay 0x2 + delay 2 return gBattleAnimMove_Steamroller:: @@ -6031,26 +6081,26 @@ gBattleAnimMove_CottonGuard:: end CottonSporesSpiralInward: createsprite gCottonGuardSporeTemplate, ANIM_ATTACKER, 2, 0x28, 0xfff6, 0xd - delay 0x3 + delay 3 createsprite gCottonGuardSporeTemplate, ANIM_ATTACKER, 2, 0xffdd, 0xfff6, 0xd - delay 0x3 + delay 3 createsprite gCottonGuardSporeTemplate, ANIM_ATTACKER, 2, 0xf, 0xffd8, 0xd - delay 0x3 + delay 3 createsprite gCottonGuardSporeTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xffe0, 0xd - delay 0x3 + delay 3 createsprite gCottonGuardSporeTemplate, ANIM_ATTACKER, 2, 0x19, 0xffec, 0xd - delay 0x3 + delay 3 createsprite gCottonGuardSporeTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffec, 0xd - delay 0x3 + delay 3 createsprite gCottonGuardSporeTemplate, ANIM_ATTACKER, 2, 0x5, 0xffd8, 0xd - delay 0x3 + delay 3 return gBattleAnimMove_NightDaze:: loadspritegfx ANIM_TAG_THIN_RING @uproar loadspritegfx ANIM_TAG_PURPLE_FLAME @dark violet color loadspritegfx ANIM_TAG_RED_ORB @circles - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish playsewithpan SE_ORB, SOUND_PAN_ATTACKER createsprite gNightDazeVioletRingsTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 @@ -6062,25 +6112,25 @@ gBattleAnimMove_NightDaze:: createsprite gNightDazeVioletCirclesTemplate, ANIM_TARGET, 2, 0xa0 createsprite gNightDazeVioletCirclesTemplate, ANIM_TARGET, 2, 0x0 createsprite gNightDazeVioletCirclesTemplate, ANIM_TARGET, 2, 0xe0 - delay 0x1 + delay 1 createsprite gNightDazeVioletRingsTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 - delay 0x1 + delay 1 createsprite gNightDazeVioletRingsTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 - delay 0xF + delay 15 createsprite gNightDazeVioletRingsTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 - delay 0x1 + delay 1 createsprite gNightDazeVioletRingsTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 - delay 0x1 + delay 1 createsprite gNightDazeVioletRingsTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 31, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x2002 - delay 0x6 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB(2, 0, 8) + delay 6 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0x9, 0x0, 0x2002 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 9, 0, RGB(2, 0, 8) waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish end @@ -6134,15 +6184,15 @@ gBattleAnimMove_Hurricane:: playsewithpan SE_M_GUST, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 64, 1 call HurricaneGust - delay 0xA + delay 10 call HurricaneGust - delay 0xA + delay 10 call HurricaneGust - delay 0xA + delay 10 call HurricaneGust - delay 0xA + delay 10 call HurricaneGust - delay 0xA + delay 10 call HurricaneGust waitforvisualfinish stopsound @@ -6166,7 +6216,7 @@ gBattleAnimMove_HeadCharge:: createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0x0 playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER waitforvisualfinish - delay 0x2 + delay 2 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0x1 waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 2, 0, 4, 1 @@ -6187,13 +6237,13 @@ gBattleAnimMove_GearGrind:: playsewithpan SE_ESCALATOR, SOUND_PAN_ATTACKER createsprite gGearGrindTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xffe0, 0x0, 0x333, 0x333, 0xa createsprite gGearGrindTemplate, ANIM_ATTACKER, 2, 0x20, 0x20, 0x0, 0xfccd, 0xfccd, 0xa - delay 0xa + delay 10 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 5, 2 waitforvisualfinish createsprite gGearGrindTemplate, ANIM_ATTACKER, 2, 0x20, 0xffe0, 0x0, 0xfccd, 0x333, 0xa createsprite gGearGrindTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x20, 0x0, 0x333, 0xfccd, 0xa - delay 0xa + delay 10 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 8, 4, 2 waitforvisualfinish @@ -6208,64 +6258,64 @@ gBattleAnimMove_SearingShot:: loadspritegfx ANIM_TAG_ELECTRIC_ORBS @charge loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge loadspritegfx ANIM_TAG_WARM_ROCK @eruption - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_ELECTRIC_ORBS, 0x0, 0xC, 0xC, 0x0E3E @Orange - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_WARM_ROCK, 0x0, 0xB, 0xB, 0x01BE @Orange + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 12, 12, RGB(30, 17, 3) @Orange + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_WARM_ROCK, 0, 11, 11, RGB(30, 13, 0) @Orange monbg ANIM_ATTACKER setalpha 8, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 60, 2, 12 - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ATTACKER, 0x2, 0x0, 0x9, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 9, RGB_RED playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0x1e + delay 30 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0x1e + delay 30 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER createsprite gSearingShotRedChargeTemplate, ANIM_ATTACKER, 2, 0x0 - delay 0x19 + delay 25 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0x14 + delay 20 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0xf + delay 15 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER waitforvisualfinish playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 2, 0x1, 0x0, 0x1e, 0x19, 0xffec createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 2, 0x1, 0x20, 0x1e, 0x19, 0xffec createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 2, 0x1, 0x40, 0x1e, 0x19, 0xffec - delay 0x2 + delay 2 createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 2, 0x1, 0x60, 0x1e, 0x19, 0xffec createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 2, 0x1, 0x80, 0x1e, 0x19, 0xffec - delay 0x2 + delay 2 createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 66, 0x1, 0xa0, 0x1e, 0x19, 0xffec createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 66, 0x1, 0xa0, 0x1e, 0x19, 0xffec - delay 0x2 + delay 2 createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 66, 0x1, 0xe0, 0x1e, 0x19, 0xffec - delay 0xF + delay 15 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 2, 0x1, 0x0, 0x1e, 0x19, 0x0 - delay 0x2 + delay 2 createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 2, 0x1, 0x20, 0x1e, 0x19, 0x0 createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 2, 0x1, 0x40, 0x1e, 0x19, 0x0 createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 2, 0x1, 0x60, 0x1e, 0x19, 0x0 - delay 0x2 + delay 2 createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 2, 0x1, 0x80, 0x1e, 0x19, 0x0 - delay 0x2 + delay 2 createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 66, 0x1, 0xa0, 0x1e, 0x19, 0x0 createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 66, 0x1, 0xa0, 0x1e, 0x19, 0x0 - delay 0x2 + delay 2 createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 66, 0x1, 0xe0, 0x1e, 0x19, 0x0 - delay 0x15 + delay 21 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ATTACKER, 0x2, 0x9, 0x0, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, RGB_RED clearmonbg ANIM_ATTACKER fadetobg BG_FIRE waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 0x5, 0xA00, 0x0, 0x1, 0xffff waitbgfadein - delay 0x1E + delay 30 monbg ANIM_ATK_PARTNER - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ADJACENT, 0x2, 0x0, 0x9, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ADJACENT, 2, 0, 9, RGB_RED playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 27, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 27, 1 @@ -6277,13 +6327,13 @@ gBattleAnimMove_SearingShot:: createsprite gSearingShotEruptionImpactTemplate, ANIM_TARGET, 3, 5, 10, 0x1, 0x1E, ANIM_DEF_PARTNER createsprite gSearingShotEruptionImpactTemplate, ANIM_TARGET, 3, -5, -5, 0x1, 0x1E, ANIM_ATK_PARTNER createsprite gSearingShotEruptionImpactTemplate, ANIM_TARGET, 3, 5, 10, 0x1, 0x1E, ANIM_ATK_PARTNER - delay 0x1E + delay 30 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ADJACENT, 0x2, 0x9, 0x0, 0x1F - delay 0x1E + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ADJACENT, 2, 9, 0, RGB_RED + delay 30 call UnsetPsychicBg - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 0, RGB_BLACK clearmonbg ANIM_ATK_PARTNER blendoff end @@ -6303,40 +6353,40 @@ TechnoBlastNormal: loadspritegfx ANIM_TAG_GRAY_SMOKE @dispersal monbg ANIM_ATTACKER setalpha 14, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 0xE, 0x8 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x28, 0x28, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffd8, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x0, 0x28, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x0, 0xffd8, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x28, 0xffec, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x28, 0x14, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffec, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteChargeTemplate, ANIM_ATTACKER, 2, 0x0 call TechnoBlastWhiteCircles call TechnoBlastWhiteCircles createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x28, 0x28, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffd8, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x0, 0x28, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x0, 0xffd8, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x28, 0xffec, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x28, 0x14, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffec, 0x10 - delay 0x2 + delay 2 waitforvisualfinish playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER createsprite gTechnoBlastWhiteBlastTemplate, ANIM_TARGET, 3, 0xa, 0x0, 0x0, 0x0, 0x1e, 0x0 @@ -6352,47 +6402,47 @@ TechnoBlastNormal: playsewithpan SE_M_EMBER, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 createsprite gTechnoBlastWhiteSmokeTemplate, ANIM_TARGET, 2, 0x8, 0x8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0xfff8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteSmokeTemplate, ANIM_TARGET, 2, 0x8, 0xfff8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x1, 0x0 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish blendoff clearmonbg ANIM_ATTACKER end TechnoBlastWhiteCircles: createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0xffd8, 0x14, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0xffec, 0x1e, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x14, 0xffe2, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0xffec, 0xffe2, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x14, 0x1e, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0xffd8, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x28, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x28, 0x28, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffd8, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x0, 0x28, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x0, 0xffd8, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x28, 0xffec, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x28, 0x14, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffec, 0x10 - delay 0x2 + delay 2 return TechnoBlastElectric: @@ -6403,26 +6453,26 @@ TechnoBlastElectric: loadspritegfx ANIM_TAG_GRAY_SMOKE @dispersal monbg ANIM_ATTACKER setalpha 14, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 0xE, 0x8 createsprite gGrowingChargeOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x0 call TechnoBlastCharging1 - delay 0xF + delay 15 call TechnoBlastCharging2 - delay 0xF + delay 15 call TechnoBlastCharging1 - delay 0xF + delay 15 call TechnoBlastCharging2 - delay 0xF + delay 15 call TechnoBlastCharging1 - delay 0xF + delay 15 call TechnoBlastCharging2 - delay 0xF + delay 15 call TechnoBlastCharging1 - delay 0xF + delay 15 call TechnoBlastCharging2 - delay 0xF + delay 15 waitforvisualfinish playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER createsprite gTechnoBlastYellowBlastTemplate, ANIM_TARGET, 3, 0xa, 0x0, 0x0, 0x0, 0x1e, 0x0 @@ -6440,20 +6490,20 @@ TechnoBlastElectric: createsprite gTechnoBlastYellowSmokeTemplate, ANIM_TARGET, 2, 0x8, 0x8, 0x1, 0x0 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0x5, 0x0, 0x5, 0x0 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xfffb, 0xa, 0x5, 0x1 - delay 0x2 + delay 2 createsprite gTechnoBlastYellowSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0xfff8, 0x1, 0x0 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xf, 0x14, 0x5, 0x2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xfff1, 0xfff6, 0x5, 0x0 - delay 0x2 + delay 2 createsprite gTechnoBlastYellowSmokeTemplate, ANIM_TARGET, 2, 0x8, 0xfff8, 0x1, 0x0 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0x19, 0x0, 0x5, 0x1 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x5, 0x2 - delay 0x2 + delay 2 createsprite gTechnoBlastYellowSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x1, 0x0 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0x2, 0xfff8, 0x5, 0x0 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xffec, 0xf, 0x5, 0x1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish blendoff clearmonbg ANIM_ATTACKER @@ -6461,7 +6511,7 @@ TechnoBlastElectric: TechnoBlastCharging1: playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 return @@ -6469,7 +6519,7 @@ TechnoBlastCharging2: playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 return @@ -6482,79 +6532,79 @@ TechnoBlastWater: loadspritegfx ANIM_TAG_BUBBLE @bubbles monbg ANIM_ATTACKER setalpha 14, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB(1, 0, 0) waitforvisualfinish createsprite gTechnoBlastBlueChargeTemplate, ANIM_ATTACKER, 2, 0x0 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x14, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff6, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xf, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x19, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xffec, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xc, 0x0, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x14, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff6, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xf, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x19, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xffec, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xc, 0x0, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x14, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff6, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xf, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x19, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xffec, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xc, 0x0, 0x19, 0x0 waitforvisualfinish @@ -6574,20 +6624,20 @@ TechnoBlastWater: createsprite gTechnoBlastBlueSmokeTemplate, ANIM_TARGET, 2, 0x8, 0x8, 0x1, 0x0 createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x1 createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x1 - delay 0x2 + delay 2 createsprite gTechnoBlastBlueSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0xfff8, 0x1, 0x0 createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x14, 0xa, 0x19, 0x1 createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff6, 0x19, 0x1 - delay 0x2 + delay 2 createsprite gTechnoBlastBlueSmokeTemplate, ANIM_TARGET, 2, 0x8, 0xfff8, 0x1, 0x0 createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xf, 0x19, 0x1 createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x19, 0x14, 0x19, 0x1 - delay 0x2 + delay 2 createsprite gTechnoBlastBlueSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x1, 0x0 createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xffec, 0x14, 0x19, 0x1 createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xc, 0x0, 0x19, 0x1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish blendoff clearmonbg ANIM_ATTACKER @@ -6603,10 +6653,10 @@ TechnoBlastFire: loadspritegfx ANIM_TAG_GRAY_SMOKE @dispersal monbg ANIM_ATTACKER setalpha 14, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish createsprite gTechnoBlastRedChargeTemplate, ANIM_ATTACKER, 2, 0x0 - delay 0x5 + delay 5 call TechnoBlastFireSpiral call TechnoBlastFireSpiral call TechnoBlastFireSpiral @@ -6632,14 +6682,14 @@ TechnoBlastFire: createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, 160, 48, 40 createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, -224, -32, 40 createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, 112, -128, 40 - delay 0x2 + delay 2 createsprite gTechnoBlastRedSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0xfff8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gTechnoBlastRedSmokeTemplate, ANIM_TARGET, 2, 0x8, 0xfff8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gTechnoBlastRedSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x1, 0x0 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish blendoff clearmonbg ANIM_ATTACKER @@ -6647,25 +6697,25 @@ TechnoBlastFire: TechnoBlastFireSpiral: createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x0 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x4 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x8 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0xc playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x10 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x14 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x18 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 return TechnoBlastIce: @@ -6676,22 +6726,22 @@ TechnoBlastIce: loadspritegfx ANIM_TAG_SPARK_2 @blast particles loadspritegfx ANIM_TAG_GRAY_SMOKE @dispersal monbg ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish createsprite gTechnoBlastIceChargeTemplate, ANIM_ATTACKER, 2, 0x0 - delay 0x5 + delay 5 call TechnoBlastIceChargeParticles call TechnoBlastIceChargeParticles call TechnoBlastIceChargeParticles createsprite gTechnoBlastIceCrystalsTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xfff6, 0x0, 0x2 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gTechnoBlastIceCrystalsTemplate, ANIM_ATTACKER, 2, 0xa, 0x14, 0x0, 0x2 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gTechnoBlastIceCrystalsTemplate, ANIM_ATTACKER, 2, 0xfffb, 0xa, 0x0, 0x2 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gTechnoBlastIceCrystalsTemplate, ANIM_ATTACKER, 2, 0x11, 0xfff4, 0x0, 0x2 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET waitforvisualfinish @@ -6710,45 +6760,45 @@ TechnoBlastIce: createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 createsprite gTechnoBlastIceSmokeTemplate, ANIM_TARGET, 2, 0x8, 0x8, 0x1, 0x0 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0xfff6, 0xfff6, 0x0 - delay 0x2 + delay 2 createsprite gTechnoBlastIceSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0xfff8, 0x1, 0x0 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0xa, 0x14, 0x0 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0xfffb, 0xa, 0x0 - delay 0x2 + delay 2 createsprite gTechnoBlastIceSmokeTemplate, ANIM_TARGET, 2, 0x8, 0xfff8, 0x1, 0x0 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0x11, 0xfff4, 0x0 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0xfff1, 0xf, 0x0 - delay 0x2 + delay 2 createsprite gTechnoBlastIceSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x1, 0x0 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x0 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0x14, 0x2, 0x0 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_ATTACKER end TechnoBlastIceChargeParticles: createsprite gTechnoBlastIceCrystalsTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xfff6, 0x0, 0x2 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gTechnoBlastIceCrystalsTemplate, ANIM_ATTACKER, 2, 0xa, 0x14, 0x0, 0x2 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gTechnoBlastIceCrystalsTemplate, ANIM_ATTACKER, 2, 0xfffb, 0xa, 0x0, 0x2 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gTechnoBlastIceCrystalsTemplate, ANIM_ATTACKER, 2, 0x11, 0xfff4, 0x0, 0x2 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gTechnoBlastIceCrystalsTemplate, ANIM_ATTACKER, 2, 0xfff1, 0xf, 0x0, 0x2 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gTechnoBlastIceCrystalsTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gTechnoBlastIceCrystalsTemplate, ANIM_ATTACKER, 2, 0x14, 0x2, 0x0, 0x2 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 return gBattleAnimMove_RelicSong:: @@ -6761,55 +6811,55 @@ gBattleAnimMove_RelicSong:: waitforvisualfinish createvisualtask SoundTask_PlayCryWithEcho, 2, FALSE createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1d, 0xfff4, 0x0 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0xffe3, 0x1 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x7, 0x0, 0xc - delay 0x5 + delay 5 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x6, 0x1, 0xc - delay 0x5 + delay 5 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xc, 0xffe3, 0x1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe3, 0xfff4, 0x0 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x2, 0xc - delay 0x5 + delay 5 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x2, 0x3, 0xc - delay 0x5 + delay 5 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x18, 0xffe8, 0x1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0xffe8, 0x0 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x3, 0x0, 0xc - delay 0x5 + delay 5 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x2, 0x1, 0xc - delay 0x5 + delay 5 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1d, 0xfff4, 0x0 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0xffe3, 0x1 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x5, 0x2, 0xc - delay 0x5 + delay 5 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x6, 0x3, 0xc - delay 0x5 + delay 5 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xc, 0xffe3, 0x1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe3, 0xfff4, 0x0 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x2, 0x0, 0xc - delay 0x5 + delay 5 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x2, 0x1, 0xc - delay 0x5 + delay 5 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x18, 0xffe8, 0x1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0xffe8, 0x0 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x2, 0xc - delay 0x5 + delay 5 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x5, 0x3, 0xc - delay 0x5 + delay 5 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1d, 0xfff4, 0x0 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0xffe3, 0x1 waitforvisualfinish @@ -6817,13 +6867,13 @@ gBattleAnimMove_RelicSong:: playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_DEF_PARTNER, 3, 0, 12, 1 - delay 0x5 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 + delay 5 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - delay 0x5 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 + delay 5 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - delay 0x5 + delay 5 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish @@ -6840,21 +6890,21 @@ gBattleAnimMove_SecretSword:: monbg ANIM_ATTACKER setalpha 12, 8 playsewithpan SE_M_SWORDS_DANCE, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 16, RGB_BLACK createsprite gSwordsDanceBladeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 - delay 0x16 - createvisualtask AnimTask_FlashAnimTagWithColor, 0x2, 0x2715, 0x2, 0x2, 0x7ff2, 0x10, 0x0, 0x0 + delay 22 + createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_SWORD, 2, 2, RGB(18, 31, 31), 16, 0, 0 waitforvisualfinish clearmonbg ANIM_ATTACKER - delay 0x1 + delay 1 monbg ANIM_TARGET playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSecretSwordBladesTemplate, ANIM_TARGET, 1, 0x0, 0xa, 0x0, 0xFF00, 0xA createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 0x28, 0xffe0, 0x0 - delay 0x5 + delay 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x10, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 16, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -6883,9 +6933,9 @@ gBattleAnimMove_Glaciate:: createsprite gGlaciateSmokeTemplate, ANIM_TARGET, 4, 0x0, 0x12, 0x50, 0x0, 0x4b createsprite gGlaciateSmokeTemplate, ANIM_TARGET, 4, 0x0, 0x12, 0x48, 0x1, 0x4b waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_DEF_SIDE, 0x2, 0x0, 0xA, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_DEF_SIDE, 2, 0, 10, RGB_WHITE call IceCrystalEffectLong - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_DEF_SIDE, 0x2, 0xA, 0x0, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_DEF_SIDE, 2, 10, 0, RGB_WHITE waitforvisualfinish blendoff clearmonbg ANIM_DEF_PARTNER @@ -6899,38 +6949,38 @@ gBattleAnimMove_BoltStrike:: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @Electric Circle monbg ANIM_ATTACKER setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0x9, 0x07FE + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 9, RGB(30, 31, 1) createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 64, 0, 2 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0xc + delay 12 createsprite gGrowingShockWaveOrbSpriteTemplate, ANIM_ATTACKER, 2 waitforvisualfinish clearmonbg ANIM_ATTACKER playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 0x8 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 - delay 0xA + delay 10 fadetobg BG_BOLT_STRIKE waitbgfadeout waitforvisualfinish monbg ANIM_TARGET createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 26, 0, 0, 5 - delay 0x6 + delay 6 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x07FE + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB(30, 31, 1) createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 32, 1 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET call ElectricityEffect createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x9, 0x0, 0x07FE + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, RGB(30, 31, 1) playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET call ElectricityEffect waitforvisualfinish clearmonbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x9, 0x0, 0x07FE + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 9, 0, RGB(30, 31, 1) call UnsetPsychicBg - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 0, RGB_BLACK blendoff waitforvisualfinish end @@ -6938,31 +6988,31 @@ gBattleAnimMove_BoltStrike:: gBattleAnimMove_BlueFlare:: loadspritegfx ANIM_TAG_SMALL_EMBER @Fire loadspritegfx ANIM_TAG_METAL_BITS @Blue Flare Colour - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 16, RGB_BLACK loopsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER, 0x7, 0x9 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0xffe0, 0x10 - delay 0x2 + delay 2 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x16, 0xffea, 0x10 - delay 0x2 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x1, 0x0, 0x9, 0x1F + delay 2 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 0, 9, RGB_RED createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x1e, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x14, 0x14, 0x10 - delay 0x2 + delay 2 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0x1c, 0x10 - delay 0x2 + delay 2 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xffed, 0x13, 0x10 - delay 0x2 + delay 2 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xffe5, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xffee, 0xffee, 0x10 - delay 0x2 + delay 2 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0xffe7, 0x10 - delay 0x2 + delay 2 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x11, 0xffef, 0x10 - delay 0x2 + delay 2 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x17, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x10, 0x10, 0x10 waitforvisualfinish playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET @@ -6976,24 +7026,24 @@ gBattleAnimMove_BlueFlare:: playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER call BlueFlareFlameSpreadEffect waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0x0, 0x0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x1, 0x9, 0x0, 0x1f + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 0, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 9, 0, RGB_RED call UnsetPsychicBg waitforvisualfinish end BlueFlareFireSpin: createsprite gBlueFlareFlameSwirlTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, 0x1 - delay 0x2 + delay 2 createsprite gBlueFlareFlameSwirlTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, 0x1 - delay 0x2 + delay 2 createsprite gBlueFlareFlameSwirlTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, 0x1 - delay 0x2 + delay 2 createsprite gBlueFlareFlameSwirlTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, 0x1 - delay 0x2 + delay 2 createsprite gBlueFlareFlameSwirlTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, 0x1 - delay 0x2 + delay 2 createsprite gBlueFlareFlameSwirlTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, 0x1 - delay 0x2 + delay 2 return BlueFlareFlameSpreadEffect: createsprite gBlueFlareBurnTemplate, ANIM_TARGET, 1, 0x0, 0xa, 0x0, 0xb0, 0x28 @@ -7007,11 +7057,11 @@ BlueFlareFlameSpreadEffect: gBattleAnimMove_FieryDance:: loadspritegfx ANIM_TAG_SMALL_EMBER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xc, 0x14be + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB(30, 5, 5) waitforvisualfinish playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 64, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0x0, 0x9, 0x1f + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 0, 9, RGB_RED call FireSpinEffect call FireSpinEffect call FireSpinEffect @@ -7020,8 +7070,8 @@ gBattleAnimMove_FieryDance:: call FireSpinEffect call FireSpinEffect waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0x9, 0x0, 0x1f - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xc, 0x0, 0x14be + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 9, 0, RGB_RED + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB(30, 5, 5) waitforvisualfinish end @@ -7034,15 +7084,15 @@ gBattleAnimMove_FreezeShock:: FreezeShockCharge: createvisualtask AnimTask_HorizontalShake, 5, ANIM_ATTACKER, 2, 16 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x0, 0xf, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 15, RGB_WHITE createsprite gFreezeShockCircleTemplate, ANIM_ATTACKER, 2 @electric circle - delay 0x14 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0xf, 0x0, 0x7fff + delay 20 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 15, 0, RGB_WHITE waitforvisualfinish end FreezeShockAttack: loopsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET, 0x5, 0x5 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK monbg ANIM_TARGET waitforvisualfinish playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_ATTACKER @@ -7057,12 +7107,12 @@ FreezeShockAttack: createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0xe0, 0x28, 0x2 waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 - delay 0xf + delay 15 waitplaysewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET, 0x13 call ElectricityEffect waitforvisualfinish clearmonbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB_BLACK waitforvisualfinish end @@ -7075,23 +7125,23 @@ gBattleAnimMove_IceBurn:: waitforvisualfinish end IceBurnCharge: - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish loopsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET, 0x4, 0x3 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x8, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 8, 0, RGB_BLACK createvisualtask AnimTask_HorizontalShake, 5, ANIM_ATTACKER, 2, 16 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x0, 0xf, 0x7fff - delay 0x14 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0xf, 0x0, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 15, RGB_WHITE + delay 20 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 15, 0, RGB_WHITE waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish end IceBurnUnleash: monbg ANIM_TARGET fadetobg BG_ICE waitbgfadeout - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB_WHITE createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0xfff6, 0xfff6, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET createsprite gIceBurnSmokeTemplate, ANIM_TARGET, 4, 0x0, 0xfff4, 0x68, 0x0, 0x4b @@ -7108,25 +7158,25 @@ IceBurnUnleash: createsprite gIceBurnSmokeTemplate, ANIM_TARGET, 4, 0x0, 0x12, 0x48, 0x1, 0x4b call FireSpreadEffect playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0xa, 0x14, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0xfffb, 0xa, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0x11, 0xfff4, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0xfff1, 0xf, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0x14, 0x2, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x9, 0x0, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 9, 0, RGB_WHITE waitforvisualfinish restorebg clearmonbg ANIM_TARGET @@ -7140,19 +7190,19 @@ gBattleAnimMove_Snarl:: fadetobg BG_DARK waitbgfadeout createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1d, 0xfff4, 0x0 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0xffe3, 0x1 - delay 0x10 + delay 16 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xc, 0xffe3, 0x1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe3, 0xfff4, 0x0 - delay 0x10 + delay 16 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x18, 0xffe8, 0x1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0xffe8, 0x0 @@ -7161,13 +7211,13 @@ gBattleAnimMove_Snarl:: playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_DEF_PARTNER, 3, 0, 12, 1 - delay 0x4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 + delay 4 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - delay 0x4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 + delay 4 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish @@ -7183,17 +7233,17 @@ gBattleAnimMove_IcicleCrash:: monbg ANIM_DEF_PARTNER createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0xfffb, 0x0, 0xfffb, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0x5, 0x0, 0x6, 0x1 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0x13, 0x0, 0xa, 0x01 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0xffe9, 0x0, 0xfff6, 0x1 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 50, 1 - delay 0x2 + delay 2 call LaunchIcicleCrashSpear call LaunchIcicleCrashSpear waitforvisualfinish @@ -7204,28 +7254,28 @@ gBattleAnimMove_IcicleCrash:: LaunchIcicleCrashSpear: createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0xffec, 0x0, 0xfff6, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0x1c, 0x0, 0xa, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0xfff6, 0x0, 0xfffb, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0xa, 0x0, 0x6, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0x18, 0x0, 0xa, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0xffe0, 0x0, 0xfff6, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0xffec, 0x0, 0xfff6, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0x1e, 0x0, 0xa, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x2 + delay 2 return gBattleAnimMove_VCreate:: @@ -7234,13 +7284,13 @@ gBattleAnimMove_VCreate:: loadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE @red color loadspritegfx ANIM_TAG_ECLIPSING_ORB @defense curl animation monbg ANIM_ATK_PARTNER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 @Darken + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK @Darken createsprite gVCreateRedOrbTemplate, ANIM_ATTACKER, 2, 0x0, 0x11, 0x0, 0x1 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gVCreateRedRingTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0x9, 0x1f + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 9, RGB_RED playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET call VCreateFlames call VCreateFlames @@ -7266,21 +7316,21 @@ gBattleAnimMove_VCreate:: waitbgfadein playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -24, 8, 23, 10, 40, 10 - delay 0x23 + delay 35 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 50, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x1f + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB_RED playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x18, 0xffe8, 0x1, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xfff0, 0x10, 0x1, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe8, 0xfff4, 0x1, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x10, 0x10, 0x1, 0x1 waitforvisualfinish @@ -7290,20 +7340,20 @@ gBattleAnimMove_VCreate:: waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x9, 0x0, 0x1f - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x9, 0x0, 0x1f - delay 0x2 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, RGB_RED + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 9, 0, RGB_RED + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER call UnsetPsychicBg - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x0, 0xffff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 0, RGB_WHITEALPHA waitforvisualfinish end VCreateFlames: createsprite gVCreateFlameTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0x16, 0xFFEA, 0x10 @upperright createsprite gVCreateFlameTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0xFFEE, 0xFFEE, 0x10 @upperleft - delay 0x3 + delay 3 return gBattleAnimMove_FusionFlare:: @@ -7313,30 +7363,30 @@ gBattleAnimMove_FusionFlare:: loadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE @flame palette loadspritegfx ANIM_TAG_SMALL_BUBBLES @particles loadspritegfx ANIM_TAG_THIN_RING @ring - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SMALL_BUBBLES, 0x0, 0xD, 0xD, 0x015B @Reddish Orange + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SMALL_BUBBLES, 0, 13, 13, RGB(27, 10, 0) @Reddish Orange monbg ANIM_TARGET setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER call FusionFlareBuff - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_RED createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 0x8, 0x1, 0x0 - delay 0x8 + delay 8 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createsprite gFusionFlareRedBallUpTemplate, ANIM_ATTACKER, 2 - delay 0x20 + delay 32 createsprite gFusionFlareRedBallTemplate, ANIM_ATTACKER, 3, 0x0, 0xffA0, 0x2F createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0x64, 0x64, 0x8, 0x1, 0x14, 0x28, 0x0 createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0x14, 0x64, 0x10, 0x2, 0xa, 0x23, 0x1 createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0xc8, 0x50, 0x8, 0x1, 0x28, 0x14, 0x0 createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0x50, 0x3c, 0xa, 0x3, 0x14, 0x32, 0x0 createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0x8c, 0x64, 0x10, 0x1, 0x14, 0x1e, 0x1 - delay 0x29 + delay 41 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 11, RGB_RED - delay 0x5 + delay 5 createsprite gFusionFlareRedRingTemplate, ANIM_ATTACKER, 3, 0x1, 0x1, 0x1, 0x1, 0x1F, 0x8 createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0x64, 0x64, 0x8, 0x1, 0x14, 0x28, 0x0 createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0x14, 0x64, 0x10, 0x2, 0xa, 0x23, 0x1 @@ -7344,23 +7394,23 @@ gBattleAnimMove_FusionFlare:: createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0x50, 0x3c, 0xa, 0x3, 0x14, 0x32, 0x0 createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0x8c, 0x64, 0x10, 0x1, 0x14, 0x1e, 0x1 createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 2, 16 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET blendoff end FusionFlareBuff: createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return @@ -7368,16 +7418,16 @@ gBattleAnimMove_FusionBolt:: loadspritegfx ANIM_TAG_SPARK loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT loadspritegfx ANIM_TAG_ELECTRICITY - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK, 0x0, 0xC, 0xC, 0x7960 @Blue Electricity - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0x0, 0xC, 0xC, 0x7960 @Blue Electricity - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRICITY, 0x0, 0xC, 0xC, 0x7960 @Blue Electricity - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0x0, 0x0, 0xE, 0x0 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK, 0, 12, 12, RGB(0, 11, 30) @Blue Electricity + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 12, 12, RGB(0, 11, 30) @Blue Electricity + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRICITY, 0, 12, 12, RGB(0, 11, 30) @Blue Electricity + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 14, RGB_BLACK waitforvisualfinish createsprite gVoltTackleOrbSlideSpriteTemplate, ANIM_ATTACKER, 1 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER invisible ANIM_ATTACKER waitforvisualfinish - delay 0x8 + delay 8 createvisualtask AnimTask_VoltTackleBolt, 0x5, 0x0 playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_ATTACKER waitforvisualfinish @@ -7392,21 +7442,21 @@ gBattleAnimMove_FusionBolt:: waitforvisualfinish createsprite gFusionBoltBallTemplate, ANIM_TARGET, 2, 0x10 playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_ATTACKER - delay 0x8 + delay 8 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 10, 0, 18, 1 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x10, 0x10 - delay 0x2 + delay 2 createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0xfff0, 0xfff0 - delay 0x8 + delay 8 createvisualtask AnimTask_VoltTackleAttackerReappear, 0x5 waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 3, 0, 9, 1 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x10, 0x10 - delay 0x2 + delay 2 createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0, 0xfff0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0xE, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 14, 0, RGB_BLACK waitforvisualfinish end @@ -7418,27 +7468,27 @@ gBattleAnimMove_FlyingPress:: playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 waitforvisualfinish - delay 0xF + delay 15 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gBounceBallLandSpriteTemplate, ANIM_TARGET, 3 - delay 0x2 + delay 2 createvisualtask AnimTask_SquishTarget, 0x2 - delay 0x5 + delay 5 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 0, 0x8, 0x8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 0, 0xfff8, 0xfff8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 0, 0x8, 0xfff8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 0, 0xfff8, 0x8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 0, 0x8, 0x8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 0, 0xfff8, 0xfff8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 0, 0x8, 0xfff8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 0, 0xfff8, 0x8, 0x1, 0x0 waitforvisualfinish blendoff @@ -7450,26 +7500,26 @@ gBattleAnimMove_MatBlock:: monbg ANIM_ATK_PARTNER splitbgprio ANIM_ATTACKER setalpha 16, 0 - delay 0x0 + delay 0 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gMatBlockGreenConversionTemplate, ANIM_ATTACKER, 2, 0xfff8, 0x18 createsprite gMatBlockGreenConversionTemplate, ANIM_ATTACKER, 2, 0x8, 0x18 - delay 0x3 + delay 3 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gMatBlockGreenConversionTemplate, ANIM_ATTACKER, 2, 0xfff8, 0x8 createsprite gMatBlockGreenConversionTemplate, ANIM_ATTACKER, 2, 0x8, 0x8 - delay 0x3 + delay 3 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gMatBlockGreenConversionTemplate, ANIM_ATTACKER, 2, 0xfff8, 0xfff8 createsprite gMatBlockGreenConversionTemplate, ANIM_ATTACKER, 2, 0x8, 0xfff8 - delay 0x3 + delay 3 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gMatBlockGreenConversionTemplate, ANIM_ATTACKER, 2, 0xfff8, 0xffe8 createsprite gMatBlockGreenConversionTemplate, ANIM_ATTACKER, 2, 0x8, 0xffe8 - delay 0x14 + delay 20 createvisualtask AnimTask_ConversionAlphaBlend, 0x5 waitforvisualfinish - delay 0x1 + delay 1 clearmonbg ANIM_ATK_PARTNER blendoff end @@ -7482,23 +7532,23 @@ gBattleAnimMove_Belch:: setalpha 12, 8 playsewithpan SE_SUCCESS, SOUND_PAN_ATTACKER createsprite gBelchBerryTemplate, ANIM_ATTACKER, 2, 0x14, 0xfff8, 0xfff8, 0xfff8, 0x14, 0xffe0 - delay 0x13 + delay 19 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 20, 1 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x18, 0xffe8, 0x1, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xfff0, 0x10, 0x1, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe8, 0xfff4, 0x1, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x10, 0x10, 0x1, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe8, 0x18, 0x1, 0x1 waitforvisualfinish @@ -7510,7 +7560,7 @@ gBattleAnimMove_Rototiller:: loadspritegfx ANIM_TAG_MUD_SAND loadspritegfx ANIM_TAG_DIRT_MOUND loadspritegfx ANIM_TAG_GREEN_SPARKLE - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x112C + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB(12, 9, 4) waitforvisualfinish createsprite gDirtMoundSpriteTemplate, ANIM_ATTACKER, 1, 0x0, 0x0, 0xb4 createsprite gDirtMoundSpriteTemplate, ANIM_ATTACKER, 1, 0x0, 0x1, 0xb4 @@ -7521,7 +7571,7 @@ gBattleAnimMove_Rototiller:: call DigThrowDirt call DigThrowDirt waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x112C + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB(12, 9, 4) waitforvisualfinish end @@ -7738,9 +7788,9 @@ gBattleAnimMove_ParabolicCharge:: playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 6, 18, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 5, 4, 0, 16, 16, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_TARGET, 0, 16, 16, RGB_BLACK delay 4 - createvisualtask AnimTask_BlendBattleAnimPal, 5, 4, 0, 0, 0, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_TARGET, 0, 0, 0, RGB_BLACK ParabolicChargeHeal: waitforvisualfinish unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @@ -7769,19 +7819,19 @@ ParabolicChargeDouble: createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 6, 18, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 6, 18, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATK_PARTNER, 0, 6, 18, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 5, 4 | 8 | 0x10, 0, 16, 16, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_ADJACENT, 0, 16, 16, RGB_BLACK delay 4 - createvisualtask AnimTask_BlendBattleAnimPal, 5, 4 | 8 | 0x10, 0, 0, 0, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_ADJACENT, 0, 0, 0, RGB_BLACK goto ParabolicChargeHeal; gBattleAnimMove_ForestsCurse:: loadspritegfx ANIM_TAG_ROOTS @frenzy plant loadspritegfx ANIM_TAG_GHOSTLY_SPIRIT @curse monbg ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK waitforvisualfinish playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x8, 0x02E3 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 8, RGB(3, 23, 0) createsprite gForestsCurseIngrainTemplate, ANIM_ATTACKER, 66, 0x64, 0x64, 0x8, 0x1, 0x14, 0x28, 0x0 createsprite gForestsCurseIngrainTemplate, ANIM_ATTACKER, 66, 0x14, 0x64, 0x10, 0x2, 0xa, 0x23, 0x1 createsprite gForestsCurseIngrainTemplate, ANIM_ATTACKER, 66, 0xc8, 0x50, 0x8, 0x1, 0x28, 0x14, 0x0 @@ -7805,9 +7855,9 @@ gBattleAnimMove_ForestsCurse:: createsprite gCurseGhostSpriteTemplate, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 14, 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x8, 0x0, 0x02E3 - delay 0x3 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 8, 0, RGB(3, 23, 0) + delay 3 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_ATTACKER end @@ -7820,23 +7870,23 @@ gBattleAnimMove_PetalBlizzard:: splitbgprio ANIM_TARGET playsewithpan SE_M_TWISTER, SOUND_PAN_TARGET createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 120, 70, 5, 70, 30 - delay 0x1 + delay 1 createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 0x73, 0x37, 0x6, 0x3c, 0x19 - delay 0x1 + delay 1 createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 0x73, 0x3c, 0x7, 0x3c, 0x1e createsprite gPetalBlizzardTwister1Template, ANIM_TARGET, 2, 0x73, 0x37, 0xA, 0x3c, 0x1e - delay 0x3 + delay 3 createsprite gPetalBlizzardTwister1Template, ANIM_TARGET, 2, 0x64, 0x32, 0x4, 0x32, 0x1A - delay 0x1 + delay 1 createsprite gPetalBlizzardTwister1Template, ANIM_TARGET, 2, 0x69, 0x19, 0x8, 0x3c, 0x14 - delay 0x1 + delay 1 createsprite gPetalBlizzardTwister1Template, ANIM_TARGET, 2, 0x73, 0x28, 0xA, 0x30, 0x1E - delay 0x3 + delay 3 createsprite gPetalBlizzardTwister1Template, ANIM_TARGET, 2, 0x78, 0x1E, 0x6, 0x2d, 0x19 createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 0x73, 0x23, 0xA, 0x3c, 0x1e - delay 0x3 + delay 3 createsprite gPetalBlizzardTwister2Template, ANIM_TARGET, 2, 0x69, 0x14, 0x8, 0x28, 0x0 - delay 0x3 + delay 3 createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 0x14, 0xff, 0xf, 0x20, 0x0 createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 0x6e, 0xA, 0x8, 0x20, 0x14 waitforvisualfinish @@ -7845,13 +7895,13 @@ gBattleAnimMove_PetalBlizzard:: createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_DEF_PARTNER, 3, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATK_PARTNER, 3, 0, 12, 1 - delay 0x4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 + delay 4 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - delay 0x4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 + delay 4 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish @@ -7865,7 +7915,7 @@ gBattleAnimMove_FreezeDry:: loadspritegfx ANIM_TAG_ICE_CRYSTALS loadspritegfx ANIM_TAG_IMPACT createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 7, RGB_BLACK - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 0, 9, RGB(12, 26, 31) + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB(12, 26, 31) delay 20 playsewithpan SE_M_STRING_SHOT, SOUND_PAN_TARGET createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 0 @@ -7887,7 +7937,7 @@ gBattleAnimMove_FreezeDry:: createvisualtask AnimTask_FrozenIceCube, 2 waitplaysewithpan SE_M_HAIL, SOUND_PAN_TARGET, 17 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 9, 0, RGB(12, 26, 31) + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 9, 0, RGB(12, 26, 31) waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 7, 0, RGB_BLACK waitforvisualfinish @@ -7897,17 +7947,17 @@ gBattleAnimMove_FreezeDry:: gBattleAnimMove_DisarmingVoice:: loadspritegfx ANIM_TAG_NOISE_LINE - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x8, 0x6e7d + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 8, RGB(29, 19, 27) waitforvisualfinish createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL call RoarEffect - delay 0xA + delay 10 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 26, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 26, 1 waitforvisualfinish createvisualtask SoundTask_WaitForCry, 0x5 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x8, 0x0, 0x6e7d + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 8, 0, RGB(29, 19, 27) waitforvisualfinish end @@ -7980,53 +8030,53 @@ gBattleAnimMove_CraftyShield:: loadspritegfx ANIM_TAG_CRAFTY_SHIELD monbg ANIM_ATK_PARTNER splitbgprio ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x5, 0x4DBF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 5, RGB(31, 13, 19) setalpha 16, 0 - delay 0x0 + delay 0 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0xffe8, 0xffe8 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0xfff8, 0xffe8 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0x8, 0xffe8 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0x18, 0xffe8 - delay 0x3 + delay 3 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0xffe8, 0xfff8 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0xfff8, 0xfff8 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0x8, 0xfff8 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0x18, 0xfff8 - delay 0x3 + delay 3 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0xffe8, 0x8 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0xfff8, 0x8 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0x8, 0x8 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0x18, 0x8 - delay 0x3 + delay 3 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0xffe8, 0x18 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0xfff8, 0x18 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0x8, 0x18 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0x18, 0x18 - delay 0x14 + delay 20 playsewithpan SE_M_BARRIER, SOUND_PAN_ATTACKER - createvisualtask AnimTask_FlashAnimTagWithColor, 0x2, 0x2722, 0x1, 0x1, 0x37ff, 0xc, 0x0, 0x0 - delay 0x6 + createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_CONVERSION, 1, 1, RGB(31, 31, 13), 12, 0, 0 + delay 6 createvisualtask AnimTask_ConversionAlphaBlend, 0x5 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x5, 0x0, 0x4DBF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 5, 0, RGB(31, 13, 19) waitforvisualfinish - delay 0x1 + delay 1 clearmonbg ANIM_ATK_PARTNER blendoff end @@ -8035,28 +8085,28 @@ gBattleAnimMove_FlowerShield:: loadspritegfx ANIM_TAG_FLOWER loadspritegfx ANIM_TAG_IMPACT setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x8, 0x6e7d + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 8, RGB(29, 19, 27) waitforvisualfinish playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER createsprite gPetalDanceBigFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0x10, 0xffe8, 0x8, 0x64 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0xfff0, 0xffe8, 0x8, 0x64 - delay 0xf + delay 15 createsprite gPetalDanceBigFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0xffe8, 0x8, 0x64 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xffe8, 0x8, 0x64 - delay 0xf + delay 15 createsprite gPetalDanceBigFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0x18, 0xffe8, 0x8, 0x64 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0xffe8, 0xffe8, 0x8, 0x64 - delay 0x1e + delay 30 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0x10, 0xffe8, 0x0, 0x64 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0xfff0, 0xffe8, 0x0, 0x64 - delay 0x1e + delay 30 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0x14, 0xfff0, 0xe, 0x50 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0xffec, 0xfff2, 0x10, 0x50 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x8, 0x0, 0x6e7d + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 8, 0, RGB(29, 19, 27) waitforvisualfinish blendoff end @@ -8148,9 +8198,9 @@ gBattleAnimMove_Electrify:: createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 - delay 0x4 + delay 4 createsprite gElectrifyRingTemplate, ANIM_ATTACKER, 2 - delay 0x4 + delay 4 createsprite gElectrifyRingTemplate, ANIM_ATTACKER, 2 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 @@ -8165,36 +8215,36 @@ gBattleAnimMove_Electrify:: createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0x60, 0x28, 0x1 createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0xa0, 0x28, 0x0 createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0xe0, 0x28, 0x2 - delay 0xA - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0x0, 0xB, 0x039B - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x3, 0x039B - delay 0x4 + delay 10 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 11, RGB(27, 28, 0) + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 3, RGB(27, 28, 0) + delay 4 clearmonbg ANIM_ATTACKER - delay 0x1 + delay 1 monbg ANIM_DEF_PARTNER playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET createsprite gElectrifyYellowRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x0, 0x1f, 0x8 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0x5, 0x0, 0x5, 0x0 - delay 0x1 + delay 1 createsprite gElectrifyYellowRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x0, 0x1f, 0x8 - delay 0x1 + delay 1 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xfffb, 0xa, 0x5, 0x1 createsprite gElectrifyYellowRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x0, 0x1f, 0x8 - delay 0x1 + delay 1 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xf, 0x14, 0x5, 0x2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xfff1, 0xfff6, 0x5, 0x0 - delay 0x2 + delay 2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0x19, 0x0, 0x5, 0x1 - delay 0x2 + delay 2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x5, 0x2 - delay 0x2 + delay 2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0x2, 0xfff8, 0x5, 0x0 - delay 0x2 + delay 2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xffec, 0xf, 0x5, 0x1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0xB, 0x0, 0x039B - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x3, 0x0, 0x039B + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 11, 0, RGB(27, 28, 0) + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 3, 0, RGB(27, 28, 0) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end @@ -8221,7 +8271,7 @@ gBattleAnimMove_PlayRough:: createsprite gPinkHeartSpriteTemplate, ANIM_TARGET, 3, 0x80, 0xfff2 createsprite gPinkHeartSpriteTemplate, ANIM_TARGET, 3, 0x1a0, 0xffda createsprite gPinkHeartSpriteTemplate, ANIM_TARGET, 3, 0xff80, 0xffea - delay 0x0 + delay 0 call SubmissionHit playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x8, 0xa0, 0xffe0 @@ -8230,14 +8280,14 @@ gBattleAnimMove_PlayRough:: createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x8, 0x1a0, 0xffda createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x8, 0xff80, 0xffea createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x8, 0xfe80, 0xffe1 - delay 0x0 + delay 0 call SubmissionHit playsewithpan SE_M_DIVE, SOUND_PAN_TARGET createsprite gPinkHeartSpriteTemplate, ANIM_TARGET, 3, 0xff00, 0xffd6 createsprite gPinkHeartSpriteTemplate, ANIM_TARGET, 3, 0x80, 0xfff2 createsprite gPinkHeartSpriteTemplate, ANIM_TARGET, 3, 0x1a0, 0xffda createsprite gPinkHeartSpriteTemplate, ANIM_TARGET, 3, 0xff80, 0xffea - delay 0x0 + delay 0 playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x8, 0xa0, 0xffe0 createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x8, 0xff00, 0xffd8 @@ -8245,10 +8295,10 @@ gBattleAnimMove_PlayRough:: createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x8, 0x1a0, 0xffda createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x8, 0xff80, 0xffea createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x8, 0xfe80, 0xffe1 - delay 0x0 + delay 0 call SubmissionHit waitforvisualfinish - delay 0xD + delay 13 stopsound clearmonbg 0x3 blendoff @@ -8259,24 +8309,24 @@ gBattleAnimMove_FairyWind:: loadspritegfx ANIM_TAG_PINK_CLOUD monbg ANIM_DEF_PARTNER setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x8, 0x6e7d + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 8, RGB(29, 19, 27) waitforvisualfinish playsewithpan SE_M_GUST, SOUND_PAN_TARGET createsprite gFairyWindCloudTemplate, ANIM_TARGET, 3, 0x14, 0xfff6, 0x14, 0x0, 0x16, 0x14, 0x1 - delay 0x5 + delay 5 createsprite gFairyWindCloudTemplate, ANIM_TARGET, 3, 0x14, 0xfff6, 0x14, 0x5, 0x16, 0xffee, 0x1 - delay 0x5 + delay 5 createsprite gFairyWindCloudTemplate, ANIM_TARGET, 3, 0x14, 0xfff6, 0x14, 0xfff6, 0x16, 0xf, 0x1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 18, 1 - delay 0x5 + delay 5 createsprite gFairyWindCloudTemplate, ANIM_TARGET, 3, 0x14, 0xfff6, 0x14, 0x0, 0x16, 0xffec, 0x1 - delay 0x5 + delay 5 createsprite gFairyWindCloudTemplate, ANIM_TARGET, 3, 0x14, 0xfff6, 0x14, 0x0, 0x16, 0xc, 0x1 - delay 0x5 + delay 5 waitforvisualfinish stopsound playsewithpan SE_M_GUST2, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x8, 0x0, 0x6e7d + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 8, 0, RGB(29, 19, 27) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -8360,7 +8410,7 @@ gBattleAnimMove_FairyLock:: loadspritegfx ANIM_TAG_FAIRY_LOCK_CHAINS setalpha 8, 8 monbg ANIM_ATK_PARTNER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x8, 0x6B1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 8, RGB(31, 24, 26) waitforvisualfinish loopsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET, 0x6, 0x9 createvisualtask AnimTask_VoltTackleBolt, 0x5, 0x7 @@ -8371,7 +8421,7 @@ gBattleAnimMove_FairyLock:: createvisualtask AnimTask_VoltTackleBolt, 0x5, 0x6 createvisualtask AnimTask_VoltTackleBolt, 0x5, 0x35 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x8, 0x0, 0x6B1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 8, 0, RGB(31, 24, 26) waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff @@ -8379,14 +8429,14 @@ gBattleAnimMove_FairyLock:: gBattleAnimMove_KingsShield:: loadspritegfx ANIM_TAG_PROTECT @protect - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PROTECT, 0x0, 0xC, 0xC, 0x318C @Gray + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PROTECT, 0, 12, 12, RGB(12, 12, 12) @Gray goto gBattleAnimMove_Protect gBattleAnimMove_PlayNice:: loadspritegfx ANIM_TAG_RED_HEART loopsewithpan SE_M_SANDSTORM, SOUND_PAN_ATTACKER, 0xc, 0x3 createvisualtask AnimTask_SwayMon, 5, 0, 12, 4096, 4, ANIM_ATTACKER - delay 0xF + delay 15 createsprite gRedHeartProjectileSpriteTemplate, ANIM_TARGET, 3, 0x14, 0xfff8 end @@ -8403,50 +8453,50 @@ gBattleAnimMove_DiamondStorm:: loadspritegfx ANIM_TAG_ICE_CRYSTALS monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xF, 0x1888 - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ICE_CRYSTALS, 0, 0xD, 0xD, 0x7DDE @Pink + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 15, RGB(8, 4, 6) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ICE_CRYSTALS, 0, 13, 13, RGB(30, 14, 31) @Pink waitforvisualfinish panse SE_M_BLIZZARD, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 createsprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0xfff6, 0x0, 0xfff6, 0x48, 0x1 createsprite gDiamondStormBlizzardTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x1 - delay 0x3 + delay 3 createsprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0xfff1, 0x0, 0xfff1, 0x48, 0x1 createsprite gDiamondStormBlizzardTemplate, ANIM_ATTACKER, 40, 0x0, 0xfff6, 0x0, 0xfff6, 0x50, 0x0, 0x0, 0x1 - delay 0x3 + delay 3 createsprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0xfffb, 0x0, 0xfffb, 0x48, 0x1 createsprite gDiamondStormBlizzardTemplate, ANIM_ATTACKER, 40, 0x0, 0xa, 0x0, 0xa, 0x50, 0x0, 0x0, 0x1 - delay 0x3 + delay 3 createsprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0xfff6, 0x0, 0xfff6, 0x48, 0x1 createsprite gDiamondStormBlizzardTemplate, ANIM_ATTACKER, 40, 0x0, 0xffec, 0x0, 0xffec, 0x50, 0x0, 0x0, 0x1 - delay 0x3 + delay 3 createsprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0xffec, 0x0, 0xffec, 0x48, 0x1 createsprite gDiamondStormBlizzardTemplate, ANIM_ATTACKER, 40, 0x0, 0xf, 0x0, 0xf, 0x50, 0x0, 0x0, 0x1 - delay 0x3 + delay 3 createsprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0xfff1, 0x0, 0xfff1, 0x48, 0x1 createsprite gDiamondStormBlizzardTemplate, ANIM_ATTACKER, 40, 0x0, 0xffec, 0x0, 0xffec, 0x50, 0x0, 0x0, 0x1 - delay 0x3 + delay 3 createsprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0xffe7, 0x0, 0xffe7, 0x48, 0x1 createsprite gDiamondStormBlizzardTemplate, ANIM_ATTACKER, 40, 0x0, 0x14, 0x0, 0x14, 0x50, 0x0, 0x0, 0x1 - delay 0x3 + delay 3 playsewithpan SE_M_TWISTER, SOUND_PAN_TARGET createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x78, 0x46, 0x5, 0x46, 0x1e - delay 0x1 + delay 1 createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x73, 0x37, 0x6, 0x3c, 0x19 - delay 0x1 + delay 1 createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x73, 0x3c, 0x7, 0x3c, 0x1e createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x73, 0x37, 0xa, 0x3c, 0x1e - delay 0x3 + delay 3 createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x64, 0x32, 0x4, 0x32, 0x1a - delay 0x1 + delay 1 createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x69, 0x19, 0x8, 0x3c, 0x14 - delay 0x1 + delay 1 createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x73, 0x28, 0xa, 0x30, 0x1e - delay 0x3 + delay 3 createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x78, 0x1e, 0x6, 0x2d, 0x19 createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x73, 0x23, 0xa, 0x3c, 0x1e - delay 0x3 + delay 3 createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x69, 0x14, 0x8, 0x28, 0x0 - delay 0x3 + delay 3 createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x14, 0xff, 0xf, 0x20, 0x0 createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x6e, 0xa, 0x8, 0x20, 0x14 waitforvisualfinish @@ -8455,17 +8505,17 @@ gBattleAnimMove_DiamondStorm:: playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_DEF_PARTNER, 3, 0, 12, 1 - delay 0x4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 + delay 4 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 + delay 4 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xF, 0x0, 0x1888 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 15, 0, RGB(8, 4, 6) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -8473,16 +8523,16 @@ gBattleAnimMove_DiamondStorm:: gBattleAnimMove_SteamEruption:: loadspritegfx ANIM_TAG_STEAM_ERUPTION @Steam Eruption Particle - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x7, 0x043D - delay 0x20 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 7, RGB(29, 1, 1) + delay 32 monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET panse SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 call SteamEruptionBreath call SteamEruptionBreath - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0x0, 0x9, 0x1f + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 0, 9, RGB_RED call SteamEruptionBreath - delay 0x2 + delay 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 21, 1 call SteamEruptionBreath call SteamEruptionBreath @@ -8500,15 +8550,15 @@ gBattleAnimMove_SteamEruption:: call SteamEruptionBreath call SteamEruptionBreath call SteamEruptionBreath - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0x9, 0x0, 0x1f + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 9, 0, RGB_RED waitforvisualfinish clearmonbg ANIM_DEF_PARTNER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x7, 0x0, 0x043D + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 7, 0, RGB(29, 1, 1) waitforvisualfinish end SteamEruptionBreath: createsprite gSteamEruptionBreathTemplate, ANIM_TARGET, 2, 0x0, 0x5, 0x0, 0x5, 0x14 - delay 0x1 + delay 1 return gBattleAnimMove_HyperspaceHole:: @@ -8516,27 +8566,27 @@ gBattleAnimMove_HyperspaceHole:: loadspritegfx ANIM_TAG_WHITE_SHADOW @Destiny Bond loadspritegfx ANIM_TAG_QUICK_GUARD_HAND @Black Colour loadspritegfx ANIM_TAG_POISON_BUBBLE @Poison Colour - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_WHITE waitforvisualfinish playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER invisible ANIM_ATTACKER - delay 0x1 + delay 1 visible ANIM_ATTACKER - delay 0x1 + delay 1 invisible ANIM_ATTACKER - delay 0x1 + delay 1 visible ANIM_ATTACKER - delay 0x1 + delay 1 invisible ANIM_ATTACKER waitsound createvisualtask AnimTask_DestinyBondWhiteShadow, 0x5, 0x0, 0x30 - delay 0x17 + delay 23 createvisualtask AnimTask_IsTargetSameSide, 0x2 createvisualtask AnimTask_SnatchOpposingMonMove, 0x2 - delay 0x19 + delay 25 visible ANIM_ATTACKER invisible ANIM_ATTACKER - delay 0x5 + delay 5 createsprite gHyperspaceHoleImpactTemplate, ANIM_TARGET, 2, 0xfff6, 0xfff6, 0x0 call HyperspaceHoleMovement createsprite gHyperspaceHoleImpactTemplate, ANIM_TARGET, 2, 0xa, 0x14, 0x0 @@ -8547,21 +8597,21 @@ gBattleAnimMove_HyperspaceHole:: call HyperspaceHoleMovement waitforvisualfinish visible ANIM_ATTACKER - delay 0x1 + delay 1 invisible ANIM_ATTACKER - delay 0x1 + delay 1 visible ANIM_ATTACKER - delay 0x1 + delay 1 invisible ANIM_ATTACKER - delay 0x1 + delay 1 visible ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB_WHITE waitforvisualfinish end HyperspaceHoleMovement: playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 15, 1 - delay 0x4 + delay 4 return gBattleAnimMove_WaterShuriken:: @@ -8572,17 +8622,22 @@ gBattleAnimMove_WaterShuriken:: loadspritegfx ANIM_TAG_IMPACT @hydro pump hit monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET - createsoundtask SoundTask_LoopSEAdjustPanning, 0x7, 0x87, 0xffc0, SOUND_PAN_TARGET, 0x5, 0x5, 0x0, 0x5 - createsprite gWaterShurikenStarTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x27 - delay 0x8 - createsprite gWaterShurikenRingTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x28, 0xf - delay 0x5 - createsprite gWaterShurikenRingTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x28, 0xf - delay 0x5 - createsprite gWaterShurikenRingTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x28, 0xf - delay 0xC + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + createsprite gWaterShurikenStarTemplate, ANIM_TARGET, 2, 0, 0, 20 + delay 8 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 8, 1 + playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET + createsprite gWaterShurikenRingTemplate, ANIM_TARGET, 2, 0, 0, 20, 15 + delay 5 + playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET + createsprite gWaterShurikenRingTemplate, ANIM_TARGET, 2, 0, 0, 20, 15 + delay 5 + playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET + createsprite gWaterShurikenRingTemplate, ANIM_TARGET, 2, 0, 0, 20, 15 + delay 12 playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET - createsprite gWaterShurikenImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x2 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 4, 1 + createsprite gWaterShurikenImpactTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 2 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end @@ -8598,19 +8653,19 @@ gBattleAnimMove_MysticalFire:: waitsound blendoff createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x1e, 0xffff, 0x0 - delay 0x1 + delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x1e, 0x0, 0x1 - delay 0x1 + delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x1e, 0xffff, 0xffff - delay 0x1 + delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x1e, 0x2, 0x1 - delay 0x1 + delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x1e, 0x1, 0xffff - delay 0x1 + delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x1e, 0xffff, 0x1 - delay 0x1 + delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x1e, 0x1, 0xfffe - delay 0x1 + delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x1e, 0x3, 0x1 playse 0x8c waitforvisualfinish @@ -8624,29 +8679,29 @@ gBattleAnimMove_SpikyShield:: splitbgprio ANIM_ATTACKER waitplaysewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER, 0x10 createsprite gProtectSpriteTemplate, ANIM_ATTACKER, 2, 0x18, 0x0, 0x5a - delay 0xF + delay 15 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0x0, 0xFFE0, 0x10 - delay 0x2 + delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0x16, 0xFFEA, 0x10 - delay 0x2 + delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0x1E, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0x14, 0x14, 0x10 - delay 0x2 + delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0x0, 0x1C, 0x10 - delay 0x2 + delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0xFFED, 0x13, 0x10 - delay 0x2 + delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0xFFE5, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0xFFEE, 0xFFEE, 0x10 - delay 0x2 + delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0x0, 0xFFE7, 0x10 - delay 0x2 + delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0x11, 0xFFEF, 0x10 - delay 0x2 + delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0x17, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0x10, 0x10, 0x10 waitforvisualfinish clearmonbg ANIM_ATK_PARTNER @@ -8655,9 +8710,9 @@ gBattleAnimMove_SpikyShield:: gBattleAnimMove_AromaticMist:: loadspritegfx ANIM_TAG_PINK_PETAL playsewithpan SE_M_SWEET_SCENT, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x8, 0x6E7D + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 8, RGB(29, 19, 27) createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x64, 0x0, 0x64 - delay 0x19 + delay 25 setpan 0x0 call SweetScentEffect createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x37, 0x0 @@ -8665,7 +8720,7 @@ gBattleAnimMove_AromaticMist:: createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_DEF_SIDE, 1, 5, 5, 13, RGB(31, 21, 21) call SweetScentEffect waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x8, 0x0, 0x6E7D + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 8, 0, RGB(29, 19, 27) waitforvisualfinish end @@ -8678,9 +8733,9 @@ gBattleAnimMove_EerieImpulse:: loadspritegfx ANIM_TAG_GOLD_RING @psybeam ring monbg ANIM_DEF_PARTNER waitplaysewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET 0x13 - delay 0x4 + delay 4 createsprite gEerieImpulseRingTemplate, ANIM_ATTACKER, 0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 - delay 0xB + delay 11 createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 16, 30, 0, 40, 0 createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 16, 30, 0, 40, 1 createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 16, 30, 0, 40, 0 @@ -8698,15 +8753,15 @@ gBattleAnimMove_EerieImpulse:: createsprite gEerieImpulseImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0x1, 0x0, 0x20, 0x10 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0x5, 0x0, 0x5, 0x0 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xfffb, 0xa, 0x5, 0x1 - delay 0x7 + delay 7 createsprite gEerieImpulseImpactTemplate, ANIM_ATTACKER, 2, 0xfff1, 0xa, 0x1, 0x0, 0x20, 0x10 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xf, 0x14, 0x5, 0x2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xfff1, 0xfff6, 0x5, 0x0 - delay 0x7 + delay 7 createsprite gEerieImpulseImpactTemplate, ANIM_ATTACKER, 2, 0xfff1, 0xfff1, 0x1, 0x0, 0x20, 0x10 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0x19, 0x0, 0x5, 0x1 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x5, 0x2 - delay 0x7 + delay 7 createsprite gEerieImpulseImpactTemplate, ANIM_ATTACKER, 2, 0xa, 0xfffb, 0x1, 0x0, 0x20, 0x10 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0x2, 0xfff8, 0x5, 0x0 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xffec, 0xf, 0x5, 0x1 @@ -8719,16 +8774,16 @@ gBattleAnimMove_VenomDrench:: monbg ANIM_DEF_PARTNER createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0xfffb, 0x1, 0xfffb, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0x5, 0x0, 0x6, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0x13, 0x1, 0xa, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0xffe9, 0x2, 0xfff6, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 call AcidDrench call AcidDrench waitforvisualfinish @@ -8737,28 +8792,28 @@ gBattleAnimMove_VenomDrench:: AcidDrench: createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0xffec, 0x0, 0xfff6, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0x1c, 0x1, 0xa, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0xfff6, 0x1, 0xfffb, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0xa, 0x0, 0x6, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0x18, 0x1, 0xa, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0xffe0, 0x2, 0xfff6, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0xffec, 0x0, 0xfff6, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0x1e, 0x2, 0xa, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 return gBattleAnimMove_Powder:: @@ -8775,11 +8830,11 @@ gBattleAnimMove_Powder:: end POWDER_SPORE: createsprite gPowderBlackSporeTemplate, ANIM_ATTACKER, 2, 0x0, 0xffec, 0x55, 0x50, 0x0 - delay 0xc + delay 12 createsprite gPowderBlackSporeTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff6, 0xaa, 0x50, 0x0 - delay 0xc + delay 12 createsprite gPowderBlackSporeTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff1, 0x0, 0x50, 0x0 - delay 0xc + delay 12 return gBattleAnimMove_Geomancy:: @@ -8794,19 +8849,19 @@ gBattleAnimMove_Geomancy:: choosetwoturnanim GeomancyChargeUp GeomancyUnleash GeomancyChargeUp: loadspritegfx ANIM_TAG_FOCUS_ENERGY @endure buff effect - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish playsewithpan SE_M_COSMIC_POWER, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 95, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0x5, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 5, RGB_RED call GeomancyRingBuff - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0x5, 0x2C0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 5, RGB(0, 22, 0) call GeomancyRingBuff - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0x5, 0x7C60 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 5, RGB(0, 3, 31) call GeomancyRingBuff waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x8, 0x0, 0x0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x5, 0x0, 0x7C60 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 8, 0, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 5, 0, RGB(0, 3, 31) waitforvisualfinish blendoff clearmonbg ANIM_ATK_PARTNER @@ -8815,69 +8870,69 @@ GeomancyRingBuff: createsprite gGeomancyRedCellVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, 0x0 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyGreenCellVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, 0x0 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyBlueCellVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, 0x0 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x2 + delay 2 createsprite gGeomancyRedCellVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, 0x0 - delay 0x2 + delay 2 createsprite gGeomancyGreenCellVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, 0x0 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyBlueCellVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, 0x0 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRedCellVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, 0x0 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x2 + delay 2 createsprite gGeomancyGreenCellVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, 0x0 - delay 0x2 + delay 2 createsprite gGeomancyBlueCellVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, 0x0 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRedCellVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, 0x0 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyGreenCellVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, 0x0 - delay 0x2 + delay 2 return GeomancyUnleash: loadspritegfx ANIM_TAG_FIRE_PLUME @dragon rage - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x24CF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB(15, 6, 9) playsewithpan SE_M_MILK_DRINK, SOUND_PAN_ATTACKER createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 waitforvisualfinish playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x10, 0x4D01 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 16, RGB(1, 8, 19) createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 37, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0x5, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 5, RGB_RED createsprite gGeomancyRedCellRaiseTemplate, ANIM_ATTACKER, 2, 0x14, 0x20, 0xffd0, 0x32, 0x1 createsprite gGeomancyGreenCellRaiseTemplate, ANIM_ATTACKER, 2, 0x0, 0x20, 0xffda, 0x19, 0x1 createsprite gGeomancyBlueCellRaiseTemplate, ANIM_ATTACKER, 2, 0x20, 0x20, 0xffe4, 0x28, 0x1 @@ -8887,60 +8942,60 @@ GeomancyUnleash: call GeomancyRageBuff call GeomancyRageBuff waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x4D01 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x5, 0x0, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB(1, 8, 19) + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 5, 0, RGB_RED waitforvisualfinish blendoff clearmonbg ANIM_ATK_PARTNER end GeomancyRageBuff: createsprite gGeomancyYellowRageTemplate, ANIM_TARGET, 66, 0x0, 0x5, 0x0 - delay 0x1 + delay 1 createsprite gGeomancyYellowRageTemplate, ANIM_TARGET, 66, 0x0, 0xfff6, 0xfff1 - delay 0x1 + delay 1 createsprite gGeomancyYellowRageTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x19 - delay 0x1 + delay 1 createsprite gGeomancyYellowRageTemplate, ANIM_TARGET, 66, 0x0, 0xf, 0x5 - delay 0x1 + delay 1 createsprite gGeomancyYellowRageTemplate, ANIM_TARGET, 66, 0x0, 0xffe7, 0x0 - delay 0x1 + delay 1 createsprite gGeomancyYellowRageTemplate, ANIM_TARGET, 2, 0x0, 0x1e, 0x1e - delay 0x1 + delay 1 createsprite gGeomancyYellowRageTemplate, ANIM_TARGET, 2, 0x0, 0xffe5, 0x19 - delay 0x1 + delay 1 createsprite gGeomancyYellowRageTemplate, ANIM_TARGET, 66, 0x0, 0x0, 0x8 - delay 0x1 + delay 1 return gBattleAnimMove_MagneticFlux:: loadspritegfx ANIM_TAG_THIN_RING @uproar loadspritegfx ANIM_TAG_SPARK_2 @ElectricityEffect loadspritegfx ANIM_TAG_SMALL_EMBER @yellow color - createvisualtask AnimTask_BlendBattleAnimPal 10, (F_PAL_TARGET | F_PAL_ATK_SIDE), 2, 0, 9, 0x243B + createvisualtask AnimTask_BlendBattleAnimPal 10, (F_PAL_TARGET | F_PAL_ATK_SIDE), 2, 0, 9, RGB(27, 1, 9) loopsewithpan SE_M_TRI_ATTACK, SOUND_PAN_ATTACKER, 0x12, 0x3 createvisualtask AnimTask_DefenseCurlDeformMon, 0x5 call MagneticFluxSparks1 - delay 0xA + delay 10 call MagneticFluxSparks2 - delay 0xA + delay 10 call MagneticFluxSparks1 - delay 0xA + delay 10 createsprite gMagneticFluxUproarTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 call MagneticFluxSparks2 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal 10, (F_PAL_TARGET | F_PAL_ATK_SIDE), 2, 9, 0, 0x243B + createvisualtask AnimTask_BlendBattleAnimPal 10, (F_PAL_TARGET | F_PAL_ATK_SIDE), 2, 9, 0, RGB(27, 1, 9) waitforvisualfinish end MagneticFluxSparks1: createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 return MagneticFluxSparks2: createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 return @@ -8949,13 +9004,13 @@ gBattleAnimMove_HappyHour:: monbg ANIM_ATTACKER loopsewithpan SE_M_PAY_DAY, SOUND_PAN_TARGET, 0x8, 10 createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0xfffb, 0x0, 0xfffb, 0x1 - delay 0x2 + delay 2 createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0x5, 0x0, 0x6, 0x1 - delay 0x2 + delay 2 createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0x13, 0x0, 0xa, 0x1 - delay 0x2 + delay 2 createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0xffe9, 0x0, 0xfff6, 0x1 - delay 0x2 + delay 2 call CoinShower call CoinShower waitforvisualfinish @@ -8963,21 +9018,21 @@ gBattleAnimMove_HappyHour:: end CoinShower: createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0xffec, 0x0, 0xfff6, 0x1 - delay 0x2 + delay 2 createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0x1c, 0x0, 0xa, 0x1 - delay 0x2 + delay 2 createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0xfff6, 0x0, 0xfffb, 0x1 - delay 0x2 + delay 2 createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0xa, 0x0, 0x6, 0x1 - delay 0x2 + delay 2 createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0x18, 0x0, 0xa, 0x1 - delay 0x2 + delay 2 createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0xffe0, 0x0, 0xfff6, 0x1 - delay 0x2 + delay 2 createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0xffec, 0x0, 0xfff6, 0x1 - delay 0x2 + delay 2 createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0x1e, 0x0, 0xa, 0x1 - delay 0x2 + delay 2 return gBattleAnimMove_ElectricTerrain:: @@ -9019,17 +9074,34 @@ gBattleAnimMove_ElectricTerrain:: gBattleAnimMove_DazzlingGleam:: loadspritegfx ANIM_TAG_SPARKLE_2 loadspritegfx ANIM_TAG_BLUE_STAR - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 13, RGB_WHITE - playsewithpan SE_M_TWISTER, SOUND_PAN_ATTACKER - @call 0x081D56B3 -> middle of GrantingStarsEffect + loadspritegfx ANIM_TAG_IMPACT + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 13, RGB(31, 25, 25) + loopsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER, 16, 3 createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 12, -5, 0, 0, 32, 60 - delay 8 waitforvisualfinish createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 3, 0, 16, RGB_WHITE - delay 0x4 - playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_ATTACKER + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 12, 12, RGB(31, 28, 28) + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 21, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 3, 21, 1 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET + delay 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET + delay 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET + delay 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET + delay 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET + delay 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 13, 0, RGB_WHITE + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 13, 0, RGB(31, 25, 25) waitforvisualfinish clearmonbg 0x0 blendoff @@ -9039,9 +9111,9 @@ gBattleAnimMove_Celebrate:: loadspritegfx ANIM_TAG_ITEM_BAG createsprite gCelebrateBagTemplate, ANIM_ATTACKER, 2, 0x0 playsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER - delay 0x12 + delay 18 playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER - delay 0x47 + delay 71 loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER 0x16 0x3 end @@ -9052,35 +9124,35 @@ gBattleAnimMove_HoldHands:: playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 6, 6, 3 createsprite gHoldHandsHeartTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c - delay 0x8 + delay 8 createsprite gHoldHandsHeartTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c - delay 0x8 + delay 8 createsprite gHoldHandsHeartTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c - delay 0x8 + delay 8 createsprite gHoldHandsHeartTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c - delay 0x8 + delay 8 createsprite gHoldHandsHeartTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c - delay 0x8 + delay 8 createsprite gHoldHandsHeartTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c - delay 0x8 + delay 8 createsprite gHoldHandsHeartTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c - delay 0x8 + delay 8 createsprite gHoldHandsHeartTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c - delay 0x8 + delay 8 createsprite gHoldHandsHeartTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c - delay 0x8 + delay 8 createsprite gHoldHandsHeartTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c waitforvisualfinish createvisualtask AnimTask_HelpingHandAttackerMovement, 0x5 createsprite gHelpingHandClapSpriteTemplate, ANIM_ATTACKER, 40, 0x0 createsprite gHelpingHandClapSpriteTemplate, ANIM_ATTACKER, 40, 0x1 - delay 0x13 + delay 19 playsewithpan SE_M_ENCORE, 0x0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 2, 0, 5, 1 - delay 0xe + delay 14 playsewithpan SE_M_ENCORE, 0x0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 2, 0, 5, 1 - delay 0x14 + delay 20 playsewithpan SE_M_ENCORE, 0x0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 3, 0, 10, 1 createvisualtask AnimTask_BlendMonInAndOut, 2, ANIM_ATK_PARTNER, RGB_YELLOW, 12, 1, 1 @@ -9092,17 +9164,17 @@ gBattleAnimMove_BabyDollEyes:: loadspritegfx ANIM_TAG_OPENING_EYE @eye setalpha 8, 8 monbg ANIM_DEF_PARTNER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0xA, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 10, RGB_WHITE waitforvisualfinish createsprite gOpeningEyeSpriteTemplate, ANIM_ATTACKER, 5, 0x0, 0x0, 0x1, 0x0 - delay 0x20 + delay 32 playsewithpan SE_M_LEER, SOUND_PAN_ATTACKER createvisualtask AnimTask_ScaleMonAndRestore, 5, -5, -5, 10, ANIM_ATTACKER, 1 waitforvisualfinish - delay 0xa + delay 10 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 9, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 9, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0xA, 0x0, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 10, 0, RGB_WHITE waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -9116,10 +9188,10 @@ gBattleAnimMove_Nuzzle:: createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0 createsprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x14 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER - delay 0xf + delay 15 createsprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, 0xffec, 0x14 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER - delay 0xf + delay 15 createsprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, 0x14, 0x14 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER waitforvisualfinish @@ -9161,7 +9233,7 @@ gBattleAnimMove_Infestation:: loadspritegfx ANIM_TAG_SMALL_BUBBLES @circle particles monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x7320 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB(0, 25, 28) createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 79, 1 loopsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER, 0x0, 0x4F call InfestationVortex @@ -9170,23 +9242,23 @@ gBattleAnimMove_Infestation:: call InfestationVortex call InfestationVortex waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0x9, 0x0, 0x7320 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 9, 0, RGB(0, 25, 28) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end InfestationVortex: createsprite gInfestationBubbleTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, 0x1 - delay 0x1 + delay 1 createsprite gInfestationBubbleTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, 0x1 - delay 0x1 + delay 1 createsprite gInfestationBubbleTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, 0x1 - delay 0x1 + delay 1 createsprite gInfestationBubbleTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, 0x1 - delay 0x1 + delay 1 createsprite gInfestationBubbleTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, 0x1 - delay 0x1 + delay 1 createsprite gInfestationBubbleTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, 0x1 - delay 0x1 + delay 1 return gBattleAnimMove_PowerUpPunch:: @@ -9210,14 +9282,14 @@ gBattleAnimMove_OblivionWing:: loadspritegfx ANIM_TAG_HYDRO_PUMP loadspritegfx ANIM_TAG_ROUND_SHADOW loadspritegfx ANIM_TAG_BLUE_STAR - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HYDRO_PUMP, 0x0, 0xC, 0xC, 0x289F @Pinkish Red - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ROUND_SHADOW, 0x0, 0xD, 0xD, 0x289F @Pinkish Red + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HYDRO_PUMP, 0, 12, 12, RGB(31, 4, 10) @Pinkish Red + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ROUND_SHADOW, 0, 13, 13, RGB(31, 4, 10) @Pinkish Red playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xE, 0x0 @Black + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 14, RGB_BLACK @Black waitforvisualfinish - createsoundtask SoundTask_LoopSEAdjustPanning, 0x7, 0xf0, 0xffc0, SOUND_PAN_TARGET, 0x1, 0xf, 0x0, 0x5 + createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_HYPER_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 1, 15, 0, 5 call OblivionWingBeam call OblivionWingBeam createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 40, 1 @@ -9236,14 +9308,14 @@ gBattleAnimMove_OblivionWing:: visible ANIM_ATTACKER call HealingEffect waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xE, 0x0, 0x0 @From black + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 14, 0, RGB_BLACK @From black waitforvisualfinish end OblivionWingBeam: createsprite gOblivionWingBeamTemplate, ANIM_TARGET, 2, 0, -90, 0, 20, 0x15, 0x0 - delay 0x2 + delay 2 createsprite gOblivionWingBeamTemplate, ANIM_TARGET, 2, 0, -90, 0, 20, 0x15, 0x0 - delay 0x2 + delay 2 return gBattleAnimMove_ThousandArrows:: @@ -9256,13 +9328,13 @@ gBattleAnimMove_ThousandArrows:: loadspritegfx ANIM_TAG_NEEDLE @sting monbg ANIM_ATTACKER setalpha 14, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish createsprite gThousandArrowsGreenChargeTemplate, ANIM_ATTACKER, 2, 0x0 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0x18 + delay 24 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0x18 + delay 24 call ThousandArrowsHexes call ThousandArrowsHexes call ThousandArrowsHexes @@ -9271,11 +9343,11 @@ gBattleAnimMove_ThousandArrows:: call ThousandArrowsHexes call ThousandArrowsHexes createsprite gThousandArrowsGreenDischargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x10, 0x10 - delay 0x2 + delay 2 createsprite gThousandArrowsGreenDischargeTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0, 0xfff0 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER waitforvisualfinish - delay 0x30 + delay 48 createvisualtask AnimTask_HorizontalShake, 5, (MAX_BATTLERS_COUNT + 1), 10, 0x32 createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 10, 0x32 call ThousandArrowsDown @@ -9283,7 +9355,7 @@ gBattleAnimMove_ThousandArrows:: call ThousandArrowsDown call ThousandArrowsDown waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0xffff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_WHITEALPHA waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff @@ -9291,45 +9363,45 @@ gBattleAnimMove_ThousandArrows:: ThousandArrowsHexes: createsprite gThousandArrowsGreenHexTemplate, ANIM_TARGET, 2, 0x0, 0xfffc, 0xfff0 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenHexTemplate, ANIM_TARGET, 2, 0x0, 0x100D, 0xfff0 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenHexTemplate, ANIM_TARGET, 2, 0x0, 0x4, 0xfff4 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenHexTemplate, ANIM_TARGET, 2, 0x0, 0xfff0, 0xfff0 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 return ThousandArrowsDown: createsprite gThousandArrowsGreenArrowTemplate, ANIM_TARGET, 2, 0x1, 0xdc, 0x3c playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenArrowTemplate, ANIM_TARGET, 2, 0x1, 0x3c, 0x64 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenArrowTemplate, ANIM_TARGET, 2, 0x1, 0x8c, 0x37 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenArrowTemplate, ANIM_TARGET, 2, 0x1, 0xb4, 0x32 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenArrowTemplate, ANIM_TARGET, 2, 0x1, 0x14, 0x5a playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenArrowTemplate, ANIM_TARGET, 2, 0x1, 0x5a, 0x5a playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenArrowTemplate, ANIM_TARGET, 2, 0x1, 0xa0, 0x3c playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenArrowTemplate, ANIM_TARGET, 2, 0x1, 0x1e, 0x5a playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenArrowTemplate, ANIM_TARGET, 2, 0x1, 0x78, 0x3c playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenArrowTemplate, ANIM_TARGET, 2, 0x1, 0xc8, 0x28 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER return @@ -9341,7 +9413,7 @@ gBattleAnimMove_ThousandWaves:: loadspritegfx ANIM_TAG_IMPACT @pound hits monbg ANIM_ATK_PARTNER setalpha 8, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER createsprite gThousandWavesGreenWheelTemplate, ANIM_ATTACKER, 2, 0x0 @@ -9355,110 +9427,110 @@ gBattleAnimMove_ThousandWaves:: loopsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET, 0x3, 0x15 call ThousandWavesRecover createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x28, 0xfff6, 0xd - delay 0x3 + delay 3 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0xffdd, 0x8, 0xd - delay 0x3 + delay 3 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0xffdd, 0xfff6, 0xd - delay 0x3 + delay 3 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x28, 0x8, 0xd - delay 0x3 + delay 3 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0xf, 0xffd8, 0xd - delay 0x3 + delay 3 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xffe0, 0xd - delay 0x3 + delay 3 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x5, 0x27, 0xd - delay 0x3 + delay 3 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x19, 0xffec, 0xd - delay 0x3 + delay 3 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffec, 0xd - delay 0x3 + delay 3 createvisualtask AnimTask_AttackerStretchAndDisappear, 0x2 playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x5, 0xffd8, 0xd waitforvisualfinish panse SE_M_HYPER_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 - delay 0x4 + delay 4 createvisualtask AnimTask_MoveHeatWaveTargets, 0x5 - delay 0xc + delay 12 monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET createsprite gThousandWavesGreenWaveTemplate, ANIM_ATTACKER, 40, 0xa, 0x900, 0x60, 0x1 - delay 0x2 + delay 2 createsprite gThousandWavesGreenWaveTemplate, ANIM_ATTACKER, 40, 0x5a, 0x800, 0x60, 0x1 - delay 0x2 + delay 2 createsprite gThousandWavesGreenWaveTemplate, ANIM_ATTACKER, 40, 0x32, 0xa00, 0x60, 0x1 - delay 0x2 + delay 2 createsprite gThousandWavesGreenWaveTemplate, ANIM_ATTACKER, 40, 0x14, 0x900, 0x60, 0x1 - delay 0x2 + delay 2 call ThousandWavesRotatingImpact call ThousandWavesRotatingImpact waitforvisualfinish createvisualtask AnimTask_ExtremeSpeedMonReappear, 0x2 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0xffff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_WHITEALPHA waitforvisualfinish blendoff clearmonbg ANIM_DEF_PARTNER end ThousandWavesRecover: createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x28, 0x28, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffd8, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x0, 0x28, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x0, 0xffd8, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x28, 0xffec, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x28, 0x14, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffec, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0xffd8, 0x14, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0xffec, 0x1e, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x14, 0xffe2, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0xffec, 0xffe2, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x14, 0x1e, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0xffd8, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x28, 0x0, 0x10 - delay 0x2 + delay 2 return ThousandWavesRotatingImpact: createsprite gThousandWavesRotatingImpactTemplate, ANIM_TARGET, 2, 0x23, 0x1c, 0x180, 0x32, 0x8, 0x32, 0x1 @1 createsprite gThousandWavesGreenWaveTemplate, ANIM_ATTACKER, 40, 0x46, 0x7c0, 0x60, 0x1 - delay 0x2 + delay 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gThousandWavesPoundImpactTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0x3 createsprite gThousandWavesRotatingImpactTemplate, ANIM_TARGET, 2, 0x23, 0x20, 0xf0, 0x28, 0xb, 0xffd2, 0x1 @2 createsprite gThousandWavesGreenWaveTemplate, ANIM_ATTACKER, 40, 0x0, 0xb00, 0x60, 0x1 - delay 0x2 + delay 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gThousandWavesPoundImpactTemplate, ANIM_TARGET, 2, 0x1, 0x5, 0xfff4, 0x3 createsprite gThousandWavesRotatingImpactTemplate, ANIM_TARGET, 2, 0x23, 0x21, 0x1a0, 0x28, 0x4, 0x2a, 0x1 @3 createsprite gThousandWavesGreenWaveTemplate, ANIM_ATTACKER, 40, 0x3c, 0xa00, 0x60, 0x1 - delay 0x2 + delay 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gThousandWavesPoundImpactTemplate, ANIM_TARGET, 2, 0x1, 0xfffa, 0x9, 0x3 createsprite gThousandWavesRotatingImpactTemplate, ANIM_TARGET, 2, 0x23, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, 0x1 @4 createsprite gThousandWavesGreenWaveTemplate, ANIM_ATTACKER, 40, 0xa, 0x900, 0x60, 0x1 - delay 0x2 + delay 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gThousandWavesPoundImpactTemplate, ANIM_TARGET, 2, 0x1, 0xfffa, 0xfff4, 0x3 createsprite gThousandWavesRotatingImpactTemplate, ANIM_TARGET, 2, 0x23, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, 0x1 @5 createsprite gThousandWavesGreenWaveTemplate, ANIM_ATTACKER, 40, 0x5a, 0x800, 0x60, 0x1 - delay 0x2 + delay 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gThousandWavesPoundImpactTemplate, ANIM_TARGET, 2, 0x1, 0x5, 0x9, 0x3 createsprite gThousandWavesRotatingImpactTemplate, ANIM_TARGET, 2, 0x23, 0x21, 0x1d0, 0x32, 0xa, 0xffce, 0x1 @6 createsprite gThousandWavesGreenWaveTemplate, ANIM_ATTACKER, 40, 0x32, 0xa00, 0x60, 0x1 - delay 0x2 + delay 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gThousandWavesPoundImpactTemplate, ANIM_TARGET, 2, 0x1, 0xfffa, 0x0, 0x3 return @@ -9467,7 +9539,7 @@ gBattleAnimMove_LandsWrath:: loadspritegfx ANIM_TAG_WATER_ORB @whirl motion loadspritegfx ANIM_TAG_SPARK_2 @yellow color monbg ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xE, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 14, RGB_BLACK waitforvisualfinish call LandsWrathVortex call LandsWrathVortex @@ -9483,23 +9555,23 @@ gBattleAnimMove_LandsWrath:: waitbgfadein waitforvisualfinish call UnsetPsychicBg - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 0, RGB_BLACK clearmonbg ANIM_ATTACKER end LandsWrathVortex: playsewithpan SE_M_SACRED_FIRE2 SOUND_PAN_TARGET createsprite gLandsWrathVortexTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, 0x0 - delay 0x2 + delay 2 createsprite gLandsWrathVortexTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, 0x0 - delay 0x2 + delay 2 createsprite gLandsWrathVortexTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, 0x0 - delay 0x2 + delay 2 createsprite gLandsWrathVortexTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, 0x0 - delay 0x2 + delay 2 createsprite gLandsWrathVortexTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, 0x0 - delay 0x2 + delay 2 createsprite gLandsWrathVortexTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, 0x0 - delay 0x2 + delay 2 return gBattleAnimMove_LightOfRuin:: @@ -9509,11 +9581,11 @@ gBattleAnimMove_LightOfRuin:: loadspritegfx ANIM_TAG_ELECTRICITY @discharge loadspritegfx ANIM_TAG_PINK_PETAL @pink color loadspritegfx ANIM_TAG_EXPLOSION @explosion - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 0xC, 0xC, 0x6DDE @Pink + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 12, 12, RGB(30, 14, 27) @Pink waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 20, 0, 2 panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xF, 0x6B1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 15, RGB(31, 24, 26) 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 LightOfRuinBeam @@ -9543,24 +9615,24 @@ gBattleAnimMove_LightOfRuin:: call LightOfRuinBeam call LightOfRuinBeam call LightOfRuinBeam - delay 0x20 + delay 32 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gLightOfRuinPinkDischargeTemplate, ANIM_ATTACKER, 2, 0x1, 0x10, 0x10 - delay 0x2 + delay 2 createsprite gLightOfRuinPinkDischargeTemplate, ANIM_ATTACKER, 2, 0x1, 0xfff0, 0xfff0 - delay 0x5 + delay 5 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 11, 1 createsprite gLightOfRuinPinkExplosionTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x1 - delay 0x10 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x7FFF + delay 16 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB_WHITE waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BATTLERS_2, 0x1, 0x0, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BATTLERS_2, 1, 0, 0, RGB_BLACK waitforvisualfinish end LightOfRuinBeam: createsprite gLightOfRuinPinkOrbsTemplate, ANIM_TARGET, 2 createsprite gLightOfRuinPinkOrbsTemplate, ANIM_TARGET, 2 - delay 0x1 + delay 1 return gBattleAnimMove_OriginPulse:: @@ -9576,9 +9648,9 @@ gBattleAnimMove_OriginPulse:: waitbgfadein createsprite gOriginPulseRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER - delay 0x10 + delay 16 createsprite gOriginPulseRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 - delay 0x10 + delay 16 createsprite gOriginPulseRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 playsewithpan SE_INTRO_BLAST, SOUND_PAN_ATTACKER waitforvisualfinish @@ -9588,12 +9660,12 @@ gBattleAnimMove_OriginPulse:: createsprite gOriginPulseOrbTemplate, ANIM_ATTACKER, 2, 0x80 createsprite gOriginPulseOrbTemplate, ANIM_ATTACKER, 2, 0xaa createsprite gOriginPulseOrbTemplate, ANIM_ATTACKER, 2, 0xd5 - delay 0x35 + delay 53 createsprite gOriginPulseRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 - delay 0x10 + delay 16 createsprite gOriginPulseRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 waitforvisualfinish - delay 0x2F + delay 47 createsprite gOriginPulseOrbInwardTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0xFF90, 0x10 @up createsprite gOriginPulseOrbInwardTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x5F, 0xFF9D, 0x10 @upper right createsprite gOriginPulseOrbInwardTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x73, 0x0, 0x10 @right @@ -9602,7 +9674,7 @@ gBattleAnimMove_OriginPulse:: createsprite gOriginPulseOrbInwardTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xFFB0, 0x43, 0x10 @lower left createsprite gOriginPulseOrbInwardTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xFF60, 0x0, 0x10 @left createsprite gOriginPulseOrbInwardTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xFFAA, 0xFF94, 0x10 @upper left - delay 0x5 + delay 5 createsprite gOriginPulseOrbInwardTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x2D, 0xFF9D, 0x10 @between up and upper right createsprite gOriginPulseOrbInwardTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xDF, 0xFF9D, 0x10 @between right and upper right createsprite gOriginPulseOrbInwardTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x9F, 0x37, 0x10 @between right and lower right @@ -9617,17 +9689,17 @@ gBattleAnimMove_OriginPulse:: createsprite gOriginPulseBasicSplatTemplate, ANIM_TARGET, 3, 0xffb0, 0xfff0, 0x1, 0x1 stopsound playsewithpan SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER - delay 0x5 + delay 5 createsprite gOriginPulseBlueImpactTemplate, ANIM_TARGET, 3, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gOriginPulseBasicSplatTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gOriginPulseBlueImpactTemplate, ANIM_TARGET, 3, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gOriginPulseBasicSplatTemplate, ANIM_TARGET, 3, 0xffc0, 0x14, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gOriginPulseBlueImpactTemplate, ANIM_TARGET, 3, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gOriginPulseBasicSplatTemplate, ANIM_TARGET, 3, 0xffe0, 0x5, 0x1, 0x1 waitsound call UnsetPsychicBg @@ -9638,7 +9710,7 @@ gBattleAnimMove_OriginPulse:: gBattleAnimMove_PrecipiceBlades:: loadspritegfx ANIM_TAG_LARGE_SPIKE loadspritegfx ANIM_TAG_FIRE_PLUME - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_LARGE_SPIKE, 0, 10, 10, 0x159F @Blood orange + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_LARGE_SPIKE, 0, 10, 10, RGB(31, 12, 5) @Blood orange monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET setalpha 12, 8 @@ -9659,21 +9731,21 @@ PrecipiceBladesPlayer: delay 5 createsprite gPrecipiceBladesSpikeTemplate, ANIM_ATTACKER, 5, ANIM_ATTACKER, -10, 17, 120, 0x0 PrecipiceBladesContinue: - delay 0x10 + delay 16 createsprite gPrecipiceBladesPlumeTemplate, ANIM_TARGET, 2, -15, 18, ANIM_TARGET createsprite gPrecipiceBladesPlumeTemplate, ANIM_TARGET, 2, -15, 18, ANIM_DEF_PARTNER - delay 0x20 + delay 32 createsprite gPrecipiceBladesPlumeTemplate, ANIM_TARGET, 2, 15, 18, ANIM_TARGET createsprite gPrecipiceBladesPlumeTemplate, ANIM_TARGET, 2, 15, 18, ANIM_DEF_PARTNER - delay 0x20 + delay 32 stopsound playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET createsprite gPrecipiceBladesLargeSpikeTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, -25, 40, 0x0 createsprite gPrecipiceBladesLargeSpikeTemplate, ANIM_TARGET, 2, ANIM_DEF_PARTNER, 0, -25, 40, 0x0 - delay 0x6 + delay 6 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, -20, 0, 6, 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, ANIM_DEF_PARTNER, -20, 0, 6, 1 - delay 0x22 + delay 34 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x6 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_TARGET, 2, ANIM_DEF_PARTNER, 0x0, 0x6 waitforvisualfinish @@ -9703,13 +9775,13 @@ gBattleAnimMove_DragonAscent:: invisible ANIM_ATTACKER createsprite gDragonAscentFlyUpTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x400, 0x24, 0x15, 0x1, ANIM_ATTACKER waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_ATTACKER | F_PAL_BG | F_PAL_ANIM_1 | F_PAL_ANIM_2), 4, 0, 14, RGB(21, 31, 27) + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_ATTACKER | F_PAL_BG | F_PAL_ANIM_1 | F_PAL_ANIM_2), 4, 0, 14, RGB(21, 31, 27) playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER waitforvisualfinish playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createvisualtask AnimTask_StartSlidingBg, 0x5, -7304, -784, 1, -1 delay 2 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_ATTACKER | F_PAL_BG | F_PAL_ANIM_1 | F_PAL_ANIM_2), 0, 14, 0, RGB(21, 31, 27) + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_ATTACKER | F_PAL_BG | F_PAL_ANIM_1 | F_PAL_ANIM_2), 0, 14, 0, RGB(21, 31, 27) waitforvisualfinish delay 1 monbg ANIM_DEF_PARTNER @@ -9721,7 +9793,7 @@ gBattleAnimMove_DragonAscent:: createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -32, 0, 0, 3 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 6, 0, 12, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_ATTACKER | F_PAL_BG | F_PAL_ANIM_1 | F_PAL_ANIM_2), 2, 16, 0, RGB(26, 31, 0) + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_ATTACKER | F_PAL_BG | F_PAL_ANIM_1 | F_PAL_ANIM_2), 2, 16, 0, RGB(26, 31, 0) waitforvisualfinish delay 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 @@ -9736,19 +9808,19 @@ gBattleAnimMove_HyperspaceFury:: loadspritegfx ANIM_TAG_HOOPA_RING @Hoopa Ring loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_POISON_BUBBLE - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xA, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 10, RGB_BLACK waitforvisualfinish playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER createsprite gHyperspaceFuryRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x0 - delay 0x5 + delay 5 createsprite gHyperspaceFuryRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x4 - delay 0x5 + delay 5 createsprite gHyperspaceFuryRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x8 - delay 0x5 + delay 5 createsprite gHyperspaceFuryRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0xc - delay 0x5 + delay 5 createsprite gHyperspaceFuryRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x10 - delay 0x15 + delay 21 invisible ANIM_ATTACKER waitforvisualfinish fadetobg BG_HYPERSPACE_FURY @@ -9759,42 +9831,42 @@ gBattleAnimMove_HyperspaceFury:: createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 32, 1 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0xffe0, 0x10 call HyperspaceFuryRandomImpact - delay 0x2 + delay 2 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x16, 0xffea, 0x10 call HyperspaceFuryRandomImpact - delay 0x2 + delay 2 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x1e, 0x0, 0x10 call HyperspaceFuryRandomImpact - delay 0x2 + delay 2 createvisualtask AnimTask_IsTargetSameSide, 0x2 createvisualtask AnimTask_SnatchOpposingMonMove, 0x2 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x14, 0x14, 0x10 call HyperspaceFuryRandomImpact - delay 0x2 + delay 2 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0x1c, 0x10 call HyperspaceFuryRandomImpact - delay 0x2 + delay 2 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xffed, 0x13, 0x10 call HyperspaceFuryRandomImpact - delay 0x2 + delay 2 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xffe5, 0x0, 0x10 call HyperspaceFuryRandomImpact - delay 0x2 + delay 2 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xffee, 0xffee, 0x10 call HyperspaceFuryRandomImpact - delay 0x2 + delay 2 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0xffe7, 0x10 call HyperspaceFuryRandomImpact - delay 0x2 + delay 2 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x11, 0xffef, 0x10 call HyperspaceFuryRandomImpact - delay 0x2 + delay 2 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x17, 0x0, 0x10 call HyperspaceFuryRandomImpact - delay 0x2 + delay 2 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x10, 0x10, 0x10 call HyperspaceFuryRandomImpact - delay 0x7 + delay 7 createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL visible ANIM_ATTACKER createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 0, 3, 32, 1 @@ -9803,15 +9875,15 @@ gBattleAnimMove_HyperspaceFury:: call UnsetPsychicBg waitforvisualfinish visible ANIM_ATTACKER - delay 0x1 + delay 1 invisible ANIM_ATTACKER - delay 0x1 + delay 1 visible ANIM_ATTACKER - delay 0x1 + delay 1 invisible ANIM_ATTACKER - delay 0x1 + delay 1 visible ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 0, RGB_BLACK end HyperspaceFuryRandomImpact: createsprite gHyperspaceFuryImpactTemplate, ANIM_TARGET, 3, 0x1, 0x1 @@ -9823,19 +9895,19 @@ gBattleAnimMove_ShoreUp:: loadspritegfx ANIM_TAG_BLUE_STAR @heal2 playsewithpan SE_M_SANDSTORM, 0x0 createvisualtask AnimTask_LoadSandstormBackground, 0x5, 0x0 - delay 0x10 + delay 16 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0xa, 0x900, 0x60, 0x0 - delay 0xa + delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0x5a, 0x800, 0x60, 0x0 - delay 0xa + delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0x32, 0xa00, 0x60, 0x0 - delay 0xa + delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0x14, 0x900, 0x60, 0x0 - delay 0xa + delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0x46, 0x7c0, 0x60, 0x0 - delay 0xa + delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0xb00, 0x60, 0x0 - delay 0xa + delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0x3c, 0xa00, 0x60, 0x0 call HealingEffect waitforvisualfinish @@ -9851,21 +9923,21 @@ gBattleAnimMove_FirstImpression:: createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 createvisualtask AnimTask_StretchTargetUp, 0x3 waitforvisualfinish - delay 0x19 + delay 25 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x6 waitforvisualfinish monbg ANIM_TARGET @This is placed here on purpose (to not ruin astonishs animation) - delay 0x1 + delay 1 createsprite gFirstImpressionPoundTemplate, ANIM_ATTACKER, 4, 0xfff6, 0x0, 0x1, 0x0 loopsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET 0xA 0x2 - delay 0x1 + delay 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -28, 0, 0, 3 waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish - delay 0xa + delay 10 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x6 - delay 0x5 + delay 5 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x6 waitforvisualfinish clearmonbg ANIM_TARGET @@ -9879,19 +9951,19 @@ gBattleAnimMove_BanefulBunker:: waitplaysewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER 0x10 createsprite gProtectSpriteTemplate, ANIM_ATTACKER, 2, 0x18, 0x0, 0x5a createsprite gBanefulBunkerPoisonBubbleTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gBanefulBunkerPoisonBubbleTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gBanefulBunkerPoisonBubbleTemplate, ANIM_ATTACKER, 2, 0x14, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gBanefulBunkerPoisonBubbleTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff6, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gBanefulBunkerPoisonBubbleTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xf, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gBanefulBunkerPoisonBubbleTemplate, ANIM_ATTACKER, 2, 0x19, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gBanefulBunkerPoisonBubbleTemplate, ANIM_ATTACKER, 2, 0xffec, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gBanefulBunkerPoisonBubbleTemplate, ANIM_ATTACKER, 2, 0xc, 0x0, 0x19, 0x0 waitforvisualfinish clearmonbg ANIM_ATK_PARTNER @@ -9952,11 +10024,11 @@ gBattleAnimMove_DarkestLariat:: end DarkestLariatImpact: createsprite gDarkestLariatImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0xfff4, 0x1, 0x1 - delay 0x8 + delay 8 createsprite gDarkestLariatImpactTemplate, ANIM_ATTACKER, 3, 0xfff4, 0x8, 0x1, 0x1 - delay 0x8 + delay 8 createsprite gDarkestLariatImpactTemplate, ANIM_ATTACKER, 3, 0xc, 0x0, 0x1, 0x1 - delay 0x8 + delay 8 return gBattleAnimMove_SparklingAria:: @@ -9965,19 +10037,19 @@ gBattleAnimMove_SparklingAria:: loadspritegfx ANIM_TAG_HYDRO_PUMP @hydro pump monbg ANIM_ATTACKER setalpha 14, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xE, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 14, RGB_BLACK waitforvisualfinish createsprite gSparklingAriaBlueChargeTemplate, ANIM_ATTACKER, 2, 0x0 call SparklingAriaCharge call SparklingAriaCharge call SparklingAriaCharge waitforvisualfinish - delay 0x1E + delay 30 playsewithpan SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER call SparklingAriaRain call SparklingAriaRain waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xE, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 14, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff @@ -9986,69 +10058,69 @@ SparklingAriaRain: createsprite gSparklingAriaRainTemplate, ANIM_TARGET, 2, 0x1, 0xdc, 0x3c createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 - delay 0x2 + delay 2 createsprite gSparklingAriaBubbleRainTemplate, ANIM_TARGET, 2, 0x1, 0x3c, 0x64 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 - delay 0x2 + delay 2 createsprite gSparklingAriaRainTemplate, ANIM_TARGET, 2, 0x1, 0x8c, 0x37 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 - delay 0x2 + delay 2 createsprite gSparklingAriaRainTemplate, ANIM_TARGET, 2, 0x1, 0xb4, 0x32 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 - delay 0x2 + delay 2 createsprite gSparklingAriaRainTemplate, ANIM_TARGET, 2, 0x1, 0x14, 0x5a createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 - delay 0x2 + delay 2 createsprite gSparklingAriaBubbleRainTemplate, ANIM_TARGET, 2, 0x1, 0x5a, 0x5a createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 - delay 0x2 + delay 2 createsprite gSparklingAriaRainTemplate, ANIM_TARGET, 2, 0x1, 0xa0, 0x3c createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 - delay 0x2 + delay 2 createsprite gSparklingAriaRainTemplate, ANIM_TARGET, 2, 0x1, 0x1e, 0x5a createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 - delay 0x2 + delay 2 createsprite gSparklingAriaRainTemplate, ANIM_TARGET, 2, 0x1, 0x78, 0x3c createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 - delay 0x2 + delay 2 createsprite gSparklingAriaBubbleRainTemplate, ANIM_TARGET, 2, 0x1, 0xc8, 0x28 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 - delay 0x2 + delay 2 return SparklingAriaCharge: playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSparklingAriaBubblesTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSparklingAriaBubblesTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSparklingAriaBubblesTemplate, ANIM_ATTACKER, 2, 0x14, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSparklingAriaBubblesTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff6, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSparklingAriaBubblesTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xf, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSparklingAriaBubblesTemplate, ANIM_ATTACKER, 2, 0x19, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSparklingAriaBubblesTemplate, ANIM_ATTACKER, 2, 0xffec, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSparklingAriaBubblesTemplate, ANIM_ATTACKER, 2, 0xc, 0x0, 0x19, 0x0 - delay 0x4 + delay 4 return gBattleAnimMove_IceHammer:: @@ -10057,11 +10129,11 @@ gBattleAnimMove_IceHammer:: loadspritegfx ANIM_TAG_ECLIPSING_ORB @gray color loadspritegfx ANIM_TAG_BLACK_SMOKE @smoke setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET - createsprite gIceHammerPunchStompTemplate, ANIM_TARGET, 3, 0x0, 0xffe0, 0xf - delay 0x13 + createsprite gIceHammerPunchStompTemplate, ANIM_TARGET, 3, 0, -32, 15 + delay 19 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createvisualtask AnimTask_SquishTarget, 0x2 createsprite gIceHammerSmokesTemplate, ANIM_TARGET, 4, 0x0, 0xfff4, 0x68, 0x0, 0x4b @@ -10077,7 +10149,7 @@ gBattleAnimMove_IceHammer:: createsprite gIceHammerSmokesTemplate, ANIM_TARGET, 4, 0x0, 0x12, 0x50, 0x0, 0x4b createsprite gIceHammerSmokesTemplate, ANIM_TARGET, 4, 0x0, 0x12, 0x48, 0x1, 0x4b call IceCrystalEffectShort - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish blendoff end @@ -10097,27 +10169,27 @@ gBattleAnimMove_FloralHealing:: playsewithpan SE_M_TWISTER, 0x0 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x46, 0x1, 0x40 clearmonbg ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x3c, 0x0, 0x40 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x50, 0x1, 0x40 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x3a, 0x0, 0x78 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x64, 0x0, 0x78 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x5a, 0x0, 0x40 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x30, 0x0, 0x40 @2 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x5f, 0x1, 0x50 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x64, 0x0, 0x78 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x4b, 0x1, 0x40 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x55, 0x0, 0x78 - delay 0x2 + delay 2 loopsewithpan SE_M_POISON_POWDER, SOUND_PAN_TARGET, 0x12, 0xa monbg ANIM_TARGET call FloralHealingSpores @@ -10126,7 +10198,7 @@ gBattleAnimMove_FloralHealing:: waitforvisualfinish playsewithpan SE_M_ABSORB_2, SOUND_PAN_ATTACKER createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 16, 0xfff1, 0x0, 0x1, 0x0, 0x20, 0x3c, 0x1 - delay 0x8 + delay 8 createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 16, 0xc, 0xfffb, 0x1, 0x0, 0x20, 0x3c, 0x1 waitforvisualfinish clearmonbg ANIM_TARGET @@ -10134,80 +10206,80 @@ gBattleAnimMove_FloralHealing:: FloralHealingSpores: createsprite gFloralHealingFlowerTemplate, ANIM_ATTACKER, 2, 0x0, 0xffec, 0x55, 0x50, 0x0 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x46, 0x1, 0x40 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x3c, 0x0, 0x40 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x50, 0x1, 0x40 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x3a, 0x0, 0x78 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x64, 0x0, 0x78 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x5a, 0x0, 0x40 - delay 0x3 + delay 3 createsprite gFloralHealingFlowerTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff6, 0xaa, 0x50, 0x0 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x30, 0x0, 0x40 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x5f, 0x1, 0x50 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x64, 0x0, 0x78 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x4b, 0x1, 0x40 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x55, 0x0, 0x78 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x46, 0x1, 0x40 - delay 0x3 + delay 3 createsprite gFloralHealingFlowerTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff1, 0x0, 0x50, 0x0 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x3c, 0x0, 0x40 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x50, 0x1, 0x40 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x3a, 0x0, 0x78 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x64, 0x0, 0x78 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x5a, 0x0, 0x40 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x30, 0x0, 0x40 - delay 0x3 + delay 3 return CIRCLES_LEAVES: createsprite gFloralHealingOrbsTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, 0x0 - delay 0x2 + delay 2 createsprite gFloralHealingLeavesTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, 0x0 - delay 0x2 + delay 2 createsprite gFloralHealingOrbsTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, 0x0 - delay 0x2 + delay 2 createsprite gFloralHealingLeavesTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, 0x0 - delay 0x2 + delay 2 createsprite gFloralHealingOrbsTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, 0x0 - delay 0x2 + delay 2 createsprite gFloralHealingLeavesTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, 0x0 - delay 0x2 + delay 2 return gBattleAnimMove_HighHorsepower:: loadspritegfx ANIM_TAG_IMPACT @hit loadspritegfx ANIM_TAG_HORSESHOE_SIDE_FIST @horseshoe monbg ANIM_TARGET - delay 0x2 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0x10, 0x0 + delay 2 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 16, RGB_BLACK setalpha 12, 8 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET createsprite gHighHorsepowerHorseshoeTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x32 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x7, 0x7fff - delay 0x32 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 7, RGB_WHITE + delay 50 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET call SetImpactBackground createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 22, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x0, 0x7fff - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x1f, 0x3, 0x1, 0x0, 0x8, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 0, RGB_WHITE + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0 waitforvisualfinish clearmonbg ANIM_TARGET blendoff - delay 0x2 + delay 2 restorebg waitbgfadein end @@ -10228,7 +10300,7 @@ gBattleAnimMove_StrengthSap:: createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0xffce, 0xffd8, 0x6 createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0xffd8, 0x28, 0x6 createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0x32, 0xffce, 0x6 - delay 0x2 + delay 2 createsprite gStrengthSapRedSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0xfff8, 0x1, 0x0 createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0x32, 0xffe2, 0x6 createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0x3c, 0xa, 0x6 @@ -10236,7 +10308,7 @@ gBattleAnimMove_StrengthSap:: createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0x0, 0xffd8, 0x6 createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0xffc4, 0x14, 0x6 createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0xffc4, 0xffe2, 0x6 - delay 0x2 + delay 2 createsprite gStrengthSapRedSmokeTemplate, ANIM_TARGET, 2, 0x8, 0xfff8, 0x1, 0x0 createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0xffce, 0x32, 0x6 createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0xffc4, 0x14, 0x6 @@ -10244,36 +10316,36 @@ gBattleAnimMove_StrengthSap:: createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0x14, 0xffc4, 0x6 createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0x32, 0xffce, 0x6 createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0x23, 0x28, 0x6 - delay 0x2 + delay 2 createsprite gStrengthSapRedSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x1, 0x0 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x3, 0x07FD - delay 0x5 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 3, RGB(29, 31, 1) + delay 5 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gStrengthSapAbsorbTemplate, ANIM_ATTACKER, 3, 0x0, 0x5, 0x8, 0x1a - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gStrengthSapAbsorbTemplate, ANIM_ATTACKER, 3, 0xa, 0xfffb, 0xfff8, 0x1a - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gStrengthSapAbsorbTemplate, ANIM_ATTACKER, 3, 0xfffb, 0xf, 0x10, 0x21 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gStrengthSapAbsorbTemplate, ANIM_ATTACKER, 3, 0x0, 0xfff1, 0xfff0, 0x24 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gStrengthSapAbsorbTemplate, ANIM_ATTACKER, 3, 0x0, 0x5, 0x8, 0x1a - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gStrengthSapAbsorbTemplate, ANIM_ATTACKER, 3, 0xa, 0xfffb, 0xfff8, 0x1a - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gStrengthSapAbsorbTemplate, ANIM_ATTACKER, 3, 0xfff6, 0x14, 0x14, 0x27 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gStrengthSapAbsorbTemplate, ANIM_ATTACKER, 3, 0x5, 0xffee, 0xffec, 0x23 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x3, 0x0, 0x07FD + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 3, 0, RGB(29, 31, 1) loopsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER, 0x10, 0x3 call GrantingStarsEffect waitforvisualfinish @@ -10290,7 +10362,7 @@ SolarBladeUnleash: loadspritegfx ANIM_TAG_SUNLIGHT @sun rays monbg ANIM_ATTACKER setalpha 13, 3 - createvisualtask AnimTask_BlendBattleAnimPal 10, (F_PAL_BG | F_PAL_BATTLERS_2), 1, 0, 6, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal 10, (F_PAL_BG | F_PAL_BATTLERS_2), 1, 0, 6, RGB_WHITE waitforvisualfinish playsewithpan SE_M_SWORDS_DANCE, SOUND_PAN_ATTACKER createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 16, 6, 1, 4 @@ -10299,15 +10371,15 @@ SolarBladeUnleash: call SolarBladeSunRays call SolarBladeSunRays call SolarBladeSunRays - createvisualtask AnimTask_FlashAnimTagWithColor, 0x2, 0x2715, 0x2, 0x2, 0x7ff2, 0x10, 0x0, 0x0 + createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_SWORD, 2, 2, RGB(18, 31, 31), 16, 0, 0 waitforvisualfinish call SetSolarBeamBg playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSolarBladeImpactTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1 - delay 0x2 + delay 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 12, 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal 10, (F_PAL_BG | F_PAL_BATTLERS_2), 1, 6, 0, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal 10, (F_PAL_BG | F_PAL_BATTLERS_2), 1, 6, 0, RGB_WHITE waitforvisualfinish call UnsetPsychicBg clearmonbg ANIM_ATTACKER @@ -10315,7 +10387,7 @@ SolarBladeUnleash: end SolarBladeSunRays: createsprite gSunlightRaySpriteTemplate, ANIM_ATTACKER, 40 - delay 0x6 + delay 6 return gBattleAnimMove_Leafage:: @@ -10326,7 +10398,7 @@ gBattleAnimMove_Leafage:: createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 0x14, 0xfff6, 0x14, 0x0, 0x16, 0x14, 0x1 createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 0x14, 0xfff6, 0x14, 0x0, 0x16, 0xffec, 0x1 createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 0x14, 0xfff6, 0x14, 0x0, 0x16, 0x0, 0x1 - delay 0x14 + delay 20 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gLeafageImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x2 waitforvisualfinish @@ -10341,7 +10413,7 @@ gBattleAnimMove_Spotlight:: waitforvisualfinish playsewithpan SE_CONTEST_ICON_CHANGE, SOUND_PAN_ATTACKER createsprite gSpotlightSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xfff8 - delay 0x40 + delay 64 createvisualtask AnimTask_HardwarePaletteFade, 0x2, 0xf8, 0x3, 0xa, 0x0, 0x1 waitforvisualfinish createvisualtask AnimTask_RemoveSpotlight, 0x2 @@ -10350,11 +10422,11 @@ gBattleAnimMove_Spotlight:: gBattleAnimMove_ToxicThread:: loadspritegfx ANIM_TAG_STRING loadspritegfx ANIM_TAG_WEB_THREAD - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_STRING, 0, 0xA, 0xA, 0x6038 @Purple - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_WEB_THREAD, 0x0, 0xA, 0xA, 0x6038 @Purple + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_STRING, 0, 10, 10, RGB(24, 1, 24) @Purple + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_WEB_THREAD, 0, 10, 10, RGB(24, 1, 24) @Purple monbg ANIM_DEF_PARTNER - delay 0x0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x9, 0x0 + delay 0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 9, RGB_BLACK waitforvisualfinish loopsewithpan SE_M_STRING_SHOT, SOUND_PAN_ATTACKER, 0x9, 0x6 call SpiderWebThread @@ -10378,15 +10450,15 @@ gBattleAnimMove_ToxicThread:: waitforvisualfinish playsewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET createsprite gToxicThreadString, ANIM_TARGET, 2, 0x0, 0xa - delay 0x4 + delay 4 createsprite gToxicThreadString, ANIM_TARGET, 2, 0x0, 0xfffe - delay 0x4 + delay 4 createsprite gToxicThreadString, ANIM_TARGET, 2, 0x0, 0x16 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER - delay 0x1 + delay 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x9, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 9, 0, RGB_BLACK end gBattleAnimMove_LaserFocus:: @@ -10394,14 +10466,14 @@ gBattleAnimMove_LaserFocus:: loadspritegfx ANIM_TAG_OPENING_EYE @eyes loadspritegfx ANIM_TAG_LEER @leer monbg ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish createsprite gLaserFocusRedEyesTemplate, ANIM_ATTACKER, 5, 0x0, 0x0, 0x0, 0x0 waitforvisualfinish playsewithpan SE_M_LEER, SOUND_PAN_ATTACKER createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0x18, 0xfff4 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_ATTACKER end @@ -10409,54 +10481,54 @@ gBattleAnimMove_LaserFocus:: gBattleAnimMove_GearUp:: loadspritegfx ANIM_TAG_GEAR loadspritegfx ANIM_TAG_SPARK_2 @sparks - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ATTACKER, 0x2, 0x0, 0x9, 0x039B + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 9, RGB(27, 28, 0) createsprite gGearUpGearsTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 - delay 0xF + delay 15 playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER createsprite gGearUpGearsTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 - delay 0xF + delay 15 playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER createsprite gGearUpGearsTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 - delay 0xF + delay 15 playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER call GearUpSparks call GearUpSparks call GearUpSparks playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ATTACKER, 0x2, 0x9, 0x0, 0x039B + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, RGB(27, 28, 0) waitforvisualfinish end GearUpSparks: playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 - delay 0xF + delay 15 playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 - delay 0xF + delay 15 return gBattleAnimMove_ThroatChop:: @@ -10467,28 +10539,28 @@ gBattleAnimMove_ThroatChop:: splitbgprio ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET - createsprite gKarateChopSpriteTemplate, ANIM_ATTACKER, 2, 0xfff0, 0x0, 0x0, 0x0, 0xa, 0x1, 0x3, 0x0 + createsprite gKarateChopSpriteTemplate, ANIM_ATTACKER, 2, -16, 0, 0, 0, 10, 1, 3, 0 waitforvisualfinish - createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 + createvisualtask AnimTask_InvertScreenColor, 2, 0x101, 0x101, 0x101 createsprite gThroatChopRedImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 - delay 0x3 + delay 3 createsprite gThroatChopRedImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 - delay 0x3 + delay 3 createsprite gThroatChopRedImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 - delay 0x3 + delay 3 createsprite gThroatChopRedImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 - delay 0x3 + delay 3 createsprite gThroatChopRedImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 - delay 0x3 + delay 3 createsprite gThroatChopRedImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 - delay 0x3 + delay 3 createsprite gThroatChopRedImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 - delay 0x3 + delay 3 createsprite gThroatChopRedImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 waitforvisualfinish - createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 + createvisualtask AnimTask_InvertScreenColor, 2, 0x101, 0x101, 0x101 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -10507,18 +10579,18 @@ PollenPuffOpponent: loadspritegfx ANIM_TAG_ORBS @hit monbg ANIM_ATTACKER setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x8, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 8, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0 createsprite gPollenPuffPinkStarTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER - delay 0xD + delay 13 createsprite gPollenPuffPinkStarTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x0 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER - delay 0xD + delay 13 createsprite gPollenPuffPinkStarTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER - delay 0xD + delay 13 createsprite gPollenPuffPinkStarTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x0 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER clearmonbg ANIM_ATTACKER @@ -10533,7 +10605,7 @@ PollenPuffOpponent: createsprite gPollenPuffYellowSparkleTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x10, 0x1e, 0x110, 0x28, 0x0 createsprite gPollenPuffYellowSparkleTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0xB0, 0x28, 0x0 createsprite gPollenPuffYellowSparkleTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0x100, 0x28, 0x0 - delay 0x1 + delay 1 playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET createsprite gPollenPuffSporeTemplate, ANIM_TARGET, 2, 0xa, 0x0, 0x0, 0x0, 0x19, 0xffe0 waitforvisualfinish @@ -10542,15 +10614,15 @@ PollenPuffOpponent: createsprite gPollenPuffImpactTemplates, ANIM_TARGET, 2, 0x1, 0x1, 0x0, 0xFFE0, 0x10 @up createsprite gPollenPuffImpactTemplates, ANIM_TARGET, 2, 0x1, 0x1, 0xFFEE, 0xFFEE, 0x10 @upperleft createsprite gPollenPuffImpactTemplates, ANIM_TARGET, 2, 0x1, 0x1, 0x0, 0x1C, 0x10 @down - delay 0x4 + delay 4 createsprite gPollenPuffImpactTemplates, ANIM_TARGET, 2, 0x1, 0x1, 0xFFE5, 0x0, 0x10 @left createsprite gPollenPuffImpactTemplates, ANIM_TARGET, 2, 0x1, 0x1, 0x14, 0x14, 0x10 @lowerright createsprite gPollenPuffImpactTemplates, ANIM_TARGET, 2, 0x1, 0x1, 0xFFED, 0x13, 0x10 @lowerleft - delay 0x4 + delay 4 createsprite gPollenPuffImpactTemplates, ANIM_TARGET, 2, 0x1, 0x1, 0x1E, 0x0, 0x10 @right createsprite gPollenPuffImpactTemplates, ANIM_TARGET, 2, 0x1, 0x1, 0x16, 0xFFEA, 0x10 @upperright waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x8, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 8, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -10563,18 +10635,18 @@ PollenPuffAlly: loadspritegfx ANIM_TAG_SPORE @ball monbg ANIM_ATTACKER setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x8, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 8, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0 createsprite gPollenPuffPinkStarTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER - delay 0xD + delay 13 createsprite gPollenPuffPinkStarTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x0 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER - delay 0xD + delay 13 createsprite gPollenPuffPinkStarTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER - delay 0xD + delay 13 createsprite gPollenPuffPinkStarTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x0 playsewithpan SE_M_ABSORB_2, SOUND_PAN_ATTACKER clearmonbg ANIM_ATTACKER @@ -10590,21 +10662,21 @@ PollenPuffAlly: createsprite gPollenPuffYellowSparkleTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x10, 0x1e, 0x120, 0x28, 0x0 createsprite gPollenPuffYellowSparkleTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0x90, 0x28, 0x0 createsprite gPollenPuffYellowSparkleTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0x110, 0x28, 0x0 - delay 0x1 + delay 1 createsprite gPollenPuffSporeTemplate, ANIM_TARGET, 2, 0xa, 0x0, 0x0, 0x0, 0x19, 0xffe0 waitforvisualfinish unloadspritegfx ANIM_TAG_SPARKLE_2 @stars loadspritegfx ANIM_TAG_BLUE_STAR @heal playsewithpan SE_M_ABSORB_2, SOUND_PAN_ATTACKER createsprite gPollenPuffHealTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0x1, 0x0 - delay 0x7 + delay 7 createsprite gPollenPuffHealTemplate, ANIM_ATTACKER, 2, 0xfff1, 0xa, 0x1, 0x0 - delay 0x7 + delay 7 createsprite gPollenPuffHealTemplate, ANIM_ATTACKER, 2, 0xfff1, 0xfff1, 0x1, 0x0 - delay 0x7 + delay 7 createsprite gPollenPuffHealTemplate, ANIM_ATTACKER, 2, 0xa, 0xfffb, 0x1, 0x0 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x8, 0x1, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 8, 1, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -10619,14 +10691,14 @@ gBattleAnimMove_AnchorShot:: waitforvisualfinish createsprite gAnchorShotAnchorTemplate, ANIM_ATTACKER, 3, 0x0, 0xffe0, 0xf createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 - delay 0x25 + delay 37 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 waitforvisualfinish loopsewithpan SE_SHINY, SOUND_PAN_ATTACKER 0x1c 0x2 createsprite gAnchorShotChainTemplate, ANIM_TARGET, 2, 0xfff0, 0xfff0 - delay 0x4 + delay 4 createsprite gAnchorShotChainTemplate, ANIM_TARGET, 2, 0xfff0, 0x0 - delay 0x4 + delay 4 createsprite gAnchorShotChainTemplate, ANIM_TARGET, 2, 0xfff0, 0x10 waitforvisualfinish clearmonbg ANIM_TARGET @@ -10681,18 +10753,18 @@ gBattleAnimMove_Lunge:: createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 3, 0, 240, 0 loopsewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER, 0xe, 0xa createsprite gLungeGreenChargeTemplate, ANIM_ATTACKER, 2 - delay 0x6e - delay 0x3e + delay 110 + delay 62 playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER - delay 0x15 + delay 21 clearmonbg ANIM_ATK_PARTNER invisible ANIM_ATTACKER waitforvisualfinish playsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER createsprite gLungeGreenBubbleTemplate, ANIM_TARGET, 2, 0xa, 0x0, 0x0, 0x0, 0x19, 0xffe0 - delay 0xF + delay 15 monbg ANIM_DEF_PARTNER - delay 0x1 + delay 1 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0x46, 0x0, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0x28, 0x28, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0xa, 0xffc4, 0x6 @@ -10700,14 +10772,14 @@ gBattleAnimMove_Lunge:: createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0xffd8, 0x28, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0x32, 0xffce, 0x6 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 11, 1 - delay 0x2 + delay 2 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0x32, 0xffe2, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0x3c, 0xa, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x3c, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0xffd8, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0xffc4, 0x14, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0xffc4, 0xffe2, 0x6 - delay 0x2 + delay 2 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0xffce, 0x32, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0xffc4, 0x14, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0xffd8, 0xffd8, 0x6 @@ -10728,38 +10800,38 @@ gBattleAnimMove_FireLash:: splitbgprio_foes ANIM_TARGET createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x0 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x4 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x8 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0xc playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x10 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x14 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x18 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 24, 0, 0, 6 - delay 0x4 + delay 4 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 8, 1 createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET loadspritegfx ANIM_TAG_SLASH createsprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, 0x1, 0xfff8, 0x0 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x8, 0x0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 18, 1 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET - delay 0x7 + delay 7 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x9 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -10773,21 +10845,21 @@ gBattleAnimMove_PowerTrip:: monbg ANIM_DEF_PARTNER playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call PowerTripBuffUp - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_BLACK createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call PowerTripBuffUp - delay 0x8 + delay 8 call PowerTripBuffUp waitforvisualfinish playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createsprite gPowerTripImpactTemplate, ANIM_ATTACKER, 2, 0xFFF5, 0xA, 0x1, 0x2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x5 + delay 5 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createsprite gPowerTripImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0xFFF5, 0x1, 0x2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x5 + delay 5 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createsprite gPowerTripImpactTemplate, ANIM_ATTACKER, 2, 0xA, 0x0, 0x1, 0x2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 @@ -10796,13 +10868,13 @@ gBattleAnimMove_PowerTrip:: end PowerTripBuffUp: createsprite gPowerTripFocusEnergyTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gPowerTripFocusEnergyTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gPowerTripFocusEnergyTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gPowerTripFocusEnergyTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gPowerTripFocusEnergyTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return @@ -10817,49 +10889,49 @@ gBattleAnimMove_BurnUp:: waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 0x5, 0xA00, 0x0, 0x1, 0xffff waitbgfadein - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x5, 0x1c + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 5, RGB(28, 0, 0) waitforvisualfinish createvisualtask AnimTask_AllocBackupPalBuffer, 0x5 waitforvisualfinish createvisualtask AnimTask_CopyPalUnfadedToBackup, 0x5, 0x0, 0x1 - delay 0x1 + delay 1 createvisualtask AnimTask_CopyPalFadedToUnfaded, 0x5, 0x0 - delay 0x1 + delay 1 loopsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER 0x9 0x2 createvisualtask AnimTask_CopyPalUnfadedToBackup, 0x5, 0x1, 0x0 - delay 0x1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x0, 0xd, 0x1c + delay 1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 13, RGB(28, 0, 0) createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 2, 0, 15, 1 waitforvisualfinish - delay 0x1E - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 + delay 30 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 waitforvisualfinish playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createsprite gBurnUpRedYawnTemplate, ANIM_TARGET, 0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x0 - delay 0x1 + delay 1 createvisualtask AnimTask_CopyPalFadedToUnfaded, 0x5, 0x1 - delay 0x1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0x0, 0xd, 0x4a52 + delay 1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 0, 13, RGB(18, 18, 18) createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 3, 0, 15, 1 - delay 0xF - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0x0, 0xC, 0x1C - delay 0x1 + delay 15 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 12, RGB(28, 0, 0) + delay 1 createvisualtask AnimTask_CopyPalUnfadedFromBackup, 0x5, 0x0, 0x1 - delay 0x1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x5, 0x0, 0x1c - delay 0x1 + delay 1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 5, 0, RGB(28, 0, 0) + delay 1 createvisualtask AnimTask_CopyPalUnfadedFromBackup, 0x5, 0x1, 0x0 - delay 0x1 + delay 1 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 2, 0, 15, 1 call FireSpreadEffect waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0xd, 0x0, 0x4a52 - delay 0x1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 13, 0, RGB(18, 18, 18) + delay 1 createvisualtask AnimTask_FreeBackupPalBuffer, 0x5 - delay 0x1 + delay 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0xC, 0x0, 0x1C + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 12, 0, RGB(28, 0, 0) waitforvisualfinish call UnsetPsychicBg clearmonbg ANIM_DEF_PARTNER @@ -10872,9 +10944,9 @@ gBattleAnimMove_SpeedSwap:: loadspritegfx ANIM_TAG_ORBS @circle monbg ANIM_TARGET panse SE_M_MINIMIZE, SOUND_PAN_TARGET, SOUND_PAN_ATTACKER, 0xfd, 0x0 - delay 0xf + delay 15 createsprite gSpeedSwapCircleTemplate, ANIM_TARGET, 2, 0xfff4, 0x18 - delay 0x5 + delay 5 createsprite gSpeedSwapRingTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x1, 0x0 createsprite gSpeedSwapOrbTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0xFFE0, 0x10 createsprite gSpeedSwapOrbTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x16, 0xFFEA, 0x10 @@ -10911,7 +10983,7 @@ gBattleAnimMove_SmartStrike:: createsprite gLockOnMoveTargetSpriteTemplate, ANIM_ATTACKER, 40, 0x2 createsprite gLockOnMoveTargetSpriteTemplate, ANIM_ATTACKER, 40, 0x3 createsprite gLockOnMoveTargetSpriteTemplate, ANIM_ATTACKER, 40, 0x4 - delay 0x78 + delay 120 setarg 0x7 0xffff waitforvisualfinish monbg ANIM_DEF_PARTNER @@ -10919,7 +10991,6 @@ gBattleAnimMove_SmartStrike:: setalpha 12, 8 call SonicBoomProjectile createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 10, 1 - loadspritegfx ANIM_TAG_FLASH_CANNON_BALL createsprite gSmartStrikeImpactTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x8, 0x1, 0x0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gSmartStrikeGemTemplate, ANIM_TARGET, 2, 0x1, 0x1, 0x0, 0xffe8, 0xa @@ -10934,7 +11005,6 @@ gBattleAnimMove_SmartStrike:: clearmonbg ANIM_DEF_PARTNER blendoff waitforvisualfinish - clearmonbg ANIM_ATTACKER blendoff waitforvisualfinish end @@ -10948,7 +11018,7 @@ gBattleAnimMove_Purify:: setalpha 12, 8 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER createsprite gPurifyWhiteBallTemplate, ANIM_ATTACKER, 2, 0x14, 0xfff8, 0xfff8, 0xfff8, 0x14, 0xffe0 - delay 0x13 + delay 19 playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET createsprite gPurifySmokeTemplate, ANIM_TARGET, 4, 0x0, 0xfff4, 0x68, 0x0, 0x4b createsprite gPurifySmokeTemplate, ANIM_TARGET, 4, 0x0, 0xfff4, 0x48, 0x1, 0x4b @@ -10974,25 +11044,25 @@ gBattleAnimMove_RevelationDance:: loadspritegfx ANIM_TAG_AIR_WAVE @sonicboom loadspritegfx ANIM_TAG_THIN_RING @ring monbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xF, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 15, RGB_BLACK waitforvisualfinish playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0 createsprite gRevelationDanceYellowOrbsTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0x10, 0xffe8, 0x8, 0x64 createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0xfff0, 0xffe8, 0x8, 0x64 - delay 0xf + delay 15 createsprite gRevelationDanceYellowOrbsTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0x20, 0xffe8, 0x8, 0x64 createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xffe8, 0x8, 0x64 - delay 0xf + delay 15 createsprite gRevelationDanceYellowOrbsTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0x18, 0xffe8, 0x8, 0x64 createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0xffe8, 0xffe8, 0x8, 0x64 - delay 0x1e + delay 30 createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0x10, 0xffe8, 0x0, 0x64 createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0xfff0, 0xffe8, 0x0, 0x64 - delay 0x1e + delay 30 createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0 createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0x14, 0xfff0, 0xe, 0x50 createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0xffec, 0xfff2, 0x10, 0x50 @@ -11017,7 +11087,7 @@ gBattleAnimMove_RevelationDance:: createsprite gRevelationDanceYellowDispersalTemplate, ANIM_TARGET, 1, 0x0, 0xa, 0x70, 0xff80, 0x28 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xF, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 15, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET end @@ -11039,102 +11109,102 @@ gBattleAnimMove_CoreEnforcer:: createsprite gCoreEnforcerCircleChargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 createsprite gCoreEnforcerBlueRingTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 - delay 0x0 + delay 0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 waitforvisualfinish createsprite gCoreEnforcerCircleChargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 - delay 0x0 + delay 0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 waitforvisualfinish createsprite gCoreEnforcerCircleChargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 createsprite gCoreEnforcerYellowRingTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 - delay 0x0 + delay 0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 waitforvisualfinish createsprite gCoreEnforcerCircleChargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 - delay 0x0 + delay 0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 waitforvisualfinish createsprite gCoreEnforcerCircleChargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 createsprite gCoreEnforcerGreenRingTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 - delay 0x0 + delay 0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 waitforvisualfinish createsprite gCoreEnforcerCircleChargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 - delay 0x0 + delay 0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 - delay 0x5 + delay 5 createsprite gCoreEnforcerCircleChargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 waitforvisualfinish unloadspritegfx ANIM_TAG_SPARK_2 @yellow color @@ -11148,10 +11218,10 @@ gBattleAnimMove_CoreEnforcer:: loadspritegfx ANIM_TAG_SNORE_Z loadspritegfx ANIM_TAG_EXPLOSION clearmonbg ANIM_ATTACKER - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 0xD, 0xD, 0x079F @Yellow - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ORBS, 0, 0xA, 0xA, 0x7501 @Royal Blue - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SNORE_Z, 0, 0xA, 0xA, 0x0688 @Green - delay 0x10 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 13, 13, RGB(31, 28, 1) @Yellow + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ORBS, 0, 10, 10, RGB(1, 8, 29) @Royal Blue + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SNORE_Z, 0, 10, 10, RGB(8, 20, 1) @Green + delay 16 monbg ANIM_TARGET createvisualtask AnimTask_CreateSmallSolarBeamOrbs, 0x5 panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 @@ -11159,79 +11229,79 @@ gBattleAnimMove_CoreEnforcer:: createvisualtask AnimTask_ShakeMon2, 5, ANIM_DEF_PARTNER, 2, 0, 65, 1 createsprite gCoreEnforcerBeamTemplate, ANIM_TARGET, 3, 0xf, 0x0, 0x14, 0x0 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xfff5, 0xffe2, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xfffa, 0xffe2, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xffff, 0xffe2, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0x5, 0xffe2, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerBeamTemplate, ANIM_TARGET, 3, 0xf, 0x0, 0x14, 0x1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xA, 0xffe2, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xF, 0xffe2, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0x14, 0xffe2, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xF, 0xffe7, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerBeamTemplate, ANIM_TARGET, 3, 0xf, 0x0, 0x14, 0x2 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xC, 0xffea, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0x9, 0xffed, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0x6, 0xfff0, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0x3, 0xfff3, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerBeamTemplate, ANIM_TARGET, 3, 0xf, 0x0, 0x14, 0x3 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0x0, 0xfff6, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xfffc, 0xfff9, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xfff9, 0xfffc, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xfff6, 0xffff, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerBeamTemplate, ANIM_TARGET, 3, 0xf, 0x0, 0x14, 0x4 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xfff3, 0x3, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xfff8, 0x3, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xfffd, 0x3, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0x2, 0x3, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerBeamTemplate, ANIM_TARGET, 3, 0xf, 0x0, 0x14, 0x5 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0x7, 0x3, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xC, 0x3, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0x11, 0x3, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0x16, 0x3, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerBeamTemplate, ANIM_TARGET, 3, 0xf, 0x0, 0x14, 0x6 - delay 0x7 + delay 7 createsprite gCoreEnforcerSnoreTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 30, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 2, 0, 30, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 2, 0, 30, 1 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gCoreEnforcerExplosionTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gCoreEnforcerExplosionTemplate, ANIM_ATTACKER, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gCoreEnforcerExplosionTemplate, ANIM_ATTACKER, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gCoreEnforcerExplosionTemplate, ANIM_ATTACKER, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gCoreEnforcerExplosionTemplate, ANIM_ATTACKER, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gCoreEnforcerExplosionTemplate, ANIM_ATTACKER, 3, 0xffe8, 0x18, ANIM_TARGET, 0x1 waitforvisualfinish @@ -11248,7 +11318,7 @@ gBattleAnimMove_TropKick:: createsprite gTropKickGreenFootTemplate, ANIM_ATTACKER, 2, 0xfff0, 0x8, 0x0, 0x0, 0xa, 0x1, 0x1, 0x1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET - delay 0xA + delay 10 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER createsprite gTropKickLeavesTemplate, ANIM_TARGET, 1, 0, 10, 192, 176, 40 createsprite gTropKickLeavesTemplate, ANIM_TARGET, 1, 0, 10, -192, 240, 40 @@ -11266,26 +11336,26 @@ gBattleAnimMove_Instruct:: loadspritegfx ANIM_TAG_SPOTLIGHT @spotlight setalpha 12, 8 createsprite gMetronomeFingerSpriteTemplate, ANIM_ATTACKER, 12, 0x0 - delay 0x18 + delay 24 loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 0x16, 0x3 waitforvisualfinish createvisualtask AnimTask_HardwarePaletteFade, 0x2, 0xf8, 0x3, 0x0, 0xa, 0x0 waitforvisualfinish createsprite gSpotlightSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xfff8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x8, 0x7DB9 - delay 0x4 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 8, RGB(25, 13, 31) + delay 4 monbg ANIM_TARGET createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(27, 27, 0), 12, 1, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 41, 1 playsewithpan SE_M_BIND, SOUND_PAN_TARGET - delay 0x1A + delay 26 createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(27, 27, 0), 12, 1, 1 playsewithpan SE_M_BIND, SOUND_PAN_TARGET - delay 0x1A + delay 26 createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(27, 27, 0), 12, 1, 1 playsewithpan SE_M_BIND, SOUND_PAN_TARGET - delay 0x1D - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x8, 0x0, 0x7DB9 + delay 29 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 8, 0, RGB(25, 13, 31) waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -11294,21 +11364,21 @@ gBattleAnimMove_Instruct:: gBattleAnimGeneral_BeakBlastSetUp:: loadspritegfx ANIM_TAG_SMALL_EMBER @Fire playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER - delay 0x3 + delay 3 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_RED createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x0 waitforvisualfinish end gBattleAnimMove_BeakBlast:: loadspritegfx ANIM_TAG_IMPACT - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ATTACKER, 0x2, 0x0, 0x9, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 9, RGB_RED waitforvisualfinish createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0x0 playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER waitforvisualfinish - delay 0x2 + delay 2 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0x1 - delay 0x2 + delay 2 loopsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET 0x4 0x8 createvisualtask AnimTask_DrillPeckHitSplats, 0x5 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 18, 1 @@ -11317,7 +11387,7 @@ gBattleAnimMove_BeakBlast:: waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x6 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ATTACKER, 0x2, 0x9, 0x0, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, RGB_RED waitforvisualfinish end @@ -11326,46 +11396,46 @@ gBattleAnimMove_ClangingScales:: loadspritegfx ANIM_TAG_POISON_BUBBLE @purple color monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x2002 - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_METAL_SOUND_WAVES, 0, 10, 10, 0x642D + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB(2, 0, 8) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_METAL_SOUND_WAVES, 0, 10, 10, RGB(13, 1, 25) waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 2, 0, 8, 1 call ClangingScalesMetalSound call ClangingScalesMetalSound call ClangingScalesMetalSound call ClangingScalesMetalSound - delay 0x5 + delay 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 3, 15, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER - delay 0x0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x2002 + delay 0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB(2, 0, 8) waitforvisualfinish end ClangingScalesMetalSound: panse SE_M_SCREECH, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 createsprite gClangingScalesPurpleMetalSoundTemplate, ANIM_TARGET, 2, 0x10, 0x0, 0x0, 0x0, 0x1e, 0x0, ANIM_TARGET createsprite gClangingScalesPurpleMetalSoundTemplate, ANIM_TARGET, 2, 0x10, 0x0, 0x0, 0x0, 0x1e, 0x0, ANIM_DEF_PARTNER - delay 0x2 + delay 2 return gBattleAnimMove_DragonHammer:: loadspritegfx ANIM_TAG_ROUND_SHADOW loadspritegfx ANIM_TAG_GRAY_SMOKE - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ROUND_SHADOW, 0, 12, 12, 0x7D7F @Pinkish purple + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ROUND_SHADOW, 0, 12, 12, RGB(31, 11, 31) @Pinkish purple fadetobg BG_COSMIC waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, -500, 0x0, 0xffff waitbgfadein setalpha 15, 0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 26, 0, 0, 5 - delay 0x6 + delay 6 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gBounceBallLandSpriteTemplate, ANIM_TARGET, 3 - delay 0x2 + delay 2 createvisualtask AnimTask_SquishTarget, 0x2 - delay 0x5 + delay 5 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 2, 8, 8, 1, 0 delay 2 @@ -11399,21 +11469,21 @@ gBattleAnimMove_BrutalSwing:: playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 0x6, 0x1, 0x0 waitforvisualfinish - delay 0xb + delay 11 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 26, 0, 0, 5 - delay 0x6 + delay 6 createsprite gBrutalSwingBasicImpactTemplate, ANIM_TARGET, 3, 0xffe0, 0xfff0, 0x1, 0x1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 21, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 3, 21, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATK_PARTNER, 0, 3, 21, 1 - delay 0x4 + delay 4 createsprite gBrutalSwingRandomImpactTemplate, ANIM_TARGET, 3, 0x1, 0x1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gBrutalSwingRandomImpactTemplate, ANIM_TARGET, 3, 0x1, 0x1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gBrutalSwingBasicImpactTemplate, ANIM_TARGET, 3, 0x20, 0x14, 0x1, 0x1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitsound @@ -11434,9 +11504,9 @@ gBattleAnimMove_AuroraVeil:: setalpha 8, 8 playsewithpan SE_M_MILK_DRINK, SOUND_PAN_ATTACKER createsprite gAuroraVeilRingTemplate, ANIM_ATTACKER, 2 - delay 0x4 + delay 4 createsprite gAuroraVeilRingTemplate, ANIM_ATTACKER, 2 - delay 0x4 + delay 4 createsprite gAuroraVeilRingTemplate, ANIM_ATTACKER, 2 waitforvisualfinish playsewithpan SE_SHINY, SOUND_PAN_ATTACKER @@ -11454,9 +11524,9 @@ gBattleAnimGeneral_ShellTrapSetUp:: monbg ANIM_TARGET setalpha 12, 8 call FireSpreadEffect - delay 0x4 + delay 4 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET - delay 0x15 + delay 21 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 10, ANIM_TARGET, 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 0, ANIM_TARGET, 2 @@ -11474,171 +11544,171 @@ ShellTrapUnleash: loadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE @red monbg ANIM_TARGET waitplaysewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER, 0x10 - delay 0x6 + delay 6 createsprite gShellTrapYellowImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapYellowImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapYellowImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapYellowImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapYellowImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapYellowImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapYellowImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapYellowImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapYellowImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x0 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x4 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x8 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0xc createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x10 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x14 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x18 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 waitforvisualfinish call ShellTrapFireLaunch1 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0, 0x38, 0x4, 0x4, 0x1 - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xfff6, 0x0, 0xfff6, 0x38, 0x4, 0x4, 0x1 - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xa, 0x0, 0xa, 0x38, 0xfffc, 0x3, 0x1 - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xffec, 0x0, 0xffec, 0x38, 0xfffc, 0x5, 0x1 - delay 0x3 + delay 3 call ShellTrapFireLaunch2 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 waitforvisualfinish clearmonbg ANIM_TARGET end ShellTrapFireLaunch1: createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0, 0x38, 0x4, 0x4, 0x1 - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xfff6, 0x0, 0xfff6, 0x38, 0x4, 0x4, 0x1 - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xa, 0x0, 0xa, 0x38, 0xfffc, 0x3, 0x1 - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xffec, 0x0, 0xffec, 0x38, 0xfffc, 0x5, 0x1 - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xf, 0x0, 0xf, 0x38, 0x4, 0x4, 0x1 - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xffec, 0x0, 0xffec, 0x38, 0x4, 0x4, 0x1 - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0x14, 0x0, 0x14, 0x38, 0x4, 0x4, 0x1 - delay 0x3 + delay 3 return ShellTrapFireLaunch2: createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0, 0x38, 0x4, 0x4, 0x1 createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xfff6, 0x0, 0xfff6, 0x38, 0x4, 0x4, 0x1 createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xa, 0x0, 0xa, 0x38, 0xfffc, 0x3, 0x1 createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xffec, 0x0, 0xffec, 0x38, 0xfffc, 0x5, 0x1 createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xf, 0x0, 0xf, 0x38, 0x4, 0x4, 0x1 createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xffec, 0x0, 0xffec, 0x38, 0x4, 0x4, 0x1 createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0x14, 0x0, 0x14, 0x38, 0x4, 0x4, 0x1 createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x3 + delay 3 return gBattleAnimMove_FleurCannon:: @@ -11648,7 +11718,7 @@ gBattleAnimMove_FleurCannon:: loadspritegfx ANIM_TAG_PINK_HEART @pink color setalpha 12, 8 monbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xF, 0x7440 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 15, RGB(0, 2, 29) waitforvisualfinish panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 50, 1 @@ -11675,14 +11745,14 @@ gBattleAnimMove_FleurCannon:: call FleurCannonBeam call FleurCannonBeam call FleurCannonBeam - delay 0x20 + delay 32 createsprite gFleurCannonDischargeTemplate, ANIM_ATTACKER, 2, 0x1, 0x10, 0x10 - delay 0x2 + delay 2 createsprite gFleurCannonDischargeTemplate, ANIM_ATTACKER, 2, 0x1, 0xfff0, 0xfff0 - delay 0x5 + delay 5 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 11, 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x7440 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB(0, 2, 29) waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -11690,10 +11760,10 @@ gBattleAnimMove_FleurCannon:: FleurCannonBeam: createsprite gFleurCannonOrbTemplate, ANIM_TARGET, 2 createsprite gFleurCannonOrbTemplate, ANIM_TARGET, 2 - delay 0x1 + delay 1 createsprite gFleurCannonOrbTemplate, ANIM_TARGET, 2 createsprite gFleurCannonOrbTemplate, ANIM_TARGET, 2 - delay 0x1 + delay 1 return gBattleAnimMove_PsychicFangs:: @@ -11709,14 +11779,14 @@ PsychicFangsRegular: playsewithpan SE_M_BITE, SOUND_PAN_TARGET createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xffe0, 0x1, 0x333, 0x333, 0xa createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0x20, 0x5, 0xfccd, 0xfccd, 0xa - delay 0xa + delay 10 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 5, 2 - delay 0x10 + delay 16 playsewithpan SE_M_BITE, SOUND_PAN_TARGET createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0xffe0, 0x7, 0xfccd, 0x333, 0xa createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x20, 0x3, 0x333, 0xfccd, 0xa - delay 0xa + delay 10 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 8, 4, 2 PsychicFangsEnd: @@ -11731,14 +11801,14 @@ PsychicFangsDestroyWall: playsewithpan SE_M_BITE, SOUND_PAN_TARGET createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xffe0, 0x1, 0x333, 0x333, 0xa createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0x20, 0x5, 0xfccd, 0xfccd, 0xa - delay 0xa + delay 10 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 5, 2 - delay 0x10 + delay 16 playsewithpan SE_M_BITE, SOUND_PAN_TARGET createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0xffe0, 0x7, 0xfccd, 0x333, 0xa createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x20, 0x3, 0x333, 0xfccd, 0xa - delay 0xa + delay 10 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, 0, ANIM_TARGET, 1 createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x0, 0xfff8, 0xfff4 createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x1, 0x8, 0xfff4 @@ -11746,7 +11816,7 @@ PsychicFangsDestroyWall: createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x3, 0x8, 0xc playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 8, 4, 2 - delay 0x10 + delay 16 goto PsychicFangsEnd gBattleAnimMove_StompingTantrum:: @@ -11756,7 +11826,7 @@ gBattleAnimMove_StompingTantrum:: loadspritegfx ANIM_TAG_SMALL_EMBER @hit color monbg ANIM_TARGET createvisualtask AnimTask_Splash, 2, ANIM_ATTACKER, 3 - delay 0x5 + delay 5 createvisualtask AnimTask_HorizontalShake, 5, (MAX_BATTLERS_COUNT + 1), 10, 0x5 createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 10, 0x5 createsprite gStompingTantrumRockTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 @@ -11765,14 +11835,14 @@ gBattleAnimMove_StompingTantrum:: createsprite gStompingTantrumRockTemplate, ANIM_ATTACKER, 2, 0x0, 0x3 call StompingTantrumImpact playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x25 + delay 37 createsprite gStompingTantrumRockTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 createsprite gStompingTantrumRockTemplate, ANIM_ATTACKER, 2, 0x0, 0x1 createsprite gStompingTantrumRockTemplate, ANIM_ATTACKER, 2, 0x0, 0x2 createsprite gStompingTantrumRockTemplate, ANIM_ATTACKER, 2, 0x0, 0x3 call StompingTantrumImpact playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x25 + delay 37 createsprite gStompingTantrumRockTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 createsprite gStompingTantrumRockTemplate, ANIM_ATTACKER, 2, 0x0, 0x1 createsprite gStompingTantrumRockTemplate, ANIM_ATTACKER, 2, 0x0, 0x2 @@ -11783,7 +11853,7 @@ gBattleAnimMove_StompingTantrum:: clearmonbg ANIM_TARGET end StompingTantrumImpact: - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x1 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 1 return gBattleAnimMove_ShadowBone:: @@ -11796,10 +11866,10 @@ gBattleAnimMove_ShadowBone:: setalpha 12, 8 playsewithpan SE_M_BONEMERANG, SOUND_PAN_TARGET createsprite gSpinningBoneSpriteTemplate, ANIM_ATTACKER, 2, 0xffd6, 0xffe7, 0x0, 0x0, 0xf - delay 0xc + delay 12 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x7, 0x5, 0x1, 0x0, 0xa, 0x0, 0x0 + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_ATTACKER | F_PAL_TARGET, 0x5, 0x1, 0x0, 10, RGB_BLACK, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_NightmareClone, 0x2 @@ -11820,7 +11890,7 @@ gBattleAnimMove_Accelerock:: createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 1, 5 createvisualtask AnimTask_TraceMonBlended, 0x2, 0x0, 0x4, 0x7, 0x3 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER - delay 0x4 + delay 4 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET @@ -11843,7 +11913,7 @@ gBattleAnimMove_Liquidation:: monbg ANIM_TARGET setalpha 12, 8 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x4 - delay 0x6 + delay 6 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET @@ -11863,10 +11933,9 @@ gBattleAnimMove_PrismaticLaser:: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge animation loadspritegfx ANIM_TAG_TEAL_ALERT @straight lines loadspritegfx ANIM_TAG_GREEN_SPIKE @needle arm animation - loadspritegfx ANIM_TAG_NEEDLE @sting monbg ANIM_ATTACKER setalpha 14, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK playsewithpan SE_ELEVATOR, SOUND_PAN_ATTACKER createsprite gPrismaticLaserChargeTemplate, ANIM_ATTACKER, 2, 0x0 call PrismaticLaserInwardSpikes @@ -11877,22 +11946,23 @@ gBattleAnimMove_PrismaticLaser:: playsewithpan SE_ELEVATOR, SOUND_PAN_ATTACKER call PrismaticLaserInwardSpikes playsewithpan SE_ELEVATOR, SOUND_PAN_ATTACKER - delay 0x1E + delay 30 call PrismaticLaserOutwardSpikes - delay 0x5 + delay 5 call PrismaticLaserOutwardSpikes2 - delay 0x5 + delay 5 call PrismaticLaserOutwardSpikes - delay 0x5 + delay 5 call PrismaticLaserOutwardSpikes2 - delay 0x5 + delay 5 call PrismaticLaserOutwardSpikes waitforvisualfinish unloadspritegfx ANIM_TAG_TEAL_ALERT unloadspritegfx ANIM_TAG_GREEN_SPIKE unloadspritegfx ANIM_TAG_ICE_CHUNK unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT - delay 0x1E + loadspritegfx ANIM_TAG_NEEDLE @sting + delay 30 createvisualtask AnimTask_HorizontalShake, 5, (MAX_BATTLERS_COUNT + 1), 10, 0x32 createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 10, 0x32 playsewithpan SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER @@ -11901,7 +11971,7 @@ gBattleAnimMove_PrismaticLaser:: call PrismaticLaserRain call PrismaticLaserRain waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff @@ -11931,48 +12001,48 @@ PrismaticLaserOutwardSpikes2: PrismaticLaserInwardSpikes: createsprite gPrismaticLaserRedInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x0, 0xFF90, 0x10 @up createsprite gPrismaticLaserVioletInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xFFE0, 0x43, 0x10 @between lower left and down - delay 0x1 + delay 1 createsprite gPrismaticLaserGreenInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x5F, 0xFF9D, 0x10 @upper right createsprite gPrismaticLaserYellowInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1F, 0x37, 0x10 @between lower right and down createsprite gPrismaticLaserYellowInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xFFDA, 0xFF94, 0x10 @between up and upper left - delay 0x1 + delay 1 createsprite gPrismaticLaserYellowInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x73, 0x0, 0x10 @right createsprite gPrismaticLaserRedInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xFF60, 0x43, 0x10 @between left and lower left - delay 0x1 + delay 1 createsprite gPrismaticLaserVioletInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x4F, 0x37, 0x10 @lower right createsprite gPrismaticLaserGreenInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xFF2A, 0xFFAA, 0x10 @between left and upper left - delay 0x1 + delay 1 createsprite gPrismaticLaserRedInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x0, 0x53, 0x10 @down createsprite gPrismaticLaserVioletInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x2D, 0xFF9D, 0x10 @between up and upper right - delay 0x1 + delay 1 createsprite gPrismaticLaserGreenInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xFFB0, 0x43, 0x10 @lower left createsprite gPrismaticLaserRedInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xDF, 0xFF9D, 0x10 @between right and upper right - delay 0x1 + delay 1 createsprite gPrismaticLaserYellowInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xFF60, 0x0, 0x10 @left createsprite gPrismaticLaserGreenInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x9F, 0x37, 0x10 @between right and lower right - delay 0x1 + delay 1 createsprite gPrismaticLaserVioletInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xFFAA, 0xFF94, 0x10 @upper left - delay 0x1 + delay 1 return PrismaticLaserRain: createsprite gPrismaticLaserYellowRainTemplate, ANIM_TARGET, 2, 35, 0x3c, 4, ANIM_TARGET - delay 0x2 + delay 2 createsprite gPrismaticLaserGreenRainTemplate, ANIM_TARGET, 2, -30, 0x44, 4, ANIM_TARGET - delay 0x2 + delay 2 createsprite gPrismaticLaserRedRainTemplate, ANIM_TARGET, 2, 27, 0x37, 4, ANIM_TARGET - delay 0x2 + delay 2 createsprite gPrismaticLaserVioletRainTemplate, ANIM_TARGET, 2, -20, 0x32, 4, ANIM_TARGET - delay 0x2 + delay 2 createsprite gPrismaticLaserYellowRainTemplate, ANIM_TARGET, 2, 33, 0x3a, 4, ANIM_TARGET - delay 0x2 + delay 2 createsprite gPrismaticLaserGreenRainTemplate, ANIM_TARGET, 2, -12, 0x3a, 4, ANIM_TARGET - delay 0x2 + delay 2 createsprite gPrismaticLaserRedRainTemplate, ANIM_TARGET, 2, 19, 0x3c, 4, ANIM_TARGET - delay 0x2 + delay 2 createsprite gPrismaticLaserVioletRainTemplate, ANIM_TARGET, 2, -38, 0x3a, 4, ANIM_TARGET - delay 0x2 + delay 2 createsprite gPrismaticLaserYellowRainTemplate, ANIM_TARGET, 2, 5, 0x3c, 4, ANIM_TARGET - delay 0x2 + delay 2 createsprite gPrismaticLaserGreenRainTemplate, ANIM_TARGET, 2, -23, 0x28, 4, ANIM_TARGET return @@ -11987,77 +12057,77 @@ SpectralThiefUnleash: loadspritegfx ANIM_TAG_POISON_BUBBLE fadetobg BG_GHOST waitbgfadein - delay 0x5 + delay 5 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gSpectralThiefBlackSmokeTemplate, ANIM_TARGET, 2, 0x8, 0x8, 0x0, 0x0 invisible ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gSpectralThiefBlackSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0xfff8, 0x0, 0x0 - delay 0x2 + delay 2 createsprite gSpectralThiefBlackSmokeTemplate, ANIM_TARGET, 2, 0x8, 0xfff8, 0x0, 0x0 - delay 0x2 + delay 2 createsprite gSpectralThiefBlackSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x0, 0x0 - delay 0x2 + delay 2 createsprite gSpectralThiefBlackSmokeTemplate, ANIM_TARGET, 2, 0x8, 0x8, 0x0, 0x0 - delay 0x2 + delay 2 createsprite gSpectralThiefBlackSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0xfff8, 0x0, 0x0 - delay 0x2 + delay 2 createsprite gSpectralThiefBlackSmokeTemplate, ANIM_TARGET, 2, 0x8, 0xfff8, 0x0, 0x0 - delay 0x2 + delay 2 createsprite gSpectralThiefBlackSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x0, 0x0 waitforvisualfinish playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER waitforvisualfinish createvisualtask AnimTask_DestinyBondWhiteShadow, 0x5, 0x0, 0x30 - delay 0x30 + delay 48 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 24, 1 - createvisualtask AnimTask_BlendBattleAnimPalExclude, 0x2, 0x6, 0x1, 0x0, 0xc, 0x77bd - delay 0x18 - createvisualtask AnimTask_BlendBattleAnimPalExclude, 0x2, 0x6, 0x1, 0xc, 0x0, 0x77bd + createvisualtask AnimTask_BlendBattleAnimPalExclude, 2, 6, 1, 0, 12, RGB(29, 29, 29) + delay 24 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 2, 6, 1, 12, 0, RGB(29, 29, 29) waitforvisualfinish setalpha 0, 16 - delay 0x1 + delay 1 monbg_static ANIM_TARGET createvisualtask AnimTask_MoveTargetMementoShadow, 0x5 playsewithpan SE_M_PSYBEAM, SOUND_PAN_TARGET waitforvisualfinish clearmonbg_static ANIM_TARGET - delay 0x1 + delay 1 blendoff - delay 0x1 + delay 1 setalpha 12, 8 monbg ANIM_TARGET - delay 0x1 + delay 1 createsprite gSpectralThiefThiefImpactTemplate, ANIM_TARGET, 2, 0xfff6, 0xfff6, 0x0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x4 + delay 4 createsprite gSpectralThiefThiefImpactTemplate, ANIM_TARGET, 2, 0xa, 0x14, 0x0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x4 + delay 4 createsprite gSpectralThiefThiefImpactTemplate, ANIM_TARGET, 2, 0xfffb, 0xa, 0x0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x4 + delay 4 createsprite gSpectralThiefThiefImpactTemplate, ANIM_TARGET, 2, 0x11, 0xfff4, 0x0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x4 + delay 4 createsprite gSpectralThiefThiefImpactTemplate, ANIM_TARGET, 2, 0xfff1, 0xf, 0x0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x4 + delay 4 createsprite gSpectralThiefThiefImpactTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x4 + delay 4 createsprite gSpectralThiefThiefImpactTemplate, ANIM_TARGET, 2, 0x14, 0x2, 0x0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish visible ANIM_ATTACKER - delay 0x2 + delay 2 restorebg waitbgfadein clearmonbg ANIM_TARGET @@ -12070,30 +12140,30 @@ SpectralThiefSteal: setalpha 11, 5 splitbgprio_all panse SE_M_MINIMIZE, SOUND_PAN_TARGET, SOUND_PAN_ATTACKER, 0xfd, 0x0 - delay 0xf + delay 15 createsprite gSpectralThiefBlackOrbsTemplate, ANIM_TARGET, 2, 0xfff4, 0x18 - delay 0xB + delay 11 setarg 0x7 0xffff waitforvisualfinish playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call SpectralThiefBuffUp - delay 0x8 + delay 8 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call SpectralThiefBuffUp - delay 0x8 + delay 8 call SpectralThiefBuffUp waitforvisualfinish blendoff end SpectralThiefBuffUp: createsprite gSpectralThiefBlackBuffTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gSpectralThiefBlackBuffTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gSpectralThiefBlackBuffTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gSpectralThiefBlackBuffTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gSpectralThiefBlackBuffTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return @@ -12107,11 +12177,11 @@ gBattleAnimMove_SunsteelStrike:: playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET createsprite gSunsteelStrikeBlackFlyBallTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 createvisualtask AnimTask_HorizontalShake, 5, ANIM_ATK_PARTNER, 1, 20 - delay 0x18 - createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 @The rock particles mess up the fly animation - createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0x0, 0x1 - createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0x0, 0x2 - createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0x0, 0x3 + delay 24 + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 0 @The rock particles mess up the fly animation + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 1 + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 2 + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 3 waitforvisualfinish unloadspritegfx ANIM_TAG_ROUND_SHADOW @fly unloadspritegfx ANIM_TAG_AIR_WAVE_2 @black color @@ -12135,7 +12205,7 @@ gBattleAnimMove_SunsteelStrike:: stopsound playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gSunsteelStrikeSuperpowerTemplate, ANIM_TARGET, 2, 0x14 - delay 0x14 + delay 20 createsprite gSunsteelStrikeRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x0 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 waitforvisualfinish @@ -12145,7 +12215,7 @@ gBattleAnimMove_SunsteelStrike:: unloadspritegfx ANIM_TAG_IMPACT @hit loadspritegfx ANIM_TAG_SMALL_EMBER @FireSpreadEffect call FireSpreadEffect - delay 0x4 + delay 4 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET waitforvisualfinish visible ANIM_ATTACKER @@ -12156,9 +12226,9 @@ gBattleAnimMove_SunsteelStrike:: end SunsteelStrikeBeam: createsprite gSunsteelStrikeYellowBeamTemplate, ANIM_TARGET, 2, 0x14 - delay 0x1 + delay 1 createsprite gSunsteelStrikeRedBeamTemplate, ANIM_TARGET, 2, 0x14 - delay 0x1 + delay 1 return gBattleAnimMove_MoongeistBeam:: @@ -12169,9 +12239,9 @@ gBattleAnimMove_MoongeistBeam:: loadspritegfx ANIM_TAG_WATER_GUN @water gun colour loadspritegfx ANIM_TAG_ASSURANCE_HAND @purple colour setalpha 8, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x0 - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 15, 15, 0x7FFF @White - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 15, 15, 0x7FFC @Light Blue + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 15, 15, RGB_WHITE @White + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 15, 15, RGB(28, 31, 31) @Light Blue waitforvisualfinish playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET createsprite gMoonSpriteTemplate, ANIM_TARGET, 0, 0x20, 0x15 @@ -12182,8 +12252,8 @@ gBattleAnimMove_MoongeistBeam:: call MoongeistBeamCharge createsprite gGrowingChargeOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x0 @;Charge circle call MoongeistBeamCharge - delay 0x20 - createsoundtask SoundTask_LoopSEAdjustPanning, 0x7, 0xCC, 0xffc0, SOUND_PAN_TARGET, 0x1, 0xf, 0x0, 0x5 + delay 32 + 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 MoongeistBeamOrbs @@ -12192,7 +12262,7 @@ gBattleAnimMove_MoongeistBeam:: call MoongeistBeamOrbs call MoongeistBeamOrbs createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 50, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0xb, 0x6739 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 11, RGB(25, 25, 25) call MoongeistBeamOrbs call MoongeistBeamOrbs call MoongeistBeamOrbs @@ -12222,8 +12292,8 @@ gBattleAnimMove_MoongeistBeam:: call MoongeistBeamOrbs call MoongeistBeamOrbs call MoongeistBeamOrbs - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0xb, 0x0, 0x6739 - delay 0x1A + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 11, 0, RGB(25, 25, 25) + delay 26 stopsound createvisualtask AnimTask_MoonlightEndFade, 0x2 end @@ -12234,36 +12304,36 @@ MoongeistBeamCharge: createsprite gMoongeistBeamChargeTemplate, ANIM_ATTACKER, 0, 25, -40, 0, 0, 30, 20 @From top right createsprite gMoongeistBeamChargeTemplate, ANIM_ATTACKER, 0, 25, 20, 0, 0, 30, 20 @From bottom right createsprite gMoongeistBeamChargeTemplate, ANIM_ATTACKER, 0, -25, 40, 0, 0, 30, -20 @From bottom left - delay 0x5 + delay 5 return MoongeistBeamOrbs: createsprite gMoongeistBeamBlueOrbsTemplate, ANIM_TARGET, 2 createsprite gMoongeistBeamPurpleOrbsTemplate, ANIM_TARGET, 2 - delay 0x1 + delay 1 return gBattleAnimMove_TearfulLook:: loadspritegfx ANIM_TAG_SMALL_BUBBLES @tears loadspritegfx ANIM_TAG_OPENING_EYE @eye monbg ANIM_DEF_PARTNER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x5, 0x7DE0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 5, RGB(0, 15, 31) waitforvisualfinish playsewithpan SE_M_CONFUSE_RAY, SOUND_PAN_TARGET createsprite gOpeningEyeSpriteTemplate, ANIM_ATTACKER, 5, 0x0, 0x0, 0x1, 0x0 - delay 0x35 + delay 53 loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 0xC, 0x2 - delay 0x8 + delay 8 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x0 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x1 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x2 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x3 - delay 0x8 + delay 8 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x0 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x1 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x2 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x3 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x5, 0x0, 0x7DE0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 5, 0, RGB(0, 15, 31) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end @@ -12277,24 +12347,24 @@ gBattleAnimMove_ZingZap:: monbg ANIM_TARGET call ZingZapSparks1 createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 4, 0, 6, 1 - delay 0xA + delay 10 call ZingZapSparks2 createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 4, 0, 6, 1 - delay 0xA + delay 10 call ZingZapSparks1 createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 4, 0, 6, 1 - delay 0xA + delay 10 call ZingZapSparks2 createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 4, 0, 6, 1 - delay 0xA + delay 10 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 1, 5 - delay 0x4 + delay 4 call ZingZapSparks1 invisible ANIM_ATTACKER createsprite gZingZapYellowBallTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xF - delay 0xA + delay 10 call ZingZapSparks2 - delay 0x5 + delay 5 stopsound playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER waitforvisualfinish @@ -12308,7 +12378,7 @@ gBattleAnimMove_ZingZap:: ZingZapSparks1: playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 return @@ -12316,7 +12386,7 @@ ZingZapSparks2: playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 return @@ -12328,47 +12398,47 @@ gBattleAnimMove_NaturesMadness:: loadspritegfx ANIM_TAG_ICE_CHUNK @blue green CrystalsTemplate monbg ANIM_ATTACKER setalpha 14, 8 - delay 0x1 + delay 1 loopsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER, 0x10, 0x3 createsprite gNaturesMadnessPinkStarsTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gNaturesMadnessPinkRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 createsprite gNaturesMadnessPinkStarsTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x0 createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gNaturesMadnessPinkStarsTemplate, ANIM_ATTACKER, 2, 0x14, 0xa, 0x19, 0x0 createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0x14, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gNaturesMadnessPinkRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 createsprite gNaturesMadnessPinkStarsTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff6, 0x19, 0x0 createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff6, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gNaturesMadnessPinkStarsTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xf, 0x19, 0x0 createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xf, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gNaturesMadnessPinkRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 createsprite gNaturesMadnessPinkStarsTemplate, ANIM_ATTACKER, 2, 0x19, 0x14, 0x19, 0x0 createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0x19, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gNaturesMadnessPinkStarsTemplate, ANIM_ATTACKER, 2, 0xffec, 0x14, 0x19, 0x0 createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0xffec, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gNaturesMadnessPinkRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 createsprite gNaturesMadnessPinkStarsTemplate, ANIM_ATTACKER, 2, 0xc, 0x0, 0x19, 0x0 createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0xc, 0x0, 0x19, 0x0 clearmonbg ANIM_ATTACKER - delay 0x1 + delay 1 monbg ANIM_TARGET waitforvisualfinish unloadspritegfx ANIM_TAG_SPARKLE_2 loadspritegfx ANIM_TAG_ECLIPSING_ORB @blue green grayRing createsprite gNaturesMadnessGrayRingTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x1, 0x0 playsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER - delay 0xe + delay 14 createsprite gNaturesMadnessGrayRingTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x1, 0x0 playsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER - delay 0xe + delay 14 createsprite gNaturesMadnessGrayRingTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x1, 0x0 playsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER waitforvisualfinish @@ -12393,9 +12463,9 @@ gBattleAnimMove_NaturesMadness:: createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0xffec, 0x14, 0x19, 0x1 createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0xc, 0x0, 0x19, 0x1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x5 + delay 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x5 + delay 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish clearmonbg ANIM_TARGET @@ -12406,36 +12476,36 @@ gBattleAnimMove_MultiAttack:: loadspritegfx ANIM_TAG_FOCUS_ENERGY @focus energy loadspritegfx ANIM_TAG_CUT @cut monbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call MultiAttackBuff - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_WHITE createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call MultiAttackBuff - delay 0x8 + delay 8 call MultiAttackBuff waitforvisualfinish - delay 0xF + delay 15 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 0x28, 0xffe0, 0x0 createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 0x28, 0xffd0, 0x0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET end MultiAttackBuff: createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return @@ -12447,7 +12517,7 @@ gBattleAnimMove_MindBlown:: loadspritegfx ANIM_TAG_IMPACT @hit monbg ANIM_TARGET setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish playsewithpan SE_FALL, SOUND_PAN_TARGET createsprite gMindBlownHeadTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x25 @@ -12455,22 +12525,22 @@ gBattleAnimMove_MindBlown:: createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 15, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 2, 0, 15, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 2, 0, 15, 1 - delay 0x1 + delay 1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gMindBlownBlueImpactTemplate, ANIM_TARGET, 3, 0x1, 0x0 createsprite gMindBlownPinkImpactTemplate, ANIM_TARGET, 3, 0x1, 0x0 call MindBlownBlueOrbs - delay 0x1 + delay 1 call MindBlownPinkOrbs - delay 0x1 + delay 1 call MindBlownBlueOrbs - delay 0x1 + delay 1 call MindBlownPinkOrbs - delay 0x1 + delay 1 call MindBlownBlueOrbs - delay 0x1 + delay 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish blendoff clearmonbg ANIM_TARGET @@ -12505,32 +12575,32 @@ gBattleAnimMove_PlasmaFists:: loadspritegfx ANIM_TAG_LIGHTNING @thunder punch monbg ANIM_ATTACKER setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK waitforvisualfinish createsprite gPlasmaFistsChargeTemplate, ANIM_ATTACKER, 2, 0x0 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 3, 92, 1 call PlasmaFistSpark1 - delay 0xA + delay 10 call PlasmaFistSpark2 - delay 0xA + delay 10 call PlasmaFistSpark1 - delay 0xA + delay 10 call PlasmaFistSpark2 - delay 0xA + delay 10 call PlasmaFistSpark1 - delay 0xA + delay 10 call PlasmaFistSpark2 - delay 0xA + delay 10 call PlasmaFistSpark1 - delay 0xA + delay 10 call PlasmaFistSpark2 - delay 0xA + delay 10 call PlasmaFistSpark1 - delay 0xA + delay 10 call PlasmaFistSpark2 - delay 0xA + delay 10 call PlasmaFistSpark1 - delay 0xA + delay 10 call PlasmaFistSpark2 waitforvisualfinish clearmonbg ANIM_ATTACKER @@ -12541,7 +12611,7 @@ gBattleAnimMove_PlasmaFists:: waitforvisualfinish call PlasmaFistsImpact waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -12550,7 +12620,7 @@ PlasmaFistSpark1: playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 11, RGB(31, 31, 22) createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 return @@ -12558,25 +12628,25 @@ PlasmaFistSpark2: playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 return PlasmaFistsImpact: playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x8, 0x1, 0x0 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 - delay 0x1 - createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 - delay 0x1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xffd0 - delay 0x1 - createsprite gLightningSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x1 - createsprite gLightningSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x10 - delay 0x1 + delay 1 + createvisualtask AnimTask_InvertScreenColor, 2, 0x101, 0x101, 0x101 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -48 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_ATTACKER, 2, 0, -16 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_ATTACKER, 2, 0, 16 + delay 1 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET - createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 - delay 0x2 + createvisualtask AnimTask_InvertScreenColor, 2, 0x101, 0x101, 0x101 + delay 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 return @@ -12594,34 +12664,34 @@ gBattleAnimMove_PhotonGeyser:: call PhotonGeyserSparks1 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffd8, 0x10 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x28, 0x10 - delay 0xA + delay 10 call PhotonGeyserSparks2 - delay 0xA + delay 10 call PhotonGeyserSparks1 - delay 0xA + delay 10 call PhotonGeyserSparks2 - delay 0xA + delay 10 call PhotonGeyserSparks1 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffd8, 0x10 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x28, 0x14, 0x10 - delay 0xA + delay 10 call PhotonGeyserSparks2 - delay 0xA + delay 10 call PhotonGeyserSparks1 - delay 0xA + delay 10 call PhotonGeyserSparks2 - delay 0xA + delay 10 call PhotonGeyserSparks1 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0xffd8, 0x0, 0x10 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x28, 0x0, 0x10 - delay 0xA + delay 10 call PhotonGeyserSparks2 - delay 0xA + delay 10 call PhotonGeyserSparks1 - delay 0xA + delay 10 call PhotonGeyserSparks2 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xF, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 15, RGB_BLACK clearmonbg ANIM_ATTACKER playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_ATTACKER unloadspritegfx ANIM_TAG_ORBS @recover @@ -12649,13 +12719,13 @@ gBattleAnimMove_PhotonGeyser:: unloadspritegfx ANIM_TAG_AIR_WAVE_2 @white/gray color @Shoot beam to the sky loadspritegfx ANIM_TAG_STRAIGHT_BEAM - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x6, 0x0, 0x10, 0x43FF @Light yellow + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 6, 0, 16, RGB(31, 31, 16) @Light yellow createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 4, 0, 96, 1 panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 call PhotonGeyserBeam waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0x10, 0x0, 0x43FF @Light yellow - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xF, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 16, 0, RGB(31, 31, 16) @Light yellow + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 15, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -12664,7 +12734,7 @@ PhotonGeyserSparks1: playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER createsprite gThinRingShrinkingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gPhotonGeyserSparkTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 - delay 0x0 + delay 0 createsprite gPhotonGeyserSparkTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 createsprite gPhotonGeyserSparkTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 return @@ -12672,22 +12742,22 @@ PhotonGeyserSparks2: playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER createsprite gPhotonGeyserSparkTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 createsprite gPhotonGeyserSparkTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 - delay 0x0 + delay 0 createsprite gPhotonGeyserSparkTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 return PhotonGeyserBeam: createsprite gPhotonGeyserBeam, ANIM_TARGET, 3, 0, 19, ANIM_TARGET, 180, 2, 6 - delay 0x1 + delay 1 createsprite gPhotonGeyserBeam, ANIM_TARGET, 3, 0, 3, ANIM_TARGET, 180, 2, 5 - delay 0x1 + delay 1 createsprite gPhotonGeyserBeam, ANIM_TARGET, 3, 0, -13, ANIM_TARGET, 180, 2, 4 - delay 0x1 + delay 1 createsprite gPhotonGeyserBeam, ANIM_TARGET, 3, 0, -29, ANIM_TARGET, 180, 2, 3 - delay 0x1 + delay 1 createsprite gPhotonGeyserBeam, ANIM_TARGET, 3, 0, -45, ANIM_TARGET, 180, 2, 2 - delay 0x1 + delay 1 createsprite gPhotonGeyserBeam, ANIM_TARGET, 3, 0, -61, ANIM_TARGET, 180, 2, 1 - delay 0x1 + delay 1 createsprite gPhotonGeyserBeam, ANIM_TARGET, 3, 0, -77, ANIM_TARGET, 180, 2, 0 return @@ -12863,7 +12933,7 @@ gBattleAnimMove_GlitzyGlow:: loadspritegfx ANIM_TAG_POISON_BUBBLE @violet color loadspritegfx ANIM_TAG_SMALL_EMBER @flame wheel particle loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 12, 12, 0x289F + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 12, 12, RGB(31, 4, 10) monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, 0 @Darken @@ -13005,8 +13075,8 @@ gBattleAnimMove_FreezyFrost:: loadspritegfx ANIM_TAG_ICICLE_SPEAR loadspritegfx ANIM_TAG_ICE_SPIKES loadspritegfx ANIM_TAG_IMPACT - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_ICICLE_SPEAR, 0, 0, 12, RGB_BLACK - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_ICE_SPIKES, 0, 0, 12, RGB_BLACK + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ICICLE_SPEAR, 0, 0, 12, RGB_BLACK + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ICE_SPIKES, 0, 0, 12, RGB_BLACK waitforvisualfinish call FreezyFrostHitEffect call FreezyFrostHitEffect @@ -13086,9 +13156,9 @@ gBattleAnimMove_DoubleIronBash:: createvisualtask AnimTask_AnimateGustTornadoPalette, 0x5, 0x1, 0x46 createsprite gGustToTargetSpriteTemplate, ANIM_ATTACKER, 2, 0xffe7, 0x0, 0x0, 0x0, 0x0 @wing attack createsprite gGustToTargetSpriteTemplate, ANIM_ATTACKER, 2, 0x19, 0x0, 0x0, 0x0, 0x0 @wing attack - delay 0x18 + delay 24 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 24, 0, 0, 9 - delay 0x11 + delay 17 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 0, 0, ANIM_TARGET, 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -32, 0, 0, 3 waitforvisualfinish @@ -13096,7 +13166,7 @@ gBattleAnimMove_DoubleIronBash:: waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0xb waitforvisualfinish - delay 0x3 + delay 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x7 clearmonbg ANIM_DEF_PARTNER blendoff @@ -13104,7 +13174,69 @@ gBattleAnimMove_DoubleIronBash:: @@@@@@@@@@@@@@@@@@@@@@@ GEN 8 @@@@@@@@@@@@@@@@@@@@@@@ gBattleAnimMove_DynamaxCannon:: - goto gBattleAnimMove_HyperBeam + loadspritegfx ANIM_TAG_ELECTRIC_ORBS + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_ORBS @hyper beam + loadspritegfx ANIM_TAG_WATER_GUN @water gun colour + loadspritegfx ANIM_TAG_ASSURANCE_HAND @purple colour + loadspritegfx ANIM_TAG_HYDRO_PUMP + loadspritegfx ANIM_TAG_SPARK_2 @spark + loadspritegfx ANIM_TAG_LEAF @green + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 15, 15, RGB(30, 2, 11) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 15, 15, RGB(30, 2, 11) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HYDRO_PUMP, 0, 12, 12, RGB(30, 2, 11) + setalpha 8, 8 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 2, 0, 15, 0 + waitforvisualfinish + loopsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER, 14, 10 + createsprite gGrowingChargeOrb3SpriteTemplate, ANIM_ATTACKER, 2, 0 @;Charge circle + call LightThatBurnsTheSkyGreenSparks + call LightThatBurnsTheSkyGreenSparks + call LightThatBurnsTheSkyGreenSparks + call LightThatBurnsTheSkyGreenSparks + call LightThatBurnsTheSkyGreenSparks + delay 20 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 2, 15, 0, 0 + fadetobg BG_DYNAMAX_CANNON + waitbgfadein + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 4, 0, 12, RGB(31, 4, 10) @Pinkish Red + panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER SOUND_PAN_TARGET 2 0 + createsprite gShakeMonOrPlatformSpriteTemplate, ANIM_ATTACKER, 2, 4, 1, 180, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 87, 1 + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 0, 4, 81, 1 + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + waitforvisualfinish + restorebg + waitbgfadein + blendoff + end + +DynamaxCannonLaunch: + createsprite gSpriteTemplate_DynamaxCannonOrb, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + createsprite gSpriteTemplate_DynamaxCannonOrb, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + return gBattleAnimMove_SnipeShot:: loadspritegfx ANIM_TAG_IMPACT_2 @@ -13114,7 +13246,7 @@ gBattleAnimMove_SnipeShot:: createsprite gLeerSpriteTemplate, ANIM_TARGET, 2, 0x18, -12 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER waitforvisualfinish - delay 0x20 + delay 32 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET createsprite gSnipeShotBallTemplate, ANIM_TARGET, 2, 0, 0, 16 waitforvisualfinish @@ -13127,21 +13259,21 @@ gBattleAnimMove_SnipeShot:: gBattleAnimMove_JawLock:: loadspritegfx ANIM_TAG_SHARP_TEETH loadspritegfx ANIM_TAG_IMPACT - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SHARP_TEETH, 0, 10, 10, 0x0B1D @Light orange + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SHARP_TEETH, 0, 10, 10, RGB(29, 24, 2) @Light orange monbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x7, 0x0 @Black + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 7, RGB_BLACK @Black waitforvisualfinish playsewithpan SE_M_BITE, SOUND_PAN_TARGET createsprite gJawLockTeethTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xffe0, 0x1, 0x333, 0x333, 0xa, 15 createsprite gJawLockTeethTemplate, ANIM_ATTACKER, 2, 0x20, 0x20, 0x5, 0xfccd, 0xfccd, 0xa, 15 - delay 0xa + delay 10 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 10, 2 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x7, 0x0, 0x0 @;Black + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 7, 0, RGB_BLACK @;Black waitforvisualfinish clearmonbg ANIM_TARGET - delay 0x1 + delay 1 end gBattleAnimMove_StuffCheeks:: @@ -13150,23 +13282,23 @@ gBattleAnimMove_StuffCheeks:: loadspritegfx ANIM_TAG_THIN_RING playsewithpan SE_M_METRONOME, 0xc0 createsprite gFloatingBerryTemplate, ANIM_ATTACKER, 1, 0x0 - delay 0x45 + delay 69 createvisualtask AnimTask_IsTargetPlayerSide, 0x2 jumpargeq 0x7 0x1 BERRYEAT_ON_PLAYER BerryEatingOpponent: call BiteOpponent - delay 0x10 + delay 16 call BiteOpponent - delay 0xA + delay 10 goto POST_BERRY_EAT BERRYEAT_ON_PLAYER: call BitePlayer - delay 0x10 + delay 16 call BitePlayer - delay 0xA + delay 10 POST_BERRY_EAT: playsewithpan SE_SHINY, 0xc0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x2, 0x3, 0x7, 0x0, 0x67f1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 3, 7, 0, RGB(17, 31, 25) createsprite gThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0 waitforvisualfinish end @@ -13192,22 +13324,22 @@ gBattleAnimMove_NoRetreat:: gBattleAnimMove_TarShot:: loadspritegfx ANIM_TAG_POISON_BUBBLE - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_POISON_BUBBLE, 0, 15, 15, 0 @Black + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_POISON_BUBBLE, 0, 15, 15, RGB_BLACK @Black monbg ANIM_TARGET createsprite gAppleAcidLaunchTemplate, ANIM_TARGET, 2, 0x14, 0x0, 0x28, 0x1, 0x0, 0x0 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER - delay 0x5 + delay 5 createsprite gAppleAcidLaunchTemplate, ANIM_TARGET, 2, 0x14, 0x0, 0x28, 0x1, 0xffe8, 0x0 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER - delay 0xf + delay 15 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 10, 1 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 16, RGB_BLACK @;Black createsprite gAppleAcidDripTemplate, ANIM_TARGET, 2, 0xffe6, 0xffe8, 0x0, 0xf, 0x37 playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET - delay 0xa + delay 10 createsprite gAppleAcidDripTemplate, ANIM_TARGET, 2, 0xf, 0xffe5, 0x0, 0xC, 0x32 playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET - delay 0xa + delay 10 createsprite gAppleAcidDripTemplate, ANIM_TARGET, 2, 0xfff1, 0xffef, 0x0, 0xa, 0x2d playsewithpan SE_M_BUBBLE SOUND_PAN_TARGET waitforvisualfinish @@ -13221,17 +13353,17 @@ gBattleAnimMove_MagicPowder:: createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0xffe2, 0xffea, 0x75, 0x50, 0x5, 0x1 createsprite gMagicPowderBluePowderTemplate, ANIM_TARGET, 2, 0xa, 0xffea, 0x75, 0x50, 0xfffb, 0x1 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0xffe7, 0xffea, 0x75, 0x70, 0x5, 0x3 - delay 0xf + delay 15 createsprite gMagicPowderBluePowderTemplate, ANIM_TARGET, 2, 0xfffb, 0xffea, 0x75, 0x50, 0xfffb, 0x1 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0x5, 0xffea, 0x75, 0x60, 0x5, 0x1 createsprite gMagicPowderBluePowderTemplate, ANIM_TARGET, 2, 0x0, 0xffea, 0x75, 0x45, 0xfffb, 0x1 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0xfff1, 0xffea, 0x75, 0x70, 0x5, 0x2 - delay 0x1e + delay 30 createsprite gMagicPowderBluePowderTemplate, ANIM_TARGET, 2, 0xfff1, 0xffea, 0x75, 0x70, 0x5, 0x2 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0xf, 0xffea, 0x75, 0x50, 0xfffb, 0x1 createsprite gMagicPowderBluePowderTemplate, ANIM_TARGET, 2, 0xfff6, 0xffea, 0x75, 0x60, 0x7, 0x2 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0xfffb, 0xffea, 0x75, 0x5a, 0xfff8, 0x0 - delay 0x14 + delay 20 createsprite gMagicPowderBluePowderTemplate, ANIM_TARGET, 2, 0xfff6, 0xffea, 0x75, 0x50, 0xfffb, 0x1 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xffea, 0x75, 0x59, 0x5, 0x2 createsprite gMagicPowderBluePowderTemplate, ANIM_TARGET, 2, 0x14, 0xffea, 0x75, 0x70, 0xfff8, 0x2 @@ -13249,7 +13381,7 @@ gBattleAnimMove_DragonDarts:: loadspritegfx ANIM_TAG_EXPLOSION playsewithpan SE_FALL, SOUND_PAN_ATTACKER createdragondartsprite ANIM_TARGET, 2, 0x0, 0x0, 0x19 - delay 0x19 + delay 25 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 16, 1 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x1 @@ -13272,17 +13404,17 @@ gBattleAnimMove_Teatime:: gBattleAnimMove_Octolock:: loadspritegfx ANIM_TAG_TENDRILS - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_TENDRILS, 0, 12, 12, 0x3D98 @Pinkish Red + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_TENDRILS, 0, 12, 12, RGB(24, 12, 15) @Pinkish Red loopsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET 0x6 0x4 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x10, 0x0, 0x2 - delay 0x7 + delay 7 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x0, 0x2 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x8, 0x1, 0x2 - delay 0x7 + delay 7 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xfff8, 0x1, 0x2 - delay 0x8 + delay 8 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x14 + delay 20 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 8, RGB_RED playsewithpan SE_M_BIND, SOUND_PAN_TARGET setarg 0x7 0xffff @@ -13294,13 +13426,13 @@ gBattleAnimMove_BoltBeak:: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_SPARK_2 loadspritegfx ANIM_TAG_ELECTRICITY - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRICITY, 0, 12, 12, 0x76E1 @Blue Electricity - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HORN_HIT, 0, 12, 12, 0x079D @Yellow + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRICITY, 0, 12, 12, RGB(1, 23, 29) @Blue Electricity + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HORN_HIT, 0, 12, 12, RGB(29, 28, 1) @Yellow call BoltBeakSparks waitforvisualfinish createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 0, 0, RGB(31, 31, 22) createsprite gHorizontalLungeSpriteTemplate, 0x2, 0x2, 0x4, 0x4 - delay 0x4 + delay 4 createsprite gHornHitSpriteTemplate, 0x84, 0x3, 0x8, 0x8, 0xa waitforvisualfinish createsprite gFlashingHitSplatSpriteTemplate, 0x83, 0x4, 0x0, 0x0, 0x1, 0x1 @@ -13314,21 +13446,21 @@ gBattleAnimMove_BoltBeak:: BoltBeakSparks: playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 7, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gBoltBeakBlueSparkTemplate, 0x0, 0x7, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 7, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 0, 0, RGB(31, 31, 22) - delay 0xa + delay 10 createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 5, 5, RGB(31, 31, 22) playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gBoltBeakBlueSparkTemplate, 0x0, 0x7, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 7, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gBoltBeakBlueSparkTemplate, 0x0, 0x7, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 - delay 0x0 + delay 0 createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 0, 0, RGB(1, 23, 29) - delay 0x14 + delay 20 createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 4, 4, RGB(1, 23, 29) playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, 0x4, 0x8, 0x0, 0x0, 0x20, 0xc, 0x0, 0x14, 0x0, 0x0 @@ -13339,13 +13471,13 @@ BoltBeakSparks: createsprite gBoltBeakBlueFlashingSparkTemplate, 0x4, 0x8, 0x0, 0x0, 0x10, 0xc, 0x60, 0x14, 0x1, 0x0 createsprite gSparkElectricityFlashingSpriteTemplate, 0x4, 0x8, 0x0, 0x0, 0x10, 0xc, 0xa0, 0x14, 0x0, 0x0 createsprite gBoltBeakBlueFlashingSparkTemplate, 0x4, 0x8, 0x0, 0x0, 0x10, 0xc, 0xe0, 0x14, 0x2, 0x0 - delay 0x4 + delay 4 return gBattleAnimMove_FishiousRend:: loadspritegfx ANIM_TAG_SHARP_TEETH @Teeth loadspritegfx ANIM_TAG_SMALL_BUBBLES - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SHARP_TEETH, 0, 10, 10, 0x726A @Blue Teeth + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SHARP_TEETH, 0, 10, 10, RGB(10, 19, 28) @Blue Teeth playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET createsprite gFishiousRendTeethTemplate, ANIM_TARGET, 0, 50, 4 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 4, 0, 12, 2 @@ -13355,43 +13487,43 @@ gBattleAnimMove_FishiousRend:: FishousRendBubbles: createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xF, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xF, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xA, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xA, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0x5, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0x5, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfffb, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfffb, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfff6, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfff6, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfff1, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfff1, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xffec, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xffec, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfff1, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfff1, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfff6, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfff6, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfffb, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfffb, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0x5, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0x5, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xA, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xA, 0x0 return @@ -13427,29 +13559,29 @@ gBattleAnimMove_ClangorousSoul:: ClangorousSoulStarBuffEffect: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER createsprite gClangorousSoulBlueBuffTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gClangorousSoulPurpleBuffTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x0, 0x0, 0x20, 0x3c - delay 0x4 + delay 4 createsprite gClangorousSoulWhiteBuffTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 0xc, 0xfffb, 0x0, 0x0, 0x20, 0x3c return gBattleAnimMove_BodyPress:: loadspritegfx ANIM_TAG_ROUND_SHADOW @fly and bounce animation loadspritegfx ANIM_TAG_GRAY_SMOKE @smoke - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ROUND_SHADOW, 0, 0xD, 0xD, 0x1E5D @Orange + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ROUND_SHADOW, 0, 13, 13, RGB(29, 18, 7) @Orange playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 0x6, 0x1, 0x0 - delay 0x7 + delay 7 createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 @Fly up waitforvisualfinish - delay 0x2F + delay 47 createsprite gBounceBallLandSpriteTemplate, ANIM_TARGET, 3 @Bounce down - delay 0x2 + delay 2 playsewithpan SE_M_MINIMIZE, SOUND_PAN_ATTACKER createvisualtask AnimTask_SquishTarget, 0x2 waitforvisualfinish @@ -13463,55 +13595,55 @@ gBattleAnimMove_DrumBeating:: loadspritegfx ANIM_TAG_PURPLE_HAND_OUTLINE loadspritegfx ANIM_TAG_ROOTS loadspritegfx ANIM_TAG_IMPACT - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_MUSIC_NOTES, 0, 0xD, 0xD, 0x03AC @Green + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_MUSIC_NOTES, 0, 13, 13, RGB(12, 29, 0) @Green monbg ANIM_TARGET splitbgprio ANIM_TARGET setalpha 12, 8 call BellyDrumRight createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x0 playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER - delay 0xf + delay 15 call BellyDrumLeft createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x1, 0x1, 0x0 playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER - delay 0xf + delay 15 call BellyDrumRight createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x3, 0x3, 0x80 playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER - delay 0x7 + delay 7 call BellyDrumLeft createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x2, 0x0, 0x80 playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER - delay 0x7 + delay 7 call BellyDrumRight createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1, 0x1, 0x0 playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER - delay 0x7 + delay 7 call BellyDrumLeft createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x0, 0x3, 0x0 playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 0x55, 0x10, 0x6, 0x0, 0x3, 0x50 playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET - delay 0x5 + delay 5 createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 0x55, 0xfff0, 0xfffa, 0x0, 0x2, 0x4b playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET - delay 0x5 + delay 5 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -10, ANIM_TARGET, 3 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 3, ANIM_TARGET, 8, 0, 20, 1 - delay 0x3 + delay 3 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 8, ANIM_TARGET, 3 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - delay 0x3 + delay 3 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, -3, ANIM_TARGET, 2 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - delay 0x3 + delay 3 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -3, 1, ANIM_TARGET, 2 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, 1, ANIM_TARGET, 1 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 10, ANIM_TARGET, 1 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET waitforvisualfinish @@ -13524,7 +13656,7 @@ gBattleAnimMove_SnapTrap:: loadspritegfx ANIM_TAG_FLOWER @flowers loadspritegfx ANIM_TAG_SHARP_TEETH loadspritegfx ANIM_TAG_IMPACT - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SHARP_TEETH, 0, 10, 10, 0x0688 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SHARP_TEETH, 0, 10, 10, RGB(8, 20, 1) monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_BITE, SOUND_PAN_TARGET @@ -13550,77 +13682,269 @@ gBattleAnimMove_PyroBall:: loadspritegfx ANIM_TAG_SMALL_EMBER playsewithpan SE_LEDGE, SOUND_PAN_ATTACKER @;Hop createsprite gPyroBallRockTemplate, ANIM_ATTACKER, 2, 0, 0, 0 - delay 0x19 + delay 25 playsewithpan SE_LEDGE, SOUND_PAN_ATTACKER @;Hop - delay 0x19 + delay 25 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x3, 0x0, 0x7, 0x043D + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 3, 0, 7, RGB(29, 1, 1) createsprite gPyroBallBurningRockTemplate, ANIM_ATTACKER, 2, 0, 0, 0 - delay 0x19 + delay 25 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET - delay 0x19 + delay 25 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET createsprite gPyroBallFlamesUpTemplate, ANIM_ATTACKER, 2, 0, 0, 1 - delay 0x19 + delay 25 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET createsprite gPyroBallEmberBallTemplate, ANIM_ATTACKER, 2, 0, 10, 0, 5, 20, -20 waitforvisualfinish createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB_RED createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 call FireSpreadEffect - delay 0x20 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x7, 0x0, 0x043D + delay 32 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 7, 0, RGB(29, 1, 1) waitforvisualfinish end gBattleAnimMove_BehemothBlade:: - goto gBattleAnimMove_SacredSword + loadspritegfx ANIM_TAG_CUT @Cut + loadspritegfx ANIM_TAG_SWORD @Sword + loadspritegfx ANIM_TAG_HYDRO_PUMP @Blue Colour + loadspritegfx ANIM_TAG_PUNISHMENT_BLADES @Punishment Blade + monbg ANIM_ATTACKER + setalpha 12, 8 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 3, 0, 15, 0 + waitforvisualfinish + playsewithpan SE_M_SWORDS_DANCE, SOUND_PAN_ATTACKER + createsprite gSwordsDanceBladeSpriteTemplate, ANIM_ATTACKER, 2, 0, 0 + delay 22 + createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_SWORD, 2, 2, RGB(18, 31, 31), 16, 0, 0 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + delay 1 + loadspritegfx ANIM_TAG_ROUND_SHADOW @fly + loadspritegfx ANIM_TAG_AIR_WAVE_2 @black color + loadspritegfx ANIM_TAG_ROCKS @rock colour + loadspritegfx ANIM_TAG_SMALL_ROCK @small rock + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET + createsprite gSunsteelStrikeBlackFlyBallTemplate, ANIM_ATTACKER, 2, 0, 0, 13, 336 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_ATK_PARTNER, 1, 20 + delay 24 + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 0 @The rock particles mess up the fly animation + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 1 + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 2 + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 3 + waitforvisualfinish + unloadspritegfx ANIM_TAG_ROUND_SHADOW @fly + unloadspritegfx ANIM_TAG_AIR_WAVE_2 @black color + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + createsprite gSacredSwordBladesTemplate, ANIM_TARGET, 1, 0, 10, 0, 0xFF00, 10 + createsprite gSacredSwordCutTemplate, ANIM_ATTACKER, 2, 40, 0xffe0, 0 + delay 5 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + loadspritegfx ANIM_TAG_WHITE_STREAK + call BehemothBladeSlashes + unloadspritegfx ANIM_TAG_WHITE_STREAK + waitforvisualfinish + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_ShakeMon2, 5, ANIM_PLAYER_LEFT, 8, 0, 40, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_PLAYER_RIGHT, 8, 0, 40, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_OPPONENT_LEFT, 8, 0, 40, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_OPPONENT_RIGHT, 8, 0, 40, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_ATTACKER_FORCE, 8, 0, 40, 1 + call OpposingExplosion2 + waitforvisualfinish + visible ANIM_ATTACKER + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 3, 15, 0, 0 + waitforvisualfinish + blendoff + clearmonbg ANIM_TARGET + end +OpposingExplosion2: + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 1 + delay 6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 24, -24, 1, 1 + delay 6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, -16, 16, 1, 1 + delay 6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, -24, -12, 1, 1 + delay 6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 16, 16, 1, 1 + delay 6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, -24, -12, 1, 1 + delay 6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 16, 16, 1, 1 + delay 6 + return + +BehemothBladeSlashes: + createsprite gAcrobaticsSlashesSpriteTemplate, ANIM_TARGET, 2, -10, 3 + playsewithpan SE_SHINY, SOUND_PAN_TARGET + delay 1 + createsprite gAcrobaticsSlashesSpriteTemplate, ANIM_TARGET, 2, 24, -19 + playsewithpan SE_SHINY, SOUND_PAN_TARGET + delay 1 + createsprite gAcrobaticsSlashesSpriteTemplate, ANIM_TARGET, 2, -28, -15 + playsewithpan SE_SHINY, SOUND_PAN_TARGET + delay 2 + createsprite gAcrobaticsSlashesSpriteTemplate, ANIM_TARGET, 2, -6, -30 + playsewithpan SE_SHINY, SOUND_PAN_TARGET + delay 1 + createsprite gAcrobaticsSlashesSpriteTemplate, ANIM_TARGET, 2, -20, 6 + playsewithpan SE_SHINY, SOUND_PAN_TARGET + delay 1 + createsprite gAcrobaticsSlashesSpriteTemplate, ANIM_TARGET, 2, -28, -15 + playsewithpan SE_SHINY, SOUND_PAN_TARGET + delay 2 + createsprite gAcrobaticsSlashesSpriteTemplate, ANIM_TARGET, 2, -6, -30 + playsewithpan SE_SHINY, SOUND_PAN_TARGET + delay 1 + createsprite gAcrobaticsSlashesSpriteTemplate, ANIM_TARGET, 2, -20, 6 + playsewithpan SE_SHINY, SOUND_PAN_TARGET + delay 1 + return gBattleAnimMove_BehemothBash:: - goto gBattleAnimMove_SunsteelStrike + loadspritegfx ANIM_TAG_ROUND_SHADOW @fly + loadspritegfx ANIM_TAG_AIR_WAVE_2 @black color + loadspritegfx ANIM_TAG_ROCKS @rock colour + loadspritegfx ANIM_TAG_SMALL_ROCK @small rock + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET + createsprite gSunsteelStrikeBlackFlyBallTemplate, ANIM_ATTACKER, 2, 0, 0, 13, 336 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_ATK_PARTNER, 1, 20 + delay 24 + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 0 @The rock particles mess up the fly animation + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 1 + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 2 + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 3 + waitforvisualfinish + unloadspritegfx ANIM_TAG_ROUND_SHADOW @fly + unloadspritegfx ANIM_TAG_AIR_WAVE_2 @black color + loadspritegfx ANIM_TAG_METEOR @superpower + loadspritegfx ANIM_TAG_GOLD_RING @beam + loadspritegfx ANIM_TAG_SMALL_RED_EYE @red color + loadspritegfx ANIM_TAG_IMPACT @hit + playsewithpan SE_ORB, SOUND_PAN_ATTACKER + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 3, 0, 15, 0 + waitforvisualfinish + call BehemothBashBeam + call BehemothBashBeam + call BehemothBashBeam + call BehemothBashBeam + call BehemothBashBeam + call BehemothBashBeam + call BehemothBashBeam + call BehemothBashBeam + call BehemothBashBeam + call BehemothBashBeam + stopsound + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gSunsteelStrikeSuperpowerTemplate, ANIM_TARGET, 2, 20 + delay 20 + createsprite gSunsteelStrikeRedImpactTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 0 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 + waitforvisualfinish + unloadspritegfx ANIM_TAG_METEOR @superpower + unloadspritegfx ANIM_TAG_GOLD_RING @beam + unloadspritegfx ANIM_TAG_SMALL_RED_EYE @red color + unloadspritegfx ANIM_TAG_IMPACT @hit + loadspritegfx ANIM_TAG_SMALL_EMBER @FireSpreadEffect + clearmonbg ANIM_TARGET + blendoff + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_ShakeMon2, 5, ANIM_PLAYER_LEFT, 8, 0, 40, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_PLAYER_RIGHT, 8, 0, 40, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_OPPONENT_LEFT, 8, 0, 40, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_OPPONENT_RIGHT, 8, 0, 40, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_ATTACKER_FORCE, 8, 0, 40, 1 + call OpposingExplosion1 + call OpposingExplosion1 + waitforvisualfinish + visible ANIM_ATTACKER + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 3, 15, 0, 0 + waitforvisualfinish + blendoff + clearmonbg ANIM_TARGET + end +BehemothBashBeam: + createsprite gSunsteelStrikeYellowBeamTemplate, ANIM_TARGET, 2, 20 + delay 1 + createsprite gSunsteelStrikeRedBeamTemplate, ANIM_TARGET, 2, 20 + delay 1 + return +OpposingExplosion1: + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 1 + delay 6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 24, -24, 1, 1 + delay 6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, -16, 16, 1, 1 + delay 6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, -24, -12, 1, 1 + delay 6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 16, 16, 1, 1 + delay 6 + return gBattleAnimMove_AuraWheel:: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_SPARK loadspritegfx ANIM_TAG_SPARK_2 - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK, 0x0, 0xC, 0xC, 0x303B @Pinkish-Red Electricity - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK_2, 0x0, 0xC, 0xC, 0x76E1 @Blue Electricity - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0x0, 0xA, 0xA, 0x303B @Pinkish-Red + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK, 0, 12, 12, RGB(27, 1, 12) @Pinkish-Red Electricity + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK_2, 0, 12, 12, RGB(1, 23, 29) @Blue Electricity + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 10, 10, RGB(27, 1, 12) @Pinkish-Red setalpha 12, 8 monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET createsprite gAuraWheelBlueElectricityTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x0 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gAuraWheelRedElectricityTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x4 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gAuraWheelBlueElectricityTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x8 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gAuraWheelRedElectricityTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0xc playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gAuraWheelBlueElectricityTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x10 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gAuraWheelRedElectricityTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x14 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gAuraWheelBlueElectricityTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x18 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 24, 0, 0, 6 - delay 0x4 + delay 4 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 23, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0 - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK_2, 2, 12, 0, 0x76E1 @Revert blue Electricity + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK_2, 2, 12, 0, RGB(1, 23, 29) @Revert blue Electricity createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x30, 0x2c, 0x0, 0x28, 0x0, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x30, 0x2c, 0x40, 0x28, 0x1, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x30, 0x2c, 0x80, 0x28, 0x0, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x30, 0x2c, 0xc0, 0x28, 0x2, 0x8003 - delay 0x7 + delay 7 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x9 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -13630,8 +13954,8 @@ gBattleAnimMove_AuraWheel:: gBattleAnimMove_BreakingSwipe:: loadspritegfx ANIM_TAG_IMPACT @hits loadspritegfx ANIM_TAG_SPARK_2 - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 12, 12, 0x001F @Red - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK_2, 0, 12, 12, 0x001F @Red + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 12, 12, RGB_RED @Red + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK_2, 0, 12, 12, RGB_RED @Red monbg ANIM_TARGET setalpha 12, 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -32, -16, ANIM_TARGET, 1 @@ -13639,15 +13963,15 @@ gBattleAnimMove_BreakingSwipe:: playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 21, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 3, 21, 1 - delay 0x4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x1 + delay 4 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 1 createsprite gBreakingSwipeCenteredElectricity, ANIM_TARGET, 2, 0xfff1, 0xfff6, 0x5, 0x0 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - delay 0x4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x1 + delay 4 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 1 createsprite gBreakingSwipeCenteredElectricity, ANIM_TARGET, 2, 0xfff8, 0x8, 0x5, 0x2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 1 createsprite gBreakingSwipeCenteredElectricity, ANIM_TARGET, 2, 0xffec, 0xf, 0x5, 0x1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET @@ -13673,15 +13997,15 @@ gBattleAnimMove_Overdrive:: loadspritegfx ANIM_TAG_THIN_RING loadspritegfx ANIM_TAG_SPARK_2 loadspritegfx ANIM_TAG_ELECTRICITY - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRICITY, 0, 12, 12, 0x76E1 @Blue Electricity + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRICITY, 0, 12, 12, RGB(1, 23, 29) @Blue Electricity call BoltBeakSparks waitforvisualfinish - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_THIN_RING, 0, 12, 12, 0x17BF @Yellow Electricity + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_THIN_RING, 0, 12, 12, RGB(31, 29, 5) @Yellow Electricity call OverdriveRings - delay 0x8 + delay 8 call OverdriveRings - delay 0x10 - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_THIN_RING, 0, 0, 12, 0x76E1 @Blue Electricity + delay 16 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_THIN_RING, 0, 0, 12, RGB(1, 23, 29) @Blue Electricity waitforvisualfinish end OverdriveRings: @@ -13698,33 +14022,33 @@ OverdriveRings: gBattleAnimMove_AppleAcid:: loadspritegfx ANIM_TAG_APPLE loadspritegfx ANIM_TAG_POISON_BUBBLE - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_POISON_BUBBLE, 0, 12, 12, 0x061D @Orange + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_POISON_BUBBLE, 0, 12, 12, RGB(29, 16, 1) @Orange playsewithpan SE_M_METRONOME, SOUND_PAN_ATTACKER createsprite gAppleAcidFloatingAppleTemplate, ANIM_ATTACKER, 12, 0x0 - delay 0x30 + delay 48 monbg ANIM_TARGET createsprite gAppleAcidLaunchTemplate, ANIM_TARGET, 2, 0x14, 0x0, 0x28, 0x1, 0x0, 0x0 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER - delay 0x5 + delay 5 createsprite gAppleAcidLaunchTemplate, ANIM_TARGET, 2, 0x14, 0x0, 0x28, 0x1, 0x18, 0x0 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER - delay 0x5 + delay 5 createsprite gAppleAcidLaunchTemplate, ANIM_TARGET, 2, 0x14, 0x0, 0x28, 0x1, 0xffe8, 0x0 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER - delay 0xf + delay 15 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 10, 1 createsprite gAppleAcidDripTemplate, ANIM_TARGET, 2, 0x0, 0xffea, 0x0, 0xf, 0x37 playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET - delay 0xa + delay 10 createsprite gAppleAcidDripTemplate, ANIM_TARGET, 2, 0xffe6, 0xffe8, 0x0, 0xf, 0x37 playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET - delay 0xa + delay 10 createsprite gAppleAcidDripTemplate, ANIM_TARGET, 2, 0xf, 0xffe5, 0x0, 0xf, 0x32 playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET - delay 0xa + delay 10 createsprite gAppleAcidDripTemplate, ANIM_TARGET, 2, 0xfff1, 0xffef, 0x0, 0xa, 0x2d playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET - delay 0xa + delay 10 createsprite gAppleAcidDripTemplate, ANIM_TARGET, 2, 0x1b, 0xffea, 0x0, 0xf, 0x32 playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET waitforvisualfinish @@ -13740,10 +14064,10 @@ gBattleAnimMove_GravApple:: call SmallAppleShower call SmallAppleShower createsprite gGravAppleLargeApple, ANIM_TARGET, 2, 0x0, 0x3c, 4, ANIM_TARGET - delay 0x7 + delay 7 playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, 21, 0, 4 - delay 0x30 + delay 48 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10 waitforvisualfinish call UnsetPsychicBg @@ -13751,34 +14075,34 @@ gBattleAnimMove_GravApple:: SmallAppleShower: createsprite gGravAppleSmallApple, ANIM_TARGET, 2, 35, 0x3c, 4, ANIM_TARGET playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound - delay 0x2 + delay 2 createsprite gGravAppleSmallApple, ANIM_TARGET, 2, -30, 0x44, 4, ANIM_TARGET playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound - delay 0x2 + delay 2 createsprite gGravAppleSmallApple, ANIM_TARGET, 2, 27, 0x37, 4, ANIM_TARGET playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound - delay 0x2 + delay 2 createsprite gGravAppleSmallApple, ANIM_TARGET, 2, -20, 0x32, 4, ANIM_TARGET playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound - delay 0x2 + delay 2 createsprite gGravAppleSmallApple, ANIM_TARGET, 2, 33, 0x3a, 4, ANIM_TARGET playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound - delay 0x2 + delay 2 createsprite gGravAppleSmallApple, ANIM_TARGET, 2, -12, 0x3a, 4, ANIM_TARGET playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound - delay 0x2 + delay 2 createsprite gGravAppleSmallApple, ANIM_TARGET, 2, 19, 0x3c, 4, ANIM_TARGET playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound - delay 0x2 + delay 2 createsprite gGravAppleSmallApple, ANIM_TARGET, 2, -38, 0x3a, 4, ANIM_TARGET playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound - delay 0x2 + delay 2 createsprite gGravAppleSmallApple, ANIM_TARGET, 2, 5, 0x3c, 4, ANIM_TARGET playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound - delay 0x2 + delay 2 createsprite gGravAppleSmallApple, ANIM_TARGET, 2, -23, 0x28, 4, ANIM_TARGET playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound - delay 0x2 + delay 2 return @ credits to Skeli @@ -13786,9 +14110,9 @@ gBattleAnimMove_SpiritBreak:: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT loadspritegfx ANIM_TAG_TEAL_ALERT loadspritegfx ANIM_TAG_EXPLOSION_2 - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_CIRCLE_OF_LIGHT, 0x0, 0x10, 0x10, 0x7FFF - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_TEAL_ALERT, 0x0, 0xA, 0xA, 0x7DDE - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_EXPLOSION_2, 0x0, 0xA, 0xA, 0x7DDE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 16, 16, RGB_WHITE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_TEAL_ALERT, 0, 10, 10, RGB(30, 14, 31) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION_2, 0, 10, 10, RGB(30, 14, 31) monbg ANIM_DEF_PARTNER createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -20, 8, 48, 8, 56, 6 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET @@ -13802,7 +14126,7 @@ gBattleAnimMove_SpiritBreak:: playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gSpriteTemplate_SpiritBreakExplode, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x1 waitforvisualfinish - delay 0x5 + delay 5 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 clearmonbg ANIM_DEF_PARTNER waitforvisualfinish @@ -13812,7 +14136,7 @@ gBattleAnimMove_StrangeSteam:: loadspritegfx ANIM_TAG_PINK_CLOUD loadspritegfx ANIM_TAG_FINGER loadspritegfx ANIM_TAG_WATER_GUN @blue colour - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FINGER, 0, 10, 10, 0x4798 @Green + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FINGER, 0, 10, 10, RGB(24, 28, 17) @Green monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET loopsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER, 0x4, 0xA @@ -13835,10 +14159,10 @@ StrangeSteamCloud: createsprite gStrangeSteamPinkCloudTemplate, ANIM_TARGET, 2, 0xf, 0xf, 0x14, 0, 0 createsprite gStrangeSteamGreenCloudTemplate, ANIM_TARGET, 2, 0xf, 0xf, 0x14, 0xa, 0x5 createsprite gStrangeSteamPinkCloudTemplate, ANIM_TARGET, 2, 0xf, 0xf, 0x14, 0xfff6, 0xfffb - delay 0x1 + delay 1 createsprite gStrangeSteamGreenCloudTemplate, ANIM_TARGET, 2, 0xf, 0xf, 0x14, 0x14, 0xa createsprite gStrangeSteamBlueCloudTemplate, ANIM_TARGET, 2, 0xf, 0xf, 0x14, 0xffec, 0xfff6 - delay 0x2 + delay 2 return gBattleAnimMove_LifeDew:: @@ -13847,22 +14171,22 @@ gBattleAnimMove_LifeDew:: monbg ANIM_ATK_PARTNER createsprite gLifeDewDropletTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_ATTACKER createsprite gLifeDewDropletTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_ATK_PARTNER - delay 0x15 + delay 21 playsewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER waitforvisualfinish playsewithpan SE_M_ABSORB_2, SOUND_PAN_ATTACKER createsprite gLifeDewSpecialOrbsTemplate, ANIM_ATTACKER, 2, 0, -5, ANIM_ATTACKER, FALSE createsprite gLifeDewSpecialOrbsTemplate, ANIM_ATTACKER, 2, 0, -5, ANIM_ATK_PARTNER, FALSE - delay 0x7 + delay 7 createsprite gLifeDewSpecialOrbsTemplate, ANIM_ATTACKER, 2, -15, 10, ANIM_ATTACKER, FALSE createsprite gLifeDewSpecialOrbsTemplate, ANIM_ATTACKER, 2, -15, 10, ANIM_ATK_PARTNER, FALSE - delay 0x7 + delay 7 createsprite gLifeDewSpecialOrbsTemplate, ANIM_ATTACKER, 2, -15, -15, ANIM_ATTACKER, FALSE createsprite gLifeDewSpecialOrbsTemplate, ANIM_ATTACKER, 2, -15, -15, ANIM_ATK_PARTNER, FALSE - delay 0x7 + delay 7 createsprite gLifeDewSpecialOrbsTemplate, ANIM_ATTACKER, 2, 10, -5, ANIM_ATTACKER, FALSE createsprite gLifeDewSpecialOrbsTemplate, ANIM_ATTACKER, 2, 10, -5, ANIM_ATK_PARTNER, FALSE - delay 0x7 + delay 7 waitforvisualfinish clearmonbg ANIM_ATK_PARTNER end @@ -13871,12 +14195,12 @@ gBattleAnimMove_Obstruct:: loadspritegfx ANIM_TAG_NOISE_LINE @growl loadspritegfx ANIM_TAG_PROTECT loadspritegfx ANIM_TAG_OBSTRUCT_CROSS - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_NOISE_LINE, 0, 10, 10, 0 @Black - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PROTECT, 0, 10, 10, 0 @Black + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_NOISE_LINE, 0, 10, 10, RGB_BLACK @Black + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PROTECT, 0, 10, 10, RGB_BLACK @Black createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL call RoarEffect waitforvisualfinish - delay 0x10 + delay 16 monbg ANIM_ATK_PARTNER splitbgprio ANIM_ATTACKER waitplaysewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER, 0x10 @@ -13895,34 +14219,34 @@ gBattleAnimMove_FalseSurrender:: monbg ANIM_ATTACKER fadetobg BG_DARK waitbgfadein - delay 0x0 + delay 0 playsewithpan SE_M_FAINT_ATTACK, 0xc0 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 1, 3 createvisualtask AnimTask_AttackerFadeToInvisible, 0x2, 0x1 waitforvisualfinish clearmonbg ANIM_ATTACKER invisible ANIM_ATTACKER - delay 0x1 + delay 1 createvisualtask AnimTask_SetAttackerInvisibleWaitForSignal, 0x2, monbg ANIM_TARGET setalpha 12, 8 - delay 0x1 + delay 1 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x1f, 0x3, 0x1, 0x7fff, 0xa, 0x0, 0xa + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_WHITE, 10, RGB_BLACK, 10 createsprite gSpriteTemplate_LargeCrossImpact, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x14 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 7, 0, 9, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff - delay 0x1 + delay 1 setarg 0x7, 0x1000 - delay 0x1 + delay 1 createvisualtask AnimTask_InitAttackerFadeFromInvisible, 0x2, monbg ANIM_ATTACKER createvisualtask AnimTask_AttackerFadeFromInvisible, 0x2, 0x1 waitforvisualfinish clearmonbg ANIM_ATTACKER - delay 0x1 + delay 1 restorebg waitbgfadein end @@ -13931,43 +14255,124 @@ gBattleAnimMove_MeteorAssault:: loadspritegfx ANIM_TAG_ELECTRIC_ORBS loadspritegfx ANIM_TAG_METEOR loadspritegfx ANIM_TAG_EXPLOSION - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 12, 12, 0x0B1D @Light orange - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 9, 0x0B1D @Light orange + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 12, 12, RGB(29, 24, 2) @Light orange + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 9, RGB(29, 24, 2) @Light orange createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 48, 0, 4 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER waitforvisualfinish invisible ANIM_ATTACKER createsprite gGrowingSuperpowerTemplate, ANIM_TARGET, 3, 0x0 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER - delay 0xF - createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 1, 0x10, 0x10, 0x7FFF @Screen flash white + delay 15 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 1, 16, 16, RGB_WHITE @Screen flash white createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 32, 1 call BasicExplosion call BasicExplosion waitforvisualfinish visible ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 1, 0x10, 0, 0x7FFF @Screen revert from white + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 1, 16, 0, RGB_WHITE @Screen revert from white waitforvisualfinish end BasicExplosion: playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x1 - delay 0x3 + delay 3 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, 0x1, 0x1 - delay 0x3 + delay 3 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, 0x1, 0x1 - delay 0x3 + delay 3 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, 0x1, 0x1 - delay 0x3 + delay 3 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, 0x1, 0x1 return gBattleAnimMove_Eternabeam:: - goto gBattleAnimMove_HyperBeam + loadspritegfx ANIM_TAG_HYDRO_PUMP + loadspritegfx ANIM_TAG_ROUND_SHADOW + loadspritegfx ANIM_TAG_BLUE_STAR + loadspritegfx ANIM_TAG_PURPLE_DRAKE + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HYDRO_PUMP, 0, 12, 12, RGB(31, 4, 10) @Pinkish Red + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ROUND_SHADOW, 0, 13, 13, RGB(31, 4, 10) @Pinkish Red + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB(11, 1, 22) + fadetobgfromset BG_SPACIAL_REND_ON_OPPONENT BG_SPACIAL_REND_ON_PLAYER BG_SPACIAL_REND_ON_OPPONENT + playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER + invisible ANIM_ATTACKER + createsprite gDevastatingDrakeDrakeUpSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0x04E0, 36, 21, 1, ANIM_ATTACKER + waitforvisualfinish + createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_SOLAR_BEAM, 0xf0, 0xffc0, SOUND_PAN_TARGET, 0x1, 0xf, 0x0, 0x5 + call OblivionWingBeam + call OblivionWingBeam + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 4, 0, 12, RGB(31, 4, 10) @Pinkish Red + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + visible ANIM_ATTACKER + waitforvisualfinish + restorebg + waitbgfadein + blendoff + end +EternabeamGeyser: + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 3, 5, 1, 0 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, -11, -15, 1, 0 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 8, -5, 1, 0 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, -6, 18, 1, 0 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0, 5, 1, 0 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 3, -11, ANIM_TARGET, 0 + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, -11, -31, ANIM_TARGET, 0 + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 8, -21, ANIM_TARGET, 0 + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, -6, 2, ANIM_TARGET, 0 + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0, -11, ANIM_TARGET, 0 + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 3, -27, ANIM_TARGET, 0 + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, -11, -47, ANIM_TARGET, 0 + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 8, -47, ANIM_TARGET, 0 + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, -6, -14, ANIM_TARGET, 0 + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0, -27, ANIM_TARGET, 0 + delay 0 + return gBattleAnimMove_SteelBeam:: loadspritegfx ANIM_TAG_CLAW_SLASH @@ -13987,7 +14392,7 @@ gBattleAnimMove_SteelBeam:: delay 4 createsprite gSteelBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 1 delay 4 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 1, 0, 10, RGB(24, 24, 48) + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 0, 10, RGB(24, 24, 48) createsprite gSteelBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 2 delay 4 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 65, 1 @@ -14002,7 +14407,7 @@ gBattleAnimMove_SteelBeam:: call SteelBeam_Continuity call SteelBeam_Continuity waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 1, 10, 0, RGB(24, 24, 48) + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 10, 0, RGB(24, 24, 48) call UnsetHighSpeedBg end SteelBeam_Continuity: @@ -14028,13 +14433,14 @@ SetSteelBeamBackground: goto SetHighSpeedBgFade SetSteelBeamBgPlayer: fadetobg BG_STEEL_BEAM_PLAYER + goto SetHighSpeedBgFade @Credits to Skeli gBattleAnimMove_ExpandingForce:: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT loadspritegfx ANIM_TAG_EXPLOSION_2 - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_CIRCLE_OF_LIGHT, 0x0, 0xA, 0xA, 0x7DDE - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_EXPLOSION_2, 0x0, 0xA, 0xA, 0x7DDE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 10, 10, RGB(30, 14, 31) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION_2, 0, 10, 10, RGB(30, 14, 31) monbg ANIM_DEF_PARTNER call SetPsychicBackground createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 10, 1 @@ -14068,74 +14474,74 @@ ExpandingForceBothTargets: ExpandingForceExplosionGeyser: createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0x0003, 0x0005, ANIM_TARGET playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0xfff5, 0xfff1, ANIM_TARGET playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0x0008, 0xfffb, ANIM_TARGET playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0xfffa, 0x0012, ANIM_TARGET playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0x0000, 0x0005, ANIM_TARGET playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0x0003, 0xfff5, ANIM_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0xfff5, 0xffe1, ANIM_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0x0008, 0xffeb, ANIM_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0xfffa, 0x0002, ANIM_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0x0000, 0xfff5, ANIM_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0x0003, 0xffe5, ANIM_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0xfff5, 0xffd1, ANIM_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0x0008, 0xffdb, ANIM_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0xfffa, 0xfff2, ANIM_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0x0000, 0xffe5, ANIM_TARGET return MaxKnuckleExplosionGeyser: createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0003, 0x0005, ANIM_TARGET, 0x0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfff5, 0xfff1, ANIM_TARGET, 0x0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0008, 0xfffb, ANIM_TARGET, 0x0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfffa, 0x0012, ANIM_TARGET, 0x0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0000, 0x0005, ANIM_TARGET, 0x0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0003, 0xfff5, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfff5, 0xffe1, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0008, 0xffeb, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfffa, 0x0002, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0000, 0xfff5, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0003, 0xffe5, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfff5, 0xffd1, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0008, 0xffdb, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfffa, 0xfff2, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0000, 0xffe5, ANIM_TARGET, 0x0 return @@ -14168,14 +14574,14 @@ gBattleAnimMove_ScaleShot:: loadspritegfx ANIM_TAG_SHELL_RIGHT loadspritegfx ANIM_TAG_IMPACT createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x6 - delay 0x3 + delay 3 playsewithpan SE_M_BONEMERANG, SOUND_PAN_ATTACKER createsprite gSpriteTemplate_ScaleShotScale, ANIM_TARGET, 2, 0x10, 0x0, 0x0, 0x0, 0x14, 0x101 waitforvisualfinish playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 - delay 0x10 + delay 16 stopsound waitforvisualfinish end @@ -14235,9 +14641,9 @@ MeteorBeamBlast: MeteorBeamRockLaunch: createsprite gSpriteTemplate_MeteorBeamRock, ANIM_TARGET, 2, 0, 0, 0x10 - delay 0x2 + delay 2 createsprite gSpriteTemplate_MeteorBeamRock, ANIM_TARGET, 2, 0, 0, 0x10 - delay 0x2 + delay 2 return gBattleAnimMove_ShellSideArm:: @@ -14278,7 +14684,7 @@ gBattleAnimMove_ShellSideArmSpecial:: @ Modified Snipe Shot, placeholder playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gLeerSpriteTemplate, ANIM_TARGET, 2, 0x18, -12 waitforvisualfinish - delay 0x20 + delay 32 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET createsprite gSnipeShotBallTemplate, ANIM_TARGET, 2, 0, 0, 24 waitforvisualfinish @@ -14289,7 +14695,7 @@ gBattleAnimMove_ShellSideArmSpecial:: @ Modified Snipe Shot, placeholder @Credits to Skeli gBattleAnimMove_MistyExplosion:: loadspritegfx ANIM_TAG_EXPLOSION - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x8, 0x9, 0x7A5B, 0x8, 0x0, 0x8 + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 8, 9, RGB(27, 18, 30), 8, RGB_BLACK, 8 createvisualtask AnimTask_ShakeMon2, 5, ANIM_PLAYER_LEFT, 8, 0, 40, 1 createvisualtask AnimTask_ShakeMon2, 5, ANIM_PLAYER_RIGHT, 8, 0, 40, 1 createvisualtask AnimTask_ShakeMon2, 5, ANIM_OPPONENT_LEFT, 8, 0, 40, 1 @@ -14298,9 +14704,9 @@ gBattleAnimMove_MistyExplosion:: call Explosion1 call Explosion1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x1, 0x1, 0x10, 0x10, 0x7F7F @;White Pink - delay 0x32 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x1, 0x3, 0x10, 0x0, 0x7F7F @;White Pink + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 16, RGB(31, 27, 31) @;White Pink + delay 50 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 3, 16, 0, RGB(31, 27, 31) @;White Pink end @Credits to Skeli @@ -14308,9 +14714,9 @@ gBattleAnimMove_GrassyGlide:: loadspritegfx ANIM_TAG_LEAF @leaves loadspritegfx ANIM_TAG_IMPACT @hits loadspritegfx ANIM_TAG_WHIP_HIT - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_IMPACT, 0x0, 0xD, 0xD, 0x0266 @;Leaf Green + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 13, 13, RGB(6, 19, 0) @;Leaf Green createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB(12, 29, 0) - delay 0x2 + delay 2 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, -120, 0, 0, 10 @;Slide off off, screen waitforvisualfinish @@ -14330,63 +14736,63 @@ gBattleAnimMove_RisingVoltage:: createvisualtask AnimTask_GetBattleEnvironment, 0x5, jumpargeq 0x0, BG_ELECTRIC_TERRAIN, ANIM_RISING_VOLTAGE_STRONGER ANIM_RISING_VOLTAGE_NORMAL: - createvisualtask AnimTask_BlendBattleAnimPal, 0x2, F_PAL_BG, 0x1, 0x0, 0x4, 0x0 @;To black + createvisualtask AnimTask_BlendBattleAnimPal, 2, F_PAL_BG, 1, 0, 4, RGB_BLACK @;To black waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 30, 0, 3 @;Amount, Slowness, Slowness, Compaction playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0xc + delay 12 createsprite gGrowingShockWaveOrbSpriteTemplate, ANIM_ATTACKER, 0, 0x0 waitforvisualfinish createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 0x2, 0x0, 0x1, 0x34, 0x1, 0x0 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 1, 4, 0, 12, RGB(29, 28, 1) playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x10 - delay 0x1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xfff0 - delay 0x1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xffe0 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, 16 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -16 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -32 call StokedSparksurferSparkGeyser call StokedSparksurferSparkGeyser waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0x2, F_PAL_BG, 0x1, 0x4, 0x0, 0x0 @;From black + createvisualtask AnimTask_BlendBattleAnimPal, 2, F_PAL_BG, 1, 4, 0, RGB_BLACK @;From black waitforvisualfinish clearmonbg ANIM_ATTACKER end ANIM_RISING_VOLTAGE_STRONGER: - createvisualtask AnimTask_BlendBattleAnimPal, 0x2, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 @;To black + createvisualtask AnimTask_BlendBattleAnimPal, 2, F_PAL_BG, 1, 0, 12, RGB_BLACK @;To black waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 55, 0, 0 @;Amount, Slowness, Slowness, Compaction playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0xc + delay 12 createsprite gGrowingShockWaveOrbSpriteTemplate, ANIM_ATTACKER, 2, waitforvisualfinish createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 0x2, 0x0, 0x1, 0x54, 0x1, 0x0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0x10, 0x079D + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 4, 0, 16, RGB(29, 28, 1) playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x10, 0x10 - delay 0x1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x10, 0xfff0 - delay 0x1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x10, 0xffe0 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 16, 16 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 16, -16 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 16, -32 call StokedSparksurferSparkGeyser playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -0x18, 0x10 - delay 0x1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -0x18, 0xfff0 - delay 0x1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -0x18, 0xffe0 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -24, 16 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -24, -16 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -24, -32 call StokedSparksurferSparkGeyser playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x10 - delay 0x1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xfff0 - delay 0x1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xffe0 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, 16 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -16 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -32 call StokedSparksurferSparkGeyser waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0x10, 0x0, 0x079D @;From Yellow - createvisualtask AnimTask_BlendBattleAnimPal, 0x2, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 @;From black + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 16, 0, RGB(29, 28, 1) @;From Yellow + createvisualtask AnimTask_BlendBattleAnimPal, 2, F_PAL_BG, 1, 12, 0, RGB_BLACK @;From black waitforvisualfinish clearmonbg ANIM_ATTACKER end @@ -14480,7 +14886,7 @@ gBattleAnimMove_SkitterSmack:: loadspritegfx ANIM_TAG_WHITE_SHADOW @Destiny Bond loadspritegfx ANIM_TAG_QUICK_GUARD_HAND @Black Colour loadspritegfx ANIM_TAG_RAZOR_LEAF - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_WHITE waitforvisualfinish playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER invisible ANIM_ATTACKER @@ -14494,10 +14900,10 @@ gBattleAnimMove_SkitterSmack:: invisible ANIM_ATTACKER waitsound createvisualtask AnimTask_DestinyBondWhiteShadow, 0x5, 0x0, 0x30 - delay 0x17 + delay 23 createvisualtask AnimTask_IsTargetSameSide, 0x2, createvisualtask AnimTask_SnatchOpposingMonMove, 0x2, - delay 0x19 + delay 25 visible ANIM_ATTACKER invisible ANIM_ATTACKER delay 5 @@ -14519,7 +14925,7 @@ gBattleAnimMove_SkitterSmack:: invisible ANIM_ATTACKER delay 1 visible ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB_WHITE waitforvisualfinish end @@ -14530,19 +14936,19 @@ gBattleAnimMove_BurningJealousy:: createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 42, 1 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 8, RGB_RED call BurningJealousyFireBuffEffect - delay 0x8 + delay 8 call BurningJealousyFireBuffEffect createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 8, RGB_RED - delay 0x4 + delay 4 call BurningJealousyFireBuffEffect waitforvisualfinish monbg ANIM_TARGET playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER createvisualtask AnimTask_FlailMovement, 2, ANIM_ATTACKER call BurningJealousyFlames - delay 0x8 + delay 8 call BurningJealousyFlames - delay 0x8 + delay 8 call BurningJealousyFlames playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 12, 1 @@ -14556,13 +14962,13 @@ gBattleAnimMove_BurningJealousy:: BurningJealousyFireBuffEffect: createsprite gSpriteTemplate_BurningJealousyFireBuff, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0xffe8, 0x1a, 0x2, 0x18 - delay 0x3 + delay 3 createsprite gSpriteTemplate_BurningJealousyFireBuff, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0xe, 0x1c, 0x1, 0x18 - delay 0x3 + delay 3 createsprite gSpriteTemplate_BurningJealousyFireBuff, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0xfffb, 0xa, 0x2, 0x18 - delay 0x3 + delay 3 createsprite gSpriteTemplate_BurningJealousyFireBuff, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x1c, 0x1a, 0x3, 0x18 - delay 0x3 + delay 3 return BurningJealousyFlames: @@ -14582,35 +14988,35 @@ gBattleAnimMove_LashOut:: loadspritegfx ANIM_TAG_HANDS_AND_FEET @black color loadspritegfx ANIM_TAG_SLAM_HIT_2 loadspritegfx ANIM_TAG_IMPACT @hit - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_SLAM_HIT_2, 0x0, 0xA, 0xA, 0x1F + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SLAM_HIT_2, 0, 10, 10, RGB_RED monbg ANIM_DEF_PARTNER playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call PowerTripBuffUp - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_RED createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call PowerTripBuffUp - delay 0x8 + delay 8 call PowerTripBuffUp waitforvisualfinish fadetobg BG_DARK waitbgfadein playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET createsprite gSpriteTemplate_LashOutStrike, ANIM_TARGET, 2, 0xfff0, 0xfff0, FALSE - delay 0x8 + delay 8 createsprite gFoulPlayImpactTemplate, ANIM_TARGET, 3, 10, 0x0, ANIM_TARGET, 0x1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -12, 10, 0, 3 - delay 0x8 + delay 8 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x5 - delay 0x8 + delay 8 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET createsprite gSpriteTemplate_LashOutStrike, ANIM_TARGET, 2, 0xfff0, 0xfff0, TRUE - delay 0x8 + delay 8 createsprite gFoulPlayImpactTemplate, ANIM_TARGET, 3, -10, 0x0, ANIM_TARGET, 0x1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 12, 10, 0, 3 - delay 0x8 + delay 8 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x5 restorebg @@ -14634,16 +15040,16 @@ gBattleAnimMove_Poltergeist:: waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 0, 16, 0, RGB_BLACK playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER - delay 0x1 + delay 1 createvisualtask AnimTask_DestinyBondWhiteShadow, 0x5, 0x0, 0x24 - delay 0x30 + delay 48 playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET createvisualtask AnimTask_PoltergeistItem, 2 waitforvisualfinish setalpha 12, 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x7, 0x5, 0x1, 0x0, 0xa, 0x0, 0x0 + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_ATTACKER | F_PAL_TARGET, 5, 1, 0, 10, RGB_BLACK, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_NightmareClone, 0x2 @@ -14654,26 +15060,27 @@ gBattleAnimMove_Poltergeist:: waitbgfadein clearmonbg 0x3 blendoff + unloadspritegfx ANIM_TAG_ITEM_BAG end @Credits to Skeli gBattleAnimMove_CorrosiveGas:: loadspritegfx ANIM_TAG_PINK_CLOUD @Fumes - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_PINK_CLOUD, 0x0, 0xE, 0xE, 0x19EF @;Garbage green + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PINK_CLOUD, 0, 14, 14, RGB(15, 15, 6) @;Garbage green monbg ANIM_ATTACKER loopsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER, 0x8, 0x3 - delay 0x0 + delay 0 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 1, 2, 0, 15, RGB(15, 15, 6) @;Garbage green createsprite gSpriteTemplate_CorrosiveGasSmoke, ANIM_ATTACKER, 0x7a, 0x3, 0xfff2, 0x12, 0x2e - delay 0x0 + delay 0 createsprite gSpriteTemplate_CorrosiveGasSmoke, ANIM_ATTACKER, 0x79, 0x3, 0xe, 0xfff2, 0x2e - delay 0x0 + delay 0 createsprite gSpriteTemplate_CorrosiveGasSmoke, ANIM_ATTACKER, 0x78, 0x3, 0xfff4, 0xfff6, 0x2e - delay 0x0 + delay 0 createsprite gSpriteTemplate_CorrosiveGasSmoke, ANIM_ATTACKER, 0x77, 0x3, 0xe, 0xe, 0x2e - delay 0x0 + delay 0 createsprite gSpriteTemplate_CorrosiveGasSmoke, ANIM_ATTACKER, 0x76, 0x3, 0x0, 0x0, 0x2e - delay 0x0 + delay 0 createsprite gSpriteTemplate_CorrosiveGasSmoke, ANIM_ATTACKER, 0x7b, 0x3, 0x4, 0x4, 0x1e waitforvisualfinish playsewithpan SE_M_TOXIC, SOUND_PAN_TARGET @@ -14853,28 +15260,28 @@ gBattleAnimMove_JungleHealing:: waitbgfadeout createsprite gIngrainRootSpriteTemplate, ANIM_ATTACKER, 2, 0x10, 0x1a, 0xffff, 0x2, 0x96 playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER - delay 0xa + delay 10 createsprite gIngrainRootSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x14, 0x1, 0x1, 0x8c playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER - delay 0xa + delay 10 createsprite gIngrainRootSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0x16, 0x1, 0x0, 0x82 playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER - delay 0xa + delay 10 createsprite gIngrainRootSpriteTemplate, ANIM_ATTACKER, 2, 0xfff0, 0x19, 0xffff, 0x3, 0x78 playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER - delay 0x28 + delay 40 createsprite gIngrainOrbSpriteTemplate, ANIM_ATTACKER, 3, 0x20, 0x1a, 0xffff, 0x3, 0x1e - delay 0x5 + delay 5 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER - delay 0x5 + delay 5 createsprite gIngrainOrbSpriteTemplate, ANIM_ATTACKER, 3, 0xffd0, 0x14, 0x1, 0x2, 0x1e playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER - delay 0x5 + delay 5 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER - delay 0x5 + delay 5 createsprite gIngrainOrbSpriteTemplate, ANIM_ATTACKER, 3, 0x30, 0x1a, 0xfffe, 0x3, 0x12 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER - delay 0xa + delay 10 playsewithpan SE_M_STAT_INCREASE, 0xc0 createvisualtask AnimTask_StatusClearedEffect, 0x2, 0x1 waitforvisualfinish @@ -14922,22 +15329,22 @@ gBattleAnimMove_WickedBlow:: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_PAIN_SPLIT loadspritegfx ANIM_TAG_SPARKLE_4 - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_PAIN_SPLIT, 0x0, 0x9, 0x9, 0x1F - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_FOCUS_ENERGY, 0x0, 0x8, 0x8, 0x1F + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PAIN_SPLIT, 0, 9, 9, RGB_RED + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FOCUS_ENERGY, 0, 8, 8, RGB_RED playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call WickedBlowBuffEffect - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_BLACK createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call WickedBlowBuffEffect - delay 0x8 + delay 8 call WickedBlowBuffEffect waitforvisualfinish fadetobg BG_DARK waitbgfadeout playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 28, 0, 0, 5 - delay 0x5 + delay 5 createsprite gSpriteTemplate_WickedBlowFist, ANIM_TARGET, 4, ANIM_TARGET, 0, 0, 16, 32 delay 6 loopsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET, 0x4, 0x6 @@ -14966,13 +15373,13 @@ gBattleAnimMove_WickedBlow:: WickedBlowBuffEffect: createsprite gPowerTripFocusEnergyTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gPowerTripFocusEnergyTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gPowerTripFocusEnergyTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return @@ -15044,7 +15451,7 @@ gBattleAnimMove_ThunderCage:: createsprite gThunderWaveSpriteTemplate, ANIM_TARGET, 2, -16, 16 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 50, 1 call ThunderCageBolts - delay 0x4 + delay 4 createsprite gThunderWaveSpriteTemplate, ANIM_TARGET, 2, -16, -16 delay 4 createsprite gThunderWaveSpriteTemplate, ANIM_TARGET, 2, -16, 0 @@ -15056,24 +15463,24 @@ gBattleAnimMove_ThunderCage:: end ThunderCageBolts: createvisualtask AnimTask_ElectricBolt, 2, 25, -40, 1 - delay 0x9 + delay 9 createvisualtask AnimTask_ElectricBolt, 2, -25, -40, 1 - delay 0x9 + delay 9 createvisualtask AnimTask_ElectricBolt, 2, 0, -40, 1 - delay 0x9 + delay 9 return @Credits to Skeli gBattleAnimMove_DragonEnergy:: loadspritegfx ANIM_TAG_HYDRO_PUMP - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_HYDRO_PUMP, 0x0, 0xC, 0xC, 0x2C5E @;Regidrago Reddish Reddish, Purple + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HYDRO_PUMP, 0, 12, 12, RGB(30, 2, 11) @;Regidrago Reddish Reddish, Purple monbg ANIM_TARGET playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 4, 0, 11, RGB(31, 28, 31) @;Pinkish White waitforvisualfinish playsewithpan SE_M_DETECT, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x1, 0x10, 0x0, 0x2C5E @;Regidrago Reddish Reddish, Purple + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 1, 16, 0, RGB(30, 2, 11) @;Regidrago Reddish Reddish, Purple createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, -120, 0, 0, 1 @;Slide off off, screen waitforvisualfinish playsewithpan SE_M_SOLAR_BEAM, SOUND_PAN_TARGET @@ -15117,9 +15524,9 @@ gBattleAnimMove_DragonEnergy:: DragonEnergyShot: createsprite gSpriteTemplate_DragonEnergyShot, ANIM_TARGET, 2, 0x19 - delay 0x1 + delay 1 createsprite gSpriteTemplate_DragonEnergyShot, ANIM_TARGET, 2, 0x19 - delay 0x1 + delay 1 return @@ -15148,14 +15555,14 @@ gBattleAnimMove_FieryWrath:: loadspritegfx ANIM_TAG_PURPLE_RING monbg ANIM_DEF_PARTNER playsewithpan SE_M_SACRED_FIRE2, 0xc0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x2, 0x0, 0xE, 0x0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x4, 0x0, 0x8, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 2, 0, 14, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 4, 0, 8, RGB_RED createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 32, 1 call DragonClawFireSpiral call DragonClawFireSpiral waitforvisualfinish loopsewithpan SE_M_PSYBEAM, SOUND_PAN_TARGET, 20, 3 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_DEF_SIDE, 0x4, 0x0, 0xF, 0x3006 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_DEF_SIDE, 4, 0, 15, RGB(6, 0, 12) createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 60, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 4, 0, 60, 1 call FieryWrathGeyser @@ -15163,9 +15570,9 @@ gBattleAnimMove_FieryWrath:: call FieryWrathGeyser call FieryWrathGeyser waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x8, 0x0, 0x1F - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_DEF_SIDE, 0x2, 0x9, 0x0, 0x3006 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xE, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 8, 0, RGB_RED + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_DEF_SIDE, 2, 9, 0, RGB(6, 0, 12) + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 14, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end @@ -15173,52 +15580,52 @@ gBattleAnimMove_FieryWrath:: FieryWrathGeyser: createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfffc, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0xfffc, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0x100D, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0x4, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfff0, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0xfff0, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfffc, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0xfffc, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0x100D, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0x4, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfff0, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0xfff0, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfffc, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0xfffc, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0x100D, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0x4, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfff0, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0xfff0, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfffc, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0xfffc, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0x100D, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0x4, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfff0, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0xfff0, 0x10 - delay 0x0 + delay 0 return @@ -15234,23 +15641,23 @@ gBattleAnimMove_ThunderousKick:: setalpha 12, 8 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET createsprite gMegaPunchKickSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x32 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0x7, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 7, RGB_WHITE createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 2, 0, 22, 1 call ZingZapSparks1 - delay 0xA + delay 10 call ZingZapSparks2 - delay 0xA + delay 10 call ZingZapSparks1 - delay 0xA + delay 10 call ZingZapSparks2 - delay 0x3 + delay 3 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 48, 3, 0, 4 - delay 0x7 + delay 7 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 22, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x10, 0x0, 0x7fff - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x1f, 0x3, 0x1, 0x0, 0x8, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 16, 0, RGB_WHITE + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 clearmonbg ANIM_TARGET @@ -15264,13 +15671,13 @@ gBattleAnimMove_GlacialLance:: loadspritegfx ANIM_TAG_ICICLE_SPEAR loadspritegfx ANIM_TAG_ICE_CUBE loadspritegfx ANIM_TAG_ICE_CRYSTALS @ice - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xA, 0x3C00 @;Royal Blue + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 10, RGB(0, 0, 15) @;Royal Blue monbg ANIM_TARGET playsewithpan SE_M_HAIL, SOUND_PAN_TARGET createvisualtask AnimTask_CentredFrozenIceCube, ANIM_TARGET, 0 createsprite gSpriteTemplate_GlacialLance, ANIM_TARGET, 2, 0, 40, 0, 0, 40, 50, 10 delay 60 - createvisualtask AnimTask_FlashAnimTagWithColor, 0x2, ANIM_TAG_ICICLE_SPEAR, 0x4, 0x1, 0x7FFF, 0x10, 0x0, 0x0 + createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_ICICLE_SPEAR, 4, 1, RGB_WHITE, 16, 0, 0 playsewithpan SE_M_DETECT, SOUND_PAN_TARGET delay 38 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET @@ -15279,44 +15686,62 @@ gBattleAnimMove_GlacialLance:: delay 4 call IceCrystalEffectLong waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0xA, 0x0, 0x3C00 @;Royal Blue + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 10, 0, RGB(0, 0, 15) @;Royal Blue waitforvisualfinish clearmonbg ANIM_TARGET end gBattleAnimMove_AstralBarrage:: - loadspritegfx ANIM_TAG_FLAT_ROCK - loadspritegfx ANIM_TAG_ICE_CRYSTALS - loadspritegfx ANIM_TAG_GHOSTLY_SPIRIT - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_FLAT_ROCK, 0x0, 0xA, 0xA, RGB(2, 1, 4) - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_ICE_CRYSTALS, 0x0, 0xA, 0xA, RGB(2, 1, 4) + loadspritegfx ANIM_TAG_PURPLE_FLAME + loadspritegfx ANIM_TAG_SHADOW_BALL + loadspritegfx ANIM_TAG_THIN_RING + loadspritegfx ANIM_TAG_ICE_CHUNK + loadspritegfx ANIM_TAG_HANDS_AND_FEET monbg ANIM_ATK_PARTNER splitbgprio ANIM_ATTACKER + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER setalpha 12, 8 fadetobg BG_GHOST waitbgfadein - createsprite gShakeMonOrPlatformSpriteTemplate, ANIM_ATTACKER, 2, 4, 1, 180, 1 - createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 5, 20, 0, 5 - createsprite gSuperpowerRockSpriteTemplate, ANIM_ATTACKER, 41, 200, 96, 1, 120 + playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER + createvisualtask AnimTask_GrudgeFlames, 3 + createsprite gBlackHoleEclipseHoleUserSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_ATTACKER, 0 + createsprite gBlackHoleEclipseBlueRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0 delay 8 - createsprite gSuperpowerRockSpriteTemplate, ANIM_ATTACKER, 41, 20, 248, 4, 112 + createsprite gBlackHoleEclipseBlackRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0 delay 8 - createsprite gSuperpowerRockSpriteTemplate, ANIM_ATTACKER, 41, 130, 160, 2, 104 + createsprite gBlackHoleEclipseBlueRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0 delay 8 - createsprite gSuperpowerRockSpriteTemplate, ANIM_ATTACKER, 41, 160, 192, 0, 96 + createsprite gBlackHoleEclipseBlackRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0 delay 8 - createsprite gSuperpowerRockSpriteTemplate, ANIM_ATTACKER, 41, 60, 288, 3, 88 - delay 74 - panse SE_M_BLIZZARD, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 - call BlizzardIceCrystals - call BlizzardIceCrystals - playsewithpan SE_M_BLIZZARD2, SOUND_PAN_TARGET + unloadspritegfx ANIM_TAG_SHADOW_BALL + unloadspritegfx ANIM_TAG_THIN_RING + unloadspritegfx ANIM_TAG_ICE_CHUNK + unloadspritegfx ANIM_TAG_HANDS_AND_FEET waitforvisualfinish - playsewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET + loadspritegfx ANIM_TAG_WISP_FIRE + loadspritegfx ANIM_TAG_EXPLOSION + loadspritegfx ANIM_TAG_GHOSTLY_SPIRIT + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_PURPLE + call AstralBarrageFlames1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 3, 50, 1 + call AstralBarrageFlames2 + call AstralBarrageFlames3 + call AstralBarrageFlames4 + call AstralBarrageFlames5 + waitforvisualfinish + playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET createspriteontargets gCurseGhostSpriteTemplate, ANIM_TARGET, 3, 2, 8, -5, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 8, 0, 16, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 8, 0, 16, 1 + createsprite gWillOWispFireSpriteTemplate, ANIM_TARGET, 2, 0 + createsprite gWillOWispFireSpriteTemplate, ANIM_TARGET, 2, 42 + createsprite gWillOWispFireSpriteTemplate, ANIM_TARGET, 2, 84 + createsprite gWillOWispFireSpriteTemplate, ANIM_TARGET, 2, 126 + createsprite gWillOWispFireSpriteTemplate, ANIM_TARGET, 2, 168 + createsprite gWillOWispFireSpriteTemplate, ANIM_TARGET, 2, 210 waitforvisualfinish clearmonbg ANIM_ATK_PARTNER restorebg @@ -15324,6 +15749,76 @@ gBattleAnimMove_AstralBarrage:: blendoff delay 1 end +AstralBarrageFlames1: + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, -30, -20 @;Top left + delay 2 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 6, 5, 3, 0 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, 10, 20 @;Bottom left + delay 2 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, -30, -20 @;Top right + delay 2 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, -16, -15, 3, 0 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, 10, 20 @;Bottom right + delay 2 + return +AstralBarrageFlames2: + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, -30, -20 @;Top left + delay 2 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 16, -5, 3, 0 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, 10, 20 @;Bottom left + delay 2 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, -30, -20 @;Top right + delay 2 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, -12, 18, 3, 0 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, 10, 20 @;Bottom right + delay 2 + return +AstralBarrageFlames3: + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, -30, -20 @;Top left + delay 2 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 0, 5, 3, 0 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, 10, 20 @;Bottom left + delay 2 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, -30, -20 @;Top right + delay 2 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 6, 5, 3, 0 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, 10, 20 @;Bottom right + delay 2 + return +AstralBarrageFlames4: + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, -30, -20 @;Top left + delay 2 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, -16, -15, 3, 0 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, 10, 20 @;Bottom left + delay 2 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, -30, -20 @;Top right + delay 2 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 16, -5, 3, 0 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, 10, 20 @;Bottom right + delay 2 + return +AstralBarrageFlames5: + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, -30, -20 @;Top left + delay 2 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, -12, 18, 3, 0 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, 10, 20 @;Bottom left + delay 2 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, -30, -20 @;Top right + delay 2 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 0, 5, 3, 0 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, 10, 20 @;Bottom right + delay 2 + return @Credits to Skeli @@ -15346,25 +15841,25 @@ gBattleAnimMove_EerieSpell:: EerieSpellConvergingFlames: createsprite gSpriteTemplate_EerieSpellFlame, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0xffe0, 0x10 - delay 0x2 + delay 2 createsprite gSpriteTemplate_EerieSpellFlame, ANIM_TARGET, 2, 0x1, 0x0, 0x16, 0xffea, 0x10 - delay 0x2 + delay 2 createsprite gSpriteTemplate_EerieSpellFlame, ANIM_TARGET, 2, 0x1, 0x0, 0x1e, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gSpriteTemplate_EerieSpellFlame, ANIM_TARGET, 2, 0x1, 0x0, 0x14, 0x14, 0x10 - delay 0x2 + delay 2 createsprite gSpriteTemplate_EerieSpellFlame, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0x1c, 0x10 - delay 0x2 + delay 2 createsprite gSpriteTemplate_EerieSpellFlame, ANIM_TARGET, 2, 0x1, 0x0, 0xffed, 0x13, 0x10 - delay 0x2 + delay 2 createsprite gSpriteTemplate_EerieSpellFlame, ANIM_TARGET, 2, 0x1, 0x0, 0xffe5, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gSpriteTemplate_EerieSpellFlame, ANIM_TARGET, 2, 0x1, 0x0, 0xffee, 0xffee, 0x10 - delay 0x2 + delay 2 createsprite gSpriteTemplate_EerieSpellFlame, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0xffe7, 0x10 - delay 0x2 + delay 2 createsprite gSpriteTemplate_EerieSpellFlame, ANIM_TARGET, 2, 0x1, 0x0, 0x11, 0xffef, 0x10 - delay 0x2 + delay 2 createsprite gSpriteTemplate_EerieSpellFlame, ANIM_TARGET, 2, 0x1, 0x0, 0x17, 0x0, 0x10 return @@ -15373,16 +15868,16 @@ EerieSpellConvergingFlames: gBattleAnimMove_DireClaw:: loadspritegfx ANIM_TAG_SLASH loadspritegfx ANIM_TAG_POISON_BUBBLE - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SLASH, 0x0, 0xC, 0xC, 0x6038 @;Purple + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SLASH, 0, 12, 12, RGB(24, 1, 24) @;Purple createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4 delay 6 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0xfff0, 0x0 - delay 0x2 + delay 2 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 36, 1 - delay 0x2 + delay 2 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x0 call PoisonBubblesEffect @@ -15398,20 +15893,20 @@ gBattleAnimMove_PsyshieldBash:: monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x0, 0xB, 0x7FAF @;Light blue + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 11, RGB(15, 29, 31) @;Light blue createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -24, 8, 23, 10, 56, 10 - delay 0x23 + delay 35 createsprite gSpriteTemplate_PsyshieldBashHit, ANIM_ATTACKER, 4, -10, 0x0, 0x1, 0x0 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - delay 0x1 + delay 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, -16, 0, 0, 4 waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish - delay 0x2 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0xB, 0x0, 0x7FAF @;Light blue + delay 2 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 11, 0, RGB(15, 29, 31) @;Light blue createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x5 - delay 0x3 + delay 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x0, 0x7 waitforvisualfinish call UnsetPsychicBg @@ -15443,11 +15938,11 @@ gBattleAnimMove_StoneAxe:: splitbgprio ANIM_TARGET playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gSpriteTemplate_StoneAxeSlash, ANIM_TARGET, 2, 50, -10, 100, 8, 1 @;Move left - delay 0x5 + delay 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 16, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET call StoneAxeRockFragments - delay 0x8 + delay 8 call StoneAxeRockFragments waitforvisualfinish clearmonbg ANIM_TARGET @@ -15472,7 +15967,7 @@ gBattleAnimMove_SpringtideStorm:: playsewithpan SE_M_GUST, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 88, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 88, 1 - createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 2, 6, 0, 11, 0x7ADF + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 2, 6, 0, 11, RGB(31, 22, 30) call HurricaneGustCentered call SpringtideStormHeartSwirl call HurricaneGustCentered @@ -15491,15 +15986,15 @@ gBattleAnimMove_SpringtideStorm:: SpringtideStormHeartSwirl: createspriteontargets gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 6, 0x0, 0x20, 0x210, 0x1e, 0xa, 0x32, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 6, 0x0, 0x24, 0x1e0, 0x14, 0xd, 0xffd2, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 6, 0x0, 0x25, 0x240, 0x14, 0x5, 0x2a, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 6, 0x0, 0x23, 0x190, 0x19, 0x8, 0xffd6, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 6, 0x0, 0x20, 0x200, 0x19, 0xd, 0x2e, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 6, 0x0, 0x25, 0x1d0, 0x1e, 0xc, 0xffce, ANIM_TARGET return @@ -15514,13 +16009,13 @@ gBattleAnimMove_MysticalPower:: monbg ANIM_TARGET splitbgprio ANIM_TARGET call PsystrikeInwardRing - delay 0xA + delay 10 call PsystrikeInwardRing - delay 0xA + delay 10 call PsystrikeInwardRing - delay 0xA + delay 10 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x6, 0x0, 0xB, 0x7FAF @;Light blue + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 6, 0, 11, RGB(15, 29, 31) @;Light blue createvisualtask AnimTask_ExtrasensoryDistortion, 0x5, 0x0 call MysticalPowerFoeRings createvisualtask AnimTask_ExtrasensoryDistortion, 0x5, 0x1 @@ -15529,7 +16024,7 @@ gBattleAnimMove_MysticalPower:: call MysticalPowerFoeTwoRingsOnly waitforvisualfinish clearmonbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0xB, 0x0, 0x7FAF @;Light blue + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 11, 0, RGB(15, 29, 31) @;Light blue call UnsetPsychicBg blendoff end @@ -15582,16 +16077,16 @@ gBattleAnimMove_WaveCrash:: loadspritegfx ANIM_TAG_SMALL_BUBBLES loadspritegfx ANIM_TAG_ICE_CRYSTALS @Bubbles on attacker monbg ANIM_DEF_PARTNER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0xB, 0x726A + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 11, RGB(10, 19, 28) createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -20, 8, 48, 8, 56, 6 call WaterfallBubblesOnAttacker waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 5, 1 call RisingWaterHitEffect waitforvisualfinish - delay 0x5 + delay 5 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0xB, 0x0, 0x726A + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 11, 0, RGB(10, 19, 28) clearmonbg ANIM_DEF_PARTNER waitforvisualfinish end @@ -15601,23 +16096,23 @@ gBattleAnimMove_WaveCrash:: gBattleAnimMove_Chloroblast:: loadspritegfx ANIM_TAG_THIN_RING loadspritegfx ANIM_TAG_HYDRO_PUMP - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_THIN_RING, 0x0, 0xA, 0xA, 0x03AC - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_HYDRO_PUMP, 0x0, 0xC, 0xC, 0x03AC - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x2, 0x0, 0x10, 0x0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0x10, 0x03AC - createvisualtask AnimTask_BlendNonAttackerPalettes, 0x2, 0x2, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_THIN_RING, 0, 10, 10, RGB(12, 29, 0) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HYDRO_PUMP, 0, 12, 12, RGB(12, 29, 0) + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 2, 0, 16, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 16, RGB(12, 29, 0) + createvisualtask AnimTask_BlendNonAttackerPalettes, 2, 2, 0, 16, RGB_BLACK playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER createsprite gThinRingShrinkingSpriteTemplate ANIM_ATTACKER, 0x28, 0, 0, 0, 0 - delay 0xe + delay 14 createsprite gThinRingShrinkingSpriteTemplate ANIM_ATTACKER, 0x28, 0, 0, 0, 0 - delay 0xe + delay 14 createsprite gThinRingShrinkingSpriteTemplate ANIM_ATTACKER, 0x28, 0, 0, 0, 0 waitforvisualfinish createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA, fadetobg BG_CHLOROBLAST waitbgfadeout - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x0, 0x10, 0x0, 0x0 - delay 0x10 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0, 16, 0, RGB_BLACK + delay 16 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 74, 1 createsoundtask SoundTask_LoopSEAdjustPanning, 0xf0, 0xFF00 | SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x1, 0x17, 0x0, 0x5 createvisualtask AnimTask_HorizontalShake, 5, ANIM_ATTACKER, 1, 67 @@ -15641,21 +16136,21 @@ gBattleAnimMove_Chloroblast:: call ChloroblastShot call ChloroblastShot waitforvisualfinish - delay 0x5 - createvisualtask AnimTask_BlendNonAttackerPalettes, 0x2, 0x2, 0x0, 0x0, 0x0 @;From Black - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0x10, 0x0, 0x03AC + delay 5 + createvisualtask AnimTask_BlendNonAttackerPalettes, 2, 2, 0, 0, RGB_BLACK @;From Black + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 16, 0, RGB(12, 29, 0) restorebg waitbgfadeout createvisualtask AnimTask_AllBattlersVisible, 0xA, clearmonbg ANIM_DEF_PARTNER waitbgfadein - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x2, 0x0, 0x0, 0x0 @;From Black + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 2, 0, 0, RGB_BLACK @;From Black end ChloroblastShot: createsprite gSpriteTemplate_ChloroblastShot, ANIM_TARGET, 2, 0, 0, 0x19 - delay 0x2 + delay 2 createsprite gSpriteTemplate_ChloroblastShot, ANIM_TARGET, 2, 0, 0, 0x19 - delay 0x2 + delay 2 return @Credits to Skeli @@ -15664,21 +16159,21 @@ gBattleAnimMove_MountainGale:: loadspritegfx ANIM_TAG_DRAGON_ASCENT_FOE @White Rock Colour monbg ANIM_TARGET call MountainGaleIceRock - delay 0x6 + delay 6 call MountainGaleIceRock - delay 0x6 + delay 6 call MountainGaleIceRock createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 24, 1 playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET - delay 0x6 + delay 6 call MountainGaleIceRock playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET - delay 0x6 + delay 6 call MountainGaleIceRock playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET - delay 0x6 + delay 6 playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET - delay 0x6 + delay 6 playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_TARGET @@ -15696,17 +16191,17 @@ gBattleAnimMove_VictoryDance:: loadspritegfx ANIM_TAG_HOLLOW_ORB createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 40, 6, 3, 3 playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER - delay 0x8 - createvisualtask AnimTask_BlendPalInAndOutByTag, 0x5, ANIM_TAG_HOLLOW_ORB, 0x0B1D, 0xe, 0x0, 0x3 @;Light orange + delay 8 + createvisualtask AnimTask_BlendPalInAndOutByTag, 5, ANIM_TAG_HOLLOW_ORB, RGB(29, 24, 2), 14, 0, 3 @;Light orange createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x0 createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x2b createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x55 createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x80 createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 0xaa createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 0xd5 - delay 0x1e + delay 30 playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER - delay 0x1e + delay 30 playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER waitforvisualfinish end @@ -15734,7 +16229,7 @@ gBattleAnimMove_HeadlongRush:: waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 42, 0, 0, 5 createsprite gSpriteTemplate_HeadlongRushImpact, ANIM_TARGET, 4, 0xfff6, 0x0, 0x1, 0x0 - delay 0x5 + delay 5 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 44, 1 call MaxQuake_DirtGeyser call MaxQuake_DirtGeyser @@ -15748,52 +16243,52 @@ MaxQuake_DirtGeyser: createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0003, 0x0005, 0x1, 0x0 createsprite gSpriteTemplate_MaxQuakeRockGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfffc, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0xfff5, 0xfff1, 0x1, 0x0 createsprite gSpriteTemplate_MaxQuakeDirtGeyser, ANIM_TARGET, 4, 0, 0x100D, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0008, 0xfffb, 0x1, 0x0 createsprite gSpriteTemplate_MaxQuakeDirtGeyser, ANIM_TARGET, 4, 0, 0x4, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0xfffa, 0x0012, 0x1, 0x0 createsprite gSpriteTemplate_MaxQuakeRockGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfff0, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0000, 0x0005, 0x1, 0x0 createsprite gSpriteTemplate_MaxQuakeDirtGeyser, ANIM_TARGET, 4, 0, 0xfffc, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0003, 0xfff5, ANIM_TARGET, 0x0 createsprite gSpriteTemplate_MaxQuakeDirtGeyser, ANIM_TARGET, 4, 0, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0xfff5, 0xffe1, ANIM_TARGET, 0x0 createsprite gSpriteTemplate_MaxQuakeRockGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0008, 0xffeb, ANIM_TARGET, 0x0 createsprite gSpriteTemplate_MaxQuakeDirtGeyser, ANIM_TARGET, 4, 0, 0xfff0, 0x10 - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0xfffa, 0x0002, ANIM_TARGET, 0x0 createsprite gSpriteTemplate_MaxQuakeDirtGeyser, ANIM_TARGET, 4, 0, 0xfffc, 0x10 - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0000, 0xfff5, ANIM_TARGET, 0x0 createsprite gSpriteTemplate_MaxQuakeRockGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0003, 0xffe5, ANIM_TARGET, 0x0 createsprite gSpriteTemplate_MaxQuakeDirtGeyser, ANIM_TARGET, 4, 0, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0xfff5, 0xffd1, ANIM_TARGET, 0x0 createsprite gSpriteTemplate_MaxQuakeDirtGeyser, ANIM_TARGET, 4, 0, 0xfff0, 0x10 - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0008, 0xffdb, ANIM_TARGET, 0x0 createsprite gSpriteTemplate_MaxQuakeRockGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfffc, 0x10 - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0xfffa, 0xfff2, ANIM_TARGET, 0x0 createsprite gSpriteTemplate_MaxQuakeDirtGeyser, ANIM_TARGET, 4, 0, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0000, 0xffe5, ANIM_TARGET, 0x0 createsprite gSpriteTemplate_MaxQuakeDirtGeyser, ANIM_TARGET, 4, 0, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_MaxQuakeRockGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfff0, 0x10 return @@ -15807,25 +16302,25 @@ gBattleAnimMove_BarbBarrage:: call BarbBarrageSpikeShoot loopsewithpan SE_M_DIG, SOUND_PAN_ATTACKER, 0x7, 0x3 createvisualtask AnimTask_FlailMovement, 2, ANIM_ATTACKER - delay 0x14 + delay 20 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 7, 0, 32, 1 call PoisonBubblesEffect clearmonbg ANIM_TARGET end BarbBarrageSpikeShoot: - delay 0x3 + delay 3 createsprite gSpriteTemplate_BarbBarrage, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0xfb00, 0x0, 0x3 - delay 0x0 + delay 0 createsprite gSpriteTemplate_BarbBarrage, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x0, 0x0500, 0x3 - delay 0x0 + delay 0 createsprite gSpriteTemplate_BarbBarrage, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x0, 0xfb00, 0x3 - delay 0x0 + delay 0 createsprite gSpriteTemplate_BarbBarrage, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x0500, 0x0300, 0x3 - delay 0x0 + delay 0 createsprite gSpriteTemplate_BarbBarrage, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0xfb00, 0x0300, 0x3 - delay 0x0 + delay 0 createsprite gSpriteTemplate_BarbBarrage, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x0500, 0xfd00, 0x3 - delay 0x0 + delay 0 createsprite gSpriteTemplate_BarbBarrage, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0xfb00, 0xfd00, 0x3 return @@ -15835,7 +16330,7 @@ BarbBarrageSpikeShoot: gBattleAnimMove_EsperWing:: loadspritegfx ANIM_TAG_PUNISHMENT_BLADES @Punishment Blade loadspritegfx ANIM_TAG_WHITE_FEATHER - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_WHITE_FEATHER, 0x0, 0xA, 0xA, 0x7DDE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_WHITE_FEATHER, 0, 10, 10, RGB(30, 14, 31) monbg ANIM_TARGET call SetPsychicBackground playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER @@ -15876,30 +16371,30 @@ gBattleAnimMove_BitterMalice:: playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET createvisualtask AnimTask_ScaryFace, 0x5 @ internally checks side createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 76, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0xF, 0x3006 @;Dark Purple - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_PURPLE_RING, 0x4, 0x0, 0xE, 0x3006 @;Dark Purple + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 4, 0, 15, RGB(6, 0, 12) @;Dark Purple + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PURPLE_RING, 4, 0, 14, RGB(6, 0, 12) @;Dark Purple call BitterMaliceSwirl call BitterMaliceSwirl call BitterMaliceSwirl - delay 0x4 @;Wait until the blends are reset after the scary face fades out + delay 4 @;Wait until the blends are reset after the scary face fades out call IceCrystalEffectShort waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0xF, 0x0, 0x3006 @;Dark Purple + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 15, 0, RGB(6, 0, 12) @;Dark Purple end BitterMaliceSwirl: createsprite gSpriteTemplate_BitterMaliceRing, ANIM_TARGET, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, 0x1 - delay 0x2 + delay 2 createsprite gSpriteTemplate_BitterMaliceRing, ANIM_TARGET, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, 0x1 - delay 0x2 + delay 2 createsprite gSpriteTemplate_BitterMaliceRing, ANIM_TARGET, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, 0x1 - delay 0x2 + delay 2 createsprite gSpriteTemplate_BitterMaliceRing, ANIM_TARGET, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, 0x1 - delay 0x2 + delay 2 createsprite gSpriteTemplate_BitterMaliceRing, ANIM_TARGET, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, 0x1 - delay 0x2 + delay 2 createsprite gSpriteTemplate_BitterMaliceRing, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, 0x1 - delay 0x2 + delay 2 return @ credits to Skeli @@ -15908,8 +16403,8 @@ gBattleAnimMove_Shelter:: loadspritegfx ANIM_TAG_SHELL_RIGHT playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShellSmashShrinkAttacker, 0x2 - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_SHELL_LEFT, 0x1, 0x0, 0xE, 0x6B5A @ light light, gray - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_SHELL_RIGHT, 0x1, 0x0, 0xE, 0x6B5A @ light light, gray + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SHELL_LEFT, 1, 0, 14, RGB(26, 26, 26) @ light light, gray + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SHELL_RIGHT, 1, 0, 14, RGB(26, 26, 26) @ light light, gray createsprite gShellSmashRightShellSpriteTemplate, ANIM_ATTACKER, 2, 0xffd7, 0x0, 0x2, 0x333, 0x0, 10, 30 createsprite gShellSmashLeftShellSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0x0, 0x6, 0xfccd, 0x0, 10, 30 createvisualtask AnimTask_FadeOutParticles, 0x2, 0 @@ -15929,20 +16424,20 @@ gBattleAnimMove_TripleArrows:: waitforvisualfinish playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 6, 6, 1 - delay 0x4 + delay 4 playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER createsprite gSpiritShackleArrowTemplate, ANIM_TARGET, 2, -40, 0, 0, 0, TRIPLE_ARROW_FLY_TIME - delay 0x3 + delay 3 playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER createsprite gSpiritShackleArrowTemplate, ANIM_TARGET, 2, 40, 0, 0, 0, TRIPLE_ARROW_FLY_TIME - delay 0x3 + delay 3 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 10, 1 playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER createvisualtask AnimTask_IsAttackerPlayerSide, 0x2, jumpargeq 0x7, FALSE, TripleArrowsOnOpponent createsprite gSpiritShackleArrowTemplate, ANIM_TARGET, 2, 0, -60, 0, 0, TRIPLE_ARROW_FLY_TIME TripleArrowsEnd: - delay 0x3 + delay 3 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end @@ -15962,11 +16457,11 @@ gBattleAnimMove_InfernalParade:: playsewithpan SE_M_PSYBEAM, 0xc0 waitbgfadein createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, 10, 20 @;Bottom left - delay 0x3 + delay 3 createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, -30, -20 @;Top right - delay 0x3 + delay 3 createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, 10, 20 @;Bottom right - delay 0x3 + delay 3 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 call InfernalFlames call InfernalFlames @@ -15980,20 +16475,20 @@ gBattleAnimMove_InfernalParade:: createsprite gWillOWispFireSpriteTemplate, ANIM_TARGET, 2, 0xa8 createsprite gWillOWispFireSpriteTemplate, ANIM_TARGET, 2, 0xd2 waitforvisualfinish - delay 0xC + delay 12 restorebg waitbgfadein clearmonbg ANIM_TARGET end InfernalFlames: createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, -30, -20 @;Top left - delay 0x3 + delay 3 createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, 10, 20 @;Bottom left - delay 0x3 + delay 3 createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, -30, -20 @;Top right - delay 0x3 + delay 3 createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, 10, 20 @;Bottom right - delay 0x3 + delay 3 return @@ -16004,33 +16499,33 @@ gBattleAnimMove_CeaselessEdge:: playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 44, 0, 0, 5 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x10, 0x10, 0x1F @;Fully to to, Red - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_ATTACKER | F_PAL_TARGET), 0x0, 0x10, 0x10, 0x0 @;Fully to to, Black + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 16, 16, RGB_RED @;Fully to to, Red + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_ATTACKER | F_PAL_TARGET), 0, 16, 16, RGB_BLACK @;Fully to to, Black createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xa, - delay 0x10 + delay 16 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 48, 1 call CeaselessEdgeSlashes call CeaselessEdgeSlashes call CeaselessEdgeSlashes waitforvisualfinish - delay 0x8 + delay 8 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 waitforvisualfinish createvisualtask AnimTask_AllBattlersVisible, 0xA, - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x1, 0x10, 0x0, 0x7FFF @;From White + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 1, 16, 0, RGB_WHITE @;From White waitforvisualfinish end CeaselessEdgeSlashes: playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSpriteTemplate_CeaselessEdgeSlash, ANIM_TARGET, 2, 8, 0, FALSE, FALSE - delay 0x4 + delay 4 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSpriteTemplate_CeaselessEdgeSlash, ANIM_TARGET, 2, -8, -8, TRUE, FALSE - delay 0x4 + delay 4 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSpriteTemplate_CeaselessEdgeSlash, ANIM_TARGET, 2, -8, 0, TRUE, TRUE - delay 0x4 + delay 4 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSpriteTemplate_CeaselessEdgeSlash, ANIM_TARGET, 2, 8, -4, FALSE, TRUE return @@ -16043,7 +16538,7 @@ gBattleAnimMove_BleakwindStorm:: playsewithpan SE_M_GUST, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 88, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 88, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 4, 0, 11, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 4, 0, 11, RGB_WHITE call HurricaneGustCentered call BleakwindStormIceSwirl call HurricaneGustCentered @@ -16058,20 +16553,20 @@ gBattleAnimMove_BleakwindStorm:: call BleakwindStormIceSwirl waitforvisualfinish stopsound - createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 1, 11, 0, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 1, 11, 0, RGB_WHITE waitforvisualfinish end BleakwindStormIceSwirl: createspriteontargets gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 6, 0x0, 0x20, 0x210, 0x1e, 0xa, 0x32, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 6, 0x0, 0x24, 0x1e0, 0x14, 0xd, 0xffd2, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 6, 0x0, 0x25, 0x240, 0x14, 0x5, 0x2a, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 6, 0x0, 0x23, 0x190, 0x19, 0x8, 0xffd6, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 6, 0x0, 0x20, 0x200, 0x19, 0xd, 0x2e, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 6, 0x0, 0x25, 0x1d0, 0x1e, 0xc, 0xffce, ANIM_TARGET return @@ -16087,7 +16582,7 @@ gBattleAnimMove_WildboltStorm:: playsewithpan SE_M_GUST, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 88, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 88, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 4, 0, 11, 0x07FE + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 4, 0, 11, RGB(30, 31, 1) call HurricaneGustCentered call WildboltStormSparkSwirl call HurricaneGustCentered @@ -16102,22 +16597,22 @@ gBattleAnimMove_WildboltStorm:: call WildboltStormSparkSwirl waitforvisualfinish stopsound - createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 1, 11, 0, 0x07FE + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 1, 11, 0, RGB(30, 31, 1) call UnsetPsychicBg waitforvisualfinish end WildboltStormSparkSwirl: createspriteontargets gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 6, 0x0, 0x20, 0x210, 0x1e, 0xa, 0x32, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 6, 0x0, 0x24, 0x1e0, 0x14, 0xd, 0xffd2, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 6, 0x0, 0x25, 0x240, 0x14, 0x5, 0x2a, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 6, 0x0, 0x23, 0x190, 0x19, 0x8, 0xffd6, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 6, 0x0, 0x20, 0x200, 0x19, 0xd, 0x2e, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 6, 0x0, 0x25, 0x1d0, 0x1e, 0xc, 0xffce, ANIM_TARGET return @@ -16126,11 +16621,11 @@ WildboltStormSparkSwirl: gBattleAnimMove_SandsearStorm:: loadspritegfx ANIM_TAG_GUST loadspritegfx ANIM_TAG_SMALL_EMBER - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_GUST, 0x0, 0xA, 0xA, 0x190B + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_GUST, 0, 10, 10, RGB(11, 8, 6) playsewithpan SE_M_GUST, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 88, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 88, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 4, 0, 11, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 4, 0, 11, RGB_RED call HurricaneGustCentered call SandsearStormFireSpin call HurricaneGustCentered @@ -16145,21 +16640,21 @@ gBattleAnimMove_SandsearStorm:: call SandsearStormFireSpin waitforvisualfinish stopsound - createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 1, 11, 0, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 1, 11, 0, RGB_RED waitforvisualfinish end SandsearStormFireSpin: createspriteontargets gFireSpinSpriteTemplate, ANIM_TARGET, 2, 6, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gFireSpinSpriteTemplate, ANIM_TARGET, 2, 6, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gFireSpinSpriteTemplate, ANIM_TARGET, 2, 6, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gFireSpinSpriteTemplate, ANIM_TARGET, 2, 6, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gFireSpinSpriteTemplate, ANIM_TARGET, 2, 6, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gFireSpinSpriteTemplate, ANIM_TARGET, 2, 6, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, ANIM_TARGET return @@ -16172,26 +16667,26 @@ gBattleAnimMove_LunarBlessing:: loadspritegfx ANIM_TAG_SMALL_EMBER @Yellow colour for ring monbg ANIM_ATK_PARTNER setalpha 16, 0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x0 - createvisualtask AnimTask_BlendNonAttackerPalettes, 0x2, 0x1, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK + createvisualtask AnimTask_BlendNonAttackerPalettes, 2, 1, 0, 16, RGB_BLACK waitforvisualfinish createsprite gMoonSpriteTemplate, ANIM_ATTACKER, 2, 0x78, 0x38 createvisualtask AnimTask_AlphaFadeIn, 0x3, 0x0, 0x10, 0x10, 0x0, 0x1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x7, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 7, 0, 16, RGB_BLACK loopsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER, 0x10, 0x3 call HealingEffect2 createsprite gSpriteTemplate_LunarDanceRing, ANIM_ATTACKER, 2, - delay 0x4 + delay 4 createsprite gSpriteTemplate_LunarDanceRing, ANIM_ATTACKER, 2, - delay 0x4 + delay 4 createsprite gSpriteTemplate_LunarDanceRing, ANIM_ATTACKER, 2, - delay 0x24 + delay 36 clearmonbg ANIM_ATK_PARTNER call HealingEffect - delay 0x28 + delay 40 createvisualtask AnimTask_AllBattlersInvisible, 0xA, createvisualtask AnimTask_MoonlightEndFade, 0x2, - delay 0x10 + delay 16 createvisualtask AnimTask_AllBattlersVisible, 0xA, waitforvisualfinish blendoff @@ -16205,7 +16700,7 @@ gBattleAnimMove_TakeHeart:: loadspritegfx ANIM_TAG_GUARD_RING playsewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER createsprite gSpriteTemplate_TakeHeartFallingHeart, ANIM_ATTACKER, 2, 0, 0x3a, 4, ANIM_ATTACKER - delay 0x15 + delay 21 loopsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER, 0x10, 0x4 createvisualtask AnimTask_StatusClearedEffect, 0x2, 0x0 call TakeHeartRings @@ -16225,7 +16720,7 @@ gBattleAnimMove_TakeHeart:: TakeHeartRings: createsprite gSpriteTemplate_TakeHeartRing, ANIM_ATTACKER, 2, - delay 0x4 + delay 4 return gBattleAnimMove_BitterBlade:: @@ -16480,7 +16975,7 @@ gBattleAnimMove_BurningBulwark:: monbg ANIM_ATK_PARTNER splitbgprio ANIM_ATTACKER waitplaysewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER 16 - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PROTECT, 0, 13, 13, 0x015B + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PROTECT, 0, 13, 13, RGB(27, 10, 0) createsprite gProtectSpriteTemplate, ANIM_ATTACKER, 2, 24, 0, 90 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 delay 2 @@ -16502,7 +16997,7 @@ gBattleAnimMove_BurningBulwark:: gBattleAnimMove_AlluringVoice:: loadspritegfx ANIM_TAG_THIN_RING - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x8, 0x6e7d + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 8, RGB(29, 19, 27) waitforvisualfinish createvisualtask SoundTask_PlayCryWithEcho, 5, FALSE createsprite gHyperVoiceRingSpriteTemplate, ANIM_ATTACKER, 0, 45, 0, 0, 0, 0, 0, 1 @@ -16510,13 +17005,13 @@ gBattleAnimMove_AlluringVoice:: createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 6, 1 createvisualtask AnimTask_ShakeBattlePlatforms, 2, 1, 0, 6, 1 createvisualtask SoundTask_WaitForCry, 5 - delay 0xA + delay 10 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 26, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 26, 1 waitforvisualfinish createvisualtask SoundTask_WaitForCry, 0x5 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x8, 0x0, 0x6e7d + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 8, 0, RGB(29, 19, 27) waitforvisualfinish end @@ -16727,7 +17222,7 @@ gBattleAnimMove_UpperHand:: splitbgprio ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET - createsprite gKarateChopSpriteTemplate, 2, 8, -16, 0, 0, 0, 10, 1, 3, 0 + createsprite gKarateChopSpriteTemplate, ANIM_ATK_PARTNER, 8, -16, 0, 0, 0, 10, 1, 3, 0 waitforvisualfinish playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gForcePalmSpriteTemplate 3, 4, 0, 0, 1, 2 @@ -16794,19 +17289,19 @@ gBattleAnimMove_PsychicNoise:: monbg ANIM_DEF_PARTNER call SetPsychicBackground createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 29, -12, 0 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -12, -29, 1 delay 16 createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 12, -29, 1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -29, -12, 0 delay 16 createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, -24, 1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, -24, 0 @@ -16868,7 +17363,7 @@ gBattleAnimMove_Trailblaze:: call TrailblazeVortex waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 24, 0, 0, 5 - delay 0x3 + delay 3 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 6, 0, 8, 1 @@ -16881,24 +17376,24 @@ gBattleAnimMove_Trailblaze:: createsprite gTropKickLeavesTemplate, ANIM_TARGET, 1, 0, 10, 112, -128, 40 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_ATTACKER waitforvisualfinish - delay 0x8 + delay 8 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x7 waitforvisualfinish clearmonbg ANIM_TARGET end TrailblazeVortex: createsprite gLeafTornadoVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gLeafTornadoVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gLeafTornadoVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gLeafTornadoVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gLeafTornadoVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gLeafTornadoVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 return gBattleAnimMove_LastRespects:: @@ -17292,32 +17787,32 @@ ElectroShotSetUp: loadspritegfx ANIM_TAG_GRAY_SMOKE @dispersal monbg ANIM_ATTACKER setalpha 14, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 0xE, 0x8 createsprite gGrowingChargeOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x0 call TechnoBlastCharging1 - delay 0xF + delay 15 call TechnoBlastCharging2 - delay 0xF + delay 15 call TechnoBlastCharging1 - delay 0xF + delay 15 call TechnoBlastCharging2 - delay 0xF + delay 15 call TechnoBlastCharging1 - delay 0xF + delay 15 call TechnoBlastCharging2 - delay 0xF + delay 15 call TechnoBlastCharging1 - delay 0xF + delay 15 call TechnoBlastCharging2 - delay 0xF + delay 15 call TechnoBlastCharging1 - delay 0xF + delay 15 call TechnoBlastCharging2 - delay 0xF + delay 15 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish blendoff clearmonbg ANIM_ATTACKER @@ -17328,7 +17823,7 @@ ElectroShotUnleash: loadspritegfx ANIM_TAG_ELECTRICITY loadspritegfx ANIM_TAG_SPARK_2 setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER delay 12 @@ -17360,7 +17855,7 @@ ElectroShotUnleash: call SparkBeam call SparkBeam delay 20 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 11, 0, RGB(31, 31, 22) waitforvisualfinish @@ -17388,6 +17883,7 @@ gBattleAnimMove_IvyCudgel:: end IvyCudgelFire: loadspritegfx ANIM_TAG_IVY_CUDGEL_FIRE + loadspritegfx ANIM_TAG_SMALL_EMBER createsprite gIvyCudgelFireSpriteTemplate, ANIM_TARGET, 2 delay 60 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 3, 0, 12, 4 @@ -17395,10 +17891,14 @@ IvyCudgelFire: createvisualtask AnimTask_SquishTarget, 0x2 delay 6 call WoodHammerImpact + call FireSpreadEffect + delay 4 + playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET waitforvisualfinish end IvyCudgelRock: loadspritegfx ANIM_TAG_IVY_CUDGEL_ROCK + loadspritegfx ANIM_TAG_ROCKS createsprite gIvyCudgelRockSpriteTemplate, ANIM_TARGET, 2 delay 60 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 3, 0, 12, 4 @@ -17406,10 +17906,16 @@ IvyCudgelRock: createvisualtask AnimTask_SquishTarget, 0x2 delay 6 call WoodHammerImpact + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -12, 32, 3, 4 + createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 8, 31, 2, 2 + createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -4, 28, 2, 3 + createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 12, 30, 4, 3 waitforvisualfinish end IvyCudgelWater: loadspritegfx ANIM_TAG_IVY_CUDGEL_WATER + loadspritegfx ANIM_TAG_SPLASH createsprite gIvyCudgelWaterSpriteTemplate, ANIM_TARGET, 2 delay 60 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 3, 0, 12, 4 @@ -17417,6 +17923,8 @@ IvyCudgelWater: createvisualtask AnimTask_SquishTarget, 0x2 delay 6 call WoodHammerImpact + playsewithpan SE_M_DIVE, SOUND_PAN_TARGET + createsprite gDiveWaterSplashSpriteTemplate, ANIM_TARGET, 3, 1 waitforvisualfinish end @@ -17424,7 +17932,7 @@ gBattleAnimMove_SpicyExtract:: loadspritegfx ANIM_TAG_SMALL_EMBER loadspritegfx ANIM_TAG_POISON_BUBBLE loadspritegfx ANIM_TAG_SMALL_BUBBLES - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_POISON_BUBBLE, 0, 12, 12, 0x061D @Orange + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_POISON_BUBBLE, 0, 12, 12, RGB(29, 16, 1) @Orange call SludgeBombProjectile call SludgeBombProjectile call SludgeBombProjectile @@ -17455,9 +17963,9 @@ gBattleAnimMove_SpicyExtract:: createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -16, 44, 20 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET call LetsSnuggleForeverTears - delay 0x8 + delay 8 call LetsSnuggleForeverTears - delay 0x8 + delay 8 call LetsSnuggleForeverTears waitsound waitforvisualfinish @@ -17542,11 +18050,11 @@ gBattleAnimMove_FilletAway:: 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 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 9, RGB_WHITE waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 2, 4, 4 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, RGB_WHITE waitforvisualfinish blendoff end @@ -17960,328 +18468,2686 @@ gBattleAnimMove_Thunderclap:: delay 4 createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_TARGET, 0, 0, 0, RGB_BLACK waitforvisualfinish - clearmonbg ANIM_ATK_PARTNER + clearmonbg ANIM_ATK_PARTNER + blendoff + waitforvisualfinish + end + +gBattleAnimMove_HardPress:: + 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 + +gBattleAnimMove_DragonCheer:: + 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 + +gBattleAnimMove_MalignantChain:: + 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 + +gBattleAnimMove_PopulationBomb:: + 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 + +gBattleAnimMove_RevivalBlessing:: + goto gBattleAnimMove_LunarBlessing + +gBattleAnimMove_TeraStarstorm:: + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_STARSTORM + loadspritegfx ANIM_TAG_YELLOW_STAR + loadspritegfx ANIM_TAG_IMPACT + fadetobg BG_COSMIC + waitbgfadein + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 15, 15, RGB_WHITE + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + createsprite gGrowingShockWaveOrbSpriteTemplate, ANIM_ATTACKER, 2 + delay 20 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + call TeraStarstormCreateBeam + delay 2 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + call TeraStarstormCreateBeam + delay 2 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + call TeraStarstormCreateBeam + delay 2 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + call TeraStarstormCreateBeam + delay 2 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + call TeraStarstormCreateBeam + delay 2 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + call TeraStarstormCreateBeam + delay 2 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + call TeraStarstormCreateBeam + delay 2 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + call TeraStarstormCreateBeam + delay 2 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + call TeraStarstormCreateBeam + delay 20 + playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER + delay 20 + playsewithpan SE_FALL, SOUND_PAN_ATTACKER + jumpifmovetypeequal TYPE_STELLAR, TeraStarstormStellar + goto TeraStarstormSingle +TeraStarstormStellar: + jumpifdoublebattle TeraStarstormDouble +TeraStarstormSingle: + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 0, 1 + delay 3 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 + delay 2 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 0, 1 + delay 3 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 + delay 2 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 + delay 3 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -8, 0, ANIM_TARGET, 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, -5, 30, 0, 1 + delay 3 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -16, 8, ANIM_TARGET, 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 5, 30, 0, 1 + delay 3 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 16, 8, ANIM_TARGET, 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 2 + delay 5 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 24, 0, ANIM_TARGET, 2 + delay 5 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 24, 16, ANIM_TARGET, 2 + waitforvisualfinish + restorebg + waitbgfadeout + end +TeraStarstormDouble: + loadspritegfx ANIM_TAG_EXPLOSION_2 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION_2, 0, 12, 12, RGB_WHITE + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 1, 1 + delay 2 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 1, 1 + delay 3 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 1, 1 + delay 2 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 1, 1 + delay 3 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 1, 1 + delay 2 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 1, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 10, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 10, 30, 1, 1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -8, 0, ANIM_TARGET, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_DEF_PARTNER, 2, -8, 0, ANIM_DEF_PARTNER, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 1, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 1, 1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -16, 0, ANIM_TARGET, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_DEF_PARTNER, 2, -16, 0, ANIM_DEF_PARTNER, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 1, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 1, 1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 16, 8, ANIM_TARGET, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_DEF_PARTNER, 2, 16, 8, ANIM_DEF_PARTNER, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 1, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 1, 1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 24, 0, ANIM_TARGET, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_DEF_PARTNER, 2, 24, 0, ANIM_DEF_PARTNER, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 5 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 24, 16, ANIM_TARGET, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_DEF_PARTNER, 2, 24, 16, ANIM_DEF_PARTNER, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 5 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -24, 16, ANIM_TARGET, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_DEF_PARTNER, 2, -24, 16, ANIM_DEF_PARTNER, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 5 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -24, -8, ANIM_TARGET, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_DEF_PARTNER, 2, -24, -8, ANIM_DEF_PARTNER, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 3, 50, 1 + call ExpandingForceExplosionGeyser + delay 5 + call ExpandingForceExplosionGeyser + delay 5 + waitforvisualfinish + restorebg + waitbgfadeout + end + +TeraStarstormCreateBeam:: + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, -3, 1, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 1, 0, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 3, -1, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, -2, 0, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 0, 1, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, -1, -1, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 2, 0, 0, 0, 20 + return + +gBattleAnimMove_TachyonCutter:: + loadspritegfx ANIM_TAG_CUT + loadspritegfx ANIM_TAG_BUBBLE + createsprite gTachyonCutterSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 0 + createsprite gTachyonCutterSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 1 + playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER + waitforvisualfinish + end + +gBattleAnimMove_SaltCure:: + loadspritegfx ANIM_TAG_SALT_PARTICLE + loadspritegfx ANIM_TAG_WATER_ORB + call SaltCureEffect + call SaltCureEffect + call SaltCureEffect + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + waitforvisualfinish + call gBattleAnimGeneral_SaltCureDamage + end + +SaltCureEffect: + createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 28, 384, 50, 8, 50, ANIM_TARGET + delay 2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 32, 240, 40, 11, -46, ANIM_TARGET + delay 2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 33, 416, 40, 4, 42, ANIM_TARGET + delay 2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 31, 288, 45, 6, -42, ANIM_TARGET + delay 2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 28, 448, 45, 11, 46, ANIM_TARGET + delay 2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 33, 464, 50, 10, -50, ANIM_TARGET + delay 2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + return + +gBattleAnimMove_GlaiveRush:: + loadspritegfx ANIM_TAG_CUT @Cut + loadspritegfx ANIM_TAG_SWORD @Sword + call SetHighSpeedBg + setalpha 12, 8 + playsewithpan SE_M_SWORDS_DANCE, SOUND_PAN_ATTACKER + createsprite gSwordsDanceBladeSpriteTemplate, ANIM_ATTACKER, 2, 0, 0 + delay 22 + createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_SWORD, 2, 2, RGB(18, 31, 31), 16, 0, 0 + waitforvisualfinish + delay 1 + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_DRAGON_ASCENT + monbg ANIM_ATTACKER + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_DRAGON_ASCENT, 0, 10, 10, RGB(0, 0, 31) @Blue + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 0, 16, RGB_WHITE + delay 4 + createvisualtask AnimTask_AttackerFadeToInvisible, 5, 0 + waitforvisualfinish + createvisualtask SoundTask_PlaySE2WithPanning, 5, 238, SOUND_PAN_ATTACKER + createsprite gGlaiveRushSpriteTemplate, ANIM_TARGET, 2 + delay 14 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, 1, 0 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 6, 0, 12, 1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_ATTACKER | F_PAL_BG | F_PAL_ANIM_1 | F_PAL_ANIM_2), 2, 16, 0, RGB(26, 31, 0) + waitforvisualfinish + delay 3 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 15, 0, RGB_WHITE + waitforvisualfinish + clearmonbg ANIM_ATTACKER + call UnsetHighSpeedBg + end + +gBattleAnimMove_ArmorCannon:: + loadspritegfx ANIM_TAG_HANDS_AND_FEET + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_ELECTRIC_ORBS + loadspritegfx ANIM_TAG_GUST + loadspritegfx ANIM_TAG_FLASH_CANNON_BALL + monbg ANIM_ATTACKER + setalpha 13, 8 + fadetobg BG_FIRE + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 2560, 0, 1, -1 + waitbgfadein + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HANDS_AND_FEET, 0, 12, 12, RGB(31, 0, 0) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 15, 15, RGB(31, 0, 0) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 15, 15, RGB(31, 0, 0) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FLASH_CANNON_BALL, 0, 15, 15, RGB(31, 16, 0) + createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 60, 2, 12 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 30 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 30 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + createsprite gFlashCannonGrayChargeTemplate, ANIM_ATTACKER, 2, 0 + delay 25 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 20 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 15 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 10 + delay 6 + loopsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER, 6, 5 + waitforvisualfinish + playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER + createsprite gFlashCannonBallMovementTemplate, ANIM_TARGET, 2, 0, 0, 21 + clearmonbg ANIM_ATTACKER + waitforvisualfinish + loadspritegfx ANIM_TAG_SMALL_EMBER @FireSpreadEffect + call FireSpreadEffect + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 15, 1 + delay 4 + playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + call UnsetPsychicBg + end + +gBattleAnimMove_TripleDive:: + loadspritegfx ANIM_TAG_SPARKLE_6 + loadspritegfx ANIM_TAG_ROUND_SHADOW + loadspritegfx ANIM_TAG_SPLASH + playsewithpan SE_M_DIVE, SOUND_PAN_ATTACKER + invisible ANIM_ATTACKER + createsprite gDiveWaterSplashSpriteTemplate, ANIM_ATTACKER, 3, 0 + call DiveSetUpWaterDroplets + call DiveSetUpWaterDroplets + call DiveSetUpWaterDroplets + call DiveSetUpWaterDroplets + call DiveSetUpWaterDroplets + loadspritegfx ANIM_TAG_WATER_IMPACT + loadspritegfx ANIM_TAG_SMALL_BUBBLES + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gDiveWaterSplashSpriteTemplate, ANIM_TARGET, 131, 1 + call DiveAttackWaterDroplets + call DiveAttackWaterDroplets + call DiveAttackWaterDroplets + call DiveAttackWaterDroplets + call DiveAttackWaterDroplets + delay 12 + call RisingWaterHitEffect + waitforvisualfinish + visible ANIM_ATTACKER + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +gBattleAnimMove_Doodle:: + loadspritegfx ANIM_TAG_PENCIL + monbg ANIM_TARGET + createvisualtask AnimTask_SketchDrawMon, 2 + createsprite gPencilSpriteTemplate, ANIM_TARGET, 2 + waitforvisualfinish + clearmonbg ANIM_TARGET + delay 12 + call GrowthEffect + waitforvisualfinish + call GrowthEffect + waitforvisualfinish + end + +gBattleAnimMove_Ruination:: + setalpha 0, 16 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 1, 0, 20, 1 + playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER + waitforvisualfinish + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 3, 0, 48, 1 + createvisualtask AnimTask_BlendMonInAndOut, 2, ANIM_ATTACKER, RGB(31, 6, 1), 12, 4, 1 + waitforvisualfinish + delay 20 + delay 1 + createvisualtask AnimTask_InitMementoShadow, 2 + delay 1 + createvisualtask AnimTask_MoveAttackerMementoShadow, 5 + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER + delay 48 + playsewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER + waitforvisualfinish + createvisualtask AnimTask_MementoHandleBg, 2 + delay 12 + setalpha 0, 16 + delay 1 + monbg_static ANIM_TARGET + createvisualtask AnimTask_MoveTargetMementoShadow, 5 + playsewithpan SE_M_PSYBEAM, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg_static ANIM_TARGET + delay 1 + blendoff + delay 1 + end + +gBattleAnimMove_CollisionCourse:: + loadspritegfx ANIM_TAG_SMALL_EMBER + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_ELECTRICITY + monbg ANIM_ATTACKER + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 8, RGB_BLACK + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 10, 10, RGB(31, 0, 0) + waitforvisualfinish + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 2 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 6 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 10 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + clearmonbg ANIM_ATTACKER + createsprite gVoltTackleOrbSlideSpriteTemplate, ANIM_ATTACKER, 1 + waitforvisualfinish + createvisualtask AnimTask_VoltTackleBolt, 5, 0 + playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER + waitforvisualfinish + createvisualtask AnimTask_VoltTackleBolt, 5, 1 + playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET + waitforvisualfinish + createvisualtask AnimTask_VoltTackleBolt, 5, 2 + playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER + waitforvisualfinish + createvisualtask AnimTask_VoltTackleBolt, 5, 3 + playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET + waitforvisualfinish + createvisualtask AnimTask_VoltTackleBolt, 5, 4 + playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER + delay 8 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 8, 0, RGB_BLACK + call SetImpactBackground + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 10, 0, 18, 1 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + createsprite gFireSpreadSpriteTemplate, ANIM_ATTACKER, 2, 1, 16, 16 + delay 2 + createsprite gFireSpreadSpriteTemplate, ANIM_ATTACKER, 2, 1, -16, -16 + delay 8 + createvisualtask AnimTask_VoltTackleAttackerReappear, 5 + waitforvisualfinish + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 3, 0, 9, 1 + waitforvisualfinish + call FireSpreadEffect + delay 4 + playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET + waitforvisualfinish + restorebg + waitbgfadein + end + +gBattleAnimMove_ElectroDrift:: + loadspritegfx ANIM_TAG_SPARK + loadspritegfx ANIM_TAG_SPARK_2 + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_ELECTRICITY + loadspritegfx ANIM_TAG_LIGHTNING + monbg ANIM_ATTACKER + waitforvisualfinish + fadetobg BG_THUNDER + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, -256, 0, 1, -1 + waitbgfadein + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 24, 190, 12, ANIM_ATTACKER, 1, 0 + delay 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 24, 22, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 24, 121, 13, ANIM_ATTACKER, 1, 1 + delay 10 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 24, 60, 10, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 24, 42, 11, ANIM_ATTACKER, 1, 1 + delay 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 24, 165, 10, ANIM_ATTACKER, 1, 1 + delay 0 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 0, 20, 0, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 64, 20, 1, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 128, 20, 0, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 192, 20, 2, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 32, 20, 0, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 96, 20, 1, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 160, 20, 0, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 224, 20, 2, 0 + delay 4 + createsprite gVoltTackleOrbSlideSpriteTemplate, ANIM_ATTACKER, 1 + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff + delay 8 + createvisualtask AnimTask_VoltTackleBolt, 5, 0 + playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_ATTACKER + waitforvisualfinish + createvisualtask AnimTask_VoltTackleBolt, 5, 1 + playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET + waitforvisualfinish + createvisualtask AnimTask_VoltTackleBolt, 5, 2 + playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_ATTACKER + waitforvisualfinish + createvisualtask AnimTask_VoltTackleBolt, 5, 3 + playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET + waitforvisualfinish + createvisualtask AnimTask_VoltTackleBolt, 5, 4 + playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_ATTACKER + delay 2 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 + delay 5 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 + delay 1 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 10, 0, 18, 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, 16 + delay 10 + createvisualtask AnimTask_ShakeTargetInPattern, 2, 30, 3, TRUE, 0 + delay 2 + createvisualtask AnimTask_VoltTackleAttackerReappear, 5 + waitforvisualfinish + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 3, 0, 9, 1 + call ElectricityEffect + waitforvisualfinish + blendoff + delay 2 + call UnsetPsychicBg + end + +gBattleAnimMove_Psyblade:: + loadspritegfx ANIM_TAG_SLASH + loadspritegfx ANIM_TAG_CROSS_IMPACT + loadspritegfx ANIM_TAG_LEER + call SetPsychicBackground + waitbgfadein + createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0 + playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 12 + createsprite gLeerSpriteTemplate, ANIM_TARGET, 2, 24, -12 + playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER + waitforvisualfinish + createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 1 + waitforvisualfinish + createsprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, 1, -8, 0 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + delay 4 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 15, 0, 40, 1 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CROSS_IMPACT, 0, 10, 10, RGB_RED + createsprite gSpriteTemplate_LargeCrossImpact, ANIM_TARGET, 2, 0, 0, 1, 36 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + delay 4 + waitforvisualfinish + createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 2 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff + call UnsetPsychicBg + end + +gBattleAnimMove_MightyCleave:: + loadspritegfx ANIM_TAG_SLASH + loadspritegfx ANIM_TAG_CROSS_IMPACT + loadspritegfx ANIM_TAG_LEER + loadspritegfx ANIM_TAG_ROCKS + fadetobg BG_ROCK_WRECKER + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0xF000, 0, 0, -1 + waitbgfadein + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 38, 1 + call MightyCleaveDiggingRun + call MightyCleaveDiggingRun + call MightyCleaveDiggingRun + call MightyCleaveDiggingRun + call MightyCleaveDiggingRun + call MightyCleaveDiggingRun + call MightyCleaveDiggingRun + call MightyCleaveDiggingRun + call MightyCleaveDiggingRun + waitforvisualfinish + createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0 + playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 12 + createsprite gLeerSpriteTemplate, ANIM_TARGET, 2, 24, -12 + playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER + waitforvisualfinish + createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 1 + waitforvisualfinish + createsprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, 1, -8, 0 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + delay 4 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 15, 0, 40, 1 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CROSS_IMPACT, 0, 10, 10, RGB_RED + createsprite gSpriteTemplate_LargeCrossImpact, ANIM_TARGET, 2, 0, 0, 1, 36 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + delay 4 + waitforvisualfinish + createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 2 + waitforvisualfinish + clearmonbg ANIM_TARGET + waitbgfadein + call UnsetPsychicBg + waitforvisualfinish + end +MightyCleaveDiggingRun: + createsprite gRockPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 12, 4, -16, 18 + createsprite gRockPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 16, 4, -10, 18 + createsprite gRockPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 14, 4, -18, 18 + createsprite gRockPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 12, 4, -16, 18 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 5 + return + +gBattleAnimMove_SupercellSlam:: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_SPARK_2 + delay 0 + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 5, 5, RGB(31, 31, 22) + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 24, 190, 12, ANIM_ATTACKER, 1, 0 + delay 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 24, 22, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 24, 121, 13, ANIM_ATTACKER, 1, 1 + delay 0 + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 0, 0, RGB(31, 31, 22) + delay 10 + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 5, 5, RGB(31, 31, 22) + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 24, 60, 10, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 24, 42, 11, ANIM_ATTACKER, 1, 1 + delay 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 24, 165, 10, ANIM_ATTACKER, 1, 1 + delay 0 + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 0, 0, RGB(31, 31, 22) + delay 20 + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 7, 7, RGB(31, 31, 22) + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 0, 20, 0, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 64, 20, 1, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 128, 20, 0, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 192, 20, 2, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 32, 20, 0, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 96, 20, 1, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 160, 20, 0, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 224, 20, 2, 0 + delay 4 + waitforvisualfinish + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 0, 0, RGB(31, 31, 22) + delay 4 + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER + createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER + waitforvisualfinish + delay 11 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 26, 0, 0, 5 + delay 6 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0 + loopsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET, 10, 2 + delay 1 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -28, 0, 0, 3 + waitforvisualfinish + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + waitforvisualfinish + delay 10 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 6 + delay 5 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 6 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, -31, 2, 0, 6, RGB(31, 31, 22) + call ElectricityEffect + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +gBattleAnimMove_BlazingTorque:: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_SMALL_EMBER + fadetobg BG_FIRE + waitbgfadeout + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + createvisualtask AnimTask_StartSlidingBg, 5, 0x0A00, 0, 1, -1 + waitbgfadein + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 4, 2, RGB_WHITE, 10, RGB_BLACK, 0 + waitforvisualfinish + delay 10 + playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER + waitplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 8 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 16, 16, RGB_WHITE + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + delay 3 + waitforvisualfinish + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + call FireSpreadEffect + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 + @waitforvisualfinish + 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 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_WHITE + waitforvisualfinish + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 1 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 1 + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 + delay 3 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end + +gBattleAnimMove_WickedTorque:: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_POISON_BUBBLE + loadspritegfx ANIM_TAG_THIN_RING + fadetobg BG_DARK + waitbgfadein + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 4, 2, RGB_WHITE, 10, RGB_BLACK, 0 + waitforvisualfinish + delay 10 + playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER + waitplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 8 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 16, 16, RGB_WHITE + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + delay 3 + waitforvisualfinish + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 3, 10, 0, 0 + createsprite gFoulPlayRingTemplate, ANIM_ATTACKER, 3, 0, 0, 256, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 + 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 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_WHITE + delay 2 + createsprite gFoulPlayRingTemplate, ANIM_ATTACKER, 3, 0, 0, 256, 0 + waitforvisualfinish + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 1 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 1 + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 + delay 3 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end + +gBattleAnimMove_NoxiousTorque:: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_POISON_BUBBLE + fadetobg BG_GUNK_SHOT + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0x0A00, 0, 1, -1 + waitbgfadein + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 4, 2, RGB_WHITE, 10, RGB_BLACK, 0 + waitforvisualfinish + delay 10 + playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER + waitplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 8 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 16, 16, RGB_WHITE + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + delay 3 + waitforvisualfinish + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 1, 2, 0, 12, RGB(30, 0, 31) + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 42, 27, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -27, 44, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 39, -28, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -42, -42, 20 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 + 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 5 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 0, 40, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 46, 9, 20 + delay 5 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -43, -12, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 16, -46, 20 + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_WHITE + waitforvisualfinish + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 1 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 1 + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 + delay 3 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end + +gBattleAnimMove_CombatTorque:: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_METEOR + fadetobg BG_IN_AIR + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0, 0x1000, 0, -1 + waitbgfadein + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 4, 2, RGB_WHITE, 10, RGB_BLACK, 0 + waitforvisualfinish + delay 10 + playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER + waitplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 8 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 16, 16, RGB_WHITE + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + delay 3 + waitforvisualfinish + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gSuperpowerFireballSpriteTemplate, ANIM_TARGET, 3, ANIM_ATTACKER + delay 4 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 + @waitforvisualfinish + 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 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_WHITE + waitforvisualfinish + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 1 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 1 + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 + delay 3 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + call UnsetPsychicBg + end + +gBattleAnimMove_MagicalTorque:: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_PINK_HEART + loadspritegfx ANIM_TAG_DUCK + loadspritegfx ANIM_TAG_RED_HEART + fadetobg BG_TWINKLE_TACKLE + waitbgfadeout + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 4, 2, RGB_WHITE, 10, RGB_BLACK, 0 + waitforvisualfinish + delay 10 + playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER + waitplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 8 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 16, 16, RGB_WHITE + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 160, -32 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -256, -40 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 128, -16 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 416, -38 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -128, -22 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -384, -31 + delay 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 + 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 3 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_WHITE + waitforvisualfinish + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 1 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 1 + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 + delay 3 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end + +gBattleAnimMove_TeraBlast:: + jumpifmovetypeequal TYPE_NORMAL, TeraBlastNormal + jumpifmovetypeequal TYPE_FIGHTING, TeraBlastFighting + jumpifmovetypeequal TYPE_FLYING, TeraBlastFlying + jumpifmovetypeequal TYPE_POISON, TeraBlastPoison + jumpifmovetypeequal TYPE_GROUND, TeraBlastGround + jumpifmovetypeequal TYPE_ROCK, TeraBlastRock + jumpifmovetypeequal TYPE_BUG, TeraBlastBug + jumpifmovetypeequal TYPE_GHOST, TeraBlastGhost + jumpifmovetypeequal TYPE_STEEL, TeraBlastSteel + jumpifmovetypeequal TYPE_FIRE, TeraBlastFire + jumpifmovetypeequal TYPE_WATER, TeraBlastWater + jumpifmovetypeequal TYPE_GRASS, TeraBlastGrass + jumpifmovetypeequal TYPE_ELECTRIC, TeraBlastElectric + jumpifmovetypeequal TYPE_PSYCHIC, TeraBlastPsychic + jumpifmovetypeequal TYPE_ICE, TeraBlastIce + jumpifmovetypeequal TYPE_DRAGON, TeraBlastDragon + jumpifmovetypeequal TYPE_DARK, TeraBlastDark + jumpifmovetypeequal TYPE_FAIRY, TeraBlastFairy + jumpifmovetypeequal TYPE_STELLAR, TeraBlastStellar + end +TeraBlastNormal: + loadspritegfx ANIM_TAG_PINKVIO_ORB + loadspritegfx ANIM_TAG_ORBS + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PINKVIO_ORB, 0, 12, 12, RGB_WHITE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ORBS, 0, 12, 12, RGB_WHITE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_WHITE + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, 0 + waitforvisualfinish + 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 + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 50, 1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 11, RGB(25, 25, 25) + 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 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 11, 0, RGB(25, 25, 25) + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, 0 + waitforvisualfinish + blendoff + clearmonbg ANIM_ATTACKER + end +TeraBlastFighting: + loadspritegfx ANIM_TAG_PINKVIO_ORB + loadspritegfx ANIM_TAG_HANDS_AND_FEET + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PINKVIO_ORB, 0, 12, 12, RGB(29, 24, 2) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB(29, 24, 2) + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_ROCK_WRECKER + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0xF000, 0, 0, -1 + waitbgfadein + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 63, 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -48, 24, 0, 0, 10, 1, ANIM_FOOT_1, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 2 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -6, 18, 0, 0, 10, 1, ANIM_CHOP, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -64, 16, 0, 0, 10, 1, ANIM_FIST_1, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + delay 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -48, 21, 0, 0, 10, 1, ANIM_FOOT_2, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -48, 20, 0, 0, 10, 1, ANIM_FIST_1, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -32, 23, 0, 0, 10, 1, ANIM_CHOP, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + delay 2 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -64, 17, 0, 0, 10, 1, ANIM_FOOT_1, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -80, 16, 0, 0, 10, 1, ANIM_FOOT_2, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -96, 21, 0, 0, 10, 1, ANIM_CHOP, 1 + delay 1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -48, 24, 0, 0, 10, 1, ANIM_FOOT_1, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -6, 18, 0, 0, 10, 1, ANIM_CHOP, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -64, 16, 0, 0, 10, 1, ANIM_FIST_1, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + delay 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -48, 21, 0, 0, 10, 1, ANIM_FOOT_2, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -48, 20, 0, 0, 10, 1, ANIM_FIST_1, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -32, 23, 0, 0, 10, 1, ANIM_CHOP, 1 + delay 1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + clearmonbg ANIM_TARGET + waitbgfadein + call UnsetPsychicBg + waitforvisualfinish + end +TeraBlastPoison: + loadspritegfx ANIM_TAG_POISON_BUBBLE + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_PURPLE + createsprite sPoisonSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + delay 2 + createsprite sPoisonSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + delay 2 + createsprite sPoisonSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + delay 2 + createsprite sPoisonSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + delay 2 + createsprite sPoisonSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + delay 2 + createsprite sPoisonSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + delay 2 + createsprite sPoisonSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_GUNK_SHOT + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0x0A00, 0, 1, -1 + waitbgfadein + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 42, 27, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -27, 44, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 39, -28, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -42, -42, 20 + playsewithpan SE_M_DIG, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 50, 1 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 4, 0, 12, RGB_PURPLE + call PoisonBubblesEffect + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 42, 27, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -27, 44, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 39, -28, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -42, -42, 20 + playsewithpan SE_M_DIG, SOUND_PAN_TARGET + call PoisonBubblesEffect + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 42, 27, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -27, 44, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 39, -28, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -42, -42, 20 + playsewithpan SE_M_DIG, SOUND_PAN_TARGET + delay 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + delay 0 + call UnsetSkyBg + end +TeraBlastFlying: + loadspritegfx ANIM_TAG_AIR_WAVE_2 + loadspritegfx ANIM_TAG_METAL_SOUND_WAVES + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_METAL_SOUND_WAVES, 0, 12, 12, RGB_WHITE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_WHITE + createsprite gAirWaveSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_BLIZZARD2, SOUND_PAN_ATTACKER + delay 2 + createsprite gAirWaveSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_BLIZZARD2, SOUND_PAN_ATTACKER + delay 2 + createsprite gAirWaveSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_BLIZZARD2, SOUND_PAN_ATTACKER + delay 2 + createsprite gAirWaveSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_BLIZZARD2, SOUND_PAN_ATTACKER + delay 2 + createsprite gAirWaveSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_BLIZZARD2, SOUND_PAN_ATTACKER + delay 2 + createsprite gAirWaveSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_BLIZZARD2, SOUND_PAN_ATTACKER + delay 2 + createsprite gAirWaveSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_BLIZZARD2, SOUND_PAN_ATTACKER + waitforvisualfinish + call SetSkyBg + splitbgprio ANIM_TARGET + setalpha 12, 8 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 46, 1 + delay 6 + call TeraBlastFlyingBeam + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 50, 1 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 2, 0, 12, RGB_WHITE + call TeraBlastFlyingBeam + call TeraBlastFlyingBeam + delay 8 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + delay 0 + call UnsetSkyBg + end +TeraBlastRock: + loadspritegfx ANIM_TAG_ROCKS + loadspritegfx ANIM_TAG_FIRE_PLUME + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FIRE_PLUME, 0, 12, 12, RGB(29, 24, 2) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB(29, 24, 2) + createsprite sRockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sRockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sRockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sRockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sRockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sRockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sRockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_ROCK_WRECKER + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0xF000, 0, 0, -1 + waitbgfadein + playsewithpan SE_FALL, SOUND_PAN_TARGET + call TeraBlastRock1 + delay 3 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + call TeraBlastRock2 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 40, 16 @; For Meteor 1 + createvisualtask AnimTask_HorizontalShake, 5, 5, 2, 1 + delay 3 + call TeraBlastRock3 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -8, 16 @; For Meteor 2 + delay 3 + call TeraBlastRock4 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 21, 16 @; For Meteor 3 + delay 3 + call TeraBlastRock1 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -8, 16 @; For Meteor 4 + createvisualtask AnimTask_HorizontalShake, 5, 5, 2, 1 + delay 3 + call TeraBlastRock2 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 40, 16 @; For Meteor 1 + delay 3 + call TeraBlastRock3 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 21, 16 @; For Meteor 3 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end +TeraBlastBug: + loadspritegfx ANIM_TAG_HOLLOW_ORB + loadspritegfx ANIM_TAG_SPARKLE_6 + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_GREEN + createvisualtask AnimTask_BlendPalInAndOutByTag, 5, ANIM_TAG_HOLLOW_ORB, RGB_GREEN, 14, 0, 3 + createsprite gDragonDanceOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER + delay 2 + createsprite gDragonDanceOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER + delay 2 + createsprite gDragonDanceOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER + delay 2 + createsprite gDragonDanceOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER + delay 2 + createsprite gDragonDanceOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER + delay 2 + createsprite gDragonDanceOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER + delay 2 + createsprite gDragonDanceOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER + waitforvisualfinish + monbg ANIM_DEF_PARTNER + call SetBugBg + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20 + delay 1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 50, 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_TARGET, 66, 0, 0, 4 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + call UnsetBugBg + end +TeraBlastGround: + loadspritegfx ANIM_TAG_MUD_SAND + loadspritegfx ANIM_TAG_FIRE_PLUME + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB(29, 24, 2) + createsprite sMudSandSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sMudSandSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sMudSandSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sMudSandSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sMudSandSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sMudSandSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sMudSandSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_FISSURE + waitbgfadeout + createvisualtask AnimTask_PositionFissureBgOnBattler, 5, ANIM_TARGET, 5, -1 + waitbgfadein + createvisualtask AnimTask_HorizontalShake, 3, ANIM_TARGET, 10, 50 + playsewithpan SE_M_EARTHQUAKE, SOUND_PAN_TARGET + delay 40 + loopsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET 11, 3 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 3, 25, 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 5, 0 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, -10, -15 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 25 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 15, 5 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, -25, 0 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, 30, 30 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, -27, 25 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 0, 8 + delay 1 + loopsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET 11, 3 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 5, 0 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, -10, -15 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 25 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 15, 5 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, -25, 0 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, 30, 30 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, -27, 25 + delay 1 + loopsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET 11, 3 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 0, 8 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 5, 0 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, -10, -15 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 25 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 15, 5 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, -25, 0 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, 30, 30 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, -27, 25 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 0, 8 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_TARGET, 66, 0, 0, 4 + waitforvisualfinish + restorebg + waitbgfadeout + setarg 7, -1 + waitbgfadein + end +TeraBlastGhost: + loadspritegfx ANIM_TAG_PURPLE_FLAME + loadspritegfx ANIM_TAG_EXPLOSION + loadspritegfx ANIM_TAG_GHOSTLY_SPIRIT + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_PURPLE + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_GHOST + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0x0A00, 0, 1, -1 + waitbgfadein + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 46, 1 + delay 6 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, 40, 40, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, -40, -40, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, 0, 40, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 4, 0, 12, RGB_PURPLE + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, 0, -40, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, 40, -20, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, 40, 20, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, -40, -20, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, -40, 20, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, -20, 30, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, 20, -30, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, -20, -30, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, 20, 30, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, -40, 0, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, 40, 0, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 6 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end +TeraBlastSteel: + loadspritegfx ANIM_TAG_METAL_BALL + loadspritegfx ANIM_TAG_ROCKS + loadspritegfx ANIM_TAG_REALLY_BIG_ROCK + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ROCKS, 0, 12, 12, RGB(25, 25, 25) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_REALLY_BIG_ROCK, 0, 12, 12, RGB(25, 25, 25) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB(25, 25, 25) + createsprite sMetalBallSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + delay 2 + createsprite sMetalBallSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + delay 2 + createsprite sMetalBallSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + delay 2 + createsprite sMetalBallSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + delay 2 + createsprite sMetalBallSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + delay 2 + createsprite sMetalBallSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + delay 2 + createsprite sMetalBallSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + waitforvisualfinish + call SetSteelBeamBackground + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 46, 1 + delay 6 + playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER + call ContinentalCrushStockpileRocks + createsprite gContinentalCrushGrowingRockSpriteTemplate, ANIM_ATTACKER, 41, 0, 0, 0, 0 + playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER + call ContinentalCrushStockpileRocks + delay 30 + loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2 + createvisualtask AnimTask_MetallicShine, 5, 0, 0, RGB_BLACK + waitforvisualfinish + playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER + createsprite gReallyBigRockBlastRockSpriteTemplate, ANIM_TARGET, 2, 16, 0, 0, 0, 25, 257 + waitforvisualfinish + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end +TeraBlastFire: + loadspritegfx ANIM_TAG_SMALL_EMBER + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB(31, 0, 0) + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + waitforvisualfinish + monbg ANIM_ATTACKER + setalpha 14, 8 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, 0 + waitforvisualfinish + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 46, 1 + delay 6 + createvisualtask AnimTask_GetAttackerSide, 2 + jumprettrue TeraBlastFireOnPlayer + goto TeraBlastFireOnOpponent +TeraBlastFireOnOpponent: + panse SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 43, 1 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 4, 0, 12, RGB(31, 0, 0) + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, 0 + waitforvisualfinish + blendoff + clearmonbg ANIM_ATTACKER + end +TeraBlastFireOnPlayer: + panse SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 43, 1 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 4, 0, 12, RGB(31, 0, 0) + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, 0 + waitforvisualfinish + blendoff + clearmonbg ANIM_ATTACKER + end +TeraBlastWater: + loadspritegfx ANIM_TAG_HYDRO_PUMP + loadspritegfx ANIM_TAG_FIRE_PLUME + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FIRE_PLUME, 0, 12, 12, RGB_BLUE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_BLUE + createsprite gHydroPumpSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER + delay 2 + createsprite gHydroPumpSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + delay 2 + createsprite gHydroPumpSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + delay 2 + createsprite gHydroPumpSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + delay 2 + createsprite gHydroPumpSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + delay 2 + createsprite gHydroPumpSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + delay 2 + createsprite gHydroPumpSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + waitforvisualfinish + fadetobg BG_WATER + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0x0A00, 0, 1, -1 + waitbgfadein + playsewithpan SE_FALL, SOUND_PAN_TARGET + call TeraBlastWater1 + delay 3 + playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET + call TeraBlastWater2 + playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 40, 16 @; For Meteor 1 + createvisualtask AnimTask_HorizontalShake, 5, 5, 2, 1 + delay 3 + call TeraBlastWater3 + playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -8, 16 @; For Meteor 2 + delay 3 + call TeraBlastWater4 + playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 21, 16 @; For Meteor 3 + delay 3 + call TeraBlastWater1 + playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -8, 16 @; For Meteor 4 + createvisualtask AnimTask_HorizontalShake, 5, 5, 2, 1 + delay 3 + call TeraBlastWater2 + playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 40, 16 @; For Meteor 1 + delay 3 + call TeraBlastWater3 + playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 21, 16 @; For Meteor 3 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end +TeraBlastGrass: + loadspritegfx ANIM_TAG_LEAF + loadspritegfx ANIM_TAG_FLOWER + loadspritegfx ANIM_TAG_EXPLOSION + loadspritegfx ANIM_TAG_AIR_WAVE_2 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB(0, 31, 0) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_AIR_WAVE_2, 0, 12, 12, RGB_GREEN + createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_LEAF_STORM + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0x0A00, 0, 1, -1 + waitbgfadein + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 46, 1 + delay 6 + call AeroblastBeam + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 5, 0, 50, 1 + call AeroblastBeam + call AeroblastBeam + call AeroblastBeam + call AeroblastBeam + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end +TeraBlastElectric: + loadspritegfx ANIM_TAG_SHOCK + loadspritegfx ANIM_TAG_SPARK + loadspritegfx ANIM_TAG_SHOCK_3 + loadspritegfx ANIM_TAG_SPARK_2 + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_YELLOW + createsprite sCirclingShockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + delay 2 + createsprite sCirclingShockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + delay 2 + createsprite sCirclingShockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + delay 2 + createsprite sCirclingShockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + delay 2 + createsprite sCirclingShockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + delay 2 + createsprite sCirclingShockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + delay 2 + createsprite sCirclingShockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_THUNDER + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0xff00, 0, 1, -1 + waitbgfadein + loopsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET, 3, 10 + createsprite gThunderboltOrbSpriteTemplate, ANIM_TARGET, 3, 44, 0, 0, 3 + createsprite gThunderboltOrbSpriteTemplate, ANIM_TARGET, 3, 44, 0, 0, 3 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 0, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 64, 40, 1, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 128, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 192, 40, 2, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 32, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 96, 40, 1, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 160, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 224, 40, 2, -32765 + delay 0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 2, 2, RGB_BLACK + delay 6 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 6, RGB_BLACK + delay 6 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 2, 2, RGB_BLACK + delay 6 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 6, RGB_BLACK + createsprite gThunderboltOrbSpriteTemplate, ANIM_TARGET, 3, 44, 0, 0, 3 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 0, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 64, 40, 1, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 128, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 192, 40, 2, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 32, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 96, 40, 1, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 160, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 224, 40, 2, -32765 + delay 0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 2, 2, RGB_BLACK + delay 6 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 6, RGB_BLACK + delay 6 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 2, 2, RGB_BLACK + delay 6 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 6, RGB_BLACK + createsprite gThunderboltOrbSpriteTemplate, ANIM_TARGET, 3, 44, 0, 0, 3 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 0, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 64, 40, 1, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 128, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 192, 40, 2, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 32, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 96, 40, 1, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 160, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 224, 40, 2, -32765 + delay 0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 2, 2, RGB_BLACK + delay 6 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 6, RGB_BLACK + delay 6 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 2, 2, RGB_BLACK + delay 6 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 6, RGB_BLACK + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 0, RGB_BLACK + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end +TeraBlastPsychic: + loadspritegfx ANIM_TAG_PINKVIO_ORB + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PINKVIO_ORB, 0, 12, 12, RGB_PURPLE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_PURPLE + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_PSYCHIC + waitbgfadeout + createvisualtask AnimTask_SetPsychicBackground, 5 + waitbgfadein + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 + loopsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 10, 3 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 8, 8, 30, 1 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 30, ANIM_TARGET, 1 + waitforvisualfinish + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 + waitforvisualfinish + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end +TeraBlastIce: + loadspritegfx ANIM_TAG_ICE_CRYSTALS + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB(12, 26, 31) @ light blue + createsprite sIceCrystalSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_ATTACKER + delay 2 + createsprite sIceCrystalSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_ATTACKER + delay 2 + createsprite sIceCrystalSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_ATTACKER + delay 2 + createsprite sIceCrystalSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_ATTACKER + delay 2 + createsprite sIceCrystalSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_ATTACKER + delay 2 + createsprite sIceCrystalSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_ATTACKER + delay 2 + createsprite sIceCrystalSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_ICE + waitbgfadein + createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 0, 9, RGB(12, 26, 31) + playsewithpan SE_M_STRING_SHOT, SOUND_PAN_TARGET + createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 0 + createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 64 + createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 128 + createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 192 + delay 5 + createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 32 + createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 96 + createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 160 + createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 224 + delay 17 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 3, 1 + waitforvisualfinish + delay 15 + call IceCrystalEffectShort + delay 5 + call IceCrystalEffectShort + delay 5 + call IceCrystalEffectShort + delay 5 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 9, 0, RGB(12, 26, 31) + waitforvisualfinish + blendoff + call UnsetPsychicBg + end +TeraBlastDragon: + loadspritegfx ANIM_TAG_SMALL_EMBER + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SMALL_EMBER, 0, 12, 12, RGB(10, 25, 31) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB(10, 25, 31) + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_FIRE_2 + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0x1000, 0, 0, -1 + waitbgfadein + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 46, 1 + delay 6 + createvisualtask AnimTask_GetAttackerSide, 2 + jumprettrue TeraBlastDragonOnPlayer + goto TeraBlastDragonOnOpponent +TeraBlastDragonOnOpponent: + panse SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 43, 1 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 4, 0, 12, RGB(31, 0, 0) + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish blendoff - waitforvisualfinish + call UnsetPsychicBg end - -gBattleAnimMove_HardPress:: - 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 +TeraBlastDragonOnPlayer: + panse SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 43, 1 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 4, 0, 12, RGB(31, 0, 0) + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 waitforvisualfinish blendoff - call UnsetHighSpeedBg + call UnsetPsychicBg end - -gBattleAnimMove_DragonCheer:: - 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 +TeraBlastDark: + loadspritegfx ANIM_TAG_PURPLE_FLAME + loadspritegfx ANIM_TAG_METAL_SOUND_WAVES + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PURPLE_FLAME, 0, 12, 12, RGB_BLACK + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_METAL_SOUND_WAVES, 0, 12, 12, RGB_BLACK + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_BLACK + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER 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 + fadetobg BG_DARK + waitbgfadein + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 46, 1 + delay 6 + call TeraBlastFlyingBeam + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 50, 1 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 2, 0, 12, RGB_BLACK + call TeraBlastFlyingBeam + call TeraBlastFlyingBeam + delay 8 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 waitforvisualfinish - clearmonbg ANIM_ATTACKER - delay 10 + blendoff + call UnsetPsychicBg end - -gBattleAnimMove_MalignantChain:: - 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 +TeraBlastFairy: + loadspritegfx ANIM_TAG_PINK_HEART + loadspritegfx ANIM_TAG_RED_HEART + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_MAGENTA + createsprite sPinkHeartSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite sPinkHeartSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite sPinkHeartSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite sPinkHeartSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite sPinkHeartSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite sPinkHeartSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite sPinkHeartSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER waitforvisualfinish - end - -gBattleAnimMove_PopulationBomb:: - 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: + fadetobg BG_TWINKLE_TACKLE + waitbgfadein + loopsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 10, 3 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 4, 0, 12, RGB_MAGENTA + call TeraBlastFairyHearts + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 8, 8, 15, 1 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 15, ANIM_TARGET, 1 + delay 32 + playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET + call TeraBlastFairyHearts + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 8, 8, 15, 1 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 15, ANIM_TARGET, 1 + delay 32 + playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET + call TeraBlastFairyHearts + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 8, 8, 15, 1 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 15, ANIM_TARGET, 1 + delay 32 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call TeraBlastFairyHearts + call EternabeamGeyser + delay 5 + call EternabeamGeyser delay 5 - createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 waitforvisualfinish - clearmonbg ANIM_TARGET blendoff - waitforvisualfinish + call UnsetPsychicBg end - -gBattleAnimMove_RevivalBlessing:: - goto gBattleAnimMove_LunarBlessing - -gBattleAnimMove_TeraStarstorm:: - loadspritegfx ANIM_TAG_STARSTORM +TeraBlastStellar: loadspritegfx ANIM_TAG_YELLOW_STAR - loadspritegfx ANIM_TAG_IMPACT - fadetobg BG_COSMIC - waitbgfadein - playsewithpan SE_FALL, SOUND_PAN_ATTACKER - call TeraStarstormCreateBeam - delay 2 - call TeraStarstormCreateBeam - delay 2 - call TeraStarstormCreateBeam - delay 2 - call TeraStarstormCreateBeam + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_WHITE + createsprite gYellowStarSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER delay 2 - call TeraStarstormCreateBeam + createsprite gYellowStarSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER delay 2 - call TeraStarstormCreateBeam + createsprite gYellowStarSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER delay 2 - call TeraStarstormCreateBeam + createsprite gYellowStarSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER delay 2 - call TeraStarstormCreateBeam + createsprite gYellowStarSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER delay 2 - call TeraStarstormCreateBeam + createsprite gYellowStarSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER delay 2 - jumpifmovetypeequal TYPE_STELLAR, TeraStarstormStellar - goto TeraStarstormSingle -TeraStarstormStellar: - jumpifdoublebattle TeraStarstormDouble -TeraStarstormSingle: + createsprite gYellowStarSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_COSMIC + waitbgfadein + playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER + delay 20 + playsewithpan SE_FALL, SOUND_PAN_ATTACKER createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 0, 1 delay 3 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 delay 2 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 0, 1 delay 3 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 delay 2 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 delay 3 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 delay 2 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, -5, 30, 0, 1 delay 3 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 delay 2 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 5, 30, 0, 1 delay 3 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 delay 2 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 delay 3 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 delay 5 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 delay 5 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 waitforvisualfinish restorebg waitbgfadeout end -TeraStarstormDouble: - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 0, 1 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 1, 1 + +FireSpreadBlast: + createsprite gFireSpreadBlastSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0, 0, 45 + createsprite gFireSpreadBlastSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 10, 5, 45 + createsprite gFireSpreadBlastSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -10, -5, 45 delay 2 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 1, 1 - delay 3 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 0, 1 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 1, 1 + createsprite gFireSpreadBlastSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 20, 10, 45 + createsprite gFireSpreadBlastSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -20, -10, 45 delay 2 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 1, 1 - delay 3 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 1, 1 + return +FireSpreadBlastOpponent: + createsprite gFireSpreadBlastSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0, 0, 45 + createsprite gFireSpreadBlastSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5, 10, 45 + createsprite gFireSpreadBlastSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -5, -10, 45 delay 2 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 1, 1 - delay 3 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 10, 30, 0, 1 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 10, 30, 1, 1 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 - createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + createsprite gFireSpreadBlastSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 10, 20, 45 + createsprite gFireSpreadBlastSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -10, -20, 45 delay 2 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 0, 1 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 1, 1 - delay 3 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 1, 1 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 - createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + return + +TeraBlastFlyingBeam: + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET + createsprite gTeraBlastFlyingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 delay 2 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 0, 1 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 1, 1 - delay 3 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 1, 1 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 - createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET + createsprite gTeraBlastFlyingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 delay 2 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 1, 1 - delay 3 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 - createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 1, 1 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 - createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 - delay 5 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 - createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 - delay 5 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 - createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 - delay 5 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 - createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 - waitforvisualfinish - restorebg - waitbgfadeout - end + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET + createsprite gTeraBlastFlyingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET + createsprite gTeraBlastFlyingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET + createsprite gTeraBlastFlyingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET + createsprite gTeraBlastFlyingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET + createsprite gTeraBlastFlyingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET + createsprite gTeraBlastFlyingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + return -TeraStarstormCreateBeam:: - createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, -3, 1, 0, 0, 20 - createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 1, 0, 0, 0, 20 - createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 3, -1, 0, 0, 20 - createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, -2, 0, 0, 0, 20 - createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 0, 1, 0, 0, 20 - createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, -1, -1, 0, 0, 20 - createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 2, 0, 0, 0, 20 +TeraBlastWater1: + createsprite gTeraBlastWaterSpriteTemplate, ANIM_ATTACKER, 3, -48, -64, 40, 32, 25 + delay 2 + createsprite gTeraBlastWaterSpriteTemplate, ANIM_ATTACKER, 3, -48, -64, 40, 32, 25 + delay 2 + return +TeraBlastWater2: + createsprite gTeraBlastWaterSpriteTemplate, ANIM_ATTACKER, 3, -112, -64, -8, 32, 25 + delay 2 + createsprite gTeraBlastWaterSpriteTemplate, ANIM_ATTACKER, 3, -112, -64, -8, 32, 25 + delay 2 + return +TeraBlastWater3: + createsprite gTeraBlastWaterSpriteTemplate, ANIM_ATTACKER, 3, -80, -64, 24, 32, 25 + delay 2 + createsprite gTeraBlastWaterSpriteTemplate, ANIM_ATTACKER, 3, -80, -64, 24, 32, 25 + delay 2 + return +TeraBlastWater4: + createsprite gTeraBlastWaterSpriteTemplate, ANIM_ATTACKER, 3, -80, -64, -8, 32, 25 + delay 2 + createsprite gTeraBlastWaterSpriteTemplate, ANIM_ATTACKER, 3, -80, -64, -8, 32, 25 + delay 2 return -gBattleAnimMove_TachyonCutter:: - loadspritegfx ANIM_TAG_CUT - loadspritegfx ANIM_TAG_BUBBLE - createsprite gTachyonCutterSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 0 - createsprite gTachyonCutterSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 1 - playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER +TeraBlastRock1: + createsprite gTeraBlastRockSpriteTemplate, ANIM_ATTACKER, 3, -48, -64, 40, 32, 25 + delay 4 + return +TeraBlastRock2: + createsprite gTeraBlastRockSpriteTemplate, ANIM_ATTACKER, 3, -112, -64, -8, 32, 25 + delay 4 + return +TeraBlastRock3: + createsprite gTeraBlastRockSpriteTemplate, ANIM_ATTACKER, 3, -80, -64, 24, 32, 25 + delay 4 + return +TeraBlastRock4: + createsprite gTeraBlastRockSpriteTemplate, ANIM_ATTACKER, 3, -80, -64, -8, 32, 25 + delay 4 + return + +TeraBlastFairyHearts: + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 160, -32 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -256, -40 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 128, -16 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 416, -38 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -128, -22 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -384, -31 + return + +gBattleAnimMove_OrderUp:: + loadspritegfx ANIM_TAG_IMPACT + playsewithpan SE_M_ENCORE, SOUND_PAN_ATTACKER + createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 6 + createvisualtask AnimTask_GetCommanderType, 2 + delay 25 + jumpreteq ANIM_ORDER_UP_NONE, OrderUpNone + jumpreteq ANIM_ORDER_UP_CURLY, OrderUpCurly + jumpreteq ANIM_ORDER_UP_DROOPY, OrderUpDroopy + jumpreteq ANIM_ORDER_UP_STRETCHY, OrderUpStretchy +OrderUpNone: + loadspritegfx ANIM_TAG_TATSUGIRI_CURLY + loadspritegfx ANIM_TAG_TATSUGIRI_DROOPY + loadspritegfx ANIM_TAG_TATSUGIRI_STRETCHY + createsprite gOrderUpTatsugiriCurlySpriteTemplate, ANIM_TARGET, 2, -20, 12, 64, 50, 0 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + delay 2 + createsprite gOrderUpTatsugiriDroopySpriteTemplate, ANIM_TARGET, 2, 0, 12, 64, 46, 0 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + delay 2 + createsprite gOrderUpTatsugiriStretchySpriteTemplate, ANIM_TARGET, 2, 20, 12, 64, 42, 0 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET waitforvisualfinish end - -gBattleAnimMove_SaltCure:: - loadspritegfx ANIM_TAG_SALT_PARTICLE - loadspritegfx ANIM_TAG_WATER_ORB - call SaltCureEffect - call SaltCureEffect - call SaltCureEffect - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET +OrderUpCurly: + loadspritegfx ANIM_TAG_TATSUGIRI_CURLY + createsprite gOrderUpTatsugiriCurlySpriteTemplate, ANIM_TARGET, 2, -20, 12, 64, 50, 0 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + delay 2 + createsprite gOrderUpTatsugiriCurlySpriteTemplate, ANIM_TARGET, 2, 0, 12, 64, 46, 0 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + delay 2 + createsprite gOrderUpTatsugiriCurlySpriteTemplate, ANIM_TARGET, 2, 20, 12, 64, 42, 0 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET waitforvisualfinish - call gBattleAnimGeneral_SaltCureDamage end - -SaltCureEffect: - createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 28, 384, 50, 8, 50, ANIM_TARGET +OrderUpDroopy: + loadspritegfx ANIM_TAG_TATSUGIRI_DROOPY + createsprite gOrderUpTatsugiriDroopySpriteTemplate, ANIM_TARGET, 2, -20, 12, 64, 50, 0 delay 2 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 32, 240, 40, 11, -46, ANIM_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET delay 2 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 33, 416, 40, 4, 42, ANIM_TARGET + createsprite gOrderUpTatsugiriDroopySpriteTemplate, ANIM_TARGET, 2, 0, 12, 64, 46, 0 delay 2 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 31, 288, 45, 6, -42, ANIM_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET delay 2 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 28, 448, 45, 11, 46, ANIM_TARGET + createsprite gOrderUpTatsugiriDroopySpriteTemplate, ANIM_TARGET, 2, 20, 12, 64, 42, 0 delay 2 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 33, 464, 50, 10, -50, ANIM_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + waitforvisualfinish + end +OrderUpStretchy: + loadspritegfx ANIM_TAG_TATSUGIRI_STRETCHY + createsprite gOrderUpTatsugiriStretchySpriteTemplate, ANIM_TARGET, 2, -20, 12, 64, 50, 0 delay 2 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + delay 2 + createsprite gOrderUpTatsugiriStretchySpriteTemplate, ANIM_TARGET, 2, 0, 12, 64, 46, 0 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + delay 2 + createsprite gOrderUpTatsugiriStretchySpriteTemplate, ANIM_TARGET, 2, 20, 12, 64, 42, 0 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + waitforvisualfinish + end + +gBattleAnimMove_MatchaGotcha:: + loadspritegfx ANIM_TAG_POISON_BUBBLE + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 4, 2, RGB_WHITE, 10, RGB_BLACK, 0 + waitforvisualfinish + delay 10 + loopsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 27, 2 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_POISON_BUBBLE, 0, 12, 12, RGB_GREEN + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 2, 3 + waitforvisualfinish + loopsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 18, 2 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 28, 10, 2, 4 + waitforvisualfinish + loopsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 9, 4 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 32, 10, 4, 5 + waitforvisualfinish + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 20, 0, 0, 4 + jumpifdoublebattle MatchaGotchaDouble + goto MatchaGotchaSingle + +MatchaGotchaSingle: + call MatchaGotchaProjectile + call MatchaGotchaProjectile + loopsewithpan SE_FALL, SOUND_PAN_ATTACKER, 8, 2 + call MatchaGotchaProjectile + call MatchaGotchaProjectile + delay 10 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 7 + delay 28 + playsewithpan SE_M_DIVE, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 10, 1 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(31, 0, 0) + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, 10, 15, 55, FALSE + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, -20, 15, 55, FALSE + delay 3 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, 5, 15, 55, FALSE + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, -10, 15, 55, FALSE + delay 3 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, 30, 15, 55, FALSE + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, -30, 15, 55, FALSE + delay 3 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, 2, 15, 55, FALSE + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, -5, 15, 55, FALSE + delay 3 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, 20, 15, 55, FALSE + waitforvisualfinish + end + +MatchaGotchaDouble: + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + call MatchaGotchaDoubleProjectile + call MatchaGotchaDoubleProjectile + loopsewithpan SE_FALL, SOUND_PAN_ATTACKER, 8, 2 + call MatchaGotchaDoubleProjectile + call MatchaGotchaDoubleProjectile + delay 10 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 7 + waitforvisualfinish + playsewithpan SE_M_DIVE, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 10, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_DEF_PARTNER, 2, 0, 10, 1 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(31, 0, 0) + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, 10, 15, 55, 0 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, -20, 15, 55, 0 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, 10, 15, 55, 2 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, -20, 15, 55, 2 + delay 3 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, 5, 15, 55, 0 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, -10, 15, 55, 0 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, 5, 15, 55, 2 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, -10, 15, 55, 2 + delay 3 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, 30, 15, 55, 0 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, -30, 15, 55, 0 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, 30, 15, 55, 2 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, -30, 15, 55, 2 + waitforvisualfinish + end + +MatchaGotchaProjectile: + createsprite gSludgeProjectileSpriteTemplate, ANIM_TARGET, 2, 20, 0, 60, 0 + delay 3 return -gBattleAnimMove_TeraBlast:: -gBattleAnimMove_OrderUp:: -gBattleAnimMove_GlaiveRush:: -gBattleAnimMove_TripleDive:: -gBattleAnimMove_Doodle:: -gBattleAnimMove_Ruination:: -gBattleAnimMove_CollisionCourse:: -gBattleAnimMove_ElectroDrift:: -gBattleAnimMove_ArmorCannon:: -gBattleAnimMove_BlazingTorque:: -gBattleAnimMove_WickedTorque:: -gBattleAnimMove_NoxiousTorque:: -gBattleAnimMove_CombatTorque:: -gBattleAnimMove_MagicalTorque:: -gBattleAnimMove_Psyblade:: -gBattleAnimMove_MatchaGotcha:: -gBattleAnimMove_MightyCleave:: -gBattleAnimMove_SupercellSlam:: - end @to do +MatchaGotchaDoubleProjectile: + createsprite gSludgeProjectileSpriteTemplate, ANIM_TARGET, 2, 20, 0, 60, 0, 0 + createsprite gSludgeProjectileSpriteTemplate, ANIM_TARGET, 2, 20, 0, 60, 0, TRUE + delay 3 + return @@@@@@@@@@@@@@@@@@@@@@@ GEN 1-3 @@@@@@@@@@@@@@@@@@@@@@@ gBattleAnimMove_None:: @@ -21304,19 +24170,19 @@ gBattleAnimMove_Uproar:: loadspritegfx ANIM_TAG_THIN_RING monbg ANIM_DEF_PARTNER createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 29, -12, 0 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -12, -29, 1 delay 16 createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 12, -29, 1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -29, -12, 0 delay 16 createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, -24, 1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, -24, 0 @@ -24720,7 +27586,7 @@ gBattleAnimMove_RazorLeaf:: end gBattleAnimMove_NaturePower:: - @ No actual animation, uses the animation of a move from sNaturePowerMoves instead + @ No actual animation, uses the animation of a move from gBattleEnvironmentInfo.naturePower instead gBattleAnimMove_AncientPower:: loadspritegfx ANIM_TAG_ROCKS @@ -26138,7 +29004,7 @@ gBattleAnimMove_Transform:: monbg ANIM_ATTACKER playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_MINIMIZE, SOUND_PAN_ATTACKER, 48 - createvisualtask AnimTask_TransformMon, 2, 0, 1 + createvisualtask AnimTask_TransformMon, 2, SPECIES_GFX_CHANGE_TRANSFORM waitforvisualfinish clearmonbg ANIM_ATTACKER end @@ -27015,7 +29881,7 @@ gBattleAnimMove_RockTomb:: end SetBugBg: - createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, 1, 0, 0, 4, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, ANIM_TARGET, 0, 0, 4, RGB_BLACK createvisualtask AnimTask_GetAttackerSide, 2 jumprettrue SetBugBgPlayer fadetobg BG_BUG_OPPONENT @@ -27028,14 +29894,14 @@ SetBugBgPlayer: createvisualtask AnimTask_StartSlidingBg, 5, -1536, 0, 0, -1 SetBugBgFade: delay 0 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 0, 4, 4, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 4, 4, RGB_BLACK waitbgfadein return UnsetBugBg: restorebg waitbgfadeout - createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, 1, 0, 4, 0, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, ANIM_TARGET, 0, 4, 0, RGB_BLACK setarg 7, -1 waitbgfadein return @@ -28218,6 +31084,17 @@ gBattleAnimStatus_Nightmare:: clearmonbg ANIM_DEF_PARTNER end +gBattleAnimStatus_Frostbite:: + playsewithpan SE_M_ICY_WIND, 0 + loadspritegfx ANIM_TAG_ICE_CRYSTALS + monbg ANIM_DEF_PARTNER + splitbgprio ANIM_TARGET + call IceCrystalEffectShort + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_TARGET, 5, 7, 0, RGB(0, 20, 31) + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end + gBattleAnimGeneral_StatsChange:: createvisualtask AnimTask_StatsChange, 5 waitforvisualfinish @@ -28379,13 +31256,13 @@ Status_Infestation: loadspritegfx ANIM_TAG_SMALL_BUBBLES @circle particles monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x7320 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB(0, 25, 28) createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 30, 1 loopsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER, 0x0, 30 call InfestationVortex call InfestationVortex waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0x9, 0x0, 0x7320 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 9, 0, RGB(0, 25, 28) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end @@ -28649,14 +31526,14 @@ gBattleAnimGeneral_SimpleHeal:: gBattleAnimGeneral_IllusionOff:: monbg ANIM_TARGET - createvisualtask AnimTask_TransformMon, 2, 1, 0 + createvisualtask AnimTask_TransformMon, 2, SPECIES_GFX_CHANGE_ILLUSION_OFF waitforvisualfinish clearmonbg ANIM_TARGET end gBattleAnimGeneral_FormChange:: monbg ANIM_ATTACKER - createvisualtask AnimTask_TransformMon, 2, 1, 0 + createvisualtask AnimTask_TransformMon, 2, SPECIES_GFX_CHANGE_FORM_CHANGE waitforvisualfinish clearmonbg ANIM_ATTACKER end @@ -28688,7 +31565,7 @@ gBattleAnimGeneral_MegaEvolution:: createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA waitforvisualfinish createvisualtask SoundTask_PlayNormalCry, 0 - createvisualtask AnimTask_HideSwapSprite, 2, 1, 0 + createvisualtask AnimTask_HideSwapSprite, 2 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 createsprite gMegaSymbolSpriteTemplate ANIM_ATTACKER, 3, 0, 0, ANIM_ATTACKER @@ -28732,6 +31609,7 @@ MegaEvolutionSpinEffect: return gBattleAnimGeneral_TeraCharge:: + createvisualtask AnimTask_HideOpponentShadows, 2 @ Hide opponent shadows so they don't flicker between battle anims loadspritegfx ANIM_TAG_TERA_CRYSTAL loadspritegfx ANIM_TAG_TERA_SHATTER loadspritegfx ANIM_TAG_FOCUS_ENERGY @@ -28753,7 +31631,6 @@ gBattleAnimGeneral_TeraCharge:: delay 20 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA waitforvisualfinish - createvisualtask AnimTask_TransformMon, 2, 1, 0 call TeraChargeParticles playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_ATTACKER clearmonbg ANIM_ATK_PARTNER @@ -28770,14 +31647,37 @@ TeraChargeParticles: return gBattleAnimGeneral_TeraActivate:: + createvisualtask AnimTask_SetOpponentShadowCallbacks, 2 @ Restore shadows hidden in the charge script + loadspritegfx ANIM_TAG_TERA_SYMBOL + loadspritegfx ANIM_TAG_SPARKLE_6 + createvisualtask AnimTask_HideSwapSprite, 2 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 - waitforvisualfinish createvisualtask SoundTask_PlayNormalCry, 0 + createsprite gTeraSymbolSpriteTemplate ANIM_ATTACKER, 41, 0, 0, ANIM_ATTACKER + delay 2 + call TeraSpinEffect + call TeraSpinEffect + waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff end +TeraSpinEffect: + createsprite gTeraSmokeSpriteTemplate ANIM_ATTACKER, 7, 0, 12, 528, 30, 13, 50, 0 + delay 2 + createsprite gTeraSmokeSpriteTemplate ANIM_ATTACKER, 7, 0, 0, 480, 20, 16, -46, 0 + delay 2 + createsprite gTeraSmokeSpriteTemplate ANIM_ATTACKER, 7, 0, 1, 576, 20, 8, 42, 0 + delay 2 + createsprite gTeraSmokeSpriteTemplate ANIM_ATTACKER, 7, 0, 15, 400, 25, 11, -42, 0 + delay 2 + createsprite gTeraSmokeSpriteTemplate ANIM_ATTACKER, 7, 0, 12, 512, 25, 16, 46, 0 + delay 2 + createsprite gTeraSmokeSpriteTemplate ANIM_ATTACKER, 7, 0, 1, 464, 30, 15, -50, 0 + delay 2 + return + gBattleAnimGeneral_RestoreBg:: restorebg waitbgfadein @@ -28809,13 +31709,13 @@ gBattleAnimGeneral_ZMoveActivate:: end ZMoveBuffEffect: createsprite gBlueZMoveEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x3 + delay 3 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 @Red Buff - delay 0x3 + delay 3 createsprite gGreenZMoveEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x3 + delay 3 createsprite gYellowZMoveEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x3 + delay 3 return gBattleAnimGeneral_TotemFlare:: @@ -28839,13 +31739,13 @@ gBattleAnimGeneral_TotemFlare:: RainbowEndureEffect: createsprite gBlueEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x3 + delay 3 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 @Red Buff - delay 0x3 + delay 3 createsprite gGreenEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x3 + delay 3 createsprite gYellowEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x3 + delay 3 return gBattleAnimGeneral_GulpMissile:: @ Tackle anim (placeholder) @@ -28890,7 +31790,7 @@ General_PrimalReversion_Alpha: delay 20 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA waitforvisualfinish - createvisualtask AnimTask_HideSwapSprite, 2, 1, 0 + createvisualtask AnimTask_HideSwapSprite, 2 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 createvisualtask SoundTask_PlayNormalCry, 0 @@ -28923,7 +31823,7 @@ General_PrimalReversion_Omega: delay 20 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA waitforvisualfinish - createvisualtask AnimTask_HideSwapSprite, 2, 1, 0 + createvisualtask AnimTask_HideSwapSprite, 2 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 createvisualtask SoundTask_PlayNormalCry, 0 @@ -28963,7 +31863,7 @@ gBattleAnimGeneral_PowerConstruct:: delay 20 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA waitforvisualfinish - createvisualtask AnimTask_HideSwapSprite, 2, 1, 0 + createvisualtask AnimTask_HideSwapSprite, 2 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 createvisualtask SoundTask_PlayNormalCry, 0 @@ -29013,10 +31913,10 @@ gBattleAnimGeneral_UltraBurst:: monbg ANIM_ATTACKER setalpha 12, 8 createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HYDRO_PUMP, 0, 12, 12, RGB2GBA(250, 240, 230) - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ADJACENT), 0x2, 0x0, 0xF, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ADJACENT), 2, 0, 15, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 60, 2, 12 @ charge particles to attacker - delay 0x1e + delay 30 loopsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER, 0xe, 0xa createsprite gSuperpowerOrbSpriteTemplate, ANIM_TARGET, 3, 0x0 call LightThatBurnsTheSkyGreenSparks @@ -29033,7 +31933,7 @@ gBattleAnimGeneral_UltraBurst:: createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA createsprite gUltraBurstSymbolSpriteTemplate, ANIM_ATTACKER, 0x0, 0x0, 0x0, 0x0, 0x0 waitforvisualfinish - createvisualtask AnimTask_HideSwapSprite, 2, 1, 0 + createvisualtask AnimTask_HideSwapSprite, 2 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 createvisualtask SoundTask_PlayNormalCry, 0 @@ -29128,7 +32028,8 @@ gBattleAnimGeneral_Rainbow:: createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 1, 6, 0, RGB_WHITE waitforvisualfinish delay 30 - fadetobg BG_RAINBOW + goto SetRainbowBackground +AnimGeneral_RainbowContinue: panse_adjustnone SE_M_ABSORB_2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +1, 0 delay 90 blendoff @@ -29136,6 +32037,14 @@ gBattleAnimGeneral_Rainbow:: waitbgfadein clearmonbg ANIM_ATK_PARTNER end +SetRainbowBackground: + createvisualtask AnimTask_GetAttackerSide, 2 + jumprettrue SetRainbowBgOppoentSide + fadetobg BG_RAINBOW_PLAYER + goto AnimGeneral_RainbowContinue +SetRainbowBgOppoentSide: + fadetobg BG_RAINBOW_OPPONENT + goto AnimGeneral_RainbowContinue gBattleAnimGeneral_SeaOfFire:: loadspritegfx ANIM_TAG_SMALL_EMBER @@ -29225,6 +32134,16 @@ gBattleAnimGeneral_Swamp:: blendoff end +gBattleAnimGeneral_SwapToSubstitute:: + createvisualtask AnimTask_SwapMonSpriteToFromSubstitute, 2, FALSE + waitforvisualfinish + end + +gBattleAnimGeneral_SwapFromSubstitute:: + createvisualtask AnimTask_SwapMonSpriteToFromSubstitute, 2, TRUE + waitforvisualfinish + end + SnatchMoveTrySwapFromSubstitute: createvisualtask AnimTask_IsAttackerBehindSubstitute, 2 jumprettrue SnatchMoveSwapSubstituteForMon @@ -29331,15 +32250,15 @@ gBattleAnimMove_BreakneckBlitz:: playsewithpan SE_M_EARTHQUAKE, 0x0 monbg ANIM_ATTACKER splitbgprio ANIM_ATTACKER - delay 0x1 - createvisualtask AnimTask_BlendPalInAndOutByTag, 0x5, ANIM_TAG_HOLLOW_ORB, 0x4c00, 0xe, 0x0, 0x3 + delay 1 + createvisualtask AnimTask_BlendPalInAndOutByTag, 5, ANIM_TAG_HOLLOW_ORB, RGB(0, 0, 19), 14, 0, 3 createsprite gBreakneckBlitzDanceSpriteTemplate, ANIM_ATTACKER, 2, 0x0 createsprite gBreakneckBlitzDanceSpriteTemplate, ANIM_ATTACKER, 2, 0x2b createsprite gBreakneckBlitzDanceSpriteTemplate, ANIM_ATTACKER, 2, 0x55 createsprite gBreakneckBlitzDanceSpriteTemplate, ANIM_ATTACKER, 2, 0x80 createsprite gBreakneckBlitzDanceSpriteTemplate, ANIM_ATTACKER, 2, 0xaa createsprite gBreakneckBlitzDanceSpriteTemplate, ANIM_ATTACKER, 2, 0xd5 - delay 0xf + delay 15 createsprite gBreakneckBlitzDanceSpriteTemplate, ANIM_ATTACKER, 2, 0x0 createsprite gBreakneckBlitzDanceSpriteTemplate, ANIM_ATTACKER, 2, 0x2b createsprite gBreakneckBlitzDanceSpriteTemplate, ANIM_ATTACKER, 2, 0x55 @@ -29355,26 +32274,26 @@ gBattleAnimMove_BreakneckBlitz:: createvisualtask AnimTask_StartSlidingBg, 0x5, 0xf700, 0x300, 0x1, 0xffff waitbgfadein setalpha 12, 8 - delay 0x10 + delay 16 createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -24, 8, 23, 10, 40, 10 - delay 0x23 + delay 35 invisible ANIM_ATTACKER createsprite gGrowingSuperpowerTemplate, ANIM_TARGET, 3, 0x0 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER - delay 0x8 + delay 8 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createsprite gBreakneckBlitzHitSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x1 @ 0, 0 - delay 0x1 + delay 1 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createsprite gBreakneckBlitzHitSpriteTemplate, ANIM_TARGET, 3, 0xa, 0xfff6, 0x1, 0x1 @ +10, -10 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER - delay 0x1 + delay 1 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createsprite gBreakneckBlitzHitSpriteTemplate, ANIM_TARGET, 3, 0xf, 0xfff1, 0x1, 0x1 @ +15, -15 - delay 0x1 + delay 1 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createsprite gBreakneckBlitzHitSpriteTemplate, ANIM_TARGET, 3, 0x14, 0xffec, 0x1, 0x1 @ +20, -20 - delay 0x1 + delay 1 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createsprite gBreakneckBlitzHitSpriteTemplate, ANIM_TARGET, 3, 0x19, 0xffe7, 0x1, 0x1 @ +25, -25 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -26, 16, 1, 4 @@ -29383,15 +32302,15 @@ gBattleAnimMove_BreakneckBlitz:: createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 4, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish - delay 0x4 + delay 4 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -512, ANIM_TARGET, 1 - delay 0xa - delay 0x19 + delay 10 + delay 25 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x6 - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 waitforvisualfinish - delay 0x10 + delay 16 blendoff clearmonbg ANIM_DEF_PARTNER createvisualtask AnimTask_AllBattlersVisible, 0xA @@ -29422,66 +32341,66 @@ gBattleAnimMove_AllOutPummeling:: monbg ANIM_DEF_PARTNER createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 63, 1 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0x18, 0x0, 0x0, 0xa, 0x1, ANIM_FOOT_1, 0x1 - delay 0x2 + delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET - delay 0x8 + delay 8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xfffa, 0x12, 0x0, 0x0, 0xa, 0x1, ANIM_CHOP, 0x1 - delay 0x2 + delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET - delay 0x8 + delay 8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0x10, 0x0, 0x0, 0xa, 0x1, ANIM_FIST_1, 0x1 - delay 0x2 + delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET - delay 0x8 + delay 8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0x15, 0x0, 0x0, 0xa, 0x1, ANIM_FOOT_2, 0x1 - delay 0x2 + delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET - delay 0x8 + delay 8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0x14, 0x0, 0x0, 0xa, 0x1, ANIM_FIST_1, 0x1 - delay 0x2 + delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET - delay 0x8 + delay 8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x17, 0x0, 0x0, 0xa, 0x1, ANIM_CHOP, 0x1 - delay 0x2 + delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET - delay 0x8 + delay 8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0x11, 0x0, 0x0, 0xa, 0x1, ANIM_FOOT_1, 0x1 - delay 0x2 + delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET - delay 0x8 + delay 8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffb0, 0x10, 0x0, 0x0, 0xa, 0x1, ANIM_FOOT_2, 0x1 - delay 0x2 + delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET - delay 0x8 + delay 8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffa0, 0x15, 0x0, 0x0, 0xa, 0x1, ANIM_CHOP, 0x1 - delay 0x2 + delay 2 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET - delay 0x10 + delay 16 createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -24, 8, 23, 10, 40, 10 - delay 0x23 + delay 35 invisible ANIM_ATTACKER createsprite gGrowingSuperpowerTemplate, ANIM_TARGET, 3, 0x0 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER - delay 0xc + delay 12 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -48, 0, 0, 4 waitforvisualfinish - delay 0x30 + delay 48 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x7 - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 waitforvisualfinish - delay 0x10 + delay 16 blendoff clearmonbg ANIM_DEF_PARTNER createvisualtask AnimTask_AllBattlersVisible, 0xA @@ -29499,32 +32418,32 @@ gBattleAnimMove_SupersonicSkystrike:: createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish monbg ANIM_DEF_PARTNER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x8, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 8, 0, RGB_BLACK createvisualtask AnimTask_HorizontalShake, 5, ANIM_ATTACKER, 2, 16 playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0xf, 0x0, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 15, 0, RGB_WHITE clearmonbg ANIM_DEF_PARTNER call EndureEffect - delay 0x8 + delay 8 call EndureEffect - delay 0x20 - delay 0xA + delay 32 + delay 10 playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 - delay 0x2 + delay 2 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 12, 4, -16, 18 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 16, 4, -10, 18 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 14, 4, -18, 18 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 12, 4, -16, 18 - delay 0x30 + delay 48 createvisualtask AnimTask_DoomDesireLightBeam, 0x5 - delay 0x9 + delay 9 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER - delay 0x9 + delay 9 playsewithpan SE_M_MORNING_SUN, 0x0 - delay 0x9 + delay 9 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_TARGET - delay 0x19 + delay 25 fadetobg BG_SKY waitbgfadeout createvisualtask AnimTask_IsTargetPlayerSide, 0x2 @@ -29541,7 +32460,7 @@ FinishSupersonicSkystrike: setalpha 12, 8 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER createsprite gSupersonicSkystrikeFlySpriteTemplate, ANIM_ATTACKER, 2, 0x14 - delay 0x10 + delay 16 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -256, 21, 0, 4 @@ -29553,7 +32472,7 @@ FinishSupersonicSkystrike: createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 16, -16, -10, 24 @ 16, -38, -10, 24 createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 14, -52, -18, 24 @ 14, -20, -18, 24 createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 12, -32, -16, 24 @ 12, -36, -16, 24 - delay 0x30 + delay 48 clearmonbg ANIM_DEF_PARTNER blendoff createvisualtask AnimTask_AllBattlersVisible, 0xA @@ -29585,12 +32504,12 @@ FinishAcidDownpour: call AcidDownpourFlareOnAttacker call AcidDownpourFlareOnAttacker call AcidDownpourFlareOnAttacker - delay 0x5 + delay 5 clearmonbg ANIM_ATTACKER createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish blendoff - delay 0x20 + delay 32 loopsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET, 0xd, 0x3 createsprite gAcidDownpourReversalSpriteTemplate, ANIM_ATTACKER, 2, 0x1a, 0x0 createsprite gAcidDownpourReversalSpriteTemplate, ANIM_ATTACKER, 2, 0x1a, 0x2a @@ -29598,17 +32517,17 @@ FinishAcidDownpour: createsprite gAcidDownpourReversalSpriteTemplate, ANIM_ATTACKER, 2, 0x1a, 0x7e createsprite gAcidDownpourReversalSpriteTemplate, ANIM_ATTACKER, 2, 0x1a, 0xa8 createsprite gAcidDownpourReversalSpriteTemplate, ANIM_ATTACKER, 2, 0x1a, 0xd2 - delay 0x20 + delay 32 panse SE_M_WHIRLPOOL, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 createvisualtask AnimTask_CreateSurfWave, 0x2, ANIM_SURF_PAL_SLUDGE_WAVE - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0x7, 0xd87c + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 7, (RGB(28, 3, 22) | RGB_ALPHA) createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 50, 1 call AcidDownpourFlare call AcidDownpourFlare - delay 0x15 + delay 21 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -768, 21, 0, 42 - delay 0x2c - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x7, 0x0, 0xd87c + delay 44 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 7, 0, (RGB(28, 3, 22) | RGB_ALPHA) invisible ANIM_TARGET waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10 @@ -29621,31 +32540,31 @@ FinishAcidDownpour: end AcidDownpourFlare: createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, ANIM_TARGET - delay 0x2 + delay 2 createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, ANIM_TARGET - delay 0x2 + delay 2 createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, ANIM_TARGET - delay 0x2 + delay 2 createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, ANIM_TARGET - delay 0x2 + delay 2 createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, ANIM_TARGET - delay 0x2 + delay 2 createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, ANIM_TARGET - delay 0x2 + delay 2 return AcidDownpourFlareOnAttacker: createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 return @@ -29657,9 +32576,9 @@ gBattleAnimMove_TectonicRage:: createsprite gDirtMoundSpriteTemplate, ANIM_ATTACKER, 1, 0x0, 0x0, 0xb4 createsprite gDirtMoundSpriteTemplate, ANIM_ATTACKER, 1, 0x0, 0x1, 0xb4 monbg_static ANIM_ATTACKER - delay 0x1 + delay 1 createvisualtask AnimTask_DigDownMovement, 0x2, 0x0 - delay 0x6 + delay 6 call DigThrowDirt call DigThrowDirt call DigThrowDirt @@ -29667,22 +32586,22 @@ gBattleAnimMove_TectonicRage:: createvisualtask AnimTask_TectonicRageRollout, 0x2 call DigThrowDirt setalpha 12, 8 - delay 0x20 + delay 32 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER monbg ANIM_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, ANIM_TARGET, 2 - delay 0x1 + delay 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -256, 21, 0, 4 - delay 0xa + delay 10 waitforvisualfinish clearmonbg ANIM_TARGET createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish invisible ANIM_TARGET - delay 0x5 + delay 5 invisible ANIM_ATTACKER waitforvisualfinish - delay 0xa + delay 10 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10 fadetobg BG_TECTONIC_RAGE @ brown/yellow sky uppercut unloadspritegfx ANIM_TAG_DIRT_MOUND @ dig @@ -29697,18 +32616,18 @@ gBattleAnimMove_TectonicRage:: createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0xf800, 0x0, 0xffff waitbgfadein playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound - delay 0x1e + delay 30 createsprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 0xc8, 0xffe0, 0x0, 0x64, 0x0 createsprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 0x1e, 0xffe0, 0x10, 0x5a, 0x1 createsprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 0x96, 0xffe0, 0x20, 0x3c, 0x2 createsprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 0x5a, 0xffe0, 0x30, 0x50, 0x3 createsprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 0x6e, 0xffe0, 0x40, 0x32, 0x0 createsprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 0x3c, 0xffe0, 0x50, 0x46, 0x1 - delay 0x16 + delay 22 createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_RIGHT, 8, 60 createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_LEFT, 8, 60 loopsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET, 0x10, 0xc - delay 0x30 + delay 48 call TectonicRageExplosion playsewithpan SE_M_SACRED_FIRE, SOUND_PAN_ATTACKER createsprite gTectonicRageBlastBurnSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x0, 0x18, 0x0, 0x0, 0x0 @@ -29750,19 +32669,19 @@ gBattleAnimMove_TectonicRage:: TectonicRageExplosion: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 return @@ -29777,22 +32696,22 @@ gBattleAnimMove_ContinentalCrush:: waitforvisualfinish playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call ContinentalCrashBuffEffect - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(19, 14, 11) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call ContinentalCrashBuffEffect - delay 0x8 + delay 8 call ContinentalCrashBuffEffect - delay 0x4 - delay 0xA + delay 4 + delay 10 playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 - delay 0x2 + delay 2 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 12, 4, -16, 18 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 16, 4, -10, 18 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 14, 4, -18, 18 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 12, 4, -16, 18 - delay 0x30 + delay 48 createvisualtask AnimTask_GetTimeOfDay, 0x2 jumpargeq 0x0 0x0 ContinentalCrushDay jumpargeq 0x0 0x2 ContinentalCrushAfternoon @@ -29805,12 +32724,12 @@ ContinentalCrushDay: ContinentalCrushAfternoon: fadetobg BG_ROCK_FIELD_AFTERNOON FinishContinentalCrush: - delay 0x18 + delay 24 invisible ANIM_TARGET waitbgfadeout - delay 0x5 + delay 5 visible ANIM_ATTACKER - delay 0x4 + delay 4 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(19, 14, 11) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER @@ -29832,14 +32751,14 @@ FinishContinentalCrush: createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0xf800, 0x0, 0xffff waitbgfadein loopsewithpan SE_FALL, SOUND_PAN_ATTACKER, 0x20, 0x4 @;Falling sound - delay 0x1e + delay 30 createsprite gContinentalCrushEruptionSpriteTemplate, ANIM_ATTACKER, 40, 0xc8, 0xffe0, 0x0, 0x64, 0x0 createsprite gContinentalCrushEruptionSpriteTemplate, ANIM_ATTACKER, 40, 0x1e, 0xffe0, 0x10, 0x5a, 0x1 createsprite gContinentalCrushEruptionSpriteTemplate, ANIM_ATTACKER, 40, 0x96, 0xffe0, 0x20, 0x3c, 0x2 createsprite gContinentalCrushEruptionSpriteTemplate, ANIM_ATTACKER, 40, 0x5a, 0xffe0, 0x30, 0x50, 0x3 createsprite gContinentalCrushEruptionSpriteTemplate, ANIM_ATTACKER, 40, 0x6e, 0xffe0, 0x40, 0x32, 0x0 createsprite gContinentalCrushEruptionSpriteTemplate, ANIM_ATTACKER, 40, 0x3c, 0xffe0, 0x50, 0x46, 0x1 - delay 0x16 + delay 22 createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_RIGHT, 8, 28 createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_LEFT, 8, 28 unloadspritegfx ANIM_TAG_ROUND_SHADOW @ fly @@ -29847,10 +32766,10 @@ FinishContinentalCrush: unloadspritegfx ANIM_TAG_FOCUS_ENERGY @ focus energy unloadspritegfx ANIM_TAG_IMPACT @ hit loadspritegfx ANIM_TAG_REALLY_BIG_ROCK - delay 0x30 + delay 48 createsprite gContinentalCrushBigRockStompSpriteTemplate, ANIM_TARGET, 2, 0, 0x3c, 3, ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0x7, 0x0000 - delay 0x5 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 7, RGB_BLACK + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -256, 21, 0, 4 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, 12, -24, -16, 24 @ 12, -48, -16, 24 @@ -29861,9 +32780,9 @@ FinishContinentalCrush: createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, 16, -16, -10, 24 @ 16, -38, -10, 24 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 1, 14, -52, -18, 24 @ 14, -20, -18, 24 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 1, 12, -32, -16, 24 @ 12, -36, -16, 24 - delay 0x5 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x7, 0x0, 0x0000 @undo pal change on tgt - delay 0x10 + delay 5 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 7, 0, RGB_BLACK @undo pal change on tgt + delay 16 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10 waitforvisualfinish @@ -29872,45 +32791,45 @@ FinishContinentalCrush: setarg 0x7 0xffff createvisualtask AnimTask_AllBattlersVisible, 0xA waitbgfadein - delay 0x4 + delay 4 waitforvisualfinish end ContinentalCrashBuffEffect: createsprite gContinentalCrushFocusEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gContinentalCrushFocusEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gContinentalCrushFocusEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gContinentalCrushFocusEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gContinentalCrushFocusEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return ContinentalCrushStockpileRocks: createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x0, 0xffc0, 0x20 @ 0,-32 - delay 0x2 + delay 2 createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x2c, 0xffd4, 0x20 @ +44,-44 - delay 0x2 + delay 2 createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x3c, 0x0, 0x20 @ +60,0 - delay 0x2 + delay 2 createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x28, 0x28, 0x20 @ +40,+40 - delay 0x2 + delay 2 createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x0, 0x38, 0x20 @ +0,+56 - delay 0x2 + delay 2 createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0xffda, 0x26, 0x20 @ -38,+38 - delay 0x2 + delay 2 createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0xffca, 0x0, 0x20 @ -54, +0 - delay 0x2 + delay 2 createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0xffdc, 0xffdc, 0x20 @ -36, -36 - delay 0x2 + delay 2 createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x0, 0xffce, 0x20 @ 0, -50 - delay 0x2 + delay 2 createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x22, 0xffde, 0x20 @ +34, -34 - delay 0x2 + delay 2 createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x2e, 0x0, 0x20 @ +46, +0 - delay 0x2 + delay 2 createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x20, 0x20, 0x20 @ +32, +32 - delay 0x2 + delay 2 return @@ -29924,16 +32843,16 @@ gBattleAnimMove_SavageSpinOut:: waitforvisualfinish monbg ANIM_ATTACKER setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x4, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 4, RGB_BLACK createsprite gSavageSpinOutGreenChargeSpriteTemplate, ANIM_ATTACKER, 2, 0x0 - delay 0x19 + delay 25 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0x14 + delay 20 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0xf + delay 15 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x4, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 4, 0, RGB_BLACK clearmonbg ANIM_ATTACKER createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish @@ -29945,18 +32864,17 @@ gBattleAnimMove_SavageSpinOut:: call gSavageSpinOutStringBlastSpriteTemplateSHOT createsprite gSpiderWebSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, FALSE @ spider web call gSavageSpinOutStringBlastSpriteTemplateSHOT - delay 0xe + delay 14 blendoff waitforvisualfinish unloadspritegfx ANIM_TAG_STRING - unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT loadspritegfx ANIM_TAG_COCOON loadspritegfx ANIM_TAG_IMPACT @hit - delay 0x1 + delay 1 invisible ANIM_TARGET - delay 0x0 + delay 0 createvisualtask AnimTask_IsTargetPlayerSide, 0x2 - delay 0x0 + delay 0 jumpargeq 0x7 ANIM_TARGET SavageSpinOutOnPlayer SavageSpinOutOnOpponent: createsprite gSavageSpinOutCacoonSpriteTemplate, ANIM_TARGET, 2, 0x0, ANIM_TARGET, 0x2, 0x0, 0x0, 0x80 @@ -29968,7 +32886,7 @@ FinishSavageSpinOut: waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0x1000, 0x0, 0xffff @+0x1000 waitbgfadein - delay 0x10 + delay 16 call SlowSavageSpinOutBackgroundSpeed call SlowSavageSpinOutBackgroundSpeed call SlowSavageSpinOutBackgroundSpeed @@ -29981,20 +32899,20 @@ FinishSavageSpinOut: call SlowSavageSpinOutBackgroundSpeed call SlowSavageSpinOutBackgroundSpeed call SlowSavageSpinOutBackgroundSpeed @-0x1000 - delay 0x4 + delay 4 call SavageSpinOutCrash_2 @SeismicToss2 - delay 0xa + delay 10 call SavageSpinOutCrash_1 @SeismicToss1 - delay 0xa + delay 10 call SavageSpinOutCrash_2 @SeismicToss2 - delay 0xa + delay 10 call SavageSpinOutCrash_1 @SeismicToss1 - delay 0xc + delay 12 call UnsetPsychicBg setarg 0x7 0x0 @;Clear arg 7 so task works properly in Link battles - no idea why though - something to do with the background scrolling createvisualtask AnimTask_SnatchOpposingMonMove, 0x2 @ user fly on screen on enemy side playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER - delay 0x1E + delay 30 unloadspritegfx ANIM_TAG_MUD_SAND unloadspritegfx ANIM_TAG_IMPACT @hit loadspritegfx ANIM_TAG_CUT @cut @@ -30005,24 +32923,24 @@ FinishSavageSpinOut: createsprite gSavageSpinOutGreenCutSpriteTemplate, ANIM_TARGET, 2, 0x28, 0xffe0, 0x0 createsprite gSavageSpinOutGreenCutSpriteTemplate, ANIM_TARGET, 2, 0x28, 0xffd0, 0x0 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET - delay 0xc + delay 12 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSavageSpinOutWhiteExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSavageSpinOutWhiteExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 createsprite gSpiderWebSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, FALSE @ spider web playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSavageSpinOutWhiteExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSavageSpinOutWhiteExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSavageSpinOutWhiteExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 waitforvisualfinish createvisualtask AnimTask_AllBattlersVisible, 0xA waitforvisualfinish @@ -30031,19 +32949,19 @@ gSavageSpinOutStringBlastSpriteTemplateSHOT: playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gSavageSpinOutStringBlastSpriteTemplate, ANIM_TARGET, 2, 0xe, 0xfff4, 0x0, 0xfff4, 0xf, 0x0, 0x0 createsprite gSavageSpinOutStringBlastSpriteTemplate, ANIM_TARGET, 2, 0x1a, 0x8, 0xc, 0x8, 0xf, 0x0, 0x0 - delay 0x3 + delay 3 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gSavageSpinOutStringBlastSpriteTemplate, ANIM_TARGET, 2, 0xe, 0xfff4, 0x0, 0xfff4, 0xf, 0x1, 0x0 createsprite gSavageSpinOutStringBlastSpriteTemplate, ANIM_TARGET, 2, 0x1a, 0x8, 0xc, 0x8, 0xf, 0x1, 0x0 - delay 0x3 + delay 3 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gSavageSpinOutStringBlastSpriteTemplate, ANIM_TARGET, 2, 0xe, 0xfff4, 0x0, 0xfff4, 0xf, 0x2, 0x0 createsprite gSavageSpinOutStringBlastSpriteTemplate, ANIM_TARGET, 2, 0x1a, 0x8, 0xc, 0x8, 0xf, 0x2, 0x0 - delay 0x3 + delay 3 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gSavageSpinOutStringBlastSpriteTemplate, ANIM_TARGET, 2, 0xe, 0xfff4, 0x0, 0xfff4, 0xf, 0x3, 0x0 createsprite gSavageSpinOutStringBlastSpriteTemplate, ANIM_TARGET, 2, 0x1a, 0x8, 0xc, 0x8, 0xf, 0x3, 0x0 - delay 0x3 + delay 3 return SavageSpinOutCrash_1: createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -10, -8, ANIM_TARGET, 1 @@ -30063,7 +32981,7 @@ SavageSpinOutCrash_2: return SlowSavageSpinOutBackgroundSpeed: createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0xfd56, 0x0, 0xffff @-0x2aa - delay 0x1 + delay 1 return @@ -30078,26 +32996,26 @@ gBattleAnimMove_NeverEndingNightmare:: waitforvisualfinish playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call NeverendingNightmareBuffEffect - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(0, 6, 16) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call NeverendingNightmareBuffEffect - delay 0x8 + delay 8 call NeverendingNightmareBuffEffect playsewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET call NeverendingNightmareAttackerRings - delay 0x1 + delay 1 call NeverendingNightmareAttackerRings - delay 0x1 + delay 1 call NeverendingNightmareAttackerRings - delay 0xa + delay 10 playsewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET call NeverendingNightmareTargetRings - delay 0x1 + delay 1 call NeverendingNightmareTargetRings - delay 0x1 + delay 1 call NeverendingNightmareTargetRings - delay 0x1 + delay 1 waitforvisualfinish fadetobg BG_NEVERENDING_NIGHTMARE waitbgfadein @@ -30105,12 +33023,12 @@ gBattleAnimMove_NeverEndingNightmare:: playsewithpan SE_M_WHIRLPOOL, SOUND_PAN_TARGET call NeverendingNightmareHands call NeverendingNightmareHands - delay 0xa - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0x10, 0x40c0 @ fade to purple + delay 10 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 16, RGB(0, 6, 16) @ fade to purple playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET loadspritegfx ANIM_TAG_EXPLOSION_2 unloadspritegfx ANIM_TAG_THIN_RING - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_VERTICAL_HEX, 0x2, 0xA, 0xA, 0x580A @;Purple + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_VERTICAL_HEX, 2, 10, 10, RGB(10, 0, 22) @;Purple call NeverendingNightmareGeyser playsewithpan SE_M_SACRED_FIRE, SOUND_PAN_TARGET createsprite gNeverEndingNightmareBlastBurnSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x0, 0x18, 0x0, 0x0, 0x0 @@ -30145,7 +33063,7 @@ gBattleAnimMove_NeverEndingNightmare:: createsprite gNeverEndingNightmareBlastBurnSpriteTemplate, ANIM_ATTACKER, 2, 0xffc4, 0x1e, 0x18, 0x0, 0x0, 0x0 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET call NeverendingNightmareGeyser - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x10, 0x0, 0x40c0 @ fade to normal + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 16, 0, RGB(0, 6, 16) @ fade to normal waitforvisualfinish restorebg waitbgfadeout @@ -30154,99 +33072,99 @@ gBattleAnimMove_NeverEndingNightmare:: end NeverendingNightmareBuffEffect: createsprite gNeverEndingNightmareFocusEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gNeverEndingNightmareFocusEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gNeverEndingNightmareFocusEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gNeverEndingNightmareFocusEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gNeverEndingNightmareFocusEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return NeverendingNightmareTargetRings: createsprite gNeverEndingNightmareRingTargetSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x100, 0x0 - delay 0x8 + delay 8 return NeverendingNightmareAttackerRings: createsprite gNeverEndingNightmareRingAttackerSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 - delay 0xe + delay 14 return NeverendingNightmareHands: createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x0, 0xffc0, 0x20 @ 0,-32 - delay 0x2 + delay 2 createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x2c, 0xffd4, 0x20 @ +44,-44 - delay 0x2 + delay 2 createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x3c, 0x0, 0x20 @ +60,0 - delay 0x2 + delay 2 createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x28, 0x28, 0x20 @ +40,+40 - delay 0x2 + delay 2 createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x0, 0x38, 0x20 @ +0,+56 - delay 0x2 + delay 2 createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0xffda, 0x26, 0x20 @ -38,+38 - delay 0x2 + delay 2 createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0xffca, 0x0, 0x20 @ -54, +0 - delay 0x2 + delay 2 createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0xffdc, 0xffdc, 0x20 @ -36, -36 - delay 0x2 + delay 2 createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x0, 0xffce, 0x20 @ 0, -50 - delay 0x2 + delay 2 createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x22, 0xffde, 0x20 @ +34, -34 - delay 0x2 + delay 2 createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x2e, 0x0, 0x20 @ +46, +0 - delay 0x2 + delay 2 createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x20, 0x20, 0x20 @ +32, +32 - delay 0x2 + delay 2 return NeverendingNightmareGeyser: createsprite gNeverEndingNightmareExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0003, 0x0005, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0xfffc, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0xfff5, 0xfff1, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0x100D, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0x0008, 0xfffb, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0x4, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0xfffa, 0x0012, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0xfff0, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0x0000, 0x0005, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0xfffc, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0x0003, 0xfff5, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0xfff5, 0xffe1, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0x0008, 0xffeb, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0xfff0, 0x10 - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0xfffa, 0x0002, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0xfffc, 0x10 - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0x0000, 0xfff5, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0x0003, 0xffe5, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0xfff5, 0xffd1, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0xfff0, 0x10 - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0x0008, 0xffdb, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0xfffc, 0x10 - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0xfffa, 0xfff2, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0x0000, 0xffe5, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0xfff0, 0x10 return @@ -30261,8 +33179,8 @@ gBattleAnimMove_CorkscrewCrash:: invisible ANIM_TARGET createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0xb, 0x6318 @fade atker to gray - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_SPIKES, 0x0, 0xC, 0xC, 0x6318 @;Gray + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 11, RGB(24, 24, 24) @fade atker to gray + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPIKES, 0, 12, 12, RGB(24, 24, 24) @;Gray playsewithpan SE_ESCALATOR, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 79, 1 createsprite gCorkscrewCrashChargeSpriteTemplate, ANIM_ATTACKER, 2, 0x0 @@ -30273,7 +33191,7 @@ gBattleAnimMove_CorkscrewCrash:: call CorkscrewCrashMetalFlare waitforvisualfinish clearmonbg ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0xb, 0x0, 0x6318 @fade atker back + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 11, 0, RGB(24, 24, 24) @fade atker back waitforvisualfinish stopsound invisible ANIM_ATTACKER @@ -30288,24 +33206,24 @@ gBattleAnimMove_CorkscrewCrash:: CorkscrewCrashOnOpponent: createsprite gCorkscrewCrashRightUpSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x88, 0x100, 0x38, 0x15 waitforvisualfinish - delay 0xa + delay 10 createsprite gCorkscrewCrashLeftUpSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x38, 0xfff0, 0x38, 0x15 waitforvisualfinish visible ANIM_TARGET - delay 0x5 + delay 5 goto FinishCorkscrewCrash CorkscrewCrashOnPlayer: createsprite gCorkscrewCrashLeftDownSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x08, 0xfff0, 0x0f, 0x15 waitforvisualfinish - delay 0xa + delay 10 createsprite gCorkscrewCrashRightDownSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x38, 0x100, 0x38, 0x15 waitforvisualfinish visible ANIM_TARGET - delay 0x5 + delay 5 FinishCorkscrewCrash: createsprite gCorkscrewCrashStrikeSpriteTemplate, ANIM_TARGET, 2, 0x14 loadspritegfx ANIM_TAG_IMPACT @hit - delay 0x10 + delay 16 stopsound playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 0 @@ -30314,36 +33232,36 @@ FinishCorkscrewCrash: createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET createsprite gCorkscrewCrashCorkscrewFlyDownSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xffc0, 0x0f - delay 0xf + delay 15 createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 2, 48 createsprite gCorkscrewCrashCorkscrewFlyDownSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xfffe, 0x03 call CorkscrewCrashSpinningWind call CorkscrewCrashSprayRocks - delay 0x6 + delay 6 call CorkscrewCrashSprayRocks - delay 0x6 + delay 6 call CorkscrewCrashSprayRocks - delay 0x6 + delay 6 call CorkscrewCrashSprayRocks - delay 0x0 + delay 0 createsprite gCorkscrewCrashCorkscrewFlyDownSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xfffe, 0x03 - delay 0x6 + delay 6 call CorkscrewCrashSprayRocks - delay 0x6 + delay 6 call CorkscrewCrashSprayRocks - delay 0x6 + delay 6 call CorkscrewCrashSprayRocks - delay 0x1 + delay 1 createsprite gCorkscrewCrashCorkscrewFlyDownSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xfffe, 0x03 - delay 0x4 + delay 4 call CorkscrewCrashSprayRocks - delay 0x6 + delay 6 call CorkscrewCrashSprayRocks - delay 0x6 + delay 6 call CorkscrewCrashSprayRocks - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x2, 0x0, 0x10, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 2, 0, 16, RGB_WHITE waitforvisualfinish - delay 0x10 + delay 16 call ResetFromWhiteScreen waitforvisualfinish end @@ -30357,17 +33275,17 @@ CorkscrewCrashSpinningWind: return CorkscrewCrashMetalFlare: createsprite gCorkscrewCrashMetalBitSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gCorkscrewCrashMetalBitSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gCorkscrewCrashMetalBitSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gCorkscrewCrashMetalBitSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gCorkscrewCrashMetalBitSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gCorkscrewCrashMetalBitSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 return CorkscrewCrashSprayRocks: playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET @@ -30381,7 +33299,7 @@ CorkscrewCrashSprayRocks: gBattleAnimMove_InfernoOverdrive:: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge loadspritegfx ANIM_TAG_SMALL_EMBER @fire - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_CIRCLE_OF_LIGHT, 0x0, 0xA, 0xA, 0x1F + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 10, 10, RGB_RED createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish fadetobg BG_INFERNO_OVERDRIVE @@ -30416,16 +33334,15 @@ FinishInfernoOverdrive: clearmonbg ANIM_ATTACKER createsprite gInfernoOverdriveSuperpowerSpriteTemplate, ANIM_TARGET, 3, 0x0 @ super power shot playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER - delay 0x10 + delay 16 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 8, 0, 16, 1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 79, 1 call InfernoOverdriveExplosion - delay 0x6 + delay 6 call InfernoOverdriveExplosion - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x1, 0x0, 0x10, 0x001b @ red bg pal - delay 0x6 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 1, 0, 16, RGB(27, 0, 0) @ red bg pal + delay 6 call InfernoOverdriveExplosion waitforvisualfinish call ResetFromRedScreen @@ -30433,17 +33350,17 @@ FinishInfernoOverdrive: end InfernoOverdriveFireSpin: createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 return InfernoOverdriveExplosion: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER @@ -30453,7 +33370,7 @@ InfernoOverdriveExplosion: createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x2, 0x0 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0xfffe, 0x2 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0x2, 0x2 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xa, 0x0, 0xfffe @@ -30461,7 +33378,7 @@ InfernoOverdriveExplosion: createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x2, 0x0 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0xfffe, 0x2 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0x2, 0x2 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xa, 0x0, 0xfffe @@ -30469,7 +33386,7 @@ InfernoOverdriveExplosion: createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x2, 0x0 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0xfffe, 0x2 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0x2, 0x2 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xa, 0x0, 0xfffe @@ -30477,7 +33394,7 @@ InfernoOverdriveExplosion: createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x2, 0x0 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0xfffe, 0x2 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0x2, 0x2 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x10, 0x10, ANIM_TARGET, 0x1 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xa, 0x0, 0xfffe @@ -30498,7 +33415,7 @@ gBattleAnimMove_HydroVortex:: createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish createvisualtask AnimTask_CreateSurfWave, 0x2, 0x0 - delay 0x18 + delay 24 panse SE_M_SURF, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 waitforvisualfinish loadspritegfx ANIM_TAG_ROUND_SHADOW @@ -30513,14 +33430,14 @@ gBattleAnimMove_HydroVortex:: call DiveSetUpWaterDroplets call DiveSetUpWaterDroplets createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -768, 21, 0, 26 - delay 0x1a + delay 26 invisible ANIM_TARGET waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x7 - delay 0x5 + delay 5 fadetobg BG_WATER_PULSE waitbgfadeout - delay 0x5 + delay 5 visible ANIM_ATTACKER visible ANIM_TARGET loopsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET, 0x14, 0x3 @@ -30536,10 +33453,10 @@ gBattleAnimMove_HydroVortex:: createsprite gHydroVortexSuperpowerSpriteTemplate, ANIM_TARGET, 3, 0x0 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER invisible ANIM_ATTACKER - delay 0x10 + delay 16 createsprite gHydroVortexImpactSpriteTemplate, ANIM_TARGET, 3, 0xa, 0xfff8, 0x1, 0x1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0x10, 0x5da0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 16, RGB(0, 13, 23) loadspritegfx ANIM_TAG_GUST createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 8, 60 call HydroVortexWhirlpoolHurricane @@ -30547,7 +33464,7 @@ gBattleAnimMove_HydroVortex:: call HydroVortexWhirlpoolHurricane call HydroVortexWhirlpoolHurricane waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x10, 0x0, 0x5da0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 16, 0, RGB(0, 13, 23) waitforvisualfinish restorebg waitbgfadeout @@ -30557,25 +33474,25 @@ gBattleAnimMove_HydroVortex:: HydroVortexBubbles: createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x14, ANIM_ATTACKER createsprite gSmallBubblePairSpriteTemplate, ANIM_TARGET, 2, 0xa, 0xa, 0x14, ANIM_TARGET - delay 0x4 + delay 4 createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 0x14, 0xffec, 0x14, ANIM_ATTACKER createsprite gSmallBubblePairSpriteTemplate, ANIM_TARGET, 2, 0x14, 0xffec, 0x14, ANIM_TARGET - delay 0x4 + delay 4 createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 0xfff1, 0xf, 0x14, ANIM_ATTACKER createsprite gSmallBubblePairSpriteTemplate ANIM_TARGET, 2, 0xfff1, 0xf, 0x14, ANIM_TARGET - delay 0x4 + delay 4 createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, ANIM_ATTACKER createsprite gSmallBubblePairSpriteTemplate ANIM_TARGET, 2, 0x0, 0x0, 0x14, ANIM_TARGET - delay 0x4 + delay 4 createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xffec, 0x14, ANIM_ATTACKER createsprite gSmallBubblePairSpriteTemplate ANIM_TARGET, 2, 0xfff6, 0xffec, 0x14, ANIM_TARGET - delay 0x4 + delay 4 createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 0x10, 0xfff8, 0x14, ANIM_ATTACKER createsprite gSmallBubblePairSpriteTemplate ANIM_TARGET, 2, 0x10, 0xfff8, 0x14, ANIM_TARGET - delay 0x4 + delay 4 createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 0x5, 0x8, 0x14, ANIM_ATTACKER createsprite gSmallBubblePairSpriteTemplate ANIM_TARGET, 2, 0x5, 0x8, 0x14, ANIM_TARGET - delay 0x4 + delay 4 createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 0xfff0, 0x0, 0x14, ANIM_ATTACKER createsprite gSmallBubblePairSpriteTemplate ANIM_TARGET, 2, 0xfff0, 0x0, 0x14, ANIM_TARGET return @@ -30585,20 +33502,20 @@ HydroVortexWhirlpoolHurricane: createsprite gHydroVortexImpactSpriteTemplate, ANIM_TARGET, 3, 0xfff6, 0xfff8, 0x1, 0x1 createvisualtask AnimTask_AnimateGustTornadoPalette, 0x5, 0x1, 0x46 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, 0x1 - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, 0x1 - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, 0x1 - delay 0x2 + delay 2 createsprite gHydroVortexImpactSpriteTemplate, ANIM_TARGET, 3, 0xa, 0xfff8, 0x1, 0x1 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, 0x1 - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, 0x1 createsprite gHydroVortexHurricaneSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xfff0 createvisualtask AnimTask_AnimateGustTornadoPalette, 0x5, 0x1, 0x46 - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, 0x1 - delay 0x2 + delay 2 return @@ -30612,30 +33529,30 @@ gBattleAnimMove_BloomDoom:: createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x4, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 4, RGB_BLACK loopsewithpan SE_SHINY, SOUND_PAN_ATTACKER, 0x9, 0x3 createsprite gBloomDoomGreenChargeSpriteTemplate, ANIM_ATTACKER, 2, 0x0 - delay 0x3C + delay 60 blendoff createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x0 playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x4 - delay 0x2 + delay 2 createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x8 playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0xc - delay 0x2 + delay 2 createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x10 playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x14 - delay 0x2 + delay 2 createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x18 playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x4, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 4, 0, RGB_BLACK waitforvisualfinish unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT call BloomDoomHurricane @@ -30665,11 +33582,11 @@ gBattleAnimMove_BloomDoom:: fadetobg BG_BLOOM_DOOM waitbgfadein loadspritegfx ANIM_TAG_ORBS - delay 0x5 + delay 5 createsprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 0, 0x18, 0x10, 0x0, 0x2, 0x2, 0x0, 0x0 createsprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 66, 0x40, 0x18, 0x0, 0x3, 0x1, 0x1, 0x0 createsprite gAromatherapyBigFlowerSpriteTemplate, ANIM_ATTACKER, 0, 0x10, 0x18, 0x0, 0x2, 0x1, 0x0, 0x0 - delay 0x5 + delay 5 createsoundtask SoundTask_LoopSEAdjustPanning, 0xf0, 0xffc0, SOUND_PAN_TARGET, 0x1, 0xf, 0x0, 0x5 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 50, 1 @ shake attacker call BloomDoomHyperBeam @@ -30678,7 +33595,7 @@ gBattleAnimMove_BloomDoom:: call BloomDoomHyperBeam call BloomDoomHyperBeam createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 114, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0xb, 0x33ed + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 11, RGB(13, 31, 12) call BloomDoomHyperBeam call BloomDoomHyperBeam call BloomDoomHyperBeam @@ -30706,15 +33623,15 @@ gBattleAnimMove_BloomDoom:: createsprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 66, 0x50, 0x1e, 0x0, 0x4, 0x1, 0x1, 0x0 createsprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 0, 0x80, 0xc, 0x0, 0x3, 0x3, 0x0, 0x0 createsprite gAromatherapyBigFlowerSpriteTemplate, ANIM_ATTACKER, 0, 0x5a, 0x10, 0x0, 0x2, 0x1, 0x0, 0x0 - delay 0x5 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0xb, 0x0, 0x33ed + delay 5 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 11, 0, RGB(13, 31, 12) loadspritegfx ANIM_TAG_EXPLOSION @explosion call BloomDoomPetalBlast - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0x0, 0x10, 0x33ed + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 0, 16, RGB(13, 31, 12) call BloomDoomPetalBlast createvisualtask AnimTask_IsTargetPartner, 0x5 jumpargeq 0x0 0x1 BloomDoomFadeScreenTargetPartner - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 0x1, 0x0, 0x10, 0x33ed @ green bg pal + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 1, 0, 16, RGB(13, 31, 12) @ green bg pal BloomDoomEnding: call BloomDoomPetalBlast waitforvisualfinish @@ -30722,7 +33639,7 @@ BloomDoomEnding: call ResetFromGreenScreen end BloomDoomFadeScreenTargetPartner: - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ALL_BUT_ATK_PARTNER), 0x1, 0x0, 0x10, 0x33ed @ green bg pal + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ALL_BUT_ATK_PARTNER), 1, 0, 16, RGB(13, 31, 12) @ green bg pal goto BloomDoomEnding BloomDoomHurricane: createsprite gBloomDoomHurricaneSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 @@ -30730,68 +33647,68 @@ BloomDoomHurricane: return BloomDoomFlowerGeyser: createsprite gBloomDoomFlowerGeyserSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0xfffc, 0x10 @ -4, -0x10 - delay 0x0 + delay 0 createsprite gBloomDoomFlowerGeyserSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gBloomDoomFlowerGeyserSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gBloomDoomFlowerGeyserSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0xfff0, 0x10 - delay 0x0 + delay 0 return BloomDoomHyperBeam: createsprite gBloomDoomGreenBeamSpriteTemplate, ANIM_TARGET, 2 createsprite gBloomDoomGreenBeamSpriteTemplate, ANIM_TARGET, 2 - delay 0x1 + delay 1 return BloomDoomPetalBlast: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBloomDoomExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0xffe0, 0x10 - delay 0x2 + delay 2 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x16, 0xffea, 0x10 - delay 0x2 + delay 2 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x1e, 0x0, 0x10 - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBloomDoomExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x14, 0x14, 0x10 - delay 0x2 + delay 2 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0x1c, 0x10 - delay 0x2 + delay 2 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xffed, 0x13, 0x10 - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBloomDoomExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xffe5, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xffee, 0xffee, 0x10 - delay 0x2 + delay 2 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0xffe7, 0x10 - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBloomDoomExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x11, 0xffef, 0x10 - delay 0x2 + delay 2 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x17, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x10, 0x10, 0x10 - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBloomDoomExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x2 + delay 2 return ResetFromGreenScreen: createvisualtask AnimTask_AllBattlersInvisible, 0xA waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BATTLERS_2, 0x2, 0x0, 0x0, 0x33ED @Everything from green + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BATTLERS_2, 2, 0, 0, RGB(13, 31, 12) @Everything from green restorebg waitbgfadeout setarg 0x7 0xffff createvisualtask AnimTask_AllBattlersVisible, 0xA waitbgfadein waitforvisualfinish - delay 0x5 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x0, 0x33ED + delay 5 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 0, RGB(13, 31, 12) waitforvisualfinish return @@ -30806,33 +33723,33 @@ gBattleAnimMove_GigavoltHavoc:: loadspritegfx ANIM_TAG_THIN_RING createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x6, 0x0, 0x10, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 6, 0, 16, RGB_BLACK playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gGigavoltHavocChargingSpearSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 - delay 0xa + delay 10 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 - delay 0x0 - delay 0x5 + delay 0 + delay 5 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 - delay 0x5 + delay 5 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x0, 0x10, 0xc, 0x20, 0x14, 0x0, 0x0 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x0, 0x10, 0xc, 0x60, 0x14, 0x1, 0x0 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x0, 0x10, 0xc, 0xa0, 0x14, 0x0, 0x0 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x0, 0x10, 0xc, 0xe0, 0x14, 0x2, 0x0 - delay 0x5 + delay 5 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER monbg ANIM_ATTACKER @@ -30842,72 +33759,72 @@ gBattleAnimMove_GigavoltHavoc:: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x10, 0x2c, 0x60, 0x28, 0x1, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x10, 0x2c, 0xa0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x10, 0x2c, 0xe0, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x12, 0x2c, 0x0, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x12, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x12, 0x2c, 0x80, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x12, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x14, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x14, 0x2c, 0x40, 0x28, 0x1, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x14, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x14, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 waitforvisualfinish playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET createsprite gGigavoltHavocLaunchSpearSpriteTemplate, ANIM_TARGET, 3, 0x0 createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x10, 0x10 - delay 0x2 + delay 2 createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0, 0xfff0 - delay 0xe + delay 14 clearmonbg ANIM_ATTACKER createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 8, 28 @shake target unloadspritegfx ANIM_TAG_HAVOC_SPEAR loadspritegfx ANIM_TAG_SHOCK_3 @thunderbolt createsprite gThunderboltOrbSpriteTemplate, ANIM_TARGET, 3, 0x2c, 0x0, 0x0, 0x3 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x0, 0x0, 0xc, 0x5bff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0, 0, 12, RGB(31, 31, 22) @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x20, 0x2c, 0x0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x20, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x20, 0x2c, 0x80, 0x28, 0x0, 0x8003 @@ -30917,7 +33834,7 @@ gBattleAnimMove_GigavoltHavoc:: @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x10, 0x2c, 0xa0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x10, 0x2c, 0xe0, 0x28, 0x2, 0x8003 playsewithpan SE_M_HYPER_BEAM, SOUND_PAN_TARGET - delay 0x19 + delay 25 loadspritegfx ANIM_TAG_VERTICAL_HEX playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET @ call HavocSpearSparkTarget @@ -30941,9 +33858,9 @@ gBattleAnimMove_GigavoltHavoc:: @ call HavocSpearSparkTarget call HavocSpearGeyser playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0xc, 0x0, 0x5bff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 12, 0, RGB(31, 31, 22) waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_AllBattlersVisible, 0xa waitforvisualfinish @@ -30979,38 +33896,38 @@ gBattleAnimMove_ShatteredPsyche:: loadspritegfx ANIM_TAG_TORN_METAL @brick break shatter createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPalExclude, 0x5, 0x0, 0x0, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, ANIM_ATTACKER, 0, 0, 16, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_SetAllNonAttackersInvisiblity, 0x5, 0x1 waitforvisualfinish createsprite gShatteredPsychePinkChargeSpriteTemplate, ANIM_ATTACKER, 2, 0x0 createsprite gShatteredPsycheRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER - delay 0xc + delay 12 createsprite gShatteredPsycheRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 - delay 0xc + delay 12 createsprite gShatteredPsycheRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER - delay 0xc + delay 12 createsprite gShatteredPsycheRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 - delay 0xc + delay 12 createsprite gShatteredPsycheRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER - delay 0xc + delay 12 createsprite gShatteredPsycheRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 - delay 0xc + delay 12 createsprite gShatteredPsycheRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER - delay 0xc + delay 12 createsprite gShatteredPsycheRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 - delay 0xc + delay 12 createsprite gShatteredPsycheRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER - delay 0x4 + delay 4 fadetobg BG_SHATTERED_PSYCHE - delay 0x4 - createvisualtask AnimTask_BlendBattleAnimPalExclude, 0x5, 0x0, 0x0, 0x10, 0x0, 0x0 - delay 0x7 + delay 4 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, ANIM_ATTACKER, 0, 16, 0, RGB_BLACK + delay 7 playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 15, 1 createvisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 15, ANIM_TARGET, 1 @@ -31028,7 +33945,7 @@ ShatteredPsycheOnPlayer: call ShatteredPsycheFlingPlayer waitforvisualfinish ShatteredPsycheFinish: - delay 0x8 + delay 8 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET restorebg createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 15, 1 @@ -31046,56 +33963,56 @@ ShatteredPsycheFlingOpponent: waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0x1a, 0xfff0, 0x1, 0x1 @ 26, -16 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 26, -16, 1, 4 @ -26,-16 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0xffe6, 0x10, 0x1, 0x1 @ 26, 16 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, 32, 1, 4 @ 0,32 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xffe0, 0x1, 0x1 @ 0, -32 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, -32, 1, 4 @ 0,-32 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x20, 0x1, 0x1 @ 0, 32 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 26, 16, 1, 4 @ 26,16 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0xffe6, 0xfff0, 0x1, 0x1 @ -26, -16 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -26, -32, 1, 4 @ 26,-16 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0x1a, 0x10, 0x1, 0x1 @ 0, 32 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x5 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -26, 16, 1, 4 @ -26, +16 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0x1a, 0xfff0, 0x1, 0x1 @ 26, -16 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 26, -16, 1, 4 @ -26,-16 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0xffe6, 0x10, 0x1, 0x1 @ 26, 16 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish return @@ -31104,28 +34021,28 @@ ShatteredPsycheFlingPlayer: waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0x1a, 0xfff0, 0x1, 0x1 @ 26, 16 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 32, 0, 1, 4 @ 32,0 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0xffe0, 0x0, 0x1, 0x1 @ playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -32, 0, 1, 4 @ -32,0 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0x20, 0x0, 0x1, 0x1 @ 32, 0 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 10, 32, 1, 4 @ 10, -32 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0xfff6, 0x5, 0x1, 0x1 @ 10, -32 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x5 waitforvisualfinish return @@ -31135,7 +34052,7 @@ gBattleAnimMove_SubzeroSlammer:: loadspritegfx ANIM_TAG_ICE_CRYSTALS @ice loadspritegfx ANIM_TAG_ICE_CUBE @glacier loadspritegfx ANIM_TAG_EXPLOSION_2 @explosion - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_EXPLOSION_2, 0x0, 0xC, 0xC, 0x6A23 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION_2, 0, 12, 12, RGB(3, 17, 26) createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish fadetobg BG_ICE @@ -31150,30 +34067,30 @@ SubzeroSlammerOnPlayer: SubzeroSlammerFinish: waitbgfadein monbg ANIM_ATK_PARTNER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0x0, 0xb, 0x7e80 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 0, 11, RGB(0, 20, 31) createsprite gSubzeroSlammerIceSpinSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x38, 0x0 playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gSubzeroSlammerIceSpinSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x38, 0x4 playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gSubzeroSlammerIceSpinSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x38, 0x8 playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gSubzeroSlammerIceSpinSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x38, 0xc playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gSubzeroSlammerIceSpinSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x38, 0x10 playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gSubzeroSlammerIceSpinSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x38, 0x14 playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gSubzeroSlammerIceSpinSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x38, 0x18 playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER - delay 0x20 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0xb, 0x0, 0x7e80 - delay 0x20 + delay 32 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 11, 0, RGB(0, 20, 31) + delay 32 createvisualtask AnimTask_FrozenIceCubeAttacker, 0x2 waitplaysewithpan SE_M_HAIL, SOUND_PAN_TARGET, 0x11 waitforvisualfinish @@ -31182,16 +34099,16 @@ SubzeroSlammerFinish: createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call SubzeroSlammerIceSwirl call SubzeroSlammerIceSwirl - delay 0xa + delay 10 clearmonbg ANIM_ATK_PARTNER createsoundtask SoundTask_LoopSEAdjustPanning, 0xb0, 0xffc0, SOUND_PAN_TARGET, 0x4, 0x4, 0x0, 0xa createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, 0x14, 0xc, 0x0, 0xc, 0x14 createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, 0x14, 0xfff4, 0x0, 0xfff4, 0x14 - delay 0x1 + delay 1 call IceBeamCreateCrystals call IceBeamCreateCrystals call IceBeamCreateCrystals - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0x7, 0x7e80 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 4, 0, 7, RGB(0, 20, 31) createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 25, 1 call IceBeamCreateCrystals call IceBeamCreateCrystals @@ -31206,14 +34123,14 @@ SubzeroSlammerFinish: call IceBeamCreateCrystals call IceBeamCreateCrystals call IceCrystalEffectShort - delay 0x5 + delay 5 monbg ANIM_DEF_PARTNER createvisualtask AnimTask_FrozenIceCube, 0x82 playsewithpan SE_M_HAIL, SOUND_PAN_TARGET waitforvisualfinish loadspritegfx ANIM_TAG_TORN_METAL playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - delay 0x3 + delay 3 createsprite gBrickBreakWallShardSpriteTemplate ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0x0 @ -8, -12 createsprite gBrickBreakWallShardSpriteTemplate ANIM_TARGET, 2, 0x1, 0x1, 0x0, 0x0 createsprite gBrickBreakWallShardSpriteTemplate ANIM_TARGET, 2, 0x1, 0x2, 0x0, 0x0 @@ -31222,7 +34139,7 @@ SubzeroSlammerFinish: call SubzeroSlammerExplosion call SubzeroSlammerExplosion clearmonbg ANIM_DEF_PARTNER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x5, 0x7, 0x0, 0x7e80 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 5, 7, 0, RGB(0, 20, 31) waitforvisualfinish restorebg waitbgfadeout @@ -31235,50 +34152,50 @@ SubzeroSlammerExplosion: playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSubzeroSlammerExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0xfff6, 0xfff6, 0x0 - delay 0x3 + delay 3 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0xa, 0x14, 0x0 - delay 0x3 + delay 3 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSubzeroSlammerExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0xfffb, 0xa, 0x0 - delay 0x3 + delay 3 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0x11, 0xfff4, 0x0 - delay 0x3 + delay 3 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSubzeroSlammerExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0xfff1, 0xf, 0x0 - delay 0x3 + delay 3 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x0 - delay 0x3 + delay 3 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSubzeroSlammerExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0x14, 0x2, 0x0 - delay 0x3 + delay 3 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0xfff6, 0xfff6, 0x0 - delay 0x3 + delay 3 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSubzeroSlammerExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0x11, 0xfff4, 0x0 - delay 0x3 + delay 3 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0xfff1, 0xf, 0x0 - delay 0x3 + delay 3 return SubzeroSlammerIceSwirl: playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER createsprite gSubzeroSlammerIceSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gSubzeroSlammerIceSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER createsprite gSubzeroSlammerIceSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gSubzeroSlammerIceSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER createsprite gSubzeroSlammerIceSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gSubzeroSlammerIceSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 return @@ -31289,17 +34206,17 @@ gBattleAnimMove_DevastatingDrake:: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @ shock wave playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call DevastatingDrakeBuffEffect - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(0, 6, 16) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call DevastatingDrakeBuffEffect - delay 0x8 + delay 8 call DevastatingDrakeBuffEffect waitforvisualfinish unloadspritegfx ANIM_TAG_FOCUS_ENERGY playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeShockwaveSpriteTemplate, ANIM_ATTACKER, 2 - delay 0x2a + delay 42 unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT monbg ANIM_ATTACKER playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER @@ -31318,11 +34235,11 @@ DevastatingDrakeOnOpponent: playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeRightSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x88, 0x100, 0x38, 0x15 @left to right waitforvisualfinish - delay 0xa + delay 10 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeLeftSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x38, 0xfff0, 0x38, 0x15 @right to left waitforvisualfinish - delay 0xa + delay 10 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeRightSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x08, 0x100, 0x0f, 0x15 @left to right goto DevastatingDrakeFinish @@ -31330,43 +34247,43 @@ DevastatingDrakeOnPlayer: playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeLeftSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x08, 0xfff0, 0x0f, 0x15 @right to left waitforvisualfinish - delay 0xa + delay 10 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeRightSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x38, 0x100, 0x38, 0x15 @left to right waitforvisualfinish - delay 0xa + delay 10 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeLeftSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x78, 0xfff0, 0x58, 0x15 @right to left DevastatingDrakeFinish: call UnsetPsychicBg waitforvisualfinish visible ANIM_TARGET - delay 0xa + delay 10 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeStrikeSpriteTemplate, ANIM_TARGET, 2, 0x14 - delay 0x10 + delay 16 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER loadspritegfx ANIM_TAG_EXPLOSION - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_EXPLOSION, 0x0, 0xC, 0xC, 0x502B + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB(11, 1, 20) createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 53 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x10, 0x40c0 @ fade to purple + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 16, RGB(0, 6, 16) @ fade to purple call DevastatingDrakeExplosion - delay 0x6 + delay 6 createvisualtask AnimTask_IsTargetPartner, 0x5 jumpargeq 0x0 0x1 DevastatingDrakeFadeTargetPartner - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 0x6, 0x0, 0x10, 0x40c0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 6, 0, 16, RGB(0, 6, 16) call DevastatingDrakeExplosion waitforvisualfinish playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 0x0, 0x10, 0x0, 0x40c0 @ fade all but target back + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 0, 16, 0, RGB(0, 6, 16) @ fade all but target back DevastatingDrakeUniversalEnding: loadspritegfx ANIM_TAG_FIRE_PLUME loadspritegfx ANIM_TAG_VERTICAL_HEX loadspritegfx ANIM_TAG_EXPLOSION_2 @explosion unloadspritegfx ANIM_TAG_PURPLE_DRAKE - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_FIRE_PLUME, 0x0, 0xC, 0xC, 0x502B - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_VERTICAL_HEX, 0x0, 0xC, 0xC, 0x502B - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_EXPLOSION_2, 0x0, 0xC, 0xC, 0x502B + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FIRE_PLUME, 0, 12, 12, RGB(11, 1, 20) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_VERTICAL_HEX, 0, 12, 12, RGB(11, 1, 20) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION_2, 0, 12, 12, RGB(11, 1, 20) createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 32 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER call DevastatingDrakeGeyser @@ -31403,100 +34320,100 @@ DevastatingDrakeUniversalEnding: createsprite gDevastatingDrakePurpleBlastSpriteTemplate, ANIM_ATTACKER, 2, 0xffc4, 0x1e, 0x18, 0x0, 0x0, 0x0 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER call DevastatingDrakeGeyser - delay 0x4 + delay 4 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x10, 0x0, 0x40c0 @ fade from purple + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 16, 0, RGB(0, 6, 16) @ fade from purple waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BATTLERS_2, 0x2, 0x0, 0x0, 0x0 @ reset all colours + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BATTLERS_2, 2, 0, 0, 0 @ reset all colours waitforvisualfinish createvisualtask AnimTask_AllBattlersVisible, 0xA waitforvisualfinish end DevastatingDrakeFadeTargetPartner: - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ALL_BUT_ATK_PARTNER), 0x6, 0x0, 0x10, 0x40c0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ALL_BUT_ATK_PARTNER), 6, 0, 16, RGB(0, 6, 16) call DevastatingDrakeExplosion waitforvisualfinish playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ALL_BUT_ATK_PARTNER), 0x0, 0x10, 0x0, 0x40c0 @ fade all but target back + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ALL_BUT_ATK_PARTNER), 0, 16, 0, RGB(0, 6, 16) @ fade all but target back goto DevastatingDrakeUniversalEnding DevastatingDrakeBuffEffect: createsprite gDevastatingDrakePurpleEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gDevastatingDrakePurpleEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gDevastatingDrakePurpleEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gDevastatingDrakePurpleEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gDevastatingDrakePurpleEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return DevastatingDrakeGeyser: createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0003, 0x0005, 0x1, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0xfffc, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfff5, 0xfff1, 0x1, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x100D, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0008, 0xfffb, 0x1, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x4, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfffa, 0x0012, 0x1, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0xfff0, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0000, 0x0005, 0x1, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0xfffc, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0003, 0xfff5, ANIM_TARGET, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfff5, 0xffe1, ANIM_TARGET, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0008, 0xffeb, ANIM_TARGET, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0xfff0, 0x10 - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfffa, 0x0002, ANIM_TARGET, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0xfffc, 0x10 - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0000, 0xfff5, ANIM_TARGET, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0003, 0xffe5, ANIM_TARGET, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfff5, 0xffd1, ANIM_TARGET, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0xfff0, 0x10 - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0008, 0xffdb, ANIM_TARGET, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0xfffc, 0x10 - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfffa, 0xfff2, ANIM_TARGET, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0000, 0xffe5, ANIM_TARGET, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0xfff0, 0x10 return DevastatingDrakeExplosion: createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 return @@ -31514,11 +34431,11 @@ gBattleAnimMove_BlackHoleEclipse:: waitforvisualfinish playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call EndureEffect - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_BLACK createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call EndureEffect - delay 0x8 + delay 8 call EndureEffect waitforvisualfinish unloadspritegfx ANIM_TAG_FOCUS_ENERGY @@ -31530,118 +34447,117 @@ gBattleAnimMove_BlackHoleEclipse:: playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER createsprite gBlackHoleEclipseHoleUserSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, ANIM_ATTACKER, 0x0 createsprite gBlackHoleEclipseBlueRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0 - delay 0x8 + delay 8 createsprite gBlackHoleEclipseBlackRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0 - delay 0x8 + delay 8 createsprite gBlackHoleEclipseBlueRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0 - delay 0x8 + delay 8 createsprite gBlackHoleEclipseBlackRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0 - delay 0x8 + delay 8 waitforvisualfinish stopsound - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x07, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 7, RGB_BLACK loadspritegfx ANIM_TAG_WISP_ORB @will o wisp invisible ANIM_ATTACKER loopsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET, 0x10, 0x5 createsprite gBlackHoleEclipseWispSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x10, 0x0 - delay 0x3 + delay 3 createsprite gBlackHoleEclipseWispSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x10, 0x1 - delay 0x3 + delay 3 createsprite gBlackHoleEclipseWispSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x10, 0x2 - delay 0x3 + delay 3 createsprite gBlackHoleEclipseWispSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x10, 0x3 waitforvisualfinish fadetobg BG_BLACKHOLE_ECLIPSE playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET loadspritegfx ANIM_TAG_VERTICAL_HEX @red createsprite gBlackHoleEclipseRedRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x100, 0x0 - delay 0x4 + delay 4 createsprite gBlackHoleEclipseRedRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x100, 0x0 - delay 0x4 + delay 4 createsprite gBlackHoleEclipseRedRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x100, 0x0 waitbgfadeout unloadspritegfx ANIM_TAG_WISP_ORB createsprite gBlackHoleEclipseHoleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, ANIM_TARGET, 0x0 @ eclipse at target origin - delay 0x10 + delay 16 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 53, -19, 1, 2 @ target down and left (instantaneously (last arg)) - delay 0x2 + delay 2 visible ANIM_TARGET loopsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 0xa, 0x5 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 80, -1024, ANIM_TARGET, 0 @ spin target around (0x50 (time), -0x400 (rot speed)) createsprite gBlackHoleEclipseBlueRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gBlackHoleEclipseRedRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gBlackHoleEclipseRedRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x30 @ target back to origin (slowly) createsprite gBlackHoleEclipseBlueRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gBlackHoleEclipseRedRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gBlackHoleEclipseRedRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x15 + delay 21 invisible ANIM_TARGET - delay 0x8 + delay 8 createsprite gBlackHoleEclipseBlueRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gBlackHoleEclipseRedRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gBlackHoleEclipseRedRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gBlackHoleEclipseHoleShrinkSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, ANIM_TARGET, 0x0 waitforvisualfinish unloadspritegfx ANIM_TAG_THIN_RING unloadspritegfx ANIM_TAG_ICE_CHUNK loadspritegfx ANIM_TAG_SPARKLE_4 @detect createsprite gTargetTwinkleSpriteTemplate, ANIM_ATTACKER, 13, 0x0, 0x0, ANIM_TARGET @detect star - delay 0x2 + delay 2 unloadspritegfx ANIM_TAG_VERTICAL_HEX @red unloadspritegfx ANIM_TAG_SHADOW_BALL unloadspritegfx ANIM_TAG_BLACK_BALL_2 - unloadspritegfx ANIM_TAG_FOCUS_ENERGY loadspritegfx ANIM_TAG_EXPLOSION_2 call BlackHoleEclipseExplosion - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x1, 0x0, 0x10, 0x7fff @ bg to white pal + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 1, 0, 16, RGB_WHITE @ bg to white pal call BlackHoleEclipseExplosion waitforvisualfinish - delay 0x18 + delay 24 invisible ANIM_TARGET createvisualtask AnimTask_RotateMonSpriteToSide, 2, 1, 0, ANIM_TARGET, 1 @ fix rotation invisible ANIM_TARGET - delay 0x1 + delay 1 waitforvisualfinish call ResetFromWhiteScreen end BlackHoleEclipseExplosion: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBlackHoleEclipseRedExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBlackHoleEclipseRedExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBlackHoleEclipseRedExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBlackHoleEclipseRedExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBlackHoleEclipseRedExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 return ResetFromWhiteScreen: createvisualtask AnimTask_AllBattlersInvisible, 0xA waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BATTLERS_2, 0x2, 0x0, 0x0, 0x7FFF @everything from white + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BATTLERS_2, 2, 0, 0, RGB_WHITE @everything from white restorebg waitbgfadeout setarg 0x7 0xffff createvisualtask AnimTask_AllBattlersVisible, 0xA waitbgfadein waitforvisualfinish - delay 0x5 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0x0, 0x7fff + delay 5 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 0, RGB_WHITE waitforvisualfinish return @@ -31654,12 +34570,12 @@ gBattleAnimMove_TwinkleTackle:: waitforvisualfinish playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER call TwinkleTacklePinkStars - delay 0x8 + delay 8 fadetobg BG_TWINKLE_TACKLE createsprite gTwinkleTacklePinkRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0 waitbgfadeout invisible ANIM_TARGET - delay 0x1 + delay 1 loadspritegfx ANIM_TAG_YELLOW_STAR createsprite gTwinkleTackleStarGrowSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0 waitforvisualfinish @@ -31672,7 +34588,7 @@ TwinkleTackleOnPlayer: call OpponentTwinkling TwinkleTackleFinish: waitforvisualfinish - delay 0x5 + delay 5 visible ANIM_ATTACKER visible ANIM_TARGET createvisualtask AnimTask_SwayMon, 5, 0, 8, 2048, 1, ANIM_ATTACKER @@ -31684,29 +34600,29 @@ TwinkleTackleFinish: loadspritegfx ANIM_TAG_SPARKLE_4 @detect loadspritegfx ANIM_TAG_IMPACT @hit loadspritegfx ANIM_TAG_PAIN_SPLIT @pain-split - delay 0x1 + delay 1 createsprite gTwinkleTackleYellowImpactSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x0 call TwinkleTackleStarsTarget playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET - delay 0x5 + delay 5 createvisualtask AnimTask_TwinkleTackleLaunch, 0x2, 89 delay 89 playsewithpan SE_M_DETECT, SOUND_PAN_TARGET createsprite gTwinkleTackleTwinkleSpriteTemplate, ANIM_TARGET, 13, 0x0, 0x0, ANIM_TARGET @detect star waitforvisualfinish - delay 0x10 + delay 16 restorebg - delay 0x18 + delay 24 createvisualtask AnimTask_AllBattlersVisible, 0xA waitforvisualfinish end TwinkleTacklePinkStars: createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x0, 0x0, 0x20, 0x3c createsprite gTwinkleTacklePinkRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0 - delay 0x8 + delay 8 createsprite gTwinkleTacklePinkRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0xc, 0xfffb, 0x0, 0x0, 0x20, 0x3c - delay 0x8 + delay 8 createsprite gTwinkleTacklePinkRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0 return PlayerTwinkling: @@ -31714,36 +34630,36 @@ PlayerTwinkling: setarg 0x7 0x0 @;Clear arg 7 so task works properly in Link battles createvisualtask AnimTask_SnatchOpposingMonMove, 0x2 @ user fly on screen on enemy side createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x12, 0x0, 0x0, 0x0, 0x20, 0x1c - delay 0x3 + delay 3 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x1f, 0xfffb, 0x0, 0x0, 0x20, 0x1c - delay 0x16 + delay 22 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x90, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x80, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x70, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x60, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x50, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_TARGET createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x40, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x30, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x10, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0xfff0, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0xffc0, 0x0, 0x0, 0x20, 0x1c return OpponentTwinkling: @@ -31751,40 +34667,40 @@ OpponentTwinkling: setarg 0x7 0x0 @;Clear arg 7 so task works properly in Link battles createvisualtask AnimTask_SnatchOpposingMonMove, 0x2 @ user fly on screen on enemy side createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x10, 0xfffb, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0xfffb, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x30, 0xfffb, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x40, 0xfffb, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x50, 0xfffb, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x60, 0xfffb, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x70, 0xfffb, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x80, 0xfffb, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x90, 0xfffb, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0xa0, 0xfffb, 0x0, 0x0, 0x20, 0x1c - delay 0x5 + delay 5 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_TARGET createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0xa0, 0x2c, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x90, 0x2c, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x80, 0x2c, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x70, 0x2c, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x60, 0x2c, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x50, 0x2c, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x40, 0x2c, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x30, 0x2c, 0x0, 0x0, 0x20, 0x1c return TwinkleTackleStars: @@ -31812,13 +34728,13 @@ gBattleAnimMove_Catastropika:: waitforvisualfinish playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call EndureEffect - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 31, 22) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call EndureEffect - delay 0x8 + delay 8 call EndureEffect - delay 0x8 + delay 8 playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 waitforvisualfinish @@ -31847,74 +34763,74 @@ CatastropikaFinish: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x2c, 0x60, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x2c, 0xa0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x2c, 0xe0, 0x28, 0x2, 0x3 -@ delay 0x14 +@ delay 20 @ playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x12, 0x2c, 0x0, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x12, 0x2c, 0x40, 0x28, 0x1, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x12, 0x2c, 0x80, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x12, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 -@ delay 0x14 +@ delay 20 @ playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, 0x2c, 0x0, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, 0x2c, 0x40, 0x28, 0x1, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, 0x2c, 0x80, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gGrowingChargeOrbSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER @ charge createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x16, 0x2c, 0x20, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x16, 0x2c, 0x60, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x16, 0x2c, 0xa0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x16, 0x2c, 0xe0, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x18, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x18, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x18, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x18, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1a, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1a, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1a, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1a, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1c, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1c, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1c, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1c, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1e, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1e, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1e, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1e, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1e, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1e, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1e, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1e, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 restorebg waitbgfadeout playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER @@ -31928,17 +34844,17 @@ CatastropikaFinish: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xfff0, 0x25, 0x2c, 0x60, 0x8, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xfff0, 0x25, 0x2c, 0xa0, 0x8, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xfff0, 0x25, 0x2c, 0xe0, 0x8, 0x2, 0x3 - delay 0x1 + delay 1 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0xffe4, 0x25, 0x2c, 0x20, 0x8, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0xffe4, 0x25, 0x2c, 0x60, 0x8, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0xffe4, 0x25, 0x2c, 0xa0, 0x8, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0xffe4, 0x25, 0x2c, 0xe0, 0x8, 0x2, 0x3 - delay 0x1 + delay 1 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0xffd8, 0x25, 0x2c, 0x20, 0x8, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0xffd8, 0x25, 0x2c, 0x60, 0x8, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0xffd8, 0x25, 0x2c, 0xa0, 0x8, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0xffd8, 0x25, 0x2c, 0xe0, 0x8, 0x2, 0x3 - delay 0xd + delay 13 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -256, 21, 0, 4 loadspritegfx ANIM_TAG_MUD_SAND createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 12, -24, -16, 24 @ 12, -48, -16, 24 @@ -31952,10 +34868,10 @@ CatastropikaFinish: call CatastropikaThundering call CatastropikaThundering call CatastropikaThundering - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x4, 0x0, 0x10, 0x7fff @ bg to white + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 4, 0, 16, RGB_WHITE @ bg to white call CatastropikaThundering waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x4, 0x10, 0x0, 0x7fff @ bg to white + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 4, 16, 0, RGB_WHITE @ bg to white createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10 @fix tgt position waitforvisualfinish createvisualtask AnimTask_AllBattlersVisible, 0xA @@ -31963,17 +34879,17 @@ CatastropikaFinish: end CatastropikaThundering: playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xfff0 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -16 delay 2 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x10 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, 16 delay 2 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xfff0 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -16 delay 2 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x10 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, 16 delay 2 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xfff0 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -16 delay 2 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x10 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, 16 delay 2 return @@ -31996,12 +34912,12 @@ gBattleAnimMove_10000000VoltThunderbolt:: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, 0x60, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, 0xa0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, 0xe0, 0x28, 0x2, 0x3 - delay 0x2 + delay 2 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe0, 0x20, 0x2c, 0x20, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe0, 0x20, 0x2c, 0x60, 0x28, 0x1, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe0, 0x20, 0x2c, 0xa0, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe0, 0x20, 0x2c, 0xe0, 0x28, 0x2, 0x3 - delay 0x2 + delay 2 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffd0, 0x20, 0x2c, 0x20, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffd0, 0x20, 0x2c, 0x60, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffd0, 0x20, 0x2c, 0xa0, 0x28, 0x0, 0x3 @@ -32021,65 +34937,65 @@ gBattleAnimMove_10000000VoltThunderbolt:: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x2c, 0x60, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x2c, 0xa0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x2c, 0xe0, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x10 + delay 16 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET - createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 @thunder flash + createvisualtask AnimTask_InvertScreenColor, 2, 0x101, 0x101, 0x101 @thunder flash createsprite gGrowingChargeOrbSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER @ charge - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x40, 0xffdc - delay 0x1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x40, 0xffec - delay 0x1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x40, 0xc - delay 0x14 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 64, -36 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 64, -20 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 64, 12 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x18, 0x2c, 0x0, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x18, 0x2c, 0x40, 0x28, 0x1, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x18, 0x2c, 0x80, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x18, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET - createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 @thunder flash - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0xffdc - delay 0x1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0xffec - delay 0x1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0xc - delay 0x14 + createvisualtask AnimTask_InvertScreenColor, 2, 0x101, 0x101, 0x101 @thunder flash + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -64, -36 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -64, -20 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -64, 12 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1c, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1c, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1c, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1c, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET - createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 @thunder flash - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xff90, 0xffdc - delay 0x1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xff90, 0xffec - delay 0x1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xff90, 0xc - delay 0x14 + createvisualtask AnimTask_InvertScreenColor, 2, 0x101, 0x101, 0x101 @thunder flash + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -112, -36 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -112, -20 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -112, 12 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, 0x0, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, 0x40, 0x28, 0x1, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, 0x80, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x10 + delay 16 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET - createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 @thunder flash - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0xffdc - delay 0x1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0xffec - delay 0x1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0xc + createvisualtask AnimTask_InvertScreenColor, 2, 0x101, 0x101, 0x101 @thunder flash + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -48, -36 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -48, -20 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -48, 12 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x2a, 0x2c, 0x0, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x2a, 0x2c, 0x40, 0x28, 0x1, 0x3 @@ -32096,11 +35012,11 @@ gBattleAnimMove_10000000VoltThunderbolt:: loadspritegfx ANIM_TAG_POISON_BUBBLE @purple loopsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER, 0x5, 0xA createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 50, 1 -@ createvisualtask AnimTask_FlashAnimTagWithColor, 0x2, ANIM_TAG_ORBS, 0x1, 0xc, 0x1f, 0x10, 0x0, 0x0 +@ createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_ORBS, 1, 12, RGB_RED, 16, 0, 0 call TenMillionVoltThunderboltBeamRed call TenMillionVoltThunderboltBeamBlue createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 50, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x07FE + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB(30, 31, 1) call TenMillionVoltThunderboltBeamPink call TenMillionVoltThunderboltBeamYellow call TenMillionVoltThunderboltBeamGreen @@ -32129,12 +35045,12 @@ gBattleAnimMove_10000000VoltThunderbolt:: @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x25, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x25, 0x2c, 0x80, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x25, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x8003 -@ delay 0x6 +@ delay 6 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x35, 0x2c, 0x0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x35, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x35, 0x2c, 0x80, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x35, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x8003 -@ delay 0x6 +@ delay 6 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x40, 0x2c, 0x0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x40, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x40, 0x2c, 0x80, 0x28, 0x0, 0x8003 @@ -32159,11 +35075,11 @@ gBattleAnimMove_10000000VoltThunderbolt:: @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x37, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x37, 0x2c, 0x80, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x00, 0x37, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x8003 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x2, 0x0, 0x10, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 2, 0, 16, RGB_WHITE call TenMillionVoltThunderboltSparkGeyser waitforvisualfinish - delay 0x10 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x3, 0x10, 0x0, 0x7fff + delay 16 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 3, 16, 0, RGB_WHITE waitforvisualfinish createvisualtask AnimTask_AllBattlersVisible, 0xA waitforvisualfinish @@ -32207,11 +35123,11 @@ TenMillionVoltThunderboltSparkGeyser: @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x8003 - delay 0x4 + delay 4 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffea, 0x5, 0x2c, 0x0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffea, 0x5, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffea, 0x5, 0x2c, 0x80, 0x28, 0x0, 0x8003 - delay 0x4 + delay 4 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffd4, 0x5, 0x2c, 0x0, 0x28, 0x0, 0x8003 @@ -32220,23 +35136,23 @@ TenMillionVoltThunderboltSparkGeyser: @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffd4, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffd4, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffd4, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x8003 - delay 0x4 + delay 4 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x5, 0x2c, 0x0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x5, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x5, 0x2c, 0x80, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x8003 - delay 0x4 + delay 4 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x8 + delay 8 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x8 + delay 8 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 return @@ -32254,12 +35170,12 @@ gBattleAnimMove_StokedSparksurfer:: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, 0x60, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, 0xa0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, 0xe0, 0x28, 0x2, 0x3 - delay 0x2 + delay 2 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe0, 0x20, 0x2c, 0x20, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe0, 0x20, 0x2c, 0x60, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe0, 0x20, 0x2c, 0xa0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe0, 0x20, 0x2c, 0xe0, 0x28, 0x2, 0x3 - delay 0x2 + delay 2 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffd0, 0x20, 0x2c, 0x20, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffd0, 0x20, 0x2c, 0x60, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffd0, 0x20, 0x2c, 0xa0, 0x28, 0x0, 0x3 @@ -32286,15 +35202,15 @@ StokedSparksurferFinish: createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 28, 2, 12 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 60, 1 call EndureEffect - delay 0x8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x5, 0x0, 0x10, 0x5bff + delay 8 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 5, 0, 16, RGB(31, 31, 22) call EndureEffect - delay 0x8 + delay 8 call EndureEffect - delay 0x2 + delay 2 loadspritegfx ANIM_TAG_SPARK loadspritegfx ANIM_TAG_ELECTRICITY - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0x10, 0x0, 0x5bff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 16, 0, RGB(31, 31, 22) createsprite gVoltTackleOrbSlideSpriteTemplate, ANIM_ATTACKER, 1 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER waitforvisualfinish @@ -32309,7 +35225,7 @@ StokedSparksurferFinish: waitforvisualfinish createvisualtask AnimTask_VoltTackleBolt, 0x5, 0x3 playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET - delay 0x1 + delay 1 fadetobg BG_ZMOVE_ACTIVATE waitbgfadeout visible ANIM_TARGET @@ -32326,7 +35242,7 @@ StokedSparksurferFinish: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x30, 0x2c, 0x80, 0x28, 0x0, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x00, 0x30, 0x2c, 0xc0, 0x28, 0x2, 0x8003 call StokedSparksurferSparkGeyser - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_TARGET | F_PAL_ATTACKER), 0x2, 0x0, 0x10, 0x5bff + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_ATTACKER), 2, 0, 16, RGB(31, 31, 22) createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x37, 0x2c, 0x0, 0x28, 0x0, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x37, 0x2c, 0x40, 0x28, 0x1, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x37, 0x2c, 0x80, 0x28, 0x0, 0x8003 @@ -32334,15 +35250,15 @@ StokedSparksurferFinish: call StokedSparksurferSparkGeyser createvisualtask AnimTask_VoltTackleAttackerReappear, 0x5 @ attacker flicker back playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x10, 0x10 - delay 0x2 + delay 2 createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0, 0xfff0 - delay 0x4 + delay 4 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_TARGET | F_PAL_ATTACKER), 0x2, 0x10, 0x0, 0x5bff + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_ATTACKER), 2, 16, 0, RGB(31, 31, 22) restorebg - delay 0x18 + delay 24 createvisualtask AnimTask_AllBattlersVisible, 0xA waitforvisualfinish end @@ -32355,63 +35271,63 @@ StokedSparksurferSparkGeyser: @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x8003 - delay 0x4 + delay 4 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffea, 0x5, 0x2c, 0x0, 0x28, 0x0, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffea, 0x5, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffea, 0x5, 0x2c, 0x80, 0x28, 0x0, 0x8003 - delay 0x4 + delay 4 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffd4, 0x5, 0x2c, 0x0, 0x28, 0x0, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffd4, 0x5, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffd4, 0x5, 0x2c, 0x80, 0x28, 0x0, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffd4, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffd4, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffd4, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x8003 - delay 0x4 + delay 4 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x5, 0x2c, 0x0, 0x28, 0x0, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x5, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x5, 0x2c, 0x80, 0x28, 0x0, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x8003 - delay 0x1a + delay 26 return gBattleAnimMove_ExtremeEvoboost:: loadspritegfx ANIM_TAG_LEER @leer - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x3, 0x0, 0x10, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 3, 0, 16, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_AllBattlersInvisible, 0xA - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BATTLERS_2, 3, 0, 0, 0 @Remove fading on everyone + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BATTLERS_2, 3, 0, 0, 0 @Remove fading on everyone waitforvisualfinish playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0x18, 0xfff4 createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0xffe8, 0xfff4 - delay 0xa + delay 10 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0x28, 0xfff0 createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0xfff8, 0xfff0 - delay 0xa + delay 10 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0x8, 0xfffe createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xfffe - delay 0xa + delay 10 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0x10, 0x5 createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x5 - delay 0xa + delay 10 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0xfff0 createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0xfff0, 0xfff0 - delay 0xa + delay 10 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0x5, 0x0 createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0xffd5, 0x0 - delay 0xa + delay 10 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0x1c, 0x5 createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0xffec, 0x5 - delay 0xa + delay 10 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0xf, 0xfff4 createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0xffdf, 0xfff4 @@ -32427,25 +35343,25 @@ gBattleAnimMove_ExtremeEvoboost:: loadspritegfx ANIM_TAG_WATER_ORB @blue loadspritegfx ANIM_TAG_POISON_BUBBLE @purple loadspritegfx ANIM_TAG_LEAF @green - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_CIRCLE_OF_LIGHT, 0x0, 0x10, 0x10, 0x5bff + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 16, 16, RGB(31, 31, 22) waitforvisualfinish playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER createsprite gExtremeEvoboostRedChargeUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x510, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gExtremeEvoboostPinkChargeUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0x4e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gExtremeEvoboostIceChargeUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x540, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gExtremeEvoboostBlackChargeUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x490, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gExtremeEvoboostBlueChargeUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x500, 0x19, 0x10, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gExtremeEvoboostPurpleChargeUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x4d0, 0x1e, 0xf, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gExtremeEvoboostYellowChargeUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x510, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gExtremeEvoboostGreenChargeUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0x4e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 waitforvisualfinish visible ANIM_ATTACKER loopsewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER, 0x15, 0xd @@ -32456,62 +35372,62 @@ gBattleAnimMove_ExtremeEvoboost:: call ExtremeEvoboostColorCharge waitforvisualfinish playsewithpan SE_SHINY, SOUND_PAN_ATTACKER - delay 0x5 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ATTACKER), 0x0, 0x0, 0x10, 0x7fff - delay 0x18 + delay 5 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 0, 0, 16, RGB_WHITE + delay 24 call ResetFromWhiteScreen end ExtremeEvoboostColorCircle: createsprite gExtremeEvoboostRedChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostPinkChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostIceChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostBlackChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostBlueChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostPurpleChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostYellowChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostGreenChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 return ExtremeEvoboostColorCharge: createsprite gExtremeEvoboostRedChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostRedStockpileSpriteTemplate, ANIM_ATTACKER, 2, 0x37, 0x37, 0xd - delay 0x2 + delay 2 createsprite gExtremeEvoboostPinkChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostPinkStockpileSpriteTemplate, ANIM_ATTACKER, 2, 0xffc9, 0xffc9, 0xd - delay 0x2 + delay 2 createsprite gExtremeEvoboostIceChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostIceStockpileSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x37, 0xd - delay 0x2 + delay 2 createsprite gExtremeEvoboostBlackChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostBlackStockpileSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffc9, 0xd - delay 0x2 + delay 2 createsprite gExtremeEvoboostBlueChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostBlueStockpileSpriteTemplate, ANIM_ATTACKER, 2, 0x37, 0xffde, 0xd - delay 0x2 + delay 2 createsprite gExtremeEvoboostPurpleChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostPurpleStockpileSpriteTemplate, ANIM_ATTACKER, 2, 0x37, 0x22, 0xd - delay 0x2 + delay 2 createsprite gExtremeEvoboostYellowChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostYellowStockpileSpriteTemplate, ANIM_ATTACKER, 2, 0xffc9, 0xffde, 0xd - delay 0x2 + delay 2 createsprite gExtremeEvoboostGreenChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostGreenStockpileSpriteTemplate, ANIM_ATTACKER, 2, 0xffc9, 0x22, 0xd - delay 0x2 + delay 2 return @@ -32549,7 +35465,7 @@ PulverizingPancakeFinish: loadspritegfx ANIM_TAG_ROUND_SHADOW @fly playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 - delay 0x2 + delay 2 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 12, 4, -16, 34 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 16, 4, -10, 34 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 14, 4, -18, 34 @@ -32562,13 +35478,13 @@ PulverizingPancakeFinish: waitbgfadein loadspritegfx ANIM_TAG_WHITE_SHADOW createvisualtask AnimTask_PulverizingPancakeWhiteShadow, 0x5, 0x33, 0x33 @first arg is duration, last arg is move speed - delay 0x10 + delay 16 call PulverizingPancakeSlowBackground call PulverizingPancakeSlowBackground call PulverizingPancakeSlowBackground call PulverizingPancakeSlowBackground call PulverizingPancakeSlowBackground - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0xb, 0x0000 @ target darkens + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 11, RGB_BLACK @ target darkens call PulverizingPancakeSlowBackground @0 call PulverizingPancakeSlowBackground call PulverizingPancakeSlowBackground @@ -32576,22 +35492,22 @@ PulverizingPancakeFinish: call PulverizingPancakeSlowBackground call PulverizingPancakeSlowBackground call PulverizingPancakeSlowBackground @-0x1000 - delay 0x1 + delay 1 waitbgfadein loadspritegfx ANIM_TAG_THIN_RING @ring unloadspritegfx ANIM_TAG_MUD_SAND @dig loadspritegfx ANIM_TAG_ELECTRIC_ORBS @yellow createsprite gBounceBallLandSpriteTemplate, ANIM_TARGET, 3 - delay 0x7 + delay 7 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0 @big hit marker - delay 0x0 + delay 0 createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 4, 44 createsprite gPulverizingPancakeYellowRingSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x100, 0x0 - delay 0x5 + delay 5 loadspritegfx ANIM_TAG_EXPLOSION @explosion call PulverizingPancakeExplosion - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x2, 0x0, 0x10, 0x7fff @ everything goes white + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 2, 0, 16, RGB_WHITE @ everything goes white call PulverizingPancakeExplosion waitforvisualfinish call ResetFromWhiteScreen @@ -32602,30 +35518,30 @@ PulverizingPancakeDiggingRun: createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 14, 4, -18, 18 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 12, 4, -16, 18 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x5 + delay 5 return PulverizingPancakeSlowBackground: createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0xfd56, 0x0, 0xffff @-0x2aa - delay 0x1 + delay 1 return PulverizingPancakeExplosion: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gPulverizingPancakeExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gPulverizingPancakeYellowRingSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x100, 0x0 createsprite gPulverizingPancakeExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gPulverizingPancakeExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gPulverizingPancakeExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gPulverizingPancakeYellowRingSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x100, 0x0 createsprite gPulverizingPancakeExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 return @@ -32642,14 +35558,14 @@ gBattleAnimMove_GenesisSupernova:: jumpargeq 0x7 ANIM_TARGET GenesisSupernovaOnPlayer GenesisSupernovaOnOpponent: call GenesisSupernovaBuffEffectPlayer_1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0xb, 0xd87c + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 11, (RGB(28, 3, 22) | RGB_ALPHA) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 112, 1 call GenesisSupernovaBuffEffectPlayer_2 call GenesisSupernovaBuffEffectPlayer_1 goto GenesisSupernovaFinish GenesisSupernovaOnPlayer: call GenesisSupernovaBuffOpponent_1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0xb, 0xd87c + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 11, (RGB(28, 3, 22) | RGB_ALPHA) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 112, 1 call GenesisSupernovaBuffOpponent_2 call GenesisSupernovaBuffOpponent_1 @@ -32658,7 +35574,7 @@ GenesisSupernovaFinish: call GenesisSupernovaReversalWave call GenesisSupernovaReversalWave call GenesisSupernovaReversalWave - delay 0x15 + delay 21 unloadspritegfx ANIM_TAG_FOCUS_ENERGY @focus energy loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge monbg ANIM_ATTACKER @@ -32669,29 +35585,29 @@ GenesisSupernovaFinish: call GenesisSupernovaFlare call GenesisSupernovaFlare call GenesisSupernovaFlare - delay 0x4 + delay 4 unloadspritegfx ANIM_TAG_BLUE_ORB @reversal loadspritegfx ANIM_TAG_WISP_ORB @will-o-wisp loadspritegfx ANIM_TAG_METEOR @superpower loadspritegfx ANIM_TAG_SPARKLE_2 @sparkles createsprite gGenesisSupernovaSuperpowerSpriteTemplate, ANIM_TARGET, 3, 0x0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0xb, 0x0, 0xd87c + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 11, 0, (RGB(28, 3, 22) | RGB_ALPHA) playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendParticle, 0x2, ANIM_TAG_SPARKLE_2, 0x0, 0x0, 0xc, 0x7fff - delay 0x8 + createvisualtask AnimTask_BlendParticle, 2, ANIM_TAG_SPARKLE_2, 0, 0, 12, RGB_WHITE + delay 8 invisible ANIM_TARGET loadspritegfx ANIM_TAG_EXPLOSION @explosion unloadspritegfx ANIM_TAG_METEOR @superpower call GenesisSupernovaBubbleExplosion call GenesisSupernovaBubbleExplosion - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x3, 0x0, 0x10, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 3, 0, 16, RGB_WHITE call GenesisSupernovaBubbleExplosion waitforvisualfinish - delay 0x10 - createvisualtask AnimTask_BlendParticle, 0x2, ANIM_TAG_SPARKLE_2, 0x0, 0xc, 0x0, 0x7fff + delay 16 + createvisualtask AnimTask_BlendParticle, 2, ANIM_TAG_SPARKLE_2, 0, 12, 0, RGB_WHITE clearmonbg ANIM_ATTACKER blendoff - delay 0x0 + delay 0 call ResetFromWhiteScreen waitforvisualfinish end @@ -32700,24 +35616,24 @@ GenesisSupernovaBubbleExplosion: createsprite gGenesisSupernovaBubbleSpriteTemplate, ANIM_TARGET, 2, 0xa, 0xa, 0x0 createsprite gGenesisSupernovaExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, ANIM_TARGET, 0x1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER - delay 0x6 + delay 6 createsprite gGenesisSupernovaBubbleSpriteTemplate, ANIM_TARGET, 2, 0x14, 0xffec, 0x0 createsprite gGenesisSupernovaExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER - delay 0x6 + delay 6 createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 0xc, 0xfffb, ANIM_TARGET, 0x0, 0x20, 0x3c createsprite gGenesisSupernovaBubbleSpriteTemplate, ANIM_TARGET, 2, 0xffec, 0xf, 0x0 createsprite gGenesisSupernovaExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER - delay 0x6 + delay 6 createsprite gGenesisSupernovaBubbleSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x0 createsprite gGenesisSupernovaExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER - delay 0x6 + delay 6 createsprite gGenesisSupernovaBubbleSpriteTemplate, ANIM_TARGET, 2, 0xffec, 0xffec, 0x0 createsprite gGenesisSupernovaExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x10, 0x10, ANIM_TARGET, 0x1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER - delay 0x6 + delay 6 createsprite gGenesisSupernovaBubbleSpriteTemplate, ANIM_TARGET, 2, 0x10, 0xfff8, 0x0 createsprite gGenesisSupernovaExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe0, 0xffe8, ANIM_TARGET, 0x1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER @@ -32725,37 +35641,37 @@ GenesisSupernovaBubbleExplosion: GenesisSupernovaBuffEffectPlayer_1: createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x24, 0x80, 0x24, 0x30, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x10, 0x80, 0x10, 0x35, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x45, 0x80, 0x45, 0x3a, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x60, 0x80, 0x60, 0x30, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x30, 0x80, 0x30, 0x3c, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x55, 0x80, 0x55, 0x33, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return GenesisSupernovaBuffEffectPlayer_2: createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x29, 0x80, 0x29, 0x31, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x73, 0x80, 0x73, 0x32, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x4a, 0x80, 0x4a, 0x3c, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x64, 0x80, 0x64, 0x33, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x2c, 0x80, 0x2c, 0x3d, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x6c, 0x80, 0x6c, 0x30, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return GenesisSupernovaReversalWave: @@ -32766,52 +35682,52 @@ GenesisSupernovaReversalWave: return GenesisSupernovaFlare: createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 return GenesisSupernovaBuffOpponent_1: createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0x94, 0x40, 0x94, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0x80, 0x40, 0x80, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0xb5, 0x40, 0xb5, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0xd0, 0x40, 0xd0, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0xa0, 0x40, 0xa0, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0xc5, 0x40, 0xc5, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return GenesisSupernovaBuffOpponent_2: createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0x99, 0x40, 0x99, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0xe3, 0x40, 0xe3, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0xba, 0x40, 0xba, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0xd4, 0x40, 0xd4, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0x9c, 0x40, 0x9c, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0xdc, 0x40, 0xdc, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return @@ -32827,22 +35743,22 @@ gBattleAnimMove_SinisterArrowRaid:: createsprite gArrowRaidFlyUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 waitforvisualfinish unloadspritegfx ANIM_TAG_ROUND_SHADOW - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x388C @ bg to purple + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB(12, 4, 14) @ bg to purple waitforvisualfinish visible ANIM_ATTACKER playsewithpan SE_M_WHIRLPOOL, SOUND_PAN_TARGET createsprite gArrowRaidArrowUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gArrowRaidArrowUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gArrowRaidArrowUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gArrowRaidArrowUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gArrowRaidArrowUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gArrowRaidArrowUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 waitforvisualfinish invisible ANIM_ATTACKER loadspritegfx ANIM_TAG_BIRD @sky attack @@ -32853,48 +35769,48 @@ gBattleAnimMove_SinisterArrowRaid:: SinisterArrowRaidOnOpponent: playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gArrowRaidFlyRightSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x88, 0x100, 0x38, 0x15 @left to right - delay 0x5 + delay 5 createsprite gArrowRaidRightUpSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x8a, 0x100, 0x3a, 0x15 @left to right - delay 0x1 + delay 1 createsprite gArrowRaidRightUpSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x8c, 0x100, 0x3c, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidRightUpSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x86, 0x100, 0x36, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidRightUpSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x84, 0x100, 0x34, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidRightUpSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x88, 0x100, 0x38, 0x15 waitforvisualfinish - delay 0xa + delay 10 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER @[x0] [y0] [xf] [yf] createsprite gArrowRaidFlyLeftSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x38, 0xfff0, 0x38, 0x15 @right to left - delay 0x5 + delay 5 createsprite gArrowRaidLeftUpSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x36, 0xfff0, 0x36, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidLeftUpSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x3a, 0xfff0, 0x3a, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidLeftUpSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x37, 0xfff0, 0x37, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidLeftUpSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x3c, 0xfff0, 0x3c, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidLeftUpSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x38, 0xfff0, 0x38, 0x15 waitforvisualfinish - delay 0xa + delay 10 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gArrowRaidFlyRightSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x08, 0x100, 0x0f, 0x15 @left to right - delay 0x5 + delay 5 createsprite gArrowRaidRightDownSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x0a, 0x100, 0x11, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidRightDownSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x0c, 0x100, 0x13, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidRightDownSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x06, 0x100, 0xd, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidRightDownSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x04, 0x100, 0xb, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidRightDownSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x08, 0x100, 0xf, 0x15 waitforvisualfinish call SinisterArrowRaidFlyStrike createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 3, 75 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0x10, 0x40c0 @ defender to purple + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 4, 0, 16, RGB(0, 6, 16) @ defender to purple call SinisterArrowRaidStrikeOpponent call SinisterArrowRaidOpponentExplosion playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER @@ -32905,48 +35821,48 @@ SinisterArrowRaidOnOpponent: SinisterArrowRaidOnPlayer: playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gArrowRaidFlyLeftSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x08, 0xfff0, 0x0f, 0x15 @right to left - delay 0x5 + delay 5 createsprite gArrowRaidFaceUpLeftSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x0a, 0xfff0, 0x11, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidFaceUpLeftSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x0c, 0xfff0, 0x13, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidFaceUpLeftSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x06, 0xfff0, 0xd, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidFaceUpLeftSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x04, 0xfff0, 0xb, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidFaceUpLeftSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x08, 0xfff0, 0xf, 0x15 waitforvisualfinish - delay 0xa + delay 10 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gArrowRaidFlyRightSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x38, 0x100, 0x38, 0x15 @left to right - delay 0x5 + delay 5 createsprite gArrowRaidRightSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x36, 0x100, 0x36, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidRightSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x3a, 0x100, 0x3a, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidRightSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x37, 0x100, 0x37, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidRightSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x3c, 0x100, 0x3c, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidRightSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x38, 0x100, 0x38, 0x15 waitforvisualfinish - delay 0xa + delay 10 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gArrowRaidFlyLeftSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x78, 0xfff0, 0x58, 0x15 @right to left - delay 0x5 + delay 5 createsprite gArrowRaidLeftDownSpriteTemplate, ANIM_ATTACKER, 50, 0x100, 0x8a, 0xfff0, 0x3a, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidLeftDownSpriteTemplate, ANIM_ATTACKER, 50, 0x100, 0x8c, 0xfff0, 0x3c, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidLeftDownSpriteTemplate, ANIM_ATTACKER, 50, 0x100, 0x86, 0xfff0, 0x36, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidLeftDownSpriteTemplate, ANIM_ATTACKER, 50, 0x100, 0x84, 0xfff0, 0x34, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidLeftDownSpriteTemplate, ANIM_ATTACKER, 50, 0x100, 0x88, 0xfff0, 0x38, 0x15 waitforvisualfinish call SinisterArrowRaidFlyStrike createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 3, 75 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0x10, 0x40c0 @ defender to purple + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 4, 0, 16, RGB(0, 6, 16) @ defender to purple call SinisterArrowRaidArrowsStrikePlayer call SinisterArrowRaidPlayerExplosion playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER @@ -32954,173 +35870,173 @@ SinisterArrowRaidOnPlayer: call SinisterArrowRaidFinalExplosion @ finish SinisterArrowRaidFinish: - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x10, 0x0, 0x40c0 @ return tgt to normal + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 4, 16, 0, RGB(0, 6, 16) @ return tgt to normal waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x00, 0x388C @ bg to nrml - delay 0x5 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB(12, 4, 14) @ bg to nrml + delay 5 createvisualtask AnimTask_AllBattlersVisible, 0xA waitforvisualfinish end SinisterArrowRaidFlyStrike: visible ANIM_TARGET - delay 0xa + delay 10 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER createsprite gArrowRaidFlyStrikeSpriteTemplate, ANIM_TARGET, 2, 0x14 waitforvisualfinish - delay 0x5 + delay 5 return SinisterArrowRaidStrikeOpponent: createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x85, 0xfff0, 0xa5, 0x40, 0x4 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x95, 0xfff0, 0xb5, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x75, 0xfff0, 0x95, 0x40, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xa5, 0xfff0, 0xc5, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x6f, 0xfff0, 0x8f, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x7b, 0xfff0, 0x9b, 0x40, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x85, 0xfff0, 0xa5, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xa2, 0xfff0, 0xc2, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x82, 0xfff0, 0xa2, 0x40, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x87, 0xfff0, 0xa7, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x72, 0xfff0, 0x92, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x85, 0xfff0, 0xa5, 0x40, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x8b, 0xfff0, 0xab, 0x40, 0x4 - delay 0x1 + delay 1 return SinisterArrowRaidOpponentExplosion: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gArrowRaidExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, ANIM_TARGET, 0x1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x85, 0xfff0, 0xa5, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x95, 0xfff0, 0xb5, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x75, 0xfff0, 0x95, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xa5, 0xfff0, 0xc5, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x6f, 0xfff0, 0x8f, 0x40, 0x4 createsprite gArrowRaidExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x7b, 0xfff0, 0x9b, 0x40, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x85, 0xfff0, 0xa5, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xa2, 0xfff0, 0xc2, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x82, 0xfff0, 0xa2, 0x40, 0x4 createsprite gArrowRaidExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x87, 0xfff0, 0xa7, 0x40, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x72, 0xfff0, 0x92, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x85, 0xfff0, 0xa5, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x8b, 0xfff0, 0xab, 0x40, 0x4 createsprite gArrowRaidExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x1 + delay 1 return SinisterArrowRaidArrowsStrikePlayer: createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfff5, 0xfff0, 0x45, 0x90, 0x4 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x5, 0xfff0, 0x55, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xffe5, 0xfff0, 0x35, 0x90, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x15, 0xfff0, 0x65, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xffdf, 0xfff0, 0x2f, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xffeb, 0xfff0, 0x3b, 0x90, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfff5, 0xfff0, 0x45, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x12, 0xfff0, 0x62, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfff2, 0xfff0, 0x42, 0x90, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfff7, 0xfff0, 0x47, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xffe2, 0xfff0, 0x32, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfff5, 0xfff0, 0x45, 0x90, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfffb, 0xfff0, 0x4b, 0x90, 0x4 - delay 0x1 + delay 1 return SinisterArrowRaidPlayerExplosion: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gArrowRaidExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfff5, 0xfff0, 0x45, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x5, 0xfff0, 0x55, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xffe5, 0xfff0, 0x35, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x15, 0xfff0, 0x65, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xffdf, 0xfff0, 0x2f, 0x90, 0x4 createsprite gArrowRaidExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xffeb, 0xfff0, 0x3b, 0x90, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfff5, 0xfff0, 0x45, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x12, 0xfff0, 0x62, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfff2, 0xfff0, 0x42, 0x90, 0x4 createsprite gArrowRaidExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfff7, 0xfff0, 0x47, 0x90, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xffe2, 0xfff0, 0x32, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfff5, 0xfff0, 0x45, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfffb, 0xfff0, 0x4b, 0x90, 0x4 createsprite gArrowRaidExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x1 + delay 1 return SinisterArrowRaidFinalExplosion: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gArrowRaidExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gArrowRaidExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gArrowRaidExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gArrowRaidExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gArrowRaidExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 return @@ -33136,7 +36052,7 @@ gBattleAnimMove_MaliciousMoonsault:: setalpha 12, 8 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 0x6, 0x1, 0x0 - delay 0x1 + delay 1 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x0, 0x18, 0x0, 0x0, 0x0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 0xffec, 0xfff6, 0x18, 0x0, 0x0, 0x0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 0x0, 0xfff0, 0x18, 0x0, 0x0, 0x0 @@ -33146,7 +36062,7 @@ gBattleAnimMove_MaliciousMoonsault:: createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x10, 0x18, 0x0, 0x0, 0x0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0xffec, 0xa, 0x18, 0x0, 0x0, 0x0 waitforvisualfinish - delay 0x0 + delay 0 monbg ANIM_ATTACKER playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET call MaliciousMoonsaultFireSpin @@ -33157,18 +36073,18 @@ gBattleAnimMove_MaliciousMoonsault:: playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gMaliciousMoonsaultRedFlySpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x150 call MaliciousMoonsaultFireSpin - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x5, 0x0, 0xa, 0x0000 @ target darkens - delay 0x1a + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 5, 0, 10, RGB_BLACK @ target darkens + delay 26 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gMaliciousMoonsaultRedBounceSpriteTemplate, ANIM_TARGET, 3 - delay 0x7 + delay 7 createsprite gMaliciousMoonsaultRedImpactSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1, 0x0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -256, 21, 0, 4 call MaliciousMoonsaultExplosion - delay 0x6 + delay 6 call MaliciousMoonsaultExplosion - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x1, 0x0, 0x10, 0x001b @ fade all to red - delay 0x6 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 1, 0, 16, RGB(27, 0, 0) @ fade all to red + delay 6 call MaliciousMoonsaultExplosion createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10 waitforvisualfinish @@ -33177,29 +36093,29 @@ gBattleAnimMove_MaliciousMoonsault:: end MaliciousMoonsaultFireSpin: createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2c, 0x510, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2f, 0x490, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x30, 0x4e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2c, 0x500, 0x19, 0x10, 0x2e, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x31, 0x540, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x31, 0x4d0, 0x1e, 0xf, 0xffce, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2f, 0x490, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2c, 0x510, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2c, 0x500, 0x19, 0x10, 0x2e, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x30, 0x4e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x31, 0x4d0, 0x1e, 0xf, 0xffce, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x31, 0x540, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x1 + delay 1 return MaliciousMoonsaultExplosion: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER @@ -33209,7 +36125,7 @@ MaliciousMoonsaultExplosion: createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x2, 0x0 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0xfffe, 0x2 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0x2, 0x2 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gMaliciousMoonsaultExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xa, 0x0, 0xfffe @@ -33217,7 +36133,7 @@ MaliciousMoonsaultExplosion: createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x2, 0x0 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0xfffe, 0x2 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0x2, 0x2 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gMaliciousMoonsaultExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xa, 0x0, 0xfffe @@ -33225,7 +36141,7 @@ MaliciousMoonsaultExplosion: createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x2, 0x0 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0xfffe, 0x2 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0x2, 0x2 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gMaliciousMoonsaultExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xa, 0x0, 0xfffe @@ -33233,7 +36149,7 @@ MaliciousMoonsaultExplosion: createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x2, 0x0 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0xfffe, 0x2 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0x2, 0x2 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gMaliciousMoonsaultExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x10, 0x10, ANIM_TARGET, 0x1 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xa, 0x0, 0xfffe @@ -33256,11 +36172,11 @@ gBattleAnimMove_OceanicOperetta:: loadspritegfx ANIM_TAG_WATER_ORB @blue playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call OceanicOperettaBuffEffect - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_WHITE createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call OceanicOperettaBuffEffect - delay 0x8 + delay 8 call OceanicOperettaBuffEffect waitforvisualfinish unloadspritegfx ANIM_TAG_FOCUS_ENERGY @@ -33269,164 +36185,164 @@ gBattleAnimMove_OceanicOperetta:: waitforvisualfinish createvisualtask AnimTask_RemoveSpotlight, 0x2 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x6, 0x5da0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 6, RGB(0, 13, 23) loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT loadspritegfx ANIM_TAG_THIN_RING invisible ANIM_ATTACKER createsprite gOceanOperaBlueChargeSpriteTemplate, ANIM_ATTACKER, 2, 0x0 @charge - delay 0x2 + delay 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 80, 1 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, ANIM_ATTACKER createsprite gOceanOperaBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gOceanOperaBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gOceanOperaBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 playsewithpan SE_M_GRASSWHISTLE, SOUND_PAN_ATTACKER createsprite gOceanOperaBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gOceanOperaBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gOceanOperaBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gOceanOperaBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gOceanOperaBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gOceanOperaBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gOceanOperaBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, ANIM_ATTACKER - delay 0x1a + delay 26 visible ANIM_TARGET loopsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET, 0x14, 0x5 createsprite gOceanOperaMovingOrbsSpriteTemplate, ANIM_ATTACKER, 50, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0 @mist ball - delay 0x5c + delay 92 visible ANIM_ATTACKER - delay 0x0 + delay 0 loopsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET, 0x14, 0x1 createsprite gOceanOperaBlueOrbsSpriteTemplate, ANIM_ATTACKER, 50, 0x0, ANIM_TARGET, 0x0, 0x0, 0x0, 0x35 - delay 0x5 + delay 5 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER createsprite gOceanOperaExpandingRingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x0 - delay 0x4 + delay 4 createsprite gOceanOperaExpandingRingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x0 - delay 0x4 + delay 4 createsprite gOceanOperaExpandingRingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x0 - delay 0x4 + delay 4 createsprite gOceanOperaExpandingRingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x0 - delay 0x4 + delay 4 createsprite gOceanOperaExpandingRingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x0 - delay 0x10 + delay 16 loadspritegfx ANIM_TAG_EXPLOSION @explosion loadspritegfx ANIM_TAG_SPARKLE_2 @sparkle loadspritegfx ANIM_TAG_RAIN_DROPS @rain createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 8, 64 call OceanicOperettaExplosion - createvisualtask AnimTask_BlendBattleAnimPal, 0x2, F_PAL_TARGET, 0x2, 0x0, 0xb, 0x5da0 + createvisualtask AnimTask_BlendBattleAnimPal, 2, F_PAL_TARGET, 2, 0, 11, RGB(0, 13, 23) createvisualtask AnimTask_CreateRaindrops, 0x2, 0x0, 0x3, 0x78 call OceanicOperettaExplosion call OceanicOperettaExplosion playsewithpan SE_M_RAIN_DANCE, SOUND_PAN_ATTACKER createvisualtask AnimTask_CreateRaindrops, 0x2, 0x0, 0x3, 0x78 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0x2, F_PAL_TARGET, 0x2, 0xb, 0x0, 0x5da0 + createvisualtask AnimTask_BlendBattleAnimPal, 2, F_PAL_TARGET, 2, 11, 0, RGB(0, 13, 23) waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x6, 0x0, 0x5da0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 6, 0, RGB(0, 13, 23) waitforvisualfinish createvisualtask AnimTask_AllBattlersVisible, 0xA waitforvisualfinish end OceanicOperettaBuffEffect: createsprite gOceanOperaBlueFlareSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gOceanOperaBlueFlareSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gOceanOperaBlueFlareSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gOceanOperaBlueFlareSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gOceanOperaBlueFlareSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return OceanicOperettaExplosion: createsprite gOceanOperaSparkleSpriteTemplate, ANIM_ATTACKER, 51, 0xfff1, 0x0, ANIM_TARGET, 0x0, 0x20, 0x3c playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gOceanOperaExplosionSpriteTemplate, ANIM_ATTACKER, 51, 0x0, 0x0, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gOceanOperaExplosionSpriteTemplate, ANIM_ATTACKER, 51, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gOceanOperaExplosionSpriteTemplate, ANIM_ATTACKER, 51, 0xfff0, 0x10, ANIM_TARGET, 0x1 createsprite gOceanOperaSparkleSpriteTemplate, ANIM_ATTACKER, 51, 0xc, 0xfffb, ANIM_TARGET, 0x0, 0x20, 0x3c - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gOceanOperaExplosionSpriteTemplate, ANIM_ATTACKER, 51, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gOceanOperaExplosionSpriteTemplate, ANIM_ATTACKER, 51, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 return @@ -33455,18 +36371,18 @@ SplinteredStormshardsFinishFade: SplinteredStormshardsByPlayer: loopsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET, 0x10, 0xc call SplinteredStormshardsPlayer_Rising1 - delay 0x2 + delay 2 loadspritegfx ANIM_TAG_ROUND_SHADOW @fly playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gSplinteredShardsFlySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 call SplinteredStormshardsPlayer_Rising1 call SplinteredStormshardsPlayer_Rising2 visible ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x60, 0x80, 0x60, 0x30, 0x30 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 31, 22) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 - delay 0x2 + delay 2 call SplinteredStormshardsPlayer_Rising2 call SplinteredStormshardsPlayer_Rising1 delay 16 @@ -33476,25 +36392,25 @@ SplinteredStormshardsByPlayer: loadspritegfx ANIM_TAG_EXPLOSION @explosion playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x4 @lunge forward - delay 0x2 + delay 2 invisible ANIM_ATTACKER createsprite gGrowingSuperpowerTemplate, ANIM_TARGET, 3, 0x0 @superpower createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 96, 1 @shake target up and down createsprite gSplinteredShardsSplinterOpponentSteepSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0x18, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gSplinteredShardsSplinterOpponentShallowSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0x1, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x4 + delay 4 call SplinteredStormshardsExplosionOpponent call SplinteredStormshardsExplosionOpponent SplinteredStormshardsEnd: - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x4, 0x0, 0x10, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 4, 0, 16, RGB_WHITE call SplinteredStormshardsBrownExplode waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x4, 0x10, 0x0, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 4, 16, 0, RGB_WHITE waitforvisualfinish createvisualtask AnimTask_AllBattlersVisible, 0xA waitforvisualfinish @@ -33506,48 +36422,48 @@ SplinteredStormshardsExplosionOpponent: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 createsprite gSplinteredShardsSplinterOpponentSteepSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x20, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 createsprite gSplinteredShardsSplinterOpponentShallowSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x0, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 createsprite gSplinteredShardsSplinterOpponentShallowSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0xfff8, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 createsprite gSplinteredShardsSplinterOpponentSteepSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x20, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 createsprite gSplinteredShardsSplinterOpponentShallowSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x0, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x2 + delay 2 return SplinteredStormshardsByOpponent: loopsewithpan SE_M_ROCK_THROW SOUND_PAN_TARGET 0x10 0xc call SplinteredStormshardsOpponent_Rising1 - delay 0x2 + delay 2 loadspritegfx ANIM_TAG_ROUND_SHADOW @fly createsprite gSplinteredShardsFlySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 call SplinteredStormshardsOpponent_Rising1 call SplinteredStormshardsOpponent_Rising2 visible ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0xd0, 0x40, 0xd0, 0x0, 0x30 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 31, 22) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 - delay 0x2 + delay 2 call SplinteredStormshardsOpponent_Rising2 call SplinteredStormshardsOpponent_Rising1 delay 16 @@ -33556,17 +36472,17 @@ SplinteredStormshardsByOpponent: loadspritegfx ANIM_TAG_EXPLOSION @explosion playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x4 @lunge forward - delay 0x2 + delay 2 invisible ANIM_ATTACKER createsprite gGrowingSuperpowerTemplate, ANIM_TARGET, 3, 0x0 @superpower createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 96, 1 @shake target up and down createsprite gSplinteredShardsSplinterPlayerShallowSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x18, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gSplinteredShardsSplinterPlayerSteepSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x30, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 - delay 0x4 + delay 4 + delay 4 call SplinteredStormshardsExplosionOnPlayer call SplinteredStormshardsExplosionOnPlayer goto SplinteredStormshardsEnd @@ -33574,106 +36490,106 @@ SplinteredStormshardsExplosionOnPlayer: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 createsprite gSplinteredShardsSplinterPlayerShallowSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x20, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 createsprite gSplinteredShardsSplinterPlayerSteepSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x35, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 createsprite gSplinteredShardsSplinterPlayerShallowSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x1c, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 createsprite gSplinteredShardsSplinterPlayerShallowSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x16, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 createsprite gSplinteredShardsSplinterPlayerSteepSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x2d, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x2 + delay 2 return SplinteredStormshardsBrownExplode: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 return SplinteredStormshardsPlayer_Rising1: createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x24, 0x80, 0x24, 0x30, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x10, 0x80, 0x10, 0x35, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x45, 0x80, 0x45, 0x3a, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x60, 0x80, 0x60, 0x30, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x30, 0x80, 0x30, 0x3c, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x55, 0x80, 0x55, 0x33, 0x30 - delay 0x2 + delay 2 return SplinteredStormshardsPlayer_Rising2: createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x29, 0x80, 0x29, 0x31, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x73, 0x80, 0x73, 0x32, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x4a, 0x80, 0x4a, 0x3c, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x64, 0x80, 0x64, 0x33, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x2c, 0x80, 0x2c, 0x3d, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x6c, 0x80, 0x6c, 0x30, 0x30 - delay 0x2 + delay 2 return SplinteredStormshardsOpponent_Rising1: createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x94, 0x40, 0x94, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x80, 0x40, 0x80, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0xb5, 0x40, 0xb5, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0xd0, 0x40, 0xd0, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0xa0, 0x40, 0xa0, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0xc5, 0x40, 0xc5, 0x0, 0x30 - delay 0x2 + delay 2 return SplinteredStormshardsOpponent_Rising2: createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x99, 0x40, 0x99, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0xe3, 0x40, 0xe3, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0xba, 0x40, 0xba, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0xd4, 0x40, 0xd4, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x9c, 0x40, 0x9c, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0xdc, 0x40, 0xdc, 0x0, 0x30 - delay 0x2 + delay 2 return @@ -33688,55 +36604,55 @@ gBattleAnimMove_LetsSnuggleForever:: createsprite gSnuggleForeverHeartSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x14 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x1, 0x1, 0x0 - delay 0x7 + delay 7 createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x3, 0x3, 0x80 - delay 0x8 + delay 8 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x2, 0x0, 0x80 - delay 0x7 + delay 7 createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1, 0x1, 0x0 - delay 0x8 + delay 8 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER - delay 0x7 + delay 7 createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x0, 0x3, 0x0 - delay 0x7 + delay 7 fadetobg BG_SNUGGLE_FOREVER waitbgfadeout invisible ANIM_ATTACKER - delay 0x1 + delay 1 setarg 0x7 0x0 @;Clear arg 7 so task works properly in Link battles createvisualtask AnimTask_SnatchOpposingMonMove, 0x2 - delay 0x10 + delay 16 playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER waitforvisualfinish setarg 0x7 0x0 @;Clear arg 7 so task works properly in Link battles createvisualtask AnimTask_SnatchOpposingMonMove, 0x2 - delay 0x10 + delay 16 playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER waitforvisualfinish setarg 0x7 0x0 @;Clear arg 7 so task works properly in Link battles createvisualtask AnimTask_SnatchOpposingMonMove, 0x2 - delay 0x10 + delay 16 playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 50, 1 call LetsSnuggleForeverTears - delay 0x8 + delay 8 call LetsSnuggleForeverTears - delay 0x8 + delay 8 call LetsSnuggleForeverTears - delay 0x8 + delay 8 call LetsSnuggleForeverTears waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x2, 0x0, 0x10, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 2, 0, 16, RGB_BLACK waitforvisualfinish loadspritegfx ANIM_TAG_SPARKLE_4 @detect playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gSnuggleForeverEyesSpriteTemplate, ANIM_ATTACKER, 13, 0xa, 0xfff2 createsprite gSnuggleForeverEyesSpriteTemplate, ANIM_ATTACKER, 13, 0xfff6, 0xfff2 - delay 0x20 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0x0, 0x10, 0x579D + delay 32 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 0, 16, RGB(29, 28, 21) createvisualtask AnimTask_GrowTarget, 0x5 - delay 0x5 + delay 5 loadspritegfx ANIM_TAG_IMPACT @hit loadspritegfx ANIM_TAG_PAIN_SPLIT @painsplit loadspritegfx ANIM_TAG_DUCK @duck @@ -33754,17 +36670,17 @@ gBattleAnimMove_LetsSnuggleForever:: createvisualtask AnimTask_TranslateMonElliptical, 0x2, 0x0, 0xffee, 0x6, 0x6, 0x4 createvisualtask AnimTask_TranslateMonElliptical, 0x2, 0x1, 0x12, 0x6, 0x6, 0x4 call LetsSnuggleForeverStars_1 - delay 0x0 + delay 0 call LetsSnuggleForeverImpacts call LetsSnuggleForeverStars_2 - delay 0x0 + delay 0 call LetsSnuggleForeverImpacts call LetsSnuggleForeverStars_1 - delay 0x0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 0x2, 0x0, 0x10, 0x7fff + delay 0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 2, 0, 16, RGB_WHITE playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET call LetsSnuggleForeverStars_2 - delay 0x0 + delay 0 call LetsSnuggleForeverImpacts invisible ANIM_TARGET stopsound @@ -33775,17 +36691,17 @@ LetsSnuggleForeverTears: playsewithpan SE_M_TAIL_WHIP, SOUND_PAN_TARGET createsprite gTearDropSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0 createsprite gTearDropSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x1 - delay 0x8 + delay 8 createsprite gTearDropSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x2 createsprite gTearDropSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x3 return LetsSnuggleForeverImpacts: createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, -12, ANIM_TARGET, 0 - delay 0x8 + delay 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -12, 8, ANIM_TARGET, 0 - delay 0x8 + delay 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 12, 0, ANIM_TARGET, 0 - delay 0x8 + delay 8 return LetsSnuggleForeverStars_1: createsprite gSnuggleForeverStarSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0xfff8, 0xa0, 0xffe0 @@ -33831,20 +36747,18 @@ gBattleAnimMove_ClangorousSoulblaze:: playsewithpan SE_SHINY, SOUND_PAN_ATTACKER createsprite gClangorousSoulRedRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0 waitforvisualfinish - unloadspritegfx ANIM_TAG_HORSESHOE_SIDE_FIST - unloadspritegfx ANIM_TAG_SPARKLE_2 @stars loadspritegfx ANIM_TAG_ROUND_SHADOW @ fly playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gClangoorousSoulblazeWhiteFlySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 - delay 0x2 + delay 2 createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0xFFE0, 0x1, 0xffff createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -768, 10, 0, 42 createsprite gSlideMonToOffsetPartnerSpriteTemplate, ANIM_ATTACKER, 2, ANIM_DEF_PARTNER, 0xfd00, 0xa, 0x0, 0x2a - delay 0x20 + delay 32 createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0x20, 0x1, 0xffff - delay 0xC + delay 12 setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x4, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 4, RGB_BLACK loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge visible ANIM_ATTACKER monbg ANIM_ATTACKER @@ -33865,20 +36779,20 @@ gBattleAnimMove_ClangorousSoulblaze:: clearmonbg ANIM_ATTACKER invisible ANIM_ATTACKER invisible ANIM_ATK_PARTNER - delay 0x0 + delay 0 monbg ANIM_TARGET playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_ATTACKER createsprite gClangoorousSoulblazePulseSpriteTemplate, ANIM_ATTACKER, 2, 0x10, 0x0, 0x0, 0x0, 0x1d, 0x0 createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x0 @music note - delay 0x5 + delay 5 createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 2, 60 createvisualtask AnimTask_HorizontalShake, 5, ANIM_DEF_PARTNER, 2, 60 call ClangorousSoulblazePulse_1 - delay 0x5 + delay 5 call ClangorousSoulblazePulse_2 - delay 0x5 + delay 5 call ClangorousSoulblazePulse_3 - delay 0x5 + delay 5 call ClangorousSoulblazePulse_4 loadspritegfx ANIM_TAG_EXPLOSION createvisualtask AnimTask_IsTargetPlayerSide, 0x2 @@ -33886,148 +36800,148 @@ gBattleAnimMove_ClangorousSoulblaze:: ClangorousSoulblazeOnPlayer: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x10, 0xfff0, ANIM_ATTACKER, 0x1 - delay 0x5 + delay 5 call ClangorousSoulblazePulse_5 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x10, 0x10, ANIM_ATTACKER, 0x1 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x20, 0xffe0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_1 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x20, 0x0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_2 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x30, 0xffe0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_3 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x30, 0xfff0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_4 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x35, 0x0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_5 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x40, 0x10, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_1 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x40, 0x0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_2 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x45, 0xfff0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_3 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x50, 0x10, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_4 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x50, 0xffe0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_5 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x60, 0xfff0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_1 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x60, 0xffe0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_2 - delay 0x5 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x4, 0x0, 0x10, 0x7fff + delay 5 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 4, 0, 16, RGB_WHITE playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x65, 0xfff0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_3 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x65, 0xffe0, ANIM_ATTACKER, 0x1 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, ANIM_TARGET, 0x1 call ClangorousSoulblazePulse_4 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 call ClangorousSoulblazePulse_5 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 call ClangorousSoulblazePulse_1 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 call ClangorousSoulblazePulse_2 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x10, 0x10, ANIM_TARGET, 0x1 goto FINISH_SOULBLAZE ClangorousSoulblazeOnOpponent: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x15, ANIM_ATTACKER, 0x1 - delay 0x5 + delay 5 call ClangorousSoulblazePulse_5 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x0, ANIM_ATTACKER, 0x1 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x20, 0x25, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_1 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x20, 0x5, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_2 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x30, 0x25, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_3 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x30, 0x15, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_4 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x35, 0x0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_5 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x40, 0xa, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_1 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x40, 0x0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_2 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x45, 0x10, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_3 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x50, 0x30, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_4 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x50, 0x25, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_5 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x60, 0x40, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_1 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x60, 0x45, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_2 - delay 0x5 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x4, 0x0, 0x10, 0x7fff + delay 5 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 4, 0, 16, RGB_WHITE playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x65, 0x35, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_3 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x65, 0x40, ANIM_ATTACKER, 0x1 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 call ClangorousSoulblazePulse_4 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 call ClangorousSoulblazePulse_5 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 call ClangorousSoulblazePulse_1 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 call ClangorousSoulblazePulse_2 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 FINISH_SOULBLAZE: waitforvisualfinish clearmonbg ANIM_TARGET - delay 0x5 + delay 5 call ResetFromWhiteScreen blendoff createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10 @@ -34037,32 +36951,32 @@ FINISH_SOULBLAZE: ClangorousSoulblazeEnergySwirl: createsprite gClangoorousSoulblazePurpleSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, ANIM_ATTACKER createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x2 + delay 2 createsprite gClangoorousSoulblazePurpleSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 createsprite gClangoorousSoulblazePurpleSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gClangoorousSoulblazePurpleSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 createsprite gClangoorousSoulblazePurpleSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gClangoorousSoulblazePurpleSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 return ClangorousSoulblazeBuffEffect: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER createsprite gClangorousSoulBlueBuffTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gClangorousSoulPurpleBuffTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x0, 0x0, 0x20, 0x3c - delay 0x4 + delay 4 createsprite gClangorousSoulWhiteBuffTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 0xc, 0xfffb, 0x0, 0x0, 0x20, 0x3c return ClangorousSoulblazePulse_1: @@ -34105,33 +37019,33 @@ gBattleAnimMove_GuardianOfAlola:: playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, -256, 15, 0, 4 call GuardianOfAlolaRocksPlayer - delay 0xa + delay 10 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x10 call GuardianOfAlolaRocksPlayer waitforvisualfinish - delay 0xa + delay 10 playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, -256, 15, 0, 4 call GuardianOfAlolaRocksPlayer - delay 0xa + delay 10 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x10 call GuardianOfAlolaRocksPlayer waitforvisualfinish - delay 0xa - delay 0x10 + delay 10 + delay 16 call GuardianOfAlolaRocksPlayer - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0xC, 0xC, 0x277f @;Yellow + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 12, 12, RGB(31, 27, 9) @;Yellow createvisualtask AnimTask_NightShadeClone, 0x5, 0x75 - delay 0x10 + delay 16 call GuardianOfAlolaRocksPlayer - delay 0x10 + delay 16 call GuardianOfAlolaRocksPlayer - delay 0x10 + delay 16 loadspritegfx ANIM_TAG_HORSESHOE_SIDE_FIST call GuardianOfAlolaRocksPlayer - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x3, 0x0, 0xb, 0x0000 - delay 0x1 - createvisualtask AnimTask_BlendParticle, 0x2, ANIM_TAG_HORSESHOE_SIDE_FIST, 0x0, 0xC, 0xc, 0x277f + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 3, 0, 11, RGB_BLACK + delay 1 + createvisualtask AnimTask_BlendParticle, 2, ANIM_TAG_HORSESHOE_SIDE_FIST, 0, 12, 12, RGB(31, 27, 9) fadetobg BG_FISSURE waitbgfadeout call GuardianOfAlolaRocksPlayer @@ -34139,8 +37053,8 @@ gBattleAnimMove_GuardianOfAlola:: waitbgfadein playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET createsprite gGuardianOfAlolaFistSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xffd0, 0x1f - delay 0x24 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x0, 0xb, 0x0, 0x0000 + delay 36 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0, 11, 0, RGB_BLACK playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createvisualtask AnimTask_HorizontalShake, 3, ANIM_TARGET, 10, 0x25 loopsewithpan SE_M_ROCK_THROW SOUND_PAN_TARGET 0x10 0x9 @@ -34157,7 +37071,7 @@ gBattleAnimMove_GuardianOfAlola:: call GuardianOfAlolaRockGeyser call GuardianOfAlolaRockGeyser call GuardianOfAlolaRocksTarget - createvisualtask AnimTask_BlendBattleAnimPal, 0x2, (F_PAL_BG | F_PAL_BATTLERS_2), 0x3, 0x0, 0x10, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 2, (F_PAL_BG | F_PAL_BATTLERS_2), 3, 0, 16, RGB_WHITE call GuardianOfAlolaRockGeyser call GuardianOfAlolaRockGeyser call GuardianOfAlolaRockGeyser @@ -34180,13 +37094,13 @@ GuardianOfAlolaRocksTarget: return GuardianOfAlolaRockGeyser: createsprite gGuardianOfAlolaDirtGeyserSpriteTemplate, ANIM_TARGET, 2, 0, 0xfffc, 0x10 @ -4, -0x10 - delay 0x0 + delay 0 createsprite gGuardianOfAlolaDirtGeyserSpriteTemplate, ANIM_TARGET, 2, 0, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gGuardianOfAlolaDirtGeyserSpriteTemplate, ANIM_TARGET, 2, 0, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gGuardianOfAlolaDirtGeyserSpriteTemplate, ANIM_TARGET, 2, 0, 0xfff0, 0x10 - delay 0x0 + delay 0 return @@ -34196,15 +37110,15 @@ gBattleAnimMove_SearingSunrazeSmash:: invisible ANIM_TARGET createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0xe, 0x001b + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 14, RGB(27, 0, 0) playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call SearingSunrazeSmashFlare - delay 0x8 + delay 8 playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_WHITE createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call SearingSunrazeSmashFlare - delay 0x8 + delay 8 call SearingSunrazeSmashFlare waitforvisualfinish unloadspritegfx ANIM_TAG_FOCUS_ENERGY @focus energy @@ -34215,28 +37129,28 @@ gBattleAnimMove_SearingSunrazeSmash:: loadspritegfx ANIM_TAG_AIR_WAVE_2 @white/grey playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER createsprite gSearingSunrazeSmashGrowWormholeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x10 + delay 16 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 53, -19, 1, 2 - delay 0x2 + delay 2 loadspritegfx ANIM_TAG_METEOR @superpower visible ANIM_TARGET createvisualtask AnimTask_RotateMonSpriteToSide, 2, 80, -1024, ANIM_TARGET, 0 @ spin up target call SearingSunrazeSmashRingsInward createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x30 @ target back to origin (slowly) call SearingSunrazeSmashRingsInward - delay 0xD + delay 13 invisible ANIM_TARGET createsprite gSearingSunrazeSmashBlueRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gSearingSunrazeSmashWhiteRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x6 + delay 6 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x4 @lunge forward playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 invisible ANIM_ATTACKER createsprite gGrowingSuperpowerTemplate, ANIM_TARGET, 3, 0x0 @superpower createsprite gSearingSunrazeSmashBlueRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_ATTACKER fadetobg BG_COSMIC waitbgfadeout @@ -34261,7 +37175,7 @@ gBattleAnimMove_SearingSunrazeSmash:: loadspritegfx ANIM_TAG_ROUND_SHADOW @fly playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET createsprite gSearingSunrazeSmashRedFlySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ATTACKER), 0x3, 0x0, 0xF, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 3, 0, 15, RGB_BLACK waitforvisualfinish playsewithpan SE_ORB, SOUND_PAN_ATTACKER unloadspritegfx ANIM_TAG_ROUND_SHADOW @fly @@ -34285,42 +37199,40 @@ gBattleAnimMove_SearingSunrazeSmash:: loadspritegfx ANIM_TAG_CUT @cut createsprite gSunsteelStrikeSuperpowerTemplate, ANIM_TARGET, 2, 0x14 SearingSunrazeSmashImpact: - delay 0x8 - delay 0x1 + delay 8 + delay 1 unloadspritegfx ANIM_TAG_GOLD_RING @beam createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 4, 60 playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gSearingSunrazeSmashWhiteCutSpriteTemplate, ANIM_TARGET, 2, 0x20, 0xffe0, 0x0 - delay 0x2 + delay 2 playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gSearingSunrazeSmashWhiteCutSpriteTemplate, ANIM_TARGET, 2, 0x20, 0xffe0, 0x1 - delay 0x2 + delay 2 playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gSearingSunrazeSmashWhiteCutSpriteTemplate, ANIM_TARGET, 2, 0x1c, 0xffe0, 0x0 - delay 0x2 + delay 2 playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gSearingSunrazeSmashWhiteCutSpriteTemplate, ANIM_TARGET, 2, 0x1c, 0xffe0, 0x1 - delay 0x2 + delay 2 playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gSearingSunrazeSmashWhiteCutSpriteTemplate, ANIM_TARGET, 2, 0x2c, 0xffe0, 0x0 - delay 0x2 + delay 2 playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gSearingSunrazeSmashWhiteCutSpriteTemplate, ANIM_TARGET, 2, 0x2c, 0xffe0, 0x1 - delay 0x2 + delay 2 loadspritegfx ANIM_TAG_CROSS_IMPACT @x - delay 0x0 + delay 0 unloadspritegfx ANIM_TAG_METEOR @superpower - unloadspritegfx ANIM_TAG_DRAGON_ASCENT @dragon ascent 1 - unloadspritegfx ANIM_TAG_DRAGON_ASCENT_FOE @dragon ascent 2 createsprite gSearingSunrazeSmashCrossImpactSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1, 0x24 playsewithpan SE_M_LEER, SOUND_PAN_TARGET visible ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ATTACKER), 0x3, 0xF, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 3, 15, 0, RGB_BLACK visible ANIM_ATTACKER playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x10, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 16, RGB_BLACK createsprite gSearingSunrazeSmashShockwaveSpriteTemplate, ANIM_TARGET, 2 @ charge out and in - delay 0x1c + delay 28 invisible ANIM_TARGET unloadspritegfx ANIM_TAG_CUT @cut unloadspritegfx ANIM_TAG_CROSS_IMPACT @x @@ -34328,35 +37240,35 @@ SearingSunrazeSmashImpact: call SearingSunrazeSmashInferno call SearingSunrazeSmashInferno call SearingSunrazeSmashInferno - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x4, 0x0, 0x10, 0x001b @full red + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 4, 0, 16, RGB(27, 0, 0) @full red call SearingSunrazeSmashInferno call SearingSunrazeSmashInferno call SearingSunrazeSmashInferno waitforvisualfinish - delay 0x10 + delay 16 call ResetFromRedScreen end SearingSunrazeSmashFlare: createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x0, 0x0, 0x20, 0x3c createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 0xc, 0xfffb, 0x0, 0x0, 0x20, 0x3c createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return SearingSunrazeSmashRingsInward: createsprite gSearingSunrazeSmashBlueRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gSearingSunrazeSmashWhiteRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gSearingSunrazeSmashBlueRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 return SearingSunrazeSmashInferno: playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER @@ -34365,56 +37277,56 @@ SearingSunrazeSmashInferno: createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x2, 0x0 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0xfffe, 0x2 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0x2, 0x2 - delay 0x3 + delay 3 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xa, 0x0, 0xfffe createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0xfffe, 0x0 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x2, 0x0 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0xfffe, 0x2 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0x2, 0x2 - delay 0x3 + delay 3 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xa, 0x0, 0xfffe createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0xfffe, 0x0 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x2, 0x0 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0xfffe, 0x2 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0x2, 0x2 - delay 0x3 + delay 3 return SearingSunrazeSmashCharge: createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2c, 0x510, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2f, 0x490, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x30, 0x4e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2c, 0x500, 0x19, 0x10, 0x2e, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x31, 0x540, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x31, 0x4d0, 0x1e, 0xf, 0xffce, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2f, 0x490, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2c, 0x510, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2c, 0x500, 0x19, 0x10, 0x2e, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x30, 0x4e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x31, 0x4d0, 0x1e, 0xf, 0xffce, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x31, 0x540, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x1 + delay 1 return ResetFromRedScreen: createvisualtask AnimTask_AllBattlersInvisible, 0xA waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BATTLERS_2, 0x2, 0x0, 0x0, 0x1B @Everything from red + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BATTLERS_2, 2, 0, 0, RGB(27, 0, 0) @Everything from red restorebg waitbgfadeout setarg 0x7 0xffff createvisualtask AnimTask_AllBattlersVisible, 0xA waitbgfadein - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0x0, 0x33ED + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 0, RGB(13, 31, 12) waitforvisualfinish return @@ -34428,15 +37340,15 @@ gBattleAnimMove_MenacingMoonrazeMaelstrom:: invisible ANIM_TARGET createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0xe, 0x40c0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 14, RGB(0, 6, 16) playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call MenacingMoonrazeMaelstromFlare - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 12, RGB_BLACK createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call MenacingMoonrazeMaelstromFlare playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER - delay 0x8 + delay 8 call MenacingMoonrazeMaelstromFlare waitforvisualfinish unloadspritegfx ANIM_TAG_SPARKLE_2 @sparkles @@ -34444,28 +37356,28 @@ gBattleAnimMove_MenacingMoonrazeMaelstrom:: loadspritegfx ANIM_TAG_AIR_WAVE_2 @white/grey playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER createsprite gMoonrazeMaelstromWormholeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x10 + delay 16 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 53, -19, 1, 2 @ target down and left (instantaneously (last arg)) - delay 0x2 + delay 2 loadspritegfx ANIM_TAG_METEOR @superpower visible ANIM_TARGET createvisualtask AnimTask_RotateMonSpriteToSide, 2, 80, -1024, ANIM_TARGET, 0 @ spin up target call MenacingMoonrazeMaelstromRingsInward createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x30 @ target back to origin (slowly) call MenacingMoonrazeMaelstromRingsInward - delay 0xD + delay 13 invisible ANIM_TARGET createsprite gMoonrazeMaelstromBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gMoonrazeMaelstromWhiteRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x6 + delay 6 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x4 @lunge forward playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 invisible ANIM_ATTACKER createsprite gMoonrazeMaelstromSuperpowerSpriteTemplate, ANIM_TARGET, 3, 0x0 @superpower createsprite gMoonrazeMaelstromBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_ATTACKER fadetobg BG_COSMIC waitbgfadeout @@ -34481,7 +37393,7 @@ MenacingMoonrazeMaelstromFinish: invisible ANIM_TARGET waitbgfadein visible ANIM_ATTACKER - delay 0x2 + delay 2 visible ANIM_TARGET waitforvisualfinish loadspritegfx ANIM_TAG_POISON_BUBBLE @poison bubble @@ -34503,7 +37415,7 @@ MenacingMoonrazeMaelstromFinish: call MenacingMoonrazeMaelstromBeam call MenacingMoonrazeMaelstromBeam createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 60, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0x2, F_PAL_TARGET, 0x4, 0x0, 0xc, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 2, F_PAL_TARGET, 4, 0, 12, RGB_BLACK call MenacingMoonrazeMaelstromBeam call MenacingMoonrazeMaelstromBeam call MenacingMoonrazeMaelstromBeam @@ -34538,7 +37450,7 @@ MenacingMoonrazeMaelstromFinish: createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 76, 1 call MenacingMoonrazeMaelstromExplosion call MenacingMoonrazeMaelstromExplosion - createvisualtask AnimTask_BlendBattleAnimPal, 0x2, (F_PAL_BG | F_PAL_BATTLERS_2), 0x2, 0x0, 0x10, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 2, (F_PAL_BG | F_PAL_BATTLERS_2), 2, 0, 16, RGB_WHITE call MenacingMoonrazeMaelstromExplosion waitforvisualfinish call ResetFromWhiteScreen @@ -34546,67 +37458,67 @@ MenacingMoonrazeMaelstromFinish: MenacingMoonrazeMaelstromExplosion: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gMoonrazeMaelstromExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gMoonrazeMaelstromExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gMoonrazeMaelstromExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gMoonrazeMaelstromExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gMoonrazeMaelstromExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 return MenacingMoonrazeMaelstromFlare: createsprite gMoonrazeMaelstromBlackSparklesSpriteTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x0, 0x0, 0x20, 0x3c createsprite gMoonrazeMaelstromBlueBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gMoonrazeMaelstromBlueBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gMoonrazeMaelstromBlackSparklesSpriteTemplate, ANIM_ATTACKER, 2, 0xc, 0xfffb, 0x0, 0x0, 0x20, 0x3c createsprite gMoonrazeMaelstromBlackBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gMoonrazeMaelstromBlackBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gMoonrazeMaelstromBlackBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return MenacingMoonrazeMaelstromRingsInward: createsprite gMoonrazeMaelstromBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gMoonrazeMaelstromWhiteRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gMoonrazeMaelstromBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 return MenacingMoonrazeMaelstromChargeUp: createsprite gMoonrazeMaelstromPurpleBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 createsprite gMoonrazeMaelstromBlackOrbsSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gMoonrazeMaelstromBlackOrbsSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gMoonrazeMaelstromPurpleBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 createsprite gMoonrazeMaelstromBlackOrbsSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gMoonrazeMaelstromBlackOrbsSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gMoonrazeMaelstromBlackOrbsSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gMoonrazeMaelstromBlackOrbsSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gMoonrazeMaelstromPurpleBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 createsprite gMoonrazeMaelstromBlackOrbsSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gMoonrazeMaelstromBlackOrbsSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gMoonrazeMaelstromPurpleBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return MenacingMoonrazeMaelstromBeam: createsprite gMoonrazeMaelstromBeamSpriteTemplate, ANIM_TARGET, 2 createsprite gMoonrazeMaelstromBeamSpriteTemplate, ANIM_TARGET, 2 - delay 0x1 + delay 1 return @@ -34620,20 +37532,20 @@ gBattleAnimMove_LightThatBurnsTheSky:: loadspritegfx ANIM_TAG_FOCUS_ENERGY playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call EndureEffect - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 31, 22) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call EndureEffect - delay 0x8 + delay 8 call EndureEffect - delay 0x8 + delay 8 unloadspritegfx ANIM_TAG_FOCUS_ENERGY monbg ANIM_ATTACKER setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ADJACENT), 0x2, 0x0, 0xF, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ADJACENT), 2, 0, 15, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 60, 2, 12 @ charge particles to attacker - delay 0x1e + delay 30 loopsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER, 0xe, 0xa createsprite gSuperpowerOrbSpriteTemplate, ANIM_TARGET, 3, 0x0 call LightThatBurnsTheSkyGreenSparks @@ -34645,8 +37557,8 @@ gBattleAnimMove_LightThatBurnsTheSky:: call LightThatBurnsTheSkyGreenSparks call LightThatBurnsTheSkyGreenSparks call LightThatBurnsTheSkyGreenSparks - delay 0xe - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x4, 0x0000 + delay 14 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 4, RGB_BLACK clearmonbg ANIM_ATTACKER blendoff playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER @@ -34654,17 +37566,17 @@ gBattleAnimMove_LightThatBurnsTheSky:: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xfff0, 0x25, 0x2c, 0x60, 0x8, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xfff0, 0x25, 0x2c, 0xa0, 0x8, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xfff0, 0x25, 0x2c, 0xe0, 0x8, 0x2, 0x3 - delay 0x1 + delay 1 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0xffe4, 0x25, 0x2c, 0x20, 0x8, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0xffe4, 0x25, 0x2c, 0x60, 0x8, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0xffe4, 0x25, 0x2c, 0xa0, 0x8, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0xffe4, 0x25, 0x2c, 0xe0, 0x8, 0x2, 0x3 - delay 0x1 + delay 1 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0xffd8, 0x25, 0x2c, 0x20, 0x8, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0xffd8, 0x25, 0x2c, 0x60, 0x8, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0xffd8, 0x25, 0x2c, 0xa0, 0x8, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0xffd8, 0x25, 0x2c, 0xe0, 0x8, 0x2, 0x3 - delay 0x6 + delay 6 createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 3, 60 unloadspritegfx ANIM_TAG_LEAF @green unloadspritegfx ANIM_TAG_ELECTRIC_ORBS @charge @@ -34673,19 +37585,19 @@ gBattleAnimMove_LightThatBurnsTheSky:: loadspritegfx ANIM_TAG_STRAIGHT_BEAM panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 monbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x6, 0x0, 0x10, 0x43FF @;Light yellow + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 6, 0, 16, RGB(31, 31, 16) @;Light yellow call PhotonGeyserBeam call LightThatBurnsTheSkyGeyser call LightThatBurnsTheSkyBlast_1 call LightThatBurnsTheSkyGeyser call LightThatBurnsTheSkyBlast_2 call LightThatBurnsTheSkyGeyser - createvisualtask AnimTask_BlendBattleAnimPal, 0x2, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 0x4, 0x0, 0x10, 0x43FF + createvisualtask AnimTask_BlendBattleAnimPal, 2, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 4, 0, 16, RGB(31, 31, 16) call LightThatBurnsTheSkyBlast_3 clearmonbg ANIM_TARGET waitforvisualfinish - delay 0x10 - createvisualtask AnimTask_BlendBattleAnimPal, 0x2, (F_PAL_BG | F_PAL_BATTLERS_2), 0x0, 0x10, 0x0, 0x43FF + delay 16 + createvisualtask AnimTask_BlendBattleAnimPal, 2, (F_PAL_BG | F_PAL_BATTLERS_2), 0, 16, 0, RGB(31, 31, 16) restorebg waitbgfadeout end @@ -34722,38 +37634,38 @@ LightThatBurnsTheSkyBlast_3: LightThatBurnsTheSkyGeyser: createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0003, 0x0005, 0x1, 0x0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfff5, 0xfff1, 0x1, 0x0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0008, 0xfffb, 0x1, 0x0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfffa, 0x0012, 0x1, 0x0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0000, 0x0005, 0x1, 0x0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0003, 0xfff5, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfff5, 0xffe1, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0008, 0xffeb, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfffa, 0x0002, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0000, 0xfff5, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0003, 0xffe5, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfff5, 0xffd1, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0008, 0xffdb, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfffa, 0xfff2, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0000, 0xffe5, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 return LightThatBurnsTheSkyGreenSparks: createsprite gLightThatBurnsTheSkyGreenSparkSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x30, 0x2c, 0x0, 0x28, 0x0, 0x3 @@ -34764,7 +37676,7 @@ LightThatBurnsTheSkyGreenSparks: createsprite gLightThatBurnsTheSkyGreenSparkSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gLightThatBurnsTheSkyGreenSparkSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gLightThatBurnsTheSkyGreenSparkSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x2, 0x3 - delay 0x10 + delay 16 return @@ -34786,7 +37698,7 @@ gBattleAnimMove_SoulStealing7StarStrike:: createsprite gSoulStealBlastburnSpriteTemplate, ANIM_ATTACKER, 66, 0x14, 0xa, 0x18, 0x0, 0x0, 0x0 createsprite gSoulStealBlastburnSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x10, 0x18, 0x0, 0x0, 0x0 createsprite gSoulStealBlastburnSpriteTemplate, ANIM_ATTACKER, 2, 0xffec, 0xa, 0x18, 0x0, 0x0, 0x0 - delay 0x5 + delay 5 playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gSoulStealBlackFlySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 waitforvisualfinish @@ -34797,58 +37709,58 @@ gBattleAnimMove_SoulStealing7StarStrike:: loadspritegfx ANIM_TAG_FOCUS_ENERGY @focus energy playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call SoulStealingSevenStarStrikeBuffEffect - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_BLACK createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call SoulStealingSevenStarStrikeBuffEffect - delay 0x8 + delay 8 call SoulStealingSevenStarStrikeBuffEffect - delay 0x4 + delay 4 visible ANIM_TARGET waitforvisualfinish unloadspritegfx ANIM_TAG_FIRE_PLUME loadspritegfx ANIM_TAG_PAIN_SPLIT @pain split createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 37, 1 createsprite gSoulStealBlueFistSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0x14, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 createsprite gSoulStealBlueStarSpriteTemplate, ANIM_TARGET, 4, 0x0, ANIM_TARGET, 0x2, 0x0, 0x0, 0x30 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gSoulStealBlueFistSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0x10, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 createsprite gSoulStealBlueStarSpriteTemplate, ANIM_TARGET, 4, 0x0, ANIM_TARGET, 0x12, 0x0, 0x0, 0x2c playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gSoulStealBlueFistSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0x08, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 createsprite gSoulStealBlueStarSpriteTemplate, ANIM_TARGET, 4, 0xffeb, 0xfff8, 0x2, 0x0, 0x0, 0x28 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET createsprite gSoulStealBlueFistSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0x12, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 createsprite gSoulStealBlueStarSpriteTemplate, ANIM_TARGET, 4, 0xfffb, 0xfff4, 0x2, 0x0, 0x0, 0x24 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET createsprite gSoulStealBlueFistSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0x15, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 createsprite gSoulStealBlueStarSpriteTemplate, ANIM_TARGET, 4, 0x5, 0xfff8, 0x2, 0x0, 0x0, 0x20 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET createsprite gSoulStealBlueFistSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0x0c, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 createsprite gSoulStealBlueStarSpriteTemplate, ANIM_TARGET, 4, 0xfff0, 0x1, 0x2, 0x0, 0x0, 0x1c playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET createsprite gSoulStealBlueFistSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0x13, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 createsprite gSoulStealBlueStarSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x1, 0x2, 0x0, 0x0, 0x18 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET createsprite gSoulStealBlueFistSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0x0e, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 createsprite gSoulStealBlueStarSpriteTemplate, ANIM_TARGET, 4, 0xfff0, 0x10, 0x2, 0x0, 0x0, 0x14 createsprite gSoulStealBlueFistSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0x12, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 createsprite gSoulStealBlueStarSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x10, 0x2, 0x0, 0x0, 0x10 - delay 0x4 + delay 4 playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gSoulStealBlackFlySpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x150 - delay 0x20 + delay 32 unloadspritegfx ANIM_TAG_PAIN_SPLIT unloadspritegfx ANIM_TAG_ROUND_SHADOW unloadspritegfx ANIM_TAG_HANDS_AND_FEET @@ -34857,9 +37769,9 @@ gBattleAnimMove_SoulStealing7StarStrike:: playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER setarg 0x7 0x0 @;Clear arg 7 so task works properly in Link battles createvisualtask AnimTask_SnatchOpposingMonMove, 0x2 - delay 0x1c - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x0, 0x0, 0x10, 0x0000 - delay 0x1 + delay 28 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0, 0, 16, RGB_BLACK + delay 1 createsprite gSoulStealZStarSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1, 0x24 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createsprite gWillOWispFireSpriteTemplate, ANIM_TARGET, 2, 0x0 @@ -34873,72 +37785,71 @@ gBattleAnimMove_SoulStealing7StarStrike:: call SoulStealingSevenStarStrikeBlueParalysis waitforvisualfinish visible ANIM_ATTACKER - unloadspritegfx ANIM_TAG_ROUND_SHADOW loadspritegfx ANIM_TAG_SPARKLE_4 @ detect loadspritegfx ANIM_TAG_EXPLOSION @ explosion playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gTargetTwinkleSpriteTemplate, ANIM_TARGET, 13, 0x0, 0x0, ANIM_TARGET @detect star - delay 0xa + delay 10 createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 8, 32 call SoulStealingSevenStarStrikeExplosion call SoulStealingSevenStarStrikeExplosion - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 0x2, 0x0, 0x10, 0x0 @everything to black + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 2, 0, 16, RGB_BLACK @everything to black call SoulStealingSevenStarStrikeExplosion waitforvisualfinish blendoff restorebg - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x2, 0x10, 0x0, 0x0 @everything from black + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 2, 16, 0, RGB_BLACK @everything from black waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BATTLERS_2, 0x2, 0x0, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BATTLERS_2, 2, 0, 0, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_AllBattlersVisible, 0xA waitforvisualfinish end SoulStealingSevenStarStrikeBuffEffect: createsprite gSoulStealIceBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gSoulStealIceBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gSoulStealIceBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gSoulStealIceBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gSoulStealIceBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return SoulStealingSevenStarStrikeBlueParalysis: playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET createsprite gSoulStealBlueParalyzeSpriteTemplate, ANIM_TARGET, 2, 0x5, 0x0, 0x5, 0x0 - delay 0x2 + delay 2 createsprite gSoulStealBlueParalyzeSpriteTemplate, ANIM_TARGET, 2, 0xfffb, 0xa, 0x5, 0x1 - delay 0x2 + delay 2 createsprite gSoulStealBlueParalyzeSpriteTemplate, ANIM_TARGET, 2, 0xf, 0x14, 0x5, 0x2 - delay 0x2 + delay 2 createsprite gSoulStealBlueParalyzeSpriteTemplate, ANIM_TARGET, 2, 0xfff1, 0xfff6, 0x5, 0x0 - delay 0x2 + delay 2 createsprite gSoulStealBlueParalyzeSpriteTemplate, ANIM_TARGET, 2, 0x19, 0x0, 0x5, 0x1 - delay 0x2 + delay 2 createsprite gSoulStealBlueParalyzeSpriteTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x5, 0x2 - delay 0x2 + delay 2 createsprite gSoulStealBlueParalyzeSpriteTemplate, ANIM_TARGET, 2, 0x2, 0xfff8, 0x5, 0x0 - delay 0x2 + delay 2 createsprite gSoulStealBlueParalyzeSpriteTemplate, ANIM_TARGET, 2, 0xffec, 0xf, 0x5, 0x1 return SoulStealingSevenStarStrikeExplosion: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSoulStealExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSoulStealExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSoulStealExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSoulStealExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSoulStealExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 return @@@@@@@@@@ MAX MOVES @@@@@@@@@@ @@ -35114,7 +38025,7 @@ gBattleAnimMove_GMaxGoldRush:: @@@ DYNAMAX AND MAX RAIDS gBattleAnimGeneral_DynamaxGrowth:: @ PORTED FROM CFRU - createvisualtask SoundTask_PlayCryWithEcho, 2, ANIM_ATTACKER, 2 + createvisualtask SoundTask_PlayDynamaxCry, 0 delay 8 createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x0 waitforvisualfinish diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 2b9f5e36e447..6a3e29d17fc9 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -14,26 +14,15 @@ #include "constants/game_stat.h" #include "constants/trainers.h" #include "constants/species.h" +#include "constants/generational_changes.h" .include "asm/macros.inc" .include "asm/macros/battle_script.inc" .include "constants/constants.inc" .section script_data, "aw", %progbits -BattleScript_DamageToQuarterTargetHP:: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - typecalc - clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE - damagetoquartertargethp - goto BattleScript_HitFromAtkAnimation - BattleScript_EffectFickleBeam:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE ficklebeamdamagecalculation goto BattleScript_HitFromCritCalc @@ -75,17 +64,13 @@ BattleScript_LowerAtkSpAtk:: jumpifstat BS_EFFECT_BATTLER, CMP_GREATER_THAN, STAT_ATK, MIN_STAT_STAGE, BattleScript_LowerAtkSpAtkDoAnim jumpifstat BS_EFFECT_BATTLER, CMP_EQUAL, STAT_SPATK, MIN_STAT_STAGE, BattleScript_LowerAtkSpAtkEnd BattleScript_LowerAtkSpAtkDoAnim:: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_EFFECT_BATTLER, BIT_ATK | BIT_SPATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_ATK, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_LowerAtkSpAtkTrySpAtk - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_LowerAtkSpAtkTrySpAtk + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_LowerAtkSpAtkTrySpAtk, BIT_SPATK printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_LowerAtkSpAtkTrySpAtk:: setstatchanger STAT_SPATK, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_LowerAtkSpAtkEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_LowerAtkSpAtkEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_LowerAtkSpAtkEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_LowerAtkSpAtkEnd: @@ -94,35 +79,24 @@ BattleScript_LowerAtkSpAtkEnd: BattleScript_EffectSpicyExtract:: attackcanceler jumpifsubstituteblocks BattleScript_ButItFailed - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE BattleScript_SpicyExtract_CheckShouldSkipAttackAnim + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_SpicyExtract_CheckShouldSkipAttackAnim jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_DEF, MIN_STAT_STAGE, BattleScript_SpicyExtract_CheckShouldSkipAttackAnim goto BattleScript_ButItFailed BattleScript_SpicyExtract_CheckShouldSkipAttackAnim: jumpifbyte CMP_NOT_EQUAL, gBattleCommunication, 0, BattleScript_SpicyExtract_RaiseAtk - attackstring - ppreduce - bicword gHitMarker, HITMARKER_NO_ATTACKSTRING | HITMARKER_NO_PPDEDUCT goto BattleScript_SpicyExtract_SkipAttackAnim BattleScript_SpicyExtract_RaiseAtk: - attackstring - ppreduce attackanimation waitanimation BattleScript_SpicyExtract_SkipAttackAnim: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectSpicyExtractDefenseDown - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectSpicyExtractDefenseDown + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectSpicyExtractDefenseDown printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectSpicyExtractDefenseDown: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_TARGET, BIT_DEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO setstatchanger STAT_DEF, 2, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectSpicyExtract_End - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_EffectSpicyExtract_End + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectSpicyExtract_End printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectSpicyExtract_End: @@ -130,9 +104,7 @@ BattleScript_EffectSpicyExtract_End: BattleScript_EffectTidyUp:: attackcanceler - attackstring pause B_WAIT_TIME_MED - ppreduce waitstate saveattacker savetarget @@ -151,31 +123,27 @@ BattleScript_EffectTidyUpDoMoveAnimation:: restoretarget goto BattleScript_EffectDragonDanceFromStatUp -BattleScript_EffectUpperHand:: - attackcanceler - tryupperhand BattleScript_FailedFromAtkString - goto BattleScript_HitFromAccCheck - BattleScript_EffectShedTail:: attackcanceler - attackstring - ppreduce waitstate - jumpifstatus2 BS_ATTACKER, STATUS2_SUBSTITUTE, BattleScript_AlreadyHasSubstitute + jumpifvolatile BS_ATTACKER, VOLATILE_SUBSTITUTE, BattleScript_AlreadyHasSubstitute jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_ButItFailed jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_ButItFailed setsubstitute jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_SUBSTITUTE_FAILED, BattleScript_SubstituteString - orword gHitMarker, HITMARKER_PASSIVE_DAMAGE attackanimation waitanimation - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_SHEDITSTAIL waitmessage B_WAIT_TIME_LONG moveendto MOVEEND_ATTACKER_VISIBLE moveendfrom MOVEEND_TARGET_VISIBLE - goto BattleScript_MoveSwitchOpenPartyScreen + call BattleScript_MoveSwitchOpenPartyScreenReturnWithNoAnim + switchinanim BS_ATTACKER, FALSE, TRUE + waitstate + switchineffects BS_ATTACKER + end BattleScript_EffectPsychicNoise:: printstring STRINGID_PKMNPREVENTEDFROMHEALING @@ -184,68 +152,62 @@ BattleScript_EffectPsychicNoise:: BattleScript_EffectFilletAway:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_FilletAwayTryAttack jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_FilletAwayTryAttack jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_ButItFailed BattleScript_FilletAwayTryAttack:: halvehp BattleScript_ButItFailed - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPATK | BIT_SPEED, STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_FilletAwayTrySpAtk + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_FilletAwayTrySpAtk, BIT_SPATK | BIT_SPEED printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_FilletAwayTrySpAtk:: setstatchanger STAT_SPATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_FilletAwayTrySpeed + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_FilletAwayTrySpeed, BIT_SPEED printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_FilletAwayTrySpeed:: setstatchanger STAT_SPEED, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_FilletAwayEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_FilletAwayEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_FilletAwayEnd:: clearmoveresultflags MOVE_RESULT_NO_EFFECT - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE goto BattleScript_MoveEnd BattleScript_EffectDoodle:: attackcanceler - attackstring - ppreduce trycopyability BS_ATTACKER, BattleScript_ButItFailed + saveattacker attackanimation waitanimation setbyte gBattleCommunication, 0 goto BattleScript_EffectDoodle_AfterCopy BattleScript_EffectDoodle_CopyAbility: - trycopyability BS_ATTACKER, BattleScript_MoveEnd + trycopyability BS_ATTACKER, BattleScript_EffectDoodleMoveEnd BattleScript_EffectDoodle_AfterCopy: -.if B_ABILITY_POP_UP == TRUE copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUpOverwriteThenNormal -.endif recordability BS_ATTACKER printstring STRINGID_PKMNCOPIEDFOE waitmessage B_WAIT_TIME_LONG switchinabilities BS_ATTACKER - jumpifbyte CMP_NOT_EQUAL, gBattleCommunication, 0x0, BattleScript_MoveEnd + jumpifbyte CMP_NOT_EQUAL, gBattleCommunication, 0x0, BattleScript_EffectDoodleMoveEnd addbyte gBattleCommunication, 1 - jumpifnoally BS_ATTACKER, BattleScript_MoveEnd + jumpifnoally BS_ATTACKER, BattleScript_EffectDoodleMoveEnd setallytonextattacker BattleScript_EffectDoodle_CopyAbility +BattleScript_EffectDoodleMoveEnd: + restoreattacker goto BattleScript_MoveEnd BattleScript_EffectGlaiveRush:: call BattleScript_EffectHit_Ret jumpifmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_TryFaintMon - setglaiverush + setvolatile BS_ATTACKER, VOLATILE_GLAIVE_RUSH, 2 goto BattleScript_TryFaintMon BattleScript_SyrupBombActivates:: @@ -257,7 +219,7 @@ BattleScript_SyrupBombEndTurn:: flushtextbox playanimation BS_ATTACKER, B_ANIM_SYRUP_BOMB_SPEED_DROP setstatchanger STAT_SPEED, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_SyrupBombTurnDmgEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_CHECK_PREVENTION | STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_SyrupBombTurnDmgEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_SyrupBombTurnDmgEnd: @@ -267,7 +229,6 @@ BattleScript_EffectChillyReception:: printstring STRINGID_PKMNTELLCHILLINGRECEPTIONJOKE waitmessage B_WAIT_TIME_LONG attackcanceler - ppreduce jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_SUN_PRIMAL, BattleScript_EffectChillyReceptionBlockedByPrimalSun jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_RAIN_PRIMAL, BattleScript_EffectChillyReceptionBlockedByPrimalRain jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_STRONG_WINDS, BattleScript_EffectChillyReceptionBlockedByStrongWinds @@ -280,7 +241,6 @@ BattleScript_EffectChillyReception:: call BattleScript_MoveWeatherChangeRet goto BattleScript_MoveSwitch BattleScript_EffectChillyReceptionPlayAnimation: - attackstring attackanimation waitanimation return @@ -297,8 +257,8 @@ BattleScript_EffectChillyReceptionBlockedByStrongWinds: call BattleScript_MysteriousAirCurrentBlowsOnRet goto BattleScript_MoveSwitch BattleScript_EffectChillyReceptionTrySwitchWeatherFailed: - jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_FailedFromAtkString - jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_FailedFromAtkString + jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_ButItFailed + jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_ButItFailed call BattleScript_EffectChillyReceptionPlayAnimation return @@ -326,11 +286,19 @@ BattleScript_MoveSwitch: printstring STRINGID_PKMNWENTBACK waitmessage B_WAIT_TIME_SHORT BattleScript_MoveSwitchOpenPartyScreen:: + call BattleScript_MoveSwitchOpenPartyScreenReturnWithNoAnim + switchinanim BS_ATTACKER, FALSE, FALSE + waitstate + switchineffects BS_ATTACKER +BattleScript_MoveSwitchEnd: + end + +BattleScript_MoveSwitchOpenPartyScreenReturnWithNoAnim: openpartyscreen BS_ATTACKER, BattleScript_MoveSwitchEnd - switchoutabilities BS_ATTACKER waitstate - switchhandleorder BS_ATTACKER, 2 returntoball BS_ATTACKER, FALSE + switchoutabilities BS_ATTACKER + switchhandleorder BS_ATTACKER, 2 getswitchedmondata BS_ATTACKER switchindataupdate BS_ATTACKER hpthresholds BS_ATTACKER @@ -338,18 +306,12 @@ BattleScript_MoveSwitchOpenPartyScreen:: printstring STRINGID_EMPTYSTRING3 waitmessage 1 printstring STRINGID_SWITCHINMON - switchinanim BS_ATTACKER, FALSE, TRUE - waitstate - switchineffects BS_ATTACKER -BattleScript_MoveSwitchEnd: - end + return BattleScript_EffectPledge:: attackcanceler setpledge BattleScript_HitFromAccCheck - attackstring pause B_WAIT_TIME_MED - ppreduce printstring STRINGID_WAITINGFORPARTNERSMOVE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -420,23 +382,17 @@ BattleScript_MoveEffectSaltCure:: BattleScript_SaltCureExtraDamage:: playanimation BS_ATTACKER, B_ANIM_SALT_CURE_DAMAGE, NULL waitanimation - call BattleScript_HurtTarget_NoString + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_TARGETISHURTBYSALTCURE waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER + tryactivateitem BS_ATTACKER, ACTIVATION_ON_HP_THRESHOLD end2 -BattleScript_HurtTarget_NoString: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - return - BattleScript_EffectCorrosiveGas:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifsubstituteblocks BattleScript_CorrosiveGasFail jumpifcantloseitem BS_TARGET, BattleScript_CorrosiveGasFail attackanimation @@ -457,8 +413,6 @@ BattleScript_CorrosiveGasFail: BattleScript_EffectTakeHeart:: attackcanceler - attackstring - ppreduce curestatuswithmove BattleScript_CalmMindTryToRaiseStats attackanimation waitanimation @@ -471,8 +425,6 @@ BattleScript_EffectTakeHeart:: BattleScript_EffectRevivalBlessing:: attackcanceler - attackstring - ppreduce tryrevivalblessing BattleScript_ButItFailed attackanimation waitanimation @@ -505,19 +457,13 @@ BattleScript_SpikesActivates:: BattleScript_EffectAttackUpUserAlly:: jumpifnoally BS_ATTACKER, BattleScript_EffectAttackUp attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_NOT_EQUAL, STAT_ATK, MAX_STAT_STAGE, BattleScript_EffectAttackUpUserAlly_Works jumpifstat BS_ATTACKER_PARTNER, CMP_EQUAL, STAT_ATK, MAX_STAT_STAGE, BattleScript_ButItFailed BattleScript_EffectAttackUpUserAlly_Works: attackanimation waitanimation setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectAttackUpUserAlly_TryAlly - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectAttackUpUserAllyUser_PrintString - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 -BattleScript_EffectAttackUpUserAllyUser_PrintString: + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectAttackUpUserAlly_TryAlly printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectAttackUpUserAlly_TryAlly: @@ -527,15 +473,13 @@ BattleScript_EffectAttackUpUserAlly_End: BattleScript_EffectAttackUpUserAlly_TryAlly_: jumpifblockedbysoundproof BS_ATTACKER_PARTNER, BattleScript_EffectAttackUpUserAlly_TryAllyBlocked setstatchanger STAT_ATK, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectAttackUpUserAlly_End - jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectAttackUpUserAlly_AllyAnim + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectAttackUpUserAlly_End + jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectAttackUpUserAlly_AllyString pause B_WAIT_TIME_SHORTEST printstring STRINGID_TARGETSTATWONTGOHIGHER waitmessage B_WAIT_TIME_LONG goto BattleScript_EffectAttackUpUserAlly_End -BattleScript_EffectAttackUpUserAlly_AllyAnim: - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 +BattleScript_EffectAttackUpUserAlly_AllyString: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_EffectAttackUpUserAlly_End @@ -549,8 +493,6 @@ BattleScript_EffectAttackUpUserAlly_TryAllyBlocked: BattleScript_EffectTeatime:: attackcanceler - attackstring - ppreduce jumpifteanoberry BattleScript_ButItFailed @ at least one battler is affected attackanimation @@ -561,10 +503,8 @@ BattleScript_TeatimeLoop: jumpifelectricabilityaffected BS_TARGET, ABILITY_VOLT_ABSORB, BattleScript_Teatimesorb jumpifelectricabilityaffected BS_TARGET, ABILITY_MOTOR_DRIVE, BattleScript_Teatimemotor jumpifteainvulnerable BS_TARGET, BattleScript_Teatimevul @ in semi-invulnerable state OR held item is not a Berry - orword gHitMarker, HITMARKER_DISABLE_ANIMATION | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE setbyte sBERRY_OVERRIDE, TRUE @ override the requirements for eating berries consumeberry BS_TARGET, TRUE @ consume the berry, then restore the item from changedItems - bicword gHitMarker, HITMARKER_DISABLE_ANIMATION | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE setbyte sBERRY_OVERRIDE, FALSE removeitem BS_TARGET moveendto MOVEEND_NEXT_TARGET @@ -578,9 +518,9 @@ BattleScript_Teatimevul: goto BattleScript_MoveEnd BattleScript_Teatimesorb: call BattleScript_AbilityPopUpTarget - tryhealquarterhealth BS_TARGET BattleScript_Teatimesorb_end - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + tryhealquarterhealth BS_TARGET, BattleScript_Teatimesorb_end + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG BattleScript_Teatimesorb_end: @@ -590,9 +530,8 @@ BattleScript_Teatimesorb_end: goto BattleScript_MoveEnd BattleScript_Teatimerod: call BattleScript_AbilityPopUpTarget - playstatchangeanimation BS_TARGET, BIT_SPATK, STAT_CHANGE_BY_TWO setstatchanger STAT_SPATK, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_TeatimeBuffer printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -602,9 +541,8 @@ BattleScript_Teatimerod: goto BattleScript_MoveEnd BattleScript_Teatimemotor: call BattleScript_AbilityPopUpTarget - playstatchangeanimation BS_TARGET, BIT_SPEED, STAT_CHANGE_BY_TWO setstatchanger STAT_SPEED, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_TeatimeBuffer printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -651,7 +589,7 @@ BattleScript_AffectionBasedStatus_HealFrostbiteString: printstring STRINGID_ATTACKERHEALEDITSFROSTBITE BattleScript_AffectionBasedStatusHeal_Continue: waitmessage B_WAIT_TIME_LONG - clearstatus BS_ATTACKER + clearstatus waitstate updatestatusicon BS_ATTACKER waitstate @@ -667,17 +605,13 @@ BattleScript_ShellTrapSetUp:: BattleScript_EffectShellTrap:: attackcanceler jumpifshelltrap BS_ATTACKER, BattleScript_HitFromAccCheck - jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING | HITMARKER_NO_PPDEDUCT, BattleScript_MoveEnd - ppreduce printstring STRINGID_SHELLTRAPDIDNTWORK waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectCourtChange:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE swapsidestatuses attackanimation waitanimation @@ -686,7 +620,6 @@ BattleScript_EffectCourtChange:: goto BattleScript_MoveEnd BattleScript_BeakBlastSetUp:: - setbeakblast flushtextbox playanimation BS_ATTACKER, B_ANIM_BEAK_BLAST_SETUP, NULL printstring STRINGID_HEATUPBEAK @@ -701,13 +634,11 @@ BattleScript_BeakBlastBurn:: BattleScript_EffectSkyDrop:: attackcanceler - jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_SkyDropTurn2 - ppreduce - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring + jumpifvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS, BattleScript_SkyDropTurn2 + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifsubstituteblocks BattleScript_ButItFailed jumpiftargetally BattleScript_ButItFailed - jumpifunder200 BS_TARGET, BattleScript_SkyDropWork + jumpifunder200 BattleScript_SkyDropWork pause B_WAIT_TIME_SHORT printstring STRINGID_TARGETTOOHEAVY waitmessage B_WAIT_TIME_LONG @@ -719,7 +650,6 @@ BattleScript_SkyDropWork: goto BattleScript_MoveEnd BattleScript_SkyDropTurn2: call BattleScript_TwoTurnMovesSecondTurnRet - attackstring clearskydrop BattleScript_SkyDropChangedTarget jumpiftype BS_TARGET, TYPE_FLYING, BattleScript_SkyDropFlyingType goto BattleScript_HitFromCritCalc @@ -728,8 +658,8 @@ BattleScript_SkyDropFlyingType: printstring STRINGID_ITDOESNTAFFECT waitmessage B_WAIT_TIME_LONG makevisible BS_ATTACKER - jumpifstatus2 BS_TARGET, STATUS2_CONFUSION, BattleScript_SkyDropFlyingAlreadyConfused - jumpifstatus2 BS_TARGET, STATUS2_LOCK_CONFUSE, BattleScript_SkyDropFlyingConfuseLock + jumpifvolatile BS_TARGET, VOLATILE_CONFUSION, BattleScript_SkyDropFlyingAlreadyConfused + jumpifvolatile BS_TARGET, VOLATILE_LOCK_CONFUSE, BattleScript_SkyDropFlyingConfuseLock goto BattleScript_MoveEnd BattleScript_SkyDropChangedTarget: pause B_WAIT_TIME_SHORT @@ -740,23 +670,20 @@ BattleScript_SkyDropChangedTarget: goto BattleScript_MoveEnd BattleScript_SkyDropFlyingConfuseLock: - seteffectprimary MOVE_EFFECT_CONFUSION + seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_CONFUSION BattleScript_SkyDropFlyingAlreadyConfused: - clearstatusfromeffect BS_TARGET, MOVE_EFFECT_THRASH - jumpifstatus2 BS_TARGET, STATUS2_CONFUSION, BattleScript_MoveEnd + clearvolatile BS_TARGET, VOLATILE_LOCK_CONFUSE + jumpifvolatile BS_TARGET, VOLATILE_CONFUSION, BattleScript_MoveEnd setbyte BS_ATTACKER, BS_TARGET goto BattleScript_ThrashConfuses BattleScript_EffectFling:: attackcanceler - jumpifcantfling BS_ATTACKER, BattleScript_FailedFromAtkString setlastuseditem BS_ATTACKER accuracycheck BattleScript_FlingMissed, ACC_CURR_MOVE - attackstring pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNFLUNG waitmessage B_WAIT_TIME_SHORT - ppreduce critcalc damagecalc adjustdamage @@ -766,31 +693,25 @@ BattleScript_EffectFling:: effectivenesssound hitanimation BS_TARGET waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE + datahpupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE critmessage waitmessage B_WAIT_TIME_MED resultmessage waitmessage B_WAIT_TIME_MED jumpiflastuseditemberry BattleScript_EffectFlingConsumeBerry - jumpifability BS_TARGET, ABILITY_SHIELD_DUST, BattleScript_FlingBlockedByShieldDust - jumpiflastuseditemholdeffect HOLD_EFFECT_FLAME_ORB, 0, BattleScript_FlingFlameOrb - jumpiflastuseditemholdeffect HOLD_EFFECT_FLINCH, 0, BattleScript_FlingFlinch - jumpiflastuseditemholdeffect HOLD_EFFECT_LIGHT_BALL, 0, BattleScript_FlingLightBall - jumpiflastuseditemholdeffect HOLD_EFFECT_MENTAL_HERB, 0, BattleScript_FlingMentalHerb - jumpiflastuseditemholdeffect HOLD_EFFECT_TYPE_POWER, TYPE_POISON, BattleScript_FlingPoisonBarb - jumpiflastuseditemholdeffect HOLD_EFFECT_TOXIC_ORB, 0, BattleScript_FlingToxicOrb - jumpiflastuseditemholdeffect HOLD_EFFECT_WHITE_HERB, 0, BattleScript_FlingWhiteHerb + tryflingholdeffect goto BattleScript_FlingEnd + BattleScript_EffectFlingConsumeBerry: - savebattleritem BS_TARGET - battleritemtolastuseditem BS_TARGET + savebattleritem + battleritemtolastuseditem setbyte sBERRY_OVERRIDE, 1 @ override the requirements for eating berries orword gHitMarker, HITMARKER_DISABLE_ANIMATION - consumeberry BS_TARGET, TRUE + consumeberry BS_TARGET, FALSE bicword gHitMarker, HITMARKER_DISABLE_ANIMATION setbyte sBERRY_OVERRIDE, 0 - restorebattleritem BS_TARGET + restorebattleritem BattleScript_FlingEnd: tryfaintmon BS_TARGET trysymbiosis BS_ATTACKER @@ -798,77 +719,32 @@ BattleScript_FlingEnd: BattleScript_FlingFailConsumeItem:: removeitem BS_ATTACKER - goto BattleScript_FailedFromAtkString + goto BattleScript_ButItFailed BattleScript_FlingBlockedByShieldDust:: printstring STRINGID_ITEMWASUSEDUP waitmessage B_WAIT_TIME_LONG goto BattleScript_FlingEnd -BattleScript_FlingFlameOrb: - seteffectsecondary MOVE_EFFECT_BURN - goto BattleScript_FlingEnd -BattleScript_FlingFlinch: - seteffectsecondary MOVE_EFFECT_FLINCH - goto BattleScript_FlingEnd -BattleScript_FlingLightBall: - seteffectsecondary MOVE_EFFECT_PARALYSIS - goto BattleScript_FlingEnd -BattleScript_FlingMentalHerb: - curecertainstatuses BS_TARGET - savetarget - copybyte gBattlerAttacker, gBattlerTarget - playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL - printfromtable gMentalHerbCureStringIds - waitmessage B_WAIT_TIME_LONG - updatestatusicon BS_ATTACKER - restoretarget - goto BattleScript_FlingEnd -BattleScript_FlingPoisonBarb: - seteffectsecondary MOVE_EFFECT_POISON - goto BattleScript_FlingEnd -BattleScript_FlingToxicOrb: - seteffectsecondary MOVE_EFFECT_TOXIC - goto BattleScript_FlingEnd -BattleScript_FlingWhiteHerb: - tryresetnegativestatstages BS_TARGET - swapattackerwithtarget - printstring STRINGID_PKMNSTATUSNORMAL - waitmessage B_WAIT_TIME_MED - swapattackerwithtarget - goto BattleScript_FlingEnd - BattleScript_FlingMissed: removeitem BS_ATTACKER - attackstring - ppreduce goto BattleScript_MoveMissedPause -BattleScript_EffectAuraWheel:: @ Aura Wheel can only be used by Morpeko - jumpifspecies BS_ATTACKER, SPECIES_MORPEKO_FULL_BELLY, BattleScript_EffectHit - jumpifspecies BS_ATTACKER, SPECIES_MORPEKO_HANGRY, BattleScript_EffectHit - goto BattleScript_PokemonCantUseTheMove - BattleScript_EffectClangorousSoul:: attackcanceler - attackstring - ppreduce - cutonethirdhpraisestats BattleScript_ButItFailed - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_BIDE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_IGNORE_DISGUISE + cutonethirdhpandraisestats BattleScript_ButItFailed attackanimation waitanimation - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE call BattleScript_AllStatsUp goto BattleScript_MoveEnd BattleScript_EffectOctolock:: attackcanceler - jumpifsubstituteblocks BattleScript_FailedFromAtkString - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - trysetoctolock BS_TARGET, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + trysetoctolock BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_CANTESCAPEBECAUSEOFCURRENTMOVE @@ -876,14 +752,13 @@ BattleScript_EffectOctolock:: goto BattleScript_MoveEnd BattleScript_OctolockEndTurn:: - playstatchangeanimation BS_TARGET, BIT_DEF | BIT_SPDEF, STAT_CHANGE_NEGATIVE setstatchanger STAT_DEF, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_OctolockTryLowerSpDef + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_OctolockTryLowerSpDef, BIT_SPDEF printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_OctolockTryLowerSpDef: setstatchanger STAT_SPDEF, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_OctlockTurnDmgEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_OctlockTurnDmgEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_OctlockTurnDmgEnd: @@ -891,27 +766,21 @@ BattleScript_OctlockTurnDmgEnd: BattleScript_EffectPoltergeist:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - checkpoltergeist BS_TARGET, BattleScript_ButItFailed + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + setpoltergeistmessage BattleScript_ButItFailed printstring STRINGID_ABOUTTOUSEPOLTERGEIST waitmessage B_WAIT_TIME_LONG goto BattleScript_HitFromCritCalc BattleScript_EffectTarShot:: attackcanceler - jumpifsubstituteblocks BattleScript_FailedFromAtkString - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - cantarshotwork BattleScript_FailedFromAtkString - attackstring - ppreduce + jumpifsubstituteblocks BattleScript_ButItFailed + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + cantarshotwork BattleScript_ButItFailed setstatchanger STAT_SPEED, 1, TRUE attackanimation waitanimation - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TryTarShot - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_TryTarShot printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_TryTarShot: @@ -922,15 +791,14 @@ BattleScript_TryTarShot: BattleScript_EffectNoRetreat:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - trynoretreat BS_TARGET, BattleScript_ButItFailed + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + jumpifvolatile BS_TARGET, VOLATILE_NO_RETREAT, BattleScript_ButItFailed + setvolatile BS_TARGET, VOLATILE_NO_RETREAT attackanimation waitanimation call BattleScript_AllStatsUp - jumpifstatus2 BS_TARGET, STATUS2_ESCAPE_PREVENTION, BattleScript_MoveEnd - seteffectprimary MOVE_EFFECT_PREVENT_ESCAPE | MOVE_EFFECT_AFFECTS_USER + jumpifvolatile BS_TARGET, VOLATILE_ESCAPE_PREVENTION, BattleScript_MoveEnd + seteffectprimary BS_TARGET, BS_TARGET, MOVE_EFFECT_PREVENT_ESCAPE printstring STRINGID_CANTESCAPEDUETOUSEDMOVE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -941,8 +809,8 @@ BattleScript_BothCanNoLongerEscape:: return BattleScript_EffectHyperspaceFury:: - jumpifspecies BS_ATTACKER, SPECIES_HOOPA_UNBOUND, BattleScript_EffectHit - jumpifspecies BS_ATTACKER, SPECIES_HOOPA_CONFINED, BattleScript_ButHoopaCantUseIt + jumpifspecies SPECIES_HOOPA_UNBOUND, BattleScript_EffectHit + jumpifspecies SPECIES_HOOPA_CONFINED, BattleScript_ButHoopaCantUseIt goto BattleScript_PokemonCantUseTheMove BattleScript_ButHoopaCantUseIt: @@ -982,9 +850,6 @@ BattleScript_MoveEffectLightScreen:: BattleScript_EffectStuffCheeks:: attackcanceler - attackstring - ppreduce - jumpifnotberry BS_ATTACKER, BattleScript_ButItFailed attackanimation waitanimation setbyte sBERRY_OVERRIDE, 1 @@ -994,10 +859,7 @@ BattleScript_EffectStuffCheeks:: setbyte sBERRY_OVERRIDE, 0 removeitem BS_ATTACKER setstatchanger STAT_DEF, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_StuffCheeksEnd - setgraphicalstatchangevalues - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StuffCheeksEnd @ cant raise def - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_StuffCheeksEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_StuffCheeksEnd: @@ -1005,25 +867,21 @@ BattleScript_StuffCheeksEnd: BattleScript_EffectDecorate:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_ATK, 12, BattleScript_DecorateBoost - jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_SPATK, 12, BattleScript_DecorateBoost + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_ATK, MAX_STAT_STAGE, BattleScript_DecorateBoost + jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_SPATK, MAX_STAT_STAGE, BattleScript_DecorateBoost goto BattleScript_ButItFailed BattleScript_DecorateBoost: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, 0x0 setstatchanger STAT_ATK, 2, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_DecorateBoostSpAtk + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_DecorateBoostSpAtk, BIT_SPATK jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_DecorateBoostSpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DecorateBoostSpAtk: setstatchanger STAT_SPATK, 2, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoveEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoveEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_MoveEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -1031,8 +889,6 @@ BattleScript_DecorateBoostSpAtk: BattleScript_EffectCoaching:: attackcanceler - attackstring - ppreduce jumpifnoally BS_ATTACKER, BattleScript_ButItFailed copybyte gBattlerTarget, gBattlerAttacker setallytonexttarget EffectCoaching_CheckAllyStats @@ -1045,16 +901,14 @@ EffectCoaching_CheckAllyStats: BattleScript_CoachingWorks: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_DEF, 0x0 setstatchanger STAT_ATK, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_CoachingBoostDef + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_CoachingBoostDef, BIT_DEF jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_CoachingBoostDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CoachingBoostDef: setstatchanger STAT_DEF, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoveEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoveEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_MoveEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -1062,9 +916,7 @@ BattleScript_CoachingBoostDef: BattleScript_EffectJungleHealing:: attackcanceler - attackstring - ppreduce - jumpifteamhealthy BS_ATTACKER, BattleScript_ButItFailed + jumpifteamhealthy BattleScript_ButItFailed attackanimation waitanimation copybyte gBattlerTarget, gBattlerAttacker @@ -1072,13 +924,11 @@ BattleScript_EffectJungleHealing:: JungleHealing_RestoreTargetHealth: copybyte gBattlerAttacker, gBattlerTarget tryhealquarterhealth BS_TARGET, BattleScript_JungleHealing_TryCureStatus - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG BattleScript_JungleHealing_TryCureStatus: - jumpifmove MOVE_LIFE_DEW, BattleScript_JungleHealingTryRestoreAlly @ life dew only heals jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_JungleHealingCureStatus goto BattleScript_JungleHealingTryRestoreAlly BattleScript_JungleHealingCureStatus: @@ -1093,18 +943,39 @@ BattleScript_JungleHealingTryRestoreAlly: setallytonexttarget JungleHealing_RestoreTargetHealth goto BattleScript_MoveEnd -BattleScript_EffectRelicSong:: - call BattleScript_EffectHit_Ret - tryfaintmon BS_TARGET - moveendall - tryrelicsong - end +BattleScript_EffectLifeDew:: + attackcanceler + jumpiffullhp BS_ATTACKER, BattleScript_EffectLifeDewCheckPartner + copybyte gBattlerTarget, gBattlerAttacker + attackanimation + waitanimation + call BattleScript_EffectLifeDewHealing + jumpifabsent BS_ATTACKER_PARTNER, BattleScript_EffectLifeDewEnd + jumpiffullhp BS_ATTACKER_PARTNER, BattleScript_EffectLifeDewEnd + setallytonexttarget BattleScript_EffectLifeDewNextTarget +BattleScript_EffectLifeDewNextTarget: + call BattleScript_EffectLifeDewHealing +BattleScript_EffectLifeDewEnd: + goto BattleScript_MoveEnd + +BattleScript_EffectLifeDewCheckPartner: + jumpifabsent BS_ATTACKER_PARTNER, BattleScript_ButItFailed + jumpiffullhp BS_ATTACKER_PARTNER, BattleScript_ButItFailed + attackanimation + waitanimation + setallytonexttarget BattleScript_EffectLifeDewNextTarget + +BattleScript_EffectLifeDewHealing: + tryhealquarterhealth BS_TARGET, BattleScript_EffectLifeDewEnd + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE + printstring STRINGID_PKMNREGAINEDHEALTH + waitmessage B_WAIT_TIME_LONG + return BattleScript_EffectAllySwitch:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE tryallyswitch BattleScript_ButItFailed attackanimation waitanimation @@ -1116,9 +987,7 @@ BattleScript_EffectAllySwitch:: BattleScript_EffectFairyLock:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE trysetfairylock BattleScript_ButItFailed attackanimation waitanimation @@ -1126,14 +995,6 @@ BattleScript_EffectFairyLock:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_FailIfNotArgType:: - attackcanceler - attackstring - ppreduce - jumpifnotcurrentmoveargtype BS_ATTACKER, BattleScript_ButItFailed - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - goto BattleScript_HitFromCritCalc - BattleScript_RemoveFireType:: printstring STRINGID_ATTACKERLOSTFIRETYPE waitmessage B_WAIT_TIME_LONG @@ -1156,8 +1017,6 @@ BattleScript_DefDown_Ret: BattleScript_EffectPurify:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_PurifyWorks goto BattleScript_ButItFailed @@ -1168,45 +1027,41 @@ BattleScript_PurifyWorks: updatestatusicon BS_TARGET printstring STRINGID_ATTACKERCUREDTARGETSTATUS waitmessage B_WAIT_TIME_LONG - tryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_ATTACKER + tryhealhalfhealth BS_ATTACKER, BattleScript_AlreadyAtFullHp goto BattleScript_RestoreHp BattleScript_EffectStrengthSap:: setstatchanger STAT_ATK, 1, TRUE attackcanceler - jumpifsubstituteblocks BattleScript_FailedFromAtkString - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + jumpifsubstituteblocks BattleScript_ButItFailed + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_ATK, MIN_STAT_STAGE, BattleScript_StrengthSapTryLower pause B_WAIT_TIME_SHORT - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_MoveEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_MoveEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG + setmoveresultflags MOVE_RESULT_MISSED @ TODO: Is this even necessary? goto BattleScript_MoveEnd BattleScript_StrengthSapTryLower: - getstatvalue BS_TARGET, STAT_ATK + getstatvalue STAT_ATK jumpiffullhp BS_ATTACKER, BattleScript_StrengthSapMustLower +BattleScript_StrengthSapAnimation: attackanimation waitanimation - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_StrengthSapHp - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_StrengthSapHp -BattleScript_StrengthSapLower: - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_StrengthSapHp + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGE_EMPTY, BattleScript_StrengthSapHp printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG @ Drain HP without lowering a stat BattleScript_StrengthSapHp: jumpifability BS_TARGET, ABILITY_LIQUID_OOZE, BattleScript_StrengthSapManipulateDmg - jumpifstatus3 BS_ATTACKER, STATUS3_HEAL_BLOCK, BattleScript_MoveEnd + jumpifvolatile BS_ATTACKER, VOLATILE_HEAL_BLOCK, BattleScript_MoveEnd jumpiffullhp BS_ATTACKER, BattleScript_MoveEnd BattleScript_StrengthSapManipulateDmg: manipulatedamage DMG_BIG_ROOT - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE jumpifability BS_TARGET, ABILITY_LIQUID_OOZE, BattleScript_StrengthSapLiquidOoze - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_PKMNENERGYDRAINED waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -1214,18 +1069,16 @@ BattleScript_StrengthSapLiquidOoze: call BattleScript_AbilityPopUpTarget manipulatedamage DMG_CHANGE_SIGN setbyte cMULTISTRING_CHOOSER, B_MSG_ABSORB_OOZE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printfromtable gAbsorbDrainStringIds waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER goto BattleScript_MoveEnd BattleScript_StrengthSapMustLower: - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_MoveEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_MoveEnd - attackanimation - waitanimation - goto BattleScript_StrengthSapLower + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_MoveEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGE_EMPTY, BattleScript_MoveEnd + goto BattleScript_StrengthSapAnimation BattleScript_MoveEffectIncinerate:: printstring STRINGID_INCINERATEBURN @@ -1257,9 +1110,7 @@ BattleScript_CoreEnforcerRet: BattleScript_EffectLaserFocus:: attackcanceler - attackstring - ppreduce - setuserstatus3 STATUS3_LASER_FOCUS, BattleScript_ButItFailed + trysetvolatile BS_ATTACKER, VOLATILE_LASER_FOCUS, BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_LASERFOCUS @@ -1271,23 +1122,21 @@ BattleScript_VCreateStatLoss:: jumpifstat BS_ATTACKER, CMP_GREATER_THAN, STAT_SPDEF, MIN_STAT_STAGE, BattleScript_VCreateStatAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, MIN_STAT_STAGE, BattleScript_VCreateStatLossRet BattleScript_VCreateStatAnim: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF | BIT_SPEED, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT setstatchanger STAT_DEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateTrySpDef - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateTrySpDef + statbuffchange BS_ATTACKER, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_CERTAIN, BattleScript_VCreateTrySpDef, BIT_SPDEF | BIT_SPEED + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_VCreateTrySpDef printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VCreateTrySpDef: setstatchanger STAT_SPDEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateTrySpeed - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateTrySpeed + statbuffchange BS_ATTACKER, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_CERTAIN, BattleScript_VCreateTrySpeed, BIT_SPEED + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_VCreateTrySpeed printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VCreateTrySpeed: setstatchanger STAT_SPEED, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateStatLossRet - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateStatLossRet + statbuffchange BS_ATTACKER, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_CERTAIN, BattleScript_VCreateStatLossRet + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_VCreateStatLossRet printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VCreateStatLossRet: @@ -1295,22 +1144,19 @@ BattleScript_VCreateStatLossRet: BattleScript_SpectralThiefSteal:: setbyte sB_ANIM_TURN, 1 - playmoveanimation BS_ATTACKER, MOVE_SPECTRAL_THIEF + playmoveanimation MOVE_SPECTRAL_THIEF waitanimation setbyte sB_ANIM_TURN, 0 printstring STRINGID_SPECTRALTHIEFSTEAL waitmessage B_WAIT_TIME_LONG setbyte sB_ANIM_ARG2, 0 - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 spectralthiefprintstats flushtextbox goto BattleScript_EffectSpectralThiefFromDamage BattleScript_EffectSpectralThief:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE typecalc tryspectralthiefsteal BattleScript_SpectralThiefSteal BattleScript_EffectSpectralThiefFromDamage: @@ -1324,25 +1170,19 @@ BattleScript_EffectSpectralThiefFromDamage: BattleScript_EffectPartingShot:: attackcanceler - attackstring - ppreduce jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_ATK, MIN_STAT_STAGE, BattleScript_EffectPartingShotTryAtk jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPATK, MIN_STAT_STAGE, BattleScript_CantLowerMultipleStats BattleScript_EffectPartingShotTryAtk: - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_ATK, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectPartingShotTrySpAtk + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectPartingShotTrySpAtk, BIT_SPATK printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectPartingShotTrySpAtk: - playstatchangeanimation BS_TARGET, BIT_SPATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_SPATK, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectPartingShotSwitch + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectPartingShotSwitch printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectPartingShotSwitch: @@ -1351,11 +1191,9 @@ BattleScript_EffectPartingShotSwitch: BattleScript_EffectPowder:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, NO_ACC_CALC_CHECK_LOCK_ON - attackstring - ppreduce - jumpifstatus2 BS_TARGET, STATUS2_POWDER, BattleScript_ButItFailed - setpowder BS_TARGET + accuracycheck BattleScript_MoveMissedPause, NO_ACC_CALC_CHECK_LOCK_ON + jumpifvolatile BS_TARGET, VOLATILE_POWDER, BattleScript_ButItFailed + setvolatile BS_TARGET, VOLATILE_POWDER attackanimation waitanimation printstring STRINGID_COVEREDINPOWDER @@ -1364,33 +1202,28 @@ BattleScript_EffectPowder:: BattleScript_EffectAromaticMist:: attackcanceler - attackstring - ppreduce jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_ButItFailed jumpiftargetally BattleScript_EffectAromaticMistWorks goto BattleScript_ButItFailed BattleScript_EffectAromaticMistWorks: setstatchanger STAT_SPDEF, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectAromaticMistEnd - jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AromaticMistAnim - pause B_WAIT_TIME_SHORTEST - printstring STRINGID_TARGETSTATWONTGOHIGHER - waitmessage B_WAIT_TIME_LONG - goto BattleScript_EffectAromaticMistEnd -BattleScript_AromaticMistAnim: + statbuffchange BS_TARGET, STAT_CHANGE_ONLY_CHECKING, BattleScript_EffectAromaticMistWontGoHigher attackanimation waitanimation - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectAromaticMistEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectAromaticMistEnd: goto BattleScript_MoveEnd +BattleScript_EffectAromaticMistWontGoHigher: + pause B_WAIT_TIME_SHORTEST + printstring STRINGID_TARGETSTATWONTGOHIGHER + waitmessage B_WAIT_TIME_LONG + setmoveresultflags MOVE_RESULT_MISSED @ TODO: Is this even necessary? + goto BattleScript_EffectAromaticMistEnd BattleScript_EffectMagneticFlux:: attackcanceler - attackstring - ppreduce setbyte gBattleCommunication, 0 BattleScript_EffectMagneticFluxStart: jumpifability BS_TARGET, ABILITY_MINUS, BattleScript_EffectMagneticFluxCheckStats @@ -1404,18 +1237,16 @@ BattleScript_EffectMagneticFluxTryDef: attackanimation waitanimation BattleScript_EffectMagneticFluxSkipAnim: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_TARGET, BIT_DEF | BIT_SPDEF, 0 setstatchanger STAT_DEF, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMagneticFluxTrySpDef - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectMagneticFluxTrySpDef + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMagneticFluxTrySpDef, BIT_SPDEF + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectMagneticFluxTrySpDef addbyte gBattleCommunication, 1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectMagneticFluxTrySpDef: setstatchanger STAT_SPDEF, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMagneticFluxLoop - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectMagneticFluxLoop + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMagneticFluxLoop + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectMagneticFluxLoop addbyte gBattleCommunication, 1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -1428,8 +1259,6 @@ BattleScript_EffectMagneticFluxEnd: BattleScript_EffectGearUp:: attackcanceler - attackstring - ppreduce setbyte gBattleCommunication, 0 BattleScript_EffectGearUpStart: jumpifability BS_TARGET, ABILITY_MINUS, BattleScript_EffectGearUpCheckStats @@ -1443,18 +1272,16 @@ BattleScript_EffectGearUpTryAtk: attackanimation waitanimation BattleScript_EffectGearUpSkipAnim: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, 0 setstatchanger STAT_ATK, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectGearUpTrySpAtk - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectGearUpTrySpAtk + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectGearUpTrySpAtk, BIT_SPATK + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectGearUpTrySpAtk addbyte gBattleCommunication, 1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectGearUpTrySpAtk: setstatchanger STAT_SPATK, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectGearUpLoop - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectGearUpLoop + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectGearUpLoop + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectGearUpLoop addbyte gBattleCommunication, 1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -1468,16 +1295,12 @@ BattleScript_EffectGearUpEnd: BattleScript_EffectAcupressure:: attackcanceler jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_EffectAcupressureTry - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_PrintMoveMissed + jumpifvolatile BS_TARGET, VOLATILE_SUBSTITUTE, BattleScript_MoveMissedPause BattleScript_EffectAcupressureTry: - attackstring - ppreduce - tryaccupressure BS_TARGET, BattleScript_ButItFailed + tryacupressure BattleScript_ButItFailed attackanimation waitanimation - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 - statbuffchange MOVE_EFFECT_CERTAIN, BattleScript_MoveEnd + statbuffchange BS_TARGET, STAT_CHANGE_CERTAIN, BattleScript_MoveEnd printstring STRINGID_DEFENDERSSTATROSE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -1489,10 +1312,8 @@ BattleScript_MoveEffectFeint:: BattleScript_EffectThirdType:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - trysetthirdtype BS_TARGET, BattleScript_ButItFailed + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + trythirdtype BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_THIRDTYPEADDED @@ -1501,32 +1322,32 @@ BattleScript_EffectThirdType:: BattleScript_EffectFlowerShield:: attackcanceler - attackstring - ppreduce savetarget selectfirstvalidtarget -BattleScript_FlowerShieldIsAnyGrass: +BattleScript_FlowerShieldIsAnyValidTarget: + jumpifvolatile BS_TARGET, VOLATILE_SEMI_INVULNERABLE, BattleScript_FlowerShieldCheckNextTarget jumpiftype BS_TARGET, TYPE_GRASS, BattleScript_FlowerShieldLoopStart - jumpifnexttargetvalid BattleScript_FlowerShieldIsAnyGrass +BattleScript_FlowerShieldCheckNextTarget: + jumpifnexttargetvalid BattleScript_FlowerShieldIsAnyValidTarget goto BattleScript_RestoreTargetButItFailed BattleScript_FlowerShieldLoopStart: selectfirstvalidtarget BattleScript_FlowerShieldLoop: movevaluescleanup + jumpifvolatile BS_TARGET, VOLATILE_SEMI_INVULNERABLE, BattleScript_FlowerShieldMoveTargetEnd jumpiftype BS_TARGET, TYPE_GRASS, BattleScript_FlowerShieldLoop2 goto BattleScript_FlowerShieldMoveTargetEnd BattleScript_FlowerShieldLoop2: setstatchanger STAT_DEF, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_FlowerShieldMoveTargetEnd - jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_FlowerShieldDoAnim - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_EMPTY, BattleScript_FlowerShieldMoveTargetEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_FlowerShieldMoveTargetEnd + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_FlowerShieldDoAnim + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGE_EMPTY, BattleScript_FlowerShieldMoveTargetEnd pause 21 goto BattleScript_FlowerShieldString BattleScript_FlowerShieldDoAnim: attackanimation waitanimation - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_FlowerShieldMoveTargetEnd BattleScript_FlowerShieldString: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -1534,12 +1355,11 @@ BattleScript_FlowerShieldMoveTargetEnd: moveendto MOVEEND_NEXT_TARGET jumpifnexttargetvalid BattleScript_FlowerShieldLoop restoretarget + moveendfrom MOVEEND_ITEM_EFFECTS_ATTACKER_1 end BattleScript_EffectRototiller:: attackcanceler - attackstring - ppreduce getrototillertargets BattleScript_ButItFailed @ at least one battler is affected attackanimation @@ -1551,18 +1371,16 @@ BattleScript_RototillerLoop: jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_RototillerCheckAffected jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPATK, MAX_STAT_STAGE, BattleScript_RototillerCantRaiseMultipleStats BattleScript_RototillerCheckAffected: - jumpifnotrototilleraffected BS_TARGET, BattleScript_RototillerNoEffect - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, 0 + jumpifnotrototilleraffected BattleScript_RototillerNoEffect setstatchanger STAT_ATK, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_RototillerTrySpAtk - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_RototillerTrySpAtk + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_RototillerTrySpAtk, BIT_SPATK + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_RototillerTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_RototillerTrySpAtk:: setstatchanger STAT_SPATK, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_RototillerMoveTargetEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_RototillerMoveTargetEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_RototillerMoveTargetEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_RototillerMoveTargetEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_RototillerMoveTargetEnd: @@ -1586,23 +1404,20 @@ BattleScript_RototillerNoEffect: BattleScript_EffectBestow:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, NO_ACC_CALC_CHECK_LOCK_ON - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, NO_ACC_CALC_CHECK_LOCK_ON jumpifsubstituteblocks BattleScript_ButItFailed trybestow BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_BESTOWITEMGIVING waitmessage B_WAIT_TIME_LONG + tryactivateitem BS_TARGET, ACTIVATION_ON_USABLE_AGAIN trysymbiosis BS_ATTACKER goto BattleScript_MoveEnd BattleScript_EffectAfterYou:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE tryafteryou BattleScript_ButItFailed attackanimation waitanimation @@ -1611,25 +1426,17 @@ BattleScript_EffectAfterYou:: goto BattleScript_MoveEnd BattleScript_MoveEffectFlameBurst:: - tryfaintmon BS_TARGET - copybyte sBATTLER, sSAVED_BATTLER printstring STRINGID_BURSTINGFLAMESHIT waitmessage B_WAIT_TIME_LONG - savetarget - copybyte gBattlerTarget, sSAVED_BATTLER - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - tryfaintmon BS_TARGET - restoretarget - goto BattleScript_MoveEnd + healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + tryfaintmon BS_SCRIPTING + return BattleScript_EffectPowerTrick:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - powertrick BS_ATTACKER + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + powertrick attackanimation waitanimation printstring STRINGID_PKMNSWITCHEDATKANDDEF @@ -1638,9 +1445,7 @@ BattleScript_EffectPowerTrick:: BattleScript_EffectPsychoShift:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifstatus BS_ATTACKER, STATUS1_ANY, BattleScript_EffectPsychoShiftCanWork goto BattleScript_ButItFailed BattleScript_EffectPsychoShiftCanWork: @@ -1662,43 +1467,19 @@ BattleScript_EffectPsychoShiftCanWork: BattleScript_EffectSynchronoise:: attackcanceler - attackstring - ppreduce - selectfirstvalidtarget -BattleScript_SynchronoiseLoop: - movevaluescleanup - jumpifcantusesynchronoise BattleScript_SynchronoiseNoEffect - accuracycheck BattleScript_SynchronoiseMissed, ACC_CURR_MOVE - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG + pause B_WAIT_TIME_MED + trysynchronoise BattleScript_MoveEnd + accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE + goto BattleScript_HitFromCritCalc + +BattleScript_ItDoesntAffectFoe:: + savetarget + copybyte gBattlerTarget, sBATTLER + printstring STRINGID_ITDOESNTAFFECT + waitmessage B_WAIT_TIME_SHORT flushtextbox - tryfaintmon BS_TARGET -BattleScript_SynchronoiseMoveTargetEnd: - moveendto MOVEEND_NEXT_TARGET - jumpifnexttargetvalid BattleScript_SynchronoiseLoop - end -BattleScript_SynchronoiseMissed: - pause B_WAIT_TIME_SHORT - resultmessage - waitmessage B_WAIT_TIME_LONG - goto BattleScript_SynchronoiseMoveTargetEnd -BattleScript_SynchronoiseNoEffect: - pause B_WAIT_TIME_SHORT - printstring STRINGID_NOEFFECTONTARGET - waitmessage B_WAIT_TIME_LONG - goto BattleScript_SynchronoiseMoveTargetEnd + restoretarget + return BattleScript_MoveEffectSmackDown:: printstring STRINGID_FELLSTRAIGHTDOWN @@ -1712,28 +1493,33 @@ BattleScript_EffectHitEnemyHealAlly:: BattleScript_EffectDefog:: setstatchanger STAT_EVASION, 1, TRUE attackcanceler + jumpifgenconfiglowerthan CONFIG_DEFOG_EFFECT_CLEARING, GEN_5, BattleScript_DefogAfterSubstituteCheck jumpifsubstituteblocks BattleScript_DefogIfCanClearHazards +BattleScript_DefogAfterSubstituteCheck: jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_EVASION, MIN_STAT_STAGE, BattleScript_DefogWorks BattleScript_DefogIfCanClearHazards: - trydefog FALSE, BattleScript_FailedFromAtkString + trydefog FALSE, BattleScript_ButItFailed BattleScript_DefogWorks: - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_DefogTryHazardsWithAnim - jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_DefogDoAnim - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_DefogTryHazardsWithAnim - pause B_WAIT_TIME_SHORT + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + jumpifgenconfiglowerthan CONFIG_DEFOG_EFFECT_CLEARING, GEN_5, BattleScript_DefogWorksAfterSubstituteCheck + jumpifsubstituteblocks BattleScript_DefogTryHazardsWithAnim +BattleScript_DefogWorksAfterSubstituteCheck: + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_DefogTryHazardsWithAnim + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_DefogDoAnim + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGE_EMPTY, BattleScript_DefogTryHazardsWithAnim + pause B_WAIT_TIME_SHORT + setmoveresultflags MOVE_RESULT_MISSED @ TODO: Is this even necessary? goto BattleScript_DefogPrintString BattleScript_DefogDoAnim:: attackanimation waitanimation - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + call BattleScript_SwapFromSubstitute + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_DefogTryHazards + call BattleScript_SwapToSubstitute BattleScript_DefogPrintString:: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG -BattleScript_DefogTryHazards:: +BattleScript_DefogTryHazards: copybyte gEffectBattler, gBattlerAttacker trydefog TRUE, NULL copybyte gBattlerAttacker, gEffectBattler @@ -1743,23 +1529,15 @@ BattleScript_DefogTryHazardsWithAnim: waitanimation goto BattleScript_DefogTryHazards -BattleScript_EffectCopycat:: - attackcanceler - attackstring - pause 5 - trycopycat BattleScript_CopycatFail - attackanimation - waitanimation - jumptocalledmove TRUE -BattleScript_CopycatFail: - ppreduce - goto BattleScript_ButItFailed +BattleScript_MoveEffectDefog:: + saveattacker + trydefog TRUE, NULL + restoreattacker + return BattleScript_EffectInstruct:: attackcanceler - attackstring - ppreduce - pause 5 + pause B_WAIT_TIME_SHORT tryinstruct BattleScript_ButItFailed attackanimation waitanimation @@ -1772,54 +1550,30 @@ BattleScript_EffectInstruct:: BattleScript_EffectAutotomize:: setstatchanger STAT_SPEED, 2, FALSE attackcanceler - attackstring - ppreduce - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AutotomizeWeightLoss - jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AutotomizeAttackAnim + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_AutotomizeWeightLoss + jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_AutotomizeAttackAnim pause B_WAIT_TIME_SHORT goto BattleScript_AutotomizePrintString BattleScript_AutotomizeAttackAnim:: attackanimation waitanimation - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AutotomizeWeightLoss BattleScript_AutotomizePrintString:: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AutotomizeWeightLoss:: jumpifmovehadnoeffect BattleScript_MoveEnd - tryautotomize BS_ATTACKER, BattleScript_MoveEnd + tryautotomize BattleScript_MoveEnd printstring STRINGID_BECAMENIMBLE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectFinalGambit:: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - critcalc - typecalc - clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE - dmgtocurrattackerhp - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - resultmessage - waitmessage B_WAIT_TIME_LONG - setadditionaleffects - tryfaintmon BS_TARGET - jumpifmovehadnoeffect BattleScript_MoveEnd +BattleScript_FinalGambit:: setatkhptozero - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE tryfaintmon BS_ATTACKER - goto BattleScript_MoveEnd + return BattleScript_TryHitSwitchTarget:: forcerandomswitch BattleScript_HitSwitchTargetForceRandomSwitchFailed @@ -1835,34 +1589,28 @@ BattleScript_HitSwitchTargetForceRandomSwitchFailed: BattleScript_EffectToxicThread:: setstatchanger STAT_SPEED, 1, TRUE attackcanceler - jumpifsubstituteblocks BattleScript_FailedFromAtkString - jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_SPEED, MIN_STAT_STAGE, BattleScript_ToxicThreadWorks - jumpifstatus BS_TARGET, STATUS1_PSN_ANY, BattleScript_FailedFromAtkString -BattleScript_ToxicThreadWorks: - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_ToxicThreadTryPsn - jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_ToxicThreadDoAnim - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_ToxicThreadTryPsn + jumpifsubstituteblocks BattleScript_ButItFailed + checknonvolatiletrigger MOVE_EFFECT_POISON, BattleScript_EffectStatDownFromAccCheck + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + attackanimation + waitanimation + setstatchanger STAT_SPEED, 1, TRUE + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_ToxicThreadTryPsn + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_ToxicThreadDoAnim + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGE_EMPTY, BattleScript_ToxicThreadTryPsn pause B_WAIT_TIME_SHORT goto BattleScript_ToxicThreadPrintString BattleScript_ToxicThreadDoAnim:: - attackanimation - waitanimation - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_ToxicThreadTryPsn BattleScript_ToxicThreadPrintString:: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ToxicThreadTryPsn:: - seteffectprimary MOVE_EFFECT_POISON + seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_POISON goto BattleScript_MoveEnd BattleScript_EffectVenomDrench:: attackcanceler - attackstring - ppreduce jumpifstatus BS_TARGET, STATUS1_PSN_ANY, BattleScript_EffectVenomDrenchCanBeUsed goto BattleScript_ButItFailed BattleScript_EffectVenomDrenchCanBeUsed: @@ -1873,26 +1621,21 @@ BattleScript_VenomDrenchDoMoveAnim:: accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK | BIT_SPEED, STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_ATK, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_VenomDrenchTryLowerSpAtk - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VenomDrenchTryLowerSpAtk + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_VenomDrenchTryLowerSpAtk, BIT_SPATK | BIT_SPEED + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_VenomDrenchTryLowerSpAtk printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VenomDrenchTryLowerSpAtk:: - playstatchangeanimation BS_TARGET, BIT_SPATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_SPATK, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_VenomDrenchTryLowerSpeed - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VenomDrenchTryLowerSpeed + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_VenomDrenchTryLowerSpeed, BIT_SPEED + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_VenomDrenchTryLowerSpeed printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VenomDrenchTryLowerSpeed:: - playstatchangeanimation BS_TARGET, BIT_SPEED, STAT_CHANGE_NEGATIVE setstatchanger STAT_SPEED, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_VenomDrenchEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VenomDrenchEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_VenomDrenchEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_VenomDrenchEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VenomDrenchEnd:: @@ -1900,27 +1643,21 @@ BattleScript_VenomDrenchEnd:: BattleScript_EffectNobleRoar:: attackcanceler - attackstring - ppreduce jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_ATK, MIN_STAT_STAGE, BattleScript_NobleRoarDoMoveAnim jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPATK, MIN_STAT_STAGE, BattleScript_CantLowerMultipleStats BattleScript_NobleRoarDoMoveAnim:: accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_ATK, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_NobleRoarTryLowerSpAtk - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_NobleRoarTryLowerSpAtk + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_NobleRoarTryLowerSpAtk, BIT_SPATK + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_NobleRoarTryLowerSpAtk printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_NobleRoarTryLowerSpAtk:: - playstatchangeanimation BS_TARGET, BIT_SPATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_SPATK, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_NobleRoarEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_NobleRoarEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_NobleRoarEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_NobleRoarEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_NobleRoarEnd:: @@ -1928,8 +1665,6 @@ BattleScript_NobleRoarEnd:: BattleScript_EffectShellSmash:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_ShellSmashTryDef jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_ShellSmashTryDef jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPEED, MAX_STAT_STAGE, BattleScript_ShellSmashTryDef @@ -1938,80 +1673,64 @@ BattleScript_EffectShellSmash:: BattleScript_ShellSmashTryDef:: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT setstatchanger STAT_DEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | MOVE_EFFECT_CERTAIN, BattleScript_ShellSmashTrySpDef - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashTrySpDef + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_CERTAIN, BattleScript_ShellSmashTrySpDef, BIT_SPDEF + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_ShellSmashTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashTrySpDef: setstatchanger STAT_SPDEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | MOVE_EFFECT_CERTAIN, BattleScript_ShellSmashTryAttack - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashTryAttack + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_CERTAIN, BattleScript_ShellSmashTryAttack + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_ShellSmashTryAttack printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashTryAttack: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_ATK | BIT_SPEED, STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashTrySpAtk - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashTrySpAtk + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashTrySpAtk, BIT_SPATK | BIT_SPEED, + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_ShellSmashTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashTrySpAtk: setstatchanger STAT_SPATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashTrySpeed - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashTrySpeed + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashTrySpeed, BIT_SPEED + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_ShellSmashTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashTrySpeed: setstatchanger STAT_SPEED, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_ShellSmashEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashEnd: goto BattleScript_MoveEnd -BattleScript_EffectLastResort:: - attackcanceler - attackstring - ppreduce - jumpifcantuselastresort BS_ATTACKER, BattleScript_ButItFailed - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - goto BattleScript_HitFromCritCalc - BattleScript_EffectGrowth:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_GrowthDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPATK, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats BattleScript_GrowthDoMoveAnim:: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPATK, 0 - jumpifweatheraffected BS_ATTACKER, B_WEATHER_SUN, BattleScript_GrowthAtk2 + jumpifweatheraffected B_WEATHER_SUN, BattleScript_GrowthAtk2 setstatchanger STAT_ATK, 1, FALSE goto BattleScript_GrowthAtk BattleScript_GrowthAtk2: setstatchanger STAT_ATK, 2, FALSE BattleScript_GrowthAtk: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GrowthTrySpAtk - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_GrowthTrySpAtk + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_GrowthTrySpAtk, BIT_SPATK + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_GrowthTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GrowthTrySpAtk:: - jumpifweatheraffected BS_ATTACKER, B_WEATHER_SUN, BattleScript_GrowthSpAtk2 + jumpifweatheraffected B_WEATHER_SUN, BattleScript_GrowthSpAtk2 setstatchanger STAT_SPATK, 1, FALSE goto BattleScript_GrowthSpAtk BattleScript_GrowthSpAtk2: setstatchanger STAT_SPATK, 2, FALSE BattleScript_GrowthSpAtk: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GrowthEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_GrowthEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_GrowthEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_GrowthEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GrowthEnd: @@ -2019,9 +1738,7 @@ BattleScript_GrowthEnd: BattleScript_EffectSoak:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifability BS_TARGET, ABILITY_MULTITYPE, BattleScript_ButItFailed jumpifability BS_TARGET, ABILITY_RKS_SYSTEM, BattleScript_ButItFailed jumpifsubstituteblocks BattleScript_ButItFailed @@ -2034,9 +1751,7 @@ BattleScript_EffectSoak:: BattleScript_EffectReflectType:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE tryreflecttype BattleScript_ButItFailed attackanimation waitanimation @@ -2046,9 +1761,7 @@ BattleScript_EffectReflectType:: BattleScript_EffectElectrify:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE tryelectrify BattleScript_ButItFailed attackanimation waitanimation @@ -2058,30 +1771,25 @@ BattleScript_EffectElectrify:: BattleScript_EffectShiftGear:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPEED, MAX_STAT_STAGE, BattleScript_ShiftGearDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_ATK, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats BattleScript_ShiftGearDoMoveAnim: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE jumpifstat BS_ATTACKER, CMP_GREATER_THAN, STAT_SPEED, 10, BattleScript_ShiftGearSpeedBy1 - playstatchangeanimation BS_ATTACKER, BIT_SPEED | BIT_ATK, STAT_CHANGE_BY_TWO setstatchanger STAT_SPEED, 2, FALSE goto BattleScript_ShiftGearDoSpeed BattleScript_ShiftGearSpeedBy1: - playstatchangeanimation BS_ATTACKER, BIT_SPEED | BIT_ATK, 0 setstatchanger STAT_SPEED, 1, FALSE BattleScript_ShiftGearDoSpeed: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShiftGearTryAtk - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShiftGearTryAtk + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ShiftGearTryAtk, BIT_ATK + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_ShiftGearTryAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShiftGearTryAtk: setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShiftGearEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShiftGearEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ShiftGearEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_ShiftGearEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShiftGearEnd: @@ -2089,31 +1797,27 @@ BattleScript_ShiftGearEnd: BattleScript_EffectCoil:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_CoilDoMoveAnim jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_DEF, MAX_STAT_STAGE, BattleScript_CoilDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_ACC, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats BattleScript_CoilDoMoveAnim: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_ACC, 0 setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CoilTryDef - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CoilTryDef + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CoilTryDef, BIT_DEF | BIT_ACC + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CoilTryDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CoilTryDef: setstatchanger STAT_DEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CoilTryAcc - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CoilTryAcc + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CoilTryAcc, BIT_ACC + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CoilTryAcc printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CoilTryAcc: setstatchanger STAT_ACC, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CoilEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CoilEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CoilEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CoilEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CoilEnd: @@ -2121,31 +1825,27 @@ BattleScript_CoilEnd: BattleScript_EffectQuiverDance:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_QuiverDanceDoMoveAnim jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_QuiverDanceDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats BattleScript_QuiverDanceDoMoveAnim:: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_SPDEF | BIT_SPEED, 0 setstatchanger STAT_SPATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceTrySpDef - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_QuiverDanceTrySpDef + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceTrySpDef, BIT_SPDEF | BIT_SPEED + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_QuiverDanceTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_QuiverDanceTrySpDef:: setstatchanger STAT_SPDEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceTrySpeed - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_QuiverDanceTrySpeed + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceTrySpeed, BIT_SPEED + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_QuiverDanceTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_QuiverDanceTrySpeed:: setstatchanger STAT_SPEED, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_QuiverDanceEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_QuiverDanceEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_QuiverDanceEnd:: @@ -2153,64 +1853,48 @@ BattleScript_QuiverDanceEnd:: BattleScript_EffectVictoryDance:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_VictoryDanceDoMoveAnim jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_DEF, MAX_STAT_STAGE, BattleScript_VictoryDanceDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats BattleScript_VictoryDanceDoMoveAnim:: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_SPEED, 0 setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceTryDef - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VictoryDanceTryDef + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceTryDef, BIT_DEF | BIT_SPEED + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_VictoryDanceTryDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VictoryDanceTryDef:: setstatchanger STAT_DEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceTrySpeed - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VictoryDanceTrySpeed + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceTrySpeed, BIT_SPEED + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_VictoryDanceTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VictoryDanceTrySpeed:: setstatchanger STAT_SPEED, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VictoryDanceEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_VictoryDanceEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VictoryDanceEnd:: goto BattleScript_MoveEnd -BattleScript_EffectMeFirst:: - attackcanceler - attackstring - trymefirst BattleScript_FailedFromPpReduce - attackanimation - waitanimation - jumptocalledmove TRUE - BattleScript_EffectAttackSpAttackUp:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_AttackSpAttackUpDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPATK, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats BattleScript_AttackSpAttackUpDoMoveAnim:: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPATK, 0 setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AttackSpAttackUpTrySpAtk - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackSpAttackUpTrySpAtk + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AttackSpAttackUpTrySpAtk, BIT_SPATK + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_AttackSpAttackUpTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AttackSpAttackUpTrySpAtk:: setstatchanger STAT_SPATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AttackSpAttackUpEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackSpAttackUpEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AttackSpAttackUpEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_AttackSpAttackUpEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AttackSpAttackUpEnd: @@ -2218,24 +1902,20 @@ BattleScript_AttackSpAttackUpEnd: BattleScript_EffectAttackAccUp:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_AttackAccUpDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_ACC, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats BattleScript_AttackAccUpDoMoveAnim:: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_ACC, 0 setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AttackAccUpTryAcc - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackAccUpTryAcc + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AttackAccUpTryAcc, BIT_ACC + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_AttackAccUpTryAcc printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AttackAccUpTryAcc:: setstatchanger STAT_ACC, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AttackAccUpEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackAccUpEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AttackAccUpEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_AttackAccUpEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AttackAccUpEnd: @@ -2246,9 +1926,7 @@ BattleScript_EffectGrassyTerrain:: BattleScript_EffectElectricTerrain:: BattleScript_EffectPsychicTerrain:: attackcanceler - attackstring - ppreduce - setremoveterrain BattleScript_ButItFailed + setterrain BattleScript_ButItFailed attackanimation waitanimation printfromtable gTerrainStringIds @@ -2259,8 +1937,6 @@ BattleScript_EffectPsychicTerrain:: BattleScript_EffectTopsyTurvy:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_ATK, 6, BattleScript_EffectTopsyTurvyWorks jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_DEF, 6, BattleScript_EffectTopsyTurvyWorks @@ -2272,16 +1948,14 @@ BattleScript_EffectTopsyTurvy:: BattleScript_EffectTopsyTurvyWorks: attackanimation waitanimation - invertstatstages BS_TARGET + invertstatstages printstring STRINGID_TOPSYTURVYSWITCHEDSTATS waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectIonDeluge:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE orword gFieldStatuses, STATUS_FIELD_ION_DELUGE attackanimation waitanimation @@ -2291,9 +1965,7 @@ BattleScript_EffectIonDeluge:: BattleScript_EffectQuash:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE tryquash BattleScript_ButItFailed attackanimation waitanimation @@ -2303,66 +1975,37 @@ BattleScript_EffectQuash:: BattleScript_EffectHealPulse:: attackcanceler - attackstring - ppreduce - jumpifstatus3 BS_ATTACKER, STATUS3_HEAL_BLOCK, BattleScript_MoveUsedHealBlockPrevents @ stops pollen puff - jumpifstatus3 BS_TARGET, STATUS3_HEAL_BLOCK, BattleScript_MoveUsedHealBlockPrevents + jumpifvolatile BS_ATTACKER, VOLATILE_HEAL_BLOCK, BattleScript_MoveUsedHealBlockPrevents @ stops pollen puff + jumpifvolatile BS_TARGET, VOLATILE_HEAL_BLOCK, BattleScript_MoveUsedHealBlockPrevents accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifsubstituteblocks BattleScript_ButItFailed tryhealpulse BattleScript_AlreadyAtFullHp attackanimation waitanimation - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectEntrainment:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE tryentrainment BattleScript_ButItFailed attackanimation waitanimation - setlastusedability BS_TARGET + switchinabilities BS_TARGET printstring STRINGID_PKMNACQUIREDABILITY waitmessage B_WAIT_TIME_LONG - goto BattleScript_MoveEnd - -BattleScript_EffectSimpleBeam:: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - setabilitysimple BS_TARGET, BattleScript_ButItFailed - attackanimation - waitanimation -.if B_ABILITY_POP_UP == TRUE - copybyte gBattlerAbility, gBattlerTarget - call BattleScript_AbilityPopUpOverwriteThenNormal -.endif - recordability BS_TARGET - printstring STRINGID_PKMNACQUIREDSIMPLE - waitmessage B_WAIT_TIME_LONG trytoclearprimalweather tryrevertweatherform flushtextbox - tryendneutralizinggas BS_TARGET + tryendneutralizinggas goto BattleScript_MoveEnd -BattleScript_EffectSuckerPunch:: - attackcanceler - suckerpunchcheck BattleScript_FailedFromAtkString - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - goto BattleScript_HitFromAtkString - BattleScript_EffectLuckyChant:: attackcanceler - attackstring - ppreduce - setluckychant BS_ATTACKER, BattleScript_ButItFailed + setluckychant BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_SHIELDEDFROMCRITICALHITS @@ -2371,10 +2014,8 @@ BattleScript_EffectLuckyChant:: BattleScript_EffectMetalBurst:: attackcanceler - metalburstdamagecalculator BattleScript_FailedFromAtkString - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + metalburstdamagecalculator BattleScript_ButItFailed + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE typecalc clearmoveresultflags MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE adjustdamage @@ -2382,16 +2023,18 @@ BattleScript_EffectMetalBurst:: BattleScript_EffectHealingWish:: attackcanceler - jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_FailedFromAtkString - attackstring - ppreduce + jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_ButItFailed attackanimation waitanimation - instanthpdrop BS_ATTACKER + instanthpdrop setatkhptozero tryfaintmon BS_ATTACKER storehealingwish BS_ATTACKER -.if B_HEALING_WISH_SWITCH <= GEN_4 + jumpifgenconfiglowerthan CONFIG_HEALING_WISH_SWITCH, GEN_5, BattleScript_EffectHealingWishGen4 +BattleScript_EffectHealingWishEnd: + moveendall + end +BattleScript_EffectHealingWishGen4: openpartyscreen BS_ATTACKER, BattleScript_EffectHealingWishEnd waitstate switchhandleorder BS_ATTACKER, 2 @@ -2400,22 +2043,22 @@ BattleScript_EffectHealingWish:: switchindataupdate BS_ATTACKER hpthresholds BS_ATTACKER trytoclearprimalweather + tryrevertweatherform + flushtextbox + tryendneutralizinggas flushtextbox printstring STRINGID_SWITCHINMON switchinanim BS_ATTACKER, FALSE, TRUE waitstate switchineffects BS_ATTACKER -.endif -BattleScript_EffectHealingWishEnd: - moveendall - end + goto BattleScript_EffectHealingWishEnd BattleScript_HealingWishActivates:: setbyte cMULTISTRING_CHOOSER, 0 goto BattleScript_EffectHealingWishRestore BattleScript_LunarDanceActivates:: setbyte cMULTISTRING_CHOOSER, 1 - restorepp BS_ATTACKER + restoremovepp BattleScript_EffectHealingWishRestore: printfromtable gHealingWishStringIds waitmessage B_WAIT_TIME_LONG @@ -2423,9 +2066,9 @@ BattleScript_EffectHealingWishRestore: waitanimation dmgtomaxattackerhp manipulatedamage DMG_CHANGE_SIGN - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER - clearstatus BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE + clearstatus waitstate updatestatusicon BS_ATTACKER waitstate @@ -2433,31 +2076,25 @@ BattleScript_EffectHealingWishRestore: waitmessage B_WAIT_TIME_LONG return -BattleScript_EffectWorrySeed:: +BattleScript_EffectOverwriteAbility:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - tryworryseed BattleScript_ButItFailed + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + tryoverwriteability BattleScript_ButItFailed attackanimation waitanimation -.if B_ABILITY_POP_UP == TRUE copybyte gBattlerAbility, gBattlerTarget call BattleScript_AbilityPopUpOverwriteThenNormal -.endif recordability BS_TARGET printstring STRINGID_PKMNACQUIREDABILITY waitmessage B_WAIT_TIME_LONG trytoclearprimalweather tryrevertweatherform flushtextbox - tryendneutralizinggas BS_TARGET + tryendneutralizinggas goto BattleScript_MoveEnd BattleScript_EffectPowerSplit:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON averagestats STAT_ATK averagestats STAT_SPATK @@ -2469,8 +2106,6 @@ BattleScript_EffectPowerSplit:: BattleScript_EffectGuardSplit:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON averagestats STAT_DEF averagestats STAT_SPDEF @@ -2482,8 +2117,6 @@ BattleScript_EffectGuardSplit:: BattleScript_EffectHeartSwap:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON swapstatstages STAT_ATK swapstatstages STAT_DEF @@ -2500,8 +2133,6 @@ BattleScript_EffectHeartSwap:: BattleScript_EffectPowerSwap:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON swapstatstages STAT_ATK swapstatstages STAT_SPATK @@ -2513,8 +2144,6 @@ BattleScript_EffectPowerSwap:: BattleScript_EffectGuardSwap:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON swapstatstages STAT_DEF swapstatstages STAT_SPDEF @@ -2526,8 +2155,6 @@ BattleScript_EffectGuardSwap:: BattleScript_EffectSpeedSwap:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON swapstats STAT_SPEED attackanimation @@ -2538,9 +2165,7 @@ BattleScript_EffectSpeedSwap:: BattleScript_EffectTelekinesis:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, NO_ACC_CALC_CHECK_LOCK_ON - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, NO_ACC_CALC_CHECK_LOCK_ON settelekinesis BattleScript_ButItFailed attackanimation waitanimation @@ -2550,8 +2175,6 @@ BattleScript_EffectTelekinesis:: BattleScript_EffectStealthRock:: attackcanceler - attackstring - ppreduce setstealthrock BattleScript_ButItFailed attackanimation waitanimation @@ -2561,8 +2184,6 @@ BattleScript_EffectStealthRock:: BattleScript_EffectStickyWeb:: attackcanceler - attackstring - ppreduce setstickyweb BattleScript_ButItFailed attackanimation waitanimation @@ -2572,9 +2193,8 @@ BattleScript_EffectStickyWeb:: BattleScript_EffectGastroAcid:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + jumpifvolatile BS_TARGET, VOLATILE_GASTRO_ACID, BattleScript_ButItFailed setgastroacid BattleScript_ButItFailed attackanimation waitanimation @@ -2583,13 +2203,11 @@ BattleScript_EffectGastroAcid:: trytoclearprimalweather tryrevertweatherform flushtextbox - tryendneutralizinggas BS_TARGET + tryendneutralizinggas goto BattleScript_MoveEnd BattleScript_EffectToxicSpikes:: attackcanceler - attackstring - ppreduce settoxicspikes BattleScript_ButItFailed attackanimation waitanimation @@ -2599,9 +2217,9 @@ BattleScript_EffectToxicSpikes:: BattleScript_EffectMagnetRise:: attackcanceler - attackstring - ppreduce - setuserstatus3 STATUS3_MAGNET_RISE, BattleScript_ButItFailed + jumpifvolatile BS_ATTACKER, VOLATILE_ROOT, BattleScript_ButItFailed + jumpifvolatile BS_ATTACKER, VOLATILE_SMACK_DOWN, BattleScript_ButItFailed + trysetvolatile BS_ATTACKER, VOLATILE_MAGNET_RISE, BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNLEVITATEDONELECTROMAGNETISM @@ -2610,8 +2228,6 @@ BattleScript_EffectMagnetRise:: BattleScript_EffectTrickRoom:: attackcanceler - attackstring - ppreduce setroom attackanimation waitanimation @@ -2636,8 +2252,6 @@ BattleScript_RoomServiceLoop_NextBattler: BattleScript_EffectWonderRoom:: BattleScript_EffectMagicRoom:: attackcanceler - attackstring - ppreduce setroom attackanimation waitanimation @@ -2647,9 +2261,7 @@ BattleScript_EffectMagicRoom:: BattleScript_EffectAquaRing:: attackcanceler - attackstring - ppreduce - setuserstatus3 STATUS3_AQUA_RING, BattleScript_ButItFailed + setvolatile BS_ATTACKER, VOLATILE_AQUA_RING attackanimation waitanimation printstring STRINGID_PKMNSURROUNDEDWITHVEILOFWATER @@ -2658,9 +2270,7 @@ BattleScript_EffectAquaRing:: BattleScript_EffectEmbargo:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE setembargo BattleScript_ButItFailed attackanimation waitanimation @@ -2670,8 +2280,6 @@ BattleScript_EffectEmbargo:: BattleScript_EffectTailwind:: attackcanceler - attackstring - ppreduce settailwind BattleScript_ButItFailed attackanimation waitanimation @@ -2700,23 +2308,23 @@ BattleScript_TryTailwindAbilitiesLoop_WindRider: BattleScript_TryTailwindAbilitiesLoop_WindPower: call BattleScript_AbilityPopUp - setcharge BS_TARGET + setvolatile BS_TARGET, VOLATILE_CHARGE_TIMER, 2 printstring STRINGID_BEINGHITCHARGEDPKMNWITHPOWER waitmessage B_WAIT_TIME_LONG goto BattleScript_TryTailwindAbilitiesLoop_Increment BattleScript_EffectMiracleEye:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - setmiracleeye BattleScript_ButItFailed + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + setvolatile BS_TARGET, VOLATILE_MIRACLE_EYE goto BattleScript_IdentifiedFoe BattleScript_EffectGravity:: + call BattleScript_EffectGravityInternal + goto BattleScript_MoveEnd + +BattleScript_EffectGravityInternal: attackcanceler - attackstring - ppreduce setgravity BattleScript_ButItFailed attackanimation waitanimation @@ -2727,43 +2335,39 @@ BattleScript_EffectGravitySuccess:: selectfirstvalidtarget BattleScript_GravityLoop: movevaluescleanup - jumpifstatus3 BS_TARGET, STATUS3_ON_AIR | STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS, BattleScript_GravityLoopDrop + jumpfifsemiinvulnerable BS_TARGET, STATE_ON_AIR, BattleScript_GravityLoopDrop + jumpifvolatile BS_TARGET, VOLATILE_MAGNET_RISE, BattleScript_GravityLoopDrop + jumpifvolatile BS_TARGET, VOLATILE_TELEKINESIS, BattleScript_GravityLoopDrop goto BattleScript_GravityLoopEnd BattleScript_GravityLoopDrop: - bringdownairbornebattler BS_TARGET + gravityonairbornemons printstring STRINGID_GRAVITYGROUNDING waitmessage B_WAIT_TIME_LONG BattleScript_GravityLoopEnd: moveendcase MOVEEND_TARGET_VISIBLE jumpifnexttargetvalid BattleScript_GravityLoop restoretarget - goto BattleScript_MoveEnd + return BattleScript_EffectRoost:: attackcanceler - attackstring - ppreduce - tryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_TARGET + tryhealhalfhealth BS_TARGET, BattleScript_AlreadyAtFullHp setroost goto BattleScript_PresentHealTarget BattleScript_EffectCaptivate:: setstatchanger STAT_SPATK, 2, TRUE attackcanceler - attackstring - ppreduce jumpifsubstituteblocks BattleScript_ButItFailed jumpifcaptivateaffected BattleScript_CaptivateCheckAcc goto BattleScript_ButItFailed BattleScript_CaptivateCheckAcc: accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - goto BattleScript_StatDownFromAttackString + goto BattleScript_EffectStatDownFromStatBuffChange BattleScript_EffectHealBlock:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects sethealblock BattleScript_ButItFailed attackanimation @@ -2782,8 +2386,6 @@ BattleScript_HitEscapeSwitch: BattleScript_EffectPlaceholder:: attackcanceler - attackstring - ppreduce pause 5 printstring STRINGID_NOTDONEYET goto BattleScript_MoveEnd @@ -2791,10 +2393,7 @@ BattleScript_EffectPlaceholder:: BattleScript_EffectHit:: attackcanceler BattleScript_HitFromAccCheck:: - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE -BattleScript_HitFromAtkString:: - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE BattleScript_HitFromCritCalc:: critcalc damagecalc @@ -2810,9 +2409,7 @@ BattleScript_MoveEnd:: BattleScript_EffectHit_Ret:: attackcanceler BattleScript_EffectHit_RetFromAccCheck:: - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE BattleScript_EffectHit_RetFromCritCalc:: critcalc damagecalc @@ -2823,8 +2420,8 @@ BattleScript_Hit_RetFromAtkAnimation:: effectivenesssound hitanimation BS_TARGET waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE + datahpupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE critmessage waitmessage B_WAIT_TIME_LONG resultmessage @@ -2834,26 +2431,15 @@ BattleScript_Hit_RetFromAtkAnimation:: BattleScript_EffectNaturalGift:: attackcanceler - attackstring - ppreduce jumpifnotberry BS_ATTACKER, BattleScript_ButItFailed jumpifword CMP_COMMON_BITS, gFieldStatuses, STATUS_FIELD_MAGIC_ROOM, BattleScript_ButItFailed jumpifability BS_ATTACKER, ABILITY_KLUTZ, BattleScript_ButItFailed - jumpifstatus3 BS_ATTACKER, STATUS3_EMBARGO, BattleScript_ButItFailed + jumpifvolatile BS_ATTACKER, VOLATILE_EMBARGO, BattleScript_ButItFailed accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - call BattleScript_EffectHit_RetFromCritCalc - jumpifmovehadnoeffect BattleScript_EffectNaturalGiftEnd - checkparentalbondcounter 2, BattleScript_EffectNaturalGiftEnd - removeitem BS_ATTACKER -BattleScript_EffectNaturalGiftEnd: - tryfaintmon BS_TARGET - goto BattleScript_MoveEnd + call BattleScript_HitFromCritCalc BattleScript_MakeMoveMissed:: setmoveresultflags MOVE_RESULT_MISSED -BattleScript_PrintMoveMissed:: - attackstring - ppreduce BattleScript_MoveMissedPause:: pause B_WAIT_TIME_SHORT BattleScript_MoveMissed:: @@ -2862,18 +2448,19 @@ BattleScript_MoveMissed:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectDarkVoid:: -.if B_DARK_VOID_FAIL >= GEN_7 - jumpifspecies BS_ATTACKER, SPECIES_DARKRAI, BattleScript_EffectNonVolatileStatus - goto BattleScript_PokemonCantUseTheMove -.endif - BattleScript_TerrainPreventsEnd2:: pause B_WAIT_TIME_SHORT printfromtable gTerrainPreventsStringIds waitmessage B_WAIT_TIME_LONG end2 +BattleScript_ImmunityProtectedEnd2:: + call BattleScript_AbilityPopUp + pause B_WAIT_TIME_SHORT + printstring STRINGID_ITDOESNTAFFECT + waitmessage B_WAIT_TIME_LONG + end2 + BattleScript_ElectricTerrainPrevents:: pause B_WAIT_TIME_SHORT printstring STRINGID_ELECTRICTERRAINPREVENTS @@ -2924,14 +2511,6 @@ BattleScript_AromaVeilProtects: setmoveresultflags MOVE_RESULT_FAILED goto BattleScript_MoveEnd -BattleScript_PastelVeilProtects: - pause B_WAIT_TIME_SHORT - call BattleScript_AbilityPopUp - printstring STRINGID_PASTELVEILPROTECTED - waitmessage B_WAIT_TIME_LONG - setmoveresultflags MOVE_RESULT_FAILED - goto BattleScript_MoveEnd - BattleScript_AbilityProtectsDoesntAffectRet:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp @@ -2944,7 +2523,7 @@ BattleScript_AbilityProtectsDoesntAffect:: setmoveresultflags MOVE_RESULT_FAILED goto BattleScript_MoveEnd -BattleScript_InsomniaProtects: +BattleScript_InsomniaProtects:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp printstring STRINGID_PKMNSTAYEDAWAKEUSING @@ -2953,20 +2532,13 @@ BattleScript_InsomniaProtects: goto BattleScript_MoveEnd BattleScript_AlreadyAsleep:: - setalreadystatusedmoveattempt BS_ATTACKER + setalreadystatusedmoveattempt pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNALREADYASLEEP waitmessage B_WAIT_TIME_LONG setmoveresultflags MOVE_RESULT_FAILED goto BattleScript_MoveEnd -BattleScript_WasntAffected:: - pause B_WAIT_TIME_SHORT - printstring STRINGID_PKMNWASNTAFFECTED - waitmessage B_WAIT_TIME_LONG - setmoveresultflags MOVE_RESULT_FAILED - goto BattleScript_MoveEnd - BattleScript_CantMakeAsleep:: pause B_WAIT_TIME_SHORT printfromtable gUproarAwakeStringIds @@ -2976,26 +2548,25 @@ BattleScript_CantMakeAsleep:: BattleScript_EffectAbsorbLiquidOoze:: call BattleScript_AbilityPopUpTarget + jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_EffectAbsorbRet goto BattleScript_EffectAbsorb BattleScript_EffectAbsorb:: - absorbhealthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printfromtable gAbsorbDrainStringIds waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER - bicword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_PASSIVE_DAMAGE +BattleScript_EffectAbsorbRet: return BattleScript_EffectExplosion:: attackcanceler - attackstring - ppreduce tryexplosion setatkhptozero waitstate jumpiffainted BS_TARGET, TRUE, BattleScript_MoveEnd - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE goto BattleScript_HitFromCritCalc BattleScript_FaintAttackerForExplosion:: @@ -3003,63 +2574,19 @@ BattleScript_FaintAttackerForExplosion:: return BattleScript_MaxHp50Recoil:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE tryfaintmon BS_ATTACKER return BattleScript_EffectDreamEater:: attackcanceler - jumpifsubstituteblocks BattleScript_DreamEaterNoEffect - jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_DreamEaterWorked - jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_DreamEaterWorked -BattleScript_DreamEaterNoEffect: - attackstring - ppreduce - waitmessage B_WAIT_TIME_LONG - goto BattleScript_WasntAffected -BattleScript_DreamEaterWorked: - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG - jumpifstatus3 BS_ATTACKER, STATUS3_HEAL_BLOCK, BattleScript_DreamEaterTryFaintEnd - setdrainedhp - manipulatedamage DMG_BIG_ROOT - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER - jumpifmovehadnoeffect BattleScript_DreamEaterTryFaintEnd - printstring STRINGID_PKMNENERGYDRAINED - waitmessage B_WAIT_TIME_LONG -BattleScript_DreamEaterTryFaintEnd: - tryfaintmon BS_TARGET - goto BattleScript_MoveEnd - -BattleScript_EffectMirrorMove:: - attackcanceler - attackstring - pause B_WAIT_TIME_LONG - trymirrormove - ppreduce - setmoveresultflags MOVE_RESULT_FAILED - printstring STRINGID_MIRRORMOVEFAILED - waitmessage B_WAIT_TIME_LONG - goto BattleScript_MoveEnd +.if B_DREAM_EATER_SUBSTITUTE < GEN_5 + jumpifsubstituteblocks BattleScript_DoesntAffectTargetAtkString +.endif + jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_HitFromAccCheck + jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_HitFromAccCheck + goto BattleScript_DoesntAffectTargetAtkString BattleScript_EffectAttackUp:: setstatchanger STAT_ATK, 1, FALSE @@ -3090,18 +2617,16 @@ BattleScript_EffectEvasionUp:: BattleScript_EffectStatUp:: attackcanceler BattleScript_EffectStatUpAfterAtkCanceler:: - attackstring - ppreduce - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_StatUpEnd - jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StatUpAttackAnim + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_StatUpEnd + jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_StatUpAttackAnim pause B_WAIT_TIME_SHORT + setmoveresultflags MOVE_RESULT_MISSED @ TODO: Is this even necessary? goto BattleScript_StatUpPrintString BattleScript_StatUpAttackAnim:: attackanimation waitanimation BattleScript_StatUpDoAnim:: - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_StatUpEnd BattleScript_StatUpPrintString:: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -3109,8 +2634,6 @@ BattleScript_StatUpEnd:: goto BattleScript_MoveEnd BattleScript_StatUp:: - playanimation BS_EFFECT_BATTLER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 -BattleScript_StatUpMsg:: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG return @@ -3143,22 +2666,20 @@ BattleScript_EffectEvasionDown:: setstatchanger STAT_EVASION, 1, TRUE BattleScript_EffectStatDown: attackcanceler - jumpifsubstituteblocks BattleScript_FailedFromAtkString - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE -BattleScript_StatDownFromAttackString: - attackstring - ppreduce + jumpifsubstituteblocks BattleScript_ButItFailed +BattleScript_EffectStatDownFromAccCheck: + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE BattleScript_EffectStatDownFromStatBuffChange: - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_StatDownEnd - jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_StatDownDoAnim - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_StatDownEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_StatDownEnd + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_StatDownDoAnim + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGE_EMPTY, BattleScript_StatDownEnd pause B_WAIT_TIME_SHORT + setmoveresultflags MOVE_RESULT_MISSED @ TODO: Is this even necessary? goto BattleScript_StatDownPrintString BattleScript_StatDownDoAnim:: attackanimation waitanimation - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_StatDownEnd bicword gHitMarker, HITMARKER_DISABLE_ANIMATION BattleScript_StatDownPrintString:: printfromtable gStatDownStringIds @@ -3169,14 +2690,11 @@ BattleScript_StatDownEnd:: BattleScript_MirrorArmorReflect:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp - jumpifstatus2 BS_ATTACKER, STATUS2_SUBSTITUTE, BattleScript_MirrorArmorDoesntAffect + jumpifvolatile BS_ATTACKER, VOLATILE_SUBSTITUTE, BattleScript_MirrorArmorDoesntAffect BattleScript_MirrorArmorReflectStatLoss: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_MIRROR_ARMOR | STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_MirrorArmorReflectEnd - jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_MirrorArmorReflectAnim + statbuffchange BS_ATTACKER, STAT_CHANGE_MIRROR_ARMOR | STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_MirrorArmorReflectEnd + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_MirrorArmorReflectPrintString goto BattleScript_MirrorArmorReflectWontFall -BattleScript_MirrorArmorReflectAnim: - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 BattleScript_MirrorArmorReflectPrintString: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG @@ -3203,15 +2721,12 @@ BattleScript_MirrorArmorReflectStickyWeb: goto BattleScript_StickyWebOnSwitchInEnd BattleScript_StatDown:: - playanimation BS_EFFECT_BATTLER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG return BattleScript_EffectHaze:: attackcanceler - attackstring - ppreduce attackanimation waitanimation normalisebuffs @@ -3221,23 +2736,18 @@ BattleScript_EffectHaze:: BattleScript_EffectBide:: attackcanceler - attackstring - ppreduce attackanimation waitanimation - orword gHitMarker, HITMARKER_CHARGING setbide goto BattleScript_MoveEnd BattleScript_EffectRoar:: attackcanceler - attackstring - ppreduce jumpifroarfails BattleScript_ButItFailed jumpifcommanderactive BattleScript_ButItFailed jumpifability BS_TARGET, ABILITY_GUARD_DOG, BattleScript_ButItFailed jumpifability BS_TARGET, ABILITY_SUCTION_CUPS, BattleScript_AbilityPreventsPhasingOut - jumpifstatus3 BS_TARGET, STATUS3_ROOTED, BattleScript_PrintMonIsRooted + jumpifvolatile BS_TARGET, VOLATILE_ROOT, BattleScript_PrintMonIsRooted jumpiftargetdynamaxed BattleScript_RoarBlockedByDynamax accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE @@ -3263,8 +2773,6 @@ BattleScript_ScaleShot:: BattleScript_EffectConversion:: attackcanceler - attackstring - ppreduce tryconversiontypechange BattleScript_ButItFailed attackanimation waitanimation @@ -3274,21 +2782,18 @@ BattleScript_EffectConversion:: BattleScript_EffectRestoreHp:: attackcanceler - attackstring - ppreduce - tryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_ATTACKER + tryhealhalfhealth BS_ATTACKER, BattleScript_AlreadyAtFullHp attackanimation waitanimation BattleScript_RestoreHp: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_AlreadyPoisoned:: - setalreadystatusedmoveattempt BS_ATTACKER + setalreadystatusedmoveattempt pause B_WAIT_TIME_LONG printstring STRINGID_PKMNALREADYPOISONED waitmessage B_WAIT_TIME_LONG @@ -3296,39 +2801,28 @@ BattleScript_AlreadyPoisoned:: BattleScript_ImmunityProtected:: call BattleScript_AbilityPopUp - pause B_WAIT_TIME_SHORT - printfromtable gStatusPreventionStringIds - waitmessage B_WAIT_TIME_LONG - goto BattleScript_MoveEnd + goto BattleScript_DoesntAffectTargetAtkString BattleScript_EffectAuroraVeil:: attackcanceler - attackstring - ppreduce - setauroraveil BS_ATTACKER + setauroraveil goto BattleScript_PrintReflectLightScreenSafeguardString BattleScript_EffectLightScreen:: attackcanceler - attackstring - ppreduce setlightscreen goto BattleScript_PrintReflectLightScreenSafeguardString BattleScript_EffectRest:: attackcanceler - attackstring - ppreduce jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_RestIsAlreadyAsleep jumpifability BS_ATTACKER, ABILITY_COMATOSE, BattleScript_RestIsAlreadyAsleep jumpifuproarwakes BattleScript_RestCantSleep jumpifability BS_TARGET, ABILITY_INSOMNIA, BattleScript_InsomniaProtects jumpifability BS_TARGET, ABILITY_VITAL_SPIRIT, BattleScript_InsomniaProtects jumpifability BS_ATTACKER, ABILITY_PURIFYING_SALT, BattleScript_InsomniaProtects -.if B_LEAF_GUARD_PREVENTS_REST >= GEN_5 - jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardPreventsRest -.endif - trysetrest BattleScript_AlreadyAtFullHp + jumpifabilitypreventsrest BS_TARGET, BattleScript_AbilityPreventsRest + trysetrest pause B_WAIT_TIME_SHORT printfromtable gRestUsedStringIds waitmessage B_WAIT_TIME_LONG @@ -3343,13 +2837,13 @@ BattleScript_RestCantSleep:: goto BattleScript_MoveEnd BattleScript_RestIsAlreadyAsleep:: - setalreadystatusedmoveattempt BS_ATTACKER + setalreadystatusedmoveattempt pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNALREADYASLEEP2 waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_LeafGuardPreventsRest:: +BattleScript_AbilityPreventsRest:: pause B_WAIT_TIME_SHORT printstring STRINGID_BUTITFAILED waitmessage B_WAIT_TIME_LONG @@ -3357,13 +2851,9 @@ BattleScript_LeafGuardPreventsRest:: BattleScript_EffectOHKO:: attackcanceler - attackstring - ppreduce - accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE typecalc jumpifmovehadnoeffect BattleScript_HitFromAtkAnimation tryKO BattleScript_KOFail - trysetdestinybondtohappen goto BattleScript_HitFromAtkAnimation BattleScript_KOFail:: pause B_WAIT_TIME_LONG @@ -3375,16 +2865,14 @@ BattleScript_RecoilIfMiss:: printstring STRINGID_PKMNCRASHED waitmessage B_WAIT_TIME_LONG jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_RecoilEnd - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_IGNORE_DISGUISE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE tryfaintmon BS_ATTACKER +BattleScript_RecoilEnd: return BattleScript_EffectMist:: attackcanceler - attackstring - ppreduce setmist attackanimation waitanimation @@ -3394,9 +2882,8 @@ BattleScript_EffectMist:: BattleScript_EffectFocusEnergy:: attackcanceler - attackstring - ppreduce - jumpifstatus2 BS_ATTACKER, STATUS2_FOCUS_ENERGY_ANY, BattleScript_ButItFailed + jumpifvolatile BS_ATTACKER, VOLATILE_DRAGON_CHEER, BattleScript_ButItFailed + jumpifvolatile BS_ATTACKER, VOLATILE_FOCUS_ENERGY, BattleScript_ButItFailed setfocusenergy BS_TARGET attackanimation waitanimation @@ -3406,23 +2893,21 @@ BattleScript_EffectFocusEnergy:: BattleScript_EffectConfuse:: attackcanceler - attackstring - ppreduce jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_OwnTempoPrevents jumpifsubstituteblocks BattleScript_ButItFailed - jumpifstatus2 BS_TARGET, STATUS2_CONFUSION, BattleScript_AlreadyConfused + jumpifvolatile BS_TARGET, VOLATILE_CONFUSION, BattleScript_AlreadyConfused jumpifterrainaffected BS_TARGET, STATUS_FIELD_MISTY_TERRAIN, BattleScript_MistyTerrainPrevents accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsafeguard BattleScript_SafeguardProtected attackanimation waitanimation - seteffectprimary MOVE_EFFECT_CONFUSION + seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_CONFUSION resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_AlreadyConfused:: - setalreadystatusedmoveattempt BS_ATTACKER + setalreadystatusedmoveattempt pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNALREADYCONFUSED waitmessage B_WAIT_TIME_LONG @@ -3466,9 +2951,10 @@ BattleScript_EffectEvasionUp2:: BattleScript_EffectTransform:: attackcanceler - attackstring - ppreduce trytoclearprimalweather + tryrevertweatherform + flushtextbox + tryendneutralizinggas flushtextbox transformdataexecution attackanimation @@ -3507,24 +2993,26 @@ BattleScript_EffectEvasionDown2:: BattleScript_EffectReflect:: attackcanceler - attackstring - ppreduce setreflect BattleScript_PrintReflectLightScreenSafeguardString:: attackanimation waitanimation -BattleScript_EffectAuroraVeilSuccess:: printfromtable gReflectLightScreenSafeguardStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd +BattleScript_MoveEffectAuroraVeil:: + printfromtable gReflectLightScreenSafeguardStringIds + waitmessage B_WAIT_TIME_LONG + return + BattleScript_VoltAbsorbHeal: copybyte gBattlerAbility, gBattlerTarget - tryhealquarterhealth BS_TARGET BattleScript_MonMadeMoveUseless @ Check if max hp + tryhealquarterhealth BS_TARGET, BattleScript_MonMadeMoveUseless @ Check if max hp goto BattleScript_MoveHPDrain BattleScript_AlreadyParalyzed:: - setalreadystatusedmoveattempt BS_ATTACKER + setalreadystatusedmoveattempt pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNISALREADYPARALYZED waitmessage B_WAIT_TIME_LONG @@ -3538,49 +3026,43 @@ BattleScript_PowerHerbActivation: return BattleScript_EffectTwoTurnsAttack:: - jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_TwoTurnMovesSecondTurn - jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_TwoTurnMovesSecondTurn + jumpifvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS, BattleScript_TwoTurnMovesSecondTurn tryfiretwoturnmovewithoutcharging BS_ATTACKER, BattleScript_EffectHit @ e.g. Solar Beam call BattleScript_FirstChargingTurn tryfiretwoturnmoveaftercharging BS_ATTACKER, BattleScript_TwoTurnMovesSecondTurn @ e.g. Electro Shot - jumpifholdeffect BS_ATTACKER, HOLD_EFFECT_POWER_HERB, BattleScript_TwoTurnMovesSecondPowerHerbActivates + jumpifholdeffect BS_ATTACKER, HOLD_EFFECT_POWER_HERB, BattleScript_TwoTurnMovesSecondPowerHerbActivates, TRUE goto BattleScript_MoveEnd BattleScript_EffectGeomancy:: - jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_GeomancySecondTurn - jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_GeomancySecondTurn + jumpifvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS, BattleScript_GeomancySecondTurn call BattleScript_FirstChargingTurn jumpifnoholdeffect BS_ATTACKER, HOLD_EFFECT_POWER_HERB, BattleScript_MoveEnd call BattleScript_PowerHerbActivation BattleScript_GeomancySecondTurn: attackcanceler setbyte sB_ANIM_TURN, 1 - clearstatusfromeffect BS_ATTACKER, MOVE_EFFECT_CHARGING - orword gHitMarker, HITMARKER_NO_PPDEDUCT - attackstring + clearvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_GeomancyDoMoveAnim jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_GeomancyDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats BattleScript_GeomancyDoMoveAnim:: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_SPDEF | BIT_SPEED, 0 setstatchanger STAT_SPATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyTrySpDef - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_GeomancyTrySpDef + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyTrySpDef, BIT_SPDEF | BIT_SPEED + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_GeomancyTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GeomancyTrySpDef:: setstatchanger STAT_SPDEF, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyTrySpeed - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_GeomancyTrySpeed + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyTrySpeed, BIT_SPEED + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_GeomancyTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GeomancyTrySpeed:: setstatchanger STAT_SPEED, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_GeomancyEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_GeomancyEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GeomancyEnd:: @@ -3588,17 +3070,10 @@ BattleScript_GeomancyEnd:: BattleScript_FirstChargingTurn:: attackcanceler -@ before Gen 5, charge moves did not print an attack string on the charge turn -.if B_UPDATED_MOVE_DATA >= GEN_5 - flushtextbox - attackstring waitmessage B_WAIT_TIME_LONG -.endif - ppreduce BattleScript_FirstChargingTurnAfterAttackString: setsemiinvulnerablebit @ only for moves with EFFECT_SEMI_INVULNERABLE/EFFECT_SKY_DROP - orword gHitMarker, HITMARKER_CHARGING - seteffectprimary MOVE_EFFECT_CHARGING | MOVE_EFFECT_AFFECTS_USER + setchargingturn twoturnmoveschargestringandanimation setadditionaleffects @ only onChargeTurnOnly effects will work here return @@ -3608,46 +3083,38 @@ BattleScript_TwoTurnMovesSecondPowerHerbActivates: trygulpmissile @ Edge case for Cramorant ability Gulp Missile BattleScript_FromTwoTurnMovesSecondTurnRet: call BattleScript_TwoTurnMovesSecondTurnRet - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE -@ before Gen 5, charge moves did not print an attack string on the charge turn -.if B_UPDATED_MOVE_DATA < GEN_5 - attackstring -.endif + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE goto BattleScript_HitFromCritCalc BattleScript_TwoTurnMovesSecondTurn:: attackcanceler call BattleScript_TwoTurnMovesSecondTurnRet - orword gHitMarker, HITMARKER_NO_PPDEDUCT goto BattleScript_HitFromAccCheck BattleScript_TwoTurnMovesSecondTurnRet: setbyte sB_ANIM_TURN, 1 setbyte sB_ANIM_TARGETS_HIT, 0 - clearstatusfromeffect BS_ATTACKER, MOVE_EFFECT_CHARGING + clearvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS clearsemiinvulnerablebit @ only for moves with EFFECT_SEMI_INVULNERABLE/EFFECT_SKY_DROP return BattleScript_EffectSubstitute:: attackcanceler - ppreduce - attackstring waitstate - jumpifstatus2 BS_ATTACKER, STATUS2_SUBSTITUTE, BattleScript_AlreadyHasSubstitute + jumpifvolatile BS_ATTACKER, VOLATILE_SUBSTITUTE, BattleScript_AlreadyHasSubstitute setsubstitute jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_SUBSTITUTE_FAILED, BattleScript_SubstituteString - orword gHitMarker, HITMARKER_PASSIVE_DAMAGE attackanimation waitanimation - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE BattleScript_SubstituteString:: pause B_WAIT_TIME_SHORT printfromtable gSubstituteUsedStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_AlreadyHasSubstitute:: - setalreadystatusedmoveattempt BS_ATTACKER + setalreadystatusedmoveattempt pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNHASSUBSTITUTE waitmessage B_WAIT_TIME_LONG @@ -3661,16 +3128,14 @@ BattleScript_MoveUsedMustRecharge:: BattleScript_EffectRage:: attackcanceler accuracycheck BattleScript_RageMiss, ACC_CURR_MOVE - seteffectprimary MOVE_EFFECT_RAGE - goto BattleScript_HitFromAtkString + seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_RAGE + goto BattleScript_HitFromCritCalc BattleScript_RageMiss:: - clearstatusfromeffect BS_ATTACKER, MOVE_EFFECT_RAGE - goto BattleScript_PrintMoveMissed + clearvolatile BS_ATTACKER, VOLATILE_RAGE + goto BattleScript_MoveMissedPause BattleScript_EffectMimic:: attackcanceler - attackstring - ppreduce jumpifsubstituteblocks BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON mimicattackcopy BattleScript_ButItFailed @@ -3680,19 +3145,9 @@ BattleScript_EffectMimic:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectMetronome:: - attackcanceler - attackstring - pause B_WAIT_TIME_SHORT - attackanimation - waitanimation - metronome - BattleScript_EffectLeechSeed:: attackcanceler - attackstring pause B_WAIT_TIME_SHORT - ppreduce jumpifsubstituteblocks BattleScript_ButItFailed accuracycheck BattleScript_DoLeechSeed, ACC_CURR_MOVE BattleScript_DoLeechSeed:: @@ -3705,8 +3160,6 @@ BattleScript_DoLeechSeed:: BattleScript_EffectDoNothing:: attackcanceler - attackstring - ppreduce attackanimation waitanimation incrementgamestat GAME_STAT_USED_SPLASH @@ -3716,8 +3169,6 @@ BattleScript_EffectDoNothing:: BattleScript_EffectHoldHands:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_ButItFailed attackanimation @@ -3726,8 +3177,6 @@ BattleScript_EffectHoldHands:: BattleScript_EffectCelebrate:: attackcanceler - attackstring - ppreduce attackanimation waitanimation printstring STRINGID_CELEBRATEMESSAGE @@ -3736,17 +3185,13 @@ BattleScript_EffectCelebrate:: BattleScript_EffectHappyHour:: attackcanceler - attackstring - ppreduce attackanimation waitanimation - seteffectprimary MOVE_EFFECT_HAPPY_HOUR + seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_HAPPY_HOUR goto BattleScript_MoveEnd BattleScript_EffectDisable:: attackcanceler - attackstring - ppreduce jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE disablelastusedattack BattleScript_ButItFailed @@ -3758,10 +3203,8 @@ BattleScript_EffectDisable:: BattleScript_EffectCounter:: attackcanceler - counterdamagecalculator BattleScript_FailedFromAtkString - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + counterdamagecalculator BattleScript_ButItFailed + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE typecalc clearmoveresultflags MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE adjustdamage @@ -3769,9 +3212,7 @@ BattleScript_EffectCounter:: BattleScript_EffectEncore:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects trysetencore BattleScript_ButItFailed attackanimation @@ -3782,43 +3223,30 @@ BattleScript_EffectEncore:: BattleScript_EffectPainSplit:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON painsplitdmgcalc BattleScript_ButItFailed attackanimation waitanimation - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printstring STRINGID_SHAREDPAIN waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectSnore:: attackcanceler - jumpifability BS_ATTACKER, ABILITY_COMATOSE, BattleScript_SnoreIsAsleep - jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_SnoreIsAsleep - attackstring - ppreduce - goto BattleScript_ButItFailed -BattleScript_SnoreIsAsleep:: jumpifhalfword CMP_EQUAL, gChosenMove, MOVE_SLEEP_TALK, BattleScript_DoSnore printstring STRINGID_PKMNFASTASLEEP waitmessage B_WAIT_TIME_LONG statusanimation BS_ATTACKER BattleScript_DoSnore:: - attackstring - ppreduce accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE goto BattleScript_HitFromCritCalc BattleScript_EffectConversion2:: attackcanceler - attackstring - ppreduce settypetorandomresistance BattleScript_ButItFailed attackanimation waitanimation @@ -3828,8 +3256,6 @@ BattleScript_EffectConversion2:: BattleScript_EffectLockOn:: attackcanceler - attackstring - ppreduce jumpifsubstituteblocks BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE setalwayshitflag @@ -3841,8 +3267,6 @@ BattleScript_EffectLockOn:: BattleScript_EffectSketch:: attackcanceler - attackstring - ppreduce copymovepermanently BattleScript_ButItFailed attackanimation waitanimation @@ -3850,33 +3274,9 @@ BattleScript_EffectSketch:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectSleepTalk:: - attackcanceler - jumpifability BS_ATTACKER, ABILITY_COMATOSE, BattleScript_SleepTalkIsAsleep - jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_SleepTalkIsAsleep - attackstring - ppreduce - goto BattleScript_ButItFailed -BattleScript_SleepTalkIsAsleep:: - printstring STRINGID_PKMNFASTASLEEP - waitmessage B_WAIT_TIME_LONG - statusanimation BS_ATTACKER - attackstring - ppreduce - orword gHitMarker, HITMARKER_NO_PPDEDUCT - trychoosesleeptalkmove BattleScript_SleepTalkUsingMove - pause B_WAIT_TIME_LONG - goto BattleScript_ButItFailed -BattleScript_SleepTalkUsingMove:: - attackanimation - waitanimation - jumptocalledmove TRUE - BattleScript_EffectDestinyBond:: attackcanceler - attackstring - ppreduce - trysetdestinybond BattleScript_ButItFailed + setvolatile BS_ATTACKER, VOLATILE_DESTINY_BOND, 2 attackanimation waitanimation printstring STRINGID_PKMNTRYINGTOTAKEFOE @@ -3890,8 +3290,6 @@ BattleScript_MoveEffectEerieSpell:: BattleScript_EffectSpite:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE tryspiteppreduce BattleScript_ButItFailed attackanimation @@ -3900,13 +3298,11 @@ BattleScript_EffectSpite:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd +@ TODO: Simplfy script BattleScript_EffectHealBell:: attackcanceler - attackstring - ppreduce attackanimation waitanimation -BattleScript_EffectHealBell_FromHeal:: healpartystatus waitstate printfromtable gPartyStatusHealStringIds @@ -3926,56 +3322,59 @@ BattleScript_PartyHealEnd:: waitstate goto BattleScript_MoveEnd +BattleScript_MoveEffectAromatherapy:: + healpartystatus + waitstate + printfromtable gPartyStatusHealStringIds + waitmessage B_WAIT_TIME_LONG + updatestatusicon BS_ATTACKER_WITH_PARTNER + waitstate + return + BattleScript_EffectMeanLook:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON - jumpifstatus2 BS_TARGET, STATUS2_ESCAPE_PREVENTION, BattleScript_ButItFailed + jumpifvolatile BS_TARGET, VOLATILE_ESCAPE_PREVENTION, BattleScript_ButItFailed jumpifsubstituteblocks BattleScript_ButItFailed .if B_GHOSTS_ESCAPE >= GEN_6 jumpiftype BS_TARGET, TYPE_GHOST, BattleScript_ButItFailed .endif attackanimation waitanimation - seteffectprimary MOVE_EFFECT_PREVENT_ESCAPE + seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_PREVENT_ESCAPE printstring STRINGID_TARGETCANTESCAPENOW waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectNightmare:: attackcanceler - attackstring - ppreduce jumpifsubstituteblocks BattleScript_ButItFailed - jumpifstatus2 BS_TARGET, STATUS2_NIGHTMARE, BattleScript_ButItFailed + jumpifvolatile BS_TARGET, VOLATILE_NIGHTMARE, BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_NightmareWorked jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_NightmareWorked goto BattleScript_ButItFailed BattleScript_NightmareWorked:: attackanimation waitanimation - seteffectprimary MOVE_EFFECT_NIGHTMARE + seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_NIGHTMARE printstring STRINGID_PKMNFELLINTONIGHTMARE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectMinimize:: attackcanceler - setminimize -.if B_MINIMIZE_EVASION >= GEN_5 + setvolatile BS_ATTACKER, VOLATILE_MINIMIZE + jumpifgenconfiglowerthan CONFIG_MINIMIZE_EVASION, GEN_5, BattleScript_EffectMinimizeGen4 setstatchanger STAT_EVASION, 2, FALSE -.else + goto BattleScript_EffectStatUpAfterAtkCanceler +BattleScript_EffectMinimizeGen4: setstatchanger STAT_EVASION, 1, FALSE -.endif goto BattleScript_EffectStatUpAfterAtkCanceler BattleScript_EffectCurse:: jumpiftype BS_ATTACKER, TYPE_GHOST, BattleScript_GhostCurse attackcanceler jumpiftype BS_ATTACKER, TYPE_GHOST, BattleScript_DoGhostCurse - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_GREATER_THAN, STAT_SPEED, MIN_STAT_STAGE, BattleScript_CurseTrySpeed jumpifstat BS_ATTACKER, CMP_NOT_EQUAL, STAT_ATK, MAX_STAT_STAGE, BattleScript_CurseTrySpeed jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_DEF, MAX_STAT_STAGE, BattleScript_ButItFailed @@ -3984,57 +3383,42 @@ BattleScript_CurseTrySpeed:: setbyte sB_ANIM_TURN, 1 attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_SPEED, STAT_CHANGE_NEGATIVE setstatchanger STAT_SPEED, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CurseTryAttack + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CurseTryAttack printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CurseTryAttack:: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF, 0 setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CurseTryDefense + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CurseTryDefense, BIT_DEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CurseTryDefense:: setstatchanger STAT_DEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CurseEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CurseEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CurseEnd:: goto BattleScript_MoveEnd BattleScript_GhostCurse:: jumpifbytenotequal gBattlerAttacker, gBattlerTarget, BattleScript_DoGhostCurse - getmovetarget BS_ATTACKER + getmovetarget BattleScript_DoGhostCurse:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON cursetarget BattleScript_ButItFailed - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE setbyte sB_ANIM_TURN, 0 attackanimation waitanimation - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_PKMNLAIDCURSE waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER goto BattleScript_MoveEnd -BattleScript_EffectMatBlock:: - attackcanceler - jumpifnotfirstturn BattleScript_FailedFromAtkString - goto BattleScript_ProtectLikeAtkString - BattleScript_EffectProtect:: BattleScript_EffectEndure:: attackcanceler -BattleScript_ProtectLikeAtkString: - attackstring - ppreduce setprotectlike attackanimation waitanimation @@ -4044,9 +3428,7 @@ BattleScript_ProtectLikeAtkString: BattleScript_EffectSpikes:: attackcanceler - trysetspikes BattleScript_FailedFromAtkString - attackstring - ppreduce + trysetspikes BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_SPIKESSCATTERED @@ -4055,11 +3437,9 @@ BattleScript_EffectSpikes:: BattleScript_EffectForesight:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON - jumpifstatus2 BS_TARGET, STATUS2_FORESIGHT, BattleScript_ButItFailed - setforesight + jumpifvolatile BS_TARGET, VOLATILE_FORESIGHT, BattleScript_ButItFailed + setvolatile BS_TARGET, VOLATILE_FORESIGHT BattleScript_IdentifiedFoe: attackanimation waitanimation @@ -4069,8 +3449,6 @@ BattleScript_IdentifiedFoe: BattleScript_EffectPerishSong:: attackcanceler - attackstring - ppreduce trysetperishsong BattleScript_ButItFailed savetarget attackanimation @@ -4080,7 +3458,7 @@ BattleScript_EffectPerishSong:: setbyte gBattlerTarget, 0 BattleScript_PerishSongLoop:: jumpifblockedbysoundproof BS_TARGET, BattleScript_PerishSongBlocked - jumpifpranksterblocked BS_TARGET, BattleScript_PerishSongNotAffected + jumpifpranksterblocked BattleScript_PerishSongNotAffected BattleScript_PerishSongLoopIncrement:: addbyte gBattlerTarget, 1 jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_PerishSongLoop @@ -4100,17 +3478,13 @@ BattleScript_PerishSongNotAffected: BattleScript_EffectSandstorm:: attackcanceler - attackstring - ppreduce call BattleScript_CheckPrimalWeather setfieldweather BATTLE_WEATHER_SANDSTORM goto BattleScript_MoveWeatherChange BattleScript_EffectRollout:: attackcanceler - attackstring - jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_RolloutCheckAccuracy - ppreduce + jumpifvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS, BattleScript_RolloutCheckAccuracy BattleScript_RolloutCheckAccuracy:: accuracycheck BattleScript_RolloutHit, ACC_CURR_MOVE BattleScript_RolloutHit:: @@ -4121,29 +3495,23 @@ BattleScript_RolloutHit:: BattleScript_EffectSwagger:: attackcanceler jumpifsubstituteblocks BattleScript_MakeMoveMissed - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifconfusedandstatmaxed STAT_ATK, BattleScript_ButItFailed attackanimation waitanimation setstatchanger STAT_ATK, 2, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_SwaggerTryConfuse - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_SwaggerTryConfuse - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_SwaggerTryConfuse + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_SwaggerTryConfuse printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_SwaggerTryConfuse: jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_OwnTempoPrevents jumpifsafeguard BattleScript_SafeguardProtected - seteffectprimary MOVE_EFFECT_CONFUSION + seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_CONFUSION goto BattleScript_MoveEnd BattleScript_EffectFuryCutter:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_FuryCutterHit, ACC_CURR_MOVE BattleScript_FuryCutterHit: handlefurycutter @@ -4155,32 +3523,36 @@ BattleScript_FuryCutterHit: BattleScript_TryDestinyKnotTarget: jumpifnoholdeffect BS_ATTACKER, HOLD_EFFECT_DESTINY_KNOT, BattleScript_TryDestinyKnotTargetRet - infatuatewithbattler BS_TARGET, BS_ATTACKER playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT waitanimation - status2animation BS_TARGET, STATUS2_INFATUATION - waitanimation printstring STRINGID_DESTINYKNOTACTIVATES + tryinfatuating BattleScript_TryDestinyKnotTargetFailed + volatileanimation BS_TARGET, VOLATILE_INFATUATION + waitanimation + waitmessage B_WAIT_TIME_LONG + goto BattleScript_TryDestinyKnotTargetRet +BattleScript_TryDestinyKnotTargetFailed: + pause B_WAIT_TIME_SHORT + printstring STRINGID_BUTITFAILED waitmessage B_WAIT_TIME_LONG BattleScript_TryDestinyKnotTargetRet: return BattleScript_TryDestinyKnotAttacker: - jumpifnoholdeffect BS_TARGET, HOLD_EFFECT_DESTINY_KNOT, BattleScript_TryDestinyKnotAttackerRet - infatuatewithbattler BS_ATTACKER, BS_TARGET + jumpifnoholdeffect BS_TARGET, HOLD_EFFECT_DESTINY_KNOT, BattleScript_TryDestinyKnotTargetRet playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT waitanimation - status2animation BS_ATTACKER, STATUS2_INFATUATION - waitanimation + swapattackerwithtarget printstring STRINGID_DESTINYKNOTACTIVATES + tryinfatuating BattleScript_SwapTargetAttackerButItFailed + swapattackerwithtarget + volatileanimation BS_ATTACKER, VOLATILE_INFATUATION + waitanimation waitmessage B_WAIT_TIME_LONG -BattleScript_TryDestinyKnotAttackerRet: return BattleScript_EffectAttract:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects tryinfatuating BattleScript_ButItFailed @@ -4193,45 +3565,35 @@ BattleScript_EffectAttract:: BattleScript_EffectPresent:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE typecalc presentdamagecalculation BattleScript_EffectSafeguard:: attackcanceler - attackstring - ppreduce setsafeguard goto BattleScript_PrintReflectLightScreenSafeguardString BattleScript_EffectMagnitude:: - jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING | HITMARKER_NO_PPDEDUCT, BattleScript_EffectMagnitudeTarget attackcanceler - attackstring - ppreduce magnitudedamagecalculation pause B_WAIT_TIME_SHORT printstring STRINGID_MAGNITUDESTRENGTH waitmessage B_WAIT_TIME_LONG -BattleScript_EffectMagnitudeTarget: accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE goto BattleScript_HitFromCritCalc BattleScript_EffectBatonPass:: attackcanceler - attackstring - ppreduce jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_ButItFailed jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_ButItFailed attackanimation waitanimation openpartyscreen BS_ATTACKER, BattleScript_ButItFailed - switchoutabilities BS_ATTACKER waitstate - switchhandleorder BS_ATTACKER, 2 returntoball BS_ATTACKER, FALSE + switchoutabilities BS_ATTACKER + switchhandleorder BS_ATTACKER, 2 getswitchedmondata BS_ATTACKER switchindataupdate BS_ATTACKER hpthresholds BS_ATTACKER @@ -4248,15 +3610,11 @@ BattleScript_EffectSynthesis:: BattleScript_EffectMoonlight:: BattleScript_EffectShoreUp:: attackcanceler - attackstring - ppreduce recoverbasedonsunlight BattleScript_AlreadyAtFullHp goto BattleScript_PresentHealTarget BattleScript_EffectRainDance:: attackcanceler - attackstring - ppreduce call BattleScript_CheckPrimalWeather setfieldweather BATTLE_WEATHER_RAIN BattleScript_MoveWeatherChange:: @@ -4273,8 +3631,6 @@ BattleScript_MoveWeatherChangeRet:: BattleScript_EffectSunnyDay:: attackcanceler - attackstring - ppreduce call BattleScript_CheckPrimalWeather setfieldweather BATTLE_WEATHER_SUN goto BattleScript_MoveWeatherChange @@ -4349,27 +3705,21 @@ BattleScript_BlockedByPrimalWeatherRet:: BattleScript_EffectBellyDrum:: attackcanceler - attackstring - ppreduce - jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_ATK, MAX_STAT_STAGE, BattleScript_ButItFailed + jumpifstatignorecontrary BS_ATTACKER, CMP_EQUAL, STAT_ATK, MAX_STAT_STAGE, BattleScript_ButItFailed halvehp BattleScript_ButItFailed - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE attackanimation waitanimation - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER - playstatchangeanimation BS_ATTACKER, BIT_ATK, STAT_CHANGE_BY_TWO + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE setstatchanger STAT_ATK, MAX_STAT_STAGE, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_MoveEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_MoveEnd printstring STRINGID_PKMNCUTHPMAXEDATTACK waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectPsychUp:: attackcanceler - attackstring - ppreduce - copyfoestats BattleScript_ButItFailed + copyfoestats attackanimation waitanimation printstring STRINGID_PKMNCOPIEDSTATCHANGES @@ -4378,10 +3728,8 @@ BattleScript_EffectPsychUp:: BattleScript_EffectMirrorCoat:: attackcanceler - mirrorcoatdamagecalculator BattleScript_FailedFromAtkString - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + mirrorcoatdamagecalculator BattleScript_ButItFailed + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE typecalc clearmoveresultflags MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE adjustdamage @@ -4389,9 +3737,7 @@ BattleScript_EffectMirrorCoat:: BattleScript_EffectFutureSight:: attackcanceler - attackstring - ppreduce - trysetfutureattack BattleScript_ButItFailed + setfutureattack attackanimation waitanimation printfromtable gFutureMoveUsedStringIds @@ -4399,76 +3745,42 @@ BattleScript_EffectFutureSight:: goto BattleScript_MoveEnd BattleScript_EffectTeleport:: -.if B_TELEPORT_BEHAVIOR >= GEN_8 + jumpifgenconfiglowerthan CONFIG_TELEPORT_BEHAVIOR, GEN_8, BattleScript_EffectTeleportGen7 jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_EffectBatonPass jumpifside BS_ATTACKER, B_SIDE_PLAYER, BattleScript_EffectBatonPass -.else + goto BattleScript_DoEffectTeleport +BattleScript_EffectTeleportGen7:: jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_FailedFromAtkCanceler -.endif +BattleScript_DoEffectTeleport:: attackcanceler - attackstring - ppreduce - getifcantrunfrombattle BS_ATTACKER + isrunningimpossible jumpifbyte CMP_EQUAL, gBattleCommunication, BATTLE_RUN_FORBIDDEN, BattleScript_ButItFailed jumpifbyte CMP_EQUAL, gBattleCommunication, BATTLE_RUN_FAILURE, BattleScript_PrintAbilityMadeIneffective attackanimation waitanimation printstring STRINGID_PKMNFLEDFROMBATTLE waitmessage B_WAIT_TIME_LONG - setoutcomeonteleport BS_ATTACKER + setteleportoutcome BS_ATTACKER goto BattleScript_MoveEnd BattleScript_EffectBeatUp:: + jumpifgenconfiglowerthan CONFIG_BEAT_UP, GEN_5, BattleScript_EffectBeatUpGen3 + goto BattleScript_EffectHit + +BattleScript_EffectBeatUpGen3: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE -.if B_BEAT_UP >= GEN_5 - attackstring - ppreduce - critcalc - damagecalc - adjustdamage - trydobeatup - goto BattleScript_HitFromAtkAnimation -.else - attackstring + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE pause B_WAIT_TIME_SHORT - ppreduce - setbyte gBattleCommunication, 0 -BattleScript_BeatUpLoop:: - movevaluescleanup - trydobeatup BattleScript_BeatUpEnd, BattleScript_ButItFailed + trydobeatup BattleScript_MoveEnd, BattleScript_ButItFailed printstring STRINGID_PKMNATTACK - critcalc - jumpifcriticalhit BattleScript_BeatUpAttack - manipulatedamage DMG_DOUBLED -BattleScript_BeatUpAttack:: - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG - tryfaintmon BS_TARGET - moveendto MOVEEND_NEXT_TARGET - goto BattleScript_BeatUpLoop -BattleScript_BeatUpEnd:: - end -.endif + goto BattleScript_HitFromCritCalc BattleScript_EffectDefenseCurl:: attackcanceler - attackstring - ppreduce - setdefensecurlbit + setvolatile BS_TARGET, VOLATILE_DEFENSE_CURL setstatchanger STAT_DEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_DefenseCurlDoStatUpAnim - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StatUpPrintString + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_DefenseCurlDoStatUpAnim + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_StatUpPrintString attackanimation waitanimation BattleScript_DefenseCurlDoStatUpAnim:: @@ -4476,15 +3788,12 @@ BattleScript_DefenseCurlDoStatUpAnim:: BattleScript_EffectSoftboiled:: attackcanceler - attackstring - ppreduce - tryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_TARGET + tryhealhalfhealth BS_TARGET, BattleScript_AlreadyAtFullHp BattleScript_PresentHealTarget:: attackanimation waitanimation - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -4495,17 +3804,8 @@ BattleScript_AlreadyAtFullHp:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectFirstTurnOnly:: - attackcanceler - jumpifnotfirstturn BattleScript_FailedFromAtkString - goto BattleScript_EffectHit - BattleScript_FailedFromAtkCanceler:: attackcanceler -BattleScript_FailedFromAtkString:: - attackstring -BattleScript_FailedFromPpReduce:: - ppreduce BattleScript_ButItFailed:: pause B_WAIT_TIME_SHORT setmoveresultflags MOVE_RESULT_FAILED @@ -4518,6 +3818,9 @@ BattleScript_RestoreAttackerButItFailed: BattleScript_RestoreTargetButItFailed: restoretarget goto BattleScript_ButItFailed +BattleScript_SwapTargetAttackerButItFailed: + swapattackerwithtarget + goto BattleScript_ButItFailed BattleScript_NotAffected:: pause B_WAIT_TIME_SHORT @@ -4534,23 +3837,12 @@ BattleScript_NotAffectedAbilityPopUp:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectUproar:: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_UproarHit - ppreduce -BattleScript_UproarHit:: - goto BattleScript_HitFromCritCalc - BattleScript_EffectStockpile:: attackcanceler - attackstring - ppreduce stockpile 0 attackanimation waitanimation - printfromtable gStockpileUsedStringIds + printstring STRINGID_PKMNSTOCKPILED waitmessage B_WAIT_TIME_LONG .if B_STOCKPILE_RAISES_DEFS < GEN_4 goto BattleScript_EffectStockpileEnd @@ -4559,17 +3851,15 @@ BattleScript_EffectStockpile:: jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_DEF, MAX_STAT_STAGE, BattleScript_EffectStockpileDef jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_EffectStockpileEnd BattleScript_EffectStockpileDef: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, 0 setstatchanger STAT_DEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectStockpileSpDef - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectStockpileSpDef + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectStockpileSpDef, BIT_SPDEF + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectStockpileSpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectStockpileSpDef:: setstatchanger STAT_SPDEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectStockpileEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectStockpileEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectStockpileEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectStockpileEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectStockpileEnd: @@ -4585,9 +3875,7 @@ BattleScript_MoveEffectStockpileWoreOff:: return BattleScript_StockpileStatChangeDown: - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN, BattleScript_StockpileStatChangeDown_Ret - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_ATTACKER, STAT_CHANGE_CERTAIN, BattleScript_StockpileStatChangeDown_Ret printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_StockpileStatChangeDown_Ret: @@ -4596,67 +3884,42 @@ BattleScript_StockpileStatChangeDown_Ret: BattleScript_EffectSpitUp:: attackcanceler jumpifbyte CMP_EQUAL, cMISS_TYPE, B_MSG_PROTECTED, BattleScript_SpitUpFailProtect - attackstring - ppreduce - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE damagecalc adjustdamage - stockpiletobasedamage BattleScript_SpitUpFail + stockpiletobasedamage call BattleScript_Hit_RetFromAtkAnimation tryfaintmon BS_TARGET removestockpilecounters - goto BattleScript_SpitUpEnd -BattleScript_SpitUpFail:: - checkparentalbondcounter 2, BattleScript_SpitUpEnd - pause B_WAIT_TIME_SHORT - printstring STRINGID_FAILEDTOSPITUP - waitmessage B_WAIT_TIME_LONG -BattleScript_SpitUpEnd: goto BattleScript_MoveEnd BattleScript_SpitUpFailProtect:: - attackstring - ppreduce pause B_WAIT_TIME_LONG - stockpiletobasedamage BattleScript_SpitUpFail + stockpiletobasedamage resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectSwallow:: attackcanceler - attackstring - ppreduce - stockpiletohpheal BattleScript_SwallowFail + stockpiletohpheal BattleScript_ButItFailed attackanimation waitanimation - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG removestockpilecounters goto BattleScript_MoveEnd - -BattleScript_SwallowFail:: - pause B_WAIT_TIME_SHORT - printfromtable gSwallowFailStringIds - waitmessage B_WAIT_TIME_LONG - goto BattleScript_MoveEnd - BattleScript_EffectHail:: attackcanceler - attackstring - ppreduce call BattleScript_CheckPrimalWeather setfieldweather BATTLE_WEATHER_HAIL goto BattleScript_MoveWeatherChange BattleScript_EffectTorment:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects settorment BattleScript_ButItFailed @@ -4669,40 +3932,40 @@ BattleScript_EffectTorment:: BattleScript_EffectFlatter:: attackcanceler jumpifsubstituteblocks BattleScript_MakeMoveMissed - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifconfusedandstatmaxed STAT_SPATK, BattleScript_ButItFailed attackanimation waitanimation setstatchanger STAT_SPATK, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_FlatterTryConfuse - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_FlatterTryConfuse - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_FlatterTryConfuse + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_FlatterTryConfuse printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_FlatterTryConfuse:: jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_OwnTempoPrevents jumpifsafeguard BattleScript_SafeguardProtected - seteffectprimary MOVE_EFFECT_CONFUSION + seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_CONFUSION goto BattleScript_MoveEnd +BattleScript_EffectDarkVoid:: +.if B_DARK_VOID_FAIL >= GEN_7 + jumpifspecies SPECIES_DARKRAI, BattleScript_EffectNonVolatileStatus + goto BattleScript_PokemonCantUseTheMove +.endif BattleScript_EffectNonVolatileStatus:: attackcanceler - attackstring - ppreduce trynonvolatilestatus accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE attackanimation waitanimation - setnonvolatilestatus + setnonvolatilestatus TRIGGER_ON_MOVE + clearmoveresultflags MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_AlreadyBurned:: - setalreadystatusedmoveattempt BS_ATTACKER + setalreadystatusedmoveattempt pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNALREADYHASBURN waitmessage B_WAIT_TIME_LONG @@ -4711,28 +3974,22 @@ BattleScript_AlreadyBurned:: BattleScript_EffectMemento:: attackcanceler jumpifbyte CMP_EQUAL, cMISS_TYPE, B_MSG_PROTECTED, BattleScript_MementoTargetProtect - attackstring - ppreduce trymemento BattleScript_ButItFailed setatkhptozero attackanimation waitanimation jumpifsubstituteblocks BattleScript_EffectMementoPrintNoEffect - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMementoTrySpAtk -@ Greater than B_MSG_DEFENDER_STAT_FELL is checking if the stat cannot decrease - jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_FELL, BattleScript_EffectMementoTrySpAtk + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMementoTrySpAtk, BIT_SPATK +@ Greater than B_MSG_DEFENDER_STAT_CHANGED is checking if the stat cannot decrease + jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_CHANGED, BattleScript_EffectMementoTrySpAtk printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectMementoTrySpAtk: - playstatchangeanimation BS_TARGET, BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO setstatchanger STAT_SPATK, 2, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMementoTryFaint -@ Greater than B_MSG_DEFENDER_STAT_FELL is checking if the stat cannot decrease - jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_FELL, BattleScript_EffectMementoTryFaint + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMementoTryFaint +@ Greater than B_MSG_DEFENDER_STAT_CHANGED is checking if the stat cannot decrease + jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_CHANGED, BattleScript_EffectMementoTryFaint printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectMementoTryFaint: @@ -4744,8 +4001,6 @@ BattleScript_EffectMementoPrintNoEffect: goto BattleScript_EffectMementoTryFaint @ If the target is protected there's no need to check the target's stats or animate, the user will just faint BattleScript_MementoTargetProtect: - attackstring - ppreduce trymemento BattleScript_MementoTargetProtectEnd BattleScript_MementoTargetProtectEnd: setatkhptozero @@ -4759,18 +4014,12 @@ BattleScript_MementoTargetProtectEnd: BattleScript_EffectFocusPunch:: attackcanceler jumpifnodamage BattleScript_HitFromAccCheck - ppreduce printstring STRINGID_PKMNLOSTFOCUS waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectFollowMe:: attackcanceler - attackstring - ppreduce - .if B_UPDATED_MOVE_DATA >= GEN_8 - jumpifnotbattletype BATTLE_TYPE_DOUBLE, BattleScript_ButItFailed - .endif setforcedtarget attackanimation waitanimation @@ -4778,28 +4027,15 @@ BattleScript_EffectFollowMe:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectNaturePower:: - attackcanceler - attackstring - pause B_WAIT_TIME_SHORT - callenvironmentattack - printstring STRINGID_NATUREPOWERTURNEDINTO - waitmessage B_WAIT_TIME_LONG - return - BattleScript_EffectCharge:: attackcanceler - attackstring - ppreduce - setcharge BS_ATTACKER + setvolatile BS_ATTACKER, VOLATILE_CHARGE_TIMER, 2 attackanimation waitanimation .if B_CHARGE_SPDEF_RAISE >= GEN_5 setstatchanger STAT_SPDEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectChargeString - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectChargeString - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectChargeString + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectChargeString printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectChargeString: @@ -4810,8 +4046,6 @@ BattleScript_EffectChargeString: BattleScript_EffectTaunt:: attackcanceler - attackstring - ppreduce jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE settaunt BattleScript_ButItFailed @@ -4823,8 +4057,6 @@ BattleScript_EffectTaunt:: BattleScript_EffectHelpingHand:: attackcanceler - attackstring - ppreduce trysethelpinghand BattleScript_ButItFailed attackanimation waitanimation @@ -4834,8 +4066,6 @@ BattleScript_EffectHelpingHand:: BattleScript_EffectTrick:: attackcanceler - attackstring - ppreduce jumpifsubstituteblocks BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE tryswapitems BattleScript_ButItFailed @@ -4849,16 +4079,12 @@ BattleScript_EffectTrick:: BattleScript_EffectRolePlay:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON trycopyability BS_ATTACKER, BattleScript_ButItFailed attackanimation waitanimation -.if B_ABILITY_POP_UP == TRUE copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUpOverwriteThenNormal -.endif recordability BS_ATTACKER printstring STRINGID_PKMNCOPIEDFOE waitmessage B_WAIT_TIME_LONG @@ -4867,26 +4093,14 @@ BattleScript_EffectRolePlay:: BattleScript_EffectWish:: attackcanceler - attackstring - ppreduce trywish BattleScript_ButItFailed attackanimation waitanimation goto BattleScript_MoveEnd -BattleScript_EffectAssist:: - attackcanceler - attackstring - assistattackselect BattleScript_FailedFromPpReduce - attackanimation - waitanimation - jumptocalledmove TRUE - BattleScript_EffectIngrain:: attackcanceler - attackstring - ppreduce - setuserstatus3 STATUS3_ROOTED, BattleScript_ButItFailed + trysetvolatile BS_ATTACKER, VOLATILE_ROOT, BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNPLANTEDROOTS @@ -4895,9 +4109,7 @@ BattleScript_EffectIngrain:: BattleScript_EffectMagicCoat:: attackcanceler - trysetmagiccoat BattleScript_FailedFromAtkString - attackstring - ppreduce + trysetmagiccoat BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNSHROUDEDITSELF @@ -4906,8 +4118,6 @@ BattleScript_EffectMagicCoat:: BattleScript_EffectRecycle:: attackcanceler - attackstring - ppreduce tryrecycleitem BattleScript_ButItFailed attackanimation waitanimation @@ -4917,9 +4127,7 @@ BattleScript_EffectRecycle:: BattleScript_EffectBrickBreak:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE typecalc removescreens critcalc @@ -4938,30 +4146,32 @@ BattleScript_BrickBreakDoHit:: effectivenesssound hitanimation BS_TARGET waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE + datahpupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE critmessage waitmessage B_WAIT_TIME_LONG resultmessage waitmessage B_WAIT_TIME_LONG - setadditionaleffects tryfaintmon BS_TARGET + setadditionaleffects goto BattleScript_MoveEnd BattleScript_EffectYawn:: attackcanceler - attackstring - ppreduce trynonvolatilestatus accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON setyawn BattleScript_ButItFailed attackanimation waitanimation -BattleScript_EffectYawnSuccess:: printstring STRINGID_PKMNWASMADEDROWSY waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd +BattleScript_MoveEffectYawnSide:: + printstring STRINGID_PKMNWASMADEDROWSY + waitmessage B_WAIT_TIME_LONG + return + BattleScript_PrintAbilityMadeIneffective:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp @@ -4971,8 +4181,6 @@ BattleScript_PrintAbilityMadeIneffective:: BattleScript_EffectEndeavor:: attackcanceler - attackstring - ppreduce setdamagetohealthdifference BattleScript_ButItFailed accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE typecalc @@ -4983,20 +4191,16 @@ BattleScript_EffectEndeavor:: BattleScript_EffectSkillSwap:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON tryswapabilities BattleScript_ButItFailed attackanimation waitanimation jumpiftargetally BattleScript_EffectSkillSwap_AfterAbilityPopUp -.if B_ABILITY_POP_UP == TRUE copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUpOverwriteThenNormal copybyte gBattlerAbility, gBattlerTarget copyhword sABILITY_OVERWRITE, gLastUsedAbility call BattleScript_AbilityPopUpOverwriteThenNormal -.endif BattleScript_EffectSkillSwap_AfterAbilityPopUp: recordability BS_ATTACKER recordability BS_TARGET @@ -5010,8 +4214,6 @@ BattleScript_EffectSkillSwap_AfterAbilityPopUp: BattleScript_EffectImprison:: attackcanceler - attackstring - ppreduce tryimprison BattleScript_ButItFailed attackanimation waitanimation @@ -5021,8 +4223,6 @@ BattleScript_EffectImprison:: BattleScript_EffectRefresh:: attackcanceler - attackstring - ppreduce curestatuswithmove BattleScript_ButItFailed attackanimation waitanimation @@ -5033,9 +4233,8 @@ BattleScript_EffectRefresh:: BattleScript_EffectGrudge:: attackcanceler - attackstring - ppreduce - setuserstatus3 STATUS3_GRUDGE, BattleScript_ButItFailed + jumpifvolatile BS_ATTACKER, VOLATILE_GRUDGE, BattleScript_ButItFailed + setvolatile BS_ATTACKER, VOLATILE_GRUDGE, 2 attackanimation waitanimation printstring STRINGID_PKMNWANTSGRUDGE @@ -5044,9 +4243,7 @@ BattleScript_EffectGrudge:: BattleScript_EffectSnatch:: attackcanceler - trysetsnatch BattleScript_FailedFromAtkString - attackstring - ppreduce + trysetsnatch BattleScript_ButItFailed attackanimation waitanimation pause B_WAIT_TIME_SHORT @@ -5062,8 +4259,6 @@ BattleScript_EffectStruggle:: BattleScript_EffectMudSport:: BattleScript_EffectWaterSport:: attackcanceler - attackstring - ppreduce settypebasedhalvers BattleScript_ButItFailed attackanimation waitanimation @@ -5073,27 +4268,21 @@ BattleScript_EffectWaterSport:: BattleScript_EffectTickle:: attackcanceler - attackstring - ppreduce jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_ATK, MIN_STAT_STAGE, BattleScript_TickleDoMoveAnim jumpifstat BS_TARGET, CMP_EQUAL, STAT_DEF, MIN_STAT_STAGE, BattleScript_CantLowerMultipleStats BattleScript_TickleDoMoveAnim:: accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_DEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_ATK, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TickleTryLowerDef - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_TickleTryLowerDef + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_TickleTryLowerDef, BIT_DEF + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_TickleTryLowerDef printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_TickleTryLowerDef:: - playstatchangeanimation BS_TARGET, BIT_DEF, STAT_CHANGE_NEGATIVE setstatchanger STAT_DEF, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TickleEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_TickleEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_TickleEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_TickleEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_TickleEnd:: @@ -5108,24 +4297,20 @@ BattleScript_CantLowerMultipleStats:: BattleScript_EffectCosmicPower:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_DEF, MAX_STAT_STAGE, BattleScript_CosmicPowerDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats BattleScript_CosmicPowerDoMoveAnim:: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, 0 setstatchanger STAT_DEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CosmicPowerTrySpDef - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CosmicPowerTrySpDef + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CosmicPowerTrySpDef, BIT_SPDEF + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CosmicPowerTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CosmicPowerTrySpDef:: setstatchanger STAT_SPDEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CosmicPowerEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CosmicPowerEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CosmicPowerEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CosmicPowerEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CosmicPowerEnd:: @@ -5133,24 +4318,20 @@ BattleScript_CosmicPowerEnd:: BattleScript_EffectBulkUp:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_BulkUpDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_DEF, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats BattleScript_BulkUpDoMoveAnim:: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF, 0 setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_BulkUpTryDef - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_BulkUpTryDef + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_BulkUpTryDef, BIT_DEF + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_BulkUpTryDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_BulkUpTryDef:: setstatchanger STAT_DEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_BulkUpEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_BulkUpEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_BulkUpEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_BulkUpEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_BulkUpEnd:: @@ -5158,8 +4339,6 @@ BattleScript_BulkUpEnd:: BattleScript_EffectCalmMind:: attackcanceler - attackstring - ppreduce BattleScript_CalmMindTryToRaiseStats:: jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_CalmMindDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats @@ -5167,17 +4346,15 @@ BattleScript_CalmMindDoMoveAnim:: attackanimation waitanimation BattleScript_CalmMindStatRaise:: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_SPDEF, 0 setstatchanger STAT_SPATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CalmMindTrySpDef - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CalmMindTrySpDef + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CalmMindTrySpDef, BIT_SPDEF + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CalmMindTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CalmMindTrySpDef:: setstatchanger STAT_SPDEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CalmMindEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CalmMindEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CalmMindEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CalmMindEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CalmMindEnd:: @@ -5192,25 +4369,21 @@ BattleScript_CantRaiseMultipleStats:: BattleScript_EffectDragonDance:: attackcanceler - attackstring - ppreduce BattleScript_EffectDragonDanceFromStatUp:: jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_DragonDanceDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats BattleScript_DragonDanceDoMoveAnim:: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPEED, 0 setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_DragonDanceTrySpeed - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_DragonDanceTrySpeed + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_DragonDanceTrySpeed, BIT_SPEED + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_DragonDanceTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DragonDanceTrySpeed:: setstatchanger STAT_SPEED, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_DragonDanceEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_DragonDanceEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_DragonDanceEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_DragonDanceEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DragonDanceEnd:: @@ -5218,8 +4391,6 @@ BattleScript_DragonDanceEnd:: BattleScript_EffectCamouflage:: attackcanceler - attackstring - ppreduce settypetoenvironment BattleScript_ButItFailed attackanimation waitanimation @@ -5227,31 +4398,22 @@ BattleScript_EffectCamouflage:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_FaintAttacker:: - tryillusionoff BS_ATTACKER - tryactivategulpmissile - playfaintcry BS_ATTACKER - pause B_WAIT_TIME_LONG - dofaintanimation BS_ATTACKER - printstring STRINGID_ATTACKERFAINTED - cleareffectsonfaint BS_ATTACKER - tryactivatesoulheart - tryactivatereceiver BS_ATTACKER - trytrainerslidefirstdownmsg BS_ATTACKER - return - -BattleScript_FaintTarget:: - tryillusionoff BS_TARGET +BattleScript_FaintBattler:: + tryillusionoff BS_FAINTED tryactivategulpmissile - tryupdateleaderscresttracker - playfaintcry BS_TARGET + playfaintcry BS_FAINTED pause B_WAIT_TIME_LONG - dofaintanimation BS_TARGET - printstring STRINGID_TARGETFAINTED - cleareffectsonfaint BS_TARGET + dofaintanimation BS_FAINTED + copybyte sBATTLER, gBattlerFainted @ for message + printstring STRINGID_BATTLERFAINTED + cleareffectsonfaint BS_FAINTED + trytoclearprimalweather + tryrevertweatherform + flushtextbox + waitanimation + tryactivatereceiver BS_FAINTED tryactivatesoulheart - tryactivatereceiver BS_TARGET - trytrainerslidefirstdownmsg BS_TARGET + trytrainerslidemsgfirstoff BS_FAINTED return BattleScript_GiveExp:: @@ -5297,7 +4459,7 @@ BattleScript_FaintedMonTryChoose: jumpifbyte CMP_EQUAL, gBattleCommunication, PARTY_SIZE, BattleScript_FaintedMonSendOutNew @ Switch PokΓ©mon before opponent atknameinbuff1 - resetswitchinabilitybits BS_ATTACKER + resetswitchinabilitybits hpthresholds2 BS_ATTACKER printstring STRINGID_RETURNMON switchoutabilities BS_ATTACKER @@ -5327,7 +4489,7 @@ BattleScript_FaintedMonSendOutNew: switchinanim BS_FAINTED, FALSE, FALSE waitstate resetplayerfainted - trytrainerslidelastonmsg BS_FAINTED + trytrainerslidemsglaston BS_FAINTED jumpifbytenotequal sSHIFT_SWITCHED, sZero, BattleScript_FaintedMonShiftSwitched BattleScript_FaintedMonSendOutNewEnd: switchineffects BS_FAINTED @@ -5392,32 +4554,32 @@ BattleScript_PayDayMoneyAndPickUpItems:: end2 BattleScript_LocalBattleLost:: - jumpifbattletype BATTLE_TYPE_INGAME_PARTNER, BattleScript_LocalBattleLostPrintWhiteOut jumpifbattletype BATTLE_TYPE_DOME, BattleScript_CheckDomeDrew jumpifbattletype BATTLE_TYPE_FRONTIER, BattleScript_LocalBattleLostPrintTrainersWinText jumpifbattletype BATTLE_TYPE_TRAINER_HILL, BattleScript_LocalBattleLostPrintTrainersWinText jumpifbattletype BATTLE_TYPE_EREADER_TRAINER, BattleScript_LocalBattleLostEnd jumpifhalfword CMP_EQUAL, gTrainerBattleParameter + 2, TRAINER_SECRET_BASE, BattleScript_LocalBattleLostEnd jumpifnowhiteout BattleScript_LocalBattleLostEnd_ + jumpifbattletype BATTLE_TYPE_INGAME_PARTNER, BattleScript_LocalBattleLostPrintWhiteOut BattleScript_LocalBattleLostPrintWhiteOut:: getmoneyreward + printstring STRINGID_PLAYERWHITEOUT + waitmessage B_WAIT_TIME_LONG .if B_WHITEOUT_MONEY >= GEN_4 jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_LocalBattleLostEnd - printstring STRINGID_PLAYERWHITEOUT + printstring STRINGID_PLAYERWHITEOUT2_WILD waitmessage B_WAIT_TIME_LONG - printstring STRINGID_PLAYERWHITEOUT2 + printstring STRINGID_PLAYERWHITEOUT3 waitmessage B_WAIT_TIME_LONG end2 BattleScript_LocalBattleLostEnd:: - printstring STRINGID_PLAYERLOSTTOENEMYTRAINER + printstring STRINGID_PLAYERWHITEOUT2_TRAINER waitmessage B_WAIT_TIME_LONG - printstring STRINGID_PLAYERPAIDPRIZEMONEY + printstring STRINGID_PLAYERWHITEOUT3 waitmessage B_WAIT_TIME_LONG end2 .else - printstring STRINGID_PLAYERWHITEOUT - waitmessage B_WAIT_TIME_LONG - printstring STRINGID_PLAYERWHITEOUT2 + printstring STRINGID_PLAYERWHITEOUT3 waitmessage B_WAIT_TIME_LONG BattleScript_LocalBattleLostEnd:: end2 @@ -5427,9 +4589,9 @@ BattleScript_CheckDomeDrew:: jumpifbyte CMP_EQUAL, gBattleOutcome, B_OUTCOME_DREW, BattleScript_LocalBattleLostEnd_ BattleScript_LocalBattleLostPrintTrainersWinText:: jumpifnotbattletype BATTLE_TYPE_TRAINER, BattleScript_LocalBattleLostPrintWhiteOut - returnopponentmon1toball BS_ATTACKER + returnopponentmon1toball waitstate - returnopponentmon2toball BS_ATTACKER + returnopponentmon2toball waitstate trainerslidein BS_OPPONENT1 waitstate @@ -5446,9 +4608,9 @@ BattleScript_LocalBattleLostEnd_:: end2 BattleScript_FrontierLinkBattleLost:: - returnopponentmon1toball BS_ATTACKER + returnopponentmon1toball waitstate - returnopponentmon2toball BS_ATTACKER + returnopponentmon2toball waitstate trainerslidein BS_OPPONENT1 waitstate @@ -5475,7 +4637,7 @@ BattleScript_LinkBattleWonOrLostWaitEnd:: end2 BattleScript_TowerLinkBattleWon:: - playtrainerdefeatbgm BS_ATTACKER + playtrainerdefeatedmusic printstring STRINGID_BATTLEEND waitmessage B_WAIT_TIME_LONG trainerslidein BS_OPPONENT1 @@ -5560,11 +4722,11 @@ BattleScript_ActionSwitch:: end2 BattleScript_DoSwitchOut:: - switchoutabilities BS_ATTACKER undodynamax BS_ATTACKER waitstate returnatktoball waitstate + switchoutabilities BS_ATTACKER drawpartystatussummary BS_ATTACKER switchhandleorder BS_ATTACKER, 1 getswitchedmondata BS_ATTACKER @@ -5602,10 +4764,12 @@ BattleScript_AskToLearnMove:: waitstate setbyte sLEARNMOVE_STATE, 0 yesnoboxlearnmove BattleScript_ForgotAndLearnedNewMove +.if P_ASK_MOVE_CONFIRMATION == TRUE printstring STRINGID_STOPLEARNINGMOVE waitstate setbyte sLEARNMOVE_STATE, 0 yesnoboxstoplearningmove BattleScript_AskToLearnMove +.endif printstring STRINGID_DIDNOTLEARNMOVE goto BattleScript_TryLearnMoveLoop BattleScript_ForgotAndLearnedNewMove:: @@ -5617,7 +4781,7 @@ BattleScript_LearnedNewMove:: fanfare MUS_LEVEL_UP printstring STRINGID_PKMNLEARNEDMOVE waitmessage B_WAIT_TIME_LONG - updatechoicemoveonlvlup BS_ATTACKER + updatechoicemoveonlvlup goto BattleScript_TryLearnMoveLoop BattleScript_LearnMoveReturn:: return @@ -5652,11 +4816,11 @@ BattleScript_FogEnded_Ret:: BattleScript_IceBodyHeal:: call BattleScript_AbilityPopUp playanimation BS_ATTACKER, B_ANIM_SIMPLE_HEAL - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_ICEBODYHPGAIN waitmessage B_WAIT_TIME_LONG - end3 + end2 BattleScript_OverworldStatusStarts:: printfromtable gStartingStatusStringIds @@ -5720,7 +4884,7 @@ BattleScript_MagicRoomEnds:: setbyte gBattlerTarget, 0 BattleScript_MagicRoomHealingItemsLoop: copyarraywithindex gBattlerAttacker, gBattlerByTurnOrder, gBattlerTarget, 1 - tryrestorehpberry + tryactivateitem BS_ATTACKER, ACTIVATION_ON_USABLE_AGAIN addbyte gBattlerTarget, 1 jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_MagicRoomHealingItemsLoop end2 @@ -5729,6 +4893,7 @@ BattleScript_TerrainEnds_Ret:: printfromtable gTerrainStringIds waitmessage B_WAIT_TIME_LONG playanimation BS_ATTACKER, B_ANIM_RESTORE_BG + tryboosterenergy ON_TERRAIN return BattleScript_TerrainEnds:: @@ -5770,17 +4935,19 @@ BattleScript_LeechSeedTurnDrainLiquidOoze:: copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp copybyte gBattlerAttacker, gBattlerTarget @ needed to get liquid ooze message correct + jumpifability BS_TARGET, ABILITY_MAGIC_GUARD, BattleScript_LeechSeedTurnDrainHealBlockEnd2 goto BattleScript_LeechSeedTurnDrainGainHp BattleScript_LeechSeedTurnDrainHealBlock:: call BattleScript_LeechSeedTurnDrain +BattleScript_LeechSeedTurnDrainHealBlockEnd2: end2 BattleScript_LeechSeedTurnDrainRecovery:: call BattleScript_LeechSeedTurnDrain BattleScript_LeechSeedTurnDrainGainHp: - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printfromtable gLeechSeedStringIds waitmessage B_WAIT_TIME_LONG tryfaintmon BS_TARGET @@ -5788,8 +4955,8 @@ BattleScript_LeechSeedTurnDrainGainHp: BattleScript_LeechSeedTurnDrain: playanimation BS_ATTACKER, B_ANIM_LEECH_SEED_DRAIN, sB_ANIM_ARG1 - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE tryfaintmon BS_ATTACKER return @@ -5800,7 +4967,7 @@ BattleScript_BideStoringEnergy:: BattleScript_BideAttack:: attackcanceler - clearstatusfromeffect BS_ATTACKER, MOVE_EFFECT_CHARGING + clearvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS printstring STRINGID_PKMNUNLEASHEDENERGY waitmessage B_WAIT_TIME_LONG accuracycheck BattleScript_MoveMissed, ACC_CURR_MOVE @@ -5814,8 +4981,8 @@ BattleScript_BideAttack:: effectivenesssound hitanimation BS_TARGET waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE + datahpupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE resultmessage waitmessage B_WAIT_TIME_LONG tryfaintmon BS_TARGET @@ -5823,7 +4990,7 @@ BattleScript_BideAttack:: BattleScript_BideNoEnergyToAttack:: attackcanceler - clearstatusfromeffect BS_ATTACKER, MOVE_EFFECT_CHARGING + clearvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS printstring STRINGID_PKMNUNLEASHEDENERGY waitmessage B_WAIT_TIME_LONG goto BattleScript_ButItFailed @@ -5851,7 +5018,7 @@ BattleScript_RoarSuccessSwitch_Ret: BattleScript_RoarSuccessEndBattle:: call BattleScript_RoarSuccessRet setbyte sSWITCH_CASE, B_SWITCH_NORMAL - setoutcomeonteleport BS_ATTACKER + setteleportoutcome BS_ATTACKER finishaction BattleScript_RoarSuccessRet: @@ -5860,9 +5027,9 @@ BattleScript_RoarSuccessRet: attackanimation waitanimation BattleScript_RoarSuccessRet_Ret: - switchoutabilities BS_TARGET returntoball BS_TARGET, FALSE waitstate + switchoutabilities BS_TARGET return BattleScript_WeaknessPolicy:: @@ -5872,17 +5039,15 @@ BattleScript_WeaknessPolicy:: BattleScript_WeaknessPolicyAtk: playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_WeaknessPolicySpAtk - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_WeaknessPolicySpAtk + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_WeaknessPolicySpAtk, BIT_SPATK + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_WeaknessPolicySpAtk printstring STRINGID_USINGITEMSTATOFPKMNROSE waitmessage B_WAIT_TIME_LONG BattleScript_WeaknessPolicySpAtk: setstatchanger STAT_SPATK, 2, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_WeaknessPolicyRemoveItem - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_WeaknessPolicyRemoveItem + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_WeaknessPolicyRemoveItem + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_WeaknessPolicyRemoveItem printstring STRINGID_USINGITEMSTATOFPKMNROSE waitmessage B_WAIT_TIME_LONG BattleScript_WeaknessPolicyRemoveItem: @@ -5892,13 +5057,11 @@ BattleScript_WeaknessPolicyEnd: BattleScript_TargetItemStatRaise:: copybyte sBATTLER, gBattlerTarget - statbuffchange 0, BattleScript_TargetItemStatRaiseRemoveItemRet - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_TargetItemStatRaiseRemoveItemRet + statbuffchange BS_TARGET, STAT_CHANGE_ONLY_CHECKING, BattleScript_TargetItemStatRaiseRemoveItemRet + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_TargetItemStatRaiseRemoveItemRet playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT waitanimation - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 - waitanimation + statbuffchange BS_TARGET, 0, BattleScript_TargetItemStatRaiseRemoveItemRet printstring STRINGID_USINGITEMSTATOFPKMNROSE waitmessage B_WAIT_TIME_LONG removeitem BS_TARGET @@ -5907,13 +5070,11 @@ BattleScript_TargetItemStatRaiseRemoveItemRet: BattleScript_AttackerItemStatRaise:: copybyte sBATTLER, gBattlerAttacker - statbuffchange MOVE_EFFECT_AFFECTS_USER, BattleScript_AttackerItemStatRaiseRet - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AttackerItemStatRaiseRet + statbuffchange BS_ATTACKER, STAT_CHANGE_ONLY_CHECKING, BattleScript_AttackerItemStatRaiseRet + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_AttackerItemStatRaiseRet playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT waitanimation - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 - waitanimation + statbuffchange BS_ATTACKER, 0, BattleScript_AttackerItemStatRaiseRet printstring STRINGID_USINGITEMSTATOFPKMNROSE waitmessage B_WAIT_TIME_LONG removeitem BS_ATTACKER @@ -5927,7 +5088,7 @@ BattleScript_MistProtected:: return BattleScript_RageIsBuilding:: - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_RageIsBuildingEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_RageIsBuildingEnd printstring STRINGID_PKMNRAGEBUILDING waitmessage B_WAIT_TIME_LONG BattleScript_RageIsBuildingEnd: @@ -5949,6 +5110,14 @@ BattleScript_DisabledNoMore:: BattleScript_SelectingDisabledMoveInPalace:: printstring STRINGID_PKMNMOVEISDISABLED + goto BattleScript_SelectingUnusableMoveInPalace + +BattleScript_EncoredMove:: + printselectionstring STRINGID_PKMNGOTENCOREDMOVE + endselectionscript + +BattleScript_EncoredMoveInPalace:: + printselectionstring STRINGID_PKMNGOTENCOREDMOVE BattleScript_SelectingUnusableMoveInPalace:: moveendto MOVEEND_NEXT_TARGET end @@ -5961,16 +5130,14 @@ BattleScript_EncoredNoMore:: BattleScript_DestinyBondTakesLife:: printstring STRINGID_PKMNTOOKFOE waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE tryfaintmon BS_ATTACKER return BattleScript_DmgHazardsOnAttacker:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE call BattleScript_PrintHurtByDmgHazards tryfaintmon BS_ATTACKER tryfaintmon_spikes BS_ATTACKER, BattleScript_DmgHazardsOnAttackerFainted @@ -5983,9 +5150,8 @@ BattleScript_DmgHazardsOnAttackerFainted:: goto BattleScript_HandleFaintedMon BattleScript_DmgHazardsOnTarget:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE call BattleScript_PrintHurtByDmgHazards tryfaintmon BS_TARGET tryfaintmon_spikes BS_TARGET, BattleScript_DmgHazardsOnTargetFainted @@ -5998,9 +5164,8 @@ BattleScript_DmgHazardsOnTargetFainted:: goto BattleScript_HandleFaintedMon BattleScript_DmgHazardsOnBattlerScripting:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_SCRIPTING - datahpupdate BS_SCRIPTING + healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE call BattleScript_PrintHurtByDmgHazards tryfaintmon BS_SCRIPTING tryfaintmon_spikes BS_SCRIPTING, BattleScript_DmgHazardsOnBattlerScriptingFainted @@ -6013,9 +5178,8 @@ BattleScript_DmgHazardsOnBattlerScriptingFainted:: goto BattleScript_HandleFaintedMon BattleScript_DmgHazardsOnFaintedBattler:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_FAINTED - datahpupdate BS_FAINTED + healthbarupdate BS_FAINTED, PASSIVE_HP_UPDATE + datahpupdate BS_FAINTED, PASSIVE_HP_UPDATE call BattleScript_PrintHurtByDmgHazards tryfaintmon BS_FAINTED tryfaintmon_spikes BS_FAINTED, BattleScript_DmgHazardsOnFaintedBattlerFainted @@ -6061,15 +5225,8 @@ BattleScript_StickyWebOnSwitchIn:: printstring STRINGID_STICKYWEBSWITCHIN waitmessage B_WAIT_TIME_LONG jumpifability BS_TARGET, ABILITY_MIRROR_ARMOR, BattleScript_MirrorArmorReflectStickyWeb - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_StickyWebOnSwitchInEnd - jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_StickyWebOnSwitchInStatAnim - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_StickyWebOnSwitchInEnd - pause B_WAIT_TIME_SHORT - goto BattleScript_StickyWebOnSwitchInPrintStatMsg -BattleScript_StickyWebOnSwitchInStatAnim: - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 -BattleScript_StickyWebOnSwitchInPrintStatMsg: + statbuffchange BS_TARGET, STAT_CHANGE_CHECK_PREVENTION | STAT_CHANGE_ALLOW_PTR, BattleScript_StickyWebOnSwitchInEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGE_EMPTY, BattleScript_StickyWebOnSwitchInEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_StickyWebOnSwitchInEnd: @@ -6081,9 +5238,8 @@ BattleScript_StickyWebOnSwitchInEnd: BattleScript_PerishSongTakesLife:: printstring STRINGID_PKMNPERISHCOUNTFELL waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE tryfaintmon BS_ATTACKER end2 @@ -6091,20 +5247,18 @@ BattleScript_PerishBodyActivates:: call BattleScript_AbilityPopUp printstring STRINGID_PKMNSWILLPERISHIN3TURNS waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE return BattleScript_GulpMissileGorging:: call BattleScript_AbilityPopUp playanimation BS_ATTACKER, B_ANIM_GULP_MISSILE waitanimation - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE effectivenesssound hitanimation BS_ATTACKER waitstate jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_GulpMissileNoDmgGorging - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE tryfaintmon BS_ATTACKER jumpiffainted BS_ATTACKER, TRUE, BattleScript_GulpMissileNoSecondEffectGorging BattleScript_GulpMissileNoDmgGorging: @@ -6112,7 +5266,7 @@ BattleScript_GulpMissileNoDmgGorging: playanimation BS_TARGET, B_ANIM_FORM_CHANGE waitanimation swapattackerwithtarget - seteffectprimary MOVE_EFFECT_PARALYSIS + seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_PARALYSIS swapattackerwithtarget return BattleScript_GulpMissileNoSecondEffectGorging: @@ -6125,13 +5279,12 @@ BattleScript_GulpMissileGulping:: call BattleScript_AbilityPopUp playanimation BS_ATTACKER, B_ANIM_GULP_MISSILE waitanimation - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE effectivenesssound hitanimation BS_ATTACKER waitstate jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_GulpMissileNoDmgGulping - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE tryfaintmon BS_ATTACKER jumpiffainted BS_ATTACKER, TRUE, BattleScript_GulpMissileNoSecondEffectGulping BattleScript_GulpMissileNoDmgGulping: @@ -6140,12 +5293,10 @@ BattleScript_GulpMissileNoDmgGulping: waitanimation swapattackerwithtarget @ to make gStatDownStringIds down below print the right battler setstatchanger STAT_DEF, 1, TRUE - statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_GulpMissileGulpingEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_GulpMissileGulpingTargetDefenseCantGoLower - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_TARGET, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_GulpMissileGulpingEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG +BattleScript_GulpMissileGulpingEnd: swapattackerwithtarget @ restore the battlers, just in case return BattleScript_GulpMissileNoSecondEffectGulping: @@ -6153,12 +5304,6 @@ BattleScript_GulpMissileNoSecondEffectGulping: playanimation BS_TARGET, B_ANIM_FORM_CHANGE waitanimation return -BattleScript_GulpMissileGulpingTargetDefenseCantGoLower: - printstring STRINGID_STATSWONTDECREASE - waitmessage B_WAIT_TIME_LONG -BattleScript_GulpMissileGulpingEnd: - swapattackerwithtarget @ restore the battlers, just in case - return BattleScript_SeedSowerActivates:: pause B_WAIT_TIME_SHORT @@ -6169,34 +5314,39 @@ BattleScript_SeedSowerActivates:: call BattleScript_ActivateTerrainEffects return -BattleScript_AngerShellActivates:: +BattleScript_BerserkActivates:: saveattacker - copybyte gBattlerAttacker, gBattlerTarget + copybyte gBattlerAttacker, gEffectBattler + call BattleScript_AbilityPopUp + statbuffchange BS_EFFECT_BATTLER, STAT_CHANGE_CERTAIN, BattleScript_BerserkActivatesTryBerry + call BattleScript_StatUp +BattleScript_BerserkActivatesTryBerry: + restoreattacker + return + +BattleScript_AngerShellActivates:: call BattleScript_AbilityPopUp - jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_AngerShellTryDef - jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_AngerShellTryDef - jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_SPEED, MAX_STAT_STAGE, BattleScript_AngerShellTryDef - jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_DEF, MIN_STAT_STAGE, BattleScript_AngerShellTryDef - jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPDEF, MIN_STAT_STAGE, BattleScript_RestoreAttackerButItFailed + jumpifstat BS_EFFECT_BATTLER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_AngerShellTryDef + jumpifstat BS_EFFECT_BATTLER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_AngerShellTryDef + jumpifstat BS_EFFECT_BATTLER, CMP_LESS_THAN, STAT_SPEED, MAX_STAT_STAGE, BattleScript_AngerShellTryDef + jumpifstat BS_EFFECT_BATTLER, CMP_GREATER_THAN, STAT_DEF, MIN_STAT_STAGE, BattleScript_AngerShellTryDef + jumpifstat BS_EFFECT_BATTLER, CMP_EQUAL, STAT_SPDEF, MIN_STAT_STAGE, BattleScript_RestoreAttackerButItFailed BattleScript_AngerShellTryDef:: - setbyte sSTAT_ANIM_PLAYED, FALSE - modifybattlerstatstage BS_ATTACKER, STAT_DEF, DECREASE, 1, BattleScript_AngerShellTrySpDef, ANIM_ON + modifybattlerstatstage BS_EFFECT_BATTLER, STAT_DEF, DECREASE, 1, BattleScript_AngerShellTrySpDef, ANIM_ON BattleScript_AngerShellTrySpDef: - modifybattlerstatstage BS_ATTACKER, STAT_SPDEF, DECREASE, 1, BattleScript_AngerShellTryAttack, ANIM_ON + modifybattlerstatstage BS_EFFECT_BATTLER, STAT_SPDEF, DECREASE, 1, BattleScript_AngerShellTryAttack, ANIM_ON BattleScript_AngerShellTryAttack: - setbyte sSTAT_ANIM_PLAYED, FALSE - modifybattlerstatstage BS_ATTACKER, STAT_ATK, INCREASE, 1, BattleScript_AngerShellTrySpAtk, ANIM_ON + modifybattlerstatstage BS_EFFECT_BATTLER, STAT_ATK, INCREASE, 1, BattleScript_AngerShellTrySpAtk, ANIM_ON BattleScript_AngerShellTrySpAtk: - modifybattlerstatstage BS_ATTACKER, STAT_SPATK, INCREASE, 1, BattleScript_AngerShellTrySpeed, ANIM_ON + modifybattlerstatstage BS_EFFECT_BATTLER, STAT_SPATK, INCREASE, 1, BattleScript_AngerShellTrySpeed, ANIM_ON BattleScript_AngerShellTrySpeed: - modifybattlerstatstage BS_ATTACKER, STAT_SPEED, INCREASE, 1, BattleScript_AngerShellRet, ANIM_ON + modifybattlerstatstage BS_EFFECT_BATTLER, STAT_SPEED, INCREASE, 1, BattleScript_AngerShellRet, ANIM_ON BattleScript_AngerShellRet: - restoreattacker return BattleScript_WindPowerActivates:: call BattleScript_AbilityPopUp - setcharge BS_TARGET + setvolatile BS_TARGET, VOLATILE_CHARGE_TIMER, 1 printstring STRINGID_BEINGHITCHARGEDPKMNWITHPOWER waitmessage B_WAIT_TIME_LONG return @@ -6208,18 +5358,16 @@ BattleScript_ToxicDebrisActivates:: printstring STRINGID_POISONSPIKESSCATTERED waitmessage B_WAIT_TIME_LONG BattleScript_ToxicDebrisRet: - copybyte sBATTLER, gBattlerTarget - copybyte gBattlerTarget, gBattlerAttacker - copybyte gBattlerAttacker, sBATTLER + restoretarget + restoreattacker return BattleScript_EarthEaterActivates:: call BattleScript_AbilityPopUp pause B_WAIT_TIME_LONG tryhealquarterhealth BS_TARGET, BattleScript_EarthEaterRet - orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG BattleScript_EarthEaterRet: @@ -6240,30 +5388,28 @@ BattleScript_AllStatsUp:: jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_AllStatsUpAtk jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_AllStatsUpRet BattleScript_AllStatsUpAtk:: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_SPEED | BIT_SPATK | BIT_SPDEF, 0 setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpDef + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpDef, BIT_DEF | BIT_SPEED | BIT_SPATK | BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpDef:: setstatchanger STAT_DEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpeed + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpeed, BIT_SPEED | BIT_SPATK | BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpSpeed:: setstatchanger STAT_SPEED, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpAtk + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpAtk, BIT_SPATK | BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpSpAtk:: setstatchanger STAT_SPATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpDef + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpDef, BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpSpDef:: setstatchanger STAT_SPDEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpRet + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpRet printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpRet:: @@ -6284,58 +5430,18 @@ BattleScript_LeechSeedFree:: waitmessage B_WAIT_TIME_LONG return -BattleScript_SpikesFree:: - printstring STRINGID_PKMNBLEWAWAYSPIKES - waitmessage B_WAIT_TIME_LONG - return - -BattleScript_ToxicSpikesFree:: - printstring STRINGID_PKMNBLEWAWAYTOXICSPIKES +BattleScript_SpinHazardsAway:: + printfromtable gSpinHazardsStringIds waitmessage B_WAIT_TIME_LONG return -BattleScript_StickyWebFree:: - printstring STRINGID_PKMNBLEWAWAYSTICKYWEB +BattleScript_DefogClearHazards:: + printfromtable gDefogHazardsStringIds waitmessage B_WAIT_TIME_LONG return -BattleScript_StealthRockFree:: - printstring STRINGID_PKMNBLEWAWAYSTEALTHROCK - waitmessage B_WAIT_TIME_LONG - return - -BattleScript_SteelsurgeFree:: - printstring STRINGID_PKMNBLEWAWAYSHARPSTEEL - waitmessage B_WAIT_TIME_LONG - return - -BattleScript_SpikesDefog:: - printstring STRINGID_SPIKESDISAPPEAREDFROMTEAM - waitmessage B_WAIT_TIME_LONG - return - -BattleScript_ToxicSpikesDefog:: - printstring STRINGID_TOXICSPIKESDISAPPEAREDFROMTEAM - waitmessage B_WAIT_TIME_LONG - return - -BattleScript_StickyWebDefog:: - printstring STRINGID_STICKYWEBDISAPPEAREDFROMTEAM - waitmessage B_WAIT_TIME_LONG - return - -BattleScript_StealthRockDefog:: - printstring STRINGID_STEALTHROCKDISAPPEAREDFROMTEAM - waitmessage B_WAIT_TIME_LONG - return - -BattleScript_SteelsurgeDefog:: - printstring STRINGID_SHARPSTEELDISAPPEAREDFROMTEAM - waitmessage B_WAIT_TIME_LONG - return - -BattleScript_MonTookFutureAttack:: - printstring STRINGID_PKMNTOOKATTACK +BattleScript_MonTookFutureAttack:: + printstring STRINGID_PKMNTOOKATTACK waitmessage B_WAIT_TIME_LONG jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_FUTURE_SIGHT, BattleScript_CheckDoomDesireMiss accuracycheck BattleScript_FutureAttackMiss, MOVE_FUTURE_SIGHT @@ -6356,8 +5462,8 @@ BattleScript_DoFutureAttackHit:: effectivenesssound hitanimation BS_TARGET waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE + datahpupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE critmessage waitmessage B_WAIT_TIME_LONG BattleScript_DoFutureAttackResult: @@ -6366,17 +5472,21 @@ BattleScript_DoFutureAttackResult: tryfaintmon BS_TARGET checkteamslost BattleScript_FutureAttackEnd BattleScript_FutureAttackEnd:: + moveendcase MOVEEND_SET_VALUES moveendcase MOVEEND_RAGE moveendcase MOVEEND_ABILITIES - moveendfromto MOVEEND_ITEM_EFFECTS_ALL, MOVEEND_UPDATE_LAST_MOVES - setmoveresultflags 0 - end2 + moveendcase MOVEEND_COLOR_CHANGE + moveendcase MOVEEND_ITEM_EFFECTS_TARGET + moveendfromto MOVEEND_SYMBIOSIS, MOVEEND_UPDATE_LAST_MOVES + goto BattleScript_FutureAttackClearResults BattleScript_FutureAttackMiss:: pause B_WAIT_TIME_SHORT setmoveresultflags MOVE_RESULT_FAILED resultmessage waitmessage B_WAIT_TIME_LONG +BattleScript_FutureAttackClearResults: setmoveresultflags 0 + clearspecialstatuses end2 BattleScript_NoMovesLeft:: @@ -6388,7 +5498,7 @@ BattleScript_SelectingMoveWithNoPP:: endselectionscript BattleScript_NoPPForMove:: - attackstring + printattackstring pause B_WAIT_TIME_SHORT printstring STRINGID_BUTNOPPLEFT waitmessage B_WAIT_TIME_LONG @@ -6500,9 +5610,8 @@ BattleScript_WishComesTrue:: playanimation BS_TARGET, B_ANIM_WISH_HEAL printstring STRINGID_PKMNWISHCAMETRUE waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG end2 @@ -6528,9 +5637,8 @@ BattleScript_IngrainTurnHeal:: printstring STRINGID_PKMNABSORBEDNUTRIENTS BattleScript_TurnHeal: waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE end2 BattleScript_AquaRingHeal:: @@ -6551,38 +5659,29 @@ BattleScript_PrintMonIsRootedRet:: return BattleScript_AtkDefDown:: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_ATK, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_ATK, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE setstatchanger STAT_ATK, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_AtkDefDownTryDef - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_AtkDefDownTryDef + statbuffchange BS_ATTACKER, STAT_CHANGE_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_AtkDefDownTryDef, BIT_DEF + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_AtkDefDownTryDef printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AtkDefDownTryDef: - playstatchangeanimation BS_ATTACKER, BIT_DEF, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE setstatchanger STAT_DEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_AtkDefDownRet - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_AtkDefDownRet + statbuffchange BS_ATTACKER, STAT_CHANGE_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_AtkDefDownRet printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AtkDefDownRet: return BattleScript_DefSpDefDown:: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_DEF, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE setstatchanger STAT_DEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_DefSpDefDownTrySpDef - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_DefSpDefDownTrySpDef + statbuffchange BS_ATTACKER, STAT_CHANGE_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_DefSpDefDownTrySpDef, BIT_SPDEF + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_DefSpDefDownTrySpDef printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DefSpDefDownTrySpDef:: - playstatchangeanimation BS_ATTACKER, BIT_SPDEF, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE setstatchanger STAT_SPDEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_DefSpDefDownRet - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_DefSpDefDownRet + statbuffchange BS_ATTACKER, STAT_CHANGE_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_DefSpDefDownRet + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_DefSpDefDownRet printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DefSpDefDownRet:: @@ -6592,17 +5691,15 @@ BattleScript_DefDownSpeedUp:: jumpifstat BS_ATTACKER, CMP_GREATER_THAN, STAT_DEF, MIN_STAT_STAGE, BattleScript_DefDownSpeedUpTryDef jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_DefDownSpeedUpRet BattleScript_DefDownSpeedUpTryDef:: - playstatchangeanimation BS_ATTACKER, BIT_DEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT setstatchanger STAT_DEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | MOVE_EFFECT_CERTAIN, BattleScript_DefDownSpeedUpTrySpeed - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_DefDownSpeedUpTrySpeed + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_CERTAIN, BattleScript_DefDownSpeedUpTrySpeed + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_DefDownSpeedUpTrySpeed printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DefDownSpeedUpTrySpeed: - playstatchangeanimation BS_ATTACKER, BIT_SPEED, 0 setstatchanger STAT_SPEED, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | MOVE_EFFECT_CERTAIN, BattleScript_DefDownSpeedUpRet - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_DefDownSpeedUpRet + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_CERTAIN, BattleScript_DefDownSpeedUpRet + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_DefDownSpeedUpRet printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DefDownSpeedUpRet:: @@ -6633,31 +5730,21 @@ BattleScript_GrudgeTakesPp:: return BattleScript_MagicBounce:: - attackstring - ppreduce pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp printstring STRINGID_PKMNMOVEBOUNCEDABILITY waitmessage B_WAIT_TIME_LONG setmagiccoattarget - orword gHitMarker, HITMARKER_ATTACKSTRING_PRINTED | HITMARKER_NO_PPDEDUCT | HITMARKER_ALLOW_NO_PP - bicword gHitMarker, HITMARKER_NO_ATTACKSTRING return BattleScript_MagicCoat:: - attackstring - ppreduce pause B_WAIT_TIME_SHORT setmagiccoattarget printstring STRINGID_PKMNMOVEBOUNCED waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_ATTACKSTRING_PRINTED | HITMARKER_NO_PPDEDUCT | HITMARKER_ALLOW_NO_PP - bicword gHitMarker, HITMARKER_NO_ATTACKSTRING return BattleScript_MagicCoatPrankster:: - attackstring - ppreduce pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNMOVEBOUNCED waitmessage B_WAIT_TIME_LONG @@ -6667,13 +5754,10 @@ BattleScript_MagicCoatPrankster:: goto BattleScript_MoveEnd BattleScript_SnatchedMove:: - attackstring - ppreduce snatchsetbattlers playanimation BS_TARGET, B_ANIM_SNATCH_MOVE printstring STRINGID_PKMNSNATCHEDMOVE waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_ATTACKSTRING_PRINTED | HITMARKER_NO_PPDEDUCT | HITMARKER_ALLOW_NO_PP swapattackerwithtarget return @@ -6743,16 +5827,15 @@ BattleScript_PowerConstruct:: flushtextbox printstring STRINGID_POWERCONSTRUCTPRESENCEOFMANY waitmessage B_WAIT_TIME_SHORT - copybyte gBattlerAbility, gBattlerAttacker - call BattleScript_AbilityPopUp - handleformchange BS_ATTACKER, 0 - handleformchange BS_ATTACKER, 1 - playanimation BS_ATTACKER, B_ANIM_POWER_CONSTRUCT + call BattleScript_AbilityPopUpScripting + handleformchange BS_SCRIPTING, 0 + handleformchange BS_SCRIPTING, 1 + playanimation BS_SCRIPTING, B_ANIM_POWER_CONSTRUCT waitanimation - handleformchange BS_ATTACKER, 2 + handleformchange BS_SCRIPTING, 2 printstring STRINGID_POWERCONSTRUCTTRANSFORM waitmessage B_WAIT_TIME_SHORT - end3 + end2 BattleScript_UltraBurst:: flushtextbox @@ -6769,51 +5852,44 @@ BattleScript_UltraBurst:: end3 BattleScript_GulpMissileFormChange:: - call BattleScript_AttackerFormChange + call BattleScript_BattlerFormChange goto BattleScript_FromTwoTurnMovesSecondTurnRet -BattleScript_AttackerFormChange:: +BattleScript_BattlerFormChange:: pause 5 - copybyte gBattlerAbility, gBattlerAttacker - call BattleScript_AbilityPopUp + call BattleScript_AbilityPopUpScripting flushtextbox -BattleScript_AttackerFormChangeNoPopup:: - handleformchange BS_ATTACKER, 0 - handleformchange BS_ATTACKER, 1 - playanimation BS_ATTACKER, B_ANIM_FORM_CHANGE +BattleScript_BattlerFormChangeNoPopup: + handleformchange BS_SCRIPTING, 0 + handleformchange BS_SCRIPTING, 1 + playanimation BS_SCRIPTING, B_ANIM_FORM_CHANGE waitanimation - handleformchange BS_ATTACKER, 2 + handleformchange BS_SCRIPTING, 2 return -BattleScript_AttackerFormChangeEnd3:: - call BattleScript_AttackerFormChange +BattleScript_BattlerFormChangeEnd3:: + call BattleScript_BattlerFormChange end3 -BattleScript_AttackerFormChangeEnd3NoPopup:: - call BattleScript_AttackerFormChangeNoPopup - end3 +BattleScript_BattlerFormChangeEnd3NoPopup:: + call BattleScript_BattlerFormChangeNoPopup + end2 + +BattleScript_BattlerFormChangeEnd2:: + call BattleScript_BattlerFormChange + end2 -BattleScript_AttackerFormChangeWithString:: +BattleScript_BattlerFormChangeWithStringEnd3:: pause 5 - copybyte gBattlerAbility, gBattlerAttacker - call BattleScript_AbilityPopUp + call BattleScript_AbilityPopUpScripting flushtextbox -BattleScript_AttackerFormChangeWithStringNoPopup:: - handleformchange BS_ATTACKER, 0 - handleformchange BS_ATTACKER, 1 - playanimation BS_ATTACKER, B_ANIM_FORM_CHANGE + handleformchange BS_SCRIPTING, 0 + handleformchange BS_SCRIPTING, 1 + playanimation BS_SCRIPTING, B_ANIM_FORM_CHANGE waitanimation - handleformchange BS_ATTACKER, 2 + handleformchange BS_SCRIPTING, 2 printstring STRINGID_PKMNTRANSFORMED waitmessage B_WAIT_TIME_LONG - return - -BattleScript_AttackerFormChangeWithStringEnd3:: - call BattleScript_AttackerFormChangeWithString - end3 - -BattleScript_AttackerFormChangeWithStringEnd3NoPopup:: - call BattleScript_AttackerFormChangeWithStringNoPopup end3 BattleScript_AttackerFormChangeMoveEffect:: @@ -6832,7 +5908,7 @@ BattleScript_BallFetch:: call BattleScript_AbilityPopUp printstring STRINGID_FETCHEDPOKEBALL waitmessage B_WAIT_TIME_LONG - end3 + end2 BattleScript_CudChewActivates:: pause B_WAIT_TIME_SHORTEST @@ -6840,13 +5916,13 @@ BattleScript_CudChewActivates:: setbyte sBERRY_OVERRIDE, 1 @ override the requirements for eating berries consumeberry BS_ATTACKER, FALSE setbyte sBERRY_OVERRIDE, 0 - end3 + end2 BattleScript_ApplyDisguiseFormChangeHPLoss:: -.if B_DISGUISE_HP_LOSS >= GEN_8 - healthbarupdate BS_SCRIPTING - datahpupdate BS_SCRIPTING -.endif + jumpifgenconfiglowerthan CONFIG_DISGUISE_HP_LOSS, GEN_8, BattleScript_ApplyDisguiseFormChangeHPLossReturn + healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE +BattleScript_ApplyDisguiseFormChangeHPLossReturn: return BattleScript_TargetFormChangeNoPopup: @@ -6879,19 +5955,6 @@ BattleScript_TargetFormChangeWithStringNoPopup:: waitmessage B_WAIT_TIME_LONG return -BattleScript_BattlerFormChangeWithStringEnd3:: - pause 5 - call BattleScript_AbilityPopUpScripting - flushtextbox - handleformchange BS_SCRIPTING, 0 - handleformchange BS_SCRIPTING, 1 - playanimation BS_SCRIPTING, B_ANIM_FORM_CHANGE, NULL - waitanimation - handleformchange BS_SCRIPTING, 2 - printstring STRINGID_PKMNTRANSFORMED - waitmessage B_WAIT_TIME_LONG - end3 - BattleScript_IllusionOffAndTerastallization:: call BattleScript_IllusionOff goto BattleScript_Terastallization @@ -6901,12 +5964,14 @@ BattleScript_IllusionOffEnd3:: end3 BattleScript_IllusionOff:: - spriteignore0hp TRUE + setspriteignore0hp TRUE + call BattleScript_SwapFromSubstitute playanimation BS_SCRIPTING, B_ANIM_ILLUSION_OFF waitanimation - updatenick BS_SCRIPTING + call BattleScript_SwapToSubstitute + updatenick waitstate - spriteignore0hp FALSE + setspriteignore0hp FALSE printstring STRINGID_ILLUSIONWOREOFF waitmessage B_WAIT_TIME_LONG return @@ -6918,13 +5983,11 @@ BattleScript_CottonDownActivates:: swapattackerwithtarget setbyte gBattlerTarget, 0 BattleScript_CottonDownLoop: - jumpiffainted BS_TARGET, TRUE, BattleScript_CottonDownLoopIncrement + jumpifabsent BS_TARGET, BattleScript_CottonDownLoopIncrement setstatchanger STAT_SPEED, 1, TRUE jumpifbyteequal gBattlerTarget, gEffectBattler, BattleScript_CottonDownLoopIncrement - statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_CottonDownLoopIncrement - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_CottonDownTargetSpeedCantGoLower - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_TARGET, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_CottonDownLoopIncrement + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CottonDownTargetSpeedCantGoLower printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_CottonDownLoopIncrement @@ -6949,9 +6012,8 @@ BattleScript_AftermathDmg:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUpScripting jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_AftermathDmgRet - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_AFTERMATHDMG waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER @@ -6983,7 +6045,7 @@ BattleScript_MoveUsedWokeUp:: BattleScript_MonWokeUpInUproar:: printstring STRINGID_PKMNWOKEUPINUPROAR waitmessage B_WAIT_TIME_LONG - updatestatusicon BS_ATTACKER + updatestatusicon BS_EFFECT_BATTLER end2 BattleScript_PoisonTurnDmg:: @@ -6992,12 +6054,11 @@ BattleScript_PoisonTurnDmg:: BattleScript_DoStatusTurnDmg:: statusanimation BS_ATTACKER BattleScript_DoTurnDmg: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE tryfaintmon BS_ATTACKER checkteamslost BattleScript_DoTurnDmgEnd - tryrestorehpberry + tryactivateitem BS_ATTACKER, ACTIVATION_ON_HP_THRESHOLD BattleScript_DoTurnDmgEnd: end2 @@ -7007,9 +6068,8 @@ BattleScript_PoisonHealActivates:: printstring STRINGID_POISONHEALHPUP waitmessage B_WAIT_TIME_LONG statusanimation BS_ATTACKER - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE end2 BattleScript_BurnTurnDmg:: @@ -7056,43 +6116,41 @@ BattleScript_MoveUsedIsParalyzed:: printstring STRINGID_PKMNISPARALYZED waitmessage B_WAIT_TIME_LONG statusanimation BS_ATTACKER - cancelmultiturnmoves BS_ATTACKER + cancelmultiturnmoves goto BattleScript_MoveEnd BattleScript_PowderMoveNoEffect:: - attackstring - ppreduce pause B_WAIT_TIME_SHORT jumpiftype BS_TARGET, TYPE_GRASS, BattleScript_PowderMoveNoEffectPrint jumpifability BS_TARGET, ABILITY_OVERCOAT, BattleScript_PowderMoveNoEffectOvercoat + setlastuseditem BS_TARGET printstring STRINGID_SAFETYGOGGLESPROTECTED goto BattleScript_PowderMoveNoEffectWaitMsg BattleScript_PowderMoveNoEffectOvercoat: - call BattleScript_AbilityPopUp + call BattleScript_AbilityPopUpTarget BattleScript_PowderMoveNoEffectPrint: printstring STRINGID_ITDOESNTAFFECT BattleScript_PowderMoveNoEffectWaitMsg: waitmessage B_WAIT_TIME_LONG - cancelmultiturnmoves BS_ATTACKER + cancelmultiturnmoves setmoveresultflags MOVE_RESULT_FAILED goto BattleScript_MoveEnd BattleScript_MoveUsedFlinched:: printstring STRINGID_PKMNFLINCHED waitmessage B_WAIT_TIME_LONG - jumpifability BS_ATTACKER ABILITY_STEADFAST BattleScript_TryActivateSteadFast + jumpifability BS_ATTACKER, ABILITY_STEADFAST, BattleScript_TryActivateSteadFast BattleScript_MoveUsedFlinchedEnd: goto BattleScript_MoveEnd BattleScript_TryActivateSteadFast: setstatchanger STAT_SPEED, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_MoveUsedFlinchedEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_MoveUsedFlinchedEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_MoveUsedFlinchedEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_MoveUsedFlinchedEnd copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 - setbyte gBattleCommunication STAT_SPEED - stattextbuffer BS_ATTACKER + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_MoveUsedFlinchedEnd + setbyte gBattleCommunication, STAT_SPEED + stattextbuffer printstring STRINGID_ATTACKERABILITYSTATRAISE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveUsedFlinchedEnd @@ -7103,7 +6161,7 @@ BattleScript_PrintUproarOverTurns:: end2 BattleScript_ThrashConfuses:: - chosenstatus2animation BS_ATTACKER, STATUS2_CONFUSION + volatileanimation BS_ATTACKER, VOLATILE_CONFUSION printstring STRINGID_PKMNFATIGUECONFUSION waitmessage B_WAIT_TIME_LONG end2 @@ -7111,19 +6169,19 @@ BattleScript_ThrashConfuses:: BattleScript_MoveUsedIsConfused:: printstring STRINGID_PKMNISCONFUSED waitmessage B_WAIT_TIME_LONG - status2animation BS_ATTACKER, STATUS2_CONFUSION + volatileanimation BS_ATTACKER, VOLATILE_CONFUSION jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, FALSE, BattleScript_MoveUsedIsConfusedRet BattleScript_DoSelfConfusionDmg:: - cancelmultiturnmoves BS_ATTACKER + cancelmultiturnmoves adjustdamage printstring STRINGID_ITHURTCONFUSION waitmessage B_WAIT_TIME_LONG effectivenesssound hitanimation BS_ATTACKER waitstate - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + isdmgblockedbydisguise + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE resultmessage waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER @@ -7132,19 +6190,15 @@ BattleScript_MoveUsedIsConfusedRet:: return BattleScript_MoveUsedPowder:: - bicword gHitMarker, HITMARKER_NO_ATTACKSTRING | HITMARKER_ATTACKSTRING_PRINTED - attackstring - ppreduce pause B_WAIT_TIME_SHORT - cancelmultiturnmoves BS_ATTACKER - status2animation BS_ATTACKER, STATUS2_POWDER + cancelmultiturnmoves + volatileanimation BS_ATTACKER, VOLATILE_POWDER waitanimation effectivenesssound hitanimation BS_ATTACKER waitstate - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_POWDEREXPLODES waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER @@ -7175,7 +6229,7 @@ BattleScript_WrapEnds:: BattleScript_MoveUsedIsInLove:: printstring STRINGID_PKMNINLOVE waitmessage B_WAIT_TIME_LONG - status2animation BS_ATTACKER, STATUS2_INFATUATION + volatileanimation BS_ATTACKER, VOLATILE_INFATUATION return BattleScript_MoveUsedIsInLoveCantAttack:: @@ -7186,13 +6240,13 @@ BattleScript_MoveUsedIsInLoveCantAttack:: BattleScript_NightmareTurnDmg:: printstring STRINGID_PKMNLOCKEDINNIGHTMARE waitmessage B_WAIT_TIME_LONG - status2animation BS_ATTACKER, STATUS2_NIGHTMARE + volatileanimation BS_ATTACKER, VOLATILE_NIGHTMARE goto BattleScript_DoTurnDmg BattleScript_CurseTurnDmg:: printstring STRINGID_PKMNAFFLICTEDBYCURSE waitmessage B_WAIT_TIME_LONG - status2animation BS_ATTACKER, STATUS2_CURSED + volatileanimation BS_ATTACKER, VOLATILE_CURSED goto BattleScript_DoTurnDmg BattleScript_TargetPRLZHeal:: @@ -7230,13 +6284,13 @@ BattleScript_UpdateEffectStatusIconRet:: flushtextbox return -BattleScript_YawnMakesAsleep:: +BattleScript_YawnMakesAsleepEnd2:: statusanimation BS_EFFECT_BATTLER printstring STRINGID_PKMNFELLASLEEP waitmessage B_WAIT_TIME_LONG updatestatusicon BS_EFFECT_BATTLER waitstate - jumpifstatus3 BS_EFFECT_BATTLER, STATUS3_SKY_DROPPED, BattleScript_YawnEnd + jumpfifsemiinvulnerable BS_EFFECT_BATTLER, STATE_SKY_DROP, BattleScript_YawnEnd makevisible BS_EFFECT_BATTLER skydropyawn BattleScript_YawnEnd: @@ -7245,7 +6299,7 @@ BattleScript_YawnEnd: BattleScript_EmbargoEndTurn:: printstring STRINGID_EMBARGOENDS waitmessage B_WAIT_TIME_LONG - tryrestorehpberry + tryactivateitem BS_ATTACKER, ACTIVATION_ON_USABLE_AGAIN end2 BattleScript_TelekinesisEndTurn:: @@ -7322,28 +6376,21 @@ BattleScript_MoveEffectWrap:: return BattleScript_MoveEffectConfusion:: - chosenstatus2animation BS_EFFECT_BATTLER, STATUS2_CONFUSION + volatileanimation BS_EFFECT_BATTLER, VOLATILE_CONFUSION printstring STRINGID_PKMNWASCONFUSED waitmessage B_WAIT_TIME_LONG return BattleScript_MoveEffectRecoil:: - jumpifmove MOVE_STRUGGLE, BattleScript_DoRecoil - jumpifability BS_ATTACKER, ABILITY_ROCK_HEAD, BattleScript_RecoilEnd - jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_RecoilEnd -BattleScript_DoRecoil:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_IGNORE_DISGUISE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_PKMNHITWITHRECOIL waitmessage B_WAIT_TIME_LONG - tryupdaterecoiltracker tryfaintmon BS_ATTACKER -BattleScript_RecoilEnd:: return BattleScript_ItemSteal:: - playanimation BS_TARGET, B_ANIM_ITEM_STEAL + playanimation BS_EFFECT_BATTLER, B_ANIM_ITEM_STEAL printstring STRINGID_PKMNSTOLEITEM waitmessage B_WAIT_TIME_LONG return @@ -7359,21 +6406,37 @@ BattleScript_DrizzleActivates:: BattleScript_AbilityRaisesDefenderStat:: pause B_WAIT_TIME_SHORT + statbuffchange BS_TARGET, STAT_CHANGE_ONLY_CHECKING, BattleScript_AbilityCantRaiseDefenderStat call BattleScript_AbilityPopUp - statbuffchange 0, NULL - setgraphicalstatchangevalues - playanimation BS_ABILITY_BATTLER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_TARGET, 0, BattleScript_AbilityCantRaiseDefenderStat printstring STRINGID_DEFENDERSSTATROSE waitmessage B_WAIT_TIME_LONG return +BattleScript_AbilityCantRaiseDefenderStat:: + saveattacker + copybyte gBattlerAttacker, gBattlerTarget + printstring STRINGID_STATSWONTINCREASE + waitmessage B_WAIT_TIME_LONG + restoreattacker + return + +BattleScript_AbilityShieldProtects:: + saveattacker + copybyte gBattlerAttacker, gBattlerAbility + playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT + waitanimation + printstring STRINGID_ABILITYSHIELDPROTECTS + waitmessage B_WAIT_TIME_LONG + restoreattacker + return + BattleScript_AbilityPopUpTarget:: copybyte gBattlerAbility, gBattlerTarget BattleScript_AbilityPopUp:: - .if B_ABILITY_POP_UP == TRUE - showabilitypopup BS_ABILITY_BATTLER - pause 40 - .endif + tryactivateabilityshield BS_ABILITY_BATTLER + showabilitypopup + pause B_WAIT_TIME_SHORT recordability BS_ABILITY_BATTLER sethword sABILITY_OVERWRITE, 0 return @@ -7384,26 +6447,16 @@ BattleScript_AbilityPopUpScripting: BattleScript_AbilityPopUpOverwriteThenNormal: setbyte sFIXED_ABILITY_POPUP, TRUE - showabilitypopup BS_ABILITY_BATTLER - pause 60 + showabilitypopup + pause B_WAIT_TIME_SHORT sethword sABILITY_OVERWRITE, 0 - updateabilitypopup BS_ABILITY_BATTLER - pause 20 + updateabilitypopup + pause B_WAIT_TIME_SHORT recordability BS_ABILITY_BATTLER destroyabilitypopup - pause 40 + setbyte sFIXED_ABILITY_POPUP, FALSE return -BattleScript_SpeedBoostActivates:: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_SpeedBoostActivatesEnd - call BattleScript_AbilityPopUp - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 - printstring STRINGID_PKMNRAISEDSPEED - waitmessage B_WAIT_TIME_LONG -BattleScript_SpeedBoostActivatesEnd: - end3 - @ Can't compare directly to a value, have to compare to value at pointer sZero: .byte 0 @@ -7411,37 +6464,31 @@ sZero: BattleScript_MoodyActivates:: call BattleScript_AbilityPopUp jumpifbyteequal sSTATCHANGER, sZero, BattleScript_MoodyLower - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoodyLower - jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_ROSE, BattleScript_MoodyLower - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_ATTACKER, STAT_CHANGE_CERTAIN | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoodyLower + jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_CHANGED, BattleScript_MoodyLower printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_MoodyLower: jumpifbyteequal sSAVED_STAT_CHANGER, sZero, BattleScript_MoodyEnd copybyte sSTATCHANGER, sSAVED_STAT_CHANGER - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoodyEnd - jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_FELL, BattleScript_MoodyEnd - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_ATTACKER, STAT_CHANGE_CERTAIN | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoodyEnd + jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_CHANGED, BattleScript_MoodyEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_MoodyEnd: - end3 + end2 BattleScript_EmergencyExit:: - .if B_ABILITY_POP_UP == TRUE pause 5 call BattleScript_AbilityPopUpScripting pause B_WAIT_TIME_LONG - .endif playanimation BS_SCRIPTING, B_ANIM_SLIDE_OFFSCREEN waitanimation openpartyscreen BS_SCRIPTING, BattleScript_EmergencyExitRet - switchoutabilities BS_SCRIPTING waitstate + returntoball BS_SCRIPTING, FALSE + switchoutabilities BS_SCRIPTING switchhandleorder BS_SCRIPTING, 2 - returntoball BS_TARGET, FALSE getswitchedmondata BS_SCRIPTING switchindataupdate BS_SCRIPTING hpthresholds BS_SCRIPTING @@ -7453,14 +6500,12 @@ BattleScript_EmergencyExitRet: return BattleScript_EmergencyExitWild:: - .if B_ABILITY_POP_UP == TRUE pause 5 call BattleScript_AbilityPopUpScripting pause B_WAIT_TIME_LONG - .endif playanimation BS_SCRIPTING, B_ANIM_SLIDE_OFFSCREEN waitanimation - setoutcomeonteleport BS_SCRIPTING + setteleportoutcome BS_SCRIPTING finishaction return @@ -7471,10 +6516,10 @@ BattleScript_EmergencyExitEnd2:: playanimation BS_ATTACKER, B_ANIM_SLIDE_OFFSCREEN waitanimation openpartyscreen BS_ATTACKER, BattleScript_EmergencyExitRetEnd2 - switchoutabilities BS_ATTACKER waitstate + returntoball BS_ATTACKER, FALSE + switchoutabilities BS_ATTACKER switchhandleorder BS_ATTACKER, 2 - returntoball BS_TARGET, FALSE getswitchedmondata BS_ATTACKER switchindataupdate BS_ATTACKER hpthresholds BS_ATTACKER @@ -7491,7 +6536,7 @@ BattleScript_EmergencyExitWildEnd2:: pause B_WAIT_TIME_LONG playanimation BS_ATTACKER, B_ANIM_SLIDE_OFFSCREEN waitanimation - setoutcomeonteleport BS_ATTACKER + setteleportoutcome BS_ATTACKER finishaction end2 @@ -7509,20 +6554,20 @@ BattleScript_ReceiverActivates:: printstring STRINGID_RECEIVERABILITYTAKEOVER waitmessage B_WAIT_TIME_LONG settracedability BS_ABILITY_BATTLER + switchinabilities BS_ABILITY_BATTLER return BattleScript_AbilityHpHeal: call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXRESTOREDHPALITTLE2 waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE return BattleScript_RainDishActivates:: call BattleScript_AbilityHpHeal - end3 + end2 BattleScript_CheekPouchActivates:: copybyte sSAVED_BATTLER, gBattlerAttacker @@ -7537,9 +6582,9 @@ BattleScript_PickupActivates:: call BattleScript_AbilityPopUp printstring STRINGID_XFOUNDONEY waitmessage B_WAIT_TIME_LONG - tryrestorehpberry + tryactivateitem BS_ATTACKER, ACTIVATION_ON_PICK_UP BattleScript_PickupActivatesEnd: - end3 + end2 BattleScript_HarvestActivates:: pause 5 @@ -7547,19 +6592,18 @@ BattleScript_HarvestActivates:: call BattleScript_AbilityPopUp printstring STRINGID_HARVESTBERRY waitmessage B_WAIT_TIME_LONG - tryrestorehpberry + tryactivateitem BS_ATTACKER, ACTIVATION_ON_HARVEST BattleScript_HarvestActivatesEnd: - end3 + end2 BattleScript_SolarPowerActivates:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE call BattleScript_AbilityPopUp - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_SOLARPOWERHPDROP waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER - end3 + end2 BattleScript_HealerActivates:: call BattleScript_AbilityPopUp @@ -7567,7 +6611,7 @@ BattleScript_HealerActivates:: updatestatusicon BS_SCRIPTING printstring STRINGID_HEALERCURE waitmessage B_WAIT_TIME_LONG - end3 + end2 BattleScript_SandstreamActivates:: pause B_WAIT_TIME_SHORT @@ -7592,11 +6636,12 @@ BattleScript_ShedSkinActivates:: printstring STRINGID_PKMNSXCUREDYPROBLEM waitmessage B_WAIT_TIME_LONG updatestatusicon BS_ATTACKER - end3 + end2 BattleScript_ActivateWeatherAbilities: saveattacker savetarget + tryboosterenergy ON_WEATHER setbyte gBattlerAttacker, 0 BattleScript_ActivateWeatherAbilities_Loop: copyarraywithindex gBattlerTarget, gBattlerByTurnOrder, gBattlerAttacker, 1 @@ -7608,14 +6653,11 @@ BattleScript_ActivateWeatherAbilities_Loop: return BattleScript_TryIntimidateHoldEffects: - itemstatchangeeffects BS_TARGET jumpifnoholdeffect BS_TARGET, HOLD_EFFECT_ADRENALINE_ORB, BattleScript_TryIntimidateHoldEffectsRet - jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPEED, 12, BattleScript_TryIntimidateHoldEffectsRet + jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_TryIntimidateHoldEffectsRet setstatchanger STAT_SPEED, 1, FALSE - statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_TryIntimidateHoldEffectsRet playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_TARGET, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_TryIntimidateHoldEffectsRet copybyte sBATTLER, gBattlerTarget setlastuseditem BS_TARGET printstring STRINGID_USINGITEMSTATOFPKMNROSE @@ -7626,26 +6668,18 @@ BattleScript_TryIntimidateHoldEffectsRet: BattleScript_IntimidateActivates:: savetarget -.if B_ABILITY_POP_UP == TRUE - showabilitypopup BS_ATTACKER - pause B_WAIT_TIME_LONG - destroyabilitypopup -.endif + call BattleScript_AbilityPopUp setbyte gBattlerTarget, 0 BattleScript_IntimidateLoop: - jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_IntimidateLoopIncrement jumpiftargetally BattleScript_IntimidateLoopIncrement jumpifabsent BS_TARGET, BattleScript_IntimidateLoopIncrement - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_IntimidateLoopIncrement + jumpifvolatile BS_TARGET, VOLATILE_SUBSTITUTE, BattleScript_IntimidateLoopIncrement jumpifintimidateabilityprevented BattleScript_IntimidateEffect: copybyte sBATTLER, gBattlerAttacker setstatchanger STAT_ATK, 1, TRUE - statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_IntimidateLoopIncrement - setgraphicalstatchangevalues - jumpifability BS_TARGET, ABILITY_CONTRARY, BattleScript_IntimidateContrary - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_IntimidateWontDecrease - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_TARGET, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_IntimidateLoopIncrement + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_IntimidateWontDecrease printstring STRINGID_PKMNCUTSATTACKWITH BattleScript_IntimidateEffect_WaitString: waitmessage B_WAIT_TIME_LONG @@ -7661,8 +6695,8 @@ BattleScript_IntimidateLoopIncrement: copybyte sBATTLER, gBattlerAttacker destroyabilitypopup restoretarget + restoreattacker pause B_WAIT_TIME_MED - tryintimidateejectpack end3 BattleScript_IntimidatePrevented:: @@ -7675,16 +6709,6 @@ BattleScript_IntimidateWontDecrease: printstring STRINGID_STATSWONTDECREASE goto BattleScript_IntimidateEffect_WaitString -BattleScript_IntimidateContrary: - call BattleScript_AbilityPopUpTarget - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_IntimidateContrary_WontIncrease - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 - printfromtable gStatUpStringIds - goto BattleScript_IntimidateEffect_WaitString -BattleScript_IntimidateContrary_WontIncrease: - printstring STRINGID_TARGETSTATWONTGOHIGHER - goto BattleScript_IntimidateEffect_WaitString - BattleScript_IntimidateInReverse:: copybyte sBATTLER, gBattlerTarget call BattleScript_AbilityPopUpTarget @@ -7695,56 +6719,42 @@ BattleScript_IntimidateInReverse:: BattleScript_SupersweetSyrupActivates:: savetarget -.if B_ABILITY_POP_UP == TRUE - showabilitypopup BS_ATTACKER - pause B_WAIT_TIME_LONG - destroyabilitypopup -.endif + call BattleScript_AbilityPopUp printstring STRINGID_SUPERSWEETAROMAWAFTS waitmessage B_WAIT_TIME_LONG setbyte gBattlerTarget, 0 BattleScript_SupersweetSyrupLoop: - jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_SupersweetSyrupLoopIncrement jumpiftargetally BattleScript_SupersweetSyrupLoopIncrement jumpifabsent BS_TARGET, BattleScript_SupersweetSyrupLoopIncrement - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_SupersweetSyrupLoopIncrement + jumpifvolatile BS_TARGET, VOLATILE_SUBSTITUTE, BattleScript_SupersweetSyrupLoopIncrement BattleScript_SupersweetSyrupEffect: copybyte sBATTLER, gBattlerAttacker setstatchanger STAT_EVASION, 1, TRUE - statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_SupersweetSyrupLoopIncrement - setgraphicalstatchangevalues - jumpifability BS_TARGET, ABILITY_CONTRARY, BattleScript_SupersweetSyrupContrary - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_SupersweetSyrupWontDecrease - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_TARGET, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_SupersweetSyrupLoopIncrement + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_SupersweetSyrupWontDecrease printfromtable gStatDownStringIds BattleScript_SupersweetSyrupEffect_WaitString: waitmessage B_WAIT_TIME_LONG + saveattacker + savetarget copybyte sBATTLER, gBattlerTarget call BattleScript_TryIntimidateHoldEffects + restoreattacker + restoretarget BattleScript_SupersweetSyrupLoopIncrement: addbyte gBattlerTarget, 1 jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_SupersweetSyrupLoop copybyte sBATTLER, gBattlerAttacker destroyabilitypopup restoretarget + restoreattacker pause B_WAIT_TIME_MED - tryintimidateejectpack end3 BattleScript_SupersweetSyrupWontDecrease: printstring STRINGID_STATSWONTDECREASE goto BattleScript_SupersweetSyrupEffect_WaitString -BattleScript_SupersweetSyrupContrary: - call BattleScript_AbilityPopUpTarget - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_SupersweetSyrupContrary_WontIncrease - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 - printfromtable gStatUpStringIds - goto BattleScript_SupersweetSyrupEffect_WaitString -BattleScript_SupersweetSyrupContrary_WontIncrease: - printstring STRINGID_TARGETSTATWONTGOHIGHER - goto BattleScript_SupersweetSyrupEffect_WaitString - BattleScript_DroughtActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp @@ -7764,11 +6774,7 @@ BattleScript_DesolateLandActivates:: end3 BattleScript_PrimalWeatherBlocksMove:: - jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_ATTACKSTRING_PRINTED, BattleScript_MoveEnd @in case of multi-target moves, if move fails once, no point in printing the message twice - accuracycheck BattleScript_PrintMoveMissed, NO_ACC_CALC_CHECK_LOCK_ON - attackstring pause B_WAIT_TIME_SHORT - ppreduce printfromtable gPrimalWeatherBlocksStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -7788,6 +6794,7 @@ BattleScript_DeltaStreamActivates:: printstring STRINGID_MYSTERIOUSAIRCURRENT waitstate playanimation BS_ATTACKER, B_ANIM_STRONG_WINDS + call BattleScript_ActivateWeatherAbilities end3 BattleScript_ProtosynthesisActivates:: @@ -7821,12 +6828,9 @@ BattleScript_SupremeOverlordActivates:: BattleScript_CostarActivates:: pause B_WAIT_TIME_SHORT - savetarget - copybyte gBattlerTarget, sBATTLER call BattleScript_AbilityPopUp printstring STRINGID_PKMNCOPIEDSTATCHANGES waitmessage B_WAIT_TIME_LONG - restoretarget end3 BattleScript_ZeroToHeroActivates:: @@ -7842,35 +6846,33 @@ BattleScript_CommanderActivates:: printstring STRINGID_COMMANDERACTIVATES waitmessage B_WAIT_TIME_LONG BattleScript_CommanderAtkIncrease: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_SPATK | BIT_SPDEF | BIT_SPEED, STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderDefIncrease - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderDefIncrease + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderDefIncrease, BIT_DEF | BIT_SPATK | BIT_SPDEF | BIT_SPEED + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CommanderDefIncrease printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CommanderDefIncrease: setstatchanger STAT_DEF, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpAtkIncrease - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderSpAtkIncrease + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpAtkIncrease, BIT_SPATK | BIT_SPDEF | BIT_SPEED + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CommanderSpAtkIncrease printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CommanderSpAtkIncrease: setstatchanger STAT_SPATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpDefIncrease - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderSpDefIncrease + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpDefIncrease, BIT_SPDEF | BIT_SPEED + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CommanderSpDefIncrease printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CommanderSpDefIncrease: setstatchanger STAT_SPDEF, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpeedIncrease - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderSpeedIncrease + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpeedIncrease, BIT_SPEED + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CommanderSpeedIncrease printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CommanderSpeedIncrease: setstatchanger STAT_SPEED, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CommanderEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CommanderEnd: @@ -7882,9 +6884,9 @@ BattleScript_HospitalityActivates:: call BattleScript_AbilityPopUp printstring STRINGID_HOSPITALITYRESTORATION waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + playanimation BS_EFFECT_BATTLER, B_ANIM_SIMPLE_HEAL + healthbarupdate BS_EFFECT_BATTLER, PASSIVE_HP_UPDATE + datahpupdate BS_EFFECT_BATTLER, PASSIVE_HP_UPDATE end3 BattleScript_AttackWeakenedByStrongWinds:: @@ -7921,10 +6923,12 @@ BattleScript_SnowWarningActivatesSnow:: BattleScript_ActivateTerrainEffects: saveattacker savetarget + tryboosterenergy ON_TERRAIN + resetterrainabilityflags setbyte gBattlerAttacker, 0 BattleScript_ActivateTerrainSeed: copyarraywithindex gBattlerTarget, gBattlerByTurnOrder, gBattlerAttacker, 1 - doterrainseed BS_TARGET, BattleScript_ActivateTerrainAbility + tryterrainseed BS_TARGET, BattleScript_ActivateTerrainAbility removeitem BS_TARGET BattleScript_ActivateTerrainAbility: activateterrainchangeabilities BS_TARGET @@ -7984,9 +6988,8 @@ BattleScript_BadDreams_DmgAfterPopUp: printstring STRINGID_BADDREAMSDMG waitmessage B_WAIT_TIME_LONG dmg_1_8_targethp - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE jumpifhasnohp BS_TARGET, BattleScript_BadDreams_HidePopUp BattleScript_BadDreamsIncrement: addbyte gBattlerTarget, 1 @@ -7995,7 +6998,7 @@ BattleScript_BadDreamsIncrement: destroyabilitypopup pause 15 BattleScript_BadDreamsEnd: - end3 + end2 BattleScript_BadDreams_ShowPopUp: copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp @@ -8007,11 +7010,9 @@ BattleScript_BadDreams_HidePopUp: goto BattleScript_BadDreamsIncrement BattleScript_TookAttack:: - attackstring pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNSXTOOKATTACK waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_ATTACKSTRING_PRINTED return BattleScript_SturdyPreventsOHKO:: @@ -8030,30 +7031,20 @@ BattleScript_DampStopsExplosion:: moveendcase MOVEEND_CLEAR_BITS end -BattleScript_MoveHPDrain_PPLoss:: - ppreduce BattleScript_MoveHPDrain:: - attackstring pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printstring STRINGID_PKMNRESTOREDHPUSING waitmessage B_WAIT_TIME_LONG setmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE goto BattleScript_MoveEnd -BattleScript_MoveStatDrain_PPLoss:: - ppreduce BattleScript_MoveStatDrain:: - attackstring pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 - waitanimation - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_MoveStatDrain_Cont + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_MoveStatDrain_Cont .if B_ABSORBING_ABILITY_STRING >= GEN_5 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -8065,10 +7056,7 @@ BattleScript_MoveStatDrain_Cont: clearsemiinvulnerablebit goto BattleScript_MoveEnd -BattleScript_MonMadeMoveUseless_PPLoss:: - ppreduce BattleScript_MonMadeMoveUseless:: - attackstring pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXMADEYUSELESS @@ -8076,10 +7064,7 @@ BattleScript_MonMadeMoveUseless:: setmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE goto BattleScript_MoveEnd -BattleScript_FlashFireBoost_PPLoss:: - ppreduce BattleScript_FlashFireBoost:: - attackstring pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp printfromtable gFlashFireStringIds @@ -8122,18 +7107,17 @@ BattleScript_FlinchPrevention:: call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXPREVENTSFLINCHING waitmessage B_WAIT_TIME_LONG - goto BattleScript_MoveEnd + return BattleScript_OwnTempoPrevents:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp + copybyte sBATTLER, gBattlerTarget printstring STRINGID_PKMNPREVENTSCONFUSIONWITH waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_SoundproofProtected:: - attackstring - ppreduce pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXBLOCKSY @@ -8146,8 +7130,6 @@ BattleScript_IceFaceNullsDamage:: return BattleScript_DazzlingProtected:: - attackstring - ppreduce pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUpScripting printstring STRINGID_POKEMONCANNOTUSEMOVE @@ -8155,17 +7137,17 @@ BattleScript_DazzlingProtected:: goto BattleScript_MoveEnd BattleScript_MoveUsedPsychicTerrainPrevents:: - printstring STRINGID_POKEMONCANNOTUSEMOVE + pause B_WAIT_TIME_SHORT + printstring STRINGID_PSYCHICTERRAINPREVENTS waitmessage B_WAIT_TIME_LONG + setmoveresultflags MOVE_RESULT_NO_EFFECT goto BattleScript_MoveEnd BattleScript_GrassyTerrainHeals:: printstring STRINGID_GRASSYTERRAINHEALS waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER - bicword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE end2 BattleScript_AbilityNoSpecificStatLoss:: @@ -8173,16 +7155,20 @@ BattleScript_AbilityNoSpecificStatLoss:: call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXPREVENTSYLOSS waitmessage B_WAIT_TIME_LONG - setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY + setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGE_EMPTY setmoveresultflags MOVE_RESULT_NO_EFFECT return BattleScript_StickyHoldActivates:: + call BattleScript_StickyHoldActivatesRet + goto BattleScript_MoveEnd + +BattleScript_StickyHoldActivatesRet:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXMADEYINEFFECTIVE waitmessage B_WAIT_TIME_LONG - goto BattleScript_MoveEnd + return BattleScript_ColorChangeActivates:: call BattleScript_AbilityPopUp @@ -8197,6 +7183,11 @@ BattleScript_ProteanActivates:: waitmessage B_WAIT_TIME_LONG return +BattleScript_AbilityAvoidsDamage:: + call BattleScript_AbilityPopUp + printfromtable gMissStringIds @ waitmessage is executed next so no waitmessage here + return + BattleScript_TeraShellDistortingTypeMatchups:: pause B_WAIT_TIME_SHORTEST call BattleScript_AbilityPopUpScripting @@ -8206,33 +7197,35 @@ BattleScript_TeraShellDistortingTypeMatchups:: BattleScript_CursedBodyActivates:: call BattleScript_AbilityPopUp - printstring STRINGID_CUSEDBODYDISABLED + printstring STRINGID_CURSEDBODYDISABLED waitmessage B_WAIT_TIME_LONG return BattleScript_MummyActivates:: -.if B_ABILITY_POP_UP == TRUE - call BattleScript_AbilityPopUpTarget setbyte sFIXED_ABILITY_POPUP, TRUE + call BattleScript_AbilityPopUpTarget copybyte gBattlerAbility, gBattlerAttacker copyhword sABILITY_OVERWRITE, gLastUsedAbility call BattleScript_AbilityPopUpOverwriteThenNormal -.endif recordability BS_TARGET recordability BS_ATTACKER printstring STRINGID_ATTACKERACQUIREDABILITY waitmessage B_WAIT_TIME_LONG + trytoclearprimalweather + tryrevertweatherform + flushtextbox + tryendneutralizinggas return BattleScript_WanderingSpiritActivates:: -.if B_ABILITY_POP_UP == TRUE + saveattacker + savetarget copybyte gBattlerAbility, gBattlerTarget sethword sABILITY_OVERWRITE, ABILITY_WANDERING_SPIRIT call BattleScript_AbilityPopUpOverwriteThenNormal copybyte gBattlerAbility, gBattlerAttacker copyhword sABILITY_OVERWRITE, gLastUsedAbility call BattleScript_AbilityPopUpOverwriteThenNormal -.endif recordability BS_TARGET recordability BS_ATTACKER printstring STRINGID_SWAPPEDABILITIES @@ -8241,27 +7234,25 @@ BattleScript_WanderingSpiritActivates:: jumpiffainted BS_TARGET, TRUE, BattleScript_WanderingSpiritActivatesRet switchinabilities BS_TARGET BattleScript_WanderingSpiritActivatesRet: + restoreattacker + restoretarget return BattleScript_TargetsStatWasMaxedOut:: call BattleScript_AbilityPopUp - statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, NULL - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_TARGET, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_CERTAIN, BattleScript_TargetsStatWasMaxedOutRet printstring STRINGID_TARGETSSTATWASMAXEDOUT waitmessage B_WAIT_TIME_LONG +BattleScript_TargetsStatWasMaxedOutRet: return BattleScript_BattlerAbilityStatRaiseOnSwitchIn:: - copybyte gBattlerAbility, gBattlerAttacker - call BattleScript_AbilityPopUp - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, NULL - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + call BattleScript_AbilityPopUpScripting + statbuffchange BS_SCRIPTING, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_CERTAIN, BattleScript_BattlerAbilityStatRaiseOnSwitchInRet waitanimation - printstring STRINGID_BATTLERABILITYRAISEDSTAT + printstring STRINGID_SCRIPTINGABILITYSTATRAISE waitmessage B_WAIT_TIME_LONG - copybyte gBattlerAttacker, sSAVED_BATTLER +BattleScript_BattlerAbilityStatRaiseOnSwitchInRet: end3 BattleScript_ScriptingAbilityStatRaise:: @@ -8269,81 +7260,70 @@ BattleScript_ScriptingAbilityStatRaise:: call BattleScript_AbilityPopUp saveattacker copybyte gBattlerAttacker, sBATTLER - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, NULL - setgraphicalstatchangevalues - playanimation BS_SCRIPTING, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 - waitanimation + statbuffchange BS_ATTACKER, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_CERTAIN, BattleScript_ScriptingAbilityStatRaiseRet printstring STRINGID_ATTACKERABILITYSTATRAISE waitmessage B_WAIT_TIME_LONG +BattleScript_ScriptingAbilityStatRaiseRet: restoreattacker return BattleScript_WeakArmorActivates:: call BattleScript_AbilityPopUp setstatchanger STAT_DEF, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_WeakArmorActivatesSpeed - jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_WeakArmorDefAnim - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_WeakArmorActivatesSpeed + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_WeakArmorActivatesSpeed + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_WeakArmorDefPrintString + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGE_EMPTY, BattleScript_WeakArmorActivatesSpeed pause B_WAIT_TIME_SHORTEST printfromtable gStatDownStringIds clearmoveresultflags MOVE_RESULT_MISSED @ Set by statbuffchange when stat can't be decreased waitmessage B_WAIT_TIME_LONG goto BattleScript_WeakArmorActivatesSpeed -BattleScript_WeakArmorDefAnim: - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 +BattleScript_WeakArmorDefPrintString: printstring STRINGID_TARGETABILITYSTATLOWER waitmessage B_WAIT_TIME_LONG BattleScript_WeakArmorActivatesSpeed: -.if B_WEAK_ARMOR_SPEED >= GEN_7 + jumpifgenconfiglowerthan CONFIG_WEAK_ARMOR_SPEED, GEN_7, BattleScript_WeakArmorSetSpeedGen6 setstatchanger STAT_SPEED, 2, FALSE -.else + goto BattleScript_WeakArmorDoSpeed +BattleScript_WeakArmorSetSpeedGen6: setstatchanger STAT_SPEED, 1, FALSE -.endif - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_WeakArmorActivatesEnd - jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_WeakArmorSpeedAnim - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_EMPTY, BattleScript_WeakArmorActivatesEnd +BattleScript_WeakArmorDoSpeed: + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_WeakArmorActivatesEnd + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_WeakArmorSpeedPrintString + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGE_EMPTY, BattleScript_WeakArmorActivatesEnd pause B_WAIT_TIME_SHORTEST printstring STRINGID_TARGETSTATWONTGOHIGHER clearmoveresultflags MOVE_RESULT_MISSED waitmessage B_WAIT_TIME_LONG goto BattleScript_WeakArmorActivatesEnd -BattleScript_WeakArmorSpeedAnim: - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 +BattleScript_WeakArmorSpeedPrintString: printstring STRINGID_TARGETABILITYSTATRAISE waitmessage B_WAIT_TIME_LONG BattleScript_WeakArmorActivatesEnd: return BattleScript_RaiseStatOnFaintingTarget:: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_RaiseStatOnFaintingTarget_End + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_RaiseStatOnFaintingTarget_End copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 - waitanimation + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_RaiseStatOnFaintingTarget_End printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_RaiseStatOnFaintingTarget_End: return BattleScript_AttackerAbilityStatRaise:: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AttackerAbilityStatRaise_End - copybyte gBattlerAbility, gBattlerAttacker - call BattleScript_AbilityPopUp - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 - waitanimation + statbuffchange BS_SCRIPTING, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_AttackerAbilityStatRaise_End + call BattleScript_AbilityPopUpScripting + statbuffchange BS_SCRIPTING, STAT_CHANGE_ALLOW_PTR, BattleScript_AttackerAbilityStatRaise_End printstring STRINGID_ATTACKERABILITYSTATRAISE waitmessage B_WAIT_TIME_LONG BattleScript_AttackerAbilityStatRaise_End: return BattleScript_FellStingerRaisesStat:: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_FellStingerRaisesAtkEnd - jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_ROSE, BattleScript_FellStingerRaisesAtkEnd - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_FellStingerRaisesAtkEnd + jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_CHANGED, BattleScript_FellStingerRaisesAtkEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_FellStingerRaisesAtkEnd: @@ -8351,8 +7331,14 @@ BattleScript_FellStingerRaisesAtkEnd: BattleScript_AttackerAbilityStatRaiseEnd3:: call BattleScript_AttackerAbilityStatRaise + restoreattacker end3 +BattleScript_AttackerAbilityStatRaiseEnd2:: + call BattleScript_AttackerAbilityStatRaise + restoreattacker + end2 + BattleScript_SwitchInAbilityMsg:: call BattleScript_AbilityPopUp printfromtable gSwitchInAbilityStringIds @@ -8387,26 +7373,27 @@ BattleScript_FriskMsg:: BattleScript_FriskActivates:: saveattacker - savetarget + savetarget copybyte gBattlerAttacker, sBATTLER - tryfriskmsg BS_SCRIPTING + tryfriskmessage restoreattacker - restoretarget + restoretarget end3 BattleScript_ImposterActivates:: call BattleScript_AbilityPopUp transformdataexecution - playmoveanimation BS_ATTACKER, MOVE_TRANSFORM + playmoveanimation MOVE_TRANSFORM waitanimation printstring STRINGID_IMPOSTERTRANSFORM waitmessage B_WAIT_TIME_LONG + restoreattacker + restoretarget end3 BattleScript_HurtAttacker: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_PKMNHURTSWITH waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER @@ -8428,10 +7415,9 @@ BattleScript_RockyHelmetActivatesDmg: BattleScript_SpikyShieldEffect:: jumpifabsent BS_ATTACKER, BattleScript_SpikyShieldRet - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE clearmoveresultflags MOVE_RESULT_NO_EFFECT - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_PKMNHURTSWITH waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER @@ -8440,9 +7426,8 @@ BattleScript_SpikyShieldRet:: return BattleScript_KingsShieldEffect:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE clearmoveresultflags MOVE_RESULT_NO_EFFECT - seteffectsecondary + seteffectsecondary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_NONE copybyte sBATTLER, gBattlerTarget copybyte gBattlerTarget, gBattlerAttacker copybyte gBattlerAttacker, sBATTLER @@ -8450,32 +7435,33 @@ BattleScript_KingsShieldEffect:: return BattleScript_BanefulBunkerEffect:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_STATUS_ABILITY_EFFECT | HITMARKER_PASSIVE_DAMAGE clearmoveresultflags MOVE_RESULT_NO_EFFECT - seteffectsecondary + setnonvolatilestatus TRIGGER_ON_PROTECT setmoveresultflags MOVE_RESULT_MISSED return BattleScript_CuteCharmActivates:: call BattleScript_AbilityPopUp - status2animation BS_ATTACKER, STATUS2_INFATUATION + volatileanimation BS_ATTACKER, VOLATILE_INFATUATION printstring STRINGID_PKMNSXINFATUATEDY waitmessage B_WAIT_TIME_LONG call BattleScript_TryDestinyKnotTarget return BattleScript_GooeyActivates:: + statbuffchange BS_ATTACKER, STAT_CHANGE_ONLY_CHECKING, BattleScript_GooeyActivatesRet waitstate call BattleScript_AbilityPopUp swapattackerwithtarget @ for defiant, mirror armor - seteffectsecondary MOVE_EFFECT_SPD_MINUS_1 + seteffectsecondary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_SPD_MINUS_1 swapattackerwithtarget +BattleScript_GooeyActivatesRet: return BattleScript_AbilityStatusEffect:: waitstate call BattleScript_AbilityPopUp - seteffectsecondary + setnonvolatilestatus TRIGGER_ON_ABILITY return BattleScript_BattleBondActivatesOnMoveEndAttacker:: @@ -8493,22 +7479,21 @@ BattleScript_BattleBondActivatesOnMoveEndAttacker:: BattleScript_EffectBattleBondStatIncrease:: call BattleScript_AbilityPopUp - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectBattleBondStatIncreaseTrySpAtk - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectBattleBondStatIncreaseTrySpAtk + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectBattleBondStatIncreaseTrySpAtk, BIT_SPATK | BIT_SPEED + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectBattleBondStatIncreaseTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectBattleBondStatIncreaseTrySpAtk: setstatchanger STAT_SPATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectBattleBondStatIncreaseTrySpeed - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectBattleBondStatIncreaseTrySpeed + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectBattleBondStatIncreaseTrySpeed, BIT_SPEED + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectBattleBondStatIncreaseTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectBattleBondStatIncreaseTrySpeed: setstatchanger STAT_SPEED, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectBattleBondStatIncreaseRet - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectBattleBondStatIncreaseRet + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectBattleBondStatIncreaseRet + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectBattleBondStatIncreaseRet printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectBattleBondStatIncreaseRet: @@ -8517,13 +7502,12 @@ BattleScript_EffectBattleBondStatIncreaseRet: BattleScript_DancerActivates:: call BattleScript_AbilityPopUp waitmessage B_WAIT_TIME_SHORT - orword gHitMarker, HITMARKER_ALLOW_NO_PP jumptocalledmove TRUE BattleScript_SynchronizeActivates:: waitstate call BattleScript_AbilityPopUp - seteffectprimary + setnonvolatilestatus TRIGGER_ON_ABILITY return BattleScript_NoItemSteal:: @@ -8539,6 +7523,13 @@ BattleScript_AbilityCuredStatus:: updatestatusicon BS_SCRIPTING return +BattleScript_AbilityCuredStatusEnd3:: + call BattleScript_AbilityPopUp + printstring STRINGID_PKMNSXCUREDITSYPROBLEM + waitmessage B_WAIT_TIME_LONG + updatestatusicon BS_SCRIPTING + end3 + BattleScript_BattlerShookOffTaunt:: call BattleScript_AbilityPopUp printstring STRINGID_PKMNSHOOKOFFTHETAUNT @@ -8560,15 +7551,14 @@ BattleScript_IgnoresWhileAsleep:: BattleScript_IgnoresAndUsesRandomMove:: printstring STRINGID_PKMNIGNOREDORDERS waitmessage B_WAIT_TIME_LONG - setbyte sMOVE_EFFECT, 0 - jumptocalledmove FALSE + return BattleScript_MoveUsedLoafingAround:: jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_LOAFING, BattleScript_MoveUsedLoafingAroundMsg @ Skip ahead if not the Battle Palace message jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_INCAPABLE_OF_POWER, BattleScript_MoveUsedLoafingAroundMsg setbyte gBattleCommunication, 0 - palacetryescapestatus BS_ATTACKER + palacetryescapestatus setbyte cMULTISTRING_CHOOSER, B_MSG_INCAPABLE_OF_POWER BattleScript_MoveUsedLoafingAroundMsg:: printfromtable gInobedientStringIds @@ -8576,13 +7566,14 @@ BattleScript_MoveUsedLoafingAroundMsg:: moveendto MOVEEND_NEXT_TARGET end BattleScript_TruantLoafingAround:: + flushtextbox call BattleScript_AbilityPopUp goto BattleScript_MoveUsedLoafingAroundMsg BattleScript_IgnoresAndFallsAsleep:: printstring STRINGID_PKMNBEGANTONAP waitmessage B_WAIT_TIME_LONG - seteffectprimary MOVE_EFFECT_SLEEP | MOVE_EFFECT_AFFECTS_USER + seteffectprimary BS_ATTACKER, BS_ATTACKER, MOVE_EFFECT_SLEEP moveendto MOVEEND_NEXT_TARGET end @@ -8596,73 +7587,13 @@ BattleScript_SubstituteFade:: printstring STRINGID_PKMNSUBSTITUTEFADED return -BattleScript_BerryCurePrlzEnd2:: - call BattleScript_BerryCureParRet - end2 - -BattleScript_BerryCureParRet:: - playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT - printstring STRINGID_PKMNSITEMCUREDPARALYSIS - waitmessage B_WAIT_TIME_LONG - updatestatusicon BS_SCRIPTING - removeitem BS_SCRIPTING - return - -BattleScript_BerryCurePsnEnd2:: - call BattleScript_BerryCurePsnRet +BattleScript_BerryCureStatusEnd2:: + call BattleScript_BerryCureStatusRet end2 -BattleScript_BerryCurePsnRet:: +BattleScript_BerryCureStatusRet:: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT - printstring STRINGID_PKMNSITEMCUREDPOISON - waitmessage B_WAIT_TIME_LONG - updatestatusicon BS_SCRIPTING - removeitem BS_SCRIPTING - return - -BattleScript_BerryCureBrnEnd2:: - call BattleScript_BerryCureBrnRet - end2 - -BattleScript_BerryCureBrnRet:: - playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT - printstring STRINGID_PKMNSITEMHEALEDBURN - waitmessage B_WAIT_TIME_LONG - updatestatusicon BS_SCRIPTING - removeitem BS_SCRIPTING - return - -BattleScript_BerryCureFrzEnd2:: - call BattleScript_BerryCureFrzRet - end2 - -BattleScript_BerryCureFrzRet:: - playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT - printstring STRINGID_PKMNSITEMDEFROSTEDIT - waitmessage B_WAIT_TIME_LONG - updatestatusicon BS_SCRIPTING - removeitem BS_SCRIPTING - return - -BattleScript_BerryCureFrbEnd2:: - call BattleScript_BerryCureFrzRet - end2 - -BattleScript_BerryCureFrbRet:: - playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT - printstring STRINGID_PKMNSITEMHEALEDFROSTBITE - waitmessage B_WAIT_TIME_LONG - updatestatusicon BS_SCRIPTING - removeitem BS_SCRIPTING - return - -BattleScript_BerryCureSlpEnd2:: - call BattleScript_BerryCureSlpRet - end2 - -BattleScript_BerryCureSlpRet:: - playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT - printstring STRINGID_PKMNSITEMWOKEIT + printfromtable CureStatusBerryEffectStringID waitmessage B_WAIT_TIME_LONG updatestatusicon BS_SCRIPTING removeitem BS_SCRIPTING @@ -8697,25 +7628,12 @@ BattleScript_BerryCureConfusionRet:: removeitem BS_SCRIPTING return -BattleScript_BerryCureChosenStatusEnd2:: - call BattleScript_BerryCureChosenStatusRet - end2 - -BattleScript_BerryCureChosenStatusRet:: - playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT - printfromtable gBerryEffectStringIds - waitmessage B_WAIT_TIME_LONG - updatestatusicon BS_SCRIPTING - removeitem BS_SCRIPTING - return - BattleScript_MentalHerbCureRet:: - playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT + playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printfromtable gMentalHerbCureStringIds waitmessage B_WAIT_TIME_LONG updatestatusicon BS_SCRIPTING removeitem BS_SCRIPTING - copybyte gBattlerAttacker, sSAVED_BATTLER @ restore the original attacker just to be safe return BattleScript_MentalHerbCureEnd2:: @@ -8737,14 +7655,13 @@ BattleScript_ItemHealHP_RemoveItemRet:: jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_ItemHealHP_RemoveItemRet_AbilityPopUp goto BattleScript_ItemHealHP_RemoveItemRet_Anim BattleScript_ItemHealHP_RemoveItemRet_AbilityPopUp: - call BattleScript_AbilityPopUp + call BattleScript_AbilityPopUpScripting BattleScript_ItemHealHP_RemoveItemRet_Anim: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMRESTOREDHEALTH waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_SCRIPTING - datahpupdate BS_SCRIPTING + healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE removeitem BS_SCRIPTING return @@ -8752,27 +7669,26 @@ BattleScript_ItemHealHP_RemoveItemEnd2:: jumpifability BS_ATTACKER, ABILITY_RIPEN, BattleScript_ItemHealHP_RemoveItemEnd2_AbilityPopUp goto BattleScript_ItemHealHP_RemoveItemEnd2_Anim BattleScript_ItemHealHP_RemoveItemEnd2_AbilityPopUp: - call BattleScript_AbilityPopUp + call BattleScript_AbilityPopUpScripting BattleScript_ItemHealHP_RemoveItemEnd2_Anim: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMRESTOREDHEALTH waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE removeitem BS_ATTACKER end2 BattleScript_BerryPPHealRet:: - jumpifability BS_ATTACKER, ABILITY_RIPEN, BattleScript_BerryPPHeal_AbilityPopup + jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_BerryPPHeal_AbilityPopup goto BattleScript_BerryPPHeal_Anim BattleScript_BerryPPHeal_AbilityPopup: - call BattleScript_AbilityPopUp + call BattleScript_AbilityPopUpScripting BattleScript_BerryPPHeal_Anim: - playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT + playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMRESTOREDPP waitmessage B_WAIT_TIME_LONG - removeitem BS_ATTACKER + removeitem BS_SCRIPTING return BattleScript_BerryPPHealEnd2:: @@ -8783,21 +7699,25 @@ BattleScript_ItemHealHP_End2:: call BattleScript_ItemHealHP_Ret end2 -BattleScript_AirBaloonMsgIn:: +BattleScript_AirBalloonMsgIn:: printstring STRINGID_AIRBALLOONFLOAT waitmessage B_WAIT_TIME_LONG end3 -BattleScript_AirBaloonMsgPop:: +BattleScript_AirBalloonMsgInRet:: + printstring STRINGID_AIRBALLOONFLOAT + waitmessage B_WAIT_TIME_LONG + return + +BattleScript_AirBalloonMsgPop:: printstring STRINGID_AIRBALLOONPOP waitmessage B_WAIT_TIME_LONG removeitem BS_TARGET return BattleScript_ItemHurtRet:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_IGNORE_DISGUISE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_HURTBYITEM waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER @@ -8813,9 +7733,8 @@ BattleScript_ItemHealHP_Ret:: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMRESTOREDHPALITTLE waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE return BattleScript_SelectingNotAllowedMoveChoiceItem:: @@ -8868,10 +7787,9 @@ BattleScript_BerryConfuseHealEnd2_Anim: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMRESTOREDHEALTH waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_SCRIPTING - datahpupdate BS_SCRIPTING - seteffectprimary MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER + healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + seteffectprimary BS_SCRIPTING, BS_SCRIPTING, MOVE_EFFECT_CONFUSION removeitem BS_SCRIPTING end2 @@ -8884,11 +7802,10 @@ BattleScript_BerryConfuseHealRet_Anim: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMRESTOREDHEALTH waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_SCRIPTING - datahpupdate BS_SCRIPTING - seteffectprimary MOVE_EFFECT_CONFUSION | MOVE_EFFECT_CERTAIN - removeitem BS_TARGET + healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + seteffectprimary BS_SCRIPTING, BS_SCRIPTING, MOVE_EFFECT_CONFUSION + removeitem BS_SCRIPTING return BattleScript_ConsumableStatRaiseEnd2:: @@ -8896,24 +7813,22 @@ BattleScript_ConsumableStatRaiseEnd2:: end2 BattleScript_ConsumableStatRaiseRet:: - @ to ensure `statbuffchange` has correct battler id, backup and use target - savetarget - copybyte gBattlerTarget, sBATTLER jumpifnotberry BS_SCRIPTING, BattleScript_ConsumableStatRaiseRet_Anim - @ check ripen popup if consuming berry jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_ConsumableStatRaiseRet_AbilityPopup goto BattleScript_ConsumableStatRaiseRet_Anim BattleScript_ConsumableStatRaiseRet_AbilityPopup: call BattleScript_AbilityPopUp BattleScript_ConsumableStatRaiseRet_Anim: - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_ConsumableStatRaiseRet_End - setgraphicalstatchangevalues + statbuffchange BS_SCRIPTING, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_ConsumableStatRaiseRet_End playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, sB_ANIM_ARG1 - setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_ITEM + statbuffchange BS_SCRIPTING, STAT_CHANGE_ALLOW_PTR, BattleScript_ConsumableStatRaiseRet_End + setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGED_ITEM + savetarget + copybyte gBattlerTarget, sBATTLER @ BattleScript_StatUp uses target as a message arg call BattleScript_StatUp + restoretarget removeitem BS_SCRIPTING BattleScript_ConsumableStatRaiseRet_End: - restoretarget return BattleScript_BerryFocusEnergyRet:: @@ -8938,7 +7853,7 @@ BattleScript_FlushMessageBox:: BattleScript_PalacePrintFlavorText:: setbyte gBattleCommunication + 1, 0 BattleScript_PalaceTryBattlerFlavorText:: - palaceflavortext BS_ATTACKER @ BS_ATTACKER here overwritten by gBattleCommunication + 1 + palaceflavortext jumpifbyte CMP_NOT_EQUAL, gBattleCommunication, TRUE, BattleScript_PalaceEndFlavorText printfromtable gBattlePalaceFlavorTextTable waitmessage B_WAIT_TIME_LONG @@ -8950,16 +7865,16 @@ BattleScript_PalaceEndFlavorText:: end2 BattleScript_ArenaTurnBeginning:: - waitcry BS_ATTACKER + waitcry volumedown playse SE_ARENA_TIMEUP1 pause 8 playse SE_ARENA_TIMEUP1 - arenadrawreftextbox + drawarenareftextbox arenajudgmentstring B_MSG_REF_COMMENCE_BATTLE - arenawaitmessage B_MSG_REF_COMMENCE_BATTLE + arenawaitmessage pause B_WAIT_TIME_LONG - arenaerasereftextbox + erasearenareftextbox volumeup end2 @@ -8973,74 +7888,78 @@ BattleScript_ArenaDoJudgment:: pause 8 playse SE_ARENA_TIMEUP1 pause B_WAIT_TIME_LONG - arenadrawreftextbox + drawarenareftextbox arenajudgmentstring B_MSG_REF_THATS_IT - arenawaitmessage B_MSG_REF_THATS_IT + arenawaitmessage pause B_WAIT_TIME_LONG setbyte gBattleCommunication, 0 @ Reset state for arenajudgmentwindow arenajudgmentwindow pause B_WAIT_TIME_LONG arenajudgmentwindow arenajudgmentstring B_MSG_REF_JUDGE_MIND - arenawaitmessage B_MSG_REF_JUDGE_MIND + arenawaitmessage arenajudgmentwindow arenajudgmentstring B_MSG_REF_JUDGE_SKILL - arenawaitmessage B_MSG_REF_JUDGE_SKILL + arenawaitmessage arenajudgmentwindow arenajudgmentstring B_MSG_REF_JUDGE_BODY - arenawaitmessage B_MSG_REF_JUDGE_BODY + arenawaitmessage arenajudgmentwindow jumpifbyte CMP_EQUAL, gBattleCommunication + 1, ARENA_RESULT_PLAYER_LOST, BattleScript_ArenaJudgmentPlayerLoses jumpifbyte CMP_EQUAL, gBattleCommunication + 1, ARENA_RESULT_TIE, BattleScript_ArenaJudgmentDraw @ ARENA_RESULT_PLAYER_WON arenajudgmentstring B_MSG_REF_PLAYER_WON - arenawaitmessage B_MSG_REF_PLAYER_WON + arenawaitmessage arenajudgmentwindow - arenaerasereftextbox + erasearenareftextbox printstring STRINGID_DEFEATEDOPPONENTBYREFEREE waitmessage B_WAIT_TIME_LONG playfaintcry BS_OPPONENT1 - waitcry BS_ATTACKER + waitcry dofaintanimation BS_OPPONENT1 cleareffectsonfaint BS_OPPONENT1 + waitanimation arenaopponentmonlost end2 BattleScript_ArenaJudgmentPlayerLoses: arenajudgmentstring B_MSG_REF_OPPONENT_WON - arenawaitmessage B_MSG_REF_OPPONENT_WON + arenawaitmessage arenajudgmentwindow - arenaerasereftextbox + erasearenareftextbox printstring STRINGID_LOSTTOOPPONENTBYREFEREE waitmessage B_WAIT_TIME_LONG playfaintcry BS_PLAYER1 - waitcry BS_ATTACKER + waitcry dofaintanimation BS_PLAYER1 cleareffectsonfaint BS_PLAYER1 + waitanimation arenaplayermonlost end2 BattleScript_ArenaJudgmentDraw: arenajudgmentstring B_MSG_REF_DRAW - arenawaitmessage B_MSG_REF_DRAW + arenawaitmessage arenajudgmentwindow - arenaerasereftextbox + erasearenareftextbox printstring STRINGID_TIEDOPPONENTBYREFEREE waitmessage B_WAIT_TIME_LONG + arenabothmonslost playfaintcry BS_PLAYER1 - waitcry BS_ATTACKER + waitcry dofaintanimation BS_PLAYER1 cleareffectsonfaint BS_PLAYER1 + waitanimation playfaintcry BS_OPPONENT1 - waitcry BS_ATTACKER + waitcry dofaintanimation BS_OPPONENT1 cleareffectsonfaint BS_OPPONENT1 - arenabothmonlost + waitanimation end2 BattleScript_AskIfWantsToForfeitMatch:: printselectionstring STRINGID_QUESTIONFORFEITMATCH - forfeityesnobox BS_ATTACKER + forfeityesnobox endselectionscript BattleScript_PrintPlayerForfeited:: @@ -9071,24 +7990,30 @@ BattleScript_MirrorHerbCopyStatChange:: printstring STRINGID_MIRRORHERBCOPIED waitmessage B_WAIT_TIME_LONG removeitem BS_SCRIPTING - playanimation BS_SCRIPTING, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 BattleScript_MirrorHerbStartCopyStats: copyfoesstatincrease BS_SCRIPTING, BattleScript_MirrorHerbStartReturn - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_MirrorHerbStartReturn + statbuffchange BS_SCRIPTING, STAT_CHANGE_ALLOW_PTR, BattleScript_MirrorHerbStartReturn + setbyte sSTAT_ANIM_PLAYED, TRUE @ play stat change animation only once goto BattleScript_MirrorHerbStartCopyStats BattleScript_MirrorHerbStartReturn: + setbyte sSTAT_ANIM_PLAYED, FALSE return BattleScript_OpportunistCopyStatChange:: call BattleScript_AbilityPopUpScripting - playanimation BS_SCRIPTING, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 BattleScript_OpportunistStartCopyStats: copyfoesstatincrease BS_SCRIPTING, BattleScript_OpportunistCopyStatChangeEnd - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_OpportunistCopyStatChangeEnd + statbuffchange BS_SCRIPTING, STAT_CHANGE_ALLOW_PTR, BattleScript_OpportunistCopyStatChangeEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG + setbyte sSTAT_ANIM_PLAYED, TRUE @ play stat change animation only once goto BattleScript_OpportunistStartCopyStats BattleScript_OpportunistCopyStatChangeEnd: + setbyte sSTAT_ANIM_PLAYED, FALSE + return + +BattleScript_OpportunistCopyStatChangeEnd3:: + call BattleScript_OpportunistCopyStatChange end3 BattleScript_TotemVar:: @@ -9100,9 +8025,7 @@ BattleScript_TotemVar_Ret:: BattleScript_TotemVarEnd: return BattleScript_ApplyTotemVarBoost: - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TotemVarEnd - setgraphicalstatchangevalues - playanimation BS_SCRIPTING, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_TotemVarEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_TotemVar_Ret @loop until stats bitfield is empty @@ -9125,12 +8048,27 @@ BattleScript_ActivateTeraformZero_RemoveWeather: removeweather printfromtable gWeatherEndsStringIds waitmessage B_WAIT_TIME_LONG - jumpifhalfword CMP_NO_COMMON_BITS, gFieldStatuses, STATUS_FIELD_TERRAIN_ANY, BattleScript_ActivateTeraformZero_End + call BattleScript_ActivateWeatherAbilities + jumpifhalfword CMP_NO_COMMON_BITS, gFieldStatuses, STATUS_FIELD_TERRAIN_ANY, BattleScript_ActivateTeraformZeroEffects BattleScript_ActivateTeraformZero_RemoveTerrain: removeterrain playanimation BS_ATTACKER, B_ANIM_RESTORE_BG printfromtable gTerrainStringIds waitmessage B_WAIT_TIME_LONG +BattleScript_ActivateTeraformZeroEffects: + saveattacker + savetarget + tryboosterenergy ON_ANY + resetterrainabilityflags + setbyte gBattlerAttacker, 0 +BattleScript_ActivateTeraformZeroLoop: + copyarraywithindex gBattlerTarget, gBattlerByTurnOrder, gBattlerAttacker, 1 + activateterrainchangeabilities BS_TARGET + activateweatherchangeabilities BS_TARGET + addbyte gBattlerAttacker, 1 + jumpifbytenotequal gBattlerAttacker, gBattlersCount, BattleScript_ActivateTeraformZeroLoop + restoreattacker + restoretarget BattleScript_ActivateTeraformZero_End: end3 @@ -9174,7 +8112,7 @@ BattleScript_MicleBerryActivateRet:: jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_MicleBerryActivateRet_Ripen goto BattleScript_MicleBerryActivateRet_Anim BattleScript_MicleBerryActivateRet_Ripen: - call BattleScript_AbilityPopUp + call BattleScript_AbilityPopUpScripting BattleScript_MicleBerryActivateRet_Anim: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_MICLEBERRYACTIVATES @@ -9217,33 +8155,21 @@ BattleScript_ZMoveActivateStatus:: copybyte sSTATCHANGER, sSAVED_STAT_CHANGER return -BattleScript_ZMoveActivatePowder:: - flushtextbox - trytrainerslidezmovemsg - savetarget - printstring STRINGID_ZPOWERSURROUNDS - playanimation BS_ATTACKER, B_ANIM_ZMOVE_ACTIVATE, NULL - setzeffect - restoretarget - goto BattleScript_MoveUsedPowder - BattleScript_ZEffectPrintString:: printfromtable gZEffectStringIds waitmessage B_WAIT_TIME_LONG return BattleScript_RecoverHPZMove:: - healthbarupdate BS_SCRIPTING - datahpupdate BS_SCRIPTING + healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE printfromtable gZEffectStringIds waitmessage B_WAIT_TIME_LONG return BattleScript_StatUpZMove:: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_StatUpZMoveEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StatUpZMoveEnd - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_StatUpZMoveEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_StatUpZMoveEnd printstring STRINGID_ZMOVESTATUP waitmessage B_WAIT_TIME_LONG printfromtable gStatUpStringIds @@ -9252,17 +8178,15 @@ BattleScript_StatUpZMoveEnd: return BattleScript_HealReplacementZMove:: - playanimation BS_SCRIPTING B_ANIM_WISH_HEAL 0x0 + playanimation BS_SCRIPTING, B_ANIM_WISH_HEAL, 0x0 printfromtable gZEffectStringIds waitmessage B_WAIT_TIME_LONG - healthbarupdate BS_SCRIPTING - datahpupdate BS_SCRIPTING + healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE return BattleScript_EffectExtremeEvoboost:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_ExtremeEvoboostAnim jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_DEF, MAX_STAT_STAGE, BattleScript_ExtremeEvoboostAnim jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPEED, MAX_STAT_STAGE, BattleScript_ExtremeEvoboostAnim @@ -9272,95 +8196,48 @@ BattleScript_EffectExtremeEvoboost:: BattleScript_ExtremeEvoboostAnim: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_SPEED | BIT_SPATK | BIT_SPDEF, 0x0 setstatchanger STAT_ATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostDef + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostDef, BIT_DEF | BIT_SPEED | BIT_SPATK | BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ExtremeEvoboostDef:: setstatchanger STAT_DEF, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostSpeed + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostSpeed, BIT_SPEED | BIT_SPATK | BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ExtremeEvoboostSpeed:: setstatchanger STAT_SPEED, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostSpAtk + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostSpAtk, BIT_SPATK | BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ExtremeEvoboostSpAtk:: setstatchanger STAT_SPATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostSpDef + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostSpDef, BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ExtremeEvoboostSpDef:: setstatchanger STAT_SPDEF, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ExtremeEvoboostEnd:: goto BattleScript_MoveEnd -BattleScript_EffectHitSetRemoveTerrain:: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - jumpifmovepropertyargument ARG_TRY_REMOVE_TERRAIN_FAIL, BattleScript_RemoveTerrain - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG - setremoveterrain BattleScript_TryFaint - playanimation BS_ATTACKER, B_ANIM_RESTORE_BG - printfromtable gTerrainStringIds - waitmessage B_WAIT_TIME_LONG -BattleScript_TryFaint: - tryfaintmon BS_TARGET - goto BattleScript_MoveEnd - -BattleScript_RemoveTerrain: - jumpifterrainaffected BS_TARGET, STATUS_FIELD_TERRAIN_ANY, BattleScript_RemoveTerrain_Cont - goto BattleScript_ButItFailed -BattleScript_RemoveTerrain_Cont: - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG +BattleScript_RemoveTerrain:: removeterrain playanimation BS_ATTACKER, B_ANIM_RESTORE_BG printfromtable gTerrainStringIds waitmessage B_WAIT_TIME_LONG - tryfaintmon BS_TARGET - goto BattleScript_MoveEnd + return BattleScript_Pickpocket:: call BattleScript_AbilityPopUp jumpifability BS_ATTACKER, ABILITY_STICKY_HOLD, BattleScript_PickpocketPrevented swapattackerwithtarget + copybyte gEffectBattler, gBattlerTarget call BattleScript_ItemSteal swapattackerwithtarget - activateitemeffects BS_TARGET + activateitemeffects return BattleScript_PickpocketPrevented: @@ -9392,7 +8269,7 @@ BattleScript_RedCardActivates:: printstring STRINGID_REDCARDACTIVATE waitmessage B_WAIT_TIME_LONG swapattackerwithtarget - jumpifstatus3 BS_EFFECT_BATTLER, STATUS3_ROOTED, BattleScript_RedCardIngrain + jumpifvolatile BS_EFFECT_BATTLER, VOLATILE_ROOT, BattleScript_RedCardIngrain jumpifability BS_EFFECT_BATTLER, ABILITY_SUCTION_CUPS, BattleScript_RedCardSuctionCups jumpiftargetdynamaxed BattleScript_RedCardDynamaxed removeitem BS_SCRIPTING @@ -9425,12 +8302,12 @@ BattleScript_EjectButtonActivates:: undodynamax BS_SCRIPTING makeinvisible BS_SCRIPTING openpartyscreen BS_SCRIPTING, BattleScript_EjectButtonEnd + waitstate + returntoball BS_SCRIPTING, FALSE copybyte sSAVED_BATTLER, sBATTLER switchoutabilities BS_SCRIPTING copybyte sBATTLER, sSAVED_BATTLER - waitstate - switchhandleorder BS_SCRIPTING 0x2 - returntoball BS_SCRIPTING, FALSE + switchhandleorder BS_SCRIPTING, 0x2 getswitchedmondata BS_SCRIPTING switchindataupdate BS_SCRIPTING hpthresholds BS_SCRIPTING @@ -9450,13 +8327,15 @@ BattleScript_EjectPackActivate_End2:: call BattleScript_EjectPackActivate_Ret end2 +BattleScript_EjectPackActivate_End3:: + call BattleScript_EjectPackActivate_Ret + end3 + BattleScript_EjectPackActivates:: jumpifcantswitch BS_SCRIPTING, BattleScript_EjectButtonEnd goto BattleScript_EjectPackActivate_Ret -BattleScript_DarkTypePreventsPrankster:: - attackstring - ppreduce +BattleScript_DoesntAffectTargetAtkString:: pause B_WAIT_TIME_SHORT printstring STRINGID_ITDOESNTAFFECT waitmessage B_WAIT_TIME_LONG @@ -9464,8 +8343,6 @@ BattleScript_DarkTypePreventsPrankster:: goto BattleScript_MoveEnd BattleScript_WellBakedBodyActivates:: - attackstring - ppreduce pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUpTarget setmoveresultflags MOVE_RESULT_NO_EFFECT @@ -9474,8 +8351,6 @@ BattleScript_WellBakedBodyEnd: goto BattleScript_MoveEnd BattleScript_WindRiderActivatesMoveEnd:: - attackstring - ppreduce pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUpTarget setmoveresultflags MOVE_RESULT_NO_EFFECT @@ -9484,8 +8359,6 @@ BattleScript_WindRiderActivatesMoveEnd_End: goto BattleScript_MoveEnd BattleScript_GoodAsGoldActivates:: - attackstring - ppreduce call BattleScript_AbilityPopUpTarget pause B_WAIT_TIME_SHORT printstring STRINGID_ITDOESNTAFFECT @@ -9514,6 +8387,7 @@ BattleScript_PastelVeilLoopIncrement: setallytonexttarget BattleScript_PastelVeil_TryCurePoison goto BattleScript_PastelVeilEnd BattleScript_PastelVeilEnd: + restoretarget end3 BattleScript_NeutralizingGasExits:: @@ -9525,8 +8399,7 @@ BattleScript_NeutralizingGasExits:: setbyte gBattlerAttacker, 0 BattleScript_NeutralizingGasExitsLoop: copyarraywithindex gBattlerTarget, gBattlerByTurnOrder, gBattlerAttacker, 1 - jumpifabilitycantbesuppressed BS_TARGET, BattleScript_NeutralizingGasExitsLoopIncrement - jumpifability BS_TARGET, ABILITY_IMPOSTER, BattleScript_NeutralizingGasExitsLoopIncrement @ Imposter only activates when first entering the field + jumpifabilitycantbereactivated BS_TARGET, BattleScript_NeutralizingGasExitsLoopIncrement saveattacker switchinabilities BS_TARGET restoreattacker @@ -9549,98 +8422,75 @@ BattleScript_SymbiosisActivates:: return BattleScript_TargetAbilityStatRaiseRet:: - copybyte sSAVED_BATTLER, gBattlerAttacker - copybyte gBattlerAbility, gEffectBattler - copybyte gBattlerAttacker, gBattlerTarget + saveattacker + copybyte gBattlerAttacker, gEffectBattler call BattleScript_AbilityPopUp - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN, BattleScript_TargetAbilityStatRaiseRet_End - setgraphicalstatchangevalues + statbuffchange BS_ATTACKER, STAT_CHANGE_CERTAIN, BattleScript_TargetAbilityStatRaiseRet_End call BattleScript_StatUp BattleScript_TargetAbilityStatRaiseRet_End: - copybyte gBattlerAttacker, sSAVED_BATTLER + restoreattacker return @@@ MAX MOVES @@@ BattleScript_EffectMaxMove:: attackcanceler accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON - attackstring - ppreduce - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG - tryfaintmon BS_TARGET - setadditionaleffects - moveendall - end + goto BattleScript_HitFromCritCalc BattleScript_EffectRaiseStatAllies:: savetarget copybyte gBattlerTarget, gBattlerAttacker + copybyte sSAVED_STAT_CHANGER, sSTATCHANGER BattleScript_RaiseSideStatsLoop: jumpifabsent BS_TARGET, BattleScript_RaiseSideStatsIncrement - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_RaiseSideStatsIncrement - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_RaiseSideStatsIncrement - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + copybyte sSTATCHANGER, sSAVED_STAT_CHANGER + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_RaiseSideStatsIncrement + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_RaiseSideStatsIncrement printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_RaiseSideStatsIncrement: - setbyte sSTAT_ANIM_PLAYED, FALSE jumpifbytenotequal gBattlerTarget, gBattlerAttacker, BattleScript_RaiseSideStatsEnd setallytonexttarget BattleScript_RaiseSideStatsLoop BattleScript_RaiseSideStatsEnd: restoretarget - goto BattleScript_MoveEnd + return BattleScript_EffectLowerStatFoes:: savetarget copybyte sBATTLER, gBattlerTarget + copybyte sSAVED_STAT_CHANGER, sSTATCHANGER BattleScript_LowerSideStatsLoop: jumpifabsent BS_TARGET, BattleScript_LowerSideStatsIncrement - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_LowerSideStatsIncrement - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_LowerSideStatsIncrement - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + copybyte sSTATCHANGER, sSAVED_STAT_CHANGER + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_LowerSideStatsIncrement + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_LowerSideStatsIncrement printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_LowerSideStatsIncrement: - setbyte sSTAT_ANIM_PLAYED, FALSE jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_LowerSideStatsEnd setallytonexttarget BattleScript_LowerSideStatsLoop BattleScript_LowerSideStatsEnd: restoretarget - goto BattleScript_MoveEnd + return BattleScript_EffectSetWeather:: playanimation 0, B_ANIM_MAX_SET_WEATHER printfromtable gMoveWeatherChangeStringIds waitmessage B_WAIT_TIME_LONG call BattleScript_ActivateWeatherAbilities - goto BattleScript_MoveEnd + return BattleScript_EffectSetTerrain:: printfromtable gTerrainStringIds waitmessage B_WAIT_TIME_LONG playanimation BS_ATTACKER, B_ANIM_RESTORE_BG call BattleScript_ActivateTerrainEffects - goto BattleScript_MoveEnd + return BattleScript_DamageNonTypesStarts:: printfromtable gDamageNonTypesStartStringIds waitmessage B_WAIT_TIME_LONG - goto BattleScript_MoveEnd + return BattleScript_DamageNonTypesContinues:: printfromtable gDamageNonTypesDmgStringIds @@ -9653,7 +8503,7 @@ BattleScript_EffectTryReducePP:: tryspiteppreduce BattleScript_MoveEnd printstring STRINGID_PKMNREDUCEDPP waitmessage B_WAIT_TIME_LONG - goto BattleScript_MoveEnd + return BattleScript_EffectParalyzeSide:: savetarget @@ -9661,18 +8511,12 @@ BattleScript_EffectParalyzeSide:: BattleScript_ParalyzeSideLoop: jumpifabsent BS_TARGET, BattleScript_ParalyzeSideIncrement trysetparalysis BattleScript_ParalyzeSideIncrement - statusanimation BS_TARGET - updatestatusicon BS_TARGET - printfromtable gStatusConditionsStringIds - waitmessage B_WAIT_TIME_LONG - updatestatusicon BS_EFFECT_BATTLER - waitstate BattleScript_ParalyzeSideIncrement: jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_ParalyzeSideEnd setallytonexttarget BattleScript_ParalyzeSideLoop BattleScript_ParalyzeSideEnd: restoretarget - goto BattleScript_MoveEnd + return BattleScript_EffectPoisonSide:: savetarget @@ -9680,18 +8524,12 @@ BattleScript_EffectPoisonSide:: BattleScript_PoisonSideLoop: jumpifabsent BS_TARGET, BattleScript_PoisonSideIncrement trysetpoison BattleScript_PoisonSideIncrement - statusanimation BS_TARGET - updatestatusicon BS_TARGET - printfromtable gStatusConditionsStringIds - waitmessage B_WAIT_TIME_LONG - updatestatusicon BS_EFFECT_BATTLER - waitstate BattleScript_PoisonSideIncrement: jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_PoisonSideEnd setallytonexttarget BattleScript_PoisonSideLoop BattleScript_PoisonSideEnd: restoretarget - goto BattleScript_MoveEnd + return BattleScript_EffectPoisonParalyzeSide:: savetarget @@ -9699,18 +8537,12 @@ BattleScript_EffectPoisonParalyzeSide:: BattleScript_PoisonParalyzeSideLoop: jumpifabsent BS_TARGET, BattleScript_PoisonParalyzeSideIncrement trysetpoisonparalysis BattleScript_PoisonParalyzeSideIncrement - statusanimation BS_TARGET - updatestatusicon BS_TARGET - printfromtable gStatusConditionsStringIds - waitmessage B_WAIT_TIME_LONG - updatestatusicon BS_EFFECT_BATTLER - waitstate BattleScript_PoisonParalyzeSideIncrement: jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_PoisonParalyzeSideEnd setallytonexttarget BattleScript_PoisonParalyzeSideLoop BattleScript_PoisonParalyzeSideEnd: restoretarget - goto BattleScript_MoveEnd + return BattleScript_EffectEffectSporeSide:: savetarget @@ -9718,18 +8550,12 @@ BattleScript_EffectEffectSporeSide:: BattleScript_EffectSporeSideLoop: jumpifabsent BS_TARGET, BattleScript_EffectSporeSideIncrement tryseteffectspore BattleScript_EffectSporeSideIncrement - statusanimation BS_TARGET - updatestatusicon BS_TARGET - printfromtable gStatusConditionsStringIds - waitmessage B_WAIT_TIME_LONG - updatestatusicon BS_EFFECT_BATTLER - waitstate BattleScript_EffectSporeSideIncrement: jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_EffectSporeSideEnd setallytonexttarget BattleScript_EffectSporeSideLoop BattleScript_EffectSporeSideEnd: restoretarget - goto BattleScript_MoveEnd + return BattleScript_EffectConfuseSide:: savetarget @@ -9737,9 +8563,9 @@ BattleScript_EffectConfuseSide:: BattleScript_ConfuseSideLoop: jumpifabsent BS_TARGET, BattleScript_ConfuseSideIncrement trysetconfusion BattleScript_ConfuseSideIncrement - status2animation BS_EFFECT_BATTLER, STATUS2_CONFUSION + volatileanimation BS_EFFECT_BATTLER, VOLATILE_CONFUSION BattleScript_ConfuseSidePrintMessage: - printfromtable gStatus2StringIds + printstring STRINGID_PKMNWASCONFUSED waitmessage B_WAIT_TIME_LONG BattleScript_ConfuseSideIncrement: jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_ConfuseSideEnd @@ -9747,11 +8573,11 @@ BattleScript_ConfuseSideIncrement: BattleScript_ConfuseSideEnd: restoretarget jumpifbyte CMP_EQUAL, gBattleCommunication + 1, 1, BattleScript_PrintCoinsScattered @ Gold Rush - goto BattleScript_MoveEnd + return BattleScript_PrintCoinsScattered: printstring STRINGID_COINSSCATTERED - goto BattleScript_MoveEnd + return BattleScript_EffectInfatuateSide:: savetarget @@ -9759,16 +8585,16 @@ BattleScript_EffectInfatuateSide:: BattleScript_InfatuateSideLoop: jumpifabsent BS_TARGET, BattleScript_InfatuateSideIncrement trysetinfatuation BattleScript_InfatuateSideIncrement - status2animation BS_EFFECT_BATTLER, STATUS2_INFATUATION + volatileanimation BS_EFFECT_BATTLER, VOLATILE_INFATUATION BattleScript_InfatuateSidePrintMessage: - printfromtable gStatus2StringIds + printstring STRINGID_PKMNFELLINLOVE waitmessage B_WAIT_TIME_LONG BattleScript_InfatuateSideIncrement: jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_InfatuateSideEnd setallytonexttarget BattleScript_InfatuateSideLoop BattleScript_InfatuateSideEnd: restoretarget - goto BattleScript_MoveEnd + return BattleScript_EffectTormentSide:: savetarget @@ -9777,14 +8603,14 @@ BattleScript_TormentSideLoop: jumpifabsent BS_TARGET, BattleScript_TormentSideIncrement trysettorment BattleScript_TormentSideIncrement BattleScript_TormentSidePrintMessage: - printfromtable gStatus2StringIds + printstring STRINGID_PKMNSUBJECTEDTOTORMENT waitmessage B_WAIT_TIME_LONG BattleScript_TormentSideIncrement: jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_TormentSideEnd setallytonexttarget BattleScript_TormentSideLoop BattleScript_TormentSideEnd: restoretarget - goto BattleScript_MoveEnd + return BattleScript_TormentEnds:: printstring STRINGID_TORMENTEDNOMORE @@ -9798,14 +8624,14 @@ BattleScript_MeanLookSideLoop: jumpifabsent BS_TARGET, BattleScript_MeanLookSideIncrement trysetescapeprevention BattleScript_MeanLookSideIncrement BattleScript_MeanLookSidePrintMessage: - printfromtable gStatus2StringIds + printstring STRINGID_TARGETCANTESCAPENOW waitmessage B_WAIT_TIME_LONG BattleScript_MeanLookSideIncrement: jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_MeanLookSideEnd setallytonexttarget BattleScript_MeanLookSideLoop BattleScript_MeanLookSideEnd: restoretarget - goto BattleScript_MoveEnd + return BattleScript_EffectRaiseCritAlliesAnim:: savetarget @@ -9813,28 +8639,25 @@ BattleScript_EffectRaiseCritAlliesAnim:: BattleScript_RaiseCritAlliesLoop: jumpifabsent BS_TARGET, BattleScript_RaiseCritAlliesIncrement setstatchanger STAT_ATK, 0, FALSE @ for animation - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_TARGET, 0, BattleScript_RaiseCritAlliesIncrement @ for animation printstring STRINGID_PKMNGETTINGPUMPED waitmessage B_WAIT_TIME_LONG BattleScript_RaiseCritAlliesIncrement: - setbyte sSTAT_ANIM_PLAYED, FALSE jumpifbytenotequal gBattlerTarget, gBattlerAttacker, BattleScript_RaiseCritAlliesEnd setallytonexttarget BattleScript_RaiseCritAlliesLoop BattleScript_RaiseCritAlliesEnd: restoretarget - goto BattleScript_MoveEnd + return BattleScript_EffectHealOneSixthAllies:: - jumpifteamhealthy BS_ATTACKER, BattleScript_MoveEnd + jumpifteamhealthy BattleScript_MoveEnd savetarget copybyte gBattlerTarget, gBattlerAttacker BattleScript_HealOneSixthAlliesLoop: jumpifabsent BS_TARGET, BattleScript_HealOneSixthAlliesIncrement tryhealsixthhealth BattleScript_HealOneSixthAlliesIncrement - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG BattleScript_HealOneSixthAlliesIncrement: @@ -9842,7 +8665,7 @@ BattleScript_HealOneSixthAlliesIncrement: setallytonexttarget BattleScript_HealOneSixthAlliesLoop BattleScript_HealOneSixthAlliesEnd: restoretarget - goto BattleScript_MoveEnd + return BattleScript_EffectRecycleBerriesAllies:: savetarget @@ -9859,13 +8682,13 @@ BattleScript_RecycleBerriesAlliesIncrement: setallytonexttarget BattleScript_RecycleBerriesAlliesLoop BattleScript_RecycleBerriesAlliesEnd: restoretarget - goto BattleScript_MoveEnd + return BattleScript_EffectSteelsurge:: setsteelsurge BattleScript_MoveEnd printfromtable gDmgHazardsStringIds waitmessage B_WAIT_TIME_LONG - goto BattleScript_MoveEnd + return @@@ END MAX MOVES @@@ @@ -9907,28 +8730,22 @@ BattleScript_DynamaxEnds:: BattleScript_DynamaxEnds_Ret:: flushtextbox - spriteignore0hp TRUE + setspriteignore0hp TRUE updatedynamax playanimation BS_SCRIPTING, B_ANIM_FORM_CHANGE waitanimation - spriteignore0hp FALSE + setspriteignore0hp FALSE pause B_WAIT_TIME_SHORT return BattleScript_MoveBlockedByDynamax:: - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE pause B_WAIT_TIME_SHORT - ppreduce - jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_STRING_PRINTED, BattleScript_MoveEnd printstring STRINGID_MOVEBLOCKEDBYDYNAMAX waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_STRING_PRINTED goto BattleScript_MoveEnd BattleScript_PokemonCantUseTheMove:: - attackstring - ppreduce pause B_WAIT_TIME_SHORT printstring STRINGID_BUTPOKEMONCANTUSETHEMOVE waitmessage B_WAIT_TIME_LONG @@ -9940,18 +8757,15 @@ BattleScript_CouldntFullyProtect:: return BattleScript_BerserkGeneRet:: - saveattacker - savetarget - copybyte gBattlerTarget, sBATTLER - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_BerserkGeneRet_TryConfuse - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, sB_ANIM_ARG1 - setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_ITEM + statbuffchange BS_SCRIPTING, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_BerserkGeneRet_TryConfuse + playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, sB_ANIM_ARG1 + statbuffchange BS_SCRIPTING, STAT_CHANGE_ALLOW_PTR, BattleScript_BerserkGeneRet_TryConfuse + setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGED_ITEM call BattleScript_StatUp BattleScript_BerserkGeneRet_TryConfuse: - jumpifability BS_ATTACKER, ABILITY_OWN_TEMPO, BattleScript_BerserkGeneRet_OwnTempoPrevents + jumpifability BS_SCRIPTING, ABILITY_OWN_TEMPO, BattleScript_BerserkGeneRet_OwnTempoPrevents jumpifsafeguard BattleScript_BerserkGeneRet_SafeguardProtected - seteffectprimary MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER + seteffectprimary BS_SCRIPTING, BS_SCRIPTING, MOVE_EFFECT_CONFUSION goto BattleScript_BerserkGeneRet_End BattleScript_BerserkGeneRet_SafeguardProtected:: pause B_WAIT_TIME_SHORT @@ -9960,13 +8774,11 @@ BattleScript_BerserkGeneRet_SafeguardProtected:: goto BattleScript_BerserkGeneRet_End BattleScript_BerserkGeneRet_OwnTempoPrevents: pause B_WAIT_TIME_SHORT - call BattleScript_AbilityPopUp + call BattleScript_AbilityPopUpScripting printstring STRINGID_PKMNPREVENTSCONFUSIONWITH waitmessage B_WAIT_TIME_LONG BattleScript_BerserkGeneRet_End: - restoreattacker - restoretarget - removeitem BS_ATTACKER + removeitem BS_SCRIPTING return BattleScript_BerserkGeneRetEnd2:: @@ -9989,8 +8801,6 @@ BattleScript_BoosterEnergyRet:: BattleScript_EffectSnow:: attackcanceler - attackstring - ppreduce call BattleScript_CheckPrimalWeather setfieldweather BATTLE_WEATHER_SNOW goto BattleScript_MoveWeatherChange @@ -10002,7 +8812,7 @@ BattleScript_SleepClauseBlocked:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_SleepClausePreventsEnd:: +BattleScript_SleepClausePreventsEnd2:: pause B_WAIT_TIME_SHORT printstring STRINGID_BLOCKEDBYSLEEPCLAUSE waitmessage B_WAIT_TIME_LONG @@ -10010,16 +8820,74 @@ BattleScript_SleepClausePreventsEnd:: BattleScript_QuestionForfeitBattle:: printselectionstring STRINGID_QUESTIONFORFEITBATTLE - forfeityesnobox BS_ATTACKER + forfeityesnobox endselectionscript BattleScript_ForfeitBattleGaveMoney:: getmoneyreward .if B_WHITEOUT_MONEY >= GEN_4 - printstring STRINGID_FORFEITBATTLEGAVEMONEY + printstring STRINGID_PLAYERWHITEOUT2_TRAINER .else - printstring STRINGID_PLAYERWHITEOUT2 + printstring STRINGID_PLAYERWHITEOUT3 .endif waitmessage B_WAIT_TIME_LONG end2 +BattleScript_Attackstring:: + printattackstring + return + +BattleScript_SubmoveAttackstring:: + printattackstring + pause B_WAIT_TIME_LONG + attackanimation + waitanimation + setcalledmove + return + +BattleScript_SleepTalkAttackstring:: + printattackstring + pause B_WAIT_TIME_LONG + printstring STRINGID_PKMNFASTASLEEP + waitmessage B_WAIT_TIME_LONG + statusanimation BS_ATTACKER + attackanimation + waitanimation + setcalledmove + return + +BattleScript_MetronomeAttackstring:: + printattackstring + pause B_WAIT_TIME_LONG + attackanimation + waitanimation + setcalledmove + printstring STRINGID_WAGGLINGAFINGER + waitmessage B_WAIT_TIME_LONG + return + +BattleScript_NaturePowerAttackstring:: + printattackstring + pause B_WAIT_TIME_SHORT + setcalledmove + printstring STRINGID_NATUREPOWERTURNEDINTO + waitmessage B_WAIT_TIME_LONG + return + +BattleScript_SwapFromSubstitute:: + jumpifvolatile BS_SCRIPTING, VOLATILE_SUBSTITUTE, BattleScript_SwapFromSubstituteContinue + goto BattleScript_SwapFromSubstituteReturn +BattleScript_SwapFromSubstituteContinue: + playanimation BS_SCRIPTING, B_ANIM_SWAP_FROM_SUBSTITUTE + waitanimation +BattleScript_SwapFromSubstituteReturn: + return + +BattleScript_SwapToSubstitute:: + jumpifvolatile BS_SCRIPTING, VOLATILE_SUBSTITUTE, BattleScript_SwapToSubstituteContinue + goto BattleScript_SwapToSubstituteReturn +BattleScript_SwapToSubstituteContinue: + playanimation BS_SCRIPTING, B_ANIM_SWAP_TO_SUBSTITUTE + waitanimation +BattleScript_SwapToSubstituteReturn: + return diff --git a/data/battle_scripts_2.s b/data/battle_scripts_2.s old mode 100644 new mode 100755 index 27e3706e3f75..5f7cc23a8cba --- a/data/battle_scripts_2.s +++ b/data/battle_scripts_2.s @@ -49,9 +49,8 @@ BattleScript_UseItemMessage: BattleScript_ItemRestoreHPRet: clearmoveresultflags MOVE_RESULT_NO_EFFECT - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_SCRIPTING - datahpupdate BS_SCRIPTING + healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE printstring STRINGID_ITEMRESTOREDSPECIESHEALTH waitmessage B_WAIT_TIME_LONG return @@ -75,6 +74,10 @@ BattleScript_ItemRestoreHP_Party:: return BattleScript_ItemRestoreHP_SendOutRevivedBattler: + switchhandleorder BS_SCRIPTING, 0 + getswitchedmondata BS_SCRIPTING + switchindataupdate BS_SCRIPTING + trytoclearprimalweather switchinanim BS_SCRIPTING, FALSE, FALSE waitstate switchineffects BS_SCRIPTING @@ -83,13 +86,18 @@ BattleScript_ItemRestoreHP_SendOutRevivedBattler: BattleScript_ItemCureStatus:: call BattleScript_UseItemMessage BattleScript_ItemCureStatusAfterItemMsg: - itemcurestatus BattleScript_ItemCureStatusEnd - updatestatusicon BS_SCRIPTING + itemcurestatus BattleScript_ItemCureStatusEnd, BattleScript_CureStatus_Battler printstring STRINGID_ITEMCUREDSPECIESSTATUS waitmessage B_WAIT_TIME_LONG BattleScript_ItemCureStatusEnd: end +BattleScript_CureStatus_Battler:: + updatestatusicon BS_SCRIPTING + printstring STRINGID_ITEMCUREDSPECIESSTATUS + waitmessage B_WAIT_TIME_LONG + end + BattleScript_ItemHealAndCureStatus:: call BattleScript_UseItemMessage itemrestorehp BattleScript_ItemCureStatusAfterItemMsg, BattleScript_ItemHealAndCureStatus_Battler @@ -104,9 +112,7 @@ BattleScript_ItemHealAndCureStatusEnd:: BattleScript_ItemIncreaseStat:: call BattleScript_UseItemMessage itemincreasestat - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_ItemEnd - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange BS_ATTACKER, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_ItemEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG end @@ -133,7 +139,7 @@ BattleScript_PokeFluteEnd:: BattleScript_ItemSetMist:: call BattleScript_UseItemMessage setmist - playmoveanimation BS_ATTACKER, MOVE_MIST + playmoveanimation MOVE_MIST waitanimation printfromtable gMistUsedStringIds waitmessage B_WAIT_TIME_LONG @@ -141,9 +147,10 @@ BattleScript_ItemSetMist:: BattleScript_ItemSetFocusEnergy:: call BattleScript_UseItemMessage - jumpifstatus2 BS_ATTACKER, STATUS2_FOCUS_ENERGY_ANY, BattleScript_ButItFailed + jumpifvolatile BS_ATTACKER, VOLATILE_DRAGON_CHEER, BattleScript_ButItFailed + jumpifvolatile BS_ATTACKER, VOLATILE_FOCUS_ENERGY, BattleScript_ButItFailed setfocusenergy BS_ATTACKER - playmoveanimation BS_ATTACKER, MOVE_FOCUS_ENERGY + playmoveanimation MOVE_FOCUS_ENERGY waitanimation copybyte sBATTLER, gBattlerAttacker printstring STRINGID_PKMNUSEDXTOGETPUMPED @@ -212,7 +219,10 @@ BattleScript_WallyBallThrow:: finishturn BattleScript_ShakeBallThrow:: + animatewildpokemonafterfailedpokeball BS_TARGET + waitmessage B_WAIT_TIME_LONG printfromtable gBallEscapeStringIds + waitanimation waitmessage B_WAIT_TIME_LONG jumpifword CMP_NO_COMMON_BITS, gBattleTypeFlags, BATTLE_TYPE_SAFARI, BattleScript_ShakeBallThrowEnd jumpifbyte CMP_NOT_EQUAL, gNumSafariBalls, 0, BattleScript_ShakeBallThrowEnd diff --git a/data/event_scripts.s b/data/event_scripts.s index db5d329b677d..73b171c206ea 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -3,6 +3,7 @@ #include "config/item.h" #include "constants/global.h" #include "constants/apprentice.h" +#include "constants/apricorn_tree.h" #include "constants/battle.h" #include "constants/battle_arena.h" #include "constants/battle_dome.h" @@ -25,6 +26,7 @@ #include "constants/event_objects.h" #include "constants/event_object_movement.h" #include "constants/field_effects.h" +#include "constants/field_move.h" #include "constants/field_poison.h" #include "constants/field_specials.h" #include "constants/field_tasks.h" @@ -42,6 +44,7 @@ #include "constants/maps.h" #include "constants/mauville_old_man.h" #include "constants/metatile_labels.h" +#include "constants/move_relearner.h" #include "constants/moves.h" #include "constants/party_menu.h" #include "constants/pokedex.h" @@ -61,6 +64,7 @@ #include "constants/union_room.h" #include "constants/vars.h" #include "constants/weather.h" +#include "constants/speaker_names.h" .include "asm/macros.inc" .include "asm/macros/event.inc" .include "constants/constants.inc" @@ -70,6 +74,7 @@ .set ALLOCATE_SCRIPT_CMD_TABLE, 1 .include "data/script_cmd_table.inc" +.align 2 gSpecialVars:: .4byte gSpecialVar_0x8000 .4byte gSpecialVar_0x8001 @@ -694,6 +699,7 @@ EventScript_SetBrineyLocation_Route109:: .include "data/scripts/obtain_item.inc" .include "data/scripts/record_mix.inc" .include "data/scripts/pc.inc" + .include "data/scripts/move_relearner.inc" @ scripts/notices.inc? signs.inc? See comment about text/notices.inc Common_EventScript_ShowPokemartSign:: @@ -834,7 +840,7 @@ EventScript_UnusedBoardFerry:: delay 30 applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 - showobjectat LOCALID_PLAYER, 0 + showplayer delay 30 applymovement LOCALID_PLAYER, Movement_UnusedBoardFerry waitmovement 0 @@ -849,7 +855,7 @@ Common_EventScript_FerryDepartIsland:: call_if_eq VAR_FACING, DIR_SOUTH, Ferry_EventScript_DepartIslandSouth call_if_eq VAR_FACING, DIR_WEST, Ferry_EventScript_DepartIslandWest delay 30 - hideobjectat LOCALID_PLAYER, 0 + hideplayer call Common_EventScript_FerryDepart return @@ -879,6 +885,7 @@ Common_EventScript_PlayerHandedOverTheItem:: .include "data/text/pkmn_center_nurse.inc" .include "data/text/mart_clerk.inc" .include "data/text/obtain_item.inc" + .include "data/text/move_relearner.inc" @ The below and surf.inc could be split into some text/notices.inc gText_PokemartSign:: @@ -1111,9 +1118,6 @@ EventScript_VsSeekerChargingDone:: .include "data/scripts/cable_club.inc" .include "data/text/cable_club.inc" .include "data/scripts/contest_hall.inc" - .include "data/text/contest_strings.inc" - .include "data/text/contest_link.inc" - .include "data/text/contest_painting.inc" .include "data/scripts/tv.inc" .include "data/text/tv.inc" .include "data/scripts/interview.inc" @@ -1157,3 +1161,5 @@ EventScript_VsSeekerChargingDone:: .include "data/text/save.inc" .include "data/text/birch_speech.inc" .include "data/scripts/dexnav.inc" + .include "data/scripts/battle_frontier.inc" + .include "data/scripts/apricorn_tree.inc" diff --git a/data/field_effect_scripts.s b/data/field_effect_scripts.s index 98ed66a13d39..ce71a102fdb9 100644 --- a/data/field_effect_scripts.s +++ b/data/field_effect_scripts.s @@ -81,6 +81,9 @@ gFieldEffectScriptPointers:: .4byte gFieldEffectScript_TracksSpot @ FLDEFF_TRACKS_SPOT .4byte gFieldEffectScript_CaveDust @ FLDEFF_CAVE_DUST .4byte gFieldEffectScript_Defog @ FLDEFF_DEFOG + .4byte gFieldEffectScript_UseRockClimb @ FLDEFF_USE_ROCK_CLIMB + .4byte gFieldEffectScript_RockClimbDust @ FLDEFF_ROCK_CLIMB_DUST + .4byte gFieldEffectScript_ORASDowse @ FLDEFF_ORAS_DOWSE gFieldEffectScript_ExclamationMarkIcon1:: field_eff_callnative FldEff_ExclamationMarkIcon @@ -384,3 +387,16 @@ gFieldEffectScript_CaveDust:: gFieldEffectScript_Defog:: field_eff_callnative FldEff_Defog field_eff_end + +gFieldEffectScript_UseRockClimb:: @ 82DBC3F + field_eff_callnative FldEff_UseRockClimb + field_eff_end + +gFieldEffectScript_RockClimbDust:: @ 82DBB28 + field_eff_loadfadedpal_callnative gSpritePalette_BigDust, FldEff_RockClimbDust + field_eff_end + +gFieldEffectScript_ORASDowse:: + field_eff_callnative FldEff_ORASDowsing + field_eff_end + diff --git a/data/map_events.s b/data/map_events.s index 729f9725dfef..13064da0255f 100644 --- a/data/map_events.s +++ b/data/map_events.s @@ -13,6 +13,7 @@ #include "constants/trainer_types.h" #include "constants/berry.h" #include "constants/species.h" +#include "constants/apricorn_tree.h" .include "asm/macros.inc" .include "constants/constants.inc" diff --git a/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc b/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc index 7969ca9eb779..fdcd609bc8dd 100644 --- a/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc @@ -182,10 +182,14 @@ BattleFrontier_BattleArenaLobby_EventScript_NotEnoughValidMons:: BattleFrontier_BattleArenaLobby_EventScript_NotEnoughValidMonsLv50:: msgbox BattleFrontier_BattleArenaLobby_Text_NotEnoughValidMonsLv50, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattleArenaLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattleArenaLobby_EventScript_EndCancelChallenge BattleFrontier_BattleArenaLobby_EventScript_NotEnoughValidMonsLvOpen:: msgbox BattleFrontier_BattleArenaLobby_Text_NotEnoughValidMonsLvOpen, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattleArenaLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattleArenaLobby_EventScript_EndCancelChallenge BattleFrontier_BattleArenaLobby_EventScript_CancelChallengeSaveFailed:: @@ -409,7 +413,9 @@ BattleFrontier_BattleArenaLobby_Text_NotEnoughValidMonsLvOpen: .string "different kinds of POKΓ©MON.\p" .string "They also must not hold the same\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" + .string "EGGS{STR_VAR_1}.$" + +BattleFrontier_BattleArenaLobby_Text_NotEnoughValidMonsEnd: .string "When you have made your preparations,\n" .string "please do return.$" @@ -423,9 +429,7 @@ BattleFrontier_BattleArenaLobby_Text_NotEnoughValidMonsLv50: .string "must all be Level 50 or lower.\p" .string "They also must not hold the same\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "When you have made your preparations,\n" - .string "please do return.$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattleArenaLobby_Text_GuideYouToArena: .string "I shall now guide you to\n" diff --git a/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc b/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc index cf6510189c4d..f3522ccfb684 100644 --- a/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc @@ -210,10 +210,14 @@ BattleFrontier_BattleDomeLobby_EventScript_NotEnoughValidMons:: BattleFrontier_BattleDomeLobby_EventScript_NotEnoughValidMonsLv50:: msgbox BattleFrontier_BattleDomeLobby_Text_NotEnoughValidMonsLv50, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattleDomeLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattleDomeLobby_EventScript_EndCancelChallenge BattleFrontier_BattleDomeLobby_EventScript_NotEnoughValidMonsLvOpen:: msgbox BattleFrontier_BattleDomeLobby_Text_NotEnoughValidMonsLvOpen, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattleDomeLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattleDomeLobby_EventScript_EndCancelChallenge BattleFrontier_BattleDomeLobby_EventScript_CancelChallengeSaveFailed:: @@ -486,7 +490,9 @@ BattleFrontier_BattleDomeLobby_Text_NotEnoughValidMonsLvOpen: .string "You don't have three eligible POKΓ©MON.\p" .string "Also, the POKΓ©MON must be holding\n" .string "different kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" + .string "EGGS{STR_VAR_1}.$" + +BattleFrontier_BattleDomeLobby_Text_NotEnoughValidMonsEnd: .string "Please come see me when you are ready.$" BattleFrontier_BattleDomeLobby_Text_NotEnoughValidMonsLv50: @@ -496,8 +502,7 @@ BattleFrontier_BattleDomeLobby_Text_NotEnoughValidMonsLv50: .string "of Level 50 or less to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "Please come see me when you are ready.$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattleDomeLobby_Text_ShowYouToBattleDome: .string "I will now show you to\n" diff --git a/data/maps/BattleFrontier_BattleDomePreBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleDomePreBattleRoom/scripts.inc index e06284c2caaf..3406d4121c30 100644 --- a/data/maps/BattleFrontier_BattleDomePreBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleDomePreBattleRoom/scripts.inc @@ -18,6 +18,7 @@ BattleFrontier_BattleDomePreBattleRoom_OnFrame: BattleFrontier_BattleDomePreBattleRoom_EventScript_EnterRoom:: goto_if_eq VAR_0x8006, 1, BattleFrontier_BattleDomePreBattleRoom_EventScript_ReturnFromBattle + delay 1 frontier_set FRONTIER_DATA_RECORD_DISABLED, TRUE setvar VAR_TEMP_0, 1 applymovement LOCALID_PLAYER, BattleFrontier_BattleDomePreBattleRoom_Movement_PlayerEnter diff --git a/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc b/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc index d80eaa49c296..9ef4479f2ef4 100644 --- a/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc @@ -202,10 +202,14 @@ BattleFrontier_BattlePalaceLobby_EventScript_NotEnoughValidMons:: BattleFrontier_BattlePalaceLobby_EventScript_NotEnoughValidMonsLv50:: msgbox BattleFrontier_BattlePalaceLobby_Text_NotEnoughValidMonsLv50, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattlePalaceLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattlePalaceLobby_EventScript_EndCancelChallenge BattleFrontier_BattlePalaceLobby_EventScript_NotEnoughValidMonsLvOpen:: msgbox BattleFrontier_BattlePalaceLobby_Text_NotEnoughValidMonsLvOpen, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattlePalaceLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattlePalaceLobby_EventScript_EndCancelChallenge BattleFrontier_BattlePalaceLobby_EventScript_CancelChallengeSaveFailed:: @@ -427,7 +431,9 @@ BattleFrontier_BattlePalaceLobby_Text_NotEnoughValidMonsLv50: .string "Level 50 or lower.\p" .string "They also must not be holding\n" .string "the same kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" + .string "EGGS{STR_VAR_1}.$" + +BattleFrontier_BattlePalaceLobby_Text_NotEnoughValidMonsEnd: .string "Come back when you have made\n" .string "your preparations.$" @@ -439,9 +445,7 @@ BattleFrontier_BattlePalaceLobby_Text_NotEnoughValidMonsLvOpen: .string "different kinds of POKΓ©MON.\p" .string "They also must not be holding\n" .string "the same kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "Come back when you have made\n" - .string "your preparations.$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattlePalaceLobby_Text_NowSelectThreeMons: .string "Good. Now, you must select your\n" diff --git a/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc b/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc index 6e72a30ec0cd..db0067355017 100644 --- a/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc @@ -172,10 +172,14 @@ BattleFrontier_BattlePikeLobby_EventScript_NotEnoughValidMons:: BattleFrontier_BattlePikeLobby_EventScript_NotEnoughValidMonsLv50:: msgbox BattleFrontier_BattlePikeLobby_Text_NotEnoughValidMonsLv50, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattlePikeLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattlePikeLobby_EventScript_EndCancelChallenge BattleFrontier_BattlePikeLobby_EventScript_NotEnoughValidMonsLvOpen:: msgbox BattleFrontier_BattlePikeLobby_Text_NotEnoughValidMonsLvOpen, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattlePikeLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattlePikeLobby_EventScript_EndCancelChallenge BattleFrontier_BattlePikeLobby_EventScript_CancelChallengeSaveFailed:: @@ -315,7 +319,9 @@ BattleFrontier_BattlePikeLobby_Text_NotEnoughValidMonsLv50: .string "of Level 50 or less to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" + .string "EGGS{STR_VAR_1}.$" + +BattleFrontier_BattlePikeLobby_Text_NotEnoughValidMonsEnd: .string "Please come see me when\n" .string "you are ready…$" @@ -327,9 +333,7 @@ BattleFrontier_BattlePikeLobby_Text_NotEnoughValidMonsLvOpen: .string "POKΓ©MON to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "Please come see me when\n" - .string "you are ready…$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattlePikeLobby_Text_PleaseChooseThreeMons: .string "Please choose the three POKΓ©MON\n" diff --git a/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc b/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc index a8f949ca58fe..75f3c37cd823 100644 --- a/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc @@ -184,10 +184,14 @@ BattleFrontier_BattlePyramidLobby_EventScript_NotEnoughValidMons:: BattleFrontier_BattlePyramidLobby_EventScript_NotEnoughValidMonsLv50:: msgbox BattleFrontier_BattlePyramidLobby_Text_NotEnoughValidMonsLv50, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattlePyramidLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattlePyramidLobby_EventScript_EndCancelChallenge BattleFrontier_BattlePyramidLobby_EventScript_NotEnoughValidMonsLvOpen:: msgbox BattleFrontier_BattlePyramidLobby_Text_NotEnoughValidMonsLvOpen, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattlePyramidLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattlePyramidLobby_EventScript_EndCancelChallenge BattleFrontier_BattlePyramidLobby_EventScript_CancelChallengeSaveFailed:: @@ -573,9 +577,7 @@ BattleFrontier_BattlePyramidLobby_Text_NotEnoughValidMonsLvOpen: .string "POKΓ©MON qualified for the challenge.\p" .string "Please also remember to take all\n" .string "items from your POKΓ©MON.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "When you are ready, please have\n" - .string "a word with me.$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattlePyramidLobby_Text_NotEnoughValidMonsLv50: .string "A slight problem, adventurer!\p" @@ -585,7 +587,9 @@ BattleFrontier_BattlePyramidLobby_Text_NotEnoughValidMonsLv50: .string "and each no higher than Level 50.\p" .string "Please also remember to take all\n" .string "items from your POKΓ©MON.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" + .string "EGGS{STR_VAR_1}.$" + +BattleFrontier_BattlePyramidLobby_Text_NotEnoughValidMonsEnd: .string "When you are ready, please have\n" .string "a word with me.$" diff --git a/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc b/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc index 945335f7b73c..3240683f954e 100644 --- a/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc @@ -543,16 +543,22 @@ BattleFrontier_BattleTowerLobby_EventScript_NotEnoughValidMonsLv50:: case FRONTIER_MODE_SINGLES, BattleFrontier_BattleTowerLobby_EventScript_NotEnoughValidMonsLv50Singles case FRONTIER_MODE_DOUBLES, BattleFrontier_BattleTowerLobby_EventScript_NotEnoughValidMonsLv50Doubles msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLv50Multis, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattleTowerLobby_EventScript_EndCancelChallenge end BattleFrontier_BattleTowerLobby_EventScript_NotEnoughValidMonsLv50Singles:: msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLv50Singles, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattleTowerLobby_EventScript_EndCancelChallenge end BattleFrontier_BattleTowerLobby_EventScript_NotEnoughValidMonsLv50Doubles:: msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLv50Doubles, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattleTowerLobby_EventScript_EndCancelChallenge end @@ -561,16 +567,22 @@ BattleFrontier_BattleTowerLobby_EventScript_NotEnoughValidMonsLvOpen:: case FRONTIER_MODE_SINGLES, BattleFrontier_BattleTowerLobby_EventScript_NotEnoughValidMonsLvOpenSingles case FRONTIER_MODE_DOUBLES, BattleFrontier_BattleTowerLobby_EventScript_NotEnoughValidMonsLvOpenDoubles msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLvOpenMultis, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattleTowerLobby_EventScript_EndCancelChallenge end BattleFrontier_BattleTowerLobby_EventScript_NotEnoughValidMonsLvOpenSingles:: msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLvOpenSingles, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattleTowerLobby_EventScript_EndCancelChallenge end BattleFrontier_BattleTowerLobby_EventScript_NotEnoughValidMonsLvOpenDoubles:: msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLvOpenDoubles, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattleTowerLobby_EventScript_EndCancelChallenge end @@ -1083,7 +1095,9 @@ BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLv50: .string "of Level 50 or less to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" + .string "EGGS{STR_VAR_1}.$" + +BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsEnd: .string "Please come see me when you are ready.$" @ Unused @@ -1094,8 +1108,7 @@ BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLvOpen: .string "to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "Please come see me when you are ready.$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLv50Singles: .string "Excuse me!\p" @@ -1104,8 +1117,7 @@ BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLv50Singles: .string "of Level 50 or less to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "Please come see me when you are ready.$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLvOpenSingles: .string "Excuse me!\p" @@ -1114,8 +1126,7 @@ BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLvOpenSingles: .string "to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "Please come see me when you are ready.$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLv50Doubles: .string "Excuse me!\p" @@ -1124,8 +1135,7 @@ BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLv50Doubles: .string "of Level 50 or less to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "Please come see me when you are ready.$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLvOpenDoubles: .string "Excuse me!\p" @@ -1134,8 +1144,7 @@ BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLvOpenDoubles: .string "to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "Please come see me when you are ready.$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLv50Multis: .string "Excuse me!\p" @@ -1144,8 +1153,7 @@ BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLv50Multis: .string "of Level 50 or less to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "Please come see me when you are ready.$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLvOpenMultis: .string "Excuse me!\p" @@ -1154,8 +1162,7 @@ BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLvOpenMultis: .string "to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "Please come see me when you are ready.$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattleTowerLobby_Text_WelcomSingleBattle: .string "Where the talents of TRAINERS\n" diff --git a/data/maps/FallarborTown_MoveRelearnersHouse/scripts.inc b/data/maps/FallarborTown_MoveRelearnersHouse/scripts.inc index 8dd70b9b0490..ea58d275dfe4 100644 --- a/data/maps/FallarborTown_MoveRelearnersHouse/scripts.inc +++ b/data/maps/FallarborTown_MoveRelearnersHouse/scripts.inc @@ -22,6 +22,7 @@ FallarborTown_MoveRelearnersHouse_EventScript_AskTeachMove:: FallarborTown_MoveRelearnersHouse_EventScript_ChooseMon:: msgbox FallarborTown_MoveRelearnersHouse_Text_TutorWhichMon, MSGBOX_DEFAULT + setmoverelearnerstate MOVE_RELEARNER_LEVEL_UP_MOVES @ Specifically supposed to teach level up moves special ChooseMonForMoveRelearner waitstate goto_if_eq VAR_0x8004, PARTY_NOTHING_CHOSEN, FallarborTown_MoveRelearnersHouse_EventScript_ComeBackWithHeartScale diff --git a/data/maps/LilycoveCity_ContestLobby/scripts.inc b/data/maps/LilycoveCity_ContestLobby/scripts.inc index 862a5ef37d7b..41db53c954c5 100644 --- a/data/maps/LilycoveCity_ContestLobby/scripts.inc +++ b/data/maps/LilycoveCity_ContestLobby/scripts.inc @@ -349,7 +349,11 @@ LilycoveCity_ContestLobby_EventScript_SetMasterContestType:: @ Functionally unused LilycoveCity_ContestLobby_EventScript_SetDebug:: setflag FLAG_HIDE_LILYCOVE_MUSEUM_CURATOR - copyvar VAR_LILYCOVE_MUSEUM_2F_STATE, 1 +#ifdef UBFIX + setvar VAR_LILYCOVE_MUSEUM_2F_STATE, 1 +#else + copyvar VAR_LILYCOVE_MUSEUM_2F_STATE, 1, warn=FALSE +#endif additem ITEM_CONTEST_PASS setvar VAR_0x800B, 8 setvar VAR_CONTEST_RANK, CONTEST_RANK_MASTER diff --git a/data/maps/LilycoveCity_Harbor/scripts.inc b/data/maps/LilycoveCity_Harbor/scripts.inc index 9388609ab5b1..89bbb0714ce3 100644 --- a/data/maps/LilycoveCity_Harbor/scripts.inc +++ b/data/maps/LilycoveCity_Harbor/scripts.inc @@ -333,7 +333,7 @@ LilycoveCity_Harbor_EventScript_BoardFerryWithSailor:: call_if_eq VAR_FACING, DIR_NORTH, LilycoveCity_Harbor_EventScript_PlayerBoardFerryNorth call_if_eq VAR_FACING, DIR_EAST, LilycoveCity_Harbor_EventScript_PlayerBoardFerryEast delay 30 - hideobjectat LOCALID_PLAYER, 0 + hideplayer setvar VAR_0x8004, LOCALID_LILYCOVE_HARBOR_SS_TIDAL call Common_EventScript_FerryDepart return @@ -393,7 +393,7 @@ LilycoveCity_Harbor_EventScript_BoardFerry:: call_if_eq VAR_FACING, DIR_NORTH, LilycoveCity_Harbor_EventScript_PlayerBoardFerryNorth call_if_eq VAR_FACING, DIR_EAST, LilycoveCity_Harbor_EventScript_PlayerBoardFerryEast delay 30 - hideobjectat LOCALID_PLAYER, 0 + hideplayer setvar VAR_0x8004, LOCALID_LILYCOVE_HARBOR_SS_TIDAL call Common_EventScript_FerryDepart return diff --git a/data/maps/LilycoveCity_LilycoveMuseum_2F/scripts.inc b/data/maps/LilycoveCity_LilycoveMuseum_2F/scripts.inc index e00c7bcb3c2c..1ac10a401698 100644 --- a/data/maps/LilycoveCity_LilycoveMuseum_2F/scripts.inc +++ b/data/maps/LilycoveCity_LilycoveMuseum_2F/scripts.inc @@ -76,7 +76,11 @@ LilycoveCity_LilycoveMuseum_2F_EventScript_ShowExhibitHall:: applymovement LOCALID_PLAYER, LilycoveCity_LilycoveMuseum_2F_Movement_PlayerWalkInPlaceLeft waitmovement 0 msgbox LilycoveCity_LilycoveMuseum_2F_Text_PleaseObtainPaintingsForExhibit, MSGBOX_SIGN - copyvar VAR_LILYCOVE_MUSEUM_2F_STATE, 1 +#ifdef UBFIX + setvar VAR_LILYCOVE_MUSEUM_2F_STATE, 1 +#else + copyvar VAR_LILYCOVE_MUSEUM_2F_STATE, 1, warn=FALSE +#endif releaseall end diff --git a/data/maps/LittlerootTown/scripts.inc b/data/maps/LittlerootTown/scripts.inc index fd1d970b1349..6a2c6af41bb1 100644 --- a/data/maps/LittlerootTown/scripts.inc +++ b/data/maps/LittlerootTown/scripts.inc @@ -156,7 +156,7 @@ LittlerootTown_EventScript_GoInsideWithMom:: waitmovement 0 setflag FLAG_HIDE_LITTLEROOT_TOWN_MOM_OUTSIDE setvar VAR_LITTLEROOT_INTRO_STATE, 3 - hideobjectat LOCALID_PLAYER, 0 + hideplayer closedoor VAR_0x8004, VAR_0x8005 waitdooranim clearflag FLAG_HIDE_LITTLEROOT_TOWN_FAT_MAN diff --git a/data/maps/MtChimney/scripts.inc b/data/maps/MtChimney/scripts.inc index 37fd2ccde7e1..cdff230d770c 100644 --- a/data/maps/MtChimney/scripts.inc +++ b/data/maps/MtChimney/scripts.inc @@ -851,4 +851,3 @@ MtChimney_Text_SawyerRematchDefeat: MtChimney_Text_SawyerPostRematch: .string "Actually, it really is hot here.\n" .string "I'm overdressed for these parts.$" - diff --git a/data/maps/SkyPillar_2F/scripts.inc b/data/maps/SkyPillar_2F/scripts.inc index bad2488f0b49..a530e01113ff 100644 --- a/data/maps/SkyPillar_2F/scripts.inc +++ b/data/maps/SkyPillar_2F/scripts.inc @@ -6,7 +6,11 @@ SkyPillar_2F_MapScripts:: SkyPillar_2F_OnTransition: call_if_lt VAR_SKY_PILLAR_STATE, 2, SkyPillar_2F_EventScript_CleanFloor - copyvar VAR_ICE_STEP_COUNT, 1 +#ifdef UBFIX + setvar VAR_ICE_STEP_COUNT, 1 +#else + copyvar VAR_ICE_STEP_COUNT, 1, warn=FALSE +#endif end SkyPillar_2F_EventScript_CleanFloor:: diff --git a/data/maps/SkyPillar_4F/scripts.inc b/data/maps/SkyPillar_4F/scripts.inc index 9e8f1e80ea49..603144f04bd1 100644 --- a/data/maps/SkyPillar_4F/scripts.inc +++ b/data/maps/SkyPillar_4F/scripts.inc @@ -6,7 +6,11 @@ SkyPillar_4F_MapScripts:: SkyPillar_4F_OnTransition: call_if_lt VAR_SKY_PILLAR_STATE, 2, SkyPillar_4F_EventScript_CleanFloor - copyvar VAR_ICE_STEP_COUNT, 1 +#ifdef UBFIX + setvar VAR_ICE_STEP_COUNT, 1 +#else + copyvar VAR_ICE_STEP_COUNT, 1, warn=FALSE +#endif end SkyPillar_4F_EventScript_CleanFloor:: diff --git a/data/maps/SlateportCity_Harbor/scripts.inc b/data/maps/SlateportCity_Harbor/scripts.inc index ebcd40ab0caa..52fd04ec65fd 100644 --- a/data/maps/SlateportCity_Harbor/scripts.inc +++ b/data/maps/SlateportCity_Harbor/scripts.inc @@ -228,7 +228,7 @@ SlateportCity_Harbor_EventScript_BoardFerry:: call_if_eq VAR_FACING, DIR_NORTH, SlateportCity_Harbor_EventScript_BoardFerryNorth call_if_eq VAR_FACING, DIR_EAST, SlateportCity_Harbor_EventScript_BoardFerryEast delay 30 - hideobjectat LOCALID_PLAYER, 0 + hideplayer setvar VAR_0x8004, LOCALID_SLATEPORT_HARBOR_SS_TIDAL call Common_EventScript_FerryDepart return diff --git a/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc b/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc index 70463728f34e..c46099e39ac2 100644 --- a/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc +++ b/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc @@ -433,4 +433,3 @@ SlateportCity_OceanicMuseum_2F_Text_SSAnneReplica: .string "β€œS.S. ANNE\p" .string "β€œA replica of the luxury liner that\n" .string "circles the globe.”$" - diff --git a/data/maps/map_groups.json b/data/maps/map_groups.json index 8a90679c8ddb..78e82055f6f2 100644 --- a/data/maps/map_groups.json +++ b/data/maps/map_groups.json @@ -620,72 +620,5 @@ ], "gMapGroup_IndoorRoute124": [ "Route124_DivingTreasureHuntersHouse" - ], - "connections_include_order": [ - "LittlerootTown", - "OldaleTown", - "DewfordTown", - "LavaridgeTown", - "FallarborTown", - "VerdanturfTown", - "PacifidlogTown", - "PetalburgCity", - "SlateportCity", - "MauvilleCity", - "RustboroCity", - "FortreeCity", - "LilycoveCity", - "MossdeepCity", - "SootopolisCity", - "EverGrandeCity", - "Route101", - "Route102", - "Route103", - "Route104", - "Route105", - "Route106", - "Route107", - "Route108", - "Route109", - "Route110", - "Route111", - "Route112", - "Route113", - "Route114", - "Route115", - "Route116", - "Route117", - "Route118", - "Route119", - "Route120", - "Route121", - "Route122", - "Route123", - "Route124", - "Route125", - "Route126", - "Route127", - "Route128", - "Route129", - "Route130", - "Route131", - "Route132", - "Route133", - "Route134", - "Underwater_Route105", - "Underwater_Route124", - "Underwater_Route125", - "Underwater_Route126", - "Underwater_Route127", - "Underwater_Route128", - "Underwater_Route129", - "SafariZone_Northwest", - "SafariZone_North", - "SafariZone_Southwest", - "SafariZone_South", - "SafariZone_Northeast", - "SafariZone_Southeast", - "BattleFrontier_OutsideWest", - "BattleFrontier_OutsideEast" ] } diff --git a/data/script_cmd_table.inc b/data/script_cmd_table.inc index 457ff8f67016..a3defef83ef1 100644 --- a/data/script_cmd_table.inc +++ b/data/script_cmd_table.inc @@ -146,7 +146,7 @@ gScriptCmdTable:: script_cmd_table_entry SCR_OP_GIVEMON ScrCmd_nop1, requests_effects=1 @ 0x79 script_cmd_table_entry SCR_OP_GIVEEGG ScrCmd_giveegg, requests_effects=1 @ 0x7a script_cmd_table_entry SCR_OP_SETMONMOVE ScrCmd_setmonmove, requests_effects=1 @ 0x7b - script_cmd_table_entry SCR_OP_CHECKPARTYMOVE ScrCmd_checkpartymove, requests_effects=1 @ 0x7c + script_cmd_table_entry SCR_OP_CHECKFIELDMOVE ScrCmd_checkfieldmove, requests_effects=1 @ 0x7c script_cmd_table_entry SCR_OP_BUFFERSPECIESNAME ScrCmd_bufferspeciesname, requests_effects=1 @ 0x7d script_cmd_table_entry SCR_OP_BUFFERLEADMONSPECIESNAME ScrCmd_bufferleadmonspeciesname, requests_effects=1 @ 0x7e script_cmd_table_entry SCR_OP_BUFFERPARTYMONNICK ScrCmd_bufferpartymonnick, requests_effects=1 @ 0x7f @@ -251,6 +251,7 @@ gScriptCmdTable:: script_cmd_table_entry SCR_OP_BUFFERITEMNAMEPLURAL ScrCmd_bufferitemnameplural, requests_effects=1 @ 0xe2 script_cmd_table_entry SCR_OP_DYNMULTICHOICE ScrCmd_dynmultichoice, requests_effects=1 @ 0xe3 script_cmd_table_entry SCR_OP_DYNMULTIPUSH ScrCmd_dynmultipush, requests_effects=1 @ 0xe4 + script_cmd_table_entry SCR_OP_HIDEFOLLOWER ScrCmd_hidefollower, requests_effects=1 @ 0xe5 .if ALLOCATE_SCRIPT_CMD_TABLE gScriptCmdTableEnd:: diff --git a/data/scripts/apricorn_tree.inc b/data/scripts/apricorn_tree.inc new file mode 100644 index 000000000000..019b2b76b0fb --- /dev/null +++ b/data/scripts/apricorn_tree.inc @@ -0,0 +1,89 @@ +ApricornTreeScript:: + lock + faceplayer + message ApricornTree_Text_Intro + waitmessage + special ObjectEventInteractionGetApricornTreeData + goto_if_gt VAR_0x8005, 0, ApricornTree_EventScript_WantToPick + message ApricornTree_Text_Empty + waitmessage + waitbuttonpress + release + end + +ApricornTree_EventScript_WantToPick:: + buffernumberstring STR_VAR_2, VAR_0x8005 + msgbox ApricornTree_Text_WantToPick, MSGBOX_YESNO + goto_if_eq VAR_RESULT, YES, ApricornTree_EventScript_PickApricorn + goto_if_eq VAR_RESULT, NO, ApricornTree_EventScript_CancelPickingApricorn + +.set APRICORN_NORMAL_BAG_FULL, 0 +.set APRICORN_NORMAL_SPACE_IN_BAG, 1 + +ApricornTree_EventScript_PickApricorn:: + special ObjectEventInteractionPickApricornTree + call EventScript_BufferPocketNameAndTryFanfare + goto_if_eq VAR_0x8006, APRICORN_NORMAL_BAG_FULL, ApricornTree_EventScript_PocketFull + message ApricornTree_Text_PickedTheApricorn +.if OW_SHOW_ITEM_DESCRIPTIONS != OW_ITEM_DESCRIPTIONS_OFF + copyvar VAR_0x8006 VAR_0x8004 +.endif + delay 10 +.if OW_SHOW_ITEM_DESCRIPTIONS != OW_ITEM_DESCRIPTIONS_OFF + showberrydescription +.endif + playfanfare MUS_OBTAIN_BERRY + waitmessage + waitfanfare + waitbuttonpress + message ApricornTree_Text_PutAwayApricorn + waitmessage + waitbuttonpress +.if OW_SHOW_ITEM_DESCRIPTIONS != OW_ITEM_DESCRIPTIONS_OFF + hideitemdescription +.endif + release + end + +ApricornTree_EventScript_PocketFull:: + message ApricornTree_Text_PocketFull + waitmessage + waitbuttonpress + release + end + +ApricornTree_EventScript_CancelPickingApricorn:: + message ApricornTree_Text_ApricornLeftUnpicked + waitmessage + waitbuttonpress + release + end + +ApricornTree_Text_Intro: + .string "It's an Apricorn Tree!$" + +ApricornTree_Text_Empty: + .string "There are no Apricorns…$" + +ApricornTree_Text_WantToPick: + .string "…It's {STR_VAR_2} {STR_VAR_1}!\p" + .string "Do you want to pick the\n" + .string "{STR_VAR_1}?$" + +ApricornTree_Text_PickedTheApricorn: + .string "{PLAYER} obtained\n" + .string "{STR_VAR_2} {STR_VAR_1}.$" + +ApricornTree_Text_PutAwayApricorn: + .string "{PLAYER} put away the\n" + .string "{STR_VAR_1} in\l" + .string "the BAG's {STR_VAR_3} POCKET.$" + +ApricornTree_Text_PocketFull: + .string "The BAG's {STR_VAR_3} POCKET is full.\p" + .string "{PLAYER} gave up on the\p" + .string "{STR_VAR_1}…$" + +ApricornTree_Text_ApricornLeftUnpicked: + .string "{PLAYER} gave up on the\p" + .string "{STR_VAR_1}…$" diff --git a/data/scripts/battle_frontier.inc b/data/scripts/battle_frontier.inc new file mode 100644 index 000000000000..cbfd1ac5eeee --- /dev/null +++ b/data/scripts/battle_frontier.inc @@ -0,0 +1,13 @@ +BattleFrontier_ShowCaughtBannedSpecies:: + goto_if_eq VAR_0x8005, 0, BattleFrontier_ShowCaughtBannedSpeciesEnd + msgbox BattleFrontier_DoYouWantToSeeTheListOfCaughtBannedSpecies, MSGBOX_YESNO + goto_if_eq VAR_RESULT, NO, BattleFrontier_ShowCaughtBannedSpeciesEnd + callnative ShowBattleFrontierCaughtBannedSpecies + waitstate +BattleFrontier_ShowCaughtBannedSpeciesEnd: + return + + +BattleFrontier_DoYouWantToSeeTheListOfCaughtBannedSpecies: + .string "Do you want to see the list of\n" + .string "POKΓ©MON species you can't bring?$" diff --git a/data/scripts/battle_pike.inc b/data/scripts/battle_pike.inc index 2108becd06e6..c4612609b07c 100644 --- a/data/scripts/battle_pike.inc +++ b/data/scripts/battle_pike.inc @@ -85,6 +85,7 @@ BattleFrontier_BattlePikeThreePathRoom_EventScript_RightRoomWarp:: end BattleFrontier_BattlePikeThreePathRoom_EventScript_RoomWarp:: + clearflag FLAG_SAFE_FOLLOWER_MOVEMENT pike_get PIKE_DATA_WIN_STREAK addvar VAR_RESULT, 1 pike_set PIKE_DATA_WIN_STREAK, VAR_RESULT diff --git a/data/scripts/cable_club.inc b/data/scripts/cable_club.inc index 227981578f5b..1c547f89804c 100644 --- a/data/scripts/cable_club.inc +++ b/data/scripts/cable_club.inc @@ -356,7 +356,7 @@ CableClub_EventScript_EnterColosseum:: waitdooranim applymovement LOCALID_PLAYER, Movement_PlayerEnterLinkRoom waitmovement 0 - hideobjectat LOCALID_PLAYER, 0 + hideplayer closedoor 9, 1 waitdooranim release @@ -450,7 +450,7 @@ CableClub_EventScript_EnterTradeCenter:: waitdooranim applymovement LOCALID_PLAYER, Movement_PlayerEnterLinkRoom waitmovement 0 - hideobjectat LOCALID_PLAYER, 0 + hideplayer closedoor 9, 1 waitdooranim release @@ -515,7 +515,7 @@ CableClub_EventScript_EnterRecordCorner:: waitdooranim applymovement LOCALID_PLAYER, Movement_PlayerEnterLinkRoom waitmovement 0 - hideobjectat LOCALID_PLAYER, 0 + hideplayer closedoor 9, 1 waitdooranim release @@ -902,7 +902,7 @@ CableClub_EventScript_EnterUnionRoom:: waitdooranim applymovement LOCALID_PLAYER, Movement_PlayerEnterLinkRoom waitmovement 0 - hideobjectat LOCALID_PLAYER, 0 + hideplayer closedoor 5, 1 waitdooranim special Script_ResetUnionRoomTrade @@ -1202,7 +1202,7 @@ CableClub_EventScript_EnterWirelessLinkRoom:: waitdooranim applymovement LOCALID_PLAYER, Movement_PlayerEnterLinkRoom waitmovement 0 - hideobjectat LOCALID_PLAYER, 0 + hideplayer closedoor 9, 1 waitdooranim release @@ -1384,7 +1384,7 @@ MossdeepCity_GameCorner_1F_EventScript_EnterMinigameRoom:: closemessage applymovement LOCALID_PLAYER, Movement_PlayerEnterMinigameRoom waitmovement 0 - hideobjectat LOCALID_PLAYER, 0 + hideplayer release waitstate end diff --git a/data/scripts/cave_hole.inc b/data/scripts/cave_hole.inc index fc4962912af3..e6f9084705a5 100644 --- a/data/scripts/cave_hole.inc +++ b/data/scripts/cave_hole.inc @@ -3,7 +3,11 @@ CaveHole_CheckFallDownHole: .2byte 0 CaveHole_FixCrackedGround: - copyvar VAR_ICE_STEP_COUNT, 1 +#ifdef UBFIX + setvar VAR_ICE_STEP_COUNT, 1 +#else + copyvar VAR_ICE_STEP_COUNT, 1, warn=FALSE +#endif end EventScript_FallDownHole:: diff --git a/data/scripts/debug.inc b/data/scripts/debug.inc index d82ce2f358b6..921a3247e4e4 100644 --- a/data/scripts/debug.inc +++ b/data/scripts/debug.inc @@ -87,6 +87,15 @@ Debug_FlagsNotSetBattleConfigMessage_Text: .string "Please define a usable flag in:\l" .string "'include/config/battle.h'!$" +Debug_VarsNotSetBattleConfigMessage:: + message Debug_VarsNotSetBattleConfigMessage_Text + goto Debug_MessageEnd + +Debug_VarsNotSetBattleConfigMessage_Text: + .string "Feature unavailable!\n" + .string "Please define a usable var in:\l" + .string "'include/config/battle.h'!$" + Debug_BoxFilledMessage:: message Debug_BoxFilledMessage_Text goto Debug_MessageEnd @@ -270,6 +279,24 @@ Debug_ShowExpansionVersion:: Debug_ExpansionVersion: .string "pokeemerald-expansion {STR_VAR_1}$" +Debug_Follower_NPC_Not_Enabled:: + msgbox Debug_Enable_To_Use_Follower_NPCs, MSGBOX_DEFAULT + release + end + +Debug_Enable_To_Use_Follower_NPCs: + .string "Feature unavailable.\nSet FNPC_ENABLE_NPC_FOLLOWERS to\lTRUE in 'include/config/follower_npc.h'.$" + +Debug_Follower_NPC_Event_Script:: + lock + facefollowernpc + msgbox Debug_Follower_NPC_Test_Message, MSGBOX_DEFAULT + releaseall + end + +Debug_Follower_NPC_Test_Message: + .string "This is a Follower NPC test.$" + Debug_EventScript_Steven_Multi:: call MossdeepCity_SpaceCenter_2F_EventScript_ChoosePartyForMultiBattle release @@ -335,6 +362,66 @@ Debug_EventScript_InflictStatus1_Single: releaseall end +Debug_EventScript_SetHiddenNature:: + special ChoosePartyMon + waitstate + goto_if_ge VAR_0x8004, PARTY_SIZE, Debug_EventScript_InflictStatus1_Close + specialvar VAR_RESULT, ScriptGetPartyMonSpecies + goto_if_eq VAR_RESULT, SPECIES_EGG, Debug_EventScript_InflictStatus1_Close + dynmultipush Debug_EventScript_ChangeNature_Text_Hardy, 0 + dynmultipush Debug_EventScript_ChangeNature_Text_Lonely, 1 + dynmultipush Debug_EventScript_ChangeNature_Text_Brave, 2 + dynmultipush Debug_EventScript_ChangeNature_Text_Adamant, 3 + dynmultipush Debug_EventScript_ChangeNature_Text_Naughty, 4 + dynmultipush Debug_EventScript_ChangeNature_Text_Bold, 5 + dynmultipush Debug_EventScript_ChangeNature_Text_Docile, 6 + dynmultipush Debug_EventScript_ChangeNature_Text_Relaxed, 7 + dynmultipush Debug_EventScript_ChangeNature_Text_Impish, 8 + dynmultipush Debug_EventScript_ChangeNature_Text_Lax, 9 + dynmultipush Debug_EventScript_ChangeNature_Text_Timid, 10 + dynmultipush Debug_EventScript_ChangeNature_Text_Hasty, 11 + dynmultipush Debug_EventScript_ChangeNature_Text_Serious, 12 + dynmultipush Debug_EventScript_ChangeNature_Text_Jolly, 13 + dynmultipush Debug_EventScript_ChangeNature_Text_Naive, 14 + dynmultipush Debug_EventScript_ChangeNature_Text_Modest, 15 + dynmultipush Debug_EventScript_ChangeNature_Text_Mild, 16 + dynmultipush Debug_EventScript_ChangeNature_Text_Quiet, 17 + dynmultipush Debug_EventScript_ChangeNature_Text_Bashful, 18 + dynmultipush Debug_EventScript_ChangeNature_Text_Rash, 19 + dynmultipush Debug_EventScript_ChangeNature_Text_Calm, 20 + dynmultipush Debug_EventScript_ChangeNature_Text_Gentle, 21 + dynmultipush Debug_EventScript_ChangeNature_Text_Sassy, 22 + dynmultipush Debug_EventScript_ChangeNature_Text_Careful, 23 + dynmultipush Debug_EventScript_ChangeNature_Text_Quirky, 24 + dynmultistack 0, 0, TRUE, 7, FALSE, 0, NULL + switch VAR_RESULT + case MULTI_B_PRESSED, Debug_EventScript_InflictStatus1_Close + special SetHiddenNature + releaseall + end + +Debug_EventScript_SetAbility:: + special ChoosePartyMon + waitstate + callnative DebugNative_GetAbilityNames + dynmultipush gStringVar1, 0 + dynmultipush gStringVar2, 1 + dynmultipush gStringVar3, 2 + dynmultistack 0, 0, FALSE, 3 FALSE, 0, NULL + switch VAR_RESULT + case MULTI_B_PRESSED, Debug_EventScript_SetAbilityClose + special SetAbility +Debug_EventScript_SetAbilityClose: + releaseall + end + +Debug_EventScript_SetFriendship:: + special ChoosePartyMon + waitstate + callnative DebugNative_Party_SetFriendship + releaseall + end + Debug_EventScript_InflictStatus1_Single_Poison: setstatus1 STATUS1_POISON, VAR_0x8004 releaseall @@ -443,6 +530,57 @@ Debug_EventScript_InflictStatus1_Text_Freeze: Debug_EventScript_InflictStatus1_Text_Frostbite: .string "Frostbite$" +Debug_EventScript_ChangeNature_Text_Hardy: + .string "Hardy$" +Debug_EventScript_ChangeNature_Text_Lonely: + .string "Lonely$" +Debug_EventScript_ChangeNature_Text_Brave: + .string "Brave$" +Debug_EventScript_ChangeNature_Text_Adamant: + .string "Adamant$" +Debug_EventScript_ChangeNature_Text_Naughty: + .string "Naughty$" +Debug_EventScript_ChangeNature_Text_Bold: + .string "Bold$" +Debug_EventScript_ChangeNature_Text_Docile: + .string "Docile$" +Debug_EventScript_ChangeNature_Text_Relaxed: + .string "Relaxed$" +Debug_EventScript_ChangeNature_Text_Impish: + .string "Impish$" +Debug_EventScript_ChangeNature_Text_Lax: + .string "Lax$" +Debug_EventScript_ChangeNature_Text_Timid: + .string "Timid$" +Debug_EventScript_ChangeNature_Text_Hasty: + .string "Hasty$" +Debug_EventScript_ChangeNature_Text_Serious: + .string "Serious$" +Debug_EventScript_ChangeNature_Text_Jolly: + .string "Jolly$" +Debug_EventScript_ChangeNature_Text_Naive: + .string "Naive$" +Debug_EventScript_ChangeNature_Text_Modest: + .string "Modest$" +Debug_EventScript_ChangeNature_Text_Mild: + .string "Mild$" +Debug_EventScript_ChangeNature_Text_Quiet: + .string "Quiet$" +Debug_EventScript_ChangeNature_Text_Bashful: + .string "Bashful$" +Debug_EventScript_ChangeNature_Text_Rash: + .string "Rash$" +Debug_EventScript_ChangeNature_Text_Calm: + .string "Calm$" +Debug_EventScript_ChangeNature_Text_Gentle: + .string "Gentle$" +Debug_EventScript_ChangeNature_Text_Sassy: + .string "Sassy$" +Debug_EventScript_ChangeNature_Text_Careful: + .string "Careful$" +Debug_EventScript_ChangeNature_Text_Quirky: + .string "Quirky$" + Debug_EventScript_EWRAMCounters:: callnative CheckEWRAMCounters msgbox Debug_EventScript_EWRAMCounters_Text, MSGBOX_DEFAULT diff --git a/data/scripts/field_move_scripts.inc b/data/scripts/field_move_scripts.inc index 1845e1029787..84d45c962ac1 100644 --- a/data/scripts/field_move_scripts.inc +++ b/data/scripts/field_move_scripts.inc @@ -1,8 +1,7 @@ @ Interact with cuttable tree EventScript_CutTree:: lockall - goto_if_unset FLAG_BADGE01_GET, EventScript_CheckTreeCantCut - checkpartymove MOVE_CUT + checkfieldmove FIELD_MOVE_CUT, TRUE goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CheckTreeCantCut setfieldeffectargument 0, VAR_RESULT bufferpartymonnick STR_VAR_1, VAR_RESULT @@ -64,8 +63,7 @@ EventScript_UseRockSmash:: @ Interact with smashable rock EventScript_RockSmash:: lockall - goto_if_unset FLAG_BADGE03_GET, EventScript_CantSmashRock - checkpartymove MOVE_ROCK_SMASH + checkfieldmove FIELD_MOVE_ROCK_SMASH, TRUE goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantSmashRock setfieldeffectargument 0, VAR_RESULT bufferpartymonnick STR_VAR_1, VAR_RESULT @@ -225,9 +223,8 @@ Text_CantSmash: EventScript_StrengthBoulder:: lockall - goto_if_unset FLAG_BADGE04_GET, EventScript_CantStrength goto_if_set FLAG_SYS_USE_STRENGTH, EventScript_CheckActivatedBoulder - checkpartymove MOVE_STRENGTH + checkfieldmove FIELD_MOVE_STRENGTH, TRUE goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantStrength setfieldeffectargument 0, VAR_RESULT msgbox Text_WantToStrength, MSGBOX_YESNO @@ -286,7 +283,7 @@ Text_StrengthActivated: EventScript_UseWaterfall:: lockall - checkpartymove MOVE_WATERFALL + checkfieldmove FIELD_MOVE_WATERFALL goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantWaterfall bufferpartymonnick STR_VAR_1, VAR_RESULT setfieldeffectargument 0, VAR_RESULT @@ -321,7 +318,7 @@ Text_MonUsedWaterfall: EventScript_UseDive:: lockall - checkpartymove MOVE_DIVE + checkfieldmove FIELD_MOVE_DIVE goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantDive copyvar 0x8004 VAR_RESULT bufferpartymonnick STR_VAR_1, VAR_RESULT @@ -348,7 +345,7 @@ EventScript_EndDive:: EventScript_UseDiveUnderwater:: lockall - checkpartymove MOVE_DIVE + checkfieldmove FIELD_MOVE_DIVE goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantSurface bufferpartymonnick STR_VAR_1, VAR_RESULT setfieldeffectargument 0, VAR_RESULT @@ -444,3 +441,36 @@ EventScript_UseDefog:: waitstate releaseall end + +EventScript_UseRockClimb:: + lockall + checkfieldmove FIELD_MOVE_ROCK_CLIMB + goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantRockClimb + bufferpartymonnick STR_VAR_1, VAR_RESULT + setfieldeffectargument 0, VAR_RESULT + msgbox Text_WantToRockClimb, MSGBOX_YESNO + goto_if_eq VAR_RESULT, NO, EventScript_EndRockClimb + msgbox Text_MonUsedRockClimb, MSGBOX_DEFAULT + closemessage + dofieldeffect FLDEFF_USE_ROCK_CLIMB + waitstate + goto EventScript_EndRockClimb + end + +EventScript_CantRockClimb:: + msgbox Text_CantRockClimb, MSGBOX_DEFAULT + +EventScript_EndRockClimb:: + releaseall + end + +Text_WantToRockClimb: + .string "The cliff is steep.\n" + .string "Would you like to use Rock Climb?$" + +Text_MonUsedRockClimb: + .string "{STR_VAR_1} used Rock Climb!$" + +Text_CantRockClimb: + .string "The cliff is steep.\n" + .string "A PokΓ©mon may be able to climb it.$" diff --git a/data/scripts/field_poison.inc b/data/scripts/field_poison.inc index ddda34ebaae6..1d89bcfdfded 100644 --- a/data/scripts/field_poison.inc +++ b/data/scripts/field_poison.inc @@ -29,9 +29,9 @@ EventScript_FrontierFieldWhiteOut:: waitbuttonpress pike_inchallenge goto_if_eq VAR_RESULT, TRUE, BattleFrontier_BattlePike_EventScript_Retire - pyramid_inchallenge - goto_if_eq VAR_RESULT, 1, BattleFrontier_BattlePyramid_EventScript_WarpToLobbyLost @ On Pyramid floor - goto_if_eq VAR_RESULT, 2, BattleFrontier_BattlePyramid_EventScript_WarpToLobbyLost @ On Pyramid peak + pyramid_getlocation + goto_if_eq VAR_RESULT, PYRAMID_LOCATION_FLOOR, BattleFrontier_BattlePyramid_EventScript_WarpToLobbyLost + goto_if_eq VAR_RESULT, PYRAMID_LOCATION_TOP, BattleFrontier_BattlePyramid_EventScript_WarpToLobbyLost trainerhill_inchallenge goto_if_eq VAR_RESULT, TRUE, TrainerHill_1F_EventScript_Lost special Script_FadeOutMapMusic diff --git a/data/scripts/move_relearner.inc b/data/scripts/move_relearner.inc new file mode 100644 index 000000000000..15c80733df06 --- /dev/null +++ b/data/scripts/move_relearner.inc @@ -0,0 +1,105 @@ +Common_EventScript_MoveRelearner:: + lockall + faceplayer + message MoveRelearner_Text_WouldLearnNewMoves + waitmessage + goto Common_EventScript_MoveRelearnerDynMultiChoice + end + +Common_EventScript_MoveRelearnerDynMultiChoice:: + dynmultipush MoveRelearner_Text_LevelUpMoves, 0 +.if P_ENABLE_MOVE_RELEARNERS == TRUE + dynmultipush MoveRelearner_Text_EggMoves, 1 + dynmultipush MoveRelearner_Text_TMMoves, 2 + dynmultipush MoveRelearner_Text_TutormoveMoves, 3 +.else + call_if_set P_FLAG_EGG_MOVES, MoveRelearner_EventScript_PushEggMoves + istmrelearneractive MoveRelearner_EventScript_PushTMMoves + call_if_set P_FLAG_TUTOR_MOVES, MoveRelearner_EventScript_PushTutorMoves +.endif @ P_ENABLE_MOVE_RELEARNERS + dynmultipush MoveRelearner_Text_SeeYa, 4 + dynmultistack 0, 0, FALSE, 5, 0, 0, DYN_MULTICHOICE_CB_NONE + closemessage + switch VAR_RESULT + case 0, MoveRelearner_EventScript_TeachLevelUpMoves + case 1, MoveRelearner_EventScript_TeachEggMoves + case 2, MoveRelearner_EventScript_TeachTMMoves + case 3, MoveRelearner_EventScript_TeachTutorMoves + case 4, MoveRelearner_EventScript_PleaseComeAgain +MoveRelearner_EventScript_PleaseComeAgain: + msgbox MoveRelearner_Text_ThankYouComeAgain, MSGBOX_DEFAULT + releaseall + end + +MoveRelearner_EventScript_PushEggMoves: + dynmultipush MoveRelearner_Text_EggMoves, 1 + return + +MoveRelearner_EventScript_PushTMMoves: + dynmultipush MoveRelearner_Text_TMMoves, 2 + return + +MoveRelearner_EventScript_PushTutorMoves: + dynmultipush MoveRelearner_Text_TutormoveMoves, 3 + return + +MoveRelearner_EventScript_TeachLevelUpMoves: + setmoverelearnerstate MOVE_RELEARNER_LEVEL_UP_MOVES + bufferstring STR_VAR_3, MoveRelearner_Text_LevelUpMoveLWR + goto MoveRelearner_EventScript_TeachMove + end + +MoveRelearner_EventScript_TeachEggMoves: + setmoverelearnerstate MOVE_RELEARNER_EGG_MOVES + bufferstring STR_VAR_3, MoveRelearner_Text_EggMoveLWR + goto MoveRelearner_EventScript_TeachMove + end + +MoveRelearner_EventScript_TeachTMMoves: + setmoverelearnerstate MOVE_RELEARNER_TM_MOVES + bufferstring STR_VAR_3, MoveRelearner_Text_TMMoveLWR + goto MoveRelearner_EventScript_TeachMove + end + +MoveRelearner_EventScript_TeachTutorMoves: + setmoverelearnerstate MOVE_RELEARNER_TUTOR_MOVES + bufferstring STR_VAR_3, MoveRelearner_Text_TutorMoveLWR + goto MoveRelearner_EventScript_TeachMove + end + +MoveRelearner_EventScript_TeachMove:: + getpartysize + goto_if_eq VAR_RESULT, 0, MoveRelearner_EventScript_NoPkmn + msgbox MoveRelearner_Text_ChoosePkmn, MSGBOX_DEFAULT + special ChooseMonForMoveRelearner + waitstate + call_if_eq VAR_0x8004, PARTY_NOTHING_CHOSEN, MoveRelearner_EventScript_AnythingElse + special IsSelectedMonEgg + call_if_eq VAR_RESULT, YES, MoveRelearner_EventScript_CantTeachMoveToEgg + call_if_eq VAR_0x8005, NO, MoveRelearner_EventScript_CantTeachMoveToPkmn + msgbox MoveRelearner_Text_WhichXmoveShouldTeach, MSGBOX_DEFAULT + special TeachMoveRelearnerMove + waitstate + goto MoveRelearner_EventScript_AnythingElse + end + +MoveRelearner_EventScript_NoPkmn: + msgbox MoveRelearner_Text_HaveNoPkmn, MSGBOX_AUTOCLOSE + releaseall + end + +MoveRelearner_EventScript_CantTeachMoveToEgg: + msgbox MoveRelearner_Text_CantTeachMoveToEgg, MSGBOX_AUTOCLOSE + goto MoveRelearner_EventScript_AnythingElse + end + +MoveRelearner_EventScript_CantTeachMoveToPkmn: + msgbox MoveRelearner_Text_CantTeachMoveToPkmn, MSGBOX_AUTOCLOSE + goto MoveRelearner_EventScript_AnythingElse + end + +MoveRelearner_EventScript_AnythingElse:: + message MoveRelearner_Text_AnythingElse + waitmessage + goto Common_EventScript_MoveRelearnerDynMultiChoice + end diff --git a/data/scripts/obtain_item.inc b/data/scripts/obtain_item.inc index c54b2f8dc560..3eb7f4f0d4ed 100644 --- a/data/scripts/obtain_item.inc +++ b/data/scripts/obtain_item.inc @@ -133,8 +133,8 @@ EventScript_PickUpItem:: waitfanfare waitmessage bufferitemnameplural STR_VAR_2, VAR_0x8004, VAR_0x8005 - pyramid_inchallenge - goto_if_eq VAR_RESULT, TRUE, EventScript_PutBattlePyramidItemInBag + pyramid_getlocation + goto_if_eq VAR_RESULT, PYRAMID_LOCATION_FLOOR, EventScript_PutBattlePyramidItemInBag msgbox gText_PutItemInPocket, MSGBOX_DEFAULT hideitemdescription return @@ -205,6 +205,7 @@ EventScript_FoundHiddenItem:: end EventScript_PutHiddenItemInPocket:: + callnative Script_ClearDowsingColor delay 10 showitemdescription waitmessage @@ -215,6 +216,7 @@ EventScript_PutHiddenItemInPocket:: hideitemdescription special TryPutTreasureInvestigatorsOnAir special SetHiddenItemFlag + callnative Script_UpdateDowseState releaseall end diff --git a/data/scripts/secret_base.inc b/data/scripts/secret_base.inc index 15faddfa9d31..ed5e8594093b 100644 --- a/data/scripts/secret_base.inc +++ b/data/scripts/secret_base.inc @@ -28,7 +28,7 @@ SecretBase_EventScript_CheckEntrance:: special GetSecretBaseTypeInFrontOfPlayer special CheckPlayerHasSecretBase goto_if_eq VAR_RESULT, TRUE, SecretBase_EventScript_AlreadyHasSecretBase - checkpartymove MOVE_SECRET_POWER + checkfieldmove FIELD_MOVE_SECRET_POWER setfieldeffectargument 0, VAR_RESULT buffermovename STR_VAR_2, MOVE_SECRET_POWER goto_if_eq VAR_0x8007, SECRET_BASE_RED_CAVE, SecretBase_EventScript_Cave @@ -186,7 +186,7 @@ SecretBase_EventScript_EnterPlayersBase:: end SecretBase_EventScript_AlreadyHasSecretBase:: - checkpartymove MOVE_SECRET_POWER + checkfieldmove FIELD_MOVE_SECRET_POWER goto_if_eq VAR_RESULT, PARTY_SIZE, SecretBase_EventScript_NoSecretPower setfieldeffectargument 0, VAR_RESULT setorcopyvar VAR_0x8004, VAR_RESULT diff --git a/data/scripts/surf.inc b/data/scripts/surf.inc index edb116f991ed..630b3f9e6eca 100644 --- a/data/scripts/surf.inc +++ b/data/scripts/surf.inc @@ -1,5 +1,5 @@ EventScript_UseSurf:: - checkpartymove MOVE_SURF + checkfieldmove FIELD_MOVE_SURF goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_EndUseSurf bufferpartymonnick STR_VAR_1, VAR_RESULT setfieldeffectargument 0, VAR_RESULT diff --git a/data/sound_data.s b/data/sound_data.s index 39bef4b332f1..b52f9d2f861c 100644 --- a/data/sound_data.s +++ b/data/sound_data.s @@ -1,7 +1,11 @@ .section .rodata + .include "asm/macros.inc" + .include "constants/constants.inc" + .include "asm/macros/m4a.inc" .include "asm/macros/music_voice.inc" + .include "include/config/general.h" .include "include/config/pokemon.h" .include "sound/voice_groups.inc" .include "sound/keysplit_tables.inc" diff --git a/data/specials.inc b/data/specials.inc index c95cea9a7e05..f80933c0112c 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -563,3 +563,7 @@ gSpecials:: def_special UseBlankMessageToCancelPokemonPic def_special EnterCode def_special GetCodeFeedback + def_special SetHiddenNature + def_special SetAbility + def_special ObjectEventInteractionGetApricornTreeData + def_special ObjectEventInteractionPickApricornTree diff --git a/data/text/contest_link.inc b/data/text/contest_link.inc deleted file mode 100644 index f2f1469e0f80..000000000000 --- a/data/text/contest_link.inc +++ /dev/null @@ -1,38 +0,0 @@ -@ With the exception of Link standby, none of the below texts are used - -gTest_MissedTurn:: - .string "Missed turn$" - -gText_LinkStandby4:: - .string "Link standby!$" - -gText_WinnerIsPlayersMonCongrats:: - .string "The winner is {STR_VAR_1}'s {STR_VAR_2}!\n" - .string "Congratulations!$" - -gText_WinnerIsPlayersMon:: - .string "The winner is {STR_VAR_1}'s {STR_VAR_2}!{PAUSE_UNTIL_PRESS}$" - -gText_PrimaryJudgingNumX:: - .string "Primary judging: No. {STR_VAR_1}{PAUSE_UNTIL_PRESS}$" - -gText_SecondaryJudgingNumX:: - .string "Secondary judging: No. {STR_VAR_1}{PAUSE_UNTIL_PRESS}$" - -gText_SetEventNumX:: - .string "Set event: No. {STR_VAR_1}{PAUSE_UNTIL_PRESS}$" - -gText_MoveUsedMostOften:: - .string "The move used most often:\n" - .string "{STR_VAR_1}{PAUSE_UNTIL_PRESS}$" - -gText_MostImpressiveMon:: - .string "The most impressive POKΓ©MON:\n" - .string "{STR_VAR_1}'s {STR_VAR_2}{PAUSE_UNTIL_PRESS}$" - -gText_SetEventNumX2:: - .string "Set event: No. {STR_VAR_1}{PAUSE_UNTIL_PRESS}$" - -gText_LinkTVProgramWillNotBeMadeTrainerLost:: - .string "A link TV program will not be made\n" - .string "because the TRAINER lost.{PAUSE_UNTIL_PRESS}$" diff --git a/data/text/contest_painting.inc b/data/text/contest_painting.inc deleted file mode 100644 index 5152cb3bb8e9..000000000000 --- a/data/text/contest_painting.inc +++ /dev/null @@ -1,96 +0,0 @@ -gContestHallPaintingCaption:: - .string "{STR_VAR_1}\n" - .string "{STR_VAR_2}'s {STR_VAR_3}$" - -@ Unused -gContestPaintingContest:: - .string "CONTEST$" - -gContestRankNormal:: - .string "NORMAL RANK$" - -gContestRankSuper:: - .string "SUPER RANK$" - -gContestRankHyper:: - .string "HYPER RANK$" - -gContestRankMaster:: - .string "MASTER RANK$" - -gContestLink:: - .string "LINK$" - -gContestCoolness:: - .string "COOLNESS$" - -gContestBeauty:: - .string "BEAUTY$" - -gContestCuteness:: - .string "CUTENESS$" - -gContestSmartness:: - .string "SMARTNESS$" - -gContestToughness:: - .string "TOUGHNESS$" - -gContestPaintingCool1:: - .string "Nonstop supercool--\n" - .string "the inestimable {STR_VAR_1}$" - -gContestPaintingCool2:: - .string "Hey, there!\n" - .string "The good-looking POKΓ©MON {STR_VAR_1}$" - -gContestPaintingCool3:: - .string "The marvelous, wonderful, and\n" - .string "very great {STR_VAR_1}$" - -gContestPaintingBeauty1:: - .string "This century's last Venus--\n" - .string "the beautiful {STR_VAR_1}$" - -gContestPaintingBeauty2:: - .string "{STR_VAR_1}'s dazzling,\n" - .string "glittering smile$" - -gContestPaintingBeauty3:: - .string "POKΓ©MON CENTER's super idol--\n" - .string "the incomparable {STR_VAR_1}$" - -gContestPaintingCute1:: - .string "The lovely and sweet {STR_VAR_1}$" - -gContestPaintingCute2:: - .string "The pretty {STR_VAR_1}'s\n" - .string "winning portrait$" - -gContestPaintingCute3:: - .string "Give us a wink!\n" - .string "The cutie POKΓ©MON {STR_VAR_1}$" - -gContestPaintingSmart1:: - .string "The smartness maestro--\n" - .string "the wise POKΓ©MON {STR_VAR_1}$" - -gContestPaintingSmart2:: - .string "{STR_VAR_1}--the one chosen\n" - .string "above all POKΓ©MON$" - -gContestPaintingSmart3:: - .string "The excellent {STR_VAR_1}'s\n" - .string "moment of elegance$" - -gContestPaintingTough1:: - .string "The powerfully muscular\n" - .string "speedster {STR_VAR_1}$" - -gContestPaintingTough2:: - .string "The strong, stronger, and\n" - .string "strongest {STR_VAR_1}$" - -gContestPaintingTough3:: - .string "The mighty tough\n" - .string "hyper POKΓ©MON {STR_VAR_1}$" diff --git a/data/text/contest_strings.inc b/data/text/contest_strings.inc deleted file mode 100644 index 4b144a21bcea..000000000000 --- a/data/text/contest_strings.inc +++ /dev/null @@ -1,314 +0,0 @@ -gText_AppealNumWhichMoveWillBePlayed:: - .string "Appeal no. {STR_VAR_1}!\n" - .string "Which move will be played?$" - -gText_AppealNumButItCantParticipate:: - .string "Appeal no. {STR_VAR_1}!\n" - .string "But it can't participate!$" - -gText_MonAppealedWithMove:: - .string "{STR_VAR_1} appealed with\n" - .string "{STR_VAR_2}!$" - -gText_MonWasWatchingOthers:: - .string "{STR_VAR_1} was watching\n" - .string "the others.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_AllOutOfAppealTime:: - .string "We're all out of\n" - .string "Appeal Time!{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -@ Appeal result texts - -gText_BecameMoreConsciousOfOtherMons:: - .string "It became more conscious\n" - .string "of the other POKΓ©MON.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_MonCantMakeAnAppealAfterThis:: - .string "{STR_VAR_1} can't make an\n" - .string "appeal after this.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_SettledDownJustLittleBit:: - .string "It settled down just a\n" - .string "little bit.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_BecameObliviousToOtherMons:: - .string "It became oblivious to\n" - .string "the other POKΓ©MON.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_BecameLessAwareOfOtherMons:: - .string "It became less aware of\n" - .string "the other POKΓ©MON.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_StoppedCaringAboutOtherMons:: - .string "It stopped caring about\n" - .string "other POKΓ©MON much.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_TriedToStartleOtherMons:: - .string "It tried to startle the\n" - .string "other POKΓ©MON.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_TriedToDazzleOthers:: - .string "It tried to dazzle the\n" - .string "others.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_JudgeLookedAwayFromMon:: - .string "The JUDGE looked away\n" - .string "from {STR_VAR_1}.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_TriedToUnnerveNextMon:: - .string "It tried to unnerve the\n" - .string "next POKΓ©MON.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_MonBecameNervous:: - .string "{STR_VAR_1} became\n" - .string "nervous.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_AppealTriedToUnnerveWaitingMons:: - .string "The appeal tried to\n" - .string "unnerve waiting POKΓ©MON.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_TauntedMonsDoingWell:: - .string "It taunted POKΓ©MON\n" - .string "doing well.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_MonRegainedItsForm:: - .string "{STR_VAR_1} regained its\n" - .string "form.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_TriedToJamMonDoingWell:: - .string "It tried to jam POKΓ©MON\n" - .string "doing well.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_StandoutMonHustledEvenMore:: - .string "The standout {STR_VAR_1}\n" - .string "hustled even more.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_LargelyUnnoticedMonWorkedHard:: - .string "The largely unnoticed\n" - .string "{STR_VAR_1} worked hard.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_WorkedAsMuchAsMonBefore:: - .string "It worked as much as\n" - .string "POKΓ©MON before it.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_MonsAppealDidNotGoWell:: - .string "{STR_VAR_1}'s appeal did\n" - .string "not go well.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_WorkedAsMuchAsPrecedingMon:: - .string "It worked as much as the\n" - .string "preceding POKΓ©MON.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_MonsAppealDidNotGoWell2:: - .string "{STR_VAR_1}'s appeal did\n" - .string "not go well.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_MonsAppealDidNotGoWell3:: - .string "{STR_VAR_1}'s appeal did\n" - .string "not go well.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_MonsAppealWentSlightlyWell:: - .string "{STR_VAR_1}'s appeal\n" - .string "went slightly well.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_MonsAppealWentPrettyWell:: - .string "{STR_VAR_1}'s appeal\n" - .string "went pretty well.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_MonsAppealWentExcellently:: - .string "{STR_VAR_1}'s appeal\n" - .string "went excellently.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_MonsAppealWasDud:: - .string "{STR_VAR_1}'s appeal was\n" - .string "a dud.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_MonsAppealDidNotWorkVeryWell:: - .string "{STR_VAR_1}'s appeal did\n" - .string "not work very well.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_MonsAppealWentSlightlyWell2:: - .string "{STR_VAR_1}'s appeal\n" - .string "went slightly well.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_MonsAppealWentPrettyWell2:: - .string "{STR_VAR_1}'s appeal\n" - .string "went pretty well.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_MonsAppealWentVeryWell:: - .string "{STR_VAR_1}'s appeal\n" - .string "went very well.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_MonsAppealWentExcellently2:: - .string "{STR_VAR_1}'s appeal\n" - .string "went excellently.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_SameTypeAsOneBeforeGood:: - .string "It's the same type as the\n" - .string "POKΓ©MON before--good!{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_NotSameTypeAsOneBeforeGood:: - .string "It's not the same type as\n" - .string "the one before--good!{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_StoodOutMuchMoreThanMonBefore:: - .string "It stood out much more\n" - .string "than the POKΓ©MON before.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_DidntDoAsWellAsMonBefore:: - .string "It didn't do as well as the\n" - .string "POKΓ©MON before.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_MonsConditionRoseAboveUsual:: - .string "{STR_VAR_1}'s condition\n" - .string "rose above usual.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_MonsHotStatusMadeGreatAppeal:: - .string "{STR_VAR_1}'s hot status\n" - .string "made it a great appeal!{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_MovedUpInLineForNextAppeal:: - .string "It moved up in line for\n" - .string "the next appeal.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_MovedBackInLineForNextAppeal:: - .string "It moved back in line once\n" - .string "for the next appeal.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_ScrambledUpOrderForNextTurn:: - .string "It scrambled up the\n" - .string "order for the next turn.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}$" - -gText_JudgeLookedAtMonExpectantly:: - .string "The JUDGE looked at\n" - .string "{STR_VAR_1} expectantly.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_AppealComboWentOverWell:: - .string "The appeal combo went\n" - .string "over well.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_AppealComboWentOverVeryWell:: - .string "The appeal combo went\n" - .string "over very well.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_AppealComboWentOverExcellently:: - .string "The appeal combo went\n" - .string "over excellently.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_MonManagedToAvertGaze:: - .string "{STR_VAR_1} managed to\n" - .string "avert its gaze.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_MonManagedToAvoidSeeingIt:: - .string "{STR_VAR_1} managed to\n" - .string "avoid seeing it.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_MonIsntFazedByThatSortOfThing:: - .string "{STR_VAR_1} isn't fazed\n" - .string "by that sort of thing.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_MonBecameALittleDistracted:: - .string "{STR_VAR_1} became a\n" - .string "little distracted.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_TriedToStartleOtherPokemon:: - .string "It tried to startle the\n" - .string "other POKΓ©MON.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_MonLookedDownOutOfDistraction:: - .string "{STR_VAR_1} looked down\n" - .string "out of distraction.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_MonTurnedBackOutOfDistraction:: - .string "{STR_VAR_1} turned back\n" - .string "out of distraction.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_MonCouldntHelpUtteringCry:: - .string "{STR_VAR_1} couldn't help\n" - .string "uttering a cry.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_MonCouldntHelpLeapingUp:: - .string "{STR_VAR_1} couldn't help\n" - .string "leaping up.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_MonTrippedOutOfDistraction:: - .string "{STR_VAR_1} tripped over\n" - .string "out of distraction.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_MonWasTooNervousToMove:: - .string "{STR_VAR_1} was too\n" - .string "nervous to move.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_ButItMessedUp2:: - .string "But it messed up.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_ButItFailedToMakeTargetNervous:: - .string "But it failed to make\n" - .string "the target nervous.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_ButItFailedToMakeAnyoneNervous:: - .string "But it failed to make\n" - .string "anyone nervous.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_ButItWasIgnored:: - .string "But it was ignored…{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_CouldntImproveItsCondition:: - .string "But it couldn't improve\n" - .string "its condition…{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_BadConditionResultedInWeakAppeal:: - .string "Its bad condition\n" - .string "resulted in a weak appeal.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_MonWasUnaffected:: - .string "{STR_VAR_1} was\n" - .string "unaffected.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_RepeatedAppeal:: - .string "{STR_VAR_1} disappointed\n" - .string "by repeating an appeal.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_MonsXWentOverGreat:: - .string "{STR_VAR_1}'s {STR_VAR_3}\n" - .string "went over great.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_MonsXDidntGoOverWell:: - .string "{STR_VAR_1}'s {STR_VAR_3}\n" - .string "didn't go over well here…{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_MonsXGotTheCrowdGoing:: - .string "{STR_VAR_1}'s {STR_VAR_3}\n" - .string "got the crowd going.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_MonCantAppealNextTurn:: - .string "{STR_VAR_1} can't appeal\n" - .string "next turn…{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_AttractedCrowdsAttention:: - .string "It attracted the crowd's\n" - .string "attention.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_CrowdContinuesToWatchMon:: - .string "The crowd continues to\n" - .string "watch {STR_VAR_3}.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_MonsMoveIsIgnored:: - .string "{STR_VAR_1}'s\n" - .string "{STR_VAR_2} is ignored.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}$" - -gText_Contest_Shyness:: - .string "shyness$" - -gText_Contest_Anxiety:: - .string "anxiety$" - -gText_Contest_Laziness:: - .string "laziness$" - -gText_Contest_Hesitancy:: - .string "hesitancy$" - -gText_Contest_Fear:: - .string "fear$" diff --git a/data/text/move_relearner.inc b/data/text/move_relearner.inc new file mode 100644 index 000000000000..b9400fd62b5f --- /dev/null +++ b/data/text/move_relearner.inc @@ -0,0 +1,55 @@ +MoveRelearner_Text_WouldLearnNewMoves: + .string "Hi, I'm the Move Relearner.\n" + .string "Would you like to learn new moves?$" + +MoveRelearner_Text_LevelUpMoves: + .string "Level Up Moves$" + +MoveRelearner_Text_EggMoves: + .string "Egg Moves$" + +MoveRelearner_Text_TMMoves: + .string "TM Moves$" + +MoveRelearner_Text_TutormoveMoves: + .string "Tutor Moves$" + +MoveRelearner_Text_SeeYa: + .string "See ya!$" + +MoveRelearner_Text_AnythingElse: + .string "Is there anything else I may do for you?$" + +MoveRelearner_Text_ChoosePkmn: + .string "Please choose your PokΓ©mon.$" + +MoveRelearner_Text_HaveNoPkmn: + .string "You have no PokΓ©mon.$" + +MoveRelearner_Text_CantTeachMoveToEgg: + .string "Sorry…\n" + .string "But an Egg can't learn moves.$" + +MoveRelearner_Text_CantTeachMoveToPkmn: + .string "Sorry…\p" + .string "It doesn't appear as if I have any move\n" + .string "I can teach that PokΓ©mon.$" + +MoveRelearner_Text_LevelUpMoveLWR:: + .string "level up move$" + +MoveRelearner_Text_EggMoveLWR:: + .string "egg move$" + +MoveRelearner_Text_TMMoveLWR:: + .string "TM move$" + +MoveRelearner_Text_TutorMoveLWR:: + .string "tutor move$" + +MoveRelearner_Text_WhichXmoveShouldTeach: + .string "Which {STR_VAR_3} should I teach?$" + +MoveRelearner_Text_ThankYouComeAgain: + .string "Thank you for using our services.\n" + .string "Please come again!$" diff --git a/docs/FEATURES.md b/docs/FEATURES.md new file mode 100644 index 000000000000..892a07c16b0a --- /dev/null +++ b/docs/FEATURES.md @@ -0,0 +1 @@ +{{#include ../FEATURES.md}} diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index fa03ca20ee5c..e5835ea07b72 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -1,25 +1,61 @@ # Summary - [README](./README.md) +- [FEATURES](./FEATURES.md) - [Installation](./INSTALL.md) - [Setting up WSL1 (Legacy Portion)](./legacy_WSL1_INSTALL.md) + - [ChromeOS](./install/chromeos/CHROME_OS.md) + - [Linux]() + - [ARCH_LINUX](./install/linux/ARCH_LINUX.md) + - [DEBIAN](./install/linux/DEBIAN.md) + - [FEDORA](./install/linux/FEDORA.md) + - [NIXOS](./install/linux/NIXOS.md) + - [OTHERS](./install/linux/OTHERS.md) + - [UBUNTU](./install/linux/UBUNTU.md) + - [macOS](./install/mac/MAC_OS.md) + - [Windows]() + - [CYGWIN](./install/windows/CYGWIN.md) + - [MSYS2](./install/windows/MSYS2.md) + - [WSL](./install/windows/WSL.md) - [Run documentation site locally](local_mdbook/index.md) - [Ubuntu WSL1/WSL2](local_mdbook/ubuntu_WSL.md) - [Contributing](./CONTRIBUTING.md) +- [Styleguide and Principles](./STYLEGUIDE.md) - [Credits](./CREDITS.md) - [Tutorials]() - [What are AI Flags?](tutorials/ai_flags.md) - [How to add new AI Flags](tutorials/ai_logic.md) - [How to add new battle script commands/macros](tutorials/how_to_battle_script_command_macro.md) - [How to add a new move](tutorials/how_to_new_move.md) - - [How to add a new trainer class](tutorials/how_to_trainer_class.md) + - [How to add a new trainer class]() + - [How to add a new trainer front pic](tutorials/how_to_trainer_front_pic.md) + - [How to add a new trainer back pic](tutorials/how_to_trainer_back_pic.md) - [How to add a new PokΓ©mon](tutorials/how_to_new_pokemon.md) - [v1.6.x and earlier](tutorials/how_to_new_pokemon_1_6_0.md) - [How to use the Testing System](tutorials/how_to_testing_system.md) - [How to add new Trainer Slides](tutorials/how_to_new_trainer_slide.md) - [Day/Night System FAQ](tutorials/dns.md) + - [How to use the code entry system](tutorials/how_to_code_entry.md) + - [How to use Follower NPCs](tutorials/how_to_follower_npc.md) + - [Time-Based Encounters](tutorials/how_to_time_of_day_encounters.md) + - [How to use Trainer Party Pools](tutorials/how_to_trainer_party_pool.md) + - [How to Apricorn Tree](tutorials/how_to_apricorn_tree.md) + - [How to Namebox](tutorials/how_to_namebox.md) + - [Vs. Seeker](tutorials/vs_seeker.md) - [Changelog](./CHANGELOG.md) + - [1.14.x]() + - [Version 1.14.1](changelogs/1.14.x/1.14.1.md) + - [Version 1.14.0](changelogs/1.14.x/1.14.0.md) + - [1.13.x]() + - [Version 1.13.4](changelogs/1.13.x/1.13.4.md) + - [Version 1.13.3](changelogs/1.13.x/1.13.3.md) + - [Version 1.13.2](changelogs/1.13.x/1.13.2.md) + - [Version 1.13.1](changelogs/1.13.x/1.13.1.md) + - [Version 1.13.0](changelogs/1.13.x/1.13.0.md) - [1.12.x]() + - [Version 1.12.3](changelogs/1.12.x/1.12.3.md) + - [Version 1.12.2](changelogs/1.12.x/1.12.2.md) + - [Version 1.12.1](changelogs/1.12.x/1.12.1.md) - [Version 1.12.0](changelogs/1.12.x/1.12.0.md) - [1.11.x]() - [Version 1.11.4](changelogs/1.11.x/1.11.4.md) @@ -32,6 +68,7 @@ - [Version 1.10.2](changelogs/1.10.x/1.10.2.md) - [Version 1.10.1](changelogs/1.10.x/1.10.1.md) - [Version 1.10.0](changelogs/1.10.x/1.10.0.md) + - [Megaman Battle Network Style Names](./mmbn_style_names.md) - [1.9.x]() - [Version 1.9.4](changelogs/1.9.x/1.9.4.md) - [Version 1.9.3](changelogs/1.9.x/1.9.3.md) @@ -80,4 +117,5 @@ - [Team Procedures]() - [How to make an Expansion version](team_procedures/expansion_versions.md) - [Release Schedule and Process](team_procedures/schedule.md) + - [Merge Checklist](team_procedures/merge_checklist.md) - [Scope Guidelines](team_procedures/scope.md) diff --git a/docs/book.toml b/docs/book.toml index 3282d8c8e7ad..a1e994eff305 100644 --- a/docs/book.toml +++ b/docs/book.toml @@ -1,6 +1,5 @@ [book] language = "en" -multilingual = false src = "." title = "pokeemerald-expansion" diff --git a/docs/changelogs/1.12.x/1.12.0.md b/docs/changelogs/1.12.x/1.12.0.md index b223e040dab2..965ae27b275d 100644 --- a/docs/changelogs/1.12.x/1.12.0.md +++ b/docs/changelogs/1.12.x/1.12.0.md @@ -121,7 +121,7 @@ - Added option to disable object event shadows - Added option to turn DNS on or off, `OW_ENABLE_DNS` - Added option to for vanilla shadow behaviour, `OW_OBJECT_VANILLA_SHADOWS` - - Scripts containing consecutive `removeobject and `addobject ` needs a `delay 1` between the commands. + - Scripts containing consecutive `removeobject ` and `addobject ` needs a `delay 1` between the commands. ```diff removeobject MY_OBJECT + delay 1 diff --git a/docs/changelogs/1.12.x/1.12.1.md b/docs/changelogs/1.12.x/1.12.1.md new file mode 100644 index 000000000000..ba1d24c93494 --- /dev/null +++ b/docs/changelogs/1.12.x/1.12.1.md @@ -0,0 +1,145 @@ +```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.12.1 +`. +``` + + +## 🧬 General 🧬 +### Changed +* Changed trainer tutorial to take into account removed palette compression by @hedara90 in [#7044](https://github.com/rh-hideout/pokeemerald-expansion/pull/7044) +* Update CI to ignore allcontributors commits by @pkmnsnfrn in [#7046](https://github.com/rh-hideout/pokeemerald-expansion/pull/7046) +* Fixed CI issue introduced 7046 by @pkmnsnfrn in [#7072](https://github.com/rh-hideout/pokeemerald-expansion/pull/7072) +* Added loop iterator style by @hedara90 in [#7092](https://github.com/rh-hideout/pokeemerald-expansion/pull/7092) +* Fix typo in INSTALL.md by @hedara90 in [#7116](https://github.com/rh-hideout/pokeemerald-expansion/pull/7116) +* Use RGB values for DEFAULT_LIGHT_COLOR by @hedara90 in [#7133](https://github.com/rh-hideout/pokeemerald-expansion/pull/7133) +* Applied Kasen's documentation improvements by @hedara90 in [#7104](https://github.com/rh-hideout/pokeemerald-expansion/pull/7104) +* Fixed description of `FORM_CHANGE_WITHDRAW` by @AsparagusEduardo in [#7152](https://github.com/rh-hideout/pokeemerald-expansion/pull/7152) +* Pret merge (19th of June, 2025) by @Bassoonian in [#7163](https://github.com/rh-hideout/pokeemerald-expansion/pull/7163) +* Update the description of OW_OBJECT_VANILLA_SHADOWS by @pkmnsnfrn in [#7184](https://github.com/rh-hideout/pokeemerald-expansion/pull/7184) +* fix: use BackPickId to calculate player intro ball throw animation palette by @pablopenna in [#7193](https://github.com/rh-hideout/pokeemerald-expansion/pull/7193) + +### Fixed +* Added line break between Trainer 1 name and Trainer 2 name in sText_TwoTrainersWantToBattle by @grintoul1 in [#7028](https://github.com/rh-hideout/pokeemerald-expansion/pull/7028) +* Fixed Battle Pyramid mon generation by @hedara90 in [#7146](https://github.com/rh-hideout/pokeemerald-expansion/pull/7146) +* force sGFRomHeader to always be present by @DizzyEggg in [#7186](https://github.com/rh-hideout/pokeemerald-expansion/pull/7186) +* force RHH Rom Header to always be present by @DizzyEggg in [#7187](https://github.com/rh-hideout/pokeemerald-expansion/pull/7187) +* Fixed debug flag menu sound by @AsparagusEduardo in [#7190](https://github.com/rh-hideout/pokeemerald-expansion/pull/7190) +* Fix BtlController_EmitChosenMonReturnValue UB by @DizzyEggg in [#7197](https://github.com/rh-hideout/pokeemerald-expansion/pull/7197) +* Backported Safari catch and add to party fix by @hedara90 in [#7192](https://github.com/rh-hideout/pokeemerald-expansion/pull/7192) +* Fix 01_battle_engine_bugs.yaml by @hedara90 in [#7242](https://github.com/rh-hideout/pokeemerald-expansion/pull/7242) + +## πŸ—ΊοΈ Overworld πŸ—ΊοΈ +### Fixed +* Bug fix: clear saved follower NPC door warp when doing dive warp by @Bivurnum in [#7065](https://github.com/rh-hideout/pokeemerald-expansion/pull/7065) +* Fix Contest Painting load palette error by @ExMingYan in [#7077](https://github.com/rh-hideout/pokeemerald-expansion/pull/7077) +* Bug fix: Follower NPC no longer retains bike sprite after white out by @Bivurnum in [#7120](https://github.com/rh-hideout/pokeemerald-expansion/pull/7120) +* Bug fix: clear follower npc surf blob on white out by @Bivurnum in [#7153](https://github.com/rh-hideout/pokeemerald-expansion/pull/7153) + +## πŸ‰ PokΓ©mon πŸ‰ +### Changed +* Fixes Rapid Spin description (#7178) by @grintoul1 in [#7181](https://github.com/rh-hideout/pokeemerald-expansion/pull/7181) + +### Fixed +* Fixed text width for a lot of forms in HGSS Dex by @AsparagusEduardo in [#7035](https://github.com/rh-hideout/pokeemerald-expansion/pull/7035) +* Fixes Roamers not saving shininess by @i0brendan0 in [#7185](https://github.com/rh-hideout/pokeemerald-expansion/pull/7185) +* [FIX] Prevent caught PokΓ©mon loss in NPC partner battles by @J2M2 in [#7177](https://github.com/rh-hideout/pokeemerald-expansion/pull/7177) + +## βš”οΈ Battle General βš”οΈ +### Changed +* Fixes large battle messages being cut off instead of being prompted to advance 2 by @PhallenTree in [#7036](https://github.com/rh-hideout/pokeemerald-expansion/pull/7036) +* Battle controller pret documentation by @AlexOn1ine in [#7029](https://github.com/rh-hideout/pokeemerald-expansion/pull/7029) +* Fix typos and some cleanup (mainly in battle files) by @PhallenTree in [#7107](https://github.com/rh-hideout/pokeemerald-expansion/pull/7107) + +### Fixed +* Fixes multi battle party re-order by @AlexOn1ine in [#7042](https://github.com/rh-hideout/pokeemerald-expansion/pull/7042) +* Fixes Aura Wheel + Normalize and Hunger Switch while Transformed/Terastallized by @PhallenTree in [#7061](https://github.com/rh-hideout/pokeemerald-expansion/pull/7061) +* Fixes speed calculation order by @AlexOn1ine in [#7064](https://github.com/rh-hideout/pokeemerald-expansion/pull/7064) +* Bug fix for Grassy Terrain incorrectly healing non-grounded Pokemon by @LinathanZel in [#7058](https://github.com/rh-hideout/pokeemerald-expansion/pull/7058) +* Fixes Wandering Spirit copied ability activation on fainted mon by @AlexOn1ine in [#7066](https://github.com/rh-hideout/pokeemerald-expansion/pull/7066) +* Chloroblast fix by @LinathanZel in [#7008](https://github.com/rh-hideout/pokeemerald-expansion/pull/7008) +* Fix Normalize not boosting Normal type moves if they were already Normal type by @i0brendan0 in [#7060](https://github.com/rh-hideout/pokeemerald-expansion/pull/7060) +* Fixes freeze during a 1v2 double battle by @AlexOn1ine in [#7075](https://github.com/rh-hideout/pokeemerald-expansion/pull/7075) +* Fixes Pursuit potentially causing both battlers to switch into the same mon by @PhallenTree in [#7084](https://github.com/rh-hideout/pokeemerald-expansion/pull/7084) +* Fixed potential mismatch between players and battlers in tests by @AsparagusEduardo in [#7101](https://github.com/rh-hideout/pokeemerald-expansion/pull/7101) +* Fixes Ally Switch in multi battles by @AlexOn1ine in [#7109](https://github.com/rh-hideout/pokeemerald-expansion/pull/7109) +* Add missing flag for Berserk Gene by @AlexOn1ine in [#7151](https://github.com/rh-hideout/pokeemerald-expansion/pull/7151) +* Fixes Neutralizing Gas leaving the field activating unsuppressable abilities again by @PhallenTree in [#7170](https://github.com/rh-hideout/pokeemerald-expansion/pull/7170) +* Fixes Enigma, Kee and Maranga Berry activation timing by @AlexOn1ine in [#7171](https://github.com/rh-hideout/pokeemerald-expansion/pull/7171) +* Fixes wrong Future Sight indexing by @AlexOn1ine in [#7198](https://github.com/rh-hideout/pokeemerald-expansion/pull/7198) +* Fixes OOB for Teatime and Flower Shield by @AlexOn1ine in [#7214](https://github.com/rh-hideout/pokeemerald-expansion/pull/7214) +* Fixes wrong assignment in TrySymbiosis by @AlexOn1ine in [#7221](https://github.com/rh-hideout/pokeemerald-expansion/pull/7221) +* Adds missing healBlockTimer for Baton Pass by @AlexOn1ine in [#7220](https://github.com/rh-hideout/pokeemerald-expansion/pull/7220) +* Jaboca berry triggers instead of being stolen by bug bite by @ghoulslash in [#7237](https://github.com/rh-hideout/pokeemerald-expansion/pull/7237) +* Fixes Scald defrosting target while asleep by @AlexOn1ine in [#7233](https://github.com/rh-hideout/pokeemerald-expansion/pull/7233) +* Fixes Emergency Exit sometimes causing an unrelated battler to become invisible by @PhallenTree in [#7241](https://github.com/rh-hideout/pokeemerald-expansion/pull/7241) + +## 🀹 Moves 🀹 +### Changed +* Fix ScaryFace anim for Bitter Malice by @TLM-PsIQ in [#6476](https://github.com/rh-hideout/pokeemerald-expansion/pull/6476) + +### Fixed +* Fix savage spin out spider web template by @ghoulslash in [#7137](https://github.com/rh-hideout/pokeemerald-expansion/pull/7137) + +## 🎭 Abilities 🎭 +### Changed +* Flush textbox for Truant Popup by @ghoulslash in [#7252](https://github.com/rh-hideout/pokeemerald-expansion/pull/7252) + +## 🧢 Items 🧢 +### Fixed +* Fix sell price display by @cawtds in [#7123](https://github.com/rh-hideout/pokeemerald-expansion/pull/7123) + +## πŸ€– Battle AI πŸ€– +### Fixed +* Added AI_FLAG_PP_STALL_PREVENTION to AI_FLAG_SMART_TRAINER by @AlexOn1ine in [#7112](https://github.com/rh-hideout/pokeemerald-expansion/pull/7112) +* Fix incorrect function parameters used in AI damage calc by @Pawkkie in [#7130](https://github.com/rh-hideout/pokeemerald-expansion/pull/7130) + +## 🧹 Other Cleanup 🧹 +* Fix typos and some cleanup (mainly in battle files) by @PhallenTree in [#7107](https://github.com/rh-hideout/pokeemerald-expansion/pull/7107) +* Fix typo in INSTALL.md by @hedara90 in [#7116](https://github.com/rh-hideout/pokeemerald-expansion/pull/7116) +* Fixed description of `FORM_CHANGE_WITHDRAW` by @AsparagusEduardo in [#7152](https://github.com/rh-hideout/pokeemerald-expansion/pull/7152) +* Spruce up `FEATURES.md` by @AsparagusEduardo in [#7159](https://github.com/rh-hideout/pokeemerald-expansion/pull/7159) +* Fixes Rapid Spin description (#7178) by @grintoul1 in [#7181](https://github.com/rh-hideout/pokeemerald-expansion/pull/7181) + +## πŸ§ͺ Test Runner πŸ§ͺ +### Changed +* Wrote some missing tests by @AsparagusEduardo in [#7094](https://github.com/rh-hideout/pokeemerald-expansion/pull/7094) +* Fixed KNOWN_FAILING Tera test by @AsparagusEduardo in [#6949](https://github.com/rh-hideout/pokeemerald-expansion/pull/6949) +* Add some tests by @ghoulslash in [#7234](https://github.com/rh-hideout/pokeemerald-expansion/pull/7234) +* Added tests for Toxic Thread by @hedara90 in [#7244](https://github.com/rh-hideout/pokeemerald-expansion/pull/7244) + +### Fixed +* Test runner fixes by @hedara90 in [#7100](https://github.com/rh-hideout/pokeemerald-expansion/pull/7100) +* Fixed Aura Wheel `KNOWN_FAILING` test by @AsparagusEduardo in [#7135](https://github.com/rh-hideout/pokeemerald-expansion/pull/7135) +* Fix AI party count calc being maintained between tests by @AsparagusEduardo in [#7200](https://github.com/rh-hideout/pokeemerald-expansion/pull/7200) +* Fix tests failing with `B_FRIENDSHIP_BOOST` being `TRUE` by @AsparagusEduardo in [#7194](https://github.com/rh-hideout/pokeemerald-expansion/pull/7194) +* Jaboca berry triggers instead of being stolen by bug bite by @ghoulslash in [#7237](https://github.com/rh-hideout/pokeemerald-expansion/pull/7237) + +## πŸ“š Documentation πŸ“š +* Changed trainer tutorial to take into account removed palette compression by @hedara90 in [#7044](https://github.com/rh-hideout/pokeemerald-expansion/pull/7044) +* Battle controller pret documentation by @AlexOn1ine in [#7029](https://github.com/rh-hideout/pokeemerald-expansion/pull/7029) +* Added loop iterator style by @hedara90 in [#7092](https://github.com/rh-hideout/pokeemerald-expansion/pull/7092) +* Use RGB values for DEFAULT_LIGHT_COLOR by @hedara90 in [#7133](https://github.com/rh-hideout/pokeemerald-expansion/pull/7133) +* Applied Kasen's documentation improvements by @hedara90 in [#7104](https://github.com/rh-hideout/pokeemerald-expansion/pull/7104) +* Spruce up `FEATURES.md` by @AsparagusEduardo in [#7159](https://github.com/rh-hideout/pokeemerald-expansion/pull/7159) +* Update the description of OW_OBJECT_VANILLA_SHADOWS by @pkmnsnfrn in [#7184](https://github.com/rh-hideout/pokeemerald-expansion/pull/7184) + +## πŸ“¦ Branch Synchronisation πŸ“¦ +### pret +* 24th of June, 2025 in [#7206](https://github.com/rh-hideout/pokeemerald-expansion/pull/7206) + * Move gTradePlatform_Tilemap to header and change to u32 by @DizzyEggg in [pret#2088](https://github.com/pret/pokeemerald/pull/2088) + * Fix wrong keep temps files directory in makefile by @DizzyEggg in [pret#2156](https://github.com/pret/pokeemerald/pull/2156) + * Fix collision comparison in PlayerNotOnBikeMoving by @GriffinRichards in [pret#2104](https://github.com/pret/pokeemerald/pull/2104) + * Match graphics declarations with externs in graphics.h by @DizzyEggg in [pret#2089](https://github.com/pret/pokeemerald/pull/2089) + +## New Contributors +* @TLM-PsIQ made their first contribution in [#6476](https://github.com/rh-hideout/pokeemerald-expansion/pull/6476) +* @pablopenna made their first contribution in [#7193](https://github.com/rh-hideout/pokeemerald-expansion/pull/7193) +* @J2M2 made their first contribution in [#7177](https://github.com/rh-hideout/pokeemerald-expansion/pull/7177) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.12.0...expansion/1.12.1 + + + + diff --git a/docs/changelogs/1.12.x/1.12.2.md b/docs/changelogs/1.12.x/1.12.2.md new file mode 100644 index 000000000000..9f1b210638c9 --- /dev/null +++ b/docs/changelogs/1.12.x/1.12.2.md @@ -0,0 +1,164 @@ +```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.12.1 +`. +``` + + +## 🧬 General 🧬 +### Changed +* Changed trainer tutorial to take into account removed palette compression by @hedara90 in [#7044](https://github.com/rh-hideout/pokeemerald-expansion/pull/7044) +* Update CI to ignore allcontributors commits by @pkmnsnfrn in [#7046](https://github.com/rh-hideout/pokeemerald-expansion/pull/7046) +* add bassforte123 as a contributor for code by @allcontributors[bot] in [#7003](https://github.com/rh-hideout/pokeemerald-expansion/pull/7003) +* add iriv24 as a contributor for code by @allcontributors[bot] in [#7059](https://github.com/rh-hideout/pokeemerald-expansion/pull/7059) +* add Bivurnum as a contributor for code by @allcontributors[bot] in [#7067](https://github.com/rh-hideout/pokeemerald-expansion/pull/7067) +* Fixed CI issue introduced 7046 by @pkmnsnfrn in [#7072](https://github.com/rh-hideout/pokeemerald-expansion/pull/7072) +* Added loop iterator style by @hedara90 in [#7092](https://github.com/rh-hideout/pokeemerald-expansion/pull/7092) +* add Emiliasky as a contributor for test by @allcontributors[bot] in [#7082](https://github.com/rh-hideout/pokeemerald-expansion/pull/7082) +* Update CREDITS.md with correct line placement by @pkmnsnfrn in [#7096](https://github.com/rh-hideout/pokeemerald-expansion/pull/7096) +* Fix typo in INSTALL.md by @hedara90 in [#7116](https://github.com/rh-hideout/pokeemerald-expansion/pull/7116) +* Use RGB values for DEFAULT_LIGHT_COLOR by @hedara90 in [#7133](https://github.com/rh-hideout/pokeemerald-expansion/pull/7133) +* Applied Kasen's documentation improvements by @hedara90 in [#7104](https://github.com/rh-hideout/pokeemerald-expansion/pull/7104) +* add fakuzatsu as a contributor for code by @allcontributors[bot] in [#7136](https://github.com/rh-hideout/pokeemerald-expansion/pull/7136) +* Fixed description of `FORM_CHANGE_WITHDRAW` by @AsparagusEduardo in [#7152](https://github.com/rh-hideout/pokeemerald-expansion/pull/7152) +* add poetahto as a contributor for code by @allcontributors[bot] in [#7162](https://github.com/rh-hideout/pokeemerald-expansion/pull/7162) +* Pret merge (19th of June, 2025) by @Bassoonian in [#7163](https://github.com/rh-hideout/pokeemerald-expansion/pull/7163) +* Update the description of OW_OBJECT_VANILLA_SHADOWS by @pkmnsnfrn in [#7184](https://github.com/rh-hideout/pokeemerald-expansion/pull/7184) +* fix: use BackPickId to calculate player intro ball throw animation palette by @pablopenna in [#7193](https://github.com/rh-hideout/pokeemerald-expansion/pull/7193) +* add pablopenna as a contributor for code by @allcontributors[bot] in [#7202](https://github.com/rh-hideout/pokeemerald-expansion/pull/7202) + +### Fixed +* Added line break between Trainer 1 name and Trainer 2 name in sText_TwoTrainersWantToBattle by @grintoul1 in [#7028](https://github.com/rh-hideout/pokeemerald-expansion/pull/7028) +* Fixed Battle Pyramid mon generation by @hedara90 in [#7146](https://github.com/rh-hideout/pokeemerald-expansion/pull/7146) +* force sGFRomHeader to always be present by @DizzyEggg in [#7186](https://github.com/rh-hideout/pokeemerald-expansion/pull/7186) +* force RHH Rom Header to always be present by @DizzyEggg in [#7187](https://github.com/rh-hideout/pokeemerald-expansion/pull/7187) +* Fixed debug flag menu sound by @AsparagusEduardo in [#7190](https://github.com/rh-hideout/pokeemerald-expansion/pull/7190) +* Fix BtlController_EmitChosenMonReturnValue UB by @DizzyEggg in [#7197](https://github.com/rh-hideout/pokeemerald-expansion/pull/7197) +* Backported Safari catch and add to party fix by @hedara90 in [#7192](https://github.com/rh-hideout/pokeemerald-expansion/pull/7192) +* Fix 01_battle_engine_bugs.yaml by @hedara90 in [#7242](https://github.com/rh-hideout/pokeemerald-expansion/pull/7242) + +## πŸ—ΊοΈ Overworld πŸ—ΊοΈ +### Fixed +* Bug fix: clear saved follower NPC door warp when doing dive warp by @Bivurnum in [#7065](https://github.com/rh-hideout/pokeemerald-expansion/pull/7065) +* Fix Contest Painting load palette error by @ExMingYan in [#7077](https://github.com/rh-hideout/pokeemerald-expansion/pull/7077) +* Bug fix: Follower NPC no longer retains bike sprite after white out by @Bivurnum in [#7120](https://github.com/rh-hideout/pokeemerald-expansion/pull/7120) +* Bug fix: clear follower npc surf blob on white out by @Bivurnum in [#7153](https://github.com/rh-hideout/pokeemerald-expansion/pull/7153) + +## πŸ‰ PokΓ©mon πŸ‰ +### Changed +* Fixes Rapid Spin description (#7178) by @grintoul1 in [#7181](https://github.com/rh-hideout/pokeemerald-expansion/pull/7181) + +### Fixed +* Fixed text width for a lot of forms in HGSS Dex by @AsparagusEduardo in [#7035](https://github.com/rh-hideout/pokeemerald-expansion/pull/7035) +* Fixes Roamers not saving shininess by @i0brendan0 in [#7185](https://github.com/rh-hideout/pokeemerald-expansion/pull/7185) +* [FIX] Prevent caught PokΓ©mon loss in NPC partner battles by @J2M2 in [#7177](https://github.com/rh-hideout/pokeemerald-expansion/pull/7177) + + + +## βš”οΈ Battle General βš”οΈ +### Changed +* Fixes large battle messages being cut off instead of being prompted to advance 2 by @PhallenTree in [#7036](https://github.com/rh-hideout/pokeemerald-expansion/pull/7036) +* Battle controller pret documentation by @AlexOn1ine in [#7029](https://github.com/rh-hideout/pokeemerald-expansion/pull/7029) +* Fix typos and some cleanup (mainly in battle files) by @PhallenTree in [#7107](https://github.com/rh-hideout/pokeemerald-expansion/pull/7107) + +### Fixed +* Fixes multi battle party re-order by @AlexOn1ine in [#7042](https://github.com/rh-hideout/pokeemerald-expansion/pull/7042) +* Fixes Aura Wheel + Normalize and Hunger Switch while Transformed/Terastallized by @PhallenTree in [#7061](https://github.com/rh-hideout/pokeemerald-expansion/pull/7061) +* Fixes speed calculation order by @AlexOn1ine in [#7064](https://github.com/rh-hideout/pokeemerald-expansion/pull/7064) +* Bug fix for Grassy Terrain incorrectly healing non-grounded Pokemon by @LinathanZel in [#7058](https://github.com/rh-hideout/pokeemerald-expansion/pull/7058) +* Fixes Wandering Spirit copied ability activation on fainted mon by @AlexOn1ine in [#7066](https://github.com/rh-hideout/pokeemerald-expansion/pull/7066) +* Chloroblast fix by @LinathanZel in [#7008](https://github.com/rh-hideout/pokeemerald-expansion/pull/7008) + + + * Chloroblast causing recoil damage even if the move fails to connect by @LinathanZel in #7007 + + +* [DRAFT] Fix Normalize not boosting Normal type moves if they were already Normal type by @i0brendan0 in [#7060](https://github.com/rh-hideout/pokeemerald-expansion/pull/7060) +* Fixes freeze during a 1v2 double battle by @AlexOn1ine in [#7075](https://github.com/rh-hideout/pokeemerald-expansion/pull/7075) +* Fixes Pursuit potentially causing both battlers to switch into the same mon by @PhallenTree in [#7084](https://github.com/rh-hideout/pokeemerald-expansion/pull/7084) +* Fixed potential mismatch between players and battlers in tests by @AsparagusEduardo in [#7101](https://github.com/rh-hideout/pokeemerald-expansion/pull/7101) +* Fixes Ally Switch in multi battles by @AlexOn1ine in [#7109](https://github.com/rh-hideout/pokeemerald-expansion/pull/7109) +* Add missing flag for Berserk Gene by @AlexOn1ine in [#7151](https://github.com/rh-hideout/pokeemerald-expansion/pull/7151) +* Fixes Neutralizing Gas leaving the field activating unsuppressable abilities again by @PhallenTree in [#7170](https://github.com/rh-hideout/pokeemerald-expansion/pull/7170) +* Fixes Enigma, Kee and Maranga Berry activation timing by @AlexOn1ine in [#7171](https://github.com/rh-hideout/pokeemerald-expansion/pull/7171) +* Fixes wrong Future Sight indexing by @AlexOn1ine in [#7198](https://github.com/rh-hideout/pokeemerald-expansion/pull/7198) +* Fixes OOB for Teatime and Flower Shield by @AlexOn1ine in [#7214](https://github.com/rh-hideout/pokeemerald-expansion/pull/7214) +* Fixes wrong assignment in TrySymbiosis by @AlexOn1ine in [#7221](https://github.com/rh-hideout/pokeemerald-expansion/pull/7221) +* Adds missing healBlockTimer for Baton Pass by @AlexOn1ine in [#7220](https://github.com/rh-hideout/pokeemerald-expansion/pull/7220) +* Jaboca berry triggers instead of being stolen by bug bite by @ghoulslash in [#7237](https://github.com/rh-hideout/pokeemerald-expansion/pull/7237) +* Fixes Scald defrosting target while asleep by @AlexOn1ine in [#7233](https://github.com/rh-hideout/pokeemerald-expansion/pull/7233) +* Fixes Emergency Exit sometimes causing an unrelated battler to become invisible by @PhallenTree in [#7241](https://github.com/rh-hideout/pokeemerald-expansion/pull/7241) + +## 🀹 Moves 🀹 +### Changed +* Fix ScaryFace anim for Bitter Malice by @TLM-PsIQ in [#6476](https://github.com/rh-hideout/pokeemerald-expansion/pull/6476) + + + +### Fixed +* Fix savage spin out spider web template by @ghoulslash in [#7137](https://github.com/rh-hideout/pokeemerald-expansion/pull/7137) + +## 🎭 Abilities 🎭 +### Changed +* Flush textbox for Truant Popup by @ghoulslash in [#7252](https://github.com/rh-hideout/pokeemerald-expansion/pull/7252) + +## 🧢 Items 🧢 +### Fixed +* Fix sell price display by @cawtds in [#7123](https://github.com/rh-hideout/pokeemerald-expansion/pull/7123) + +## πŸ€– Battle AI πŸ€– +### Fixed +* Added AI_FLAG_PP_STALL_PREVENTION to AI_FLAG_SMART_TRAINER by @AlexOn1ine in [#7112](https://github.com/rh-hideout/pokeemerald-expansion/pull/7112) +* Fix incorrect function parameters used in AI damage calc by @Pawkkie in [#7130](https://github.com/rh-hideout/pokeemerald-expansion/pull/7130) + +## 🧹 Other Cleanup 🧹 +* Update CI to ignore allcontributors commits by @pkmnsnfrn in [#7046](https://github.com/rh-hideout/pokeemerald-expansion/pull/7046) +* Update CREDITS.md with correct line placement by @pkmnsnfrn in [#7096](https://github.com/rh-hideout/pokeemerald-expansion/pull/7096) +* Fix typos and some cleanup (mainly in battle files) by @PhallenTree in [#7107](https://github.com/rh-hideout/pokeemerald-expansion/pull/7107) +* Fix typo in INSTALL.md by @hedara90 in [#7116](https://github.com/rh-hideout/pokeemerald-expansion/pull/7116) +* Fixed description of `FORM_CHANGE_WITHDRAW` by @AsparagusEduardo in [#7152](https://github.com/rh-hideout/pokeemerald-expansion/pull/7152) +* Spruce up `FEATURES.md` by @AsparagusEduardo in [#7159](https://github.com/rh-hideout/pokeemerald-expansion/pull/7159) +* Fixes Rapid Spin description (#7178) by @grintoul1 in [#7181](https://github.com/rh-hideout/pokeemerald-expansion/pull/7181) + +## πŸ§ͺ Test Runner πŸ§ͺ +### Changed +* Wrote some missing tests by @AsparagusEduardo in [#7094](https://github.com/rh-hideout/pokeemerald-expansion/pull/7094) +* Fixed KNOWN_FAILING Tera test by @AsparagusEduardo in [#6949](https://github.com/rh-hideout/pokeemerald-expansion/pull/6949) +* Add some tests by @ghoulslash in [#7234](https://github.com/rh-hideout/pokeemerald-expansion/pull/7234) +* Added tests for Toxic Thread by @hedara90 in [#7244](https://github.com/rh-hideout/pokeemerald-expansion/pull/7244) + +### Fixed +* Test runner fixes by @hedara90 in [#7100](https://github.com/rh-hideout/pokeemerald-expansion/pull/7100) +* Fixed Aura Wheel `KNOWN_FAILING` test by @AsparagusEduardo in [#7135](https://github.com/rh-hideout/pokeemerald-expansion/pull/7135) +* Fix AI party count calc being maintained between tests by @AsparagusEduardo in [#7200](https://github.com/rh-hideout/pokeemerald-expansion/pull/7200) +* Fix tests failing with `B_FRIENDSHIP_BOOST` being `TRUE` by @AsparagusEduardo in [#7194](https://github.com/rh-hideout/pokeemerald-expansion/pull/7194) +* Jaboca berry triggers instead of being stolen by bug bite by @ghoulslash in [#7237](https://github.com/rh-hideout/pokeemerald-expansion/pull/7237) + +## πŸ“š Documentation πŸ“š +* Changed trainer tutorial to take into account removed palette compression by @hedara90 in [#7044](https://github.com/rh-hideout/pokeemerald-expansion/pull/7044) +* Battle controller pret documentation by @AlexOn1ine in [#7029](https://github.com/rh-hideout/pokeemerald-expansion/pull/7029) +* Added loop iterator style by @hedara90 in [#7092](https://github.com/rh-hideout/pokeemerald-expansion/pull/7092) +* Use RGB values for DEFAULT_LIGHT_COLOR by @hedara90 in [#7133](https://github.com/rh-hideout/pokeemerald-expansion/pull/7133) +* Applied Kasen's documentation improvements by @hedara90 in [#7104](https://github.com/rh-hideout/pokeemerald-expansion/pull/7104) +* Spruce up `FEATURES.md` by @AsparagusEduardo in [#7159](https://github.com/rh-hideout/pokeemerald-expansion/pull/7159) +* Update the description of OW_OBJECT_VANILLA_SHADOWS by @pkmnsnfrn in [#7184](https://github.com/rh-hideout/pokeemerald-expansion/pull/7184) + +## πŸ“¦ Branch Synchronisation πŸ“¦ +### pret +* 24th of June, 2025 in [#7206](https://github.com/rh-hideout/pokeemerald-expansion/pull/7206) + * Move gTradePlatform_Tilemap to header and change to u32 by @DizzyEggg in [pret#2088](https://github.com/pret/pokeemerald/pull/2088) + * Fix wrong keep temps files directory in makefile by @DizzyEggg in [pret#2156](https://github.com/pret/pokeemerald/pull/2156) + * Fix collision comparison in PlayerNotOnBikeMoving by @GriffinRichards in [pret#2104](https://github.com/pret/pokeemerald/pull/2104) + * Match graphics declarations with externs in graphics.h by @DizzyEggg in [pret#2089](https://github.com/pret/pokeemerald/pull/2089) + +## New Contributors +* @TLM-PsIQ made their first contribution in [#6476](https://github.com/rh-hideout/pokeemerald-expansion/pull/6476) +* @pablopenna made their first contribution in [#7193](https://github.com/rh-hideout/pokeemerald-expansion/pull/7193) +* @J2M2 made their first contribution in [#7177](https://github.com/rh-hideout/pokeemerald-expansion/pull/7177) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.12.0...expansion/1.12.1 + + + + diff --git a/docs/changelogs/1.12.x/1.12.3.md b/docs/changelogs/1.12.x/1.12.3.md new file mode 100644 index 000000000000..a4deece8353f --- /dev/null +++ b/docs/changelogs/1.12.x/1.12.3.md @@ -0,0 +1,118 @@ +```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.12.3 +`. +``` + + +## 🧬 General 🧬 +### Changed +* Restore git history check by @ravepossum in [#7463](https://github.com/rh-hideout/pokeemerald-expansion/pull/7463) +* Moved summary screen nature colors to summary_screen.h by @RubyRaven6 in [#7560](https://github.com/rh-hideout/pokeemerald-expansion/pull/7560) +* Added comment in event.inc for simple menus in dynmultichoice by @RubyRaven6 in [#7568](https://github.com/rh-hideout/pokeemerald-expansion/pull/7568) +* Changed default print level for DebugPrintf for mGBA to MGBA_LOG_WARN by @hedara90 in [#7567](https://github.com/rh-hideout/pokeemerald-expansion/pull/7567) +* Fixed Teleport's description not being updated based on `B_TELEPORT_BEHAVIOR` by @AsparagusEduardo in [#7580](https://github.com/rh-hideout/pokeemerald-expansion/pull/7580) +* Minor Clean up in battle_ai_main.c by @AlexOn1ine in [#7551](https://github.com/rh-hideout/pokeemerald-expansion/pull/7551) + +## πŸ—ΊοΈ Overworld πŸ—ΊοΈ +### Changed +* fix: remove unused wild_encounters.json.txt jinja file by @khbsd in [#7581](https://github.com/rh-hideout/pokeemerald-expansion/pull/7581) + +### Fixed +* Bug fix: add handling for forced movements into/after ledge jumps with follower NPCs by @Bivurnum in [#7055](https://github.com/rh-hideout/pokeemerald-expansion/pull/7055) +* Fixed compile issue `OW_TIMES_OF_DAY` is `GEN_3` by @AsparagusEduardo in [#7499](https://github.com/rh-hideout/pokeemerald-expansion/pull/7499) +* Remove shadow and hide follower on stair warp by @cornixsenex in [#7368](https://github.com/rh-hideout/pokeemerald-expansion/pull/7368) +* Fix Form Change Item Task Data and Clean Up Field Use Funcs by @ravepossum in [#7535](https://github.com/rh-hideout/pokeemerald-expansion/pull/7535) +* Fix Vs Seeker Trainer Battle script issue by @pkmnsnfrn in [#7615](https://github.com/rh-hideout/pokeemerald-expansion/pull/7615) + +## βš”οΈ Battle General βš”οΈ +### Changed +* Remove unused function by @AlexOn1ine in [#7617](https://github.com/rh-hideout/pokeemerald-expansion/pull/7617) + +### Fixed +* Fixes Magnet Rise when user is Rooted/Smacked Down by @PhallenTree in [#7449](https://github.com/rh-hideout/pokeemerald-expansion/pull/7449) +* Fixes Leech Seed recovery not applying behind Sub by @AlexOn1ine in [#7468](https://github.com/rh-hideout/pokeemerald-expansion/pull/7468) +* Fixes Round and Fusion moves doubling power from previous turn's move by @PhallenTree in [#7476](https://github.com/rh-hideout/pokeemerald-expansion/pull/7476) +* Fixes shadows and mon animations for transformed battlers by @AsparagusEduardo in [#7500](https://github.com/rh-hideout/pokeemerald-expansion/pull/7500) +* Fixes Life Orb still activating if move was absorbed by @AlexOn1ine in [#7521](https://github.com/rh-hideout/pokeemerald-expansion/pull/7521) +* Fix Mimicry Only Activating Once per Turn by @ghoulslash in [#7537](https://github.com/rh-hideout/pokeemerald-expansion/pull/7537) +* Fixes Knock Off still activating when there is no Item by @AlexOn1ine in [#7496](https://github.com/rh-hideout/pokeemerald-expansion/pull/7496) +* Fixed `B_PSYWAVE_DMG` by @AsparagusEduardo in [#7557](https://github.com/rh-hideout/pokeemerald-expansion/pull/7557) +* Fixes Counter / Mirror Coat / Metal Burst damage assignment by @AlexOn1ine in [#7538](https://github.com/rh-hideout/pokeemerald-expansion/pull/7538) +* Fix in-game partner battles always causing a whiteout by @ravepossum in [#7587](https://github.com/rh-hideout/pokeemerald-expansion/pull/7587) +* Fix B_ANIMATE_MON_AFTER_KO with a new counter by @hedara90 in [#7531](https://github.com/rh-hideout/pokeemerald-expansion/pull/7531) +* Fixes Rage Fist counter increment by @AlexOn1ine in [#7582](https://github.com/rh-hideout/pokeemerald-expansion/pull/7582) +* Fixes moveend_absorb hitmarker by @AlexOn1ine in [#7591](https://github.com/rh-hideout/pokeemerald-expansion/pull/7591) +* switchinabilities also runs ON_WEATHER and ON_TERRAIN by @ghoulslash in [#7612](https://github.com/rh-hideout/pokeemerald-expansion/pull/7612) +* Fixes Explosion behavior when 3 mons can endure hit by @AlexOn1ine in [#7594](https://github.com/rh-hideout/pokeemerald-expansion/pull/7594) +* Fixes octolock not ending after user switched out by @AlexOn1ine in [#7556](https://github.com/rh-hideout/pokeemerald-expansion/pull/7556) +* The original attacker wasn't restored for Doodle by @AlexOn1ine in [#7620](https://github.com/rh-hideout/pokeemerald-expansion/pull/7620) +* Restore X item friendship increase by @ravepossum in [#7583](https://github.com/rh-hideout/pokeemerald-expansion/pull/7583) +* Fixes Wonder Room interactions with Defense/Special Defense boosting effects by @PhallenTree in [#7626](https://github.com/rh-hideout/pokeemerald-expansion/pull/7626) +* Ally Switch attract battler swapping, test for leech seed by @ghoulslash in [#7634](https://github.com/rh-hideout/pokeemerald-expansion/pull/7634) + +## 🀹 Moves 🀹 +### Fixed +* Clear gScanlineEffect to fix timeout in acid downpour animation by @FosterProgramming in [#7442](https://github.com/rh-hideout/pokeemerald-expansion/pull/7442) +* Fix terastallization anims flickering by @ravepossum in [#7613](https://github.com/rh-hideout/pokeemerald-expansion/pull/7613) + +## 🧢 Items 🧢 +### Changed +* Fix using town map as registered item by @ravepossum in [#7482](https://github.com/rh-hideout/pokeemerald-expansion/pull/7482) + +### Fixed +* Implement using party menu items from field by @ravepossum in [#7481](https://github.com/rh-hideout/pokeemerald-expansion/pull/7481) + +## πŸ€– Battle AI πŸ€– +### Changed +* Macro-for-AI-Flag-definitions by @grintoul1 in [#7471](https://github.com/rh-hideout/pokeemerald-expansion/pull/7471) + +### Fixed +* Incorrect call in Rest by @surskitty in [#7569](https://github.com/rh-hideout/pokeemerald-expansion/pull/7569) +* Fix duplicate switch in after faint by @AlexOn1ine in [#7600](https://github.com/rh-hideout/pokeemerald-expansion/pull/7600) + +## 🧹 Other Cleanup 🧹 +* Macro-for-AI-Flag-definitions by @grintoul1 in [#7471](https://github.com/rh-hideout/pokeemerald-expansion/pull/7471) +* Moved summary screen nature colors to summary_screen.h by @RubyRaven6 in [#7560](https://github.com/rh-hideout/pokeemerald-expansion/pull/7560) +* fix: remove unused wild_encounters.json.txt jinja file by @khbsd in [#7581](https://github.com/rh-hideout/pokeemerald-expansion/pull/7581) +* Fix Form Change Item Task Data and Clean Up Field Use Funcs by @ravepossum in [#7535](https://github.com/rh-hideout/pokeemerald-expansion/pull/7535) +* Fixed Teleport's description not being updated based on `B_TELEPORT_BEHAVIOR` by @AsparagusEduardo in [#7580](https://github.com/rh-hideout/pokeemerald-expansion/pull/7580) +* Fixed typo in test name by @hedara90 in [#7610](https://github.com/rh-hideout/pokeemerald-expansion/pull/7610) +* Minor Clean up in battle_ai_main.c by @AlexOn1ine in [#7551](https://github.com/rh-hideout/pokeemerald-expansion/pull/7551) +* Remove unused function by @AlexOn1ine in [#7617](https://github.com/rh-hideout/pokeemerald-expansion/pull/7617) +* Fix Vs Seeker Trainer Battle script issue by @pkmnsnfrn in [#7615](https://github.com/rh-hideout/pokeemerald-expansion/pull/7615) + +## πŸ§ͺ Test Runner πŸ§ͺ +### Changed +* Clean up some Normalize tests to make them make sense by @hedara90 in [#7461](https://github.com/rh-hideout/pokeemerald-expansion/pull/7461) +* Add Synthesis + Utililty Umbrella test by @ghoulslash in [#7472](https://github.com/rh-hideout/pokeemerald-expansion/pull/7472) +* Add test for BoxPokemon integrity by @hedara90 in [#7487](https://github.com/rh-hideout/pokeemerald-expansion/pull/7487) +* Re-order moves in fling test by @hedara90 in [#7559](https://github.com/rh-hideout/pokeemerald-expansion/pull/7559) +* Wrote some tests by @AsparagusEduardo in [#7563](https://github.com/rh-hideout/pokeemerald-expansion/pull/7563) +* Added Ability TODO tests - Volume C by @AsparagusEduardo in [#7562](https://github.com/rh-hideout/pokeemerald-expansion/pull/7562) +* Added missing Move Effect TODO tests - Volume F by @AsparagusEduardo in [#7605](https://github.com/rh-hideout/pokeemerald-expansion/pull/7605) +* Fixed typo in test name by @hedara90 in [#7610](https://github.com/rh-hideout/pokeemerald-expansion/pull/7610) + +### Fixed +* Clear out parties between battle tests by @hedara90 in [#7460](https://github.com/rh-hideout/pokeemerald-expansion/pull/7460) +* Fixed most failed tests with `GEN_LATEST GEN_8` by @AsparagusEduardo in [#7498](https://github.com/rh-hideout/pokeemerald-expansion/pull/7498) +* Corrected Liquid Ooze test by @AsparagusEduardo in [#7527](https://github.com/rh-hideout/pokeemerald-expansion/pull/7527) +* switchinabilities also runs ON_WEATHER and ON_TERRAIN by @ghoulslash in [#7612](https://github.com/rh-hideout/pokeemerald-expansion/pull/7612) +* Ally Switch attract battler swapping, test for leech seed by @ghoulslash in [#7634](https://github.com/rh-hideout/pokeemerald-expansion/pull/7634) + +## πŸ“š Documentation πŸ“š +* Update how_to_new_pokemon.md by @kevinwklawrence in [#7440](https://github.com/rh-hideout/pokeemerald-expansion/pull/7440) +* Updating a link to porytiles in INSTALL.md by @ThePeeps191 in [#7490](https://github.com/rh-hideout/pokeemerald-expansion/pull/7490) +* Added comment in event.inc for simple menus in dynmultichoice by @RubyRaven6 in [#7568](https://github.com/rh-hideout/pokeemerald-expansion/pull/7568) + +## New Contributors +* @kevinwklawrence made their first contribution in [#7440](https://github.com/rh-hideout/pokeemerald-expansion/pull/7440) +* @ThePeeps191 made their first contribution in [#7490](https://github.com/rh-hideout/pokeemerald-expansion/pull/7490) +* @cornixsenex made their first contribution in [#7368](https://github.com/rh-hideout/pokeemerald-expansion/pull/7368) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.12.2...expansion/1.12.3 + + + + diff --git a/docs/changelogs/1.13.x/1.13.0.md b/docs/changelogs/1.13.x/1.13.0.md new file mode 100644 index 000000000000..52babd0b43a5 --- /dev/null +++ b/docs/changelogs/1.13.x/1.13.0.md @@ -0,0 +1,483 @@ +```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.13.0 +`. +``` + +## πŸŒ‹ *REFACTORS* πŸŒ‹ +πŸ“œ = Uses a migration script. +* Refactor field moves by @cawtds in [#6660](https://github.com/rh-hideout/pokeemerald-expansion/pull/6660) +* Refactors Final Gambit + Tests by @AlexOn1ine in [#7005](https://github.com/rh-hideout/pokeemerald-expansion/pull/7005) +* Combines Super Fang and Guardian of Alola effects by @AlexOn1ine in [#7048](https://github.com/rh-hideout/pokeemerald-expansion/pull/7048) +* Refactor damage calculations aruguments by using a struct context by @AlexOn1ine in [#7108](https://github.com/rh-hideout/pokeemerald-expansion/pull/7108) +* Add damage context to effectiveness multiplier by @AlexOn1ine in [#7111](https://github.com/rh-hideout/pokeemerald-expansion/pull/7111) +* Decouple Status set by ability from SetMoveEffect by @AlexOn1ine in [#7125](https://github.com/rh-hideout/pokeemerald-expansion/pull/7125) +* Converted Relic Song into a proper form change by @AsparagusEduardo in [#7139](https://github.com/rh-hideout/pokeemerald-expansion/pull/7139) + - Added `FORM_CHANGE_BATTLE_AFTER_MOVE` to parametrize Relic Song's form change +* Removed Mind Blown effect in favor of move flag by @AsparagusEduardo in [#7138](https://github.com/rh-hideout/pokeemerald-expansion/pull/7138) +* Volatile status refactoring by @cfmnephrite in [#6983](https://github.com/rh-hideout/pokeemerald-expansion/pull/6983) +* Bag refactor (groundwork for expansion) by @cfmnephrite in [#7018](https://github.com/rh-hideout/pokeemerald-expansion/pull/7018) + - If you're using @ghoulslash's bag sort branch, this PR will break it +* Stat Change (Animation) Refactor by @PhallenTree in [#7144](https://github.com/rh-hideout/pokeemerald-expansion/pull/7144) + `setgraphicalstatchangevalues` and `playstatchangeanimation` have been removed and now Stat Change Animations are handled in `statbuffchange`. + - To update your custom battle scripts: + `setgraphicalstatchangevalues` is often accompanied by `playanimation X, B_ANIM_STATS_CHANGE`. When I refer to deleting `setgraphicalstatchangevalues` below, that command should also be deleted. + 1. If `statbuffchange` is before `setgraphicalstatchangevalues`/`playstatchangeanimation` and there is something in between them (for example, `attackanimation` and `waitanimation`), add the flag `STAT_CHANGE_ONLY_CHECKING` and replace the command (`setgraphicalstatchangevalues`/`playstatchangeanimation`) with a copy of the original `statbuffchange`. + 2. If `statbuffchange` is after `setgraphicalstatchangevalues`/`playstatchangeanimation` or there is nothing in between, you should delete those commands (`setgraphicalstatchangevalues`/`playstatchangeanimation`) and no further changes other than those in _3._ should be required. + 3. If `playstatchangeanimation` had bits assigned to them (`BIT_ATK | BIT_SPATK`, for example), add ", " followed by those bits to the first `statbuffchange`; for the following `statbuffchange`s, remove stats that have already been increased/decreased. +* Untangle `InitBtlControllers` functions by @AsparagusEduardo in [#6748](https://github.com/rh-hideout/pokeemerald-expansion/pull/6748) +* Use battler arguments for SetMoveEffect by @AlexOn1ine in [#7156](https://github.com/rh-hideout/pokeemerald-expansion/pull/7156) +* Easier expandability of debug menu by @AsparagusEduardo in [#6910](https://github.com/rh-hideout/pokeemerald-expansion/pull/6910) +* Use dedicated functions for Mud/Water Sport by @AlexOn1ine in [#7248](https://github.com/rh-hideout/pokeemerald-expansion/pull/7248) +* Expanding and Refactoring Skill Swap and other ability-changing moves by @surskitty in [#7238](https://github.com/rh-hideout/pokeemerald-expansion/pull/7238) +* Refactor move Synchronise by @AlexOn1ine in [#7271](https://github.com/rh-hideout/pokeemerald-expansion/pull/7271) +* Adds hazard queue by @AlexOn1ine in [#7295](https://github.com/rh-hideout/pokeemerald-expansion/pull/7295) +* Changes AccuracyCalcHelper into CanMoveSkipAccuracyCalc by @AlexOn1ine in [#7303](https://github.com/rh-hideout/pokeemerald-expansion/pull/7303) +* battle_interface: overhaul ability pop up by @mudskipper13 in [#7227](https://github.com/rh-hideout/pokeemerald-expansion/pull/7227) + - The layout of the ability pop up's image (`graphics/battle_interface/ability_pop_up.png`) has been changed. +* Bag refactor 2 by @cfmnephrite in [#7166](https://github.com/rh-hideout/pokeemerald-expansion/pull/7166) +* Replaces STATUS2 usage with volatiles in code by @cfmnephrite in [#7262](https://github.com/rh-hideout/pokeemerald-expansion/pull/7262) + - Replaced all references to STATUS2 in the code with volatiles (but left the old bitfield behind for compatibility with downstream users). The list of volatiles is in `include/constants/battle.h` and includes information such as an enum, a field name, type and max size, and whether or not the move is Baton Passable. Users can use VOLATILE_X with any function that previously took STATUS2_X in scripts, and can check/set volatiles in C with `gBattleMons[battler].volatiles.{field name}` syntax instead of checking a flag in a bitfield. +* Refactor battle environment by @fdeblasio in [#4891](https://github.com/rh-hideout/pokeemerald-expansion/pull/4891) +* Convert various to callnatives by @AlexOn1ine in [#7355](https://github.com/rh-hideout/pokeemerald-expansion/pull/7355) +* AI refactor for weather-setting, terrain-setting, Trick Room behaviors; doubles-focused by @surskitty in [#7319](https://github.com/rh-hideout/pokeemerald-expansion/pull/7319) + - AI is more likely to use Trick Room in double battles and Terrains in general. +* Convert Status4 to volatiles by @AlexOn1ine in [#7411](https://github.com/rh-hideout/pokeemerald-expansion/pull/7411) +* Split Sheer Force tests by gen instead of by four by @AlexOn1ine in [#7260](https://github.com/rh-hideout/pokeemerald-expansion/pull/7260) +* Modify move prediction to work in doubles by @AlexOn1ine in [#7087](https://github.com/rh-hideout/pokeemerald-expansion/pull/7087) +* Convert statuses3 to volatiles by @AlexOn1ine in [#7514](https://github.com/rh-hideout/pokeemerald-expansion/pull/7514) +* Added trainerBackPic to Trainer struct to de-couple trainer pic and trainer back pic defines by @grintoul1 in [#7425](https://github.com/rh-hideout/pokeemerald-expansion/pull/7425) + +## 🧬 General 🧬 +### Added +* New sprite compressor by @hedara90, @DizzyEggg Improved performance massively for the instruction decoding., @mrgriffin, SBird and @tertu-m who has done even more optimization and answered questions about the GBA hardware whenever I had them. and @rayrobdod for the better migration script. in [#5627](https://github.com/rh-hideout/pokeemerald-expansion/pull/5627) + - `LZDecompressVram` and `LZDecompressWram` has been deprecated. All calls do decompress LZ compressed data should be using the wrapper functions `DecompressDataWithHeaderVram` or `DecompressDataWithHeaderWram`. + - A new sprite compression format has been introduced. To use it, replace files with `.4bpp.lz` with `.4bpp.smol` or `.4bpp.fastSmol`. + - `.smol` is a compression format utilizing entropy encoding in the form of tabled Asymmetric Numeral Systems (tANS) and a modified LZ style RLE/Dictionary encoding scheme specialized for the sprites used in Pokemon games. This is approximately 25% smaller than the default LZ77 compression. + - `.fastSmol` skips the entropy encoding and is therefore slightly larger than the default LZ77 compression, but decoding sprites is faster than the default LZ77 compression. + - `.smolTM` is a compression scheme for tilemaps. + - Might have unexpected behavior if user introduced decompression during hardware interrupts. + - Has a migration script that handles all files under `src/`, `migration_scripts/1.12/convert_compressed_files.py`. +* Adds FRLG asserts to Alloc/Free by @cawtds in [#7025](https://github.com/rh-hideout/pokeemerald-expansion/pull/7025) +* Debug parties and battles by @SBird1337 in [#6884](https://github.com/rh-hideout/pokeemerald-expansion/pull/6884) + - Adds options to set debug parties and battles using the debug menu +* Added naive line break by @hedara90 in [#7076](https://github.com/rh-hideout/pokeemerald-expansion/pull/7076) +* Disable unowned evo methods by @Bolt-Strike in [#7103](https://github.com/rh-hideout/pokeemerald-expansion/pull/7103) +* lto support by @DizzyEggg in [#7182](https://github.com/rh-hideout/pokeemerald-expansion/pull/7182) +* Improve trainer back pic-related data and code (+ smol documentation) by @mudskipper13 in [#6821](https://github.com/rh-hideout/pokeemerald-expansion/pull/6821) +* Add Set Hidden Nature option to the debug menu by @AlexOn1ine in [#7281](https://github.com/rh-hideout/pokeemerald-expansion/pull/7281) +* Instant Win option in Battle Debug by @AlexOn1ine in [#7333](https://github.com/rh-hideout/pokeemerald-expansion/pull/7333) +* `trainerproc` copy other trainer party by @hedara90 in [#7251](https://github.com/rh-hideout/pokeemerald-expansion/pull/7251) + - Adds the `Copy Pool` command to `trainerproc` which copies the party/pool from another trainer. +* Show chosen move in the battle debug menu by @AlexOn1ine in [#7382](https://github.com/rh-hideout/pokeemerald-expansion/pull/7382) +* Rock climb by ghoulslash by @pokesidv in [#7432](https://github.com/rh-hideout/pokeemerald-expansion/pull/7432) + - Added rock climb field effect + +### Changed +* Restore git history check by @ravepossum in [#7463](https://github.com/rh-hideout/pokeemerald-expansion/pull/7463) +* Moved summary screen nature colors to summary_screen.h by @RubyRaven6 in [#7560](https://github.com/rh-hideout/pokeemerald-expansion/pull/7560) +* Added comment in event.inc for simple menus in dynmultichoice by @RubyRaven6 in [#7568](https://github.com/rh-hideout/pokeemerald-expansion/pull/7568) +* Changed default print level for DebugPrintf for mGBA to MGBA_LOG_WARN by @hedara90 in [#7567](https://github.com/rh-hideout/pokeemerald-expansion/pull/7567) +* Fixed Teleport's description not being updated based on `B_TELEPORT_BEHAVIOR` by @AsparagusEduardo in [#7580](https://github.com/rh-hideout/pokeemerald-expansion/pull/7580) +* Minor Clean up in battle_ai_main.c by @AlexOn1ine in [#7551](https://github.com/rh-hideout/pokeemerald-expansion/pull/7551) +* Refactor field moves by @cawtds in [#6660](https://github.com/rh-hideout/pokeemerald-expansion/pull/6660) +* Replace all usages of lz compression with smol by @hedara90 in [#7032](https://github.com/rh-hideout/pokeemerald-expansion/pull/7032) +* `BtlController_EmitTwoReturnValues` cleanup by @AsparagusEduardo in [#6855](https://github.com/rh-hideout/pokeemerald-expansion/pull/6855) +* Put the gen 1 compression tests behind a config by @hedara90 in [#7033](https://github.com/rh-hideout/pokeemerald-expansion/pull/7033) +* Converts a bunch of defines to enums by @Bassoonian in [#7041](https://github.com/rh-hideout/pokeemerald-expansion/pull/7041) +* chore: remove unused section from credits by @Emiliasky in [#7085](https://github.com/rh-hideout/pokeemerald-expansion/pull/7085) +* Simplify white out messages by @kittenchilly in [#6961](https://github.com/rh-hideout/pokeemerald-expansion/pull/6961) +* Improve music/se macros and fix names by @cawtds in [#7030](https://github.com/rh-hideout/pokeemerald-expansion/pull/7030) +* Bag refactor (groundwork for expansion) by @cfmnephrite in [#7018](https://github.com/rh-hideout/pokeemerald-expansion/pull/7018) + - If you're using @ghoulslash's bag sort branch, this PR will break it +* Converts more defines to enums and name unnamed enums by @Bassoonian in [#7071](https://github.com/rh-hideout/pokeemerald-expansion/pull/7071) +* Add config options for removing bard phoneme audio to save ROM space by @poetahto in [#7155](https://github.com/rh-hideout/pokeemerald-expansion/pull/7155) +* Fix debug text order by @hedara90 in [#7149](https://github.com/rh-hideout/pokeemerald-expansion/pull/7149) +* More battle controller function consolidation. by @AsparagusEduardo in [#6877](https://github.com/rh-hideout/pokeemerald-expansion/pull/6877) +* Easier expandability of debug menu by @AsparagusEduardo in [#6910](https://github.com/rh-hideout/pokeemerald-expansion/pull/6910) +* Update .gitignore to add heal locations by @Bassoonian in [#7050](https://github.com/rh-hideout/pokeemerald-expansion/pull/7050) +* Add 'Give Decoration' function to overworld debug menu by @rayrobdod in [#7219](https://github.com/rh-hideout/pokeemerald-expansion/pull/7219) +* Changes pre-proc to a normal if for Item Desc Header by @AlexOn1ine in [#7231](https://github.com/rh-hideout/pokeemerald-expansion/pull/7231) +* Use compound strings in battle debug menu by @AsparagusEduardo in [#7282](https://github.com/rh-hideout/pokeemerald-expansion/pull/7282) +* Remove competitive syntax config by @hedara90 in [#7154](https://github.com/rh-hideout/pokeemerald-expansion/pull/7154) + - This change can be reverted by doing `git revert 14dbbf63d454073dbb198b941cc3566168c89f11`. +* Turn `OW_FRLG_WHITEOUT` into `OW_WHITEOUT_CUTSCENE` and make it generational by @kittenchilly in [#6962](https://github.com/rh-hideout/pokeemerald-expansion/pull/6962) +* Add `Macro` key to trainerproc by @hedara90 in [#7157](https://github.com/rh-hideout/pokeemerald-expansion/pull/7157) +* preproc: Support __attribute__ in enums by @mrgriffin in [#7344](https://github.com/rh-hideout/pokeemerald-expansion/pull/7344) +* Enum conversion for `enum MoveEffects` and `enum BattleMoveEffects` by @hedara90 in [#7366](https://github.com/rh-hideout/pokeemerald-expansion/pull/7366) + - This enables `-Wenum-conversion`, additional compilation errors can occur +* Get/SetMonData optimisation by @cfmnephrite in [#7313](https://github.com/rh-hideout/pokeemerald-expansion/pull/7313) +* Bag refactor3 + Ghoulslash's sorting feature port by @cfmnephrite in [#7330](https://github.com/rh-hideout/pokeemerald-expansion/pull/7330) +* Replace all usages of rl compression with smol by @rayrobdod in [#7458](https://github.com/rh-hideout/pokeemerald-expansion/pull/7458) +* Bag sorting cleanup by @mrgriffin in [#7489](https://github.com/rh-hideout/pokeemerald-expansion/pull/7489) +* Adds ghouls Rock Climb git history by @AlexOn1ine in [#7493](https://github.com/rh-hideout/pokeemerald-expansion/pull/7493) +* Changed item name/pluralName to a compound string by @cfmnephrite in [#7359](https://github.com/rh-hideout/pokeemerald-expansion/pull/7359) +* Added trainerBackPic to Trainer struct to de-couple trainer pic and trainer back pic defines by @grintoul1 in [#7425](https://github.com/rh-hideout/pokeemerald-expansion/pull/7425) +* Suppress trainerproc compile warning for unused func by @AlexOn1ine in [#7592](https://github.com/rh-hideout/pokeemerald-expansion/pull/7592) + +### Fixed +* Fix .smol compression in debug builds by @hedara90 in [#7090](https://github.com/rh-hideout/pokeemerald-expansion/pull/7090) +* Improve smol compressor by @hedara90 in [#7073](https://github.com/rh-hideout/pokeemerald-expansion/pull/7073) +* Increased heap by 768 bytes by @hedara90 in [#7097](https://github.com/rh-hideout/pokeemerald-expansion/pull/7097) +* Fix healthbox when blending effects happen by @AsparagusEduardo in [#7203](https://github.com/rh-hideout/pokeemerald-expansion/pull/7203) +* Fixed Fake RTC debug menu by @AsparagusEduardo in [#7218](https://github.com/rh-hideout/pokeemerald-expansion/pull/7218) +* Added missing braces by @cfmnephrite in [#7288](https://github.com/rh-hideout/pokeemerald-expansion/pull/7288) +* Fixed Flag Vars menu keeping artifacts from bag menu + cleanup by @AsparagusEduardo in [#7226](https://github.com/rh-hideout/pokeemerald-expansion/pull/7226) +* Fix HGSS dex running out of heap by @hedara90 in [#7317](https://github.com/rh-hideout/pokeemerald-expansion/pull/7317) +* battle intro: fix issues with follower slide-in and wild shiny mon by @mudskipper13 in [#7325](https://github.com/rh-hideout/pokeemerald-expansion/pull/7325) +* Fix sorting bag by type by @mrgriffin in [#7488](https://github.com/rh-hideout/pokeemerald-expansion/pull/7488) +* Hacky support for enums in C asm statements by @mrgriffin in [#7494](https://github.com/rh-hideout/pokeemerald-expansion/pull/7494) +* Fixed compile issue in gcc 11 by @AsparagusEduardo in [#7579](https://github.com/rh-hideout/pokeemerald-expansion/pull/7579) +* Fix overlap between spin evolution and script evolution by @FosterProgramming in [#7593](https://github.com/rh-hideout/pokeemerald-expansion/pull/7593) + +## πŸ—ΊοΈ Overworld πŸ—ΊοΈ +### Added +* Added createfollowernpc macro to make a new follower from a gfx id by @Bivurnum in [#7196](https://github.com/rh-hideout/pokeemerald-expansion/pull/7196) + - Follower NPCs can now be created without using an existing NPC, using the `createfollowernpc` macro. +* feat: separate water and rock smash encounter rate checks by @khbsd in [#7293](https://github.com/rh-hideout/pokeemerald-expansion/pull/7293) + +### Changed +* fix: remove unused wild_encounters.json.txt jinja file by @khbsd in [#7581](https://github.com/rh-hideout/pokeemerald-expansion/pull/7581) +* added Ash Greninja overworld sprites by @wiz1989 in [#6976](https://github.com/rh-hideout/pokeemerald-expansion/pull/6976) +* Update FRLG whiteouts to new pret system by @Bassoonian in [#7040](https://github.com/rh-hideout/pokeemerald-expansion/pull/7040) + - Make sure to migrate your changes to the now deleted `heal_locations_pkm_center.h` to the json file. +* Use CanAbilityAbsorbMove in GetOverworldTypeEffectiveness by @AlexOn1ine in [#7115](https://github.com/rh-hideout/pokeemerald-expansion/pull/7115) +* Add config options for removing bard phoneme audio to save ROM space by @poetahto in [#7155](https://github.com/rh-hideout/pokeemerald-expansion/pull/7155) +* Add debug options for follower NPCs by @Bivurnum in [#7215](https://github.com/rh-hideout/pokeemerald-expansion/pull/7215) +* Better system for Follower NPC running frames by @Bivurnum in [#7222](https://github.com/rh-hideout/pokeemerald-expansion/pull/7222) +* Update follower NPC tutorial doc for createfollowernpc macro by @Bivurnum in [#7230](https://github.com/rh-hideout/pokeemerald-expansion/pull/7230) + +### Fixed +* Bug fix: add handling for forced movements into/after ledge jumps with follower NPCs by @Bivurnum in [#7055](https://github.com/rh-hideout/pokeemerald-expansion/pull/7055) +* Fixed compile issue `OW_TIMES_OF_DAY` is `GEN_3` by @AsparagusEduardo in [#7499](https://github.com/rh-hideout/pokeemerald-expansion/pull/7499) +* Remove shadow and hide follower on stair warp by @cornixsenex in [#7368](https://github.com/rh-hideout/pokeemerald-expansion/pull/7368) +* Fix Form Change Item Task Data and Clean Up Field Use Funcs by @ravepossum in [#7535](https://github.com/rh-hideout/pokeemerald-expansion/pull/7535) +* Fix Vs Seeker Trainer Battle script issue by @pkmnsnfrn in [#7615](https://github.com/rh-hideout/pokeemerald-expansion/pull/7615) +* Fix follower compression by @hedara90 in [#7038](https://github.com/rh-hideout/pokeemerald-expansion/pull/7038) +* Changing P_ONLY_OBTAINABLE_SHINIES to truly be Only Obtainable Shinies by @surskitty in [#7275](https://github.com/rh-hideout/pokeemerald-expansion/pull/7275) + +## πŸ‰ PokΓ©mon πŸ‰ +### Added +* Add P_ASK_MOVE_CONFIRMATION by @pkmnsnfrn in [#7132](https://github.com/rh-hideout/pokeemerald-expansion/pull/7132) + - This will change the behavior of the game for players, as a new default is being set. +* Added `CRY_MODE_DYNAMAX` by @AsparagusEduardo in [#6933](https://github.com/rh-hideout/pokeemerald-expansion/pull/6933) +* Wild PokΓ©mon animate after breaking out of PokΓ© Ball by @LinathanZel in [#7339](https://github.com/rh-hideout/pokeemerald-expansion/pull/7339) + +### Changed +* Add dedicated getter functions for PokΓ©mon types and abilities by @Bassoonian in [#7043](https://github.com/rh-hideout/pokeemerald-expansion/pull/7043) +* added Ash Greninja overworld sprites by @wiz1989 in [#6976](https://github.com/rh-hideout/pokeemerald-expansion/pull/6976) +* Get/SetMonData optimisation by @cfmnephrite in [#7313](https://github.com/rh-hideout/pokeemerald-expansion/pull/7313) + +### Fixed +* fixes #7129: 'add to full party' feature in the safari zone by @fakuzatsu in [#7147](https://github.com/rh-hideout/pokeemerald-expansion/pull/7147) +* Fix substruct offsets from #7313 by @mrgriffin in [#7431](https://github.com/rh-hideout/pokeemerald-expansion/pull/7431) +* Fixes refusing to replace a move on evolution causing a softlock by @PhallenTree in [#7585](https://github.com/rh-hideout/pokeemerald-expansion/pull/7585) + +## βš”οΈ Battle General βš”οΈ +### Added +* Add Gen 2 Moonlight, Morning Sun, Synthesis configuration by @i0brendan0 in [#7209](https://github.com/rh-hideout/pokeemerald-expansion/pull/7209) +* Add a heal animation to Hospitality recovery by @AlexOn1ine in [#7426](https://github.com/rh-hideout/pokeemerald-expansion/pull/7426) +* Updated Dream Eater/Liquid Ooze's interaction to Gen 5 standards by @AsparagusEduardo in [#7528](https://github.com/rh-hideout/pokeemerald-expansion/pull/7528) + +### Changed +* Remove unused function by @AlexOn1ine in [#7617](https://github.com/rh-hideout/pokeemerald-expansion/pull/7617) +* Clean up battlescript calls with func BattleScriptCall by @AlexOn1ine in [#6873](https://github.com/rh-hideout/pokeemerald-expansion/pull/6873) +* Refactors Final Gambit + Tests by @AlexOn1ine in [#7005](https://github.com/rh-hideout/pokeemerald-expansion/pull/7005) +* `GetBattlerMon` cleanup by @AsparagusEduardo in [#6967](https://github.com/rh-hideout/pokeemerald-expansion/pull/6967) +* Change GetZMaxMoveAgainstProtectionModifier to prevent regressions by @AlexOn1ine in [#7047](https://github.com/rh-hideout/pokeemerald-expansion/pull/7047) +* Combines Super Fang and Guardian of Alola effects by @AlexOn1ine in [#7048](https://github.com/rh-hideout/pokeemerald-expansion/pull/7048) +* Remove more instances of hard-coded Move IDs by @AsparagusEduardo in [#7056](https://github.com/rh-hideout/pokeemerald-expansion/pull/7056) + - Added `EFFECT_SHEER_COLD` to parametrize Sheer Cold's interactions with Ice types +* Deprecate sStatusFlagsForMoveEffects by @AlexOn1ine in [#7063](https://github.com/rh-hideout/pokeemerald-expansion/pull/7063) +* Removes duplicate AI ability func by @AlexOn1ine in [#7045](https://github.com/rh-hideout/pokeemerald-expansion/pull/7045) +* Deprecate absent member from battlerState by @AlexOn1ine in [#7091](https://github.com/rh-hideout/pokeemerald-expansion/pull/7091) +* Refactor damage calculations aruguments by using a struct context by @AlexOn1ine in [#7108](https://github.com/rh-hideout/pokeemerald-expansion/pull/7108) +* Add damage context to effectiveness multiplier by @AlexOn1ine in [#7111](https://github.com/rh-hideout/pokeemerald-expansion/pull/7111) +* Decouple Status set by ability from SetMoveEffect by @AlexOn1ine in [#7125](https://github.com/rh-hideout/pokeemerald-expansion/pull/7125) +* Removed redundant Damp check by @AsparagusEduardo in [#7134](https://github.com/rh-hideout/pokeemerald-expansion/pull/7134) +* Converted Relic Song into a proper form change by @AsparagusEduardo in [#7139](https://github.com/rh-hideout/pokeemerald-expansion/pull/7139) + - Added `FORM_CHANGE_BATTLE_AFTER_MOVE` to parametrize Relic Song's form change +* Removed Mind Blown effect in favor of move flag by @AsparagusEduardo in [#7138](https://github.com/rh-hideout/pokeemerald-expansion/pull/7138) +* Volatile status refactoring by @cfmnephrite in [#6983](https://github.com/rh-hideout/pokeemerald-expansion/pull/6983) +* Repurposes IsMagicGuardProtected into a general function by @AlexOn1ine in [#7114](https://github.com/rh-hideout/pokeemerald-expansion/pull/7114) +* Stat Change (Animation) Refactor by @PhallenTree in [#7144](https://github.com/rh-hideout/pokeemerald-expansion/pull/7144) + -`setgraphicalstatchangevalues` and `playstatchangeanimation` have been removed and now Stat Change Animations are handled in `statbuffchange`. + - To update your custom battle scripts: + `setgraphicalstatchangevalues` is often accompanied by `playanimation X, B_ANIM_STATS_CHANGE`. When I refer to deleting `setgraphicalstatchangevalues` below, that command should also be deleted. + 1. If `statbuffchange` is before `setgraphicalstatchangevalues`/`playstatchangeanimation` and there is something in between them (for example, `attackanimation` and `waitanimation`), add the flag `STAT_CHANGE_ONLY_CHECKING` and replace the command (`setgraphicalstatchangevalues`/`playstatchangeanimation`) with a copy of the original `statbuffchange`. + 2. If `statbuffchange` is after `setgraphicalstatchangevalues`/`playstatchangeanimation` or there is nothing in between, you should delete those commands (`setgraphicalstatchangevalues`/`playstatchangeanimation`) and no further changes other than those in _3._ should be required. + 3. If `playstatchangeanimation` had bits assigned to them (`BIT_ATK | BIT_SPATK`, for example), add ", " followed by those bits to the first `statbuffchange`; for the following `statbuffchange`s, remove stats that have already been increased/decreased. +* Use `argument.type` for `EFFECT_SOAK` by @AsparagusEduardo in [#7141](https://github.com/rh-hideout/pokeemerald-expansion/pull/7141) +* Untangle `InitBtlControllers` functions by @AsparagusEduardo in [#6748](https://github.com/rh-hideout/pokeemerald-expansion/pull/6748) +* Increase party action limit by @cawtds in [#7119](https://github.com/rh-hideout/pokeemerald-expansion/pull/7119) +* Adds Gen5+ Encore config by @AlexOn1ine in [#7051](https://github.com/rh-hideout/pokeemerald-expansion/pull/7051) +* Attackcanceller clean up by @AlexOn1ine in [#7210](https://github.com/rh-hideout/pokeemerald-expansion/pull/7210) +* Remove redundant move result flag checks by @AlexOn1ine in [#7223](https://github.com/rh-hideout/pokeemerald-expansion/pull/7223) +* Use dedicated functions for Mud/Water Sport by @AlexOn1ine in [#7248](https://github.com/rh-hideout/pokeemerald-expansion/pull/7248) +* Script clean up for Flame Burst and Costar by @AlexOn1ine in [#7264](https://github.com/rh-hideout/pokeemerald-expansion/pull/7264) +* Renaming STATUS1_REFRESH and adding more constants for common STATUS1 checks. by @surskitty in [#7284](https://github.com/rh-hideout/pokeemerald-expansion/pull/7284) +* Refactor move Synchronise by @AlexOn1ine in [#7271](https://github.com/rh-hideout/pokeemerald-expansion/pull/7271) +* Adds hazard queue by @AlexOn1ine in [#7295](https://github.com/rh-hideout/pokeemerald-expansion/pull/7295) +* Removed all instances of .chance = 100, SHEER_FORCE_NO_BOOST by @cfmnephrite in [#7300](https://github.com/rh-hideout/pokeemerald-expansion/pull/7300) +* Changes AccuracyCalcHelper into CanMoveSkipAccuracyCalc by @AlexOn1ine in [#7303](https://github.com/rh-hideout/pokeemerald-expansion/pull/7303) +* Replaces STATUS2 usage with volatiles in code by @cfmnephrite in [#7262](https://github.com/rh-hideout/pokeemerald-expansion/pull/7262) + - Replaced all references to STATUS2 in the code with volatiles (but left the old bitfield behind for compatibility with downstream users). The list of volatiles is in `include/constants/battle.h` and includes information such as an enum, a field name, type and max size, and whether or not the move is Baton Passable. Users can use VOLATILE_X with any function that previously took STATUS2_X in scripts, and can check/set volatiles in C with `gBattleMons[battler].volatiles.{field name}` syntax instead of checking a flag in a bitfield. +* Refactor battle environment by @fdeblasio in [#4891](https://github.com/rh-hideout/pokeemerald-expansion/pull/4891) +* Convert various to callnatives by @AlexOn1ine in [#7355](https://github.com/rh-hideout/pokeemerald-expansion/pull/7355) +* Remove leftover code by @AlexOn1ine in [#7397](https://github.com/rh-hideout/pokeemerald-expansion/pull/7397) +* Moved some fields to BattlerState/PartyState by @AsparagusEduardo in [#7409](https://github.com/rh-hideout/pokeemerald-expansion/pull/7409) +* Additional effects tweak by @cfmnephrite in [#7392](https://github.com/rh-hideout/pokeemerald-expansion/pull/7392) +* Clean up noResultString by @AlexOn1ine in [#7408](https://github.com/rh-hideout/pokeemerald-expansion/pull/7408) +* Convert Status4 to volatiles by @AlexOn1ine in [#7411](https://github.com/rh-hideout/pokeemerald-expansion/pull/7411) +* Convert statuses3 to volatiles by @AlexOn1ine in [#7514](https://github.com/rh-hideout/pokeemerald-expansion/pull/7514) +* Prevents a regression for custom abilties by @AlexOn1ine in [#7616](https://github.com/rh-hideout/pokeemerald-expansion/pull/7616) + +### Fixed +* Fixes Magnet Rise when user is Rooted/Smacked Down by @PhallenTree in [#7449](https://github.com/rh-hideout/pokeemerald-expansion/pull/7449) +* Fixes Leech Seed recovery not applying behind Sub by @AlexOn1ine in [#7468](https://github.com/rh-hideout/pokeemerald-expansion/pull/7468) +* Fixes Round and Fusion moves doubling power from previous turn's move by @PhallenTree in [#7476](https://github.com/rh-hideout/pokeemerald-expansion/pull/7476) +* Fixes shadows and mon animations for transformed battlers by @AsparagusEduardo in [#7500](https://github.com/rh-hideout/pokeemerald-expansion/pull/7500) +* Fixes Life Orb still activating if move was absorbed by @AlexOn1ine in [#7521](https://github.com/rh-hideout/pokeemerald-expansion/pull/7521) +* Fix Mimicry Only Activating Once per Turn by @ghoulslash in [#7537](https://github.com/rh-hideout/pokeemerald-expansion/pull/7537) +* Fixes Knock Off still activating when there is no Item by @AlexOn1ine in [#7496](https://github.com/rh-hideout/pokeemerald-expansion/pull/7496) +* Fixed `B_PSYWAVE_DMG` by @AsparagusEduardo in [#7557](https://github.com/rh-hideout/pokeemerald-expansion/pull/7557) +* Fixes Counter / Mirror Coat / Metal Burst damage assignment by @AlexOn1ine in [#7538](https://github.com/rh-hideout/pokeemerald-expansion/pull/7538) +* Fix in-game partner battles always causing a whiteout by @ravepossum in [#7587](https://github.com/rh-hideout/pokeemerald-expansion/pull/7587) +* Fix B_ANIMATE_MON_AFTER_KO with a new counter by @hedara90 in [#7531](https://github.com/rh-hideout/pokeemerald-expansion/pull/7531) +* Fixes Rage Fist counter increment by @AlexOn1ine in [#7582](https://github.com/rh-hideout/pokeemerald-expansion/pull/7582) +* Fixes moveend_absorb hitmarker by @AlexOn1ine in [#7591](https://github.com/rh-hideout/pokeemerald-expansion/pull/7591) +* switchinabilities also runs ON_WEATHER and ON_TERRAIN by @ghoulslash in [#7612](https://github.com/rh-hideout/pokeemerald-expansion/pull/7612) +* Fixes Explosion behavior when 3 mons can endure hit by @AlexOn1ine in [#7594](https://github.com/rh-hideout/pokeemerald-expansion/pull/7594) +* Fixes octolock not ending after user switched out by @AlexOn1ine in [#7556](https://github.com/rh-hideout/pokeemerald-expansion/pull/7556) +* The original attacker wasn't restored for Doodle by @AlexOn1ine in [#7620](https://github.com/rh-hideout/pokeemerald-expansion/pull/7620) +* Restore X item friendship increase by @ravepossum in [#7583](https://github.com/rh-hideout/pokeemerald-expansion/pull/7583) +* Fixes Wonder Room interactions with Defense/Special Defense boosting effects by @PhallenTree in [#7626](https://github.com/rh-hideout/pokeemerald-expansion/pull/7626) +* Ally Switch attract battler swapping, test for leech seed by @ghoulslash in [#7634](https://github.com/rh-hideout/pokeemerald-expansion/pull/7634) +* Fixes Defiant/Competitive not resetting stat change animations and stat change related cleanup by @PhallenTree in [#7004](https://github.com/rh-hideout/pokeemerald-expansion/pull/7004) +* Use battler arguments for SetMoveEffect by @AlexOn1ine in [#7156](https://github.com/rh-hideout/pokeemerald-expansion/pull/7156) +* Fixes Booster Energy timing activation + Clean up by @AlexOn1ine in [#7175](https://github.com/rh-hideout/pokeemerald-expansion/pull/7175) +* Fixes Eject Pack not resolving correctly during switch in effects by @AlexOn1ine in [#7002](https://github.com/rh-hideout/pokeemerald-expansion/pull/7002) +* Adds Ability Shield activation message by @PhallenTree in [#7224](https://github.com/rh-hideout/pokeemerald-expansion/pull/7224) +* Fix incorrect type input by @hedara90 in [#7228](https://github.com/rh-hideout/pokeemerald-expansion/pull/7228) +* Set correct Instruction by @AlexOn1ine in [#7236](https://github.com/rh-hideout/pokeemerald-expansion/pull/7236) +* Fixes Life Dew playing anim when it is not supposed to + tests by @AlexOn1ine in [#7239](https://github.com/rh-hideout/pokeemerald-expansion/pull/7239) +* Fixes instances of battler mutation for abilities by @AlexOn1ine in [#7250](https://github.com/rh-hideout/pokeemerald-expansion/pull/7250) +* Fix Psych Up message and cleanup and don't allow switching to self in tests by @PhallenTree in [#7277](https://github.com/rh-hideout/pokeemerald-expansion/pull/7277) +* Fix incorrect status in beneficial ability Guts check by @grintoul1 in [#7285](https://github.com/rh-hideout/pokeemerald-expansion/pull/7285) +* battle_interface: overhaul ability pop up by @mudskipper13 in [#7227](https://github.com/rh-hideout/pokeemerald-expansion/pull/7227) + - The layout of the ability pop up's image (`graphics/battle_interface/ability_pop_up.png`) has been changed. +* Fixes Status overwrites and Effect Spore wrong func args by @AlexOn1ine in [#7340](https://github.com/rh-hideout/pokeemerald-expansion/pull/7340) +* Fixes various Choice lock issues by @AlexOn1ine in [#7383](https://github.com/rh-hideout/pokeemerald-expansion/pull/7383) +* Fixes draining moves recovering 1 HP when dealing 0 damage by @LinathanZel in [#7523](https://github.com/rh-hideout/pokeemerald-expansion/pull/7523) + +## 🀹 Moves 🀹 +### Changed +* New Attack Animations: 25w20a by @ShinyVolcarona in [#6886](https://github.com/rh-hideout/pokeemerald-expansion/pull/6886) + - Added move animations for multiple moves by @LinathanZel + - Dynamax Cannon, Behemoth Blade, Behemoth Bash, Eternabeam, Glaive Rush, Triple Dive, Doodle, Ruination, Collision Course, Electro Drift, Blazing Torque, Wicked Torque, Noxious Torque, Combat Torque, Magical Torque, Psyblade, Mighty Cleave, Supercell Slam +* Documented usage of `delay X` by @AsparagusEduardo in [#6951](https://github.com/rh-hideout/pokeemerald-expansion/pull/6951) +* Animation documentation by @AsparagusEduardo in [#7052](https://github.com/rh-hideout/pokeemerald-expansion/pull/7052) +* New and polished battle animations by @LinathanZel in [#7074](https://github.com/rh-hideout/pokeemerald-expansion/pull/7074) + +### Fixed +* Clear gScanlineEffect to fix timeout in acid downpour animation by @FosterProgramming in [#7442](https://github.com/rh-hideout/pokeemerald-expansion/pull/7442) +* Fix terastallization anims flickering by @ravepossum in [#7613](https://github.com/rh-hideout/pokeemerald-expansion/pull/7613) + +## 🧢 Items 🧢 +### Changed +* Fix using town map as registered item by @ravepossum in [#7482](https://github.com/rh-hideout/pokeemerald-expansion/pull/7482) +* Compound strings for hold effect names by @AsparagusEduardo in [#7140](https://github.com/rh-hideout/pokeemerald-expansion/pull/7140) +* Untangled TMs and HMs from item ids by @cfmnephrite in [#7173](https://github.com/rh-hideout/pokeemerald-expansion/pull/7173) +* Bag refactor 2 by @cfmnephrite in [#7166](https://github.com/rh-hideout/pokeemerald-expansion/pull/7166) + +### Fixed +* Implement using party menu items from field by @ravepossum in [#7481](https://github.com/rh-hideout/pokeemerald-expansion/pull/7481) +* Fixed TM and Berries disappearing when sorting by @AsparagusEduardo in [#7168](https://github.com/rh-hideout/pokeemerald-expansion/pull/7168) +* Fixed item swapping bug (#7428) by @cfmnephrite in [#7430](https://github.com/rh-hideout/pokeemerald-expansion/pull/7430) +* Fixes some Ability Shield interactions by @PhallenTree in [#7532](https://github.com/rh-hideout/pokeemerald-expansion/pull/7532) +* Fix tossing a stack of berries hiding following berries by @hedara90 in [#7571](https://github.com/rh-hideout/pokeemerald-expansion/pull/7571) + +## πŸ€– Battle AI πŸ€– +### Added +* AI: Add AI_SMART_TERA flag to make smarter decisions about when to terastalize. by @jfb1337 in [#6705](https://github.com/rh-hideout/pokeemerald-expansion/pull/6705) + - Only single battles are currently supported. +* Haze Boosting AI Followup by @Pawkkie in [#6966](https://github.com/rh-hideout/pokeemerald-expansion/pull/6966) +* Improved logic for Guard Split and Power Split. by @surskitty in [#7298](https://github.com/rh-hideout/pokeemerald-expansion/pull/7298) +* Add AI_FLAG_ASSUME_STAB by @Pawkkie in [#6797](https://github.com/rh-hideout/pokeemerald-expansion/pull/6797) +* AI checks the partner's moves for Flatter, Swagger, and Soak. by @surskitty in [#7306](https://github.com/rh-hideout/pokeemerald-expansion/pull/7306) +* AI uses After You to help set up Trick Room. by @surskitty in [#7310](https://github.com/rh-hideout/pokeemerald-expansion/pull/7310) +* AI assumes Magnitude / Present damage by @Pawkkie in [#7334](https://github.com/rh-hideout/pokeemerald-expansion/pull/7334) +* AI_FLAG_ASSUME_STATUS_MOVES -- AI flag to randomly know some of the player's status moves by @surskitty in [#7324](https://github.com/rh-hideout/pokeemerald-expansion/pull/7324) +* Improve AI's setup logic by @Pawkkie in [#7345](https://github.com/rh-hideout/pokeemerald-expansion/pull/7345) +* Improve AI's ShouldRecover by @Pawkkie in [#7342](https://github.com/rh-hideout/pokeemerald-expansion/pull/7342) +* Switch AI can see weather abilities of switchin candidates during damage calcs by @Pawkkie in [#7373](https://github.com/rh-hideout/pokeemerald-expansion/pull/7373) +* AI refactor for weather-setting, terrain-setting, Trick Room behaviors; doubles-focused by @surskitty in [#7319](https://github.com/rh-hideout/pokeemerald-expansion/pull/7319) + - AI is more likely to use Trick Room in double battles and Terrains in general. +* Improve AI type matchup calcs by @Pawkkie in [#7364](https://github.com/rh-hideout/pokeemerald-expansion/pull/7364) +* Multibattle Partner AI Flags and 2vs1 battler3 AI Flags fix by @grintoul1 in [#7378](https://github.com/rh-hideout/pokeemerald-expansion/pull/7378) +* Improve AI's Sucker Punch handling by @Pawkkie in [#7389](https://github.com/rh-hideout/pokeemerald-expansion/pull/7389) +* Improve AI's priority handling by @Pawkkie in [#7337](https://github.com/rh-hideout/pokeemerald-expansion/pull/7337) +* Fix dynamic move types in switching by @Pawkkie in [#7415](https://github.com/rh-hideout/pokeemerald-expansion/pull/7415) +* Adds AI_FLAG_ASSUMPTIONS as a constant for semi-omniscience by @surskitty in [#7435](https://github.com/rh-hideout/pokeemerald-expansion/pull/7435) +* AI_FLAG_ATTACKS_PARTNER with a config for bloodthirstiness by @surskitty in [#7401](https://github.com/rh-hideout/pokeemerald-expansion/pull/7401) +* Improved Guaranteed Flinch logic (fake out et al) by @surskitty in [#7501](https://github.com/rh-hideout/pokeemerald-expansion/pull/7501) +* AI uses Court Change. by @surskitty in [#7525](https://github.com/rh-hideout/pokeemerald-expansion/pull/7525) +* AI uses Tailwind. by @surskitty in [#7515](https://github.com/rh-hideout/pokeemerald-expansion/pull/7515) +* AI should not use Dark Void or Hyperspace Fury while wrong species by @surskitty in [#7540](https://github.com/rh-hideout/pokeemerald-expansion/pull/7540) +* AI uses Rototiller. by @surskitty in [#7542](https://github.com/rh-hideout/pokeemerald-expansion/pull/7542) +* Helping Hand logic by @surskitty in [#7504](https://github.com/rh-hideout/pokeemerald-expansion/pull/7504) + +### Changed +* Macro-for-AI-Flag-definitions by @grintoul1 in [#7471](https://github.com/rh-hideout/pokeemerald-expansion/pull/7471) +* Remove redundancy for ShouldLowerStat functions by @AlexOn1ine in [#6577](https://github.com/rh-hideout/pokeemerald-expansion/pull/6577) +* Expanding and Refactoring Skill Swap and other ability-changing moves by @surskitty in [#7238](https://github.com/rh-hideout/pokeemerald-expansion/pull/7238) +* Changes AccuracyCalcHelper into CanMoveSkipAccuracyCalc by @AlexOn1ine in [#7303](https://github.com/rh-hideout/pokeemerald-expansion/pull/7303) +* AI Tests + accompanying bugfixes for Skill Swap, Worry Seed, weather setting in double battles, and Discharging into an ally's lightningrod by @surskitty in [#7297](https://github.com/rh-hideout/pokeemerald-expansion/pull/7297) +* Fix AI resisted move scoring by @Pawkkie in [#7350](https://github.com/rh-hideout/pokeemerald-expansion/pull/7350) +* Fiddling with CanLowerStat. by @surskitty in [#7510](https://github.com/rh-hideout/pokeemerald-expansion/pull/7510) +* Improved hazards logic and Mycelium Might ignores ability checks by @surskitty in [#7509](https://github.com/rh-hideout/pokeemerald-expansion/pull/7509) +* AI handling for similar utility moves by @surskitty in [#7513](https://github.com/rh-hideout/pokeemerald-expansion/pull/7513) +* Modify move prediction to work in doubles by @AlexOn1ine in [#7087](https://github.com/rh-hideout/pokeemerald-expansion/pull/7087) +* Uncommenting out No Retreat, Clangorous Soul, and Extreme Evoboost from CheckBadMove by @surskitty in [#7541](https://github.com/rh-hideout/pokeemerald-expansion/pull/7541) +* AI Tailwind singles fix correction. by @surskitty in [#7543](https://github.com/rh-hideout/pokeemerald-expansion/pull/7543) +* Remove funcResult from AiThinkingStruct by @Pawkkie in [#7545](https://github.com/rh-hideout/pokeemerald-expansion/pull/7545) +* AI handling for Autotomize. by @surskitty in [#7550](https://github.com/rh-hideout/pokeemerald-expansion/pull/7550) +* AI uses Stuff Cheeks; treating it simply as a def +2 move for now. by @surskitty in [#7554](https://github.com/rh-hideout/pokeemerald-expansion/pull/7554) +* Slight Purify adjustment for targeting ally; test that AI can use Purify. by @surskitty in [#7553](https://github.com/rh-hideout/pokeemerald-expansion/pull/7553) +* AI handling for Howl. by @surskitty in [#7549](https://github.com/rh-hideout/pokeemerald-expansion/pull/7549) +* Test that AI uses Dragon Cheer. by @surskitty in [#7552](https://github.com/rh-hideout/pokeemerald-expansion/pull/7552) +* Tests to see that the AI uses moves. by @surskitty in [#7555](https://github.com/rh-hideout/pokeemerald-expansion/pull/7555) + +### Fixed +* Incorrect call in Rest by @surskitty in [#7569](https://github.com/rh-hideout/pokeemerald-expansion/pull/7569) +* Fix duplicate switch in after faint by @AlexOn1ine in [#7600](https://github.com/rh-hideout/pokeemerald-expansion/pull/7600) +* Feature/ai/wide guard quick guard singles by @Emiliasky in [#7086](https://github.com/rh-hideout/pokeemerald-expansion/pull/7086) +* Add missing break by @Pawkkie in [#7356](https://github.com/rh-hideout/pokeemerald-expansion/pull/7356) +* fixed-damage-move-ai-calc-fix by @grintoul1 in [#7385](https://github.com/rh-hideout/pokeemerald-expansion/pull/7385) +* Avoid doubling up on status moves in double battles. by @surskitty in [#7452](https://github.com/rh-hideout/pokeemerald-expansion/pull/7452) +* Fix doubles switch AI to use new type matchup system by @Pawkkie in [#7495](https://github.com/rh-hideout/pokeemerald-expansion/pull/7495) +* Fix Bad Odds not seeing damage properly by @Pawkkie in [#7492](https://github.com/rh-hideout/pokeemerald-expansion/pull/7492) +* Fix GetSwitchinHitsToKO one shot heal calcs by @Pawkkie in [#7502](https://github.com/rh-hideout/pokeemerald-expansion/pull/7502) +* Fix AI's KO evaluation getting messed up by priority by @Pawkkie in [#7533](https://github.com/rh-hideout/pokeemerald-expansion/pull/7533) +* Fixing Refresh AI scoring by @surskitty in [#7539](https://github.com/rh-hideout/pokeemerald-expansion/pull/7539) +* Fix switch AI not seeing its own move PP by @Pawkkie in [#7578](https://github.com/rh-hideout/pokeemerald-expansion/pull/7578) +* Fix wrong battler argument in `GetBattleMovePriority` call by @Pawkkie in [#7576](https://github.com/rh-hideout/pokeemerald-expansion/pull/7576) +* Restore AI: Basic Trainer to PARTNER_STEVEN by @grintoul1 in [#7586](https://github.com/rh-hideout/pokeemerald-expansion/pull/7586) + +## 🧹 Other Cleanup 🧹 +* Macro-for-AI-Flag-definitions by @grintoul1 in [#7471](https://github.com/rh-hideout/pokeemerald-expansion/pull/7471) +* Moved summary screen nature colors to summary_screen.h by @RubyRaven6 in [#7560](https://github.com/rh-hideout/pokeemerald-expansion/pull/7560) +* fix: remove unused wild_encounters.json.txt jinja file by @khbsd in [#7581](https://github.com/rh-hideout/pokeemerald-expansion/pull/7581) +* Fix Form Change Item Task Data and Clean Up Field Use Funcs by @ravepossum in [#7535](https://github.com/rh-hideout/pokeemerald-expansion/pull/7535) +* Fixed Teleport's description not being updated based on `B_TELEPORT_BEHAVIOR` by @AsparagusEduardo in [#7580](https://github.com/rh-hideout/pokeemerald-expansion/pull/7580) +* Fixed typo in test name by @hedara90 in [#7610](https://github.com/rh-hideout/pokeemerald-expansion/pull/7610) +* Minor Clean up in battle_ai_main.c by @AlexOn1ine in [#7551](https://github.com/rh-hideout/pokeemerald-expansion/pull/7551) +* Remove unused function by @AlexOn1ine in [#7617](https://github.com/rh-hideout/pokeemerald-expansion/pull/7617) +* Fix Vs Seeker Trainer Battle script issue by @pkmnsnfrn in [#7615](https://github.com/rh-hideout/pokeemerald-expansion/pull/7615) +* Clean up battlescript calls with func BattleScriptCall by @AlexOn1ine in [#6873](https://github.com/rh-hideout/pokeemerald-expansion/pull/6873) +* Replace all usages of lz compression with smol by @hedara90 in [#7032](https://github.com/rh-hideout/pokeemerald-expansion/pull/7032) +* `BtlController_EmitTwoReturnValues` cleanup by @AsparagusEduardo in [#6855](https://github.com/rh-hideout/pokeemerald-expansion/pull/6855) +* `GetBattlerMon` cleanup by @AsparagusEduardo in [#6967](https://github.com/rh-hideout/pokeemerald-expansion/pull/6967) +* Converts a bunch of defines to enums by @Bassoonian in [#7041](https://github.com/rh-hideout/pokeemerald-expansion/pull/7041) +* Change GetZMaxMoveAgainstProtectionModifier to prevent regressions by @AlexOn1ine in [#7047](https://github.com/rh-hideout/pokeemerald-expansion/pull/7047) +* Remove more instances of hard-coded Move IDs by @AsparagusEduardo in [#7056](https://github.com/rh-hideout/pokeemerald-expansion/pull/7056) + - Added `EFFECT_SHEER_COLD` to parametrize Sheer Cold's interactions with Ice types +* Animation documentation by @AsparagusEduardo in [#7052](https://github.com/rh-hideout/pokeemerald-expansion/pull/7052) +* Deprecate sStatusFlagsForMoveEffects by @AlexOn1ine in [#7063](https://github.com/rh-hideout/pokeemerald-expansion/pull/7063) +* chore: remove unused section from credits by @Emiliasky in [#7085](https://github.com/rh-hideout/pokeemerald-expansion/pull/7085) +* Removes duplicate AI ability func by @AlexOn1ine in [#7045](https://github.com/rh-hideout/pokeemerald-expansion/pull/7045) +* Remove redundancy for ShouldLowerStat functions by @AlexOn1ine in [#6577](https://github.com/rh-hideout/pokeemerald-expansion/pull/6577) +* Deprecate absent member from battlerState by @AlexOn1ine in [#7091](https://github.com/rh-hideout/pokeemerald-expansion/pull/7091) +* Use CanAbilityAbsorbMove in GetOverworldTypeEffectiveness by @AlexOn1ine in [#7115](https://github.com/rh-hideout/pokeemerald-expansion/pull/7115) +* Removed redundant Damp check by @AsparagusEduardo in [#7134](https://github.com/rh-hideout/pokeemerald-expansion/pull/7134) +* Improve music/se macros and fix names by @cawtds in [#7030](https://github.com/rh-hideout/pokeemerald-expansion/pull/7030) +* Compound strings for hold effect names by @AsparagusEduardo in [#7140](https://github.com/rh-hideout/pokeemerald-expansion/pull/7140) +* Repurposes IsMagicGuardProtected into a general function by @AlexOn1ine in [#7114](https://github.com/rh-hideout/pokeemerald-expansion/pull/7114) +* Converts more defines to enums and name unnamed enums by @Bassoonian in [#7071](https://github.com/rh-hideout/pokeemerald-expansion/pull/7071) +* Use `argument.type` for `EFFECT_SOAK` by @AsparagusEduardo in [#7141](https://github.com/rh-hideout/pokeemerald-expansion/pull/7141) +* More battle controller function consolidation. by @AsparagusEduardo in [#6877](https://github.com/rh-hideout/pokeemerald-expansion/pull/6877) +* Add assumes for bag tests by @Bassoonian in [#7188](https://github.com/rh-hideout/pokeemerald-expansion/pull/7188) +* Fixes Booster Energy timing activation + Clean up by @AlexOn1ine in [#7175](https://github.com/rh-hideout/pokeemerald-expansion/pull/7175) +* Update .gitignore to add heal locations by @Bassoonian in [#7050](https://github.com/rh-hideout/pokeemerald-expansion/pull/7050) +* Attackcanceller clean up by @AlexOn1ine in [#7210](https://github.com/rh-hideout/pokeemerald-expansion/pull/7210) +* Remove redundant move result flag checks by @AlexOn1ine in [#7223](https://github.com/rh-hideout/pokeemerald-expansion/pull/7223) +* Add P_ASK_MOVE_CONFIRMATION by @pkmnsnfrn in [#7132](https://github.com/rh-hideout/pokeemerald-expansion/pull/7132) + - This will change the behavior of the game for players, as a new default is being set. +* Script clean up for Flame Burst and Costar by @AlexOn1ine in [#7264](https://github.com/rh-hideout/pokeemerald-expansion/pull/7264) +* Use compound strings in battle debug menu by @AsparagusEduardo in [#7282](https://github.com/rh-hideout/pokeemerald-expansion/pull/7282) +* Renaming STATUS1_REFRESH and adding more constants for common STATUS1 checks. by @surskitty in [#7284](https://github.com/rh-hideout/pokeemerald-expansion/pull/7284) +* Removed all instances of .chance = 100, SHEER_FORCE_NO_BOOST by @cfmnephrite in [#7300](https://github.com/rh-hideout/pokeemerald-expansion/pull/7300) +* AI Tests + accompanying bugfixes for Skill Swap, Worry Seed, weather setting in double battles, and Discharging into an ally's lightningrod by @surskitty in [#7297](https://github.com/rh-hideout/pokeemerald-expansion/pull/7297) +* Turn `OW_FRLG_WHITEOUT` into `OW_WHITEOUT_CUTSCENE` and make it generational by @kittenchilly in [#6962](https://github.com/rh-hideout/pokeemerald-expansion/pull/6962) +* Fix AI resisted move scoring by @Pawkkie in [#7350](https://github.com/rh-hideout/pokeemerald-expansion/pull/7350) +* Convert various to callnatives by @AlexOn1ine in [#7355](https://github.com/rh-hideout/pokeemerald-expansion/pull/7355) +* Remove leftover code by @AlexOn1ine in [#7397](https://github.com/rh-hideout/pokeemerald-expansion/pull/7397) +* Moved some fields to BattlerState/PartyState by @AsparagusEduardo in [#7409](https://github.com/rh-hideout/pokeemerald-expansion/pull/7409) +* Additional effects tweak by @cfmnephrite in [#7392](https://github.com/rh-hideout/pokeemerald-expansion/pull/7392) +* Clean up noResultString by @AlexOn1ine in [#7408](https://github.com/rh-hideout/pokeemerald-expansion/pull/7408) +* Bag sorting cleanup by @mrgriffin in [#7489](https://github.com/rh-hideout/pokeemerald-expansion/pull/7489) +* Convert statuses3 to volatiles by @AlexOn1ine in [#7514](https://github.com/rh-hideout/pokeemerald-expansion/pull/7514) +* Uncommenting out No Retreat, Clangorous Soul, and Extreme Evoboost from CheckBadMove by @surskitty in [#7541](https://github.com/rh-hideout/pokeemerald-expansion/pull/7541) +* AI Tailwind singles fix correction. by @surskitty in [#7543](https://github.com/rh-hideout/pokeemerald-expansion/pull/7543) +* Remove funcResult from AiThinkingStruct by @Pawkkie in [#7545](https://github.com/rh-hideout/pokeemerald-expansion/pull/7545) +* Suppress trainerproc compile warning for unused func by @AlexOn1ine in [#7592](https://github.com/rh-hideout/pokeemerald-expansion/pull/7592) +* Prevents a regression for custom abilties by @AlexOn1ine in [#7616](https://github.com/rh-hideout/pokeemerald-expansion/pull/7616) + +## πŸ§ͺ Test Runner πŸ§ͺ +### Changed +* Clean up some Normalize tests to make them make sense by @hedara90 in [#7461](https://github.com/rh-hideout/pokeemerald-expansion/pull/7461) +* Add Synthesis + Utililty Umbrella test by @ghoulslash in [#7472](https://github.com/rh-hideout/pokeemerald-expansion/pull/7472) +* Add test for BoxPokemon integrity by @hedara90 in [#7487](https://github.com/rh-hideout/pokeemerald-expansion/pull/7487) +* Re-order moves in fling test by @hedara90 in [#7559](https://github.com/rh-hideout/pokeemerald-expansion/pull/7559) +* Wrote some tests by @AsparagusEduardo in [#7563](https://github.com/rh-hideout/pokeemerald-expansion/pull/7563) +* Added Ability TODO tests - Volume C by @AsparagusEduardo in [#7562](https://github.com/rh-hideout/pokeemerald-expansion/pull/7562) +* Added missing Move Effect TODO tests - Volume F by @AsparagusEduardo in [#7605](https://github.com/rh-hideout/pokeemerald-expansion/pull/7605) +* Fixed typo in test name by @hedara90 in [#7610](https://github.com/rh-hideout/pokeemerald-expansion/pull/7610) +* Add assumes for bag tests by @Bassoonian in [#7188](https://github.com/rh-hideout/pokeemerald-expansion/pull/7188) +* Split Sheer Force tests by gen instead of by four by @AlexOn1ine in [#7260](https://github.com/rh-hideout/pokeemerald-expansion/pull/7260) +* make check TESTS="..." support for filenames and infix matches by @mrgriffin in [#7536](https://github.com/rh-hideout/pokeemerald-expansion/pull/7536) +* Fix shell side arm rng in battle tests moves by @FosterProgramming in [#7548](https://github.com/rh-hideout/pokeemerald-expansion/pull/7548) +* Test that AI uses Dragon Cheer. by @surskitty in [#7552](https://github.com/rh-hideout/pokeemerald-expansion/pull/7552) +* Tests to see that the AI uses moves. by @surskitty in [#7555](https://github.com/rh-hideout/pokeemerald-expansion/pull/7555) + +### Fixed +* Clear out parties between battle tests by @hedara90 in [#7460](https://github.com/rh-hideout/pokeemerald-expansion/pull/7460) +* Fixed most failed tests with `GEN_LATEST GEN_8` by @AsparagusEduardo in [#7498](https://github.com/rh-hideout/pokeemerald-expansion/pull/7498) +* Corrected Liquid Ooze test by @AsparagusEduardo in [#7527](https://github.com/rh-hideout/pokeemerald-expansion/pull/7527) +* switchinabilities also runs ON_WEATHER and ON_TERRAIN by @ghoulslash in [#7612](https://github.com/rh-hideout/pokeemerald-expansion/pull/7612) +* Ally Switch attract battler swapping, test for leech seed by @ghoulslash in [#7634](https://github.com/rh-hideout/pokeemerald-expansion/pull/7634) +* Fixed changed effect for Sheer Cold by @hedara90 in [#7099](https://github.com/rh-hideout/pokeemerald-expansion/pull/7099) +* Fixed Transistor damage calculation test failing when `GEN_LATEST` is less than `GEN_9` by @AsparagusEduardo in [#7577](https://github.com/rh-hideout/pokeemerald-expansion/pull/7577) + +## πŸ“š Documentation πŸ“š +* Update how_to_new_pokemon.md by @kevinwklawrence in [#7440](https://github.com/rh-hideout/pokeemerald-expansion/pull/7440) +* Updating a link to porytiles in INSTALL.md by @ThePeeps191 in [#7490](https://github.com/rh-hideout/pokeemerald-expansion/pull/7490) +* Added comment in event.inc for simple menus in dynmultichoice by @RubyRaven6 in [#7568](https://github.com/rh-hideout/pokeemerald-expansion/pull/7568) +* Documented usage of `delay X` by @AsparagusEduardo in [#6951](https://github.com/rh-hideout/pokeemerald-expansion/pull/6951) +* Update follower NPC tutorial doc for createfollowernpc macro by @Bivurnum in [#7230](https://github.com/rh-hideout/pokeemerald-expansion/pull/7230) +* Improve trainer back pic-related data and code (+ smol documentation) by @mudskipper13 in [#6821](https://github.com/rh-hideout/pokeemerald-expansion/pull/6821) +* Update trainer.h usage warning by @hedara90 in [#7439](https://github.com/rh-hideout/pokeemerald-expansion/pull/7439) + +## New Contributors +* @kevinwklawrence made their first contribution in [#7440](https://github.com/rh-hideout/pokeemerald-expansion/pull/7440) +* @ThePeeps191 made their first contribution in [#7490](https://github.com/rh-hideout/pokeemerald-expansion/pull/7490) +* @cornixsenex made their first contribution in [#7368](https://github.com/rh-hideout/pokeemerald-expansion/pull/7368) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.12.2...expansion/1.12.3 + +## New Contributors +* @ShinyVolcarona made their first contribution in [#6886](https://github.com/rh-hideout/pokeemerald-expansion/pull/6886) +* @Emiliasky made their first contribution in [#7085](https://github.com/rh-hideout/pokeemerald-expansion/pull/7085) +* @poetahto made their first contribution in [#7155](https://github.com/rh-hideout/pokeemerald-expansion/pull/7155) +* @Bolt-Strike made their first contribution in [#7103](https://github.com/rh-hideout/pokeemerald-expansion/pull/7103) +* @kevinwklawrence made their first contribution in [#7440](https://github.com/rh-hideout/pokeemerald-expansion/pull/7440) +* @FosterProgramming made their first contribution in [#7442](https://github.com/rh-hideout/pokeemerald-expansion/pull/7442) +* @ThePeeps191 made their first contribution in [#7490](https://github.com/rh-hideout/pokeemerald-expansion/pull/7490) +* @cornixsenex made their first contribution in [#7368](https://github.com/rh-hideout/pokeemerald-expansion/pull/7368) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.12.2...expansion/1.13.0 + + + + diff --git a/docs/changelogs/1.13.x/1.13.1.md b/docs/changelogs/1.13.x/1.13.1.md new file mode 100644 index 000000000000..97b33e931d08 --- /dev/null +++ b/docs/changelogs/1.13.x/1.13.1.md @@ -0,0 +1,44 @@ +```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.13.1 +`. +``` + + +## 🧬 General 🧬 +### Fixed +* Added sortType to Douse Drive by @fdeblasio in [#7664](https://github.com/rh-hideout/pokeemerald-expansion/pull/7664) + +## πŸ‰ PokΓ©mon πŸ‰ +### Fixed +* Fixed disabled cross-evolutions still being possible by @AsparagusEduardo in [#7678](https://github.com/rh-hideout/pokeemerald-expansion/pull/7678) + +## βš”οΈ Battle General βš”οΈ +### Changed +* Replace boolean multiplications with ternaries by @hedara90 in [#7653](https://github.com/rh-hideout/pokeemerald-expansion/pull/7653) + +## πŸ€– Battle AI πŸ€– +### Fixed +* Helping Hand bugfix; used FOE instead of BATTLE_OPPOSITE. by @surskitty in [#7659](https://github.com/rh-hideout/pokeemerald-expansion/pull/7659) + +## 🧹 Other Cleanup 🧹 +* Replace boolean multiplications with ternaries by @hedara90 in [#7653](https://github.com/rh-hideout/pokeemerald-expansion/pull/7653) +* Fix Rage Fist test name by @AlexOn1ine in [#7681](https://github.com/rh-hideout/pokeemerald-expansion/pull/7681) + +## πŸ§ͺ Test Runner πŸ§ͺ +### Changed +* Fix Rage Fist test name by @AlexOn1ine in [#7681](https://github.com/rh-hideout/pokeemerald-expansion/pull/7681) + +### Fixed +* Fix crashing tests duplicating tests from another thread by @hedara90 in [#7683](https://github.com/rh-hideout/pokeemerald-expansion/pull/7683) + +## πŸ“š Documentation πŸ“š +* Update README.md by @Bassoonian in [#7639](https://github.com/rh-hideout/pokeemerald-expansion/pull/7639) + + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.13.0...expansion/1.13.1 + + + + diff --git a/docs/changelogs/1.13.x/1.13.2.md b/docs/changelogs/1.13.x/1.13.2.md new file mode 100644 index 000000000000..6cd2249378aa --- /dev/null +++ b/docs/changelogs/1.13.x/1.13.2.md @@ -0,0 +1,123 @@ +```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.13.2 +`. +``` + + +## 🧬 General 🧬 +### Changed +* Removed superflous palette compression check by @hedara90 in [#7718](https://github.com/rh-hideout/pokeemerald-expansion/pull/7718) +* update of sv.json to consider newest DLC changes by @wiz1989 in [#7672](https://github.com/rh-hideout/pokeemerald-expansion/pull/7672) +* Adjusted line break substring breaking by @hedara90 in [#7789](https://github.com/rh-hideout/pokeemerald-expansion/pull/7789) +* Fixup add-new-trainer-front-pic tutorial. by @GraionDilach in [#7802](https://github.com/rh-hideout/pokeemerald-expansion/pull/7802) +* Adds conversion script for trainers.h by @AlexOn1ine in [#7663](https://github.com/rh-hideout/pokeemerald-expansion/pull/7663) + +### Fixed +* Fix bug with IF_GENDER evolution condition by @FosterProgramming in [#7749](https://github.com/rh-hideout/pokeemerald-expansion/pull/7749) +* Pokemon storage moving items bugfix by @FosterProgramming in [#7763](https://github.com/rh-hideout/pokeemerald-expansion/pull/7763) +* Fix catch bug introduced in #7774 by @FosterProgramming in [#7782](https://github.com/rh-hideout/pokeemerald-expansion/pull/7782) +* Fix Party Menu move select name width by @AsparagusEduardo in [#7820](https://github.com/rh-hideout/pokeemerald-expansion/pull/7820) +* Fix Debug Give PokΓ©mon (Complex) with duplicate moves by @AsparagusEduardo in [#7821](https://github.com/rh-hideout/pokeemerald-expansion/pull/7821) + +## πŸ—ΊοΈ Overworld πŸ—ΊοΈ +### Changed +* Added missing `LOCALID_NONE` by @estellarc in [#7783](https://github.com/rh-hideout/pokeemerald-expansion/pull/7783) + +### Fixed +* Fix TRAINER_TYPE_SEE_ALL_DIRECTIONS by @DizzyEggg in [#7779](https://github.com/rh-hideout/pokeemerald-expansion/pull/7779) + +## πŸ‰ PokΓ©mon πŸ‰ +### Fixed +* fix: seen flags for first mon in enemy party by @khbsd in [#7791](https://github.com/rh-hideout/pokeemerald-expansion/pull/7791) + +## βš”οΈ Battle General βš”οΈ +### Fixed +* Fix most failed tests with `GEN_LATEST` = `GEN_7` by @AsparagusEduardo in [#7688](https://github.com/rh-hideout/pokeemerald-expansion/pull/7688) +* Fixes Sweet Veil not protecting sleep from Yawn status by @AlexOn1ine in [#7704](https://github.com/rh-hideout/pokeemerald-expansion/pull/7704) +* Fix incorrect wrap turn amount by @AlexOn1ine in [#7667](https://github.com/rh-hideout/pokeemerald-expansion/pull/7667) +* Fixes Rage Fist for gen7 Disguise by @AlexOn1ine in [#7692](https://github.com/rh-hideout/pokeemerald-expansion/pull/7692) +* Fixes Intrepid Sword/Dauntless Shield boosting after entering while at max stats by @PhallenTree in [#7716](https://github.com/rh-hideout/pokeemerald-expansion/pull/7716) +* Fixes incorrect ending for some scripts by @AlexOn1ine in [#7691](https://github.com/rh-hideout/pokeemerald-expansion/pull/7691) +* Fixes Uproar not waking up mons by @AlexOn1ine in [#7714](https://github.com/rh-hideout/pokeemerald-expansion/pull/7714) +* Fixes Endure and Eject Pack issues by @AlexOn1ine in [#7687](https://github.com/rh-hideout/pokeemerald-expansion/pull/7687) +* Fix Beak Blast burning fire types by @hedara90 in [#7740](https://github.com/rh-hideout/pokeemerald-expansion/pull/7740) +* Fixes Recharge not actually being removed when recharge turn occurs by @PhallenTree in [#7744](https://github.com/rh-hideout/pokeemerald-expansion/pull/7744) +* Bugfixes Batch by @AlexOn1ine in [#7739](https://github.com/rh-hideout/pokeemerald-expansion/pull/7739) +* Fixes Beat Up incorrect slots usage by @AlexOn1ine in [#7741](https://github.com/rh-hideout/pokeemerald-expansion/pull/7741) +* Fixes Mycelium Might and Lagging Tail adjusting prio incorrectly by @AlexOn1ine in [#7742](https://github.com/rh-hideout/pokeemerald-expansion/pull/7742) +* Wrong argument passed down by @AlexOn1ine in [#7751](https://github.com/rh-hideout/pokeemerald-expansion/pull/7751) +* Fixed Ball Fetch Ability by @bassforte123 in [#7764](https://github.com/rh-hideout/pokeemerald-expansion/pull/7764) +* Fixes Flower Shield affecting semi-invulnerable mons by @AlexOn1ine in [#7766](https://github.com/rh-hideout/pokeemerald-expansion/pull/7766) +* Fixes Helping Hand boosts not stacking with each other by @PhallenTree in [#7775](https://github.com/rh-hideout/pokeemerald-expansion/pull/7775) +* Fixes OHKO moves calculating accuracy twice by @AlexOn1ine in [#7785](https://github.com/rh-hideout/pokeemerald-expansion/pull/7785) +* Fixes Instructed moves looking at the wrong turn order number by @PhallenTree in [#7788](https://github.com/rh-hideout/pokeemerald-expansion/pull/7788) +* Fix Flame Burst timeout if primary target is fainted by @hedara90 in [#7793](https://github.com/rh-hideout/pokeemerald-expansion/pull/7793) +* Fixes Leppa Berry timings by @AlexOn1ine in [#7787](https://github.com/rh-hideout/pokeemerald-expansion/pull/7787) +* Fixes Effects activating when move wasn't successful by @AlexOn1ine in [#7803](https://github.com/rh-hideout/pokeemerald-expansion/pull/7803) +* Fixes Throat Spray being blocked by Sheer Force by @AlexOn1ine in [#7808](https://github.com/rh-hideout/pokeemerald-expansion/pull/7808) +* Fixes inaccurate save / restore in Fling script by @AlexOn1ine in [#7811](https://github.com/rh-hideout/pokeemerald-expansion/pull/7811) +* Fix test exit prints for stored battlers by @AlexOn1ine in [#7807](https://github.com/rh-hideout/pokeemerald-expansion/pull/7807) +* Fixes EndTurn Eject Pack by @AlexOn1ine in [#7813](https://github.com/rh-hideout/pokeemerald-expansion/pull/7813) +* Fix Battle Frontier using Strange Balls by @AsparagusEduardo in [#7823](https://github.com/rh-hideout/pokeemerald-expansion/pull/7823) +* Fix Throat Spray activating multiply times by @AlexOn1ine in [#7818](https://github.com/rh-hideout/pokeemerald-expansion/pull/7818) +* fix (choice lock): Gorilla Tactics interactions with choice item removal by @ghostyboyy97 in [#7824](https://github.com/rh-hideout/pokeemerald-expansion/pull/7824) + - Fixed interactions with choice items and Gorilla Tactics both present when choice item is removed by a thief effect or item swap effect. +* Fixes encore random target for gen5+ by @AlexOn1ine in [#7800](https://github.com/rh-hideout/pokeemerald-expansion/pull/7800) + +## 🀹 Moves 🀹 +### Changed +* Initial Lash Out tests by @grintoul1 in [#7769](https://github.com/rh-hideout/pokeemerald-expansion/pull/7769) + +### Fixed +* Fix Salt Cure in double battles by @Bassoonian in [#7797](https://github.com/rh-hideout/pokeemerald-expansion/pull/7797) + +## 🎭 Abilities 🎭 +### Fixed +* Fix for Levitate and Mold Breaker being seen correctly by switch AI, with Levitate tests by @grintoul1 in [#7748](https://github.com/rh-hideout/pokeemerald-expansion/pull/7748) +* Fix Forecast and Flower Gift corruption by @Bassoonian in [#7796](https://github.com/rh-hideout/pokeemerald-expansion/pull/7796) +* Immunity abilities trigger on turn 0 (leads) by @spindrift64 in [#7814](https://github.com/rh-hideout/pokeemerald-expansion/pull/7814) + +## πŸ€– Battle AI πŸ€– +### Changed +* Tidy up CanTargetFaintAiWithMod and CanTargetMoveFaintAi by @grintoul1 in [#7693](https://github.com/rh-hideout/pokeemerald-expansion/pull/7693) +* Doubles AI: Trick Room timer fix and test for DOUBLE_TRICK_ROOM_ON_LAST_TURN_CHANCE by @grintoul1 in [#7622](https://github.com/rh-hideout/pokeemerald-expansion/pull/7622) + +### Fixed +* Toxic thread uses light screen's scoring.... by @surskitty in [#7674](https://github.com/rh-hideout/pokeemerald-expansion/pull/7674) +* Fix most failed and assume fail tests with `GEN_LATEST` = `GEN_6` by @AsparagusEduardo in [#7696](https://github.com/rh-hideout/pokeemerald-expansion/pull/7696) +* Fix for Levitate and Mold Breaker being seen correctly by switch AI, with Levitate tests by @grintoul1 in [#7748](https://github.com/rh-hideout/pokeemerald-expansion/pull/7748) + +## 🧹 Other Cleanup 🧹 +* Tidy up CanTargetFaintAiWithMod and CanTargetMoveFaintAi by @grintoul1 in [#7693](https://github.com/rh-hideout/pokeemerald-expansion/pull/7693) +* Removed superflous palette compression check by @hedara90 in [#7718](https://github.com/rh-hideout/pokeemerald-expansion/pull/7718) +* Fix failing test for B_PREFERRED_ICE_WEATHER = B_ICE_WEATHER_SNOW by @phexmiau in [#7755](https://github.com/rh-hideout/pokeemerald-expansion/pull/7755) +* Adjusted line break substring breaking by @hedara90 in [#7789](https://github.com/rh-hideout/pokeemerald-expansion/pull/7789) +* Added missing `LOCALID_NONE` by @estellarc in [#7783](https://github.com/rh-hideout/pokeemerald-expansion/pull/7783) + +## πŸ§ͺ Test Runner πŸ§ͺ +### Changed +* Add tests for Filter, Solid Rock and Prism Armor by @hedara90 in [#7734](https://github.com/rh-hideout/pokeemerald-expansion/pull/7734) +* Fix failing test for B_PREFERRED_ICE_WEATHER = B_ICE_WEATHER_SNOW by @phexmiau in [#7755](https://github.com/rh-hideout/pokeemerald-expansion/pull/7755) +* Initial Lash Out tests by @grintoul1 in [#7769](https://github.com/rh-hideout/pokeemerald-expansion/pull/7769) +* Improve how test involving ball throw work by @FosterProgramming in [#7774](https://github.com/rh-hideout/pokeemerald-expansion/pull/7774) + +### Fixed +* Fix EWRAM_INIT in tests and add a default state to test runner main loop by @hedara90 in [#7699](https://github.com/rh-hideout/pokeemerald-expansion/pull/7699) +* Fix most failed and assume fail tests with `GEN_LATEST` = `GEN_6` by @AsparagusEduardo in [#7696](https://github.com/rh-hideout/pokeemerald-expansion/pull/7696) +* Fix for Levitate and Mold Breaker being seen correctly by switch AI, with Levitate tests by @grintoul1 in [#7748](https://github.com/rh-hideout/pokeemerald-expansion/pull/7748) +* Fix Big Root tests by @hedara90 in [#7817](https://github.com/rh-hideout/pokeemerald-expansion/pull/7817) + +## πŸ“š Documentation πŸ“š +* Fixup add-new-trainer-front-pic tutorial. by @GraionDilach in [#7802](https://github.com/rh-hideout/pokeemerald-expansion/pull/7802) + +## New Contributors +* @phexmiau made their first contribution in [#7755](https://github.com/rh-hideout/pokeemerald-expansion/pull/7755) +* @ghostyboyy97 made their first contribution in [#7824](https://github.com/rh-hideout/pokeemerald-expansion/pull/7824) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.13.1...expansion/1.13.2 + + + + diff --git a/docs/changelogs/1.13.x/1.13.3.md b/docs/changelogs/1.13.x/1.13.3.md new file mode 100644 index 000000000000..70e1830ff4b7 --- /dev/null +++ b/docs/changelogs/1.13.x/1.13.3.md @@ -0,0 +1,193 @@ +```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.13.3 +`. +``` + + +## 🧬 General 🧬 +### Added +* Add test to detect save file shifting by @Bassoonian in [#8030](https://github.com/rh-hideout/pokeemerald-expansion/pull/8030) + +### Changed +* 1.13.2 release by @hedara90 in [#7831](https://github.com/rh-hideout/pokeemerald-expansion/pull/7831) +* Remove unnecessary EWRAM and IWRAM variables from the Window code by @estellarc in [#7897](https://github.com/rh-hideout/pokeemerald-expansion/pull/7897) +* Replace magic numbers with define'd values in field_player_avatar.c by @FosterProgramming in [#7910](https://github.com/rh-hideout/pokeemerald-expansion/pull/7910) +* Pret merge (1st of November, 2025) by @hedara90 in [#8103](https://github.com/rh-hideout/pokeemerald-expansion/pull/8103) + +### Fixed +* Fixes `EVO_BATTLE_END` evolutions not removing item with additional conditions by @PhallenTree in [#7841](https://github.com/rh-hideout/pokeemerald-expansion/pull/7841) +* Fix EV display in debug menu by @cawtds in [#7848](https://github.com/rh-hideout/pokeemerald-expansion/pull/7848) +* Fix right player position battle partner target display by @ravepossum in [#7878](https://github.com/rh-hideout/pokeemerald-expansion/pull/7878) +* Ensure last used ball and move description window sprites don't free palette too early by @ravepossum in [#7875](https://github.com/rh-hideout/pokeemerald-expansion/pull/7875) +* Fix fusion pokemon aquiring illegal movesets by @FosterProgramming in [#7896](https://github.com/rh-hideout/pokeemerald-expansion/pull/7896) + - Calyrex will now delete moves if they are not part of its learnset when unfusing + - Kyurem will now properly swap the moves Glaciate and Scary Face to its signature moves when fusing/unfusing +* Fix bug causing hgss dex to freeze by @FosterProgramming in [#7936](https://github.com/rh-hideout/pokeemerald-expansion/pull/7936) + - Fix a bug when checking evolutions info screen while search mode is active in the hgss dex +* Show convergent evolution to Gholdengo in HGSS dex by @FosterProgramming in [#7934](https://github.com/rh-hideout/pokeemerald-expansion/pull/7934) +* Fix HGSS dex sprites for gen9+ by @FosterProgramming in [#7922](https://github.com/rh-hideout/pokeemerald-expansion/pull/7922) +* Fix nicknames containing many / overflowing the party screen textbox by @hedara90 in [#7970](https://github.com/rh-hideout/pokeemerald-expansion/pull/7970) +* Fix ruination and nature's madness damage percentage by @FosterProgramming in [#7983](https://github.com/rh-hideout/pokeemerald-expansion/pull/7983) +* Fix ribbon colours by @hedara90 in [#7971](https://github.com/rh-hideout/pokeemerald-expansion/pull/7971) +* Fix long pokemon name in partner party not appearing properly by @FosterProgramming in [#8009](https://github.com/rh-hideout/pokeemerald-expansion/pull/8009) +* Fix battle dome bug (again) by @FosterProgramming in [#8007](https://github.com/rh-hideout/pokeemerald-expansion/pull/8007) +* Fix battle arena counting all judges loss for the opponent by @FosterProgramming in [#8046](https://github.com/rh-hideout/pokeemerald-expansion/pull/8046) + - Fix battle arena referees giving undeserved wins to the player +* Fix wrong gimmick spite showing when inputting too fast by @FosterProgramming in [#8066](https://github.com/rh-hideout/pokeemerald-expansion/pull/8066) + +## πŸ—ΊοΈ Overworld πŸ—ΊοΈ +### Fixed +* Fix LTO breaking with FREE_MYSTERY_GIFT set to TRUE by @DizzyEggg in [#7844](https://github.com/rh-hideout/pokeemerald-expansion/pull/7844) +* Fix dns palette weight by @FosterProgramming in [#7855](https://github.com/rh-hideout/pokeemerald-expansion/pull/7855) +* Bug Fix: NPC follower not inheriting facing direction upon creation by @Bivurnum in [#7895](https://github.com/rh-hideout/pokeemerald-expansion/pull/7895) +* Fix follower pokemon not playing animation when colliding by @FosterProgramming in [#7908](https://github.com/rh-hideout/pokeemerald-expansion/pull/7908) +* Fix incorrect font width in Dexnav search window hiding some elements by @FosterProgramming in [#7949](https://github.com/rh-hideout/pokeemerald-expansion/pull/7949) +* Fix dns color transition not applying weather blending by @FosterProgramming in [#7883](https://github.com/rh-hideout/pokeemerald-expansion/pull/7883) +* Fix follower NPC sidewaystair movement by @FosterProgramming in [#7909](https://github.com/rh-hideout/pokeemerald-expansion/pull/7909) +* Fix battle dome pre round 1 waiting room by @FosterProgramming in [#7976](https://github.com/rh-hideout/pokeemerald-expansion/pull/7976) +* Fix no_effect script command overwriting trainer data in trainer script by @FosterProgramming in [#7978](https://github.com/rh-hideout/pokeemerald-expansion/pull/7978) +* Setting wallclock time now properly sets fakeRTC by @FosterProgramming in [#7860](https://github.com/rh-hideout/pokeemerald-expansion/pull/7860) + - Fix time bug when setting wallclock in fakeRTC mode + - When setting the wall clock, it will start on current time instead of 10AM + - If FakeRTC is active, new game will start at 10AM +* Bugfix hidefollower not waiting properly by @FosterProgramming in [#7768](https://github.com/rh-hideout/pokeemerald-expansion/pull/7768) +* Bugfix Emotes not loading their palette by @estellarc in [#7843](https://github.com/rh-hideout/pokeemerald-expansion/pull/7843) +* Fix OW PokΓ©mon VObjects by @HashtagMarky in [#7991](https://github.com/rh-hideout/pokeemerald-expansion/pull/7991) +* fix: hypertraining a stat now optionally reflects in the summary screen by @khbsd in [#8035](https://github.com/rh-hideout/pokeemerald-expansion/pull/8035) +* Fix pc turning on/off animation not working in battle frontier by @FosterProgramming in [#8048](https://github.com/rh-hideout/pokeemerald-expansion/pull/8048) +* Fix non-battle trainer script not running properly by @FosterProgramming in [#8056](https://github.com/rh-hideout/pokeemerald-expansion/pull/8056) + +## πŸ‰ PokΓ©mon πŸ‰ +### Fixed +* Fixes shininess for givemon by @cawtds in [#7847](https://github.com/rh-hideout/pokeemerald-expansion/pull/7847) +* Fix Minior start of battle form by @hedara90 in [#7972](https://github.com/rh-hideout/pokeemerald-expansion/pull/7972) +* Add error messages for trying to send an illegal mon to the PC and fixes index in double wild battles by @hedara90 in [#7982](https://github.com/rh-hideout/pokeemerald-expansion/pull/7982) +* fix: hypertraining a stat now optionally reflects in the summary screen by @khbsd in [#8035](https://github.com/rh-hideout/pokeemerald-expansion/pull/8035) +* Add camera-facing right-walking Krabby and Kingler follower sprites by @rayrobdod in [#7881](https://github.com/rh-hideout/pokeemerald-expansion/pull/7881) + +## βš”οΈ Battle General βš”οΈ +### Changed +* Tests for Battery ability by @grintoul1 in [#7846](https://github.com/rh-hideout/pokeemerald-expansion/pull/7846) +* Aura Break tests by @grintoul1 in [#8099](https://github.com/rh-hideout/pokeemerald-expansion/pull/8099) + +### Fixed +* Fixes Endure lasting forever by @AlexOn1ine in [#7838](https://github.com/rh-hideout/pokeemerald-expansion/pull/7838) +* Fix for uncaught mon with terrain active by @DizzyEggg in [#7868](https://github.com/rh-hideout/pokeemerald-expansion/pull/7868) +* Fixes Steadfast not activating + tests by @PhallenTree in [#7886](https://github.com/rh-hideout/pokeemerald-expansion/pull/7886) +* Fix hgss pokedex when catching mon with terrain by @DizzyEggg in [#7884](https://github.com/rh-hideout/pokeemerald-expansion/pull/7884) +* Fix SmartStrike crashing the game in double battles by @DizzyEggg in [#7902](https://github.com/rh-hideout/pokeemerald-expansion/pull/7902) +* Fix palaceUnableToUseMove falling through to change battle script by @ghoulslash in [#7912](https://github.com/rh-hideout/pokeemerald-expansion/pull/7912) +* Add new Move target types to GetBattlePalaceMoveGroup by @ghoulslash in [#7913](https://github.com/rh-hideout/pokeemerald-expansion/pull/7913) +* Fixes 2 instances of global usage in the `Cmd_adjustdamage` loop by @AlexOn1ine in [#7918](https://github.com/rh-hideout/pokeemerald-expansion/pull/7918) +* Fix Battle Anim monbg calls Part 1 by @ghoulslash in [#7906](https://github.com/rh-hideout/pokeemerald-expansion/pull/7906) +* Adds missing breakable flag for Bulletproof by @AlexOn1ine in [#7928](https://github.com/rh-hideout/pokeemerald-expansion/pull/7928) +* Fix multiple battle arena bugs by @FosterProgramming in [#7941](https://github.com/rh-hideout/pokeemerald-expansion/pull/7941) +* Fixes Cursed Body failing to disable moves on the last PP by @PhallenTree in [#7940](https://github.com/rh-hideout/pokeemerald-expansion/pull/7940) +* Fixed an issue related to Pokemon animation bleeding into attack anim… by @LinathanZel in [#7924](https://github.com/rh-hideout/pokeemerald-expansion/pull/7924) +* Fixes terrain not failing on duplicate by @AlexOn1ine in [#7939](https://github.com/rh-hideout/pokeemerald-expansion/pull/7939) +* Fix volt tackle not inflicting recoil by @FosterProgramming in [#7944](https://github.com/rh-hideout/pokeemerald-expansion/pull/7944) +* Fix Knock Off not being restored and Wild Battles by @ghoulslash in [#7952](https://github.com/rh-hideout/pokeemerald-expansion/pull/7952) +* Fix Anticipation type effectiveness check by @spindrift64 in [#7840](https://github.com/rh-hideout/pokeemerald-expansion/pull/7840) +* Fix Cherim and Castfrom not reverting to baseform when Teraform Zero is triggered by @FosterProgramming in [#7961](https://github.com/rh-hideout/pokeemerald-expansion/pull/7961) +* Fix Focus Energy boosting crit by the wrong amount with gen1 crit chance by @FosterProgramming in [#7956](https://github.com/rh-hideout/pokeemerald-expansion/pull/7956) +* Fix bug where transformed pokemon lose copied stats on levelup by @FosterProgramming in [#7969](https://github.com/rh-hideout/pokeemerald-expansion/pull/7969) +* Fixes Shields Down incorrectly preventing status on Minior Core form by @PhallenTree in [#7968](https://github.com/rh-hideout/pokeemerald-expansion/pull/7968) +* SetShellSideArmCategory avoid div by zero by @DizzyEggg in [#7980](https://github.com/rh-hideout/pokeemerald-expansion/pull/7980) +* CalcBarFilledPixels Safe Div by @DizzyEggg in [#7979](https://github.com/rh-hideout/pokeemerald-expansion/pull/7979) +* Fix psychic terrain affecting semi-invulnerable mons by @FosterProgramming in [#7986](https://github.com/rh-hideout/pokeemerald-expansion/pull/7986) +* Fixes Terrain Extender timer by @AlexOn1ine in [#7995](https://github.com/rh-hideout/pokeemerald-expansion/pull/7995) +* Fixed Max Move in-battle descriptions by @AsparagusEduardo in [#8004](https://github.com/rh-hideout/pokeemerald-expansion/pull/8004) +* Fixes Echoed Voice base power increase depending on attacker's use of the move by @PhallenTree in [#7997](https://github.com/rh-hideout/pokeemerald-expansion/pull/7997) +* Fixed Stomping Tantrum not doubling in damage if the user failed Protect by @AsparagusEduardo in [#8008](https://github.com/rh-hideout/pokeemerald-expansion/pull/8008) +* Fix badge boost not applying in gen1 and 2 by @FosterProgramming in [#8013](https://github.com/rh-hideout/pokeemerald-expansion/pull/8013) +* Fix toxic debris setting hazards on the wrong side when hit by an ally by @FosterProgramming in [#8026](https://github.com/rh-hideout/pokeemerald-expansion/pull/8026) +* Adds missing alive check for Rapid Spin by @AlexOn1ine in [#8024](https://github.com/rh-hideout/pokeemerald-expansion/pull/8024) +* Fixes visual glitch after Misty Explosion by @AlexOn1ine in [#8022](https://github.com/rh-hideout/pokeemerald-expansion/pull/8022) +* Fixes Protosynthesis not activating after weather was reset by @AlexOn1ine in [#8021](https://github.com/rh-hideout/pokeemerald-expansion/pull/8021) +* Fix Salt Cure script by @AlexOn1ine in [#8005](https://github.com/rh-hideout/pokeemerald-expansion/pull/8005) +* Fix emergency exit not triggering properly during wild battles by @FosterProgramming in [#8037](https://github.com/rh-hideout/pokeemerald-expansion/pull/8037) +* Fix target cancelling not working properly with z-move by @FosterProgramming in [#8067](https://github.com/rh-hideout/pokeemerald-expansion/pull/8067) +* Corrects battler partner identification in battle_ai_switch_items.c by @grintoul1 in [#8071](https://github.com/rh-hideout/pokeemerald-expansion/pull/8071) +* Fix Ally Switch being useable in Frontier Link Multi battles by @grintoul1 in [#8059](https://github.com/rh-hideout/pokeemerald-expansion/pull/8059) +* Fixes hazards and switch-in items not being reset when switching in by @PhallenTree in [#8074](https://github.com/rh-hideout/pokeemerald-expansion/pull/8074) +* Fixes Liquid Ooze dmg not blocked by Magic Guard by @AlexOn1ine in [#8036](https://github.com/rh-hideout/pokeemerald-expansion/pull/8036) +* Fix move description prompt window not appear when choosing a move after canceling target selection by @FosterProgramming in [#8055](https://github.com/rh-hideout/pokeemerald-expansion/pull/8055) +* Initialize DamageContext on declaration to zero by @AlexOn1ine in [#8076](https://github.com/rh-hideout/pokeemerald-expansion/pull/8076) +* Fixed Hunger Switch changing forms on switch out while Tera'd by @AsparagusEduardo in [#8080](https://github.com/rh-hideout/pokeemerald-expansion/pull/8080) +* Fixes Gooey/Tangling Hair ability pop up triggering on Clear Body by @AlexOn1ine in [#8083](https://github.com/rh-hideout/pokeemerald-expansion/pull/8083) +* Fixes intimidate activating on empty field by @AlexOn1ine in [#8058](https://github.com/rh-hideout/pokeemerald-expansion/pull/8058) +* Fix bug where mon selection doesn't properly account for party order by @FosterProgramming in [#8088](https://github.com/rh-hideout/pokeemerald-expansion/pull/8088) +* Fix bug when a captured pokemon replaces a party member who changed forms by @FosterProgramming in [#8091](https://github.com/rh-hideout/pokeemerald-expansion/pull/8091) +* Fixed Zygarde Complete disappearing upon catch by @AsparagusEduardo in [#8089](https://github.com/rh-hideout/pokeemerald-expansion/pull/8089) +* Initialize DamageContext struct with zero values by @AlexOn1ine in [#8107](https://github.com/rh-hideout/pokeemerald-expansion/pull/8107) + +## 🀹 Moves 🀹 +### Fixed +* Updated Mountain Gale's PP for Gen 9 by @fdeblasio in [#7856](https://github.com/rh-hideout/pokeemerald-expansion/pull/7856) +* Fix Brine move anim and document Water Spout anim by @ravepossum in [#7865](https://github.com/rh-hideout/pokeemerald-expansion/pull/7865) +* Add Struggle tests, weakness berry tests and prevent Struggle from activating Silk Scarf and Chilan Berry by @rayrobdod in [#7880](https://github.com/rh-hideout/pokeemerald-expansion/pull/7880) +* Fix Battle Anim monbg calls Part 1 by @ghoulslash in [#7906](https://github.com/rh-hideout/pokeemerald-expansion/pull/7906) +* Add missing end signal for AnimTask_SetAttackerInvisibleWaitForSignal by @hedara90 in [#7950](https://github.com/rh-hideout/pokeemerald-expansion/pull/7950) +* Fix Ally Switch being useable in Frontier Link Multi battles by @grintoul1 in [#8059](https://github.com/rh-hideout/pokeemerald-expansion/pull/8059) +* Fixed Belly Drum/Contrary interaction at max Attack by @AsparagusEduardo in [#8078](https://github.com/rh-hideout/pokeemerald-expansion/pull/8078) + +## 🎭 Abilities 🎭 +### Changed +* Tests for Battery ability by @grintoul1 in [#7846](https://github.com/rh-hideout/pokeemerald-expansion/pull/7846) +* Aura Break tests by @grintoul1 in [#8099](https://github.com/rh-hideout/pokeemerald-expansion/pull/8099) + +## 🧢 Items 🧢 +### Fixed +* Add gBallItemIds Array by @HashtagMarky in [#7905](https://github.com/rh-hideout/pokeemerald-expansion/pull/7905) +* Fix Persim Berry battle usage by @hedara90 in [#7963](https://github.com/rh-hideout/pokeemerald-expansion/pull/7963) + +## πŸ€– Battle AI πŸ€– +### Fixed +* Add failsafe to AI_DecideHoldEffectForTurn by @AlexOn1ine in [#7849](https://github.com/rh-hideout/pokeemerald-expansion/pull/7849) +* Fix some ai action check happening before the logic was computed by @FosterProgramming in [#7867](https://github.com/rh-hideout/pokeemerald-expansion/pull/7867) + - Roamers will now flee in the first turn of battle +* Fix ShouldPivot overwriting random memory by @DizzyEggg in [#7882](https://github.com/rh-hideout/pokeemerald-expansion/pull/7882) +* Fix AI seeing priority wrong for players choice lock by @MaximeGr00 in [#7899](https://github.com/rh-hideout/pokeemerald-expansion/pull/7899) +* fix (post-KO switch): force AI data recalc to see abilities on field correctly when pivot moves used by player by @ghostyboyy97 in [#7900](https://github.com/rh-hideout/pokeemerald-expansion/pull/7900) +* Add missing break to Power Split AI case by @ghoulslash in [#7959](https://github.com/rh-hideout/pokeemerald-expansion/pull/7959) + +## 🧹 Other Cleanup 🧹 +* Fix some failed and assume fail tests with `GEN_LATEST` = `GEN_5` by @AsparagusEduardo in [#7735](https://github.com/rh-hideout/pokeemerald-expansion/pull/7735) +* Update INSTALL.md by @RubyRaven6 in [#7852](https://github.com/rh-hideout/pokeemerald-expansion/pull/7852) +* Remove unnecessary EWRAM and IWRAM variables from the Window code by @estellarc in [#7897](https://github.com/rh-hideout/pokeemerald-expansion/pull/7897) +* Replace magic numbers with define'd values in field_player_avatar.c by @FosterProgramming in [#7910](https://github.com/rh-hideout/pokeemerald-expansion/pull/7910) +* Reverts wrongly applies fix to book.toml by @AlexOn1ine in [#8105](https://github.com/rh-hideout/pokeemerald-expansion/pull/8105) + +## πŸ§ͺ Test Runner πŸ§ͺ +### Changed +* Fix some failed and assume fail tests with `GEN_LATEST` = `GEN_5` by @AsparagusEduardo in [#7735](https://github.com/rh-hideout/pokeemerald-expansion/pull/7735) +* Tests for Battery ability by @grintoul1 in [#7846](https://github.com/rh-hideout/pokeemerald-expansion/pull/7846) +* Fixed fainting form change tests by @AsparagusEduardo in [#8079](https://github.com/rh-hideout/pokeemerald-expansion/pull/8079) +* Aura Break tests by @grintoul1 in [#8099](https://github.com/rh-hideout/pokeemerald-expansion/pull/8099) + +### Fixed +* Fix Knock Off not being restored and Wild Battles by @ghoulslash in [#7952](https://github.com/rh-hideout/pokeemerald-expansion/pull/7952) +* Fixes Shields Down incorrectly preventing status on Minior Core form by @PhallenTree in [#7968](https://github.com/rh-hideout/pokeemerald-expansion/pull/7968) +* Fixed Stomping Tantrum not doubling in damage if the user failed Protect by @AsparagusEduardo in [#8008](https://github.com/rh-hideout/pokeemerald-expansion/pull/8008) +* Fix stats defined in tests being overwritteng by stat change by @FosterProgramming in [#8018](https://github.com/rh-hideout/pokeemerald-expansion/pull/8018) + +## πŸ“š Documentation πŸ“š +* Update INSTALL.md by @RubyRaven6 in [#7852](https://github.com/rh-hideout/pokeemerald-expansion/pull/7852) +* Updated PR template to make existing credit policy clearer by @pkmnsnfrn in [#7864](https://github.com/rh-hideout/pokeemerald-expansion/pull/7864) +* Fix image links in doc site by @rayrobdod in [#7948](https://github.com/rh-hideout/pokeemerald-expansion/pull/7948) +* Add all pages in `docs` to doc website by @rayrobdod in [#7907](https://github.com/rh-hideout/pokeemerald-expansion/pull/7907) +* Relativize doc links, to fix links in docs site by @rayrobdod in [#7964](https://github.com/rh-hideout/pokeemerald-expansion/pull/7964) +* Fix docs compile issue by @AlexOn1ine in [#8101](https://github.com/rh-hideout/pokeemerald-expansion/pull/8101) +* Reverts wrongly applies fix to book.toml by @AlexOn1ine in [#8105](https://github.com/rh-hideout/pokeemerald-expansion/pull/8105) + +## New Contributors +* @HashtagMarky made their first contribution in [#7905](https://github.com/rh-hideout/pokeemerald-expansion/pull/7905) +* @MaximeGr00 made their first contribution in [#7899](https://github.com/rh-hideout/pokeemerald-expansion/pull/7899) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.13.2...expansion/1.13.3 + + + + diff --git a/docs/changelogs/1.13.x/1.13.4.md b/docs/changelogs/1.13.x/1.13.4.md new file mode 100644 index 000000000000..6884bbd95c0f --- /dev/null +++ b/docs/changelogs/1.13.x/1.13.4.md @@ -0,0 +1,213 @@ +```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.13.4 +`. +``` + + +## 🧬 General 🧬 +### Changed +* 1.13.3 release by @hedara90 in [#8109](https://github.com/rh-hideout/pokeemerald-expansion/pull/8109) +* Adds an auto-generated include file of script commands by @FosterProgramming in [#8156](https://github.com/rh-hideout/pokeemerald-expansion/pull/8156) +* Adjust label workflow to only run if PR is approved by @hedara90 in [#8183](https://github.com/rh-hideout/pokeemerald-expansion/pull/8183) +* Add include/constants/script_commands.h to gitignore by @AlexOn1ine in [#8169](https://github.com/rh-hideout/pokeemerald-expansion/pull/8169) +* add fdeblasio as a contributor for code by @allcontributors[bot] in [#8200](https://github.com/rh-hideout/pokeemerald-expansion/pull/8200) +* Adjust Canceler naming to contain only one l by @AlexOn1ine in [#8258](https://github.com/rh-hideout/pokeemerald-expansion/pull/8258) +* Pret merge (16th of November, 2025) by @AlexOn1ine in [#8262](https://github.com/rh-hideout/pokeemerald-expansion/pull/8262) +* *.party: text with lfs by @mrgriffin in [#8320](https://github.com/rh-hideout/pokeemerald-expansion/pull/8320) +* Fedora install instructions by @estellarc in [#8355](https://github.com/rh-hideout/pokeemerald-expansion/pull/8355) +* Indent unintented if statement by @hedara90 in [#8367](https://github.com/rh-hideout/pokeemerald-expansion/pull/8367) + +### Fixed +* Update mdbook to v0.5.0-beta.1 by @rayrobdod in [#8133](https://github.com/rh-hideout/pokeemerald-expansion/pull/8133) +* Fix wild_encounters script not closing arrays properly by @FosterProgramming in [#8123](https://github.com/rh-hideout/pokeemerald-expansion/pull/8123) +* Fix missing FREE_MATCH_CALL by @FosterProgramming in [#8171](https://github.com/rh-hideout/pokeemerald-expansion/pull/8171) +* Fix scroll prompt sometimes being off-screen with automatic line breaks by @hedara90 in [#8182](https://github.com/rh-hideout/pokeemerald-expansion/pull/8182) +* Fix gcc11 again by @AsparagusEduardo in [#8188](https://github.com/rh-hideout/pokeemerald-expansion/pull/8188) +* Fixed decompression error reporter OOB window creation by @hedara90 in [#8199](https://github.com/rh-hideout/pokeemerald-expansion/pull/8199) +* Fix error when compiling with P_FUSION_FORMS disabled by @cawtds in [#8298](https://github.com/rh-hideout/pokeemerald-expansion/pull/8298) +* Fix compile on gcc11 by @AlexOn1ine in [#8300](https://github.com/rh-hideout/pokeemerald-expansion/pull/8300) +* Fix debug battle flag never being cleared by @FosterProgramming in [#8357](https://github.com/rh-hideout/pokeemerald-expansion/pull/8357) + +## πŸ—ΊοΈ Overworld πŸ—ΊοΈ +### Changed +* Add additional comment explaing map name popup transparency side-effects by @FosterProgramming in [#8117](https://github.com/rh-hideout/pokeemerald-expansion/pull/8117) + +### Fixed +* Fix berry blender not computing flavor correctly by @FosterProgramming in [#8113](https://github.com/rh-hideout/pokeemerald-expansion/pull/8113) +* Allow vs seekers to work with script not starting with trainerbattle by @FosterProgramming in [#8062](https://github.com/rh-hideout/pokeemerald-expansion/pull/8062) + - VS seeker now work with trainers who don't start with trainer_battle. You can use `vsseeker_rematchid TRAINER_ID` to indicate that this NPC is a battling trainer and the game will fetch the appropriate rematch if necessary. ` vsseeker_rematchid` work like a `cant_see_if_trainerflag_set` with additional functionality to handle vs seeker. + All NPCs who don't start with either `vsseeker_rematchid` or `trainerbattle` will show as "X"/unmatchable by the vs seeker, so non-rematchable trainer who do not start with `trainerbattle may "lie" and not show an excalmation mark showing they haven't been fought yet. This can be fixed by including a `vsseeker_rematchid` for them too. +* Fix grade in summary screen not accounting for 26 IV by @FosterProgramming in [#8157](https://github.com/rh-hideout/pokeemerald-expansion/pull/8157) +* Fix match call regression by @FosterProgramming in [#8227](https://github.com/rh-hideout/pokeemerald-expansion/pull/8227) +* Fix mew sprite not appearing correctly by @FosterProgramming in [#8235](https://github.com/rh-hideout/pokeemerald-expansion/pull/8235) +* Fix wrong palette for types sprites in hgss dex after catching mon by @FosterProgramming in [#8153](https://github.com/rh-hideout/pokeemerald-expansion/pull/8153) +* Fix mirage tower ceiling crumble color by @FosterProgramming in [#8081](https://github.com/rh-hideout/pokeemerald-expansion/pull/8081) +* Fix light flickering when different types of light sprite are present by @FosterProgramming in [#8043](https://github.com/rh-hideout/pokeemerald-expansion/pull/8043) + - Light intensity of neon signs was reduced to avoid conflicts with other light sources + - Fix flickering when both neon signs and light ball are present on screen +* Bug Fix: NPC Followers not working on slow sideways stairs by @Bivurnum in [#8257](https://github.com/rh-hideout/pokeemerald-expansion/pull/8257) +* Fix not enough memory being allocated when moves load background in contests by @FosterProgramming in [#8284](https://github.com/rh-hideout/pokeemerald-expansion/pull/8284) +* Make MON_DATA_NICKNAME10 return a 10 character string by @FosterProgramming in [#8291](https://github.com/rh-hideout/pokeemerald-expansion/pull/8291) + - Fix bug where interviews would print bad data in their string +* Fix game freeze when trainers try to walk on sideway stairs by @FosterProgramming in [#8316](https://github.com/rh-hideout/pokeemerald-expansion/pull/8316) +* Fix tossing items applying to the wrong stack by @FosterProgramming in [#8282](https://github.com/rh-hideout/pokeemerald-expansion/pull/8282) +* Prevent moves to be changed when choosing half party by @FosterProgramming in [#8336](https://github.com/rh-hideout/pokeemerald-expansion/pull/8336) + +## πŸ‰ PokΓ©mon πŸ‰ +### Changed +* Fix Kyurem typo in swap move tables by @Bassoonian in [#8139](https://github.com/rh-hideout/pokeemerald-expansion/pull/8139) +* Fix typo in Voltorb-Hisui pokedex entry by @PhallenTree in [#8143](https://github.com/rh-hideout/pokeemerald-expansion/pull/8143) +* Fix some followers sprites by @estellarc in [#8208](https://github.com/rh-hideout/pokeemerald-expansion/pull/8208) + +## βš”οΈ Battle General βš”οΈ +### Changed +* Clean up redundant todo by @AlexOn1ine in [#8094](https://github.com/rh-hideout/pokeemerald-expansion/pull/8094) +* Powder Move blocking cleanup by @PhallenTree in [#8194](https://github.com/rh-hideout/pokeemerald-expansion/pull/8194) +* Restored encourageEncore flag to non-volatile status effects by @AsparagusEduardo in [#8387](https://github.com/rh-hideout/pokeemerald-expansion/pull/8387) + +### Fixed +* Allow to send active mon to PC when capturing a Pokemon by @FosterProgramming in [#8111](https://github.com/rh-hideout/pokeemerald-expansion/pull/8111) +* Fix transform not loading the correct sprites when facing shiny or unown by @FosterProgramming in [#8146](https://github.com/rh-hideout/pokeemerald-expansion/pull/8146) +* Fixes Receiver not immediately activating copied abilities by @PhallenTree in [#8162](https://github.com/rh-hideout/pokeemerald-expansion/pull/8162) +* Fix destiny knot behavior and add tests by @FosterProgramming in [#8174](https://github.com/rh-hideout/pokeemerald-expansion/pull/8174) +* Fix recharge moves + add recharge move tests by @FosterProgramming in [#8181](https://github.com/rh-hideout/pokeemerald-expansion/pull/8181) +* Fixes Magician for spread moves by @AlexOn1ine in [#8170](https://github.com/rh-hideout/pokeemerald-expansion/pull/8170) +* Fix tera tint not applying on activation by @FosterProgramming in [#8135](https://github.com/rh-hideout/pokeemerald-expansion/pull/8135) +* Fixes wrongly assigned count for Semi Invulnerable state by @AlexOn1ine in [#8175](https://github.com/rh-hideout/pokeemerald-expansion/pull/8175) +* Fixes Drain Punch / Parental Bond / Scale Shot interaction by @AlexOn1ine in [#8198](https://github.com/rh-hideout/pokeemerald-expansion/pull/8198) +* Fix wrong ditto sprite on capture by @FosterProgramming in [#8226](https://github.com/rh-hideout/pokeemerald-expansion/pull/8226) +* Fixed an issue related to same turn Encore targeting by @LinathanZel in [#8230](https://github.com/rh-hideout/pokeemerald-expansion/pull/8230) +* Fixes Shell Trap not activating on contact but no damage by @AlexOn1ine in [#8243](https://github.com/rh-hideout/pokeemerald-expansion/pull/8243) +* Fix Magic Coat reflecting hazard moves incorrectly when used by a partner by @moostoet in [#8272](https://github.com/rh-hideout/pokeemerald-expansion/pull/8272) + - Magic Coat now properly reflects hazard moves from either slot in double battles. +* Shell Trap tests and Fix for Encore interaction by @AlexOn1ine in [#8268](https://github.com/rh-hideout/pokeemerald-expansion/pull/8268) +* Fix max mushroom unable to be selected when one stat is maxed by @FosterProgramming in [#8287](https://github.com/rh-hideout/pokeemerald-expansion/pull/8287) +* Block selecting x items when contrary pokemon are at minimum stages by @FosterProgramming in [#8288](https://github.com/rh-hideout/pokeemerald-expansion/pull/8288) +* Fix Fur Coat affecting confusion self-damage by @moostoet in [#8267](https://github.com/rh-hideout/pokeemerald-expansion/pull/8267) + - Fix confusion self-damage ignoring defense/attack abilities such as Fur Coat. +* Fixes End Turn Speed Order by @AlexOn1ine in [#8289](https://github.com/rh-hideout/pokeemerald-expansion/pull/8289) +* Make switchout abilities trigger after a pokemon has returned to its ball by @FosterProgramming in [#8304](https://github.com/rh-hideout/pokeemerald-expansion/pull/8304) +* Fix Shed Shell allowing fleeing/teleporting and Smoke Ball failing to guarantee escape by @moostoet in [#8286](https://github.com/rh-hideout/pokeemerald-expansion/pull/8286) +* Fix bug where defiant/competitive would pass their stat change to the next target by @FosterProgramming in [#8312](https://github.com/rh-hideout/pokeemerald-expansion/pull/8312) +* Fix max move message against semi invulnerable target by @FosterProgramming in [#8313](https://github.com/rh-hideout/pokeemerald-expansion/pull/8313) +* Fixes Neutralizing Gas displaying message when exiting with multiple users by @PhallenTree in [#8318](https://github.com/rh-hideout/pokeemerald-expansion/pull/8318) +* Fix Kings Rock not being ignored by flinch moves by @AlexOn1ine in [#8327](https://github.com/rh-hideout/pokeemerald-expansion/pull/8327) +* Fix Protosynthesis stat boosts ignoring speed drops by @moostoet in [#8277](https://github.com/rh-hideout/pokeemerald-expansion/pull/8277) + - Protosynthesis and Quark Drive now recalculate their boosted stat when Speed is lowered or Neutralizing Gas temporarily disables the ability. +* Fix switch-in abilities not triggering on revive by @FosterProgramming in [#8293](https://github.com/rh-hideout/pokeemerald-expansion/pull/8293) +* More Neutralizing Gas cleanup by @PhallenTree in [#8335](https://github.com/rh-hideout/pokeemerald-expansion/pull/8335) +* Fix cure status item effect not working properly in doubles by @FosterProgramming in [#8339](https://github.com/rh-hideout/pokeemerald-expansion/pull/8339) +* Fix infinite confusion (berserk gene) not being cured by cure_status bag items by @FosterProgramming in [#8343](https://github.com/rh-hideout/pokeemerald-expansion/pull/8343) +* Fix `B_PHYSICAL_SPECIAL_SPLIT` when set to Gen 4 by @AsparagusEduardo in [#8348](https://github.com/rh-hideout/pokeemerald-expansion/pull/8348) +* Refactor Beat Up handling for Gen 3/4 defaults, fix crit check, and expand test coverage by @moostoet in [#8307](https://github.com/rh-hideout/pokeemerald-expansion/pull/8307) + - BUGFIX: Beat Up (`GEN =< 5`) now no longer doubles its damage on every non-critical hit + - Beat Up now precomputes eligible party members/strikers for consistent multi-hit resolution and expanded tests covering both pre-Gen5 and Gen5+ rules +* Fix substitute graphic not disappearing after using a pivor move by @FosterProgramming in [#8340](https://github.com/rh-hideout/pokeemerald-expansion/pull/8340) +* Fixes Beak Blast burning after Beak Blast was already used by @PhallenTree in [#8361](https://github.com/rh-hideout/pokeemerald-expansion/pull/8361) +* Fix Roar not being recorded for LastUsedMove by @AlexOn1ine in [#8362](https://github.com/rh-hideout/pokeemerald-expansion/pull/8362) +* Fixes Neutralizing Gas / Mold Breaker / Dragon Darts interaction by @AlexOn1ine in [#8389](https://github.com/rh-hideout/pokeemerald-expansion/pull/8389) +* Fixes battle tv overwriting damage values by @AlexOn1ine in [#8378](https://github.com/rh-hideout/pokeemerald-expansion/pull/8378) +* Fix ball cycling not working properly when the same ball take multiple bag slots by @FosterProgramming in [#8163](https://github.com/rh-hideout/pokeemerald-expansion/pull/8163) + - Two new defines added to items.h `FIRST_BALL_INDEX` and `LAST_BALL_INDEX` + - We now assume the indexes of all regular ball usable in wild battle have consecutive indexes and some features (throw ball shortcut in battle) might break if not true + +## 🀹 Moves 🀹 +### Changed +* Fixed Uproar's description and spacing by @fdeblasio in [#8187](https://github.com/rh-hideout/pokeemerald-expansion/pull/8187) +* Clean usage of gMovesInfo by @AsparagusEduardo in [#8234](https://github.com/rh-hideout/pokeemerald-expansion/pull/8234) + - Also, fixed an OOB in `HasMoveThatChangesKOThreshold` +* Make tailwind anim mirror based on side by @FosterProgramming in [#8249](https://github.com/rh-hideout/pokeemerald-expansion/pull/8249) +* Make rainbow effect anim change based on side by @FosterProgramming in [#8269](https://github.com/rh-hideout/pokeemerald-expansion/pull/8269) + - Art assets by [SonikkuA-DatH](https://github.com/SonikkuA-DatH) +* Update Lash Out description to clarify its effect by @PhallenTree in [#8372](https://github.com/rh-hideout/pokeemerald-expansion/pull/8372) + +### Fixed +* Fix some move animations leaking VRAM and freeing already freed tags by @hedara90 in [#7977](https://github.com/rh-hideout/pokeemerald-expansion/pull/7977) + +## 🧢 Items 🧢 +### Fixed +* Allow vs seekers to work with script not starting with trainerbattle by @FosterProgramming in [#8062](https://github.com/rh-hideout/pokeemerald-expansion/pull/8062) + - VS seeker now work with trainers who don't start with trainer_battle. You can use `vsseeker_rematchid TRAINER_ID` to indicate that this NPC is a battling trainer and the game will fetch the appropriate rematch if necessary. ` vsseeker_rematchid` work like a `cant_see_if_trainerflag_set` with additional functionality to handle vs seeker. + All NPCs who don't start with either `vsseeker_rematchid` or `trainerbattle` will show as "X"/unmatchable by the vs seeker, so non-rematchable trainer who do not start with `trainerbattle may "lie" and not show an excalmation mark showing they haven't been fought yet. This can be fixed by including a `vsseeker_rematchid` for them too. + +## πŸ€– Battle AI πŸ€– +### Fixed +* fix (AI scoring): shield dust considerations, IsMoveEffectInMinus self effect edge case, hitsToKO zero-case consideration by @ghostyboyy97 in [#8126](https://github.com/rh-hideout/pokeemerald-expansion/pull/8126) + - The AI now sees Shield Dust on the player's Pokemon correctly + - The AI now sees self-targeted positive effect boosts correctly +* fix (contrary): Contrary stat down handling in MoveEffectInPlus by @ghostyboyy97 in [#8165](https://github.com/rh-hideout/pokeemerald-expansion/pull/8165) + - When comparing positive move effects in damaging move comparison, the AI will correctly see moves like Leaf Storm as beneficial if their Pokemon has Contrary. +* Added check for parental bond killing through sturdy by @MaximeGr00 in [#8206](https://github.com/rh-hideout/pokeemerald-expansion/pull/8206) + AI now accounts for Parental Bond when checking if a move can ko the player through sturdy/focus sash. +* Fix AI_FLAG_DOUBLE_ACE_POKEMON sending duplicate PokΓ©mon in doubles by @moostoet in [#8279](https://github.com/rh-hideout/pokeemerald-expansion/pull/8279) + - Fixed AI_FLAG_DOUBLE_ACE_POKEMON trainers resending the same PokΓ©mon after a KO instead of their two Ace PokΓ©mon in double battles. +* Fix switchin KO threshold logic by @Pawkkie in [#8370](https://github.com/rh-hideout/pokeemerald-expansion/pull/8370) + +## 🧹 Other Cleanup 🧹 +* Clean up redundant todo by @AlexOn1ine in [#8094](https://github.com/rh-hideout/pokeemerald-expansion/pull/8094) +* Fix Kyurem typo in swap move tables by @Bassoonian in [#8139](https://github.com/rh-hideout/pokeemerald-expansion/pull/8139) +* Fix typo in Voltorb-Hisui pokedex entry by @PhallenTree in [#8143](https://github.com/rh-hideout/pokeemerald-expansion/pull/8143) +* Fixed Uproar's description and spacing by @fdeblasio in [#8187](https://github.com/rh-hideout/pokeemerald-expansion/pull/8187) +* Add include/constants/script_commands.h to gitignore by @AlexOn1ine in [#8169](https://github.com/rh-hideout/pokeemerald-expansion/pull/8169) +* Powder Move blocking cleanup by @PhallenTree in [#8194](https://github.com/rh-hideout/pokeemerald-expansion/pull/8194) +* Clean usage of gMovesInfo by @AsparagusEduardo in [#8234](https://github.com/rh-hideout/pokeemerald-expansion/pull/8234) + - Also, fixed an OOB in `HasMoveThatChangesKOThreshold` +* Adjust Canceler naming to contain only one l by @AlexOn1ine in [#8258](https://github.com/rh-hideout/pokeemerald-expansion/pull/8258) +* Fix wrongly renamed logs by @AlexOn1ine in [#8264](https://github.com/rh-hideout/pokeemerald-expansion/pull/8264) +* Tests for Max Moves already exist by @AlexOn1ine in [#8314](https://github.com/rh-hideout/pokeemerald-expansion/pull/8314) +* Use MAP_OFFSET by @estellarc in [#8328](https://github.com/rh-hideout/pokeemerald-expansion/pull/8328) +* Fixed broken friendship from items in battle test and added new test for opposite case by @pkmnsnfrn in [#7872](https://github.com/rh-hideout/pokeemerald-expansion/pull/7872) +* Indent unintented if statement by @hedara90 in [#8367](https://github.com/rh-hideout/pokeemerald-expansion/pull/8367) +* Update Lash Out description to clarify its effect by @PhallenTree in [#8372](https://github.com/rh-hideout/pokeemerald-expansion/pull/8372) +* Restored encourageEncore flag to non-volatile status effects by @AsparagusEduardo in [#8387](https://github.com/rh-hideout/pokeemerald-expansion/pull/8387) + +## πŸ§ͺ Test Runner πŸ§ͺ +### Added +* Prevent EXPECT functions from casting negative numbers into unsigned by @FosterProgramming in [#7866](https://github.com/rh-hideout/pokeemerald-expansion/pull/7866) + +### Changed +* Added Soundproof and Bulletproof tests by @AsparagusEduardo in [#8189](https://github.com/rh-hideout/pokeemerald-expansion/pull/8189) +* Wrote some missing tests by @AsparagusEduardo in [#8203](https://github.com/rh-hideout/pokeemerald-expansion/pull/8203) +* A couple more tests by @AsparagusEduardo in [#8209](https://github.com/rh-hideout/pokeemerald-expansion/pull/8209) +* Fixed some failing tests with GEN_LATEST = GEN_5 by @AsparagusEduardo in [#8241](https://github.com/rh-hideout/pokeemerald-expansion/pull/8241) +* Add test for mold breaker/ice scales interaction by @FosterProgramming in [#8240](https://github.com/rh-hideout/pokeemerald-expansion/pull/8240) +* Yet more tests by @AsparagusEduardo in [#8228](https://github.com/rh-hideout/pokeemerald-expansion/pull/8228) + - Added tests for: + - Dark Aura + - Fairy Aura + - Flare Boost + - Toxic Boost + - Added test names for Flying Press. +* Slightly increase headless test speed by modifying animations by @AsparagusEduardo in [#8299](https://github.com/rh-hideout/pokeemerald-expansion/pull/8299) +* Make `gTestRunnerHeadless` into a constant outside of tests by @hedara90 in [#8306](https://github.com/rh-hideout/pokeemerald-expansion/pull/8306) +* Tests for Max Moves already exist by @AlexOn1ine in [#8314](https://github.com/rh-hideout/pokeemerald-expansion/pull/8314) +* Finished fixing tests when setting `GEN_LATEST` to `GEN_5` by @AsparagusEduardo in [#8263](https://github.com/rh-hideout/pokeemerald-expansion/pull/8263) +* Wrote missing Fling tests by @AsparagusEduardo in [#8383](https://github.com/rh-hideout/pokeemerald-expansion/pull/8383) + +### Fixed +* Fixes difficulty not being restored after tests by @grintoul1 in [#8129](https://github.com/rh-hideout/pokeemerald-expansion/pull/8129) +* Reset saveblock data between test runs by @hedara90 in [#8145](https://github.com/rh-hideout/pokeemerald-expansion/pull/8145) +* Fix ohko moves ai tests by @FosterProgramming in [#8309](https://github.com/rh-hideout/pokeemerald-expansion/pull/8309) +* Fixed broken friendship from items in battle test and added new test for opposite case by @pkmnsnfrn in [#7872](https://github.com/rh-hideout/pokeemerald-expansion/pull/7872) +* Add tests to verify aromatherapy is not affected by heal bell config by @FosterProgramming in [#8344](https://github.com/rh-hideout/pokeemerald-expansion/pull/8344) +* Pre gen 5 encored move now signals the test engine a move is happening by @FosterProgramming in [#8338](https://github.com/rh-hideout/pokeemerald-expansion/pull/8338) +* Refactor Beat Up handling for Gen 3/4 defaults, fix crit check, and expand test coverage by @moostoet in [#8307](https://github.com/rh-hideout/pokeemerald-expansion/pull/8307) + - BUGFIX: Beat Up (`GEN =< 5`) now no longer doubles its damage on every non-critical hit + - Beat Up now precomputes eligible party members/strikers for consistent multi-hit resolution and expanded tests covering both pre-Gen5 and Gen5+ rules +* Fix known failing AI trace test by @FosterProgramming in [#8337](https://github.com/rh-hideout/pokeemerald-expansion/pull/8337) + +## πŸ“š Documentation πŸ“š +* Lock mdbook to v0.4.35 to fix docs not building by @grintoul1 in [#8130](https://github.com/rh-hideout/pokeemerald-expansion/pull/8130) +* Add additional comment explaing map name popup transparency side-effects by @FosterProgramming in [#8117](https://github.com/rh-hideout/pokeemerald-expansion/pull/8117) +* Fix wrongly renamed logs by @AlexOn1ine in [#8264](https://github.com/rh-hideout/pokeemerald-expansion/pull/8264) +* Use MAP_OFFSET by @estellarc in [#8328](https://github.com/rh-hideout/pokeemerald-expansion/pull/8328) +* Fedora install instructions by @estellarc in [#8355](https://github.com/rh-hideout/pokeemerald-expansion/pull/8355) + + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.13.3...expansion/1.13.4 + + + + diff --git a/docs/changelogs/1.14.x/1.14.0.md b/docs/changelogs/1.14.x/1.14.0.md new file mode 100644 index 000000000000..3a75d35e6ec1 --- /dev/null +++ b/docs/changelogs/1.14.x/1.14.0.md @@ -0,0 +1,534 @@ +```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.14.0 +`. +``` + +## πŸŒ‹ *REFACTORS* πŸŒ‹ +πŸ“œ = Uses a migration script. +* Refactors Attackstring and PP deduction by @AlexOn1ine in [#7402](https://github.com/rh-hideout/pokeemerald-expansion/pull/7402) +* Attackcanceller fixes and improvements by @AlexOn1ine in [#7698](https://github.com/rh-hideout/pokeemerald-expansion/pull/7698) +* Fixes activation order for a couple abilities by @AlexOn1ine in [#7732](https://github.com/rh-hideout/pokeemerald-expansion/pull/7732) +* feat: change defines in `constants/abilities.h` to an enum by @khbsd in [#7006](https://github.com/rh-hideout/pokeemerald-expansion/pull/7006) +* Item battle effect refactor by @AlexOn1ine in [#7857](https://github.com/rh-hideout/pokeemerald-expansion/pull/7857) +* Optimize GetWhichBattlerFasterOrTies by @AlexOn1ine in [#7953](https://github.com/rh-hideout/pokeemerald-expansion/pull/7953) +* Decouple passive hp updates from move damage updates by @AlexOn1ine in [#7942](https://github.com/rh-hideout/pokeemerald-expansion/pull/7942) +* Make movelist calculations happen during compilation instead of runtime by @FosterProgramming in [#7967](https://github.com/rh-hideout/pokeemerald-expansion/pull/7967) + - tmIlliterate flag in speciesInfo changed to teachingType. The options are `DEFAULT_LEARNING`, `TM_ILLITERATE` and `ALL_TEACHABLES`. The first two options match the tmIlliterate = false and tmIlliterate = true while the third one allow a pokemon to learn all teachables similarly to Mew + - Reduce EWRAM usage of HGSS dex + - Fix pokemon.c needing to be recompiled everytime a .inc file was changed + - P_TUTOR_MOVES_ARRAY has been removed (now always true when HGSS dex is enabled) + - Mew move teaching exception and univeral moves are now coded in the JSON file `src/data/pokemon/special_movesets.json` under the name signatureTeachables and universalMoves +* Grudge, Destiny Bond and FaintBattler refactor by @AlexOn1ine in [#8072](https://github.com/rh-hideout/pokeemerald-expansion/pull/8072) +* Increase number of additional move effects by @AlexOn1ine in [#8149](https://github.com/rh-hideout/pokeemerald-expansion/pull/8149) +* πŸ“œ update: time-based encounters system tuneup and @cawtds' header script by @khbsd in [#8158](https://github.com/rh-hideout/pokeemerald-expansion/pull/8158) +* Refactor random functions to be runner specific by @FosterProgramming in [#7816](https://github.com/rh-hideout/pokeemerald-expansion/pull/7816) + +## 🧬 General 🧬 +### Added +* Battle debug menu: highlight chosen action and change separator by @grintoul1 in [#7709](https://github.com/rh-hideout/pokeemerald-expansion/pull/7709) +* Implement `field_name_box` by @mudskipper13 in [#7697](https://github.com/rh-hideout/pokeemerald-expansion/pull/7697) +* Add new actions to Debug Menu by @FosterProgramming in [#7837](https://github.com/rh-hideout/pokeemerald-expansion/pull/7837) + - Adds an action to change a Pokemon ability in the party side of the Debug Menu + - Adds an action to set the friendship of a Pokemon in the party side of the Debug Menu + +* Display TM/HM's move name in the debug menu by @estellarc in [#7994](https://github.com/rh-hideout/pokeemerald-expansion/pull/7994) + +### Changed +* Text rendering optimizations by @mrgriffin in [#7497](https://github.com/rh-hideout/pokeemerald-expansion/pull/7497) +* Battle debug menu now checks correct parties depending on battler party by @grintoul1 in [#7652](https://github.com/rh-hideout/pokeemerald-expansion/pull/7652) +* Add make release target by @jschoeny in [#7296](https://github.com/rh-hideout/pokeemerald-expansion/pull/7296) + - Most of what's above. But most importantly, that normal `make` will have all the debug stuff enabled and so releases should be done with `make release`. +* Add pool rules for Mega Stones and Z-Crystals by @hedara90 in [#7720](https://github.com/rh-hideout/pokeemerald-expansion/pull/7720) +* `field_name_box` smol followup by @mudskipper13 in [#7762](https://github.com/rh-hideout/pokeemerald-expansion/pull/7762) +* Added COMPOUND_STRINGs to region_map_entries.h by @fdeblasio in [#7669](https://github.com/rh-hideout/pokeemerald-expansion/pull/7669) +* Improve ability/heldEffect access for IsBattlerGrounded func by @AlexOn1ine in [#7753](https://github.com/rh-hideout/pokeemerald-expansion/pull/7753) +* Removed `SAVE_TYPE_ERROR_SCREEN` config by @AsparagusEduardo in [#7836](https://github.com/rh-hideout/pokeemerald-expansion/pull/7836) +* Give the Coin Case when coins are maxed by @estellarc in [#7973](https://github.com/rh-hideout/pokeemerald-expansion/pull/7973) +* Revert HGSS dex and movelist changes by @FosterProgramming in [#8016](https://github.com/rh-hideout/pokeemerald-expansion/pull/8016) +* Converts some defines to enums and name unnamed enums by @Bassoonian in [#8019](https://github.com/rh-hideout/pokeemerald-expansion/pull/8019) +* Some more documentation and cleanup by @Bassoonian in [#8020](https://github.com/rh-hideout/pokeemerald-expansion/pull/8020) +* Even more enums and documentation by @Bassoonian in [#8029](https://github.com/rh-hideout/pokeemerald-expansion/pull/8029) +* Add type enum by @Bassoonian in [#8054](https://github.com/rh-hideout/pokeemerald-expansion/pull/8054) +* Minor clean up in menu.c by @estellarc in [#8060](https://github.com/rh-hideout/pokeemerald-expansion/pull/8060) +* Adds an auto-generated include file of script commands by @FosterProgramming in [#8156](https://github.com/rh-hideout/pokeemerald-expansion/pull/8156) +* Master to upcoming merge 20251107 by @grintoul1 in [#8167](https://github.com/rh-hideout/pokeemerald-expansion/pull/8167) +* porymap default settings by @FosterProgramming in [#8038](https://github.com/rh-hideout/pokeemerald-expansion/pull/8038) + - WARNING: A change was made for new projects map files to match poymap output. This change might break people's projects with existing versions of those files. The files affected are ` data/maps/map_groups.json`, `src/data/heal_locations.json`, `src/data/region_map/region_map_sections.json` and `src/data/wild_encounters.json` + If you have an issue with one of those files during the merging process, you should run this command + `git checkout HEAD -- ` + which will reset the file to the version before you initiated the merge +* Adjust label workflow to only run if PR is approved by @hedara90 in [#8183](https://github.com/rh-hideout/pokeemerald-expansion/pull/8183) +* Add include/constants/script_commands.h to gitignore by @AlexOn1ine in [#8169](https://github.com/rh-hideout/pokeemerald-expansion/pull/8169) +* Converted landmarks to COMPOUND_STRINGs by @fdeblasio in [#8205](https://github.com/rh-hideout/pokeemerald-expansion/pull/8205) +* Added contest config and cleaned up contest category variables by @fdeblasio in [#8178](https://github.com/rh-hideout/pokeemerald-expansion/pull/8178) +* Moves name box configs into a new file by @AlexOn1ine in [#8250](https://github.com/rh-hideout/pokeemerald-expansion/pull/8250) +* Converted options text into COMPOUND_STRINGs by @fdeblasio in [#8248](https://github.com/rh-hideout/pokeemerald-expansion/pull/8248) +* Adjust Canceler naming to contain only one l by @AlexOn1ine in [#8258](https://github.com/rh-hideout/pokeemerald-expansion/pull/8258) +* Pret merge (16th of November, 2025) by @AlexOn1ine in [#8262](https://github.com/rh-hideout/pokeemerald-expansion/pull/8262) +* Fixed bKGD for last_used_ball_r_cycle.png by @montmoguri in [#8261](https://github.com/rh-hideout/pokeemerald-expansion/pull/8261) +* Small bg drawing optimization by @estellarc in [#8259](https://github.com/rh-hideout/pokeemerald-expansion/pull/8259) +* Added missing 'coolness' string by @fdeblasio in [#8274](https://github.com/rh-hideout/pokeemerald-expansion/pull/8274) +* *.party: text with lfs by @mrgriffin in [#8320](https://github.com/rh-hideout/pokeemerald-expansion/pull/8320) +* Fedora install instructions by @estellarc in [#8355](https://github.com/rh-hideout/pokeemerald-expansion/pull/8355) +* Indent unintented if statement by @hedara90 in [#8367](https://github.com/rh-hideout/pokeemerald-expansion/pull/8367) + +### Fixed +* Added brackets where needed by @hedara90 in [#7781](https://github.com/rh-hideout/pokeemerald-expansion/pull/7781) +* Fix shiny stars being freed before shiny animation was played by @FosterProgramming in [#7917](https://github.com/rh-hideout/pokeemerald-expansion/pull/7917) + - Fixes shiny sparks in battle not appearing properly in rare circumstances (more common with various speedup options) +* Make movelist calculations happen during compilation instead of runtime by @FosterProgramming in [#7967](https://github.com/rh-hideout/pokeemerald-expansion/pull/7967) + - tmIlliterate flag in speciesInfo changed to teachingType. The options are `DEFAULT_LEARNING`, `TM_ILLITERATE` and `ALL_TEACHABLES`. The first two options match the tmIlliterate = false and tmIlliterate = true while the third one allow a pokemon to learn all teachables similarly to Mew + - Reduce EWRAM usage of HGSS dex + - Fix pokemon.c needing to be recompiled everytime a .inc file was changed + - P_TUTOR_MOVES_ARRAY has been removed (now always true when HGSS dex is enabled) + - Mew move teaching exception and univeral moves are now coded in the JSON file `src/data/pokemon/special_movesets.json` under the name signatureTeachables and universalMoves +* Fix unhandled config in hgss dex by @FosterProgramming in [#7999](https://github.com/rh-hideout/pokeemerald-expansion/pull/7999) +* Fixes compilation error due to #8002 by @AlexOn1ine in [#8050](https://github.com/rh-hideout/pokeemerald-expansion/pull/8050) +* Fix compile issue in gcc 11 by @AsparagusEduardo in [#8095](https://github.com/rh-hideout/pokeemerald-expansion/pull/8095) +* Update mdbook to v0.5.0-beta.1 by @rayrobdod in [#8133](https://github.com/rh-hideout/pokeemerald-expansion/pull/8133) +* Fix build failing with NOOPT=1 due to discarding static data. by @Ultimate-Bob in [#8053](https://github.com/rh-hideout/pokeemerald-expansion/pull/8053) +* Fix wild_encounters script not closing arrays properly by @FosterProgramming in [#8123](https://github.com/rh-hideout/pokeemerald-expansion/pull/8123) +* Fix missing FREE_MATCH_CALL by @FosterProgramming in [#8171](https://github.com/rh-hideout/pokeemerald-expansion/pull/8171) +* Again fixed compiling in GCC11 by @AsparagusEduardo in [#8184](https://github.com/rh-hideout/pokeemerald-expansion/pull/8184) +* Fix scroll prompt sometimes being off-screen with automatic line breaks by @hedara90 in [#8182](https://github.com/rh-hideout/pokeemerald-expansion/pull/8182) +* Fix gcc11 again by @AsparagusEduardo in [#8188](https://github.com/rh-hideout/pokeemerald-expansion/pull/8188) +* Fixed decompression error reporter OOB window creation by @hedara90 in [#8199](https://github.com/rh-hideout/pokeemerald-expansion/pull/8199) +* Fix error when compiling with P_FUSION_FORMS disabled by @cawtds in [#8298](https://github.com/rh-hideout/pokeemerald-expansion/pull/8298) +* Fix compile on gcc11 by @AlexOn1ine in [#8300](https://github.com/rh-hideout/pokeemerald-expansion/pull/8300) +* Fix debug battle flag never being cleared by @FosterProgramming in [#8357](https://github.com/rh-hideout/pokeemerald-expansion/pull/8357) + +## πŸ—ΊοΈ Overworld πŸ—ΊοΈ +### Added +* New Feature: ORAS Dowsing by @Bivurnum in [#7211](https://github.com/rh-hideout/pokeemerald-expansion/pull/7211) + - Added ORAS Dowsing Machine mechanics. +* feat: adds stevebeller's instant text and MandL27's faster text printing by @khbsd in [#8063](https://github.com/rh-hideout/pokeemerald-expansion/pull/8063) +* Implement GSC berry/apricorn tree functionality. by @GraionDilach in [#7777](https://github.com/rh-hideout/pokeemerald-expansion/pull/7777) + - Implement GSC berry/apricorn tree functionality. + +### Changed +* Trainers trigger in local id order by @grintoul1 in [#7424](https://github.com/rh-hideout/pokeemerald-expansion/pull/7424) +* Added regional form evolution condition by @AsparagusEduardo in [#6990](https://github.com/rh-hideout/pokeemerald-expansion/pull/6990) +* Update fishing odds to match official games by @FosterProgramming in [#7574](https://github.com/rh-hideout/pokeemerald-expansion/pull/7574) + - (BREAKING!) Fishing config has been moved to a new file. If you did not use default config fishing, make sure to reapply your config settings in the new file. + - (WARNING!) If you wrote custom code that calls one the following function, you may need to include `fishing.h` to get access to them(their functionaly was not affected): + - `StartFishing`previously defined in `field_player_avatar.h` + - `CalculateChainFishingShinyRolls` previously_defined in `wild_encounter.h` + - Adds a new config option to increase fish bite chance in morning and evening to match XY + - Modifies the way fishing "proximity boost" is calculated to match XY + - Fix Sticky Hold / Suction Cups bug which were increasing odds the wrong way +* Add additional comment explaing map name popup transparency side-effects by @FosterProgramming in [#8117](https://github.com/rh-hideout/pokeemerald-expansion/pull/8117) +* update: time-based encounters system tuneup and @cawtds' header script by @khbsd in [#8158](https://github.com/rh-hideout/pokeemerald-expansion/pull/8158) +* Sets instant text speed flag to false by default by @khbsd in [#8179](https://github.com/rh-hideout/pokeemerald-expansion/pull/8179) +* Follower NPCs no longer move if the player would be forced back onto the same tile. by @Bivurnum in [#8260](https://github.com/rh-hideout/pokeemerald-expansion/pull/8260) + - Follower NPCs no longer move if the player would be forced back onto the same tile + +### Fixed +* CheckForTrainersWantingBattle trainerObjects array now initialized to zero and loop now starts at zero by @grintoul1 in [#7765](https://github.com/rh-hideout/pokeemerald-expansion/pull/7765) +* Bugfix `setspeaker` Namebox not beign drawn correctly by @estellarc in [#7771](https://github.com/rh-hideout/pokeemerald-expansion/pull/7771) +* Banned species list by @FosterProgramming in [#8003](https://github.com/rh-hideout/pokeemerald-expansion/pull/8003) + - Add a window displaying caught banned species list in the Battle Frontier instead of the string detailing all the is +* Fix namebox bug when reloading the map mid-script by @FosterProgramming in [#8073](https://github.com/rh-hideout/pokeemerald-expansion/pull/8073) +* Fix copyvar instead of setvar causing issue with LTO by @FosterProgramming in [#8097](https://github.com/rh-hideout/pokeemerald-expansion/pull/8097) +* Fix berry blender not computing flavor correctly by @FosterProgramming in [#8113](https://github.com/rh-hideout/pokeemerald-expansion/pull/8113) +* Allow vs seekers to work with script not starting with trainerbattle by @FosterProgramming in [#8062](https://github.com/rh-hideout/pokeemerald-expansion/pull/8062) + - VS seeker now work with trainers who don't start with trainer_battle. You can use `vsseeker_rematchid TRAINER_ID` to indicate that this NPC is a battling trainer and the game will fetch the appropriate rematch if necessary. ` vsseeker_rematchid` work like a `cant_see_if_trainerflag_set` with additional functionality to handle vs seeker. + - All NPCs who don't start with either `vsseeker_rematchid` or `trainerbattle` will show as "X"/unmatchable by the vs seeker, so non-rematchable trainer who do not start with `trainerbattle may "lie" and not show an excalmation mark showing they haven't been fought yet. This can be fixed by including a `vsseeker_rematchid` for them too. +* Fix grade in summary screen not accounting for 26 IV by @FosterProgramming in [#8157](https://github.com/rh-hideout/pokeemerald-expansion/pull/8157) +* Fix match call regression by @FosterProgramming in [#8227](https://github.com/rh-hideout/pokeemerald-expansion/pull/8227) +* Fix mew sprite not appearing correctly by @FosterProgramming in [#8235](https://github.com/rh-hideout/pokeemerald-expansion/pull/8235) +* Fix wrong palette for types sprites in hgss dex after catching mon by @FosterProgramming in [#8153](https://github.com/rh-hideout/pokeemerald-expansion/pull/8153) +* Fix Apricorns with OW_SHOW_ITEM_DESCRIPTIONS not off by @hedara90 in [#8253](https://github.com/rh-hideout/pokeemerald-expansion/pull/8253) +* Fix mirage tower ceiling crumble color by @FosterProgramming in [#8081](https://github.com/rh-hideout/pokeemerald-expansion/pull/8081) +* Fix light flickering when different types of light sprite are present by @FosterProgramming in [#8043](https://github.com/rh-hideout/pokeemerald-expansion/pull/8043) + - Light intensity of neon signs was reduced to avoid conflicts with other light sources + - Fix flickering when both neon signs and light ball are present on screen +* Bug Fix: NPC Followers not working on slow sideways stairs by @Bivurnum in [#8257](https://github.com/rh-hideout/pokeemerald-expansion/pull/8257) + - Fixed NPC followers on slow sideways stairs +* Fix not enough memory being allocated when moves load background in contests by @FosterProgramming in [#8284](https://github.com/rh-hideout/pokeemerald-expansion/pull/8284) +* Make MON_DATA_NICKNAME10 return a 10 character string by @FosterProgramming in [#8291](https://github.com/rh-hideout/pokeemerald-expansion/pull/8291) + - Fix bug where interviews would print bad data in their string +* Fix game freeze when trainers try to walk on sideway stairs by @FosterProgramming in [#8316](https://github.com/rh-hideout/pokeemerald-expansion/pull/8316) +* Fix tossing items applying to the wrong stack by @FosterProgramming in [#8282](https://github.com/rh-hideout/pokeemerald-expansion/pull/8282) +* Prevent moves to be changed when choosing half party by @FosterProgramming in [#8336](https://github.com/rh-hideout/pokeemerald-expansion/pull/8336) + +## πŸ‰ PokΓ©mon πŸ‰ +### Added +* Add Legends Z-A content by @Bassoonian in [#7935](https://github.com/rh-hideout/pokeemerald-expansion/pull/7935) + * To retain compatibility with your new items and species, make sure to move the new additions behind your own additions. + * The save block will shift if you have enabled `USE_DEXNAV_SEARCH_LEVELS` (due to the new species) or if `OW_SHOW_ITEM_DESCRIPTIONS` is set to `OW_ITEM_DESCRIPTIONS_FIRST_TIME` (due to the new items). +* Move Relearners for TMs, Tutors and Egg moves by @PCG06 in [#8040](https://github.com/rh-hideout/pokeemerald-expansion/pull/8040) + - Increased the size of `MAX_RELEARNER_MOVES` to 60 to prevent crashes when viewing Mew. + +### Changed +* Nickit & Thievul visual revamp by @purrfectdoodle in [#7689](https://github.com/rh-hideout/pokeemerald-expansion/pull/7689) +* Fix Kyurem typo in swap move tables by @Bassoonian in [#8139](https://github.com/rh-hideout/pokeemerald-expansion/pull/8139) +* Fix typo in Voltorb-Hisui pokedex entry by @PhallenTree in [#8143](https://github.com/rh-hideout/pokeemerald-expansion/pull/8143) +* Fix some followers sprites by @estellarc in [#8208](https://github.com/rh-hideout/pokeemerald-expansion/pull/8208) + +### Fixed +* Fix gba sprites trying load non existent female versions by @FosterProgramming in [#7996](https://github.com/rh-hideout/pokeemerald-expansion/pull/7996) + - Fixes issues with pokemon getting gender differences in later gens when using gen3 sprite config +* GetEggSpecies: Only enabled species by @mrgriffin in [#8221](https://github.com/rh-hideout/pokeemerald-expansion/pull/8221) +* Fix compiling using `make debug` by @PCG06 in [#8380](https://github.com/rh-hideout/pokeemerald-expansion/pull/8380) + +## βš”οΈ Battle General βš”οΈ +### Added +* Config for capture to appear critical if the pokemon is already caught by @FosterProgramming in [#7730](https://github.com/rh-hideout/pokeemerald-expansion/pull/7730) + +### Changed +* Separates FRB and FRZ animations by @grintoul1 in [#7611](https://github.com/rh-hideout/pokeemerald-expansion/pull/7611) +* Update multiple battle messages by @AsparagusEduardo in [#7529](https://github.com/rh-hideout/pokeemerald-expansion/pull/7529) + - Removed unused messages + - Changed ability "X prevents Y" to "It doesn't affect X..." + - Eg. `"The opposing Snorlax's Immunity prevents poisoning!"` + - Removed `B_ABILITY_POP_UP`. Revert commit `b501fe7354bcd957396465c621ae7af5959ac5b0` to undo this. +* Refactors Attackstring and PP deduction by @AlexOn1ine in [#7402](https://github.com/rh-hideout/pokeemerald-expansion/pull/7402) +* Remove Uproar attack battle script by @AlexOn1ine in [#7715](https://github.com/rh-hideout/pokeemerald-expansion/pull/7715) +* Fix up end turn scripts plus small documentation by @AlexOn1ine in [#7758](https://github.com/rh-hideout/pokeemerald-expansion/pull/7758) +* Remove redundant function call by @AlexOn1ine in [#7752](https://github.com/rh-hideout/pokeemerald-expansion/pull/7752) +* Minor White Herb and Neutralizing Gas clean up by @AlexOn1ine in [#7754](https://github.com/rh-hideout/pokeemerald-expansion/pull/7754) +* Minor clean up for Lightning Rod / Storm Drain by @AlexOn1ine in [#7778](https://github.com/rh-hideout/pokeemerald-expansion/pull/7778) +* Improve ability/heldEffect access for IsBattlerGrounded func by @AlexOn1ine in [#7753](https://github.com/rh-hideout/pokeemerald-expansion/pull/7753) +* Add func GetChosenMoveFromPosition by @AlexOn1ine in [#7810](https://github.com/rh-hideout/pokeemerald-expansion/pull/7810) +* GetBattlerHoldEffect clean up by @AlexOn1ine in [#7819](https://github.com/rh-hideout/pokeemerald-expansion/pull/7819) +* Remove unused gBattleStruct fields by @Bassoonian in [#7822](https://github.com/rh-hideout/pokeemerald-expansion/pull/7822) +* feat: change defines in `constants/abilities.h` to an enum by @khbsd in [#7006](https://github.com/rh-hideout/pokeemerald-expansion/pull/7006) +* Streamline tryheal macros by @Bassoonian in [#7830](https://github.com/rh-hideout/pokeemerald-expansion/pull/7830) +* No bag use flag changed to a varable by @FosterProgramming in [#7780](https://github.com/rh-hideout/pokeemerald-expansion/pull/7780) + - IMPORTANT: The config flag B_FLAG_NO_BAG_USE has been removed + - A config var B_VAR_NO_BAG_USE has been added to replace it. It allows you to choose between: + bag available in battle, bag available in wild battle only, and unavailable bag +* Remove two unused bits from battle structs by @Bassoonian in [#7835](https://github.com/rh-hideout/pokeemerald-expansion/pull/7835) +* Removes a few redundant hitmarkers by @AlexOn1ine in [#7915](https://github.com/rh-hideout/pokeemerald-expansion/pull/7915) +* Remove EffectHitSetTerrain script to use moveeffect by @AlexOn1ine in [#7938](https://github.com/rh-hideout/pokeemerald-expansion/pull/7938) +* Clean up follow up for AtkCanceller refactor by @AlexOn1ine in [#7951](https://github.com/rh-hideout/pokeemerald-expansion/pull/7951) +* Optimize GetWhichBattlerFasterOrTies by @AlexOn1ine in [#7953](https://github.com/rh-hideout/pokeemerald-expansion/pull/7953) +* Decouple passive hp updates from move damage updates by @AlexOn1ine in [#7942](https://github.com/rh-hideout/pokeemerald-expansion/pull/7942) +* Remove appearedInBattle bitfield & redundant use of sentOut partyState by @Nopinou in [#8011](https://github.com/rh-hideout/pokeemerald-expansion/pull/8011) +* Volatile cleared in a redundant spot by @AlexOn1ine in [#8015](https://github.com/rh-hideout/pokeemerald-expansion/pull/8015) +* Moved usedHeldItem to Party State struct by @AlexOn1ine in [#8006](https://github.com/rh-hideout/pokeemerald-expansion/pull/8006) +* Remove usage of gBattlerTarget for MirrorHerb/Opportunist by @AlexOn1ine in [#8033](https://github.com/rh-hideout/pokeemerald-expansion/pull/8033) +* Fixed test "Revival Blessing cannot revive a partner's party member" by @grintoul1 in [#8031](https://github.com/rh-hideout/pokeemerald-expansion/pull/8031) +* Decouple (Overworld) Statuses from ability function by @AlexOn1ine in [#8002](https://github.com/rh-hideout/pokeemerald-expansion/pull/8002) +* Combine Simple Beam and Worry Seed into one effect by @AlexOn1ine in [#8039](https://github.com/rh-hideout/pokeemerald-expansion/pull/8039) +* Clean up for item hold effect refactor by @AlexOn1ine in [#8014](https://github.com/rh-hideout/pokeemerald-expansion/pull/8014) +* Grudge, Destiny Bond and FaintBattler refactor by @AlexOn1ine in [#8072](https://github.com/rh-hideout/pokeemerald-expansion/pull/8072) +* Parametrized Ice Face's weather form change by @AsparagusEduardo in [#8115](https://github.com/rh-hideout/pokeemerald-expansion/pull/8115) +* Clean up redundant todo by @AlexOn1ine in [#8094](https://github.com/rh-hideout/pokeemerald-expansion/pull/8094) +* Deprecate various macro by @AlexOn1ine in [#8092](https://github.com/rh-hideout/pokeemerald-expansion/pull/8092) +* Fixes hacky SetMoveEffect script calls by @AlexOn1ine in [#7987](https://github.com/rh-hideout/pokeemerald-expansion/pull/7987) +* Create BattleStruct sub struct for event states by @AlexOn1ine in [#8131](https://github.com/rh-hideout/pokeemerald-expansion/pull/8131) +* Attackstring hitmarker clean up by @AlexOn1ine in [#8136](https://github.com/rh-hideout/pokeemerald-expansion/pull/8136) +* Clean up ability effect hitmarker by @AlexOn1ine in [#8138](https://github.com/rh-hideout/pokeemerald-expansion/pull/8138) +* Increase number of additional move effects by @AlexOn1ine in [#8149](https://github.com/rh-hideout/pokeemerald-expansion/pull/8149) +* Remove redundant Future Sight flag by @AlexOn1ine in [#8185](https://github.com/rh-hideout/pokeemerald-expansion/pull/8185) +* Powder Move blocking cleanup by @PhallenTree in [#8194](https://github.com/rh-hideout/pokeemerald-expansion/pull/8194) +* Micro clean up in BattleStruct by @AlexOn1ine in [#8177](https://github.com/rh-hideout/pokeemerald-expansion/pull/8177) +* HandleAction_UseMove minor cleanup by @mrgriffin in [#8214](https://github.com/rh-hideout/pokeemerald-expansion/pull/8214) +* Revert gBattleTurnCounter change by @AlexOn1ine in [#8197](https://github.com/rh-hideout/pokeemerald-expansion/pull/8197) +* Canceller -> Canceler rename by @AlexOn1ine in [#8294](https://github.com/rh-hideout/pokeemerald-expansion/pull/8294) +* Remove leftover scrtipt redirection by @AlexOn1ine in [#8317](https://github.com/rh-hideout/pokeemerald-expansion/pull/8317) +* Expand usage of FaintedActions enum in HandleFaintedMonActions by @PhallenTree in [#8346](https://github.com/rh-hideout/pokeemerald-expansion/pull/8346) +* Move end clear bits clean up by @AlexOn1ine in [#8354](https://github.com/rh-hideout/pokeemerald-expansion/pull/8354) +* Restored encourageEncore flag to non-volatile status effects by @AsparagusEduardo in [#8387](https://github.com/rh-hideout/pokeemerald-expansion/pull/8387) + +### Fixed +* Fixes Weak Armor and items not displaying stat change attributes by @PhallenTree in [#7701](https://github.com/rh-hideout/pokeemerald-expansion/pull/7701) +* Refactors ruin ability checks into a field effect by @AlexOn1ine in [#7711](https://github.com/rh-hideout/pokeemerald-expansion/pull/7711) +* Attackcanceller fixes and improvements by @AlexOn1ine in [#7698](https://github.com/rh-hideout/pokeemerald-expansion/pull/7698) +* Fix Critical Capture RNG and Catching Charm boost by @kittenchilly in [#7534](https://github.com/rh-hideout/pokeemerald-expansion/pull/7534) +* Fixes activation order for a couple abilities by @AlexOn1ine in [#7732](https://github.com/rh-hideout/pokeemerald-expansion/pull/7732) +* More White Herb fixes/clean up by @AlexOn1ine in [#7826](https://github.com/rh-hideout/pokeemerald-expansion/pull/7826) +* Missing IsBattlerAlive checks in Opportunist/Mirror Herb by @AlexOn1ine in [#7829](https://github.com/rh-hideout/pokeemerald-expansion/pull/7829) +* Item battle effect refactor by @AlexOn1ine in [#7857](https://github.com/rh-hideout/pokeemerald-expansion/pull/7857) +* Fix Fling Mental Herb message by @AlexOn1ine in [#7984](https://github.com/rh-hideout/pokeemerald-expansion/pull/7984) +* Fixes Ruin field statuses negation conditions + upcoming cleanup by @PhallenTree in [#8042](https://github.com/rh-hideout/pokeemerald-expansion/pull/8042) +* Fix nature power string and add support for evnvironment in tests by @FosterProgramming in [#8068](https://github.com/rh-hideout/pokeemerald-expansion/pull/8068) + - Add option to choose an environment when setting up a battle test +* Corrects battler position checks in battle_message.c by @grintoul1 in [#8070](https://github.com/rh-hideout/pokeemerald-expansion/pull/8070) +* Emergency Exit on hazards activation + fix end of turn activation by @PhallenTree in [#8075](https://github.com/rh-hideout/pokeemerald-expansion/pull/8075) +* Improve sBattleIntroSlideFuncs bounds check by @hedara90 in [#8084](https://github.com/rh-hideout/pokeemerald-expansion/pull/8084) +* Fixes Sticky Barb never getting transferred to attacker + tests by @PhallenTree in [#8108](https://github.com/rh-hideout/pokeemerald-expansion/pull/8108) +* Fixes flung items sometimes being blocked by Unnerve by @PhallenTree in [#8114](https://github.com/rh-hideout/pokeemerald-expansion/pull/8114) +* Adjust faint battler script by @AlexOn1ine in [#8137](https://github.com/rh-hideout/pokeemerald-expansion/pull/8137) +* Allow to send active mon to PC when capturing a Pokemon by @FosterProgramming in [#8111](https://github.com/rh-hideout/pokeemerald-expansion/pull/8111) +* Fix transform not loading the correct sprites when facing shiny or unown by @FosterProgramming in [#8146](https://github.com/rh-hideout/pokeemerald-expansion/pull/8146) +* Fixes Receiver not immediately activating copied abilities by @PhallenTree in [#8162](https://github.com/rh-hideout/pokeemerald-expansion/pull/8162) +* Fix destiny knot behavior and add tests by @FosterProgramming in [#8174](https://github.com/rh-hideout/pokeemerald-expansion/pull/8174) +* Fix recharge moves + add recharge move tests by @FosterProgramming in [#8181](https://github.com/rh-hideout/pokeemerald-expansion/pull/8181) +* Fixes Magician for spread moves by @AlexOn1ine in [#8170](https://github.com/rh-hideout/pokeemerald-expansion/pull/8170) +* Fix tera tint not applying on activation by @FosterProgramming in [#8135](https://github.com/rh-hideout/pokeemerald-expansion/pull/8135) +* Fixes wrongly assigned count for Semi Invulnerable state by @AlexOn1ine in [#8175](https://github.com/rh-hideout/pokeemerald-expansion/pull/8175) +* Fixes Drain Punch / Parental Bond / Scale Shot interaction by @AlexOn1ine in [#8198](https://github.com/rh-hideout/pokeemerald-expansion/pull/8198) +* Avoid illegal GetBattlerAtPosition by @mrgriffin in [#8225](https://github.com/rh-hideout/pokeemerald-expansion/pull/8225) +* DamageContext: chosenMove by @mrgriffin in [#8224](https://github.com/rh-hideout/pokeemerald-expansion/pull/8224) +* AccuracyCheck: Avoid calling GetMoveEffect with NO_ACC_CALC_CHECK_LOC… by @mrgriffin in [#8222](https://github.com/rh-hideout/pokeemerald-expansion/pull/8222) +* moveend: Handle MOVE_UNAVAILABLE in MOVEEND_THIRD_MOVE_BLOCK by @mrgriffin in [#8215](https://github.com/rh-hideout/pokeemerald-expansion/pull/8215) +* Fix wrong ditto sprite on capture by @FosterProgramming in [#8226](https://github.com/rh-hideout/pokeemerald-expansion/pull/8226) +* SpriteCB_EnemyShadow: Avoid use-after-free by @mrgriffin in [#8220](https://github.com/rh-hideout/pokeemerald-expansion/pull/8220) +* trysethelpinghand avoid illegal target by @mrgriffin in [#8218](https://github.com/rh-hideout/pokeemerald-expansion/pull/8218) +* Fixed an issue related to same turn Encore targeting by @LinathanZel in [#8230](https://github.com/rh-hideout/pokeemerald-expansion/pull/8230) +* Avoid illegal move retargeting in singles by @mrgriffin in [#8217](https://github.com/rh-hideout/pokeemerald-expansion/pull/8217) +* Fixes Shell Trap not activating on contact but no damage by @AlexOn1ine in [#8243](https://github.com/rh-hideout/pokeemerald-expansion/pull/8243) +* Fix Magic Coat reflecting hazard moves incorrectly when used by a partner by @moostoet in [#8272](https://github.com/rh-hideout/pokeemerald-expansion/pull/8272) + - Magic Coat now properly reflects hazard moves from either slot in double battles. +* Shell Trap tests and Fix for Encore interaction by @AlexOn1ine in [#8268](https://github.com/rh-hideout/pokeemerald-expansion/pull/8268) +* Fix max mushroom unable to be selected when one stat is maxed by @FosterProgramming in [#8287](https://github.com/rh-hideout/pokeemerald-expansion/pull/8287) +* Block selecting x items when contrary pokemon are at minimum stages by @FosterProgramming in [#8288](https://github.com/rh-hideout/pokeemerald-expansion/pull/8288) +* Fix Fur Coat affecting confusion self-damage by @moostoet in [#8267](https://github.com/rh-hideout/pokeemerald-expansion/pull/8267) + - Fix confusion self-damage ignoring defense/attack abilities such as Fur Coat. +* Fixes End Turn Speed Order by @AlexOn1ine in [#8289](https://github.com/rh-hideout/pokeemerald-expansion/pull/8289) +* Make switchout abilities trigger after a pokemon has returned to its ball by @FosterProgramming in [#8304](https://github.com/rh-hideout/pokeemerald-expansion/pull/8304) +* Fix Shed Shell allowing fleeing/teleporting and Smoke Ball failing to guarantee escape by @moostoet in [#8286](https://github.com/rh-hideout/pokeemerald-expansion/pull/8286) +* Fix bug where defiant/competitive would pass their stat change to the next target by @FosterProgramming in [#8312](https://github.com/rh-hideout/pokeemerald-expansion/pull/8312) +* Fix max move message against semi invulnerable target by @FosterProgramming in [#8313](https://github.com/rh-hideout/pokeemerald-expansion/pull/8313) +* Fixes Neutralizing Gas displaying message when exiting with multiple users by @PhallenTree in [#8318](https://github.com/rh-hideout/pokeemerald-expansion/pull/8318) +* Fix Kings Rock not being ignored by flinch moves by @AlexOn1ine in [#8327](https://github.com/rh-hideout/pokeemerald-expansion/pull/8327) +* Fix Upper Hand failure still activating Protean by @AlexOn1ine in [#8329](https://github.com/rh-hideout/pokeemerald-expansion/pull/8329) +* Fix Protosynthesis stat boosts ignoring speed drops by @moostoet in [#8277](https://github.com/rh-hideout/pokeemerald-expansion/pull/8277) + - Protosynthesis and Quark Drive now recalculate their boosted stat when Speed is lowered or Neutralizing Gas temporarily disables the ability. +* Fix switch-in abilities not triggering on revive by @FosterProgramming in [#8293](https://github.com/rh-hideout/pokeemerald-expansion/pull/8293) +* More Neutralizing Gas cleanup by @PhallenTree in [#8335](https://github.com/rh-hideout/pokeemerald-expansion/pull/8335) +* Clear Destiny Bond/Grudge bits when not activated by @PhallenTree in [#8334](https://github.com/rh-hideout/pokeemerald-expansion/pull/8334) +* Fix cure status item effect not working properly in doubles by @FosterProgramming in [#8339](https://github.com/rh-hideout/pokeemerald-expansion/pull/8339) +* Fix infinite confusion (berserk gene) not being cured by cure_status bag items by @FosterProgramming in [#8343](https://github.com/rh-hideout/pokeemerald-expansion/pull/8343) +* Fix `B_PHYSICAL_SPECIAL_SPLIT` when set to Gen 4 by @AsparagusEduardo in [#8348](https://github.com/rh-hideout/pokeemerald-expansion/pull/8348) +* Refactor Beat Up handling for Gen 3/4 defaults, fix crit check, and expand test coverage by @moostoet in [#8307](https://github.com/rh-hideout/pokeemerald-expansion/pull/8307) + - BUGFIX: Beat Up (`GEN =< 5`) now no longer doubles its damage on every non-critical hit + - Beat Up now precomputes eligible party members/strikers for consistent multi-hit resolution and expanded tests covering both pre-Gen5 and Gen5+ rules +* Fix substitute graphic not disappearing after using a pivor move by @FosterProgramming in [#8340](https://github.com/rh-hideout/pokeemerald-expansion/pull/8340) +* Fixes Beak Blast burning after Beak Blast was already used by @PhallenTree in [#8361](https://github.com/rh-hideout/pokeemerald-expansion/pull/8361) +* Fix Roar not being recorded for LastUsedMove by @AlexOn1ine in [#8362](https://github.com/rh-hideout/pokeemerald-expansion/pull/8362) +* Fixes Neutralizing Gas / Mold Breaker / Dragon Darts interaction by @AlexOn1ine in [#8389](https://github.com/rh-hideout/pokeemerald-expansion/pull/8389) +* Fixes battle tv overwriting damage values by @AlexOn1ine in [#8378](https://github.com/rh-hideout/pokeemerald-expansion/pull/8378) +* Fix ball cycling not working properly when the same ball take multiple bag slots by @FosterProgramming in [#8163](https://github.com/rh-hideout/pokeemerald-expansion/pull/8163) + - Two new defines added to items.h `FIRST_BALL_INDEX` and `LAST_BALL_INDEX` + - We now assume the indexes of all regular ball usable in wild battle have consecutive indexes and some features (throw ball shortcut in battle) might break if not true +* Prevent double Dynamax for single-trainer 2v1 multi battles by @moostoet in [#8323](https://github.com/rh-hideout/pokeemerald-expansion/pull/8323) + - Fixed AI 2v1 multibattles incorrectly allowing both opponent leads to Dynamax in the same turn. + +## 🀹 Moves 🀹 +### Changed +* Separates FRB and FRZ animations by @grintoul1 in [#7611](https://github.com/rh-hideout/pokeemerald-expansion/pull/7611) +* Fixed test "Revival Blessing cannot revive a partner's party member" by @grintoul1 in [#8031](https://github.com/rh-hideout/pokeemerald-expansion/pull/8031) +* Fixed Uproar's description and spacing by @fdeblasio in [#8187](https://github.com/rh-hideout/pokeemerald-expansion/pull/8187) +* Clean usage of gMovesInfo by @AsparagusEduardo in [#8234](https://github.com/rh-hideout/pokeemerald-expansion/pull/8234) + - Also, fixed an OOB in `HasMoveThatChangesKOThreshold` +* Added Gen 6 contest combos by @fdeblasio in [#8251](https://github.com/rh-hideout/pokeemerald-expansion/pull/8251) +* Make tailwind anim mirror based on side by @FosterProgramming in [#8249](https://github.com/rh-hideout/pokeemerald-expansion/pull/8249) +* Make rainbow effect anim change based on side by @FosterProgramming in [#8269](https://github.com/rh-hideout/pokeemerald-expansion/pull/8269) + - Art assets by [SonikkuA-DatH](https://github.com/SonikkuA-DatH) +* Update Lash Out description to clarify its effect by @PhallenTree in [#8372](https://github.com/rh-hideout/pokeemerald-expansion/pull/8372) + +### Fixed +* Fix some move animations leaking VRAM and freeing already freed tags by @hedara90 in [#7977](https://github.com/rh-hideout/pokeemerald-expansion/pull/7977) + +## 🎭 Abilities 🎭 +### Changed +* followup: AbilityBattleEffects return type is incorrect by @khbsd in [#7827](https://github.com/rh-hideout/pokeemerald-expansion/pull/7827) + +## 🧢 Items 🧢 +### Fixed +* Allow vs seekers to work with script not starting with trainerbattle by @FosterProgramming in [#8062](https://github.com/rh-hideout/pokeemerald-expansion/pull/8062) + - VS seeker now work with trainers who don't start with trainer_battle. You can use `vsseeker_rematchid TRAINER_ID` to indicate that this NPC is a battling trainer and the game will fetch the appropriate rematch if necessary. ` vsseeker_rematchid` work like a `cant_see_if_trainerflag_set` with additional functionality to handle vs seeker. + - All NPCs who don't start with either `vsseeker_rematchid` or `trainerbattle` will show as "X"/unmatchable by the vs seeker, so non-rematchable trainer who do not start with `trainerbattle may "lie" and not show an excalmation mark showing they haven't been fought yet. This can be fixed by including a `vsseeker_rematchid` for them too. +* Removed extra period in PokΓ©shi Doll description by @montmoguri in [#8252](https://github.com/rh-hideout/pokeemerald-expansion/pull/8252) + +## πŸ€– Battle AI πŸ€– +### Added +* Improved move additional effect handling; now accounts for Shield Dust. by @surskitty in [#7650](https://github.com/rh-hideout/pokeemerald-expansion/pull/7650) +* Adjusted AI handling for Gravity; AI for weather/field status additional effects. by @surskitty in [#7651](https://github.com/rh-hideout/pokeemerald-expansion/pull/7651) +* Improved AI for status curing; trainer items, Purify, Smelling Salts, Sparkling Aria by @surskitty in [#7853](https://github.com/rh-hideout/pokeemerald-expansion/pull/7853) + +### Changed +* AI uses Magnetic Flux. by @surskitty in [#7642](https://github.com/rh-hideout/pokeemerald-expansion/pull/7642) +* AI uses Flower Shield. by @surskitty in [#7640](https://github.com/rh-hideout/pokeemerald-expansion/pull/7640) +* AI uses Life Dew. by @surskitty in [#7643](https://github.com/rh-hideout/pokeemerald-expansion/pull/7643) +* AI uses Gear Up. by @surskitty in [#7641](https://github.com/rh-hideout/pokeemerald-expansion/pull/7641) +* Correcting test AI won't use status moves if partner chose Helping Hand by @surskitty in [#7649](https://github.com/rh-hideout/pokeemerald-expansion/pull/7649) +* IncreaseStatUpScore adjustments for Simple, +3 moves, Acupressure, max move effects by @surskitty in [#7662](https://github.com/rh-hideout/pokeemerald-expansion/pull/7662) +* AI handling for Coaching. by @surskitty in [#7661](https://github.com/rh-hideout/pokeemerald-expansion/pull/7661) +* Simplifying calls to IsBattlerTrapped; treats being unable to switch as trappedness by @surskitty in [#7671](https://github.com/rh-hideout/pokeemerald-expansion/pull/7671) +* AI Tests: Gimmick Support by @mrgriffin in [#7694](https://github.com/rh-hideout/pokeemerald-expansion/pull/7694) +* AI can use Z-status moves by @surskitty in [#7666](https://github.com/rh-hideout/pokeemerald-expansion/pull/7666) +* Move some checks out of IncreaseStatUpScore to ShouldRaiseAnyStat by @surskitty in [#7722](https://github.com/rh-hideout/pokeemerald-expansion/pull/7722) +* Moving additional effects out of AI_CalcMoveEffectScore and into AI_CalcMoveAdditionalEffectScore by @surskitty in [#7727](https://github.com/rh-hideout/pokeemerald-expansion/pull/7727) +* AI sees dynamic moves and Nature Power as correct types for weather, terrain by @surskitty in [#7759](https://github.com/rh-hideout/pokeemerald-expansion/pull/7759) +* Fix abusable two-turn-move switch behaviour by @Pawkkie in [#7770](https://github.com/rh-hideout/pokeemerald-expansion/pull/7770) +* Z Status move handling: Conversion, Detect, Nature Power, Transform by @surskitty in [#7721](https://github.com/rh-hideout/pokeemerald-expansion/pull/7721) +* Use stored values for ai switch-in effectiveness checks by @AlexOn1ine in [#7794](https://github.com/rh-hideout/pokeemerald-expansion/pull/7794) +* Changing all HasBattlerSideAbility to AI_IsAbilityOnSide. by @surskitty in [#7927](https://github.com/rh-hideout/pokeemerald-expansion/pull/7927) +* Weather/Terrain AI touch-ups. by @surskitty in [#7933](https://github.com/rh-hideout/pokeemerald-expansion/pull/7933) +* Improving the checks for the AI to avoid Encore; adding RISK_ENCORE_CHANCE config. by @surskitty in [#7929](https://github.com/rh-hideout/pokeemerald-expansion/pull/7929) +* Fixes CanUseLastResort and resolves 3 KNOWN_FAILING Last Resort tests by @grintoul1 in [#8032](https://github.com/rh-hideout/pokeemerald-expansion/pull/8032) +* Add AI flag AI_FLAG_KNOW_OPPONENT_PARTY to know all species in party by @moostoet in [#8290](https://github.com/rh-hideout/pokeemerald-expansion/pull/8290) + +### Fixed +* Score adjustments towards guaranteed stat drops. by @surskitty in [#7670](https://github.com/rh-hideout/pokeemerald-expansion/pull/7670) +* AI uses Extreme Evoboost. by @surskitty in [#7706](https://github.com/rh-hideout/pokeemerald-expansion/pull/7706) +* Fixes AI scoring when Priority moves are blocked by @PhallenTree in [#7745](https://github.com/rh-hideout/pokeemerald-expansion/pull/7745) +* fix (AI scoring): shield dust considerations, IsMoveEffectInMinus self effect edge case, hitsToKO zero-case consideration by @ghostyboyy97 in [#8126](https://github.com/rh-hideout/pokeemerald-expansion/pull/8126) + - The AI now sees Shield Dust on the player's Pokemon correctly + - The AI now sees self-targeted positive effect boosts correctly +* fix (contrary): Contrary stat down handling in MoveEffectInPlus by @ghostyboyy97 in [#8165](https://github.com/rh-hideout/pokeemerald-expansion/pull/8165) + - When comparing positive move effects in damaging move comparison, the AI will correctly see moves like Leaf Storm as beneficial if their Pokemon has Contrary. +* Added check for parental bond killing through sturdy by @MaximeGr00 in [#8206](https://github.com/rh-hideout/pokeemerald-expansion/pull/8206) + - AI now accounts for Parental Bond when checking if a move can ko the player through sturdy/focus sash. +* AI: Handle MOVE_UNAVAILABLE in last used moves by @mrgriffin in [#8219](https://github.com/rh-hideout/pokeemerald-expansion/pull/8219) +* Fix AI_FLAG_DOUBLE_ACE_POKEMON sending duplicate PokΓ©mon in doubles by @moostoet in [#8279](https://github.com/rh-hideout/pokeemerald-expansion/pull/8279) + - Fixed AI_FLAG_DOUBLE_ACE_POKEMON trainers resending the same PokΓ©mon after a KO instead of their two Ace PokΓ©mon in double battles. +* Rework switch AI and add more tests for ace pokemon flags by @FosterProgramming in [#8321](https://github.com/rh-hideout/pokeemerald-expansion/pull/8321) + - All remaining issues with the AI flags Ace Pokemon and Double Ace pokemon should be fixed + - The smart switching AI should be less likely to switch a pokemon about to die if it doesn't have a pokemon with a good matchup to replace it +* Fix switchin KO threshold logic by @Pawkkie in [#8370](https://github.com/rh-hideout/pokeemerald-expansion/pull/8370) + +## 🧹 Other Cleanup 🧹 +* Update multiple battle messages by @AsparagusEduardo in [#7529](https://github.com/rh-hideout/pokeemerald-expansion/pull/7529) + - Removed unused messages + - Changed ability "X prevents Y" to "It doesn't affect X..." + - Eg. `"The opposing Snorlax's Immunity prevents poisoning!"` + - Removed `B_ABILITY_POP_UP`. Revert commit `b501fe7354bcd957396465c621ae7af5959ac5b0` to undo this. +* Battle debug menu now checks correct parties depending on battler party by @grintoul1 in [#7652](https://github.com/rh-hideout/pokeemerald-expansion/pull/7652) +* Correcting test AI won't use status moves if partner chose Helping Hand by @surskitty in [#7649](https://github.com/rh-hideout/pokeemerald-expansion/pull/7649) +* Remove Uproar attack battle script by @AlexOn1ine in [#7715](https://github.com/rh-hideout/pokeemerald-expansion/pull/7715) +* Fix up end turn scripts plus small documentation by @AlexOn1ine in [#7758](https://github.com/rh-hideout/pokeemerald-expansion/pull/7758) +* `field_name_box` smol followup by @mudskipper13 in [#7762](https://github.com/rh-hideout/pokeemerald-expansion/pull/7762) +* Remove redundant function call by @AlexOn1ine in [#7752](https://github.com/rh-hideout/pokeemerald-expansion/pull/7752) +* Minor White Herb and Neutralizing Gas clean up by @AlexOn1ine in [#7754](https://github.com/rh-hideout/pokeemerald-expansion/pull/7754) +* Minor clean up for Lightning Rod / Storm Drain by @AlexOn1ine in [#7778](https://github.com/rh-hideout/pokeemerald-expansion/pull/7778) +* Add func GetChosenMoveFromPosition by @AlexOn1ine in [#7810](https://github.com/rh-hideout/pokeemerald-expansion/pull/7810) +* GetBattlerHoldEffect clean up by @AlexOn1ine in [#7819](https://github.com/rh-hideout/pokeemerald-expansion/pull/7819) +* Remove unused gBattleStruct fields by @Bassoonian in [#7822](https://github.com/rh-hideout/pokeemerald-expansion/pull/7822) +* followup: AbilityBattleEffects return type is incorrect by @khbsd in [#7827](https://github.com/rh-hideout/pokeemerald-expansion/pull/7827) +* Streamline tryheal macros by @Bassoonian in [#7830](https://github.com/rh-hideout/pokeemerald-expansion/pull/7830) +* Remove two unused bits from battle structs by @Bassoonian in [#7835](https://github.com/rh-hideout/pokeemerald-expansion/pull/7835) +* Removes a few redundant hitmarkers by @AlexOn1ine in [#7915](https://github.com/rh-hideout/pokeemerald-expansion/pull/7915) +* Remove EffectHitSetTerrain script to use moveeffect by @AlexOn1ine in [#7938](https://github.com/rh-hideout/pokeemerald-expansion/pull/7938) +* Clean up follow up for AtkCanceller refactor by @AlexOn1ine in [#7951](https://github.com/rh-hideout/pokeemerald-expansion/pull/7951) +* Remove appearedInBattle bitfield & redundant use of sentOut partyState by @Nopinou in [#8011](https://github.com/rh-hideout/pokeemerald-expansion/pull/8011) +* Some more documentation and cleanup by @Bassoonian in [#8020](https://github.com/rh-hideout/pokeemerald-expansion/pull/8020) +* Volatile cleared in a redundant spot by @AlexOn1ine in [#8015](https://github.com/rh-hideout/pokeemerald-expansion/pull/8015) +* Moved usedHeldItem to Party State struct by @AlexOn1ine in [#8006](https://github.com/rh-hideout/pokeemerald-expansion/pull/8006) +* Remove usage of gBattlerTarget for MirrorHerb/Opportunist by @AlexOn1ine in [#8033](https://github.com/rh-hideout/pokeemerald-expansion/pull/8033) +* Even more enums and documentation by @Bassoonian in [#8029](https://github.com/rh-hideout/pokeemerald-expansion/pull/8029) +* Decouple (Overworld) Statuses from ability function by @AlexOn1ine in [#8002](https://github.com/rh-hideout/pokeemerald-expansion/pull/8002) +* Fixes Ruin field statuses negation conditions + upcoming cleanup by @PhallenTree in [#8042](https://github.com/rh-hideout/pokeemerald-expansion/pull/8042) +* Minor clean up in menu.c by @estellarc in [#8060](https://github.com/rh-hideout/pokeemerald-expansion/pull/8060) +* Clean up for item hold effect refactor by @AlexOn1ine in [#8014](https://github.com/rh-hideout/pokeemerald-expansion/pull/8014) +* Parametrized Ice Face's weather form change by @AsparagusEduardo in [#8115](https://github.com/rh-hideout/pokeemerald-expansion/pull/8115) +* Clean up redundant todo by @AlexOn1ine in [#8094](https://github.com/rh-hideout/pokeemerald-expansion/pull/8094) +* Deprecate various macro by @AlexOn1ine in [#8092](https://github.com/rh-hideout/pokeemerald-expansion/pull/8092) +* Fixes hacky SetMoveEffect script calls by @AlexOn1ine in [#7987](https://github.com/rh-hideout/pokeemerald-expansion/pull/7987) +* Create BattleStruct sub struct for event states by @AlexOn1ine in [#8131](https://github.com/rh-hideout/pokeemerald-expansion/pull/8131) +* Attackstring hitmarker clean up by @AlexOn1ine in [#8136](https://github.com/rh-hideout/pokeemerald-expansion/pull/8136) +* Clean up ability effect hitmarker by @AlexOn1ine in [#8138](https://github.com/rh-hideout/pokeemerald-expansion/pull/8138) +* Fix Kyurem typo in swap move tables by @Bassoonian in [#8139](https://github.com/rh-hideout/pokeemerald-expansion/pull/8139) +* Fix typo in Voltorb-Hisui pokedex entry by @PhallenTree in [#8143](https://github.com/rh-hideout/pokeemerald-expansion/pull/8143) +* porymap default settings by @FosterProgramming in [#8038](https://github.com/rh-hideout/pokeemerald-expansion/pull/8038) + - WARNING: A change was made for new projects map files to match poymap output. This change might break people's projects with existing versions of those files. The files affected are ` data/maps/map_groups.json`, `src/data/heal_locations.json`, `src/data/region_map/region_map_sections.json` and `src/data/wild_encounters.json` + If you have an issue with one of those files during the merging process, you should run this command + `git checkout HEAD -- ` + which will reset the file to the version before you initiated the merge +* Sets instant text speed flag to false by default by @khbsd in [#8179](https://github.com/rh-hideout/pokeemerald-expansion/pull/8179) +* Remove redundant Future Sight flag by @AlexOn1ine in [#8185](https://github.com/rh-hideout/pokeemerald-expansion/pull/8185) +* Fix incorrect comments by @AlexOn1ine in [#8193](https://github.com/rh-hideout/pokeemerald-expansion/pull/8193) +* Fixed Uproar's description and spacing by @fdeblasio in [#8187](https://github.com/rh-hideout/pokeemerald-expansion/pull/8187) +* Add include/constants/script_commands.h to gitignore by @AlexOn1ine in [#8169](https://github.com/rh-hideout/pokeemerald-expansion/pull/8169) +* Powder Move blocking cleanup by @PhallenTree in [#8194](https://github.com/rh-hideout/pokeemerald-expansion/pull/8194) +* Converted landmarks to COMPOUND_STRINGs by @fdeblasio in [#8205](https://github.com/rh-hideout/pokeemerald-expansion/pull/8205) +* Micro clean up in BattleStruct by @AlexOn1ine in [#8177](https://github.com/rh-hideout/pokeemerald-expansion/pull/8177) +* Clean usage of gMovesInfo by @AsparagusEduardo in [#8234](https://github.com/rh-hideout/pokeemerald-expansion/pull/8234) + - Also, fixed an OOB in `HasMoveThatChangesKOThreshold` +* HandleAction_UseMove minor cleanup by @mrgriffin in [#8214](https://github.com/rh-hideout/pokeemerald-expansion/pull/8214) +* Revert gBattleTurnCounter change by @AlexOn1ine in [#8197](https://github.com/rh-hideout/pokeemerald-expansion/pull/8197) +* Added contest config and cleaned up contest category variables by @fdeblasio in [#8178](https://github.com/rh-hideout/pokeemerald-expansion/pull/8178) +* Adjust Canceler naming to contain only one l by @AlexOn1ine in [#8258](https://github.com/rh-hideout/pokeemerald-expansion/pull/8258) +* Fix wrongly renamed logs by @AlexOn1ine in [#8264](https://github.com/rh-hideout/pokeemerald-expansion/pull/8264) +* Test type enum indentation by @AsparagusEduardo in [#8273](https://github.com/rh-hideout/pokeemerald-expansion/pull/8273) +* Added missing 'coolness' string by @fdeblasio in [#8274](https://github.com/rh-hideout/pokeemerald-expansion/pull/8274) +* Canceller -> Canceler rename by @AlexOn1ine in [#8294](https://github.com/rh-hideout/pokeemerald-expansion/pull/8294) +* Tests for Max Moves already exist by @AlexOn1ine in [#8314](https://github.com/rh-hideout/pokeemerald-expansion/pull/8314) +* Documentation clean up for MoveCanceler by @AlexOn1ine in [#8297](https://github.com/rh-hideout/pokeemerald-expansion/pull/8297) +* Use MAP_OFFSET by @estellarc in [#8328](https://github.com/rh-hideout/pokeemerald-expansion/pull/8328) +* Remove leftover scrtipt redirection by @AlexOn1ine in [#8317](https://github.com/rh-hideout/pokeemerald-expansion/pull/8317) +* Fixed broken friendship from items in battle test and added new test for opposite case by @pkmnsnfrn in [#7872](https://github.com/rh-hideout/pokeemerald-expansion/pull/7872) +* Expand usage of FaintedActions enum in HandleFaintedMonActions by @PhallenTree in [#8346](https://github.com/rh-hideout/pokeemerald-expansion/pull/8346) +* Move end clear bits clean up by @AlexOn1ine in [#8354](https://github.com/rh-hideout/pokeemerald-expansion/pull/8354) +* Indent unintented if statement by @hedara90 in [#8367](https://github.com/rh-hideout/pokeemerald-expansion/pull/8367) +* Update Lash Out description to clarify its effect by @PhallenTree in [#8372](https://github.com/rh-hideout/pokeemerald-expansion/pull/8372) +* Slight Protect moveend cleanup by @AsparagusEduardo in [#8385](https://github.com/rh-hideout/pokeemerald-expansion/pull/8385) +* Restored encourageEncore flag to non-volatile status effects by @AsparagusEduardo in [#8387](https://github.com/rh-hideout/pokeemerald-expansion/pull/8387) + +## πŸ§ͺ Test Runner πŸ§ͺ +### Added +* Multibattle testing system by @grintoul1 in [#7257](https://github.com/rh-hideout/pokeemerald-expansion/pull/7257) +* Prevent EXPECT functions from casting negative numbers into unsigned by @FosterProgramming in [#7866](https://github.com/rh-hideout/pokeemerald-expansion/pull/7866) + +### Changed +* AI Tests: Gimmick Support by @mrgriffin in [#7694](https://github.com/rh-hideout/pokeemerald-expansion/pull/7694) +* Some tests for future Dynamax AI behavior. by @surskitty in [#7707](https://github.com/rh-hideout/pokeemerald-expansion/pull/7707) +* Add some missing move animations to the move animation tests by @FosterProgramming in [#7507](https://github.com/rh-hideout/pokeemerald-expansion/pull/7507) +* Fixes CanUseLastResort and resolves 3 KNOWN_FAILING Last Resort tests by @grintoul1 in [#8032](https://github.com/rh-hideout/pokeemerald-expansion/pull/8032) +* Fixed test "Revival Blessing cannot revive a partner's party member" by @grintoul1 in [#8031](https://github.com/rh-hideout/pokeemerald-expansion/pull/8031) +* Added Soundproof and Bulletproof tests by @AsparagusEduardo in [#8189](https://github.com/rh-hideout/pokeemerald-expansion/pull/8189) +* Wrote some missing tests by @AsparagusEduardo in [#8203](https://github.com/rh-hideout/pokeemerald-expansion/pull/8203) +* Refactor random functions to be runner specific by @FosterProgramming in [#7816](https://github.com/rh-hideout/pokeemerald-expansion/pull/7816) +* A couple more tests by @AsparagusEduardo in [#8209](https://github.com/rh-hideout/pokeemerald-expansion/pull/8209) +* Fixed some failing tests with GEN_LATEST = GEN_5 by @AsparagusEduardo in [#8241](https://github.com/rh-hideout/pokeemerald-expansion/pull/8241) +* Add test for mold breaker/ice scales interaction by @FosterProgramming in [#8240](https://github.com/rh-hideout/pokeemerald-expansion/pull/8240) +* Yet more tests by @AsparagusEduardo in [#8228](https://github.com/rh-hideout/pokeemerald-expansion/pull/8228) + - Added tests for: + - Dark Aura + - Fairy Aura + - Flare Boost + - Toxic Boost + - Added test names for Flying Press. +* Test type enum indentation by @AsparagusEduardo in [#8273](https://github.com/rh-hideout/pokeemerald-expansion/pull/8273) +* Slightly increase headless test speed by modifying animations by @AsparagusEduardo in [#8299](https://github.com/rh-hideout/pokeemerald-expansion/pull/8299) +* Make `gTestRunnerHeadless` into a constant outside of tests by @hedara90 in [#8306](https://github.com/rh-hideout/pokeemerald-expansion/pull/8306) +* Tests for Max Moves already exist by @AlexOn1ine in [#8314](https://github.com/rh-hideout/pokeemerald-expansion/pull/8314) +* Finished fixing tests when setting `GEN_LATEST` to `GEN_5` by @AsparagusEduardo in [#8263](https://github.com/rh-hideout/pokeemerald-expansion/pull/8263) +* Wrote missing Fling tests by @AsparagusEduardo in [#8383](https://github.com/rh-hideout/pokeemerald-expansion/pull/8383) + +### Fixed +* Corrects ONE_VS_TWO_BATTLE_TEST to use BATTLE_TEST_ARGS_ONE_VS_TWO by @grintoul1 in [#8061](https://github.com/rh-hideout/pokeemerald-expansion/pull/8061) +* Fixes difficulty not being restored after tests by @grintoul1 in [#8129](https://github.com/rh-hideout/pokeemerald-expansion/pull/8129) +* Reset saveblock data between test runs by @hedara90 in [#8145](https://github.com/rh-hideout/pokeemerald-expansion/pull/8145) +* Sheer force test fix by @grintoul1 in [#8142](https://github.com/rh-hideout/pokeemerald-expansion/pull/8142) +* Test only enabled species by @mrgriffin in [#8216](https://github.com/rh-hideout/pokeemerald-expansion/pull/8216) +* Fix ohko moves ai tests by @FosterProgramming in [#8309](https://github.com/rh-hideout/pokeemerald-expansion/pull/8309) +* Fixed broken friendship from items in battle test and added new test for opposite case by @pkmnsnfrn in [#7872](https://github.com/rh-hideout/pokeemerald-expansion/pull/7872) +* Add tests to verify aromatherapy is not affected by heal bell config by @FosterProgramming in [#8344](https://github.com/rh-hideout/pokeemerald-expansion/pull/8344) +* Pre gen 5 encored move now signals the test engine a move is happening by @FosterProgramming in [#8338](https://github.com/rh-hideout/pokeemerald-expansion/pull/8338) +* Refactor Beat Up handling for Gen 3/4 defaults, fix crit check, and expand test coverage by @moostoet in [#8307](https://github.com/rh-hideout/pokeemerald-expansion/pull/8307) + - BUGFIX: Beat Up (`GEN =< 5`) now no longer doubles its damage on every non-critical hit + - Beat Up now precomputes eligible party members/strikers for consistent multi-hit resolution and expanded tests covering both pre-Gen5 and Gen5+ rules +* Fix player and partner trainer sprite palettes to 8 and 9, preventing unwanted palette changes by @grintoul1 in [#8127](https://github.com/rh-hideout/pokeemerald-expansion/pull/8127) +* Fix known failing AI trace test by @FosterProgramming in [#8337](https://github.com/rh-hideout/pokeemerald-expansion/pull/8337) + +## πŸ“š Documentation πŸ“š +* Converts some defines to enums and name unnamed enums by @Bassoonian in [#8019](https://github.com/rh-hideout/pokeemerald-expansion/pull/8019) +* Some more documentation and cleanup by @Bassoonian in [#8020](https://github.com/rh-hideout/pokeemerald-expansion/pull/8020) +* Even more enums and documentation by @Bassoonian in [#8029](https://github.com/rh-hideout/pokeemerald-expansion/pull/8029) +* Add type enum by @Bassoonian in [#8054](https://github.com/rh-hideout/pokeemerald-expansion/pull/8054) +* Revert reversion by @AlexOn1ine in [#8112](https://github.com/rh-hideout/pokeemerald-expansion/pull/8112) +* Lock mdbook to v0.4.35 to fix docs not building by @grintoul1 in [#8130](https://github.com/rh-hideout/pokeemerald-expansion/pull/8130) +* Add additional comment explaing map name popup transparency side-effects by @FosterProgramming in [#8117](https://github.com/rh-hideout/pokeemerald-expansion/pull/8117) +* Fix incorrect comments by @AlexOn1ine in [#8193](https://github.com/rh-hideout/pokeemerald-expansion/pull/8193) +* Moves name box configs into a new file by @AlexOn1ine in [#8250](https://github.com/rh-hideout/pokeemerald-expansion/pull/8250) +* Fix wrongly renamed logs by @AlexOn1ine in [#8264](https://github.com/rh-hideout/pokeemerald-expansion/pull/8264) +* Documentation clean up for MoveCanceler by @AlexOn1ine in [#8297](https://github.com/rh-hideout/pokeemerald-expansion/pull/8297) +* Use MAP_OFFSET by @estellarc in [#8328](https://github.com/rh-hideout/pokeemerald-expansion/pull/8328) +* Fedora install instructions by @estellarc in [#8355](https://github.com/rh-hideout/pokeemerald-expansion/pull/8355) + +## New Contributors +* @purrfectdoodle made their first contribution in [#7689](https://github.com/rh-hideout/pokeemerald-expansion/pull/7689) +* @montmoguri made their first contribution in [#8252](https://github.com/rh-hideout/pokeemerald-expansion/pull/8252) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.13.3...expansion/1.14.0 + + + + diff --git a/docs/changelogs/1.14.x/1.14.1.md b/docs/changelogs/1.14.x/1.14.1.md new file mode 100644 index 000000000000..1e1631707608 --- /dev/null +++ b/docs/changelogs/1.14.x/1.14.1.md @@ -0,0 +1,22 @@ +```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.14.1 +`. +``` + + +## 🧬 General 🧬 +### Changed +* Pret merge, (1st of December, 2025) by @hedara90 in [#8402](https://github.com/rh-hideout/pokeemerald-expansion/pull/8402) + - This changes all the audio samples from `.aif` to `.wav`, `.aif` support is removed. + - There's a migration script to convert from `.bin` to `.wav` in `migration_scripts/1.14/bin_to_wav.py`. + - Run the migration script with `python migration_scripts/1.14/bin_to_wav.py path/to/folder/with/bin/samples` + + + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.14.0...expansion/1.14.1 + + + + diff --git a/docs/fix_links.py b/docs/fix_links.py index 6e2eaec48546..3a4184b72ccb 100644 --- a/docs/fix_links.py +++ b/docs/fix_links.py @@ -46,6 +46,6 @@ def proc_items(items): sys.exit(0) context, book = json.load(sys.stdin) - proc_items(book['sections']) + proc_items(book['items']) print(json.dumps(book)) diff --git a/docs/install/linux/FEDORA.md b/docs/install/linux/FEDORA.md new file mode 100644 index 000000000000..0dba9c1e7808 --- /dev/null +++ b/docs/install/linux/FEDORA.md @@ -0,0 +1,6 @@ +# Fedora instructions +## Installing dependencies +Open a terminal and run the following command from the command line: +```console +sudo dnf install gcc g++ arm-none-eabi-binutils-cs arm-none-eabi-gcc-cs arm-none-eabi-newlib git libpng-devel python3 +``` diff --git a/docs/local_mdbook/index.md b/docs/local_mdbook/index.md index ef362dc45f77..fa4b7f1e7061 100644 --- a/docs/local_mdbook/index.md +++ b/docs/local_mdbook/index.md @@ -1,2 +1,2 @@ ## Running documentation website locally -- [Ubuntu WSL1/WSL2](/docs/local_mdbook/ubuntu_WSL.md) +- [Ubuntu WSL1/WSL2](ubuntu_WSL.md) diff --git a/docs/team_procedures/merge_checklist.md b/docs/team_procedures/merge_checklist.md index ae3ff60b192e..53e8d7683fcb 100644 --- a/docs/team_procedures/merge_checklist.md +++ b/docs/team_procedures/merge_checklist.md @@ -7,7 +7,7 @@ This document is a guide for maintainers to account for all the reccomended step # Checklist ## Is the branch's theoretical functionality in scope? -If you're not sure if a branch's functionality is [in scope](docs/team_procedures/scope.md), start a conversation on Discord to resolve. +If you're not sure if a branch's functionality is [in scope](scope.md), start a conversation on Discord to resolve. ## Does the branch successfully compile? From `make clean`, the branch should locally compile. @@ -37,18 +37,18 @@ If you're not sure if something CAN be tested, start a discussion. Some contribu If any new tests are `KNOWN_FAILING`, issues should be opened describing each of the `KNOWN_FAILING` tests and our understanding of why they fail. -## Does the branch meet our [config philosophy](/docs/STYLEGUIDE.md#config-philosophy)? +## Does the branch meet our [config philosophy](../STYLEGUIDE.md#config-philosophy)? -## Does the branch meet our [saves philosophy](/docs/STYLEGUIDE.md#saves-philosophy)? +## Does the branch meet our [saves philosophy](../STYLEGUIDE.md#saves-philosophy)? -## Does the submitted code follow the [styleguide](/docs/STYLEGUIDE.md)? +## Does the submitted code follow the [styleguide](../STYLEGUIDE.md)? This applies to code that comes from other branches or games. ## Is the pull request appropriately labeled? Without labels, the CHANGELOG will not be properly formatted. For specifically the `bugfix` label, an additional label, detailing what area the bug exists in is required. ## Is `pokeemerald-expansion` free from a merge freeze? -Our [release schedule](/docs/team_procedures/schedule.md) prevents us from merging Big Features and non-bugfixes within certain dates close to a release. Please use `/release` in the RHH Discord to clarify when these are occuring. +Our [release schedule](schedule.md) prevents us from merging Big Features and non-bugfixes within certain dates close to a release. Please use `/release` in the RHH Discord to clarify when these are occuring. # Merging diff --git a/docs/team_procedures/schedule.md b/docs/team_procedures/schedule.md index c689e5b45457..520c4af00018 100644 --- a/docs/team_procedures/schedule.md +++ b/docs/team_procedures/schedule.md @@ -53,4 +53,4 @@ This designation should be reserved for instances where an existing feature on ` Blocking issues or PRs can be deferred to future releases but should be discussed with the Maintainers that assigned the designation in the first place. -If a version's milestone does not have any issues or PRs assigned to it, that version should be [released](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/docs/team_procedures/expansion_versions.md) as close to the goal date as possible. +If a version's milestone does not have any issues or PRs assigned to it, that version should be [released](expansion_versions.md) as close to the goal date as possible. diff --git a/docs/tutorials/ai_flags.md b/docs/tutorials/ai_flags.md index b0ecc8d77ab1..2c13cee8bdef 100644 --- a/docs/tutorials/ai_flags.md +++ b/docs/tutorials/ai_flags.md @@ -33,7 +33,7 @@ Expansion has a few "composite" AI flags. This means that these flags have no un `AI_FLAG_BASIC_TRAINER` is expansion's version of generic, normal AI behaviour. It includes `AI_FLAG_CHECK_BAD_MOVE` (don't use bad moves), `AI_FLAG_TRY_TO_FAINT` (faint the player where possible), and `AI_FLAG_CHECK_VIABILITY` (choose the most effective move to use in the current context). Trainers with this flag will still be smarter than they are in vanilla as there have been dramatic improvements made to move selection, but not incredibly so. Trainers with this flag should feel like normal trainers. In general we recommend these three flags be used in all cases, unless you specifically want a trainer who makes obvious mistakes in battle. -`AI_FLAG_SMART_TRAINER` is expansion's version of a "smart AI". It includes everything in `AI_FLAG_BASIC_TRAINER` along with `AI_FLAG_SMART_SWITCHING` (make smart decisions about when to switch), `AI_FLAG_SMART_MON_CHOICES` (make smart decisions about what mon to send in after a switch / KO), and `AI_FLAG_OMNISCIENT` (awareness of what moves, items, and abilities the player's mons have to better inform decisions). Expansion will keep this updated to represent the most objectively intelligent behaviour our flags are capable of producing. +`AI_FLAG_SMART_TRAINER` is expansion's version of a "smart AI". It includes everything in `AI_FLAG_BASIC_TRAINER` along with `AI_FLAG_SMART_SWITCHING` (make smart decisions about when to switch), `AI_FLAG_SMART_MON_CHOICES` (make smart decisions about what mon to send in after a switch / KO), `AI_FLAG_OMNISCIENT` (awareness of what moves, items, and abilities the player's mons have to better inform decisions), and `AI_FLAG_SMART_TERA` (make smart decisions about when to terastalize). Expansion will keep this updated to represent the most objectively intelligent behaviour our flags are capable of producing. `AI_FLAG_PREDICTION` will enable all of the prediction flags at once, so the AI can perform as well as possible. It is best paired with the flags in `AI_FLAG_SMART_TRAINER` for optimal behaviour. This currently includes `AI_FLAG_PREDICT_SWITCH` and `AI_FLAG_PREDICT_INCOMING_MON`, but will likely be expanded in the future. @@ -54,6 +54,9 @@ This flag is divided into two components to calculate the best available move fo This is different to `AI_FLAG_CHECK_BAD_MOVE` as it calculates how poor a move is and not whether it will fail or not. +## `AI_FLAG_ATTACKS_PARTNER` +This flag is meant for double battles where both of the opponents hate each other. They prioritize damage to their 'partner' over the player. + ## `AI_FLAG_FORCE_SETUP_FIRST_TURN` AI will prioritize using setup moves on the first turn at the expense of all else. These include stat buffs, field effects, status moves, etc. AI_FLAG_CHECK_VIABILITY will instead do this when the AI determines it makes sense. @@ -144,6 +147,16 @@ Marks the last two PokΓ©mon in the party as Ace PokΓ©mon, with the same behaviou ## `AI_FLAG_OMNISCIENT` AI has full knowledge of player moves, abilities, and hold items, and can use this knowledge when making decisions. +## `AI_FLAG_ASSUME_STAB` +A significantly more restricted version of `AI_FLAG_OMNISCIENT`, the AI only knows the player's STAB moves, as their existence would be reasonable to assume in almost any case. + +## `AI_FLAG_ASSUME_STATUS_MOVES` +A more restricted version of `AI_FLAG_OMNISCIENT`. The AI has a _chance_ to know what status moves the player has, plus additionally Fake Out and fixed percentage moves like Super Fang. The intention is so that if the AI has a counterplay implemented, it will seem to have guessed if the player's pokemon has a move, without giving the AI perfect information. For example, with Omniscient set, the AI will not usually put a pokemon to sleep if it has Sleep Talk; with neither Assume Powerful Status nor Omniscient set, the AI will always assume the pokemon does not have Sleep Talk. + +By default, there are three groups of higher likelihood status moves defined in `include/config/ai.h` under `ASSUME_STATUS_HIGH_ODDS`, `ASSUME_STATUS_MEDIUM_ODDS`, and `ASSUME_STATUS_LOW_ODDS`. Moves are sorted in `src/battle_ai_util.c` within `ShouldRecordStatusMove()`. + +Any move that is not special cased is then potentially caught by `ASSUME_ALL_STATUS_ODDS`. + ## `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. @@ -180,6 +193,9 @@ AI will determine whether it would switch out in the player's situation or not, ## `AI_FLAG_PREDICT_INCOMING_MON` This flag requires `AI_FLAG_PREDICT_SWITCH` to function. If the AI predicts that the player will switch, this flag allows the AI to run its move scoring calculation against the PokΓ©mon it expects the player to switch into, instead of the PokΓ©mon that it expects to switch out. +## `AI_FLAG_SMART_TERA` +AI will make smarter decisions about when to terastalize (over the default behaviour to always tera when available). This considers factors such as whether tera allows the AI to KO the opponent, whether it can save itself from a KO or a big hit, and how many remaining pokemon could terastalize. This behavior is not currently supported in double battles. + ## `AI_FLAG_PREDICT_MOVE` AI will predict what move the player is going to use based on what move it would use in the same situation. Generally works best if also using `AI_FLAG_OMNISCIENT`. diff --git a/docs/tutorials/dns.md b/docs/tutorials/dns.md index 350957f07630..6fdd1c1d7732 100644 --- a/docs/tutorials/dns.md +++ b/docs/tutorials/dns.md @@ -12,6 +12,9 @@ If you intend to use vanilla maps and have not already edited them, revert commi If you _have_ edited vanilla maps, the merge conflicts from reverting that commit will cause problems. If you are using vanilla maps, manually copy some of the tileset changes, `.pal`, and `.pla` files in your branch, and begin rebuilding your metatiles to have windows use the palettes that have a `.pla` for light blending the correct color slots. [Triple-layer metatiles](https://github.com/pret/pokeemerald/wiki/Triple-layer-metatiles) are highly recommended. +WARNING: [As per issue #7034](https://github.com/rh-hideout/pokeemerald-expansion/issues/7034) if you follow this tutorial reverting the previously mentioned commit to use the updated palettes in the Hoenn maps and *after* that you try to follow the [Triple-layer metatiles tutorial](https://github.com/pret/pokeemerald/wiki/Triple-layer-metatiles), you'll encounter an issue when running the script to update old tilesets to support triple-layer metatiles. +Follow the band-aid fix proposed in that issue after this tutorial but before following the triple-layer metatiles tutorial if you want everythign to work properly with light-blended palettes and triple-layer metatiles together. + You will also want to add the lighting object events from that commit. If you are not using Hoenn maps, the primary concern is that you do not use the exact same palette indices for colors you want to be darkened during night time and colors you want to light up. Err towards not light blending a color if you aren't sure how to avoid conflicts. @@ -20,8 +23,8 @@ When writing map scripts, `fadescreenswapbuffers` should be preferred over `fade ### Q: How do I make lightbulbs glow? -![Rustboro before adding lamp object events](/docs/tutorials/img/dns/without_lamp.png) -![Rustboro after adding lamp object events](/docs/tutorials/img/dns/with_lamp.png) +![Rustboro before adding lamp object events](img/dns/without_lamp.png) +![Rustboro after adding lamp object events](img/dns/with_lamp.png) A: Making lamps glow is not part of the tileset itself. Instead, place certain object events on top of where you desire a glowing effect. @@ -45,7 +48,7 @@ on separate lines to mark those colors as being light-blended, i.e: During the day time, these color indices appear as normal, but will be blended with either yellow or the 0 index at night. These indices should only be used for things you expect to light up. If you are using [porytiles](https://github.com/grunt-lucas/porytiles/wiki), palette overrides and using slight alterations to a color will aid you in avoiding color conflicts where the wrong index is assigned. -![Rustboro gym after light-blending the windows](/docs/tutorials/img/dns/window_lights.png) +![Rustboro gym after light-blending the windows](img/dns/window_lights.png) The windows appear as normal during the day time (blue) and light up in the night. These use the default color. diff --git a/docs/tutorials/how_to_apricorn_tree.md b/docs/tutorials/how_to_apricorn_tree.md new file mode 100644 index 000000000000..1efd5f62febf --- /dev/null +++ b/docs/tutorials/how_to_apricorn_tree.md @@ -0,0 +1,58 @@ +# How to interact with Apricorn Trees + +![apricorn-tree](/docs/tutorials/img/apricorn_tree/apricorn-tree.gif) + +### Adding a new apricorn tree + +To add a new tree, first increase the tree count and expand the tree list in `include/constants/apricorn_tree.h`. + +Note that each tree will take a bit in the savegame's `SaveBlock3` struct so increasing `APRICORN_TREE_COUNT` **breaks the savegame**. +Due to this, pokeemerald-expansion doesn't have any trees set up by default to prevent breaking downstream savegames. +The trees support random yields and properly use plural case on plural yields. + +```diff +#define APRICORN_TREE_NONE 0 + +-#define APRICORN_TREE_COUNT 0 ++#define APRICORN_TREE_ROUTE101_RED_TREE 1 ++ ++#define APRICORN_TREE_COUNT 32 +``` + +Then list its data in `src/data/apricorns.h`. + +```diff +const struct ApricornTree gApricornTrees[APRICORN_TREE_COUNT] = +{ + [APRICORN_TREE_NONE] = + { + .minimum = 1, + .maximum = 1, + .apricornType = APRICORN_RED, + }, + ++ [APRICORN_TREE_ROUTE101_RED_TREE] = ++ { ++ .minimum = 1, ++ .maximum = 1, ++ .apricornType = APRICORN_RED, ++ }, +}; +``` +Finally, just place your new tree using Porymap. +Similarly to berries, the Sight Radius / Berry Tree ID field is used for the tree's ID. + +![apricorn-tree-porymap](/docs/tutorials/img/apricorn_tree/apricorn-tree-porymap.png) + +### Add a new apricorn type + +After you created your new item, simply expand the `ApricornType` enum in `include/constants/apricorn_tree.h`. + +```diff +enum ApricornType +{ + [...] + APRICORN_BERRY_MARANGA = ITEM_MARANGA_BERRY, ++ APRICORN_BROWN = ITEM_BROWN_APRICORN, +}; +``` diff --git a/docs/tutorials/how_to_battle_script_command_macro.md b/docs/tutorials/how_to_battle_script_command_macro.md index 2bbf503fbe13..911da7d09c43 100644 --- a/docs/tutorials/how_to_battle_script_command_macro.md +++ b/docs/tutorials/how_to_battle_script_command_macro.md @@ -12,36 +12,33 @@ In general, `gBattlescriptCurrInstr` tracks the current battle script position a ``` `callnative` uses the last battle script command ID in order to pass a native function as an argument. Additional optional arguments are added recursively via a macro, so no need to worry about how they need to align to the amount of instructions to skip. -Now, how might we add a custom `callnative` command? Here are the steps. We will use `BS_TrySetOctolock` as an example. +Now, how might we add a custom `callnative` command? Here are the steps. We will use `BS_JumpIfTerrainAffected` as an example. ### 1. Create a macro in `asm/macros/battle_script.inc`. For example: ```c - .macro trysetoctolock battler:req, failInstr:req - callnative BS_TrySetOctolock + .macro jumpifterrainaffected battler:req, terrainFlags:req, jumpInstr:req + callnative BS_JumpIfTerrainAffected .byte \battler - .4byte \failInstr + .4byte \terrainFlags + .4byte \jumpInstr .endm ``` ### 2. Add your new callnative command ID to `src/battle_script_commands.c`. For example: ```c -void BS_TrySetOctolock(void) +void BS_JumpIfTerrainAffected(void) { - NATIVE_ARGS(u8 battler, const u8 *failInstr); + NATIVE_ARGS(u8 battler, u32 flags, const u8 *jumpInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (gDisableStructs[battler].octolock) - { - gBattlescriptCurrInstr = cmd->failInstr; - } + if (IsBattlerTerrainAffected(battler, cmd->flags)) + gBattlescriptCurrInstr = cmd->jumpInstr; else - { - gDisableStructs[battler].octolock = TRUE; - gBattleMons[battler].status2 |= STATUS2_ESCAPE_PREVENTION; - gDisableStructs[battler].battlerPreventingEscape = gBattlerAttacker; gBattlescriptCurrInstr = cmd->nextInstr; - } } ``` -Each of the arguments defined in the macro (`battler`, `failInstr`) need to be called at the start of the command using `NATIVE_ARGS`. +Each of the arguments defined in the macro (`battler`, `flags`, `failInstr`) need to be called at the start of the command using `NATIVE_ARGS`. The byte count in the macro should correspond to the type that will be used for the command (eg, `u8` is `byte`, while the pointer are `4byte`). -These arguments can then be accessed as `cmd->battler` and `cmd->battler`. -`gBattlescriptCurrInstr = cmd->nextInstr;` advances to the next instruction. +These arguments can then be accessed as `cmd->battler`, `cmd->flags` and `cmd->failInstr`. +Note that for `cmd->battler` we need to use `GetBattlerForBattleScript` to fetch the correct battler because with the macro we are accessing a scripting command that doesn't corresponds to `gBattlerTarget`, `gBattlerAttacker`, etc. +For the battler argument specifically, most of the time the battler is accessed through `gBattlerAttacker`, `gBattlerTarget` and the battler argument left out. +In the majority of cases, this is fine since the script commands are mostly used for moves and the interaction is usually between an attacker and target. +A script command usually ends with either a jump or next instruction `gBattlescriptCurrInstr = cmd->nextInstr / cmd->nextInstr;` advancing to the next instruction. diff --git a/docs/tutorials/how_to_follower_npc.md b/docs/tutorials/how_to_follower_npc.md index e55e6d814925..fbd0087859fc 100644 --- a/docs/tutorials/how_to_follower_npc.md +++ b/docs/tutorials/how_to_follower_npc.md @@ -2,7 +2,7 @@ *Written by Bivurnum* *gif by ghoulslash* -![follower-npc](/docs/tutorials/img/follower_npc/follower-npc.gif) +![follower-npc](img/follower_npc/follower-npc.gif) ## Configs The configs for follower NPCs can be found in [include/config/follower_npc.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/upcoming/include/config/follower_npc.h). @@ -24,11 +24,14 @@ This would turn object number 3 on the current map into an NPC follower, give th The object ***MUST*** have an event flag or the NPC follower will not be created! +## Create a Follower +The `createfollowernpc` macro will create a new follower without needing to convert an existing NPC. It works similarly to `setfollowernpc`, but instead of providing an object id, you give it a GFX id. For example, if you wanted to create a follower with the May sprite, you could do something like this: +`createfollowernpc OBJ_EVENT_GFX_RIVAL_MAY_NORMAL, FNPC_ALL, EventScript_MayFollow` +The created follower NPC will initially be invisible until the player takes a step. + ## Follower Flags These are required to tell the game what behavior you want the NPC follower to have. They are defined in [include/constants/follower_npc.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/upcoming/include/constants/follower_npc.h). The second list of flags is the same as the first, but with shortened names to make them easier to type when scripting. The first 7 flags in the list are individual behaviors, whereas the remaining three are bundles of flags. For example, if you use `FNPC_SURF` in `setfollowernpc`, the NPC follower will be able to Surf behind the player. If you use `FNPC_ALL_WATER` instead, the NPC follower will be able to Dive and go up Waterfalls in addition to being able to Surf. Feel free to add your own custom bundles of flags to the file to meet your needs. -If the NPC doesn't have unique running frames, you should not use the `FOLLOWER_NPC_FLAG_HAS_RUNNING_FRAMES`(`FNPC_RUNNING`) flag for them, as this will cause visual glitching. If the flag is not used, the follower will simply use their regular walking animation frames, just sped up. The only objects currently in the game that have unique running frames are the player and rival characters, so the running frames flag should be used for those. - To make sure the NPC follower uses the correct animation frames, you should add an entry to `gFollowerAlternateSprites` in [include/follower_npc_alternate_sprites.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/upcoming/include/follower_npc_alternate_sprites.h). Only do this if your object has distinct animation frames for different behaviors (running, biking, surfing, etc). Follow the templates for Rival May and Rival Brendan that already exist there. ## Follower Movements diff --git a/docs/tutorials/how_to_namebox.md b/docs/tutorials/how_to_namebox.md new file mode 100644 index 000000000000..db059af61df3 --- /dev/null +++ b/docs/tutorials/how_to_namebox.md @@ -0,0 +1,100 @@ +# How to Use Namebox + +_New implementation made by mudskipper13, originally made by Tustin2121._ + +## Overview + +![Npc Trainers](/docs/tutorials/img/namebox/npc_trainers.gif) +![Pokenav](/docs/tutorials/img/namebox/pokenav.gif) +![Messagebox](/docs/tutorials/img/namebox/msgbox.gif) + +This is a broad and self-contained implementation of Tustin2121's namebox feature branch [here](https://github.com/tustin2121/pokeemerald/tree/feature/namebox), which includes the following: +- Cleaner implementation of namebox onto both the field message box _and_ the field PokΓ©Nav textbox. +- New configs: + - `OW_NAME_BOX_USE_DYNAMIC_WIDTH` lets the namebox use dynamic window width depending on the speaker's string length. + - When disabled and/or the speaker name is too long, `OW_NAME_BOX_DEFAULT_WIDTH` will be used as the maximum width. + - `OW_NAME_BOX_NPC_TRAINER` lets any approaching NPC trainers shows a namebox in their dialogue automagically. + - `OW_NAME_BOX_DEFAULT_WIDTH` and `OW_NAME_BOX_DEFAULT_HEIGHT` sets the default width and height. + - `OW_NAME_BOX_FOREGROUND_COLOR` and `OW_NAME_BOX_SHADOW_COLOR` sets the default text colors, the background color is handled by the engine. + - `OW_FLAG_SUPPRESS_NAME_BOX` lets you enable/disable the namebox globally, assign a flag from [`include/constants/flags.h`](/include/constants/flags.h) onto this config to be able to use it. +- Added a Speaker Name table, frequently-used names can be stored into `gSpeakerNamesTable` in [`src/data/speaker_names.h`](/src/data/speaker_names.h) and they can accessed by using a `SP_NAME_*` constant defined in [`include/constants/speaker_names.h`](/include/constants/speaker_names.h). +- Added a new scripting macro `setspeaker ([textPointer]/[SP_NAME_*])`. + - Besides a text pointer, it is possible to use the Speaker Name table to set the textPointer with the `gSpeakerNamesTable` array instead. + - Feed it either `NULL` or `SP_NAME_NONE` will remove the namebox instead. + - `release`, `releaseall`, and `closemessage` will automatically remove the namebox, together with the messagebox. +- Added a new text control code/inline text `{SPEAKER NAME_*}`. + - Unlike the `setspeaker` macro, you can only use the `SP_NAME_*` constants for this. It is partly due to the text engine's limitation itself. + - You'll need to add the constants into `charmap.txt` to be able to use them for the same reason as above. + - Feed it `SP_NAME_NONE` to remove the namebox manually. + - Similarly, `release`, `releaseall`, and `closemessage` will automatically remove the namebox, together with the message box. + +## Usage + +### `setspeaker` +#### Using a text pointer +First, define your speaker's string. +``` +Speaker_Jeremy: + .string "Jeremy$" +``` + +And then in your script, add the `setspeaker` with the speaker's name earlier. +``` +... + setspeaker Speaker_Jeremy +... +``` + +If you are using poryscript, you can also include the string right there with the `setspeaker` aka inline. +``` +... + setspeaker("Jeremy") +... +``` +#### Using a `SP_NAME_*` constant +Add the `setspeaker` with your constant. +``` + setspeaker SP_NAME_JEREMY +``` +For instruction on how to add a new Speaker Name, continue [here](#adding-a-new-speaker-name). + +### `SPEAKER` inline +The usage is identical to using `setspeaker` with `SP_NAME_*` constant, but instead it's within your _text_ script and uses the constant you added to `charmap.txt`. +``` + "{SPEAKER NAME_JEREMY}Yo wassup!" +``` +For instruction on how to add a new Speaker Name, continue [here](#adding-a-new-speaker-name). + +### Adding a new Speaker Name +1. Add a new constant to [`include/constants/speaker_names.h`](/include/constants/speaker_names.h) just after `SP_NAME_NONE` _and_ before `SP_NAME_COUNT`. +```diff + enum SpeakerNames { + SP_NAME_NONE = 0, + SP_NAME_MOM, + SP_NAME_PLAYER, ++ SP_NAME_JEREMY, + SP_NAME_COUNT + }; + +``` + +2. Add an entry to `gSpeakerNamesTable` in [`src/data/speaker_names.h`](/src/data/speaker_names.h) with your newly added constant as the array index. +```diff + const u8 *const gSpeakerNamesTable[SP_NAME_COUNT] = + { + [SP_NAME_MOM] = COMPOUND_STRING("MOM"), + [SP_NAME_PLAYER] = COMPOUND_STRING("{PLAYER}"), ++ [SP_NAME_JEREMY] = COMPOUND_STRING("JEREMY"), + }; +``` + +3. In order for this constant to be usable for `{SPEAKER}` inline, you'll need to add your constant onto [`charmap.txt`](/charmap.txt). **Do note that the order here MUST match with the one in [`include/constants/speaker_names.h`](/include/constants/speaker_names.h)!** +```diff + @ Speaker names, the order must be matching with include/constants/speaker_names.h + NAME_NONE = 00 + NAME_MOM = 01 + NAME_PLAYER = 02 +-NAME_COUNT = 03 ++NAME_JEREMY = 03 ++NAME_COUNT = 04 +``` diff --git a/docs/tutorials/how_to_new_move.md b/docs/tutorials/how_to_new_move.md index e4289f4c5844..0f7ca1d15c57 100644 --- a/docs/tutorials/how_to_new_move.md +++ b/docs/tutorials/how_to_new_move.md @@ -40,7 +40,6 @@ Let's look at an example: .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .sheerForceBoost = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PARALYSIS, .chance = 10, @@ -94,14 +93,21 @@ Contains more fundamental functions that control the flow of the battle. Functio ### data/battle_scripts_1.s Each move's effect is governed by a script defined here. For a simple example, let's look at the script for Fake Out/First Impression: +TODO: New Script ``` -BattleScript_EffectFirstTurnOnly:: +BattleScript_EffectTaunt:: attackcanceler - jumpifnotfirstturn BattleScript_FailedFromAtkString - goto BattleScript_EffectHit + jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects + accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE + settaunt BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_PKMNFELLFORTAUNT + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd ``` -`attackcanceler` is a command that covers all the cases that could cause a move to fail before it's even attempted (e.g. paralysis). And as we can tell from the commands, if it's not the first turn, we go to `BattleScript_FailedFromAtkString` which evidently causes us to print the `attackstring` ("POKEMON used MOVE") then fail ("But it failed!"). Otherwise, we go to the generic "hit" effect which is the same script for moves that just deal damage and nothing else. +`attackcanceler` is a command that covers all cases that could cause a move to fail before it's even attempted (e.g. paralysis). The next command is a jump command. A jump command can check anything and usually comes with a jump instruction. Usually it jumps to a place from where the move should pick up because of certain conditions. The next one is an accuracy check. Accuracy checks happen after all prior move failure checks happened. The next set of commands are unique to a certain move, they are mostly the same for damaging moves but can widely differ for status moves. Lastly there is `BattleScript_MoveEnd` which the move after a succesful hit. An ability activation or specific move effect like Burn, Freeze, Absorb etc. This is the most advanced part of the ROM. There are dozens upon dozens of commands and hundreds of scripts so this guide would go on forever if I were to go into more detail. To learn how these scripts work, it's best to look at a few examples of moves you know. @@ -140,7 +146,18 @@ If you look at the example [here](#srcdatamoves_infoh), you can see that Thunder All additional effects with a defined chance (even 100%) are treated as "secondary effects". This means that they are nullified by Sheer Force, blocked by Shield Dust or the Covert Cloak, and have their chance modified by Serene Grace. Additional effects without a chance field (effectively setting it to 0) are treated as "primary effects", which means that they cannot be blocked by the aforementioned items and abilities and their chance to occur cannot be modified; they will *always* happen. -Each move can have up to 15 additional effects, allowing you to construct monstrosities like this: +Depending on the move effect, it is possible to also set a `multistring` value. For example: + +``` +.additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_WRAP, + .multistring = B_MSG_WRAPPED_MAGMA_STORM, +}), +``` + +For Magma Storm, we not only want the wrapping move effect, we want to give it a unique string when it activates. The index is an enum defined in `battle_string_ids.h` and it corresponds to an entry (for this move effect) in the `gWrappedStringIds` list in battle_message.c. For custom strings, you need to add an enum and an entry respectively. For new custom move effects, you will have to add a new set of enums and a new table of strings. + +Each move can have up to 3 additional effects, allowing you to construct monstrosities like this: ``` [MOVE_POUND] = { @@ -165,13 +182,6 @@ Each move can have up to 15 additional effects, allowing you to construct monstr },{ .moveEffect = MOVE_EFFECT_FLINCH, .chance = 30, - },{ - .moveEffect = MOVE_EFFECT_ALL_STATS_UP, - .chance = 40, - .self = TRUE, - },{ - .moveEffect = MOVE_EFFECT_DEF_MINUS_2, - .chance = 50, }), .makesContact = TRUE, .ignoresKingsRock = B_UPDATED_MOVE_FLAGS == GEN_4, diff --git a/docs/tutorials/how_to_new_pokemon.md b/docs/tutorials/how_to_new_pokemon.md index de2d41d57c5f..79f01acbd230 100644 --- a/docs/tutorials/how_to_new_pokemon.md +++ b/docs/tutorials/how_to_new_pokemon.md @@ -42,7 +42,7 @@ The main things that the Expansion changes are listed here. # Useful resources You can open a sprite debug menu by pressing `Select` in a PokΓ©mon's summary screen outside of battle. -![visualizer1](/docs/tutorials/img/add_pokemon/visualizer1.gif) +![visualizer1](img/add_pokemon/visualizer1.gif) # The Data - Part 1 @@ -73,7 +73,7 @@ We add this at the end so that no existing species change Id and so that we don' Now, let's see how it looks in-game! -![visualizer2](/docs/tutorials/img/add_pokemon/visualizer2.png) +![visualizer2](img/add_pokemon/visualizer2.png) Hmmm, something's not right... @@ -314,7 +314,8 @@ Cry_Pecharunt:: Then we add the cry ID to [include/constants/cries.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/cries.h): ```diff -enum { +enum PokemonCry +{ CRY_NONE, ... #if P_FAMILY_TERAPAGOS @@ -371,7 +372,8 @@ Edit [include/constants/pokedex.h](https://github.com/rh-hideout/pokeemerald-exp ```diff // National Pokedex order -enum { +enum NationalDexOrder +{ NATIONAL_DEX_NONE, // Kanto NATIONAL_DEX_BULBASAUR, @@ -394,7 +396,8 @@ Do keep in mind that if you intend to add your new species to the Hoenn Dex, you ```diff // Hoenn Pokedex order -enum { +enum HoennDexOrder +{ HOENN_DEX_NONE, HOENN_DEX_TREECKO, ... @@ -443,7 +446,7 @@ Now we can add the number and entry to our Mewthree: }, }; ``` -![image](/docs/tutorials/img/add_pokemon/dex1.png) +![image](img/add_pokemon/dex1.png) The values `pokemonScale`, `pokemonOffset`, `trainerScale` and `trainerOffset` are used for the height comparison figure in the PokΓ©dex. @@ -494,7 +497,7 @@ Edit [src/data/pokemon/pokedex_orders.h](https://github.com/rh-hideout/pokeemera ... }; ``` -![mGBA_lUBfmFEKUx](/docs/tutorials/img/add_pokemon/dex2.gif) +![mGBA_lUBfmFEKUx](img/add_pokemon/dex2.gif) # The Graphics @@ -524,9 +527,9 @@ Edit [src/data/graphics/pokemon.h](https://github.com/rh-hideout/pokeemerald-exp ```diff #if P_FAMILY_PECHARUNT const u32 gMonFrontPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/front.4bpp.lz"); - const u32 gMonPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/normal.gbapal.lz"); + const u16 gMonPalette_Pecharunt[] = INCBIN_U16("graphics/pokemon/pecharunt/normal.gbapal"); const u32 gMonBackPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/back.4bpp.lz"); - const u32 gMonShinyPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/shiny.gbapal.lz"); + const u16 gMonShinyPalette_Pecharunt[] = INCBIN_U16("graphics/pokemon/pecharunt/shiny.gbapal"); const u8 gMonIcon_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/footprint.1bpp"); @@ -534,20 +537,20 @@ Edit [src/data/graphics/pokemon.h](https://github.com/rh-hideout/pokeemerald-exp #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_Pecharunt[] = INCBIN_COMP("graphics/pokemon/pecharunt/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - const u32 gOverworldPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/overworld_normal.gbapal.lz"); - const u32 gShinyOverworldPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/overworld_shiny.gbapal.lz"); + const u16 gOverworldPalette_Pecharunt[] = INCBIN_U16("graphics/pokemon/pecharunt/overworld_normal.gbapal"); + const u16 gShinyOverworldPalette_Pecharunt[] = INCBIN_U16("graphics/pokemon/pecharunt/overworld_shiny.gbapal"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_PECHARUNT const u32 gMonFrontPic_Egg[] = INCBIN_U32("graphics/pokemon/egg/anim_front.4bpp.lz"); - const u32 gMonPalette_Egg[] = INCBIN_U32("graphics/pokemon/egg/normal.gbapal.lz"); + const u16 gMonPalette_Egg[] = INCBIN_U16("graphics/pokemon/egg/normal.gbapal"); const u8 gMonIcon_Egg[] = INCBIN_U8("graphics/pokemon/egg/icon.4bpp"); + const u32 gMonFrontPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/anim_front.4bpp.lz"); + const u32 gMonBackPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/back.4bpp.lz"); -+ const u32 gMonPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/normal.gbapal.lz"); -+ const u32 gMonShinyPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/shiny.gbapal.lz"); ++ const u16 gMonPalette_Mewthree[] = INCBIN_U16("graphics/pokemon/mewthree/normal.gbapal"); ++ const u16 gMonShinyPalette_Mewthree[] = INCBIN_U16("graphics/pokemon/mewthree/shiny.gbapal"); + const u8 gMonIcon_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/icon.4bpp"); + const u8 gMonFootprint_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/footprint.1bpp"); ``` @@ -1055,7 +1058,7 @@ What this allows us to do is to be able to get all forms of a PokΓ©mon in our co For example, in the HGSS dex, it lets us browse between the entries of every form available.: -![hgssdex1](/docs/tutorials/img/add_pokemon/hgssdex1.png) ![image](/docs/tutorials/img/add_pokemon/hgssdex2.png) +![hgssdex1](img/add_pokemon/hgssdex1.png) ![image](img/add_pokemon/hgssdex2.png) In addition, we have the `GET_BASE_SPECIES_ID` macro, which returns the first entry of the table (or return the species itself if it doesn't have a table registered). With this, you can check if a PokΓ©mon is any form of a species. For example, making it so that the Light Ball affects all Pikachu forms: ```c @@ -1086,7 +1089,7 @@ The second value is the target form, to which the PokΓ©mon will change into. Values after that are referred as arguments, and needs to be put there depends on the type of form change, detailed in `include/constants/form_change_types.h`. ## 3. Gender differences -![gender_diffs](/docs/tutorials/img/add_pokemon/gender_diffs.gif) +![gender_diffs](img/add_pokemon/gender_diffs.gif) You may have seen that there's a couple of duplicate fields with a "Female" suffix. ```diff @@ -1259,8 +1262,8 @@ Either way, you may also create custom animation tables and use them here approp ### How to add the PokΓ©mon Object Events to map In Porymap, select the object you want to set the sprite to. Then, change the field "Sprite" to use `OBJ_EVENT_GFX_SPECIES(SPECIES)`, replacing SPECIES with the name of the species you want to use. If you get a compiler error, it's because it used the species define as part of the macro, so it needs to match how you defined it all the way back in [Declare a species constant](#1-Declare-a-species-constant). -![charizard](/docs/tutorials/img/add_pokemon/charizard.png) -![overworld_data](/docs/tutorials/img/add_pokemon/overworld_data.gif) +![charizard](img/add_pokemon/charizard.png) +![overworld_data](img/add_pokemon/overworld_data.gif) If you want to use their shiny and/or female versions, use one of the following macros: - `OBJ_EVENT_GFX_SPECIES_SHINY(name)` diff --git a/docs/tutorials/how_to_testing_system.md b/docs/tutorials/how_to_testing_system.md index 2e5f83ff7668..70ee6c4033f7 100644 --- a/docs/tutorials/how_to_testing_system.md +++ b/docs/tutorials/how_to_testing_system.md @@ -79,7 +79,7 @@ SINGLE_BATTLE_TEST("Stun Spore does not affect Grass-types") { GIVEN { ASSUME(IsPowderMove(MOVE_STUN_SPORE)); - ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS); PLAYER(SPECIES_ODDISH); // 1. OPPONENT(SPECIES_ODDISH); // 2. } WHEN { @@ -164,17 +164,17 @@ 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. -The main differences for doubles are: +`SINGLE_BATTLE_TEST(name, results...)`, `DOUBLE_BATTLE_TEST(name, results...)`, `MULTI_BATTLE_TEST(name, results...)`, `TWO_VS_ONE_BATTLE_TEST(name, results...)`, and `ONE_VS_TWO_BATTLE_TEST(name, results...)` +Define single-, double-, 2v2-multi-, 2v1-multi-, and 1v2- 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, 2v2, 2v1, and 1v2 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...)`, `AI_DOUBLE_BATTLE_TEST(name, results...)`, `AI_MULTI_BATTLE_TEST(name, results...)`, `AI_TWO_VS_ONE_BATTLE_TEST(name, results...)`, and `AI_ONE_VS_TWO_BATTLE_TEST(name, results...)` Define battles where opponent mons are controlled by AI, the same that runs when battling regular Trainers. The flags for AI should be specified by the `AI_FLAGS` command. -The rules remain the same as with the `SINGLE` and `DOUBLE` battle tests with some differences: +The rules remain the same as with the `SINGLE`, `DOUBLE`, `MULTI`, `TWO_VS_ONE`, and `ONE_VS_TWO` battle tests with some differences: - opponent's action is specified by the `EXPECT_MOVE` / `EXPECT_SEND_OUT` / `EXPECT_SWITCH` commands - we don't control what opponent actually does, instead we make sure the opponent does what we expect it to do - we still control the player's action the same way @@ -268,7 +268,7 @@ GIVEN { ``` ### `PLAYER` and `OPPONENT` -`PLAYER(species)` and `OPPONENT(species` +`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)` @@ -285,11 +285,29 @@ For example to create a level 42 Wobbuffet that is poisoned: **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.** +### `MULTI_PLAYER`, `MULTI_PARTNER`, `MULTI_OPPONENT_A`, and `MULTI_OPPONENT_B` +For tests using `MULTI_BATTLE_TEST`, `AI_MULTI_BATTLE_TEST`, `TWO_VS_ONE_BATTLE_TEST`, `AI_TWO_VS_ONE_BATTLE_TEST`, `ONE_VS_TWO_BATTLE_TEST`, and `AI_ONE_VS_TWO_BATTLE_TEST`, the below must be used instead of `PLAYER(species)` and `OPPONENT(species)`. +`MULTI_PLAYER(species)`, `MULTI_PARTNER(species)`, `MULTI_OPPONENT_A(species)`, and `MULTI_OPPONENT_B(species)` +Adds the species to the player's, player partner's, opponent A's, or opponent B's party, respectively. +Pokemon can be customised as per the guidance for `PLAYER(species)` and `OPPONENT(species)`. +The functions assign the PokΓ©mon to the party of the trainer at `B_POSITION_PLAYER_LEFT`, `B_POSITION_PLAYER_RIGHT`, `B_POSITION_OPPONENT_LEFT`, and `B_POSITION_OPPONENT_RIGHT`, respectively. +`MULTI_PLAYER(species)` and `MULTI_OPPONENT_A(species)` set PokΓ©mon starting at party index 0, while `MULTI_PARTNER(species)` and `MULTI_OPPONENT_B(species)` set PokΓ©mon starting at party index 3. +For `ONE_VS_TWO` tests, `MULTI_PLAYER(species)` must be used for all player-side PokΓ©mon, and for `TWO_VS_ONE` tests, `MULTI_OPPONENT_A(species)` must be used for all opponent-side PokΓ©mon. +All `MULTI_PLAYER(species)` PokΓ©mon must be set before any `MULTI_PARTNER(species)` PokΓ©mon, and all `MULTI_OPPONENT_A(species)` must be set before any `MULTI_OPPONENT_B(species)` PokΓ©mon, else PokΓ©mon will be set in the incorrect parties in the test. +**Note where a side in a test has two trainers, the test setup manages the assigning of correct multi-party orders, therefore when using functions such as SEND_OUT, Player and Opponent A PokΓ©mon may be referenced using indexes 0, 1, and 2, and Player's Partner and Opponent B PokΓ©mon may be referenced using indexes 3, 4, and 5.** + ### `AI_FLAGS` `AI_FLAGS(flags)` -Specifies which AI flags are run during the test. Has use only for AI tests. +Specifies which AI flags are run for all battlers 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. +### `BATTLER_AI_FLAGS` +`BATTLER_AI_FLAGS(battler, flags)` +Specifies additional AI flags to be applied to specific battlers (battler 0/1/2/3). Has use only for AI tests. +Must be used strictly after `AI_FLAGS(flags)`, which overwrites all existing flags. +Example: `BATTLER_AI_FLAGS(3, AI_FLAG_RISKY)` used after `AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT)` +will set `AI_FLAG_RISKY` to only `battler3` (Opponent B), in addition to the flags set by `AI_FLAGS`. + ### `WHEN` ``` ... @@ -428,7 +446,7 @@ Spaces in pattern match newlines (\n, \l, and \p) in the message. Often used to check that a battler took its turn but it failed, e.g.: ``` MESSAGE("Wobbuffet used Dream Eater!"); - MESSAGE("The opposing Wobbuffet wasn't affected!"); + MESSAGE("It doesn't affect the opposing Wobbuffet…"); ``` ### `STATUS_ICON` @@ -446,6 +464,20 @@ If the expected status icon is parametrized the corresponding `STATUS1` constant STATUS_ICON(player, status1); ``` +### `SUB_HIT` +`SUB_HIT(battler, captureDamage: | subBreak:)` +Causes the test to fail the test to fail if a Substitute for the specified battler doesn't take damage. +If `captureDamage` is used, the damage the substitute takes is written to the supplied pointer. +``` +u16 damage; +... +SUB_HIT(player, captureDamage: &damage); +``` +If `subBreak` is set to `TRUE`, the test will fail unless the substitute breaks. And if set to `FALSE`, the test will fail unless the substitute survives. +``` +SUB_HIT(player, subBreak: TRUE); +``` + ### `NOT` `NOT sceneCommand` Causes the test to fail if the `SCENE` command succeeds before the following command succeeds. @@ -465,10 +497,10 @@ Causes the test to fail if the `SCENE` command succeeds before the following com ``` Causes the test to fail unless one of the `SCENE` commands succeeds. ``` - ONE_OF { - MESSAGE("Wobbuffet used Celebrate!"); - MESSAGE("Wobbuffet couldn't move because it's paralyzed!"); - } + ONE_OF { + MESSAGE("Wobbuffet used Celebrate!"); + MESSAGE("Wobbuffet couldn't move because it's paralyzed!"); + } ``` ### `NONE_OF` @@ -479,12 +511,12 @@ Causes the test to fail unless one of the `SCENE` commands succeeds. ``` Causes the test to fail if one of the `SCENE` commands succeeds before the command after the `NONE_OF` succeeds. ``` - // Our Wobbuffet does not move before the foe's. - NONE_OF { - MESSAGE("Wobbuffet used Celebrate!"); - MESSAGE("Wobbuffet couldn't move because it's paralyzed!"); - } - MESSAGE("The opposing Wobbuffet used Celebrate!"); + // Our Wobbuffet does not move before the foe's. + NONE_OF { + MESSAGE("Wobbuffet used Celebrate!"); + MESSAGE("Wobbuffet couldn't move because it's paralyzed!"); + } + MESSAGE("The opposing Wobbuffet used Celebrate!"); ``` ### `PLAYER_PARTY` diff --git a/docs/tutorials/how_to_trainer_back_pic.md b/docs/tutorials/how_to_trainer_back_pic.md new file mode 100644 index 000000000000..5c262942ae8d --- /dev/null +++ b/docs/tutorials/how_to_trainer_back_pic.md @@ -0,0 +1,93 @@ +# How to add a new trainer back pic + +## Content +* [Quick Summary](#quick-summary) +* [The Graphics](#the-graphics) + * [1. Edit the sprites](#2-edit-the-sprites) + * [2. Register the sprites](#2-register-the-sprites) + * [3. Connecting pictures to the data](#2-connecting-pictures-to-the-data) +* [The Data](#the-data) + * [4. Defining the trainer back pic](#2-defining-the-trainer-back-pic) +* [Usage](#usage) + +## Quick Summary +If you've done this before and just need a quick lookup, here's what files you need: +1. Place graphics in [`graphics/trainers/back_pics`](./graphics/trainers/back_pics). +2. Point game to where graphic files are found: [`src/data/graphics/trainers`](./src/data/graphics/trainers.h). +3. Add trainer to [`include/constants/trainers.h`](./include/constants/trainers.h), + +## The Graphics + +### 1. Add the sprites +We will start with a graphic that we want to use for our new trainer pic. Unlike with adding PokΓ©mon, the trainer sprites aren't sorted in individual folders, but rather in one folder: [`graphics/trainers/back_pics`](./graphics/trainers/back_pics). **Trainers sprites cannot be more than 16 - this includes the color that will be transparent, which is the first slot of the palette.** + +### 2. Register the sprites +Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them by linking the graphic files in [`src/data/graphics/trainers.h`](./src/data/graphics/trainers.h): +```diff + const u8 gTrainerBackPic_Wally[] = INCBIN_U8("graphics/trainers/back_pics/wally.4bpp"); + const u8 gTrainerBackPic_Steven[] = INCBIN_U8("graphics/trainers/back_pics/steven.4bpp"); ++const u8 gTrainerBackPic_NewOne[] = INCBIN_U8("graphics/trainers/back_pics/new_one.4bpp"); + + const u16 gTrainerBackPicPalette_Red[] = INCBIN_U16("graphics/trainers/back_pics/red.gbapal"); + const u16 gTrainerBackPicPalette_Leaf[] = INCBIN_U16("graphics/trainers/back_pics/leaf.gbapal"); ++const u16 gTrainerBackPicPalette_NewOne[] = INCBIN_U16("graphics/trainers/back_pics/new_one.gbapal"); +``` + +### 3. Connecting the Pictures to the Data +The last few things we have to do is prepare the graphics for usage. In [`src/data/graphics/trainers.h`](./src/data/graphics/trainers.h) you'll find the `gTrainerBacksprites` struct, we need to add the trainer to this. You can just copy the last trainer type defined and edit it, but this is what it does: Connects the new trainer with the image we defined earlier. + +So, finally, it needs to look like this: +```diff + #define TRAINER_BACK_SPRITE(trainerPic, yOffset, sprite, pal, anim) \ + [trainerPic] = \ + { \ + .coordinates = {.size = 8, .y_offset = yOffset}, \ + .backPic = {.data = sprite, .size = TRAINER_PIC_SIZE, .relativeFrames = TRUE}, \ + .palette = {.data = pal, .tag = trainerPic}, \ + .animation = anim, \ + } + + const struct TrainerBacksprite gTrainerBacksprites[] = + { + TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_BRENDAN, 4, gTrainerBackPic_Brendan, gTrainerPalette_Brendan, sBackAnims_Hoenn), + ... + TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_STEVEN, 4, gTrainerBackPic_Steven, gTrainerPalette_Steven, sBackAnims_Hoenn), ++ TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_NEW_ONE, 4, gTrainerBackPic_NewOne, gTrainerBackPicPalette_NewOne, sBackAnims_Hoenn), +}; +``` + +**Note**: Trainer back pics can have 4 or 5 frames of animation. Trainers with 5 frames must have their `yOffset` set to 5, and their `anim` set to `sBackAnims_Kanto`. + +### The Data +#### 4. Defining the trainer back pic +Finally, let's bring it all together by defining our new trainer pic in [`include/constants/trainers.h`](./include/constants/trainers.h): + +```diff + #define TRAINER_BACK_PIC_WALLY 6 + #define TRAINER_BACK_PIC_STEVEN 7 ++#define TRAINER_BACK_PIC_NEW_ONE 8 +``` +Remember to count the number next to the trainer pic up by one! + +## Usage +You can test your new trainer back pic by going to [`src/data/battle_partners.party`](./src/data/battle_partners.party) and change the `Pic` field. The syntax should match the constant (`TRAINER_BACK_PIC_NEW_ONE`) with the underscore replaced by spaces. For example: +```diff + === PARTNER_STEVEN === + Name: STEVEN + Class: Rival +-Pic: Steven ++Pic: New One + Gender: Male + Music: Male +``` + +Otherwise if you use [`src/data/battle_partners.h`](./src/data/battle_partners.h), change the `trainerPic` field instead. For example: +```diff + [DIFFICULTY_NORMAL][PARTNER_STEVEN] = + { + .trainerName = _("STEVEN"), + .trainerClass = TRAINER_CLASS_RIVAL, +- .trainerPic = TRAINER_BACK_PIC_STEVEN, ++ .trainerPic = TRAINER_BACK_PIC_NEW_ONE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, +``` diff --git a/docs/tutorials/how_to_trainer_front_pic.md b/docs/tutorials/how_to_trainer_front_pic.md new file mode 100644 index 000000000000..1b3d303bf99e --- /dev/null +++ b/docs/tutorials/how_to_trainer_front_pic.md @@ -0,0 +1,97 @@ +# How to add a new trainer front pic + +## Content +* [Quick Summary](#quick-summary) +* [The Graphics](#the-graphics) + * [1. Edit the sprites](#2-edit-the-sprites) + * [2. Register the sprites](#2-register-the-sprites) + * [3. Connecting pictures to the data](#2-connecting-pictures-to-the-data) +* [The Data](#the-data) + * [4. Defining the trainer pic](#2-defining-the-trainer-pic) +* [Usage](#usage) + +## Quick Summary +If you've done this before and just need a quick lookup, here's what files you need: +1. Place graphics into [`graphics/trainers/front_pics`](./graphics/trainers/front_pics). +2. Point game to where graphic files are found: [`src/data/graphics/trainers`](./src/data/graphics/trainers.h). +3. Add trainer to [`include/constants/trainers.h`](./include/constants/trainers.h). + +## The Graphics + +### 1. Edit the sprites +We will start with a graphic that we want to use for our new trainer pic. Unlike with adding PokΓ©mon, the trainer sprites aren't sorted in individual folders, but rather in one folder: [`graphics/trainers/front_pics`](./graphics/trainers/front_pics). **Trainers sprites cannot have more than 16 colors - this includes the color that will be transparent, which is the first slot of the palette.** + +### 2. Register the sprites +Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them by linking the graphic files in [`src/data/graphics/trainers`](./data/graphics/trainers.h): +```diff + const u16 gTrainerPalette_RubySapphireBrendan[] = INCBIN_U16("graphics/trainers/palettes/brendan_rs.gbapal"); + + const u32 gTrainerFrontPic_RubySapphireMay[] = INCBIN_U32("graphics/trainers/front_pics/may_rs.4bpp.smol"); + const u16 gTrainerPalette_RubySapphireMay[] = INCBIN_U16("graphics/trainers/palettes/may_rs.gbapal"); ++ ++const u32 gTrainerFrontPic_NewOne[] = INCBIN_U32("graphics/trainers/front_pics/new_one.4bpp.smol"); ++const u16 gTrainerPalette_NewOne[] = INCBIN_U16("graphics/trainers/front_pics/new_one.gbapal"); + + const u8 gTrainerBackPic_Brendan[] = INCBIN_U8("graphics/trainers/back_pics/brendan.4bpp"); +``` + +### 3. Connecting the Pictures to the Data +The last few things we have to do is prepare the graphics for usage. In [`src/data/graphics/trainers.h`](./src/data/graphics/trainers.h) you'll find the `gTrainerSprites` struct, we need to add the trainer to this. You can just copy the last trainer type defined and edit it, but this is what it does: Connects the new trainer with the image we defined earlier. + +So, finally, it needs to look like this: +```diff + #define TRAINER_SPRITE(trainerPic, picFile, paletteFile, ...) \ + [trainerPic] = \ + { \ + .frontPic = {picFile, TRAINER_PIC_SIZE, trainerPic}, \ + .palette = {paletteFile, trainerPic}, \ + .mugshotCoords = {DEFAULT(0, __VA_ARGS__), DEFAULT_2(0, __VA_ARGS__)}, \ + .mugshotRotation = DEFAULT_3(0x200, __VA_ARGS__), \ + } + + const struct TrainerSprite gTrainerSprites[] = + { + TRAINER_SPRITE(TRAINER_PIC_HIKER, gTrainerFrontPic_Hiker, gTrainerPalette_Hiker), + TRAINER_SPRITE(TRAINER_PIC_AQUA_GRUNT_M, gTrainerFrontPic_AquaGruntM, gTrainerPalette_AquaGruntM), + ... + TRAINER_SPRITE(TRAINER_PIC_RS_MAY, gTrainerFrontPic_RubySapphireMay, gTrainerPalette_RubySapphireMay), ++ TRAINER_SPRITE(TRAINER_PIC_NEW_ONE, gTrainerFrontPic_NewOne, gTrainerPalette_NewOne), + }; +``` +### The Data +#### 4. Defining the trainer pic +Finally, let's bring it all together by defining our new trainer pic in [`include/constants/trainers.h`](./include/constants/trainers.h): + +```diff + #define TRAINER_PIC_RS_MAY 92 ++#define TRAINER_PIC_NEW_ONE 93 + + #define TRAINER_BACK_PIC_BRENDAN 0 + #define TRAINER_BACK_PIC_MAY 1 +``` +Remember to count the number next to the trainer pic up by one! + +## Usage +You can test your trainer type by going to [`src/data/trainers.party`](./src/data/trainers.party) and change the `Pic` field. The syntax should match the constant (`TRAINER_PIC_NEW_ONE`) with the underscore replaced by spaces. For example: +```diff + === TRAINER_BRENDAN_PLACEHOLDER === + Name: BRENDAN + Class: RS Protag +-Pic: RS Brendan ++Pic: New One + Gender: Male + Music: Male + Double Battle: No +``` + +Otherwise if you use [`src/data/trainers.h`](./src/data/trainers.h), change the `.trainerPic` field instead. For example: +```diff + [DIFFICULTY_NORMAL][TRAINER_BRENDAN_PLACEHOLDER] = + { + .trainerName = _("BRENDAN"), + .trainerClass = TRAINER_CLASS_RS_PROTAG, +- .trainerPic = TRAINER_PIC_RS_BRENDAN, ++ .trainerPic = TRAINER_PIC_NEW_ONE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .doubleBattle = FALSE, +``` diff --git a/docs/tutorials/how_to_trainer_party_pool.md b/docs/tutorials/how_to_trainer_party_pool.md index e0e7639de376..e111ba957e2f 100644 --- a/docs/tutorials/how_to_trainer_party_pool.md +++ b/docs/tutorials/how_to_trainer_party_pool.md @@ -52,6 +52,11 @@ By default, only `DefaultPickFunction` and `PickLowest` are implemente - `Pool Prune` (`.poolPruneIndex`) controls if members in the pool should be removed before party members are picked from the pool. By default, only `POOL_PRUNE_NONE`, which doesn't remove anything from the pool, and `POOL_PRUNE_TEST`, which removes Wobbuffet from the pool, are implemented. Must be an `enum` value in `enum PoolPruneOptions`. +## Pool copy +The `Copy Pool` option can be used to have the trainer use the party or pool from a different trainer. +If you for example want some other trainer to have the same team/pool as Tiana, you'd use `Copy Pool: TRAINER_TIANA`. +If `Party Size` isn't defined for the current trainer, it will inherit from the copied trainer. + ## Example pool ``` === TRAINER_TIANA === diff --git a/docs/tutorials/how_to_trainer_pic.md b/docs/tutorials/how_to_trainer_pic.md deleted file mode 100644 index beddb641e45e..000000000000 --- a/docs/tutorials/how_to_trainer_pic.md +++ /dev/null @@ -1,98 +0,0 @@ -# How to add a new trainer pic - -## Content -* [Quick Summary](#quick-summary) -* [The Graphics](#the-graphics) - * [1. Edit the sprites](#2-edit-the-sprites) - * [2. Register the sprites](#2-register-the-sprites) - * [3. Connecting pictures to the data](#2-connecting-pictures-to-the-data) -* [The Data](#the-data) - * [4. Defining the trainer pic](#2-defining-the-trainer-pic) -* [Usage](#usage) - -## Quick Summary -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. 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) -4. Add trainer to [include/constants/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/trainers.h) - -## The Graphics - -### 1. Edit the sprites -We will start with a graphic that we want to use for our new trainer pic. Unlike with adding PokΓ©mon, the trainer sprites aren't sorted in individual folders, but rather in one folder: -[graphics/trainers/front_pics](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/front_pics) - -**Remember to limit yourself to 16 colors including transparency in the first slot!** - -Export the palette and place into the same folder. - -### 2. Register the sprites -Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them by linking the graphic files. -[src/data/graphics/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h): -```diff -const u16 gTrainerPalette_RubySapphireBrendan[] = INCBIN_U16("graphics/trainers/palettes/ruby_sapphire_brendan.gbapal"); - -const u32 gTrainerFrontPic_RubySapphireMay[] = INCBIN_U32("graphics/trainers/front_pics/ruby_sapphire.4bpp.lz"); -const u16 gTrainerPalette_RubySapphireMay[] = INCBIN_U16("graphics/trainers/palettes/ruby_sapphire_may.gbapal"); - -+ const u32 gTrainerFrontPic_myTrainerClass[] = INCBIN_U32("graphics/trainers/front_pics/myTrainerClass.4bpp.lz"); -+ const u16 gTrainerPalette_myTrainerClass[] = INCBIN_U16("graphics/trainers/palettes/myTrainerClass.gbapal"); - -const u8 gTrainerBackPic_Brendan[] = INCBIN_U8("graphics/trainers/back_pics/brendan.4bpp"); -``` - -### 3. Connecting the Pictures to the Data -The last few things we have to do is prepare the graphics for usage. In [src/data/graphics/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h) you'll find the gTrainerSprites struct, we need to add the trainer to this. You can just copy the last trainer type defined and edit it, but this is what it does: Connects the trainer type with the image we defined earlier. - -So, finally, it needs to look like this: -```diff -define TRAINER_SPRITE(trainerPic, picFile, paletteFile, ...) \ - [trainerPic] = \ - { \ - .frontPic = {picFile, TRAINER_PIC_SIZE, trainerPic}, \ - .palette = {paletteFile, trainerPic}, \ - .mugshotCoords = {DEFAULT(0, __VA_ARGS__), DEFAULT_2(0, __VA_ARGS__)}, \ - .mugshotRotation = DEFAULT_3(0x200, __VA_ARGS__), \ - } - -const struct TrainerSprite gTrainerSprites[] = -{ - TRAINER_SPRITE(TRAINER_PIC_HIKER, gTrainerFrontPic_Hiker, gTrainerPalette_Hiker), - TRAINER_SPRITE(TRAINER_PIC_AQUA_GRUNT_M, gTrainerFrontPic_AquaGruntM, gTrainerPalette_AquaGruntM), - ... - TRAINER_SPRITE(TRAINER_PIC_RS_MAY, gTrainerFrontPic_RubySapphireMay, gTrainerPalette_RubySapphireMay), - TRAINER_SPRITE(TRAINER_PIC_MY_TRAINER_CLASS, gTrainerFrontPic_myTrainerClass, gTrainerPalette_myTrainerClass) -}; -``` -### The Data -#### 4. Defining the trainer pic -Finally, let's bring it all together by defining our new trainer pic in [include/constants/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/trainers.h): - -```diff -#define TRAINER_PIC_RS_MAY 92 -+ #define TRAINER_PIC_MY_TRAINER_CLASS 93 - -#define TRAINER_BACK_PIC_BRENDAN 0 -#define TRAINER_BACK_PIC_MAY 1 -``` -Remember to count the number next to the trainer pic up by one! - -## Usage -You can test your trainer type by going to [src/data/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainers.h) and changing a trainer type. For example: -```diff - [TRAINER_BRENDAN_PLACEHOLDER] = - { - .partyFlags = 0, - .trainerClass = TRAINER_CLASS_RS_PROTAG, - .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, -- .trainerPic = TRAINER_PIC_RS_BRENDAN, -+ .trainerPic = TRAINER_PIC_MY_TRAINER_CLASS, - .trainerName = _("BRENDAN"), - .items = {}, - .doubleBattle = FALSE, - .aiFlags = 0, - .partySize = ARRAY_COUNT(sParty_BrendanLinkPlaceholder), - .party = {.NoItemDefaultMoves = sParty_BrendanLinkPlaceholder}, - }, -``` diff --git a/docs/tutorials/img/apricorn_tree/apricorn-tree-porymap.png b/docs/tutorials/img/apricorn_tree/apricorn-tree-porymap.png new file mode 100644 index 000000000000..1b75f885daf9 Binary files /dev/null and b/docs/tutorials/img/apricorn_tree/apricorn-tree-porymap.png differ diff --git a/docs/tutorials/img/apricorn_tree/apricorn-tree.gif b/docs/tutorials/img/apricorn_tree/apricorn-tree.gif new file mode 100644 index 000000000000..e7769d87c8b2 Binary files /dev/null and b/docs/tutorials/img/apricorn_tree/apricorn-tree.gif differ diff --git a/docs/tutorials/img/namebox/msgbox.gif b/docs/tutorials/img/namebox/msgbox.gif new file mode 100644 index 000000000000..a5d9455725cd Binary files /dev/null and b/docs/tutorials/img/namebox/msgbox.gif differ diff --git a/docs/tutorials/img/namebox/npc_trainers.gif b/docs/tutorials/img/namebox/npc_trainers.gif new file mode 100644 index 000000000000..6e9e1b13fb23 Binary files /dev/null and b/docs/tutorials/img/namebox/npc_trainers.gif differ diff --git a/docs/tutorials/img/namebox/pokenav.gif b/docs/tutorials/img/namebox/pokenav.gif new file mode 100644 index 000000000000..6de3f1370d5f Binary files /dev/null and b/docs/tutorials/img/namebox/pokenav.gif differ diff --git a/docs/tutorials/vs_seeker.md b/docs/tutorials/vs_seeker.md new file mode 100644 index 000000000000..136465a5b482 --- /dev/null +++ b/docs/tutorials/vs_seeker.md @@ -0,0 +1,115 @@ +# `pokemerald-expansion` Vs. Seeker + +## What is the Vs. Seeker? +The Vs. Seeker is a Key Item that is used to battle Trainers that the player has battled previously. + +When used, the Vs. Seeker sends out a signal that allows the player to find other Trainers who want a rematch. This signal affects all Trainers that are on-screen. Once used on Trainers that can be rematched, the device cannot be used again until it is charged. The player does this by walking a specific number of steps. The effect on the Trainers wears off if they are battled, the player leaves the area, or the player walks a specific number of steps. If the player attempts to use the Vs. Seeker when it is not fully charged, the player will be told how many steps remain until it is. After the player uses the Vs. Seeker, some Trainers may have their team changed from their first battle. + +## How is the Vs. Seeker enabled? +### Users +Vs. Seeker functionality is enabled by setting `I_VS_SEEKER_CHARGING` to `TRUE`. + +### Players +`ITEM_VS_SEEKER` can only be used outside of battle. It can be used from the bag or registered to be used from the field. + +Usage of the Vs. Seeker will ALWAYS fail unless all of the conditions are met: +* Player has at least five badges +* There is an NPC on screen that has previously been defeated +* Player is not inside of a building +* The Vs. Seeker is fully recharged + +#### Charge +If the player has `ITEM_VS_SEEKER` and at least five badges, the Vs. Seeker will be charged by walking steps. The Vs. Seeker is fully charged once the player has walked `VSSEEKER_RECHARGE_STEPS`, which is `100` by default. The Vs. Seeker's charge is depleted if the player uses the item. + +### How does Match Call interact with the Vs. Seeker? +When `I_VS_SEEKER_CHARGING` is enabled, the Match Call does not function at all. Trainers will never be rematch eligible outside of the use of the Vs. Seeker. + +## How does the Vs. Seeker choose a Trainer? + +When the Vs. Seeker is successfully used, every Trainer on screen is individually queried. There is a 31% chance that the Trainer will want a rematch. +Objects listed in `regularTrainersOnLand` or `regularTrainersInWater` are considered Land/Water objects. + +| Status | Is Land/Water Object | Emote | New Movement Type | +| --- | --- | --- | --- | +| Wants Rematch | Yes | `MOVEMENT_ACTION_EMOTE_DOUBLE_EXCL_MARK` | `MOVEMENT_TYPE_COUNTER_CLOCKWISE` | +| Wants Rematch | No | `MOVEMENT_ACTION_EMOTE_DOUBLE_EXCL_MARK` | `MOVEMENT_TYPE_FACE_DOWN` | +| Does Not Want Rematch | - | `MOVEMENT_ACTION_EMOTE_X` | none | +| Has Not Been Fought | - | `MOVEMENT_ACTION_EMOTE_EXCLAMATION_MARK` | none | + +### Rematch Table + +| Sequence | Trainer ID | +| ---------- | ---------------- | +| 1st Battle | `TRAINER_ROSE_1` | +| 2nd Battle | `TRAINER_ROSE_2` | +| 3rd Battle | `TRAINER_ROSE_3` | +| 4th Battle | `TRAINER_ROSE_4` | +| 5th Battle | `TRAINER_ROSE_5` | + +The game determines which version of the Trainer you'll fight next by following these rules: + +1. Start with the next Trainer in the sequence after the one that has been defeated. If there are no more, the battle is against the last listed Trainer. +2. If that next Trainer hasn't been unlocked yet, the battle is against the latest available unlocked version. +3. If the next Trainer is unlocked but not yet defeated, the battle is against that version. +4. If the next Trainer has already been defeated, check the next one in the sequence. + +## How do users implement rematches with the Vs. Seeker? +### Existing `pokemerald` Trainers +No extra work is required. With the exception of Wally, Gym Leaders and Elite Four, all of the rematchable Trainers in Emerald will work with the Vs. Seeker without any changes. +### New Trainers +#### Party / `gRematchTable` +Each of the rematches for the Trainer must be defined as seperate Trainers in `src/data/trainers.party` and `include/constants/opponents`. For example, `TRAINER_CALVIN_1` also has `TRAINER_CALVIN_2`,`TRAINER_CALVIN_3`,`TRAINER_CALVIN_4`, and `TRAINER_CALVIN_5`. + +Once all of those constants and parties are defined, a new row must be added to `gRematchTable` (located in in `src/battle_setup.c`). The row header should be a rematch ID, which can be added in `include/constants/rematches.h`. The row contents must be the five constants created for the new parties, with the lat argument being the constant of the map (`include/constants/map_groups.h`) where the Trainer is placed. + +If a Trainer is intended to have less than five unique rematch parties, the extra slots can be filled with the last available Trainer ID. + +```c +// This Trainer only has two teams. + [REMATCH_ROSE] = REMATCH(TRAINER_ROSE_1, TRAINER_ROSE_2, TRAINER_ROSE_2, TRAINER_ROSE_2, TRAINER_ROSE_2, MAP_ROUTE118), +``` + +WARNING: Rematch IDs should be placed BEFORE `REMATCH_WALLY_VR`. Trainers below that are treated as "special Trainers" that are not triggered by the Vs. Seeker. + +#### Scripts +The trainer's object needs to have a script that begins with a method to signify what this object's trainer ID is. + +#### `trainerbattle` +``` +Route103_EventScript_Daisy:: + trainerbattle_single TRAINER_DAISY, Route103_Text_DaisyIntro, Route103_Text_DaisyDefeated + msgbox Route103_Text_DaisyPostBattle, MSGBOX_AUTOCLOSE + end +``` + +Daisy is using one of the `trainerbattle` macros, which has the trainer battle macro in the first command of the script. Most trainers in `pokeemerald` use this pattern. + +##### `vsseeker_rematchid` +``` +Route102_EventScript_Calvin:: + vsseeker_rematchid TRAINER_CALVIN_1 + applymovement LOCALID_CALVIN, CalvinMovementTest + waitmovement 0 + trainerbattle_single TRAINER_CALVIN_1, Route102_Text_CalvinIntro, Route102_Text_CalvinDefeated, Route102_EventScript_CalvinRegisterMatchCallAfterBattle + specialvar VAR_RESULT, ShouldTryRematchBattle + goto_if_eq VAR_RESULT, TRUE, Route102_EventScript_CalvinRematch + setvar VAR_0x8004, TRAINER_CALVIN_1 + specialvar VAR_RESULT, IsTrainerRegistered + goto_if_eq VAR_RESULT, FALSE, Route102_EventScript_CalvinTryRegister + msgbox Route102_Text_CalvinPostBattle, MSGBOX_DEFAULT + release + end +``` + +If the trainer has other script commands before the eventual `trainerbattle` macro, the first command in the script needs to be `vsseeker_rematchid`. This macro does nothing but takes a single argument, which should be the same as the first Trainer ID for this trainer. + +#### `MOVEMENT_TYPE_COUNTER_CLOCKWISE` +If you want Trainers to spin once they are eligible for a rematch, their overworld graphics object ID (`include/constants/event_objects.h`) must be listed in either `regularTrainersOnLand` or `regularTrainersInWater`.Otherwise they will adopt the movement type `MOVEMENT_TYPE_FACE_DOWN`. + +## What can be customized about the Vs. Seeker? +* **Unlock Conditions**: The next "level" of rematches is unlocked when a specific flag is set. The flags that are currently used in `GetGameProgressFlags` can be changed to flags that better suit your game. +* **Recharge Steps**: `VSSEEKER_RECHARGE_STEPS` is initally set to 100, but this value can be changed to any number under 256. +* **Badge Requirement**: `HasAtLeastFiveBadges` is used to check if the Vs. Seeker will successfully work. You can customize the number of badges by changing `REMATCH_BADGE_COUNT` or otherwise alterting the function. + +## What are the limitations of the Vs. Seeker? +The Vs. Seeker does not currently work with Gym Leaders. There is a bug filed to hopefully fix this in the future. diff --git a/graphics/battle_anims/backgrounds/rainbow.bin b/graphics/battle_anims/backgrounds/rainbow.bin deleted file mode 100644 index 770389abf4de..000000000000 Binary files a/graphics/battle_anims/backgrounds/rainbow.bin and /dev/null differ diff --git a/graphics/battle_anims/backgrounds/rainbow.pal b/graphics/battle_anims/backgrounds/rainbow.pal deleted file mode 100644 index 9b62b7b25b4f..000000000000 --- a/graphics/battle_anims/backgrounds/rainbow.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -109 92 75 -255 255 255 -255 107 122 -255 200 102 -255 255 107 -143 255 160 -107 255 255 -107 129 255 -220 114 255 -199 255 250 -232 240 248 -224 232 240 -208 224 240 -191 202 224 -183 189 202 -157 166 181 diff --git a/graphics/battle_anims/backgrounds/rainbow.png b/graphics/battle_anims/backgrounds/rainbow.png deleted file mode 100644 index bd41645b3571..000000000000 Binary files a/graphics/battle_anims/backgrounds/rainbow.png and /dev/null differ diff --git a/graphics/battle_anims/backgrounds/rainbow_opponent_tile.bin b/graphics/battle_anims/backgrounds/rainbow_opponent_tile.bin new file mode 100644 index 000000000000..3aedd149cb8f Binary files /dev/null and b/graphics/battle_anims/backgrounds/rainbow_opponent_tile.bin differ diff --git a/graphics/battle_anims/backgrounds/rainbow_opponent_tile.png b/graphics/battle_anims/backgrounds/rainbow_opponent_tile.png new file mode 100644 index 000000000000..27377148052c Binary files /dev/null and b/graphics/battle_anims/backgrounds/rainbow_opponent_tile.png differ diff --git a/graphics/battle_anims/backgrounds/rainbow_player_tile.bin b/graphics/battle_anims/backgrounds/rainbow_player_tile.bin new file mode 100644 index 000000000000..a4f509ebe954 Binary files /dev/null and b/graphics/battle_anims/backgrounds/rainbow_player_tile.bin differ diff --git a/graphics/battle_anims/backgrounds/rainbow_player_tile.png b/graphics/battle_anims/backgrounds/rainbow_player_tile.png new file mode 100644 index 000000000000..5597a2fa9284 Binary files /dev/null and b/graphics/battle_anims/backgrounds/rainbow_player_tile.png differ diff --git a/graphics/battle_anims/sprites/tatsugiri_curly.png b/graphics/battle_anims/sprites/tatsugiri_curly.png new file mode 100644 index 000000000000..8642833f8f44 Binary files /dev/null and b/graphics/battle_anims/sprites/tatsugiri_curly.png differ diff --git a/graphics/battle_anims/sprites/tatsugiri_droopy.png b/graphics/battle_anims/sprites/tatsugiri_droopy.png new file mode 100644 index 000000000000..ae478dec5c8d Binary files /dev/null and b/graphics/battle_anims/sprites/tatsugiri_droopy.png differ diff --git a/graphics/battle_anims/sprites/tatsugiri_stretchy.png b/graphics/battle_anims/sprites/tatsugiri_stretchy.png new file mode 100644 index 000000000000..650807db0e54 Binary files /dev/null and b/graphics/battle_anims/sprites/tatsugiri_stretchy.png differ diff --git a/graphics/battle_anims/sprites/tera_symbol.png b/graphics/battle_anims/sprites/tera_symbol.png new file mode 100644 index 000000000000..ccade976e350 Binary files /dev/null and b/graphics/battle_anims/sprites/tera_symbol.png differ diff --git a/graphics/battle_interface/ability_pop_up.png b/graphics/battle_interface/ability_pop_up.png index ede0a7b5d7e3..fa0f09dba38e 100644 Binary files a/graphics/battle_interface/ability_pop_up.png and b/graphics/battle_interface/ability_pop_up.png differ diff --git a/graphics/battle_interface/healthbox_doubles_opponent.png b/graphics/battle_interface/healthbox_doubles_opponent.png index def9d07af000..28fdbbbeb984 100644 Binary files a/graphics/battle_interface/healthbox_doubles_opponent.png and b/graphics/battle_interface/healthbox_doubles_opponent.png differ diff --git a/graphics/battle_interface/healthbox_doubles_player.png b/graphics/battle_interface/healthbox_doubles_player.png index f843c664b19a..c3587ec3fd14 100644 Binary files a/graphics/battle_interface/healthbox_doubles_player.png and b/graphics/battle_interface/healthbox_doubles_player.png differ diff --git a/graphics/battle_interface/healthbox_safari.png b/graphics/battle_interface/healthbox_safari.png index e48f380a4b5e..b2a9255c5a3c 100644 Binary files a/graphics/battle_interface/healthbox_safari.png and b/graphics/battle_interface/healthbox_safari.png differ diff --git a/graphics/battle_interface/healthbox_singles_opponent.png b/graphics/battle_interface/healthbox_singles_opponent.png index 52f70e85801a..3047ed62d06c 100644 Binary files a/graphics/battle_interface/healthbox_singles_opponent.png and b/graphics/battle_interface/healthbox_singles_opponent.png differ diff --git a/graphics/battle_interface/healthbox_singles_player.png b/graphics/battle_interface/healthbox_singles_player.png index 0862ca399d54..cf65e6761293 100644 Binary files a/graphics/battle_interface/healthbox_singles_player.png and b/graphics/battle_interface/healthbox_singles_player.png differ diff --git a/graphics/battle_interface/last_used_ball_r_cycle.png b/graphics/battle_interface/last_used_ball_r_cycle.png index 0a73148e15f5..55b7bc7c0c7b 100644 Binary files a/graphics/battle_interface/last_used_ball_r_cycle.png and b/graphics/battle_interface/last_used_ball_r_cycle.png differ diff --git a/graphics/field_effects/palettes/big_dust.pal b/graphics/field_effects/palettes/big_dust.pal new file mode 100644 index 000000000000..34beaf03719a --- /dev/null +++ b/graphics/field_effects/palettes/big_dust.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +98 172 238 +198 181 156 +165 140 115 +181 165 140 +148 123 99 +206 198 173 +189 173 148 +82 74 57 +222 180 148 +140 123 82 +173 156 123 +238 213 180 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/field_effects/palettes/oras_dowsing.pal b/graphics/field_effects/palettes/oras_dowsing.pal new file mode 100644 index 000000000000..d3446e39714b --- /dev/null +++ b/graphics/field_effects/palettes/oras_dowsing.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +115 197 164 +0 0 0 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 0 255 diff --git a/graphics/field_effects/pics/oras_dowsing_brendan.png b/graphics/field_effects/pics/oras_dowsing_brendan.png new file mode 100644 index 000000000000..fd8351981984 Binary files /dev/null and b/graphics/field_effects/pics/oras_dowsing_brendan.png differ diff --git a/graphics/field_effects/pics/oras_dowsing_may.png b/graphics/field_effects/pics/oras_dowsing_may.png new file mode 100644 index 000000000000..6a4eb08f0293 Binary files /dev/null and b/graphics/field_effects/pics/oras_dowsing_may.png differ diff --git a/graphics/field_effects/pics/rock_climb_blob.png b/graphics/field_effects/pics/rock_climb_blob.png new file mode 100644 index 000000000000..19a9a7cea9b6 Binary files /dev/null and b/graphics/field_effects/pics/rock_climb_blob.png differ diff --git a/graphics/field_effects/pics/rock_climb_dust.png b/graphics/field_effects/pics/rock_climb_dust.png new file mode 100644 index 000000000000..541c6ba9b8b3 Binary files /dev/null and b/graphics/field_effects/pics/rock_climb_dust.png differ diff --git a/graphics/fonts/latin_small_narrower.png b/graphics/fonts/latin_small_narrower.png index 69bca4645ac6..ebb7c70d2725 100644 Binary files a/graphics/fonts/latin_small_narrower.png and b/graphics/fonts/latin_small_narrower.png differ diff --git a/graphics/object_events/pics/misc/apricorn_tree.png b/graphics/object_events/pics/misc/apricorn_tree.png new file mode 100644 index 000000000000..6267970061d2 Binary files /dev/null and b/graphics/object_events/pics/misc/apricorn_tree.png differ diff --git a/graphics/pokemon/castform/back_gba.png b/graphics/pokemon/castform/back_gba.png new file mode 100644 index 000000000000..6348a35e8662 Binary files /dev/null and b/graphics/pokemon/castform/back_gba.png differ diff --git a/graphics/pokemon/castform/front_gba.png b/graphics/pokemon/castform/front_gba.png new file mode 100644 index 000000000000..39bfaf4266e5 Binary files /dev/null and b/graphics/pokemon/castform/front_gba.png differ diff --git a/graphics/pokemon/castform/icon_gba.png b/graphics/pokemon/castform/icon_gba.png new file mode 100644 index 000000000000..56c62ad07623 Binary files /dev/null and b/graphics/pokemon/castform/icon_gba.png differ diff --git a/graphics/pokemon/castform/normal_gba.pal b/graphics/pokemon/castform/normal_gba.pal new file mode 100644 index 000000000000..3fe2b769285c --- /dev/null +++ b/graphics/pokemon/castform/normal_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +197 197 148 +90 82 82 +205 189 189 +230 222 222 +246 246 238 +0 0 0 +255 255 255 +222 222 246 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +148 148 148 +74 82 74 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/castform/rainy/back_gba.png b/graphics/pokemon/castform/rainy/back_gba.png new file mode 100644 index 000000000000..70bad9130b24 Binary files /dev/null and b/graphics/pokemon/castform/rainy/back_gba.png differ diff --git a/graphics/pokemon/castform/rainy/front_gba.png b/graphics/pokemon/castform/rainy/front_gba.png new file mode 100644 index 000000000000..15537403506f Binary files /dev/null and b/graphics/pokemon/castform/rainy/front_gba.png differ diff --git a/graphics/pokemon/castform/rainy/normal_gba.pal b/graphics/pokemon/castform/rainy/normal_gba.pal new file mode 100644 index 000000000000..914cdac62200 --- /dev/null +++ b/graphics/pokemon/castform/rainy/normal_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +197 197 148 +57 65 90 +98 115 189 +115 139 213 +148 180 205 +0 0 0 +205 238 246 +180 197 222 +139 205 222 +131 180 197 +82 98 131 +197 197 197 +148 139 148 +90 90 82 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/castform/rainy/shiny_gba.pal b/graphics/pokemon/castform/rainy/shiny_gba.pal new file mode 100644 index 000000000000..914cdac62200 --- /dev/null +++ b/graphics/pokemon/castform/rainy/shiny_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +197 197 148 +57 65 90 +98 115 189 +115 139 213 +148 180 205 +0 0 0 +205 238 246 +180 197 222 +139 205 222 +131 180 197 +82 98 131 +197 197 197 +148 139 148 +90 90 82 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/castform/shiny_gba.pal b/graphics/pokemon/castform/shiny_gba.pal new file mode 100644 index 000000000000..2fa401dd6f36 --- /dev/null +++ b/graphics/pokemon/castform/shiny_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +197 197 148 +98 90 90 +205 164 189 +230 197 222 +255 222 255 +0 0 0 +255 246 65 +230 180 32 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +148 148 148 +74 82 74 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/castform/snowy/back_gba.png b/graphics/pokemon/castform/snowy/back_gba.png new file mode 100644 index 000000000000..b4f27cbe6da8 Binary files /dev/null and b/graphics/pokemon/castform/snowy/back_gba.png differ diff --git a/graphics/pokemon/castform/snowy/front_gba.png b/graphics/pokemon/castform/snowy/front_gba.png new file mode 100644 index 000000000000..a75bf647e6a6 Binary files /dev/null and b/graphics/pokemon/castform/snowy/front_gba.png differ diff --git a/graphics/pokemon/castform/snowy/normal_gba.pal b/graphics/pokemon/castform/snowy/normal_gba.pal new file mode 100644 index 000000000000..d1c64ac75ca5 --- /dev/null +++ b/graphics/pokemon/castform/snowy/normal_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +197 197 148 +41 82 57 +123 82 189 +139 115 213 +148 180 205 +0 0 0 +197 180 255 +156 156 197 +139 205 172 +115 164 139 +98 74 115 +189 230 230 +82 115 106 +74 82 74 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/castform/snowy/shiny_gba.pal b/graphics/pokemon/castform/snowy/shiny_gba.pal new file mode 100644 index 000000000000..d1c64ac75ca5 --- /dev/null +++ b/graphics/pokemon/castform/snowy/shiny_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +197 197 148 +41 82 57 +123 82 189 +139 115 213 +148 180 205 +0 0 0 +197 180 255 +156 156 197 +139 205 172 +115 164 139 +98 74 115 +189 230 230 +82 115 106 +74 82 74 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/castform/sunny/back_gba.png b/graphics/pokemon/castform/sunny/back_gba.png new file mode 100644 index 000000000000..83b27298ad21 Binary files /dev/null and b/graphics/pokemon/castform/sunny/back_gba.png differ diff --git a/graphics/pokemon/castform/sunny/front_gba.png b/graphics/pokemon/castform/sunny/front_gba.png new file mode 100644 index 000000000000..7e14f9892e79 Binary files /dev/null and b/graphics/pokemon/castform/sunny/front_gba.png differ diff --git a/graphics/pokemon/castform/sunny/normal_gba.pal b/graphics/pokemon/castform/sunny/normal_gba.pal new file mode 100644 index 000000000000..af0cfbb93bc4 --- /dev/null +++ b/graphics/pokemon/castform/sunny/normal_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +197 197 148 +98 49 41 +205 90 74 +238 123 74 +255 156 65 +0 0 0 +255 246 106 +230 213 106 +255 156 98 +213 131 74 +148 90 65 +213 205 230 +0 0 0 +90 90 82 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/castform/sunny/shiny_gba.pal b/graphics/pokemon/castform/sunny/shiny_gba.pal new file mode 100644 index 000000000000..af0cfbb93bc4 --- /dev/null +++ b/graphics/pokemon/castform/sunny/shiny_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +197 197 148 +98 49 41 +205 90 74 +238 123 74 +255 156 65 +0 0 0 +255 246 106 +230 213 106 +255 156 98 +213 131 74 +148 90 65 +213 205 230 +0 0 0 +90 90 82 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/chesnaught/overworld.png b/graphics/pokemon/chesnaught/overworld.png index 7902feaf5758..99c5d10cba7f 100644 Binary files a/graphics/pokemon/chesnaught/overworld.png and b/graphics/pokemon/chesnaught/overworld.png differ diff --git a/graphics/pokemon/chespin/overworld.png b/graphics/pokemon/chespin/overworld.png index 5056ad774a4a..92df00e97da2 100644 Binary files a/graphics/pokemon/chespin/overworld.png and b/graphics/pokemon/chespin/overworld.png differ diff --git a/graphics/pokemon/delphox/overworld.png b/graphics/pokemon/delphox/overworld.png index e490e31cd818..dbf3da76ea4d 100644 Binary files a/graphics/pokemon/delphox/overworld.png and b/graphics/pokemon/delphox/overworld.png differ diff --git a/graphics/pokemon/deoxys/attack/back_gba.png b/graphics/pokemon/deoxys/attack/back_gba.png new file mode 100644 index 000000000000..6f9b3fd9ef05 Binary files /dev/null and b/graphics/pokemon/deoxys/attack/back_gba.png differ diff --git a/graphics/pokemon/deoxys/attack/front_gba.png b/graphics/pokemon/deoxys/attack/front_gba.png new file mode 100644 index 000000000000..67c092649ebd Binary files /dev/null and b/graphics/pokemon/deoxys/attack/front_gba.png differ diff --git a/graphics/pokemon/deoxys/attack/normal_gba.pal b/graphics/pokemon/deoxys/attack/normal_gba.pal new file mode 100644 index 000000000000..e8921dd3d55e --- /dev/null +++ b/graphics/pokemon/deoxys/attack/normal_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +205 205 255 +115 74 49 +213 106 106 +255 131 74 +255 172 131 +115 213 172 +82 172 123 +57 98 90 +0 0 0 +156 156 131 +106 8 156 +0 98 230 +115 115 106 +197 197 213 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/deoxys/attack/shiny_gba.pal b/graphics/pokemon/deoxys/attack/shiny_gba.pal new file mode 100644 index 000000000000..666acaa3ae62 --- /dev/null +++ b/graphics/pokemon/deoxys/attack/shiny_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +205 205 255 +106 90 24 +197 189 65 +255 222 74 +255 246 139 +115 213 172 +82 172 123 +57 98 90 +0 0 0 +156 156 131 +106 8 156 +0 98 230 +115 115 106 +197 197 213 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/deoxys/defense/back_gba.png b/graphics/pokemon/deoxys/defense/back_gba.png new file mode 100644 index 000000000000..c1fcf46738f5 Binary files /dev/null and b/graphics/pokemon/deoxys/defense/back_gba.png differ diff --git a/graphics/pokemon/deoxys/defense/front_gba.png b/graphics/pokemon/deoxys/defense/front_gba.png new file mode 100644 index 000000000000..5e2f38019ec4 Binary files /dev/null and b/graphics/pokemon/deoxys/defense/front_gba.png differ diff --git a/graphics/pokemon/deoxys/defense/normal_gba.pal b/graphics/pokemon/deoxys/defense/normal_gba.pal new file mode 100644 index 000000000000..e8921dd3d55e --- /dev/null +++ b/graphics/pokemon/deoxys/defense/normal_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +205 205 255 +115 74 49 +213 106 106 +255 131 74 +255 172 131 +115 213 172 +82 172 123 +57 98 90 +0 0 0 +156 156 131 +106 8 156 +0 98 230 +115 115 106 +197 197 213 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/deoxys/defense/shiny_gba.pal b/graphics/pokemon/deoxys/defense/shiny_gba.pal new file mode 100644 index 000000000000..666acaa3ae62 --- /dev/null +++ b/graphics/pokemon/deoxys/defense/shiny_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +205 205 255 +106 90 24 +197 189 65 +255 222 74 +255 246 139 +115 213 172 +82 172 123 +57 98 90 +0 0 0 +156 156 131 +106 8 156 +0 98 230 +115 115 106 +197 197 213 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/deoxys/speed/back_gba.png b/graphics/pokemon/deoxys/speed/back_gba.png new file mode 100644 index 000000000000..979936c640b2 Binary files /dev/null and b/graphics/pokemon/deoxys/speed/back_gba.png differ diff --git a/graphics/pokemon/deoxys/speed/front_gba.png b/graphics/pokemon/deoxys/speed/front_gba.png new file mode 100644 index 000000000000..ab713aeeaf4a Binary files /dev/null and b/graphics/pokemon/deoxys/speed/front_gba.png differ diff --git a/graphics/pokemon/deoxys/speed/normal_gba.pal b/graphics/pokemon/deoxys/speed/normal_gba.pal new file mode 100644 index 000000000000..90fcff114bd9 --- /dev/null +++ b/graphics/pokemon/deoxys/speed/normal_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +205 205 255 +115 74 49 +213 106 106 +255 131 74 +255 172 131 +115 213 172 +131 164 156 +57 98 90 +82 74 65 +156 156 131 +139 8 205 +222 106 230 +123 115 82 +197 197 213 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/deoxys/speed/shiny_gba.pal b/graphics/pokemon/deoxys/speed/shiny_gba.pal new file mode 100644 index 000000000000..74b8fc7775ed --- /dev/null +++ b/graphics/pokemon/deoxys/speed/shiny_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +205 205 255 +106 90 24 +197 189 65 +255 222 57 +255 246 139 +115 213 172 +82 172 123 +57 98 90 +82 74 65 +156 156 131 +106 8 156 +0 98 230 +115 115 106 +197 197 213 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/diggersby/overworld.png b/graphics/pokemon/diggersby/overworld.png index 03d6b5906674..39f72f55311b 100644 Binary files a/graphics/pokemon/diggersby/overworld.png and b/graphics/pokemon/diggersby/overworld.png differ diff --git a/graphics/pokemon/espurr/overworld.png b/graphics/pokemon/espurr/overworld.png index f7ba8e08a0a7..6df4dddb3e97 100644 Binary files a/graphics/pokemon/espurr/overworld.png and b/graphics/pokemon/espurr/overworld.png differ diff --git a/graphics/pokemon/flabebe/blue/overworld.png b/graphics/pokemon/flabebe/blue/overworld.png index cd98db3a57e2..09982c244a27 100644 Binary files a/graphics/pokemon/flabebe/blue/overworld.png and b/graphics/pokemon/flabebe/blue/overworld.png differ diff --git a/graphics/pokemon/flabebe/orange/overworld.png b/graphics/pokemon/flabebe/orange/overworld.png index 482ff4f29ecb..cf7ca349de59 100644 Binary files a/graphics/pokemon/flabebe/orange/overworld.png and b/graphics/pokemon/flabebe/orange/overworld.png differ diff --git a/graphics/pokemon/flabebe/overworld.png b/graphics/pokemon/flabebe/overworld.png index 3ad946f5f8f3..9bb8f7f53588 100644 Binary files a/graphics/pokemon/flabebe/overworld.png and b/graphics/pokemon/flabebe/overworld.png differ diff --git a/graphics/pokemon/flabebe/white/overworld.png b/graphics/pokemon/flabebe/white/overworld.png index 35b4b2f358ad..df004f2fe11a 100644 Binary files a/graphics/pokemon/flabebe/white/overworld.png and b/graphics/pokemon/flabebe/white/overworld.png differ diff --git a/graphics/pokemon/flabebe/yellow/overworld.png b/graphics/pokemon/flabebe/yellow/overworld.png index b0f7a47f7a3e..43b620a761b3 100644 Binary files a/graphics/pokemon/flabebe/yellow/overworld.png and b/graphics/pokemon/flabebe/yellow/overworld.png differ diff --git a/graphics/pokemon/fletchinder/overworld.png b/graphics/pokemon/fletchinder/overworld.png index a987365357f7..949b3e308dc8 100644 Binary files a/graphics/pokemon/fletchinder/overworld.png and b/graphics/pokemon/fletchinder/overworld.png differ diff --git a/graphics/pokemon/fletchling/overworld.png b/graphics/pokemon/fletchling/overworld.png index acfc95f616a7..4c35d25d1727 100644 Binary files a/graphics/pokemon/fletchling/overworld.png and b/graphics/pokemon/fletchling/overworld.png differ diff --git a/graphics/pokemon/floette/blue/overworld.png b/graphics/pokemon/floette/blue/overworld.png index 034b336557f1..01dd29581420 100644 Binary files a/graphics/pokemon/floette/blue/overworld.png and b/graphics/pokemon/floette/blue/overworld.png differ diff --git a/graphics/pokemon/floette/eternal/overworld.png b/graphics/pokemon/floette/eternal/overworld.png index 890288792cdd..d8cd5c5807d7 100644 Binary files a/graphics/pokemon/floette/eternal/overworld.png and b/graphics/pokemon/floette/eternal/overworld.png differ diff --git a/graphics/pokemon/floette/orange/overworld.png b/graphics/pokemon/floette/orange/overworld.png index f1559fcdc53a..b40d7c8c99b2 100644 Binary files a/graphics/pokemon/floette/orange/overworld.png and b/graphics/pokemon/floette/orange/overworld.png differ diff --git a/graphics/pokemon/floette/overworld.png b/graphics/pokemon/floette/overworld.png index 54f4dd54affb..11be9e078b76 100644 Binary files a/graphics/pokemon/floette/overworld.png and b/graphics/pokemon/floette/overworld.png differ diff --git a/graphics/pokemon/floette/white/overworld.png b/graphics/pokemon/floette/white/overworld.png index af49bcc9211f..fbf3e297a178 100644 Binary files a/graphics/pokemon/floette/white/overworld.png and b/graphics/pokemon/floette/white/overworld.png differ diff --git a/graphics/pokemon/floette/yellow/overworld.png b/graphics/pokemon/floette/yellow/overworld.png index 647e8149779e..6d515a766198 100644 Binary files a/graphics/pokemon/floette/yellow/overworld.png and b/graphics/pokemon/floette/yellow/overworld.png differ diff --git a/graphics/pokemon/gliscor/anim_front.png b/graphics/pokemon/gliscor/anim_front.png index 8c12ed4ef868..0454687c442c 100644 Binary files a/graphics/pokemon/gliscor/anim_front.png and b/graphics/pokemon/gliscor/anim_front.png differ diff --git a/graphics/pokemon/gliscor/shiny.pal b/graphics/pokemon/gliscor/shiny.pal index 647a9cd6c5f6..6faf8d1e9de4 100644 --- a/graphics/pokemon/gliscor/shiny.pal +++ b/graphics/pokemon/gliscor/shiny.pal @@ -15,5 +15,5 @@ JASC-PAL 168 144 0 248 216 0 64 64 80 -176 160 248 192 80 144 +104 104 120 diff --git a/graphics/pokemon/greninja/ash/overworld.png b/graphics/pokemon/greninja/ash/overworld.png new file mode 100644 index 000000000000..9313520a5eee Binary files /dev/null and b/graphics/pokemon/greninja/ash/overworld.png differ diff --git a/graphics/pokemon/greninja/ash/overworld_normal.pal b/graphics/pokemon/greninja/ash/overworld_normal.pal new file mode 100644 index 000000000000..04bbf21ddfd3 --- /dev/null +++ b/graphics/pokemon/greninja/ash/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +46 56 55 +68 84 82 +20 20 20 +220 212 133 +234 152 208 +72 95 157 +245 103 190 +62 141 206 +136 186 226 +184 62 48 +176 97 134 +186 214 237 +233 85 88 +241 174 219 +100 33 26 diff --git a/graphics/pokemon/greninja/ash/overworld_shiny.pal b/graphics/pokemon/greninja/ash/overworld_shiny.pal new file mode 100644 index 000000000000..6ce04a93199c --- /dev/null +++ b/graphics/pokemon/greninja/ash/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +46 56 55 +68 84 82 +20 20 20 +184 152 83 +234 152 208 +46 56 55 +245 103 190 +68 84 82 +136 186 226 +184 62 48 +176 97 134 +186 214 237 +233 85 88 +241 174 219 +100 33 26 diff --git a/graphics/pokemon/greninja/overworld.png b/graphics/pokemon/greninja/overworld.png index bb08608ca5b8..6e14bb60eb89 100644 Binary files a/graphics/pokemon/greninja/overworld.png and b/graphics/pokemon/greninja/overworld.png differ diff --git a/graphics/pokemon/hydrapple/back.png b/graphics/pokemon/hydrapple/back.png index 19ffd6d199fe..ec5f77cabe3b 100644 Binary files a/graphics/pokemon/hydrapple/back.png and b/graphics/pokemon/hydrapple/back.png differ diff --git a/graphics/pokemon/kingler/overworld.png b/graphics/pokemon/kingler/overworld.png index 135f79b3265f..c67ce3a53af2 100644 Binary files a/graphics/pokemon/kingler/overworld.png and b/graphics/pokemon/kingler/overworld.png differ diff --git a/graphics/pokemon/krabby/overworld.png b/graphics/pokemon/krabby/overworld.png index abe66ceb6f23..f712b6f6ff16 100644 Binary files a/graphics/pokemon/krabby/overworld.png and b/graphics/pokemon/krabby/overworld.png differ diff --git a/graphics/pokemon/lillipup/overworld.png b/graphics/pokemon/lillipup/overworld.png index ef8841471354..14f876a2c6e8 100644 Binary files a/graphics/pokemon/lillipup/overworld.png and b/graphics/pokemon/lillipup/overworld.png differ diff --git a/graphics/pokemon/litleo/overworld.png b/graphics/pokemon/litleo/overworld.png index 2c128f3184b2..a419a8327df1 100644 Binary files a/graphics/pokemon/litleo/overworld.png and b/graphics/pokemon/litleo/overworld.png differ diff --git a/graphics/pokemon/nickit/front.png b/graphics/pokemon/nickit/front.png index 9aba8f113ca4..6bcf9854fc11 100644 Binary files a/graphics/pokemon/nickit/front.png and b/graphics/pokemon/nickit/front.png differ diff --git a/graphics/pokemon/nickit/normal.pal b/graphics/pokemon/nickit/normal.pal index 487647accdec..74565685e79c 100644 --- a/graphics/pokemon/nickit/normal.pal +++ b/graphics/pokemon/nickit/normal.pal @@ -5,12 +5,12 @@ JASC-PAL 40 40 32 64 64 48 16 16 16 -136 64 48 +136 64 62 64 24 16 -192 80 24 +193 108 65 216 216 224 -136 120 136 -200 184 0 +159 147 159 +197 148 0 0 0 0 0 0 0 0 0 0 diff --git a/graphics/pokemon/nickit/overworld.png b/graphics/pokemon/nickit/overworld.png index 2b868637e5b4..206e2661905c 100644 Binary files a/graphics/pokemon/nickit/overworld.png and b/graphics/pokemon/nickit/overworld.png differ diff --git a/graphics/pokemon/nickit/overworld_normal.pal b/graphics/pokemon/nickit/overworld_normal.pal index faa146c087fb..ff8c34acea34 100644 --- a/graphics/pokemon/nickit/overworld_normal.pal +++ b/graphics/pokemon/nickit/overworld_normal.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -255 0 25 +128 196 156 8 8 7 -0 0 0 52 51 48 -21 20 18 -121 53 31 +91 41 25 +92 92 92 +136 59 35 185 90 59 -36 14 7 -255 255 255 210 184 61 -92 92 92 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +159 147 159 +223 218 223 +255 255 255 +255 0 0 +255 0 0 +255 0 0 +255 0 0 +255 0 0 diff --git a/graphics/pokemon/nickit/overworld_shiny.pal b/graphics/pokemon/nickit/overworld_shiny.pal index 50a8845599f9..7327a9c8b6cf 100644 --- a/graphics/pokemon/nickit/overworld_shiny.pal +++ b/graphics/pokemon/nickit/overworld_shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -152 208 160 -0 0 24 -0 0 0 -8 41 115 -0 16 74 -115 106 98 -164 148 139 -24 24 24 +128 196 156 +8 8 7 +51 76 95 +82 75 73 +92 92 92 +122 112 109 +167 154 149 +210 184 61 +159 147 159 +223 218 223 255 255 255 -213 189 57 -90 90 90 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +255 0 0 +255 0 0 +255 0 0 +255 0 0 +255 0 0 diff --git a/graphics/pokemon/pancham/overworld.png b/graphics/pokemon/pancham/overworld.png index 90d10d9bfa62..a54ddda99d43 100644 Binary files a/graphics/pokemon/pancham/overworld.png and b/graphics/pokemon/pancham/overworld.png differ diff --git a/graphics/pokemon/pikachu/starter/icon.png b/graphics/pokemon/pikachu/starter/icon.png index 737fababd7d4..891f0d1b3e87 100644 Binary files a/graphics/pokemon/pikachu/starter/icon.png and b/graphics/pokemon/pikachu/starter/icon.png differ diff --git a/graphics/pokemon/scatterbug/overworld.png b/graphics/pokemon/scatterbug/overworld.png index 2da700223db7..41de917984a6 100644 Binary files a/graphics/pokemon/scatterbug/overworld.png and b/graphics/pokemon/scatterbug/overworld.png differ diff --git a/graphics/pokemon/spinda/anim_front_gba.png b/graphics/pokemon/spinda/anim_front_gba.png new file mode 100644 index 000000000000..7ddfbef5171b Binary files /dev/null and b/graphics/pokemon/spinda/anim_front_gba.png differ diff --git a/graphics/pokemon/spinda/back_gba.png b/graphics/pokemon/spinda/back_gba.png new file mode 100644 index 000000000000..c5f699e2cf61 Binary files /dev/null and b/graphics/pokemon/spinda/back_gba.png differ diff --git a/graphics/pokemon/spinda/icon_gba.png b/graphics/pokemon/spinda/icon_gba.png new file mode 100644 index 000000000000..75699c7cbb98 Binary files /dev/null and b/graphics/pokemon/spinda/icon_gba.png differ diff --git a/graphics/pokemon/spinda/normal_gba.pal b/graphics/pokemon/spinda/normal_gba.pal new file mode 100644 index 000000000000..9b0ad5bfc42d --- /dev/null +++ b/graphics/pokemon/spinda/normal_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +49 164 82 +246 230 172 +230 213 164 +197 180 131 +172 148 106 +222 139 74 +222 106 57 +180 90 41 +156 57 24 +115 65 16 +172 65 90 +255 255 0 +255 255 0 +123 98 74 +90 65 49 +16 16 16 diff --git a/graphics/pokemon/spinda/shiny_gba.pal b/graphics/pokemon/spinda/shiny_gba.pal new file mode 100644 index 000000000000..6aa748129609 --- /dev/null +++ b/graphics/pokemon/spinda/shiny_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +49 164 82 +246 230 172 +230 213 164 +197 180 131 +172 148 106 +180 197 90 +148 164 57 +115 131 24 +82 98 0 +49 65 0 +172 65 90 +255 255 0 +255 255 0 +123 98 74 +90 65 49 +16 16 16 diff --git a/graphics/pokemon/talonflame/overworld.png b/graphics/pokemon/talonflame/overworld.png index 43760d9e8512..67fc802f44e7 100644 Binary files a/graphics/pokemon/talonflame/overworld.png and b/graphics/pokemon/talonflame/overworld.png differ diff --git a/graphics/pokemon/thievul/back.png b/graphics/pokemon/thievul/back.png index 7658e0ec2285..10b145f4ea79 100644 Binary files a/graphics/pokemon/thievul/back.png and b/graphics/pokemon/thievul/back.png differ diff --git a/graphics/pokemon/thievul/front.png b/graphics/pokemon/thievul/front.png index 447aeaf02bbc..941b0b9a2a15 100644 Binary files a/graphics/pokemon/thievul/front.png and b/graphics/pokemon/thievul/front.png differ diff --git a/graphics/pokemon/thievul/normal.pal b/graphics/pokemon/thievul/normal.pal index 3f3b4bf6d173..74565685e79c 100644 --- a/graphics/pokemon/thievul/normal.pal +++ b/graphics/pokemon/thievul/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -24 24 16 40 40 32 +64 64 48 16 16 16 -104 56 48 +136 64 62 64 24 16 -192 80 24 -136 120 136 -136 64 48 +193 108 65 216 216 224 -216 136 0 -176 160 184 -80 72 80 +159 147 159 +197 148 0 +0 0 0 +0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/graphics/pokemon/thievul/overworld.png b/graphics/pokemon/thievul/overworld.png index c83530247159..53cf0b5b0e93 100644 Binary files a/graphics/pokemon/thievul/overworld.png and b/graphics/pokemon/thievul/overworld.png differ diff --git a/graphics/pokemon/thievul/overworld_normal.pal b/graphics/pokemon/thievul/overworld_normal.pal index 764d23bb6039..ff8c34acea34 100644 --- a/graphics/pokemon/thievul/overworld_normal.pal +++ b/graphics/pokemon/thievul/overworld_normal.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -238 255 0 +128 196 156 8 8 7 52 51 48 -0 0 0 -121 53 31 -21 20 18 +91 41 25 +92 92 92 +136 59 35 185 90 59 -36 14 7 -255 255 255 210 184 61 -92 92 92 -176 176 176 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +159 147 159 +223 218 223 +255 255 255 +255 0 0 +255 0 0 +255 0 0 +255 0 0 +255 0 0 diff --git a/graphics/pokemon/thievul/overworld_shiny.pal b/graphics/pokemon/thievul/overworld_shiny.pal index 6584b3d19efb..f2d8cccbaf43 100644 --- a/graphics/pokemon/thievul/overworld_shiny.pal +++ b/graphics/pokemon/thievul/overworld_shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -238 255 0 -8 8 0 -8 41 115 -0 0 0 -115 106 98 -0 16 74 -164 148 139 -24 24 24 +128 196 156 +8 8 7 +56 76 139 +78 73 71 +92 92 92 +117 108 106 +159 148 145 +210 184 61 +159 147 159 +223 218 223 255 255 255 -213 189 57 -90 90 90 -180 180 180 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +255 0 0 +255 0 0 +255 0 0 +255 0 0 +255 0 0 diff --git a/graphics/pokemon/thievul/shiny.pal b/graphics/pokemon/thievul/shiny.pal index a6c7735277f5..dce4bdc484a4 100644 --- a/graphics/pokemon/thievul/shiny.pal +++ b/graphics/pokemon/thievul/shiny.pal @@ -2,14 +2,14 @@ JASC-PAL 0100 16 152 208 160 -8 24 40 -16 40 64 +37 73 109 +14 62 109 16 16 16 88 80 80 40 40 32 168 160 152 -144 144 120 -128 120 112 +228 228 228 +175 180 191 216 216 200 216 136 0 184 184 168 diff --git a/graphics/pokemon/watchog/overworld.png b/graphics/pokemon/watchog/overworld.png index e9184c7375ad..092d97f508a1 100644 Binary files a/graphics/pokemon/watchog/overworld.png and b/graphics/pokemon/watchog/overworld.png differ diff --git a/graphics/pokenav/name_box.png b/graphics/pokenav/name_box.png new file mode 100644 index 000000000000..7c2ed7036b60 Binary files /dev/null and b/graphics/pokenav/name_box.png differ diff --git a/graphics/text_window/name_box.png b/graphics/text_window/name_box.png new file mode 100644 index 000000000000..735f39247ebe Binary files /dev/null and b/graphics/text_window/name_box.png differ diff --git a/graphics_file_rules.mk b/graphics_file_rules.mk index 75460992f889..0b8a91415de2 100644 --- a/graphics_file_rules.mk +++ b/graphics_file_rules.mk @@ -340,6 +340,9 @@ $(UNUSEDGFXDIR)/color_frames.4bpp: %.4bpp: %.png $(BATINTGFXDIR)/unused_window2bar.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 5 -Wnum_tiles +$(BATINTGFXDIR)/ability_pop_up.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 8 -mheight 4 + $(JPCONTESTGFXDIR)/composite_1.4bpp: $(JPCONTESTGFXDIR)/frame_1.4bpp \ $(JPCONTESTGFXDIR)/floor.4bpp \ $(JPCONTESTGFXDIR)/frame_2.4bpp \ @@ -402,7 +405,7 @@ $(RAYQUAZAGFXDIR)/scene_2/bg.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 313 -Wnum_tiles $(RAYQUAZAGFXDIR)/scene_3/rayquaza.4bpp: %.4bpp: %.png - $(GFX) $< $@ -num_tiles 124 -Wnum_tiles + $(GFX) $< $@ -num_tiles 128 -Wnum_tiles $(RAYQUAZAGFXDIR)/scene_4/streaks.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 19 -Wnum_tiles diff --git a/include/apricorn_tree.h b/include/apricorn_tree.h new file mode 100644 index 000000000000..fc9e95b438e1 --- /dev/null +++ b/include/apricorn_tree.h @@ -0,0 +1,15 @@ +#ifndef GUARD_APRICORN_TREE_H +#define GUARD_APRICORN_TREE_H + +#include "constants/apricorn_tree.h" + +bool8 IsApricornTreePicked(u32 id); +void SetApricornTreePicked(u32 id); + +void DailyResetApricornTrees(void); +void ObjectEventInteractionGetApricornTreeData(void); +void ObjectEventInteractionPickApricornTree(void); +enum ApricornType GetApricornTypeByApricornTreeId(u32 id); +u8 GetApricornCountByApricornTreeId(u32 id); + +#endif //GUARD_APRICORN_TREE_H diff --git a/include/battle.h b/include/battle.h old mode 100644 new mode 100755 index 6b9609758bcb..b95da58aa2c3 --- a/include/battle.h +++ b/include/battle.h @@ -2,8 +2,12 @@ #define GUARD_BATTLE_H // should they be included here or included individually by every file? +#include "constants/battle_end_turn.h" +#include "constants/abilities.h" #include "constants/battle.h" #include "constants/form_change_types.h" +#include "constants/hold_effects.h" +#include "constants/moves.h" #include "battle_main.h" #include "battle_message.h" #include "battle_util.h" @@ -13,6 +17,7 @@ #include "battle_util2.h" #include "battle_bg.h" #include "pokeball.h" +#include "main.h" #include "battle_debug.h" #include "battle_dynamax.h" #include "battle_terastal.h" @@ -44,7 +49,7 @@ // Used to exclude moves learned temporarily by Transform or Mimic #define MOVE_IS_PERMANENT(battler, moveSlot) \ - (!(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) \ + (!(gBattleMons[battler].volatiles.transformed) \ && !(gDisableStructs[battler].mimickedMoves & (1u << moveSlot))) // Battle Actions @@ -64,6 +69,7 @@ #define B_ACTION_FINISHED 12 #define B_ACTION_CANCEL_PARTNER 12 // when choosing an action #define B_ACTION_NOTHING_FAINTED 13 // when choosing an action +#define B_ACTION_UNK_14 14 #define B_ACTION_DEBUG 20 #define B_ACTION_THROW_BALL 21 // R to throw last used ball #define B_ACTION_NONE 0xFF @@ -96,8 +102,7 @@ struct DisableStruct u8 battlerWithSureHit; u8 isFirstTurn; u8 mimickedMoves:4; - u8 chargeTimer:4; - u8 rechargeTimer; + u8 rechargeTimer:4; u8 autotomizeCount; u16 slowStartTimer; u16 embargoTimer; @@ -112,37 +117,35 @@ struct DisableStruct u8 usedMoves:4; u8 truantCounter:1; u8 truantSwitchInHack:1; - u8 noRetreat:1; u8 tarShot:1; u8 octolock:1; u8 cudChew:1; - u8 spikesDone:1; - u8 toxicSpikesDone:1; - u8 stickyWebDone:1; - u8 stealthRockDone:1; u8 weatherAbilityDone:1; u8 terrainAbilityDone:1; u8 syrupBombIsShiny:1; - u8 steelSurgeDone:1; u8 usedProteanLibero:1; u8 flashFireBoosted:1; + u8 boosterEnergyActivated:1; + u8 padding1:1; u16 overwrittenAbility; // abilities overwritten during battle (keep separate from battle history in case of switching) - u8 boosterEnergyActivates:1; u8 roostActive:1; u8 unburdenActive:1; u8 neutralizingGas:1; u8 iceFaceActivationPrevention:1; // fixes hit escape move edge case u8 unnerveActivated:1; // Unnerve and As One (Unnerve part) activate only once per switch in - u8 padding:3; + u8 hazardsDone:1; + u8 endured:1; + u8 tryEjectPack:1; + u8 octolockedBy:3; + u8 paradoxBoostedStat:4; + u8 padding2:1; }; // Fully Cleared each turn after end turn effects are done. A few things are cleared before end turn effects struct ProtectStruct { u32 protected:7; // 126 protect options - u32 endured:1; u32 noValidMoves:1; - u32 helpingHand:1; u32 bounceMove:1; u32 stealMove:1; u32 nonVolatileStatusImmobility:1; @@ -150,31 +153,31 @@ struct ProtectStruct u32 chargingTurn:1; u32 fleeType:2; // 0: Normal, 1: FLEE_ITEM, 2: FLEE_ABILITY u32 unableToUseMove:1; // Not to be confused with HITMARKER_UNABLE_TO_USE_MOVE (It is questionable though if there is a difference. Needs further research) - u32 notFirstStrike:1; + u32 laggingTail:1; u32 palaceUnableToUseMove:1; - u32 powderSelfDmg:1; u32 statRaised:1; u32 usedCustapBerry:1; // also quick claw u32 touchedProtectLike:1; - u32 unused:8; - // End of 32-bit bitfield - u16 disableEjectPack:1; - u16 statFell:1; - u16 pranksterElevated:1; - u16 quickDraw:1; - u16 beakBlastCharge:1; - u16 quash:1; - u16 shellTrap:1; - u16 eatMirrorHerb:1; - u16 activateOpportunist:2; // 2 - to copy stats. 1 - stats copied (do not repeat). 0 - no stats to copy + u32 disableEjectPack:1; + u32 pranksterElevated:1; + u32 quickDraw:1; + u32 quash:1; + u32 shellTrap:1; + u32 eatMirrorHerb:1; + u32 activateOpportunist:2; // 2 - to copy stats. 1 - stats copied (do not repeat). 0 - no stats to copy u16 usedAllySwitch:1; u16 lashOutAffected:1; - u16 padding:4; + // End of 32-bit bitfield + u16 helpingHand:3; + u16 assuranceDoubled:1; + u16 myceliumMight:1; + u16 revengeDoubled:4; + u16 padding:7; // End of 16-bit bitfield u16 physicalDmg; u16 specialDmg; - u8 physicalBattlerId; - u8 specialBattlerId; + u8 physicalBattlerId:4; + u8 specialBattlerId:4; }; // Cleared at the start of HandleAction_ActionFinished @@ -184,20 +187,20 @@ struct SpecialStatus s32 specialDmg; u8 changedStatsBattlerId; // Battler that was responsible for the latest stat change. Can be self. u8 statLowered:1; - u8 lightningRodRedirected:1; + u8 abilityRedirected:1; u8 restoredBattlerSprite: 1; u8 faintedHasReplacement:1; - u8 preventLifeOrbDamage:1; // So that Life Orb doesn't activate various effects. u8 afterYou:1; u8 enduredDamage:1; - u8 stormDrainRedirected:1; + u8 dancerUsedMove:1; + u8 padding1:1; // End of byte u8 switchInAbilityDone:1; u8 switchInItemDone:1; u8 instructedChosenTarget:3; u8 berryReduced:1; - u8 announceNeutralizingGas:1; // See Cmd_switchineffects u8 neutralizingGasRemoved:1; // See VARIOUS_TRY_END_NEUTRALIZING_GAS + u8 padding2:1; // End of byte u8 gemParam; // End of byte @@ -209,9 +212,8 @@ struct SpecialStatus u8 teraShellAbilityDone:1; u8 criticalHit:1; // End of byte - u8 dancerUsedMove:1; u8 dancerOriginalTarget:3; - u8 unused:4; + u8 padding3:5; // End of byte }; @@ -221,23 +223,20 @@ struct SideTimer u16 lightscreenTimer; u16 mistTimer; u16 safeguardTimer; - u16 spikesAmount; // debug menu complains. might be better to solve there instead if possible - u16 toxicSpikesAmount; - u16 stealthRockAmount; - u16 stickyWebAmount; + u8 spikesAmount:4; + u8 toxicSpikesAmount:4; u8 stickyWebBattlerId; u8 stickyWebBattlerSide; // Used for Court Change u16 auroraVeilTimer; u16 tailwindTimer; u16 luckyChantTimer; - u16 steelsurgeAmount; // Timers below this point are not swapped by Court Change - u16 followmeTimer; + u8 followmeTimer:4; u8 followmeTarget:3; u8 followmePowder:1; // Rage powder, does not affect grass type pokemon. - u16 retaliateTimer; + u8 retaliateTimer; u16 damageNonTypesTimer; - u8 damageNonTypesType; + enum Type damageNonTypesType; u16 rainbowTimer; u16 seaOfFireTimer; u16 swampTimer; @@ -269,12 +268,12 @@ struct WishFutureKnock struct AI_SavedBattleMon { - u16 ability; + enum Ability ability; u16 moves[MAX_MON_MOVES]; u16 heldItem; u16 species:15; u16 saved:1; - u8 types[3]; + enum Type types[3]; }; struct AiPartyMon @@ -282,7 +281,7 @@ struct AiPartyMon u16 species; u16 item; u16 heldEffect; - u16 ability; + enum Ability ability; u16 level; u16 moves[MAX_MON_MOVES]; u32 status; @@ -315,7 +314,7 @@ struct SimulatedDamage // Ai Data used when deciding which move to use, computed only once before each turn's start. struct AiLogicData { - u16 abilities[MAX_BATTLERS_COUNT]; + enum Ability abilities[MAX_BATTLERS_COUNT]; u16 items[MAX_BATTLERS_COUNT]; u16 holdEffects[MAX_BATTLERS_COUNT]; u8 holdEffectParams[MAX_BATTLERS_COUNT]; @@ -334,12 +333,12 @@ struct AiLogicData u8 ejectButtonSwitch:1; // Tracks whether current switch out was from Eject Button u8 ejectPackSwitch:1; // Tracks whether current switch out was from Eject Pack u8 predictingSwitch:1; // Determines whether AI will use switch predictions this turn or not - u8 predictingMove:1; // Determines whether AI will use move predictions this turn or not u8 aiPredictionInProgress:1; // Tracks whether the AI is in the middle of running prediction calculations - u8 padding:2; - u8 shouldSwitch; // Stores result of ShouldSwitch, which decides whether a mon should be switched out u8 aiCalcInProgress:1; - u8 battlerDoingPrediction; // Stores which battler is currently running its prediction calcs + u8 predictingMove:1; // Determines whether AI will use move predictions this turn or not + u8 padding1:1; + u8 shouldSwitch:4; // Stores result of ShouldSwitch, which decides whether a mon should be switched out + u8 padding2:4; u16 predictedMove[MAX_BATTLERS_COUNT]; }; @@ -349,7 +348,6 @@ struct AiThinkingStruct u8 movesetIndex; u16 moveConsidered; s32 score[MAX_MON_MOVES]; - u32 funcResult; u64 aiFlags[MAX_BATTLERS_COUNT]; u8 aiAction; u8 aiLogicId; @@ -360,7 +358,7 @@ struct AiThinkingStruct struct BattleHistory { - u16 abilities[MAX_BATTLERS_COUNT]; + enum Ability abilities[MAX_BATTLERS_COUNT]; u8 itemEffects[MAX_BATTLERS_COUNT]; u16 usedMoves[MAX_BATTLERS_COUNT][MAX_MON_MOVES]; u16 moveHistory[MAX_BATTLERS_COUNT][AI_MOVE_HISTORY_COUNT]; // 3 last used moves for each battler @@ -574,7 +572,6 @@ struct BattlerState u8 targetsDone[MAX_BATTLERS_COUNT]; u32 commandingDondozo:1; - u32 absent:1; u32 focusPunchBattlers:1; u32 multipleSwitchInBattlers:1; u32 alreadyStatusedMoveAttempt:1; // For example when using Thunder Wave on an already paralyzed PokΓ©mon. @@ -588,7 +585,11 @@ struct BattlerState u32 pursuitTarget:1; u32 stompingTantrumTimer:2; u32 canPickupItem:1; - u32 padding:16; + u32 ateBoost:1; + u32 wasAboveHalfHp:1; // For Berserk, Emergency Exit, Wimp Out and Anger Shell. + u32 commanderSpecies:11; + u32 selectionScriptFinished:1; + u32 padding:3; // End of Word }; @@ -600,7 +601,27 @@ struct PartyState u32 battleBondBoost:1; u32 transformZeroToHero:1; u32 supersweetSyrup:1; - u32 padding:26; + u32 timesGotHit:5; + u32 changedSpecies:11; // For forms when multiple mons can change into the same pokemon. + u32 sentOut:1; + u32 padding:9; + u16 usedHeldItem; +}; + +struct EventStates +{ + enum EndTurnResolutionOrder endTurn:8; + u32 endTurnBlock:8; // FirstEventBlock, SecondEventBlock, ThirdEventBlock + enum BattlerId endTurnBattler:4; + u32 arenaTurn:8; + enum BattleSide battlerSide:4; + enum BattlerId moveEndBattler:4; + enum FirstTurnEventsStates beforeFristTurn:8; + enum FaintedActions faintedAction:8; + enum BattlerId faintedActionBattler:4; + enum MoveSuccessOrder atkCanceler:8; + enum BattleIntroStates battleIntro:8; + u32 padding:24; }; // Cleared at the beginning of the battle. Fields need to be cleared when needed manually otherwise. @@ -608,10 +629,7 @@ struct BattleStruct { struct BattlerState battlerState[MAX_BATTLERS_COUNT]; struct PartyState partyState[NUM_BATTLE_SIDES][PARTY_SIZE]; - u8 eventBlockCounter; - u8 turnEffectsBattlerId; - u8 endTurnEventsCounter; - u16 wrappedMove[MAX_BATTLERS_COUNT]; + struct EventStates eventState; u16 moveTarget[MAX_BATTLERS_COUNT]; u32 expShareExpValue; u32 expValue; @@ -623,18 +641,13 @@ struct BattleStruct u8 givenExpMons; // Bits for enemy party's pokemon that gave exp to player's party. u8 expSentInMons; // As bits for player party mons - not including exp share mons. u8 wildVictorySong; - u8 dynamicMoveType; - u8 wrappedBy[MAX_BATTLERS_COUNT]; + enum Type dynamicMoveType; u8 battlerPreventingSwitchout; u8 moneyMultiplier:6; u8 moneyMultiplierItem:1; u8 moneyMultiplierMove:1; u8 savedTurnActionNumber; - u8 eventsBeforeFirstTurnState; - u8 faintedActionsState; - u8 faintedActionsBattlerId; u8 scriptPartyIdx; // for printing the nickname - bool8 selectionScriptFinished[MAX_BATTLERS_COUNT]; u8 battlerPartyIndexes[MAX_BATTLERS_COUNT]; u8 monToSwitchIntoId[MAX_BATTLERS_COUNT]; u8 battlerPartyOrders[MAX_BATTLERS_COUNT][PARTY_SIZE / 2]; @@ -665,32 +678,27 @@ struct BattleStruct u8 anyMonHasTransformed:1; // Only used in battle_tv.c u8 multipleSwitchInState:2; u8 multipleSwitchInCursor:3; - u8 padding1:2; + u8 sleepClauseNotBlocked:1; + u8 isSkyBattle:1; u8 multipleSwitchInSortedBattlers[MAX_BATTLERS_COUNT]; void (*savedCallback)(void); - u16 usedHeldItems[PARTY_SIZE][NUM_BATTLE_SIDES]; // For each party member and side. For harvest, recycle u16 chosenItem[MAX_BATTLERS_COUNT]; u16 choicedMove[MAX_BATTLERS_COUNT]; u16 changedItems[MAX_BATTLERS_COUNT]; u8 switchInBattlerCounter; - u8 arenaTurnCounter; - u8 turnSideTracker; u16 lastTakenMoveFrom[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT]; // a 2-D array [target][attacker] union { struct LinkBattlerHeader linkBattlerHeader; struct BattleVideo battleVideo; } multiBuffer; - u8 startingStatus:6; // status to apply at battle start. defined in constants/battle.h - u8 startingStatusDone:1; - u8 terrainDone:1; - u8 overworldWeatherDone:1; - u8 unused:3; - u8 isAtkCancelerForCalledMove:1; // Certain cases in atk canceler should only be checked once, when the original move is called, however others need to be checked the twice. + u8 startingStatus; // status to apply at battle start. defined in constants/battle.h + u8 battlerKOAnimsRunning:3; u8 friskedAbility:1; // If identifies two mons, show the ability pop-up only once. u8 fickleBeamBoosted:1; u8 poisonPuppeteerConfusion:1; + u8 toxicChainPriority:1; // If Toxic Chain will trigger on target, all other non volatiles will be blocked + u8 moldBreakerActive:1; u16 startingStatusTimer; - u8 atkCancellerTracker; struct BattleTvMovePoints tvMovePoints; struct BattleTv tv; u8 AI_monToSwitchIntoId[MAX_BATTLERS_COUNT]; @@ -702,27 +710,22 @@ struct BattleStruct u8 debugBattler; u8 magnitudeBasePower; u8 presentBasePower; - u8 roostTypes[MAX_BATTLERS_COUNT][NUM_BATTLE_SIDES]; u8 savedBattlerTarget[5]; u8 savedBattlerAttacker[5]; u8 savedTargetCount:4; u8 savedAttackerCount:4; - bool8 ateBoost[MAX_BATTLERS_COUNT]; u8 abilityPopUpSpriteIds[MAX_BATTLERS_COUNT][NUM_BATTLE_SIDES]; // two per battler struct ZMoveData zmove; struct DynamaxData dynamax; struct BattleGimmickData gimmick; const u8 *trainerSlideMsg; - enum BattleIntroStates introState:8; u8 stolenStats[NUM_BATTLE_STATS]; // hp byte is used for which stats to raise, other inform about by how many stages u8 lastMoveTarget[MAX_BATTLERS_COUNT]; // The last target on which each mon used a move, for the sake of Instruct - u16 tracedAbility[MAX_BATTLERS_COUNT]; - u16 hpBefore[MAX_BATTLERS_COUNT]; // Hp of battlers before using a move. For Berserk and Anger Shell. + enum Ability tracedAbility[MAX_BATTLERS_COUNT]; struct Illusion illusion[MAX_BATTLERS_COUNT]; u8 soulheartBattlerId; u8 friskedBattler; // Frisk needs to identify 2 battlers in double battles. - u8 sameMoveTurns[MAX_BATTLERS_COUNT]; // For Metronome, number of times the same moves has been SUCCESFULLY used. - u16 changedSpecies[NUM_BATTLE_SIDES][PARTY_SIZE]; // For forms when multiple mons can change into the same pokemon. + u8 metronomeItemCounter[MAX_BATTLERS_COUNT]; // For Metronome, number of times the same moves has been SUCCESFULLY used. u8 quickClawBattlerId; struct LostItem itemLost[NUM_BATTLE_SIDES][PARTY_SIZE]; // Pokemon that had items consumed or stolen (two bytes per party member per side) u8 blunderPolicy:1; // should blunder policy activate @@ -735,54 +738,56 @@ struct BattleStruct u8 throwingPokeBall:1; u8 ballSpriteIds[2]; // item gfx, window gfx u8 moveInfoSpriteId; // move info, window gfx - u8 appearedInBattle; // Bitfield to track which Pokemon appeared in battle. Used for Burmy's form change u8 skyDropTargets[MAX_BATTLERS_COUNT]; // For Sky Drop, to account for if multiple Pokemon use Sky Drop in a double battle. // When using a move which hits multiple opponents which is then bounced by a target, we need to make sure, the move hits both opponents, the one with bounce, and the one without. + u16 beatUpSpecies[PARTY_SIZE]; // Species for Gen5+ Beat Up, otherwise party indexes u8 attackerBeforeBounce:2; u8 beatUpSlot:3; u8 pledgeMove:1; u8 effectsBeforeUsingMoveDone:1; // Mega Evo and Focus Punch/Shell Trap effects. u8 spriteIgnore0Hp:1; - u8 bonusCritStages[MAX_BATTLERS_COUNT]; // G-Max Chi Strike boosts crit stages of allies. u8 itemPartyIndex[MAX_BATTLERS_COUNT]; u8 itemMoveIndex[MAX_BATTLERS_COUNT]; - u8 isSkyBattle:1; s32 aiDelayTimer; // Counts number of frames AI takes to choose an action. s32 aiDelayFrames; // Number of frames it took to choose an action. s32 aiDelayCycles; // Number of cycles it took to choose an action. - u8 timesGotHit[NUM_BATTLE_SIDES][PARTY_SIZE]; - u8 stickySyrupdBy[MAX_BATTLERS_COUNT]; u8 supremeOverlordCounter[MAX_BATTLERS_COUNT]; u8 shellSideArmCategory[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT]; u8 speedTieBreaks; // MAX_BATTLERS_COUNT! values. - u8 categoryOverride; // for Z-Moves and Max Moves - u16 commanderActive[MAX_BATTLERS_COUNT]; + enum DamageCategory categoryOverride:8; // for Z-Moves and Max Moves u32 stellarBoostFlags[NUM_BATTLE_SIDES]; // stored as a bitfield of flags for all types for each side u8 monCausingSleepClause[NUM_BATTLE_SIDES]; // Stores which pokemon on a given side is causing Sleep Clause to be active as the mon's index in the party - u8 additionalEffectsCounter:4; // A counter for the additionalEffects applied by the current move in Cmd_setadditionaleffects - s16 savedcheekPouchDamage; // Cheek Pouch can happen in the middle of an attack execution so we need to store the current dmg - u8 cheekPouchActivated:1; - u8 padding2:3; + u16 opponentMonCanTera:6; + u16 opponentMonCanDynamax:6; + u16 additionalEffectsCounter:4; // A counter for the additionalEffects applied by the current move in Cmd_setadditionaleffects u8 pursuitStoredSwitch; // Stored id for the Pursuit target's switch s32 battlerExpReward; u16 prevTurnSpecies[MAX_BATTLERS_COUNT]; // Stores species the AI has in play at start of turn + s16 passiveHpUpdate[MAX_BATTLERS_COUNT]; // non-move damage and healing s16 moveDamage[MAX_BATTLERS_COUNT]; s16 critChance[MAX_BATTLERS_COUNT]; u16 moveResultFlags[MAX_BATTLERS_COUNT]; u8 missStringId[MAX_BATTLERS_COUNT]; - u8 noResultString[MAX_BATTLERS_COUNT]; + enum CalcDamageState noResultString[MAX_BATTLERS_COUNT]; u8 doneDoublesSpreadHit:1; u8 calculatedDamageDone:1; u8 calculatedSpreadMoveAccuracy:1; u8 printedStrongWindsWeakenedAttack:1; u8 numSpreadTargets:2; - u8 bypassMoldBreakerChecks:1; // for ABILITYEFFECT_IMMUNITY u8 noTargetPresent:1; + u8 padding2:1; struct MessageStatus slideMessageStatus; u8 trainerSlideSpriteIds[MAX_BATTLERS_COUNT]; - u16 opponentMonCanTera:6; - u16 opponentMonCanDynamax:6; - u16 padding:4; + u8 hazardsQueue[NUM_BATTLE_SIDES][HAZARDS_MAX_COUNT]; + u8 numHazards[NUM_BATTLE_SIDES]; + u8 hazardsCounter:4; // Counter for applying hazard on switch in + enum SubmoveState submoveAnnouncement:2; + u8 tryDestinyBond:1; + u8 tryGrudge:1; + u16 flingItem; + u8 incrementEchoedVoice:1; + u8 echoedVoiceCounter:3; + u8 padding3:4; }; struct AiBattleData @@ -791,6 +796,7 @@ struct AiBattleData u8 playerStallMons[PARTY_SIZE]; u8 chosenMoveIndex[MAX_BATTLERS_COUNT]; u8 chosenTarget[MAX_BATTLERS_COUNT]; + u16 aiUsingGimmick:6; u8 actionFlee:1; u8 choiceWatch:1; u8 padding:6; @@ -825,7 +831,7 @@ static inline bool32 IsBattleMoveStatus(u32 move) * times with one type because it shares the 'GetBattlerTypes' result. */ #define _IS_BATTLER_ANY_TYPE(battler, ignoreTera, ...) \ ({ \ - u32 types[3]; \ + enum Type types[3]; \ GetBattlerTypes(battler, ignoreTera, types); \ RECURSIVELY(R_FOR_EACH(_IS_BATTLER_ANY_TYPE_HELPER, __VA_ARGS__)) FALSE; \ }) @@ -839,7 +845,7 @@ static inline bool32 IsBattleMoveStatus(u32 move) #define IS_BATTLER_TYPELESS(battlerId) \ ({ \ - u32 types[3]; \ + enum Type types[3]; \ GetBattlerTypes(battlerId, FALSE, types); \ types[0] == TYPE_MYSTERY && types[1] == TYPE_MYSTERY && types[2] == TYPE_MYSTERY; \ }) @@ -851,11 +857,11 @@ static inline bool32 IsBattleMoveStatus(u32 move) gBattleMons[battler].types[2] = TYPE_MYSTERY; \ } -#define RESTORE_BATTLER_TYPE(battler) \ -{ \ - gBattleMons[battler].types[0] = gSpeciesInfo[gBattleMons[battler].species].types[0]; \ - gBattleMons[battler].types[1] = gSpeciesInfo[gBattleMons[battler].species].types[1]; \ - gBattleMons[battler].types[2] = TYPE_MYSTERY; \ +#define RESTORE_BATTLER_TYPE(battler) \ +{ \ + gBattleMons[battler].types[0] = GetSpeciesType(gBattleMons[battler].species, 0); \ + gBattleMons[battler].types[1] = GetSpeciesType(gBattleMons[battler].species, 1); \ + gBattleMons[battler].types[2] = TYPE_MYSTERY; \ } #define GET_STAT_BUFF_ID(n) ((n & 7)) // first three bits 0x1, 0x2, 0x4 @@ -868,8 +874,6 @@ static inline bool32 IsBattleMoveStatus(u32 move) #define SET_STATCHANGER(statId, stage, goesDown) (gBattleScripting.statChanger = (statId) + ((stage) << 3) + (goesDown << 7)) #define SET_STATCHANGER2(dst, statId, stage, goesDown)(dst = (statId) + ((stage) << 3) + (goesDown << 7)) -#define DO_ACCURACY_CHECK 2 // Don't skip the accuracy check before the move might be absorbed - // NOTE: The members of this struct have hard-coded offsets // in include/constants/battle_script_commands.h struct BattleScripting @@ -903,9 +907,9 @@ struct BattleScripting u8 specialTrainerBattleType; bool8 monCaught; s32 savedDmg; - u16 savedMoveEffect; // For moves hitting multiple targets. + u16 unused_0x2c; u16 moveEffect; - u16 multihitMoveEffect; + u16 unused_0x30; u8 illusionNickHack; // To properly display nick in STRINGID_ENEMYABOUTTOSWITCHPKMN. bool8 fixedPopup; // Force ability popup to stick until manually called back u16 abilityPopupOverwrite; @@ -1052,7 +1056,7 @@ extern u16 gChosenMove; extern u16 gCalledMove; extern s32 gBideDmg[MAX_BATTLERS_COUNT]; extern u16 gLastUsedItem; -extern u16 gLastUsedAbility; +extern enum Ability gLastUsedAbility; extern u8 gBattlerAttacker; extern u8 gBattlerTarget; extern u8 gBattlerFainted; @@ -1078,8 +1082,6 @@ extern u32 gHitMarker; extern u8 gBideTarget[MAX_BATTLERS_COUNT]; extern u32 gSideStatuses[NUM_BATTLE_SIDES]; extern struct SideTimer gSideTimers[NUM_BATTLE_SIDES]; -extern u32 gStatuses3[MAX_BATTLERS_COUNT]; -extern u32 gStatuses4[MAX_BATTLERS_COUNT]; extern struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT]; extern u16 gPauseCounterBattle; extern u16 gPaydayMoney; @@ -1120,7 +1122,7 @@ extern u16 gBattleTurnCounter; extern u8 gBattlerAbility; extern struct QueuedStatBoost gQueuedStatBoosts[MAX_BATTLERS_COUNT]; -extern void (*gPreBattleCallback1)(void); +extern MainCallback gPreBattleCallback1; extern void (*gBattleMainFunc)(void); extern struct BattleResults gBattleResults; extern u8 gLeveledUpInBattle; @@ -1128,7 +1130,7 @@ extern u8 gHealthboxSpriteIds[MAX_BATTLERS_COUNT]; extern u8 gMultiUsePlayerCursor; extern u8 gNumberOfMovesToChoose; extern bool8 gHasFetchedBall; -extern u8 gLastUsedBall; +extern u16 gLastUsedBall; extern u16 gLastThrownBall; extern u16 gBallToDisplay; extern bool8 gLastUsedBallMenuPresent; @@ -1190,7 +1192,7 @@ static inline u32 GetBattlerSide(u32 battler) return GetBattlerPosition(battler) & BIT_SIDE; } -static inline u32 IsOnPlayerSide(u32 battler) +static inline bool32 IsOnPlayerSide(u32 battler) { return GetBattlerSide(battler) == B_SIDE_PLAYER; } @@ -1211,7 +1213,7 @@ static inline struct Pokemon* GetBattlerMon(u32 battler) return !IsOnPlayerSide(battler) ? &gEnemyParty[index] : &gPlayerParty[index]; } -static inline struct Pokemon *GetSideParty(u32 side) +static inline struct Pokemon *GetSideParty(enum BattleSide side) { return side == B_SIDE_PLAYER ? gPlayerParty : gEnemyParty; } @@ -1221,9 +1223,14 @@ static inline struct Pokemon *GetBattlerParty(u32 battler) return GetSideParty(GetBattlerSide(battler)); } +static inline struct PartyState *GetBattlerPartyState(u32 battler) +{ + return &gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]]; +} + static inline bool32 IsDoubleBattle(void) { - return gBattleTypeFlags & BATTLE_TYPE_DOUBLE; + return (gBattleTypeFlags & BATTLE_TYPE_MORE_THAN_TWO_BATTLERS); } static inline bool32 IsSpreadMove(u32 moveTarget) @@ -1234,7 +1241,7 @@ static inline bool32 IsSpreadMove(u32 moveTarget) static inline bool32 IsDoubleSpreadMove(void) { return gBattleStruct->numSpreadTargets > 1 - && !(gHitMarker & (HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_UNABLE_TO_USE_MOVE)) + && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && IsSpreadMove(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove)); } @@ -1245,4 +1252,23 @@ static inline bool32 IsBattlerInvalidForSpreadMove(u32 battlerAtk, u32 battlerDe || (battlerDef == BATTLE_PARTNER(battlerAtk) && (moveTarget == MOVE_TARGET_BOTH)); } +static inline u32 GetChosenMoveFromPosition(u32 battler) +{ + return gBattleMons[battler].moves[gBattleStruct->chosenMovePositions[battler]]; +} + +static inline void SetPassiveDamageAmount(u32 battler, s32 value) +{ + if (value == 0) + value = 1; + gBattleStruct->passiveHpUpdate[battler] = value; +} + +static inline void SetHealAmount(u32 battler, s32 value) +{ + if (value == 0) + value = 1; + gBattleStruct->passiveHpUpdate[battler] = -1 * value; +} + #endif // GUARD_BATTLE_H diff --git a/include/battle_ai_field_statuses.h b/include/battle_ai_field_statuses.h new file mode 100644 index 000000000000..64608f637065 --- /dev/null +++ b/include/battle_ai_field_statuses.h @@ -0,0 +1,18 @@ +#ifndef GUARD_BATTLE_AI_FIELD_STATUSES_H +#define GUARD_BATTLE_AI_FIELD_STATUSES_H + +#include "battle_ai_main.h" +#include "battle_ai_util.h" + +enum FieldEffectOutcome +{ + FIELD_EFFECT_POSITIVE, + FIELD_EFFECT_NEUTRAL, + FIELD_EFFECT_NEGATIVE, + FIELD_EFFECT_BLOCKED, +}; + +bool32 WeatherChecker(u32 battler, u32 weather, enum FieldEffectOutcome desiredResult); +bool32 FieldStatusChecker(u32 battler, u32 fieldStatus, enum FieldEffectOutcome desiredResult); + +#endif //GUARD_BATTLE_AI_FIELD_STATUSES_H diff --git a/include/battle_ai_main.h b/include/battle_ai_main.h index 31d6437b9747..4330f9d2bca0 100644 --- a/include/battle_ai_main.h +++ b/include/battle_ai_main.h @@ -23,6 +23,11 @@ enum StatChange STAT_CHANGE_SPEED_2, STAT_CHANGE_SPATK_2, STAT_CHANGE_SPDEF_2, + STAT_CHANGE_ATK_3, + STAT_CHANGE_DEF_3, + STAT_CHANGE_SPEED_3, + STAT_CHANGE_SPATK_3, + STAT_CHANGE_SPDEF_3, STAT_CHANGE_ACC, STAT_CHANGE_EVASION }; @@ -38,7 +43,18 @@ enum AIScore WEAK_EFFECT = 1, DECENT_EFFECT = 2, GOOD_EFFECT = 3, - BEST_EFFECT = 4 + BEST_EFFECT = 4, + PERFECT_EFFECT = 10, + BAD_EFFECT = -1, + AWFUL_EFFECT = -3, + WORST_EFFECT = -10 +}; + +enum MoveComparisonResult +{ + MOVE_NEUTRAL_COMPARISON, + MOVE_WON_COMPARISON, + MOVE_LOST_COMPARISON, }; // AI_TryToFaint diff --git a/include/battle_ai_script_commands.h b/include/battle_ai_script_commands.h deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/include/battle_ai_switch_items.h b/include/battle_ai_switch_items.h index b91d452097a7..7612d2084af7 100644 --- a/include/battle_ai_switch_items.h +++ b/include/battle_ai_switch_items.h @@ -38,14 +38,15 @@ enum ShouldSwitchScenario enum SwitchType { SWITCH_AFTER_KO, - SWITCH_MID_BATTLE, + SWITCH_MID_BATTLE_FORCED, + SWITCH_MID_BATTLE_OPTIONAL, }; void GetAIPartyIndexes(u32 battlerId, s32 *firstId, s32 *lastId); void AI_TrySwitchOrUseItem(u32 battler); u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType); bool32 ShouldSwitch(u32 battler); -bool32 IsMonGrounded(u16 heldItemEffect, u32 ability, u8 type1, u8 type2); +bool32 IsMonGrounded(enum HoldEffect heldItemEffect, enum Ability ability, enum Type type1, enum Type type2); void ModifySwitchAfterMoveScoring(u32 battler); #endif // GUARD_BATTLE_AI_SWITCH_ITEMS_H diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 66fe8d550d04..2c8760893560 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -2,8 +2,7 @@ #define GUARD_BATTLE_AI_UTIL_H #include "battle_ai_main.h" - -#define FOE(battler) ((BATTLE_OPPOSITE(battler)) & BIT_SIDE) +#include "battle_ai_field_statuses.h" // Roll boundaries used by AI when scoring. Doesn't affect actual damage dealt. #define MAX_ROLL_PERCENTAGE DMG_ROLL_PERCENT_HI @@ -23,6 +22,17 @@ enum DamageCalcContext AI_ATTACKING, }; +// Higher priority at the bottom; note that these are used in the formula MAX_MON_MOVES ^ AiCompareMovesPriority, which must fit within a u32. +// In expansion where MAX_MON_MOVES is 4, this means that AiCompareMovesPriority can range from 0 - 15 inclusive. +enum AiCompareMovesPriority +{ + PRIORITY_EFFECT, + PRIORITY_GUARANTEE, + PRIORITY_ACCURACY, + PRIORITY_NOT_CHARGING, + PRIORITY_SPEED, +}; + enum AIPivot { DONT_PIVOT, @@ -38,6 +48,18 @@ enum WeatherState WEATHER_INACTIVE_AND_BLOCKED, }; +enum AIConsiderGimmick +{ + NO_GIMMICK, + USE_GIMMICK, +}; + +enum ConsiderPriority +{ + DONT_CONSIDER_PRIORITY, + CONSIDER_PRIORITY, +}; + static inline bool32 IsMoveUnusable(u32 moveIndex, u32 move, u32 moveLimitations) { return move == MOVE_NONE @@ -47,20 +69,27 @@ static inline bool32 IsMoveUnusable(u32 moveIndex, u32 move, u32 moveLimitations typedef bool32 (*MoveFlag)(u32 move); -bool32 AI_IsFaster(u32 battlerAi, u32 battlerDef, u32 move); -bool32 AI_IsSlower(u32 battlerAi, u32 battlerDef, u32 move); +bool32 AI_IsFaster(u32 battlerAi, u32 battlerDef, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority); +bool32 AI_IsSlower(u32 battlerAi, u32 battlerDef, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority); +bool32 AI_IsPartyMonFaster(u32 battlerAi, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority); +bool32 AI_IsPartyMonSlower(u32 battlerAi, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority); bool32 AI_RandLessThan(u32 val); +bool32 AI_IsBattlerGrounded(u32 battler); u32 AI_GetDamage(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcContext calcContext, struct AiLogicData *aiData); bool32 IsAiVsAiBattle(void); bool32 BattlerHasAi(u32 battlerId); bool32 IsAiBattlerAware(u32 battlerId); +bool32 CanAiPredictMove(void); +bool32 IsAiBattlerAssumingStab(void); +bool32 IsAiBattlerAssumingStatusMoves(void); +bool32 ShouldRecordStatusMove(u32 move); void ClearBattlerMoveHistory(u32 battlerId); void RecordLastUsedMoveBy(u32 battlerId, u32 move); void RecordAllMoves(u32 battler); void RecordKnownMove(u32 battlerId, u32 move); -void RecordAbilityBattle(u32 battlerId, u32 abilityId); +void RecordAbilityBattle(u32 battlerId, enum Ability abilityId); void ClearBattlerAbilityHistory(u32 battlerId); -void RecordItemEffectBattle(u32 battlerId, u32 itemEffect); +void RecordItemEffectBattle(u32 battlerId, enum HoldEffect itemEffect); void ClearBattlerItemEffectHistory(u32 battlerId); void SaveBattlerData(u32 battlerId); void SetBattlerData(u32 battlerId); @@ -73,149 +102,166 @@ bool32 AI_BattlerAtMaxHp(u32 battler); u32 GetHealthPercentage(u32 battler); bool32 AI_CanBattlerEscape(u32 battler); bool32 IsBattlerTrapped(u32 battlerAtk, u32 battlerDef); -s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler2, u32 moveConsidered); +s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler2, u32 aiMoveConsidered, u32 playerMoveConsidered, enum ConsiderPriority considerPriority); bool32 CanTargetFaintAi(u32 battlerDef, u32 battlerAtk); -u32 NoOfHitsForTargetToFaintAI(u32 battlerDef, u32 battlerAtk); +u32 NoOfHitsForTargetToFaintBattler(u32 battlerDef, u32 battlerAtk); u32 GetBestDmgMoveFromBattler(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext); u32 GetBestDmgFromBattler(u32 battler, u32 battlerTarget, enum DamageCalcContext calcContext); bool32 CanTargetMoveFaintAi(u32 move, u32 battlerDef, u32 battlerAtk, u32 nHits); bool32 CanTargetFaintAiWithMod(u32 battlerDef, u32 battlerAtk, s32 hpMod, s32 dmgMod); -s32 AI_DecideKnownAbilityForTurn(u32 battlerId); -enum ItemHoldEffect AI_DecideHoldEffectForTurn(u32 battlerId); -bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, u32 atkAbility, u32 move); +enum Ability AI_DecideKnownAbilityForTurn(u32 battlerId); +enum HoldEffect AI_DecideHoldEffectForTurn(u32 battlerId); +bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, enum Ability atkAbility, u32 move); u32 AI_GetWeather(void); +u32 AI_GetSwitchinWeather(struct BattlePokemon battleMon); enum WeatherState IsWeatherActive(u32 flags); bool32 CanAIFaintTarget(u32 battlerAtk, u32 battlerDef, u32 numHits); bool32 CanIndexMoveFaintTarget(u32 battlerAtk, u32 battlerDef, u32 index, enum DamageCalcContext calcContext); -bool32 CanIndexMoveGuaranteeFaintTarget(u32 battlerAtk, u32 battlerDef, u32 index); -bool32 HasDamagingMove(u32 battlerId); -bool32 HasDamagingMoveOfType(u32 battlerId, u32 type); +bool32 HasDamagingMove(u32 battler); +bool32 HasDamagingMoveOfType(u32 battler, enum Type type); u32 GetBattlerSecondaryDamage(u32 battlerId); -bool32 BattlerWillFaintFromWeather(u32 battler, u32 ability); -bool32 BattlerWillFaintFromSecondaryDamage(u32 battler, u32 ability); -bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbility, u32 move); +bool32 BattlerWillFaintFromWeather(u32 battler, enum Ability ability); +bool32 BattlerWillFaintFromSecondaryDamage(u32 battler, enum Ability ability); +bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, enum Ability defAbility, u32 move); bool32 ShouldUseRecoilMove(u32 battlerAtk, u32 battlerDef, u32 recoilDmg, u32 moveIndex); -u32 GetBattlerSideSpeedAverage(u32 battler); bool32 ShouldAbsorb(u32 battlerAtk, u32 battlerDef, u32 move, s32 damage); -bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, u32 move, u32 healPercent, enum DamageCalcContext calcContext); +bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, u32 move, u32 healPercent); bool32 ShouldSetScreen(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects moveEffect); -enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 moveIndex); +bool32 ShouldCureStatus(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData); +bool32 ShouldCureStatusWithItem(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData); +enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 moveIndex); bool32 IsRecycleEncouragedItem(u32 item); bool32 ShouldRestoreHpBerry(u32 battlerAtk, u32 item); bool32 IsStatBoostingBerry(u32 item); bool32 CanKnockOffItem(u32 battler, u32 item); -bool32 IsAbilityOfRating(u32 ability, s8 rating); -bool32 AI_IsAbilityOnSide(u32 battlerId, u32 ability); -bool32 AI_MoveMakesContact(u32 ability, enum ItemHoldEffect holdEffect, u32 move); +bool32 IsAbilityOfRating(enum Ability ability, s8 rating); +bool32 AI_IsAbilityOnSide(u32 battlerId, enum Ability ability); +bool32 AI_MoveMakesContact(enum Ability ability, enum HoldEffect holdEffect, u32 move); +bool32 IsConsideringZMove(u32 battlerAtk, u32 battlerDef, u32 move); bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove); -u32 AI_GetBattlerAbility(u32 battler); +void SetAIUsingGimmick(u32 battler, enum AIConsiderGimmick use); +bool32 IsAIUsingGimmick(u32 battler); +void DecideTerastal(u32 battler); +bool32 CanEndureHit(u32 battler, u32 battlerTarget, u32 move); // stat stage checks bool32 AnyStatIsRaised(u32 battlerId); -bool32 ShouldLowerStat(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 stat); -bool32 BattlerStatCanRise(u32 battler, u32 battlerAbility, u32 stat); +bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData, enum Stat stat); +bool32 BattlerStatCanRise(u32 battler, enum Ability battlerAbility, enum Stat stat); bool32 AreBattlersStatsMaxed(u32 battler); u32 CountPositiveStatStages(u32 battlerId); u32 CountNegativeStatStages(u32 battlerId); -bool32 ShouldLowerAttack(u32 battlerAtk, u32 battlerDef, u32 defAbility); -bool32 ShouldLowerDefense(u32 battlerAtk, u32 battlerDef, u32 defAbility); -bool32 ShouldLowerSpeed(u32 battlerAtk, u32 battlerDef, u32 defAbility); -bool32 ShouldLowerSpAtk(u32 battlerAtk, u32 battlerDef, u32 defAbility); -bool32 ShouldLowerSpDef(u32 battlerAtk, u32 battlerDef, u32 defAbility); -bool32 ShouldLowerAccuracy(u32 battlerAtk, u32 battlerDef, u32 defAbility); -bool32 ShouldLowerEvasion(u32 battlerAtk, u32 battlerDef, u32 defAbility); // move checks -bool32 IsAffectedByPowder(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); -bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, u32 category); -s32 AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo); -struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, bool32 considerZPower); -struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, bool32 considerZPower, u32 weather); +bool32 Ai_IsPriorityBlocked(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData); +bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, enum DamageCategory category); +enum MoveComparisonResult AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo); +struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef); +bool32 IsAdditionalEffectBlocked(u32 battlerAtk, u32 abilityAtk, u32 battlerDef, u32 abilityDef); +struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef, u32 weather); bool32 AI_IsDamagedByRecoil(u32 battler); u32 GetNoOfHitsToKO(u32 dmg, s32 hp); u32 GetNoOfHitsToKOBattlerDmg(u32 dmg, u32 battlerDef); u32 GetNoOfHitsToKOBattler(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcContext calcContext); +u32 GetBestNoOfHitsToKO(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext); u32 GetCurrDamageHpPercent(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext); uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef); u16 *GetMovesArray(u32 battler); bool32 IsConfusionMoveEffect(enum BattleMoveEffects moveEffect); bool32 HasMove(u32 battlerId, u32 move); -bool32 HasOnlyMovesWithCategory(u32 battlerId, u32 category, bool32 onlyOffensive); -bool32 HasMoveWithCategory(u32 battler, u32 category); -bool32 HasMoveWithType(u32 battler, u32 type); -bool32 HasMoveWithEffect(u32 battlerId, enum BattleMoveEffects moveEffect); +u32 GetIndexInMoveArray(u32 battler, u32 move); +bool32 HasOnlyMovesWithCategory(u32 battlerId, enum DamageCategory category, bool32 onlyOffensive); +bool32 HasMoveWithCategory(u32 battler, enum DamageCategory category); +bool32 HasMoveWithType(u32 battler, enum Type type); +bool32 HasMoveWithEffect(u32 battler, enum BattleMoveEffects moveEffect); +bool32 HasMoveWithAIEffect(u32 battler, u32 aiEffect); +bool32 HasBattlerSideMoveWithEffect(u32 battler, u32 effect); +bool32 HasBattlerSideMoveWithAIEffect(u32 battler, u32 effect); +bool32 HasBattlerSideUsedMoveWithEffect(u32 battler, u32 effect); bool32 HasNonVolatileMoveEffect(u32 battlerId, u32 effect); bool32 IsPowerBasedOnStatus(u32 battlerId, enum BattleMoveEffects effect, u32 argument); bool32 HasMoveWithAdditionalEffect(u32 battlerId, u32 moveEffect); +bool32 HasBattlerSideMoveWithAdditionalEffect(u32 battler, u32 moveEffect); bool32 HasMoveWithCriticalHitChance(u32 battlerId); bool32 HasMoveWithMoveEffectExcept(u32 battlerId, u32 moveEffect, enum BattleMoveEffects exception); bool32 HasMoveThatLowersOwnStats(u32 battlerId); -bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool32 ignoreStatus, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect); +bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool32 ignoreStatus); bool32 HasAnyKnownMove(u32 battlerId); bool32 IsAromaVeilProtectedEffect(enum BattleMoveEffects moveEffect); bool32 IsNonVolatileStatusMove(u32 moveEffect); -bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, u32 atkAbility); -bool32 IsMoveEncouragedToHit(u32 battlerAtk, u32 battlerDef, u32 move); +bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, enum Ability atkAbility); bool32 IsHazardMove(u32 move); bool32 IsTwoTurnNotSemiInvulnerableMove(u32 battlerAtk, u32 move); -void ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove, s32 *score); -bool32 ShouldSetSandstorm(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); -bool32 ShouldSetHail(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); -bool32 ShouldSetSnow(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); -bool32 ShouldSetRain(u32 battlerAtk, u32 ability, enum ItemHoldEffect holdEffect); -bool32 ShouldSetSun(u32 battlerAtk, u32 atkAbility, enum ItemHoldEffect holdEffect); +bool32 IsBattlerDamagedByStatus(u32 battler); +s32 ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove); +bool32 ShouldRaiseAnyStat(u32 battlerAtk, u32 battlerDef); +bool32 ShouldSetWeather(u32 battler, u32 weather); +bool32 ShouldClearWeather(u32 battler, u32 weather); +bool32 ShouldSetFieldStatus(u32 battler, u32 fieldStatus); +bool32 ShouldClearFieldStatus(u32 battler, u32 fieldStatus); bool32 HasSleepMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef); bool32 IsHealingMove(u32 move); bool32 HasHealingEffect(u32 battler); bool32 IsTrappingMove(u32 move); bool32 HasTrappingMoveEffect(u32 battler); -bool32 ShouldFakeOut(u32 battlerAtk, u32 battlerDef, u32 move); +bool32 IsFlinchGuaranteed(u32 battlerAtk, u32 battlerDef, u32 move); +bool32 HasChoiceEffect(u32 battler); bool32 HasThawingMove(u32 battler); bool32 IsStatRaisingEffect(enum BattleMoveEffects effect); bool32 IsStatLoweringEffect(enum BattleMoveEffects effect); -bool32 IsSelfStatLoweringEffect(enum BattleMoveEffects effect); +bool32 IsSelfStatLoweringEffect(enum MoveEffect effect); +bool32 IsSelfStatRaisingEffect(enum MoveEffect effect); bool32 IsSwitchOutEffect(enum BattleMoveEffects effect); bool32 IsChaseEffect(enum BattleMoveEffects effect); bool32 IsAttackBoostMoveEffect(enum BattleMoveEffects effect); bool32 IsUngroundingEffect(enum BattleMoveEffects effect); -bool32 IsSemiInvulnerable(u32 battlerDef, u32 move); bool32 HasMoveWithFlag(u32 battler, MoveFlag getFlag); bool32 IsHazardClearingMove(u32 move); bool32 IsSubstituteEffect(enum BattleMoveEffects effect); // status checks -bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, u32 ability); -bool32 IsBattlerIncapacitated(u32 battler, u32 ability); -bool32 AI_CanPutToSleep(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove); +bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability ability); +bool32 IsBattlerIncapacitated(u32 battler, enum Ability ability); +bool32 AI_CanPutToSleep(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove); bool32 ShouldPoison(u32 battlerAtk, u32 battlerDef); -bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove); -bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove); -bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove); -bool32 ShouldBurn(u32 battlerAtk, u32 battlerDef, u32 abilityDef); -bool32 ShouldFreezeOrFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef); -bool32 ShouldParalyze(u32 battlerAtk, u32 battlerDef, u32 abilityDef); -bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove); -bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove); -bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, u32 defAbility); +bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove); +bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove); +bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove); +bool32 ShouldBurn(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef); +bool32 ShouldFreezeOrFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef); +bool32 ShouldParalyze(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef); +bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove); +bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove); +bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, enum Ability defAbility); bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof); -u32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbility, u32 move); +u32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, enum Ability defAbility, u32 move); bool32 ShouldTrap(u32 battlerAtk, u32 battlerDef, u32 move); bool32 IsWakeupTurn(u32 battler); bool32 AI_IsBattlerAsleepOrComatose(u32 battlerId); // ability logic -bool32 IsMoxieTypeAbility(u32 ability); -bool32 ShouldTriggerAbility(u32 battler, u32 ability); +bool32 IsMoxieTypeAbility(enum Ability ability); +bool32 DoesAbilityRaiseStatsWhenLowered(enum Ability ability); +bool32 ShouldTriggerAbility(u32 battlerAtk, u32 battlerDef, enum Ability ability); +bool32 CanEffectChangeAbility(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData); +void AbilityChangeScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score, struct AiLogicData *aiData); +s32 BattlerBenefitsFromAbilityScore(u32 battler, enum Ability ability, struct AiLogicData *aiData); // partner logic -#define IS_TARGETING_PARTNER(battlerAtk, battlerDef)((battlerAtk) == (battlerDef ^ BIT_FLANK)) +bool32 IsTargetingPartner(u32 battlerAtk, u32 battlerDef); +// IsTargetingPartner includes a check to make sure the adjacent pokemon is truly a partner. u32 GetAllyChosenMove(u32 battlerId); -bool32 IsValidDoubleBattle(u32 battlerAtk); +bool32 IsBattle1v1(void); +// IsBattle1v1 is distinct from !IsDoubleBattle. If the player is fighting Maxie and Tabitha, with Steven as their partner, and both Tabitha and Steven have run out of Pokemon, the battle is 1v1, even though mechanically it is a Double Battle for how battlers and flags are set. +// Most AI checks should be using IsBattle1v1; most engine checks should be using !IsDoubleBattle +bool32 HasTwoOpponents(u32 battler); +// HasTwoOpponents checks if the opposing side has two pokemon. Partner state is irrelevant. e.g., Dragon Darts hits one time with two opponents and twice with one opponent. +bool32 HasPartner(u32 battler); +bool32 HasPartnerIgnoreFlags(u32 battler); +// HasPartner respects the Attacks Partner AI flag; HasPartnerIgnoreFlags checks only if a live pokemon is adjacent. +bool32 AreMovesEquivalent(u32 battlerAtk, u32 battlerAtkPartner, u32 move, u32 partnerMove); bool32 DoesPartnerHaveSameMoveEffect(u32 battlerAtkPartner, u32 battlerDef, u32 move, u32 partnerMove); -bool32 PartnerHasSameMoveEffectWithoutTarget(u32 battlerAtkPartner, u32 move, u32 partnerMove); bool32 PartnerMoveEffectIsStatusSameTarget(u32 battlerAtkPartner, u32 battlerDef, u32 partnerMove); -bool32 IsMoveEffectWeather(u32 move); -bool32 PartnerMoveEffectIsTerrain(u32 battlerAtkPartner, u32 partnerMove); bool32 PartnerMoveEffectIs(u32 battlerAtkPartner, u32 partnerMove, enum BattleMoveEffects effectCheck); bool32 PartnerMoveIs(u32 battlerAtkPartner, u32 partnerMove, u32 moveCheck); bool32 PartnerMoveIsSameAsAttacker(u32 battlerAtkPartner, u32 battlerDef, u32 move, u32 partnerMove); @@ -230,12 +276,13 @@ struct BattlePokemon *AllocSaveBattleMons(void); void FreeRestoreBattleMons(struct BattlePokemon *savedBattleMons); s32 CountUsablePartyMons(u32 battlerId); bool32 IsPartyFullyHealedExceptBattler(u32 battler); -bool32 PartyHasMoveCategory(u32 battlerId, u32 category); -bool32 SideHasMoveCategory(u32 battlerId, u32 category); +bool32 PartyHasMoveCategory(u32 battlerId, enum DamageCategory category); +bool32 SideHasMoveCategory(u32 battlerId, enum DamageCategory category); // score increases u32 IncreaseStatUpScore(u32 battlerAtk, u32 battlerDef, enum StatChange statId); u32 IncreaseStatUpScoreContrary(u32 battlerAtk, u32 battlerDef, enum StatChange statId); +u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, enum Stat stat); void IncreasePoisonScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); void IncreaseBurnScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); void IncreaseParalyzeScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); @@ -243,19 +290,36 @@ void IncreaseSleepScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); void IncreaseConfusionScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); -s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, enum DamageCalcContext calcContext); -u32 AI_WhoStrikesFirstPartyMon(u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 moveConsidered); +s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, uq4_12_t *effectiveness, enum DamageCalcContext calcContext); +u32 AI_WhoStrikesFirstPartyMon(u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 aiMoveConsidered, u32 playerMoveConsidered, enum ConsiderPriority ConsiderPriority); s32 AI_TryToClearStats(u32 battlerAtk, u32 battlerDef, bool32 isDoubleBattle); bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef); -bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData); +bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData); void IncreaseTidyUpScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, struct AiLogicData *aiData); u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move); bool32 IsBattlerItemEnabled(u32 battler); bool32 IsBattlerPredictedToSwitch(u32 battler); u32 GetIncomingMove(u32 battler, u32 opposingBattler, struct AiLogicData *aiData); -bool32 HasLowAccuracyMove(u32 battlerAtk, u32 battlerDef); -bool32 HasBattlerSideAbility(u32 battlerDef, u32 ability, struct AiLogicData *aiData); -u32 GetThinkingBattler(u32 battler); +u32 GetIncomingMoveSpeedCheck(u32 battler, u32 opposingBattler, struct AiLogicData *aiData); +bool32 IsNaturalEnemy(u32 speciesAttacker, u32 speciesTarget); + +// These are for the purpose of not doubling up on moves during double battles. +// Used in GetAIEffectGroup for move effects and GetAIEffectGroupFromMove for additional effects +#define AI_EFFECT_NONE 0 +#define AI_EFFECT_WEATHER (1 << 0) +#define AI_EFFECT_TERRAIN (1 << 1) +#define AI_EFFECT_CLEAR_HAZARDS (1 << 2) +#define AI_EFFECT_BREAK_SCREENS (1 << 3) +#define AI_EFFECT_RESET_STATS (1 << 4) +#define AI_EFFECT_FORCE_SWITCH (1 << 5) +#define AI_EFFECT_TORMENT (1 << 6) +#define AI_EFFECT_LIGHT_SCREEN (1 << 7) +#define AI_EFFECT_REFLECT (1 << 8) +#define AI_EFFECT_GRAVITY (1 << 9) +#define AI_EFFECT_CHANGE_ABILITY (1 << 10) + +// As Aurora Veil should almost never be used alongside the other screens, we save the bit. +#define AI_EFFECT_AURORA_VEIL (AI_EFFECT_LIGHT_SCREEN | AI_EFFECT_REFLECT) #endif //GUARD_BATTLE_AI_UTIL_H diff --git a/include/battle_anim.h b/include/battle_anim.h index e62c170cc051..2c8631e8997c 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -93,6 +93,7 @@ void AnimWeatherBallUp(struct Sprite *sprite); void AnimWeatherBallDown(struct Sprite *sprite); void AnimSpinningSparkle(struct Sprite *sprite); void SetAverageBattlerPositions(u8 battler, bool8 respectMonPicOffsets, s16 *x, s16 *y); +void SetToPartnerPositions(u8 battler, bool8 respectMonPicOffsets, s16 *x, s16 *y); void DestroySpriteAndMatrix(struct Sprite *sprite); void TranslateSpriteLinearFixedPoint(struct Sprite *sprite); void InitSpritePosToAnimAttacker(struct Sprite *sprite, bool8 respectMonPicOffsets); @@ -210,7 +211,8 @@ u8 GetSubstituteSpriteDefault_Y(u8 battler); #define STAT_ANIM_MULTIPLE_MINUS1 57 #define STAT_ANIM_MULTIPLE_MINUS2 58 -enum { +enum StatAnimPal +{ STAT_ANIM_PAL_ATK, STAT_ANIM_PAL_DEF, STAT_ANIM_PAL_ACC, @@ -230,6 +232,8 @@ void AnimMudSportDirt(struct Sprite *sprite); void AnimDirtScatter(struct Sprite *sprite); void AnimMudSportDirtRising(struct Sprite *sprite); void AnimDirtPlumeParticle(struct Sprite *); +void AnimBoneHitProjectile(struct Sprite *sprite); +extern const union AnimCmd *const sAnims_MudSlapMud[]; extern const union AffineAnimCmd *const gAffineAnims_SpinningBone[]; // battle_anim_throw.c @@ -268,6 +272,7 @@ void AnimTranslateLinearSingleSineWave(struct Sprite *sprite); void AnimTeraStarstormStars(struct Sprite *sprite); void AnimGrantingStars(struct Sprite *sprite); void AnimFollowMeFinger(struct Sprite *sprite); +void AnimPoisonJabProjectile(struct Sprite *sprite); extern const union AnimCmd *const gRazorLeafParticleAnimTable[]; extern const union AnimCmd *const gPowerAbsorptionOrbAnimTable[]; extern const union AffineAnimCmd *const gPowerAbsorptionOrbAffineAnimTable[]; @@ -466,6 +471,7 @@ void AnimElectricity(struct Sprite *); void AnimTask_VoltSwitch(struct Sprite* sprite); extern const union AffineAnimCmd *const gAffineAnims_GrowingElectricOrb[]; extern const union AffineAnimCmd *const gAffineAnims_FlashingSpark[]; +extern const union AnimCmd *const sAnims_CirclingElectricShock[]; extern const union AnimCmd *const gAnims_ThunderboltOrb[]; extern const union AnimCmd *const gAnims_ElectricPuff[]; extern const union AnimCmd *const gAnims_ElectricChargingParticles[]; @@ -490,6 +496,8 @@ extern const union AnimCmd *const gAnims_FlyingRock[]; extern const union AffineAnimCmd *const gAffineAnims_Whirlpool[]; extern const union AffineAnimCmd *const gAffineAnims_BasicRock[]; extern const union AnimCmd *const gAnims_FlyingRock[]; +extern const union AnimCmd *const sAnims_BasicRock[]; +void AnimRockTomb(struct Sprite *sprite); void AnimParticleInVortex(struct Sprite *sprite); void AnimFallingRock(struct Sprite *sprite); void AnimRaiseSprite(struct Sprite *sprite); @@ -557,6 +565,9 @@ void InitSpritePosToAnimTargetsCentre(struct Sprite *sprite, bool32 respectMonPi extern const union AffineAnimCmd *const gSpriteAffineAnimTable_PrimalSymbol[]; extern const union AffineAnimCmd *const gSpriteAffineAnimTable_MegaSymbol[]; +// battle_anim_ice.c +void AnimIceBeamParticle(struct Sprite *sprite); + // battle_anim_bug.c void AnimTranslateStinger(struct Sprite *sprite); diff --git a/include/battle_anim_scripts.h b/include/battle_anim_scripts.h index 0bffbda8ead2..febbfe9a2c9e 100644 --- a/include/battle_anim_scripts.h +++ b/include/battle_anim_scripts.h @@ -948,6 +948,7 @@ extern const u8 gBattleAnimStatus_Paralysis[]; extern const u8 gBattleAnimStatus_Freeze[]; extern const u8 gBattleAnimStatus_Curse[]; extern const u8 gBattleAnimStatus_Nightmare[]; +extern const u8 gBattleAnimStatus_Frostbite[]; // general animations extern const u8 gBattleAnimGeneral_StatsChange[]; @@ -1004,6 +1005,8 @@ extern const u8 gBattleAnimGeneral_TeraCharge[]; extern const u8 gBattleAnimGeneral_TeraActivate[]; extern const u8 gBattleAnimGeneral_SimpleHeal[]; extern const u8 gBattleAnimGeneral_PowerConstruct[]; +extern const u8 gBattleAnimGeneral_SwapToSubstitute[]; +extern const u8 gBattleAnimGeneral_SwapFromSubstitute[]; // special animations extern const u8 gBattleAnimSpecial_LevelUp[]; diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 2ce28ca60924..c3b5fff97f49 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -1,6 +1,8 @@ #ifndef GUARD_BATTLE_CONTROLLERS_H #define GUARD_BATTLE_CONTROLLERS_H +typedef void (*BattleControllerFunc)(u32 battler); + enum { REQUEST_ALL_BATTLE, REQUEST_SPECIES_BATTLE, @@ -201,7 +203,7 @@ struct ChooseMoveStruct u8 currentPp[MAX_MON_MOVES]; u8 maxPp[MAX_MON_MOVES]; u16 species; - u8 monTypes[3]; + enum Type monTypes[3]; struct ZMoveData zmove; }; @@ -277,6 +279,7 @@ void InitBattleControllers(void); bool32 IsValidForBattle(struct Pokemon *mon); void TryReceiveLinkBattleData(void); void PrepareBufferDataTransferLink(u32 battler, u32 bufferId, u16 size, u8 *data); +void UpdateFriendshipFromXItem(u32 battler); // emitters void BtlController_EmitGetMonData(u32 battler, u32 bufferId, u8 requestId, u8 monToCheck); @@ -296,11 +299,11 @@ void BtlController_EmitChooseAction(u32 battler, u32 bufferId, u8 action, u16 it void BtlController_EmitYesNoBox(u32 battler, u32 bufferId); void BtlController_EmitChooseMove(u32 battler, u32 bufferId, bool8 isDoubleBattle, bool8 NoPpNumber, struct ChooseMoveStruct *movePpData); void BtlController_EmitChooseItem(u32 battler, u32 bufferId, u8 *battlePartyOrder); -void BtlController_EmitChoosePokemon(u32 battler, u32 bufferId, u8 caseId, u8 slotId, u16 abilityId, u8 *data); +void BtlController_EmitChoosePokemon(u32 battler, u32 bufferId, u8 caseId, u8 slotId, u16 abilityId, u8 battlerPreventingSwitchout, u8 *data); void BtlController_EmitHealthBarUpdate(u32 battler, u32 bufferId, u16 hpValue); void BtlController_EmitExpUpdate(u32 battler, u32 bufferId, u8 partyId, s32 expPoints); -void BtlController_EmitStatusIconUpdate(u32 battler, u32 bufferId, u32 status1, u32 status2); -void BtlController_EmitStatusAnimation(u32 battler, u32 bufferId, bool8 status2, u32 status); +void BtlController_EmitStatusIconUpdate(u32 battler, u32 bufferId, u32 status); +void BtlController_EmitStatusAnimation(u32 battler, u32 bufferId, bool8 isVolatile, u32 status); void BtlController_EmitDataTransfer(u32 battler, u32 bufferId, u16 size, void *data); void BtlController_EmitTwoReturnValues(u32 battler, u32 bufferId, u8 ret8, u32 ret32); void BtlController_EmitChosenMonReturnValue(u32 battler, u32 bufferId, u8 partyId, u8 *battlePartyOrder); @@ -323,7 +326,7 @@ void BtlController_EmitResetActionMoveSelection(u32 battler, u32 bufferId, u8 ca void BtlController_EmitEndLinkBattle(u32 battler, u32 bufferId, u8 battleOutcome); void BtlController_EmitDebugMenu(u32 battler, u32 bufferId); -void BattleControllerComplete(u32 battler); // Can be used for all the controllers. +void BtlController_Complete(u32 battler); // Can be used for all the controllers. void BtlController_Empty(u32 battler); // Empty command, does nothing, only completes the execution. void BtlController_TerminatorNop(u32 battler); // Dummy function at the end of the table. void BattleControllerDummy(u32 battler); @@ -336,8 +339,8 @@ void BtlController_HandleGetMonData(u32 battler); void BtlController_HandleGetRawMonData(u32 battler); void BtlController_HandleSetMonData(u32 battler); void BtlController_HandleSetRawMonData(u32 battler); -void BtlController_HandleLoadMonSprite(u32 battler, void (*controllerCallback)(u32 battler)); -void BtlController_HandleSwitchInAnim(u32 battler, bool32 isPlayerSide, void (*controllerCallback)(u32 battler)); +void BtlController_HandleLoadMonSprite(u32 battler); +void BtlController_HandleSwitchInAnim(u32 battler); void BtlController_HandleReturnMonToBall(u32 battler); void BtlController_HandleDrawTrainerPic(u32 battlerId, u32 trainerPicId, bool32 isFrontPic, s16 xPos, s16 yPos, s32 subpriority); void BtlController_HandleTrainerSlide(u32 battler, u32 trainerPicId); @@ -345,9 +348,10 @@ void BtlController_HandleTrainerSlideBack(u32 battlerId, s16 data0, bool32 start void BtlController_HandleFaintAnimation(u32 battler); void BtlController_HandleSuccessBallThrowAnim(u32 battler, u32 target, u32 animId, bool32 allowCriticalCapture); void BtlController_HandleBallThrowAnim(u32 battler, u32 target, u32 animId, bool32 allowCriticalCapture); -void BtlController_HandleMoveAnimation(u32 battler, bool32 updateTvData); -void BtlController_HandlePrintString(u32 battler, bool32 updateTvData, bool32 arenaPtsDeduct); -void BtlController_HandleHealthBarUpdate(u32 battler, bool32 updateHpText); +void BtlController_HandleMoveAnimation(u32 battler); +void BtlController_HandlePrintString(u32 battler); +void BtlController_HandlePrintStringPlayerOnly(u32 battler); +void BtlController_HandleHealthBarUpdate(u32 battler); void DoStatusIconUpdate(u32 battler); void BtlController_HandleStatusIconUpdate(u32 battler); void BtlController_HandleStatusAnimation(u32 battler); @@ -360,12 +364,13 @@ void BtlController_HandleSpriteInvisibility(u32 battler); bool32 TwoPlayerIntroMons(u32 battlerId); // Double battle with both player pokemon active. bool32 TwoOpponentIntroMons(u32 battlerId); // Double battle with both opponent pokemon active. void BtlController_HandleIntroTrainerBallThrow(u32 battler, u16 tagTrainerPal, const u16 *trainerPal, s16 framesToWait, void (*controllerCallback)(u32 battler)); -void BtlController_HandleDrawPartyStatusSummary(u32 battler, u32 side, bool32 considerDelay); +void BtlController_HandleDrawPartyStatusSummary(u32 battler, enum BattleSide side, bool32 considerDelay); void BtlController_HandleHidePartyStatusSummary(u32 battler); -void BtlController_HandleBattleAnimation(u32 battler, bool32 ignoreSE, bool32 updateTvData); +void BtlController_HandleBattleAnimation(u32 battler); // player controller void SetControllerToPlayer(u32 battler); +void PlayerBufferExecCompleted(u32 battler); void SetBattleEndCallbacks(u32 battler); void PlayerHandleBallThrowAnim(u32 battler); void PlayerHandleExpUpdate(u32 battler); @@ -388,37 +393,55 @@ void HandleChooseMoveAfterDma3(u32 battler); // recorded player controller void SetControllerToRecordedPlayer(u32 battler); +void RecordedPlayerBufferExecCompleted(u32 battler); + +// recorded partner controller +void SetControllerToRecordedPartner(u32 battler); +void RecordedPartnerBufferExecCompleted(u32 battler); // opponent controller void SetControllerToOpponent(u32 battler); +void OpponentBufferExecCompleted(u32 battler); void OpponentHandleTrainerSlide(u32 battler); // player partner controller void Controller_PlayerPartnerShowIntroHealthbox(u32 battler); // Also used by the link partner. void SetControllerToPlayerPartner(u32 battler); +void PlayerPartnerBufferExecCompleted(u32 battler); // safari controller void SetControllerToSafari(u32 battler); +void SafariBufferExecCompleted(u32 battler); // wally controller void SetControllerToWally(u32 battler); +void WallyBufferExecCompleted(u32 battler); // recorded opponent controller void SetControllerToRecordedOpponent(u32 battler); +void RecordedOpponentBufferExecCompleted(u32 battler); // link opponent void SetControllerToLinkOpponent(u32 battler); +void LinkOpponentBufferExecCompleted(u32 battler); // link partner void SetControllerToLinkPartner(u32 battler); +void LinkPartnerBufferExecCompleted(u32 battler); void TrySetBattlerShadowSpriteCallback(u32 battler); -bool32 TryShinyAnimAfterMonAnimUtil(u32 battler); -bool32 SwitchIn_ShowSubstituteUtil(u32 battler); -bool32 SwitchIn_WaitAndEndUtil(u32 battler); -bool32 SwitchIn_HandleSoundAndEndUtil(u32 battler); -bool32 SwitchIn_ShowHealthboxUtil(u32 battler); -bool32 SwitchIn_TryShinyAnimUtil(u32 battler); +void AnimateMonAfterPokeBallFail(u32 battler); +void TryShinyAnimAfterMonAnim(u32 battler); +void WaitForMonAnimAfterLoad(u32 battler); +void BtlController_HandleSwitchInWaitAndEnd(u32 battler); +void BtlController_Intro_DelayAndEnd(u32 battler); +void BtlController_HandleSwitchInShowHealthbox(u32 battler); +void BtlController_HandleSwitchInTryShinyAnim(u32 battler); +void BtlController_HandleSwitchInSoundAndEnd(u32 battler); +void BtlController_HandleSwitchInShowSubstitute(u32 battler); + +bool32 ShouldBattleRestrictionsApply(u32 battler); +void FreeShinyStars(void); #endif // GUARD_BATTLE_CONTROLLERS_H diff --git a/include/battle_dynamax.h b/include/battle_dynamax.h index ed295bb1e6df..d9fa48706d92 100644 --- a/include/battle_dynamax.h +++ b/include/battle_dynamax.h @@ -5,18 +5,17 @@ bool32 CanDynamax(u32 battler); bool32 IsGigantamaxed(u32 battler); -void ApplyDynamaxHPMultiplier(struct Pokemon* mon); +void ApplyDynamaxHPMultiplier(struct Pokemon *mon); void ActivateDynamax(u32 battler); u16 GetNonDynamaxHP(u32 battler); u16 GetNonDynamaxMaxHP(u32 battler); void UndoDynamax(u32 battler); bool32 IsMoveBlockedByMaxGuard(u32 move); -bool32 IsMoveBlockedByDynamax(u32 move); u16 GetMaxMove(u32 battler, u32 baseMove); u32 GetMaxMovePower(u32 move); bool32 IsMaxMove(u32 move); -void ChooseDamageNonTypesString(u8 type); +void ChooseDamageNonTypesString(enum Type type); void BS_UpdateDynamax(void); void BS_SetSteelsurge(void); diff --git a/include/battle_environment.h b/include/battle_environment.h new file mode 100644 index 000000000000..f4870f795c64 --- /dev/null +++ b/include/battle_environment.h @@ -0,0 +1,17 @@ +#ifndef GUARD_BATTLE_ENVIRONMENT_H +#define GUARD_BATTLE_ENVIRONMENT_H + +#include "constants/battle.h" +#include "battle_bg.h" + +struct BattleEnvironment +{ + u16 naturePower; + u16 secretPowerEffect; + enum Type camouflageType; + struct BattleBackground background; +}; + +extern const struct BattleEnvironment gBattleEnvironmentInfo[BATTLE_ENVIRONMENT_COUNT]; + +#endif // GUARD_BATTLE_ENVIRONMENT_H diff --git a/include/battle_gfx_sfx_util.h b/include/battle_gfx_sfx_util.h index c2cc9011713f..eb713779c23a 100644 --- a/include/battle_gfx_sfx_util.h +++ b/include/battle_gfx_sfx_util.h @@ -7,7 +7,7 @@ u16 ChooseMoveAndTargetInBattlePalace(u32 battler); void SpriteCB_WaitForBattlerBallReleaseAnim(struct Sprite *sprite); void SpriteCB_TrainerSlideIn(struct Sprite *sprite); void SpriteCB_TrainerSpawn(struct Sprite *sprite); -void InitAndLaunchChosenStatusAnimation(u32 battler, bool32 isStatus2, u32 status); +void InitAndLaunchChosenStatusAnimation(u32 battler, bool32 isVolatile, u32 status); bool8 TryHandleLaunchBattleTableAnimation(u8 activeBattlerId, u8 attacker, u8 target, u8 tableId, u16 argument); void InitAndLaunchSpecialAnimation(u8 activeBattlerId, u8 attacker, u8 target, u8 tableId); bool8 IsBattleSEPlaying(u8 battler); @@ -22,7 +22,7 @@ bool8 BattleInitAllSprites(u8 *state1, u8 *battler); void ClearSpritesHealthboxAnimData(void); void CopyAllBattleSpritesInvisibilities(void); void CopyBattleSpriteInvisibility(u8 battler); -void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool32 megaEvo, bool8 trackEnemyPersonality); +void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, u8 changeType); void BattleLoadSubstituteOrMonSpriteGfx(u8 battler, bool8 loadMonSprite); void LoadBattleMonGfxAndAnimate(u8 battler, bool8 loadMonSprite, u8 spriteId); void TrySetBehindSubstituteSpriteBit(u8 battler, u16 move); diff --git a/include/battle_gimmick.h b/include/battle_gimmick.h index 42b8c7255aa1..84b1d6b26a55 100644 --- a/include/battle_gimmick.h +++ b/include/battle_gimmick.h @@ -35,6 +35,7 @@ void SetGimmickAsActivated(u32 battler, enum Gimmick gimmick); void ChangeGimmickTriggerSprite(u32 spriteId, u32 animId); void CreateGimmickTriggerSprite(u32 battler); bool32 IsGimmickTriggerSpriteActive(void); +bool32 IsGimmickTriggerSpriteMatchingBattler(u32 battler); void HideGimmickTriggerSprite(void); void DestroyGimmickTriggerSprite(void); diff --git a/include/battle_hold_effects.h b/include/battle_hold_effects.h new file mode 100644 index 000000000000..51e63ea20a02 --- /dev/null +++ b/include/battle_hold_effects.h @@ -0,0 +1,52 @@ +#ifndef GUARD_BATTLE_HOLD_EFFECTS +#define GUARD_BATTLE_HOLD_EFFECTS + +struct HoldEffectInfo +{ + u32 onSwitchIn:1; + u32 onSwitchInFirstTurn:1; + u32 mirrorHerb:1; + u32 mirrorHerbFirstTurn:1; + u32 whiteHerb:1; + u32 whiteHerbFirstTurn:1; + u32 whiteHerbEndTurn:1; + u32 onStatusChange:1; + u32 onHpThreshold:1; + u32 keeMarangaBerry:1; + u32 MentalHerb:1; + u32 onTargetAfterHit:1; + u32 onAttackerAfterHit:1; + u32 lifeOrbShellBell:1; + u32 leftovers:1; + u32 orbs:1; + u32 onEffect:1; + u32 onFling:1; + u32 padding:14; +}; + +extern const struct HoldEffectInfo gHoldEffectsInfo[]; + +typedef bool32 (*ActivationTiming)(enum HoldEffect holdEffect); +enum ItemEffect ItemBattleEffects(u32 primaryBattler, u32 secondaryBattler, enum HoldEffect holdEffect, ActivationTiming timing); + +bool32 IsOnSwitchInActivation(enum HoldEffect holdEffect); +bool32 IsOnSwitchInFirstTurnActivation(enum HoldEffect holdEffect); +bool32 IsMirrorHerbActivation(enum HoldEffect holdEffect); +bool32 IsMirrorHerbFirstTurnActivation(enum HoldEffect holdEffect); +bool32 IsWhiteHerbActivation(enum HoldEffect holdEffect); +bool32 IsWhiteHerbFirstTurnActivation(enum HoldEffect holdEffect); +bool32 IsWhiteHerbEndTurnActivation(enum HoldEffect holdEffect); +bool32 IsOnStatusChangeActivation(enum HoldEffect holdEffect); +bool32 IsOnHpThresholdActivation(enum HoldEffect holdEffect); +bool32 IsKeeMarangaBerryActivation(enum HoldEffect holdEffect); +bool32 IsOnTargetHitActivation(enum HoldEffect holdEffect); +bool32 IsOnAttackerAfterHitActivation(enum HoldEffect holdEffect); +bool32 IsLifeOrbShellBellActivation(enum HoldEffect holdEffect); +bool32 IsLeftoversActivation(enum HoldEffect holdEffect); +bool32 IsOrbsActivation(enum HoldEffect holdEffect); +bool32 IsOnEffectActivation(enum HoldEffect holdEffect); +bool32 IsForceTriggerItemActivation(enum HoldEffect holdEffect); +bool32 IsOnBerryActivation(enum HoldEffect holdEffect); +bool32 IsOnFlingActivation(enum HoldEffect holdEffect); + +#endif // GUARD_BATTLE_HOLD_EFFECTS diff --git a/include/battle_interface.h b/include/battle_interface.h index 5bc1e10aa7c5..ea5559d16545 100644 --- a/include/battle_interface.h +++ b/include/battle_interface.h @@ -126,7 +126,7 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem s32 MoveBattleBar(u8 battler, u8 healthboxSpriteId, u8 whichBar, u8 unused); u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale); u8 GetHPBarLevel(s16 hp, s16 maxhp); -void CreateAbilityPopUp(u8 battlerId, u32 ability, bool32 isDoubleBattle); +void CreateAbilityPopUp(u8 battlerId, enum Ability ability, bool32 isDoubleBattle); void DestroyAbilityPopUp(u8 battlerId); bool32 CanThrowLastUsedBall(void); void TryHideLastUsedBall(void); diff --git a/include/battle_main.h b/include/battle_main.h index 42c2dc2b3230..c08da1d9caeb 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -1,6 +1,7 @@ #ifndef GUARD_BATTLE_MAIN_H #define GUARD_BATTLE_MAIN_H +#include "battle_util.h" #include "pokemon.h" #include "data.h" #include "constants/hold_effects.h" @@ -57,9 +58,11 @@ enum FirstTurnEventsStates FIRST_TURN_EVENTS_TOTEM_BOOST, FIRST_TURN_EVENTS_NEUTRALIZING_GAS, FIRST_TURN_EVENTS_SWITCH_IN_ABILITIES, - FIRST_TURN_EVENTS_OPPORTUNIST_1, FIRST_TURN_EVENTS_ITEM_EFFECTS, - FIRST_TURN_EVENTS_OPPORTUNIST_2, + FIRST_TURN_EVENTS_WHITE_HERB, + FIRST_TURN_EVENTS_OPPORTUNIST, + FIRST_TURN_EVENTS_MIRROR_HERB, + FIRST_TURN_EVENTS_EJECT_PACK, FIRST_TURN_EVENTS_END, }; @@ -88,25 +91,22 @@ void SpriteCB_TrainerThrowObject(struct Sprite *sprite); void AnimSetCenterToCornerVecX(struct Sprite *sprite); void BeginBattleIntroDummy(void); void BeginBattleIntro(void); -void SwitchInClearSetData(u32 battler); +void SwitchInClearSetData(u32 battler, struct Volatiles *volatilesCopy); const u8* FaintClearSetData(u32 battler); void BattleTurnPassed(void); u8 IsRunningFromBattleImpossible(u32 battler); void SwitchTwoBattlersInParty(u32 battler, u32 battler2); void SwitchPartyOrder(u32 battler); void SwapTurnOrder(u8 id1, u8 id2); -u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); -u32 GetBattlerTotalSpeedStat(u32 battler); -s32 GetChosenMovePriority(u32 battler, u32 ability); -s32 GetBattleMovePriority(u32 battler, u32 ability, u32 move); -s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMoves, u32 ability1, u32 ability2, - enum ItemHoldEffect holdEffectBattler1, enum ItemHoldEffect holdEffectBattler2, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2); -s32 GetWhichBattlerFasterOrTies(u32 battler1, u32 battler2, bool32 ignoreChosenMoves); -s32 GetWhichBattlerFaster(u32 battler1, u32 battler2, bool32 ignoreChosenMoves); +u32 GetBattlerTotalSpeedStat(u32 battler, enum Ability ability, enum HoldEffect holdEffect); +s32 GetChosenMovePriority(u32 battler, enum Ability ability); +s32 GetBattleMovePriority(u32 battler, enum Ability ability, u32 move); +s32 GetWhichBattlerFasterArgs(struct BattleContext *ctx, bool32 ignoreChosenMoves, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2); +s32 GetWhichBattlerFasterOrTies(struct BattleContext *ctx, bool32 ignoreChosenMoves); +s32 GetWhichBattlerFaster(struct BattleContext *ctx, bool32 ignoreChosenMoves); void RunBattleScriptCommands_PopCallbacksStack(void); void RunBattleScriptCommands(void); -void SpecialStatusesClear(void); -u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState monInBattle); +enum Type GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState monInBattle); void SetTypeBeforeUsingMove(u32 move, u32 battlerAtk); bool32 IsWildMonSmart(void); u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer *trainer, bool32 firstTrainer, u32 battleTypeFlags); @@ -115,6 +115,7 @@ u32 GeneratePersonalityForGender(u32 gender, u32 species); void CustomTrainerPartyAssignMoves(struct Pokemon *mon, const struct TrainerMon *partyEntry); bool32 CanPlayerForfeitNormalTrainerBattle(void); bool32 DidPlayerForfeitNormalTrainerBattle(void); +void BattleDebug_WonBattle(void); extern struct MultiPartnerMenuPokemon gMultiPartnerParty[MULTI_PARTY_SIZE]; diff --git a/include/battle_message.h b/include/battle_message.h index e9b133b656c5..9809589243cc 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -1,6 +1,7 @@ #ifndef GUARD_BATTLE_MESSAGE_H #define GUARD_BATTLE_MESSAGE_H +#include "constants/abilities.h" #include "constants/battle.h" #include "constants/battle_string_ids.h" @@ -84,8 +85,8 @@ #define B_TXT_TRAINER2_NAME_WITH_CLASS 0x43 #define B_TXT_PARTNER_NAME_WITH_CLASS 0x44 #define B_TXT_ATK_TRAINER_NAME_WITH_CLASS 0x45 -#define B_TXT_SCR_TEAM1 0x46 -#define B_TXT_SCR_TEAM2 0x47 +#define B_TXT_EFF_TEAM1 0x46 +#define B_TXT_EFF_TEAM2 0x47 #define B_BUFF_STRING 0 #define B_BUFF_NUMBER 1 @@ -238,13 +239,13 @@ struct BattleMsgData u16 currentMove; u16 originallyUsedMove; u16 lastItem; - u16 lastAbility; + enum Ability lastAbility; u8 scrActive; u8 bakScriptPartyIdx; u8 hpScale; u8 itemEffectBattler; - u8 moveType; - u16 abilities[MAX_BATTLERS_COUNT]; + enum Type moveType; + enum Ability abilities[MAX_BATTLERS_COUNT]; u8 textBuffs[3][TEXT_BUFF_ARRAY_COUNT]; }; @@ -334,5 +335,6 @@ extern const u8 gText_BattleTourney[]; extern const u16 gMissStringIds[]; extern const u16 gStatUpStringIds[]; +extern const u16 gStatDownStringIds[]; #endif // GUARD_BATTLE_MESSAGE_H diff --git a/include/battle_pyramid.h b/include/battle_pyramid.h index ec80fdeed3a5..d55d8d2e9399 100644 --- a/include/battle_pyramid.h +++ b/include/battle_pyramid.h @@ -1,13 +1,15 @@ #ifndef GUARD_BATTLE_PYRAMID_H #define GUARD_BATTLE_PYRAMID_H +#include "constants/battle_pyramid.h" + void CallBattlePyramidFunction(void); u16 LocalIdToPyramidTrainerId(u8 localId); bool8 GetBattlePyramidTrainerFlag(u8 eventId); void MarkApproachingPyramidTrainersAsBattled(void); void GenerateBattlePyramidWildMon(void); u8 GetPyramidRunMultiplier(void); -u8 InBattlePyramid(void); +u8 CurrentBattlePyramidLocation(void); bool8 InBattlePyramid_(void); void PausePyramidChallenge(void); void SoftResetInBattlePyramid(void); diff --git a/include/battle_pyramid_bag.h b/include/battle_pyramid_bag.h index 258ca56b215d..4d8b87506ea3 100644 --- a/include/battle_pyramid_bag.h +++ b/include/battle_pyramid_bag.h @@ -2,6 +2,8 @@ #define GUARD_BATTLE_PYRAMID_BAG_H #include "list_menu.h" +#include "main.h" +#include "task.h" enum { PYRAMIDBAG_LOC_FIELD, @@ -29,7 +31,7 @@ enum { struct PyramidBagMenu { - void (*newScreenCallback)(void); + MainCallback newScreenCallback; u8 tilemapBuffer[BG_SCREEN_SIZE]; u8 spriteIds[PBAG_SPRITE_COUNT]; u8 windowIds[5]; @@ -49,7 +51,7 @@ struct PyramidBagMenu struct PyramidBagMenuState { - void (*exitCallback)(void); + MainCallback exitCallback; u8 location; u16 cursorPosition; u16 scrollPosition; @@ -63,11 +65,11 @@ void CB2_PyramidBagMenuFromStartMenu(void); void CB2_ReturnToPyramidBagMenu(void); void UpdatePyramidBagList(void); void UpdatePyramidBagCursorPos(void); -void GoToBattlePyramidBagMenu(u8 location, void (*exitCallback)(void)); +void GoToBattlePyramidBagMenu(u8 location, MainCallback exitCallback); void Task_CloseBattlePyramidBagMessage(u8 taskId); void TryStoreHeldItemsInPyramidBag(void); void ChooseItemsToTossFromPyramidBag(void); void CloseBattlePyramidBag(u8 taskId); -void DisplayItemMessageInBattlePyramid(u8 taskId, const u8 *str, void (*callback)(u8 taskId)); +void DisplayItemMessageInBattlePyramid(u8 taskId, const u8 *str, TaskFunc callback); #endif // GUARD_BATTLE_PYRAMID_BAG_H diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index c0d47436fd5f..d011b509477d 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -22,15 +22,33 @@ struct PickupItem u8 percentage[10]; }; -s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk); -s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk); +union TRANSPARENT StatChangeFlags +{ + int raw; + u32 raw_u32; + u16 raw_u16; + u8 raw_u8; + struct { + bool32 allowPtr:1; // STAT_CHANGE_ALLOW_PTR + bool32 mirrorArmored:1; // STAT_CHANGE_MIRROR_ARMOR + bool32 onlyChecking:1; // STAT_CHANGE_ONLY_CHECKING + bool32 notProtectAffected:1; // STAT_CHANGE_NOT_PROTECT_AFFECTED + bool32 updateMoveEffect:1; // STAT_CHANGE_UPDATE_MOVE_EFFECT + bool32 statDropPrevention:1; // STAT_CHANGE_CHECK_PREVENTION + bool32 certain:1; // STAT_CHANGE_CERTAIN + bool32 padding:25; + }; +}; + +s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum HoldEffect holdEffectAtk); +s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum HoldEffect holdEffectAtk); s32 GetCritHitOdds(s32 critChanceIndex); -u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect); -u8 GetBattlerTurnOrderNum(u8 battler); +bool32 HasBattlerActedThisTurn(u32 battler); +u32 GetBattlerTurnOrderNum(u32 battler); bool32 NoAliveMonsForBattlerSide(u32 battler); bool32 NoAliveMonsForPlayer(void); bool32 NoAliveMonsForEitherParty(void); -void SetMoveEffect(bool32 primary, bool32 certain); +void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, const u8 *battleScript, enum SetMoveEffectFlags effectFlags); bool32 CanBattlerSwitch(u32 battlerId); void BattleDestroyYesNoCursorAt(u8 cursorPosition); void BattleCreateYesNoCursorAt(u8 cursorPosition); @@ -41,16 +59,14 @@ bool32 DoesSubstituteBlockMove(u32 battlerAtk, u32 battlerDef, u32 move); bool32 DoesDisguiseBlockMove(u32 battler, u32 move); bool32 CanUseLastResort(u8 battlerId); u32 IsFlowerVeilProtected(u32 battler); -u32 IsLeafGuardProtected(u32 battler, u32 ability); -bool32 IsShieldsDownProtected(u32 battler, u32 ability); -u32 IsAbilityStatusProtected(u32 battler, u32 ability); +u32 IsLeafGuardProtected(u32 battler, enum Ability ability); +bool32 IsShieldsDownProtected(u32 battler, enum Ability ability); +u32 IsAbilityStatusProtected(u32 battler, enum Ability ability); bool32 TryResetBattlerStatChanges(u8 battler); bool32 CanCamouflage(u8 battlerId); -u32 GetNaturePowerMove(u32 battler); void StealTargetItem(u8 battlerStealer, u8 battlerItem); u8 GetCatchingBattler(void); -u32 GetHighestStatId(u32 battlerId); -bool32 ProteanTryChangeType(u32 battler, u32 ability, u32 move, u32 moveType); +bool32 ProteanTryChangeType(u32 battler, enum Ability ability, u32 move, enum Type moveType); bool32 IsMoveNotAllowedInSkyBattles(u32 move); bool32 DoSwitchInAbilities(u32 battlerId); u8 GetFirstFaintedPartyIndex(u8 battlerId); @@ -58,7 +74,7 @@ bool32 IsMoveAffectedByParentalBond(u32 move, u32 battler); void SaveBattlerTarget(u32 battler); void SaveBattlerAttacker(u32 battler); bool32 CanBurnHitThaw(u16 move); -void SetNonVolatileStatusCondition(u32 target, enum MoveEffects effect); +bool32 EmergencyExitCanBeTriggered(u32 battler); extern void (*const gBattleScriptingCommandsTable[])(void); extern const struct StatFractions gAccuracyStageRatios[]; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index de3e876aa242..e2f9f1636ca4 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -3,17 +3,18 @@ extern const u8 BattleScript_SupersweetSyrupActivates[]; extern const u8 BattleScript_OpportunistCopyStatChange[]; +extern const u8 BattleScript_OpportunistCopyStatChangeEnd3[]; extern const u8 BattleScript_MirrorHerbCopyStatChange[]; extern const u8 BattleScript_MirrorHerbCopyStatChangeEnd2[]; extern const u8 BattleScript_NotAffected[]; extern const u8 BattleScript_HitFromCritCalc[]; extern const u8 BattleScript_MoveEnd[]; extern const u8 BattleScript_MakeMoveMissed[]; -extern const u8 BattleScript_PrintMoveMissed[]; +extern const u8 BattleScript_MoveMissedPause[]; extern const u8 BattleScript_MoveMissedPause[]; extern const u8 BattleScript_MoveMissed[]; extern const u8 BattleScript_FlingFailConsumeItem[]; -extern const u8 BattleScript_FailedFromAtkString[]; +extern const u8 BattleScript_FlingBlockedByShieldDust[]; extern const u8 BattleScript_FailedFromAtkCanceler[]; extern const u8 BattleScript_ButItFailed[]; extern const u8 BattleScript_StatUp[]; @@ -21,8 +22,7 @@ extern const u8 BattleScript_StatDown[]; extern const u8 BattleScript_AlreadyAtFullHp[]; extern const u8 BattleScript_PresentHealTarget[]; extern const u8 BattleScript_MoveUsedMustRecharge[]; -extern const u8 BattleScript_FaintAttacker[]; -extern const u8 BattleScript_FaintTarget[]; +extern const u8 BattleScript_FaintBattler[]; extern const u8 BattleScript_GiveExp[]; extern const u8 BattleScript_HandleFaintedMon[]; extern const u8 BattleScript_LocalTrainerBattleWon[]; @@ -72,6 +72,8 @@ extern const u8 BattleScript_RoarSuccessSwitch[]; extern const u8 BattleScript_RoarSuccessEndBattle[]; extern const u8 BattleScript_MistProtected[]; extern const u8 BattleScript_RageIsBuilding[]; +extern const u8 BattleScript_EncoredMoveInPalace[]; +extern const u8 BattleScript_EncoredMove[]; extern const u8 BattleScript_MoveUsedIsDisabled[]; extern const u8 BattleScript_SelectingDisabledMove[]; extern const u8 BattleScript_DisabledNoMore[]; @@ -90,7 +92,7 @@ extern const u8 BattleScript_AllStatsUp[]; extern const u8 BattleScript_RapidSpinAway[]; extern const u8 BattleScript_WrapFree[]; extern const u8 BattleScript_LeechSeedFree[]; -extern const u8 BattleScript_SpikesFree[]; +extern const u8 BattleScript_SpinHazardsAway[]; extern const u8 BattleScript_MonTookFutureAttack[]; extern const u8 BattleScript_NoMovesLeft[]; extern const u8 BattleScript_SelectingMoveWithNoPP[]; @@ -148,7 +150,7 @@ extern const u8 BattleScript_TargetWokeUp[]; extern const u8 BattleScript_TargetBurnHeal[]; extern const u8 BattleScript_TargetPoisonHealed[]; extern const u8 BattleScript_MoveEffectSleep[]; -extern const u8 BattleScript_YawnMakesAsleep[]; +extern const u8 BattleScript_YawnMakesAsleepEnd2[]; extern const u8 BattleScript_MoveEffectPoison[]; extern const u8 BattleScript_MoveEffectBurn[]; extern const u8 BattleScript_MoveEffectFrostbite[]; @@ -166,7 +168,6 @@ extern const u8 BattleScript_DoRecoil33[]; extern const u8 BattleScript_Recoil33End[]; extern const u8 BattleScript_ItemSteal[]; extern const u8 BattleScript_DrizzleActivates[]; -extern const u8 BattleScript_SpeedBoostActivates[]; extern const u8 BattleScript_TraceActivates[]; extern const u8 BattleScript_RainDishActivates[]; extern const u8 BattleScript_SandstreamActivates[]; @@ -178,11 +179,8 @@ extern const u8 BattleScript_DroughtActivates[]; extern const u8 BattleScript_TookAttack[]; extern const u8 BattleScript_SturdyPreventsOHKO[]; extern const u8 BattleScript_DampStopsExplosion[]; -extern const u8 BattleScript_MoveHPDrain_PPLoss[]; extern const u8 BattleScript_MoveHPDrain[]; -extern const u8 BattleScript_MonMadeMoveUseless_PPLoss[]; extern const u8 BattleScript_MonMadeMoveUseless[]; -extern const u8 BattleScript_FlashFireBoost_PPLoss[]; extern const u8 BattleScript_FlashFireBoost[]; extern const u8 BattleScript_AbilityNoStatLoss[]; extern const u8 BattleScript_ItemNoStatLoss[]; @@ -193,6 +191,7 @@ extern const u8 BattleScript_OwnTempoPrevents[]; extern const u8 BattleScript_SoundproofProtected[]; extern const u8 BattleScript_AbilityNoSpecificStatLoss[]; extern const u8 BattleScript_StickyHoldActivates[]; +extern const u8 BattleScript_StickyHoldActivatesRet[]; extern const u8 BattleScript_ColorChangeActivates[]; extern const u8 BattleScript_RoughSkinActivates[]; extern const u8 BattleScript_CuteCharmActivates[]; @@ -200,6 +199,7 @@ extern const u8 BattleScript_AbilityStatusEffect[]; extern const u8 BattleScript_SynchronizeActivates[]; extern const u8 BattleScript_NoItemSteal[]; extern const u8 BattleScript_AbilityCuredStatus[]; +extern const u8 BattleScript_AbilityCuredStatusEnd3[]; extern const u8 BattleScript_IgnoresWhileAsleep[]; extern const u8 BattleScript_IgnoresAndUsesRandomMove[]; extern const u8 BattleScript_MoveUsedLoafingAround[]; @@ -207,22 +207,10 @@ extern const u8 BattleScript_TruantLoafingAround[]; extern const u8 BattleScript_IgnoresAndFallsAsleep[]; extern const u8 BattleScript_IgnoresAndHitsItself[]; extern const u8 BattleScript_SubstituteFade[]; -extern const u8 BattleScript_BerryCurePrlzEnd2[]; -extern const u8 BattleScript_BerryCureParRet[]; -extern const u8 BattleScript_BerryCurePsnEnd2[]; -extern const u8 BattleScript_BerryCurePsnRet[]; -extern const u8 BattleScript_BerryCureBrnEnd2[]; -extern const u8 BattleScript_BerryCureBrnRet[]; -extern const u8 BattleScript_BerryCureFrzEnd2[]; -extern const u8 BattleScript_BerryCureFrzRet[]; -extern const u8 BattleScript_BerryCureFrbEnd2[]; -extern const u8 BattleScript_BerryCureFrbRet[]; -extern const u8 BattleScript_BerryCureSlpEnd2[]; -extern const u8 BattleScript_BerryCureSlpRet[]; +extern const u8 BattleScript_BerryCureStatusEnd2[]; +extern const u8 BattleScript_BerryCureStatusRet[]; extern const u8 BattleScript_BerryCureConfusionEnd2[]; extern const u8 BattleScript_BerryCureConfusionRet[]; -extern const u8 BattleScript_BerryCureChosenStatusEnd2[]; -extern const u8 BattleScript_BerryCureChosenStatusRet[]; extern const u8 BattleScript_WhiteHerbEnd2[]; extern const u8 BattleScript_WhiteHerbRet[]; extern const u8 BattleScript_ItemHealHP_RemoveItemRet[]; @@ -241,6 +229,8 @@ extern const u8 BattleScript_ConsumableStatRaiseRet[]; extern const u8 BattleScript_BerryFocusEnergyRet[]; extern const u8 BattleScript_BerryFocusEnergyEnd2[]; extern const u8 BattleScript_ActionSelectionItemsCantBeUsed[]; +extern const u8 BattleScript_AbilityAvoidsDamage[]; +extern const u8 BattleScript_AbilityShieldProtects[]; extern const u8 BattleScript_ArenaTurnBeginning[]; extern const u8 BattleScript_PalacePrintFlavorText[]; extern const u8 BattleScript_ArenaDoJudgment[]; @@ -275,10 +265,10 @@ extern const u8 BattleScript_WaterSportEnds[]; extern const u8 BattleScript_SturdiedMsg[]; extern const u8 BattleScript_GravityEnds[]; extern const u8 BattleScript_MoveStatDrain[]; -extern const u8 BattleScript_MoveStatDrain_PPLoss[]; extern const u8 BattleScript_TargetsStatWasMaxedOut[]; extern const u8 BattleScript_AttackerAbilityStatRaise[]; extern const u8 BattleScript_AttackerAbilityStatRaiseEnd3[]; +extern const u8 BattleScript_AttackerAbilityStatRaiseEnd2[]; extern const u8 BattleScript_PoisonHealActivates[]; extern const u8 BattleScript_BadDreamsActivates[]; extern const u8 BattleScript_SwitchInAbilityMsg[]; @@ -292,6 +282,7 @@ extern const u8 BattleScript_CursedBodyActivates[]; extern const u8 BattleScript_MummyActivates[]; extern const u8 BattleScript_WeakArmorActivates[]; extern const u8 BattleScript_FellStingerRaisesStat[]; +extern const u8 BattleScript_RemoveTerrain[]; extern const u8 BattleScript_SnowWarningActivatesHail[]; extern const u8 BattleScript_SnowWarningActivatesSnow[]; extern const u8 BattleScript_PickupActivates[]; @@ -307,13 +298,7 @@ extern const u8 BattleScript_SelectingNotAllowedMoveGravityInPalace[]; extern const u8 BattleScript_SelectingNotAllowedMoveHealBlock[]; extern const u8 BattleScript_MoveUsedHealBlockPrevents[]; extern const u8 BattleScript_SelectingNotAllowedMoveHealBlockInPalace[]; -extern const u8 BattleScript_ToxicSpikesFree[]; -extern const u8 BattleScript_StickyWebFree[]; -extern const u8 BattleScript_StealthRockFree[]; -extern const u8 BattleScript_SpikesDefog[]; -extern const u8 BattleScript_ToxicSpikesDefog[]; -extern const u8 BattleScript_StickyWebDefog[]; -extern const u8 BattleScript_StealthRockDefog[]; +extern const u8 BattleScript_DefogClearHazards[]; extern const u8 BattleScript_MegaEvolution[]; extern const u8 BattleScript_WishMegaEvolution[]; extern const u8 BattleScript_MoveEffectClearSmog[]; @@ -329,7 +314,6 @@ extern const u8 BattleScript_ProteanActivates[]; extern const u8 BattleScript_DazzlingProtected[]; extern const u8 BattleScript_MoveUsedPsychicTerrainPrevents[]; extern const u8 BattleScript_MoveUsedPowder[]; -extern const u8 BattleScript_ZMoveActivatePowder[]; extern const u8 BattleScript_SelectingNotAllowedStuffCheeks[]; extern const u8 BattleScript_SelectingNotAllowedStuffCheeksInPalace[]; extern const u8 BattleScript_SelectingNotAllowedBelch[]; @@ -339,7 +323,7 @@ extern const u8 BattleScript_GrassySurgeActivates[]; extern const u8 BattleScript_MistySurgeActivates[]; extern const u8 BattleScript_ElectricSurgeActivates[]; extern const u8 BattleScript_EffectSpectralThief[]; -extern const u8 BattleScript_StatUpMsg[]; +extern const u8 BattleScript_EffectLifeDew[]; extern const u8 BattleScript_AbilityRaisesDefenderStat[]; extern const u8 BattleScript_PowderMoveNoEffect[]; extern const u8 BattleScript_GrassyTerrainHeals[]; @@ -360,8 +344,9 @@ extern const u8 BattleScript_WeaknessPolicy[]; extern const u8 BattleScript_TargetItemStatRaise[]; extern const u8 BattleScript_RockyHelmetActivates[]; extern const u8 BattleScript_ItemHurtEnd2[]; -extern const u8 BattleScript_AirBaloonMsgIn[]; -extern const u8 BattleScript_AirBaloonMsgPop[]; +extern const u8 BattleScript_AirBalloonMsgIn[]; +extern const u8 BattleScript_AirBalloonMsgInRet[]; +extern const u8 BattleScript_AirBalloonMsgPop[]; extern const u8 BattleScript_ItemHurtRet[]; extern const u8 BattleScript_ToxicOrb[]; extern const u8 BattleScript_FlameOrb[]; @@ -372,10 +357,11 @@ extern const u8 BattleScript_IllusionOffEnd3[]; extern const u8 BattleScript_IllusionOffAndTerastallization[]; extern const u8 BattleScript_DancerActivates[]; extern const u8 BattleScript_AftermathDmg[]; -extern const u8 BattleScript_AttackerFormChange[]; -extern const u8 BattleScript_AttackerFormChangeEnd3[]; +extern const u8 BattleScript_BattlerFormChange[]; +extern const u8 BattleScript_BattlerFormChangeEnd2[]; +extern const u8 BattleScript_BattlerFormChangeEnd3[]; extern const u8 BattleScript_AttackerFormChangeWithString[]; -extern const u8 BattleScript_AttackerFormChangeWithStringEnd3[]; +extern const u8 BattleScript_BattlerFormChangeWithStringEnd3[]; extern const u8 BattleScript_TargetFormChange[]; extern const u8 BattleScript_AnticipationActivates[]; extern const u8 BattleScript_SlowStartEnds[]; @@ -419,13 +405,15 @@ extern const u8 BattleScript_RedCardActivates[]; extern const u8 BattleScript_EjectButtonActivates[]; extern const u8 BattleScript_EjectPackActivate_Ret[]; extern const u8 BattleScript_EjectPackActivate_End2[]; +extern const u8 BattleScript_EjectPackActivate_End3[]; extern const u8 BattleScript_EjectPackActivates[]; extern const u8 BattleScript_MentalHerbCureRet[]; extern const u8 BattleScript_MentalHerbCureEnd2[]; extern const u8 BattleScript_TerrainPreventsEnd2[]; +extern const u8 BattleScript_ImmunityProtectedEnd2[]; extern const u8 BattleScript_MistyTerrainPrevents[]; extern const u8 BattleScript_ElectricTerrainPrevents[]; -extern const u8 BattleScript_DarkTypePreventsPrankster[]; +extern const u8 BattleScript_DoesntAffectTargetAtkString[]; extern const u8 BattleScript_GulpMissileGorging[]; extern const u8 BattleScript_GulpMissileGulping[]; extern const u8 BattleScript_GulpMissileFormChange[]; @@ -447,8 +435,7 @@ extern const u8 BattleScript_WanderingSpiritActivates[]; extern const u8 BattleScript_MirrorArmorReflect[]; extern const u8 BattleScript_GooeyActivates[]; extern const u8 BattleScript_PastelVeilActivates[]; -extern const u8 BattleScript_AttackerFormChangeEnd3NoPopup[]; -extern const u8 BattleScript_AttackerFormChangeWithStringEnd3NoPopup[]; +extern const u8 BattleScript_BattlerFormChangeEnd3NoPopup[]; extern const u8 BattleScript_AttackerFormChangeMoveEffect[]; extern const u8 BattleScript_BothCanNoLongerEscape[]; extern const u8 BattleScript_OctolockEndTurn[]; @@ -466,6 +453,7 @@ extern const u8 BattleScript_RemoveFireType[]; extern const u8 BattleScript_TargetAbilityStatRaiseRet[]; extern const u8 BattleScript_RemoveElectricType[]; extern const u8 BattleScript_SeedSowerActivates[]; +extern const u8 BattleScript_BerserkActivates[]; extern const u8 BattleScript_AngerShellActivates[]; extern const u8 BattleScript_WellBakedBodyActivates[]; extern const u8 BattleScript_WindRiderActivatesMoveEnd[]; @@ -518,9 +506,8 @@ extern const u8 BattleScript_BoosterEnergyEnd2[]; extern const u8 BattleScript_BoosterEnergyRet[]; extern const u8 BattleScript_TeraShellDistortingTypeMatchups[]; extern const u8 BattleScript_TeraFormChange[]; -extern const u8 BattleScript_SleepClausePreventsEnd[]; +extern const u8 BattleScript_SleepClausePreventsEnd2[]; extern const u8 BattleScript_PowerConstruct[]; - extern const u8 BattleScript_AbilityProtectsDoesntAffect[]; extern const u8 BattleScript_ImmunityProtected[]; extern const u8 BattleScript_SafeguardProtected[]; @@ -532,6 +519,7 @@ extern const u8 BattleScript_AlreadyPoisoned[]; extern const u8 BattleScript_AlreadyParalyzed[]; extern const u8 BattleScript_AlreadyBurned[]; extern const u8 BattleScript_PrintAbilityMadeIneffective[]; +extern const u8 BattleScript_ItDoesntAffectFoe[]; // zmoves extern const u8 BattleScript_ZMoveActivateDamaging[]; @@ -549,14 +537,12 @@ extern const u8 BattleScript_EffectSetWeather[]; extern const u8 BattleScript_EffectSetTerrain[]; extern const u8 BattleScript_EffectStonesurge[]; extern const u8 BattleScript_EffectSteelsurge[]; -extern const u8 BattleScript_SteelsurgeFree[]; -extern const u8 BattleScript_SteelsurgeDefog[]; extern const u8 BattleScript_DamageNonTypesStarts[]; extern const u8 BattleScript_DamageNonTypesContinues[]; -extern const u8 BattleScript_DefogTryHazards[]; -extern const u8 BattleScript_EffectAuroraVeilSuccess[]; +extern const u8 BattleScript_MoveEffectDefog[]; +extern const u8 BattleScript_MoveEffectAuroraVeil[]; extern const u8 BattleScript_EffectGravitySuccess[]; -extern const u8 BattleScript_EffectYawnSuccess[]; +extern const u8 BattleScript_MoveEffectYawnSide[]; extern const u8 BattleScript_EffectTryReducePP[]; extern const u8 BattleScript_EffectParalyzeSide[]; extern const u8 BattleScript_EffectPoisonSide[]; @@ -583,7 +569,6 @@ extern const u8 BattleScript_EffectAbsorb[]; extern const u8 BattleScript_EffectAbsorbLiquidOoze[]; extern const u8 BattleScript_EffectExplosion[]; extern const u8 BattleScript_EffectDreamEater[]; -extern const u8 BattleScript_EffectMirrorMove[]; extern const u8 BattleScript_EffectAttackUp[]; extern const u8 BattleScript_EffectDefenseUp[]; extern const u8 BattleScript_EffectSpeedUp[]; @@ -607,6 +592,8 @@ extern const u8 BattleScript_EffectConversion[]; extern const u8 BattleScript_EffectRestoreHp[]; extern const u8 BattleScript_EffectLightScreen[]; extern const u8 BattleScript_EffectRest[]; +extern const u8 BattleScript_RestIsAlreadyAsleep[]; +extern const u8 BattleScript_InsomniaProtects[]; extern const u8 BattleScript_EffectOHKO[]; extern const u8 BattleScript_EffectHealBlock[]; extern const u8 BattleScript_RecoilIfMiss[]; @@ -633,7 +620,6 @@ extern const u8 BattleScript_EffectTwoTurnsAttack[]; extern const u8 BattleScript_EffectSubstitute[]; extern const u8 BattleScript_EffectRage[]; extern const u8 BattleScript_EffectMimic[]; -extern const u8 BattleScript_EffectMetronome[]; extern const u8 BattleScript_EffectLeechSeed[]; extern const u8 BattleScript_EffectDoNothing[]; extern const u8 BattleScript_EffectHoldHands[]; @@ -647,11 +633,10 @@ extern const u8 BattleScript_EffectSnore[]; extern const u8 BattleScript_EffectConversion2[]; extern const u8 BattleScript_EffectLockOn[]; extern const u8 BattleScript_EffectSketch[]; -extern const u8 BattleScript_EffectSleepTalk[]; extern const u8 BattleScript_EffectDestinyBond[]; extern const u8 BattleScript_EffectSpite[]; extern const u8 BattleScript_EffectHealBell[]; -extern const u8 BattleScript_EffectHealBell_FromHeal[]; +extern const u8 BattleScript_MoveEffectAromatherapy[]; extern const u8 BattleScript_EffectMeanLook[]; extern const u8 BattleScript_EffectNightmare[]; extern const u8 BattleScript_EffectMinimize[]; @@ -689,12 +674,10 @@ extern const u8 BattleScript_EffectBeatUp[]; extern const u8 BattleScript_EffectSemiInvulnerable[]; extern const u8 BattleScript_EffectDefenseCurl[]; extern const u8 BattleScript_EffectSoftboiled[]; -extern const u8 BattleScript_EffectFirstTurnOnly[]; -extern const u8 BattleScript_EffectUproar[]; extern const u8 BattleScript_EffectStockpile[]; extern const u8 BattleScript_EffectSpitUp[]; extern const u8 BattleScript_EffectSwallow[]; -extern const u8 BattleScript_EffectWorrySeed[]; +extern const u8 BattleScript_EffectOverwriteAbility[]; extern const u8 BattleScript_EffectHail[]; extern const u8 BattleScript_EffectTorment[]; extern const u8 BattleScript_EffectFlatter[]; @@ -702,14 +685,12 @@ extern const u8 BattleScript_EffectNonVolatileStatus[]; extern const u8 BattleScript_EffectMemento[]; extern const u8 BattleScript_EffectFocusPunch[]; extern const u8 BattleScript_EffectFollowMe[]; -extern const u8 BattleScript_EffectNaturePower[]; extern const u8 BattleScript_EffectCharge[]; extern const u8 BattleScript_EffectTaunt[]; extern const u8 BattleScript_EffectHelpingHand[]; extern const u8 BattleScript_EffectTrick[]; extern const u8 BattleScript_EffectRolePlay[]; extern const u8 BattleScript_EffectWish[]; -extern const u8 BattleScript_EffectAssist[]; extern const u8 BattleScript_EffectIngrain[]; extern const u8 BattleScript_EffectMagicCoat[]; extern const u8 BattleScript_EffectRecycle[]; @@ -757,8 +738,6 @@ extern const u8 BattleScript_EffectGuardSplit[]; extern const u8 BattleScript_EffectStickyWeb[]; extern const u8 BattleScript_EffectMetalBurst[]; extern const u8 BattleScript_EffectLuckyChant[]; -extern const u8 BattleScript_EffectSuckerPunch[]; -extern const u8 BattleScript_EffectSimpleBeam[]; extern const u8 BattleScript_EffectEntrainment[]; extern const u8 BattleScript_EffectHealPulse[]; extern const u8 BattleScript_EffectQuash[]; @@ -770,14 +749,12 @@ extern const u8 BattleScript_EffectElectricTerrain[]; extern const u8 BattleScript_EffectPsychicTerrain[]; extern const u8 BattleScript_EffectAttackAccUp[]; extern const u8 BattleScript_EffectAttackSpAttackUp[]; -extern const u8 BattleScript_EffectMeFirst[]; extern const u8 BattleScript_EffectQuiverDance[]; extern const u8 BattleScript_EffectCoil[]; extern const u8 BattleScript_EffectElectrify[]; extern const u8 BattleScript_EffectReflectType[]; extern const u8 BattleScript_EffectSoak[]; extern const u8 BattleScript_EffectGrowth[]; -extern const u8 BattleScript_EffectLastResort[]; extern const u8 BattleScript_EffectShellSmash[]; extern const u8 BattleScript_EffectShiftGear[]; extern const u8 BattleScript_EffectDefenseUp3[]; @@ -788,9 +765,8 @@ extern const u8 BattleScript_TryHitSwitchTarget[]; extern const u8 BattleScript_HitSwitchTargetDynamaxed[]; extern const u8 BattleScript_AbilityPreventsPhasingOutRet[]; extern const u8 BattleScript_PrintMonIsRootedRet[]; -extern const u8 BattleScript_EffectFinalGambit[]; +extern const u8 BattleScript_FinalGambit[]; extern const u8 BattleScript_EffectAutotomize[]; -extern const u8 BattleScript_EffectCopycat[]; extern const u8 BattleScript_EffectDefog[]; extern const u8 BattleScript_EffectHitEnemyHealAlly[]; extern const u8 BattleScript_EffectSynchronoise[]; @@ -807,19 +783,16 @@ extern const u8 BattleScript_EffectAcupressure[]; extern const u8 BattleScript_EffectAromaticMist[]; extern const u8 BattleScript_EffectPowder[]; extern const u8 BattleScript_EffectPartingShot[]; -extern const u8 BattleScript_EffectMatBlock[]; extern const u8 BattleScript_EffectInstruct[]; extern const u8 BattleScript_EffectLaserFocus[]; extern const u8 BattleScript_EffectMagneticFlux[]; extern const u8 BattleScript_EffectGearUp[]; extern const u8 BattleScript_EffectStrengthSap[]; extern const u8 BattleScript_EffectPurify[]; -extern const u8 BattleScript_FailIfNotArgType[]; extern const u8 BattleScript_EffectShoreUp[]; extern const u8 BattleScript_EffectGeomancy[]; extern const u8 BattleScript_EffectFairyLock[]; extern const u8 BattleScript_EffectAllySwitch[]; -extern const u8 BattleScript_EffectRelicSong[]; extern const u8 BattleScript_MoveEffectEerieSpell[]; extern const u8 BattleScript_EffectJungleHealing[]; extern const u8 BattleScript_EffectCoaching[]; @@ -832,7 +805,6 @@ extern const u8 BattleScript_MoveEffectLeechSeed[]; extern const u8 BattleScript_MoveEffectHaze[]; extern const u8 BattleScript_MoveEffectIonDeluge[]; extern const u8 BattleScript_EffectHyperspaceFury[]; -extern const u8 BattleScript_EffectAuraWheel[]; extern const u8 BattleScript_EffectNoRetreat[]; extern const u8 BattleScript_EffectTarShot[]; extern const u8 BattleScript_EffectPoltergeist[]; @@ -842,7 +814,6 @@ extern const u8 BattleScript_EffectSkyDrop[]; extern const u8 BattleScript_EffectMeteorBeam[]; extern const u8 BattleScript_EffectCourtChange[]; extern const u8 BattleScript_EffectExtremeEvoboost[]; -extern const u8 BattleScript_EffectHitSetRemoveTerrain[]; extern const u8 BattleScript_EffectDarkVoid[]; extern const u8 BattleScript_EffectVictoryDance[]; extern const u8 BattleScript_EffectTeatime[]; @@ -860,14 +831,18 @@ extern const u8 BattleScript_EffectBrickBreak[]; extern const u8 BattleScript_EffectDoodle[]; extern const u8 BattleScript_EffectFilletAway[]; extern const u8 BattleScript_EffectShedTail[]; -extern const u8 BattleScript_EffectUpperHand[]; extern const u8 BattleScript_EffectTidyUp[]; extern const u8 BattleScript_EffectSpicyExtract[]; -extern const u8 BattleScript_DamageToQuarterTargetHP[]; extern const u8 BattleScript_EffectFickleBeam[]; extern const u8 BattleScript_FickleBeamDoubled[]; extern const u8 BattleScript_QuestionForfeitBattle[]; extern const u8 BattleScript_ForfeitBattleGaveMoney[]; extern const u8 BattleScript_AbilityPopUp[]; +extern const u8 BattleScript_Attackstring[]; +extern const u8 BattleScript_SubmoveAttackstring[]; +extern const u8 BattleScript_MetronomeAttackstring[]; +extern const u8 BattleScript_SleepTalkAttackstring[]; +extern const u8 BattleScript_NaturePowerAttackstring[]; +extern const u8 BattleScript_PokemonCantUseTheMove[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/battle_setup.h b/include/battle_setup.h index 278ca6d9ce2f..689d1636965b 100644 --- a/include/battle_setup.h +++ b/include/battle_setup.h @@ -1,6 +1,7 @@ #ifndef GUARD_BATTLE_SETUP_H #define GUARD_BATTLE_SETUP_H +#include "battle_transition.h" #include "gym_leader_rematch.h" #define REMATCHES_COUNT 5 @@ -60,10 +61,10 @@ void BattleSetup_StartLatiBattle(void); void BattleSetup_StartLegendaryBattle(void); void StartGroudonKyogreBattle(void); void StartRegiBattle(void); -u8 BattleSetup_GetEnvironmentId(void); -u8 GetWildBattleTransition(void); -u8 GetTrainerBattleTransition(void); -u8 GetSpecialBattleTransition(s32 id); +enum BattleEnvironments BattleSetup_GetEnvironmentId(void); +enum BattleTransition GetWildBattleTransition(void); +enum BattleTransition GetTrainerBattleTransition(void); +enum BattleTransition GetSpecialBattleTransition(enum BattleTransitionGroup id); void ChooseStarter(void); void ResetTrainerOpponentIds(void); void SetMapVarsToTrainerA(void); @@ -73,6 +74,7 @@ void ConfigureAndSetUpOneTrainerBattle(u8 trainerObjEventId, const u8 *trainerSc void ConfigureTwoTrainersBattle(u8 trainerObjEventId, const u8 *trainerScript); void SetUpTwoTrainersBattle(void); bool32 GetTrainerFlagFromScriptPointer(const u8 *data); +bool32 GetRematchFromScriptPointer(const u8 *data); void SetTrainerFacingDirection(void); u8 GetTrainerBattleMode(void); bool8 GetTrainerFlag(void); @@ -90,12 +92,14 @@ const u8 *GetTrainerALoseText(void); const u8 *GetTrainerBLoseText(void); const u8 *GetTrainerWonSpeech(void); void UpdateRematchIfDefeated(s32 rematchTableId); +void ClearCurrentTrainerWantRematchVsSeeker(void); void IncrementRematchStepCounter(void); void TryUpdateRandomTrainerRematches(u16 mapGroup, u16 mapNum); bool32 DoesSomeoneWantRematchIn(u16 mapGroup, u16 mapNum); bool32 IsRematchTrainerIn(u16 mapGroup, u16 mapNum); u16 GetLastBeatenRematchTrainerId(u16 trainerId); bool8 ShouldTryRematchBattle(void); +bool8 ShouldTryRematchBattleForTrainerId(u16 trainerId); bool8 IsTrainerReadyForRematch(void); void ShouldTryGetTrainerScript(void); u16 CountBattledRematchTeams(u16 trainerId); diff --git a/include/battle_terastal.h b/include/battle_terastal.h index 6b5c38546346..6bfb74986a9f 100644 --- a/include/battle_terastal.h +++ b/include/battle_terastal.h @@ -4,11 +4,11 @@ void ActivateTera(u32 battler); void ApplyBattlerVisualsForTeraAnim(u32 battler); bool32 CanTerastallize(u32 battler); -u32 GetBattlerTeraType(u32 battler); -void ExpendTypeStellarBoost(u32 battler, u32 type); -bool32 IsTypeStellarBoosted(u32 battler, u32 type); -uq4_12_t GetTeraMultiplier(u32 battler, u32 type); +enum Type GetBattlerTeraType(u32 battler); +void ExpendTypeStellarBoost(u32 battler, enum Type type); +bool32 IsTypeStellarBoosted(u32 battler, enum Type type); +uq4_12_t GetTeraMultiplier(struct DamageContext *ctx); -u16 GetTeraTypeRGB(u32 type); +u16 GetTeraTypeRGB(enum Type type); #endif diff --git a/include/battle_tower.h b/include/battle_tower.h index dc118d0f2172..5887c07d9bc9 100644 --- a/include/battle_tower.h +++ b/include/battle_tower.h @@ -49,7 +49,7 @@ void SetEReaderTrainerGfxId(void); u16 GetBattleFacilityTrainerGfxId(u16 trainerId); void PutNewBattleTowerRecord(struct EmeraldBattleTowerRecord *newRecordEm); u8 GetFrontierTrainerFrontSpriteId(u16 trainerId); -u8 GetFrontierOpponentClass(u16 trainerId); +enum TrainerClassID GetFrontierOpponentClass(u16 trainerId); void GetFrontierTrainerName(u8 *dst, u16 trainerId); void FillFrontierTrainerParty(u8 monsCount); void FillFrontierTrainersParties(u8 monsCount); @@ -60,7 +60,7 @@ void CalcEmeraldBattleTowerChecksum(struct EmeraldBattleTowerRecord *record); void CalcRubyBattleTowerChecksum(struct RSBattleTowerRecord *record); u16 GetCurrentBattleTowerWinStreak(u8 lvlMode, u8 battleMode); u8 GetEreaderTrainerFrontSpriteId(void); -u8 GetEreaderTrainerClassId(void); +enum TrainerClassID GetEreaderTrainerClassId(void); void GetEreaderTrainerName(u8 *dst); void ValidateEReaderTrainer(void); void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *ereaderTrainer); diff --git a/include/battle_transition.h b/include/battle_transition.h index 8bc80dc642ba..fcfe42fde84a 100644 --- a/include/battle_transition.h +++ b/include/battle_transition.h @@ -10,7 +10,8 @@ void GetBg0TilesDst(u16 **tilemap, u16 **tileset); extern const struct SpritePalette gSpritePalette_Pokeball; -enum { +enum MugshotColor +{ MUGSHOT_COLOR_NONE, MUGSHOT_COLOR_PURPLE, MUGSHOT_COLOR_GREEN, @@ -20,7 +21,8 @@ enum { MUGSHOT_COLOR_COUNT }; -enum { +enum BattleTransition +{ B_TRANSITION_BLUR, B_TRANSITION_SWIRL, B_TRANSITION_SHUFFLE, @@ -63,7 +65,8 @@ enum { }; // IDs for GetSpecialBattleTransition -enum { +enum BattleTransitionGroup +{ B_TRANSITION_GROUP_B_TOWER, B_TRANSITION_GROUP_B_DOME = 3, B_TRANSITION_GROUP_B_PALACE, diff --git a/include/battle_util.h b/include/battle_util.h index 2ce91c3f254a..9ebc83795279 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -3,6 +3,7 @@ #include "move.h" #include "constants/battle_string_ids.h" +#include "constants/hold_effects.h" #define MOVE_LIMITATION_ZEROMOVE (1 << 0) #define MOVE_LIMITATION_PP (1 << 1) @@ -23,17 +24,12 @@ #define MOVE_LIMITATION_PLACEHOLDER (1 << 15) #define MOVE_LIMITATIONS_ALL 0xFFFF -enum NonVolatileStatus +// Switches between simulated battle calc and actual battle combat +enum FunctionCallOption { - STATUS_CHECK_TRIGGER, - STATUS_RUN_SCRIPT, -}; - -enum AbilityEffectOptions -{ - ABILITY_CHECK_TRIGGER, - ABILITY_CHECK_TRIGGER_AI, - ABILITY_RUN_SCRIPT, + CHECK_TRIGGER, // Check the function without running scripts / setting any flags. + AI_CHECK, // Check the function without running scripts / setting any flags. Same as CHECK_TRIGGER but only used when additional data has to be fetched during ai calcs + RUN_SCRIPT, // Used during actual combat where a script has to be run / flags need to be set }; enum MoveAbsorbed @@ -44,44 +40,31 @@ enum MoveAbsorbed MOVE_ABSORBED_BY_BOOST_FLASH_FIRE, }; -enum { +enum FieldEffectCases +{ + FIELD_EFFECT_TRAINER_STATUSES, + FIELD_EFFECT_OVERWORLD_TERRAIN, + FIELD_EFFECT_OVERWORLD_WEATHER, +}; + +enum AbilityEffect +{ ABILITYEFFECT_ON_SWITCHIN, ABILITYEFFECT_ENDTURN, ABILITYEFFECT_MOVE_END_ATTACKER, + ABILITYEFFECT_COLOR_CHANGE, // Color Change, Berserk, Anger Shell ABILITYEFFECT_MOVE_END, ABILITYEFFECT_IMMUNITY, ABILITYEFFECT_SYNCHRONIZE, ABILITYEFFECT_ATK_SYNCHRONIZE, ABILITYEFFECT_MOVE_END_OTHER, ABILITYEFFECT_NEUTRALIZINGGAS, - ABILITYEFFECT_FIELD_SPORT, // Only used if B_SPORT_TURNS >= GEN_6 + ABILITYEFFECT_NEUTRALIZINGGAS_FIRST_TURN, ABILITYEFFECT_ON_WEATHER, ABILITYEFFECT_ON_TERRAIN, - ABILITYEFFECT_SWITCH_IN_TERRAIN, - ABILITYEFFECT_SWITCH_IN_WEATHER, ABILITYEFFECT_OPPORTUNIST, - ABILITYEFFECT_SWITCH_IN_STATUSES, -}; - -// Special cases -#define ABILITYEFFECT_MUD_SPORT 252 // Only used if B_SPORT_TURNS >= GEN_6 -#define ABILITYEFFECT_WATER_SPORT 253 // Only used if B_SPORT_TURNS >= GEN_6 - -// For the first argument of ItemBattleEffects, to deteremine which block of item effects to try -enum ItemCaseId -{ - ITEMEFFECT_NONE, - ITEMEFFECT_ON_SWITCH_IN, - ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN, - ITEMEFFECT_NORMAL, - ITEMEFFECT_TRY_HEALING, - ITEMEFFECT_MOVE_END, - ITEMEFFECT_KINGSROCK, - ITEMEFFECT_TARGET, - ITEMEFFECT_ORBS, - ITEMEFFECT_LIFEORB_SHELLBELL, - ITEMEFFECT_USE_LAST_ITEM, // move end effects for just the battler, not whole field - ITEMEFFECT_STATS_CHANGED, // For White Herb and Eject Pack + ABILITYEFFECT_OPPORTUNIST_FIRST_TURN, + ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES, }; enum ItemEffect @@ -108,47 +91,50 @@ enum ItemEffect // for Natural Gift and Fling struct TypePower { - u8 type; + enum Type type; u8 power; u16 effect; }; -enum +enum MoveSuccessOrder { - CANCELLER_FLAGS, - CANCELLER_STANCE_CHANGE_1, - CANCELLER_SKY_DROP, - CANCELLER_RECHARGE, - CANCELLER_ASLEEP, - CANCELLER_FROZEN, - CANCELLER_OBEDIENCE, - CANCELLER_TRUANT, - CANCELLER_FLINCH, - CANCELLER_IN_LOVE, - CANCELLER_DISABLED, - CANCELLER_HEAL_BLOCKED, - CANCELLER_GRAVITY, - CANCELLER_THROAT_CHOP, - CANCELLER_TAUNTED, - CANCELLER_IMPRISONED, - CANCELLER_CONFUSED, - CANCELLER_PARALYSED, - CANCELLER_BIDE, - CANCELLER_THAW, - CANCELLER_STANCE_CHANGE_2, - CANCELLER_WEATHER_PRIMAL, - CANCELLER_DYNAMAX_BLOCKED, - CANCELLER_POWDER_STATUS, - CANCELLER_PROTEAN, - CANCELLER_PSYCHIC_TERRAIN, - CANCELLER_EXPLODING_DAMP, - CANCELLER_MULTIHIT_MOVES, - CANCELLER_Z_MOVES, - CANCELLER_MULTI_TARGET_MOVES, - CANCELLER_END, + CANCELER_STANCE_CHANGE_1, + CANCELER_CLEAR_FLAGS, + CANCELER_SKY_DROP, + CANCELER_RECHARGE, + CANCELER_ASLEEP_OR_FROZEN, + CANCELER_POWER_POINTS, + CANCELER_OBEDIENCE, + CANCELER_TRUANT, + CANCELER_FLINCH, + CANCELER_DISABLED, + CANCELER_VOLATILE_BLOCKED, // Gravity / Heal Block / Throat Chop + CANCELER_TAUNTED, + CANCELER_IMPRISONED, + CANCELER_CONFUSED, + CANCELER_PARALYZED, + CANCELER_INFATUATION, + CANCELER_BIDE, + CANCELER_Z_MOVES, + CANCELER_CHOICE_LOCK, + CANCELER_CALLSUBMOVE, + CANCELER_THAW, + CANCELER_STANCE_CHANGE_2, + CANCELER_ATTACKSTRING, + CANCELER_PPDEDUCTION, + CANCELER_WEATHER_PRIMAL, + CANCELER_MOVE_FAILURE, + CANCELER_POWDER_STATUS, + CANCELER_PRIORITY_BLOCK, + CANCELER_PROTEAN, + CANCELER_EXPLODING_DAMP, + CANCELER_MULTIHIT_MOVES, + CANCELER_MULTI_TARGET_MOVES, + CANCELER_END, }; -enum { +enum Obedience +{ OBEYS, DISOBEYS_LOAFS, DISOBEYS_HITS_SELF, @@ -157,20 +143,48 @@ enum { DISOBEYS_RANDOM_MOVE, }; +enum MoveCanceler +{ + MOVE_STEP_SUCCESS, + MOVE_STEP_BREAK, // Breaks out of the function to run a script + MOVE_STEP_FAILURE, // Same as break but breaks out of it due to move failure and jumps to script that handles the failure + MOVE_STEP_REMOVES_STATUS, +}; + extern const struct TypePower gNaturalGiftTable[]; -struct DamageCalculationData +struct DamageContext { u32 battlerAtk:3; u32 battlerDef:3; u32 move:16; - u32 moveType:5; + enum Type moveType:5; u32 isCrit:1; u32 randomFactor:1; u32 updateFlags:1; - u32 padding:2; + u32 isAnticipation:1; + u32 isSelfInflicted:1; + u32 weather:16; + u32 fixedBasePower:8; + u32 padding2:8; + u32 chosenMove:16; // May be different to 'move', e.g. for Z moves. + u32 padding3:16; + uq4_12_t typeEffectivenessModifier; + enum Ability abilityAtk; + enum Ability abilityDef; + enum HoldEffect holdEffectAtk; + enum HoldEffect holdEffectDef; +}; + +struct BattleContext +{ + u32 battlerAtk:3; + u32 battlerDef:3; + u32 currentMove:16; + u32 padding:10; + enum Ability abilities[MAX_BATTLERS_COUNT]; + enum HoldEffect holdEffects[MAX_BATTLERS_COUNT]; }; -STATIC_ASSERT(sizeof(struct DamageCalculationData) <= 4, StructExceedsFourBytes); enum SleepClauseBlock { @@ -181,7 +195,7 @@ enum SleepClauseBlock enum SkyDropState { SKY_DROP_IGNORE, - SKY_DROP_ATTACKCANCELLER_CHECK, + SKY_DROP_ATTACKCANCELER_CHECK, SKY_DROP_GRAVITY_ON_AIRBORNE, SKY_DROP_CANCEL_MULTI_TURN_MOVES, SKY_DROP_STATUS_YAWN, @@ -191,9 +205,17 @@ enum SkyDropState #define SKY_DROP_NO_TARGET 0xFF #define SKY_DROP_RELEASED_TARGET 0xFE +enum EjectPackTiming +{ + FIRST_TURN, + END_TURN, + OTHER, +}; + void HandleAction_ThrowBall(void); u32 GetCurrentBattleWeather(void); bool32 EndOrContinueWeather(void); +bool32 IsUnnerveBlocked(u32 battler, u32 itemId); bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move); bool32 HandleMoveTargetRedirection(void); void HandleAction_UseMove(void); @@ -216,70 +238,78 @@ void MarkBattlerForControllerExec(u32 battler); void MarkBattlerReceivedLinkData(u32 battler); const u8 *CancelMultiTurnMoves(u32 battler, enum SkyDropState skyDropState); bool32 WasUnableToUseMove(u32 battler); +bool32 IsLastMonToMove(u32 battler); +bool32 ShouldDefiantCompetitiveActivate(u32 battler, enum Ability ability); void PrepareStringBattle(enum StringID stringId, u32 battler); void ResetSentPokesToOpponentValue(void); void OpponentSwitchInResetSentPokesToOpponentValue(u32 battler); void UpdateSentPokesToOpponentValue(u32 battler); void BattleScriptPush(const u8 *bsPtr); void BattleScriptPushCursor(void); +void BattleScriptCall(const u8 *bsPtr); void BattleScriptPop(void); u32 TrySetCantSelectMoveBattleScript(u32 battler); -u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check); +u32 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check); bool32 AreAllMovesUnusable(u32 battler); u8 GetImprisonedMovesCount(u32 battler, u16 move); s32 GetDrainedBigRootHp(u32 battler, s32 hp); -bool32 IsMagicGuardProtected(u32 battler, u32 ability); +bool32 IsAbilityAndRecord(u32 battler, enum Ability battlerAbility, enum Ability abilityToCheck); u32 DoEndTurnEffects(void); bool32 HandleFaintedMonActions(void); void TryClearRageAndFuryCutter(void); -u32 AtkCanceller_MoveSuccessOrder(void); -void SetAtkCancellerForCalledMove(void); +enum MoveCanceler AtkCanceler_MoveSuccessOrder(struct BattleContext *ctx); bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2); -bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, bool32 viaAbility); -bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, u32 move, enum AbilityEffectOptions option); -bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 move, u32 moveType, enum AbilityEffectOptions option); -u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 moveArg); +bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, u32 ability); +bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag); +bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, u32 move, enum FunctionCallOption option); +bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef, u32 move, enum Type moveType, enum FunctionCallOption option); +bool32 TryFieldEffects(enum FieldEffectCases caseId); +u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ability, u32 special, u32 moveArg); bool32 TryPrimalReversion(u32 battler); bool32 IsNeutralizingGasOnField(void); -bool32 IsMoldBreakerTypeAbility(u32 battler, u32 ability); -u32 GetBattlerAbility(u32 battler); -u32 IsAbilityOnSide(u32 battler, u32 ability); -u32 IsAbilityOnOpposingSide(u32 battler, u32 ability); -u32 IsAbilityOnField(u32 ability); -u32 IsAbilityOnFieldExcept(u32 battler, u32 ability); +bool32 IsMoldBreakerTypeAbility(u32 battler, enum Ability ability); +u32 GetBattlerAbilityIgnoreMoldBreaker(u32 battler); +u32 GetBattlerAbilityNoAbilityShield(u32 battler); +u32 GetBattlerAbilityInternal(u32 battler, u32 ignoreMoldBreaker, u32 noAbilityShield); +enum Ability GetBattlerAbility(u32 battler); +u32 IsAbilityOnSide(u32 battler, enum Ability ability); +u32 IsAbilityOnOpposingSide(u32 battler, enum Ability ability); +u32 IsAbilityOnField(enum Ability ability); +u32 IsAbilityOnFieldExcept(u32 battler, enum Ability ability); u32 IsAbilityPreventingEscape(u32 battler); bool32 IsBattlerProtected(u32 battlerAtk, u32 battlerDef, u32 move); u32 GetProtectType(enum ProtectMethod method); bool32 CanBattlerEscape(u32 battler); // no ability check void BattleScriptExecute(const u8 *BS_ptr); void BattleScriptPushCursorAndCallback(const u8 *BS_ptr); -u32 ItemBattleEffects(enum ItemCaseId, u32 battler, bool32 moveTurn); void ClearVariousBattlerFlags(u32 battler); void HandleAction_RunBattleScript(void); u32 SetRandomTarget(u32 battler); u32 GetBattleMoveTarget(u16 move, u8 setTarget); u8 GetAttackerObedienceForAction(); -enum ItemHoldEffect GetBattlerHoldEffect(u32 battler, bool32 checkNegating); -enum ItemHoldEffect GetBattlerHoldEffectIgnoreAbility(u32 battler, bool32 checkNegating); -enum ItemHoldEffect GetBattlerHoldEffectInternal(u32 battler, bool32 checkNegating, bool32 checkAbility); +enum HoldEffect GetBattlerHoldEffect(u32 battler); +enum HoldEffect GetBattlerHoldEffectIgnoreAbility(u32 battler); +enum HoldEffect GetBattlerHoldEffectIgnoreNegation(u32 battler); +enum HoldEffect GetBattlerHoldEffectInternal(u32 battler, u32 ability); u32 GetBattlerHoldEffectParam(u32 battler); -bool32 IsMoveMakingContact(u32 move, u32 battlerAtk); -bool32 IsBattlerGrounded(u32 battler); +bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum HoldEffect holdEffectAtk, u32 move); +bool32 IsMoveMakingContact(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum HoldEffect holdEffectAtk, u32 move); +bool32 IsBattlerGrounded(u32 battler, enum Ability ability, enum HoldEffect holdEffect); u32 GetMoveSlot(u16 *moves, u32 move); u32 GetBattlerWeight(u32 battler); u32 CalcRolloutBasePower(u32 battlerAtk, u32 basePower, u32 rolloutTimer); u32 CalcFuryCutterBasePower(u32 basePower, u32 furyCutterCounter); -s32 CalculateMoveDamage(struct DamageCalculationData *damageCalcData, u32 fixedBasePower); -s32 CalculateMoveDamageVars(struct DamageCalculationData *damageCalcData, u32 fixedBasePower, uq4_12_t typeEffectivenessModifier, - u32 weather, enum ItemHoldEffect holdEffectAtk, enum ItemHoldEffect holdEffectDef, u32 abilityAtk, u32 abilityDef); -s32 ApplyModifiersAfterDmgRoll(s32 dmg, struct DamageCalculationData *damageCalcData, uq4_12_t typeEffectivenessModifier, u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk, enum ItemHoldEffect holdEffectDef); -uq4_12_t CalcTypeEffectivenessMultiplier(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, u32 defAbility, bool32 recordAbilities); -uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef); -uq4_12_t GetTypeModifier(u32 atkType, u32 defType); -uq4_12_t GetOverworldTypeEffectiveness(struct Pokemon *mon, u8 moveType); +s32 CalculateMoveDamage(struct DamageContext *ctx); +s32 CalculateMoveDamageVars(struct DamageContext *ctx); +s32 DoFixedDamageMoveCalc(struct DamageContext *ctx); +s32 ApplyModifiersAfterDmgRoll(struct DamageContext *ctx, s32 dmg); +uq4_12_t CalcTypeEffectivenessMultiplier(struct DamageContext *ctx); +uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, enum Ability abilityDef); +uq4_12_t GetTypeModifier(enum Type atkType, enum Type defType); +uq4_12_t GetOverworldTypeEffectiveness(struct Pokemon *mon, enum Type moveType); void UpdateMoveResultFlags(uq4_12_t modifier, u16 *resultFlags); s32 GetStealthHazardDamage(enum TypeSideHazard hazardType, u32 battler); -s32 GetStealthHazardDamageByTypesAndHP(enum TypeSideHazard hazardType, u8 type1, u8 type2, u32 maxHp); +s32 GetStealthHazardDamageByTypesAndHP(enum TypeSideHazard hazardType, enum Type type1, enum Type type2, u32 maxHp); bool32 CanMegaEvolve(u32 battler); bool32 CanUltraBurst(u32 battler); void ActivateMegaEvolution(u32 battler); @@ -288,41 +318,40 @@ bool32 IsBattlerMegaEvolved(u32 battler); bool32 IsBattlerPrimalReverted(u32 battler); bool32 IsBattlerUltraBursted(u32 battler); u16 GetBattleFormChangeTargetSpecies(u32 battler, enum FormChanges method); +bool32 TryRevertPartyMonFormChange(u32 partyIndex); bool32 TryBattleFormChange(u32 battler, enum FormChanges method); bool32 DoBattlersShareType(u32 battler1, u32 battler2); bool32 CanBattlerGetOrLoseItem(u32 battler, u16 itemId); u32 GetBattlerVisualSpecies(u32 battler); -bool32 TryClearIllusion(u32 battler, u32 caseID); +bool32 TryClearIllusion(u32 battler, enum AbilityEffect caseID); u32 GetIllusionMonSpecies(u32 battler); struct Pokemon *GetIllusionMonPtr(u32 battler); void ClearIllusionMon(u32 battler); -u32 GetIllusionMonPartyId(struct Pokemon *party, struct Pokemon *mon, struct Pokemon *partnerMon); +u32 GetIllusionMonPartyId(struct Pokemon *party, struct Pokemon *mon, struct Pokemon *partnerMon, u32 battler); bool32 SetIllusionMon(struct Pokemon *mon, u32 battler); +u32 TryImmunityAbilityHealStatus(u32 battler, enum AbilityEffect caseID); bool32 ShouldGetStatBadgeBoost(u16 flagId, u32 battler); -u32 GetBattleMoveCategory(u32 move); +uq4_12_t GetBadgeBoostModifier(void); +enum DamageCategory GetBattleMoveCategory(u32 move); void SetDynamicMoveCategory(u32 battlerAtk, u32 battlerDef, u32 move); bool32 CanFling(u32 battler); bool32 IsTelekinesisBannedSpecies(u16 species); bool32 IsHealBlockPreventingMove(u32 battler, u32 move); bool32 IsBelchPreventingMove(u32 battler, u32 move); -bool32 HasEnoughHpToEatBerry(u32 battler, u32 hpFraction, u32 itemId); +bool32 HasEnoughHpToEatBerry(u32 battler, enum Ability ability, u32 hpFraction, u32 itemId); bool32 IsPartnerMonFromSameTrainer(u32 battler); -u8 GetCategoryBasedOnStats(u32 battler); +enum DamageCategory GetCategoryBasedOnStats(u32 battler); void SetShellSideArmCategory(void); bool32 MoveIsAffectedBySheerForce(u32 move); -bool32 TestIfSheerForceAffected(u32 battler, u16 move); +bool32 IsSheerForceAffected(u16 move, enum Ability ability); void TryRestoreHeldItems(void); bool32 CanStealItem(u32 battlerStealing, u32 battlerItem, u16 item); void TrySaveExchangedItem(u32 battler, u16 stolenItem); bool32 IsPartnerMonFromSameTrainer(u32 battler); -enum ItemEffect TryHandleSeed(u32 battler, u32 terrainFlag, u32 statId, u32 itemId, enum ItemCaseId caseID); bool32 IsBattlerAffectedByHazards(u32 battler, bool32 toxicSpikes); void SortBattlersBySpeed(u8 *battlers, bool32 slowToFast); -bool32 CompareStat(u32 battler, u8 statId, u8 cmpTo, u8 cmpKind); -bool32 TryRoomService(u32 battler); -void BufferStatChange(u32 battler, u8 statId, enum StringID stringId); +bool32 CompareStat(u32 battler, enum Stat statId, u8 cmpTo, u8 cmpKind, enum Ability ability); bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 checkTarget); -u16 GetUsedHeldItem(u32 battler); bool32 PickupHasValidTarget(u32 battler); bool32 CantPickupItem(u32 battler); bool32 IsBattlerWeatherAffected(u32 battler, u32 weatherFlags); @@ -341,48 +370,74 @@ bool32 CanTargetPartner(u32 battlerAtk, u32 battlerDef); bool32 TargetFullyImmuneToCurrMove(u32 battlerAtk, u32 battlerDef); bool32 MoodyCantRaiseStat(u32 stat); bool32 MoodyCantLowerStat(u32 stat); +bool32 IsBattlerTerrainAffected(u32 battler, enum Ability ability, enum HoldEffect holdEffect, u32 terrainFlag); +u32 GetHighestStatId(u32 battler); +u32 GetParadoxHighestStatId(u32 battler); +u32 GetParadoxBoostedStatId(u32 battler); -bool32 CanBeSlept(u32 battlerAtk, u32 battlerDef, u32 abilityDef, enum SleepClauseBlock isBlockedBySleepClause); -bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef); -bool32 CanBeBurned(u32 battlerAtk, u32 battlerDef, u32 ability); -bool32 CanBeParalyzed(u32 battlerAtk, u32 battlerDef, u32 abilityDef); -bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, u32 abilityDef); -bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef); -bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, enum MoveEffects secondaryMoveEffect, enum NonVolatileStatus option); +bool32 CanBeSlept(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef, enum SleepClauseBlock isBlockedBySleepClause); +bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef); +bool32 CanBeBurned(u32 battlerAtk, u32 battlerDef, enum Ability ability); +bool32 CanBeParalyzed(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef); +bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef); +bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef); +bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, enum MoveEffect secondaryMoveEffect, enum FunctionCallOption option); bool32 CanBeConfused(u32 battler); -bool32 IsBattlerTerrainAffected(u32 battler, u32 terrainFlag); u32 GetBattlerAffectionHearts(u32 battler); void TryToRevertMimicryAndFlags(void); bool32 BattleArenaTurnEnd(void); u32 CountBattlerStatIncreases(u32 battler, bool32 countEvasionAcc); +bool32 BattlerHasCopyableChanges(u32 battler); bool32 ChangeTypeBasedOnTerrain(u32 battler); void RemoveConfusionStatus(u32 battler); u8 GetBattlerGender(u32 battler); bool32 AreBattlersOfOppositeGender(u32 battler1, u32 battler2); bool32 AreBattlersOfSameGender(u32 battler1, u32 battler2); -u32 CalcSecondaryEffectChance(u32 battler, u32 battlerAbility, const struct AdditionalEffect *additionalEffect); -bool32 MoveEffectIsGuaranteed(u32 battler, u32 battlerAbility, const struct AdditionalEffect *additionalEffect); -void GetBattlerTypes(u32 battler, bool32 ignoreTera, u32 types[static 3]); -u32 GetBattlerType(u32 battler, u32 typeIndex, bool32 ignoreTera); +u32 CalcSecondaryEffectChance(u32 battler, enum Ability battlerAbility, const struct AdditionalEffect *additionalEffect); +bool32 MoveEffectIsGuaranteed(u32 battler, enum Ability battlerAbility, const struct AdditionalEffect *additionalEffect); +void GetBattlerTypes(u32 battler, bool32 ignoreTera, enum Type types[static 3]); +enum Type GetBattlerType(u32 battler, u32 typeIndex, bool32 ignoreTera); bool8 CanMonParticipateInSkyBattle(struct Pokemon *mon); bool8 IsMonBannedFromSkyBattles(u16 species); -void RemoveBattlerType(u32 battler, u8 type); -u32 GetBattleMoveType(u32 move); +void RemoveBattlerType(u32 battler, enum Type type); +enum Type GetBattleMoveType(u32 move); void TryActivateSleepClause(u32 battler, u32 indexInParty); void TryDeactivateSleepClause(u32 battlerSide, u32 indexInParty); bool32 IsSleepClauseActiveForSide(u32 battlerSide); bool32 IsSleepClauseEnabled(); void ClearDamageCalcResults(void); u32 DoesDestinyBondFail(u32 battler); -bool32 IsMoveEffectBlockedByTarget(u32 ability); +bool32 IsMoveEffectBlockedByTarget(enum Ability ability); bool32 IsPursuitTargetSet(void); void ClearPursuitValuesIfSet(u32 battler); void ClearPursuitValues(void); bool32 HasWeatherEffect(void); -u32 RestoreWhiteHerbStats(u32 battler); bool32 IsFutureSightAttackerInParty(u32 battlerAtk, u32 battlerDef, u32 move); bool32 HadMoreThanHalfHpNowDoesnt(u32 battler); +void ChooseStatBoostAnimation(u32 battler); void UpdateStallMons(void); -bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId); +bool32 TrySwitchInEjectPack(enum EjectPackTiming timing); +u32 GetBattlerVolatile(u32 battler, enum Volatile _volatile); +void SetMonVolatile(u32 battler, enum Volatile _volatile, u32 newValue); +bool32 ItemHealMonVolatile(u32 battler, u16 itemId); +void PushHazardTypeToQueue(u32 side, enum Hazards hazardType); +bool32 IsHazardOnSide(u32 side, enum Hazards hazardType); +bool32 AreAnyHazardsOnSide(u32 side); +void RemoveAllHazardsFromField(u32 side); +bool32 IsHazardOnSideAndClear(u32 side, enum Hazards hazardType); +void RemoveHazardFromField(u32 side, enum Hazards hazardType); +bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, u32 move, enum FunctionCallOption option); +u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability atkAbility, enum Ability defAbility, enum HoldEffect atkHoldEffect, enum HoldEffect defHoldEffect); +bool32 IsSemiInvulnerable(u32 battler, enum SemiInvulnerableExclusion excludeCommander); +bool32 BreaksThroughSemiInvulnerablity(u32 battler, u32 move); +bool32 HasPartnerTrainer(u32 battler); +bool32 IsAffectedByPowderMove(u32 battler, u32 ability, enum HoldEffect holdEffect); +u32 GetNaturePowerMove(u32 battler); +u32 GetNaturePowerMove(u32 battler); +void RemoveAbilityFlags(u32 battler); +bool32 IsDazzlingAbility(enum Ability ability); +bool32 IsAllowedToUseBag(void); +bool32 IsAnyTargetTurnDamaged(u32 battlerAtk); +bool32 IsMimikyuDisguised(u32 battler); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/config/ai.h b/include/config/ai.h index db98f72ee91c..5a7ce4078312 100644 --- a/include/config/ai.h +++ b/include/config/ai.h @@ -13,8 +13,9 @@ // AI smart switching chances; if you want more complex behaviour, modify GetSwitchChance #define SHOULD_SWITCH_ABSORBS_MOVE_PERCENTAGE 100 +#define SHOULD_SWITCH_ABSORBS_HIDDEN_POWER_PERCENTAGE 50 #define SHOULD_SWITCH_TRAPPER_PERCENTAGE 100 -#define SHOULD_SWITCH_FREE_TURN_PERCENTAGE 100 +#define SHOULD_SWITCH_FREE_TURN_PERCENTAGE 50 #define STAY_IN_ABSORBING_PERCENTAGE 66 // Chance to stay in if outgoing mon has super effective move against player, will prevent switching out for an absorber with this likelihood #define SHOULD_SWITCH_HASBADODDS_PERCENTAGE 50 #define SHOULD_SWITCH_ENCORE_STATUS_PERCENTAGE 100 @@ -51,10 +52,16 @@ #define AI_GOOD_SCORE_THRESHOLD 100 // Move scores above this threshold are considered "good" when deciding switching // AI held item-based move scoring -#define LOW_ACCURACY_THRESHOLD 75 // Moves with accuracy equal OR below this value are considered low accuracy +#define LOW_ACCURACY_THRESHOLD 75 // Moves with accuracy equal OR below this value are considered low accuracy // AI move scoring #define STATUS_MOVE_FOCUS_PUNCH_CHANCE 50 // Chance the AI will use a status move if the player's best move is Focus Punch +#define BOOST_INTO_HAZE_CHANCE 0 // Chance the AI will use a stat boosting move if the player has used Haze +#define SHOULD_RECOVER_CHANCE 50 // Chance the AI will give recovery moves score increase if less than ENABLE_RECOVERY_THRESHOLD and in no immediate danger +#define ENABLE_RECOVERY_THRESHOLD 60 // HP percentage beneath which SHOULD_RECOVER_CHANCE is active +#define SUCKER_PUNCH_CHANCE 50 // Chance for the AI to not use Sucker Punch if the player has a status move +#define SUCKER_PUNCH_PREDICTION_CHANCE 50 // Additional chance for the AI to not use Sucker Punch if actively predicting a status move if SUCKER_PUNCH_CHANCE fails +#define PRIORITIZE_LAST_CHANCE_CHANCE 50 // Chance the AI will prioritize Last Chance (priority move in the face of being outsped and KO'd) over Slow KO // AI damage calc considerations #define RISKY_AI_CRIT_STAGE_THRESHOLD 2 // Stat stages at which Risky will assume it gets a crit @@ -64,14 +71,48 @@ #define PREDICT_SWITCH_CHANCE 50 #define PREDICT_MOVE_CHANCE 100 -// AI PP Stall detection chance per roll -#define PP_STALL_DISREGARD_MOVE_PERCENTAGE 50 -// Score reduction if any roll for PP stall detection passes -#define PP_STALL_SCORE_REDUCTION 20 +// AI Terastalization chances +#define AI_CONSERVE_TERA_CHANCE_PER_MON 10 // Chance for AI with smart tera flag to decide not to tera before considering defensive benefit is this*(X-1), where X is the number of alive pokemon that could tera +#define AI_TERA_PREDICT_CHANCE 40 // Chance for AI with smart tera flag to tera in the situation where tera would save it from a KO, but could be punished by a KO from a different move. -// AI's acceptable number of hits to KO the partner via friendly fire in a double battle. -#define FRIENDLY_FIRE_RISKY_THRESHOLD 2 -#define FRIENDLY_FIRE_NORMAL_THRESHOLD 3 -#define FRIENDLY_FIRE_CONSERVATIVE_THRESHOLD 4 +// AI_FLAG_PP_STALL_PREVENTION settings +#define PP_STALL_DISREGARD_MOVE_PERCENTAGE 50 // Detection chance per roll +#define PP_STALL_SCORE_REDUCTION 20 // Score reduction if any roll for PP stall detection passes + +// AI_FLAG_ASSUME_STAB settings +#define ASSUME_STAB_SEES_ABILITY FALSE // Flag also gives omniscience for player's ability. Can use AI_FLAG_WEIGH_ABILITY_PREDICTION instead for smarter prediction without omniscience. + +// AI_FLAG_ASSUME_STATUS_MOVES settings +#define ASSUME_STATUS_MOVES_HAS_TUNING TRUE // Flag has varying rates for different kinds of status move. + // Setting to false also means it will not alert on Fake Out or Super Fang. +#define ASSUME_STATUS_HIGH_ODDS 90 // Chance for AI to see extremely likely moves for a pokemon to have, like Spore +#define ASSUME_STATUS_MEDIUM_ODDS 70 // Chance for AI to see moderately likely moves for a pokemon to have, like Protect +#define ASSUME_STATUS_LOW_ODDS 40 // Chance for AI to see niche moves a pokemon may have but probably won't, like Entrainment +#define ASSUME_ALL_STATUS_ODDS 25 // Chance for the AI to see any kind of status move. + +// AI_FLAG_SMART_SWITCHING settings +#define SMART_SWITCHING_OMNISCIENT FALSE // AI will use omniscience for switching calcs, regardless of omniscience setting otherwise + +// Configurations specifically for AI_FLAG_DOUBLE_BATTLE. +#define FRIENDLY_FIRE_RISKY_THRESHOLD 2 // AI_FLAG_RISKY acceptable number of hits to KO the partner via friendly fire +#define FRIENDLY_FIRE_NORMAL_THRESHOLD 3 // typical acceptable number of hits to KO the partner via friendly fire +#define FRIENDLY_FIRE_CONSERVATIVE_THRESHOLD 4 // AI_FLAG_CONSERVATIVE acceptable number of hits to KO the partner via friendly fire +// Counterplay on the assumption of opponents Protecting. +#define DOUBLE_TRICK_ROOM_ON_LAST_TURN_CHANCE 35 // both pokemon use Trick Room on turn Trick Room expires in the hopes both opponents used Protect to stall, getting a free refresh on the timer +#define TAILWIND_IN_TRICK_ROOM_CHANCE 35 // use Tailwind on turn Trick Room expires in the hopes both opponents used Protect to stall + +#define AI_FLAG_ATTACKS_PARTNER_FOCUSES_PARTNER FALSE // if TRUE, AI_FLAG_ATTACKS_PARTNER prefers attacking the partner over the ally. + // This is treated as true regardless during wild battles with AI. + +// AI's desired stat changes for Guard Split and Power Split, treated as % +#define GUARD_SPLIT_ALLY_PERCENTAGE 200 +#define GUARD_SPLIT_ENEMY_PERCENTAGE 50 +#define POWER_SPLIT_ALLY_PERCENTAGE 150 +#define POWER_SPLIT_ENEMY_PERCENTAGE 50 + +// HP thresholds to use a status z-move. +#define Z_EFFECT_FOLLOW_ME_THRESHOLD 30 +#define Z_EFFECT_RESTORE_HP_LOWER_THRESHOLD ENABLE_RECOVERY_THRESHOLD // threshold used for moves you could conceivably use more than once +#define Z_EFFECT_RESTORE_HP_HIGHER_THRESHOLD 90 // these moves are one-time use or drop your HP #endif // GUARD_CONFIG_AI_H diff --git a/include/config/battle.h b/include/config/battle.h index f4a14f4df461..dd72cdbf1b3f 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -19,7 +19,7 @@ #define B_LEVEL_UP_NOTIFICATION GEN_LATEST // In Gen9+, if the PokΓ©mon gets enough experience to level up multiple times, the message is only displayed once. // Stat settings -#define B_BADGE_BOOST GEN_LATEST // In Gen4+, Gym Badges no longer boost a PokΓ©mon's stats. +#define B_BADGE_BOOST GEN_LATEST // In Gen4+, Gym Badges no longer boost a PokΓ©mon's stats. (Gen2 does not include the additional boost to the type matching the gym the badge is from) #define B_FRIENDSHIP_BOOST FALSE // In LGPE only, all stats except HP are boosted up to 10% based on Friendship. Unlike B_BADGE_BOOST, these boosts are accounted when calculating base stats. #define B_MAX_LEVEL_EV_GAINS GEN_LATEST // In Gen5+, Lv100 PokΓ©mon can obtain Effort Values normally. #define B_RECALCULATE_STATS GEN_LATEST // In Gen5+, the stats of the PokΓ©mon who participate in battle are recalculated at the end of each battle. @@ -28,7 +28,7 @@ #define B_BURN_DAMAGE GEN_LATEST // In Gen7+, burn damage is 1/16th of max HP instead of 1/8th. Also applies to Frostbite. #define B_BURN_FACADE_DMG GEN_LATEST // In Gen6+, burn's effect of lowering the Attack stat no longer applies to Facade. #define B_BINDING_DAMAGE GEN_LATEST // In Gen6+, binding damage is 1/8 of max HP instead of 1/16. (With Binding Band, 1/6 and 1/8 respectively.) -#define B_PSYWAVE_DMG GEN_LATEST // Psywave's damage formula. See Cmd_psywavedamageeffect. +#define B_PSYWAVE_DMG GEN_LATEST // Psywave's damage formula. See DoFixedDamageMoveCalc for details. #define B_PAYBACK_SWITCH_BOOST GEN_LATEST // In Gen5+, if the opponent switches out, Payback's damage will no longer be doubled. #define B_HIDDEN_POWER_DMG GEN_LATEST // In Gen6+, Hidden Power's base power was set to always be 60. Before, it was determined by the mon's IVs. #define B_ROUGH_SKIN_DMG GEN_LATEST // In Gen4+, Rough Skin contact damage is 1/8th of max HP instead of 1/16th. This will also affect Iron Barbs. @@ -111,7 +111,7 @@ #define B_BURN_HIT_THAW GEN_LATEST // In Gen6+, damaging moves with a chance of burn will thaw the target, regardless if they're fire-type moves or not. #define B_HEALING_WISH_SWITCH GEN_LATEST // In Gen5+, the mon receiving Healing Wish is sent out at the end of the turn. // Additionally, in gen8+ the Healing Wish's effect will be stored until the user switches into a statused or hurt mon. -#define B_DEFOG_EFFECT_CLEARING GEN_LATEST // In Gen6+, Defog clears Spikes, Toxic Spikes, Stealth Rock and Sticky Web from both sides. In Gen8+, Defog also clears active Terrain. +#define B_DEFOG_EFFECT_CLEARING GEN_LATEST // In Gen5+, Defog does not lower Evasion of target behind Subsitute. In Gen6+, Defog clears Spikes, Toxic Spikes, Stealth Rock and Sticky Web from both sides. In Gen8+, Defog also clears active Terrain. #define B_STOCKPILE_RAISES_DEFS GEN_LATEST // In Gen4+, Stockpile also raises Defense and Sp. Defense stats. Once Spit Up / Swallow is used, these stat changes are lost. #define B_TRANSFORM_SHINY GEN_LATEST // In Gen4+, Transform will copy the shiny state of the opponent instead of maintaining its own shiny state. #define B_TRANSFORM_FORM_CHANGES GEN_LATEST // In Gen5+, Transformed Pokemon cannot change forms. @@ -129,6 +129,11 @@ #define B_DESTINY_BOND_FAIL GEN_LATEST // In Gen7+, Destiny Bond fails if used repeatedly. #define B_PURSUIT_TARGET GEN_LATEST // In Gen4+, Pursuit attacks a switching opponent even if they weren't targeting them. Before Gen4, Pursuit only attacks a switching opponent that it originally targeted. #define B_SKIP_RECHARGE GEN_LATEST // In Gen1, recharging moves such as Hyper Beam skip the recharge if the target gets KO'd +#define B_ENCORE_TARGET GEN_LATEST // In Gen5+, encored moves are allowed to choose a target +#define B_TIME_OF_DAY_HEALING_MOVES GEN_LATEST // In Gen2, Morning Sun, Moonlight, and Synthesis heal twice as much HP based off the time of day. Also changes how much they heal. Evening affects Moonlight. + // If OW_TIMES_OF_DAY is set to Gen 3, then Morning Sun is boosted during the day. +#define B_DREAM_EATER_LIQUID_OOZE GEN_LATEST // In Gen5+, Dream Eater is affected by Liquid Ooze. +#define B_DREAM_EATER_SUBSTITUTE GEN_LATEST // In Gen5+, Dream Eater can successfully hit and drain from a Substitute. // Ability settings #define B_GALE_WINGS GEN_LATEST // In Gen7+ requires full HP to trigger. @@ -161,10 +166,10 @@ #define B_MAGIC_GUARD GEN_LATEST // In Gen4 only, Magic Guard ignores immobilization caused by paralysis #define B_BATTLE_BOND GEN_LATEST // In Gen9+, Battle Bond increases Atk, SpAtk and Speed by one stage, once per battle #define B_ATE_MULTIPLIER GEN_LATEST // In Gen7+, -ate abilities (Aerilate, Galvanize, Normalize, Pixilate, Refrigerate) multiply damage by 1.2. Otherwise, it's 1.3, except Normalize which has no multiplier. +#define B_DEFIANT_STICKY_WEB GEN_LATEST // In Gen9+, Defiant activates on Sticky Web regardless of who set it up. In Gen8, Defiant does not activate on Sticky Web set up by an ally after Court Change swaps its side. +#define B_POWDER_OVERCOAT GEN_LATEST // In Gen6+, Overcoat blocks powder and spore moves from affecting the user. // Item settings -#define B_HP_BERRIES GEN_LATEST // In Gen4+, berries which restore HP activate immediately after HP drops to half. In Gen3, the effect occurs at the end of the turn. -#define B_BERRIES_INSTANT GEN_LATEST // In Gen4+, most berries activate on battle start/switch-in if applicable. In Gen3, they only activate either at the move end or turn end. #define B_CONFUSE_BERRIES_HEAL GEN_LATEST // Before Gen7, Figy and similar berries restore 1/8th of HP and trigger at half HP. In Gen7 they restore half HP, triggering at 25% HP. In Gen8 they heal 1/3rd of HP. #define B_X_ITEMS_BUFF GEN_LATEST // In Gen7+, the X Items raise a stat by 2 stages instead of 1. #define B_MENTAL_HERB GEN_LATEST // In Gen5+, the Mental Herb cures Taunt, Encore, Torment, Heal Block, and Disable in addition to Infatuation from before. @@ -203,7 +208,6 @@ #define B_FLAG_INVERSE_BATTLE 0 // If this flag is set, the battle's type effectiveness are inversed. For example, fire is super effective against water. #define B_FLAG_FORCE_DOUBLE_WILD 0 // If this flag is set, all land and surfing wild battles will be double battles. #define B_SMART_WILD_AI_FLAG 0 // If this flag is set, wild PokΓ©mon will become smart, with all AI flags enabled. -#define B_FLAG_NO_BAG_USE 0 // If this flag is set, the ability to use the bag in battle is disabled. #define B_FLAG_NO_CATCHING 0 // If this flag is set, the ability to catch wild PokΓ©mon is disabled. #define B_FLAG_NO_RUNNING 0 // If this flag is set, the ability to escape from wild battles is disabled. Also makes Roar/Whirlwind and Teleport (under Gen8) fail. #define B_FLAG_AI_VS_AI_BATTLE 0 // If this flag is set, the player's mons will be controlled by the ai next battles. @@ -225,6 +229,13 @@ #define B_VAR_DIFFICULTY 0 // If not 0, you can use this var to control which difficulty version of a Trainer is loaded. This should be manually set by the developer using Script_SetDifficulty AFTER NewGameInitData has run. +// No bag settings +#define NO_BAG_RESTRICTION 0 +#define NO_BAG_AGAINST_TRAINER 1 +#define NO_BAG_IN_BATTLE 2 + +#define B_VAR_NO_BAG_USE 0 // If 1, the ability to use the bag in battle is disabled in trainer battles. If 2, it is also disabled in wild battles. + // Sky Battles #define B_FLAG_SKY_BATTLE 0 // If this flag has a value, the player will be able to engage in scripted Sky Battles. #define B_VAR_SKY_BATTLE 0 // If this var has a value, the game will remember the positions of PokΓ©mon used in Sky Battles. @@ -258,32 +269,33 @@ #define B_TERRAIN_TYPE_BOOST GEN_LATEST // In Gen8, damage is boosted by 30% instead of 50%. #define B_SECRET_POWER_EFFECT GEN_LATEST // Secret Power's effects change depending on terrain and generation. See MOVE_EFFECT_SECRET_POWER's case in `SetMoveEffect`. #define B_SECRET_POWER_ANIMATION GEN_LATEST // Secret Power's animations change depending on terrain and generation. -#define B_NATURE_POWER_MOVES GEN_LATEST // Nature Power calls different moves depending on terrain and generation. See sNaturePowerMoves. +#define B_NATURE_POWER_MOVES GEN_LATEST // Nature Power calls different moves depending on terrain and generation. See gBattleEnvironmentInfo. #define B_CAMOUFLAGE_TYPES GEN_LATEST // Camouflage changes the user to different types depending on terrain and generation. See sTerrainToType. #define B_NEW_TERRAIN_BACKGROUNDS FALSE // If set to TRUE, uses new terrain backgrounds for Electric, Misty, Grassy and Psychic Terrain. // Interface settings -#define B_ABILITY_POP_UP TRUE // In Gen5+, the PokΓ©mon abilities are displayed in a pop-up, when they activate in battle. -#define B_FAST_INTRO_PKMN_TEXT TRUE // If set to TRUE, battle intro texts print at the same time as animation of a PokΓ©mon, as opposing to waiting for the animation to end. -#define B_FAST_INTRO_NO_SLIDE FALSE // If set to TRUE, the slide animation that happens at the beginning of the battle is skipped. -#define B_FAST_HP_DRAIN TRUE // If set to TRUE, HP bars will move faster. -#define B_FAST_EXP_GROW TRUE // If set to TRUE, EXP bars will move faster. -#define B_SHOW_TARGETS TRUE // If set to TRUE, all available targets, for moves hitting 2 or 3 PokΓ©mon, will be shown before selecting a move. -#define B_SHOW_CATEGORY_ICON TRUE // If set to TRUE, it will show an icon in the summary and move relearner showing the move's category. -#define B_HIDE_HEALTHBOX_IN_ANIMS TRUE // If set to TRUE, hides healthboxes during move animations. -#define B_WAIT_TIME_MULTIPLIER 16 // This determines how long text pauses in battle last. Vanilla is 16. Lower values result in faster battles. -#define B_QUICK_MOVE_CURSOR_TO_RUN FALSE // If set to TRUE, pushing B in the battle options against a wild encounter will move the cursor to the run option -#define B_RUN_TRAINER_BATTLE TRUE // If set to TRUE, players can run from Trainer battles. This is treated as a whiteout. -#define B_MOVE_DESCRIPTION_BUTTON L_BUTTON // If set to a button other than B_LAST_USED_BALL_BUTTON, pressing this button will open the move description menu -#define B_SHOW_USELESS_Z_MOVE_INFO FALSE // If set to TRUE, Z-moves without additional effects like newer gen status moves will say "no additional effect" -#define B_ANIMATE_MON_AFTER_KO TRUE // If set to TRUE, if a PokΓ©mon on the opposite site faints, the non-fainted Pokemon will display a victory animation. -#define B_SHOW_DYNAMAX_MESSAGE FALSE // If set to TRUE, an additional battle message is shown after completing Dynamaxing/Gigantamaxing. +#define B_FAST_INTRO_PKMN_TEXT TRUE // If set to TRUE, battle intro texts print at the same time as animation of a PokΓ©mon, as opposing to waiting for the animation to end. +#define B_FAST_INTRO_NO_SLIDE FALSE // If set to TRUE, the slide animation that happens at the beginning of the battle is skipped. +#define B_FAST_HP_DRAIN TRUE // If set to TRUE, HP bars will move faster. +#define B_FAST_EXP_GROW TRUE // If set to TRUE, EXP bars will move faster. +#define B_SHOW_TARGETS TRUE // If set to TRUE, all available targets, for moves hitting 2 or 3 PokΓ©mon, will be shown before selecting a move. +#define B_SHOW_CATEGORY_ICON TRUE // If set to TRUE, it will show an icon in the summary and move relearner showing the move's category. +#define B_HIDE_HEALTHBOX_IN_ANIMS TRUE // If set to TRUE, hides healthboxes during move animations. +#define B_WAIT_TIME_MULTIPLIER 16 // This determines how long text pauses in battle last. Vanilla is 16. Lower values result in faster battles. +#define B_QUICK_MOVE_CURSOR_TO_RUN FALSE // If set to TRUE, pushing B in the battle options against a wild encounter will move the cursor to the run option +#define B_RUN_TRAINER_BATTLE TRUE // If set to TRUE, players can run from Trainer battles. This is treated as a whiteout. +#define B_MOVE_DESCRIPTION_BUTTON L_BUTTON // If set to a button other than B_LAST_USED_BALL_BUTTON, pressing this button will open the move description menu +#define B_SHOW_USELESS_Z_MOVE_INFO FALSE // If set to TRUE, Z-moves without additional effects like newer gen status moves will say "no additional effect" +#define B_ANIMATE_MON_AFTER_KO TRUE // If set to TRUE, if a PokΓ©mon on the opposite site faints, the non-fainted Pokemon will display a victory animation. +#define B_ANIMATE_MON_AFTER_FAILED_POKEBALL TRUE // If set to TRUE, if a PokΓ©mon on the opposite side breaks out of a thrown PokΓ© Ball, the wild PokΓ©mon will display its animation. +#define B_SHOW_DYNAMAX_MESSAGE FALSE // If set to TRUE, an additional battle message is shown after completing Dynamaxing/Gigantamaxing. // Catching settings #define B_SEMI_INVULNERABLE_CATCH GEN_LATEST // In Gen4+, you cannot throw a ball against a Pokemon that is in a semi-invulnerable state (dig/fly/etc) -#define B_CATCHING_CHARM_BOOST 20 // % boost in Critical Capture odds if player has the Catching Charm. +#define B_CATCHING_CHARM_BOOST 100 // % boost in Critical Capture odds if player has the Catching Charm. #define B_CRITICAL_CAPTURE TRUE // If set to TRUE, Critical Capture will be enabled. #define B_CRITICAL_CAPTURE_LOCAL_DEX TRUE // If set to FALSE, Critical Capture % is based off of the National Pokedex estimated by enabled generations. +#define B_CRITICAL_CAPTURE_IF_OWNED GEN_LATEST // In Gen9, a capture appear critical if the pokemon you are trying to catch already has a dex entry (has already been caught) #define B_LAST_USED_BALL TRUE // If TRUE, the "last used ball" feature from Gen 7 will be implemented #define B_LAST_USED_BALL_BUTTON R_BUTTON // If last used ball is implemented, this button (or button combo) will trigger throwing the last used ball. @@ -305,6 +317,7 @@ #define B_TOXIC_REVERSAL GEN_LATEST // In Gen5+, bad poison will change to regular poison at the end of battles. #define B_TRY_CATCH_TRAINER_BALL GEN_LATEST // In Gen4+, trying to catch a Trainer's PokΓ©mon does not consume the PokΓ© Ball. #define B_SLEEP_CLAUSE FALSE // Enables Sleep Clause all the time in every case, overriding B_FLAG_SLEEP_CLAUSE. Use that for modularity. +#define B_PARTNER_MONS_MARKED_SEEN FALSE // If TRUE, if your double battle partner sends out a PokΓ©mon you haven't encountered yet, it will be marked as SEEN in your PokΓ©dex. #define NUM_BEEPS_GEN_LATEST 4 // Loops 4 times #define NUM_BEEPS_GEN_3 -1 // Loops infinitely @@ -359,5 +372,7 @@ #define B_POOL_RULE_EXCLUDE_FORMS FALSE // Exclude different forms from the Species Clause #define B_POOL_RULE_ITEM_CLAUSE FALSE // Only allow each item to be picked once #define B_POOL_RULES_USE_ITEM_EXCLUSIONS FALSE // Exclude items listed in poolItemClauseExclusions +#define B_POOL_RULE_MEGA_STONE_CLAUSE FALSE // Pick only 1 mon with mega stone +#define B_POOL_RULE_Z_CRYSTAL_CLAUSE FALSE // Pick only 1 mon with Z-crystal #endif // GUARD_CONFIG_BATTLE_H diff --git a/include/config/contest.h b/include/config/contest.h new file mode 100644 index 000000000000..1307acc06faa --- /dev/null +++ b/include/config/contest.h @@ -0,0 +1,8 @@ +#ifndef GUARD_CONFIG_CONTEST_H +#define GUARD_CONFIG_CONTEST_H + +// Move data settings +#define C_UPDATED_MOVE_CATEGORIES GEN_LATEST // Updates contest category. +#define C_UPDATED_MOVE_EFFECTS GEN_LATEST // Updates contest effects. + +#endif // GUARD_CONFIG_CONTEST_H diff --git a/include/config/debug.h b/include/config/debug.h index 2446b9360c0b..7e28d335049a 100644 --- a/include/config/debug.h +++ b/include/config/debug.h @@ -2,16 +2,16 @@ #define GUARD_CONFIG_DEBUG_H // Overworld Debug -#define DEBUG_OVERWORLD_MENU TRUE // Enables an overworld debug menu to change flags, variables, giving pokemon and more, accessed by holding R and pressing START while in the overworld by default. +#define DEBUG_OVERWORLD_MENU DISABLED_ON_RELEASE // Enables an overworld debug menu to change flags, variables, giving pokemon and more, accessed by holding R and pressing START while in the overworld by default. #define DEBUG_OVERWORLD_HELD_KEYS (R_BUTTON) // The keys required to be held to open the debug menu. #define DEBUG_OVERWORLD_TRIGGER_EVENT pressedStartButton // The event that opens the menu when holding the key(s) defined in DEBUG_OVERWORLD_HELD_KEYS. #define DEBUG_OVERWORLD_IN_MENU FALSE // Replaces the overworld debug menu button combination with a start menu entry (above PokΓ©dex). // Battle Debug Menu -#define DEBUG_BATTLE_MENU TRUE // If set to TRUE, enables a debug menu to use in battles by pressing the Select button. +#define DEBUG_BATTLE_MENU DISABLED_ON_RELEASE // If set to TRUE, enables a debug menu to use in battles by pressing the Select button. #define DEBUG_AI_DELAY_TIMER FALSE // If set to TRUE, displays the number of frames it takes for the AI to choose a move. Replaces the "What will PKMN do" text. Useful for devs or anyone who modifies the AI code and wants to see if it doesn't take too long to run. // PokΓ©mon Debug -#define DEBUG_POKEMON_SPRITE_VISUALIZER TRUE // Enables a debug menu for PokΓ©mon sprites and icons, accessed by pressing Select in the summary screen. +#define DEBUG_POKEMON_SPRITE_VISUALIZER DISABLED_ON_RELEASE // Enables a debug menu for PokΓ©mon sprites and icons, accessed by pressing Select in the summary screen. #endif // GUARD_CONFIG_DEBUG_H diff --git a/include/config/fishing.h b/include/config/fishing.h new file mode 100644 index 000000000000..0cbf666a5406 --- /dev/null +++ b/include/config/fishing.h @@ -0,0 +1,13 @@ +#ifndef GUARD_CONFIG_FISHING_H +#define GUARD_CONFIG_FISHING_H + +#define I_FISHING_BITE_ODDS GEN_LATEST // In Gen 1 and Gen 2, the Old Rod has a 100% chance for a bite, Good Rod has a 66% chance for a bite, and Super Rod has a 50% chance for a bite. In Gen 3, all rods have a base 50% chance for a bite. In Gen 4 onwards, the Old Rod has a base 25% chance for a bite, Good Rod has a 50% chance for a bite, and Super Rod has a 75% chance for a bite. +#define I_FISHING_MINIGAME GEN_3 // Each generation uses a variation of reeling in PokΓ©mon once they have been hooked. NOTE: Only the Gen 1/2 and Gen 3 minigames are implemented right now! +#define I_FISHING_ENVIRONMENT GEN_LATEST // In Gen 3, the battle environment when fighting a hooked PokΓ©mon is based on the tile the player is standing on. In Gen 4 onwards, the environment is based on tile that is being fished in, resulting in it usually being a water environment. +#define I_FISHING_STICKY_BOOST GEN_LATEST // In Gen 3, a Pokemon with Suction Cups or Sticky Hold in the first slot of the party causes the chance for a bite to increase by about 35%. In Gen 4 onwards, it doubles the base bite chance. +#define I_FISHING_FOLLOWER_BOOST FALSE // In HGSS, fishing bite odds are increased depending on the friendship of the current following PokΓ©mon. +#define I_FISHING_CHAIN FALSE // Introduced in XY, hooking the same PokΓ©mon repeatedly will increase the odds of that mon being shiny. NOTE: This implementation is an approximation of the actual feature, as XY have not been throughoutly documented or datamined. +#define I_FISHING_PROXIMITY FALSE // In XY, bite chance is boosted by the number of adjacent non-surfable tiles next to your fishing line +#define I_FISHING_TIME_OF_DAY_BOOST FALSE // In XY, bite chance is boosted during morning and evening + +#endif // GUARD_CONFIG_FISHING_H diff --git a/include/config/general.h b/include/config/general.h index 1bb70ce00dde..6b7d3e6b79f6 100644 --- a/include/config/general.h +++ b/include/config/general.h @@ -6,11 +6,16 @@ // still has them in the ROM. This is because the developers forgot // to define NDEBUG before release, however this has been changed as // Ruby's actual debug build does not use the AGBPrint features. +// +// Use `make release` to automatically enable NDEBUG. +#ifdef RELEASE #define NDEBUG +#endif -// To enable printf debugging, comment out "#define NDEBUG". This allows +// printf debugging is now enabled by default. This allows // the various AGBPrint functions to be used. (See include/gba/isagbprint.h). // See below for enabling different pretty printing versions. +// To disable printf debugging, build a release build using `make release`. #ifndef NDEBUG @@ -63,16 +68,14 @@ #define GEN_7 6 #define GEN_8 7 #define GEN_9 8 +#define GEN_COUNT 9 // Changing GEN_LATEST's value to a different Generation will change every default setting that uses it at once. #define GEN_LATEST GEN_9 // General settings #define EXPANSION_INTRO TRUE // If TRUE, a custom RHH intro will play after the vanilla copyright screen. -#define SUMMARY_SCREEN_NATURE_COLORS TRUE // If TRUE, nature-based stat boosts and reductions will be red and blue in the summary screen. #define HQ_RANDOM TRUE // If TRUE, replaces the default RNG with an implementation of SFC32 RNG. May break code that relies on RNG. -#define COMPETITIVE_PARTY_SYNTAX TRUE // If TRUE, parties are defined in "competitive syntax". -#define AUTO_SCROLL_TEXT FALSE // If TRUE, text will automatically scroll to the next line after NUM_FRAMES_AUTO_SCROLL_DELAY. Players can still press A_BUTTON or B_BUTTON to scroll on their own. -#define NUM_FRAMES_AUTO_SCROLL_DELAY 49 +#define PHONEMES_SHARED FALSE // If TRUE, bard phonemes all reference the same sound (sound/direct_sound_samples/phonemes/shared.bin) to save ROM space. // Measurement system constants to be used for UNITS #define UNITS_IMPERIAL 0 // Inches, feet, pounds @@ -84,5 +87,4 @@ // Naming Screen #define AUTO_LOWERCASE_KEYBOARD GEN_LATEST // Starting in GEN_6, after entering the first uppercase character, the keyboard switches to lowercase letters. -#define SAVE_TYPE_ERROR_SCREEN FALSE // When enabled, this shows an error message when the game is loaded on a cart without a flash chip or on an emulator with the wrong save type setting instead of crashing. #endif // GUARD_CONFIG_GENERAL_H diff --git a/include/config/item.h b/include/config/item.h index 96156b0db814..8a5a0009dd60 100644 --- a/include/config/item.h +++ b/include/config/item.h @@ -36,15 +36,17 @@ #define I_REPEL_LURE_MENU TRUE // If TRUE, the player is able to choose which Repel/Lure to use once the previous one runs out. Cursor position is saved by VAR_LAST_REPEL_LURE_USED if not 0. // Vs. Seeker -#define I_VS_SEEKER_CHARGING 0 // If this flag is assigned, the Vs Seeker functionality will be enabled. When the player has the Vs. Seeker, Match Call rematch functions will stop working. +#define I_VS_SEEKER_CHARGING 0 // If this flag is assigned, the Vs Seeker functionality will be enabled. When the player has the Vs. Seeker, Match Call rematch functions will stop working. Documentation for the Vs. Seeker can be found in docs/tutorials/vs_seeker.md. -// Fishing -#define I_FISHING_BITE_ODDS GEN_LATEST // In Gen 1 and Gen 2, the Old Rod has a 100% chance for a bite, Good Rod has a 66% chance for a bite, and Super Rod has a 50% chance for a bite. In Gen 3, all rods have a base 50% chance for a bite. In Gen 4 onwards, the Old Rod has a base 25% chance for a bite, Good Rod has a 50% chance for a bite, and Super Rod has a 75% chance for a bite. -#define I_FISHING_MINIGAME GEN_3 // Each generation uses a variation of reeling in PokΓ©mon once they have been hooked. NOTE: Only the Gen 1/2 and Gen 3 minigames are implemented right now! -#define I_FISHING_ENVIRONMENT GEN_LATEST // In Gen 3, the battle environment when fighting a hooked PokΓ©mon is based on the tile the player is standing on. In Gen 4 onwards, the environment is based on tile that is being fished in, resulting in it usually being a water environment. -#define I_FISHING_STICKY_BOOST GEN_LATEST // In Gen 3, a Pokemon with Suction Cups or Sticky Hold in the first slot of the party causes the chance for a bite to increase by about 35%. In Gen 4 onwards, it doubles the base bite chance. -#define I_FISHING_FOLLOWER_BOOST FALSE // In HGSS, fishing bite odds are increased depending on the friendship of the current following PokΓ©mon. -#define I_FISHING_CHAIN FALSE // Introduced in XY, hooking the same PokΓ©mon repeatedly will increase the odds of that mon being shiny. NOTE: This implementation is an approximation of the actual feature, as XY have not been throughoutly documented or datamined. -#define I_FISHING_PROXIMITY FALSE // Introduced in XY, fishing away from other people in enclosed areas will increase the chances of a PokΓ©mon being hooked. NOTE: This implementation is an approximation of the actual feature, as XY have not been throughoutly documented or datamined. +// ORAS Dowsing Machine +#define I_ORAS_DOWSING_FLAG 0 // Replace 0 with an unused flag to enable the Dowsing Machine mechanic from ORAS. +#define I_ORAS_DOWSING_SOUNDS TRUE // If TRUE, the Dowsing Machine will make sounds based on how far away the hidden item is. +#define I_ORAS_DOWSING_COLOR_PAL 15 // The color within the palette that will change based on proximity to the item. +// Color values for the ORAS dowsing distances/anims +#define I_ORAS_DOWSING_COLOR_NONE RGB_GRAY +#define I_ORAS_DOWSING_COLOR_SLOW RGB2GBA(56, 120, 255) +#define I_ORAS_DOWSING_COLOR_NORMAL RGB2GBA(24, 216, 24) +#define I_ORAS_DOWSING_COLOR_FAST RGB2GBA(255, 255, 40) +#define I_ORAS_DOWSING_COLOR_FASTER RGB_RED #endif // GUARD_CONFIG_ITEM_H diff --git a/include/config/name_box.h b/include/config/name_box.h new file mode 100644 index 000000000000..715b33cad9c0 --- /dev/null +++ b/include/config/name_box.h @@ -0,0 +1,17 @@ +#ifndef GUARD_CONFIG_NAME_BOX_H +#define GUARD_CONFIG_NAME_BOX_H + +#define OW_FLAG_SUPPRESS_NAME_BOX 0 // If this flag is set, any namebox (whether its from a macro or a code) will not show up until this flag is unset. + +// Namebox Speaker configs +#define OW_NAME_BOX_USE_DYNAMIC_WIDTH TRUE // When TRUE, the namebox window can use different width depending on the length of the speaker's name. +#define OW_NAME_BOX_NPC_TRAINER FALSE // When TRUE, any approaching NPC trainers will have a namebox shown automagically. The name will be taken from their trainer data. +#define OW_NAME_BOX_DEFAULT_WIDTH 8 // Maximum width of what OW_NAME_BOX_USE_DYNAMIC_WIDTH can set. Also the default width when the config above is set to FALSE (or the dynamic width exceeds this value). +#define OW_NAME_BOX_DEFAULT_HEIGHT 2 // Maximum height of the namebox window. + +// Text colors of Namebox. The numbers corresponds to the palette index. +// The BG color is not provided as it always needs to be 0. +#define OW_NAME_BOX_FOREGROUND_COLOR 1 +#define OW_NAME_BOX_SHADOW_COLOR 2 + +#endif // GUARD_CONFIG_NAME_BOX_H diff --git a/include/config/overworld.h b/include/config/overworld.h index fa87da4d83cb..b441862c2a9c 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -9,8 +9,9 @@ #define OW_POISON_DAMAGE GEN_LATEST // In Gen4, PokΓ©mon no longer faint from Poison in the overworld. In Gen5+, they no longer take damage at all. #define OW_DOUBLE_APPROACH_WITH_ONE_MON FALSE // If enabled, you can be spotted by two trainers at the same time even if you only have one eligible PokΓ©mon in your party. #define OW_HIDE_REPEAT_MAP_POPUP FALSE // If enabled, map popups will not appear if entering a map with the same Map Section Id as the last. -#define OW_FRLG_WHITEOUT FALSE // If enabled, shows an additional whiteout message and post whiteout event script with healing NPC. +#define OW_WHITEOUT_CUTSCENE GEN_LATEST // In Gen4+, whiting out shows an additional message and post whiteout event script cutscene with a healing NPC. (While this change was also in FRLG, for the sake of simplicity, setting this to GEN_3 will result in RSE behavior.) #define OW_DEFOG_FIELD_MOVE FALSE // If enabled, Defog can be used as a Field Move as seen in DPPt. +#define OW_ROCK_CLIMB_FIELD_MOVE FALSE // If enabled, Rock Climb can be used as a Field Move as seen in DPPt. // Item Obtain Description Box #define OW_ITEM_DESCRIPTIONS_OFF 0 // never show descriptions @@ -20,7 +21,7 @@ // These generational defines only make a distinction for Berries and the OW_PC_MOVE_ORDER #define GEN_6_XY GEN_6 -#define GEN_6_ORAS GEN_LATEST + 1 +#define GEN_6_ORAS GEN_COUNT + 1 // PC settings #define OW_PC_PRESS_B GEN_LATEST // In Gen4, pressing B when holding a PokΓ©mon is equivalent to placing it. In Gen3, it gives the "You're holding a PokΓ©mon!" error. @@ -82,16 +83,16 @@ #define OW_FLASH_FIRE GEN_LATEST // In Gen8+, if a PokΓ©mon with Flash Fire is leading the party, there is a 50% chance to encounter a Fire-type PokΓ©mon. // These defines only make a distinction for OW_ALTERED_TIME_RATIO -#define GEN_8_PLA GEN_LATEST + 2 -#define TIME_DEBUG GEN_LATEST + 3 +#define GEN_8_PLA GEN_COUNT + 2 +#define TIME_DEBUG GEN_COUNT + 3 -//Time +// Time #define OW_TIMES_OF_DAY GEN_LATEST // Different generations have the times of day change at different times. #define OW_USE_FAKE_RTC FALSE // When TRUE, seconds on the in-game clock will only advance once every 60 playTimeVBlanks (every 60 frames). #define OW_ALTERED_TIME_RATIO GEN_LATEST // In GEN_8_PLA, the time in game moves forward 60 seconds for every second in the RTC. In GEN_9, it is 20 seconds. TIME_DEBUG is 1:1, and meant for debugging purposes. This has no effect if OW_USE_FAKE_RTC is FALSE. #define OW_TIME_OF_DAY_ENCOUNTERS FALSE // If TRUE, will allow the user to define and use different encounter tables based on the time of day. #define OW_TIME_OF_DAY_DISABLE_FALLBACK FALSE // If TRUE, if the encounter table for a specific map and time is empty, the area will have no encounters instead of falling back to the vanilla map and time. -#define OW_TIME_OF_DAY_FALLBACK TIME_MORNING // The time of day that encounter tables fall back to. +#define OW_TIME_OF_DAY_FALLBACK TIME_MORNING // The time of day that encounter tables fall back to. If you set OW_TIMES_OF_DAY to GEN_3, change this to TIME_DAY or you won't have any encounters! // Lighting #define OW_SHADOW_INTENSITY 4 // Ranges from 0 to 16, where 0 is fully transparent and 16 is black. @@ -132,6 +133,7 @@ #define OW_POPUP_BW_TIME_MODE OW_POPUP_BW_TIME_NONE // Determines what type of time is shown. #define OW_POPUP_BW_ALPHA_BLEND FALSE // Enables alpha blending/transparency for the pop-ups. Mainly intended to be used with the black color option. // Setting this to TRUE will cause graphical errors with the Day Night System enabled. + // It will also cause minor visual glitches of shadow and reflection sprites adjusting their transparency when the pop-up disappear // PokΓ©mon Center #define OW_IGNORE_EGGS_ON_HEAL GEN_LATEST // In Gen 4+, the nurse in the PokΓ©mon Center does not heal Eggs on healing machine. @@ -141,4 +143,7 @@ // Berry Blender #define BERRY_BLENDER_THROW_ALL_BERRIES_AT_ONCE TRUE // This is a small little addition, that basically speeds up the animation where all players' berries are thrown into the blender. Self-explanatory I hope! +// Trainer Rematches +#define OW_REMATCH_BADGE_COUNT 5 // Number of badges necessary before the match call or vs seeker features allow rematches + #endif // GUARD_CONFIG_OVERWORLD_H diff --git a/include/config/pokedex_plus_hgss.h b/include/config/pokedex_plus_hgss.h index 667a4bad5076..15abb590f03e 100644 --- a/include/config/pokedex_plus_hgss.h +++ b/include/config/pokedex_plus_hgss.h @@ -1,11 +1,12 @@ #ifndef GUARD_CONFIG_POKEDEX_PLUS_HGSS_H #define GUARD_CONFIG_POKEDEX_PLUS_HGSS_H -#define POKEDEX_PLUS_HGSS FALSE // If TRUE, enables the custom HGSS style Pokedex. -#define HGSS_DECAPPED FALSE // If TRUE, uses decapped gfx and strings. -#define HGSS_DARK_MODE FALSE // If TRUE, enables dark mode. -#define HGSS_HIDE_UNSEEN_EVOLUTION_NAMES FALSE // If TRUE, hides evolution mon names. -#define HGSS_SORT_TMS_BY_NUM FALSE // If TRUE, sorts the TMS in HGSS Dex by TM number, rather than alphabetically. -#define HGSS_SHOW_EGG_MOVES_FOR_EVOS FALSE // If TRUE, shows Egg Moves for evolved PokΓ©mon too. +#define POKEDEX_PLUS_HGSS FALSE // If TRUE, enables the custom HGSS style Pokedex. +#define HGSS_DECAPPED FALSE // If TRUE, uses decapped gfx and strings. +#define HGSS_DARK_MODE FALSE // If TRUE, enables dark mode. +#define HGSS_HIDE_UNSEEN_EVOLUTION_NAMES FALSE // If TRUE, hides evolution mon names. +#define HGSS_HIDE_UNOWNED_EVOLUTION_METHODS FALSE // If TRUE, hides evolution methods. +#define HGSS_SORT_TMS_BY_NUM FALSE // If TRUE, sorts the TMS in HGSS Dex by TM number, rather than alphabetically. +#define HGSS_SHOW_EGG_MOVES_FOR_EVOS FALSE // If TRUE, shows Egg Moves for evolved PokΓ©mon too. #endif // GUARD_CONFIG_POKEDEX_PLUS_HGSS_H diff --git a/include/config/pokemon.h b/include/config/pokemon.h index 2345cc3f3678..fdee4e8ad26f 100644 --- a/include/config/pokemon.h +++ b/include/config/pokemon.h @@ -56,8 +56,9 @@ #define P_SHOW_TERA_TYPE GEN_8 // Since Gen 9, the Tera Type is shown on the summary screen. #define P_TM_LITERACY GEN_LATEST // Since Gen 6, TM illiterate PokΓ©mon can learn TMs that teach moves that are in their level-up learnsets. #define P_CAN_FORGET_HIDDEN_MOVE FALSE // If TRUE, PokΓ©mon can forget any move, even if it is a Hidden Move. +#define P_ASK_MOVE_CONFIRMATION FALSE // If FALSE, when a player decides not to learn a Move, the game does not ask the player for confirmation. #define P_EGG_CYCLE_LENGTH GEN_LATEST // Since Gen 8, egg cycles take half as many steps as before. Previous Gens have some varied step counts around 255. -#define P_ONLY_OBTAINABLE_SHINIES FALSE // If TRUE, PokΓ©mon encountered in the Battle Pyramid won't be shiny. +#define P_ONLY_OBTAINABLE_SHINIES FALSE // If TRUE, PokΓ©mon encountered in the Battle Pyramid or while catching is disabled won't be shiny. #define P_NO_SHINIES_WITHOUT_POKEBALLS FALSE // If TRUE, PokΓ©mon encountered when the player is out of PokΓ© Balls won't be shiny #define P_SHOW_DYNAMIC_TYPES FALSE // If TRUE, all moves with dynamic type changes will be reflected as their current type in battle/summary screens instead of just select ones like in vanilla. diff --git a/include/config/species_enabled.h b/include/config/species_enabled.h index 23bb6d9d54f6..5866d243991d 100644 --- a/include/config/species_enabled.h +++ b/include/config/species_enabled.h @@ -1,9 +1,6 @@ #ifndef GUARD_CONFIG_SPECIES_ENABLED_H #define GUARD_CONFIG_SPECIES_ENABLED_H -// WARNING: For some reason, using 1/0 instead of TRUE/FALSE causes cry IDs to be shifted. -// Please use TRUE/FALSE when using the family toggles. - // Modifying the latest generation WILL change the saveblock due to Dex flags and will require a new save file. // Generations of PokΓ©mon are defined by the first member introduced, // so Pikachu depends on the Gen 1 setting despite Pichu being the lowest member of the evolution tree. @@ -29,6 +26,8 @@ #define P_GIGANTAMAX_FORMS TRUE #define P_TERA_FORMS TRUE +#define P_GEN_9_MEGA_EVOLUTIONS P_MEGA_EVOLUTIONS // Mega Evolutions introduced in Z-A and its DLC + // Fusion forms #define P_FUSION_FORMS TRUE diff --git a/include/config/summary_screen.h b/include/config/summary_screen.h index 9407d93c7e33..e76cd478b631 100644 --- a/include/config/summary_screen.h +++ b/include/config/summary_screen.h @@ -2,14 +2,16 @@ #define GUARD_CONFIG_SUMMARY_SCREEN_H // Settings -#define P_SUMMARY_SCREEN_MOVE_RELEARNER TRUE // If TRUE, shows an option for PokΓ©mon to relearn moves on the summary screen moves page. -#define P_SUMMARY_MOVE_RELEARNER_FULL_PP TRUE // If TRUE, the move relearner in the summary screen restores relearned moves' PP to full. +#define P_SUMMARY_SCREEN_NATURE_COLORS TRUE // If TRUE, nature-based stat boosts and reductions will be red and blue in the summary screen. #define P_SUMMARY_SCREEN_RENAME TRUE // If TRUE, an option to change PokΓ©mon nicknames replaces the cancel prompt on the summary screen info page. + +// IV/EV settings #define P_SUMMARY_SCREEN_IV_EV_INFO FALSE // If TRUE, will allow player to cycle through the Stats, IVs, and EVs in the summary screen skills page. #define P_SUMMARY_SCREEN_IV_EV_BOX_ONLY FALSE // If TRUE, will allow player to cycle through the Stats, IVs, and EVs in the summary screen skills page, but only in the PC storage box. +#define P_SUMMARY_SCREEN_IV_HYPERTRAIN TRUE // If TRUE, stats that have been hyper trained will show as 31/S when viewing them in the summary screen #define P_SUMMARY_SCREEN_IV_EV_TILESET FALSE // If TRUE, loads an alternate tileset to allow changing the "STATS" label in the summary screen skills page. Note: if it's still loading the alternate tileset after changing this and recompiling, you may need a `make clean` before compilation. #define P_SUMMARY_SCREEN_IV_EV_VALUES FALSE // If TRUE, will show the actual IV value instead of the letter grade. -/* +/* LETTER GRADE GUIDE: F = 0 @@ -24,7 +26,32 @@ Info taken from https://bulbapedia.bulbagarden.net/wiki/Stats_judge. #define P_SUMMARY_SCREEN_IV_ONLY FALSE // If TRUE, will only show IV info in the summary screen. #define P_SUMMARY_SCREEN_EV_ONLY FALSE // If TRUE, will only show EV info in the summary screen. -// Flags +// IV/EV flags #define P_FLAG_SUMMARY_SCREEN_IV_EV_INFO 0 // If this flag is set, will allow player to cycle through the Stats, IVs, and EVs in the summary screen skills page. Note: if P_SUMMARY_SCREEN_IV_EV_INFO is TRUE, this flag does nothing. +// Move Relearner settings +#define P_ENABLE_MOVE_RELEARNERS FALSE // If TRUE, it enables move relearners for egg, TM and tutor. (see below for specific configs /flags) +#define P_SORT_MOVES FALSE // If TRUE, sorts all moves alphabetically in the relearner's list. + +// Level up Relearner +#define P_PRE_EVO_MOVES FALSE // If TRUE, it enables the PokΓ©mon to learn moves from it's pre evolution. +#define P_ENABLE_ALL_LEVEL_UP_MOVES FALSE // If TRUE, it enables the PokΓ©mon to learn all level up moves, regardless of its level. + +// TM Relearner +#define P_TM_MOVES_RELEARNER TRUE // If TRUE, enables machine move relearner. +#define P_ENABLE_ALL_TM_MOVES FALSE // If TRUE, it enables the PokΓ©mon to learn all TMs its compatible with, regardless of it being in the bag. + +// Relearner flags - Redundant if P_ENABLE_MOVE_RELEARNERS is TRUE, but still added here incase you don't want all relearners unlocked at the same time. +// To use the following features in scripting, replace the 0s with the flag ID you're assigning it to. +// Eg: Replace with FLAG_UNUSED_0x264 so you can use that flag to toggle the feature. +#define P_FLAG_EGG_MOVES 0 // If this flag is set, enables egg move relearner. +#define P_FLAG_TUTOR_MOVES 0 // If this flag is set, enables tutor move relearner. + +// Move Relearner summary screen +#define P_SUMMARY_SCREEN_MOVE_RELEARNER TRUE // If TRUE, shows an option for PokΓ©mon to relearn moves on the summary screen moves page. +#define P_SUMMARY_MOVE_RELEARNER_FULL_PP TRUE // If TRUE, the move relearner in the summary screen restores relearned moves' PP to full. + +// Move Relearner party menu +#define P_PARTY_MOVE_RELEARNER FALSE // If TRUE, it enables the move relearner in the party menu. + #endif // GUARD_CONFIG_SUMMARY_SCREEN_H diff --git a/include/config/test.h b/include/config/test.h index 6122d14aa186..46dbe17a997d 100644 --- a/include/config/test.h +++ b/include/config/test.h @@ -1132,6 +1132,10 @@ // Vars #undef B_VAR_DIFFICULTY #define B_VAR_DIFFICULTY TESTING_VAR_DIFFICULTY +#undef B_VAR_STARTING_STATUS +#define B_VAR_STARTING_STATUS TESTING_VAR_STARTING_STATUS +#undef B_VAR_STARTING_STATUS_TIMER +#define B_VAR_STARTING_STATUS_TIMER TESTING_VAR_STARTING_STATUS_TIMER // Flags #undef B_FLAG_SLEEP_CLAUSE @@ -1139,6 +1143,9 @@ #undef B_FLAG_INVERSE_BATTLE #define B_FLAG_INVERSE_BATTLE TESTING_FLAG_INVERSE_BATTLE +// Compression DebugPrintf switch +#define T_COMPRESSION_SHOULD_PRINT FALSE + // Move animation testing #define T_SHOULD_RUN_MOVE_ANIM FALSE // If TRUE, enables the move animation tests, these are very computationally heavy and takes a long time to run. diff --git a/include/config/text.h b/include/config/text.h new file mode 100644 index 000000000000..81438055a138 --- /dev/null +++ b/include/config/text.h @@ -0,0 +1,19 @@ +#ifndef GUARD_CONFIG_TEXT_H +#define GUARD_CONFIG_TEXT_H + +// Text settings: +#define AUTO_SCROLL_TEXT FALSE // If TRUE, text will automatically scroll to the next line after NUM_FRAMES_AUTO_SCROLL_DELAY. Players can still press A_BUTTON or B_BUTTON to scroll on their own. +#define NUM_FRAMES_AUTO_SCROLL_DELAY 49 + +// A note on the modifiers: they are roughly multiplicative, so having them set at 1 is vanilla speed. They also are used to calculate frame delays for the speed of the scroll effect and the animated down arrow, so to that end, they are capped at 31 to prevent the text printing from desyncing with A/B button inputs. +// From testing, a value of 18 to 20 is essentially equivalent to instant text. +#define TEXT_SPEED_SLOW_MODIFIER 1 // How fast the SLOW text speed option prints +#define TEXT_SPEED_MEDIUM_MODIFIER 1 // How fast the MID text speed option prints +#define TEXT_SPEED_FAST_MODIFIER 1 // How fast the FAST text speed option prints +#define TEXT_SPEED_INSTANT_MODIFIER 12 // Needed only for the animation delays +#define TEXT_SPEED_INSTANT FALSE // Renders all text as fast as it can, basically instant. Overrides FLAG_TEXT_SPEED_INSTANT and in-game player options menu setting. + +// Text speed flag: +#define FLAG_TEXT_SPEED_INSTANT 0 // Use this if you want to toggle instant text speed + +#endif // GUARD_CONFIG_TEXT_H diff --git a/include/constants/abilities.h b/include/constants/abilities.h index 856820613718..7e17fd528784 100644 --- a/include/constants/abilities.h +++ b/include/constants/abilities.h @@ -1,344 +1,339 @@ #ifndef GUARD_CONSTANTS_ABILITIES_H #define GUARD_CONSTANTS_ABILITIES_H -#define ABILITY_NONE 0 -#define ABILITY_STENCH 1 -#define ABILITY_DRIZZLE 2 -#define ABILITY_SPEED_BOOST 3 -#define ABILITY_BATTLE_ARMOR 4 -#define ABILITY_STURDY 5 -#define ABILITY_DAMP 6 -#define ABILITY_LIMBER 7 -#define ABILITY_SAND_VEIL 8 -#define ABILITY_STATIC 9 -#define ABILITY_VOLT_ABSORB 10 -#define ABILITY_WATER_ABSORB 11 -#define ABILITY_OBLIVIOUS 12 -#define ABILITY_CLOUD_NINE 13 -#define ABILITY_COMPOUND_EYES 14 -#define ABILITY_INSOMNIA 15 -#define ABILITY_COLOR_CHANGE 16 -#define ABILITY_IMMUNITY 17 -#define ABILITY_FLASH_FIRE 18 -#define ABILITY_SHIELD_DUST 19 -#define ABILITY_OWN_TEMPO 20 -#define ABILITY_SUCTION_CUPS 21 -#define ABILITY_INTIMIDATE 22 -#define ABILITY_SHADOW_TAG 23 -#define ABILITY_ROUGH_SKIN 24 -#define ABILITY_WONDER_GUARD 25 -#define ABILITY_LEVITATE 26 -#define ABILITY_EFFECT_SPORE 27 -#define ABILITY_SYNCHRONIZE 28 -#define ABILITY_CLEAR_BODY 29 -#define ABILITY_NATURAL_CURE 30 -#define ABILITY_LIGHTNING_ROD 31 -#define ABILITY_SERENE_GRACE 32 -#define ABILITY_SWIFT_SWIM 33 -#define ABILITY_CHLOROPHYLL 34 -#define ABILITY_ILLUMINATE 35 -#define ABILITY_TRACE 36 -#define ABILITY_HUGE_POWER 37 -#define ABILITY_POISON_POINT 38 -#define ABILITY_INNER_FOCUS 39 -#define ABILITY_MAGMA_ARMOR 40 -#define ABILITY_WATER_VEIL 41 -#define ABILITY_MAGNET_PULL 42 -#define ABILITY_SOUNDPROOF 43 -#define ABILITY_RAIN_DISH 44 -#define ABILITY_SAND_STREAM 45 -#define ABILITY_PRESSURE 46 -#define ABILITY_THICK_FAT 47 -#define ABILITY_EARLY_BIRD 48 -#define ABILITY_FLAME_BODY 49 -#define ABILITY_RUN_AWAY 50 -#define ABILITY_KEEN_EYE 51 -#define ABILITY_HYPER_CUTTER 52 -#define ABILITY_PICKUP 53 -#define ABILITY_TRUANT 54 -#define ABILITY_HUSTLE 55 -#define ABILITY_CUTE_CHARM 56 -#define ABILITY_PLUS 57 -#define ABILITY_MINUS 58 -#define ABILITY_FORECAST 59 -#define ABILITY_STICKY_HOLD 60 -#define ABILITY_SHED_SKIN 61 -#define ABILITY_GUTS 62 -#define ABILITY_MARVEL_SCALE 63 -#define ABILITY_LIQUID_OOZE 64 -#define ABILITY_OVERGROW 65 -#define ABILITY_BLAZE 66 -#define ABILITY_TORRENT 67 -#define ABILITY_SWARM 68 -#define ABILITY_ROCK_HEAD 69 -#define ABILITY_DROUGHT 70 -#define ABILITY_ARENA_TRAP 71 -#define ABILITY_VITAL_SPIRIT 72 -#define ABILITY_WHITE_SMOKE 73 -#define ABILITY_PURE_POWER 74 -#define ABILITY_SHELL_ARMOR 75 -#define ABILITY_AIR_LOCK 76 +enum __attribute__((packed)) Ability +{ + ABILITY_NONE = 0, + ABILITY_STENCH = 1, + ABILITY_DRIZZLE = 2, + ABILITY_SPEED_BOOST = 3, + ABILITY_BATTLE_ARMOR = 4, + ABILITY_STURDY = 5, + ABILITY_DAMP = 6, + ABILITY_LIMBER = 7, + ABILITY_SAND_VEIL = 8, + ABILITY_STATIC = 9, + ABILITY_VOLT_ABSORB = 10, + ABILITY_WATER_ABSORB = 11, + ABILITY_OBLIVIOUS = 12, + ABILITY_CLOUD_NINE = 13, + ABILITY_COMPOUND_EYES = 14, + ABILITY_INSOMNIA = 15, + ABILITY_COLOR_CHANGE = 16, + ABILITY_IMMUNITY = 17, + ABILITY_FLASH_FIRE = 18, + ABILITY_SHIELD_DUST = 19, + ABILITY_OWN_TEMPO = 20, + ABILITY_SUCTION_CUPS = 21, + ABILITY_INTIMIDATE = 22, + ABILITY_SHADOW_TAG = 23, + ABILITY_ROUGH_SKIN = 24, + ABILITY_WONDER_GUARD = 25, + ABILITY_LEVITATE = 26, + ABILITY_EFFECT_SPORE = 27, + ABILITY_SYNCHRONIZE = 28, + ABILITY_CLEAR_BODY = 29, + ABILITY_NATURAL_CURE = 30, + ABILITY_LIGHTNING_ROD = 31, + ABILITY_SERENE_GRACE = 32, + ABILITY_SWIFT_SWIM = 33, + ABILITY_CHLOROPHYLL = 34, + ABILITY_ILLUMINATE = 35, + ABILITY_TRACE = 36, + ABILITY_HUGE_POWER = 37, + ABILITY_POISON_POINT = 38, + ABILITY_INNER_FOCUS = 39, + ABILITY_MAGMA_ARMOR = 40, + ABILITY_WATER_VEIL = 41, + ABILITY_MAGNET_PULL = 42, + ABILITY_SOUNDPROOF = 43, + ABILITY_RAIN_DISH = 44, + ABILITY_SAND_STREAM = 45, + ABILITY_PRESSURE = 46, + ABILITY_THICK_FAT = 47, + ABILITY_EARLY_BIRD = 48, + ABILITY_FLAME_BODY = 49, + ABILITY_RUN_AWAY = 50, + ABILITY_KEEN_EYE = 51, + ABILITY_HYPER_CUTTER = 52, + ABILITY_PICKUP = 53, + ABILITY_TRUANT = 54, + ABILITY_HUSTLE = 55, + ABILITY_CUTE_CHARM = 56, + ABILITY_PLUS = 57, + ABILITY_MINUS = 58, + ABILITY_FORECAST = 59, + ABILITY_STICKY_HOLD = 60, + ABILITY_SHED_SKIN = 61, + ABILITY_GUTS = 62, + ABILITY_MARVEL_SCALE = 63, + ABILITY_LIQUID_OOZE = 64, + ABILITY_OVERGROW = 65, + ABILITY_BLAZE = 66, + ABILITY_TORRENT = 67, + ABILITY_SWARM = 68, + ABILITY_ROCK_HEAD = 69, + ABILITY_DROUGHT = 70, + ABILITY_ARENA_TRAP = 71, + ABILITY_VITAL_SPIRIT = 72, + ABILITY_WHITE_SMOKE = 73, + ABILITY_PURE_POWER = 74, + ABILITY_SHELL_ARMOR = 75, + ABILITY_AIR_LOCK = 76, + ABILITIES_COUNT_GEN3, -#define ABILITIES_COUNT_GEN3 77 + // Gen 4 + ABILITY_TANGLED_FEET = ABILITIES_COUNT_GEN3, + ABILITY_MOTOR_DRIVE = 78, + ABILITY_RIVALRY = 79, + ABILITY_STEADFAST = 80, + ABILITY_SNOW_CLOAK = 81, + ABILITY_GLUTTONY = 82, + ABILITY_ANGER_POINT = 83, + ABILITY_UNBURDEN = 84, + ABILITY_HEATPROOF = 85, + ABILITY_SIMPLE = 86, + ABILITY_DRY_SKIN = 87, + ABILITY_DOWNLOAD = 88, + ABILITY_IRON_FIST = 89, + ABILITY_POISON_HEAL = 90, + ABILITY_ADAPTABILITY = 91, + ABILITY_SKILL_LINK = 92, + ABILITY_HYDRATION = 93, + ABILITY_SOLAR_POWER = 94, + ABILITY_QUICK_FEET = 95, + ABILITY_NORMALIZE = 96, + ABILITY_SNIPER = 97, + ABILITY_MAGIC_GUARD = 98, + ABILITY_NO_GUARD = 99, + ABILITY_STALL = 100, + ABILITY_TECHNICIAN = 101, + ABILITY_LEAF_GUARD = 102, + ABILITY_KLUTZ = 103, + ABILITY_MOLD_BREAKER = 104, + ABILITY_SUPER_LUCK = 105, + ABILITY_AFTERMATH = 106, + ABILITY_ANTICIPATION = 107, + ABILITY_FOREWARN = 108, + ABILITY_UNAWARE = 109, + ABILITY_TINTED_LENS = 110, + ABILITY_FILTER = 111, + ABILITY_SLOW_START = 112, + ABILITY_SCRAPPY = 113, + ABILITY_STORM_DRAIN = 114, + ABILITY_ICE_BODY = 115, + ABILITY_SOLID_ROCK = 116, + ABILITY_SNOW_WARNING = 117, + ABILITY_HONEY_GATHER = 118, + ABILITY_FRISK = 119, + ABILITY_RECKLESS = 120, + ABILITY_MULTITYPE = 121, + ABILITY_FLOWER_GIFT = 122, + ABILITY_BAD_DREAMS = 123, + ABILITIES_COUNT_GEN4, -// Gen 4 -#define ABILITY_TANGLED_FEET 77 -#define ABILITY_MOTOR_DRIVE 78 -#define ABILITY_RIVALRY 79 -#define ABILITY_STEADFAST 80 -#define ABILITY_SNOW_CLOAK 81 -#define ABILITY_GLUTTONY 82 -#define ABILITY_ANGER_POINT 83 -#define ABILITY_UNBURDEN 84 -#define ABILITY_HEATPROOF 85 -#define ABILITY_SIMPLE 86 -#define ABILITY_DRY_SKIN 87 -#define ABILITY_DOWNLOAD 88 -#define ABILITY_IRON_FIST 89 -#define ABILITY_POISON_HEAL 90 -#define ABILITY_ADAPTABILITY 91 -#define ABILITY_SKILL_LINK 92 -#define ABILITY_HYDRATION 93 -#define ABILITY_SOLAR_POWER 94 -#define ABILITY_QUICK_FEET 95 -#define ABILITY_NORMALIZE 96 -#define ABILITY_SNIPER 97 -#define ABILITY_MAGIC_GUARD 98 -#define ABILITY_NO_GUARD 99 -#define ABILITY_STALL 100 -#define ABILITY_TECHNICIAN 101 -#define ABILITY_LEAF_GUARD 102 -#define ABILITY_KLUTZ 103 -#define ABILITY_MOLD_BREAKER 104 -#define ABILITY_SUPER_LUCK 105 -#define ABILITY_AFTERMATH 106 -#define ABILITY_ANTICIPATION 107 -#define ABILITY_FOREWARN 108 -#define ABILITY_UNAWARE 109 -#define ABILITY_TINTED_LENS 110 -#define ABILITY_FILTER 111 -#define ABILITY_SLOW_START 112 -#define ABILITY_SCRAPPY 113 -#define ABILITY_STORM_DRAIN 114 -#define ABILITY_ICE_BODY 115 -#define ABILITY_SOLID_ROCK 116 -#define ABILITY_SNOW_WARNING 117 -#define ABILITY_HONEY_GATHER 118 -#define ABILITY_FRISK 119 -#define ABILITY_RECKLESS 120 -#define ABILITY_MULTITYPE 121 -#define ABILITY_FLOWER_GIFT 122 -#define ABILITY_BAD_DREAMS 123 + // Gen 5 + ABILITY_PICKPOCKET = ABILITIES_COUNT_GEN4, + ABILITY_SHEER_FORCE = 125, + ABILITY_CONTRARY = 126, + ABILITY_UNNERVE = 127, + ABILITY_DEFIANT = 128, + ABILITY_DEFEATIST = 129, + ABILITY_CURSED_BODY = 130, + ABILITY_HEALER = 131, + ABILITY_FRIEND_GUARD = 132, + ABILITY_WEAK_ARMOR = 133, + ABILITY_HEAVY_METAL = 134, + ABILITY_LIGHT_METAL = 135, + ABILITY_MULTISCALE = 136, + ABILITY_TOXIC_BOOST = 137, + ABILITY_FLARE_BOOST = 138, + ABILITY_HARVEST = 139, + ABILITY_TELEPATHY = 140, + ABILITY_MOODY = 141, + ABILITY_OVERCOAT = 142, + ABILITY_POISON_TOUCH = 143, + ABILITY_REGENERATOR = 144, + ABILITY_BIG_PECKS = 145, + ABILITY_SAND_RUSH = 146, + ABILITY_WONDER_SKIN = 147, + ABILITY_ANALYTIC = 148, + ABILITY_ILLUSION = 149, + ABILITY_IMPOSTER = 150, + ABILITY_INFILTRATOR = 151, + ABILITY_MUMMY = 152, + ABILITY_MOXIE = 153, + ABILITY_JUSTIFIED = 154, + ABILITY_RATTLED = 155, + ABILITY_MAGIC_BOUNCE = 156, + ABILITY_SAP_SIPPER = 157, + ABILITY_PRANKSTER = 158, + ABILITY_SAND_FORCE = 159, + ABILITY_IRON_BARBS = 160, + ABILITY_ZEN_MODE = 161, + ABILITY_VICTORY_STAR = 162, + ABILITY_TURBOBLAZE = 163, + ABILITY_TERAVOLT = 164, + ABILITIES_COUNT_GEN5, -#define ABILITIES_COUNT_GEN4 124 + // Gen 6 + ABILITY_AROMA_VEIL = ABILITIES_COUNT_GEN5, + ABILITY_FLOWER_VEIL = 166, + ABILITY_CHEEK_POUCH = 167, + ABILITY_PROTEAN = 168, + ABILITY_FUR_COAT = 169, + ABILITY_MAGICIAN = 170, + ABILITY_BULLETPROOF = 171, + ABILITY_COMPETITIVE = 172, + ABILITY_STRONG_JAW = 173, + ABILITY_REFRIGERATE = 174, + ABILITY_SWEET_VEIL = 175, + ABILITY_STANCE_CHANGE = 176, + ABILITY_GALE_WINGS = 177, + ABILITY_MEGA_LAUNCHER = 178, + ABILITY_GRASS_PELT = 179, + ABILITY_SYMBIOSIS = 180, + ABILITY_TOUGH_CLAWS = 181, + ABILITY_PIXILATE = 182, + ABILITY_GOOEY = 183, + ABILITY_AERILATE = 184, + ABILITY_PARENTAL_BOND = 185, + ABILITY_DARK_AURA = 186, + ABILITY_FAIRY_AURA = 187, + ABILITY_AURA_BREAK = 188, + ABILITY_PRIMORDIAL_SEA = 189, + ABILITY_DESOLATE_LAND = 190, + ABILITY_DELTA_STREAM = 191, + ABILITIES_COUNT_GEN6, -// Gen 5 -#define ABILITY_PICKPOCKET 124 -#define ABILITY_SHEER_FORCE 125 -#define ABILITY_CONTRARY 126 -#define ABILITY_UNNERVE 127 -#define ABILITY_DEFIANT 128 -#define ABILITY_DEFEATIST 129 -#define ABILITY_CURSED_BODY 130 -#define ABILITY_HEALER 131 -#define ABILITY_FRIEND_GUARD 132 -#define ABILITY_WEAK_ARMOR 133 -#define ABILITY_HEAVY_METAL 134 -#define ABILITY_LIGHT_METAL 135 -#define ABILITY_MULTISCALE 136 -#define ABILITY_TOXIC_BOOST 137 -#define ABILITY_FLARE_BOOST 138 -#define ABILITY_HARVEST 139 -#define ABILITY_TELEPATHY 140 -#define ABILITY_MOODY 141 -#define ABILITY_OVERCOAT 142 -#define ABILITY_POISON_TOUCH 143 -#define ABILITY_REGENERATOR 144 -#define ABILITY_BIG_PECKS 145 -#define ABILITY_SAND_RUSH 146 -#define ABILITY_WONDER_SKIN 147 -#define ABILITY_ANALYTIC 148 -#define ABILITY_ILLUSION 149 -#define ABILITY_IMPOSTER 150 -#define ABILITY_INFILTRATOR 151 -#define ABILITY_MUMMY 152 -#define ABILITY_MOXIE 153 -#define ABILITY_JUSTIFIED 154 -#define ABILITY_RATTLED 155 -#define ABILITY_MAGIC_BOUNCE 156 -#define ABILITY_SAP_SIPPER 157 -#define ABILITY_PRANKSTER 158 -#define ABILITY_SAND_FORCE 159 -#define ABILITY_IRON_BARBS 160 -#define ABILITY_ZEN_MODE 161 -#define ABILITY_VICTORY_STAR 162 -#define ABILITY_TURBOBLAZE 163 -#define ABILITY_TERAVOLT 164 + // Gen 7 + ABILITY_STAMINA = ABILITIES_COUNT_GEN6, + ABILITY_WIMP_OUT = 193, + ABILITY_EMERGENCY_EXIT = 194, + ABILITY_WATER_COMPACTION = 195, + ABILITY_MERCILESS = 196, + ABILITY_SHIELDS_DOWN = 197, + ABILITY_STAKEOUT = 198, + ABILITY_WATER_BUBBLE = 199, + ABILITY_STEELWORKER = 200, + ABILITY_BERSERK = 201, + ABILITY_SLUSH_RUSH = 202, + ABILITY_LONG_REACH = 203, + ABILITY_LIQUID_VOICE = 204, + ABILITY_TRIAGE = 205, + ABILITY_GALVANIZE = 206, + ABILITY_SURGE_SURFER = 207, + ABILITY_SCHOOLING = 208, + ABILITY_DISGUISE = 209, + ABILITY_BATTLE_BOND = 210, + ABILITY_POWER_CONSTRUCT = 211, + ABILITY_CORROSION = 212, + ABILITY_COMATOSE = 213, + ABILITY_QUEENLY_MAJESTY = 214, + ABILITY_INNARDS_OUT = 215, + ABILITY_DANCER = 216, + ABILITY_BATTERY = 217, + ABILITY_FLUFFY = 218, + ABILITY_DAZZLING = 219, + ABILITY_SOUL_HEART = 220, + ABILITY_TANGLING_HAIR = 221, + ABILITY_RECEIVER = 222, + ABILITY_POWER_OF_ALCHEMY = 223, + ABILITY_BEAST_BOOST = 224, + ABILITY_RKS_SYSTEM = 225, + ABILITY_ELECTRIC_SURGE = 226, + ABILITY_PSYCHIC_SURGE = 227, + ABILITY_MISTY_SURGE = 228, + ABILITY_GRASSY_SURGE = 229, + ABILITY_FULL_METAL_BODY = 230, + ABILITY_SHADOW_SHIELD = 231, + ABILITY_PRISM_ARMOR = 232, + ABILITY_NEUROFORCE = 233, + ABILITIES_COUNT_GEN7, -#define ABILITIES_COUNT_GEN5 165 + // Gen 8 + ABILITY_INTREPID_SWORD = ABILITIES_COUNT_GEN7, + ABILITY_DAUNTLESS_SHIELD = 235, + ABILITY_LIBERO = 236, + ABILITY_BALL_FETCH = 237, + ABILITY_COTTON_DOWN = 238, + ABILITY_PROPELLER_TAIL = 239, + ABILITY_MIRROR_ARMOR = 240, + ABILITY_GULP_MISSILE = 241, + ABILITY_STALWART = 242, + ABILITY_STEAM_ENGINE = 243, + ABILITY_PUNK_ROCK = 244, + ABILITY_SAND_SPIT = 245, + ABILITY_ICE_SCALES = 246, + ABILITY_RIPEN = 247, + ABILITY_ICE_FACE = 248, + ABILITY_POWER_SPOT = 249, + ABILITY_MIMICRY = 250, + ABILITY_SCREEN_CLEANER = 251, + ABILITY_STEELY_SPIRIT = 252, + ABILITY_PERISH_BODY = 253, + ABILITY_WANDERING_SPIRIT = 254, + ABILITY_GORILLA_TACTICS = 255, + ABILITY_NEUTRALIZING_GAS = 256, + ABILITY_PASTEL_VEIL = 257, + ABILITY_HUNGER_SWITCH = 258, + ABILITY_QUICK_DRAW = 259, + ABILITY_UNSEEN_FIST = 260, + ABILITY_CURIOUS_MEDICINE = 261, + ABILITY_TRANSISTOR = 262, + ABILITY_DRAGONS_MAW = 263, + ABILITY_CHILLING_NEIGH = 264, + ABILITY_GRIM_NEIGH = 265, + ABILITY_AS_ONE_ICE_RIDER = 266, + ABILITY_AS_ONE_SHADOW_RIDER = 267, + ABILITIES_COUNT_GEN8, -// Gen 6 -#define ABILITY_AROMA_VEIL 165 -#define ABILITY_FLOWER_VEIL 166 -#define ABILITY_CHEEK_POUCH 167 -#define ABILITY_PROTEAN 168 -#define ABILITY_FUR_COAT 169 -#define ABILITY_MAGICIAN 170 -#define ABILITY_BULLETPROOF 171 -#define ABILITY_COMPETITIVE 172 -#define ABILITY_STRONG_JAW 173 -#define ABILITY_REFRIGERATE 174 -#define ABILITY_SWEET_VEIL 175 -#define ABILITY_STANCE_CHANGE 176 -#define ABILITY_GALE_WINGS 177 -#define ABILITY_MEGA_LAUNCHER 178 -#define ABILITY_GRASS_PELT 179 -#define ABILITY_SYMBIOSIS 180 -#define ABILITY_TOUGH_CLAWS 181 -#define ABILITY_PIXILATE 182 -#define ABILITY_GOOEY 183 -#define ABILITY_AERILATE 184 -#define ABILITY_PARENTAL_BOND 185 -#define ABILITY_DARK_AURA 186 -#define ABILITY_FAIRY_AURA 187 -#define ABILITY_AURA_BREAK 188 -#define ABILITY_PRIMORDIAL_SEA 189 -#define ABILITY_DESOLATE_LAND 190 -#define ABILITY_DELTA_STREAM 191 - -#define ABILITIES_COUNT_GEN6 192 - -// Gen 7 -#define ABILITY_STAMINA 192 -#define ABILITY_WIMP_OUT 193 -#define ABILITY_EMERGENCY_EXIT 194 -#define ABILITY_WATER_COMPACTION 195 -#define ABILITY_MERCILESS 196 -#define ABILITY_SHIELDS_DOWN 197 -#define ABILITY_STAKEOUT 198 -#define ABILITY_WATER_BUBBLE 199 -#define ABILITY_STEELWORKER 200 -#define ABILITY_BERSERK 201 -#define ABILITY_SLUSH_RUSH 202 -#define ABILITY_LONG_REACH 203 -#define ABILITY_LIQUID_VOICE 204 -#define ABILITY_TRIAGE 205 -#define ABILITY_GALVANIZE 206 -#define ABILITY_SURGE_SURFER 207 -#define ABILITY_SCHOOLING 208 -#define ABILITY_DISGUISE 209 -#define ABILITY_BATTLE_BOND 210 -#define ABILITY_POWER_CONSTRUCT 211 -#define ABILITY_CORROSION 212 -#define ABILITY_COMATOSE 213 -#define ABILITY_QUEENLY_MAJESTY 214 -#define ABILITY_INNARDS_OUT 215 -#define ABILITY_DANCER 216 -#define ABILITY_BATTERY 217 -#define ABILITY_FLUFFY 218 -#define ABILITY_DAZZLING 219 -#define ABILITY_SOUL_HEART 220 -#define ABILITY_TANGLING_HAIR 221 -#define ABILITY_RECEIVER 222 -#define ABILITY_POWER_OF_ALCHEMY 223 -#define ABILITY_BEAST_BOOST 224 -#define ABILITY_RKS_SYSTEM 225 -#define ABILITY_ELECTRIC_SURGE 226 -#define ABILITY_PSYCHIC_SURGE 227 -#define ABILITY_MISTY_SURGE 228 -#define ABILITY_GRASSY_SURGE 229 -#define ABILITY_FULL_METAL_BODY 230 -#define ABILITY_SHADOW_SHIELD 231 -#define ABILITY_PRISM_ARMOR 232 -#define ABILITY_NEUROFORCE 233 - -#define ABILITIES_COUNT_GEN7 234 - -// Gen 8 -#define ABILITY_INTREPID_SWORD 234 -#define ABILITY_DAUNTLESS_SHIELD 235 -#define ABILITY_LIBERO 236 -#define ABILITY_BALL_FETCH 237 -#define ABILITY_COTTON_DOWN 238 -#define ABILITY_PROPELLER_TAIL 239 -#define ABILITY_MIRROR_ARMOR 240 -#define ABILITY_GULP_MISSILE 241 -#define ABILITY_STALWART 242 -#define ABILITY_STEAM_ENGINE 243 -#define ABILITY_PUNK_ROCK 244 -#define ABILITY_SAND_SPIT 245 -#define ABILITY_ICE_SCALES 246 -#define ABILITY_RIPEN 247 -#define ABILITY_ICE_FACE 248 -#define ABILITY_POWER_SPOT 249 -#define ABILITY_MIMICRY 250 -#define ABILITY_SCREEN_CLEANER 251 -#define ABILITY_STEELY_SPIRIT 252 -#define ABILITY_PERISH_BODY 253 -#define ABILITY_WANDERING_SPIRIT 254 -#define ABILITY_GORILLA_TACTICS 255 -#define ABILITY_NEUTRALIZING_GAS 256 -#define ABILITY_PASTEL_VEIL 257 -#define ABILITY_HUNGER_SWITCH 258 -#define ABILITY_QUICK_DRAW 259 -#define ABILITY_UNSEEN_FIST 260 -#define ABILITY_CURIOUS_MEDICINE 261 -#define ABILITY_TRANSISTOR 262 -#define ABILITY_DRAGONS_MAW 263 -#define ABILITY_CHILLING_NEIGH 264 -#define ABILITY_GRIM_NEIGH 265 -#define ABILITY_AS_ONE_ICE_RIDER 266 -#define ABILITY_AS_ONE_SHADOW_RIDER 267 - -#define ABILITIES_COUNT_GEN8 268 - -// Gen 9 -#define ABILITY_LINGERING_AROMA 268 -#define ABILITY_SEED_SOWER 269 -#define ABILITY_THERMAL_EXCHANGE 270 -#define ABILITY_ANGER_SHELL 271 -#define ABILITY_PURIFYING_SALT 272 -#define ABILITY_WELL_BAKED_BODY 273 -#define ABILITY_WIND_RIDER 274 -#define ABILITY_GUARD_DOG 275 -#define ABILITY_ROCKY_PAYLOAD 276 -#define ABILITY_WIND_POWER 277 -#define ABILITY_ZERO_TO_HERO 278 -#define ABILITY_COMMANDER 279 -#define ABILITY_ELECTROMORPHOSIS 280 -#define ABILITY_PROTOSYNTHESIS 281 -#define ABILITY_QUARK_DRIVE 282 -#define ABILITY_GOOD_AS_GOLD 283 -#define ABILITY_VESSEL_OF_RUIN 284 -#define ABILITY_SWORD_OF_RUIN 285 -#define ABILITY_TABLETS_OF_RUIN 286 -#define ABILITY_BEADS_OF_RUIN 287 -#define ABILITY_ORICHALCUM_PULSE 288 -#define ABILITY_HADRON_ENGINE 289 -#define ABILITY_OPPORTUNIST 290 -#define ABILITY_CUD_CHEW 291 -#define ABILITY_SHARPNESS 292 -#define ABILITY_SUPREME_OVERLORD 293 -#define ABILITY_COSTAR 294 -#define ABILITY_TOXIC_DEBRIS 295 -#define ABILITY_ARMOR_TAIL 296 -#define ABILITY_EARTH_EATER 297 -#define ABILITY_MYCELIUM_MIGHT 298 -#define ABILITY_HOSPITALITY 299 -#define ABILITY_MINDS_EYE 300 -#define ABILITY_EMBODY_ASPECT_TEAL_MASK 301 -#define ABILITY_EMBODY_ASPECT_HEARTHFLAME_MASK 302 -#define ABILITY_EMBODY_ASPECT_WELLSPRING_MASK 303 -#define ABILITY_EMBODY_ASPECT_CORNERSTONE_MASK 304 -#define ABILITY_TOXIC_CHAIN 305 -#define ABILITY_SUPERSWEET_SYRUP 306 -#define ABILITY_TERA_SHIFT 307 -#define ABILITY_TERA_SHELL 308 -#define ABILITY_TERAFORM_ZERO 309 -#define ABILITY_POISON_PUPPETEER 310 - -#define ABILITIES_COUNT_GEN9 311 - -#define ABILITIES_COUNT ABILITIES_COUNT_GEN9 + // Gen 9 + ABILITY_LINGERING_AROMA = ABILITIES_COUNT_GEN8, + ABILITY_SEED_SOWER = 269, + ABILITY_THERMAL_EXCHANGE = 270, + ABILITY_ANGER_SHELL = 271, + ABILITY_PURIFYING_SALT = 272, + ABILITY_WELL_BAKED_BODY = 273, + ABILITY_WIND_RIDER = 274, + ABILITY_GUARD_DOG = 275, + ABILITY_ROCKY_PAYLOAD = 276, + ABILITY_WIND_POWER = 277, + ABILITY_ZERO_TO_HERO = 278, + ABILITY_COMMANDER = 279, + ABILITY_ELECTROMORPHOSIS = 280, + ABILITY_PROTOSYNTHESIS = 281, + ABILITY_QUARK_DRIVE = 282, + ABILITY_GOOD_AS_GOLD = 283, + ABILITY_VESSEL_OF_RUIN = 284, + ABILITY_SWORD_OF_RUIN = 285, + ABILITY_TABLETS_OF_RUIN = 286, + ABILITY_BEADS_OF_RUIN = 287, + ABILITY_ORICHALCUM_PULSE = 288, + ABILITY_HADRON_ENGINE = 289, + ABILITY_OPPORTUNIST = 290, + ABILITY_CUD_CHEW = 291, + ABILITY_SHARPNESS = 292, + ABILITY_SUPREME_OVERLORD = 293, + ABILITY_COSTAR = 294, + ABILITY_TOXIC_DEBRIS = 295, + ABILITY_ARMOR_TAIL = 296, + ABILITY_EARTH_EATER = 297, + ABILITY_MYCELIUM_MIGHT = 298, + ABILITY_HOSPITALITY = 299, + ABILITY_MINDS_EYE = 300, + ABILITY_EMBODY_ASPECT_TEAL_MASK = 301, + ABILITY_EMBODY_ASPECT_HEARTHFLAME_MASK = 302, + ABILITY_EMBODY_ASPECT_WELLSPRING_MASK = 303, + ABILITY_EMBODY_ASPECT_CORNERSTONE_MASK = 304, + ABILITY_TOXIC_CHAIN = 305, + ABILITY_SUPERSWEET_SYRUP = 306, + ABILITY_TERA_SHIFT = 307, + ABILITY_TERA_SHELL = 308, + ABILITY_TERAFORM_ZERO = 309, + ABILITY_POISON_PUPPETEER = 310, + ABILITIES_COUNT_GEN9, + ABILITIES_COUNT = ABILITIES_COUNT_GEN9, +}; #endif // GUARD_CONSTANTS_ABILITIES_H diff --git a/include/constants/apricorn_tree.h b/include/constants/apricorn_tree.h new file mode 100644 index 000000000000..14b111adbd81 --- /dev/null +++ b/include/constants/apricorn_tree.h @@ -0,0 +1,90 @@ +#ifndef GUARD_CONSTANTS_APRICORN_TREE_H +#define GUARD_CONSTANTS_APRICORN_TREE_H + +#include "constants/items.h" + +// Apricorn lookup table, added to allow adding new apricorns without being forced to rearrange the item constants. +enum ApricornType +{ + APRICORN_RED = ITEM_RED_APRICORN, + APRICORN_BLUE = ITEM_BLUE_APRICORN, + APRICORN_YELLOW = ITEM_YELLOW_APRICORN, + APRICORN_GREEN = ITEM_GREEN_APRICORN, + APRICORN_PINK = ITEM_PINK_APRICORN, + APRICORN_WHITE = ITEM_WHITE_APRICORN, + APRICORN_BLACK = ITEM_BLACK_APRICORN, + APRICORN_BERRY_CHERI = ITEM_CHERI_BERRY, + APRICORN_BERRY_CHESTO = ITEM_CHESTO_BERRY, + APRICORN_BERRY_PECHA = ITEM_PECHA_BERRY, + APRICORN_BERRY_RAWST = ITEM_RAWST_BERRY, + APRICORN_BERRY_ASPEAR = ITEM_ASPEAR_BERRY, + APRICORN_BERRY_LEPPA = ITEM_LEPPA_BERRY, + APRICORN_BERRY_ORAN = ITEM_ORAN_BERRY, + APRICORN_BERRY_PERSIM = ITEM_PERSIM_BERRY, + APRICORN_BERRY_LUM = ITEM_LUM_BERRY, + APRICORN_BERRY_SITRUS = ITEM_SITRUS_BERRY, + APRICORN_BERRY_FIGY = ITEM_FIGY_BERRY, + APRICORN_BERRY_WIKI = ITEM_WIKI_BERRY, + APRICORN_BERRY_MAGO = ITEM_MAGO_BERRY, + APRICORN_BERRY_AGUAV = ITEM_AGUAV_BERRY, + APRICORN_BERRY_IAPAPA = ITEM_IAPAPA_BERRY, + APRICORN_BERRY_RAZZ = ITEM_RAZZ_BERRY, + APRICORN_BERRY_BLUK = ITEM_BLUK_BERRY, + APRICORN_BERRY_NANAB = ITEM_NANAB_BERRY, + APRICORN_BERRY_WEPEAR = ITEM_WEPEAR_BERRY, + APRICORN_BERRY_PINAP = ITEM_PINAP_BERRY, + APRICORN_BERRY_POMEG = ITEM_POMEG_BERRY, + APRICORN_BERRY_KELPSY = ITEM_KELPSY_BERRY, + APRICORN_BERRY_QUALOT = ITEM_QUALOT_BERRY, + APRICORN_BERRY_HONDEW = ITEM_HONDEW_BERRY, + APRICORN_BERRY_GREPA = ITEM_GREPA_BERRY, + APRICORN_BERRY_TAMATO = ITEM_TAMATO_BERRY, + APRICORN_BERRY_CORNN = ITEM_CORNN_BERRY, + APRICORN_BERRY_MAGOST = ITEM_MAGOST_BERRY, + APRICORN_BERRY_RABUTA = ITEM_RABUTA_BERRY, + APRICORN_BERRY_NOMEL = ITEM_NOMEL_BERRY, + APRICORN_BERRY_SPELON = ITEM_SPELON_BERRY, + APRICORN_BERRY_PAMTRE = ITEM_PAMTRE_BERRY, + APRICORN_BERRY_WATMEL = ITEM_WATMEL_BERRY, + APRICORN_BERRY_DURIN = ITEM_DURIN_BERRY, + APRICORN_BERRY_BELUE = ITEM_BELUE_BERRY, + APRICORN_BERRY_OCCA = ITEM_OCCA_BERRY, + APRICORN_BERRY_PASSHO = ITEM_PASSHO_BERRY, + APRICORN_BERRY_WACAN = ITEM_WACAN_BERRY, + APRICORN_BERRY_RINDO = ITEM_RINDO_BERRY, + APRICORN_BERRY_YACHE = ITEM_YACHE_BERRY, + APRICORN_BERRY_CHOPLE = ITEM_CHOPLE_BERRY, + APRICORN_BERRY_KEBIA = ITEM_KEBIA_BERRY, + APRICORN_BERRY_SHUCA = ITEM_SHUCA_BERRY, + APRICORN_BERRY_COBA = ITEM_COBA_BERRY, + APRICORN_BERRY_PAYAPA = ITEM_PAYAPA_BERRY, + APRICORN_BERRY_TANGA = ITEM_TANGA_BERRY, + APRICORN_BERRY_CHARTI = ITEM_CHARTI_BERRY, + APRICORN_BERRY_KASIB = ITEM_KASIB_BERRY, + APRICORN_BERRY_HABAN = ITEM_HABAN_BERRY, + APRICORN_BERRY_COLBUR = ITEM_COLBUR_BERRY, + APRICORN_BERRY_BABIRI = ITEM_BABIRI_BERRY, + APRICORN_BERRY_CHILAN = ITEM_CHILAN_BERRY, + APRICORN_BERRY_LIECHI = ITEM_LIECHI_BERRY, + APRICORN_BERRY_GANLON = ITEM_GANLON_BERRY, + APRICORN_BERRY_SALAC = ITEM_SALAC_BERRY, + APRICORN_BERRY_PETAYA = ITEM_PETAYA_BERRY, + APRICORN_BERRY_APICOT = ITEM_APICOT_BERRY, + APRICORN_BERRY_LANSAT = ITEM_LANSAT_BERRY, + APRICORN_BERRY_STARF = ITEM_STARF_BERRY, + APRICORN_BERRY_ENIGMA = ITEM_ENIGMA_BERRY, + APRICORN_BERRY_MICLE = ITEM_MICLE_BERRY, + APRICORN_BERRY_CUSTAP = ITEM_CUSTAP_BERRY, + APRICORN_BERRY_JABOCA = ITEM_JABOCA_BERRY, + APRICORN_BERRY_ROWAP = ITEM_ROWAP_BERRY, + APRICORN_BERRY_ROSELI = ITEM_ROSELI_BERRY, + APRICORN_BERRY_KEE = ITEM_KEE_BERRY, + APRICORN_BERRY_MARANGA = ITEM_MARANGA_BERRY, +}; + +// Trees +#define APRICORN_TREE_NONE 0 + +#define APRICORN_TREE_COUNT 0 + +#endif //GUARD_CONSTANTS_APRICORN_TREE_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 39f2dbd236bf..97639edfd154 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -1,6 +1,8 @@ #ifndef GUARD_CONSTANTS_BATTLE_H #define GUARD_CONSTANTS_BATTLE_H +#include "constants/moves.h" + /* * A battler may be in one of four positions on the field. The first bit determines * what side the battler is on, either the player's side or the opponent's side. @@ -45,9 +47,17 @@ enum BattlerId #define BATTLE_OPPOSITE(id) ((id) ^ BIT_SIDE) #define BATTLE_PARTNER(id) ((id) ^ BIT_FLANK) -#define B_SIDE_PLAYER 0 -#define B_SIDE_OPPONENT 1 -#define NUM_BATTLE_SIDES 2 +// Left and right are determined by how they're referred to in tests and everywhere else. +// Left is battlers 0 and 1, right 2 and 3; if you assume the battler referencing them is south, left is to the northeast and right to the northwest. +#define LEFT_FOE(battler) ((BATTLE_OPPOSITE(battler)) & BIT_SIDE) +#define RIGHT_FOE(battler) (((BATTLE_OPPOSITE(battler)) & BIT_SIDE) | BIT_FLANK) + +enum BattleSide +{ + B_SIDE_PLAYER = 0, + B_SIDE_OPPONENT = 1, + NUM_BATTLE_SIDES = 2, +}; #define B_FLANK_LEFT 0 #define B_FLANK_RIGHT 1 @@ -95,10 +105,16 @@ enum BattlerId | BATTLE_TYPE_LEGENDARY \ | BATTLE_TYPE_RECORDED | BATTLE_TYPE_TRAINER_HILL | BATTLE_TYPE_SECRET_BASE)) -#define WILD_DOUBLE_BATTLE ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER)))) -#define RECORDED_WILD_BATTLE ((gBattleTypeFlags & BATTLE_TYPE_RECORDED) && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FRONTIER))) -#define BATTLE_TWO_VS_ONE_OPPONENT ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && TRAINER_BATTLE_PARAM.opponentB == 0xFFFF)) -#define BATTLE_TYPE_HAS_AI (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_SAFARI | BATTLE_TYPE_ROAMER | BATTLE_TYPE_INGAME_PARTNER) +#define WILD_DOUBLE_BATTLE ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER)))) +#define RECORDED_WILD_BATTLE ((gBattleTypeFlags & BATTLE_TYPE_RECORDED) && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FRONTIER))) +#define BATTLE_TWO_VS_ONE_OPPONENT ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && TRAINER_BATTLE_PARAM.opponentB == 0xFFFF)) +#define BATTLE_TYPE_HAS_AI (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_SAFARI | BATTLE_TYPE_ROAMER | BATTLE_TYPE_INGAME_PARTNER) +#define BATTLE_TYPE_MORE_THAN_TWO_BATTLERS (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_TWO_OPPONENTS) +#define BATTLE_TYPE_PLAYER_HAS_PARTNER (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_TOWER_LINK_MULTI) + +// Multibattle test composite flags +#define BATTLE_MULTI_TEST (BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS) +#define BATTLE_TWO_VS_ONE_TEST (BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI) // Battle Outcome defines #define B_OUTCOME_WON 1 @@ -132,133 +148,167 @@ enum BattlerId #define STATUS1_PSN_ANY (STATUS1_POISON | STATUS1_TOXIC_POISON) #define STATUS1_ANY (STATUS1_SLEEP | STATUS1_POISON | STATUS1_BURN | STATUS1_FREEZE | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON | STATUS1_FROSTBITE) -#define STATUS1_REFRESH (STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON | STATUS1_FROSTBITE) - -// Volatile status ailments -// These are removed after exiting the battle or switching out -#define STATUS2_CONFUSION (1 << 0 | 1 << 1 | 1 << 2) -#define STATUS2_CONFUSION_TURN(num) ((num) << 0) -#define STATUS2_FLINCHED (1 << 3) -#define STATUS2_UPROAR (1 << 4 | 1 << 5 | 1 << 6) -#define STATUS2_UPROAR_TURN(num) ((num) << 4) -#define STATUS2_TORMENT (1 << 7) -#define STATUS2_BIDE (1 << 8 | 1 << 9) -#define STATUS2_BIDE_TURN(num) (((num) << 8) & STATUS2_BIDE) -#define STATUS2_LOCK_CONFUSE (1 << 10 | 1 << 11) // e.g. Thrash -#define STATUS2_LOCK_CONFUSE_TURN(num)((num) << 10) -#define STATUS2_MULTIPLETURNS (1 << 12) -#define STATUS2_WRAPPED (1 << 13) -#define STATUS2_POWDER (1 << 14) -#define STATUS2_INFATUATION (1 << 16 | 1 << 17 | 1 << 18 | 1 << 19) // 4 bits, one for every battler -#define STATUS2_INFATUATED_WITH(battler) (1u << (battler + 16)) -#define STATUS2_DEFENSE_CURL (1 << 20) -#define STATUS2_TRANSFORMED (1 << 21) -#define STATUS2_RECHARGE (1 << 22) -#define STATUS2_RAGE (1 << 23) -#define STATUS2_SUBSTITUTE (1 << 24) -#define STATUS2_DESTINY_BOND (1 << 25) -#define STATUS2_ESCAPE_PREVENTION (1 << 26) -#define STATUS2_NIGHTMARE (1 << 27) -#define STATUS2_CURSED (1 << 28) -#define STATUS2_FORESIGHT (1 << 29) -#define STATUS2_DRAGON_CHEER (1 << 30) -#define STATUS2_FOCUS_ENERGY (1 << 31) -#define STATUS2_FOCUS_ENERGY_ANY (STATUS2_DRAGON_CHEER | STATUS2_FOCUS_ENERGY) - -#define STATUS3_LEECHSEED_BATTLER (1 << 0 | 1 << 1) // The battler to receive HP from Leech Seed -#define STATUS3_LEECHSEED (1 << 2) -#define STATUS3_ALWAYS_HITS (1 << 3 | 1 << 4) -#define STATUS3_ALWAYS_HITS_TURN(num) (((num) << 3) & STATUS3_ALWAYS_HITS) // "Always Hits" is set as a 2 turn timer, i.e. next turn is the last turn when it's active -#define STATUS3_PERISH_SONG (1 << 5) -#define STATUS3_ON_AIR (1 << 6) -#define STATUS3_UNDERGROUND (1 << 7) -#define STATUS3_MINIMIZED (1 << 8) -#define STATUS3_CHARGED_UP (1 << 9) -#define STATUS3_ROOTED (1 << 10) -#define STATUS3_YAWN (1 << 11 | 1 << 12) // Number of turns to sleep -#define STATUS3_YAWN_TURN(num) (((num) << 11) & STATUS3_YAWN) -#define STATUS3_IMPRISONED_OTHERS (1 << 13) -#define STATUS3_GRUDGE (1 << 14) -#define STATUS3_COMMANDER (1 << 15) -#define STATUS3_GASTRO_ACID (1 << 16) -#define STATUS3_EMBARGO (1 << 17) -#define STATUS3_UNDERWATER (1 << 18) -#define STATUS3_UNUSED_19 (1 << 19) -#define STATUS3_UNUSED_20 (1 << 20) -#define STATUS3_SMACKED_DOWN (1 << 21) -#define STATUS3_UNUSED_22 (1 << 22) -#define STATUS3_TELEKINESIS (1 << 23) -#define STATUS3_PHANTOM_FORCE (1 << 24) -#define STATUS3_MIRACLE_EYED (1 << 25) -#define STATUS3_MAGNET_RISE (1 << 26) -#define STATUS3_HEAL_BLOCK (1 << 27) -#define STATUS3_AQUA_RING (1 << 28) -#define STATUS3_LASER_FOCUS (1 << 29) -#define STATUS3_POWER_TRICK (1 << 30) -#define STATUS3_SKY_DROPPED (1 << 31) // Target of Sky Drop -#define STATUS3_SEMI_INVULNERABLE_NO_COMMANDER (STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER | STATUS3_PHANTOM_FORCE) // Exception for Transform / Imposter -#define STATUS3_SEMI_INVULNERABLE (STATUS3_SEMI_INVULNERABLE_NO_COMMANDER | STATUS3_COMMANDER) - -#define STATUS4_ELECTRIFIED (1 << 0) -#define STATUS4_MUD_SPORT (1 << 1) // Only used if B_SPORT_TURNS < GEN_6 -#define STATUS4_WATER_SPORT (1 << 2) // Only used if B_SPORT_TURNS < GEN_6 -#define STATUS4_INFINITE_CONFUSION (1 << 3) // Used for Berserk Gene -#define STATUS4_SALT_CURE (1 << 4) -#define STATUS4_SYRUP_BOMB (1 << 5) -#define STATUS4_GLAIVE_RUSH (1 << 6) - -#define HITMARKER_UNUSED_1 (1 << 4) -#define HITMARKER_IGNORE_BIDE (1 << 5) -#define HITMARKER_DESTINYBOND (1 << 6) +#define STATUS1_CAN_MOVE (STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON | STATUS1_FROSTBITE) +#define STATUS1_INCAPACITATED (STATUS1_SLEEP | STATUS1_FREEZE) +#define STATUS1_ICY_ANY (STATUS1_FREEZE | STATUS1_FROSTBITE) +#define STATUS1_DAMAGING (STATUS1_PSN_ANY | STATUS1_BURN | STATUS1_FROSTBITE) + +enum VolatileFlags +{ + V_BATON_PASSABLE = (1 << 0), +}; + +/* Volatile status ailments + * These are removed after exiting the battle or switching + * Enum, Type Type, max value, flags */ +#define VOLATILE_DEFINITIONS(F) \ + F(VOLATILE_CONFUSION, confusionTurns, (u32, 6), V_BATON_PASSABLE) \ + F(VOLATILE_FLINCHED, flinched, (u32, 1)) \ + F(VOLATILE_UPROAR, uproarTurns, (u32, 5)) \ + F(VOLATILE_TORMENT, torment, (u32, 1)) \ + F(VOLATILE_BIDE, bideTurns, (u32, 3)) \ + F(VOLATILE_LOCK_CONFUSE, lockConfusionTurns, (u32, 3)) \ + F(VOLATILE_MULTIPLETURNS, multipleTurns, (u32, 1)) \ + F(VOLATILE_WRAPPED, wrapped, (u32, 1)) \ + F(VOLATILE_WRAPPED_BY, wrappedBy, (enum BattlerId, MAX_BITS(4))) \ + F(VOLATILE_WRAPPED_MOVE, wrappedMove, (u32, MOVES_COUNT_ALL - 1)) \ + F(VOLATILE_POWDER, powder, (u32, 1)) \ + F(VOLATILE_UNUSED, padding, (u32, 1)) \ + F(VOLATILE_INFATUATION, infatuation, (enum BattlerId, MAX_BITS(4))) \ + F(VOLATILE_DEFENSE_CURL, defenseCurl, (u32, 1)) \ + F(VOLATILE_TRANSFORMED, transformed, (u32, 1)) \ + F(VOLATILE_RAGE, rage, (u32, 1)) \ + F(VOLATILE_SUBSTITUTE, substitute, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_DESTINY_BOND, destinyBond, (u32, 2)) \ + F(VOLATILE_ESCAPE_PREVENTION, escapePrevention, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_NIGHTMARE, nightmare, (u32, 1)) \ + F(VOLATILE_CURSED, cursed, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_FORESIGHT, foresight, (u32, 1)) \ + F(VOLATILE_DRAGON_CHEER, dragonCheer, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_FOCUS_ENERGY, focusEnergy, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_BONUS_CRIT_STAGES, bonusCritStages, (u32, 3)) \ + F(VOLATILE_SEMI_INVULNERABLE, semiInvulnerable, (u32, SEMI_INVULNERABLE_COUNT - 1)) \ + F(VOLATILE_ELECTRIFIED, electrified, (u32, 1)) \ + F(VOLATILE_MUD_SPORT, mudSport, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_WATER_SPORT, waterSport, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_INFINITE_CONFUSION, infiniteConfusion, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_SALT_CURE, saltCure, (u32, 1)) \ + F(VOLATILE_SYRUP_BOMB, syrupBomb, (u32, 1)) \ + F(VOLATILE_STICKY_SYRUPED_BY, stickySyrupedBy, (enum BattlerId, MAX_BITS(4))) \ + F(VOLATILE_GLAIVE_RUSH, glaiveRush, (u32, 1)) \ + F(VOLATILE_LEECH_SEED, leechSeed, (enum BattlerId, MAX_BITS(4)), V_BATON_PASSABLE) \ + F(VOLATILE_LOCK_ON, lockOn, (u32, 2), V_BATON_PASSABLE) \ + F(VOLATILE_PERISH_SONG, perishSong, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_MINIMIZE, minimize, (u32, 1)) \ + F(VOLATILE_CHARGE_TIMER, chargeTimer, (u32, 2)) \ + F(VOLATILE_ROOT, root, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_YAWN, yawn, (u32, 2)) \ + F(VOLATILE_IMPRISON, imprison, (u32, 1)) \ + F(VOLATILE_GRUDGE, grudge, (u32, 1)) \ + F(VOLATILE_GASTRO_ACID, gastroAcid, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_EMBARGO, embargo, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_SMACK_DOWN, smackDown, (u32, 1)) \ + F(VOLATILE_TELEKINESIS, telekinesis, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_MIRACLE_EYE, miracleEye, (u32, 1)) \ + F(VOLATILE_MAGNET_RISE, magnetRise, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_HEAL_BLOCK, healBlock, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_AQUA_RING, aquaRing, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_LASER_FOCUS, laserFocus, (u32, 1)) \ + F(VOLATILE_POWER_TRICK, powerTrick, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_NO_RETREAT, noRetreat, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_VESSEL_OF_RUIN, vesselOfRuin, (u32, 1)) \ + F(VOLATILE_SWORD_OF_RUIN, swordOfRuin, (u32, 1)) \ + F(VOLATILE_TABLETS_OF_RUIN, tabletsOfRuin, (u32, 1)) \ + F(VOLATILE_BEADS_OF_RUIN, beadsOfRuin, (u32, 1)) + + +/* Use within a macro to get the maximum allowed value for a volatile. Requires _typeMaxValue as input. */ +#define GET_VOLATILE_MAXIMUM(_typeMaxValue, ...) INVOKE_WITH_B(GET_VOLATILE_MAXIMUM_, _typeMaxValue) +#define GET_VOLATILE_MAXIMUM_(_type, ...) FIRST(__VA_OPT__(FIRST(__VA_ARGS__),) MAX_BITS((sizeof(_type) * 8))) + +#define UNPACK_VOLATILE_ENUMS(_enum, ...) _enum, + +enum Volatile +{ + VOLATILE_NONE, + VOLATILE_DEFINITIONS(UNPACK_VOLATILE_ENUMS) + /* Expands to VOLATILE_CONFUSION, VOLATILE_FLINCHED, etc. */ +}; + +// Helper macros +#define INFATUATED_WITH(battler) (battler + 1) +#define LEECHSEEDED_BY(battler) (battler + 1) + +enum SemiInvulnerableState +{ + STATE_NONE, + STATE_UNDERGROUND, + STATE_UNDERWATER, + STATE_ON_AIR, + STATE_PHANTOM_FORCE, + STATE_SKY_DROP, + STATE_COMMANDER, + SEMI_INVULNERABLE_COUNT, +}; + +enum SemiInvulnerableExclusion +{ + CHECK_ALL, + EXCLUDE_COMMANDER, +}; + #define HITMARKER_NO_ANIMATIONS (1 << 7) // set from battleSceneOff. Never changed during battle -#define HITMARKER_IGNORE_SUBSTITUTE (1 << 8) -#define HITMARKER_NO_ATTACKSTRING (1 << 9) -#define HITMARKER_ATTACKSTRING_PRINTED (1 << 10) -#define HITMARKER_NO_PPDEDUCT (1 << 11) -#define HITMARKER_UNUSED_2 (1 << 12) -#define HITMARKER_STATUS_ABILITY_EFFECT (1 << 13) -#define HITMARKER_SYNCHRONIZE_EFFECT (1 << 14) +#define HITMARKER_UNUSED_8 (1 << 8) +#define HITMARKER_UNUSED_9 (1 << 9) +#define HITMARKER_UNUSED_10 (1 << 10) +#define HITMARKER_UNUSED_11 (1 << 11) +#define HITMARKER_UNUSED_12 (1 << 12) +#define HITMARKER_UNUSED_13 (1 << 13) +#define HITMARKER_UNUSED_14 (1 << 14) #define HITMARKER_RUN (1 << 15) -#define HITMARKER_IGNORE_DISGUISE (1 << 16) +#define HITMARKER_UNUSED_16 (1 << 16) #define HITMARKER_DISABLE_ANIMATION (1 << 17) // disable animations during battle scripts, e.g. for Bug Bite -#define HITMARKER_UNUSED_3 (1 << 18) +#define HITMARKER_UNUSED_18 (1 << 18) #define HITMARKER_UNABLE_TO_USE_MOVE (1 << 19) -#define HITMARKER_PASSIVE_DAMAGE (1 << 20) -#define HITMARKER_UNUSED_4 (1 << 21) +#define HITMARKER_UNUSED_20 (1 << 20) +#define HITMARKER_UNUSED_21 (1 << 21) #define HITMARKER_PLAYER_FAINTED (1 << 22) -#define HITMARKER_ALLOW_NO_PP (1 << 23) -#define HITMARKER_GRUDGE (1 << 24) +#define HITMARKER_UNUSED_23 (1 << 23) +#define HITMARKER_UNUSED_24 (1 << 24) #define HITMARKER_OBEYS (1 << 25) -#define HITMARKER_UNUSED_5 (1 << 26) -#define HITMARKER_CHARGING (1 << 27) -#define HITMARKER_FAINTED(battler) (1u << (battler + 28)) -#define HITMARKER_FAINTED2(battler) HITMARKER_FAINTED(battler) -#define HITMARKER_STRING_PRINTED (1 << 29) +#define HITMARKER_UNUSED_26 (1 << 26) +#define HITMARKER_UNUSED_27 (1 << 27) +#define HITMARKER_FAINTED(battler) (1u << (battler + 28)) // Also uses bits 29, 30 and 31 // Per-side statuses that affect an entire party #define SIDE_STATUS_REFLECT (1 << 0) #define SIDE_STATUS_LIGHTSCREEN (1 << 1) -#define SIDE_STATUS_STICKY_WEB (1 << 2) -#define SIDE_STATUS_SPIKES (1 << 4) -#define SIDE_STATUS_SAFEGUARD (1 << 5) -#define SIDE_STATUS_FUTUREATTACK (1 << 6) -#define SIDE_STATUS_MIST (1 << 8) -// (1 << 9) previously was SIDE_STATUS_SPIKES_DAMAGED -#define SIDE_STATUS_TAILWIND (1 << 10) -#define SIDE_STATUS_AURORA_VEIL (1 << 11) -#define SIDE_STATUS_LUCKY_CHANT (1 << 12) -#define SIDE_STATUS_TOXIC_SPIKES (1 << 13) -#define SIDE_STATUS_STEALTH_ROCK (1 << 14) -// Missing flags previously were SIDE_STATUS_TOXIC_SPIKES_DAMAGED, SIDE_STATUS_STEALTH_ROCK_DAMAGED, SIDE_STATUS_STICKY_WEB_DAMAGED -#define SIDE_STATUS_STEELSURGE (1 << 18) -#define SIDE_STATUS_DAMAGE_NON_TYPES (1 << 19) -#define SIDE_STATUS_RAINBOW (1 << 20) -#define SIDE_STATUS_SEA_OF_FIRE (1 << 21) -#define SIDE_STATUS_SWAMP (1 << 22) - -#define SIDE_STATUS_HAZARDS_ANY (SIDE_STATUS_SPIKES | SIDE_STATUS_STICKY_WEB | SIDE_STATUS_TOXIC_SPIKES | SIDE_STATUS_STEALTH_ROCK | SIDE_STATUS_STEELSURGE) +#define SIDE_STATUS_SAFEGUARD (1 << 2) +#define SIDE_STATUS_MIST (1 << 3) +#define SIDE_STATUS_TAILWIND (1 << 4) +#define SIDE_STATUS_AURORA_VEIL (1 << 5) +#define SIDE_STATUS_LUCKY_CHANT (1 << 6) +#define SIDE_STATUS_DAMAGE_NON_TYPES (1 << 7) +#define SIDE_STATUS_RAINBOW (1 << 8) +#define SIDE_STATUS_SEA_OF_FIRE (1 << 9) +#define SIDE_STATUS_SWAMP (1 << 10) + #define SIDE_STATUS_SCREEN_ANY (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL) #define SIDE_STATUS_PLEDGE_ANY (SIDE_STATUS_RAINBOW | SIDE_STATUS_SEA_OF_FIRE | SIDE_STATUS_SWAMP) +#define SIDE_STATUS_GOOD_FOG (SIDE_STATUS_SCREEN_ANY | SIDE_STATUS_SAFEGUARD | SIDE_STATUS_MIST) +#define SIDE_STATUS_GOOD_COURT (SIDE_STATUS_GOOD_FOG | SIDE_STATUS_TAILWIND | SIDE_STATUS_LUCKY_CHANT | SIDE_STATUS_RAINBOW) +#define SIDE_STATUS_BAD_COURT (SIDE_STATUS_DAMAGE_NON_TYPES | SIDE_STATUS_SEA_OF_FIRE | SIDE_STATUS_SWAMP) + +enum Hazards +{ + HAZARDS_NONE, + HAZARDS_SPIKES, + HAZARDS_STICKY_WEB, + HAZARDS_TOXIC_SPIKES, + HAZARDS_STEALTH_ROCK, + HAZARDS_STEELSURGE, + HAZARDS_MAX_COUNT, +}; // Used for damaging entry hazards based on type enum TypeSideHazard @@ -294,6 +344,7 @@ enum TypeSideHazard #define MOVE_RESULT_FOE_HUNG_ON (1 << 7) #define MOVE_RESULT_STURDIED (1 << 8) #define MOVE_RESULT_FOE_ENDURED_AFFECTION (1 << 9) +#define MOVE_RESULT_SYNCHRONOISE_AFFECTED (1 << 10) #define MOVE_RESULT_NO_EFFECT (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED) enum BattleWeather @@ -327,24 +378,27 @@ enum BattleWeather #define B_WEATHER_STRONG_WINDS (1 << BATTLE_WEATHER_STRONG_WINDS) #define B_WEATHER_ANY (B_WEATHER_RAIN | B_WEATHER_SANDSTORM | B_WEATHER_SUN | B_WEATHER_HAIL | B_WEATHER_STRONG_WINDS | B_WEATHER_SNOW | B_WEATHER_FOG) +#define B_WEATHER_DAMAGING_ANY (B_WEATHER_HAIL | B_WEATHER_SANDSTORM) +#define B_WEATHER_ICY_ANY (B_WEATHER_HAIL | B_WEATHER_SNOW) +#define B_WEATHER_LOW_LIGHT (B_WEATHER_FOG | B_WEATHER_ICY_ANY | B_WEATHER_RAIN | B_WEATHER_SANDSTORM) #define B_WEATHER_PRIMAL_ANY (B_WEATHER_RAIN_PRIMAL | B_WEATHER_SUN_PRIMAL | B_WEATHER_STRONG_WINDS) -enum MoveEffects +// Explicit numbers until frostbite because those shouldn't be shifted +enum __attribute__((packed)) MoveEffect { - MOVE_EFFECT_NONE, - MOVE_EFFECT_SLEEP, - MOVE_EFFECT_POISON, - MOVE_EFFECT_BURN, - MOVE_EFFECT_FREEZE, - MOVE_EFFECT_PARALYSIS, - MOVE_EFFECT_TOXIC, - MOVE_EFFECT_FROSTBITE, + MOVE_EFFECT_NONE = 0, + MOVE_EFFECT_SLEEP = 1, + MOVE_EFFECT_POISON = 2, + MOVE_EFFECT_BURN = 3, + MOVE_EFFECT_FREEZE = 4, + MOVE_EFFECT_PARALYSIS = 5, + MOVE_EFFECT_TOXIC = 6, + MOVE_EFFECT_FROSTBITE = 7, MOVE_EFFECT_CONFUSION, MOVE_EFFECT_FLINCH, MOVE_EFFECT_TRI_ATTACK, MOVE_EFFECT_UPROAR, MOVE_EFFECT_PAYDAY, - MOVE_EFFECT_CHARGING, MOVE_EFFECT_WRAP, MOVE_EFFECT_ATK_PLUS_1, MOVE_EFFECT_DEF_PLUS_1, @@ -363,7 +417,6 @@ enum MoveEffects MOVE_EFFECT_REMOVE_ARG_TYPE, MOVE_EFFECT_RECHARGE, MOVE_EFFECT_RAGE, - MOVE_EFFECT_STEAL_ITEM, MOVE_EFFECT_PREVENT_ESCAPE, MOVE_EFFECT_NIGHTMARE, MOVE_EFFECT_ALL_STATS_UP, @@ -399,8 +452,6 @@ enum MoveEffects MOVE_EFFECT_TRAP_BOTH, MOVE_EFFECT_ROUND, MOVE_EFFECT_DIRE_CLAW, - MOVE_EFFECT_STEALTH_ROCK, - MOVE_EFFECT_SPIKES, MOVE_EFFECT_SYRUP_BOMB, MOVE_EFFECT_FLORAL_HEALING, MOVE_EFFECT_SECRET_POWER, @@ -414,6 +465,11 @@ enum MoveEffects MOVE_EFFECT_LIGHT_SCREEN, MOVE_EFFECT_SALT_CURE, MOVE_EFFECT_EERIE_SPELL, + + // Max move effects happen earlier in the execution chain. + // For example stealth rock from G-Max Stonesurge is set up before abilities but from Stone Axe after. + // Stone Axe can also fail to set up rocks if user faints where as Stonesurge will always go up. + // This means we need to be careful if we want to re-use those effects for (new) vanilla moves MOVE_EFFECT_RAISE_TEAM_ATTACK, MOVE_EFFECT_RAISE_TEAM_DEFENSE, MOVE_EFFECT_RAISE_TEAM_SPEED, @@ -455,51 +511,66 @@ enum MoveEffects MOVE_EFFECT_LOWER_EVASIVENESS_SIDE, MOVE_EFFECT_AROMATHERAPY, MOVE_EFFECT_CONFUSE_SIDE, - MOVE_EFFECT_STEELSURGE, + MOVE_EFFECT_STEELSURGE, // Steel type rocks + MOVE_EFFECT_STEALTH_ROCK, // Max Move rocks, not to be confused for rocks set up from Ceasless Edge (same but differ in execution order) MOVE_EFFECT_TORMENT_SIDE, MOVE_EFFECT_LOWER_SPEED_2_SIDE, MOVE_EFFECT_FIRE_SPIN_SIDE, MOVE_EFFECT_FIXED_POWER, + // Max move effects end. They can be used for (custom) normal moves. + NUM_MOVE_EFFECTS }; -#define PRIMARY_STATUS_MOVE_EFFECT MOVE_EFFECT_FROSTBITE // All above move effects apply primary status #if B_USE_FROSTBITE == TRUE #define MOVE_EFFECT_FREEZE_OR_FROSTBITE MOVE_EFFECT_FROSTBITE #else #define MOVE_EFFECT_FREEZE_OR_FROSTBITE MOVE_EFFECT_FREEZE #endif -#define MOVE_EFFECT_AFFECTS_USER 0x2000 -#define MOVE_EFFECT_CERTAIN 0x4000 #define MOVE_EFFECT_CONTINUE 0x8000 // Battle environment defines for gBattleEnvironment. -#define BATTLE_ENVIRONMENT_GRASS 0 -#define BATTLE_ENVIRONMENT_LONG_GRASS 1 -#define BATTLE_ENVIRONMENT_SAND 2 -#define BATTLE_ENVIRONMENT_UNDERWATER 3 -#define BATTLE_ENVIRONMENT_WATER 4 -#define BATTLE_ENVIRONMENT_POND 5 -#define BATTLE_ENVIRONMENT_MOUNTAIN 6 -#define BATTLE_ENVIRONMENT_CAVE 7 -#define BATTLE_ENVIRONMENT_BUILDING 8 -#define BATTLE_ENVIRONMENT_PLAIN 9 -// New battle environments are used for Secret Power but not fully implemented. -#define BATTLE_ENVIRONMENT_SOARING 10 -#define BATTLE_ENVIRONMENT_SKY_PILLAR 11 -#define BATTLE_ENVIRONMENT_BURIAL_GROUND 12 -#define BATTLE_ENVIRONMENT_PUDDLE 13 -#define BATTLE_ENVIRONMENT_MARSH 14 -#define BATTLE_ENVIRONMENT_SWAMP 15 -#define BATTLE_ENVIRONMENT_SNOW 16 -#define BATTLE_ENVIRONMENT_ICE 17 -#define BATTLE_ENVIRONMENT_VOLCANO 18 -#define BATTLE_ENVIRONMENT_DISTORTION_WORLD 19 -#define BATTLE_ENVIRONMENT_SPACE 20 -#define BATTLE_ENVIRONMENT_ULTRA_SPACE 21 - -#define BATTLE_ENVIRONMENT_COUNT 22 +enum BattleEnvironments +{ + BATTLE_ENVIRONMENT_GRASS, + BATTLE_ENVIRONMENT_LONG_GRASS, + BATTLE_ENVIRONMENT_SAND, + BATTLE_ENVIRONMENT_UNDERWATER, + BATTLE_ENVIRONMENT_WATER, + BATTLE_ENVIRONMENT_POND, + BATTLE_ENVIRONMENT_MOUNTAIN, + BATTLE_ENVIRONMENT_CAVE, + BATTLE_ENVIRONMENT_BUILDING, + BATTLE_ENVIRONMENT_PLAIN, + BATTLE_ENVIRONMENT_FRONTIER, + BATTLE_ENVIRONMENT_GYM, + BATTLE_ENVIRONMENT_LEADER, + BATTLE_ENVIRONMENT_MAGMA, + BATTLE_ENVIRONMENT_AQUA, + BATTLE_ENVIRONMENT_SIDNEY, + BATTLE_ENVIRONMENT_PHOEBE, + BATTLE_ENVIRONMENT_GLACIA, + BATTLE_ENVIRONMENT_DRAKE, + BATTLE_ENVIRONMENT_CHAMPION, + BATTLE_ENVIRONMENT_GROUDON, + BATTLE_ENVIRONMENT_KYOGRE, + BATTLE_ENVIRONMENT_RAYQUAZA, + // New battle environments are used for Secret Power but not fully implemented. + BATTLE_ENVIRONMENT_SOARING, + BATTLE_ENVIRONMENT_SKY_PILLAR, + BATTLE_ENVIRONMENT_BURIAL_GROUND, + BATTLE_ENVIRONMENT_PUDDLE, + BATTLE_ENVIRONMENT_MARSH, + BATTLE_ENVIRONMENT_SWAMP, + BATTLE_ENVIRONMENT_SNOW, + BATTLE_ENVIRONMENT_ICE, + BATTLE_ENVIRONMENT_VOLCANO, + BATTLE_ENVIRONMENT_DISTORTION_WORLD, + BATTLE_ENVIRONMENT_SPACE, + BATTLE_ENVIRONMENT_ULTRA_SPACE, + BATTLE_ENVIRONMENT_COUNT, +}; #define B_WAIT_TIME_LONG (B_WAIT_TIME_MULTIPLIER * 4) #define B_WAIT_TIME_MED (B_WAIT_TIME_MULTIPLIER * 3) @@ -587,6 +658,17 @@ enum MoveEffects // Constants for Torment #define PERMANENT_TORMENT 0xF +enum FaintedActions +{ + FAINTED_ACTIONS_NO_MONS_TO_SWITCH, + FAINTED_ACTIONS_GIVE_EXP, + FAINTED_ACTIONS_SET_ABSENT_FLAGS, + FAINTED_ACTIONS_WAIT_STATE, + FAINTED_ACTIONS_HANDLE_FAINTED_MON, + FAINTED_ACTIONS_HANDLE_NEXT_BATTLER, + FAINTED_ACTIONS_MAX_CASE, +}; + // Constants for B_VAR_STARTING_STATUS // Timer value controlled by B_VAR_STARTING_STATUS_TIMER enum StartingStatus @@ -621,4 +703,18 @@ enum MonState MON_OUTSIDE_BATTLE, }; +enum __attribute__((packed)) CalcDamageState +{ + CAN_DAMAGE, + WILL_FAIL, + CHECK_ACCURACY, +}; + +enum SubmoveState +{ + SUBMOVE_NO_EFFECT, + SUBMOVE_SUCCESS, + SUBMOVE_FAILURE, +}; + #endif // GUARD_CONSTANTS_BATTLE_H diff --git a/include/constants/battle_ai.h b/include/constants/battle_ai.h index 2f97ab22342b..89cfd08ed014 100644 --- a/include/constants/battle_ai.h +++ b/include/constants/battle_ai.h @@ -3,52 +3,54 @@ // AI Flags. Most run specific functions to update score, new flags are used for internal logic in other scripts // See docs/ai_flags.md for more details. -#define AI_FLAG_CHECK_BAD_MOVE (1 << 0) // AI will avoid using moves that are likely to fail or be ineffective in the current situation. -#define AI_FLAG_TRY_TO_FAINT (1 << 1) // AI will prioritize KOing the player's mon if able. -#define AI_FLAG_CHECK_VIABILITY (1 << 2) // AI damaging moves and move effects to determine the best available move in the current situation. -#define AI_FLAG_FORCE_SETUP_FIRST_TURN (1 << 3) // AI will prioritize using setup moves on the first turn at the expensve of all else. AI_FLAG_CHECK_VIABILITY will instead do this when the AI determines it makes sense. -#define AI_FLAG_RISKY (1 << 4) // AI will generally behave more recklessly, prioritizing damage over accuracy, explosions, etc. -#define AI_FLAG_TRY_TO_2HKO (1 << 5) // AI adds score bonus to any move the AI has that either OHKOs or 2HKOs the player. -#define AI_FLAG_PREFER_BATON_PASS (1 << 6) // AI prefers raising its own stats and setting for / using Baton Pass. -#define AI_FLAG_DOUBLE_BATTLE (1 << 7) // Automatically set for double battles, handles AI behaviour with partner. -#define AI_FLAG_HP_AWARE (1 << 8) // AI will favour certain move effects based on how much remaining HP it and the player's mon have. -#define AI_FLAG_POWERFUL_STATUS (1 << 9) // AI prefers moves that set up field effects or side statuses, even if the user can faint the target. +#define AI_FLAG(x) ((u64)1 << x) + +#define AI_FLAG_CHECK_BAD_MOVE AI_FLAG(0) // AI will avoid using moves that are likely to fail or be ineffective in the current situation. +#define AI_FLAG_TRY_TO_FAINT AI_FLAG(1) // AI will prioritize KOing the player's mon if able. +#define AI_FLAG_CHECK_VIABILITY AI_FLAG(2) // AI damaging moves and move effects to determine the best available move in the current situation. +#define AI_FLAG_FORCE_SETUP_FIRST_TURN AI_FLAG(3) // AI will prioritize using setup moves on the first turn at the expensve of all else. AI_FLAG_CHECK_VIABILITY will instead do this when the AI determines it makes sense. +#define AI_FLAG_RISKY AI_FLAG(4) // AI will generally behave more recklessly, prioritizing damage over accuracy, explosions, etc. +#define AI_FLAG_TRY_TO_2HKO AI_FLAG(5) // AI adds score bonus to any move the AI has that either OHKOs or 2HKOs the player. +#define AI_FLAG_PREFER_BATON_PASS AI_FLAG(6) // AI prefers raising its own stats and setting for / using Baton Pass. +#define AI_FLAG_DOUBLE_BATTLE AI_FLAG(7) // Automatically set for double battles, handles AI behaviour with partner. +#define AI_FLAG_HP_AWARE AI_FLAG(8) // AI will favour certain move effects based on how much remaining HP it and the player's mon have. +#define AI_FLAG_POWERFUL_STATUS AI_FLAG(9) // AI prefers moves that set up field effects or side statuses, even if the user can faint the target. // New, Trainer Handicap Flags -#define AI_FLAG_NEGATE_UNAWARE (1 << 10) // AI is NOT aware of negating effects like wonder room, mold breaker, etc. -#define AI_FLAG_WILL_SUICIDE (1 << 11) // AI will use explosion / self destruct / final gambit / etc. +#define AI_FLAG_NEGATE_UNAWARE AI_FLAG(10) // AI is NOT aware of negating effects like wonder room, mold breaker, etc. +#define AI_FLAG_WILL_SUICIDE AI_FLAG(11) // AI will use explosion / self destruct / final gambit / etc. // New, Trainer Strategy Flags -#define AI_FLAG_PREFER_STATUS_MOVES (1 << 12) // AI gets a score bonus for status moves. Should be combined with AI_FLAG_CHECK_BAD_MOVE to prevent using only status moves. -#define AI_FLAG_STALL (1 << 13) // AI stalls battle and prefers secondary damage/trapping/etc. TODO not finished. -#define AI_FLAG_SMART_SWITCHING (1 << 14) // AI includes a lot more switching checks. Automatically includes AI_FLAG_SMART_MON_CHOICES. -#define AI_FLAG_ACE_POKEMON (1 << 15) // AI has an Ace Pokemon. The last Pokemon in the party will not be used until it's the last one remaining. -#define AI_FLAG_OMNISCIENT (1 << 16) // AI has full knowledge of player moves, abilities, hold items. -#define AI_FLAG_SMART_MON_CHOICES (1 << 17) // AI will make smarter decisions when choosing which mon to send out mid-battle and after a KO, which are separate decisions. Automatically included by AI_FLAG_SMART_SWITCHING. -#define AI_FLAG_CONSERVATIVE (1 << 18) // AI assumes all moves will low roll damage. -#define AI_FLAG_SEQUENCE_SWITCHING (1 << 19) // AI switches in mons in exactly party order, and never switches mid-battle. -#define AI_FLAG_DOUBLE_ACE_POKEMON (1 << 20) // AI has *two* Ace PokΓ©mon. The last two PokΓ©mons in the party won't be used unless they're the last ones remaining. Goes well in battles where the trainer ID equals to twins, couples, etc. -#define AI_FLAG_WEIGH_ABILITY_PREDICTION (1 << 21) // AI will predict player's ability based on aiRating -#define AI_FLAG_PREFER_HIGHEST_DAMAGE_MOVE (1 << 22) // AI adds score to highest damage move regardless of accuracy or secondary effect -#define AI_FLAG_PREDICT_SWITCH (1 << 23) // AI will predict the player's switches and switchins based on how it would handle the situation. Recommend using AI_FLAG_OMNISCIENT -#define AI_FLAG_PREDICT_INCOMING_MON (1 << 24) // AI will score against the predicting incoming mon if it predicts the player to switch. Requires AI_FLAG_PREDICT_SWITCH -#define AI_FLAG_PP_STALL_PREVENTION (1 << 25) // AI keeps track of the player's switches where the incoming mon is immune to the chosen move -#define AI_FLAG_PREDICT_MOVE (1 << 26) // AI will predict the player's move based on what move it would use in the same situation. Recommend using AI_FLAG_OMNISCIENT - -// Flags at and after 32 need different formatting, as in -// #define AI_FLAG_PLACEHOLDER ((u64)1 << 32) - - -#define AI_FLAG_COUNT 27 +#define AI_FLAG_PREFER_STATUS_MOVES AI_FLAG(12) // AI gets a score bonus for status moves. Should be combined with AI_FLAG_CHECK_BAD_MOVE to prevent using only status moves. +#define AI_FLAG_STALL AI_FLAG(13) // AI stalls battle and prefers secondary damage/trapping/etc. TODO not finished. +#define AI_FLAG_SMART_SWITCHING AI_FLAG(14) // AI includes a lot more switching checks. Automatically includes AI_FLAG_SMART_MON_CHOICES. +#define AI_FLAG_ACE_POKEMON AI_FLAG(15) // AI has an Ace Pokemon. The last Pokemon in the party will not be used until it's the last one remaining. +#define AI_FLAG_OMNISCIENT AI_FLAG(16) // AI has full knowledge of player moves, abilities, hold items. +#define AI_FLAG_SMART_MON_CHOICES AI_FLAG(17) // AI will make smarter decisions when choosing which mon to send out mid-battle and after a KO, which are separate decisions. Automatically included by AI_FLAG_SMART_SWITCHING. +#define AI_FLAG_CONSERVATIVE AI_FLAG(18) // AI assumes all moves will low roll damage. +#define AI_FLAG_SEQUENCE_SWITCHING AI_FLAG(19) // AI switches in mons in exactly party order, and never switches mid-battle. +#define AI_FLAG_DOUBLE_ACE_POKEMON AI_FLAG(20) // AI has *two* Ace PokΓ©mon. The last two PokΓ©mons in the party won't be used unless they're the last ones remaining. Goes well in battles where the trainer ID equals to twins, couples, etc. +#define AI_FLAG_WEIGH_ABILITY_PREDICTION AI_FLAG(21) // AI will predict player's ability based on aiRating +#define AI_FLAG_PREFER_HIGHEST_DAMAGE_MOVE AI_FLAG(22) // AI adds score to highest damage move regardless of accuracy or secondary effect +#define AI_FLAG_PREDICT_SWITCH AI_FLAG(23) // AI will predict the player's switches and switchins based on how it would handle the situation. Recommend using AI_FLAG_OMNISCIENT +#define AI_FLAG_PREDICT_INCOMING_MON AI_FLAG(24) // AI will score against the predicting incoming mon if it predicts the player to switch. Requires AI_FLAG_PREDICT_SWITCH +#define AI_FLAG_PP_STALL_PREVENTION AI_FLAG(25) // AI keeps track of the player's switches where the incoming mon is immune to the chosen move +#define AI_FLAG_PREDICT_MOVE AI_FLAG(26) // AI will predict the player's move based on what move it would use in the same situation. Recommend using AI_FLAG_OMNISCIENT +#define AI_FLAG_SMART_TERA AI_FLAG(27) // AI will make smarter decisions when choosing whether to terrastalize (default is to always tera whenever available). +#define AI_FLAG_ASSUME_STAB AI_FLAG(28) // AI knows player's STAB moves, but nothing else. Restricted version of AI_FLAG_OMNISCIENT. +#define AI_FLAG_ASSUME_STATUS_MOVES AI_FLAG(29) // AI has a chance to know certain non-damaging moves, and also Fake Out and Super Fang. Restricted version of AI_FLAG_OMNISCIENT. +#define AI_FLAG_ATTACKS_PARTNER AI_FLAG(30) // AI specific to double battles; AI can deliberately attack its 'partner.' +#define AI_FLAG_KNOW_OPPONENT_PARTY AI_FLAG(31) // AI knows all the species in the player's party, but not moves/items/abilities unless they've been seen. // The following options are enough to have a basic/smart trainer. Any other addtion could make the trainer worse/better depending on the flag #define AI_FLAG_BASIC_TRAINER (AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY) -#define AI_FLAG_SMART_TRAINER (AI_FLAG_BASIC_TRAINER | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION) +#define AI_FLAG_SMART_TRAINER (AI_FLAG_BASIC_TRAINER | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION | AI_FLAG_SMART_TERA) #define AI_FLAG_PREDICTION (AI_FLAG_PREDICT_SWITCH | AI_FLAG_PREDICT_INCOMING_MON | AI_FLAG_PREDICT_MOVE) +#define AI_FLAG_ASSUMPTIONS (AI_FLAG_ASSUME_STAB | AI_FLAG_ASSUME_STATUS_MOVES | AI_FLAG_WEIGH_ABILITY_PREDICTION) // 'other' ai logic flags -#define AI_FLAG_DYNAMIC_FUNC ((u64)1 << 60) // Create custom AI functions for specific battles via "setdynamicaifunc" cmd -#define AI_FLAG_ROAMING ((u64)1 << 61) -#define AI_FLAG_SAFARI ((u64)1 << 62) -#define AI_FLAG_FIRST_BATTLE ((u64)1 << 63) +#define AI_FLAG_DYNAMIC_FUNC AI_FLAG(60) // Create custom AI functions for specific battles via "setdynamicaifunc" cmd +#define AI_FLAG_ROAMING AI_FLAG(61) +#define AI_FLAG_SAFARI AI_FLAG(62) +#define AI_FLAG_FIRST_BATTLE AI_FLAG(63) #define AI_SCORE_DEFAULT 100 // Default score for all AI moves. diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index c85dcc9fe79e..6ac604798f57 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -419,6 +419,10 @@ #define ANIM_TAG_PINKVIO_ORB (ANIM_SPRITES_START + 405) #define ANIM_TAG_STARSTORM (ANIM_SPRITES_START + 406) #define ANIM_TAG_SALT_PARTICLE (ANIM_SPRITES_START + 407) +#define ANIM_TAG_TERA_SYMBOL (ANIM_SPRITES_START + 408) +#define ANIM_TAG_TATSUGIRI_CURLY (ANIM_SPRITES_START + 409) +#define ANIM_TAG_TATSUGIRI_DROOPY (ANIM_SPRITES_START + 410) +#define ANIM_TAG_TATSUGIRI_STRETCHY (ANIM_SPRITES_START + 411) // battlers #define ANIM_ATTACKER 0 @@ -529,8 +533,9 @@ #define BG_STEEL_BEAM_OPPONENT 78 #define BG_STEEL_BEAM_PLAYER 79 #define BG_CHLOROBLAST 80 -#define BG_RAINBOW 81 -#define BG_SWAMP 82 +#define BG_RAINBOW_PLAYER 81 +#define BG_RAINBOW_OPPONENT 82 +#define BG_SWAMP 83 // table ids for general animations (sBattleAnims_General) #define B_ANIM_STATS_CHANGE 0 @@ -587,8 +592,9 @@ #define B_ANIM_TERA_ACTIVATE 51 #define B_ANIM_SIMPLE_HEAL 52 #define B_ANIM_POWER_CONSTRUCT 53 - -#define NUM_B_ANIMS_GENERAL 54 +#define B_ANIM_SWAP_TO_SUBSTITUTE 54 +#define B_ANIM_SWAP_FROM_SUBSTITUTE 55 +#define NUM_B_ANIMS_GENERAL 56 // special animations table (sBattleAnims_Special) #define B_ANIM_LVL_UP 0 @@ -612,8 +618,9 @@ #define B_ANIM_STATUS_FRZ 6 #define B_ANIM_STATUS_CURSED 7 #define B_ANIM_STATUS_NIGHTMARE 8 +#define B_ANIM_STATUS_FRB 9 -#define NUM_B_ANIMS_STATUS 9 +#define NUM_B_ANIMS_STATUS 10 // Tasks with return values often assign them to gBattleAnimArgs[7]. #define ARG_RET_ID 7 @@ -657,6 +664,20 @@ #define ANIM_SURF_PAL_MUDDY_WATER 1 #define ANIM_SURF_PAL_SLUDGE_WAVE 2 +// Order Up palettes for Commander +#define ANIM_ORDER_UP_NONE 0 +#define ANIM_ORDER_UP_CURLY 1 +#define ANIM_ORDER_UP_DROOPY 2 +#define ANIM_ORDER_UP_STRETCHY 3 + +// AnimTask_TransformMon variations +enum SpeciesGfxChange +{ + SPECIES_GFX_CHANGE_TRANSFORM, + SPECIES_GFX_CHANGE_FORM_CHANGE, + SPECIES_GFX_CHANGE_ILLUSION_OFF, +}; + // Flags given to various functions to indicate which palettes to consider. // Handled by UnpackSelectedBattlePalettes #define F_PAL_BG (1 << 0) diff --git a/include/constants/battle_end_turn.h b/include/constants/battle_end_turn.h new file mode 100644 index 000000000000..81c0409ecda8 --- /dev/null +++ b/include/constants/battle_end_turn.h @@ -0,0 +1,92 @@ +#ifndef GUARD_CONSTANTS_BATTLE_END_TURN_H +#define GUARD_CONSTANTS_BATTLE_END_TURN_H + +// General End Turn Effects based on research from smogon from vanilla games: +// https://www.smogon.com/forums/threads/sword-shield-battle-mechanics-research.3655528/page-64#post-9244179 +enum EndTurnResolutionOrder +{ + ENDTURN_ORDER, + ENDTURN_VARIOUS, + ENDTURN_WEATHER, + ENDTURN_WEATHER_DAMAGE, + ENDTURN_EMERGENCY_EXIT_1, + ENDTURN_AFFECTION, + ENDTURN_FUTURE_SIGHT, + ENDTURN_WISH, + ENDTURN_FIRST_EVENT_BLOCK, + ENDTURN_EMERGENCY_EXIT_2, + ENDTURN_AQUA_RING, + ENDTURN_INGRAIN, + ENDTURN_LEECH_SEED, + ENDTURN_POISON, + ENDTURN_BURN, + ENDTURN_FROSTBITE, + ENDTURN_NIGHTMARE, + ENDTURN_CURSE, + ENDTURN_WRAP, + ENDTURN_SALT_CURE, + ENDTURN_OCTOLOCK, + ENDTURN_SYRUP_BOMB, + ENDTURN_TAUNT, + ENDTURN_TORMENT, + ENDTURN_ENCORE, + ENDTURN_DISABLE, + ENDTURN_MAGNET_RISE, + ENDTURN_TELEKINESIS, + ENDTURN_HEAL_BLOCK, + ENDTURN_EMBARGO, + ENDTURN_YAWN, + ENDTURN_PERISH_SONG, + ENDTURN_ROOST, + ENDTURN_EMERGENCY_EXIT_3, + ENDTURN_SECOND_EVENT_BLOCK, + ENDTURN_TRICK_ROOM, + ENDTURN_GRAVITY, + ENDTURN_WATER_SPORT, + ENDTURN_MUD_SPORT, + ENDTURN_WONDER_ROOM, + ENDTURN_MAGIC_ROOM, + ENDTURN_TERRAIN, + ENDTURN_THIRD_EVENT_BLOCK, + ENDTURN_EMERGENCY_EXIT_4, + ENDTURN_FORM_CHANGE_ABILITIES, + ENDTURN_EJECT_PACK, + ENDTURN_DYNAMAX, + ENDTURN_COUNT, +}; + +// Block that handles effects for each individual battler on the field (eg residual damage) +enum FirstEventBlock +{ + FIRST_EVENT_BLOCK_GMAX_MOVE_RESIDUAL, // Needs to be split + FIRST_EVENT_BLOCK_SEA_OF_FIRE_DAMAGE, + FIRST_EVENT_BLOCK_THRASH, // Thrash isn't handled here in vanilla but for now it is that best place for it. + FIRST_EVENT_BLOCK_GRASSY_TERRAIN_HEAL, + FIRST_EVENT_BLOCK_ABILITIES, + FIRST_EVENT_BLOCK_HEAL_ITEMS, +}; + +// Block that tries to remove side statuses +enum SecondEventBlock +{ + SECOND_EVENT_BLOCK_REFLECT, + SECOND_EVENT_BLOCK_LIGHT_SCREEN, + SECOND_EVENT_BLOCK_SAFEGUARD, + SECOND_EVENT_BLOCK_MIST, + SECOND_EVENT_BLOCK_TAILWIND, + SECOND_EVENT_BLOCK_LUCKY_CHANT, + SECOND_EVENT_BLOCK_RAINBOW, + SECOND_EVENT_BLOCK_SEA_OF_FIRE, + SECOND_EVENT_BLOCK_SWAMP, + SECOND_EVENT_BLOCK_AURORA_VEIL, +}; + +// Block that handles Uproar, items and non-form changing abilities +enum ThirdEventBlock +{ + THIRD_EVENT_BLOCK_UPROAR, + THIRD_EVENT_BLOCK_ABILITIES, + THIRD_EVENT_BLOCK_ITEMS, +}; + +#endif // GUARD_CONSTANTS_BATTLE_END_TURN_H diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index d081d3a16302..d1d76756031e 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -1,14 +1,15 @@ #ifndef GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H #define GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H -enum BattleMoveEffects +enum __attribute__((packed)) BattleMoveEffects { EFFECT_PLACEHOLDER, EFFECT_HIT, EFFECT_NON_VOLATILE_STATUS, EFFECT_ABSORB, EFFECT_EXPLOSION, - EFFECT_DREAM_EATER, + EFFECT_MISTY_EXPLOSION, // Same as EFFECT_EXPLOSION but it's boosted on Misty Terrain + EFFECT_DREAM_EATER, // Same as EFFECT_ABSORB but it can only be used on sleeping targets EFFECT_MIRROR_MOVE, EFFECT_ATTACK_UP, EFFECT_DEFENSE_UP, @@ -34,9 +35,10 @@ enum BattleMoveEffects EFFECT_LIGHT_SCREEN, EFFECT_REST, EFFECT_OHKO, + EFFECT_SHEER_COLD, // Same as EFFECT_OHKO but Ice-types are immune to it and has decreased accuracy for non Ice-type users. EFFECT_FUSION_COMBO, - EFFECT_SUPER_FANG, - EFFECT_FIXED_DAMAGE_ARG, + EFFECT_FIXED_PERCENT_DAMAGE, + EFFECT_FIXED_HP_DAMAGE, EFFECT_HEAL_BLOCK, EFFECT_RECOIL_IF_MISS, EFFECT_MIST, @@ -90,6 +92,7 @@ enum BattleMoveEffects EFFECT_MINIMIZE, EFFECT_CURSE, EFFECT_HEALING_WISH, + EFFECT_LUNAR_DANCE, // Same as EFFECT_HEALING_WISH, but also heals PP. EFFECT_PROTECT, EFFECT_SPIKES, EFFECT_FORESIGHT, @@ -131,7 +134,7 @@ enum BattleMoveEffects EFFECT_STOCKPILE, EFFECT_SPIT_UP, EFFECT_SWALLOW, - EFFECT_WORRY_SEED, + EFFECT_OVERWRITE_ABILITY, EFFECT_HAIL, EFFECT_TORMENT, EFFECT_FLATTER, @@ -155,6 +158,7 @@ enum BattleMoveEffects EFFECT_BRICK_BREAK, EFFECT_YAWN, EFFECT_KNOCK_OFF, + EFFECT_STEAL_ITEM, EFFECT_ENDEAVOR, EFFECT_POWER_BASED_ON_USER_HP, EFFECT_SKILL_SWAP, @@ -215,7 +219,6 @@ enum BattleMoveEffects EFFECT_METAL_BURST, EFFECT_LUCKY_CHANT, EFFECT_SUCKER_PUNCH, - EFFECT_SIMPLE_BEAM, EFFECT_ENTRAINMENT, EFFECT_HEAL_PULSE, EFFECT_QUASH, @@ -279,7 +282,6 @@ enum BattleMoveEffects EFFECT_GEOMANCY, EFFECT_FAIRY_LOCK, EFFECT_ALLY_SWITCH, - EFFECT_RELIC_SONG, EFFECT_BODY_PRESS, EFFECT_JUNGLE_HEALING, EFFECT_COACHING, @@ -307,10 +309,8 @@ enum BattleMoveEffects EFFECT_BEAK_BLAST, EFFECT_COURT_CHANGE, EFFECT_MAX_HP_50_RECOIL, - EFFECT_MIND_BLOWN, // Same as EFFECT_MAX_HP_50_RECOIL but is cancelled by Damp EFFECT_CHLOROBLAST, // Same effect as EFFECT_MAX_HP_50_RECOIL but follows the same rules as EFFECT_RECOIL EFFECT_EXTREME_EVOBOOST, - EFFECT_HIT_SET_REMOVE_TERRAIN, EFFECT_DARK_VOID, EFFECT_VICTORY_DANCE, EFFECT_TEATIME, @@ -342,13 +342,17 @@ enum BattleMoveEffects EFFECT_TERA_BLAST, EFFECT_TERA_STARSTORM, EFFECT_DRAGON_DARTS, - EFFECT_GUARDIAN_OF_ALOLA, EFFECT_SHELL_SIDE_ARM, EFFECT_ORDER_UP, EFFECT_RAPID_SPIN, EFFECT_SPECTRAL_THIEF, EFFECT_RECOIL, EFFECT_SMACK_DOWN, + EFFECT_LIFE_DEW, + EFFECT_ICE_SPINNER, // Removes terrain unless attacker is removed from field either by fainting or ejected out + EFFECT_STEEL_ROLLER, // Will fail if there is no terrain up but removes it regardless if attacker is removed from field or not + EFFECT_STONE_AXE, // Not to be confused with MOVE_EFFECT_STEALTH_ROCK. They have two different activation timings. + EFFECT_CEASELESS_EDGE, // Same applies to spikes NUM_BATTLE_MOVE_EFFECTS, }; diff --git a/include/constants/battle_pyramid.h b/include/constants/battle_pyramid.h index ac80a2d7d399..08fa695cf298 100644 --- a/include/constants/battle_pyramid.h +++ b/include/constants/battle_pyramid.h @@ -43,7 +43,7 @@ #define BATTLE_PYRAMID_FUNC_SET_TRAINERS 9 #define BATTLE_PYRAMID_FUNC_SHOW_HINT_TEXT 10 #define BATTLE_PYRAMID_FUNC_UPDATE_STREAK 11 // unused -#define BATTLE_PYRAMID_FUNC_IS_IN 12 +#define BATTLE_PYRAMID_FUNC_CURRENT_LOCATION 12 #define BATTLE_PYRAMID_FUNC_UPDATE_LIGHT 13 #define BATTLE_PYRAMID_FUNC_CLEAR_HELD_ITEMS 14 #define BATTLE_PYRAMID_FUNC_SET_FLOOR_PALETTE 15 @@ -62,4 +62,8 @@ #define PYRAMID_LIGHT_SET_RADIUS 0 #define PYRAMID_LIGHT_INCR_RADIUS 1 +#define PYRAMID_LOCATION_NONE 0 // Not in the Pyramid +#define PYRAMID_LOCATION_FLOOR 1 +#define PYRAMID_LOCATION_TOP 2 + #endif // GUARD_CONSTANTS_BATTLE_PYRAMID_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 2b0287be40ea..234ebad0b21b 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -31,9 +31,9 @@ #define sSPECIAL_TRAINER_BATTLE_TYPE (gBattleScripting + 0x26) // specialTrainerBattleType #define sMON_CAUGHT (gBattleScripting + 0x27) // monCaught #define sSAVED_DMG (gBattleScripting + 0x28) // savedDmg -#define sSAVED_MOVE_EFFECT (gBattleScripting + 0x2C) // savedMoveEffect +#define sUNUSED_0x2C (gBattleScripting + 0x2C) // unused_0x2c #define sMOVE_EFFECT (gBattleScripting + 0x2E) // moveEffect -#define sMULTIHIT_EFFECT (gBattleScripting + 0x30) // multihitMoveEffect +#define sUNUSED_0x30 (gBattleScripting + 0x30) // unused_0x30 #define sILLUSION_NICK_HACK (gBattleScripting + 0x32) // illusionNickHack #define sFIXED_ABILITY_POPUP (gBattleScripting + 0x33) // fixedPopup #define sABILITY_OVERWRITE (gBattleScripting + 0x34) // abilityPopupOverwrite @@ -88,150 +88,31 @@ #define CMP_COMMON_BITS 4 #define CMP_NO_COMMON_BITS 5 +// Veriouses have been deprecated but the enum and function will be supported for one more release cycle enum CmdVarious { - VARIOUS_CANCEL_MULTI_TURN_MOVES, - VARIOUS_IS_RUNNING_IMPOSSIBLE, - VARIOUS_GET_MOVE_TARGET, - VARIOUS_GET_BATTLER_FAINTED, - VARIOUS_RESET_SWITCH_IN_ABILITY_BITS, - VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP, - VARIOUS_RESET_PLAYER_FAINTED, - VARIOUS_PALACE_FLAVOR_TEXT, - VARIOUS_ARENA_JUDGMENT_WINDOW, - VARIOUS_ARENA_OPPONENT_MON_LOST, - VARIOUS_ARENA_PLAYER_MON_LOST, - VARIOUS_ARENA_BOTH_MONS_LOST, - VARIOUS_EMIT_YESNOBOX, - VARIOUS_DRAW_ARENA_REF_TEXT_BOX, - VARIOUS_ERASE_ARENA_REF_TEXT_BOX, - VARIOUS_ARENA_JUDGMENT_STRING, - VARIOUS_ARENA_WAIT_STRING, - VARIOUS_WAIT_CRY, - VARIOUS_RETURN_OPPONENT_MON1, - VARIOUS_RETURN_OPPONENT_MON2, - VARIOUS_VOLUME_DOWN, - VARIOUS_VOLUME_UP, - VARIOUS_SET_ALREADY_STATUS_MOVE_ATTEMPT, - VARIOUS_PALACE_TRY_ESCAPE_STATUS, - VARIOUS_SET_TELEPORT_OUTCOME, - VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC, - VARIOUS_STAT_TEXT_BUFFER, - VARIOUS_SWITCHIN_ABILITIES, - VARIOUS_INSTANT_HP_DROP, - VARIOUS_CLEAR_STATUS, - VARIOUS_RESTORE_PP, - VARIOUS_PLAY_MOVE_ANIMATION, - VARIOUS_SET_LUCKY_CHANT, - VARIOUS_SUCKER_PUNCH_CHECK, - VARIOUS_SET_SIMPLE_BEAM, - VARIOUS_TRY_ENTRAINMENT, - VARIOUS_SET_LAST_USED_ABILITY, - VARIOUS_INVERT_STAT_STAGES, - VARIOUS_TRY_ME_FIRST, - VARIOUS_JUMP_IF_BATTLE_END, - VARIOUS_TRY_ELECTRIFY, - VARIOUS_TRY_SOAK, - VARIOUS_TRY_LAST_RESORT, - VARIOUS_TRY_AUTOTOMIZE, - VARIOUS_ABILITY_POPUP, - VARIOUS_JUMP_IF_TARGET_ALLY, - VARIOUS_TRY_SYNCHRONOISE, - VARIOUS_PSYCHO_SHIFT, - VARIOUS_CURE_STATUS, - VARIOUS_POWER_TRICK, - VARIOUS_AFTER_YOU, - VARIOUS_BESTOW, - VARIOUS_JUMP_IF_NOT_GROUNDED, - VARIOUS_HANDLE_TRAINER_SLIDE_MSG, - VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF, - VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON, - VARIOUS_SET_AURORA_VEIL, - VARIOUS_TRY_THIRD_TYPE, - VARIOUS_ACUPRESSURE, - VARIOUS_SET_POWDER, - VARIOUS_GRAVITY_ON_AIRBORNE_MONS, - VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS, - VARIOUS_JUMP_IF_ROAR_FAILS, - VARIOUS_TRY_INSTRUCT, - VARIOUS_JUMP_IF_NOT_BERRY, - VARIOUS_TRACE_ABILITY, - VARIOUS_UPDATE_NICK, - VARIOUS_TRY_ILLUSION_OFF, - VARIOUS_SET_SPRITEIGNORE0HP, - VARIOUS_HANDLE_FORM_CHANGE, - VARIOUS_GET_STAT_VALUE, - VARIOUS_JUMP_IF_FULL_HP, - VARIOUS_LOSE_TYPE, - VARIOUS_TRY_ACTIVATE_SOULHEART, - VARIOUS_TRY_ACTIVATE_RECEIVER, - VARIOUS_TRY_FRISK, - VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED, - VARIOUS_TRY_FAIRY_LOCK, - VARIOUS_JUMP_IF_NO_ALLY, - VARIOUS_JUMP_IF_HOLD_EFFECT, - VARIOUS_INFATUATE_WITH_BATTLER, - VARIOUS_SET_LAST_USED_ITEM, - VARIOUS_JUMP_IF_ABSENT, - VARIOUS_DESTROY_ABILITY_POPUP, - VARIOUS_TOTEM_BOOST, - VARIOUS_MOVEEND_ITEM_EFFECTS, - VARIOUS_TERRAIN_SEED, - VARIOUS_MAKE_INVISIBLE, - VARIOUS_ROOM_SERVICE, - VARIOUS_JUMP_IF_TEAM_HEALTHY, - VARIOUS_TRY_HEAL_QUARTER_HP, - VARIOUS_JUMP_IF_PRANKSTER_BLOCKED, - VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER, - VARIOUS_GET_ROTOTILLER_TARGETS, - VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED, - VARIOUS_CONSUME_BERRY, - VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL, - VARIOUS_JUMP_IF_SPECIES, - VARIOUS_UPDATE_ABILITY_POPUP, - VARIOUS_JUMP_IF_WEATHER_AFFECTED, - VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED, - VARIOUS_SET_ATTACKER_STICKY_WEB_USER, - VARIOUS_TRY_NO_RETREAT, - VARIOUS_CHECK_POLTERGEIST, - VARIOUS_CUT_1_3_HP_RAISE_STATS, - VARIOUS_TRY_END_NEUTRALIZING_GAS, - VARIOUS_JUMP_IF_UNDER_200, - VARIOUS_SET_SKY_DROP, - VARIOUS_CLEAR_SKY_DROP, - VARIOUS_SKY_DROP_YAWN, - VARIOUS_CURE_CERTAIN_STATUSES, - VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES, - VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY, - VARIOUS_SAVE_BATTLER_ITEM, - VARIOUS_RESTORE_BATTLER_ITEM, - VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM, + VARIOUS_NONE, }; // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 1 -#define DMG_DOUBLED 2 -#define DMG_1_8_TARGET_HP 3 -#define DMG_FULL_ATTACKER_HP 4 -#define DMG_CURR_ATTACKER_HP 5 -#define DMG_BIG_ROOT 6 +#define DMG_1_8_TARGET_HP 2 +#define DMG_FULL_ATTACKER_HP 3 +#define DMG_BIG_ROOT 4 // Cmd_jumpifcantswitch #define SWITCH_IGNORE_ESCAPE_PREVENTION (1 << 7) // Cmd_statbuffchange -#define STAT_CHANGE_ALLOW_PTR (1 << 0) // If set, allow use of jumpptr. Set in every use of statbuffchange +#define STAT_CHANGE_ALLOW_PTR (1 << 0) // If set, allow use of jumpptr. If not set and unable to raise/lower stats, jump to failInstr. #define STAT_CHANGE_MIRROR_ARMOR (1 << 1) // Stat change redirection caused by Mirror Armor ability. -#define STAT_CHANGE_NOT_PROTECT_AFFECTED (1 << 5) -#define STAT_CHANGE_UPDATE_MOVE_EFFECT (1 << 6) +#define STAT_CHANGE_ONLY_CHECKING (1 << 2) // Checks if the stat change can occur. Does not change stats or play stat change animation. +#define STAT_CHANGE_NOT_PROTECT_AFFECTED (1 << 3) +#define STAT_CHANGE_UPDATE_MOVE_EFFECT (1 << 4) +#define STAT_CHANGE_CHECK_PREVENTION (1 << 5) +#define STAT_CHANGE_CERTAIN (1 << 6) -// stat change flags for Cmd_playstatchangeanimation -#define STAT_CHANGE_NEGATIVE (1 << 0) -#define STAT_CHANGE_BY_TWO (1 << 1) -#define STAT_CHANGE_MULTIPLE_STATS (1 << 2) -#define STAT_CHANGE_CANT_PREVENT (1 << 3) - -// stat flags for Cmd_playstatchangeanimation +// stat flags for TryPlayStatChangeAnimation #define BIT_HP (1 << 0) #define BIT_ATK (1 << 1) #define BIT_DEF (1 << 2) @@ -243,53 +124,69 @@ enum CmdVarious #define PARTY_SCREEN_OPTIONAL (1 << 7) // Flag for first argument to openpartyscreen -// cases for Cmd_moveend +enum SetMoveEffectFlags +{ + NO_FLAGS = 0, + EFFECT_PRIMARY = (1 << 0), + EFFECT_CERTAIN = (1 << 1), +}; + +// cases for Cmd_moveend - Order matters! enum MoveEndEffects { - MOVEEND_SUM_DAMAGE, + MOVEEND_SET_VALUES, MOVEEND_PROTECT_LIKE_EFFECT, + MOVEEND_GRUDGE, + MOVEEND_DESTINY_BOND, MOVEEND_ABSORB, MOVEEND_RAGE, MOVEEND_SYNCHRONIZE_TARGET, MOVEEND_ABILITIES, MOVEEND_ABILITIES_ATTACKER, - MOVEEND_STATUS_IMMUNITY_ABILITIES, + MOVEEND_STATUS_IMMUNITY_ABILITIES, // TODO: Do berries come before???? MOVEEND_SYNCHRONIZE_ATTACKER, - MOVEEND_CHOICE_MOVE, MOVEEND_ATTACKER_INVISIBLE, MOVEEND_ATTACKER_VISIBLE, MOVEEND_TARGET_VISIBLE, MOVEEND_ITEM_EFFECTS_TARGET, - MOVEEND_FIRST_MOVE_BLOCK, - MOVEEND_ITEM_EFFECTS_ALL, + MOVEEND_ITEM_EFFECTS_ATTACKER_1, MOVEEND_SYMBIOSIS, - MOVEEND_KINGSROCK, // These item effects will occur each strike of a multi-hit move MOVEEND_SUBSTITUTE, MOVEEND_SKY_DROP_CONFUSE, MOVEEND_UPDATE_LAST_MOVES, MOVEEND_MIRROR_MOVE, MOVEEND_DEFROST, MOVEEND_NEXT_TARGET, // Everything up until here is handled for each strike of a spread move + MOVEEND_HP_THRESHHOLD_ITEMS_TARGET, // Activation only during a multi hit move / ability (Parental Bond) MOVEEND_MULTIHIT_MOVE, - MOVEEND_SECOND_MOVE_BLOCK, - MOVEEND_ITEM_EFFECTS_ATTACKER, + MOVEEND_MOVE_BLOCK, + MOVEEND_ITEM_EFFECTS_ATTACKER_2, MOVEEND_ABILITY_BLOCK, - MOVEEND_SHEER_FORCE, // If move is Sheer Force affected, skip until Opportunist - MOVEEND_RED_CARD, // Red Card triggers before Eject Pack + MOVEEND_SHEER_FORCE, // If move is Sheer Force affected, skip to Hit Escape + One + MOVEEND_COLOR_CHANGE, // Color Change / Berserk / Anger Shell + MOVEEND_KEE_MARANGA_HP_THRESHOLD_ITEM_TARGET, + MOVEEND_RED_CARD, MOVEEND_EJECT_BUTTON, - MOVEEND_LIFEORB_SHELLBELL, // Includes shell bell, throat spray, etc + MOVEEND_LIFE_ORB_SHELL_BELL, + MOVEEND_FORM_CHANGE, MOVEEND_EMERGENCY_EXIT, MOVEEND_EJECT_PACK, MOVEEND_HIT_ESCAPE, - MOVEEND_OPPORTUNIST, // Occurs after other stat change items/abilities to try and copy the boosts - MOVEEND_PICKPOCKET, + MOVEEND_ITEMS_EFFECTS_ALL, MOVEEND_WHITE_HERB, + MOVEEND_OPPORTUNIST, + MOVEEND_MIRROR_HERB, + MOVEEND_PICKPOCKET, + MOVEEND_THIRD_MOVE_BLOCK, MOVEEND_CHANGED_ITEMS, MOVEEND_SAME_MOVE_TURNS, MOVEEND_CLEAR_BITS, MOVEEND_DANCER, MOVEEND_PURSUIT_NEXT_ACTION, MOVEEND_COUNT, + + // This guarantees a correct jump if new moveends are added directly after MOVEEND_HIT_ESCAPE + MOVEEND_JUMP_TO_HIT_ESCAPE_PLUS_ONE = (MOVEEND_HIT_ESCAPE + 1), }; // switch cases @@ -297,9 +194,24 @@ enum MoveEndEffects #define B_SWITCH_HIT 1 // dragon tail, circle throw #define B_SWITCH_RED_CARD 2 -// Argument labels for EFFECT_HIT_SET_REMOVE_TERRAIN -#define ARG_SET_PSYCHIC_TERRAIN 0 -#define ARG_TRY_REMOVE_TERRAIN_HIT 1 -#define ARG_TRY_REMOVE_TERRAIN_FAIL 2 +enum StatusTrigger +{ + TRIGGER_ON_MOVE, + TRIGGER_ON_ABILITY, + TRIGGER_ON_PROTECT, +}; + +enum TriggerOnFieldStatus +{ + ON_ANY, + ON_TERRAIN, + ON_WEATHER, +}; + +enum HealthUpdate +{ + PASSIVE_HP_UPDATE, + MOVE_DAMAGE_HP_UPDATE, +}; #endif // GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 8e8503458d8d..462c64cda199 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -28,18 +28,18 @@ enum StringID STRINGID_STATSWONTINCREASE2, STRINGID_AVOIDEDDAMAGE, STRINGID_ITDOESNTAFFECT, - STRINGID_ATTACKERFAINTED, - STRINGID_TARGETFAINTED, + STRINGID_BATTLERFAINTED, STRINGID_PLAYERGOTMONEY, STRINGID_PLAYERWHITEOUT, - STRINGID_PLAYERWHITEOUT2, + STRINGID_PLAYERWHITEOUT2_WILD, + STRINGID_PLAYERWHITEOUT2_TRAINER, + STRINGID_PLAYERWHITEOUT3, STRINGID_PREVENTSESCAPE, STRINGID_HITXTIMES, STRINGID_PKMNFELLASLEEP, STRINGID_PKMNMADESLEEP, STRINGID_PKMNALREADYASLEEP, STRINGID_PKMNALREADYASLEEP2, - STRINGID_PKMNWASNTAFFECTED, STRINGID_PKMNWASPOISONED, STRINGID_PKMNPOISONEDBY, STRINGID_PKMNHURTBYPOISON, @@ -60,11 +60,8 @@ enum StringID STRINGID_PKMNISPARALYZED, STRINGID_PKMNISALREADYPARALYZED, STRINGID_PKMNHEALEDPARALYSIS, - STRINGID_PKMNDREAMEATEN, STRINGID_STATSWONTINCREASE, STRINGID_STATSWONTDECREASE, - STRINGID_TEAMSTOPPEDWORKING, - STRINGID_FOESTOPPEDWORKING, STRINGID_PKMNISCONFUSED, STRINGID_PKMNHEALEDCONFUSION, STRINGID_PKMNWASCONFUSED, @@ -72,7 +69,6 @@ enum StringID STRINGID_PKMNFELLINLOVE, STRINGID_PKMNINLOVE, STRINGID_PKMNIMMOBILIZEDBYLOVE, - STRINGID_PKMNBLOWNAWAY, STRINGID_PKMNCHANGEDTYPE, STRINGID_PKMNFLINCHED, STRINGID_PKMNREGAINEDHEALTH, @@ -116,7 +112,6 @@ enum StringID STRINGID_PKMNCALMEDDOWN, STRINGID_PKMNCANTSLEEPINUPROAR, STRINGID_PKMNSTOCKPILED, - STRINGID_PKMNCANTSTOCKPILE, STRINGID_PKMNCANTSLEEPINUPROAR2, STRINGID_UPROARKEPTPKMNAWAKE, STRINGID_PKMNSTAYEDAWAKEUSING, @@ -136,6 +131,7 @@ enum StringID STRINGID_PKMNMOVEISDISABLED, STRINGID_PKMNMOVEDISABLEDNOMORE, STRINGID_PKMNGOTENCORE, + STRINGID_PKMNGOTENCOREDMOVE, STRINGID_PKMNENCOREENDED, STRINGID_PKMNTOOKAIM, STRINGID_PKMNSKETCHEDMOVE, @@ -177,7 +173,6 @@ enum StringID STRINGID_PKMNREADYTOHELP, STRINGID_PKMNSWITCHEDITEMS, STRINGID_PKMNCOPIEDFOE, - STRINGID_PKMNMADEWISH, STRINGID_PKMNWISHCAMETRUE, STRINGID_PKMNPLANTEDROOTS, STRINGID_PKMNABSORBEDNUTRIENTS, @@ -194,14 +189,11 @@ enum StringID STRINGID_PKMNWAITSFORTARGET, STRINGID_PKMNSNATCHEDMOVE, STRINGID_PKMNMADEITRAIN, - STRINGID_PKMNRAISEDSPEED, STRINGID_PKMNPROTECTEDBY, STRINGID_PKMNPREVENTSUSAGE, STRINGID_PKMNRESTOREDHPUSING, STRINGID_PKMNCHANGEDTYPEWITH, - STRINGID_PKMNPREVENTSPARALYSISWITH, STRINGID_PKMNPREVENTSROMANCEWITH, - STRINGID_PKMNPREVENTSPOISONINGWITH, STRINGID_PKMNPREVENTSCONFUSIONWITH, STRINGID_PKMNRAISEDFIREPOWERWITH, STRINGID_PKMNANCHORSITSELFWITH, @@ -231,7 +223,6 @@ enum StringID STRINGID_BUTNOTHINGHAPPENED, STRINGID_BUTITFAILED, STRINGID_ITHURTCONFUSION, - STRINGID_MIRRORMOVEFAILED, STRINGID_STARTEDTORAIN, STRINGID_DOWNPOURSTARTED, STRINGID_RAINCONTINUES, @@ -246,9 +237,6 @@ enum StringID STRINGID_STARTEDHAIL, STRINGID_HAILCONTINUES, STRINGID_HAILSTOPPED, - STRINGID_FAILEDTOSPITUP, - STRINGID_FAILEDTOSWALLOW, - STRINGID_WINDBECAMEHEATWAVE, STRINGID_STATCHANGESGONE, STRINGID_COINSSCATTERED, STRINGID_TOOWEAKFORSUBSTITUTE, @@ -305,7 +293,6 @@ enum StringID STRINGID_ITEMALLOWSONLYYMOVE, STRINGID_PKMNHUNGONWITHX, STRINGID_EMPTYSTRING3, - STRINGID_PKMNSXPREVENTSBURNS, STRINGID_PKMNSXBLOCKSY, STRINGID_PKMNSXRESTOREDHPALITTLE2, STRINGID_PKMNSXWHIPPEDUPSANDSTORM, @@ -324,8 +311,8 @@ enum StringID STRINGID_PLAYERDEFEATEDTRAINER1, STRINGID_SOOTHINGAROMA, STRINGID_ITEMSCANTBEUSEDNOW, - STRINGID_FORXCOMMAYZ, STRINGID_USINGITEMSTATOFPKMNROSE, + STRINGID_USINGITEMSTATOFPKMNFELL, STRINGID_PKMNUSEDXTOGETPUMPED, STRINGID_PKMNSXMADEYUSELESS, STRINGID_PKMNTRAPPEDBYSANDTOMB, @@ -341,7 +328,6 @@ enum StringID STRINGID_PKMNFLEDUSINGITS, STRINGID_PKMNFLEDUSING, STRINGID_PKMNWASDRAGGEDOUT, - STRINGID_PREVENTEDFROMWORKING, STRINGID_PKMNSITEMNORMALIZEDSTATUS, STRINGID_TRAINER1USEDITEM, STRINGID_BOXISFULL, @@ -352,17 +338,13 @@ enum StringID STRINGID_STATSWONTDECREASE2, STRINGID_PKMNSXBLOCKSY2, STRINGID_PKMNSXWOREOFF, - STRINGID_PKMNRAISEDDEFALITTLE, - STRINGID_PKMNRAISEDSPDEFALITTLE, STRINGID_THEWALLSHATTERED, - STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXCUREDITSYPROBLEM, STRINGID_ATTACKERCANTESCAPE, STRINGID_PKMNOBTAINEDX, STRINGID_PKMNOBTAINEDX2, STRINGID_PKMNOBTAINEDXYOBTAINEDZ, STRINGID_BUTNOEFFECT, - STRINGID_PKMNSXHADNOEFFECTONY, STRINGID_TWOENEMIESDEFEATED, STRINGID_TRAINER2LOSETEXT, STRINGID_PKMNINCAPABLEOFPOWER, @@ -421,10 +403,8 @@ enum StringID STRINGID_FELLSTRAIGHTDOWN, STRINGID_TARGETCHANGEDTYPE, STRINGID_PKMNACQUIREDSIMPLE, - STRINGID_EMPTYSTRING5, STRINGID_KINDOFFER, STRINGID_RESETSTARGETSSTATLEVELS, - STRINGID_EMPTYSTRING6, STRINGID_ALLYSWITCHPOSITION, STRINGID_RESTORETARGETSHEALTH, STRINGID_TOOKPJMNINTOTHESKY, @@ -478,7 +458,7 @@ enum StringID STRINGID_HEALINGWISHCAMETRUE, STRINGID_HEALINGWISHHEALED, STRINGID_LUNARDANCECAMETRUE, - STRINGID_CUSEDBODYDISABLED, + STRINGID_CURSEDBODYDISABLED, STRINGID_ATTACKERACQUIREDABILITY, STRINGID_TARGETABILITYSTATLOWER, STRINGID_TARGETSTATWONTGOHIGHER, @@ -555,10 +535,8 @@ enum StringID STRINGID_COMATOSEENTERS, STRINGID_SCREENCLEANERENTERS, STRINGID_FETCHEDPOKEBALL, - STRINGID_BATTLERABILITYRAISEDSTAT, STRINGID_ASANDSTORMKICKEDUP, STRINGID_PKMNSWILLPERISHIN3TURNS, - STRINGID_ABILITYRAISEDSTATDRASTICALLY, STRINGID_AURAFLAREDTOLIFE, STRINGID_ASONEENTERS, STRINGID_CURIOUSMEDICINEENTERS, @@ -595,7 +573,6 @@ enum StringID STRINGID_BROKETHROUGHPROTECTION, STRINGID_ABILITYALLOWSONLYMOVE, STRINGID_SWAPPEDABILITIES, - STRINGID_PASTELVEILPROTECTED, STRINGID_PASTELVEILENTERS, STRINGID_BATTLERTYPECHANGEDTO, STRINGID_BOTHCANNOLONGERESCAPE, @@ -611,8 +588,6 @@ enum StringID STRINGID_METEORBEAMCHARGING, STRINGID_HEATUPBEAK, STRINGID_COURTCHANGE, - STRINGID_PLAYERLOSTTOENEMYTRAINER, - STRINGID_PLAYERPAIDPRIZEMONEY, STRINGID_ZPOWERSURROUNDS, STRINGID_ZMOVEUNLEASHED, STRINGID_ZMOVERESETSSTATS, @@ -734,10 +709,10 @@ enum StringID STRINGID_TIMETODYNAMAX, STRINGID_TIMETOGIGANTAMAX, STRINGID_QUESTIONFORFEITBATTLE, - STRINGID_FORFEITBATTLEGAVEMONEY, STRINGID_TOXICSPIKESBADLYPOISONED, STRINGID_POWERCONSTRUCTPRESENCEOFMANY, STRINGID_POWERCONSTRUCTTRANSFORM, + STRINGID_ABILITYSHIELDPROTECTS, STRINGID_COUNT }; @@ -746,33 +721,24 @@ enum StringID // They are assigned to the MULTISTRING_CHOOSER byte of gBattleCommunication // and read when e.g. the command printfromtable is used. -// gStatUpStringIds -enum StatUpStringID +// gStatUpStringIds and gStatDownStringIds +enum StatChangedStringID { - B_MSG_ATTACKER_STAT_ROSE, - B_MSG_DEFENDER_STAT_ROSE, - B_MSG_STAT_WONT_INCREASE, - B_MSG_STAT_ROSE_EMPTY, - B_MSG_STAT_ROSE_ITEM, + B_MSG_ATTACKER_STAT_CHANGED, + B_MSG_DEFENDER_STAT_CHANGED, + B_MSG_STAT_WONT_CHANGE, + B_MSG_STAT_CHANGE_EMPTY, + B_MSG_STAT_CHANGED_ITEM, B_MSG_USED_DIRE_HIT, }; -// gStatDownStringIds -enum StatDownStringID -{ - B_MSG_ATTACKER_STAT_FELL = 0, - B_MSG_DEFENDER_STAT_FELL = 1, - B_MSG_STAT_WONT_DECREASE, - B_MSG_STAT_FELL_EMPTY, -}; - // gMissStringIds enum MissStringID { B_MSG_MISSED, B_MSG_PROTECTED, B_MSG_AVOIDED_ATK, - // Ability-related messages need to below this comment + // Ability-related messages need to be below this comment B_MSG_AVOIDED_DMG, B_MSG_GROUND_MISS, }; @@ -888,20 +854,6 @@ enum UproarOverTurnStringID B_MSG_UPROAR_ENDS, }; -// gStockpileUsedStringIds -enum StockpileUsedStringID -{ - B_MSG_STOCKPILED, - B_MSG_CANT_STOCKPILE, -}; - -// gSwallowFailStringIds -enum SwallowFailStringID -{ - B_MSG_SWALLOW_FAILED, - B_MSG_SWALLOW_FULL_HP, -}; - // gKOFailedStringIds enum KOFailedStringID { @@ -1024,9 +976,15 @@ enum FlashFireStringID B_MSG_FLASH_FIRE_NO_BOOST, }; -// gBerryEffectStringIds -enum BerryEffectStringID +// CureStatusBerryEffectStringID +enum CureStatusBerryEffectStringID { + B_MSG_CURED_PARALYSIS, + B_MSG_CURED_POISON, + B_MSG_CURED_BURN, + B_MSG_CURED_FREEEZE, + B_MSG_CURED_FROSTBITE, + B_MSG_CURED_SLEEP, B_MSG_CURED_PROBLEM, B_MSG_NORMALIZED_STATUS, }; @@ -1049,17 +1007,6 @@ enum GotStatusedStringID B_MSG_STATUSED_BY_ABILITY, }; -// gStatusPreventionStringIds -enum StatusPreventionStringID -{ - B_MSG_ABILITY_PREVENTS_MOVE_BURN, - B_MSG_ABILITY_PREVENTS_MOVE_PARALYSIS, - B_MSG_ABILITY_PREVENTS_MOVE_POISON, - B_MSG_ABILITY_PREVENTS_ABILITY_STATUS, - B_MSG_STATUS_HAD_NO_EFFECT, - B_MSG_ABILITY_PASTEL_VEIL, -}; - // gGotDefrostedStringIds enum GotDefrostedStringID { @@ -1166,8 +1113,7 @@ enum StartingStatusStringID }; // gWrappedStringIds -// These correspond in order to sTrappingMoves! -enum WrappedStringID +enum __attribute__((packed)) WrappedStringID { B_MSG_WRAPPED_BIND, B_MSG_WRAPPED_WRAP, diff --git a/include/constants/characters.h b/include/constants/characters.h index 6ac3c5224c5d..0af7b110f09b 100644 --- a/include/constants/characters.h +++ b/include/constants/characters.h @@ -232,6 +232,7 @@ #define EXT_CTRL_CODE_ENG 0x16 #define EXT_CTRL_CODE_PAUSE_MUSIC 0x17 #define EXT_CTRL_CODE_RESUME_MUSIC 0x18 +#define EXT_CTRL_CODE_SPEAKER 0x19 #define TEXT_COLOR_TRANSPARENT 0x0 #define TEXT_COLOR_WHITE 0x1 diff --git a/include/constants/contest.h b/include/constants/contest.h index 3b83d4f1c331..70531f540614 100644 --- a/include/constants/contest.h +++ b/include/constants/contest.h @@ -103,29 +103,29 @@ #define CONTEST_EFFECT_REPETITION_NOT_BORING 3 #define CONTEST_EFFECT_AVOID_STARTLE_ONCE 4 #define CONTEST_EFFECT_AVOID_STARTLE 5 -#define CONTEST_EFFECT_AVOID_STARTLE_SLIGHTLY 6 -#define CONTEST_EFFECT_USER_LESS_EASILY_STARTLED 7 -#define CONTEST_EFFECT_STARTLE_FRONT_MON 8 -#define CONTEST_EFFECT_SLIGHTLY_STARTLE_PREV_MONS 9 +#define CONTEST_EFFECT_AVOID_STARTLE_SLIGHTLY 6 // Unused +#define CONTEST_EFFECT_USER_LESS_EASILY_STARTLED 7 // Unused +#define CONTEST_EFFECT_STARTLE_FRONT_MON 8 // Unused +#define CONTEST_EFFECT_SLIGHTLY_STARTLE_PREV_MONS 9 // Unused #define CONTEST_EFFECT_STARTLE_PREV_MON 10 #define CONTEST_EFFECT_STARTLE_PREV_MONS 11 #define CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON 12 #define CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS 13 -#define CONTEST_EFFECT_STARTLE_PREV_MON_2 14 -#define CONTEST_EFFECT_STARTLE_PREV_MONS_2 15 +#define CONTEST_EFFECT_STARTLE_PREV_MON_2 14 // Unused +#define CONTEST_EFFECT_STARTLE_PREV_MONS_2 15 // Unused #define CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION 16 #define CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION 17 #define CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN 18 #define CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL 19 -#define CONTEST_EFFECT_STARTLE_MONS_COOL_APPEAL 20 -#define CONTEST_EFFECT_STARTLE_MONS_BEAUTY_APPEAL 21 -#define CONTEST_EFFECT_STARTLE_MONS_CUTE_APPEAL 22 -#define CONTEST_EFFECT_STARTLE_MONS_SMART_APPEAL 23 -#define CONTEST_EFFECT_STARTLE_MONS_TOUGH_APPEAL 24 -#define CONTEST_EFFECT_MAKE_FOLLOWING_MON_NERVOUS 25 +#define CONTEST_EFFECT_STARTLE_MONS_COOL_APPEAL 20 // Unused +#define CONTEST_EFFECT_STARTLE_MONS_BEAUTY_APPEAL 21 // Unused +#define CONTEST_EFFECT_STARTLE_MONS_CUTE_APPEAL 22 // Unused +#define CONTEST_EFFECT_STARTLE_MONS_SMART_APPEAL 23 // Unused +#define CONTEST_EFFECT_STARTLE_MONS_TOUGH_APPEAL 24 // Unused +#define CONTEST_EFFECT_MAKE_FOLLOWING_MON_NERVOUS 25 // Unused #define CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS 26 #define CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS 27 -#define CONTEST_EFFECT_BADLY_STARTLES_MONS_IN_GOOD_CONDITION 28 +#define CONTEST_EFFECT_BADLY_STARTLES_MONS_IN_GOOD_CONDITION 28 // Unused #define CONTEST_EFFECT_BETTER_IF_FIRST 29 #define CONTEST_EFFECT_BETTER_IF_LAST 30 #define CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES 31 @@ -133,18 +133,21 @@ #define CONTEST_EFFECT_BETTER_WHEN_LATER 33 #define CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING 34 #define CONTEST_EFFECT_BETTER_IF_SAME_TYPE 35 -#define CONTEST_EFFECT_BETTER_IF_DIFF_TYPE 36 +#define CONTEST_EFFECT_BETTER_IF_DIFF_TYPE 36 // Unused #define CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL 37 #define CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS 38 #define CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION 39 #define CONTEST_EFFECT_NEXT_APPEAL_EARLIER 40 #define CONTEST_EFFECT_NEXT_APPEAL_LATER 41 -#define CONTEST_EFFECT_MAKE_SCRAMBLING_TURN_ORDER_EASIER 42 +#define CONTEST_EFFECT_MAKE_SCRAMBLING_TURN_ORDER_EASIER 42 // Unused #define CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER 43 #define CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST 44 #define CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS 45 #define CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED 46 #define CONTEST_EFFECT_DONT_EXCITE_AUDIENCE 47 +//#define CONTEST_EFFECT_QUICKLY_GROW_BORED 48 // New in Gen 6 +//#define CONTEST_EFFECT_EXCITES_AUDIENCE_MORE_IF_FIRST 49 // New in Gen 6 +//#define CONTEST_EFFECT_EXCITES_AUDIENCE_MORE_IF_LAST 50 // New in Gen 6 // Each of the above effects is grouped into one of these effect type categories // Only a few of these get checked by the AI, the rest go unused @@ -157,93 +160,127 @@ #define CONTEST_EFFECT_TYPE_TURN_ORDER 6 #define CONTEST_EFFECT_TYPE_UNKNOWN 8 -#define COMBO_STARTER_POUND 1 -#define COMBO_STARTER_FIRE_PUNCH 2 -#define COMBO_STARTER_ICE_PUNCH 3 -#define COMBO_STARTER_THUNDER_PUNCH 4 -#define COMBO_STARTER_SCRATCH 5 -#define COMBO_STARTER_VICE_GRIP 6 -#define COMBO_STARTER_SWORDS_DANCE 7 -#define COMBO_STARTER_SAND_ATTACK 8 -#define COMBO_STARTER_HORN_ATTACK 9 -#define COMBO_STARTER_LEER 10 -#define COMBO_STARTER_SING 11 -#define COMBO_STARTER_SURF 12 -#define COMBO_STARTER_PECK 13 -#define COMBO_STARTER_LEECH_SEED 14 -#define COMBO_STARTER_GROWTH 15 -#define COMBO_STARTER_STRING_SHOT 16 -#define COMBO_STARTER_DRAGON_RAGE 17 -#define COMBO_STARTER_ROCK_THROW 18 -#define COMBO_STARTER_EARTHQUAKE 19 -#define COMBO_STARTER_TOXIC 20 -#define COMBO_STARTER_CONFUSION 21 -#define COMBO_STARTER_PSYCHIC 22 -#define COMBO_STARTER_HYPNOSIS 23 -#define COMBO_STARTER_RAGE 24 -#define COMBO_STARTER_DOUBLE_TEAM 25 -#define COMBO_STARTER_HARDEN 26 -#define COMBO_STARTER_DEFENSE_CURL 27 -#define COMBO_STARTER_FOCUS_ENERGY 28 -#define COMBO_STARTER_SMOG 29 -#define COMBO_STARTER_SLUDGE 30 -#define COMBO_STARTER_BONE_CLUB 31 -#define COMBO_STARTER_KINESIS 32 -#define COMBO_STARTER_SOFT_BOILED 33 -#define COMBO_STARTER_BONEMERANG 34 -#define COMBO_STARTER_REST 35 -#define COMBO_STARTER_MIND_READER 36 -#define COMBO_STARTER_CURSE 37 -#define COMBO_STARTER_POWDER_SNOW 38 -#define COMBO_STARTER_SCARY_FACE 39 -#define COMBO_STARTER_BELLY_DRUM 40 -#define COMBO_STARTER_SLUDGE_BOMB 41 -#define COMBO_STARTER_MUD_SLAP 42 -#define COMBO_STARTER_BONE_RUSH 43 -#define COMBO_STARTER_LOCK_ON 44 -#define COMBO_STARTER_SANDSTORM 45 -#define COMBO_STARTER_ENDURE 46 -#define COMBO_STARTER_CHARM 47 -#define COMBO_STARTER_MEAN_LOOK 48 -#define COMBO_STARTER_HEAL_BELL 49 -#define COMBO_STARTER_DRAGON_BREATH 50 -#define COMBO_STARTER_SWEET_SCENT 51 -#define COMBO_STARTER_RAIN_DANCE 52 -#define COMBO_STARTER_SUNNY_DAY 53 -#define COMBO_STARTER_FAKE_OUT 54 -#define COMBO_STARTER_STOCKPILE 55 -#define COMBO_STARTER_HAIL 56 -#define COMBO_STARTER_CHARGE 57 -#define COMBO_STARTER_TAUNT 58 -#define COMBO_STARTER_REVENGE 59 -#define COMBO_STARTER_YAWN 60 -#define COMBO_STARTER_DIVE 61 -#define COMBO_STARTER_MUD_SPORT 62 -#define COMBO_STARTER_METAL_SOUND 63 -#define COMBO_STARTER_WATER_SPORT 64 -#define COMBO_STARTER_CALM_MIND 65 -#define COMBO_STARTER_DRAGON_DANCE 66 -#define COMBO_STARTER_PAYBACK 67 -#define COMBO_STARTER_LUCKY_CHANT 68 -#define COMBO_STARTER_WORRY_SEED 69 -#define COMBO_STARTER_DRAGON_RUSH 70 -#define COMBO_STARTER_BRAVE_BIRD 71 -#define COMBO_STARTER_THUNDER_FANG 72 -#define COMBO_STARTER_ICE_FANG 73 -#define COMBO_STARTER_FIRE_FANG 74 -#define COMBO_STARTER_ATTACK_ORDER 75 -#define COMBO_STARTER_DEFEND_ORDER 76 -#define COMBO_STARTER_HEAL_ORDER 77 -#define COMBO_STARTER_SCALD 78 -#define COMBO_STARTER_DRAGON_TAIL 79 -#define COMBO_STARTER_HYPERSPACE_HOLE 80 -#define COMBO_STARTER_THOUSAND_ARROWS 81 -#define COMBO_STARTER_THOUSAND_WAVES 82 -#define COMBO_STARTER_HYPERSPACE_FURY 83 -#define COMBO_STARTER_SHADOW_BONE 84 -#define COMBO_STARTER_ELECTRIC_TERRAIN 85 -#define COMBO_STARTER_MISTY_TERRAIN 86 -#define COMBO_STARTER_GRASSY_TERRAIN 87 -#define COMBO_STARTER_PSYCHIC_TERRAIN 88 +enum { + COMBO_STARTER_POUND, + COMBO_STARTER_FIRE_PUNCH, + COMBO_STARTER_ICE_PUNCH, + COMBO_STARTER_THUNDER_PUNCH, + COMBO_STARTER_SCRATCH, + COMBO_STARTER_VICE_GRIP, + COMBO_STARTER_SWORDS_DANCE, + COMBO_STARTER_SAND_ATTACK, + COMBO_STARTER_HORN_ATTACK, + COMBO_STARTER_LEER, + COMBO_STARTER_SING, + COMBO_STARTER_SURF, + COMBO_STARTER_PECK, + COMBO_STARTER_LEECH_SEED, + COMBO_STARTER_GROWTH, + COMBO_STARTER_STRING_SHOT, + COMBO_STARTER_DRAGON_RAGE, + COMBO_STARTER_ROCK_THROW, + COMBO_STARTER_EARTHQUAKE, + COMBO_STARTER_TOXIC, + COMBO_STARTER_CONFUSION, + COMBO_STARTER_PSYCHIC, + COMBO_STARTER_HYPNOSIS, + COMBO_STARTER_RAGE, + COMBO_STARTER_DOUBLE_TEAM, + COMBO_STARTER_HARDEN, + COMBO_STARTER_DEFENSE_CURL, + COMBO_STARTER_FOCUS_ENERGY, + COMBO_STARTER_SMOG, + COMBO_STARTER_SLUDGE, + COMBO_STARTER_BONE_CLUB, + COMBO_STARTER_KINESIS, + COMBO_STARTER_SOFT_BOILED, + COMBO_STARTER_BONEMERANG, + COMBO_STARTER_REST, + COMBO_STARTER_MIND_READER, + COMBO_STARTER_CURSE, + COMBO_STARTER_POWDER_SNOW, + COMBO_STARTER_SCARY_FACE, + COMBO_STARTER_BELLY_DRUM, + COMBO_STARTER_SLUDGE_BOMB, + COMBO_STARTER_MUD_SLAP, + COMBO_STARTER_BONE_RUSH, + COMBO_STARTER_LOCK_ON, + COMBO_STARTER_SANDSTORM, + COMBO_STARTER_ENDURE, + COMBO_STARTER_CHARM, + COMBO_STARTER_MEAN_LOOK, + COMBO_STARTER_HEAL_BELL, + COMBO_STARTER_DRAGON_BREATH, + COMBO_STARTER_SWEET_SCENT, + COMBO_STARTER_RAIN_DANCE, + COMBO_STARTER_SUNNY_DAY, + COMBO_STARTER_FAKE_OUT, + COMBO_STARTER_STOCKPILE, + COMBO_STARTER_HAIL, + COMBO_STARTER_CHARGE, + COMBO_STARTER_TAUNT, + COMBO_STARTER_REVENGE, + COMBO_STARTER_YAWN, + COMBO_STARTER_DIVE, + COMBO_STARTER_MUD_SPORT, + COMBO_STARTER_METAL_SOUND, + COMBO_STARTER_WATER_SPORT, + COMBO_STARTER_CALM_MIND, + COMBO_STARTER_DRAGON_DANCE, + COMBO_STARTER_PAYBACK, + COMBO_STARTER_LUCKY_CHANT, + COMBO_STARTER_WORRY_SEED, + COMBO_STARTER_DRAGON_RUSH, + COMBO_STARTER_BRAVE_BIRD, + COMBO_STARTER_THUNDER_FANG, + COMBO_STARTER_ICE_FANG, + COMBO_STARTER_FIRE_FANG, + COMBO_STARTER_ATTACK_ORDER, + COMBO_STARTER_DEFEND_ORDER, + COMBO_STARTER_HEAL_ORDER, + COMBO_STARTER_SCALD, + COMBO_STARTER_DRAGON_TAIL, + COMBO_STARTER_HYPERSPACE_HOLE, + COMBO_STARTER_THOUSAND_ARROWS, + COMBO_STARTER_THOUSAND_WAVES, + COMBO_STARTER_HYPERSPACE_FURY, + COMBO_STARTER_SHADOW_BONE, + COMBO_STARTER_ELECTRIC_TERRAIN, + COMBO_STARTER_MISTY_TERRAIN, + COMBO_STARTER_GRASSY_TERRAIN, + COMBO_STARTER_PSYCHIC_TERRAIN, + COMBO_STARTER_FORCE_PALM, + COMBO_STARTER_THUNDER_WAVE, + COMBO_STARTER_AGILITY, + COMBO_STARTER_STEALTH_ROCK, + COMBO_STARTER_INFERNO, + COMBO_STARTER_WILL_O_WISP, + COMBO_STARTER_LOVELY_KISS, + COMBO_STARTER_SPORE, + COMBO_STARTER_CELEBRATE, + COMBO_STARTER_COVET, + COMBO_STARTER_HAPPY_HOUR, + COMBO_STARTER_WISH, + COMBO_STARTER_AMNESIA, + COMBO_STARTER_HONE_CLAWS, + COMBO_STARTER_ENTRAINMENT, + COMBO_STARTER_PLAY_NICE, + COMBO_STARTER_BLOCK, + COMBO_STARTER_ENCORE, + COMBO_STARTER_DARK_VOID, + COMBO_STARTER_GRASS_WHISTLE, + COMBO_STARTER_SLEEP_POWDER, + COMBO_STARTER_POISON_GAS, + COMBO_STARTER_POISON_POWDER, + COMBO_STARTER_NASTY_PLOT, + COMBO_STARTER_PARABOLIC_CHARGE, + COMBO_STARTER_SHIFT_GEAR, + COMBO_STARTER_SPIKES, + COMBO_STARTER_TOXIC_SPIKES, + COMBO_STARTER_GLARE, + COMBO_STARTER_ROCK_POLISH, + COMBO_STARTER_ROTOTILLER, + COMBO_STARTER_TORMENT, +}; #endif // GUARD_CONSTANTS_CONTEST_H diff --git a/include/constants/cries.h b/include/constants/cries.h index 554ffafc96bd..e30973946262 100644 --- a/include/constants/cries.h +++ b/include/constants/cries.h @@ -1,7 +1,8 @@ #ifndef GUARD_CONSTANTS_CRIES_H #define GUARD_CONSTANTS_CRIES_H -enum { +enum PokemonCry +{ CRY_NONE, #if P_FAMILY_BULBASAUR CRY_BULBASAUR, diff --git a/include/constants/event_object_movement.h b/include/constants/event_object_movement.h index 4e1b3a34ea1c..4f183d766740 100755 --- a/include/constants/event_object_movement.h +++ b/include/constants/event_object_movement.h @@ -259,6 +259,11 @@ #define MOVEMENT_ACTION_SURF_STILL_UP 0xAB #define MOVEMENT_ACTION_SURF_STILL_LEFT 0xAC #define MOVEMENT_ACTION_SURF_STILL_RIGHT 0xAD +//fast diagonal movement +#define MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_LEFT 0xAE +#define MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_RIGHT 0xAF +#define MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_LEFT 0xB0 +#define MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_RIGHT 0xB1 #define MOVEMENT_ACTION_STEP_END 0xFE #define MOVEMENT_ACTION_NONE 0xFF diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index a0ca0063dc73..c20c2c79c3ef 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -246,11 +246,12 @@ #define OBJ_EVENT_GFX_POKE_BALL 239 #define OBJ_EVENT_GFX_OW_MON 240 #define OBJ_EVENT_GFX_LIGHT_SPRITE 241 +#define OBJ_EVENT_GFX_APRICORN_TREE 242 // NOTE: The maximum amount of object events has been expanded from 255 to 65535. // Since dynamic graphics ids still require at least 16 free values, the actual limit // is 65519, but even considering follower PokΓ©mon, this should be more than enough :) -#define NUM_OBJ_EVENT_GFX 242 +#define NUM_OBJ_EVENT_GFX 243 // These are dynamic object gfx ids. @@ -331,11 +332,14 @@ #define LOCALID_NONE 0 #define LOCALID_CAMERA 127 #define LOCALID_BERRY_BLENDER_PLAYER_END 240 // This will use 5 (MAX_RFU_PLAYERS) IDs ending at 240, i.e. 236-240 +#define LOCALID_FOLLOWING_POKEMON 254 #define LOCALID_PLAYER 255 -#define OBJ_EVENT_ID_FOLLOWER 0xFE -#define OBJ_EVENT_ID_NPC_FOLLOWER 0xFD +#define OBJ_EVENT_ID_FOLLOWER 0xFE +#define OBJ_EVENT_ID_NPC_FOLLOWER 0xFD // Aliases for old names. "object event id" normally refers to an index into gObjectEvents, which these are not. +// Used for link player OWs in CreateLinkPlayerSprite +#define OBJ_EVENT_ID_DYNAMIC_BASE 0xF0 #define OBJ_EVENT_ID_CAMERA LOCALID_CAMERA #define OBJ_EVENT_ID_PLAYER LOCALID_PLAYER diff --git a/include/constants/expansion.h b/include/constants/expansion.h index b0e7397b5633..36a4d7c89c81 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -1,10 +1,10 @@ #ifndef GUARD_CONSTANTS_EXPANSION_H #define GUARD_CONSTANTS_EXPANSION_H -// Last version: 1.12.0 +// Last version: 1.14.1 #define EXPANSION_VERSION_MAJOR 1 -#define EXPANSION_VERSION_MINOR 12 -#define EXPANSION_VERSION_PATCH 1 +#define EXPANSION_VERSION_MINOR 14 +#define EXPANSION_VERSION_PATCH 2 // FALSE if this this version of Expansion is not a tagged commit, i.e. // it contains unreleased changes. diff --git a/include/constants/field_effects.h b/include/constants/field_effects.h index e47cc292c3a9..71978fc64fec 100644 --- a/include/constants/field_effects.h +++ b/include/constants/field_effects.h @@ -77,6 +77,9 @@ #define FLDEFF_TRACKS_BUG 72 #define FLDEFF_CAVE_DUST 73 #define FLDEFF_DEFOG 74 +#define FLDEFF_USE_ROCK_CLIMB 75 +#define FLDEFF_ROCK_CLIMB_DUST 76 +#define FLDEFF_ORAS_DOWSE 77 #define FLDEFFOBJ_SHADOW_S 0 #define FLDEFFOBJ_SHADOW_M 1 @@ -119,6 +122,10 @@ #define FLDEFFOBJ_TRACKS_SPOT 38 #define FLDEFFOBJ_TRACKS_BUG 39 #define FLDEFFOBJ_CAVE_DUST 40 +#define FLDEFFOBJ_ROCK_CLIMB_BLOB 41 +#define FLDEFFOBJ_ROCK_CLIMB_DUST 42 +#define FLDEFFOBJ_ORAS_DOWSE_BRENDAN 43 +#define FLDEFFOBJ_ORAS_DOWSE_MAY 44 #define FLDEFF_PAL_TAG_CUT_GRASS 0x1000 #define FLDEFF_PAL_TAG_SECRET_POWER_TREE 0x1003 @@ -133,6 +140,8 @@ #define FLDEFF_PAL_TAG_HOF_MONITOR 0x1010 #define FLDEFF_PAL_TAG_UNKNOWN 0x1011 #define FLDEFF_PAL_TAG_CAVE_DUST 0x1012 +#define FLDEFF_PAL_TAG_DUST_CLOUD 0x1013 +#define FLDEFF_PAL_TAG_ORAS_DOWSE 0x1014 #define FLDEFF_PAL_TAG_FIELD_MOVE_MON 0x8400 // tile tags, for field effects that may have many copies on screen at once diff --git a/include/constants/field_move.h b/include/constants/field_move.h new file mode 100644 index 000000000000..c6c49c8708a5 --- /dev/null +++ b/include/constants/field_move.h @@ -0,0 +1,31 @@ +#ifndef GUARD_CONSTANTS_FIELD_MOVE_H +#define GUARD_CONSTANTS_FIELD_MOVE_H + + +enum FieldMove +{ + FIELD_MOVE_CUT, + FIELD_MOVE_FLASH, + FIELD_MOVE_ROCK_SMASH, + FIELD_MOVE_STRENGTH, + FIELD_MOVE_SURF, + FIELD_MOVE_FLY, + FIELD_MOVE_DIVE, + FIELD_MOVE_WATERFALL, + FIELD_MOVE_TELEPORT, + FIELD_MOVE_DIG, + FIELD_MOVE_SECRET_POWER, + FIELD_MOVE_MILK_DRINK, + FIELD_MOVE_SOFT_BOILED, + FIELD_MOVE_SWEET_SCENT, +#if OW_ROCK_CLIMB_FIELD_MOVE == TRUE + FIELD_MOVE_ROCK_CLIMB, +#endif +#if OW_DEFOG_FIELD_MOVE == TRUE + FIELD_MOVE_DEFOG, +#endif + FIELD_MOVES_COUNT +}; + + +#endif //GUARD_CONSTANTS_FIELD_MOVE_H diff --git a/include/constants/field_specials.h b/include/constants/field_specials.h index 72966adeb882..6973f9e14f56 100644 --- a/include/constants/field_specials.h +++ b/include/constants/field_specials.h @@ -2,65 +2,80 @@ #define GUARD_CONSTANTS_FIELD_SPECIALS_H // PC Locations -#define PC_LOCATION_OTHER 0 -#define PC_LOCATION_BRENDANS_HOUSE 1 -#define PC_LOCATION_MAYS_HOUSE 2 +enum PCLocation +{ + PC_LOCATION_OTHER, + PC_LOCATION_BRENDANS_HOUSE, + PC_LOCATION_MAYS_HOUSE, +}; // SS Tidal Locations -#define SS_TIDAL_LOCATION_CURRENTS 0 -#define SS_TIDAL_LOCATION_SLATEPORT 1 -#define SS_TIDAL_LOCATION_LILYCOVE 2 -#define SS_TIDAL_LOCATION_ROUTE124 3 -#define SS_TIDAL_LOCATION_ROUTE131 4 +enum SSTidalLocation +{ + SS_TIDAL_LOCATION_CURRENTS, + SS_TIDAL_LOCATION_SLATEPORT, + SS_TIDAL_LOCATION_LILYCOVE, + SS_TIDAL_LOCATION_ROUTE124, + SS_TIDAL_LOCATION_ROUTE131, +}; -#define SS_TIDAL_BOARD_SLATEPORT 1 -#define SS_TIDAL_DEPART_SLATEPORT 2 -#define SS_TIDAL_HALFWAY_LILYCOVE 3 -#define SS_TIDAL_LAND_LILYCOVE 4 -#define SS_TIDAL_BOARD_LILYCOVE 5 -#define SS_TIDAL_DEPART_LILYCOVE 6 -#define SS_TIDAL_HALFWAY_SLATEPORT 7 -#define SS_TIDAL_LAND_SLATEPORT 8 -#define SS_TIDAL_EXIT_CURRENTS_RIGHT 9 -#define SS_TIDAL_EXIT_CURRENTS_LEFT 10 +enum SSTidalState +{ + SS_TIDAL_BOARD_SLATEPORT = 1, + SS_TIDAL_DEPART_SLATEPORT, + SS_TIDAL_HALFWAY_LILYCOVE, + SS_TIDAL_LAND_LILYCOVE, + SS_TIDAL_BOARD_LILYCOVE, + SS_TIDAL_DEPART_LILYCOVE, + SS_TIDAL_HALFWAY_SLATEPORT, + SS_TIDAL_LAND_SLATEPORT, + SS_TIDAL_EXIT_CURRENTS_RIGHT, + SS_TIDAL_EXIT_CURRENTS_LEFT, +}; #define SS_TIDAL_MAX_STEPS 205 // Scrollable Multichoice Menus -#define SCROLL_MULTI_NONE 0 -#define SCROLL_MULTI_GLASS_WORKSHOP_VENDOR 1 -#define SCROLL_MULTI_POKEMON_FAN_CLUB_RATER 2 -#define SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_1 3 -#define SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_2 4 -#define SCROLL_MULTI_BF_EXCHANGE_CORNER_VITAMIN_VENDOR 5 -#define SCROLL_MULTI_BF_EXCHANGE_CORNER_HOLD_ITEM_VENDOR 6 -#define SCROLL_MULTI_BERRY_POWDER_VENDOR 7 -#define SCROLL_MULTI_BF_RECEPTIONIST 8 -#define SCROLL_MULTI_BF_MOVE_TUTOR_1 9 -#define SCROLL_MULTI_BF_MOVE_TUTOR_2 10 -#define SCROLL_MULTI_SS_TIDAL_DESTINATION 11 -#define SCROLL_MULTI_BATTLE_TENT_RULES 12 +enum ScrollMulti +{ + SCROLL_MULTI_NONE, + SCROLL_MULTI_GLASS_WORKSHOP_VENDOR, + SCROLL_MULTI_POKEMON_FAN_CLUB_RATER, + SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_1, + SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_2, + SCROLL_MULTI_BF_EXCHANGE_CORNER_VITAMIN_VENDOR, + SCROLL_MULTI_BF_EXCHANGE_CORNER_HOLD_ITEM_VENDOR, + SCROLL_MULTI_BERRY_POWDER_VENDOR, + SCROLL_MULTI_BF_RECEPTIONIST, + SCROLL_MULTI_BF_MOVE_TUTOR_1, + SCROLL_MULTI_BF_MOVE_TUTOR_2, + SCROLL_MULTI_SS_TIDAL_DESTINATION, + SCROLL_MULTI_BATTLE_TENT_RULES, +}; #define MAX_SCROLL_MULTI_ON_SCREEN 6 #define MAX_SCROLL_MULTI_LENGTH 16 // Dept Store Floor Numbers -#define DEPT_STORE_FLOORNUM_B4F 0 -#define DEPT_STORE_FLOORNUM_B3F 1 -#define DEPT_STORE_FLOORNUM_B2F 2 -#define DEPT_STORE_FLOORNUM_B1F 3 -#define DEPT_STORE_FLOORNUM_1F 4 -#define DEPT_STORE_FLOORNUM_2F 5 -#define DEPT_STORE_FLOORNUM_3F 6 -#define DEPT_STORE_FLOORNUM_4F 7 -#define DEPT_STORE_FLOORNUM_5F 8 -#define DEPT_STORE_FLOORNUM_6F 9 -#define DEPT_STORE_FLOORNUM_7F 10 -#define DEPT_STORE_FLOORNUM_8F 11 -#define DEPT_STORE_FLOORNUM_9F 12 -#define DEPT_STORE_FLOORNUM_10F 13 -#define DEPT_STORE_FLOORNUM_11F 14 -#define DEPT_STORE_FLOORNUM_ROOFTOP 15 +enum DeptStoreFloorNumber +{ + DEPT_STORE_FLOORNUM_B4F, + DEPT_STORE_FLOORNUM_B3F, + DEPT_STORE_FLOORNUM_B2F, + DEPT_STORE_FLOORNUM_B1F, + DEPT_STORE_FLOORNUM_1F, + DEPT_STORE_FLOORNUM_2F, + DEPT_STORE_FLOORNUM_3F, + DEPT_STORE_FLOORNUM_4F, + DEPT_STORE_FLOORNUM_5F, + DEPT_STORE_FLOORNUM_6F, + DEPT_STORE_FLOORNUM_7F, + DEPT_STORE_FLOORNUM_8F, + DEPT_STORE_FLOORNUM_9F, + DEPT_STORE_FLOORNUM_10F, + DEPT_STORE_FLOORNUM_11F, + DEPT_STORE_FLOORNUM_ROOFTOP, +}; // Lilycove PokΓ©mon Trainer Fan Club #define NUM_TRAINER_FAN_CLUB_MEMBERS 8 @@ -81,10 +96,13 @@ #define FANCOUNTER_USED_BATTLE_TOWER 3 // Return values for DoDeoxysRockInteraction -#define DEOXYS_ROCK_FAILED 0 -#define DEOXYS_ROCK_PROGRESSED 1 -#define DEOXYS_ROCK_SOLVED 2 -#define DEOXYS_ROCK_COMPLETE 3 +enum DeoxysRockResult +{ + DEOXYS_ROCK_FAILED, + DEOXYS_ROCK_PROGRESSED, + DEOXYS_ROCK_SOLVED, + DEOXYS_ROCK_COMPLETE, +}; enum { OPEN_PARTY_SCREEN, diff --git a/include/constants/flags.h b/include/constants/flags.h index 71a9116728fa..47a3b245e192 100644 --- a/include/constants/flags.h +++ b/include/constants/flags.h @@ -1397,6 +1397,7 @@ #define FLAG_SYS_USE_FLASH (SYSTEM_FLAGS + 0x28) #define FLAG_SYS_USE_STRENGTH (SYSTEM_FLAGS + 0x29) +// Sets abnormal weather on maps that check for it #define FLAG_SYS_WEATHER_CTRL (SYSTEM_FLAGS + 0x2A) #define FLAG_SYS_CYCLING_ROAD (SYSTEM_FLAGS + 0x2B) #define FLAG_SYS_SAFARI_MODE (SYSTEM_FLAGS + 0x2C) diff --git a/include/constants/follower_npc.h b/include/constants/follower_npc.h index e1c84b05a4f9..989aab72b4b1 100644 --- a/include/constants/follower_npc.h +++ b/include/constants/follower_npc.h @@ -2,7 +2,6 @@ #define GUARD_CONSTANTS_FOLLOWER_NPC_H // NPC Follower Flags -#define FOLLOWER_NPC_FLAG_HAS_RUNNING_FRAMES 0x1 // Only use this if the NPC has running anim frames. Part of FOLLOWER_NPC_FLAG_ALL_LAND. #define FOLLOWER_NPC_FLAG_CAN_BIKE 0x2 // Player is allowed to use the Bike. Part of FOLLOWER_NPC_FLAG_ALL_LAND. #define FOLLOWER_NPC_FLAG_CAN_LEAVE_ROUTE 0x4 // Player is allowed to use Fly/Teleport/EscapeRope/etc. Part of FOLLOWER_NPC_FLAG_ALL_LAND. #define FOLLOWER_NPC_FLAG_CAN_SURF 0x8 // Player is allowed to Surf. Part of FOLLOWER_NPC_FLAG_ALL_WATER. @@ -10,12 +9,11 @@ #define FOLLOWER_NPC_FLAG_CAN_DIVE 0x20 // Player is allowed to use Dive. Part of FOLLOWER_NPC_FLAG_ALL_WATER. #define FOLLOWER_NPC_FLAG_CLEAR_ON_WHITE_OUT 0x80 // The NPC follower will be destroyed if the player whites out. -#define FOLLOWER_NPC_FLAG_ALL_LAND FOLLOWER_NPC_FLAG_HAS_RUNNING_FRAMES | FOLLOWER_NPC_FLAG_CAN_BIKE | FOLLOWER_NPC_FLAG_CAN_LEAVE_ROUTE +#define FOLLOWER_NPC_FLAG_ALL_LAND FOLLOWER_NPC_FLAG_CAN_BIKE | FOLLOWER_NPC_FLAG_CAN_LEAVE_ROUTE #define FOLLOWER_NPC_FLAG_ALL_WATER FOLLOWER_NPC_FLAG_CAN_SURF | FOLLOWER_NPC_FLAG_CAN_WATERFALL | FOLLOWER_NPC_FLAG_CAN_DIVE #define FOLLOWER_NPC_FLAG_ALL FOLLOWER_NPC_FLAG_ALL_LAND | FOLLOWER_NPC_FLAG_ALL_WATER | FOLLOWER_NPC_FLAG_CLEAR_ON_WHITE_OUT // Shorter flag names for ease of use in setfollowernpc script macro -#define FNPC_RUNNING FOLLOWER_NPC_FLAG_HAS_RUNNING_FRAMES #define FNPC_BIKE FOLLOWER_NPC_FLAG_CAN_BIKE #define FNPC_LEAVE_ROUTE FOLLOWER_NPC_FLAG_CAN_LEAVE_ROUTE #define FNPC_SURF FOLLOWER_NPC_FLAG_CAN_SURF @@ -27,8 +25,4 @@ #define FNPC_ALL_WATER FOLLOWER_NPC_FLAG_ALL_WATER #define FNPC_ALL FOLLOWER_NPC_FLAG_ALL - -#define FNPC_NONE 0 -#define FNPC_ALWAYS 2 - #endif // GUARD_CONSTANTS_FOLLOWER_NPC_H diff --git a/include/constants/form_change_types.h b/include/constants/form_change_types.h index 0670e9564545..f43f3bddc68f 100644 --- a/include/constants/form_change_types.h +++ b/include/constants/form_change_types.h @@ -48,7 +48,7 @@ enum FormChanges FORM_CHANGE_WITHDRAW, // Form change that activates when the PokΓ©mon faints, either in battle or in the overworld by poison. // If species is not specified and it's on the player's side, it will try to use the value - // saved in gBattleStruct->changedSpecies from a previous form change. + // saved in gBattleStruct->partyState[x][y].changedSpecies from a previous form change. // - No parameters. FORM_CHANGE_FAINT, // Form change that activates when the PokΓ©mon is sent out at the beginning of a battle @@ -56,14 +56,14 @@ enum FormChanges // param2: a move that will be replaced, optional // param3: a new move to replace it with, optional FORM_CHANGE_BEGIN_BATTLE, - // Form change that activates at the end of a battle. If species is not specified and it's on the player's side, it will try to use the value saved in gBattleStruct->changedSpecies from a previous form change. + // Form change that activates at the end of a battle. If species is not specified and it's on the player's side, it will try to use the value saved in gBattleStruct->partyState[x][y].changedSpecies from a previous form change. // param1: item to hold, optional // param2: a move that will be replaced, optional // param3: a new move to replace it with, optional FORM_CHANGE_END_BATTLE, - // Form change that activates at the end of a battle based on the terrain if it participated in the battle and hasn't fainted. Takes priority over FORM_CHANGE_END_BATTLE. - // param1: battle terrain to check. - FORM_CHANGE_END_BATTLE_TERRAIN, + // Form change that activates at the end of a battle based on the environment if it participated in the battle and hasn't fainted. Takes priority over FORM_CHANGE_END_BATTLE. + // param1: battle environment to check. + FORM_CHANGE_END_BATTLE_ENVIRONMENT, // Form change that activates when the PokΓ©mon is switched out in battle. // param1: ability to check, optional FORM_CHANGE_BATTLE_SWITCH, @@ -125,6 +125,9 @@ enum FormChanges // param1: move to check // param2: ability to check, optional FORM_CHANGE_BATTLE_BEFORE_MOVE, + // Form change that activates after using a move. + // param1: move to check + FORM_CHANGE_BATTLE_AFTER_MOVE, // Form change that activates before using a specific move category. // param1: move category to check // param2: ability to check, optional diff --git a/include/constants/generational_changes.h b/include/constants/generational_changes.h index 060d4167eff2..755a4d118634 100644 --- a/include/constants/generational_changes.h +++ b/include/constants/generational_changes.h @@ -1,23 +1,211 @@ #ifndef GUARD_CONSTANTS_GENERATIONAL_CHANGES_H #define GUARD_CONSTANTS_GENERATIONAL_CHANGES_H -enum GenConfigTag +/* Config definitions */ +#define CONFIG_DEFINITIONS(F) \ + /* Calculation settings */ \ + F(CRIT_CHANCE, critChance, (u32, GEN_COUNT - 1)) \ + F(CRIT_MULTIPLIER, critMultiplier, (u32, GEN_COUNT - 1)) \ + F(PARALYSIS_SPEED, paralysisSpeed, (u32, GEN_COUNT - 1)) \ + F(CONFUSION_SELF_DMG_CHANCE, confusionSelfDmgChance, (u32, GEN_COUNT - 1)) \ + F(MULTI_HIT_CHANCE, multiHitChance, (u32, GEN_COUNT - 1)) \ + F(WHITEOUT_MONEY, whiteoutMoney, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(LIGHT_BALL_ATTACK_BOOST, lightBallAttackBoost, (u32, GEN_COUNT - 1)) \ + /* Experience settings */ \ + F(EXP_CATCH, expCatch, (u32, GEN_COUNT - 1)) \ + F(TRAINER_EXP_MULTIPLIER, trainerExpMultiplier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SPLIT_EXP, splitExp, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SCALED_EXP, scaledExp, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(UNEVOLVED_EXP_MULTIPLIER, unevolvedExpMultiplier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(LEVEL_UP_NOTIFICATION, levelUpNotification, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + /* Stat settings */ \ + F(BADGE_BOOST, badgeBoost, (u32, GEN_COUNT - 1)) \ + F(FRIENDSHIP_BOOST, friendshipBoost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(MAX_LEVEL_EV_GAINS, maxLevelEvGains, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(RECALCULATE_STATS, recalculateStats, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + /* Damage settings */ \ + F(BURN_DAMAGE, burnDamage, (u32, GEN_COUNT - 1)) \ + F(BURN_FACADE_DMG, burnFacadeDmg, (u32, GEN_COUNT - 1)) \ + F(BINDING_DAMAGE, bindingDamage, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(PSYWAVE_DMG, psywaveDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(PAYBACK_SWITCH_BOOST, paybackSwitchBoost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(HIDDEN_POWER_DMG, hiddenPowerDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(ROUGH_SKIN_DMG, roughSkinDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(KNOCK_OFF_DMG, knockOffDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SPORT_DMG_REDUCTION, sportDmgReduction, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(EXPLOSION_DEFENSE, explosionDefense, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(PARENTAL_BOND_DMG, parentalBondDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(MULTIPLE_TARGETS_DMG, multipleTargetsDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + /* Type settings */ \ + F(GHOSTS_ESCAPE, ghostsEscape, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(PARALYZE_ELECTRIC, paralyzeElectric, (u32, GEN_COUNT - 1)) \ + F(POWDER_GRASS, powderGrass, (u32, GEN_COUNT - 1)) \ + F(POWDER_OVERCOAT, powderOvercoat, (u32, GEN_COUNT - 1)) \ + F(UPDATED_TYPE_MATCHUPS, updatedTypeMatchups, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(PRANKSTER_DARK_TYPES, pranksterDarkTypes, (u32, GEN_COUNT - 1)) \ + F(SHEER_COLD_IMMUNITY, sheerColdImmunity, (u32, GEN_COUNT - 1)) \ + F(ROOST_PURE_FLYING, roostPureFlying, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(STATUS_TYPE_IMMUNITY, statusTypeImmunity, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + /* Turn settings */ \ + F(BINDING_TURNS, bindingTurns, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(UPROAR_TURNS, uproarTurns, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(UPROAR_IGNORE_SOUNDPROOF, uproarIgnoreSoundproof, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(DISABLE_TURNS, disableTurns, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(TAILWIND_TURNS, tailwindTurns, (u32, GEN_COUNT - 1)) \ + F(SLEEP_TURNS, sleepTurns, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(TAUNT_TURNS, tauntTurns, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SPORT_TURNS, sportTurns, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(MEGA_EVO_TURN_ORDER, megaEvoTurnOrder, (u32, GEN_COUNT - 1)) \ + F(RECALC_TURN_AFTER_ACTIONS, recalcTurnAfterActions, (u32, GEN_COUNT - 1)) \ + F(FAINT_SWITCH_IN, faintSwitchIn, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + /* Move data settings */ \ + F(UPDATED_MOVE_DATA, updatedMoveData, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(UPDATED_MOVE_TYPES, updatedMoveTypes, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(UPDATED_MOVE_FLAGS, updatedMoveFlags, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(PHYSICAL_SPECIAL_SPLIT, physicalSpecialSplit, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(RECOIL_IF_MISS_DMG, recoilIfMissDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(KLUTZ_FLING_INTERACTION, klutzFlingInteraction, (u32, GEN_COUNT - 1)) \ + F(UPDATED_CONVERSION, updatedConversion, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(UPDATED_CONVERSION_2, updatedConversion2, (u32, GEN_COUNT - 1)) \ + F(PP_REDUCED_BY_SPITE, ppReducedBySpite, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(EXTRAPOLATED_MOVE_FLAGS, extrapolatedMoveFlags, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + /* Ability data settings */ \ + F(UPDATED_ABILITY_DATA, updatedAbilityData, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + /* Move accuracy settings */ \ + F(TOXIC_NEVER_MISS, toxicNeverMiss, (u32, GEN_COUNT - 1)) \ + F(MINIMIZE_DMG_ACC, minimizeDmgAcc, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(BLIZZARD_HAIL, blizzardHail, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SHEER_COLD_ACC, sheerColdAcc, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + /* Move stat change settings */ \ + F(FELL_STINGER_STAT_RAISE, fellStingerStatRaise, (u32, GEN_COUNT - 1)) \ + F(KINGS_SHIELD_LOWER_ATK, kingsShieldLowerAtk, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SPEED_BUFFING_RAPID_SPIN, speedBuffingRapidSpin, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(CHARGE_SPDEF_RAISE, chargeSpDefRaise, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(MINIMIZE_EVASION, minimizeEvasion, (u32, GEN_COUNT - 1)) \ + F(GROWTH_STAT_RAISE, growthStatRaise, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(FOCUS_ENERGY_CRIT_RATIO, focusEnergyCritRatio, (u32, GEN_COUNT - 1)) \ + /* Other move settings */ \ + F(INCINERATE_GEMS, incinerateGems, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(CAN_SPITE_FAIL, canSpiteFail, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(CRASH_IF_TARGET_IMMUNE, crashIfTargetImmune, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(MEMENTO_FAIL, mementoFail, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(GLARE_GHOST, glareGhost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SKILL_SWAP, skillSwap, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(BRICK_BREAK, brickBreak, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(WISH_HP_SOURCE, wishHpSource, (u32, GEN_COUNT - 1)) \ + F(RAMPAGE_CANCELLING, rampageCancelling, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(HEAL_BLOCKING, healBlocking, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(ROOTED_GROUNDING, rootedGrounding, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(METRONOME_MOVES, metronomeMoves, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(TELEPORT_BEHAVIOR, teleportBehavior, (u32, GEN_COUNT - 1)) \ + F(BEAT_UP, beatUp, (u32, GEN_COUNT - 1)) \ + F(DARK_VOID_FAIL, darkVoidFail, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(BURN_HIT_THAW, burnHitThaw, (u32, GEN_COUNT - 1)) \ + F(HEALING_WISH_SWITCH, healingWishSwitch, (u32, GEN_COUNT - 1)) \ + F(DEFOG_EFFECT_CLEARING, defogEffectClearing, (u32, GEN_COUNT - 1)) \ + F(STOCKPILE_RAISES_DEFS, stockpileRaisesDefs, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(TRANSFORM_SHINY, transformShiny, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(TRANSFORM_FORM_CHANGES, transformFormChanges, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(WIDE_GUARD, wideGuard, (u32, GEN_COUNT - 1)) \ + F(QUICK_GUARD, quickGuard, (u32, GEN_COUNT - 1)) \ + F(IMPRISON, imprison, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(ALLY_SWITCH_FAIL_CHANCE, allySwitchFailChance, (u32, GEN_COUNT - 1)) \ + F(SKETCH_BANS, sketchBans, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(KNOCK_OFF_REMOVAL, knockOffRemoval, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(HEAL_BELL_SOUNDPROOF, healBellSoundproof, (u32, GEN_COUNT - 1)) \ + F(CHARGE, charge, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(POWDER_RAIN, powderRain, (u32, GEN_COUNT - 1)) \ + F(AFTER_YOU_TURN_ORDER, afterYouTurnOrder, (u32, GEN_COUNT - 1)) \ + F(QUASH_TURN_ORDER, quashTurnOrder, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(DESTINY_BOND_FAIL, destinyBondFail, (u32, GEN_COUNT - 1)) \ + F(PURSUIT_TARGET, pursuitTarget, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SKIP_RECHARGE, skipRecharge, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(ENCORE_TARGET, encoreTarget, (u32, GEN_COUNT - 1)) \ + F(TIME_OF_DAY_HEALING_MOVES, timeOfDayHealingMoves, (u32, GEN_COUNT - 1)) \ + F(DREAM_EATER_LIQUID_OOZE, dreamEaterLiquidOoze, (u32, GEN_COUNT - 1)) \ + /* Ability settings */ \ + F(GALE_WINGS, galeWings, (u32, GEN_COUNT - 1)) \ + F(STANCE_CHANGE_FAIL, stanceChangeFail, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SHADOW_TAG_ESCAPE, shadowTagEscape, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(MOODY_ACC_EVASION, moodyAccEvasion, (u32, GEN_COUNT - 1)) \ + F(FLASH_FIRE_FROZEN, flashFireFrozen, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SYNCHRONIZE_TOXIC, synchronizeToxic, (u32, GEN_COUNT - 1)) \ + F(UPDATED_INTIMIDATE, updatedIntimidate, (u32, GEN_COUNT - 1)) \ + F(OBLIVIOUS_TAUNT, obliviousTaunt, (u32, GEN_COUNT - 1)) \ + F(STURDY, sturdy, (u32, GEN_COUNT - 1)) \ + F(PLUS_MINUS_INTERACTION, plusMinusInteraction, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(WEATHER_FORMS, weatherForms, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SYMBIOSIS_GEMS, symbiosisGems, (u32, GEN_COUNT - 1)) \ + F(ABSORBING_ABILITY_STRING, absorbingAbilityString, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(REDIRECT_ABILITY_IMMUNITY, redirectAbilityImmunity, (u32, GEN_COUNT - 1)) \ + F(REDIRECT_ABILITY_ALLIES, redirectAbilityAllies, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(LEAF_GUARD_PREVENTS_REST, leafGuardPreventsRest, (u32, GEN_COUNT - 1)) \ + F(TRANSISTOR_BOOST, transistorBoost, (u32, GEN_COUNT - 1)) \ + F(ILLUMINATE_EFFECT, illuminateEffect, (u32, GEN_COUNT - 1)) \ + F(WEAK_ARMOR_SPEED, weakArmorSpeed, (u32, GEN_COUNT - 1)) \ + F(PROTEAN_LIBERO, proteanLibero, (u32, GEN_COUNT - 1)) \ + F(INTREPID_SWORD, intrepidSword, (u32, GEN_COUNT - 1)) \ + F(DAUNTLESS_SHIELD, dauntlessShield, (u32, GEN_COUNT - 1)) \ + F(DISGUISE_HP_LOSS, disguiseHpLoss, (u32, GEN_COUNT - 1)) \ + F(ABILITY_TRIGGER_CHANCE, abilityTriggerChance, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(PICKUP_WILD, pickupWild, (u32, GEN_COUNT - 1)) \ + F(MAGIC_GUARD, magicGuard, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(BATTLE_BOND, battleBond, (u32, GEN_COUNT - 1)) \ + F(ATE_MULTIPLIER, ateMultiplier, (u32, GEN_COUNT - 1)) \ + F(DEFIANT_STICKY_WEB, defiantStickyWeb, (u32, GEN_COUNT - 1)) \ + /* Item settings */ \ + F(CONFUSE_BERRIES_HEAL, confuseBerriesHeal, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(X_ITEMS_BUFF, xItemsBuff, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(MENTAL_HERB, mentalHerb, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(TRAINERS_KNOCK_OFF_ITEMS, trainersKnockOffItems, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(RETURN_STOLEN_NPC_ITEMS, returnStolenNpcItems, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(STEAL_WILD_ITEMS, stealWildItems, (u32, GEN_COUNT - 1)) \ + F(RESTORE_HELD_BATTLE_ITEMS, restoreHeldBattleItems, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SOUL_DEW_BOOST, soulDewBoost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(NET_BALL_MODIFIER, netBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(DIVE_BALL_MODIFIER, diveBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(NEST_BALL_MODIFIER, nestBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(REPEAT_BALL_MODIFIER, repeatBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(TIMER_BALL_MODIFIER, timerBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(DUSK_BALL_MODIFIER, duskBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(QUICK_BALL_MODIFIER, quickBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(LURE_BALL_MODIFIER, lureBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(HEAVY_BALL_MODIFIER, heavyBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(DREAM_BALL_MODIFIER, dreamBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SPORT_BALL_MODIFIER, sportBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SAFARI_BALL_MODIFIER, safariBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(FRIEND_BALL_MODIFIER, friendBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SERENE_GRACE_BOOST, sereneGraceBoost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(IRON_BALL, ironBall, (u32, GEN_COUNT - 1)) \ + /* Weather settings */ \ + F(ABILITY_WEATHER, abilityWeather, (u32, GEN_COUNT - 1)) \ + F(SANDSTORM_SPDEF_BOOST, sandstormSpDefBoost, (u32, GEN_COUNT - 1)) \ + F(OVERWORLD_FOG, overworldFog, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(OVERWORLD_SNOW, overworldSnow, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SNOW_WARNING, snowWarning, (u32, GEN_COUNT - 1)) \ + F(PREFERRED_ICE_WEATHER, preferredIceWeather, (u32, B_ICE_WEATHER_SNOW)) /* TODO: use in tests */ \ + /* Terrain settings */ \ + F(TERRAIN_TYPE_BOOST, terrainTypeBoost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SECRET_POWER_EFFECT, secretPowerEffect, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SECRET_POWER_ANIMATION, secretPowerAnimation, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(NATURE_POWER_MOVES, naturePowerMoves, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(CAMOUFLAGE_TYPES, camouflageTypes, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + /* Other settings */ \ + F(WILD_NATURAL_ENEMIES, wildNaturalEnemies, (u32, TRUE)) /* TODO: use in tests */ \ + F(AFFECTION_MECHANICS, affectionMechanics, (u32, TRUE)) /* TODO: use in tests */ \ + F(OBEDIENCE_MECHANICS, obedienceMechanics, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(USE_FROSTBITE, useFrostbite, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + + +#define GET_CONFIG_MAXIMUM(_typeMaxValue, ...) INVOKE_WITH_B(GET_CONFIG_MAXIMUM_, _typeMaxValue) +#define GET_CONFIG_MAXIMUM_(_type, ...) FIRST(__VA_OPT__(FIRST(__VA_ARGS__),) MAX_BITS((sizeof(_type) * 8))) + +#define UNPACK_CONFIG_ENUMS(_name, ...) CONFIG_##_name, + +enum ConfigTag { - GEN_CONFIG_CRIT_CHANCE, - GEN_CONFIG_CRIT_MULTIPLIER, - GEN_CONFIG_FOCUS_ENERGY_CRIT_RATIO, - GEN_CONFIG_PARALYSIS_SPEED, - GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE, - GEN_CONFIG_MULTI_HIT_CHANCE, - GEN_CONFIG_GALE_WINGS, - GEN_CONFIG_HEAL_BELL_SOUNDPROOF, - GEN_CONFIG_TELEPORT_BEHAVIOR, - GEN_CONFIG_ABILITY_WEATHER, - GEN_CONFIG_MOODY_STATS, - GEN_CONFIG_BATTLE_BOND, - GEN_CONFIG_ATE_MULTIPLIER, - GEN_CONFIG_FELL_STINGER_STAT_RAISE, - GEN_CONFIG_COUNT + CONFIG_DEFINITIONS(UNPACK_CONFIG_ENUMS) + CONFIG_COUNT }; #endif // GUARD_CONSTANTS_GENERATIONAL_CHANGES_H diff --git a/include/constants/global.h b/include/constants/global.h index 4698dbc3b457..fa0ebbcc0fb2 100644 --- a/include/constants/global.h +++ b/include/constants/global.h @@ -1,17 +1,33 @@ #ifndef GUARD_CONSTANTS_GLOBAL_H #define GUARD_CONSTANTS_GLOBAL_H -#include "config/general.h" +// You can use the ENABLED_ON_RELEASE and DISABLED_ON_RELEASE macros to +// control whether a feature is enabled or disabled when making a release build. +// +// For example, the overworld debug menu is enabled by default, but when using +// `make release`, it will be automatically disabled. +// +// #define DEBUG_OVERWORLD_MENU DISABLED_ON_RELEASE +#ifdef RELEASE +#define ENABLED_ON_RELEASE TRUE +#define DISABLED_ON_RELEASE FALSE +#else +#define ENABLED_ON_RELEASE FALSE +#define DISABLED_ON_RELEASE TRUE +#endif + +#include "config/ai.h" #include "config/battle.h" +#include "config/caps.h" +#include "config/contest.h" #include "config/debug.h" +#include "config/dexnav.h" +#include "config/follower_npc.h" +#include "config/general.h" #include "config/item.h" -#include "config/caps.h" -#include "config/pokemon.h" #include "config/overworld.h" -#include "config/dexnav.h" +#include "config/pokemon.h" #include "config/summary_screen.h" -#include "config/ai.h" -#include "config/follower_npc.h" // Invalid Versions show as "----------" in Gen 4 and Gen 5's summary screen. // In Gens 6 and 7, invalid versions instead show "a distant land" in the summary screen. @@ -63,11 +79,6 @@ #define SECRET_BASES_COUNT 20 #define POKE_NEWS_COUNT 16 #define PC_ITEMS_COUNT 50 -#define BAG_ITEMS_COUNT 30 -#define BAG_KEYITEMS_COUNT 30 -#define BAG_POKEBALLS_COUNT 16 -#define BAG_TMHM_COUNT 64 -#define BAG_BERRIES_COUNT 46 #define OBJECT_EVENT_TEMPLATES_COUNT 64 #define DECOR_MAX_SECRET_BASE 16 #define DECOR_MAX_PLAYERS_HOUSE 12 @@ -81,6 +92,13 @@ #define PYRAMID_BAG_ITEMS_COUNT 10 #define ROAMER_COUNT 1 // Number of maximum concurrent active roamers +// Bag constants +#define BAG_ITEMS_COUNT 30 +#define BAG_KEYITEMS_COUNT 30 +#define BAG_POKEBALLS_COUNT 16 +#define BAG_TMHM_COUNT 64 +#define BAG_BERRIES_COUNT 46 + // Number of facilities for Ranking Hall. // 7 facilities for single mode + tower double mode + tower multi mode. // Excludes link modes. See RANKING_HALL_* in include/constants/battle_frontier.h @@ -99,12 +117,14 @@ #define ALL_MOVES_MASK ((1 << MAX_MON_MOVES) - 1) #define CONTESTANT_COUNT 4 -#define CONTEST_CATEGORY_COOL 0 -#define CONTEST_CATEGORY_BEAUTY 1 -#define CONTEST_CATEGORY_CUTE 2 -#define CONTEST_CATEGORY_SMART 3 -#define CONTEST_CATEGORY_TOUGH 4 -#define CONTEST_CATEGORIES_COUNT 5 +#define CONTEST_CATEGORY_COOL 0 +#define CONTEST_CATEGORY_BEAUTIFUL 1 +#define CONTEST_CATEGORY_BEAUTY CONTEST_CATEGORY_BEAUTIFUL +#define CONTEST_CATEGORY_CUTE 2 +#define CONTEST_CATEGORY_CLEVER 3 +#define CONTEST_CATEGORY_SMART CONTEST_CATEGORY_CLEVER +#define CONTEST_CATEGORY_TOUGH 4 +#define CONTEST_CATEGORIES_COUNT 5 // string lengths #define ITEM_NAME_LENGTH 20 @@ -146,6 +166,7 @@ #define OPTIONS_TEXT_SPEED_SLOW 0 #define OPTIONS_TEXT_SPEED_MID 1 #define OPTIONS_TEXT_SPEED_FAST 2 +#define OPTIONS_TEXT_SPEED_INSTANT 3 #define OPTIONS_SOUND_MONO 0 #define OPTIONS_SOUND_STEREO 1 diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index c7ed811601a0..32dacc36d34d 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -1,7 +1,7 @@ #ifndef GUARD_HOLD_EFFECTS_H #define GUARD_HOLD_EFFECTS_H -enum ItemHoldEffect +enum __attribute__((packed)) HoldEffect { HOLD_EFFECT_NONE, HOLD_EFFECT_RESTORE_HP, @@ -120,7 +120,7 @@ enum ItemHoldEffect // Gen7 hold effects HOLD_EFFECT_PROTECTIVE_PADS, HOLD_EFFECT_TERRAIN_EXTENDER, - HOLD_EFFECT_SEEDS, + HOLD_EFFECT_TERRAIN_SEED, HOLD_EFFECT_ADRENALINE_ORB, HOLD_EFFECT_MEMORY, HOLD_EFFECT_Z_CRYSTAL, @@ -142,14 +142,21 @@ enum ItemHoldEffect HOLD_EFFECT_OGERPON_MASK, // Gen2 hold effect HOLD_EFFECT_BERSERK_GENE, + HOLD_EFFECT_COUNT }; -#define HOLD_EFFECT_CHOICE(holdEffect) ((holdEffect == HOLD_EFFECT_CHOICE_BAND || holdEffect == HOLD_EFFECT_CHOICE_SCARF || holdEffect == HOLD_EFFECT_CHOICE_SPECS)) - // Terrain seed params #define HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN 0 #define HOLD_EFFECT_PARAM_GRASSY_TERRAIN 1 #define HOLD_EFFECT_PARAM_MISTY_TERRAIN 2 #define HOLD_EFFECT_PARAM_PSYCHIC_TERRAIN 3 +enum ItemActivationState +{ + ACTIVATION_ON_USABLE_AGAIN, + ACTIVATION_ON_PICK_UP, + ACTIVATION_ON_HARVEST, + ACTIVATION_ON_HP_THRESHOLD, +}; + #endif // GUARD_HOLD_EFFECTS_H diff --git a/include/constants/item.h b/include/constants/item.h index 587270e0e9a5..2d8c3f9419cb 100644 --- a/include/constants/item.h +++ b/include/constants/item.h @@ -1,20 +1,16 @@ #ifndef GUARD_ITEM_CONSTANTS_H #define GUARD_ITEM_CONSTANTS_H -// These constants are used in gItemsInfo -#define POCKET_NONE 0 -#define POCKET_ITEMS 1 -#define POCKET_POKE_BALLS 2 -#define POCKET_TM_HM 3 -#define POCKET_BERRIES 4 -#define POCKET_KEY_ITEMS 5 - -#define ITEMS_POCKET 0 -#define BALLS_POCKET 1 -#define TMHM_POCKET 2 -#define BERRIES_POCKET 3 -#define KEYITEMS_POCKET 4 -#define POCKETS_COUNT 5 +enum Pocket +{ + POCKET_ITEMS, + POCKET_POKE_BALLS, + POCKET_TM_HM, + POCKET_BERRIES, + POCKET_KEY_ITEMS, + POCKETS_COUNT, + POCKET_DUMMY = POCKETS_COUNT, +}; #define REPEL_LURE_MASK (1 << 15) #define IS_LAST_USED_LURE(var) (var & REPEL_LURE_MASK) diff --git a/include/constants/item_effects.h b/include/constants/item_effects.h index ac1c7d5c5b6e..037f28c4bcdd 100644 --- a/include/constants/item_effects.h +++ b/include/constants/item_effects.h @@ -93,4 +93,11 @@ #define ITEM_EFFECT_HEAL_PP 21 #define ITEM_EFFECT_NONE 22 +#define ITEM_FRIENDSHIP_MAPSEC_BONUS 1 // The amount of bonus friendship gained when an item is used on a PokΓ©mon whose met location matches the current map section. +#define ITEM_FRIENDSHIP_LUXURY_BONUS 1 // The amount of bonus friendship gained when a PokΓ©mon is in the Luxury Ball. + +// Since X item stat increases are now handled by battle scripts, the friendship increase effect is now handled by the battle controller in HandleAction_UseItem. +#define X_ITEM_FRIENDSHIP_INCREASE 1 // The amount of friendship gained by using an X item on a PokΓ©mon in battle. +#define X_ITEM_MAX_FRIENDSHIP 200 // Friendship threshold at which PokΓ©mon stop receiving a friendship increase from using X items on them in battle. + #endif // GUARD_CONSTANTS_ITEM_EFFECTS_H diff --git a/include/constants/items.h b/include/constants/items.h index 0abfc31a44d7..ca25c57c3c51 100644 --- a/include/constants/items.h +++ b/include/constants/items.h @@ -994,10 +994,34 @@ #define ITEM_STRANGE_BALL 828 -// HOPO BERRY -// LEGEND PLATE - -#define ITEMS_COUNT 829 +#define ITEM_CLEFABLITE 829 +#define ITEM_VICTREEBELITE 830 +#define ITEM_STARMINITE 831 +#define ITEM_DRAGONINITE 832 +#define ITEM_MEGANIUMITE 833 +#define ITEM_FERALIGITE 834 +#define ITEM_SKARMORITE 835 +#define ITEM_FROSLASSITE 836 +#define ITEM_EMBOARITE 837 +#define ITEM_EXCADRITE 838 +#define ITEM_SCOLIPITE 839 +#define ITEM_SCRAFTINITE 840 +#define ITEM_EELEKTROSSITE 841 +#define ITEM_CHANDELURITE 842 +#define ITEM_CHESNAUGHTITE 843 +#define ITEM_DELPHOXITE 844 +#define ITEM_GRENINJITE 845 +#define ITEM_PYROARITE 846 +#define ITEM_FLOETTITE 847 +#define ITEM_MALAMARITE 848 +#define ITEM_BARBARACITE 849 +#define ITEM_DRAGALGITE 850 +#define ITEM_HAWLUCHANITE 851 +#define ITEM_ZYGARDITE 852 +#define ITEM_DRAMPANITE 853 +#define ITEM_FALINKSITE 854 + +#define ITEMS_COUNT 855 #define ITEM_FIELD_ARROW ITEMS_COUNT // A special item id associated with "Cancel"/"Exit" etc. in a list of items or decorations @@ -1027,9 +1051,6 @@ #define MAIL_NONE 0xFF #define ITEM_TO_MULCH(itemId)(((itemId) - ITEM_GROWTH_MULCH) + 1) -#define NUM_TECHNICAL_MACHINES 100 -#define NUM_HIDDEN_MACHINES 8 - #define MAX_BAG_ITEM_CAPACITY 999 #define MAX_PC_ITEM_CAPACITY 999 #define MAX_PYRAMID_BAG_ITEM_CAPACITY 99 // Values higher than 255 require free SaveBlock2 space. diff --git a/include/constants/map_types.h b/include/constants/map_types.h index 03a3f0a9a07b..86571434e4a2 100755 --- a/include/constants/map_types.h +++ b/include/constants/map_types.h @@ -1,25 +1,31 @@ #ifndef GUARD_CONSTANTS_MAP_TYPES_H #define GUARD_CONSTANTS_MAP_TYPES_H -#define MAP_TYPE_NONE 0 -#define MAP_TYPE_TOWN 1 -#define MAP_TYPE_CITY 2 -#define MAP_TYPE_ROUTE 3 -#define MAP_TYPE_UNDERGROUND 4 -#define MAP_TYPE_UNDERWATER 5 -#define MAP_TYPE_OCEAN_ROUTE 6 -#define MAP_TYPE_UNKNOWN 7 // Not used by any map. -#define MAP_TYPE_INDOOR 8 -#define MAP_TYPE_SECRET_BASE 9 +enum MapType +{ + MAP_TYPE_NONE, + MAP_TYPE_TOWN, + MAP_TYPE_CITY, + MAP_TYPE_ROUTE, + MAP_TYPE_UNDERGROUND, + MAP_TYPE_UNDERWATER, + MAP_TYPE_OCEAN_ROUTE, + MAP_TYPE_UNKNOWN, // Not used by any map. + MAP_TYPE_INDOOR, + MAP_TYPE_SECRET_BASE, +}; -#define MAP_BATTLE_SCENE_NORMAL 0 -#define MAP_BATTLE_SCENE_GYM 1 -#define MAP_BATTLE_SCENE_MAGMA 2 -#define MAP_BATTLE_SCENE_AQUA 3 -#define MAP_BATTLE_SCENE_SIDNEY 4 -#define MAP_BATTLE_SCENE_PHOEBE 5 -#define MAP_BATTLE_SCENE_GLACIA 6 -#define MAP_BATTLE_SCENE_DRAKE 7 -#define MAP_BATTLE_SCENE_FRONTIER 8 +enum MapBattleScene +{ + MAP_BATTLE_SCENE_NORMAL, + MAP_BATTLE_SCENE_GYM, + MAP_BATTLE_SCENE_MAGMA, + MAP_BATTLE_SCENE_AQUA, + MAP_BATTLE_SCENE_SIDNEY, + MAP_BATTLE_SCENE_PHOEBE, + MAP_BATTLE_SCENE_GLACIA, + MAP_BATTLE_SCENE_DRAKE, + MAP_BATTLE_SCENE_FRONTIER, +}; #endif // GUARD_CONSTANTS_MAP_TYPES_H diff --git a/include/constants/maps.h b/include/constants/maps.h index d41f03c68370..36e27d78b7d1 100644 --- a/include/constants/maps.h +++ b/include/constants/maps.h @@ -3,11 +3,14 @@ #include "map_groups.h" -// Warps using this map will instead use the warp data stored in gSaveBlock1Ptr->dynamicWarp. -// Used for warps that need to change destinations, e.g. when stepping off an elevator. -#define MAP_DYNAMIC (0x7F | (0x7F << 8)) +enum +{ + // Warps using this map will instead use the warp data stored in gSaveBlock1Ptr->dynamicWarp. + // Used for warps that need to change destinations, e.g. when stepping off an elevator. + MAP_DYNAMIC = (0x7F | (0x7F << 8)), -#define MAP_UNDEFINED (0xFF | (0xFF << 8)) + MAP_UNDEFINED = (0xFF | (0xFF << 8)), +}; #define MAP_GROUP(map) (map >> 8) #define MAP_NUM(map) (map & 0xFF) diff --git a/include/constants/metatile_behaviors.h b/include/constants/metatile_behaviors.h index 505f279f7340..12ced67a9f29 100755 --- a/include/constants/metatile_behaviors.h +++ b/include/constants/metatile_behaviors.h @@ -241,7 +241,7 @@ enum { MB_UP_LEFT_STAIR_WARP, MB_DOWN_RIGHT_STAIR_WARP, MB_DOWN_LEFT_STAIR_WARP, - MB_UNUSED_EF, + MB_ROCK_CLIMB, NUM_METATILE_BEHAVIORS }; diff --git a/include/constants/move_relearner.h b/include/constants/move_relearner.h new file mode 100644 index 000000000000..0229cb7f1759 --- /dev/null +++ b/include/constants/move_relearner.h @@ -0,0 +1,29 @@ +#ifndef GUARD_CONSTANTS_MOVE_RELEARNER_H +#define GUARD_CONSTANTS_MOVE_RELEARNER_H + +// Max number of moves shown by the move relearner. +// Increased from 25 to 60 so Mew can display all TMs/HMs. +// If you plan on adding more TMs, increase this number too. +#define MAX_RELEARNER_MOVES 60 + +// Move Relearner menu change constants +enum MoveRelearnerStates +{ + MOVE_RELEARNER_LEVEL_UP_MOVES, + MOVE_RELEARNER_EGG_MOVES, + MOVE_RELEARNER_TM_MOVES, + MOVE_RELEARNER_TUTOR_MOVES, + MOVE_RELEARNER_COUNT, +}; + +enum RelearnMode +{ + RELEARN_MODE_NONE = 0, + RELEARN_MODE_SCRIPT = 1, // Relearning moves through an event script + // These two must stay 2 and 3, they are tied to the summary screen pages + RELEARN_MODE_PSS_PAGE_BATTLE_MOVES = 2, // Relearning moves through the summary screen's battle moves page + RELEARN_MODE_PSS_PAGE_CONTEST_MOVES = 3, // Relearning moves through the summary screen's contest moves page (defaults to contest page on relearner screen) + RELEARN_MODE_PARTY_MENU = 4, // Relearning moves through the party menu's moves submenu +}; + +#endif // GUARD_CONSTANTS_MOVE_RELEARNER_H diff --git a/include/constants/pokedex.h b/include/constants/pokedex.h index 241198e1786b..fd5ad2eb7b7e 100644 --- a/include/constants/pokedex.h +++ b/include/constants/pokedex.h @@ -3,7 +3,8 @@ // National PokΓ©dex order // These constants are NOT disabled by P_GEN_X_POKEMON to keep pokedex_orders.h clean. -enum { +enum NationalDexOrder +{ NATIONAL_DEX_NONE, // Kanto NATIONAL_DEX_BULBASAUR, @@ -1063,7 +1064,8 @@ enum { #define POKEMON_SLOTS_NUMBER (NATIONAL_DEX_COUNT + 1) // Hoenn PokΓ©dex order -enum { +enum HoennDexOrder +{ HOENN_DEX_NONE, HOENN_DEX_TREECKO, HOENN_DEX_GROVYLE, diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 659193861c58..59bf27d8237f 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -2,28 +2,31 @@ #define GUARD_CONSTANTS_POKEMON_H // PokΓ©mon types -#define TYPE_NONE 0 -#define TYPE_NORMAL 1 -#define TYPE_FIGHTING 2 -#define TYPE_FLYING 3 -#define TYPE_POISON 4 -#define TYPE_GROUND 5 -#define TYPE_ROCK 6 -#define TYPE_BUG 7 -#define TYPE_GHOST 8 -#define TYPE_STEEL 9 -#define TYPE_MYSTERY 10 -#define TYPE_FIRE 11 -#define TYPE_WATER 12 -#define TYPE_GRASS 13 -#define TYPE_ELECTRIC 14 -#define TYPE_PSYCHIC 15 -#define TYPE_ICE 16 -#define TYPE_DRAGON 17 -#define TYPE_DARK 18 -#define TYPE_FAIRY 19 -#define TYPE_STELLAR 20 -#define NUMBER_OF_MON_TYPES 21 +enum __attribute__((packed)) Type +{ + TYPE_NONE = 0, + TYPE_NORMAL = 1, + TYPE_FIGHTING = 2, + TYPE_FLYING = 3, + TYPE_POISON = 4, + TYPE_GROUND = 5, + TYPE_ROCK = 6, + TYPE_BUG = 7, + TYPE_GHOST = 8, + TYPE_STEEL = 9, + TYPE_MYSTERY = 10, + TYPE_FIRE = 11, + TYPE_WATER = 12, + TYPE_GRASS = 13, + TYPE_ELECTRIC = 14, + TYPE_PSYCHIC = 15, + TYPE_ICE = 16, + TYPE_DRAGON = 17, + TYPE_DARK = 18, + TYPE_FAIRY = 19, + TYPE_STELLAR = 20, + NUMBER_OF_MON_TYPES +}; // PokΓ©mon egg groups #define EGG_GROUP_NONE 0 @@ -74,16 +77,18 @@ #define NUM_NATURES 25 // PokΓ©mon Stats -#define STAT_HP 0 -#define STAT_ATK 1 -#define STAT_DEF 2 -#define STAT_SPEED 3 -#define STAT_SPATK 4 -#define STAT_SPDEF 5 -#define NUM_STATS 6 - -#define STAT_ACC 6 // Only in battles. -#define STAT_EVASION 7 // Only in battles. +enum __attribute__((packed)) Stat +{ + STAT_HP, + STAT_ATK, + STAT_DEF, + STAT_SPEED, + STAT_SPATK, + STAT_SPDEF, + NUM_STATS, + STAT_ACC = NUM_STATS, // Only in battles. + STAT_EVASION, // Only in battles. +}; #define NUM_NATURE_STATS (NUM_STATS - 1) // excludes HP #define NUM_BATTLE_STATS (NUM_STATS + 2) // includes Accuracy and Evasion @@ -169,7 +174,6 @@ #define LEVEL_UP_MOVE_END 0xFFFF #define MAX_LEVEL_UP_MOVES 20 -#define MAX_RELEARNER_MOVES max(MAX_LEVEL_UP_MOVES, 25) #define MON_MALE 0x00 #define MON_FEMALE 0xFE @@ -218,29 +222,38 @@ #define EV_ITEM_RAISE_LIMIT ((I_VITAMIN_EV_CAP >= GEN_8) ? MAX_PER_STAT_EVS : 100) // Move category defines. -#define DAMAGE_CATEGORY_PHYSICAL 0 -#define DAMAGE_CATEGORY_SPECIAL 1 -#define DAMAGE_CATEGORY_STATUS 2 +enum __attribute__((packed)) DamageCategory +{ + DAMAGE_CATEGORY_PHYSICAL, + DAMAGE_CATEGORY_SPECIAL, + DAMAGE_CATEGORY_STATUS +}; // Growth rates -#define GROWTH_MEDIUM_FAST 0 -#define GROWTH_ERRATIC 1 -#define GROWTH_FLUCTUATING 2 -#define GROWTH_MEDIUM_SLOW 3 -#define GROWTH_FAST 4 -#define GROWTH_SLOW 5 +enum GrowthRate +{ + GROWTH_MEDIUM_FAST, + GROWTH_ERRATIC, + GROWTH_FLUCTUATING, + GROWTH_MEDIUM_SLOW, + GROWTH_FAST, + GROWTH_SLOW, +}; // Body colors for PokΓ©dex search -#define BODY_COLOR_RED 0 -#define BODY_COLOR_BLUE 1 -#define BODY_COLOR_YELLOW 2 -#define BODY_COLOR_GREEN 3 -#define BODY_COLOR_BLACK 4 -#define BODY_COLOR_BROWN 5 -#define BODY_COLOR_PURPLE 6 -#define BODY_COLOR_GRAY 7 -#define BODY_COLOR_WHITE 8 -#define BODY_COLOR_PINK 9 +enum BodyColor +{ + BODY_COLOR_RED, + BODY_COLOR_BLUE, + BODY_COLOR_YELLOW, + BODY_COLOR_GREEN, + BODY_COLOR_BLACK, + BODY_COLOR_BROWN, + BODY_COLOR_PURPLE, + BODY_COLOR_GRAY, + BODY_COLOR_WHITE, + BODY_COLOR_PINK, +}; #define F_SUMMARY_SCREEN_FLIP_SPRITE 0x80 @@ -291,6 +304,8 @@ enum EvolutionConditions { IF_PID_MODULO_100_LT, // The PokΓ©mon's personality value's modulo by 100 is lower than the defined value. IF_MIN_OVERWORLD_STEPS, // The Player has taken a specific amount of steps in the overworld with the PokΓ©mon following them or in the first slot of the party. IF_BAG_ITEM_COUNT, // The Player has the specific amount of an item in the bag. It then removes those items. + IF_REGION, // The Player is in the specific region. + IF_NOT_REGION, // The Player is NOT in the specific region. CONDITIONS_END }; @@ -313,6 +328,7 @@ enum EvolutionMode { EVO_MODE_ITEM_CHECK, // If an Everstone is being held, still want to show that the stone *could* be used on that PokΓ©mon to evolve EVO_MODE_BATTLE_SPECIAL, EVO_MODE_OVERWORLD_SPECIAL, + EVO_MODE_SCRIPT_TRIGGER, EVO_MODE_BATTLE_ONLY, // This mode is only used in battles to support Tandemaus' unique requirement }; @@ -337,6 +353,12 @@ enum EvoSpinDirections { SPIN_EITHER, // Player spins either clockwise or counter-clockwise }; +enum ShinyMode { + SHINY_MODE_ALWAYS, + SHINY_MODE_RANDOM, + SHINY_MODE_NEVER +}; + #define MON_PIC_WIDTH 64 #define MON_PIC_HEIGHT 64 #define MON_PIC_SIZE (MON_PIC_WIDTH * MON_PIC_HEIGHT / 2) diff --git a/include/constants/rtc.h b/include/constants/rtc.h index 65ee9c35ed07..ea0748b50696 100644 --- a/include/constants/rtc.h +++ b/include/constants/rtc.h @@ -81,7 +81,7 @@ #define NIGHT_HOUR_END 6 #endif -// TIMES_OF_DAY_COUNT must be last +// TIMES_OF_DAY_COUNT must be last or things will break enum TimeOfDay { TIME_MORNING, @@ -91,6 +91,10 @@ enum TimeOfDay TIMES_OF_DAY_COUNT, }; +// for incrementing/decrementing +#define TIME_FIRST 0 +#define TIME_LAST (TIMES_OF_DAY_COUNT - 1) + #define TIME_OF_DAY_DEFAULT 0 #endif // GUARD_CONSTANTS_RTC_H diff --git a/include/constants/script_commands.h b/include/constants/script_commands.h new file mode 100644 index 000000000000..4adf99ccef21 --- /dev/null +++ b/include/constants/script_commands.h @@ -0,0 +1,238 @@ +// +// DO NOT MODIFY THIS FILE! It is auto-generated by tools/misc/make_scr_cmd_constants.py +// +#ifndef GUARD_SCR_CMD_CONSTANTS_H +#define GUARD_SCR_CMD_CONSTANTS_H + +#define SCR_OP_NOP 0x00 +#define SCR_OP_NOP1 0x01 +#define SCR_OP_END 0x02 +#define SCR_OP_RETURN 0x03 +#define SCR_OP_CALL 0x04 +#define SCR_OP_GOTO 0x05 +#define SCR_OP_GOTO_IF 0x06 +#define SCR_OP_CALL_IF 0x07 +#define SCR_OP_GOTO_STD 0x08 +#define SCR_OP_CALL_STD 0x09 +#define SCR_OP_GOTO_STD_IF 0x0a +#define SCR_OP_CALL_STD_IF 0x0b +#define SCR_OP_RETURNRAM 0x0c +#define SCR_OP_ENDRAM 0x0d +#define SCR_OP_SETMYSTERYEVENTSTATUS 0x0e +#define SCR_OP_LOAD_WORD 0x0f +#define SCR_OP_LOAD_BYTE 0x10 +#define SCR_OP_SETPTR 0x11 +#define SCR_OP_LOADBYTEFROMPTR 0x12 +#define SCR_OP_SETPTRBYTE 0x13 +#define SCR_OP_COPYLOCAL 0x14 +#define SCR_OP_COPYBYTE 0x15 +#define SCR_OP_SETVAR 0x16 +#define SCR_OP_ADDVAR 0x17 +#define SCR_OP_SUBVAR 0x18 +#define SCR_OP_COPYVAR 0x19 +#define SCR_OP_SETORCOPYVAR 0x1a +#define SCR_OP_COMPARE_LOCAL_TO_LOCAL 0x1b +#define SCR_OP_COMPARE_LOCAL_TO_VALUE 0x1c +#define SCR_OP_COMPARE_LOCAL_TO_PTR 0x1d +#define SCR_OP_COMPARE_PTR_TO_LOCAL 0x1e +#define SCR_OP_COMPARE_PTR_TO_VALUE 0x1f +#define SCR_OP_COMPARE_PTR_TO_PTR 0x20 +#define SCR_OP_COMPARE_VAR_TO_VALUE 0x21 +#define SCR_OP_COMPARE_VAR_TO_VAR 0x22 +#define SCR_OP_CALLNATIVE 0x23 +#define SCR_OP_GOTONATIVE 0x24 +#define SCR_OP_SPECIAL 0x25 +#define SCR_OP_SPECIALVAR 0x26 +#define SCR_OP_WAITSTATE 0x27 +#define SCR_OP_DELAY 0x28 +#define SCR_OP_SETFLAG 0x29 +#define SCR_OP_CLEARFLAG 0x2a +#define SCR_OP_CHECKFLAG 0x2b +#define SCR_OP_INITCLOCK 0x2c +#define SCR_OP_DOTIMEBASEDEVENTS 0x2d +#define SCR_OP_GETTIME 0x2e +#define SCR_OP_PLAYSE 0x2f +#define SCR_OP_WAITSE 0x30 +#define SCR_OP_PLAYFANFARE 0x31 +#define SCR_OP_WAITFANFARE 0x32 +#define SCR_OP_PLAYBGM 0x33 +#define SCR_OP_SAVEBGM 0x34 +#define SCR_OP_FADEDEFAULTBGM 0x35 +#define SCR_OP_FADENEWBGM 0x36 +#define SCR_OP_FADEOUTBGM 0x37 +#define SCR_OP_FADEINBGM 0x38 +#define SCR_OP_WARP 0x39 +#define SCR_OP_WARPSILENT 0x3a +#define SCR_OP_WARPDOOR 0x3b +#define SCR_OP_WARPHOLE 0x3c +#define SCR_OP_WARPTELEPORT 0x3d +#define SCR_OP_SETWARP 0x3e +#define SCR_OP_SETDYNAMICWARP 0x3f +#define SCR_OP_SETDIVEWARP 0x40 +#define SCR_OP_SETHOLEWARP 0x41 +#define SCR_OP_GETPLAYERXY 0x42 +#define SCR_OP_GETPARTYSIZE 0x43 +#define SCR_OP_ADDITEM 0x44 +#define SCR_OP_REMOVEITEM 0x45 +#define SCR_OP_CHECKITEMSPACE 0x46 +#define SCR_OP_CHECKITEM 0x47 +#define SCR_OP_CHECKITEMTYPE 0x48 +#define SCR_OP_ADDPCITEM 0x49 +#define SCR_OP_CHECKPCITEM 0x4a +#define SCR_OP_ADDDECORATION 0x4b +#define SCR_OP_REMOVEDECORATION 0x4c +#define SCR_OP_CHECKDECOR 0x4d +#define SCR_OP_CHECKDECORSPACE 0x4e +#define SCR_OP_APPLYMOVEMENT 0x4f +#define SCR_OP_APPLYMOVEMENTAT 0x50 +#define SCR_OP_WAITMOVEMENT 0x51 +#define SCR_OP_WAITMOVEMENTAT 0x52 +#define SCR_OP_REMOVEOBJECT 0x53 +#define SCR_OP_REMOVEOBJECTAT 0x54 +#define SCR_OP_ADDOBJECT 0x55 +#define SCR_OP_ADDOBJECTAT 0x56 +#define SCR_OP_SETOBJECTXY 0x57 +#define SCR_OP_SHOWOBJECTAT 0x58 +#define SCR_OP_HIDEOBJECTAT 0x59 +#define SCR_OP_FACEPLAYER 0x5a +#define SCR_OP_TURNOBJECT 0x5b +#define SCR_OP_TRAINERBATTLE 0x5c +#define SCR_OP_DOTRAINERBATTLE 0x5d +#define SCR_OP_GOTOPOSTBATTLESCRIPT 0x5e +#define SCR_OP_GOTOBEATENSCRIPT 0x5f +#define SCR_OP_CHECKTRAINERFLAG 0x60 +#define SCR_OP_SETTRAINERFLAG 0x61 +#define SCR_OP_CLEARTRAINERFLAG 0x62 +#define SCR_OP_SETOBJECTXYPERM 0x63 +#define SCR_OP_COPYOBJECTXYTOPERM 0x64 +#define SCR_OP_SETOBJECTMOVEMENTTYPE 0x65 +#define SCR_OP_WAITMESSAGE 0x66 +#define SCR_OP_MESSAGE 0x67 +#define SCR_OP_CLOSEMESSAGE 0x68 +#define SCR_OP_LOCKALL 0x69 +#define SCR_OP_LOCK 0x6a +#define SCR_OP_RELEASEALL 0x6b +#define SCR_OP_RELEASE 0x6c +#define SCR_OP_WAITBUTTONPRESS 0x6d +#define SCR_OP_YESNOBOX 0x6e +#define SCR_OP_MULTICHOICE 0x6f +#define SCR_OP_MULTICHOICEDEFAULT 0x70 +#define SCR_OP_MULTICHOICEGRID 0x71 +#define SCR_OP_DRAWBOX 0x72 +#define SCR_OP_ERASEBOX 0x73 +#define SCR_OP_DRAWBOXTEXT 0x74 +#define SCR_OP_SHOWMONPIC 0x75 +#define SCR_OP_HIDEMONPIC 0x76 +#define SCR_OP_SHOWCONTESTPAINTING 0x77 +#define SCR_OP_BRAILLEMESSAGE 0x78 +#define SCR_OP_GIVEMON 0x79 +#define SCR_OP_GIVEEGG 0x7a +#define SCR_OP_SETMONMOVE 0x7b +#define SCR_OP_CHECKFIELDMOVE 0x7c +#define SCR_OP_BUFFERSPECIESNAME 0x7d +#define SCR_OP_BUFFERLEADMONSPECIESNAME 0x7e +#define SCR_OP_BUFFERPARTYMONNICK 0x7f +#define SCR_OP_BUFFERITEMNAME 0x80 +#define SCR_OP_BUFFERDECORATIONNAME 0x81 +#define SCR_OP_BUFFERMOVENAME 0x82 +#define SCR_OP_BUFFERNUMBERSTRING 0x83 +#define SCR_OP_BUFFERSTDSTRING 0x84 +#define SCR_OP_BUFFERSTRING 0x85 +#define SCR_OP_POKEMART 0x86 +#define SCR_OP_POKEMARTDECORATION 0x87 +#define SCR_OP_POKEMARTDECORATION2 0x88 +#define SCR_OP_PLAYSLOTMACHINE 0x89 +#define SCR_OP_SETBERRYTREE 0x8a +#define SCR_OP_CHOOSECONTESTMON 0x8b +#define SCR_OP_STARTCONTEST 0x8c +#define SCR_OP_SHOWCONTESTRESULTS 0x8d +#define SCR_OP_CONTESTLINKTRANSFER 0x8e +#define SCR_OP_RANDOM 0x8f +#define SCR_OP_ADDMONEY 0x90 +#define SCR_OP_REMOVEMONEY 0x91 +#define SCR_OP_CHECKMONEY 0x92 +#define SCR_OP_SHOWMONEYBOX 0x93 +#define SCR_OP_HIDEMONEYBOX 0x94 +#define SCR_OP_UPDATEMONEYBOX 0x95 +#define SCR_OP_GETPOKENEWSACTIVE 0x96 +#define SCR_OP_FADESCREEN 0x97 +#define SCR_OP_FADESCREENSPEED 0x98 +#define SCR_OP_SETFLASHLEVEL 0x99 +#define SCR_OP_ANIMATEFLASH 0x9a +#define SCR_OP_MESSAGEAUTOSCROLL 0x9b +#define SCR_OP_DOFIELDEFFECT 0x9c +#define SCR_OP_SETFIELDEFFECTARGUMENT 0x9d +#define SCR_OP_WAITFIELDEFFECT 0x9e +#define SCR_OP_SETRESPAWN 0x9f +#define SCR_OP_CHECKPLAYERGENDER 0xa0 +#define SCR_OP_PLAYMONCRY 0xa1 +#define SCR_OP_SETMETATILE 0xa2 +#define SCR_OP_RESETWEATHER 0xa3 +#define SCR_OP_SETWEATHER 0xa4 +#define SCR_OP_DOWEATHER 0xa5 +#define SCR_OP_SETSTEPCALLBACK 0xa6 +#define SCR_OP_SETMAPLAYOUTINDEX 0xa7 +#define SCR_OP_SETOBJECTSUBPRIORITY 0xa8 +#define SCR_OP_RESETOBJECTSUBPRIORITY 0xa9 +#define SCR_OP_CREATEVOBJECT 0xaa +#define SCR_OP_TURNVOBJECT 0xab +#define SCR_OP_OPENDOOR 0xac +#define SCR_OP_CLOSEDOOR 0xad +#define SCR_OP_WAITDOORANIM 0xae +#define SCR_OP_SETDOOROPEN 0xaf +#define SCR_OP_SETDOORCLOSED 0xb0 +#define SCR_OP_ADDELEVMENUITEM 0xb1 +#define SCR_OP_SHOWELEVMENU 0xb2 +#define SCR_OP_CHECKCOINS 0xb3 +#define SCR_OP_ADDCOINS 0xb4 +#define SCR_OP_REMOVECOINS 0xb5 +#define SCR_OP_SETWILDBATTLE 0xb6 +#define SCR_OP_DOWILDBATTLE 0xb7 +#define SCR_OP_SETVADDRESS 0xb8 +#define SCR_OP_VGOTO 0xb9 +#define SCR_OP_VCALL 0xba +#define SCR_OP_VGOTO_IF 0xbb +#define SCR_OP_VCALL_IF 0xbc +#define SCR_OP_VMESSAGE 0xbd +#define SCR_OP_VBUFFERMESSAGE 0xbe +#define SCR_OP_VBUFFERSTRING 0xbf +#define SCR_OP_SHOWCOINSBOX 0xc0 +#define SCR_OP_HIDECOINSBOX 0xc1 +#define SCR_OP_UPDATECOINSBOX 0xc2 +#define SCR_OP_INCREMENTGAMESTAT 0xc3 +#define SCR_OP_SETESCAPEWARP 0xc4 +#define SCR_OP_WAITMONCRY 0xc5 +#define SCR_OP_BUFFERBOXNAME 0xc6 +#define SCR_OP_TEXTCOLOR 0xc7 +#define SCR_OP_LOADHELP 0xc8 +#define SCR_OP_UNLOADHELP 0xc9 +#define SCR_OP_SIGNMSG 0xca +#define SCR_OP_NORMALMSG 0xcb +#define SCR_OP_COMPAREHIDDENVAR 0xcc +#define SCR_OP_SETMODERNFATEFULENCOUNTER 0xcd +#define SCR_OP_CHECKMODERNFATEFULENCOUNTER 0xce +#define SCR_OP_TRYWONDERCARDSCRIPT 0xcf +#define SCR_OP_SETWORLDMAPFLAG 0xd0 +#define SCR_OP_WARPSPINENTER 0xd1 +#define SCR_OP_SETMONMETLOCATION 0xd2 +#define SCR_OP_MOVEROTATINGTILEOBJECTS 0xd3 +#define SCR_OP_TURNROTATINGTILEOBJECTS 0xd4 +#define SCR_OP_INITROTATINGTILEPUZZLE 0xd5 +#define SCR_OP_FREEROTATINGTILEPUZZLE 0xd6 +#define SCR_OP_WARPMOSSDEEPGYM 0xd7 +#define SCR_OP_SELECTAPPROACHINGTRAINER 0xd8 +#define SCR_OP_LOCKFORTRAINER 0xd9 +#define SCR_OP_CLOSEBRAILLEMESSAGE 0xda +#define SCR_OP_MESSAGEINSTANT 0xdb +#define SCR_OP_FADESCREENSWAPBUFFERS 0xdc +#define SCR_OP_BUFFERTRAINERCLASSNAME 0xdd +#define SCR_OP_BUFFERTRAINERNAME 0xde +#define SCR_OP_POKENAVCALL 0xdf +#define SCR_OP_WARPWHITEFADE 0xe0 +#define SCR_OP_BUFFERCONTESTNAME 0xe1 +#define SCR_OP_BUFFERITEMNAMEPLURAL 0xe2 +#define SCR_OP_DYNMULTICHOICE 0xe3 +#define SCR_OP_DYNMULTIPUSH 0xe4 +#define SCR_OP_HIDEFOLLOWER 0xe5 + +#endif // GUARD_SCR_CMD_CONSTANTS_H diff --git a/include/constants/sound.h b/include/constants/sound.h index dc434bcf8a76..c16080d1ddba 100644 --- a/include/constants/sound.h +++ b/include/constants/sound.h @@ -33,6 +33,7 @@ #define CRY_MODE_GROWL_2 10 // For 2nd cry used by the move Growl #define CRY_MODE_WEAK 11 // Used when a PokΓ©mon is unhealthy #define CRY_MODE_WEAK_DOUBLES 12 // Equivalent to CRY_MODE_DOUBLES for CRY_MODE_WEAK +#define CRY_MODE_DYNAMAX 13 // Used during Dynamax // Given to SoundTask_PlayDoubleCry to determine which cry mode to use. Values are arbitrary #define DOUBLE_CRY_ROAR 2 diff --git a/include/constants/speaker_names.h b/include/constants/speaker_names.h new file mode 100644 index 000000000000..1f4f399e7549 --- /dev/null +++ b/include/constants/speaker_names.h @@ -0,0 +1,11 @@ +#ifndef GUARD_CONSTANTS_SPEAKER_NAMES_H +#define GUARD_CONSTANTS_SPEAKER_NAMES_H + +enum SpeakerNames { + SP_NAME_NONE = 0, + SP_NAME_MOM, + SP_NAME_PLAYER, + SP_NAME_COUNT +}; + +#endif // GUARD_CONSTANTS_SPEAKER_NAMES_H diff --git a/include/constants/species.h b/include/constants/species.h index 3656d7664ec8..ed31317c36fb 100644 --- a/include/constants/species.h +++ b/include/constants/species.h @@ -2,7 +2,7 @@ #define GUARD_CONSTANTS_SPECIES_H // NOTE: The defines here are named in order to match PokΓ©mon Showdown's naming conventions. This is done to avoid issues with trainerproc parsing species names. If a PokΓ©mon does not have an entry on Showdown, use your best judgement. -// Additionally, we have tried to reduce down to as few defines as possible, because programs like porymap does not always properly handle having multiple defines. +// Additionally, we have tried to reduce down to as few defines as possible, because programs like porymap do not always properly handle having multiple defines. // Discussion: https://github.com/rh-hideout/pokeemerald-expansion/pull/5075#issuecomment-2384088602 // Showdown: https://github.com/smogon/Pokemon-Showdown/blob/master/data/pokedex.ts @@ -1637,8 +1637,35 @@ #define SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GMAX SPECIES_URSHIFU_RAPID_STRIKE_GMAX #define SPECIES_MIMIKYU_BUSTED_TOTEM 1523 #define SPECIES_MIMIKYU_TOTEM_BUSTED SPECIES_MIMIKYU_BUSTED_TOTEM +// Legends Z-A +#define SPECIES_CLEFABLE_MEGA 1524 +#define SPECIES_VICTREEBEL_MEGA 1525 +#define SPECIES_STARMIE_MEGA 1526 +#define SPECIES_DRAGONITE_MEGA 1527 +#define SPECIES_MEGANIUM_MEGA 1528 +#define SPECIES_FERALIGATR_MEGA 1529 +#define SPECIES_SKARMORY_MEGA 1530 +#define SPECIES_FROSLASS_MEGA 1531 +#define SPECIES_EMBOAR_MEGA 1532 +#define SPECIES_EXCADRILL_MEGA 1533 +#define SPECIES_SCOLIPEDE_MEGA 1534 +#define SPECIES_SCRAFTY_MEGA 1535 +#define SPECIES_EELEKTROSS_MEGA 1536 +#define SPECIES_CHANDELURE_MEGA 1537 +#define SPECIES_CHESNAUGHT_MEGA 1538 +#define SPECIES_DELPHOX_MEGA 1539 +#define SPECIES_GRENINJA_MEGA 1540 +#define SPECIES_PYROAR_MEGA 1541 +#define SPECIES_MALAMAR_MEGA 1542 +#define SPECIES_DRAGALGE_MEGA 1543 +#define SPECIES_HAWLUCHA_MEGA 1544 +#define SPECIES_FLOETTE_MEGA 1545 +#define SPECIES_BARBARACLE_MEGA 1546 +#define SPECIES_ZYGARDE_MEGA 1547 +#define SPECIES_DRAMPA_MEGA 1548 +#define SPECIES_FALINKS_MEGA 1549 -#define SPECIES_EGG (SPECIES_MIMIKYU_BUSTED_TOTEM + 1) +#define SPECIES_EGG (SPECIES_FALINKS_MEGA + 1) #define NUM_SPECIES SPECIES_EGG diff --git a/include/constants/trade.h b/include/constants/trade.h index e387d13cd8c1..4049a0f19aa2 100644 --- a/include/constants/trade.h +++ b/include/constants/trade.h @@ -5,10 +5,13 @@ #define TRADE_PARTNER 1 // In-game Trade IDs -#define INGAME_TRADE_SEEDOT 0 -#define INGAME_TRADE_PLUSLE 1 -#define INGAME_TRADE_HORSEA 2 -#define INGAME_TRADE_MEOWTH 3 +enum InGameTradeID +{ + INGAME_TRADE_SEEDOT, + INGAME_TRADE_PLUSLE, + INGAME_TRADE_HORSEA, + INGAME_TRADE_MEOWTH, +}; // Return values for CanTradeSelectedMon and CanSpinTradeMon #define CAN_TRADE_MON 0 diff --git a/include/constants/trainers.h b/include/constants/trainers.h index ebfc18eef0d5..4f2200841069 100644 --- a/include/constants/trainers.h +++ b/include/constants/trainers.h @@ -285,73 +285,76 @@ #define RS_FACILITY_CLASSES_COUNT 0x4D -#define TRAINER_CLASS_PKMN_TRAINER_1 0x0 // Unused -#define TRAINER_CLASS_PKMN_TRAINER_2 0x1 // Unused -#define TRAINER_CLASS_HIKER 0x2 -#define TRAINER_CLASS_TEAM_AQUA 0x3 -#define TRAINER_CLASS_PKMN_BREEDER 0x4 -#define TRAINER_CLASS_COOLTRAINER 0x5 -#define TRAINER_CLASS_BIRD_KEEPER 0x6 -#define TRAINER_CLASS_COLLECTOR 0x7 -#define TRAINER_CLASS_SWIMMER_M 0x8 -#define TRAINER_CLASS_TEAM_MAGMA 0x9 -#define TRAINER_CLASS_EXPERT 0xa -#define TRAINER_CLASS_AQUA_ADMIN 0xb -#define TRAINER_CLASS_BLACK_BELT 0xc -#define TRAINER_CLASS_AQUA_LEADER 0xd -#define TRAINER_CLASS_HEX_MANIAC 0xe -#define TRAINER_CLASS_AROMA_LADY 0xf -#define TRAINER_CLASS_RUIN_MANIAC 0x10 -#define TRAINER_CLASS_INTERVIEWER 0x11 -#define TRAINER_CLASS_TUBER_F 0x12 -#define TRAINER_CLASS_TUBER_M 0x13 -#define TRAINER_CLASS_LADY 0x14 -#define TRAINER_CLASS_BEAUTY 0x15 -#define TRAINER_CLASS_RICH_BOY 0x16 -#define TRAINER_CLASS_POKEMANIAC 0x17 -#define TRAINER_CLASS_GUITARIST 0x18 -#define TRAINER_CLASS_KINDLER 0x19 -#define TRAINER_CLASS_CAMPER 0x1a -#define TRAINER_CLASS_PICNICKER 0x1b -#define TRAINER_CLASS_BUG_MANIAC 0x1c -#define TRAINER_CLASS_PSYCHIC 0x1d -#define TRAINER_CLASS_GENTLEMAN 0x1e -#define TRAINER_CLASS_ELITE_FOUR 0x1f -#define TRAINER_CLASS_LEADER 0x20 -#define TRAINER_CLASS_SCHOOL_KID 0x21 -#define TRAINER_CLASS_SR_AND_JR 0x22 -#define TRAINER_CLASS_WINSTRATE 0x23 -#define TRAINER_CLASS_POKEFAN 0x24 -#define TRAINER_CLASS_YOUNGSTER 0x25 -#define TRAINER_CLASS_CHAMPION 0x26 -#define TRAINER_CLASS_FISHERMAN 0x27 -#define TRAINER_CLASS_TRIATHLETE 0x28 -#define TRAINER_CLASS_DRAGON_TAMER 0x29 -#define TRAINER_CLASS_NINJA_BOY 0x2a -#define TRAINER_CLASS_BATTLE_GIRL 0x2b -#define TRAINER_CLASS_PARASOL_LADY 0x2c -#define TRAINER_CLASS_SWIMMER_F 0x2d -#define TRAINER_CLASS_TWINS 0x2e -#define TRAINER_CLASS_SAILOR 0x2f -#define TRAINER_CLASS_COOLTRAINER_2 0x30 // Used for only one trainer. -#define TRAINER_CLASS_MAGMA_ADMIN 0x31 -#define TRAINER_CLASS_RIVAL 0x32 -#define TRAINER_CLASS_BUG_CATCHER 0x33 -#define TRAINER_CLASS_PKMN_RANGER 0x34 -#define TRAINER_CLASS_MAGMA_LEADER 0x35 -#define TRAINER_CLASS_LASS 0x36 -#define TRAINER_CLASS_YOUNG_COUPLE 0x37 -#define TRAINER_CLASS_OLD_COUPLE 0x38 -#define TRAINER_CLASS_SIS_AND_BRO 0x39 -#define TRAINER_CLASS_SALON_MAIDEN 0x3a -#define TRAINER_CLASS_DOME_ACE 0x3b -#define TRAINER_CLASS_PALACE_MAVEN 0x3c -#define TRAINER_CLASS_ARENA_TYCOON 0x3d -#define TRAINER_CLASS_FACTORY_HEAD 0x3e -#define TRAINER_CLASS_PIKE_QUEEN 0x3f -#define TRAINER_CLASS_PYRAMID_KING 0x40 -#define TRAINER_CLASS_RS_PROTAG 0x41 -#define TRAINER_CLASS_COUNT 0x42 +enum TrainerClassID +{ + TRAINER_CLASS_PKMN_TRAINER_1, // Unused + TRAINER_CLASS_PKMN_TRAINER_2, // Unused + TRAINER_CLASS_HIKER, + TRAINER_CLASS_TEAM_AQUA, + TRAINER_CLASS_PKMN_BREEDER, + TRAINER_CLASS_COOLTRAINER, + TRAINER_CLASS_BIRD_KEEPER, + TRAINER_CLASS_COLLECTOR, + TRAINER_CLASS_SWIMMER_M, + TRAINER_CLASS_TEAM_MAGMA, + TRAINER_CLASS_EXPERT, + TRAINER_CLASS_AQUA_ADMIN, + TRAINER_CLASS_BLACK_BELT, + TRAINER_CLASS_AQUA_LEADER, + TRAINER_CLASS_HEX_MANIAC, + TRAINER_CLASS_AROMA_LADY, + TRAINER_CLASS_RUIN_MANIAC, + TRAINER_CLASS_INTERVIEWER, + TRAINER_CLASS_TUBER_F, + TRAINER_CLASS_TUBER_M, + TRAINER_CLASS_LADY, + TRAINER_CLASS_BEAUTY, + TRAINER_CLASS_RICH_BOY, + TRAINER_CLASS_POKEMANIAC, + TRAINER_CLASS_GUITARIST, + TRAINER_CLASS_KINDLER, + TRAINER_CLASS_CAMPER, + TRAINER_CLASS_PICNICKER, + TRAINER_CLASS_BUG_MANIAC, + TRAINER_CLASS_PSYCHIC, + TRAINER_CLASS_GENTLEMAN, + TRAINER_CLASS_ELITE_FOUR, + TRAINER_CLASS_LEADER, + TRAINER_CLASS_SCHOOL_KID, + TRAINER_CLASS_SR_AND_JR, + TRAINER_CLASS_WINSTRATE, + TRAINER_CLASS_POKEFAN, + TRAINER_CLASS_YOUNGSTER, + TRAINER_CLASS_CHAMPION, + TRAINER_CLASS_FISHERMAN, + TRAINER_CLASS_TRIATHLETE, + TRAINER_CLASS_DRAGON_TAMER, + TRAINER_CLASS_NINJA_BOY, + TRAINER_CLASS_BATTLE_GIRL, + TRAINER_CLASS_PARASOL_LADY, + TRAINER_CLASS_SWIMMER_F, + TRAINER_CLASS_TWINS, + TRAINER_CLASS_SAILOR, + TRAINER_CLASS_COOLTRAINER_2, // Used for only one trainer. + TRAINER_CLASS_MAGMA_ADMIN, + TRAINER_CLASS_RIVAL, + TRAINER_CLASS_BUG_CATCHER, + TRAINER_CLASS_PKMN_RANGER, + TRAINER_CLASS_MAGMA_LEADER, + TRAINER_CLASS_LASS, + TRAINER_CLASS_YOUNG_COUPLE, + TRAINER_CLASS_OLD_COUPLE, + TRAINER_CLASS_SIS_AND_BRO, + TRAINER_CLASS_SALON_MAIDEN, + TRAINER_CLASS_DOME_ACE, + TRAINER_CLASS_PALACE_MAVEN, + TRAINER_CLASS_ARENA_TYCOON, + TRAINER_CLASS_FACTORY_HEAD, + TRAINER_CLASS_PIKE_QUEEN, + TRAINER_CLASS_PYRAMID_KING, + TRAINER_CLASS_RS_PROTAG, + TRAINER_CLASS_COUNT, +}; #define TRAINER_ENCOUNTER_MUSIC_MALE 0 // standard male encounter music #define TRAINER_ENCOUNTER_MUSIC_FEMALE 1 // standard female encounter music diff --git a/include/constants/vars.h b/include/constants/vars.h index aac52dec0e26..a12c2ff3a508 100644 --- a/include/constants/vars.h +++ b/include/constants/vars.h @@ -325,15 +325,15 @@ #define VAR_TEMP_TRANSFERRED_SPECIES VAR_TEMP_1 #if TESTING -#define TESTING_VARS_START 0x9000 -#define TESTING_VAR_DIFFICULTY (TESTING_VARS_START + 0x0) -#define TESTING_VAR_UNUSED_1 (TESTING_VARS_START + 0x1) -#define TESTING_VAR_UNUSED_2 (TESTING_VARS_START + 0x2) -#define TESTING_VAR_UNUSED_3 (TESTING_VARS_START + 0x3) -#define TESTING_VAR_UNUSED_4 (TESTING_VARS_START + 0x4) -#define TESTING_VAR_UNUSED_5 (TESTING_VARS_START + 0x5) -#define TESTING_VAR_UNUSED_6 (TESTING_VARS_START + 0x6) -#define TESTING_VAR_UNUSED_7 (TESTING_VARS_START + 0x7) +#define TESTING_VARS_START 0x9000 +#define TESTING_VAR_DIFFICULTY (TESTING_VARS_START + 0x0) +#define TESTING_VAR_STARTING_STATUS (TESTING_VARS_START + 0x1) +#define TESTING_VAR_STARTING_STATUS_TIMER (TESTING_VARS_START + 0x2) +#define TESTING_VAR_UNUSED_3 (TESTING_VARS_START + 0x3) +#define TESTING_VAR_UNUSED_4 (TESTING_VARS_START + 0x4) +#define TESTING_VAR_UNUSED_5 (TESTING_VARS_START + 0x5) +#define TESTING_VAR_UNUSED_6 (TESTING_VARS_START + 0x6) +#define TESTING_VAR_UNUSED_7 (TESTING_VARS_START + 0x7) #endif // TESTING #endif // GUARD_CONSTANTS_VARS_H diff --git a/include/constants/wild_encounter.h b/include/constants/wild_encounter.h index 364d18350fc4..364dc7b35a22 100644 --- a/include/constants/wild_encounter.h +++ b/include/constants/wild_encounter.h @@ -9,7 +9,4 @@ #define NUM_ALTERING_CAVE_TABLES 9 -#define FISHING_CHAIN_LENGTH_MAX 200 -#define FISHING_CHAIN_SHINY_STREAK_MAX 20 - #endif // GUARD_CONSTANTS_WILD_ENCOUNTER_H diff --git a/include/contest.h b/include/contest.h index 80a1370541de..278efaa4ac01 100644 --- a/include/contest.h +++ b/include/contest.h @@ -302,6 +302,17 @@ struct ContestResources void *animBgTileBuffer; }; +struct ContestCategory +{ + const u8 *name; + const u8 *condition; + const u8 *generic; + const u8 *negativeTrait; + u8 palette; +}; + +extern const struct ContestCategory gContestCategoryInfo[CONTEST_CATEGORIES_COUNT + 1]; + #define eContest (*gContestResources->contest) #define eContestantStatus (gContestResources->status) #define eContestAppealResults (*gContestResources->appealResults) diff --git a/include/contest_effect.h b/include/contest_effect.h index 87129bd7921f..7db929031b7c 100644 --- a/include/contest_effect.h +++ b/include/contest_effect.h @@ -1,17 +1,17 @@ #ifndef GUARD_CONTEST_EFFECT_H #define GUARD_CONTEST_EFFECT_H -#define MAX_COMBO_MOVES 5 +#define MAX_COMBO_MOVES 17 struct ContestEffect { u8 effectType; u8 appeal; u8 jam; + const u8 *description; + void (*function)(void); }; extern const struct ContestEffect gContestEffects[]; -extern const u8 *const gContestEffectDescriptionPointers[]; -extern const u8 *const gContestMoveTypeTextPointers[]; bool8 AreMovesContestCombo(u16 lastMove, u16 nextMove); diff --git a/include/data.h b/include/data.h index 3a697d573c1a..fbca022f977e 100644 --- a/include/data.h +++ b/include/data.h @@ -5,6 +5,7 @@ #include "constants/trainers.h" #include "constants/battle.h" #include "difficulty.h" +#include "debug.h" #define MAX_TRAINER_ITEMS 4 @@ -41,9 +42,9 @@ struct TrainerSprite struct TrainerBacksprite { - struct MonCoords coordinates; - struct CompressedSpriteSheet backPic; - struct SpritePalette palette; + const struct MonCoords coordinates; + const struct SpriteFrameImage backPic; + const struct SpritePalette palette; const union AnimCmd *const *const animation; }; @@ -63,14 +64,14 @@ struct TrainerMon u16 moves[4]; u16 species; u16 heldItem; - u16 ability; + enum Ability ability; u8 lvl; u8 ball; u8 friendship; u8 nature:5; bool8 gender:2; bool8 isShiny:1; - u8 teraType:5; + enum Type teraType:5; bool8 gigantamaxFactor:1; u8 shouldUseDynamax:1; u8 padding1:1; @@ -81,7 +82,7 @@ struct TrainerMon #define TRAINER_PARTY(partyArray) partyArray, .partySize = ARRAY_COUNT(partyArray) -enum TrainerBattleType +enum TrainerBattleType { TRAINER_BATTLE_TYPE_SINGLES, TRAINER_BATTLE_TYPE_DOUBLES, @@ -104,6 +105,8 @@ struct Trainer /*0x22*/ u8 poolRuleIndex; /*0x23*/ u8 poolPickIndex; /*0x24*/ u8 poolPruneIndex; + /*0x25*/ u16 overrideTrainer; + /*0x26*/ u8 trainerBackPic; }; struct TrainerClass @@ -176,7 +179,6 @@ extern const union AnimCmd *const gAnims_MonPic[]; extern const union AnimCmd *const gAnims_Trainer[]; extern const struct TrainerSprite gTrainerSprites[]; extern const struct TrainerBacksprite gTrainerBacksprites[]; -extern const u16 gTrainerPicToTrainerBackPic[]; extern const struct Trainer gTrainers[DIFFICULTY_COUNT][TRAINERS_COUNT]; extern const struct Trainer gBattlePartners[DIFFICULTY_COUNT][PARTNER_COUNT]; @@ -196,27 +198,38 @@ extern const struct FollowerMsgInfo gFollowerCuriousMessages[]; extern const struct FollowerMsgInfo gFollowerMusicMessages[]; extern const struct FollowerMsgInfo gFollowerPoisonedMessages[]; +static inline bool8 IsPartnerTrainerId(u16 trainerId) +{ + if (trainerId >= TRAINER_PARTNER(PARTNER_NONE) && trainerId < TRAINER_PARTNER(PARTNER_COUNT)) + return TRUE; + return FALSE; +} + static inline u16 SanitizeTrainerId(u16 trainerId) { - if (trainerId >= TRAINERS_COUNT) + if (trainerId >= TRAINERS_COUNT && !IsPartnerTrainerId(trainerId)) return TRAINER_NONE; return trainerId; } static inline const struct Trainer *GetTrainerStructFromId(u16 trainerId) { - u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); + u32 sanitizedTrainerId = 0; + if (gIsDebugBattle) return GetDebugAiTrainer(); + sanitizedTrainerId = SanitizeTrainerId(trainerId); enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); - return &gTrainers[difficulty][sanitizedTrainerId]; + if (IsPartnerTrainerId(trainerId)) + return &gBattlePartners[difficulty][sanitizedTrainerId - TRAINER_PARTNER(PARTNER_NONE)]; + else + return &gTrainers[difficulty][sanitizedTrainerId]; } -static inline const u8 GetTrainerClassFromId(u16 trainerId) +static inline const enum TrainerClassID GetTrainerClassFromId(u16 trainerId) { - u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); - enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); + const struct Trainer *trainer = GetTrainerStructFromId(trainerId); - return gTrainers[difficulty][sanitizedTrainerId].trainerClass; + return trainer->trainerClass; } static inline const u8 *GetTrainerClassNameFromId(u16 trainerId) @@ -230,82 +243,72 @@ static inline const u8 *GetTrainerClassNameFromId(u16 trainerId) static inline const u8 *GetTrainerNameFromId(u16 trainerId) { - u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); - - enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); - - enum DifficultyLevel partnerDifficulty = GetBattlePartnerDifficultyLevel(trainerId); - if (trainerId > TRAINER_PARTNER(PARTNER_NONE)) + { + enum DifficultyLevel partnerDifficulty = GetBattlePartnerDifficultyLevel(trainerId); return gBattlePartners[partnerDifficulty][trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerName; - return gTrainers[difficulty][sanitizedTrainerId].trainerName; + } + return GetTrainerStructFromId(trainerId)->trainerName; } static inline const u8 GetTrainerPicFromId(u16 trainerId) { - u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); - enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); enum DifficultyLevel partnerDifficulty = GetBattlePartnerDifficultyLevel(trainerId); if (trainerId > TRAINER_PARTNER(PARTNER_NONE)) return gBattlePartners[partnerDifficulty][trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerPic; - return gTrainers[difficulty][sanitizedTrainerId].trainerPic; + return GetTrainerStructFromId(trainerId)->trainerPic; +} + +static inline const u8 GetTrainerBackPicFromId(u16 trainerId) +{ + enum DifficultyLevel partnerDifficulty = GetBattlePartnerDifficultyLevel(trainerId); + + if (trainerId > TRAINER_PARTNER(PARTNER_NONE)) + return gBattlePartners[partnerDifficulty][trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerBackPic; + + return GetTrainerStructFromId(trainerId)->trainerBackPic; } static inline const u8 GetTrainerStartingStatusFromId(u16 trainerId) { - return gTrainers[GetCurrentDifficultyLevel()][SanitizeTrainerId(trainerId)].startingStatus; + return GetTrainerStructFromId(trainerId)->startingStatus; } static inline const enum TrainerBattleType GetTrainerBattleType(u16 trainerId) { - u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); - enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); - - return gTrainers[difficulty][sanitizedTrainerId].battleType; + return GetTrainerStructFromId(trainerId)->battleType; } static inline const u8 GetTrainerPartySizeFromId(u16 trainerId) { - u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); - enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); - - return gTrainers[difficulty][sanitizedTrainerId].partySize; + return GetTrainerStructFromId(trainerId)->partySize; } static inline const bool32 DoesTrainerHaveMugshot(u16 trainerId) { - return gTrainers[GetCurrentDifficultyLevel()][SanitizeTrainerId(trainerId)].mugshotColor; + return GetTrainerStructFromId(trainerId)->mugshotColor; } static inline const u8 GetTrainerMugshotColorFromId(u16 trainerId) { - return gTrainers[GetCurrentDifficultyLevel()][SanitizeTrainerId(trainerId)].mugshotColor; + return GetTrainerStructFromId(trainerId)->mugshotColor; } static inline const u16 *GetTrainerItemsFromId(u16 trainerId) { - u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); - enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); - - return gTrainers[difficulty][sanitizedTrainerId].items; + return GetTrainerStructFromId(trainerId)->items; } static inline const struct TrainerMon *GetTrainerPartyFromId(u16 trainerId) { - u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); - enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); - - return gTrainers[difficulty][sanitizedTrainerId].party; + return GetTrainerStructFromId(trainerId)->party; } static inline const u64 GetTrainerAIFlagsFromId(u16 trainerId) { - u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); - enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); - - return gTrainers[difficulty][sanitizedTrainerId].aiFlags; + return GetTrainerStructFromId(trainerId)->aiFlags; } #endif // GUARD_DATA_H diff --git a/include/debug.h b/include/debug.h index 1a48e9f6cd90..01be269c4d7f 100644 --- a/include/debug.h +++ b/include/debug.h @@ -4,6 +4,10 @@ void Debug_ShowMainMenu(void); extern const u8 Debug_FlagsAndVarNotSetBattleConfigMessage[]; const u8 *GetWeatherName(u32 weatherId); +const struct Trainer* GetDebugAiTrainer(void); + +void DebugNative_GetAbilityNames(void); +void DebugNative_Party_SetFriendship(void); extern EWRAM_DATA bool8 gIsDebugBattle; extern EWRAM_DATA u64 gDebugAIFlags; diff --git a/include/decompress.h b/include/decompress.h index cc654a49ced1..52fcc10a3f3c 100644 --- a/include/decompress.h +++ b/include/decompress.h @@ -5,9 +5,68 @@ #define MAX_DECOMPRESSION_BUFFER_SIZE 0x4000 -void LZDecompressWram(const u32 *src, void *dest); -void LZDecompressVram(const u32 *src, void *dest); +#define TANS_TABLE_SIZE 64 +#define PACKED_FREQ_MASK 0x3F +#define PARTIAL_FREQ_MASK 0xC0000000 +#define FIRST_LO_MASK 0x7f +#define CONTINUE_BIT 0x80 + +#define SMOL_IMAGE_SIZE_MULTIPLIER 4 + +struct LZ77Header { + u32 lz77IdBits:5; + u32 padding:3; + u32 size:24; +}; + +struct SmolHeader { + u32 mode:4; + u32 imageSize:14; + u32 symSize:14; + u32 initialState:6; + u32 bitstreamSize:13; + u32 loSize:13; +}; + +struct SpriteSheetHeader { + u32 mode:4; + u32 numComponents:12; + u32 framesPerComponent:16; +}; + +struct SmolTilemapHeader { + u32 mode:4; + u32 tilemapSize:14; + u32 symSize:14; + u32 tileNumberSize; +}; + +union CompressionHeader { + struct LZ77Header lz77; + struct SmolHeader smol; + struct SmolTilemapHeader smolTilemap; +}; + +enum CompressionMode { + MODE_LZ77 = 0, + BASE_ONLY = 1, + ENCODE_SYMS = 2, + ENCODE_DELTA_SYMS = 3, + ENCODE_LO = 4, + ENCODE_BOTH = 5, + ENCODE_BOTH_DELTA_SYMS = 6, + IS_FRAME_CONTAINER = 7, + IS_TILEMAP = 8, +}; + +void DecompressDataWithHeaderVram(const u32 *src, void *dest); +void DecompressDataWithHeaderWram(const u32 *src, void *dest); + +// Lucky's fast lz decompression function +void FastLZ77UnCompWram(const u32 *src, void *dest); + +// Default Decompression functions are below here u32 IsLZ77Data(const void *ptr, u32 minSize, u32 maxSize); u32 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src); @@ -22,5 +81,6 @@ void HandleLoadSpecialPokePic(bool32 isFrontPic, void *dest, s32 species, u32 pe void LoadSpecialPokePic(void *dest, s32 species, u32 personality, bool8 isFrontPic); u32 GetDecompressedDataSize(const u32 *ptr); +bool32 IsCompressedData(const u32 *ptr); #endif // GUARD_DECOMPRESS_H diff --git a/include/decompress_error_handler.h b/include/decompress_error_handler.h new file mode 100644 index 000000000000..1eb2c34a2500 --- /dev/null +++ b/include/decompress_error_handler.h @@ -0,0 +1,15 @@ +#ifndef GUARD_DECOMPRESS_ERROR_HANDLER_H +#define GUARD_DECOMPRESS_ERROR_HANDLER_H + +#include "gba/types.h" + +enum CompressionError { + NO_COMPRESSION_ERROR, + HEADER_ERROR, +}; + +void DoDecompressionError(void); +void DecompressionError_CB2(void); +void DecompressionError(const u32 *src, enum CompressionError error); + +#endif // GUARD_DECOMPRESS_ERROR_HANDLER_H diff --git a/include/dodrio_berry_picking.h b/include/dodrio_berry_picking.h index a93fb27cd137..ec62e51947fe 100644 --- a/include/dodrio_berry_picking.h +++ b/include/dodrio_berry_picking.h @@ -1,7 +1,9 @@ #ifndef GUARD_DODRIO_BERRY_PICKING_H #define GUARD_DODRIO_BERRY_PICKING_H -void StartDodrioBerryPicking(u16 partyId, void (*exitCallback)(void)); +#include "main.h" + +void StartDodrioBerryPicking(u16 partyId, MainCallback exitCallback); void IsDodrioInParty(void); void ShowDodrioBerryPickingRecords(void); diff --git a/include/event_object_movement.h b/include/event_object_movement.h index 51cc2c991c03..4ec46709e367 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -182,7 +182,7 @@ u8 GetWalkInPlaceFasterMovementAction(u32); u8 GetWalkInPlaceFastMovementAction(u32); u8 GetWalkInPlaceNormalMovementAction(u32); u8 GetWalkInPlaceSlowMovementAction(u32); -u8 GetCollisionAtCoords(struct ObjectEvent *, s16 x, s16 y, u32 dir); +u8 GetCollisionAtCoords(struct ObjectEvent *objectEvent, s16 x, s16 y, u32 dir); u32 GetObjectObjectCollidesWith(struct ObjectEvent *objectEvent, s16 x, s16 y, bool32 addCoords); void MoveCoords(u8 direction, s16 *x, s16 *y); bool8 ObjectEventIsHeldMovementActive(struct ObjectEvent *objectEvent); @@ -512,4 +512,6 @@ bool8 MovementAction_EmoteX_Step0(struct ObjectEvent *, struct Sprite *); bool8 MovementAction_EmoteDoubleExclamationMark_Step0(struct ObjectEvent *, struct Sprite *); bool8 PlayerIsUnderWaterfall(struct ObjectEvent *objectEvent); +u8 GetObjectEventApricornTreeId(u8 objectEventId); + #endif //GUARD_EVENT_OBJECT_MOVEMENT_H diff --git a/include/event_scripts.h b/include/event_scripts.h index fa2df54740e9..646b0541955f 100644 --- a/include/event_scripts.h +++ b/include/event_scripts.h @@ -573,6 +573,7 @@ extern const u8 EventScript_UseWaterfall[]; extern const u8 EventScript_CannotUseWaterfall[]; extern const u8 EventScript_UseDive[]; extern const u8 EventScript_UseDiveUnderwater[]; +extern const u8 EventScript_UseRockClimb[]; extern const u8 EventScript_FallDownHole[]; extern const u8 EventScript_FieldPoison[]; extern const u8 EventScript_EggHatch[]; diff --git a/include/field_effect.h b/include/field_effect.h index 2e13879353cf..0bfe15308b20 100644 --- a/include/field_effect.h +++ b/include/field_effect.h @@ -37,6 +37,7 @@ bool8 FieldEffectCmd_loadgfx_callnative(u8 **script, u32 *val); bool8 FieldEffectCmd_loadtiles_callnative(u8 **script, u32 *val); bool8 FieldEffectCmd_loadfadedpal_callnative(u8 **script, u32 *val); void FieldCB_FallWarpExit(void); +void HideFollowerForFieldEffect(void); void StartEscalatorWarp(u8 metatileBehavior, u8 priority); void StartLavaridgeGymB1FWarp(u8 priority); void StartLavaridgeGym1FWarp(u8 priority); @@ -49,5 +50,5 @@ void FreeResourcesAndDestroySprite(struct Sprite *sprite, u8 spriteId); u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority); void StartEscapeRopeFieldEffect(void); void FieldEffectFreeGraphicsResources(struct Sprite *sprite); - +bool8 IsRockClimbActive(void); #endif // GUARD_FIELD_EFFECTS_H diff --git a/include/field_effect_helpers.h b/include/field_effect_helpers.h index 0c97da43371f..65dce3dfda8e 100644 --- a/include/field_effect_helpers.h +++ b/include/field_effect_helpers.h @@ -22,7 +22,7 @@ void StartRevealDisguise(struct ObjectEvent *objectEvent); void StartAshFieldEffect(s16 x, s16 y, u16 metatileId, s16 delay); void SetUpReflection(struct ObjectEvent *objectEvent, struct Sprite *sprite, bool8 stillReflection); void SetUpShadow(struct ObjectEvent *objectEvent); -u32 StartFieldEffectForObjectEvent(u8, struct ObjectEvent *objectEvent); +u32 StartFieldEffectForObjectEvent(u8 fieldEffectId, struct ObjectEvent *objectEvent); u8 FindTallGrassFieldEffectSpriteId(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y); void UpdateRayquazaSpotlightEffect(struct Sprite *sprite); void UpdateShadowFieldEffect(struct Sprite *sprite); diff --git a/include/field_move.h b/include/field_move.h new file mode 100644 index 000000000000..1608b60bcb14 --- /dev/null +++ b/include/field_move.h @@ -0,0 +1,37 @@ +#ifndef GUARD_FIELD_MOVE_H +#define GUARD_FIELD_MOVE_H + +#include "global.h" +#include "constants/field_move.h" + +struct FieldMoveInfo +{ + bool32 (*fieldMoveFunc)(void); + bool32 (*isUnlockedFunc)(void); + u16 moveID; + u8 partyMsgID; +}; + +extern const struct FieldMoveInfo gFieldMoveInfo[]; + +static inline bool32 SetUpFieldMove(enum FieldMove fieldMove) +{ + return gFieldMoveInfo[fieldMove].fieldMoveFunc(); +} + +static inline bool32 IsFieldMoveUnlocked(enum FieldMove fieldMove) +{ + return gFieldMoveInfo[fieldMove].isUnlockedFunc(); +} + +static inline u32 FieldMove_GetMoveId(enum FieldMove fieldMove) +{ + return gFieldMoveInfo[fieldMove].moveID; +} + +static inline u32 FieldMove_GetPartyMsgID(enum FieldMove fieldMove) +{ + return gFieldMoveInfo[fieldMove].partyMsgID; +} + +#endif //GUARD_FIELD_MOVE_H diff --git a/include/field_name_box.h b/include/field_name_box.h new file mode 100644 index 000000000000..983ac09d091e --- /dev/null +++ b/include/field_name_box.h @@ -0,0 +1,22 @@ +#ifndef GUARD_FIELD_NAME_BOX_H +#define GUARD_FIELD_NAME_BOX_H + +#include "config/name_box.h" + +#define NAME_BOX_BASE_TILES_TOTAL (6) // Total tiles within the namebox's .png, best practice to make all images uses the same total tiles. +#define NAME_BOX_BASE_TILE_NUM (0x194 - (OW_NAME_BOX_DEFAULT_WIDTH * OW_NAME_BOX_DEFAULT_HEIGHT)) + +extern EWRAM_DATA const u8 *gSpeakerName; +extern const u8 *const gSpeakerNamesTable[]; + +void TrySpawnNamebox(u32 tileNum); +u32 GetNameboxWindowId(void); +void ResetNameboxData(void); +void DestroyNamebox(void); +void FillNamebox(void); +void DrawNamebox(u32 windowId, u32 tileNum, bool32 copyToVram); +void ClearNamebox(u32 windowId, bool32 copyToVram); +u32 GetNameboxWidth(void); +void TrySpawnAndShowNamebox(const u8 *speaker, u32 tileNum); + +#endif // GUARD_FIELD_NAME_BOX_H diff --git a/include/field_player_avatar.h b/include/field_player_avatar.h index cb7128f203bb..a6d56f62f7c6 100644 --- a/include/field_player_avatar.h +++ b/include/field_player_avatar.h @@ -64,7 +64,7 @@ bool32 IsPlayerSpinEntranceActive(void); bool32 IsPlayerSpinExitActive(void); void SetPlayerInvisibility(bool8 invisible); u8 player_get_pos_including_state_based_drift(s16 *x, s16 *y); -void StartFishing(u8 rod); +void SetPlayerAvatarFishing(u8 direction); bool8 ObjectMovingOnRockStairs(struct ObjectEvent *objectEvent, u8 direction); //sideways stairs u8 GetRightSideStairsDirection(u8 direction); diff --git a/include/field_specials.h b/include/field_specials.h index 50afecf2fbd6..c6bc40143fc5 100644 --- a/include/field_specials.h +++ b/include/field_specials.h @@ -19,7 +19,7 @@ bool32 ShouldDoScottBattleFrontierCall(void); bool32 ShouldDoRoxanneCall(void); bool32 ShouldDoRivalRayquazaCall(void); bool32 CountSSTidalStep(u16 delta); -u8 GetSSTidalLocation(s8 *mapGroup, s8 *mapNum, s16 *x, s16 *y); +enum SSTidalLocation GetSSTidalLocation(s8 *mapGroup, s8 *mapNum, s16 *x, s16 *y); void ShowScrollableMultichoice(void); void FrontierGamblerSetWonOrLost(bool8 won); u8 TryGainNewFanFromCounter(u8 incrementId); diff --git a/include/fishing.h b/include/fishing.h new file mode 100644 index 000000000000..05ee2366040a --- /dev/null +++ b/include/fishing.h @@ -0,0 +1,9 @@ +#ifndef GUARD_FISHING_H +#define GUARD_FISHING_H + +void StartFishing(u8 rod); +void UpdateChainFishingStreak(); +u32 CalculateChainFishingShinyRolls(void); +bool32 ShouldUseFishingEnvironmentInBattle(); + +#endif // GUARD_FISHING_H \ No newline at end of file diff --git a/include/fldeff.h b/include/fldeff.h index 9bad320c74e9..d1b9e279c364 100644 --- a/include/fldeff.h +++ b/include/fldeff.h @@ -2,7 +2,7 @@ #define GUARD_FLDEFF_H // cut -bool8 SetUpFieldMove_Cut(void); +bool32 SetUpFieldMove_Cut(void); bool8 FldEff_UseCutOnGrass(void); bool8 FldEff_UseCutOnTree(void); bool8 FldEff_CutGrass(void); @@ -18,41 +18,41 @@ void StopEscalator(void); bool8 IsEscalatorMoving(void); // soft-boiled -bool8 SetUpFieldMove_SoftBoiled(void); +bool32 SetUpFieldMove_SoftBoiled(void); void Task_TryUseSoftboiledOnPartyMon(u8 taskId); void ChooseMonForSoftboiled(u8 taskId); // flash -bool8 SetUpFieldMove_Flash(void); +bool32 SetUpFieldMove_Flash(void); void CB2_DoChangeMap(void); bool8 GetMapPairFadeToType(u8 _fromType, u8 _toType); bool8 GetMapPairFadeFromType(u8 _fromType, u8 _toType); // strength -bool8 SetUpFieldMove_Strength(void); +bool32 SetUpFieldMove_Strength(void); bool8 FldEff_UseStrength(void); // sweet scent -bool8 SetUpFieldMove_SweetScent(void); +bool32 SetUpFieldMove_SweetScent(void); bool8 FldEff_SweetScent(void); void StartSweetScentFieldEffect(void); // teleport -bool8 SetUpFieldMove_Teleport(void); +bool32 SetUpFieldMove_Teleport(void); bool8 FldEff_UseTeleport(void); // dig -bool8 SetUpFieldMove_Dig(void); +bool32 SetUpFieldMove_Dig(void); bool8 FldEff_UseDig(void); // rock smash bool8 CheckObjectGraphicsInFrontOfPlayer(u16 graphicsId); u8 CreateFieldMoveTask(void); -bool8 SetUpFieldMove_RockSmash(void); +bool32 SetUpFieldMove_RockSmash(void); bool8 FldEff_UseRockSmash(void); // defog -bool8 SetUpFieldMove_Defog(void); +bool32 SetUpFieldMove_Defog(void); bool8 FldEff_Defog(void); #endif // GUARD_FLDEFF_H diff --git a/include/fldeff_misc.h b/include/fldeff_misc.h index 61078466dbcd..71fef15005ba 100644 --- a/include/fldeff_misc.h +++ b/include/fldeff_misc.h @@ -5,7 +5,7 @@ void ComputerScreenOpenEffect(u16 increment, u16 unused, u8 priority); void ComputerScreenCloseEffect(u16 increment, u16 unused, u8 priority); bool8 IsComputerScreenOpenEffectActive(void); bool8 IsComputerScreenCloseEffectActive(void); -bool8 SetUpFieldMove_SecretPower(void); +bool32 SetUpFieldMove_SecretPower(void); bool8 FldEff_UseSecretPowerCave(void); bool8 FldEff_SecretPowerCave(void); bool8 FldEff_UseSecretPowerTree(void); diff --git a/include/follower_helper.h b/include/follower_helper.h index 54a2b4c12a33..2960077696f3 100644 --- a/include/follower_helper.h +++ b/include/follower_helper.h @@ -70,7 +70,8 @@ enum MessageCondition #define MATCH_U16(type, value1, value2) {type, {.split = {.hw = value1, .b = value2}}} #define MATCH_U8(type, v1, v2, v3) {type, {.bytes = {v1, v2, v3}}} -#define MATCH_SPECIES(species) MATCH_U24(MSG_COND_SPECIES, species) +#define MATCH_SPECIES(species) MATCH_U16(MSG_COND_SPECIES, species, 0) +#define MATCH_NOT_SPECIES(species) MATCH_U16(MSG_COND_SPECIES, species, 1) #define MATCH_TYPES(type1, type2) MATCH_U8(MSG_COND_TYPE, type1, type2, 0) // Checks that follower has *neither* of the two types #define MATCH_NOT_TYPES(type1, type2) MATCH_U8(MSG_COND_TYPE, type1, type2, TYPE_NONE | 1) @@ -118,6 +119,7 @@ enum ConditionalMessage COND_MSG_BURN, COND_MSG_DAY, COND_MSG_NIGHT, + COND_MSG_ABNORMAL_WEATHER, COND_MSG_COUNT, }; diff --git a/include/follower_npc.h b/include/follower_npc.h index 52355a78b7cb..680a3b6799a8 100644 --- a/include/follower_npc.h +++ b/include/follower_npc.h @@ -12,6 +12,7 @@ struct FollowerNPCSpriteGraphics u16 acroBikeId; u16 surfId; u16 underwaterId; + bool8 hasRunningFrames; }; enum FollowerNPCDataTypes @@ -20,12 +21,10 @@ enum FollowerNPCDataTypes FNPC_DATA_WARP_END, FNPC_DATA_SURF_BLOB, FNPC_DATA_COME_OUT_DOOR, + FNPC_DATA_FORCED_MOVEMENT, FNPC_DATA_OBJ_ID, FNPC_DATA_CURRENT_SPRITE, FNPC_DATA_DELAYED_STATE, - FNPC_DATA_MAP_ID, - FNPC_DATA_MAP_NUM, - FNPC_DATA_MAP_GROUP, FNPC_DATA_EVENT_FLAG, FNPC_DATA_GFX_ID, FNPC_DATA_FOLLOWER_FLAGS, @@ -62,7 +61,8 @@ enum FollowerNPCSurfBlobStates FNPC_SURF_BLOB_DESTROY }; -enum FollowerNPCOutOfDoorTaskStates{ +enum FollowerNPCOutOfDoorTaskStates +{ OPEN_DOOR, NPC_WALK_OUT, CLOSE_DOOR, @@ -70,7 +70,8 @@ enum FollowerNPCOutOfDoorTaskStates{ REALLOW_MOVEMENT }; -enum FollowerNPCHandleEscalatorFinishTaskStates{ +enum FollowerNPCHandleEscalatorFinishTaskStates +{ MOVE_TO_PLAYER_POS, WAIT_FOR_PLAYER_MOVE, SHOW_FOLLOWER_DOWN, @@ -80,11 +81,25 @@ enum FollowerNPCHandleEscalatorFinishTaskStates{ MOVEMENT_FINISH }; +enum FollowerNPCForcedMovementStates +{ + FNPC_FORCED_NONE, + FNPC_FORCED_FOLLOW, + FNPC_FORCED_STAY +}; + +#define FOLLOWER_NPC_FLAG_HAS_RUNNING_FRAMES 0x1 + +#define FNPC_NONE 0 +#define FNPC_ALWAYS 2 + void SetFollowerNPCData(enum FollowerNPCDataTypes type, u32 value); const u8 *GetFollowerNPCScriptPointer(void); u32 GetFollowerNPCData(enum FollowerNPCDataTypes type); void ClearFollowerNPCData(void); +void CreateFollowerNPC(u32 gfx, u32 followerFlags, const u8 *scriptPtr); +void DestroyFollowerNPC(void); u32 DetermineFollowerNPCState(struct ObjectEvent *follower, u32 state, u32 direction); void SetFollowerNPCSprite(u32 spriteIndex); diff --git a/include/follower_npc_alternate_sprites.h b/include/follower_npc_alternate_sprites.h index a42795ddf920..15fc4897657b 100644 --- a/include/follower_npc_alternate_sprites.h +++ b/include/follower_npc_alternate_sprites.h @@ -19,6 +19,7 @@ static const struct FollowerNPCSpriteGraphics gFollowerNPCAlternateSprites[] = .acroBikeId = OBJ_EVENT_GFX_RIVAL_MAY_ACRO_BIKE, .surfId = OBJ_EVENT_GFX_RIVAL_MAY_SURFING, .underwaterId = OBJ_EVENT_GFX_MAY_UNDERWATER, + .hasRunningFrames = TRUE, }, { .normalId = OBJ_EVENT_GFX_RIVAL_BRENDAN_NORMAL, @@ -26,6 +27,7 @@ static const struct FollowerNPCSpriteGraphics gFollowerNPCAlternateSprites[] = .acroBikeId = OBJ_EVENT_GFX_RIVAL_BRENDAN_ACRO_BIKE, .surfId = OBJ_EVENT_GFX_RIVAL_BRENDAN_SURFING, .underwaterId = OBJ_EVENT_GFX_BRENDAN_UNDERWATER, + .hasRunningFrames = TRUE, }, }; diff --git a/include/frontier_util.h b/include/frontier_util.h index 0d617782a34b..cd99f7a18128 100644 --- a/include/frontier_util.h +++ b/include/frontier_util.h @@ -13,7 +13,7 @@ void ScrollRankingHallRecordsWindow(void); void ClearRankingHallRecords(void); void SaveGameFrontier(void); u8 GetFrontierBrainTrainerPicIndex(void); -u8 GetFrontierBrainTrainerClass(void); +enum TrainerClassID GetFrontierBrainTrainerClass(void); void CopyFrontierBrainTrainerName(u8 *dst); bool8 IsFrontierBrainFemale(void); void SetFrontierBrainObjEventGfx_2(void); @@ -25,5 +25,6 @@ u8 GetFrontierBrainMonNature(u8 monId); u8 GetFrontierBrainMonEvs(u8 monId, u8 evStatId); s32 GetFronterBrainSymbol(void); void ClearEnemyPartyAfterChallenge(void); +void ShowBattleFrontierCaughtBannedSpecies(void); #endif // GUARD_FRONTIER_UTIL_H diff --git a/include/gametypes.h b/include/gametypes.h new file mode 100644 index 000000000000..242fc9d9dbf0 --- /dev/null +++ b/include/gametypes.h @@ -0,0 +1,67 @@ +#ifndef GUARD_GAMETYPES_H +#define GUARD_GAMETYPES_H + +#include "gba/types.h" + +// +// This header includes typedefs for fields that commonly appear throughout +// the codebase, and which ROM hacks might benefit from being able to widen. +// +// These typedefs include the underlying type in their name for two reasons: +// +// - Game Freak wasn't fully consistent about field widths throughout +// their codebase. For example, when Region Map Sections are persistently +// stored in savedata, they're stored as 8-bit values; but much of the +// codebase handles them as 16-bit values. +// +// - Although Pokemon Emerald doesn't come close to maxing out RAM, it *does* +// use nearly all of its EEPROM. That is: the vanilla game uses 96% of the +// flash memory available for storing players' save files, leaving 2172 +// bytes to spare within each of the game's two save files (primary and +// backup). These spare bytes are not contiguous: SaveBlock1 can only grow +// by 84 bytes, and SaveBlock2 can only grow by 120 bytes, with the rest +// of the free space located after the player's PC-boxed Pokemon. +// +// With so little flash memory to spare, keeping track of how much space +// you're using is vital -- and so is arranging struct members to minimize +// compiler-inserted padding. It's easier to deal with this when you can +// see these types' widths at a glance. +// +// Accordingly, this file generally doesn't contain just single types, but +// rather families of types. For example, Region Map Sections are saved as +// u8s within the player's save file, but are sometimes handled as u16s or +// even s16s and ints; and so there are multiple typedefs for Map Sections +// corresponding to each of these underlying types, and each typedef has a +// name which indicates the underlying type. +// +// For a given family of typedefs, the smallest one should be considered +// the "real" or "canonical" type. Continuing with Map Sections as our +// example, the smallest type is an 8-bit integer, and so any values that +// can't fit in an 8-bit integer will be truncated and lost at some point +// within the codebase. Therefore mapsec_u8_t is the "canonical" type for +// Map Sections, and the larger typedefs just exist to describe situations +// where the game handles Map Sections inconsistently with that "canon." +// + +// Map Sections are named areas that can appear in the region map. Each +// individual map can be assigned to a Map Section as appropriate. The +// possible values are in constants/region_map_sections.h. +// +// If you choose to widen Map Sections, be aware that Met Locations (below) +// are based on Map Sections and will also be widened. +typedef u8 mapsec_u8_t; +typedef u16 mapsec_u16_t; +typedef s16 mapsec_s16_t; +typedef s32 mapsec_s32_t; + +// Met Locations for caught Pokemon use the same values as Map Sections, +// except that 0xFD, 0xFE, and 0xFF have special meanings. +// +// Because this value appears inside every Pokemon's data, widening it will +// consume a lot more space within flash memory. The space usage will be +// greater than you expect due to how Pokemon substructs are laid out; you +// would have to rearrange the substructs' contents in order to minimize +// how much more space a wider Met Location would consume. +typedef mapsec_u8_t metloc_u8_t; + +#endif //GUARD_GAMETYPES_H diff --git a/include/gba/defines.h b/include/gba/defines.h index 6d2b9f910a0f..754e95a6dd42 100644 --- a/include/gba/defines.h +++ b/include/gba/defines.h @@ -13,6 +13,7 @@ #define COMMON_DATA __attribute__((section("common_data"))) #define UNUSED __attribute__((unused)) #define USED __attribute__((used)) +#define KEEP_SECTION __attribute__((section(".text.consts"))) #define ARM_FUNC __attribute__((target("arm"))) @@ -24,6 +25,9 @@ #define ALIGNED(n) __attribute__((aligned(n))) #define PACKED __attribute__((packed)) +#define TRANSPARENT __attribute__ ((__transparent_union__)) +#define ALWAYS_INLINE inline __attribute__((always_inline)) +#define NONNULL __attribute__((__nonnull__)) #define SOUND_INFO_PTR (*(struct SoundInfo **)0x3007FF0) #define INTR_CHECK (*(u16 *)0x3007FF8) diff --git a/include/gba/isagbprint.h b/include/gba/isagbprint.h index d362b5cb380f..c94df4fe1db6 100644 --- a/include/gba/isagbprint.h +++ b/include/gba/isagbprint.h @@ -30,7 +30,7 @@ void AGBPrintInit(void); #if (LOG_HANDLER == LOG_HANDLER_MGBA_PRINT) -#define DebugPrintf(pBuf, ...) MgbaPrintf(MGBA_LOG_INFO, pBuf, ## __VA_ARGS__) +#define DebugPrintf(pBuf, ...) MgbaPrintf(MGBA_LOG_WARN, pBuf, ## __VA_ARGS__) #define DebugAssert(pFile, nLine, pExpression, nStopProgram) MgbaAssert(pFile, nLine, pExpression, nStopProgram) #define DebugPrintfLevel(level, pBuf, ...) MgbaPrintf(level, pBuf, ## __VA_ARGS__) diff --git a/include/gba/m4a_internal.h b/include/gba/m4a_internal.h index a90771048dc2..5c3a0872ce88 100644 --- a/include/gba/m4a_internal.h +++ b/include/gba/m4a_internal.h @@ -401,7 +401,7 @@ extern const u8 gNoiseTable[]; extern const struct PokemonCrySong gPokemonCrySongTemplate; -extern const struct ToneData voicegroup000; +extern const struct ToneData voicegroup_dummy; extern char gNumMusicPlayers[]; extern char gMaxLines[]; diff --git a/include/gba/syscall.h b/include/gba/syscall.h index c922084d5fd2..50f578198884 100644 --- a/include/gba/syscall.h +++ b/include/gba/syscall.h @@ -61,9 +61,9 @@ void LZ77UnCompWram(const u32 *src, void *dest); void LZ77UnCompVram(const u32 *src, void *dest); -void RLUnCompWram(const void *src, void *dest); +void RLUnCompWram(const u32 *src, void *dest); -void RLUnCompVram(const void *src, void *dest); +void RLUnCompVram(const u32 *src, void *dest); int MultiBoot(struct MultiBootParam *mp); diff --git a/include/generational_changes.h b/include/generational_changes.h index 2a97728d0da7..2e6767ca844e 100644 --- a/include/generational_changes.h +++ b/include/generational_changes.h @@ -4,47 +4,20 @@ #include "constants/generational_changes.h" #include "config/battle.h" -static const u8 sGenerationalChanges[GEN_CONFIG_COUNT] = -{ - [GEN_CONFIG_CRIT_CHANCE] = B_CRIT_CHANCE, - [GEN_CONFIG_CRIT_MULTIPLIER] = B_CRIT_MULTIPLIER, - [GEN_CONFIG_FOCUS_ENERGY_CRIT_RATIO] = B_FOCUS_ENERGY_CRIT_RATIO, - [GEN_CONFIG_PARALYSIS_SPEED] = B_PARALYSIS_SPEED, - [GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE] = B_CONFUSION_SELF_DMG_CHANCE, - [GEN_CONFIG_MULTI_HIT_CHANCE] = B_MULTI_HIT_CHANCE, - [GEN_CONFIG_GALE_WINGS] = B_GALE_WINGS, - [GEN_CONFIG_HEAL_BELL_SOUNDPROOF] = B_HEAL_BELL_SOUNDPROOF, - [GEN_CONFIG_TELEPORT_BEHAVIOR] = B_TELEPORT_BEHAVIOR, - [GEN_CONFIG_ABILITY_WEATHER] = B_ABILITY_WEATHER, - [GEN_CONFIG_MOODY_STATS] = B_MOODY_ACC_EVASION, - [GEN_CONFIG_BATTLE_BOND] = B_BATTLE_BOND, - [GEN_CONFIG_FELL_STINGER_STAT_RAISE] = B_FELL_STINGER_STAT_RAISE, - [GEN_CONFIG_ATE_MULTIPLIER] = B_ATE_MULTIPLIER, -}; - -#if TESTING -extern u8 *gGenerationalChangesTestOverride; -#endif +#define UNPACK_CONFIG_STRUCT(_name, _field, _typeMaxValue, ...) INVOKE_WITH_(UNPACK_CONFIG_STRUCT_, _field, UNPACK_B(_typeMaxValue)); +#define UNPACK_CONFIG_STRUCT_(_field, _type, ...) _type FIRST(__VA_OPT__(_field:BIT_SIZE(FIRST(__VA_ARGS__)),) _field) -static inline u32 GetGenConfig(enum GenConfigTag configTag) +struct GenChanges { - if (configTag >= GEN_CONFIG_COUNT) return GEN_LATEST; -#if TESTING - if (gGenerationalChangesTestOverride == NULL) return sGenerationalChanges[configTag]; - return gGenerationalChangesTestOverride[configTag]; -#else - return sGenerationalChanges[configTag]; -#endif -} + CONFIG_DEFINITIONS(UNPACK_CONFIG_STRUCT) + // Expands to: + // u32 critChance:4; + // u32 critMultiplier:4; + // ... +}; -static inline void SetGenConfig(enum GenConfigTag configTag, u32 value) -{ -#if TESTING - if (configTag >= GEN_CONFIG_COUNT) return; - if (gGenerationalChangesTestOverride == NULL) return; - gGenerationalChangesTestOverride[configTag] = value; -#endif -} +u32 GetConfig(enum ConfigTag configTag); +void SetConfig(enum ConfigTag configTag, u32 value); #if TESTING void TestInitConfigData(void); diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index 5f2a84017f51..5e0f99031db2 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -7,19 +7,36 @@ #define MAPGRID_METATILE_ID_MASK 0x03FF // Bits 0-9 #define MAPGRID_COLLISION_MASK 0x0C00 // Bits 10-11 #define MAPGRID_ELEVATION_MASK 0xF000 // Bits 12-15 +#define MAPGRID_METATILE_ID_SHIFT 0 #define MAPGRID_COLLISION_SHIFT 10 #define MAPGRID_ELEVATION_SHIFT 12 +#define PACK_METATILE(metatileId) PACK(metatileId, MAPGRID_METATILE_ID_SHIFT, MAPGRID_METATILE_ID_MASK) +#define PACK_COLLISION(collision) PACK(collision, MAPGRID_COLLISION_SHIFT, MAPGRID_COLLISION_MASK) +#define PACK_ELEVATION(elevation) PACK(elevation, MAPGRID_ELEVATION_SHIFT, MAPGRID_ELEVATION_MASK) +#define UNPACK_METATILE(data) UNPACK(data, MAPGRID_METATILE_ID_SHIFT, MAPGRID_METATILE_ID_MASK) +#define UNPACK_COLLISION(data) UNPACK(data, MAPGRID_COLLISION_SHIFT, MAPGRID_COLLISION_MASK) +#define UNPACK_ELEVATION(data) UNPACK(data, MAPGRID_ELEVATION_SHIFT, MAPGRID_ELEVATION_MASK) + // An undefined map grid block has all metatile id bits set and nothing else #define MAPGRID_UNDEFINED MAPGRID_METATILE_ID_MASK +// When setting impassability manually GF sets all the collision bits +#define MAPGRID_IMPASSABLE MAPGRID_COLLISION_MASK + // Masks/shifts for metatile attributes // Metatile attributes consist of an 8 bit behavior value, 4 unused bits, and a 4 bit layer type value // This is the data stored in each data/tilesets/*/*/metatile_attributes.bin file #define METATILE_ATTR_BEHAVIOR_MASK 0x00FF // Bits 0-7 #define METATILE_ATTR_LAYER_MASK 0xF000 // Bits 12-15 +#define METATILE_ATTR_BEHAVIOR_SHIFT 0 #define METATILE_ATTR_LAYER_SHIFT 12 +#define PACK_BEHAVIOR(behavior) PACK(behavior, METATILE_ATTR_BEHAVIOR_SHIFT, METATILE_ATTR_BEHAVIOR_MASK) +#define PACK_LAYER_TYPE(layerType) PACK(layerType, METATILE_ATTR_LAYER_SHIFT, METATILE_ATTR_LAYER_MASK) +#define UNPACK_BEHAVIOR(data) UNPACK(data, METATILE_ATTR_BEHAVIOR_SHIFT, METATILE_ATTR_BEHAVIOR_MASK) +#define UNPACK_LAYER_TYPE(data) UNPACK(data, METATILE_ATTR_LAYER_SHIFT, METATILE_ATTR_LAYER_MASK) + enum { METATILE_LAYER_TYPE_NORMAL, // Metatile uses middle and top bg layers METATILE_LAYER_TYPE_COVERED, // Metatile uses bottom and middle bg layers @@ -152,7 +169,7 @@ struct MapHeader /* 0x0C */ const struct MapConnections *connections; /* 0x10 */ u16 music; /* 0x12 */ u16 mapLayoutId; - /* 0x14 */ u8 regionMapSectionId; + /* 0x14 */ mapsec_u8_t regionMapSectionId; /* 0x15 */ u8 cave; /* 0x16 */ u8 weather; /* 0x17 */ u8 mapType; diff --git a/include/global.h b/include/global.h index b58ef3518b38..3135542e027d 100644 --- a/include/global.h +++ b/include/global.h @@ -5,6 +5,7 @@ #include #include "config/general.h" // we need to define config before gba headers as print stuff needs the functions nulled before defines. #include "gba/gba.h" +#include "gametypes.h" #include "siirtc.h" #include "fpmath.h" #include "metaprogram.h" @@ -13,6 +14,7 @@ #include "constants/vars.h" #include "constants/species.h" #include "constants/pokedex.h" +#include "constants/apricorn_tree.h" #include "constants/berry.h" #include "constants/maps.h" #include "constants/pokemon.h" @@ -107,6 +109,9 @@ #define T2_READ_32(ptr) ((ptr)[0] + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24)) #define T2_READ_PTR(ptr) (void *) T2_READ_32(ptr) +#define PACK(data, shift, mask) ( ((data) << (shift)) & (mask) ) +#define UNPACK(data, shift, mask) ( ((data) & (mask)) >> (shift) ) + // Macros for checking the joypad #define TEST_BUTTON(field, button) ((field) & (button)) #define JOY_NEW(button) TEST_BUTTON(gMain.newKeys, button) @@ -130,6 +135,8 @@ #define NUM_FLAG_BYTES ROUND_BITS_TO_BYTES(FLAGS_COUNT) #define NUM_TRENDY_SAYING_BYTES ROUND_BITS_TO_BYTES(NUM_TRENDY_SAYINGS) +#define NUM_APRICORN_TREE_BYTES ROUND_BITS_TO_BYTES(APRICORN_TREE_COUNT) + // This produces an error at compile-time if expr is zero. // It looks like file.c:line: size of array `id' is negative #define STATIC_ASSERT(expr, id) typedef char id[(expr) ? 1 : -1]; @@ -204,23 +211,24 @@ struct Time /*0x04*/ s8 seconds; }; -struct NPCFollowerMapData +struct NPCFollowerPadding { - u8 id; - u8 number; - u8 group; + u8 padding1; + u8 padding2; + u8 padding3; }; struct NPCFollower { u8 inProgress:1; u8 warpEnd:1; - u8 createSurfBlob:3; - u8 comeOutDoorStairs:3; + u8 createSurfBlob:2; + u8 comeOutDoorStairs:2; + u8 forcedMovement:2; u8 objId; u8 currentSprite; u8 delayedState; - struct NPCFollowerMapData map; + struct NPCFollowerPadding padding; struct Coords16 log; const u8 *script; u16 flag; @@ -247,6 +255,9 @@ struct SaveBlock3 u8 dexNavSearchLevels[NUM_SPECIES]; #endif u8 dexNavChain; +#if APRICORN_TREE_COUNT > 0 + u8 apricornTrees[NUM_APRICORN_TREE_BYTES]; +#endif }; /* max size 1624 bytes */ extern struct SaveBlock3 *gSaveBlock3Ptr; @@ -1044,6 +1055,15 @@ struct ExternalEventFlags } __attribute__((packed));/*size = 0x15*/ +struct Bag +{ + struct ItemSlot items[BAG_ITEMS_COUNT]; + struct ItemSlot keyItems[BAG_KEYITEMS_COUNT]; + struct ItemSlot pokeBalls[BAG_POKEBALLS_COUNT]; + struct ItemSlot TMsHMs[BAG_TMHM_COUNT]; + struct ItemSlot berries[BAG_BERRIES_COUNT]; +}; + struct SaveBlock1 { /*0x00*/ struct Coords16 pos; @@ -1066,11 +1086,8 @@ struct SaveBlock1 /*0x494*/ u16 coins; /*0x496*/ u16 registeredItem; // registered for use with SELECT button /*0x498*/ struct ItemSlot pcItems[PC_ITEMS_COUNT]; - /*0x560*/ struct ItemSlot bagPocket_Items[BAG_ITEMS_COUNT]; - /*0x5D8*/ struct ItemSlot bagPocket_KeyItems[BAG_KEYITEMS_COUNT]; - /*0x650*/ struct ItemSlot bagPocket_PokeBalls[BAG_POKEBALLS_COUNT]; - /*0x690*/ struct ItemSlot bagPocket_TMHM[BAG_TMHM_COUNT]; - /*0x790*/ struct ItemSlot bagPocket_Berries[BAG_BERRIES_COUNT]; + /*0x560 -> 0x848 is bag storage*/ + /*0x560*/ struct Bag bag; /*0x848*/ struct Pokeblock pokeblocks[POKEBLOCKS_COUNT]; #if FREE_EXTRA_SEEN_FLAGS_SAVEBLOCK1 == FALSE /*0x988*/ u8 filler1[0x34]; // Previously Dex Flags, feel free to remove. @@ -1169,6 +1186,8 @@ struct MapPosition #if T_SHOULD_RUN_MOVE_ANIM extern bool32 gLoadFail; +extern bool32 gCountAllocs; +extern s32 gSpriteAllocs; #endif // T_SHOULD_RUN_MOVE_ANIM #endif // GUARD_GLOBAL_H diff --git a/include/global.tv.h b/include/global.tv.h index 6bc6d08f86f3..3956decd4a19 100644 --- a/include/global.tv.h +++ b/include/global.tv.h @@ -226,7 +226,7 @@ typedef union // size = 0x24 /*0x04*/ u8 filler_04[2]; /*0x06*/ u16 itemIds[SMARTSHOPPER_NUM_ITEMS]; /*0x0C*/ u16 itemAmounts[SMARTSHOPPER_NUM_ITEMS]; - /*0x12*/ u8 shopLocation; + /*0x12*/ mapsec_u8_t shopLocation; /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; /*0x1B*/ //u8 padding; } smartshopperShow; @@ -241,7 +241,7 @@ typedef union // size = 0x24 /*0x0E*/ u16 species2; /*0x10*/ u8 nBallsUsed; /*0x11*/ u8 outcome; - /*0x12*/ u8 location; + /*0x12*/ mapsec_u8_t location; /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; /*0x1B*/ //u8 padding; } pokemonTodayFailed; @@ -267,7 +267,7 @@ typedef union // size = 0x24 /*0x04*/ u16 caughtPoke; /*0x06*/ u16 steps; /*0x08*/ u16 species; - /*0x0A*/ u8 location; + /*0x0A*/ mapsec_u8_t location; /*0x0B*/ u8 language; /*0x0C*/ u8 filler_0C[7]; /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; @@ -282,7 +282,7 @@ typedef union // size = 0x24 /*0x04*/ u8 badgeCount; /*0x05*/ u8 nSilverSymbols; /*0x06*/ u8 nGoldSymbols; - /*0x07*/ u8 location; + /*0x07*/ mapsec_u8_t location; /*0x08*/ u16 battlePoints; /*0x0A*/ u16 mapLayoutId; /*0x0C*/ u8 language; @@ -309,7 +309,7 @@ typedef union // size = 0x24 /*0x00*/ u8 kind; /*0x01*/ bool8 active; /*0x02*/ u16 item; - /*0x04*/ u8 location; + /*0x04*/ mapsec_u8_t location; /*0x05*/ u8 language; /*0x06*/ u16 mapLayoutId; /*0x08*/ u8 filler_08[11]; @@ -336,7 +336,7 @@ typedef union // size = 0x24 /*0x00*/ u8 kind; /*0x01*/ bool8 active; /*0x02*/ u16 lastOpponentSpecies; - /*0x04*/ u8 location; + /*0x04*/ mapsec_u8_t location; /*0x05*/ u8 outcome; /*0x06*/ u16 caughtMonBall; /*0x08*/ u16 balls; @@ -505,7 +505,7 @@ struct GabbyAndTyData /*2BA6*/ u16 mon2; /*2BA8*/ u16 lastMove; /*2BAA*/ u16 quote[1]; - /*2BAC*/ u8 mapnum; + /*2BAC*/ mapsec_u8_t mapnum; /*2BAD*/ u8 battleNum; /*2BAE*/ u8 battleTookMoreThanOneTurn:1; u8 playerLostAMon:1; diff --git a/include/graphics.h b/include/graphics.h index 262afd533727..bc168e39a181 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -2700,6 +2700,8 @@ extern const u32 gBattleAnimSpriteGfx_MegaParticles[]; extern const u16 gBattleAnimSpritePal_MegaParticles[]; extern const u32 gBattleAnimSpriteGfx_MegaSymbol[]; extern const u16 gBattleAnimSpritePal_MegaSymbol[]; +extern const u32 gBattleAnimSpriteGfx_TeraSymbol[]; +extern const u16 gBattleAnimSpritePal_TeraSymbol[]; extern const u32 gBattleAnimSpriteGfx_FlashCannonBall[]; extern const u16 gBattleAnimSpritePal_FlashCannonBall[]; extern const u32 gBattleAnimSpriteGfx_WaterGun[]; @@ -2712,6 +2714,12 @@ extern const u32 gBattleAnimSpriteGfx_TeraCrystal[]; extern const u16 gBattleAnimSpritePal_TeraCrystal[]; extern const u32 gBattleAnimSpriteGfx_TeraShatter[]; extern const u16 gBattleAnimSpritePal_TeraShatter[]; +extern const u32 gBattleAnimSpriteGfx_TatsugiriCurly[]; +extern const u16 gBattleAnimSpritePal_TatsugiriCurly[]; +extern const u32 gBattleAnimSpriteGfx_TatsugiriDroopy[]; +extern const u16 gBattleAnimSpritePal_TatsugiriDroopy[]; +extern const u32 gBattleAnimSpriteGfx_TatsugiriStretchy[]; +extern const u16 gBattleAnimSpritePal_TatsugiriStretchy[]; // New Battle Anim Particles extern const u32 gBattleAnimSpriteGfx_AlphaStone[]; @@ -3188,9 +3196,11 @@ extern const u32 gBattleAnimBgTilemap_Sandstorm[]; extern const u32 gBattleAnimBgImage_Sandstorm[]; // Pledge Effect field status - Rainbow -extern const u32 gBattleAnimBgImage_Rainbow[]; +extern const u32 gBattleAnimBgImage_RainbowPlayer[]; +extern const u32 gBattleAnimBgImage_RainbowOpponent[]; extern const u16 gBattleAnimBGPalette_Rainbow[]; -extern const u32 gBattleAnimBgTilemap_Rainbow[]; +extern const u32 gBattleAnimBgTilemap_RainbowPlayer[]; +extern const u32 gBattleAnimBgTilemap_RainbowOpponent[]; // Pledge Effect field status - Swamp extern const u32 gBattleAnimBgImage_Swamp[]; diff --git a/include/item.h b/include/item.h index aeffae774266..d548643af80c 100644 --- a/include/item.h +++ b/include/item.h @@ -2,8 +2,87 @@ #define GUARD_ITEM_H #include "constants/item.h" +#include "constants/item_effects.h" #include "constants/items.h" +#include "constants/moves.h" #include "constants/tms_hms.h" +#include "constants/item_effects.h" +#include "constants/hold_effects.h" + +/* Expands to: + * enum + * { + * ITEM_TM_FOCUS_PUNCH = ITEM_TM01, + * ... + * ITEM_HM_CUT = ITM_HM01, + * ... + * }; */ +#define ENUM_TM(n, id) CAT(ITEM_TM_, id) = CAT(ITEM_TM, n), +#define ENUM_HM(n, id) CAT(ITEM_HM_, id) = CAT(ITEM_HM, n), +#define TO_TMHM_NUMS(a, ...) (__VA_ARGS__) +enum TMHMItemId +{ + RECURSIVELY(R_ZIP(ENUM_TM, TO_TMHM_NUMS NUMBERS_256, (FOREACH_TM(APPEND_COMMA)))) + RECURSIVELY(R_ZIP(ENUM_HM, TO_TMHM_NUMS NUMBERS_256, (FOREACH_HM(APPEND_COMMA)))) +}; + +#undef ENUM_TM +#undef ENUM_HM +#undef TO_TMHM_NUMS + +/* Each of these TM_HM enums corresponds an index in the list of TMs + HMs item ids in + * gTMHMItemMoveIds. The index for an item can be retrieved with GetItemTMHMIndex below. + */ +#define UNPACK_TM_HM_ENUM(_tmHm) CAT(ENUM_TM_HM_, _tmHm), +enum TMHMIndex +{ + FOREACH_TMHM(UNPACK_TM_HM_ENUM) + NUM_ALL_MACHINES, + NUM_TECHNICAL_MACHINES = (0 FOREACH_TM(PLUS_ONE)), + NUM_HIDDEN_MACHINES = (0 FOREACH_HM(PLUS_ONE)), +}; + +#undef UNPACK_TM_HM_ENUM + +enum PACKED ItemSortType +{ + ITEM_TYPE_UNCATEGORIZED, + ITEM_TYPE_FIELD_USE, + ITEM_TYPE_LEVEL_UP_ITEM, + ITEM_TYPE_HEALTH_RECOVERY, + ITEM_TYPE_STATUS_RECOVERY, + ITEM_TYPE_PP_RECOVERY, + ITEM_TYPE_NATURE_MINT, + ITEM_TYPE_STAT_BOOST_DRINK, + ITEM_TYPE_STAT_BOOST_FEATHER, + ITEM_TYPE_STAT_BOOST_MOCHI, + ITEM_TYPE_BATTLE_ITEM, + ITEM_TYPE_FLUTE, + ITEM_TYPE_X_ITEM, + ITEM_TYPE_AUX_ITEM, + ITEM_TYPE_EVOLUTION_STONE, + ITEM_TYPE_EVOLUTION_ITEM, + ITEM_TYPE_SPECIAL_HELD_ITEM, + ITEM_TYPE_MEGA_STONE, + ITEM_TYPE_Z_CRYSTAL, + ITEM_TYPE_TERA_SHARD, + ITEM_TYPE_HELD_ITEM, + ITEM_TYPE_TYPE_BOOST_HELD_ITEM, + ITEM_TYPE_CONTEST_HELD_ITEM, + ITEM_TYPE_EV_BOOST_HELD_ITEM, + ITEM_TYPE_GEM, + ITEM_TYPE_PLATE, + ITEM_TYPE_MEMORY, + ITEM_TYPE_DRIVE, + ITEM_TYPE_INCENSE, + ITEM_TYPE_NECTAR, + ITEM_TYPE_GROWTH, + ITEM_TYPE_SHARD, + ITEM_TYPE_SELLABLE, + ITEM_TYPE_RELIC, + ITEM_TYPE_FOSSIL, + ITEM_TYPE_MAIL, +}; typedef void (*ItemUseFunc)(u8); @@ -14,14 +93,14 @@ struct Item ItemUseFunc fieldUseFunc; const u8 *description; const u8 *effect; - u8 name[ITEM_NAME_LENGTH]; - u8 pluralName[ITEM_NAME_PLURAL_LENGTH]; + const u8 *name; + const u8 *pluralName; u8 holdEffect; u8 holdEffectParam; u8 importance:2; u8 notConsumed:1; - u8 padding:5; - u8 pocket; + enum Pocket pocket:5; + enum ItemSortType sortType; u8 type; u8 battleUsage; u8 flingPower; @@ -29,82 +108,165 @@ struct Item const u16 *iconPalette; }; -struct BagPocket +struct ALIGNED(2) BagPocket { struct ItemSlot *itemSlots; - u8 capacity; + u16 capacity:10; + enum Pocket id:6; +}; + +struct TmHmIndexKey +{ + enum TMHMItemId itemId:16; + u16 moveId; }; +extern const u8 gQuestionMarksItemName[]; extern const struct Item gItemsInfo[]; extern struct BagPocket gBagPockets[]; +extern const struct TmHmIndexKey gTMHMItemMoveIds[]; + +#define UNPACK_ITEM_TO_TM_INDEX(_tm) case CAT(ITEM_TM_, _tm): return CAT(ENUM_TM_HM_, _tm) + 1; +#define UNPACK_ITEM_TO_HM_INDEX(_hm) case CAT(ITEM_HM_, _hm): return CAT(ENUM_TM_HM_, _hm) + 1; +#define UNPACK_ITEM_TO_TM_MOVE_ID(_tm) case CAT(ITEM_TM_, _tm): return CAT(MOVE_, _tm); +#define UNPACK_ITEM_TO_HM_MOVE_ID(_hm) case CAT(ITEM_HM_, _hm): return CAT(MOVE_, _hm); +#define UNPACK_TM_MOVE_TO_ITEM_ID(_move) case CAT(MOVE_, _move): return CAT(ITEM_TM_, _move); +#define UNPACK_HM_MOVE_TO_ITEM_ID(_move) case CAT(MOVE_, _move): return CAT(ITEM_HM_, _move); + +static inline enum TMHMIndex GetItemTMHMIndex(u16 item) +{ + switch (item) + { + /* Expands to: + * case ITEM_TM_FOCUS_PUNCH: + * return 1; + * case ITEM_TM_DRAGON_CLAW: + * return 2; + * etc */ + FOREACH_TM(UNPACK_ITEM_TO_TM_INDEX) + FOREACH_HM(UNPACK_ITEM_TO_HM_INDEX) + default: + return 0; + } +} + +static inline u16 GetItemTMHMMoveId(u16 item) +{ + switch (item) + { + /* Expands to: + * case ITEM_TM_FOCUS_PUNCH: + * return MOVE_FOCUS_PUNCH; + * case ITEM_TM_DRAGON_CLAW: + * return MOVE_DRAGON_CLAW; + * etc */ + FOREACH_TM(UNPACK_ITEM_TO_TM_MOVE_ID) + FOREACH_HM(UNPACK_ITEM_TO_HM_MOVE_ID) + default: + return MOVE_NONE; + } +} + +static inline enum TMHMItemId GetTMHMItemIdFromMoveId(u16 move) +{ + switch (move) + { + /* Expands to: + * case MOVE_FOCUS_PUNCH: + * return ITEM_TM_FOCUS_PUNCH; + * case MOVE_DRAGON_CLAW: + * return ITEM_TM_DRAGON_CLAW; + * etc */ + FOREACH_TM(UNPACK_TM_MOVE_TO_ITEM_ID) + FOREACH_HM(UNPACK_HM_MOVE_TO_ITEM_ID) + default: + return ITEM_NONE; + } +} + +#undef UNPACK_ITEM_TO_TM_INDEX +#undef UNPACK_ITEM_TO_HM_INDEX +#undef UNPACK_ITEM_TO_TM_MOVE_ID +#undef UNPACK_ITEM_TO_HM_MOVE_ID +#undef UNPACK_TM_MOVE_TO_ITEM_ID +#undef UNPACK_HM_MOVE_TO_ITEM_ID + +static inline enum TMHMItemId GetTMHMItemId(enum TMHMIndex index) +{ + return gTMHMItemMoveIds[index].itemId; +} + +static inline u16 GetTMHMMoveId(enum TMHMIndex index) +{ + return gTMHMItemMoveIds[index].moveId; +} + +void BagPocket_SetSlotData(struct BagPocket *pocket, u32 pocketPos, struct ItemSlot newSlot); +struct ItemSlot BagPocket_GetSlotData(struct BagPocket *pocket, u32 pocketPos); + +static inline void BagPocket_SetSlotItemIdAndCount(struct BagPocket *pocket, u32 pocketPos, u16 itemId, u16 quantity) +{ + BagPocket_SetSlotData(pocket, pocketPos, (struct ItemSlot) {itemId, quantity}); +} + +static inline u16 GetBagItemId(enum Pocket pocketId, u32 pocketPos) +{ + return BagPocket_GetSlotData(&gBagPockets[pocketId], pocketPos).itemId; +} + +static inline u16 GetBagItemQuantity(enum Pocket pocketId, u32 pocketPos) +{ + return BagPocket_GetSlotData(&gBagPockets[pocketId], pocketPos).quantity; +} + +static inline struct ItemSlot GetBagItemIdAndQuantity(enum Pocket pocketId, u32 pocketPos) +{ + return BagPocket_GetSlotData(&gBagPockets[pocketId], pocketPos); +} void ApplyNewEncryptionKeyToBagItems(u32 newKey); -void ApplyNewEncryptionKeyToBagItems_(u32 newKey); void SetBagItemsPointers(void); u8 *CopyItemName(u16 itemId, u8 *dst); u8 *CopyItemNameHandlePlural(u16 itemId, u8 *dst, u32 quantity); -bool8 IsBagPocketNonEmpty(u8 pocket); -bool8 CheckBagHasItem(u16 itemId, u16 count); -bool8 HasAtLeastOneBerry(void); -bool8 HasAtLeastOnePokeBall(void); -bool8 CheckBagHasSpace(u16 itemId, u16 count); +bool32 IsBagPocketNonEmpty(enum Pocket pocketId); +bool32 CheckBagHasItem(u16 itemId, u16 count); +bool32 HasAtLeastOneBerry(void); +bool32 HasAtLeastOnePokeBall(void); +bool32 CheckBagHasSpace(u16 itemId, u16 count); u32 GetFreeSpaceForItemInBag(u16 itemId); -bool8 AddBagItem(u16 itemId, u16 count); -bool8 RemoveBagItem(u16 itemId, u16 count); -u8 GetPocketByItemId(u16 itemId); -void ClearItemSlots(struct ItemSlot *itemSlots, u8 itemCount); +bool32 AddBagItem(u16 itemId, u16 count); +bool32 RemoveBagItem(u16 itemId, u16 count); +void RemoveBagItemFromSlot(struct BagPocket *pocket, u16 slotId, u16 count); u8 CountUsedPCItemSlots(void); -bool8 CheckPCHasItem(u16 itemId, u16 count); -bool8 AddPCItem(u16 itemId, u16 count); +bool32 CheckPCHasItem(u16 itemId, u16 count); +bool32 AddPCItem(u16 itemId, u16 count); void RemovePCItem(u8 index, u16 count); void CompactPCItems(void); void SwapRegisteredBike(void); -u16 BagGetItemIdByPocketPosition(u8 pocketId, u16 pocketPos); -u16 BagGetQuantityByPocketPosition(u8 pocketId, u16 pocketPos); -void CompactItemsInBagPocket(struct BagPocket *bagPocket); -void SortBerriesOrTMHMs(struct BagPocket *bagPocket); -void MoveItemSlotInList(struct ItemSlot *itemSlots_, u32 from, u32 to_); +void CompactItemsInBagPocket(enum Pocket pocketId); +void MoveItemSlotInPocket(enum Pocket pocketId, u32 from, u32 to); +void MoveItemSlotInPC(struct ItemSlot *itemSlots, u32 from, u32 to); void ClearBag(void); u16 CountTotalItemQuantityInBag(u16 itemId); -bool8 AddPyramidBagItem(u16 itemId, u16 count); -bool8 RemovePyramidBagItem(u16 itemId, u16 count); +bool32 AddPyramidBagItem(u16 itemId, u16 count); +bool32 RemovePyramidBagItem(u16 itemId, u16 count); const u8 *GetItemName(u16 itemId); u32 GetItemPrice(u16 itemId); const u8 *GetItemEffect(u32 itemId); -u32 GetItemHoldEffect(u32 itemId); +enum HoldEffect GetItemHoldEffect(u32 itemId); u32 GetItemHoldEffectParam(u32 itemId); const u8 *GetItemDescription(u16 itemId); u8 GetItemImportance(u16 itemId); u8 GetItemConsumability(u16 itemId); -u8 GetItemPocket(u16 itemId); +enum Pocket GetItemPocket(u16 itemId); u8 GetItemType(u16 itemId); ItemUseFunc GetItemFieldFunc(u16 itemId); u8 GetItemBattleUsage(u16 itemId); u32 GetItemSecondaryId(u32 itemId); u32 GetItemFlingPower(u32 itemId); u32 GetItemStatus1Mask(u16 itemId); -u32 GetItemStatus2Mask(u16 itemId); +bool32 ItemHasVolatileFlag(u16 itemId, enum Volatile volatile); u32 GetItemSellPrice(u32 itemId); - -/* Expands to: - * enum - * { - * ITEM_TM_FOCUS_PUNCH, - * ... - * ITEM_HM_CUT, - * ... - * }; */ -#define ENUM_TM(id) CAT(ITEM_TM_, id), -#define ENUM_HM(id) CAT(ITEM_HM_, id), -enum -{ - ENUM_TM_START_ = ITEM_TM01 - 1, - FOREACH_TM(ENUM_TM) - - ENUM_HM_START_ = ITEM_HM01 - 1, - FOREACH_HM(ENUM_HM) -}; -#undef ENUM_TM -#undef ENUM_HM +bool32 IsHoldEffectChoice(enum HoldEffect holdEffect); #endif // GUARD_ITEM_H diff --git a/include/item_menu.h b/include/item_menu.h index 84137da1de2b..a16ccae5d462 100644 --- a/include/item_menu.h +++ b/include/item_menu.h @@ -2,6 +2,7 @@ #define GUARD_ITEM_MENU_H #include "item.h" +#include "main.h" #include "menu_helpers.h" enum { @@ -36,6 +37,15 @@ enum { ITEMWIN_COUNT }; +//bag sort +enum BagSortOptions +{ + SORT_ALPHABETICALLY, + SORT_BY_TYPE, + SORT_BY_AMOUNT, //greatest->least + SORT_BY_INDEX, +}; + #define ITEMMENU_SWAP_LINE_LENGTH 8 // Swap line is 8 sprites long enum { ITEMMENUSPRITE_BAG, @@ -48,7 +58,7 @@ enum { struct BagPosition { - void (*exitCallback)(void); + MainCallback exitCallback; u8 location; u8 pocket; u16 pocketSwitchArrowPos; @@ -60,7 +70,7 @@ extern struct BagPosition gBagPosition; struct BagMenu { - void (*newScreenCallback)(void); + MainCallback newScreenCallback; u8 tilemapBuffer[BG_SCREEN_SIZE]; u8 spriteIds[ITEMMENUSPRITE_COUNT]; u8 windowIds[ITEMWIN_COUNT]; @@ -97,18 +107,19 @@ void CB2_BagMenuFromStartMenu(void); u8 GetItemListPosition(u8 pocketId); bool8 UseRegisteredKeyItemOnField(void); void CB2_GoToSellMenu(void); -void GoToBagMenu(u8 location, u8 pocket, void ( *exitCallback)()); +void GoToBagMenu(u8 location, u8 pocket, MainCallback exitCallback); void DoWallyTutorialBagMenu(void); void ResetBagScrollPositions(void); -void ChooseBerryForMachine(void (*exitCallback)(void)); +void ChooseBerryForMachine(MainCallback exitCallback); void CB2_ChooseBerry(void); void CB2_ChooseMulch(void); void Task_FadeAndCloseBagMenu(u8 taskId); void BagMenu_YesNo(u8 taskId, u8 windowType, const struct YesNoFuncTable *funcTable); -void UpdatePocketItemList(u8 pocketId); -void DisplayItemMessage(u8 taskId, u8 fontId, const u8 *str, void (*callback)(u8 taskId)); +void UpdatePocketItemList(enum Pocket pocketId); +void DisplayItemMessage(u8 taskId, u8 fontId, const u8 *str, TaskFunc callback); void DisplayItemMessageOnField(u8 taskId, const u8 *string, TaskFunc callback); void CloseItemMessage(u8 taskId); void ItemMenu_RotomCatalog(u8 taskId); +void SortItemsInBag(struct BagPocket *pocket, enum BagSortOptions type); #endif //GUARD_ITEM_MENU_H diff --git a/include/item_use.h b/include/item_use.h index ad8018d67df9..ccb0f4f3df8c 100644 --- a/include/item_use.h +++ b/include/item_use.h @@ -49,6 +49,8 @@ void Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker(u8 taskId); void DisplayDadsAdviceCannotUseItemMessage(u8 taskId, bool8 isUsingRegisteredKeyItemOnField); void ItemUseOutOfBattle_PokeFlute(u8 taskId); void ItemUseOutOfBattle_TownMap(u8 taskId); +bool8 ItemfinderCheckForHiddenItems(const struct MapEvents *, u8); +u8 GetDirectionToHiddenItem(s16, s16); enum { BALL_THROW_UNABLE_TWO_MONS, diff --git a/include/landmark.h b/include/landmark.h index 395905033a2a..f5feb407bc02 100644 --- a/include/landmark.h +++ b/include/landmark.h @@ -1,6 +1,6 @@ #ifndef GUARD_LANDMARK_H #define GUARD_LANDMARK_H -const u8 *GetLandmarkName(u8 mapSection, u8 id, u8 count); +const u8 *GetLandmarkName(mapsec_u8_t mapSection, u8 id, u8 count); #endif // GUARD_LANDMARK_H diff --git a/include/line_break.h b/include/line_break.h index af0d27ff2159..12c4603528a8 100644 --- a/include/line_break.h +++ b/include/line_break.h @@ -32,6 +32,9 @@ u32 CountLineBreaks(u8 *src); void BreakStringAutomatic(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId, enum ToggleScrollPrompt toggleScrollPrompt); void BreakSubStringAutomatic(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId, enum ToggleScrollPrompt toggleScrollPrompt); +void BreakStringNaive(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId, enum ToggleScrollPrompt toggleScrollPrompt); +void BreakSubStringNaive(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId, enum ToggleScrollPrompt toggleScrollPrompt); + bool32 IsWordSplittingChar(const u8 *src, u32 index); u32 GetStringBadness(struct StringLine *stringLines, u32 numLines, u32 maxWidth); void BuildNewString(struct StringLine *stringLines, u32 numLines, u32 maxLines, u8 *str, enum ToggleScrollPrompt toggleScrollPrompt); diff --git a/include/list_menu.h b/include/list_menu.h index 184b9c416f8e..8d472320d67c 100644 --- a/include/list_menu.h +++ b/include/list_menu.h @@ -76,8 +76,9 @@ struct ListMenuTemplate u8 lettersSpacing:3; u8 itemVerticalPadding:3; u8 scrollMultiple:2; // x40, x80 = xC0 - u8 fontId:6; // x1, x2, x4, x8, x10, x20 = x3F - u8 cursorKind:2; // x40, x80 + u8 fontId:5; // x1, x2, x4, x8, x10 = x1F + u8 cursorKind:2; // x20, x40 + u8 isDynamic:1; //Dynamic list doesn't store all items in memory but load them from ROM when necessary }; struct ListMenu diff --git a/include/mail.h b/include/mail.h index 403078f0975f..de29b21d425c 100644 --- a/include/mail.h +++ b/include/mail.h @@ -1,6 +1,8 @@ #ifndef GUARD_MAIL_H #define GUARD_MAIL_H +#include "main.h" + #define IS_ITEM_MAIL(itemId) ((itemId == ITEM_ORANGE_MAIL \ || itemId == ITEM_HARBOR_MAIL \ || itemId == ITEM_GLITTER_MAIL \ @@ -15,7 +17,7 @@ || itemId == ITEM_RETRO_MAIL)) // mail.h -void ReadMail(struct Mail *mail, void (*exitCallback)(void), bool8 hasText); +void ReadMail(struct Mail *mail, MainCallback exitCallback, bool8 hasText); // mail_data.h void ClearAllMail(void); diff --git a/include/malloc.h b/include/malloc.h index ca4ff8af7e7d..b3f176e33040 100644 --- a/include/malloc.h +++ b/include/malloc.h @@ -41,7 +41,7 @@ struct MemBlock u8 data[0]; }; -#define HEAP_SIZE 0x1C000 +#define HEAP_SIZE 0x1C300 extern u8 gHeap[HEAP_SIZE]; #if TESTING || !defined(NDEBUG) diff --git a/include/match_call.h b/include/match_call.h index ed2cf506c55a..468a977a1377 100644 --- a/include/match_call.h +++ b/include/match_call.h @@ -19,5 +19,6 @@ void BufferPokedexRatingForMatchCall(u8 *destStr); bool32 SelectMatchCallMessage(int trainerId, u8 *str); void LoadMatchCallWindowGfx(u32 windowId, u32 destOffset, u32 paletteId); void DrawMatchCallTextBoxBorder(u32 windowId, u32 tileOffset, u32 paletteId); +void RedrawMatchCallTextBoxBorder(void); #endif //GUARD_MATCH_CALL_H diff --git a/include/math_util.h b/include/math_util.h index 04013fc03f0a..71d79d9ba8f8 100755 --- a/include/math_util.h +++ b/include/math_util.h @@ -10,5 +10,6 @@ s32 MathUtil_Div32(s32 x, s32 y); s16 MathUtil_Inv16(s16 y); s16 MathUtil_Inv16Shift(u8 s, s16 y); s32 MathUtil_Inv32(s32 y); +u32 MathUtil_Exponent(u32 x, u32 y); #endif // GUARD_MATH_UTIL_H diff --git a/include/menu.h b/include/menu.h index ca7f8d008c4c..670255233174 100644 --- a/include/menu.h +++ b/include/menu.h @@ -61,8 +61,6 @@ void PrintPlayerNameOnWindow(u8 windowId, const u8 *src, u16 x, u16 y); void ClearDialogWindowAndFrame(u8 windowId, bool8 copyToVram); void SetStandardWindowBorderStyle(u8 windowId, bool8 copyToVram); void DisplayYesNoMenuDefaultYes(void); -u32 GetPlayerTextSpeed(void); -u8 GetPlayerTextSpeedDelay(void); void Menu_LoadStdPalAt(u16 offset); void AddTextPrinterWithCallbackForMessage(bool8 canSpeedUp, void (*callback)(struct TextPrinterTemplate *, u16)); void BgDmaFill(u32 bg, u8 value, int offset, int size); @@ -106,7 +104,6 @@ void DrawStdWindowFrame(u8 windowId, bool8 copyToVram); u8 AddStartMenuWindow(u8 numActions); u8 InitMenuNormal(u8 windowId, u8 fontId, u8 left, u8 top, u8 cursorHeight, u8 numChoices, u8 initialCursorPos); void LoadMessageBoxAndFrameGfx(u8 windowId, bool8 copyToVram); -void AddTextPrinterForMessage_2(bool8 allowSkippingDelayWithButtonPress); void RemoveStartMenuWindow(void); void DisplayYesNoMenuWithDefault(u8 initialCursorPos); void BufferSaveMenuText(u8 textId, u8 *dest, u8 color); @@ -135,5 +132,6 @@ u8 AddSecondaryPopUpWindow(void); u8 GetSecondaryPopUpWindowId(void); void RemoveSecondaryPopUpWindow(void); void HBlankCB_DoublePopupWindow(void); +void RedrawDialogueFrame(void); #endif // GUARD_MENU_H diff --git a/include/metaprogram.h b/include/metaprogram.h index be62b2f9e536..1bf77265ff32 100644 --- a/include/metaprogram.h +++ b/include/metaprogram.h @@ -26,11 +26,18 @@ #define STR(...) STR_(__VA_ARGS__) #define STR_(...) #__VA_ARGS__ -/* You'll never guess what this one does */ +/* You'll never guess what these do */ #define APPEND_SEMICOLON(a) a; +#define APPEND_COMMA(a) a, /* Converts a string to a compound literal, essentially making it a pointer to const u8 */ #define COMPOUND_STRING(str) (const u8[]) _(str) +#define COMPOUND_STRING_SIZE_LIMIT(str, limit) (const u8[COMPOUND_STRING_CHECK_SIZE(str, limit)]) _(str) + +/* Used for COMPOUND_STRING_SIZE_LIMIT. Stupid, but makes sure we only get + * one error message regardless of how many characters over the limit we are. + * Otherwise, GCC gives an error for each and every character (which is annoying). */ +#define COMPOUND_STRING_CHECK_SIZE(str, limit) (sizeof(COMPOUND_STRING(str)) > limit ? sizeof(COMPOUND_STRING(str)) - 1 : sizeof(COMPOUND_STRING(str))) /* Expands to the first/second/third/fourth argument. */ #define FIRST(a, ...) a @@ -44,14 +51,31 @@ #define EXCEPT_3(a, ...) __VA_OPT__(EXCEPT_2(__VA_ARGS__)) #define EXCEPT_4(a, ...) __VA_OPT__(EXCEPT_3(__VA_ARGS__)) -/* 'UNPACK (x, y, z)' expands to 'x, y, z'. +/* 'UNPACK_META (x, y, z)' expands to 'x, y, z'. * Useful for passing arguments which may contain commas into a macro. */ -#define UNPACK(...) __VA_ARGS__ +#define UNPACK_META(...) __VA_ARGS__ + +/* Updated version that can extract arguments from brackets as well. + * Examples: + * + * UNPACK_B(a, b) => a, b + * UNPACK_B((a, b)) => a, b + * UNPACK_B((a)) => a + * + * The simple UNPACK is used for extracting non-bracketed arguments. + * */ +#define UNPACK_EXTRA(...) IF_YOU_SEE_ME_SOMETHING_IS_WRONG, __VA_ARGS__ +#define UNPACK_B(a) INVOKE_WITH_(UNPACK_B_, a, UNPACK_EXTRA a) +#define UNPACK_B_(a, b, ...) __VA_OPT__(UNPACK_META)a /* Expands to 'macro(...args, ...)'. */ -#define INVOKE_WITH(macro, args, ...) INVOKE_WITH_(macro, UNPACK args __VA_OPT__(, __VA_ARGS__)) +#define INVOKE_WITH(macro, args, ...) INVOKE_WITH_(macro, UNPACK_META args __VA_OPT__(, __VA_ARGS__)) #define INVOKE_WITH_(macro, ...) macro(__VA_ARGS__) +/* Same as INVOKE_WITH but uses UNPACK_B to unpack arguments and only applies macro to args if there are any. */ +#define INVOKE_WITH_B(macro, args, ...) INVOKE_B(macro, UNPACK_B(args) __VA_OPT__(, __VA_ARGS__)) +#define INVOKE_B(macro, ...) __VA_OPT__(macro(__VA_ARGS__)) + /* Recursive macros. * Based on https://www.scs.stanford.edu/~dm/blog/va-opt.html * @@ -81,48 +105,72 @@ #define R_FOR_EACH_WITH_(macro, args, a, ...) INVOKE_WITH(macro, args, a) __VA_OPT__(R_FOR_EACH_WITH_P PARENS (macro, args, __VA_ARGS__)) #define R_FOR_EACH_WITH_P() R_FOR_EACH_WITH_ +/* Expands to 'macro(a, b)' for each 'a' in 'as' and 'b' in 'bs'. + * Uses the shorter of 'as' and 'bs'. (Credit to MGriffin) */ +#define R_ZIP(macro, as, bs) CAT(R_ZIP_, CAT(R_ZIP_NONEMPTY(as), R_ZIP_NONEMPTY(bs)))(macro, FIRST as, FIRST bs, (EXCEPT_1 as), (EXCEPT_1 bs)) +#define R_ZIP_00(macro, a, b, as, bs) +#define R_ZIP_01(macro, a, b, as, bs) +#define R_ZIP_10(macro, a, b, as, bs) +#define R_ZIP_11(macro, a, b, as, bs) macro(a, b) R_ZIP_P PARENS (macro, as, bs) +#define R_ZIP_P() R_ZIP + +#define R_ZIP_NONEMPTY(as) R_ZIP_NONEMPTY_ as +#define R_ZIP_NONEMPTY_(...) FIRST(__VA_OPT__(1,) 0) + +/* Just a lot of numbers (with leading zeroes - remove with REMOVE_LEADING_ZEROES) */ +#define NUMBERS_256 (00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255) + /* Picks the xth VA_ARG if it exists, otherwise returns a default value */ #define DEFAULT(_default, ...) FIRST(__VA_OPT__(__VA_ARGS__, ) _default) #define DEFAULT_2(_default, ...) DEFAULT(_default __VA_OPT__(, SECOND(__VA_ARGS__))) #define DEFAULT_3(_default, ...) DEFAULT(_default __VA_OPT__(, THIRD(__VA_ARGS__))) #define DEFAULT_4(_default, ...) DEFAULT(_default __VA_OPT__(, FOURTH(__VA_ARGS__))) +/* Simply a lists numbers 0-31, allows for word-spanning macros */ +#define BITS_32(F, ...) \ + F(0, __VA_ARGS__) \ + F(1, __VA_ARGS__) \ + F(2, __VA_ARGS__) \ + F(3, __VA_ARGS__) \ + F(4, __VA_ARGS__) \ + F(5, __VA_ARGS__) \ + F(6, __VA_ARGS__) \ + F(7, __VA_ARGS__) \ + F(8, __VA_ARGS__) \ + F(9, __VA_ARGS__) \ + F(10, __VA_ARGS__) \ + F(11, __VA_ARGS__) \ + F(12, __VA_ARGS__) \ + F(13, __VA_ARGS__) \ + F(14, __VA_ARGS__) \ + F(15, __VA_ARGS__) \ + F(16, __VA_ARGS__) \ + F(17, __VA_ARGS__) \ + F(18, __VA_ARGS__) \ + F(19, __VA_ARGS__) \ + F(20, __VA_ARGS__) \ + F(21, __VA_ARGS__) \ + F(22, __VA_ARGS__) \ + F(23, __VA_ARGS__) \ + F(24, __VA_ARGS__) \ + F(25, __VA_ARGS__) \ + F(26, __VA_ARGS__) \ + F(27, __VA_ARGS__) \ + F(28, __VA_ARGS__) \ + F(29, __VA_ARGS__) \ + F(30, __VA_ARGS__) \ + F(31, __VA_ARGS__) + +/* Compares _n to 1 shifted by _b by _operation (==, <, > etc) */ +#define OP_BIT_SHIFT(_b, _n, _operation) (_n) _operation (1 << _b) ? _b : + /* (Credit to MGriffin) A rather monstrous way of finding the set bit in a word. Invalid input causes a compiler error. Sample: https://cexplore.karathan.at/z/x1hm7B */ -#define BIT_INDEX(n) \ - (n) == (1 << 0) ? 0 : \ - (n) == (1 << 1) ? 1 : \ - (n) == (1 << 2) ? 2 : \ - (n) == (1 << 3) ? 3 : \ - (n) == (1 << 4) ? 4 : \ - (n) == (1 << 5) ? 5 : \ - (n) == (1 << 6) ? 6 : \ - (n) == (1 << 7) ? 7 : \ - (n) == (1 << 8) ? 8 : \ - (n) == (1 << 9) ? 9 : \ - (n) == (1 << 10) ? 10 : \ - (n) == (1 << 11) ? 11 : \ - (n) == (1 << 12) ? 12 : \ - (n) == (1 << 13) ? 13 : \ - (n) == (1 << 14) ? 14 : \ - (n) == (1 << 15) ? 15 : \ - (n) == (1 << 16) ? 16 : \ - (n) == (1 << 17) ? 17 : \ - (n) == (1 << 18) ? 18 : \ - (n) == (1 << 19) ? 19 : \ - (n) == (1 << 20) ? 20 : \ - (n) == (1 << 21) ? 21 : \ - (n) == (1 << 22) ? 22 : \ - (n) == (1 << 23) ? 23 : \ - (n) == (1 << 24) ? 24 : \ - (n) == (1 << 25) ? 25 : \ - (n) == (1 << 26) ? 26 : \ - (n) == (1 << 27) ? 27 : \ - (n) == (1 << 28) ? 28 : \ - (n) == (1 << 29) ? 29 : \ - (n) == (1 << 30) ? 30 : \ - (n) == (1 << 31) ? 31 : \ - *(u32 *)NULL +#define BIT_INDEX(_n) BITS_32(OP_BIT_SHIFT, _n, ==) *(u32 *)NULL + +/* (Credit to MGriffin) A way to find the minimum required number of bits to +store a number (max: 32). Sample: https://godbolt.org/z/xb4KdPMhT */ +#define BIT_SIZE(_n) (BITS_32(OP_BIT_SHIFT, _n, <) 32) #define COMPRESS_BITS_0 0, 1 #define COMPRESS_BITS_1 1, 1 @@ -134,13 +182,29 @@ Invalid input causes a compiler error. Sample: https://cexplore.karathan.at/z/x1 #define COMPRESS_BITS_7 7, 1 /* Will try and compress a set bit (or up to three sequential bits) into a single byte -Input must be of the form (upper << lower) where upper can be up to 3, lower up to 31 */ +Input must be of the form (upper << lower) where upper can be up to 7, lower up to 31 */ #define COMPRESS_BITS(_val) COMPRESS_BITS_STEP_2 _val -#define COMPRESS_BITS_STEP_2(_unpacked) COMPRESS_BITS_STEP_3(COMPRESS_BITS_## _unpacked) -#define COMPRESS_BITS_STEP_3(...) COMPRESS_BITS_STEP_4(__VA_ARGS__) -#define COMPRESS_BITS_STEP_4(upper, lower) (((upper % 8) << 5) + (BIT_INDEX(lower))) +#define COMPRESS_BITS_STEP_2(_unpacked) INVOKE_WITH_(COMPRESS_BITS_STEP_3, COMPRESS_BITS_## _unpacked) +#define COMPRESS_BITS_STEP_3(upper, lower) (((upper % 8) << 5) + (BIT_INDEX(lower))) /* Will read a compressed bit stored by COMPRESS_BIT into a single byte */ #define UNCOMPRESS_BITS(compressed) ((compressed >> 5) << (compressed & 0x1F)) +/* Bit maxima */ +#define MAX_u8 0xFF +#define MAX_u16 0xFFFF +#define MAX_u32 0xFFFFFFFF + +/* Finds the maximum value of the given number of bits (up to 32 - obviously)*/ +#define MAX_BITS(_bit) (MAX_u32 >> (32 - _bit)) + +/* Finds the required digits to display the number (maximum 4) */ +#define MAX_DIGITS(_num) 1 + !!(_num / 10) + !!(_num / 100) + !!(_num / 1000) + +/* Converts a number with leading zeroes to a normal int (base 10 and up to three digits only!) */ +#define REMOVE_LEADING_ZEROES(_num) (((0x##_num / 256) * 100) + ((0x##_num / 16) * 10) + (0x##_num % 16)) + +/* Useful for counting arguments */ +#define PLUS_ONE(...) + 1 + #endif diff --git a/include/metatile_behavior.h b/include/metatile_behavior.h index ecdc696d41d9..5e268d726253 100644 --- a/include/metatile_behavior.h +++ b/include/metatile_behavior.h @@ -164,5 +164,6 @@ bool8 MetatileBehavior_IsSidewaysStairsRightSideBottom(u8 metatileBehavior); bool8 MetatileBehavior_IsSidewaysStairsLeftSideBottom(u8 metatileBehavior); bool8 MetatileBehavior_IsSidewaysStairsRightSideAny(u8 metatileBehavior); bool8 MetatileBehavior_IsSidewaysStairsLeftSideAny(u8 metatileBehavior); +bool8 MetatileBehavior_IsRockClimbable(u8 metatileBehavior); #endif // GUARD_METATILE_BEHAVIOR_H diff --git a/include/move.h b/include/move.h index 16ede9d80994..fe2587a22574 100644 --- a/include/move.h +++ b/include/move.h @@ -4,6 +4,7 @@ #include "contest_effect.h" #include "constants/battle.h" #include "constants/battle_move_effects.h" +#include "constants/battle_string_ids.h" #include "constants/moves.h" // For defining EFFECT_HIT etc. with battle TV scores and flags etc. @@ -21,21 +22,17 @@ struct __attribute__((packed, aligned(2))) BattleMoveEffect #define EFFECTS_ARR(...) (const struct AdditionalEffect[]) {__VA_ARGS__} #define ADDITIONAL_EFFECTS(...) EFFECTS_ARR( __VA_ARGS__ ), .numAdditionalEffects = ARRAY_COUNT(EFFECTS_ARR( __VA_ARGS__ )) -enum SheerForceBoost -{ - SHEER_FORCE_AUTO_BOOST, // This is the default state when a move has a move effect with a chance - SHEER_FORCE_BOOST, // If a move effect doesn't have an effect with a chance this can force a boost - SHEER_FORCE_NO_BOOST, // Prevents a Sheer Force boost -}; - struct AdditionalEffect { - u16 moveEffect; + enum MoveEffect moveEffect; u8 self:1; u8 onlyIfTargetRaisedStats:1; u8 onChargeTurnOnly:1; - u8 sheerForceBoost:2; // Handles edge cases for Sheer Force - u8 padding:3; + u8 sheerForceOverride:1; // Handles edge cases for Sheer Force - if TRUE, boosts when it shouldn't, or doesn't boost when it should + u8 padding:4; + union PACKED { + enum WrappedStringID wrapped; + } multistring; u8 chance; // 0% = effect certain, primary effect }; @@ -67,9 +64,9 @@ struct MoveInfo { const u8 *name; const u8 *description; - u16 effect; - u16 type:5; // Up to 32 - u16 category:2; + enum BattleMoveEffects effect; + enum Type type:5; // Up to 32 + enum DamageCategory category:2; u16 power:9; // up to 511 // end of word u16 accuracy:7; @@ -84,7 +81,7 @@ struct MoveInfo u32 strikeCount:4; // Max 15 hits. Defaults to 1 if not set. May apply its effect on each hit. u32 criticalHitStage:2; bool32 alwaysCriticalHit:1; - u32 numAdditionalEffects:2; // limited to 3 - don't want to get too crazy + u32 numAdditionalEffects:3; // limited to 7 // Flags bool32 makesContact:1; bool32 ignoresProtect:1; @@ -104,8 +101,8 @@ struct MoveInfo bool32 minimizeDoubleDamage:1; bool32 ignoresTargetAbility:1; bool32 ignoresTargetDefenseEvasionStages:1; - bool32 damagesUnderground:1; // end of word + bool32 damagesUnderground:1; bool32 damagesUnderwater:1; bool32 damagesAirborne:1; bool32 damagesAirborneDoubleDamage:1; @@ -131,9 +128,10 @@ struct MoveInfo bool32 parentalBondBanned:1; bool32 skyBattleBanned:1; bool32 sketchBanned:1; + bool32 dampBanned:1; //Other bool32 validApprenticeMove:1; - u32 padding:7; + u32 padding:5; // end of word union { @@ -147,9 +145,11 @@ struct MoveInfo u32 holdEffect; u32 type; u32 fixedDamage; + u32 damagePercentage; u32 absorbPercentage; u32 recoilPercentage; u32 nonVolatileStatus; + u32 overwriteAbility; } argument; // primary/secondary effects @@ -193,12 +193,12 @@ static inline const u8 *GetMoveDescription(u32 moveId) return gMovesInfo[moveId].description; } -static inline u32 GetMoveType(u32 moveId) +static inline enum Type GetMoveType(u32 moveId) { return gMovesInfo[SanitizeMoveId(moveId)].type; } -static inline u32 GetMoveCategory(u32 moveId) +static inline enum DamageCategory GetMoveCategory(u32 moveId) { return gMovesInfo[SanitizeMoveId(moveId)].category; } @@ -473,6 +473,11 @@ static inline bool32 IsMoveSketchBanned(u32 moveId) return gMovesInfo[SanitizeMoveId(moveId)].sketchBanned; } +static inline bool32 IsMoveDampBanned(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].dampBanned; +} + static inline bool32 IsValidApprenticeMove(u32 moveId) { return gMovesInfo[SanitizeMoveId(moveId)].validApprenticeMove; @@ -485,7 +490,7 @@ static inline u32 GetMoveTwoTurnAttackStringId(u32 moveId) static inline u32 GetMoveTwoTurnAttackStatus(u32 moveId) { - return UNCOMPRESS_BITS(gMovesInfo[SanitizeMoveId(moveId)].argument.twoTurnAttack.status); + return gMovesInfo[SanitizeMoveId(moveId)].argument.twoTurnAttack.status; } static inline u32 GetMoveTwoTurnAttackWeather(u32 moveId) @@ -493,11 +498,16 @@ static inline u32 GetMoveTwoTurnAttackWeather(u32 moveId) return gMovesInfo[SanitizeMoveId(moveId)].argument.twoTurnAttack.status; } -static inline u32 GetMoveProtectMethod(u32 moveId) +static inline enum ProtectMethod GetMoveProtectMethod(u32 moveId) { return gMovesInfo[SanitizeMoveId(moveId)].argument.protectMethod; } +static inline u32 GetMoveTerrainFlag(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].argument.moveProperty; +} + static inline u32 GetMoveEffectArg_Status(u32 moveId) { return gMovesInfo[SanitizeMoveId(moveId)].argument.status; @@ -518,7 +528,7 @@ static inline u32 GetMoveArgType(u32 moveId) return gMovesInfo[SanitizeMoveId(moveId)].argument.type; } -static inline u32 GetMoveFixedDamage(u32 moveId) +static inline u32 GetMoveFixedHPDamage(u32 moveId) { return gMovesInfo[SanitizeMoveId(moveId)].argument.fixedDamage; } @@ -550,6 +560,16 @@ static inline u32 GetMoveNonVolatileStatus(u32 move) } } +static inline u32 GetMoveDamagePercentage(u32 move) +{ + return gMovesInfo[SanitizeMoveId(move)].argument.damagePercentage; +} + +static inline u32 GetMoveOverwriteAbility(u32 move) +{ + return gMovesInfo[SanitizeMoveId(move)].argument.overwriteAbility; +} + static inline const struct AdditionalEffect *GetMoveAdditionalEffectById(u32 moveId, u32 effect) { return &gMovesInfo[SanitizeMoveId(moveId)].additionalEffects[effect]; diff --git a/include/move_relearner.h b/include/move_relearner.h index 9aab3974df4e..1d22d82a79ed 100644 --- a/include/move_relearner.h +++ b/include/move_relearner.h @@ -1,11 +1,14 @@ #ifndef GUARD_MOVE_RELEARNER_H #define GUARD_MOVE_RELEARNER_H +#include "constants/move_relearner.h" + void TeachMoveRelearnerMove(void); void MoveRelearnerShowHideHearts(s32 move); void MoveRelearnerShowHideCategoryIcon(s32); void CB2_InitLearnMove(void); -extern u8 gOriginSummaryScreenPage; +extern enum MoveRelearnerStates gMoveRelearnerState; +extern enum RelearnMode gRelearnMode; #endif //GUARD_MOVE_RELEARNER_H diff --git a/include/oras_dowse.h b/include/oras_dowse.h new file mode 100644 index 000000000000..8b490cf6c754 --- /dev/null +++ b/include/oras_dowse.h @@ -0,0 +1,39 @@ +#ifndef GUARD_ORAS_DOWSE_H +#define GUARD_ORAS_DOWSE_H + +// States for ORAS Dowsing +enum +{ + ORASD_WIGGLE_NONE, + ORASD_WIGGLE_SLOW, + ORASD_WIGGLE_NORMAL, + ORASD_WIGGLE_FAST, + ORASD_WIGGLE_FASTER +}; + +#define ANIM_ORAS_DOWSE_WIGGLE_SOUTH_SLOW (ANIM_STD_FACE_EAST + 1) +#define ANIM_ORAS_DOWSE_WIGGLE_NORTH_SLOW (ANIM_STD_FACE_EAST + 2) +#define ANIM_ORAS_DOWSE_WIGGLE_WEST_SLOW (ANIM_STD_FACE_EAST + 3) +#define ANIM_ORAS_DOWSE_WIGGLE_EAST_SLOW (ANIM_STD_FACE_EAST + 4) +#define ANIM_ORAS_DOWSE_WIGGLE_SOUTH (ANIM_STD_FACE_EAST + 5) +#define ANIM_ORAS_DOWSE_WIGGLE_NORTH (ANIM_STD_FACE_EAST + 6) +#define ANIM_ORAS_DOWSE_WIGGLE_WEST (ANIM_STD_FACE_EAST + 7) +#define ANIM_ORAS_DOWSE_WIGGLE_EAST (ANIM_STD_FACE_EAST + 8) +#define ANIM_ORAS_DOWSE_WIGGLE_SOUTH_FAST (ANIM_STD_FACE_EAST + 9) +#define ANIM_ORAS_DOWSE_WIGGLE_NORTH_FAST (ANIM_STD_FACE_EAST + 10) +#define ANIM_ORAS_DOWSE_WIGGLE_WEST_FAST (ANIM_STD_FACE_EAST + 11) +#define ANIM_ORAS_DOWSE_WIGGLE_EAST_FAST (ANIM_STD_FACE_EAST + 12) +#define ANIM_ORAS_DOWSE_WIGGLE_SOUTH_FASTER (ANIM_STD_FACE_EAST + 13) +#define ANIM_ORAS_DOWSE_WIGGLE_NORTH_FASTER (ANIM_STD_FACE_EAST + 14) +#define ANIM_ORAS_DOWSE_WIGGLE_WEST_FASTER (ANIM_STD_FACE_EAST + 15) +#define ANIM_ORAS_DOWSE_WIGGLE_EAST_FASTER (ANIM_STD_FACE_EAST + 16) + +extern const u16 gFieldEffectPal_ORASDowsing[]; + +void Task_UseORASDowsingMachine(u8 taskId); +void ResumeORASDowseFieldEffect(void); +void UpdateDowseState(struct Sprite *sprite); +void UpdateDowsingAnimDirection(struct Sprite *sprite, struct ObjectEvent *playerObj); +void EndORASDowsing(void); + +#endif // GUARD_ORAS_DOWSE_H diff --git a/include/overworld.h b/include/overworld.h index 09992cf48266..e0df9c3b899e 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -1,6 +1,8 @@ #ifndef GUARD_OVERWORLD_H #define GUARD_OVERWORLD_H +#include "constants/map_types.h" + #define LINK_KEY_CODE_NULL 0x00 #define LINK_KEY_CODE_EMPTY 0x11 #define LINK_KEY_CODE_DPAD_DOWN 0x12 @@ -126,22 +128,22 @@ void TryFadeOutOldMapMusic(void); bool8 BGMusicStopped(void); void Overworld_FadeOutMapMusic(void); void UpdateAmbientCry(s16 *state, u16 *delayCounter); -u8 GetMapTypeByGroupAndId(s8 mapGroup, s8 mapNum); -u8 GetMapTypeByWarpData(struct WarpData *warp); -u8 GetCurrentMapType(void); -u8 GetLastUsedWarpMapType(void); -bool8 IsMapTypeOutdoors(u8 mapType); -bool8 Overworld_MapTypeAllowsTeleportAndFly(u8 mapType); -bool8 IsMapTypeIndoors(u8 mapType); -u8 GetSavedWarpRegionMapSectionId(void); -u8 GetCurrentRegionMapSectionId(void); -u8 GetCurrentMapBattleScene(void); +enum MapType GetMapTypeByGroupAndId(s8 mapGroup, s8 mapNum); +enum MapType GetMapTypeByWarpData(struct WarpData *warp); +enum MapType GetCurrentMapType(void); +enum MapType GetLastUsedWarpMapType(void); +bool8 IsMapTypeOutdoors(enum MapType mapType); +bool8 Overworld_MapTypeAllowsTeleportAndFly(enum MapType mapType); +bool8 IsMapTypeIndoors(enum MapType mapType); +mapsec_u8_t GetSavedWarpRegionMapSectionId(void); +mapsec_u8_t GetCurrentRegionMapSectionId(void); +enum MapBattleScene GetCurrentMapBattleScene(void); void CleanupOverworldWindowsAndTilemaps(void); bool32 IsOverworldLinkActive(void); void CB1_Overworld(void); void CB2_OverworldBasic(void); void UpdateTimeOfDay(void); -bool32 MapHasNaturalLight(u8 mapType); +bool32 MapHasNaturalLight(enum MapType mapType); bool32 CurrentMapHasShadows(void); void UpdateAltBgPalettes(u16 palettes); void UpdatePalettesWithTime(u32); diff --git a/include/party_menu.h b/include/party_menu.h index 7c4af8c3a49f..acae4e0c0b73 100644 --- a/include/party_menu.h +++ b/include/party_menu.h @@ -16,10 +16,12 @@ struct PartyMenu s8 slotId2; u8 action; u16 bagItem; - s16 data1; // used variously as a move, counter, moveSlotId, or cursorPos + s16 data1; // used variously as a move, counter, moveSlotId, cursorPos, or indicator that the menu is opened from the field s16 learnMoveState; // data2, used only as a learn move state }; +#define DATA1_PARTY_MENU_FROM_FIELD -1 + extern struct PartyMenu gPartyMenu; extern bool8 gPartyMenuUseExitCallback; extern u8 gSelectedMonPartyId; @@ -94,6 +96,7 @@ u8 GetPartyIdFromBattlePartyId(u8 battlePartyId); void ShowPartyMenuToShowcaseMultiBattleParty(void); void ChooseMonForDaycare(void); bool8 CB2_FadeFromPartyMenu(void); +void CB2_ReturnToPartyMenuFromSummaryScreen(void); void ChooseContestMon(void); void ChoosePartyMon(void); void ChooseMonForMoveRelearner(void); @@ -106,4 +109,10 @@ void BufferMoveDeleterNicknameAndMove(void); void GetNumMovesSelectedMonHas(void); void MoveDeleterChooseMoveToForget(void); +bool32 SetUpFieldMove_Surf(void); +bool32 SetUpFieldMove_Fly(void); +bool32 SetUpFieldMove_Waterfall(void); +bool32 SetUpFieldMove_Dive(void); +bool32 SetUpFieldMove_RockClimb(void); + #endif // GUARD_PARTY_MENU_H diff --git a/include/pokeball.h b/include/pokeball.h index 530e168f939d..51949206e275 100644 --- a/include/pokeball.h +++ b/include/pokeball.h @@ -45,6 +45,7 @@ enum { extern const struct CompressedSpriteSheet gBallSpriteSheets[]; extern const struct SpritePalette gBallSpritePalettes[]; extern const struct SpriteTemplate gBallSpriteTemplates[]; +extern const u16 gBallItemIds[]; #define POKEBALL_PLAYER_SENDOUT 0xFF #define POKEBALL_OPPONENT_SENDOUT 0xFE diff --git a/include/pokedex.h b/include/pokedex.h index aa88834e678f..c558cd1b0705 100644 --- a/include/pokedex.h +++ b/include/pokedex.h @@ -8,9 +8,10 @@ void ResetPokedex(void); u16 GetNationalPokedexCount(u8 caseID); u16 GetHoennPokedexCount(u8 caseID); u8 DisplayCaughtMonDexPage(u16 species, bool32 isShiny, u32 personality); -s8 GetSetPokedexFlag(u16 nationalDexNo, u8 caseID); +u32 Pokedex_CreateCaughtMonSprite(u32 species, s32 x, s32 y); +s8 GetSetPokedexFlag(enum NationalDexOrder nationalDexNo, u8 caseID); void DrawFootprint(u8 windowId, u16 species); -u16 CreateMonSpriteFromNationalDexNumber(u16 nationalNum, s16 x, s16 y, u16 paletteSlot); +u16 CreateMonSpriteFromNationalDexNumber(enum NationalDexOrder nationalNum, s16 x, s16 y, u16 paletteSlot); bool16 HasAllHoennMons(void); void ResetPokedexScrollPositions(void); bool16 HasAllMons(void); diff --git a/include/pokemon.h b/include/pokemon.h index edc37a1a0bc4..9ca274330085 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -1,20 +1,27 @@ #ifndef GUARD_POKEMON_H #define GUARD_POKEMON_H +#include "contest_effect.h" #include "sprite.h" +#include "constants/battle.h" +#include "constants/cries.h" #include "constants/form_change_types.h" +#include "constants/hold_effects.h" #include "constants/items.h" +#include "constants/map_groups.h" #include "constants/regions.h" #include "constants/region_map_sections.h" #include "constants/map_groups.h" #include "constants/battle.h" +#include "constants/abilities.h" #include "contest_effect.h" +#include "constants/trainers.h" #define GET_BASE_SPECIES_ID(speciesId) (GetFormSpeciesId(speciesId, 0)) #define FORM_SPECIES_END (0xffff) // Property labels for Get(Box)MonData / Set(Box)MonData -enum { +enum MonData { MON_DATA_PERSONALITY, MON_DATA_STATUS, MON_DATA_OT_ID, @@ -124,7 +131,7 @@ enum { struct PokemonSubstruct0 { u16 species:11; // 2047 species. - u16 teraType:5; // 30 types. + enum Type teraType:5; // 30 types. u16 heldItem:10; // 1023 items. u16 unused_02:6; u32 experience:21; @@ -230,6 +237,14 @@ struct PokemonSubstruct3 max(sizeof(struct PokemonSubstruct2), \ sizeof(struct PokemonSubstruct3))))) +enum SubstructType +{ + SUBSTRUCT_TYPE_0, + SUBSTRUCT_TYPE_1, + SUBSTRUCT_TYPE_2, + SUBSTRUCT_TYPE_3, +}; + union PokemonSubstruct { struct PokemonSubstruct0 type0; @@ -308,6 +323,39 @@ enum { MON_SPR_GFX_MANAGERS_COUNT }; +#define UNPACK_VOLATILE_STRUCT(_enum, _fieldName, _typeMaxValue, ...) INVOKE_WITH_(UNPACK_VOLATILE_STRUCT_, _fieldName, UNPACK_B(_typeMaxValue)); +#define UNPACK_VOLATILE_STRUCT_(_fieldName, _type, ...) _type FIRST(__VA_OPT__(_fieldName:BIT_SIZE(FIRST(__VA_ARGS__)),) _fieldName) + +struct Volatiles +{ + VOLATILE_DEFINITIONS(UNPACK_VOLATILE_STRUCT) + // Expands to: + // u32 confusionTurns:3; + // u32 flinched:1; + // u32 uproarTurns:3; + // u32 torment:1; + // u32 bideTurns:2; + // u32 lockConfusionTurns:2; + // u32 multipleTurns:1; + // u32 wrapped:1; + // u32 powder:1; + // u32 padding:1; + // u32 infatuation:4; // one bit for each battler + // u32 defenseCurl:1; + // u32 transformed:1; + // u32 recharge:1; + // u32 rage:1; + // u32 substitute:1; + // u32 destinyBond:1; + // u32 escapePrevention:1; + // u32 nightmare:1; + // u32 cursed:1; + // u32 foresight:1; + // u32 dragonCheer:1; + // u32 focusEnergy:1; + // u32 bonusCritStages:3; +}; + struct BattlePokemon { /*0x00*/ u16 species; @@ -325,8 +373,8 @@ struct BattlePokemon /*0x17*/ u32 spDefenseIV:5; /*0x17*/ u32 abilityNum:2; /*0x18*/ s8 statStages[NUM_BATTLE_STATS]; - /*0x20*/ u16 ability; - /*0x22*/ u8 types[3]; + /*0x20*/ enum Ability ability; + /*0x22*/ enum Type types[3]; /*0x25*/ u8 pp[MAX_MON_MOVES]; /*0x29*/ u16 hp; /*0x2B*/ u8 level; @@ -339,10 +387,10 @@ struct BattlePokemon /*0x45*/ u32 experience; /*0x49*/ u32 personality; /*0x4D*/ u32 status1; - /*0x51*/ u32 status2; - /*0x55*/ u32 otId; - /*0x59*/ u8 metLevel; - /*0x5A*/ bool8 isShiny; + /*0x51*/ struct Volatiles volatiles; + /*0x5D*/ u32 otId; + /*0x61*/ u8 metLevel; + /*0x62*/ bool8 isShiny; }; struct EvolutionParam @@ -369,7 +417,7 @@ struct SpeciesInfo /*0xC4*/ u8 baseSpeed; u8 baseSpAttack; u8 baseSpDefense; - u8 types[2]; + enum Type types[2]; u8 catchRate; u8 forceTeraType; u16 expYield; // expYield was changed from u8 to u16 for the new Exp System. @@ -387,14 +435,14 @@ struct SpeciesInfo /*0xC4*/ u8 friendship; u8 growthRate; u8 eggGroups[2]; - u16 abilities[NUM_ABILITY_SLOTS]; // 3 abilities, no longer u8 because we have over 255 abilities now. + enum Ability abilities[NUM_ABILITY_SLOTS]; // 3 abilities, no longer u8 because we have over 255 abilities now. u8 safariZoneFleeRate; // PokΓ©dex data u8 categoryName[13]; u8 speciesName[POKEMON_NAME_LENGTH + 1]; - u16 cryId; - u16 natDexNum; + enum PokemonCry cryId:16; + enum NationalDexOrder natDexNum:16; u16 height; //in decimeters u16 weight; //in hectograms u16 pokemonScale; @@ -402,7 +450,7 @@ struct SpeciesInfo /*0xC4*/ u16 trainerScale; u16 trainerOffset; const u8 *description; - u8 bodyColor:7; + enum BodyColor bodyColor:7; // Graphical Data u8 noFlip:1; u8 frontAnimDelay; @@ -491,7 +539,7 @@ struct SpeciesInfo /*0xC4*/ #endif //OW_POKEMON_OBJECT_EVENTS }; -struct Ability +struct AbilityInfo { u8 name[ABILITY_NAME_LENGTH + 1]; const u8 *description; @@ -555,8 +603,8 @@ enum { struct NatureInfo { const u8 *name; - u8 statUp; - u8 statDown; + enum Stat statUp; + enum Stat statDown; u8 backAnim; u8 pokeBlockAnim[2]; u8 battlePalacePercents[4]; @@ -589,6 +637,13 @@ struct FormChange u16 param3; }; +enum FusionExtraMoveHandling +{ + FORGET_EXTRA_MOVES, + SWAP_EXTRA_MOVES_KYUREM_WHITE, + SWAP_EXTRA_MOVES_KYUREM_BLACK +}; + struct Fusion { u16 fusionStorageIndex; @@ -597,11 +652,22 @@ struct Fusion u16 targetSpecies2; u16 fusingIntoMon; u16 fusionMove; - u16 unfuseForgetMove; + enum FusionExtraMoveHandling extraMoveHandling; }; extern const struct Fusion *const gFusionTablePointers[NUM_SPECIES]; +#if P_FUSION_FORMS +#if P_FAMILY_KYUREM +#if P_FAMILY_RESHIRAM +extern const u16 gKyuremWhiteSwapMoveTable[][2]; +#endif //P_FAMILY_RESHIRAM +#if P_FAMILY_ZEKROM +extern const u16 gKyuremBlackSwapMoveTable[][2]; +#endif //P_FAMILY_ZEKROM +#endif //P_FAMILY_KYUREM +#endif //P_FUSION_FORMS + #define NUM_UNOWN_FORMS 28 #define GET_UNOWN_LETTER(personality) (( \ @@ -624,7 +690,7 @@ extern u32 removeBagItem; extern u32 removeBagItemCount; extern const u16 gFacilityClassToPicIndex[]; -extern const u16 gFacilityClassToTrainerClass[]; +extern const enum TrainerClassID gFacilityClassToTrainerClass[]; extern const struct SpeciesInfo gSpeciesInfo[]; extern const u32 gExperienceTables[][MAX_LEVEL + 1]; extern const u8 gPPUpGetMask[]; @@ -634,7 +700,7 @@ extern const u8 gStatStageRatios[MAX_STAT_STAGE + 1][2]; extern const u16 gUnionRoomFacilityClasses[]; extern const struct SpriteTemplate gBattlerSpriteTemplates[]; extern const u32 sExpCandyExperienceTable[]; -extern const struct Ability gAbilitiesInfo[]; +extern const struct AbilityInfo gAbilitiesInfo[]; extern const struct NatureInfo gNaturesInfo[]; #if P_TUTOR_MOVES_ARRAY extern const u16 gTutorMoves[]; @@ -657,9 +723,8 @@ void CreateBattleTowerMon_HandleLevel(struct Pokemon *mon, struct BattleTowerPok void CreateApprenticeMon(struct Pokemon *mon, const struct Apprentice *src, u8 monId); void CreateMonWithEVSpreadNatureOTID(struct Pokemon *mon, u16 species, u8 level, u8 nature, u8 fixedIV, u8 evSpread, u32 otId); void ConvertPokemonToBattleTowerPokemon(struct Pokemon *mon, struct BattleTowerPokemon *dest); -bool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battler); u16 GetUnionRoomTrainerPic(void); -u16 GetUnionRoomTrainerClass(void); +enum TrainerClassID GetUnionRoomTrainerClass(void); void CreateEnemyEventMon(void); void CalculateMonStats(struct Pokemon *mon); void BoxMonToMon(const struct BoxPokemon *src, struct Pokemon *dest); @@ -709,18 +774,27 @@ u8 CalculateEnemyPartyCount(void); u8 CalculateEnemyPartyCountInSide(u32 battler); u8 GetMonsStateToDoubles(void); u8 GetMonsStateToDoubles_2(void); -u16 GetAbilityBySpecies(u16 species, u8 abilityNum); -u16 GetMonAbility(struct Pokemon *mon); +enum Ability GetAbilityBySpecies(u16 species, u8 abilityNum); +enum Ability GetMonAbility(struct Pokemon *mon); void CreateSecretBaseEnemyParty(struct SecretBase *secretBaseRecord); u8 GetSecretBaseTrainerPicIndex(void); -u8 GetSecretBaseTrainerClass(void); +enum TrainerClassID GetSecretBaseTrainerClass(void); bool8 IsPlayerPartyAndPokemonStorageFull(void); bool8 IsPokemonStorageFull(void); const u8 *GetSpeciesName(u16 species); const u8 *GetSpeciesCategory(u16 species); const u8 *GetSpeciesPokedexDescription(u16 species); -u16 GetSpeciesHeight(u16 species); -u16 GetSpeciesWeight(u16 species); +u32 GetSpeciesHeight(u16 species); +u32 GetSpeciesWeight(u16 species); +enum Type GetSpeciesType(u16 species, u8 slot); +enum Ability GetSpeciesAbility(u16 species, u8 slot); +u32 GetSpeciesBaseHP(u16 species); +u32 GetSpeciesBaseAttack(u16 species); +u32 GetSpeciesBaseDefense(u16 species); +u32 GetSpeciesBaseSpAttack(u16 species); +u32 GetSpeciesBaseSpDefense(u16 species); +u32 GetSpeciesBaseSpeed(u16 species); +u32 GetSpeciesBaseStat(u16 species, u32 statIndex); const struct LevelUpMove *GetSpeciesLevelUpLearnset(u16 species); const u16 *GetSpeciesTeachableLearnset(u16 species); const u16 *GetSpeciesEggMoves(u16 species); @@ -743,19 +817,20 @@ u32 GetGMaxTargetSpecies(u32 species); bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct EvolutionParam *params, struct Pokemon *tradePartner, u32 partyId, bool32 *canStopEvo, enum EvoState evoState); u32 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 evolutionItem, struct Pokemon *tradePartner, bool32 *canStopEvo, enum EvoState evoState); bool8 IsMonPastEvolutionLevel(struct Pokemon *mon); -u16 NationalPokedexNumToSpecies(u16 nationalNum); -u16 NationalToHoennOrder(u16 nationalNum); -u16 SpeciesToNationalPokedexNum(u16 species); -u16 SpeciesToHoennPokedexNum(u16 species); -u16 HoennToNationalOrder(u16 hoennNum); +u16 NationalPokedexNumToSpecies(enum NationalDexOrder nationalNum); +enum HoennDexOrder NationalToHoennOrder(enum NationalDexOrder nationalNum); +enum NationalDexOrder SpeciesToNationalPokedexNum(u16 species); +enum HoennDexOrder SpeciesToHoennPokedexNum(u16 species); +enum NationalDexOrder HoennToNationalOrder(enum HoennDexOrder hoennNum); void DrawSpindaSpots(u32 personality, u8 *dest, bool32 isSecondFrame); void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies); u8 GetPlayerFlankId(void); u16 GetLinkTrainerFlankId(u8 linkPlayerId); s32 GetBattlerMultiplayerId(u16 id); u8 GetTrainerEncounterMusicId(u16 trainerOpponentId); -u16 ModifyStatByNature(u8 nature, u16 stat, u8 statIndex); +u16 ModifyStatByNature(u8 nature, u16 stat, enum Stat statIndex); void AdjustFriendship(struct Pokemon *mon, u8 event); +u8 CalculateFriendshipBonuses(struct Pokemon *mon, u32 modifier, enum HoldEffect itemHoldEffect); void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies); u16 GetMonEVCount(struct Pokemon *mon); void RandomlyGivePartyPokerus(struct Pokemon *party); @@ -765,9 +840,15 @@ void UpdatePartyPokerusTime(u16 days); void PartySpreadPokerus(struct Pokemon *party); bool8 TryIncrementMonLevel(struct Pokemon *mon); u8 CanLearnTeachableMove(u16 species, u16 move); -u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves); +u32 GetRelearnerLevelUpMoves(struct Pokemon *mon, u16 *moves); +u32 GetRelearnerEggMoves(struct Pokemon *mon, u16 *moves); +u32 GetRelearnerTMMoves(struct Pokemon *mon, u16 *moves); +u32 GetRelearnerTutorMoves(struct Pokemon *mon, u16 *moves); +bool32 HasRelearnerLevelUpMoves(struct Pokemon *mon); +bool32 HasRelearnerEggMoves(struct Pokemon *mon); +bool32 HasRelearnerTMMoves(struct Pokemon *mon); +bool32 HasRelearnerTutorMoves(struct Pokemon *mon); u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves); -u8 GetNumberOfRelearnableMoves(struct Pokemon *mon); u16 SpeciesToPokedexNum(u16 species); bool32 IsSpeciesInHoennDex(u16 species); u16 GetBattleBGM(void); @@ -777,7 +858,8 @@ void CreateTask_PlayMapChosenOrBattleBGM(u16 songId); const u16 *GetMonFrontSpritePal(struct Pokemon *mon); const u16 *GetMonSpritePalFromSpeciesAndPersonality(u16 species, bool32 isShiny, u32 personality); const u16 *GetMonSpritePalFromSpecies(u16 species, bool32 isShiny, bool32 isFemale); -bool8 IsMoveHM(u16 move); +bool32 IsMoveHM(u16 move); +bool32 CannotForgetMove(u16 move); bool8 IsMonSpriteNotFlipped(u16 species); s8 GetMonFlavorRelation(struct Pokemon *mon, u8 flavor); s8 GetFlavorRelationByPersonality(u32 personality, u8 flavor); @@ -797,7 +879,8 @@ void BattleAnimateBackSprite(struct Sprite *sprite, u16 species); u8 GetOpposingLinkMultiBattlerId(bool8 rightSide, u8 multiplayerId); u16 FacilityClassToPicIndex(u16 facilityClass); u16 PlayerGenderToFrontTrainerPicId(u8 playerGender); -void HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality); +void HandleSetPokedexFlag(enum NationalDexOrder nationalNum, u8 caseId, u32 personality); +void HandleSetPokedexFlagFromMon(struct Pokemon *mon, u32 caseId); bool8 HasTwoFramesAnimation(u16 species); struct MonSpritesGfxManager *CreateMonSpritesGfxManager(u8 managerId, u8 mode); void DestroyMonSpritesGfxManager(u8 managerId); @@ -811,7 +894,7 @@ u16 MonTryLearningNewMoveEvolution(struct Pokemon *mon, bool8 firstMove); void RemoveIVIndexFromList(u8 *ivs, u8 selectedIv); void TrySpecialOverworldEvo(void); bool32 SpeciesHasGenderDifferences(u16 species); -bool32 TryFormChange(u32 monId, u32 side, enum FormChanges method); +bool32 TryFormChange(u32 monId, enum BattleSide side, enum FormChanges method); void TryToSetBattleFormChangeMoves(struct Pokemon *mon, enum FormChanges method); u32 GetMonFriendshipScore(struct Pokemon *pokemon); u32 GetMonAffectionHearts(struct Pokemon *pokemon); @@ -819,16 +902,21 @@ void UpdateMonPersonality(struct BoxPokemon *boxMon, u32 personality); u8 CalculatePartyCount(struct Pokemon *party); u16 SanitizeSpeciesId(u16 species); bool32 IsSpeciesEnabled(u16 species); -u16 GetCryIdBySpecies(u16 species); +enum PokemonCry GetCryIdBySpecies(u16 species); u16 GetSpeciesPreEvolution(u16 species); void HealPokemon(struct Pokemon *mon); void HealBoxPokemon(struct BoxPokemon *boxMon); void UpdateDaysPassedSinceFormChange(u16 days); void TrySetDayLimitToFormChange(struct Pokemon *mon); -u32 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState state); +enum Type CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState state); uq4_12_t GetDynamaxLevelHPMultiplier(u32 dynamaxLevel, bool32 inverseMultiplier); u32 GetRegionalFormByRegion(u32 species, u32 region); bool32 IsSpeciesForeignRegionalForm(u32 species, u32 currentRegion); -u32 GetTeraTypeFromPersonality(struct Pokemon *mon); +enum Type GetTeraTypeFromPersonality(struct Pokemon *mon); +bool8 ShouldSkipFriendshipChange(void); +struct Pokemon *GetSavedPlayerPartyMon(u32 index); +u8 *GetSavedPlayerPartyCount(void); +void SavePlayerPartyMon(u32 index, struct Pokemon *mon); +bool32 IsSpeciesOfType(u32 species, enum Type type); #endif // GUARD_POKEMON_H diff --git a/include/pokemon_animation.h b/include/pokemon_animation.h index 748eb4b36d13..8d25d3025ce4 100644 --- a/include/pokemon_animation.h +++ b/include/pokemon_animation.h @@ -1,195 +1,201 @@ #ifndef GUARD_POKEMON_ANIMATION_H #define GUARD_POKEMON_ANIMATION_H -u8 GetSpeciesBackAnimSet(u16 species); -void LaunchAnimationTaskForFrontSprite(struct Sprite *sprite, u8 frontAnimId); -void StartMonSummaryAnimation(struct Sprite *sprite, u8 frontAnimId); -void LaunchAnimationTaskForBackSprite(struct Sprite *sprite, u8 backAnimSet); -void SetSpriteCB_MonAnimDummy(struct Sprite *sprite); - // PokΓ©mon back animation sets -#define BACK_ANIM_NONE 0 -#define BACK_ANIM_H_VIBRATE 1 -#define BACK_ANIM_H_SLIDE 2 -#define BACK_ANIM_H_SPRING 3 -#define BACK_ANIM_H_SPRING_REPEATED 4 -#define BACK_ANIM_SHRINK_GROW 5 -#define BACK_ANIM_GROW 6 -#define BACK_ANIM_CIRCLE_COUNTERCLOCKWISE 7 -#define BACK_ANIM_H_SHAKE 8 -#define BACK_ANIM_V_SHAKE 9 -#define BACK_ANIM_V_SHAKE_H_SLIDE 10 -#define BACK_ANIM_V_STRETCH 11 -#define BACK_ANIM_H_STRETCH 12 -#define BACK_ANIM_GROW_STUTTER 13 -#define BACK_ANIM_V_SHAKE_LOW 14 -#define BACK_ANIM_TRIANGLE_DOWN 15 -#define BACK_ANIM_CONCAVE_ARC_LARGE 16 -#define BACK_ANIM_CONVEX_DOUBLE_ARC 17 -#define BACK_ANIM_CONCAVE_ARC_SMALL 18 -#define BACK_ANIM_DIP_RIGHT_SIDE 19 -#define BACK_ANIM_SHRINK_GROW_VIBRATE 20 -#define BACK_ANIM_JOLT_RIGHT 21 -#define BACK_ANIM_SHAKE_FLASH_YELLOW 22 -#define BACK_ANIM_SHAKE_GLOW_RED 23 -#define BACK_ANIM_SHAKE_GLOW_GREEN 24 -#define BACK_ANIM_SHAKE_GLOW_BLUE 25 +enum BackAnim +{ + BACK_ANIM_NONE, + BACK_ANIM_H_VIBRATE, + BACK_ANIM_H_SLIDE, + BACK_ANIM_H_SPRING, + BACK_ANIM_H_SPRING_REPEATED, + BACK_ANIM_SHRINK_GROW, + BACK_ANIM_GROW, + BACK_ANIM_CIRCLE_COUNTERCLOCKWISE, + BACK_ANIM_H_SHAKE, + BACK_ANIM_V_SHAKE, + BACK_ANIM_V_SHAKE_H_SLIDE, + BACK_ANIM_V_STRETCH, + BACK_ANIM_H_STRETCH, + BACK_ANIM_GROW_STUTTER, + BACK_ANIM_V_SHAKE_LOW, + BACK_ANIM_TRIANGLE_DOWN, + BACK_ANIM_CONCAVE_ARC_LARGE, + BACK_ANIM_CONVEX_DOUBLE_ARC, + BACK_ANIM_CONCAVE_ARC_SMALL, + BACK_ANIM_DIP_RIGHT_SIDE, + BACK_ANIM_SHRINK_GROW_VIBRATE, + BACK_ANIM_JOLT_RIGHT, + BACK_ANIM_SHAKE_FLASH_YELLOW, + BACK_ANIM_SHAKE_GLOW_RED, + BACK_ANIM_SHAKE_GLOW_GREEN, + BACK_ANIM_SHAKE_GLOW_BLUE, +}; // PokΓ©mon animation function ids (for front and back) // Each front anim uses 1, and each back anim uses a set of 3 -#define ANIM_V_SQUISH_AND_BOUNCE 0 -#define ANIM_CIRCULAR_STRETCH_TWICE 1 -#define ANIM_H_VIBRATE 2 -#define ANIM_H_SLIDE 3 -#define ANIM_V_SLIDE 4 -#define ANIM_BOUNCE_ROTATE_TO_SIDES 5 -#define ANIM_V_JUMPS_H_JUMPS 6 -#define ANIM_ROTATE_TO_SIDES 7 -#define ANIM_ROTATE_TO_SIDES_TWICE 8 -#define ANIM_GROW_VIBRATE 9 -#define ANIM_ZIGZAG_FAST 10 -#define ANIM_SWING_CONCAVE 11 -#define ANIM_SWING_CONCAVE_FAST 12 -#define ANIM_SWING_CONVEX 13 -#define ANIM_SWING_CONVEX_FAST 14 -#define ANIM_H_SHAKE 15 -#define ANIM_V_SHAKE 16 -#define ANIM_CIRCULAR_VIBRATE 17 -#define ANIM_TWIST 18 -#define ANIM_SHRINK_GROW 19 -#define ANIM_CIRCLE_C_CLOCKWISE 20 -#define ANIM_GLOW_BLACK 21 -#define ANIM_H_STRETCH 22 -#define ANIM_V_STRETCH 23 -#define ANIM_RISING_WOBBLE 24 -#define ANIM_V_SHAKE_TWICE 25 -#define ANIM_TIP_MOVE_FORWARD 26 -#define ANIM_H_PIVOT 27 -#define ANIM_V_SLIDE_WOBBLE 28 -#define ANIM_H_SLIDE_WOBBLE 29 -#define ANIM_V_JUMPS_BIG 30 -#define ANIM_SPIN_LONG 31 -#define ANIM_GLOW_ORANGE 32 -#define ANIM_GLOW_RED 33 -#define ANIM_GLOW_BLUE 34 -#define ANIM_GLOW_YELLOW 35 -#define ANIM_GLOW_PURPLE 36 -#define ANIM_BACK_AND_LUNGE 37 -#define ANIM_BACK_FLIP 38 -#define ANIM_FLICKER 39 -#define ANIM_BACK_FLIP_BIG 40 -#define ANIM_FRONT_FLIP 41 -#define ANIM_TUMBLING_FRONT_FLIP 42 -#define ANIM_FIGURE_8 43 -#define ANIM_FLASH_YELLOW 44 -#define ANIM_SWING_CONCAVE_FAST_SHORT 45 -#define ANIM_SWING_CONVEX_FAST_SHORT 46 -#define ANIM_ROTATE_UP_SLAM_DOWN 47 -#define ANIM_DEEP_V_SQUISH_AND_BOUNCE 48 -#define ANIM_H_JUMPS 49 -#define ANIM_H_JUMPS_V_STRETCH 50 -#define ANIM_ROTATE_TO_SIDES_FAST 51 -#define ANIM_ROTATE_UP_TO_SIDES 52 -#define ANIM_FLICKER_INCREASING 53 -#define ANIM_TIP_HOP_FORWARD 54 -#define ANIM_PIVOT_SHAKE 55 -#define ANIM_TIP_AND_SHAKE 56 -#define ANIM_VIBRATE_TO_CORNERS 57 -#define ANIM_GROW_IN_STAGES 58 -#define ANIM_V_SPRING 59 -#define ANIM_V_REPEATED_SPRING 60 -#define ANIM_SPRING_RISING 61 -#define ANIM_H_SPRING 62 -#define ANIM_H_REPEATED_SPRING_SLOW 63 -#define ANIM_H_SLIDE_SHRINK 64 -#define ANIM_LUNGE_GROW 65 -#define ANIM_CIRCLE_INTO_BG 66 -#define ANIM_RAPID_H_HOPS 67 -#define ANIM_FOUR_PETAL 68 -#define ANIM_V_SQUISH_AND_BOUNCE_SLOW 69 -#define ANIM_H_SLIDE_SLOW 70 -#define ANIM_V_SLIDE_SLOW 71 -#define ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL 72 -#define ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW 73 -#define ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL_SLOW 74 -#define ANIM_ZIGZAG_SLOW 75 -#define ANIM_H_SHAKE_SLOW 76 -#define ANIM_V_SHAKE_SLOW 77 -#define ANIM_TWIST_TWICE 78 -#define ANIM_CIRCLE_C_CLOCKWISE_SLOW 79 -#define ANIM_V_SHAKE_TWICE_SLOW 80 -#define ANIM_V_SLIDE_WOBBLE_SMALL 81 -#define ANIM_V_JUMPS_SMALL 82 -#define ANIM_SPIN 83 -#define ANIM_TUMBLING_FRONT_FLIP_TWICE 84 -#define ANIM_DEEP_V_SQUISH_AND_BOUNCE_TWICE 85 -#define ANIM_H_JUMPS_V_STRETCH_TWICE 86 -#define ANIM_V_SHAKE_BACK 87 -#define ANIM_V_SHAKE_BACK_SLOW 88 -#define ANIM_V_SHAKE_H_SLIDE_SLOW 89 -#define ANIM_V_STRETCH_BOTH_ENDS_SLOW 90 -#define ANIM_H_STRETCH_FAR_SLOW 91 -#define ANIM_V_SHAKE_LOW_TWICE 92 -#define ANIM_H_SHAKE_FAST 93 -#define ANIM_H_SLIDE_FAST 94 -#define ANIM_H_VIBRATE_FAST 95 -#define ANIM_H_VIBRATE_FASTEST 96 -#define ANIM_V_SHAKE_BACK_FAST 97 -#define ANIM_V_SHAKE_LOW_TWICE_SLOW 98 -#define ANIM_V_SHAKE_LOW_TWICE_FAST 99 -#define ANIM_CIRCLE_C_CLOCKWISE_LONG 100 -#define ANIM_GROW_STUTTER_SLOW 101 -#define ANIM_V_SHAKE_H_SLIDE 102 -#define ANIM_V_SHAKE_H_SLIDE_FAST 103 -#define ANIM_TRIANGLE_DOWN_SLOW 104 -#define ANIM_TRIANGLE_DOWN 105 -#define ANIM_TRIANGLE_DOWN_TWICE 106 -#define ANIM_GROW 107 -#define ANIM_GROW_TWICE 108 -#define ANIM_H_SPRING_FAST 109 -#define ANIM_H_SPRING_SLOW 110 -#define ANIM_H_REPEATED_SPRING_FAST 111 -#define ANIM_H_REPEATED_SPRING 112 -#define ANIM_SHRINK_GROW_FAST 113 -#define ANIM_SHRINK_GROW_SLOW 114 -#define ANIM_V_STRETCH_BOTH_ENDS 115 -#define ANIM_V_STRETCH_BOTH_ENDS_TWICE 116 -#define ANIM_H_STRETCH_FAR_TWICE 117 -#define ANIM_H_STRETCH_FAR 118 -#define ANIM_GROW_STUTTER_TWICE 119 -#define ANIM_GROW_STUTTER 120 -#define ANIM_CONCAVE_ARC_LARGE_SLOW 121 -#define ANIM_CONCAVE_ARC_LARGE 122 -#define ANIM_CONCAVE_ARC_LARGE_TWICE 123 -#define ANIM_CONVEX_DOUBLE_ARC_SLOW 124 -#define ANIM_CONVEX_DOUBLE_ARC 125 -#define ANIM_CONVEX_DOUBLE_ARC_TWICE 126 -#define ANIM_CONCAVE_ARC_SMALL_SLOW 127 -#define ANIM_CONCAVE_ARC_SMALL 128 -#define ANIM_CONCAVE_ARC_SMALL_TWICE 129 -#define ANIM_H_DIP 130 -#define ANIM_H_DIP_FAST 131 -#define ANIM_H_DIP_TWICE 132 -#define ANIM_SHRINK_GROW_VIBRATE_FAST 133 -#define ANIM_SHRINK_GROW_VIBRATE 134 -#define ANIM_SHRINK_GROW_VIBRATE_SLOW 135 -#define ANIM_JOLT_RIGHT_FAST 136 -#define ANIM_JOLT_RIGHT 137 -#define ANIM_JOLT_RIGHT_SLOW 138 -#define ANIM_SHAKE_FLASH_YELLOW_FAST 139 -#define ANIM_SHAKE_FLASH_YELLOW 140 -#define ANIM_SHAKE_FLASH_YELLOW_SLOW 141 -#define ANIM_SHAKE_GLOW_RED_FAST 142 -#define ANIM_SHAKE_GLOW_RED 143 -#define ANIM_SHAKE_GLOW_RED_SLOW 144 -#define ANIM_SHAKE_GLOW_GREEN_FAST 145 -#define ANIM_SHAKE_GLOW_GREEN 146 -#define ANIM_SHAKE_GLOW_GREEN_SLOW 147 -#define ANIM_SHAKE_GLOW_BLUE_FAST 148 -#define ANIM_SHAKE_GLOW_BLUE 149 -#define ANIM_SHAKE_GLOW_BLUE_SLOW 150 -#define ANIM_SHAKE_GLOW_BLACK_SLOW 151 -#define ANIM_SHAKE_GLOW_WHITE_SLOW 152 -#define ANIM_SHAKE_GLOW_PURPLE_SLOW 153 +enum AnimFunctionIDs +{ + ANIM_V_SQUISH_AND_BOUNCE, + ANIM_CIRCULAR_STRETCH_TWICE, + ANIM_H_VIBRATE, + ANIM_H_SLIDE, + ANIM_V_SLIDE, + ANIM_BOUNCE_ROTATE_TO_SIDES, + ANIM_V_JUMPS_H_JUMPS, + ANIM_ROTATE_TO_SIDES, + ANIM_ROTATE_TO_SIDES_TWICE, + ANIM_GROW_VIBRATE, + ANIM_ZIGZAG_FAST, + ANIM_SWING_CONCAVE, + ANIM_SWING_CONCAVE_FAST, + ANIM_SWING_CONVEX, + ANIM_SWING_CONVEX_FAST, + ANIM_H_SHAKE, + ANIM_V_SHAKE, + ANIM_CIRCULAR_VIBRATE, + ANIM_TWIST, + ANIM_SHRINK_GROW, + ANIM_CIRCLE_C_CLOCKWISE, + ANIM_GLOW_BLACK, + ANIM_H_STRETCH, + ANIM_V_STRETCH, + ANIM_RISING_WOBBLE, + ANIM_V_SHAKE_TWICE, + ANIM_TIP_MOVE_FORWARD, + ANIM_H_PIVOT, + ANIM_V_SLIDE_WOBBLE, + ANIM_H_SLIDE_WOBBLE, + ANIM_V_JUMPS_BIG, + ANIM_SPIN_LONG, + ANIM_GLOW_ORANGE, + ANIM_GLOW_RED, + ANIM_GLOW_BLUE, + ANIM_GLOW_YELLOW, + ANIM_GLOW_PURPLE, + ANIM_BACK_AND_LUNGE, + ANIM_BACK_FLIP, + ANIM_FLICKER, + ANIM_BACK_FLIP_BIG, + ANIM_FRONT_FLIP, + ANIM_TUMBLING_FRONT_FLIP, + ANIM_FIGURE_8, + ANIM_FLASH_YELLOW, + ANIM_SWING_CONCAVE_FAST_SHORT, + ANIM_SWING_CONVEX_FAST_SHORT, + ANIM_ROTATE_UP_SLAM_DOWN, + ANIM_DEEP_V_SQUISH_AND_BOUNCE, + ANIM_H_JUMPS, + ANIM_H_JUMPS_V_STRETCH, + ANIM_ROTATE_TO_SIDES_FAST, + ANIM_ROTATE_UP_TO_SIDES, + ANIM_FLICKER_INCREASING, + ANIM_TIP_HOP_FORWARD, + ANIM_PIVOT_SHAKE, + ANIM_TIP_AND_SHAKE, + ANIM_VIBRATE_TO_CORNERS, + ANIM_GROW_IN_STAGES, + ANIM_V_SPRING, + ANIM_V_REPEATED_SPRING, + ANIM_SPRING_RISING, + ANIM_H_SPRING, + ANIM_H_REPEATED_SPRING_SLOW, + ANIM_H_SLIDE_SHRINK, + ANIM_LUNGE_GROW, + ANIM_CIRCLE_INTO_BG, + ANIM_RAPID_H_HOPS, + ANIM_FOUR_PETAL, + ANIM_V_SQUISH_AND_BOUNCE_SLOW, + ANIM_H_SLIDE_SLOW, + ANIM_V_SLIDE_SLOW, + ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL, + ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW, + ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL_SLOW, + ANIM_ZIGZAG_SLOW, + ANIM_H_SHAKE_SLOW, + ANIM_V_SHAKE_SLOW, + ANIM_TWIST_TWICE, + ANIM_CIRCLE_C_CLOCKWISE_SLOW, + ANIM_V_SHAKE_TWICE_SLOW, + ANIM_V_SLIDE_WOBBLE_SMALL, + ANIM_V_JUMPS_SMALL, + ANIM_SPIN, + ANIM_TUMBLING_FRONT_FLIP_TWICE, + ANIM_DEEP_V_SQUISH_AND_BOUNCE_TWICE, + ANIM_H_JUMPS_V_STRETCH_TWICE, + ANIM_V_SHAKE_BACK, + ANIM_V_SHAKE_BACK_SLOW, + ANIM_V_SHAKE_H_SLIDE_SLOW, + ANIM_V_STRETCH_BOTH_ENDS_SLOW, + ANIM_H_STRETCH_FAR_SLOW, + ANIM_V_SHAKE_LOW_TWICE, + ANIM_H_SHAKE_FAST, + ANIM_H_SLIDE_FAST, + ANIM_H_VIBRATE_FAST, + ANIM_H_VIBRATE_FASTEST, + ANIM_V_SHAKE_BACK_FAST, + ANIM_V_SHAKE_LOW_TWICE_SLOW, + ANIM_V_SHAKE_LOW_TWICE_FAST, + ANIM_CIRCLE_C_CLOCKWISE_LONG, + ANIM_GROW_STUTTER_SLOW, + ANIM_V_SHAKE_H_SLIDE, + ANIM_V_SHAKE_H_SLIDE_FAST, + ANIM_TRIANGLE_DOWN_SLOW, + ANIM_TRIANGLE_DOWN, + ANIM_TRIANGLE_DOWN_TWICE, + ANIM_GROW, + ANIM_GROW_TWICE, + ANIM_H_SPRING_FAST, + ANIM_H_SPRING_SLOW, + ANIM_H_REPEATED_SPRING_FAST, + ANIM_H_REPEATED_SPRING, + ANIM_SHRINK_GROW_FAST, + ANIM_SHRINK_GROW_SLOW, + ANIM_V_STRETCH_BOTH_ENDS, + ANIM_V_STRETCH_BOTH_ENDS_TWICE, + ANIM_H_STRETCH_FAR_TWICE, + ANIM_H_STRETCH_FAR, + ANIM_GROW_STUTTER_TWICE, + ANIM_GROW_STUTTER, + ANIM_CONCAVE_ARC_LARGE_SLOW, + ANIM_CONCAVE_ARC_LARGE, + ANIM_CONCAVE_ARC_LARGE_TWICE, + ANIM_CONVEX_DOUBLE_ARC_SLOW, + ANIM_CONVEX_DOUBLE_ARC, + ANIM_CONVEX_DOUBLE_ARC_TWICE, + ANIM_CONCAVE_ARC_SMALL_SLOW, + ANIM_CONCAVE_ARC_SMALL, + ANIM_CONCAVE_ARC_SMALL_TWICE, + ANIM_H_DIP, + ANIM_H_DIP_FAST, + ANIM_H_DIP_TWICE, + ANIM_SHRINK_GROW_VIBRATE_FAST, + ANIM_SHRINK_GROW_VIBRATE, + ANIM_SHRINK_GROW_VIBRATE_SLOW, + ANIM_JOLT_RIGHT_FAST, + ANIM_JOLT_RIGHT, + ANIM_JOLT_RIGHT_SLOW, + ANIM_SHAKE_FLASH_YELLOW_FAST, + ANIM_SHAKE_FLASH_YELLOW, + ANIM_SHAKE_FLASH_YELLOW_SLOW, + ANIM_SHAKE_GLOW_RED_FAST, + ANIM_SHAKE_GLOW_RED, + ANIM_SHAKE_GLOW_RED_SLOW, + ANIM_SHAKE_GLOW_GREEN_FAST, + ANIM_SHAKE_GLOW_GREEN, + ANIM_SHAKE_GLOW_GREEN_SLOW, + ANIM_SHAKE_GLOW_BLUE_FAST, + ANIM_SHAKE_GLOW_BLUE, + ANIM_SHAKE_GLOW_BLUE_SLOW, + ANIM_SHAKE_GLOW_BLACK_SLOW, + ANIM_SHAKE_GLOW_WHITE_SLOW, + ANIM_SHAKE_GLOW_PURPLE_SLOW, +}; + +enum BackAnim GetSpeciesBackAnimSet(u16 species); +void LaunchAnimationTaskForFrontSprite(struct Sprite *sprite, enum AnimFunctionIDs frontAnimId); +void StartMonSummaryAnimation(struct Sprite *sprite, enum AnimFunctionIDs frontAnimId); +void LaunchAnimationTaskForBackSprite(struct Sprite *sprite, enum BackAnim backAnimSet); +void SetSpriteCB_MonAnimDummy(struct Sprite *sprite); #endif // GUARD_POKEMON_ANIMATION_H diff --git a/include/pokemon_sprite_visualizer.h b/include/pokemon_sprite_visualizer.h index fdd53d2ce898..4205c6dc2003 100644 --- a/include/pokemon_sprite_visualizer.h +++ b/include/pokemon_sprite_visualizer.h @@ -81,7 +81,7 @@ struct PokemonSpriteVisualizer u8 animIdBack; u8 animIdFront; u8 battleBgType; - u8 battleTerrain; + u8 battleEnvironment; u8 currentSubmenu; u8 submenuYpos[3]; }; diff --git a/include/pokemon_summary_screen.h b/include/pokemon_summary_screen.h index 3aa8460a1748..6c4128dba416 100755 --- a/include/pokemon_summary_screen.h +++ b/include/pokemon_summary_screen.h @@ -3,6 +3,7 @@ #include "main.h" #include "config/summary_screen.h" +#include "constants/move_relearner.h" extern u8 gLastViewedMonIndex; @@ -13,11 +14,12 @@ extern const struct SpritePalette gSpritePal_CategoryIcons; extern const struct SpriteTemplate gSpriteTemplate_CategoryIcons; extern MainCallback gInitialSummaryScreenCallback; -void ShowPokemonSummaryScreen(u8 mode, void *mons, u8 monIndex, u8 maxMonIndex, void (*callback)(void)); -void ShowSelectMovePokemonSummaryScreen(struct Pokemon *mons, u8 monIndex, u8 maxMonIndex, void (*callback)(void), u16 newMove); -void ShowPokemonSummaryScreenHandleDeoxys(u8 mode, struct BoxPokemon *mons, u8 monIndex, u8 maxMonIndex, void (*callback)(void)); -u8 GetMoveSlotToReplace(void); -void SummaryScreen_SetAnimDelayTaskId(u8 taskId); +enum IncrDecrUpdateValues +{ + TRY_SET_UPDATE, + TRY_INCREMENT, + TRY_DECREMENT, +}; // The PokΓ©mon Summary Screen can operate in different modes. Certain features, // such as move re-ordering, are available in the different modes. @@ -48,4 +50,12 @@ enum PokemonSummarySkillsMode SUMMARY_SKILLS_MODE_EVS, }; +void ShowPokemonSummaryScreen(u8 mode, void *mons, u8 monIndex, u8 maxMonIndex, void (*callback)(void)); +void ShowSelectMovePokemonSummaryScreen(struct Pokemon *mons, u8 monIndex, u8 maxMonIndex, void (*callback)(void), u16 newMove); +void ShowPokemonSummaryScreenHandleDeoxys(u8 mode, struct BoxPokemon *mons, u8 monIndex, u8 maxMonIndex, void (*callback)(void)); +u8 GetMoveSlotToReplace(void); +void SummaryScreen_SetAnimDelayTaskId(u8 taskId); +void ShowRelearnPrompt(void); +void TryUpdateRelearnType(enum IncrDecrUpdateValues delta); + #endif // GUARD_POKEMON_SUMMARY_SCREEN_H diff --git a/include/pokenav.h b/include/pokenav.h index 2992a76d127e..191355736c2e 100644 --- a/include/pokenav.h +++ b/include/pokenav.h @@ -17,7 +17,7 @@ struct PokenavMonListItem struct PokenavMatchCallEntry { bool8 isSpecialTrainer; - u8 mapSec; + mapsec_u8_t mapSec; u16 headerId; }; @@ -413,7 +413,7 @@ void FreeMatchCallSubstruct1(void); int IsMatchCallListInitFinished(void); int GetNumberRegistered(void); struct PokenavMatchCallEntry *GetMatchCallList(void); -u16 GetMatchCallMapSec(int index); +mapsec_u16_t GetMatchCallMapSec(int index); bool32 ShouldDrawRematchPokeballIcon(int index); void ClearRematchPokeballIcon(u16 windowId, u32 tileOffset); int GetMatchCallTrainerPic(int index); @@ -422,7 +422,7 @@ const u8 *GetMatchCallMessageText(int index, bool8 *newRematchRequest); u16 GetMatchCallOptionCursorPos(void); u16 GetMatchCallOptionId(int optionId); void BufferMatchCallNameAndDesc(struct PokenavMatchCallEntry *matchCallEntry, u8 *str); -u8 GetMatchTableMapSectionId(int rematchIndex); +mapsec_u8_t GetMatchTableMapSectionId(int rematchIndex); int GetIndexDeltaOfNextCheckPageDown(int index); int GetIndexDeltaOfNextCheckPageUp(int index); bool32 IsRematchEntryRegistered(int rematchIndex); diff --git a/include/random.h b/include/random.h index b9a0ab4311d0..84318bedc0fc 100644 --- a/include/random.h +++ b/include/random.h @@ -190,16 +190,38 @@ enum RandomTag RNG_AI_SWITCH_TRAPPER, RNG_AI_SWITCH_FREE_TURN, RNG_AI_SWITCH_ALL_MOVES_BAD, + RNG_AI_CONSERVE_TERA, RNG_AI_SWITCH_ALL_SCORES_BAD, + RNG_AI_SWITCH_ABSORBING_HIDDEN_POWER, RNG_AI_PP_STALL_DISREGARD_MOVE, + RNG_AI_SUCKER_PUNCH, RNG_SHELL_SIDE_ARM, RNG_RANDOM_TARGET, RNG_AI_PREDICT_ABILITY, RNG_AI_PREDICT_SWITCH, RNG_AI_PREDICT_MOVE, RNG_AI_STATUS_FOCUS_PUNCH, + RNG_AI_BOOST_INTO_HAZE, + RNG_AI_SHOULD_RECOVER, + RNG_AI_PRIORITIZE_LAST_CHANCE, RNG_HEALER, RNG_DEXNAV_ENCOUNTER_LEVEL, + RNG_AI_ASSUME_STATUS_SLEEP, + RNG_AI_ASSUME_STATUS_NONVOLATILE, + RNG_AI_ASSUME_STATUS_HIGH_ODDS, + RNG_AI_ASSUME_STATUS_MEDIUM_ODDS, + RNG_AI_ASSUME_STATUS_LOW_ODDS, + RNG_AI_ASSUME_ALL_STATUS, + RNG_AI_REFRESH_TRICK_ROOM_ON_LAST_TURN, + RNG_AI_APPLY_TAILWIND_ON_LAST_TURN_OF_TRICK_ROOM, + RNG_WRAP, + RNG_BALLTHROW_CRITICAL, + RNG_BALLTHROW_SHAKE, + RNG_PROTECT_FAIL, + RNG_PRESENT, + RNG_MAGNITUDE, + RNG_FISHING_BITE, + RNG_FISHING_GEN3_STICKY, }; #define RandomWeighted(tag, ...) \ @@ -249,4 +271,13 @@ const void *RandomElementArrayDefault(enum RandomTag, const void *array, size_t u8 RandomWeightedIndex(u8 *weights, u8 length); +#if TESTING +u32 RandomUniformTrials(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reject)(u32), void *caller); +u32 RandomUniformDefaultValue(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reject)(u32), void *caller); +u32 RandomWeightedArrayTrials(enum RandomTag tag, u32 sum, u32 n, const u8 *weights, void *caller); +u32 RandomWeightedArrayDefaultValue(enum RandomTag tag, u32 n, const u8 *weights, void *caller); +const void *RandomElementArrayTrials(enum RandomTag tag, const void *array, size_t size, size_t count, void *caller); +const void *RandomElementArrayDefaultValue(enum RandomTag tag, const void *array, size_t size, size_t count, void *caller); +#endif + #endif // GUARD_RANDOM_H diff --git a/include/rayquaza_scene.h b/include/rayquaza_scene.h index 422b59127324..6a51b9a45ff7 100644 --- a/include/rayquaza_scene.h +++ b/include/rayquaza_scene.h @@ -1,6 +1,8 @@ #ifndef GUARD_RAYQUAZA_SCENE_H #define GUARD_RAYQUAZA_SCENE_H -void DoRayquazaScene(u8 animId, bool8 endEarly, void (*exitCallback)(void)); +#include "main.h" + +void DoRayquazaScene(u8 animId, bool8 endEarly, MainCallback exitCallback); #endif // GUARD_RAYQUAZA_SCENE_H diff --git a/include/recorded_battle.h b/include/recorded_battle.h index faf966109fb5..787cf4606c0b 100644 --- a/include/recorded_battle.h +++ b/include/recorded_battle.h @@ -27,7 +27,7 @@ struct RecordedBattleSave u8 frontierBrainSymbol; u8 battleScene:1; u8 textSpeed:3; - u64 AI_scripts; + u64 AI_scripts[MAX_BATTLERS_COUNT]; u8 recordMixFriendName[PLAYER_NAME_LENGTH + 1]; u8 recordMixFriendClass; u8 apprenticeId; @@ -81,7 +81,7 @@ u8 GetBattleSceneInRecordedBattle(void); u8 GetTextSpeedInRecordedBattle(void); void RecordedBattle_CopyBattlerMoves(u32 battler); void RecordedBattle_CheckMovesetChanges(u8 mode); -u64 GetAiScriptsInRecordedBattle(void); +u64 GetAiScriptsInRecordedBattle(u32 battler); void RecordedBattle_SetPlaybackFinished(void); bool8 RecordedBattle_CanStopPlayback(void); void GetRecordedBattleRecordMixFriendName(u8 *dst); diff --git a/include/region_map.h b/include/region_map.h index 2ca153e92fe0..571acbf3512f 100644 --- a/include/region_map.h +++ b/include/region_map.h @@ -27,7 +27,7 @@ enum { }; struct RegionMap { - /*0x000*/ u16 mapSecId; + /*0x000*/ mapsec_u16_t mapSecId; /*0x002*/ u8 mapSecType; /*0x003*/ u8 posWithinMapSec; /*0x004*/ u8 mapSecName[20]; @@ -100,14 +100,14 @@ void InitRegionMap(struct RegionMap *regionMap, bool8 zoomed); u8 DoRegionMapInputCallback(void); bool8 UpdateRegionMapZoom(void); void FreeRegionMapIconResources(void); -u16 GetRegionMapSecIdAt(u16 x, u16 y); +mapsec_u16_t GetRegionMapSecIdAt(u16 x, u16 y); void CreateRegionMapPlayerIcon(u16 tileTag, u16 paletteTag); void CreateRegionMapCursor(u16 tileTag, u16 paletteTag); -bool32 IsEventIslandMapSecId(u8 mapSecId); -u8 *GetMapName(u8 *dest, u16 regionMapId, u16 padLength); -u8 *GetMapNameGeneric(u8 *dest, u16 mapSecId); -u8 *GetMapNameHandleAquaHideout(u8 *dest, u16 mapSecId); -u16 CorrectSpecialMapSecId(u16 mapSecId); +bool32 IsEventIslandMapSecId(mapsec_u8_t mapSecId); +u8 *GetMapName(u8 *dest, mapsec_u16_t regionMapId, u16 padLength); +u8 *GetMapNameGeneric(u8 *dest, mapsec_u16_t mapSecId); +u8 *GetMapNameHandleAquaHideout(u8 *dest, mapsec_u16_t mapSecId); +mapsec_u16_t CorrectSpecialMapSecId(mapsec_u16_t mapSecId); void ShowRegionMapForPokedexAreaScreen(struct RegionMap *regionMap); void PokedexAreaScreen_UpdateRegionMapVariablesAndVideoRegs(s16 x, s16 y); void CB2_OpenFlyMap(void); diff --git a/include/rtc.h b/include/rtc.h index 8ee3071615ac..d0bb6a43de9f 100644 --- a/include/rtc.h +++ b/include/rtc.h @@ -43,6 +43,7 @@ u16 GetFullYear(void); enum Month GetMonth(void); u8 GetDay(void); enum Weekday GetDayOfWeek(void); +enum TimeOfDay GenConfigTimeOfDay(enum TimeOfDay timeOfDay); enum TimeOfDay TryIncrementTimeOfDay(enum TimeOfDay timeOfDay); enum TimeOfDay TryDecrementTimeOfDay(enum TimeOfDay timeOfDay); diff --git a/include/save.h b/include/save.h index aef84c31585e..1bc4c02404ba 100644 --- a/include/save.h +++ b/include/save.h @@ -1,6 +1,8 @@ #ifndef GUARD_SAVE_H #define GUARD_SAVE_H +#include "main.h" + // Each 4 KiB flash sector contains 3968 bytes of actual data followed by 116 bytes of SaveBlock3 and then 12 bytes of footer. #define SECTOR_DATA_SIZE 3968 #define SAVE_BLOCK_3_CHUNK_SIZE 116 @@ -87,7 +89,7 @@ extern u32 gSaveCounter; extern struct SaveSector *gFastSaveSector; extern u16 gIncrementalSectorId; extern u16 gSaveFileStatus; -extern void (*gGameContinueCallback)(void); +extern MainCallback gGameContinueCallback; extern struct SaveSectorLocation gRamSaveSectorLocations[]; extern struct SaveSector gSaveDataBuffer; diff --git a/include/sprite.h b/include/sprite.h index 5b5fd5e62f5e..791907505319 100644 --- a/include/sprite.h +++ b/include/sprite.h @@ -324,5 +324,6 @@ 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); +u8 IndexOfSpriteTileTag(u16 tag); #endif //GUARD_SPRITE_H diff --git a/include/strings.h b/include/strings.h index a9cddee25b93..a9264b69fda8 100644 --- a/include/strings.h +++ b/include/strings.h @@ -246,31 +246,6 @@ extern const u8 gText_SavingTime[]; extern const u8 gText_BattlePyramidConfirmRest[]; extern const u8 gText_BattlePyramidConfirmRetire[]; -// option menu texts -extern const u8 gText_TextSpeedSlow[]; -extern const u8 gText_TextSpeedMid[]; -extern const u8 gText_TextSpeedFast[]; -extern const u8 gText_BattleSceneOn[]; -extern const u8 gText_BattleSceneOff[]; -extern const u8 gText_BattleStyleShift[]; -extern const u8 gText_BattleStyleSet[]; -extern const u8 gText_SoundMono[]; -extern const u8 gText_SoundStereo[]; -extern const u8 gText_FrameTypeNumber[]; -extern const u8 gText_FrameType[]; -extern const u8 gText_ButtonTypeNormal[]; -extern const u8 gText_ButtonTypeLR[]; -extern const u8 gText_ButtonTypeLEqualsA[]; -extern const u8 gText_Option[]; -extern const u8 gText_OptionMenu[]; -extern const u8 gText_TextSpeed[]; -extern const u8 gText_BattleScene[]; -extern const u8 gText_BattleStyle[]; -extern const u8 gText_Sound[]; -extern const u8 gText_Frame[]; -extern const u8 gText_OptionMenuCancel[]; -extern const u8 gText_ButtonMode[]; - extern const u8 gText_MaleSymbol[]; extern const u8 gText_FemaleSymbol[]; @@ -942,6 +917,9 @@ extern const u8 gText_FrontierFacilityClearStreak[]; extern const u8 gText_FrontierFacilityRoomsCleared[]; extern const u8 gText_FrontierFacilityKOsStreak[]; extern const u8 gText_FrontierFacilityFloorsCleared[]; +extern const u8 gText_FrontierFacilityTotalCaughtSpeciesBanned[]; +extern const u8 gText_FrontierFacilityIncluding[]; +extern const u8 gText_FrontierFacilityAreInelegible[]; // Battle Tower. extern const u8 BattleFrontier_BattleTowerMultiPartnerRoom_Text_Apprentice1Intro[]; @@ -2421,9 +2399,20 @@ extern const u8 gText_PlayerRegroupCenter[]; extern const u8 gText_PlayerRegroupHome[]; extern const u8 gText_Relearn[]; // move relearner from summary screen +extern const u8 gText_Relearn_LevelUp[]; +extern const u8 gText_Relearn_Egg[]; +extern const u8 gText_Relearn_TM[]; +extern const u8 gText_Relearn_Tutor[]; extern const u8 gText_Rename[]; // change nickname from summary screen +extern const u8 MoveRelearner_Text_LevelUpMoveLWR[]; +extern const u8 MoveRelearner_Text_EggMoveLWR[]; +extern const u8 MoveRelearner_Text_TMMoveLWR[]; +extern const u8 MoveRelearner_Text_TutorMoveLWR[]; + // Switch Caught Mon into Party extern const u8 gText_CannotSendMonToBoxHM[]; +extern const u8 gText_CannotSendMonToBoxActive[]; +extern const u8 gText_CannotSendMonToBoxPartner[]; #endif // GUARD_STRINGS_H diff --git a/include/test/battle.h b/include/test/battle.h index 431e0f98f95e..198de63f3c12 100644 --- a/include/test/battle.h +++ b/include/test/battle.h @@ -2,8 +2,13 @@ * * To run all the tests use: * make check -j - * To run specific tests, e.g. Spikes ones, use: + * To run specific tests, e.g. Spikes ones, use either: * make check TESTS="Spikes" + * make check TESTS="*Spikes*" + * The first runs tests with names that start with Spikes, whereas the + * second runs tests with names that include Spikes anywhere in them. + * To run tests from a specific file, e.g. 'test/battle/move_effect/spikes.c', use: + * make check TESTS="test/battle/move_effect/spikes.c" * 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" @@ -88,7 +93,7 @@ * { * GIVEN { * ASSUME(IsPowderMove(MOVE_STUN_SPORE)); - * ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS); + * ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS); * PLAYER(SPECIES_ODDISH); // 1. * OPPONENT(SPECIES_ODDISH); // 2. * } WHEN { @@ -189,21 +194,22 @@ * ASSUME(GetMoveEffect(MOVE_POISON_STING) == EFFECT_POISON_HIT); * } * - * 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 PARAMETRIZEd tests. - * The main differences for doubles are: + * SINGLE_BATTLE_TEST(name, results...), DOUBLE_BATTLE_TEST(name, results...), MULTI_BATTLE_TEST(name, results...), + * TWO_VS_ONE_BATTLE_TEST(name, results...), and ONE_VS_TWO_BATTLE_TEST(name, results...) + * Define single-, double-, 2v2-multi-, 2v1-multi-, and 1v2- 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, 2v2, 2v1, and 1v2 are: * - Move targets sometimes need to be explicit. * - Instead of player and opponent there is playerLeft, playerRight, * opponentLeft, and opponentRight. * - * AI_SINGLE_BATTLE_TEST(name, results...) and AI_DOUBLE_BATTLE_TEST(name, results...) + * AI_SINGLE_BATTLE_TEST(name, results...), AI_DOUBLE_BATTLE_TEST(name, results...), + * AI_MULTI_BATTLE_TEST(name, results...), AI_TWO_VS_ONE_BATTLE_TEST(name, results...), and AI_ONE_VS_TWO_BATTLE_TEST(name, results...) * Define battles where opponent mons are controlled by AI, the same that runs * when battling regular Trainers. The flags for AI should be specified by * the AI_FLAGS command. - * The rules remain the same as with the SINGLE and DOUBLE battle tests + * The rules remain the same as with the SINGLE, DOUBLE, MULTI, TWO_VS_ONE, and ONE_VS_TWO battle tests with some differences: * with some differences: * - opponent's action is specified by the EXPECT_MOVE(s) / 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 @@ -219,6 +225,17 @@ * { * KNOWN_FAILING; // #2596. * + * KNOWN_CRASHING + * Marks a test as crashing 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_CRASHING. + * For example: + * TEST("Crashes") + * { + * KNOWN_CRASHING; // #7255 + * void (*f)(void) = NULL; + * f(); // Crashes! + * * PARAMETRIZE * 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.: @@ -289,10 +306,10 @@ * * WITH_CONFIG(configTag, value) * Runs the test with a specified config override. `configTag` must be - * of `enum GenConfigTag` + * of `enum ConfigTag` * Example: * GIVEN { - * WITH_CONFIG(GEN_CONFIG_GALE_WINGS, GEN_6); + * WITH_CONFIG(CONFIG_GALE_WINGS, GEN_6); * } * The `value` may be inferred from a local variable, e.g. set by * PARAMETRIZE. @@ -317,11 +334,40 @@ * Note if Moves is specified then MOVE will not automatically add moves * to the moveset. * + * For tests using MULTI_BATTLE_TEST, AI_MULTI_BATTLE_TEST, TWO_VS_ONE_BATTLE_TEST, + * AI_TWO_VS_ONE_BATTLE_TEST, ONE_VS_TWO_BATTLE_TEST, and AI_ONE_VS_TWO_BATTLE_TEST, + * the below must be used instead of PLAYER(species) and OPPONENT(species). + * MULTI_PLAYER(species), MULTI_PARTNER(species), MULTI_OPPONENT_A(species), and + * MULTI_OPPONENT_B(species) Adds the species to the player's, player partner's, + * opponent A's, or opponent B's party, respectively. + * Pokemon can be customised as per the guidance for PLAYER(species) and OPPONENT(species). + * The functions assign the PokΓ©mon to the party of the trainer at B_POSITION_PLAYER_LEFT, + * B_POSITION_PLAYER_RIGHT, B_POSITION_OPPONENT_LEFT, and B_POSITION_OPPONENT_RIGHT, respectively. + * MULTI_PLAYER(species) and MULTI_OPPONENT_A(species) set PokΓ©mon starting at party index 0, + * while MULTI_PARTNER(species) and MULTI_OPPONENT_B(species) set PokΓ©mon starting at party + * index 3. + * For ONE_VS_TWO tests, MULTI_PLAYER(species) must be used for all player-side PokΓ©mon, + * and for TWO_VS_ONE tests, MULTI_OPPONENT_A(species) must be used for all opponent-side + * PokΓ©mon. + * All MULTI_PLAYER(species) PokΓ©mon must be set before any MULTI_PARTNER(species) PokΓ©mon, + * and all MULTI_OPPONENT_A(species) must be set before any MULTI_OPPONENT_B(species) PokΓ©mon, + * else PokΓ©mon will be set in the incorrect parties in the test. + * Note where a side in a test has two trainers, the test setup manages the assigning of correct + * multi-party orders, therefore when using functions such as SEND_OUT, Player and Opponent A + * PokΓ©mon may be referenced using indexes 0, 1, and 2, and Player's Partner and Opponent B + * PokΓ©mon may be referenced using indexes 3, 4, and 5. + * * AI_FLAGS - * Specifies which AI flags are run during the test. Has use only for AI tests. + * Specifies which AI flags are run for all battlers 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. * + * BATTLER_AI_FLAGS + * Specifies additional AI flags to be applied to specific battlers (battler 0/1/2/3). Has use only for AI tests. + * Must be used strictly after AI_FLAGS(flags), which overwrites all existing flags. + * Example: BATTLER_AI_FLAGS(3, AI_FLAG_RISKY) used after AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT) + * will set AI_FLAG_RISKY to only battler3 (Opponent B), in addition to the flags set by AI_FLAGS. + * * WHEN * Contains the choices that battlers make during the battle. * @@ -423,7 +469,7 @@ * Spaces in pattern match newlines (\n, \l, and \p) in the message. * Often used to check that a battler took its turn but it failed, e.g.: * MESSAGE("Wobbuffet used Dream Eater!"); - * MESSAGE("The opposing Wobbuffet wasn't affected!"); + * MESSAGE("It doesn't affect the opposing Wobbuffet…"); * * 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 @@ -521,10 +567,25 @@ #define MAX_QUEUED_EVENTS 30 #define MAX_EXPECTED_ACTIONS 10 -enum { BATTLE_TEST_SINGLES, BATTLE_TEST_DOUBLES, BATTLE_TEST_WILD, BATTLE_TEST_AI_SINGLES, BATTLE_TEST_AI_DOUBLES }; +enum { + BATTLE_TEST_SINGLES, + BATTLE_TEST_DOUBLES, + BATTLE_TEST_WILD, + BATTLE_TEST_MULTI, + BATTLE_TEST_TWO_VS_ONE, + BATTLE_TEST_ONE_VS_TWO, + BATTLE_TEST_AI_SINGLES, + BATTLE_TEST_AI_DOUBLES, + BATTLE_TEST_AI_MULTI, + BATTLE_TEST_AI_TWO_VS_ONE, + BATTLE_TEST_AI_ONE_VS_TWO +}; typedef void (*SingleBattleTestFunction)(void *, const u32, struct BattlePokemon *, struct BattlePokemon *); typedef void (*DoubleBattleTestFunction)(void *, const u32, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *); +typedef void (*MultiBattleTestFunction)(void *, const u32, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *); +typedef void (*TwoVsOneBattleTestFunction)(void *, const u32, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *); +typedef void (*OneVsTwoBattleTestFunction)(void *, const u32, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *); struct BattleTest { @@ -533,6 +594,9 @@ struct BattleTest { SingleBattleTestFunction singles; DoubleBattleTestFunction doubles; + MultiBattleTestFunction multi; + TwoVsOneBattleTestFunction two_vs_one; + OneVsTwoBattleTestFunction one_vs_two; } function; size_t resultsSize; }; @@ -542,6 +606,7 @@ enum QUEUED_ABILITY_POPUP_EVENT, QUEUED_ANIMATION_EVENT, QUEUED_HP_EVENT, + QUEUED_SUB_HIT_EVENT, QUEUED_EXP_EVENT, QUEUED_MESSAGE_EVENT, QUEUED_STATUS_EVENT, @@ -550,7 +615,7 @@ enum struct QueuedAbilityEvent { u8 battlerId; - u16 ability; + enum Ability ability; }; struct QueuedAnimationEvent @@ -571,6 +636,14 @@ struct QueuedHPEvent u32 address:28; }; +struct QueuedSubHitEvent +{ + u32 battlerId:3; + u32 checkBreak:1; + u32 breakSub:1; + u32 address:27; +}; + struct QueuedExpEvent { u32 battlerId:3; @@ -600,29 +673,25 @@ struct QueuedEvent struct QueuedAbilityEvent ability; struct QueuedAnimationEvent animation; struct QueuedHPEvent hp; + struct QueuedSubHitEvent subHit; struct QueuedExpEvent exp; struct QueuedMessageEvent message; struct QueuedStatusEvent status; } as; }; -struct TurnRNG -{ - u16 tag; - u16 value; -}; - struct BattlerTurn { u8 hit:2; u8 criticalHit:2; u8 secondaryEffect:2; - struct TurnRNG rng; + struct RiggedRNG rng; }; struct ExpectedAIAction { - u16 sourceLine; + u16 sourceLine:13; // TODO: Avoid stealing these bits. + enum Gimmick gimmick:3; u8 type:4; // which action u8 moveSlots:4; // Expected move(s) to be chosen or not, marked as bits. u8 target:4; // move target or id of mon which gets sent out @@ -671,17 +740,19 @@ struct BattleTestData u8 playerPartySize; u8 opponentPartySize; - u8 explicitMoves[NUM_BATTLE_SIDES]; + u8 explicitMoves[MAX_BATTLERS_COUNT]; bool8 hasExplicitSpeeds; - u8 explicitSpeeds[NUM_BATTLE_SIDES]; + u8 explicitSpeeds[MAX_BATTLERS_COUNT]; u16 slowerThan[NUM_BATTLE_SIDES][PARTY_SIZE]; - u8 currentSide; + u8 currentPosition; u8 currentPartyIndex; struct Pokemon *currentMon; u8 gender; u8 nature; - u16 forcedAbilities[NUM_BATTLE_SIDES][PARTY_SIZE]; + bool8 isShiny; + enum Ability forcedAbilities[NUM_BATTLE_SIDES][PARTY_SIZE]; u8 chosenGimmick[NUM_BATTLE_SIDES][PARTY_SIZE]; + u8 forcedEnvironment; u8 currentMonIndexes[MAX_BATTLERS_COUNT]; u8 turnState; @@ -749,6 +820,8 @@ extern struct BattleTestRunnerState *const gBattleTestRunnerState; #define R_APPEND_TRUE(...) __VA_OPT__(FIRST(__VA_ARGS__), TRUE RECURSIVELY(R_FOR_EACH(APPEND_COMMA_TRUE, EXCEPT_1(__VA_ARGS__)))) #define AI_TRAINER_NAME "{PKMN} TRAINER LEAF" +#define AI_TRAINER_2_NAME "{PKMN} TRAINER RED" +#define AI_PARTNER_NAME "{PKMN} TRAINER 1" /* Test */ @@ -794,6 +867,60 @@ extern struct BattleTestRunnerState *const gBattleTestRunnerState; }; \ static void CAT(Test, __LINE__)(struct CAT(Result, __LINE__) *results, const u32 i, struct BattlePokemon *playerLeft, struct BattlePokemon *opponentLeft, struct BattlePokemon *playerRight, struct BattlePokemon *opponentRight) + #define BATTLE_TEST_ARGS_MULTI(_name, _type, ...) \ + struct CAT(Result, __LINE__) { RECURSIVELY(R_FOR_EACH(APPEND_SEMICOLON, __VA_ARGS__)) }; \ + static void CAT(Test, __LINE__)(struct CAT(Result, __LINE__) *, const u32, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *); \ + __attribute__((section(".tests"), used)) static const struct Test CAT(sTest, __LINE__) = \ + { \ + .name = _name, \ + .filename = __FILE__, \ + .runner = &gBattleTestRunner, \ + .sourceLine = __LINE__, \ + .data = (void *)&(const struct BattleTest) \ + { \ + .type = _type, \ + .function = { .multi = (MultiBattleTestFunction)CAT(Test, __LINE__) }, \ + .resultsSize = sizeof(struct CAT(Result, __LINE__)), \ + }, \ + }; \ + static void CAT(Test, __LINE__)(struct CAT(Result, __LINE__) *results, const u32 i, struct BattlePokemon *playerLeft, struct BattlePokemon *opponentLeft, struct BattlePokemon *playerRight, struct BattlePokemon *opponentRight) + +#define BATTLE_TEST_ARGS_TWO_VS_ONE(_name, _type, ...) \ + struct CAT(Result, __LINE__) { RECURSIVELY(R_FOR_EACH(APPEND_SEMICOLON, __VA_ARGS__)) }; \ + static void CAT(Test, __LINE__)(struct CAT(Result, __LINE__) *, const u32, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *); \ + __attribute__((section(".tests"), used)) static const struct Test CAT(sTest, __LINE__) = \ + { \ + .name = _name, \ + .filename = __FILE__, \ + .runner = &gBattleTestRunner, \ + .sourceLine = __LINE__, \ + .data = (void *)&(const struct BattleTest) \ + { \ + .type = _type, \ + .function = { .two_vs_one = (TwoVsOneBattleTestFunction)CAT(Test, __LINE__) }, \ + .resultsSize = sizeof(struct CAT(Result, __LINE__)), \ + }, \ + }; \ + static void CAT(Test, __LINE__)(struct CAT(Result, __LINE__) *results, const u32 i, struct BattlePokemon *playerLeft, struct BattlePokemon *opponentLeft, struct BattlePokemon *playerRight, struct BattlePokemon *opponentRight) + +#define BATTLE_TEST_ARGS_ONE_VS_TWO(_name, _type, ...) \ + struct CAT(Result, __LINE__) { RECURSIVELY(R_FOR_EACH(APPEND_SEMICOLON, __VA_ARGS__)) }; \ + static void CAT(Test, __LINE__)(struct CAT(Result, __LINE__) *, const u32, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *); \ + __attribute__((section(".tests"), used)) static const struct Test CAT(sTest, __LINE__) = \ + { \ + .name = _name, \ + .filename = __FILE__, \ + .runner = &gBattleTestRunner, \ + .sourceLine = __LINE__, \ + .data = (void *)&(const struct BattleTest) \ + { \ + .type = _type, \ + .function = { .one_vs_two = (OneVsTwoBattleTestFunction)CAT(Test, __LINE__) }, \ + .resultsSize = sizeof(struct CAT(Result, __LINE__)), \ + }, \ + }; \ + static void CAT(Test, __LINE__)(struct CAT(Result, __LINE__) *results, const u32 i, struct BattlePokemon *playerLeft, struct BattlePokemon *opponentLeft, struct BattlePokemon *playerRight, struct BattlePokemon *opponentRight) + #define SINGLE_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_SINGLE(_name, BATTLE_TEST_SINGLES, __VA_ARGS__) #define WILD_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_SINGLE(_name, BATTLE_TEST_WILD, __VA_ARGS__) @@ -802,6 +929,15 @@ extern struct BattleTestRunnerState *const gBattleTestRunnerState; #define DOUBLE_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_DOUBLE(_name, BATTLE_TEST_DOUBLES, __VA_ARGS__) #define AI_DOUBLE_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_DOUBLE(_name, BATTLE_TEST_AI_DOUBLES, __VA_ARGS__) +#define MULTI_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_MULTI(_name, BATTLE_TEST_MULTI, __VA_ARGS__) +#define AI_MULTI_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_MULTI(_name, BATTLE_TEST_AI_MULTI, __VA_ARGS__) + +#define TWO_VS_ONE_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_TWO_VS_ONE(_name, BATTLE_TEST_TWO_VS_ONE, __VA_ARGS__) +#define AI_TWO_VS_ONE_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_TWO_VS_ONE(_name, BATTLE_TEST_AI_TWO_VS_ONE, __VA_ARGS__) + +#define ONE_VS_TWO_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_ONE_VS_TWO(_name, BATTLE_TEST_ONE_VS_TWO, __VA_ARGS__) +#define AI_ONE_VS_TWO_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_ONE_VS_TWO(_name, BATTLE_TEST_AI_ONE_VS_TWO, __VA_ARGS__) + /* Parametrize */ #undef PARAMETRIZE // Override test/test.h's implementation. @@ -830,13 +966,18 @@ struct moveWithPP { #define RNGSeed(seed) RNGSeed_(__LINE__, seed) #define AI_FLAGS(flags) AIFlags_(__LINE__, flags) +#define BATTLER_AI_FLAGS(battler, flags) BattlerAIFlags_(__LINE__, battler, flags) #define AI_LOG AILogScores(__LINE__) #define FLAG_SET(flagId) SetFlagForTest(__LINE__, flagId) #define WITH_CONFIG(configTag, value) TestSetConfig(__LINE__, configTag, value) -#define PLAYER(species) for (OpenPokemon(__LINE__, B_SIDE_PLAYER, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) -#define OPPONENT(species) for (OpenPokemon(__LINE__, B_SIDE_OPPONENT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) +#define PLAYER(species) for (OpenPokemon(__LINE__, B_POSITION_PLAYER_LEFT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) +#define OPPONENT(species) for (OpenPokemon(__LINE__, B_POSITION_OPPONENT_LEFT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) +#define MULTI_PLAYER(species) for (OpenPokemonMulti(__LINE__, B_POSITION_PLAYER_LEFT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) +#define MULTI_OPPONENT_A(species) for (OpenPokemonMulti(__LINE__, B_POSITION_OPPONENT_LEFT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) +#define MULTI_PARTNER(species) for (OpenPokemonMulti(__LINE__, B_POSITION_PLAYER_RIGHT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) +#define MULTI_OPPONENT_B(species) for (OpenPokemonMulti(__LINE__, B_POSITION_OPPONENT_RIGHT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) #define Gender(gender) Gender_(__LINE__, gender) #define Nature(nature) Nature_(__LINE__, nature) @@ -864,20 +1005,24 @@ struct moveWithPP { #define DynamaxLevel(dynamaxLevel) DynamaxLevel_(__LINE__, dynamaxLevel) #define GigantamaxFactor(gigantamaxFactor) GigantamaxFactor_(__LINE__, gigantamaxFactor) #define TeraType(teraType) TeraType_(__LINE__, teraType) -#define Shadow(isShadow) Shadow_(__LINE__, shadow) +#define Shadow(isShadow) Shadow_(__LINE__, isShadow) +#define Shiny(isShiny) Shiny_(__LINE__, isShiny) +#define Environment(environment) Environment_(__LINE__, environment) void SetFlagForTest(u32 sourceLine, u16 flagId); -void TestSetConfig(u32 sourceLine, enum GenConfigTag configTag, u32 value); +void TestSetConfig(u32 sourceLine, enum ConfigTag configTag, u32 value); void ClearFlagAfterTest(void); -void OpenPokemon(u32 sourceLine, u32 side, u32 species); +void OpenPokemon(u32 sourceLine, enum BattlerPosition position, u32 species); +void OpenPokemonMulti(u32 sourceLine, enum BattlerPosition position, u32 species); void ClosePokemon(u32 sourceLine); void RNGSeed_(u32 sourceLine, rng_value_t seed); void AIFlags_(u32 sourceLine, u64 flags); +void BattlerAIFlags_(u32 sourceLine, u32 battler, u64 flags); void AILogScores(u32 sourceLine); void Gender_(u32 sourceLine, u32 gender); void Nature_(u32 sourceLine, u32 nature); -void Ability_(u32 sourceLine, u32 ability); +void Ability_(u32 sourceLine, enum Ability ability); void Level_(u32 sourceLine, u32 level); void MaxHP_(u32 sourceLine, u32 maxHP); void HP_(u32 sourceLine, u32 hp); @@ -900,8 +1045,26 @@ void Status1_(u32 sourceLine, u32 status1); void OTName_(u32 sourceLine, const u8 *otName); void DynamaxLevel_(u32 sourceLine, u32 dynamaxLevel); void GigantamaxFactor_(u32 sourceLine, bool32 gigantamaxFactor); -void TeraType_(u32 sourceLine, u32 teraType); +void TeraType_(u32 sourceLine, enum Type teraType); void Shadow_(u32 sourceLine, bool32 isShadow); +void Shiny_(u32 sourceLine, bool32 isShiny); +void Environment_(u32 sourceLine, u32 environment); + +static inline bool8 IsMultibattleTest(void) +{ + if (TESTING) + { + if (((gBattleTypeFlags & BATTLE_MULTI_TEST) == BATTLE_MULTI_TEST) + || ((gBattleTypeFlags & BATTLE_TWO_VS_ONE_TEST) == BATTLE_TWO_VS_ONE_TEST)) + return TRUE; + else + return FALSE; + } + else + { + return FALSE; + } +} // Created for easy use of EXPECT_MOVES, so the user can provide 1, 2, 3 or 4 moves for AI which can pass the test. struct FourMoves @@ -952,7 +1115,7 @@ enum { TURN_CLOSED, TURN_OPEN, TURN_CLOSING }; #define SKIP_TURN(battler) SkipTurn(__LINE__, battler) #define SEND_OUT(battler, partyIndex) SendOut(__LINE__, battler, partyIndex) #define USE_ITEM(battler, ...) UseItem(__LINE__, battler, (struct ItemContext) { R_APPEND_TRUE(__VA_ARGS__) }) -#define WITH_RNG(tag, value) rng: ((struct TurnRNG) { tag, value }) +#define WITH_RNG(tag, value) rng: ((struct RiggedRNG) { tag, value }) struct MoveContext { @@ -977,7 +1140,7 @@ struct MoveContext u16 explicitNotExpected:1; struct BattlePokemon *target; bool8 explicitTarget; - struct TurnRNG rng; + struct RiggedRNG rng; bool8 explicitRNG; }; @@ -989,6 +1152,8 @@ struct ItemContext u16 explicitPartyIndex:1; u16 move; u16 explicitMove:1; + struct RiggedRNG rng; + u16 explicitRNG:1; }; void OpenTurn(u32 sourceLine); @@ -1018,6 +1183,7 @@ void SendOut(u32 sourceLine, struct BattlePokemon *, u32 partyIndex); #define ABILITY_POPUP(battler, ...) QueueAbility(__LINE__, battler, (struct AbilityEventContext) { __VA_ARGS__ }) #define ANIMATION(type, id, ...) QueueAnimation(__LINE__, type, id, (struct AnimationEventContext) { __VA_ARGS__ }) #define HP_BAR(battler, ...) QueueHP(__LINE__, battler, (struct HPEventContext) { R_APPEND_TRUE(__VA_ARGS__) }) +#define SUB_HIT(battler, ...) QueueSubHit(__LINE__, battler, (struct SubHitEventContext) { R_APPEND_TRUE(__VA_ARGS__) }) #define EXPERIENCE_BAR(battler, ...) QueueExp(__LINE__, battler, (struct ExpEventContext) { R_APPEND_TRUE(__VA_ARGS__) }) // Static const is needed to make the modern compiler put the pattern variable in the .rodata section, instead of putting it on stack(which can break the game). #define MESSAGE(pattern) do {static const u8 msg[] = _(pattern); QueueMessage(__LINE__, msg);} while (0) @@ -1048,7 +1214,7 @@ enum QueueGroupType struct AbilityEventContext { - u16 ability; + enum Ability ability; }; struct AnimationEventContext @@ -1070,6 +1236,15 @@ struct HPEventContext bool8 explicitCaptureDamage; }; +struct SubHitEventContext +{ + u8 _; + bool8 subBreak; + bool8 explicitSubBreak; + u16 *captureDamage; + bool8 explicitCaptureDamage; +}; + struct ExpEventContext { u8 _; @@ -1098,6 +1273,7 @@ void CloseQueueGroup(u32 sourceLine); void QueueAbility(u32 sourceLine, struct BattlePokemon *battler, struct AbilityEventContext); void QueueAnimation(u32 sourceLine, u32 type, u32 id, struct AnimationEventContext); void QueueHP(u32 sourceLine, struct BattlePokemon *battler, struct HPEventContext); +void QueueSubHit(u32 sourceLine, struct BattlePokemon *battler, struct SubHitEventContext); void QueueExp(u32 sourceLine, struct BattlePokemon *battler, struct ExpEventContext); void QueueMessage(u32 sourceLine, const u8 *pattern); void QueueStatus(u32 sourceLine, struct BattlePokemon *battler, struct StatusEventContext); diff --git a/include/test/overworld_script.h b/include/test/overworld_script.h index e849f87e0c15..a5bee797b22a 100644 --- a/include/test/overworld_script.h +++ b/include/test/overworld_script.h @@ -51,7 +51,6 @@ asm(".set FALSE, 0\n" ".set VARS_END, " STR(VARS_END) "\n" ".set SPECIAL_VARS_START, " STR(SPECIAL_VARS_START) "\n" ".set SPECIAL_VARS_END, " STR(SPECIAL_VARS_END) "\n"); -asm(".include \"constants/gba_constants.inc\"\n"); // Make overworld script macros available. asm(".include \"constants/gba_constants.inc\"\n" diff --git a/include/test/test.h b/include/test/test.h index 092b603ec015..15f71d50b198 100644 --- a/include/test/test.h +++ b/include/test/test.h @@ -2,8 +2,10 @@ #define GUARD_TEST_H #include "test_runner.h" +#include "random.h" #define MAX_PROCESSES 32 // See also tools/mgba-rom-test-hydra/main.c +#define RIGGED_RNG_COUNT 8 enum TestResult { @@ -26,6 +28,9 @@ struct TestRunner void (*tearDown)(void *); bool32 (*checkProgress)(void *); bool32 (*handleExitWithResult)(void *, enum TestResult); + u32 (*randomUniform)(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reject)(u32), void *caller); + u32 (*randomWeightedArray)(enum RandomTag tag, u32 sum, u32 n, const u8 *weights, void *caller); + const void* (*randomElementArray)(enum RandomTag tag, const void *array, size_t size, size_t count, void *caller); }; struct Test @@ -37,10 +42,18 @@ struct Test u16 sourceLine; }; +enum TestFilterMode +{ + TEST_FILTER_MODE_TEST_NAME_PREFIX, + TEST_FILTER_MODE_TEST_NAME_INFIX, + TEST_FILTER_MODE_FILENAME_EXACT, +}; + struct TestRunnerState { u8 state; u8 exitCode; + enum TestFilterMode filterMode:8; const char *skipFilename; u32 failedAssumptionsBlockLine; const struct Test *test; @@ -54,31 +67,50 @@ struct TestRunnerState u32 timeoutSeconds; }; +struct PersistentTestRunnerState +{ + u32 address:28; + u32 state:1; + u32 expectCrash:1; + u32 unused_30:2; +}; + extern const u8 gTestRunnerN; extern const u8 gTestRunnerI; extern const char gTestRunnerArgv[256]; extern const struct TestRunner gAssumptionsRunner; +struct RiggedRNG +{ + u16 tag; + u16 value; +}; + struct FunctionTestRunnerState { u16 parameters; u16 runParameter; u16 checkProgressParameter; + struct RiggedRNG rngList[RIGGED_RNG_COUNT]; }; extern const struct TestRunner gFunctionTestRunner; extern struct FunctionTestRunnerState *gFunctionTestRunnerState; extern struct TestRunnerState gTestRunnerState; +extern struct PersistentTestRunnerState gPersistentTestRunnerState; void CB2_TestRunner(void); void Test_ExpectedResult(enum TestResult); void Test_ExpectLeaks(bool32); +void Test_ExpectCrash(bool32); void Test_ExitWithResult(enum TestResult, u32 stopLine, const char *fmt, ...); u32 SourceLine(u32 sourceLineOffset); u32 SourceLineOffset(u32 sourceLine); +void SetupRiggedRng(u32 sourceLine, enum RandomTag randomTag, u32 value); +void ClearRiggedRng(); s32 Test_MgbaPrintf(const char *fmt, ...); @@ -125,7 +157,7 @@ s32 Test_MgbaPrintf(const char *fmt, ...); { \ typeof(a) _a = (a), _b = (b); \ if (_a != _b) \ - Test_ExitWithResult(TEST_RESULT_FAIL, __LINE__, ":L%s:%d: EXPECT_EQ(%d, %d) failed", gTestRunnerState.test->filename, __LINE__, _a, _b); \ + Test_ExitWithResult(TEST_RESULT_FAIL, __LINE__, ":L%s:%d: EXPECT_EQ(%d, %d) failed", gTestRunnerState.test->filename, __LINE__, a, b); \ } while (0) #define EXPECT_NE(a, b) \ @@ -133,7 +165,7 @@ s32 Test_MgbaPrintf(const char *fmt, ...); { \ typeof(a) _a = (a), _b = (b); \ if (_a == _b) \ - Test_ExitWithResult(TEST_RESULT_FAIL, __LINE__, ":L%s:%d: EXPECT_NE(%d, %d) failed", gTestRunnerState.test->filename, __LINE__, _a, _b); \ + Test_ExitWithResult(TEST_RESULT_FAIL, __LINE__, ":L%s:%d: EXPECT_NE(%d, %d) failed", gTestRunnerState.test->filename, __LINE__, a, b); \ } while (0) #define EXPECT_LT(a, b) \ @@ -141,7 +173,7 @@ s32 Test_MgbaPrintf(const char *fmt, ...); { \ typeof(a) _a = (a), _b = (b); \ if (_a >= _b) \ - Test_ExitWithResult(TEST_RESULT_FAIL, __LINE__, ":L%s:%d: EXPECT_LT(%d, %d) failed", gTestRunnerState.test->filename, __LINE__, _a, _b); \ + Test_ExitWithResult(TEST_RESULT_FAIL, __LINE__, ":L%s:%d: EXPECT_LT(%d, %d) failed", gTestRunnerState.test->filename, __LINE__, a, b); \ } while (0) #define EXPECT_LE(a, b) \ @@ -149,7 +181,7 @@ s32 Test_MgbaPrintf(const char *fmt, ...); { \ typeof(a) _a = (a), _b = (b); \ if (_a > _b) \ - Test_ExitWithResult(TEST_RESULT_FAIL, __LINE__, ":L%s:%d: EXPECT_LE(%d, %d) failed", gTestRunnerState.test->filename, __LINE__, _a, _b); \ + Test_ExitWithResult(TEST_RESULT_FAIL, __LINE__, ":L%s:%d: EXPECT_LE(%d, %d) failed", gTestRunnerState.test->filename, __LINE__, a, b); \ } while (0) #define EXPECT_GT(a, b) \ @@ -157,7 +189,7 @@ s32 Test_MgbaPrintf(const char *fmt, ...); { \ typeof(a) _a = (a), _b = (b); \ if (_a <= _b) \ - Test_ExitWithResult(TEST_RESULT_FAIL, __LINE__, ":L%s:%d: EXPECT_GT(%d, %d) failed", gTestRunnerState.test->filename, __LINE__, _a, _b); \ + Test_ExitWithResult(TEST_RESULT_FAIL, __LINE__, ":L%s:%d: EXPECT_GT(%d, %d) failed", gTestRunnerState.test->filename, __LINE__, a, b); \ } while (0) #define EXPECT_GE(a, b) \ @@ -165,7 +197,7 @@ s32 Test_MgbaPrintf(const char *fmt, ...); { \ typeof(a) _a = (a), _b = (b); \ if (_a < _b) \ - Test_ExitWithResult(TEST_RESULT_FAIL, __LINE__, ":L%s:%d: EXPECT_GE(%d, %d) failed", gTestRunnerState.test->filename, __LINE__, _a, _b); \ + Test_ExitWithResult(TEST_RESULT_FAIL, __LINE__, ":L%s:%d: EXPECT_GE(%d, %d) failed", gTestRunnerState.test->filename, __LINE__, a, b); \ } while (0) struct Benchmark { s32 ticks; }; @@ -220,10 +252,15 @@ static inline struct Benchmark BenchmarkStop(void) #define KNOWN_LEAKING \ Test_ExpectLeaks(TRUE) +#define KNOWN_CRASHING \ + Test_ExpectCrash(TRUE) + #define PARAMETRIZE if (gFunctionTestRunnerState->parameters++ == gFunctionTestRunnerState->runParameter) #define PARAMETRIZE_LABEL(f, label) if (gFunctionTestRunnerState->parameters++ == gFunctionTestRunnerState->runParameter && (Test_MgbaPrintf(":N%s: " f " (%d/%d)", gTestRunnerState.test->name, label, gFunctionTestRunnerState->runParameter + 1, gFunctionTestRunnerState->parameters), 1)) +#define SET_RNG(tag, value) SetupRiggedRng(__LINE__, tag, value) + #define TO_DO \ do { \ Test_ExpectedResult(TEST_RESULT_TODO); \ diff --git a/include/test/test_runner_battle.h b/include/test/test_runner_battle.h new file mode 100644 index 000000000000..8a2c0dc64b4a --- /dev/null +++ b/include/test/test_runner_battle.h @@ -0,0 +1,6 @@ +#ifndef GUARD_BATTLE_TEST_RUNNER_H +#define GUARD_BATTLE_TEST_RUNNER_H + +bool8 IsMultibattleTest(void); + +#endif diff --git a/include/test_runner.h b/include/test_runner.h index 9e0d96ff5bb7..fa97da988112 100644 --- a/include/test_runner.h +++ b/include/test_runner.h @@ -2,19 +2,26 @@ #define GUARD_TEST_RUNNER_H extern const bool8 gTestRunnerEnabled; +#if TESTING extern const bool8 gTestRunnerHeadless; +#else +#define gTestRunnerHeadless FALSE +#endif extern const bool8 gTestRunnerSkipIsFail; #if TESTING -void TestRunner_Battle_RecordAbilityPopUp(u32 battlerId, u32 ability); +enum Gimmick; + +void TestRunner_Battle_RecordAbilityPopUp(u32 battlerId, enum Ability ability); void TestRunner_Battle_RecordAnimation(u32 animType, u32 animId); void TestRunner_Battle_RecordHP(u32 battlerId, u32 oldHP, u32 newHP); +void TestRunner_Battle_RecordSubHit(u32 battlerId, u32 damage, bool32 broke); void TestRunner_Battle_RecordExp(u32 battlerId, u32 oldExp, u32 newExp); void TestRunner_Battle_RecordMessage(const u8 *message); void TestRunner_Battle_RecordStatus1(u32 battlerId, u32 status1); void TestRunner_Battle_AfterLastTurn(void); -void TestRunner_Battle_CheckChosenMove(u32 battlerId, u32 moveId, u32 target); +void TestRunner_Battle_CheckChosenMove(u32 battlerId, u32 moveId, u32 target, enum Gimmick gimmick); void TestRunner_Battle_CheckSwitch(u32 battlerId, u32 partyIndex); void TestRunner_Battle_CheckAiMoveScores(u32 battlerId); void TestRunner_Battle_AISetScore(const char *file, u32 line, u32 battlerId, u32 moveIndex, s32 score); @@ -26,12 +33,14 @@ void TestRunner_Battle_CheckBattleRecordActionType(u32 battlerId, u32 recordInde u32 TestRunner_Battle_GetForcedAbility(u32 side, u32 partyIndex); u32 TestRunner_Battle_GetChosenGimmick(u32 side, u32 partyIndex); +u32 TestRunner_Battle_GetForcedEnvironment(void); #else #define TestRunner_Battle_RecordAbilityPopUp(...) (void)0 #define TestRunner_Battle_RecordAnimation(...) (void)0 #define TestRunner_Battle_RecordHP(...) (void)0 +#define TestRunner_Battle_RecordSubHit(...) (void)0 #define TestRunner_Battle_RecordExp(...) (void)0 #define TestRunner_Battle_RecordMessage(...) (void)0 #define TestRunner_Battle_RecordStatus1(...) (void)0 @@ -49,6 +58,8 @@ u32 TestRunner_Battle_GetChosenGimmick(u32 side, u32 partyIndex); #define TestRunner_Battle_GetChosenGimmick(...) (u32)0 +#define TestRunner_Battle_GetForcedEnvironment(...) (u8)0 + #endif #endif diff --git a/include/text.h b/include/text.h index 040fe49f1327..294bff94c7be 100644 --- a/include/text.h +++ b/include/text.h @@ -1,8 +1,15 @@ #ifndef GUARD_TEXT_H #define GUARD_TEXT_H +#include "config/text.h" #include "constants/characters.h" +// This is to prevent the user from having a higher text speed modifier than the printing system can handle. +STATIC_ASSERT( TEXT_SPEED_SLOW_MODIFIER <= 31 + && TEXT_SPEED_MEDIUM_MODIFIER <= 31 + && TEXT_SPEED_FAST_MODIFIER <= 31 + && TEXT_SPEED_INSTANT_MODIFIER <= 31, TextSpeedModifiersCantGoPast31) + // Given as a text speed when all the text should be // loaded at once but not copied to vram yet. #define TEXT_SKIP_DRAW 0xFF @@ -59,9 +66,9 @@ struct TextPrinterSubStruct u8 fontId:4; // 0x14 bool8 hasPrintBeenSpedUp:1; u8 unk:3; - u8 downArrowDelay:5; - u8 downArrowYPosIdx:2; - bool8 hasFontIdBeenSet:1; + u16 utilityCounter:13; + u16 downArrowYPosIdx:2; + bool16 hasFontIdBeenSet:1; u8 autoScrollDelay; }; @@ -135,7 +142,6 @@ struct TextGlyph }; extern TextFlags gTextFlags; - extern u8 gDisableTextPrinters; extern struct TextGlyph gCurGlyph; @@ -178,4 +184,11 @@ u32 GetFontIdToFit(const u8 *string, u32 widestFontId, u32 letterSpacing, u32 wi u8 *PrependFontIdToFit(u8 *start, u8 *end, u32 fontId, u32 width); u8 *WrapFontIdToFit(u8 *start, u8 *end, u32 fontId, u32 width); +// player text speed +u32 GetPlayerTextSpeed(void); +u32 GetPlayerTextSpeedDelay(void); +u32 GetPlayerTextSpeedModifier(void); +u32 GetPlayerTextScrollSpeed(void); +bool32 IsPlayerTextSpeedInstant(void); + #endif // GUARD_TEXT_H diff --git a/include/trade.h b/include/trade.h index 24de69b036ab..553d5ab334bf 100644 --- a/include/trade.h +++ b/include/trade.h @@ -14,7 +14,7 @@ s32 GetGameProgressForLinkTrade(void); void CB2_StartCreateTradeMenu(void); void CB2_LinkTrade(void); int CanRegisterMonForTradingBoard(struct RfuGameCompatibilityData player, u16 species2, u16 species, bool8 isModernFatefulEncounter); -int GetUnionRoomTradeMessageId(struct RfuGameCompatibilityData player, struct RfuGameCompatibilityData partner, u16 playerSpecies2, u16 partnerSpecies, u8 requestedType, u16 playerSpecies, bool8 isModernFatefulEncounter); +int GetUnionRoomTradeMessageId(struct RfuGameCompatibilityData player, struct RfuGameCompatibilityData partner, u16 playerSpecies2, u16 partnerSpecies, enum Type requestedType, u16 playerSpecies, bool8 isModernFatefulEncounter); int CanSpinTradeMon(struct Pokemon *mon, u16 monIdx); void InitTradeSequenceBgGpuRegs(void); void LinkTradeDrawWindow(void); diff --git a/include/trainer_hill.h b/include/trainer_hill.h index 6e2ec0ba0ac6..848e40e7d5ac 100644 --- a/include/trainer_hill.h +++ b/include/trainer_hill.h @@ -45,7 +45,7 @@ extern u32 *gTrainerHillVBlankCounter; void CallTrainerHillFunction(void); void ResetTrainerHillResults(void); -u8 GetTrainerHillOpponentClass(u16 trainerId); +enum TrainerClassID GetTrainerHillOpponentClass(u16 trainerId); void GetTrainerHillTrainerName(u8 *dst, u16 trainerId); u8 GetTrainerHillTrainerFrontSpriteId(u16 trainerId); void InitTrainerHillBattleStruct(void); diff --git a/include/trainer_pokemon_sprites.h b/include/trainer_pokemon_sprites.h index 619fa91e7039..ac464266eb27 100644 --- a/include/trainer_pokemon_sprites.h +++ b/include/trainer_pokemon_sprites.h @@ -16,5 +16,6 @@ u16 CreateTrainerPicSprite(u16 species, bool8 isFrontPic, s16 x, s16 y, u8 palet u16 FreeAndDestroyTrainerPicSprite(u16 spriteId); u16 CreateTrainerCardTrainerPicSprite(u16 species, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId); u16 PlayerGenderToFrontTrainerPicId_Debug(u8 gender, bool8 getClass); +void CopyTrainerBackspriteFramesToDest(u8 trainerPicId, u8 *dest); #endif // GUARD_TRAINER_POKEMON_SPRITES_H diff --git a/include/trainer_pools.h b/include/trainer_pools.h index 196657a55fdc..72df3e765c5b 100644 --- a/include/trainer_pools.h +++ b/include/trainer_pools.h @@ -56,10 +56,12 @@ enum PoolTags { struct PoolRules { - bool8 speciesClause; - bool8 excludeForms; - bool8 itemClause; - bool8 itemClauseExclusions; + u8 speciesClause:1; + u8 excludeForms:1; + u8 itemClause:1; + u8 itemClauseExclusions:1; + u8 megaStoneClause:1; + u8 zCrystalClause:1; u8 tagMaxMembers[POOL_NUM_TAGS]; bool8 tagRequired[POOL_NUM_TAGS]; }; diff --git a/include/trainer_slide.h b/include/trainer_slide.h index 19fdf7c24a2a..a8f1988fb8fe 100644 --- a/include/trainer_slide.h +++ b/include/trainer_slide.h @@ -12,7 +12,7 @@ struct MessageStatus void SetTrainerSlideMessage(enum DifficultyLevel difficulty, u32 trainerId, u32 slideId); enum TrainerSlideTargets ShouldDoTrainerSlide(u32 battler, enum TrainerSlideType slideId); -void TryInitializeFirstSTABMoveTrainerSlide(u32 battlerDef, u32 battlerAtk, u32 moveType); +void TryInitializeFirstSTABMoveTrainerSlide(u32 battlerDef, u32 battlerAtk, enum Type moveType); void TryInitializeTrainerSlidePlayerLandsFirstCriticalHit(u32 target); void TryInitializeTrainerSlideEnemyLandsFirstCriticalHit(u32 target); void TryInitializeTrainerSlidePlayerLandsFirstSuperEffectiveHit(u32 target); diff --git a/include/union_room.h b/include/union_room.h index 514a15985027..5616c106d380 100644 --- a/include/union_room.h +++ b/include/union_room.h @@ -149,7 +149,7 @@ extern u8 gPlayerCurrActivity; extern struct RfuGameCompatibilityData gRfuPartnerCompatibilityData; extern u16 gUnionRoomOfferedSpecies; -extern u8 gUnionRoomRequestedMonType; +extern enum Type gUnionRoomRequestedMonType; u8 CreateTask_CreateTradeMenu(void); void SetUsingUnionRoomStartMenu(void); diff --git a/include/vs_seeker.h b/include/vs_seeker.h index d6795432b071..749aaeab57a7 100644 --- a/include/vs_seeker.h +++ b/include/vs_seeker.h @@ -9,6 +9,7 @@ void MapResetTrainerRematches(u16 mapGroup, u16 mapNum); void ClearRematchMovementByTrainerId(void); u16 GetRematchTrainerIdVSSeeker(u16 trainerId); bool32 IsVsSeekerEnabled(void); +void NativeVsSeekerRematchId(struct ScriptContext *ctx); #define VSSEEKER_RECHARGE_STEPS 100 diff --git a/include/wild_encounter.h b/include/wild_encounter.h index 8a0eb671f65e..c8f60712f906 100644 --- a/include/wild_encounter.h +++ b/include/wild_encounter.h @@ -63,9 +63,10 @@ bool8 StandardWildEncounter_Debug(void); u32 CalculateChainFishingShinyRolls(void); void CreateWildMon(u16 species, u8 level); u16 GetCurrentMapWildMonHeaderId(void); -u8 ChooseWildMonIndex_Land(void); -u8 ChooseWildMonIndex_WaterRock(void); -u8 ChooseHiddenMonIndex(void); +u32 ChooseWildMonIndex_Land(void); +u32 ChooseWildMonIndex_Water(void); +u32 ChooseWildMonIndex_Rocks(void); +u32 ChooseHiddenMonIndex(void); bool32 MapHasNoEncounterData(void); enum TimeOfDay GetTimeOfDayForEncounters(u32 headerId, enum WildPokemonArea area); diff --git a/include/window.h b/include/window.h index 2dd67b123ffd..fc35f724d90c 100644 --- a/include/window.h +++ b/include/window.h @@ -45,7 +45,7 @@ struct WindowTemplate struct Window { struct WindowTemplate window; - u8 *tileData; + ALIGNED(4) u8 *tileData; }; bool32 InitWindows(const struct WindowTemplate *templates); diff --git a/ld_script_modern.ld b/ld_script_modern.ld index ee4713ab177e..47989bd91f30 100644 --- a/ld_script_modern.ld +++ b/ld_script_modern.ld @@ -26,7 +26,7 @@ SECTIONS { .ewram.sbss (NOLOAD) : ALIGN(4) { - src/*.o(.sbss); + *.o(.sbss); } > EWRAM .iwram ORIGIN(IWRAM) : AT (__iwram_lma) @@ -41,14 +41,8 @@ SECTIONS { .iwram.bss (NOLOAD) : ALIGN(4) { - src/*.o(.bss); - data/*.o(.bss); - *libc.a:*.o(.bss*); - *libnosys.a:*.o(.bss*); - - src/m4a.o(.bss.code); - - src/*.o(common_data); + *.o(.bss*); + *.o(common_data); src/*.o(COMMON); *libc.a:*.o(COMMON); *libnosys.a:*.o(COMMON); @@ -60,83 +54,33 @@ SECTIONS { ALIGN(4) { src/rom_header.o(.text*); - src/rom_header_gf.o(.text.*); - src/rom_header_rhh.o(.text.*); + KEEP(*.o(.text.header_gf)); + KEEP(*.o(.text.header_rhh)); src/crt0.o(.text); - src/main.o(.text); - src/*.o(.text*); - asm/*.o(.text*); - } > ROM =0 - - script_data : - ALIGN(4) - { - data/*.o(script_data); - } > ROM =0 - - lib_text : - ALIGN(4) - { - src/libgcnmultiboot.o(.text); - src/m4a_1.o(.text); - src/m4a.o(.text); - src/agb_flash.o(.text); - src/agb_flash_1m.o(.text); - src/agb_flash_mx.o(.text); - src/siirtc.o(.text); - src/librfu_stwi.o(.text); - src/librfu_intr.o(.text); - src/librfu_rfu.o(.text); - src/librfu_sio32id.o(.text); *libagbsyscall.a:*.o(.text*); *libgcc.a:*.o(.text*); *libc.a:*.o(.text*); *libnosys.a:*.o(.text*); - src/libisagbprn.o(.text); + asm/*.o(.text*); + KEEP(*.o(.text.consts)); + *.o(.text*); + *.o(.eh_frame); } > ROM =0 - .rodata : + script_data : ALIGN(4) { - src/*.o(.rodata*); - data/*.o(.rodata*); + data/*.o(script_data); } > ROM =0 - song_data : + .rodata : ALIGN(4) { - sound/songs/*.o(.rodata); - } > ROM =0 - - lib_rodata : - SUBALIGN(4) - { - src/m4a.o(.rodata); - src/agb_flash.o(.rodata); - src/agb_flash_1m.o(.rodata); - src/agb_flash_mx.o(.rodata); - src/agb_flash_le.o(.rodata); - src/siirtc.o(.rodata); - src/librfu_rfu.o(.rodata); - src/librfu_sio32id.o(.rodata); + *.o(.rodata*); *libgcc.a:*.o(.rodata*); *libc.a:*.o(.rodata*); *libc.a:*.o(.data*); - src/libisagbprn.o(.rodata); - } > ROM =0 - - multiboot_data : - ALIGN(4) - { - data/multiboot_ereader.o(.rodata); - data/multiboot_berry_glitch_fix.o(.rodata); - data/multiboot_pokemon_colosseum.o(.rodata); - } > ROM =0 - - gfx_data : - ALIGN(4) - { - src/graphics.o(.rodata); + sound/songs/*.o(.rodata); } > ROM =0 .data.iwram : diff --git a/ld_script_test.ld b/ld_script_test.ld index d279d6b4f6a1..a40329ff1c95 100644 --- a/ld_script_test.ld +++ b/ld_script_test.ld @@ -6,9 +6,10 @@ gInitialMainCB2 = CB2_TestRunner; MEMORY { - EWRAM (rwx) : ORIGIN = 0x2000000, LENGTH = 256K - IWRAM (rwx) : ORIGIN = 0x3000000, LENGTH = 32K - ROM (rx) : ORIGIN = 0x8000000, LENGTH = 32M + EWRAM (rwx) : ORIGIN = 0x2000000, LENGTH = 256K + IWRAM (rwx) : ORIGIN = 0x3000000, LENGTH = 0x7F00 + IWRAM_PERSISTENT (rwx) : ORIGIN = 0x3007F00, LENGTH = 0x100 + ROM (rx) : ORIGIN = 0x8000000, LENGTH = 32M } SECTIONS { @@ -18,6 +19,7 @@ SECTIONS { { __ewram_start = .; *(.ewram*) + . = ALIGN(4); __ewram_end = .; } > EWRAM @@ -60,13 +62,11 @@ SECTIONS { /* .persistent starts at 0x3007F00 */ /* WARNING: This is the end of the IRQ stack, if there's too * much data it WILL be overwritten. */ - - . = 0x03007F00; .iwram.persistent (NOLOAD) : ALIGN(4) { test/*.o(.persistent); - } > IWRAM + } > IWRAM_PERSISTENT /* BEGIN ROM DATA */ . = 0x8000000; @@ -75,8 +75,9 @@ SECTIONS { ALIGN(4) { src/rom_header.o(.text); - src/rom_header_gf.o(.text.*); - src/rom_header_rhh.o(.text.*); + KEEP(*.o(.text.header_gf)); + KEEP(*.o(.text.header_rhh)); + KEEP(*.o(.text.consts)); src/*.o(.text); } > ROM =0 @@ -135,6 +136,7 @@ SECTIONS { ALIGN(4) { __start_tests = .; + test/test_test_runner.o(.tests); /* Sanity checks first. */ test/*.o(.tests); __stop_tests = .; test/*.o(.text); diff --git a/make_tools.mk b/make_tools.mk index 75ebc05c9625..f0eb2d296250 100644 --- a/make_tools.mk +++ b/make_tools.mk @@ -5,17 +5,17 @@ MAKEFLAGS += --no-print-directory # Inclusive list. If you don't want a tool to be built, don't add it here. TOOLS_DIR := tools -TOOL_NAMES := aif2pcm bin2c gbafix gbagfx jsonproc mapjson mid2agb preproc ramscrgen rsfont scaninc trainerproc +TOOL_NAMES := bin2c gbafix gbagfx jsonproc mapjson mid2agb preproc ramscrgen rsfont scaninc trainerproc compresSmol wav2agb CHECK_TOOL_NAMES = patchelf mgba-rom-test-hydra TOOLDIRS := $(TOOL_NAMES:%=$(TOOLS_DIR)/%) CHECKTOOLDIRS := $(CHECK_TOOL_NAMES:%=$(TOOLS_DIR)/%) # Tool making doesnt require a pokeemerald dependency scan. -RULES_NO_SCAN += tools check-tools clean-tools clean-check-tools $(TOOLDIRS) $(CHECKTOOLDIRS) +RULES_NO_SCAN += tools check-tools clean-tools clean-check-tools history $(TOOLDIRS) $(CHECKTOOLDIRS) .PHONY: $(RULES_NO_SCAN) -tools: $(TOOLDIRS) +tools: history $(TOOLDIRS) check-tools: $(CHECKTOOLDIRS) @@ -30,3 +30,6 @@ clean-tools: clean-check-tools: @$(foreach tooldir,$(CHECKTOOLDIRS),$(MAKE) clean -C $(tooldir);) + +history: + @$(SHELL) ./check_history.sh diff --git a/migration_scripts/1.11/consolidate_contest_opponent_filters.py b/migration_scripts/1.11/consolidate_contest_opponent_filters.py index 240152cea2e9..0f273f7b1d32 100644 --- a/migration_scripts/1.11/consolidate_contest_opponent_filters.py +++ b/migration_scripts/1.11/consolidate_contest_opponent_filters.py @@ -30,7 +30,6 @@ def add_filter_data(match): if trainer_name in source_data: contest_filter = source_data[trainer_name] print(f"Updating {trainer_name}: adding {contest_filter}") - #return f'{trainer_name} = {{\n .filter = {contest_filter}' return f'{match.group(0)}\n .filter = {contest_filter}' else: return match.group(0) diff --git a/migration_scripts/1.13/convert_compressed_files.py b/migration_scripts/1.13/convert_compressed_files.py new file mode 100644 index 000000000000..0ccb5d61c1ce --- /dev/null +++ b/migration_scripts/1.13/convert_compressed_files.py @@ -0,0 +1,75 @@ +import glob +import re +import os +from pathlib import Path + +if not os.path.exists("Makefile"): + print("Please run this script from your root folder.") + quit() + +primaryTileset_pattern = re.compile(r"(.*\"data/tilesets/primary/.+\.4bpp\.)lz(\".*)") +secondaryTileset_pattern = re.compile(r"(.*\"data/tilesets/secondary/.+\.4bpp\.)lz(\".*)") +tilemap_pattern = re.compile(r"(.*\"graphics/.+\.bin\.)(?:lz|rl)(\".*)") +lzuncomp_pattern = re.compile(r"(.*)\bLZ77UnComp([WV])ram\b(\(.*)") +lzdecomp_pattern = re.compile(r"(.*)\bLZDecompress([WV])ram\b(\(.*)") +rluncomp_pattern = re.compile(r"(.*)\bRLUnComp([WV])ram\b(\(.*)") + +def handle_file(fileInput): + fileTest = Path(fileInput) + if not fileTest.is_file(): + return False + allLines = list() + with open(fileInput, 'r', encoding='UTF-8') as file: + has_decompress_h = False + needs_decompress_h = False + + while line:=file.readline(): + if line.strip() == "#include \"decompress.h\"": + has_decompress_h = True + elif match := secondaryTileset_pattern.match(line): + line = match.group(1) + "fastSmol" + match.group(2) + "\n" + elif match := primaryTileset_pattern.match(line): + line = match.group(1) + "smol" + match.group(2) + "\n" + elif match := tilemap_pattern.match(line): + line = match.group(1) + "smolTM" + match.group(2) + "\n" + elif ".4bpp.lz" in line: + line = line.replace(".4bpp.lz", ".4bpp.smol") + elif ".4bpp.rl" in line: + line = line.replace(".4bpp.rl", ".4bpp.smol") + elif ".8bpp.lz" in line: + line = line.replace(".8bpp.lz", ".8bpp.smol") + elif ".8bpp.rl" in line: + line = line.replace(".8bpp.rl", ".8bpp.smol") + elif match := lzuncomp_pattern.match(line): + if allLines[-1].strip() != "case MODE_LZ77:": # do not modify DecompressDataWithHeader itself + line = match.group(1) + "DecompressDataWithHeader" + match.group(2) + "ram" + match.group(3) + "\n" + needs_decompress_h = True + elif match := lzdecomp_pattern.match(line): + line = match.group(1) + "DecompressDataWithHeader" + match.group(2) + "ram" + match.group(3) + "\n" + needs_decompress_h = True + elif match := rluncomp_pattern.match(line): + line = match.group(1) + "DecompressDataWithHeader" + match.group(2) + "ram" + match.group(3) + "\n" + needs_decompress_h = True + else: + pass + + allLines.append(line) + + if needs_decompress_h and not has_decompress_h: + # attempt to place the new header in alphabetical order + i = 0 + while not allLines[i].startswith("#include \"") or allLines[i] == "#include \"global.h\"\n": + i += 1 + while allLines[i].startswith("#include \"") and allLines[i] < "#include \"decompress.h\"\n": + i += 1 + allLines.insert(i, "#include \"decompress.h\"\n") + + with open(fileInput, 'w', encoding='UTF-8') as file: + for line in allLines: + file.write(line) + return True + +for path in glob.glob("src/**/*.c", recursive=True): + handle_file(path) +for path in glob.glob("src/**/*.h", recursive=True): + handle_file(path) diff --git a/migration_scripts/1.13/convert_trainers.py b/migration_scripts/1.13/convert_trainers.py new file mode 100644 index 000000000000..ba48f5465e41 --- /dev/null +++ b/migration_scripts/1.13/convert_trainers.py @@ -0,0 +1,401 @@ +import re +import sys +import os + +is_blank = re.compile(r'^[ \t]*(//.*)?$') + +begin_party_definition = re.compile(r'struct TrainerMon (\w+)\[\] =') +end_party_definition = re.compile(r'^ },') +begin_pokemon_definition = re.compile(r'^ { *$') +end_pokemon_definition = re.compile(r'^ },? *$') +level_definition = re.compile(r'\.lvl = (\d+)') +species_definition = re.compile(r'\.species = SPECIES_(\w+)') +gender_definition = re.compile(r'\.gender = TRAINER_MON_(\w+)') +nickname_definition = re.compile(r'\.nickname = COMPOUND_STRING\("([^"]+)"\)') +item_definition = re.compile(r'\.heldItem = ITEM_(\w+)') +ball_definition = re.compile(r'\.ball = ITEM_(\w+)') +ability_definition = re.compile(r'\.ability = ABILITY_(\w+)') +friendship_definition = re.compile(r'\.friendship = (\d+)') +shiny_definition = re.compile(r'\.isShiny = (\w+)') +ivs_definition = re.compile(r'\.iv = TRAINER_PARTY_IVS\(([0-9 ]+),([0-9 ]+),([0-9 ]+),([0-9 ]+),([0-9 ]+),([0-9 ]+)\)') +evs_definition = re.compile(r'\.ev = TRAINER_PARTY_EVS\(([0-9 ]+),([0-9 ]+),([0-9 ]+),([0-9 ]+),([0-9 ]+),([0-9 ]+)\)') +moves_definition = re.compile(r'\.moves = \{([^}]+)\}') +move_definition = re.compile(r'MOVE_(\w+)') +nature_definition = re.compile(r'NATURE_(\w+)') + +is_trainer_skip = re.compile(r'(const struct Trainer gTrainers\[\] = \{)|(^ \{$)|(\.partySize =)|(\.party = NULL)|(\.mugshotEnabled = TRUE)|(\};)') + +trainer_normal_definition = re.compile(r' \[DIFFICULTY_NORMAL\]\[(TRAINER_\w+)\] =') +trainer_easy_definition = re.compile(r' \[DIFFICULTY_EASY\]\[(TRAINER_\w+)\] =') +trainer_hard_definition = re.compile(r' \[DIFFICULTY_HARD\]\[(TRAINER_\w+)\] =') +end_pokemon_definition = re.compile(r' },') +trainer_class_definition = re.compile(r'\.trainerClass = TRAINER_CLASS_(\w+)') +encounter_music_gender_definition = re.compile(r'\.encounterMusic_gender = (F_TRAINER_FEMALE \| )?TRAINER_ENCOUNTER_MUSIC_(\w+)') +encounter_music_definition = re.compile(r'TRAINER_ENCOUNTER_MUSIC_(\w+)') +trainer_pic_definition = re.compile(r'\.trainerPic = TRAINER_PIC_(\w+)') +trainer_name_definition = re.compile(r'\.trainerName = _\("([^"]*)"\)') +trainer_items_definition = re.compile(r'\.items = \{([^}]*)\}') +trainer_item_definition = re.compile(r'ITEM_(\w+)') +trainer_double_battle_definition = re.compile(r'\.battleType = (\w+)') +trainer_ai_flags_definition = re.compile(r'\.aiFlags = (.*)') +trainer_ai_flag_definition = re.compile(r'AI_FLAG_(\w+)') +trainer_party_definition = re.compile(r'\.party = ') +trainer_mugshot_definition = re.compile(r'\.mugshotColor = MUGSHOT_COLOR_(\w+)') +trainer_starting_status_definition = re.compile(r'\.startingStatus = STARTING_STATUS_(\w+)') + +# NOTE: These are just for aesthetics, the Pokemon would still compile +# without them. +species_replacements = { + "CHIEN_PAO": "Chien-Pao", + "CHI_YU": "Chi-Yu", + "HAKAMO_O": "Hakamo-o", + "HO_OH": "Ho-Oh", + "JANGMO_O": "Jangmo-o", + "KOMMO_O": "Kommo-o", + "PORYGON_Z": "Porygon-Z", + "ROTOM_": "Rotom-", + "TING_LU": "Ting-Lu", + "TYPE_NULL": "Type: Null", + "WO_CHIEN": "Wo-Chien", + + "_ALOLAN": "-Alola", + "_AQUA_BREED": "-Aqua", + "_BATTLE_BOND": "-Bond", + "_BLAZE_BREED": "-Blaze", + "_CAP": "", + "_CLOAK": "", + "_COMBAT_BREED": "-Combat", + "_CROWED_SHIELD": "-Crowned", + "_CROWED_SWORD": "-Crowned", + "_DRIVE": "", + "_EAST_SEA": "-East", + "_FAMILY_OF_FOUR": "-Four", + "_FEMALE": "-F", + "_FLOWER": "", + "_GALARIAN": "-Galar", + "_GIGANTAMAX": "-Gmax", + "_HISUIAN": "-Hisui", + "_ICE_RIDER": "-Ice", + "_NOICE_FACE": "-Noice", + "_ORIGIN": "-Origin", + "_ORIGINAL_COLOR": "-Original", + "_PALDEAN": "-Paldea", + "_PLUMAGE": "", + "_POKE_BALL": "-Pokeball", + "_SHADOW_RIDER": "-Shadow", + "_STRIKE_STYLE": "-Style", + "_TOTEM": "-Totem", + "_ZEN_MODE": "-Zen", +} + +class_fixups = { + "Rs": "RS", +} + +pic_fixups = { + "Rs": "RS", +} + +pokemon_attribute_order = ['Level', 'Ability', 'IVs', 'EVs', 'Happiness', 'Shiny', 'Ball'] + +class Pokemon: + def __init__(self): + self.nickname = None + self.species = None + self.gender = None + self.item = None + self.nature = None + self.attributes = {} + self.attributes['IVs'] = "0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe" + self.moves = [] + + +class Trainer: + def __init__(self, id_): + self.id = id_ + self.class_ = None + self.encounter_music = None + self.gender = None + self.pic = None + self.name = None + self.items = [] + self.double_battle = None + self.ai_flags = None + self.mugshot = None + self.starting_status = None + self.party = None + self.difficulty = None + + +def write_tutorial(output): + output.write('/*\n') + output.write('Trainers and their parties defined with Competetive Syntax.\n') + output.write('Compatible with Pokemon Showdown exports.\n') + output.write('https://github.com/smogon/pokemon-showdown/blob/master/sim/TEAMS.md\n') + output.write('\n') + output.write('A trainer specification starts with "=== TRAINER_XXXX ==="\n') + output.write('and includes everything until the next line that starts with "==="\n') + output.write('or the file ends.\n') + output.write('\n') + output.write('A blank line is required between the trainer and their Pokemon\n') + output.write('and between their Pokemon.\n') + output.write('TRAINER_XXXX is how the trainer is referred to within code.\n') + output.write('Fields with description and/or example of usage\n') + output.write('Required fields for trainers:\n') + output.write(' - Name\n') + output.write(' - Pic\n') + output.write('Optional (but still recommended) fields for trainers:\n') + output.write(' - Class (if not specified, PkMn Trainer will be used)\n') + output.write(' - Gender (Male/Female, affects random gender weights of party if not specified)\n') + output.write(' - Music\n') + output.write(' - Items (Some Item / Another Item / Third Item)\n') + output.write(' (Can also be specified with ITEM_SOME_ITEM)\n') + output.write(' - Battle Type (Singles / Doubles, defaults to Singles)\n') + output.write(' - AI (Ai Flag / Another Flag / Third Flag / ...\n') + output.write(' see "constants/battle_ai.h" for all flags)\n') + output.write(' - Mugshot (enable Mugshots during battle transition\n') + output.write(' set to one of Purple, Green, Pink, Blue or Yellow)\n') + output.write(' - Starting Status (see include/constants/battle.h for values)\n') + output.write('\n') + output.write('Pokemon are then specified using the Showdown Export format.\n') + output.write("If a field is not specified, it will use it's default value.\n") + output.write("\n") + output.write('Required fields for Pokemon:\n') + output.write(' - Species (Either as SPECIES_ABRA or Abra)\n') + output.write(' This line also specifies Gender, Nickname and Held item.\n') + output.write(' Alfred (Abra) (M) @ Eviolite\n') + output.write(' Roberta (SPECIES_ABRA) (F) @ ITEM_CHOICE_SPECS\n') + output.write(' Both lines are valid. Gender (M) or (F) must use a capital letter.\n') + output.write(' Nickname length is limited to 10 characters using standard letters.\n') + output.write(" With narrow font it's increased to 12. Longer strings will be silently shortened.\n") + output.write('\n') + output.write('Optional fields for Pokemon:\n') + output.write(' - Level (Number between 1 and 100, defaults to 100)\n') + output.write(' - Ability (Ability Name or ABILITY_ABILITY_NAME)\n') + output.write(' - IVs (0 HP / 1 Atk / 2 Def / 3 SpA / 4 SpD / 5 Spe, defaults to all 31)\n') + output.write(' (Order does not matter)\n') + output.write(' - EVs (252 HP / 128 Spe / 48 Def, defaults to all 0, is not capped at 512 total)\n') + output.write(' (Order does not matter)\n') + output.write(' - Ball (Poke Ball or ITEM_POKE_BALL, defaults to Poke Ball)\n') + output.write(' - Happiness (Number between 1 and 255)\n') + output.write(' - Nature (Rash or NATURE_RASH, defaults to Hardy)\n') + output.write(' - Shiny (Yes/No, defaults to No)\n') + output.write(' - Dynamax Level (Number between 0 and 10, default 10, also sets "shouldDynamax" to True)\n') + output.write(' - Gigantamax (Yes/No, sets to Gigantamax factor)\n') + output.write(' (doesn\'t do anything to Pokemon without a Gigantamax form, also sets "shouldDynamax" to True)\n') + output.write(' - Tera Type (Set to a Type, either Fire or TYPE_FIRE, also sets "shouldTerastal" to True)\n') + output.write('Moves are defined with a - (dash) followed by a single space, then the move name.\n') + output.write('Either "- Tackle" or "- MOVE_TACKLE" works. One move per line.\n') + output.write('Moves have to be the last lines of a Pokemon.\n') + output.write('If no moves are specified, the Pokemon will use the last 4 moves it learns\n') + output.write('through levelup at its level.\n') + output.write("\n") + output.write('Default IVs and Level can be changed in the "main" function of tools/trainerproc/main.c\n') + output.write("\n") + output.write('This file is processed with a custom preprocessor.\n') + output.write('*/\n') + output.write("\n") + output.write('/*\n') + output.write('Comments can be added as C comment blocks\n') + output.write('// cannot be used as comments\n') + output.write('*/\n') + output.write("\n") + output.write('/*Comments can also be on a single line*/\n') + output.write("\n") + output.write("\n") + + + +def write_to_file(trainer, output): + output.write(f'=== {trainer.id} ===\n') + output.write(f'Name: {trainer.name}\n') + output.write(f'Class: {trainer.class_}\n') + output.write(f'Pic: {trainer.pic}\n') + output.write(f'Gender: {trainer.gender}\n') + output.write(f'Music: {trainer.encounter_music}\n') + if len(trainer.items) > 0: + output.write(f'Items: {trainer.items}\n') + output.write(f'Battle Type: {trainer.double_battle}\n') + if trainer.ai_flags is not None: + output.write(f'AI: {trainer.ai_flags}\n') + if trainer.mugshot: + output.write(f'Mugshot: {trainer.mugshot}\n') + if trainer.difficulty is not None: + output.write(f'Difficulty: {trainer.difficulty}\n') + + output.write(f'\n') + + for pokemon in trainer.party: + if pokemon.species is None: + continue + if pokemon.item is not None: + output.write(f'{pokemon.species} @ {pokemon.item}\n') + else: + output.write(f'{pokemon.species}\n') + # for key in pokemon.attributes: + for key in pokemon_attribute_order: + if key in pokemon.attributes: + output.write(f'{key}: {pokemon.attributes[key]}\n') + if pokemon.nature: + output.write(f'Nature: {pokemon.nature}\n') + for move in pokemon.moves: + output.write(f'- {move}\n') + output.write(f'\n') + + +def parse_trainers(content, output): + newlines = 0 + trainer = None + pokemon = None + party = [] + moves = [] + + write_tutorial(output) + + for line_no, line in enumerate(content, 1): + try: + line = line[:-1] + + # Trainer defition + if m := trainer_normal_definition.search(line): + if trainer is not None: + trainer.party = party + write_to_file(trainer, output) + trainer = None + party = [] + [id_] = m.groups() + trainer = Trainer(id_) + trainer.difficulty = None + trainer.gender = 'Male' + elif m := trainer_easy_definition.search(line): + if trainer is not None: + trainer.party = party + write_to_file(trainer, output) + trainer = None + party = [] + [id_] = m.groups() + trainer = Trainer(id_) + trainer.difficulty = "Easy" + trainer.gender = 'Male' + elif m := trainer_hard_definition.search(line): + if trainer is not None: + trainer.party = party + write_to_file(trainer, output) + trainer = None + party = [] + [id_] = m.groups() + trainer = Trainer(id_) + trainer.difficulty = "Hard" + trainer.gender = 'Male' + elif m := trainer_class_definition.search(line): + [class_] = m.groups() + class_ = class_.replace("_", " ").title() + for match, replacement in class_fixups.items(): + class_ = class_.replace(match, replacement) + trainer.class_ = class_ + elif m := encounter_music_gender_definition.search(line): + [is_female, music] = m.groups() + trainer.gender = 'Female' if is_female else 'Male' + trainer.encounter_music = music.replace("_", " ").title() + elif m := encounter_music_definition.search(line): + [music] = m.groups() + trainer.encounter_music = music.replace("_", " ").title() + elif "F_TRAINER_FEMALE" in line: + trainer.gender = 'Female' + elif m := trainer_pic_definition.search(line): + [pic] = m.groups() + pic = pic.replace("_", " ").title() + for match, replacement in pic_fixups.items(): + pic = pic.replace(match, replacement) + trainer.pic = pic + elif m := trainer_name_definition.search(line): + [name] = m.groups() + trainer.name = name + elif m := trainer_items_definition.search(line): + [items] = m.groups() + trainer.items = " / ".join(item.replace("_", " ").title() for item in trainer_item_definition.findall(items) if item != "NONE") + elif m := trainer_double_battle_definition.search(line): + [double_battle] = m.groups() + if double_battle == 'TRAINER_BATTLE_TYPE_DOUBLES': + trainer.double_battle = "Doubles" + elif double_battle == 'TRAINER_BATTLE_TYPE_SINGLES': + trainer.double_battle = "Singles" + elif m := trainer_ai_flags_definition.search(line): + [ai_flags] = m.groups() + trainer.ai_flags = " / ".join(ai_flag.replace("_", " ").title() for ai_flag in trainer_ai_flag_definition.findall(ai_flags)) + elif m := trainer_mugshot_definition.search(line): + [color] = m.groups() + trainer.mugshot = color.title() + elif m := trainer_starting_status_definition.search(line): + [starting_status] = m.groups() + trainer.starting_status = starting_status.replace("_", " ").title() + elif m := trainer_party_definition.search(line): + pokemon = Pokemon() + + # Party mons + elif end_pokemon_definition.search(line): + party.append(pokemon) + pokemon = Pokemon() + elif m := level_definition.search(line): + [level] = m.groups() + pokemon.attributes['Level'] = level + elif m := species_definition.search(line): + [species_] = m.groups() + for match, replacement in species_replacements.items(): + species_ = species_.replace(match, replacement) + pokemon.species = species_.replace("_", " ").title() + elif m := gender_definition.search(line): + [gender_] = m.groups() + if gender_ == 'MALE': + pokemon.gender = 'M' + elif gender_ == 'FEMALE': + pokemon.gender = 'F' + elif m := nickname_definition.search(line): + [nickname] = m.groups() + pokemon.nickname = nickname + elif m := item_definition.search(line): + [item_] = m.groups() + pokemon.item = item_.replace("_", " ").title() + elif m := ball_definition.search(line): + [ball] = m.groups() + pokemon.attributes['Ball'] = ball.replace("_", " ").title() + elif m := ability_definition.search(line): + [ability] = m.groups() + pokemon.attributes['Ability'] = ability.replace("_", " ").title() + elif m := friendship_definition.search(line): + [friendship] = m.groups() + pokemon.attributes['Happiness'] = friendship + elif m := shiny_definition.search(line): + [shiny] = m.groups() + if shiny == 'TRUE': + pokemon.attributes['Shiny'] = 'Yes' + elif shiny == 'FALSE': + pokemon.attributes['Shiny'] = 'No' + elif m := ivs_definition.search(line): + [hp, attack, defense, speed, special_attack, special_defense] = [stat.strip() for stat in m.groups()] + stats = {"HP": hp, "Atk": attack, "Def": defense, "SpA": special_attack, "SpD": special_defense, "Spe": speed} + pokemon.attributes['IVs'] = ' / '.join(f"{value} {key}" for key, value in stats.items()) + elif m := evs_definition.search(line): + [hp, attack, defense, speed, special_attack, special_defense] = [stat.strip() for stat in m.groups()] + stats = {"HP": hp, "Atk": attack, "Def": defense, "SpA": special_attack, "SpD": special_defense, "Spe": speed} + pokemon.attributes['EVs'] = ' / '.join(f"{value} {key}" for key, value in stats.items() if value != '0') + elif m := move_definition.search(line): + [move] = m.groups() + pokemon.moves.append(move.replace("_", " ").title()) + elif m := nature_definition.search(line): + [nature] = m.groups() + pokemon.nature = nature.replace("_", " ").title() + + except Exception as e: + print(f"{line_no}: {e}") + +if __name__ == '__main__': + try: + [argv0, trainers_in_path, out_path] = sys.argv + except: + print(f"usage: python3 {sys.argv[0]} ") + print("trainers.h path: src/data/trainers.h") + print("trainers.party output path: src/data/trainers.party") + else: + with open(trainers_in_path, "r") as source, open(out_path, 'w') as output: + parse_trainers(source, output) diff --git a/migration_scripts/1.14/bin_to_wav.py b/migration_scripts/1.14/bin_to_wav.py new file mode 100644 index 000000000000..499c7666e25c --- /dev/null +++ b/migration_scripts/1.14/bin_to_wav.py @@ -0,0 +1,301 @@ +#!/usr/bin/env python3 + +""" +Converts .bin audio files (GBA format) to .wav files. +Reads the binary format created by aif2pcm and generates WAV files +that will produce identical binaries when processed by wav2agb -b. +""" + +import struct +import sys +import os +from typing import Optional + +# Delta encoding table used for compression/decompression +# Matches the table in tools/aif2pcm/main.c +DELTA_ENCODING_TABLE = [ + 0, 1, 4, 9, 16, 25, 36, 49, + -64, -49, -36, -25, -16, -9, -4, -1, +] + + +def delta_decompress(compressed_data: bytes, expected_length: int) -> bytes: + """ + Decompress delta-encoded audio data. + + Delta compression format (from tools/aif2pcm/main.c): + - Data is organized in blocks of up to 64 samples each + - Each block starts with a base sample value (1 byte) + - Followed by a delta index (4 bits) for the second sample + - Then 31 pairs of delta indices (4 bits each, packed into bytes) + - Delta indices reference DELTA_ENCODING_TABLE to get the actual delta value + + Args: + compressed_data: The compressed audio data + expected_length: Expected length of decompressed data + + Returns: + Decompressed audio data as bytes + """ + pcm = bytearray(expected_length + 0x40) # Extra buffer space + + i = 0 # Input position + j = 0 # Output position + + while i < len(compressed_data) and j < expected_length: + # Read base sample for this block + base = compressed_data[i] + # Convert to signed int8 for calculations + base_signed = base if base < 128 else base - 256 + pcm[j] = base + i += 1 + j += 1 + + if i >= len(compressed_data) or j >= expected_length: + break + + # Read second sample using low nibble delta + lo = compressed_data[i] & 0xf + base_signed += DELTA_ENCODING_TABLE[lo] + pcm[j] = base_signed & 0xff + i += 1 + j += 1 + + if i >= len(compressed_data) or j >= expected_length: + break + + # Process up to 31 pairs of samples (62 samples total) + for k in range(31): + # High nibble + hi = (compressed_data[i] >> 4) & 0xf + base_signed += DELTA_ENCODING_TABLE[hi] + pcm[j] = base_signed & 0xff + j += 1 + + if j >= expected_length: + break + + # Low nibble + lo = compressed_data[i] & 0xf + base_signed += DELTA_ENCODING_TABLE[lo] + pcm[j] = base_signed & 0xff + j += 1 + i += 1 + + if i >= len(compressed_data): + break + if j >= expected_length: + break + + if j >= expected_length: + break + + return bytes(pcm[:j]) + + +def read_bin(bin_path: str) -> tuple: + """ + Read a GBA audio .bin file and extract all data. + + Binary format (little-endian): + - Bytes 0-3: flags (bit 0 = compression, bit 30 = loop enabled) + - Bytes 4-7: pitch value = sample_rate * 1024 + - Bytes 8-11: loop start position + - Bytes 12-15: loop end position (stored as actual_end - 1) + - Remaining bytes: audio samples (8-bit signed) + """ + with open(bin_path, 'rb') as f: + bin_data = f.read() + + if len(bin_data) < 16: + raise ValueError(f"File too small: {len(bin_data)} bytes") + + # Read header + flags = struct.unpack(' 0 else 0 + padding = bytes([last_sample] * (expected_num_samples - len(samples))) + samples = samples + padding + else: + # For uncompressed data, only read expected_num_samples + # (ignore any trailing alignment padding in the .bin file) + samples = compressed_data[:expected_num_samples] + + # For loop_end, use the expected number from the header + # This matches aif2pcm's behavior where the COMM chunk has the expected count + # even if the actual SSND data is shorter + loop_end = expected_num_samples if is_looped else 0 + + return sample_rate, is_looped, loop_start, loop_end, samples + + +def write_wav(wav_path: str, sample_rate: float, is_looped: bool, + loop_start: int, loop_end: int, samples: bytes): + """ + Write a .wav file with smpl chunk. + """ + # WAV uses unsigned 8-bit, GBA bin uses signed 8-bit + # Convert signed (-128 to +127) to unsigned (0 to 255) + samples_unsigned = bytes((b + 128) & 0xFF for b in samples) + + # For WAV fmt chunk, use integer sample rate + sample_rate_int = int(sample_rate) + num_channels = 1 + bytes_per_sample = 1 + bits_per_sample = 8 + byte_rate = sample_rate_int * num_channels * bytes_per_sample + block_align = num_channels * bytes_per_sample + + # Build fmt chunk + fmt_chunk = struct.pack(' {wav_path}") + + sample_rate, is_looped, loop_start, loop_end, samples = read_bin(bin_path) + + print(f" Sample rate: {sample_rate} Hz") + print(f" Num samples: {len(samples)}") + if is_looped: + print(f" Loop: {loop_start} -> {loop_end}") + else: + print(f" Loop: None") + + write_wav(wav_path, sample_rate, is_looped, loop_start, loop_end, samples) + print(f" Done!") + + +def main(): + if len(sys.argv) < 2: + print("Usage: bin_to_wav.py [output.wav]") + print(" or: bin_to_wav.py (converts all .bin files in directory)") + sys.exit(1) + + input_path = sys.argv[1] + + if os.path.isdir(input_path): + # Convert all .bin files in directory + for filename in sorted(os.listdir(input_path)): + if filename.lower().endswith('.bin'): + bin_path = os.path.join(input_path, filename) + convert_bin_to_wav(bin_path) + else: + # Convert single file + output_path = sys.argv[2] if len(sys.argv) > 2 else None + convert_bin_to_wav(input_path, output_path) + + +if __name__ == '__main__': + main() diff --git a/migration_scripts/1.14/consolidate_contest_effects.py b/migration_scripts/1.14/consolidate_contest_effects.py new file mode 100644 index 000000000000..b517a45d2c0e --- /dev/null +++ b/migration_scripts/1.14/consolidate_contest_effects.py @@ -0,0 +1,44 @@ +import glob +import re +import os + +if not os.path.exists("Makefile"): + print("Please run this script from your root folder.") + quit() + +# Read contest.c and extract the party information +for file in glob.glob('./src/contest.c'): + with open(file, 'r') as f: + source_content = f.read() + +# Extract party info from contest.c +source_pattern = re.compile(r'(\[CONTEST_EFFECT_.*\])\s*=\s(COMPOUND_STRING.*),') +source_data = {} +for match in source_pattern.findall(source_content): + if len(match) == 2: + contest_effect, effect_description = match + source_data[contest_effect] = (effect_description) + +# Read contest_moves.h content +for file in glob.glob('./src/data/contest_moves.h'): + with open(file, 'r') as f: + destination_content = f.read() + +# Modify contest_moves.h content +def add_description(match): + contest_effect = match.group(1) + if contest_effect in source_data: + effect_description = source_data[contest_effect] + print(f"Updating {contest_effect}: adding {effect_description}") + return f"{match.group(0)}\n .description = {effect_description}," + else: + return match.group(0) + +destination_pattern = re.compile(r'(\[CONTEST_EFFECT_.*\]) =\s*\n\s*{') +modified_content = destination_pattern.sub(add_description, destination_content) + +# Write the modified content back to contest_moves.h +for file in glob.glob('./src/data/contest_moves.h'): + with open(file, 'w') as f: + f.write(modified_content) + print("contest_moves.h has been updated") diff --git a/migration_scripts/add_time_based_encounters.py b/migration_scripts/add_time_based_encounters.py index aebdafc2b2ad..b036e46e41de 100644 --- a/migration_scripts/add_time_based_encounters.py +++ b/migration_scripts/add_time_based_encounters.py @@ -7,7 +7,7 @@ print("Please run this script from the project's root folder.") quit() sys.path.append("./tools/wild_encounters/") - from wild_encounters_to_header import TimeOfDay, SetupUserTimeEnum + from wild_encounters_to_header import Config except ImportError: print("Could not import the file tools/wild_encounters/wild_encounters_to_header.py") quit() @@ -24,11 +24,13 @@ def GetWildEncounterFile(): print("Please run this script from the project's root folder.") quit() - timeOfDay = SetupUserTimeEnum(TimeOfDay()) - wFile = open("src/data/wild_encounters.json") wData = json.load(wFile) + config = Config('include/config/overworld.h', 'include/constants/rtc.h', wData) + timeOfDay = config.times_of_day + + wBackupData = json.dumps(wData, indent=2) wBackupFile = open("src/data/wild_encounters.json.bak", mode="w", encoding="utf-8") wBackupFile.write(wBackupData) @@ -49,7 +51,7 @@ def GetWildEncounterFile(): wEncounters_New = list() for map in wEncounters: - for suffix in timeOfDay.fvals: + for suffix in timeOfDay.values(): tempSuffix = "_" + suffix if tempSuffix in map["base_label"]: editMap = False @@ -59,7 +61,7 @@ def GetWildEncounterFile(): if editMap: k = 0 - for suffix in timeOfDay.fvals: + for suffix in timeOfDay.values(): tempDict = dict() if k == TIME_OF_DAY_DEFAULT or COPY_FULL_ENCOUNTER: tempDict = map.copy() diff --git a/sound/direct_sound_data.inc b/sound/direct_sound_data.inc index 0e4980667c6b..6b345df53cc4 100644 --- a/sound/direct_sound_data.inc +++ b/sound/direct_sound_data.inc @@ -6172,6 +6172,64 @@ DirectSoundWaveData_sc88pro_nylon_str_guitar:: DirectSoundWaveData_sd90_special_scream_drive:: .incbin "sound/direct_sound_samples/sd90_special_scream_drive.bin" + +.if PHONEMES_SHARED == TRUE + .align 2 +DirectSoundWaveData_Phoneme_1:: +DirectSoundWaveData_Phoneme_2:: +DirectSoundWaveData_Phoneme_3:: +DirectSoundWaveData_Phoneme_4:: +DirectSoundWaveData_Phoneme_5:: +DirectSoundWaveData_Phoneme_6:: +DirectSoundWaveData_Phoneme_7:: +DirectSoundWaveData_Phoneme_8:: +DirectSoundWaveData_Phoneme_9:: +DirectSoundWaveData_Phoneme_10:: +DirectSoundWaveData_Phoneme_11:: +DirectSoundWaveData_Phoneme_12:: +DirectSoundWaveData_Phoneme_13:: +DirectSoundWaveData_Phoneme_14:: +DirectSoundWaveData_Phoneme_15:: +DirectSoundWaveData_Phoneme_16:: +DirectSoundWaveData_Phoneme_17:: +DirectSoundWaveData_Phoneme_18:: +DirectSoundWaveData_Phoneme_19:: +DirectSoundWaveData_Phoneme_20:: +DirectSoundWaveData_Phoneme_21:: +DirectSoundWaveData_Phoneme_22:: +DirectSoundWaveData_Phoneme_23:: +DirectSoundWaveData_Phoneme_24:: +DirectSoundWaveData_Phoneme_25:: +DirectSoundWaveData_Phoneme_26:: +DirectSoundWaveData_Phoneme_27:: +DirectSoundWaveData_Phoneme_28:: +DirectSoundWaveData_Phoneme_29:: +DirectSoundWaveData_Phoneme_30:: +DirectSoundWaveData_Phoneme_31:: +DirectSoundWaveData_Phoneme_32:: +DirectSoundWaveData_Phoneme_33:: +DirectSoundWaveData_Phoneme_34:: +DirectSoundWaveData_Phoneme_35:: +DirectSoundWaveData_Phoneme_36:: +DirectSoundWaveData_Phoneme_37:: +DirectSoundWaveData_Phoneme_38:: +DirectSoundWaveData_Phoneme_39:: +DirectSoundWaveData_Phoneme_40:: +DirectSoundWaveData_Phoneme_41:: +DirectSoundWaveData_Phoneme_42:: +DirectSoundWaveData_Phoneme_43:: +DirectSoundWaveData_Phoneme_44:: +DirectSoundWaveData_Phoneme_45:: +DirectSoundWaveData_Phoneme_46:: +DirectSoundWaveData_Phoneme_47:: +DirectSoundWaveData_Phoneme_48:: +DirectSoundWaveData_Phoneme_49:: +DirectSoundWaveData_Phoneme_50:: +DirectSoundWaveData_Phoneme_51:: + .incbin "sound/direct_sound_samples/phonemes/shared.bin" + +.else @ PHONEMES_SHARED + .align 2 DirectSoundWaveData_Phoneme_1:: .incbin "sound/direct_sound_samples/phonemes/01.bin" @@ -6376,6 +6434,8 @@ DirectSoundWaveData_Phoneme_50:: DirectSoundWaveData_Phoneme_51:: .incbin "sound/direct_sound_samples/phonemes/51.bin" +.endif @ PHONEMES_SHARED + .align 2 DirectSoundWaveData_sc88pro_accordion_duplicate:: .incbin "sound/direct_sound_samples/sc88pro_accordion_duplicate.bin" diff --git a/sound/direct_sound_samples/bicycle_bell.aif b/sound/direct_sound_samples/bicycle_bell.aif deleted file mode 100644 index 578a81c2f1e9..000000000000 Binary files a/sound/direct_sound_samples/bicycle_bell.aif and /dev/null differ diff --git a/sound/direct_sound_samples/bicycle_bell.wav b/sound/direct_sound_samples/bicycle_bell.wav new file mode 100644 index 000000000000..92f9634069d2 Binary files /dev/null and b/sound/direct_sound_samples/bicycle_bell.wav differ diff --git a/sound/direct_sound_samples/classical_choir_voice_ahhs.aif b/sound/direct_sound_samples/classical_choir_voice_ahhs.aif deleted file mode 100644 index e8784682e475..000000000000 Binary files a/sound/direct_sound_samples/classical_choir_voice_ahhs.aif and /dev/null differ diff --git a/sound/direct_sound_samples/classical_choir_voice_ahhs.wav b/sound/direct_sound_samples/classical_choir_voice_ahhs.wav new file mode 100644 index 000000000000..7e38d3a3f7b2 Binary files /dev/null and b/sound/direct_sound_samples/classical_choir_voice_ahhs.wav differ diff --git a/sound/direct_sound_samples/cries/abomasnow.aif b/sound/direct_sound_samples/cries/abomasnow.aif deleted file mode 100644 index 83ef6b33aca9..000000000000 Binary files a/sound/direct_sound_samples/cries/abomasnow.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/abomasnow.wav b/sound/direct_sound_samples/cries/abomasnow.wav new file mode 100644 index 000000000000..a403166d2cde Binary files /dev/null and b/sound/direct_sound_samples/cries/abomasnow.wav differ diff --git a/sound/direct_sound_samples/cries/abomasnow_mega.aif b/sound/direct_sound_samples/cries/abomasnow_mega.aif deleted file mode 100644 index 1b6b0684cf76..000000000000 Binary files a/sound/direct_sound_samples/cries/abomasnow_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/abomasnow_mega.wav b/sound/direct_sound_samples/cries/abomasnow_mega.wav new file mode 100644 index 000000000000..6d825e530186 Binary files /dev/null and b/sound/direct_sound_samples/cries/abomasnow_mega.wav differ diff --git a/sound/direct_sound_samples/cries/abra.aif b/sound/direct_sound_samples/cries/abra.aif deleted file mode 100644 index 5c96619143a0..000000000000 Binary files a/sound/direct_sound_samples/cries/abra.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/abra.wav b/sound/direct_sound_samples/cries/abra.wav new file mode 100644 index 000000000000..14aba2d7a52e Binary files /dev/null and b/sound/direct_sound_samples/cries/abra.wav differ diff --git a/sound/direct_sound_samples/cries/absol.aif b/sound/direct_sound_samples/cries/absol.aif deleted file mode 100644 index 81e81350d5e6..000000000000 Binary files a/sound/direct_sound_samples/cries/absol.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/absol.wav b/sound/direct_sound_samples/cries/absol.wav new file mode 100644 index 000000000000..4a90ec5c0143 Binary files /dev/null and b/sound/direct_sound_samples/cries/absol.wav differ diff --git a/sound/direct_sound_samples/cries/absol_mega.aif b/sound/direct_sound_samples/cries/absol_mega.aif deleted file mode 100644 index 415b6132f61a..000000000000 Binary files a/sound/direct_sound_samples/cries/absol_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/absol_mega.wav b/sound/direct_sound_samples/cries/absol_mega.wav new file mode 100644 index 000000000000..59ce8447a137 Binary files /dev/null and b/sound/direct_sound_samples/cries/absol_mega.wav differ diff --git a/sound/direct_sound_samples/cries/accelgor.aif b/sound/direct_sound_samples/cries/accelgor.aif deleted file mode 100644 index 209c309c1efb..000000000000 Binary files a/sound/direct_sound_samples/cries/accelgor.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/accelgor.wav b/sound/direct_sound_samples/cries/accelgor.wav new file mode 100644 index 000000000000..09d3b0bc7742 Binary files /dev/null and b/sound/direct_sound_samples/cries/accelgor.wav differ diff --git a/sound/direct_sound_samples/cries/aegislash.aif b/sound/direct_sound_samples/cries/aegislash.aif deleted file mode 100644 index d2c48b5d6213..000000000000 Binary files a/sound/direct_sound_samples/cries/aegislash.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/aegislash.wav b/sound/direct_sound_samples/cries/aegislash.wav new file mode 100644 index 000000000000..33a16719479a Binary files /dev/null and b/sound/direct_sound_samples/cries/aegislash.wav differ diff --git a/sound/direct_sound_samples/cries/aerodactyl.aif b/sound/direct_sound_samples/cries/aerodactyl.aif deleted file mode 100644 index d4bf14946de2..000000000000 Binary files a/sound/direct_sound_samples/cries/aerodactyl.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/aerodactyl.wav b/sound/direct_sound_samples/cries/aerodactyl.wav new file mode 100644 index 000000000000..95518884b9dd Binary files /dev/null and b/sound/direct_sound_samples/cries/aerodactyl.wav differ diff --git a/sound/direct_sound_samples/cries/aerodactyl_mega.aif b/sound/direct_sound_samples/cries/aerodactyl_mega.aif deleted file mode 100644 index d323b09c593f..000000000000 Binary files a/sound/direct_sound_samples/cries/aerodactyl_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/aerodactyl_mega.wav b/sound/direct_sound_samples/cries/aerodactyl_mega.wav new file mode 100644 index 000000000000..2c6d876529c4 Binary files /dev/null and b/sound/direct_sound_samples/cries/aerodactyl_mega.wav differ diff --git a/sound/direct_sound_samples/cries/aggron.aif b/sound/direct_sound_samples/cries/aggron.aif deleted file mode 100644 index a87adf8f841f..000000000000 Binary files a/sound/direct_sound_samples/cries/aggron.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/aggron.wav b/sound/direct_sound_samples/cries/aggron.wav new file mode 100644 index 000000000000..bc75b2dbdd38 Binary files /dev/null and b/sound/direct_sound_samples/cries/aggron.wav differ diff --git a/sound/direct_sound_samples/cries/aggron_mega.aif b/sound/direct_sound_samples/cries/aggron_mega.aif deleted file mode 100644 index 6772bdd5ee80..000000000000 Binary files a/sound/direct_sound_samples/cries/aggron_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/aggron_mega.wav b/sound/direct_sound_samples/cries/aggron_mega.wav new file mode 100644 index 000000000000..b679811f299e Binary files /dev/null and b/sound/direct_sound_samples/cries/aggron_mega.wav differ diff --git a/sound/direct_sound_samples/cries/aipom.aif b/sound/direct_sound_samples/cries/aipom.aif deleted file mode 100644 index e40107f78709..000000000000 Binary files a/sound/direct_sound_samples/cries/aipom.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/aipom.wav b/sound/direct_sound_samples/cries/aipom.wav new file mode 100644 index 000000000000..4d7bc829cd73 Binary files /dev/null and b/sound/direct_sound_samples/cries/aipom.wav differ diff --git a/sound/direct_sound_samples/cries/alakazam.aif b/sound/direct_sound_samples/cries/alakazam.aif deleted file mode 100644 index d6b0126112a5..000000000000 Binary files a/sound/direct_sound_samples/cries/alakazam.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/alakazam.wav b/sound/direct_sound_samples/cries/alakazam.wav new file mode 100644 index 000000000000..f397363d1535 Binary files /dev/null and b/sound/direct_sound_samples/cries/alakazam.wav differ diff --git a/sound/direct_sound_samples/cries/alakazam_mega.aif b/sound/direct_sound_samples/cries/alakazam_mega.aif deleted file mode 100644 index be09f22777fa..000000000000 Binary files a/sound/direct_sound_samples/cries/alakazam_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/alakazam_mega.wav b/sound/direct_sound_samples/cries/alakazam_mega.wav new file mode 100644 index 000000000000..1b33bbe6461f Binary files /dev/null and b/sound/direct_sound_samples/cries/alakazam_mega.wav differ diff --git a/sound/direct_sound_samples/cries/alcremie.aif b/sound/direct_sound_samples/cries/alcremie.aif deleted file mode 100644 index 4819688a6ddb..000000000000 Binary files a/sound/direct_sound_samples/cries/alcremie.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/alcremie.wav b/sound/direct_sound_samples/cries/alcremie.wav new file mode 100644 index 000000000000..64870763a7fe Binary files /dev/null and b/sound/direct_sound_samples/cries/alcremie.wav differ diff --git a/sound/direct_sound_samples/cries/alomomola.aif b/sound/direct_sound_samples/cries/alomomola.aif deleted file mode 100644 index 2e47a4083ae5..000000000000 Binary files a/sound/direct_sound_samples/cries/alomomola.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/alomomola.wav b/sound/direct_sound_samples/cries/alomomola.wav new file mode 100644 index 000000000000..8b06465e2e9e Binary files /dev/null and b/sound/direct_sound_samples/cries/alomomola.wav differ diff --git a/sound/direct_sound_samples/cries/altaria.aif b/sound/direct_sound_samples/cries/altaria.aif deleted file mode 100644 index 0aa89c8fcba7..000000000000 Binary files a/sound/direct_sound_samples/cries/altaria.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/altaria.wav b/sound/direct_sound_samples/cries/altaria.wav new file mode 100644 index 000000000000..ca35cbf5194d Binary files /dev/null and b/sound/direct_sound_samples/cries/altaria.wav differ diff --git a/sound/direct_sound_samples/cries/altaria_mega.aif b/sound/direct_sound_samples/cries/altaria_mega.aif deleted file mode 100644 index bf2a7daec235..000000000000 Binary files a/sound/direct_sound_samples/cries/altaria_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/altaria_mega.wav b/sound/direct_sound_samples/cries/altaria_mega.wav new file mode 100644 index 000000000000..1ddbcc6aff91 Binary files /dev/null and b/sound/direct_sound_samples/cries/altaria_mega.wav differ diff --git a/sound/direct_sound_samples/cries/amaura.aif b/sound/direct_sound_samples/cries/amaura.aif deleted file mode 100644 index 813fcadddede..000000000000 Binary files a/sound/direct_sound_samples/cries/amaura.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/amaura.wav b/sound/direct_sound_samples/cries/amaura.wav new file mode 100644 index 000000000000..cdd5ce160a01 Binary files /dev/null and b/sound/direct_sound_samples/cries/amaura.wav differ diff --git a/sound/direct_sound_samples/cries/ambipom.aif b/sound/direct_sound_samples/cries/ambipom.aif deleted file mode 100644 index a767329e07ed..000000000000 Binary files a/sound/direct_sound_samples/cries/ambipom.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ambipom.wav b/sound/direct_sound_samples/cries/ambipom.wav new file mode 100644 index 000000000000..fc63ee7011f1 Binary files /dev/null and b/sound/direct_sound_samples/cries/ambipom.wav differ diff --git a/sound/direct_sound_samples/cries/amoonguss.aif b/sound/direct_sound_samples/cries/amoonguss.aif deleted file mode 100644 index d476e670bd61..000000000000 Binary files a/sound/direct_sound_samples/cries/amoonguss.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/amoonguss.wav b/sound/direct_sound_samples/cries/amoonguss.wav new file mode 100644 index 000000000000..e472803369db Binary files /dev/null and b/sound/direct_sound_samples/cries/amoonguss.wav differ diff --git a/sound/direct_sound_samples/cries/ampharos.aif b/sound/direct_sound_samples/cries/ampharos.aif deleted file mode 100644 index 7eed0aa9f6b9..000000000000 Binary files a/sound/direct_sound_samples/cries/ampharos.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ampharos.wav b/sound/direct_sound_samples/cries/ampharos.wav new file mode 100644 index 000000000000..346b2aa48bfc Binary files /dev/null and b/sound/direct_sound_samples/cries/ampharos.wav differ diff --git a/sound/direct_sound_samples/cries/ampharos_mega.aif b/sound/direct_sound_samples/cries/ampharos_mega.aif deleted file mode 100644 index e24e62866776..000000000000 Binary files a/sound/direct_sound_samples/cries/ampharos_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ampharos_mega.wav b/sound/direct_sound_samples/cries/ampharos_mega.wav new file mode 100644 index 000000000000..284a01fba257 Binary files /dev/null and b/sound/direct_sound_samples/cries/ampharos_mega.wav differ diff --git a/sound/direct_sound_samples/cries/annihilape.aif b/sound/direct_sound_samples/cries/annihilape.aif deleted file mode 100644 index 889c5219296b..000000000000 Binary files a/sound/direct_sound_samples/cries/annihilape.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/annihilape.wav b/sound/direct_sound_samples/cries/annihilape.wav new file mode 100644 index 000000000000..c0232220b936 Binary files /dev/null and b/sound/direct_sound_samples/cries/annihilape.wav differ diff --git a/sound/direct_sound_samples/cries/anorith.aif b/sound/direct_sound_samples/cries/anorith.aif deleted file mode 100644 index ac6c774e5da6..000000000000 Binary files a/sound/direct_sound_samples/cries/anorith.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/anorith.wav b/sound/direct_sound_samples/cries/anorith.wav new file mode 100644 index 000000000000..349ffacf0464 Binary files /dev/null and b/sound/direct_sound_samples/cries/anorith.wav differ diff --git a/sound/direct_sound_samples/cries/appletun.aif b/sound/direct_sound_samples/cries/appletun.aif deleted file mode 100644 index 46b6ab4fccf4..000000000000 Binary files a/sound/direct_sound_samples/cries/appletun.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/appletun.wav b/sound/direct_sound_samples/cries/appletun.wav new file mode 100644 index 000000000000..4cf9d895b2e4 Binary files /dev/null and b/sound/direct_sound_samples/cries/appletun.wav differ diff --git a/sound/direct_sound_samples/cries/applin.aif b/sound/direct_sound_samples/cries/applin.aif deleted file mode 100644 index 9e9a1de275d0..000000000000 Binary files a/sound/direct_sound_samples/cries/applin.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/applin.wav b/sound/direct_sound_samples/cries/applin.wav new file mode 100644 index 000000000000..55de4865de25 Binary files /dev/null and b/sound/direct_sound_samples/cries/applin.wav differ diff --git a/sound/direct_sound_samples/cries/araquanid.aif b/sound/direct_sound_samples/cries/araquanid.aif deleted file mode 100644 index 86aac62b8002..000000000000 Binary files a/sound/direct_sound_samples/cries/araquanid.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/araquanid.wav b/sound/direct_sound_samples/cries/araquanid.wav new file mode 100644 index 000000000000..9c92577b4bc0 Binary files /dev/null and b/sound/direct_sound_samples/cries/araquanid.wav differ diff --git a/sound/direct_sound_samples/cries/arbok.aif b/sound/direct_sound_samples/cries/arbok.aif deleted file mode 100644 index 0be4b7e62464..000000000000 Binary files a/sound/direct_sound_samples/cries/arbok.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/arbok.wav b/sound/direct_sound_samples/cries/arbok.wav new file mode 100644 index 000000000000..cebc9e3e56f9 Binary files /dev/null and b/sound/direct_sound_samples/cries/arbok.wav differ diff --git a/sound/direct_sound_samples/cries/arboliva.aif b/sound/direct_sound_samples/cries/arboliva.aif deleted file mode 100644 index 641491ff0e89..000000000000 Binary files a/sound/direct_sound_samples/cries/arboliva.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/arboliva.wav b/sound/direct_sound_samples/cries/arboliva.wav new file mode 100644 index 000000000000..c4ddb922d8a2 Binary files /dev/null and b/sound/direct_sound_samples/cries/arboliva.wav differ diff --git a/sound/direct_sound_samples/cries/arcanine.aif b/sound/direct_sound_samples/cries/arcanine.aif deleted file mode 100644 index cdc942c49ab2..000000000000 Binary files a/sound/direct_sound_samples/cries/arcanine.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/arcanine.wav b/sound/direct_sound_samples/cries/arcanine.wav new file mode 100644 index 000000000000..f6e3e3680192 Binary files /dev/null and b/sound/direct_sound_samples/cries/arcanine.wav differ diff --git a/sound/direct_sound_samples/cries/arceus.aif b/sound/direct_sound_samples/cries/arceus.aif deleted file mode 100644 index 8496de2a173b..000000000000 Binary files a/sound/direct_sound_samples/cries/arceus.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/arceus.wav b/sound/direct_sound_samples/cries/arceus.wav new file mode 100644 index 000000000000..5a33b4168be7 Binary files /dev/null and b/sound/direct_sound_samples/cries/arceus.wav differ diff --git a/sound/direct_sound_samples/cries/archaludon.aif b/sound/direct_sound_samples/cries/archaludon.aif deleted file mode 100644 index 470afe8348a9..000000000000 Binary files a/sound/direct_sound_samples/cries/archaludon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/archaludon.wav b/sound/direct_sound_samples/cries/archaludon.wav new file mode 100644 index 000000000000..7195a6aa005e Binary files /dev/null and b/sound/direct_sound_samples/cries/archaludon.wav differ diff --git a/sound/direct_sound_samples/cries/archen.aif b/sound/direct_sound_samples/cries/archen.aif deleted file mode 100644 index b1b2be3eadcc..000000000000 Binary files a/sound/direct_sound_samples/cries/archen.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/archen.wav b/sound/direct_sound_samples/cries/archen.wav new file mode 100644 index 000000000000..05817f66331d Binary files /dev/null and b/sound/direct_sound_samples/cries/archen.wav differ diff --git a/sound/direct_sound_samples/cries/archeops.aif b/sound/direct_sound_samples/cries/archeops.aif deleted file mode 100644 index 6555f0ce3a39..000000000000 Binary files a/sound/direct_sound_samples/cries/archeops.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/archeops.wav b/sound/direct_sound_samples/cries/archeops.wav new file mode 100644 index 000000000000..e79d66625c39 Binary files /dev/null and b/sound/direct_sound_samples/cries/archeops.wav differ diff --git a/sound/direct_sound_samples/cries/arctibax.aif b/sound/direct_sound_samples/cries/arctibax.aif deleted file mode 100644 index a18bc7808104..000000000000 Binary files a/sound/direct_sound_samples/cries/arctibax.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/arctibax.wav b/sound/direct_sound_samples/cries/arctibax.wav new file mode 100644 index 000000000000..75bce7bca510 Binary files /dev/null and b/sound/direct_sound_samples/cries/arctibax.wav differ diff --git a/sound/direct_sound_samples/cries/arctovish.aif b/sound/direct_sound_samples/cries/arctovish.aif deleted file mode 100644 index 281c88f8d322..000000000000 Binary files a/sound/direct_sound_samples/cries/arctovish.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/arctovish.wav b/sound/direct_sound_samples/cries/arctovish.wav new file mode 100644 index 000000000000..6888758c3f21 Binary files /dev/null and b/sound/direct_sound_samples/cries/arctovish.wav differ diff --git a/sound/direct_sound_samples/cries/arctozolt.aif b/sound/direct_sound_samples/cries/arctozolt.aif deleted file mode 100644 index 3d0bb582648f..000000000000 Binary files a/sound/direct_sound_samples/cries/arctozolt.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/arctozolt.wav b/sound/direct_sound_samples/cries/arctozolt.wav new file mode 100644 index 000000000000..fafc0a59fbab Binary files /dev/null and b/sound/direct_sound_samples/cries/arctozolt.wav differ diff --git a/sound/direct_sound_samples/cries/ariados.aif b/sound/direct_sound_samples/cries/ariados.aif deleted file mode 100644 index 343879d70a28..000000000000 Binary files a/sound/direct_sound_samples/cries/ariados.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ariados.wav b/sound/direct_sound_samples/cries/ariados.wav new file mode 100644 index 000000000000..f059bcfc9302 Binary files /dev/null and b/sound/direct_sound_samples/cries/ariados.wav differ diff --git a/sound/direct_sound_samples/cries/armaldo.aif b/sound/direct_sound_samples/cries/armaldo.aif deleted file mode 100644 index 23add2fec8dd..000000000000 Binary files a/sound/direct_sound_samples/cries/armaldo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/armaldo.wav b/sound/direct_sound_samples/cries/armaldo.wav new file mode 100644 index 000000000000..de11795664ab Binary files /dev/null and b/sound/direct_sound_samples/cries/armaldo.wav differ diff --git a/sound/direct_sound_samples/cries/armarouge.aif b/sound/direct_sound_samples/cries/armarouge.aif deleted file mode 100644 index 578c73392b41..000000000000 Binary files a/sound/direct_sound_samples/cries/armarouge.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/armarouge.wav b/sound/direct_sound_samples/cries/armarouge.wav new file mode 100644 index 000000000000..bd891fe53623 Binary files /dev/null and b/sound/direct_sound_samples/cries/armarouge.wav differ diff --git a/sound/direct_sound_samples/cries/aromatisse.aif b/sound/direct_sound_samples/cries/aromatisse.aif deleted file mode 100644 index 4880d14946b0..000000000000 Binary files a/sound/direct_sound_samples/cries/aromatisse.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/aromatisse.wav b/sound/direct_sound_samples/cries/aromatisse.wav new file mode 100644 index 000000000000..bcfb43e6dc77 Binary files /dev/null and b/sound/direct_sound_samples/cries/aromatisse.wav differ diff --git a/sound/direct_sound_samples/cries/aron.aif b/sound/direct_sound_samples/cries/aron.aif deleted file mode 100644 index d246b4c22b04..000000000000 Binary files a/sound/direct_sound_samples/cries/aron.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/aron.wav b/sound/direct_sound_samples/cries/aron.wav new file mode 100644 index 000000000000..35c69f8dc454 Binary files /dev/null and b/sound/direct_sound_samples/cries/aron.wav differ diff --git a/sound/direct_sound_samples/cries/arrokuda.aif b/sound/direct_sound_samples/cries/arrokuda.aif deleted file mode 100644 index 863b6d2fb52b..000000000000 Binary files a/sound/direct_sound_samples/cries/arrokuda.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/arrokuda.wav b/sound/direct_sound_samples/cries/arrokuda.wav new file mode 100644 index 000000000000..c5b040c87ab0 Binary files /dev/null and b/sound/direct_sound_samples/cries/arrokuda.wav differ diff --git a/sound/direct_sound_samples/cries/articuno.aif b/sound/direct_sound_samples/cries/articuno.aif deleted file mode 100644 index 212114537f43..000000000000 Binary files a/sound/direct_sound_samples/cries/articuno.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/articuno.wav b/sound/direct_sound_samples/cries/articuno.wav new file mode 100644 index 000000000000..348fbcd2f046 Binary files /dev/null and b/sound/direct_sound_samples/cries/articuno.wav differ diff --git a/sound/direct_sound_samples/cries/audino.aif b/sound/direct_sound_samples/cries/audino.aif deleted file mode 100644 index 873d4c947b91..000000000000 Binary files a/sound/direct_sound_samples/cries/audino.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/audino.wav b/sound/direct_sound_samples/cries/audino.wav new file mode 100644 index 000000000000..fc2fb1283d5b Binary files /dev/null and b/sound/direct_sound_samples/cries/audino.wav differ diff --git a/sound/direct_sound_samples/cries/audino_mega.aif b/sound/direct_sound_samples/cries/audino_mega.aif deleted file mode 100644 index 04d815001e76..000000000000 Binary files a/sound/direct_sound_samples/cries/audino_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/audino_mega.wav b/sound/direct_sound_samples/cries/audino_mega.wav new file mode 100644 index 000000000000..5cf86197066f Binary files /dev/null and b/sound/direct_sound_samples/cries/audino_mega.wav differ diff --git a/sound/direct_sound_samples/cries/aurorus.aif b/sound/direct_sound_samples/cries/aurorus.aif deleted file mode 100644 index 9483e1b6371b..000000000000 Binary files a/sound/direct_sound_samples/cries/aurorus.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/aurorus.wav b/sound/direct_sound_samples/cries/aurorus.wav new file mode 100644 index 000000000000..4504fd119a7b Binary files /dev/null and b/sound/direct_sound_samples/cries/aurorus.wav differ diff --git a/sound/direct_sound_samples/cries/avalugg.aif b/sound/direct_sound_samples/cries/avalugg.aif deleted file mode 100644 index 95c9d7a1749e..000000000000 Binary files a/sound/direct_sound_samples/cries/avalugg.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/avalugg.wav b/sound/direct_sound_samples/cries/avalugg.wav new file mode 100644 index 000000000000..cbb8acb91ac8 Binary files /dev/null and b/sound/direct_sound_samples/cries/avalugg.wav differ diff --git a/sound/direct_sound_samples/cries/axew.aif b/sound/direct_sound_samples/cries/axew.aif deleted file mode 100644 index f642085f67d9..000000000000 Binary files a/sound/direct_sound_samples/cries/axew.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/axew.wav b/sound/direct_sound_samples/cries/axew.wav new file mode 100644 index 000000000000..8cdab431e9c8 Binary files /dev/null and b/sound/direct_sound_samples/cries/axew.wav differ diff --git a/sound/direct_sound_samples/cries/azelf.aif b/sound/direct_sound_samples/cries/azelf.aif deleted file mode 100644 index ad2e96c8f9bf..000000000000 Binary files a/sound/direct_sound_samples/cries/azelf.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/azelf.wav b/sound/direct_sound_samples/cries/azelf.wav new file mode 100644 index 000000000000..b87f8e4d8f91 Binary files /dev/null and b/sound/direct_sound_samples/cries/azelf.wav differ diff --git a/sound/direct_sound_samples/cries/azumarill.aif b/sound/direct_sound_samples/cries/azumarill.aif deleted file mode 100644 index 99a497e20569..000000000000 Binary files a/sound/direct_sound_samples/cries/azumarill.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/azumarill.wav b/sound/direct_sound_samples/cries/azumarill.wav new file mode 100644 index 000000000000..f9e9ed89a12a Binary files /dev/null and b/sound/direct_sound_samples/cries/azumarill.wav differ diff --git a/sound/direct_sound_samples/cries/azurill.aif b/sound/direct_sound_samples/cries/azurill.aif deleted file mode 100644 index 401385cafb59..000000000000 Binary files a/sound/direct_sound_samples/cries/azurill.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/azurill.wav b/sound/direct_sound_samples/cries/azurill.wav new file mode 100644 index 000000000000..65fa56e65b80 Binary files /dev/null and b/sound/direct_sound_samples/cries/azurill.wav differ diff --git a/sound/direct_sound_samples/cries/bagon.aif b/sound/direct_sound_samples/cries/bagon.aif deleted file mode 100644 index f7c5c3b59e02..000000000000 Binary files a/sound/direct_sound_samples/cries/bagon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/bagon.wav b/sound/direct_sound_samples/cries/bagon.wav new file mode 100644 index 000000000000..af36a96eb860 Binary files /dev/null and b/sound/direct_sound_samples/cries/bagon.wav differ diff --git a/sound/direct_sound_samples/cries/baltoy.aif b/sound/direct_sound_samples/cries/baltoy.aif deleted file mode 100644 index 7900eb1d64c2..000000000000 Binary files a/sound/direct_sound_samples/cries/baltoy.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/baltoy.wav b/sound/direct_sound_samples/cries/baltoy.wav new file mode 100644 index 000000000000..395954b565d9 Binary files /dev/null and b/sound/direct_sound_samples/cries/baltoy.wav differ diff --git a/sound/direct_sound_samples/cries/banette.aif b/sound/direct_sound_samples/cries/banette.aif deleted file mode 100644 index 587b307e27ec..000000000000 Binary files a/sound/direct_sound_samples/cries/banette.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/banette.wav b/sound/direct_sound_samples/cries/banette.wav new file mode 100644 index 000000000000..f030fb66c287 Binary files /dev/null and b/sound/direct_sound_samples/cries/banette.wav differ diff --git a/sound/direct_sound_samples/cries/banette_mega.aif b/sound/direct_sound_samples/cries/banette_mega.aif deleted file mode 100644 index 974f74c31e97..000000000000 Binary files a/sound/direct_sound_samples/cries/banette_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/banette_mega.wav b/sound/direct_sound_samples/cries/banette_mega.wav new file mode 100644 index 000000000000..5de36a008cf2 Binary files /dev/null and b/sound/direct_sound_samples/cries/banette_mega.wav differ diff --git a/sound/direct_sound_samples/cries/barbaracle.aif b/sound/direct_sound_samples/cries/barbaracle.aif deleted file mode 100644 index 3f724127bddc..000000000000 Binary files a/sound/direct_sound_samples/cries/barbaracle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/barbaracle.wav b/sound/direct_sound_samples/cries/barbaracle.wav new file mode 100644 index 000000000000..8c5f4c2c692e Binary files /dev/null and b/sound/direct_sound_samples/cries/barbaracle.wav differ diff --git a/sound/direct_sound_samples/cries/barboach.aif b/sound/direct_sound_samples/cries/barboach.aif deleted file mode 100644 index 926e7fc05002..000000000000 Binary files a/sound/direct_sound_samples/cries/barboach.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/barboach.wav b/sound/direct_sound_samples/cries/barboach.wav new file mode 100644 index 000000000000..40539ce514ab Binary files /dev/null and b/sound/direct_sound_samples/cries/barboach.wav differ diff --git a/sound/direct_sound_samples/cries/barraskewda.aif b/sound/direct_sound_samples/cries/barraskewda.aif deleted file mode 100644 index e1a75a7dc78d..000000000000 Binary files a/sound/direct_sound_samples/cries/barraskewda.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/barraskewda.wav b/sound/direct_sound_samples/cries/barraskewda.wav new file mode 100644 index 000000000000..61e0b5a8836e Binary files /dev/null and b/sound/direct_sound_samples/cries/barraskewda.wav differ diff --git a/sound/direct_sound_samples/cries/basculegion.aif b/sound/direct_sound_samples/cries/basculegion.aif deleted file mode 100644 index 28a8349a5109..000000000000 Binary files a/sound/direct_sound_samples/cries/basculegion.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/basculegion.wav b/sound/direct_sound_samples/cries/basculegion.wav new file mode 100644 index 000000000000..61770488d171 Binary files /dev/null and b/sound/direct_sound_samples/cries/basculegion.wav differ diff --git a/sound/direct_sound_samples/cries/basculin.aif b/sound/direct_sound_samples/cries/basculin.aif deleted file mode 100644 index dfa6db25f1c1..000000000000 Binary files a/sound/direct_sound_samples/cries/basculin.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/basculin.wav b/sound/direct_sound_samples/cries/basculin.wav new file mode 100644 index 000000000000..177af170bebf Binary files /dev/null and b/sound/direct_sound_samples/cries/basculin.wav differ diff --git a/sound/direct_sound_samples/cries/bastiodon.aif b/sound/direct_sound_samples/cries/bastiodon.aif deleted file mode 100644 index 5f5646f7879d..000000000000 Binary files a/sound/direct_sound_samples/cries/bastiodon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/bastiodon.wav b/sound/direct_sound_samples/cries/bastiodon.wav new file mode 100644 index 000000000000..7d693cb6cbd4 Binary files /dev/null and b/sound/direct_sound_samples/cries/bastiodon.wav differ diff --git a/sound/direct_sound_samples/cries/baxcalibur.aif b/sound/direct_sound_samples/cries/baxcalibur.aif deleted file mode 100644 index fd8f5eff6d62..000000000000 Binary files a/sound/direct_sound_samples/cries/baxcalibur.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/baxcalibur.wav b/sound/direct_sound_samples/cries/baxcalibur.wav new file mode 100644 index 000000000000..2dd6bf735ff0 Binary files /dev/null and b/sound/direct_sound_samples/cries/baxcalibur.wav differ diff --git a/sound/direct_sound_samples/cries/bayleef.aif b/sound/direct_sound_samples/cries/bayleef.aif deleted file mode 100644 index 1b38f322a945..000000000000 Binary files a/sound/direct_sound_samples/cries/bayleef.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/bayleef.wav b/sound/direct_sound_samples/cries/bayleef.wav new file mode 100644 index 000000000000..754e6e6e6e14 Binary files /dev/null and b/sound/direct_sound_samples/cries/bayleef.wav differ diff --git a/sound/direct_sound_samples/cries/beartic.aif b/sound/direct_sound_samples/cries/beartic.aif deleted file mode 100644 index 1c7635357ab4..000000000000 Binary files a/sound/direct_sound_samples/cries/beartic.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/beartic.wav b/sound/direct_sound_samples/cries/beartic.wav new file mode 100644 index 000000000000..a7fa0481be99 Binary files /dev/null and b/sound/direct_sound_samples/cries/beartic.wav differ diff --git a/sound/direct_sound_samples/cries/beautifly.aif b/sound/direct_sound_samples/cries/beautifly.aif deleted file mode 100644 index 5b31f73c3166..000000000000 Binary files a/sound/direct_sound_samples/cries/beautifly.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/beautifly.wav b/sound/direct_sound_samples/cries/beautifly.wav new file mode 100644 index 000000000000..f9c3f26a5b6a Binary files /dev/null and b/sound/direct_sound_samples/cries/beautifly.wav differ diff --git a/sound/direct_sound_samples/cries/beedrill.aif b/sound/direct_sound_samples/cries/beedrill.aif deleted file mode 100644 index 888e1e637dec..000000000000 Binary files a/sound/direct_sound_samples/cries/beedrill.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/beedrill.wav b/sound/direct_sound_samples/cries/beedrill.wav new file mode 100644 index 000000000000..6ba426baea09 Binary files /dev/null and b/sound/direct_sound_samples/cries/beedrill.wav differ diff --git a/sound/direct_sound_samples/cries/beedrill_mega.aif b/sound/direct_sound_samples/cries/beedrill_mega.aif deleted file mode 100644 index cea7ca52d569..000000000000 Binary files a/sound/direct_sound_samples/cries/beedrill_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/beedrill_mega.wav b/sound/direct_sound_samples/cries/beedrill_mega.wav new file mode 100644 index 000000000000..ed5d23ee704a Binary files /dev/null and b/sound/direct_sound_samples/cries/beedrill_mega.wav differ diff --git a/sound/direct_sound_samples/cries/beheeyem.aif b/sound/direct_sound_samples/cries/beheeyem.aif deleted file mode 100644 index fb7ce7067721..000000000000 Binary files a/sound/direct_sound_samples/cries/beheeyem.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/beheeyem.wav b/sound/direct_sound_samples/cries/beheeyem.wav new file mode 100644 index 000000000000..e69067281bf7 Binary files /dev/null and b/sound/direct_sound_samples/cries/beheeyem.wav differ diff --git a/sound/direct_sound_samples/cries/beldum.aif b/sound/direct_sound_samples/cries/beldum.aif deleted file mode 100644 index 626f94fc1c5c..000000000000 Binary files a/sound/direct_sound_samples/cries/beldum.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/beldum.wav b/sound/direct_sound_samples/cries/beldum.wav new file mode 100644 index 000000000000..5d6514af4cf7 Binary files /dev/null and b/sound/direct_sound_samples/cries/beldum.wav differ diff --git a/sound/direct_sound_samples/cries/bellibolt.aif b/sound/direct_sound_samples/cries/bellibolt.aif deleted file mode 100644 index b7fc6d0175c6..000000000000 Binary files a/sound/direct_sound_samples/cries/bellibolt.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/bellibolt.wav b/sound/direct_sound_samples/cries/bellibolt.wav new file mode 100644 index 000000000000..2a59187760e2 Binary files /dev/null and b/sound/direct_sound_samples/cries/bellibolt.wav differ diff --git a/sound/direct_sound_samples/cries/bellossom.aif b/sound/direct_sound_samples/cries/bellossom.aif deleted file mode 100644 index ffe452fc5a8f..000000000000 Binary files a/sound/direct_sound_samples/cries/bellossom.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/bellossom.wav b/sound/direct_sound_samples/cries/bellossom.wav new file mode 100644 index 000000000000..71680c16b2ad Binary files /dev/null and b/sound/direct_sound_samples/cries/bellossom.wav differ diff --git a/sound/direct_sound_samples/cries/bellsprout.aif b/sound/direct_sound_samples/cries/bellsprout.aif deleted file mode 100644 index 40e12f8e8b63..000000000000 Binary files a/sound/direct_sound_samples/cries/bellsprout.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/bellsprout.wav b/sound/direct_sound_samples/cries/bellsprout.wav new file mode 100644 index 000000000000..dc7da2e277d4 Binary files /dev/null and b/sound/direct_sound_samples/cries/bellsprout.wav differ diff --git a/sound/direct_sound_samples/cries/bergmite.aif b/sound/direct_sound_samples/cries/bergmite.aif deleted file mode 100644 index 9dbcb7dd0884..000000000000 Binary files a/sound/direct_sound_samples/cries/bergmite.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/bergmite.wav b/sound/direct_sound_samples/cries/bergmite.wav new file mode 100644 index 000000000000..89b2c96ae5b7 Binary files /dev/null and b/sound/direct_sound_samples/cries/bergmite.wav differ diff --git a/sound/direct_sound_samples/cries/bewear.aif b/sound/direct_sound_samples/cries/bewear.aif deleted file mode 100644 index 00979e4542a7..000000000000 Binary files a/sound/direct_sound_samples/cries/bewear.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/bewear.wav b/sound/direct_sound_samples/cries/bewear.wav new file mode 100644 index 000000000000..e2f83f9e124a Binary files /dev/null and b/sound/direct_sound_samples/cries/bewear.wav differ diff --git a/sound/direct_sound_samples/cries/bibarel.aif b/sound/direct_sound_samples/cries/bibarel.aif deleted file mode 100644 index 64b3f5e0ec94..000000000000 Binary files a/sound/direct_sound_samples/cries/bibarel.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/bibarel.wav b/sound/direct_sound_samples/cries/bibarel.wav new file mode 100644 index 000000000000..d1db5310ffe5 Binary files /dev/null and b/sound/direct_sound_samples/cries/bibarel.wav differ diff --git a/sound/direct_sound_samples/cries/bidoof.aif b/sound/direct_sound_samples/cries/bidoof.aif deleted file mode 100644 index 4da8f32adede..000000000000 Binary files a/sound/direct_sound_samples/cries/bidoof.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/bidoof.wav b/sound/direct_sound_samples/cries/bidoof.wav new file mode 100644 index 000000000000..7d7b519fa68c Binary files /dev/null and b/sound/direct_sound_samples/cries/bidoof.wav differ diff --git a/sound/direct_sound_samples/cries/binacle.aif b/sound/direct_sound_samples/cries/binacle.aif deleted file mode 100644 index 168952c84bdb..000000000000 Binary files a/sound/direct_sound_samples/cries/binacle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/binacle.wav b/sound/direct_sound_samples/cries/binacle.wav new file mode 100644 index 000000000000..c9a5449d9038 Binary files /dev/null and b/sound/direct_sound_samples/cries/binacle.wav differ diff --git a/sound/direct_sound_samples/cries/bisharp.aif b/sound/direct_sound_samples/cries/bisharp.aif deleted file mode 100644 index dd1d4c4229da..000000000000 Binary files a/sound/direct_sound_samples/cries/bisharp.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/bisharp.wav b/sound/direct_sound_samples/cries/bisharp.wav new file mode 100644 index 000000000000..55ee54e0f2e4 Binary files /dev/null and b/sound/direct_sound_samples/cries/bisharp.wav differ diff --git a/sound/direct_sound_samples/cries/blacephalon.aif b/sound/direct_sound_samples/cries/blacephalon.aif deleted file mode 100644 index f1308e13449c..000000000000 Binary files a/sound/direct_sound_samples/cries/blacephalon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/blacephalon.wav b/sound/direct_sound_samples/cries/blacephalon.wav new file mode 100644 index 000000000000..342221ee879e Binary files /dev/null and b/sound/direct_sound_samples/cries/blacephalon.wav differ diff --git a/sound/direct_sound_samples/cries/blastoise.aif b/sound/direct_sound_samples/cries/blastoise.aif deleted file mode 100644 index c3ae9294f243..000000000000 Binary files a/sound/direct_sound_samples/cries/blastoise.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/blastoise.wav b/sound/direct_sound_samples/cries/blastoise.wav new file mode 100644 index 000000000000..fecb7733b49f Binary files /dev/null and b/sound/direct_sound_samples/cries/blastoise.wav differ diff --git a/sound/direct_sound_samples/cries/blastoise_mega.aif b/sound/direct_sound_samples/cries/blastoise_mega.aif deleted file mode 100644 index a25f49c30ce7..000000000000 Binary files a/sound/direct_sound_samples/cries/blastoise_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/blastoise_mega.wav b/sound/direct_sound_samples/cries/blastoise_mega.wav new file mode 100644 index 000000000000..1f04ee2aaa65 Binary files /dev/null and b/sound/direct_sound_samples/cries/blastoise_mega.wav differ diff --git a/sound/direct_sound_samples/cries/blaziken.aif b/sound/direct_sound_samples/cries/blaziken.aif deleted file mode 100644 index fa8a46ba9c24..000000000000 Binary files a/sound/direct_sound_samples/cries/blaziken.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/blaziken.wav b/sound/direct_sound_samples/cries/blaziken.wav new file mode 100644 index 000000000000..b7b663d8ecc9 Binary files /dev/null and b/sound/direct_sound_samples/cries/blaziken.wav differ diff --git a/sound/direct_sound_samples/cries/blaziken_mega.aif b/sound/direct_sound_samples/cries/blaziken_mega.aif deleted file mode 100644 index ef5f08153ed2..000000000000 Binary files a/sound/direct_sound_samples/cries/blaziken_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/blaziken_mega.wav b/sound/direct_sound_samples/cries/blaziken_mega.wav new file mode 100644 index 000000000000..65e06208a166 Binary files /dev/null and b/sound/direct_sound_samples/cries/blaziken_mega.wav differ diff --git a/sound/direct_sound_samples/cries/blipbug.aif b/sound/direct_sound_samples/cries/blipbug.aif deleted file mode 100644 index ac9a26d484ba..000000000000 Binary files a/sound/direct_sound_samples/cries/blipbug.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/blipbug.wav b/sound/direct_sound_samples/cries/blipbug.wav new file mode 100644 index 000000000000..b398671b6fe7 Binary files /dev/null and b/sound/direct_sound_samples/cries/blipbug.wav differ diff --git a/sound/direct_sound_samples/cries/blissey.aif b/sound/direct_sound_samples/cries/blissey.aif deleted file mode 100644 index 6cb483ae72bf..000000000000 Binary files a/sound/direct_sound_samples/cries/blissey.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/blissey.wav b/sound/direct_sound_samples/cries/blissey.wav new file mode 100644 index 000000000000..a5012768c105 Binary files /dev/null and b/sound/direct_sound_samples/cries/blissey.wav differ diff --git a/sound/direct_sound_samples/cries/blitzle.aif b/sound/direct_sound_samples/cries/blitzle.aif deleted file mode 100644 index d730da670f2c..000000000000 Binary files a/sound/direct_sound_samples/cries/blitzle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/blitzle.wav b/sound/direct_sound_samples/cries/blitzle.wav new file mode 100644 index 000000000000..e026b158d4ef Binary files /dev/null and b/sound/direct_sound_samples/cries/blitzle.wav differ diff --git a/sound/direct_sound_samples/cries/boldore.aif b/sound/direct_sound_samples/cries/boldore.aif deleted file mode 100644 index 9dbee0011504..000000000000 Binary files a/sound/direct_sound_samples/cries/boldore.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/boldore.wav b/sound/direct_sound_samples/cries/boldore.wav new file mode 100644 index 000000000000..463e54d938db Binary files /dev/null and b/sound/direct_sound_samples/cries/boldore.wav differ diff --git a/sound/direct_sound_samples/cries/boltund.aif b/sound/direct_sound_samples/cries/boltund.aif deleted file mode 100644 index 819142f86c86..000000000000 Binary files a/sound/direct_sound_samples/cries/boltund.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/boltund.wav b/sound/direct_sound_samples/cries/boltund.wav new file mode 100644 index 000000000000..5545f336853a Binary files /dev/null and b/sound/direct_sound_samples/cries/boltund.wav differ diff --git a/sound/direct_sound_samples/cries/bombirdier.aif b/sound/direct_sound_samples/cries/bombirdier.aif deleted file mode 100644 index 27f334acbb97..000000000000 Binary files a/sound/direct_sound_samples/cries/bombirdier.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/bombirdier.wav b/sound/direct_sound_samples/cries/bombirdier.wav new file mode 100644 index 000000000000..db0e74d7c1cc Binary files /dev/null and b/sound/direct_sound_samples/cries/bombirdier.wav differ diff --git a/sound/direct_sound_samples/cries/bonsly.aif b/sound/direct_sound_samples/cries/bonsly.aif deleted file mode 100644 index 15bd56f23270..000000000000 Binary files a/sound/direct_sound_samples/cries/bonsly.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/bonsly.wav b/sound/direct_sound_samples/cries/bonsly.wav new file mode 100644 index 000000000000..791486846355 Binary files /dev/null and b/sound/direct_sound_samples/cries/bonsly.wav differ diff --git a/sound/direct_sound_samples/cries/bouffalant.aif b/sound/direct_sound_samples/cries/bouffalant.aif deleted file mode 100644 index e9502a94b655..000000000000 Binary files a/sound/direct_sound_samples/cries/bouffalant.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/bouffalant.wav b/sound/direct_sound_samples/cries/bouffalant.wav new file mode 100644 index 000000000000..a1af3a6b9031 Binary files /dev/null and b/sound/direct_sound_samples/cries/bouffalant.wav differ diff --git a/sound/direct_sound_samples/cries/bounsweet.aif b/sound/direct_sound_samples/cries/bounsweet.aif deleted file mode 100644 index b1d21fb39072..000000000000 Binary files a/sound/direct_sound_samples/cries/bounsweet.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/bounsweet.wav b/sound/direct_sound_samples/cries/bounsweet.wav new file mode 100644 index 000000000000..2a4120aa0194 Binary files /dev/null and b/sound/direct_sound_samples/cries/bounsweet.wav differ diff --git a/sound/direct_sound_samples/cries/braixen.aif b/sound/direct_sound_samples/cries/braixen.aif deleted file mode 100644 index d5d9e800b076..000000000000 Binary files a/sound/direct_sound_samples/cries/braixen.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/braixen.wav b/sound/direct_sound_samples/cries/braixen.wav new file mode 100644 index 000000000000..640edbfb2b73 Binary files /dev/null and b/sound/direct_sound_samples/cries/braixen.wav differ diff --git a/sound/direct_sound_samples/cries/brambleghast.aif b/sound/direct_sound_samples/cries/brambleghast.aif deleted file mode 100644 index 404e7d1dc614..000000000000 Binary files a/sound/direct_sound_samples/cries/brambleghast.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/brambleghast.wav b/sound/direct_sound_samples/cries/brambleghast.wav new file mode 100644 index 000000000000..30f2f133be07 Binary files /dev/null and b/sound/direct_sound_samples/cries/brambleghast.wav differ diff --git a/sound/direct_sound_samples/cries/bramblin.aif b/sound/direct_sound_samples/cries/bramblin.aif deleted file mode 100644 index b55e43fe77ad..000000000000 Binary files a/sound/direct_sound_samples/cries/bramblin.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/bramblin.wav b/sound/direct_sound_samples/cries/bramblin.wav new file mode 100644 index 000000000000..68596b96a1a6 Binary files /dev/null and b/sound/direct_sound_samples/cries/bramblin.wav differ diff --git a/sound/direct_sound_samples/cries/braviary.aif b/sound/direct_sound_samples/cries/braviary.aif deleted file mode 100644 index 0cf3fc403ef3..000000000000 Binary files a/sound/direct_sound_samples/cries/braviary.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/braviary.wav b/sound/direct_sound_samples/cries/braviary.wav new file mode 100644 index 000000000000..a05d45f955d3 Binary files /dev/null and b/sound/direct_sound_samples/cries/braviary.wav differ diff --git a/sound/direct_sound_samples/cries/breloom.aif b/sound/direct_sound_samples/cries/breloom.aif deleted file mode 100644 index aa6e22f1b916..000000000000 Binary files a/sound/direct_sound_samples/cries/breloom.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/breloom.wav b/sound/direct_sound_samples/cries/breloom.wav new file mode 100644 index 000000000000..49f57f53ec92 Binary files /dev/null and b/sound/direct_sound_samples/cries/breloom.wav differ diff --git a/sound/direct_sound_samples/cries/brionne.aif b/sound/direct_sound_samples/cries/brionne.aif deleted file mode 100644 index ac026ada8824..000000000000 Binary files a/sound/direct_sound_samples/cries/brionne.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/brionne.wav b/sound/direct_sound_samples/cries/brionne.wav new file mode 100644 index 000000000000..f72a6df30a7e Binary files /dev/null and b/sound/direct_sound_samples/cries/brionne.wav differ diff --git a/sound/direct_sound_samples/cries/bronzong.aif b/sound/direct_sound_samples/cries/bronzong.aif deleted file mode 100644 index 628ec30895c3..000000000000 Binary files a/sound/direct_sound_samples/cries/bronzong.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/bronzong.wav b/sound/direct_sound_samples/cries/bronzong.wav new file mode 100644 index 000000000000..019013e0dade Binary files /dev/null and b/sound/direct_sound_samples/cries/bronzong.wav differ diff --git a/sound/direct_sound_samples/cries/bronzor.aif b/sound/direct_sound_samples/cries/bronzor.aif deleted file mode 100644 index 857bef1056e7..000000000000 Binary files a/sound/direct_sound_samples/cries/bronzor.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/bronzor.wav b/sound/direct_sound_samples/cries/bronzor.wav new file mode 100644 index 000000000000..133c581532a9 Binary files /dev/null and b/sound/direct_sound_samples/cries/bronzor.wav differ diff --git a/sound/direct_sound_samples/cries/brute_bonnet.aif b/sound/direct_sound_samples/cries/brute_bonnet.aif deleted file mode 100644 index 3a6369e8be7a..000000000000 Binary files a/sound/direct_sound_samples/cries/brute_bonnet.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/brute_bonnet.wav b/sound/direct_sound_samples/cries/brute_bonnet.wav new file mode 100644 index 000000000000..f3fe7e979921 Binary files /dev/null and b/sound/direct_sound_samples/cries/brute_bonnet.wav differ diff --git a/sound/direct_sound_samples/cries/bruxish.aif b/sound/direct_sound_samples/cries/bruxish.aif deleted file mode 100644 index f725043bc712..000000000000 Binary files a/sound/direct_sound_samples/cries/bruxish.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/bruxish.wav b/sound/direct_sound_samples/cries/bruxish.wav new file mode 100644 index 000000000000..cd5bfbf91277 Binary files /dev/null and b/sound/direct_sound_samples/cries/bruxish.wav differ diff --git a/sound/direct_sound_samples/cries/budew.aif b/sound/direct_sound_samples/cries/budew.aif deleted file mode 100644 index bebc52a8dfeb..000000000000 Binary files a/sound/direct_sound_samples/cries/budew.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/budew.wav b/sound/direct_sound_samples/cries/budew.wav new file mode 100644 index 000000000000..97960bf335e4 Binary files /dev/null and b/sound/direct_sound_samples/cries/budew.wav differ diff --git a/sound/direct_sound_samples/cries/buizel.aif b/sound/direct_sound_samples/cries/buizel.aif deleted file mode 100644 index b138be7a4f36..000000000000 Binary files a/sound/direct_sound_samples/cries/buizel.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/buizel.wav b/sound/direct_sound_samples/cries/buizel.wav new file mode 100644 index 000000000000..21bb4d26aac6 Binary files /dev/null and b/sound/direct_sound_samples/cries/buizel.wav differ diff --git a/sound/direct_sound_samples/cries/bulbasaur.aif b/sound/direct_sound_samples/cries/bulbasaur.aif deleted file mode 100644 index cff5d718b311..000000000000 Binary files a/sound/direct_sound_samples/cries/bulbasaur.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/bulbasaur.wav b/sound/direct_sound_samples/cries/bulbasaur.wav new file mode 100644 index 000000000000..77a2d1bd1cb6 Binary files /dev/null and b/sound/direct_sound_samples/cries/bulbasaur.wav differ diff --git a/sound/direct_sound_samples/cries/buneary.aif b/sound/direct_sound_samples/cries/buneary.aif deleted file mode 100644 index f02bf1b46560..000000000000 Binary files a/sound/direct_sound_samples/cries/buneary.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/buneary.wav b/sound/direct_sound_samples/cries/buneary.wav new file mode 100644 index 000000000000..00af6ec1d8fb Binary files /dev/null and b/sound/direct_sound_samples/cries/buneary.wav differ diff --git a/sound/direct_sound_samples/cries/bunnelby.aif b/sound/direct_sound_samples/cries/bunnelby.aif deleted file mode 100644 index 7588776e93be..000000000000 Binary files a/sound/direct_sound_samples/cries/bunnelby.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/bunnelby.wav b/sound/direct_sound_samples/cries/bunnelby.wav new file mode 100644 index 000000000000..469b6d371b86 Binary files /dev/null and b/sound/direct_sound_samples/cries/bunnelby.wav differ diff --git a/sound/direct_sound_samples/cries/burmy.aif b/sound/direct_sound_samples/cries/burmy.aif deleted file mode 100644 index 80478166f5e3..000000000000 Binary files a/sound/direct_sound_samples/cries/burmy.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/burmy.wav b/sound/direct_sound_samples/cries/burmy.wav new file mode 100644 index 000000000000..6f8db1d2a400 Binary files /dev/null and b/sound/direct_sound_samples/cries/burmy.wav differ diff --git a/sound/direct_sound_samples/cries/butterfree.aif b/sound/direct_sound_samples/cries/butterfree.aif deleted file mode 100644 index e59865ae5af7..000000000000 Binary files a/sound/direct_sound_samples/cries/butterfree.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/butterfree.wav b/sound/direct_sound_samples/cries/butterfree.wav new file mode 100644 index 000000000000..796a1afa9afb Binary files /dev/null and b/sound/direct_sound_samples/cries/butterfree.wav differ diff --git a/sound/direct_sound_samples/cries/buzzwole.aif b/sound/direct_sound_samples/cries/buzzwole.aif deleted file mode 100644 index 242edabdce22..000000000000 Binary files a/sound/direct_sound_samples/cries/buzzwole.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/buzzwole.wav b/sound/direct_sound_samples/cries/buzzwole.wav new file mode 100644 index 000000000000..69f4f7c1a028 Binary files /dev/null and b/sound/direct_sound_samples/cries/buzzwole.wav differ diff --git a/sound/direct_sound_samples/cries/cacnea.aif b/sound/direct_sound_samples/cries/cacnea.aif deleted file mode 100644 index 4d1771b18df1..000000000000 Binary files a/sound/direct_sound_samples/cries/cacnea.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cacnea.wav b/sound/direct_sound_samples/cries/cacnea.wav new file mode 100644 index 000000000000..b2786069b6cb Binary files /dev/null and b/sound/direct_sound_samples/cries/cacnea.wav differ diff --git a/sound/direct_sound_samples/cries/cacturne.aif b/sound/direct_sound_samples/cries/cacturne.aif deleted file mode 100644 index d81f86d9fc9d..000000000000 Binary files a/sound/direct_sound_samples/cries/cacturne.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cacturne.wav b/sound/direct_sound_samples/cries/cacturne.wav new file mode 100644 index 000000000000..34c4525227bb Binary files /dev/null and b/sound/direct_sound_samples/cries/cacturne.wav differ diff --git a/sound/direct_sound_samples/cries/calyrex.aif b/sound/direct_sound_samples/cries/calyrex.aif deleted file mode 100644 index 59c41a4fdb76..000000000000 Binary files a/sound/direct_sound_samples/cries/calyrex.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/calyrex.wav b/sound/direct_sound_samples/cries/calyrex.wav new file mode 100644 index 000000000000..365d22f27e76 Binary files /dev/null and b/sound/direct_sound_samples/cries/calyrex.wav differ diff --git a/sound/direct_sound_samples/cries/calyrex_ice.aif b/sound/direct_sound_samples/cries/calyrex_ice.aif deleted file mode 100644 index a6be291e1dc0..000000000000 Binary files a/sound/direct_sound_samples/cries/calyrex_ice.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/calyrex_ice.wav b/sound/direct_sound_samples/cries/calyrex_ice.wav new file mode 100644 index 000000000000..d1bb9330fe7f Binary files /dev/null and b/sound/direct_sound_samples/cries/calyrex_ice.wav differ diff --git a/sound/direct_sound_samples/cries/calyrex_shadow.aif b/sound/direct_sound_samples/cries/calyrex_shadow.aif deleted file mode 100644 index 2d3c43d978bb..000000000000 Binary files a/sound/direct_sound_samples/cries/calyrex_shadow.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/calyrex_shadow.wav b/sound/direct_sound_samples/cries/calyrex_shadow.wav new file mode 100644 index 000000000000..8c5fabed081a Binary files /dev/null and b/sound/direct_sound_samples/cries/calyrex_shadow.wav differ diff --git a/sound/direct_sound_samples/cries/camerupt.aif b/sound/direct_sound_samples/cries/camerupt.aif deleted file mode 100644 index 82a7f237cf07..000000000000 Binary files a/sound/direct_sound_samples/cries/camerupt.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/camerupt.wav b/sound/direct_sound_samples/cries/camerupt.wav new file mode 100644 index 000000000000..95fdce35757c Binary files /dev/null and b/sound/direct_sound_samples/cries/camerupt.wav differ diff --git a/sound/direct_sound_samples/cries/camerupt_mega.aif b/sound/direct_sound_samples/cries/camerupt_mega.aif deleted file mode 100644 index 0c7966b8ea6e..000000000000 Binary files a/sound/direct_sound_samples/cries/camerupt_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/camerupt_mega.wav b/sound/direct_sound_samples/cries/camerupt_mega.wav new file mode 100644 index 000000000000..b76cd2d974b9 Binary files /dev/null and b/sound/direct_sound_samples/cries/camerupt_mega.wav differ diff --git a/sound/direct_sound_samples/cries/capsakid.aif b/sound/direct_sound_samples/cries/capsakid.aif deleted file mode 100644 index a93a531cdb0c..000000000000 Binary files a/sound/direct_sound_samples/cries/capsakid.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/capsakid.wav b/sound/direct_sound_samples/cries/capsakid.wav new file mode 100644 index 000000000000..1a5837c9cd1b Binary files /dev/null and b/sound/direct_sound_samples/cries/capsakid.wav differ diff --git a/sound/direct_sound_samples/cries/carbink.aif b/sound/direct_sound_samples/cries/carbink.aif deleted file mode 100644 index dfdc907bd7b0..000000000000 Binary files a/sound/direct_sound_samples/cries/carbink.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/carbink.wav b/sound/direct_sound_samples/cries/carbink.wav new file mode 100644 index 000000000000..34ccc0db3b06 Binary files /dev/null and b/sound/direct_sound_samples/cries/carbink.wav differ diff --git a/sound/direct_sound_samples/cries/carkol.aif b/sound/direct_sound_samples/cries/carkol.aif deleted file mode 100644 index a1f19de7f413..000000000000 Binary files a/sound/direct_sound_samples/cries/carkol.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/carkol.wav b/sound/direct_sound_samples/cries/carkol.wav new file mode 100644 index 000000000000..526f8f473ff8 Binary files /dev/null and b/sound/direct_sound_samples/cries/carkol.wav differ diff --git a/sound/direct_sound_samples/cries/carnivine.aif b/sound/direct_sound_samples/cries/carnivine.aif deleted file mode 100644 index 491e846a1a44..000000000000 Binary files a/sound/direct_sound_samples/cries/carnivine.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/carnivine.wav b/sound/direct_sound_samples/cries/carnivine.wav new file mode 100644 index 000000000000..cdb7d8a35803 Binary files /dev/null and b/sound/direct_sound_samples/cries/carnivine.wav differ diff --git a/sound/direct_sound_samples/cries/carracosta.aif b/sound/direct_sound_samples/cries/carracosta.aif deleted file mode 100644 index f75692c3a132..000000000000 Binary files a/sound/direct_sound_samples/cries/carracosta.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/carracosta.wav b/sound/direct_sound_samples/cries/carracosta.wav new file mode 100644 index 000000000000..4367ed1372e5 Binary files /dev/null and b/sound/direct_sound_samples/cries/carracosta.wav differ diff --git a/sound/direct_sound_samples/cries/carvanha.aif b/sound/direct_sound_samples/cries/carvanha.aif deleted file mode 100644 index 2c0a6a5d8ccc..000000000000 Binary files a/sound/direct_sound_samples/cries/carvanha.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/carvanha.wav b/sound/direct_sound_samples/cries/carvanha.wav new file mode 100644 index 000000000000..ae10c3b10c71 Binary files /dev/null and b/sound/direct_sound_samples/cries/carvanha.wav differ diff --git a/sound/direct_sound_samples/cries/cascoon.aif b/sound/direct_sound_samples/cries/cascoon.aif deleted file mode 100644 index a256131caff5..000000000000 Binary files a/sound/direct_sound_samples/cries/cascoon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cascoon.wav b/sound/direct_sound_samples/cries/cascoon.wav new file mode 100644 index 000000000000..fff0be68157e Binary files /dev/null and b/sound/direct_sound_samples/cries/cascoon.wav differ diff --git a/sound/direct_sound_samples/cries/castform.aif b/sound/direct_sound_samples/cries/castform.aif deleted file mode 100644 index 4fce6e5075e8..000000000000 Binary files a/sound/direct_sound_samples/cries/castform.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/castform.wav b/sound/direct_sound_samples/cries/castform.wav new file mode 100644 index 000000000000..83748d45b857 Binary files /dev/null and b/sound/direct_sound_samples/cries/castform.wav differ diff --git a/sound/direct_sound_samples/cries/caterpie.aif b/sound/direct_sound_samples/cries/caterpie.aif deleted file mode 100644 index 4ce12c5fb7d8..000000000000 Binary files a/sound/direct_sound_samples/cries/caterpie.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/caterpie.wav b/sound/direct_sound_samples/cries/caterpie.wav new file mode 100644 index 000000000000..ccdf1ba1ac08 Binary files /dev/null and b/sound/direct_sound_samples/cries/caterpie.wav differ diff --git a/sound/direct_sound_samples/cries/celebi.aif b/sound/direct_sound_samples/cries/celebi.aif deleted file mode 100644 index df1c4cd19504..000000000000 Binary files a/sound/direct_sound_samples/cries/celebi.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/celebi.wav b/sound/direct_sound_samples/cries/celebi.wav new file mode 100644 index 000000000000..e217a99e81ad Binary files /dev/null and b/sound/direct_sound_samples/cries/celebi.wav differ diff --git a/sound/direct_sound_samples/cries/celesteela.aif b/sound/direct_sound_samples/cries/celesteela.aif deleted file mode 100644 index acab333235df..000000000000 Binary files a/sound/direct_sound_samples/cries/celesteela.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/celesteela.wav b/sound/direct_sound_samples/cries/celesteela.wav new file mode 100644 index 000000000000..fd5cae47f9a1 Binary files /dev/null and b/sound/direct_sound_samples/cries/celesteela.wav differ diff --git a/sound/direct_sound_samples/cries/centiskorch.aif b/sound/direct_sound_samples/cries/centiskorch.aif deleted file mode 100644 index 01c6bc23a5cb..000000000000 Binary files a/sound/direct_sound_samples/cries/centiskorch.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/centiskorch.wav b/sound/direct_sound_samples/cries/centiskorch.wav new file mode 100644 index 000000000000..cc669c123f41 Binary files /dev/null and b/sound/direct_sound_samples/cries/centiskorch.wav differ diff --git a/sound/direct_sound_samples/cries/ceruledge.aif b/sound/direct_sound_samples/cries/ceruledge.aif deleted file mode 100644 index de4b1bb7c89d..000000000000 Binary files a/sound/direct_sound_samples/cries/ceruledge.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ceruledge.wav b/sound/direct_sound_samples/cries/ceruledge.wav new file mode 100644 index 000000000000..158bf548e04d Binary files /dev/null and b/sound/direct_sound_samples/cries/ceruledge.wav differ diff --git a/sound/direct_sound_samples/cries/cetitan.aif b/sound/direct_sound_samples/cries/cetitan.aif deleted file mode 100644 index 45302ff84437..000000000000 Binary files a/sound/direct_sound_samples/cries/cetitan.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cetitan.wav b/sound/direct_sound_samples/cries/cetitan.wav new file mode 100644 index 000000000000..9f6df2ec42e4 Binary files /dev/null and b/sound/direct_sound_samples/cries/cetitan.wav differ diff --git a/sound/direct_sound_samples/cries/cetoddle.aif b/sound/direct_sound_samples/cries/cetoddle.aif deleted file mode 100644 index f85f3d201f63..000000000000 Binary files a/sound/direct_sound_samples/cries/cetoddle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cetoddle.wav b/sound/direct_sound_samples/cries/cetoddle.wav new file mode 100644 index 000000000000..93f34e1cf78c Binary files /dev/null and b/sound/direct_sound_samples/cries/cetoddle.wav differ diff --git a/sound/direct_sound_samples/cries/chandelure.aif b/sound/direct_sound_samples/cries/chandelure.aif deleted file mode 100644 index 29cd52e1c1fd..000000000000 Binary files a/sound/direct_sound_samples/cries/chandelure.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/chandelure.wav b/sound/direct_sound_samples/cries/chandelure.wav new file mode 100644 index 000000000000..2539f2c23996 Binary files /dev/null and b/sound/direct_sound_samples/cries/chandelure.wav differ diff --git a/sound/direct_sound_samples/cries/chansey.aif b/sound/direct_sound_samples/cries/chansey.aif deleted file mode 100644 index b6a8a2902038..000000000000 Binary files a/sound/direct_sound_samples/cries/chansey.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/chansey.wav b/sound/direct_sound_samples/cries/chansey.wav new file mode 100644 index 000000000000..62d8e6cd9fbb Binary files /dev/null and b/sound/direct_sound_samples/cries/chansey.wav differ diff --git a/sound/direct_sound_samples/cries/charcadet.aif b/sound/direct_sound_samples/cries/charcadet.aif deleted file mode 100644 index 60f5512ca6cd..000000000000 Binary files a/sound/direct_sound_samples/cries/charcadet.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/charcadet.wav b/sound/direct_sound_samples/cries/charcadet.wav new file mode 100644 index 000000000000..509e7b496821 Binary files /dev/null and b/sound/direct_sound_samples/cries/charcadet.wav differ diff --git a/sound/direct_sound_samples/cries/charizard.aif b/sound/direct_sound_samples/cries/charizard.aif deleted file mode 100644 index cc5f2bdd33f8..000000000000 Binary files a/sound/direct_sound_samples/cries/charizard.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/charizard.wav b/sound/direct_sound_samples/cries/charizard.wav new file mode 100644 index 000000000000..fbbf3c555d49 Binary files /dev/null and b/sound/direct_sound_samples/cries/charizard.wav differ diff --git a/sound/direct_sound_samples/cries/charizard_mega_x.aif b/sound/direct_sound_samples/cries/charizard_mega_x.aif deleted file mode 100644 index f9c0f7659752..000000000000 Binary files a/sound/direct_sound_samples/cries/charizard_mega_x.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/charizard_mega_x.wav b/sound/direct_sound_samples/cries/charizard_mega_x.wav new file mode 100644 index 000000000000..053f05caad2f Binary files /dev/null and b/sound/direct_sound_samples/cries/charizard_mega_x.wav differ diff --git a/sound/direct_sound_samples/cries/charizard_mega_y.aif b/sound/direct_sound_samples/cries/charizard_mega_y.aif deleted file mode 100644 index 2cf5b3ea7fc6..000000000000 Binary files a/sound/direct_sound_samples/cries/charizard_mega_y.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/charizard_mega_y.wav b/sound/direct_sound_samples/cries/charizard_mega_y.wav new file mode 100644 index 000000000000..1d354bb938cb Binary files /dev/null and b/sound/direct_sound_samples/cries/charizard_mega_y.wav differ diff --git a/sound/direct_sound_samples/cries/charjabug.aif b/sound/direct_sound_samples/cries/charjabug.aif deleted file mode 100644 index ed5bd7d88be8..000000000000 Binary files a/sound/direct_sound_samples/cries/charjabug.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/charjabug.wav b/sound/direct_sound_samples/cries/charjabug.wav new file mode 100644 index 000000000000..686e72aa6f59 Binary files /dev/null and b/sound/direct_sound_samples/cries/charjabug.wav differ diff --git a/sound/direct_sound_samples/cries/charmander.aif b/sound/direct_sound_samples/cries/charmander.aif deleted file mode 100644 index dda65af54992..000000000000 Binary files a/sound/direct_sound_samples/cries/charmander.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/charmander.wav b/sound/direct_sound_samples/cries/charmander.wav new file mode 100644 index 000000000000..3d82aca2fa71 Binary files /dev/null and b/sound/direct_sound_samples/cries/charmander.wav differ diff --git a/sound/direct_sound_samples/cries/charmeleon.aif b/sound/direct_sound_samples/cries/charmeleon.aif deleted file mode 100644 index 9a9a14e3bb81..000000000000 Binary files a/sound/direct_sound_samples/cries/charmeleon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/charmeleon.wav b/sound/direct_sound_samples/cries/charmeleon.wav new file mode 100644 index 000000000000..a491f0586ec8 Binary files /dev/null and b/sound/direct_sound_samples/cries/charmeleon.wav differ diff --git a/sound/direct_sound_samples/cries/chatot.aif b/sound/direct_sound_samples/cries/chatot.aif deleted file mode 100644 index 62a961a82f4e..000000000000 Binary files a/sound/direct_sound_samples/cries/chatot.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/chatot.wav b/sound/direct_sound_samples/cries/chatot.wav new file mode 100644 index 000000000000..5f76a9147239 Binary files /dev/null and b/sound/direct_sound_samples/cries/chatot.wav differ diff --git a/sound/direct_sound_samples/cries/cherrim.aif b/sound/direct_sound_samples/cries/cherrim.aif deleted file mode 100644 index d70cf77b0228..000000000000 Binary files a/sound/direct_sound_samples/cries/cherrim.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cherrim.wav b/sound/direct_sound_samples/cries/cherrim.wav new file mode 100644 index 000000000000..ca0dc7a4c035 Binary files /dev/null and b/sound/direct_sound_samples/cries/cherrim.wav differ diff --git a/sound/direct_sound_samples/cries/cherubi.aif b/sound/direct_sound_samples/cries/cherubi.aif deleted file mode 100644 index 703c1d5f8b81..000000000000 Binary files a/sound/direct_sound_samples/cries/cherubi.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cherubi.wav b/sound/direct_sound_samples/cries/cherubi.wav new file mode 100644 index 000000000000..2a87affb5751 Binary files /dev/null and b/sound/direct_sound_samples/cries/cherubi.wav differ diff --git a/sound/direct_sound_samples/cries/chesnaught.aif b/sound/direct_sound_samples/cries/chesnaught.aif deleted file mode 100644 index 80cff836982e..000000000000 Binary files a/sound/direct_sound_samples/cries/chesnaught.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/chesnaught.wav b/sound/direct_sound_samples/cries/chesnaught.wav new file mode 100644 index 000000000000..27044e80a41f Binary files /dev/null and b/sound/direct_sound_samples/cries/chesnaught.wav differ diff --git a/sound/direct_sound_samples/cries/chespin.aif b/sound/direct_sound_samples/cries/chespin.aif deleted file mode 100644 index 48136a98a0d5..000000000000 Binary files a/sound/direct_sound_samples/cries/chespin.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/chespin.wav b/sound/direct_sound_samples/cries/chespin.wav new file mode 100644 index 000000000000..5e5f5a7c6a93 Binary files /dev/null and b/sound/direct_sound_samples/cries/chespin.wav differ diff --git a/sound/direct_sound_samples/cries/chewtle.aif b/sound/direct_sound_samples/cries/chewtle.aif deleted file mode 100644 index d551d2715623..000000000000 Binary files a/sound/direct_sound_samples/cries/chewtle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/chewtle.wav b/sound/direct_sound_samples/cries/chewtle.wav new file mode 100644 index 000000000000..a9f609dc4ca0 Binary files /dev/null and b/sound/direct_sound_samples/cries/chewtle.wav differ diff --git a/sound/direct_sound_samples/cries/chi_yu.aif b/sound/direct_sound_samples/cries/chi_yu.aif deleted file mode 100644 index 60131a9e4637..000000000000 Binary files a/sound/direct_sound_samples/cries/chi_yu.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/chi_yu.wav b/sound/direct_sound_samples/cries/chi_yu.wav new file mode 100644 index 000000000000..8db88a2de66b Binary files /dev/null and b/sound/direct_sound_samples/cries/chi_yu.wav differ diff --git a/sound/direct_sound_samples/cries/chien_pao.aif b/sound/direct_sound_samples/cries/chien_pao.aif deleted file mode 100644 index c598dac8d23d..000000000000 Binary files a/sound/direct_sound_samples/cries/chien_pao.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/chien_pao.wav b/sound/direct_sound_samples/cries/chien_pao.wav new file mode 100644 index 000000000000..2575663d5df7 Binary files /dev/null and b/sound/direct_sound_samples/cries/chien_pao.wav differ diff --git a/sound/direct_sound_samples/cries/chikorita.aif b/sound/direct_sound_samples/cries/chikorita.aif deleted file mode 100644 index 63d5c9503373..000000000000 Binary files a/sound/direct_sound_samples/cries/chikorita.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/chikorita.wav b/sound/direct_sound_samples/cries/chikorita.wav new file mode 100644 index 000000000000..65cb0c17656b Binary files /dev/null and b/sound/direct_sound_samples/cries/chikorita.wav differ diff --git a/sound/direct_sound_samples/cries/chimchar.aif b/sound/direct_sound_samples/cries/chimchar.aif deleted file mode 100644 index 06514a4d9040..000000000000 Binary files a/sound/direct_sound_samples/cries/chimchar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/chimchar.wav b/sound/direct_sound_samples/cries/chimchar.wav new file mode 100644 index 000000000000..cd862e218abf Binary files /dev/null and b/sound/direct_sound_samples/cries/chimchar.wav differ diff --git a/sound/direct_sound_samples/cries/chimecho.aif b/sound/direct_sound_samples/cries/chimecho.aif deleted file mode 100644 index 7b2b45fac202..000000000000 Binary files a/sound/direct_sound_samples/cries/chimecho.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/chimecho.wav b/sound/direct_sound_samples/cries/chimecho.wav new file mode 100644 index 000000000000..a063bf739e77 Binary files /dev/null and b/sound/direct_sound_samples/cries/chimecho.wav differ diff --git a/sound/direct_sound_samples/cries/chinchou.aif b/sound/direct_sound_samples/cries/chinchou.aif deleted file mode 100644 index 846df5079cde..000000000000 Binary files a/sound/direct_sound_samples/cries/chinchou.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/chinchou.wav b/sound/direct_sound_samples/cries/chinchou.wav new file mode 100644 index 000000000000..88229968284e Binary files /dev/null and b/sound/direct_sound_samples/cries/chinchou.wav differ diff --git a/sound/direct_sound_samples/cries/chingling.aif b/sound/direct_sound_samples/cries/chingling.aif deleted file mode 100644 index dd3b00915b2b..000000000000 Binary files a/sound/direct_sound_samples/cries/chingling.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/chingling.wav b/sound/direct_sound_samples/cries/chingling.wav new file mode 100644 index 000000000000..af4d3051069c Binary files /dev/null and b/sound/direct_sound_samples/cries/chingling.wav differ diff --git a/sound/direct_sound_samples/cries/cinccino.aif b/sound/direct_sound_samples/cries/cinccino.aif deleted file mode 100644 index 6205aaf2b07b..000000000000 Binary files a/sound/direct_sound_samples/cries/cinccino.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cinccino.wav b/sound/direct_sound_samples/cries/cinccino.wav new file mode 100644 index 000000000000..beb20a3ce00d Binary files /dev/null and b/sound/direct_sound_samples/cries/cinccino.wav differ diff --git a/sound/direct_sound_samples/cries/cinderace.aif b/sound/direct_sound_samples/cries/cinderace.aif deleted file mode 100644 index 1e7bed5bfd69..000000000000 Binary files a/sound/direct_sound_samples/cries/cinderace.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cinderace.wav b/sound/direct_sound_samples/cries/cinderace.wav new file mode 100644 index 000000000000..01caaae4d61d Binary files /dev/null and b/sound/direct_sound_samples/cries/cinderace.wav differ diff --git a/sound/direct_sound_samples/cries/clamperl.aif b/sound/direct_sound_samples/cries/clamperl.aif deleted file mode 100644 index 186a1f9b408d..000000000000 Binary files a/sound/direct_sound_samples/cries/clamperl.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/clamperl.wav b/sound/direct_sound_samples/cries/clamperl.wav new file mode 100644 index 000000000000..6615de877926 Binary files /dev/null and b/sound/direct_sound_samples/cries/clamperl.wav differ diff --git a/sound/direct_sound_samples/cries/clauncher.aif b/sound/direct_sound_samples/cries/clauncher.aif deleted file mode 100644 index ab9cbf9ce1bb..000000000000 Binary files a/sound/direct_sound_samples/cries/clauncher.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/clauncher.wav b/sound/direct_sound_samples/cries/clauncher.wav new file mode 100644 index 000000000000..19a07f395aa6 Binary files /dev/null and b/sound/direct_sound_samples/cries/clauncher.wav differ diff --git a/sound/direct_sound_samples/cries/clawitzer.aif b/sound/direct_sound_samples/cries/clawitzer.aif deleted file mode 100644 index bd14270c3821..000000000000 Binary files a/sound/direct_sound_samples/cries/clawitzer.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/clawitzer.wav b/sound/direct_sound_samples/cries/clawitzer.wav new file mode 100644 index 000000000000..7947944ace46 Binary files /dev/null and b/sound/direct_sound_samples/cries/clawitzer.wav differ diff --git a/sound/direct_sound_samples/cries/claydol.aif b/sound/direct_sound_samples/cries/claydol.aif deleted file mode 100644 index 9da5f5bbb76b..000000000000 Binary files a/sound/direct_sound_samples/cries/claydol.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/claydol.wav b/sound/direct_sound_samples/cries/claydol.wav new file mode 100644 index 000000000000..037a9a40637c Binary files /dev/null and b/sound/direct_sound_samples/cries/claydol.wav differ diff --git a/sound/direct_sound_samples/cries/clefable.aif b/sound/direct_sound_samples/cries/clefable.aif deleted file mode 100644 index e04bf536ad3b..000000000000 Binary files a/sound/direct_sound_samples/cries/clefable.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/clefable.wav b/sound/direct_sound_samples/cries/clefable.wav new file mode 100644 index 000000000000..09b0d19b862e Binary files /dev/null and b/sound/direct_sound_samples/cries/clefable.wav differ diff --git a/sound/direct_sound_samples/cries/clefairy.aif b/sound/direct_sound_samples/cries/clefairy.aif deleted file mode 100644 index b38fa6e9d7d9..000000000000 Binary files a/sound/direct_sound_samples/cries/clefairy.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/clefairy.wav b/sound/direct_sound_samples/cries/clefairy.wav new file mode 100644 index 000000000000..b447b700cd7a Binary files /dev/null and b/sound/direct_sound_samples/cries/clefairy.wav differ diff --git a/sound/direct_sound_samples/cries/cleffa.aif b/sound/direct_sound_samples/cries/cleffa.aif deleted file mode 100644 index e3243d0998de..000000000000 Binary files a/sound/direct_sound_samples/cries/cleffa.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cleffa.wav b/sound/direct_sound_samples/cries/cleffa.wav new file mode 100644 index 000000000000..53d18df4153c Binary files /dev/null and b/sound/direct_sound_samples/cries/cleffa.wav differ diff --git a/sound/direct_sound_samples/cries/clobbopus.aif b/sound/direct_sound_samples/cries/clobbopus.aif deleted file mode 100644 index ebce642966d2..000000000000 Binary files a/sound/direct_sound_samples/cries/clobbopus.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/clobbopus.wav b/sound/direct_sound_samples/cries/clobbopus.wav new file mode 100644 index 000000000000..f26d8c1cddf0 Binary files /dev/null and b/sound/direct_sound_samples/cries/clobbopus.wav differ diff --git a/sound/direct_sound_samples/cries/clodsire.aif b/sound/direct_sound_samples/cries/clodsire.aif deleted file mode 100644 index 17aea97e46d9..000000000000 Binary files a/sound/direct_sound_samples/cries/clodsire.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/clodsire.wav b/sound/direct_sound_samples/cries/clodsire.wav new file mode 100644 index 000000000000..44cad4cb7116 Binary files /dev/null and b/sound/direct_sound_samples/cries/clodsire.wav differ diff --git a/sound/direct_sound_samples/cries/cloyster.aif b/sound/direct_sound_samples/cries/cloyster.aif deleted file mode 100644 index b69d0478bf51..000000000000 Binary files a/sound/direct_sound_samples/cries/cloyster.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cloyster.wav b/sound/direct_sound_samples/cries/cloyster.wav new file mode 100644 index 000000000000..4fc766ae194c Binary files /dev/null and b/sound/direct_sound_samples/cries/cloyster.wav differ diff --git a/sound/direct_sound_samples/cries/coalossal.aif b/sound/direct_sound_samples/cries/coalossal.aif deleted file mode 100644 index 5d62b25fbae7..000000000000 Binary files a/sound/direct_sound_samples/cries/coalossal.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/coalossal.wav b/sound/direct_sound_samples/cries/coalossal.wav new file mode 100644 index 000000000000..7b2a758d2327 Binary files /dev/null and b/sound/direct_sound_samples/cries/coalossal.wav differ diff --git a/sound/direct_sound_samples/cries/cobalion.aif b/sound/direct_sound_samples/cries/cobalion.aif deleted file mode 100644 index 4a21505b5b50..000000000000 Binary files a/sound/direct_sound_samples/cries/cobalion.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cobalion.wav b/sound/direct_sound_samples/cries/cobalion.wav new file mode 100644 index 000000000000..2cbc6bbd554e Binary files /dev/null and b/sound/direct_sound_samples/cries/cobalion.wav differ diff --git a/sound/direct_sound_samples/cries/cofagrigus.aif b/sound/direct_sound_samples/cries/cofagrigus.aif deleted file mode 100644 index 6fbf1c16f87b..000000000000 Binary files a/sound/direct_sound_samples/cries/cofagrigus.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cofagrigus.wav b/sound/direct_sound_samples/cries/cofagrigus.wav new file mode 100644 index 000000000000..2096837cd9cc Binary files /dev/null and b/sound/direct_sound_samples/cries/cofagrigus.wav differ diff --git a/sound/direct_sound_samples/cries/combee.aif b/sound/direct_sound_samples/cries/combee.aif deleted file mode 100644 index 6aaedb642d12..000000000000 Binary files a/sound/direct_sound_samples/cries/combee.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/combee.wav b/sound/direct_sound_samples/cries/combee.wav new file mode 100644 index 000000000000..d2e370227e7a Binary files /dev/null and b/sound/direct_sound_samples/cries/combee.wav differ diff --git a/sound/direct_sound_samples/cries/combusken.aif b/sound/direct_sound_samples/cries/combusken.aif deleted file mode 100644 index 58707c30b8bb..000000000000 Binary files a/sound/direct_sound_samples/cries/combusken.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/combusken.wav b/sound/direct_sound_samples/cries/combusken.wav new file mode 100644 index 000000000000..8da9de64a13d Binary files /dev/null and b/sound/direct_sound_samples/cries/combusken.wav differ diff --git a/sound/direct_sound_samples/cries/comfey.aif b/sound/direct_sound_samples/cries/comfey.aif deleted file mode 100644 index cb91d0cbd72d..000000000000 Binary files a/sound/direct_sound_samples/cries/comfey.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/comfey.wav b/sound/direct_sound_samples/cries/comfey.wav new file mode 100644 index 000000000000..b178f02a6999 Binary files /dev/null and b/sound/direct_sound_samples/cries/comfey.wav differ diff --git a/sound/direct_sound_samples/cries/conkeldurr.aif b/sound/direct_sound_samples/cries/conkeldurr.aif deleted file mode 100644 index 09885ab2ef05..000000000000 Binary files a/sound/direct_sound_samples/cries/conkeldurr.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/conkeldurr.wav b/sound/direct_sound_samples/cries/conkeldurr.wav new file mode 100644 index 000000000000..fa56aac5e922 Binary files /dev/null and b/sound/direct_sound_samples/cries/conkeldurr.wav differ diff --git a/sound/direct_sound_samples/cries/copperajah.aif b/sound/direct_sound_samples/cries/copperajah.aif deleted file mode 100644 index 97484e695b24..000000000000 Binary files a/sound/direct_sound_samples/cries/copperajah.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/copperajah.wav b/sound/direct_sound_samples/cries/copperajah.wav new file mode 100644 index 000000000000..23df3fd99cf2 Binary files /dev/null and b/sound/direct_sound_samples/cries/copperajah.wav differ diff --git a/sound/direct_sound_samples/cries/corphish.aif b/sound/direct_sound_samples/cries/corphish.aif deleted file mode 100644 index 9bc708e2fb41..000000000000 Binary files a/sound/direct_sound_samples/cries/corphish.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/corphish.wav b/sound/direct_sound_samples/cries/corphish.wav new file mode 100644 index 000000000000..990029d333c0 Binary files /dev/null and b/sound/direct_sound_samples/cries/corphish.wav differ diff --git a/sound/direct_sound_samples/cries/corsola.aif b/sound/direct_sound_samples/cries/corsola.aif deleted file mode 100644 index 087308d8fd9c..000000000000 Binary files a/sound/direct_sound_samples/cries/corsola.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/corsola.wav b/sound/direct_sound_samples/cries/corsola.wav new file mode 100644 index 000000000000..890208bc73dc Binary files /dev/null and b/sound/direct_sound_samples/cries/corsola.wav differ diff --git a/sound/direct_sound_samples/cries/corviknight.aif b/sound/direct_sound_samples/cries/corviknight.aif deleted file mode 100644 index 8a7e200da3fd..000000000000 Binary files a/sound/direct_sound_samples/cries/corviknight.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/corviknight.wav b/sound/direct_sound_samples/cries/corviknight.wav new file mode 100644 index 000000000000..2f536e1280dc Binary files /dev/null and b/sound/direct_sound_samples/cries/corviknight.wav differ diff --git a/sound/direct_sound_samples/cries/corvisquire.aif b/sound/direct_sound_samples/cries/corvisquire.aif deleted file mode 100644 index a18e64c9c07d..000000000000 Binary files a/sound/direct_sound_samples/cries/corvisquire.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/corvisquire.wav b/sound/direct_sound_samples/cries/corvisquire.wav new file mode 100644 index 000000000000..b0600991c0d1 Binary files /dev/null and b/sound/direct_sound_samples/cries/corvisquire.wav differ diff --git a/sound/direct_sound_samples/cries/cosmoem.aif b/sound/direct_sound_samples/cries/cosmoem.aif deleted file mode 100644 index f2c8c0e2b49f..000000000000 Binary files a/sound/direct_sound_samples/cries/cosmoem.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cosmoem.wav b/sound/direct_sound_samples/cries/cosmoem.wav new file mode 100644 index 000000000000..8f9523bced6f Binary files /dev/null and b/sound/direct_sound_samples/cries/cosmoem.wav differ diff --git a/sound/direct_sound_samples/cries/cosmog.aif b/sound/direct_sound_samples/cries/cosmog.aif deleted file mode 100644 index deeb60b94d7c..000000000000 Binary files a/sound/direct_sound_samples/cries/cosmog.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cosmog.wav b/sound/direct_sound_samples/cries/cosmog.wav new file mode 100644 index 000000000000..c52927d1b073 Binary files /dev/null and b/sound/direct_sound_samples/cries/cosmog.wav differ diff --git a/sound/direct_sound_samples/cries/cottonee.aif b/sound/direct_sound_samples/cries/cottonee.aif deleted file mode 100644 index 207ac9d12df9..000000000000 Binary files a/sound/direct_sound_samples/cries/cottonee.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cottonee.wav b/sound/direct_sound_samples/cries/cottonee.wav new file mode 100644 index 000000000000..a7c0e6ce5b5b Binary files /dev/null and b/sound/direct_sound_samples/cries/cottonee.wav differ diff --git a/sound/direct_sound_samples/cries/crabominable.aif b/sound/direct_sound_samples/cries/crabominable.aif deleted file mode 100644 index 1d6b3d4caf24..000000000000 Binary files a/sound/direct_sound_samples/cries/crabominable.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/crabominable.wav b/sound/direct_sound_samples/cries/crabominable.wav new file mode 100644 index 000000000000..ca783994b8be Binary files /dev/null and b/sound/direct_sound_samples/cries/crabominable.wav differ diff --git a/sound/direct_sound_samples/cries/crabrawler.aif b/sound/direct_sound_samples/cries/crabrawler.aif deleted file mode 100644 index 8c42fb18e57a..000000000000 Binary files a/sound/direct_sound_samples/cries/crabrawler.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/crabrawler.wav b/sound/direct_sound_samples/cries/crabrawler.wav new file mode 100644 index 000000000000..b5afae8c1db5 Binary files /dev/null and b/sound/direct_sound_samples/cries/crabrawler.wav differ diff --git a/sound/direct_sound_samples/cries/cradily.aif b/sound/direct_sound_samples/cries/cradily.aif deleted file mode 100644 index 3fa5e006f99d..000000000000 Binary files a/sound/direct_sound_samples/cries/cradily.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cradily.wav b/sound/direct_sound_samples/cries/cradily.wav new file mode 100644 index 000000000000..bb9d5bd42545 Binary files /dev/null and b/sound/direct_sound_samples/cries/cradily.wav differ diff --git a/sound/direct_sound_samples/cries/cramorant.aif b/sound/direct_sound_samples/cries/cramorant.aif deleted file mode 100644 index 01151693ffe5..000000000000 Binary files a/sound/direct_sound_samples/cries/cramorant.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cramorant.wav b/sound/direct_sound_samples/cries/cramorant.wav new file mode 100644 index 000000000000..a21c49b1c4c4 Binary files /dev/null and b/sound/direct_sound_samples/cries/cramorant.wav differ diff --git a/sound/direct_sound_samples/cries/cranidos.aif b/sound/direct_sound_samples/cries/cranidos.aif deleted file mode 100644 index dc67035a766a..000000000000 Binary files a/sound/direct_sound_samples/cries/cranidos.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cranidos.wav b/sound/direct_sound_samples/cries/cranidos.wav new file mode 100644 index 000000000000..5ceba87269d9 Binary files /dev/null and b/sound/direct_sound_samples/cries/cranidos.wav differ diff --git a/sound/direct_sound_samples/cries/crawdaunt.aif b/sound/direct_sound_samples/cries/crawdaunt.aif deleted file mode 100644 index 7f8ee48bebf6..000000000000 Binary files a/sound/direct_sound_samples/cries/crawdaunt.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/crawdaunt.wav b/sound/direct_sound_samples/cries/crawdaunt.wav new file mode 100644 index 000000000000..e270a3179154 Binary files /dev/null and b/sound/direct_sound_samples/cries/crawdaunt.wav differ diff --git a/sound/direct_sound_samples/cries/cresselia.aif b/sound/direct_sound_samples/cries/cresselia.aif deleted file mode 100644 index 5edd1b01948a..000000000000 Binary files a/sound/direct_sound_samples/cries/cresselia.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cresselia.wav b/sound/direct_sound_samples/cries/cresselia.wav new file mode 100644 index 000000000000..dd73997250be Binary files /dev/null and b/sound/direct_sound_samples/cries/cresselia.wav differ diff --git a/sound/direct_sound_samples/cries/croagunk.aif b/sound/direct_sound_samples/cries/croagunk.aif deleted file mode 100644 index c5d42a42bf25..000000000000 Binary files a/sound/direct_sound_samples/cries/croagunk.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/croagunk.wav b/sound/direct_sound_samples/cries/croagunk.wav new file mode 100644 index 000000000000..f3935f1b850d Binary files /dev/null and b/sound/direct_sound_samples/cries/croagunk.wav differ diff --git a/sound/direct_sound_samples/cries/crobat.aif b/sound/direct_sound_samples/cries/crobat.aif deleted file mode 100644 index 956be378c7e0..000000000000 Binary files a/sound/direct_sound_samples/cries/crobat.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/crobat.wav b/sound/direct_sound_samples/cries/crobat.wav new file mode 100644 index 000000000000..fdad8d4a6373 Binary files /dev/null and b/sound/direct_sound_samples/cries/crobat.wav differ diff --git a/sound/direct_sound_samples/cries/crocalor.aif b/sound/direct_sound_samples/cries/crocalor.aif deleted file mode 100644 index 9a622026df37..000000000000 Binary files a/sound/direct_sound_samples/cries/crocalor.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/crocalor.wav b/sound/direct_sound_samples/cries/crocalor.wav new file mode 100644 index 000000000000..17cba90fd9bd Binary files /dev/null and b/sound/direct_sound_samples/cries/crocalor.wav differ diff --git a/sound/direct_sound_samples/cries/croconaw.aif b/sound/direct_sound_samples/cries/croconaw.aif deleted file mode 100644 index b72db75f3ffd..000000000000 Binary files a/sound/direct_sound_samples/cries/croconaw.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/croconaw.wav b/sound/direct_sound_samples/cries/croconaw.wav new file mode 100644 index 000000000000..deb2a700357a Binary files /dev/null and b/sound/direct_sound_samples/cries/croconaw.wav differ diff --git a/sound/direct_sound_samples/cries/crustle.aif b/sound/direct_sound_samples/cries/crustle.aif deleted file mode 100644 index 62014a79c8e4..000000000000 Binary files a/sound/direct_sound_samples/cries/crustle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/crustle.wav b/sound/direct_sound_samples/cries/crustle.wav new file mode 100644 index 000000000000..6e1388bad89f Binary files /dev/null and b/sound/direct_sound_samples/cries/crustle.wav differ diff --git a/sound/direct_sound_samples/cries/cry_unused_265.aif b/sound/direct_sound_samples/cries/cry_unused_265.aif deleted file mode 100644 index 7f5965f06b60..000000000000 Binary files a/sound/direct_sound_samples/cries/cry_unused_265.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cry_unused_268.aif b/sound/direct_sound_samples/cries/cry_unused_268.aif deleted file mode 100644 index 5cae364c3801..000000000000 Binary files a/sound/direct_sound_samples/cries/cry_unused_268.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cryogonal.aif b/sound/direct_sound_samples/cries/cryogonal.aif deleted file mode 100644 index b2f551274ea8..000000000000 Binary files a/sound/direct_sound_samples/cries/cryogonal.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cryogonal.wav b/sound/direct_sound_samples/cries/cryogonal.wav new file mode 100644 index 000000000000..22f6b994dbf8 Binary files /dev/null and b/sound/direct_sound_samples/cries/cryogonal.wav differ diff --git a/sound/direct_sound_samples/cries/cubchoo.aif b/sound/direct_sound_samples/cries/cubchoo.aif deleted file mode 100644 index e10ca5a0ccf6..000000000000 Binary files a/sound/direct_sound_samples/cries/cubchoo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cubchoo.wav b/sound/direct_sound_samples/cries/cubchoo.wav new file mode 100644 index 000000000000..5bbe309951e2 Binary files /dev/null and b/sound/direct_sound_samples/cries/cubchoo.wav differ diff --git a/sound/direct_sound_samples/cries/cubone.aif b/sound/direct_sound_samples/cries/cubone.aif deleted file mode 100644 index 1ebc283ef899..000000000000 Binary files a/sound/direct_sound_samples/cries/cubone.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cubone.wav b/sound/direct_sound_samples/cries/cubone.wav new file mode 100644 index 000000000000..b198c25403ed Binary files /dev/null and b/sound/direct_sound_samples/cries/cubone.wav differ diff --git a/sound/direct_sound_samples/cries/cufant.aif b/sound/direct_sound_samples/cries/cufant.aif deleted file mode 100644 index 9f8f55b245d8..000000000000 Binary files a/sound/direct_sound_samples/cries/cufant.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cufant.wav b/sound/direct_sound_samples/cries/cufant.wav new file mode 100644 index 000000000000..a9cb12d5ed20 Binary files /dev/null and b/sound/direct_sound_samples/cries/cufant.wav differ diff --git a/sound/direct_sound_samples/cries/cursola.aif b/sound/direct_sound_samples/cries/cursola.aif deleted file mode 100644 index 1bdba8731ac9..000000000000 Binary files a/sound/direct_sound_samples/cries/cursola.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cursola.wav b/sound/direct_sound_samples/cries/cursola.wav new file mode 100644 index 000000000000..076aed18f500 Binary files /dev/null and b/sound/direct_sound_samples/cries/cursola.wav differ diff --git a/sound/direct_sound_samples/cries/cutiefly.aif b/sound/direct_sound_samples/cries/cutiefly.aif deleted file mode 100644 index 61535bbdd8e4..000000000000 Binary files a/sound/direct_sound_samples/cries/cutiefly.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cutiefly.wav b/sound/direct_sound_samples/cries/cutiefly.wav new file mode 100644 index 000000000000..612b06dc2258 Binary files /dev/null and b/sound/direct_sound_samples/cries/cutiefly.wav differ diff --git a/sound/direct_sound_samples/cries/cyclizar.aif b/sound/direct_sound_samples/cries/cyclizar.aif deleted file mode 100644 index eb32c91d5994..000000000000 Binary files a/sound/direct_sound_samples/cries/cyclizar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cyclizar.wav b/sound/direct_sound_samples/cries/cyclizar.wav new file mode 100644 index 000000000000..324dcbda08f2 Binary files /dev/null and b/sound/direct_sound_samples/cries/cyclizar.wav differ diff --git a/sound/direct_sound_samples/cries/cyndaquil.aif b/sound/direct_sound_samples/cries/cyndaquil.aif deleted file mode 100644 index 287c6496add7..000000000000 Binary files a/sound/direct_sound_samples/cries/cyndaquil.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/cyndaquil.wav b/sound/direct_sound_samples/cries/cyndaquil.wav new file mode 100644 index 000000000000..87921c52eb14 Binary files /dev/null and b/sound/direct_sound_samples/cries/cyndaquil.wav differ diff --git a/sound/direct_sound_samples/cries/dachsbun.aif b/sound/direct_sound_samples/cries/dachsbun.aif deleted file mode 100644 index 8e3ddbd781f6..000000000000 Binary files a/sound/direct_sound_samples/cries/dachsbun.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dachsbun.wav b/sound/direct_sound_samples/cries/dachsbun.wav new file mode 100644 index 000000000000..870cb99aee8e Binary files /dev/null and b/sound/direct_sound_samples/cries/dachsbun.wav differ diff --git a/sound/direct_sound_samples/cries/darkrai.aif b/sound/direct_sound_samples/cries/darkrai.aif deleted file mode 100644 index bfb37fca5b41..000000000000 Binary files a/sound/direct_sound_samples/cries/darkrai.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/darkrai.wav b/sound/direct_sound_samples/cries/darkrai.wav new file mode 100644 index 000000000000..3ff71721d5d3 Binary files /dev/null and b/sound/direct_sound_samples/cries/darkrai.wav differ diff --git a/sound/direct_sound_samples/cries/darmanitan.aif b/sound/direct_sound_samples/cries/darmanitan.aif deleted file mode 100644 index 902fdb69b4eb..000000000000 Binary files a/sound/direct_sound_samples/cries/darmanitan.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/darmanitan.wav b/sound/direct_sound_samples/cries/darmanitan.wav new file mode 100644 index 000000000000..c39aafe52e7b Binary files /dev/null and b/sound/direct_sound_samples/cries/darmanitan.wav differ diff --git a/sound/direct_sound_samples/cries/dartrix.aif b/sound/direct_sound_samples/cries/dartrix.aif deleted file mode 100644 index 894fefb3311c..000000000000 Binary files a/sound/direct_sound_samples/cries/dartrix.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dartrix.wav b/sound/direct_sound_samples/cries/dartrix.wav new file mode 100644 index 000000000000..ac4ef1cfa760 Binary files /dev/null and b/sound/direct_sound_samples/cries/dartrix.wav differ diff --git a/sound/direct_sound_samples/cries/darumaka.aif b/sound/direct_sound_samples/cries/darumaka.aif deleted file mode 100644 index 849f0f1dab7e..000000000000 Binary files a/sound/direct_sound_samples/cries/darumaka.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/darumaka.wav b/sound/direct_sound_samples/cries/darumaka.wav new file mode 100644 index 000000000000..f0feff895836 Binary files /dev/null and b/sound/direct_sound_samples/cries/darumaka.wav differ diff --git a/sound/direct_sound_samples/cries/decidueye.aif b/sound/direct_sound_samples/cries/decidueye.aif deleted file mode 100644 index dde3a574a9e9..000000000000 Binary files a/sound/direct_sound_samples/cries/decidueye.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/decidueye.wav b/sound/direct_sound_samples/cries/decidueye.wav new file mode 100644 index 000000000000..df44f57bc0f1 Binary files /dev/null and b/sound/direct_sound_samples/cries/decidueye.wav differ diff --git a/sound/direct_sound_samples/cries/dedenne.aif b/sound/direct_sound_samples/cries/dedenne.aif deleted file mode 100644 index 843f5cf38fe9..000000000000 Binary files a/sound/direct_sound_samples/cries/dedenne.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dedenne.wav b/sound/direct_sound_samples/cries/dedenne.wav new file mode 100644 index 000000000000..8b2472660bba Binary files /dev/null and b/sound/direct_sound_samples/cries/dedenne.wav differ diff --git a/sound/direct_sound_samples/cries/deerling.aif b/sound/direct_sound_samples/cries/deerling.aif deleted file mode 100644 index 9a4e8809b9e7..000000000000 Binary files a/sound/direct_sound_samples/cries/deerling.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/deerling.wav b/sound/direct_sound_samples/cries/deerling.wav new file mode 100644 index 000000000000..655c5916c315 Binary files /dev/null and b/sound/direct_sound_samples/cries/deerling.wav differ diff --git a/sound/direct_sound_samples/cries/deino.aif b/sound/direct_sound_samples/cries/deino.aif deleted file mode 100644 index e5074d082162..000000000000 Binary files a/sound/direct_sound_samples/cries/deino.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/deino.wav b/sound/direct_sound_samples/cries/deino.wav new file mode 100644 index 000000000000..f13aab187c0c Binary files /dev/null and b/sound/direct_sound_samples/cries/deino.wav differ diff --git a/sound/direct_sound_samples/cries/delcatty.aif b/sound/direct_sound_samples/cries/delcatty.aif deleted file mode 100644 index d4fe6c5c5912..000000000000 Binary files a/sound/direct_sound_samples/cries/delcatty.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/delcatty.wav b/sound/direct_sound_samples/cries/delcatty.wav new file mode 100644 index 000000000000..dce5e73b7ab2 Binary files /dev/null and b/sound/direct_sound_samples/cries/delcatty.wav differ diff --git a/sound/direct_sound_samples/cries/delibird.aif b/sound/direct_sound_samples/cries/delibird.aif deleted file mode 100644 index f2e0d4464237..000000000000 Binary files a/sound/direct_sound_samples/cries/delibird.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/delibird.wav b/sound/direct_sound_samples/cries/delibird.wav new file mode 100644 index 000000000000..7ccf645de649 Binary files /dev/null and b/sound/direct_sound_samples/cries/delibird.wav differ diff --git a/sound/direct_sound_samples/cries/delphox.aif b/sound/direct_sound_samples/cries/delphox.aif deleted file mode 100644 index 857af9f0ad20..000000000000 Binary files a/sound/direct_sound_samples/cries/delphox.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/delphox.wav b/sound/direct_sound_samples/cries/delphox.wav new file mode 100644 index 000000000000..b202343deb49 Binary files /dev/null and b/sound/direct_sound_samples/cries/delphox.wav differ diff --git a/sound/direct_sound_samples/cries/deoxys.aif b/sound/direct_sound_samples/cries/deoxys.aif deleted file mode 100644 index d9e3976e3c79..000000000000 Binary files a/sound/direct_sound_samples/cries/deoxys.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/deoxys.wav b/sound/direct_sound_samples/cries/deoxys.wav new file mode 100644 index 000000000000..7ed0f65cc1fc Binary files /dev/null and b/sound/direct_sound_samples/cries/deoxys.wav differ diff --git a/sound/direct_sound_samples/cries/dewgong.aif b/sound/direct_sound_samples/cries/dewgong.aif deleted file mode 100644 index daa3e5fd5ce7..000000000000 Binary files a/sound/direct_sound_samples/cries/dewgong.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dewgong.wav b/sound/direct_sound_samples/cries/dewgong.wav new file mode 100644 index 000000000000..24af04411a87 Binary files /dev/null and b/sound/direct_sound_samples/cries/dewgong.wav differ diff --git a/sound/direct_sound_samples/cries/dewott.aif b/sound/direct_sound_samples/cries/dewott.aif deleted file mode 100644 index e654be2372c5..000000000000 Binary files a/sound/direct_sound_samples/cries/dewott.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dewott.wav b/sound/direct_sound_samples/cries/dewott.wav new file mode 100644 index 000000000000..378ab5fbcbfb Binary files /dev/null and b/sound/direct_sound_samples/cries/dewott.wav differ diff --git a/sound/direct_sound_samples/cries/dewpider.aif b/sound/direct_sound_samples/cries/dewpider.aif deleted file mode 100644 index 0d8ade106b89..000000000000 Binary files a/sound/direct_sound_samples/cries/dewpider.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dewpider.wav b/sound/direct_sound_samples/cries/dewpider.wav new file mode 100644 index 000000000000..97ad9d826296 Binary files /dev/null and b/sound/direct_sound_samples/cries/dewpider.wav differ diff --git a/sound/direct_sound_samples/cries/dhelmise.aif b/sound/direct_sound_samples/cries/dhelmise.aif deleted file mode 100644 index 892faf19094d..000000000000 Binary files a/sound/direct_sound_samples/cries/dhelmise.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dhelmise.wav b/sound/direct_sound_samples/cries/dhelmise.wav new file mode 100644 index 000000000000..0659563c7658 Binary files /dev/null and b/sound/direct_sound_samples/cries/dhelmise.wav differ diff --git a/sound/direct_sound_samples/cries/dialga.aif b/sound/direct_sound_samples/cries/dialga.aif deleted file mode 100644 index ead8acb9a1bf..000000000000 Binary files a/sound/direct_sound_samples/cries/dialga.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dialga.wav b/sound/direct_sound_samples/cries/dialga.wav new file mode 100644 index 000000000000..bb421999f186 Binary files /dev/null and b/sound/direct_sound_samples/cries/dialga.wav differ diff --git a/sound/direct_sound_samples/cries/diancie.aif b/sound/direct_sound_samples/cries/diancie.aif deleted file mode 100644 index a32ad4ff93d1..000000000000 Binary files a/sound/direct_sound_samples/cries/diancie.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/diancie.wav b/sound/direct_sound_samples/cries/diancie.wav new file mode 100644 index 000000000000..ce1a602ebb3b Binary files /dev/null and b/sound/direct_sound_samples/cries/diancie.wav differ diff --git a/sound/direct_sound_samples/cries/diancie_mega.aif b/sound/direct_sound_samples/cries/diancie_mega.aif deleted file mode 100644 index be6268315395..000000000000 Binary files a/sound/direct_sound_samples/cries/diancie_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/diancie_mega.wav b/sound/direct_sound_samples/cries/diancie_mega.wav new file mode 100644 index 000000000000..80bec59a51ec Binary files /dev/null and b/sound/direct_sound_samples/cries/diancie_mega.wav differ diff --git a/sound/direct_sound_samples/cries/diggersby.aif b/sound/direct_sound_samples/cries/diggersby.aif deleted file mode 100644 index 10dffad8eeed..000000000000 Binary files a/sound/direct_sound_samples/cries/diggersby.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/diggersby.wav b/sound/direct_sound_samples/cries/diggersby.wav new file mode 100644 index 000000000000..af1792443c36 Binary files /dev/null and b/sound/direct_sound_samples/cries/diggersby.wav differ diff --git a/sound/direct_sound_samples/cries/diglett.aif b/sound/direct_sound_samples/cries/diglett.aif deleted file mode 100644 index cd212878fd77..000000000000 Binary files a/sound/direct_sound_samples/cries/diglett.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/diglett.wav b/sound/direct_sound_samples/cries/diglett.wav new file mode 100644 index 000000000000..8eecd3bedb33 Binary files /dev/null and b/sound/direct_sound_samples/cries/diglett.wav differ diff --git a/sound/direct_sound_samples/cries/dipplin.aif b/sound/direct_sound_samples/cries/dipplin.aif deleted file mode 100644 index 5591528f9bf9..000000000000 Binary files a/sound/direct_sound_samples/cries/dipplin.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dipplin.wav b/sound/direct_sound_samples/cries/dipplin.wav new file mode 100644 index 000000000000..79f2d7a74c08 Binary files /dev/null and b/sound/direct_sound_samples/cries/dipplin.wav differ diff --git a/sound/direct_sound_samples/cries/ditto.aif b/sound/direct_sound_samples/cries/ditto.aif deleted file mode 100644 index 8a1de24b254f..000000000000 Binary files a/sound/direct_sound_samples/cries/ditto.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ditto.wav b/sound/direct_sound_samples/cries/ditto.wav new file mode 100644 index 000000000000..bbd9d0280421 Binary files /dev/null and b/sound/direct_sound_samples/cries/ditto.wav differ diff --git a/sound/direct_sound_samples/cries/dodrio.aif b/sound/direct_sound_samples/cries/dodrio.aif deleted file mode 100644 index 507e4ef8762e..000000000000 Binary files a/sound/direct_sound_samples/cries/dodrio.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dodrio.wav b/sound/direct_sound_samples/cries/dodrio.wav new file mode 100644 index 000000000000..e43a8a9770e1 Binary files /dev/null and b/sound/direct_sound_samples/cries/dodrio.wav differ diff --git a/sound/direct_sound_samples/cries/doduo.aif b/sound/direct_sound_samples/cries/doduo.aif deleted file mode 100644 index 02c736d5a0c2..000000000000 Binary files a/sound/direct_sound_samples/cries/doduo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/doduo.wav b/sound/direct_sound_samples/cries/doduo.wav new file mode 100644 index 000000000000..065e9fd62fb6 Binary files /dev/null and b/sound/direct_sound_samples/cries/doduo.wav differ diff --git a/sound/direct_sound_samples/cries/dolliv.aif b/sound/direct_sound_samples/cries/dolliv.aif deleted file mode 100644 index d0aae0c9ecf9..000000000000 Binary files a/sound/direct_sound_samples/cries/dolliv.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dolliv.wav b/sound/direct_sound_samples/cries/dolliv.wav new file mode 100644 index 000000000000..df8eb73f8126 Binary files /dev/null and b/sound/direct_sound_samples/cries/dolliv.wav differ diff --git a/sound/direct_sound_samples/cries/dondozo.aif b/sound/direct_sound_samples/cries/dondozo.aif deleted file mode 100644 index eddac5cc27f0..000000000000 Binary files a/sound/direct_sound_samples/cries/dondozo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dondozo.wav b/sound/direct_sound_samples/cries/dondozo.wav new file mode 100644 index 000000000000..1462faa4a967 Binary files /dev/null and b/sound/direct_sound_samples/cries/dondozo.wav differ diff --git a/sound/direct_sound_samples/cries/donphan.aif b/sound/direct_sound_samples/cries/donphan.aif deleted file mode 100644 index 795cdaef4529..000000000000 Binary files a/sound/direct_sound_samples/cries/donphan.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/donphan.wav b/sound/direct_sound_samples/cries/donphan.wav new file mode 100644 index 000000000000..ba6caf5bd860 Binary files /dev/null and b/sound/direct_sound_samples/cries/donphan.wav differ diff --git a/sound/direct_sound_samples/cries/dottler.aif b/sound/direct_sound_samples/cries/dottler.aif deleted file mode 100644 index 4ab520a4aedb..000000000000 Binary files a/sound/direct_sound_samples/cries/dottler.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dottler.wav b/sound/direct_sound_samples/cries/dottler.wav new file mode 100644 index 000000000000..7c21ff12519a Binary files /dev/null and b/sound/direct_sound_samples/cries/dottler.wav differ diff --git a/sound/direct_sound_samples/cries/doublade.aif b/sound/direct_sound_samples/cries/doublade.aif deleted file mode 100644 index d931b3de0ad5..000000000000 Binary files a/sound/direct_sound_samples/cries/doublade.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/doublade.wav b/sound/direct_sound_samples/cries/doublade.wav new file mode 100644 index 000000000000..4b76e5cccec8 Binary files /dev/null and b/sound/direct_sound_samples/cries/doublade.wav differ diff --git a/sound/direct_sound_samples/cries/dracovish.aif b/sound/direct_sound_samples/cries/dracovish.aif deleted file mode 100644 index e59b15f27426..000000000000 Binary files a/sound/direct_sound_samples/cries/dracovish.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dracovish.wav b/sound/direct_sound_samples/cries/dracovish.wav new file mode 100644 index 000000000000..1d8e2ee1f235 Binary files /dev/null and b/sound/direct_sound_samples/cries/dracovish.wav differ diff --git a/sound/direct_sound_samples/cries/dracozolt.aif b/sound/direct_sound_samples/cries/dracozolt.aif deleted file mode 100644 index 0c2b86f4b0d9..000000000000 Binary files a/sound/direct_sound_samples/cries/dracozolt.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dracozolt.wav b/sound/direct_sound_samples/cries/dracozolt.wav new file mode 100644 index 000000000000..bce799d02668 Binary files /dev/null and b/sound/direct_sound_samples/cries/dracozolt.wav differ diff --git a/sound/direct_sound_samples/cries/dragalge.aif b/sound/direct_sound_samples/cries/dragalge.aif deleted file mode 100644 index a9d11e9b65d2..000000000000 Binary files a/sound/direct_sound_samples/cries/dragalge.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dragalge.wav b/sound/direct_sound_samples/cries/dragalge.wav new file mode 100644 index 000000000000..a4ce94444cc0 Binary files /dev/null and b/sound/direct_sound_samples/cries/dragalge.wav differ diff --git a/sound/direct_sound_samples/cries/dragapult.aif b/sound/direct_sound_samples/cries/dragapult.aif deleted file mode 100644 index 7e34c9bb1be4..000000000000 Binary files a/sound/direct_sound_samples/cries/dragapult.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dragapult.wav b/sound/direct_sound_samples/cries/dragapult.wav new file mode 100644 index 000000000000..b0086241f5eb Binary files /dev/null and b/sound/direct_sound_samples/cries/dragapult.wav differ diff --git a/sound/direct_sound_samples/cries/dragonair.aif b/sound/direct_sound_samples/cries/dragonair.aif deleted file mode 100644 index 6cdc594f6374..000000000000 Binary files a/sound/direct_sound_samples/cries/dragonair.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dragonair.wav b/sound/direct_sound_samples/cries/dragonair.wav new file mode 100644 index 000000000000..3fd2efee29a3 Binary files /dev/null and b/sound/direct_sound_samples/cries/dragonair.wav differ diff --git a/sound/direct_sound_samples/cries/dragonite.aif b/sound/direct_sound_samples/cries/dragonite.aif deleted file mode 100644 index ab1a7af1c17e..000000000000 Binary files a/sound/direct_sound_samples/cries/dragonite.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dragonite.wav b/sound/direct_sound_samples/cries/dragonite.wav new file mode 100644 index 000000000000..8517e0da0f3a Binary files /dev/null and b/sound/direct_sound_samples/cries/dragonite.wav differ diff --git a/sound/direct_sound_samples/cries/drakloak.aif b/sound/direct_sound_samples/cries/drakloak.aif deleted file mode 100644 index 7b9beaad8978..000000000000 Binary files a/sound/direct_sound_samples/cries/drakloak.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/drakloak.wav b/sound/direct_sound_samples/cries/drakloak.wav new file mode 100644 index 000000000000..e8cc04483f13 Binary files /dev/null and b/sound/direct_sound_samples/cries/drakloak.wav differ diff --git a/sound/direct_sound_samples/cries/drampa.aif b/sound/direct_sound_samples/cries/drampa.aif deleted file mode 100644 index 81e185711e18..000000000000 Binary files a/sound/direct_sound_samples/cries/drampa.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/drampa.wav b/sound/direct_sound_samples/cries/drampa.wav new file mode 100644 index 000000000000..fd7b9b4f5017 Binary files /dev/null and b/sound/direct_sound_samples/cries/drampa.wav differ diff --git a/sound/direct_sound_samples/cries/drapion.aif b/sound/direct_sound_samples/cries/drapion.aif deleted file mode 100644 index 4ce0382fdc46..000000000000 Binary files a/sound/direct_sound_samples/cries/drapion.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/drapion.wav b/sound/direct_sound_samples/cries/drapion.wav new file mode 100644 index 000000000000..2aae89e6697e Binary files /dev/null and b/sound/direct_sound_samples/cries/drapion.wav differ diff --git a/sound/direct_sound_samples/cries/dratini.aif b/sound/direct_sound_samples/cries/dratini.aif deleted file mode 100644 index d79420d9c60a..000000000000 Binary files a/sound/direct_sound_samples/cries/dratini.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dratini.wav b/sound/direct_sound_samples/cries/dratini.wav new file mode 100644 index 000000000000..711c6b9a3088 Binary files /dev/null and b/sound/direct_sound_samples/cries/dratini.wav differ diff --git a/sound/direct_sound_samples/cries/drednaw.aif b/sound/direct_sound_samples/cries/drednaw.aif deleted file mode 100644 index 8dd2c8540931..000000000000 Binary files a/sound/direct_sound_samples/cries/drednaw.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/drednaw.wav b/sound/direct_sound_samples/cries/drednaw.wav new file mode 100644 index 000000000000..ea83c848efc9 Binary files /dev/null and b/sound/direct_sound_samples/cries/drednaw.wav differ diff --git a/sound/direct_sound_samples/cries/dreepy.aif b/sound/direct_sound_samples/cries/dreepy.aif deleted file mode 100644 index 12217a7f49c2..000000000000 Binary files a/sound/direct_sound_samples/cries/dreepy.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dreepy.wav b/sound/direct_sound_samples/cries/dreepy.wav new file mode 100644 index 000000000000..9e3dd467660d Binary files /dev/null and b/sound/direct_sound_samples/cries/dreepy.wav differ diff --git a/sound/direct_sound_samples/cries/drifblim.aif b/sound/direct_sound_samples/cries/drifblim.aif deleted file mode 100644 index 891c49f2053d..000000000000 Binary files a/sound/direct_sound_samples/cries/drifblim.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/drifblim.wav b/sound/direct_sound_samples/cries/drifblim.wav new file mode 100644 index 000000000000..04d211e1ba7a Binary files /dev/null and b/sound/direct_sound_samples/cries/drifblim.wav differ diff --git a/sound/direct_sound_samples/cries/drifloon.aif b/sound/direct_sound_samples/cries/drifloon.aif deleted file mode 100644 index ba4c94e979ad..000000000000 Binary files a/sound/direct_sound_samples/cries/drifloon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/drifloon.wav b/sound/direct_sound_samples/cries/drifloon.wav new file mode 100644 index 000000000000..6cc70ceb2170 Binary files /dev/null and b/sound/direct_sound_samples/cries/drifloon.wav differ diff --git a/sound/direct_sound_samples/cries/drilbur.aif b/sound/direct_sound_samples/cries/drilbur.aif deleted file mode 100644 index 105867ee08e3..000000000000 Binary files a/sound/direct_sound_samples/cries/drilbur.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/drilbur.wav b/sound/direct_sound_samples/cries/drilbur.wav new file mode 100644 index 000000000000..c2c986331d18 Binary files /dev/null and b/sound/direct_sound_samples/cries/drilbur.wav differ diff --git a/sound/direct_sound_samples/cries/drizzile.aif b/sound/direct_sound_samples/cries/drizzile.aif deleted file mode 100644 index fde8abfbfe24..000000000000 Binary files a/sound/direct_sound_samples/cries/drizzile.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/drizzile.wav b/sound/direct_sound_samples/cries/drizzile.wav new file mode 100644 index 000000000000..ebea7fbca009 Binary files /dev/null and b/sound/direct_sound_samples/cries/drizzile.wav differ diff --git a/sound/direct_sound_samples/cries/drowzee.aif b/sound/direct_sound_samples/cries/drowzee.aif deleted file mode 100644 index d25203e123a0..000000000000 Binary files a/sound/direct_sound_samples/cries/drowzee.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/drowzee.wav b/sound/direct_sound_samples/cries/drowzee.wav new file mode 100644 index 000000000000..41321096630c Binary files /dev/null and b/sound/direct_sound_samples/cries/drowzee.wav differ diff --git a/sound/direct_sound_samples/cries/druddigon.aif b/sound/direct_sound_samples/cries/druddigon.aif deleted file mode 100644 index 01bed53f9200..000000000000 Binary files a/sound/direct_sound_samples/cries/druddigon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/druddigon.wav b/sound/direct_sound_samples/cries/druddigon.wav new file mode 100644 index 000000000000..b1c7c7ce21ef Binary files /dev/null and b/sound/direct_sound_samples/cries/druddigon.wav differ diff --git a/sound/direct_sound_samples/cries/dubwool.aif b/sound/direct_sound_samples/cries/dubwool.aif deleted file mode 100644 index 42f23089afed..000000000000 Binary files a/sound/direct_sound_samples/cries/dubwool.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dubwool.wav b/sound/direct_sound_samples/cries/dubwool.wav new file mode 100644 index 000000000000..a70cb4b18baa Binary files /dev/null and b/sound/direct_sound_samples/cries/dubwool.wav differ diff --git a/sound/direct_sound_samples/cries/ducklett.aif b/sound/direct_sound_samples/cries/ducklett.aif deleted file mode 100644 index a95520506b76..000000000000 Binary files a/sound/direct_sound_samples/cries/ducklett.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ducklett.wav b/sound/direct_sound_samples/cries/ducklett.wav new file mode 100644 index 000000000000..1748d7cb7582 Binary files /dev/null and b/sound/direct_sound_samples/cries/ducklett.wav differ diff --git a/sound/direct_sound_samples/cries/dudunsparce.aif b/sound/direct_sound_samples/cries/dudunsparce.aif deleted file mode 100644 index faec8aae5390..000000000000 Binary files a/sound/direct_sound_samples/cries/dudunsparce.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dudunsparce.wav b/sound/direct_sound_samples/cries/dudunsparce.wav new file mode 100644 index 000000000000..dc0244f2411c Binary files /dev/null and b/sound/direct_sound_samples/cries/dudunsparce.wav differ diff --git a/sound/direct_sound_samples/cries/dugtrio.aif b/sound/direct_sound_samples/cries/dugtrio.aif deleted file mode 100644 index 1a0a05ecd01e..000000000000 Binary files a/sound/direct_sound_samples/cries/dugtrio.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dugtrio.wav b/sound/direct_sound_samples/cries/dugtrio.wav new file mode 100644 index 000000000000..d159a2fae090 Binary files /dev/null and b/sound/direct_sound_samples/cries/dugtrio.wav differ diff --git a/sound/direct_sound_samples/cries/dunsparce.aif b/sound/direct_sound_samples/cries/dunsparce.aif deleted file mode 100644 index da70bedf0876..000000000000 Binary files a/sound/direct_sound_samples/cries/dunsparce.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dunsparce.wav b/sound/direct_sound_samples/cries/dunsparce.wav new file mode 100644 index 000000000000..5154546d1001 Binary files /dev/null and b/sound/direct_sound_samples/cries/dunsparce.wav differ diff --git a/sound/direct_sound_samples/cries/duosion.aif b/sound/direct_sound_samples/cries/duosion.aif deleted file mode 100644 index 4022984f1ae3..000000000000 Binary files a/sound/direct_sound_samples/cries/duosion.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/duosion.wav b/sound/direct_sound_samples/cries/duosion.wav new file mode 100644 index 000000000000..1850cd39377f Binary files /dev/null and b/sound/direct_sound_samples/cries/duosion.wav differ diff --git a/sound/direct_sound_samples/cries/duraludon.aif b/sound/direct_sound_samples/cries/duraludon.aif deleted file mode 100644 index 09be7c3ed9c3..000000000000 Binary files a/sound/direct_sound_samples/cries/duraludon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/duraludon.wav b/sound/direct_sound_samples/cries/duraludon.wav new file mode 100644 index 000000000000..ae0345be1476 Binary files /dev/null and b/sound/direct_sound_samples/cries/duraludon.wav differ diff --git a/sound/direct_sound_samples/cries/durant.aif b/sound/direct_sound_samples/cries/durant.aif deleted file mode 100644 index c0b19642c1da..000000000000 Binary files a/sound/direct_sound_samples/cries/durant.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/durant.wav b/sound/direct_sound_samples/cries/durant.wav new file mode 100644 index 000000000000..8a798caf7f1b Binary files /dev/null and b/sound/direct_sound_samples/cries/durant.wav differ diff --git a/sound/direct_sound_samples/cries/dusclops.aif b/sound/direct_sound_samples/cries/dusclops.aif deleted file mode 100644 index 084c74ee8729..000000000000 Binary files a/sound/direct_sound_samples/cries/dusclops.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dusclops.wav b/sound/direct_sound_samples/cries/dusclops.wav new file mode 100644 index 000000000000..81353887b95d Binary files /dev/null and b/sound/direct_sound_samples/cries/dusclops.wav differ diff --git a/sound/direct_sound_samples/cries/dusknoir.aif b/sound/direct_sound_samples/cries/dusknoir.aif deleted file mode 100644 index bb1d60567121..000000000000 Binary files a/sound/direct_sound_samples/cries/dusknoir.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dusknoir.wav b/sound/direct_sound_samples/cries/dusknoir.wav new file mode 100644 index 000000000000..333bd0448cca Binary files /dev/null and b/sound/direct_sound_samples/cries/dusknoir.wav differ diff --git a/sound/direct_sound_samples/cries/duskull.aif b/sound/direct_sound_samples/cries/duskull.aif deleted file mode 100644 index 523997cbf0a9..000000000000 Binary files a/sound/direct_sound_samples/cries/duskull.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/duskull.wav b/sound/direct_sound_samples/cries/duskull.wav new file mode 100644 index 000000000000..eba8fc3ff1bd Binary files /dev/null and b/sound/direct_sound_samples/cries/duskull.wav differ diff --git a/sound/direct_sound_samples/cries/dustox.aif b/sound/direct_sound_samples/cries/dustox.aif deleted file mode 100644 index 5ab919b520f2..000000000000 Binary files a/sound/direct_sound_samples/cries/dustox.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dustox.wav b/sound/direct_sound_samples/cries/dustox.wav new file mode 100644 index 000000000000..42f23c12896d Binary files /dev/null and b/sound/direct_sound_samples/cries/dustox.wav differ diff --git a/sound/direct_sound_samples/cries/dwebble.aif b/sound/direct_sound_samples/cries/dwebble.aif deleted file mode 100644 index 1aff10332332..000000000000 Binary files a/sound/direct_sound_samples/cries/dwebble.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/dwebble.wav b/sound/direct_sound_samples/cries/dwebble.wav new file mode 100644 index 000000000000..81d2af0f7f8c Binary files /dev/null and b/sound/direct_sound_samples/cries/dwebble.wav differ diff --git a/sound/direct_sound_samples/cries/eelektrik.aif b/sound/direct_sound_samples/cries/eelektrik.aif deleted file mode 100644 index d39453bc0d83..000000000000 Binary files a/sound/direct_sound_samples/cries/eelektrik.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/eelektrik.wav b/sound/direct_sound_samples/cries/eelektrik.wav new file mode 100644 index 000000000000..d0bf262cd3da Binary files /dev/null and b/sound/direct_sound_samples/cries/eelektrik.wav differ diff --git a/sound/direct_sound_samples/cries/eelektross.aif b/sound/direct_sound_samples/cries/eelektross.aif deleted file mode 100644 index b618fa5e9775..000000000000 Binary files a/sound/direct_sound_samples/cries/eelektross.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/eelektross.wav b/sound/direct_sound_samples/cries/eelektross.wav new file mode 100644 index 000000000000..4b65a7acedf8 Binary files /dev/null and b/sound/direct_sound_samples/cries/eelektross.wav differ diff --git a/sound/direct_sound_samples/cries/eevee.aif b/sound/direct_sound_samples/cries/eevee.aif deleted file mode 100644 index 0706209843d8..000000000000 Binary files a/sound/direct_sound_samples/cries/eevee.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/eevee.wav b/sound/direct_sound_samples/cries/eevee.wav new file mode 100644 index 000000000000..e21ce1f0e7e5 Binary files /dev/null and b/sound/direct_sound_samples/cries/eevee.wav differ diff --git a/sound/direct_sound_samples/cries/eiscue_ice_face.aif b/sound/direct_sound_samples/cries/eiscue_ice_face.aif deleted file mode 100644 index 5c6c7d52ddb8..000000000000 Binary files a/sound/direct_sound_samples/cries/eiscue_ice_face.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/eiscue_ice_face.wav b/sound/direct_sound_samples/cries/eiscue_ice_face.wav new file mode 100644 index 000000000000..cf21e9ed35f6 Binary files /dev/null and b/sound/direct_sound_samples/cries/eiscue_ice_face.wav differ diff --git a/sound/direct_sound_samples/cries/eiscue_noice_face.aif b/sound/direct_sound_samples/cries/eiscue_noice_face.aif deleted file mode 100644 index e591e3e2ca7e..000000000000 Binary files a/sound/direct_sound_samples/cries/eiscue_noice_face.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/eiscue_noice_face.wav b/sound/direct_sound_samples/cries/eiscue_noice_face.wav new file mode 100644 index 000000000000..b928e3211c6a Binary files /dev/null and b/sound/direct_sound_samples/cries/eiscue_noice_face.wav differ diff --git a/sound/direct_sound_samples/cries/ekans.aif b/sound/direct_sound_samples/cries/ekans.aif deleted file mode 100644 index 80bc2fdfec2a..000000000000 Binary files a/sound/direct_sound_samples/cries/ekans.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ekans.wav b/sound/direct_sound_samples/cries/ekans.wav new file mode 100644 index 000000000000..2ae3e4a180e1 Binary files /dev/null and b/sound/direct_sound_samples/cries/ekans.wav differ diff --git a/sound/direct_sound_samples/cries/eldegoss.aif b/sound/direct_sound_samples/cries/eldegoss.aif deleted file mode 100644 index 56f9419b369f..000000000000 Binary files a/sound/direct_sound_samples/cries/eldegoss.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/eldegoss.wav b/sound/direct_sound_samples/cries/eldegoss.wav new file mode 100644 index 000000000000..d5c9ccd7e692 Binary files /dev/null and b/sound/direct_sound_samples/cries/eldegoss.wav differ diff --git a/sound/direct_sound_samples/cries/electabuzz.aif b/sound/direct_sound_samples/cries/electabuzz.aif deleted file mode 100644 index 6071f1d4a920..000000000000 Binary files a/sound/direct_sound_samples/cries/electabuzz.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/electabuzz.wav b/sound/direct_sound_samples/cries/electabuzz.wav new file mode 100644 index 000000000000..b555d6631ad5 Binary files /dev/null and b/sound/direct_sound_samples/cries/electabuzz.wav differ diff --git a/sound/direct_sound_samples/cries/electivire.aif b/sound/direct_sound_samples/cries/electivire.aif deleted file mode 100644 index 9b9c17907d23..000000000000 Binary files a/sound/direct_sound_samples/cries/electivire.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/electivire.wav b/sound/direct_sound_samples/cries/electivire.wav new file mode 100644 index 000000000000..33f250d0468e Binary files /dev/null and b/sound/direct_sound_samples/cries/electivire.wav differ diff --git a/sound/direct_sound_samples/cries/electrike.aif b/sound/direct_sound_samples/cries/electrike.aif deleted file mode 100644 index e7dcc6424840..000000000000 Binary files a/sound/direct_sound_samples/cries/electrike.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/electrike.wav b/sound/direct_sound_samples/cries/electrike.wav new file mode 100644 index 000000000000..8a210865bfbc Binary files /dev/null and b/sound/direct_sound_samples/cries/electrike.wav differ diff --git a/sound/direct_sound_samples/cries/electrode.aif b/sound/direct_sound_samples/cries/electrode.aif deleted file mode 100644 index 96e627bba50c..000000000000 Binary files a/sound/direct_sound_samples/cries/electrode.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/electrode.wav b/sound/direct_sound_samples/cries/electrode.wav new file mode 100644 index 000000000000..8f2852146413 Binary files /dev/null and b/sound/direct_sound_samples/cries/electrode.wav differ diff --git a/sound/direct_sound_samples/cries/elekid.aif b/sound/direct_sound_samples/cries/elekid.aif deleted file mode 100644 index 99b3f959d5ed..000000000000 Binary files a/sound/direct_sound_samples/cries/elekid.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/elekid.wav b/sound/direct_sound_samples/cries/elekid.wav new file mode 100644 index 000000000000..82a9a2f675ba Binary files /dev/null and b/sound/direct_sound_samples/cries/elekid.wav differ diff --git a/sound/direct_sound_samples/cries/elgyem.aif b/sound/direct_sound_samples/cries/elgyem.aif deleted file mode 100644 index 04e9ec7ab66c..000000000000 Binary files a/sound/direct_sound_samples/cries/elgyem.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/elgyem.wav b/sound/direct_sound_samples/cries/elgyem.wav new file mode 100644 index 000000000000..825cb7f86a06 Binary files /dev/null and b/sound/direct_sound_samples/cries/elgyem.wav differ diff --git a/sound/direct_sound_samples/cries/emboar.aif b/sound/direct_sound_samples/cries/emboar.aif deleted file mode 100644 index 7bf61d285eb4..000000000000 Binary files a/sound/direct_sound_samples/cries/emboar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/emboar.wav b/sound/direct_sound_samples/cries/emboar.wav new file mode 100644 index 000000000000..29d0d5dbe17f Binary files /dev/null and b/sound/direct_sound_samples/cries/emboar.wav differ diff --git a/sound/direct_sound_samples/cries/emolga.aif b/sound/direct_sound_samples/cries/emolga.aif deleted file mode 100644 index 20172f144692..000000000000 Binary files a/sound/direct_sound_samples/cries/emolga.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/emolga.wav b/sound/direct_sound_samples/cries/emolga.wav new file mode 100644 index 000000000000..a15a472d96c0 Binary files /dev/null and b/sound/direct_sound_samples/cries/emolga.wav differ diff --git a/sound/direct_sound_samples/cries/empoleon.aif b/sound/direct_sound_samples/cries/empoleon.aif deleted file mode 100644 index 742bdf812473..000000000000 Binary files a/sound/direct_sound_samples/cries/empoleon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/empoleon.wav b/sound/direct_sound_samples/cries/empoleon.wav new file mode 100644 index 000000000000..e7edb4111f52 Binary files /dev/null and b/sound/direct_sound_samples/cries/empoleon.wav differ diff --git a/sound/direct_sound_samples/cries/enamorus_incarnate.aif b/sound/direct_sound_samples/cries/enamorus_incarnate.aif deleted file mode 100644 index 71068d9b7b52..000000000000 Binary files a/sound/direct_sound_samples/cries/enamorus_incarnate.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/enamorus_incarnate.wav b/sound/direct_sound_samples/cries/enamorus_incarnate.wav new file mode 100644 index 000000000000..22cb614f7bf8 Binary files /dev/null and b/sound/direct_sound_samples/cries/enamorus_incarnate.wav differ diff --git a/sound/direct_sound_samples/cries/enamorus_therian.aif b/sound/direct_sound_samples/cries/enamorus_therian.aif deleted file mode 100644 index 4286a98b69bd..000000000000 Binary files a/sound/direct_sound_samples/cries/enamorus_therian.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/enamorus_therian.wav b/sound/direct_sound_samples/cries/enamorus_therian.wav new file mode 100644 index 000000000000..d7fa97072bd5 Binary files /dev/null and b/sound/direct_sound_samples/cries/enamorus_therian.wav differ diff --git a/sound/direct_sound_samples/cries/entei.aif b/sound/direct_sound_samples/cries/entei.aif deleted file mode 100644 index 1e5eff687675..000000000000 Binary files a/sound/direct_sound_samples/cries/entei.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/entei.wav b/sound/direct_sound_samples/cries/entei.wav new file mode 100644 index 000000000000..cf7e9c0c2fac Binary files /dev/null and b/sound/direct_sound_samples/cries/entei.wav differ diff --git a/sound/direct_sound_samples/cries/escavalier.aif b/sound/direct_sound_samples/cries/escavalier.aif deleted file mode 100644 index 7ef48d2293e2..000000000000 Binary files a/sound/direct_sound_samples/cries/escavalier.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/escavalier.wav b/sound/direct_sound_samples/cries/escavalier.wav new file mode 100644 index 000000000000..950107a7e1c5 Binary files /dev/null and b/sound/direct_sound_samples/cries/escavalier.wav differ diff --git a/sound/direct_sound_samples/cries/espathra.aif b/sound/direct_sound_samples/cries/espathra.aif deleted file mode 100644 index 5a196762b134..000000000000 Binary files a/sound/direct_sound_samples/cries/espathra.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/espathra.wav b/sound/direct_sound_samples/cries/espathra.wav new file mode 100644 index 000000000000..8959b7c05ab1 Binary files /dev/null and b/sound/direct_sound_samples/cries/espathra.wav differ diff --git a/sound/direct_sound_samples/cries/espeon.aif b/sound/direct_sound_samples/cries/espeon.aif deleted file mode 100644 index bf1f52c94dd2..000000000000 Binary files a/sound/direct_sound_samples/cries/espeon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/espeon.wav b/sound/direct_sound_samples/cries/espeon.wav new file mode 100644 index 000000000000..20743268e11e Binary files /dev/null and b/sound/direct_sound_samples/cries/espeon.wav differ diff --git a/sound/direct_sound_samples/cries/espurr.aif b/sound/direct_sound_samples/cries/espurr.aif deleted file mode 100644 index 6d82769b36af..000000000000 Binary files a/sound/direct_sound_samples/cries/espurr.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/espurr.wav b/sound/direct_sound_samples/cries/espurr.wav new file mode 100644 index 000000000000..4cb90cdf66f1 Binary files /dev/null and b/sound/direct_sound_samples/cries/espurr.wav differ diff --git a/sound/direct_sound_samples/cries/eternatus.aif b/sound/direct_sound_samples/cries/eternatus.aif deleted file mode 100644 index 235bba61f9b1..000000000000 Binary files a/sound/direct_sound_samples/cries/eternatus.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/eternatus.wav b/sound/direct_sound_samples/cries/eternatus.wav new file mode 100644 index 000000000000..64f43baa7855 Binary files /dev/null and b/sound/direct_sound_samples/cries/eternatus.wav differ diff --git a/sound/direct_sound_samples/cries/eternatus_eternamax.aif b/sound/direct_sound_samples/cries/eternatus_eternamax.aif deleted file mode 100644 index 7c6b292d4dce..000000000000 Binary files a/sound/direct_sound_samples/cries/eternatus_eternamax.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/eternatus_eternamax.wav b/sound/direct_sound_samples/cries/eternatus_eternamax.wav new file mode 100644 index 000000000000..3d7638de16ac Binary files /dev/null and b/sound/direct_sound_samples/cries/eternatus_eternamax.wav differ diff --git a/sound/direct_sound_samples/cries/excadrill.aif b/sound/direct_sound_samples/cries/excadrill.aif deleted file mode 100644 index cd372dffdb38..000000000000 Binary files a/sound/direct_sound_samples/cries/excadrill.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/excadrill.wav b/sound/direct_sound_samples/cries/excadrill.wav new file mode 100644 index 000000000000..4ba4a2d1ffa0 Binary files /dev/null and b/sound/direct_sound_samples/cries/excadrill.wav differ diff --git a/sound/direct_sound_samples/cries/exeggcute.aif b/sound/direct_sound_samples/cries/exeggcute.aif deleted file mode 100644 index bd634c757040..000000000000 Binary files a/sound/direct_sound_samples/cries/exeggcute.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/exeggcute.wav b/sound/direct_sound_samples/cries/exeggcute.wav new file mode 100644 index 000000000000..bfd825f8003a Binary files /dev/null and b/sound/direct_sound_samples/cries/exeggcute.wav differ diff --git a/sound/direct_sound_samples/cries/exeggutor.aif b/sound/direct_sound_samples/cries/exeggutor.aif deleted file mode 100644 index 094b27bc6f30..000000000000 Binary files a/sound/direct_sound_samples/cries/exeggutor.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/exeggutor.wav b/sound/direct_sound_samples/cries/exeggutor.wav new file mode 100644 index 000000000000..f2a0d6bedc49 Binary files /dev/null and b/sound/direct_sound_samples/cries/exeggutor.wav differ diff --git a/sound/direct_sound_samples/cries/exploud.aif b/sound/direct_sound_samples/cries/exploud.aif deleted file mode 100644 index 98dafb1ee19e..000000000000 Binary files a/sound/direct_sound_samples/cries/exploud.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/exploud.wav b/sound/direct_sound_samples/cries/exploud.wav new file mode 100644 index 000000000000..9b3cbf896bd2 Binary files /dev/null and b/sound/direct_sound_samples/cries/exploud.wav differ diff --git a/sound/direct_sound_samples/cries/falinks.aif b/sound/direct_sound_samples/cries/falinks.aif deleted file mode 100644 index 6fa1af8df422..000000000000 Binary files a/sound/direct_sound_samples/cries/falinks.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/falinks.wav b/sound/direct_sound_samples/cries/falinks.wav new file mode 100644 index 000000000000..f3df8ba9cfa5 Binary files /dev/null and b/sound/direct_sound_samples/cries/falinks.wav differ diff --git a/sound/direct_sound_samples/cries/farfetchd.aif b/sound/direct_sound_samples/cries/farfetchd.aif deleted file mode 100644 index 5a710ed7de15..000000000000 Binary files a/sound/direct_sound_samples/cries/farfetchd.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/farfetchd.wav b/sound/direct_sound_samples/cries/farfetchd.wav new file mode 100644 index 000000000000..d090445d414e Binary files /dev/null and b/sound/direct_sound_samples/cries/farfetchd.wav differ diff --git a/sound/direct_sound_samples/cries/farigiraf.aif b/sound/direct_sound_samples/cries/farigiraf.aif deleted file mode 100644 index d862b0d30e2f..000000000000 Binary files a/sound/direct_sound_samples/cries/farigiraf.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/farigiraf.wav b/sound/direct_sound_samples/cries/farigiraf.wav new file mode 100644 index 000000000000..9b3c261949eb Binary files /dev/null and b/sound/direct_sound_samples/cries/farigiraf.wav differ diff --git a/sound/direct_sound_samples/cries/fearow.aif b/sound/direct_sound_samples/cries/fearow.aif deleted file mode 100644 index 792269848223..000000000000 Binary files a/sound/direct_sound_samples/cries/fearow.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/fearow.wav b/sound/direct_sound_samples/cries/fearow.wav new file mode 100644 index 000000000000..6ef7eadee907 Binary files /dev/null and b/sound/direct_sound_samples/cries/fearow.wav differ diff --git a/sound/direct_sound_samples/cries/feebas.aif b/sound/direct_sound_samples/cries/feebas.aif deleted file mode 100644 index fc6e757134e6..000000000000 Binary files a/sound/direct_sound_samples/cries/feebas.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/feebas.wav b/sound/direct_sound_samples/cries/feebas.wav new file mode 100644 index 000000000000..a8f60a55f6b1 Binary files /dev/null and b/sound/direct_sound_samples/cries/feebas.wav differ diff --git a/sound/direct_sound_samples/cries/fennekin.aif b/sound/direct_sound_samples/cries/fennekin.aif deleted file mode 100644 index 3feb83cdf8df..000000000000 Binary files a/sound/direct_sound_samples/cries/fennekin.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/fennekin.wav b/sound/direct_sound_samples/cries/fennekin.wav new file mode 100644 index 000000000000..3e187d6d1b87 Binary files /dev/null and b/sound/direct_sound_samples/cries/fennekin.wav differ diff --git a/sound/direct_sound_samples/cries/feraligatr.aif b/sound/direct_sound_samples/cries/feraligatr.aif deleted file mode 100644 index c71d66722bf0..000000000000 Binary files a/sound/direct_sound_samples/cries/feraligatr.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/feraligatr.wav b/sound/direct_sound_samples/cries/feraligatr.wav new file mode 100644 index 000000000000..d1da192f9055 Binary files /dev/null and b/sound/direct_sound_samples/cries/feraligatr.wav differ diff --git a/sound/direct_sound_samples/cries/ferroseed.aif b/sound/direct_sound_samples/cries/ferroseed.aif deleted file mode 100644 index 1acd8342d0c3..000000000000 Binary files a/sound/direct_sound_samples/cries/ferroseed.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ferroseed.wav b/sound/direct_sound_samples/cries/ferroseed.wav new file mode 100644 index 000000000000..0c74da6aeadb Binary files /dev/null and b/sound/direct_sound_samples/cries/ferroseed.wav differ diff --git a/sound/direct_sound_samples/cries/ferrothorn.aif b/sound/direct_sound_samples/cries/ferrothorn.aif deleted file mode 100644 index 7e7f1ad3ad7b..000000000000 Binary files a/sound/direct_sound_samples/cries/ferrothorn.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ferrothorn.wav b/sound/direct_sound_samples/cries/ferrothorn.wav new file mode 100644 index 000000000000..30d61a2f2b0a Binary files /dev/null and b/sound/direct_sound_samples/cries/ferrothorn.wav differ diff --git a/sound/direct_sound_samples/cries/fezandipiti.aif b/sound/direct_sound_samples/cries/fezandipiti.aif deleted file mode 100644 index d24a32b9c7d2..000000000000 Binary files a/sound/direct_sound_samples/cries/fezandipiti.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/fezandipiti.wav b/sound/direct_sound_samples/cries/fezandipiti.wav new file mode 100644 index 000000000000..cb99f08edd76 Binary files /dev/null and b/sound/direct_sound_samples/cries/fezandipiti.wav differ diff --git a/sound/direct_sound_samples/cries/fidough.aif b/sound/direct_sound_samples/cries/fidough.aif deleted file mode 100644 index f2063bc79b4a..000000000000 Binary files a/sound/direct_sound_samples/cries/fidough.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/fidough.wav b/sound/direct_sound_samples/cries/fidough.wav new file mode 100644 index 000000000000..d0af55bac819 Binary files /dev/null and b/sound/direct_sound_samples/cries/fidough.wav differ diff --git a/sound/direct_sound_samples/cries/finizen.aif b/sound/direct_sound_samples/cries/finizen.aif deleted file mode 100644 index 07af24f69611..000000000000 Binary files a/sound/direct_sound_samples/cries/finizen.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/finizen.wav b/sound/direct_sound_samples/cries/finizen.wav new file mode 100644 index 000000000000..f7d338dd7c4e Binary files /dev/null and b/sound/direct_sound_samples/cries/finizen.wav differ diff --git a/sound/direct_sound_samples/cries/finneon.aif b/sound/direct_sound_samples/cries/finneon.aif deleted file mode 100644 index c2fe2f38bac7..000000000000 Binary files a/sound/direct_sound_samples/cries/finneon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/finneon.wav b/sound/direct_sound_samples/cries/finneon.wav new file mode 100644 index 000000000000..d5a706b1c854 Binary files /dev/null and b/sound/direct_sound_samples/cries/finneon.wav differ diff --git a/sound/direct_sound_samples/cries/flaaffy.aif b/sound/direct_sound_samples/cries/flaaffy.aif deleted file mode 100644 index 068e82e76c05..000000000000 Binary files a/sound/direct_sound_samples/cries/flaaffy.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/flaaffy.wav b/sound/direct_sound_samples/cries/flaaffy.wav new file mode 100644 index 000000000000..a0cf3df06241 Binary files /dev/null and b/sound/direct_sound_samples/cries/flaaffy.wav differ diff --git a/sound/direct_sound_samples/cries/flabebe.aif b/sound/direct_sound_samples/cries/flabebe.aif deleted file mode 100644 index a6dbe0321c6f..000000000000 Binary files a/sound/direct_sound_samples/cries/flabebe.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/flabebe.wav b/sound/direct_sound_samples/cries/flabebe.wav new file mode 100644 index 000000000000..d93a0f4a4b22 Binary files /dev/null and b/sound/direct_sound_samples/cries/flabebe.wav differ diff --git a/sound/direct_sound_samples/cries/flamigo.aif b/sound/direct_sound_samples/cries/flamigo.aif deleted file mode 100644 index 2b022da5b07f..000000000000 Binary files a/sound/direct_sound_samples/cries/flamigo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/flamigo.wav b/sound/direct_sound_samples/cries/flamigo.wav new file mode 100644 index 000000000000..1a47bf593a9e Binary files /dev/null and b/sound/direct_sound_samples/cries/flamigo.wav differ diff --git a/sound/direct_sound_samples/cries/flapple.aif b/sound/direct_sound_samples/cries/flapple.aif deleted file mode 100644 index 844318022e57..000000000000 Binary files a/sound/direct_sound_samples/cries/flapple.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/flapple.wav b/sound/direct_sound_samples/cries/flapple.wav new file mode 100644 index 000000000000..4120296cc74e Binary files /dev/null and b/sound/direct_sound_samples/cries/flapple.wav differ diff --git a/sound/direct_sound_samples/cries/flareon.aif b/sound/direct_sound_samples/cries/flareon.aif deleted file mode 100644 index b8d33df49e57..000000000000 Binary files a/sound/direct_sound_samples/cries/flareon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/flareon.wav b/sound/direct_sound_samples/cries/flareon.wav new file mode 100644 index 000000000000..6bd51168b3c8 Binary files /dev/null and b/sound/direct_sound_samples/cries/flareon.wav differ diff --git a/sound/direct_sound_samples/cries/fletchinder.aif b/sound/direct_sound_samples/cries/fletchinder.aif deleted file mode 100644 index 2267e3fdfcc1..000000000000 Binary files a/sound/direct_sound_samples/cries/fletchinder.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/fletchinder.wav b/sound/direct_sound_samples/cries/fletchinder.wav new file mode 100644 index 000000000000..a5e0a7bac4f7 Binary files /dev/null and b/sound/direct_sound_samples/cries/fletchinder.wav differ diff --git a/sound/direct_sound_samples/cries/fletchling.aif b/sound/direct_sound_samples/cries/fletchling.aif deleted file mode 100644 index ce9085845fc0..000000000000 Binary files a/sound/direct_sound_samples/cries/fletchling.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/fletchling.wav b/sound/direct_sound_samples/cries/fletchling.wav new file mode 100644 index 000000000000..7b8cb393ec91 Binary files /dev/null and b/sound/direct_sound_samples/cries/fletchling.wav differ diff --git a/sound/direct_sound_samples/cries/flittle.aif b/sound/direct_sound_samples/cries/flittle.aif deleted file mode 100644 index d81016a64def..000000000000 Binary files a/sound/direct_sound_samples/cries/flittle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/flittle.wav b/sound/direct_sound_samples/cries/flittle.wav new file mode 100644 index 000000000000..da2b154d2a0c Binary files /dev/null and b/sound/direct_sound_samples/cries/flittle.wav differ diff --git a/sound/direct_sound_samples/cries/floatzel.aif b/sound/direct_sound_samples/cries/floatzel.aif deleted file mode 100644 index 36f34f5e9038..000000000000 Binary files a/sound/direct_sound_samples/cries/floatzel.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/floatzel.wav b/sound/direct_sound_samples/cries/floatzel.wav new file mode 100644 index 000000000000..33e8eecf4354 Binary files /dev/null and b/sound/direct_sound_samples/cries/floatzel.wav differ diff --git a/sound/direct_sound_samples/cries/floette.aif b/sound/direct_sound_samples/cries/floette.aif deleted file mode 100644 index 4244ce8eda6f..000000000000 Binary files a/sound/direct_sound_samples/cries/floette.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/floette.wav b/sound/direct_sound_samples/cries/floette.wav new file mode 100644 index 000000000000..36000d14ac47 Binary files /dev/null and b/sound/direct_sound_samples/cries/floette.wav differ diff --git a/sound/direct_sound_samples/cries/floette_eternal.aif b/sound/direct_sound_samples/cries/floette_eternal.aif deleted file mode 100644 index 386815f08208..000000000000 Binary files a/sound/direct_sound_samples/cries/floette_eternal.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/floette_eternal.wav b/sound/direct_sound_samples/cries/floette_eternal.wav new file mode 100644 index 000000000000..a4cc2b3a8158 Binary files /dev/null and b/sound/direct_sound_samples/cries/floette_eternal.wav differ diff --git a/sound/direct_sound_samples/cries/floragato.aif b/sound/direct_sound_samples/cries/floragato.aif deleted file mode 100644 index 4fc883242374..000000000000 Binary files a/sound/direct_sound_samples/cries/floragato.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/floragato.wav b/sound/direct_sound_samples/cries/floragato.wav new file mode 100644 index 000000000000..64fa6df859cf Binary files /dev/null and b/sound/direct_sound_samples/cries/floragato.wav differ diff --git a/sound/direct_sound_samples/cries/florges.aif b/sound/direct_sound_samples/cries/florges.aif deleted file mode 100644 index e652e68fa931..000000000000 Binary files a/sound/direct_sound_samples/cries/florges.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/florges.wav b/sound/direct_sound_samples/cries/florges.wav new file mode 100644 index 000000000000..180c6490bbca Binary files /dev/null and b/sound/direct_sound_samples/cries/florges.wav differ diff --git a/sound/direct_sound_samples/cries/flutter_mane.aif b/sound/direct_sound_samples/cries/flutter_mane.aif deleted file mode 100644 index ad4c636fe7f5..000000000000 Binary files a/sound/direct_sound_samples/cries/flutter_mane.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/flutter_mane.wav b/sound/direct_sound_samples/cries/flutter_mane.wav new file mode 100644 index 000000000000..c52aeabc5cb1 Binary files /dev/null and b/sound/direct_sound_samples/cries/flutter_mane.wav differ diff --git a/sound/direct_sound_samples/cries/flygon.aif b/sound/direct_sound_samples/cries/flygon.aif deleted file mode 100644 index c8b793f4f971..000000000000 Binary files a/sound/direct_sound_samples/cries/flygon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/flygon.wav b/sound/direct_sound_samples/cries/flygon.wav new file mode 100644 index 000000000000..b6c5d90ba029 Binary files /dev/null and b/sound/direct_sound_samples/cries/flygon.wav differ diff --git a/sound/direct_sound_samples/cries/fomantis.aif b/sound/direct_sound_samples/cries/fomantis.aif deleted file mode 100644 index a82e4d45249b..000000000000 Binary files a/sound/direct_sound_samples/cries/fomantis.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/fomantis.wav b/sound/direct_sound_samples/cries/fomantis.wav new file mode 100644 index 000000000000..d3de05db55d6 Binary files /dev/null and b/sound/direct_sound_samples/cries/fomantis.wav differ diff --git a/sound/direct_sound_samples/cries/foongus.aif b/sound/direct_sound_samples/cries/foongus.aif deleted file mode 100644 index ca83e1b475f7..000000000000 Binary files a/sound/direct_sound_samples/cries/foongus.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/foongus.wav b/sound/direct_sound_samples/cries/foongus.wav new file mode 100644 index 000000000000..6c2c2381e037 Binary files /dev/null and b/sound/direct_sound_samples/cries/foongus.wav differ diff --git a/sound/direct_sound_samples/cries/forretress.aif b/sound/direct_sound_samples/cries/forretress.aif deleted file mode 100644 index 9b8af8baa4b9..000000000000 Binary files a/sound/direct_sound_samples/cries/forretress.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/forretress.wav b/sound/direct_sound_samples/cries/forretress.wav new file mode 100644 index 000000000000..3f704f65b50c Binary files /dev/null and b/sound/direct_sound_samples/cries/forretress.wav differ diff --git a/sound/direct_sound_samples/cries/fraxure.aif b/sound/direct_sound_samples/cries/fraxure.aif deleted file mode 100644 index 4586702b00f4..000000000000 Binary files a/sound/direct_sound_samples/cries/fraxure.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/fraxure.wav b/sound/direct_sound_samples/cries/fraxure.wav new file mode 100644 index 000000000000..6759da7a1d03 Binary files /dev/null and b/sound/direct_sound_samples/cries/fraxure.wav differ diff --git a/sound/direct_sound_samples/cries/frigibax.aif b/sound/direct_sound_samples/cries/frigibax.aif deleted file mode 100644 index e8318a0cf123..000000000000 Binary files a/sound/direct_sound_samples/cries/frigibax.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/frigibax.wav b/sound/direct_sound_samples/cries/frigibax.wav new file mode 100644 index 000000000000..200f6f7da4e2 Binary files /dev/null and b/sound/direct_sound_samples/cries/frigibax.wav differ diff --git a/sound/direct_sound_samples/cries/frillish.aif b/sound/direct_sound_samples/cries/frillish.aif deleted file mode 100644 index 71511b8bcf9e..000000000000 Binary files a/sound/direct_sound_samples/cries/frillish.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/frillish.wav b/sound/direct_sound_samples/cries/frillish.wav new file mode 100644 index 000000000000..45adf7c08c99 Binary files /dev/null and b/sound/direct_sound_samples/cries/frillish.wav differ diff --git a/sound/direct_sound_samples/cries/froakie.aif b/sound/direct_sound_samples/cries/froakie.aif deleted file mode 100644 index d6955de8bc9f..000000000000 Binary files a/sound/direct_sound_samples/cries/froakie.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/froakie.wav b/sound/direct_sound_samples/cries/froakie.wav new file mode 100644 index 000000000000..0099799d7306 Binary files /dev/null and b/sound/direct_sound_samples/cries/froakie.wav differ diff --git a/sound/direct_sound_samples/cries/frogadier.aif b/sound/direct_sound_samples/cries/frogadier.aif deleted file mode 100644 index 918abc5d845a..000000000000 Binary files a/sound/direct_sound_samples/cries/frogadier.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/frogadier.wav b/sound/direct_sound_samples/cries/frogadier.wav new file mode 100644 index 000000000000..f7fcff3f0585 Binary files /dev/null and b/sound/direct_sound_samples/cries/frogadier.wav differ diff --git a/sound/direct_sound_samples/cries/froslass.aif b/sound/direct_sound_samples/cries/froslass.aif deleted file mode 100644 index 75febf4311c9..000000000000 Binary files a/sound/direct_sound_samples/cries/froslass.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/froslass.wav b/sound/direct_sound_samples/cries/froslass.wav new file mode 100644 index 000000000000..7c1baee478c8 Binary files /dev/null and b/sound/direct_sound_samples/cries/froslass.wav differ diff --git a/sound/direct_sound_samples/cries/frosmoth.aif b/sound/direct_sound_samples/cries/frosmoth.aif deleted file mode 100644 index 324034d15eef..000000000000 Binary files a/sound/direct_sound_samples/cries/frosmoth.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/frosmoth.wav b/sound/direct_sound_samples/cries/frosmoth.wav new file mode 100644 index 000000000000..b65a91e531a3 Binary files /dev/null and b/sound/direct_sound_samples/cries/frosmoth.wav differ diff --git a/sound/direct_sound_samples/cries/fuecoco.aif b/sound/direct_sound_samples/cries/fuecoco.aif deleted file mode 100644 index ee40234e0b1f..000000000000 Binary files a/sound/direct_sound_samples/cries/fuecoco.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/fuecoco.wav b/sound/direct_sound_samples/cries/fuecoco.wav new file mode 100644 index 000000000000..7b3a68eaea8e Binary files /dev/null and b/sound/direct_sound_samples/cries/fuecoco.wav differ diff --git a/sound/direct_sound_samples/cries/furfrou.aif b/sound/direct_sound_samples/cries/furfrou.aif deleted file mode 100644 index d989bde3d394..000000000000 Binary files a/sound/direct_sound_samples/cries/furfrou.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/furfrou.wav b/sound/direct_sound_samples/cries/furfrou.wav new file mode 100644 index 000000000000..3800ae8c38e5 Binary files /dev/null and b/sound/direct_sound_samples/cries/furfrou.wav differ diff --git a/sound/direct_sound_samples/cries/furret.aif b/sound/direct_sound_samples/cries/furret.aif deleted file mode 100644 index cdf9447d734e..000000000000 Binary files a/sound/direct_sound_samples/cries/furret.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/furret.wav b/sound/direct_sound_samples/cries/furret.wav new file mode 100644 index 000000000000..e3e4ec584247 Binary files /dev/null and b/sound/direct_sound_samples/cries/furret.wav differ diff --git a/sound/direct_sound_samples/cries/gabite.aif b/sound/direct_sound_samples/cries/gabite.aif deleted file mode 100644 index 5ca21cec7ae9..000000000000 Binary files a/sound/direct_sound_samples/cries/gabite.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gabite.wav b/sound/direct_sound_samples/cries/gabite.wav new file mode 100644 index 000000000000..b8bd9061013e Binary files /dev/null and b/sound/direct_sound_samples/cries/gabite.wav differ diff --git a/sound/direct_sound_samples/cries/gallade.aif b/sound/direct_sound_samples/cries/gallade.aif deleted file mode 100644 index 1eb55aeed9c1..000000000000 Binary files a/sound/direct_sound_samples/cries/gallade.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gallade.wav b/sound/direct_sound_samples/cries/gallade.wav new file mode 100644 index 000000000000..bc0671f08f27 Binary files /dev/null and b/sound/direct_sound_samples/cries/gallade.wav differ diff --git a/sound/direct_sound_samples/cries/gallade_mega.aif b/sound/direct_sound_samples/cries/gallade_mega.aif deleted file mode 100644 index 5b0d5eb5cca2..000000000000 Binary files a/sound/direct_sound_samples/cries/gallade_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gallade_mega.wav b/sound/direct_sound_samples/cries/gallade_mega.wav new file mode 100644 index 000000000000..c1725b2a803b Binary files /dev/null and b/sound/direct_sound_samples/cries/gallade_mega.wav differ diff --git a/sound/direct_sound_samples/cries/galvantula.aif b/sound/direct_sound_samples/cries/galvantula.aif deleted file mode 100644 index 8d890a246365..000000000000 Binary files a/sound/direct_sound_samples/cries/galvantula.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/galvantula.wav b/sound/direct_sound_samples/cries/galvantula.wav new file mode 100644 index 000000000000..d08ff5388cf7 Binary files /dev/null and b/sound/direct_sound_samples/cries/galvantula.wav differ diff --git a/sound/direct_sound_samples/cries/garbodor.aif b/sound/direct_sound_samples/cries/garbodor.aif deleted file mode 100644 index 09cad5cd7f9a..000000000000 Binary files a/sound/direct_sound_samples/cries/garbodor.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/garbodor.wav b/sound/direct_sound_samples/cries/garbodor.wav new file mode 100644 index 000000000000..d5c66fbf2597 Binary files /dev/null and b/sound/direct_sound_samples/cries/garbodor.wav differ diff --git a/sound/direct_sound_samples/cries/garchomp.aif b/sound/direct_sound_samples/cries/garchomp.aif deleted file mode 100644 index f96c62f93bdf..000000000000 Binary files a/sound/direct_sound_samples/cries/garchomp.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/garchomp.wav b/sound/direct_sound_samples/cries/garchomp.wav new file mode 100644 index 000000000000..828a1a49a242 Binary files /dev/null and b/sound/direct_sound_samples/cries/garchomp.wav differ diff --git a/sound/direct_sound_samples/cries/garchomp_mega.aif b/sound/direct_sound_samples/cries/garchomp_mega.aif deleted file mode 100644 index 65637139f224..000000000000 Binary files a/sound/direct_sound_samples/cries/garchomp_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/garchomp_mega.wav b/sound/direct_sound_samples/cries/garchomp_mega.wav new file mode 100644 index 000000000000..0b1f9df662b6 Binary files /dev/null and b/sound/direct_sound_samples/cries/garchomp_mega.wav differ diff --git a/sound/direct_sound_samples/cries/gardevoir.aif b/sound/direct_sound_samples/cries/gardevoir.aif deleted file mode 100644 index 9285affb9d3b..000000000000 Binary files a/sound/direct_sound_samples/cries/gardevoir.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gardevoir.wav b/sound/direct_sound_samples/cries/gardevoir.wav new file mode 100644 index 000000000000..bd3a99acc26e Binary files /dev/null and b/sound/direct_sound_samples/cries/gardevoir.wav differ diff --git a/sound/direct_sound_samples/cries/gardevoir_mega.aif b/sound/direct_sound_samples/cries/gardevoir_mega.aif deleted file mode 100644 index 71ba65d45544..000000000000 Binary files a/sound/direct_sound_samples/cries/gardevoir_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gardevoir_mega.wav b/sound/direct_sound_samples/cries/gardevoir_mega.wav new file mode 100644 index 000000000000..f94e401a96a5 Binary files /dev/null and b/sound/direct_sound_samples/cries/gardevoir_mega.wav differ diff --git a/sound/direct_sound_samples/cries/garganacl.aif b/sound/direct_sound_samples/cries/garganacl.aif deleted file mode 100644 index 3c530cea53ac..000000000000 Binary files a/sound/direct_sound_samples/cries/garganacl.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/garganacl.wav b/sound/direct_sound_samples/cries/garganacl.wav new file mode 100644 index 000000000000..5730bea3485c Binary files /dev/null and b/sound/direct_sound_samples/cries/garganacl.wav differ diff --git a/sound/direct_sound_samples/cries/gastly.aif b/sound/direct_sound_samples/cries/gastly.aif deleted file mode 100644 index 5174cabffd5a..000000000000 Binary files a/sound/direct_sound_samples/cries/gastly.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gastly.wav b/sound/direct_sound_samples/cries/gastly.wav new file mode 100644 index 000000000000..1bc2ff966737 Binary files /dev/null and b/sound/direct_sound_samples/cries/gastly.wav differ diff --git a/sound/direct_sound_samples/cries/gastrodon.aif b/sound/direct_sound_samples/cries/gastrodon.aif deleted file mode 100644 index d564820e832b..000000000000 Binary files a/sound/direct_sound_samples/cries/gastrodon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gastrodon.wav b/sound/direct_sound_samples/cries/gastrodon.wav new file mode 100644 index 000000000000..164666f31405 Binary files /dev/null and b/sound/direct_sound_samples/cries/gastrodon.wav differ diff --git a/sound/direct_sound_samples/cries/genesect.aif b/sound/direct_sound_samples/cries/genesect.aif deleted file mode 100644 index 49e430ee9aed..000000000000 Binary files a/sound/direct_sound_samples/cries/genesect.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/genesect.wav b/sound/direct_sound_samples/cries/genesect.wav new file mode 100644 index 000000000000..443ea6f0df10 Binary files /dev/null and b/sound/direct_sound_samples/cries/genesect.wav differ diff --git a/sound/direct_sound_samples/cries/gengar.aif b/sound/direct_sound_samples/cries/gengar.aif deleted file mode 100644 index 3c5e291ba30e..000000000000 Binary files a/sound/direct_sound_samples/cries/gengar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gengar.wav b/sound/direct_sound_samples/cries/gengar.wav new file mode 100644 index 000000000000..9e8c24c28b8b Binary files /dev/null and b/sound/direct_sound_samples/cries/gengar.wav differ diff --git a/sound/direct_sound_samples/cries/gengar_mega.aif b/sound/direct_sound_samples/cries/gengar_mega.aif deleted file mode 100644 index 7967d6dcfb8c..000000000000 Binary files a/sound/direct_sound_samples/cries/gengar_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gengar_mega.wav b/sound/direct_sound_samples/cries/gengar_mega.wav new file mode 100644 index 000000000000..b0c8ab70c6c2 Binary files /dev/null and b/sound/direct_sound_samples/cries/gengar_mega.wav differ diff --git a/sound/direct_sound_samples/cries/geodude.aif b/sound/direct_sound_samples/cries/geodude.aif deleted file mode 100644 index a09b2ca345b8..000000000000 Binary files a/sound/direct_sound_samples/cries/geodude.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/geodude.wav b/sound/direct_sound_samples/cries/geodude.wav new file mode 100644 index 000000000000..f355fc7e1a5d Binary files /dev/null and b/sound/direct_sound_samples/cries/geodude.wav differ diff --git a/sound/direct_sound_samples/cries/gholdengo.aif b/sound/direct_sound_samples/cries/gholdengo.aif deleted file mode 100644 index 4cef67ba29f0..000000000000 Binary files a/sound/direct_sound_samples/cries/gholdengo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gholdengo.wav b/sound/direct_sound_samples/cries/gholdengo.wav new file mode 100644 index 000000000000..37bb7ed39ac6 Binary files /dev/null and b/sound/direct_sound_samples/cries/gholdengo.wav differ diff --git a/sound/direct_sound_samples/cries/gible.aif b/sound/direct_sound_samples/cries/gible.aif deleted file mode 100644 index f3d4b4882f64..000000000000 Binary files a/sound/direct_sound_samples/cries/gible.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gible.wav b/sound/direct_sound_samples/cries/gible.wav new file mode 100644 index 000000000000..49bd85b916b0 Binary files /dev/null and b/sound/direct_sound_samples/cries/gible.wav differ diff --git a/sound/direct_sound_samples/cries/gigalith.aif b/sound/direct_sound_samples/cries/gigalith.aif deleted file mode 100644 index 00ad607cc677..000000000000 Binary files a/sound/direct_sound_samples/cries/gigalith.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gigalith.wav b/sound/direct_sound_samples/cries/gigalith.wav new file mode 100644 index 000000000000..ae3b47aa7eaa Binary files /dev/null and b/sound/direct_sound_samples/cries/gigalith.wav differ diff --git a/sound/direct_sound_samples/cries/gimmighoul.aif b/sound/direct_sound_samples/cries/gimmighoul.aif deleted file mode 100644 index fe8db162c9b0..000000000000 Binary files a/sound/direct_sound_samples/cries/gimmighoul.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gimmighoul.wav b/sound/direct_sound_samples/cries/gimmighoul.wav new file mode 100644 index 000000000000..f915238a9584 Binary files /dev/null and b/sound/direct_sound_samples/cries/gimmighoul.wav differ diff --git a/sound/direct_sound_samples/cries/gimmighoul_roaming.aif b/sound/direct_sound_samples/cries/gimmighoul_roaming.aif deleted file mode 100644 index 9f3c4483e9c5..000000000000 Binary files a/sound/direct_sound_samples/cries/gimmighoul_roaming.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/girafarig.aif b/sound/direct_sound_samples/cries/girafarig.aif deleted file mode 100644 index af5af89268d7..000000000000 Binary files a/sound/direct_sound_samples/cries/girafarig.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/girafarig.wav b/sound/direct_sound_samples/cries/girafarig.wav new file mode 100644 index 000000000000..d78162a29fdb Binary files /dev/null and b/sound/direct_sound_samples/cries/girafarig.wav differ diff --git a/sound/direct_sound_samples/cries/giratina.aif b/sound/direct_sound_samples/cries/giratina.aif deleted file mode 100644 index 319e2c132324..000000000000 Binary files a/sound/direct_sound_samples/cries/giratina.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/giratina.wav b/sound/direct_sound_samples/cries/giratina.wav new file mode 100644 index 000000000000..f2b4dff5c870 Binary files /dev/null and b/sound/direct_sound_samples/cries/giratina.wav differ diff --git a/sound/direct_sound_samples/cries/glaceon.aif b/sound/direct_sound_samples/cries/glaceon.aif deleted file mode 100644 index e38ebdef914f..000000000000 Binary files a/sound/direct_sound_samples/cries/glaceon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/glaceon.wav b/sound/direct_sound_samples/cries/glaceon.wav new file mode 100644 index 000000000000..b67779f8734f Binary files /dev/null and b/sound/direct_sound_samples/cries/glaceon.wav differ diff --git a/sound/direct_sound_samples/cries/glalie.aif b/sound/direct_sound_samples/cries/glalie.aif deleted file mode 100644 index 38291bef49af..000000000000 Binary files a/sound/direct_sound_samples/cries/glalie.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/glalie.wav b/sound/direct_sound_samples/cries/glalie.wav new file mode 100644 index 000000000000..bf35bd147b85 Binary files /dev/null and b/sound/direct_sound_samples/cries/glalie.wav differ diff --git a/sound/direct_sound_samples/cries/glalie_mega.aif b/sound/direct_sound_samples/cries/glalie_mega.aif deleted file mode 100644 index cae5ba57f107..000000000000 Binary files a/sound/direct_sound_samples/cries/glalie_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/glalie_mega.wav b/sound/direct_sound_samples/cries/glalie_mega.wav new file mode 100644 index 000000000000..366b61e63045 Binary files /dev/null and b/sound/direct_sound_samples/cries/glalie_mega.wav differ diff --git a/sound/direct_sound_samples/cries/glameow.aif b/sound/direct_sound_samples/cries/glameow.aif deleted file mode 100644 index a2d7ab1fa3cc..000000000000 Binary files a/sound/direct_sound_samples/cries/glameow.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/glameow.wav b/sound/direct_sound_samples/cries/glameow.wav new file mode 100644 index 000000000000..8fe17099bb4f Binary files /dev/null and b/sound/direct_sound_samples/cries/glameow.wav differ diff --git a/sound/direct_sound_samples/cries/glastrier.aif b/sound/direct_sound_samples/cries/glastrier.aif deleted file mode 100644 index 80c44e0b764a..000000000000 Binary files a/sound/direct_sound_samples/cries/glastrier.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/glastrier.wav b/sound/direct_sound_samples/cries/glastrier.wav new file mode 100644 index 000000000000..bd9885ce2bde Binary files /dev/null and b/sound/direct_sound_samples/cries/glastrier.wav differ diff --git a/sound/direct_sound_samples/cries/gligar.aif b/sound/direct_sound_samples/cries/gligar.aif deleted file mode 100644 index e2103c2ff846..000000000000 Binary files a/sound/direct_sound_samples/cries/gligar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gligar.wav b/sound/direct_sound_samples/cries/gligar.wav new file mode 100644 index 000000000000..8fa3efa6b1dc Binary files /dev/null and b/sound/direct_sound_samples/cries/gligar.wav differ diff --git a/sound/direct_sound_samples/cries/glimmet.aif b/sound/direct_sound_samples/cries/glimmet.aif deleted file mode 100644 index e89ac2ea59cd..000000000000 Binary files a/sound/direct_sound_samples/cries/glimmet.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/glimmet.wav b/sound/direct_sound_samples/cries/glimmet.wav new file mode 100644 index 000000000000..37dbf6c8b178 Binary files /dev/null and b/sound/direct_sound_samples/cries/glimmet.wav differ diff --git a/sound/direct_sound_samples/cries/glimmora.aif b/sound/direct_sound_samples/cries/glimmora.aif deleted file mode 100644 index 64fb6822894f..000000000000 Binary files a/sound/direct_sound_samples/cries/glimmora.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/glimmora.wav b/sound/direct_sound_samples/cries/glimmora.wav new file mode 100644 index 000000000000..9edf26f989cd Binary files /dev/null and b/sound/direct_sound_samples/cries/glimmora.wav differ diff --git a/sound/direct_sound_samples/cries/gliscor.aif b/sound/direct_sound_samples/cries/gliscor.aif deleted file mode 100644 index 1df92dc9a932..000000000000 Binary files a/sound/direct_sound_samples/cries/gliscor.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gliscor.wav b/sound/direct_sound_samples/cries/gliscor.wav new file mode 100644 index 000000000000..1146423758f9 Binary files /dev/null and b/sound/direct_sound_samples/cries/gliscor.wav differ diff --git a/sound/direct_sound_samples/cries/gloom.aif b/sound/direct_sound_samples/cries/gloom.aif deleted file mode 100644 index bcedd48d5ea3..000000000000 Binary files a/sound/direct_sound_samples/cries/gloom.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gloom.wav b/sound/direct_sound_samples/cries/gloom.wav new file mode 100644 index 000000000000..abc408a0f76a Binary files /dev/null and b/sound/direct_sound_samples/cries/gloom.wav differ diff --git a/sound/direct_sound_samples/cries/gogoat.aif b/sound/direct_sound_samples/cries/gogoat.aif deleted file mode 100644 index 6717a2ff2668..000000000000 Binary files a/sound/direct_sound_samples/cries/gogoat.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gogoat.wav b/sound/direct_sound_samples/cries/gogoat.wav new file mode 100644 index 000000000000..6ab6d386e403 Binary files /dev/null and b/sound/direct_sound_samples/cries/gogoat.wav differ diff --git a/sound/direct_sound_samples/cries/golbat.aif b/sound/direct_sound_samples/cries/golbat.aif deleted file mode 100644 index 2e91f76966fc..000000000000 Binary files a/sound/direct_sound_samples/cries/golbat.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/golbat.wav b/sound/direct_sound_samples/cries/golbat.wav new file mode 100644 index 000000000000..20d2ecf5c986 Binary files /dev/null and b/sound/direct_sound_samples/cries/golbat.wav differ diff --git a/sound/direct_sound_samples/cries/goldeen.aif b/sound/direct_sound_samples/cries/goldeen.aif deleted file mode 100644 index 687f8d3920ae..000000000000 Binary files a/sound/direct_sound_samples/cries/goldeen.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/goldeen.wav b/sound/direct_sound_samples/cries/goldeen.wav new file mode 100644 index 000000000000..342df710c97b Binary files /dev/null and b/sound/direct_sound_samples/cries/goldeen.wav differ diff --git a/sound/direct_sound_samples/cries/golduck.aif b/sound/direct_sound_samples/cries/golduck.aif deleted file mode 100644 index bc6c5f5b1626..000000000000 Binary files a/sound/direct_sound_samples/cries/golduck.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/golduck.wav b/sound/direct_sound_samples/cries/golduck.wav new file mode 100644 index 000000000000..a9bf91b2da7f Binary files /dev/null and b/sound/direct_sound_samples/cries/golduck.wav differ diff --git a/sound/direct_sound_samples/cries/golem.aif b/sound/direct_sound_samples/cries/golem.aif deleted file mode 100644 index 95fbef9c47c6..000000000000 Binary files a/sound/direct_sound_samples/cries/golem.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/golem.wav b/sound/direct_sound_samples/cries/golem.wav new file mode 100644 index 000000000000..17ed6128e4a2 Binary files /dev/null and b/sound/direct_sound_samples/cries/golem.wav differ diff --git a/sound/direct_sound_samples/cries/golett.aif b/sound/direct_sound_samples/cries/golett.aif deleted file mode 100644 index 58c6f09cd8e8..000000000000 Binary files a/sound/direct_sound_samples/cries/golett.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/golett.wav b/sound/direct_sound_samples/cries/golett.wav new file mode 100644 index 000000000000..46c3664e65cd Binary files /dev/null and b/sound/direct_sound_samples/cries/golett.wav differ diff --git a/sound/direct_sound_samples/cries/golisopod.aif b/sound/direct_sound_samples/cries/golisopod.aif deleted file mode 100644 index 429f445ede68..000000000000 Binary files a/sound/direct_sound_samples/cries/golisopod.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/golisopod.wav b/sound/direct_sound_samples/cries/golisopod.wav new file mode 100644 index 000000000000..66912c8b082c Binary files /dev/null and b/sound/direct_sound_samples/cries/golisopod.wav differ diff --git a/sound/direct_sound_samples/cries/golurk.aif b/sound/direct_sound_samples/cries/golurk.aif deleted file mode 100644 index abc95bd80802..000000000000 Binary files a/sound/direct_sound_samples/cries/golurk.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/golurk.wav b/sound/direct_sound_samples/cries/golurk.wav new file mode 100644 index 000000000000..b6e41c1fe0b9 Binary files /dev/null and b/sound/direct_sound_samples/cries/golurk.wav differ diff --git a/sound/direct_sound_samples/cries/goodra.aif b/sound/direct_sound_samples/cries/goodra.aif deleted file mode 100644 index b2f407cc94d1..000000000000 Binary files a/sound/direct_sound_samples/cries/goodra.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/goodra.wav b/sound/direct_sound_samples/cries/goodra.wav new file mode 100644 index 000000000000..ffb6bd7f4449 Binary files /dev/null and b/sound/direct_sound_samples/cries/goodra.wav differ diff --git a/sound/direct_sound_samples/cries/goomy.aif b/sound/direct_sound_samples/cries/goomy.aif deleted file mode 100644 index bd2524ebe1e9..000000000000 Binary files a/sound/direct_sound_samples/cries/goomy.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/goomy.wav b/sound/direct_sound_samples/cries/goomy.wav new file mode 100644 index 000000000000..d7fdac2cec27 Binary files /dev/null and b/sound/direct_sound_samples/cries/goomy.wav differ diff --git a/sound/direct_sound_samples/cries/gorebyss.aif b/sound/direct_sound_samples/cries/gorebyss.aif deleted file mode 100644 index a93b1aa6fc89..000000000000 Binary files a/sound/direct_sound_samples/cries/gorebyss.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gorebyss.wav b/sound/direct_sound_samples/cries/gorebyss.wav new file mode 100644 index 000000000000..3d375f6dcf22 Binary files /dev/null and b/sound/direct_sound_samples/cries/gorebyss.wav differ diff --git a/sound/direct_sound_samples/cries/gossifleur.aif b/sound/direct_sound_samples/cries/gossifleur.aif deleted file mode 100644 index dae1731c8fee..000000000000 Binary files a/sound/direct_sound_samples/cries/gossifleur.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gossifleur.wav b/sound/direct_sound_samples/cries/gossifleur.wav new file mode 100644 index 000000000000..a666b937c49d Binary files /dev/null and b/sound/direct_sound_samples/cries/gossifleur.wav differ diff --git a/sound/direct_sound_samples/cries/gothita.aif b/sound/direct_sound_samples/cries/gothita.aif deleted file mode 100644 index 00476d94bd77..000000000000 Binary files a/sound/direct_sound_samples/cries/gothita.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gothita.wav b/sound/direct_sound_samples/cries/gothita.wav new file mode 100644 index 000000000000..1d8ad153b4d7 Binary files /dev/null and b/sound/direct_sound_samples/cries/gothita.wav differ diff --git a/sound/direct_sound_samples/cries/gothitelle.aif b/sound/direct_sound_samples/cries/gothitelle.aif deleted file mode 100644 index d8f334784ad4..000000000000 Binary files a/sound/direct_sound_samples/cries/gothitelle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gothitelle.wav b/sound/direct_sound_samples/cries/gothitelle.wav new file mode 100644 index 000000000000..3d7c2046d028 Binary files /dev/null and b/sound/direct_sound_samples/cries/gothitelle.wav differ diff --git a/sound/direct_sound_samples/cries/gothorita.aif b/sound/direct_sound_samples/cries/gothorita.aif deleted file mode 100644 index d5491f83b51b..000000000000 Binary files a/sound/direct_sound_samples/cries/gothorita.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gothorita.wav b/sound/direct_sound_samples/cries/gothorita.wav new file mode 100644 index 000000000000..47686081f59a Binary files /dev/null and b/sound/direct_sound_samples/cries/gothorita.wav differ diff --git a/sound/direct_sound_samples/cries/gouging_fire.aif b/sound/direct_sound_samples/cries/gouging_fire.aif deleted file mode 100644 index 996a7d807047..000000000000 Binary files a/sound/direct_sound_samples/cries/gouging_fire.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gouging_fire.wav b/sound/direct_sound_samples/cries/gouging_fire.wav new file mode 100644 index 000000000000..6748b9c9d84f Binary files /dev/null and b/sound/direct_sound_samples/cries/gouging_fire.wav differ diff --git a/sound/direct_sound_samples/cries/gourgeist.aif b/sound/direct_sound_samples/cries/gourgeist.aif deleted file mode 100644 index b1790cdd3c1d..000000000000 Binary files a/sound/direct_sound_samples/cries/gourgeist.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gourgeist.wav b/sound/direct_sound_samples/cries/gourgeist.wav new file mode 100644 index 000000000000..f3db74b55438 Binary files /dev/null and b/sound/direct_sound_samples/cries/gourgeist.wav differ diff --git a/sound/direct_sound_samples/cries/gourgeist_super.aif b/sound/direct_sound_samples/cries/gourgeist_super.aif deleted file mode 100644 index cdf93aca5815..000000000000 Binary files a/sound/direct_sound_samples/cries/gourgeist_super.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gourgeist_super.wav b/sound/direct_sound_samples/cries/gourgeist_super.wav new file mode 100644 index 000000000000..e319d5ba841f Binary files /dev/null and b/sound/direct_sound_samples/cries/gourgeist_super.wav differ diff --git a/sound/direct_sound_samples/cries/grafaiai.aif b/sound/direct_sound_samples/cries/grafaiai.aif deleted file mode 100644 index d8e8511eec1e..000000000000 Binary files a/sound/direct_sound_samples/cries/grafaiai.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/grafaiai.wav b/sound/direct_sound_samples/cries/grafaiai.wav new file mode 100644 index 000000000000..2d16b5e80553 Binary files /dev/null and b/sound/direct_sound_samples/cries/grafaiai.wav differ diff --git a/sound/direct_sound_samples/cries/granbull.aif b/sound/direct_sound_samples/cries/granbull.aif deleted file mode 100644 index 87ed96a84273..000000000000 Binary files a/sound/direct_sound_samples/cries/granbull.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/granbull.wav b/sound/direct_sound_samples/cries/granbull.wav new file mode 100644 index 000000000000..959793b72403 Binary files /dev/null and b/sound/direct_sound_samples/cries/granbull.wav differ diff --git a/sound/direct_sound_samples/cries/grapploct.aif b/sound/direct_sound_samples/cries/grapploct.aif deleted file mode 100644 index 289d636ecbff..000000000000 Binary files a/sound/direct_sound_samples/cries/grapploct.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/grapploct.wav b/sound/direct_sound_samples/cries/grapploct.wav new file mode 100644 index 000000000000..fb3b48ccc680 Binary files /dev/null and b/sound/direct_sound_samples/cries/grapploct.wav differ diff --git a/sound/direct_sound_samples/cries/graveler.aif b/sound/direct_sound_samples/cries/graveler.aif deleted file mode 100644 index fbf463c4fd2e..000000000000 Binary files a/sound/direct_sound_samples/cries/graveler.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/graveler.wav b/sound/direct_sound_samples/cries/graveler.wav new file mode 100644 index 000000000000..6b8591406f5c Binary files /dev/null and b/sound/direct_sound_samples/cries/graveler.wav differ diff --git a/sound/direct_sound_samples/cries/great_tusk.aif b/sound/direct_sound_samples/cries/great_tusk.aif deleted file mode 100644 index 4ca76ff6c02f..000000000000 Binary files a/sound/direct_sound_samples/cries/great_tusk.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/great_tusk.wav b/sound/direct_sound_samples/cries/great_tusk.wav new file mode 100644 index 000000000000..0c7d0773ea94 Binary files /dev/null and b/sound/direct_sound_samples/cries/great_tusk.wav differ diff --git a/sound/direct_sound_samples/cries/greavard.aif b/sound/direct_sound_samples/cries/greavard.aif deleted file mode 100644 index 434c1dceb0af..000000000000 Binary files a/sound/direct_sound_samples/cries/greavard.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/greavard.wav b/sound/direct_sound_samples/cries/greavard.wav new file mode 100644 index 000000000000..b93fd39327ee Binary files /dev/null and b/sound/direct_sound_samples/cries/greavard.wav differ diff --git a/sound/direct_sound_samples/cries/greedent.aif b/sound/direct_sound_samples/cries/greedent.aif deleted file mode 100644 index 523cd57c3ed9..000000000000 Binary files a/sound/direct_sound_samples/cries/greedent.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/greedent.wav b/sound/direct_sound_samples/cries/greedent.wav new file mode 100644 index 000000000000..351e21c9e32d Binary files /dev/null and b/sound/direct_sound_samples/cries/greedent.wav differ diff --git a/sound/direct_sound_samples/cries/greninja.aif b/sound/direct_sound_samples/cries/greninja.aif deleted file mode 100644 index 988d66b06282..000000000000 Binary files a/sound/direct_sound_samples/cries/greninja.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/greninja.wav b/sound/direct_sound_samples/cries/greninja.wav new file mode 100644 index 000000000000..3d097d8022c8 Binary files /dev/null and b/sound/direct_sound_samples/cries/greninja.wav differ diff --git a/sound/direct_sound_samples/cries/grimer.aif b/sound/direct_sound_samples/cries/grimer.aif deleted file mode 100644 index 050fb9620c35..000000000000 Binary files a/sound/direct_sound_samples/cries/grimer.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/grimer.wav b/sound/direct_sound_samples/cries/grimer.wav new file mode 100644 index 000000000000..092dfeed61e0 Binary files /dev/null and b/sound/direct_sound_samples/cries/grimer.wav differ diff --git a/sound/direct_sound_samples/cries/grimmsnarl.aif b/sound/direct_sound_samples/cries/grimmsnarl.aif deleted file mode 100644 index 838312fde35a..000000000000 Binary files a/sound/direct_sound_samples/cries/grimmsnarl.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/grimmsnarl.wav b/sound/direct_sound_samples/cries/grimmsnarl.wav new file mode 100644 index 000000000000..7fd3bb5c03ea Binary files /dev/null and b/sound/direct_sound_samples/cries/grimmsnarl.wav differ diff --git a/sound/direct_sound_samples/cries/grookey.aif b/sound/direct_sound_samples/cries/grookey.aif deleted file mode 100644 index 919063484f86..000000000000 Binary files a/sound/direct_sound_samples/cries/grookey.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/grookey.wav b/sound/direct_sound_samples/cries/grookey.wav new file mode 100644 index 000000000000..42ebd7ef1ffc Binary files /dev/null and b/sound/direct_sound_samples/cries/grookey.wav differ diff --git a/sound/direct_sound_samples/cries/grotle.aif b/sound/direct_sound_samples/cries/grotle.aif deleted file mode 100644 index 2b08bca67e7a..000000000000 Binary files a/sound/direct_sound_samples/cries/grotle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/grotle.wav b/sound/direct_sound_samples/cries/grotle.wav new file mode 100644 index 000000000000..65cdfe49c665 Binary files /dev/null and b/sound/direct_sound_samples/cries/grotle.wav differ diff --git a/sound/direct_sound_samples/cries/groudon.aif b/sound/direct_sound_samples/cries/groudon.aif deleted file mode 100644 index 9fe253745ae2..000000000000 Binary files a/sound/direct_sound_samples/cries/groudon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/groudon.wav b/sound/direct_sound_samples/cries/groudon.wav new file mode 100644 index 000000000000..680d0ec0474b Binary files /dev/null and b/sound/direct_sound_samples/cries/groudon.wav differ diff --git a/sound/direct_sound_samples/cries/groudon_primal.aif b/sound/direct_sound_samples/cries/groudon_primal.aif deleted file mode 100644 index a93d06a3fe93..000000000000 Binary files a/sound/direct_sound_samples/cries/groudon_primal.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/groudon_primal.wav b/sound/direct_sound_samples/cries/groudon_primal.wav new file mode 100644 index 000000000000..d3e5f411914e Binary files /dev/null and b/sound/direct_sound_samples/cries/groudon_primal.wav differ diff --git a/sound/direct_sound_samples/cries/grovyle.aif b/sound/direct_sound_samples/cries/grovyle.aif deleted file mode 100644 index c21c58ad0906..000000000000 Binary files a/sound/direct_sound_samples/cries/grovyle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/grovyle.wav b/sound/direct_sound_samples/cries/grovyle.wav new file mode 100644 index 000000000000..7e2f1acd0fa7 Binary files /dev/null and b/sound/direct_sound_samples/cries/grovyle.wav differ diff --git a/sound/direct_sound_samples/cries/growlithe.aif b/sound/direct_sound_samples/cries/growlithe.aif deleted file mode 100644 index 37b7233c2967..000000000000 Binary files a/sound/direct_sound_samples/cries/growlithe.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/growlithe.wav b/sound/direct_sound_samples/cries/growlithe.wav new file mode 100644 index 000000000000..3f72ea6f976a Binary files /dev/null and b/sound/direct_sound_samples/cries/growlithe.wav differ diff --git a/sound/direct_sound_samples/cries/grubbin.aif b/sound/direct_sound_samples/cries/grubbin.aif deleted file mode 100644 index 8e071f78154b..000000000000 Binary files a/sound/direct_sound_samples/cries/grubbin.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/grubbin.wav b/sound/direct_sound_samples/cries/grubbin.wav new file mode 100644 index 000000000000..f76a6630515f Binary files /dev/null and b/sound/direct_sound_samples/cries/grubbin.wav differ diff --git a/sound/direct_sound_samples/cries/grumpig.aif b/sound/direct_sound_samples/cries/grumpig.aif deleted file mode 100644 index d5b766f43e98..000000000000 Binary files a/sound/direct_sound_samples/cries/grumpig.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/grumpig.wav b/sound/direct_sound_samples/cries/grumpig.wav new file mode 100644 index 000000000000..e9c8157e0f65 Binary files /dev/null and b/sound/direct_sound_samples/cries/grumpig.wav differ diff --git a/sound/direct_sound_samples/cries/gulpin.aif b/sound/direct_sound_samples/cries/gulpin.aif deleted file mode 100644 index 4b0bc89b96fe..000000000000 Binary files a/sound/direct_sound_samples/cries/gulpin.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gulpin.wav b/sound/direct_sound_samples/cries/gulpin.wav new file mode 100644 index 000000000000..d1ab06b6b085 Binary files /dev/null and b/sound/direct_sound_samples/cries/gulpin.wav differ diff --git a/sound/direct_sound_samples/cries/gumshoos.aif b/sound/direct_sound_samples/cries/gumshoos.aif deleted file mode 100644 index 9f078f85dbd2..000000000000 Binary files a/sound/direct_sound_samples/cries/gumshoos.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gumshoos.wav b/sound/direct_sound_samples/cries/gumshoos.wav new file mode 100644 index 000000000000..9bbfb863b648 Binary files /dev/null and b/sound/direct_sound_samples/cries/gumshoos.wav differ diff --git a/sound/direct_sound_samples/cries/gurdurr.aif b/sound/direct_sound_samples/cries/gurdurr.aif deleted file mode 100644 index 055d366a91b2..000000000000 Binary files a/sound/direct_sound_samples/cries/gurdurr.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gurdurr.wav b/sound/direct_sound_samples/cries/gurdurr.wav new file mode 100644 index 000000000000..ba73ebdcc15f Binary files /dev/null and b/sound/direct_sound_samples/cries/gurdurr.wav differ diff --git a/sound/direct_sound_samples/cries/guzzlord.aif b/sound/direct_sound_samples/cries/guzzlord.aif deleted file mode 100644 index 958e0b7ed367..000000000000 Binary files a/sound/direct_sound_samples/cries/guzzlord.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/guzzlord.wav b/sound/direct_sound_samples/cries/guzzlord.wav new file mode 100644 index 000000000000..15404dea5623 Binary files /dev/null and b/sound/direct_sound_samples/cries/guzzlord.wav differ diff --git a/sound/direct_sound_samples/cries/gyarados.aif b/sound/direct_sound_samples/cries/gyarados.aif deleted file mode 100644 index f4b5dbf94584..000000000000 Binary files a/sound/direct_sound_samples/cries/gyarados.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gyarados.wav b/sound/direct_sound_samples/cries/gyarados.wav new file mode 100644 index 000000000000..6a4124085eac Binary files /dev/null and b/sound/direct_sound_samples/cries/gyarados.wav differ diff --git a/sound/direct_sound_samples/cries/gyarados_mega.aif b/sound/direct_sound_samples/cries/gyarados_mega.aif deleted file mode 100644 index 33f9eadc3b00..000000000000 Binary files a/sound/direct_sound_samples/cries/gyarados_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/gyarados_mega.wav b/sound/direct_sound_samples/cries/gyarados_mega.wav new file mode 100644 index 000000000000..d14a015dd619 Binary files /dev/null and b/sound/direct_sound_samples/cries/gyarados_mega.wav differ diff --git a/sound/direct_sound_samples/cries/hakamo_o.aif b/sound/direct_sound_samples/cries/hakamo_o.aif deleted file mode 100644 index 03d2ff241ad4..000000000000 Binary files a/sound/direct_sound_samples/cries/hakamo_o.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/hakamo_o.wav b/sound/direct_sound_samples/cries/hakamo_o.wav new file mode 100644 index 000000000000..c668cad629a5 Binary files /dev/null and b/sound/direct_sound_samples/cries/hakamo_o.wav differ diff --git a/sound/direct_sound_samples/cries/happiny.aif b/sound/direct_sound_samples/cries/happiny.aif deleted file mode 100644 index bee72680ac18..000000000000 Binary files a/sound/direct_sound_samples/cries/happiny.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/happiny.wav b/sound/direct_sound_samples/cries/happiny.wav new file mode 100644 index 000000000000..6d310d8d5967 Binary files /dev/null and b/sound/direct_sound_samples/cries/happiny.wav differ diff --git a/sound/direct_sound_samples/cries/hariyama.aif b/sound/direct_sound_samples/cries/hariyama.aif deleted file mode 100644 index 0a61e0d8ae75..000000000000 Binary files a/sound/direct_sound_samples/cries/hariyama.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/hariyama.wav b/sound/direct_sound_samples/cries/hariyama.wav new file mode 100644 index 000000000000..5567aae3a14f Binary files /dev/null and b/sound/direct_sound_samples/cries/hariyama.wav differ diff --git a/sound/direct_sound_samples/cries/hatenna.aif b/sound/direct_sound_samples/cries/hatenna.aif deleted file mode 100644 index 3c431dd65f2b..000000000000 Binary files a/sound/direct_sound_samples/cries/hatenna.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/hatenna.wav b/sound/direct_sound_samples/cries/hatenna.wav new file mode 100644 index 000000000000..78e63ac2b4ab Binary files /dev/null and b/sound/direct_sound_samples/cries/hatenna.wav differ diff --git a/sound/direct_sound_samples/cries/hatterene.aif b/sound/direct_sound_samples/cries/hatterene.aif deleted file mode 100644 index db21eb2e2004..000000000000 Binary files a/sound/direct_sound_samples/cries/hatterene.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/hatterene.wav b/sound/direct_sound_samples/cries/hatterene.wav new file mode 100644 index 000000000000..27dfcf2db7fd Binary files /dev/null and b/sound/direct_sound_samples/cries/hatterene.wav differ diff --git a/sound/direct_sound_samples/cries/hattrem.aif b/sound/direct_sound_samples/cries/hattrem.aif deleted file mode 100644 index 444c77028352..000000000000 Binary files a/sound/direct_sound_samples/cries/hattrem.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/hattrem.wav b/sound/direct_sound_samples/cries/hattrem.wav new file mode 100644 index 000000000000..5da7c40af129 Binary files /dev/null and b/sound/direct_sound_samples/cries/hattrem.wav differ diff --git a/sound/direct_sound_samples/cries/haunter.aif b/sound/direct_sound_samples/cries/haunter.aif deleted file mode 100644 index c9192cf9bcd1..000000000000 Binary files a/sound/direct_sound_samples/cries/haunter.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/haunter.wav b/sound/direct_sound_samples/cries/haunter.wav new file mode 100644 index 000000000000..e22b1cfc137e Binary files /dev/null and b/sound/direct_sound_samples/cries/haunter.wav differ diff --git a/sound/direct_sound_samples/cries/hawlucha.aif b/sound/direct_sound_samples/cries/hawlucha.aif deleted file mode 100644 index 0e4d9c78d15b..000000000000 Binary files a/sound/direct_sound_samples/cries/hawlucha.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/hawlucha.wav b/sound/direct_sound_samples/cries/hawlucha.wav new file mode 100644 index 000000000000..629365ac41bb Binary files /dev/null and b/sound/direct_sound_samples/cries/hawlucha.wav differ diff --git a/sound/direct_sound_samples/cries/haxorus.aif b/sound/direct_sound_samples/cries/haxorus.aif deleted file mode 100644 index 8414951d49fe..000000000000 Binary files a/sound/direct_sound_samples/cries/haxorus.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/haxorus.wav b/sound/direct_sound_samples/cries/haxorus.wav new file mode 100644 index 000000000000..7ebe8ba8d5d1 Binary files /dev/null and b/sound/direct_sound_samples/cries/haxorus.wav differ diff --git a/sound/direct_sound_samples/cries/heatmor.aif b/sound/direct_sound_samples/cries/heatmor.aif deleted file mode 100644 index 2a254ef0d96e..000000000000 Binary files a/sound/direct_sound_samples/cries/heatmor.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/heatmor.wav b/sound/direct_sound_samples/cries/heatmor.wav new file mode 100644 index 000000000000..d340755c8aed Binary files /dev/null and b/sound/direct_sound_samples/cries/heatmor.wav differ diff --git a/sound/direct_sound_samples/cries/heatran.aif b/sound/direct_sound_samples/cries/heatran.aif deleted file mode 100644 index 56c373d8d862..000000000000 Binary files a/sound/direct_sound_samples/cries/heatran.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/heatran.wav b/sound/direct_sound_samples/cries/heatran.wav new file mode 100644 index 000000000000..f3388a0756a6 Binary files /dev/null and b/sound/direct_sound_samples/cries/heatran.wav differ diff --git a/sound/direct_sound_samples/cries/heliolisk.aif b/sound/direct_sound_samples/cries/heliolisk.aif deleted file mode 100644 index d87e7bfd2a94..000000000000 Binary files a/sound/direct_sound_samples/cries/heliolisk.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/heliolisk.wav b/sound/direct_sound_samples/cries/heliolisk.wav new file mode 100644 index 000000000000..801d5968c362 Binary files /dev/null and b/sound/direct_sound_samples/cries/heliolisk.wav differ diff --git a/sound/direct_sound_samples/cries/helioptile.aif b/sound/direct_sound_samples/cries/helioptile.aif deleted file mode 100644 index aa1a9fb3a60d..000000000000 Binary files a/sound/direct_sound_samples/cries/helioptile.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/helioptile.wav b/sound/direct_sound_samples/cries/helioptile.wav new file mode 100644 index 000000000000..39c1fc53276e Binary files /dev/null and b/sound/direct_sound_samples/cries/helioptile.wav differ diff --git a/sound/direct_sound_samples/cries/heracross.aif b/sound/direct_sound_samples/cries/heracross.aif deleted file mode 100644 index 1fe12ed52498..000000000000 Binary files a/sound/direct_sound_samples/cries/heracross.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/heracross.wav b/sound/direct_sound_samples/cries/heracross.wav new file mode 100644 index 000000000000..ed68648ba8d3 Binary files /dev/null and b/sound/direct_sound_samples/cries/heracross.wav differ diff --git a/sound/direct_sound_samples/cries/heracross_mega.aif b/sound/direct_sound_samples/cries/heracross_mega.aif deleted file mode 100644 index e1993473c20a..000000000000 Binary files a/sound/direct_sound_samples/cries/heracross_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/heracross_mega.wav b/sound/direct_sound_samples/cries/heracross_mega.wav new file mode 100644 index 000000000000..79d9a58797d4 Binary files /dev/null and b/sound/direct_sound_samples/cries/heracross_mega.wav differ diff --git a/sound/direct_sound_samples/cries/herdier.aif b/sound/direct_sound_samples/cries/herdier.aif deleted file mode 100644 index bc798f60b5c9..000000000000 Binary files a/sound/direct_sound_samples/cries/herdier.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/herdier.wav b/sound/direct_sound_samples/cries/herdier.wav new file mode 100644 index 000000000000..f272d2b01bc4 Binary files /dev/null and b/sound/direct_sound_samples/cries/herdier.wav differ diff --git a/sound/direct_sound_samples/cries/hippopotas.aif b/sound/direct_sound_samples/cries/hippopotas.aif deleted file mode 100644 index a8828805fe93..000000000000 Binary files a/sound/direct_sound_samples/cries/hippopotas.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/hippopotas.wav b/sound/direct_sound_samples/cries/hippopotas.wav new file mode 100644 index 000000000000..c94da0f4398f Binary files /dev/null and b/sound/direct_sound_samples/cries/hippopotas.wav differ diff --git a/sound/direct_sound_samples/cries/hippowdon.aif b/sound/direct_sound_samples/cries/hippowdon.aif deleted file mode 100644 index 94649f3f2503..000000000000 Binary files a/sound/direct_sound_samples/cries/hippowdon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/hippowdon.wav b/sound/direct_sound_samples/cries/hippowdon.wav new file mode 100644 index 000000000000..ee24375a552c Binary files /dev/null and b/sound/direct_sound_samples/cries/hippowdon.wav differ diff --git a/sound/direct_sound_samples/cries/hitmonchan.aif b/sound/direct_sound_samples/cries/hitmonchan.aif deleted file mode 100644 index 279370fc9c12..000000000000 Binary files a/sound/direct_sound_samples/cries/hitmonchan.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/hitmonchan.wav b/sound/direct_sound_samples/cries/hitmonchan.wav new file mode 100644 index 000000000000..806d206d3580 Binary files /dev/null and b/sound/direct_sound_samples/cries/hitmonchan.wav differ diff --git a/sound/direct_sound_samples/cries/hitmonlee.aif b/sound/direct_sound_samples/cries/hitmonlee.aif deleted file mode 100644 index d388565df85f..000000000000 Binary files a/sound/direct_sound_samples/cries/hitmonlee.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/hitmonlee.wav b/sound/direct_sound_samples/cries/hitmonlee.wav new file mode 100644 index 000000000000..e40d852b998b Binary files /dev/null and b/sound/direct_sound_samples/cries/hitmonlee.wav differ diff --git a/sound/direct_sound_samples/cries/hitmontop.aif b/sound/direct_sound_samples/cries/hitmontop.aif deleted file mode 100644 index 237e0a6b0fcd..000000000000 Binary files a/sound/direct_sound_samples/cries/hitmontop.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/hitmontop.wav b/sound/direct_sound_samples/cries/hitmontop.wav new file mode 100644 index 000000000000..652222dc6c5d Binary files /dev/null and b/sound/direct_sound_samples/cries/hitmontop.wav differ diff --git a/sound/direct_sound_samples/cries/ho_oh.aif b/sound/direct_sound_samples/cries/ho_oh.aif deleted file mode 100644 index 886d66813ab2..000000000000 Binary files a/sound/direct_sound_samples/cries/ho_oh.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ho_oh.wav b/sound/direct_sound_samples/cries/ho_oh.wav new file mode 100644 index 000000000000..acf881253231 Binary files /dev/null and b/sound/direct_sound_samples/cries/ho_oh.wav differ diff --git a/sound/direct_sound_samples/cries/honchkrow.aif b/sound/direct_sound_samples/cries/honchkrow.aif deleted file mode 100644 index ae3ceda67194..000000000000 Binary files a/sound/direct_sound_samples/cries/honchkrow.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/honchkrow.wav b/sound/direct_sound_samples/cries/honchkrow.wav new file mode 100644 index 000000000000..6ebbb5e4291d Binary files /dev/null and b/sound/direct_sound_samples/cries/honchkrow.wav differ diff --git a/sound/direct_sound_samples/cries/honedge.aif b/sound/direct_sound_samples/cries/honedge.aif deleted file mode 100644 index e1204fddfecb..000000000000 Binary files a/sound/direct_sound_samples/cries/honedge.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/honedge.wav b/sound/direct_sound_samples/cries/honedge.wav new file mode 100644 index 000000000000..bf3136b3ad79 Binary files /dev/null and b/sound/direct_sound_samples/cries/honedge.wav differ diff --git a/sound/direct_sound_samples/cries/hoopa_confined.aif b/sound/direct_sound_samples/cries/hoopa_confined.aif deleted file mode 100644 index 2d91b4982afa..000000000000 Binary files a/sound/direct_sound_samples/cries/hoopa_confined.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/hoopa_confined.wav b/sound/direct_sound_samples/cries/hoopa_confined.wav new file mode 100644 index 000000000000..d5f50a8b42cd Binary files /dev/null and b/sound/direct_sound_samples/cries/hoopa_confined.wav differ diff --git a/sound/direct_sound_samples/cries/hoopa_unbound.aif b/sound/direct_sound_samples/cries/hoopa_unbound.aif deleted file mode 100644 index 2b4d84015b03..000000000000 Binary files a/sound/direct_sound_samples/cries/hoopa_unbound.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/hoopa_unbound.wav b/sound/direct_sound_samples/cries/hoopa_unbound.wav new file mode 100644 index 000000000000..319a519a8807 Binary files /dev/null and b/sound/direct_sound_samples/cries/hoopa_unbound.wav differ diff --git a/sound/direct_sound_samples/cries/hoothoot.aif b/sound/direct_sound_samples/cries/hoothoot.aif deleted file mode 100644 index 52bccc8e9103..000000000000 Binary files a/sound/direct_sound_samples/cries/hoothoot.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/hoothoot.wav b/sound/direct_sound_samples/cries/hoothoot.wav new file mode 100644 index 000000000000..e7ca2f5780a6 Binary files /dev/null and b/sound/direct_sound_samples/cries/hoothoot.wav differ diff --git a/sound/direct_sound_samples/cries/hoppip.aif b/sound/direct_sound_samples/cries/hoppip.aif deleted file mode 100644 index e715705f0899..000000000000 Binary files a/sound/direct_sound_samples/cries/hoppip.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/hoppip.wav b/sound/direct_sound_samples/cries/hoppip.wav new file mode 100644 index 000000000000..ab14fdaec729 Binary files /dev/null and b/sound/direct_sound_samples/cries/hoppip.wav differ diff --git a/sound/direct_sound_samples/cries/horsea.aif b/sound/direct_sound_samples/cries/horsea.aif deleted file mode 100644 index 12801a2076ed..000000000000 Binary files a/sound/direct_sound_samples/cries/horsea.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/horsea.wav b/sound/direct_sound_samples/cries/horsea.wav new file mode 100644 index 000000000000..ab67381edd35 Binary files /dev/null and b/sound/direct_sound_samples/cries/horsea.wav differ diff --git a/sound/direct_sound_samples/cries/houndoom.aif b/sound/direct_sound_samples/cries/houndoom.aif deleted file mode 100644 index 09c6e4957f48..000000000000 Binary files a/sound/direct_sound_samples/cries/houndoom.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/houndoom.wav b/sound/direct_sound_samples/cries/houndoom.wav new file mode 100644 index 000000000000..a34e4cda2b44 Binary files /dev/null and b/sound/direct_sound_samples/cries/houndoom.wav differ diff --git a/sound/direct_sound_samples/cries/houndoom_mega.aif b/sound/direct_sound_samples/cries/houndoom_mega.aif deleted file mode 100644 index 102f822cc69f..000000000000 Binary files a/sound/direct_sound_samples/cries/houndoom_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/houndoom_mega.wav b/sound/direct_sound_samples/cries/houndoom_mega.wav new file mode 100644 index 000000000000..3b50f949201f Binary files /dev/null and b/sound/direct_sound_samples/cries/houndoom_mega.wav differ diff --git a/sound/direct_sound_samples/cries/houndour.aif b/sound/direct_sound_samples/cries/houndour.aif deleted file mode 100644 index 352d8fd897c6..000000000000 Binary files a/sound/direct_sound_samples/cries/houndour.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/houndour.wav b/sound/direct_sound_samples/cries/houndour.wav new file mode 100644 index 000000000000..51310524a880 Binary files /dev/null and b/sound/direct_sound_samples/cries/houndour.wav differ diff --git a/sound/direct_sound_samples/cries/houndstone.aif b/sound/direct_sound_samples/cries/houndstone.aif deleted file mode 100644 index 99e699b7bab6..000000000000 Binary files a/sound/direct_sound_samples/cries/houndstone.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/houndstone.wav b/sound/direct_sound_samples/cries/houndstone.wav new file mode 100644 index 000000000000..d70441d7bdab Binary files /dev/null and b/sound/direct_sound_samples/cries/houndstone.wav differ diff --git a/sound/direct_sound_samples/cries/huntail.aif b/sound/direct_sound_samples/cries/huntail.aif deleted file mode 100644 index b520d2b7a8c3..000000000000 Binary files a/sound/direct_sound_samples/cries/huntail.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/huntail.wav b/sound/direct_sound_samples/cries/huntail.wav new file mode 100644 index 000000000000..b2e3f99853a7 Binary files /dev/null and b/sound/direct_sound_samples/cries/huntail.wav differ diff --git a/sound/direct_sound_samples/cries/hydrapple.aif b/sound/direct_sound_samples/cries/hydrapple.aif deleted file mode 100644 index 45f5fd9ca019..000000000000 Binary files a/sound/direct_sound_samples/cries/hydrapple.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/hydrapple.wav b/sound/direct_sound_samples/cries/hydrapple.wav new file mode 100644 index 000000000000..e3da4677a810 Binary files /dev/null and b/sound/direct_sound_samples/cries/hydrapple.wav differ diff --git a/sound/direct_sound_samples/cries/hydreigon.aif b/sound/direct_sound_samples/cries/hydreigon.aif deleted file mode 100644 index 8227c6d21f63..000000000000 Binary files a/sound/direct_sound_samples/cries/hydreigon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/hydreigon.wav b/sound/direct_sound_samples/cries/hydreigon.wav new file mode 100644 index 000000000000..ce816dcc5810 Binary files /dev/null and b/sound/direct_sound_samples/cries/hydreigon.wav differ diff --git a/sound/direct_sound_samples/cries/hypno.aif b/sound/direct_sound_samples/cries/hypno.aif deleted file mode 100644 index 7c4bde193683..000000000000 Binary files a/sound/direct_sound_samples/cries/hypno.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/hypno.wav b/sound/direct_sound_samples/cries/hypno.wav new file mode 100644 index 000000000000..4369110c2cc6 Binary files /dev/null and b/sound/direct_sound_samples/cries/hypno.wav differ diff --git a/sound/direct_sound_samples/cries/igglybuff.aif b/sound/direct_sound_samples/cries/igglybuff.aif deleted file mode 100644 index 0f2db1e52c6c..000000000000 Binary files a/sound/direct_sound_samples/cries/igglybuff.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/igglybuff.wav b/sound/direct_sound_samples/cries/igglybuff.wav new file mode 100644 index 000000000000..efec9bf4c4ea Binary files /dev/null and b/sound/direct_sound_samples/cries/igglybuff.wav differ diff --git a/sound/direct_sound_samples/cries/illumise.aif b/sound/direct_sound_samples/cries/illumise.aif deleted file mode 100644 index 26807295bd8a..000000000000 Binary files a/sound/direct_sound_samples/cries/illumise.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/illumise.wav b/sound/direct_sound_samples/cries/illumise.wav new file mode 100644 index 000000000000..6570492f7972 Binary files /dev/null and b/sound/direct_sound_samples/cries/illumise.wav differ diff --git a/sound/direct_sound_samples/cries/impidimp.aif b/sound/direct_sound_samples/cries/impidimp.aif deleted file mode 100644 index 0abad6cb1ea3..000000000000 Binary files a/sound/direct_sound_samples/cries/impidimp.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/impidimp.wav b/sound/direct_sound_samples/cries/impidimp.wav new file mode 100644 index 000000000000..1bc578a9b833 Binary files /dev/null and b/sound/direct_sound_samples/cries/impidimp.wav differ diff --git a/sound/direct_sound_samples/cries/incineroar.aif b/sound/direct_sound_samples/cries/incineroar.aif deleted file mode 100644 index b7f3e2201efb..000000000000 Binary files a/sound/direct_sound_samples/cries/incineroar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/incineroar.wav b/sound/direct_sound_samples/cries/incineroar.wav new file mode 100644 index 000000000000..f4b9bcd59899 Binary files /dev/null and b/sound/direct_sound_samples/cries/incineroar.wav differ diff --git a/sound/direct_sound_samples/cries/indeedee_female.aif b/sound/direct_sound_samples/cries/indeedee_female.aif deleted file mode 100644 index b5e5fe454739..000000000000 Binary files a/sound/direct_sound_samples/cries/indeedee_female.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/indeedee_female.wav b/sound/direct_sound_samples/cries/indeedee_female.wav new file mode 100644 index 000000000000..f7b563c1d111 Binary files /dev/null and b/sound/direct_sound_samples/cries/indeedee_female.wav differ diff --git a/sound/direct_sound_samples/cries/indeedee_male.aif b/sound/direct_sound_samples/cries/indeedee_male.aif deleted file mode 100644 index b5d950391e94..000000000000 Binary files a/sound/direct_sound_samples/cries/indeedee_male.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/indeedee_male.wav b/sound/direct_sound_samples/cries/indeedee_male.wav new file mode 100644 index 000000000000..554ec96593fc Binary files /dev/null and b/sound/direct_sound_samples/cries/indeedee_male.wav differ diff --git a/sound/direct_sound_samples/cries/infernape.aif b/sound/direct_sound_samples/cries/infernape.aif deleted file mode 100644 index d4570a8f3a60..000000000000 Binary files a/sound/direct_sound_samples/cries/infernape.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/infernape.wav b/sound/direct_sound_samples/cries/infernape.wav new file mode 100644 index 000000000000..71e4af161dfc Binary files /dev/null and b/sound/direct_sound_samples/cries/infernape.wav differ diff --git a/sound/direct_sound_samples/cries/inkay.aif b/sound/direct_sound_samples/cries/inkay.aif deleted file mode 100644 index 04753026e065..000000000000 Binary files a/sound/direct_sound_samples/cries/inkay.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/inkay.wav b/sound/direct_sound_samples/cries/inkay.wav new file mode 100644 index 000000000000..dace2b5c2487 Binary files /dev/null and b/sound/direct_sound_samples/cries/inkay.wav differ diff --git a/sound/direct_sound_samples/cries/inteleon.aif b/sound/direct_sound_samples/cries/inteleon.aif deleted file mode 100644 index 8153b02889b4..000000000000 Binary files a/sound/direct_sound_samples/cries/inteleon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/inteleon.wav b/sound/direct_sound_samples/cries/inteleon.wav new file mode 100644 index 000000000000..8bef61a449db Binary files /dev/null and b/sound/direct_sound_samples/cries/inteleon.wav differ diff --git a/sound/direct_sound_samples/cries/iron_boulder.aif b/sound/direct_sound_samples/cries/iron_boulder.aif deleted file mode 100644 index 0ffdefdffb35..000000000000 Binary files a/sound/direct_sound_samples/cries/iron_boulder.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/iron_boulder.wav b/sound/direct_sound_samples/cries/iron_boulder.wav new file mode 100644 index 000000000000..df02d73d5c2f Binary files /dev/null and b/sound/direct_sound_samples/cries/iron_boulder.wav differ diff --git a/sound/direct_sound_samples/cries/iron_bundle.aif b/sound/direct_sound_samples/cries/iron_bundle.aif deleted file mode 100644 index 51c9e0b60cee..000000000000 Binary files a/sound/direct_sound_samples/cries/iron_bundle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/iron_bundle.wav b/sound/direct_sound_samples/cries/iron_bundle.wav new file mode 100644 index 000000000000..796ee101fe62 Binary files /dev/null and b/sound/direct_sound_samples/cries/iron_bundle.wav differ diff --git a/sound/direct_sound_samples/cries/iron_crown.aif b/sound/direct_sound_samples/cries/iron_crown.aif deleted file mode 100644 index 8c310455dcd2..000000000000 Binary files a/sound/direct_sound_samples/cries/iron_crown.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/iron_crown.wav b/sound/direct_sound_samples/cries/iron_crown.wav new file mode 100644 index 000000000000..984f1c5a7901 Binary files /dev/null and b/sound/direct_sound_samples/cries/iron_crown.wav differ diff --git a/sound/direct_sound_samples/cries/iron_hands.aif b/sound/direct_sound_samples/cries/iron_hands.aif deleted file mode 100644 index 621e4fdc19fb..000000000000 Binary files a/sound/direct_sound_samples/cries/iron_hands.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/iron_hands.wav b/sound/direct_sound_samples/cries/iron_hands.wav new file mode 100644 index 000000000000..c5b033226393 Binary files /dev/null and b/sound/direct_sound_samples/cries/iron_hands.wav differ diff --git a/sound/direct_sound_samples/cries/iron_jugulis.aif b/sound/direct_sound_samples/cries/iron_jugulis.aif deleted file mode 100644 index 8409934f8935..000000000000 Binary files a/sound/direct_sound_samples/cries/iron_jugulis.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/iron_jugulis.wav b/sound/direct_sound_samples/cries/iron_jugulis.wav new file mode 100644 index 000000000000..a6e883a57b13 Binary files /dev/null and b/sound/direct_sound_samples/cries/iron_jugulis.wav differ diff --git a/sound/direct_sound_samples/cries/iron_leaves.aif b/sound/direct_sound_samples/cries/iron_leaves.aif deleted file mode 100644 index 45e0a420e2d5..000000000000 Binary files a/sound/direct_sound_samples/cries/iron_leaves.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/iron_leaves.wav b/sound/direct_sound_samples/cries/iron_leaves.wav new file mode 100644 index 000000000000..b22f193e99b4 Binary files /dev/null and b/sound/direct_sound_samples/cries/iron_leaves.wav differ diff --git a/sound/direct_sound_samples/cries/iron_moth.aif b/sound/direct_sound_samples/cries/iron_moth.aif deleted file mode 100644 index fb90d304815f..000000000000 Binary files a/sound/direct_sound_samples/cries/iron_moth.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/iron_moth.wav b/sound/direct_sound_samples/cries/iron_moth.wav new file mode 100644 index 000000000000..297be2d0b9be Binary files /dev/null and b/sound/direct_sound_samples/cries/iron_moth.wav differ diff --git a/sound/direct_sound_samples/cries/iron_thorns.aif b/sound/direct_sound_samples/cries/iron_thorns.aif deleted file mode 100644 index ac88055c6d39..000000000000 Binary files a/sound/direct_sound_samples/cries/iron_thorns.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/iron_thorns.wav b/sound/direct_sound_samples/cries/iron_thorns.wav new file mode 100644 index 000000000000..b04462c057d0 Binary files /dev/null and b/sound/direct_sound_samples/cries/iron_thorns.wav differ diff --git a/sound/direct_sound_samples/cries/iron_treads.aif b/sound/direct_sound_samples/cries/iron_treads.aif deleted file mode 100644 index e3b047171179..000000000000 Binary files a/sound/direct_sound_samples/cries/iron_treads.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/iron_treads.wav b/sound/direct_sound_samples/cries/iron_treads.wav new file mode 100644 index 000000000000..51f3143b5bc7 Binary files /dev/null and b/sound/direct_sound_samples/cries/iron_treads.wav differ diff --git a/sound/direct_sound_samples/cries/iron_valiant.aif b/sound/direct_sound_samples/cries/iron_valiant.aif deleted file mode 100644 index 04220e9f627f..000000000000 Binary files a/sound/direct_sound_samples/cries/iron_valiant.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/iron_valiant.wav b/sound/direct_sound_samples/cries/iron_valiant.wav new file mode 100644 index 000000000000..bf110f88a373 Binary files /dev/null and b/sound/direct_sound_samples/cries/iron_valiant.wav differ diff --git a/sound/direct_sound_samples/cries/ivysaur.aif b/sound/direct_sound_samples/cries/ivysaur.aif deleted file mode 100644 index 40ee462805e9..000000000000 Binary files a/sound/direct_sound_samples/cries/ivysaur.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ivysaur.wav b/sound/direct_sound_samples/cries/ivysaur.wav new file mode 100644 index 000000000000..07d10c0e8d53 Binary files /dev/null and b/sound/direct_sound_samples/cries/ivysaur.wav differ diff --git a/sound/direct_sound_samples/cries/jangmo_o.aif b/sound/direct_sound_samples/cries/jangmo_o.aif deleted file mode 100644 index 29f8f86b51ce..000000000000 Binary files a/sound/direct_sound_samples/cries/jangmo_o.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/jangmo_o.wav b/sound/direct_sound_samples/cries/jangmo_o.wav new file mode 100644 index 000000000000..96e08b0c9644 Binary files /dev/null and b/sound/direct_sound_samples/cries/jangmo_o.wav differ diff --git a/sound/direct_sound_samples/cries/jellicent.aif b/sound/direct_sound_samples/cries/jellicent.aif deleted file mode 100644 index 33f6cf5aeabe..000000000000 Binary files a/sound/direct_sound_samples/cries/jellicent.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/jellicent.wav b/sound/direct_sound_samples/cries/jellicent.wav new file mode 100644 index 000000000000..221c78786452 Binary files /dev/null and b/sound/direct_sound_samples/cries/jellicent.wav differ diff --git a/sound/direct_sound_samples/cries/jigglypuff.aif b/sound/direct_sound_samples/cries/jigglypuff.aif deleted file mode 100644 index 09249f6dd65d..000000000000 Binary files a/sound/direct_sound_samples/cries/jigglypuff.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/jigglypuff.wav b/sound/direct_sound_samples/cries/jigglypuff.wav new file mode 100644 index 000000000000..d3e925fe940b Binary files /dev/null and b/sound/direct_sound_samples/cries/jigglypuff.wav differ diff --git a/sound/direct_sound_samples/cries/jirachi.aif b/sound/direct_sound_samples/cries/jirachi.aif deleted file mode 100644 index 0da759794c88..000000000000 Binary files a/sound/direct_sound_samples/cries/jirachi.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/jirachi.wav b/sound/direct_sound_samples/cries/jirachi.wav new file mode 100644 index 000000000000..43850cbaa01e Binary files /dev/null and b/sound/direct_sound_samples/cries/jirachi.wav differ diff --git a/sound/direct_sound_samples/cries/jolteon.aif b/sound/direct_sound_samples/cries/jolteon.aif deleted file mode 100644 index acd96714aeb2..000000000000 Binary files a/sound/direct_sound_samples/cries/jolteon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/jolteon.wav b/sound/direct_sound_samples/cries/jolteon.wav new file mode 100644 index 000000000000..8c5f8bea4c62 Binary files /dev/null and b/sound/direct_sound_samples/cries/jolteon.wav differ diff --git a/sound/direct_sound_samples/cries/joltik.aif b/sound/direct_sound_samples/cries/joltik.aif deleted file mode 100644 index a67354d74ce5..000000000000 Binary files a/sound/direct_sound_samples/cries/joltik.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/joltik.wav b/sound/direct_sound_samples/cries/joltik.wav new file mode 100644 index 000000000000..4fa360d6b6b2 Binary files /dev/null and b/sound/direct_sound_samples/cries/joltik.wav differ diff --git a/sound/direct_sound_samples/cries/jumpluff.aif b/sound/direct_sound_samples/cries/jumpluff.aif deleted file mode 100644 index 2b93dad55868..000000000000 Binary files a/sound/direct_sound_samples/cries/jumpluff.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/jumpluff.wav b/sound/direct_sound_samples/cries/jumpluff.wav new file mode 100644 index 000000000000..cce951b1f72d Binary files /dev/null and b/sound/direct_sound_samples/cries/jumpluff.wav differ diff --git a/sound/direct_sound_samples/cries/jynx.aif b/sound/direct_sound_samples/cries/jynx.aif deleted file mode 100644 index cbcd7ee99de6..000000000000 Binary files a/sound/direct_sound_samples/cries/jynx.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/jynx.wav b/sound/direct_sound_samples/cries/jynx.wav new file mode 100644 index 000000000000..faacb1e95770 Binary files /dev/null and b/sound/direct_sound_samples/cries/jynx.wav differ diff --git a/sound/direct_sound_samples/cries/kabuto.aif b/sound/direct_sound_samples/cries/kabuto.aif deleted file mode 100644 index 2ed73716cbf5..000000000000 Binary files a/sound/direct_sound_samples/cries/kabuto.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kabuto.wav b/sound/direct_sound_samples/cries/kabuto.wav new file mode 100644 index 000000000000..448b17891446 Binary files /dev/null and b/sound/direct_sound_samples/cries/kabuto.wav differ diff --git a/sound/direct_sound_samples/cries/kabutops.aif b/sound/direct_sound_samples/cries/kabutops.aif deleted file mode 100644 index 79a4b304a821..000000000000 Binary files a/sound/direct_sound_samples/cries/kabutops.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kabutops.wav b/sound/direct_sound_samples/cries/kabutops.wav new file mode 100644 index 000000000000..0c7b74fea394 Binary files /dev/null and b/sound/direct_sound_samples/cries/kabutops.wav differ diff --git a/sound/direct_sound_samples/cries/kadabra.aif b/sound/direct_sound_samples/cries/kadabra.aif deleted file mode 100644 index 3f03ee03f0f1..000000000000 Binary files a/sound/direct_sound_samples/cries/kadabra.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kadabra.wav b/sound/direct_sound_samples/cries/kadabra.wav new file mode 100644 index 000000000000..d7030b27a27a Binary files /dev/null and b/sound/direct_sound_samples/cries/kadabra.wav differ diff --git a/sound/direct_sound_samples/cries/kakuna.aif b/sound/direct_sound_samples/cries/kakuna.aif deleted file mode 100644 index 8331b0b0e580..000000000000 Binary files a/sound/direct_sound_samples/cries/kakuna.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kakuna.wav b/sound/direct_sound_samples/cries/kakuna.wav new file mode 100644 index 000000000000..f147428e3858 Binary files /dev/null and b/sound/direct_sound_samples/cries/kakuna.wav differ diff --git a/sound/direct_sound_samples/cries/kangaskhan.aif b/sound/direct_sound_samples/cries/kangaskhan.aif deleted file mode 100644 index 26a8ac43a404..000000000000 Binary files a/sound/direct_sound_samples/cries/kangaskhan.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kangaskhan.wav b/sound/direct_sound_samples/cries/kangaskhan.wav new file mode 100644 index 000000000000..eaf724462739 Binary files /dev/null and b/sound/direct_sound_samples/cries/kangaskhan.wav differ diff --git a/sound/direct_sound_samples/cries/kangaskhan_mega.aif b/sound/direct_sound_samples/cries/kangaskhan_mega.aif deleted file mode 100644 index 417cb04f49e5..000000000000 Binary files a/sound/direct_sound_samples/cries/kangaskhan_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kangaskhan_mega.wav b/sound/direct_sound_samples/cries/kangaskhan_mega.wav new file mode 100644 index 000000000000..5c967473812d Binary files /dev/null and b/sound/direct_sound_samples/cries/kangaskhan_mega.wav differ diff --git a/sound/direct_sound_samples/cries/karrablast.aif b/sound/direct_sound_samples/cries/karrablast.aif deleted file mode 100644 index 7b5a2c3948a6..000000000000 Binary files a/sound/direct_sound_samples/cries/karrablast.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/karrablast.wav b/sound/direct_sound_samples/cries/karrablast.wav new file mode 100644 index 000000000000..b77a4399dee2 Binary files /dev/null and b/sound/direct_sound_samples/cries/karrablast.wav differ diff --git a/sound/direct_sound_samples/cries/kartana.aif b/sound/direct_sound_samples/cries/kartana.aif deleted file mode 100644 index b43fa40d7833..000000000000 Binary files a/sound/direct_sound_samples/cries/kartana.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kartana.wav b/sound/direct_sound_samples/cries/kartana.wav new file mode 100644 index 000000000000..af53ba2608d4 Binary files /dev/null and b/sound/direct_sound_samples/cries/kartana.wav differ diff --git a/sound/direct_sound_samples/cries/kecleon.aif b/sound/direct_sound_samples/cries/kecleon.aif deleted file mode 100644 index 51dae2935044..000000000000 Binary files a/sound/direct_sound_samples/cries/kecleon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kecleon.wav b/sound/direct_sound_samples/cries/kecleon.wav new file mode 100644 index 000000000000..96ab74ff2b18 Binary files /dev/null and b/sound/direct_sound_samples/cries/kecleon.wav differ diff --git a/sound/direct_sound_samples/cries/keldeo.aif b/sound/direct_sound_samples/cries/keldeo.aif deleted file mode 100644 index 6f23ad088557..000000000000 Binary files a/sound/direct_sound_samples/cries/keldeo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/keldeo.wav b/sound/direct_sound_samples/cries/keldeo.wav new file mode 100644 index 000000000000..e1733f166027 Binary files /dev/null and b/sound/direct_sound_samples/cries/keldeo.wav differ diff --git a/sound/direct_sound_samples/cries/kilowattrel.aif b/sound/direct_sound_samples/cries/kilowattrel.aif deleted file mode 100644 index d54d4a43b5a3..000000000000 Binary files a/sound/direct_sound_samples/cries/kilowattrel.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kilowattrel.wav b/sound/direct_sound_samples/cries/kilowattrel.wav new file mode 100644 index 000000000000..b1b27b8ebe79 Binary files /dev/null and b/sound/direct_sound_samples/cries/kilowattrel.wav differ diff --git a/sound/direct_sound_samples/cries/kingambit.aif b/sound/direct_sound_samples/cries/kingambit.aif deleted file mode 100644 index 38a3d1b6cc6f..000000000000 Binary files a/sound/direct_sound_samples/cries/kingambit.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kingambit.wav b/sound/direct_sound_samples/cries/kingambit.wav new file mode 100644 index 000000000000..0770f23f5a5f Binary files /dev/null and b/sound/direct_sound_samples/cries/kingambit.wav differ diff --git a/sound/direct_sound_samples/cries/kingdra.aif b/sound/direct_sound_samples/cries/kingdra.aif deleted file mode 100644 index a9cc1d9fe489..000000000000 Binary files a/sound/direct_sound_samples/cries/kingdra.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kingdra.wav b/sound/direct_sound_samples/cries/kingdra.wav new file mode 100644 index 000000000000..2a47d1479d02 Binary files /dev/null and b/sound/direct_sound_samples/cries/kingdra.wav differ diff --git a/sound/direct_sound_samples/cries/kingler.aif b/sound/direct_sound_samples/cries/kingler.aif deleted file mode 100644 index b8368297313b..000000000000 Binary files a/sound/direct_sound_samples/cries/kingler.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kingler.wav b/sound/direct_sound_samples/cries/kingler.wav new file mode 100644 index 000000000000..62418456d010 Binary files /dev/null and b/sound/direct_sound_samples/cries/kingler.wav differ diff --git a/sound/direct_sound_samples/cries/kirlia.aif b/sound/direct_sound_samples/cries/kirlia.aif deleted file mode 100644 index 0beaebf16f38..000000000000 Binary files a/sound/direct_sound_samples/cries/kirlia.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kirlia.wav b/sound/direct_sound_samples/cries/kirlia.wav new file mode 100644 index 000000000000..c7dd3078c8f5 Binary files /dev/null and b/sound/direct_sound_samples/cries/kirlia.wav differ diff --git a/sound/direct_sound_samples/cries/klang.aif b/sound/direct_sound_samples/cries/klang.aif deleted file mode 100644 index 13b28861f4ae..000000000000 Binary files a/sound/direct_sound_samples/cries/klang.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/klang.wav b/sound/direct_sound_samples/cries/klang.wav new file mode 100644 index 000000000000..2524393b24ad Binary files /dev/null and b/sound/direct_sound_samples/cries/klang.wav differ diff --git a/sound/direct_sound_samples/cries/klawf.aif b/sound/direct_sound_samples/cries/klawf.aif deleted file mode 100644 index 8359e13b1786..000000000000 Binary files a/sound/direct_sound_samples/cries/klawf.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/klawf.wav b/sound/direct_sound_samples/cries/klawf.wav new file mode 100644 index 000000000000..8d557afc68f3 Binary files /dev/null and b/sound/direct_sound_samples/cries/klawf.wav differ diff --git a/sound/direct_sound_samples/cries/kleavor.aif b/sound/direct_sound_samples/cries/kleavor.aif deleted file mode 100644 index c84a31cf2ff4..000000000000 Binary files a/sound/direct_sound_samples/cries/kleavor.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kleavor.wav b/sound/direct_sound_samples/cries/kleavor.wav new file mode 100644 index 000000000000..ac60149c3f51 Binary files /dev/null and b/sound/direct_sound_samples/cries/kleavor.wav differ diff --git a/sound/direct_sound_samples/cries/klink.aif b/sound/direct_sound_samples/cries/klink.aif deleted file mode 100644 index 0bd6b65f7461..000000000000 Binary files a/sound/direct_sound_samples/cries/klink.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/klink.wav b/sound/direct_sound_samples/cries/klink.wav new file mode 100644 index 000000000000..0233d44ce2bc Binary files /dev/null and b/sound/direct_sound_samples/cries/klink.wav differ diff --git a/sound/direct_sound_samples/cries/klinklang.aif b/sound/direct_sound_samples/cries/klinklang.aif deleted file mode 100644 index 35117bf30a5b..000000000000 Binary files a/sound/direct_sound_samples/cries/klinklang.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/klinklang.wav b/sound/direct_sound_samples/cries/klinklang.wav new file mode 100644 index 000000000000..6cba25f48c2c Binary files /dev/null and b/sound/direct_sound_samples/cries/klinklang.wav differ diff --git a/sound/direct_sound_samples/cries/koffing.aif b/sound/direct_sound_samples/cries/koffing.aif deleted file mode 100644 index 50d5bc978bb5..000000000000 Binary files a/sound/direct_sound_samples/cries/koffing.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/koffing.wav b/sound/direct_sound_samples/cries/koffing.wav new file mode 100644 index 000000000000..afa520c03e3c Binary files /dev/null and b/sound/direct_sound_samples/cries/koffing.wav differ diff --git a/sound/direct_sound_samples/cries/komala.aif b/sound/direct_sound_samples/cries/komala.aif deleted file mode 100644 index e084c9a7c4e0..000000000000 Binary files a/sound/direct_sound_samples/cries/komala.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/komala.wav b/sound/direct_sound_samples/cries/komala.wav new file mode 100644 index 000000000000..ce1077a9acb0 Binary files /dev/null and b/sound/direct_sound_samples/cries/komala.wav differ diff --git a/sound/direct_sound_samples/cries/kommo_o.aif b/sound/direct_sound_samples/cries/kommo_o.aif deleted file mode 100644 index 057153e907df..000000000000 Binary files a/sound/direct_sound_samples/cries/kommo_o.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kommo_o.wav b/sound/direct_sound_samples/cries/kommo_o.wav new file mode 100644 index 000000000000..0782ecd776b4 Binary files /dev/null and b/sound/direct_sound_samples/cries/kommo_o.wav differ diff --git a/sound/direct_sound_samples/cries/koraidon.aif b/sound/direct_sound_samples/cries/koraidon.aif deleted file mode 100644 index 6ab93ad73ec9..000000000000 Binary files a/sound/direct_sound_samples/cries/koraidon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/koraidon.wav b/sound/direct_sound_samples/cries/koraidon.wav new file mode 100644 index 000000000000..cf5de8aff38c Binary files /dev/null and b/sound/direct_sound_samples/cries/koraidon.wav differ diff --git a/sound/direct_sound_samples/cries/krabby.aif b/sound/direct_sound_samples/cries/krabby.aif deleted file mode 100644 index 33b8ea294b6b..000000000000 Binary files a/sound/direct_sound_samples/cries/krabby.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/krabby.wav b/sound/direct_sound_samples/cries/krabby.wav new file mode 100644 index 000000000000..0072ea777aa9 Binary files /dev/null and b/sound/direct_sound_samples/cries/krabby.wav differ diff --git a/sound/direct_sound_samples/cries/kricketot.aif b/sound/direct_sound_samples/cries/kricketot.aif deleted file mode 100644 index 7b301cc485a0..000000000000 Binary files a/sound/direct_sound_samples/cries/kricketot.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kricketot.wav b/sound/direct_sound_samples/cries/kricketot.wav new file mode 100644 index 000000000000..126bbecee8e9 Binary files /dev/null and b/sound/direct_sound_samples/cries/kricketot.wav differ diff --git a/sound/direct_sound_samples/cries/kricketune.aif b/sound/direct_sound_samples/cries/kricketune.aif deleted file mode 100644 index b3ebcbf8ae25..000000000000 Binary files a/sound/direct_sound_samples/cries/kricketune.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kricketune.wav b/sound/direct_sound_samples/cries/kricketune.wav new file mode 100644 index 000000000000..832069528a87 Binary files /dev/null and b/sound/direct_sound_samples/cries/kricketune.wav differ diff --git a/sound/direct_sound_samples/cries/krokorok.aif b/sound/direct_sound_samples/cries/krokorok.aif deleted file mode 100644 index 39765627ece1..000000000000 Binary files a/sound/direct_sound_samples/cries/krokorok.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/krokorok.wav b/sound/direct_sound_samples/cries/krokorok.wav new file mode 100644 index 000000000000..cf2f75dc8ea3 Binary files /dev/null and b/sound/direct_sound_samples/cries/krokorok.wav differ diff --git a/sound/direct_sound_samples/cries/krookodile.aif b/sound/direct_sound_samples/cries/krookodile.aif deleted file mode 100644 index 4b532b3bd1e2..000000000000 Binary files a/sound/direct_sound_samples/cries/krookodile.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/krookodile.wav b/sound/direct_sound_samples/cries/krookodile.wav new file mode 100644 index 000000000000..0abdce9be762 Binary files /dev/null and b/sound/direct_sound_samples/cries/krookodile.wav differ diff --git a/sound/direct_sound_samples/cries/kubfu.aif b/sound/direct_sound_samples/cries/kubfu.aif deleted file mode 100644 index dd45534b88d7..000000000000 Binary files a/sound/direct_sound_samples/cries/kubfu.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kubfu.wav b/sound/direct_sound_samples/cries/kubfu.wav new file mode 100644 index 000000000000..899b03f7a9ec Binary files /dev/null and b/sound/direct_sound_samples/cries/kubfu.wav differ diff --git a/sound/direct_sound_samples/cries/kyogre.aif b/sound/direct_sound_samples/cries/kyogre.aif deleted file mode 100644 index c20d2cf3240e..000000000000 Binary files a/sound/direct_sound_samples/cries/kyogre.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kyogre.wav b/sound/direct_sound_samples/cries/kyogre.wav new file mode 100644 index 000000000000..00db984c665e Binary files /dev/null and b/sound/direct_sound_samples/cries/kyogre.wav differ diff --git a/sound/direct_sound_samples/cries/kyogre_primal.aif b/sound/direct_sound_samples/cries/kyogre_primal.aif deleted file mode 100644 index b7999915b34a..000000000000 Binary files a/sound/direct_sound_samples/cries/kyogre_primal.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kyogre_primal.wav b/sound/direct_sound_samples/cries/kyogre_primal.wav new file mode 100644 index 000000000000..1688dad88b7b Binary files /dev/null and b/sound/direct_sound_samples/cries/kyogre_primal.wav differ diff --git a/sound/direct_sound_samples/cries/kyurem.aif b/sound/direct_sound_samples/cries/kyurem.aif deleted file mode 100644 index 0345a0c17597..000000000000 Binary files a/sound/direct_sound_samples/cries/kyurem.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kyurem.wav b/sound/direct_sound_samples/cries/kyurem.wav new file mode 100644 index 000000000000..d33514448ee6 Binary files /dev/null and b/sound/direct_sound_samples/cries/kyurem.wav differ diff --git a/sound/direct_sound_samples/cries/kyurem_black.aif b/sound/direct_sound_samples/cries/kyurem_black.aif deleted file mode 100644 index 9b5320bd63f2..000000000000 Binary files a/sound/direct_sound_samples/cries/kyurem_black.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kyurem_black.wav b/sound/direct_sound_samples/cries/kyurem_black.wav new file mode 100644 index 000000000000..385bd7824f0b Binary files /dev/null and b/sound/direct_sound_samples/cries/kyurem_black.wav differ diff --git a/sound/direct_sound_samples/cries/kyurem_white.aif b/sound/direct_sound_samples/cries/kyurem_white.aif deleted file mode 100644 index 1e6f0283ec74..000000000000 Binary files a/sound/direct_sound_samples/cries/kyurem_white.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/kyurem_white.wav b/sound/direct_sound_samples/cries/kyurem_white.wav new file mode 100644 index 000000000000..7a4b8dbd7cc4 Binary files /dev/null and b/sound/direct_sound_samples/cries/kyurem_white.wav differ diff --git a/sound/direct_sound_samples/cries/lairon.aif b/sound/direct_sound_samples/cries/lairon.aif deleted file mode 100644 index 44bc57df17be..000000000000 Binary files a/sound/direct_sound_samples/cries/lairon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lairon.wav b/sound/direct_sound_samples/cries/lairon.wav new file mode 100644 index 000000000000..574ffac74564 Binary files /dev/null and b/sound/direct_sound_samples/cries/lairon.wav differ diff --git a/sound/direct_sound_samples/cries/lampent.aif b/sound/direct_sound_samples/cries/lampent.aif deleted file mode 100644 index 9d5a8a3c0196..000000000000 Binary files a/sound/direct_sound_samples/cries/lampent.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lampent.wav b/sound/direct_sound_samples/cries/lampent.wav new file mode 100644 index 000000000000..e92380e5ad32 Binary files /dev/null and b/sound/direct_sound_samples/cries/lampent.wav differ diff --git a/sound/direct_sound_samples/cries/landorus_incarnate.aif b/sound/direct_sound_samples/cries/landorus_incarnate.aif deleted file mode 100644 index 03111963d7e2..000000000000 Binary files a/sound/direct_sound_samples/cries/landorus_incarnate.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/landorus_incarnate.wav b/sound/direct_sound_samples/cries/landorus_incarnate.wav new file mode 100644 index 000000000000..82c79ea48f24 Binary files /dev/null and b/sound/direct_sound_samples/cries/landorus_incarnate.wav differ diff --git a/sound/direct_sound_samples/cries/landorus_therian.aif b/sound/direct_sound_samples/cries/landorus_therian.aif deleted file mode 100644 index 6a641cf6f4ba..000000000000 Binary files a/sound/direct_sound_samples/cries/landorus_therian.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/landorus_therian.wav b/sound/direct_sound_samples/cries/landorus_therian.wav new file mode 100644 index 000000000000..246f4b259557 Binary files /dev/null and b/sound/direct_sound_samples/cries/landorus_therian.wav differ diff --git a/sound/direct_sound_samples/cries/lanturn.aif b/sound/direct_sound_samples/cries/lanturn.aif deleted file mode 100644 index e88570f68dfa..000000000000 Binary files a/sound/direct_sound_samples/cries/lanturn.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lanturn.wav b/sound/direct_sound_samples/cries/lanturn.wav new file mode 100644 index 000000000000..6d8b21dd99e3 Binary files /dev/null and b/sound/direct_sound_samples/cries/lanturn.wav differ diff --git a/sound/direct_sound_samples/cries/lapras.aif b/sound/direct_sound_samples/cries/lapras.aif deleted file mode 100644 index 9bc9023730e1..000000000000 Binary files a/sound/direct_sound_samples/cries/lapras.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lapras.wav b/sound/direct_sound_samples/cries/lapras.wav new file mode 100644 index 000000000000..d79819a971e8 Binary files /dev/null and b/sound/direct_sound_samples/cries/lapras.wav differ diff --git a/sound/direct_sound_samples/cries/larvesta.aif b/sound/direct_sound_samples/cries/larvesta.aif deleted file mode 100644 index a025df32bf53..000000000000 Binary files a/sound/direct_sound_samples/cries/larvesta.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/larvesta.wav b/sound/direct_sound_samples/cries/larvesta.wav new file mode 100644 index 000000000000..3c1fb5a46a26 Binary files /dev/null and b/sound/direct_sound_samples/cries/larvesta.wav differ diff --git a/sound/direct_sound_samples/cries/larvitar.aif b/sound/direct_sound_samples/cries/larvitar.aif deleted file mode 100644 index fd91d5bc7d28..000000000000 Binary files a/sound/direct_sound_samples/cries/larvitar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/larvitar.wav b/sound/direct_sound_samples/cries/larvitar.wav new file mode 100644 index 000000000000..e0e22cd6f5a9 Binary files /dev/null and b/sound/direct_sound_samples/cries/larvitar.wav differ diff --git a/sound/direct_sound_samples/cries/latias.aif b/sound/direct_sound_samples/cries/latias.aif deleted file mode 100644 index 90f558abc8b3..000000000000 Binary files a/sound/direct_sound_samples/cries/latias.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/latias.wav b/sound/direct_sound_samples/cries/latias.wav new file mode 100644 index 000000000000..87e6205ada5d Binary files /dev/null and b/sound/direct_sound_samples/cries/latias.wav differ diff --git a/sound/direct_sound_samples/cries/latias_mega.aif b/sound/direct_sound_samples/cries/latias_mega.aif deleted file mode 100644 index 0dc1b8990661..000000000000 Binary files a/sound/direct_sound_samples/cries/latias_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/latias_mega.wav b/sound/direct_sound_samples/cries/latias_mega.wav new file mode 100644 index 000000000000..c1b5d482335c Binary files /dev/null and b/sound/direct_sound_samples/cries/latias_mega.wav differ diff --git a/sound/direct_sound_samples/cries/latios.aif b/sound/direct_sound_samples/cries/latios.aif deleted file mode 100644 index f42446256c15..000000000000 Binary files a/sound/direct_sound_samples/cries/latios.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/latios.wav b/sound/direct_sound_samples/cries/latios.wav new file mode 100644 index 000000000000..1409dba11ade Binary files /dev/null and b/sound/direct_sound_samples/cries/latios.wav differ diff --git a/sound/direct_sound_samples/cries/latios_mega.aif b/sound/direct_sound_samples/cries/latios_mega.aif deleted file mode 100644 index 88a896035b60..000000000000 Binary files a/sound/direct_sound_samples/cries/latios_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/latios_mega.wav b/sound/direct_sound_samples/cries/latios_mega.wav new file mode 100644 index 000000000000..9a1b9754e7cd Binary files /dev/null and b/sound/direct_sound_samples/cries/latios_mega.wav differ diff --git a/sound/direct_sound_samples/cries/leafeon.aif b/sound/direct_sound_samples/cries/leafeon.aif deleted file mode 100644 index b3e7494b69f3..000000000000 Binary files a/sound/direct_sound_samples/cries/leafeon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/leafeon.wav b/sound/direct_sound_samples/cries/leafeon.wav new file mode 100644 index 000000000000..3a248e47f871 Binary files /dev/null and b/sound/direct_sound_samples/cries/leafeon.wav differ diff --git a/sound/direct_sound_samples/cries/leavanny.aif b/sound/direct_sound_samples/cries/leavanny.aif deleted file mode 100644 index 503a08ffe809..000000000000 Binary files a/sound/direct_sound_samples/cries/leavanny.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/leavanny.wav b/sound/direct_sound_samples/cries/leavanny.wav new file mode 100644 index 000000000000..e07d790e3b1f Binary files /dev/null and b/sound/direct_sound_samples/cries/leavanny.wav differ diff --git a/sound/direct_sound_samples/cries/lechonk.aif b/sound/direct_sound_samples/cries/lechonk.aif deleted file mode 100644 index f1ab3af238f6..000000000000 Binary files a/sound/direct_sound_samples/cries/lechonk.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lechonk.wav b/sound/direct_sound_samples/cries/lechonk.wav new file mode 100644 index 000000000000..7c1b4e71bdd3 Binary files /dev/null and b/sound/direct_sound_samples/cries/lechonk.wav differ diff --git a/sound/direct_sound_samples/cries/ledian.aif b/sound/direct_sound_samples/cries/ledian.aif deleted file mode 100644 index cbc86ba6ac0b..000000000000 Binary files a/sound/direct_sound_samples/cries/ledian.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ledian.wav b/sound/direct_sound_samples/cries/ledian.wav new file mode 100644 index 000000000000..554829075dd1 Binary files /dev/null and b/sound/direct_sound_samples/cries/ledian.wav differ diff --git a/sound/direct_sound_samples/cries/ledyba.aif b/sound/direct_sound_samples/cries/ledyba.aif deleted file mode 100644 index d90f6844018d..000000000000 Binary files a/sound/direct_sound_samples/cries/ledyba.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ledyba.wav b/sound/direct_sound_samples/cries/ledyba.wav new file mode 100644 index 000000000000..e539c3d60a89 Binary files /dev/null and b/sound/direct_sound_samples/cries/ledyba.wav differ diff --git a/sound/direct_sound_samples/cries/lickilicky.aif b/sound/direct_sound_samples/cries/lickilicky.aif deleted file mode 100644 index 542bbcaf8b3c..000000000000 Binary files a/sound/direct_sound_samples/cries/lickilicky.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lickilicky.wav b/sound/direct_sound_samples/cries/lickilicky.wav new file mode 100644 index 000000000000..e0e6ccf237fe Binary files /dev/null and b/sound/direct_sound_samples/cries/lickilicky.wav differ diff --git a/sound/direct_sound_samples/cries/lickitung.aif b/sound/direct_sound_samples/cries/lickitung.aif deleted file mode 100644 index c21d1b036548..000000000000 Binary files a/sound/direct_sound_samples/cries/lickitung.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lickitung.wav b/sound/direct_sound_samples/cries/lickitung.wav new file mode 100644 index 000000000000..33a0ab5ff32e Binary files /dev/null and b/sound/direct_sound_samples/cries/lickitung.wav differ diff --git a/sound/direct_sound_samples/cries/liepard.aif b/sound/direct_sound_samples/cries/liepard.aif deleted file mode 100644 index eec210c0e7c4..000000000000 Binary files a/sound/direct_sound_samples/cries/liepard.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/liepard.wav b/sound/direct_sound_samples/cries/liepard.wav new file mode 100644 index 000000000000..f88311694cde Binary files /dev/null and b/sound/direct_sound_samples/cries/liepard.wav differ diff --git a/sound/direct_sound_samples/cries/lileep.aif b/sound/direct_sound_samples/cries/lileep.aif deleted file mode 100644 index e1b750ba9480..000000000000 Binary files a/sound/direct_sound_samples/cries/lileep.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lileep.wav b/sound/direct_sound_samples/cries/lileep.wav new file mode 100644 index 000000000000..f890086d3735 Binary files /dev/null and b/sound/direct_sound_samples/cries/lileep.wav differ diff --git a/sound/direct_sound_samples/cries/lilligant.aif b/sound/direct_sound_samples/cries/lilligant.aif deleted file mode 100644 index e00b1aafc417..000000000000 Binary files a/sound/direct_sound_samples/cries/lilligant.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lilligant.wav b/sound/direct_sound_samples/cries/lilligant.wav new file mode 100644 index 000000000000..f49cd46afd5d Binary files /dev/null and b/sound/direct_sound_samples/cries/lilligant.wav differ diff --git a/sound/direct_sound_samples/cries/lillipup.aif b/sound/direct_sound_samples/cries/lillipup.aif deleted file mode 100644 index 825f5054cf8c..000000000000 Binary files a/sound/direct_sound_samples/cries/lillipup.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lillipup.wav b/sound/direct_sound_samples/cries/lillipup.wav new file mode 100644 index 000000000000..2ca638186c10 Binary files /dev/null and b/sound/direct_sound_samples/cries/lillipup.wav differ diff --git a/sound/direct_sound_samples/cries/linoone.aif b/sound/direct_sound_samples/cries/linoone.aif deleted file mode 100644 index 1db1958d4cc4..000000000000 Binary files a/sound/direct_sound_samples/cries/linoone.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/linoone.wav b/sound/direct_sound_samples/cries/linoone.wav new file mode 100644 index 000000000000..b8c191bcd0ce Binary files /dev/null and b/sound/direct_sound_samples/cries/linoone.wav differ diff --git a/sound/direct_sound_samples/cries/litleo.aif b/sound/direct_sound_samples/cries/litleo.aif deleted file mode 100644 index 417d3d470892..000000000000 Binary files a/sound/direct_sound_samples/cries/litleo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/litleo.wav b/sound/direct_sound_samples/cries/litleo.wav new file mode 100644 index 000000000000..bbd5814c1fb5 Binary files /dev/null and b/sound/direct_sound_samples/cries/litleo.wav differ diff --git a/sound/direct_sound_samples/cries/litten.aif b/sound/direct_sound_samples/cries/litten.aif deleted file mode 100644 index c2c486dd98a7..000000000000 Binary files a/sound/direct_sound_samples/cries/litten.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/litten.wav b/sound/direct_sound_samples/cries/litten.wav new file mode 100644 index 000000000000..faf794123f67 Binary files /dev/null and b/sound/direct_sound_samples/cries/litten.wav differ diff --git a/sound/direct_sound_samples/cries/litwick.aif b/sound/direct_sound_samples/cries/litwick.aif deleted file mode 100644 index c13b74920011..000000000000 Binary files a/sound/direct_sound_samples/cries/litwick.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/litwick.wav b/sound/direct_sound_samples/cries/litwick.wav new file mode 100644 index 000000000000..da405865a39e Binary files /dev/null and b/sound/direct_sound_samples/cries/litwick.wav differ diff --git a/sound/direct_sound_samples/cries/lokix.aif b/sound/direct_sound_samples/cries/lokix.aif deleted file mode 100644 index 739ae1ad5647..000000000000 Binary files a/sound/direct_sound_samples/cries/lokix.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lokix.wav b/sound/direct_sound_samples/cries/lokix.wav new file mode 100644 index 000000000000..b3d94004d713 Binary files /dev/null and b/sound/direct_sound_samples/cries/lokix.wav differ diff --git a/sound/direct_sound_samples/cries/lombre.aif b/sound/direct_sound_samples/cries/lombre.aif deleted file mode 100644 index 3839f7a32790..000000000000 Binary files a/sound/direct_sound_samples/cries/lombre.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lombre.wav b/sound/direct_sound_samples/cries/lombre.wav new file mode 100644 index 000000000000..6d7888619e14 Binary files /dev/null and b/sound/direct_sound_samples/cries/lombre.wav differ diff --git a/sound/direct_sound_samples/cries/lopunny.aif b/sound/direct_sound_samples/cries/lopunny.aif deleted file mode 100644 index f79379078500..000000000000 Binary files a/sound/direct_sound_samples/cries/lopunny.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lopunny.wav b/sound/direct_sound_samples/cries/lopunny.wav new file mode 100644 index 000000000000..8897e582a4c4 Binary files /dev/null and b/sound/direct_sound_samples/cries/lopunny.wav differ diff --git a/sound/direct_sound_samples/cries/lopunny_mega.aif b/sound/direct_sound_samples/cries/lopunny_mega.aif deleted file mode 100644 index 212df776de8a..000000000000 Binary files a/sound/direct_sound_samples/cries/lopunny_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lopunny_mega.wav b/sound/direct_sound_samples/cries/lopunny_mega.wav new file mode 100644 index 000000000000..e02e8a69ef02 Binary files /dev/null and b/sound/direct_sound_samples/cries/lopunny_mega.wav differ diff --git a/sound/direct_sound_samples/cries/lotad.aif b/sound/direct_sound_samples/cries/lotad.aif deleted file mode 100644 index 290ec548596b..000000000000 Binary files a/sound/direct_sound_samples/cries/lotad.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lotad.wav b/sound/direct_sound_samples/cries/lotad.wav new file mode 100644 index 000000000000..8e28b10f3294 Binary files /dev/null and b/sound/direct_sound_samples/cries/lotad.wav differ diff --git a/sound/direct_sound_samples/cries/loudred.aif b/sound/direct_sound_samples/cries/loudred.aif deleted file mode 100644 index d9c7465573f9..000000000000 Binary files a/sound/direct_sound_samples/cries/loudred.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/loudred.wav b/sound/direct_sound_samples/cries/loudred.wav new file mode 100644 index 000000000000..ff8b2c8104d6 Binary files /dev/null and b/sound/direct_sound_samples/cries/loudred.wav differ diff --git a/sound/direct_sound_samples/cries/lucario.aif b/sound/direct_sound_samples/cries/lucario.aif deleted file mode 100644 index 80064d64fba4..000000000000 Binary files a/sound/direct_sound_samples/cries/lucario.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lucario.wav b/sound/direct_sound_samples/cries/lucario.wav new file mode 100644 index 000000000000..78cfeac18bfa Binary files /dev/null and b/sound/direct_sound_samples/cries/lucario.wav differ diff --git a/sound/direct_sound_samples/cries/lucario_mega.aif b/sound/direct_sound_samples/cries/lucario_mega.aif deleted file mode 100644 index 1a100f4dab28..000000000000 Binary files a/sound/direct_sound_samples/cries/lucario_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lucario_mega.wav b/sound/direct_sound_samples/cries/lucario_mega.wav new file mode 100644 index 000000000000..712196516770 Binary files /dev/null and b/sound/direct_sound_samples/cries/lucario_mega.wav differ diff --git a/sound/direct_sound_samples/cries/ludicolo.aif b/sound/direct_sound_samples/cries/ludicolo.aif deleted file mode 100644 index 690cf75fe486..000000000000 Binary files a/sound/direct_sound_samples/cries/ludicolo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ludicolo.wav b/sound/direct_sound_samples/cries/ludicolo.wav new file mode 100644 index 000000000000..420ac5459513 Binary files /dev/null and b/sound/direct_sound_samples/cries/ludicolo.wav differ diff --git a/sound/direct_sound_samples/cries/lugia.aif b/sound/direct_sound_samples/cries/lugia.aif deleted file mode 100644 index 884b48591e54..000000000000 Binary files a/sound/direct_sound_samples/cries/lugia.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lugia.wav b/sound/direct_sound_samples/cries/lugia.wav new file mode 100644 index 000000000000..855920839e85 Binary files /dev/null and b/sound/direct_sound_samples/cries/lugia.wav differ diff --git a/sound/direct_sound_samples/cries/lumineon.aif b/sound/direct_sound_samples/cries/lumineon.aif deleted file mode 100644 index 0577fb557539..000000000000 Binary files a/sound/direct_sound_samples/cries/lumineon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lumineon.wav b/sound/direct_sound_samples/cries/lumineon.wav new file mode 100644 index 000000000000..fccb69a38323 Binary files /dev/null and b/sound/direct_sound_samples/cries/lumineon.wav differ diff --git a/sound/direct_sound_samples/cries/lunala.aif b/sound/direct_sound_samples/cries/lunala.aif deleted file mode 100644 index d95185de7997..000000000000 Binary files a/sound/direct_sound_samples/cries/lunala.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lunala.wav b/sound/direct_sound_samples/cries/lunala.wav new file mode 100644 index 000000000000..e82139ef1808 Binary files /dev/null and b/sound/direct_sound_samples/cries/lunala.wav differ diff --git a/sound/direct_sound_samples/cries/lunatone.aif b/sound/direct_sound_samples/cries/lunatone.aif deleted file mode 100644 index e27d7f2f6017..000000000000 Binary files a/sound/direct_sound_samples/cries/lunatone.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lunatone.wav b/sound/direct_sound_samples/cries/lunatone.wav new file mode 100644 index 000000000000..8edd9a17e19d Binary files /dev/null and b/sound/direct_sound_samples/cries/lunatone.wav differ diff --git a/sound/direct_sound_samples/cries/lurantis.aif b/sound/direct_sound_samples/cries/lurantis.aif deleted file mode 100644 index 36ab7d71e226..000000000000 Binary files a/sound/direct_sound_samples/cries/lurantis.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lurantis.wav b/sound/direct_sound_samples/cries/lurantis.wav new file mode 100644 index 000000000000..d85d414356d0 Binary files /dev/null and b/sound/direct_sound_samples/cries/lurantis.wav differ diff --git a/sound/direct_sound_samples/cries/luvdisc.aif b/sound/direct_sound_samples/cries/luvdisc.aif deleted file mode 100644 index 396aceff5e34..000000000000 Binary files a/sound/direct_sound_samples/cries/luvdisc.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/luvdisc.wav b/sound/direct_sound_samples/cries/luvdisc.wav new file mode 100644 index 000000000000..da1c84b80e5f Binary files /dev/null and b/sound/direct_sound_samples/cries/luvdisc.wav differ diff --git a/sound/direct_sound_samples/cries/luxio.aif b/sound/direct_sound_samples/cries/luxio.aif deleted file mode 100644 index f56ffe1ea0f2..000000000000 Binary files a/sound/direct_sound_samples/cries/luxio.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/luxio.wav b/sound/direct_sound_samples/cries/luxio.wav new file mode 100644 index 000000000000..9f3189f78e3f Binary files /dev/null and b/sound/direct_sound_samples/cries/luxio.wav differ diff --git a/sound/direct_sound_samples/cries/luxray.aif b/sound/direct_sound_samples/cries/luxray.aif deleted file mode 100644 index 76bf5cb5d115..000000000000 Binary files a/sound/direct_sound_samples/cries/luxray.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/luxray.wav b/sound/direct_sound_samples/cries/luxray.wav new file mode 100644 index 000000000000..7c393e1b4a61 Binary files /dev/null and b/sound/direct_sound_samples/cries/luxray.wav differ diff --git a/sound/direct_sound_samples/cries/lycanroc_dusk.aif b/sound/direct_sound_samples/cries/lycanroc_dusk.aif deleted file mode 100644 index 61d985e64aca..000000000000 Binary files a/sound/direct_sound_samples/cries/lycanroc_dusk.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lycanroc_dusk.wav b/sound/direct_sound_samples/cries/lycanroc_dusk.wav new file mode 100644 index 000000000000..6f7e05e2c741 Binary files /dev/null and b/sound/direct_sound_samples/cries/lycanroc_dusk.wav differ diff --git a/sound/direct_sound_samples/cries/lycanroc_midday.aif b/sound/direct_sound_samples/cries/lycanroc_midday.aif deleted file mode 100644 index 380d192c2216..000000000000 Binary files a/sound/direct_sound_samples/cries/lycanroc_midday.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lycanroc_midday.wav b/sound/direct_sound_samples/cries/lycanroc_midday.wav new file mode 100644 index 000000000000..db29524ad493 Binary files /dev/null and b/sound/direct_sound_samples/cries/lycanroc_midday.wav differ diff --git a/sound/direct_sound_samples/cries/lycanroc_midnight.aif b/sound/direct_sound_samples/cries/lycanroc_midnight.aif deleted file mode 100644 index e81dac8c3e4c..000000000000 Binary files a/sound/direct_sound_samples/cries/lycanroc_midnight.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/lycanroc_midnight.wav b/sound/direct_sound_samples/cries/lycanroc_midnight.wav new file mode 100644 index 000000000000..19bb4175fdf5 Binary files /dev/null and b/sound/direct_sound_samples/cries/lycanroc_midnight.wav differ diff --git a/sound/direct_sound_samples/cries/mabosstiff.aif b/sound/direct_sound_samples/cries/mabosstiff.aif deleted file mode 100644 index b66bbf731f81..000000000000 Binary files a/sound/direct_sound_samples/cries/mabosstiff.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mabosstiff.wav b/sound/direct_sound_samples/cries/mabosstiff.wav new file mode 100644 index 000000000000..245078423a93 Binary files /dev/null and b/sound/direct_sound_samples/cries/mabosstiff.wav differ diff --git a/sound/direct_sound_samples/cries/machamp.aif b/sound/direct_sound_samples/cries/machamp.aif deleted file mode 100644 index 99bcfea8983e..000000000000 Binary files a/sound/direct_sound_samples/cries/machamp.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/machamp.wav b/sound/direct_sound_samples/cries/machamp.wav new file mode 100644 index 000000000000..b7e091dc724b Binary files /dev/null and b/sound/direct_sound_samples/cries/machamp.wav differ diff --git a/sound/direct_sound_samples/cries/machoke.aif b/sound/direct_sound_samples/cries/machoke.aif deleted file mode 100644 index 241731b6fe09..000000000000 Binary files a/sound/direct_sound_samples/cries/machoke.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/machoke.wav b/sound/direct_sound_samples/cries/machoke.wav new file mode 100644 index 000000000000..5e0fc98bf1c2 Binary files /dev/null and b/sound/direct_sound_samples/cries/machoke.wav differ diff --git a/sound/direct_sound_samples/cries/machop.aif b/sound/direct_sound_samples/cries/machop.aif deleted file mode 100644 index c878dfe99f01..000000000000 Binary files a/sound/direct_sound_samples/cries/machop.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/machop.wav b/sound/direct_sound_samples/cries/machop.wav new file mode 100644 index 000000000000..a34a0ccc80bb Binary files /dev/null and b/sound/direct_sound_samples/cries/machop.wav differ diff --git a/sound/direct_sound_samples/cries/magby.aif b/sound/direct_sound_samples/cries/magby.aif deleted file mode 100644 index 69f77a3b356c..000000000000 Binary files a/sound/direct_sound_samples/cries/magby.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/magby.wav b/sound/direct_sound_samples/cries/magby.wav new file mode 100644 index 000000000000..8b083206c271 Binary files /dev/null and b/sound/direct_sound_samples/cries/magby.wav differ diff --git a/sound/direct_sound_samples/cries/magcargo.aif b/sound/direct_sound_samples/cries/magcargo.aif deleted file mode 100644 index f1127dabc4a2..000000000000 Binary files a/sound/direct_sound_samples/cries/magcargo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/magcargo.wav b/sound/direct_sound_samples/cries/magcargo.wav new file mode 100644 index 000000000000..6d97b90c1bb4 Binary files /dev/null and b/sound/direct_sound_samples/cries/magcargo.wav differ diff --git a/sound/direct_sound_samples/cries/magearna.aif b/sound/direct_sound_samples/cries/magearna.aif deleted file mode 100644 index 2e01fe5aa356..000000000000 Binary files a/sound/direct_sound_samples/cries/magearna.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/magearna.wav b/sound/direct_sound_samples/cries/magearna.wav new file mode 100644 index 000000000000..121867385d4f Binary files /dev/null and b/sound/direct_sound_samples/cries/magearna.wav differ diff --git a/sound/direct_sound_samples/cries/magikarp.aif b/sound/direct_sound_samples/cries/magikarp.aif deleted file mode 100644 index 71bdbf393973..000000000000 Binary files a/sound/direct_sound_samples/cries/magikarp.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/magikarp.wav b/sound/direct_sound_samples/cries/magikarp.wav new file mode 100644 index 000000000000..6c665d9e750b Binary files /dev/null and b/sound/direct_sound_samples/cries/magikarp.wav differ diff --git a/sound/direct_sound_samples/cries/magmar.aif b/sound/direct_sound_samples/cries/magmar.aif deleted file mode 100644 index c2a6a171aeb5..000000000000 Binary files a/sound/direct_sound_samples/cries/magmar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/magmar.wav b/sound/direct_sound_samples/cries/magmar.wav new file mode 100644 index 000000000000..902c15bf2e10 Binary files /dev/null and b/sound/direct_sound_samples/cries/magmar.wav differ diff --git a/sound/direct_sound_samples/cries/magmortar.aif b/sound/direct_sound_samples/cries/magmortar.aif deleted file mode 100644 index ae7f0ea50290..000000000000 Binary files a/sound/direct_sound_samples/cries/magmortar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/magmortar.wav b/sound/direct_sound_samples/cries/magmortar.wav new file mode 100644 index 000000000000..6db0fc45de8b Binary files /dev/null and b/sound/direct_sound_samples/cries/magmortar.wav differ diff --git a/sound/direct_sound_samples/cries/magnemite.aif b/sound/direct_sound_samples/cries/magnemite.aif deleted file mode 100644 index d468102ac934..000000000000 Binary files a/sound/direct_sound_samples/cries/magnemite.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/magnemite.wav b/sound/direct_sound_samples/cries/magnemite.wav new file mode 100644 index 000000000000..4fdc93f2960f Binary files /dev/null and b/sound/direct_sound_samples/cries/magnemite.wav differ diff --git a/sound/direct_sound_samples/cries/magneton.aif b/sound/direct_sound_samples/cries/magneton.aif deleted file mode 100644 index 30327cdbc363..000000000000 Binary files a/sound/direct_sound_samples/cries/magneton.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/magneton.wav b/sound/direct_sound_samples/cries/magneton.wav new file mode 100644 index 000000000000..d69c276443cd Binary files /dev/null and b/sound/direct_sound_samples/cries/magneton.wav differ diff --git a/sound/direct_sound_samples/cries/magnezone.aif b/sound/direct_sound_samples/cries/magnezone.aif deleted file mode 100644 index 750cbd3ac4a3..000000000000 Binary files a/sound/direct_sound_samples/cries/magnezone.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/magnezone.wav b/sound/direct_sound_samples/cries/magnezone.wav new file mode 100644 index 000000000000..5e6adaeeaab2 Binary files /dev/null and b/sound/direct_sound_samples/cries/magnezone.wav differ diff --git a/sound/direct_sound_samples/cries/makuhita.aif b/sound/direct_sound_samples/cries/makuhita.aif deleted file mode 100644 index 2dffab4bcc17..000000000000 Binary files a/sound/direct_sound_samples/cries/makuhita.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/makuhita.wav b/sound/direct_sound_samples/cries/makuhita.wav new file mode 100644 index 000000000000..79b055ef98f5 Binary files /dev/null and b/sound/direct_sound_samples/cries/makuhita.wav differ diff --git a/sound/direct_sound_samples/cries/malamar.aif b/sound/direct_sound_samples/cries/malamar.aif deleted file mode 100644 index 80428bfb1674..000000000000 Binary files a/sound/direct_sound_samples/cries/malamar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/malamar.wav b/sound/direct_sound_samples/cries/malamar.wav new file mode 100644 index 000000000000..37a33ffb8488 Binary files /dev/null and b/sound/direct_sound_samples/cries/malamar.wav differ diff --git a/sound/direct_sound_samples/cries/mamoswine.aif b/sound/direct_sound_samples/cries/mamoswine.aif deleted file mode 100644 index 48625c1a6f90..000000000000 Binary files a/sound/direct_sound_samples/cries/mamoswine.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mamoswine.wav b/sound/direct_sound_samples/cries/mamoswine.wav new file mode 100644 index 000000000000..ce0488818b20 Binary files /dev/null and b/sound/direct_sound_samples/cries/mamoswine.wav differ diff --git a/sound/direct_sound_samples/cries/manaphy.aif b/sound/direct_sound_samples/cries/manaphy.aif deleted file mode 100644 index 7df4dc833885..000000000000 Binary files a/sound/direct_sound_samples/cries/manaphy.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/manaphy.wav b/sound/direct_sound_samples/cries/manaphy.wav new file mode 100644 index 000000000000..ddd3ea6c381f Binary files /dev/null and b/sound/direct_sound_samples/cries/manaphy.wav differ diff --git a/sound/direct_sound_samples/cries/mandibuzz.aif b/sound/direct_sound_samples/cries/mandibuzz.aif deleted file mode 100644 index 1a3a3afec3b6..000000000000 Binary files a/sound/direct_sound_samples/cries/mandibuzz.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mandibuzz.wav b/sound/direct_sound_samples/cries/mandibuzz.wav new file mode 100644 index 000000000000..2db3dfaf3902 Binary files /dev/null and b/sound/direct_sound_samples/cries/mandibuzz.wav differ diff --git a/sound/direct_sound_samples/cries/manectric.aif b/sound/direct_sound_samples/cries/manectric.aif deleted file mode 100644 index cb0783a0c92d..000000000000 Binary files a/sound/direct_sound_samples/cries/manectric.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/manectric.wav b/sound/direct_sound_samples/cries/manectric.wav new file mode 100644 index 000000000000..939fc1609312 Binary files /dev/null and b/sound/direct_sound_samples/cries/manectric.wav differ diff --git a/sound/direct_sound_samples/cries/manectric_mega.aif b/sound/direct_sound_samples/cries/manectric_mega.aif deleted file mode 100644 index 6e9717fe893e..000000000000 Binary files a/sound/direct_sound_samples/cries/manectric_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/manectric_mega.wav b/sound/direct_sound_samples/cries/manectric_mega.wav new file mode 100644 index 000000000000..cd4f1e11aade Binary files /dev/null and b/sound/direct_sound_samples/cries/manectric_mega.wav differ diff --git a/sound/direct_sound_samples/cries/mankey.aif b/sound/direct_sound_samples/cries/mankey.aif deleted file mode 100644 index b2634d3f7b84..000000000000 Binary files a/sound/direct_sound_samples/cries/mankey.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mankey.wav b/sound/direct_sound_samples/cries/mankey.wav new file mode 100644 index 000000000000..ab15ac9af691 Binary files /dev/null and b/sound/direct_sound_samples/cries/mankey.wav differ diff --git a/sound/direct_sound_samples/cries/mantine.aif b/sound/direct_sound_samples/cries/mantine.aif deleted file mode 100644 index f3f6af321339..000000000000 Binary files a/sound/direct_sound_samples/cries/mantine.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mantine.wav b/sound/direct_sound_samples/cries/mantine.wav new file mode 100644 index 000000000000..919242e8fe12 Binary files /dev/null and b/sound/direct_sound_samples/cries/mantine.wav differ diff --git a/sound/direct_sound_samples/cries/mantyke.aif b/sound/direct_sound_samples/cries/mantyke.aif deleted file mode 100644 index edf6a76ef1f5..000000000000 Binary files a/sound/direct_sound_samples/cries/mantyke.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mantyke.wav b/sound/direct_sound_samples/cries/mantyke.wav new file mode 100644 index 000000000000..6c602275d183 Binary files /dev/null and b/sound/direct_sound_samples/cries/mantyke.wav differ diff --git a/sound/direct_sound_samples/cries/maractus.aif b/sound/direct_sound_samples/cries/maractus.aif deleted file mode 100644 index ad2488ec8677..000000000000 Binary files a/sound/direct_sound_samples/cries/maractus.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/maractus.wav b/sound/direct_sound_samples/cries/maractus.wav new file mode 100644 index 000000000000..944aac446597 Binary files /dev/null and b/sound/direct_sound_samples/cries/maractus.wav differ diff --git a/sound/direct_sound_samples/cries/mareanie.aif b/sound/direct_sound_samples/cries/mareanie.aif deleted file mode 100644 index 75a73d5edb28..000000000000 Binary files a/sound/direct_sound_samples/cries/mareanie.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mareanie.wav b/sound/direct_sound_samples/cries/mareanie.wav new file mode 100644 index 000000000000..8889530143e9 Binary files /dev/null and b/sound/direct_sound_samples/cries/mareanie.wav differ diff --git a/sound/direct_sound_samples/cries/mareep.aif b/sound/direct_sound_samples/cries/mareep.aif deleted file mode 100644 index 2dfc9e88bcac..000000000000 Binary files a/sound/direct_sound_samples/cries/mareep.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mareep.wav b/sound/direct_sound_samples/cries/mareep.wav new file mode 100644 index 000000000000..386925f5d5c8 Binary files /dev/null and b/sound/direct_sound_samples/cries/mareep.wav differ diff --git a/sound/direct_sound_samples/cries/marill.aif b/sound/direct_sound_samples/cries/marill.aif deleted file mode 100644 index 1c3b6bc41fc0..000000000000 Binary files a/sound/direct_sound_samples/cries/marill.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/marill.wav b/sound/direct_sound_samples/cries/marill.wav new file mode 100644 index 000000000000..93201d1c5135 Binary files /dev/null and b/sound/direct_sound_samples/cries/marill.wav differ diff --git a/sound/direct_sound_samples/cries/marowak.aif b/sound/direct_sound_samples/cries/marowak.aif deleted file mode 100644 index c081ba9f9d88..000000000000 Binary files a/sound/direct_sound_samples/cries/marowak.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/marowak.wav b/sound/direct_sound_samples/cries/marowak.wav new file mode 100644 index 000000000000..7bddb4b347d9 Binary files /dev/null and b/sound/direct_sound_samples/cries/marowak.wav differ diff --git a/sound/direct_sound_samples/cries/marshadow.aif b/sound/direct_sound_samples/cries/marshadow.aif deleted file mode 100644 index 3092b639f24e..000000000000 Binary files a/sound/direct_sound_samples/cries/marshadow.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/marshadow.wav b/sound/direct_sound_samples/cries/marshadow.wav new file mode 100644 index 000000000000..a9cfdf6a141c Binary files /dev/null and b/sound/direct_sound_samples/cries/marshadow.wav differ diff --git a/sound/direct_sound_samples/cries/marshtomp.aif b/sound/direct_sound_samples/cries/marshtomp.aif deleted file mode 100644 index 79728eb0876e..000000000000 Binary files a/sound/direct_sound_samples/cries/marshtomp.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/marshtomp.wav b/sound/direct_sound_samples/cries/marshtomp.wav new file mode 100644 index 000000000000..0caa959e2906 Binary files /dev/null and b/sound/direct_sound_samples/cries/marshtomp.wav differ diff --git a/sound/direct_sound_samples/cries/maschiff.aif b/sound/direct_sound_samples/cries/maschiff.aif deleted file mode 100644 index ee93b59adefe..000000000000 Binary files a/sound/direct_sound_samples/cries/maschiff.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/maschiff.wav b/sound/direct_sound_samples/cries/maschiff.wav new file mode 100644 index 000000000000..7b4412d147d0 Binary files /dev/null and b/sound/direct_sound_samples/cries/maschiff.wav differ diff --git a/sound/direct_sound_samples/cries/masquerain.aif b/sound/direct_sound_samples/cries/masquerain.aif deleted file mode 100644 index e3ef3b9d81d6..000000000000 Binary files a/sound/direct_sound_samples/cries/masquerain.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/masquerain.wav b/sound/direct_sound_samples/cries/masquerain.wav new file mode 100644 index 000000000000..b0c5372ae39e Binary files /dev/null and b/sound/direct_sound_samples/cries/masquerain.wav differ diff --git a/sound/direct_sound_samples/cries/maushold_four.aif b/sound/direct_sound_samples/cries/maushold_four.aif deleted file mode 100644 index c7c0aee6ee8c..000000000000 Binary files a/sound/direct_sound_samples/cries/maushold_four.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/maushold_four.wav b/sound/direct_sound_samples/cries/maushold_four.wav new file mode 100644 index 000000000000..b4cc4eb70fa9 Binary files /dev/null and b/sound/direct_sound_samples/cries/maushold_four.wav differ diff --git a/sound/direct_sound_samples/cries/maushold_three.aif b/sound/direct_sound_samples/cries/maushold_three.aif deleted file mode 100644 index 0e771535ea3e..000000000000 Binary files a/sound/direct_sound_samples/cries/maushold_three.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/maushold_three.wav b/sound/direct_sound_samples/cries/maushold_three.wav new file mode 100644 index 000000000000..5e62f2900332 Binary files /dev/null and b/sound/direct_sound_samples/cries/maushold_three.wav differ diff --git a/sound/direct_sound_samples/cries/mawile.aif b/sound/direct_sound_samples/cries/mawile.aif deleted file mode 100644 index 8374bf4797fd..000000000000 Binary files a/sound/direct_sound_samples/cries/mawile.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mawile.wav b/sound/direct_sound_samples/cries/mawile.wav new file mode 100644 index 000000000000..9c54d40a48cc Binary files /dev/null and b/sound/direct_sound_samples/cries/mawile.wav differ diff --git a/sound/direct_sound_samples/cries/mawile_mega.aif b/sound/direct_sound_samples/cries/mawile_mega.aif deleted file mode 100644 index a6e7ec8c8394..000000000000 Binary files a/sound/direct_sound_samples/cries/mawile_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mawile_mega.wav b/sound/direct_sound_samples/cries/mawile_mega.wav new file mode 100644 index 000000000000..fd19d9e0969a Binary files /dev/null and b/sound/direct_sound_samples/cries/mawile_mega.wav differ diff --git a/sound/direct_sound_samples/cries/medicham.aif b/sound/direct_sound_samples/cries/medicham.aif deleted file mode 100644 index 02818ba0dd2d..000000000000 Binary files a/sound/direct_sound_samples/cries/medicham.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/medicham.wav b/sound/direct_sound_samples/cries/medicham.wav new file mode 100644 index 000000000000..be3668b173f6 Binary files /dev/null and b/sound/direct_sound_samples/cries/medicham.wav differ diff --git a/sound/direct_sound_samples/cries/medicham_mega.aif b/sound/direct_sound_samples/cries/medicham_mega.aif deleted file mode 100644 index 36db11b2f72b..000000000000 Binary files a/sound/direct_sound_samples/cries/medicham_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/medicham_mega.wav b/sound/direct_sound_samples/cries/medicham_mega.wav new file mode 100644 index 000000000000..c71155ae4b06 Binary files /dev/null and b/sound/direct_sound_samples/cries/medicham_mega.wav differ diff --git a/sound/direct_sound_samples/cries/meditite.aif b/sound/direct_sound_samples/cries/meditite.aif deleted file mode 100644 index e3dc9dd802f8..000000000000 Binary files a/sound/direct_sound_samples/cries/meditite.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/meditite.wav b/sound/direct_sound_samples/cries/meditite.wav new file mode 100644 index 000000000000..23db4f297f2b Binary files /dev/null and b/sound/direct_sound_samples/cries/meditite.wav differ diff --git a/sound/direct_sound_samples/cries/meganium.aif b/sound/direct_sound_samples/cries/meganium.aif deleted file mode 100644 index abada3548239..000000000000 Binary files a/sound/direct_sound_samples/cries/meganium.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/meganium.wav b/sound/direct_sound_samples/cries/meganium.wav new file mode 100644 index 000000000000..8f7920e93784 Binary files /dev/null and b/sound/direct_sound_samples/cries/meganium.wav differ diff --git a/sound/direct_sound_samples/cries/melmetal.aif b/sound/direct_sound_samples/cries/melmetal.aif deleted file mode 100644 index 5590164d1eb9..000000000000 Binary files a/sound/direct_sound_samples/cries/melmetal.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/melmetal.wav b/sound/direct_sound_samples/cries/melmetal.wav new file mode 100644 index 000000000000..0d16f9494cd6 Binary files /dev/null and b/sound/direct_sound_samples/cries/melmetal.wav differ diff --git a/sound/direct_sound_samples/cries/meloetta.aif b/sound/direct_sound_samples/cries/meloetta.aif deleted file mode 100644 index 298a5214be53..000000000000 Binary files a/sound/direct_sound_samples/cries/meloetta.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/meloetta.wav b/sound/direct_sound_samples/cries/meloetta.wav new file mode 100644 index 000000000000..ff7d225b4b29 Binary files /dev/null and b/sound/direct_sound_samples/cries/meloetta.wav differ diff --git a/sound/direct_sound_samples/cries/meltan.aif b/sound/direct_sound_samples/cries/meltan.aif deleted file mode 100644 index 42b258f517d4..000000000000 Binary files a/sound/direct_sound_samples/cries/meltan.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/meltan.wav b/sound/direct_sound_samples/cries/meltan.wav new file mode 100644 index 000000000000..8b55a26e2382 Binary files /dev/null and b/sound/direct_sound_samples/cries/meltan.wav differ diff --git a/sound/direct_sound_samples/cries/meowscarada.aif b/sound/direct_sound_samples/cries/meowscarada.aif deleted file mode 100644 index 981a07a20673..000000000000 Binary files a/sound/direct_sound_samples/cries/meowscarada.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/meowscarada.wav b/sound/direct_sound_samples/cries/meowscarada.wav new file mode 100644 index 000000000000..d25194212819 Binary files /dev/null and b/sound/direct_sound_samples/cries/meowscarada.wav differ diff --git a/sound/direct_sound_samples/cries/meowstic.aif b/sound/direct_sound_samples/cries/meowstic.aif deleted file mode 100644 index a8536832b263..000000000000 Binary files a/sound/direct_sound_samples/cries/meowstic.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/meowstic.wav b/sound/direct_sound_samples/cries/meowstic.wav new file mode 100644 index 000000000000..aba57fdda03b Binary files /dev/null and b/sound/direct_sound_samples/cries/meowstic.wav differ diff --git a/sound/direct_sound_samples/cries/meowth.aif b/sound/direct_sound_samples/cries/meowth.aif deleted file mode 100644 index d919e99e63d9..000000000000 Binary files a/sound/direct_sound_samples/cries/meowth.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/meowth.wav b/sound/direct_sound_samples/cries/meowth.wav new file mode 100644 index 000000000000..bebca1c27ee5 Binary files /dev/null and b/sound/direct_sound_samples/cries/meowth.wav differ diff --git a/sound/direct_sound_samples/cries/mesprit.aif b/sound/direct_sound_samples/cries/mesprit.aif deleted file mode 100644 index 0c76a7f0f47e..000000000000 Binary files a/sound/direct_sound_samples/cries/mesprit.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mesprit.wav b/sound/direct_sound_samples/cries/mesprit.wav new file mode 100644 index 000000000000..cd85af6499d9 Binary files /dev/null and b/sound/direct_sound_samples/cries/mesprit.wav differ diff --git a/sound/direct_sound_samples/cries/metagross.aif b/sound/direct_sound_samples/cries/metagross.aif deleted file mode 100644 index bb3bc21c67cd..000000000000 Binary files a/sound/direct_sound_samples/cries/metagross.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/metagross.wav b/sound/direct_sound_samples/cries/metagross.wav new file mode 100644 index 000000000000..5112b3afa8ae Binary files /dev/null and b/sound/direct_sound_samples/cries/metagross.wav differ diff --git a/sound/direct_sound_samples/cries/metagross_mega.aif b/sound/direct_sound_samples/cries/metagross_mega.aif deleted file mode 100644 index e1125b659f50..000000000000 Binary files a/sound/direct_sound_samples/cries/metagross_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/metagross_mega.wav b/sound/direct_sound_samples/cries/metagross_mega.wav new file mode 100644 index 000000000000..56fbcfb78b36 Binary files /dev/null and b/sound/direct_sound_samples/cries/metagross_mega.wav differ diff --git a/sound/direct_sound_samples/cries/metang.aif b/sound/direct_sound_samples/cries/metang.aif deleted file mode 100644 index 225cdfbfe1ea..000000000000 Binary files a/sound/direct_sound_samples/cries/metang.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/metang.wav b/sound/direct_sound_samples/cries/metang.wav new file mode 100644 index 000000000000..700759d20747 Binary files /dev/null and b/sound/direct_sound_samples/cries/metang.wav differ diff --git a/sound/direct_sound_samples/cries/metapod.aif b/sound/direct_sound_samples/cries/metapod.aif deleted file mode 100644 index e875755db0a6..000000000000 Binary files a/sound/direct_sound_samples/cries/metapod.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/metapod.wav b/sound/direct_sound_samples/cries/metapod.wav new file mode 100644 index 000000000000..6df3b6aefbad Binary files /dev/null and b/sound/direct_sound_samples/cries/metapod.wav differ diff --git a/sound/direct_sound_samples/cries/mew.aif b/sound/direct_sound_samples/cries/mew.aif deleted file mode 100644 index f0649ee6f847..000000000000 Binary files a/sound/direct_sound_samples/cries/mew.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mew.wav b/sound/direct_sound_samples/cries/mew.wav new file mode 100644 index 000000000000..e75fa95f3572 Binary files /dev/null and b/sound/direct_sound_samples/cries/mew.wav differ diff --git a/sound/direct_sound_samples/cries/mewtwo.aif b/sound/direct_sound_samples/cries/mewtwo.aif deleted file mode 100644 index 2bafa470830d..000000000000 Binary files a/sound/direct_sound_samples/cries/mewtwo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mewtwo.wav b/sound/direct_sound_samples/cries/mewtwo.wav new file mode 100644 index 000000000000..947984f6724f Binary files /dev/null and b/sound/direct_sound_samples/cries/mewtwo.wav differ diff --git a/sound/direct_sound_samples/cries/mewtwo_mega_x.aif b/sound/direct_sound_samples/cries/mewtwo_mega_x.aif deleted file mode 100644 index c484f7b9ebca..000000000000 Binary files a/sound/direct_sound_samples/cries/mewtwo_mega_x.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mewtwo_mega_x.wav b/sound/direct_sound_samples/cries/mewtwo_mega_x.wav new file mode 100644 index 000000000000..84c83efb106f Binary files /dev/null and b/sound/direct_sound_samples/cries/mewtwo_mega_x.wav differ diff --git a/sound/direct_sound_samples/cries/mewtwo_mega_y.aif b/sound/direct_sound_samples/cries/mewtwo_mega_y.aif deleted file mode 100644 index 87a5d54ad9c1..000000000000 Binary files a/sound/direct_sound_samples/cries/mewtwo_mega_y.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mewtwo_mega_y.wav b/sound/direct_sound_samples/cries/mewtwo_mega_y.wav new file mode 100644 index 000000000000..b885771fd351 Binary files /dev/null and b/sound/direct_sound_samples/cries/mewtwo_mega_y.wav differ diff --git a/sound/direct_sound_samples/cries/mienfoo.aif b/sound/direct_sound_samples/cries/mienfoo.aif deleted file mode 100644 index 5f9525d87eb0..000000000000 Binary files a/sound/direct_sound_samples/cries/mienfoo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mienfoo.wav b/sound/direct_sound_samples/cries/mienfoo.wav new file mode 100644 index 000000000000..521448e71fdd Binary files /dev/null and b/sound/direct_sound_samples/cries/mienfoo.wav differ diff --git a/sound/direct_sound_samples/cries/mienshao.aif b/sound/direct_sound_samples/cries/mienshao.aif deleted file mode 100644 index da04c18fc9cd..000000000000 Binary files a/sound/direct_sound_samples/cries/mienshao.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mienshao.wav b/sound/direct_sound_samples/cries/mienshao.wav new file mode 100644 index 000000000000..439026ff5779 Binary files /dev/null and b/sound/direct_sound_samples/cries/mienshao.wav differ diff --git a/sound/direct_sound_samples/cries/mightyena.aif b/sound/direct_sound_samples/cries/mightyena.aif deleted file mode 100644 index 099c8b9c7b10..000000000000 Binary files a/sound/direct_sound_samples/cries/mightyena.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mightyena.wav b/sound/direct_sound_samples/cries/mightyena.wav new file mode 100644 index 000000000000..0149976e2b2b Binary files /dev/null and b/sound/direct_sound_samples/cries/mightyena.wav differ diff --git a/sound/direct_sound_samples/cries/milcery.aif b/sound/direct_sound_samples/cries/milcery.aif deleted file mode 100644 index 003fbb4a62ce..000000000000 Binary files a/sound/direct_sound_samples/cries/milcery.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/milcery.wav b/sound/direct_sound_samples/cries/milcery.wav new file mode 100644 index 000000000000..754329ea320a Binary files /dev/null and b/sound/direct_sound_samples/cries/milcery.wav differ diff --git a/sound/direct_sound_samples/cries/milotic.aif b/sound/direct_sound_samples/cries/milotic.aif deleted file mode 100644 index 796a87f35802..000000000000 Binary files a/sound/direct_sound_samples/cries/milotic.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/milotic.wav b/sound/direct_sound_samples/cries/milotic.wav new file mode 100644 index 000000000000..20db44692fe4 Binary files /dev/null and b/sound/direct_sound_samples/cries/milotic.wav differ diff --git a/sound/direct_sound_samples/cries/miltank.aif b/sound/direct_sound_samples/cries/miltank.aif deleted file mode 100644 index cb8ad93ce966..000000000000 Binary files a/sound/direct_sound_samples/cries/miltank.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/miltank.wav b/sound/direct_sound_samples/cries/miltank.wav new file mode 100644 index 000000000000..5f51f525bb50 Binary files /dev/null and b/sound/direct_sound_samples/cries/miltank.wav differ diff --git a/sound/direct_sound_samples/cries/mime_jr.aif b/sound/direct_sound_samples/cries/mime_jr.aif deleted file mode 100644 index 604c678fae99..000000000000 Binary files a/sound/direct_sound_samples/cries/mime_jr.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mime_jr.wav b/sound/direct_sound_samples/cries/mime_jr.wav new file mode 100644 index 000000000000..a02ccdb3b886 Binary files /dev/null and b/sound/direct_sound_samples/cries/mime_jr.wav differ diff --git a/sound/direct_sound_samples/cries/mimikyu.aif b/sound/direct_sound_samples/cries/mimikyu.aif deleted file mode 100644 index 15f3720dc75b..000000000000 Binary files a/sound/direct_sound_samples/cries/mimikyu.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mimikyu.wav b/sound/direct_sound_samples/cries/mimikyu.wav new file mode 100644 index 000000000000..8f8eab2e6454 Binary files /dev/null and b/sound/direct_sound_samples/cries/mimikyu.wav differ diff --git a/sound/direct_sound_samples/cries/minccino.aif b/sound/direct_sound_samples/cries/minccino.aif deleted file mode 100644 index d49eb07414ad..000000000000 Binary files a/sound/direct_sound_samples/cries/minccino.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/minccino.wav b/sound/direct_sound_samples/cries/minccino.wav new file mode 100644 index 000000000000..b6c21d7d0e11 Binary files /dev/null and b/sound/direct_sound_samples/cries/minccino.wav differ diff --git a/sound/direct_sound_samples/cries/minior.aif b/sound/direct_sound_samples/cries/minior.aif deleted file mode 100644 index d739824e04e4..000000000000 Binary files a/sound/direct_sound_samples/cries/minior.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/minior.wav b/sound/direct_sound_samples/cries/minior.wav new file mode 100644 index 000000000000..a1c268922437 Binary files /dev/null and b/sound/direct_sound_samples/cries/minior.wav differ diff --git a/sound/direct_sound_samples/cries/minun.aif b/sound/direct_sound_samples/cries/minun.aif deleted file mode 100644 index 1b0d3405b99e..000000000000 Binary files a/sound/direct_sound_samples/cries/minun.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/minun.wav b/sound/direct_sound_samples/cries/minun.wav new file mode 100644 index 000000000000..9e9a62f7e8c9 Binary files /dev/null and b/sound/direct_sound_samples/cries/minun.wav differ diff --git a/sound/direct_sound_samples/cries/miraidon.aif b/sound/direct_sound_samples/cries/miraidon.aif deleted file mode 100644 index f07c1c360c1c..000000000000 Binary files a/sound/direct_sound_samples/cries/miraidon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/miraidon.wav b/sound/direct_sound_samples/cries/miraidon.wav new file mode 100644 index 000000000000..e0b09ed9f409 Binary files /dev/null and b/sound/direct_sound_samples/cries/miraidon.wav differ diff --git a/sound/direct_sound_samples/cries/misdreavus.aif b/sound/direct_sound_samples/cries/misdreavus.aif deleted file mode 100644 index 774a832ea114..000000000000 Binary files a/sound/direct_sound_samples/cries/misdreavus.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/misdreavus.wav b/sound/direct_sound_samples/cries/misdreavus.wav new file mode 100644 index 000000000000..f632986da953 Binary files /dev/null and b/sound/direct_sound_samples/cries/misdreavus.wav differ diff --git a/sound/direct_sound_samples/cries/mismagius.aif b/sound/direct_sound_samples/cries/mismagius.aif deleted file mode 100644 index a9146205ba8f..000000000000 Binary files a/sound/direct_sound_samples/cries/mismagius.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mismagius.wav b/sound/direct_sound_samples/cries/mismagius.wav new file mode 100644 index 000000000000..0a19c2bff496 Binary files /dev/null and b/sound/direct_sound_samples/cries/mismagius.wav differ diff --git a/sound/direct_sound_samples/cries/moltres.aif b/sound/direct_sound_samples/cries/moltres.aif deleted file mode 100644 index 39570a316c87..000000000000 Binary files a/sound/direct_sound_samples/cries/moltres.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/moltres.wav b/sound/direct_sound_samples/cries/moltres.wav new file mode 100644 index 000000000000..7173a8cad4c7 Binary files /dev/null and b/sound/direct_sound_samples/cries/moltres.wav differ diff --git a/sound/direct_sound_samples/cries/monferno.aif b/sound/direct_sound_samples/cries/monferno.aif deleted file mode 100644 index 4f34c1de9121..000000000000 Binary files a/sound/direct_sound_samples/cries/monferno.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/monferno.wav b/sound/direct_sound_samples/cries/monferno.wav new file mode 100644 index 000000000000..030db53f08d5 Binary files /dev/null and b/sound/direct_sound_samples/cries/monferno.wav differ diff --git a/sound/direct_sound_samples/cries/morelull.aif b/sound/direct_sound_samples/cries/morelull.aif deleted file mode 100644 index 0b38baf6a496..000000000000 Binary files a/sound/direct_sound_samples/cries/morelull.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/morelull.wav b/sound/direct_sound_samples/cries/morelull.wav new file mode 100644 index 000000000000..05c6d3e75a50 Binary files /dev/null and b/sound/direct_sound_samples/cries/morelull.wav differ diff --git a/sound/direct_sound_samples/cries/morgrem.aif b/sound/direct_sound_samples/cries/morgrem.aif deleted file mode 100644 index b972242d3718..000000000000 Binary files a/sound/direct_sound_samples/cries/morgrem.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/morgrem.wav b/sound/direct_sound_samples/cries/morgrem.wav new file mode 100644 index 000000000000..d478cc0406e6 Binary files /dev/null and b/sound/direct_sound_samples/cries/morgrem.wav differ diff --git a/sound/direct_sound_samples/cries/morpeko_full_belly.aif b/sound/direct_sound_samples/cries/morpeko_full_belly.aif deleted file mode 100644 index 2feb33beb8c4..000000000000 Binary files a/sound/direct_sound_samples/cries/morpeko_full_belly.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/morpeko_full_belly.wav b/sound/direct_sound_samples/cries/morpeko_full_belly.wav new file mode 100644 index 000000000000..21943e1a4db7 Binary files /dev/null and b/sound/direct_sound_samples/cries/morpeko_full_belly.wav differ diff --git a/sound/direct_sound_samples/cries/morpeko_hangry.aif b/sound/direct_sound_samples/cries/morpeko_hangry.aif deleted file mode 100644 index 84a89a2c01f4..000000000000 Binary files a/sound/direct_sound_samples/cries/morpeko_hangry.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/morpeko_hangry.wav b/sound/direct_sound_samples/cries/morpeko_hangry.wav new file mode 100644 index 000000000000..80c5eed428ff Binary files /dev/null and b/sound/direct_sound_samples/cries/morpeko_hangry.wav differ diff --git a/sound/direct_sound_samples/cries/mothim.aif b/sound/direct_sound_samples/cries/mothim.aif deleted file mode 100644 index d2a2c7b8c30a..000000000000 Binary files a/sound/direct_sound_samples/cries/mothim.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mothim.wav b/sound/direct_sound_samples/cries/mothim.wav new file mode 100644 index 000000000000..c1f085d52870 Binary files /dev/null and b/sound/direct_sound_samples/cries/mothim.wav differ diff --git a/sound/direct_sound_samples/cries/mr_mime.aif b/sound/direct_sound_samples/cries/mr_mime.aif deleted file mode 100644 index 991eeb9d1cdc..000000000000 Binary files a/sound/direct_sound_samples/cries/mr_mime.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mr_mime.wav b/sound/direct_sound_samples/cries/mr_mime.wav new file mode 100644 index 000000000000..23cf310532fb Binary files /dev/null and b/sound/direct_sound_samples/cries/mr_mime.wav differ diff --git a/sound/direct_sound_samples/cries/mr_rime.aif b/sound/direct_sound_samples/cries/mr_rime.aif deleted file mode 100644 index 86bbd33304d7..000000000000 Binary files a/sound/direct_sound_samples/cries/mr_rime.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mr_rime.wav b/sound/direct_sound_samples/cries/mr_rime.wav new file mode 100644 index 000000000000..653cb286c849 Binary files /dev/null and b/sound/direct_sound_samples/cries/mr_rime.wav differ diff --git a/sound/direct_sound_samples/cries/mudbray.aif b/sound/direct_sound_samples/cries/mudbray.aif deleted file mode 100644 index f7d0c8b28758..000000000000 Binary files a/sound/direct_sound_samples/cries/mudbray.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mudbray.wav b/sound/direct_sound_samples/cries/mudbray.wav new file mode 100644 index 000000000000..72f138c9b735 Binary files /dev/null and b/sound/direct_sound_samples/cries/mudbray.wav differ diff --git a/sound/direct_sound_samples/cries/mudkip.aif b/sound/direct_sound_samples/cries/mudkip.aif deleted file mode 100644 index 0162f94001dd..000000000000 Binary files a/sound/direct_sound_samples/cries/mudkip.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mudkip.wav b/sound/direct_sound_samples/cries/mudkip.wav new file mode 100644 index 000000000000..c965efe30c84 Binary files /dev/null and b/sound/direct_sound_samples/cries/mudkip.wav differ diff --git a/sound/direct_sound_samples/cries/mudsdale.aif b/sound/direct_sound_samples/cries/mudsdale.aif deleted file mode 100644 index 2776ec02dadb..000000000000 Binary files a/sound/direct_sound_samples/cries/mudsdale.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/mudsdale.wav b/sound/direct_sound_samples/cries/mudsdale.wav new file mode 100644 index 000000000000..01222f6e18e1 Binary files /dev/null and b/sound/direct_sound_samples/cries/mudsdale.wav differ diff --git a/sound/direct_sound_samples/cries/muk.aif b/sound/direct_sound_samples/cries/muk.aif deleted file mode 100644 index 2abfd59591b2..000000000000 Binary files a/sound/direct_sound_samples/cries/muk.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/muk.wav b/sound/direct_sound_samples/cries/muk.wav new file mode 100644 index 000000000000..27cd6bdeb19b Binary files /dev/null and b/sound/direct_sound_samples/cries/muk.wav differ diff --git a/sound/direct_sound_samples/cries/munchlax.aif b/sound/direct_sound_samples/cries/munchlax.aif deleted file mode 100644 index ce347a32f472..000000000000 Binary files a/sound/direct_sound_samples/cries/munchlax.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/munchlax.wav b/sound/direct_sound_samples/cries/munchlax.wav new file mode 100644 index 000000000000..ead5eb1974b5 Binary files /dev/null and b/sound/direct_sound_samples/cries/munchlax.wav differ diff --git a/sound/direct_sound_samples/cries/munkidori.aif b/sound/direct_sound_samples/cries/munkidori.aif deleted file mode 100644 index 7cb192732e4e..000000000000 Binary files a/sound/direct_sound_samples/cries/munkidori.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/munkidori.wav b/sound/direct_sound_samples/cries/munkidori.wav new file mode 100644 index 000000000000..d37e97ac5458 Binary files /dev/null and b/sound/direct_sound_samples/cries/munkidori.wav differ diff --git a/sound/direct_sound_samples/cries/munna.aif b/sound/direct_sound_samples/cries/munna.aif deleted file mode 100644 index 443bb808998c..000000000000 Binary files a/sound/direct_sound_samples/cries/munna.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/munna.wav b/sound/direct_sound_samples/cries/munna.wav new file mode 100644 index 000000000000..2de57dd37650 Binary files /dev/null and b/sound/direct_sound_samples/cries/munna.wav differ diff --git a/sound/direct_sound_samples/cries/murkrow.aif b/sound/direct_sound_samples/cries/murkrow.aif deleted file mode 100644 index 1e7c6dd79266..000000000000 Binary files a/sound/direct_sound_samples/cries/murkrow.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/murkrow.wav b/sound/direct_sound_samples/cries/murkrow.wav new file mode 100644 index 000000000000..5da336fa90f3 Binary files /dev/null and b/sound/direct_sound_samples/cries/murkrow.wav differ diff --git a/sound/direct_sound_samples/cries/musharna.aif b/sound/direct_sound_samples/cries/musharna.aif deleted file mode 100644 index 69dd2800cf36..000000000000 Binary files a/sound/direct_sound_samples/cries/musharna.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/musharna.wav b/sound/direct_sound_samples/cries/musharna.wav new file mode 100644 index 000000000000..cac55c51ff35 Binary files /dev/null and b/sound/direct_sound_samples/cries/musharna.wav differ diff --git a/sound/direct_sound_samples/cries/nacli.aif b/sound/direct_sound_samples/cries/nacli.aif deleted file mode 100644 index b29d579ee252..000000000000 Binary files a/sound/direct_sound_samples/cries/nacli.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/nacli.wav b/sound/direct_sound_samples/cries/nacli.wav new file mode 100644 index 000000000000..93ec1a80f69d Binary files /dev/null and b/sound/direct_sound_samples/cries/nacli.wav differ diff --git a/sound/direct_sound_samples/cries/naclstack.aif b/sound/direct_sound_samples/cries/naclstack.aif deleted file mode 100644 index 31eca0bd4991..000000000000 Binary files a/sound/direct_sound_samples/cries/naclstack.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/naclstack.wav b/sound/direct_sound_samples/cries/naclstack.wav new file mode 100644 index 000000000000..f2232083176d Binary files /dev/null and b/sound/direct_sound_samples/cries/naclstack.wav differ diff --git a/sound/direct_sound_samples/cries/naganadel.aif b/sound/direct_sound_samples/cries/naganadel.aif deleted file mode 100644 index 4cd829612baf..000000000000 Binary files a/sound/direct_sound_samples/cries/naganadel.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/naganadel.wav b/sound/direct_sound_samples/cries/naganadel.wav new file mode 100644 index 000000000000..989d068a6bd5 Binary files /dev/null and b/sound/direct_sound_samples/cries/naganadel.wav differ diff --git a/sound/direct_sound_samples/cries/natu.aif b/sound/direct_sound_samples/cries/natu.aif deleted file mode 100644 index 760943988892..000000000000 Binary files a/sound/direct_sound_samples/cries/natu.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/natu.wav b/sound/direct_sound_samples/cries/natu.wav new file mode 100644 index 000000000000..4a2c85317849 Binary files /dev/null and b/sound/direct_sound_samples/cries/natu.wav differ diff --git a/sound/direct_sound_samples/cries/necrozma.aif b/sound/direct_sound_samples/cries/necrozma.aif deleted file mode 100644 index db81bc135a5b..000000000000 Binary files a/sound/direct_sound_samples/cries/necrozma.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/necrozma.wav b/sound/direct_sound_samples/cries/necrozma.wav new file mode 100644 index 000000000000..526ead7f45b4 Binary files /dev/null and b/sound/direct_sound_samples/cries/necrozma.wav differ diff --git a/sound/direct_sound_samples/cries/necrozma_dawn_wings.aif b/sound/direct_sound_samples/cries/necrozma_dawn_wings.aif deleted file mode 100644 index f33539121eed..000000000000 Binary files a/sound/direct_sound_samples/cries/necrozma_dawn_wings.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/necrozma_dawn_wings.wav b/sound/direct_sound_samples/cries/necrozma_dawn_wings.wav new file mode 100644 index 000000000000..0ffa398c79f8 Binary files /dev/null and b/sound/direct_sound_samples/cries/necrozma_dawn_wings.wav differ diff --git a/sound/direct_sound_samples/cries/necrozma_dusk_mane.aif b/sound/direct_sound_samples/cries/necrozma_dusk_mane.aif deleted file mode 100644 index fce3fb2f61df..000000000000 Binary files a/sound/direct_sound_samples/cries/necrozma_dusk_mane.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/necrozma_dusk_mane.wav b/sound/direct_sound_samples/cries/necrozma_dusk_mane.wav new file mode 100644 index 000000000000..b601790ba7f1 Binary files /dev/null and b/sound/direct_sound_samples/cries/necrozma_dusk_mane.wav differ diff --git a/sound/direct_sound_samples/cries/necrozma_ultra.aif b/sound/direct_sound_samples/cries/necrozma_ultra.aif deleted file mode 100644 index cfc9c5f27b3d..000000000000 Binary files a/sound/direct_sound_samples/cries/necrozma_ultra.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/necrozma_ultra.wav b/sound/direct_sound_samples/cries/necrozma_ultra.wav new file mode 100644 index 000000000000..dfbceebaf43c Binary files /dev/null and b/sound/direct_sound_samples/cries/necrozma_ultra.wav differ diff --git a/sound/direct_sound_samples/cries/nickit.aif b/sound/direct_sound_samples/cries/nickit.aif deleted file mode 100644 index a4d660bb9dbc..000000000000 Binary files a/sound/direct_sound_samples/cries/nickit.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/nickit.wav b/sound/direct_sound_samples/cries/nickit.wav new file mode 100644 index 000000000000..820a0d55685e Binary files /dev/null and b/sound/direct_sound_samples/cries/nickit.wav differ diff --git a/sound/direct_sound_samples/cries/nidoking.aif b/sound/direct_sound_samples/cries/nidoking.aif deleted file mode 100644 index 5a645ca83a4f..000000000000 Binary files a/sound/direct_sound_samples/cries/nidoking.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/nidoking.wav b/sound/direct_sound_samples/cries/nidoking.wav new file mode 100644 index 000000000000..556b20bdacef Binary files /dev/null and b/sound/direct_sound_samples/cries/nidoking.wav differ diff --git a/sound/direct_sound_samples/cries/nidoqueen.aif b/sound/direct_sound_samples/cries/nidoqueen.aif deleted file mode 100644 index 878570d3f68b..000000000000 Binary files a/sound/direct_sound_samples/cries/nidoqueen.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/nidoqueen.wav b/sound/direct_sound_samples/cries/nidoqueen.wav new file mode 100644 index 000000000000..7c23623a1787 Binary files /dev/null and b/sound/direct_sound_samples/cries/nidoqueen.wav differ diff --git a/sound/direct_sound_samples/cries/nidoran_f.aif b/sound/direct_sound_samples/cries/nidoran_f.aif deleted file mode 100644 index cf0213394974..000000000000 Binary files a/sound/direct_sound_samples/cries/nidoran_f.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/nidoran_f.wav b/sound/direct_sound_samples/cries/nidoran_f.wav new file mode 100644 index 000000000000..2997c2b5795a Binary files /dev/null and b/sound/direct_sound_samples/cries/nidoran_f.wav differ diff --git a/sound/direct_sound_samples/cries/nidoran_m.aif b/sound/direct_sound_samples/cries/nidoran_m.aif deleted file mode 100644 index 2e691595bf73..000000000000 Binary files a/sound/direct_sound_samples/cries/nidoran_m.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/nidoran_m.wav b/sound/direct_sound_samples/cries/nidoran_m.wav new file mode 100644 index 000000000000..160ab71e7fdf Binary files /dev/null and b/sound/direct_sound_samples/cries/nidoran_m.wav differ diff --git a/sound/direct_sound_samples/cries/nidorina.aif b/sound/direct_sound_samples/cries/nidorina.aif deleted file mode 100644 index 3f73fd947f5c..000000000000 Binary files a/sound/direct_sound_samples/cries/nidorina.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/nidorina.wav b/sound/direct_sound_samples/cries/nidorina.wav new file mode 100644 index 000000000000..a46c4167013e Binary files /dev/null and b/sound/direct_sound_samples/cries/nidorina.wav differ diff --git a/sound/direct_sound_samples/cries/nidorino.aif b/sound/direct_sound_samples/cries/nidorino.aif deleted file mode 100644 index 75e48cc72136..000000000000 Binary files a/sound/direct_sound_samples/cries/nidorino.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/nidorino.wav b/sound/direct_sound_samples/cries/nidorino.wav new file mode 100644 index 000000000000..38db59c2f149 Binary files /dev/null and b/sound/direct_sound_samples/cries/nidorino.wav differ diff --git a/sound/direct_sound_samples/cries/nihilego.aif b/sound/direct_sound_samples/cries/nihilego.aif deleted file mode 100644 index 17c56e8cbf46..000000000000 Binary files a/sound/direct_sound_samples/cries/nihilego.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/nihilego.wav b/sound/direct_sound_samples/cries/nihilego.wav new file mode 100644 index 000000000000..8467b70a1fc4 Binary files /dev/null and b/sound/direct_sound_samples/cries/nihilego.wav differ diff --git a/sound/direct_sound_samples/cries/nincada.aif b/sound/direct_sound_samples/cries/nincada.aif deleted file mode 100644 index d4695111cd89..000000000000 Binary files a/sound/direct_sound_samples/cries/nincada.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/nincada.wav b/sound/direct_sound_samples/cries/nincada.wav new file mode 100644 index 000000000000..dd5feb818d26 Binary files /dev/null and b/sound/direct_sound_samples/cries/nincada.wav differ diff --git a/sound/direct_sound_samples/cries/ninetales.aif b/sound/direct_sound_samples/cries/ninetales.aif deleted file mode 100644 index 51a260f9e92a..000000000000 Binary files a/sound/direct_sound_samples/cries/ninetales.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ninetales.wav b/sound/direct_sound_samples/cries/ninetales.wav new file mode 100644 index 000000000000..f84b8743641f Binary files /dev/null and b/sound/direct_sound_samples/cries/ninetales.wav differ diff --git a/sound/direct_sound_samples/cries/ninjask.aif b/sound/direct_sound_samples/cries/ninjask.aif deleted file mode 100644 index 06693156a76d..000000000000 Binary files a/sound/direct_sound_samples/cries/ninjask.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ninjask.wav b/sound/direct_sound_samples/cries/ninjask.wav new file mode 100644 index 000000000000..b61f4d37f5b7 Binary files /dev/null and b/sound/direct_sound_samples/cries/ninjask.wav differ diff --git a/sound/direct_sound_samples/cries/noctowl.aif b/sound/direct_sound_samples/cries/noctowl.aif deleted file mode 100644 index 2a96488f28f4..000000000000 Binary files a/sound/direct_sound_samples/cries/noctowl.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/noctowl.wav b/sound/direct_sound_samples/cries/noctowl.wav new file mode 100644 index 000000000000..ab705b6f2cef Binary files /dev/null and b/sound/direct_sound_samples/cries/noctowl.wav differ diff --git a/sound/direct_sound_samples/cries/noibat.aif b/sound/direct_sound_samples/cries/noibat.aif deleted file mode 100644 index 6f3c18f40dc0..000000000000 Binary files a/sound/direct_sound_samples/cries/noibat.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/noibat.wav b/sound/direct_sound_samples/cries/noibat.wav new file mode 100644 index 000000000000..346fb772bd28 Binary files /dev/null and b/sound/direct_sound_samples/cries/noibat.wav differ diff --git a/sound/direct_sound_samples/cries/noivern.aif b/sound/direct_sound_samples/cries/noivern.aif deleted file mode 100644 index 5806e6971361..000000000000 Binary files a/sound/direct_sound_samples/cries/noivern.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/noivern.wav b/sound/direct_sound_samples/cries/noivern.wav new file mode 100644 index 000000000000..eb44488e8abd Binary files /dev/null and b/sound/direct_sound_samples/cries/noivern.wav differ diff --git a/sound/direct_sound_samples/cries/nosepass.aif b/sound/direct_sound_samples/cries/nosepass.aif deleted file mode 100644 index 04c28caa6bbe..000000000000 Binary files a/sound/direct_sound_samples/cries/nosepass.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/nosepass.wav b/sound/direct_sound_samples/cries/nosepass.wav new file mode 100644 index 000000000000..1e15fb10d39b Binary files /dev/null and b/sound/direct_sound_samples/cries/nosepass.wav differ diff --git a/sound/direct_sound_samples/cries/numel.aif b/sound/direct_sound_samples/cries/numel.aif deleted file mode 100644 index 9d6c2e051783..000000000000 Binary files a/sound/direct_sound_samples/cries/numel.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/numel.wav b/sound/direct_sound_samples/cries/numel.wav new file mode 100644 index 000000000000..2d2d16f02137 Binary files /dev/null and b/sound/direct_sound_samples/cries/numel.wav differ diff --git a/sound/direct_sound_samples/cries/nuzleaf.aif b/sound/direct_sound_samples/cries/nuzleaf.aif deleted file mode 100644 index 2d836705befe..000000000000 Binary files a/sound/direct_sound_samples/cries/nuzleaf.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/nuzleaf.wav b/sound/direct_sound_samples/cries/nuzleaf.wav new file mode 100644 index 000000000000..5efb6e806897 Binary files /dev/null and b/sound/direct_sound_samples/cries/nuzleaf.wav differ diff --git a/sound/direct_sound_samples/cries/nymble.aif b/sound/direct_sound_samples/cries/nymble.aif deleted file mode 100644 index bc41462fb658..000000000000 Binary files a/sound/direct_sound_samples/cries/nymble.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/nymble.wav b/sound/direct_sound_samples/cries/nymble.wav new file mode 100644 index 000000000000..aad585fc6c1b Binary files /dev/null and b/sound/direct_sound_samples/cries/nymble.wav differ diff --git a/sound/direct_sound_samples/cries/obstagoon.aif b/sound/direct_sound_samples/cries/obstagoon.aif deleted file mode 100644 index f1c4a45366eb..000000000000 Binary files a/sound/direct_sound_samples/cries/obstagoon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/obstagoon.wav b/sound/direct_sound_samples/cries/obstagoon.wav new file mode 100644 index 000000000000..2b65e063abfa Binary files /dev/null and b/sound/direct_sound_samples/cries/obstagoon.wav differ diff --git a/sound/direct_sound_samples/cries/octillery.aif b/sound/direct_sound_samples/cries/octillery.aif deleted file mode 100644 index 196400455137..000000000000 Binary files a/sound/direct_sound_samples/cries/octillery.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/octillery.wav b/sound/direct_sound_samples/cries/octillery.wav new file mode 100644 index 000000000000..190d42c6746d Binary files /dev/null and b/sound/direct_sound_samples/cries/octillery.wav differ diff --git a/sound/direct_sound_samples/cries/oddish.aif b/sound/direct_sound_samples/cries/oddish.aif deleted file mode 100644 index 4f30f7ddb452..000000000000 Binary files a/sound/direct_sound_samples/cries/oddish.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/oddish.wav b/sound/direct_sound_samples/cries/oddish.wav new file mode 100644 index 000000000000..de6855d369b3 Binary files /dev/null and b/sound/direct_sound_samples/cries/oddish.wav differ diff --git a/sound/direct_sound_samples/cries/ogerpon.aif b/sound/direct_sound_samples/cries/ogerpon.aif deleted file mode 100644 index 17b9d94d62fd..000000000000 Binary files a/sound/direct_sound_samples/cries/ogerpon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ogerpon.wav b/sound/direct_sound_samples/cries/ogerpon.wav new file mode 100644 index 000000000000..82a3a54b16ce Binary files /dev/null and b/sound/direct_sound_samples/cries/ogerpon.wav differ diff --git a/sound/direct_sound_samples/cries/oinkologne_f.aif b/sound/direct_sound_samples/cries/oinkologne_f.aif deleted file mode 100644 index 885f2e3a7dd9..000000000000 Binary files a/sound/direct_sound_samples/cries/oinkologne_f.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/oinkologne_f.wav b/sound/direct_sound_samples/cries/oinkologne_f.wav new file mode 100644 index 000000000000..f075ebb3cf51 Binary files /dev/null and b/sound/direct_sound_samples/cries/oinkologne_f.wav differ diff --git a/sound/direct_sound_samples/cries/oinkologne_m.aif b/sound/direct_sound_samples/cries/oinkologne_m.aif deleted file mode 100644 index 611794de314c..000000000000 Binary files a/sound/direct_sound_samples/cries/oinkologne_m.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/oinkologne_m.wav b/sound/direct_sound_samples/cries/oinkologne_m.wav new file mode 100644 index 000000000000..ca0a7e450e32 Binary files /dev/null and b/sound/direct_sound_samples/cries/oinkologne_m.wav differ diff --git a/sound/direct_sound_samples/cries/okidogi.aif b/sound/direct_sound_samples/cries/okidogi.aif deleted file mode 100644 index f22f3ba3358b..000000000000 Binary files a/sound/direct_sound_samples/cries/okidogi.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/okidogi.wav b/sound/direct_sound_samples/cries/okidogi.wav new file mode 100644 index 000000000000..1370c786d069 Binary files /dev/null and b/sound/direct_sound_samples/cries/okidogi.wav differ diff --git a/sound/direct_sound_samples/cries/omanyte.aif b/sound/direct_sound_samples/cries/omanyte.aif deleted file mode 100644 index eeedac34db7e..000000000000 Binary files a/sound/direct_sound_samples/cries/omanyte.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/omanyte.wav b/sound/direct_sound_samples/cries/omanyte.wav new file mode 100644 index 000000000000..3db237ac3f95 Binary files /dev/null and b/sound/direct_sound_samples/cries/omanyte.wav differ diff --git a/sound/direct_sound_samples/cries/omastar.aif b/sound/direct_sound_samples/cries/omastar.aif deleted file mode 100644 index 9d4f738efd1a..000000000000 Binary files a/sound/direct_sound_samples/cries/omastar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/omastar.wav b/sound/direct_sound_samples/cries/omastar.wav new file mode 100644 index 000000000000..69a4ea868f49 Binary files /dev/null and b/sound/direct_sound_samples/cries/omastar.wav differ diff --git a/sound/direct_sound_samples/cries/onix.aif b/sound/direct_sound_samples/cries/onix.aif deleted file mode 100644 index 6203ce568969..000000000000 Binary files a/sound/direct_sound_samples/cries/onix.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/onix.wav b/sound/direct_sound_samples/cries/onix.wav new file mode 100644 index 000000000000..57da6014103a Binary files /dev/null and b/sound/direct_sound_samples/cries/onix.wav differ diff --git a/sound/direct_sound_samples/cries/oranguru.aif b/sound/direct_sound_samples/cries/oranguru.aif deleted file mode 100644 index ec919ba93c69..000000000000 Binary files a/sound/direct_sound_samples/cries/oranguru.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/oranguru.wav b/sound/direct_sound_samples/cries/oranguru.wav new file mode 100644 index 000000000000..e8fa50d5d3f5 Binary files /dev/null and b/sound/direct_sound_samples/cries/oranguru.wav differ diff --git a/sound/direct_sound_samples/cries/orbeetle.aif b/sound/direct_sound_samples/cries/orbeetle.aif deleted file mode 100644 index 4b99afad159d..000000000000 Binary files a/sound/direct_sound_samples/cries/orbeetle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/orbeetle.wav b/sound/direct_sound_samples/cries/orbeetle.wav new file mode 100644 index 000000000000..384fe691d62f Binary files /dev/null and b/sound/direct_sound_samples/cries/orbeetle.wav differ diff --git a/sound/direct_sound_samples/cries/oricorio_baile.aif b/sound/direct_sound_samples/cries/oricorio_baile.aif deleted file mode 100644 index c5ec5af19b4a..000000000000 Binary files a/sound/direct_sound_samples/cries/oricorio_baile.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/oricorio_baile.wav b/sound/direct_sound_samples/cries/oricorio_baile.wav new file mode 100644 index 000000000000..e1719cf8e9fc Binary files /dev/null and b/sound/direct_sound_samples/cries/oricorio_baile.wav differ diff --git a/sound/direct_sound_samples/cries/oricorio_pau.aif b/sound/direct_sound_samples/cries/oricorio_pau.aif deleted file mode 100644 index 4faa6cc083c8..000000000000 Binary files a/sound/direct_sound_samples/cries/oricorio_pau.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/oricorio_pau.wav b/sound/direct_sound_samples/cries/oricorio_pau.wav new file mode 100644 index 000000000000..71fa963187d5 Binary files /dev/null and b/sound/direct_sound_samples/cries/oricorio_pau.wav differ diff --git a/sound/direct_sound_samples/cries/oricorio_sensu.aif b/sound/direct_sound_samples/cries/oricorio_sensu.aif deleted file mode 100644 index bdc25a774970..000000000000 Binary files a/sound/direct_sound_samples/cries/oricorio_sensu.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/oricorio_sensu.wav b/sound/direct_sound_samples/cries/oricorio_sensu.wav new file mode 100644 index 000000000000..dc7687252ad3 Binary files /dev/null and b/sound/direct_sound_samples/cries/oricorio_sensu.wav differ diff --git a/sound/direct_sound_samples/cries/orthworm.aif b/sound/direct_sound_samples/cries/orthworm.aif deleted file mode 100644 index f88eec62f097..000000000000 Binary files a/sound/direct_sound_samples/cries/orthworm.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/orthworm.wav b/sound/direct_sound_samples/cries/orthworm.wav new file mode 100644 index 000000000000..df86b5f9d844 Binary files /dev/null and b/sound/direct_sound_samples/cries/orthworm.wav differ diff --git a/sound/direct_sound_samples/cries/oshawott.aif b/sound/direct_sound_samples/cries/oshawott.aif deleted file mode 100644 index 81bf2917ed81..000000000000 Binary files a/sound/direct_sound_samples/cries/oshawott.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/oshawott.wav b/sound/direct_sound_samples/cries/oshawott.wav new file mode 100644 index 000000000000..8669120bb328 Binary files /dev/null and b/sound/direct_sound_samples/cries/oshawott.wav differ diff --git a/sound/direct_sound_samples/cries/overqwil.aif b/sound/direct_sound_samples/cries/overqwil.aif deleted file mode 100644 index 8b9a8a2dffce..000000000000 Binary files a/sound/direct_sound_samples/cries/overqwil.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/overqwil.wav b/sound/direct_sound_samples/cries/overqwil.wav new file mode 100644 index 000000000000..5b278516fcab Binary files /dev/null and b/sound/direct_sound_samples/cries/overqwil.wav differ diff --git a/sound/direct_sound_samples/cries/pachirisu.aif b/sound/direct_sound_samples/cries/pachirisu.aif deleted file mode 100644 index 6471363ee686..000000000000 Binary files a/sound/direct_sound_samples/cries/pachirisu.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pachirisu.wav b/sound/direct_sound_samples/cries/pachirisu.wav new file mode 100644 index 000000000000..311b40aa53cb Binary files /dev/null and b/sound/direct_sound_samples/cries/pachirisu.wav differ diff --git a/sound/direct_sound_samples/cries/palafin_hero.aif b/sound/direct_sound_samples/cries/palafin_hero.aif deleted file mode 100644 index 5ef87ddeb8d4..000000000000 Binary files a/sound/direct_sound_samples/cries/palafin_hero.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/palafin_hero.wav b/sound/direct_sound_samples/cries/palafin_hero.wav new file mode 100644 index 000000000000..8ec713357d75 Binary files /dev/null and b/sound/direct_sound_samples/cries/palafin_hero.wav differ diff --git a/sound/direct_sound_samples/cries/palafin_zero.aif b/sound/direct_sound_samples/cries/palafin_zero.aif deleted file mode 100644 index 16051848beb8..000000000000 Binary files a/sound/direct_sound_samples/cries/palafin_zero.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/palafin_zero.wav b/sound/direct_sound_samples/cries/palafin_zero.wav new file mode 100644 index 000000000000..f8526574c730 Binary files /dev/null and b/sound/direct_sound_samples/cries/palafin_zero.wav differ diff --git a/sound/direct_sound_samples/cries/palkia.aif b/sound/direct_sound_samples/cries/palkia.aif deleted file mode 100644 index dee52b9a5966..000000000000 Binary files a/sound/direct_sound_samples/cries/palkia.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/palkia.wav b/sound/direct_sound_samples/cries/palkia.wav new file mode 100644 index 000000000000..b3f057c1a029 Binary files /dev/null and b/sound/direct_sound_samples/cries/palkia.wav differ diff --git a/sound/direct_sound_samples/cries/palossand.aif b/sound/direct_sound_samples/cries/palossand.aif deleted file mode 100644 index a4a1da4feeec..000000000000 Binary files a/sound/direct_sound_samples/cries/palossand.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/palossand.wav b/sound/direct_sound_samples/cries/palossand.wav new file mode 100644 index 000000000000..2908e31766d9 Binary files /dev/null and b/sound/direct_sound_samples/cries/palossand.wav differ diff --git a/sound/direct_sound_samples/cries/palpitoad.aif b/sound/direct_sound_samples/cries/palpitoad.aif deleted file mode 100644 index 054d2dba0bb1..000000000000 Binary files a/sound/direct_sound_samples/cries/palpitoad.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/palpitoad.wav b/sound/direct_sound_samples/cries/palpitoad.wav new file mode 100644 index 000000000000..04b404c1c7b4 Binary files /dev/null and b/sound/direct_sound_samples/cries/palpitoad.wav differ diff --git a/sound/direct_sound_samples/cries/pancham.aif b/sound/direct_sound_samples/cries/pancham.aif deleted file mode 100644 index 5a986eddf471..000000000000 Binary files a/sound/direct_sound_samples/cries/pancham.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pancham.wav b/sound/direct_sound_samples/cries/pancham.wav new file mode 100644 index 000000000000..dbee7918fc85 Binary files /dev/null and b/sound/direct_sound_samples/cries/pancham.wav differ diff --git a/sound/direct_sound_samples/cries/pangoro.aif b/sound/direct_sound_samples/cries/pangoro.aif deleted file mode 100644 index 47f7bcf2d055..000000000000 Binary files a/sound/direct_sound_samples/cries/pangoro.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pangoro.wav b/sound/direct_sound_samples/cries/pangoro.wav new file mode 100644 index 000000000000..e277056884c7 Binary files /dev/null and b/sound/direct_sound_samples/cries/pangoro.wav differ diff --git a/sound/direct_sound_samples/cries/panpour.aif b/sound/direct_sound_samples/cries/panpour.aif deleted file mode 100644 index 18b65158eb2f..000000000000 Binary files a/sound/direct_sound_samples/cries/panpour.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/panpour.wav b/sound/direct_sound_samples/cries/panpour.wav new file mode 100644 index 000000000000..8a2042cd638b Binary files /dev/null and b/sound/direct_sound_samples/cries/panpour.wav differ diff --git a/sound/direct_sound_samples/cries/pansage.aif b/sound/direct_sound_samples/cries/pansage.aif deleted file mode 100644 index a4d277230f73..000000000000 Binary files a/sound/direct_sound_samples/cries/pansage.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pansage.wav b/sound/direct_sound_samples/cries/pansage.wav new file mode 100644 index 000000000000..30004e063733 Binary files /dev/null and b/sound/direct_sound_samples/cries/pansage.wav differ diff --git a/sound/direct_sound_samples/cries/pansear.aif b/sound/direct_sound_samples/cries/pansear.aif deleted file mode 100644 index 4d76d6089cb9..000000000000 Binary files a/sound/direct_sound_samples/cries/pansear.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pansear.wav b/sound/direct_sound_samples/cries/pansear.wav new file mode 100644 index 000000000000..fde72b7e4535 Binary files /dev/null and b/sound/direct_sound_samples/cries/pansear.wav differ diff --git a/sound/direct_sound_samples/cries/paras.aif b/sound/direct_sound_samples/cries/paras.aif deleted file mode 100644 index fbfbfaf07b18..000000000000 Binary files a/sound/direct_sound_samples/cries/paras.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/paras.wav b/sound/direct_sound_samples/cries/paras.wav new file mode 100644 index 000000000000..ba4a051c9fbb Binary files /dev/null and b/sound/direct_sound_samples/cries/paras.wav differ diff --git a/sound/direct_sound_samples/cries/parasect.aif b/sound/direct_sound_samples/cries/parasect.aif deleted file mode 100644 index 1251cbabefb8..000000000000 Binary files a/sound/direct_sound_samples/cries/parasect.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/parasect.wav b/sound/direct_sound_samples/cries/parasect.wav new file mode 100644 index 000000000000..5ff6ac29070b Binary files /dev/null and b/sound/direct_sound_samples/cries/parasect.wav differ diff --git a/sound/direct_sound_samples/cries/passimian.aif b/sound/direct_sound_samples/cries/passimian.aif deleted file mode 100644 index ac824012e5f6..000000000000 Binary files a/sound/direct_sound_samples/cries/passimian.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/passimian.wav b/sound/direct_sound_samples/cries/passimian.wav new file mode 100644 index 000000000000..f17f2ec250b6 Binary files /dev/null and b/sound/direct_sound_samples/cries/passimian.wav differ diff --git a/sound/direct_sound_samples/cries/patrat.aif b/sound/direct_sound_samples/cries/patrat.aif deleted file mode 100644 index f1e17939ab10..000000000000 Binary files a/sound/direct_sound_samples/cries/patrat.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/patrat.wav b/sound/direct_sound_samples/cries/patrat.wav new file mode 100644 index 000000000000..51982fbc7818 Binary files /dev/null and b/sound/direct_sound_samples/cries/patrat.wav differ diff --git a/sound/direct_sound_samples/cries/pawmi.aif b/sound/direct_sound_samples/cries/pawmi.aif deleted file mode 100644 index fa9a9197cb67..000000000000 Binary files a/sound/direct_sound_samples/cries/pawmi.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pawmi.wav b/sound/direct_sound_samples/cries/pawmi.wav new file mode 100644 index 000000000000..ac07672b4a2d Binary files /dev/null and b/sound/direct_sound_samples/cries/pawmi.wav differ diff --git a/sound/direct_sound_samples/cries/pawmo.aif b/sound/direct_sound_samples/cries/pawmo.aif deleted file mode 100644 index 7fbf646c2f46..000000000000 Binary files a/sound/direct_sound_samples/cries/pawmo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pawmo.wav b/sound/direct_sound_samples/cries/pawmo.wav new file mode 100644 index 000000000000..8ffc03d00553 Binary files /dev/null and b/sound/direct_sound_samples/cries/pawmo.wav differ diff --git a/sound/direct_sound_samples/cries/pawmot.aif b/sound/direct_sound_samples/cries/pawmot.aif deleted file mode 100644 index 40ad2d5bf27b..000000000000 Binary files a/sound/direct_sound_samples/cries/pawmot.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pawmot.wav b/sound/direct_sound_samples/cries/pawmot.wav new file mode 100644 index 000000000000..81fe4267c83d Binary files /dev/null and b/sound/direct_sound_samples/cries/pawmot.wav differ diff --git a/sound/direct_sound_samples/cries/pawniard.aif b/sound/direct_sound_samples/cries/pawniard.aif deleted file mode 100644 index 61968928374f..000000000000 Binary files a/sound/direct_sound_samples/cries/pawniard.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pawniard.wav b/sound/direct_sound_samples/cries/pawniard.wav new file mode 100644 index 000000000000..25663a52c069 Binary files /dev/null and b/sound/direct_sound_samples/cries/pawniard.wav differ diff --git a/sound/direct_sound_samples/cries/pecharunt.aif b/sound/direct_sound_samples/cries/pecharunt.aif deleted file mode 100644 index 024e6bb587cf..000000000000 Binary files a/sound/direct_sound_samples/cries/pecharunt.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pecharunt.wav b/sound/direct_sound_samples/cries/pecharunt.wav new file mode 100644 index 000000000000..9d9fadf408c4 Binary files /dev/null and b/sound/direct_sound_samples/cries/pecharunt.wav differ diff --git a/sound/direct_sound_samples/cries/pelipper.aif b/sound/direct_sound_samples/cries/pelipper.aif deleted file mode 100644 index 64a008036064..000000000000 Binary files a/sound/direct_sound_samples/cries/pelipper.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pelipper.wav b/sound/direct_sound_samples/cries/pelipper.wav new file mode 100644 index 000000000000..665dbcac9e2e Binary files /dev/null and b/sound/direct_sound_samples/cries/pelipper.wav differ diff --git a/sound/direct_sound_samples/cries/perrserker.aif b/sound/direct_sound_samples/cries/perrserker.aif deleted file mode 100644 index b790ce5c5130..000000000000 Binary files a/sound/direct_sound_samples/cries/perrserker.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/perrserker.wav b/sound/direct_sound_samples/cries/perrserker.wav new file mode 100644 index 000000000000..80845b8c0723 Binary files /dev/null and b/sound/direct_sound_samples/cries/perrserker.wav differ diff --git a/sound/direct_sound_samples/cries/persian.aif b/sound/direct_sound_samples/cries/persian.aif deleted file mode 100644 index d87fe2cbe1d1..000000000000 Binary files a/sound/direct_sound_samples/cries/persian.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/persian.wav b/sound/direct_sound_samples/cries/persian.wav new file mode 100644 index 000000000000..96acf8296ce4 Binary files /dev/null and b/sound/direct_sound_samples/cries/persian.wav differ diff --git a/sound/direct_sound_samples/cries/petilil.aif b/sound/direct_sound_samples/cries/petilil.aif deleted file mode 100644 index 6252c7624704..000000000000 Binary files a/sound/direct_sound_samples/cries/petilil.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/petilil.wav b/sound/direct_sound_samples/cries/petilil.wav new file mode 100644 index 000000000000..0bda09b259cf Binary files /dev/null and b/sound/direct_sound_samples/cries/petilil.wav differ diff --git a/sound/direct_sound_samples/cries/phanpy.aif b/sound/direct_sound_samples/cries/phanpy.aif deleted file mode 100644 index 0c541c3bf155..000000000000 Binary files a/sound/direct_sound_samples/cries/phanpy.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/phanpy.wav b/sound/direct_sound_samples/cries/phanpy.wav new file mode 100644 index 000000000000..4de13cafe1c7 Binary files /dev/null and b/sound/direct_sound_samples/cries/phanpy.wav differ diff --git a/sound/direct_sound_samples/cries/phantump.aif b/sound/direct_sound_samples/cries/phantump.aif deleted file mode 100644 index 1afccc074c53..000000000000 Binary files a/sound/direct_sound_samples/cries/phantump.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/phantump.wav b/sound/direct_sound_samples/cries/phantump.wav new file mode 100644 index 000000000000..3f0db048adf3 Binary files /dev/null and b/sound/direct_sound_samples/cries/phantump.wav differ diff --git a/sound/direct_sound_samples/cries/pheromosa.aif b/sound/direct_sound_samples/cries/pheromosa.aif deleted file mode 100644 index bcf57050d3e6..000000000000 Binary files a/sound/direct_sound_samples/cries/pheromosa.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pheromosa.wav b/sound/direct_sound_samples/cries/pheromosa.wav new file mode 100644 index 000000000000..a8f41396d373 Binary files /dev/null and b/sound/direct_sound_samples/cries/pheromosa.wav differ diff --git a/sound/direct_sound_samples/cries/phione.aif b/sound/direct_sound_samples/cries/phione.aif deleted file mode 100644 index ba31bd9a5d6d..000000000000 Binary files a/sound/direct_sound_samples/cries/phione.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/phione.wav b/sound/direct_sound_samples/cries/phione.wav new file mode 100644 index 000000000000..bbc661c9eb30 Binary files /dev/null and b/sound/direct_sound_samples/cries/phione.wav differ diff --git a/sound/direct_sound_samples/cries/pichu.aif b/sound/direct_sound_samples/cries/pichu.aif deleted file mode 100644 index a0cff3f6f388..000000000000 Binary files a/sound/direct_sound_samples/cries/pichu.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pichu.wav b/sound/direct_sound_samples/cries/pichu.wav new file mode 100644 index 000000000000..d325103719a7 Binary files /dev/null and b/sound/direct_sound_samples/cries/pichu.wav differ diff --git a/sound/direct_sound_samples/cries/pidgeot.aif b/sound/direct_sound_samples/cries/pidgeot.aif deleted file mode 100644 index 67f49406a94a..000000000000 Binary files a/sound/direct_sound_samples/cries/pidgeot.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pidgeot.wav b/sound/direct_sound_samples/cries/pidgeot.wav new file mode 100644 index 000000000000..f93ed996567b Binary files /dev/null and b/sound/direct_sound_samples/cries/pidgeot.wav differ diff --git a/sound/direct_sound_samples/cries/pidgeot_mega.aif b/sound/direct_sound_samples/cries/pidgeot_mega.aif deleted file mode 100644 index a1639ba4e913..000000000000 Binary files a/sound/direct_sound_samples/cries/pidgeot_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pidgeot_mega.wav b/sound/direct_sound_samples/cries/pidgeot_mega.wav new file mode 100644 index 000000000000..1cbd3d7a6226 Binary files /dev/null and b/sound/direct_sound_samples/cries/pidgeot_mega.wav differ diff --git a/sound/direct_sound_samples/cries/pidgeotto.aif b/sound/direct_sound_samples/cries/pidgeotto.aif deleted file mode 100644 index f31d3df8cf8b..000000000000 Binary files a/sound/direct_sound_samples/cries/pidgeotto.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pidgeotto.wav b/sound/direct_sound_samples/cries/pidgeotto.wav new file mode 100644 index 000000000000..8b40a41e99cc Binary files /dev/null and b/sound/direct_sound_samples/cries/pidgeotto.wav differ diff --git a/sound/direct_sound_samples/cries/pidgey.aif b/sound/direct_sound_samples/cries/pidgey.aif deleted file mode 100644 index 3b4b6ece2757..000000000000 Binary files a/sound/direct_sound_samples/cries/pidgey.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pidgey.wav b/sound/direct_sound_samples/cries/pidgey.wav new file mode 100644 index 000000000000..34a1d1bd6a4a Binary files /dev/null and b/sound/direct_sound_samples/cries/pidgey.wav differ diff --git a/sound/direct_sound_samples/cries/pidove.aif b/sound/direct_sound_samples/cries/pidove.aif deleted file mode 100644 index b2bd5590bc8d..000000000000 Binary files a/sound/direct_sound_samples/cries/pidove.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pidove.wav b/sound/direct_sound_samples/cries/pidove.wav new file mode 100644 index 000000000000..56527c92c585 Binary files /dev/null and b/sound/direct_sound_samples/cries/pidove.wav differ diff --git a/sound/direct_sound_samples/cries/pignite.aif b/sound/direct_sound_samples/cries/pignite.aif deleted file mode 100644 index 8e1f78ae2f3e..000000000000 Binary files a/sound/direct_sound_samples/cries/pignite.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pignite.wav b/sound/direct_sound_samples/cries/pignite.wav new file mode 100644 index 000000000000..94095d937369 Binary files /dev/null and b/sound/direct_sound_samples/cries/pignite.wav differ diff --git a/sound/direct_sound_samples/cries/pikachu.aif b/sound/direct_sound_samples/cries/pikachu.aif deleted file mode 100644 index 4a7b27024562..000000000000 Binary files a/sound/direct_sound_samples/cries/pikachu.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pikachu.wav b/sound/direct_sound_samples/cries/pikachu.wav new file mode 100644 index 000000000000..d5f68416f2f2 Binary files /dev/null and b/sound/direct_sound_samples/cries/pikachu.wav differ diff --git a/sound/direct_sound_samples/cries/pikipek.aif b/sound/direct_sound_samples/cries/pikipek.aif deleted file mode 100644 index 04efe56a4cb7..000000000000 Binary files a/sound/direct_sound_samples/cries/pikipek.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pikipek.wav b/sound/direct_sound_samples/cries/pikipek.wav new file mode 100644 index 000000000000..67d05ca2d9fb Binary files /dev/null and b/sound/direct_sound_samples/cries/pikipek.wav differ diff --git a/sound/direct_sound_samples/cries/piloswine.aif b/sound/direct_sound_samples/cries/piloswine.aif deleted file mode 100644 index 2511d3fd701b..000000000000 Binary files a/sound/direct_sound_samples/cries/piloswine.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/piloswine.wav b/sound/direct_sound_samples/cries/piloswine.wav new file mode 100644 index 000000000000..4f181b7ec690 Binary files /dev/null and b/sound/direct_sound_samples/cries/piloswine.wav differ diff --git a/sound/direct_sound_samples/cries/pincurchin.aif b/sound/direct_sound_samples/cries/pincurchin.aif deleted file mode 100644 index 76f68e21110c..000000000000 Binary files a/sound/direct_sound_samples/cries/pincurchin.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pincurchin.wav b/sound/direct_sound_samples/cries/pincurchin.wav new file mode 100644 index 000000000000..070485416f76 Binary files /dev/null and b/sound/direct_sound_samples/cries/pincurchin.wav differ diff --git a/sound/direct_sound_samples/cries/pineco.aif b/sound/direct_sound_samples/cries/pineco.aif deleted file mode 100644 index acb6de8a0c67..000000000000 Binary files a/sound/direct_sound_samples/cries/pineco.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pineco.wav b/sound/direct_sound_samples/cries/pineco.wav new file mode 100644 index 000000000000..70d841b9e5e2 Binary files /dev/null and b/sound/direct_sound_samples/cries/pineco.wav differ diff --git a/sound/direct_sound_samples/cries/pinsir.aif b/sound/direct_sound_samples/cries/pinsir.aif deleted file mode 100644 index bfbb268d68ce..000000000000 Binary files a/sound/direct_sound_samples/cries/pinsir.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pinsir.wav b/sound/direct_sound_samples/cries/pinsir.wav new file mode 100644 index 000000000000..3d3dcc792907 Binary files /dev/null and b/sound/direct_sound_samples/cries/pinsir.wav differ diff --git a/sound/direct_sound_samples/cries/pinsir_mega.aif b/sound/direct_sound_samples/cries/pinsir_mega.aif deleted file mode 100644 index c2e57d2a39ea..000000000000 Binary files a/sound/direct_sound_samples/cries/pinsir_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pinsir_mega.wav b/sound/direct_sound_samples/cries/pinsir_mega.wav new file mode 100644 index 000000000000..36815cbc710d Binary files /dev/null and b/sound/direct_sound_samples/cries/pinsir_mega.wav differ diff --git a/sound/direct_sound_samples/cries/piplup.aif b/sound/direct_sound_samples/cries/piplup.aif deleted file mode 100644 index e8c161eb3518..000000000000 Binary files a/sound/direct_sound_samples/cries/piplup.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/piplup.wav b/sound/direct_sound_samples/cries/piplup.wav new file mode 100644 index 000000000000..aacf7d92a033 Binary files /dev/null and b/sound/direct_sound_samples/cries/piplup.wav differ diff --git a/sound/direct_sound_samples/cries/plusle.aif b/sound/direct_sound_samples/cries/plusle.aif deleted file mode 100644 index e584201a8f38..000000000000 Binary files a/sound/direct_sound_samples/cries/plusle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/plusle.wav b/sound/direct_sound_samples/cries/plusle.wav new file mode 100644 index 000000000000..1b3cf8749702 Binary files /dev/null and b/sound/direct_sound_samples/cries/plusle.wav differ diff --git a/sound/direct_sound_samples/cries/poipole.aif b/sound/direct_sound_samples/cries/poipole.aif deleted file mode 100644 index c2a141ac85ef..000000000000 Binary files a/sound/direct_sound_samples/cries/poipole.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/poipole.wav b/sound/direct_sound_samples/cries/poipole.wav new file mode 100644 index 000000000000..9e0ad029c98b Binary files /dev/null and b/sound/direct_sound_samples/cries/poipole.wav differ diff --git a/sound/direct_sound_samples/cries/politoed.aif b/sound/direct_sound_samples/cries/politoed.aif deleted file mode 100644 index 2739c2a4282d..000000000000 Binary files a/sound/direct_sound_samples/cries/politoed.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/politoed.wav b/sound/direct_sound_samples/cries/politoed.wav new file mode 100644 index 000000000000..6472a08f5538 Binary files /dev/null and b/sound/direct_sound_samples/cries/politoed.wav differ diff --git a/sound/direct_sound_samples/cries/poliwag.aif b/sound/direct_sound_samples/cries/poliwag.aif deleted file mode 100644 index d76e2094953e..000000000000 Binary files a/sound/direct_sound_samples/cries/poliwag.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/poliwag.wav b/sound/direct_sound_samples/cries/poliwag.wav new file mode 100644 index 000000000000..d35c8f4d8f63 Binary files /dev/null and b/sound/direct_sound_samples/cries/poliwag.wav differ diff --git a/sound/direct_sound_samples/cries/poliwhirl.aif b/sound/direct_sound_samples/cries/poliwhirl.aif deleted file mode 100644 index 4aee053d7f8f..000000000000 Binary files a/sound/direct_sound_samples/cries/poliwhirl.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/poliwhirl.wav b/sound/direct_sound_samples/cries/poliwhirl.wav new file mode 100644 index 000000000000..0c59fbed64ff Binary files /dev/null and b/sound/direct_sound_samples/cries/poliwhirl.wav differ diff --git a/sound/direct_sound_samples/cries/poliwrath.aif b/sound/direct_sound_samples/cries/poliwrath.aif deleted file mode 100644 index bb9d78f3c39f..000000000000 Binary files a/sound/direct_sound_samples/cries/poliwrath.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/poliwrath.wav b/sound/direct_sound_samples/cries/poliwrath.wav new file mode 100644 index 000000000000..c32bd448591a Binary files /dev/null and b/sound/direct_sound_samples/cries/poliwrath.wav differ diff --git a/sound/direct_sound_samples/cries/poltchageist.aif b/sound/direct_sound_samples/cries/poltchageist.aif deleted file mode 100644 index 855eb010cebf..000000000000 Binary files a/sound/direct_sound_samples/cries/poltchageist.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/poltchageist.wav b/sound/direct_sound_samples/cries/poltchageist.wav new file mode 100644 index 000000000000..33d929e811b2 Binary files /dev/null and b/sound/direct_sound_samples/cries/poltchageist.wav differ diff --git a/sound/direct_sound_samples/cries/polteageist.aif b/sound/direct_sound_samples/cries/polteageist.aif deleted file mode 100644 index f9051a25c4ab..000000000000 Binary files a/sound/direct_sound_samples/cries/polteageist.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/polteageist.wav b/sound/direct_sound_samples/cries/polteageist.wav new file mode 100644 index 000000000000..94131a981b11 Binary files /dev/null and b/sound/direct_sound_samples/cries/polteageist.wav differ diff --git a/sound/direct_sound_samples/cries/ponyta.aif b/sound/direct_sound_samples/cries/ponyta.aif deleted file mode 100644 index ec66a33faf46..000000000000 Binary files a/sound/direct_sound_samples/cries/ponyta.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ponyta.wav b/sound/direct_sound_samples/cries/ponyta.wav new file mode 100644 index 000000000000..911954226d75 Binary files /dev/null and b/sound/direct_sound_samples/cries/ponyta.wav differ diff --git a/sound/direct_sound_samples/cries/poochyena.aif b/sound/direct_sound_samples/cries/poochyena.aif deleted file mode 100644 index bfa6a00ae20a..000000000000 Binary files a/sound/direct_sound_samples/cries/poochyena.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/poochyena.wav b/sound/direct_sound_samples/cries/poochyena.wav new file mode 100644 index 000000000000..16cabc29c6ec Binary files /dev/null and b/sound/direct_sound_samples/cries/poochyena.wav differ diff --git a/sound/direct_sound_samples/cries/popplio.aif b/sound/direct_sound_samples/cries/popplio.aif deleted file mode 100644 index cbb3a0ff30e0..000000000000 Binary files a/sound/direct_sound_samples/cries/popplio.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/popplio.wav b/sound/direct_sound_samples/cries/popplio.wav new file mode 100644 index 000000000000..f3226c862a3a Binary files /dev/null and b/sound/direct_sound_samples/cries/popplio.wav differ diff --git a/sound/direct_sound_samples/cries/porygon.aif b/sound/direct_sound_samples/cries/porygon.aif deleted file mode 100644 index 79160cdbbb45..000000000000 Binary files a/sound/direct_sound_samples/cries/porygon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/porygon.wav b/sound/direct_sound_samples/cries/porygon.wav new file mode 100644 index 000000000000..11dd528dda51 Binary files /dev/null and b/sound/direct_sound_samples/cries/porygon.wav differ diff --git a/sound/direct_sound_samples/cries/porygon2.aif b/sound/direct_sound_samples/cries/porygon2.aif deleted file mode 100644 index 94237057b1ab..000000000000 Binary files a/sound/direct_sound_samples/cries/porygon2.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/porygon2.wav b/sound/direct_sound_samples/cries/porygon2.wav new file mode 100644 index 000000000000..5699d8e45057 Binary files /dev/null and b/sound/direct_sound_samples/cries/porygon2.wav differ diff --git a/sound/direct_sound_samples/cries/porygon_z.aif b/sound/direct_sound_samples/cries/porygon_z.aif deleted file mode 100644 index 55448d13c056..000000000000 Binary files a/sound/direct_sound_samples/cries/porygon_z.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/porygon_z.wav b/sound/direct_sound_samples/cries/porygon_z.wav new file mode 100644 index 000000000000..215d9b7e6d87 Binary files /dev/null and b/sound/direct_sound_samples/cries/porygon_z.wav differ diff --git a/sound/direct_sound_samples/cries/primarina.aif b/sound/direct_sound_samples/cries/primarina.aif deleted file mode 100644 index 7952fda82e79..000000000000 Binary files a/sound/direct_sound_samples/cries/primarina.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/primarina.wav b/sound/direct_sound_samples/cries/primarina.wav new file mode 100644 index 000000000000..60e0cef0b6cc Binary files /dev/null and b/sound/direct_sound_samples/cries/primarina.wav differ diff --git a/sound/direct_sound_samples/cries/primeape.aif b/sound/direct_sound_samples/cries/primeape.aif deleted file mode 100644 index 35898bf2e64e..000000000000 Binary files a/sound/direct_sound_samples/cries/primeape.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/primeape.wav b/sound/direct_sound_samples/cries/primeape.wav new file mode 100644 index 000000000000..bcd98e6bb4a6 Binary files /dev/null and b/sound/direct_sound_samples/cries/primeape.wav differ diff --git a/sound/direct_sound_samples/cries/prinplup.aif b/sound/direct_sound_samples/cries/prinplup.aif deleted file mode 100644 index 62311c1cbf2c..000000000000 Binary files a/sound/direct_sound_samples/cries/prinplup.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/prinplup.wav b/sound/direct_sound_samples/cries/prinplup.wav new file mode 100644 index 000000000000..8b914e4addd5 Binary files /dev/null and b/sound/direct_sound_samples/cries/prinplup.wav differ diff --git a/sound/direct_sound_samples/cries/probopass.aif b/sound/direct_sound_samples/cries/probopass.aif deleted file mode 100644 index ac831dbf2032..000000000000 Binary files a/sound/direct_sound_samples/cries/probopass.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/probopass.wav b/sound/direct_sound_samples/cries/probopass.wav new file mode 100644 index 000000000000..b749429c8ac3 Binary files /dev/null and b/sound/direct_sound_samples/cries/probopass.wav differ diff --git a/sound/direct_sound_samples/cries/psyduck.aif b/sound/direct_sound_samples/cries/psyduck.aif deleted file mode 100644 index e99270f05fd4..000000000000 Binary files a/sound/direct_sound_samples/cries/psyduck.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/psyduck.wav b/sound/direct_sound_samples/cries/psyduck.wav new file mode 100644 index 000000000000..bdc0d673e3ac Binary files /dev/null and b/sound/direct_sound_samples/cries/psyduck.wav differ diff --git a/sound/direct_sound_samples/cries/pumpkaboo.aif b/sound/direct_sound_samples/cries/pumpkaboo.aif deleted file mode 100644 index 6960875e58b8..000000000000 Binary files a/sound/direct_sound_samples/cries/pumpkaboo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pumpkaboo.wav b/sound/direct_sound_samples/cries/pumpkaboo.wav new file mode 100644 index 000000000000..ac870aaa2325 Binary files /dev/null and b/sound/direct_sound_samples/cries/pumpkaboo.wav differ diff --git a/sound/direct_sound_samples/cries/pumpkaboo_super.aif b/sound/direct_sound_samples/cries/pumpkaboo_super.aif deleted file mode 100644 index f6c7500f68ab..000000000000 Binary files a/sound/direct_sound_samples/cries/pumpkaboo_super.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pumpkaboo_super.wav b/sound/direct_sound_samples/cries/pumpkaboo_super.wav new file mode 100644 index 000000000000..62b4bc3743ef Binary files /dev/null and b/sound/direct_sound_samples/cries/pumpkaboo_super.wav differ diff --git a/sound/direct_sound_samples/cries/pupitar.aif b/sound/direct_sound_samples/cries/pupitar.aif deleted file mode 100644 index eb4674d5214c..000000000000 Binary files a/sound/direct_sound_samples/cries/pupitar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pupitar.wav b/sound/direct_sound_samples/cries/pupitar.wav new file mode 100644 index 000000000000..5e797d420fdc Binary files /dev/null and b/sound/direct_sound_samples/cries/pupitar.wav differ diff --git a/sound/direct_sound_samples/cries/purrloin.aif b/sound/direct_sound_samples/cries/purrloin.aif deleted file mode 100644 index ceb00874c529..000000000000 Binary files a/sound/direct_sound_samples/cries/purrloin.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/purrloin.wav b/sound/direct_sound_samples/cries/purrloin.wav new file mode 100644 index 000000000000..1abbc33d2107 Binary files /dev/null and b/sound/direct_sound_samples/cries/purrloin.wav differ diff --git a/sound/direct_sound_samples/cries/purugly.aif b/sound/direct_sound_samples/cries/purugly.aif deleted file mode 100644 index 9f6460a63078..000000000000 Binary files a/sound/direct_sound_samples/cries/purugly.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/purugly.wav b/sound/direct_sound_samples/cries/purugly.wav new file mode 100644 index 000000000000..662bdaafe85a Binary files /dev/null and b/sound/direct_sound_samples/cries/purugly.wav differ diff --git a/sound/direct_sound_samples/cries/pyroar.aif b/sound/direct_sound_samples/cries/pyroar.aif deleted file mode 100644 index 7bf77d50cb6e..000000000000 Binary files a/sound/direct_sound_samples/cries/pyroar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pyroar.wav b/sound/direct_sound_samples/cries/pyroar.wav new file mode 100644 index 000000000000..9e145824f10f Binary files /dev/null and b/sound/direct_sound_samples/cries/pyroar.wav differ diff --git a/sound/direct_sound_samples/cries/pyukumuku.aif b/sound/direct_sound_samples/cries/pyukumuku.aif deleted file mode 100644 index ad1d740c31d4..000000000000 Binary files a/sound/direct_sound_samples/cries/pyukumuku.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/pyukumuku.wav b/sound/direct_sound_samples/cries/pyukumuku.wav new file mode 100644 index 000000000000..eb2a7eaf4fd7 Binary files /dev/null and b/sound/direct_sound_samples/cries/pyukumuku.wav differ diff --git a/sound/direct_sound_samples/cries/quagsire.aif b/sound/direct_sound_samples/cries/quagsire.aif deleted file mode 100644 index 7373b6bb0c9c..000000000000 Binary files a/sound/direct_sound_samples/cries/quagsire.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/quagsire.wav b/sound/direct_sound_samples/cries/quagsire.wav new file mode 100644 index 000000000000..e4a8c0aad372 Binary files /dev/null and b/sound/direct_sound_samples/cries/quagsire.wav differ diff --git a/sound/direct_sound_samples/cries/quaquaval.aif b/sound/direct_sound_samples/cries/quaquaval.aif deleted file mode 100644 index d04fac23ff28..000000000000 Binary files a/sound/direct_sound_samples/cries/quaquaval.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/quaquaval.wav b/sound/direct_sound_samples/cries/quaquaval.wav new file mode 100644 index 000000000000..65cce8b82981 Binary files /dev/null and b/sound/direct_sound_samples/cries/quaquaval.wav differ diff --git a/sound/direct_sound_samples/cries/quaxly.aif b/sound/direct_sound_samples/cries/quaxly.aif deleted file mode 100644 index 81606b4a194d..000000000000 Binary files a/sound/direct_sound_samples/cries/quaxly.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/quaxly.wav b/sound/direct_sound_samples/cries/quaxly.wav new file mode 100644 index 000000000000..b886a0b8ce0b Binary files /dev/null and b/sound/direct_sound_samples/cries/quaxly.wav differ diff --git a/sound/direct_sound_samples/cries/quaxwell.aif b/sound/direct_sound_samples/cries/quaxwell.aif deleted file mode 100644 index 62669362ea77..000000000000 Binary files a/sound/direct_sound_samples/cries/quaxwell.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/quaxwell.wav b/sound/direct_sound_samples/cries/quaxwell.wav new file mode 100644 index 000000000000..f0ff99f2aa02 Binary files /dev/null and b/sound/direct_sound_samples/cries/quaxwell.wav differ diff --git a/sound/direct_sound_samples/cries/quilava.aif b/sound/direct_sound_samples/cries/quilava.aif deleted file mode 100644 index 40d3db5594d4..000000000000 Binary files a/sound/direct_sound_samples/cries/quilava.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/quilava.wav b/sound/direct_sound_samples/cries/quilava.wav new file mode 100644 index 000000000000..ef0bd7381fc1 Binary files /dev/null and b/sound/direct_sound_samples/cries/quilava.wav differ diff --git a/sound/direct_sound_samples/cries/quilladin.aif b/sound/direct_sound_samples/cries/quilladin.aif deleted file mode 100644 index 9b6dfabdc603..000000000000 Binary files a/sound/direct_sound_samples/cries/quilladin.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/quilladin.wav b/sound/direct_sound_samples/cries/quilladin.wav new file mode 100644 index 000000000000..1cce00c5ca89 Binary files /dev/null and b/sound/direct_sound_samples/cries/quilladin.wav differ diff --git a/sound/direct_sound_samples/cries/qwilfish.aif b/sound/direct_sound_samples/cries/qwilfish.aif deleted file mode 100644 index a5a56480f18d..000000000000 Binary files a/sound/direct_sound_samples/cries/qwilfish.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/qwilfish.wav b/sound/direct_sound_samples/cries/qwilfish.wav new file mode 100644 index 000000000000..0b11276dec60 Binary files /dev/null and b/sound/direct_sound_samples/cries/qwilfish.wav differ diff --git a/sound/direct_sound_samples/cries/raboot.aif b/sound/direct_sound_samples/cries/raboot.aif deleted file mode 100644 index b1a6d09892f5..000000000000 Binary files a/sound/direct_sound_samples/cries/raboot.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/raboot.wav b/sound/direct_sound_samples/cries/raboot.wav new file mode 100644 index 000000000000..02fa5e376120 Binary files /dev/null and b/sound/direct_sound_samples/cries/raboot.wav differ diff --git a/sound/direct_sound_samples/cries/rabsca.aif b/sound/direct_sound_samples/cries/rabsca.aif deleted file mode 100644 index 5665f798656a..000000000000 Binary files a/sound/direct_sound_samples/cries/rabsca.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/rabsca.wav b/sound/direct_sound_samples/cries/rabsca.wav new file mode 100644 index 000000000000..ca041c6cee9c Binary files /dev/null and b/sound/direct_sound_samples/cries/rabsca.wav differ diff --git a/sound/direct_sound_samples/cries/raging_bolt.aif b/sound/direct_sound_samples/cries/raging_bolt.aif deleted file mode 100644 index 5b787e8116d2..000000000000 Binary files a/sound/direct_sound_samples/cries/raging_bolt.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/raging_bolt.wav b/sound/direct_sound_samples/cries/raging_bolt.wav new file mode 100644 index 000000000000..f7e920d1b068 Binary files /dev/null and b/sound/direct_sound_samples/cries/raging_bolt.wav differ diff --git a/sound/direct_sound_samples/cries/raichu.aif b/sound/direct_sound_samples/cries/raichu.aif deleted file mode 100644 index 001dcba62708..000000000000 Binary files a/sound/direct_sound_samples/cries/raichu.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/raichu.wav b/sound/direct_sound_samples/cries/raichu.wav new file mode 100644 index 000000000000..4e5dbaeb4087 Binary files /dev/null and b/sound/direct_sound_samples/cries/raichu.wav differ diff --git a/sound/direct_sound_samples/cries/raikou.aif b/sound/direct_sound_samples/cries/raikou.aif deleted file mode 100644 index ac1e84669110..000000000000 Binary files a/sound/direct_sound_samples/cries/raikou.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/raikou.wav b/sound/direct_sound_samples/cries/raikou.wav new file mode 100644 index 000000000000..fefeb1e3a506 Binary files /dev/null and b/sound/direct_sound_samples/cries/raikou.wav differ diff --git a/sound/direct_sound_samples/cries/ralts.aif b/sound/direct_sound_samples/cries/ralts.aif deleted file mode 100644 index 660438548c8b..000000000000 Binary files a/sound/direct_sound_samples/cries/ralts.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ralts.wav b/sound/direct_sound_samples/cries/ralts.wav new file mode 100644 index 000000000000..4327c13a1240 Binary files /dev/null and b/sound/direct_sound_samples/cries/ralts.wav differ diff --git a/sound/direct_sound_samples/cries/rampardos.aif b/sound/direct_sound_samples/cries/rampardos.aif deleted file mode 100644 index edec1aac4f34..000000000000 Binary files a/sound/direct_sound_samples/cries/rampardos.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/rampardos.wav b/sound/direct_sound_samples/cries/rampardos.wav new file mode 100644 index 000000000000..de2cfc500288 Binary files /dev/null and b/sound/direct_sound_samples/cries/rampardos.wav differ diff --git a/sound/direct_sound_samples/cries/rapidash.aif b/sound/direct_sound_samples/cries/rapidash.aif deleted file mode 100644 index c070475d183d..000000000000 Binary files a/sound/direct_sound_samples/cries/rapidash.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/rapidash.wav b/sound/direct_sound_samples/cries/rapidash.wav new file mode 100644 index 000000000000..14ce75be7500 Binary files /dev/null and b/sound/direct_sound_samples/cries/rapidash.wav differ diff --git a/sound/direct_sound_samples/cries/raticate.aif b/sound/direct_sound_samples/cries/raticate.aif deleted file mode 100644 index fd726b655f33..000000000000 Binary files a/sound/direct_sound_samples/cries/raticate.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/raticate.wav b/sound/direct_sound_samples/cries/raticate.wav new file mode 100644 index 000000000000..545ebfcf1212 Binary files /dev/null and b/sound/direct_sound_samples/cries/raticate.wav differ diff --git a/sound/direct_sound_samples/cries/rattata.aif b/sound/direct_sound_samples/cries/rattata.aif deleted file mode 100644 index af6a4f246822..000000000000 Binary files a/sound/direct_sound_samples/cries/rattata.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/rattata.wav b/sound/direct_sound_samples/cries/rattata.wav new file mode 100644 index 000000000000..9e7a6b3cf630 Binary files /dev/null and b/sound/direct_sound_samples/cries/rattata.wav differ diff --git a/sound/direct_sound_samples/cries/rayquaza.aif b/sound/direct_sound_samples/cries/rayquaza.aif deleted file mode 100644 index ba7a73c7eece..000000000000 Binary files a/sound/direct_sound_samples/cries/rayquaza.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/rayquaza.wav b/sound/direct_sound_samples/cries/rayquaza.wav new file mode 100644 index 000000000000..c4e50535fc97 Binary files /dev/null and b/sound/direct_sound_samples/cries/rayquaza.wav differ diff --git a/sound/direct_sound_samples/cries/rayquaza_mega.aif b/sound/direct_sound_samples/cries/rayquaza_mega.aif deleted file mode 100644 index 1b78a94e933f..000000000000 Binary files a/sound/direct_sound_samples/cries/rayquaza_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/rayquaza_mega.wav b/sound/direct_sound_samples/cries/rayquaza_mega.wav new file mode 100644 index 000000000000..ee9804b9ada8 Binary files /dev/null and b/sound/direct_sound_samples/cries/rayquaza_mega.wav differ diff --git a/sound/direct_sound_samples/cries/regice.aif b/sound/direct_sound_samples/cries/regice.aif deleted file mode 100644 index 812737a80575..000000000000 Binary files a/sound/direct_sound_samples/cries/regice.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/regice.wav b/sound/direct_sound_samples/cries/regice.wav new file mode 100644 index 000000000000..b65a79b4d430 Binary files /dev/null and b/sound/direct_sound_samples/cries/regice.wav differ diff --git a/sound/direct_sound_samples/cries/regidrago.aif b/sound/direct_sound_samples/cries/regidrago.aif deleted file mode 100644 index d67dbe0ce3a5..000000000000 Binary files a/sound/direct_sound_samples/cries/regidrago.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/regidrago.wav b/sound/direct_sound_samples/cries/regidrago.wav new file mode 100644 index 000000000000..2231254c3092 Binary files /dev/null and b/sound/direct_sound_samples/cries/regidrago.wav differ diff --git a/sound/direct_sound_samples/cries/regieleki.aif b/sound/direct_sound_samples/cries/regieleki.aif deleted file mode 100644 index 75061bccff4e..000000000000 Binary files a/sound/direct_sound_samples/cries/regieleki.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/regieleki.wav b/sound/direct_sound_samples/cries/regieleki.wav new file mode 100644 index 000000000000..036545f82e78 Binary files /dev/null and b/sound/direct_sound_samples/cries/regieleki.wav differ diff --git a/sound/direct_sound_samples/cries/regigigas.aif b/sound/direct_sound_samples/cries/regigigas.aif deleted file mode 100644 index 9de9e451d832..000000000000 Binary files a/sound/direct_sound_samples/cries/regigigas.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/regigigas.wav b/sound/direct_sound_samples/cries/regigigas.wav new file mode 100644 index 000000000000..379ea8393664 Binary files /dev/null and b/sound/direct_sound_samples/cries/regigigas.wav differ diff --git a/sound/direct_sound_samples/cries/regirock.aif b/sound/direct_sound_samples/cries/regirock.aif deleted file mode 100644 index b9c294809599..000000000000 Binary files a/sound/direct_sound_samples/cries/regirock.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/regirock.wav b/sound/direct_sound_samples/cries/regirock.wav new file mode 100644 index 000000000000..0df3c1a720a7 Binary files /dev/null and b/sound/direct_sound_samples/cries/regirock.wav differ diff --git a/sound/direct_sound_samples/cries/registeel.aif b/sound/direct_sound_samples/cries/registeel.aif deleted file mode 100644 index 5afe87279e47..000000000000 Binary files a/sound/direct_sound_samples/cries/registeel.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/registeel.wav b/sound/direct_sound_samples/cries/registeel.wav new file mode 100644 index 000000000000..0e2b21beb230 Binary files /dev/null and b/sound/direct_sound_samples/cries/registeel.wav differ diff --git a/sound/direct_sound_samples/cries/relicanth.aif b/sound/direct_sound_samples/cries/relicanth.aif deleted file mode 100644 index a9c2b69e607e..000000000000 Binary files a/sound/direct_sound_samples/cries/relicanth.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/relicanth.wav b/sound/direct_sound_samples/cries/relicanth.wav new file mode 100644 index 000000000000..1a8c04473c31 Binary files /dev/null and b/sound/direct_sound_samples/cries/relicanth.wav differ diff --git a/sound/direct_sound_samples/cries/rellor.aif b/sound/direct_sound_samples/cries/rellor.aif deleted file mode 100644 index 0a2f79805f99..000000000000 Binary files a/sound/direct_sound_samples/cries/rellor.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/rellor.wav b/sound/direct_sound_samples/cries/rellor.wav new file mode 100644 index 000000000000..813e82b3ac05 Binary files /dev/null and b/sound/direct_sound_samples/cries/rellor.wav differ diff --git a/sound/direct_sound_samples/cries/remoraid.aif b/sound/direct_sound_samples/cries/remoraid.aif deleted file mode 100644 index f879cf28350e..000000000000 Binary files a/sound/direct_sound_samples/cries/remoraid.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/remoraid.wav b/sound/direct_sound_samples/cries/remoraid.wav new file mode 100644 index 000000000000..0465e033f13f Binary files /dev/null and b/sound/direct_sound_samples/cries/remoraid.wav differ diff --git a/sound/direct_sound_samples/cries/reshiram.aif b/sound/direct_sound_samples/cries/reshiram.aif deleted file mode 100644 index 870d3cf515d8..000000000000 Binary files a/sound/direct_sound_samples/cries/reshiram.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/reshiram.wav b/sound/direct_sound_samples/cries/reshiram.wav new file mode 100644 index 000000000000..7dc4f6d0fe01 Binary files /dev/null and b/sound/direct_sound_samples/cries/reshiram.wav differ diff --git a/sound/direct_sound_samples/cries/reuniclus.aif b/sound/direct_sound_samples/cries/reuniclus.aif deleted file mode 100644 index ab22f0f97e5f..000000000000 Binary files a/sound/direct_sound_samples/cries/reuniclus.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/reuniclus.wav b/sound/direct_sound_samples/cries/reuniclus.wav new file mode 100644 index 000000000000..addb5c3a1c82 Binary files /dev/null and b/sound/direct_sound_samples/cries/reuniclus.wav differ diff --git a/sound/direct_sound_samples/cries/revavroom.aif b/sound/direct_sound_samples/cries/revavroom.aif deleted file mode 100644 index e52bf1c6fe7b..000000000000 Binary files a/sound/direct_sound_samples/cries/revavroom.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/revavroom.wav b/sound/direct_sound_samples/cries/revavroom.wav new file mode 100644 index 000000000000..a9457ee01857 Binary files /dev/null and b/sound/direct_sound_samples/cries/revavroom.wav differ diff --git a/sound/direct_sound_samples/cries/rhydon.aif b/sound/direct_sound_samples/cries/rhydon.aif deleted file mode 100644 index c02623703d4c..000000000000 Binary files a/sound/direct_sound_samples/cries/rhydon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/rhydon.wav b/sound/direct_sound_samples/cries/rhydon.wav new file mode 100644 index 000000000000..e4f024f3126b Binary files /dev/null and b/sound/direct_sound_samples/cries/rhydon.wav differ diff --git a/sound/direct_sound_samples/cries/rhyhorn.aif b/sound/direct_sound_samples/cries/rhyhorn.aif deleted file mode 100644 index 9a80e08f0163..000000000000 Binary files a/sound/direct_sound_samples/cries/rhyhorn.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/rhyhorn.wav b/sound/direct_sound_samples/cries/rhyhorn.wav new file mode 100644 index 000000000000..10c6841f436b Binary files /dev/null and b/sound/direct_sound_samples/cries/rhyhorn.wav differ diff --git a/sound/direct_sound_samples/cries/rhyperior.aif b/sound/direct_sound_samples/cries/rhyperior.aif deleted file mode 100644 index 210a7c8fd3f2..000000000000 Binary files a/sound/direct_sound_samples/cries/rhyperior.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/rhyperior.wav b/sound/direct_sound_samples/cries/rhyperior.wav new file mode 100644 index 000000000000..57a5002684e2 Binary files /dev/null and b/sound/direct_sound_samples/cries/rhyperior.wav differ diff --git a/sound/direct_sound_samples/cries/ribombee.aif b/sound/direct_sound_samples/cries/ribombee.aif deleted file mode 100644 index fb7dcd1f87ca..000000000000 Binary files a/sound/direct_sound_samples/cries/ribombee.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ribombee.wav b/sound/direct_sound_samples/cries/ribombee.wav new file mode 100644 index 000000000000..36e292cc32ba Binary files /dev/null and b/sound/direct_sound_samples/cries/ribombee.wav differ diff --git a/sound/direct_sound_samples/cries/rillaboom.aif b/sound/direct_sound_samples/cries/rillaboom.aif deleted file mode 100644 index f7e4624e8807..000000000000 Binary files a/sound/direct_sound_samples/cries/rillaboom.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/rillaboom.wav b/sound/direct_sound_samples/cries/rillaboom.wav new file mode 100644 index 000000000000..2757ed87cb1c Binary files /dev/null and b/sound/direct_sound_samples/cries/rillaboom.wav differ diff --git a/sound/direct_sound_samples/cries/riolu.aif b/sound/direct_sound_samples/cries/riolu.aif deleted file mode 100644 index cd25b09faf4f..000000000000 Binary files a/sound/direct_sound_samples/cries/riolu.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/riolu.wav b/sound/direct_sound_samples/cries/riolu.wav new file mode 100644 index 000000000000..051e7e2acf90 Binary files /dev/null and b/sound/direct_sound_samples/cries/riolu.wav differ diff --git a/sound/direct_sound_samples/cries/roaring_moon.aif b/sound/direct_sound_samples/cries/roaring_moon.aif deleted file mode 100644 index 3c258496dce1..000000000000 Binary files a/sound/direct_sound_samples/cries/roaring_moon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/roaring_moon.wav b/sound/direct_sound_samples/cries/roaring_moon.wav new file mode 100644 index 000000000000..72ed1c91391d Binary files /dev/null and b/sound/direct_sound_samples/cries/roaring_moon.wav differ diff --git a/sound/direct_sound_samples/cries/rockruff.aif b/sound/direct_sound_samples/cries/rockruff.aif deleted file mode 100644 index 90f6bed36b2d..000000000000 Binary files a/sound/direct_sound_samples/cries/rockruff.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/rockruff.wav b/sound/direct_sound_samples/cries/rockruff.wav new file mode 100644 index 000000000000..520eaf194fcc Binary files /dev/null and b/sound/direct_sound_samples/cries/rockruff.wav differ diff --git a/sound/direct_sound_samples/cries/roggenrola.aif b/sound/direct_sound_samples/cries/roggenrola.aif deleted file mode 100644 index 8f2f7c8fa0d3..000000000000 Binary files a/sound/direct_sound_samples/cries/roggenrola.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/roggenrola.wav b/sound/direct_sound_samples/cries/roggenrola.wav new file mode 100644 index 000000000000..34e9fe2f4a19 Binary files /dev/null and b/sound/direct_sound_samples/cries/roggenrola.wav differ diff --git a/sound/direct_sound_samples/cries/rolycoly.aif b/sound/direct_sound_samples/cries/rolycoly.aif deleted file mode 100644 index cf6a7cefa65e..000000000000 Binary files a/sound/direct_sound_samples/cries/rolycoly.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/rolycoly.wav b/sound/direct_sound_samples/cries/rolycoly.wav new file mode 100644 index 000000000000..bae65dde29e6 Binary files /dev/null and b/sound/direct_sound_samples/cries/rolycoly.wav differ diff --git a/sound/direct_sound_samples/cries/rookidee.aif b/sound/direct_sound_samples/cries/rookidee.aif deleted file mode 100644 index 6fba48730a5a..000000000000 Binary files a/sound/direct_sound_samples/cries/rookidee.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/rookidee.wav b/sound/direct_sound_samples/cries/rookidee.wav new file mode 100644 index 000000000000..42217ed7eb3f Binary files /dev/null and b/sound/direct_sound_samples/cries/rookidee.wav differ diff --git a/sound/direct_sound_samples/cries/roselia.aif b/sound/direct_sound_samples/cries/roselia.aif deleted file mode 100644 index c6c53f3c1f8d..000000000000 Binary files a/sound/direct_sound_samples/cries/roselia.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/roselia.wav b/sound/direct_sound_samples/cries/roselia.wav new file mode 100644 index 000000000000..cd01f19f685e Binary files /dev/null and b/sound/direct_sound_samples/cries/roselia.wav differ diff --git a/sound/direct_sound_samples/cries/roserade.aif b/sound/direct_sound_samples/cries/roserade.aif deleted file mode 100644 index 7c9de96a0e1c..000000000000 Binary files a/sound/direct_sound_samples/cries/roserade.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/roserade.wav b/sound/direct_sound_samples/cries/roserade.wav new file mode 100644 index 000000000000..25faa520919a Binary files /dev/null and b/sound/direct_sound_samples/cries/roserade.wav differ diff --git a/sound/direct_sound_samples/cries/rotom.aif b/sound/direct_sound_samples/cries/rotom.aif deleted file mode 100644 index 81080115c2ee..000000000000 Binary files a/sound/direct_sound_samples/cries/rotom.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/rotom.wav b/sound/direct_sound_samples/cries/rotom.wav new file mode 100644 index 000000000000..621aeeae9944 Binary files /dev/null and b/sound/direct_sound_samples/cries/rotom.wav differ diff --git a/sound/direct_sound_samples/cries/rowlet.aif b/sound/direct_sound_samples/cries/rowlet.aif deleted file mode 100644 index c201336015f3..000000000000 Binary files a/sound/direct_sound_samples/cries/rowlet.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/rowlet.wav b/sound/direct_sound_samples/cries/rowlet.wav new file mode 100644 index 000000000000..82b82415ce75 Binary files /dev/null and b/sound/direct_sound_samples/cries/rowlet.wav differ diff --git a/sound/direct_sound_samples/cries/rufflet.aif b/sound/direct_sound_samples/cries/rufflet.aif deleted file mode 100644 index b7cc6cab12eb..000000000000 Binary files a/sound/direct_sound_samples/cries/rufflet.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/rufflet.wav b/sound/direct_sound_samples/cries/rufflet.wav new file mode 100644 index 000000000000..5b113009839f Binary files /dev/null and b/sound/direct_sound_samples/cries/rufflet.wav differ diff --git a/sound/direct_sound_samples/cries/runerigus.aif b/sound/direct_sound_samples/cries/runerigus.aif deleted file mode 100644 index c04d5003c4a8..000000000000 Binary files a/sound/direct_sound_samples/cries/runerigus.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/runerigus.wav b/sound/direct_sound_samples/cries/runerigus.wav new file mode 100644 index 000000000000..405d3d46446d Binary files /dev/null and b/sound/direct_sound_samples/cries/runerigus.wav differ diff --git a/sound/direct_sound_samples/cries/sableye.aif b/sound/direct_sound_samples/cries/sableye.aif deleted file mode 100644 index 885a3b0b35c3..000000000000 Binary files a/sound/direct_sound_samples/cries/sableye.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sableye.wav b/sound/direct_sound_samples/cries/sableye.wav new file mode 100644 index 000000000000..9f32fbdd60d3 Binary files /dev/null and b/sound/direct_sound_samples/cries/sableye.wav differ diff --git a/sound/direct_sound_samples/cries/sableye_mega.aif b/sound/direct_sound_samples/cries/sableye_mega.aif deleted file mode 100644 index 7f869cd7b813..000000000000 Binary files a/sound/direct_sound_samples/cries/sableye_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sableye_mega.wav b/sound/direct_sound_samples/cries/sableye_mega.wav new file mode 100644 index 000000000000..6a5bb8f9bf5a Binary files /dev/null and b/sound/direct_sound_samples/cries/sableye_mega.wav differ diff --git a/sound/direct_sound_samples/cries/salamence.aif b/sound/direct_sound_samples/cries/salamence.aif deleted file mode 100644 index f733e098dd9a..000000000000 Binary files a/sound/direct_sound_samples/cries/salamence.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/salamence.wav b/sound/direct_sound_samples/cries/salamence.wav new file mode 100644 index 000000000000..1c426adfad51 Binary files /dev/null and b/sound/direct_sound_samples/cries/salamence.wav differ diff --git a/sound/direct_sound_samples/cries/salamence_mega.aif b/sound/direct_sound_samples/cries/salamence_mega.aif deleted file mode 100644 index 90ce0b6ff8a9..000000000000 Binary files a/sound/direct_sound_samples/cries/salamence_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/salamence_mega.wav b/sound/direct_sound_samples/cries/salamence_mega.wav new file mode 100644 index 000000000000..dc0b96bc5e15 Binary files /dev/null and b/sound/direct_sound_samples/cries/salamence_mega.wav differ diff --git a/sound/direct_sound_samples/cries/salandit.aif b/sound/direct_sound_samples/cries/salandit.aif deleted file mode 100644 index 90de8f0573a5..000000000000 Binary files a/sound/direct_sound_samples/cries/salandit.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/salandit.wav b/sound/direct_sound_samples/cries/salandit.wav new file mode 100644 index 000000000000..631129c5534a Binary files /dev/null and b/sound/direct_sound_samples/cries/salandit.wav differ diff --git a/sound/direct_sound_samples/cries/salazzle.aif b/sound/direct_sound_samples/cries/salazzle.aif deleted file mode 100644 index 7447bfc0bf15..000000000000 Binary files a/sound/direct_sound_samples/cries/salazzle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/salazzle.wav b/sound/direct_sound_samples/cries/salazzle.wav new file mode 100644 index 000000000000..0fbb0268f617 Binary files /dev/null and b/sound/direct_sound_samples/cries/salazzle.wav differ diff --git a/sound/direct_sound_samples/cries/samurott.aif b/sound/direct_sound_samples/cries/samurott.aif deleted file mode 100644 index fc8aa1c7c8cf..000000000000 Binary files a/sound/direct_sound_samples/cries/samurott.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/samurott.wav b/sound/direct_sound_samples/cries/samurott.wav new file mode 100644 index 000000000000..e8c54366faf1 Binary files /dev/null and b/sound/direct_sound_samples/cries/samurott.wav differ diff --git a/sound/direct_sound_samples/cries/sandaconda.aif b/sound/direct_sound_samples/cries/sandaconda.aif deleted file mode 100644 index 3fd1b08d960d..000000000000 Binary files a/sound/direct_sound_samples/cries/sandaconda.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sandaconda.wav b/sound/direct_sound_samples/cries/sandaconda.wav new file mode 100644 index 000000000000..24d92b705a0a Binary files /dev/null and b/sound/direct_sound_samples/cries/sandaconda.wav differ diff --git a/sound/direct_sound_samples/cries/sandile.aif b/sound/direct_sound_samples/cries/sandile.aif deleted file mode 100644 index 316b66aec954..000000000000 Binary files a/sound/direct_sound_samples/cries/sandile.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sandile.wav b/sound/direct_sound_samples/cries/sandile.wav new file mode 100644 index 000000000000..e57af83a74a3 Binary files /dev/null and b/sound/direct_sound_samples/cries/sandile.wav differ diff --git a/sound/direct_sound_samples/cries/sandshrew.aif b/sound/direct_sound_samples/cries/sandshrew.aif deleted file mode 100644 index 02dd3c11822a..000000000000 Binary files a/sound/direct_sound_samples/cries/sandshrew.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sandshrew.wav b/sound/direct_sound_samples/cries/sandshrew.wav new file mode 100644 index 000000000000..8c324ed3d660 Binary files /dev/null and b/sound/direct_sound_samples/cries/sandshrew.wav differ diff --git a/sound/direct_sound_samples/cries/sandslash.aif b/sound/direct_sound_samples/cries/sandslash.aif deleted file mode 100644 index 59304e2dfea9..000000000000 Binary files a/sound/direct_sound_samples/cries/sandslash.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sandslash.wav b/sound/direct_sound_samples/cries/sandslash.wav new file mode 100644 index 000000000000..95bcdb8698f5 Binary files /dev/null and b/sound/direct_sound_samples/cries/sandslash.wav differ diff --git a/sound/direct_sound_samples/cries/sandy_shocks.aif b/sound/direct_sound_samples/cries/sandy_shocks.aif deleted file mode 100644 index d26cfc8817cc..000000000000 Binary files a/sound/direct_sound_samples/cries/sandy_shocks.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sandy_shocks.wav b/sound/direct_sound_samples/cries/sandy_shocks.wav new file mode 100644 index 000000000000..694ffe888f3e Binary files /dev/null and b/sound/direct_sound_samples/cries/sandy_shocks.wav differ diff --git a/sound/direct_sound_samples/cries/sandygast.aif b/sound/direct_sound_samples/cries/sandygast.aif deleted file mode 100644 index b99472bbaf34..000000000000 Binary files a/sound/direct_sound_samples/cries/sandygast.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sandygast.wav b/sound/direct_sound_samples/cries/sandygast.wav new file mode 100644 index 000000000000..88997b8ed5f9 Binary files /dev/null and b/sound/direct_sound_samples/cries/sandygast.wav differ diff --git a/sound/direct_sound_samples/cries/sawk.aif b/sound/direct_sound_samples/cries/sawk.aif deleted file mode 100644 index c040994edcde..000000000000 Binary files a/sound/direct_sound_samples/cries/sawk.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sawk.wav b/sound/direct_sound_samples/cries/sawk.wav new file mode 100644 index 000000000000..b8ea99944406 Binary files /dev/null and b/sound/direct_sound_samples/cries/sawk.wav differ diff --git a/sound/direct_sound_samples/cries/sawsbuck.aif b/sound/direct_sound_samples/cries/sawsbuck.aif deleted file mode 100644 index 9dcc4f927c8f..000000000000 Binary files a/sound/direct_sound_samples/cries/sawsbuck.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sawsbuck.wav b/sound/direct_sound_samples/cries/sawsbuck.wav new file mode 100644 index 000000000000..562bc74a4f03 Binary files /dev/null and b/sound/direct_sound_samples/cries/sawsbuck.wav differ diff --git a/sound/direct_sound_samples/cries/scatterbug.aif b/sound/direct_sound_samples/cries/scatterbug.aif deleted file mode 100644 index c553fb4771ab..000000000000 Binary files a/sound/direct_sound_samples/cries/scatterbug.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/scatterbug.wav b/sound/direct_sound_samples/cries/scatterbug.wav new file mode 100644 index 000000000000..8afef83e923d Binary files /dev/null and b/sound/direct_sound_samples/cries/scatterbug.wav differ diff --git a/sound/direct_sound_samples/cries/sceptile.aif b/sound/direct_sound_samples/cries/sceptile.aif deleted file mode 100644 index c460e445d513..000000000000 Binary files a/sound/direct_sound_samples/cries/sceptile.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sceptile.wav b/sound/direct_sound_samples/cries/sceptile.wav new file mode 100644 index 000000000000..32673bc77360 Binary files /dev/null and b/sound/direct_sound_samples/cries/sceptile.wav differ diff --git a/sound/direct_sound_samples/cries/sceptile_mega.aif b/sound/direct_sound_samples/cries/sceptile_mega.aif deleted file mode 100644 index 50a16a1ee3f4..000000000000 Binary files a/sound/direct_sound_samples/cries/sceptile_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sceptile_mega.wav b/sound/direct_sound_samples/cries/sceptile_mega.wav new file mode 100644 index 000000000000..228b21d4ed7a Binary files /dev/null and b/sound/direct_sound_samples/cries/sceptile_mega.wav differ diff --git a/sound/direct_sound_samples/cries/scizor.aif b/sound/direct_sound_samples/cries/scizor.aif deleted file mode 100644 index eb423f61ddc1..000000000000 Binary files a/sound/direct_sound_samples/cries/scizor.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/scizor.wav b/sound/direct_sound_samples/cries/scizor.wav new file mode 100644 index 000000000000..8196df16b2e1 Binary files /dev/null and b/sound/direct_sound_samples/cries/scizor.wav differ diff --git a/sound/direct_sound_samples/cries/scizor_mega.aif b/sound/direct_sound_samples/cries/scizor_mega.aif deleted file mode 100644 index c970f8083bb5..000000000000 Binary files a/sound/direct_sound_samples/cries/scizor_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/scizor_mega.wav b/sound/direct_sound_samples/cries/scizor_mega.wav new file mode 100644 index 000000000000..010cb05e6669 Binary files /dev/null and b/sound/direct_sound_samples/cries/scizor_mega.wav differ diff --git a/sound/direct_sound_samples/cries/scolipede.aif b/sound/direct_sound_samples/cries/scolipede.aif deleted file mode 100644 index 0372641b70b6..000000000000 Binary files a/sound/direct_sound_samples/cries/scolipede.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/scolipede.wav b/sound/direct_sound_samples/cries/scolipede.wav new file mode 100644 index 000000000000..1b493ce18d45 Binary files /dev/null and b/sound/direct_sound_samples/cries/scolipede.wav differ diff --git a/sound/direct_sound_samples/cries/scorbunny.aif b/sound/direct_sound_samples/cries/scorbunny.aif deleted file mode 100644 index c0963bbc1cca..000000000000 Binary files a/sound/direct_sound_samples/cries/scorbunny.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/scorbunny.wav b/sound/direct_sound_samples/cries/scorbunny.wav new file mode 100644 index 000000000000..dd9e54c72250 Binary files /dev/null and b/sound/direct_sound_samples/cries/scorbunny.wav differ diff --git a/sound/direct_sound_samples/cries/scovillain.aif b/sound/direct_sound_samples/cries/scovillain.aif deleted file mode 100644 index d84cb24087a5..000000000000 Binary files a/sound/direct_sound_samples/cries/scovillain.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/scovillain.wav b/sound/direct_sound_samples/cries/scovillain.wav new file mode 100644 index 000000000000..a7d8f058e874 Binary files /dev/null and b/sound/direct_sound_samples/cries/scovillain.wav differ diff --git a/sound/direct_sound_samples/cries/scrafty.aif b/sound/direct_sound_samples/cries/scrafty.aif deleted file mode 100644 index bc351aa3de3d..000000000000 Binary files a/sound/direct_sound_samples/cries/scrafty.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/scrafty.wav b/sound/direct_sound_samples/cries/scrafty.wav new file mode 100644 index 000000000000..e64613dfb891 Binary files /dev/null and b/sound/direct_sound_samples/cries/scrafty.wav differ diff --git a/sound/direct_sound_samples/cries/scraggy.aif b/sound/direct_sound_samples/cries/scraggy.aif deleted file mode 100644 index bd836ebc465d..000000000000 Binary files a/sound/direct_sound_samples/cries/scraggy.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/scraggy.wav b/sound/direct_sound_samples/cries/scraggy.wav new file mode 100644 index 000000000000..e5c014a43248 Binary files /dev/null and b/sound/direct_sound_samples/cries/scraggy.wav differ diff --git a/sound/direct_sound_samples/cries/scream_tail.aif b/sound/direct_sound_samples/cries/scream_tail.aif deleted file mode 100644 index a64bbdb05191..000000000000 Binary files a/sound/direct_sound_samples/cries/scream_tail.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/scream_tail.wav b/sound/direct_sound_samples/cries/scream_tail.wav new file mode 100644 index 000000000000..c7f133809d61 Binary files /dev/null and b/sound/direct_sound_samples/cries/scream_tail.wav differ diff --git a/sound/direct_sound_samples/cries/scyther.aif b/sound/direct_sound_samples/cries/scyther.aif deleted file mode 100644 index 88bc85cdbbaf..000000000000 Binary files a/sound/direct_sound_samples/cries/scyther.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/scyther.wav b/sound/direct_sound_samples/cries/scyther.wav new file mode 100644 index 000000000000..5b6ba415a17f Binary files /dev/null and b/sound/direct_sound_samples/cries/scyther.wav differ diff --git a/sound/direct_sound_samples/cries/seadra.aif b/sound/direct_sound_samples/cries/seadra.aif deleted file mode 100644 index 19852ad2312f..000000000000 Binary files a/sound/direct_sound_samples/cries/seadra.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/seadra.wav b/sound/direct_sound_samples/cries/seadra.wav new file mode 100644 index 000000000000..c68a68a19607 Binary files /dev/null and b/sound/direct_sound_samples/cries/seadra.wav differ diff --git a/sound/direct_sound_samples/cries/seaking.aif b/sound/direct_sound_samples/cries/seaking.aif deleted file mode 100644 index f572ce5dd421..000000000000 Binary files a/sound/direct_sound_samples/cries/seaking.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/seaking.wav b/sound/direct_sound_samples/cries/seaking.wav new file mode 100644 index 000000000000..6f2533e9463d Binary files /dev/null and b/sound/direct_sound_samples/cries/seaking.wav differ diff --git a/sound/direct_sound_samples/cries/sealeo.aif b/sound/direct_sound_samples/cries/sealeo.aif deleted file mode 100644 index 9a0aedda624e..000000000000 Binary files a/sound/direct_sound_samples/cries/sealeo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sealeo.wav b/sound/direct_sound_samples/cries/sealeo.wav new file mode 100644 index 000000000000..ad01a5fed30c Binary files /dev/null and b/sound/direct_sound_samples/cries/sealeo.wav differ diff --git a/sound/direct_sound_samples/cries/seedot.aif b/sound/direct_sound_samples/cries/seedot.aif deleted file mode 100644 index eac082184f33..000000000000 Binary files a/sound/direct_sound_samples/cries/seedot.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/seedot.wav b/sound/direct_sound_samples/cries/seedot.wav new file mode 100644 index 000000000000..b4d74f65d618 Binary files /dev/null and b/sound/direct_sound_samples/cries/seedot.wav differ diff --git a/sound/direct_sound_samples/cries/seel.aif b/sound/direct_sound_samples/cries/seel.aif deleted file mode 100644 index 1cc31998f2df..000000000000 Binary files a/sound/direct_sound_samples/cries/seel.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/seel.wav b/sound/direct_sound_samples/cries/seel.wav new file mode 100644 index 000000000000..6e252b375a29 Binary files /dev/null and b/sound/direct_sound_samples/cries/seel.wav differ diff --git a/sound/direct_sound_samples/cries/seismitoad.aif b/sound/direct_sound_samples/cries/seismitoad.aif deleted file mode 100644 index 521f9b741b9b..000000000000 Binary files a/sound/direct_sound_samples/cries/seismitoad.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/seismitoad.wav b/sound/direct_sound_samples/cries/seismitoad.wav new file mode 100644 index 000000000000..ad833ea8e0e9 Binary files /dev/null and b/sound/direct_sound_samples/cries/seismitoad.wav differ diff --git a/sound/direct_sound_samples/cries/sentret.aif b/sound/direct_sound_samples/cries/sentret.aif deleted file mode 100644 index ffbce9c7c57d..000000000000 Binary files a/sound/direct_sound_samples/cries/sentret.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sentret.wav b/sound/direct_sound_samples/cries/sentret.wav new file mode 100644 index 000000000000..0c6746c4566d Binary files /dev/null and b/sound/direct_sound_samples/cries/sentret.wav differ diff --git a/sound/direct_sound_samples/cries/serperior.aif b/sound/direct_sound_samples/cries/serperior.aif deleted file mode 100644 index 9a2eb0baadca..000000000000 Binary files a/sound/direct_sound_samples/cries/serperior.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/serperior.wav b/sound/direct_sound_samples/cries/serperior.wav new file mode 100644 index 000000000000..427443c56fdb Binary files /dev/null and b/sound/direct_sound_samples/cries/serperior.wav differ diff --git a/sound/direct_sound_samples/cries/servine.aif b/sound/direct_sound_samples/cries/servine.aif deleted file mode 100644 index 7098f526d9f9..000000000000 Binary files a/sound/direct_sound_samples/cries/servine.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/servine.wav b/sound/direct_sound_samples/cries/servine.wav new file mode 100644 index 000000000000..61da20ea83fb Binary files /dev/null and b/sound/direct_sound_samples/cries/servine.wav differ diff --git a/sound/direct_sound_samples/cries/seviper.aif b/sound/direct_sound_samples/cries/seviper.aif deleted file mode 100644 index 5e3968db6d2a..000000000000 Binary files a/sound/direct_sound_samples/cries/seviper.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/seviper.wav b/sound/direct_sound_samples/cries/seviper.wav new file mode 100644 index 000000000000..b467378f4ce2 Binary files /dev/null and b/sound/direct_sound_samples/cries/seviper.wav differ diff --git a/sound/direct_sound_samples/cries/sewaddle.aif b/sound/direct_sound_samples/cries/sewaddle.aif deleted file mode 100644 index 9a3ac1272149..000000000000 Binary files a/sound/direct_sound_samples/cries/sewaddle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sewaddle.wav b/sound/direct_sound_samples/cries/sewaddle.wav new file mode 100644 index 000000000000..9751d50cf120 Binary files /dev/null and b/sound/direct_sound_samples/cries/sewaddle.wav differ diff --git a/sound/direct_sound_samples/cries/sharpedo.aif b/sound/direct_sound_samples/cries/sharpedo.aif deleted file mode 100644 index b68c24bb812a..000000000000 Binary files a/sound/direct_sound_samples/cries/sharpedo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sharpedo.wav b/sound/direct_sound_samples/cries/sharpedo.wav new file mode 100644 index 000000000000..26c52b43c3e9 Binary files /dev/null and b/sound/direct_sound_samples/cries/sharpedo.wav differ diff --git a/sound/direct_sound_samples/cries/sharpedo_mega.aif b/sound/direct_sound_samples/cries/sharpedo_mega.aif deleted file mode 100644 index 3fa5b49e9223..000000000000 Binary files a/sound/direct_sound_samples/cries/sharpedo_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sharpedo_mega.wav b/sound/direct_sound_samples/cries/sharpedo_mega.wav new file mode 100644 index 000000000000..232b0c524126 Binary files /dev/null and b/sound/direct_sound_samples/cries/sharpedo_mega.wav differ diff --git a/sound/direct_sound_samples/cries/shaymin_land.aif b/sound/direct_sound_samples/cries/shaymin_land.aif deleted file mode 100644 index ab0c40f156d0..000000000000 Binary files a/sound/direct_sound_samples/cries/shaymin_land.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/shaymin_land.wav b/sound/direct_sound_samples/cries/shaymin_land.wav new file mode 100644 index 000000000000..9665e3b2ac9f Binary files /dev/null and b/sound/direct_sound_samples/cries/shaymin_land.wav differ diff --git a/sound/direct_sound_samples/cries/shaymin_sky.aif b/sound/direct_sound_samples/cries/shaymin_sky.aif deleted file mode 100644 index ee3dfa8457f4..000000000000 Binary files a/sound/direct_sound_samples/cries/shaymin_sky.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/shaymin_sky.wav b/sound/direct_sound_samples/cries/shaymin_sky.wav new file mode 100644 index 000000000000..54f116f4b5b6 Binary files /dev/null and b/sound/direct_sound_samples/cries/shaymin_sky.wav differ diff --git a/sound/direct_sound_samples/cries/shedinja.aif b/sound/direct_sound_samples/cries/shedinja.aif deleted file mode 100644 index d891bd382c39..000000000000 Binary files a/sound/direct_sound_samples/cries/shedinja.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/shedinja.wav b/sound/direct_sound_samples/cries/shedinja.wav new file mode 100644 index 000000000000..956ae0be9f64 Binary files /dev/null and b/sound/direct_sound_samples/cries/shedinja.wav differ diff --git a/sound/direct_sound_samples/cries/shelgon.aif b/sound/direct_sound_samples/cries/shelgon.aif deleted file mode 100644 index b202dc037625..000000000000 Binary files a/sound/direct_sound_samples/cries/shelgon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/shelgon.wav b/sound/direct_sound_samples/cries/shelgon.wav new file mode 100644 index 000000000000..7648d06f9a0b Binary files /dev/null and b/sound/direct_sound_samples/cries/shelgon.wav differ diff --git a/sound/direct_sound_samples/cries/shellder.aif b/sound/direct_sound_samples/cries/shellder.aif deleted file mode 100644 index 3f2df4a82ca5..000000000000 Binary files a/sound/direct_sound_samples/cries/shellder.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/shellder.wav b/sound/direct_sound_samples/cries/shellder.wav new file mode 100644 index 000000000000..1fe4367d78c5 Binary files /dev/null and b/sound/direct_sound_samples/cries/shellder.wav differ diff --git a/sound/direct_sound_samples/cries/shellos.aif b/sound/direct_sound_samples/cries/shellos.aif deleted file mode 100644 index f59073120229..000000000000 Binary files a/sound/direct_sound_samples/cries/shellos.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/shellos.wav b/sound/direct_sound_samples/cries/shellos.wav new file mode 100644 index 000000000000..99e925434752 Binary files /dev/null and b/sound/direct_sound_samples/cries/shellos.wav differ diff --git a/sound/direct_sound_samples/cries/shelmet.aif b/sound/direct_sound_samples/cries/shelmet.aif deleted file mode 100644 index 472b6658c07e..000000000000 Binary files a/sound/direct_sound_samples/cries/shelmet.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/shelmet.wav b/sound/direct_sound_samples/cries/shelmet.wav new file mode 100644 index 000000000000..3cb2bcecc640 Binary files /dev/null and b/sound/direct_sound_samples/cries/shelmet.wav differ diff --git a/sound/direct_sound_samples/cries/shieldon.aif b/sound/direct_sound_samples/cries/shieldon.aif deleted file mode 100644 index 5ea98bf1748a..000000000000 Binary files a/sound/direct_sound_samples/cries/shieldon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/shieldon.wav b/sound/direct_sound_samples/cries/shieldon.wav new file mode 100644 index 000000000000..dc7c1c5a3bf0 Binary files /dev/null and b/sound/direct_sound_samples/cries/shieldon.wav differ diff --git a/sound/direct_sound_samples/cries/shiftry.aif b/sound/direct_sound_samples/cries/shiftry.aif deleted file mode 100644 index dbc65b749ed5..000000000000 Binary files a/sound/direct_sound_samples/cries/shiftry.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/shiftry.wav b/sound/direct_sound_samples/cries/shiftry.wav new file mode 100644 index 000000000000..533115f4042d Binary files /dev/null and b/sound/direct_sound_samples/cries/shiftry.wav differ diff --git a/sound/direct_sound_samples/cries/shiinotic.aif b/sound/direct_sound_samples/cries/shiinotic.aif deleted file mode 100644 index 972aef0769fe..000000000000 Binary files a/sound/direct_sound_samples/cries/shiinotic.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/shiinotic.wav b/sound/direct_sound_samples/cries/shiinotic.wav new file mode 100644 index 000000000000..32ce94263680 Binary files /dev/null and b/sound/direct_sound_samples/cries/shiinotic.wav differ diff --git a/sound/direct_sound_samples/cries/shinx.aif b/sound/direct_sound_samples/cries/shinx.aif deleted file mode 100644 index 08f7ad8a4caf..000000000000 Binary files a/sound/direct_sound_samples/cries/shinx.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/shinx.wav b/sound/direct_sound_samples/cries/shinx.wav new file mode 100644 index 000000000000..2f62c5d9664f Binary files /dev/null and b/sound/direct_sound_samples/cries/shinx.wav differ diff --git a/sound/direct_sound_samples/cries/shroodle.aif b/sound/direct_sound_samples/cries/shroodle.aif deleted file mode 100644 index b60ef3ade3f8..000000000000 Binary files a/sound/direct_sound_samples/cries/shroodle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/shroodle.wav b/sound/direct_sound_samples/cries/shroodle.wav new file mode 100644 index 000000000000..0166fa68ca85 Binary files /dev/null and b/sound/direct_sound_samples/cries/shroodle.wav differ diff --git a/sound/direct_sound_samples/cries/shroomish.aif b/sound/direct_sound_samples/cries/shroomish.aif deleted file mode 100644 index 9c092ae07231..000000000000 Binary files a/sound/direct_sound_samples/cries/shroomish.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/shroomish.wav b/sound/direct_sound_samples/cries/shroomish.wav new file mode 100644 index 000000000000..07658c880109 Binary files /dev/null and b/sound/direct_sound_samples/cries/shroomish.wav differ diff --git a/sound/direct_sound_samples/cries/shuckle.aif b/sound/direct_sound_samples/cries/shuckle.aif deleted file mode 100644 index a5523506b571..000000000000 Binary files a/sound/direct_sound_samples/cries/shuckle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/shuckle.wav b/sound/direct_sound_samples/cries/shuckle.wav new file mode 100644 index 000000000000..bb196dbfe94a Binary files /dev/null and b/sound/direct_sound_samples/cries/shuckle.wav differ diff --git a/sound/direct_sound_samples/cries/shuppet.aif b/sound/direct_sound_samples/cries/shuppet.aif deleted file mode 100644 index 8f48e8b5fd19..000000000000 Binary files a/sound/direct_sound_samples/cries/shuppet.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/shuppet.wav b/sound/direct_sound_samples/cries/shuppet.wav new file mode 100644 index 000000000000..6b043a2772b4 Binary files /dev/null and b/sound/direct_sound_samples/cries/shuppet.wav differ diff --git a/sound/direct_sound_samples/cries/sigilyph.aif b/sound/direct_sound_samples/cries/sigilyph.aif deleted file mode 100644 index cf84e7dcf9eb..000000000000 Binary files a/sound/direct_sound_samples/cries/sigilyph.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sigilyph.wav b/sound/direct_sound_samples/cries/sigilyph.wav new file mode 100644 index 000000000000..5d43af49f5b8 Binary files /dev/null and b/sound/direct_sound_samples/cries/sigilyph.wav differ diff --git a/sound/direct_sound_samples/cries/silcoon.aif b/sound/direct_sound_samples/cries/silcoon.aif deleted file mode 100644 index 89cd186676b6..000000000000 Binary files a/sound/direct_sound_samples/cries/silcoon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/silcoon.wav b/sound/direct_sound_samples/cries/silcoon.wav new file mode 100644 index 000000000000..15827329e484 Binary files /dev/null and b/sound/direct_sound_samples/cries/silcoon.wav differ diff --git a/sound/direct_sound_samples/cries/silicobra.aif b/sound/direct_sound_samples/cries/silicobra.aif deleted file mode 100644 index 3b9f5e13fcb8..000000000000 Binary files a/sound/direct_sound_samples/cries/silicobra.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/silicobra.wav b/sound/direct_sound_samples/cries/silicobra.wav new file mode 100644 index 000000000000..92392561ef63 Binary files /dev/null and b/sound/direct_sound_samples/cries/silicobra.wav differ diff --git a/sound/direct_sound_samples/cries/silvally.aif b/sound/direct_sound_samples/cries/silvally.aif deleted file mode 100644 index 48856c7d1647..000000000000 Binary files a/sound/direct_sound_samples/cries/silvally.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/silvally.wav b/sound/direct_sound_samples/cries/silvally.wav new file mode 100644 index 000000000000..833dbb928646 Binary files /dev/null and b/sound/direct_sound_samples/cries/silvally.wav differ diff --git a/sound/direct_sound_samples/cries/simipour.aif b/sound/direct_sound_samples/cries/simipour.aif deleted file mode 100644 index 91e891b63fbf..000000000000 Binary files a/sound/direct_sound_samples/cries/simipour.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/simipour.wav b/sound/direct_sound_samples/cries/simipour.wav new file mode 100644 index 000000000000..f5507327b097 Binary files /dev/null and b/sound/direct_sound_samples/cries/simipour.wav differ diff --git a/sound/direct_sound_samples/cries/simisage.aif b/sound/direct_sound_samples/cries/simisage.aif deleted file mode 100644 index 944f5ff83101..000000000000 Binary files a/sound/direct_sound_samples/cries/simisage.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/simisage.wav b/sound/direct_sound_samples/cries/simisage.wav new file mode 100644 index 000000000000..91bcf71d9d43 Binary files /dev/null and b/sound/direct_sound_samples/cries/simisage.wav differ diff --git a/sound/direct_sound_samples/cries/simisear.aif b/sound/direct_sound_samples/cries/simisear.aif deleted file mode 100644 index e3e8eb860aa8..000000000000 Binary files a/sound/direct_sound_samples/cries/simisear.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/simisear.wav b/sound/direct_sound_samples/cries/simisear.wav new file mode 100644 index 000000000000..737b37ba78df Binary files /dev/null and b/sound/direct_sound_samples/cries/simisear.wav differ diff --git a/sound/direct_sound_samples/cries/sinistcha.aif b/sound/direct_sound_samples/cries/sinistcha.aif deleted file mode 100644 index e9a619c3f034..000000000000 Binary files a/sound/direct_sound_samples/cries/sinistcha.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sinistcha.wav b/sound/direct_sound_samples/cries/sinistcha.wav new file mode 100644 index 000000000000..f3cb98dd7b58 Binary files /dev/null and b/sound/direct_sound_samples/cries/sinistcha.wav differ diff --git a/sound/direct_sound_samples/cries/sinistea.aif b/sound/direct_sound_samples/cries/sinistea.aif deleted file mode 100644 index 912a0800f985..000000000000 Binary files a/sound/direct_sound_samples/cries/sinistea.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sinistea.wav b/sound/direct_sound_samples/cries/sinistea.wav new file mode 100644 index 000000000000..b91d77cae27d Binary files /dev/null and b/sound/direct_sound_samples/cries/sinistea.wav differ diff --git a/sound/direct_sound_samples/cries/sirfetchd.aif b/sound/direct_sound_samples/cries/sirfetchd.aif deleted file mode 100644 index a5ca065a7502..000000000000 Binary files a/sound/direct_sound_samples/cries/sirfetchd.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sirfetchd.wav b/sound/direct_sound_samples/cries/sirfetchd.wav new file mode 100644 index 000000000000..cfa590d2cae2 Binary files /dev/null and b/sound/direct_sound_samples/cries/sirfetchd.wav differ diff --git a/sound/direct_sound_samples/cries/sizzlipede.aif b/sound/direct_sound_samples/cries/sizzlipede.aif deleted file mode 100644 index 99aade0666df..000000000000 Binary files a/sound/direct_sound_samples/cries/sizzlipede.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sizzlipede.wav b/sound/direct_sound_samples/cries/sizzlipede.wav new file mode 100644 index 000000000000..d2ee4859fc2c Binary files /dev/null and b/sound/direct_sound_samples/cries/sizzlipede.wav differ diff --git a/sound/direct_sound_samples/cries/skarmory.aif b/sound/direct_sound_samples/cries/skarmory.aif deleted file mode 100644 index 56414862344a..000000000000 Binary files a/sound/direct_sound_samples/cries/skarmory.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/skarmory.wav b/sound/direct_sound_samples/cries/skarmory.wav new file mode 100644 index 000000000000..29249730232a Binary files /dev/null and b/sound/direct_sound_samples/cries/skarmory.wav differ diff --git a/sound/direct_sound_samples/cries/skeledirge.aif b/sound/direct_sound_samples/cries/skeledirge.aif deleted file mode 100644 index 720e102019db..000000000000 Binary files a/sound/direct_sound_samples/cries/skeledirge.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/skeledirge.wav b/sound/direct_sound_samples/cries/skeledirge.wav new file mode 100644 index 000000000000..284cd7f5fd8c Binary files /dev/null and b/sound/direct_sound_samples/cries/skeledirge.wav differ diff --git a/sound/direct_sound_samples/cries/skiddo.aif b/sound/direct_sound_samples/cries/skiddo.aif deleted file mode 100644 index 5b2dc104f73c..000000000000 Binary files a/sound/direct_sound_samples/cries/skiddo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/skiddo.wav b/sound/direct_sound_samples/cries/skiddo.wav new file mode 100644 index 000000000000..ce3e1e35ef28 Binary files /dev/null and b/sound/direct_sound_samples/cries/skiddo.wav differ diff --git a/sound/direct_sound_samples/cries/skiploom.aif b/sound/direct_sound_samples/cries/skiploom.aif deleted file mode 100644 index 4517e39c7a70..000000000000 Binary files a/sound/direct_sound_samples/cries/skiploom.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/skiploom.wav b/sound/direct_sound_samples/cries/skiploom.wav new file mode 100644 index 000000000000..30f9c266620a Binary files /dev/null and b/sound/direct_sound_samples/cries/skiploom.wav differ diff --git a/sound/direct_sound_samples/cries/skitty.aif b/sound/direct_sound_samples/cries/skitty.aif deleted file mode 100644 index 0f903b53779e..000000000000 Binary files a/sound/direct_sound_samples/cries/skitty.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/skitty.wav b/sound/direct_sound_samples/cries/skitty.wav new file mode 100644 index 000000000000..02aaa4fcbd23 Binary files /dev/null and b/sound/direct_sound_samples/cries/skitty.wav differ diff --git a/sound/direct_sound_samples/cries/skorupi.aif b/sound/direct_sound_samples/cries/skorupi.aif deleted file mode 100644 index a638cb464532..000000000000 Binary files a/sound/direct_sound_samples/cries/skorupi.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/skorupi.wav b/sound/direct_sound_samples/cries/skorupi.wav new file mode 100644 index 000000000000..ae1317e26403 Binary files /dev/null and b/sound/direct_sound_samples/cries/skorupi.wav differ diff --git a/sound/direct_sound_samples/cries/skrelp.aif b/sound/direct_sound_samples/cries/skrelp.aif deleted file mode 100644 index 12bb27c043b2..000000000000 Binary files a/sound/direct_sound_samples/cries/skrelp.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/skrelp.wav b/sound/direct_sound_samples/cries/skrelp.wav new file mode 100644 index 000000000000..4bbecd7a6295 Binary files /dev/null and b/sound/direct_sound_samples/cries/skrelp.wav differ diff --git a/sound/direct_sound_samples/cries/skuntank.aif b/sound/direct_sound_samples/cries/skuntank.aif deleted file mode 100644 index 354f2af92ca0..000000000000 Binary files a/sound/direct_sound_samples/cries/skuntank.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/skuntank.wav b/sound/direct_sound_samples/cries/skuntank.wav new file mode 100644 index 000000000000..315c8a41cf06 Binary files /dev/null and b/sound/direct_sound_samples/cries/skuntank.wav differ diff --git a/sound/direct_sound_samples/cries/skwovet.aif b/sound/direct_sound_samples/cries/skwovet.aif deleted file mode 100644 index b5a27241d528..000000000000 Binary files a/sound/direct_sound_samples/cries/skwovet.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/skwovet.wav b/sound/direct_sound_samples/cries/skwovet.wav new file mode 100644 index 000000000000..7765154b9125 Binary files /dev/null and b/sound/direct_sound_samples/cries/skwovet.wav differ diff --git a/sound/direct_sound_samples/cries/slaking.aif b/sound/direct_sound_samples/cries/slaking.aif deleted file mode 100644 index d023af76817e..000000000000 Binary files a/sound/direct_sound_samples/cries/slaking.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/slaking.wav b/sound/direct_sound_samples/cries/slaking.wav new file mode 100644 index 000000000000..ef34d94d690b Binary files /dev/null and b/sound/direct_sound_samples/cries/slaking.wav differ diff --git a/sound/direct_sound_samples/cries/slakoth.aif b/sound/direct_sound_samples/cries/slakoth.aif deleted file mode 100644 index 54248b2d8545..000000000000 Binary files a/sound/direct_sound_samples/cries/slakoth.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/slakoth.wav b/sound/direct_sound_samples/cries/slakoth.wav new file mode 100644 index 000000000000..d4588b3a2193 Binary files /dev/null and b/sound/direct_sound_samples/cries/slakoth.wav differ diff --git a/sound/direct_sound_samples/cries/sliggoo.aif b/sound/direct_sound_samples/cries/sliggoo.aif deleted file mode 100644 index ed141e69c576..000000000000 Binary files a/sound/direct_sound_samples/cries/sliggoo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sliggoo.wav b/sound/direct_sound_samples/cries/sliggoo.wav new file mode 100644 index 000000000000..c988d4244a1f Binary files /dev/null and b/sound/direct_sound_samples/cries/sliggoo.wav differ diff --git a/sound/direct_sound_samples/cries/slither_wing.aif b/sound/direct_sound_samples/cries/slither_wing.aif deleted file mode 100644 index 699f74f2f956..000000000000 Binary files a/sound/direct_sound_samples/cries/slither_wing.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/slither_wing.wav b/sound/direct_sound_samples/cries/slither_wing.wav new file mode 100644 index 000000000000..35baf10669da Binary files /dev/null and b/sound/direct_sound_samples/cries/slither_wing.wav differ diff --git a/sound/direct_sound_samples/cries/slowbro.aif b/sound/direct_sound_samples/cries/slowbro.aif deleted file mode 100644 index c3778734e395..000000000000 Binary files a/sound/direct_sound_samples/cries/slowbro.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/slowbro.wav b/sound/direct_sound_samples/cries/slowbro.wav new file mode 100644 index 000000000000..fe03ab4cdd8c Binary files /dev/null and b/sound/direct_sound_samples/cries/slowbro.wav differ diff --git a/sound/direct_sound_samples/cries/slowbro_mega.aif b/sound/direct_sound_samples/cries/slowbro_mega.aif deleted file mode 100644 index 6ae2a0fb6835..000000000000 Binary files a/sound/direct_sound_samples/cries/slowbro_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/slowbro_mega.wav b/sound/direct_sound_samples/cries/slowbro_mega.wav new file mode 100644 index 000000000000..4dee27f96e97 Binary files /dev/null and b/sound/direct_sound_samples/cries/slowbro_mega.wav differ diff --git a/sound/direct_sound_samples/cries/slowking.aif b/sound/direct_sound_samples/cries/slowking.aif deleted file mode 100644 index e135c9e0db95..000000000000 Binary files a/sound/direct_sound_samples/cries/slowking.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/slowking.wav b/sound/direct_sound_samples/cries/slowking.wav new file mode 100644 index 000000000000..f802796282ad Binary files /dev/null and b/sound/direct_sound_samples/cries/slowking.wav differ diff --git a/sound/direct_sound_samples/cries/slowpoke.aif b/sound/direct_sound_samples/cries/slowpoke.aif deleted file mode 100644 index e92ed0c20883..000000000000 Binary files a/sound/direct_sound_samples/cries/slowpoke.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/slowpoke.wav b/sound/direct_sound_samples/cries/slowpoke.wav new file mode 100644 index 000000000000..b3a45bef0a7d Binary files /dev/null and b/sound/direct_sound_samples/cries/slowpoke.wav differ diff --git a/sound/direct_sound_samples/cries/slowpoke_galar.aif b/sound/direct_sound_samples/cries/slowpoke_galar.aif deleted file mode 100644 index 30251a2e8c7b..000000000000 Binary files a/sound/direct_sound_samples/cries/slowpoke_galar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/slowpoke_galar.wav b/sound/direct_sound_samples/cries/slowpoke_galar.wav new file mode 100644 index 000000000000..8e72b6d83e33 Binary files /dev/null and b/sound/direct_sound_samples/cries/slowpoke_galar.wav differ diff --git a/sound/direct_sound_samples/cries/slugma.aif b/sound/direct_sound_samples/cries/slugma.aif deleted file mode 100644 index 3526b7f6e7bd..000000000000 Binary files a/sound/direct_sound_samples/cries/slugma.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/slugma.wav b/sound/direct_sound_samples/cries/slugma.wav new file mode 100644 index 000000000000..389bc8865710 Binary files /dev/null and b/sound/direct_sound_samples/cries/slugma.wav differ diff --git a/sound/direct_sound_samples/cries/slurpuff.aif b/sound/direct_sound_samples/cries/slurpuff.aif deleted file mode 100644 index 93b59e8e3527..000000000000 Binary files a/sound/direct_sound_samples/cries/slurpuff.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/slurpuff.wav b/sound/direct_sound_samples/cries/slurpuff.wav new file mode 100644 index 000000000000..e7f4be98763f Binary files /dev/null and b/sound/direct_sound_samples/cries/slurpuff.wav differ diff --git a/sound/direct_sound_samples/cries/smeargle.aif b/sound/direct_sound_samples/cries/smeargle.aif deleted file mode 100644 index 76cc479ccccb..000000000000 Binary files a/sound/direct_sound_samples/cries/smeargle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/smeargle.wav b/sound/direct_sound_samples/cries/smeargle.wav new file mode 100644 index 000000000000..e206f8f61b15 Binary files /dev/null and b/sound/direct_sound_samples/cries/smeargle.wav differ diff --git a/sound/direct_sound_samples/cries/smoliv.aif b/sound/direct_sound_samples/cries/smoliv.aif deleted file mode 100644 index 44b688aff915..000000000000 Binary files a/sound/direct_sound_samples/cries/smoliv.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/smoliv.wav b/sound/direct_sound_samples/cries/smoliv.wav new file mode 100644 index 000000000000..9662fc1e5213 Binary files /dev/null and b/sound/direct_sound_samples/cries/smoliv.wav differ diff --git a/sound/direct_sound_samples/cries/smoochum.aif b/sound/direct_sound_samples/cries/smoochum.aif deleted file mode 100644 index 812586940cfb..000000000000 Binary files a/sound/direct_sound_samples/cries/smoochum.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/smoochum.wav b/sound/direct_sound_samples/cries/smoochum.wav new file mode 100644 index 000000000000..a4abdde7ec68 Binary files /dev/null and b/sound/direct_sound_samples/cries/smoochum.wav differ diff --git a/sound/direct_sound_samples/cries/sneasel.aif b/sound/direct_sound_samples/cries/sneasel.aif deleted file mode 100644 index e4bf7129c444..000000000000 Binary files a/sound/direct_sound_samples/cries/sneasel.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sneasel.wav b/sound/direct_sound_samples/cries/sneasel.wav new file mode 100644 index 000000000000..da76aefb71f3 Binary files /dev/null and b/sound/direct_sound_samples/cries/sneasel.wav differ diff --git a/sound/direct_sound_samples/cries/sneasler.aif b/sound/direct_sound_samples/cries/sneasler.aif deleted file mode 100644 index b8537fef07cf..000000000000 Binary files a/sound/direct_sound_samples/cries/sneasler.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sneasler.wav b/sound/direct_sound_samples/cries/sneasler.wav new file mode 100644 index 000000000000..4dbc8c5eea1f Binary files /dev/null and b/sound/direct_sound_samples/cries/sneasler.wav differ diff --git a/sound/direct_sound_samples/cries/snivy.aif b/sound/direct_sound_samples/cries/snivy.aif deleted file mode 100644 index cd0335decbd2..000000000000 Binary files a/sound/direct_sound_samples/cries/snivy.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/snivy.wav b/sound/direct_sound_samples/cries/snivy.wav new file mode 100644 index 000000000000..1d9ba8c4a693 Binary files /dev/null and b/sound/direct_sound_samples/cries/snivy.wav differ diff --git a/sound/direct_sound_samples/cries/snom.aif b/sound/direct_sound_samples/cries/snom.aif deleted file mode 100644 index 9591fa1d7d60..000000000000 Binary files a/sound/direct_sound_samples/cries/snom.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/snom.wav b/sound/direct_sound_samples/cries/snom.wav new file mode 100644 index 000000000000..384269745a32 Binary files /dev/null and b/sound/direct_sound_samples/cries/snom.wav differ diff --git a/sound/direct_sound_samples/cries/snorlax.aif b/sound/direct_sound_samples/cries/snorlax.aif deleted file mode 100644 index d65557c79867..000000000000 Binary files a/sound/direct_sound_samples/cries/snorlax.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/snorlax.wav b/sound/direct_sound_samples/cries/snorlax.wav new file mode 100644 index 000000000000..12e717be1744 Binary files /dev/null and b/sound/direct_sound_samples/cries/snorlax.wav differ diff --git a/sound/direct_sound_samples/cries/snorunt.aif b/sound/direct_sound_samples/cries/snorunt.aif deleted file mode 100644 index 21bae9fc67a7..000000000000 Binary files a/sound/direct_sound_samples/cries/snorunt.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/snorunt.wav b/sound/direct_sound_samples/cries/snorunt.wav new file mode 100644 index 000000000000..b4ecc4537fb1 Binary files /dev/null and b/sound/direct_sound_samples/cries/snorunt.wav differ diff --git a/sound/direct_sound_samples/cries/snover.aif b/sound/direct_sound_samples/cries/snover.aif deleted file mode 100644 index d02aceda4cb4..000000000000 Binary files a/sound/direct_sound_samples/cries/snover.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/snover.wav b/sound/direct_sound_samples/cries/snover.wav new file mode 100644 index 000000000000..1ddb86c7bcab Binary files /dev/null and b/sound/direct_sound_samples/cries/snover.wav differ diff --git a/sound/direct_sound_samples/cries/snubbull.aif b/sound/direct_sound_samples/cries/snubbull.aif deleted file mode 100644 index 5e2ca9adb0da..000000000000 Binary files a/sound/direct_sound_samples/cries/snubbull.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/snubbull.wav b/sound/direct_sound_samples/cries/snubbull.wav new file mode 100644 index 000000000000..37cacda8f77a Binary files /dev/null and b/sound/direct_sound_samples/cries/snubbull.wav differ diff --git a/sound/direct_sound_samples/cries/sobble.aif b/sound/direct_sound_samples/cries/sobble.aif deleted file mode 100644 index bdb1d937fa31..000000000000 Binary files a/sound/direct_sound_samples/cries/sobble.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sobble.wav b/sound/direct_sound_samples/cries/sobble.wav new file mode 100644 index 000000000000..6a384d1de25d Binary files /dev/null and b/sound/direct_sound_samples/cries/sobble.wav differ diff --git a/sound/direct_sound_samples/cries/solgaleo.aif b/sound/direct_sound_samples/cries/solgaleo.aif deleted file mode 100644 index 8cb9ad0cb5a3..000000000000 Binary files a/sound/direct_sound_samples/cries/solgaleo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/solgaleo.wav b/sound/direct_sound_samples/cries/solgaleo.wav new file mode 100644 index 000000000000..575978e635bc Binary files /dev/null and b/sound/direct_sound_samples/cries/solgaleo.wav differ diff --git a/sound/direct_sound_samples/cries/solosis.aif b/sound/direct_sound_samples/cries/solosis.aif deleted file mode 100644 index 701424bbd6dc..000000000000 Binary files a/sound/direct_sound_samples/cries/solosis.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/solosis.wav b/sound/direct_sound_samples/cries/solosis.wav new file mode 100644 index 000000000000..edb4b6ba7aff Binary files /dev/null and b/sound/direct_sound_samples/cries/solosis.wav differ diff --git a/sound/direct_sound_samples/cries/solrock.aif b/sound/direct_sound_samples/cries/solrock.aif deleted file mode 100644 index ed58aeecaec6..000000000000 Binary files a/sound/direct_sound_samples/cries/solrock.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/solrock.wav b/sound/direct_sound_samples/cries/solrock.wav new file mode 100644 index 000000000000..12f766af714a Binary files /dev/null and b/sound/direct_sound_samples/cries/solrock.wav differ diff --git a/sound/direct_sound_samples/cries/spearow.aif b/sound/direct_sound_samples/cries/spearow.aif deleted file mode 100644 index 9fb8d0cc8f10..000000000000 Binary files a/sound/direct_sound_samples/cries/spearow.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/spearow.wav b/sound/direct_sound_samples/cries/spearow.wav new file mode 100644 index 000000000000..a64848136810 Binary files /dev/null and b/sound/direct_sound_samples/cries/spearow.wav differ diff --git a/sound/direct_sound_samples/cries/spectrier.aif b/sound/direct_sound_samples/cries/spectrier.aif deleted file mode 100644 index a43dc77a6cde..000000000000 Binary files a/sound/direct_sound_samples/cries/spectrier.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/spectrier.wav b/sound/direct_sound_samples/cries/spectrier.wav new file mode 100644 index 000000000000..dbfbfef08dc3 Binary files /dev/null and b/sound/direct_sound_samples/cries/spectrier.wav differ diff --git a/sound/direct_sound_samples/cries/spewpa.aif b/sound/direct_sound_samples/cries/spewpa.aif deleted file mode 100644 index 34cd82b98983..000000000000 Binary files a/sound/direct_sound_samples/cries/spewpa.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/spewpa.wav b/sound/direct_sound_samples/cries/spewpa.wav new file mode 100644 index 000000000000..f260c20c6421 Binary files /dev/null and b/sound/direct_sound_samples/cries/spewpa.wav differ diff --git a/sound/direct_sound_samples/cries/spheal.aif b/sound/direct_sound_samples/cries/spheal.aif deleted file mode 100644 index 44d21a97390d..000000000000 Binary files a/sound/direct_sound_samples/cries/spheal.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/spheal.wav b/sound/direct_sound_samples/cries/spheal.wav new file mode 100644 index 000000000000..818caf8cd829 Binary files /dev/null and b/sound/direct_sound_samples/cries/spheal.wav differ diff --git a/sound/direct_sound_samples/cries/spidops.aif b/sound/direct_sound_samples/cries/spidops.aif deleted file mode 100644 index 626aa0c3f547..000000000000 Binary files a/sound/direct_sound_samples/cries/spidops.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/spidops.wav b/sound/direct_sound_samples/cries/spidops.wav new file mode 100644 index 000000000000..cfde8c39b305 Binary files /dev/null and b/sound/direct_sound_samples/cries/spidops.wav differ diff --git a/sound/direct_sound_samples/cries/spinarak.aif b/sound/direct_sound_samples/cries/spinarak.aif deleted file mode 100644 index f49c856acacd..000000000000 Binary files a/sound/direct_sound_samples/cries/spinarak.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/spinarak.wav b/sound/direct_sound_samples/cries/spinarak.wav new file mode 100644 index 000000000000..3c45731327d5 Binary files /dev/null and b/sound/direct_sound_samples/cries/spinarak.wav differ diff --git a/sound/direct_sound_samples/cries/spinda.aif b/sound/direct_sound_samples/cries/spinda.aif deleted file mode 100644 index 01914a5d09d3..000000000000 Binary files a/sound/direct_sound_samples/cries/spinda.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/spinda.wav b/sound/direct_sound_samples/cries/spinda.wav new file mode 100644 index 000000000000..4481e3a88717 Binary files /dev/null and b/sound/direct_sound_samples/cries/spinda.wav differ diff --git a/sound/direct_sound_samples/cries/spiritomb.aif b/sound/direct_sound_samples/cries/spiritomb.aif deleted file mode 100644 index 7a504adfb096..000000000000 Binary files a/sound/direct_sound_samples/cries/spiritomb.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/spiritomb.wav b/sound/direct_sound_samples/cries/spiritomb.wav new file mode 100644 index 000000000000..45b657423275 Binary files /dev/null and b/sound/direct_sound_samples/cries/spiritomb.wav differ diff --git a/sound/direct_sound_samples/cries/spoink.aif b/sound/direct_sound_samples/cries/spoink.aif deleted file mode 100644 index 102f53d8f1ff..000000000000 Binary files a/sound/direct_sound_samples/cries/spoink.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/spoink.wav b/sound/direct_sound_samples/cries/spoink.wav new file mode 100644 index 000000000000..36447fb84b33 Binary files /dev/null and b/sound/direct_sound_samples/cries/spoink.wav differ diff --git a/sound/direct_sound_samples/cries/sprigatito.aif b/sound/direct_sound_samples/cries/sprigatito.aif deleted file mode 100644 index 13616f9686e6..000000000000 Binary files a/sound/direct_sound_samples/cries/sprigatito.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sprigatito.wav b/sound/direct_sound_samples/cries/sprigatito.wav new file mode 100644 index 000000000000..822c2d70fcff Binary files /dev/null and b/sound/direct_sound_samples/cries/sprigatito.wav differ diff --git a/sound/direct_sound_samples/cries/spritzee.aif b/sound/direct_sound_samples/cries/spritzee.aif deleted file mode 100644 index 3bf2499d72e1..000000000000 Binary files a/sound/direct_sound_samples/cries/spritzee.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/spritzee.wav b/sound/direct_sound_samples/cries/spritzee.wav new file mode 100644 index 000000000000..18dc72256f4a Binary files /dev/null and b/sound/direct_sound_samples/cries/spritzee.wav differ diff --git a/sound/direct_sound_samples/cries/squawkabilly.aif b/sound/direct_sound_samples/cries/squawkabilly.aif deleted file mode 100644 index 0c88f36f7414..000000000000 Binary files a/sound/direct_sound_samples/cries/squawkabilly.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/squawkabilly.wav b/sound/direct_sound_samples/cries/squawkabilly.wav new file mode 100644 index 000000000000..77d90d6f4dfa Binary files /dev/null and b/sound/direct_sound_samples/cries/squawkabilly.wav differ diff --git a/sound/direct_sound_samples/cries/squirtle.aif b/sound/direct_sound_samples/cries/squirtle.aif deleted file mode 100644 index 8e6cf8644d18..000000000000 Binary files a/sound/direct_sound_samples/cries/squirtle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/squirtle.wav b/sound/direct_sound_samples/cries/squirtle.wav new file mode 100644 index 000000000000..0cf32c6b6ce2 Binary files /dev/null and b/sound/direct_sound_samples/cries/squirtle.wav differ diff --git a/sound/direct_sound_samples/cries/stakataka.aif b/sound/direct_sound_samples/cries/stakataka.aif deleted file mode 100644 index cabe903b43b4..000000000000 Binary files a/sound/direct_sound_samples/cries/stakataka.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/stakataka.wav b/sound/direct_sound_samples/cries/stakataka.wav new file mode 100644 index 000000000000..c5ca06ea5815 Binary files /dev/null and b/sound/direct_sound_samples/cries/stakataka.wav differ diff --git a/sound/direct_sound_samples/cries/stantler.aif b/sound/direct_sound_samples/cries/stantler.aif deleted file mode 100644 index 231466ebea8d..000000000000 Binary files a/sound/direct_sound_samples/cries/stantler.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/stantler.wav b/sound/direct_sound_samples/cries/stantler.wav new file mode 100644 index 000000000000..f59953beb034 Binary files /dev/null and b/sound/direct_sound_samples/cries/stantler.wav differ diff --git a/sound/direct_sound_samples/cries/staraptor.aif b/sound/direct_sound_samples/cries/staraptor.aif deleted file mode 100644 index 05ccd1f0246e..000000000000 Binary files a/sound/direct_sound_samples/cries/staraptor.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/staraptor.wav b/sound/direct_sound_samples/cries/staraptor.wav new file mode 100644 index 000000000000..acbbdc0ece35 Binary files /dev/null and b/sound/direct_sound_samples/cries/staraptor.wav differ diff --git a/sound/direct_sound_samples/cries/staravia.aif b/sound/direct_sound_samples/cries/staravia.aif deleted file mode 100644 index 235d14eaf813..000000000000 Binary files a/sound/direct_sound_samples/cries/staravia.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/staravia.wav b/sound/direct_sound_samples/cries/staravia.wav new file mode 100644 index 000000000000..97d6bfe631a5 Binary files /dev/null and b/sound/direct_sound_samples/cries/staravia.wav differ diff --git a/sound/direct_sound_samples/cries/starly.aif b/sound/direct_sound_samples/cries/starly.aif deleted file mode 100644 index 2b0dd3960af4..000000000000 Binary files a/sound/direct_sound_samples/cries/starly.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/starly.wav b/sound/direct_sound_samples/cries/starly.wav new file mode 100644 index 000000000000..f897be9a811e Binary files /dev/null and b/sound/direct_sound_samples/cries/starly.wav differ diff --git a/sound/direct_sound_samples/cries/starmie.aif b/sound/direct_sound_samples/cries/starmie.aif deleted file mode 100644 index a2daf8680075..000000000000 Binary files a/sound/direct_sound_samples/cries/starmie.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/starmie.wav b/sound/direct_sound_samples/cries/starmie.wav new file mode 100644 index 000000000000..e3ace4fcf2ff Binary files /dev/null and b/sound/direct_sound_samples/cries/starmie.wav differ diff --git a/sound/direct_sound_samples/cries/staryu.aif b/sound/direct_sound_samples/cries/staryu.aif deleted file mode 100644 index cd0cbc6b2b53..000000000000 Binary files a/sound/direct_sound_samples/cries/staryu.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/staryu.wav b/sound/direct_sound_samples/cries/staryu.wav new file mode 100644 index 000000000000..c726206f43b0 Binary files /dev/null and b/sound/direct_sound_samples/cries/staryu.wav differ diff --git a/sound/direct_sound_samples/cries/steelix.aif b/sound/direct_sound_samples/cries/steelix.aif deleted file mode 100644 index 060cd00be473..000000000000 Binary files a/sound/direct_sound_samples/cries/steelix.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/steelix.wav b/sound/direct_sound_samples/cries/steelix.wav new file mode 100644 index 000000000000..8683e3d24282 Binary files /dev/null and b/sound/direct_sound_samples/cries/steelix.wav differ diff --git a/sound/direct_sound_samples/cries/steelix_mega.aif b/sound/direct_sound_samples/cries/steelix_mega.aif deleted file mode 100644 index dfb068e1617f..000000000000 Binary files a/sound/direct_sound_samples/cries/steelix_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/steelix_mega.wav b/sound/direct_sound_samples/cries/steelix_mega.wav new file mode 100644 index 000000000000..1ce3f8a0e3c5 Binary files /dev/null and b/sound/direct_sound_samples/cries/steelix_mega.wav differ diff --git a/sound/direct_sound_samples/cries/steenee.aif b/sound/direct_sound_samples/cries/steenee.aif deleted file mode 100644 index 54b9df83b76d..000000000000 Binary files a/sound/direct_sound_samples/cries/steenee.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/steenee.wav b/sound/direct_sound_samples/cries/steenee.wav new file mode 100644 index 000000000000..c6749208e94e Binary files /dev/null and b/sound/direct_sound_samples/cries/steenee.wav differ diff --git a/sound/direct_sound_samples/cries/stonjourner.aif b/sound/direct_sound_samples/cries/stonjourner.aif deleted file mode 100644 index c1a24f377947..000000000000 Binary files a/sound/direct_sound_samples/cries/stonjourner.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/stonjourner.wav b/sound/direct_sound_samples/cries/stonjourner.wav new file mode 100644 index 000000000000..81064b70cf56 Binary files /dev/null and b/sound/direct_sound_samples/cries/stonjourner.wav differ diff --git a/sound/direct_sound_samples/cries/stoutland.aif b/sound/direct_sound_samples/cries/stoutland.aif deleted file mode 100644 index 5479323d49d8..000000000000 Binary files a/sound/direct_sound_samples/cries/stoutland.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/stoutland.wav b/sound/direct_sound_samples/cries/stoutland.wav new file mode 100644 index 000000000000..f95b522660f8 Binary files /dev/null and b/sound/direct_sound_samples/cries/stoutland.wav differ diff --git a/sound/direct_sound_samples/cries/stufful.aif b/sound/direct_sound_samples/cries/stufful.aif deleted file mode 100644 index abd70624f062..000000000000 Binary files a/sound/direct_sound_samples/cries/stufful.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/stufful.wav b/sound/direct_sound_samples/cries/stufful.wav new file mode 100644 index 000000000000..f03666ef8f12 Binary files /dev/null and b/sound/direct_sound_samples/cries/stufful.wav differ diff --git a/sound/direct_sound_samples/cries/stunfisk.aif b/sound/direct_sound_samples/cries/stunfisk.aif deleted file mode 100644 index 3d7f116cfd33..000000000000 Binary files a/sound/direct_sound_samples/cries/stunfisk.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/stunfisk.wav b/sound/direct_sound_samples/cries/stunfisk.wav new file mode 100644 index 000000000000..68165add7968 Binary files /dev/null and b/sound/direct_sound_samples/cries/stunfisk.wav differ diff --git a/sound/direct_sound_samples/cries/stunky.aif b/sound/direct_sound_samples/cries/stunky.aif deleted file mode 100644 index bb9a34bc6254..000000000000 Binary files a/sound/direct_sound_samples/cries/stunky.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/stunky.wav b/sound/direct_sound_samples/cries/stunky.wav new file mode 100644 index 000000000000..50faa537e649 Binary files /dev/null and b/sound/direct_sound_samples/cries/stunky.wav differ diff --git a/sound/direct_sound_samples/cries/sudowoodo.aif b/sound/direct_sound_samples/cries/sudowoodo.aif deleted file mode 100644 index 64ef66ef0c23..000000000000 Binary files a/sound/direct_sound_samples/cries/sudowoodo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sudowoodo.wav b/sound/direct_sound_samples/cries/sudowoodo.wav new file mode 100644 index 000000000000..48661df94ed9 Binary files /dev/null and b/sound/direct_sound_samples/cries/sudowoodo.wav differ diff --git a/sound/direct_sound_samples/cries/suicune.aif b/sound/direct_sound_samples/cries/suicune.aif deleted file mode 100644 index 10840f92c190..000000000000 Binary files a/sound/direct_sound_samples/cries/suicune.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/suicune.wav b/sound/direct_sound_samples/cries/suicune.wav new file mode 100644 index 000000000000..f675d8fdc4ba Binary files /dev/null and b/sound/direct_sound_samples/cries/suicune.wav differ diff --git a/sound/direct_sound_samples/cries/sunflora.aif b/sound/direct_sound_samples/cries/sunflora.aif deleted file mode 100644 index e64c7ab4e4b7..000000000000 Binary files a/sound/direct_sound_samples/cries/sunflora.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sunflora.wav b/sound/direct_sound_samples/cries/sunflora.wav new file mode 100644 index 000000000000..613422881cc6 Binary files /dev/null and b/sound/direct_sound_samples/cries/sunflora.wav differ diff --git a/sound/direct_sound_samples/cries/sunkern.aif b/sound/direct_sound_samples/cries/sunkern.aif deleted file mode 100644 index ecead99e9919..000000000000 Binary files a/sound/direct_sound_samples/cries/sunkern.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sunkern.wav b/sound/direct_sound_samples/cries/sunkern.wav new file mode 100644 index 000000000000..b183f9ee947c Binary files /dev/null and b/sound/direct_sound_samples/cries/sunkern.wav differ diff --git a/sound/direct_sound_samples/cries/surskit.aif b/sound/direct_sound_samples/cries/surskit.aif deleted file mode 100644 index 445daa612950..000000000000 Binary files a/sound/direct_sound_samples/cries/surskit.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/surskit.wav b/sound/direct_sound_samples/cries/surskit.wav new file mode 100644 index 000000000000..04b1be882d0f Binary files /dev/null and b/sound/direct_sound_samples/cries/surskit.wav differ diff --git a/sound/direct_sound_samples/cries/swablu.aif b/sound/direct_sound_samples/cries/swablu.aif deleted file mode 100644 index 0940910ce3bd..000000000000 Binary files a/sound/direct_sound_samples/cries/swablu.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/swablu.wav b/sound/direct_sound_samples/cries/swablu.wav new file mode 100644 index 000000000000..f24d34930742 Binary files /dev/null and b/sound/direct_sound_samples/cries/swablu.wav differ diff --git a/sound/direct_sound_samples/cries/swadloon.aif b/sound/direct_sound_samples/cries/swadloon.aif deleted file mode 100644 index d2606953b2cb..000000000000 Binary files a/sound/direct_sound_samples/cries/swadloon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/swadloon.wav b/sound/direct_sound_samples/cries/swadloon.wav new file mode 100644 index 000000000000..c2d2ff2eb421 Binary files /dev/null and b/sound/direct_sound_samples/cries/swadloon.wav differ diff --git a/sound/direct_sound_samples/cries/swalot.aif b/sound/direct_sound_samples/cries/swalot.aif deleted file mode 100644 index 87e57c9b70ef..000000000000 Binary files a/sound/direct_sound_samples/cries/swalot.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/swalot.wav b/sound/direct_sound_samples/cries/swalot.wav new file mode 100644 index 000000000000..cfed97934289 Binary files /dev/null and b/sound/direct_sound_samples/cries/swalot.wav differ diff --git a/sound/direct_sound_samples/cries/swampert.aif b/sound/direct_sound_samples/cries/swampert.aif deleted file mode 100644 index 132844c70517..000000000000 Binary files a/sound/direct_sound_samples/cries/swampert.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/swampert.wav b/sound/direct_sound_samples/cries/swampert.wav new file mode 100644 index 000000000000..a06f15992faa Binary files /dev/null and b/sound/direct_sound_samples/cries/swampert.wav differ diff --git a/sound/direct_sound_samples/cries/swampert_mega.aif b/sound/direct_sound_samples/cries/swampert_mega.aif deleted file mode 100644 index c19ec99835ae..000000000000 Binary files a/sound/direct_sound_samples/cries/swampert_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/swampert_mega.wav b/sound/direct_sound_samples/cries/swampert_mega.wav new file mode 100644 index 000000000000..6abd49881955 Binary files /dev/null and b/sound/direct_sound_samples/cries/swampert_mega.wav differ diff --git a/sound/direct_sound_samples/cries/swanna.aif b/sound/direct_sound_samples/cries/swanna.aif deleted file mode 100644 index 9b2ef724f6c7..000000000000 Binary files a/sound/direct_sound_samples/cries/swanna.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/swanna.wav b/sound/direct_sound_samples/cries/swanna.wav new file mode 100644 index 000000000000..f2390b1fc45b Binary files /dev/null and b/sound/direct_sound_samples/cries/swanna.wav differ diff --git a/sound/direct_sound_samples/cries/swellow.aif b/sound/direct_sound_samples/cries/swellow.aif deleted file mode 100644 index a5bf66627d1e..000000000000 Binary files a/sound/direct_sound_samples/cries/swellow.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/swellow.wav b/sound/direct_sound_samples/cries/swellow.wav new file mode 100644 index 000000000000..637ff465403f Binary files /dev/null and b/sound/direct_sound_samples/cries/swellow.wav differ diff --git a/sound/direct_sound_samples/cries/swinub.aif b/sound/direct_sound_samples/cries/swinub.aif deleted file mode 100644 index 7b2a08bf6fae..000000000000 Binary files a/sound/direct_sound_samples/cries/swinub.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/swinub.wav b/sound/direct_sound_samples/cries/swinub.wav new file mode 100644 index 000000000000..93eafa458d93 Binary files /dev/null and b/sound/direct_sound_samples/cries/swinub.wav differ diff --git a/sound/direct_sound_samples/cries/swirlix.aif b/sound/direct_sound_samples/cries/swirlix.aif deleted file mode 100644 index 89fa6ecd16b3..000000000000 Binary files a/sound/direct_sound_samples/cries/swirlix.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/swirlix.wav b/sound/direct_sound_samples/cries/swirlix.wav new file mode 100644 index 000000000000..e1340299c507 Binary files /dev/null and b/sound/direct_sound_samples/cries/swirlix.wav differ diff --git a/sound/direct_sound_samples/cries/swoobat.aif b/sound/direct_sound_samples/cries/swoobat.aif deleted file mode 100644 index 32f8d406c56d..000000000000 Binary files a/sound/direct_sound_samples/cries/swoobat.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/swoobat.wav b/sound/direct_sound_samples/cries/swoobat.wav new file mode 100644 index 000000000000..be69ad24306d Binary files /dev/null and b/sound/direct_sound_samples/cries/swoobat.wav differ diff --git a/sound/direct_sound_samples/cries/sylveon.aif b/sound/direct_sound_samples/cries/sylveon.aif deleted file mode 100644 index 0ded5d19d187..000000000000 Binary files a/sound/direct_sound_samples/cries/sylveon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/sylveon.wav b/sound/direct_sound_samples/cries/sylveon.wav new file mode 100644 index 000000000000..765219906189 Binary files /dev/null and b/sound/direct_sound_samples/cries/sylveon.wav differ diff --git a/sound/direct_sound_samples/cries/tadbulb.aif b/sound/direct_sound_samples/cries/tadbulb.aif deleted file mode 100644 index 4680059cde52..000000000000 Binary files a/sound/direct_sound_samples/cries/tadbulb.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tadbulb.wav b/sound/direct_sound_samples/cries/tadbulb.wav new file mode 100644 index 000000000000..42eec08df86a Binary files /dev/null and b/sound/direct_sound_samples/cries/tadbulb.wav differ diff --git a/sound/direct_sound_samples/cries/taillow.aif b/sound/direct_sound_samples/cries/taillow.aif deleted file mode 100644 index c30cdb275bc4..000000000000 Binary files a/sound/direct_sound_samples/cries/taillow.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/taillow.wav b/sound/direct_sound_samples/cries/taillow.wav new file mode 100644 index 000000000000..9f1bb25f487b Binary files /dev/null and b/sound/direct_sound_samples/cries/taillow.wav differ diff --git a/sound/direct_sound_samples/cries/talonflame.aif b/sound/direct_sound_samples/cries/talonflame.aif deleted file mode 100644 index d16a4a2128c6..000000000000 Binary files a/sound/direct_sound_samples/cries/talonflame.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/talonflame.wav b/sound/direct_sound_samples/cries/talonflame.wav new file mode 100644 index 000000000000..b418813d109d Binary files /dev/null and b/sound/direct_sound_samples/cries/talonflame.wav differ diff --git a/sound/direct_sound_samples/cries/tandemaus.aif b/sound/direct_sound_samples/cries/tandemaus.aif deleted file mode 100644 index c6aeb27e0c38..000000000000 Binary files a/sound/direct_sound_samples/cries/tandemaus.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tandemaus.wav b/sound/direct_sound_samples/cries/tandemaus.wav new file mode 100644 index 000000000000..88ddc1735371 Binary files /dev/null and b/sound/direct_sound_samples/cries/tandemaus.wav differ diff --git a/sound/direct_sound_samples/cries/tangela.aif b/sound/direct_sound_samples/cries/tangela.aif deleted file mode 100644 index e463f2b7e621..000000000000 Binary files a/sound/direct_sound_samples/cries/tangela.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tangela.wav b/sound/direct_sound_samples/cries/tangela.wav new file mode 100644 index 000000000000..023a0362f953 Binary files /dev/null and b/sound/direct_sound_samples/cries/tangela.wav differ diff --git a/sound/direct_sound_samples/cries/tangrowth.aif b/sound/direct_sound_samples/cries/tangrowth.aif deleted file mode 100644 index 23e3d995b798..000000000000 Binary files a/sound/direct_sound_samples/cries/tangrowth.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tangrowth.wav b/sound/direct_sound_samples/cries/tangrowth.wav new file mode 100644 index 000000000000..941a8d9d2478 Binary files /dev/null and b/sound/direct_sound_samples/cries/tangrowth.wav differ diff --git a/sound/direct_sound_samples/cries/tapu_bulu.aif b/sound/direct_sound_samples/cries/tapu_bulu.aif deleted file mode 100644 index ab84791fa7b1..000000000000 Binary files a/sound/direct_sound_samples/cries/tapu_bulu.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tapu_bulu.wav b/sound/direct_sound_samples/cries/tapu_bulu.wav new file mode 100644 index 000000000000..45b7a0ff6930 Binary files /dev/null and b/sound/direct_sound_samples/cries/tapu_bulu.wav differ diff --git a/sound/direct_sound_samples/cries/tapu_fini.aif b/sound/direct_sound_samples/cries/tapu_fini.aif deleted file mode 100644 index 301b0a70b8a5..000000000000 Binary files a/sound/direct_sound_samples/cries/tapu_fini.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tapu_fini.wav b/sound/direct_sound_samples/cries/tapu_fini.wav new file mode 100644 index 000000000000..6a9a1fea48e8 Binary files /dev/null and b/sound/direct_sound_samples/cries/tapu_fini.wav differ diff --git a/sound/direct_sound_samples/cries/tapu_koko.aif b/sound/direct_sound_samples/cries/tapu_koko.aif deleted file mode 100644 index 2fae1a3b0b75..000000000000 Binary files a/sound/direct_sound_samples/cries/tapu_koko.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tapu_koko.wav b/sound/direct_sound_samples/cries/tapu_koko.wav new file mode 100644 index 000000000000..2f93829ee1a6 Binary files /dev/null and b/sound/direct_sound_samples/cries/tapu_koko.wav differ diff --git a/sound/direct_sound_samples/cries/tapu_lele.aif b/sound/direct_sound_samples/cries/tapu_lele.aif deleted file mode 100644 index c15bb3186275..000000000000 Binary files a/sound/direct_sound_samples/cries/tapu_lele.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tapu_lele.wav b/sound/direct_sound_samples/cries/tapu_lele.wav new file mode 100644 index 000000000000..6e93a9a4de45 Binary files /dev/null and b/sound/direct_sound_samples/cries/tapu_lele.wav differ diff --git a/sound/direct_sound_samples/cries/tarountula.aif b/sound/direct_sound_samples/cries/tarountula.aif deleted file mode 100644 index d8d24385657b..000000000000 Binary files a/sound/direct_sound_samples/cries/tarountula.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tarountula.wav b/sound/direct_sound_samples/cries/tarountula.wav new file mode 100644 index 000000000000..13aa6c89f8f8 Binary files /dev/null and b/sound/direct_sound_samples/cries/tarountula.wav differ diff --git a/sound/direct_sound_samples/cries/tatsugiri_curly.aif b/sound/direct_sound_samples/cries/tatsugiri_curly.aif deleted file mode 100644 index 16c03553abc2..000000000000 Binary files a/sound/direct_sound_samples/cries/tatsugiri_curly.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tatsugiri_curly.wav b/sound/direct_sound_samples/cries/tatsugiri_curly.wav new file mode 100644 index 000000000000..c8eb9c892906 Binary files /dev/null and b/sound/direct_sound_samples/cries/tatsugiri_curly.wav differ diff --git a/sound/direct_sound_samples/cries/tatsugiri_droopy.aif b/sound/direct_sound_samples/cries/tatsugiri_droopy.aif deleted file mode 100644 index 20131039e5a6..000000000000 Binary files a/sound/direct_sound_samples/cries/tatsugiri_droopy.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tatsugiri_droopy.wav b/sound/direct_sound_samples/cries/tatsugiri_droopy.wav new file mode 100644 index 000000000000..999a8463110e Binary files /dev/null and b/sound/direct_sound_samples/cries/tatsugiri_droopy.wav differ diff --git a/sound/direct_sound_samples/cries/tatsugiri_stretchy.aif b/sound/direct_sound_samples/cries/tatsugiri_stretchy.aif deleted file mode 100644 index 08e568043354..000000000000 Binary files a/sound/direct_sound_samples/cries/tatsugiri_stretchy.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tatsugiri_stretchy.wav b/sound/direct_sound_samples/cries/tatsugiri_stretchy.wav new file mode 100644 index 000000000000..62653400ae31 Binary files /dev/null and b/sound/direct_sound_samples/cries/tatsugiri_stretchy.wav differ diff --git a/sound/direct_sound_samples/cries/tauros.aif b/sound/direct_sound_samples/cries/tauros.aif deleted file mode 100644 index 1b4bdfa5c438..000000000000 Binary files a/sound/direct_sound_samples/cries/tauros.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tauros.wav b/sound/direct_sound_samples/cries/tauros.wav new file mode 100644 index 000000000000..a982d052d955 Binary files /dev/null and b/sound/direct_sound_samples/cries/tauros.wav differ diff --git a/sound/direct_sound_samples/cries/teddiursa.aif b/sound/direct_sound_samples/cries/teddiursa.aif deleted file mode 100644 index 19ba558c3b94..000000000000 Binary files a/sound/direct_sound_samples/cries/teddiursa.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/teddiursa.wav b/sound/direct_sound_samples/cries/teddiursa.wav new file mode 100644 index 000000000000..adc9b80d9ce5 Binary files /dev/null and b/sound/direct_sound_samples/cries/teddiursa.wav differ diff --git a/sound/direct_sound_samples/cries/tentacool.aif b/sound/direct_sound_samples/cries/tentacool.aif deleted file mode 100644 index 8918f25627f7..000000000000 Binary files a/sound/direct_sound_samples/cries/tentacool.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tentacool.wav b/sound/direct_sound_samples/cries/tentacool.wav new file mode 100644 index 000000000000..cd8f5afc7ae2 Binary files /dev/null and b/sound/direct_sound_samples/cries/tentacool.wav differ diff --git a/sound/direct_sound_samples/cries/tentacruel.aif b/sound/direct_sound_samples/cries/tentacruel.aif deleted file mode 100644 index 2497d178df3c..000000000000 Binary files a/sound/direct_sound_samples/cries/tentacruel.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tentacruel.wav b/sound/direct_sound_samples/cries/tentacruel.wav new file mode 100644 index 000000000000..dfbc8c7f097b Binary files /dev/null and b/sound/direct_sound_samples/cries/tentacruel.wav differ diff --git a/sound/direct_sound_samples/cries/tepig.aif b/sound/direct_sound_samples/cries/tepig.aif deleted file mode 100644 index 45b7b4ecdaf4..000000000000 Binary files a/sound/direct_sound_samples/cries/tepig.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tepig.wav b/sound/direct_sound_samples/cries/tepig.wav new file mode 100644 index 000000000000..766107639ead Binary files /dev/null and b/sound/direct_sound_samples/cries/tepig.wav differ diff --git a/sound/direct_sound_samples/cries/terapagos.aif b/sound/direct_sound_samples/cries/terapagos.aif deleted file mode 100644 index a99810cca9f4..000000000000 Binary files a/sound/direct_sound_samples/cries/terapagos.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/terapagos.wav b/sound/direct_sound_samples/cries/terapagos.wav new file mode 100644 index 000000000000..bbda64cb645e Binary files /dev/null and b/sound/direct_sound_samples/cries/terapagos.wav differ diff --git a/sound/direct_sound_samples/cries/terrakion.aif b/sound/direct_sound_samples/cries/terrakion.aif deleted file mode 100644 index e567be0f1eed..000000000000 Binary files a/sound/direct_sound_samples/cries/terrakion.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/terrakion.wav b/sound/direct_sound_samples/cries/terrakion.wav new file mode 100644 index 000000000000..ec3d1e52a613 Binary files /dev/null and b/sound/direct_sound_samples/cries/terrakion.wav differ diff --git a/sound/direct_sound_samples/cries/thievul.aif b/sound/direct_sound_samples/cries/thievul.aif deleted file mode 100644 index 8bf63fd88845..000000000000 Binary files a/sound/direct_sound_samples/cries/thievul.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/thievul.wav b/sound/direct_sound_samples/cries/thievul.wav new file mode 100644 index 000000000000..2a3fc4e49c77 Binary files /dev/null and b/sound/direct_sound_samples/cries/thievul.wav differ diff --git a/sound/direct_sound_samples/cries/throh.aif b/sound/direct_sound_samples/cries/throh.aif deleted file mode 100644 index eeeba64e4b29..000000000000 Binary files a/sound/direct_sound_samples/cries/throh.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/throh.wav b/sound/direct_sound_samples/cries/throh.wav new file mode 100644 index 000000000000..9568bd7ca1b8 Binary files /dev/null and b/sound/direct_sound_samples/cries/throh.wav differ diff --git a/sound/direct_sound_samples/cries/thundurus_incarnate.aif b/sound/direct_sound_samples/cries/thundurus_incarnate.aif deleted file mode 100644 index 8b1c81b9f94a..000000000000 Binary files a/sound/direct_sound_samples/cries/thundurus_incarnate.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/thundurus_incarnate.wav b/sound/direct_sound_samples/cries/thundurus_incarnate.wav new file mode 100644 index 000000000000..bee2249eef27 Binary files /dev/null and b/sound/direct_sound_samples/cries/thundurus_incarnate.wav differ diff --git a/sound/direct_sound_samples/cries/thundurus_therian.aif b/sound/direct_sound_samples/cries/thundurus_therian.aif deleted file mode 100644 index f5ac69f17725..000000000000 Binary files a/sound/direct_sound_samples/cries/thundurus_therian.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/thundurus_therian.wav b/sound/direct_sound_samples/cries/thundurus_therian.wav new file mode 100644 index 000000000000..e31bda03bc4f Binary files /dev/null and b/sound/direct_sound_samples/cries/thundurus_therian.wav differ diff --git a/sound/direct_sound_samples/cries/thwackey.aif b/sound/direct_sound_samples/cries/thwackey.aif deleted file mode 100644 index 579df5c965b0..000000000000 Binary files a/sound/direct_sound_samples/cries/thwackey.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/thwackey.wav b/sound/direct_sound_samples/cries/thwackey.wav new file mode 100644 index 000000000000..d91325a3873e Binary files /dev/null and b/sound/direct_sound_samples/cries/thwackey.wav differ diff --git a/sound/direct_sound_samples/cries/timburr.aif b/sound/direct_sound_samples/cries/timburr.aif deleted file mode 100644 index 49edb74efb85..000000000000 Binary files a/sound/direct_sound_samples/cries/timburr.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/timburr.wav b/sound/direct_sound_samples/cries/timburr.wav new file mode 100644 index 000000000000..4a332408a192 Binary files /dev/null and b/sound/direct_sound_samples/cries/timburr.wav differ diff --git a/sound/direct_sound_samples/cries/ting_lu.aif b/sound/direct_sound_samples/cries/ting_lu.aif deleted file mode 100644 index a4a5ed211847..000000000000 Binary files a/sound/direct_sound_samples/cries/ting_lu.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ting_lu.wav b/sound/direct_sound_samples/cries/ting_lu.wav new file mode 100644 index 000000000000..5f262d014e4e Binary files /dev/null and b/sound/direct_sound_samples/cries/ting_lu.wav differ diff --git a/sound/direct_sound_samples/cries/tinkatink.aif b/sound/direct_sound_samples/cries/tinkatink.aif deleted file mode 100644 index a6229c133856..000000000000 Binary files a/sound/direct_sound_samples/cries/tinkatink.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tinkatink.wav b/sound/direct_sound_samples/cries/tinkatink.wav new file mode 100644 index 000000000000..e20cf339335a Binary files /dev/null and b/sound/direct_sound_samples/cries/tinkatink.wav differ diff --git a/sound/direct_sound_samples/cries/tinkaton.aif b/sound/direct_sound_samples/cries/tinkaton.aif deleted file mode 100644 index fd88cb84596c..000000000000 Binary files a/sound/direct_sound_samples/cries/tinkaton.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tinkaton.wav b/sound/direct_sound_samples/cries/tinkaton.wav new file mode 100644 index 000000000000..eaac1993bd9c Binary files /dev/null and b/sound/direct_sound_samples/cries/tinkaton.wav differ diff --git a/sound/direct_sound_samples/cries/tinkatuff.aif b/sound/direct_sound_samples/cries/tinkatuff.aif deleted file mode 100644 index aa096ef11322..000000000000 Binary files a/sound/direct_sound_samples/cries/tinkatuff.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tinkatuff.wav b/sound/direct_sound_samples/cries/tinkatuff.wav new file mode 100644 index 000000000000..e077d63a2d37 Binary files /dev/null and b/sound/direct_sound_samples/cries/tinkatuff.wav differ diff --git a/sound/direct_sound_samples/cries/tirtouga.aif b/sound/direct_sound_samples/cries/tirtouga.aif deleted file mode 100644 index 2233557d229c..000000000000 Binary files a/sound/direct_sound_samples/cries/tirtouga.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tirtouga.wav b/sound/direct_sound_samples/cries/tirtouga.wav new file mode 100644 index 000000000000..c22f08784214 Binary files /dev/null and b/sound/direct_sound_samples/cries/tirtouga.wav differ diff --git a/sound/direct_sound_samples/cries/toedscool.aif b/sound/direct_sound_samples/cries/toedscool.aif deleted file mode 100644 index a153ed4d87d0..000000000000 Binary files a/sound/direct_sound_samples/cries/toedscool.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/toedscool.wav b/sound/direct_sound_samples/cries/toedscool.wav new file mode 100644 index 000000000000..21c119feec47 Binary files /dev/null and b/sound/direct_sound_samples/cries/toedscool.wav differ diff --git a/sound/direct_sound_samples/cries/toedscruel.aif b/sound/direct_sound_samples/cries/toedscruel.aif deleted file mode 100644 index 1f2fade60c6f..000000000000 Binary files a/sound/direct_sound_samples/cries/toedscruel.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/toedscruel.wav b/sound/direct_sound_samples/cries/toedscruel.wav new file mode 100644 index 000000000000..7e1b4a63210d Binary files /dev/null and b/sound/direct_sound_samples/cries/toedscruel.wav differ diff --git a/sound/direct_sound_samples/cries/togedemaru.aif b/sound/direct_sound_samples/cries/togedemaru.aif deleted file mode 100644 index 366ce2be960c..000000000000 Binary files a/sound/direct_sound_samples/cries/togedemaru.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/togedemaru.wav b/sound/direct_sound_samples/cries/togedemaru.wav new file mode 100644 index 000000000000..7249f3eb6e9f Binary files /dev/null and b/sound/direct_sound_samples/cries/togedemaru.wav differ diff --git a/sound/direct_sound_samples/cries/togekiss.aif b/sound/direct_sound_samples/cries/togekiss.aif deleted file mode 100644 index c66baeaf552f..000000000000 Binary files a/sound/direct_sound_samples/cries/togekiss.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/togekiss.wav b/sound/direct_sound_samples/cries/togekiss.wav new file mode 100644 index 000000000000..84ae1d7bc902 Binary files /dev/null and b/sound/direct_sound_samples/cries/togekiss.wav differ diff --git a/sound/direct_sound_samples/cries/togepi.aif b/sound/direct_sound_samples/cries/togepi.aif deleted file mode 100644 index 0785a662ab91..000000000000 Binary files a/sound/direct_sound_samples/cries/togepi.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/togepi.wav b/sound/direct_sound_samples/cries/togepi.wav new file mode 100644 index 000000000000..e13355c55414 Binary files /dev/null and b/sound/direct_sound_samples/cries/togepi.wav differ diff --git a/sound/direct_sound_samples/cries/togetic.aif b/sound/direct_sound_samples/cries/togetic.aif deleted file mode 100644 index f577120c6d39..000000000000 Binary files a/sound/direct_sound_samples/cries/togetic.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/togetic.wav b/sound/direct_sound_samples/cries/togetic.wav new file mode 100644 index 000000000000..957a45dc94e8 Binary files /dev/null and b/sound/direct_sound_samples/cries/togetic.wav differ diff --git a/sound/direct_sound_samples/cries/torchic.aif b/sound/direct_sound_samples/cries/torchic.aif deleted file mode 100644 index 3accc1b3c880..000000000000 Binary files a/sound/direct_sound_samples/cries/torchic.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/torchic.wav b/sound/direct_sound_samples/cries/torchic.wav new file mode 100644 index 000000000000..39a2522b3282 Binary files /dev/null and b/sound/direct_sound_samples/cries/torchic.wav differ diff --git a/sound/direct_sound_samples/cries/torkoal.aif b/sound/direct_sound_samples/cries/torkoal.aif deleted file mode 100644 index b73d06ef5e44..000000000000 Binary files a/sound/direct_sound_samples/cries/torkoal.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/torkoal.wav b/sound/direct_sound_samples/cries/torkoal.wav new file mode 100644 index 000000000000..497e92af20e9 Binary files /dev/null and b/sound/direct_sound_samples/cries/torkoal.wav differ diff --git a/sound/direct_sound_samples/cries/tornadus_incarnate.aif b/sound/direct_sound_samples/cries/tornadus_incarnate.aif deleted file mode 100644 index b980ce2bb5c3..000000000000 Binary files a/sound/direct_sound_samples/cries/tornadus_incarnate.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tornadus_incarnate.wav b/sound/direct_sound_samples/cries/tornadus_incarnate.wav new file mode 100644 index 000000000000..46c02fa1127c Binary files /dev/null and b/sound/direct_sound_samples/cries/tornadus_incarnate.wav differ diff --git a/sound/direct_sound_samples/cries/tornadus_therian.aif b/sound/direct_sound_samples/cries/tornadus_therian.aif deleted file mode 100644 index a1d98062b688..000000000000 Binary files a/sound/direct_sound_samples/cries/tornadus_therian.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tornadus_therian.wav b/sound/direct_sound_samples/cries/tornadus_therian.wav new file mode 100644 index 000000000000..3d6d421d2d0b Binary files /dev/null and b/sound/direct_sound_samples/cries/tornadus_therian.wav differ diff --git a/sound/direct_sound_samples/cries/torracat.aif b/sound/direct_sound_samples/cries/torracat.aif deleted file mode 100644 index 44bb00137593..000000000000 Binary files a/sound/direct_sound_samples/cries/torracat.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/torracat.wav b/sound/direct_sound_samples/cries/torracat.wav new file mode 100644 index 000000000000..fb8cf24c6121 Binary files /dev/null and b/sound/direct_sound_samples/cries/torracat.wav differ diff --git a/sound/direct_sound_samples/cries/torterra.aif b/sound/direct_sound_samples/cries/torterra.aif deleted file mode 100644 index e659181e2383..000000000000 Binary files a/sound/direct_sound_samples/cries/torterra.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/torterra.wav b/sound/direct_sound_samples/cries/torterra.wav new file mode 100644 index 000000000000..3fdb2e6d1268 Binary files /dev/null and b/sound/direct_sound_samples/cries/torterra.wav differ diff --git a/sound/direct_sound_samples/cries/totodile.aif b/sound/direct_sound_samples/cries/totodile.aif deleted file mode 100644 index 98fbb528bead..000000000000 Binary files a/sound/direct_sound_samples/cries/totodile.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/totodile.wav b/sound/direct_sound_samples/cries/totodile.wav new file mode 100644 index 000000000000..93c07884732c Binary files /dev/null and b/sound/direct_sound_samples/cries/totodile.wav differ diff --git a/sound/direct_sound_samples/cries/toucannon.aif b/sound/direct_sound_samples/cries/toucannon.aif deleted file mode 100644 index 83a90bab9cdb..000000000000 Binary files a/sound/direct_sound_samples/cries/toucannon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/toucannon.wav b/sound/direct_sound_samples/cries/toucannon.wav new file mode 100644 index 000000000000..f8b393848302 Binary files /dev/null and b/sound/direct_sound_samples/cries/toucannon.wav differ diff --git a/sound/direct_sound_samples/cries/toxapex.aif b/sound/direct_sound_samples/cries/toxapex.aif deleted file mode 100644 index 3369da2f70f7..000000000000 Binary files a/sound/direct_sound_samples/cries/toxapex.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/toxapex.wav b/sound/direct_sound_samples/cries/toxapex.wav new file mode 100644 index 000000000000..a2e759b11d00 Binary files /dev/null and b/sound/direct_sound_samples/cries/toxapex.wav differ diff --git a/sound/direct_sound_samples/cries/toxel.aif b/sound/direct_sound_samples/cries/toxel.aif deleted file mode 100644 index 0f917edddb81..000000000000 Binary files a/sound/direct_sound_samples/cries/toxel.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/toxel.wav b/sound/direct_sound_samples/cries/toxel.wav new file mode 100644 index 000000000000..2f43210fab58 Binary files /dev/null and b/sound/direct_sound_samples/cries/toxel.wav differ diff --git a/sound/direct_sound_samples/cries/toxicroak.aif b/sound/direct_sound_samples/cries/toxicroak.aif deleted file mode 100644 index ada83b0a2b0b..000000000000 Binary files a/sound/direct_sound_samples/cries/toxicroak.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/toxicroak.wav b/sound/direct_sound_samples/cries/toxicroak.wav new file mode 100644 index 000000000000..5dd49163fed2 Binary files /dev/null and b/sound/direct_sound_samples/cries/toxicroak.wav differ diff --git a/sound/direct_sound_samples/cries/toxtricity_amped.aif b/sound/direct_sound_samples/cries/toxtricity_amped.aif deleted file mode 100644 index 0775c8a0492d..000000000000 Binary files a/sound/direct_sound_samples/cries/toxtricity_amped.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/toxtricity_amped.wav b/sound/direct_sound_samples/cries/toxtricity_amped.wav new file mode 100644 index 000000000000..236fc8841789 Binary files /dev/null and b/sound/direct_sound_samples/cries/toxtricity_amped.wav differ diff --git a/sound/direct_sound_samples/cries/toxtricity_low_key.aif b/sound/direct_sound_samples/cries/toxtricity_low_key.aif deleted file mode 100644 index 57740d974d52..000000000000 Binary files a/sound/direct_sound_samples/cries/toxtricity_low_key.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/toxtricity_low_key.wav b/sound/direct_sound_samples/cries/toxtricity_low_key.wav new file mode 100644 index 000000000000..6c1bb8a111d1 Binary files /dev/null and b/sound/direct_sound_samples/cries/toxtricity_low_key.wav differ diff --git a/sound/direct_sound_samples/cries/tranquill.aif b/sound/direct_sound_samples/cries/tranquill.aif deleted file mode 100644 index 6a4e8a7661ca..000000000000 Binary files a/sound/direct_sound_samples/cries/tranquill.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tranquill.wav b/sound/direct_sound_samples/cries/tranquill.wav new file mode 100644 index 000000000000..d8ade54fc141 Binary files /dev/null and b/sound/direct_sound_samples/cries/tranquill.wav differ diff --git a/sound/direct_sound_samples/cries/trapinch.aif b/sound/direct_sound_samples/cries/trapinch.aif deleted file mode 100644 index cc27653fd44d..000000000000 Binary files a/sound/direct_sound_samples/cries/trapinch.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/trapinch.wav b/sound/direct_sound_samples/cries/trapinch.wav new file mode 100644 index 000000000000..5cad4ad23e90 Binary files /dev/null and b/sound/direct_sound_samples/cries/trapinch.wav differ diff --git a/sound/direct_sound_samples/cries/treecko.aif b/sound/direct_sound_samples/cries/treecko.aif deleted file mode 100644 index e9a47979e0e0..000000000000 Binary files a/sound/direct_sound_samples/cries/treecko.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/treecko.wav b/sound/direct_sound_samples/cries/treecko.wav new file mode 100644 index 000000000000..0c982f8408d3 Binary files /dev/null and b/sound/direct_sound_samples/cries/treecko.wav differ diff --git a/sound/direct_sound_samples/cries/trevenant.aif b/sound/direct_sound_samples/cries/trevenant.aif deleted file mode 100644 index 018a80e8c2de..000000000000 Binary files a/sound/direct_sound_samples/cries/trevenant.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/trevenant.wav b/sound/direct_sound_samples/cries/trevenant.wav new file mode 100644 index 000000000000..da2efb459418 Binary files /dev/null and b/sound/direct_sound_samples/cries/trevenant.wav differ diff --git a/sound/direct_sound_samples/cries/tropius.aif b/sound/direct_sound_samples/cries/tropius.aif deleted file mode 100644 index 81046fe1cfdb..000000000000 Binary files a/sound/direct_sound_samples/cries/tropius.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tropius.wav b/sound/direct_sound_samples/cries/tropius.wav new file mode 100644 index 000000000000..55de362aa725 Binary files /dev/null and b/sound/direct_sound_samples/cries/tropius.wav differ diff --git a/sound/direct_sound_samples/cries/trubbish.aif b/sound/direct_sound_samples/cries/trubbish.aif deleted file mode 100644 index 09c1aac572b8..000000000000 Binary files a/sound/direct_sound_samples/cries/trubbish.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/trubbish.wav b/sound/direct_sound_samples/cries/trubbish.wav new file mode 100644 index 000000000000..5ee879913b85 Binary files /dev/null and b/sound/direct_sound_samples/cries/trubbish.wav differ diff --git a/sound/direct_sound_samples/cries/trumbeak.aif b/sound/direct_sound_samples/cries/trumbeak.aif deleted file mode 100644 index c6e477c4017a..000000000000 Binary files a/sound/direct_sound_samples/cries/trumbeak.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/trumbeak.wav b/sound/direct_sound_samples/cries/trumbeak.wav new file mode 100644 index 000000000000..389e543a1fa6 Binary files /dev/null and b/sound/direct_sound_samples/cries/trumbeak.wav differ diff --git a/sound/direct_sound_samples/cries/tsareena.aif b/sound/direct_sound_samples/cries/tsareena.aif deleted file mode 100644 index bff64b0f3f7b..000000000000 Binary files a/sound/direct_sound_samples/cries/tsareena.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tsareena.wav b/sound/direct_sound_samples/cries/tsareena.wav new file mode 100644 index 000000000000..f0629866776c Binary files /dev/null and b/sound/direct_sound_samples/cries/tsareena.wav differ diff --git a/sound/direct_sound_samples/cries/turtonator.aif b/sound/direct_sound_samples/cries/turtonator.aif deleted file mode 100644 index b5d27b630f43..000000000000 Binary files a/sound/direct_sound_samples/cries/turtonator.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/turtonator.wav b/sound/direct_sound_samples/cries/turtonator.wav new file mode 100644 index 000000000000..0bc247246a78 Binary files /dev/null and b/sound/direct_sound_samples/cries/turtonator.wav differ diff --git a/sound/direct_sound_samples/cries/turtwig.aif b/sound/direct_sound_samples/cries/turtwig.aif deleted file mode 100644 index a2e4ad60b378..000000000000 Binary files a/sound/direct_sound_samples/cries/turtwig.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/turtwig.wav b/sound/direct_sound_samples/cries/turtwig.wav new file mode 100644 index 000000000000..afa0b439691a Binary files /dev/null and b/sound/direct_sound_samples/cries/turtwig.wav differ diff --git a/sound/direct_sound_samples/cries/tympole.aif b/sound/direct_sound_samples/cries/tympole.aif deleted file mode 100644 index d643216736d1..000000000000 Binary files a/sound/direct_sound_samples/cries/tympole.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tympole.wav b/sound/direct_sound_samples/cries/tympole.wav new file mode 100644 index 000000000000..f8455239eb27 Binary files /dev/null and b/sound/direct_sound_samples/cries/tympole.wav differ diff --git a/sound/direct_sound_samples/cries/tynamo.aif b/sound/direct_sound_samples/cries/tynamo.aif deleted file mode 100644 index ca9e2962fcb8..000000000000 Binary files a/sound/direct_sound_samples/cries/tynamo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tynamo.wav b/sound/direct_sound_samples/cries/tynamo.wav new file mode 100644 index 000000000000..031a336a6c5e Binary files /dev/null and b/sound/direct_sound_samples/cries/tynamo.wav differ diff --git a/sound/direct_sound_samples/cries/type_null.aif b/sound/direct_sound_samples/cries/type_null.aif deleted file mode 100644 index 6b6be2dcfb15..000000000000 Binary files a/sound/direct_sound_samples/cries/type_null.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/type_null.wav b/sound/direct_sound_samples/cries/type_null.wav new file mode 100644 index 000000000000..9850d88e4aad Binary files /dev/null and b/sound/direct_sound_samples/cries/type_null.wav differ diff --git a/sound/direct_sound_samples/cries/typhlosion.aif b/sound/direct_sound_samples/cries/typhlosion.aif deleted file mode 100644 index cc993c805223..000000000000 Binary files a/sound/direct_sound_samples/cries/typhlosion.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/typhlosion.wav b/sound/direct_sound_samples/cries/typhlosion.wav new file mode 100644 index 000000000000..f1759989d720 Binary files /dev/null and b/sound/direct_sound_samples/cries/typhlosion.wav differ diff --git a/sound/direct_sound_samples/cries/tyranitar.aif b/sound/direct_sound_samples/cries/tyranitar.aif deleted file mode 100644 index 3572da76678c..000000000000 Binary files a/sound/direct_sound_samples/cries/tyranitar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tyranitar.wav b/sound/direct_sound_samples/cries/tyranitar.wav new file mode 100644 index 000000000000..5bec5f7279e0 Binary files /dev/null and b/sound/direct_sound_samples/cries/tyranitar.wav differ diff --git a/sound/direct_sound_samples/cries/tyranitar_mega.aif b/sound/direct_sound_samples/cries/tyranitar_mega.aif deleted file mode 100644 index 020118b388e7..000000000000 Binary files a/sound/direct_sound_samples/cries/tyranitar_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tyranitar_mega.wav b/sound/direct_sound_samples/cries/tyranitar_mega.wav new file mode 100644 index 000000000000..dedb9d2560a0 Binary files /dev/null and b/sound/direct_sound_samples/cries/tyranitar_mega.wav differ diff --git a/sound/direct_sound_samples/cries/tyrantrum.aif b/sound/direct_sound_samples/cries/tyrantrum.aif deleted file mode 100644 index 88e9506129d0..000000000000 Binary files a/sound/direct_sound_samples/cries/tyrantrum.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tyrantrum.wav b/sound/direct_sound_samples/cries/tyrantrum.wav new file mode 100644 index 000000000000..766cbab20477 Binary files /dev/null and b/sound/direct_sound_samples/cries/tyrantrum.wav differ diff --git a/sound/direct_sound_samples/cries/tyrogue.aif b/sound/direct_sound_samples/cries/tyrogue.aif deleted file mode 100644 index 7caea851b3f9..000000000000 Binary files a/sound/direct_sound_samples/cries/tyrogue.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tyrogue.wav b/sound/direct_sound_samples/cries/tyrogue.wav new file mode 100644 index 000000000000..46d032063da7 Binary files /dev/null and b/sound/direct_sound_samples/cries/tyrogue.wav differ diff --git a/sound/direct_sound_samples/cries/tyrunt.aif b/sound/direct_sound_samples/cries/tyrunt.aif deleted file mode 100644 index e69373600537..000000000000 Binary files a/sound/direct_sound_samples/cries/tyrunt.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/tyrunt.wav b/sound/direct_sound_samples/cries/tyrunt.wav new file mode 100644 index 000000000000..9cb0531dadc3 Binary files /dev/null and b/sound/direct_sound_samples/cries/tyrunt.wav differ diff --git a/sound/direct_sound_samples/cries/umbreon.aif b/sound/direct_sound_samples/cries/umbreon.aif deleted file mode 100644 index 93c739dd7477..000000000000 Binary files a/sound/direct_sound_samples/cries/umbreon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/umbreon.wav b/sound/direct_sound_samples/cries/umbreon.wav new file mode 100644 index 000000000000..48f62064afbe Binary files /dev/null and b/sound/direct_sound_samples/cries/umbreon.wav differ diff --git a/sound/direct_sound_samples/cries/uncomp_klefki.aif b/sound/direct_sound_samples/cries/uncomp_klefki.aif deleted file mode 100644 index c059b5662890..000000000000 Binary files a/sound/direct_sound_samples/cries/uncomp_klefki.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/uncomp_klefki.wav b/sound/direct_sound_samples/cries/uncomp_klefki.wav new file mode 100644 index 000000000000..9e606820eba5 Binary files /dev/null and b/sound/direct_sound_samples/cries/uncomp_klefki.wav differ diff --git a/sound/direct_sound_samples/cries/uncomp_oricorio_pom_pom.aif b/sound/direct_sound_samples/cries/uncomp_oricorio_pom_pom.aif deleted file mode 100644 index aa5fce23b6a3..000000000000 Binary files a/sound/direct_sound_samples/cries/uncomp_oricorio_pom_pom.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/uncomp_oricorio_pom_pom.wav b/sound/direct_sound_samples/cries/uncomp_oricorio_pom_pom.wav new file mode 100644 index 000000000000..912a9f3831c4 Binary files /dev/null and b/sound/direct_sound_samples/cries/uncomp_oricorio_pom_pom.wav differ diff --git a/sound/direct_sound_samples/cries/unfezant.aif b/sound/direct_sound_samples/cries/unfezant.aif deleted file mode 100644 index 1fde88bf0eeb..000000000000 Binary files a/sound/direct_sound_samples/cries/unfezant.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/unfezant.wav b/sound/direct_sound_samples/cries/unfezant.wav new file mode 100644 index 000000000000..fa21282be08e Binary files /dev/null and b/sound/direct_sound_samples/cries/unfezant.wav differ diff --git a/sound/direct_sound_samples/cries/unown.aif b/sound/direct_sound_samples/cries/unown.aif deleted file mode 100644 index 0b3edf577fb2..000000000000 Binary files a/sound/direct_sound_samples/cries/unown.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/unown.wav b/sound/direct_sound_samples/cries/unown.wav new file mode 100644 index 000000000000..1956ecef7575 Binary files /dev/null and b/sound/direct_sound_samples/cries/unown.wav differ diff --git a/sound/direct_sound_samples/cries/unused_265.wav b/sound/direct_sound_samples/cries/unused_265.wav new file mode 100644 index 000000000000..12c3d8640f69 Binary files /dev/null and b/sound/direct_sound_samples/cries/unused_265.wav differ diff --git a/sound/direct_sound_samples/cries/unused_268.wav b/sound/direct_sound_samples/cries/unused_268.wav new file mode 100644 index 000000000000..3501b24ef8dd Binary files /dev/null and b/sound/direct_sound_samples/cries/unused_268.wav differ diff --git a/sound/direct_sound_samples/cries/ursaluna.aif b/sound/direct_sound_samples/cries/ursaluna.aif deleted file mode 100644 index 7ce14c630e5b..000000000000 Binary files a/sound/direct_sound_samples/cries/ursaluna.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ursaluna.wav b/sound/direct_sound_samples/cries/ursaluna.wav new file mode 100644 index 000000000000..b6e99a6015fb Binary files /dev/null and b/sound/direct_sound_samples/cries/ursaluna.wav differ diff --git a/sound/direct_sound_samples/cries/ursaring.aif b/sound/direct_sound_samples/cries/ursaring.aif deleted file mode 100644 index 7837ba65973d..000000000000 Binary files a/sound/direct_sound_samples/cries/ursaring.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/ursaring.wav b/sound/direct_sound_samples/cries/ursaring.wav new file mode 100644 index 000000000000..b3d4a99cb704 Binary files /dev/null and b/sound/direct_sound_samples/cries/ursaring.wav differ diff --git a/sound/direct_sound_samples/cries/urshifu_rapid_strike.aif b/sound/direct_sound_samples/cries/urshifu_rapid_strike.aif deleted file mode 100644 index 8ac12bc90965..000000000000 Binary files a/sound/direct_sound_samples/cries/urshifu_rapid_strike.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/urshifu_rapid_strike.wav b/sound/direct_sound_samples/cries/urshifu_rapid_strike.wav new file mode 100644 index 000000000000..74a7f3520650 Binary files /dev/null and b/sound/direct_sound_samples/cries/urshifu_rapid_strike.wav differ diff --git a/sound/direct_sound_samples/cries/urshifu_single_strike.aif b/sound/direct_sound_samples/cries/urshifu_single_strike.aif deleted file mode 100644 index 7dec47854a00..000000000000 Binary files a/sound/direct_sound_samples/cries/urshifu_single_strike.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/urshifu_single_strike.wav b/sound/direct_sound_samples/cries/urshifu_single_strike.wav new file mode 100644 index 000000000000..549e5cd2dc23 Binary files /dev/null and b/sound/direct_sound_samples/cries/urshifu_single_strike.wav differ diff --git a/sound/direct_sound_samples/cries/uxie.aif b/sound/direct_sound_samples/cries/uxie.aif deleted file mode 100644 index da67cfc9960b..000000000000 Binary files a/sound/direct_sound_samples/cries/uxie.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/uxie.wav b/sound/direct_sound_samples/cries/uxie.wav new file mode 100644 index 000000000000..336ff25f5874 Binary files /dev/null and b/sound/direct_sound_samples/cries/uxie.wav differ diff --git a/sound/direct_sound_samples/cries/vanillish.aif b/sound/direct_sound_samples/cries/vanillish.aif deleted file mode 100644 index 625921a24b60..000000000000 Binary files a/sound/direct_sound_samples/cries/vanillish.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/vanillish.wav b/sound/direct_sound_samples/cries/vanillish.wav new file mode 100644 index 000000000000..29f2e853c430 Binary files /dev/null and b/sound/direct_sound_samples/cries/vanillish.wav differ diff --git a/sound/direct_sound_samples/cries/vanillite.aif b/sound/direct_sound_samples/cries/vanillite.aif deleted file mode 100644 index 03d25f96154e..000000000000 Binary files a/sound/direct_sound_samples/cries/vanillite.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/vanillite.wav b/sound/direct_sound_samples/cries/vanillite.wav new file mode 100644 index 000000000000..db303dd8e72e Binary files /dev/null and b/sound/direct_sound_samples/cries/vanillite.wav differ diff --git a/sound/direct_sound_samples/cries/vanilluxe.aif b/sound/direct_sound_samples/cries/vanilluxe.aif deleted file mode 100644 index e515359ee0ab..000000000000 Binary files a/sound/direct_sound_samples/cries/vanilluxe.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/vanilluxe.wav b/sound/direct_sound_samples/cries/vanilluxe.wav new file mode 100644 index 000000000000..d75e877475da Binary files /dev/null and b/sound/direct_sound_samples/cries/vanilluxe.wav differ diff --git a/sound/direct_sound_samples/cries/vaporeon.aif b/sound/direct_sound_samples/cries/vaporeon.aif deleted file mode 100644 index 3c9bf7ee8b79..000000000000 Binary files a/sound/direct_sound_samples/cries/vaporeon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/vaporeon.wav b/sound/direct_sound_samples/cries/vaporeon.wav new file mode 100644 index 000000000000..8ec30948512d Binary files /dev/null and b/sound/direct_sound_samples/cries/vaporeon.wav differ diff --git a/sound/direct_sound_samples/cries/varoom.aif b/sound/direct_sound_samples/cries/varoom.aif deleted file mode 100644 index 731bdce2d6be..000000000000 Binary files a/sound/direct_sound_samples/cries/varoom.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/varoom.wav b/sound/direct_sound_samples/cries/varoom.wav new file mode 100644 index 000000000000..1774dd3dc477 Binary files /dev/null and b/sound/direct_sound_samples/cries/varoom.wav differ diff --git a/sound/direct_sound_samples/cries/veluza.aif b/sound/direct_sound_samples/cries/veluza.aif deleted file mode 100644 index d76ed74b6698..000000000000 Binary files a/sound/direct_sound_samples/cries/veluza.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/veluza.wav b/sound/direct_sound_samples/cries/veluza.wav new file mode 100644 index 000000000000..731b664ac346 Binary files /dev/null and b/sound/direct_sound_samples/cries/veluza.wav differ diff --git a/sound/direct_sound_samples/cries/venipede.aif b/sound/direct_sound_samples/cries/venipede.aif deleted file mode 100644 index d1c1e04e7bad..000000000000 Binary files a/sound/direct_sound_samples/cries/venipede.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/venipede.wav b/sound/direct_sound_samples/cries/venipede.wav new file mode 100644 index 000000000000..c1b88a3e25ce Binary files /dev/null and b/sound/direct_sound_samples/cries/venipede.wav differ diff --git a/sound/direct_sound_samples/cries/venomoth.aif b/sound/direct_sound_samples/cries/venomoth.aif deleted file mode 100644 index eb4ad02af793..000000000000 Binary files a/sound/direct_sound_samples/cries/venomoth.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/venomoth.wav b/sound/direct_sound_samples/cries/venomoth.wav new file mode 100644 index 000000000000..ab5179df661b Binary files /dev/null and b/sound/direct_sound_samples/cries/venomoth.wav differ diff --git a/sound/direct_sound_samples/cries/venonat.aif b/sound/direct_sound_samples/cries/venonat.aif deleted file mode 100644 index 5bf36808c417..000000000000 Binary files a/sound/direct_sound_samples/cries/venonat.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/venonat.wav b/sound/direct_sound_samples/cries/venonat.wav new file mode 100644 index 000000000000..450c2bb22240 Binary files /dev/null and b/sound/direct_sound_samples/cries/venonat.wav differ diff --git a/sound/direct_sound_samples/cries/venusaur.aif b/sound/direct_sound_samples/cries/venusaur.aif deleted file mode 100644 index 91386c177ddc..000000000000 Binary files a/sound/direct_sound_samples/cries/venusaur.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/venusaur.wav b/sound/direct_sound_samples/cries/venusaur.wav new file mode 100644 index 000000000000..fdd299ae2771 Binary files /dev/null and b/sound/direct_sound_samples/cries/venusaur.wav differ diff --git a/sound/direct_sound_samples/cries/venusaur_mega.aif b/sound/direct_sound_samples/cries/venusaur_mega.aif deleted file mode 100644 index cec11aaae2a2..000000000000 Binary files a/sound/direct_sound_samples/cries/venusaur_mega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/venusaur_mega.wav b/sound/direct_sound_samples/cries/venusaur_mega.wav new file mode 100644 index 000000000000..e8e01ee0c3b5 Binary files /dev/null and b/sound/direct_sound_samples/cries/venusaur_mega.wav differ diff --git a/sound/direct_sound_samples/cries/vespiquen.aif b/sound/direct_sound_samples/cries/vespiquen.aif deleted file mode 100644 index c86e9a403bbb..000000000000 Binary files a/sound/direct_sound_samples/cries/vespiquen.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/vespiquen.wav b/sound/direct_sound_samples/cries/vespiquen.wav new file mode 100644 index 000000000000..a1fdfe215c9e Binary files /dev/null and b/sound/direct_sound_samples/cries/vespiquen.wav differ diff --git a/sound/direct_sound_samples/cries/vibrava.aif b/sound/direct_sound_samples/cries/vibrava.aif deleted file mode 100644 index 7e0a13c6df52..000000000000 Binary files a/sound/direct_sound_samples/cries/vibrava.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/vibrava.wav b/sound/direct_sound_samples/cries/vibrava.wav new file mode 100644 index 000000000000..537010487544 Binary files /dev/null and b/sound/direct_sound_samples/cries/vibrava.wav differ diff --git a/sound/direct_sound_samples/cries/victini.aif b/sound/direct_sound_samples/cries/victini.aif deleted file mode 100644 index cada6fbf078f..000000000000 Binary files a/sound/direct_sound_samples/cries/victini.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/victini.wav b/sound/direct_sound_samples/cries/victini.wav new file mode 100644 index 000000000000..381efef3f63e Binary files /dev/null and b/sound/direct_sound_samples/cries/victini.wav differ diff --git a/sound/direct_sound_samples/cries/victreebel.aif b/sound/direct_sound_samples/cries/victreebel.aif deleted file mode 100644 index 62bb048d4c70..000000000000 Binary files a/sound/direct_sound_samples/cries/victreebel.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/victreebel.wav b/sound/direct_sound_samples/cries/victreebel.wav new file mode 100644 index 000000000000..19f11202f95e Binary files /dev/null and b/sound/direct_sound_samples/cries/victreebel.wav differ diff --git a/sound/direct_sound_samples/cries/vigoroth.aif b/sound/direct_sound_samples/cries/vigoroth.aif deleted file mode 100644 index 8e3560ab1dfc..000000000000 Binary files a/sound/direct_sound_samples/cries/vigoroth.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/vigoroth.wav b/sound/direct_sound_samples/cries/vigoroth.wav new file mode 100644 index 000000000000..5d21bd23b0ca Binary files /dev/null and b/sound/direct_sound_samples/cries/vigoroth.wav differ diff --git a/sound/direct_sound_samples/cries/vikavolt.aif b/sound/direct_sound_samples/cries/vikavolt.aif deleted file mode 100644 index badd95c3c51a..000000000000 Binary files a/sound/direct_sound_samples/cries/vikavolt.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/vikavolt.wav b/sound/direct_sound_samples/cries/vikavolt.wav new file mode 100644 index 000000000000..ac1d36312019 Binary files /dev/null and b/sound/direct_sound_samples/cries/vikavolt.wav differ diff --git a/sound/direct_sound_samples/cries/vileplume.aif b/sound/direct_sound_samples/cries/vileplume.aif deleted file mode 100644 index e190e2151172..000000000000 Binary files a/sound/direct_sound_samples/cries/vileplume.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/vileplume.wav b/sound/direct_sound_samples/cries/vileplume.wav new file mode 100644 index 000000000000..7189097b1849 Binary files /dev/null and b/sound/direct_sound_samples/cries/vileplume.wav differ diff --git a/sound/direct_sound_samples/cries/virizion.aif b/sound/direct_sound_samples/cries/virizion.aif deleted file mode 100644 index 7f1d8292b022..000000000000 Binary files a/sound/direct_sound_samples/cries/virizion.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/virizion.wav b/sound/direct_sound_samples/cries/virizion.wav new file mode 100644 index 000000000000..4254006b8cc1 Binary files /dev/null and b/sound/direct_sound_samples/cries/virizion.wav differ diff --git a/sound/direct_sound_samples/cries/vivillon.aif b/sound/direct_sound_samples/cries/vivillon.aif deleted file mode 100644 index bf7474dd9544..000000000000 Binary files a/sound/direct_sound_samples/cries/vivillon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/vivillon.wav b/sound/direct_sound_samples/cries/vivillon.wav new file mode 100644 index 000000000000..e681a1011a58 Binary files /dev/null and b/sound/direct_sound_samples/cries/vivillon.wav differ diff --git a/sound/direct_sound_samples/cries/volbeat.aif b/sound/direct_sound_samples/cries/volbeat.aif deleted file mode 100644 index 8d73e2c21db4..000000000000 Binary files a/sound/direct_sound_samples/cries/volbeat.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/volbeat.wav b/sound/direct_sound_samples/cries/volbeat.wav new file mode 100644 index 000000000000..ae6375b95f9a Binary files /dev/null and b/sound/direct_sound_samples/cries/volbeat.wav differ diff --git a/sound/direct_sound_samples/cries/volcanion.aif b/sound/direct_sound_samples/cries/volcanion.aif deleted file mode 100644 index 72c78807a6ee..000000000000 Binary files a/sound/direct_sound_samples/cries/volcanion.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/volcanion.wav b/sound/direct_sound_samples/cries/volcanion.wav new file mode 100644 index 000000000000..47b59afb3eba Binary files /dev/null and b/sound/direct_sound_samples/cries/volcanion.wav differ diff --git a/sound/direct_sound_samples/cries/volcarona.aif b/sound/direct_sound_samples/cries/volcarona.aif deleted file mode 100644 index f62e6e9e38a1..000000000000 Binary files a/sound/direct_sound_samples/cries/volcarona.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/volcarona.wav b/sound/direct_sound_samples/cries/volcarona.wav new file mode 100644 index 000000000000..53b0fde6bce0 Binary files /dev/null and b/sound/direct_sound_samples/cries/volcarona.wav differ diff --git a/sound/direct_sound_samples/cries/voltorb.aif b/sound/direct_sound_samples/cries/voltorb.aif deleted file mode 100644 index 832429cbf2cb..000000000000 Binary files a/sound/direct_sound_samples/cries/voltorb.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/voltorb.wav b/sound/direct_sound_samples/cries/voltorb.wav new file mode 100644 index 000000000000..e303a3db73d6 Binary files /dev/null and b/sound/direct_sound_samples/cries/voltorb.wav differ diff --git a/sound/direct_sound_samples/cries/vullaby.aif b/sound/direct_sound_samples/cries/vullaby.aif deleted file mode 100644 index 49d0648e9ff8..000000000000 Binary files a/sound/direct_sound_samples/cries/vullaby.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/vullaby.wav b/sound/direct_sound_samples/cries/vullaby.wav new file mode 100644 index 000000000000..7be4f722c6f8 Binary files /dev/null and b/sound/direct_sound_samples/cries/vullaby.wav differ diff --git a/sound/direct_sound_samples/cries/vulpix.aif b/sound/direct_sound_samples/cries/vulpix.aif deleted file mode 100644 index 32b149999e29..000000000000 Binary files a/sound/direct_sound_samples/cries/vulpix.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/vulpix.wav b/sound/direct_sound_samples/cries/vulpix.wav new file mode 100644 index 000000000000..71d58b0a72a3 Binary files /dev/null and b/sound/direct_sound_samples/cries/vulpix.wav differ diff --git a/sound/direct_sound_samples/cries/wailmer.aif b/sound/direct_sound_samples/cries/wailmer.aif deleted file mode 100644 index 8bada495e4c4..000000000000 Binary files a/sound/direct_sound_samples/cries/wailmer.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/wailmer.wav b/sound/direct_sound_samples/cries/wailmer.wav new file mode 100644 index 000000000000..ef43c515fd1b Binary files /dev/null and b/sound/direct_sound_samples/cries/wailmer.wav differ diff --git a/sound/direct_sound_samples/cries/wailord.aif b/sound/direct_sound_samples/cries/wailord.aif deleted file mode 100644 index ea0f553cf843..000000000000 Binary files a/sound/direct_sound_samples/cries/wailord.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/wailord.wav b/sound/direct_sound_samples/cries/wailord.wav new file mode 100644 index 000000000000..a7e9d89f695c Binary files /dev/null and b/sound/direct_sound_samples/cries/wailord.wav differ diff --git a/sound/direct_sound_samples/cries/walking_wake.aif b/sound/direct_sound_samples/cries/walking_wake.aif deleted file mode 100644 index 88518dd20053..000000000000 Binary files a/sound/direct_sound_samples/cries/walking_wake.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/walking_wake.wav b/sound/direct_sound_samples/cries/walking_wake.wav new file mode 100644 index 000000000000..ea856c0cf70b Binary files /dev/null and b/sound/direct_sound_samples/cries/walking_wake.wav differ diff --git a/sound/direct_sound_samples/cries/walrein.aif b/sound/direct_sound_samples/cries/walrein.aif deleted file mode 100644 index 2843617fbfe0..000000000000 Binary files a/sound/direct_sound_samples/cries/walrein.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/walrein.wav b/sound/direct_sound_samples/cries/walrein.wav new file mode 100644 index 000000000000..cbc5fa8cb42a Binary files /dev/null and b/sound/direct_sound_samples/cries/walrein.wav differ diff --git a/sound/direct_sound_samples/cries/wartortle.aif b/sound/direct_sound_samples/cries/wartortle.aif deleted file mode 100644 index de2aa254805b..000000000000 Binary files a/sound/direct_sound_samples/cries/wartortle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/wartortle.wav b/sound/direct_sound_samples/cries/wartortle.wav new file mode 100644 index 000000000000..950f87d74b2e Binary files /dev/null and b/sound/direct_sound_samples/cries/wartortle.wav differ diff --git a/sound/direct_sound_samples/cries/watchog.aif b/sound/direct_sound_samples/cries/watchog.aif deleted file mode 100644 index df08e7a29649..000000000000 Binary files a/sound/direct_sound_samples/cries/watchog.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/watchog.wav b/sound/direct_sound_samples/cries/watchog.wav new file mode 100644 index 000000000000..f69adc8aefc1 Binary files /dev/null and b/sound/direct_sound_samples/cries/watchog.wav differ diff --git a/sound/direct_sound_samples/cries/wattrel.aif b/sound/direct_sound_samples/cries/wattrel.aif deleted file mode 100644 index 361ead83565c..000000000000 Binary files a/sound/direct_sound_samples/cries/wattrel.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/wattrel.wav b/sound/direct_sound_samples/cries/wattrel.wav new file mode 100644 index 000000000000..b803ef40421a Binary files /dev/null and b/sound/direct_sound_samples/cries/wattrel.wav differ diff --git a/sound/direct_sound_samples/cries/weavile.aif b/sound/direct_sound_samples/cries/weavile.aif deleted file mode 100644 index 5bfb5019dfd7..000000000000 Binary files a/sound/direct_sound_samples/cries/weavile.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/weavile.wav b/sound/direct_sound_samples/cries/weavile.wav new file mode 100644 index 000000000000..36b88753739f Binary files /dev/null and b/sound/direct_sound_samples/cries/weavile.wav differ diff --git a/sound/direct_sound_samples/cries/weedle.aif b/sound/direct_sound_samples/cries/weedle.aif deleted file mode 100644 index ac5b0eb76524..000000000000 Binary files a/sound/direct_sound_samples/cries/weedle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/weedle.wav b/sound/direct_sound_samples/cries/weedle.wav new file mode 100644 index 000000000000..6a209fede123 Binary files /dev/null and b/sound/direct_sound_samples/cries/weedle.wav differ diff --git a/sound/direct_sound_samples/cries/weepinbell.aif b/sound/direct_sound_samples/cries/weepinbell.aif deleted file mode 100644 index 0b20df8089fe..000000000000 Binary files a/sound/direct_sound_samples/cries/weepinbell.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/weepinbell.wav b/sound/direct_sound_samples/cries/weepinbell.wav new file mode 100644 index 000000000000..48f7225cf581 Binary files /dev/null and b/sound/direct_sound_samples/cries/weepinbell.wav differ diff --git a/sound/direct_sound_samples/cries/weezing.aif b/sound/direct_sound_samples/cries/weezing.aif deleted file mode 100644 index b7b8d93da517..000000000000 Binary files a/sound/direct_sound_samples/cries/weezing.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/weezing.wav b/sound/direct_sound_samples/cries/weezing.wav new file mode 100644 index 000000000000..b5a7b189d038 Binary files /dev/null and b/sound/direct_sound_samples/cries/weezing.wav differ diff --git a/sound/direct_sound_samples/cries/whimsicott.aif b/sound/direct_sound_samples/cries/whimsicott.aif deleted file mode 100644 index 873d8a1b4197..000000000000 Binary files a/sound/direct_sound_samples/cries/whimsicott.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/whimsicott.wav b/sound/direct_sound_samples/cries/whimsicott.wav new file mode 100644 index 000000000000..712aab7154a2 Binary files /dev/null and b/sound/direct_sound_samples/cries/whimsicott.wav differ diff --git a/sound/direct_sound_samples/cries/whirlipede.aif b/sound/direct_sound_samples/cries/whirlipede.aif deleted file mode 100644 index c9b64404b8af..000000000000 Binary files a/sound/direct_sound_samples/cries/whirlipede.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/whirlipede.wav b/sound/direct_sound_samples/cries/whirlipede.wav new file mode 100644 index 000000000000..c468feb0f5b6 Binary files /dev/null and b/sound/direct_sound_samples/cries/whirlipede.wav differ diff --git a/sound/direct_sound_samples/cries/whiscash.aif b/sound/direct_sound_samples/cries/whiscash.aif deleted file mode 100644 index 71cd9fd00a8b..000000000000 Binary files a/sound/direct_sound_samples/cries/whiscash.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/whiscash.wav b/sound/direct_sound_samples/cries/whiscash.wav new file mode 100644 index 000000000000..ebec93d188a7 Binary files /dev/null and b/sound/direct_sound_samples/cries/whiscash.wav differ diff --git a/sound/direct_sound_samples/cries/whismur.aif b/sound/direct_sound_samples/cries/whismur.aif deleted file mode 100644 index c5a2369ba9d5..000000000000 Binary files a/sound/direct_sound_samples/cries/whismur.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/whismur.wav b/sound/direct_sound_samples/cries/whismur.wav new file mode 100644 index 000000000000..af3e3e0e31cd Binary files /dev/null and b/sound/direct_sound_samples/cries/whismur.wav differ diff --git a/sound/direct_sound_samples/cries/wigglytuff.aif b/sound/direct_sound_samples/cries/wigglytuff.aif deleted file mode 100644 index 07fcc8ebd318..000000000000 Binary files a/sound/direct_sound_samples/cries/wigglytuff.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/wigglytuff.wav b/sound/direct_sound_samples/cries/wigglytuff.wav new file mode 100644 index 000000000000..a6b632a6ce37 Binary files /dev/null and b/sound/direct_sound_samples/cries/wigglytuff.wav differ diff --git a/sound/direct_sound_samples/cries/wiglett.aif b/sound/direct_sound_samples/cries/wiglett.aif deleted file mode 100644 index d377681aef48..000000000000 Binary files a/sound/direct_sound_samples/cries/wiglett.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/wiglett.wav b/sound/direct_sound_samples/cries/wiglett.wav new file mode 100644 index 000000000000..c555b6035ef2 Binary files /dev/null and b/sound/direct_sound_samples/cries/wiglett.wav differ diff --git a/sound/direct_sound_samples/cries/wimpod.aif b/sound/direct_sound_samples/cries/wimpod.aif deleted file mode 100644 index 5b7596409657..000000000000 Binary files a/sound/direct_sound_samples/cries/wimpod.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/wimpod.wav b/sound/direct_sound_samples/cries/wimpod.wav new file mode 100644 index 000000000000..36b28c501dad Binary files /dev/null and b/sound/direct_sound_samples/cries/wimpod.wav differ diff --git a/sound/direct_sound_samples/cries/wingull.aif b/sound/direct_sound_samples/cries/wingull.aif deleted file mode 100644 index 49b04d9d96ca..000000000000 Binary files a/sound/direct_sound_samples/cries/wingull.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/wingull.wav b/sound/direct_sound_samples/cries/wingull.wav new file mode 100644 index 000000000000..4e158409add4 Binary files /dev/null and b/sound/direct_sound_samples/cries/wingull.wav differ diff --git a/sound/direct_sound_samples/cries/wishiwashi_school.aif b/sound/direct_sound_samples/cries/wishiwashi_school.aif deleted file mode 100644 index e63ce913a26a..000000000000 Binary files a/sound/direct_sound_samples/cries/wishiwashi_school.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/wishiwashi_school.wav b/sound/direct_sound_samples/cries/wishiwashi_school.wav new file mode 100644 index 000000000000..ef49075f1cb2 Binary files /dev/null and b/sound/direct_sound_samples/cries/wishiwashi_school.wav differ diff --git a/sound/direct_sound_samples/cries/wishiwashi_solo.aif b/sound/direct_sound_samples/cries/wishiwashi_solo.aif deleted file mode 100644 index e6e26b75c6b9..000000000000 Binary files a/sound/direct_sound_samples/cries/wishiwashi_solo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/wishiwashi_solo.wav b/sound/direct_sound_samples/cries/wishiwashi_solo.wav new file mode 100644 index 000000000000..456a7c74f81e Binary files /dev/null and b/sound/direct_sound_samples/cries/wishiwashi_solo.wav differ diff --git a/sound/direct_sound_samples/cries/wo_chien.aif b/sound/direct_sound_samples/cries/wo_chien.aif deleted file mode 100644 index f50bd73e8d42..000000000000 Binary files a/sound/direct_sound_samples/cries/wo_chien.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/wo_chien.wav b/sound/direct_sound_samples/cries/wo_chien.wav new file mode 100644 index 000000000000..562665fee38f Binary files /dev/null and b/sound/direct_sound_samples/cries/wo_chien.wav differ diff --git a/sound/direct_sound_samples/cries/wobbuffet.aif b/sound/direct_sound_samples/cries/wobbuffet.aif deleted file mode 100644 index 8e50da47bbf5..000000000000 Binary files a/sound/direct_sound_samples/cries/wobbuffet.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/wobbuffet.wav b/sound/direct_sound_samples/cries/wobbuffet.wav new file mode 100644 index 000000000000..17e7464ad978 Binary files /dev/null and b/sound/direct_sound_samples/cries/wobbuffet.wav differ diff --git a/sound/direct_sound_samples/cries/woobat.aif b/sound/direct_sound_samples/cries/woobat.aif deleted file mode 100644 index db8ae140e219..000000000000 Binary files a/sound/direct_sound_samples/cries/woobat.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/woobat.wav b/sound/direct_sound_samples/cries/woobat.wav new file mode 100644 index 000000000000..e8d3523e83be Binary files /dev/null and b/sound/direct_sound_samples/cries/woobat.wav differ diff --git a/sound/direct_sound_samples/cries/wooloo.aif b/sound/direct_sound_samples/cries/wooloo.aif deleted file mode 100644 index db1360386c13..000000000000 Binary files a/sound/direct_sound_samples/cries/wooloo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/wooloo.wav b/sound/direct_sound_samples/cries/wooloo.wav new file mode 100644 index 000000000000..adc8ad4ade09 Binary files /dev/null and b/sound/direct_sound_samples/cries/wooloo.wav differ diff --git a/sound/direct_sound_samples/cries/wooper.aif b/sound/direct_sound_samples/cries/wooper.aif deleted file mode 100644 index d4b9ea1b4a25..000000000000 Binary files a/sound/direct_sound_samples/cries/wooper.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/wooper.wav b/sound/direct_sound_samples/cries/wooper.wav new file mode 100644 index 000000000000..83c7e589df12 Binary files /dev/null and b/sound/direct_sound_samples/cries/wooper.wav differ diff --git a/sound/direct_sound_samples/cries/wormadam.aif b/sound/direct_sound_samples/cries/wormadam.aif deleted file mode 100644 index 364510820687..000000000000 Binary files a/sound/direct_sound_samples/cries/wormadam.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/wormadam.wav b/sound/direct_sound_samples/cries/wormadam.wav new file mode 100644 index 000000000000..f03247f1dd41 Binary files /dev/null and b/sound/direct_sound_samples/cries/wormadam.wav differ diff --git a/sound/direct_sound_samples/cries/wugtrio.aif b/sound/direct_sound_samples/cries/wugtrio.aif deleted file mode 100644 index 6c92cae87391..000000000000 Binary files a/sound/direct_sound_samples/cries/wugtrio.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/wugtrio.wav b/sound/direct_sound_samples/cries/wugtrio.wav new file mode 100644 index 000000000000..d885b422f383 Binary files /dev/null and b/sound/direct_sound_samples/cries/wugtrio.wav differ diff --git a/sound/direct_sound_samples/cries/wurmple.aif b/sound/direct_sound_samples/cries/wurmple.aif deleted file mode 100644 index 1754d7e2b7e2..000000000000 Binary files a/sound/direct_sound_samples/cries/wurmple.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/wurmple.wav b/sound/direct_sound_samples/cries/wurmple.wav new file mode 100644 index 000000000000..b58d5007cf3b Binary files /dev/null and b/sound/direct_sound_samples/cries/wurmple.wav differ diff --git a/sound/direct_sound_samples/cries/wynaut.aif b/sound/direct_sound_samples/cries/wynaut.aif deleted file mode 100644 index ddd289f9a485..000000000000 Binary files a/sound/direct_sound_samples/cries/wynaut.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/wynaut.wav b/sound/direct_sound_samples/cries/wynaut.wav new file mode 100644 index 000000000000..6febe26aa483 Binary files /dev/null and b/sound/direct_sound_samples/cries/wynaut.wav differ diff --git a/sound/direct_sound_samples/cries/wyrdeer.aif b/sound/direct_sound_samples/cries/wyrdeer.aif deleted file mode 100644 index 597df62ab82e..000000000000 Binary files a/sound/direct_sound_samples/cries/wyrdeer.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/wyrdeer.wav b/sound/direct_sound_samples/cries/wyrdeer.wav new file mode 100644 index 000000000000..50bba2a433ec Binary files /dev/null and b/sound/direct_sound_samples/cries/wyrdeer.wav differ diff --git a/sound/direct_sound_samples/cries/xatu.aif b/sound/direct_sound_samples/cries/xatu.aif deleted file mode 100644 index da4afe62caf5..000000000000 Binary files a/sound/direct_sound_samples/cries/xatu.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/xatu.wav b/sound/direct_sound_samples/cries/xatu.wav new file mode 100644 index 000000000000..7c84f65723bb Binary files /dev/null and b/sound/direct_sound_samples/cries/xatu.wav differ diff --git a/sound/direct_sound_samples/cries/xerneas.aif b/sound/direct_sound_samples/cries/xerneas.aif deleted file mode 100644 index 4745e8e68568..000000000000 Binary files a/sound/direct_sound_samples/cries/xerneas.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/xerneas.wav b/sound/direct_sound_samples/cries/xerneas.wav new file mode 100644 index 000000000000..f08dd0ca933e Binary files /dev/null and b/sound/direct_sound_samples/cries/xerneas.wav differ diff --git a/sound/direct_sound_samples/cries/xurkitree.aif b/sound/direct_sound_samples/cries/xurkitree.aif deleted file mode 100644 index 3b0f5f381258..000000000000 Binary files a/sound/direct_sound_samples/cries/xurkitree.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/xurkitree.wav b/sound/direct_sound_samples/cries/xurkitree.wav new file mode 100644 index 000000000000..2c521b1f2c7f Binary files /dev/null and b/sound/direct_sound_samples/cries/xurkitree.wav differ diff --git a/sound/direct_sound_samples/cries/yamask.aif b/sound/direct_sound_samples/cries/yamask.aif deleted file mode 100644 index 51f07034b860..000000000000 Binary files a/sound/direct_sound_samples/cries/yamask.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/yamask.wav b/sound/direct_sound_samples/cries/yamask.wav new file mode 100644 index 000000000000..e04533c5af56 Binary files /dev/null and b/sound/direct_sound_samples/cries/yamask.wav differ diff --git a/sound/direct_sound_samples/cries/yamper.aif b/sound/direct_sound_samples/cries/yamper.aif deleted file mode 100644 index c57246e4adff..000000000000 Binary files a/sound/direct_sound_samples/cries/yamper.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/yamper.wav b/sound/direct_sound_samples/cries/yamper.wav new file mode 100644 index 000000000000..ad8491f1f10b Binary files /dev/null and b/sound/direct_sound_samples/cries/yamper.wav differ diff --git a/sound/direct_sound_samples/cries/yanma.aif b/sound/direct_sound_samples/cries/yanma.aif deleted file mode 100644 index 3d8354bb5921..000000000000 Binary files a/sound/direct_sound_samples/cries/yanma.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/yanma.wav b/sound/direct_sound_samples/cries/yanma.wav new file mode 100644 index 000000000000..166b3736168e Binary files /dev/null and b/sound/direct_sound_samples/cries/yanma.wav differ diff --git a/sound/direct_sound_samples/cries/yanmega.aif b/sound/direct_sound_samples/cries/yanmega.aif deleted file mode 100644 index 6f3a3eb2dd93..000000000000 Binary files a/sound/direct_sound_samples/cries/yanmega.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/yanmega.wav b/sound/direct_sound_samples/cries/yanmega.wav new file mode 100644 index 000000000000..b46468671318 Binary files /dev/null and b/sound/direct_sound_samples/cries/yanmega.wav differ diff --git a/sound/direct_sound_samples/cries/yungoos.aif b/sound/direct_sound_samples/cries/yungoos.aif deleted file mode 100644 index 13b633a98af8..000000000000 Binary files a/sound/direct_sound_samples/cries/yungoos.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/yungoos.wav b/sound/direct_sound_samples/cries/yungoos.wav new file mode 100644 index 000000000000..94a83e9223e6 Binary files /dev/null and b/sound/direct_sound_samples/cries/yungoos.wav differ diff --git a/sound/direct_sound_samples/cries/yveltal.aif b/sound/direct_sound_samples/cries/yveltal.aif deleted file mode 100644 index 3c2bbcb02116..000000000000 Binary files a/sound/direct_sound_samples/cries/yveltal.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/yveltal.wav b/sound/direct_sound_samples/cries/yveltal.wav new file mode 100644 index 000000000000..5bc4fec4fee9 Binary files /dev/null and b/sound/direct_sound_samples/cries/yveltal.wav differ diff --git a/sound/direct_sound_samples/cries/zacian_crowned_sword.aif b/sound/direct_sound_samples/cries/zacian_crowned_sword.aif deleted file mode 100644 index 597c5ddd2661..000000000000 Binary files a/sound/direct_sound_samples/cries/zacian_crowned_sword.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/zacian_crowned_sword.wav b/sound/direct_sound_samples/cries/zacian_crowned_sword.wav new file mode 100644 index 000000000000..ee135a12bc19 Binary files /dev/null and b/sound/direct_sound_samples/cries/zacian_crowned_sword.wav differ diff --git a/sound/direct_sound_samples/cries/zacian_hero_of_many_battles.aif b/sound/direct_sound_samples/cries/zacian_hero_of_many_battles.aif deleted file mode 100644 index f67d8573324f..000000000000 Binary files a/sound/direct_sound_samples/cries/zacian_hero_of_many_battles.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/zacian_hero_of_many_battles.wav b/sound/direct_sound_samples/cries/zacian_hero_of_many_battles.wav new file mode 100644 index 000000000000..d3354b55a2c6 Binary files /dev/null and b/sound/direct_sound_samples/cries/zacian_hero_of_many_battles.wav differ diff --git a/sound/direct_sound_samples/cries/zamazenta_crowned_shield.aif b/sound/direct_sound_samples/cries/zamazenta_crowned_shield.aif deleted file mode 100644 index 05d170baba4a..000000000000 Binary files a/sound/direct_sound_samples/cries/zamazenta_crowned_shield.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/zamazenta_crowned_shield.wav b/sound/direct_sound_samples/cries/zamazenta_crowned_shield.wav new file mode 100644 index 000000000000..f4fad6e6b0fc Binary files /dev/null and b/sound/direct_sound_samples/cries/zamazenta_crowned_shield.wav differ diff --git a/sound/direct_sound_samples/cries/zamazenta_hero_of_many_battles.aif b/sound/direct_sound_samples/cries/zamazenta_hero_of_many_battles.aif deleted file mode 100644 index 3674b2937fbb..000000000000 Binary files a/sound/direct_sound_samples/cries/zamazenta_hero_of_many_battles.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/zamazenta_hero_of_many_battles.wav b/sound/direct_sound_samples/cries/zamazenta_hero_of_many_battles.wav new file mode 100644 index 000000000000..50c1b217a01e Binary files /dev/null and b/sound/direct_sound_samples/cries/zamazenta_hero_of_many_battles.wav differ diff --git a/sound/direct_sound_samples/cries/zangoose.aif b/sound/direct_sound_samples/cries/zangoose.aif deleted file mode 100644 index dc6182b784c0..000000000000 Binary files a/sound/direct_sound_samples/cries/zangoose.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/zangoose.wav b/sound/direct_sound_samples/cries/zangoose.wav new file mode 100644 index 000000000000..b1e3e9ffc376 Binary files /dev/null and b/sound/direct_sound_samples/cries/zangoose.wav differ diff --git a/sound/direct_sound_samples/cries/zapdos.aif b/sound/direct_sound_samples/cries/zapdos.aif deleted file mode 100644 index 83bbd043e427..000000000000 Binary files a/sound/direct_sound_samples/cries/zapdos.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/zapdos.wav b/sound/direct_sound_samples/cries/zapdos.wav new file mode 100644 index 000000000000..58415b934444 Binary files /dev/null and b/sound/direct_sound_samples/cries/zapdos.wav differ diff --git a/sound/direct_sound_samples/cries/zarude.aif b/sound/direct_sound_samples/cries/zarude.aif deleted file mode 100644 index d1a2a76aa4a0..000000000000 Binary files a/sound/direct_sound_samples/cries/zarude.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/zarude.wav b/sound/direct_sound_samples/cries/zarude.wav new file mode 100644 index 000000000000..252ff5257307 Binary files /dev/null and b/sound/direct_sound_samples/cries/zarude.wav differ diff --git a/sound/direct_sound_samples/cries/zebstrika.aif b/sound/direct_sound_samples/cries/zebstrika.aif deleted file mode 100644 index 0609b145b21e..000000000000 Binary files a/sound/direct_sound_samples/cries/zebstrika.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/zebstrika.wav b/sound/direct_sound_samples/cries/zebstrika.wav new file mode 100644 index 000000000000..f6f305f66cd2 Binary files /dev/null and b/sound/direct_sound_samples/cries/zebstrika.wav differ diff --git a/sound/direct_sound_samples/cries/zekrom.aif b/sound/direct_sound_samples/cries/zekrom.aif deleted file mode 100644 index dd74f8091109..000000000000 Binary files a/sound/direct_sound_samples/cries/zekrom.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/zekrom.wav b/sound/direct_sound_samples/cries/zekrom.wav new file mode 100644 index 000000000000..61a2b1e6c36c Binary files /dev/null and b/sound/direct_sound_samples/cries/zekrom.wav differ diff --git a/sound/direct_sound_samples/cries/zeraora.aif b/sound/direct_sound_samples/cries/zeraora.aif deleted file mode 100644 index b1455a010052..000000000000 Binary files a/sound/direct_sound_samples/cries/zeraora.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/zeraora.wav b/sound/direct_sound_samples/cries/zeraora.wav new file mode 100644 index 000000000000..570cb398bbff Binary files /dev/null and b/sound/direct_sound_samples/cries/zeraora.wav differ diff --git a/sound/direct_sound_samples/cries/zigzagoon.aif b/sound/direct_sound_samples/cries/zigzagoon.aif deleted file mode 100644 index 8f7b32f8189a..000000000000 Binary files a/sound/direct_sound_samples/cries/zigzagoon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/zigzagoon.wav b/sound/direct_sound_samples/cries/zigzagoon.wav new file mode 100644 index 000000000000..ac0b68edcde0 Binary files /dev/null and b/sound/direct_sound_samples/cries/zigzagoon.wav differ diff --git a/sound/direct_sound_samples/cries/zoroark.aif b/sound/direct_sound_samples/cries/zoroark.aif deleted file mode 100644 index 91e7ab0ce97f..000000000000 Binary files a/sound/direct_sound_samples/cries/zoroark.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/zoroark.wav b/sound/direct_sound_samples/cries/zoroark.wav new file mode 100644 index 000000000000..34b6f1241d66 Binary files /dev/null and b/sound/direct_sound_samples/cries/zoroark.wav differ diff --git a/sound/direct_sound_samples/cries/zorua.aif b/sound/direct_sound_samples/cries/zorua.aif deleted file mode 100644 index 674681f5bc46..000000000000 Binary files a/sound/direct_sound_samples/cries/zorua.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/zorua.wav b/sound/direct_sound_samples/cries/zorua.wav new file mode 100644 index 000000000000..fe7c4ed8c60d Binary files /dev/null and b/sound/direct_sound_samples/cries/zorua.wav differ diff --git a/sound/direct_sound_samples/cries/zubat.aif b/sound/direct_sound_samples/cries/zubat.aif deleted file mode 100644 index 9ba4d364891c..000000000000 Binary files a/sound/direct_sound_samples/cries/zubat.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/zubat.wav b/sound/direct_sound_samples/cries/zubat.wav new file mode 100644 index 000000000000..dc0756a06de0 Binary files /dev/null and b/sound/direct_sound_samples/cries/zubat.wav differ diff --git a/sound/direct_sound_samples/cries/zweilous.aif b/sound/direct_sound_samples/cries/zweilous.aif deleted file mode 100644 index fc9a366ce9e9..000000000000 Binary files a/sound/direct_sound_samples/cries/zweilous.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/zweilous.wav b/sound/direct_sound_samples/cries/zweilous.wav new file mode 100644 index 000000000000..5474c4681c6a Binary files /dev/null and b/sound/direct_sound_samples/cries/zweilous.wav differ diff --git a/sound/direct_sound_samples/cries/zygarde_10.aif b/sound/direct_sound_samples/cries/zygarde_10.aif deleted file mode 100644 index a8301cdc16ba..000000000000 Binary files a/sound/direct_sound_samples/cries/zygarde_10.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/zygarde_10.wav b/sound/direct_sound_samples/cries/zygarde_10.wav new file mode 100644 index 000000000000..da90abe5bb78 Binary files /dev/null and b/sound/direct_sound_samples/cries/zygarde_10.wav differ diff --git a/sound/direct_sound_samples/cries/zygarde_50.aif b/sound/direct_sound_samples/cries/zygarde_50.aif deleted file mode 100644 index 92daba8bcb0b..000000000000 Binary files a/sound/direct_sound_samples/cries/zygarde_50.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/zygarde_50.wav b/sound/direct_sound_samples/cries/zygarde_50.wav new file mode 100644 index 000000000000..5bfe28b2ac69 Binary files /dev/null and b/sound/direct_sound_samples/cries/zygarde_50.wav differ diff --git a/sound/direct_sound_samples/cries/zygarde_complete.aif b/sound/direct_sound_samples/cries/zygarde_complete.aif deleted file mode 100644 index 2eae63203b66..000000000000 Binary files a/sound/direct_sound_samples/cries/zygarde_complete.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cries/zygarde_complete.wav b/sound/direct_sound_samples/cries/zygarde_complete.wav new file mode 100644 index 000000000000..5e295a06450a Binary files /dev/null and b/sound/direct_sound_samples/cries/zygarde_complete.wav differ diff --git a/sound/direct_sound_samples/dance_drums_ride_bell.aif b/sound/direct_sound_samples/dance_drums_ride_bell.aif deleted file mode 100644 index db36a54bd056..000000000000 Binary files a/sound/direct_sound_samples/dance_drums_ride_bell.aif and /dev/null differ diff --git a/sound/direct_sound_samples/dance_drums_ride_bell.wav b/sound/direct_sound_samples/dance_drums_ride_bell.wav new file mode 100644 index 000000000000..a79a5c26f9a0 Binary files /dev/null and b/sound/direct_sound_samples/dance_drums_ride_bell.wav differ diff --git a/sound/direct_sound_samples/drum_and_percussion_kick.aif b/sound/direct_sound_samples/drum_and_percussion_kick.aif deleted file mode 100644 index 628421990e3f..000000000000 Binary files a/sound/direct_sound_samples/drum_and_percussion_kick.aif and /dev/null differ diff --git a/sound/direct_sound_samples/drum_and_percussion_kick.wav b/sound/direct_sound_samples/drum_and_percussion_kick.wav new file mode 100644 index 000000000000..49ba617f0c14 Binary files /dev/null and b/sound/direct_sound_samples/drum_and_percussion_kick.wav differ diff --git a/sound/direct_sound_samples/ethnic_flavours_atarigane.aif b/sound/direct_sound_samples/ethnic_flavours_atarigane.aif deleted file mode 100644 index 4a4268210efe..000000000000 Binary files a/sound/direct_sound_samples/ethnic_flavours_atarigane.aif and /dev/null differ diff --git a/sound/direct_sound_samples/ethnic_flavours_atarigane.wav b/sound/direct_sound_samples/ethnic_flavours_atarigane.wav new file mode 100644 index 000000000000..d1fb2c1a4fdc Binary files /dev/null and b/sound/direct_sound_samples/ethnic_flavours_atarigane.wav differ diff --git a/sound/direct_sound_samples/ethnic_flavours_hyoushigi.aif b/sound/direct_sound_samples/ethnic_flavours_hyoushigi.aif deleted file mode 100644 index 5219bdf5d542..000000000000 Binary files a/sound/direct_sound_samples/ethnic_flavours_hyoushigi.aif and /dev/null differ diff --git a/sound/direct_sound_samples/ethnic_flavours_hyoushigi.wav b/sound/direct_sound_samples/ethnic_flavours_hyoushigi.wav new file mode 100644 index 000000000000..18731f50341d Binary files /dev/null and b/sound/direct_sound_samples/ethnic_flavours_hyoushigi.wav differ diff --git a/sound/direct_sound_samples/ethnic_flavours_kotsuzumi.aif b/sound/direct_sound_samples/ethnic_flavours_kotsuzumi.aif deleted file mode 100644 index 1696bd02e0a9..000000000000 Binary files a/sound/direct_sound_samples/ethnic_flavours_kotsuzumi.aif and /dev/null differ diff --git a/sound/direct_sound_samples/ethnic_flavours_kotsuzumi.wav b/sound/direct_sound_samples/ethnic_flavours_kotsuzumi.wav new file mode 100644 index 000000000000..5c99fedf38e7 Binary files /dev/null and b/sound/direct_sound_samples/ethnic_flavours_kotsuzumi.wav differ diff --git a/sound/direct_sound_samples/ethnic_flavours_ohtsuzumi.aif b/sound/direct_sound_samples/ethnic_flavours_ohtsuzumi.aif deleted file mode 100644 index 69267ca1c63a..000000000000 Binary files a/sound/direct_sound_samples/ethnic_flavours_ohtsuzumi.aif and /dev/null differ diff --git a/sound/direct_sound_samples/ethnic_flavours_ohtsuzumi.wav b/sound/direct_sound_samples/ethnic_flavours_ohtsuzumi.wav new file mode 100644 index 000000000000..c12ae6de34e0 Binary files /dev/null and b/sound/direct_sound_samples/ethnic_flavours_ohtsuzumi.wav differ diff --git a/sound/direct_sound_samples/heart_of_asia_gamelan.aif b/sound/direct_sound_samples/heart_of_asia_gamelan.aif deleted file mode 100644 index adaf6a0c53c1..000000000000 Binary files a/sound/direct_sound_samples/heart_of_asia_gamelan.aif and /dev/null differ diff --git a/sound/direct_sound_samples/heart_of_asia_gamelan.wav b/sound/direct_sound_samples/heart_of_asia_gamelan.wav new file mode 100644 index 000000000000..a6258c97d415 Binary files /dev/null and b/sound/direct_sound_samples/heart_of_asia_gamelan.wav differ diff --git a/sound/direct_sound_samples/phonemes/01.aif b/sound/direct_sound_samples/phonemes/01.aif deleted file mode 100644 index 4b15a94b7781..000000000000 Binary files a/sound/direct_sound_samples/phonemes/01.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/01.wav b/sound/direct_sound_samples/phonemes/01.wav new file mode 100644 index 000000000000..d7f43544f519 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/01.wav differ diff --git a/sound/direct_sound_samples/phonemes/02.aif b/sound/direct_sound_samples/phonemes/02.aif deleted file mode 100644 index 74c1290730e5..000000000000 Binary files a/sound/direct_sound_samples/phonemes/02.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/02.wav b/sound/direct_sound_samples/phonemes/02.wav new file mode 100644 index 000000000000..6b9e4134c859 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/02.wav differ diff --git a/sound/direct_sound_samples/phonemes/03.aif b/sound/direct_sound_samples/phonemes/03.aif deleted file mode 100644 index 359972c169b0..000000000000 Binary files a/sound/direct_sound_samples/phonemes/03.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/03.wav b/sound/direct_sound_samples/phonemes/03.wav new file mode 100644 index 000000000000..a080496adbed Binary files /dev/null and b/sound/direct_sound_samples/phonemes/03.wav differ diff --git a/sound/direct_sound_samples/phonemes/04.aif b/sound/direct_sound_samples/phonemes/04.aif deleted file mode 100644 index 3b136fa43479..000000000000 Binary files a/sound/direct_sound_samples/phonemes/04.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/04.wav b/sound/direct_sound_samples/phonemes/04.wav new file mode 100644 index 000000000000..0525f8f5d3db Binary files /dev/null and b/sound/direct_sound_samples/phonemes/04.wav differ diff --git a/sound/direct_sound_samples/phonemes/05.aif b/sound/direct_sound_samples/phonemes/05.aif deleted file mode 100644 index fd72512cf175..000000000000 Binary files a/sound/direct_sound_samples/phonemes/05.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/05.wav b/sound/direct_sound_samples/phonemes/05.wav new file mode 100644 index 000000000000..5df5562768b9 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/05.wav differ diff --git a/sound/direct_sound_samples/phonemes/06.aif b/sound/direct_sound_samples/phonemes/06.aif deleted file mode 100644 index 6f7794bec845..000000000000 Binary files a/sound/direct_sound_samples/phonemes/06.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/06.wav b/sound/direct_sound_samples/phonemes/06.wav new file mode 100644 index 000000000000..3774664d97cf Binary files /dev/null and b/sound/direct_sound_samples/phonemes/06.wav differ diff --git a/sound/direct_sound_samples/phonemes/07.aif b/sound/direct_sound_samples/phonemes/07.aif deleted file mode 100644 index 89b845f21b61..000000000000 Binary files a/sound/direct_sound_samples/phonemes/07.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/07.wav b/sound/direct_sound_samples/phonemes/07.wav new file mode 100644 index 000000000000..fc44b7f77189 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/07.wav differ diff --git a/sound/direct_sound_samples/phonemes/08.aif b/sound/direct_sound_samples/phonemes/08.aif deleted file mode 100644 index 1d99a3a9326b..000000000000 Binary files a/sound/direct_sound_samples/phonemes/08.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/08.wav b/sound/direct_sound_samples/phonemes/08.wav new file mode 100644 index 000000000000..47c50d63b052 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/08.wav differ diff --git a/sound/direct_sound_samples/phonemes/09.aif b/sound/direct_sound_samples/phonemes/09.aif deleted file mode 100644 index 883398129834..000000000000 Binary files a/sound/direct_sound_samples/phonemes/09.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/09.wav b/sound/direct_sound_samples/phonemes/09.wav new file mode 100644 index 000000000000..762ece0dd8a3 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/09.wav differ diff --git a/sound/direct_sound_samples/phonemes/10.aif b/sound/direct_sound_samples/phonemes/10.aif deleted file mode 100644 index 776815e6364b..000000000000 Binary files a/sound/direct_sound_samples/phonemes/10.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/10.wav b/sound/direct_sound_samples/phonemes/10.wav new file mode 100644 index 000000000000..da9fa6727c9d Binary files /dev/null and b/sound/direct_sound_samples/phonemes/10.wav differ diff --git a/sound/direct_sound_samples/phonemes/11.aif b/sound/direct_sound_samples/phonemes/11.aif deleted file mode 100644 index 545bd12920f6..000000000000 Binary files a/sound/direct_sound_samples/phonemes/11.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/11.wav b/sound/direct_sound_samples/phonemes/11.wav new file mode 100644 index 000000000000..5cd1904b4245 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/11.wav differ diff --git a/sound/direct_sound_samples/phonemes/12.aif b/sound/direct_sound_samples/phonemes/12.aif deleted file mode 100644 index c0a3be10d090..000000000000 Binary files a/sound/direct_sound_samples/phonemes/12.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/12.wav b/sound/direct_sound_samples/phonemes/12.wav new file mode 100644 index 000000000000..da638d82b042 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/12.wav differ diff --git a/sound/direct_sound_samples/phonemes/13.aif b/sound/direct_sound_samples/phonemes/13.aif deleted file mode 100644 index d26ecdd6de2d..000000000000 Binary files a/sound/direct_sound_samples/phonemes/13.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/13.wav b/sound/direct_sound_samples/phonemes/13.wav new file mode 100644 index 000000000000..2eb58a5f3ffb Binary files /dev/null and b/sound/direct_sound_samples/phonemes/13.wav differ diff --git a/sound/direct_sound_samples/phonemes/14.aif b/sound/direct_sound_samples/phonemes/14.aif deleted file mode 100644 index 2b51201a484b..000000000000 Binary files a/sound/direct_sound_samples/phonemes/14.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/14.wav b/sound/direct_sound_samples/phonemes/14.wav new file mode 100644 index 000000000000..fef0bb0ded7c Binary files /dev/null and b/sound/direct_sound_samples/phonemes/14.wav differ diff --git a/sound/direct_sound_samples/phonemes/15.aif b/sound/direct_sound_samples/phonemes/15.aif deleted file mode 100644 index cf5ac4e038bd..000000000000 Binary files a/sound/direct_sound_samples/phonemes/15.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/15.wav b/sound/direct_sound_samples/phonemes/15.wav new file mode 100644 index 000000000000..1dbe8cbfa3de Binary files /dev/null and b/sound/direct_sound_samples/phonemes/15.wav differ diff --git a/sound/direct_sound_samples/phonemes/16.aif b/sound/direct_sound_samples/phonemes/16.aif deleted file mode 100644 index 606742e608f6..000000000000 Binary files a/sound/direct_sound_samples/phonemes/16.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/16.wav b/sound/direct_sound_samples/phonemes/16.wav new file mode 100644 index 000000000000..83f18185823f Binary files /dev/null and b/sound/direct_sound_samples/phonemes/16.wav differ diff --git a/sound/direct_sound_samples/phonemes/17.aif b/sound/direct_sound_samples/phonemes/17.aif deleted file mode 100644 index 71d4987d64ac..000000000000 Binary files a/sound/direct_sound_samples/phonemes/17.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/17.wav b/sound/direct_sound_samples/phonemes/17.wav new file mode 100644 index 000000000000..ad55b8bda591 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/17.wav differ diff --git a/sound/direct_sound_samples/phonemes/18.aif b/sound/direct_sound_samples/phonemes/18.aif deleted file mode 100644 index 070c44a37c47..000000000000 Binary files a/sound/direct_sound_samples/phonemes/18.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/18.wav b/sound/direct_sound_samples/phonemes/18.wav new file mode 100644 index 000000000000..ecadb6f608f2 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/18.wav differ diff --git a/sound/direct_sound_samples/phonemes/19.aif b/sound/direct_sound_samples/phonemes/19.aif deleted file mode 100644 index b0ca84a38fd9..000000000000 Binary files a/sound/direct_sound_samples/phonemes/19.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/19.wav b/sound/direct_sound_samples/phonemes/19.wav new file mode 100644 index 000000000000..ff905abe22d5 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/19.wav differ diff --git a/sound/direct_sound_samples/phonemes/20.aif b/sound/direct_sound_samples/phonemes/20.aif deleted file mode 100644 index f44101b23c09..000000000000 Binary files a/sound/direct_sound_samples/phonemes/20.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/20.wav b/sound/direct_sound_samples/phonemes/20.wav new file mode 100644 index 000000000000..595702e08479 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/20.wav differ diff --git a/sound/direct_sound_samples/phonemes/21.aif b/sound/direct_sound_samples/phonemes/21.aif deleted file mode 100644 index a33809d423a3..000000000000 Binary files a/sound/direct_sound_samples/phonemes/21.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/21.wav b/sound/direct_sound_samples/phonemes/21.wav new file mode 100644 index 000000000000..7d1709212c44 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/21.wav differ diff --git a/sound/direct_sound_samples/phonemes/22.aif b/sound/direct_sound_samples/phonemes/22.aif deleted file mode 100644 index 6a005efccf9a..000000000000 Binary files a/sound/direct_sound_samples/phonemes/22.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/22.wav b/sound/direct_sound_samples/phonemes/22.wav new file mode 100644 index 000000000000..274f6137aaf3 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/22.wav differ diff --git a/sound/direct_sound_samples/phonemes/23.aif b/sound/direct_sound_samples/phonemes/23.aif deleted file mode 100644 index 62f9493fdbb1..000000000000 Binary files a/sound/direct_sound_samples/phonemes/23.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/23.wav b/sound/direct_sound_samples/phonemes/23.wav new file mode 100644 index 000000000000..72633f73c1cc Binary files /dev/null and b/sound/direct_sound_samples/phonemes/23.wav differ diff --git a/sound/direct_sound_samples/phonemes/24.aif b/sound/direct_sound_samples/phonemes/24.aif deleted file mode 100644 index 5767bd6d9aff..000000000000 Binary files a/sound/direct_sound_samples/phonemes/24.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/24.wav b/sound/direct_sound_samples/phonemes/24.wav new file mode 100644 index 000000000000..1d0e7b1a14f5 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/24.wav differ diff --git a/sound/direct_sound_samples/phonemes/25.aif b/sound/direct_sound_samples/phonemes/25.aif deleted file mode 100644 index 33e328a82e9e..000000000000 Binary files a/sound/direct_sound_samples/phonemes/25.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/25.wav b/sound/direct_sound_samples/phonemes/25.wav new file mode 100644 index 000000000000..135bb246dd98 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/25.wav differ diff --git a/sound/direct_sound_samples/phonemes/26.aif b/sound/direct_sound_samples/phonemes/26.aif deleted file mode 100644 index 548e740c8d82..000000000000 Binary files a/sound/direct_sound_samples/phonemes/26.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/26.wav b/sound/direct_sound_samples/phonemes/26.wav new file mode 100644 index 000000000000..e466df4d86c7 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/26.wav differ diff --git a/sound/direct_sound_samples/phonemes/27.aif b/sound/direct_sound_samples/phonemes/27.aif deleted file mode 100644 index cbbe09266aec..000000000000 Binary files a/sound/direct_sound_samples/phonemes/27.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/27.wav b/sound/direct_sound_samples/phonemes/27.wav new file mode 100644 index 000000000000..c4d4ce800887 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/27.wav differ diff --git a/sound/direct_sound_samples/phonemes/28.aif b/sound/direct_sound_samples/phonemes/28.aif deleted file mode 100644 index 8bdf7faaae8f..000000000000 Binary files a/sound/direct_sound_samples/phonemes/28.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/28.wav b/sound/direct_sound_samples/phonemes/28.wav new file mode 100644 index 000000000000..fe9dde8e3520 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/28.wav differ diff --git a/sound/direct_sound_samples/phonemes/29.aif b/sound/direct_sound_samples/phonemes/29.aif deleted file mode 100644 index f96f8853b287..000000000000 Binary files a/sound/direct_sound_samples/phonemes/29.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/29.wav b/sound/direct_sound_samples/phonemes/29.wav new file mode 100644 index 000000000000..d05658c97edb Binary files /dev/null and b/sound/direct_sound_samples/phonemes/29.wav differ diff --git a/sound/direct_sound_samples/phonemes/30.aif b/sound/direct_sound_samples/phonemes/30.aif deleted file mode 100644 index ab9abbf79565..000000000000 Binary files a/sound/direct_sound_samples/phonemes/30.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/30.wav b/sound/direct_sound_samples/phonemes/30.wav new file mode 100644 index 000000000000..aaf163ae9795 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/30.wav differ diff --git a/sound/direct_sound_samples/phonemes/31.aif b/sound/direct_sound_samples/phonemes/31.aif deleted file mode 100644 index 9d21d0ab49a2..000000000000 Binary files a/sound/direct_sound_samples/phonemes/31.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/31.wav b/sound/direct_sound_samples/phonemes/31.wav new file mode 100644 index 000000000000..64b2c7f6db1e Binary files /dev/null and b/sound/direct_sound_samples/phonemes/31.wav differ diff --git a/sound/direct_sound_samples/phonemes/32.aif b/sound/direct_sound_samples/phonemes/32.aif deleted file mode 100644 index c037ed4afc97..000000000000 Binary files a/sound/direct_sound_samples/phonemes/32.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/32.wav b/sound/direct_sound_samples/phonemes/32.wav new file mode 100644 index 000000000000..98862f1b64ce Binary files /dev/null and b/sound/direct_sound_samples/phonemes/32.wav differ diff --git a/sound/direct_sound_samples/phonemes/33.aif b/sound/direct_sound_samples/phonemes/33.aif deleted file mode 100644 index ac1f8b66f062..000000000000 Binary files a/sound/direct_sound_samples/phonemes/33.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/33.wav b/sound/direct_sound_samples/phonemes/33.wav new file mode 100644 index 000000000000..f96a5e49fd4b Binary files /dev/null and b/sound/direct_sound_samples/phonemes/33.wav differ diff --git a/sound/direct_sound_samples/phonemes/34.aif b/sound/direct_sound_samples/phonemes/34.aif deleted file mode 100644 index 1fd9111c8bb1..000000000000 Binary files a/sound/direct_sound_samples/phonemes/34.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/34.wav b/sound/direct_sound_samples/phonemes/34.wav new file mode 100644 index 000000000000..1439810d44fa Binary files /dev/null and b/sound/direct_sound_samples/phonemes/34.wav differ diff --git a/sound/direct_sound_samples/phonemes/35.aif b/sound/direct_sound_samples/phonemes/35.aif deleted file mode 100644 index 5d6ae2282f04..000000000000 Binary files a/sound/direct_sound_samples/phonemes/35.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/35.wav b/sound/direct_sound_samples/phonemes/35.wav new file mode 100644 index 000000000000..aa6599bcc8dd Binary files /dev/null and b/sound/direct_sound_samples/phonemes/35.wav differ diff --git a/sound/direct_sound_samples/phonemes/36.aif b/sound/direct_sound_samples/phonemes/36.aif deleted file mode 100644 index f267006907cc..000000000000 Binary files a/sound/direct_sound_samples/phonemes/36.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/36.wav b/sound/direct_sound_samples/phonemes/36.wav new file mode 100644 index 000000000000..59f90f461416 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/36.wav differ diff --git a/sound/direct_sound_samples/phonemes/37.aif b/sound/direct_sound_samples/phonemes/37.aif deleted file mode 100644 index 3ba97a9fc384..000000000000 Binary files a/sound/direct_sound_samples/phonemes/37.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/37.wav b/sound/direct_sound_samples/phonemes/37.wav new file mode 100644 index 000000000000..4df9cffee687 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/37.wav differ diff --git a/sound/direct_sound_samples/phonemes/38.aif b/sound/direct_sound_samples/phonemes/38.aif deleted file mode 100644 index 37f1be4b149b..000000000000 Binary files a/sound/direct_sound_samples/phonemes/38.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/38.wav b/sound/direct_sound_samples/phonemes/38.wav new file mode 100644 index 000000000000..759a23d514c5 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/38.wav differ diff --git a/sound/direct_sound_samples/phonemes/39.aif b/sound/direct_sound_samples/phonemes/39.aif deleted file mode 100644 index 4b3facb99a65..000000000000 Binary files a/sound/direct_sound_samples/phonemes/39.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/39.wav b/sound/direct_sound_samples/phonemes/39.wav new file mode 100644 index 000000000000..da335b269055 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/39.wav differ diff --git a/sound/direct_sound_samples/phonemes/40.aif b/sound/direct_sound_samples/phonemes/40.aif deleted file mode 100644 index 8a4d7653bac4..000000000000 Binary files a/sound/direct_sound_samples/phonemes/40.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/40.wav b/sound/direct_sound_samples/phonemes/40.wav new file mode 100644 index 000000000000..14944784a4d0 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/40.wav differ diff --git a/sound/direct_sound_samples/phonemes/41.aif b/sound/direct_sound_samples/phonemes/41.aif deleted file mode 100644 index db5bae244936..000000000000 Binary files a/sound/direct_sound_samples/phonemes/41.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/41.wav b/sound/direct_sound_samples/phonemes/41.wav new file mode 100644 index 000000000000..57e38fb3c828 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/41.wav differ diff --git a/sound/direct_sound_samples/phonemes/42.aif b/sound/direct_sound_samples/phonemes/42.aif deleted file mode 100644 index 6612dd54dbbd..000000000000 Binary files a/sound/direct_sound_samples/phonemes/42.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/42.wav b/sound/direct_sound_samples/phonemes/42.wav new file mode 100644 index 000000000000..a990969146c5 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/42.wav differ diff --git a/sound/direct_sound_samples/phonemes/43.aif b/sound/direct_sound_samples/phonemes/43.aif deleted file mode 100644 index 441eecfcda03..000000000000 Binary files a/sound/direct_sound_samples/phonemes/43.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/43.wav b/sound/direct_sound_samples/phonemes/43.wav new file mode 100644 index 000000000000..ab4a046743d3 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/43.wav differ diff --git a/sound/direct_sound_samples/phonemes/44.aif b/sound/direct_sound_samples/phonemes/44.aif deleted file mode 100644 index 95670cf0a2c0..000000000000 Binary files a/sound/direct_sound_samples/phonemes/44.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/44.wav b/sound/direct_sound_samples/phonemes/44.wav new file mode 100644 index 000000000000..efca4e3f9732 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/44.wav differ diff --git a/sound/direct_sound_samples/phonemes/45.aif b/sound/direct_sound_samples/phonemes/45.aif deleted file mode 100644 index 0fadcba8e8fc..000000000000 Binary files a/sound/direct_sound_samples/phonemes/45.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/45.wav b/sound/direct_sound_samples/phonemes/45.wav new file mode 100644 index 000000000000..0369d3c2a1fa Binary files /dev/null and b/sound/direct_sound_samples/phonemes/45.wav differ diff --git a/sound/direct_sound_samples/phonemes/46.aif b/sound/direct_sound_samples/phonemes/46.aif deleted file mode 100644 index 6017c55b4a14..000000000000 Binary files a/sound/direct_sound_samples/phonemes/46.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/46.wav b/sound/direct_sound_samples/phonemes/46.wav new file mode 100644 index 000000000000..0fa8eb1f88b0 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/46.wav differ diff --git a/sound/direct_sound_samples/phonemes/47.aif b/sound/direct_sound_samples/phonemes/47.aif deleted file mode 100644 index 2327b6d6575c..000000000000 Binary files a/sound/direct_sound_samples/phonemes/47.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/47.wav b/sound/direct_sound_samples/phonemes/47.wav new file mode 100644 index 000000000000..a55f03a1535c Binary files /dev/null and b/sound/direct_sound_samples/phonemes/47.wav differ diff --git a/sound/direct_sound_samples/phonemes/48.aif b/sound/direct_sound_samples/phonemes/48.aif deleted file mode 100644 index 19ceca0d08d5..000000000000 Binary files a/sound/direct_sound_samples/phonemes/48.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/48.wav b/sound/direct_sound_samples/phonemes/48.wav new file mode 100644 index 000000000000..f6c7dd4502b8 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/48.wav differ diff --git a/sound/direct_sound_samples/phonemes/49.aif b/sound/direct_sound_samples/phonemes/49.aif deleted file mode 100644 index 8438d301ab45..000000000000 Binary files a/sound/direct_sound_samples/phonemes/49.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/49.wav b/sound/direct_sound_samples/phonemes/49.wav new file mode 100644 index 000000000000..4168f2e137a8 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/49.wav differ diff --git a/sound/direct_sound_samples/phonemes/50.aif b/sound/direct_sound_samples/phonemes/50.aif deleted file mode 100644 index 74d4bcf4afb2..000000000000 Binary files a/sound/direct_sound_samples/phonemes/50.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/50.wav b/sound/direct_sound_samples/phonemes/50.wav new file mode 100644 index 000000000000..88ce07d9d766 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/50.wav differ diff --git a/sound/direct_sound_samples/phonemes/51.aif b/sound/direct_sound_samples/phonemes/51.aif deleted file mode 100644 index dfef8a82beb8..000000000000 Binary files a/sound/direct_sound_samples/phonemes/51.aif and /dev/null differ diff --git a/sound/direct_sound_samples/phonemes/51.wav b/sound/direct_sound_samples/phonemes/51.wav new file mode 100644 index 000000000000..bd1a514180a7 Binary files /dev/null and b/sound/direct_sound_samples/phonemes/51.wav differ diff --git a/sound/direct_sound_samples/phonemes/shared.wav b/sound/direct_sound_samples/phonemes/shared.wav new file mode 100644 index 000000000000..63207e6e229d Binary files /dev/null and b/sound/direct_sound_samples/phonemes/shared.wav differ diff --git a/sound/direct_sound_samples/register_noise.aif b/sound/direct_sound_samples/register_noise.aif deleted file mode 100644 index e56c5c13110a..000000000000 Binary files a/sound/direct_sound_samples/register_noise.aif and /dev/null differ diff --git a/sound/direct_sound_samples/register_noise.wav b/sound/direct_sound_samples/register_noise.wav new file mode 100644 index 000000000000..89d94e61cc34 Binary files /dev/null and b/sound/direct_sound_samples/register_noise.wav differ diff --git a/sound/direct_sound_samples/sc88pro_accordion.aif b/sound/direct_sound_samples/sc88pro_accordion.aif deleted file mode 100644 index 6d6c2e998b3f..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_accordion.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_accordion.wav b/sound/direct_sound_samples/sc88pro_accordion.wav new file mode 100644 index 000000000000..f19a98d27766 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_accordion.wav differ diff --git a/sound/direct_sound_samples/sc88pro_accordion_duplicate.aif b/sound/direct_sound_samples/sc88pro_accordion_duplicate.aif deleted file mode 100644 index 6d6c2e998b3f..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_accordion_duplicate.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_accordion_duplicate.wav b/sound/direct_sound_samples/sc88pro_accordion_duplicate.wav new file mode 100644 index 000000000000..f19a98d27766 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_accordion_duplicate.wav differ diff --git a/sound/direct_sound_samples/sc88pro_bubbles.aif b/sound/direct_sound_samples/sc88pro_bubbles.aif deleted file mode 100644 index 89872bf55877..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_bubbles.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_bubbles.wav b/sound/direct_sound_samples/sc88pro_bubbles.wav new file mode 100644 index 000000000000..d6e61596d59e Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_bubbles.wav differ diff --git a/sound/direct_sound_samples/sc88pro_church_organ3_high.aif b/sound/direct_sound_samples/sc88pro_church_organ3_high.aif deleted file mode 100644 index 8663a62614e9..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_church_organ3_high.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_church_organ3_high.wav b/sound/direct_sound_samples/sc88pro_church_organ3_high.wav new file mode 100644 index 000000000000..0766a8503de2 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_church_organ3_high.wav differ diff --git a/sound/direct_sound_samples/sc88pro_church_organ3_low.aif b/sound/direct_sound_samples/sc88pro_church_organ3_low.aif deleted file mode 100644 index a2618653f6e5..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_church_organ3_low.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_church_organ3_low.wav b/sound/direct_sound_samples/sc88pro_church_organ3_low.wav new file mode 100644 index 000000000000..afc9c18907cf Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_church_organ3_low.wav differ diff --git a/sound/direct_sound_samples/sc88pro_fingered_bass.aif b/sound/direct_sound_samples/sc88pro_fingered_bass.aif deleted file mode 100644 index f244a9982da1..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_fingered_bass.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_fingered_bass.wav b/sound/direct_sound_samples/sc88pro_fingered_bass.wav new file mode 100644 index 000000000000..0e723b742b5e Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_fingered_bass.wav differ diff --git a/sound/direct_sound_samples/sc88pro_flute.aif b/sound/direct_sound_samples/sc88pro_flute.aif deleted file mode 100644 index 703f3adbd0ca..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_flute.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_flute.wav b/sound/direct_sound_samples/sc88pro_flute.wav new file mode 100644 index 000000000000..409ce0f744d1 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_flute.wav differ diff --git a/sound/direct_sound_samples/sc88pro_french_horn_60.aif b/sound/direct_sound_samples/sc88pro_french_horn_60.aif deleted file mode 100644 index 742c4385e914..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_french_horn_60.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_french_horn_60.wav b/sound/direct_sound_samples/sc88pro_french_horn_60.wav new file mode 100644 index 000000000000..105c186a2a0f Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_french_horn_60.wav differ diff --git a/sound/direct_sound_samples/sc88pro_french_horn_72.aif b/sound/direct_sound_samples/sc88pro_french_horn_72.aif deleted file mode 100644 index 004fda6a1801..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_french_horn_72.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_french_horn_72.wav b/sound/direct_sound_samples/sc88pro_french_horn_72.wav new file mode 100644 index 000000000000..380d7963073e Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_french_horn_72.wav differ diff --git a/sound/direct_sound_samples/sc88pro_fretless_bass.aif b/sound/direct_sound_samples/sc88pro_fretless_bass.aif deleted file mode 100644 index f3aa47d91367..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_fretless_bass.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_fretless_bass.wav b/sound/direct_sound_samples/sc88pro_fretless_bass.wav new file mode 100644 index 000000000000..f639d5ccf280 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_fretless_bass.wav differ diff --git a/sound/direct_sound_samples/sc88pro_glockenspiel.aif b/sound/direct_sound_samples/sc88pro_glockenspiel.aif deleted file mode 100644 index 199ead811211..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_glockenspiel.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_glockenspiel.wav b/sound/direct_sound_samples/sc88pro_glockenspiel.wav new file mode 100644 index 000000000000..4c9cbae14942 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_glockenspiel.wav differ diff --git a/sound/direct_sound_samples/sc88pro_harp.aif b/sound/direct_sound_samples/sc88pro_harp.aif deleted file mode 100644 index 083c45e3da74..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_harp.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_harp.wav b/sound/direct_sound_samples/sc88pro_harp.wav new file mode 100644 index 000000000000..bdb176720cc3 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_harp.wav differ diff --git a/sound/direct_sound_samples/sc88pro_jingle_bell.aif b/sound/direct_sound_samples/sc88pro_jingle_bell.aif deleted file mode 100644 index 0eaf313093bd..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_jingle_bell.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_jingle_bell.wav b/sound/direct_sound_samples/sc88pro_jingle_bell.wav new file mode 100644 index 000000000000..1eb6b1de1aef Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_jingle_bell.wav differ diff --git a/sound/direct_sound_samples/sc88pro_mute_high_conga.aif b/sound/direct_sound_samples/sc88pro_mute_high_conga.aif deleted file mode 100644 index 2e1bf9c64157..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_mute_high_conga.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_mute_high_conga.wav b/sound/direct_sound_samples/sc88pro_mute_high_conga.wav new file mode 100644 index 000000000000..c009d7265c38 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_mute_high_conga.wav differ diff --git a/sound/direct_sound_samples/sc88pro_nylon_str_guitar.aif b/sound/direct_sound_samples/sc88pro_nylon_str_guitar.aif deleted file mode 100644 index dea429a25459..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_nylon_str_guitar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_nylon_str_guitar.wav b/sound/direct_sound_samples/sc88pro_nylon_str_guitar.wav new file mode 100644 index 000000000000..7538f508ad97 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_nylon_str_guitar.wav differ diff --git a/sound/direct_sound_samples/sc88pro_open_low_conga.aif b/sound/direct_sound_samples/sc88pro_open_low_conga.aif deleted file mode 100644 index 8e1cb620a6ad..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_open_low_conga.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_open_low_conga.wav b/sound/direct_sound_samples/sc88pro_open_low_conga.wav new file mode 100644 index 000000000000..34a1e3f32a9b Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_open_low_conga.wav differ diff --git a/sound/direct_sound_samples/sc88pro_orchestra_cymbal_crash.aif b/sound/direct_sound_samples/sc88pro_orchestra_cymbal_crash.aif deleted file mode 100644 index 576e3e19e12c..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_orchestra_cymbal_crash.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_orchestra_cymbal_crash.wav b/sound/direct_sound_samples/sc88pro_orchestra_cymbal_crash.wav new file mode 100644 index 000000000000..c3f89f9c7860 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_orchestra_cymbal_crash.wav differ diff --git a/sound/direct_sound_samples/sc88pro_orchestra_snare.aif b/sound/direct_sound_samples/sc88pro_orchestra_snare.aif deleted file mode 100644 index 36b640758815..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_orchestra_snare.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_orchestra_snare.wav b/sound/direct_sound_samples/sc88pro_orchestra_snare.wav new file mode 100644 index 000000000000..96b10bb05fbb Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_orchestra_snare.wav differ diff --git a/sound/direct_sound_samples/sc88pro_organ2.aif b/sound/direct_sound_samples/sc88pro_organ2.aif deleted file mode 100644 index 6372bbc32471..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_organ2.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_organ2.wav b/sound/direct_sound_samples/sc88pro_organ2.wav new file mode 100644 index 000000000000..bf6f2ba52033 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_organ2.wav differ diff --git a/sound/direct_sound_samples/sc88pro_piano1_48.aif b/sound/direct_sound_samples/sc88pro_piano1_48.aif deleted file mode 100644 index c2b3757b096f..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_piano1_48.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_piano1_48.wav b/sound/direct_sound_samples/sc88pro_piano1_48.wav new file mode 100644 index 000000000000..c7bcfca13882 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_piano1_48.wav differ diff --git a/sound/direct_sound_samples/sc88pro_piano1_60.aif b/sound/direct_sound_samples/sc88pro_piano1_60.aif deleted file mode 100644 index 7de586c9bde3..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_piano1_60.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_piano1_60.wav b/sound/direct_sound_samples/sc88pro_piano1_60.wav new file mode 100644 index 000000000000..7199386c7b40 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_piano1_60.wav differ diff --git a/sound/direct_sound_samples/sc88pro_piano1_72.aif b/sound/direct_sound_samples/sc88pro_piano1_72.aif deleted file mode 100644 index 5236141ba692..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_piano1_72.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_piano1_72.wav b/sound/direct_sound_samples/sc88pro_piano1_72.wav new file mode 100644 index 000000000000..603006eb6ff4 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_piano1_72.wav differ diff --git a/sound/direct_sound_samples/sc88pro_piano1_84.aif b/sound/direct_sound_samples/sc88pro_piano1_84.aif deleted file mode 100644 index a7c4e94f8f29..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_piano1_84.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_piano1_84.wav b/sound/direct_sound_samples/sc88pro_piano1_84.wav new file mode 100644 index 000000000000..0d76370756a4 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_piano1_84.wav differ diff --git a/sound/direct_sound_samples/sc88pro_pizzicato_strings.aif b/sound/direct_sound_samples/sc88pro_pizzicato_strings.aif deleted file mode 100644 index 1c0a027f7a22..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_pizzicato_strings.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_pizzicato_strings.wav b/sound/direct_sound_samples/sc88pro_pizzicato_strings.wav new file mode 100644 index 000000000000..6bb6bc74a987 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_pizzicato_strings.wav differ diff --git a/sound/direct_sound_samples/sc88pro_rnd_kick.aif b/sound/direct_sound_samples/sc88pro_rnd_kick.aif deleted file mode 100644 index 9c504e3d0549..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_rnd_kick.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_rnd_kick.wav b/sound/direct_sound_samples/sc88pro_rnd_kick.wav new file mode 100644 index 000000000000..b05d88a812b4 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_rnd_kick.wav differ diff --git a/sound/direct_sound_samples/sc88pro_rnd_snare.aif b/sound/direct_sound_samples/sc88pro_rnd_snare.aif deleted file mode 100644 index 544b187d5eaa..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_rnd_snare.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_rnd_snare.wav b/sound/direct_sound_samples/sc88pro_rnd_snare.wav new file mode 100644 index 000000000000..c00ee759f79f Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_rnd_snare.wav differ diff --git a/sound/direct_sound_samples/sc88pro_slap_bass.aif b/sound/direct_sound_samples/sc88pro_slap_bass.aif deleted file mode 100644 index 9175b63c5b01..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_slap_bass.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_slap_bass.wav b/sound/direct_sound_samples/sc88pro_slap_bass.wav new file mode 100644 index 000000000000..41d747259e38 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_slap_bass.wav differ diff --git a/sound/direct_sound_samples/sc88pro_square_wave.aif b/sound/direct_sound_samples/sc88pro_square_wave.aif deleted file mode 100644 index 09e17f0ca797..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_square_wave.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_square_wave.wav b/sound/direct_sound_samples/sc88pro_square_wave.wav new file mode 100644 index 000000000000..020dae03a492 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_square_wave.wav differ diff --git a/sound/direct_sound_samples/sc88pro_string_ensemble_60.aif b/sound/direct_sound_samples/sc88pro_string_ensemble_60.aif deleted file mode 100644 index bfaa5c196c54..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_string_ensemble_60.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_string_ensemble_60.wav b/sound/direct_sound_samples/sc88pro_string_ensemble_60.wav new file mode 100644 index 000000000000..26e9db076c3c Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_string_ensemble_60.wav differ diff --git a/sound/direct_sound_samples/sc88pro_string_ensemble_72.aif b/sound/direct_sound_samples/sc88pro_string_ensemble_72.aif deleted file mode 100644 index 3e76cacddc80..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_string_ensemble_72.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_string_ensemble_72.wav b/sound/direct_sound_samples/sc88pro_string_ensemble_72.wav new file mode 100644 index 000000000000..1699f831caed Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_string_ensemble_72.wav differ diff --git a/sound/direct_sound_samples/sc88pro_string_ensemble_84.aif b/sound/direct_sound_samples/sc88pro_string_ensemble_84.aif deleted file mode 100644 index 2647c78ecbe6..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_string_ensemble_84.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_string_ensemble_84.wav b/sound/direct_sound_samples/sc88pro_string_ensemble_84.wav new file mode 100644 index 000000000000..5616d094a0bf Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_string_ensemble_84.wav differ diff --git a/sound/direct_sound_samples/sc88pro_synth_bass.aif b/sound/direct_sound_samples/sc88pro_synth_bass.aif deleted file mode 100644 index f39931a7e413..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_synth_bass.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_synth_bass.wav b/sound/direct_sound_samples/sc88pro_synth_bass.wav new file mode 100644 index 000000000000..5aa61ab8caa8 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_synth_bass.wav differ diff --git a/sound/direct_sound_samples/sc88pro_taiko.aif b/sound/direct_sound_samples/sc88pro_taiko.aif deleted file mode 100644 index a8046cee8c58..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_taiko.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_taiko.wav b/sound/direct_sound_samples/sc88pro_taiko.wav new file mode 100644 index 000000000000..af01253368bd Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_taiko.wav differ diff --git a/sound/direct_sound_samples/sc88pro_tambourine.aif b/sound/direct_sound_samples/sc88pro_tambourine.aif deleted file mode 100644 index 39ec57d29b9b..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_tambourine.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_tambourine.wav b/sound/direct_sound_samples/sc88pro_tambourine.wav new file mode 100644 index 000000000000..016b2cc209dc Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_tambourine.wav differ diff --git a/sound/direct_sound_samples/sc88pro_timpani.aif b/sound/direct_sound_samples/sc88pro_timpani.aif deleted file mode 100644 index dfdfd702e082..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_timpani.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_timpani.wav b/sound/direct_sound_samples/sc88pro_timpani.wav new file mode 100644 index 000000000000..bed5f113a13e Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_timpani.wav differ diff --git a/sound/direct_sound_samples/sc88pro_timpani_with_snare.aif b/sound/direct_sound_samples/sc88pro_timpani_with_snare.aif deleted file mode 100644 index 7270872d643f..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_timpani_with_snare.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_timpani_with_snare.wav b/sound/direct_sound_samples/sc88pro_timpani_with_snare.wav new file mode 100644 index 000000000000..8ab1862d021c Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_timpani_with_snare.wav differ diff --git a/sound/direct_sound_samples/sc88pro_tr909_hand_clap.aif b/sound/direct_sound_samples/sc88pro_tr909_hand_clap.aif deleted file mode 100644 index b11787ffc8f9..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_tr909_hand_clap.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_tr909_hand_clap.wav b/sound/direct_sound_samples/sc88pro_tr909_hand_clap.wav new file mode 100644 index 000000000000..2e07040cb409 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_tr909_hand_clap.wav differ diff --git a/sound/direct_sound_samples/sc88pro_trumpet_60.aif b/sound/direct_sound_samples/sc88pro_trumpet_60.aif deleted file mode 100644 index e56df7f605cc..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_trumpet_60.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_trumpet_60.wav b/sound/direct_sound_samples/sc88pro_trumpet_60.wav new file mode 100644 index 000000000000..0c857d971d43 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_trumpet_60.wav differ diff --git a/sound/direct_sound_samples/sc88pro_trumpet_72.aif b/sound/direct_sound_samples/sc88pro_trumpet_72.aif deleted file mode 100644 index 8c68a83b317c..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_trumpet_72.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_trumpet_72.wav b/sound/direct_sound_samples/sc88pro_trumpet_72.wav new file mode 100644 index 000000000000..93a62dc0efaf Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_trumpet_72.wav differ diff --git a/sound/direct_sound_samples/sc88pro_trumpet_84.aif b/sound/direct_sound_samples/sc88pro_trumpet_84.aif deleted file mode 100644 index a03bafc97439..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_trumpet_84.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_trumpet_84.wav b/sound/direct_sound_samples/sc88pro_trumpet_84.wav new file mode 100644 index 000000000000..12549376b579 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_trumpet_84.wav differ diff --git a/sound/direct_sound_samples/sc88pro_tuba_39.aif b/sound/direct_sound_samples/sc88pro_tuba_39.aif deleted file mode 100644 index d4077b48164d..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_tuba_39.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_tuba_39.wav b/sound/direct_sound_samples/sc88pro_tuba_39.wav new file mode 100644 index 000000000000..c3b78eea55d4 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_tuba_39.wav differ diff --git a/sound/direct_sound_samples/sc88pro_tuba_51.aif b/sound/direct_sound_samples/sc88pro_tuba_51.aif deleted file mode 100644 index 2ad86876be93..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_tuba_51.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_tuba_51.wav b/sound/direct_sound_samples/sc88pro_tuba_51.wav new file mode 100644 index 000000000000..fed8c72f435e Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_tuba_51.wav differ diff --git a/sound/direct_sound_samples/sc88pro_tubular_bell.aif b/sound/direct_sound_samples/sc88pro_tubular_bell.aif deleted file mode 100644 index 9d00ecae6bc6..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_tubular_bell.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_tubular_bell.wav b/sound/direct_sound_samples/sc88pro_tubular_bell.wav new file mode 100644 index 000000000000..8c892236b96b Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_tubular_bell.wav differ diff --git a/sound/direct_sound_samples/sc88pro_wind.aif b/sound/direct_sound_samples/sc88pro_wind.aif deleted file mode 100644 index ece919ea5137..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_wind.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_wind.wav b/sound/direct_sound_samples/sc88pro_wind.wav new file mode 100644 index 000000000000..3856a4af1f46 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_wind.wav differ diff --git a/sound/direct_sound_samples/sc88pro_xylophone.aif b/sound/direct_sound_samples/sc88pro_xylophone.aif deleted file mode 100644 index 1bd43ca92e39..000000000000 Binary files a/sound/direct_sound_samples/sc88pro_xylophone.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sc88pro_xylophone.wav b/sound/direct_sound_samples/sc88pro_xylophone.wav new file mode 100644 index 000000000000..a08296baa150 Binary files /dev/null and b/sound/direct_sound_samples/sc88pro_xylophone.wav differ diff --git a/sound/direct_sound_samples/sd90_ambient_tom.aif b/sound/direct_sound_samples/sd90_ambient_tom.aif deleted file mode 100644 index 08f1acf38868..000000000000 Binary files a/sound/direct_sound_samples/sd90_ambient_tom.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sd90_ambient_tom.wav b/sound/direct_sound_samples/sd90_ambient_tom.wav new file mode 100644 index 000000000000..6f390959fc05 Binary files /dev/null and b/sound/direct_sound_samples/sd90_ambient_tom.wav differ diff --git a/sound/direct_sound_samples/sd90_classical_detuned_ep1_high.aif b/sound/direct_sound_samples/sd90_classical_detuned_ep1_high.aif deleted file mode 100644 index 86ea0fa7609c..000000000000 Binary files a/sound/direct_sound_samples/sd90_classical_detuned_ep1_high.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sd90_classical_detuned_ep1_high.wav b/sound/direct_sound_samples/sd90_classical_detuned_ep1_high.wav new file mode 100644 index 000000000000..3c96f1cbca5a Binary files /dev/null and b/sound/direct_sound_samples/sd90_classical_detuned_ep1_high.wav differ diff --git a/sound/direct_sound_samples/sd90_classical_detuned_ep1_low.aif b/sound/direct_sound_samples/sd90_classical_detuned_ep1_low.aif deleted file mode 100644 index fced0371228a..000000000000 Binary files a/sound/direct_sound_samples/sd90_classical_detuned_ep1_low.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sd90_classical_detuned_ep1_low.wav b/sound/direct_sound_samples/sd90_classical_detuned_ep1_low.wav new file mode 100644 index 000000000000..39e25a89ce0f Binary files /dev/null and b/sound/direct_sound_samples/sd90_classical_detuned_ep1_low.wav differ diff --git a/sound/direct_sound_samples/sd90_classical_distortion_guitar_high.aif b/sound/direct_sound_samples/sd90_classical_distortion_guitar_high.aif deleted file mode 100644 index b0f0e82a1a16..000000000000 Binary files a/sound/direct_sound_samples/sd90_classical_distortion_guitar_high.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sd90_classical_distortion_guitar_high.wav b/sound/direct_sound_samples/sd90_classical_distortion_guitar_high.wav new file mode 100644 index 000000000000..097d91f734fd Binary files /dev/null and b/sound/direct_sound_samples/sd90_classical_distortion_guitar_high.wav differ diff --git a/sound/direct_sound_samples/sd90_classical_distortion_guitar_low.aif b/sound/direct_sound_samples/sd90_classical_distortion_guitar_low.aif deleted file mode 100644 index c4f7082ed784..000000000000 Binary files a/sound/direct_sound_samples/sd90_classical_distortion_guitar_low.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sd90_classical_distortion_guitar_low.wav b/sound/direct_sound_samples/sd90_classical_distortion_guitar_low.wav new file mode 100644 index 000000000000..d281d77572ae Binary files /dev/null and b/sound/direct_sound_samples/sd90_classical_distortion_guitar_low.wav differ diff --git a/sound/direct_sound_samples/sd90_classical_oboe.aif b/sound/direct_sound_samples/sd90_classical_oboe.aif deleted file mode 100644 index 41b6fec12f48..000000000000 Binary files a/sound/direct_sound_samples/sd90_classical_oboe.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sd90_classical_oboe.wav b/sound/direct_sound_samples/sd90_classical_oboe.wav new file mode 100644 index 000000000000..2b9e96afc404 Binary files /dev/null and b/sound/direct_sound_samples/sd90_classical_oboe.wav differ diff --git a/sound/direct_sound_samples/sd90_classical_overdrive_guitar.aif b/sound/direct_sound_samples/sd90_classical_overdrive_guitar.aif deleted file mode 100644 index d37c79c05698..000000000000 Binary files a/sound/direct_sound_samples/sd90_classical_overdrive_guitar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sd90_classical_overdrive_guitar.wav b/sound/direct_sound_samples/sd90_classical_overdrive_guitar.wav new file mode 100644 index 000000000000..7380be1e1b36 Binary files /dev/null and b/sound/direct_sound_samples/sd90_classical_overdrive_guitar.wav differ diff --git a/sound/direct_sound_samples/sd90_classical_shakuhachi.aif b/sound/direct_sound_samples/sd90_classical_shakuhachi.aif deleted file mode 100644 index e04a34f6429a..000000000000 Binary files a/sound/direct_sound_samples/sd90_classical_shakuhachi.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sd90_classical_shakuhachi.wav b/sound/direct_sound_samples/sd90_classical_shakuhachi.wav new file mode 100644 index 000000000000..587cee2cb7e3 Binary files /dev/null and b/sound/direct_sound_samples/sd90_classical_shakuhachi.wav differ diff --git a/sound/direct_sound_samples/sd90_classical_whistle.aif b/sound/direct_sound_samples/sd90_classical_whistle.aif deleted file mode 100644 index b4be7482f012..000000000000 Binary files a/sound/direct_sound_samples/sd90_classical_whistle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sd90_classical_whistle.wav b/sound/direct_sound_samples/sd90_classical_whistle.wav new file mode 100644 index 000000000000..61a58445bf10 Binary files /dev/null and b/sound/direct_sound_samples/sd90_classical_whistle.wav differ diff --git a/sound/direct_sound_samples/sd90_cowbell.aif b/sound/direct_sound_samples/sd90_cowbell.aif deleted file mode 100644 index 43515f542778..000000000000 Binary files a/sound/direct_sound_samples/sd90_cowbell.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sd90_cowbell.wav b/sound/direct_sound_samples/sd90_cowbell.wav new file mode 100644 index 000000000000..9c35bf654104 Binary files /dev/null and b/sound/direct_sound_samples/sd90_cowbell.wav differ diff --git a/sound/direct_sound_samples/sd90_enhanced_delay_shaku.aif b/sound/direct_sound_samples/sd90_enhanced_delay_shaku.aif deleted file mode 100644 index c64ef6b03756..000000000000 Binary files a/sound/direct_sound_samples/sd90_enhanced_delay_shaku.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sd90_enhanced_delay_shaku.wav b/sound/direct_sound_samples/sd90_enhanced_delay_shaku.wav new file mode 100644 index 000000000000..d87fc68b2be1 Binary files /dev/null and b/sound/direct_sound_samples/sd90_enhanced_delay_shaku.wav differ diff --git a/sound/direct_sound_samples/sd90_open_triangle.aif b/sound/direct_sound_samples/sd90_open_triangle.aif deleted file mode 100644 index 0d0b3e3ca295..000000000000 Binary files a/sound/direct_sound_samples/sd90_open_triangle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sd90_open_triangle.wav b/sound/direct_sound_samples/sd90_open_triangle.wav new file mode 100644 index 000000000000..92df2b30741f Binary files /dev/null and b/sound/direct_sound_samples/sd90_open_triangle.wav differ diff --git a/sound/direct_sound_samples/sd90_solo_snare.aif b/sound/direct_sound_samples/sd90_solo_snare.aif deleted file mode 100644 index 93b679358405..000000000000 Binary files a/sound/direct_sound_samples/sd90_solo_snare.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sd90_solo_snare.wav b/sound/direct_sound_samples/sd90_solo_snare.wav new file mode 100644 index 000000000000..ad5d87284451 Binary files /dev/null and b/sound/direct_sound_samples/sd90_solo_snare.wav differ diff --git a/sound/direct_sound_samples/sd90_special_scream_drive.aif b/sound/direct_sound_samples/sd90_special_scream_drive.aif deleted file mode 100644 index 8b7a7da40554..000000000000 Binary files a/sound/direct_sound_samples/sd90_special_scream_drive.aif and /dev/null differ diff --git a/sound/direct_sound_samples/sd90_special_scream_drive.wav b/sound/direct_sound_samples/sd90_special_scream_drive.wav new file mode 100644 index 000000000000..8b4b563ac75d Binary files /dev/null and b/sound/direct_sound_samples/sd90_special_scream_drive.wav differ diff --git a/sound/direct_sound_samples/steinway_b_piano.aif b/sound/direct_sound_samples/steinway_b_piano.aif deleted file mode 100644 index e98c64db4d1a..000000000000 Binary files a/sound/direct_sound_samples/steinway_b_piano.aif and /dev/null differ diff --git a/sound/direct_sound_samples/steinway_b_piano.wav b/sound/direct_sound_samples/steinway_b_piano.wav new file mode 100644 index 000000000000..5a4d94b0a897 Binary files /dev/null and b/sound/direct_sound_samples/steinway_b_piano.wav differ diff --git a/sound/direct_sound_samples/trinity_30303_mega_bass.aif b/sound/direct_sound_samples/trinity_30303_mega_bass.aif deleted file mode 100644 index 09fe6f12ead0..000000000000 Binary files a/sound/direct_sound_samples/trinity_30303_mega_bass.aif and /dev/null differ diff --git a/sound/direct_sound_samples/trinity_30303_mega_bass.wav b/sound/direct_sound_samples/trinity_30303_mega_bass.wav new file mode 100644 index 000000000000..6ad677b7d849 Binary files /dev/null and b/sound/direct_sound_samples/trinity_30303_mega_bass.wav differ diff --git a/sound/direct_sound_samples/trinity_big_boned.aif b/sound/direct_sound_samples/trinity_big_boned.aif deleted file mode 100644 index 455ced13e987..000000000000 Binary files a/sound/direct_sound_samples/trinity_big_boned.aif and /dev/null differ diff --git a/sound/direct_sound_samples/trinity_big_boned.wav b/sound/direct_sound_samples/trinity_big_boned.wav new file mode 100644 index 000000000000..7f42b9fcd985 Binary files /dev/null and b/sound/direct_sound_samples/trinity_big_boned.wav differ diff --git a/sound/direct_sound_samples/trinity_cymbal_crash.aif b/sound/direct_sound_samples/trinity_cymbal_crash.aif deleted file mode 100644 index 4aec6882fff7..000000000000 Binary files a/sound/direct_sound_samples/trinity_cymbal_crash.aif and /dev/null differ diff --git a/sound/direct_sound_samples/trinity_cymbal_crash.wav b/sound/direct_sound_samples/trinity_cymbal_crash.wav new file mode 100644 index 000000000000..c3e52d3e2901 Binary files /dev/null and b/sound/direct_sound_samples/trinity_cymbal_crash.wav differ diff --git a/sound/direct_sound_samples/unknown_01.aif b/sound/direct_sound_samples/unknown_01.aif deleted file mode 100644 index ee6ff45b7f6a..000000000000 Binary files a/sound/direct_sound_samples/unknown_01.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_01.wav b/sound/direct_sound_samples/unknown_01.wav new file mode 100644 index 000000000000..75d05e7f4d1d Binary files /dev/null and b/sound/direct_sound_samples/unknown_01.wav differ diff --git a/sound/direct_sound_samples/unknown_02.aif b/sound/direct_sound_samples/unknown_02.aif deleted file mode 100644 index 2e09d08223ef..000000000000 Binary files a/sound/direct_sound_samples/unknown_02.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_02.wav b/sound/direct_sound_samples/unknown_02.wav new file mode 100644 index 000000000000..1a25b1fe18a9 Binary files /dev/null and b/sound/direct_sound_samples/unknown_02.wav differ diff --git a/sound/direct_sound_samples/unknown_03.aif b/sound/direct_sound_samples/unknown_03.aif deleted file mode 100644 index 49f24936fa62..000000000000 Binary files a/sound/direct_sound_samples/unknown_03.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_03.wav b/sound/direct_sound_samples/unknown_03.wav new file mode 100644 index 000000000000..1a64c4b25de0 Binary files /dev/null and b/sound/direct_sound_samples/unknown_03.wav differ diff --git a/sound/direct_sound_samples/unknown_04.aif b/sound/direct_sound_samples/unknown_04.aif deleted file mode 100644 index 5c55d91ed889..000000000000 Binary files a/sound/direct_sound_samples/unknown_04.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_04.wav b/sound/direct_sound_samples/unknown_04.wav new file mode 100644 index 000000000000..a278be2758cb Binary files /dev/null and b/sound/direct_sound_samples/unknown_04.wav differ diff --git a/sound/direct_sound_samples/unknown_05.aif b/sound/direct_sound_samples/unknown_05.aif deleted file mode 100644 index 515818a4daec..000000000000 Binary files a/sound/direct_sound_samples/unknown_05.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_05.wav b/sound/direct_sound_samples/unknown_05.wav new file mode 100644 index 000000000000..dd5eee1d2c37 Binary files /dev/null and b/sound/direct_sound_samples/unknown_05.wav differ diff --git a/sound/direct_sound_samples/unknown_06.aif b/sound/direct_sound_samples/unknown_06.aif deleted file mode 100644 index 102830efa598..000000000000 Binary files a/sound/direct_sound_samples/unknown_06.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_06.wav b/sound/direct_sound_samples/unknown_06.wav new file mode 100644 index 000000000000..396eb3e72148 Binary files /dev/null and b/sound/direct_sound_samples/unknown_06.wav differ diff --git a/sound/direct_sound_samples/unknown_07.aif b/sound/direct_sound_samples/unknown_07.aif deleted file mode 100644 index 556be0238295..000000000000 Binary files a/sound/direct_sound_samples/unknown_07.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_07.wav b/sound/direct_sound_samples/unknown_07.wav new file mode 100644 index 000000000000..b1e0a0d08f55 Binary files /dev/null and b/sound/direct_sound_samples/unknown_07.wav differ diff --git a/sound/direct_sound_samples/unknown_08.aif b/sound/direct_sound_samples/unknown_08.aif deleted file mode 100644 index dd80b1185a90..000000000000 Binary files a/sound/direct_sound_samples/unknown_08.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_08.wav b/sound/direct_sound_samples/unknown_08.wav new file mode 100644 index 000000000000..420ee23ce372 Binary files /dev/null and b/sound/direct_sound_samples/unknown_08.wav differ diff --git a/sound/direct_sound_samples/unknown_09.aif b/sound/direct_sound_samples/unknown_09.aif deleted file mode 100644 index ebd46eeaa205..000000000000 Binary files a/sound/direct_sound_samples/unknown_09.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_09.wav b/sound/direct_sound_samples/unknown_09.wav new file mode 100644 index 000000000000..fd1ee4dd7802 Binary files /dev/null and b/sound/direct_sound_samples/unknown_09.wav differ diff --git a/sound/direct_sound_samples/unknown_10.aif b/sound/direct_sound_samples/unknown_10.aif deleted file mode 100644 index 6a11945c55b0..000000000000 Binary files a/sound/direct_sound_samples/unknown_10.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_10.wav b/sound/direct_sound_samples/unknown_10.wav new file mode 100644 index 000000000000..63cf6043cb22 Binary files /dev/null and b/sound/direct_sound_samples/unknown_10.wav differ diff --git a/sound/direct_sound_samples/unknown_11.aif b/sound/direct_sound_samples/unknown_11.aif deleted file mode 100644 index a0fb49f89b3a..000000000000 Binary files a/sound/direct_sound_samples/unknown_11.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_11.wav b/sound/direct_sound_samples/unknown_11.wav new file mode 100644 index 000000000000..f2e648045bd6 Binary files /dev/null and b/sound/direct_sound_samples/unknown_11.wav differ diff --git a/sound/direct_sound_samples/unknown_12.aif b/sound/direct_sound_samples/unknown_12.aif deleted file mode 100644 index 9521d0b6e861..000000000000 Binary files a/sound/direct_sound_samples/unknown_12.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_12.wav b/sound/direct_sound_samples/unknown_12.wav new file mode 100644 index 000000000000..146db2c348a4 Binary files /dev/null and b/sound/direct_sound_samples/unknown_12.wav differ diff --git a/sound/direct_sound_samples/unknown_13.aif b/sound/direct_sound_samples/unknown_13.aif deleted file mode 100644 index 2519572e2c95..000000000000 Binary files a/sound/direct_sound_samples/unknown_13.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_13.wav b/sound/direct_sound_samples/unknown_13.wav new file mode 100644 index 000000000000..1618ea28b51c Binary files /dev/null and b/sound/direct_sound_samples/unknown_13.wav differ diff --git a/sound/direct_sound_samples/unknown_14.aif b/sound/direct_sound_samples/unknown_14.aif deleted file mode 100644 index d411e6612884..000000000000 Binary files a/sound/direct_sound_samples/unknown_14.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_14.wav b/sound/direct_sound_samples/unknown_14.wav new file mode 100644 index 000000000000..4c509795adb2 Binary files /dev/null and b/sound/direct_sound_samples/unknown_14.wav differ diff --git a/sound/direct_sound_samples/unknown_15.aif b/sound/direct_sound_samples/unknown_15.aif deleted file mode 100644 index 3bc1aa839b1d..000000000000 Binary files a/sound/direct_sound_samples/unknown_15.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_15.wav b/sound/direct_sound_samples/unknown_15.wav new file mode 100644 index 000000000000..080c4ad841da Binary files /dev/null and b/sound/direct_sound_samples/unknown_15.wav differ diff --git a/sound/direct_sound_samples/unknown_16.aif b/sound/direct_sound_samples/unknown_16.aif deleted file mode 100644 index 3bacf367651d..000000000000 Binary files a/sound/direct_sound_samples/unknown_16.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_16.wav b/sound/direct_sound_samples/unknown_16.wav new file mode 100644 index 000000000000..72cf7dcc952b Binary files /dev/null and b/sound/direct_sound_samples/unknown_16.wav differ diff --git a/sound/direct_sound_samples/unknown_17.aif b/sound/direct_sound_samples/unknown_17.aif deleted file mode 100644 index 5ddaa153da35..000000000000 Binary files a/sound/direct_sound_samples/unknown_17.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_17.wav b/sound/direct_sound_samples/unknown_17.wav new file mode 100644 index 000000000000..5a277f7d44bf Binary files /dev/null and b/sound/direct_sound_samples/unknown_17.wav differ diff --git a/sound/direct_sound_samples/unknown_18.aif b/sound/direct_sound_samples/unknown_18.aif deleted file mode 100644 index e1715fd03022..000000000000 Binary files a/sound/direct_sound_samples/unknown_18.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_18.wav b/sound/direct_sound_samples/unknown_18.wav new file mode 100644 index 000000000000..9ee002792194 Binary files /dev/null and b/sound/direct_sound_samples/unknown_18.wav differ diff --git a/sound/direct_sound_samples/unknown_bell.aif b/sound/direct_sound_samples/unknown_bell.aif deleted file mode 100644 index 7de79e74786e..000000000000 Binary files a/sound/direct_sound_samples/unknown_bell.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_bell.wav b/sound/direct_sound_samples/unknown_bell.wav new file mode 100644 index 000000000000..4dc82a170bb8 Binary files /dev/null and b/sound/direct_sound_samples/unknown_bell.wav differ diff --git a/sound/direct_sound_samples/unknown_close_hihat.aif b/sound/direct_sound_samples/unknown_close_hihat.aif deleted file mode 100644 index 8747aef28de4..000000000000 Binary files a/sound/direct_sound_samples/unknown_close_hihat.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_close_hihat.wav b/sound/direct_sound_samples/unknown_close_hihat.wav new file mode 100644 index 000000000000..86774ce3ce5d Binary files /dev/null and b/sound/direct_sound_samples/unknown_close_hihat.wav differ diff --git a/sound/direct_sound_samples/unknown_female_voice.aif b/sound/direct_sound_samples/unknown_female_voice.aif deleted file mode 100644 index b310823a79ec..000000000000 Binary files a/sound/direct_sound_samples/unknown_female_voice.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_female_voice.wav b/sound/direct_sound_samples/unknown_female_voice.wav new file mode 100644 index 000000000000..44e73b3395e5 Binary files /dev/null and b/sound/direct_sound_samples/unknown_female_voice.wav differ diff --git a/sound/direct_sound_samples/unknown_koto_high.aif b/sound/direct_sound_samples/unknown_koto_high.aif deleted file mode 100644 index 9c531de11329..000000000000 Binary files a/sound/direct_sound_samples/unknown_koto_high.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_koto_high.wav b/sound/direct_sound_samples/unknown_koto_high.wav new file mode 100644 index 000000000000..b9591a098f6d Binary files /dev/null and b/sound/direct_sound_samples/unknown_koto_high.wav differ diff --git a/sound/direct_sound_samples/unknown_koto_low.aif b/sound/direct_sound_samples/unknown_koto_low.aif deleted file mode 100644 index 67c40f1966d5..000000000000 Binary files a/sound/direct_sound_samples/unknown_koto_low.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_koto_low.wav b/sound/direct_sound_samples/unknown_koto_low.wav new file mode 100644 index 000000000000..a1736cafc7b1 Binary files /dev/null and b/sound/direct_sound_samples/unknown_koto_low.wav differ diff --git a/sound/direct_sound_samples/unknown_open_hihat.aif b/sound/direct_sound_samples/unknown_open_hihat.aif deleted file mode 100644 index 5ad9410d001a..000000000000 Binary files a/sound/direct_sound_samples/unknown_open_hihat.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_open_hihat.wav b/sound/direct_sound_samples/unknown_open_hihat.wav new file mode 100644 index 000000000000..3a9ee824c154 Binary files /dev/null and b/sound/direct_sound_samples/unknown_open_hihat.wav differ diff --git a/sound/direct_sound_samples/unknown_snare.aif b/sound/direct_sound_samples/unknown_snare.aif deleted file mode 100644 index e7184ec6f635..000000000000 Binary files a/sound/direct_sound_samples/unknown_snare.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_snare.wav b/sound/direct_sound_samples/unknown_snare.wav new file mode 100644 index 000000000000..03295e476333 Binary files /dev/null and b/sound/direct_sound_samples/unknown_snare.wav differ diff --git a/sound/direct_sound_samples/unknown_synth_snare.aif b/sound/direct_sound_samples/unknown_synth_snare.aif deleted file mode 100644 index b3122457de36..000000000000 Binary files a/sound/direct_sound_samples/unknown_synth_snare.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unknown_synth_snare.wav b/sound/direct_sound_samples/unknown_synth_snare.wav new file mode 100644 index 000000000000..774194423df0 Binary files /dev/null and b/sound/direct_sound_samples/unknown_synth_snare.wav differ diff --git a/sound/direct_sound_samples/unused_guitar_separates_power_chord.aif b/sound/direct_sound_samples/unused_guitar_separates_power_chord.aif deleted file mode 100644 index 7647a74a7073..000000000000 Binary files a/sound/direct_sound_samples/unused_guitar_separates_power_chord.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unused_guitar_separates_power_chord.wav b/sound/direct_sound_samples/unused_guitar_separates_power_chord.wav new file mode 100644 index 000000000000..c75373087bac Binary files /dev/null and b/sound/direct_sound_samples/unused_guitar_separates_power_chord.wav differ diff --git a/sound/direct_sound_samples/unused_heart_of_asia_indian_drum.aif b/sound/direct_sound_samples/unused_heart_of_asia_indian_drum.aif deleted file mode 100644 index 2e67f1d7376e..000000000000 Binary files a/sound/direct_sound_samples/unused_heart_of_asia_indian_drum.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unused_heart_of_asia_indian_drum.wav b/sound/direct_sound_samples/unused_heart_of_asia_indian_drum.wav new file mode 100644 index 000000000000..49d67a30f3b5 Binary files /dev/null and b/sound/direct_sound_samples/unused_heart_of_asia_indian_drum.wav differ diff --git a/sound/direct_sound_samples/unused_sc55_tom.aif b/sound/direct_sound_samples/unused_sc55_tom.aif deleted file mode 100644 index 04f990b13cd4..000000000000 Binary files a/sound/direct_sound_samples/unused_sc55_tom.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unused_sc55_tom.wav b/sound/direct_sound_samples/unused_sc55_tom.wav new file mode 100644 index 000000000000..b4c225827fd1 Binary files /dev/null and b/sound/direct_sound_samples/unused_sc55_tom.wav differ diff --git a/sound/direct_sound_samples/unused_sc88pro_unison_slap.aif b/sound/direct_sound_samples/unused_sc88pro_unison_slap.aif deleted file mode 100644 index 46d6e7d1311b..000000000000 Binary files a/sound/direct_sound_samples/unused_sc88pro_unison_slap.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unused_sc88pro_unison_slap.wav b/sound/direct_sound_samples/unused_sc88pro_unison_slap.wav new file mode 100644 index 000000000000..690cbc9183ba Binary files /dev/null and b/sound/direct_sound_samples/unused_sc88pro_unison_slap.wav differ diff --git a/sound/direct_sound_samples/unused_sd90_oboe.aif b/sound/direct_sound_samples/unused_sd90_oboe.aif deleted file mode 100644 index 2a0ea2a26618..000000000000 Binary files a/sound/direct_sound_samples/unused_sd90_oboe.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unused_sd90_oboe.wav b/sound/direct_sound_samples/unused_sd90_oboe.wav new file mode 100644 index 000000000000..e7609ed53dd2 Binary files /dev/null and b/sound/direct_sound_samples/unused_sd90_oboe.wav differ diff --git a/sound/direct_sound_samples/unused_unknown_male_voice.aif b/sound/direct_sound_samples/unused_unknown_male_voice.aif deleted file mode 100644 index a2382d700fbf..000000000000 Binary files a/sound/direct_sound_samples/unused_unknown_male_voice.aif and /dev/null differ diff --git a/sound/direct_sound_samples/unused_unknown_male_voice.wav b/sound/direct_sound_samples/unused_unknown_male_voice.wav new file mode 100644 index 000000000000..7612c9b61d47 Binary files /dev/null and b/sound/direct_sound_samples/unused_unknown_male_voice.wav differ diff --git a/sound/keysplit_tables.inc b/sound/keysplit_tables.inc index 81301ef62b66..a3145e64d23a 100644 --- a/sound/keysplit_tables.inc +++ b/sound/keysplit_tables.inc @@ -1,6 +1,6 @@ @ Due to the way mks4agb (Nintendo's tool) works, key split table labels can @ appear before the actual start of the key split table data. If you look at -@ the first keysplit table (KeySplitTable1), you'll notice it's offset backwards +@ the first keysplit table (keysplit_piano), you'll notice it's offset backwards @ by 36 bytes. This is because the key split tables don't map instruments @ for the entire note range (0-127)--they only map subsets, and the upper @ and lower ranges aren't necessarily 0 or 127. @@ -10,384 +10,26 @@ @ begins. Therefore, the notes naturally map to the key split table without @ any extra offset calculation. -.set KeySplitTable1, . - 36 - .byte 0 @ 36 - .byte 0 @ 37 - .byte 0 @ 38 - .byte 0 @ 39 - .byte 0 @ 40 - .byte 0 @ 41 - .byte 0 @ 42 - .byte 0 @ 43 - .byte 0 @ 44 - .byte 0 @ 45 - .byte 0 @ 46 - .byte 0 @ 47 - .byte 0 @ 48 - .byte 0 @ 49 - .byte 0 @ 50 - .byte 0 @ 51 - .byte 0 @ 52 - .byte 0 @ 53 - .byte 0 @ 54 - .byte 1 @ 55 - .byte 1 @ 56 - .byte 1 @ 57 - .byte 1 @ 58 - .byte 1 @ 59 - .byte 1 @ 60 - .byte 1 @ 61 - .byte 1 @ 62 - .byte 1 @ 63 - .byte 1 @ 64 - .byte 1 @ 65 - .byte 1 @ 66 - .byte 1 @ 67 - .byte 1 @ 68 - .byte 1 @ 69 - .byte 2 @ 70 - .byte 2 @ 71 - .byte 2 @ 72 - .byte 2 @ 73 - .byte 2 @ 74 - .byte 2 @ 75 - .byte 2 @ 76 - .byte 2 @ 77 - .byte 2 @ 78 - .byte 2 @ 79 - .byte 2 @ 80 - .byte 2 @ 81 - .byte 2 @ 82 - .byte 2 @ 83 - .byte 2 @ 84 - .byte 2 @ 85 - .byte 2 @ 86 - .byte 2 @ 87 - .byte 2 @ 88 - .byte 2 @ 89 - .byte 2 @ 90 - .byte 3 @ 91 - .byte 3 @ 92 - .byte 3 @ 93 - .byte 3 @ 94 - .byte 3 @ 95 - .byte 3 @ 96 - .byte 3 @ 97 - .byte 3 @ 98 - .byte 3 @ 99 - .byte 3 @ 100 - .byte 3 @ 101 - .byte 3 @ 102 - .byte 3 @ 103 - .byte 3 @ 104 - .byte 3 @ 105 - .byte 3 @ 106 - .byte 3 @ 107 +keysplit piano, 36 + split 0, 55 + split 1, 70 + split 2, 91 + split 3, 108 -.set KeySplitTable2, . - 36 - .byte 0 @ 36 - .byte 0 @ 37 - .byte 0 @ 38 - .byte 0 @ 39 - .byte 0 @ 40 - .byte 0 @ 41 - .byte 0 @ 42 - .byte 0 @ 43 - .byte 0 @ 44 - .byte 0 @ 45 - .byte 0 @ 46 - .byte 0 @ 47 - .byte 0 @ 48 - .byte 0 @ 49 - .byte 0 @ 50 - .byte 0 @ 51 - .byte 0 @ 52 - .byte 0 @ 53 - .byte 0 @ 54 - .byte 0 @ 55 - .byte 0 @ 56 - .byte 0 @ 57 - .byte 0 @ 58 - .byte 0 @ 59 - .byte 0 @ 60 - .byte 0 @ 61 - .byte 0 @ 62 - .byte 0 @ 63 - .byte 0 @ 64 - .byte 0 @ 65 - .byte 0 @ 66 - .byte 0 @ 67 - .byte 0 @ 68 - .byte 1 @ 69 - .byte 1 @ 70 - .byte 1 @ 71 - .byte 1 @ 72 - .byte 1 @ 73 - .byte 1 @ 74 - .byte 1 @ 75 - .byte 1 @ 76 - .byte 1 @ 77 - .byte 1 @ 78 - .byte 1 @ 79 - .byte 1 @ 80 - .byte 2 @ 81 - .byte 2 @ 82 - .byte 2 @ 83 - .byte 2 @ 84 - .byte 2 @ 85 - .byte 2 @ 86 - .byte 2 @ 87 - .byte 2 @ 88 - .byte 2 @ 89 - .byte 2 @ 90 - .byte 2 @ 91 - .byte 2 @ 92 - .byte 2 @ 93 - .byte 2 @ 94 - .byte 2 @ 95 - .byte 2 @ 96 - .byte 2 @ 97 - .byte 2 @ 98 - .byte 2 @ 99 - .byte 2 @ 100 - .byte 2 @ 101 - .byte 2 @ 102 - .byte 2 @ 103 - .byte 2 @ 104 - .byte 2 @ 105 - .byte 2 @ 106 - .byte 2 @ 107 +keysplit strings, 36 + split 0, 69 + split 1, 81 + split 2, 108 -.set KeySplitTable3, . - 36 - .byte 0 @ 36 - .byte 0 @ 37 - .byte 0 @ 38 - .byte 0 @ 39 - .byte 0 @ 40 - .byte 0 @ 41 - .byte 0 @ 42 - .byte 0 @ 43 - .byte 0 @ 44 - .byte 0 @ 45 - .byte 0 @ 46 - .byte 0 @ 47 - .byte 0 @ 48 - .byte 0 @ 49 - .byte 0 @ 50 - .byte 0 @ 51 - .byte 0 @ 52 - .byte 0 @ 53 - .byte 0 @ 54 - .byte 0 @ 55 - .byte 0 @ 56 - .byte 0 @ 57 - .byte 0 @ 58 - .byte 0 @ 59 - .byte 0 @ 60 - .byte 0 @ 61 - .byte 0 @ 62 - .byte 0 @ 63 - .byte 0 @ 64 - .byte 0 @ 65 - .byte 1 @ 66 - .byte 1 @ 67 - .byte 1 @ 68 - .byte 1 @ 69 - .byte 1 @ 70 - .byte 1 @ 71 - .byte 1 @ 72 - .byte 1 @ 73 - .byte 1 @ 74 - .byte 1 @ 75 - .byte 1 @ 76 - .byte 1 @ 77 - .byte 1 @ 78 - .byte 1 @ 79 - .byte 1 @ 80 - .byte 1 @ 81 - .byte 1 @ 82 - .byte 1 @ 83 - .byte 2 @ 84 - .byte 2 @ 85 - .byte 2 @ 86 - .byte 2 @ 87 - .byte 2 @ 88 - .byte 2 @ 89 - .byte 2 @ 90 - .byte 2 @ 91 - .byte 2 @ 92 - .byte 2 @ 93 - .byte 2 @ 94 - .byte 2 @ 95 - .byte 2 @ 96 - .byte 2 @ 97 - .byte 2 @ 98 - .byte 2 @ 99 - .byte 2 @ 100 - .byte 2 @ 101 - .byte 2 @ 102 - .byte 2 @ 103 - .byte 2 @ 104 - .byte 2 @ 105 - .byte 2 @ 106 - .byte 2 @ 107 +keysplit trumpet, 36 + split 0, 66 + split 1, 84 + split 2, 108 -.set KeySplitTable4, . - 24 - .byte 0 @ 24 - .byte 0 @ 25 - .byte 0 @ 26 - .byte 0 @ 27 - .byte 0 @ 28 - .byte 0 @ 29 - .byte 0 @ 30 - .byte 0 @ 31 - .byte 0 @ 32 - .byte 0 @ 33 - .byte 0 @ 34 - .byte 0 @ 35 - .byte 0 @ 36 - .byte 0 @ 37 - .byte 0 @ 38 - .byte 0 @ 39 - .byte 0 @ 40 - .byte 0 @ 41 - .byte 1 @ 42 - .byte 1 @ 43 - .byte 1 @ 44 - .byte 1 @ 45 - .byte 1 @ 46 - .byte 1 @ 47 - .byte 1 @ 48 - .byte 1 @ 49 - .byte 1 @ 50 - .byte 1 @ 51 - .byte 1 @ 52 - .byte 1 @ 53 - .byte 1 @ 54 - .byte 1 @ 55 - .byte 1 @ 56 - .byte 1 @ 57 - .byte 1 @ 58 - .byte 1 @ 59 - .byte 1 @ 60 - .byte 1 @ 61 - .byte 1 @ 62 - .byte 1 @ 63 - .byte 1 @ 64 - .byte 1 @ 65 - .byte 1 @ 66 - .byte 1 @ 67 - .byte 1 @ 68 - .byte 1 @ 69 - .byte 1 @ 70 - .byte 1 @ 71 - .byte 1 @ 72 - .byte 1 @ 73 - .byte 1 @ 74 - .byte 1 @ 75 - .byte 1 @ 76 - .byte 1 @ 77 - .byte 1 @ 78 - .byte 1 @ 79 - .byte 1 @ 80 - .byte 1 @ 81 - .byte 1 @ 82 - .byte 1 @ 83 - .byte 1 @ 84 - .byte 1 @ 85 - .byte 1 @ 86 - .byte 1 @ 87 - .byte 1 @ 88 - .byte 1 @ 89 - .byte 1 @ 90 - .byte 1 @ 91 - .byte 1 @ 92 - .byte 1 @ 93 - .byte 1 @ 94 - .byte 1 @ 95 - .byte 1 @ 96 - .byte 1 @ 97 - .byte 1 @ 98 - .byte 1 @ 99 - .byte 1 @ 100 - .byte 1 @ 101 - .byte 1 @ 102 - .byte 1 @ 103 - .byte 1 @ 104 - .byte 1 @ 105 - .byte 1 @ 106 - .byte 1 @ 107 +keysplit tuba, 24 + split 0, 42 + split 1, 108 -.set KeySplitTable5, . - 36 - .byte 0 @ 36 - .byte 0 @ 37 - .byte 0 @ 38 - .byte 0 @ 39 - .byte 0 @ 40 - .byte 0 @ 41 - .byte 0 @ 42 - .byte 0 @ 43 - .byte 0 @ 44 - .byte 0 @ 45 - .byte 0 @ 46 - .byte 0 @ 47 - .byte 0 @ 48 - .byte 0 @ 49 - .byte 0 @ 50 - .byte 0 @ 51 - .byte 0 @ 52 - .byte 0 @ 53 - .byte 0 @ 54 - .byte 0 @ 55 - .byte 0 @ 56 - .byte 0 @ 57 - .byte 0 @ 58 - .byte 0 @ 59 - .byte 0 @ 60 - .byte 0 @ 61 - .byte 0 @ 62 - .byte 0 @ 63 - .byte 0 @ 64 - .byte 0 @ 65 - .byte 1 @ 66 - .byte 1 @ 67 - .byte 1 @ 68 - .byte 1 @ 69 - .byte 1 @ 70 - .byte 1 @ 71 - .byte 1 @ 72 - .byte 1 @ 73 - .byte 1 @ 74 - .byte 1 @ 75 - .byte 1 @ 76 - .byte 1 @ 77 - .byte 1 @ 78 - .byte 1 @ 79 - .byte 1 @ 80 - .byte 1 @ 81 - .byte 1 @ 82 - .byte 1 @ 83 - .byte 1 @ 84 - .byte 1 @ 85 - .byte 1 @ 86 - .byte 1 @ 87 - .byte 1 @ 88 - .byte 1 @ 89 - .byte 1 @ 90 - .byte 1 @ 91 - .byte 1 @ 92 - .byte 1 @ 93 - .byte 1 @ 94 - .byte 1 @ 95 - .byte 1 @ 96 - .byte 1 @ 97 - .byte 1 @ 98 - .byte 1 @ 99 - .byte 1 @ 100 - .byte 1 @ 101 - .byte 1 @ 102 - .byte 1 @ 103 - .byte 1 @ 104 - .byte 1 @ 105 - .byte 1 @ 106 - .byte 1 @ 107 +keysplit french_horn, 36 + split 0, 66 + split 1, 108 diff --git a/sound/song_table.inc b/sound/song_table.inc index c551a656b9d4..6e4237b998ba 100644 --- a/sound/song_table.inc +++ b/sound/song_table.inc @@ -1,616 +1,621 @@ + .equiv MUSIC_PLAYER_BGM,0 + .equiv MUSIC_PLAYER_SE1,1 + .equiv MUSIC_PLAYER_SE2,2 + .equiv MUSIC_PLAYER_SE3,3 + .align 2 gSongTable:: - song mus_dummy, 0, 0 - song se_use_item, 1, 1 - song se_pc_login, 1, 1 - song se_pc_off, 1, 1 - song se_pc_on, 1, 1 - song se_select, 2, 2 - song se_win_open, 1, 1 - song se_wall_hit, 2, 2 - song se_door, 1, 1 - song se_exit, 1, 1 - song se_ledge, 1, 1 - song se_bike_bell, 1, 1 - song se_not_effective, 1, 1 - song se_effective, 1, 1 - song se_super_effective, 1, 1 - song se_ball_open, 1, 1 - song se_faint, 1, 1 - song se_flee, 1, 1 - song se_sliding_door, 1, 1 - song se_ship, 1, 1 - song se_bang, 1, 1 - song se_pin, 1, 1 - song se_boo, 1, 1 - song se_ball, 1, 1 - song se_contest_place, 2, 2 - song se_a, 1, 1 - song se_i, 1, 1 - song se_u, 1, 1 - song se_e, 1, 1 - song se_o, 1, 1 - song se_n, 1, 1 - song se_success, 1, 1 - song se_failure, 1, 1 - song se_exp, 1, 1 - song se_bike_hop, 1, 1 - song se_switch, 1, 1 - song se_click, 1, 1 - song se_fu_zaku, 1, 1 - song se_contest_condition_lose, 1, 1 - song se_lavaridge_fall_warp, 1, 1 - song se_ice_stairs, 1, 1 - song se_ice_break, 1, 1 - song se_ice_crack, 1, 1 - song se_fall, 1, 1 - song se_unlock, 2, 2 - song se_warp_in, 1, 1 - song se_warp_out, 1, 1 - song se_repel, 1, 1 - song se_rotating_gate, 1, 1 - song se_truck_move, 1, 1 - song se_truck_stop, 1, 1 - song se_truck_unload, 2, 2 - song se_truck_door, 1, 1 - song se_berry_blender, 2, 2 - song se_card, 1, 1 - song se_save, 1, 1 - song se_ball_bounce_1, 1, 1 - song se_ball_bounce_2, 1, 1 - song se_ball_bounce_3, 1, 1 - song se_ball_bounce_4, 1, 1 - song se_ball_trade, 2, 2 - song se_ball_throw, 1, 1 - song se_note_c, 2, 2 - song se_note_d, 2, 2 - song se_note_e, 2, 2 - song se_note_f, 2, 2 - song se_note_g, 2, 2 - song se_note_a, 2, 2 - song se_note_b, 2, 2 - song se_note_c_high, 2, 2 - song se_puddle, 2, 2 - song se_bridge_walk, 2, 2 - song se_itemfinder, 1, 1 - song se_ding_dong, 1, 1 - song se_balloon_red, 2, 2 - song se_balloon_blue, 2, 2 - song se_balloon_yellow, 2, 2 - song se_breakable_door, 2, 2 - song se_mud_ball, 2, 2 - song se_field_poison, 1, 1 - song se_escalator, 1, 1 - song se_thunderstorm, 3, 3 - song se_thunderstorm_stop, 3, 3 - song se_downpour, 3, 3 - song se_downpour_stop, 3, 3 - song se_rain, 3, 3 - song se_rain_stop, 3, 3 - song se_thunder, 1, 1 - song se_thunder2, 1, 1 - song se_elevator, 1, 1 - song se_low_health, 3, 3 - song se_exp_max, 1, 1 - song se_roulette_ball, 2, 2 - song se_roulette_ball2, 2, 2 - song se_taillow_wing_flap, 1, 1 - song se_shop, 1, 1 - song se_contest_heart, 1, 1 - song se_contest_curtain_rise, 1, 1 - song se_contest_curtain_fall, 1, 1 - song se_contest_icon_change, 1, 1 - song se_contest_icon_clear, 1, 1 - song se_contest_mons_turn, 1, 1 - song se_shiny, 1, 1 - song se_intro_blast, 1, 1 - song se_mugshot, 1, 1 - song se_applause, 1, 1 - song se_vend, 1, 1 - song se_orb, 1, 1 - song se_dex_scroll, 1, 1 - song se_dex_page, 1, 1 - song se_pokenav_on, 1, 1 - song se_pokenav_off, 1, 1 - song se_dex_search, 1, 1 - song se_egg_hatch, 1, 1 - song se_ball_tray_enter, 1, 1 - song se_ball_tray_ball, 1, 1 - song se_ball_tray_exit, 2, 2 - song se_glass_flute, 1, 1 - song se_m_thunderbolt, 2, 2 - song se_m_thunderbolt2, 1, 1 - song se_m_harden, 1, 1 - song se_m_nightmare, 1, 1 - song se_m_vital_throw, 1, 1 - song se_m_vital_throw2, 1, 1 - song se_m_bubble, 1, 1 - song se_m_bubble2, 1, 1 - song se_m_bubble3, 1, 1 - song se_m_rain_dance, 1, 1 - song se_m_cut, 1, 1 - song se_m_string_shot, 1, 1 - song se_m_string_shot2, 1, 1 - song se_m_rock_throw, 1, 1 - song se_m_gust, 2, 2 - song se_m_gust2, 2, 2 - song se_m_double_slap, 1, 1 - song se_m_double_team, 1, 1 - song se_m_razor_wind, 1, 1 - song se_m_icy_wind, 1, 1 - song se_m_thunder_wave, 1, 1 - song se_m_comet_punch, 1, 1 - song se_m_mega_kick, 1, 1 - song se_m_mega_kick2, 1, 1 - song se_m_crabhammer, 1, 1 - song se_m_jump_kick, 1, 1 - song se_m_flame_wheel, 1, 1 - song se_m_flame_wheel2, 1, 1 - song se_m_flamethrower, 1, 1 - song se_m_fire_punch, 1, 1 - song se_m_toxic, 1, 1 - song se_m_sacred_fire, 1, 1 - song se_m_sacred_fire2, 2, 2 - song se_m_ember, 1, 1 - song se_m_take_down, 2, 2 - song se_m_blizzard, 1, 1 - song se_m_blizzard2, 1, 1 - song se_m_scratch, 1, 1 - song se_m_vicegrip, 1, 1 - song se_m_wing_attack, 1, 1 - song se_m_fly, 1, 1 - song se_m_sand_attack, 1, 1 - song se_m_razor_wind2, 1, 1 - song se_m_bite, 1, 1 - song se_m_headbutt, 1, 1 - song se_m_surf, 1, 1 - song se_m_hydro_pump, 1, 1 - song se_m_whirlpool, 1, 1 - song se_m_horn_attack, 1, 1 - song se_m_tail_whip, 2, 2 - song se_m_mist, 1, 1 - song se_m_poison_powder, 1, 1 - song se_m_bind, 2, 2 - song se_m_dragon_rage, 1, 1 - song se_m_sing, 1, 1 - song se_m_perish_song, 1, 1 - song se_m_pay_day, 1, 1 - song se_m_dig, 1, 1 - song se_m_dizzy_punch, 1, 1 - song se_m_self_destruct, 1, 1 - song se_m_explosion, 1, 1 - song se_m_absorb_2, 1, 1 - song se_m_absorb, 1, 1 - song se_m_screech, 1, 1 - song se_m_bubble_beam, 1, 1 - song se_m_bubble_beam2, 1, 1 - song se_m_supersonic, 1, 1 - song se_m_belly_drum, 1, 1 - song se_m_metronome, 1, 1 - song se_m_bonemerang, 1, 1 - song se_m_lick, 1, 1 - song se_m_psybeam, 1, 1 - song se_m_faint_attack, 1, 1 - song se_m_swords_dance, 1, 1 - song se_m_leer, 1, 1 - song se_m_swagger, 1, 1 - song se_m_swagger2, 1, 1 - song se_m_heal_bell, 1, 1 - song se_m_confuse_ray, 1, 1 - song se_m_snore, 1, 1 - song se_m_brick_break, 1, 1 - song se_m_giga_drain, 1, 1 - song se_m_psybeam2, 1, 1 - song se_m_solar_beam, 2, 2 - song se_m_petal_dance, 1, 1 - song se_m_teleport, 1, 1 - song se_m_minimize, 1, 1 - song se_m_sketch, 1, 1 - song se_m_swift, 1, 1 - song se_m_reflect, 1, 1 - song se_m_barrier, 1, 1 - song se_m_detect, 2, 2 - song se_m_lock_on, 1, 1 - song se_m_moonlight, 1, 1 - song se_m_charm, 1, 1 - song se_m_charge, 1, 1 - song se_m_strength, 1, 1 - song se_m_hyper_beam, 1, 1 - song se_m_waterfall, 1, 1 - song se_m_reversal, 1, 1 - song se_m_acid_armor, 1, 1 - song se_m_sandstorm, 1, 1 - song se_m_tri_attack, 1, 1 - song se_m_tri_attack2, 1, 1 - song se_m_encore, 1, 1 - song se_m_encore2, 2, 2 - song se_m_baton_pass, 1, 1 - song se_m_milk_drink, 1, 1 - song se_m_attract, 1, 1 - song se_m_attract2, 1, 1 - song se_m_morning_sun, 1, 1 - song se_m_flatter, 1, 1 - song se_m_sand_tomb, 1, 1 - song se_m_grasswhistle, 1, 1 - song se_m_spit_up, 1, 1 - song se_m_dive, 1, 1 - song se_m_earthquake, 2, 2 - song se_m_twister, 2, 2 - song se_m_sweet_scent, 1, 1 - song se_m_yawn, 1, 1 - song se_m_sky_uppercut, 2, 2 - song se_m_stat_increase, 1, 1 - song se_m_heat_wave, 1, 1 - song se_m_uproar, 1, 1 - song se_m_hail, 1, 1 - song se_m_cosmic_power, 2, 2 - song se_m_teeter_dance, 1, 1 - song se_m_stat_decrease, 1, 1 - song se_m_haze, 1, 1 - song se_m_hyper_beam2, 1, 1 - song se_rg_door, 1, 1 - song se_rg_card_flip, 1, 1 - song se_rg_card_flipping, 1, 1 - song se_rg_card_open, 1, 1 - song se_rg_bag_cursor, 1, 1 - song se_rg_bag_pocket, 1, 1 - song se_rg_ball_click, 1, 1 - song se_rg_shop, 1, 1 - song se_rg_ss_anne_horn, 1, 1 - song se_rg_help_open, 1, 1 - song se_rg_help_close, 1, 1 - song se_rg_help_error, 1, 1 - song se_rg_deoxys_move, 1, 1 - song se_rg_poke_jump_success, 1, 1 - song se_rg_poke_jump_failure, 1, 1 - song se_pokenav_call, 1, 1 - song se_pokenav_hang_up, 1, 1 - song se_arena_timeup1, 1, 1 - song se_arena_timeup2, 1, 1 - song se_pike_curtain_close, 1, 1 - song se_pike_curtain_open, 1, 1 - song se_sudowoodo_shake, 1, 1 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song dummy_song_header, 0, 0 - song mus_littleroot_test, 0, 0 - song mus_gsc_route38, 0, 0 - song mus_caught, 0, 0 - song mus_victory_wild, 0, 0 - song mus_victory_gym_leader, 0, 0 - song mus_victory_league, 0, 0 - song mus_c_comm_center, 0, 0 - song mus_gsc_pewter, 0, 0 - song mus_c_vs_legend_beast, 0, 0 - song mus_route101, 0, 0 - song mus_route110, 0, 0 - song mus_route120, 0, 0 - song mus_petalburg, 0, 0 - song mus_oldale, 0, 0 - song mus_gym, 0, 0 - song mus_surf, 0, 0 - song mus_petalburg_woods, 0, 0 - song mus_level_up, 2, 2 - song mus_heal, 2, 2 - song mus_obtain_badge, 2, 2 - song mus_obtain_item, 2, 2 - song mus_evolved, 2, 2 - song mus_obtain_tmhm, 2, 2 - song mus_lilycove_museum, 0, 0 - song mus_route122, 0, 0 - song mus_oceanic_museum, 0, 0 - song mus_evolution_intro, 2, 2 - song mus_evolution, 0, 0 - song mus_move_deleted, 2, 2 - song mus_encounter_girl, 0, 0 - song mus_encounter_male, 0, 0 - song mus_abandoned_ship, 0, 0 - song mus_fortree, 0, 0 - song mus_birch_lab, 0, 0 - song mus_b_tower_rs, 0, 0 - song mus_encounter_swimmer, 0, 0 - song mus_cave_of_origin, 0, 0 - song mus_obtain_berry, 2, 2 - song mus_awaken_legend, 2, 2 - song mus_slots_jackpot, 2, 2 - song mus_slots_win, 2, 2 - song mus_too_bad, 2, 2 - song mus_roulette, 0, 0 - song mus_link_contest_p1, 0, 0 - song mus_link_contest_p2, 0, 0 - song mus_link_contest_p3, 0, 0 - song mus_link_contest_p4, 0, 0 - song mus_encounter_rich, 0, 0 - song mus_verdanturf, 0, 0 - song mus_rustboro, 0, 0 - song mus_poke_center, 0, 0 - song mus_route104, 0, 0 - song mus_route119, 0, 0 - song mus_cycling, 0, 0 - song mus_poke_mart, 0, 0 - song mus_littleroot, 0, 0 - song mus_mt_chimney, 0, 0 - song mus_encounter_female, 0, 0 - song mus_lilycove, 0, 0 - song mus_route111, 0, 0 - song mus_help, 0, 0 - song mus_underwater, 0, 0 - song mus_victory_trainer, 0, 0 - song mus_title, 0, 0 - song mus_intro, 0, 0 - song mus_encounter_may, 0, 0 - song mus_encounter_intense, 0, 0 - song mus_encounter_cool, 0, 0 - song mus_route113, 0, 0 - song mus_encounter_aqua, 0, 0 - song mus_follow_me, 0, 0 - song mus_encounter_brendan, 0, 0 - song mus_ever_grande, 0, 0 - song mus_encounter_suspicious, 0, 0 - song mus_victory_aqua_magma, 0, 0 - song mus_cable_car, 0, 0 - song mus_game_corner, 0, 0 - song mus_dewford, 0, 0 - song mus_safari_zone, 0, 0 - song mus_victory_road, 0, 0 - song mus_aqua_magma_hideout, 0, 0 - song mus_sailing, 0, 0 - song mus_mt_pyre, 0, 0 - song mus_slateport, 0, 0 - song mus_mt_pyre_exterior, 0, 0 - song mus_school, 0, 0 - song mus_hall_of_fame, 0, 0 - song mus_fallarbor, 0, 0 - song mus_sealed_chamber, 0, 0 - song mus_contest_winner, 0, 0 - song mus_contest, 0, 0 - song mus_encounter_magma, 0, 0 - song mus_intro_battle, 0, 0 - song mus_abnormal_weather, 0, 0 - song mus_weather_groudon, 0, 0 - song mus_sootopolis, 0, 0 - song mus_contest_results, 0, 0 - song mus_hall_of_fame_room, 0, 0 - song mus_trick_house, 0, 0 - song mus_encounter_twins, 0, 0 - song mus_encounter_elite_four, 0, 0 - song mus_encounter_hiker, 0, 0 - song mus_contest_lobby, 0, 0 - song mus_encounter_interviewer, 0, 0 - song mus_encounter_champion, 0, 0 - song mus_credits, 0, 0 - song mus_end, 0, 0 - song mus_b_frontier, 0, 0 - song mus_b_arena, 0, 0 - song mus_obtain_b_points, 2, 2 - song mus_register_match_call, 2, 2 - song mus_b_pyramid, 0, 0 - song mus_b_pyramid_top, 0, 0 - song mus_b_palace, 0, 0 - song mus_rayquaza_appears, 0, 0 - song mus_b_tower, 0, 0 - song mus_obtain_symbol, 2, 2 - song mus_b_dome, 0, 0 - song mus_b_pike, 0, 0 - song mus_b_factory, 0, 0 - song mus_vs_rayquaza, 0, 0 - song mus_vs_frontier_brain, 0, 0 - song mus_vs_mew, 0, 0 - song mus_b_dome_lobby, 0, 0 - song mus_vs_wild, 0, 0 - song mus_vs_aqua_magma, 0, 0 - song mus_vs_trainer, 0, 0 - song mus_vs_gym_leader, 0, 0 - song mus_vs_champion, 0, 0 - song mus_vs_regi, 0, 0 - song mus_vs_kyogre_groudon, 0, 0 - song mus_vs_rival, 0, 0 - song mus_vs_elite_four, 0, 0 - song mus_vs_aqua_magma_leader, 0, 0 - song mus_rg_follow_me, 0, 0 - song mus_rg_game_corner, 0, 0 - song mus_rg_rocket_hideout, 0, 0 - song mus_rg_gym, 0, 0 - song mus_rg_jigglypuff, 2, 2 - song mus_rg_intro_fight, 0, 0 - song mus_rg_title, 0, 0 - song mus_rg_cinnabar, 0, 0 - song mus_rg_lavender, 0, 0 - song mus_rg_heal, 0, 0 - song mus_rg_cycling, 0, 0 - song mus_rg_encounter_rocket, 0, 0 - song mus_rg_encounter_girl, 0, 0 - song mus_rg_encounter_boy, 0, 0 - song mus_rg_hall_of_fame, 0, 0 - song mus_rg_viridian_forest, 0, 0 - song mus_rg_mt_moon, 0, 0 - song mus_rg_poke_mansion, 0, 0 - song mus_rg_credits, 0, 0 - song mus_rg_route1, 0, 0 - song mus_rg_route24, 0, 0 - song mus_rg_route3, 0, 0 - song mus_rg_route11, 0, 0 - song mus_rg_victory_road, 0, 0 - song mus_rg_vs_gym_leader, 0, 0 - song mus_rg_vs_trainer, 0, 0 - song mus_rg_vs_wild, 0, 0 - song mus_rg_vs_champion, 0, 0 - song mus_rg_pallet, 0, 0 - song mus_rg_oak_lab, 0, 0 - song mus_rg_oak, 0, 0 - song mus_rg_poke_center, 0, 0 - song mus_rg_ss_anne, 0, 0 - song mus_rg_surf, 0, 0 - song mus_rg_poke_tower, 0, 0 - song mus_rg_silph, 0, 0 - song mus_rg_fuchsia, 0, 0 - song mus_rg_celadon, 0, 0 - song mus_rg_victory_trainer, 0, 0 - song mus_rg_victory_wild, 0, 0 - song mus_rg_victory_gym_leader, 0, 0 - song mus_rg_vermillion, 0, 0 - song mus_rg_pewter, 0, 0 - song mus_rg_encounter_rival, 0, 0 - song mus_rg_rival_exit, 0, 0 - song mus_rg_dex_rating, 2, 2 - song mus_rg_obtain_key_item, 2, 2 - song mus_rg_caught_intro, 2, 2 - song mus_rg_photo, 2, 2 - song mus_rg_game_freak, 0, 0 - song mus_rg_caught, 0, 0 - song mus_rg_new_game_instruct, 0, 0 - song mus_rg_new_game_intro, 0, 0 - song mus_rg_new_game_exit, 0, 0 - song mus_rg_poke_jump, 0, 0 - song mus_rg_union_room, 0, 0 - song mus_rg_net_center, 0, 0 - song mus_rg_mystery_gift, 0, 0 - song mus_rg_berry_pick, 0, 0 - song mus_rg_sevii_cave, 0, 0 - song mus_rg_teachy_tv_show, 0, 0 - song mus_rg_sevii_route, 0, 0 - song mus_rg_sevii_dungeon, 0, 0 - song mus_rg_sevii_123, 0, 0 - song mus_rg_sevii_45, 0, 0 - song mus_rg_sevii_67, 0, 0 - song mus_rg_poke_flute, 2, 2 - song mus_rg_vs_deoxys, 0, 0 - song mus_rg_vs_mewtwo, 0, 0 - song mus_rg_vs_legend, 0, 0 - song mus_rg_encounter_gym_leader, 0, 0 - song mus_rg_encounter_deoxys, 0, 0 - song mus_rg_trainer_tower, 0, 0 - song mus_rg_slow_pallet, 0, 0 - song mus_rg_teachy_tv_menu, 0, 0 - song ph_trap_blend, 2, 2 - song ph_trap_held, 2, 2 - song ph_trap_solo, 2, 2 - song ph_face_blend, 2, 2 - song ph_face_held, 2, 2 - song ph_face_solo, 2, 2 - song ph_cloth_blend, 2, 2 - song ph_cloth_held, 2, 2 - song ph_cloth_solo, 2, 2 - song ph_dress_blend, 2, 2 - song ph_dress_held, 2, 2 - song ph_dress_solo, 2, 2 - song ph_fleece_blend, 2, 2 - song ph_fleece_held, 2, 2 - song ph_fleece_solo, 2, 2 - song ph_kit_blend, 2, 2 - song ph_kit_held, 2, 2 - song ph_kit_solo, 2, 2 - song ph_price_blend, 2, 2 - song ph_price_held, 2, 2 - song ph_price_solo, 2, 2 - song ph_lot_blend, 2, 2 - song ph_lot_held, 2, 2 - song ph_lot_solo, 2, 2 - song ph_goat_blend, 2, 2 - song ph_goat_held, 2, 2 - song ph_goat_solo, 2, 2 - song ph_thought_blend, 2, 2 - song ph_thought_held, 2, 2 - song ph_thought_solo, 2, 2 - song ph_choice_blend, 2, 2 - song ph_choice_held, 2, 2 - song ph_choice_solo, 2, 2 - song ph_mouth_blend, 2, 2 - song ph_mouth_held, 2, 2 - song ph_mouth_solo, 2, 2 - song ph_foot_blend, 2, 2 - song ph_foot_held, 2, 2 - song ph_foot_solo, 2, 2 - song ph_goose_blend, 2, 2 - song ph_goose_held, 2, 2 - song ph_goose_solo, 2, 2 - song ph_strut_blend, 2, 2 - song ph_strut_held, 2, 2 - song ph_strut_solo, 2, 2 - song ph_cure_blend, 2, 2 - song ph_cure_held, 2, 2 - song ph_cure_solo, 2, 2 - song ph_nurse_blend, 2, 2 - song ph_nurse_held, 2, 2 - song ph_nurse_solo, 2, 2 + song mus_dummy, MUSIC_PLAYER_BGM, 0 + song se_use_item, MUSIC_PLAYER_SE1, 1 + song se_pc_login, MUSIC_PLAYER_SE1, 1 + song se_pc_off, MUSIC_PLAYER_SE1, 1 + song se_pc_on, MUSIC_PLAYER_SE1, 1 + song se_select, MUSIC_PLAYER_SE2, 2 + song se_win_open, MUSIC_PLAYER_SE1, 1 + song se_wall_hit, MUSIC_PLAYER_SE2, 2 + song se_door, MUSIC_PLAYER_SE1, 1 + song se_exit, MUSIC_PLAYER_SE1, 1 + song se_ledge, MUSIC_PLAYER_SE1, 1 + song se_bike_bell, MUSIC_PLAYER_SE1, 1 + song se_not_effective, MUSIC_PLAYER_SE1, 1 + song se_effective, MUSIC_PLAYER_SE1, 1 + song se_super_effective, MUSIC_PLAYER_SE1, 1 + song se_ball_open, MUSIC_PLAYER_SE1, 1 + song se_faint, MUSIC_PLAYER_SE1, 1 + song se_flee, MUSIC_PLAYER_SE1, 1 + song se_sliding_door, MUSIC_PLAYER_SE1, 1 + song se_ship, MUSIC_PLAYER_SE1, 1 + song se_bang, MUSIC_PLAYER_SE1, 1 + song se_pin, MUSIC_PLAYER_SE1, 1 + song se_boo, MUSIC_PLAYER_SE1, 1 + song se_ball, MUSIC_PLAYER_SE1, 1 + song se_contest_place, MUSIC_PLAYER_SE2, 2 + song se_a, MUSIC_PLAYER_SE1, 1 + song se_i, MUSIC_PLAYER_SE1, 1 + song se_u, MUSIC_PLAYER_SE1, 1 + song se_e, MUSIC_PLAYER_SE1, 1 + song se_o, MUSIC_PLAYER_SE1, 1 + song se_n, MUSIC_PLAYER_SE1, 1 + song se_success, MUSIC_PLAYER_SE1, 1 + song se_failure, MUSIC_PLAYER_SE1, 1 + song se_exp, MUSIC_PLAYER_SE1, 1 + song se_bike_hop, MUSIC_PLAYER_SE1, 1 + song se_switch, MUSIC_PLAYER_SE1, 1 + song se_click, MUSIC_PLAYER_SE1, 1 + song se_fu_zaku, MUSIC_PLAYER_SE1, 1 + song se_contest_condition_lose, MUSIC_PLAYER_SE1, 1 + song se_lavaridge_fall_warp, MUSIC_PLAYER_SE1, 1 + song se_ice_stairs, MUSIC_PLAYER_SE1, 1 + song se_ice_break, MUSIC_PLAYER_SE1, 1 + song se_ice_crack, MUSIC_PLAYER_SE1, 1 + song se_fall, MUSIC_PLAYER_SE1, 1 + song se_unlock, MUSIC_PLAYER_SE2, 2 + song se_warp_in, MUSIC_PLAYER_SE1, 1 + song se_warp_out, MUSIC_PLAYER_SE1, 1 + song se_repel, MUSIC_PLAYER_SE1, 1 + song se_rotating_gate, MUSIC_PLAYER_SE1, 1 + song se_truck_move, MUSIC_PLAYER_SE1, 1 + song se_truck_stop, MUSIC_PLAYER_SE1, 1 + song se_truck_unload, MUSIC_PLAYER_SE2, 2 + song se_truck_door, MUSIC_PLAYER_SE1, 1 + song se_berry_blender, MUSIC_PLAYER_SE2, 2 + song se_card, MUSIC_PLAYER_SE1, 1 + song se_save, MUSIC_PLAYER_SE1, 1 + song se_ball_bounce_1, MUSIC_PLAYER_SE1, 1 + song se_ball_bounce_2, MUSIC_PLAYER_SE1, 1 + song se_ball_bounce_3, MUSIC_PLAYER_SE1, 1 + song se_ball_bounce_4, MUSIC_PLAYER_SE1, 1 + song se_ball_trade, MUSIC_PLAYER_SE2, 2 + song se_ball_throw, MUSIC_PLAYER_SE1, 1 + song se_note_c, MUSIC_PLAYER_SE2, 2 + song se_note_d, MUSIC_PLAYER_SE2, 2 + song se_note_e, MUSIC_PLAYER_SE2, 2 + song se_note_f, MUSIC_PLAYER_SE2, 2 + song se_note_g, MUSIC_PLAYER_SE2, 2 + song se_note_a, MUSIC_PLAYER_SE2, 2 + song se_note_b, MUSIC_PLAYER_SE2, 2 + song se_note_c_high, MUSIC_PLAYER_SE2, 2 + song se_puddle, MUSIC_PLAYER_SE2, 2 + song se_bridge_walk, MUSIC_PLAYER_SE2, 2 + song se_itemfinder, MUSIC_PLAYER_SE1, 1 + song se_ding_dong, MUSIC_PLAYER_SE1, 1 + song se_balloon_red, MUSIC_PLAYER_SE2, 2 + song se_balloon_blue, MUSIC_PLAYER_SE2, 2 + song se_balloon_yellow, MUSIC_PLAYER_SE2, 2 + song se_breakable_door, MUSIC_PLAYER_SE2, 2 + song se_mud_ball, MUSIC_PLAYER_SE2, 2 + song se_field_poison, MUSIC_PLAYER_SE1, 1 + song se_escalator, MUSIC_PLAYER_SE1, 1 + song se_thunderstorm, MUSIC_PLAYER_SE3, 3 + song se_thunderstorm_stop, MUSIC_PLAYER_SE3, 3 + song se_downpour, MUSIC_PLAYER_SE3, 3 + song se_downpour_stop, MUSIC_PLAYER_SE3, 3 + song se_rain, MUSIC_PLAYER_SE3, 3 + song se_rain_stop, MUSIC_PLAYER_SE3, 3 + song se_thunder, MUSIC_PLAYER_SE1, 1 + song se_thunder2, MUSIC_PLAYER_SE1, 1 + song se_elevator, MUSIC_PLAYER_SE1, 1 + song se_low_health, MUSIC_PLAYER_SE3, 3 + song se_exp_max, MUSIC_PLAYER_SE1, 1 + song se_roulette_ball, MUSIC_PLAYER_SE2, 2 + song se_roulette_ball2, MUSIC_PLAYER_SE2, 2 + song se_taillow_wing_flap, MUSIC_PLAYER_SE1, 1 + song se_shop, MUSIC_PLAYER_SE1, 1 + song se_contest_heart, MUSIC_PLAYER_SE1, 1 + song se_contest_curtain_rise, MUSIC_PLAYER_SE1, 1 + song se_contest_curtain_fall, MUSIC_PLAYER_SE1, 1 + song se_contest_icon_change, MUSIC_PLAYER_SE1, 1 + song se_contest_icon_clear, MUSIC_PLAYER_SE1, 1 + song se_contest_mons_turn, MUSIC_PLAYER_SE1, 1 + song se_shiny, MUSIC_PLAYER_SE1, 1 + song se_intro_blast, MUSIC_PLAYER_SE1, 1 + song se_mugshot, MUSIC_PLAYER_SE1, 1 + song se_applause, MUSIC_PLAYER_SE1, 1 + song se_vend, MUSIC_PLAYER_SE1, 1 + song se_orb, MUSIC_PLAYER_SE1, 1 + song se_dex_scroll, MUSIC_PLAYER_SE1, 1 + song se_dex_page, MUSIC_PLAYER_SE1, 1 + song se_pokenav_on, MUSIC_PLAYER_SE1, 1 + song se_pokenav_off, MUSIC_PLAYER_SE1, 1 + song se_dex_search, MUSIC_PLAYER_SE1, 1 + song se_egg_hatch, MUSIC_PLAYER_SE1, 1 + song se_ball_tray_enter, MUSIC_PLAYER_SE1, 1 + song se_ball_tray_ball, MUSIC_PLAYER_SE1, 1 + song se_ball_tray_exit, MUSIC_PLAYER_SE2, 2 + song se_glass_flute, MUSIC_PLAYER_SE1, 1 + song se_m_thunderbolt, MUSIC_PLAYER_SE2, 2 + song se_m_thunderbolt2, MUSIC_PLAYER_SE1, 1 + song se_m_harden, MUSIC_PLAYER_SE1, 1 + song se_m_nightmare, MUSIC_PLAYER_SE1, 1 + song se_m_vital_throw, MUSIC_PLAYER_SE1, 1 + song se_m_vital_throw2, MUSIC_PLAYER_SE1, 1 + song se_m_bubble, MUSIC_PLAYER_SE1, 1 + song se_m_bubble2, MUSIC_PLAYER_SE1, 1 + song se_m_bubble3, MUSIC_PLAYER_SE1, 1 + song se_m_rain_dance, MUSIC_PLAYER_SE1, 1 + song se_m_cut, MUSIC_PLAYER_SE1, 1 + song se_m_string_shot, MUSIC_PLAYER_SE1, 1 + song se_m_string_shot2, MUSIC_PLAYER_SE1, 1 + song se_m_rock_throw, MUSIC_PLAYER_SE1, 1 + song se_m_gust, MUSIC_PLAYER_SE2, 2 + song se_m_gust2, MUSIC_PLAYER_SE2, 2 + song se_m_double_slap, MUSIC_PLAYER_SE1, 1 + song se_m_double_team, MUSIC_PLAYER_SE1, 1 + song se_m_razor_wind, MUSIC_PLAYER_SE1, 1 + song se_m_icy_wind, MUSIC_PLAYER_SE1, 1 + song se_m_thunder_wave, MUSIC_PLAYER_SE1, 1 + song se_m_comet_punch, MUSIC_PLAYER_SE1, 1 + song se_m_mega_kick, MUSIC_PLAYER_SE1, 1 + song se_m_mega_kick2, MUSIC_PLAYER_SE1, 1 + song se_m_crabhammer, MUSIC_PLAYER_SE1, 1 + song se_m_jump_kick, MUSIC_PLAYER_SE1, 1 + song se_m_flame_wheel, MUSIC_PLAYER_SE1, 1 + song se_m_flame_wheel2, MUSIC_PLAYER_SE1, 1 + song se_m_flamethrower, MUSIC_PLAYER_SE1, 1 + song se_m_fire_punch, MUSIC_PLAYER_SE1, 1 + song se_m_toxic, MUSIC_PLAYER_SE1, 1 + song se_m_sacred_fire, MUSIC_PLAYER_SE1, 1 + song se_m_sacred_fire2, MUSIC_PLAYER_SE2, 2 + song se_m_ember, MUSIC_PLAYER_SE1, 1 + song se_m_take_down, MUSIC_PLAYER_SE2, 2 + song se_m_blizzard, MUSIC_PLAYER_SE1, 1 + song se_m_blizzard2, MUSIC_PLAYER_SE1, 1 + song se_m_scratch, MUSIC_PLAYER_SE1, 1 + song se_m_vicegrip, MUSIC_PLAYER_SE1, 1 + song se_m_wing_attack, MUSIC_PLAYER_SE1, 1 + song se_m_fly, MUSIC_PLAYER_SE1, 1 + song se_m_sand_attack, MUSIC_PLAYER_SE1, 1 + song se_m_razor_wind2, MUSIC_PLAYER_SE1, 1 + song se_m_bite, MUSIC_PLAYER_SE1, 1 + song se_m_headbutt, MUSIC_PLAYER_SE1, 1 + song se_m_surf, MUSIC_PLAYER_SE1, 1 + song se_m_hydro_pump, MUSIC_PLAYER_SE1, 1 + song se_m_whirlpool, MUSIC_PLAYER_SE1, 1 + song se_m_horn_attack, MUSIC_PLAYER_SE1, 1 + song se_m_tail_whip, MUSIC_PLAYER_SE2, 2 + song se_m_mist, MUSIC_PLAYER_SE1, 1 + song se_m_poison_powder, MUSIC_PLAYER_SE1, 1 + song se_m_bind, MUSIC_PLAYER_SE2, 2 + song se_m_dragon_rage, MUSIC_PLAYER_SE1, 1 + song se_m_sing, MUSIC_PLAYER_SE1, 1 + song se_m_perish_song, MUSIC_PLAYER_SE1, 1 + song se_m_pay_day, MUSIC_PLAYER_SE1, 1 + song se_m_dig, MUSIC_PLAYER_SE1, 1 + song se_m_dizzy_punch, MUSIC_PLAYER_SE1, 1 + song se_m_self_destruct, MUSIC_PLAYER_SE1, 1 + song se_m_explosion, MUSIC_PLAYER_SE1, 1 + song se_m_absorb_2, MUSIC_PLAYER_SE1, 1 + song se_m_absorb, MUSIC_PLAYER_SE1, 1 + song se_m_screech, MUSIC_PLAYER_SE1, 1 + song se_m_bubble_beam, MUSIC_PLAYER_SE1, 1 + song se_m_bubble_beam2, MUSIC_PLAYER_SE1, 1 + song se_m_supersonic, MUSIC_PLAYER_SE1, 1 + song se_m_belly_drum, MUSIC_PLAYER_SE1, 1 + song se_m_metronome, MUSIC_PLAYER_SE1, 1 + song se_m_bonemerang, MUSIC_PLAYER_SE1, 1 + song se_m_lick, MUSIC_PLAYER_SE1, 1 + song se_m_psybeam, MUSIC_PLAYER_SE1, 1 + song se_m_faint_attack, MUSIC_PLAYER_SE1, 1 + song se_m_swords_dance, MUSIC_PLAYER_SE1, 1 + song se_m_leer, MUSIC_PLAYER_SE1, 1 + song se_m_swagger, MUSIC_PLAYER_SE1, 1 + song se_m_swagger2, MUSIC_PLAYER_SE1, 1 + song se_m_heal_bell, MUSIC_PLAYER_SE1, 1 + song se_m_confuse_ray, MUSIC_PLAYER_SE1, 1 + song se_m_snore, MUSIC_PLAYER_SE1, 1 + song se_m_brick_break, MUSIC_PLAYER_SE1, 1 + song se_m_giga_drain, MUSIC_PLAYER_SE1, 1 + song se_m_psybeam2, MUSIC_PLAYER_SE1, 1 + song se_m_solar_beam, MUSIC_PLAYER_SE2, 2 + song se_m_petal_dance, MUSIC_PLAYER_SE1, 1 + song se_m_teleport, MUSIC_PLAYER_SE1, 1 + song se_m_minimize, MUSIC_PLAYER_SE1, 1 + song se_m_sketch, MUSIC_PLAYER_SE1, 1 + song se_m_swift, MUSIC_PLAYER_SE1, 1 + song se_m_reflect, MUSIC_PLAYER_SE1, 1 + song se_m_barrier, MUSIC_PLAYER_SE1, 1 + song se_m_detect, MUSIC_PLAYER_SE2, 2 + song se_m_lock_on, MUSIC_PLAYER_SE1, 1 + song se_m_moonlight, MUSIC_PLAYER_SE1, 1 + song se_m_charm, MUSIC_PLAYER_SE1, 1 + song se_m_charge, MUSIC_PLAYER_SE1, 1 + song se_m_strength, MUSIC_PLAYER_SE1, 1 + song se_m_hyper_beam, MUSIC_PLAYER_SE1, 1 + song se_m_waterfall, MUSIC_PLAYER_SE1, 1 + song se_m_reversal, MUSIC_PLAYER_SE1, 1 + song se_m_acid_armor, MUSIC_PLAYER_SE1, 1 + song se_m_sandstorm, MUSIC_PLAYER_SE1, 1 + song se_m_tri_attack, MUSIC_PLAYER_SE1, 1 + song se_m_tri_attack2, MUSIC_PLAYER_SE1, 1 + song se_m_encore, MUSIC_PLAYER_SE1, 1 + song se_m_encore2, MUSIC_PLAYER_SE2, 2 + song se_m_baton_pass, MUSIC_PLAYER_SE1, 1 + song se_m_milk_drink, MUSIC_PLAYER_SE1, 1 + song se_m_attract, MUSIC_PLAYER_SE1, 1 + song se_m_attract2, MUSIC_PLAYER_SE1, 1 + song se_m_morning_sun, MUSIC_PLAYER_SE1, 1 + song se_m_flatter, MUSIC_PLAYER_SE1, 1 + song se_m_sand_tomb, MUSIC_PLAYER_SE1, 1 + song se_m_grasswhistle, MUSIC_PLAYER_SE1, 1 + song se_m_spit_up, MUSIC_PLAYER_SE1, 1 + song se_m_dive, MUSIC_PLAYER_SE1, 1 + song se_m_earthquake, MUSIC_PLAYER_SE2, 2 + song se_m_twister, MUSIC_PLAYER_SE2, 2 + song se_m_sweet_scent, MUSIC_PLAYER_SE1, 1 + song se_m_yawn, MUSIC_PLAYER_SE1, 1 + song se_m_sky_uppercut, MUSIC_PLAYER_SE2, 2 + song se_m_stat_increase, MUSIC_PLAYER_SE1, 1 + song se_m_heat_wave, MUSIC_PLAYER_SE1, 1 + song se_m_uproar, MUSIC_PLAYER_SE1, 1 + song se_m_hail, MUSIC_PLAYER_SE1, 1 + song se_m_cosmic_power, MUSIC_PLAYER_SE2, 2 + song se_m_teeter_dance, MUSIC_PLAYER_SE1, 1 + song se_m_stat_decrease, MUSIC_PLAYER_SE1, 1 + song se_m_haze, MUSIC_PLAYER_SE1, 1 + song se_m_hyper_beam2, MUSIC_PLAYER_SE1, 1 + song se_rg_door, MUSIC_PLAYER_SE1, 1 + song se_rg_card_flip, MUSIC_PLAYER_SE1, 1 + song se_rg_card_flipping, MUSIC_PLAYER_SE1, 1 + song se_rg_card_open, MUSIC_PLAYER_SE1, 1 + song se_rg_bag_cursor, MUSIC_PLAYER_SE1, 1 + song se_rg_bag_pocket, MUSIC_PLAYER_SE1, 1 + song se_rg_ball_click, MUSIC_PLAYER_SE1, 1 + song se_rg_shop, MUSIC_PLAYER_SE1, 1 + song se_rg_ss_anne_horn, MUSIC_PLAYER_SE1, 1 + song se_rg_help_open, MUSIC_PLAYER_SE1, 1 + song se_rg_help_close, MUSIC_PLAYER_SE1, 1 + song se_rg_help_error, MUSIC_PLAYER_SE1, 1 + song se_rg_deoxys_move, MUSIC_PLAYER_SE1, 1 + song se_rg_poke_jump_success, MUSIC_PLAYER_SE1, 1 + song se_rg_poke_jump_failure, MUSIC_PLAYER_SE1, 1 + song se_pokenav_call, MUSIC_PLAYER_SE1, 1 + song se_pokenav_hang_up, MUSIC_PLAYER_SE1, 1 + song se_arena_timeup1, MUSIC_PLAYER_SE1, 1 + song se_arena_timeup2, MUSIC_PLAYER_SE1, 1 + song se_pike_curtain_close, MUSIC_PLAYER_SE1, 1 + song se_pike_curtain_open, MUSIC_PLAYER_SE1, 1 + song se_sudowoodo_shake, MUSIC_PLAYER_SE1, 1 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song dummy_song_header, MUSIC_PLAYER_BGM, 0 + song mus_littleroot_test, MUSIC_PLAYER_BGM, 0 + song mus_gsc_route38, MUSIC_PLAYER_BGM, 0 + song mus_caught, MUSIC_PLAYER_BGM, 0 + song mus_victory_wild, MUSIC_PLAYER_BGM, 0 + song mus_victory_gym_leader, MUSIC_PLAYER_BGM, 0 + song mus_victory_league, MUSIC_PLAYER_BGM, 0 + song mus_c_comm_center, MUSIC_PLAYER_BGM, 0 + song mus_gsc_pewter, MUSIC_PLAYER_BGM, 0 + song mus_c_vs_legend_beast, MUSIC_PLAYER_BGM, 0 + song mus_route101, MUSIC_PLAYER_BGM, 0 + song mus_route110, MUSIC_PLAYER_BGM, 0 + song mus_route120, MUSIC_PLAYER_BGM, 0 + song mus_petalburg, MUSIC_PLAYER_BGM, 0 + song mus_oldale, MUSIC_PLAYER_BGM, 0 + song mus_gym, MUSIC_PLAYER_BGM, 0 + song mus_surf, MUSIC_PLAYER_BGM, 0 + song mus_petalburg_woods, MUSIC_PLAYER_BGM, 0 + song mus_level_up, MUSIC_PLAYER_SE2, 2 + song mus_heal, MUSIC_PLAYER_SE2, 2 + song mus_obtain_badge, MUSIC_PLAYER_SE2, 2 + song mus_obtain_item, MUSIC_PLAYER_SE2, 2 + song mus_evolved, MUSIC_PLAYER_SE2, 2 + song mus_obtain_tmhm, MUSIC_PLAYER_SE2, 2 + song mus_lilycove_museum, MUSIC_PLAYER_BGM, 0 + song mus_route122, MUSIC_PLAYER_BGM, 0 + song mus_oceanic_museum, MUSIC_PLAYER_BGM, 0 + song mus_evolution_intro, MUSIC_PLAYER_SE2, 2 + song mus_evolution, MUSIC_PLAYER_BGM, 0 + song mus_move_deleted, MUSIC_PLAYER_SE2, 2 + song mus_encounter_girl, MUSIC_PLAYER_BGM, 0 + song mus_encounter_male, MUSIC_PLAYER_BGM, 0 + song mus_abandoned_ship, MUSIC_PLAYER_BGM, 0 + song mus_fortree, MUSIC_PLAYER_BGM, 0 + song mus_birch_lab, MUSIC_PLAYER_BGM, 0 + song mus_b_tower_rs, MUSIC_PLAYER_BGM, 0 + song mus_encounter_swimmer, MUSIC_PLAYER_BGM, 0 + song mus_cave_of_origin, MUSIC_PLAYER_BGM, 0 + song mus_obtain_berry, MUSIC_PLAYER_SE2, 2 + song mus_awaken_legend, MUSIC_PLAYER_SE2, 2 + song mus_slots_jackpot, MUSIC_PLAYER_SE2, 2 + song mus_slots_win, MUSIC_PLAYER_SE2, 2 + song mus_too_bad, MUSIC_PLAYER_SE2, 2 + song mus_roulette, MUSIC_PLAYER_BGM, 0 + song mus_link_contest_p1, MUSIC_PLAYER_BGM, 0 + song mus_link_contest_p2, MUSIC_PLAYER_BGM, 0 + song mus_link_contest_p3, MUSIC_PLAYER_BGM, 0 + song mus_link_contest_p4, MUSIC_PLAYER_BGM, 0 + song mus_encounter_rich, MUSIC_PLAYER_BGM, 0 + song mus_verdanturf, MUSIC_PLAYER_BGM, 0 + song mus_rustboro, MUSIC_PLAYER_BGM, 0 + song mus_poke_center, MUSIC_PLAYER_BGM, 0 + song mus_route104, MUSIC_PLAYER_BGM, 0 + song mus_route119, MUSIC_PLAYER_BGM, 0 + song mus_cycling, MUSIC_PLAYER_BGM, 0 + song mus_poke_mart, MUSIC_PLAYER_BGM, 0 + song mus_littleroot, MUSIC_PLAYER_BGM, 0 + song mus_mt_chimney, MUSIC_PLAYER_BGM, 0 + song mus_encounter_female, MUSIC_PLAYER_BGM, 0 + song mus_lilycove, MUSIC_PLAYER_BGM, 0 + song mus_route111, MUSIC_PLAYER_BGM, 0 + song mus_help, MUSIC_PLAYER_BGM, 0 + song mus_underwater, MUSIC_PLAYER_BGM, 0 + song mus_victory_trainer, MUSIC_PLAYER_BGM, 0 + song mus_title, MUSIC_PLAYER_BGM, 0 + song mus_intro, MUSIC_PLAYER_BGM, 0 + song mus_encounter_may, MUSIC_PLAYER_BGM, 0 + song mus_encounter_intense, MUSIC_PLAYER_BGM, 0 + song mus_encounter_cool, MUSIC_PLAYER_BGM, 0 + song mus_route113, MUSIC_PLAYER_BGM, 0 + song mus_encounter_aqua, MUSIC_PLAYER_BGM, 0 + song mus_follow_me, MUSIC_PLAYER_BGM, 0 + song mus_encounter_brendan, MUSIC_PLAYER_BGM, 0 + song mus_ever_grande, MUSIC_PLAYER_BGM, 0 + song mus_encounter_suspicious, MUSIC_PLAYER_BGM, 0 + song mus_victory_aqua_magma, MUSIC_PLAYER_BGM, 0 + song mus_cable_car, MUSIC_PLAYER_BGM, 0 + song mus_game_corner, MUSIC_PLAYER_BGM, 0 + song mus_dewford, MUSIC_PLAYER_BGM, 0 + song mus_safari_zone, MUSIC_PLAYER_BGM, 0 + song mus_victory_road, MUSIC_PLAYER_BGM, 0 + song mus_aqua_magma_hideout, MUSIC_PLAYER_BGM, 0 + song mus_sailing, MUSIC_PLAYER_BGM, 0 + song mus_mt_pyre, MUSIC_PLAYER_BGM, 0 + song mus_slateport, MUSIC_PLAYER_BGM, 0 + song mus_mt_pyre_exterior, MUSIC_PLAYER_BGM, 0 + song mus_school, MUSIC_PLAYER_BGM, 0 + song mus_hall_of_fame, MUSIC_PLAYER_BGM, 0 + song mus_fallarbor, MUSIC_PLAYER_BGM, 0 + song mus_sealed_chamber, MUSIC_PLAYER_BGM, 0 + song mus_contest_winner, MUSIC_PLAYER_BGM, 0 + song mus_contest, MUSIC_PLAYER_BGM, 0 + song mus_encounter_magma, MUSIC_PLAYER_BGM, 0 + song mus_intro_battle, MUSIC_PLAYER_BGM, 0 + song mus_abnormal_weather, MUSIC_PLAYER_BGM, 0 + song mus_weather_groudon, MUSIC_PLAYER_BGM, 0 + song mus_sootopolis, MUSIC_PLAYER_BGM, 0 + song mus_contest_results, MUSIC_PLAYER_BGM, 0 + song mus_hall_of_fame_room, MUSIC_PLAYER_BGM, 0 + song mus_trick_house, MUSIC_PLAYER_BGM, 0 + song mus_encounter_twins, MUSIC_PLAYER_BGM, 0 + song mus_encounter_elite_four, MUSIC_PLAYER_BGM, 0 + song mus_encounter_hiker, MUSIC_PLAYER_BGM, 0 + song mus_contest_lobby, MUSIC_PLAYER_BGM, 0 + song mus_encounter_interviewer, MUSIC_PLAYER_BGM, 0 + song mus_encounter_champion, MUSIC_PLAYER_BGM, 0 + song mus_credits, MUSIC_PLAYER_BGM, 0 + song mus_end, MUSIC_PLAYER_BGM, 0 + song mus_b_frontier, MUSIC_PLAYER_BGM, 0 + song mus_b_arena, MUSIC_PLAYER_BGM, 0 + song mus_obtain_b_points, MUSIC_PLAYER_SE2, 2 + song mus_register_match_call, MUSIC_PLAYER_SE2, 2 + song mus_b_pyramid, MUSIC_PLAYER_BGM, 0 + song mus_b_pyramid_top, MUSIC_PLAYER_BGM, 0 + song mus_b_palace, MUSIC_PLAYER_BGM, 0 + song mus_rayquaza_appears, MUSIC_PLAYER_BGM, 0 + song mus_b_tower, MUSIC_PLAYER_BGM, 0 + song mus_obtain_symbol, MUSIC_PLAYER_SE2, 2 + song mus_b_dome, MUSIC_PLAYER_BGM, 0 + song mus_b_pike, MUSIC_PLAYER_BGM, 0 + song mus_b_factory, MUSIC_PLAYER_BGM, 0 + song mus_vs_rayquaza, MUSIC_PLAYER_BGM, 0 + song mus_vs_frontier_brain, MUSIC_PLAYER_BGM, 0 + song mus_vs_mew, MUSIC_PLAYER_BGM, 0 + song mus_b_dome_lobby, MUSIC_PLAYER_BGM, 0 + song mus_vs_wild, MUSIC_PLAYER_BGM, 0 + song mus_vs_aqua_magma, MUSIC_PLAYER_BGM, 0 + song mus_vs_trainer, MUSIC_PLAYER_BGM, 0 + song mus_vs_gym_leader, MUSIC_PLAYER_BGM, 0 + song mus_vs_champion, MUSIC_PLAYER_BGM, 0 + song mus_vs_regi, MUSIC_PLAYER_BGM, 0 + song mus_vs_kyogre_groudon, MUSIC_PLAYER_BGM, 0 + song mus_vs_rival, MUSIC_PLAYER_BGM, 0 + song mus_vs_elite_four, MUSIC_PLAYER_BGM, 0 + song mus_vs_aqua_magma_leader, MUSIC_PLAYER_BGM, 0 + song mus_rg_follow_me, MUSIC_PLAYER_BGM, 0 + song mus_rg_game_corner, MUSIC_PLAYER_BGM, 0 + song mus_rg_rocket_hideout, MUSIC_PLAYER_BGM, 0 + song mus_rg_gym, MUSIC_PLAYER_BGM, 0 + song mus_rg_jigglypuff, MUSIC_PLAYER_SE2, 2 + song mus_rg_intro_fight, MUSIC_PLAYER_BGM, 0 + song mus_rg_title, MUSIC_PLAYER_BGM, 0 + song mus_rg_cinnabar, MUSIC_PLAYER_BGM, 0 + song mus_rg_lavender, MUSIC_PLAYER_BGM, 0 + song mus_rg_heal, MUSIC_PLAYER_BGM, 0 + song mus_rg_cycling, MUSIC_PLAYER_BGM, 0 + song mus_rg_encounter_rocket, MUSIC_PLAYER_BGM, 0 + song mus_rg_encounter_girl, MUSIC_PLAYER_BGM, 0 + song mus_rg_encounter_boy, MUSIC_PLAYER_BGM, 0 + song mus_rg_hall_of_fame, MUSIC_PLAYER_BGM, 0 + song mus_rg_viridian_forest, MUSIC_PLAYER_BGM, 0 + song mus_rg_mt_moon, MUSIC_PLAYER_BGM, 0 + song mus_rg_poke_mansion, MUSIC_PLAYER_BGM, 0 + song mus_rg_credits, MUSIC_PLAYER_BGM, 0 + song mus_rg_route1, MUSIC_PLAYER_BGM, 0 + song mus_rg_route24, MUSIC_PLAYER_BGM, 0 + song mus_rg_route3, MUSIC_PLAYER_BGM, 0 + song mus_rg_route11, MUSIC_PLAYER_BGM, 0 + song mus_rg_victory_road, MUSIC_PLAYER_BGM, 0 + song mus_rg_vs_gym_leader, MUSIC_PLAYER_BGM, 0 + song mus_rg_vs_trainer, MUSIC_PLAYER_BGM, 0 + song mus_rg_vs_wild, MUSIC_PLAYER_BGM, 0 + song mus_rg_vs_champion, MUSIC_PLAYER_BGM, 0 + song mus_rg_pallet, MUSIC_PLAYER_BGM, 0 + song mus_rg_oak_lab, MUSIC_PLAYER_BGM, 0 + song mus_rg_oak, MUSIC_PLAYER_BGM, 0 + song mus_rg_poke_center, MUSIC_PLAYER_BGM, 0 + song mus_rg_ss_anne, MUSIC_PLAYER_BGM, 0 + song mus_rg_surf, MUSIC_PLAYER_BGM, 0 + song mus_rg_poke_tower, MUSIC_PLAYER_BGM, 0 + song mus_rg_silph, MUSIC_PLAYER_BGM, 0 + song mus_rg_fuchsia, MUSIC_PLAYER_BGM, 0 + song mus_rg_celadon, MUSIC_PLAYER_BGM, 0 + song mus_rg_victory_trainer, MUSIC_PLAYER_BGM, 0 + song mus_rg_victory_wild, MUSIC_PLAYER_BGM, 0 + song mus_rg_victory_gym_leader, MUSIC_PLAYER_BGM, 0 + song mus_rg_vermillion, MUSIC_PLAYER_BGM, 0 + song mus_rg_pewter, MUSIC_PLAYER_BGM, 0 + song mus_rg_encounter_rival, MUSIC_PLAYER_BGM, 0 + song mus_rg_rival_exit, MUSIC_PLAYER_BGM, 0 + song mus_rg_dex_rating, MUSIC_PLAYER_SE2, 2 + song mus_rg_obtain_key_item, MUSIC_PLAYER_SE2, 2 + song mus_rg_caught_intro, MUSIC_PLAYER_SE2, 2 + song mus_rg_photo, MUSIC_PLAYER_SE2, 2 + song mus_rg_game_freak, MUSIC_PLAYER_BGM, 0 + song mus_rg_caught, MUSIC_PLAYER_BGM, 0 + song mus_rg_new_game_instruct, MUSIC_PLAYER_BGM, 0 + song mus_rg_new_game_intro, MUSIC_PLAYER_BGM, 0 + song mus_rg_new_game_exit, MUSIC_PLAYER_BGM, 0 + song mus_rg_poke_jump, MUSIC_PLAYER_BGM, 0 + song mus_rg_union_room, MUSIC_PLAYER_BGM, 0 + song mus_rg_net_center, MUSIC_PLAYER_BGM, 0 + song mus_rg_mystery_gift, MUSIC_PLAYER_BGM, 0 + song mus_rg_berry_pick, MUSIC_PLAYER_BGM, 0 + song mus_rg_sevii_cave, MUSIC_PLAYER_BGM, 0 + song mus_rg_teachy_tv_show, MUSIC_PLAYER_BGM, 0 + song mus_rg_sevii_route, MUSIC_PLAYER_BGM, 0 + song mus_rg_sevii_dungeon, MUSIC_PLAYER_BGM, 0 + song mus_rg_sevii_123, MUSIC_PLAYER_BGM, 0 + song mus_rg_sevii_45, MUSIC_PLAYER_BGM, 0 + song mus_rg_sevii_67, MUSIC_PLAYER_BGM, 0 + song mus_rg_poke_flute, MUSIC_PLAYER_SE2, 2 + song mus_rg_vs_deoxys, MUSIC_PLAYER_BGM, 0 + song mus_rg_vs_mewtwo, MUSIC_PLAYER_BGM, 0 + song mus_rg_vs_legend, MUSIC_PLAYER_BGM, 0 + song mus_rg_encounter_gym_leader, MUSIC_PLAYER_BGM, 0 + song mus_rg_encounter_deoxys, MUSIC_PLAYER_BGM, 0 + song mus_rg_trainer_tower, MUSIC_PLAYER_BGM, 0 + song mus_rg_slow_pallet, MUSIC_PLAYER_BGM, 0 + song mus_rg_teachy_tv_menu, MUSIC_PLAYER_BGM, 0 + song ph_trap_blend, MUSIC_PLAYER_SE2, 2 + song ph_trap_held, MUSIC_PLAYER_SE2, 2 + song ph_trap_solo, MUSIC_PLAYER_SE2, 2 + song ph_face_blend, MUSIC_PLAYER_SE2, 2 + song ph_face_held, MUSIC_PLAYER_SE2, 2 + song ph_face_solo, MUSIC_PLAYER_SE2, 2 + song ph_cloth_blend, MUSIC_PLAYER_SE2, 2 + song ph_cloth_held, MUSIC_PLAYER_SE2, 2 + song ph_cloth_solo, MUSIC_PLAYER_SE2, 2 + song ph_dress_blend, MUSIC_PLAYER_SE2, 2 + song ph_dress_held, MUSIC_PLAYER_SE2, 2 + song ph_dress_solo, MUSIC_PLAYER_SE2, 2 + song ph_fleece_blend, MUSIC_PLAYER_SE2, 2 + song ph_fleece_held, MUSIC_PLAYER_SE2, 2 + song ph_fleece_solo, MUSIC_PLAYER_SE2, 2 + song ph_kit_blend, MUSIC_PLAYER_SE2, 2 + song ph_kit_held, MUSIC_PLAYER_SE2, 2 + song ph_kit_solo, MUSIC_PLAYER_SE2, 2 + song ph_price_blend, MUSIC_PLAYER_SE2, 2 + song ph_price_held, MUSIC_PLAYER_SE2, 2 + song ph_price_solo, MUSIC_PLAYER_SE2, 2 + song ph_lot_blend, MUSIC_PLAYER_SE2, 2 + song ph_lot_held, MUSIC_PLAYER_SE2, 2 + song ph_lot_solo, MUSIC_PLAYER_SE2, 2 + song ph_goat_blend, MUSIC_PLAYER_SE2, 2 + song ph_goat_held, MUSIC_PLAYER_SE2, 2 + song ph_goat_solo, MUSIC_PLAYER_SE2, 2 + song ph_thought_blend, MUSIC_PLAYER_SE2, 2 + song ph_thought_held, MUSIC_PLAYER_SE2, 2 + song ph_thought_solo, MUSIC_PLAYER_SE2, 2 + song ph_choice_blend, MUSIC_PLAYER_SE2, 2 + song ph_choice_held, MUSIC_PLAYER_SE2, 2 + song ph_choice_solo, MUSIC_PLAYER_SE2, 2 + song ph_mouth_blend, MUSIC_PLAYER_SE2, 2 + song ph_mouth_held, MUSIC_PLAYER_SE2, 2 + song ph_mouth_solo, MUSIC_PLAYER_SE2, 2 + song ph_foot_blend, MUSIC_PLAYER_SE2, 2 + song ph_foot_held, MUSIC_PLAYER_SE2, 2 + song ph_foot_solo, MUSIC_PLAYER_SE2, 2 + song ph_goose_blend, MUSIC_PLAYER_SE2, 2 + song ph_goose_held, MUSIC_PLAYER_SE2, 2 + song ph_goose_solo, MUSIC_PLAYER_SE2, 2 + song ph_strut_blend, MUSIC_PLAYER_SE2, 2 + song ph_strut_held, MUSIC_PLAYER_SE2, 2 + song ph_strut_solo, MUSIC_PLAYER_SE2, 2 + song ph_cure_blend, MUSIC_PLAYER_SE2, 2 + song ph_cure_held, MUSIC_PLAYER_SE2, 2 + song ph_cure_solo, MUSIC_PLAYER_SE2, 2 + song ph_nurse_blend, MUSIC_PLAYER_SE2, 2 + song ph_nurse_held, MUSIC_PLAYER_SE2, 2 + song ph_nurse_solo, MUSIC_PLAYER_SE2, 2 .align 2 dummy_song_header: diff --git a/sound/songs/midi/midi.cfg b/sound/songs/midi/midi.cfg index 5802904b4130..68df84d7a5ce 100644 --- a/sound/songs/midi/midi.cfg +++ b/sound/songs/midi/midi.cfg @@ -1,420 +1,420 @@ -mus_abandoned_ship.mid: -E -R50 -G030 -V080 -mus_abnormal_weather.mid: -E -R50 -G089 -V080 -mus_aqua_magma_hideout.mid: -E -R50 -G076 -V084 -mus_awaken_legend.mid: -E -R50 -G012 -V090 -P5 -mus_b_arena.mid: -E -R50 -G104 -V090 -mus_b_dome_lobby.mid: -E -R50 -G111 -V056 -mus_b_dome.mid: -E -R50 -G111 -V090 -mus_b_factory.mid: -E -R50 -G113 -V100 -mus_b_frontier.mid: -E -R50 -G103 -V094 -mus_b_palace.mid: -E -R50 -G108 -V105 -mus_b_pike.mid: -E -R50 -G112 -V092 -mus_b_pyramid_top.mid: -E -R50 -G107 -V077 -mus_b_pyramid.mid: -E -R50 -G106 -V079 -mus_b_tower_rs.mid: -E -R50 -G035 -V080 -mus_b_tower.mid: -E -R50 -G110 -V100 -mus_birch_lab.mid: -E -R50 -G033 -V080 +mus_abandoned_ship.mid: -E -R50 -G_abandoned_ship -V080 +mus_abnormal_weather.mid: -E -R50 -G_abnormal_weather -V080 +mus_aqua_magma_hideout.mid: -E -R50 -G_aqua_magma_hideout -V084 +mus_awaken_legend.mid: -E -R50 -G_fanfare -V090 -P5 +mus_b_arena.mid: -E -R50 -G_b_arena -V090 +mus_b_dome_lobby.mid: -E -R50 -G_b_dome -V056 +mus_b_dome.mid: -E -R50 -G_b_dome -V090 +mus_b_factory.mid: -E -R50 -G_b_factory -V100 +mus_b_frontier.mid: -E -R50 -G_b_frontier -V094 +mus_b_palace.mid: -E -R50 -G_b_palace -V105 +mus_b_pike.mid: -E -R50 -G_b_pike -V092 +mus_b_pyramid_top.mid: -E -R50 -G_b_pyramid_top -V077 +mus_b_pyramid.mid: -E -R50 -G_b_pyramid -V079 +mus_b_tower_rs.mid: -E -R50 -G_b_tower_rs -V080 +mus_b_tower.mid: -E -R50 -G_b_tower -V100 +mus_birch_lab.mid: -E -R50 -G_birch_lab -V080 mus_c_comm_center.mid: -E -R50 -V080 mus_c_vs_legend_beast.mid: -E -R50 -V080 -mus_cable_car.mid: -E -R50 -G071 -V078 -mus_caught.mid: -E -R50 -G025 -V080 -mus_cave_of_origin.mid: -E -R50 -G037 -V080 -mus_contest_lobby.mid: -E -R50 -G098 -V060 -mus_contest_results.mid: -E -R50 -G092 -V080 -mus_contest_winner.mid: -E -R50 -G085 -V100 -mus_contest.mid: -E -R50 -G086 -V088 -mus_credits.mid: -E -R50 -G101 -V100 -mus_cycling.mid: -E -R50 -G049 -V083 -mus_dewford.mid: -E -R50 -G073 -V078 +mus_cable_car.mid: -E -R50 -G_cable_car -V078 +mus_caught.mid: -E -R50 -G_victory_wild -V080 +mus_cave_of_origin.mid: -E -R50 -G_cave_of_origin -V080 +mus_contest_lobby.mid: -E -R50 -G_contest_lobby -V060 +mus_contest_results.mid: -E -R50 -G_contest_results -V080 +mus_contest_winner.mid: -E -R50 -G_contest_winner -V100 +mus_contest.mid: -E -R50 -G_contest -V088 +mus_credits.mid: -E -R50 -G_credits -V100 +mus_cycling.mid: -E -R50 -G_cycling -V083 +mus_dewford.mid: -E -R50 -G_dewford -V078 mus_dummy.mid: -E -R40 -mus_encounter_aqua.mid: -E -R50 -G065 -V086 -mus_encounter_brendan.mid: -E -R50 -G067 -V078 -mus_encounter_champion.mid: -E -R50 -G100 -V076 -mus_encounter_cool.mid: -E -R50 -G063 -V086 -mus_encounter_elite_four.mid: -E -R50 -G096 -V078 -mus_encounter_female.mid: -E -R50 -G053 -V072 -mus_encounter_girl.mid: -E -R50 -G027 -V080 -mus_encounter_hiker.mid: -E -R50 -G097 -V076 -mus_encounter_intense.mid: -E -R50 -G062 -V078 -mus_encounter_interviewer.mid: -E -R50 -G099 -V062 -mus_encounter_magma.mid: -E -R50 -G087 -V072 -mus_encounter_male.mid: -E -R50 -G028 -V080 -mus_encounter_may.mid: -E -R50 -G061 -V078 -mus_encounter_rich.mid: -E -R50 -G043 -V094 -mus_encounter_suspicious.mid: -E -R50 -G069 -V078 -mus_encounter_swimmer.mid: -E -R50 -G036 -V080 -mus_encounter_twins.mid: -E -R50 -G095 -V075 -mus_end.mid: -E -R50 -G102 -V036 -mus_ever_grande.mid: -E -R50 -G068 -V086 -mus_evolution_intro.mid: -E -R50 -G026 -V080 -mus_evolution.mid: -E -R50 -G026 -V080 -mus_evolved.mid: -E -R50 -G012 -V090 -P5 -mus_fallarbor.mid: -E -R50 -G083 -V100 -mus_follow_me.mid: -E -R50 -G066 -V074 -mus_fortree.mid: -E -R50 -G032 -V080 -mus_game_corner.mid: -E -R50 -G072 -V072 +mus_encounter_aqua.mid: -E -R50 -G_encounter_aqua -V086 +mus_encounter_brendan.mid: -E -R50 -G_encounter_brendan -V078 +mus_encounter_champion.mid: -E -R50 -G_encounter_champion -V076 +mus_encounter_cool.mid: -E -R50 -G_encounter_cool -V086 +mus_encounter_elite_four.mid: -E -R50 -G_encounter_elite_four -V078 +mus_encounter_female.mid: -E -R50 -G_encounter_female -V072 +mus_encounter_girl.mid: -E -R50 -G_encounter_girl -V080 +mus_encounter_hiker.mid: -E -R50 -G_encounter_hiker -V076 +mus_encounter_intense.mid: -E -R50 -G_encounter_intense -V078 +mus_encounter_interviewer.mid: -E -R50 -G_encounter_interviewer -V062 +mus_encounter_magma.mid: -E -R50 -G_encounter_magma -V072 +mus_encounter_male.mid: -E -R50 -G_encounter_male -V080 +mus_encounter_may.mid: -E -R50 -G_encounter_may -V078 +mus_encounter_rich.mid: -E -R50 -G_encounter_rich -V094 +mus_encounter_suspicious.mid: -E -R50 -G_encounter_suspicious -V078 +mus_encounter_swimmer.mid: -E -R50 -G_encounter_swimmer -V080 +mus_encounter_twins.mid: -E -R50 -G_encounter_twins -V075 +mus_end.mid: -E -R50 -G_end -V036 +mus_ever_grande.mid: -E -R50 -G_ever_grande -V086 +mus_evolution_intro.mid: -E -R50 -G_evolution -V080 +mus_evolution.mid: -E -R50 -G_evolution -V080 +mus_evolved.mid: -E -R50 -G_fanfare -V090 -P5 +mus_fallarbor.mid: -E -R50 -G_fallarbor -V100 +mus_follow_me.mid: -E -R50 -G_follow_me -V074 +mus_fortree.mid: -E -R50 -G_fortree -V080 +mus_game_corner.mid: -E -R50 -G_game_corner -V072 mus_gsc_pewter.mid: -E -R50 -V080 mus_gsc_route38.mid: -E -R50 -V080 -mus_gym.mid: -E -R50 -G013 -V080 -mus_hall_of_fame_room.mid: -E -R50 -G093 -V080 -mus_hall_of_fame.mid: -E -R50 -G082 -V078 -mus_heal.mid: -E -R50 -G012 -V090 -P5 -mus_help.mid: -E -R50 -G056 -V078 -mus_intro_battle.mid: -E -R50 -G088 -V088 -mus_intro.mid: -E -R50 -G060 -V090 -mus_level_up.mid: -E -R50 -G012 -V090 -P5 -mus_lilycove_museum.mid: -E -R50 -G020 -V080 -mus_lilycove.mid: -E -R50 -G054 -V085 -mus_link_contest_p1.mid: -E -R50 -G039 -V079 -mus_link_contest_p2.mid: -E -R50 -G040 -V090 -mus_link_contest_p3.mid: -E -R50 -G041 -V075 -mus_link_contest_p4.mid: -E -R50 -G042 -V090 -mus_littleroot_test.mid: -E -R50 -G034 -V099 -mus_littleroot.mid: -E -R50 -G051 -V100 -mus_move_deleted.mid: -E -R50 -G012 -V090 -P5 -mus_mt_chimney.mid: -E -R50 -G052 -V078 -mus_mt_pyre_exterior.mid: -E -R50 -G080 -V080 -mus_mt_pyre.mid: -E -R50 -G078 -V088 -mus_obtain_b_points.mid: -E -R50 -G103 -V090 -P5 -mus_obtain_badge.mid: -E -R50 -G012 -V090 -P5 -mus_obtain_berry.mid: -E -R50 -G012 -V090 -P5 -mus_obtain_item.mid: -E -R50 -G012 -V090 -P5 -mus_obtain_symbol.mid: -E -R50 -G103 -V100 -P5 -mus_obtain_tmhm.mid: -E -R50 -G012 -V090 -P5 -mus_oceanic_museum.mid: -E -R50 -G023 -V080 -mus_oldale.mid: -E -R50 -G019 -V080 -mus_petalburg_woods.mid: -E -R50 -G018 -V080 -mus_petalburg.mid: -E -R50 -G015 -V080 -mus_poke_center.mid: -E -R50 -G046 -V092 -mus_poke_mart.mid: -E -R50 -G050 -V085 -mus_rayquaza_appears.mid: -E -R50 -G109 -V090 -mus_register_match_call.mid: -E -R50 -G105 -V090 -P5 -mus_rg_berry_pick.mid: -E -R50 -G132 -V090 -mus_rg_caught_intro.mid: -E -R50 -G179 -V094 -P5 -mus_rg_caught.mid: -E -R50 -G170 -V100 -mus_rg_celadon.mid: -E -R50 -G168 -V070 -mus_rg_cinnabar.mid: -E -R50 -G138 -V090 -mus_rg_credits.mid: -E -R50 -G149 -V090 -mus_rg_cycling.mid: -E -R50 -G141 -V090 -mus_rg_dex_rating.mid: -E -R50 -G175 -V070 -P5 -mus_rg_encounter_boy.mid: -E -R50 -G144 -V090 -mus_rg_encounter_deoxys.mid: -E -R50 -G184 -V079 -mus_rg_encounter_girl.mid: -E -R50 -G143 -V051 -mus_rg_encounter_gym_leader: -E -R50 -G144 -V090 -mus_rg_encounter_rival.mid: -E -R50 -G174 -V079 -mus_rg_encounter_rocket.mid: -E -R50 -G142 -V096 -mus_rg_follow_me.mid: -E -R50 -G131 -V068 -mus_rg_fuchsia.mid: -E -R50 -G167 -V090 -mus_rg_game_corner.mid: -E -R50 -G132 -V090 -mus_rg_game_freak.mid: -E -R50 -G181 -V075 -mus_rg_gym.mid: -E -R50 -G134 -V090 -mus_rg_hall_of_fame.mid: -E -R50 -G145 -V079 -mus_rg_heal.mid: -E -R50 -G140 -V090 -mus_rg_intro_fight.mid: -E -R50 -G136 -V090 -mus_rg_jigglypuff.mid: -E -R50 -G135 -V068 -P5 -mus_rg_lavender.mid: -E -R50 -G139 -V090 -mus_rg_mt_moon.mid: -E -R50 -G147 -V090 -mus_rg_mystery_gift.mid: -E -R50 -G183 -V100 -mus_rg_net_center.mid: -E -R50 -G162 -V096 -mus_rg_new_game_exit.mid: -E -R50 -G182 -V088 -mus_rg_new_game_instruct.mid: -E -R50 -G182 -V085 -mus_rg_new_game_intro.mid: -E -R50 -G182 -V088 -mus_rg_oak_lab.mid: -E -R50 -G160 -V075 -mus_rg_oak.mid: -E -R50 -G161 -V086 -mus_rg_obtain_key_item.mid: -E -R50 -G178 -V077 -P5 -mus_rg_pallet.mid: -E -R50 -G159 -V100 -mus_rg_pewter.mid: -E -R50 -G173 -V084 -mus_rg_photo.mid: -E -R50 -G180 -V100 -P5 -mus_rg_poke_center.mid: -E -R50 -G162 -V096 -mus_rg_poke_flute.mid: -E -R50 -G165 -V048 -P5 -mus_rg_poke_jump.mid: -E -R50 -G132 -V090 -mus_rg_poke_mansion.mid: -E -R50 -G148 -V090 -mus_rg_poke_tower.mid: -E -R50 -G165 -V090 -mus_rg_rival_exit.mid: -E -R50 -G174 -V079 -mus_rg_rocket_hideout.mid: -E -R50 -G133 -V090 -mus_rg_route1.mid: -E -R50 -G150 -V079 -mus_rg_route3.mid: -E -R50 -G152 -V083 -mus_rg_route11.mid: -E -R50 -G153 -V090 -mus_rg_route24.mid: -E -R50 -G151 -V086 -mus_rg_sevii_45.mid: -E -R50 -G188 -V084 -mus_rg_sevii_67.mid: -E -R50 -G189 -V084 -mus_rg_sevii_123.mid: -E -R50 -G173 -V084 -mus_rg_sevii_cave.mid: -E -R50 -G147 -V090 -mus_rg_sevii_dungeon.mid: -E -R50 -G146 -V090 -mus_rg_sevii_route.mid: -E -R50 -G187 -V080 -mus_rg_silph.mid: -E -R50 -G166 -V076 -mus_rg_slow_pallet.mid: -E -R50 -G159 -V092 -mus_rg_ss_anne.mid: -E -R50 -G163 -V090 -mus_rg_surf.mid: -E -R50 -G164 -V071 -mus_rg_teachy_tv_menu.mid: -E -R50 -G186 -V059 -mus_rg_teachy_tv_show.mid: -E -R50 -G131 -V068 -mus_rg_title.mid: -E -R50 -G137 -V090 -mus_rg_trainer_tower.mid: -E -R50 -G134 -V090 -mus_rg_union_room.mid: -E -R50 -G132 -V090 -mus_rg_vermillion.mid: -E -R50 -G172 -V090 -mus_rg_victory_gym_leader.mid: -E -R50 -G171 -V090 -mus_rg_victory_road.mid: -E -R50 -G154 -V090 -mus_rg_victory_trainer.mid: -E -R50 -G169 -V089 -mus_rg_victory_wild.mid: -E -R50 -G170 -V090 -mus_rg_viridian_forest.mid: -E -R50 -G146 -V090 -mus_rg_vs_champion.mid: -E -R50 -G158 -V090 -mus_rg_vs_deoxys.mid: -E -R50 -G185 -V080 -mus_rg_vs_gym_leader.mid: -E -R50 -G155 -V090 -mus_rg_vs_legend.mid: -E -R50 -G157 -V090 -mus_rg_vs_mewtwo.mid: -E -R50 -G157 -V090 -mus_rg_vs_trainer.mid: -E -R50 -G156 -V090 -mus_rg_vs_wild.mid: -E -R50 -G157 -V090 -mus_roulette.mid: -E -R50 -G038 -V080 -mus_route101.mid: -E -R50 -G011 -V080 -mus_route104.mid: -E -R50 -G047 -V097 -mus_route110.mid: -E -R50 -G010 -V080 -mus_route111.mid: -E -R50 -G055 -V076 -mus_route113.mid: -E -R50 -G064 -V084 -mus_route119.mid: -E -R50 -G048 -V096 -mus_route120.mid: -E -R50 -G014 -V080 -mus_route122.mid: -E -R50 -G021 -V080 -mus_rustboro.mid: -E -R50 -G045 -V085 -mus_safari_zone.mid: -E -R50 -G074 -V082 -mus_sailing.mid: -E -R50 -G077 -V086 -mus_school.mid: -E -R50 -G081 -V100 -mus_sealed_chamber.mid: -E -R50 -G084 -V100 -mus_slateport.mid: -E -R50 -G079 -V070 -mus_slots_jackpot.mid: -E -R50 -G012 -V090 -P5 -mus_slots_win.mid: -E -R50 -G012 -V090 -P5 -mus_sootopolis.mid: -E -R50 -G091 -V062 -mus_surf.mid: -E -R50 -G017 -V080 -mus_title.mid: -E -R50 -G059 -V090 -mus_too_bad.mid: -E -R50 -G012 -V090 -P5 -mus_trick_house.mid: -E -R50 -G094 -V070 -mus_underwater.mid: -E -R50 -G057 -V094 -mus_verdanturf.mid: -E -R50 -G044 -V090 -mus_victory_aqua_magma.mid: -E -R50 -G070 -V088 -mus_victory_gym_leader.mid: -E -R50 -G024 -V080 -mus_victory_league.mid: -E -R50 -G029 -V080 -mus_victory_road.mid: -E -R50 -G075 -V076 -mus_victory_trainer.mid: -E -R50 -G058 -V091 -mus_victory_wild.mid: -E -R50 -G025 -V080 -mus_vs_aqua_magma_leader.mid: -E -R50 -G126 -V080 -P1 -mus_vs_aqua_magma.mid: -E -R50 -G118 -V080 -P1 -mus_vs_champion.mid: -E -R50 -G121 -V080 -P1 -mus_vs_elite_four.mid: -E -R50 -G125 -V080 -P1 -mus_vs_frontier_brain.mid: -E -R50 -G115 -V090 -P1 -mus_vs_gym_leader.mid: -E -R50 -G120 -V080 -P1 -mus_vs_kyogre_groudon.mid: -E -R50 -G123 -V080 -P1 -mus_vs_mew.mid: -E -R50 -G116 -V090 -mus_vs_rayquaza.mid: -E -R50 -G114 -V080 -P1 -mus_vs_regi.mid: -E -R50 -G122 -V080 -P1 -mus_vs_rival.mid: -E -R50 -G124 -V080 -P1 -mus_vs_trainer.mid: -E -R50 -G119 -V080 -P1 -mus_vs_wild.mid: -E -R50 -G117 -V080 -P1 -mus_weather_groudon.mid: -E -R50 -G090 -V050 -ph_choice_blend.mid: -E -G130 -P4 -ph_choice_held.mid: -E -G130 -P4 -ph_choice_solo.mid: -E -G130 -P4 -ph_cloth_blend.mid: -E -G130 -P4 -ph_cloth_held.mid: -E -G130 -P4 -ph_cloth_solo.mid: -E -G130 -P4 -ph_cure_blend.mid: -E -G130 -P4 -ph_cure_held.mid: -E -G130 -P4 -ph_cure_solo.mid: -E -G130 -P4 -ph_dress_blend.mid: -E -G130 -P4 -ph_dress_held.mid: -E -G130 -P4 -ph_dress_solo.mid: -E -G130 -P4 -ph_face_blend.mid: -E -G130 -P4 -ph_face_held.mid: -E -G130 -P4 -ph_face_solo.mid: -E -G130 -P4 -ph_fleece_blend.mid: -E -G130 -P4 -ph_fleece_held.mid: -E -G130 -P4 -ph_fleece_solo.mid: -E -G130 -P4 -ph_foot_blend.mid: -E -G130 -P4 -ph_foot_held.mid: -E -G130 -P4 -ph_foot_solo.mid: -E -G130 -P4 -ph_goat_blend.mid: -E -G130 -P4 -ph_goat_held.mid: -E -G130 -P4 -ph_goat_solo.mid: -E -G130 -P4 -ph_goose_blend.mid: -E -G130 -P4 -ph_goose_held.mid: -E -G130 -P4 -ph_goose_solo.mid: -E -G130 -P4 -ph_kit_blend.mid: -E -G130 -P4 -ph_kit_held.mid: -E -G130 -P4 -ph_kit_solo.mid: -E -G130 -P4 -ph_lot_blend.mid: -E -G130 -P4 -ph_lot_held.mid: -E -G130 -P4 -ph_lot_solo.mid: -E -G130 -P4 -ph_mouth_blend.mid: -E -G130 -P4 -ph_mouth_held.mid: -E -G130 -P4 -ph_mouth_solo.mid: -E -G130 -P4 -ph_nurse_blend.mid: -E -G130 -P4 -ph_nurse_held.mid: -E -G130 -P4 -ph_nurse_solo.mid: -E -G130 -P4 -ph_price_blend.mid: -E -G130 -P4 -ph_price_held.mid: -E -G130 -P4 -ph_price_solo.mid: -E -G130 -P4 -ph_strut_blend.mid: -E -G130 -P4 -ph_strut_held.mid: -E -G130 -P4 -ph_strut_solo.mid: -E -G130 -P4 -ph_thought_blend.mid: -E -G130 -P4 -ph_thought_held.mid: -E -G130 -P4 -ph_thought_solo.mid: -E -G130 -P4 -ph_trap_blend.mid: -E -G130 -P4 -ph_trap_held.mid: -E -G130 -P4 -ph_trap_solo.mid: -E -G130 -P4 -se_a.mid: -E -R50 -G128 -V095 -P4 -se_applause.mid: -E -R50 -G128 -V100 -P5 -se_arena_timeup1.mid: -E -R50 -G129 -P5 -se_arena_timeup2.mid: -E -R50 -G129 -P5 -se_ball_bounce_1.mid: -E -R50 -G128 -V100 -P4 -se_ball_bounce_2.mid: -E -R50 -G128 -V100 -P4 -se_ball_bounce_3.mid: -E -R50 -G128 -V100 -P4 -se_ball_bounce_4.mid: -E -R50 -G128 -V100 -P4 -se_ball_open.mid: -E -R50 -G127 -V100 -P5 -se_ball_throw.mid: -E -R50 -G128 -V120 -P5 -se_ball_trade.mid: -E -R50 -G127 -V100 -P5 -se_ball_tray_ball.mid: -E -R50 -G128 -V110 -P5 -se_ball_tray_enter.mid: -E -R50 -G128 -V110 -P5 -se_ball_tray_exit.mid: -E -R50 -G127 -V100 -P5 -se_ball.mid: -E -R50 -G127 -V070 -P4 -se_balloon_blue.mid: -E -R50 -G128 -V105 -P4 -se_balloon_red.mid: -E -R50 -G128 -V105 -P4 -se_balloon_yellow.mid: -E -R50 -G128 -V105 -P4 -se_bang.mid: -E -R50 -G128 -V110 -P4 -se_berry_blender.mid: -E -R50 -G128 -V090 -P4 -se_bike_bell.mid: -E -R50 -G128 -V090 -P4 -se_bike_hop.mid: -E -R50 -G127 -V090 -P4 -se_boo.mid: -E -R50 -G127 -V110 -P4 -se_breakable_door.mid: -E -R50 -G128 -V110 -P4 -se_bridge_walk.mid: -E -R50 -G128 -V095 -P4 -se_card.mid: -E -R50 -G127 -V100 -P4 -se_click.mid: -E -R50 -G127 -V110 -P4 -se_contest_condition_lose.mid: -E -R50 -G127 -V110 -P4 -se_contest_curtain_fall.mid: -E -R50 -G128 -V070 -P5 -se_contest_curtain_rise.mid: -E -R50 -G128 -V070 -P5 -se_contest_heart.mid: -E -R50 -G128 -V090 -P5 -se_contest_icon_change.mid: -E -R50 -G128 -V110 -P5 -se_contest_icon_clear.mid: -E -R50 -G128 -V090 -P5 -se_contest_mons_turn.mid: -E -R50 -G128 -V090 -P5 -se_contest_place.mid: -E -R50 -G127 -V110 -P4 -se_dex_search.mid: -E -R50 -G127 -v100 -P5 -se_ding_dong.mid: -E -R50 -G127 -V090 -P5 -se_door.mid: -E -R50 -G127 -V080 -P5 -se_downpour_stop.mid: -E -R50 -G128 -V100 -P2 -se_downpour.mid: -E -R50 -G128 -V100 -P2 -se_e.mid: -E -R50 -G128 -V120 -P4 -se_effective.mid: -E -R50 -G127 -V110 -P5 -se_egg_hatch.mid: -E -R50 -G128 -V120 -P5 -se_elevator.mid: -E -R50 -G128 -V100 -P4 -se_escalator.mid: -E -R50 -G128 -V100 -P4 -se_exit.mid: -E -R50 -G127 -V120 -P5 -se_exp_max.mid: -E -R50 -G128 -V094 -P5 -se_exp.mid: -E -R50 -G127 -V080 -P5 -se_failure.mid: -E -R50 -G127 -V120 -P4 -se_faint.mid: -E -R50 -G127 -V110 -P5 -se_fall.mid: -E -R50 -G128 -V110 -P4 -se_field_poison.mid: -E -R50 -G127 -V110 -P5 -se_flee.mid: -E -R50 -G127 -V090 -P5 -se_fu_zaku.mid: -E -R50 -G127 -V120 -P4 -se_glass_flute.mid: -E -R50 -G128 -V105 -P5 -se_i.mid: -E -R50 -G128 -V120 -P4 -se_ice_break.mid: -E -R50 -G128 -V100 -P4 -se_ice_crack.mid: -E -R50 -G127 -V100 -P4 -se_ice_stairs.mid: -E -R50 -G128 -V090 -P4 -se_intro_blast.mid: -E -R50 -G127 -V100 -P5 -se_itemfinder.mid: -E -R50 -G127 -V090 -P5 -se_lavaridge_fall_warp.mid: -E -R50 -G127 -P4 -se_ledge.mid: -E -R50 -G127 -V100 -P4 -se_low_health.mid: -E -R50 -G127 -V100 -P3 -se_m_bind.mid: -E -R50 -G128 -V100 -P4 -se_m_comet_punch.mid: -E -R50 -G128 -V120 -P4 -se_m_cut.mid: -E -R50 -G128 -V120 -P4 -se_m_double_slap.mid: -E -R50 -G128 -V110 -P4 -se_m_fire_punch.mid: -E -R50 -G128 -V110 -P4 -se_m_fly.mid: -E -R50 -G128 -V110 -P4 -se_m_gust.mid: -E -R50 -G128 -V110 -P4 -se_m_gust2.mid: -E -R50 -G128 -V110 -P4 -se_m_headbutt.mid: -E -R50 -G128 -V110 -P4 -se_m_horn_attack.mid: -E -R50 -G128 -V110 -P4 -se_m_jump_kick.mid: -E -R50 -G128 -V110 -P4 -se_m_leer.mid: -E -R50 -G128 -V110 -P4 -se_m_mega_kick.mid: -E -R50 -G128 -V090 -P4 -se_m_mega_kick2.mid: -E -R50 -G128 -V110 -P4 -se_m_pay_day.mid: -E -R50 -G128 -V095 -P4 -se_m_razor_wind.mid: -E -R50 -G128 -V110 -P4 -se_m_razor_wind2.mid: -E -R50 -G128 -V090 -P4 -se_m_sand_attack.mid: -E -R50 -G128 -V110 -P4 -se_m_scratch.mid: -E -R50 -G128 -V110 -P4 -se_m_swords_dance.mid: -E -R50 -G128 -V100 -P4 -se_m_tail_whip.mid: -E -R50 -G128 -V110 -P4 -se_m_take_down.mid: -E -R50 -G128 -V105 -P4 -se_m_vicegrip.mid: -E -R50 -G128 -V110 -P4 -se_m_wing_attack.mid: -E -R50 -G128 -V105 -P4 -se_mud_ball.mid: -E -R50 -G128 -V110 -P4 -se_mugshot.mid: -E -R50 -G128 -V090 -P5 -se_n.mid: -E -R50 -G128 -P4 -se_not_effective.mid: -E -R50 -G127 -V110 -P5 -se_note_a.mid: -E -R50 -G128 -V110 -P4 -se_note_b.mid: -E -R50 -G128 -V110 -P4 -se_note_c_high.mid: -E -R50 -G128 -V110 -P4 -se_note_c.mid: -E -R50 -G128 -V110 -P4 -se_note_d.mid: -E -R50 -G128 -V110 -P4 -se_note_e.mid: -E -R50 -G128 -V110 -P4 -se_note_f.mid: -E -R50 -G128 -V110 -P4 -se_note_g.mid: -E -R50 -G128 -V110 -P4 -se_o.mid: -E -R50 -G128 -V120 -P4 -se_orb.mid: -E -R50 -G128 -V100 -P5 -se_pc_login.mid: -E -R50 -G127 -V100 -P5 -se_pc_off.mid: -E -R50 -G127 -V100 -P5 -se_pc_on.mid: -E -R50 -G127 -V100 -P5 -se_pike_curtain_close.mid: -E -R50 -G129 -P5 -se_pike_curtain_open.mid: -E -R50 -G129 -P5 -se_pin.mid: -E -R50 -G127 -V060 -P4 -se_pokenav_call.mid: -E -R50 -G129 -V120 -P5 -se_pokenav_hang_up.mid: -E -R50 -G129 -V110 -P5 -se_pokenav_off.mid: -E -R50 -G127 -V100 -P5 -se_pokenav_on.mid: -E -R50 -G127 -V100 -P5 -se_puddle.mid: -E -R50 -G128 -V020 -P4 -se_rain_stop.mid: -E -R50 -G128 -V080 -P2 -se_rain.mid: -E -R50 -G128 -V080 -P2 -se_repel.mid: -E -R50 -G127 -V090 -P4 -se_rg_bag_cursor.mid: -E -R50 -G129 -P5 -se_rg_bag_pocket.mid: -E -R50 -G129 -P5 -se_rg_ball_click.mid: -E -R50 -G129 -V100 -P5 -se_rg_card_flip.mid: -E -R50 -G129 -P5 -se_rg_card_flipping.mid: -E -R50 -G129 -P5 -se_rg_card_open.mid: -E -R50 -G129 -V112 -P5 -se_rg_deoxys_move.mid: -E -R50 -G129 -V080 -P5 -se_rg_door.mid: -E -R50 -G129 -V100 -P5 -se_rg_help_close.mid: -E -R50 -G129 -V095 -P5 -se_rg_help_error.mid: -E -R50 -G129 -V125 -P5 -se_rg_help_open.mid: -E -R50 -G129 -V096 -P5 -se_rg_poke_jump_failure.mid: -E -R50 -G127 -P5 -se_rg_poke_jump_success.mid: -E -R50 -G128 -V110 -P5 -se_rg_shop.mid: -E -R50 -G129 -V080 -P5 -se_rg_ss_anne_horn.mid: -E -R50 -G129 -V096 -P5 -se_rotating_gate.mid: -E -R50 -G128 -V090 -P4 -se_roulette_ball.mid: -E -R50 -G128 -V110 -P2 -se_roulette_ball2.mid: -E -R50 -G128 -V110 -P2 -se_save.mid: -E -R50 -G128 -V080 -P5 -se_select.mid: -E -R50 -G127 -V080 -P5 -se_shiny.mid: -E -R50 -G128 -V095 -P5 -se_ship.mid: -E -R50 -G127 -V075 -P4 -se_shop.mid: -E -R50 -G127 -V090 -P5 -se_sliding_door.mid: -E -R50 -G128 -V095 -P4 -se_success.mid: -E -R50 -G127 -V080 -P4 -se_sudowoodo_shake.mid: -E -R50 -G129 -V077 -P5 -se_super_effective.mid: -E -R50 -G127 -V110 -P5 -se_switch.mid: -E -R50 -G127 -V100 -P4 -se_taillow_wing_flap.mid: -E -R50 -G128 -V105 -P5 -se_thunder.mid: -E -R50 -G128 -V110 -P3 -se_thunder2.mid: -E -R50 -G128 -V110 -P3 -se_thunderstorm_stop.mid: -E -R50 -G128 -V080 -P2 -se_thunderstorm.mid: -E -R50 -G128 -V080 -P2 -se_truck_door.mid: -E -R50 -G128 -V110 -P4 -se_truck_move.mid: -E -R50 -G128 -P4 -se_truck_stop.mid: -E -R50 -G128 -P4 -se_truck_unload.mid: -E -R50 -G127 -P4 -se_u.mid: -E -R50 -G128 -P4 -se_unlock.mid: -E -R50 -G128 -V100 -P4 -se_use_item.mid: -E -R50 -G127 -V100 -P5 -se_vend.mid: -E -R50 -G128 -V110 -P4 -se_warp_in.mid: -E -R50 -G127 -V090 -P4 -se_warp_out.mid: -E -R50 -G127 -V090 -P4 +mus_gym.mid: -E -R50 -G_gym -V080 +mus_hall_of_fame_room.mid: -E -R50 -G_hall_of_fame_room -V080 +mus_hall_of_fame.mid: -E -R50 -G_hall_of_fame -V078 +mus_heal.mid: -E -R50 -G_fanfare -V090 -P5 +mus_help.mid: -E -R50 -G_help -V078 +mus_intro_battle.mid: -E -R50 -G_intro_battle -V088 +mus_intro.mid: -E -R50 -G_intro -V090 +mus_level_up.mid: -E -R50 -G_fanfare -V090 -P5 +mus_lilycove_museum.mid: -E -R50 -G_lilycove_museum -V080 +mus_lilycove.mid: -E -R50 -G_lilycove -V085 +mus_link_contest_p1.mid: -E -R50 -G_link_contest_p1 -V079 +mus_link_contest_p2.mid: -E -R50 -G_link_contest_p2 -V090 +mus_link_contest_p3.mid: -E -R50 -G_link_contest_p3 -V075 +mus_link_contest_p4.mid: -E -R50 -G_link_contest_p4 -V090 +mus_littleroot_test.mid: -E -R50 -G_littleroot_test -V099 +mus_littleroot.mid: -E -R50 -G_littleroot -V100 +mus_move_deleted.mid: -E -R50 -G_fanfare -V090 -P5 +mus_mt_chimney.mid: -E -R50 -G_mt_chimney -V078 +mus_mt_pyre_exterior.mid: -E -R50 -G_mt_pyre_exterior -V080 +mus_mt_pyre.mid: -E -R50 -G_mt_pyre -V088 +mus_obtain_b_points.mid: -E -R50 -G_b_frontier -V090 -P5 +mus_obtain_badge.mid: -E -R50 -G_fanfare -V090 -P5 +mus_obtain_berry.mid: -E -R50 -G_fanfare -V090 -P5 +mus_obtain_item.mid: -E -R50 -G_fanfare -V090 -P5 +mus_obtain_symbol.mid: -E -R50 -G_b_frontier -V100 -P5 +mus_obtain_tmhm.mid: -E -R50 -G_fanfare -V090 -P5 +mus_oceanic_museum.mid: -E -R50 -G_oceanic_museum -V080 +mus_oldale.mid: -E -R50 -G_oldale -V080 +mus_petalburg_woods.mid: -E -R50 -G_petalburg_woods -V080 +mus_petalburg.mid: -E -R50 -G_petalburg -V080 +mus_poke_center.mid: -E -R50 -G_poke_center -V092 +mus_poke_mart.mid: -E -R50 -G_poke_mart -V085 +mus_rayquaza_appears.mid: -E -R50 -G_rayquaza_appears -V090 +mus_register_match_call.mid: -E -R50 -G_register_match_call -V090 -P5 +mus_rg_berry_pick.mid: -E -R50 -G_rg_game_corner -V090 +mus_rg_caught_intro.mid: -E -R50 -G_rg_caught_intro -V094 -P5 +mus_rg_caught.mid: -E -R50 -G_rg_victory_wild -V100 +mus_rg_celadon.mid: -E -R50 -G_rg_celadon -V070 +mus_rg_cinnabar.mid: -E -R50 -G_rg_cinnabar -V090 +mus_rg_credits.mid: -E -R50 -G_rg_credits -V090 +mus_rg_cycling.mid: -E -R50 -G_rg_cycling -V090 +mus_rg_dex_rating.mid: -E -R50 -G_rg_dex_rating -V070 -P5 +mus_rg_encounter_boy.mid: -E -R50 -G_rg_encounter_boy -V090 +mus_rg_encounter_deoxys.mid: -E -R50 -G_rg_encounter_deoxys -V079 +mus_rg_encounter_girl.mid: -E -R50 -G_rg_encounter_girl -V051 +mus_rg_encounter_gym_leader: -E -R50 -G_rg_encounter_boy -V090 +mus_rg_encounter_rival.mid: -E -R50 -G_rg_encounter_rival -V079 +mus_rg_encounter_rocket.mid: -E -R50 -G_rg_encounter_rocket -V096 +mus_rg_follow_me.mid: -E -R50 -G_rg_follow_me -V068 +mus_rg_fuchsia.mid: -E -R50 -G_rg_fuchsia -V090 +mus_rg_game_corner.mid: -E -R50 -G_rg_game_corner -V090 +mus_rg_game_freak.mid: -E -R50 -G_rg_game_freak -V075 +mus_rg_gym.mid: -E -R50 -G_rg_gym -V090 +mus_rg_hall_of_fame.mid: -E -R50 -G_rg_hall_of_fame -V079 +mus_rg_heal.mid: -E -R50 -G_rg_heal -V090 +mus_rg_intro_fight.mid: -E -R50 -G_rg_intro_fight -V090 +mus_rg_jigglypuff.mid: -E -R50 -G_rg_jigglypuff -V068 -P5 +mus_rg_lavender.mid: -E -R50 -G_rg_lavender -V090 +mus_rg_mt_moon.mid: -E -R50 -G_rg_mt_moon -V090 +mus_rg_mystery_gift.mid: -E -R50 -G_rg_mystery_gift -V100 +mus_rg_net_center.mid: -E -R50 -G_rg_poke_center -V096 +mus_rg_new_game_exit.mid: -E -R50 -G_rg_new_game -V088 +mus_rg_new_game_instruct.mid: -E -R50 -G_rg_new_game -V085 +mus_rg_new_game_intro.mid: -E -R50 -G_rg_new_game -V088 +mus_rg_oak_lab.mid: -E -R50 -G_rg_oak_lab -V075 +mus_rg_oak.mid: -E -R50 -G_rg_oak -V086 +mus_rg_obtain_key_item.mid: -E -R50 -G_rg_obtain_key_item -V077 -P5 +mus_rg_pallet.mid: -E -R50 -G_rg_pallet -V100 +mus_rg_pewter.mid: -E -R50 -G_rg_pewter -V084 +mus_rg_photo.mid: -E -R50 -G_rg_photo -V100 -P5 +mus_rg_poke_center.mid: -E -R50 -G_rg_poke_center -V096 +mus_rg_poke_flute.mid: -E -R50 -G_rg_poke_tower -V048 -P5 +mus_rg_poke_jump.mid: -E -R50 -G_rg_game_corner -V090 +mus_rg_poke_mansion.mid: -E -R50 -G_rg_poke_mansion -V090 +mus_rg_poke_tower.mid: -E -R50 -G_rg_poke_tower -V090 +mus_rg_rival_exit.mid: -E -R50 -G_rg_encounter_rival -V079 +mus_rg_rocket_hideout.mid: -E -R50 -G_rg_rocket_hideout -V090 +mus_rg_route1.mid: -E -R50 -G_rg_route1 -V079 +mus_rg_route3.mid: -E -R50 -G_rg_route3 -V083 +mus_rg_route11.mid: -E -R50 -G_rg_route11 -V090 +mus_rg_route24.mid: -E -R50 -G_rg_route24 -V086 +mus_rg_sevii_45.mid: -E -R50 -G_rg_sevii_45 -V084 +mus_rg_sevii_67.mid: -E -R50 -G_rg_sevii_67 -V084 +mus_rg_sevii_123.mid: -E -R50 -G_rg_pewter -V084 +mus_rg_sevii_cave.mid: -E -R50 -G_rg_mt_moon -V090 +mus_rg_sevii_dungeon.mid: -E -R50 -G_rg_viridian_forest -V090 +mus_rg_sevii_route.mid: -E -R50 -G_rg_sevii_route -V080 +mus_rg_silph.mid: -E -R50 -G_rg_silph -V076 +mus_rg_slow_pallet.mid: -E -R50 -G_rg_pallet -V092 +mus_rg_ss_anne.mid: -E -R50 -G_rg_ss_anne -V090 +mus_rg_surf.mid: -E -R50 -G_rg_surf -V071 +mus_rg_teachy_tv_menu.mid: -E -R50 -G_rg_teachy_tv_menu -V059 +mus_rg_teachy_tv_show.mid: -E -R50 -G_rg_follow_me -V068 +mus_rg_title.mid: -E -R50 -G_rg_title -V090 +mus_rg_trainer_tower.mid: -E -R50 -G_rg_gym -V090 +mus_rg_union_room.mid: -E -R50 -G_rg_game_corner -V090 +mus_rg_vermillion.mid: -E -R50 -G_rg_vermillion -V090 +mus_rg_victory_gym_leader.mid: -E -R50 -G_rg_victory_gym_leader -V090 +mus_rg_victory_road.mid: -E -R50 -G_rg_victory_road -V090 +mus_rg_victory_trainer.mid: -E -R50 -G_rg_victory_trainer -V089 +mus_rg_victory_wild.mid: -E -R50 -G_rg_victory_wild -V090 +mus_rg_viridian_forest.mid: -E -R50 -G_rg_viridian_forest -V090 +mus_rg_vs_champion.mid: -E -R50 -G_rg_vs_champion -V090 +mus_rg_vs_deoxys.mid: -E -R50 -G_rg_vs_deoxys -V080 +mus_rg_vs_gym_leader.mid: -E -R50 -G_rg_vs_gym_leader -V090 +mus_rg_vs_legend.mid: -E -R50 -G_rg_vs_wild -V090 +mus_rg_vs_mewtwo.mid: -E -R50 -G_rg_vs_wild -V090 +mus_rg_vs_trainer.mid: -E -R50 -G_rg_vs_trainer -V090 +mus_rg_vs_wild.mid: -E -R50 -G_rg_vs_wild -V090 +mus_roulette.mid: -E -R50 -G_roulette -V080 +mus_route101.mid: -E -R50 -G_route101 -V080 +mus_route104.mid: -E -R50 -G_route104 -V097 +mus_route110.mid: -E -R50 -G_route110 -V080 +mus_route111.mid: -E -R50 -G_route111 -V076 +mus_route113.mid: -E -R50 -G_route113 -V084 +mus_route119.mid: -E -R50 -G_route119 -V096 +mus_route120.mid: -E -R50 -G_route120 -V080 +mus_route122.mid: -E -R50 -G_route122 -V080 +mus_rustboro.mid: -E -R50 -G_rustboro -V085 +mus_safari_zone.mid: -E -R50 -G_safari_zone -V082 +mus_sailing.mid: -E -R50 -G_sailing -V086 +mus_school.mid: -E -R50 -G_school -V100 +mus_sealed_chamber.mid: -E -R50 -G_sealed_chamber -V100 +mus_slateport.mid: -E -R50 -G_slateport -V070 +mus_slots_jackpot.mid: -E -R50 -G_fanfare -V090 -P5 +mus_slots_win.mid: -E -R50 -G_fanfare -V090 -P5 +mus_sootopolis.mid: -E -R50 -G_sootopolis -V062 +mus_surf.mid: -E -R50 -G_surf -V080 +mus_title.mid: -E -R50 -G_title -V090 +mus_too_bad.mid: -E -R50 -G_fanfare -V090 -P5 +mus_trick_house.mid: -E -R50 -G_trick_house -V070 +mus_underwater.mid: -E -R50 -G_underwater -V094 +mus_verdanturf.mid: -E -R50 -G_verdanturf -V090 +mus_victory_aqua_magma.mid: -E -R50 -G_victory_aqua_magma -V088 +mus_victory_gym_leader.mid: -E -R50 -G_victory_gym_leader -V080 +mus_victory_league.mid: -E -R50 -G_victory_league -V080 +mus_victory_road.mid: -E -R50 -G_victory_road -V076 +mus_victory_trainer.mid: -E -R50 -G_victory_trainer -V091 +mus_victory_wild.mid: -E -R50 -G_victory_wild -V080 +mus_vs_aqua_magma_leader.mid: -E -R50 -G_vs_aqua_magma_leader -V080 -P1 +mus_vs_aqua_magma.mid: -E -R50 -G_vs_aqua_magma -V080 -P1 +mus_vs_champion.mid: -E -R50 -G_vs_champion -V080 -P1 +mus_vs_elite_four.mid: -E -R50 -G_vs_elite_four -V080 -P1 +mus_vs_frontier_brain.mid: -E -R50 -G_vs_frontier_brain -V090 -P1 +mus_vs_gym_leader.mid: -E -R50 -G_vs_gym_leader -V080 -P1 +mus_vs_kyogre_groudon.mid: -E -R50 -G_vs_kyogre_groudon -V080 -P1 +mus_vs_mew.mid: -E -R50 -G_vs_mew -V090 +mus_vs_rayquaza.mid: -E -R50 -G_vs_rayquaza -V080 -P1 +mus_vs_regi.mid: -E -R50 -G_vs_regi -V080 -P1 +mus_vs_rival.mid: -E -R50 -G_vs_rival -V080 -P1 +mus_vs_trainer.mid: -E -R50 -G_vs_trainer -V080 -P1 +mus_vs_wild.mid: -E -R50 -G_vs_wild -V080 -P1 +mus_weather_groudon.mid: -E -R50 -G_weather_groudon -V050 +ph_choice_blend.mid: -E -G_bard -P4 +ph_choice_held.mid: -E -G_bard -P4 +ph_choice_solo.mid: -E -G_bard -P4 +ph_cloth_blend.mid: -E -G_bard -P4 +ph_cloth_held.mid: -E -G_bard -P4 +ph_cloth_solo.mid: -E -G_bard -P4 +ph_cure_blend.mid: -E -G_bard -P4 +ph_cure_held.mid: -E -G_bard -P4 +ph_cure_solo.mid: -E -G_bard -P4 +ph_dress_blend.mid: -E -G_bard -P4 +ph_dress_held.mid: -E -G_bard -P4 +ph_dress_solo.mid: -E -G_bard -P4 +ph_face_blend.mid: -E -G_bard -P4 +ph_face_held.mid: -E -G_bard -P4 +ph_face_solo.mid: -E -G_bard -P4 +ph_fleece_blend.mid: -E -G_bard -P4 +ph_fleece_held.mid: -E -G_bard -P4 +ph_fleece_solo.mid: -E -G_bard -P4 +ph_foot_blend.mid: -E -G_bard -P4 +ph_foot_held.mid: -E -G_bard -P4 +ph_foot_solo.mid: -E -G_bard -P4 +ph_goat_blend.mid: -E -G_bard -P4 +ph_goat_held.mid: -E -G_bard -P4 +ph_goat_solo.mid: -E -G_bard -P4 +ph_goose_blend.mid: -E -G_bard -P4 +ph_goose_held.mid: -E -G_bard -P4 +ph_goose_solo.mid: -E -G_bard -P4 +ph_kit_blend.mid: -E -G_bard -P4 +ph_kit_held.mid: -E -G_bard -P4 +ph_kit_solo.mid: -E -G_bard -P4 +ph_lot_blend.mid: -E -G_bard -P4 +ph_lot_held.mid: -E -G_bard -P4 +ph_lot_solo.mid: -E -G_bard -P4 +ph_mouth_blend.mid: -E -G_bard -P4 +ph_mouth_held.mid: -E -G_bard -P4 +ph_mouth_solo.mid: -E -G_bard -P4 +ph_nurse_blend.mid: -E -G_bard -P4 +ph_nurse_held.mid: -E -G_bard -P4 +ph_nurse_solo.mid: -E -G_bard -P4 +ph_price_blend.mid: -E -G_bard -P4 +ph_price_held.mid: -E -G_bard -P4 +ph_price_solo.mid: -E -G_bard -P4 +ph_strut_blend.mid: -E -G_bard -P4 +ph_strut_held.mid: -E -G_bard -P4 +ph_strut_solo.mid: -E -G_bard -P4 +ph_thought_blend.mid: -E -G_bard -P4 +ph_thought_held.mid: -E -G_bard -P4 +ph_thought_solo.mid: -E -G_bard -P4 +ph_trap_blend.mid: -E -G_bard -P4 +ph_trap_held.mid: -E -G_bard -P4 +ph_trap_solo.mid: -E -G_bard -P4 +se_a.mid: -E -R50 -G_rs_sfx_2 -V095 -P4 +se_applause.mid: -E -R50 -G_rs_sfx_2 -V100 -P5 +se_arena_timeup1.mid: -E -R50 -G_frlg_sfx -P5 +se_arena_timeup2.mid: -E -R50 -G_frlg_sfx -P5 +se_ball_bounce_1.mid: -E -R50 -G_rs_sfx_2 -V100 -P4 +se_ball_bounce_2.mid: -E -R50 -G_rs_sfx_2 -V100 -P4 +se_ball_bounce_3.mid: -E -R50 -G_rs_sfx_2 -V100 -P4 +se_ball_bounce_4.mid: -E -R50 -G_rs_sfx_2 -V100 -P4 +se_ball_open.mid: -E -R50 -G_rs_sfx_1 -V100 -P5 +se_ball_throw.mid: -E -R50 -G_rs_sfx_2 -V120 -P5 +se_ball_trade.mid: -E -R50 -G_rs_sfx_1 -V100 -P5 +se_ball_tray_ball.mid: -E -R50 -G_rs_sfx_2 -V110 -P5 +se_ball_tray_enter.mid: -E -R50 -G_rs_sfx_2 -V110 -P5 +se_ball_tray_exit.mid: -E -R50 -G_rs_sfx_1 -V100 -P5 +se_ball.mid: -E -R50 -G_rs_sfx_1 -V070 -P4 +se_balloon_blue.mid: -E -R50 -G_rs_sfx_2 -V105 -P4 +se_balloon_red.mid: -E -R50 -G_rs_sfx_2 -V105 -P4 +se_balloon_yellow.mid: -E -R50 -G_rs_sfx_2 -V105 -P4 +se_bang.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_berry_blender.mid: -E -R50 -G_rs_sfx_2 -V090 -P4 +se_bike_bell.mid: -E -R50 -G_rs_sfx_2 -V090 -P4 +se_bike_hop.mid: -E -R50 -G_rs_sfx_1 -V090 -P4 +se_boo.mid: -E -R50 -G_rs_sfx_1 -V110 -P4 +se_breakable_door.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_bridge_walk.mid: -E -R50 -G_rs_sfx_2 -V095 -P4 +se_card.mid: -E -R50 -G_rs_sfx_1 -V100 -P4 +se_click.mid: -E -R50 -G_rs_sfx_1 -V110 -P4 +se_contest_condition_lose.mid: -E -R50 -G_rs_sfx_1 -V110 -P4 +se_contest_curtain_fall.mid: -E -R50 -G_rs_sfx_2 -V070 -P5 +se_contest_curtain_rise.mid: -E -R50 -G_rs_sfx_2 -V070 -P5 +se_contest_heart.mid: -E -R50 -G_rs_sfx_2 -V090 -P5 +se_contest_icon_change.mid: -E -R50 -G_rs_sfx_2 -V110 -P5 +se_contest_icon_clear.mid: -E -R50 -G_rs_sfx_2 -V090 -P5 +se_contest_mons_turn.mid: -E -R50 -G_rs_sfx_2 -V090 -P5 +se_contest_place.mid: -E -R50 -G_rs_sfx_1 -V110 -P4 +se_dex_search.mid: -E -R50 -G_rs_sfx_1 -v100 -P5 +se_ding_dong.mid: -E -R50 -G_rs_sfx_1 -V090 -P5 +se_door.mid: -E -R50 -G_rs_sfx_1 -V080 -P5 +se_downpour_stop.mid: -E -R50 -G_rs_sfx_2 -V100 -P2 +se_downpour.mid: -E -R50 -G_rs_sfx_2 -V100 -P2 +se_e.mid: -E -R50 -G_rs_sfx_2 -V120 -P4 +se_effective.mid: -E -R50 -G_rs_sfx_1 -V110 -P5 +se_egg_hatch.mid: -E -R50 -G_rs_sfx_2 -V120 -P5 +se_elevator.mid: -E -R50 -G_rs_sfx_2 -V100 -P4 +se_escalator.mid: -E -R50 -G_rs_sfx_2 -V100 -P4 +se_exit.mid: -E -R50 -G_rs_sfx_1 -V120 -P5 +se_exp_max.mid: -E -R50 -G_rs_sfx_2 -V094 -P5 +se_exp.mid: -E -R50 -G_rs_sfx_1 -V080 -P5 +se_failure.mid: -E -R50 -G_rs_sfx_1 -V120 -P4 +se_faint.mid: -E -R50 -G_rs_sfx_1 -V110 -P5 +se_fall.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_field_poison.mid: -E -R50 -G_rs_sfx_1 -V110 -P5 +se_flee.mid: -E -R50 -G_rs_sfx_1 -V090 -P5 +se_fu_zaku.mid: -E -R50 -G_rs_sfx_1 -V120 -P4 +se_glass_flute.mid: -E -R50 -G_rs_sfx_2 -V105 -P5 +se_i.mid: -E -R50 -G_rs_sfx_2 -V120 -P4 +se_ice_break.mid: -E -R50 -G_rs_sfx_2 -V100 -P4 +se_ice_crack.mid: -E -R50 -G_rs_sfx_1 -V100 -P4 +se_ice_stairs.mid: -E -R50 -G_rs_sfx_2 -V090 -P4 +se_intro_blast.mid: -E -R50 -G_rs_sfx_1 -V100 -P5 +se_itemfinder.mid: -E -R50 -G_rs_sfx_1 -V090 -P5 +se_lavaridge_fall_warp.mid: -E -R50 -G_rs_sfx_1 -P4 +se_ledge.mid: -E -R50 -G_rs_sfx_1 -V100 -P4 +se_low_health.mid: -E -R50 -G_rs_sfx_1 -V100 -P3 +se_m_bind.mid: -E -R50 -G_rs_sfx_2 -V100 -P4 +se_m_comet_punch.mid: -E -R50 -G_rs_sfx_2 -V120 -P4 +se_m_cut.mid: -E -R50 -G_rs_sfx_2 -V120 -P4 +se_m_double_slap.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_m_fire_punch.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_m_fly.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_m_gust.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_m_gust2.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_m_headbutt.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_m_horn_attack.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_m_jump_kick.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_m_leer.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_m_mega_kick.mid: -E -R50 -G_rs_sfx_2 -V090 -P4 +se_m_mega_kick2.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_m_pay_day.mid: -E -R50 -G_rs_sfx_2 -V095 -P4 +se_m_razor_wind.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_m_razor_wind2.mid: -E -R50 -G_rs_sfx_2 -V090 -P4 +se_m_sand_attack.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_m_scratch.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_m_swords_dance.mid: -E -R50 -G_rs_sfx_2 -V100 -P4 +se_m_tail_whip.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_m_take_down.mid: -E -R50 -G_rs_sfx_2 -V105 -P4 +se_m_vicegrip.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_m_wing_attack.mid: -E -R50 -G_rs_sfx_2 -V105 -P4 +se_mud_ball.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_mugshot.mid: -E -R50 -G_rs_sfx_2 -V090 -P5 +se_n.mid: -E -R50 -G_rs_sfx_2 -P4 +se_not_effective.mid: -E -R50 -G_rs_sfx_1 -V110 -P5 +se_note_a.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_note_b.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_note_c_high.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_note_c.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_note_d.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_note_e.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_note_f.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_note_g.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_o.mid: -E -R50 -G_rs_sfx_2 -V120 -P4 +se_orb.mid: -E -R50 -G_rs_sfx_2 -V100 -P5 +se_pc_login.mid: -E -R50 -G_rs_sfx_1 -V100 -P5 +se_pc_off.mid: -E -R50 -G_rs_sfx_1 -V100 -P5 +se_pc_on.mid: -E -R50 -G_rs_sfx_1 -V100 -P5 +se_pike_curtain_close.mid: -E -R50 -G_frlg_sfx -P5 +se_pike_curtain_open.mid: -E -R50 -G_frlg_sfx -P5 +se_pin.mid: -E -R50 -G_rs_sfx_1 -V060 -P4 +se_pokenav_call.mid: -E -R50 -G_frlg_sfx -V120 -P5 +se_pokenav_hang_up.mid: -E -R50 -G_frlg_sfx -V110 -P5 +se_pokenav_off.mid: -E -R50 -G_rs_sfx_1 -V100 -P5 +se_pokenav_on.mid: -E -R50 -G_rs_sfx_1 -V100 -P5 +se_puddle.mid: -E -R50 -G_rs_sfx_2 -V020 -P4 +se_rain_stop.mid: -E -R50 -G_rs_sfx_2 -V080 -P2 +se_rain.mid: -E -R50 -G_rs_sfx_2 -V080 -P2 +se_repel.mid: -E -R50 -G_rs_sfx_1 -V090 -P4 +se_rg_bag_cursor.mid: -E -R50 -G_frlg_sfx -P5 +se_rg_bag_pocket.mid: -E -R50 -G_frlg_sfx -P5 +se_rg_ball_click.mid: -E -R50 -G_frlg_sfx -V100 -P5 +se_rg_card_flip.mid: -E -R50 -G_frlg_sfx -P5 +se_rg_card_flipping.mid: -E -R50 -G_frlg_sfx -P5 +se_rg_card_open.mid: -E -R50 -G_frlg_sfx -V112 -P5 +se_rg_deoxys_move.mid: -E -R50 -G_frlg_sfx -V080 -P5 +se_rg_door.mid: -E -R50 -G_frlg_sfx -V100 -P5 +se_rg_help_close.mid: -E -R50 -G_frlg_sfx -V095 -P5 +se_rg_help_error.mid: -E -R50 -G_frlg_sfx -V125 -P5 +se_rg_help_open.mid: -E -R50 -G_frlg_sfx -V096 -P5 +se_rg_poke_jump_failure.mid: -E -R50 -G_rs_sfx_1 -P5 +se_rg_poke_jump_success.mid: -E -R50 -G_rs_sfx_2 -V110 -P5 +se_rg_shop.mid: -E -R50 -G_frlg_sfx -V080 -P5 +se_rg_ss_anne_horn.mid: -E -R50 -G_frlg_sfx -V096 -P5 +se_rotating_gate.mid: -E -R50 -G_rs_sfx_2 -V090 -P4 +se_roulette_ball.mid: -E -R50 -G_rs_sfx_2 -V110 -P2 +se_roulette_ball2.mid: -E -R50 -G_rs_sfx_2 -V110 -P2 +se_save.mid: -E -R50 -G_rs_sfx_2 -V080 -P5 +se_select.mid: -E -R50 -G_rs_sfx_1 -V080 -P5 +se_shiny.mid: -E -R50 -G_rs_sfx_2 -V095 -P5 +se_ship.mid: -E -R50 -G_rs_sfx_1 -V075 -P4 +se_shop.mid: -E -R50 -G_rs_sfx_1 -V090 -P5 +se_sliding_door.mid: -E -R50 -G_rs_sfx_2 -V095 -P4 +se_success.mid: -E -R50 -G_rs_sfx_1 -V080 -P4 +se_sudowoodo_shake.mid: -E -R50 -G_frlg_sfx -V077 -P5 +se_super_effective.mid: -E -R50 -G_rs_sfx_1 -V110 -P5 +se_switch.mid: -E -R50 -G_rs_sfx_1 -V100 -P4 +se_taillow_wing_flap.mid: -E -R50 -G_rs_sfx_2 -V105 -P5 +se_thunder.mid: -E -R50 -G_rs_sfx_2 -V110 -P3 +se_thunder2.mid: -E -R50 -G_rs_sfx_2 -V110 -P3 +se_thunderstorm_stop.mid: -E -R50 -G_rs_sfx_2 -V080 -P2 +se_thunderstorm.mid: -E -R50 -G_rs_sfx_2 -V080 -P2 +se_truck_door.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_truck_move.mid: -E -R50 -G_rs_sfx_2 -P4 +se_truck_stop.mid: -E -R50 -G_rs_sfx_2 -P4 +se_truck_unload.mid: -E -R50 -G_rs_sfx_1 -P4 +se_u.mid: -E -R50 -G_rs_sfx_2 -P4 +se_unlock.mid: -E -R50 -G_rs_sfx_2 -V100 -P4 +se_use_item.mid: -E -R50 -G_rs_sfx_1 -V100 -P5 +se_vend.mid: -E -R50 -G_rs_sfx_2 -V110 -P4 +se_warp_in.mid: -E -R50 -G_rs_sfx_1 -V090 -P4 +se_warp_out.mid: -E -R50 -G_rs_sfx_1 -V090 -P4 diff --git a/sound/songs/se_dex_page.s b/sound/songs/se_dex_page.s index 884f0d12a560..314d11d9fb4f 100644 --- a/sound/songs/se_dex_page.s +++ b/sound/songs/se_dex_page.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_dex_page_grp, voicegroup127 + .equ se_dex_page_grp, voicegroup_rs_sfx_1 .equ se_dex_page_pri, 5 .equ se_dex_page_rev, reverb_set+50 .equ se_dex_page_mvl, 127 diff --git a/sound/songs/se_dex_scroll.s b/sound/songs/se_dex_scroll.s index 6c7ad77461e1..6ea8f4783d34 100644 --- a/sound/songs/se_dex_scroll.s +++ b/sound/songs/se_dex_scroll.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_dex_scroll_grp, voicegroup127 + .equ se_dex_scroll_grp, voicegroup_rs_sfx_1 .equ se_dex_scroll_pri, 5 .equ se_dex_scroll_rev, reverb_set+50 .equ se_dex_scroll_mvl, 127 diff --git a/sound/songs/se_m_absorb.s b/sound/songs/se_m_absorb.s index 6cd622366478..46b7e1fa20f0 100644 --- a/sound/songs/se_m_absorb.s +++ b/sound/songs/se_m_absorb.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_absorb_grp, voicegroup128 + .equ se_m_absorb_grp, voicegroup_rs_sfx_2 .equ se_m_absorb_pri, 4 .equ se_m_absorb_rev, reverb_set+50 .equ se_m_absorb_mvl, 127 diff --git a/sound/songs/se_m_absorb_2.s b/sound/songs/se_m_absorb_2.s index 61920133382c..54166d967351 100644 --- a/sound/songs/se_m_absorb_2.s +++ b/sound/songs/se_m_absorb_2.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_absorb_2_grp, voicegroup128 + .equ se_m_absorb_2_grp, voicegroup_rs_sfx_2 .equ se_m_absorb_2_pri, 4 .equ se_m_absorb_2_rev, reverb_set+50 .equ se_m_absorb_2_mvl, 127 diff --git a/sound/songs/se_m_acid_armor.s b/sound/songs/se_m_acid_armor.s index 346c76604760..31f94275a7fb 100644 --- a/sound/songs/se_m_acid_armor.s +++ b/sound/songs/se_m_acid_armor.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_acid_armor_grp, voicegroup128 + .equ se_m_acid_armor_grp, voicegroup_rs_sfx_2 .equ se_m_acid_armor_pri, 4 .equ se_m_acid_armor_rev, reverb_set+50 .equ se_m_acid_armor_mvl, 127 diff --git a/sound/songs/se_m_attract.s b/sound/songs/se_m_attract.s index 8e18c16dce3f..ede9f4dd824b 100644 --- a/sound/songs/se_m_attract.s +++ b/sound/songs/se_m_attract.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_attract_grp, voicegroup128 + .equ se_m_attract_grp, voicegroup_rs_sfx_2 .equ se_m_attract_pri, 4 .equ se_m_attract_rev, reverb_set+50 .equ se_m_attract_mvl, 127 diff --git a/sound/songs/se_m_attract2.s b/sound/songs/se_m_attract2.s index 9b846f13e473..ddcd23029792 100644 --- a/sound/songs/se_m_attract2.s +++ b/sound/songs/se_m_attract2.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_attract2_grp, voicegroup128 + .equ se_m_attract2_grp, voicegroup_rs_sfx_2 .equ se_m_attract2_pri, 4 .equ se_m_attract2_rev, reverb_set+50 .equ se_m_attract2_mvl, 127 diff --git a/sound/songs/se_m_barrier.s b/sound/songs/se_m_barrier.s index 54d57700f0fe..ebf6ddccb96e 100644 --- a/sound/songs/se_m_barrier.s +++ b/sound/songs/se_m_barrier.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_barrier_grp, voicegroup128 + .equ se_m_barrier_grp, voicegroup_rs_sfx_2 .equ se_m_barrier_pri, 4 .equ se_m_barrier_rev, reverb_set+50 .equ se_m_barrier_mvl, 127 diff --git a/sound/songs/se_m_baton_pass.s b/sound/songs/se_m_baton_pass.s index 30027e5b6839..ec8ddd542acf 100644 --- a/sound/songs/se_m_baton_pass.s +++ b/sound/songs/se_m_baton_pass.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_baton_pass_grp, voicegroup128 + .equ se_m_baton_pass_grp, voicegroup_rs_sfx_2 .equ se_m_baton_pass_pri, 4 .equ se_m_baton_pass_rev, reverb_set+50 .equ se_m_baton_pass_mvl, 127 diff --git a/sound/songs/se_m_belly_drum.s b/sound/songs/se_m_belly_drum.s index 919c02b16c75..5b5508ed41c1 100644 --- a/sound/songs/se_m_belly_drum.s +++ b/sound/songs/se_m_belly_drum.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_belly_drum_grp, voicegroup128 + .equ se_m_belly_drum_grp, voicegroup_rs_sfx_2 .equ se_m_belly_drum_pri, 4 .equ se_m_belly_drum_rev, reverb_set+50 .equ se_m_belly_drum_mvl, 127 diff --git a/sound/songs/se_m_bite.s b/sound/songs/se_m_bite.s index 15d690e2e817..c01e160c1afe 100644 --- a/sound/songs/se_m_bite.s +++ b/sound/songs/se_m_bite.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_bite_grp, voicegroup128 + .equ se_m_bite_grp, voicegroup_rs_sfx_2 .equ se_m_bite_pri, 4 .equ se_m_bite_rev, reverb_set+50 .equ se_m_bite_mvl, 127 diff --git a/sound/songs/se_m_blizzard.s b/sound/songs/se_m_blizzard.s index 6bce3c987212..a274da2211aa 100644 --- a/sound/songs/se_m_blizzard.s +++ b/sound/songs/se_m_blizzard.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_blizzard_grp, voicegroup128 + .equ se_m_blizzard_grp, voicegroup_rs_sfx_2 .equ se_m_blizzard_pri, 4 .equ se_m_blizzard_rev, reverb_set+50 .equ se_m_blizzard_mvl, 127 diff --git a/sound/songs/se_m_blizzard2.s b/sound/songs/se_m_blizzard2.s index 8c1518e63760..2940d80d52a2 100644 --- a/sound/songs/se_m_blizzard2.s +++ b/sound/songs/se_m_blizzard2.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_blizzard2_grp, voicegroup128 + .equ se_m_blizzard2_grp, voicegroup_rs_sfx_2 .equ se_m_blizzard2_pri, 4 .equ se_m_blizzard2_rev, reverb_set+50 .equ se_m_blizzard2_mvl, 127 diff --git a/sound/songs/se_m_bonemerang.s b/sound/songs/se_m_bonemerang.s index 933980936442..16f170b76b6c 100644 --- a/sound/songs/se_m_bonemerang.s +++ b/sound/songs/se_m_bonemerang.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_bonemerang_grp, voicegroup128 + .equ se_m_bonemerang_grp, voicegroup_rs_sfx_2 .equ se_m_bonemerang_pri, 4 .equ se_m_bonemerang_rev, reverb_set+50 .equ se_m_bonemerang_mvl, 127 diff --git a/sound/songs/se_m_brick_break.s b/sound/songs/se_m_brick_break.s index ce13218d2455..2270fc24b517 100644 --- a/sound/songs/se_m_brick_break.s +++ b/sound/songs/se_m_brick_break.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_brick_break_grp, voicegroup128 + .equ se_m_brick_break_grp, voicegroup_rs_sfx_2 .equ se_m_brick_break_pri, 4 .equ se_m_brick_break_rev, reverb_set+50 .equ se_m_brick_break_mvl, 127 diff --git a/sound/songs/se_m_bubble.s b/sound/songs/se_m_bubble.s index 4e1b988d59f8..9c7fb6fadd5c 100644 --- a/sound/songs/se_m_bubble.s +++ b/sound/songs/se_m_bubble.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_bubble_grp, voicegroup128 + .equ se_m_bubble_grp, voicegroup_rs_sfx_2 .equ se_m_bubble_pri, 4 .equ se_m_bubble_rev, reverb_set+50 .equ se_m_bubble_mvl, 127 diff --git a/sound/songs/se_m_bubble2.s b/sound/songs/se_m_bubble2.s index 97e7cbbf85b1..1b009672bf3b 100644 --- a/sound/songs/se_m_bubble2.s +++ b/sound/songs/se_m_bubble2.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_bubble2_grp, voicegroup128 + .equ se_m_bubble2_grp, voicegroup_rs_sfx_2 .equ se_m_bubble2_pri, 4 .equ se_m_bubble2_rev, reverb_set+50 .equ se_m_bubble2_mvl, 127 diff --git a/sound/songs/se_m_bubble3.s b/sound/songs/se_m_bubble3.s index d9a7f1e82b99..ea4c1e6fd47d 100644 --- a/sound/songs/se_m_bubble3.s +++ b/sound/songs/se_m_bubble3.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_bubble3_grp, voicegroup128 + .equ se_m_bubble3_grp, voicegroup_rs_sfx_2 .equ se_m_bubble3_pri, 4 .equ se_m_bubble3_rev, reverb_set+50 .equ se_m_bubble3_mvl, 127 diff --git a/sound/songs/se_m_bubble_beam.s b/sound/songs/se_m_bubble_beam.s index 621882b03f86..b1eac882b7fd 100644 --- a/sound/songs/se_m_bubble_beam.s +++ b/sound/songs/se_m_bubble_beam.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_bubble_beam_grp, voicegroup128 + .equ se_m_bubble_beam_grp, voicegroup_rs_sfx_2 .equ se_m_bubble_beam_pri, 4 .equ se_m_bubble_beam_rev, reverb_set+50 .equ se_m_bubble_beam_mvl, 127 diff --git a/sound/songs/se_m_bubble_beam2.s b/sound/songs/se_m_bubble_beam2.s index 0e8cbf5e415b..970ef028975a 100644 --- a/sound/songs/se_m_bubble_beam2.s +++ b/sound/songs/se_m_bubble_beam2.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_bubble_beam2_grp, voicegroup128 + .equ se_m_bubble_beam2_grp, voicegroup_rs_sfx_2 .equ se_m_bubble_beam2_pri, 4 .equ se_m_bubble_beam2_rev, reverb_set+50 .equ se_m_bubble_beam2_mvl, 127 diff --git a/sound/songs/se_m_charge.s b/sound/songs/se_m_charge.s index 47d70a4bff1e..1ad07164f627 100644 --- a/sound/songs/se_m_charge.s +++ b/sound/songs/se_m_charge.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_charge_grp, voicegroup128 + .equ se_m_charge_grp, voicegroup_rs_sfx_2 .equ se_m_charge_pri, 4 .equ se_m_charge_rev, reverb_set+50 .equ se_m_charge_mvl, 127 diff --git a/sound/songs/se_m_charm.s b/sound/songs/se_m_charm.s index 2bb2e0ef3714..9d27f1445a04 100644 --- a/sound/songs/se_m_charm.s +++ b/sound/songs/se_m_charm.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_charm_grp, voicegroup128 + .equ se_m_charm_grp, voicegroup_rs_sfx_2 .equ se_m_charm_pri, 4 .equ se_m_charm_rev, reverb_set+50 .equ se_m_charm_mvl, 127 diff --git a/sound/songs/se_m_confuse_ray.s b/sound/songs/se_m_confuse_ray.s index 78407b8c113e..e856fe495a80 100644 --- a/sound/songs/se_m_confuse_ray.s +++ b/sound/songs/se_m_confuse_ray.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_confuse_ray_grp, voicegroup128 + .equ se_m_confuse_ray_grp, voicegroup_rs_sfx_2 .equ se_m_confuse_ray_pri, 4 .equ se_m_confuse_ray_rev, reverb_set+50 .equ se_m_confuse_ray_mvl, 127 diff --git a/sound/songs/se_m_cosmic_power.s b/sound/songs/se_m_cosmic_power.s index 3e3f53c5ec76..3779ea9683dd 100644 --- a/sound/songs/se_m_cosmic_power.s +++ b/sound/songs/se_m_cosmic_power.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_cosmic_power_grp, voicegroup128 + .equ se_m_cosmic_power_grp, voicegroup_rs_sfx_2 .equ se_m_cosmic_power_pri, 4 .equ se_m_cosmic_power_rev, reverb_set+50 .equ se_m_cosmic_power_mvl, 127 diff --git a/sound/songs/se_m_crabhammer.s b/sound/songs/se_m_crabhammer.s index 6333150dc770..c629edc99c5a 100644 --- a/sound/songs/se_m_crabhammer.s +++ b/sound/songs/se_m_crabhammer.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_crabhammer_grp, voicegroup128 + .equ se_m_crabhammer_grp, voicegroup_rs_sfx_2 .equ se_m_crabhammer_pri, 4 .equ se_m_crabhammer_rev, reverb_set+50 .equ se_m_crabhammer_mvl, 127 diff --git a/sound/songs/se_m_detect.s b/sound/songs/se_m_detect.s index f06802802aea..82196bb2d9b7 100644 --- a/sound/songs/se_m_detect.s +++ b/sound/songs/se_m_detect.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_detect_grp, voicegroup128 + .equ se_m_detect_grp, voicegroup_rs_sfx_2 .equ se_m_detect_pri, 4 .equ se_m_detect_rev, reverb_set+50 .equ se_m_detect_mvl, 127 diff --git a/sound/songs/se_m_dig.s b/sound/songs/se_m_dig.s index f8d3597d95bf..be16d77ac5ae 100644 --- a/sound/songs/se_m_dig.s +++ b/sound/songs/se_m_dig.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_dig_grp, voicegroup128 + .equ se_m_dig_grp, voicegroup_rs_sfx_2 .equ se_m_dig_pri, 4 .equ se_m_dig_rev, reverb_set+50 .equ se_m_dig_mvl, 127 diff --git a/sound/songs/se_m_dive.s b/sound/songs/se_m_dive.s index 83cc42356410..879c41eefc41 100644 --- a/sound/songs/se_m_dive.s +++ b/sound/songs/se_m_dive.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_dive_grp, voicegroup128 + .equ se_m_dive_grp, voicegroup_rs_sfx_2 .equ se_m_dive_pri, 4 .equ se_m_dive_rev, reverb_set+50 .equ se_m_dive_mvl, 127 diff --git a/sound/songs/se_m_dizzy_punch.s b/sound/songs/se_m_dizzy_punch.s index 31ab74a77f8a..ccd2a6c95602 100644 --- a/sound/songs/se_m_dizzy_punch.s +++ b/sound/songs/se_m_dizzy_punch.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_dizzy_punch_grp, voicegroup128 + .equ se_m_dizzy_punch_grp, voicegroup_rs_sfx_2 .equ se_m_dizzy_punch_pri, 4 .equ se_m_dizzy_punch_rev, reverb_set+50 .equ se_m_dizzy_punch_mvl, 127 diff --git a/sound/songs/se_m_double_team.s b/sound/songs/se_m_double_team.s index 49bcfb13d3ee..3efab79b044c 100644 --- a/sound/songs/se_m_double_team.s +++ b/sound/songs/se_m_double_team.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_double_team_grp, voicegroup128 + .equ se_m_double_team_grp, voicegroup_rs_sfx_2 .equ se_m_double_team_pri, 4 .equ se_m_double_team_rev, reverb_set+50 .equ se_m_double_team_mvl, 127 diff --git a/sound/songs/se_m_dragon_rage.s b/sound/songs/se_m_dragon_rage.s index 608d9261156c..3a0675c03ab4 100644 --- a/sound/songs/se_m_dragon_rage.s +++ b/sound/songs/se_m_dragon_rage.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_dragon_rage_grp, voicegroup128 + .equ se_m_dragon_rage_grp, voicegroup_rs_sfx_2 .equ se_m_dragon_rage_pri, 4 .equ se_m_dragon_rage_rev, reverb_set+50 .equ se_m_dragon_rage_mvl, 127 diff --git a/sound/songs/se_m_earthquake.s b/sound/songs/se_m_earthquake.s index 928ddfacd8d0..76c40d88ca33 100644 --- a/sound/songs/se_m_earthquake.s +++ b/sound/songs/se_m_earthquake.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_earthquake_grp, voicegroup128 + .equ se_m_earthquake_grp, voicegroup_rs_sfx_2 .equ se_m_earthquake_pri, 4 .equ se_m_earthquake_rev, reverb_set+50 .equ se_m_earthquake_mvl, 127 diff --git a/sound/songs/se_m_ember.s b/sound/songs/se_m_ember.s index a685ca24c958..010ffaaf1ad3 100644 --- a/sound/songs/se_m_ember.s +++ b/sound/songs/se_m_ember.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_ember_grp, voicegroup128 + .equ se_m_ember_grp, voicegroup_rs_sfx_2 .equ se_m_ember_pri, 4 .equ se_m_ember_rev, reverb_set+50 .equ se_m_ember_mvl, 127 diff --git a/sound/songs/se_m_encore.s b/sound/songs/se_m_encore.s index cf13ab76189a..0f212febb32c 100644 --- a/sound/songs/se_m_encore.s +++ b/sound/songs/se_m_encore.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_encore_grp, voicegroup128 + .equ se_m_encore_grp, voicegroup_rs_sfx_2 .equ se_m_encore_pri, 4 .equ se_m_encore_rev, reverb_set+50 .equ se_m_encore_mvl, 127 diff --git a/sound/songs/se_m_encore2.s b/sound/songs/se_m_encore2.s index 61e522acac52..86ebb5585bf2 100644 --- a/sound/songs/se_m_encore2.s +++ b/sound/songs/se_m_encore2.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_encore2_grp, voicegroup128 + .equ se_m_encore2_grp, voicegroup_rs_sfx_2 .equ se_m_encore2_pri, 4 .equ se_m_encore2_rev, reverb_set+50 .equ se_m_encore2_mvl, 127 diff --git a/sound/songs/se_m_explosion.s b/sound/songs/se_m_explosion.s index 039c563f7869..b0f98c6f40cc 100644 --- a/sound/songs/se_m_explosion.s +++ b/sound/songs/se_m_explosion.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_explosion_grp, voicegroup128 + .equ se_m_explosion_grp, voicegroup_rs_sfx_2 .equ se_m_explosion_pri, 4 .equ se_m_explosion_rev, reverb_set+50 .equ se_m_explosion_mvl, 127 diff --git a/sound/songs/se_m_faint_attack.s b/sound/songs/se_m_faint_attack.s index ce53c7173e2c..2011e58b4e0c 100644 --- a/sound/songs/se_m_faint_attack.s +++ b/sound/songs/se_m_faint_attack.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_faint_attack_grp, voicegroup128 + .equ se_m_faint_attack_grp, voicegroup_rs_sfx_2 .equ se_m_faint_attack_pri, 4 .equ se_m_faint_attack_rev, reverb_set+50 .equ se_m_faint_attack_mvl, 127 diff --git a/sound/songs/se_m_flame_wheel.s b/sound/songs/se_m_flame_wheel.s index 797073466a24..f722ae320072 100644 --- a/sound/songs/se_m_flame_wheel.s +++ b/sound/songs/se_m_flame_wheel.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_flame_wheel_grp, voicegroup128 + .equ se_m_flame_wheel_grp, voicegroup_rs_sfx_2 .equ se_m_flame_wheel_pri, 4 .equ se_m_flame_wheel_rev, reverb_set+50 .equ se_m_flame_wheel_mvl, 127 diff --git a/sound/songs/se_m_flame_wheel2.s b/sound/songs/se_m_flame_wheel2.s index 21f911b0ba74..09413e52aa2a 100644 --- a/sound/songs/se_m_flame_wheel2.s +++ b/sound/songs/se_m_flame_wheel2.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_flame_wheel2_grp, voicegroup128 + .equ se_m_flame_wheel2_grp, voicegroup_rs_sfx_2 .equ se_m_flame_wheel2_pri, 4 .equ se_m_flame_wheel2_rev, reverb_set+50 .equ se_m_flame_wheel2_mvl, 127 diff --git a/sound/songs/se_m_flamethrower.s b/sound/songs/se_m_flamethrower.s index 4c0c892c1ee3..0536ae19fddb 100644 --- a/sound/songs/se_m_flamethrower.s +++ b/sound/songs/se_m_flamethrower.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_flamethrower_grp, voicegroup128 + .equ se_m_flamethrower_grp, voicegroup_rs_sfx_2 .equ se_m_flamethrower_pri, 4 .equ se_m_flamethrower_rev, reverb_set+50 .equ se_m_flamethrower_mvl, 127 diff --git a/sound/songs/se_m_flatter.s b/sound/songs/se_m_flatter.s index 799fdba91299..b6484bbf4f90 100644 --- a/sound/songs/se_m_flatter.s +++ b/sound/songs/se_m_flatter.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_flatter_grp, voicegroup128 + .equ se_m_flatter_grp, voicegroup_rs_sfx_2 .equ se_m_flatter_pri, 4 .equ se_m_flatter_rev, reverb_set+50 .equ se_m_flatter_mvl, 127 diff --git a/sound/songs/se_m_giga_drain.s b/sound/songs/se_m_giga_drain.s index 4596a0252cd8..de8f95175508 100644 --- a/sound/songs/se_m_giga_drain.s +++ b/sound/songs/se_m_giga_drain.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_giga_drain_grp, voicegroup128 + .equ se_m_giga_drain_grp, voicegroup_rs_sfx_2 .equ se_m_giga_drain_pri, 4 .equ se_m_giga_drain_rev, reverb_set+50 .equ se_m_giga_drain_mvl, 127 diff --git a/sound/songs/se_m_grasswhistle.s b/sound/songs/se_m_grasswhistle.s index 10c7447873a2..384908fd8a02 100644 --- a/sound/songs/se_m_grasswhistle.s +++ b/sound/songs/se_m_grasswhistle.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_grasswhistle_grp, voicegroup128 + .equ se_m_grasswhistle_grp, voicegroup_rs_sfx_2 .equ se_m_grasswhistle_pri, 4 .equ se_m_grasswhistle_rev, reverb_set+50 .equ se_m_grasswhistle_mvl, 127 diff --git a/sound/songs/se_m_hail.s b/sound/songs/se_m_hail.s index 7f1d1c67da99..46b25141b604 100644 --- a/sound/songs/se_m_hail.s +++ b/sound/songs/se_m_hail.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_hail_grp, voicegroup128 + .equ se_m_hail_grp, voicegroup_rs_sfx_2 .equ se_m_hail_pri, 4 .equ se_m_hail_rev, reverb_set+50 .equ se_m_hail_mvl, 127 diff --git a/sound/songs/se_m_harden.s b/sound/songs/se_m_harden.s index e9bd888de8b6..2171a3e06711 100644 --- a/sound/songs/se_m_harden.s +++ b/sound/songs/se_m_harden.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_harden_grp, voicegroup128 + .equ se_m_harden_grp, voicegroup_rs_sfx_2 .equ se_m_harden_pri, 4 .equ se_m_harden_rev, reverb_set+50 .equ se_m_harden_mvl, 127 diff --git a/sound/songs/se_m_haze.s b/sound/songs/se_m_haze.s index 11497c846536..fb134ff04253 100644 --- a/sound/songs/se_m_haze.s +++ b/sound/songs/se_m_haze.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_haze_grp, voicegroup128 + .equ se_m_haze_grp, voicegroup_rs_sfx_2 .equ se_m_haze_pri, 4 .equ se_m_haze_rev, reverb_set+50 .equ se_m_haze_mvl, 127 diff --git a/sound/songs/se_m_heal_bell.s b/sound/songs/se_m_heal_bell.s index fbe315c8788d..407af374fbec 100644 --- a/sound/songs/se_m_heal_bell.s +++ b/sound/songs/se_m_heal_bell.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_heal_bell_grp, voicegroup128 + .equ se_m_heal_bell_grp, voicegroup_rs_sfx_2 .equ se_m_heal_bell_pri, 4 .equ se_m_heal_bell_rev, reverb_set+50 .equ se_m_heal_bell_mvl, 127 diff --git a/sound/songs/se_m_heat_wave.s b/sound/songs/se_m_heat_wave.s index da5842f8f8e0..5430cd4cadd3 100644 --- a/sound/songs/se_m_heat_wave.s +++ b/sound/songs/se_m_heat_wave.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_heat_wave_grp, voicegroup128 + .equ se_m_heat_wave_grp, voicegroup_rs_sfx_2 .equ se_m_heat_wave_pri, 4 .equ se_m_heat_wave_rev, reverb_set+50 .equ se_m_heat_wave_mvl, 127 diff --git a/sound/songs/se_m_hydro_pump.s b/sound/songs/se_m_hydro_pump.s index c214985e4718..93f8459ec1f8 100644 --- a/sound/songs/se_m_hydro_pump.s +++ b/sound/songs/se_m_hydro_pump.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_hydro_pump_grp, voicegroup128 + .equ se_m_hydro_pump_grp, voicegroup_rs_sfx_2 .equ se_m_hydro_pump_pri, 4 .equ se_m_hydro_pump_rev, reverb_set+50 .equ se_m_hydro_pump_mvl, 127 diff --git a/sound/songs/se_m_hyper_beam.s b/sound/songs/se_m_hyper_beam.s index b6ffcfc2f787..34e49ac460b4 100644 --- a/sound/songs/se_m_hyper_beam.s +++ b/sound/songs/se_m_hyper_beam.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_hyper_beam_grp, voicegroup128 + .equ se_m_hyper_beam_grp, voicegroup_rs_sfx_2 .equ se_m_hyper_beam_pri, 4 .equ se_m_hyper_beam_rev, reverb_set+50 .equ se_m_hyper_beam_mvl, 127 diff --git a/sound/songs/se_m_hyper_beam2.s b/sound/songs/se_m_hyper_beam2.s index fb2183422232..0fffa797c69e 100644 --- a/sound/songs/se_m_hyper_beam2.s +++ b/sound/songs/se_m_hyper_beam2.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_hyper_beam2_grp, voicegroup128 + .equ se_m_hyper_beam2_grp, voicegroup_rs_sfx_2 .equ se_m_hyper_beam2_pri, 4 .equ se_m_hyper_beam2_rev, reverb_set+50 .equ se_m_hyper_beam2_mvl, 127 diff --git a/sound/songs/se_m_icy_wind.s b/sound/songs/se_m_icy_wind.s index b7e83e0321a5..dff7f5948763 100644 --- a/sound/songs/se_m_icy_wind.s +++ b/sound/songs/se_m_icy_wind.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_icy_wind_grp, voicegroup128 + .equ se_m_icy_wind_grp, voicegroup_rs_sfx_2 .equ se_m_icy_wind_pri, 4 .equ se_m_icy_wind_rev, reverb_set+50 .equ se_m_icy_wind_mvl, 127 diff --git a/sound/songs/se_m_lick.s b/sound/songs/se_m_lick.s index 1aa0c35a286e..34f9cbfbbe0d 100644 --- a/sound/songs/se_m_lick.s +++ b/sound/songs/se_m_lick.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_lick_grp, voicegroup128 + .equ se_m_lick_grp, voicegroup_rs_sfx_2 .equ se_m_lick_pri, 4 .equ se_m_lick_rev, reverb_set+50 .equ se_m_lick_mvl, 127 diff --git a/sound/songs/se_m_lock_on.s b/sound/songs/se_m_lock_on.s index 9c9576d97c34..c95eafb3b0dc 100644 --- a/sound/songs/se_m_lock_on.s +++ b/sound/songs/se_m_lock_on.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_lock_on_grp, voicegroup128 + .equ se_m_lock_on_grp, voicegroup_rs_sfx_2 .equ se_m_lock_on_pri, 4 .equ se_m_lock_on_rev, reverb_set+50 .equ se_m_lock_on_mvl, 127 diff --git a/sound/songs/se_m_metronome.s b/sound/songs/se_m_metronome.s index ba0a55d8b964..de8899b16ae7 100644 --- a/sound/songs/se_m_metronome.s +++ b/sound/songs/se_m_metronome.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_metronome_grp, voicegroup128 + .equ se_m_metronome_grp, voicegroup_rs_sfx_2 .equ se_m_metronome_pri, 4 .equ se_m_metronome_rev, reverb_set+50 .equ se_m_metronome_mvl, 127 diff --git a/sound/songs/se_m_milk_drink.s b/sound/songs/se_m_milk_drink.s index 57e3a581d6fd..6380ee398b67 100644 --- a/sound/songs/se_m_milk_drink.s +++ b/sound/songs/se_m_milk_drink.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_milk_drink_grp, voicegroup128 + .equ se_m_milk_drink_grp, voicegroup_rs_sfx_2 .equ se_m_milk_drink_pri, 4 .equ se_m_milk_drink_rev, reverb_set+50 .equ se_m_milk_drink_mvl, 127 diff --git a/sound/songs/se_m_minimize.s b/sound/songs/se_m_minimize.s index 778e0ec7c99c..32dd545a037a 100644 --- a/sound/songs/se_m_minimize.s +++ b/sound/songs/se_m_minimize.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_minimize_grp, voicegroup128 + .equ se_m_minimize_grp, voicegroup_rs_sfx_2 .equ se_m_minimize_pri, 4 .equ se_m_minimize_rev, reverb_set+50 .equ se_m_minimize_mvl, 127 diff --git a/sound/songs/se_m_mist.s b/sound/songs/se_m_mist.s index f46eb130a699..7975b50cc975 100644 --- a/sound/songs/se_m_mist.s +++ b/sound/songs/se_m_mist.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_mist_grp, voicegroup128 + .equ se_m_mist_grp, voicegroup_rs_sfx_2 .equ se_m_mist_pri, 4 .equ se_m_mist_rev, reverb_set+50 .equ se_m_mist_mvl, 127 diff --git a/sound/songs/se_m_moonlight.s b/sound/songs/se_m_moonlight.s index f76181a8746f..35329544e936 100644 --- a/sound/songs/se_m_moonlight.s +++ b/sound/songs/se_m_moonlight.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_moonlight_grp, voicegroup128 + .equ se_m_moonlight_grp, voicegroup_rs_sfx_2 .equ se_m_moonlight_pri, 4 .equ se_m_moonlight_rev, reverb_set+50 .equ se_m_moonlight_mvl, 127 diff --git a/sound/songs/se_m_morning_sun.s b/sound/songs/se_m_morning_sun.s index 227098da1f42..a1196f6fe9a2 100644 --- a/sound/songs/se_m_morning_sun.s +++ b/sound/songs/se_m_morning_sun.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_morning_sun_grp, voicegroup128 + .equ se_m_morning_sun_grp, voicegroup_rs_sfx_2 .equ se_m_morning_sun_pri, 5 .equ se_m_morning_sun_rev, reverb_set+50 .equ se_m_morning_sun_mvl, 127 diff --git a/sound/songs/se_m_nightmare.s b/sound/songs/se_m_nightmare.s index f995d1310399..61e7cde1e35c 100644 --- a/sound/songs/se_m_nightmare.s +++ b/sound/songs/se_m_nightmare.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_nightmare_grp, voicegroup128 + .equ se_m_nightmare_grp, voicegroup_rs_sfx_2 .equ se_m_nightmare_pri, 4 .equ se_m_nightmare_rev, reverb_set+50 .equ se_m_nightmare_mvl, 127 diff --git a/sound/songs/se_m_perish_song.s b/sound/songs/se_m_perish_song.s index af30e2457954..85614227ed30 100644 --- a/sound/songs/se_m_perish_song.s +++ b/sound/songs/se_m_perish_song.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_perish_song_grp, voicegroup128 + .equ se_m_perish_song_grp, voicegroup_rs_sfx_2 .equ se_m_perish_song_pri, 4 .equ se_m_perish_song_rev, reverb_set+50 .equ se_m_perish_song_mvl, 127 diff --git a/sound/songs/se_m_petal_dance.s b/sound/songs/se_m_petal_dance.s index df5752e4bd4a..6d4e015a77aa 100644 --- a/sound/songs/se_m_petal_dance.s +++ b/sound/songs/se_m_petal_dance.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_petal_dance_grp, voicegroup128 + .equ se_m_petal_dance_grp, voicegroup_rs_sfx_2 .equ se_m_petal_dance_pri, 4 .equ se_m_petal_dance_rev, reverb_set+50 .equ se_m_petal_dance_mvl, 127 diff --git a/sound/songs/se_m_poison_powder.s b/sound/songs/se_m_poison_powder.s index f48637385b6a..f9fcd6dc9a2f 100644 --- a/sound/songs/se_m_poison_powder.s +++ b/sound/songs/se_m_poison_powder.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_poison_powder_grp, voicegroup128 + .equ se_m_poison_powder_grp, voicegroup_rs_sfx_2 .equ se_m_poison_powder_pri, 4 .equ se_m_poison_powder_rev, reverb_set+50 .equ se_m_poison_powder_mvl, 127 diff --git a/sound/songs/se_m_psybeam.s b/sound/songs/se_m_psybeam.s index c7f68cffd642..416a8a939272 100644 --- a/sound/songs/se_m_psybeam.s +++ b/sound/songs/se_m_psybeam.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_psybeam_grp, voicegroup128 + .equ se_m_psybeam_grp, voicegroup_rs_sfx_2 .equ se_m_psybeam_pri, 4 .equ se_m_psybeam_rev, reverb_set+50 .equ se_m_psybeam_mvl, 127 diff --git a/sound/songs/se_m_psybeam2.s b/sound/songs/se_m_psybeam2.s index e26a844c919b..2cce6098b1c7 100644 --- a/sound/songs/se_m_psybeam2.s +++ b/sound/songs/se_m_psybeam2.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_psybeam2_grp, voicegroup128 + .equ se_m_psybeam2_grp, voicegroup_rs_sfx_2 .equ se_m_psybeam2_pri, 4 .equ se_m_psybeam2_rev, reverb_set+50 .equ se_m_psybeam2_mvl, 127 diff --git a/sound/songs/se_m_rain_dance.s b/sound/songs/se_m_rain_dance.s index bba4dc2b05ad..7e5b2d00984a 100644 --- a/sound/songs/se_m_rain_dance.s +++ b/sound/songs/se_m_rain_dance.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_rain_dance_grp, voicegroup128 + .equ se_m_rain_dance_grp, voicegroup_rs_sfx_2 .equ se_m_rain_dance_pri, 4 .equ se_m_rain_dance_rev, reverb_set+50 .equ se_m_rain_dance_mvl, 127 diff --git a/sound/songs/se_m_reflect.s b/sound/songs/se_m_reflect.s index 56699c65eaed..d5649ab3609e 100644 --- a/sound/songs/se_m_reflect.s +++ b/sound/songs/se_m_reflect.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_reflect_grp, voicegroup128 + .equ se_m_reflect_grp, voicegroup_rs_sfx_2 .equ se_m_reflect_pri, 4 .equ se_m_reflect_rev, reverb_set+50 .equ se_m_reflect_mvl, 127 diff --git a/sound/songs/se_m_reversal.s b/sound/songs/se_m_reversal.s index 5b62d7156eac..56ed6d0576d5 100644 --- a/sound/songs/se_m_reversal.s +++ b/sound/songs/se_m_reversal.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_reversal_grp, voicegroup128 + .equ se_m_reversal_grp, voicegroup_rs_sfx_2 .equ se_m_reversal_pri, 4 .equ se_m_reversal_rev, reverb_set+50 .equ se_m_reversal_mvl, 127 diff --git a/sound/songs/se_m_rock_throw.s b/sound/songs/se_m_rock_throw.s index 71dddd44758a..74ae936b76d2 100644 --- a/sound/songs/se_m_rock_throw.s +++ b/sound/songs/se_m_rock_throw.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_rock_throw_grp, voicegroup128 + .equ se_m_rock_throw_grp, voicegroup_rs_sfx_2 .equ se_m_rock_throw_pri, 4 .equ se_m_rock_throw_rev, reverb_set+50 .equ se_m_rock_throw_mvl, 127 diff --git a/sound/songs/se_m_sacred_fire.s b/sound/songs/se_m_sacred_fire.s index 0fda9c757ab2..58a40c9bfb62 100644 --- a/sound/songs/se_m_sacred_fire.s +++ b/sound/songs/se_m_sacred_fire.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_sacred_fire_grp, voicegroup128 + .equ se_m_sacred_fire_grp, voicegroup_rs_sfx_2 .equ se_m_sacred_fire_pri, 4 .equ se_m_sacred_fire_rev, reverb_set+50 .equ se_m_sacred_fire_mvl, 127 diff --git a/sound/songs/se_m_sacred_fire2.s b/sound/songs/se_m_sacred_fire2.s index f255e712a9f2..41582debdd63 100644 --- a/sound/songs/se_m_sacred_fire2.s +++ b/sound/songs/se_m_sacred_fire2.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_sacred_fire2_grp, voicegroup128 + .equ se_m_sacred_fire2_grp, voicegroup_rs_sfx_2 .equ se_m_sacred_fire2_pri, 4 .equ se_m_sacred_fire2_rev, reverb_set+50 .equ se_m_sacred_fire2_mvl, 127 diff --git a/sound/songs/se_m_sand_tomb.s b/sound/songs/se_m_sand_tomb.s index 4c14aabcc4a6..e52a76d108f6 100644 --- a/sound/songs/se_m_sand_tomb.s +++ b/sound/songs/se_m_sand_tomb.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_sand_tomb_grp, voicegroup128 + .equ se_m_sand_tomb_grp, voicegroup_rs_sfx_2 .equ se_m_sand_tomb_pri, 4 .equ se_m_sand_tomb_rev, reverb_set+50 .equ se_m_sand_tomb_mvl, 127 diff --git a/sound/songs/se_m_sandstorm.s b/sound/songs/se_m_sandstorm.s index 4cb12a38920c..e4e81dcc62a4 100644 --- a/sound/songs/se_m_sandstorm.s +++ b/sound/songs/se_m_sandstorm.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_sandstorm_grp, voicegroup128 + .equ se_m_sandstorm_grp, voicegroup_rs_sfx_2 .equ se_m_sandstorm_pri, 4 .equ se_m_sandstorm_rev, reverb_set+50 .equ se_m_sandstorm_mvl, 127 diff --git a/sound/songs/se_m_screech.s b/sound/songs/se_m_screech.s index 378cf71281b5..c28d8d2bbda8 100644 --- a/sound/songs/se_m_screech.s +++ b/sound/songs/se_m_screech.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_screech_grp, voicegroup128 + .equ se_m_screech_grp, voicegroup_rs_sfx_2 .equ se_m_screech_pri, 4 .equ se_m_screech_rev, reverb_set+50 .equ se_m_screech_mvl, 127 diff --git a/sound/songs/se_m_self_destruct.s b/sound/songs/se_m_self_destruct.s index 645085e1e5ed..0ed13b83d420 100644 --- a/sound/songs/se_m_self_destruct.s +++ b/sound/songs/se_m_self_destruct.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_self_destruct_grp, voicegroup128 + .equ se_m_self_destruct_grp, voicegroup_rs_sfx_2 .equ se_m_self_destruct_pri, 4 .equ se_m_self_destruct_rev, reverb_set+50 .equ se_m_self_destruct_mvl, 127 diff --git a/sound/songs/se_m_sing.s b/sound/songs/se_m_sing.s index 8c48c822473f..349f6839ce0d 100644 --- a/sound/songs/se_m_sing.s +++ b/sound/songs/se_m_sing.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_sing_grp, voicegroup128 + .equ se_m_sing_grp, voicegroup_rs_sfx_2 .equ se_m_sing_pri, 4 .equ se_m_sing_rev, reverb_set+50 .equ se_m_sing_mvl, 127 diff --git a/sound/songs/se_m_sketch.s b/sound/songs/se_m_sketch.s index c17c4056f2ee..579a30874322 100644 --- a/sound/songs/se_m_sketch.s +++ b/sound/songs/se_m_sketch.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_sketch_grp, voicegroup128 + .equ se_m_sketch_grp, voicegroup_rs_sfx_2 .equ se_m_sketch_pri, 4 .equ se_m_sketch_rev, reverb_set+50 .equ se_m_sketch_mvl, 127 diff --git a/sound/songs/se_m_sky_uppercut.s b/sound/songs/se_m_sky_uppercut.s index bed6c19c5f75..6a28b5bcd66f 100644 --- a/sound/songs/se_m_sky_uppercut.s +++ b/sound/songs/se_m_sky_uppercut.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_sky_uppercut_grp, voicegroup128 + .equ se_m_sky_uppercut_grp, voicegroup_rs_sfx_2 .equ se_m_sky_uppercut_pri, 4 .equ se_m_sky_uppercut_rev, reverb_set+50 .equ se_m_sky_uppercut_mvl, 127 diff --git a/sound/songs/se_m_snore.s b/sound/songs/se_m_snore.s index 13e2f6f52b2a..5774355f2115 100644 --- a/sound/songs/se_m_snore.s +++ b/sound/songs/se_m_snore.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_snore_grp, voicegroup128 + .equ se_m_snore_grp, voicegroup_rs_sfx_2 .equ se_m_snore_pri, 4 .equ se_m_snore_rev, reverb_set+50 .equ se_m_snore_mvl, 127 diff --git a/sound/songs/se_m_solar_beam.s b/sound/songs/se_m_solar_beam.s index 6a12b4a10ea8..0ef97c6be27d 100644 --- a/sound/songs/se_m_solar_beam.s +++ b/sound/songs/se_m_solar_beam.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_solar_beam_grp, voicegroup128 + .equ se_m_solar_beam_grp, voicegroup_rs_sfx_2 .equ se_m_solar_beam_pri, 4 .equ se_m_solar_beam_rev, reverb_set+50 .equ se_m_solar_beam_mvl, 127 diff --git a/sound/songs/se_m_spit_up.s b/sound/songs/se_m_spit_up.s index 1073ad01fc97..20fe0697d7ba 100644 --- a/sound/songs/se_m_spit_up.s +++ b/sound/songs/se_m_spit_up.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_spit_up_grp, voicegroup128 + .equ se_m_spit_up_grp, voicegroup_rs_sfx_2 .equ se_m_spit_up_pri, 4 .equ se_m_spit_up_rev, reverb_set+50 .equ se_m_spit_up_mvl, 127 diff --git a/sound/songs/se_m_stat_decrease.s b/sound/songs/se_m_stat_decrease.s index 51218db1e755..8f242be04ee0 100644 --- a/sound/songs/se_m_stat_decrease.s +++ b/sound/songs/se_m_stat_decrease.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_stat_decrease_grp, voicegroup128 + .equ se_m_stat_decrease_grp, voicegroup_rs_sfx_2 .equ se_m_stat_decrease_pri, 4 .equ se_m_stat_decrease_rev, reverb_set+50 .equ se_m_stat_decrease_mvl, 127 diff --git a/sound/songs/se_m_stat_increase.s b/sound/songs/se_m_stat_increase.s index 2556b6afa78e..d5d6b5e918a9 100644 --- a/sound/songs/se_m_stat_increase.s +++ b/sound/songs/se_m_stat_increase.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_stat_increase_grp, voicegroup128 + .equ se_m_stat_increase_grp, voicegroup_rs_sfx_2 .equ se_m_stat_increase_pri, 4 .equ se_m_stat_increase_rev, reverb_set+50 .equ se_m_stat_increase_mvl, 127 diff --git a/sound/songs/se_m_strength.s b/sound/songs/se_m_strength.s index bda5fc61e5e8..974a9f976f80 100644 --- a/sound/songs/se_m_strength.s +++ b/sound/songs/se_m_strength.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_strength_grp, voicegroup128 + .equ se_m_strength_grp, voicegroup_rs_sfx_2 .equ se_m_strength_pri, 4 .equ se_m_strength_rev, reverb_set+50 .equ se_m_strength_mvl, 127 diff --git a/sound/songs/se_m_string_shot.s b/sound/songs/se_m_string_shot.s index d750d26b9b5e..ed0701953b19 100644 --- a/sound/songs/se_m_string_shot.s +++ b/sound/songs/se_m_string_shot.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_string_shot_grp, voicegroup128 + .equ se_m_string_shot_grp, voicegroup_rs_sfx_2 .equ se_m_string_shot_pri, 4 .equ se_m_string_shot_rev, reverb_set+50 .equ se_m_string_shot_mvl, 127 diff --git a/sound/songs/se_m_string_shot2.s b/sound/songs/se_m_string_shot2.s index b885a7d1a8c0..ac17f52cc88c 100644 --- a/sound/songs/se_m_string_shot2.s +++ b/sound/songs/se_m_string_shot2.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_string_shot2_grp, voicegroup128 + .equ se_m_string_shot2_grp, voicegroup_rs_sfx_2 .equ se_m_string_shot2_pri, 4 .equ se_m_string_shot2_rev, reverb_set+50 .equ se_m_string_shot2_mvl, 127 diff --git a/sound/songs/se_m_supersonic.s b/sound/songs/se_m_supersonic.s index c975dad4b645..3029597d1d18 100644 --- a/sound/songs/se_m_supersonic.s +++ b/sound/songs/se_m_supersonic.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_supersonic_grp, voicegroup128 + .equ se_m_supersonic_grp, voicegroup_rs_sfx_2 .equ se_m_supersonic_pri, 4 .equ se_m_supersonic_rev, reverb_set+50 .equ se_m_supersonic_mvl, 127 diff --git a/sound/songs/se_m_surf.s b/sound/songs/se_m_surf.s index d3e3077826e9..1b3fc5cb9104 100644 --- a/sound/songs/se_m_surf.s +++ b/sound/songs/se_m_surf.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_surf_grp, voicegroup128 + .equ se_m_surf_grp, voicegroup_rs_sfx_2 .equ se_m_surf_pri, 4 .equ se_m_surf_rev, reverb_set+50 .equ se_m_surf_mvl, 127 diff --git a/sound/songs/se_m_swagger.s b/sound/songs/se_m_swagger.s index 9b4b5756bc48..e673444ee47f 100644 --- a/sound/songs/se_m_swagger.s +++ b/sound/songs/se_m_swagger.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_swagger_grp, voicegroup128 + .equ se_m_swagger_grp, voicegroup_rs_sfx_2 .equ se_m_swagger_pri, 4 .equ se_m_swagger_rev, reverb_set+50 .equ se_m_swagger_mvl, 127 diff --git a/sound/songs/se_m_swagger2.s b/sound/songs/se_m_swagger2.s index 0a0d7676741e..9e799ec333ef 100644 --- a/sound/songs/se_m_swagger2.s +++ b/sound/songs/se_m_swagger2.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_swagger2_grp, voicegroup128 + .equ se_m_swagger2_grp, voicegroup_rs_sfx_2 .equ se_m_swagger2_pri, 4 .equ se_m_swagger2_rev, reverb_set+50 .equ se_m_swagger2_mvl, 127 diff --git a/sound/songs/se_m_sweet_scent.s b/sound/songs/se_m_sweet_scent.s index 3b9bd527c86a..1099ba3c0fc6 100644 --- a/sound/songs/se_m_sweet_scent.s +++ b/sound/songs/se_m_sweet_scent.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_sweet_scent_grp, voicegroup128 + .equ se_m_sweet_scent_grp, voicegroup_rs_sfx_2 .equ se_m_sweet_scent_pri, 4 .equ se_m_sweet_scent_rev, reverb_set+50 .equ se_m_sweet_scent_mvl, 127 diff --git a/sound/songs/se_m_swift.s b/sound/songs/se_m_swift.s index c87cbea41989..2c01cfcf48d6 100644 --- a/sound/songs/se_m_swift.s +++ b/sound/songs/se_m_swift.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_swift_grp, voicegroup128 + .equ se_m_swift_grp, voicegroup_rs_sfx_2 .equ se_m_swift_pri, 4 .equ se_m_swift_rev, reverb_set+50 .equ se_m_swift_mvl, 127 diff --git a/sound/songs/se_m_teeter_dance.s b/sound/songs/se_m_teeter_dance.s index 8238afeb2784..04a1e61e037a 100644 --- a/sound/songs/se_m_teeter_dance.s +++ b/sound/songs/se_m_teeter_dance.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_teeter_dance_grp, voicegroup128 + .equ se_m_teeter_dance_grp, voicegroup_rs_sfx_2 .equ se_m_teeter_dance_pri, 4 .equ se_m_teeter_dance_rev, reverb_set+50 .equ se_m_teeter_dance_mvl, 127 diff --git a/sound/songs/se_m_teleport.s b/sound/songs/se_m_teleport.s index 60f7945d7bb0..8a4f676ba543 100644 --- a/sound/songs/se_m_teleport.s +++ b/sound/songs/se_m_teleport.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_teleport_grp, voicegroup128 + .equ se_m_teleport_grp, voicegroup_rs_sfx_2 .equ se_m_teleport_pri, 4 .equ se_m_teleport_rev, reverb_set+50 .equ se_m_teleport_mvl, 127 diff --git a/sound/songs/se_m_thunder_wave.s b/sound/songs/se_m_thunder_wave.s index a0b06cb5deb5..6d0a585e3f46 100644 --- a/sound/songs/se_m_thunder_wave.s +++ b/sound/songs/se_m_thunder_wave.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_thunder_wave_grp, voicegroup128 + .equ se_m_thunder_wave_grp, voicegroup_rs_sfx_2 .equ se_m_thunder_wave_pri, 4 .equ se_m_thunder_wave_rev, reverb_set+50 .equ se_m_thunder_wave_mvl, 127 diff --git a/sound/songs/se_m_thunderbolt.s b/sound/songs/se_m_thunderbolt.s index 3b3790313168..7b1868fbe6b5 100644 --- a/sound/songs/se_m_thunderbolt.s +++ b/sound/songs/se_m_thunderbolt.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_thunderbolt_grp, voicegroup128 + .equ se_m_thunderbolt_grp, voicegroup_rs_sfx_2 .equ se_m_thunderbolt_pri, 4 .equ se_m_thunderbolt_rev, reverb_set+50 .equ se_m_thunderbolt_mvl, 127 diff --git a/sound/songs/se_m_thunderbolt2.s b/sound/songs/se_m_thunderbolt2.s index 5068203958b5..9725b58f5252 100644 --- a/sound/songs/se_m_thunderbolt2.s +++ b/sound/songs/se_m_thunderbolt2.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_thunderbolt2_grp, voicegroup128 + .equ se_m_thunderbolt2_grp, voicegroup_rs_sfx_2 .equ se_m_thunderbolt2_pri, 4 .equ se_m_thunderbolt2_rev, reverb_set+50 .equ se_m_thunderbolt2_mvl, 127 diff --git a/sound/songs/se_m_toxic.s b/sound/songs/se_m_toxic.s index ae460ad7735c..3008bc0312f9 100644 --- a/sound/songs/se_m_toxic.s +++ b/sound/songs/se_m_toxic.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_toxic_grp, voicegroup128 + .equ se_m_toxic_grp, voicegroup_rs_sfx_2 .equ se_m_toxic_pri, 4 .equ se_m_toxic_rev, reverb_set+50 .equ se_m_toxic_mvl, 127 diff --git a/sound/songs/se_m_tri_attack.s b/sound/songs/se_m_tri_attack.s index 13947e6f1a59..2a0bd1d4ffe4 100644 --- a/sound/songs/se_m_tri_attack.s +++ b/sound/songs/se_m_tri_attack.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_tri_attack_grp, voicegroup128 + .equ se_m_tri_attack_grp, voicegroup_rs_sfx_2 .equ se_m_tri_attack_pri, 4 .equ se_m_tri_attack_rev, reverb_set+50 .equ se_m_tri_attack_mvl, 127 diff --git a/sound/songs/se_m_tri_attack2.s b/sound/songs/se_m_tri_attack2.s index 61f11c39677d..a54ee3df0e7d 100644 --- a/sound/songs/se_m_tri_attack2.s +++ b/sound/songs/se_m_tri_attack2.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_tri_attack2_grp, voicegroup128 + .equ se_m_tri_attack2_grp, voicegroup_rs_sfx_2 .equ se_m_tri_attack2_pri, 4 .equ se_m_tri_attack2_rev, reverb_set+50 .equ se_m_tri_attack2_mvl, 127 diff --git a/sound/songs/se_m_twister.s b/sound/songs/se_m_twister.s index bbb4f1ec0381..a739c89c4fdd 100644 --- a/sound/songs/se_m_twister.s +++ b/sound/songs/se_m_twister.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_twister_grp, voicegroup128 + .equ se_m_twister_grp, voicegroup_rs_sfx_2 .equ se_m_twister_pri, 4 .equ se_m_twister_rev, reverb_set+50 .equ se_m_twister_mvl, 127 diff --git a/sound/songs/se_m_uproar.s b/sound/songs/se_m_uproar.s index c60cccee4e02..2bf7804d522e 100644 --- a/sound/songs/se_m_uproar.s +++ b/sound/songs/se_m_uproar.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_uproar_grp, voicegroup128 + .equ se_m_uproar_grp, voicegroup_rs_sfx_2 .equ se_m_uproar_pri, 4 .equ se_m_uproar_rev, reverb_set+50 .equ se_m_uproar_mvl, 127 diff --git a/sound/songs/se_m_vital_throw.s b/sound/songs/se_m_vital_throw.s index 3e04b43e5b28..aebda904f21b 100644 --- a/sound/songs/se_m_vital_throw.s +++ b/sound/songs/se_m_vital_throw.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_vital_throw_grp, voicegroup128 + .equ se_m_vital_throw_grp, voicegroup_rs_sfx_2 .equ se_m_vital_throw_pri, 4 .equ se_m_vital_throw_rev, reverb_set+50 .equ se_m_vital_throw_mvl, 127 diff --git a/sound/songs/se_m_vital_throw2.s b/sound/songs/se_m_vital_throw2.s index 0d1e64ecb5c7..34a758c6e2e3 100644 --- a/sound/songs/se_m_vital_throw2.s +++ b/sound/songs/se_m_vital_throw2.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_vital_throw2_grp, voicegroup128 + .equ se_m_vital_throw2_grp, voicegroup_rs_sfx_2 .equ se_m_vital_throw2_pri, 4 .equ se_m_vital_throw2_rev, reverb_set+50 .equ se_m_vital_throw2_mvl, 127 diff --git a/sound/songs/se_m_waterfall.s b/sound/songs/se_m_waterfall.s index 9e16b9ee760c..ad91010e7129 100644 --- a/sound/songs/se_m_waterfall.s +++ b/sound/songs/se_m_waterfall.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_waterfall_grp, voicegroup128 + .equ se_m_waterfall_grp, voicegroup_rs_sfx_2 .equ se_m_waterfall_pri, 4 .equ se_m_waterfall_rev, reverb_set+50 .equ se_m_waterfall_mvl, 127 diff --git a/sound/songs/se_m_whirlpool.s b/sound/songs/se_m_whirlpool.s index bf0b9cc7224a..67563395cc49 100644 --- a/sound/songs/se_m_whirlpool.s +++ b/sound/songs/se_m_whirlpool.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_whirlpool_grp, voicegroup128 + .equ se_m_whirlpool_grp, voicegroup_rs_sfx_2 .equ se_m_whirlpool_pri, 4 .equ se_m_whirlpool_rev, reverb_set+50 .equ se_m_whirlpool_mvl, 127 diff --git a/sound/songs/se_m_yawn.s b/sound/songs/se_m_yawn.s index c6af1f3610ca..fdd6012a2273 100644 --- a/sound/songs/se_m_yawn.s +++ b/sound/songs/se_m_yawn.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_m_yawn_grp, voicegroup128 + .equ se_m_yawn_grp, voicegroup_rs_sfx_2 .equ se_m_yawn_pri, 4 .equ se_m_yawn_rev, reverb_set+50 .equ se_m_yawn_mvl, 127 diff --git a/sound/songs/se_wall_hit.s b/sound/songs/se_wall_hit.s index feeeb03b1dbe..385da0373978 100644 --- a/sound/songs/se_wall_hit.s +++ b/sound/songs/se_wall_hit.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_wall_hit_grp, voicegroup127 + .equ se_wall_hit_grp, voicegroup_rs_sfx_1 .equ se_wall_hit_pri, 2 .equ se_wall_hit_rev, reverb_set+50 .equ se_wall_hit_mvl, 127 diff --git a/sound/songs/se_win_open.s b/sound/songs/se_win_open.s index b5d582a8d913..07fb4fadd4c7 100644 --- a/sound/songs/se_win_open.s +++ b/sound/songs/se_win_open.s @@ -1,6 +1,6 @@ .include "MPlayDef.s" - .equ se_win_open_grp, voicegroup127 + .equ se_win_open_grp, voicegroup_rs_sfx_1 .equ se_win_open_pri, 5 .equ se_win_open_rev, reverb_set+50 .equ se_win_open_mvl, 127 diff --git a/sound/voice_groups.inc b/sound/voice_groups.inc index 8ee57619b610..eabcc5c752e6 100644 --- a/sound/voice_groups.inc +++ b/sound/voice_groups.inc @@ -1,192 +1,203 @@ -.include "sound/voicegroups/voicegroup000.inc" -.include "sound/voicegroups/voicegroup001.inc" -.include "sound/voicegroups/voicegroup002.inc" -.include "sound/voicegroups/voicegroup003.inc" -.include "sound/voicegroups/voicegroup004.inc" -.include "sound/voicegroups/voicegroup005.inc" -.include "sound/voicegroups/voicegroup006.inc" -.include "sound/voicegroups/voicegroup007.inc" -.include "sound/voicegroups/voicegroup008.inc" -.include "sound/voicegroups/voicegroup009.inc" -.include "sound/voicegroups/voicegroup010.inc" -.include "sound/voicegroups/voicegroup011.inc" -.include "sound/voicegroups/voicegroup012.inc" -.include "sound/voicegroups/voicegroup013.inc" -.include "sound/voicegroups/voicegroup014.inc" -.include "sound/voicegroups/voicegroup015.inc" -.include "sound/voicegroups/voicegroup016.inc" -.include "sound/voicegroups/voicegroup017.inc" -.include "sound/voicegroups/voicegroup018.inc" -.include "sound/voicegroups/voicegroup019.inc" -.include "sound/voicegroups/voicegroup020.inc" -.include "sound/voicegroups/voicegroup021.inc" -.include "sound/voicegroups/voicegroup022.inc" -.include "sound/voicegroups/voicegroup023.inc" -.include "sound/voicegroups/voicegroup024.inc" -.include "sound/voicegroups/voicegroup025.inc" -.include "sound/voicegroups/voicegroup026.inc" -.include "sound/voicegroups/voicegroup027.inc" -.include "sound/voicegroups/voicegroup028.inc" -.include "sound/voicegroups/voicegroup029.inc" -.include "sound/voicegroups/voicegroup030.inc" -.include "sound/voicegroups/voicegroup031.inc" -.include "sound/voicegroups/voicegroup032.inc" -.include "sound/voicegroups/voicegroup033.inc" -.include "sound/voicegroups/voicegroup034.inc" -.include "sound/voicegroups/voicegroup035.inc" -.include "sound/voicegroups/voicegroup036.inc" -.include "sound/voicegroups/voicegroup037.inc" -.include "sound/voicegroups/voicegroup038.inc" -.include "sound/voicegroups/voicegroup039.inc" -.include "sound/voicegroups/voicegroup040.inc" -.include "sound/voicegroups/voicegroup041.inc" -.include "sound/voicegroups/voicegroup042.inc" -.include "sound/voicegroups/voicegroup043.inc" -.include "sound/voicegroups/voicegroup044.inc" -.include "sound/voicegroups/voicegroup045.inc" -.include "sound/voicegroups/voicegroup046.inc" -.include "sound/voicegroups/voicegroup047.inc" -.include "sound/voicegroups/voicegroup048.inc" -.include "sound/voicegroups/voicegroup049.inc" -.include "sound/voicegroups/voicegroup050.inc" -.include "sound/voicegroups/voicegroup051.inc" -.include "sound/voicegroups/voicegroup052.inc" -.include "sound/voicegroups/voicegroup053.inc" -.include "sound/voicegroups/voicegroup054.inc" -.include "sound/voicegroups/voicegroup055.inc" -.include "sound/voicegroups/voicegroup056.inc" -.include "sound/voicegroups/voicegroup057.inc" -.include "sound/voicegroups/voicegroup058.inc" -.include "sound/voicegroups/voicegroup059.inc" -.include "sound/voicegroups/voicegroup060.inc" -.include "sound/voicegroups/voicegroup061.inc" -.include "sound/voicegroups/voicegroup062.inc" -.include "sound/voicegroups/voicegroup063.inc" -.include "sound/voicegroups/voicegroup064.inc" -.include "sound/voicegroups/voicegroup065.inc" -.include "sound/voicegroups/voicegroup066.inc" -.include "sound/voicegroups/voicegroup067.inc" -.include "sound/voicegroups/voicegroup068.inc" -.include "sound/voicegroups/voicegroup069.inc" -.include "sound/voicegroups/voicegroup070.inc" -.include "sound/voicegroups/voicegroup071.inc" -.include "sound/voicegroups/voicegroup072.inc" -.include "sound/voicegroups/voicegroup073.inc" -.include "sound/voicegroups/voicegroup074.inc" -.include "sound/voicegroups/voicegroup075.inc" -.include "sound/voicegroups/voicegroup076.inc" -.include "sound/voicegroups/voicegroup077.inc" -.include "sound/voicegroups/voicegroup078.inc" -.include "sound/voicegroups/voicegroup079.inc" -.include "sound/voicegroups/voicegroup080.inc" -.include "sound/voicegroups/voicegroup081.inc" -.include "sound/voicegroups/voicegroup082.inc" -.include "sound/voicegroups/voicegroup083.inc" -.include "sound/voicegroups/voicegroup084.inc" -.include "sound/voicegroups/voicegroup085.inc" -.include "sound/voicegroups/voicegroup086.inc" -.include "sound/voicegroups/voicegroup087.inc" -.include "sound/voicegroups/voicegroup088.inc" -.include "sound/voicegroups/voicegroup089.inc" -.include "sound/voicegroups/voicegroup090.inc" -.include "sound/voicegroups/voicegroup091.inc" -.include "sound/voicegroups/voicegroup092.inc" -.include "sound/voicegroups/voicegroup093.inc" -.include "sound/voicegroups/voicegroup094.inc" -.include "sound/voicegroups/voicegroup095.inc" -.include "sound/voicegroups/voicegroup096.inc" -.include "sound/voicegroups/voicegroup097.inc" -.include "sound/voicegroups/voicegroup098.inc" -.include "sound/voicegroups/voicegroup099.inc" -.include "sound/voicegroups/voicegroup100.inc" -.include "sound/voicegroups/voicegroup101.inc" -.include "sound/voicegroups/voicegroup102.inc" -.include "sound/voicegroups/voicegroup103.inc" -.include "sound/voicegroups/voicegroup104.inc" -.include "sound/voicegroups/voicegroup105.inc" -.include "sound/voicegroups/voicegroup106.inc" -.include "sound/voicegroups/voicegroup107.inc" -.include "sound/voicegroups/voicegroup108.inc" -.include "sound/voicegroups/voicegroup109.inc" -.include "sound/voicegroups/voicegroup110.inc" -.include "sound/voicegroups/voicegroup111.inc" -.include "sound/voicegroups/voicegroup112.inc" -.include "sound/voicegroups/voicegroup113.inc" -.include "sound/voicegroups/voicegroup114.inc" -.include "sound/voicegroups/voicegroup115.inc" -.include "sound/voicegroups/voicegroup116.inc" -.include "sound/voicegroups/voicegroup117.inc" -.include "sound/voicegroups/voicegroup118.inc" -.include "sound/voicegroups/voicegroup119.inc" -.include "sound/voicegroups/voicegroup120.inc" -.include "sound/voicegroups/voicegroup121.inc" -.include "sound/voicegroups/voicegroup122.inc" -.include "sound/voicegroups/voicegroup123.inc" -.include "sound/voicegroups/voicegroup124.inc" -.include "sound/voicegroups/voicegroup125.inc" -.include "sound/voicegroups/voicegroup126.inc" -.include "sound/voicegroups/voicegroup127.inc" -.include "sound/voicegroups/voicegroup128.inc" +.include "sound/voicegroups/dummy.inc" + +@ drumsets +.include "sound/voicegroups/drumsets/rs.inc" +.include "sound/voicegroups/drumsets/frlg.inc" +.include "sound/voicegroups/drumsets/emerald_1.inc" +.include "sound/voicegroups/drumsets/emerald_2.inc" + +@ key splits +.include "sound/voicegroups/keysplits/piano.inc" +.include "sound/voicegroups/keysplits/strings.inc" +.include "sound/voicegroups/keysplits/trumpet.inc" +.include "sound/voicegroups/unused.inc" +.include "sound/voicegroups/keysplits/tuba.inc" +.include "sound/voicegroups/keysplits/french_horn.inc" + +.include "sound/voicegroups/route110.inc" +.include "sound/voicegroups/route101.inc" +.include "sound/voicegroups/fanfare.inc" +.include "sound/voicegroups/gym.inc" +.include "sound/voicegroups/route120.inc" +.include "sound/voicegroups/petalburg.inc" +.include "sound/voicegroups/drumsets/petalburg.inc" +.include "sound/voicegroups/surf.inc" +.include "sound/voicegroups/petalburg_woods.inc" +.include "sound/voicegroups/oldale.inc" +.include "sound/voicegroups/lilycove_museum.inc" +.include "sound/voicegroups/route122.inc" +.include "sound/voicegroups/drumsets/route101.inc" +.include "sound/voicegroups/oceanic_museum.inc" +.include "sound/voicegroups/victory_gym_leader.inc" +.include "sound/voicegroups/victory_wild.inc" +.include "sound/voicegroups/evolution.inc" +.include "sound/voicegroups/encounter_girl.inc" +.include "sound/voicegroups/encounter_male.inc" +.include "sound/voicegroups/victory_league.inc" +.include "sound/voicegroups/abandoned_ship.inc" +.include "sound/voicegroups/drumsets/route110.inc" +.include "sound/voicegroups/fortree.inc" +.include "sound/voicegroups/birch_lab.inc" +.include "sound/voicegroups/littleroot_test.inc" +.include "sound/voicegroups/b_tower_rs.inc" +.include "sound/voicegroups/encounter_swimmer.inc" +.include "sound/voicegroups/cave_of_origin.inc" +.include "sound/voicegroups/roulette.inc" +.include "sound/voicegroups/link_contest_p1.inc" +.include "sound/voicegroups/link_contest_p2.inc" +.include "sound/voicegroups/link_contest_p3.inc" +.include "sound/voicegroups/link_contest_p4.inc" +.include "sound/voicegroups/encounter_rich.inc" +.include "sound/voicegroups/verdanturf.inc" +.include "sound/voicegroups/rustboro.inc" +.include "sound/voicegroups/poke_center.inc" +.include "sound/voicegroups/route104.inc" +.include "sound/voicegroups/route119.inc" +.include "sound/voicegroups/cycling.inc" +.include "sound/voicegroups/poke_mart.inc" +.include "sound/voicegroups/littleroot.inc" +.include "sound/voicegroups/mt_chimney.inc" +.include "sound/voicegroups/encounter_female.inc" +.include "sound/voicegroups/lilycove.inc" +.include "sound/voicegroups/route111.inc" +.include "sound/voicegroups/help.inc" +.include "sound/voicegroups/underwater.inc" +.include "sound/voicegroups/victory_trainer.inc" +.include "sound/voicegroups/title.inc" +.include "sound/voicegroups/intro.inc" +.include "sound/voicegroups/encounter_may.inc" +.include "sound/voicegroups/encounter_intense.inc" +.include "sound/voicegroups/encounter_cool.inc" +.include "sound/voicegroups/route113.inc" +.include "sound/voicegroups/encounter_aqua.inc" +.include "sound/voicegroups/follow_me.inc" +.include "sound/voicegroups/encounter_brendan.inc" +.include "sound/voicegroups/ever_grande.inc" +.include "sound/voicegroups/encounter_suspicious.inc" +.include "sound/voicegroups/victory_aqua_magma.inc" +.include "sound/voicegroups/cable_car.inc" +.include "sound/voicegroups/game_corner.inc" +.include "sound/voicegroups/dewford.inc" +.include "sound/voicegroups/safari_zone.inc" +.include "sound/voicegroups/victory_road.inc" +.include "sound/voicegroups/aqua_magma_hideout.inc" +.include "sound/voicegroups/sailing.inc" +.include "sound/voicegroups/mt_pyre.inc" +.include "sound/voicegroups/slateport.inc" +.include "sound/voicegroups/mt_pyre_exterior.inc" +.include "sound/voicegroups/school.inc" +.include "sound/voicegroups/hall_of_fame.inc" +.include "sound/voicegroups/fallarbor.inc" +.include "sound/voicegroups/sealed_chamber.inc" +.include "sound/voicegroups/contest_winner.inc" +.include "sound/voicegroups/contest.inc" +.include "sound/voicegroups/encounter_magma.inc" +.include "sound/voicegroups/intro_battle.inc" +.include "sound/voicegroups/abnormal_weather.inc" +.include "sound/voicegroups/weather_groudon.inc" +.include "sound/voicegroups/sootopolis.inc" +.include "sound/voicegroups/contest_results.inc" +.include "sound/voicegroups/hall_of_fame_room.inc" +.include "sound/voicegroups/trick_house.inc" +.include "sound/voicegroups/encounter_twins.inc" +.include "sound/voicegroups/encounter_elite_four.inc" +.include "sound/voicegroups/encounter_hiker.inc" +.include "sound/voicegroups/contest_lobby.inc" +.include "sound/voicegroups/encounter_interviewer.inc" +.include "sound/voicegroups/encounter_champion.inc" +.include "sound/voicegroups/credits.inc" +.include "sound/voicegroups/end.inc" +.include "sound/voicegroups/b_frontier.inc" +.include "sound/voicegroups/b_arena.inc" +.include "sound/voicegroups/register_match_call.inc" +.include "sound/voicegroups/b_pyramid.inc" +.include "sound/voicegroups/b_pyramid_top.inc" +.include "sound/voicegroups/b_palace.inc" +.include "sound/voicegroups/rayquaza_appears.inc" +.include "sound/voicegroups/b_tower.inc" +.include "sound/voicegroups/b_dome.inc" +.include "sound/voicegroups/b_pike.inc" +.include "sound/voicegroups/b_factory.inc" +.include "sound/voicegroups/vs_rayquaza.inc" +.include "sound/voicegroups/vs_frontier_brain.inc" +.include "sound/voicegroups/vs_mew.inc" +.include "sound/voicegroups/vs_wild.inc" +.include "sound/voicegroups/vs_aqua_magma.inc" +.include "sound/voicegroups/vs_trainer.inc" +.include "sound/voicegroups/vs_gym_leader.inc" +.include "sound/voicegroups/vs_champion.inc" +.include "sound/voicegroups/vs_regi.inc" +.include "sound/voicegroups/vs_kyogre_groudon.inc" @ duplicate of vs_rayquaza +.include "sound/voicegroups/vs_rival.inc" +.include "sound/voicegroups/vs_elite_four.inc" +.include "sound/voicegroups/vs_aqua_magma_leader.inc" +.include "sound/voicegroups/rs_sfx_1.inc" +.include "sound/voicegroups/rs_sfx_2.inc" .include "sound/cry_tables.inc" -.include "sound/voicegroups/voicegroup129.inc" -.include "sound/voicegroups/voicegroup130.inc" -.include "sound/voicegroups/voicegroup131.inc" -.include "sound/voicegroups/voicegroup132.inc" -.include "sound/voicegroups/voicegroup133.inc" -.include "sound/voicegroups/voicegroup134.inc" -.include "sound/voicegroups/voicegroup135.inc" -.include "sound/voicegroups/voicegroup136.inc" -.include "sound/voicegroups/voicegroup137.inc" -.include "sound/voicegroups/voicegroup138.inc" -.include "sound/voicegroups/voicegroup139.inc" -.include "sound/voicegroups/voicegroup140.inc" -.include "sound/voicegroups/voicegroup141.inc" -.include "sound/voicegroups/voicegroup142.inc" -.include "sound/voicegroups/voicegroup143.inc" -.include "sound/voicegroups/voicegroup144.inc" -.include "sound/voicegroups/voicegroup145.inc" -.include "sound/voicegroups/voicegroup146.inc" -.include "sound/voicegroups/voicegroup147.inc" -.include "sound/voicegroups/voicegroup148.inc" -.include "sound/voicegroups/voicegroup149.inc" -.include "sound/voicegroups/voicegroup150.inc" -.include "sound/voicegroups/voicegroup151.inc" -.include "sound/voicegroups/voicegroup152.inc" -.include "sound/voicegroups/voicegroup153.inc" -.include "sound/voicegroups/voicegroup154.inc" -.include "sound/voicegroups/voicegroup155.inc" -.include "sound/voicegroups/voicegroup156.inc" -.include "sound/voicegroups/voicegroup157.inc" -.include "sound/voicegroups/voicegroup158.inc" -.include "sound/voicegroups/voicegroup159.inc" -.include "sound/voicegroups/voicegroup160.inc" -.include "sound/voicegroups/voicegroup161.inc" -.include "sound/voicegroups/voicegroup162.inc" -.include "sound/voicegroups/voicegroup163.inc" -.include "sound/voicegroups/voicegroup164.inc" -.include "sound/voicegroups/voicegroup165.inc" -.include "sound/voicegroups/voicegroup166.inc" -.include "sound/voicegroups/voicegroup167.inc" -.include "sound/voicegroups/voicegroup168.inc" -.include "sound/voicegroups/voicegroup169.inc" -.include "sound/voicegroups/voicegroup170.inc" -.include "sound/voicegroups/voicegroup171.inc" -.include "sound/voicegroups/voicegroup172.inc" -.include "sound/voicegroups/voicegroup173.inc" -.include "sound/voicegroups/voicegroup174.inc" -.include "sound/voicegroups/voicegroup175.inc" -.include "sound/voicegroups/voicegroup176.inc" -.include "sound/voicegroups/voicegroup177.inc" -.include "sound/voicegroups/voicegroup178.inc" -.include "sound/voicegroups/voicegroup179.inc" -.include "sound/voicegroups/voicegroup180.inc" -.include "sound/voicegroups/voicegroup181.inc" -.include "sound/voicegroups/voicegroup182.inc" -.include "sound/voicegroups/voicegroup183.inc" -.include "sound/voicegroups/voicegroup184.inc" -.include "sound/voicegroups/voicegroup185.inc" -.include "sound/voicegroups/voicegroup186.inc" -.include "sound/voicegroups/voicegroup187.inc" -.include "sound/voicegroups/voicegroup188.inc" -.include "sound/voicegroups/voicegroup189.inc" -.include "sound/voicegroups/voicegroup190.inc" +.include "sound/voicegroups/frlg_sfx.inc" +.include "sound/voicegroups/bard.inc" +.include "sound/voicegroups/unused_2.inc" @ used by unused GSC radio tower takeover test track in RS + +@ FRLG +.include "sound/voicegroups/rg_follow_me.inc" +.include "sound/voicegroups/rg_game_corner.inc" +.include "sound/voicegroups/rg_rocket_hideout.inc" +.include "sound/voicegroups/rg_gym.inc" +.include "sound/voicegroups/rg_jigglypuff.inc" +.include "sound/voicegroups/rg_intro_fight.inc" +.include "sound/voicegroups/rg_title.inc" +.include "sound/voicegroups/rg_cinnabar.inc" +.include "sound/voicegroups/rg_lavender.inc" +.include "sound/voicegroups/rg_heal.inc" +.include "sound/voicegroups/rg_cycling.inc" +.include "sound/voicegroups/rg_encounter_rocket.inc" +.include "sound/voicegroups/rg_encounter_girl.inc" +.include "sound/voicegroups/rg_encounter_boy.inc" +.include "sound/voicegroups/rg_hall_of_fame.inc" +.include "sound/voicegroups/rg_viridian_forest.inc" +.include "sound/voicegroups/rg_mt_moon.inc" +.include "sound/voicegroups/rg_poke_mansion.inc" +.include "sound/voicegroups/rg_credits.inc" +.include "sound/voicegroups/rg_route1.inc" +.include "sound/voicegroups/rg_route24.inc" +.include "sound/voicegroups/rg_route3.inc" +.include "sound/voicegroups/rg_route11.inc" +.include "sound/voicegroups/rg_victory_road.inc" +.include "sound/voicegroups/rg_vs_gym_leader.inc" +.include "sound/voicegroups/rg_vs_trainer.inc" +.include "sound/voicegroups/rg_vs_wild.inc" +.include "sound/voicegroups/rg_vs_champion.inc" +.include "sound/voicegroups/rg_pallet.inc" +.include "sound/voicegroups/rg_oak_lab.inc" +.include "sound/voicegroups/rg_oak.inc" +.include "sound/voicegroups/rg_poke_center.inc" +.include "sound/voicegroups/rg_ss_anne.inc" +.include "sound/voicegroups/rg_surf.inc" +.include "sound/voicegroups/rg_poke_tower.inc" +.include "sound/voicegroups/rg_silph.inc" +.include "sound/voicegroups/rg_fuchsia.inc" +.include "sound/voicegroups/rg_celadon.inc" +.include "sound/voicegroups/rg_victory_trainer.inc" +.include "sound/voicegroups/rg_victory_wild.inc" +.include "sound/voicegroups/rg_victory_gym_leader.inc" +.include "sound/voicegroups/rg_vermillion.inc" +.include "sound/voicegroups/rg_pewter.inc" +.include "sound/voicegroups/rg_encounter_rival.inc" +.include "sound/voicegroups/rg_unused.inc" +.include "sound/voicegroups/rg_unused_2.inc" +.include "sound/voicegroups/rg_dex_rating.inc" +.include "sound/voicegroups/drumsets/frlg_fanfare_2.inc" +.include "sound/voicegroups/drumsets/frlg_fanfare_1.inc" +.include "sound/voicegroups/rg_obtain_key_item.inc" +.include "sound/voicegroups/rg_caught_intro.inc" +.include "sound/voicegroups/rg_photo.inc" +.include "sound/voicegroups/rg_game_freak.inc" +.include "sound/voicegroups/rg_new_game.inc" +.include "sound/voicegroups/rg_mystery_gift.inc" +.include "sound/voicegroups/rg_encounter_deoxys.inc" +.include "sound/voicegroups/rg_vs_deoxys.inc" +.include "sound/voicegroups/rg_teachy_tv_menu.inc" +.include "sound/voicegroups/rg_sevii_route.inc" +.include "sound/voicegroups/rg_sevii_45.inc" +.include "sound/voicegroups/rg_sevii_67.inc" +.include "sound/voicegroups/drumsets/rg_credits.inc" diff --git a/sound/voicegroups/abandoned_ship.inc b/sound/voicegroups/abandoned_ship.inc new file mode 100644 index 000000000000..dd4ab482fd6a --- /dev/null +++ b/sound/voicegroups/abandoned_ship.inc @@ -0,0 +1,97 @@ +voice_group abandoned_ship + voice_keysplit_all voicegroup_route110_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 2, 4, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 2, 4, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 37, 165, 180, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_trinity_big_boned, 255, 165, 154, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + diff --git a/sound/voicegroups/abnormal_weather.inc b/sound/voicegroups/abnormal_weather.inc new file mode 100644 index 000000000000..36547c4957f4 --- /dev/null +++ b/sound/voicegroups/abnormal_weather.inc @@ -0,0 +1,131 @@ + +voice_group abnormal_weather + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 3 + voice_square_2_alt 60, 0, 2, 0, 2, 4, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/aqua_magma_hideout.inc b/sound/voicegroups/aqua_magma_hideout.inc new file mode 100644 index 000000000000..5790be7e963f --- /dev/null +++ b/sound/voicegroups/aqua_magma_hideout.inc @@ -0,0 +1,130 @@ +voice_group aqua_magma_hideout + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/b_arena.inc b/sound/voicegroups/b_arena.inc new file mode 100644 index 000000000000..bb35ad718cd6 --- /dev/null +++ b/sound/voicegroups/b_arena.inc @@ -0,0 +1,110 @@ +voice_group b_arena + voice_keysplit_all voicegroup_emerald_drumset_1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_unknown_koto_high, 255, 0, 206, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_shakuhachi, 255, 0, 255, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 2, 0, 12, 5 + voice_square_2_alt 60, 0, 0, 0, 0, 10, 4 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 1, 2, 0, 12, 5 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_unknown_koto_low, 255, 0, 206, 242 + diff --git a/sound/voicegroups/b_dome.inc b/sound/voicegroups/b_dome.inc new file mode 100644 index 000000000000..e54ec9d99ca8 --- /dev/null +++ b/sound/voicegroups/b_dome.inc @@ -0,0 +1,130 @@ +voice_group b_dome + voice_keysplit_all voicegroup_frlg_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 226 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 195 + voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 195 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 195 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 2, 6, 1 + diff --git a/sound/voicegroups/b_factory.inc b/sound/voicegroups/b_factory.inc new file mode 100644 index 000000000000..329741050dfb --- /dev/null +++ b/sound/voicegroups/b_factory.inc @@ -0,0 +1,130 @@ +voice_group b_factory + voice_keysplit_all voicegroup_frlg_drumset + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_23, 0, 7, 15, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_25, 0, 7, 15, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_24, 0, 7, 15, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_21, 0, 7, 15, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_22, 0, 7, 15, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_9, 0, 7, 15, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_10, 0, 7, 15, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_11, 0, 7, 15, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_12, 0, 7, 15, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_13, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 195 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 7, 7, 0 + voice_square_2_alt 60, 0, 2, 0, 7, 7, 0 + voice_square_2_alt 60, 0, 1, 0, 7, 7, 0 + voice_square_2_alt 60, 0, 0, 0, 7, 7, 0 + voice_square_2_alt 60, 0, 3, 0, 7, 7, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 7, 7, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 7, 7, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 7, 7, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 2, 6, 1 + diff --git a/sound/voicegroups/b_frontier.inc b/sound/voicegroups/b_frontier.inc new file mode 100644 index 000000000000..bcdcfded3d35 --- /dev/null +++ b/sound/voicegroups/b_frontier.inc @@ -0,0 +1,130 @@ +voice_group b_frontier + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit_all voicegroup_frlg_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 239 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 1, 1, 6, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 1, 0, 0, 10, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 1 + diff --git a/sound/voicegroups/b_palace.inc b/sound/voicegroups/b_palace.inc new file mode 100644 index 000000000000..1e0db2616de5 --- /dev/null +++ b/sound/voicegroups/b_palace.inc @@ -0,0 +1,130 @@ +voice_group b_palace + voice_keysplit_all voicegroup_emerald_drumset_2 + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_heart_of_asia_gamelan, 255, 188, 139, 239 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 13, 4 + voice_square_2_alt 60, 0, 0, 0, 0, 9, 2 + voice_square_2_alt 60, 0, 1, 0, 0, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_4, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/b_pike.inc b/sound/voicegroups/b_pike.inc new file mode 100644 index 000000000000..deb900a599bf --- /dev/null +++ b/sound/voicegroups/b_pike.inc @@ -0,0 +1,130 @@ +voice_group b_pike + voice_keysplit_all voicegroup_emerald_drumset_1 + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_21, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 128, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 128, 165, 128, 188 + voice_directsound 60, 0, DirectSoundWaveData_unknown_female_voice, 128, 165, 128, 204 + voice_directsound 60, 0, DirectSoundWaveData_unused_unknown_male_voice, 128, 165, 128, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 0, 7, 0 + voice_square_2_alt 60, 0, 1, 0, 0, 6, 0 + voice_square_2_alt 60, 0, 3, 0, 0, 6, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 7, 10, 1 + voice_noise_alt 60, 0, 0, 0, 2, 6, 1 + diff --git a/sound/voicegroups/b_pyramid.inc b/sound/voicegroups/b_pyramid.inc new file mode 100644 index 000000000000..855088884f2f --- /dev/null +++ b/sound/voicegroups/b_pyramid.inc @@ -0,0 +1,130 @@ +voice_group b_pyramid + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 64, 38, 128, 226 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/b_pyramid_top.inc b/sound/voicegroups/b_pyramid_top.inc new file mode 100644 index 000000000000..95707f592095 --- /dev/null +++ b/sound/voicegroups/b_pyramid_top.inc @@ -0,0 +1,130 @@ +voice_group b_pyramid_top + voice_keysplit_all voicegroup_frlg_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/b_tower.inc b/sound/voicegroups/b_tower.inc new file mode 100644 index 000000000000..d8fd60920bc0 --- /dev/null +++ b/sound/voicegroups/b_tower.inc @@ -0,0 +1,130 @@ +voice_group b_tower + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 239 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 1, 1, 6, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 0, 10, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 1 + diff --git a/sound/voicegroups/b_tower_rs.inc b/sound/voicegroups/b_tower_rs.inc new file mode 100644 index 000000000000..777e1b3a7c3b --- /dev/null +++ b/sound/voicegroups/b_tower_rs.inc @@ -0,0 +1,87 @@ +voice_group b_tower_rs + voice_keysplit_all voicegroup_route110_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 1, 7, 1 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 1, 6, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2 + voice_square_1_alt 60, 0, 0, 3, 0, 1, 6, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 0, 6, 1 + diff --git a/sound/voicegroups/bard.inc b/sound/voicegroups/bard.inc new file mode 100644 index 000000000000..57ba0bfd1c42 --- /dev/null +++ b/sound/voicegroups/bard.inc @@ -0,0 +1,53 @@ +voice_group bard + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_1, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_2, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_3, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_4, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_5, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_6, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_7, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_8, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_9, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_10, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_11, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_12, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_13, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_14, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_15, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_16, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_17, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_18, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_19, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_20, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_21, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_22, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_23, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_24, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_25, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_26, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_27, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_28, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_29, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_30, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_31, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_32, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_33, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_34, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_35, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_36, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_37, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_38, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_39, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_40, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_41, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_42, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_43, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_44, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_45, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_46, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_47, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_48, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_49, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_50, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_Phoneme_51, 255, 0, 255, 0 + diff --git a/sound/voicegroups/birch_lab.inc b/sound/voicegroups/birch_lab.inc new file mode 100644 index 000000000000..2b10e4f1e228 --- /dev/null +++ b/sound/voicegroups/birch_lab.inc @@ -0,0 +1,85 @@ +voice_group birch_lab + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 + diff --git a/sound/voicegroups/cable_car.inc b/sound/voicegroups/cable_car.inc new file mode 100644 index 000000000000..85d324b02d82 --- /dev/null +++ b/sound/voicegroups/cable_car.inc @@ -0,0 +1,130 @@ +voice_group cable_car + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/cave_of_origin.inc b/sound/voicegroups/cave_of_origin.inc new file mode 100644 index 000000000000..36ded3d35f3c --- /dev/null +++ b/sound/voicegroups/cave_of_origin.inc @@ -0,0 +1,91 @@ +voice_group cave_of_origin + voice_keysplit_all voicegroup_route110_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 2, 4, 1 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 0, 0, 1, 7, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 7, 1 + voice_square_1_alt 60, 0, 0, 0, 0, 0, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2 + diff --git a/sound/voicegroups/contest.inc b/sound/voicegroups/contest.inc new file mode 100644 index 000000000000..24ff586dfc56 --- /dev/null +++ b/sound/voicegroups/contest.inc @@ -0,0 +1,130 @@ +voice_group contest + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 0 + voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/contest_lobby.inc b/sound/voicegroups/contest_lobby.inc new file mode 100644 index 000000000000..88b1402b393c --- /dev/null +++ b/sound/voicegroups/contest_lobby.inc @@ -0,0 +1,130 @@ +voice_group contest_lobby + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 0 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 7, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_unknown_10, 255, 255, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/contest_results.inc b/sound/voicegroups/contest_results.inc new file mode 100644 index 000000000000..ba4f70b9960e --- /dev/null +++ b/sound/voicegroups/contest_results.inc @@ -0,0 +1,130 @@ +voice_group contest_results + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 2, 0, 1, 4, 2 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 7, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/contest_winner.inc b/sound/voicegroups/contest_winner.inc new file mode 100644 index 000000000000..df323c002f8e --- /dev/null +++ b/sound/voicegroups/contest_winner.inc @@ -0,0 +1,130 @@ +voice_group contest_winner + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 1, 2, 4, 0 + voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 13, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/credits.inc b/sound/voicegroups/credits.inc new file mode 100644 index 000000000000..d05ac8025cc9 --- /dev/null +++ b/sound/voicegroups/credits.inc @@ -0,0 +1,112 @@ +voice_group credits + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 1, 5, 2, 4 + voice_square_2_alt 60, 0, 1, 1, 5, 2, 4 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 239 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 1, 2, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 1, 1, 1, 6, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 4, 6, 2 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 6, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 1, 1, 4, 6, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 0, 1, 2, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 0, 1, 1, 6, 1 + diff --git a/sound/voicegroups/cycling.inc b/sound/voicegroups/cycling.inc new file mode 100644 index 000000000000..a734c5fe603a --- /dev/null +++ b/sound/voicegroups/cycling.inc @@ -0,0 +1,130 @@ +voice_group cycling + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 1 + voice_square_2_alt 60, 0, 1, 1, 3, 4, 2 + voice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 1, 7, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 2, 4, 2 + voice_square_2_alt 60, 0, 1, 1, 3, 4, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 1, 4, 4, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/dewford.inc b/sound/voicegroups/dewford.inc new file mode 100644 index 000000000000..e0fc659a9bd3 --- /dev/null +++ b/sound/voicegroups/dewford.inc @@ -0,0 +1,130 @@ +voice_group dewford + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 1 + voice_square_2_alt 60, 0, 2, 0, 2, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 4, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/drumsets/emerald_1.inc b/sound/voicegroups/drumsets/emerald_1.inc new file mode 100644 index 000000000000..80a9957f86c6 --- /dev/null +++ b/sound/voicegroups/drumsets/emerald_1.inc @@ -0,0 +1,56 @@ +voice_group emerald_drumset_1, 36 + voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 180, 175, 228 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 0, 255, 242 + voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 + voice_directsound 64, 24, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 + voice_directsound_no_resample 64, 80, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 + voice_directsound 68, 34, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 + voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 + voice_directsound 72, 44, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 76, 84, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 + voice_directsound 80, 94, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 + voice_directsound_no_resample 33, 89, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 + voice_directsound 64, 104, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 235 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 63, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 + voice_directsound_no_resample 64, 24, DirectSoundWaveData_dance_drums_ride_bell, 255, 165, 103, 231 + voice_directsound_no_resample 66, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 + voice_directsound_no_resample 64, 14, DirectSoundWaveData_trinity_cymbal_crash, 255, 231, 0, 188 + voice_directsound_no_resample 64, 89, DirectSoundWaveData_sd90_cowbell, 255, 0, 255, 242 + voice_directsound_no_resample 64, 29, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 + voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216 + voice_directsound_no_resample 64, 94, DirectSoundWaveData_unused_heart_of_asia_indian_drum, 255, 0, 255, 0 + voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 + voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 + voice_directsound_no_resample 64, 90, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 61, 84, DirectSoundWaveData_ethnic_flavours_hyoushigi, 255, 0, 255, 0 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_ethnic_flavours_ohtsuzumi, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 + voice_directsound_no_resample 64, 79, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 + voice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 165, 103, 188 + voice_directsound_no_resample 64, 24, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 64, 104, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 + voice_directsound 63, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0 + voice_directsound 50, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 + voice_directsound 64, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 + diff --git a/sound/voicegroups/drumsets/emerald_2.inc b/sound/voicegroups/drumsets/emerald_2.inc new file mode 100644 index 000000000000..4ad57546e01c --- /dev/null +++ b/sound/voicegroups/drumsets/emerald_2.inc @@ -0,0 +1,56 @@ +voice_group emerald_drumset_2, 36 + voice_directsound 62, 64, DirectSoundWaveData_drum_and_percussion_kick, 255, 0, 255, 0 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 180, 175, 228 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 0, 255, 242 + voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 + voice_directsound 65, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 + voice_directsound 64, 24, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 + voice_directsound_no_resample 64, 80, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 + voice_directsound 68, 34, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 + voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 + voice_directsound 72, 44, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 76, 84, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 + voice_directsound 80, 94, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 + voice_directsound 56, 89, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 + voice_directsound 64, 104, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 235 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 63, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 + voice_directsound_no_resample 64, 24, DirectSoundWaveData_dance_drums_ride_bell, 255, 165, 103, 231 + voice_directsound_no_resample 66, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 + voice_directsound 64, 14, DirectSoundWaveData_trinity_cymbal_crash, 255, 231, 0, 188 + voice_directsound 64, 89, DirectSoundWaveData_sd90_cowbell, 255, 0, 255, 242 + voice_directsound 60, 29, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 58, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 + voice_directsound 62, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216 + voice_directsound 64, 94, DirectSoundWaveData_unused_heart_of_asia_indian_drum, 255, 0, 255, 0 + voice_directsound 64, 34, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 + voice_directsound 64, 34, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 + voice_directsound 64, 90, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 61, 84, DirectSoundWaveData_ethnic_flavours_hyoushigi, 255, 0, 255, 0 + voice_directsound 64, 64, DirectSoundWaveData_ethnic_flavours_ohtsuzumi, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 + voice_directsound 64, 79, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 + voice_directsound 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 165, 103, 188 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 64, 104, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 + voice_directsound 63, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0 + voice_directsound 50, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 + voice_directsound 64, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 + diff --git a/sound/voicegroups/drumsets/frlg.inc b/sound/voicegroups/drumsets/frlg.inc new file mode 100644 index 000000000000..c0a2e5972923 --- /dev/null +++ b/sound/voicegroups/drumsets/frlg.inc @@ -0,0 +1,56 @@ +voice_group frlg_drumset, 36 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_drum_and_percussion_kick, 255, 0, 255, 0 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 180, 175, 228 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 0, 255, 242 + voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 + voice_directsound 64, 24, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 + voice_directsound_no_resample 64, 80, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 + voice_directsound 68, 34, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 + voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 + voice_directsound 72, 44, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 + voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 + voice_directsound 76, 84, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 + voice_directsound 80, 94, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 + voice_directsound_no_resample 33, 89, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 + voice_directsound 84, 104, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 235 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 63, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 + voice_directsound_no_resample 64, 24, DirectSoundWaveData_dance_drums_ride_bell, 255, 165, 103, 231 + voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 + voice_directsound_no_resample 64, 14, DirectSoundWaveData_trinity_cymbal_crash, 255, 231, 0, 188 + voice_directsound_no_resample 64, 89, DirectSoundWaveData_sd90_cowbell, 255, 0, 255, 242 + voice_directsound_no_resample 64, 29, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 + voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216 + voice_directsound_no_resample 64, 94, DirectSoundWaveData_unused_heart_of_asia_indian_drum, 255, 0, 255, 0 + voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 + voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 + voice_directsound_no_resample 64, 90, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 + voice_directsound_no_resample 64, 79, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 + voice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 165, 103, 188 + voice_directsound_no_resample 64, 24, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 64, 104, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 + voice_directsound 63, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0 + voice_directsound 50, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 + voice_directsound 64, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 + diff --git a/sound/voicegroups/drumsets/frlg_fanfare_1.inc b/sound/voicegroups/drumsets/frlg_fanfare_1.inc new file mode 100644 index 000000000000..0ba197265c8c --- /dev/null +++ b/sound/voicegroups/drumsets/frlg_fanfare_1.inc @@ -0,0 +1,56 @@ +voice_group frlg_fanfare_drumset_1, 36 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_drum_and_percussion_kick, 255, 0, 255, 0 + voice_directsound_no_resample 67, 71, DirectSoundWaveData_sd90_solo_snare, 255, 180, 175, 228 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 0, 255, 242 + voice_directsound_no_resample 65, 0, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 + voice_directsound 64, 24, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 68, 29, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 + voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 + voice_directsound 72, 64, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 76, 39, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 + voice_directsound 80, 89, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 + voice_directsound_no_resample 33, 10, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 + voice_directsound 84, 104, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 235 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 63, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_dance_drums_ride_bell, 255, 165, 103, 231 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_trinity_cymbal_crash, 255, 231, 0, 188 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_cowbell, 255, 0, 255, 242 + voice_directsound_no_resample 64, 118, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_unused_heart_of_asia_indian_drum, 255, 0, 255, 0 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_open_triangle, 255, 165, 103, 188 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 + voice_directsound 63, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0 + voice_directsound 50, 64, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 + voice_directsound 64, 64, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 + diff --git a/sound/voicegroups/drumsets/frlg_fanfare_2.inc b/sound/voicegroups/drumsets/frlg_fanfare_2.inc new file mode 100644 index 000000000000..acc72aa3b7aa --- /dev/null +++ b/sound/voicegroups/drumsets/frlg_fanfare_2.inc @@ -0,0 +1,50 @@ +voice_group frlg_fanfare_drumset_2, 36 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0 + diff --git a/sound/voicegroups/drumsets/petalburg.inc b/sound/voicegroups/drumsets/petalburg.inc new file mode 100644 index 000000000000..4008b40f7b2a --- /dev/null +++ b/sound/voicegroups/drumsets/petalburg.inc @@ -0,0 +1,31 @@ +voice_group petalburg_drumset, 36 + voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_kick, 255, 0, 255, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 32, 74, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 72, 66, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 72, 62, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 + diff --git a/sound/voicegroups/drumsets/rg_credits.inc b/sound/voicegroups/drumsets/rg_credits.inc new file mode 100644 index 000000000000..0af80106d61d --- /dev/null +++ b/sound/voicegroups/drumsets/rg_credits.inc @@ -0,0 +1,54 @@ +voice_group rg_credits_drumset, 36 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_drum_and_percussion_kick, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 64, 52, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 33, 104, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 63, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 + voice_directsound_no_resample 64, 14, DirectSoundWaveData_trinity_cymbal_crash, 255, 231, 0, 188 + voice_directsound_no_resample 64, 89, DirectSoundWaveData_sd90_cowbell, 255, 0, 255, 242 + voice_directsound_no_resample 64, 24, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 + voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216 + voice_directsound_no_resample 64, 94, DirectSoundWaveData_unused_heart_of_asia_indian_drum, 255, 0, 255, 0 + voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 + voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 + voice_directsound_no_resample 64, 90, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 + voice_directsound_no_resample 64, 79, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 + voice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 165, 103, 188 + voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 64, 104, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 + voice_directsound 63, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0 + diff --git a/sound/voicegroups/drumsets/route101.inc b/sound/voicegroups/drumsets/route101.inc new file mode 100644 index 000000000000..779831fc4ea7 --- /dev/null +++ b/sound/voicegroups/drumsets/route101.inc @@ -0,0 +1,31 @@ +voice_group route101_drumset, 36 + voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_kick, 255, 0, 255, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 32, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 72, 67, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 72, 61, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 + diff --git a/sound/voicegroups/drumsets/route110.inc b/sound/voicegroups/drumsets/route110.inc new file mode 100644 index 000000000000..3535f6292770 --- /dev/null +++ b/sound/voicegroups/drumsets/route110.inc @@ -0,0 +1,27 @@ +voice_group route110_drumset, 40 + voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 32, 49, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 30, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 30, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 72, 79, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 72, 74, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 + diff --git a/sound/voicegroups/drumsets/rs.inc b/sound/voicegroups/drumsets/rs.inc new file mode 100644 index 000000000000..f15d9a514c3f --- /dev/null +++ b/sound/voicegroups/drumsets/rs.inc @@ -0,0 +1,31 @@ +voice_group rs_drumset, 36 + voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_kick, 255, 0, 255, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 + voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 + voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 + voice_directsound 48, 44, DirectSoundWaveData_unused_sc55_tom, 255, 210, 77, 204 + voice_directsound_no_resample 60, 79, DirectSoundWaveData_unknown_close_hihat, 255, 127, 0, 188 + voice_directsound 51, 54, DirectSoundWaveData_unused_sc55_tom, 255, 216, 77, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 54, 64, DirectSoundWaveData_unused_sc55_tom, 255, 216, 77, 204 + voice_directsound_no_resample 60, 79, DirectSoundWaveData_unknown_open_hihat, 255, 242, 141, 0 + voice_directsound 57, 69, DirectSoundWaveData_unused_sc55_tom, 255, 210, 77, 204 + voice_directsound 60, 79, DirectSoundWaveData_unused_sc55_tom, 255, 204, 77, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 62, 84, DirectSoundWaveData_unused_sc55_tom, 255, 204, 77, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 70, 49, DirectSoundWaveData_unknown_bell, 255, 165, 103, 231 + voice_directsound_no_resample 32, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 + voice_directsound_no_resample 60, 14, DirectSoundWaveData_trinity_cymbal_crash, 255, 235, 0, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 30, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 30, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216 + voice_directsound_no_resample 30, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 72, 104, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 72, 94, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 + diff --git a/sound/voicegroups/dummy.inc b/sound/voicegroups/dummy.inc new file mode 100644 index 000000000000..43b431f856cc --- /dev/null +++ b/sound/voicegroups/dummy.inc @@ -0,0 +1,100 @@ +voice_group dummy + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 2, 0, 0, 9, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 235 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 204, 193, 239 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 1, 6, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 2, 0, 1, 6, 0 + voice_programmable_wave 60, 0, ProgrammableWaveData_3, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 1, 6, 0 + voice_square_2 60, 0, 3, 0, 1, 6, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 0, 0, 1, 6, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_oboe, 255, 165, 154, 127 + voice_directsound 60, 0, DirectSoundWaveData_unused_sd90_oboe, 255, 165, 154, 127 + voice_directsound 60, 0, DirectSoundWaveData_unused_guitar_separates_power_chord, 255, 165, 206, 127 + voice_directsound 60, 0, DirectSoundWaveData_unused_sc88pro_unison_slap, 255, 165, 206, 127 + voice_directsound 60, 0, DirectSoundWaveData_unknown_snare, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_ohtsuzumi, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_hyoushigi, 255, 0, 255, 0 + diff --git a/sound/voicegroups/encounter_aqua.inc b/sound/voicegroups/encounter_aqua.inc new file mode 100644 index 000000000000..f45e9843c418 --- /dev/null +++ b/sound/voicegroups/encounter_aqua.inc @@ -0,0 +1,130 @@ +voice_group encounter_aqua + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/encounter_brendan.inc b/sound/voicegroups/encounter_brendan.inc new file mode 100644 index 000000000000..3e0f96b624d2 --- /dev/null +++ b/sound/voicegroups/encounter_brendan.inc @@ -0,0 +1,130 @@ +voice_group encounter_brendan + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/encounter_champion.inc b/sound/voicegroups/encounter_champion.inc new file mode 100644 index 000000000000..fde001b902ff --- /dev/null +++ b/sound/voicegroups/encounter_champion.inc @@ -0,0 +1,130 @@ +voice_group encounter_champion + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 + voice_square_1_alt 60, 0, 0, 2, 1, 1, 4, 1 + voice_square_2_alt 60, 0, 2, 1, 1, 4, 1 + voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/encounter_cool.inc b/sound/voicegroups/encounter_cool.inc new file mode 100644 index 000000000000..b0e0b9b45461 --- /dev/null +++ b/sound/voicegroups/encounter_cool.inc @@ -0,0 +1,130 @@ +voice_group encounter_cool + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/encounter_elite_four.inc b/sound/voicegroups/encounter_elite_four.inc new file mode 100644 index 000000000000..b7842d6d0393 --- /dev/null +++ b/sound/voicegroups/encounter_elite_four.inc @@ -0,0 +1,130 @@ +voice_group encounter_elite_four + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/encounter_female.inc b/sound/voicegroups/encounter_female.inc new file mode 100644 index 000000000000..e98854b17323 --- /dev/null +++ b/sound/voicegroups/encounter_female.inc @@ -0,0 +1,130 @@ +voice_group encounter_female + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 1, 4, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 12, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/encounter_girl.inc b/sound/voicegroups/encounter_girl.inc new file mode 100644 index 000000000000..47426833b9b3 --- /dev/null +++ b/sound/voicegroups/encounter_girl.inc @@ -0,0 +1,130 @@ +voice_group encounter_girl + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 1, 0, 2, 0, 0 + voice_square_1 60, 0, 0, 1, 0, 2, 0, 0 + voice_square_2 60, 0, 1, 0, 6, 0, 0 + voice_square_1 60, 0, 0, 1, 0, 6, 0, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 4, 1, 4 + voice_noise_alt 60, 0, 0, 0, 1, 0, 2 + diff --git a/sound/voicegroups/encounter_hiker.inc b/sound/voicegroups/encounter_hiker.inc new file mode 100644 index 000000000000..826fe1402577 --- /dev/null +++ b/sound/voicegroups/encounter_hiker.inc @@ -0,0 +1,130 @@ +voice_group encounter_hiker + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 249 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 7, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/encounter_intense.inc b/sound/voicegroups/encounter_intense.inc new file mode 100644 index 000000000000..650fb2a8a3a9 --- /dev/null +++ b/sound/voicegroups/encounter_intense.inc @@ -0,0 +1,130 @@ +voice_group encounter_intense + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/encounter_interviewer.inc b/sound/voicegroups/encounter_interviewer.inc new file mode 100644 index 000000000000..1f3f5248a735 --- /dev/null +++ b/sound/voicegroups/encounter_interviewer.inc @@ -0,0 +1,130 @@ +voice_group encounter_interviewer + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 0 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 7, 0 + voice_square_1_alt 60, 0, 0, 1, 2, 1, 5, 0 + voice_square_2_alt 60, 0, 1, 2, 1, 5, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/encounter_magma.inc b/sound/voicegroups/encounter_magma.inc new file mode 100644 index 000000000000..f41d1f5ad23a --- /dev/null +++ b/sound/voicegroups/encounter_magma.inc @@ -0,0 +1,130 @@ +voice_group encounter_magma + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/encounter_male.inc b/sound/voicegroups/encounter_male.inc new file mode 100644 index 000000000000..80cc90476c0c --- /dev/null +++ b/sound/voicegroups/encounter_male.inc @@ -0,0 +1,85 @@ +voice_group encounter_male + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 3, 0, 1, 0, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 0, 0, 2, 0, 0 + voice_square_1 60, 0, 0, 0, 0, 2, 0, 0 + voice_square_2 60, 0, 0, 0, 6, 0, 0 + voice_square_1 60, 0, 0, 0, 0, 6, 0, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 2, 0, 2, 0, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_2 60, 0, 3, 0, 4, 0, 0 + diff --git a/sound/voicegroups/encounter_may.inc b/sound/voicegroups/encounter_may.inc new file mode 100644 index 000000000000..d4915bb36e66 --- /dev/null +++ b/sound/voicegroups/encounter_may.inc @@ -0,0 +1,130 @@ +voice_group encounter_may + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/encounter_rich.inc b/sound/voicegroups/encounter_rich.inc new file mode 100644 index 000000000000..d5ed5ddcc02e --- /dev/null +++ b/sound/voicegroups/encounter_rich.inc @@ -0,0 +1,83 @@ +voice_group encounter_rich + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 + diff --git a/sound/voicegroups/encounter_suspicious.inc b/sound/voicegroups/encounter_suspicious.inc new file mode 100644 index 000000000000..41f59bc1281c --- /dev/null +++ b/sound/voicegroups/encounter_suspicious.inc @@ -0,0 +1,130 @@ +voice_group encounter_suspicious + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 3 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/encounter_swimmer.inc b/sound/voicegroups/encounter_swimmer.inc new file mode 100644 index 000000000000..eaafd5e332ee --- /dev/null +++ b/sound/voicegroups/encounter_swimmer.inc @@ -0,0 +1,130 @@ +voice_group encounter_swimmer + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 1, 6, 1 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 6, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 2, 4, 1 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 4, 1, 4 + voice_noise_alt 60, 0, 0, 0, 1, 0, 2 + diff --git a/sound/voicegroups/encounter_twins.inc b/sound/voicegroups/encounter_twins.inc new file mode 100644 index 000000000000..be0a7d70e9a4 --- /dev/null +++ b/sound/voicegroups/encounter_twins.inc @@ -0,0 +1,130 @@ +voice_group encounter_twins + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 3 + voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/end.inc b/sound/voicegroups/end.inc new file mode 100644 index 000000000000..07da4dfad040 --- /dev/null +++ b/sound/voicegroups/end.inc @@ -0,0 +1,84 @@ +voice_group end + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 248 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 6, 0, 6 + voice_square_2_alt 60, 0, 2, 0, 6, 0, 6 + diff --git a/sound/voicegroups/ever_grande.inc b/sound/voicegroups/ever_grande.inc new file mode 100644 index 000000000000..bd8acc879e17 --- /dev/null +++ b/sound/voicegroups/ever_grande.inc @@ -0,0 +1,130 @@ +voice_group ever_grande + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 2, 3, 1 + voice_square_2_alt 60, 0, 2, 0, 2, 3, 1 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/evolution.inc b/sound/voicegroups/evolution.inc new file mode 100644 index 000000000000..b3513a15e73a --- /dev/null +++ b/sound/voicegroups/evolution.inc @@ -0,0 +1,87 @@ +voice_group evolution + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 1, 9, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 9, 0 + voice_square_2_alt 60, 0, 3, 0, 1, 7, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 0 + diff --git a/sound/voicegroups/fallarbor.inc b/sound/voicegroups/fallarbor.inc new file mode 100644 index 000000000000..3cc2ba6bbeb5 --- /dev/null +++ b/sound/voicegroups/fallarbor.inc @@ -0,0 +1,86 @@ +voice_group fallarbor + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 72, 249 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 2, 0, 1, 4, 2 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 6, 4 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 2, 6, 1 + diff --git a/sound/voicegroups/fanfare.inc b/sound/voicegroups/fanfare.inc new file mode 100644 index 000000000000..671564a9bc75 --- /dev/null +++ b/sound/voicegroups/fanfare.inc @@ -0,0 +1,104 @@ +voice_group fanfare + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_directsound 60, 0, DirectSoundWaveData_trinity_30303_mega_bass, 255, 178, 180, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 235 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 204 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 1, 7, 1 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 1 + voice_square_2_alt 60, 0, 3, 0, 1, 7, 1 + voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 1 + voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 2, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 29, 2, 0, 2, 0, 0 + voice_square_1_alt 60, 0, 22, 2, 0, 2, 0, 0 + diff --git a/sound/voicegroups/follow_me.inc b/sound/voicegroups/follow_me.inc new file mode 100644 index 000000000000..d1b429739289 --- /dev/null +++ b/sound/voicegroups/follow_me.inc @@ -0,0 +1,130 @@ +voice_group follow_me + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 1, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 3 + voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/fortree.inc b/sound/voicegroups/fortree.inc new file mode 100644 index 000000000000..6f12c7ad9461 --- /dev/null +++ b/sound/voicegroups/fortree.inc @@ -0,0 +1,130 @@ +voice_group fortree + voice_keysplit_all voicegroup_petalburg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 3, 4, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 3, 4, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 250, 0, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + voice_noise_alt 60, 0, 0, 0, 4, 1, 4 + voice_noise_alt 60, 0, 0, 0, 1, 0, 2 + diff --git a/sound/voicegroups/frlg_sfx.inc b/sound/voicegroups/frlg_sfx.inc new file mode 100644 index 000000000000..eadd0959c4c4 --- /dev/null +++ b/sound/voicegroups/frlg_sfx.inc @@ -0,0 +1,130 @@ +voice_group frlg_sfx + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 226, 25, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_unknown_1, 255, 0, 255, 165 + voice_directsound 60, 0, DirectSoundWaveData_dance_drums_ride_bell, 255, 165, 103, 231 + voice_directsound 60, 0, DirectSoundWaveData_sd90_open_triangle, 255, 204, 128, 249 + voice_directsound 60, 0, DirectSoundWaveData_register_noise, 255, 0, 255, 76 + voice_directsound 60, 0, DirectSoundWaveData_unknown_18, 255, 0, 206, 204 + voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_ohtsuzumi, 255, 0, 206, 38 + voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_hyoushigi, 255, 0, 206, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 252, 0, 204 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 204, 0, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 0, 10, 4 + voice_square_1_alt 60, 0, 0, 3, 0, 0, 10, 3 + voice_square_1_alt 60, 0, 0, 2, 0, 0, 10, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 0, 15, 1 + voice_square_1_alt 60, 0, 0, 0, 0, 2, 5, 6 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 29, 2, 0, 2, 0, 0 + voice_square_1_alt 60, 0, 22, 2, 0, 2, 0, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 9, 2 + voice_noise_alt 60, 0, 0, 0, 4, 3, 1 + voice_noise_alt 60, 0, 0, 0, 1, 12, 0 + voice_noise_alt 60, 0, 1, 0, 1, 9, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + diff --git a/sound/voicegroups/game_corner.inc b/sound/voicegroups/game_corner.inc new file mode 100644 index 000000000000..127fe4ea0500 --- /dev/null +++ b/sound/voicegroups/game_corner.inc @@ -0,0 +1,130 @@ +voice_group game_corner + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 4, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/gym.inc b/sound/voicegroups/gym.inc new file mode 100644 index 000000000000..c4297ff663b2 --- /dev/null +++ b/sound/voicegroups/gym.inc @@ -0,0 +1,92 @@ +voice_group gym + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 1, 0, 1, 7, 1 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 1, 7, 1 + voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 + voice_square_1_alt 60, 0, 0, 1, 0, 0, 7, 1 + voice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 1 + diff --git a/sound/voicegroups/hall_of_fame.inc b/sound/voicegroups/hall_of_fame.inc new file mode 100644 index 000000000000..82651a41e611 --- /dev/null +++ b/sound/voicegroups/hall_of_fame.inc @@ -0,0 +1,130 @@ +voice_group hall_of_fame + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 2, 4, 1 + voice_square_2_alt 60, 0, 3, 0, 1, 6, 2 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 4, 4 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/hall_of_fame_room.inc b/sound/voicegroups/hall_of_fame_room.inc new file mode 100644 index 000000000000..842ef7751425 --- /dev/null +++ b/sound/voicegroups/hall_of_fame_room.inc @@ -0,0 +1,130 @@ +voice_group hall_of_fame_room + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 7, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/help.inc b/sound/voicegroups/help.inc new file mode 100644 index 000000000000..6bb535c8a3c6 --- /dev/null +++ b/sound/voicegroups/help.inc @@ -0,0 +1,130 @@ +voice_group help + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/intro.inc b/sound/voicegroups/intro.inc new file mode 100644 index 000000000000..66da0b30517a --- /dev/null +++ b/sound/voicegroups/intro.inc @@ -0,0 +1,130 @@ +voice_group intro + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 128, 226, 0, 38 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 1, 1, 1, 6, 1 + voice_square_1_alt 60, 0, 0, 1, 0, 4, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 7, 3, 3 + voice_square_1_alt 60, 0, 0, 2, 0, 7, 3, 3 + voice_square_1_alt 60, 0, 0, 3, 2, 2, 7, 0 + voice_square_2_alt 60, 0, 1, 1, 2, 3, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/intro_battle.inc b/sound/voicegroups/intro_battle.inc new file mode 100644 index 000000000000..8845d3c714a9 --- /dev/null +++ b/sound/voicegroups/intro_battle.inc @@ -0,0 +1,130 @@ +voice_group intro_battle + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 1, 1, 1, 6, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 239 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 6, 2 + voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 + voice_square_1_alt 60, 0, 0, 1, 1, 1, 6, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 1, 6, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/keysplits/french_horn.inc b/sound/voicegroups/keysplits/french_horn.inc new file mode 100644 index 000000000000..193fa3957c13 --- /dev/null +++ b/sound/voicegroups/keysplits/french_horn.inc @@ -0,0 +1,4 @@ +voice_group french_horn_keysplit + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_french_horn_60, 255, 0, 224, 165 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_french_horn_72, 255, 0, 218, 165 + diff --git a/sound/voicegroups/keysplits/piano.inc b/sound/voicegroups/keysplits/piano.inc new file mode 100644 index 000000000000..93484ea8b2b9 --- /dev/null +++ b/sound/voicegroups/keysplits/piano.inc @@ -0,0 +1,6 @@ +voice_group piano_keysplit + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_piano1_48, 255, 252, 0, 239 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_piano1_60, 255, 250, 0, 221 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_piano1_72, 255, 250, 0, 221 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_piano1_84, 255, 247, 0, 221 + diff --git a/sound/voicegroups/keysplits/strings.inc b/sound/voicegroups/keysplits/strings.inc new file mode 100644 index 000000000000..27e445e359eb --- /dev/null +++ b/sound/voicegroups/keysplits/strings.inc @@ -0,0 +1,5 @@ +voice_group strings_keysplit + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_string_ensemble_60, 255, 0, 255, 196 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_string_ensemble_72, 255, 0, 255, 196 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_string_ensemble_84, 255, 0, 255, 196 + diff --git a/sound/voicegroups/keysplits/trumpet.inc b/sound/voicegroups/keysplits/trumpet.inc new file mode 100644 index 000000000000..eb38b7de7475 --- /dev/null +++ b/sound/voicegroups/keysplits/trumpet.inc @@ -0,0 +1,5 @@ +voice_group trumpet_keysplit + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_trumpet_60, 255, 0, 193, 127 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_trumpet_72, 255, 0, 193, 127 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_trumpet_84, 255, 0, 193, 127 + diff --git a/sound/voicegroups/keysplits/tuba.inc b/sound/voicegroups/keysplits/tuba.inc new file mode 100644 index 000000000000..5d00a8000a51 --- /dev/null +++ b/sound/voicegroups/keysplits/tuba.inc @@ -0,0 +1,4 @@ +voice_group tuba_keysplit + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tuba_39, 255, 0, 255, 165 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tuba_51, 255, 0, 255, 165 + diff --git a/sound/voicegroups/lilycove.inc b/sound/voicegroups/lilycove.inc new file mode 100644 index 000000000000..8988ade2b1b7 --- /dev/null +++ b/sound/voicegroups/lilycove.inc @@ -0,0 +1,130 @@ +voice_group lilycove + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 1, 5, 2 + voice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/lilycove_museum.inc b/sound/voicegroups/lilycove_museum.inc new file mode 100644 index 000000000000..06ee86ea9d8e --- /dev/null +++ b/sound/voicegroups/lilycove_museum.inc @@ -0,0 +1,89 @@ +voice_group lilycove_museum + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 2, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 1, 7, 1 + voice_square_2_alt 60, 0, 1, 0, 1, 6, 2 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 6, 2 + voice_square_1_alt 60, 0, 0, 1, 0, 0, 6, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 7, 1 + diff --git a/sound/voicegroups/link_contest_p1.inc b/sound/voicegroups/link_contest_p1.inc new file mode 100644 index 000000000000..7b1857db1ca3 --- /dev/null +++ b/sound/voicegroups/link_contest_p1.inc @@ -0,0 +1,130 @@ +voice_group link_contest_p1 + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 0 + voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/link_contest_p2.inc b/sound/voicegroups/link_contest_p2.inc new file mode 100644 index 000000000000..dd547e36628c --- /dev/null +++ b/sound/voicegroups/link_contest_p2.inc @@ -0,0 +1,130 @@ +voice_group link_contest_p2 + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 0 + voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/link_contest_p3.inc b/sound/voicegroups/link_contest_p3.inc new file mode 100644 index 000000000000..f9d5559a5efb --- /dev/null +++ b/sound/voicegroups/link_contest_p3.inc @@ -0,0 +1,130 @@ +voice_group link_contest_p3 + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 0 + voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/link_contest_p4.inc b/sound/voicegroups/link_contest_p4.inc new file mode 100644 index 000000000000..2abcd10dab77 --- /dev/null +++ b/sound/voicegroups/link_contest_p4.inc @@ -0,0 +1,130 @@ +voice_group link_contest_p4 + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 0 + voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/littleroot.inc b/sound/voicegroups/littleroot.inc new file mode 100644 index 000000000000..2817a022aff6 --- /dev/null +++ b/sound/voicegroups/littleroot.inc @@ -0,0 +1,76 @@ +voice_group littleroot + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 1, 4, 4, 2 + voice_square_1_alt 60, 0, 0, 2, 0, 3, 4, 1 + voice_square_2_alt 60, 0, 2, 1, 3, 4, 2 + voice_square_1_alt 60, 0, 0, 2, 0, 3, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 99 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + diff --git a/sound/voicegroups/littleroot_test.inc b/sound/voicegroups/littleroot_test.inc new file mode 100644 index 000000000000..1788f263c01c --- /dev/null +++ b/sound/voicegroups/littleroot_test.inc @@ -0,0 +1,86 @@ +voice_group littleroot_test + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 2, 0, 1, 4, 2 + voice_square_1 60, 0, 0, 2, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave 60, 0, ProgrammableWaveData_16, 0, 7, 15, 2 + diff --git a/sound/voicegroups/mt_chimney.inc b/sound/voicegroups/mt_chimney.inc new file mode 100644 index 000000000000..2255c50d75b1 --- /dev/null +++ b/sound/voicegroups/mt_chimney.inc @@ -0,0 +1,130 @@ +voice_group mt_chimney + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 3, 1, 2, 6, 0 + voice_square_2 60, 0, 3, 1, 2, 6, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_4, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 1, 0, 1, 6, 1 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 7, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 1 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 2 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 7, 6, 1 + voice_square_2_alt 60, 0, 2, 0, 1, 6, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 9, 4 + voice_noise_alt 60, 0, 0, 3, 1, 10, 0 + voice_noise_alt 60, 0, 0, 0, 2, 0, 0 + diff --git a/sound/voicegroups/mt_pyre.inc b/sound/voicegroups/mt_pyre.inc new file mode 100644 index 000000000000..5d7caa771bed --- /dev/null +++ b/sound/voicegroups/mt_pyre.inc @@ -0,0 +1,130 @@ +voice_group mt_pyre + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 196 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 4, 0 + voice_noise_alt 60, 0, 0, 0, 2, 0, 2 + diff --git a/sound/voicegroups/mt_pyre_exterior.inc b/sound/voicegroups/mt_pyre_exterior.inc new file mode 100644 index 000000000000..7f4c2e4363e4 --- /dev/null +++ b/sound/voicegroups/mt_pyre_exterior.inc @@ -0,0 +1,130 @@ +voice_group mt_pyre_exterior + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/oceanic_museum.inc b/sound/voicegroups/oceanic_museum.inc new file mode 100644 index 000000000000..1b072e2f4467 --- /dev/null +++ b/sound/voicegroups/oceanic_museum.inc @@ -0,0 +1,91 @@ +voice_group oceanic_museum + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 1, 7, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 0 + voice_square_2_alt 60, 0, 2, 0, 1, 6, 1 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 6, 1 + voice_square_2_alt 60, 0, 3, 0, 1, 7, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 0, 7, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 0 + diff --git a/sound/voicegroups/oldale.inc b/sound/voicegroups/oldale.inc new file mode 100644 index 000000000000..177f45c53e72 --- /dev/null +++ b/sound/voicegroups/oldale.inc @@ -0,0 +1,87 @@ +voice_group oldale + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 1, 0, 1, 7, 1 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 7, 1 + voice_square_2_alt 60, 0, 2, 0, 2, 6, 1 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 6, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 1, 7, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 2 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 1 + voice_square_1_alt 60, 0, 0, 2, 0, 0, 7, 1 + voice_square_1_alt 60, 0, 0, 1, 0, 0, 7, 1 + diff --git a/sound/voicegroups/petalburg.inc b/sound/voicegroups/petalburg.inc new file mode 100644 index 000000000000..ff49460b51af --- /dev/null +++ b/sound/voicegroups/petalburg.inc @@ -0,0 +1,130 @@ +voice_group petalburg + voice_keysplit_all voicegroup_petalburg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 3, 0, 2, 0, 0 + voice_square_1 60, 0, 0, 3, 0, 2, 0, 0 + voice_square_2 60, 0, 3, 0, 6, 0, 0 + voice_square_1 60, 0, 0, 3, 0, 6, 0, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 0, 2 + voice_noise_alt 60, 0, 0, 0, 1, 0, 1 + diff --git a/sound/voicegroups/petalburg_woods.inc b/sound/voicegroups/petalburg_woods.inc new file mode 100644 index 000000000000..5dbe72c9a9b1 --- /dev/null +++ b/sound/voicegroups/petalburg_woods.inc @@ -0,0 +1,130 @@ +voice_group petalburg_woods + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 0, 0, 1, 7, 1 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 7, 1 + voice_square_1_alt 60, 0, 0, 0, 0, 0, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 1, 7, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 1, 0, 1, 0, 3 + diff --git a/sound/voicegroups/poke_center.inc b/sound/voicegroups/poke_center.inc new file mode 100644 index 000000000000..edcf645bfab6 --- /dev/null +++ b/sound/voicegroups/poke_center.inc @@ -0,0 +1,130 @@ +voice_group poke_center + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_14, 0, 1, 12, 0 + voice_square_1_alt 60, 0, 0, 0, 1, 1, 9, 0 + voice_square_2_alt 60, 0, 2, 0, 2, 6, 3 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 1 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 216 + voice_square_2_alt 60, 0, 1, 0, 2, 6, 3 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/poke_mart.inc b/sound/voicegroups/poke_mart.inc new file mode 100644 index 000000000000..cc6580d5ae17 --- /dev/null +++ b/sound/voicegroups/poke_mart.inc @@ -0,0 +1,130 @@ +voice_group poke_mart + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/rayquaza_appears.inc b/sound/voicegroups/rayquaza_appears.inc new file mode 100644 index 000000000000..f7cddd3881b1 --- /dev/null +++ b/sound/voicegroups/rayquaza_appears.inc @@ -0,0 +1,85 @@ +voice_group rayquaza_appears + voice_keysplit_all voicegroup_emerald_drumset_2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_church_organ3_low, 255, 76, 154, 188 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_church_organ3_high, 255, 76, 154, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 0, 13, 1 + voice_square_2_alt 60, 0, 0, 0, 0, 12, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0 + diff --git a/sound/voicegroups/register_match_call.inc b/sound/voicegroups/register_match_call.inc new file mode 100644 index 000000000000..b35b30fb362b --- /dev/null +++ b/sound/voicegroups/register_match_call.inc @@ -0,0 +1,85 @@ +voice_group register_match_call + voice_keysplit_all voicegroup_frlg_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 9, 4 + voice_square_2_alt 60, 0, 2, 0, 2, 9, 4 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 + diff --git a/sound/voicegroups/rg_caught_intro.inc b/sound/voicegroups/rg_caught_intro.inc new file mode 100644 index 000000000000..b2623ba7a047 --- /dev/null +++ b/sound/voicegroups/rg_caught_intro.inc @@ -0,0 +1,90 @@ +voice_group rg_caught_intro + voice_keysplit_all voicegroup_frlg_fanfare_drumset_1 + voice_keysplit_all voicegroup_frlg_fanfare_drumset_2 + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 85, 165, 154, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 0, 10, 0 + voice_square_2_alt 60, 0, 0, 0, 1, 9, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 1, 9, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 + diff --git a/sound/voicegroups/rg_celadon.inc b/sound/voicegroups/rg_celadon.inc new file mode 100644 index 000000000000..9f9dc36cf9fd --- /dev/null +++ b/sound/voicegroups/rg_celadon.inc @@ -0,0 +1,130 @@ +voice_group rg_celadon + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 + voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 204, 77, 246 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 2 + voice_square_2_alt 60, 0, 3, 0, 2, 6, 4 + voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_14, 0, 0, 12, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + voice_noise_alt 60, 0, 0, 0, 1, 6, 0 + diff --git a/sound/voicegroups/rg_cinnabar.inc b/sound/voicegroups/rg_cinnabar.inc new file mode 100644 index 000000000000..90c207b67532 --- /dev/null +++ b/sound/voicegroups/rg_cinnabar.inc @@ -0,0 +1,130 @@ +voice_group rg_cinnabar + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 + voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 204, 77, 246 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 2, 5, 2 + voice_square_2_alt 60, 0, 3, 0, 1, 6, 3 + voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 12, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + voice_noise_alt 60, 0, 0, 0, 1, 6, 0 + diff --git a/sound/voicegroups/rg_credits.inc b/sound/voicegroups/rg_credits.inc new file mode 100644 index 000000000000..951a5782363f --- /dev/null +++ b/sound/voicegroups/rg_credits.inc @@ -0,0 +1,95 @@ +voice_group rg_credits + voice_keysplit_all voicegroup_rg_credits_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1_alt 60, 0, 0, 2, 0, 0, 12, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 165, 154, 153 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_oboe, 43, 188, 103, 165 + voice_directsound 60, 0, DirectSoundWaveData_unused_sd90_oboe, 43, 165, 103, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 1, 2, 3, 1 + voice_square_2_alt 60, 0, 1, 0, 2, 4, 2 + voice_square_1_alt 60, 0, 0, 1, 0, 2, 6, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 2, 3, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 + diff --git a/sound/voicegroups/rg_cycling.inc b/sound/voicegroups/rg_cycling.inc new file mode 100644 index 000000000000..57e225141bcb --- /dev/null +++ b/sound/voicegroups/rg_cycling.inc @@ -0,0 +1,130 @@ +voice_group rg_cycling + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 85, 249, 25, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 2, 5, 2 + voice_square_2_alt 60, 0, 3, 0, 2, 7, 3 + voice_square_2_alt 60, 0, 2, 0, 2, 6, 5 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 1, 7, 0, 6 + voice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 2 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 2, 9, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + voice_noise_alt 60, 0, 0, 0, 1, 6, 0 + diff --git a/sound/voicegroups/rg_dex_rating.inc b/sound/voicegroups/rg_dex_rating.inc new file mode 100644 index 000000000000..b349e6a132e0 --- /dev/null +++ b/sound/voicegroups/rg_dex_rating.inc @@ -0,0 +1,90 @@ +voice_group rg_dex_rating + voice_keysplit_all voicegroup_frlg_fanfare_drumset_1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 85, 165, 154, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 7, 1 + voice_square_2_alt 60, 0, 2, 0, 2, 9, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 + diff --git a/sound/voicegroups/rg_encounter_boy.inc b/sound/voicegroups/rg_encounter_boy.inc new file mode 100644 index 000000000000..27d34d91360d --- /dev/null +++ b/sound/voicegroups/rg_encounter_boy.inc @@ -0,0 +1,130 @@ +voice_group rg_encounter_boy + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 85, 188, 92, 165 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 85, 127, 180, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 51, 204, 92, 226 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 2, 4, 2 + voice_square_2_alt 60, 0, 1, 0, 2, 4, 3 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 9, 0 + voice_noise_alt 60, 0, 0, 0, 1, 6, 0 + diff --git a/sound/voicegroups/rg_encounter_deoxys.inc b/sound/voicegroups/rg_encounter_deoxys.inc new file mode 100644 index 000000000000..7b7fd5bd98c1 --- /dev/null +++ b/sound/voicegroups/rg_encounter_deoxys.inc @@ -0,0 +1,88 @@ +voice_group rg_encounter_deoxys + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 255, 0, 255, 0 + diff --git a/sound/voicegroups/rg_encounter_girl.inc b/sound/voicegroups/rg_encounter_girl.inc new file mode 100644 index 000000000000..6e9989e6be2c --- /dev/null +++ b/sound/voicegroups/rg_encounter_girl.inc @@ -0,0 +1,130 @@ +voice_group rg_encounter_girl + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 160, 123, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 2, 3, 2 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 3, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 9, 0 + voice_noise_alt 60, 0, 0, 0, 1, 6, 1 + diff --git a/sound/voicegroups/rg_encounter_rival.inc b/sound/voicegroups/rg_encounter_rival.inc new file mode 100644 index 000000000000..445cbad3203a --- /dev/null +++ b/sound/voicegroups/rg_encounter_rival.inc @@ -0,0 +1,130 @@ +voice_group rg_encounter_rival + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 128, 0, 255, 214 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 128, 0, 255, 206 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 209 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 2, 3, 4 + voice_square_2_alt 60, 0, 3, 0, 2, 3, 4 + voice_square_1_alt 60, 0, 0, 3, 0, 2, 3, 4 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + voice_noise_alt 60, 0, 0, 0, 1, 3, 1 + diff --git a/sound/voicegroups/rg_encounter_rocket.inc b/sound/voicegroups/rg_encounter_rocket.inc new file mode 100644 index 000000000000..69fd532a0eec --- /dev/null +++ b/sound/voicegroups/rg_encounter_rocket.inc @@ -0,0 +1,86 @@ +voice_group rg_encounter_rocket + voice_keysplit_all voicegroup_frlg_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 64, 188, 128, 201 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 64, 195, 103, 220 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 128, 195, 72, 127 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 85, 188, 103, 160 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 128, 188, 77, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 175, 154, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 6, 4 + voice_square_2_alt 60, 0, 2, 0, 2, 5, 5 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_14, 0, 7, 15, 0 + diff --git a/sound/voicegroups/rg_follow_me.inc b/sound/voicegroups/rg_follow_me.inc new file mode 100644 index 000000000000..5f7563da829c --- /dev/null +++ b/sound/voicegroups/rg_follow_me.inc @@ -0,0 +1,130 @@ +voice_group rg_follow_me + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_directsound 60, 0, DirectSoundWaveData_steinway_b_piano, 128, 204, 51, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 204, 103, 226 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 2, 3, 5 + voice_square_2_alt 60, 0, 3, 0, 2, 6, 5 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 9, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 1 + diff --git a/sound/voicegroups/rg_fuchsia.inc b/sound/voicegroups/rg_fuchsia.inc new file mode 100644 index 000000000000..c2b9ff1d1684 --- /dev/null +++ b/sound/voicegroups/rg_fuchsia.inc @@ -0,0 +1,130 @@ +voice_group rg_fuchsia + voice_keysplit_all voicegroup_frlg_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 10, 4 + voice_square_2_alt 60, 0, 3, 0, 2, 8, 3 + voice_square_2_alt 60, 0, 2, 0, 2, 6, 5 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 0, 6, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + voice_noise_alt 60, 0, 0, 0, 1, 6, 0 + diff --git a/sound/voicegroups/rg_game_corner.inc b/sound/voicegroups/rg_game_corner.inc new file mode 100644 index 000000000000..fb7c6f615e82 --- /dev/null +++ b/sound/voicegroups/rg_game_corner.inc @@ -0,0 +1,130 @@ +voice_group rg_game_corner + voice_keysplit_all voicegroup_frlg_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 97, 236 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 118, 137 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 51, 204, 92, 226 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 165, 154, 235 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 4, 2, 2 + voice_square_2_alt 60, 0, 3, 0, 1, 7, 5 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 4, 6, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 4, 6, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 4, 2, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 2, 9, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + voice_noise_alt 60, 0, 0, 0, 1, 8, 1 + diff --git a/sound/voicegroups/rg_game_freak.inc b/sound/voicegroups/rg_game_freak.inc new file mode 100644 index 000000000000..8a7d475dc947 --- /dev/null +++ b/sound/voicegroups/rg_game_freak.inc @@ -0,0 +1,49 @@ +voice_group rg_game_freak + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + diff --git a/sound/voicegroups/rg_gym.inc b/sound/voicegroups/rg_gym.inc new file mode 100644 index 000000000000..78791967fa41 --- /dev/null +++ b/sound/voicegroups/rg_gym.inc @@ -0,0 +1,92 @@ +voice_group rg_gym + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 1, 7, 1 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 1, 7, 1 + voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 + voice_square_1_alt 60, 0, 0, 2, 0, 0, 7, 1 + voice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 1 + diff --git a/sound/voicegroups/rg_hall_of_fame.inc b/sound/voicegroups/rg_hall_of_fame.inc new file mode 100644 index 000000000000..b98280514092 --- /dev/null +++ b/sound/voicegroups/rg_hall_of_fame.inc @@ -0,0 +1,130 @@ +voice_group rg_hall_of_fame + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 + voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 204, 77, 246 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 2, 5, 2 + voice_square_2_alt 60, 0, 3, 0, 0, 9, 0 + voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 12, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + voice_noise_alt 60, 0, 0, 0, 1, 6, 0 + diff --git a/sound/voicegroups/rg_heal.inc b/sound/voicegroups/rg_heal.inc new file mode 100644 index 000000000000..01efe859edb6 --- /dev/null +++ b/sound/voicegroups/rg_heal.inc @@ -0,0 +1,6 @@ +voice_group rg_heal + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 2, 3, 1 + voice_square_2_alt 60, 0, 2, 0, 2, 3, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + diff --git a/sound/voicegroups/rg_intro_fight.inc b/sound/voicegroups/rg_intro_fight.inc new file mode 100644 index 000000000000..3b7d70b77bad --- /dev/null +++ b/sound/voicegroups/rg_intro_fight.inc @@ -0,0 +1,130 @@ +voice_group rg_intro_fight + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 0, 0, 5, 0, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 5, 0, 0 + voice_square_1_alt 60, 0, 0, 2, 2, 4, 10, 0 + voice_square_2_alt 60, 0, 0, 0, 5, 0, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 5, 0, 0 + voice_square_2_alt 60, 0, 3, 2, 4, 10, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 1, 5, 0, 3 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 1, 5, 0, 3 + voice_square_2_alt 60, 0, 1, 0, 1, 10, 2 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 10, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 4, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/rg_jigglypuff.inc b/sound/voicegroups/rg_jigglypuff.inc new file mode 100644 index 000000000000..8c0abfcb10ad --- /dev/null +++ b/sound/voicegroups/rg_jigglypuff.inc @@ -0,0 +1,85 @@ +voice_group rg_jigglypuff + voice_keysplit_all voicegroup_frlg_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 85, 137, 180, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 0, 9, 0 + voice_square_2_alt 60, 0, 2, 0, 0, 9, 0 + voice_square_1_alt 60, 0, 0, 0, 1, 2, 6, 0 + diff --git a/sound/voicegroups/rg_lavender.inc b/sound/voicegroups/rg_lavender.inc new file mode 100644 index 000000000000..59dcb2029381 --- /dev/null +++ b/sound/voicegroups/rg_lavender.inc @@ -0,0 +1,130 @@ +voice_group rg_lavender + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 242 + voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 127, 103, 201 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 37, 127, 77, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 51, 204, 92, 226 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 226 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 3, 1 + voice_square_2_alt 60, 0, 3, 0, 2, 7, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 6, 1 + voice_noise_alt 60, 0, 0, 0, 1, 6, 1 + diff --git a/sound/voicegroups/rg_mt_moon.inc b/sound/voicegroups/rg_mt_moon.inc new file mode 100644 index 000000000000..026bb7edc8a6 --- /dev/null +++ b/sound/voicegroups/rg_mt_moon.inc @@ -0,0 +1,86 @@ +voice_group rg_mt_moon + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 64, 249, 25, 226 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 0, 6, 1 + voice_square_2_alt 60, 0, 2, 0, 0, 6, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 2, 4, 2 + diff --git a/sound/voicegroups/rg_mystery_gift.inc b/sound/voicegroups/rg_mystery_gift.inc new file mode 100644 index 000000000000..8f26abe0e0ba --- /dev/null +++ b/sound/voicegroups/rg_mystery_gift.inc @@ -0,0 +1,130 @@ +voice_group rg_mystery_gift + voice_keysplit_all voicegroup_frlg_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 1 + voice_square_2_alt 60, 0, 2, 0, 2, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + voice_noise_alt 60, 0, 0, 0, 1, 3, 1 + diff --git a/sound/voicegroups/rg_new_game.inc b/sound/voicegroups/rg_new_game.inc new file mode 100644 index 000000000000..ffcbcdf748b9 --- /dev/null +++ b/sound/voicegroups/rg_new_game.inc @@ -0,0 +1,90 @@ +voice_group rg_new_game + voice_keysplit_all voicegroup_frlg_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 76 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 1, 2, 3, 1 + voice_square_2_alt 60, 0, 1, 0, 2, 6, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 2, 3, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + diff --git a/sound/voicegroups/rg_oak.inc b/sound/voicegroups/rg_oak.inc new file mode 100644 index 000000000000..be46da360bff --- /dev/null +++ b/sound/voicegroups/rg_oak.inc @@ -0,0 +1,130 @@ +voice_group rg_oak + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 6, 4 + voice_square_2_alt 60, 0, 2, 0, 2, 6, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 1, 0, 2, 6, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 4, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/rg_oak_lab.inc b/sound/voicegroups/rg_oak_lab.inc new file mode 100644 index 000000000000..65fa559da3fa --- /dev/null +++ b/sound/voicegroups/rg_oak_lab.inc @@ -0,0 +1,90 @@ +voice_group rg_oak_lab + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 2, 3, 1 + voice_square_2_alt 60, 0, 1, 0, 2, 4, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + diff --git a/sound/voicegroups/rg_obtain_key_item.inc b/sound/voicegroups/rg_obtain_key_item.inc new file mode 100644 index 000000000000..e9f2bc0078b0 --- /dev/null +++ b/sound/voicegroups/rg_obtain_key_item.inc @@ -0,0 +1,90 @@ +voice_group rg_obtain_key_item + voice_keysplit_all voicegroup_frlg_fanfare_drumset_1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 204, 103, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 154, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 7, 1 + voice_square_2_alt 60, 0, 2, 0, 2, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 0, 15, 1 + diff --git a/sound/voicegroups/rg_pallet.inc b/sound/voicegroups/rg_pallet.inc new file mode 100644 index 000000000000..91836ad8dcb1 --- /dev/null +++ b/sound/voicegroups/rg_pallet.inc @@ -0,0 +1,130 @@ +voice_group rg_pallet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 64, 249, 0, 188 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 51, 249, 0, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 85, 249, 25, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 7, 0, 6 + voice_square_2_alt 60, 0, 1, 1, 5, 1, 6 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 1, 7, 0, 6 + voice_square_1_alt 60, 0, 0, 0, 1, 4, 3, 6 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 4, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/rg_pewter.inc b/sound/voicegroups/rg_pewter.inc new file mode 100644 index 000000000000..bdac72177d41 --- /dev/null +++ b/sound/voicegroups/rg_pewter.inc @@ -0,0 +1,130 @@ +voice_group rg_pewter + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 + voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 128, 204, 77, 246 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 51, 0, 203, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 64, 216, 51, 224 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 2, 3, 4 + voice_square_2_alt 60, 0, 3, 0, 3, 3, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + voice_noise_alt 60, 0, 0, 0, 1, 3, 2 + diff --git a/sound/voicegroups/rg_photo.inc b/sound/voicegroups/rg_photo.inc new file mode 100644 index 000000000000..a871efd3d48c --- /dev/null +++ b/sound/voicegroups/rg_photo.inc @@ -0,0 +1,130 @@ +voice_group rg_photo + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 64, 249, 0, 188 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 3, 1 + voice_square_2_alt 60, 0, 2, 0, 2, 3, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 60, 0, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/rg_poke_center.inc b/sound/voicegroups/rg_poke_center.inc new file mode 100644 index 000000000000..26abb41add47 --- /dev/null +++ b/sound/voicegroups/rg_poke_center.inc @@ -0,0 +1,95 @@ +voice_group rg_poke_center + voice_keysplit_all voicegroup_frlg_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 64, 188, 108, 244 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 64, 195, 92, 235 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 64, 204, 113, 235 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 0, 6, 0 + voice_square_2_alt 60, 0, 1, 0, 0, 6, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + diff --git a/sound/voicegroups/rg_poke_mansion.inc b/sound/voicegroups/rg_poke_mansion.inc new file mode 100644 index 000000000000..a1d24e89fdb1 --- /dev/null +++ b/sound/voicegroups/rg_poke_mansion.inc @@ -0,0 +1,130 @@ +voice_group rg_poke_mansion + voice_keysplit_all voicegroup_frlg_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 226, 0, 127 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 0, 12, 0 + voice_square_2_alt 60, 0, 2, 0, 0, 12, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 3, 5, 2 + voice_noise_alt 60, 0, 0, 0, 1, 6, 5 + diff --git a/sound/voicegroups/rg_poke_tower.inc b/sound/voicegroups/rg_poke_tower.inc new file mode 100644 index 000000000000..a05561c50a57 --- /dev/null +++ b/sound/voicegroups/rg_poke_tower.inc @@ -0,0 +1,130 @@ +voice_group rg_poke_tower + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 242 + voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 37, 165, 103, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 204, 92, 226 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 226 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 10, 1 + voice_square_2_alt 60, 0, 2, 0, 2, 6, 6 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_enhanced_delay_shaku, 255, 191, 97, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 9, 0 + voice_noise_alt 60, 0, 0, 0, 1, 6, 1 + diff --git a/sound/voicegroups/rg_rocket_hideout.inc b/sound/voicegroups/rg_rocket_hideout.inc new file mode 100644 index 000000000000..8d3d81a008af --- /dev/null +++ b/sound/voicegroups/rg_rocket_hideout.inc @@ -0,0 +1,130 @@ +voice_group rg_rocket_hideout + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 108, 137 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 204, 103, 226 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 153 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 9, 0 + voice_square_2_alt 60, 0, 3, 0, 2, 9, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 1, 0, 9, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + voice_noise_alt 60, 0, 0, 0, 1, 8, 1 + diff --git a/sound/voicegroups/rg_route1.inc b/sound/voicegroups/rg_route1.inc new file mode 100644 index 000000000000..237e0912826d --- /dev/null +++ b/sound/voicegroups/rg_route1.inc @@ -0,0 +1,130 @@ +voice_group rg_route1 + voice_keysplit_all voicegroup_frlg_drumset + voice_directsound 60, 0, DirectSoundWaveData_steinway_b_piano, 255, 165, 103, 235 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 85, 204, 77, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 1, 0, 1, 4, 6 + voice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 5 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 4, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/rg_route11.inc b/sound/voicegroups/rg_route11.inc new file mode 100644 index 000000000000..1ee794137b0e --- /dev/null +++ b/sound/voicegroups/rg_route11.inc @@ -0,0 +1,130 @@ +voice_group rg_route11 + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 97, 236 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 127, 154, 235 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 3, 5, 2 + voice_square_2_alt 60, 0, 3, 0, 3, 4, 2 + voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 6, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_8, 0, 1, 12, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + voice_noise_alt 60, 0, 0, 0, 1, 6, 2 + diff --git a/sound/voicegroups/rg_route24.inc b/sound/voicegroups/rg_route24.inc new file mode 100644 index 000000000000..7e50c4824f63 --- /dev/null +++ b/sound/voicegroups/rg_route24.inc @@ -0,0 +1,90 @@ +voice_group rg_route24 + voice_keysplit_all voicegroup_frlg_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 127 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 1, 2, 3, 1 + voice_square_2_alt 60, 0, 1, 0, 2, 4, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 2, 3, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + diff --git a/sound/voicegroups/rg_route3.inc b/sound/voicegroups/rg_route3.inc new file mode 100644 index 000000000000..781d2b9a413e --- /dev/null +++ b/sound/voicegroups/rg_route3.inc @@ -0,0 +1,130 @@ +voice_group rg_route3 + voice_keysplit_all voicegroup_frlg_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 97, 236 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 160, 175, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 127, 154, 235 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 4, 2, 1 + voice_square_2_alt 60, 0, 3, 0, 1, 5, 2 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 4, 6, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 4, 6, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 2, 9, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + voice_noise_alt 60, 0, 0, 0, 1, 6, 1 + diff --git a/sound/voicegroups/rg_sevii_45.inc b/sound/voicegroups/rg_sevii_45.inc new file mode 100644 index 000000000000..c81a569a9bb4 --- /dev/null +++ b/sound/voicegroups/rg_sevii_45.inc @@ -0,0 +1,130 @@ +voice_group rg_sevii_45 + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 + voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 128, 204, 77, 246 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 51, 0, 203, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 64, 216, 51, 224 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 2, 6, 1 + voice_square_2_alt 60, 0, 3, 0, 3, 3, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 7, 0 + voice_noise_alt 60, 0, 0, 0, 1, 9, 1 + diff --git a/sound/voicegroups/rg_sevii_67.inc b/sound/voicegroups/rg_sevii_67.inc new file mode 100644 index 000000000000..6a3520833795 --- /dev/null +++ b/sound/voicegroups/rg_sevii_67.inc @@ -0,0 +1,130 @@ +voice_group rg_sevii_67 + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 + voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 128, 204, 77, 246 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 51, 0, 203, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 64, 216, 51, 224 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 6, 3 + voice_square_2_alt 60, 0, 3, 0, 2, 7, 2 + voice_square_1_alt 60, 0, 0, 1, 0, 2, 6, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 7, 0 + voice_noise_alt 60, 0, 0, 0, 1, 9, 1 + diff --git a/sound/voicegroups/rg_sevii_route.inc b/sound/voicegroups/rg_sevii_route.inc new file mode 100644 index 000000000000..5b5370a15e03 --- /dev/null +++ b/sound/voicegroups/rg_sevii_route.inc @@ -0,0 +1,130 @@ +voice_group rg_sevii_route + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 2, 5, 2 + voice_square_2_alt 60, 0, 1, 0, 1, 7, 1 + voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 12, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + voice_noise_alt 60, 0, 0, 0, 1, 6, 1 + diff --git a/sound/voicegroups/rg_silph.inc b/sound/voicegroups/rg_silph.inc new file mode 100644 index 000000000000..0de5b368fa62 --- /dev/null +++ b/sound/voicegroups/rg_silph.inc @@ -0,0 +1,130 @@ +voice_group rg_silph + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 108, 137 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 204, 103, 226 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 153 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 236, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 1, 9, 0 + voice_square_2_alt 60, 0, 3, 0, 2, 9, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 1, 0, 9, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + voice_noise_alt 60, 0, 0, 0, 1, 8, 1 + diff --git a/sound/voicegroups/rg_ss_anne.inc b/sound/voicegroups/rg_ss_anne.inc new file mode 100644 index 000000000000..931b86ed10a0 --- /dev/null +++ b/sound/voicegroups/rg_ss_anne.inc @@ -0,0 +1,130 @@ +voice_group rg_ss_anne + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 + voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 204, 77, 246 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_unknown_18, 255, 0, 206, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 5, 2 + voice_square_2_alt 60, 0, 3, 0, 3, 4, 2 + voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_14, 0, 0, 12, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + voice_noise_alt 60, 0, 0, 0, 1, 6, 0 + diff --git a/sound/voicegroups/rg_surf.inc b/sound/voicegroups/rg_surf.inc new file mode 100644 index 000000000000..b134793f73f4 --- /dev/null +++ b/sound/voicegroups/rg_surf.inc @@ -0,0 +1,130 @@ +voice_group rg_surf + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 128, 180, 108, 209 + voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 85, 204, 77, 246 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 0, 10, 6 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 2, 6, 2 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 4 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 0, 12, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 12, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + voice_noise_alt 60, 0, 0, 0, 1, 6, 0 + diff --git a/sound/voicegroups/rg_teachy_tv_menu.inc b/sound/voicegroups/rg_teachy_tv_menu.inc new file mode 100644 index 000000000000..160fbf3d078e --- /dev/null +++ b/sound/voicegroups/rg_teachy_tv_menu.inc @@ -0,0 +1,130 @@ +voice_group rg_teachy_tv_menu + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + diff --git a/sound/voicegroups/rg_title.inc b/sound/voicegroups/rg_title.inc new file mode 100644 index 000000000000..abfea6de70bd --- /dev/null +++ b/sound/voicegroups/rg_title.inc @@ -0,0 +1,130 @@ +voice_group rg_title + voice_keysplit_all voicegroup_frlg_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 165, 180, 165 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 137, 154, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 204, 51, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 153 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 1, 2, 3, 1 + voice_square_2_alt 60, 0, 1, 1, 2, 3, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 2, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 2, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 4, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 1 + diff --git a/sound/voicegroups/rg_unused.inc b/sound/voicegroups/rg_unused.inc new file mode 100644 index 000000000000..8dac5129ad87 --- /dev/null +++ b/sound/voicegroups/rg_unused.inc @@ -0,0 +1,27 @@ +voice_group rg_unused + voice_keysplit_all voicegroup_frlg_fanfare_drumset_1 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 9, 1 + voice_square_2_alt 60, 0, 2, 0, 2, 9, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 154, 127 + diff --git a/sound/voicegroups/rg_unused_2.inc b/sound/voicegroups/rg_unused_2.inc new file mode 100644 index 000000000000..3b46ec977774 --- /dev/null +++ b/sound/voicegroups/rg_unused_2.inc @@ -0,0 +1,6 @@ +voice_group rg_unused_2 + voice_keysplit_all voicegroup_frlg_drumset + voice_square_1_alt 60, 0, 0, 2, 0, 2, 3, 1 + voice_square_2_alt 60, 0, 2, 0, 2, 3, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + diff --git a/sound/voicegroups/rg_vermillion.inc b/sound/voicegroups/rg_vermillion.inc new file mode 100644 index 000000000000..8c840c14c1c4 --- /dev/null +++ b/sound/voicegroups/rg_vermillion.inc @@ -0,0 +1,130 @@ +voice_group rg_vermillion + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 + voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 204, 77, 246 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 2, 5, 2 + voice_square_2_alt 60, 0, 3, 0, 2, 6, 3 + voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_14, 0, 0, 12, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + voice_noise_alt 60, 0, 0, 0, 1, 6, 0 + diff --git a/sound/voicegroups/rg_victory_gym_leader.inc b/sound/voicegroups/rg_victory_gym_leader.inc new file mode 100644 index 000000000000..76b53e7c3247 --- /dev/null +++ b/sound/voicegroups/rg_victory_gym_leader.inc @@ -0,0 +1,93 @@ +voice_group rg_victory_gym_leader + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 1, 7, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 0 + voice_square_2_alt 60, 0, 2, 0, 2, 0, 0 + voice_square_2_alt 60, 0, 3, 0, 1, 7, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 0, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 + diff --git a/sound/voicegroups/rg_victory_road.inc b/sound/voicegroups/rg_victory_road.inc new file mode 100644 index 000000000000..5b578c74e441 --- /dev/null +++ b/sound/voicegroups/rg_victory_road.inc @@ -0,0 +1,95 @@ +voice_group rg_victory_road + voice_keysplit_all voicegroup_frlg_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 97, 236 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 127, 154, 235 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 0, 10, 0 + voice_square_2_alt 60, 0, 1, 0, 0, 10, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_4, 0, 0, 12, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 0, 12, 0 + diff --git a/sound/voicegroups/rg_victory_trainer.inc b/sound/voicegroups/rg_victory_trainer.inc new file mode 100644 index 000000000000..eb1d34f117c5 --- /dev/null +++ b/sound/voicegroups/rg_victory_trainer.inc @@ -0,0 +1,130 @@ +voice_group rg_victory_trainer + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 4, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/rg_victory_wild.inc b/sound/voicegroups/rg_victory_wild.inc new file mode 100644 index 000000000000..bb48fcadea03 --- /dev/null +++ b/sound/voicegroups/rg_victory_wild.inc @@ -0,0 +1,86 @@ +voice_group rg_victory_wild + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 1, 0, 1, 7, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 7, 1 + voice_square_2_alt 60, 0, 2, 0, 1, 0, 0 + diff --git a/sound/voicegroups/rg_viridian_forest.inc b/sound/voicegroups/rg_viridian_forest.inc new file mode 100644 index 000000000000..4c703102c95e --- /dev/null +++ b/sound/voicegroups/rg_viridian_forest.inc @@ -0,0 +1,130 @@ +voice_group rg_viridian_forest + voice_keysplit_all voicegroup_frlg_drumset + voice_directsound 60, 0, DirectSoundWaveData_steinway_b_piano, 255, 165, 103, 235 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 85, 249, 25, 226 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 43, 76, 103, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 2, 4, 4 + voice_square_1_alt 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 9, 0 + voice_noise_alt 60, 0, 0, 0, 1, 6, 2 + diff --git a/sound/voicegroups/rg_vs_champion.inc b/sound/voicegroups/rg_vs_champion.inc new file mode 100644 index 000000000000..9068f8d50412 --- /dev/null +++ b/sound/voicegroups/rg_vs_champion.inc @@ -0,0 +1,130 @@ +voice_group rg_vs_champion + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 108, 137 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 204, 103, 226 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 153 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 255, 0, 255, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 236, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 9, 0 + voice_square_2_alt 60, 0, 3, 0, 1, 10, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 1, 0, 9, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + voice_noise_alt 60, 0, 0, 0, 1, 8, 1 + diff --git a/sound/voicegroups/rg_vs_deoxys.inc b/sound/voicegroups/rg_vs_deoxys.inc new file mode 100644 index 000000000000..172ec41bd040 --- /dev/null +++ b/sound/voicegroups/rg_vs_deoxys.inc @@ -0,0 +1,130 @@ +voice_group rg_vs_deoxys + voice_keysplit_all voicegroup_frlg_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 128, 0, 255, 214 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 128, 0, 255, 206 + voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 85, 0, 154, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 209 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + voice_noise_alt 60, 0, 0, 0, 1, 6, 1 + diff --git a/sound/voicegroups/rg_vs_gym_leader.inc b/sound/voicegroups/rg_vs_gym_leader.inc new file mode 100644 index 000000000000..85d7705a274e --- /dev/null +++ b/sound/voicegroups/rg_vs_gym_leader.inc @@ -0,0 +1,130 @@ +voice_group rg_vs_gym_leader + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 188, 103, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 165, 154, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 165, 180, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 2, 7, 2 + voice_square_2_alt 60, 0, 3, 0, 3, 6, 2 + voice_square_2_alt 60, 0, 3, 0, 2, 6, 5 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 3, 6, 5 + voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 1, 9, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 2, 6, 3 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 2 + voice_noise_alt 60, 0, 0, 0, 1, 6, 0 + diff --git a/sound/voicegroups/rg_vs_trainer.inc b/sound/voicegroups/rg_vs_trainer.inc new file mode 100644 index 000000000000..265366c166eb --- /dev/null +++ b/sound/voicegroups/rg_vs_trainer.inc @@ -0,0 +1,130 @@ +voice_group rg_vs_trainer + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 4, 4, 4 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_unused_sc88pro_unison_slap, 255, 165, 180, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 1, 0, 1, 7, 5 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 2, 3, 1 + voice_square_1_alt 60, 0, 0, 0, 0, 2, 7, 5 + voice_square_1_alt 60, 0, 0, 3, 0, 2, 6, 5 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + voice_noise_alt 60, 0, 0, 0, 1, 6, 0 + diff --git a/sound/voicegroups/rg_vs_wild.inc b/sound/voicegroups/rg_vs_wild.inc new file mode 100644 index 000000000000..b006a5dc2b60 --- /dev/null +++ b/sound/voicegroups/rg_vs_wild.inc @@ -0,0 +1,130 @@ +voice_group rg_vs_wild + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 2, 6, 5 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 190, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_unused_sc88pro_unison_slap, 255, 165, 180, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 2, 7, 2 + voice_square_2_alt 60, 0, 3, 0, 3, 3, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 3, 6, 5 + voice_square_1_alt 60, 0, 0, 0, 0, 2, 7, 2 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 2, 6, 3 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + voice_noise_alt 60, 0, 0, 0, 1, 6, 1 + diff --git a/sound/voicegroups/roulette.inc b/sound/voicegroups/roulette.inc new file mode 100644 index 000000000000..351d2321737a --- /dev/null +++ b/sound/voicegroups/roulette.inc @@ -0,0 +1,84 @@ +voice_group roulette + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 2, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 0 + diff --git a/sound/voicegroups/route101.inc b/sound/voicegroups/route101.inc new file mode 100644 index 000000000000..2fb66ade3e47 --- /dev/null +++ b/sound/voicegroups/route101.inc @@ -0,0 +1,130 @@ +voice_group route101 + voice_keysplit_all voicegroup_route101_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 2, 4, 0 + voice_square_2_alt 60, 0, 3, 0, 2, 4, 0 + voice_square_2_alt 60, 0, 2, 0, 3, 0, 0 + voice_square_2_alt 60, 0, 2, 0, 3, 0, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 3, 0, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 1, 1, 7, 1 + voice_square_1_alt 60, 0, 0, 2, 1, 1, 7, 1 + voice_square_1_alt 60, 0, 0, 2, 0, 0, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/route104.inc b/sound/voicegroups/route104.inc new file mode 100644 index 000000000000..9a4056df7074 --- /dev/null +++ b/sound/voicegroups/route104.inc @@ -0,0 +1,130 @@ +voice_group route104 + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 204 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 204, 193, 239 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 1, 6, 2 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 1, 7, 15, 2 + voice_square_2_alt 60, 0, 1, 1, 1, 4, 1 + voice_square_1_alt 60, 0, 0, 1, 1, 2, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 1, 6, 1 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 6, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/route110.inc b/sound/voicegroups/route110.inc new file mode 100644 index 000000000000..30cb3dedf561 --- /dev/null +++ b/sound/voicegroups/route110.inc @@ -0,0 +1,86 @@ +voice_group route110 + voice_keysplit_all voicegroup_route110_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 3, 0, 4, 0, 1 + voice_square_1 60, 0, 0, 3, 0, 4, 0, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 204 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 3, 0, 1, 7, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2 + voice_square_1 60, 0, 0, 3, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 3, 0, 0, 7, 1 + diff --git a/sound/voicegroups/route111.inc b/sound/voicegroups/route111.inc new file mode 100644 index 000000000000..b4ef9e9fae4b --- /dev/null +++ b/sound/voicegroups/route111.inc @@ -0,0 +1,130 @@ +voice_group route111 + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 204 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 204, 193, 239 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 + voice_square_1_alt 60, 0, 0, 3, 0, 1, 6, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_4, 0, 7, 15, 2 + voice_square_2_alt 60, 0, 1, 1, 1, 4, 1 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 1, 6, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/route113.inc b/sound/voicegroups/route113.inc new file mode 100644 index 000000000000..975115509725 --- /dev/null +++ b/sound/voicegroups/route113.inc @@ -0,0 +1,130 @@ +voice_group route113 + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/route119.inc b/sound/voicegroups/route119.inc new file mode 100644 index 000000000000..a6b76d54cdde --- /dev/null +++ b/sound/voicegroups/route119.inc @@ -0,0 +1,90 @@ +voice_group route119 + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 7, 3, 3 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 204, 51, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 239 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 4, 4, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 3, 6, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 3, 3, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 12, 1 + voice_square_2_alt 60, 0, 1, 0, 1, 4, 3 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 0, 0, 2, 4, 0 + diff --git a/sound/voicegroups/route120.inc b/sound/voicegroups/route120.inc new file mode 100644 index 000000000000..b1a529d29273 --- /dev/null +++ b/sound/voicegroups/route120.inc @@ -0,0 +1,87 @@ +voice_group route120 + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 1, 6, 1 + voice_square_1_alt 60, 0, 0, 3, 0, 1, 6, 1 + voice_square_2_alt 60, 0, 2, 0, 1, 6, 1 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 6, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 1, 7, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 + voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 0 + diff --git a/sound/voicegroups/route122.inc b/sound/voicegroups/route122.inc new file mode 100644 index 000000000000..a18d0142dfdc --- /dev/null +++ b/sound/voicegroups/route122.inc @@ -0,0 +1,89 @@ +voice_group route122 + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 2, 0, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 1, 6, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 1, 6, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 0, 6, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 0, 0, 1, 7, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 7, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 1 + voice_square_1_alt 60, 0, 0, 0, 0, 0, 7, 0 + diff --git a/sound/voicegroups/rs_sfx_1.inc b/sound/voicegroups/rs_sfx_1.inc new file mode 100644 index 000000000000..d07f1d88120c --- /dev/null +++ b/sound/voicegroups/rs_sfx_1.inc @@ -0,0 +1,130 @@ +voice_group rs_sfx_1 + voice_directsound 60, 0, DirectSoundWaveData_unknown_synth_snare, 255, 249, 103, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 0, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 2, 0, 1 + voice_square_1_alt 60, 0, 0, 2, 0, 4, 0, 1 + voice_square_1_alt 60, 0, 44, 2, 0, 4, 0, 0 + voice_square_1_alt 60, 0, 38, 0, 0, 4, 0, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 7, 0, 0 + voice_square_1_alt 60, 0, 0, 2, 2, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 2, 0, 15, 0 + voice_square_1_alt 60, 0, 23, 1, 0, 1, 9, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 165 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 226, 0, 165 + voice_square_1_alt 60, 0, 0, 2, 0, 6, 0, 1 + voice_square_1_alt 60, 0, 36, 0, 0, 2, 0, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 1, 0, 1 + voice_square_1_alt 60, 0, 0, 3, 0, 1, 0, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 46, 2, 0, 4, 0, 0 + voice_square_1_alt 60, 0, 38, 2, 0, 4, 0, 0 + voice_square_1_alt 60, 0, 119, 2, 0, 0, 15, 1 + voice_square_1_alt 60, 0, 0, 2, 0, 0, 15, 1 + voice_square_1_alt 60, 0, 106, 2, 0, 2, 0, 0 + voice_square_1_alt 60, 0, 23, 2, 0, 1, 9, 0 + voice_square_1_alt 60, 0, 21, 2, 0, 1, 9, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 0, 15, 1 + voice_square_1_alt 60, 0, 47, 2, 0, 2, 6, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise 60, 0, 0, 0, 7, 15, 0 + voice_noise 60, 0, 0, 2, 7, 15, 0 + voice_noise_alt 60, 0, 0, 2, 0, 15, 0 + voice_noise_alt 60, 0, 1, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 3, 0, 0 + voice_noise_alt 60, 0, 0, 0, 2, 0, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 1 + diff --git a/sound/voicegroups/rs_sfx_2.inc b/sound/voicegroups/rs_sfx_2.inc new file mode 100644 index 000000000000..b93f29b0ff54 --- /dev/null +++ b/sound/voicegroups/rs_sfx_2.inc @@ -0,0 +1,130 @@ +voice_group rs_sfx_2 + voice_directsound_no_resample 60, 0, DirectSoundWaveData_bicycle_bell, 255, 249, 0, 165 + voice_directsound_alt 60, 0, DirectSoundWaveData_bicycle_bell, 255, 0, 255, 165 + voice_directsound 60, 0, DirectSoundWaveData_unknown_synth_snare, 255, 0, 255, 165 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 242, 0, 127 + voice_noise_alt 60, 0, 0, 0, 1, 0, 1 + voice_noise_alt 60, 0, 1, 0, 1, 0, 1 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 255, 165 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 0, 1 + voice_directsound 60, 0, DirectSoundWaveData_unknown_1, 255, 0, 255, 165 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_unknown_2, 255, 0, 255, 127 + voice_noise_alt 60, 0, 1, 0, 2, 0, 0 + voice_square_1 60, 0, 103, 3, 2, 7, 0, 0 + voice_square_2 60, 0, 3, 2, 7, 0, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 226, 0, 127 + voice_directsound 60, 0, DirectSoundWaveData_unknown_3, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 204, 0, 127 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 0, 1 + voice_directsound 60, 0, DirectSoundWaveData_unknown_4, 255, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 127 + voice_square_1 60, 0, 103, 0, 0, 7, 0, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_wind, 255, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_bubbles, 255, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 127 + voice_noise_alt 60, 0, 0, 0, 7, 15, 1 + voice_directsound 60, 0, DirectSoundWaveData_unknown_5, 255, 0, 255, 127 + voice_noise_alt 60, 0, 1, 0, 7, 15, 1 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 246, 0, 127 + voice_directsound 60, 0, DirectSoundWaveData_unknown_6, 255, 0, 255, 127 + voice_square_1_alt 60, 0, 19, 2, 0, 2, 0, 0 + voice_directsound 60, 0, DirectSoundWaveData_trinity_30303_mega_bass, 255, 0, 255, 127 + voice_square_1 60, 0, 103, 0, 0, 0, 15, 0 + voice_directsound_alt 60, 0, DirectSoundWaveData_unknown_6, 255, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 255, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_unknown_7, 255, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_trinity_30303_mega_bass, 255, 242, 0, 0 + voice_directsound 60, 0, DirectSoundWaveData_unknown_8, 255, 0, 255, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_directsound 60, 0, DirectSoundWaveData_unknown_close_hihat, 255, 127, 0, 188 + voice_directsound 60, 0, DirectSoundWaveData_unknown_9, 255, 249, 0, 165 + voice_square_1 60, 0, 0, 0, 4, 6, 0, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 13, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 13, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_trinity_big_boned, 255, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 252, 0, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_square_1 60, 0, 0, 0, 4, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 188, 0, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 226, 0, 127 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 26, 0, 255, 127 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 0, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 252, 0, 127 + voice_square_1_alt 60, 0, 0, 1, 0, 2, 0, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 127, 0, 127 + voice_noise_alt 60, 0, 0, 1, 6, 0, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 255, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_unknown_10, 255, 255, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_french_horn_72, 11, 242, 0, 127 + voice_square_1_alt 60, 0, 0, 2, 4, 6, 0, 0 + voice_directsound 60, 0, DirectSoundWaveData_unknown_11, 255, 255, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 + voice_directsound 60, 0, DirectSoundWaveData_unused_sc55_tom, 255, 0, 255, 165 + voice_noise_alt 60, 0, 0, 5, 7, 15, 1 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 128, 242, 0, 165 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_string_ensemble_72, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 0, 1, 5, 0, 0 + voice_noise_alt 60, 0, 0, 6, 6, 0, 1 + voice_noise_alt 60, 0, 0, 3, 6, 0, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_trinity_30303_mega_bass, 15, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_unknown_12, 255, 0, 255, 165 + voice_directsound 60, 0, DirectSoundWaveData_unknown_13, 255, 0, 255, 165 + voice_directsound 60, 0, DirectSoundWaveData_unknown_14, 255, 0, 255, 165 + voice_directsound 60, 0, DirectSoundWaveData_unknown_15, 255, 0, 255, 165 + voice_directsound 60, 0, DirectSoundWaveData_unknown_16, 255, 0, 255, 165 + voice_directsound 60, 0, DirectSoundWaveData_unknown_17, 255, 0, 255, 165 + diff --git a/sound/voicegroups/rustboro.inc b/sound/voicegroups/rustboro.inc new file mode 100644 index 000000000000..035c96f073aa --- /dev/null +++ b/sound/voicegroups/rustboro.inc @@ -0,0 +1,130 @@ +voice_group rustboro + voice_keysplit_all voicegroup_rs_drumset + voice_square_1_alt 60, 0, 0, 1, 0, 2, 0, 1 + voice_square_1_alt 60, 0, 0, 3, 1, 2, 6, 0 + voice_square_2_alt 60, 0, 3, 1, 2, 6, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 1, 0, 2, 0, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_4, 1, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/safari_zone.inc b/sound/voicegroups/safari_zone.inc new file mode 100644 index 000000000000..29eb4db8611b --- /dev/null +++ b/sound/voicegroups/safari_zone.inc @@ -0,0 +1,130 @@ +voice_group safari_zone + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 0 + voice_square_2_alt 60, 0, 2, 0, 1, 4, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 4, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/sailing.inc b/sound/voicegroups/sailing.inc new file mode 100644 index 000000000000..4dc40de7d92c --- /dev/null +++ b/sound/voicegroups/sailing.inc @@ -0,0 +1,130 @@ +voice_group sailing + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 196 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 4, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/school.inc b/sound/voicegroups/school.inc new file mode 100644 index 000000000000..8490de2e67f9 --- /dev/null +++ b/sound/voicegroups/school.inc @@ -0,0 +1,4 @@ +voice_group school + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + diff --git a/sound/voicegroups/sealed_chamber.inc b/sound/voicegroups/sealed_chamber.inc new file mode 100644 index 000000000000..98fda0afa64e --- /dev/null +++ b/sound/voicegroups/sealed_chamber.inc @@ -0,0 +1,130 @@ +voice_group sealed_chamber + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 0 + voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/slateport.inc b/sound/voicegroups/slateport.inc new file mode 100644 index 000000000000..10aea36b3394 --- /dev/null +++ b/sound/voicegroups/slateport.inc @@ -0,0 +1,130 @@ +voice_group slateport + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 2, 4, 1 + voice_square_2_alt 60, 0, 0, 0, 1, 6, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 6, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 2, 4, 1 + voice_square_2_alt 60, 0, 3, 0, 1, 6, 2 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 6, 5 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 4, 4 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 1, 6, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/sootopolis.inc b/sound/voicegroups/sootopolis.inc new file mode 100644 index 000000000000..742e4e4dfa3f --- /dev/null +++ b/sound/voicegroups/sootopolis.inc @@ -0,0 +1,130 @@ +voice_group sootopolis + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 72, 249 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 5, 2 + voice_square_2_alt 60, 0, 2, 0, 1, 5, 2 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 7, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 2, 6, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/surf.inc b/sound/voicegroups/surf.inc new file mode 100644 index 000000000000..924a9c783278 --- /dev/null +++ b/sound/voicegroups/surf.inc @@ -0,0 +1,93 @@ +voice_group surf + voice_keysplit_all voicegroup_rs_drumset + voice_square_2_alt 60, 0, 2, 0, 3, 3, 1 + voice_square_1_alt 60, 0, 0, 2, 0, 3, 3, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 1, 7, 2 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 2 + voice_square_2_alt 60, 0, 2, 1, 1, 0, 0 + voice_square_1_alt 60, 0, 0, 2, 1, 1, 0, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 1, 1, 7, 2 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2 + voice_square_1_alt 60, 0, 0, 2, 1, 1, 7, 2 + voice_square_2_alt 60, 0, 3, 1, 1, 7, 2 + voice_square_1_alt 60, 0, 0, 3, 1, 1, 7, 2 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 3 + voice_square_1_alt 60, 0, 0, 2, 0, 0, 7, 2 + voice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 2 + voice_square_2_alt 60, 0, 1, 1, 2, 6, 2 + voice_square_1_alt 60, 0, 0, 1, 1, 2, 6, 2 + voice_square_1_alt 60, 0, 0, 1, 0, 0, 6, 2 + diff --git a/sound/voicegroups/title.inc b/sound/voicegroups/title.inc new file mode 100644 index 000000000000..629171779c44 --- /dev/null +++ b/sound/voicegroups/title.inc @@ -0,0 +1,91 @@ +voice_group title + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 1, 1, 1, 6, 2 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 239 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 6, 2 + voice_square_2_alt 60, 0, 2, 0, 1, 6, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 + voice_square_1_alt 60, 0, 0, 1, 1, 2, 4, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 1, 6, 2 + diff --git a/sound/voicegroups/trick_house.inc b/sound/voicegroups/trick_house.inc new file mode 100644 index 000000000000..beb29c395f3a --- /dev/null +++ b/sound/voicegroups/trick_house.inc @@ -0,0 +1,130 @@ +voice_group trick_house + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 72, 249 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 7, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/underwater.inc b/sound/voicegroups/underwater.inc new file mode 100644 index 000000000000..40d42107dee8 --- /dev/null +++ b/sound/voicegroups/underwater.inc @@ -0,0 +1,130 @@ +voice_group underwater + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 188, 51, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 128, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_bubbles, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 1, 4, 10, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 1, 5, 9, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/unused.inc b/sound/voicegroups/unused.inc new file mode 100644 index 000000000000..ee5a89b71557 --- /dev/null +++ b/sound/voicegroups/unused.inc @@ -0,0 +1,130 @@ +voice_group unused + voice_square_1_alt 60, 0, 38, 2, 1, 0, 0, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 36, 2, 0, 1, 4, 2 + voice_square_1_alt 60, 0, 21, 2, 0, 0, 15, 2 + diff --git a/sound/voicegroups/unused_2.inc b/sound/voicegroups/unused_2.inc new file mode 100644 index 000000000000..d2e1a4cf04a1 --- /dev/null +++ b/sound/voicegroups/unused_2.inc @@ -0,0 +1,130 @@ +voice_group unused_2 + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion_duplicate, 255, 249, 25, 248 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + diff --git a/sound/voicegroups/verdanturf.inc b/sound/voicegroups/verdanturf.inc new file mode 100644 index 000000000000..afaeca5043ef --- /dev/null +++ b/sound/voicegroups/verdanturf.inc @@ -0,0 +1,83 @@ +voice_group verdanturf + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 5, 1, 7 + voice_square_2_alt 60, 0, 3, 0, 4, 3, 6 + voice_square_2_alt 60, 0, 2, 1, 1, 4, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 224 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 + diff --git a/sound/voicegroups/victory_aqua_magma.inc b/sound/voicegroups/victory_aqua_magma.inc new file mode 100644 index 000000000000..f507d1fc9802 --- /dev/null +++ b/sound/voicegroups/victory_aqua_magma.inc @@ -0,0 +1,130 @@ +voice_group victory_aqua_magma + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 4, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/victory_gym_leader.inc b/sound/voicegroups/victory_gym_leader.inc new file mode 100644 index 000000000000..18dc32f56808 --- /dev/null +++ b/sound/voicegroups/victory_gym_leader.inc @@ -0,0 +1,93 @@ +voice_group victory_gym_leader + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 1, 7, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 0 + voice_square_2_alt 60, 0, 2, 0, 2, 0, 0 + voice_square_2_alt 60, 0, 3, 0, 1, 7, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 2, 0, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 + diff --git a/sound/voicegroups/victory_league.inc b/sound/voicegroups/victory_league.inc new file mode 100644 index 000000000000..5e5b517bc46b --- /dev/null +++ b/sound/voicegroups/victory_league.inc @@ -0,0 +1,90 @@ +voice_group victory_league + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 2, 7, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 2, 0, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 1, 7, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 + voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 0 + voice_square_2_alt 60, 0, 3, 0, 1, 0, 0 + voice_square_1_alt 60, 0, 0, 3, 0, 1, 0, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 7, 0 + diff --git a/sound/voicegroups/victory_road.inc b/sound/voicegroups/victory_road.inc new file mode 100644 index 000000000000..eb20af9e8e02 --- /dev/null +++ b/sound/voicegroups/victory_road.inc @@ -0,0 +1,130 @@ +voice_group victory_road + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 2, 3, 1 + voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 + voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 2, 3, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 3, 4, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/victory_trainer.inc b/sound/voicegroups/victory_trainer.inc new file mode 100644 index 000000000000..c4674a9cdeb4 --- /dev/null +++ b/sound/voicegroups/victory_trainer.inc @@ -0,0 +1,130 @@ +voice_group victory_trainer + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 + voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 4, 0 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/sound/voicegroups/victory_wild.inc b/sound/voicegroups/victory_wild.inc new file mode 100644 index 000000000000..de3083616819 --- /dev/null +++ b/sound/voicegroups/victory_wild.inc @@ -0,0 +1,86 @@ +voice_group victory_wild + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 1, 0, 1, 7, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 + voice_square_1_alt 60, 0, 0, 1, 0, 1, 7, 1 + voice_square_2_alt 60, 0, 2, 0, 1, 0, 0 + diff --git a/sound/voicegroups/voicegroup000.inc b/sound/voicegroups/voicegroup000.inc deleted file mode 100644 index 7a2c5772f9c4..000000000000 --- a/sound/voicegroups/voicegroup000.inc +++ /dev/null @@ -1,65 +0,0 @@ - .align 2 -voicegroup000:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 2, 0, 0, 9, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 235 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 204, 193, 239 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - diff --git a/sound/voicegroups/voicegroup001.inc b/sound/voicegroups/voicegroup001.inc deleted file mode 100644 index 20a2795dc1c3..000000000000 --- a/sound/voicegroups/voicegroup001.inc +++ /dev/null @@ -1,32 +0,0 @@ - .align 2 -voicegroup001:: - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 1, 6, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 2, 0, 1, 6, 0 - voice_programmable_wave 60, 0, ProgrammableWaveData_3, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 1, 6, 0 - voice_square_2 60, 0, 3, 0, 1, 6, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 0, 0, 1, 6, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 255, 0, 255, 0 - diff --git a/sound/voicegroups/voicegroup002.inc b/sound/voicegroups/voicegroup002.inc deleted file mode 100644 index bd6f080aa44a..000000000000 --- a/sound/voicegroups/voicegroup002.inc +++ /dev/null @@ -1,57 +0,0 @@ - .align 2 -voicegroup002:: - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_oboe, 255, 165, 154, 127 - voice_directsound 60, 0, DirectSoundWaveData_unused_sd90_oboe, 255, 165, 154, 127 - voice_directsound 60, 0, DirectSoundWaveData_unused_guitar_separates_power_chord, 255, 165, 206, 127 - voice_directsound 60, 0, DirectSoundWaveData_unused_sc88pro_unison_slap, 255, 165, 206, 127 - voice_directsound 60, 0, DirectSoundWaveData_unknown_snare, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_ohtsuzumi, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_hyoushigi, 255, 0, 255, 0 - voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_kick, 255, 0, 255, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 - voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 - voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 - voice_directsound 48, 44, DirectSoundWaveData_unused_sc55_tom, 255, 210, 77, 204 - voice_directsound_no_resample 60, 79, DirectSoundWaveData_unknown_close_hihat, 255, 127, 0, 188 - voice_directsound 51, 54, DirectSoundWaveData_unused_sc55_tom, 255, 216, 77, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 54, 64, DirectSoundWaveData_unused_sc55_tom, 255, 216, 77, 204 - voice_directsound_no_resample 60, 79, DirectSoundWaveData_unknown_open_hihat, 255, 242, 141, 0 - voice_directsound 57, 69, DirectSoundWaveData_unused_sc55_tom, 255, 210, 77, 204 - voice_directsound 60, 79, DirectSoundWaveData_unused_sc55_tom, 255, 204, 77, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 62, 84, DirectSoundWaveData_unused_sc55_tom, 255, 204, 77, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 70, 49, DirectSoundWaveData_unknown_bell, 255, 165, 103, 231 - voice_directsound_no_resample 32, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 - voice_directsound_no_resample 60, 14, DirectSoundWaveData_trinity_cymbal_crash, 255, 235, 0, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 30, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 30, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216 - voice_directsound_no_resample 30, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 72, 104, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 72, 94, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_drum_and_percussion_kick, 255, 0, 255, 0 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 180, 175, 228 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 0, 255, 242 - voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 - voice_directsound 64, 24, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 - voice_directsound_no_resample 64, 80, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 - voice_directsound 68, 34, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 - voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 - voice_directsound 72, 44, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 - voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 - voice_directsound 76, 84, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 - voice_directsound 80, 94, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 - voice_directsound_no_resample 33, 89, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 - voice_directsound 84, 104, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 235 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 63, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 - voice_directsound_no_resample 64, 24, DirectSoundWaveData_dance_drums_ride_bell, 255, 165, 103, 231 - diff --git a/sound/voicegroups/voicegroup003.inc b/sound/voicegroups/voicegroup003.inc deleted file mode 100644 index d77150fc1248..000000000000 --- a/sound/voicegroups/voicegroup003.inc +++ /dev/null @@ -1,57 +0,0 @@ - .align 2 -voicegroup003:: - voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 - voice_directsound_no_resample 64, 14, DirectSoundWaveData_trinity_cymbal_crash, 255, 231, 0, 188 - voice_directsound_no_resample 64, 89, DirectSoundWaveData_sd90_cowbell, 255, 0, 255, 242 - voice_directsound_no_resample 64, 29, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 - voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216 - voice_directsound_no_resample 64, 94, DirectSoundWaveData_unused_heart_of_asia_indian_drum, 255, 0, 255, 0 - voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 - voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 - voice_directsound_no_resample 64, 90, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 - voice_directsound_no_resample 64, 79, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 - voice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 165, 103, 188 - voice_directsound_no_resample 64, 24, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 64, 104, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 - voice_directsound 63, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0 - voice_directsound 50, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 - voice_directsound 64, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 - voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 180, 175, 228 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 0, 255, 242 - voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 - voice_directsound 64, 24, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 - voice_directsound_no_resample 64, 80, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 - voice_directsound 68, 34, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 - voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 - voice_directsound 72, 44, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 76, 84, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 - voice_directsound 80, 94, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 - voice_directsound_no_resample 33, 89, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 - voice_directsound 64, 104, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 235 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 63, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 - voice_directsound_no_resample 64, 24, DirectSoundWaveData_dance_drums_ride_bell, 255, 165, 103, 231 - diff --git a/sound/voicegroups/voicegroup004.inc b/sound/voicegroups/voicegroup004.inc deleted file mode 100644 index 6aa28d6a9f11..000000000000 --- a/sound/voicegroups/voicegroup004.inc +++ /dev/null @@ -1,93 +0,0 @@ - .align 2 -voicegroup004:: - voice_directsound_no_resample 66, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 - voice_directsound_no_resample 64, 14, DirectSoundWaveData_trinity_cymbal_crash, 255, 231, 0, 188 - voice_directsound_no_resample 64, 89, DirectSoundWaveData_sd90_cowbell, 255, 0, 255, 242 - voice_directsound_no_resample 64, 29, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 - voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216 - voice_directsound_no_resample 64, 94, DirectSoundWaveData_unused_heart_of_asia_indian_drum, 255, 0, 255, 0 - voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 - voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 - voice_directsound_no_resample 64, 90, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 61, 84, DirectSoundWaveData_ethnic_flavours_hyoushigi, 255, 0, 255, 0 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_ethnic_flavours_ohtsuzumi, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 - voice_directsound_no_resample 64, 79, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 - voice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 165, 103, 188 - voice_directsound_no_resample 64, 24, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 64, 104, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 - voice_directsound 63, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0 - voice_directsound 50, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 - voice_directsound 64, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 - voice_directsound 62, 64, DirectSoundWaveData_drum_and_percussion_kick, 255, 0, 255, 0 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 180, 175, 228 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 0, 255, 242 - voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 - voice_directsound 65, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 - voice_directsound 64, 24, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 - voice_directsound_no_resample 64, 80, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 - voice_directsound 68, 34, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 - voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 - voice_directsound 72, 44, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 76, 84, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 - voice_directsound 80, 94, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 - voice_directsound 56, 89, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 - voice_directsound 64, 104, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 235 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 63, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 - voice_directsound_no_resample 64, 24, DirectSoundWaveData_dance_drums_ride_bell, 255, 165, 103, 231 - voice_directsound_no_resample 66, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 - voice_directsound 64, 14, DirectSoundWaveData_trinity_cymbal_crash, 255, 231, 0, 188 - voice_directsound 64, 89, DirectSoundWaveData_sd90_cowbell, 255, 0, 255, 242 - voice_directsound 60, 29, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 58, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 - voice_directsound 62, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216 - voice_directsound 64, 94, DirectSoundWaveData_unused_heart_of_asia_indian_drum, 255, 0, 255, 0 - voice_directsound 64, 34, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 - voice_directsound 64, 34, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 - voice_directsound 64, 90, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 61, 84, DirectSoundWaveData_ethnic_flavours_hyoushigi, 255, 0, 255, 0 - voice_directsound 64, 64, DirectSoundWaveData_ethnic_flavours_ohtsuzumi, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 - voice_directsound 64, 79, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 - voice_directsound 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 165, 103, 188 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 64, 104, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 - voice_directsound 63, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0 - voice_directsound 50, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 - voice_directsound 64, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 - diff --git a/sound/voicegroups/voicegroup005.inc b/sound/voicegroups/voicegroup005.inc deleted file mode 100644 index 584451a62fc3..000000000000 --- a/sound/voicegroups/voicegroup005.inc +++ /dev/null @@ -1,7 +0,0 @@ - .align 2 -voicegroup005:: - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_piano1_48, 255, 252, 0, 239 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_piano1_60, 255, 250, 0, 221 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_piano1_72, 255, 250, 0, 221 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_piano1_84, 255, 247, 0, 221 - diff --git a/sound/voicegroups/voicegroup006.inc b/sound/voicegroups/voicegroup006.inc deleted file mode 100644 index 52b2b335f256..000000000000 --- a/sound/voicegroups/voicegroup006.inc +++ /dev/null @@ -1,6 +0,0 @@ - .align 2 -voicegroup006:: - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_string_ensemble_60, 255, 0, 255, 196 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_string_ensemble_72, 255, 0, 255, 196 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_string_ensemble_84, 255, 0, 255, 196 - diff --git a/sound/voicegroups/voicegroup007.inc b/sound/voicegroups/voicegroup007.inc deleted file mode 100644 index 66bcd3fa6c32..000000000000 --- a/sound/voicegroups/voicegroup007.inc +++ /dev/null @@ -1,134 +0,0 @@ - .align 2 -voicegroup007:: - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_trumpet_60, 255, 0, 193, 127 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_trumpet_72, 255, 0, 193, 127 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_trumpet_84, 255, 0, 193, 127 - voice_square_1_alt 60, 0, 38, 2, 1, 0, 0, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 36, 2, 0, 1, 4, 2 - voice_square_1_alt 60, 0, 21, 2, 0, 0, 15, 2 - diff --git a/sound/voicegroups/voicegroup008.inc b/sound/voicegroups/voicegroup008.inc deleted file mode 100644 index 7fc874e87aad..000000000000 --- a/sound/voicegroups/voicegroup008.inc +++ /dev/null @@ -1,5 +0,0 @@ - .align 2 -voicegroup008:: - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tuba_39, 255, 0, 255, 165 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tuba_51, 255, 0, 255, 165 - diff --git a/sound/voicegroups/voicegroup009.inc b/sound/voicegroups/voicegroup009.inc deleted file mode 100644 index 4a51a02ca37d..000000000000 --- a/sound/voicegroups/voicegroup009.inc +++ /dev/null @@ -1,5 +0,0 @@ - .align 2 -voicegroup009:: - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_french_horn_60, 255, 0, 224, 165 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_french_horn_72, 255, 0, 218, 165 - diff --git a/sound/voicegroups/voicegroup010.inc b/sound/voicegroups/voicegroup010.inc deleted file mode 100644 index 8d0f7a56dd93..000000000000 --- a/sound/voicegroups/voicegroup010.inc +++ /dev/null @@ -1,87 +0,0 @@ - .align 2 -voicegroup010:: - voice_keysplit_all voicegroup031 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 3, 0, 4, 0, 1 - voice_square_1 60, 0, 0, 3, 0, 4, 0, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 204 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 3, 0, 1, 7, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2 - voice_square_1 60, 0, 0, 3, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 3, 0, 0, 7, 1 - diff --git a/sound/voicegroups/voicegroup011.inc b/sound/voicegroups/voicegroup011.inc deleted file mode 100644 index 5527cc3698c2..000000000000 --- a/sound/voicegroups/voicegroup011.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup011:: - voice_keysplit_all voicegroup022 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 2, 4, 0 - voice_square_2_alt 60, 0, 3, 0, 2, 4, 0 - voice_square_2_alt 60, 0, 2, 0, 3, 0, 0 - voice_square_2_alt 60, 0, 2, 0, 3, 0, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 3, 0, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 1, 1, 7, 1 - voice_square_1_alt 60, 0, 0, 2, 1, 1, 7, 1 - voice_square_1_alt 60, 0, 0, 2, 0, 0, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup012.inc b/sound/voicegroups/voicegroup012.inc deleted file mode 100644 index 2fe7cf818009..000000000000 --- a/sound/voicegroups/voicegroup012.inc +++ /dev/null @@ -1,105 +0,0 @@ - .align 2 -voicegroup012:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_directsound 60, 0, DirectSoundWaveData_trinity_30303_mega_bass, 255, 178, 180, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 235 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 204 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 1, 7, 1 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 1 - voice_square_2_alt 60, 0, 3, 0, 1, 7, 1 - voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 1 - voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 2, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 29, 2, 0, 2, 0, 0 - voice_square_1_alt 60, 0, 22, 2, 0, 2, 0, 0 - diff --git a/sound/voicegroups/voicegroup013.inc b/sound/voicegroups/voicegroup013.inc deleted file mode 100644 index f99c6f3cdc6f..000000000000 --- a/sound/voicegroups/voicegroup013.inc +++ /dev/null @@ -1,93 +0,0 @@ - .align 2 -voicegroup013:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 1, 0, 1, 7, 1 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 1, 7, 1 - voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 - voice_square_1_alt 60, 0, 0, 1, 0, 0, 7, 1 - voice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 1 - diff --git a/sound/voicegroups/voicegroup014.inc b/sound/voicegroups/voicegroup014.inc deleted file mode 100644 index 6ce0897d103d..000000000000 --- a/sound/voicegroups/voicegroup014.inc +++ /dev/null @@ -1,88 +0,0 @@ - .align 2 -voicegroup014:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 1, 6, 1 - voice_square_1_alt 60, 0, 0, 3, 0, 1, 6, 1 - voice_square_2_alt 60, 0, 2, 0, 1, 6, 1 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 6, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 1, 7, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 - voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 0 - diff --git a/sound/voicegroups/voicegroup015.inc b/sound/voicegroups/voicegroup015.inc deleted file mode 100644 index a5284763561c..000000000000 --- a/sound/voicegroups/voicegroup015.inc +++ /dev/null @@ -1,95 +0,0 @@ - .align 2 -voicegroup015:: - voice_keysplit_all voicegroup016 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 3, 0, 2, 0, 0 - voice_square_1 60, 0, 0, 3, 0, 2, 0, 0 - voice_square_2 60, 0, 3, 0, 6, 0, 0 - voice_square_1 60, 0, 0, 3, 0, 6, 0, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - diff --git a/sound/voicegroups/voicegroup016.inc b/sound/voicegroups/voicegroup016.inc deleted file mode 100644 index 1b17ac49c777..000000000000 --- a/sound/voicegroups/voicegroup016.inc +++ /dev/null @@ -1,68 +0,0 @@ - .align 2 -voicegroup016:: - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 0, 2 - voice_noise_alt 60, 0, 0, 0, 1, 0, 1 - voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_kick, 255, 0, 255, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 32, 74, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 72, 66, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 72, 62, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 - diff --git a/sound/voicegroups/voicegroup017.inc b/sound/voicegroups/voicegroup017.inc deleted file mode 100644 index 06738d297b25..000000000000 --- a/sound/voicegroups/voicegroup017.inc +++ /dev/null @@ -1,94 +0,0 @@ - .align 2 -voicegroup017:: - voice_keysplit_all voicegroup001 - voice_square_2_alt 60, 0, 2, 0, 3, 3, 1 - voice_square_1_alt 60, 0, 0, 2, 0, 3, 3, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 1, 7, 2 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 2 - voice_square_2_alt 60, 0, 2, 1, 1, 0, 0 - voice_square_1_alt 60, 0, 0, 2, 1, 1, 0, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 1, 1, 7, 2 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2 - voice_square_1_alt 60, 0, 0, 2, 1, 1, 7, 2 - voice_square_2_alt 60, 0, 3, 1, 1, 7, 2 - voice_square_1_alt 60, 0, 0, 3, 1, 1, 7, 2 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 3 - voice_square_1_alt 60, 0, 0, 2, 0, 0, 7, 2 - voice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 2 - voice_square_2_alt 60, 0, 1, 1, 2, 6, 2 - voice_square_1_alt 60, 0, 0, 1, 1, 2, 6, 2 - voice_square_1_alt 60, 0, 0, 1, 0, 0, 6, 2 - diff --git a/sound/voicegroups/voicegroup018.inc b/sound/voicegroups/voicegroup018.inc deleted file mode 100644 index 30b63bb26eb7..000000000000 --- a/sound/voicegroups/voicegroup018.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup018:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 0, 0, 1, 7, 1 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 7, 1 - voice_square_1_alt 60, 0, 0, 0, 0, 0, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 1, 7, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 1, 0, 1, 0, 3 - diff --git a/sound/voicegroups/voicegroup019.inc b/sound/voicegroups/voicegroup019.inc deleted file mode 100644 index a983659c3926..000000000000 --- a/sound/voicegroups/voicegroup019.inc +++ /dev/null @@ -1,88 +0,0 @@ - .align 2 -voicegroup019:: - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 1, 0, 1, 7, 1 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 7, 1 - voice_square_2_alt 60, 0, 2, 0, 2, 6, 1 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 6, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 1, 7, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 2 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 1 - voice_square_1_alt 60, 0, 0, 2, 0, 0, 7, 1 - voice_square_1_alt 60, 0, 0, 1, 0, 0, 7, 1 - diff --git a/sound/voicegroups/voicegroup020.inc b/sound/voicegroups/voicegroup020.inc deleted file mode 100644 index 8449fbdd60b3..000000000000 --- a/sound/voicegroups/voicegroup020.inc +++ /dev/null @@ -1,90 +0,0 @@ - .align 2 -voicegroup020:: - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 2, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 1, 7, 1 - voice_square_2_alt 60, 0, 1, 0, 1, 6, 2 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 6, 2 - voice_square_1_alt 60, 0, 0, 1, 0, 0, 6, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 7, 1 - diff --git a/sound/voicegroups/voicegroup021.inc b/sound/voicegroups/voicegroup021.inc deleted file mode 100644 index 43aa9150eede..000000000000 --- a/sound/voicegroups/voicegroup021.inc +++ /dev/null @@ -1,54 +0,0 @@ - .align 2 -voicegroup021:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 2, 0, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 1, 6, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 1, 6, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 0, 6, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - diff --git a/sound/voicegroups/voicegroup022.inc b/sound/voicegroups/voicegroup022.inc deleted file mode 100644 index 877f57d6ce72..000000000000 --- a/sound/voicegroups/voicegroup022.inc +++ /dev/null @@ -1,68 +0,0 @@ - .align 2 -voicegroup022:: - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 0, 0, 1, 7, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 7, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 1 - voice_square_1_alt 60, 0, 0, 0, 0, 0, 7, 0 - voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_kick, 255, 0, 255, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 32, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 72, 67, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 72, 61, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 - diff --git a/sound/voicegroups/voicegroup023.inc b/sound/voicegroups/voicegroup023.inc deleted file mode 100644 index eede8dc019c6..000000000000 --- a/sound/voicegroups/voicegroup023.inc +++ /dev/null @@ -1,92 +0,0 @@ - .align 2 -voicegroup023:: - voice_keysplit voicegroup005, KeySplitTable1 - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 1, 7, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 0 - voice_square_2_alt 60, 0, 2, 0, 1, 6, 1 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 6, 1 - voice_square_2_alt 60, 0, 3, 0, 1, 7, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 0, 7, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 0 - diff --git a/sound/voicegroups/voicegroup024.inc b/sound/voicegroups/voicegroup024.inc deleted file mode 100644 index 3806b462d633..000000000000 --- a/sound/voicegroups/voicegroup024.inc +++ /dev/null @@ -1,94 +0,0 @@ - .align 2 -voicegroup024:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 1, 7, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 0 - voice_square_2_alt 60, 0, 2, 0, 2, 0, 0 - voice_square_2_alt 60, 0, 3, 0, 1, 7, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 0, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 - diff --git a/sound/voicegroups/voicegroup025.inc b/sound/voicegroups/voicegroup025.inc deleted file mode 100644 index 3449629469c3..000000000000 --- a/sound/voicegroups/voicegroup025.inc +++ /dev/null @@ -1,87 +0,0 @@ - .align 2 -voicegroup025:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 1, 0, 1, 7, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 7, 1 - voice_square_2_alt 60, 0, 2, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup026.inc b/sound/voicegroups/voicegroup026.inc deleted file mode 100644 index d18047d582f4..000000000000 --- a/sound/voicegroups/voicegroup026.inc +++ /dev/null @@ -1,88 +0,0 @@ - .align 2 -voicegroup026:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 1, 9, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 9, 0 - voice_square_2_alt 60, 0, 3, 0, 1, 7, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 0 - diff --git a/sound/voicegroups/voicegroup027.inc b/sound/voicegroups/voicegroup027.inc deleted file mode 100644 index 517ee87d43a9..000000000000 --- a/sound/voicegroups/voicegroup027.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup027:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 1, 0, 2, 0, 0 - voice_square_1 60, 0, 0, 1, 0, 2, 0, 0 - voice_square_2 60, 0, 1, 0, 6, 0, 0 - voice_square_1 60, 0, 0, 1, 0, 6, 0, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 4, 1, 4 - voice_noise_alt 60, 0, 0, 0, 1, 0, 2 - diff --git a/sound/voicegroups/voicegroup028.inc b/sound/voicegroups/voicegroup028.inc deleted file mode 100644 index 9af19f1879b0..000000000000 --- a/sound/voicegroups/voicegroup028.inc +++ /dev/null @@ -1,86 +0,0 @@ - .align 2 -voicegroup028:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 3, 0, 1, 0, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 0, 0, 2, 0, 0 - voice_square_1 60, 0, 0, 0, 0, 2, 0, 0 - voice_square_2 60, 0, 0, 0, 6, 0, 0 - voice_square_1 60, 0, 0, 0, 0, 6, 0, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 2, 0, 2, 0, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_2 60, 0, 3, 0, 4, 0, 0 - diff --git a/sound/voicegroups/voicegroup029.inc b/sound/voicegroups/voicegroup029.inc deleted file mode 100644 index 7c801afcb339..000000000000 --- a/sound/voicegroups/voicegroup029.inc +++ /dev/null @@ -1,91 +0,0 @@ - .align 2 -voicegroup029:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 2, 7, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 2, 0, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 1, 7, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 - voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 0 - voice_square_2_alt 60, 0, 3, 0, 1, 0, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 1, 0, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 7, 0 - diff --git a/sound/voicegroups/voicegroup030.inc b/sound/voicegroups/voicegroup030.inc deleted file mode 100644 index 1e1b5088dd5b..000000000000 --- a/sound/voicegroups/voicegroup030.inc +++ /dev/null @@ -1,58 +0,0 @@ - .align 2 -voicegroup030:: - voice_keysplit_all voicegroup031 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 2, 4, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 2, 4, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 37, 165, 180, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - diff --git a/sound/voicegroups/voicegroup031.inc b/sound/voicegroups/voicegroup031.inc deleted file mode 100644 index 178d7ec63dc8..000000000000 --- a/sound/voicegroups/voicegroup031.inc +++ /dev/null @@ -1,68 +0,0 @@ - .align 2 -voicegroup031:: - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_trinity_big_boned, 255, 165, 154, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 32, 49, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 30, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 30, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 72, 79, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 72, 74, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 - diff --git a/sound/voicegroups/voicegroup032.inc b/sound/voicegroups/voicegroup032.inc deleted file mode 100644 index dc60bbdf3b29..000000000000 --- a/sound/voicegroups/voicegroup032.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup032:: - voice_keysplit_all voicegroup016 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 3, 4, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 3, 4, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 250, 0, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - voice_noise_alt 60, 0, 0, 0, 4, 1, 4 - voice_noise_alt 60, 0, 0, 0, 1, 0, 2 - diff --git a/sound/voicegroups/voicegroup033.inc b/sound/voicegroups/voicegroup033.inc deleted file mode 100644 index 34e7e43b712d..000000000000 --- a/sound/voicegroups/voicegroup033.inc +++ /dev/null @@ -1,86 +0,0 @@ - .align 2 -voicegroup033:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 - diff --git a/sound/voicegroups/voicegroup034.inc b/sound/voicegroups/voicegroup034.inc deleted file mode 100644 index fe973b84c3fb..000000000000 --- a/sound/voicegroups/voicegroup034.inc +++ /dev/null @@ -1,87 +0,0 @@ - .align 2 -voicegroup034:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 2, 0, 1, 4, 2 - voice_square_1 60, 0, 0, 2, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave 60, 0, ProgrammableWaveData_16, 0, 7, 15, 2 - diff --git a/sound/voicegroups/voicegroup035.inc b/sound/voicegroups/voicegroup035.inc deleted file mode 100644 index 2c3ac4bddd99..000000000000 --- a/sound/voicegroups/voicegroup035.inc +++ /dev/null @@ -1,88 +0,0 @@ - .align 2 -voicegroup035:: - voice_keysplit_all voicegroup031 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 1, 7, 1 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 1, 6, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2 - voice_square_1_alt 60, 0, 0, 3, 0, 1, 6, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 0, 6, 1 - diff --git a/sound/voicegroups/voicegroup036.inc b/sound/voicegroups/voicegroup036.inc deleted file mode 100644 index c3d2df146c17..000000000000 --- a/sound/voicegroups/voicegroup036.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup036:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 1, 6, 1 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 6, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 2, 4, 1 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 4, 1, 4 - voice_noise_alt 60, 0, 0, 0, 1, 0, 2 - diff --git a/sound/voicegroups/voicegroup037.inc b/sound/voicegroups/voicegroup037.inc deleted file mode 100644 index 057891c01b16..000000000000 --- a/sound/voicegroups/voicegroup037.inc +++ /dev/null @@ -1,92 +0,0 @@ - .align 2 -voicegroup037:: - voice_keysplit_all voicegroup031 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 2, 4, 1 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 0, 0, 1, 7, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 7, 1 - voice_square_1_alt 60, 0, 0, 0, 0, 0, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2 - diff --git a/sound/voicegroups/voicegroup038.inc b/sound/voicegroups/voicegroup038.inc deleted file mode 100644 index bcb211d6f59e..000000000000 --- a/sound/voicegroups/voicegroup038.inc +++ /dev/null @@ -1,85 +0,0 @@ - .align 2 -voicegroup038:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 2, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 0 - diff --git a/sound/voicegroups/voicegroup039.inc b/sound/voicegroups/voicegroup039.inc deleted file mode 100644 index 9e8d16df0b01..000000000000 --- a/sound/voicegroups/voicegroup039.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup039:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 0 - voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup040.inc b/sound/voicegroups/voicegroup040.inc deleted file mode 100644 index f390cb3d85aa..000000000000 --- a/sound/voicegroups/voicegroup040.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup040:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 0 - voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup041.inc b/sound/voicegroups/voicegroup041.inc deleted file mode 100644 index def4e46b00d6..000000000000 --- a/sound/voicegroups/voicegroup041.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup041:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 0 - voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup042.inc b/sound/voicegroups/voicegroup042.inc deleted file mode 100644 index 1298ddbd52b6..000000000000 --- a/sound/voicegroups/voicegroup042.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup042:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 0 - voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup043.inc b/sound/voicegroups/voicegroup043.inc deleted file mode 100644 index d6bd30bcbaea..000000000000 --- a/sound/voicegroups/voicegroup043.inc +++ /dev/null @@ -1,84 +0,0 @@ - .align 2 -voicegroup043:: - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 - diff --git a/sound/voicegroups/voicegroup044.inc b/sound/voicegroups/voicegroup044.inc deleted file mode 100644 index 9a057754b352..000000000000 --- a/sound/voicegroups/voicegroup044.inc +++ /dev/null @@ -1,84 +0,0 @@ - .align 2 -voicegroup044:: - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 5, 1, 7 - voice_square_2_alt 60, 0, 3, 0, 4, 3, 6 - voice_square_2_alt 60, 0, 2, 1, 1, 4, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 224 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 - diff --git a/sound/voicegroups/voicegroup045.inc b/sound/voicegroups/voicegroup045.inc deleted file mode 100644 index 2e2016e43909..000000000000 --- a/sound/voicegroups/voicegroup045.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup045:: - voice_keysplit_all voicegroup001 - voice_square_1_alt 60, 0, 0, 1, 0, 2, 0, 1 - voice_square_1_alt 60, 0, 0, 3, 1, 2, 6, 0 - voice_square_2_alt 60, 0, 3, 1, 2, 6, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 1, 0, 2, 0, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_4, 1, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup046.inc b/sound/voicegroups/voicegroup046.inc deleted file mode 100644 index f653241e35b5..000000000000 --- a/sound/voicegroups/voicegroup046.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup046:: - voice_keysplit voicegroup005, KeySplitTable1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_14, 0, 1, 12, 0 - voice_square_1_alt 60, 0, 0, 0, 1, 1, 9, 0 - voice_square_2_alt 60, 0, 2, 0, 2, 6, 3 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 1 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 216 - voice_square_2_alt 60, 0, 1, 0, 2, 6, 3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup047.inc b/sound/voicegroups/voicegroup047.inc deleted file mode 100644 index 84fa9335a879..000000000000 --- a/sound/voicegroups/voicegroup047.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup047:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 204 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 204, 193, 239 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 1, 6, 2 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 1, 7, 15, 2 - voice_square_2_alt 60, 0, 1, 1, 1, 4, 1 - voice_square_1_alt 60, 0, 0, 1, 1, 2, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 1, 6, 1 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 6, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup048.inc b/sound/voicegroups/voicegroup048.inc deleted file mode 100644 index eeb5b682a38c..000000000000 --- a/sound/voicegroups/voicegroup048.inc +++ /dev/null @@ -1,91 +0,0 @@ - .align 2 -voicegroup048:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 7, 3, 3 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 204, 51, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 239 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 4, 4, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 3, 6, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 3, 3, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 12, 1 - voice_square_2_alt 60, 0, 1, 0, 1, 4, 3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 0, 0, 2, 4, 0 - diff --git a/sound/voicegroups/voicegroup049.inc b/sound/voicegroups/voicegroup049.inc deleted file mode 100644 index b6b0774cf3d7..000000000000 --- a/sound/voicegroups/voicegroup049.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup049:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 1 - voice_square_2_alt 60, 0, 1, 1, 3, 4, 2 - voice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 1, 7, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 2, 4, 2 - voice_square_2_alt 60, 0, 1, 1, 3, 4, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 1, 4, 4, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup050.inc b/sound/voicegroups/voicegroup050.inc deleted file mode 100644 index 6b45664eb0b6..000000000000 --- a/sound/voicegroups/voicegroup050.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup050:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup051.inc b/sound/voicegroups/voicegroup051.inc deleted file mode 100644 index d3a144622aa6..000000000000 --- a/sound/voicegroups/voicegroup051.inc +++ /dev/null @@ -1,77 +0,0 @@ - .align 2 -voicegroup051:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 1, 4, 4, 2 - voice_square_1_alt 60, 0, 0, 2, 0, 3, 4, 1 - voice_square_2_alt 60, 0, 2, 1, 3, 4, 2 - voice_square_1_alt 60, 0, 0, 2, 0, 3, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 99 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - diff --git a/sound/voicegroups/voicegroup052.inc b/sound/voicegroups/voicegroup052.inc deleted file mode 100644 index 438e2d5f1785..000000000000 --- a/sound/voicegroups/voicegroup052.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup052:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 3, 1, 2, 6, 0 - voice_square_2 60, 0, 3, 1, 2, 6, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_4, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 1, 0, 1, 6, 1 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 7, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 1 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 2 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 7, 6, 1 - voice_square_2_alt 60, 0, 2, 0, 1, 6, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 9, 4 - voice_noise_alt 60, 0, 0, 3, 1, 10, 0 - voice_noise_alt 60, 0, 0, 0, 2, 0, 0 - diff --git a/sound/voicegroups/voicegroup053.inc b/sound/voicegroups/voicegroup053.inc deleted file mode 100644 index e5f1a4d7e8e6..000000000000 --- a/sound/voicegroups/voicegroup053.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup053:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 1, 4, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 12, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup054.inc b/sound/voicegroups/voicegroup054.inc deleted file mode 100644 index ddd17ed99522..000000000000 --- a/sound/voicegroups/voicegroup054.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup054:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 1, 5, 2 - voice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup055.inc b/sound/voicegroups/voicegroup055.inc deleted file mode 100644 index 9157030e8339..000000000000 --- a/sound/voicegroups/voicegroup055.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup055:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 204 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 204, 193, 239 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 - voice_square_1_alt 60, 0, 0, 3, 0, 1, 6, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_4, 0, 7, 15, 2 - voice_square_2_alt 60, 0, 1, 1, 1, 4, 1 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 1, 6, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup056.inc b/sound/voicegroups/voicegroup056.inc deleted file mode 100644 index ec543b9b336a..000000000000 --- a/sound/voicegroups/voicegroup056.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup056:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup057.inc b/sound/voicegroups/voicegroup057.inc deleted file mode 100644 index 391b7cf8bc3b..000000000000 --- a/sound/voicegroups/voicegroup057.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup057:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 188, 51, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 128, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_bubbles, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 1, 4, 10, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 1, 5, 9, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup058.inc b/sound/voicegroups/voicegroup058.inc deleted file mode 100644 index 56dff5f5bbf5..000000000000 --- a/sound/voicegroups/voicegroup058.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup058:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 4, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup059.inc b/sound/voicegroups/voicegroup059.inc deleted file mode 100644 index 5a45d437d3cd..000000000000 --- a/sound/voicegroups/voicegroup059.inc +++ /dev/null @@ -1,92 +0,0 @@ - .align 2 -voicegroup059:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 1, 1, 1, 6, 2 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 239 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 6, 2 - voice_square_2_alt 60, 0, 2, 0, 1, 6, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 - voice_square_1_alt 60, 0, 0, 1, 1, 2, 4, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 1, 6, 2 - diff --git a/sound/voicegroups/voicegroup060.inc b/sound/voicegroups/voicegroup060.inc deleted file mode 100644 index 448841e625f0..000000000000 --- a/sound/voicegroups/voicegroup060.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup060:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 128, 226, 0, 38 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 1, 1, 1, 6, 1 - voice_square_1_alt 60, 0, 0, 1, 0, 4, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 7, 3, 3 - voice_square_1_alt 60, 0, 0, 2, 0, 7, 3, 3 - voice_square_1_alt 60, 0, 0, 3, 2, 2, 7, 0 - voice_square_2_alt 60, 0, 1, 1, 2, 3, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup061.inc b/sound/voicegroups/voicegroup061.inc deleted file mode 100644 index d73730ecbc41..000000000000 --- a/sound/voicegroups/voicegroup061.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup061:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup062.inc b/sound/voicegroups/voicegroup062.inc deleted file mode 100644 index ad2e6cad7fe5..000000000000 --- a/sound/voicegroups/voicegroup062.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup062:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup063.inc b/sound/voicegroups/voicegroup063.inc deleted file mode 100644 index 966ae2080917..000000000000 --- a/sound/voicegroups/voicegroup063.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup063:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup064.inc b/sound/voicegroups/voicegroup064.inc deleted file mode 100644 index fa56af03ead3..000000000000 --- a/sound/voicegroups/voicegroup064.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup064:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup065.inc b/sound/voicegroups/voicegroup065.inc deleted file mode 100644 index 163bce0c7e7e..000000000000 --- a/sound/voicegroups/voicegroup065.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup065:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup066.inc b/sound/voicegroups/voicegroup066.inc deleted file mode 100644 index af4a7f841044..000000000000 --- a/sound/voicegroups/voicegroup066.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup066:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 1, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 3 - voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup067.inc b/sound/voicegroups/voicegroup067.inc deleted file mode 100644 index ed8ccef4f800..000000000000 --- a/sound/voicegroups/voicegroup067.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup067:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup068.inc b/sound/voicegroups/voicegroup068.inc deleted file mode 100644 index 787ce997b7d2..000000000000 --- a/sound/voicegroups/voicegroup068.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup068:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 2, 3, 1 - voice_square_2_alt 60, 0, 2, 0, 2, 3, 1 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup069.inc b/sound/voicegroups/voicegroup069.inc deleted file mode 100644 index 26ea29405180..000000000000 --- a/sound/voicegroups/voicegroup069.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup069:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup070.inc b/sound/voicegroups/voicegroup070.inc deleted file mode 100644 index 59a43180dfc0..000000000000 --- a/sound/voicegroups/voicegroup070.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup070:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 4, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup071.inc b/sound/voicegroups/voicegroup071.inc deleted file mode 100644 index a4cb9c721f84..000000000000 --- a/sound/voicegroups/voicegroup071.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup071:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup072.inc b/sound/voicegroups/voicegroup072.inc deleted file mode 100644 index 50fa4e4cfaa6..000000000000 --- a/sound/voicegroups/voicegroup072.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup072:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 4, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup073.inc b/sound/voicegroups/voicegroup073.inc deleted file mode 100644 index b10ab81d1ae6..000000000000 --- a/sound/voicegroups/voicegroup073.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup073:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 1 - voice_square_2_alt 60, 0, 2, 0, 2, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 4, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup074.inc b/sound/voicegroups/voicegroup074.inc deleted file mode 100644 index 1c3c67f8dcd5..000000000000 --- a/sound/voicegroups/voicegroup074.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup074:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 0 - voice_square_2_alt 60, 0, 2, 0, 1, 4, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 4, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup075.inc b/sound/voicegroups/voicegroup075.inc deleted file mode 100644 index 86af71af4b81..000000000000 --- a/sound/voicegroups/voicegroup075.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup075:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 2, 3, 1 - voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 - voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 2, 3, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 3, 4, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup076.inc b/sound/voicegroups/voicegroup076.inc deleted file mode 100644 index 378a8ff66929..000000000000 --- a/sound/voicegroups/voicegroup076.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup076:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup077.inc b/sound/voicegroups/voicegroup077.inc deleted file mode 100644 index 994d9f411d2f..000000000000 --- a/sound/voicegroups/voicegroup077.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup077:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 196 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 4, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup078.inc b/sound/voicegroups/voicegroup078.inc deleted file mode 100644 index e3ef10feb73f..000000000000 --- a/sound/voicegroups/voicegroup078.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup078:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 196 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 4, 0 - voice_noise_alt 60, 0, 0, 0, 2, 0, 2 - diff --git a/sound/voicegroups/voicegroup079.inc b/sound/voicegroups/voicegroup079.inc deleted file mode 100644 index 42b51faea45b..000000000000 --- a/sound/voicegroups/voicegroup079.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup079:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 2, 4, 1 - voice_square_2_alt 60, 0, 0, 0, 1, 6, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 6, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 2, 4, 1 - voice_square_2_alt 60, 0, 3, 0, 1, 6, 2 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 6, 5 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 4, 4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 1, 6, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup080.inc b/sound/voicegroups/voicegroup080.inc deleted file mode 100644 index 6d627ad92e46..000000000000 --- a/sound/voicegroups/voicegroup080.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup080:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup081.inc b/sound/voicegroups/voicegroup081.inc deleted file mode 100644 index e9c2011e40a7..000000000000 --- a/sound/voicegroups/voicegroup081.inc +++ /dev/null @@ -1,5 +0,0 @@ - .align 2 -voicegroup081:: - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup005, KeySplitTable1 - diff --git a/sound/voicegroups/voicegroup082.inc b/sound/voicegroups/voicegroup082.inc deleted file mode 100644 index b6b5506f1a6d..000000000000 --- a/sound/voicegroups/voicegroup082.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup082:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 2, 4, 1 - voice_square_2_alt 60, 0, 3, 0, 1, 6, 2 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 4, 4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup083.inc b/sound/voicegroups/voicegroup083.inc deleted file mode 100644 index 4f2fcd809ff9..000000000000 --- a/sound/voicegroups/voicegroup083.inc +++ /dev/null @@ -1,87 +0,0 @@ - .align 2 -voicegroup083:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 72, 249 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 2, 0, 1, 4, 2 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 6, 4 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 2, 6, 1 - diff --git a/sound/voicegroups/voicegroup084.inc b/sound/voicegroups/voicegroup084.inc deleted file mode 100644 index 510b37c23aa2..000000000000 --- a/sound/voicegroups/voicegroup084.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup084:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 0 - voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup085.inc b/sound/voicegroups/voicegroup085.inc deleted file mode 100644 index 6260fb198ad5..000000000000 --- a/sound/voicegroups/voicegroup085.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup085:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 1, 2, 4, 0 - voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 13, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup086.inc b/sound/voicegroups/voicegroup086.inc deleted file mode 100644 index d5298f9b03f5..000000000000 --- a/sound/voicegroups/voicegroup086.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup086:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 0 - voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup087.inc b/sound/voicegroups/voicegroup087.inc deleted file mode 100644 index 1ccb69ea559b..000000000000 --- a/sound/voicegroups/voicegroup087.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup087:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup088.inc b/sound/voicegroups/voicegroup088.inc deleted file mode 100644 index 8f6f21688427..000000000000 --- a/sound/voicegroups/voicegroup088.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup088:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 1, 1, 1, 6, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 239 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 6, 2 - voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 - voice_square_1_alt 60, 0, 0, 1, 1, 1, 6, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 1, 6, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup089.inc b/sound/voicegroups/voicegroup089.inc deleted file mode 100644 index 4b5e7d57bd4f..000000000000 --- a/sound/voicegroups/voicegroup089.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup089:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 3 - voice_square_2_alt 60, 0, 2, 0, 2, 4, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup090.inc b/sound/voicegroups/voicegroup090.inc deleted file mode 100644 index 4039ad8d1456..000000000000 --- a/sound/voicegroups/voicegroup090.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup090:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 2, 4, 1 - voice_square_2_alt 60, 0, 0, 0, 2, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup091.inc b/sound/voicegroups/voicegroup091.inc deleted file mode 100644 index 28a64ab48876..000000000000 --- a/sound/voicegroups/voicegroup091.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup091:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 72, 249 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 5, 2 - voice_square_2_alt 60, 0, 2, 0, 1, 5, 2 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 7, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 2, 6, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup092.inc b/sound/voicegroups/voicegroup092.inc deleted file mode 100644 index 90e2858175c2..000000000000 --- a/sound/voicegroups/voicegroup092.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup092:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 2, 0, 1, 4, 2 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 7, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup093.inc b/sound/voicegroups/voicegroup093.inc deleted file mode 100644 index 8cea3573355a..000000000000 --- a/sound/voicegroups/voicegroup093.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup093:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 7, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup094.inc b/sound/voicegroups/voicegroup094.inc deleted file mode 100644 index b52e95892642..000000000000 --- a/sound/voicegroups/voicegroup094.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup094:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 72, 249 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 7, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup095.inc b/sound/voicegroups/voicegroup095.inc deleted file mode 100644 index 96b531f8ed7a..000000000000 --- a/sound/voicegroups/voicegroup095.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup095:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 3 - voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup096.inc b/sound/voicegroups/voicegroup096.inc deleted file mode 100644 index b0cb653cafa6..000000000000 --- a/sound/voicegroups/voicegroup096.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup096:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup097.inc b/sound/voicegroups/voicegroup097.inc deleted file mode 100644 index fb0542dac6eb..000000000000 --- a/sound/voicegroups/voicegroup097.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup097:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 249 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 7, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup098.inc b/sound/voicegroups/voicegroup098.inc deleted file mode 100644 index 3a927368bca3..000000000000 --- a/sound/voicegroups/voicegroup098.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup098:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 0 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 7, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_unknown_10, 255, 255, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup099.inc b/sound/voicegroups/voicegroup099.inc deleted file mode 100644 index e750f95831db..000000000000 --- a/sound/voicegroups/voicegroup099.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup099:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 0 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 7, 0 - voice_square_1_alt 60, 0, 0, 1, 2, 1, 5, 0 - voice_square_2_alt 60, 0, 1, 2, 1, 5, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup100.inc b/sound/voicegroups/voicegroup100.inc deleted file mode 100644 index 577d05c35495..000000000000 --- a/sound/voicegroups/voicegroup100.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup100:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 - voice_square_1_alt 60, 0, 0, 2, 1, 1, 4, 1 - voice_square_2_alt 60, 0, 2, 1, 1, 4, 1 - voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup101.inc b/sound/voicegroups/voicegroup101.inc deleted file mode 100644 index 768c18dea2e3..000000000000 --- a/sound/voicegroups/voicegroup101.inc +++ /dev/null @@ -1,113 +0,0 @@ - .align 2 -voicegroup101:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 1, 5, 2, 4 - voice_square_2_alt 60, 0, 1, 1, 5, 2, 4 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 239 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 1, 2, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 1, 1, 1, 6, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 4, 6, 2 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 6, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 1, 1, 4, 6, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 0, 1, 2, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 0, 1, 1, 6, 1 - diff --git a/sound/voicegroups/voicegroup102.inc b/sound/voicegroups/voicegroup102.inc deleted file mode 100644 index 197ed891be8e..000000000000 --- a/sound/voicegroups/voicegroup102.inc +++ /dev/null @@ -1,85 +0,0 @@ - .align 2 -voicegroup102:: - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 248 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 6, 0, 6 - voice_square_2_alt 60, 0, 2, 0, 6, 0, 6 - diff --git a/sound/voicegroups/voicegroup103.inc b/sound/voicegroups/voicegroup103.inc deleted file mode 100644 index cc743edb22cb..000000000000 --- a/sound/voicegroups/voicegroup103.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup103:: - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit_all voicegroup002 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 239 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 1, 1, 6, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 1, 0, 0, 10, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 1 - diff --git a/sound/voicegroups/voicegroup104.inc b/sound/voicegroups/voicegroup104.inc deleted file mode 100644 index c1b623918bbd..000000000000 --- a/sound/voicegroups/voicegroup104.inc +++ /dev/null @@ -1,111 +0,0 @@ - .align 2 -voicegroup104:: - voice_keysplit_all voicegroup003 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_unknown_koto_high, 255, 0, 206, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_shakuhachi, 255, 0, 255, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 2, 0, 12, 5 - voice_square_2_alt 60, 0, 0, 0, 0, 10, 4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 1, 2, 0, 12, 5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_unknown_koto_low, 255, 0, 206, 242 - diff --git a/sound/voicegroups/voicegroup105.inc b/sound/voicegroups/voicegroup105.inc deleted file mode 100644 index a1a1bc2d61f5..000000000000 --- a/sound/voicegroups/voicegroup105.inc +++ /dev/null @@ -1,86 +0,0 @@ - .align 2 -voicegroup105:: - voice_keysplit_all voicegroup002 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 9, 4 - voice_square_2_alt 60, 0, 2, 0, 2, 9, 4 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 - diff --git a/sound/voicegroups/voicegroup106.inc b/sound/voicegroups/voicegroup106.inc deleted file mode 100644 index 1a1125be8af3..000000000000 --- a/sound/voicegroups/voicegroup106.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup106:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 64, 38, 128, 226 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup107.inc b/sound/voicegroups/voicegroup107.inc deleted file mode 100644 index c43a518ec763..000000000000 --- a/sound/voicegroups/voicegroup107.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup107:: - voice_keysplit_all voicegroup002 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup108.inc b/sound/voicegroups/voicegroup108.inc deleted file mode 100644 index a92ee43c6ac4..000000000000 --- a/sound/voicegroups/voicegroup108.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup108:: - voice_keysplit_all voicegroup004 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_heart_of_asia_gamelan, 255, 188, 139, 239 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 13, 4 - voice_square_2_alt 60, 0, 0, 0, 0, 9, 2 - voice_square_2_alt 60, 0, 1, 0, 0, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_4, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup109.inc b/sound/voicegroups/voicegroup109.inc deleted file mode 100644 index a9991437377b..000000000000 --- a/sound/voicegroups/voicegroup109.inc +++ /dev/null @@ -1,86 +0,0 @@ - .align 2 -voicegroup109:: - voice_keysplit_all voicegroup004 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_church_organ3_low, 255, 76, 154, 188 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_church_organ3_high, 255, 76, 154, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 0, 13, 1 - voice_square_2_alt 60, 0, 0, 0, 0, 12, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0 - diff --git a/sound/voicegroups/voicegroup110.inc b/sound/voicegroups/voicegroup110.inc deleted file mode 100644 index 25b6fdaae0c7..000000000000 --- a/sound/voicegroups/voicegroup110.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup110:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 239 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 1, 1, 6, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 0, 10, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 1 - diff --git a/sound/voicegroups/voicegroup111.inc b/sound/voicegroups/voicegroup111.inc deleted file mode 100644 index 27b418f462b0..000000000000 --- a/sound/voicegroups/voicegroup111.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup111:: - voice_keysplit_all voicegroup002 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 226 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 195 - voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 195 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 195 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 2, 6, 1 - diff --git a/sound/voicegroups/voicegroup112.inc b/sound/voicegroups/voicegroup112.inc deleted file mode 100644 index 9cb2f415a901..000000000000 --- a/sound/voicegroups/voicegroup112.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup112:: - voice_keysplit_all voicegroup003 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_21, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 128, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 128, 165, 128, 188 - voice_directsound 60, 0, DirectSoundWaveData_unknown_female_voice, 128, 165, 128, 204 - voice_directsound 60, 0, DirectSoundWaveData_unused_unknown_male_voice, 128, 165, 128, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 0, 7, 0 - voice_square_2_alt 60, 0, 1, 0, 0, 6, 0 - voice_square_2_alt 60, 0, 3, 0, 0, 6, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 7, 10, 1 - voice_noise_alt 60, 0, 0, 0, 2, 6, 1 - diff --git a/sound/voicegroups/voicegroup113.inc b/sound/voicegroups/voicegroup113.inc deleted file mode 100644 index 0fa279c8a64d..000000000000 --- a/sound/voicegroups/voicegroup113.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup113:: - voice_keysplit_all voicegroup002 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_23, 0, 7, 15, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_25, 0, 7, 15, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_24, 0, 7, 15, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_21, 0, 7, 15, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_22, 0, 7, 15, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_9, 0, 7, 15, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_10, 0, 7, 15, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_11, 0, 7, 15, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_12, 0, 7, 15, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_13, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 195 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 7, 7, 0 - voice_square_2_alt 60, 0, 2, 0, 7, 7, 0 - voice_square_2_alt 60, 0, 1, 0, 7, 7, 0 - voice_square_2_alt 60, 0, 0, 0, 7, 7, 0 - voice_square_2_alt 60, 0, 3, 0, 7, 7, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 7, 7, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 7, 7, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 7, 7, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - voice_noise_alt 60, 0, 0, 0, 2, 6, 1 - diff --git a/sound/voicegroups/voicegroup114.inc b/sound/voicegroups/voicegroup114.inc deleted file mode 100644 index cb078d24c3a1..000000000000 --- a/sound/voicegroups/voicegroup114.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup114:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 3, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 3, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 3, 0, 0, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216 - diff --git a/sound/voicegroups/voicegroup115.inc b/sound/voicegroups/voicegroup115.inc deleted file mode 100644 index eb4f52b87827..000000000000 --- a/sound/voicegroups/voicegroup115.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup115:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 128, 249, 0, 188 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 188, 103, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 204 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 165, 154, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 198 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 146 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 165, 180, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 2, 7, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 0, 0, 1, 6, 0 - voice_square_2_alt 60, 0, 3, 0, 3, 6, 2 - voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 6, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_21, 0, 7, 15, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 1, 9, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 2, 6, 3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 2 - voice_noise_alt 60, 0, 0, 0, 1, 6, 0 - diff --git a/sound/voicegroups/voicegroup116.inc b/sound/voicegroups/voicegroup116.inc deleted file mode 100644 index a86a87f5d1b4..000000000000 --- a/sound/voicegroups/voicegroup116.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup116:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 2, 6, 5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 190, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_unused_sc88pro_unison_slap, 255, 165, 180, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 2, 7, 2 - voice_square_2_alt 60, 0, 3, 0, 3, 3, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_21, 0, 3, 6, 5 - voice_square_1_alt 60, 0, 0, 0, 0, 2, 7, 2 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_21, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 2, 6, 3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - voice_noise_alt 60, 0, 0, 0, 1, 6, 1 - diff --git a/sound/voicegroups/voicegroup117.inc b/sound/voicegroups/voicegroup117.inc deleted file mode 100644 index 3a86ec4f583f..000000000000 --- a/sound/voicegroups/voicegroup117.inc +++ /dev/null @@ -1,85 +0,0 @@ - .align 2 -voicegroup117:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 2, 0, 1, 1, 1 - voice_square_1 60, 0, 0, 2, 0, 1, 1, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 3, 0, 1, 7, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 - diff --git a/sound/voicegroups/voicegroup118.inc b/sound/voicegroups/voicegroup118.inc deleted file mode 100644 index 89e66b21d230..000000000000 --- a/sound/voicegroups/voicegroup118.inc +++ /dev/null @@ -1,94 +0,0 @@ - .align 2 -voicegroup118:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 0, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 0, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 250, 0, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 2, 0, 1, 7, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 - voice_square_1 60, 0, 0, 2, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_trinity_big_boned, 255, 0, 255, 127 - diff --git a/sound/voicegroups/voicegroup119.inc b/sound/voicegroups/voicegroup119.inc deleted file mode 100644 index 8b7fe24c79ac..000000000000 --- a/sound/voicegroups/voicegroup119.inc +++ /dev/null @@ -1,94 +0,0 @@ - .align 2 -voicegroup119:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 0, 0, 2, 4, 1 - voice_square_1 60, 0, 0, 0, 0, 2, 4, 1 - voice_square_2 60, 0, 3, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 3, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 60, 0, DirectSoundWaveData_sc88pro_timpani_with_snare, 255, 246, 0, 226 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 2, 0, 1, 7, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 2 - voice_square_1 60, 0, 0, 2, 0, 1, 7, 1 - voice_square_2 60, 0, 1, 0, 1, 9, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2 - diff --git a/sound/voicegroups/voicegroup120.inc b/sound/voicegroups/voicegroup120.inc deleted file mode 100644 index 2c104fb10b67..000000000000 --- a/sound/voicegroups/voicegroup120.inc +++ /dev/null @@ -1,94 +0,0 @@ - .align 2 -voicegroup120:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 2, 0, 2, 6, 1 - voice_square_1 60, 0, 0, 2, 0, 2, 6, 1 - voice_square_2 60, 0, 3, 0, 2, 4, 1 - voice_square_1 60, 0, 0, 3, 0, 2, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 2, 0, 1, 7, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 - voice_square_1 60, 0, 0, 2, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 7, 1 - voice_square_2 60, 0, 3, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 3, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 3, 0, 0, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2 - diff --git a/sound/voicegroups/voicegroup121.inc b/sound/voicegroups/voicegroup121.inc deleted file mode 100644 index f09ddd774172..000000000000 --- a/sound/voicegroups/voicegroup121.inc +++ /dev/null @@ -1,89 +0,0 @@ - .align 2 -voicegroup121:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 2, 0, 1, 7, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2 - voice_square_1 60, 0, 0, 2, 0, 1, 7, 1 - voice_square_2 60, 0, 0, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 0, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 0, 0, 0, 7, 1 - diff --git a/sound/voicegroups/voicegroup122.inc b/sound/voicegroups/voicegroup122.inc deleted file mode 100644 index 65356a3d175e..000000000000 --- a/sound/voicegroups/voicegroup122.inc +++ /dev/null @@ -1,87 +0,0 @@ - .align 2 -voicegroup122:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 1, 0, 1, 6, 1 - voice_square_1 60, 0, 0, 1, 0, 1, 6, 1 - voice_square_2 60, 0, 2, 0, 1, 6, 1 - voice_square_1 60, 0, 0, 2, 0, 1, 6, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_trinity_big_boned, 255, 165, 154, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 - voice_square_1 60, 0, 0, 3, 0, 1, 9, 1 - voice_square_1 60, 0, 0, 3, 0, 0, 9, 1 - diff --git a/sound/voicegroups/voicegroup123.inc b/sound/voicegroups/voicegroup123.inc deleted file mode 100644 index 6178994ccaef..000000000000 --- a/sound/voicegroups/voicegroup123.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup123:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 3, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 3, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 3, 0, 0, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216 - diff --git a/sound/voicegroups/voicegroup124.inc b/sound/voicegroups/voicegroup124.inc deleted file mode 100644 index 274d76dcd1a2..000000000000 --- a/sound/voicegroups/voicegroup124.inc +++ /dev/null @@ -1,90 +0,0 @@ - .align 2 -voicegroup124:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 2, 0, 2, 3, 1 - voice_square_1 60, 0, 0, 2, 0, 2, 3, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 3, 0, 1, 7, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 - voice_square_1 60, 0, 0, 3, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 2, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 1, 7, 1 - voice_square_2 60, 0, 3, 0, 2, 7, 1 - diff --git a/sound/voicegroups/voicegroup125.inc b/sound/voicegroups/voicegroup125.inc deleted file mode 100644 index 644002abf76d..000000000000 --- a/sound/voicegroups/voicegroup125.inc +++ /dev/null @@ -1,87 +0,0 @@ - .align 2 -voicegroup125:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 2, 0, 2, 3, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 3, 0, 1, 7, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 - voice_square_1 60, 0, 0, 3, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 3, 0, 0, 7, 1 - diff --git a/sound/voicegroups/voicegroup126.inc b/sound/voicegroups/voicegroup126.inc deleted file mode 100644 index 51959b4f1e30..000000000000 --- a/sound/voicegroups/voicegroup126.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup126:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 0, 1, 1, 7, 1 - voice_square_1 60, 0, 0, 0, 1, 1, 7, 1 - voice_square_1 60, 0, 0, 0, 0, 0, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2 60, 0, 3, 1, 1, 6, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 - voice_square_1 60, 0, 0, 3, 1, 1, 6, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 216 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216 - diff --git a/sound/voicegroups/voicegroup127.inc b/sound/voicegroups/voicegroup127.inc deleted file mode 100644 index 476d3f48f6e2..000000000000 --- a/sound/voicegroups/voicegroup127.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup127:: - voice_directsound 60, 0, DirectSoundWaveData_unknown_synth_snare, 255, 249, 103, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 0, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 2, 0, 1 - voice_square_1_alt 60, 0, 0, 2, 0, 4, 0, 1 - voice_square_1_alt 60, 0, 44, 2, 0, 4, 0, 0 - voice_square_1_alt 60, 0, 38, 0, 0, 4, 0, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 7, 0, 0 - voice_square_1_alt 60, 0, 0, 2, 2, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 2, 0, 15, 0 - voice_square_1_alt 60, 0, 23, 1, 0, 1, 9, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 165 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 226, 0, 165 - voice_square_1_alt 60, 0, 0, 2, 0, 6, 0, 1 - voice_square_1_alt 60, 0, 36, 0, 0, 2, 0, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 1, 0, 1 - voice_square_1_alt 60, 0, 0, 3, 0, 1, 0, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 46, 2, 0, 4, 0, 0 - voice_square_1_alt 60, 0, 38, 2, 0, 4, 0, 0 - voice_square_1_alt 60, 0, 119, 2, 0, 0, 15, 1 - voice_square_1_alt 60, 0, 0, 2, 0, 0, 15, 1 - voice_square_1_alt 60, 0, 106, 2, 0, 2, 0, 0 - voice_square_1_alt 60, 0, 23, 2, 0, 1, 9, 0 - voice_square_1_alt 60, 0, 21, 2, 0, 1, 9, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 0, 15, 1 - voice_square_1_alt 60, 0, 47, 2, 0, 2, 6, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise 60, 0, 0, 0, 7, 15, 0 - voice_noise 60, 0, 0, 2, 7, 15, 0 - voice_noise_alt 60, 0, 0, 2, 0, 15, 0 - voice_noise_alt 60, 0, 1, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 3, 0, 0 - voice_noise_alt 60, 0, 0, 0, 2, 0, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 1 - diff --git a/sound/voicegroups/voicegroup128.inc b/sound/voicegroups/voicegroup128.inc deleted file mode 100644 index 69b52d29d67e..000000000000 --- a/sound/voicegroups/voicegroup128.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup128:: - voice_directsound_no_resample 60, 0, DirectSoundWaveData_bicycle_bell, 255, 249, 0, 165 - voice_directsound_alt 60, 0, DirectSoundWaveData_bicycle_bell, 255, 0, 255, 165 - voice_directsound 60, 0, DirectSoundWaveData_unknown_synth_snare, 255, 0, 255, 165 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 242, 0, 127 - voice_noise_alt 60, 0, 0, 0, 1, 0, 1 - voice_noise_alt 60, 0, 1, 0, 1, 0, 1 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 255, 165 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 0, 1 - voice_directsound 60, 0, DirectSoundWaveData_unknown_1, 255, 0, 255, 165 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_unknown_2, 255, 0, 255, 127 - voice_noise_alt 60, 0, 1, 0, 2, 0, 0 - voice_square_1 60, 0, 103, 3, 2, 7, 0, 0 - voice_square_2 60, 0, 3, 2, 7, 0, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 226, 0, 127 - voice_directsound 60, 0, DirectSoundWaveData_unknown_3, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 204, 0, 127 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 0, 1 - voice_directsound 60, 0, DirectSoundWaveData_unknown_4, 255, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 127 - voice_square_1 60, 0, 103, 0, 0, 7, 0, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_wind, 255, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_bubbles, 255, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 127 - voice_noise_alt 60, 0, 0, 0, 7, 15, 1 - voice_directsound 60, 0, DirectSoundWaveData_unknown_5, 255, 0, 255, 127 - voice_noise_alt 60, 0, 1, 0, 7, 15, 1 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 246, 0, 127 - voice_directsound 60, 0, DirectSoundWaveData_unknown_6, 255, 0, 255, 127 - voice_square_1_alt 60, 0, 19, 2, 0, 2, 0, 0 - voice_directsound 60, 0, DirectSoundWaveData_trinity_30303_mega_bass, 255, 0, 255, 127 - voice_square_1 60, 0, 103, 0, 0, 0, 15, 0 - voice_directsound_alt 60, 0, DirectSoundWaveData_unknown_6, 255, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 255, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_unknown_7, 255, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_trinity_30303_mega_bass, 255, 242, 0, 0 - voice_directsound 60, 0, DirectSoundWaveData_unknown_8, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_directsound 60, 0, DirectSoundWaveData_unknown_close_hihat, 255, 127, 0, 188 - voice_directsound 60, 0, DirectSoundWaveData_unknown_9, 255, 249, 0, 165 - voice_square_1 60, 0, 0, 0, 4, 6, 0, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 13, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 13, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_trinity_big_boned, 255, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 252, 0, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_square_1 60, 0, 0, 0, 4, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 188, 0, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 226, 0, 127 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 26, 0, 255, 127 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 0, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 252, 0, 127 - voice_square_1_alt 60, 0, 0, 1, 0, 2, 0, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 127, 0, 127 - voice_noise_alt 60, 0, 0, 1, 6, 0, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 255, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_unknown_10, 255, 255, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_french_horn_72, 11, 242, 0, 127 - voice_square_1_alt 60, 0, 0, 2, 4, 6, 0, 0 - voice_directsound 60, 0, DirectSoundWaveData_unknown_11, 255, 255, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 - voice_directsound 60, 0, DirectSoundWaveData_unused_sc55_tom, 255, 0, 255, 165 - voice_noise_alt 60, 0, 0, 5, 7, 15, 1 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 128, 242, 0, 165 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_string_ensemble_72, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 0, 1, 5, 0, 0 - voice_noise_alt 60, 0, 0, 6, 6, 0, 1 - voice_noise_alt 60, 0, 0, 3, 6, 0, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_trinity_30303_mega_bass, 15, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_unknown_12, 255, 0, 255, 165 - voice_directsound 60, 0, DirectSoundWaveData_unknown_13, 255, 0, 255, 165 - voice_directsound 60, 0, DirectSoundWaveData_unknown_14, 255, 0, 255, 165 - voice_directsound 60, 0, DirectSoundWaveData_unknown_15, 255, 0, 255, 165 - voice_directsound 60, 0, DirectSoundWaveData_unknown_16, 255, 0, 255, 165 - voice_directsound 60, 0, DirectSoundWaveData_unknown_17, 255, 0, 255, 165 - diff --git a/sound/voicegroups/voicegroup129.inc b/sound/voicegroups/voicegroup129.inc deleted file mode 100644 index 8e136bdf48dc..000000000000 --- a/sound/voicegroups/voicegroup129.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup129:: - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 226, 25, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_unknown_1, 255, 0, 255, 165 - voice_directsound 60, 0, DirectSoundWaveData_dance_drums_ride_bell, 255, 165, 103, 231 - voice_directsound 60, 0, DirectSoundWaveData_sd90_open_triangle, 255, 204, 128, 249 - voice_directsound 60, 0, DirectSoundWaveData_register_noise, 255, 0, 255, 76 - voice_directsound 60, 0, DirectSoundWaveData_unknown_18, 255, 0, 206, 204 - voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_ohtsuzumi, 255, 0, 206, 38 - voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_hyoushigi, 255, 0, 206, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 252, 0, 204 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 204, 0, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 0, 10, 4 - voice_square_1_alt 60, 0, 0, 3, 0, 0, 10, 3 - voice_square_1_alt 60, 0, 0, 2, 0, 0, 10, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 0, 15, 1 - voice_square_1_alt 60, 0, 0, 0, 0, 2, 5, 6 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 29, 2, 0, 2, 0, 0 - voice_square_1_alt 60, 0, 22, 2, 0, 2, 0, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 9, 2 - voice_noise_alt 60, 0, 0, 0, 4, 3, 1 - voice_noise_alt 60, 0, 0, 0, 1, 12, 0 - voice_noise_alt 60, 0, 1, 0, 1, 9, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - diff --git a/sound/voicegroups/voicegroup130.inc b/sound/voicegroups/voicegroup130.inc deleted file mode 100644 index 7044bb38e4b9..000000000000 --- a/sound/voicegroups/voicegroup130.inc +++ /dev/null @@ -1,182 +0,0 @@ - .align 2 -voicegroup130:: - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_1, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_2, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_3, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_4, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_5, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_6, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_7, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_8, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_9, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_10, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_11, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_12, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_13, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_14, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_15, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_16, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_17, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_18, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_19, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_20, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_21, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_22, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_23, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_24, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_25, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_26, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_27, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_28, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_29, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_30, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_31, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_32, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_33, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_34, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_35, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_36, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_37, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_38, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_39, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_40, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_41, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_42, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_43, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_44, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_45, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_46, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_47, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_48, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_49, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_50, 255, 0, 255, 0 - voice_directsound 60, 0, DirectSoundWaveData_Phoneme_51, 255, 0, 255, 0 - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion_duplicate, 255, 249, 25, 248 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 7, 1 - diff --git a/sound/voicegroups/voicegroup131.inc b/sound/voicegroups/voicegroup131.inc deleted file mode 100644 index 029afa5be524..000000000000 --- a/sound/voicegroups/voicegroup131.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup131:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_directsound 60, 0, DirectSoundWaveData_steinway_b_piano, 128, 204, 51, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 204, 103, 226 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 2, 3, 5 - voice_square_2_alt 60, 0, 3, 0, 2, 6, 5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 9, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 1 - diff --git a/sound/voicegroups/voicegroup132.inc b/sound/voicegroups/voicegroup132.inc deleted file mode 100644 index 2806916bcae2..000000000000 --- a/sound/voicegroups/voicegroup132.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup132:: - voice_keysplit_all voicegroup002 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 97, 236 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 118, 137 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 51, 204, 92, 226 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 165, 154, 235 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 4, 2, 2 - voice_square_2_alt 60, 0, 3, 0, 1, 7, 5 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 4, 6, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 4, 6, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 4, 2, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 2, 9, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - voice_noise_alt 60, 0, 0, 0, 1, 8, 1 - diff --git a/sound/voicegroups/voicegroup133.inc b/sound/voicegroups/voicegroup133.inc deleted file mode 100644 index be70f6ae33f7..000000000000 --- a/sound/voicegroups/voicegroup133.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup133:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 108, 137 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 204, 103, 226 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 153 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 9, 0 - voice_square_2_alt 60, 0, 3, 0, 2, 9, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 1, 0, 9, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - voice_noise_alt 60, 0, 0, 0, 1, 8, 1 - diff --git a/sound/voicegroups/voicegroup134.inc b/sound/voicegroups/voicegroup134.inc deleted file mode 100644 index 1bc01fed0739..000000000000 --- a/sound/voicegroups/voicegroup134.inc +++ /dev/null @@ -1,93 +0,0 @@ - .align 2 -voicegroup134:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 1, 7, 1 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 1, 7, 1 - voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 - voice_square_1_alt 60, 0, 0, 2, 0, 0, 7, 1 - voice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 1 - diff --git a/sound/voicegroups/voicegroup135.inc b/sound/voicegroups/voicegroup135.inc deleted file mode 100644 index 2ea22bf96903..000000000000 --- a/sound/voicegroups/voicegroup135.inc +++ /dev/null @@ -1,86 +0,0 @@ - .align 2 -voicegroup135:: - voice_keysplit_all voicegroup002 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 85, 137, 180, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 0, 9, 0 - voice_square_2_alt 60, 0, 2, 0, 0, 9, 0 - voice_square_1_alt 60, 0, 0, 0, 1, 2, 6, 0 - diff --git a/sound/voicegroups/voicegroup136.inc b/sound/voicegroups/voicegroup136.inc deleted file mode 100644 index 0428c8c0042b..000000000000 --- a/sound/voicegroups/voicegroup136.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup136:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 0, 0, 5, 0, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 5, 0, 0 - voice_square_1_alt 60, 0, 0, 2, 2, 4, 10, 0 - voice_square_2_alt 60, 0, 0, 0, 5, 0, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 5, 0, 0 - voice_square_2_alt 60, 0, 3, 2, 4, 10, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 1, 5, 0, 3 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 1, 5, 0, 3 - voice_square_2_alt 60, 0, 1, 0, 1, 10, 2 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 10, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 4, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup137.inc b/sound/voicegroups/voicegroup137.inc deleted file mode 100644 index cf7422cd2321..000000000000 --- a/sound/voicegroups/voicegroup137.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup137:: - voice_keysplit_all voicegroup002 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 165, 180, 165 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 137, 154, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 204, 51, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 153 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 1, 2, 3, 1 - voice_square_2_alt 60, 0, 1, 1, 2, 3, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 2, 4, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 2, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 4, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 1 - diff --git a/sound/voicegroups/voicegroup138.inc b/sound/voicegroups/voicegroup138.inc deleted file mode 100644 index 227538f5dca0..000000000000 --- a/sound/voicegroups/voicegroup138.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup138:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 - voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 204, 77, 246 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 2, 5, 2 - voice_square_2_alt 60, 0, 3, 0, 1, 6, 3 - voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 12, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - voice_noise_alt 60, 0, 0, 0, 1, 6, 0 - diff --git a/sound/voicegroups/voicegroup139.inc b/sound/voicegroups/voicegroup139.inc deleted file mode 100644 index e8969de570e1..000000000000 --- a/sound/voicegroups/voicegroup139.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup139:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 242 - voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 127, 103, 201 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 37, 127, 77, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 51, 204, 92, 226 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 226 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 3, 1 - voice_square_2_alt 60, 0, 3, 0, 2, 7, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 6, 1 - voice_noise_alt 60, 0, 0, 0, 1, 6, 1 - diff --git a/sound/voicegroups/voicegroup140.inc b/sound/voicegroups/voicegroup140.inc deleted file mode 100644 index 8206cca1d273..000000000000 --- a/sound/voicegroups/voicegroup140.inc +++ /dev/null @@ -1,7 +0,0 @@ - .align 2 -voicegroup140:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 2, 3, 1 - voice_square_2_alt 60, 0, 2, 0, 2, 3, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - diff --git a/sound/voicegroups/voicegroup141.inc b/sound/voicegroups/voicegroup141.inc deleted file mode 100644 index 1e556a21b6a6..000000000000 --- a/sound/voicegroups/voicegroup141.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup141:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 85, 249, 25, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 2, 5, 2 - voice_square_2_alt 60, 0, 3, 0, 2, 7, 3 - voice_square_2_alt 60, 0, 2, 0, 2, 6, 5 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 1, 7, 0, 6 - voice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 2 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 2, 9, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - voice_noise_alt 60, 0, 0, 0, 1, 6, 0 - diff --git a/sound/voicegroups/voicegroup142.inc b/sound/voicegroups/voicegroup142.inc deleted file mode 100644 index af5b809bf84c..000000000000 --- a/sound/voicegroups/voicegroup142.inc +++ /dev/null @@ -1,87 +0,0 @@ - .align 2 -voicegroup142:: - voice_keysplit_all voicegroup002 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 64, 188, 128, 201 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 64, 195, 103, 220 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 128, 195, 72, 127 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 85, 188, 103, 160 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 128, 188, 77, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 175, 154, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 6, 4 - voice_square_2_alt 60, 0, 2, 0, 2, 5, 5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_14, 0, 7, 15, 0 - diff --git a/sound/voicegroups/voicegroup143.inc b/sound/voicegroups/voicegroup143.inc deleted file mode 100644 index 9cb286ac13d0..000000000000 --- a/sound/voicegroups/voicegroup143.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup143:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 160, 123, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 2, 3, 2 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 3, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 9, 0 - voice_noise_alt 60, 0, 0, 0, 1, 6, 1 - diff --git a/sound/voicegroups/voicegroup144.inc b/sound/voicegroups/voicegroup144.inc deleted file mode 100644 index 87830a387b05..000000000000 --- a/sound/voicegroups/voicegroup144.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup144:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 85, 188, 92, 165 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 85, 127, 180, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 51, 204, 92, 226 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 2, 4, 2 - voice_square_2_alt 60, 0, 1, 0, 2, 4, 3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 9, 0 - voice_noise_alt 60, 0, 0, 0, 1, 6, 0 - diff --git a/sound/voicegroups/voicegroup145.inc b/sound/voicegroups/voicegroup145.inc deleted file mode 100644 index 96cda70e488a..000000000000 --- a/sound/voicegroups/voicegroup145.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup145:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 - voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 204, 77, 246 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 2, 5, 2 - voice_square_2_alt 60, 0, 3, 0, 0, 9, 0 - voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 12, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - voice_noise_alt 60, 0, 0, 0, 1, 6, 0 - diff --git a/sound/voicegroups/voicegroup146.inc b/sound/voicegroups/voicegroup146.inc deleted file mode 100644 index b0f1b92d6fc5..000000000000 --- a/sound/voicegroups/voicegroup146.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup146:: - voice_keysplit_all voicegroup002 - voice_directsound 60, 0, DirectSoundWaveData_steinway_b_piano, 255, 165, 103, 235 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 85, 249, 25, 226 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 43, 76, 103, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 2, 4, 4 - voice_square_1_alt 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 9, 0 - voice_noise_alt 60, 0, 0, 0, 1, 6, 2 - diff --git a/sound/voicegroups/voicegroup147.inc b/sound/voicegroups/voicegroup147.inc deleted file mode 100644 index 47678158241f..000000000000 --- a/sound/voicegroups/voicegroup147.inc +++ /dev/null @@ -1,87 +0,0 @@ - .align 2 -voicegroup147:: - voice_keysplit_all voicegroup001 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 64, 249, 25, 226 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 0, 6, 1 - voice_square_2_alt 60, 0, 2, 0, 0, 6, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 2, 4, 2 - diff --git a/sound/voicegroups/voicegroup148.inc b/sound/voicegroups/voicegroup148.inc deleted file mode 100644 index 4fc324df883f..000000000000 --- a/sound/voicegroups/voicegroup148.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup148:: - voice_keysplit_all voicegroup002 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 226, 0, 127 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 0, 12, 0 - voice_square_2_alt 60, 0, 2, 0, 0, 12, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 3, 5, 2 - voice_noise_alt 60, 0, 0, 0, 1, 6, 5 - diff --git a/sound/voicegroups/voicegroup149.inc b/sound/voicegroups/voicegroup149.inc deleted file mode 100644 index c0239fef958a..000000000000 --- a/sound/voicegroups/voicegroup149.inc +++ /dev/null @@ -1,96 +0,0 @@ - .align 2 -voicegroup149:: - voice_keysplit_all voicegroup190 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1_alt 60, 0, 0, 2, 0, 0, 12, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 165, 154, 153 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_oboe, 43, 188, 103, 165 - voice_directsound 60, 0, DirectSoundWaveData_unused_sd90_oboe, 43, 165, 103, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 1, 2, 3, 1 - voice_square_2_alt 60, 0, 1, 0, 2, 4, 2 - voice_square_1_alt 60, 0, 0, 1, 0, 2, 6, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 2, 3, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 - diff --git a/sound/voicegroups/voicegroup150.inc b/sound/voicegroups/voicegroup150.inc deleted file mode 100644 index c51150d78236..000000000000 --- a/sound/voicegroups/voicegroup150.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup150:: - voice_keysplit_all voicegroup002 - voice_directsound 60, 0, DirectSoundWaveData_steinway_b_piano, 255, 165, 103, 235 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 85, 204, 77, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 1, 0, 1, 4, 6 - voice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 4, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup151.inc b/sound/voicegroups/voicegroup151.inc deleted file mode 100644 index 29571169d642..000000000000 --- a/sound/voicegroups/voicegroup151.inc +++ /dev/null @@ -1,91 +0,0 @@ - .align 2 -voicegroup151:: - voice_keysplit_all voicegroup002 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 127 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 1, 2, 3, 1 - voice_square_2_alt 60, 0, 1, 0, 2, 4, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 2, 3, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - diff --git a/sound/voicegroups/voicegroup152.inc b/sound/voicegroups/voicegroup152.inc deleted file mode 100644 index 06ccc3ae9d04..000000000000 --- a/sound/voicegroups/voicegroup152.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup152:: - voice_keysplit_all voicegroup002 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 97, 236 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 160, 175, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 127, 154, 235 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 4, 2, 1 - voice_square_2_alt 60, 0, 3, 0, 1, 5, 2 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 4, 6, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 4, 6, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 2, 9, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - voice_noise_alt 60, 0, 0, 0, 1, 6, 1 - diff --git a/sound/voicegroups/voicegroup153.inc b/sound/voicegroups/voicegroup153.inc deleted file mode 100644 index 7206c7ba3d98..000000000000 --- a/sound/voicegroups/voicegroup153.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup153:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 97, 236 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 127, 154, 235 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 3, 5, 2 - voice_square_2_alt 60, 0, 3, 0, 3, 4, 2 - voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 6, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_8, 0, 1, 12, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - voice_noise_alt 60, 0, 0, 0, 1, 6, 2 - diff --git a/sound/voicegroups/voicegroup154.inc b/sound/voicegroups/voicegroup154.inc deleted file mode 100644 index ce70e65d57cc..000000000000 --- a/sound/voicegroups/voicegroup154.inc +++ /dev/null @@ -1,96 +0,0 @@ - .align 2 -voicegroup154:: - voice_keysplit_all voicegroup002 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 97, 236 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 127, 154, 235 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 0, 10, 0 - voice_square_2_alt 60, 0, 1, 0, 0, 10, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_4, 0, 0, 12, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 0, 12, 0 - diff --git a/sound/voicegroups/voicegroup155.inc b/sound/voicegroups/voicegroup155.inc deleted file mode 100644 index 8150754aab67..000000000000 --- a/sound/voicegroups/voicegroup155.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup155:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 188, 103, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 165, 154, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 165, 180, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 2, 7, 2 - voice_square_2_alt 60, 0, 3, 0, 3, 6, 2 - voice_square_2_alt 60, 0, 3, 0, 2, 6, 5 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 3, 6, 5 - voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 1, 9, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 2, 6, 3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 2 - voice_noise_alt 60, 0, 0, 0, 1, 6, 0 - diff --git a/sound/voicegroups/voicegroup156.inc b/sound/voicegroups/voicegroup156.inc deleted file mode 100644 index 374464fff9d7..000000000000 --- a/sound/voicegroups/voicegroup156.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup156:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 4, 4, 4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_unused_sc88pro_unison_slap, 255, 165, 180, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 1, 0, 1, 7, 5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 2, 3, 1 - voice_square_1_alt 60, 0, 0, 0, 0, 2, 7, 5 - voice_square_1_alt 60, 0, 0, 3, 0, 2, 6, 5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - voice_noise_alt 60, 0, 0, 0, 1, 6, 0 - diff --git a/sound/voicegroups/voicegroup157.inc b/sound/voicegroups/voicegroup157.inc deleted file mode 100644 index 7dd93abd0ade..000000000000 --- a/sound/voicegroups/voicegroup157.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup157:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 2, 6, 5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 190, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_unused_sc88pro_unison_slap, 255, 165, 180, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 2, 7, 2 - voice_square_2_alt 60, 0, 3, 0, 3, 3, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 3, 6, 5 - voice_square_1_alt 60, 0, 0, 0, 0, 2, 7, 2 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 2, 6, 3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - voice_noise_alt 60, 0, 0, 0, 1, 6, 1 - diff --git a/sound/voicegroups/voicegroup158.inc b/sound/voicegroups/voicegroup158.inc deleted file mode 100644 index 50fa5660686c..000000000000 --- a/sound/voicegroups/voicegroup158.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup158:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 108, 137 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 204, 103, 226 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 153 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 236, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 9, 0 - voice_square_2_alt 60, 0, 3, 0, 1, 10, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 1, 0, 9, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - voice_noise_alt 60, 0, 0, 0, 1, 8, 1 - diff --git a/sound/voicegroups/voicegroup159.inc b/sound/voicegroups/voicegroup159.inc deleted file mode 100644 index f1d20465601d..000000000000 --- a/sound/voicegroups/voicegroup159.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup159:: - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 64, 249, 0, 188 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 51, 249, 0, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 85, 249, 25, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 7, 0, 6 - voice_square_2_alt 60, 0, 1, 1, 5, 1, 6 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 1, 7, 0, 6 - voice_square_1_alt 60, 0, 0, 0, 1, 4, 3, 6 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 4, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup160.inc b/sound/voicegroups/voicegroup160.inc deleted file mode 100644 index 160d0cad8fbf..000000000000 --- a/sound/voicegroups/voicegroup160.inc +++ /dev/null @@ -1,91 +0,0 @@ - .align 2 -voicegroup160:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 2, 3, 1 - voice_square_2_alt 60, 0, 1, 0, 2, 4, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - diff --git a/sound/voicegroups/voicegroup161.inc b/sound/voicegroups/voicegroup161.inc deleted file mode 100644 index c334fa26470a..000000000000 --- a/sound/voicegroups/voicegroup161.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup161:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 6, 4 - voice_square_2_alt 60, 0, 2, 0, 2, 6, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 1, 0, 2, 6, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 4, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup162.inc b/sound/voicegroups/voicegroup162.inc deleted file mode 100644 index 3a532b23ee59..000000000000 --- a/sound/voicegroups/voicegroup162.inc +++ /dev/null @@ -1,96 +0,0 @@ - .align 2 -voicegroup162:: - voice_keysplit_all voicegroup002 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 64, 188, 108, 244 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 64, 195, 92, 235 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 64, 204, 113, 235 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 0, 6, 0 - voice_square_2_alt 60, 0, 1, 0, 0, 6, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - diff --git a/sound/voicegroups/voicegroup163.inc b/sound/voicegroups/voicegroup163.inc deleted file mode 100644 index cd7c6ebef27e..000000000000 --- a/sound/voicegroups/voicegroup163.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup163:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 - voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 204, 77, 246 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_unknown_18, 255, 0, 206, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 5, 2 - voice_square_2_alt 60, 0, 3, 0, 3, 4, 2 - voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_14, 0, 0, 12, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - voice_noise_alt 60, 0, 0, 0, 1, 6, 0 - diff --git a/sound/voicegroups/voicegroup164.inc b/sound/voicegroups/voicegroup164.inc deleted file mode 100644 index d64cfd33adf1..000000000000 --- a/sound/voicegroups/voicegroup164.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup164:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 128, 180, 108, 209 - voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 85, 204, 77, 246 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 0, 10, 6 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 2, 6, 2 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 4 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 0, 12, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 12, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - voice_noise_alt 60, 0, 0, 0, 1, 6, 0 - diff --git a/sound/voicegroups/voicegroup165.inc b/sound/voicegroups/voicegroup165.inc deleted file mode 100644 index c3262766cb3c..000000000000 --- a/sound/voicegroups/voicegroup165.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup165:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 242 - voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 37, 165, 103, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 204, 92, 226 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 226 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 10, 1 - voice_square_2_alt 60, 0, 2, 0, 2, 6, 6 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_enhanced_delay_shaku, 255, 191, 97, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 1, 9, 0 - voice_noise_alt 60, 0, 0, 0, 1, 6, 1 - diff --git a/sound/voicegroups/voicegroup166.inc b/sound/voicegroups/voicegroup166.inc deleted file mode 100644 index edd94624c0ab..000000000000 --- a/sound/voicegroups/voicegroup166.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup166:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 108, 137 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 204, 103, 226 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 - voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 153 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 236, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 1, 9, 0 - voice_square_2_alt 60, 0, 3, 0, 2, 9, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 1, 0, 9, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - voice_noise_alt 60, 0, 0, 0, 1, 8, 1 - diff --git a/sound/voicegroups/voicegroup167.inc b/sound/voicegroups/voicegroup167.inc deleted file mode 100644 index 0213b7aec042..000000000000 --- a/sound/voicegroups/voicegroup167.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup167:: - voice_keysplit_all voicegroup002 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 10, 4 - voice_square_2_alt 60, 0, 3, 0, 2, 8, 3 - voice_square_2_alt 60, 0, 2, 0, 2, 6, 5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 0, 6, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - voice_noise_alt 60, 0, 0, 0, 1, 6, 0 - diff --git a/sound/voicegroups/voicegroup168.inc b/sound/voicegroups/voicegroup168.inc deleted file mode 100644 index ea6b59d2ef4a..000000000000 --- a/sound/voicegroups/voicegroup168.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup168:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 - voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 204, 77, 246 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 2 - voice_square_2_alt 60, 0, 3, 0, 2, 6, 4 - voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_14, 0, 0, 12, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - voice_noise_alt 60, 0, 0, 0, 1, 6, 0 - diff --git a/sound/voicegroups/voicegroup169.inc b/sound/voicegroups/voicegroup169.inc deleted file mode 100644 index 77ee6ffee49e..000000000000 --- a/sound/voicegroups/voicegroup169.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup169:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 - voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 - voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 4, 0 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup170.inc b/sound/voicegroups/voicegroup170.inc deleted file mode 100644 index 43c8ae6df7b1..000000000000 --- a/sound/voicegroups/voicegroup170.inc +++ /dev/null @@ -1,87 +0,0 @@ - .align 2 -voicegroup170:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 1, 0, 1, 7, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 - voice_square_1_alt 60, 0, 0, 1, 0, 1, 7, 1 - voice_square_2_alt 60, 0, 2, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup171.inc b/sound/voicegroups/voicegroup171.inc deleted file mode 100644 index f4ae315ce51e..000000000000 --- a/sound/voicegroups/voicegroup171.inc +++ /dev/null @@ -1,94 +0,0 @@ - .align 2 -voicegroup171:: - voice_keysplit_all voicegroup001 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 1, 7, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 - voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 0 - voice_square_2_alt 60, 0, 2, 0, 2, 0, 0 - voice_square_2_alt 60, 0, 3, 0, 1, 7, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 0, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 - diff --git a/sound/voicegroups/voicegroup172.inc b/sound/voicegroups/voicegroup172.inc deleted file mode 100644 index ffd981c830d1..000000000000 --- a/sound/voicegroups/voicegroup172.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup172:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 - voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 204, 77, 246 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 2, 5, 2 - voice_square_2_alt 60, 0, 3, 0, 2, 6, 3 - voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_14, 0, 0, 12, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - voice_noise_alt 60, 0, 0, 0, 1, 6, 0 - diff --git a/sound/voicegroups/voicegroup173.inc b/sound/voicegroups/voicegroup173.inc deleted file mode 100644 index 46979c625881..000000000000 --- a/sound/voicegroups/voicegroup173.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup173:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 - voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 128, 204, 77, 246 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 51, 0, 203, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 64, 216, 51, 224 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 2, 3, 4 - voice_square_2_alt 60, 0, 3, 0, 3, 3, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - voice_noise_alt 60, 0, 0, 0, 1, 3, 2 - diff --git a/sound/voicegroups/voicegroup174.inc b/sound/voicegroups/voicegroup174.inc deleted file mode 100644 index ab7d43fc72b2..000000000000 --- a/sound/voicegroups/voicegroup174.inc +++ /dev/null @@ -1,160 +0,0 @@ - .align 2 -voicegroup174:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 128, 0, 255, 214 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 128, 0, 255, 206 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 209 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 2, 3, 4 - voice_square_2_alt 60, 0, 3, 0, 2, 3, 4 - voice_square_1_alt 60, 0, 0, 3, 0, 2, 3, 4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - voice_noise_alt 60, 0, 0, 0, 1, 3, 1 - voice_keysplit_all voicegroup177 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 9, 1 - voice_square_2_alt 60, 0, 2, 0, 2, 9, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 154, 127 - voice_keysplit_all voicegroup002 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 3, 1 - voice_square_2_alt 60, 0, 2, 0, 2, 3, 1 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - diff --git a/sound/voicegroups/voicegroup175.inc b/sound/voicegroups/voicegroup175.inc deleted file mode 100644 index a074f216dd78..000000000000 --- a/sound/voicegroups/voicegroup175.inc +++ /dev/null @@ -1,55 +0,0 @@ - .align 2 -voicegroup175:: - voice_keysplit_all voicegroup177 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 85, 165, 154, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - diff --git a/sound/voicegroups/voicegroup176.inc b/sound/voicegroups/voicegroup176.inc deleted file mode 100644 index ee3c97e4936f..000000000000 --- a/sound/voicegroups/voicegroup176.inc +++ /dev/null @@ -1,51 +0,0 @@ - .align 2 -voicegroup176:: - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 7, 1 - voice_square_2_alt 60, 0, 2, 0, 2, 9, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - diff --git a/sound/voicegroups/voicegroup177.inc b/sound/voicegroups/voicegroup177.inc deleted file mode 100644 index bd0e738fd482..000000000000 --- a/sound/voicegroups/voicegroup177.inc +++ /dev/null @@ -1,93 +0,0 @@ - .align 2 -voicegroup177:: - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_drum_and_percussion_kick, 255, 0, 255, 0 - voice_directsound_no_resample 67, 71, DirectSoundWaveData_sd90_solo_snare, 255, 180, 175, 228 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 0, 255, 242 - voice_directsound_no_resample 65, 0, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 - voice_directsound 64, 24, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 68, 29, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 - voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 - voice_directsound 72, 64, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 76, 39, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 - voice_directsound 80, 89, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 - voice_directsound_no_resample 33, 10, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 - voice_directsound 84, 104, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 235 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 63, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_dance_drums_ride_bell, 255, 165, 103, 231 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_trinity_cymbal_crash, 255, 231, 0, 188 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_cowbell, 255, 0, 255, 242 - voice_directsound_no_resample 64, 118, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_unused_heart_of_asia_indian_drum, 255, 0, 255, 0 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_open_triangle, 255, 165, 103, 188 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 - voice_directsound 63, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0 - voice_directsound 50, 64, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 - voice_directsound 64, 64, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 - diff --git a/sound/voicegroups/voicegroup178.inc b/sound/voicegroups/voicegroup178.inc deleted file mode 100644 index 026d7bb3d8b2..000000000000 --- a/sound/voicegroups/voicegroup178.inc +++ /dev/null @@ -1,91 +0,0 @@ - .align 2 -voicegroup178:: - voice_keysplit_all voicegroup177 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 204, 103, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 154, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 7, 1 - voice_square_2_alt 60, 0, 2, 0, 2, 7, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 0, 15, 1 - diff --git a/sound/voicegroups/voicegroup179.inc b/sound/voicegroups/voicegroup179.inc deleted file mode 100644 index e69cace5b8a4..000000000000 --- a/sound/voicegroups/voicegroup179.inc +++ /dev/null @@ -1,91 +0,0 @@ - .align 2 -voicegroup179:: - voice_keysplit_all voicegroup177 - voice_keysplit_all voicegroup176 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 85, 165, 154, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 3, 0, 0, 10, 0 - voice_square_2_alt 60, 0, 0, 0, 1, 9, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 1, 9, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 - diff --git a/sound/voicegroups/voicegroup180.inc b/sound/voicegroups/voicegroup180.inc deleted file mode 100644 index ea182d38e5f1..000000000000 --- a/sound/voicegroups/voicegroup180.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup180:: - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 64, 249, 0, 188 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 3, 1 - voice_square_2_alt 60, 0, 2, 0, 2, 3, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 60, 0, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 - voice_noise_alt 60, 0, 0, 0, 1, 0, 0 - diff --git a/sound/voicegroups/voicegroup181.inc b/sound/voicegroups/voicegroup181.inc deleted file mode 100644 index 92df8710a809..000000000000 --- a/sound/voicegroups/voicegroup181.inc +++ /dev/null @@ -1,50 +0,0 @@ - .align 2 -voicegroup181:: - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 - diff --git a/sound/voicegroups/voicegroup182.inc b/sound/voicegroups/voicegroup182.inc deleted file mode 100644 index ec395549586c..000000000000 --- a/sound/voicegroups/voicegroup182.inc +++ /dev/null @@ -1,91 +0,0 @@ - .align 2 -voicegroup182:: - voice_keysplit_all voicegroup002 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 76 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup008, KeySplitTable4 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 1, 2, 3, 1 - voice_square_2_alt 60, 0, 1, 0, 2, 6, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 2, 3, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - diff --git a/sound/voicegroups/voicegroup183.inc b/sound/voicegroups/voicegroup183.inc deleted file mode 100644 index ff49e3763b32..000000000000 --- a/sound/voicegroups/voicegroup183.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup183:: - voice_keysplit_all voicegroup002 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 1 - voice_square_2_alt 60, 0, 2, 0, 2, 4, 1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - voice_noise_alt 60, 0, 0, 0, 1, 3, 1 - diff --git a/sound/voicegroups/voicegroup184.inc b/sound/voicegroups/voicegroup184.inc deleted file mode 100644 index 86f392e65c90..000000000000 --- a/sound/voicegroups/voicegroup184.inc +++ /dev/null @@ -1,89 +0,0 @@ - .align 2 -voicegroup184:: - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 255, 0, 255, 0 - diff --git a/sound/voicegroups/voicegroup185.inc b/sound/voicegroups/voicegroup185.inc deleted file mode 100644 index 879a4e88832a..000000000000 --- a/sound/voicegroups/voicegroup185.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup185:: - voice_keysplit_all voicegroup002 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 128, 0, 255, 214 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 128, 0, 255, 206 - voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 85, 0, 154, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 209 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - voice_noise_alt 60, 0, 0, 0, 1, 6, 1 - diff --git a/sound/voicegroups/voicegroup186.inc b/sound/voicegroups/voicegroup186.inc deleted file mode 100644 index 18dc71d70d1b..000000000000 --- a/sound/voicegroups/voicegroup186.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup186:: - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_2_alt 60, 0, 3, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - diff --git a/sound/voicegroups/voicegroup187.inc b/sound/voicegroups/voicegroup187.inc deleted file mode 100644 index 640912505ac5..000000000000 --- a/sound/voicegroups/voicegroup187.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup187:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup007, KeySplitTable3 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup009, KeySplitTable5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 0, 0, 2, 5, 2 - voice_square_2_alt 60, 0, 1, 0, 1, 7, 1 - voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 12, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 6, 0 - voice_noise_alt 60, 0, 0, 0, 1, 6, 1 - diff --git a/sound/voicegroups/voicegroup188.inc b/sound/voicegroups/voicegroup188.inc deleted file mode 100644 index 8556bcd4d25c..000000000000 --- a/sound/voicegroups/voicegroup188.inc +++ /dev/null @@ -1,131 +0,0 @@ - .align 2 -voicegroup188:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 - voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 128, 204, 77, 246 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 51, 0, 203, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 64, 216, 51, 224 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 1, 0, 2, 6, 1 - voice_square_2_alt 60, 0, 3, 0, 3, 3, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 7, 0 - voice_noise_alt 60, 0, 0, 0, 1, 9, 1 - diff --git a/sound/voicegroups/voicegroup189.inc b/sound/voicegroups/voicegroup189.inc deleted file mode 100644 index 6c04cd832073..000000000000 --- a/sound/voicegroups/voicegroup189.inc +++ /dev/null @@ -1,95 +0,0 @@ - .align 2 -voicegroup189:: - voice_keysplit_all voicegroup002 - voice_keysplit voicegroup005, KeySplitTable1 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 - voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 128, 204, 77, 246 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 51, 0, 203, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 64, 216, 51, 224 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_keysplit voicegroup006, KeySplitTable2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1_alt 60, 0, 0, 2, 0, 2, 6, 3 - voice_square_2_alt 60, 0, 3, 0, 2, 7, 2 - voice_square_1_alt 60, 0, 0, 1, 0, 2, 6, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - diff --git a/sound/voicegroups/voicegroup190.inc b/sound/voicegroups/voicegroup190.inc deleted file mode 100644 index 25a84e84edc4..000000000000 --- a/sound/voicegroups/voicegroup190.inc +++ /dev/null @@ -1,90 +0,0 @@ - .align 2 -voicegroup190:: - voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 2 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_noise_alt 60, 0, 0, 0, 2, 7, 0 - voice_noise_alt 60, 0, 0, 0, 1, 9, 1 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_drum_and_percussion_kick, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 64, 52, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 33, 104, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound 63, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 - voice_directsound_no_resample 64, 14, DirectSoundWaveData_trinity_cymbal_crash, 255, 231, 0, 188 - voice_directsound_no_resample 64, 89, DirectSoundWaveData_sd90_cowbell, 255, 0, 255, 242 - voice_directsound_no_resample 64, 24, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 - voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216 - voice_directsound_no_resample 64, 94, DirectSoundWaveData_unused_heart_of_asia_indian_drum, 255, 0, 255, 0 - voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 - voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 - voice_directsound_no_resample 64, 90, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 - voice_directsound_no_resample 64, 79, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 - voice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 165, 103, 188 - voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 - voice_directsound_no_resample 64, 104, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 - voice_directsound 63, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0 diff --git a/sound/voicegroups/vs_aqua_magma.inc b/sound/voicegroups/vs_aqua_magma.inc new file mode 100644 index 000000000000..4c1f5578dc74 --- /dev/null +++ b/sound/voicegroups/vs_aqua_magma.inc @@ -0,0 +1,93 @@ +voice_group vs_aqua_magma + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 0, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 0, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 250, 0, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 2, 0, 1, 7, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 + voice_square_1 60, 0, 0, 2, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_trinity_big_boned, 255, 0, 255, 127 + diff --git a/sound/voicegroups/vs_aqua_magma_leader.inc b/sound/voicegroups/vs_aqua_magma_leader.inc new file mode 100644 index 000000000000..3ca3c3afa490 --- /dev/null +++ b/sound/voicegroups/vs_aqua_magma_leader.inc @@ -0,0 +1,130 @@ +voice_group vs_aqua_magma_leader + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 0, 1, 1, 7, 1 + voice_square_1 60, 0, 0, 0, 1, 1, 7, 1 + voice_square_1 60, 0, 0, 0, 0, 0, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 3, 1, 1, 6, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 + voice_square_1 60, 0, 0, 3, 1, 1, 6, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 216 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216 + diff --git a/sound/voicegroups/vs_champion.inc b/sound/voicegroups/vs_champion.inc new file mode 100644 index 000000000000..802dde8a4540 --- /dev/null +++ b/sound/voicegroups/vs_champion.inc @@ -0,0 +1,88 @@ +voice_group vs_champion + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 2, 0, 1, 7, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2 + voice_square_1 60, 0, 0, 2, 0, 1, 7, 1 + voice_square_2 60, 0, 0, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 0, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 0, 0, 0, 7, 1 + diff --git a/sound/voicegroups/vs_elite_four.inc b/sound/voicegroups/vs_elite_four.inc new file mode 100644 index 000000000000..9c99b4e03b6e --- /dev/null +++ b/sound/voicegroups/vs_elite_four.inc @@ -0,0 +1,86 @@ +voice_group vs_elite_four + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 2, 0, 2, 3, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 3, 0, 1, 7, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 + voice_square_1 60, 0, 0, 3, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 3, 0, 0, 7, 1 + diff --git a/sound/voicegroups/vs_frontier_brain.inc b/sound/voicegroups/vs_frontier_brain.inc new file mode 100644 index 000000000000..0167389e384e --- /dev/null +++ b/sound/voicegroups/vs_frontier_brain.inc @@ -0,0 +1,130 @@ +voice_group vs_frontier_brain + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 128, 249, 0, 188 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 188, 103, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 204 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 165, 154, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 198 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 146 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 165, 180, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 2, 7, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 0, 0, 1, 6, 0 + voice_square_2_alt 60, 0, 3, 0, 3, 6, 2 + voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 + voice_square_1_alt 60, 0, 0, 0, 0, 1, 6, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_21, 0, 7, 15, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 1, 9, 2 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 2, 6, 3 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 2 + voice_noise_alt 60, 0, 0, 0, 1, 6, 0 + diff --git a/sound/voicegroups/vs_gym_leader.inc b/sound/voicegroups/vs_gym_leader.inc new file mode 100644 index 000000000000..8aad0a65bc2f --- /dev/null +++ b/sound/voicegroups/vs_gym_leader.inc @@ -0,0 +1,93 @@ +voice_group vs_gym_leader + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 2, 0, 2, 6, 1 + voice_square_1 60, 0, 0, 2, 0, 2, 6, 1 + voice_square_2 60, 0, 3, 0, 2, 4, 1 + voice_square_1 60, 0, 0, 3, 0, 2, 4, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 2, 0, 1, 7, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 + voice_square_1 60, 0, 0, 2, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 7, 1 + voice_square_2 60, 0, 3, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 3, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 3, 0, 0, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2 + diff --git a/sound/voicegroups/vs_kyogre_groudon.inc b/sound/voicegroups/vs_kyogre_groudon.inc new file mode 100644 index 000000000000..326a1904386e --- /dev/null +++ b/sound/voicegroups/vs_kyogre_groudon.inc @@ -0,0 +1,130 @@ +voice_group vs_kyogre_groudon + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 3, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 3, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 3, 0, 0, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216 + diff --git a/sound/voicegroups/vs_mew.inc b/sound/voicegroups/vs_mew.inc new file mode 100644 index 000000000000..052284f396a3 --- /dev/null +++ b/sound/voicegroups/vs_mew.inc @@ -0,0 +1,130 @@ +voice_group vs_mew + voice_keysplit_all voicegroup_frlg_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 3, 0, 2, 6, 5 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 190, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_unused_sc88pro_unison_slap, 255, 165, 180, 216 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 1, 0, 2, 7, 2 + voice_square_2_alt 60, 0, 3, 0, 3, 3, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_21, 0, 3, 6, 5 + voice_square_1_alt 60, 0, 0, 0, 0, 2, 7, 2 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_21, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2_alt 60, 0, 2, 0, 2, 6, 3 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 2, 6, 0 + voice_noise_alt 60, 0, 0, 0, 1, 6, 1 + diff --git a/sound/voicegroups/vs_rayquaza.inc b/sound/voicegroups/vs_rayquaza.inc new file mode 100644 index 000000000000..c004be789d4b --- /dev/null +++ b/sound/voicegroups/vs_rayquaza.inc @@ -0,0 +1,130 @@ +voice_group vs_rayquaza + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 3, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 3, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 3, 0, 0, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216 + diff --git a/sound/voicegroups/vs_regi.inc b/sound/voicegroups/vs_regi.inc new file mode 100644 index 000000000000..ebb9fabd1a39 --- /dev/null +++ b/sound/voicegroups/vs_regi.inc @@ -0,0 +1,86 @@ +voice_group vs_regi + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 1, 0, 1, 6, 1 + voice_square_1 60, 0, 0, 1, 0, 1, 6, 1 + voice_square_2 60, 0, 2, 0, 1, 6, 1 + voice_square_1 60, 0, 0, 2, 0, 1, 6, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_trinity_big_boned, 255, 165, 154, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 + voice_square_1 60, 0, 0, 3, 0, 1, 9, 1 + voice_square_1 60, 0, 0, 3, 0, 0, 9, 1 + diff --git a/sound/voicegroups/vs_rival.inc b/sound/voicegroups/vs_rival.inc new file mode 100644 index 000000000000..8613db39640a --- /dev/null +++ b/sound/voicegroups/vs_rival.inc @@ -0,0 +1,89 @@ +voice_group vs_rival + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 2, 0, 2, 3, 1 + voice_square_1 60, 0, 0, 2, 0, 2, 3, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 3, 0, 1, 7, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 + voice_square_1 60, 0, 0, 3, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 2, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 1, 7, 1 + voice_square_2 60, 0, 3, 0, 2, 7, 1 + diff --git a/sound/voicegroups/vs_trainer.inc b/sound/voicegroups/vs_trainer.inc new file mode 100644 index 000000000000..5c8f5b305e59 --- /dev/null +++ b/sound/voicegroups/vs_trainer.inc @@ -0,0 +1,93 @@ +voice_group vs_trainer + voice_keysplit_all voicegroup_rs_drumset + voice_keysplit voicegroup_piano_keysplit, keysplit_piano + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 0, 0, 2, 4, 1 + voice_square_1 60, 0, 0, 0, 0, 2, 4, 1 + voice_square_2 60, 0, 3, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 3, 0, 1, 7, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound_no_resample 60, 0, DirectSoundWaveData_sc88pro_timpani_with_snare, 255, 246, 0, 226 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 2, 0, 1, 7, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 2 + voice_square_1 60, 0, 0, 2, 0, 1, 7, 1 + voice_square_2 60, 0, 1, 0, 1, 9, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2 + diff --git a/sound/voicegroups/vs_wild.inc b/sound/voicegroups/vs_wild.inc new file mode 100644 index 000000000000..5ce57a0d54fe --- /dev/null +++ b/sound/voicegroups/vs_wild.inc @@ -0,0 +1,84 @@ +voice_group vs_wild + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 2, 0, 1, 1, 1 + voice_square_1 60, 0, 0, 2, 0, 1, 1, 1 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 + voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 + voice_keysplit voicegroup_strings_keysplit, keysplit_strings + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_trumpet_keysplit, keysplit_trumpet + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_tuba_keysplit, keysplit_tuba + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_keysplit voicegroup_french_horn_keysplit, keysplit_french_horn + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_2 60, 0, 3, 0, 1, 7, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 + diff --git a/sound/voicegroups/weather_groudon.inc b/sound/voicegroups/weather_groudon.inc new file mode 100644 index 000000000000..dde2a4637b15 --- /dev/null +++ b/sound/voicegroups/weather_groudon.inc @@ -0,0 +1,130 @@ +voice_group weather_groudon + voice_keysplit_all voicegroup_rs_drumset + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1_alt 60, 0, 0, 0, 0, 2, 4, 1 + voice_square_2_alt 60, 0, 0, 0, 2, 4, 1 + voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 + voice_noise_alt 60, 0, 0, 0, 1, 7, 1 + voice_noise_alt 60, 0, 0, 0, 1, 0, 0 + diff --git a/spritesheet_rules.mk b/spritesheet_rules.mk index 37074cb048d6..a14fd188137a 100644 --- a/spritesheet_rules.mk +++ b/spritesheet_rules.mk @@ -1,6 +1,7 @@ POKEMONGFXDIR := graphics/pokemon OBJEVENTGFXDIR := graphics/object_events/pics FLDEFFGFXDIR := graphics/field_effects/pics +BATINTGFXDIR := graphics/battle_interface MISCGFXDIR := graphics/misc $(OBJEVENTGFXDIR)/people/brendan/walking.4bpp: %.4bpp: %.png @@ -611,6 +612,8 @@ $(OBJEVENTGFXDIR)/berry_trees/rowap.4bpp: %.4bpp: %.png $(OBJEVENTGFXDIR)/berry_trees/micle.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 +$(OBJEVENTGFXDIR)/misc/apricorn_tree.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/misc/breakable_rock.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 @@ -663,6 +666,9 @@ $(FLDEFFGFXDIR)/deep_sand_footprints.4bpp: %.4bpp: %.png $(FLDEFFGFXDIR)/ground_impact_dust.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 1 +$(FLDEFFGFXDIR)/rock_climb_dust.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(FLDEFFGFXDIR)/ash_puff.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 @@ -687,6 +693,15 @@ $(FLDEFFGFXDIR)/short_grass.4bpp: %.4bpp: %.png $(FLDEFFGFXDIR)/surf_blob.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(FLDEFFGFXDIR)/rock_climb_blob.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(FLDEFFGFXDIR)/oras_dowsing_brendan.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 2 -mheight 4 + +$(FLDEFFGFXDIR)/oras_dowsing_may.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 2 -mheight 4 + $(FLDEFFGFXDIR)/tall_grass.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 @@ -3237,6 +3252,9 @@ $(POKEMONGFXDIR)/frogadier/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/greninja/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/greninja/ash/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/bunnelby/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -4925,3 +4943,18 @@ $(OBJEVENTGFXDIR)/misc/ball_%.4bpp: $(OBJEVENTGFXDIR)/misc/ball_%.png ; $(GFX) $ graphics/door_anims/battle_tower_multi_corridor.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 + +$(BATINTGFXDIR)/healthbox_doubles_opponent.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 8 -mheight 4 + +$(BATINTGFXDIR)/healthbox_doubles_player.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 8 -mheight 4 + +$(BATINTGFXDIR)/healthbox_safari.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 8 -mheight 8 + +$(BATINTGFXDIR)/healthbox_singles_opponent.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 8 -mheight 4 + +$(BATINTGFXDIR)/healthbox_singles_player.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 8 -mheight 8 diff --git a/src/agb_flash_1m.c b/src/agb_flash_1m.c index 49696a7bbf46..3e2ad719c6f6 100644 --- a/src/agb_flash_1m.c +++ b/src/agb_flash_1m.c @@ -1,7 +1,7 @@ #include "gba/gba.h" #include "gba/flash_internal.h" -USED static const char AgbLibFlashVersion[] = "FLASH1M_V103"; +KEEP_SECTION USED static const char AgbLibFlashVersion[] = "FLASH1M_V103"; static const struct FlashSetupInfo *const sSetupInfos[] = { diff --git a/src/apprentice.c b/src/apprentice.c index 4b0403b28111..585b4eed4397 100644 --- a/src/apprentice.c +++ b/src/apprentice.c @@ -353,14 +353,12 @@ static u16 GetRandomAlternateMove(u8 monId) // NOTE: Below is an infinite loop if a species which cannot learn TMs is assigned to an Apprentice do { - id = Random() % (NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES); - shouldUseMove = CanLearnTeachableMove(species, ItemIdToBattleMoveId(ITEM_TM01 + id)); + id = (Random() % NUM_ALL_MACHINES) + 1; + move = GetTMHMMoveId(id); + shouldUseMove = CanLearnTeachableMove(species, move); } while (!shouldUseMove); - move = ItemIdToBattleMoveId(ITEM_TM01 + id); - shouldUseMove = TRUE; - if (numLearnsetMoves <= MAX_MON_MOVES) j = 0; else diff --git a/src/apricorn_tree.c b/src/apricorn_tree.c new file mode 100644 index 000000000000..b7784a6a8569 --- /dev/null +++ b/src/apricorn_tree.c @@ -0,0 +1,86 @@ +#include "global.h" +#include "apricorn_tree.h" +#include "event_data.h" +#include "event_object_movement.h" +#include "event_scripts.h" +#include "item.h" +#include "random.h" +#include "string_util.h" +#include "data/apricorns.h" + +void DailyResetApricornTrees(void) +{ +#if (APRICORN_TREE_COUNT > 0) + memset(&gSaveBlock3Ptr->apricornTrees[0], 0, NUM_APRICORN_TREE_BYTES); +#endif +} + +void ObjectEventInteractionGetApricornTreeData(void) +{ + u32 id = GetObjectEventApricornTreeId(gSelectedObjectEvent); + gSpecialVar_0x8004 = GetApricornTypeByApricornTreeId(id); + gSpecialVar_0x8005 = GetApricornCountByApricornTreeId(id); + + CopyItemNameHandlePlural(gSpecialVar_0x8004, gStringVar1, gSpecialVar_0x8005); +} + +void ObjectEventInteractionPickApricornTree(void) +{ + u32 id = GetObjectEventApricornTreeId(gSelectedObjectEvent); + enum ApricornType apricorn = GetApricornTypeByApricornTreeId(id); + gSpecialVar_0x8006 = CheckBagHasSpace(apricorn, GetApricornCountByApricornTreeId(id)); + + if (gSpecialVar_0x8006) + { + AddBagItem(apricorn, GetApricornCountByApricornTreeId(id)); + SetApricornTreePicked(id); + } + gSpecialVar_Result = GetItemPocket(apricorn); +} + +enum ApricornType GetApricornTypeByApricornTreeId(u32 id) +{ + if (APRICORN_TREE_COUNT > 0) + return gApricornTrees[id].apricornType; + else + return 0; +} + +u8 GetApricornCountByApricornTreeId(u32 id) +{ + if (IsApricornTreePicked(id)) + return 0; + + if (APRICORN_TREE_COUNT > 0) + { + if (gApricornTrees[id].maximum > gApricornTrees[id].minimum) + return gApricornTrees[id].minimum + Random() % (gApricornTrees[id].maximum - gApricornTrees[id].minimum); + else + return gApricornTrees[id].minimum; + } + else + return 0; +} + +bool8 IsApricornTreePicked(u32 id) +{ + if (id > APRICORN_TREE_COUNT) + return TRUE; + +#if (APRICORN_TREE_COUNT > 0) + return gSaveBlock3Ptr->apricornTrees[id / 8] & (1 << (id % 8)); +#else + return TRUE; +#endif +} + +void SetApricornTreePicked(u32 id) +{ + if (id > APRICORN_TREE_COUNT) + return; + +#if (APRICORN_TREE_COUNT > 0) + u8 *flagByte = &gSaveBlock3Ptr->apricornTrees[id / 8]; + *flagByte = (*flagByte) | (1 << (id % 8)); +#endif +} diff --git a/src/battle_ai_field_statuses.c b/src/battle_ai_field_statuses.c new file mode 100644 index 000000000000..030d99a94eb5 --- /dev/null +++ b/src/battle_ai_field_statuses.c @@ -0,0 +1,497 @@ +#include "global.h" +#include "battle_z_move.h" +#include "malloc.h" +#include "battle.h" +#include "battle_anim.h" +#include "battle_ai_field_statuses.h" +#include "battle_ai_util.h" +#include "battle_ai_main.h" +#include "battle_ai_switch_items.h" +#include "battle_factory.h" +#include "battle_setup.h" +#include "event_data.h" +#include "data.h" +#include "item.h" +#include "move.h" +#include "pokemon.h" +#include "random.h" +#include "recorded_battle.h" +#include "util.h" +#include "constants/abilities.h" +#include "constants/battle_ai.h" +#include "constants/battle_move_effects.h" +#include "constants/moves.h" +#include "constants/items.h" + +static bool32 DoesAbilityBenefitFromWeather(enum Ability ability, u32 weather); +static bool32 DoesAbilityBenefitFromFieldStatus(enum Ability ability, u32 fieldStatus); +// A move is light sensitive if it is boosted by Sunny Day and weakened by low light weathers. +static bool32 IsLightSensitiveMove(u32 move); +static bool32 HasLightSensitiveMove(u32 battler); +// The following functions all feed into WeatherChecker, which is then called by ShouldSetWeather and ShouldClearWeather. +// BenefitsFrom functions all return FIELD_EFFECT_POSITIVE if the weather or field effect is good to have in place from the perspective of the battler, FIELD_EFFECT_NEUTRAL if it is neither good nor bad, and FIELD_EFFECT_NEGATIVE if it is bad. +// The purpose of WeatherChecker and FieldStatusChecker is to cleanly homogenize the logic that's the same with all of them, and to more easily apply single battle logic to double battles. +// ShouldSetWeather and ShouldClearWeather are looking for a positive or negative result respectively, and check the entire side. +// If one pokemon has a positive result and the other has a negative result, it defaults to the opinion of the battler that may change the weather or field status. +static enum FieldEffectOutcome BenefitsFromSun(u32 battler); +static enum FieldEffectOutcome BenefitsFromSandstorm(u32 battler); +static enum FieldEffectOutcome BenefitsFromHailOrSnow(u32 battler, u32 weather); +static enum FieldEffectOutcome BenefitsFromRain(u32 battler); +// The following functions all feed into FieldStatusChecker, which is then called by ShouldSetFieldStatus and ShouldClearFieldStatus. +// They work approximately the same as the weather functions. +static enum FieldEffectOutcome BenefitsFromElectricTerrain(u32 battler); +static enum FieldEffectOutcome BenefitsFromGrassyTerrain(u32 battler); +static enum FieldEffectOutcome BenefitsFromMistyTerrain(u32 battler); +static enum FieldEffectOutcome BenefitsFromPsychicTerrain(u32 battler); +static enum FieldEffectOutcome BenefitsFromGravity(u32 battler); +static enum FieldEffectOutcome BenefitsFromTrickRoom(u32 battler); + +bool32 WeatherChecker(u32 battler, u32 weather, enum FieldEffectOutcome desiredResult) +{ + if (IsWeatherActive(B_WEATHER_PRIMAL_ANY) != WEATHER_INACTIVE) + return (FIELD_EFFECT_BLOCKED == desiredResult); + + enum FieldEffectOutcome result = FIELD_EFFECT_NEUTRAL; + enum FieldEffectOutcome firstResult = FIELD_EFFECT_NEUTRAL; + + u32 i; + u32 battlersOnSide = 1; + + if (HasPartner(battler)) + battlersOnSide = 2; + + for (i = 0; i < battlersOnSide; i++) + { + if (weather & B_WEATHER_RAIN) + result = BenefitsFromRain(battler); + else if (weather & B_WEATHER_SUN) + result = BenefitsFromSun(battler); + else if (weather & B_WEATHER_SANDSTORM) + result = BenefitsFromSandstorm(battler); + else if (weather & B_WEATHER_ICY_ANY) + result = BenefitsFromHailOrSnow(battler, weather); + + battler = BATTLE_PARTNER(battler); + + if (result != FIELD_EFFECT_NEUTRAL) + { + if (weather & B_WEATHER_DAMAGING_ANY && i == 0 && battlersOnSide == 2) + firstResult = result; + } + } + if (firstResult != FIELD_EFFECT_NEUTRAL) + return (firstResult == result) && (result == desiredResult); + return (result == desiredResult); +} + +bool32 FieldStatusChecker(u32 battler, u32 fieldStatus, enum FieldEffectOutcome desiredResult) +{ + enum FieldEffectOutcome result = FIELD_EFFECT_NEUTRAL; + enum FieldEffectOutcome firstResult = FIELD_EFFECT_NEUTRAL; + u32 i; + + u32 battlersOnSide = 1; + + if (HasPartner(battler)) + battlersOnSide = 2; + + for (i = 0; i < battlersOnSide; i++) + { + // terrains + if (fieldStatus & STATUS_FIELD_ELECTRIC_TERRAIN) + result = BenefitsFromElectricTerrain(battler); + if (fieldStatus & STATUS_FIELD_GRASSY_TERRAIN) + result = BenefitsFromGrassyTerrain(battler); + if (fieldStatus & STATUS_FIELD_MISTY_TERRAIN) + result = BenefitsFromMistyTerrain(battler); + if (fieldStatus & STATUS_FIELD_PSYCHIC_TERRAIN) + result = BenefitsFromPsychicTerrain(battler); + + // other field statuses + if (fieldStatus & STATUS_FIELD_GRAVITY) + result = BenefitsFromGravity(battler); + if (fieldStatus & STATUS_FIELD_TRICK_ROOM) + result = BenefitsFromTrickRoom(battler); + + battler = BATTLE_PARTNER(battler); + + if (result != FIELD_EFFECT_NEUTRAL) + { + // Trick room wants both pokemon to agree, not just one + if (fieldStatus & STATUS_FIELD_TRICK_ROOM && i == 0 && battlersOnSide == 2) + firstResult = result; + } + } + if (firstResult != FIELD_EFFECT_NEUTRAL) + return (firstResult == result) && (result == desiredResult); + return (result == desiredResult); +} + +static bool32 DoesAbilityBenefitFromWeather(enum Ability ability, u32 weather) +{ + switch (ability) + { + case ABILITY_FORECAST: + return (weather & (B_WEATHER_RAIN | B_WEATHER_SUN | B_WEATHER_ICY_ANY)); + case ABILITY_MAGIC_GUARD: + case ABILITY_OVERCOAT: + return (weather & B_WEATHER_DAMAGING_ANY); + case ABILITY_SAND_FORCE: + case ABILITY_SAND_RUSH: + case ABILITY_SAND_VEIL: + return (weather & B_WEATHER_SANDSTORM); + case ABILITY_ICE_BODY: + case ABILITY_ICE_FACE: + case ABILITY_SNOW_CLOAK: + return (weather & B_WEATHER_ICY_ANY); + case ABILITY_SLUSH_RUSH: + return (weather & B_WEATHER_SNOW); + case ABILITY_DRY_SKIN: + case ABILITY_HYDRATION: + case ABILITY_RAIN_DISH: + case ABILITY_SWIFT_SWIM: + return (weather & B_WEATHER_RAIN); + case ABILITY_CHLOROPHYLL: + case ABILITY_FLOWER_GIFT: + case ABILITY_HARVEST: + case ABILITY_LEAF_GUARD: + case ABILITY_ORICHALCUM_PULSE: + case ABILITY_PROTOSYNTHESIS: + case ABILITY_SOLAR_POWER: + return (weather & B_WEATHER_SUN); + default: + break; + } + return FALSE; +} + +static bool32 DoesAbilityBenefitFromFieldStatus(enum Ability ability, u32 fieldStatus) +{ + switch (ability) + { + case ABILITY_MIMICRY: + return (fieldStatus & STATUS_FIELD_TERRAIN_ANY); + case ABILITY_HADRON_ENGINE: + case ABILITY_QUARK_DRIVE: + case ABILITY_SURGE_SURFER: + return (fieldStatus & STATUS_FIELD_ELECTRIC_TERRAIN); + case ABILITY_GRASS_PELT: + return (fieldStatus & STATUS_FIELD_GRASSY_TERRAIN); + // no abilities inherently benefit from Misty or Psychic Terrains + // return (fieldStatus & STATUS_FIELD_MISTY_TERRAIN); + // return (fieldStatus & STATUS_FIELD_PSYCHIC_TERRAIN); + default: + break; + } + return FALSE; +} + +static bool32 IsLightSensitiveMove(u32 move) +{ + switch (GetMoveEffect(move)) + { + case EFFECT_SOLAR_BEAM: + case EFFECT_MORNING_SUN: + case EFFECT_SYNTHESIS: + case EFFECT_MOONLIGHT: + case EFFECT_GROWTH: + return TRUE; + default: + return FALSE; + } +} + +static bool32 HasLightSensitiveMove(u32 battler) +{ + s32 i; + u16 *moves = GetMovesArray(battler); + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && IsLightSensitiveMove(moves[i])) + return TRUE; + } + + return FALSE; +} + +// Sun +// Utility Umbrella does NOT block Ancient Pokemon from their stat boosts. +static enum FieldEffectOutcome BenefitsFromSun(u32 battler) +{ + enum Ability ability = gAiLogicData->abilities[battler]; + + if (gAiLogicData->holdEffects[battler] == HOLD_EFFECT_UTILITY_UMBRELLA) + { + if (ability == ABILITY_ORICHALCUM_PULSE || ability == ABILITY_PROTOSYNTHESIS) + return FIELD_EFFECT_POSITIVE; + else + return FIELD_EFFECT_NEUTRAL; + } + + if (DoesAbilityBenefitFromWeather(ability, B_WEATHER_SUN) + || HasLightSensitiveMove(battler) + || HasDamagingMoveOfType(battler, TYPE_FIRE) + || HasMoveWithEffect(battler, EFFECT_HYDRO_STEAM)) + return FIELD_EFFECT_POSITIVE; + + if (HasMoveWithFlag(battler, MoveHas50AccuracyInSun) || HasDamagingMoveOfType(battler, TYPE_WATER) || gAiLogicData->abilities[battler] == ABILITY_DRY_SKIN) + return FIELD_EFFECT_NEGATIVE; + + return FIELD_EFFECT_NEUTRAL; +} + +// Sandstorm +static enum FieldEffectOutcome BenefitsFromSandstorm(u32 battler) +{ + if (DoesAbilityBenefitFromWeather(gAiLogicData->abilities[battler], B_WEATHER_SANDSTORM) + || IS_BATTLER_OF_TYPE(battler, TYPE_ROCK)) + return FIELD_EFFECT_POSITIVE; + + if (gAiLogicData->holdEffects[battler] == HOLD_EFFECT_SAFETY_GOGGLES || IS_BATTLER_ANY_TYPE(battler, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL)) + { + if (!(IS_BATTLER_ANY_TYPE(LEFT_FOE(battler), TYPE_ROCK, TYPE_GROUND, TYPE_STEEL)) + || gAiLogicData->holdEffects[LEFT_FOE(battler)] == HOLD_EFFECT_SAFETY_GOGGLES + || DoesAbilityBenefitFromWeather(gAiLogicData->abilities[LEFT_FOE(battler)], B_WEATHER_SANDSTORM)) + return FIELD_EFFECT_POSITIVE; + else + return FIELD_EFFECT_NEUTRAL; + } + + return FIELD_EFFECT_NEGATIVE; +} + +// Hail or Snow +static enum FieldEffectOutcome BenefitsFromHailOrSnow(u32 battler, u32 weather) +{ + if (DoesAbilityBenefitFromWeather(gAiLogicData->abilities[battler], weather) + || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) + || HasMoveWithFlag(battler, MoveAlwaysHitsInHailSnow) + || HasBattlerSideMoveWithEffect(battler, EFFECT_AURORA_VEIL)) + return FIELD_EFFECT_POSITIVE; + + if ((weather & B_WEATHER_DAMAGING_ANY) && gAiLogicData->holdEffects[battler] != HOLD_EFFECT_SAFETY_GOGGLES) + return FIELD_EFFECT_NEGATIVE; + + if (HasLightSensitiveMove(battler)) + return FIELD_EFFECT_NEGATIVE; + + if (HasMoveWithFlag(LEFT_FOE(battler), MoveAlwaysHitsInHailSnow)) + return FIELD_EFFECT_NEGATIVE; + + return FIELD_EFFECT_NEUTRAL; +} + +// Rain +static enum FieldEffectOutcome BenefitsFromRain(u32 battler) +{ + if (gAiLogicData->holdEffects[battler] == HOLD_EFFECT_UTILITY_UMBRELLA) + return FIELD_EFFECT_NEUTRAL; + + if (DoesAbilityBenefitFromWeather(gAiLogicData->abilities[battler], B_WEATHER_RAIN) + || HasMoveWithFlag(battler, MoveAlwaysHitsInRain) + || HasDamagingMoveOfType(battler, TYPE_WATER)) + return FIELD_EFFECT_POSITIVE; + + if (HasLightSensitiveMove(battler) || HasDamagingMoveOfType(battler, TYPE_FIRE)) + return FIELD_EFFECT_NEGATIVE; + + if (HasMoveWithFlag(LEFT_FOE(battler), MoveAlwaysHitsInRain)) + return FIELD_EFFECT_NEGATIVE; + + return FIELD_EFFECT_NEUTRAL; +} + +//TODO: when is electric terrain bad? +static enum FieldEffectOutcome BenefitsFromElectricTerrain(u32 battler) +{ + if (DoesAbilityBenefitFromFieldStatus(gAiLogicData->abilities[battler], STATUS_FIELD_ELECTRIC_TERRAIN)) + return FIELD_EFFECT_POSITIVE; + + if (HasMoveWithEffect(battler, EFFECT_RISING_VOLTAGE)) + return FIELD_EFFECT_POSITIVE; + + if ((HasMoveWithEffect(LEFT_FOE(battler), EFFECT_REST) && AI_IsBattlerGrounded(LEFT_FOE(battler))) + || (HasMoveWithEffect(RIGHT_FOE(battler), EFFECT_REST) && AI_IsBattlerGrounded(RIGHT_FOE(battler)))) + return FIELD_EFFECT_POSITIVE; + + bool32 grounded = AI_IsBattlerGrounded(battler); + if (grounded && HasBattlerSideMoveWithAdditionalEffect(LEFT_FOE(battler), MOVE_EFFECT_SLEEP)) + return FIELD_EFFECT_POSITIVE; + + if (grounded && ((gBattleMons[battler].status1 & STATUS1_SLEEP) + || gBattleMons[battler].volatiles.yawn + || HasDamagingMoveOfType(battler, TYPE_ELECTRIC))) + return FIELD_EFFECT_POSITIVE; + + if (HasBattlerSideMoveWithEffect(LEFT_FOE(battler), EFFECT_RISING_VOLTAGE)) + return FIELD_EFFECT_NEGATIVE; + + + return FIELD_EFFECT_NEUTRAL; +} + +//TODO: when is grassy terrain bad? +static enum FieldEffectOutcome BenefitsFromGrassyTerrain(u32 battler) +{ + if (DoesAbilityBenefitFromFieldStatus(gAiLogicData->abilities[battler], STATUS_FIELD_GRASSY_TERRAIN)) + return FIELD_EFFECT_POSITIVE; + + if (HasBattlerSideMoveWithEffect(battler, EFFECT_GRASSY_GLIDE)) + return FIELD_EFFECT_POSITIVE; + if (HasMoveWithAdditionalEffect(battler, MOVE_EFFECT_FLORAL_HEALING)) + return FIELD_EFFECT_POSITIVE; + + bool32 grounded = AI_IsBattlerGrounded(battler); + + // Weaken spamming Earthquake, Magnitude, and Bulldoze. + if (grounded && (HasBattlerSideMoveWithEffect(LEFT_FOE(battler), EFFECT_EARTHQUAKE) + || HasBattlerSideMoveWithEffect(LEFT_FOE(battler), EFFECT_MAGNITUDE))) + return FIELD_EFFECT_POSITIVE; + + if (grounded && HasDamagingMoveOfType(battler, TYPE_GRASS)) + return FIELD_EFFECT_POSITIVE; + + if (HasBattlerSideMoveWithEffect(LEFT_FOE(battler), EFFECT_GRASSY_GLIDE)) + return FIELD_EFFECT_NEGATIVE; + + + return FIELD_EFFECT_NEUTRAL; +} + +//TODO: when is misty terrain bad? +static enum FieldEffectOutcome BenefitsFromMistyTerrain(u32 battler) +{ + if (DoesAbilityBenefitFromFieldStatus(gAiLogicData->abilities[battler], STATUS_FIELD_MISTY_TERRAIN)) + return FIELD_EFFECT_POSITIVE; + + if (HasBattlerSideMoveWithEffect(battler, EFFECT_MISTY_EXPLOSION)) + return FIELD_EFFECT_POSITIVE; + + bool32 grounded = AI_IsBattlerGrounded(battler); + bool32 allyGrounded = FALSE; + if (HasPartner(battler)) + allyGrounded = AI_IsBattlerGrounded(BATTLE_PARTNER(battler)); + + if ((HasMoveWithEffect(LEFT_FOE(battler), EFFECT_REST) && AI_IsBattlerGrounded(LEFT_FOE(battler))) + || (HasMoveWithEffect(RIGHT_FOE(battler), EFFECT_REST) && AI_IsBattlerGrounded(RIGHT_FOE(battler)))) + return FIELD_EFFECT_POSITIVE; + + // harass dragons + if ((grounded || allyGrounded) + && (HasDamagingMoveOfType(LEFT_FOE(battler), TYPE_DRAGON) || HasDamagingMoveOfType(RIGHT_FOE(battler), TYPE_DRAGON))) + return FIELD_EFFECT_POSITIVE; + + if ((grounded || allyGrounded) + && (HasNonVolatileMoveEffect(LEFT_FOE(battler), MOVE_EFFECT_SLEEP) || HasNonVolatileMoveEffect(RIGHT_FOE(battler), MOVE_EFFECT_SLEEP))) + return FIELD_EFFECT_POSITIVE; + + if (grounded && (gBattleMons[battler].status1 & STATUS1_SLEEP || gBattleMons[battler].volatiles.yawn)) + return FIELD_EFFECT_POSITIVE; + + return FIELD_EFFECT_NEUTRAL; +} + +//TODO: when is Psychic Terrain negative? +static enum FieldEffectOutcome BenefitsFromPsychicTerrain(u32 battler) +{ + if (DoesAbilityBenefitFromFieldStatus(gAiLogicData->abilities[battler], STATUS_FIELD_PSYCHIC_TERRAIN)) + return FIELD_EFFECT_POSITIVE; + + if (HasBattlerSideMoveWithEffect(battler, EFFECT_EXPANDING_FORCE)) + return FIELD_EFFECT_POSITIVE; + + bool32 grounded = AI_IsBattlerGrounded(battler); + bool32 allyGrounded = FALSE; + if (HasPartner(battler)) + allyGrounded = AI_IsBattlerGrounded(BATTLE_PARTNER(battler)); + + // don't bother if we're not grounded + if (grounded || allyGrounded) + { + // harass priority + if (AI_IsAbilityOnSide(LEFT_FOE(battler), ABILITY_GALE_WINGS) + || AI_IsAbilityOnSide(LEFT_FOE(battler), ABILITY_TRIAGE) + || AI_IsAbilityOnSide(LEFT_FOE(battler), ABILITY_PRANKSTER)) + return FIELD_EFFECT_POSITIVE; + } + + if (grounded && HasDamagingMoveOfType(battler, TYPE_PSYCHIC)) + return FIELD_EFFECT_POSITIVE; + + if (HasBattlerSideMoveWithEffect(LEFT_FOE(battler), EFFECT_EXPANDING_FORCE)) + return FIELD_EFFECT_NEGATIVE; + + if (AI_IsAbilityOnSide(battler, ABILITY_GALE_WINGS) + || AI_IsAbilityOnSide(battler, ABILITY_TRIAGE) + || AI_IsAbilityOnSide(battler, ABILITY_PRANKSTER)) + return FIELD_EFFECT_NEGATIVE; + + return FIELD_EFFECT_NEUTRAL; +} + +static enum FieldEffectOutcome BenefitsFromGravity(u32 battler) +{ + if (!AI_IsBattlerGrounded(battler)) + return FIELD_EFFECT_NEGATIVE; + + if (AI_IsAbilityOnSide(battler, ABILITY_HUSTLE)) + return FIELD_EFFECT_POSITIVE; + + if (HasMoveWithFlag(battler, IsMoveGravityBanned)) + return FIELD_EFFECT_NEGATIVE; + + if (IsBattlerAlive(LEFT_FOE(battler))) + { + if (HasMoveWithLowAccuracy(battler, LEFT_FOE(battler), LOW_ACCURACY_THRESHOLD, FALSE) + || (!AI_IsBattlerGrounded(LEFT_FOE(battler)) && HasDamagingMoveOfType(battler, TYPE_GROUND))) + return FIELD_EFFECT_POSITIVE; + } + + if (IsBattlerAlive(RIGHT_FOE(battler))) + { + if (HasMoveWithLowAccuracy(battler, RIGHT_FOE(battler), LOW_ACCURACY_THRESHOLD, FALSE) + || (!AI_IsBattlerGrounded(RIGHT_FOE(battler)) && HasDamagingMoveOfType(battler, TYPE_GROUND))) + return FIELD_EFFECT_POSITIVE; + } + + return FIELD_EFFECT_NEUTRAL; +} + + +static enum FieldEffectOutcome BenefitsFromTrickRoom(u32 battler) +{ + // If we're in singles, we literally only care about speed. + if (IsBattle1v1()) + { + if (gAiLogicData->speedStats[battler] < gAiLogicData->speedStats[LEFT_FOE(battler)]) + return FIELD_EFFECT_POSITIVE; + // If we tie, we shouldn't change trick room state. + else if (gAiLogicData->speedStats[battler] == gAiLogicData->speedStats[LEFT_FOE(battler)]) + return FIELD_EFFECT_NEUTRAL; + else + return FIELD_EFFECT_NEGATIVE; + } + + // First checking if we have enough priority for one pokemon to disregard Trick Room entirely. + if (!(gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN)) + { + u16* aiMoves = GetMovesArray(battler); + for (int i = 0; i < MAX_MON_MOVES; i++) + { + u16 move = aiMoves[i]; + if (GetBattleMovePriority(battler, gAiLogicData->abilities[battler], move) > 0 && !(GetMovePriority(move) > 0 && IsBattleMoveStatus(move))) + { + return FIELD_EFFECT_POSITIVE; + } + } + } + + // If we are faster or tie, we don't want trick room. + if ((gAiLogicData->speedStats[battler] >= gAiLogicData->speedStats[LEFT_FOE(battler)]) || (gAiLogicData->speedStats[battler] >= gAiLogicData->speedStats[RIGHT_FOE(battler)])) + return FIELD_EFFECT_NEGATIVE; + + return FIELD_EFFECT_POSITIVE; +} + + diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 18c140c2d2ef..8dde9c4a97c0 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -14,6 +14,7 @@ #include "debug.h" #include "event_data.h" #include "item.h" +#include "math_util.h" #include "pokemon.h" #include "random.h" #include "recorded_battle.h" @@ -22,7 +23,6 @@ #include "constants/abilities.h" #include "constants/battle_ai.h" #include "constants/battle_move_effects.h" -#include "constants/hold_effects.h" #include "constants/moves.h" #include "constants/items.h" #include "constants/trainers.h" @@ -32,11 +32,13 @@ #define AI_ACTION_WATCH (1 << 2) #define AI_ACTION_DO_NOT_ATTACK (1 << 3) +static u32 ChooseMoveOrAction(u32 battler); static u32 ChooseMoveOrAction_Singles(u32 battler); static u32 ChooseMoveOrAction_Doubles(u32 battler); static inline void BattleAI_DoAIProcessing(struct AiThinkingStruct *aiThink, u32 battlerAtk, u32 battlerDef); static inline void BattleAI_DoAIProcessing_PredictedSwitchin(struct AiThinkingStruct *aiThink, struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef); -static bool32 IsPinchBerryItemEffect(enum ItemHoldEffect holdEffect); +static bool32 IsPinchBerryItemEffect(enum HoldEffect holdEffect); +static void AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef); // ewram EWRAM_DATA const u8 *gAIScriptPtr = NULL; // Still used in contests @@ -49,6 +51,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score static s32 AI_ForceSetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); static s32 AI_TryTo2HKO(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); +static s32 AI_AttacksPartner(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); static s32 AI_Roaming(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); @@ -89,10 +92,10 @@ static s32 (*const sBattleAiFuncTable[])(u32, u32, u32, s32) = [24] = NULL, // AI_FLAG_PREDICT_INCOMING_MON [25] = AI_CheckPpStall, // AI_FLAG_PP_STALL_PREVENTION [26] = NULL, // AI_FLAG_PREDICT_MOVE - [27] = NULL, // Unused - [28] = NULL, // Unused - [29] = NULL, // Unused - [30] = NULL, // Unused + [27] = NULL, // AI_FLAG_SMART_TERA + [28] = NULL, // AI_FLAG_ASSUME_STAB + [29] = NULL, // AI_FLAG_ASSUME_STATUS_MOVES + [30] = AI_AttacksPartner, // AI_FLAG_ATTACKS_PARTNER [31] = NULL, // Unused [32] = NULL, // Unused [33] = NULL, // Unused @@ -179,7 +182,7 @@ static u64 GetWildAiFlags(void) return flags; } -static u64 GetAiFlags(u16 trainerId) +static u64 GetAiFlags(u16 trainerId, u32 battler) { u64 flags = 0; @@ -192,7 +195,7 @@ static u64 GetAiFlags(u16 trainerId) else { if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) - flags = GetAiScriptsInRecordedBattle(); + flags = GetAiScriptsInRecordedBattle(battler); else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) flags = AI_FLAG_SAFARI; else if (gBattleTypeFlags & BATTLE_TYPE_ROAMER) @@ -207,7 +210,7 @@ static u64 GetAiFlags(u16 trainerId) flags = GetTrainerAIFlagsFromId(trainerId); } - if (IsDoubleBattle()) + if (IsDoubleBattle() && flags != 0) { flags |= AI_FLAG_DOUBLE_BATTLE; } @@ -229,7 +232,7 @@ static u64 GetAiFlags(u16 trainerId) void BattleAI_SetupFlags(void) { if (IsAiVsAiBattle()) - gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_LEFT] = GetAiFlags(gPartnerTrainerId); + gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_LEFT] = GetAiFlags(gPartnerTrainerId, B_POSITION_PLAYER_LEFT); else gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_LEFT] = 0; // player has no AI @@ -243,36 +246,49 @@ void BattleAI_SetupFlags(void) if (IsWildMonSmart() && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER))) { // smart wild AI - gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] = GetAiFlags(0xFFFF); - gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] = GetAiFlags(0xFFFF); + gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] = GetAiFlags(0xFFFF, B_POSITION_OPPONENT_LEFT); + gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] = GetAiFlags(0xFFFF, B_POSITION_OPPONENT_RIGHT); + + // The check is here because wild natural enemies are not symmetrical. + if (B_WILD_NATURAL_ENEMIES && IsDoubleBattle()) + { + u32 speciesLeft = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES); + u32 speciesRight = GetMonData(&gEnemyParty[1], MON_DATA_SPECIES); + if (IsNaturalEnemy(speciesLeft, speciesRight)) + gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] |= AI_FLAG_ATTACKS_PARTNER; + if (IsNaturalEnemy(speciesRight, speciesLeft)) + gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] |= AI_FLAG_ATTACKS_PARTNER; + } } else { - gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] = GetAiFlags(TRAINER_BATTLE_PARAM.opponentA); - if (TRAINER_BATTLE_PARAM.opponentB != 0) - gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] = GetAiFlags(TRAINER_BATTLE_PARAM.opponentB); + gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] = GetAiFlags(TRAINER_BATTLE_PARAM.opponentA, B_POSITION_OPPONENT_LEFT); + if ((TRAINER_BATTLE_PARAM.opponentB != 0) && (TRAINER_BATTLE_PARAM.opponentB != 0xFFFF)) + gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] = GetAiFlags(TRAINER_BATTLE_PARAM.opponentB, B_POSITION_OPPONENT_RIGHT); else gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] = gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT]; } if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) { - gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_RIGHT] = GetAiFlags(gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)); + gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_RIGHT] = GetAiFlags(gPartnerTrainerId, B_POSITION_PLAYER_RIGHT); } else if (IsDoubleBattle() && IsAiVsAiBattle()) { gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_RIGHT] = gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_LEFT]; } - else + else // Assign ai flags for player for prediction { - gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_RIGHT] = 0; // player + u64 aiFlags = GetAiFlags(TRAINER_BATTLE_PARAM.opponentA, B_POSITION_OPPONENT_LEFT) + | GetAiFlags(TRAINER_BATTLE_PARAM.opponentB, B_POSITION_OPPONENT_RIGHT); + gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_RIGHT] = aiFlags; + gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_LEFT] = aiFlags; } } void BattleAI_SetupAIData(u8 defaultScoreMoves, u32 battler) { - u32 moveLimitations, moveLimitationsTarget; - u32 defaultScoreMovesTarget = defaultScoreMoves; + u32 moveLimitations; u64 flags[MAX_BATTLERS_COUNT]; u32 moveIndex; @@ -288,7 +304,7 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves, u32 battler) { if (moveLimitations & (1u << moveIndex)) SET_SCORE(battler, moveIndex, 0); - if (defaultScoreMoves & 1) + else if (defaultScoreMoves & 1) SET_SCORE(battler, moveIndex, AI_SCORE_DEFAULT); else SET_SCORE(battler, moveIndex, 0); @@ -298,28 +314,9 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves, u32 battler) gBattlerTarget = SetRandomTarget(battler); gAiBattleData->chosenTarget[battler] = gBattlerTarget; - - // Initialize move prediction scores - if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_PREDICT_MOVE) - { - u32 opposingBattler = GetOppositeBattler(battler); - moveLimitationsTarget = gAiLogicData->moveLimitations[opposingBattler]; - - for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) - { - if (moveLimitationsTarget & (1u << moveIndex)) - SET_SCORE(opposingBattler, moveIndex, 0); - if (defaultScoreMovesTarget & 1) - SET_SCORE(opposingBattler, moveIndex, AI_SCORE_DEFAULT); - else - SET_SCORE(opposingBattler, moveIndex, 0); - - defaultScoreMovesTarget >>= 1; - } - } } -bool32 BattlerChoseNonMoveAction(void) +bool32 BattlerChooseNonMoveAction(void) { if (gAiThinkingStruct->aiAction & AI_ACTION_FLEE) { @@ -340,7 +337,6 @@ void SetupAIPredictionData(u32 battler, enum SwitchType switchType) { s32 opposingBattler = GetOppositeBattler(battler); gAiLogicData->aiPredictionInProgress = TRUE; - gAiLogicData->battlerDoingPrediction = battler; // Switch prediction if ((gAiThinkingStruct->aiFlags[battler] & AI_FLAG_PREDICT_SWITCH)) @@ -349,64 +345,78 @@ void SetupAIPredictionData(u32 battler, enum SwitchType switchType) if (ShouldSwitch(opposingBattler)) gAiLogicData->shouldSwitch |= (1u << opposingBattler); gBattleStruct->prevTurnSpecies[opposingBattler] = gBattleMons[opposingBattler].species; - - // Determine whether AI will use predictions this turn - gAiLogicData->predictingSwitch = RandomPercentage(RNG_AI_PREDICT_SWITCH, PREDICT_SWITCH_CHANCE); } - // Move prediction - if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_PREDICT_MOVE) - { - gAiLogicData->predictedMove[opposingBattler] = gBattleMons[opposingBattler].moves[BattleAI_ChooseMoveIndex(opposingBattler)]; - ModifySwitchAfterMoveScoring(opposingBattler); + // Determine whether AI will use predictions this turn + gAiLogicData->predictingSwitch = RandomPercentage(RNG_AI_PREDICT_SWITCH, PREDICT_SWITCH_CHANCE); - // Determine whether AI will use predictions this turn - gAiLogicData->predictingMove = RandomPercentage(RNG_AI_PREDICT_MOVE, PREDICT_MOVE_CHANCE); - } gAiLogicData->aiPredictionInProgress = FALSE; } void ComputeBattlerDecisions(u32 battler) { - if ((gBattleTypeFlags & BATTLE_TYPE_HAS_AI || IsWildMonSmart()) - && (BattlerHasAi(battler) - && !(gBattleTypeFlags & BATTLE_TYPE_PALACE))) + bool32 isAiBattler = (gBattleTypeFlags & BATTLE_TYPE_HAS_AI || IsWildMonSmart()) && (BattlerHasAi(battler) && !(gBattleTypeFlags & BATTLE_TYPE_PALACE)); + if (isAiBattler || CanAiPredictMove()) { - // If ai is about to flee or chosen to watch player, no need to calc anything - if (BattlerChoseNonMoveAction()) - return; - // Risky AI switches aggressively even mid battle - enum SwitchType switchType = (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_RISKY) ? SWITCH_AFTER_KO : SWITCH_MID_BATTLE; + enum SwitchType switchType = (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_RISKY) ? SWITCH_AFTER_KO : SWITCH_MID_BATTLE_OPTIONAL; gAiLogicData->aiCalcInProgress = TRUE; // Setup battler and prediction data BattleAI_SetupAIData(0xF, battler); - SetupAIPredictionData(battler, switchType); + SetupAIPredictionData(battler, SWITCH_MID_BATTLE_OPTIONAL); // AI's own switching data - gAiLogicData->mostSuitableMonId[battler] = GetMostSuitableMonToSwitchInto(battler, switchType); - if (ShouldSwitch(battler)) - gAiLogicData->shouldSwitch |= (1u << battler); - gBattleStruct->prevTurnSpecies[battler] = gBattleMons[battler].species; + if (isAiBattler) + { + gAiLogicData->mostSuitableMonId[battler] = GetMostSuitableMonToSwitchInto(battler, switchType); + if (ShouldSwitch(battler)) + gAiLogicData->shouldSwitch |= (1u << battler); + gBattleStruct->prevTurnSpecies[battler] = gBattleMons[battler].species; + } // AI's move scoring gAiBattleData->chosenMoveIndex[battler] = BattleAI_ChooseMoveIndex(battler); // Calculate score and chose move index + if (isAiBattler) + BattlerChooseNonMoveAction(); ModifySwitchAfterMoveScoring(battler); gAiLogicData->aiCalcInProgress = FALSE; } } +void ReconsiderGimmick(u32 battlerAtk, u32 battlerDef, u16 move) +{ + // After choosing a move for battlerAtk assuming that a gimmick will be used, reconsider whether the gimmick is necessary. + + if (gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_Z_MOVE && !ShouldUseZMove(battlerAtk, battlerDef, move)) + SetAIUsingGimmick(battlerAtk, NO_GIMMICK); + + if (gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_TERA && GetMoveEffect(move) == EFFECT_PROTECT) + SetAIUsingGimmick(battlerAtk, NO_GIMMICK); +} + +static u32 ChooseMoveOrAction(u32 battler) +{ + if (IsDoubleBattle()) + return ChooseMoveOrAction_Doubles(battler); + return ChooseMoveOrAction_Singles(battler); +} + u32 BattleAI_ChooseMoveIndex(u32 battler) { u32 chosenMoveIndex; - if (!IsDoubleBattle()) - chosenMoveIndex = ChooseMoveOrAction_Singles(battler); - else - chosenMoveIndex = ChooseMoveOrAction_Doubles(battler); + SetAIUsingGimmick(battler, USE_GIMMICK); + + if (gBattleStruct->gimmick.usableGimmick[battler] == GIMMICK_TERA && (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_TERA)) + DecideTerastal(battler); + + chosenMoveIndex = ChooseMoveOrAction(battler); + + if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE) + ReconsiderGimmick(battler, gBattlerTarget, gBattleMons[battler].moves[chosenMoveIndex]); // Clear protect structures, some flags may be set during AI calcs // e.g. pranksterElevated from GetBattleMovePriority @@ -437,6 +447,7 @@ void Ai_InitPartyStruct(void) { u32 i; bool32 isOmniscient = (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_OMNISCIENT) || (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_OMNISCIENT); + bool32 hasPartyKnowledge = (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_KNOW_OPPONENT_PARTY) || (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_KNOW_OPPONENT_PARTY); struct Pokemon *mon; gAiPartyData->count[B_SIDE_PLAYER] = CalculatePlayerPartyCount(); @@ -457,13 +468,16 @@ void Ai_InitPartyStruct(void) // Find fainted mons for (i = 0; i < gAiPartyData->count[B_SIDE_PLAYER]; i++) { + mon = &gPlayerParty[i]; if (GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) gAiPartyData->mons[B_SIDE_PLAYER][i].isFainted = TRUE; + if (isOmniscient || hasPartyKnowledge) + gAiPartyData->mons[B_SIDE_PLAYER][i].species = GetMonData(mon, MON_DATA_SPECIES); + if (isOmniscient) { u32 j; - mon = &gPlayerParty[i]; gAiPartyData->mons[B_SIDE_PLAYER][i].item = GetMonData(mon, MON_DATA_HELD_ITEM); gAiPartyData->mons[B_SIDE_PLAYER][i].heldEffect = GetItemHoldEffect(gAiPartyData->mons[B_SIDE_PLAYER][i].item); gAiPartyData->mons[B_SIDE_PLAYER][i].ability = GetMonAbility(mon); @@ -512,32 +526,70 @@ void Ai_UpdateFaintData(u32 battler) aiMon->isFainted = TRUE; } +void RecordMovesBasedOnStab(u32 battler) +{ + u32 i; + for (i = 0; i < MAX_MON_MOVES; i++) + { + u32 playerMove = gBattleMons[battler].moves[i]; + if (IsSpeciesOfType(gBattleMons[battler].species, GetMoveType(playerMove)) && GetMovePower(playerMove != 0)) + RecordKnownMove(battler, playerMove); + } +} + +void RecordStatusMoves(u32 battler) +{ + u32 i; + for (i = 0; i < MAX_MON_MOVES; i++) + { + u32 playerMove = gBattleMons[battler].moves[i]; + if (ShouldRecordStatusMove(playerMove)) + RecordKnownMove(battler, playerMove); + } +} + void SetBattlerAiData(u32 battler, struct AiLogicData *aiData) { - u32 ability, holdEffect; + enum Ability ability; + u32 holdEffect; ability = aiData->abilities[battler] = AI_DecideKnownAbilityForTurn(battler); aiData->items[battler] = gBattleMons[battler].item; holdEffect = aiData->holdEffects[battler] = AI_DecideHoldEffectForTurn(battler); aiData->holdEffectParams[battler] = GetBattlerHoldEffectParam(battler); - aiData->lastUsedMove[battler] = gLastMoves[battler]; + aiData->lastUsedMove[battler] = (gLastMoves[battler] == MOVE_UNAVAILABLE) ? MOVE_NONE : gLastMoves[battler]; aiData->hpPercents[battler] = GetHealthPercentage(battler); aiData->moveLimitations[battler] = CheckMoveLimitations(battler, 0, MOVE_LIMITATIONS_ALL); - aiData->speedStats[battler] = GetBattlerTotalSpeedStatArgs(battler, ability, holdEffect); + aiData->speedStats[battler] = GetBattlerTotalSpeedStat(battler, ability, holdEffect); + + if (IsAiBattlerAssumingStab()) + RecordMovesBasedOnStab(battler); + + if (IsAiBattlerAssumingStatusMoves()) + RecordStatusMoves(battler); } +#define BYPASSES_ACCURACY_CALC 101 // 101 indicates for ai that the move will always hit static u32 Ai_SetMoveAccuracy(struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef, u32 move) { u32 accuracy; - u32 abilityAtk = aiData->abilities[battlerAtk]; - u32 abilityDef = aiData->abilities[battlerDef]; - if (abilityAtk == ABILITY_NO_GUARD || abilityDef == ABILITY_NO_GUARD || GetMoveAccuracy(move) == 0) // Moves with accuracy 0 or no guard ability always hit. - accuracy = 100; + enum Ability abilityAtk = aiData->abilities[battlerAtk]; + enum Ability abilityDef = aiData->abilities[battlerDef]; + if (CanMoveSkipAccuracyCalc(battlerAtk, battlerDef, abilityAtk, abilityDef, move, AI_CHECK)) + { + accuracy = BYPASSES_ACCURACY_CALC; + } else + { accuracy = GetTotalAccuracy(battlerAtk, battlerDef, move, abilityAtk, abilityDef, aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef]); + // Cap normal accuracy at 100 for ai calcs. + // Done for comparison with moves that bypass accuracy checks (will be seen as 101 for ai calcs)) + accuracy = (accuracy > 100) ? 100 : accuracy; + } return accuracy; } +#undef BYPASSES_ACCURACY_CALC static void CalcBattlerAiMovesData(struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef, u32 weather) { @@ -555,7 +607,7 @@ static void CalcBattlerAiMovesData(struct AiLogicData *aiData, u32 battlerAtk, u continue; // Also get effectiveness of status moves - dmg = AI_CalcDamage(move, battlerAtk, battlerDef, &effectiveness, TRUE, weather); + dmg = AI_CalcDamage(move, battlerAtk, battlerDef, &effectiveness, USE_GIMMICK, NO_GIMMICK, weather); aiData->moveAccuracy[battlerAtk][battlerDef][moveIndex] = Ai_SetMoveAccuracy(aiData, battlerAtk, battlerDef, move); aiData->simulatedDmg[battlerAtk][battlerDef][moveIndex] = dmg; @@ -588,6 +640,7 @@ void SetAiLogicDataForTurn(struct AiLogicData *aiData) u32 battlerAtk, battlersCount, weather; memset(aiData, 0, sizeof(struct AiLogicData)); + gAiBattleData->aiUsingGimmick = 0; if (!(gBattleTypeFlags & BATTLE_TYPE_HAS_AI) && !IsWildMonSmart()) return; @@ -618,6 +671,20 @@ void SetAiLogicDataForTurn(struct AiLogicData *aiData) SetBattlerAiMovesData(aiData, battlerAtk, battlersCount, weather); } + + for (battlerAtk = 0; battlerAtk < battlersCount; battlerAtk++) + { + // Prediction limited to player side but can be expanded to read partners move in the future + if (!IsOnPlayerSide(battlerAtk) || !CanAiPredictMove()) + continue; + + // This can potentially be cleaned up more + BattleAI_SetupAIData(0xF, battlerAtk); + u32 chosenMoveIndex = ChooseMoveOrAction(battlerAtk); + gAiLogicData->predictedMove[battlerAtk] = gBattleMons[battlerAtk].moves[chosenMoveIndex]; + aiData->predictingMove = RandomPercentage(RNG_AI_PREDICT_MOVE, PREDICT_MOVE_CHANCE); + } + if (DEBUG_AI_DELAY_TIMER) // We add to existing to compound multiple calls gBattleStruct->aiDelayCycles += CycleCountEnd(); @@ -628,7 +695,7 @@ u32 GetPartyMonAbility(struct Pokemon *mon) { // Doesn't have any special handling yet u32 species = GetMonData(mon, MON_DATA_SPECIES); - u32 ability = gSpeciesInfo[species].abilities[GetMonData(mon, MON_DATA_ABILITY_NUM)]; + enum Ability ability = GetSpeciesAbility(species, GetMonData(mon, MON_DATA_ABILITY_NUM)); return ability; } @@ -648,11 +715,11 @@ static u32 PpStallReduction(u32 move, u32 battlerAtk) continue; PokemonToBattleMon(&gPlayerParty[partyIndex], &gBattleMons[tempBattleMonIndex]); u32 species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES); - u32 abilityAtk = ABILITY_NONE; - u32 abilityDef = GetPartyMonAbility(&gPlayerParty[partyIndex]); - u32 moveType = GetBattleMoveType(move); // Probably doesn't handle dynamic types right now - if (CanAbilityAbsorbMove(battlerAtk, tempBattleMonIndex, abilityDef, move, moveType, ABILITY_CHECK_TRIGGER) - || CanAbilityBlockMove(battlerAtk, tempBattleMonIndex, abilityAtk, abilityDef, move, ABILITY_CHECK_TRIGGER) + enum Ability abilityAtk = ABILITY_NONE; + enum Ability abilityDef = GetPartyMonAbility(&gPlayerParty[partyIndex]); + enum Type moveType = GetBattleMoveType(move); // Probably doesn't handle dynamic types right now + if (CanAbilityAbsorbMove(battlerAtk, tempBattleMonIndex, abilityDef, move, moveType, CHECK_TRIGGER) + || CanAbilityBlockMove(battlerAtk, tempBattleMonIndex, abilityAtk, abilityDef, move, CHECK_TRIGGER) || (CalcPartyMonTypeEffectivenessMultiplier(move, species, abilityDef) == 0)) { totalStallValue += currentStallValue; @@ -676,10 +743,13 @@ static u32 ChooseMoveOrAction_Singles(u32 battler) u8 consideredMoveArray[MAX_MON_MOVES]; u32 numOfBestMoves; s32 i; - u64 flags = gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)]; + u64 flags = gAiThinkingStruct->aiFlags[battler]; u32 opposingBattler = GetOppositeBattler(battler); + gAiThinkingStruct->aiLogicId = 0; + gAiThinkingStruct->movesetIndex = 0; gAiLogicData->partnerMove = 0; // no ally + while (flags != 0) { if (flags & 1) @@ -693,6 +763,9 @@ static u32 ChooseMoveOrAction_Singles(u32 battler) gAiThinkingStruct->aiLogicId++; } + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_CHECK_VIABILITY) + AI_CompareDamagingMoves(battler, opposingBattler); + for (i = 0; i < MAX_MON_MOVES; i++) { gAiBattleData->finalScore[battler][opposingBattler][i] = gAiThinkingStruct->score[i]; @@ -755,7 +828,7 @@ static u32 ChooseMoveOrAction_Doubles(u32 battler) gAiLogicData->partnerMove = GetAllyChosenMove(battler); gAiThinkingStruct->aiLogicId = 0; gAiThinkingStruct->movesetIndex = 0; - flags = gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)]; + flags = gAiThinkingStruct->aiFlags[battler]; while (flags != 0) { @@ -769,6 +842,8 @@ static u32 ChooseMoveOrAction_Doubles(u32 battler) flags >>= (u64)1; gAiThinkingStruct->aiLogicId++; } + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_CHECK_VIABILITY) + AI_CompareDamagingMoves(battler, gBattlerTarget); mostViableMovesScores[0] = gAiThinkingStruct->score[0]; mostViableMovesIndices[0] = 0; @@ -994,31 +1069,34 @@ void BattleAI_DoAIProcessing_PredictedSwitchin(struct AiThinkingStruct *aiThink, // AI_FLAG_CHECK_BAD_MOVE - decreases move scores static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { + if (IsTargetingPartner(battlerAtk, battlerDef)) + return score; + // move data enum BattleMoveEffects moveEffect = GetMoveEffect(move); u32 nonVolatileStatus = GetMoveNonVolatileStatus(move); - s32 moveType; + enum Type moveType; u32 moveTarget = GetBattlerMoveTargetType(battlerAtk, move); struct AiLogicData *aiData = gAiLogicData; uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex]; - bool32 isDoubleBattle = IsValidDoubleBattle(battlerAtk); + bool32 isBattle1v1 = IsBattle1v1(); + bool32 hasTwoOpponents = HasTwoOpponents(battlerAtk); + bool32 hasPartner = HasPartner(battlerAtk); u32 i; u32 weather; u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); - u32 abilityAtk = aiData->abilities[battlerAtk]; - u32 abilityDef = aiData->abilities[battlerDef]; + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + enum Ability abilityAtk = aiData->abilities[battlerAtk]; + enum Ability abilityDef = aiData->abilities[battlerDef]; s32 atkPriority = GetBattleMovePriority(battlerAtk, abilityAtk, move); - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) - return score; - SetTypeBeforeUsingMove(move, battlerAtk); moveType = GetBattleMoveType(move); - if (IsPowderMove(move) && !IsAffectedByPowder(battlerDef, aiData->abilities[battlerDef], aiData->holdEffects[battlerDef])) + if (IsPowderMove(move) && !IsAffectedByPowderMove(battlerDef, aiData->abilities[battlerDef], aiData->holdEffects[battlerDef])) RETURN_SCORE_MINUS(10); - if (IsSemiInvulnerable(battlerDef, move) && moveEffect != EFFECT_SEMI_INVULNERABLE && AI_IsFaster(battlerAtk, battlerDef, move)) + if (!BreaksThroughSemiInvulnerablity(battlerDef, move) && moveEffect != EFFECT_SEMI_INVULNERABLE && AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) RETURN_SCORE_MINUS(10); if (IsTwoTurnNotSemiInvulnerableMove(battlerAtk, move) && CanTargetFaintAi(battlerDef, battlerAtk)) @@ -1038,7 +1116,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // Don't use anything but super effective thawing moves if target is frozen if any other attack available - if (((GetMoveType(move) == TYPE_FIRE && GetMovePower(move) != 0) || CanBurnHitThaw(move)) && effectiveness < UQ_4_12(2.0) && (gBattleMons[battlerDef].status1 & (STATUS1_FROSTBITE | STATUS1_FREEZE))) + if (((GetMoveType(move) == TYPE_FIRE && GetMovePower(move) != 0) || CanBurnHitThaw(move)) && effectiveness < UQ_4_12(2.0) && (gBattleMons[battlerDef].status1 & STATUS1_ICY_ANY)) { u32 aiMove; for (i = 0; i < MAX_MON_MOVES; i++) @@ -1053,41 +1131,27 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } if (effectiveness == UQ_4_12(0.0)) - { RETURN_SCORE_MINUS(20); - } - else if (effectiveness < UQ_4_12(0.5)) - { - switch (moveEffect) - { - case EFFECT_FIXED_DAMAGE_ARG: - case EFFECT_LEVEL_DAMAGE: - case EFFECT_PSYWAVE: - case EFFECT_OHKO: - case EFFECT_BIDE: - case EFFECT_SUPER_FANG: - case EFFECT_ENDEAVOR: - case EFFECT_COUNTER: - case EFFECT_MIRROR_COAT: - case EFFECT_METAL_BURST: - case EFFECT_FINAL_GAMBIT: - case EFFECT_GUARDIAN_OF_ALOLA: - break; - default: - RETURN_SCORE_MINUS(10); - } - } if (DoesBattlerIgnoreAbilityChecks(battlerAtk, abilityAtk, move)) abilityDef = ABILITY_NONE; + // If a pokemon can be guaranteed flinched, don't target the pokemon that can't be flinched. + if (hasTwoOpponents + && !IsFlinchGuaranteed(battlerAtk, battlerDef, move) && IsFlinchGuaranteed(battlerAtk, BATTLE_PARTNER(battlerDef), move) + && aiData->effectiveness[battlerAtk][BATTLE_PARTNER(battlerDef)][gAiThinkingStruct->movesetIndex] != UQ_4_12(0.0)) + ADJUST_SCORE(-5); + // check non-user target if (!(moveTarget & MOVE_TARGET_USER)) { - if (CanAbilityBlockMove(battlerAtk, battlerDef, abilityAtk, abilityDef, move, ABILITY_CHECK_TRIGGER_AI)) + if (Ai_IsPriorityBlocked(battlerAtk, battlerDef, move, aiData)) + RETURN_SCORE_MINUS(20); + + if (CanAbilityBlockMove(battlerAtk, battlerDef, abilityAtk, abilityDef, move, AI_CHECK)) RETURN_SCORE_MINUS(20); - if (CanAbilityAbsorbMove(battlerAtk, battlerDef, abilityDef, move, moveType, ABILITY_CHECK_TRIGGER_AI)) + if (CanAbilityAbsorbMove(battlerAtk, battlerDef, abilityDef, move, moveType, AI_CHECK)) RETURN_SCORE_MINUS(20); switch (abilityDef) @@ -1113,15 +1177,16 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case MOVE_EFFECT_BURN: ADJUST_SCORE(-5); break; + default: + break; } break; - break; case ABILITY_WONDER_GUARD: if (effectiveness < UQ_4_12(2.0)) RETURN_SCORE_MINUS(20); break; case ABILITY_JUSTIFIED: - if (moveType == TYPE_DARK && !IsBattleMoveStatus(move) && !IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (moveType == TYPE_DARK && !IsBattleMoveStatus(move) && !IsTargetingPartner(battlerAtk, battlerDef)) RETURN_SCORE_MINUS(10); break; case ABILITY_RATTLED: @@ -1163,10 +1228,12 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) && IsNonVolatileStatusMove(move)) RETURN_SCORE_MINUS(10); break; + default: + break; } // def ability checks // target partner ability checks & not attacking partner - if (isDoubleBattle) + if (hasTwoOpponents) { switch (aiData->abilities[BATTLE_PARTNER(battlerDef)]) { @@ -1194,29 +1261,31 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (IsAromaVeilProtectedEffect(moveEffect)) RETURN_SCORE_MINUS(10); break; + default: + break; } } // def partner ability checks // gen7+ dark type mons immune to priority->elevated moves from prankster - if (B_PRANKSTER_DARK_TYPES >= GEN_7 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_DARK) + if (GetConfig(CONFIG_PRANKSTER_DARK_TYPES) >= GEN_7 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_DARK) && aiData->abilities[battlerAtk] == ABILITY_PRANKSTER && IsBattleMoveStatus(move) && !(moveTarget & (MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_USER))) RETURN_SCORE_MINUS(10); // terrain & effect checks - if (IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_ELECTRIC_TERRAIN)) + if (IsBattlerTerrainAffected(battlerDef, abilityDef, aiData->holdEffects[battlerDef], STATUS_FIELD_ELECTRIC_TERRAIN)) { if (nonVolatileStatus == MOVE_EFFECT_SLEEP) RETURN_SCORE_MINUS(20); } - if (IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN)) + if (IsBattlerTerrainAffected(battlerDef, abilityDef, aiData->holdEffects[battlerDef], STATUS_FIELD_MISTY_TERRAIN)) { if (IsNonVolatileStatusMove(move) || IsConfusionMoveEffect(moveEffect)) RETURN_SCORE_MINUS(20); } - if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_PSYCHIC_TERRAIN) && atkPriority > 0) + if (IsBattlerTerrainAffected(battlerAtk, abilityAtk, aiData->holdEffects[battlerAtk], STATUS_FIELD_PSYCHIC_TERRAIN) && atkPriority > 0) { RETURN_SCORE_MINUS(20); } @@ -1225,10 +1294,10 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // the following checks apply to any target (including user) // throat chop check - if (gDisableStructs[battlerAtk].throatChopTimer > gBattleTurnCounter && IsSoundMove(move)) + if (gDisableStructs[battlerAtk].throatChopTimer > 0 && IsSoundMove(move)) return 0; // Can't even select move at all // heal block check - if (gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK && IsHealBlockPreventingMove(battlerAtk, move)) + if (gBattleMons[battlerAtk].volatiles.healBlock && IsHealBlockPreventingMove(battlerAtk, move)) return 0; // Can't even select heal blocked move // primal weather check @@ -1267,12 +1336,13 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (moveEffect) { case EFFECT_HIT: // only applies to Vital Throw - if (GetBattleMovePriority(battlerAtk, aiData->abilities[battlerAtk], move) < 0 && AI_IsFaster(battlerAtk, battlerDef, move) && aiData->hpPercents[battlerAtk] < 40) + if (GetBattleMovePriority(battlerAtk, aiData->abilities[battlerAtk], move) < 0 && AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) && aiData->hpPercents[battlerAtk] < 40) ADJUST_SCORE(-2); // don't want to move last break; default: break; // check move damage case EFFECT_EXPLOSION: + case EFFECT_MISTY_EXPLOSION: if (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE)) ADJUST_SCORE(-2); @@ -1378,7 +1448,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_CHARGE: - if (gStatuses3[battlerAtk] & STATUS3_CHARGED_UP) + if (gBattleMons[battlerAtk].volatiles.chargeTimer > 0) ADJUST_SCORE(-20); else if (!HasMoveWithType(battlerAtk, TYPE_ELECTRIC)) ADJUST_SCORE(-10); @@ -1388,7 +1458,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_QUIVER_DANCE: case EFFECT_GEOMANCY: - if (HasBattlerSideAbility(battlerDef, ABILITY_UNAWARE, aiData)) + if (AI_IsAbilityOnSide(battlerDef, ABILITY_UNAWARE)) ADJUST_SCORE(-10); if (gBattleMons[battlerAtk].statStages[STAT_SPATK] >= MAX_STAT_STAGE || !HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL)) ADJUST_SCORE(-10); @@ -1436,13 +1506,13 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_ROTOTILLER: - if (isDoubleBattle) + if (hasPartner) { if (!(IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GRASS) - && IsBattlerGrounded(battlerAtk) + && AI_IsBattlerGrounded(battlerAtk) && (BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPATK))) && !(IS_BATTLER_OF_TYPE(BATTLE_PARTNER(battlerAtk), TYPE_GRASS) - && IsBattlerGrounded(BATTLE_PARTNER(battlerAtk)) + && AI_IsBattlerGrounded(BATTLE_PARTNER(battlerAtk)) && aiData->abilities[BATTLE_PARTNER(battlerAtk)] != ABILITY_CONTRARY && (BattlerStatCanRise(BATTLE_PARTNER(battlerAtk), aiData->abilities[BATTLE_PARTNER(battlerAtk)], STAT_ATK) || BattlerStatCanRise(BATTLE_PARTNER(battlerAtk), aiData->abilities[BATTLE_PARTNER(battlerAtk)], STAT_SPATK)))) @@ -1451,7 +1521,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } } else if (!(IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GRASS) - && IsBattlerGrounded(battlerAtk) + && AI_IsBattlerGrounded(battlerAtk) && (BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPATK)))) { ADJUST_SCORE(-10); @@ -1467,12 +1537,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-8); break; } - else if (!isDoubleBattle) - { - ADJUST_SCORE(-10); // no partner and our stats wont rise, so don't use - } - - if (isDoubleBattle) + else if (hasPartner) { if (aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_PLUS || aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_MINUS) { @@ -1485,6 +1550,10 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); // nor our or our partner's ability is plus/minus } } + else + { + ADJUST_SCORE(-10); // no partner and our stats wont rise, so don't use + } break; case EFFECT_ACUPRESSURE: if (DoesSubstituteBlockMove(battlerAtk, battlerDef, move) || AreBattlersStatsMaxed(battlerDef)) @@ -1498,12 +1567,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) else if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPDEF)) ADJUST_SCORE(-8); } - else if (!isDoubleBattle) - { - ADJUST_SCORE(-10); // our stats wont rise from this move - } - - if (isDoubleBattle) + else if (hasPartner) { if (aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_PLUS || aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_MINUS) { @@ -1517,44 +1581,48 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); // nor our or our partner's ability is plus/minus } } + else + { + ADJUST_SCORE(-10); // our stats wont rise from this move + } break; // stat lowering effects case EFFECT_ATTACK_DOWN: case EFFECT_ATTACK_DOWN_2: - if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK)) //|| !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)) + if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_ATK)) ADJUST_SCORE(-10); break; case EFFECT_DEFENSE_DOWN: case EFFECT_DEFENSE_DOWN_2: - if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_DEF)) + if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_DEF)) ADJUST_SCORE(-10); break; case EFFECT_SPEED_DOWN: case EFFECT_SPEED_DOWN_2: - if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPEED)) + if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_SPEED)) ADJUST_SCORE(-10); break; case EFFECT_SPECIAL_ATTACK_DOWN: case EFFECT_SPECIAL_ATTACK_DOWN_2: - if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPATK)) //|| !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)) + if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_SPATK)) ADJUST_SCORE(-10); break; case EFFECT_SPECIAL_DEFENSE_DOWN: case EFFECT_SPECIAL_DEFENSE_DOWN_2: - if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPDEF)) + if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_SPDEF)) ADJUST_SCORE(-10); break; case EFFECT_ACCURACY_DOWN: case EFFECT_ACCURACY_DOWN_2: - if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ACC)) + if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_ACC)) ADJUST_SCORE(-10); break; case EFFECT_EVASION_DOWN: case EFFECT_EVASION_DOWN_2: case EFFECT_TICKLE: - if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK)) + if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_ATK)) ADJUST_SCORE(-10); - else if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_DEF)) + else if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_DEF)) ADJUST_SCORE(-8); break; case EFFECT_VENOM_DRENCH: @@ -1564,18 +1632,18 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } else { - if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPEED)) + if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_SPEED)) ADJUST_SCORE(-10); - else if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPATK)) + else if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_SPATK)) ADJUST_SCORE(-8); - else if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK)) + else if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_ATK)) ADJUST_SCORE(-6); } break; case EFFECT_NOBLE_ROAR: - if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPATK)) + if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_SPATK)) ADJUST_SCORE(-10); - else if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK)) + else if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_ATK)) ADJUST_SCORE(-8); break; case EFFECT_CAPTIVATE: @@ -1584,7 +1652,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; // other case EFFECT_HAZE: - if (PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + if (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) { ADJUST_SCORE(-10); // partner already using haze } @@ -1603,23 +1671,26 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_PRESENT: - case EFFECT_FIXED_DAMAGE_ARG: + case EFFECT_FIXED_HP_DAMAGE: case EFFECT_FOCUS_PUNCH: // AI_CBM_HighRiskForDamage if (aiData->abilities[battlerDef] == ABILITY_WONDER_GUARD && effectiveness < UQ_4_12(2.0)) ADJUST_SCORE(-10); - if (HasDamagingMove(battlerDef) && !((gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE) + if (HasDamagingMove(battlerDef) && !(gBattleMons[battlerAtk].volatiles.substitute || IsBattlerIncapacitated(battlerDef, abilityDef) - || gBattleMons[battlerDef].status2 & (STATUS2_INFATUATION | STATUS2_CONFUSION))) + || gBattleMons[battlerDef].volatiles.infatuation + || gBattleMons[battlerDef].volatiles.confusionTurns)) ADJUST_SCORE(-10); - if (HasMoveWithEffect(battlerAtk, EFFECT_SUBSTITUTE) && !(gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE)) + if (HasMoveWithEffect(battlerAtk, EFFECT_SUBSTITUTE) && !gBattleMons[battlerAtk].volatiles.substitute) ADJUST_SCORE(-10); if (HasNonVolatileMoveEffect(battlerAtk, MOVE_EFFECT_SLEEP) && ! (gBattleMons[battlerDef].status1 & STATUS1_SLEEP)) ADJUST_SCORE(-10); break; case EFFECT_COUNTER: case EFFECT_MIRROR_COAT: - if (IsBattlerIncapacitated(battlerDef, aiData->abilities[battlerDef]) || gBattleMons[battlerDef].status2 & (STATUS2_INFATUATION | STATUS2_CONFUSION)) + if (IsBattlerIncapacitated(battlerDef, aiData->abilities[battlerDef]) + || gBattleMons[battlerDef].volatiles.infatuation + || gBattleMons[battlerDef].volatiles.confusionTurns > 0) ADJUST_SCORE(-1); if ((predictedMove == MOVE_NONE || GetBattleMoveCategory(predictedMove) == DAMAGE_CATEGORY_STATUS || DoesSubstituteBlockMove(battlerAtk, BATTLE_PARTNER(battlerDef), predictedMove)) @@ -1636,28 +1707,32 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_TOXIC_THREAD: - if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPEED)) + if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_SPEED)) ADJUST_SCORE(-1); // may still want to just poison - //fallthrough + if (!AI_CanPoison(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, aiData->partnerMove)) + ADJUST_SCORE(-10); + break; case EFFECT_LIGHT_SCREEN: - if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_LIGHTSCREEN - || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + if (gSideStatuses[GetBattlerSide(battlerAtk)] & (SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL) + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-10); break; case EFFECT_REFLECT: - if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_REFLECT - || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + if (gSideStatuses[GetBattlerSide(battlerAtk)] & (SIDE_STATUS_REFLECT | SIDE_STATUS_AURORA_VEIL) + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-10); break; case EFFECT_AURORA_VEIL: if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_AURORA_VEIL - || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove) - || !(weather & (B_WEATHER_HAIL | B_WEATHER_SNOW))) + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + || !(weather & (B_WEATHER_ICY_ANY))) ADJUST_SCORE(-10); break; - case EFFECT_OHKO: - if (B_SHEER_COLD_IMMUNITY >= GEN_7 && move == MOVE_SHEER_COLD && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE)) + case EFFECT_SHEER_COLD: + if (GetConfig(CONFIG_SHEER_COLD_IMMUNITY) >= GEN_7 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE)) RETURN_SCORE_MINUS(20); + // fallthrough + case EFFECT_OHKO: if (!ShouldTryOHKO(battlerAtk, battlerDef, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], move)) ADJUST_SCORE(-10); else if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) @@ -1665,21 +1740,26 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_MIST: if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_MIST - || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_FOCUS_ENERGY: - if (gBattleMons[battlerAtk].status2 & STATUS2_FOCUS_ENERGY_ANY) + if (gBattleMons[battlerAtk].volatiles.dragonCheer || gBattleMons[battlerAtk].volatiles.focusEnergy) + ADJUST_SCORE(-10); + break; + case EFFECT_NON_VOLATILE_STATUS: + if (DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_CONFUSE: case EFFECT_SWAGGER: case EFFECT_FLATTER: - if (!AI_CanConfuse(battlerAtk, battlerDef, aiData->abilities[battlerDef], BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + if (DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove) + || !AI_CanConfuse(battlerAtk, battlerDef, aiData->abilities[battlerDef], BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_SUBSTITUTE: - if (gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE || aiData->abilities[battlerDef] == ABILITY_INFILTRATOR) + if (gBattleMons[battlerAtk].volatiles.substitute || aiData->abilities[battlerDef] == ABILITY_INFILTRATOR) ADJUST_SCORE(-8); else if (aiData->hpPercents[battlerAtk] <= 25) ADJUST_SCORE(-10); @@ -1689,7 +1769,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_SHED_TAIL: if (CountUsablePartyMons(battlerAtk) == 0) ADJUST_SCORE(-10); - if (gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE || aiData->abilities[battlerDef] == ABILITY_INFILTRATOR) + if (gBattleMons[battlerAtk].volatiles.substitute || aiData->abilities[battlerDef] == ABILITY_INFILTRATOR) ADJUST_SCORE(-8); else if (aiData->hpPercents[battlerAtk] <= 50) ADJUST_SCORE(-10); @@ -1697,7 +1777,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-8); break; case EFFECT_LEECH_SEED: - if (gStatuses3[battlerDef] & STATUS3_LEECHSEED + if (gBattleMons[battlerDef].volatiles.leechSeed || IS_BATTLER_OF_TYPE(battlerDef, TYPE_GRASS) || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); @@ -1709,11 +1789,11 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); else if (gDisableStructs[battlerDef].disableTimer == 0 && (B_MENTAL_HERB < GEN_5 || aiData->holdEffects[battlerDef] != HOLD_EFFECT_MENTAL_HERB) - && !PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + && !DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) { - if (AI_IsFaster(battlerAtk, battlerDef, move)) // Attacker should go first + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Attacker should go first { - if (gLastMoves[battlerDef] == MOVE_NONE || gLastMoves[battlerDef] == 0xFFFF) + if (aiData->lastUsedMove[battlerDef] == MOVE_NONE) ADJUST_SCORE(-10); // no anticipated move to disable } else if (predictedMove == MOVE_NONE) @@ -1733,9 +1813,9 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) && (B_MENTAL_HERB < GEN_5 || aiData->holdEffects[battlerDef] != HOLD_EFFECT_MENTAL_HERB) && !DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) { - if (AI_IsFaster(battlerAtk, battlerDef, move)) // Attacker should go first + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Attacker should go first { - if (gLastMoves[battlerDef] == MOVE_NONE || gLastMoves[battlerDef] == 0xFFFF) + if (aiData->lastUsedMove[battlerDef] == MOVE_NONE) ADJUST_SCORE(-10); // no anticipated move to encore } else if (predictedMove == MOVE_NONE) @@ -1760,7 +1840,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_NIGHTMARE: - if (gBattleMons[battlerDef].status2 & STATUS2_NIGHTMARE) + if (gBattleMons[battlerDef].volatiles.nightmare) ADJUST_SCORE(-10); else if (!AI_IsBattlerAsleepOrComatose(battlerDef)) ADJUST_SCORE(-8); @@ -1770,7 +1850,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_CURSE: if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GHOST)) { - if (gBattleMons[battlerDef].status2 & STATUS2_CURSED + if (gBattleMons[battlerDef].volatiles.cursed || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); else if (aiData->hpPercents[battlerAtk] <= 50) @@ -1792,7 +1872,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); // only one mon needs to set up the last layer of Spikes break; case EFFECT_STEALTH_ROCK: - if (gSideTimers[GetBattlerSide(battlerDef)].stealthRockAmount > 0 + if (IsHazardOnSide(GetBattlerSide(battlerDef), HAZARDS_STEALTH_ROCK) || PartnerMoveIsSameNoTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) //Only one mon needs to set up Stealth Rocks ADJUST_SCORE(-10); break; @@ -1803,13 +1883,13 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); // only one mon needs to set up the last layer of Toxic Spikes break; case EFFECT_STICKY_WEB: - if (gSideTimers[GetBattlerSide(battlerDef)].stickyWebAmount) + if (IsHazardOnSide(GetBattlerSide(battlerDef), HAZARDS_STICKY_WEB)) ADJUST_SCORE(-10); - else if (PartnerMoveIsSameNoTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove) && gSideTimers[GetBattlerSide(battlerDef)].stickyWebAmount) + if (DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); // only one mon needs to set up Sticky Web break; case EFFECT_FORESIGHT: - if (gBattleMons[battlerDef].status2 & STATUS2_FORESIGHT) + if (gBattleMons[battlerDef].volatiles.foresight) ADJUST_SCORE(-10); else if (gBattleMons[battlerDef].statStages[STAT_EVASION] <= 4 || !(IS_BATTLER_OF_TYPE(battlerDef, TYPE_GHOST)) @@ -1817,19 +1897,19 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-9); break; case EFFECT_PERISH_SONG: - if (isDoubleBattle) + if (!isBattle1v1) { if (CountUsablePartyMons(battlerAtk) == 0 && aiData->abilities[battlerAtk] != ABILITY_SOUNDPROOF - && aiData->abilities[BATTLE_PARTNER(battlerAtk)] != ABILITY_SOUNDPROOF - && CountUsablePartyMons(FOE(battlerAtk)) >= 1) + && CountUsablePartyMons(battlerDef) >= 1 + && (aiData->abilities[BATTLE_PARTNER(battlerAtk)] != ABILITY_SOUNDPROOF || !IsBattlerAlive(BATTLE_PARTNER(battlerAtk)))) { ADJUST_SCORE(-10); //Don't wipe your team if you're going to lose } - else if ((!IsBattlerAlive(FOE(battlerAtk)) || aiData->abilities[FOE(battlerAtk)] == ABILITY_SOUNDPROOF - || gStatuses3[FOE(battlerAtk)] & STATUS3_PERISH_SONG) - && (!IsBattlerAlive(BATTLE_PARTNER(FOE(battlerAtk))) || aiData->abilities[BATTLE_PARTNER(FOE(battlerAtk))] == ABILITY_SOUNDPROOF - || gStatuses3[BATTLE_PARTNER(FOE(battlerAtk))] & STATUS3_PERISH_SONG)) + else if ((!IsBattlerAlive(LEFT_FOE(battlerAtk)) || aiData->abilities[LEFT_FOE(battlerAtk)] == ABILITY_SOUNDPROOF + || gBattleMons[LEFT_FOE(battlerAtk)].volatiles.perishSong) + && (!IsBattlerAlive(RIGHT_FOE(battlerAtk)) || aiData->abilities[RIGHT_FOE(battlerAtk)] == ABILITY_SOUNDPROOF + || gBattleMons[RIGHT_FOE(battlerAtk)].volatiles.perishSong)) { ADJUST_SCORE(-10); //Both enemies are perish songed } @@ -1844,38 +1924,30 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) && CountUsablePartyMons(battlerDef) >= 1) ADJUST_SCORE(-10); - if (gStatuses3[FOE(battlerAtk)] & STATUS3_PERISH_SONG || aiData->abilities[FOE(battlerAtk)] == ABILITY_SOUNDPROOF) + if (gBattleMons[battlerDef].volatiles.perishSong || aiData->abilities[battlerDef] == ABILITY_SOUNDPROOF) ADJUST_SCORE(-10); } break; case EFFECT_SANDSTORM: if (weather & (B_WEATHER_SANDSTORM | B_WEATHER_PRIMAL_ANY) - || IsMoveEffectWeather(aiData->partnerMove)) + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-8); break; case EFFECT_SUNNY_DAY: if (weather & (B_WEATHER_SUN | B_WEATHER_PRIMAL_ANY) - || IsMoveEffectWeather(aiData->partnerMove)) + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-8); break; case EFFECT_RAIN_DANCE: if (weather & (B_WEATHER_RAIN | B_WEATHER_PRIMAL_ANY) - || IsMoveEffectWeather(aiData->partnerMove)) + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-8); break; case EFFECT_HAIL: - if (weather & (B_WEATHER_HAIL | B_WEATHER_PRIMAL_ANY) - || IsMoveEffectWeather(aiData->partnerMove)) - ADJUST_SCORE(-8); - else if (weather & B_WEATHER_SNOW) - ADJUST_SCORE(-2); // mainly to prevent looping between hail and snow - break; case EFFECT_SNOWSCAPE: - if (weather & (B_WEATHER_SNOW | B_WEATHER_PRIMAL_ANY) - || IsMoveEffectWeather(aiData->partnerMove)) + if (weather & (B_WEATHER_ICY_ANY | B_WEATHER_PRIMAL_ANY) + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-8); - else if (weather & B_WEATHER_HAIL) - ADJUST_SCORE(-2); // mainly to prevent looping between hail and snow break; case EFFECT_ATTRACT: if (!AI_CanBeInfatuated(battlerAtk, battlerDef, aiData->abilities[battlerDef])) @@ -1883,7 +1955,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_SAFEGUARD: if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_SAFEGUARD - || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_MAGNITUDE: @@ -1897,9 +1969,12 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_BATON_PASS: if (CountUsablePartyMons(battlerAtk) == 0) ADJUST_SCORE(-10); - else if (gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE - || (gStatuses3[battlerAtk] & (STATUS3_ROOTED | STATUS3_AQUA_RING | STATUS3_MAGNET_RISE | STATUS3_POWER_TRICK)) - || AnyStatIsRaised(battlerAtk)) + else if (gBattleMons[battlerAtk].volatiles.substitute + || gBattleMons[battlerAtk].volatiles.powerTrick + || gBattleMons[battlerAtk].volatiles.magnetRise + || gBattleMons[battlerAtk].volatiles.aquaRing + || gBattleMons[battlerAtk].volatiles.root + || AnyStatIsRaised(battlerAtk)) break; else ADJUST_SCORE(-6); @@ -1909,23 +1984,22 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_CHILLY_RECEPTION: if (CountUsablePartyMons(battlerAtk) == 0) ADJUST_SCORE(-10); - else if (weather & (B_WEATHER_SNOW | B_WEATHER_PRIMAL_ANY) || IsMoveEffectWeather(aiData->partnerMove)) + else if (weather & (B_WEATHER_ICY_ANY | B_WEATHER_PRIMAL_ANY) + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-8); - else if (weather & B_WEATHER_HAIL) - ADJUST_SCORE(-2); // mainly to prevent looping between hail and snow break; case EFFECT_BELLY_DRUM: case EFFECT_FILLET_AWAY: - if (HasBattlerSideAbility(battlerDef, ABILITY_UNAWARE, aiData)) + if (AI_IsAbilityOnSide(battlerDef, ABILITY_UNAWARE)) ADJUST_SCORE(-10); if (aiData->abilities[battlerAtk] == ABILITY_CONTRARY) ADJUST_SCORE(-10); - else if (aiData->hpPercents[battlerAtk] <= 60) + else if (aiData->hpPercents[battlerAtk] <= 60 && !IsConsideringZMove(battlerAtk, battlerDef, move)) ADJUST_SCORE(-10); break; case EFFECT_FUTURE_SIGHT: - if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_FUTUREATTACK - || gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_FUTUREATTACK) + if (gWishFutureKnock.futureSightCounter[LEFT_FOE(battlerAtk)] > 0 + || gWishFutureKnock.futureSightCounter[RIGHT_FOE(battlerAtk)] > 0) ADJUST_SCORE(-12); else ADJUST_SCORE(GOOD_EFFECT); @@ -1936,6 +2010,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_FIRST_TURN_ONLY: if (!gDisableStructs[battlerAtk].isFirstTurn) ADJUST_SCORE(-10); + if (HasChoiceEffect(battlerAtk)) + ADJUST_SCORE(-5); break; case EFFECT_STOCKPILE: if (gDisableStructs[battlerAtk].stockpileCounter >= 3) @@ -1957,7 +2033,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_TORMENT: if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) ADJUST_SCORE(-10); - else if (gBattleMons[battlerDef].status2 & STATUS2_TORMENT + else if (gBattleMons[battlerDef].volatiles.torment || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) { ADJUST_SCORE(-10); @@ -1973,38 +2049,54 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_FOLLOW_ME: + if (!hasPartner + || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove) + || (aiData->partnerMove != MOVE_NONE && IsBattleMoveStatus(aiData->partnerMove)) + || gBattleStruct->monToSwitchIntoId[BATTLE_PARTNER(battlerAtk)] != PARTY_SIZE) + ADJUST_SCORE(-20); + break; case EFFECT_HELPING_HAND: - if (!isDoubleBattle - || !IsBattlerAlive(BATTLE_PARTNER(battlerAtk)) - || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove) + if (!hasPartner + || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove) + || aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_GOOD_AS_GOLD || (aiData->partnerMove != MOVE_NONE && IsBattleMoveStatus(aiData->partnerMove)) || gBattleStruct->monToSwitchIntoId[BATTLE_PARTNER(battlerAtk)] != PARTY_SIZE) //Partner is switching out. - ADJUST_SCORE(-10); + ADJUST_SCORE(-20); break; case EFFECT_TRICK: + if ((gBattleMons[battlerAtk].item == ITEM_NONE && aiData->items[battlerDef] == ITEM_NONE) + || !CanBattlerGetOrLoseItem(battlerAtk, gBattleMons[battlerAtk].item) + || !CanBattlerGetOrLoseItem(battlerAtk, aiData->items[battlerDef]) + || !CanBattlerGetOrLoseItem(battlerDef, aiData->items[battlerDef]) + || !CanBattlerGetOrLoseItem(battlerDef, gBattleMons[battlerAtk].item) + || aiData->abilities[battlerAtk] == ABILITY_STICKY_HOLD + || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD + || DoesSubstituteBlockMove(battlerAtk, battlerDef, move)) + ADJUST_SCORE(-10); case EFFECT_KNOCK_OFF: case EFFECT_CORROSIVE_GAS: if (aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) ADJUST_SCORE(-10); break; case EFFECT_INGRAIN: - if (gStatuses3[battlerAtk] & STATUS3_ROOTED) + if (gBattleMons[battlerAtk].volatiles.root) ADJUST_SCORE(-10); break; case EFFECT_AQUA_RING: - if (gStatuses3[battlerAtk] & STATUS3_AQUA_RING) + if (gBattleMons[battlerAtk].volatiles.aquaRing) ADJUST_SCORE(-10); break; case EFFECT_RECYCLE: - if (GetUsedHeldItem(battlerAtk) == 0 || gBattleMons[battlerAtk].item != 0) + if (GetBattlerPartyState(battlerAtk)->usedHeldItem == 0 || gBattleMons[battlerAtk].item != 0) ADJUST_SCORE(-10); break; case EFFECT_IMPRISON: - if (gStatuses3[battlerAtk] & STATUS3_IMPRISONED_OTHERS) + if (gBattleMons[battlerAtk].volatiles.imprison) ADJUST_SCORE(-10); break; case EFFECT_REFRESH: - if (!(gBattleMons[battlerDef].status1 & (STATUS1_PSN_ANY | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_FROSTBITE))) + if (!(gBattleMons[battlerAtk].status1 & STATUS1_CAN_MOVE) + || !ShouldCureStatus(battlerAtk, battlerAtk, aiData)) ADJUST_SCORE(-10); break; case EFFECT_PSYCHO_SHIFT: @@ -2025,14 +2117,14 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_MUD_SPORT: if (gFieldStatuses & STATUS_FIELD_MUDSPORT - || gStatuses4[battlerAtk] & STATUS4_MUD_SPORT - || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + || gBattleMons[battlerAtk].volatiles.mudSport + || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_WATER_SPORT: if (gFieldStatuses & STATUS_FIELD_WATERSPORT - || gStatuses4[battlerAtk] & STATUS4_WATER_SPORT - || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + || gBattleMons[battlerAtk].volatiles.waterSport + || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_ABSORB: @@ -2042,25 +2134,29 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_STRENGTH_SAP: if (aiData->abilities[battlerDef] == ABILITY_CONTRARY) ADJUST_SCORE(-10); - else if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_ATK)) + else if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_ATK)) ADJUST_SCORE(-10); break; case EFFECT_COPYCAT: case EFFECT_MIRROR_MOVE: - return AI_CheckBadMove(battlerAtk, battlerDef, predictedMove, score); + if (predictedMove && GetMoveEffect(predictedMove) != GetMoveEffect(move)) + return AI_CheckBadMove(battlerAtk, battlerDef, predictedMove, score); + else + ADJUST_SCORE(-10); + break; case EFFECT_FLOWER_SHIELD: if (!IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GRASS) - && !(isDoubleBattle && IS_BATTLER_OF_TYPE(BATTLE_PARTNER(battlerAtk), TYPE_GRASS))) + && !(hasPartner && IS_BATTLER_OF_TYPE(BATTLE_PARTNER(battlerAtk), TYPE_GRASS))) ADJUST_SCORE(-10); break; case EFFECT_AROMATIC_MIST: - if (!isDoubleBattle || gBattleMons[BATTLE_PARTNER(battlerAtk)].hp == 0 || !BattlerStatCanRise(BATTLE_PARTNER(battlerAtk), aiData->abilities[BATTLE_PARTNER(battlerAtk)], STAT_SPDEF)) + if (!hasPartner || !BattlerStatCanRise(BATTLE_PARTNER(battlerAtk), aiData->abilities[BATTLE_PARTNER(battlerAtk)], STAT_SPDEF)) ADJUST_SCORE(-10); break; case EFFECT_BIDE: if (!HasDamagingMove(battlerDef) || aiData->hpPercents[battlerAtk] < 30 //Close to death - || gBattleMons[battlerDef].status1 & (STATUS1_SLEEP | STATUS1_FREEZE)) //No point in biding if can't take damage + || gBattleMons[battlerDef].status1 & STATUS1_INCAPACITATED) //No point in biding if can't take damage ADJUST_SCORE(-10); break; case EFFECT_HIT_SWITCH_TARGET: @@ -2068,7 +2164,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); // don't scare away pokemon twice else if (aiData->hpPercents[battlerDef] < 10 && GetBattlerSecondaryDamage(battlerDef)) ADJUST_SCORE(-10); // don't blow away mon that will faint soon - else if (gStatuses3[battlerDef] & STATUS3_PERISH_SONG) + else if (gBattleMons[battlerDef].volatiles.perishSong) ADJUST_SCORE(-10); break; case EFFECT_CONVERSION: @@ -2091,22 +2187,39 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_MORNING_SUN: case EFFECT_SYNTHESIS: case EFFECT_MOONLIGHT: - if ((AI_GetWeather() & (B_WEATHER_RAIN | B_WEATHER_SANDSTORM | B_WEATHER_HAIL | B_WEATHER_SNOW | B_WEATHER_FOG))) - ADJUST_SCORE(-3); - else if (AI_BattlerAtMaxHp(battlerAtk)) + if (AI_BattlerAtMaxHp(battlerAtk)) ADJUST_SCORE(-10); else if (aiData->hpPercents[battlerAtk] >= 90) ADJUST_SCORE(-9); //No point in healing, but should at least do it if nothing better + else if ((AI_GetWeather() & (B_WEATHER_LOW_LIGHT))) + ADJUST_SCORE(-3); + break; + case EFFECT_LIFE_DEW: + if (AI_BattlerAtMaxHp(battlerAtk)) + { + if (hasPartner) + { + if (AI_BattlerAtMaxHp(BATTLE_PARTNER(battlerAtk))) + ADJUST_SCORE(-10); + } + else + { + ADJUST_SCORE(-10); + } + } break; case EFFECT_PURIFY: if (!(gBattleMons[battlerDef].status1 & STATUS1_ANY)) ADJUST_SCORE(-10); else if (battlerDef == BATTLE_PARTNER(battlerAtk)) break; //Always heal your ally - else if (AI_BattlerAtMaxHp(battlerAtk)) - ADJUST_SCORE(-10); - else if (aiData->hpPercents[battlerAtk] >= 90) - ADJUST_SCORE(-8); //No point in healing, but should at least do it if nothing better + else if (!ShouldCureStatus(battlerAtk, battlerDef, aiData)) + { + if (AI_BattlerAtMaxHp(battlerAtk)) + ADJUST_SCORE(-10); + else if (aiData->hpPercents[battlerAtk] >= 90) + ADJUST_SCORE(-8); //No point in healing, but should at least do it if nothing better + } break; case EFFECT_RECOIL_IF_MISS: if (aiData->abilities[battlerAtk] != ABILITY_MAGIC_GUARD && gAiLogicData->moveAccuracy[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] < 75 @@ -2114,21 +2227,21 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-6); break; case EFFECT_TRANSFORM: - if (gBattleMons[battlerAtk].status2 & STATUS2_TRANSFORMED - || (gBattleMons[battlerDef].status2 & (STATUS2_TRANSFORMED | STATUS2_SUBSTITUTE))) //Leave out Illusion b/c AI is supposed to be fooled + if (gBattleMons[battlerAtk].volatiles.transformed + || gBattleMons[battlerDef].volatiles.transformed + || gBattleMons[battlerDef].volatiles.substitute) //Leave out Illusion b/c AI is supposed to be fooled ADJUST_SCORE(-10); break; case EFFECT_SPITE: case EFFECT_MIMIC: - if (AI_IsFaster(battlerAtk, battlerDef, move)) // Attacker should go first + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Attacker should go first { - if (gLastMoves[battlerDef] == MOVE_NONE - || gLastMoves[battlerDef] == 0xFFFF) + if (aiData->lastUsedMove[battlerDef] == MOVE_NONE) ADJUST_SCORE(-10); } else if (predictedMove == MOVE_NONE) { - // TODO predicted move separate from gLastMoves + // TODO predicted move separate from aiData->lastUsedMove ADJUST_SCORE(-10); } break; @@ -2139,32 +2252,32 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) //TODO break; case EFFECT_LOCK_ON: - if (gStatuses3[battlerDef] & STATUS3_ALWAYS_HITS + if (gBattleMons[battlerDef].volatiles.lockOn || aiData->abilities[battlerAtk] == ABILITY_NO_GUARD || aiData->abilities[battlerDef] == ABILITY_NO_GUARD || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_LASER_FOCUS: - if (gStatuses3[battlerAtk] & STATUS3_LASER_FOCUS) + if (gBattleMons[battlerDef].volatiles.laserFocus) ADJUST_SCORE(-10); else if (aiData->abilities[battlerDef] == ABILITY_SHELL_ARMOR || aiData->abilities[battlerDef] == ABILITY_BATTLE_ARMOR) ADJUST_SCORE(-8); break; case EFFECT_SKETCH: - if (gLastMoves[battlerDef] == MOVE_NONE) + if (aiData->lastUsedMove[battlerDef] == MOVE_NONE) ADJUST_SCORE(-10); break; case EFFECT_DESTINY_BOND: if (DoesDestinyBondFail(battlerAtk)) ADJUST_SCORE(-10); - if (gBattleMons[battlerDef].status2 & STATUS2_DESTINY_BOND) + if (gBattleMons[battlerAtk].volatiles.destinyBond) ADJUST_SCORE(-10); else if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) ADJUST_SCORE(-10); break; case EFFECT_HEAL_BELL: - if (!AnyPartyMemberStatused(battlerAtk, IsSoundMove(move)) || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + if (!AnyPartyMemberStatused(battlerAtk, IsSoundMove(move)) || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_ENDURE: @@ -2174,24 +2287,39 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_PROTECT: { bool32 decreased = FALSE; - switch (move) + enum ProtectMethod protectMethod = GetMoveProtectMethod(move); + switch (protectMethod) { - case MOVE_QUICK_GUARD: - case MOVE_WIDE_GUARD: - case MOVE_CRAFTY_SHIELD: - if (!isDoubleBattle) + case PROTECT_QUICK_GUARD: + if (GetMovePriority(predictedMove) <= 0) + { + ADJUST_SCORE(-10); + decreased = TRUE; + } + break; + case PROTECT_WIDE_GUARD: + if (!(GetBattlerMoveTargetType(battlerAtk, predictedMove) & (MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_BOTH))) + { + ADJUST_SCORE(-10); + decreased = TRUE; + } + break; + case PROTECT_CRAFTY_SHIELD: + if (!hasPartner) { ADJUST_SCORE(-10); decreased = TRUE; } break; - case MOVE_MAT_BLOCK: + case PROTECT_MAT_BLOCK: if (!gDisableStructs[battlerAtk].isFirstTurn) { ADJUST_SCORE(-10); decreased = TRUE; } break; + default: + break; } // move check if (decreased) @@ -2202,9 +2330,9 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; } - if (move != MOVE_QUICK_GUARD - && move != MOVE_WIDE_GUARD - && move != MOVE_CRAFTY_SHIELD) //These moves have infinite usage + if (protectMethod != PROTECT_QUICK_GUARD + && protectMethod != PROTECT_WIDE_GUARD + && protectMethod != PROTECT_CRAFTY_SHIELD) //These moves have infinite usage { if (GetBattlerSecondaryDamage(battlerAtk) >= gBattleMons[battlerAtk].hp && !(IsMoxieTypeAbility(aiData->abilities[battlerDef]))) @@ -2213,7 +2341,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } else if (gDisableStructs[battlerAtk].protectUses == 1 && Random() % 100 < 50) { - if (!isDoubleBattle) + if (isBattle1v1) ADJUST_SCORE(-6); else ADJUST_SCORE(-10); //Don't try double protecting in doubles @@ -2236,7 +2364,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_MIRACLE_EYE: - if (gStatuses3[battlerDef] & STATUS3_MIRACLE_EYED) + if (gBattleMons[battlerDef].volatiles.miracleEye) ADJUST_SCORE(-10); if (gBattleMons[battlerDef].statStages[STAT_EVASION] <= 4 @@ -2244,28 +2372,44 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-9); break; + case EFFECT_COURT_CHANGE: + if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_BAD_COURT) + ADJUST_SCORE(BAD_EFFECT); + if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_GOOD_COURT) + ADJUST_SCORE(BAD_EFFECT); + if (AreAnyHazardsOnSide(GetBattlerSide(battlerDef)) && CountUsablePartyMons(battlerAtk) != 0) + ADJUST_SCORE(WORST_EFFECT); + if (hasPartner) + { + if (IsHazardMove(aiData->partnerMove) // partner is going to set up hazards + && AI_IsFaster(BATTLE_PARTNER(battlerAtk), battlerAtk, aiData->partnerMove, predictedMove, CONSIDER_PRIORITY)) // partner is going to set up before the Court Change + { + ADJUST_SCORE(-10); + break; // Don't use Defog if partner is going to set up hazards + } + } + break; case EFFECT_DEFOG: - if (gSideStatuses[GetBattlerSide(battlerDef)] - & (SIDE_STATUS_SCREEN_ANY | SIDE_STATUS_SAFEGUARD | SIDE_STATUS_MIST) - || gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY) + if (gSideStatuses[GetBattlerSide(battlerDef)] & (SIDE_STATUS_SCREEN_ANY | SIDE_STATUS_SAFEGUARD | SIDE_STATUS_MIST) + || AreAnyHazardsOnSide(GetBattlerSide(battlerAtk))) { - if (PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + if (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) { ADJUST_SCORE(-10); //Only need one hazards removal break; } } - if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_HAZARDS_ANY) + if (AreAnyHazardsOnSide(GetBattlerSide(battlerDef))) { ADJUST_SCORE(-10); //Don't blow away opposing hazards break; } - if (isDoubleBattle) + if (hasPartner) { if (IsHazardMove(aiData->partnerMove) // partner is going to set up hazards - && AI_IsFaster(BATTLE_PARTNER(battlerAtk), battlerAtk, aiData->partnerMove)) // partner is going to set up before the potential Defog + && AI_IsFaster(BATTLE_PARTNER(battlerAtk), battlerAtk, aiData->partnerMove, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // partner is going to set up before the potential Defog { ADJUST_SCORE(-10); break; // Don't use Defog if partner is going to set up hazards @@ -2274,7 +2418,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // evasion check if (gBattleMons[battlerDef].statStages[STAT_EVASION] == MIN_STAT_STAGE - || ((aiData->abilities[battlerDef] == ABILITY_CONTRARY) && !IS_TARGETING_PARTNER(battlerAtk, battlerDef))) // don't want to raise target stats unless its your partner + || ((aiData->abilities[battlerDef] == ABILITY_CONTRARY) && !IsTargetingPartner(battlerAtk, battlerDef))) // don't want to raise target stats unless its your partner ADJUST_SCORE(-10); break; case EFFECT_PSYCH_UP: // haze stats check @@ -2293,12 +2437,12 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_SEMI_INVULNERABLE: if (predictedMove != MOVE_NONE - && AI_IsSlower(battlerAtk, battlerDef, move) + && AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) && GetMoveEffect(predictedMove) == EFFECT_SEMI_INVULNERABLE) ADJUST_SCORE(-10); // Don't Fly/dig/etc if opponent is going to fly/dig/etc after you if (BattlerWillFaintFromWeather(battlerAtk, aiData->abilities[battlerAtk]) - && GetMoveTwoTurnAttackStatus(move) == STATUS3_ON_AIR) + && GetMoveTwoTurnAttackStatus(move) == STATE_ON_AIR) ADJUST_SCORE(-10); // Attacker will faint while in the air break; case EFFECT_HEALING_WISH: //healing wish, lunar dance @@ -2312,39 +2456,26 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_NATURE_POWER: - return AI_CheckBadMove(battlerAtk, battlerDef, GetNaturePowerMove(battlerAtk), score); + predictedMove = GetNaturePowerMove(battlerAtk); + if (GetMoveEffect(predictedMove) != GetMoveEffect(move)) + return AI_CheckBadMove(battlerAtk, battlerDef, GetNaturePowerMove(battlerAtk), score); + break; case EFFECT_TAUNT: if (gDisableStructs[battlerDef].tauntTimer > 0 || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_BESTOW: - if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_NONE - || !CanBattlerGetOrLoseItem(battlerAtk, gBattleMons[battlerAtk].item)) // AI knows its own item - ADJUST_SCORE(-10); - break; - case EFFECT_ROLE_PLAY: - if (aiData->abilities[battlerAtk] == aiData->abilities[battlerDef] - || aiData->abilities[battlerDef] == ABILITY_NONE - || gAbilitiesInfo[aiData->abilities[battlerAtk]].cantBeSuppressed - || gAbilitiesInfo[aiData->abilities[battlerDef]].cantBeCopied) - ADJUST_SCORE(-10); - else if (IsAbilityOfRating(aiData->abilities[battlerAtk], 5)) - ADJUST_SCORE(-4); - break; - case EFFECT_DOODLE: // Same as Role Play, but also check if the partner's ability should be replaced - if (aiData->abilities[battlerAtk] == aiData->abilities[battlerDef] - || aiData->abilities[BATTLE_PARTNER(battlerAtk)] == aiData->abilities[battlerDef] - || aiData->abilities[battlerDef] == ABILITY_NONE - || gAbilitiesInfo[aiData->abilities[battlerAtk]].cantBeSuppressed - || gAbilitiesInfo[aiData->abilities[BATTLE_PARTNER(battlerAtk)]].cantBeSuppressed - || gAbilitiesInfo[aiData->abilities[battlerDef]].cantBeCopied) + if (gBattleMons[battlerAtk].item == ITEM_NONE + || aiData->items[battlerDef] != ITEM_NONE + || !CanBattlerGetOrLoseItem(battlerAtk, gBattleMons[battlerAtk].item) // AI knows its own item + || !CanBattlerGetOrLoseItem(battlerDef, gBattleMons[battlerAtk].item) + || aiData->abilities[battlerAtk] == ABILITY_STICKY_HOLD + || DoesSubstituteBlockMove(battlerAtk, battlerDef, move)) ADJUST_SCORE(-10); - else if (IsAbilityOfRating(aiData->abilities[battlerAtk], 5) || IsAbilityOfRating(aiData->abilities[BATTLE_PARTNER(battlerAtk)], 5)) - ADJUST_SCORE(-4); break; case EFFECT_WISH: - if (gWishFutureKnock.wishCounter[battlerAtk] > gBattleTurnCounter) + if (gWishFutureKnock.wishCounter[battlerAtk] > 0) ADJUST_SCORE(-10); break; case EFFECT_ASSIST: @@ -2356,75 +2487,50 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_YAWN: - if (gStatuses3[battlerDef] & STATUS3_YAWN) + if (gBattleMons[battlerDef].volatiles.yawn) ADJUST_SCORE(-10); else if (!AI_CanPutToSleep(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, aiData->partnerMove)) ADJUST_SCORE(-10); if (PartnerMoveActivatesSleepClause(aiData->partnerMove)) ADJUST_SCORE(-20); break; - case EFFECT_SKILL_SWAP: - if (aiData->abilities[battlerAtk] == ABILITY_NONE || aiData->abilities[battlerDef] == ABILITY_NONE - || gAbilitiesInfo[aiData->abilities[battlerAtk]].cantBeSwapped - || gAbilitiesInfo[aiData->abilities[battlerDef]].cantBeSwapped - || aiData->holdEffects[battlerDef] == HOLD_EFFECT_ABILITY_SHIELD) - ADJUST_SCORE(-10); - else if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) - ADJUST_SCORE(-10); - break; - case EFFECT_WORRY_SEED: - if (aiData->abilities[battlerDef] == ABILITY_INSOMNIA - || gAbilitiesInfo[aiData->abilities[battlerDef]].cantBeOverwritten - || aiData->holdEffects[battlerDef] == HOLD_EFFECT_ABILITY_SHIELD) - ADJUST_SCORE(-10); - break; - case EFFECT_GASTRO_ACID: - if (gStatuses3[battlerDef] & STATUS3_GASTRO_ACID - || gAbilitiesInfo[aiData->abilities[battlerDef]].cantBeSuppressed) - ADJUST_SCORE(-10); - break; + case EFFECT_DOODLE: case EFFECT_ENTRAINMENT: - if (aiData->abilities[battlerAtk] == ABILITY_NONE - || gAbilitiesInfo[aiData->abilities[battlerAtk]].cantBeCopied - || gAbilitiesInfo[aiData->abilities[battlerDef]].cantBeOverwritten - || aiData->holdEffects[battlerAtk] == HOLD_EFFECT_ABILITY_SHIELD) - ADJUST_SCORE(-10); - else if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) - ADJUST_SCORE(-10); - break; - case EFFECT_SIMPLE_BEAM: - if (aiData->abilities[battlerDef] == ABILITY_SIMPLE - || gAbilitiesInfo[aiData->abilities[battlerDef]].cantBeOverwritten - || aiData->holdEffects[battlerDef] == HOLD_EFFECT_ABILITY_SHIELD) - ADJUST_SCORE(-10); + case EFFECT_GASTRO_ACID: + case EFFECT_ROLE_PLAY: + case EFFECT_SKILL_SWAP: + case EFFECT_OVERWRITE_ABILITY: + if (!CanEffectChangeAbility(battlerAtk, battlerDef, move, aiData) + || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) + ADJUST_AND_RETURN_SCORE(NO_DAMAGE_OR_FAILS); break; case EFFECT_SNATCH: if (!HasMoveWithFlag(battlerDef, MoveCanBeSnatched) - || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_POWER_TRICK: - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) ADJUST_SCORE(-10); else if (gBattleMons[battlerAtk].defense >= gBattleMons[battlerAtk].attack && !HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL)) ADJUST_SCORE(-10); break; case EFFECT_POWER_SWAP: // Don't use if attacker's stat stages are higher than opponents - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) ADJUST_SCORE(-10); else if (gBattleMons[battlerAtk].statStages[STAT_ATK] >= gBattleMons[battlerDef].statStages[STAT_ATK] && gBattleMons[battlerAtk].statStages[STAT_SPATK] >= gBattleMons[battlerDef].statStages[STAT_SPATK]) ADJUST_SCORE(-10); break; case EFFECT_GUARD_SWAP: // Don't use if attacker's stat stages are higher than opponents - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) ADJUST_SCORE(-10); else if (gBattleMons[battlerAtk].statStages[STAT_DEF] >= gBattleMons[battlerDef].statStages[STAT_DEF] && gBattleMons[battlerAtk].statStages[STAT_SPDEF] >= gBattleMons[battlerDef].statStages[STAT_SPDEF]) ADJUST_SCORE(-10); break; case EFFECT_SPEED_SWAP: - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) { ADJUST_SCORE(-10); } @@ -2437,7 +2543,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_HEART_SWAP: - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) { ADJUST_SCORE(-10); } @@ -2454,11 +2560,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_POWER_SPLIT: - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) - { - ADJUST_SCORE(-10); - } - else + if (!IsTargetingPartner(battlerAtk, battlerDef)) { u32 atkAttack = gBattleMons[battlerAtk].attack; u32 defAttack = gBattleMons[battlerDef].attack; @@ -2471,11 +2573,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_GUARD_SPLIT: - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) - { - ADJUST_SCORE(-10); - } - else + if (!IsTargetingPartner(battlerAtk, battlerDef)) { u32 atkDefense = gBattleMons[battlerAtk].defense; u32 defDefense = gBattleMons[battlerDef].defense; @@ -2490,9 +2588,9 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_ME_FIRST: if (predictedMove != MOVE_NONE) { - if (AI_IsSlower(battlerAtk, battlerDef, move)) + if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) ADJUST_SCORE(-10); // Target is predicted to go first, Me First will fail - else + else if (GetMoveEffect(predictedMove) != GetMoveEffect(move)) return AI_CheckBadMove(battlerAtk, battlerDef, predictedMove, score); } else @@ -2501,33 +2599,42 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_NATURAL_GIFT: - if (!IsBattlerItemEnabled(battlerAtk) || GetPocketByItemId(gBattleMons[battlerAtk].item) != POCKET_BERRIES) + if (!IsBattlerItemEnabled(battlerAtk) || GetItemPocket(gBattleMons[battlerAtk].item) != POCKET_BERRIES) ADJUST_SCORE(-10); break; case EFFECT_GRASSY_TERRAIN: - if (PartnerMoveEffectIsTerrain(BATTLE_PARTNER(battlerAtk), aiData->partnerMove) || gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN) + if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-10); break; case EFFECT_ELECTRIC_TERRAIN: - if (PartnerMoveEffectIsTerrain(BATTLE_PARTNER(battlerAtk), aiData->partnerMove) || gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) + if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-10); break; case EFFECT_PSYCHIC_TERRAIN: - if (PartnerMoveEffectIsTerrain(BATTLE_PARTNER(battlerAtk), aiData->partnerMove) || gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN) + if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-10); break; case EFFECT_MISTY_TERRAIN: - if (PartnerMoveEffectIsTerrain(BATTLE_PARTNER(battlerAtk), aiData->partnerMove) || gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN) + if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) + ADJUST_SCORE(-10); + break; + case EFFECT_STEEL_ROLLER: + if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-10); break; case EFFECT_PLEDGE: - if (isDoubleBattle && gBattleMons[BATTLE_PARTNER(battlerAtk)].hp > 0) + if (hasPartner && gBattleMons[BATTLE_PARTNER(battlerAtk)].hp > 0) { if (aiData->partnerMove != MOVE_NONE && GetMoveEffect(aiData->partnerMove) == EFFECT_PLEDGE && move != aiData->partnerMove) // Different pledge moves { - if (gBattleMons[BATTLE_PARTNER(battlerAtk)].status1 & (STATUS1_SLEEP | STATUS1_FREEZE)) + if (gBattleMons[BATTLE_PARTNER(battlerAtk)].status1 & STATUS1_INCAPACITATED) // && gBattleMons[BATTLE_PARTNER(battlerAtk)].status1 != 1) // Will wake up this turn - how would AI know ADJUST_SCORE(-10); // Don't use combo move if your partner will cause failure } @@ -2536,20 +2643,21 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_TRICK_ROOM: if (PartnerMoveEffectIs(BATTLE_PARTNER(battlerAtk), aiData->partnerMove, EFFECT_TRICK_ROOM)) { - ADJUST_SCORE(-10); + // This only happens if the ally already rolled on double trick room on final turn. + // Both Pokemon use Trick Room on the final turn of Trick Room to anticipate both opponents Protecting to stall out. + if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == 1) + ADJUST_SCORE(PERFECT_EFFECT); + else + ADJUST_SCORE(-10); } else if (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_POWERFUL_STATUS)) { - if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM) // Trick Room Up - { - if (GetBattlerSideSpeedAverage(battlerAtk) < GetBattlerSideSpeedAverage(battlerDef)) // Attacker side slower than target side - ADJUST_SCORE(-10); // Keep the Trick Room up - } - else - { - if (GetBattlerSideSpeedAverage(battlerAtk) >= GetBattlerSideSpeedAverage(battlerDef)) // Attacker side faster than target side - ADJUST_SCORE(-10); // Keep the Trick Room down - } + // Don't set a trick room you don't benefit from. + if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && !ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM)) + ADJUST_SCORE(-10); + // Don't unset a trick room that doesn't harm you unless it's about to expire. + else if ((gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && gFieldTimers.trickRoomTimer > 1 && !ShouldClearFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM)) + ADJUST_SCORE(-10); } break; case EFFECT_MAGIC_ROOM: @@ -2598,7 +2706,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_EMBARGO: if (!IsBattlerItemEnabled(battlerAtk) - || gStatuses3[battlerDef] & STATUS3_EMBARGO + || gBattleMons[battlerDef].volatiles.embargo || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; @@ -2608,25 +2716,28 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_TELEKINESIS: - if (gStatuses3[battlerDef] & (STATUS3_TELEKINESIS | STATUS3_ROOTED | STATUS3_SMACKED_DOWN) - || gFieldStatuses & STATUS_FIELD_GRAVITY - || aiData->holdEffects[battlerDef] == HOLD_EFFECT_IRON_BALL - || IsTelekinesisBannedSpecies(gBattleMons[battlerDef].species) - || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) + if (gBattleMons[battlerDef].volatiles.telekinesis + || gBattleMons[battlerDef].volatiles.root + || gBattleMons[battlerDef].volatiles.smackDown + || gFieldStatuses & STATUS_FIELD_GRAVITY + || aiData->holdEffects[battlerDef] == HOLD_EFFECT_IRON_BALL + || IsTelekinesisBannedSpecies(gBattleMons[battlerDef].species) + || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_HEAL_BLOCK: - if (gStatuses3[battlerDef] & STATUS3_HEAL_BLOCK + if (gBattleMons[battlerDef].volatiles.healBlock || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_SOAK: { - u32 types[3]; + enum Type types[3]; + u32 typeArg = GetMoveArgType(move); + GetBattlerTypes(battlerDef, FALSE, types); - // TODO: Use the type of the move like 'VARIOUS_TRY_SOAK'? if (PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove) - || (types[0] == TYPE_WATER && types[1] == TYPE_WATER && types[2] == TYPE_MYSTERY)) + || (types[0] == typeArg && types[1] == typeArg && types[2] == TYPE_MYSTERY)) ADJUST_SCORE(-10); // target is already water-only break; } @@ -2635,16 +2746,16 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_HEAL_PULSE: // and floral healing - if (!IS_TARGETING_PARTNER(battlerAtk, battlerDef)) // Don't heal enemies + if (!IsTargetingPartner(battlerAtk, battlerDef)) // Don't heal enemies { ADJUST_SCORE(-10); break; } // fallthrough case EFFECT_HIT_ENEMY_HEAL_ALLY: // pollen puff - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) { - if (gStatuses3[battlerDef] & STATUS3_HEAL_BLOCK) + if (gBattleMons[battlerDef].volatiles.healBlock) return 0; // cannot even select if (AI_BattlerAtMaxHp(battlerDef)) ADJUST_SCORE(-10); @@ -2653,13 +2764,13 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_ELECTRIFY: - if (AI_IsSlower(battlerAtk, battlerDef, move) + if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) //|| GetMoveTypeSpecial(battlerDef, predictedMove) == TYPE_ELECTRIC // Move will already be electric type || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_TOPSY_TURVY: - if (!IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (!IsTargetingPartner(battlerAtk, battlerDef)) { u32 targetPositiveStages = CountPositiveStatStages(battlerDef); u32 targetNegativeStages = CountNegativeStatStages(battlerDef); @@ -2680,31 +2791,33 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_HOLD_HANDS: case EFFECT_CELEBRATE: case EFFECT_HAPPY_HOUR: + if (IsConsideringZMove(battlerAtk, battlerDef, move)) + break; ADJUST_SCORE(-10); break; case EFFECT_INSTRUCT: { - u16 instructedMove; - if (AI_IsSlower(battlerAtk, battlerDef, move)) + u32 instructedMove; + if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) instructedMove = predictedMove; else - instructedMove = gLastMoves[battlerDef]; + instructedMove = aiData->lastUsedMove[battlerDef]; if (instructedMove == MOVE_NONE || IsMoveInstructBanned(instructedMove) || MoveHasAdditionalEffectSelf(instructedMove, MOVE_EFFECT_RECHARGE) || IsZMove(instructedMove) - || (gLockedMoves[battlerDef] != 0 && gLockedMoves[battlerDef] != 0xFFFF) - || gBattleMons[battlerDef].status2 & STATUS2_MULTIPLETURNS + || (gLockedMoves[battlerDef] != MOVE_NONE && gLockedMoves[battlerDef] != MOVE_UNAVAILABLE) + || gBattleMons[battlerDef].volatiles.multipleTurns || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) { ADJUST_SCORE(-10); } else if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) ADJUST_SCORE(-10); - else if (isDoubleBattle) + else if (hasPartner) { - if (!IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (!IsTargetingPartner(battlerAtk, battlerDef)) ADJUST_SCORE(-10); } else @@ -2715,37 +2828,34 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) | MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_OPPONENTS_FIELD) - && instructedMove != MOVE_MIND_BLOWN && instructedMove != MOVE_STEEL_BEAM) + && GetMoveEffect(instructedMove) != EFFECT_MAX_HP_50_RECOIL) ADJUST_SCORE(-10); //Don't force the enemy to attack you again unless it can kill itself with Mind Blown - else if (instructedMove != MOVE_MIND_BLOWN) - ADJUST_SCORE(-5); //Do something better } } break; case EFFECT_QUASH: - if (!isDoubleBattle - || AI_IsSlower(battlerAtk, battlerDef, move) + if (!hasPartner + || AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_AFTER_YOU: - if (!IS_TARGETING_PARTNER(battlerAtk, battlerDef) - || !isDoubleBattle - || AI_IsSlower(battlerAtk, battlerDef, move) + if (!IsTargetingPartner(battlerAtk, battlerDef) + || !hasPartner + || AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_SUCKER_PUNCH: - if (predictedMove != MOVE_NONE) - { - if (IsBattleMoveStatus(predictedMove) || AI_IsSlower(battlerAtk, battlerDef, move)) // Opponent going first - ADJUST_SCORE(-10); - } + if ((HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_STATUS) && RandomPercentage(RNG_AI_SUCKER_PUNCH, SUCKER_PUNCH_CHANCE)) // Player has a status move + || (IsBattleMoveStatus(predictedMove) && RandomPercentage(RNG_AI_SUCKER_PUNCH, SUCKER_PUNCH_PREDICTION_CHANCE) && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_PREDICT_MOVE)) // AI actively predicting incoming status move + || AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Opponent going first + ADJUST_SCORE(-10); break; case EFFECT_TAILWIND: if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_TAILWIND || PartnerMoveEffectIs(BATTLE_PARTNER(battlerAtk), aiData->partnerMove, EFFECT_TAILWIND) - || gFieldStatuses & STATUS_FIELD_TRICK_ROOM) + || (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == 1)) ADJUST_SCORE(-10); break; case EFFECT_LUCKY_CHANT: @@ -2755,10 +2865,12 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_MAGNET_RISE: if (gFieldStatuses & STATUS_FIELD_GRAVITY - || gDisableStructs[battlerAtk].magnetRiseTimer != 0 + || gDisableStructs[battlerAtk].magnetRiseTimer > 0 || aiData->holdEffects[battlerAtk] == HOLD_EFFECT_IRON_BALL - || gStatuses3[battlerAtk] & (STATUS3_ROOTED | STATUS3_MAGNET_RISE | STATUS3_SMACKED_DOWN) - || !IsBattlerGrounded(battlerAtk)) + || gBattleMons[battlerAtk].volatiles.smackDown + || gBattleMons[battlerAtk].volatiles.root + || gBattleMons[battlerAtk].volatiles.magnetRise + || !AI_IsBattlerGrounded(battlerAtk)) ADJUST_SCORE(-10); break; case EFFECT_CAMOUFLAGE: @@ -2774,7 +2886,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_FLAIL: - if (AI_IsSlower(battlerAtk, battlerDef, move) // Opponent should go first + if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) // Opponent should go first || aiData->hpPercents[battlerAtk] > 50) ADJUST_SCORE(-4); break; @@ -2791,34 +2903,39 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) || GetBattlerWeight(battlerDef) >= 2000) //200.0 kg ADJUST_SCORE(-10); break; - /*case EFFECT_NO_RETREAT: - if (TrappedByNoRetreat(battlerAtk)) + case EFFECT_NO_RETREAT: + if (gBattleMons[battlerAtk].volatiles.noRetreat) ADJUST_SCORE(-10); break; case EFFECT_EXTREME_EVOBOOST: - if (MainStatsMaxed(battlerAtk)) + if (AreBattlersStatsMaxed(battlerAtk)) ADJUST_SCORE(-10); break; case EFFECT_CLANGOROUS_SOUL: if (gBattleMons[battlerAtk].hp <= gBattleMons[battlerAtk].maxHP / 3) ADJUST_SCORE(-10); - break;*/ + break; case EFFECT_REVIVAL_BLESSING: if (GetFirstFaintedPartyIndex(battlerAtk) == PARTY_SIZE) ADJUST_SCORE(-10); else if (CanAIFaintTarget(battlerAtk, battlerDef, 0)) ADJUST_SCORE(-10); else if (CanTargetFaintAi(battlerDef, battlerAtk) - && AI_IsSlower(battlerAtk, battlerDef, move)) + && AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) ADJUST_SCORE(-10); break; case EFFECT_JUNGLE_HEALING: - if (AI_BattlerAtMaxHp(battlerAtk) - && AI_BattlerAtMaxHp(BATTLE_PARTNER(battlerAtk)) - && !(gBattleMons[battlerAtk].status1 & STATUS1_ANY) - && !(gBattleMons[BATTLE_PARTNER(battlerAtk)].status1 & STATUS1_ANY)) + { + bool32 canCureSelf = (gBattleMons[battlerAtk].status1 & STATUS1_ANY) && ShouldCureStatus(battlerAtk, battlerAtk, aiData); + bool32 canCurePartner = (gBattleMons[BATTLE_PARTNER(battlerAtk)].status1 & STATUS1_ANY) && ShouldCureStatus(battlerAtk, BATTLE_PARTNER(battlerAtk), aiData); + + if (AI_BattlerAtMaxHp(battlerAtk) + && AI_BattlerAtMaxHp(BATTLE_PARTNER(battlerAtk)) + && !canCureSelf + && !canCurePartner) ADJUST_SCORE(-10); break; + } case EFFECT_TAKE_HEART: if ((!(gBattleMons[battlerAtk].status1 & STATUS1_ANY) || PartnerMoveEffectIs(BATTLE_PARTNER(battlerAtk), aiData->partnerMove, EFFECT_JUNGLE_HEALING) @@ -2840,12 +2957,24 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) u32 defPrio = GetBattleMovePriority(battlerDef, aiData->abilities[battlerDef], predictedMove); if (predictedMove == MOVE_NONE || IsBattleMoveStatus(predictedMove) - || AI_IsSlower(battlerAtk, battlerDef, move) + || AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) || defPrio < 1 || defPrio > 3) // Opponent going first or not using priority move ADJUST_SCORE(-10); } break; + case EFFECT_TEATIME: + if (DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) + ADJUST_SCORE(-10); + break; + case EFFECT_DARK_VOID: + if (B_DARK_VOID_FAIL >= GEN_7 && gBattleMons[battlerAtk].species != SPECIES_DARKRAI) + ADJUST_SCORE(-10); + break; + case EFFECT_HYPERSPACE_FURY: + if (gBattleMons[battlerAtk].species != SPECIES_HOOPA_UNBOUND) + ADJUST_SCORE(-10); + break; case EFFECT_PLACEHOLDER: return 0; // cannot even select } // move effect checks @@ -2881,18 +3010,18 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // Choice items - if (HOLD_EFFECT_CHOICE(aiData->holdEffects[battlerAtk]) && IsBattlerItemEnabled(battlerAtk)) + if (IsHoldEffectChoice(aiData->holdEffects[battlerAtk]) && IsBattlerItemEnabled(battlerAtk)) { // Don't use user-target moves ie. Swords Dance, with exceptions if ((moveTarget & MOVE_TARGET_USER) && moveEffect != EFFECT_DESTINY_BOND && moveEffect != EFFECT_WISH && moveEffect != EFFECT_HEALING_WISH - && !(moveEffect == EFFECT_AURORA_VEIL && (AI_GetWeather() & (B_WEATHER_SNOW | B_WEATHER_HAIL)))) + && !(moveEffect == EFFECT_AURORA_VEIL && (AI_GetWeather() & B_WEATHER_ICY_ANY))) ADJUST_SCORE(-30); // Don't use a status move if the mon is the last one in the party, has no good switchin, or is trapped else if (GetBattleMoveCategory(move) == DAMAGE_CATEGORY_STATUS && (CountUsablePartyMons(battlerAtk) < 1 || gAiLogicData->mostSuitableMonId[battlerAtk] == PARTY_SIZE - || (!AI_CanBattlerEscape(battlerAtk) && IsBattlerTrapped(battlerDef, battlerAtk)))) + || IsBattlerTrapped(battlerDef, battlerAtk))) ADJUST_SCORE(-30); } @@ -2902,30 +3031,47 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) return score; } +static s32 AI_GetWhichBattlerFasterOrTies(u32 battlerAtk, u32 battlerDef, bool32 ignoreChosenMoves) +{ + struct BattleContext ctx = {0}; + ctx.battlerAtk = battlerAtk; + ctx.battlerDef = battlerDef; + ctx.abilities[battlerAtk] = gAiLogicData->abilities[battlerAtk]; + ctx.abilities[battlerDef] = gAiLogicData->abilities[battlerDef]; + ctx.holdEffects[battlerAtk] = gAiLogicData->holdEffects[battlerAtk]; + ctx.holdEffects[battlerDef] = gAiLogicData->holdEffects[battlerDef]; + + return GetWhichBattlerFasterOrTies(&ctx, ignoreChosenMoves); +} + static s32 AI_TryToFaint(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { u32 movesetIndex = gAiThinkingStruct->movesetIndex; + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) return score; if (IsBattleMoveStatus(move)) return score; // status moves aren't accounted here - if (CanIndexMoveFaintTarget(battlerAtk, battlerDef, movesetIndex, AI_ATTACKING) && GetMoveEffect(move) != EFFECT_EXPLOSION) + enum BattleMoveEffects effect = GetMoveEffect(move); + if (CanIndexMoveFaintTarget(battlerAtk, battlerDef, movesetIndex, AI_ATTACKING) + && effect != EFFECT_EXPLOSION && effect != EFFECT_MISTY_EXPLOSION) { - if (CanIndexMoveGuaranteeFaintTarget(battlerAtk, battlerDef, movesetIndex)) - ADJUST_SCORE(1); // Bonus point if the KO is guaranteed - if (AI_IsFaster(battlerAtk, battlerDef, move)) + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) ADJUST_SCORE(FAST_KILL); else ADJUST_SCORE(SLOW_KILL); } else if (CanTargetFaintAi(battlerDef, battlerAtk) - && GetWhichBattlerFasterOrTies(battlerAtk, battlerDef, TRUE) != AI_IS_FASTER + && AI_GetWhichBattlerFasterOrTies(battlerAtk, battlerDef, TRUE) != AI_IS_FASTER && GetBattleMovePriority(battlerAtk, gAiLogicData->abilities[battlerAtk], move) > 0) { - ADJUST_SCORE(LAST_CHANCE); + if (RandomPercentage(RNG_AI_PRIORITIZE_LAST_CHANCE, PRIORITIZE_LAST_CHANCE_CHANCE)) + ADJUST_SCORE(SLOW_KILL + 2); // Don't outscore Fast Kill (which gets a bonus point in AI_CompareDamagingMoves), but do outscore Slow Kill getting the same + else + ADJUST_SCORE(LAST_CHANCE); } return score; @@ -2935,7 +3081,7 @@ static s32 AI_TryToFaint(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { // move data - u32 moveType = GetMoveType(move); + enum Type moveType = GetMoveType(move); enum BattleMoveEffects effect = GetMoveEffect(move); u32 moveTarget = GetBattlerMoveTargetType(battlerAtk, move); // ally data @@ -2945,22 +3091,28 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) u32 atkPartnerHoldEffect = aiData->holdEffects[BATTLE_PARTNER(battlerAtk)]; enum BattleMoveEffects partnerEffect = GetMoveEffect(aiData->partnerMove); bool32 partnerProtecting = IsAllyProtectingFromMove(battlerAtk, move, aiData->partnerMove) && !MoveIgnoresProtect(move); - bool32 attackerHasBadAbility = (gAbilitiesInfo[aiData->abilities[battlerAtk]].aiRating < 0); bool32 partnerHasBadAbility = (gAbilitiesInfo[atkPartnerAbility].aiRating < 0); u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); SetTypeBeforeUsingMove(move, battlerAtk); moveType = GetBattleMoveType(move); + bool32 hasTwoOpponents = HasTwoOpponents(battlerAtk); + bool32 hasPartner = HasPartner(battlerAtk); u32 friendlyFireThreshold = GetFriendlyFireKOThreshold(battlerAtk); u32 noOfHitsToKOPartner = GetNoOfHitsToKOBattler(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING); - bool32 wouldPartnerFaint = CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING) - && !partnerProtecting && IsBattlerAlive(battlerAtkPartner); + bool32 wouldPartnerFaint = hasPartner && CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING) + && !partnerProtecting; bool32 isFriendlyFireOK = !wouldPartnerFaint && (noOfHitsToKOPartner == 0 || noOfHitsToKOPartner > friendlyFireThreshold); // check what effect partner is using - if (aiData->partnerMove != 0) + if (aiData->partnerMove != 0 && hasPartner) { + // This catches weather, terrain, screens, etc + if (AreMovesEquivalent(battlerAtk, battlerAtkPartner, move, aiData->partnerMove)) + ADJUST_SCORE(-10); + switch (partnerEffect) { case EFFECT_HELPING_HAND: @@ -2968,21 +3120,19 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-7); break; case EFFECT_PERISH_SONG: - if (!(gBattleMons[battlerDef].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED))) + if (!(gBattleMons[battlerDef].volatiles.escapePrevention || gBattleMons[battlerDef].volatiles.wrapped)) { if (IsTrappingMove(aiData->partnerMove) || predictedMove == MOVE_INGRAIN) ADJUST_SCORE(WEAK_EFFECT); } break; - // Don't change weather if ally already decided to do so. - case EFFECT_SUNNY_DAY: - case EFFECT_HAIL: - case EFFECT_SNOWSCAPE: - case EFFECT_RAIN_DANCE: - case EFFECT_SANDSTORM: - case EFFECT_CHILLY_RECEPTION: - if (IsMoveEffectWeather(move)) - ADJUST_SCORE(-10); + case EFFECT_AFTER_YOU: + if (effect == EFFECT_TRICK_ROOM && !(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM)) + ADJUST_SCORE(DECENT_EFFECT); + break; + case EFFECT_TRICK_ROOM: + if (effect == EFFECT_AFTER_YOU && !(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM)) + ADJUST_SCORE(DECENT_EFFECT); break; default: break; @@ -2992,7 +3142,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // Adjust for always crit moves if (MoveAlwaysCrits(aiData->partnerMove) && aiData->abilities[battlerAtk] == ABILITY_ANGER_POINT) { - if (AI_IsSlower(battlerAtk, battlerAtkPartner, move)) // Partner moving first + if (AI_IsSlower(battlerAtk, battlerAtkPartner, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Partner moving first { // discourage raising our attack since it's about to be maxed out if (IsAttackBoostMoveEffect(effect)) @@ -3007,23 +3157,71 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (effect) { case EFFECT_HELPING_HAND: - if (!IsBattlerAlive(battlerAtkPartner) || !HasDamagingMove(battlerAtkPartner)) - ADJUST_SCORE(-20); + if (!hasPartner + || !HasDamagingMove(battlerAtkPartner) + || aiData->abilities[battlerAtkPartner] == ABILITY_GOOD_AS_GOLD + || (aiData->partnerMove != MOVE_NONE && IsBattleMoveStatus(aiData->partnerMove))) + { + ADJUST_SCORE(WORST_EFFECT); + } + else + { + u32 ownHitsToKOFoe1 = GetBestNoOfHitsToKO(battlerAtk, LEFT_FOE(battlerAtk), AI_ATTACKING); + u32 partnerHitsToKOFoe1 = GetBestNoOfHitsToKO(battlerAtkPartner, LEFT_FOE(battlerAtk), AI_ATTACKING); + u32 ownHitsToKOFoe2 = GetBestNoOfHitsToKO(battlerAtk, RIGHT_FOE(battlerAtk), AI_ATTACKING); + u32 partnerHitsToKOFoe2 = GetBestNoOfHitsToKO(battlerAtkPartner, RIGHT_FOE(battlerAtk), AI_ATTACKING); + + if (hasTwoOpponents) + { + // Might be about to die + if (CanTargetFaintAi(LEFT_FOE(battlerAtk), battlerAtk) && CanTargetFaintAi(RIGHT_FOE(battlerAtk), battlerAtk) + && AI_IsSlower(battlerAtk, LEFT_FOE(battlerAtk), move, predictedMove, DONT_CONSIDER_PRIORITY) + && AI_IsSlower(battlerAtk, RIGHT_FOE(battlerAtk), move, predictedMove, DONT_CONSIDER_PRIORITY)) + ADJUST_SCORE(GOOD_EFFECT); + + if (ownHitsToKOFoe1 > partnerHitsToKOFoe1 && partnerHitsToKOFoe1 > 1 + && ownHitsToKOFoe2 > partnerHitsToKOFoe2 && partnerHitsToKOFoe2 > 1) + ADJUST_SCORE(GOOD_EFFECT); + } + else if (IsBattlerAlive(LEFT_FOE(battlerAtk))) + { + // Might be about to die + if (CanTargetFaintAi(LEFT_FOE(battlerAtk), battlerAtk) + && AI_IsSlower(battlerAtk, LEFT_FOE(battlerAtk), move, predictedMove, DONT_CONSIDER_PRIORITY)) + ADJUST_SCORE(GOOD_EFFECT); + + if (ownHitsToKOFoe1 > partnerHitsToKOFoe1 && partnerHitsToKOFoe1 > 1) + ADJUST_SCORE(GOOD_EFFECT); + } + else if (IsBattlerAlive(RIGHT_FOE(battlerAtk))) + { + // Might be about to die + if (CanTargetFaintAi(RIGHT_FOE(battlerAtk), battlerAtk) + && AI_IsSlower(battlerAtk, RIGHT_FOE(battlerAtk), move, predictedMove, DONT_CONSIDER_PRIORITY)) + ADJUST_SCORE(GOOD_EFFECT); + + if (ownHitsToKOFoe2 > partnerHitsToKOFoe2 && partnerHitsToKOFoe2 > 1) + ADJUST_SCORE(GOOD_EFFECT); + + } + } break; case EFFECT_PERISH_SONG: if (aiData->partnerMove != 0 && HasTrappingMoveEffect(battlerAtkPartner)) ADJUST_SCORE(WEAK_EFFECT); break; case EFFECT_MAGNET_RISE: - if (IsBattlerGrounded(battlerAtk) - && (HasMove(battlerAtkPartner, MOVE_EARTHQUAKE) || HasMove(battlerAtkPartner, MOVE_MAGNITUDE)) + if (AI_IsBattlerGrounded(battlerAtk) + && (HasMoveWithEffect(battlerAtkPartner, EFFECT_EARTHQUAKE) || HasMoveWithEffect(battlerAtkPartner, EFFECT_MAGNITUDE)) && (AI_GetMoveEffectiveness(MOVE_EARTHQUAKE, battlerAtk, battlerAtkPartner) != UQ_4_12(0.0))) // Doesn't resist ground move { RETURN_SCORE_PLUS(DECENT_EFFECT); // partner has earthquake or magnitude -> good idea to use magnet rise } break; case EFFECT_DRAGON_CHEER: - if (gBattleMons[battlerAtkPartner].status2 & STATUS2_FOCUS_ENERGY_ANY || !HasDamagingMove(battlerAtkPartner)) + if (gBattleMons[battlerAtkPartner].volatiles.dragonCheer + || gBattleMons[battlerAtkPartner].volatiles.focusEnergy + || !HasDamagingMove(battlerAtkPartner)) ADJUST_SCORE(-5); else if (atkPartnerHoldEffect == HOLD_EFFECT_SCOPE_LENS || IS_BATTLER_OF_TYPE(battlerAtkPartner, TYPE_DRAGON) @@ -3031,6 +3229,20 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) || HasMoveWithCriticalHitChance(battlerAtkPartner)) ADJUST_SCORE(GOOD_EFFECT); break; + case EFFECT_COACHING: + if (!hasPartner + || !HasMoveWithCategory(battlerAtkPartner, DAMAGE_CATEGORY_PHYSICAL)) + { + ADJUST_SCORE(WORST_EFFECT); + } + else + { + ADJUST_SCORE(IncreaseStatUpScore(battlerAtkPartner, BATTLE_OPPOSITE(battlerAtk), STAT_CHANGE_ATK)); + ADJUST_SCORE(IncreaseStatUpScore(battlerAtkPartner, BATTLE_OPPOSITE(battlerAtk), STAT_CHANGE_DEF)); + ADJUST_SCORE(IncreaseStatUpScore(battlerAtkPartner, BATTLE_OPPOSITE(battlerAtkPartner), STAT_CHANGE_ATK)); + ADJUST_SCORE(IncreaseStatUpScore(battlerAtkPartner, BATTLE_OPPOSITE(battlerAtkPartner), STAT_CHANGE_DEF)); + } + break; default: break; } // our effect relative to partner @@ -3038,38 +3250,20 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // consider global move effects switch (effect) { - case EFFECT_SANDSTORM: - if (ShouldSetSandstorm(battlerAtkPartner, atkPartnerAbility, atkPartnerHoldEffect)) - { - RETURN_SCORE_PLUS(WEAK_EFFECT); // our partner benefits from sandstorm - } - break; - case EFFECT_RAIN_DANCE: - if (ShouldSetRain(battlerAtkPartner, atkPartnerAbility, atkPartnerHoldEffect)) - { - RETURN_SCORE_PLUS(WEAK_EFFECT); // our partner benefits from rain - } - break; - case EFFECT_SUNNY_DAY: - if (ShouldSetSun(battlerAtkPartner, atkPartnerAbility, atkPartnerHoldEffect)) - { - RETURN_SCORE_PLUS(WEAK_EFFECT); // our partner benefits from sun - } - break; - case EFFECT_HAIL: - if (IsBattlerAlive(battlerAtkPartner) - && ShouldSetHail(battlerAtkPartner, atkPartnerAbility, atkPartnerHoldEffect)) - { - RETURN_SCORE_PLUS(DECENT_EFFECT); // our partner benefits from hail - } + // Both Pokemon use Trick Room on the final turn of Trick Room to anticipate both opponents Protecting to stall out. + // This unsets Trick Room and resets it with a full timer. + case EFFECT_TRICK_ROOM: + if (hasPartner && gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == 1 + && ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM) + && HasMoveWithEffect(battlerAtkPartner, EFFECT_TRICK_ROOM) + && RandomPercentage(RNG_AI_REFRESH_TRICK_ROOM_ON_LAST_TURN, DOUBLE_TRICK_ROOM_ON_LAST_TURN_CHANCE)) + ADJUST_SCORE(PERFECT_EFFECT); break; - case EFFECT_SNOWSCAPE: - case EFFECT_CHILLY_RECEPTION: - if (IsBattlerAlive(battlerAtkPartner) - && ShouldSetSnow(battlerAtkPartner, atkPartnerAbility, atkPartnerHoldEffect)) - { - RETURN_SCORE_PLUS(DECENT_EFFECT); // our partner benefits from snow - } + case EFFECT_TAILWIND: + // Anticipate both opponents protecting to stall out Trick Room, and apply Tailwind. + if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == 1 + && RandomPercentage(RNG_AI_APPLY_TAILWIND_ON_LAST_TURN_OF_TRICK_ROOM, TAILWIND_IN_TRICK_ROOM_CHANCE)) + ADJUST_SCORE(BEST_EFFECT); break; default: break; @@ -3088,6 +3282,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (effect) { case EFFECT_EXPLOSION: + case EFFECT_MISTY_EXPLOSION: if (gAiThinkingStruct->aiFlags[battlerAtk] & (AI_FLAG_RISKY | AI_FLAG_WILL_SUICIDE)) { RETURN_SCORE_PLUS(10); @@ -3134,7 +3329,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } else { - ADJUST_SCORE(-DECENT_EFFECT); + ADJUST_SCORE(AWFUL_EFFECT); } } // No reason to kill partner has been found. @@ -3163,7 +3358,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // check specific target - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) { bool32 isMoveAffectedByPartnerAbility = TRUE; @@ -3180,7 +3375,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_ANGER_POINT: if (MoveAlwaysCrits(move) && BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_ATK) - && AI_IsFaster(battlerAtk, battlerAtkPartner, move) + && AI_IsFaster(battlerAtk, battlerAtkPartner, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) && isFriendlyFireOK) { if (MoveAlwaysCrits(move)) @@ -3203,7 +3398,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_VOLT_ABSORB: if (moveType == TYPE_ELECTRIC) { - if (B_REDIRECT_ABILITY_IMMUNITY < GEN_5 && atkPartnerAbility == ABILITY_LIGHTNING_ROD) + if (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) < GEN_5 && atkPartnerAbility == ABILITY_LIGHTNING_ROD) { RETURN_SCORE_MINUS(10); } @@ -3212,7 +3407,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { ADJUST_SCORE(DECENT_EFFECT); } - else if (ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + else if (ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { RETURN_SCORE_PLUS(WEAK_EFFECT); } @@ -3249,7 +3444,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_STORM_DRAIN: if (moveType == TYPE_WATER) { - if (B_REDIRECT_ABILITY_IMMUNITY < GEN_5 && atkPartnerAbility == ABILITY_STORM_DRAIN) + if (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) < GEN_5 && atkPartnerAbility == ABILITY_STORM_DRAIN) { RETURN_SCORE_MINUS(10); } @@ -3258,7 +3453,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { ADJUST_SCORE(DECENT_EFFECT); } - else if (ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + else if (ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { RETURN_SCORE_PLUS(WEAK_EFFECT); } @@ -3274,7 +3469,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case ABILITY_WATER_COMPACTION: if (moveType == TYPE_WATER && isFriendlyFireOK - && ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + && ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) { @@ -3293,7 +3488,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case ABILITY_STEAM_ENGINE: if (isFriendlyFireOK && (moveType == TYPE_WATER || moveType == TYPE_FIRE) - && ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + && ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) { @@ -3309,7 +3504,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_THERMAL_EXCHANGE: if (moveType == TYPE_FIRE && isFriendlyFireOK && !IsBattleMoveStatus(move) - && ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + && ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) { @@ -3336,7 +3531,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { ADJUST_SCORE(DECENT_EFFECT); } - if (ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + if (ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { RETURN_SCORE_PLUS(WEAK_EFFECT); } @@ -3354,7 +3549,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(DECENT_EFFECT); } - if (ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + if (ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { RETURN_SCORE_PLUS(WEAK_EFFECT); } @@ -3367,7 +3562,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_JUSTIFIED: if (moveType == TYPE_DARK && isFriendlyFireOK && !IsBattleMoveStatus(move) - && ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + && ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) { @@ -3389,7 +3584,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_RATTLED: if (!IsBattleMoveStatus(move) && isFriendlyFireOK && (moveType == TYPE_DARK || moveType == TYPE_GHOST || moveType == TYPE_BUG) - && ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + && ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) { @@ -3405,7 +3600,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_CONTRARY: case ABILITY_DEFIANT: case ABILITY_COMPETITIVE: - if (IsStatLoweringEffect(effect) && isFriendlyFireOK && ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + if (IsStatLoweringEffect(effect) && isFriendlyFireOK && ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) { @@ -3431,6 +3626,14 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (effect) { + case EFFECT_DOODLE: + case EFFECT_ENTRAINMENT: + case EFFECT_GASTRO_ACID: + case EFFECT_ROLE_PLAY: + case EFFECT_SKILL_SWAP: + case EFFECT_OVERWRITE_ABILITY: + AbilityChangeScore(battlerAtk, battlerAtkPartner, move, &score, aiData); + return score; case EFFECT_SPICY_EXTRACT: if (AI_ShouldSpicyExtract(battlerAtk, battlerAtkPartner, move, aiData)) { @@ -3440,7 +3643,19 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_PURIFY: if (gBattleMons[battlerAtkPartner].status1 & STATUS1_ANY) { - RETURN_SCORE_PLUS(WEAK_EFFECT); + if (gBattleMons[battlerAtkPartner].status1 & STATUS1_CAN_MOVE) + { + if (ShouldCureStatus(battlerAtk, battlerAtkPartner, aiData)) + ADJUST_SCORE(DECENT_EFFECT); + } + else + { + ADJUST_SCORE(DECENT_EFFECT); + } + + if ((!IsBattlerAlive(LEFT_FOE(battlerAtk)) || ShouldRecover(battlerAtk, LEFT_FOE(battlerAtk), move, 50)) + && (!IsBattlerAlive(RIGHT_FOE(battlerAtk)) || ShouldRecover(battlerAtk, RIGHT_FOE(battlerAtk), move, 50))) + RETURN_SCORE_PLUS(WEAK_EFFECT); } break; case EFFECT_SWAGGER: @@ -3479,51 +3694,6 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) RETURN_SCORE_PLUS(WEAK_EFFECT); } break; - case EFFECT_SKILL_SWAP: - if (aiData->abilities[battlerAtk] != aiData->abilities[BATTLE_PARTNER(battlerAtk)] && !attackerHasBadAbility) - { - // Partner abilities - if (aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_TRUANT) - { - ADJUST_SCORE(10); - } - else if (aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_INTIMIDATE) - { - ADJUST_SCORE(DECENT_EFFECT); - } - // Active mon abilities - if (aiData->abilities[battlerAtk] == ABILITY_COMPOUND_EYES - && HasMoveWithLowAccuracy(battlerAtkPartner, FOE(battlerAtkPartner), 90, TRUE, atkPartnerAbility, aiData->abilities[FOE(battlerAtkPartner)], atkPartnerHoldEffect, aiData->holdEffects[FOE(battlerAtkPartner)])) - { - ADJUST_SCORE(GOOD_EFFECT); - } - else if (aiData->abilities[battlerAtk] == ABILITY_CONTRARY && HasMoveThatLowersOwnStats(battlerAtkPartner)) - { - ADJUST_SCORE(GOOD_EFFECT); - } - return score; - } - break; - case EFFECT_ROLE_PLAY: - if (attackerHasBadAbility && !partnerHasBadAbility) - { - RETURN_SCORE_PLUS(WEAK_EFFECT); - } - break; - case EFFECT_WORRY_SEED: - case EFFECT_GASTRO_ACID: - case EFFECT_SIMPLE_BEAM: - if (partnerHasBadAbility) - { - RETURN_SCORE_PLUS(DECENT_EFFECT); - } - break; - case EFFECT_ENTRAINMENT: - if (partnerHasBadAbility && IsAbilityOfRating(aiData->abilities[battlerAtk], 0)) - { - RETURN_SCORE_PLUS(DECENT_EFFECT); - } - break; case EFFECT_SOAK: if (atkPartnerAbility == ABILITY_WONDER_GUARD && !IS_BATTLER_OF_TYPE(battlerAtkPartner, TYPE_WATER) @@ -3535,10 +3705,10 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_INSTRUCT: { u16 instructedMove; - if (AI_IsFaster(battlerAtk, battlerAtkPartner, move)) + if (AI_IsFaster(battlerAtk, battlerAtkPartner, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) instructedMove = aiData->partnerMove; else - instructedMove = gLastMoves[battlerAtkPartner]; + instructedMove = aiData->lastUsedMove[battlerAtkPartner]; if (instructedMove != MOVE_NONE && !IsBattleMoveStatus(instructedMove) @@ -3549,21 +3719,73 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_AFTER_YOU: - if (AI_IsSlower(battlerAtkPartner, FOE(battlerAtkPartner), aiData->partnerMove) // Opponent mon 1 goes before partner - || AI_IsSlower(battlerAtkPartner, BATTLE_PARTNER(FOE(battlerAtkPartner)), aiData->partnerMove)) // Opponent mon 2 goes before partner + if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && HasMoveWithEffect(battlerAtkPartner, EFFECT_TRICK_ROOM)) + ADJUST_SCORE(DECENT_EFFECT); + + if (AI_IsSlower(battlerAtkPartner, LEFT_FOE(battlerAtk), aiData->partnerMove, predictedMoveSpeedCheck, CONSIDER_PRIORITY) // Opponent mon 1 goes before partner + && AI_IsSlower(battlerAtkPartner, RIGHT_FOE(battlerAtk), aiData->partnerMove, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Opponent mon 2 goes before partner { if (partnerEffect == EFFECT_COUNTER || partnerEffect == EFFECT_MIRROR_COAT) break; // These moves need to go last - RETURN_SCORE_PLUS(WEAK_EFFECT); + ADJUST_SCORE(WEAK_EFFECT); } break; case EFFECT_HEAL_PULSE: case EFFECT_HIT_ENEMY_HEAL_ALLY: - if (AI_IsFaster(battlerAtk, FOE(battlerAtk), move) - && AI_IsFaster(battlerAtk, BATTLE_PARTNER(FOE(battlerAtk)), move) + if (AI_IsFaster(battlerAtk, LEFT_FOE(battlerAtk), move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) + && AI_IsFaster(battlerAtk, RIGHT_FOE(battlerAtk), move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) && gBattleMons[battlerAtkPartner].hp < gBattleMons[battlerAtkPartner].maxHP / 2) RETURN_SCORE_PLUS(WEAK_EFFECT); break; + case EFFECT_SPEED_SWAP: + break; + case EFFECT_GUARD_SPLIT: + { + u32 atkDefense = gBattleMons[battlerAtk].defense; + u32 defDefense = gBattleMons[battlerDef].defense; + u32 atkSpDefense = gBattleMons[battlerAtk].spDefense; + u32 defSpDefense = gBattleMons[battlerDef].spDefense; + + // It's actually * 100 and / 2 + u32 newDefense = (atkDefense + defDefense) * 50; + u32 newSpDefense = (atkSpDefense + defSpDefense) * 50; + + // We want to massively raise our defense. + if (newDefense > atkDefense * GUARD_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + if (newSpDefense > atkSpDefense * GUARD_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + if (newDefense > defDefense * GUARD_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + if (newSpDefense > defSpDefense * GUARD_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + + ADJUST_SCORE(WORST_EFFECT); + break; + } + case EFFECT_POWER_SPLIT: + { + u32 atkAttack = gBattleMons[battlerAtk].attack; + u32 defAttack = gBattleMons[battlerDef].attack; + u32 atkSpAttack = gBattleMons[battlerAtk].spAttack; + u32 defSpAttack = gBattleMons[battlerDef].spAttack; + + // * 100 and / 2 + u32 newAttack = (atkAttack + defAttack) * 50; + u32 newSpAtk = (atkSpAttack + defSpAttack) * 50; + + if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL) && newAttack > atkAttack * POWER_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL) && newAttack > defAttack * POWER_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL) && newSpAtk > atkSpAttack * POWER_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL) && newSpAtk > defSpAttack * POWER_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + + ADJUST_SCORE(WORST_EFFECT); + break; + } default: break; } // attacker move effects @@ -3579,6 +3801,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) else // checking opponent { // these checks mostly handled in AI_CheckBadMove and AI_CheckViability +/* switch (effect) { case EFFECT_SKILL_SWAP: @@ -3590,14 +3813,14 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) default: break; } - +*/ // lightning rod, flash fire against enemy handled in AI_CheckBadMove } return score; } -static bool32 IsPinchBerryItemEffect(enum ItemHoldEffect holdEffect) +static bool32 IsPinchBerryItemEffect(enum HoldEffect holdEffect) { switch (holdEffect) { @@ -3616,16 +3839,50 @@ static bool32 IsPinchBerryItemEffect(enum ItemHoldEffect holdEffect) } } -static s32 CompareMoveAccuracies(u32 battlerAtk, u32 battlerDef, u32 moveSlot1, u32 moveSlot2) +static enum MoveComparisonResult CompareMoveAccuracies(u32 battlerAtk, u32 battlerDef, u32 moveSlot1, u32 moveSlot2) { u32 acc1 = gAiLogicData->moveAccuracy[battlerAtk][battlerDef][moveSlot1]; u32 acc2 = gAiLogicData->moveAccuracy[battlerAtk][battlerDef][moveSlot2]; if (acc1 > acc2) - return 1; + return MOVE_WON_COMPARISON; else if (acc2 > acc1) - return -1; - return 0; + return MOVE_LOST_COMPARISON; + return MOVE_NEUTRAL_COMPARISON; +} + +static enum MoveComparisonResult CompareMoveSpeeds(u32 battlerAtk, u32 battlerDef, u16 move1, u16 move2) +{ + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + u32 speed1 = AI_WhoStrikesFirst(battlerAtk, battlerDef, move1, predictedMoveSpeedCheck, CONSIDER_PRIORITY); + u32 speed2 = AI_WhoStrikesFirst(battlerAtk, battlerDef, move2, predictedMoveSpeedCheck, CONSIDER_PRIORITY); + + if (speed1 == AI_IS_FASTER && speed2 == AI_IS_SLOWER) + return MOVE_WON_COMPARISON; + if (speed2 == AI_IS_FASTER && speed1 == AI_IS_SLOWER) + return MOVE_LOST_COMPARISON; + return MOVE_NEUTRAL_COMPARISON; +} + +static enum MoveComparisonResult CompareGuaranteeFaintTarget(u32 battlerAtk, u32 battlerDef, u16 moveSlot1, u16 moveSlot2, u16 *moves) +{ + s32 dmg1, dmg2; + bool32 guarantee1, guarantee2; + + if (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT)) + return 0; + + // Explictly care about guaranteed KOs universally + dmg1 = gAiLogicData->simulatedDmg[battlerAtk][battlerDef][moveSlot1].minimum; + guarantee1 = (gBattleMons[battlerDef].hp <= dmg1 && !CanEndureHit(battlerAtk, battlerDef, moves[moveSlot1])); + dmg2 = gAiLogicData->simulatedDmg[battlerAtk][battlerDef][moveSlot2].minimum; + guarantee2 = (gBattleMons[battlerDef].hp <= dmg2 && !CanEndureHit(battlerAtk, battlerDef, moves[moveSlot2])); + + if (guarantee1 && !guarantee2) + return MOVE_WON_COMPARISON; + if (guarantee2 && !guarantee1) + return MOVE_LOST_COMPARISON; + return MOVE_NEUTRAL_COMPARISON; } static inline bool32 ShouldUseSpreadDamageMove(u32 battlerAtk, u32 move, u32 moveIndex, u32 hitsToFaintOpposingBattler) @@ -3633,118 +3890,170 @@ static inline bool32 ShouldUseSpreadDamageMove(u32 battlerAtk, u32 move, u32 mov u32 partnerBattler = BATTLE_PARTNER(battlerAtk); u32 noOfHitsToFaintPartner = GetNoOfHitsToKOBattler(battlerAtk, partnerBattler, moveIndex, AI_ATTACKING); u32 friendlyFireThreshold = GetFriendlyFireKOThreshold(battlerAtk); - return (IsDoubleBattle() + return (HasPartnerIgnoreFlags(battlerAtk) && noOfHitsToFaintPartner != 0 // Immunity check - && IsBattlerAlive(partnerBattler) && GetBattlerMoveTargetType(battlerAtk, move) == MOVE_TARGET_FOES_AND_ALLY && !(noOfHitsToFaintPartner < friendlyFireThreshold && hitsToFaintOpposingBattler == 1) && noOfHitsToFaintPartner < (friendlyFireThreshold * 2)); } -static s32 AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef, u32 currId) +static bool32 ShouldCompareMove(u32 battlerAtk, u32 battlerDef, u32 moveIndex, u16 move) { - u32 i; + if (IsTargetingPartner(battlerAtk, battlerDef)) + return FALSE; + if (GetMovePower(move) == 0) + return FALSE; + if (GetNoOfHitsToKOBattler(battlerAtk, battlerDef, moveIndex, AI_ATTACKING) == 0) + return FALSE; + if (gAiThinkingStruct->aiFlags[battlerAtk] & (AI_FLAG_RISKY | AI_FLAG_PREFER_HIGHEST_DAMAGE_MOVE) && GetBestDmgMoveFromBattler(battlerAtk, battlerDef, AI_ATTACKING) == move) + return FALSE; + return TRUE; +} + +static void AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef) +{ + u32 i, currId; + u32 tempMoveScores[MAX_MON_MOVES]; + u32 moveComparisonScores[MAX_MON_MOVES]; + u32 bestScore = AI_SCORE_DEFAULT; bool32 multipleBestMoves = FALSE; - s32 viableMoveScores[MAX_MON_MOVES]; - s32 bestViableMoveScore; s32 noOfHits[MAX_MON_MOVES]; - s32 score = 0; s32 leastHits = 1000; u16 *moves = GetMovesArray(battlerAtk); bool8 isTwoTurnNotSemiInvulnerableMove[MAX_MON_MOVES]; - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (moves[i] != MOVE_NONE && GetMovePower(moves[i]) != 0) - { - noOfHits[i] = GetNoOfHitsToKOBattler(battlerAtk, battlerDef, i, AI_ATTACKING); - if (ShouldUseSpreadDamageMove(battlerAtk,moves[i], i, noOfHits[i])) - { - noOfHits[i] = -1; - viableMoveScores[i] = 0; - isTwoTurnNotSemiInvulnerableMove[i] = FALSE; - } - else if (noOfHits[i] < leastHits && noOfHits[i] != 0) - { - leastHits = noOfHits[i]; - } - viableMoveScores[i] = AI_SCORE_DEFAULT; - isTwoTurnNotSemiInvulnerableMove[i] = IsTwoTurnNotSemiInvulnerableMove(battlerAtk, moves[i]); - } - else - { - noOfHits[i] = -1; - viableMoveScores[i] = 0; - isTwoTurnNotSemiInvulnerableMove[i] = FALSE; - } - } - - // Priority list: - // 1. Less no of hits to ko - // 2. Not charging - // 3. More accuracy - // 4. Better effect - - // Current move requires the least hits to KO. Compare with other moves. - if (leastHits == noOfHits[currId]) + for (currId = 0; currId < MAX_MON_MOVES; currId++) { + moveComparisonScores[currId] = 0; + if (!ShouldCompareMove(battlerAtk, battlerDef, currId, moves[currId])) + continue; for (i = 0; i < MAX_MON_MOVES; i++) { - if (i == currId) - continue; - if (noOfHits[currId] == noOfHits[i]) + if (moves[i] != MOVE_NONE && GetMovePower(moves[i]) != 0) { - multipleBestMoves = TRUE; - // We need to make sure it's the current move which is objectively better. - if (isTwoTurnNotSemiInvulnerableMove[i] && !isTwoTurnNotSemiInvulnerableMove[currId]) - viableMoveScores[i] -= 3; - else if (!isTwoTurnNotSemiInvulnerableMove[i] && isTwoTurnNotSemiInvulnerableMove[currId]) - viableMoveScores[currId] -= 3; - - switch (CompareMoveAccuracies(battlerAtk, battlerDef, currId, i)) + noOfHits[i] = GetNoOfHitsToKOBattler(battlerAtk, battlerDef, i, AI_ATTACKING); + if (ShouldUseSpreadDamageMove(battlerAtk,moves[i], i, noOfHits[i])) { - case 1: - viableMoveScores[i] -= 2; - break; - case -1: - viableMoveScores[currId] -= 2; - break; + noOfHits[i] = -1; + tempMoveScores[i] = 0; + isTwoTurnNotSemiInvulnerableMove[i] = FALSE; } - switch (AI_WhichMoveBetter(moves[currId], moves[i], battlerAtk, battlerDef, noOfHits[currId])) + else if (noOfHits[i] < leastHits && noOfHits[i] != 0) { - case 1: - viableMoveScores[i] -= 1; - break; - case -1: - viableMoveScores[currId] -= 1; - break; + leastHits = noOfHits[i]; } + tempMoveScores[i] = AI_SCORE_DEFAULT; + isTwoTurnNotSemiInvulnerableMove[i] = IsTwoTurnNotSemiInvulnerableMove(battlerAtk, moves[i]); + } + else + { + noOfHits[i] = -1; + tempMoveScores[i] = 0; + isTwoTurnNotSemiInvulnerableMove[i] = FALSE; } } - // Turns out the current move deals the most dmg compared to the other 3. - if (!multipleBestMoves) - ADJUST_SCORE(BEST_DAMAGE_MOVE); - else + + // Priority list: + // 1. Less no of hits to ko + // 2. Priority if outsped and a OHKO + // 3. Not charging + // 4. More accuracy + // 5. Guaranteed KO + // 6. Better effect + + // Current move requires the least hits to KO. Compare with other moves. + if (leastHits == noOfHits[currId]) { - bestViableMoveScore = 0; for (i = 0; i < MAX_MON_MOVES; i++) { - if (viableMoveScores[i] > bestViableMoveScore) - bestViableMoveScore = viableMoveScores[i]; + if (i == currId) + continue; + if (noOfHits[currId] == noOfHits[i]) + { + multipleBestMoves = TRUE; + // We need to make sure it's the current move which is objectively better. + if (isTwoTurnNotSemiInvulnerableMove[i] && !isTwoTurnNotSemiInvulnerableMove[currId]) + tempMoveScores[currId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_NOT_CHARGING); + else if (!isTwoTurnNotSemiInvulnerableMove[i] && isTwoTurnNotSemiInvulnerableMove[currId]) + tempMoveScores[i] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_NOT_CHARGING); + + // Comparing KOs + if (noOfHits[currId] == 1) + { + // Use priority to get fast KO if outsped + switch (CompareMoveSpeeds(battlerAtk, battlerDef, moves[currId], moves[i])) + { + case MOVE_WON_COMPARISON: + tempMoveScores[currId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_SPEED); + break; + case MOVE_LOST_COMPARISON: + tempMoveScores[i] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_SPEED); + break; + case MOVE_NEUTRAL_COMPARISON: + break; + } + // Min roll KOs + switch (CompareGuaranteeFaintTarget(battlerAtk, battlerDef, currId, i, moves)) + { + case MOVE_WON_COMPARISON: + tempMoveScores[currId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_GUARANTEE); + break; + case MOVE_LOST_COMPARISON: + tempMoveScores[i] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_GUARANTEE); + break; + case MOVE_NEUTRAL_COMPARISON: + break; + } + } + switch (CompareMoveAccuracies(battlerAtk, battlerDef, currId, i)) + { + case MOVE_WON_COMPARISON: + tempMoveScores[currId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_ACCURACY); + break; + case MOVE_LOST_COMPARISON: + tempMoveScores[i] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_ACCURACY); + break; + case MOVE_NEUTRAL_COMPARISON: + break; + } + switch (AI_WhichMoveBetter(moves[currId], moves[i], battlerAtk, battlerDef, noOfHits[currId])) + { + case MOVE_WON_COMPARISON: + tempMoveScores[currId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_EFFECT); + break; + case MOVE_LOST_COMPARISON: + tempMoveScores[i] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_EFFECT); + break; + case MOVE_NEUTRAL_COMPARISON: + break; + } + } } - // Unless a better move was found increase score of current move - if (viableMoveScores[currId] == bestViableMoveScore) - ADJUST_SCORE(BEST_DAMAGE_MOVE); + // Turns out the current move deals the most dmg compared to the other 3. + if (!multipleBestMoves) + moveComparisonScores[currId] = UINT32_MAX; + else + moveComparisonScores[currId] = tempMoveScores[currId]; } } - return score; + // Find highest comparison score + for (int i = 0; i < MAX_MON_MOVES; i++) + { + if (moveComparisonScores[i] > bestScore) + bestScore = moveComparisonScores[i]; + } + // Increase score for corresponding move(s), accomodating ties + for (int i = 0; i < MAX_MON_MOVES; i++) + { + if (moveComparisonScores[i] == bestScore) + gAiThinkingStruct->score[i] += BEST_DAMAGE_MOVE; + } } -static u32 AI_CalcHoldEffectMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) +static s32 AI_CalcHoldEffectMoveScore(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData) { - struct AiLogicData *aiData = gAiLogicData; - enum ItemHoldEffect holdEffect = aiData->holdEffects[battlerAtk]; + enum HoldEffect holdEffect = aiData->holdEffects[battlerAtk]; s32 score = 0; @@ -3760,7 +4069,7 @@ static u32 AI_CalcHoldEffectMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) } else { - ADJUST_SCORE(-DECENT_EFFECT); + ADJUST_SCORE(AWFUL_EFFECT); } } break; @@ -3771,19 +4080,22 @@ static u32 AI_CalcHoldEffectMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) return score; } -static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) +static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData) { // move data enum BattleMoveEffects moveEffect = GetMoveEffect(move); - struct AiLogicData *aiData = gAiLogicData; u32 movesetIndex = gAiThinkingStruct->movesetIndex; uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][movesetIndex]; s32 score = 0; - u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); - u32 predictedType = GetMoveType(predictedMove); + u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, aiData); + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, aiData); + enum Type predictedType = GetMoveType(predictedMove); u32 predictedMoveSlot = GetMoveSlot(GetMovesArray(battlerDef), predictedMove); - bool32 isDoubleBattle = IsValidDoubleBattle(battlerAtk); + bool32 isBattle1v1 = IsBattle1v1(); + bool32 hasTwoOpponents = HasTwoOpponents(battlerAtk); + bool32 hasPartner = HasPartner(battlerAtk); + bool32 moveTargetsBothOpponents = hasTwoOpponents && (GetMoveTarget(move) & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_ALL_BATTLERS)); u32 i; // The AI should understand that while Dynamaxed, status moves function like Protect. @@ -3794,18 +4106,35 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_PREFER_STATUS_MOVES && IsBattleMoveStatus(move) && effectiveness != UQ_4_12(0.0)) ADJUST_SCORE(10); + // don't get baited into encore + if (gBattleMoveEffects[moveEffect].encourageEncore + && HasBattlerSideMoveWithEffect(battlerDef, EFFECT_ENCORE) + && (B_MENTAL_HERB < GEN_5 || aiData->holdEffects[battlerAtk] != HOLD_EFFECT_MENTAL_HERB)) + { + if (!AI_IsAbilityOnSide(battlerAtk, ABILITY_AROMA_VEIL) + || IsMoldBreakerTypeAbility(battlerDef, aiData->abilities[battlerDef]) + || aiData->abilities[battlerDef] == ABILITY_MYCELIUM_MIGHT + || IsMoldBreakerTypeAbility(BATTLE_PARTNER(battlerDef), aiData->abilities[BATTLE_PARTNER(battlerDef)]) + || aiData->abilities[BATTLE_PARTNER(battlerDef)] == ABILITY_MYCELIUM_MIGHT) + return score; + } + // check thawing moves - if ((gBattleMons[battlerAtk].status1 & (STATUS1_FREEZE | STATUS1_FROSTBITE)) && MoveThawsUser(move)) + if (gBattleMons[battlerAtk].status1 & STATUS1_ICY_ANY && MoveThawsUser(move)) ADJUST_SCORE(10); // check burn / frostbite - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_SMART_SWITCHING && gAiLogicData->abilities[battlerAtk] == ABILITY_NATURAL_CURE) + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_SMART_SWITCHING && aiData->abilities[battlerAtk] == ABILITY_NATURAL_CURE) { if ((gBattleMons[battlerAtk].status1 & STATUS1_BURN && HasOnlyMovesWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL, TRUE)) || (gBattleMons[battlerAtk].status1 & STATUS1_FROSTBITE && HasOnlyMovesWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL, TRUE))) ADJUST_SCORE(-20); // Force switch if all your attacking moves are physical and you have Natural Cure. } + // check guaranteed flinch, a la Fake Out + if (IsFlinchGuaranteed(battlerAtk, battlerDef, move)) + ADJUST_SCORE(BEST_EFFECT); + // Non-volatile statuses switch(GetMoveNonVolatileStatus(move)) { @@ -3834,12 +4163,27 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_DREAM_EATER: - case EFFECT_STRENGTH_SAP: case EFFECT_AQUA_RING: if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT) ADJUST_SCORE(DECENT_EFFECT); break; + case EFFECT_STRENGTH_SAP: + { + u32 atkStat = gBattleMons[battlerDef].attack; + u32 atkStage = gBattleMons[battlerDef].statStages[STAT_ATK]; + atkStat *= gStatStageRatios[atkStage][0]; + atkStat /= gStatStageRatios[atkStage][1]; + u32 healPercent = atkStat * 100 / gBattleMons[battlerAtk].maxHP; + if (ShouldRecover(battlerAtk, battlerDef, move, healPercent)) + { + ADJUST_SCORE(GOOD_EFFECT); + if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT) + ADJUST_SCORE(WEAK_EFFECT); + } + break; + } case EFFECT_EXPLOSION: + case EFFECT_MISTY_EXPLOSION: case EFFECT_MEMENTO: if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE && gBattleMons[battlerDef].statStages[STAT_EVASION] < 7) { @@ -3852,26 +4196,31 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_MIRROR_MOVE: - if (predictedMove != MOVE_NONE) + if (predictedMove && GetMoveEffect(predictedMove) != GetMoveEffect(move)) return AI_CheckViability(battlerAtk, battlerDef, predictedMove, score); break; - case EFFECT_ATTACK_UP: case EFFECT_ATTACK_UP_USER_ALLY: + ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, STAT_CHANGE_ATK)); + case EFFECT_ATTACK_UP: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK)); break; case EFFECT_ATTACK_UP_2: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK_2)); break; case EFFECT_DEFENSE_UP: - case EFFECT_DEFENSE_UP_3: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF)); break; + case EFFECT_STUFF_CHEEKS: case EFFECT_DEFENSE_UP_2: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF_2)); break; + case EFFECT_DEFENSE_UP_3: + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF_3)); + break; case EFFECT_SPEED_UP: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPEED)); break; + case EFFECT_AUTOTOMIZE: case EFFECT_SPEED_UP_2: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPEED_2)); break; @@ -3879,9 +4228,11 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK)); break; case EFFECT_SPECIAL_ATTACK_UP_2: - case EFFECT_SPECIAL_ATTACK_UP_3: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK_2)); break; + case EFFECT_SPECIAL_ATTACK_UP_3: + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK_3)); + break; case EFFECT_SPECIAL_DEFENSE_UP: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPDEF)); break; @@ -3898,89 +4249,31 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; case EFFECT_ATTACK_DOWN: case EFFECT_ATTACK_DOWN_2: - if (!ShouldLowerAttack(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - ADJUST_SCORE(-2); - if (gBattleMons[battlerDef].statStages[STAT_ATK] < DEFAULT_STAT_STAGE) - ADJUST_SCORE(-1); - else if (aiData->hpPercents[battlerAtk] <= 90) - ADJUST_SCORE(-1); - if (gBattleMons[battlerDef].statStages[STAT_ATK] > 3 && !AI_RandLessThan(50)) - ADJUST_SCORE(-2); - else if (aiData->hpPercents[battlerDef] < 70) - ADJUST_SCORE(-2); + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_ATK)); break; case EFFECT_DEFENSE_DOWN: case EFFECT_DEFENSE_DOWN_2: - if (!ShouldLowerDefense(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - ADJUST_SCORE(-2); - if ((aiData->hpPercents[battlerAtk] < 70 && !AI_RandLessThan(50)) || (gBattleMons[battlerDef].statStages[STAT_DEF] <= 3 && !AI_RandLessThan(50))) - ADJUST_SCORE(-2); - if (aiData->hpPercents[battlerDef] <= 70) - ADJUST_SCORE(-2); + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_DEF)); break; case EFFECT_SPEED_DOWN: case EFFECT_SPEED_DOWN_2: - if (AI_IsFaster(battlerAtk, battlerDef, move)) - ADJUST_SCORE(-3); - else if (!AI_RandLessThan(70)) - ADJUST_SCORE(DECENT_EFFECT); + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_SPEED)); break; case EFFECT_SPECIAL_ATTACK_DOWN: case EFFECT_SPECIAL_ATTACK_DOWN_2: - if (!ShouldLowerSpAtk(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - ADJUST_SCORE(-2); - if (gBattleMons[battlerDef].statStages[STAT_SPATK] < DEFAULT_STAT_STAGE) - ADJUST_SCORE(-1); - else if (aiData->hpPercents[battlerAtk] <= 90) - ADJUST_SCORE(-1); - if (gBattleMons[battlerDef].statStages[STAT_SPATK] > 3 && !AI_RandLessThan(50)) - ADJUST_SCORE(-2); - else if (aiData->hpPercents[battlerDef] < 70) - ADJUST_SCORE(-2); + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_SPATK)); break; case EFFECT_SPECIAL_DEFENSE_DOWN: case EFFECT_SPECIAL_DEFENSE_DOWN_2: - if (!ShouldLowerSpDef(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - ADJUST_SCORE(-2); - if ((aiData->hpPercents[battlerAtk] < 70 && !AI_RandLessThan(50)) - || (gBattleMons[battlerDef].statStages[STAT_SPDEF] <= 3 && !AI_RandLessThan(50))) - ADJUST_SCORE(-2); - if (aiData->hpPercents[battlerDef] <= 70) - ADJUST_SCORE(-2); + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_SPDEF)); break; case EFFECT_ACCURACY_DOWN: case EFFECT_ACCURACY_DOWN_2: - if (ShouldLowerAccuracy(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - ADJUST_SCORE(-2); - if ((aiData->hpPercents[battlerAtk] < 70 || aiData->hpPercents[battlerDef] < 70) && AI_RandLessThan(100)) - ADJUST_SCORE(-1); - if (gBattleMons[battlerDef].statStages[STAT_ACC] <= 4 && !AI_RandLessThan(80)) - ADJUST_SCORE(-2); - if (gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY && !AI_RandLessThan(70)) - ADJUST_SCORE(DECENT_EFFECT); - if (gStatuses3[battlerDef] & STATUS3_LEECHSEED && !AI_RandLessThan(70)) - ADJUST_SCORE(DECENT_EFFECT); - if (gStatuses3[battlerDef] & STATUS3_ROOTED && AI_RandLessThan(128)) - ADJUST_SCORE(WEAK_EFFECT); - if (gBattleMons[battlerDef].status2 & STATUS2_CURSED && !AI_RandLessThan(70)) - ADJUST_SCORE(DECENT_EFFECT); - if (aiData->hpPercents[battlerAtk] > 70 || gBattleMons[battlerDef].statStages[STAT_ACC] < DEFAULT_STAT_STAGE) - break; - else if (aiData->hpPercents[battlerAtk] < 40 || aiData->hpPercents[battlerDef] < 40 || !AI_RandLessThan(70)) - ADJUST_SCORE(-2); + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_ACC)); break; case EFFECT_EVASION_DOWN: case EFFECT_EVASION_DOWN_2: - if (!ShouldLowerEvasion(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - ADJUST_SCORE(-2); - if ((aiData->hpPercents[battlerAtk] < 70 || gBattleMons[battlerDef].statStages[STAT_EVASION] <= 3) && !AI_RandLessThan(50)) - ADJUST_SCORE(-2); - if (aiData->hpPercents[battlerDef] <= 70) - ADJUST_SCORE(-2); - if (gBattleMons[battlerAtk].statStages[STAT_ACC] < DEFAULT_STAT_STAGE) - ADJUST_SCORE(WEAK_EFFECT); - if (gBattleMons[battlerDef].statStages[STAT_EVASION] < 7 || aiData->abilities[battlerAtk] == ABILITY_NO_GUARD) - ADJUST_SCORE(-2); + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_EVASION)); break; case EFFECT_SPICY_EXTRACT: // TODO: Make IncreaseStatDownScore function, just like IncreaseStatUpScore @@ -3988,7 +4281,34 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_BIDE: if (aiData->hpPercents[battlerAtk] < 90) ADJUST_SCORE(-2); // Should be either removed or turned into increasing score + // treat as offense booster case EFFECT_ACUPRESSURE: + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK_2)); + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK_2)); + break; + case EFFECT_GEAR_UP: + if (aiData->abilities[battlerAtk] == ABILITY_PLUS || aiData->abilities[battlerAtk] == ABILITY_MINUS) + { + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK)); + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK)); + } + if (hasPartner && (aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_PLUS || aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_MINUS)) + { + ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, STAT_CHANGE_ATK)); + ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, STAT_CHANGE_SPATK)); + } + break; + case EFFECT_MAGNETIC_FLUX: + if (aiData->abilities[battlerAtk] == ABILITY_PLUS || aiData->abilities[battlerAtk] == ABILITY_MINUS) + { + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF)); + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPDEF)); + } + if (hasPartner && (aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_PLUS || aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_MINUS)) + { + ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, STAT_CHANGE_DEF)); + ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, STAT_CHANGE_SPDEF)); + } break; case EFFECT_ATTACK_ACCURACY_UP: // hone claws ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK)); @@ -3999,11 +4319,61 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK)); ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK)); break; + case EFFECT_ROTOTILLER: + if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GRASS) && AI_IsBattlerGrounded(battlerAtk)) + { + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK)); + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK)); + } + if (hasPartner && IS_BATTLER_OF_TYPE(BATTLE_PARTNER(battlerAtk), TYPE_GRASS) && AI_IsBattlerGrounded(BATTLE_PARTNER(battlerAtk))) + { + ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, STAT_CHANGE_ATK)); + ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, STAT_CHANGE_SPATK)); + } + if (IS_BATTLER_OF_TYPE(LEFT_FOE(battlerAtk), TYPE_GRASS) && AI_IsBattlerGrounded(LEFT_FOE(battlerAtk))) + { + if (aiData->abilities[LEFT_FOE(battlerAtk)] == ABILITY_CONTRARY) + ADJUST_SCORE(WEAK_EFFECT); + else + ADJUST_SCORE(AWFUL_EFFECT); + } + if (IS_BATTLER_OF_TYPE(RIGHT_FOE(battlerAtk), TYPE_GRASS) && AI_IsBattlerGrounded(RIGHT_FOE(battlerAtk))) + { + if (aiData->abilities[RIGHT_FOE(battlerAtk)] == ABILITY_CONTRARY) + ADJUST_SCORE(WEAK_EFFECT); + else + ADJUST_SCORE(AWFUL_EFFECT); + } + break; + case EFFECT_FLOWER_SHIELD: + if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GRASS)) + { + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF)); + } + if (hasPartner && IS_BATTLER_OF_TYPE(BATTLE_PARTNER(battlerAtk), TYPE_GRASS)) + { + ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, STAT_CHANGE_DEF)); + } + if (IS_BATTLER_OF_TYPE(LEFT_FOE(battlerAtk), TYPE_GRASS)) + { + if (aiData->abilities[LEFT_FOE(battlerAtk)] == ABILITY_CONTRARY) + ADJUST_SCORE(WEAK_EFFECT); + else + ADJUST_SCORE(AWFUL_EFFECT); + } + if (IS_BATTLER_OF_TYPE(RIGHT_FOE(battlerAtk), TYPE_GRASS)) + { + if (aiData->abilities[RIGHT_FOE(battlerAtk)] == ABILITY_CONTRARY) + ADJUST_SCORE(WEAK_EFFECT); + else + ADJUST_SCORE(AWFUL_EFFECT); + } + break; case EFFECT_HAZE: if (AnyStatIsRaised(BATTLE_PARTNER(battlerAtk)) - || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) break; - score += AI_TryToClearStats(battlerAtk, battlerDef, isDoubleBattle); + score += AI_TryToClearStats(battlerAtk, battlerDef, moveTargetsBothOpponents); break; case EFFECT_ROAR: if ((IsSoundMove(move) && aiData->abilities[battlerDef] == ABILITY_SOUNDPROOF) @@ -4011,7 +4381,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; else if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) break; - score += AI_TryToClearStats(battlerAtk, battlerDef, isDoubleBattle); + score += AI_TryToClearStats(battlerAtk, battlerDef, moveTargetsBothOpponents); break; case EFFECT_MULTI_HIT: case EFFECT_TRIPLE_KICK: @@ -4023,7 +4393,13 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; case EFFECT_CONVERSION: if (!IS_BATTLER_OF_TYPE(battlerAtk, GetMoveType(gBattleMons[battlerAtk].moves[0]))) + { ADJUST_SCORE(WEAK_EFFECT); + if (aiData->abilities[battlerAtk] == ABILITY_ADAPTABILITY) + ADJUST_SCORE(WEAK_EFFECT); + if (IsConsideringZMove(battlerAtk, battlerDef, move)) + ADJUST_SCORE(BEST_EFFECT); + } break; case EFFECT_SWALLOW: if (gDisableStructs[battlerAtk].stockpileCounter == 0) @@ -4048,7 +4424,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; } - if (ShouldRecover(battlerAtk, battlerDef, move, healPercent, AI_DEFENDING)) + if (ShouldRecover(battlerAtk, battlerDef, move, healPercent)) ADJUST_SCORE(DECENT_EFFECT); } break; @@ -4058,7 +4434,13 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_MORNING_SUN: case EFFECT_SYNTHESIS: case EFFECT_MOONLIGHT: - if (ShouldRecover(battlerAtk, battlerDef, move, 50, AI_DEFENDING)) + if (ShouldRecover(battlerAtk, battlerDef, move, 50)) + ADJUST_SCORE(GOOD_EFFECT); + break; + case EFFECT_LIFE_DEW: + if (ShouldRecover(battlerAtk, battlerDef, move, 25)) + ADJUST_SCORE(GOOD_EFFECT); + if (ShouldRecover(BATTLE_PARTNER(battlerAtk), battlerDef, move, 25)) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_LIGHT_SCREEN: @@ -4076,12 +4458,12 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) { break; } - else if (ShouldRecover(battlerAtk, battlerDef, move, 100, AI_DEFENDING)) + else if (ShouldRecover(battlerAtk, battlerDef, move, 100)) { if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_CURE_SLP || aiData->holdEffects[battlerAtk] == HOLD_EFFECT_CURE_STATUS - || HasMoveWithEffect(EFFECT_SLEEP_TALK, battlerAtk) - || HasMoveWithEffect(EFFECT_SNORE, battlerAtk) + || HasMoveWithEffect(battlerAtk, EFFECT_SLEEP_TALK) + || HasMoveWithEffect(battlerAtk, EFFECT_SNORE) || aiData->abilities[battlerAtk] == ABILITY_SHED_SKIN || aiData->abilities[battlerAtk] == ABILITY_EARLY_BIRD || (AI_GetWeather() & B_WEATHER_RAIN && gWishFutureKnock.weatherDuration != 1 && aiData->abilities[battlerAtk] == ABILITY_HYDRATION && aiData->holdEffects[battlerAtk] != HOLD_EFFECT_UTILITY_UMBRELLA)) @@ -4089,9 +4471,10 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case EFFECT_OHKO: + case EFFECT_SHEER_COLD: if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) break; - else if (gStatuses3[battlerAtk] & STATUS3_ALWAYS_HITS) + else if (gBattleMons[battlerAtk].volatiles.lockOn) ADJUST_SCORE(BEST_EFFECT); break; case EFFECT_MEAN_LOOK: @@ -4114,22 +4497,23 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(IncreaseSubstituteMoveScore(battlerAtk, battlerDef, move)); break; case EFFECT_MIMIC: - if (AI_IsFaster(battlerAtk, battlerDef, move)) + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) { - if (gLastMoves[battlerDef] != MOVE_NONE && gLastMoves[battlerDef] != 0xFFFF) - return AI_CheckViability(battlerAtk, battlerDef, gLastMoves[battlerDef], score); + if (aiData->lastUsedMove[battlerDef] != MOVE_NONE + && (GetMoveEffect(aiData->lastUsedMove[battlerDef]) != GetMoveEffect(move))) + return AI_CheckViability(battlerAtk, battlerDef, aiData->lastUsedMove[battlerDef], score); } break; case EFFECT_LEECH_SEED: if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_GRASS) - || gStatuses3[battlerDef] & STATUS3_LEECHSEED + || gBattleMons[battlerDef].volatiles.leechSeed || HasMoveWithEffect(battlerDef, EFFECT_RAPID_SPIN) || aiData->abilities[battlerDef] == ABILITY_LIQUID_OOZE || aiData->abilities[battlerDef] == ABILITY_MAGIC_GUARD) break; ADJUST_SCORE(GOOD_EFFECT); if (!HasDamagingMove(battlerDef) - || (!AI_CanBattlerEscape(battlerDef) && IsBattlerTrapped(battlerAtk, battlerDef)) + || IsBattlerTrapped(battlerAtk, battlerDef) || aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT) ADJUST_SCORE(DECENT_EFFECT); break; @@ -4137,7 +4521,9 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_HOLD_HANDS: case EFFECT_CELEBRATE: case EFFECT_HAPPY_HOUR: - //todo - check z splash, z celebrate, z happy hour (lol) + case EFFECT_LAST_RESORT: + if (IsConsideringZMove(battlerAtk, battlerDef, move)) + ADJUST_SCORE(BEST_EFFECT); break; case EFFECT_TELEPORT: // Either remove or add better logic if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) || !IsOnPlayerSide(battlerAtk)) @@ -4146,7 +4532,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_HIT_ESCAPE: case EFFECT_PARTING_SHOT: case EFFECT_CHILLY_RECEPTION: - if (!IsDoubleBattle()) + if (!hasPartner) { switch (ShouldPivot(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, movesetIndex)) { @@ -4170,8 +4556,11 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case EFFECT_BATON_PASS: - if ((gAiLogicData->shouldSwitch & (1u << battlerAtk)) && (gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE - || (gStatuses3[battlerAtk] & (STATUS3_ROOTED | STATUS3_AQUA_RING | STATUS3_MAGNET_RISE | STATUS3_POWER_TRICK)) + if ((aiData->shouldSwitch & (1u << battlerAtk)) && (gBattleMons[battlerAtk].volatiles.substitute + || gBattleMons[battlerAtk].volatiles.powerTrick + || gBattleMons[battlerAtk].volatiles.magnetRise + || gBattleMons[battlerAtk].volatiles.aquaRing + || gBattleMons[battlerAtk].volatiles.root || AnyStatIsRaised(battlerAtk))) ADJUST_SCORE(BEST_EFFECT); break; @@ -4179,12 +4568,11 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) break; else if (gDisableStructs[battlerDef].disableTimer == 0 - && (gLastMoves[battlerDef] != MOVE_NONE) - && (gLastMoves[battlerDef] != 0xFFFF) + && (aiData->lastUsedMove[battlerDef] != MOVE_NONE) && (B_MENTAL_HERB < GEN_5 || aiData->holdEffects[battlerDef] != HOLD_EFFECT_MENTAL_HERB) - && (AI_IsFaster(battlerAtk, battlerDef, move))) + && (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY))) { - if (CanTargetMoveFaintAi(gLastMoves[battlerDef], battlerDef, battlerAtk, 1)) + if (CanTargetMoveFaintAi(aiData->lastUsedMove[battlerDef], battlerDef, battlerAtk, 1)) ADJUST_SCORE(GOOD_EFFECT); // Disable move that can kill attacker } break; @@ -4193,9 +4581,9 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) break; - bool32 encourage = gBattleMoveEffects[GetMoveEffect(gLastMoves[battlerDef])].encourageEncore; + bool32 encourage = gBattleMoveEffects[GetMoveEffect(aiData->lastUsedMove[battlerDef])].encourageEncore; - switch(GetMoveNonVolatileStatus(gLastMoves[battlerDef])) + switch(GetMoveNonVolatileStatus(aiData->lastUsedMove[battlerDef])) { case MOVE_EFFECT_POISON: case MOVE_EFFECT_PARALYSIS: @@ -4214,15 +4602,15 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(BEST_EFFECT); break; case EFFECT_LOCK_ON: - if (HasMoveWithEffect(battlerAtk, EFFECT_OHKO)) + if (HasMoveWithEffect(battlerAtk, EFFECT_OHKO) || HasMoveWithEffect(battlerAtk, EFFECT_SHEER_COLD)) ADJUST_SCORE(GOOD_EFFECT); - else if (HasMoveWithLowAccuracy(battlerAtk, battlerDef, 85, TRUE, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef])) + else if (HasMoveWithLowAccuracy(battlerAtk, battlerDef, 85, TRUE)) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_DESTINY_BOND: if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) break; - else if (AI_IsFaster(battlerAtk, battlerDef, move) && CanTargetFaintAi(battlerDef, battlerAtk)) + else if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) && CanTargetFaintAi(battlerDef, battlerAtk)) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_SPITE: @@ -4233,10 +4621,19 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) if (ShouldUseWishAromatherapy(battlerAtk, battlerDef, move)) ADJUST_SCORE(DECENT_EFFECT); break; + case EFFECT_PURIFY: + if (gBattleMons[battlerDef].status1 & STATUS1_ANY) + { + if (ShouldCureStatus(battlerAtk, battlerDef, aiData)) + ADJUST_SCORE(GOOD_EFFECT); + if (ShouldRecover(battlerAtk, battlerDef, move, 50)) + RETURN_SCORE_PLUS(WEAK_EFFECT); + } + break; case EFFECT_CURSE: if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GHOST)) { - if (!AI_CanBattlerEscape(battlerDef) && IsBattlerTrapped(battlerAtk, battlerDef)) + if (IsBattlerTrapped(battlerAtk, battlerDef)) ADJUST_SCORE(GOOD_EFFECT); else ADJUST_SCORE(WEAK_EFFECT); @@ -4248,36 +4645,39 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case EFFECT_PROTECT: - if (predictedMove == 0xFFFF) + if (predictedMove == MOVE_UNAVAILABLE) predictedMove = MOVE_NONE; - switch (move) + enum ProtectMethod protectMethod = GetMoveProtectMethod(move); + switch (protectMethod) { - case MOVE_QUICK_GUARD: + case PROTECT_QUICK_GUARD: if (predictedMove != MOVE_NONE && GetMovePriority(predictedMove) > 0) - ProtectChecks(battlerAtk, battlerDef, move, predictedMove, &score); + { + ADJUST_SCORE(ProtectChecks(battlerAtk, battlerDef, move, predictedMove)); + } break; - case MOVE_WIDE_GUARD: + case PROTECT_WIDE_GUARD: if (predictedMove != MOVE_NONE && GetBattlerMoveTargetType(battlerDef, predictedMove) & (MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_BOTH)) { - ProtectChecks(battlerAtk, battlerDef, move, predictedMove, &score); + ADJUST_SCORE(ProtectChecks(battlerAtk, battlerDef, move, predictedMove)); } - else if (isDoubleBattle && GetBattlerMoveTargetType(BATTLE_PARTNER(battlerAtk), aiData->partnerMove) & MOVE_TARGET_FOES_AND_ALLY) + else if (hasPartner && GetBattlerMoveTargetType(BATTLE_PARTNER(battlerAtk), aiData->partnerMove) & MOVE_TARGET_FOES_AND_ALLY) { if (aiData->abilities[battlerAtk] != ABILITY_TELEPATHY) - ProtectChecks(battlerAtk, battlerDef, move, predictedMove, &score); + ADJUST_SCORE(ProtectChecks(battlerAtk, battlerDef, move, predictedMove)); } break; - case MOVE_CRAFTY_SHIELD: + case PROTECT_CRAFTY_SHIELD: if (predictedMove != MOVE_NONE && IsBattleMoveStatus(predictedMove) && !(GetBattlerMoveTargetType(battlerDef, predictedMove) & MOVE_TARGET_USER)) - ProtectChecks(battlerAtk, battlerDef, move, predictedMove, &score); + ADJUST_SCORE(ProtectChecks(battlerAtk, battlerDef, move, predictedMove)); break; - case MOVE_MAT_BLOCK: + case PROTECT_MAT_BLOCK: if (gDisableStructs[battlerAtk].isFirstTurn && predictedMove != MOVE_NONE && !IsBattleMoveStatus(predictedMove) && !(GetBattlerMoveTargetType(battlerDef, predictedMove) & MOVE_TARGET_USER)) - ProtectChecks(battlerAtk, battlerDef, move, predictedMove, &score); + ADJUST_SCORE(ProtectChecks(battlerAtk, battlerDef, move, predictedMove)); break; - case MOVE_KINGS_SHIELD: + case PROTECT_KINGS_SHIELD: if (aiData->abilities[battlerAtk] == ABILITY_STANCE_CHANGE //Special logic for Aegislash && gBattleMons[battlerAtk].species == SPECIES_AEGISLASH_BLADE && !IsBattlerIncapacitated(battlerDef, aiData->abilities[battlerDef])) @@ -4287,7 +4687,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } //fallthrough default: // protect - ProtectChecks(battlerAtk, battlerDef, move, predictedMove, &score); + ADJUST_SCORE(ProtectChecks(battlerAtk, battlerDef, move, predictedMove)); break; } break; @@ -4302,11 +4702,13 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(GOOD_EFFECT); } break; + case EFFECT_CEASELESS_EDGE: case EFFECT_SPIKES: case EFFECT_STEALTH_ROCK: case EFFECT_STICKY_WEB: + case EFFECT_STONE_AXE: case EFFECT_TOXIC_SPIKES: - if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, aiData)) + if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, move, aiData)) { if (gDisableStructs[battlerAtk].isFirstTurn) ADJUST_SCORE(BEST_EFFECT); @@ -4329,13 +4731,16 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_PERISH_SONG: - if (!AI_CanBattlerEscape(battlerDef) && IsBattlerTrapped(battlerAtk, battlerDef)) + if (IsBattlerTrapped(battlerAtk, battlerDef)) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_SANDSTORM: - if (ShouldSetSandstorm(battlerAtk, aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk])) + if (ShouldSetWeather(battlerAtk, B_WEATHER_SANDSTORM)) { ADJUST_SCORE(DECENT_EFFECT); + + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL)) + ADJUST_SCORE(WEAK_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_SMOOTH_ROCK) ADJUST_SCORE(WEAK_EFFECT); if (HasMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) @@ -4345,13 +4750,14 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case EFFECT_HAIL: - if (ShouldSetHail(battlerAtk, aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk])) + if (ShouldSetWeather(battlerAtk, B_WEATHER_HAIL)) { - if ((HasMoveWithEffect(battlerAtk, EFFECT_AURORA_VEIL) || HasMoveWithEffect(BATTLE_PARTNER(battlerAtk), EFFECT_AURORA_VEIL)) - && ShouldSetScreen(battlerAtk, battlerDef, EFFECT_AURORA_VEIL)) - ADJUST_SCORE(GOOD_EFFECT); - ADJUST_SCORE(DECENT_EFFECT); + + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_AURORA_VEIL) && ShouldSetScreen(battlerAtk, battlerDef, EFFECT_AURORA_VEIL)) + ADJUST_SCORE(GOOD_EFFECT); + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL)) + ADJUST_SCORE(WEAK_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_ICY_ROCK) ADJUST_SCORE(WEAK_EFFECT); if (HasMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) @@ -4361,13 +4767,14 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case EFFECT_SNOWSCAPE: - if (ShouldSetSnow(battlerAtk, aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk])) + if (ShouldSetWeather(battlerAtk, B_WEATHER_SNOW)) { - if ((HasMoveWithEffect(battlerAtk, EFFECT_AURORA_VEIL) || HasMoveWithEffect(BATTLE_PARTNER(battlerAtk), EFFECT_AURORA_VEIL)) - && ShouldSetScreen(battlerAtk, battlerDef, EFFECT_AURORA_VEIL)) - ADJUST_SCORE(GOOD_EFFECT); - ADJUST_SCORE(DECENT_EFFECT); + + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_AURORA_VEIL) && ShouldSetScreen(battlerAtk, battlerDef, EFFECT_AURORA_VEIL)) + ADJUST_SCORE(GOOD_EFFECT); + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL)) + ADJUST_SCORE(WEAK_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_ICY_ROCK) ADJUST_SCORE(WEAK_EFFECT); if (HasMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) @@ -4377,27 +4784,33 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case EFFECT_RAIN_DANCE: - if (ShouldSetRain(battlerAtk, aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk])) + if (ShouldSetWeather(battlerAtk, B_WEATHER_RAIN)) { ADJUST_SCORE(DECENT_EFFECT); + + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL)) + ADJUST_SCORE(WEAK_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_DAMP_ROCK) ADJUST_SCORE(WEAK_EFFECT); - if (HasMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) - || HasMoveWithEffect(battlerDef, EFFECT_SYNTHESIS) - || HasMoveWithEffect(battlerDef, EFFECT_SOLAR_BEAM) - || HasMoveWithEffect(battlerDef, EFFECT_MOONLIGHT)) + if (HasBattlerSideMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) + || HasBattlerSideMoveWithEffect(battlerDef, EFFECT_SYNTHESIS) + || HasBattlerSideMoveWithEffect(battlerDef, EFFECT_SOLAR_BEAM) + || HasBattlerSideMoveWithEffect(battlerDef, EFFECT_MOONLIGHT)) ADJUST_SCORE(WEAK_EFFECT); - if (HasMoveWithType(battlerDef, TYPE_FIRE) || HasMoveWithType(BATTLE_PARTNER(battlerDef), TYPE_FIRE)) + if (HasDamagingMoveOfType(battlerDef, TYPE_FIRE) || HasDamagingMoveOfType(BATTLE_PARTNER(battlerDef), TYPE_FIRE)) ADJUST_SCORE(WEAK_EFFECT); } break; case EFFECT_SUNNY_DAY: - if (ShouldSetSun(battlerAtk, aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk])) + if (ShouldSetWeather(battlerAtk, B_WEATHER_SUN)) { ADJUST_SCORE(DECENT_EFFECT); + + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL)) + ADJUST_SCORE(WEAK_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_HEAT_ROCK) ADJUST_SCORE(WEAK_EFFECT); - if (HasMoveWithType(battlerDef, TYPE_WATER) || HasMoveWithType(BATTLE_PARTNER(battlerDef), TYPE_WATER)) + if (HasDamagingMoveOfType(battlerDef, TYPE_WATER) || HasDamagingMoveOfType(BATTLE_PARTNER(battlerDef), TYPE_WATER)) ADJUST_SCORE(WEAK_EFFECT); if (HasMoveWithFlag(battlerDef, MoveHas50AccuracyInSun) || HasMoveWithFlag(BATTLE_PARTNER(battlerDef), MoveHas50AccuracyInSun)) ADJUST_SCORE(WEAK_EFFECT); @@ -4420,25 +4833,25 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) score += AI_ShouldCopyStatChanges(battlerAtk, battlerDef); break; case EFFECT_SEMI_INVULNERABLE: - if (predictedMove != MOVE_NONE && !isDoubleBattle) + if (predictedMove != MOVE_NONE && isBattle1v1) { enum BattleMoveEffects predictedEffect = GetMoveEffect(predictedMove); - if ((AI_IsFaster(battlerAtk, battlerDef, move)) - && (predictedEffect == EFFECT_EXPLOSION || predictedEffect == EFFECT_PROTECT)) + if ((AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) + && (predictedEffect == EFFECT_EXPLOSION + || predictedEffect == EFFECT_MISTY_EXPLOSION + || predictedEffect == EFFECT_PROTECT)) ADJUST_SCORE(GOOD_EFFECT); - else if (predictedEffect == EFFECT_SEMI_INVULNERABLE && !(gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE)) + else if (predictedEffect == EFFECT_SEMI_INVULNERABLE && !IsSemiInvulnerable(battlerDef, CHECK_ALL)) ADJUST_SCORE(GOOD_EFFECT); } break; case EFFECT_DEFENSE_CURL: - if (HasMoveWithEffect(battlerAtk, EFFECT_ROLLOUT) && !(gBattleMons[battlerAtk].status2 & STATUS2_DEFENSE_CURL)) + if (HasMoveWithEffect(battlerAtk, EFFECT_ROLLOUT) && !gBattleMons[battlerAtk].volatiles.defenseCurl) ADJUST_SCORE(DECENT_EFFECT); ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF)); break; case EFFECT_FIRST_TURN_ONLY: - if (ShouldFakeOut(battlerAtk, battlerDef, move) && MoveHasAdditionalEffectWithChance(move, MOVE_EFFECT_FLINCH, 100)) - ADJUST_SCORE(GOOD_EFFECT); - else if (gDisableStructs[battlerAtk].isFirstTurn && GetBestDmgMoveFromBattler(battlerAtk, battlerDef, AI_ATTACKING) == move) + if (gDisableStructs[battlerAtk].isFirstTurn && GetBestDmgMoveFromBattler(battlerAtk, battlerDef, AI_ATTACKING) == move) ADJUST_SCORE(BEST_EFFECT); break; case EFFECT_STOCKPILE: @@ -4450,65 +4863,92 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPDEF)); break; case EFFECT_SWAGGER: + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_FOUL_PLAY) + || HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_PSYCH_UP) + || HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_SPECTRAL_THIEF)) + ADJUST_SCORE(DECENT_EFFECT); + if (aiData->abilities[battlerDef] == ABILITY_CONTRARY) + ADJUST_SCORE(GOOD_EFFECT); + IncreaseConfusionScore(battlerAtk, battlerDef, move, &score); + break; case EFFECT_FLATTER: - if (HasMoveWithEffect(battlerAtk, EFFECT_FOUL_PLAY) - || HasMoveWithEffect(battlerAtk, EFFECT_PSYCH_UP) - || HasMoveWithEffect(battlerAtk, EFFECT_SPECTRAL_THIEF)) + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_PSYCH_UP) + || HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_SPECTRAL_THIEF)) ADJUST_SCORE(DECENT_EFFECT); if (aiData->abilities[battlerDef] == ABILITY_CONTRARY) ADJUST_SCORE(GOOD_EFFECT); IncreaseConfusionScore(battlerAtk, battlerDef, move, &score); break; case EFFECT_FURY_CUTTER: - if (!isDoubleBattle && aiData->holdEffects[battlerAtk] == HOLD_EFFECT_METRONOME) + if (isBattle1v1 && aiData->holdEffects[battlerAtk] == HOLD_EFFECT_METRONOME) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_ATTRACT: - if (!isDoubleBattle - && (AI_IsSlower(battlerAtk, battlerDef, move)) + if (isBattle1v1 + && (AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) && BattlerWillFaintFromSecondaryDamage(battlerDef, aiData->abilities[battlerDef])) break; // Don't use if the attract won't have a change to activate if (gBattleMons[battlerDef].status1 & STATUS1_ANY - || (gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) - || (!AI_CanBattlerEscape(battlerDef) && IsBattlerTrapped(battlerAtk, battlerDef))) + || gBattleMons[battlerDef].volatiles.confusionTurns > 0 + || IsBattlerTrapped(battlerAtk, battlerDef)) ADJUST_SCORE(GOOD_EFFECT); else ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_SAFEGUARD: - if (!IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_MISTY_TERRAIN) || !IsBattlerGrounded(battlerAtk)) + if (!IsBattlerTerrainAffected(battlerAtk, aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk], STATUS_FIELD_MISTY_TERRAIN) || !AI_IsBattlerGrounded(battlerAtk)) ADJUST_SCORE(DECENT_EFFECT); // TODO: check if opp has status move? //if (CountUsablePartyMons(battlerDef) != 0) //ADJUST_SCORE(8); break; + case EFFECT_COURT_CHANGE: + if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_GOOD_COURT) + ADJUST_SCORE(WEAK_EFFECT); + if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_BAD_COURT) + ADJUST_SCORE(WEAK_EFFECT); + + if (AreAnyHazardsOnSide(GetBattlerSide(battlerAtk)) && CountUsablePartyMons(battlerAtk) != 0) + { + ADJUST_SCORE(DECENT_EFFECT); + } + + if (hasPartner) + { + if (IsHazardMove(aiData->partnerMove) // partner is going to set up hazards + && AI_IsFaster(BATTLE_PARTNER(battlerAtk), battlerAtk, aiData->partnerMove, predictedMove, CONSIDER_PRIORITY)) // partner is going to set up before the Court Change + { + ADJUST_SCORE(-10); + break; + } + } + break; case EFFECT_DEFOG: - if ((gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY && CountUsablePartyMons(battlerAtk) != 0) - || (gSideStatuses[GetBattlerSide(battlerDef)] & (SIDE_STATUS_SCREEN_ANY | SIDE_STATUS_SAFEGUARD | SIDE_STATUS_MIST))) + if ((AreAnyHazardsOnSide(GetBattlerSide(battlerAtk)) && CountUsablePartyMons(battlerAtk) != 0) + || (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_GOOD_FOG)) { ADJUST_SCORE(GOOD_EFFECT); } - else if (!(gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SPIKES)) //Don't blow away hazards if you set them up + else if (!AreAnyHazardsOnSide(GetBattlerSide(battlerDef)) || CountUsablePartyMons(battlerDef) == 0) //Don't blow away hazards if you set them up { - if (isDoubleBattle) + if (hasPartner) { if (IsHazardMove(aiData->partnerMove) // Partner is going to set up hazards - && AI_IsSlower(battlerAtk, BATTLE_PARTNER(battlerAtk), move)) // Partner going first + && AI_IsSlower(battlerAtk, BATTLE_PARTNER(battlerAtk), move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Partner going first break; // Don't use Defog if partner is going to set up hazards } - if (ShouldLowerEvasion(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - ADJUST_SCORE(DECENT_EFFECT); + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_EVASION)); } break; case EFFECT_TORMENT: break; case EFFECT_FOLLOW_ME: - if (isDoubleBattle + if (hasPartner && GetMoveTarget(move) == MOVE_TARGET_USER && !IsBattlerIncapacitated(battlerDef, aiData->abilities[battlerDef]) - && (!IsPowderMove(move) || IsAffectedByPowder(battlerDef, aiData->abilities[battlerDef], aiData->holdEffects[battlerDef])) // Rage Powder doesn't affect powder immunities - && IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) + && (!IsPowderMove(move) || IsAffectedByPowderMove(battlerDef, aiData->abilities[battlerDef], aiData->holdEffects[battlerDef]))) + // Rage Powder doesn't affect powder immunities { - u32 predictedMoveOnPartner = gLastMoves[BATTLE_PARTNER(battlerAtk)]; + u32 predictedMoveOnPartner = aiData->lastUsedMove[BATTLE_PARTNER(battlerAtk)]; if (predictedMoveOnPartner != MOVE_NONE && !IsBattleMoveStatus(predictedMoveOnPartner)) ADJUST_SCORE(GOOD_EFFECT); } @@ -4553,7 +4993,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case HOLD_EFFECT_IRON_BALL: - if (!HasMoveWithEffect(battlerDef, EFFECT_FLING) || !IsBattlerGrounded(battlerDef)) + if (!HasMoveWithEffect(battlerDef, EFFECT_FLING) || !AI_IsBattlerGrounded(battlerDef)) ADJUST_SCORE(DECENT_EFFECT); break; case HOLD_EFFECT_LAGGING_TAIL: @@ -4574,13 +5014,15 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) if (AI_GetWeather() & B_WEATHER_SUN) ADJUST_SCORE(DECENT_EFFECT); // Slow 'em down break; + default: + break; } } break; case HOLD_EFFECT_EJECT_BUTTON: //if (!IsRaidBattle() && GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX && gNewBS->dynamaxData.timer[battlerDef] > 1 && if (HasDamagingMove(battlerAtk) - || (isDoubleBattle && IsBattlerAlive(BATTLE_PARTNER(battlerAtk)) && HasDamagingMove(BATTLE_PARTNER(battlerAtk)))) + || (hasPartner && HasDamagingMove(BATTLE_PARTNER(battlerAtk)))) ADJUST_SCORE(DECENT_EFFECT); // Force 'em out next turn break; default: @@ -4634,11 +5076,6 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } } break; - case EFFECT_ROLE_PLAY: - case EFFECT_DOODLE: - if (IsAbilityOfRating(aiData->abilities[battlerDef], 5)) - ADJUST_SCORE(DECENT_EFFECT); - break; case EFFECT_INGRAIN: ADJUST_SCORE(WEAK_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT) @@ -4649,19 +5086,19 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_RECYCLE: - if (GetUsedHeldItem(battlerAtk) != ITEM_NONE) + if (GetBattlerPartyState(battlerAtk)->usedHeldItem != ITEM_NONE) ADJUST_SCORE(WEAK_EFFECT); - if (IsRecycleEncouragedItem(GetUsedHeldItem(battlerAtk))) + if (IsRecycleEncouragedItem(GetBattlerPartyState(battlerAtk)->usedHeldItem)) ADJUST_SCORE(WEAK_EFFECT); if (aiData->abilities[battlerAtk] == ABILITY_RIPEN) { - u32 item = GetUsedHeldItem(battlerAtk); + u32 item = GetBattlerPartyState(battlerAtk)->usedHeldItem; u32 toHeal = (GetItemHoldEffectParam(item) == 10) ? 10 : gBattleMons[battlerAtk].maxHP / GetItemHoldEffectParam(item); if (IsStatBoostingBerry(item) && aiData->hpPercents[battlerAtk] > 60) ADJUST_SCORE(WEAK_EFFECT); else if (ShouldRestoreHpBerry(battlerAtk, item) && !CanAIFaintTarget(battlerAtk, battlerDef, 0) - && ((GetWhichBattlerFasterOrTies(battlerAtk, battlerDef, TRUE) == 1 && CanTargetFaintAiWithMod(battlerDef, battlerAtk, 0, 0)) + && ((AI_GetWhichBattlerFasterOrTies(battlerAtk, battlerDef, TRUE) == 1 && CanTargetFaintAiWithMod(battlerDef, battlerAtk, 0, 0)) || !CanTargetFaintAiWithMod(battlerDef, battlerAtk, toHeal, 0))) ADJUST_SCORE(WEAK_EFFECT); // Recycle healing berry if we can't otherwise faint the target and the target wont kill us after we activate the berry } @@ -4675,29 +5112,14 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_AURORA_VEIL) ADJUST_SCORE(DECENT_EFFECT); break; - case EFFECT_SKILL_SWAP: - if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) - break; - else if (gAbilitiesInfo[aiData->abilities[battlerDef]].aiRating > gAbilitiesInfo[aiData->abilities[battlerAtk]].aiRating) - ADJUST_SCORE(DECENT_EFFECT); - break; - case EFFECT_WORRY_SEED: - case EFFECT_GASTRO_ACID: - case EFFECT_SIMPLE_BEAM: - if (IsAbilityOfRating(aiData->abilities[battlerDef], 5)) - ADJUST_SCORE(DECENT_EFFECT); - break; + case EFFECT_DOODLE: case EFFECT_ENTRAINMENT: - if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) - break; - if (aiData->abilities[battlerDef] != aiData->abilities[battlerAtk] && !(gStatuses3[battlerDef] & STATUS3_GASTRO_ACID)) - { - if (gAbilitiesInfo[aiData->abilities[battlerAtk]].aiRating <= 0) - ADJUST_SCORE(DECENT_EFFECT); - else if (IsAbilityOfRating(aiData->abilities[battlerDef], 5) && gAbilitiesInfo[aiData->abilities[battlerAtk]].aiRating <= 3) - ADJUST_SCORE(WEAK_EFFECT); - } - break; + case EFFECT_GASTRO_ACID: + case EFFECT_ROLE_PLAY: + case EFFECT_SKILL_SWAP: + case EFFECT_OVERWRITE_ABILITY: + AbilityChangeScore(battlerAtk, battlerDef, move, &score, aiData); + return score; case EFFECT_IMPRISON: if (predictedMove != MOVE_NONE && HasMove(battlerAtk, predictedMove)) ADJUST_SCORE(DECENT_EFFECT); @@ -4705,7 +5127,8 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(WEAK_EFFECT); break; case EFFECT_REFRESH: - if (gBattleMons[battlerAtk].status1 & STATUS1_ANY) + if ((gBattleMons[battlerAtk].status1 & STATUS1_CAN_MOVE) + && ShouldCureStatus(battlerAtk, battlerAtk, aiData)) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_TAKE_HEART: @@ -4741,11 +5164,8 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(WEAK_EFFECT); break; case EFFECT_TICKLE: - if (gBattleMons[battlerDef].statStages[STAT_DEF] > 4 && HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL) - && aiData->abilities[battlerDef] != ABILITY_CONTRARY && ShouldLowerDefense(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - ADJUST_SCORE(DECENT_EFFECT); - else if (ShouldLowerAttack(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - ADJUST_SCORE(DECENT_EFFECT); + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_ATK)); + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_DEF)); break; case EFFECT_COSMIC_POWER: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF)); @@ -4804,9 +5224,9 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_POWER_TRICK: - if (!(gStatuses3[battlerAtk] & STATUS3_POWER_TRICK) - && gBattleMons[battlerAtk].defense > gBattleMons[battlerAtk].attack - && HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL)) + if (!gBattleMons[battlerAtk].volatiles.powerTrick + && gBattleMons[battlerAtk].defense > gBattleMons[battlerAtk].attack + && HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL)) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_HEART_SWAP: @@ -4829,45 +5249,122 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_GUARD_SPLIT: - { - u32 newDefense = (gBattleMons[battlerAtk].defense + gBattleMons[battlerDef].defense) / 2; - u32 newSpDef = (gBattleMons[battlerAtk].spDefense + gBattleMons[battlerDef].spDefense) / 2; + { + u32 atkDefense = gBattleMons[battlerAtk].defense; + u32 defDefense = gBattleMons[battlerDef].defense; + u32 atkSpDefense = gBattleMons[battlerAtk].spDefense; + u32 defSpDefense = gBattleMons[battlerDef].spDefense; - if ((newDefense > gBattleMons[battlerAtk].defense && newSpDef >= gBattleMons[battlerAtk].spDefense) - || (newSpDef > gBattleMons[battlerAtk].spDefense && newDefense >= gBattleMons[battlerAtk].defense)) - ADJUST_SCORE(DECENT_EFFECT); - } + // It's actually * 100 and / 2; + u32 newDefense = (atkDefense + defDefense) * 50; + u32 newSpDefense = (atkSpDefense + defSpDefense) * 50; + + // We want to massively raise our defense. + if (newDefense > atkDefense * GUARD_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + if (newSpDefense > atkSpDefense * GUARD_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + + // We also want to massively lower theirs. + if (newDefense < defDefense * GUARD_SPLIT_ENEMY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + if (newSpDefense < defSpDefense * GUARD_SPLIT_ENEMY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + + ADJUST_SCORE(WORST_EFFECT); break; + } case EFFECT_POWER_SPLIT: + { + u32 atkAttack = gBattleMons[battlerAtk].attack; + u32 defAttack = gBattleMons[battlerDef].attack; + u32 atkSpAttack = gBattleMons[battlerAtk].spAttack; + u32 defSpAttack = gBattleMons[battlerDef].spAttack; + + // It's actually * 100 and / 2 + u32 newAttack = (atkAttack + defAttack) * 50; + u32 newSpAtk = (atkSpAttack + defSpAttack) * 50; + + if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL) && newAttack > atkAttack * POWER_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL) && newSpAtk > atkSpAttack * POWER_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + if (newAttack < defAttack * POWER_SPLIT_ENEMY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + if (newSpAtk < defSpAttack * POWER_SPLIT_ENEMY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + + ADJUST_SCORE(WORST_EFFECT); + break; + } + case EFFECT_ELECTRIC_TERRAIN: + if (ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_ELECTRIC_TERRAIN)) { - u32 newAttack = (gBattleMons[battlerAtk].attack + gBattleMons[battlerDef].attack) / 2; - u32 newSpAtk = (gBattleMons[battlerAtk].spAttack + gBattleMons[battlerDef].spAttack) / 2; - - if ((newAttack > gBattleMons[battlerAtk].attack && newSpAtk >= gBattleMons[battlerAtk].spAttack) - || (newSpAtk > gBattleMons[battlerAtk].spAttack && newAttack >= gBattleMons[battlerAtk].attack)) - ADJUST_SCORE(DECENT_EFFECT); + ADJUST_SCORE(GOOD_EFFECT); + if (gBattleMons[battlerAtk].volatiles.yawn && AI_IsBattlerGrounded(battlerAtk)) + ADJUST_SCORE(BEST_EFFECT); + if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_TERRAIN_EXTENDER || HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_TERRAIN_PULSE)) + ADJUST_SCORE(WEAK_EFFECT); } break; - case EFFECT_ELECTRIC_TERRAIN: case EFFECT_MISTY_TERRAIN: - if (gStatuses3[battlerAtk] & STATUS3_YAWN && IsBattlerGrounded(battlerAtk)) - ADJUST_SCORE(BEST_EFFECT); + if (ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_MISTY_TERRAIN)) + { + ADJUST_SCORE(GOOD_EFFECT); + if (gBattleMons[battlerAtk].volatiles.yawn && AI_IsBattlerGrounded(battlerAtk)) + ADJUST_SCORE(BEST_EFFECT); + if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_TERRAIN_EXTENDER || HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_TERRAIN_PULSE)) + ADJUST_SCORE(WEAK_EFFECT); + } + break; case EFFECT_GRASSY_TERRAIN: + if (ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_GRASSY_TERRAIN)) + { + ADJUST_SCORE(GOOD_EFFECT); + if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_TERRAIN_EXTENDER || HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_TERRAIN_PULSE)) + ADJUST_SCORE(WEAK_EFFECT); + } + break; case EFFECT_PSYCHIC_TERRAIN: - ADJUST_SCORE(GOOD_EFFECT); - if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_TERRAIN_EXTENDER) + if (ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_PSYCHIC_TERRAIN)) + { ADJUST_SCORE(GOOD_EFFECT); + if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_TERRAIN_EXTENDER || HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_TERRAIN_PULSE)) + ADJUST_SCORE(WEAK_EFFECT); + } + break; + case EFFECT_STEEL_ROLLER: + { + u32 terrain = gFieldStatuses & STATUS_FIELD_TERRAIN_ANY; + if (ShouldClearFieldStatus(battlerAtk, terrain)) + ADJUST_SCORE(GOOD_EFFECT); + if (ShouldSetFieldStatus(battlerDef, terrain)) + ADJUST_SCORE(DECENT_EFFECT); + } + break; + case EFFECT_ICE_SPINNER: + { + u32 terrain = gFieldStatuses & STATUS_FIELD_TERRAIN_ANY; + if (ShouldClearFieldStatus(battlerAtk, terrain)) + ADJUST_SCORE(GOOD_EFFECT); + if (ShouldSetFieldStatus(battlerDef, terrain)) + ADJUST_SCORE(DECENT_EFFECT); + } break; case EFFECT_PLEDGE: - if (isDoubleBattle && HasMoveWithEffect(BATTLE_PARTNER(battlerAtk), EFFECT_PLEDGE)) + if (hasPartner && HasMoveWithEffect(BATTLE_PARTNER(battlerAtk), EFFECT_PLEDGE)) ADJUST_SCORE(GOOD_EFFECT); // Partner might use pledge move break; case EFFECT_TRICK_ROOM: if (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_POWERFUL_STATUS)) { - if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && GetBattlerSideSpeedAverage(battlerAtk) < GetBattlerSideSpeedAverage(battlerDef)) + if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM)) ADJUST_SCORE(GOOD_EFFECT); - else if ((gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && GetBattlerSideSpeedAverage(battlerAtk) >= GetBattlerSideSpeedAverage(battlerDef)) + // Set it for next pokemon in singles. + else if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && !hasPartner && (CountUsablePartyMons(battlerAtk) != 0)) + ADJUST_SCORE(DECENT_EFFECT); + // Don't unset it on last turn. + else if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer > 1 && ShouldClearFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM)) ADJUST_SCORE(GOOD_EFFECT); } break; @@ -4875,7 +5372,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(WEAK_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_NONE && aiData->holdEffects[battlerDef] != HOLD_EFFECT_NONE) ADJUST_SCORE(WEAK_EFFECT); - if (isDoubleBattle && aiData->holdEffects[BATTLE_PARTNER(battlerAtk)] == HOLD_EFFECT_NONE && aiData->holdEffects[BATTLE_PARTNER(battlerDef)] != HOLD_EFFECT_NONE) + if (!isBattle1v1 && aiData->holdEffects[BATTLE_PARTNER(battlerAtk)] == HOLD_EFFECT_NONE && aiData->holdEffects[BATTLE_PARTNER(battlerDef)] != HOLD_EFFECT_NONE) ADJUST_SCORE(WEAK_EFFECT); break; case EFFECT_WONDER_ROOM: @@ -4884,18 +5381,23 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_GRAVITY: - if (!(gFieldStatuses & STATUS_FIELD_GRAVITY)) + if (!(gFieldStatuses & STATUS_FIELD_GRAVITY || ShouldClearFieldStatus(battlerAtk, STATUS_FIELD_GRAVITY))) { - if (HasSleepMoveWithLowAccuracy(battlerAtk, battlerDef)) // Has Gravity for a move like Hypnosis + // improve accuracy of Hypnosis + if (HasSleepMoveWithLowAccuracy(battlerAtk, battlerDef) + || HasSleepMoveWithLowAccuracy(BATTLE_PARTNER(battlerAtk), battlerDef)) IncreaseSleepScore(battlerAtk, battlerDef, move, &score); - if (HasMoveWithLowAccuracy(battlerAtk, battlerDef, 90, FALSE, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef])) + if (HasMoveWithLowAccuracy(battlerAtk, battlerDef, 90, TRUE) + || HasMoveWithLowAccuracy(BATTLE_PARTNER(battlerAtk), battlerDef, 90, TRUE)) + ADJUST_SCORE(WEAK_EFFECT); + if (ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_GRAVITY)) ADJUST_SCORE(DECENT_EFFECT); } break; case EFFECT_ION_DELUGE: if ((aiData->abilities[battlerAtk] == ABILITY_VOLT_ABSORB || aiData->abilities[battlerAtk] == ABILITY_MOTOR_DRIVE - || (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5 && aiData->abilities[battlerAtk] == ABILITY_LIGHTNING_ROD)) + || (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) >= GEN_5 && aiData->abilities[battlerAtk] == ABILITY_LIGHTNING_ROD)) && predictedType == TYPE_NORMAL) ADJUST_SCORE(DECENT_EFFECT); break; @@ -4931,19 +5433,20 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_TELEKINESIS: - if (HasMoveWithLowAccuracy(battlerAtk, battlerDef, 90, FALSE, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef]) - || !IsBattlerGrounded(battlerDef)) + if (HasMoveWithLowAccuracy(battlerAtk, battlerDef, 90, FALSE) || !AI_IsBattlerGrounded(battlerDef)) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_HEAL_BLOCK: - if (AI_IsFaster(battlerAtk, battlerDef, move) && predictedMove != MOVE_NONE && IsHealingMove(predictedMove)) + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) && predictedMove != MOVE_NONE && IsHealingMove(predictedMove)) ADJUST_SCORE(DECENT_EFFECT); // Try to cancel healing move else if (HasHealingEffect(battlerDef) || aiData->holdEffects[battlerDef] == HOLD_EFFECT_LEFTOVERS || (aiData->holdEffects[battlerDef] == HOLD_EFFECT_BLACK_SLUDGE && IS_BATTLER_OF_TYPE(battlerDef, TYPE_POISON))) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_SOAK: - if (HasMoveWithType(battlerAtk, TYPE_ELECTRIC) || HasMoveWithType(battlerAtk, TYPE_GRASS) || (HasMoveWithEffect(battlerAtk, EFFECT_SUPER_EFFECTIVE_ON_ARG) && GetMoveArgType(move) == TYPE_WATER) ) + if (HasMoveWithType(battlerAtk, TYPE_ELECTRIC) || HasMoveWithType(battlerAtk, TYPE_GRASS) + || HasMoveWithType(BATTLE_PARTNER(battlerAtk), TYPE_ELECTRIC) || HasMoveWithType(BATTLE_PARTNER(battlerAtk), TYPE_GRASS) + || (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_SUPER_EFFECTIVE_ON_ARG) && GetMoveArgType(move) == TYPE_WATER) ) ADJUST_SCORE(DECENT_EFFECT); // Get some super effective moves break; case EFFECT_THIRD_TYPE: @@ -4954,7 +5457,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) if (predictedMove != MOVE_NONE && (aiData->abilities[battlerAtk] == ABILITY_VOLT_ABSORB || aiData->abilities[battlerAtk] == ABILITY_MOTOR_DRIVE - || (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5 && aiData->abilities[battlerAtk] == ABILITY_LIGHTNING_ROD))) + || (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) >= GEN_5 && aiData->abilities[battlerAtk] == ABILITY_LIGHTNING_ROD))) { ADJUST_SCORE(DECENT_EFFECT); } @@ -4968,22 +5471,58 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(BEST_EFFECT); break; case EFFECT_QUASH: - if (isDoubleBattle && AI_IsSlower(BATTLE_PARTNER(battlerAtk), battlerDef, aiData->partnerMove)) + if (hasPartner && AI_IsSlower(BATTLE_PARTNER(battlerAtk), battlerDef, aiData->partnerMove, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) ADJUST_SCORE(DECENT_EFFECT); // Attacker partner wouldn't go before target break; case EFFECT_TAILWIND: - if (GetBattlerSideSpeedAverage(battlerAtk) < GetBattlerSideSpeedAverage(battlerDef)) - ADJUST_SCORE(GOOD_EFFECT); + { + if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer > 1) + break; + + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_ELECTRO_BALL)) + ADJUST_SCORE(WEAK_EFFECT); + + if (isBattle1v1) + { + if (aiData->speedStats[battlerAtk] * 2 > aiData->speedStats[battlerDef]) + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPEED)); + + if (CountUsablePartyMons(battlerAtk) != 0) + ADJUST_SCORE(WEAK_EFFECT); + } + else + { + u32 tailwindScore = 0; + u32 speed = aiData->speedStats[battlerAtk]; + u32 partnerSpeed = aiData->speedStats[BATTLE_PARTNER(battlerAtk)]; + u32 foe1Speed = aiData->speedStats[LEFT_FOE(battlerAtk)]; + u32 foe2Speed = aiData->speedStats[RIGHT_FOE(battlerAtk)]; + + if (speed <= foe1Speed && (speed * 2) > foe1Speed) + tailwindScore += 1; + if (speed <= foe2Speed && (speed * 2) > foe2Speed) + tailwindScore += 1; + if (partnerSpeed <= foe1Speed && (speed * 2) > foe1Speed) + tailwindScore += 1; + if (partnerSpeed <= foe1Speed && (speed * 2) > foe1Speed) + tailwindScore += 1; + + if (tailwindScore > 0) + tailwindScore += 1; + + ADJUST_SCORE(tailwindScore); + } break; + } case EFFECT_LUCKY_CHANT: - if (!isDoubleBattle && CountUsablePartyMons(battlerDef) > 0) + if (isBattle1v1 && CountUsablePartyMons(battlerDef) > 0) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_MAGNET_RISE: - if (IsBattlerGrounded(battlerAtk) && HasDamagingMoveOfType(battlerDef, TYPE_ELECTRIC) + if (AI_IsBattlerGrounded(battlerAtk) && HasDamagingMoveOfType(battlerDef, TYPE_ELECTRIC) && !(effectiveness == UQ_4_12(0.0))) // Doesn't resist ground move { - if (AI_IsFaster(battlerAtk, battlerDef, move)) // Attacker goes first + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Attacker goes first { if (predictedType == TYPE_GROUND) ADJUST_SCORE(GOOD_EFFECT); // Cause the enemy's move to fail @@ -4998,7 +5537,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case EFFECT_CAMOUFLAGE: - if (predictedMove != MOVE_NONE && AI_IsFaster(battlerAtk, battlerDef, move) // Attacker goes first + if (predictedMove != MOVE_NONE && AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) // Attacker goes first && !IsBattleMoveStatus(move) && effectiveness != UQ_4_12(0.0)) ADJUST_SCORE(DECENT_EFFECT); break; @@ -5019,22 +5558,22 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_SHORE_UP: - if ((AI_GetWeather() & B_WEATHER_SANDSTORM) && ShouldRecover(battlerAtk, battlerDef, move, 67, AI_DEFENDING)) + if ((AI_GetWeather() & B_WEATHER_SANDSTORM) && ShouldRecover(battlerAtk, battlerDef, move, 67)) ADJUST_SCORE(DECENT_EFFECT); - else if (ShouldRecover(battlerAtk, battlerDef, move, 50, AI_DEFENDING)) + else if (ShouldRecover(battlerAtk, battlerDef, move, 50)) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_ENDEAVOR: - if (AI_IsSlower(battlerAtk, battlerDef, move) && !CanTargetFaintAi(battlerDef, battlerAtk)) + if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) && !CanTargetFaintAi(battlerDef, battlerAtk)) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_REVIVAL_BLESSING: if (GetFirstFaintedPartyIndex(battlerAtk) != PARTY_SIZE) { ADJUST_SCORE(DECENT_EFFECT); - if (gAiLogicData->shouldSwitch & (1u << battlerAtk)) // Bad matchup + if (aiData->shouldSwitch & (1u << battlerAtk)) // Bad matchup ADJUST_SCORE(WEAK_EFFECT); - if (gAiLogicData->mostSuitableMonId[battlerAtk] != PARTY_SIZE) // Good mon to send in after + if (aiData->mostSuitableMonId[battlerAtk] != PARTY_SIZE) // Good mon to send in after ADJUST_SCORE(WEAK_EFFECT); } break; @@ -5047,21 +5586,27 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) //case EFFECT_SKY_DROP //break; case EFFECT_JUNGLE_HEALING: - if (ShouldRecover(battlerAtk, battlerDef, move, 25, AI_DEFENDING) - || ShouldRecover(BATTLE_PARTNER(battlerAtk), battlerDef, move, 25, AI_DEFENDING) - || gBattleMons[battlerAtk].status1 & STATUS1_ANY - || gBattleMons[BATTLE_PARTNER(battlerAtk)].status1 & STATUS1_ANY) + { + bool32 canCureSelf = (gBattleMons[battlerAtk].status1 & STATUS1_ANY) && ShouldCureStatus(battlerAtk, battlerAtk, aiData); + bool32 canCurePartner = (gBattleMons[BATTLE_PARTNER(battlerAtk)].status1 & STATUS1_ANY) && ShouldCureStatus(battlerAtk, BATTLE_PARTNER(battlerAtk), aiData); + + if (ShouldRecover(battlerAtk, battlerDef, move, 25) + || ShouldRecover(BATTLE_PARTNER(battlerAtk), battlerDef, move, 25) + || canCureSelf + || canCurePartner) ADJUST_SCORE(GOOD_EFFECT); break; + } case EFFECT_RAPID_SPIN: - if ((gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY && CountUsablePartyMons(battlerAtk) != 0) - || (gStatuses3[battlerAtk] & STATUS3_LEECHSEED || gBattleMons[battlerAtk].status2 & STATUS2_WRAPPED)) + if ((AreAnyHazardsOnSide(GetBattlerSide(battlerAtk)) && CountUsablePartyMons(battlerAtk) != 0) + || (gBattleMons[battlerAtk].volatiles.leechSeed || gBattleMons[battlerAtk].volatiles.wrapped)) ADJUST_SCORE(GOOD_EFFECT); + break; case EFFECT_SPECTRAL_THIEF: ADJUST_SCORE(AI_ShouldCopyStatChanges(battlerAtk, battlerDef)); break; case EFFECT_SMACK_DOWN: - if (!IsBattlerGrounded(battlerDef) && HasDamagingMoveOfType(battlerAtk, TYPE_GROUND) && !CanTargetFaintAi(battlerDef, battlerAtk)) + if (!AI_IsBattlerGrounded(battlerDef) && HasDamagingMoveOfType(battlerAtk, TYPE_GROUND) && !CanTargetFaintAi(battlerDef, battlerAtk)) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_KNOCK_OFF: @@ -5082,15 +5627,84 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } } break; + case EFFECT_STEAL_ITEM: + { + bool32 canSteal = FALSE; + + if (B_TRAINERS_KNOCK_OFF_ITEMS == TRUE) + canSteal = TRUE; + + if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER || IsOnPlayerSide(battlerAtk)) + canSteal = TRUE; + + if (canSteal && aiData->items[battlerAtk] == ITEM_NONE + && aiData->items[battlerDef] != ITEM_NONE + && CanBattlerGetOrLoseItem(battlerDef, aiData->items[battlerDef]) + && CanBattlerGetOrLoseItem(battlerAtk, aiData->items[battlerDef]) + && !HasMoveWithEffect(battlerAtk, EFFECT_ACROBATICS) + && aiData->abilities[battlerDef] != ABILITY_STICKY_HOLD) + { + switch (aiData->holdEffects[battlerDef]) + { + case HOLD_EFFECT_NONE: + break; + case HOLD_EFFECT_CHOICE_BAND: + case HOLD_EFFECT_CHOICE_SCARF: + case HOLD_EFFECT_CHOICE_SPECS: + ADJUST_SCORE(DECENT_EFFECT); + break; + case HOLD_EFFECT_TOXIC_ORB: + if (ShouldPoison(battlerAtk, battlerAtk)) + ADJUST_SCORE(DECENT_EFFECT); + break; + case HOLD_EFFECT_FLAME_ORB: + if (ShouldBurn(battlerAtk, battlerAtk, aiData->abilities[battlerAtk])) + ADJUST_SCORE(DECENT_EFFECT); + break; + case HOLD_EFFECT_BLACK_SLUDGE: + if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON)) + ADJUST_SCORE(DECENT_EFFECT); + break; + case HOLD_EFFECT_IRON_BALL: + if (HasMoveWithEffect(battlerAtk, EFFECT_FLING)) + ADJUST_SCORE(DECENT_EFFECT); + break; + case HOLD_EFFECT_LAGGING_TAIL: + case HOLD_EFFECT_STICKY_BARB: + break; + default: + ADJUST_SCORE(WEAK_EFFECT); + break; + } + } + break; + } + break; default: break; } // move effect checks + return score; +} + +static s32 AI_CalcAdditionalEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData) +{ + // move data + s32 score = 0; + + u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, aiData); + bool32 hasPartner = HasPartner(battlerAtk); + u32 i; u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); + + if (IsSheerForceAffected(move, aiData->abilities[battlerAtk])) + return score; + // check move additional effects that are likely to happen for (i = 0; i < additionalEffectCount; i++) { const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + // Only consider effects with a guaranteed chance to happen if (!MoveEffectIsGuaranteed(battlerAtk, aiData->abilities[battlerAtk], additionalEffect)) continue; @@ -5128,6 +5742,8 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case MOVE_EFFECT_EVS_PLUS_2: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_EVASION)); break; + default: + break; } } else @@ -5171,152 +5787,233 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(IncreaseStatUpScoreContrary(battlerAtk, battlerDef, STAT_CHANGE_SPEED)); ADJUST_SCORE(IncreaseStatUpScoreContrary(battlerAtk, battlerDef, STAT_CHANGE_SPDEF)); break; + default: + break; } } } else // consider move effects that hinder the target { + if (IsAdditionalEffectBlocked(battlerAtk, aiData->abilities[battlerAtk], battlerDef, aiData->abilities[battlerDef])) + continue; + switch (additionalEffect->moveEffect) { - case MOVE_EFFECT_FLINCH: - score += ShouldTryToFlinch(battlerAtk, battlerDef, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], move); - break; - case MOVE_EFFECT_SPD_MINUS_1: - case MOVE_EFFECT_SPD_MINUS_2: - if (!ShouldLowerSpeed(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - break; - case MOVE_EFFECT_ATK_MINUS_1: - case MOVE_EFFECT_DEF_MINUS_1: - case MOVE_EFFECT_SP_ATK_MINUS_1: - case MOVE_EFFECT_SP_DEF_MINUS_1: - case MOVE_EFFECT_ACC_MINUS_1: - case MOVE_EFFECT_EVS_MINUS_1: - if (aiData->abilities[battlerDef] != ABILITY_CONTRARY) - ADJUST_SCORE(DECENT_EFFECT); - break; - case MOVE_EFFECT_ATK_MINUS_2: - case MOVE_EFFECT_DEF_MINUS_2: - case MOVE_EFFECT_SP_ATK_MINUS_2: - case MOVE_EFFECT_SP_DEF_MINUS_2: - case MOVE_EFFECT_ACC_MINUS_2: - case MOVE_EFFECT_EVS_MINUS_2: - if (aiData->abilities[battlerDef] != ABILITY_CONTRARY) - ADJUST_SCORE(DECENT_EFFECT); - break; - case MOVE_EFFECT_POISON: - IncreasePoisonScore(battlerAtk, battlerDef, move, &score); + case MOVE_EFFECT_FLINCH: + score += ShouldTryToFlinch(battlerAtk, battlerDef, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], move); + break; + case MOVE_EFFECT_SPD_MINUS_1: + case MOVE_EFFECT_SPD_MINUS_2: + if (CanLowerStat(battlerAtk, battlerDef, aiData, STAT_SPEED)) + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_SPEED)); + break; + case MOVE_EFFECT_ACC_MINUS_1: + case MOVE_EFFECT_ACC_MINUS_2: + if (CanLowerStat(battlerAtk, battlerDef, aiData, STAT_ACC)) + { + u32 scoreIncrease = IncreaseStatDownScore(battlerAtk, battlerDef, STAT_ACC); + if (scoreIncrease == WEAK_EFFECT) + scoreIncrease = DECENT_EFFECT; + ADJUST_SCORE(scoreIncrease); + } + break; + case MOVE_EFFECT_ATK_MINUS_1: + case MOVE_EFFECT_DEF_MINUS_1: + case MOVE_EFFECT_SP_ATK_MINUS_1: + case MOVE_EFFECT_SP_DEF_MINUS_1: + case MOVE_EFFECT_EVS_MINUS_1: + { + u32 statId = STAT_ATK + additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_1; + if (CanLowerStat(battlerAtk, battlerDef, aiData, statId)) + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, statId)); + break; + } + case MOVE_EFFECT_ATK_MINUS_2: + case MOVE_EFFECT_DEF_MINUS_2: + case MOVE_EFFECT_SP_ATK_MINUS_2: + case MOVE_EFFECT_SP_DEF_MINUS_2: + case MOVE_EFFECT_EVS_MINUS_2: + { + u32 statId = STAT_ATK + additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_2; + if (CanLowerStat(battlerAtk, battlerDef, aiData, statId)) + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, statId)); + break; + } + case MOVE_EFFECT_RAISE_TEAM_ATTACK: + case MOVE_EFFECT_RAISE_TEAM_DEFENSE: + case MOVE_EFFECT_RAISE_TEAM_SPEED: + case MOVE_EFFECT_RAISE_TEAM_SP_ATK: + case MOVE_EFFECT_RAISE_TEAM_SP_DEF: + { + enum StatChange StageStatId = STAT_CHANGE_ATK + additionalEffect->moveEffect - MOVE_EFFECT_RAISE_TEAM_ATTACK; + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, StageStatId)); + if (hasPartner) + ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, StageStatId)); + break; + } + case MOVE_EFFECT_LOWER_ATTACK_SIDE: + case MOVE_EFFECT_LOWER_DEFENSE_SIDE: + case MOVE_EFFECT_LOWER_SPEED_SIDE: + case MOVE_EFFECT_LOWER_SP_ATK_SIDE: + case MOVE_EFFECT_LOWER_SP_DEF_SIDE: + { + u32 statId = STAT_ATK + additionalEffect->moveEffect - MOVE_EFFECT_LOWER_ATTACK_SIDE; + if (CanLowerStat(battlerAtk, battlerDef, aiData, statId)) + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, statId)); + break; + } + case MOVE_EFFECT_POISON: + IncreasePoisonScore(battlerAtk, battlerDef, move, &score); + break; + case MOVE_EFFECT_CLEAR_SMOG: + { + bool32 moveTargetsBothOpponents = HasTwoOpponents(battlerAtk) && (gMovesInfo[move].target & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_ALL_BATTLERS)); + + score += AI_TryToClearStats(battlerAtk, battlerDef, moveTargetsBothOpponents); + break; + } + case MOVE_EFFECT_BUG_BITE: // And pluck + if (gBattleMons[battlerDef].volatiles.substitute || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) break; - case MOVE_EFFECT_CLEAR_SMOG: - score += AI_TryToClearStats(battlerAtk, battlerDef, FALSE); + else if (GetItemPocket(aiData->items[battlerDef]) == POCKET_BERRIES) + ADJUST_SCORE(DECENT_EFFECT); + break; + case MOVE_EFFECT_INCINERATE: + if (gBattleMons[battlerDef].volatiles.substitute || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) break; - case MOVE_EFFECT_BUG_BITE: // And pluck - if (gBattleMons[battlerDef].status2 & STATUS2_SUBSTITUTE || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) - break; - else if (GetItemPocket(aiData->items[battlerDef]) == POCKET_BERRIES) + else if (GetItemPocket(aiData->items[battlerDef]) == POCKET_BERRIES || aiData->holdEffects[battlerDef] == HOLD_EFFECT_GEMS) + ADJUST_SCORE(DECENT_EFFECT); + break; + case MOVE_EFFECT_STEALTH_ROCK: + if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, move, aiData)) + { + if (gDisableStructs[battlerAtk].isFirstTurn) + ADJUST_SCORE(BEST_EFFECT); + else ADJUST_SCORE(DECENT_EFFECT); - break; - case MOVE_EFFECT_INCINERATE: - if (gBattleMons[battlerDef].status2 & STATUS2_SUBSTITUTE || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) - break; - else if (GetItemPocket(aiData->items[battlerDef]) == POCKET_BERRIES || aiData->holdEffects[battlerDef] == HOLD_EFFECT_GEMS) + } + break; + case MOVE_EFFECT_FEINT: + if (GetMoveEffect(predictedMove) == EFFECT_PROTECT) + ADJUST_SCORE(GOOD_EFFECT); + break; + case MOVE_EFFECT_THROAT_CHOP: + if (IsSoundMove(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING))) + { + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, aiData); + + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) + ADJUST_SCORE(GOOD_EFFECT); + else ADJUST_SCORE(DECENT_EFFECT); + } + break; + case MOVE_EFFECT_WRAP: + if (!HasMoveWithEffect(battlerDef, EFFECT_RAPID_SPIN) && ShouldTrap(battlerAtk, battlerDef, move)) + ADJUST_SCORE(BEST_EFFECT); + break; + case MOVE_EFFECT_SALT_CURE: + if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_WATER) || IS_BATTLER_OF_TYPE(battlerDef, TYPE_STEEL)) + ADJUST_SCORE(DECENT_EFFECT); + break; + case MOVE_EFFECT_SUN: + if (ShouldSetWeather(battlerAtk, B_WEATHER_SUN)) + ADJUST_SCORE(DECENT_EFFECT); + if (ShouldClearWeather(battlerAtk, B_WEATHER_SUN)) + ADJUST_SCORE(BAD_EFFECT); + break; + case MOVE_EFFECT_RAIN: + if (ShouldSetWeather(battlerAtk, B_WEATHER_RAIN)) + ADJUST_SCORE(DECENT_EFFECT); + if (ShouldClearWeather(battlerAtk, B_WEATHER_RAIN)) + ADJUST_SCORE(BAD_EFFECT); + break; + case MOVE_EFFECT_SANDSTORM: + if (ShouldSetWeather(battlerAtk, B_WEATHER_SANDSTORM)) + ADJUST_SCORE(DECENT_EFFECT); + if (ShouldClearWeather(battlerAtk, B_WEATHER_SANDSTORM)) + ADJUST_SCORE(BAD_EFFECT); + break; + case MOVE_EFFECT_HAIL: + if (ShouldSetWeather(battlerAtk, B_WEATHER_HAIL)) + ADJUST_SCORE(DECENT_EFFECT); + if (ShouldClearWeather(battlerAtk, B_WEATHER_HAIL)) + ADJUST_SCORE(BAD_EFFECT); + break; + case MOVE_EFFECT_MISTY_TERRAIN: + if (ShouldClearFieldStatus(battlerAtk, STATUS_FIELD_MISTY_TERRAIN)) + { + ADJUST_SCORE(BAD_EFFECT); break; - case MOVE_EFFECT_STEAL_ITEM: - { - bool32 canSteal = FALSE; - - if (B_TRAINERS_KNOCK_OFF_ITEMS == TRUE) - canSteal = TRUE; - if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER || IsOnPlayerSide(battlerAtk)) - canSteal = TRUE; - - if (canSteal && aiData->items[battlerAtk] == ITEM_NONE - && aiData->items[battlerDef] != ITEM_NONE - && CanBattlerGetOrLoseItem(battlerDef, aiData->items[battlerDef]) - && CanBattlerGetOrLoseItem(battlerAtk, aiData->items[battlerDef]) - && !HasMoveWithEffect(battlerAtk, EFFECT_ACROBATICS) - && aiData->abilities[battlerDef] != ABILITY_STICKY_HOLD) - { - switch (aiData->holdEffects[battlerDef]) - { - case HOLD_EFFECT_NONE: - break; - case HOLD_EFFECT_CHOICE_BAND: - case HOLD_EFFECT_CHOICE_SCARF: - case HOLD_EFFECT_CHOICE_SPECS: - ADJUST_SCORE(DECENT_EFFECT); - break; - case HOLD_EFFECT_TOXIC_ORB: - if (ShouldPoison(battlerAtk, battlerAtk)) - ADJUST_SCORE(DECENT_EFFECT); - break; - case HOLD_EFFECT_FLAME_ORB: - if (ShouldBurn(battlerAtk, battlerAtk, aiData->abilities[battlerAtk])) - ADJUST_SCORE(DECENT_EFFECT); - break; - case HOLD_EFFECT_BLACK_SLUDGE: - if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON)) - ADJUST_SCORE(DECENT_EFFECT); - break; - case HOLD_EFFECT_IRON_BALL: - if (HasMoveWithEffect(battlerAtk, EFFECT_FLING)) - ADJUST_SCORE(DECENT_EFFECT); - break; - case HOLD_EFFECT_LAGGING_TAIL: - case HOLD_EFFECT_STICKY_BARB: - break; - default: - ADJUST_SCORE(WEAK_EFFECT); - break; - } - } - break; - } - break; - case MOVE_EFFECT_STEALTH_ROCK: - case MOVE_EFFECT_SPIKES: - if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, aiData)); - { - if (gDisableStructs[battlerAtk].isFirstTurn) - ADJUST_SCORE(BEST_EFFECT); - else - ADJUST_SCORE(DECENT_EFFECT); - } - break; - case MOVE_EFFECT_FEINT: - if (GetMoveEffect(predictedMove) == EFFECT_PROTECT) - ADJUST_SCORE(GOOD_EFFECT); + } + if (ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_MISTY_TERRAIN) + || ShouldClearFieldStatus(battlerAtk, gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) + ADJUST_SCORE(DECENT_EFFECT); + break; + case MOVE_EFFECT_GRASSY_TERRAIN: + if (ShouldClearFieldStatus(battlerAtk, STATUS_FIELD_GRASSY_TERRAIN)) + { + ADJUST_SCORE(BAD_EFFECT); break; - case MOVE_EFFECT_THROAT_CHOP: - if (IsSoundMove(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING))) - { - if (AI_IsFaster(battlerAtk, battlerDef, move)) - ADJUST_SCORE(GOOD_EFFECT); - else - ADJUST_SCORE(DECENT_EFFECT); - } + } + if (ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_GRASSY_TERRAIN) + || ShouldClearFieldStatus(battlerAtk, gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) + ADJUST_SCORE(DECENT_EFFECT); + break; + case MOVE_EFFECT_ELECTRIC_TERRAIN: + if (ShouldClearFieldStatus(battlerAtk, STATUS_FIELD_ELECTRIC_TERRAIN)) + { + ADJUST_SCORE(BAD_EFFECT); break; - case MOVE_EFFECT_WRAP: - if (!HasMoveWithEffect(battlerDef, EFFECT_RAPID_SPIN) && ShouldTrap(battlerAtk, battlerDef, move)) - ADJUST_SCORE(BEST_EFFECT); + } + if (ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_ELECTRIC_TERRAIN) + || ShouldClearFieldStatus(battlerAtk, gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) + ADJUST_SCORE(DECENT_EFFECT); + break; + case MOVE_EFFECT_PSYCHIC_TERRAIN: + if (ShouldClearFieldStatus(battlerAtk, STATUS_FIELD_PSYCHIC_TERRAIN)) + { + ADJUST_SCORE(BAD_EFFECT); break; - case MOVE_EFFECT_SALT_CURE: - if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_WATER) || IS_BATTLER_OF_TYPE(battlerDef, TYPE_STEEL)) + } + if (ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_PSYCHIC_TERRAIN) + || ShouldClearFieldStatus(battlerAtk, gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) + ADJUST_SCORE(DECENT_EFFECT); + break; + case MOVE_EFFECT_GRAVITY: + if (!(gFieldStatuses & STATUS_FIELD_GRAVITY) && ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_GRAVITY)) + ADJUST_SCORE(DECENT_EFFECT); + break; + case MOVE_EFFECT_AURORA_VEIL: + if (ShouldSetScreen(battlerAtk, battlerDef, EFFECT_AURORA_VEIL)) + ADJUST_SCORE(DECENT_EFFECT); + break; + case MOVE_EFFECT_REMOVE_STATUS: + if (gBattleMons[battlerDef].status1 & GetMoveEffectArg_Status(move)) + { + if (ShouldCureStatus(battlerAtk, battlerDef, aiData)) ADJUST_SCORE(DECENT_EFFECT); - break; - + else if (aiData->holdEffects[battlerDef] == HOLD_EFFECT_FLAME_ORB || aiData->holdEffects[battlerDef] == HOLD_EFFECT_TOXIC_ORB) + ADJUST_SCORE(WEAK_EFFECT); + else + ADJUST_SCORE(BAD_EFFECT); + } + break; + default: + break; } } } - return score; } // AI_FLAG_CHECK_VIABILITY - Chooses best possible move to hit player static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { + struct AiLogicData *aiData = gAiLogicData; + // Targeting partner, check benefits of doing that instead - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) return score; if (GetMovePower(move) != 0) @@ -5328,13 +6025,12 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score if (gAiThinkingStruct->aiFlags[battlerAtk] & (AI_FLAG_RISKY | AI_FLAG_PREFER_HIGHEST_DAMAGE_MOVE) && GetBestDmgMoveFromBattler(battlerAtk, battlerDef, AI_ATTACKING) == move) ADJUST_SCORE(BEST_DAMAGE_MOVE); - else - ADJUST_SCORE(AI_CompareDamagingMoves(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex)); } } - ADJUST_SCORE(AI_CalcMoveEffectScore(battlerAtk, battlerDef, move)); - ADJUST_SCORE(AI_CalcHoldEffectMoveScore(battlerAtk, battlerDef, move)); + ADJUST_SCORE(AI_CalcMoveEffectScore(battlerAtk, battlerDef, move, aiData)); + ADJUST_SCORE(AI_CalcAdditionalEffectScore(battlerAtk, battlerDef, move, aiData)); + ADJUST_SCORE(AI_CalcHoldEffectMoveScore(battlerAtk, battlerDef, move, aiData)); return score; } @@ -5342,13 +6038,14 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score // Effects that are encouraged on the first turn of battle static s32 AI_ForceSetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { - u8 i; - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef) + if (IsTargetingPartner(battlerAtk, battlerDef) || gBattleResults.battleTurnCounter != 0) return score; + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_SMART_SWITCHING - && AI_IsSlower(battlerAtk, battlerDef, move) + && AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) && CanTargetFaintAi(battlerDef, battlerAtk) && GetBattleMovePriority(battlerAtk, gAiLogicData->abilities[battlerAtk], move) == 0) { @@ -5440,27 +6137,10 @@ static s32 AI_ForceSetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 case EFFECT_CHILLY_RECEPTION: case EFFECT_GEOMANCY: case EFFECT_VICTORY_DANCE: + case EFFECT_CEASELESS_EDGE: + case EFFECT_STONE_AXE: ADJUST_SCORE(DECENT_EFFECT); break; - case EFFECT_HIT: - { - // TEMPORARY - should applied to all moves regardless of EFFECT - // Consider move effects - u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); - for (i = 0; i < additionalEffectCount; i++) - { - const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); - switch (additionalEffect->moveEffect) - { - case MOVE_EFFECT_STEALTH_ROCK: - case MOVE_EFFECT_SPIKES: - ADJUST_SCORE(DECENT_EFFECT); - break; - default: - break; - } - } - } default: break; } @@ -5474,7 +6154,7 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) u8 i; struct AiLogicData *aiData = gAiLogicData; - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) return score; if (GetMoveCriticalHitStage(move) > 0) @@ -5484,14 +6164,15 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (GetMoveEffect(move)) { case EFFECT_COUNTER: - if (gSpeciesInfo[gBattleMons[battlerDef].species].baseAttack >= gSpeciesInfo[gBattleMons[battlerDef].species].baseSpAttack + 10) + if (GetSpeciesBaseAttack(gBattleMons[battlerDef].species) >= GetSpeciesBaseSpAttack(gBattleMons[battlerDef].species) + 10) ADJUST_SCORE(STRONG_RISKY_EFFECT); break; case EFFECT_MIRROR_COAT: - if (gSpeciesInfo[gBattleMons[battlerDef].species].baseSpAttack >= gSpeciesInfo[gBattleMons[battlerDef].species].baseAttack + 10) + if (GetSpeciesBaseSpAttack(gBattleMons[battlerDef].species) >= GetSpeciesBaseAttack(gBattleMons[battlerDef].species) + 10) ADJUST_SCORE(STRONG_RISKY_EFFECT); break; case EFFECT_EXPLOSION: + case EFFECT_MISTY_EXPLOSION: ADJUST_SCORE(STRONG_RISKY_EFFECT); break; @@ -5501,7 +6182,7 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(AVERAGE_RISKY_EFFECT); break; case EFFECT_REVENGE: - if (gSpeciesInfo[gBattleMons[battlerDef].species].baseSpeed >= gSpeciesInfo[gBattleMons[battlerAtk].species].baseSpeed + 10) + if (GetSpeciesBaseSpeed(gBattleMons[battlerDef].species) >= GetSpeciesBaseSpeed(gBattleMons[battlerAtk].species) + 10) ADJUST_SCORE(AVERAGE_RISKY_EFFECT); break; case EFFECT_BELLY_DRUM: @@ -5509,12 +6190,12 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(AVERAGE_RISKY_EFFECT); break; case EFFECT_MAX_HP_50_RECOIL: - case EFFECT_MIND_BLOWN: case EFFECT_CHLOROBLAST: case EFFECT_SWAGGER: case EFFECT_FLATTER: case EFFECT_ATTRACT: case EFFECT_OHKO: + case EFFECT_SHEER_COLD: ADJUST_SCORE(AVERAGE_RISKY_EFFECT); break; case EFFECT_HIT: @@ -5546,7 +6227,7 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // Adds score bonus to OHKOs and 2HKOs static s32 AI_TryTo2HKO(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) return score; if (GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING) == 1) @@ -5557,14 +6238,39 @@ static s32 AI_TryTo2HKO(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) return score; } +// Adds score bonus to targeting "partner" +static s32 AI_AttacksPartner(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) +{ + if (battlerDef == BATTLE_PARTNER(battlerAtk) + // natural enemies in wild battles try to kill each other + && ((IsNaturalEnemy(gBattleMons[battlerAtk].species, gBattleMons[battlerDef].species) && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER))) + || AI_FLAG_ATTACKS_PARTNER_FOCUSES_PARTNER)) + { + u32 movesetIndex = gAiThinkingStruct->movesetIndex; + + if (CanIndexMoveFaintTarget(battlerAtk, battlerDef, movesetIndex, AI_ATTACKING)) + ADJUST_SCORE(BEST_EFFECT); + + u32 hitsToKO = GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING); + + if (GetMoveTarget(move) == MOVE_TARGET_FOES_AND_ALLY && hitsToKO > 0 && + (GetNoOfHitsToKOBattler(battlerAtk, LEFT_FOE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) > 0 || GetNoOfHitsToKOBattler(battlerAtk, LEFT_FOE(battlerDef), gAiThinkingStruct->movesetIndex, AI_ATTACKING) > 0)) + ADJUST_SCORE(BEST_EFFECT); + + if (hitsToKO > 0) + ADJUST_SCORE(DECENT_EFFECT); + } + return score; +} + // Prefers moves that are good for baton pass static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef) + if (IsTargetingPartner(battlerAtk, battlerDef) || CountUsablePartyMons(battlerAtk) == 0 || !IsBattleMoveStatus(move) || !HasMoveWithEffect(battlerAtk, EFFECT_BATON_PASS) - || (!AI_CanBattlerEscape(battlerAtk) && IsBattlerTrapped(battlerDef, battlerAtk))) + || IsBattlerTrapped(battlerAtk, battlerDef)) return score; enum BattleMoveEffects effect = GetMoveEffect(move); @@ -5583,23 +6289,23 @@ static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, u32 move, s32 scor switch (effect) { case EFFECT_INGRAIN: - if (!(gStatuses3[battlerAtk] & STATUS3_ROOTED)) + if (!gBattleMons[battlerAtk].volatiles.root) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_AQUA_RING: - if (!(gStatuses3[battlerAtk] & STATUS3_AQUA_RING)) + if (!gBattleMons[battlerAtk].volatiles.aquaRing) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_PROTECT: - if (gLastMoves[battlerAtk] == MOVE_PROTECT || gLastMoves[battlerAtk] == MOVE_DETECT) + if (GetProtectType(GetMoveProtectMethod(gAiLogicData->lastUsedMove[battlerAtk])) == PROTECT_TYPE_SINGLE) ADJUST_SCORE(-2); else ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_BATON_PASS: - if (gStatuses3[battlerAtk] & (STATUS3_ROOTED | STATUS3_AQUA_RING)) + if (gBattleMons[battlerAtk].volatiles.root || gBattleMons[battlerAtk].volatiles.aquaRing) ADJUST_SCORE(DECENT_EFFECT); - if (gStatuses3[battlerAtk] & STATUS3_LEECHSEED) + if (gBattleMons[battlerAtk].volatiles.leechSeed) ADJUST_SCORE(-3); ADJUST_SCORE(CountPositiveStatStages(battlerAtk) - CountNegativeStatStages(battlerAtk)); break; @@ -5613,23 +6319,23 @@ static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, u32 move, s32 scor static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { enum BattleMoveEffects effect = GetMoveEffect(move); - u32 moveType = 0; + enum Type moveType = 0; SetTypeBeforeUsingMove(move, battlerAtk); moveType = GetBattleMoveType(move); - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) { if ((effect == EFFECT_HEAL_PULSE || effect == EFFECT_HIT_ENEMY_HEAL_ALLY) || (moveType == TYPE_ELECTRIC && gAiLogicData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_VOLT_ABSORB) || (moveType == TYPE_GROUND && gAiLogicData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_EARTH_EATER) || (moveType == TYPE_WATER && (gAiLogicData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_DRY_SKIN || gAiLogicData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_WATER_ABSORB))) { - if (gStatuses3[battlerDef] & STATUS3_HEAL_BLOCK) + if (gBattleMons[battlerDef].volatiles.healBlock) return 0; - if (CanTargetFaintAi(FOE(battlerAtk), BATTLE_PARTNER(battlerAtk)) - || (CanTargetFaintAi(BATTLE_PARTNER(FOE(battlerAtk)), BATTLE_PARTNER(battlerAtk)))) + if (CanTargetFaintAi(LEFT_FOE(battlerAtk), BATTLE_PARTNER(battlerAtk)) + || CanTargetFaintAi(RIGHT_FOE(battlerAtk), BATTLE_PARTNER(battlerAtk))) ADJUST_SCORE(-1); if (gAiLogicData->hpPercents[battlerDef] <= 50) @@ -5645,6 +6351,7 @@ static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (effect) { case EFFECT_EXPLOSION: + case EFFECT_MISTY_EXPLOSION: case EFFECT_RESTORE_HP: case EFFECT_REST: case EFFECT_DESTINY_BOND: @@ -5673,6 +6380,7 @@ static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (effect) { case EFFECT_EXPLOSION: + case EFFECT_MISTY_EXPLOSION: case EFFECT_BIDE: case EFFECT_CONVERSION: case EFFECT_LIGHT_SCREEN: @@ -5855,7 +6563,7 @@ static s32 AI_PowerfulStatus(u32 battlerAtk, u32 battlerDef, u32 move, s32 score case EFFECT_STEALTH_ROCK: case EFFECT_STICKY_WEB: case EFFECT_TOXIC_SPIKES: - if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, gAiLogicData)) + if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, move, gAiLogicData)) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_GRASSY_TERRAIN: @@ -5887,11 +6595,8 @@ static s32 AI_PowerfulStatus(u32 battlerAtk, u32 battlerDef, u32 move, s32 score ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_HAIL: - if (IsWeatherActive(B_WEATHER_HAIL | B_WEATHER_PRIMAL_ANY) == WEATHER_INACTIVE) - ADJUST_SCORE(POWERFUL_STATUS_MOVE); - break; case EFFECT_SNOWSCAPE: - if (IsWeatherActive(B_WEATHER_SNOW | B_WEATHER_PRIMAL_ANY) == WEATHER_INACTIVE) + if (IsWeatherActive(B_WEATHER_ICY_ANY | B_WEATHER_PRIMAL_ANY) == WEATHER_INACTIVE) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; default: @@ -5901,17 +6606,36 @@ static s32 AI_PowerfulStatus(u32 battlerAtk, u32 battlerDef, u32 move, s32 score return score; } +bool32 DoesSideHaveDamagingHazards(u32 side) +{ + for (u32 counter = 0; counter < HAZARDS_MAX_COUNT; counter++) + { + switch (gBattleStruct->hazardsQueue[side][counter]) + { + case HAZARDS_SPIKES: + case HAZARDS_TOXIC_SPIKES: + case HAZARDS_STEALTH_ROCK: + case HAZARDS_STEELSURGE: + return TRUE; + default: + return FALSE; + } + } + return FALSE; +} + static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { u32 i; u32 unmodifiedScore = score; - u32 ability = gBattleMons[battlerAtk].ability; - u32 opposingHazardFlags = gSideStatuses[GetBattlerSide(battlerDef)] & (SIDE_STATUS_SPIKES | SIDE_STATUS_STEALTH_ROCK | SIDE_STATUS_TOXIC_SPIKES); - u32 aiHazardFlags = gSideStatuses[GetBattlerSide(battlerAtk)] & (SIDE_STATUS_HAZARDS_ANY); + enum Ability ability = gBattleMons[battlerAtk].ability; + bool32 opposingHazardFlags = DoesSideHaveDamagingHazards(GetBattlerSide(battlerDef)); + bool32 aiHazardFlags = AreAnyHazardsOnSide(GetBattlerSide(battlerAtk)); enum BattleMoveEffects moveEffect = GetMoveEffect(move); struct AiLogicData *aiData = gAiLogicData; uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex]; u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); // Switch benefit switch (moveEffect) @@ -5923,7 +6647,7 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(GOOD_EFFECT); else if (hitsToKO == 1) ADJUST_SCORE(BEST_EFFECT); - else if (IsSwitchOutEffect(GetMoveEffect(predictedMove)) && AI_WhoStrikesFirst(battlerAtk, battlerDef, move) == AI_IS_SLOWER) // Pursuit against fast U-Turn + else if (IsSwitchOutEffect(GetMoveEffect(predictedMove)) && AI_WhoStrikesFirst(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) == AI_IS_SLOWER) // Pursuit against fast U-Turn ADJUST_SCORE(DECENT_EFFECT); break; } @@ -5934,9 +6658,10 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { if (aiData->abilities[battlerDef] == ABILITY_WONDER_GUARD && effectiveness < UQ_4_12(2.0)) ADJUST_SCORE(10); - if (HasDamagingMove(battlerDef) && !((gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE) + if (HasDamagingMove(battlerDef) && !(gBattleMons[battlerAtk].volatiles.substitute || IsBattlerIncapacitated(battlerDef, aiData->abilities[battlerDef]) - || gBattleMons[battlerDef].status2 & (STATUS2_INFATUATION | STATUS2_CONFUSION))) + || gBattleMons[battlerDef].volatiles.infatuation + || gBattleMons[battlerDef].volatiles.confusionTurns > 0)) ADJUST_SCORE(10); } break; @@ -5968,21 +6693,21 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_HIT_SWITCH_TARGET: - if (opposingHazardFlags != 0) + if (opposingHazardFlags) ADJUST_SCORE(BEST_EFFECT); else ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_ROAR: - if (opposingHazardFlags != 0) + if (opposingHazardFlags) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_RAPID_SPIN: - if (aiHazardFlags != 0) + if (aiHazardFlags) ADJUST_SCORE(BEST_EFFECT); break; case EFFECT_DEFOG: - if (aiHazardFlags != 0) + if (aiHazardFlags) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_WISH: @@ -6014,7 +6739,7 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_ION_DELUGE: case EFFECT_MAGIC_COAT: case EFFECT_SNATCH: - ADJUST_SCORE(-BEST_EFFECT); + ADJUST_SCORE(WORST_EFFECT); break; // Get stuck in bad matchup @@ -6024,7 +6749,7 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_INGRAIN: case EFFECT_NO_RETREAT: case EFFECT_MEAN_LOOK: - ADJUST_SCORE(-GOOD_EFFECT); + ADJUST_SCORE(AWFUL_EFFECT); break; default: @@ -6036,18 +6761,20 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { switch (GetMoveAdditionalEffectById(move, i)->moveEffect) { - case MOVE_EFFECT_WRAP: - ADJUST_SCORE(-GOOD_EFFECT); - break; - case MOVE_EFFECT_FEINT: - ADJUST_SCORE(-BEST_EFFECT); - break; + case MOVE_EFFECT_WRAP: + ADJUST_SCORE(AWFUL_EFFECT); + break; + case MOVE_EFFECT_FEINT: + ADJUST_SCORE(WORST_EFFECT); + break; + default: + break; } } // Take advantage of ability damage bonus if ((ability == ABILITY_STAKEOUT || ability == ABILITY_ANALYTIC) && IsBattleMoveStatus(move)) - ADJUST_SCORE(-WEAK_EFFECT); + ADJUST_SCORE(BAD_EFFECT); // This must be last or the player can gauge whether the AI is predicting based on how long it thinks if (!IsBattlerPredictedToSwitch(battlerDef)) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index c6a4b8708f04..05091a815e32 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -7,7 +7,6 @@ #include "battle_anim.h" #include "battle_controllers.h" #include "battle_main.h" -#include "constants/hold_effects.h" #include "battle_setup.h" #include "data.h" #include "item.h" @@ -29,8 +28,9 @@ static bool32 AiExpectsToFaintPlayer(u32 battler); static bool32 AI_ShouldHeal(u32 battler, u32 healAmount); static bool32 AI_OpponentCanFaintAiWithMod(u32 battler, u32 healAmount); static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon); -static bool32 CanAbilityTrapOpponent(u16 ability, u32 opponent); +static bool32 CanAbilityTrapOpponent(enum Ability ability, u32 opponent); static u32 GetHPHealAmount(u8 itemEffectParam, struct Pokemon *mon); +static u32 GetBattleMonTypeMatchup(struct BattlePokemon opposingBattleMon, struct BattlePokemon battleMon); static void InitializeSwitchinCandidate(struct Pokemon *mon) { @@ -110,11 +110,11 @@ u32 GetSwitchChance(enum ShouldSwitchScenario shouldSwitchScenario) static bool32 IsAceMon(u32 battler, u32 monPartyId) { - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_ACE_POKEMON + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_ACE_POKEMON && !gBattleStruct->battlerState[battler].forcedSwitch && monPartyId == CalculateEnemyPartyCountInSide(battler)-1) return TRUE; - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_DOUBLE_ACE_POKEMON + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_DOUBLE_ACE_POKEMON && !gBattleStruct->battlerState[battler].forcedSwitch && (monPartyId == CalculateEnemyPartyCount()-1 || monPartyId == CalculateEnemyPartyCount()-2)) return TRUE; @@ -160,30 +160,61 @@ static inline bool32 SetSwitchinAndSwitch(u32 battler, u32 switchinId) return TRUE; } -static bool32 AI_DoesChoiceItemBlockMove(u32 battler, u32 move) +static bool32 AI_DoesChoiceEffectBlockMove(u32 battler, u32 move) { // Choice locked into something else - if (gAiLogicData->lastUsedMove[battler] != MOVE_NONE && gAiLogicData->lastUsedMove[battler] != move && HOLD_EFFECT_CHOICE(GetBattlerHoldEffect(battler, FALSE)) && IsBattlerItemEnabled(battler)) + if (gAiLogicData->lastUsedMove[battler] != MOVE_NONE && gAiLogicData->lastUsedMove[battler] != move + && (IsHoldEffectChoice(GetBattlerHoldEffect(battler) && IsBattlerItemEnabled(battler)) + || gBattleMons[battler].ability == ABILITY_GORILLA_TACTICS)) return TRUE; return FALSE; } +static inline bool32 CanBattlerWin1v1(u32 hitsToKOAI, u32 hitsToKOPlayer, bool32 isBattlerFirst) +{ + // Player's best move deals 0 damage + if (hitsToKOAI == 0 && hitsToKOPlayer > 0) + return TRUE; + + // AI's best move deals 0 damage + if (hitsToKOPlayer == 0 && hitsToKOAI > 0) + return FALSE; + + // Neither mon can damage the other + if (hitsToKOPlayer == 0 && hitsToKOAI == 0) + return FALSE; + + // Different KO thresholds depending on who goes first + if (isBattlerFirst) + { + if (hitsToKOAI >= hitsToKOPlayer) + return TRUE; + } + else + { + if (hitsToKOAI > hitsToKOPlayer) + return TRUE; + } + return FALSE; +} + // Note that as many return statements as possible are INTENTIONALLY put after all of the loops; // the function can take a max of about 0.06s to run, and this prevents the player from identifying // whether the mon will switch or not by seeing how long the delay is before they select a move static bool32 ShouldSwitchIfHasBadOdds(u32 battler) { //Variable initialization - u8 opposingPosition, atkType1, atkType2, defType1, defType2; - s32 i, damageDealt = 0, maxDamageDealt = 0, damageTaken = 0, maxDamageTaken = 0; - u32 aiMove, playerMove, aiBestMove = MOVE_NONE, aiAbility = gAiLogicData->abilities[battler], opposingBattler; + u8 opposingPosition; + s32 i, damageDealt = 0, maxDamageDealt = 0, damageTaken = 0, maxDamageTaken = 0, maxDamageTakenPriority = 0; + u32 aiMove, playerMove, bestPlayerPriorityMove = MOVE_NONE, bestPlayerMove = MOVE_NONE, expectedMove = MOVE_NONE, aiAbility = gAiLogicData->abilities[battler], opposingBattler; bool32 getsOneShot = FALSE, hasStatusMove = FALSE, hasSuperEffectiveMove = FALSE; - u16 typeEffectiveness = UQ_4_12(1.0); //baseline typing damage + u32 typeMatchup; enum BattleMoveEffects aiMoveEffect; - u32 hitsToKoPlayer = 0, hitsToKoAI = 0; + u32 hitsToKoAI = 0, hitsToKoAIPriority = 0, hitsToKoPlayer = 0; + bool32 canBattlerWin1v1 = FALSE, isBattlerFirst, isBattlerFirstPriority; // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer - if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (!(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) return FALSE; // Double Battles aren't included in AI_FLAG_SMART_MON_CHOICE. Defaults to regular switch in logic @@ -192,24 +223,43 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battler)); opposingBattler = GetBattlerAtPosition(opposingPosition); + u16 *playerMoves = GetMovesArray(opposingBattler); + + // Get max damage mon could take + for (i = 0; i < MAX_MON_MOVES; i++) + { + playerMove = SMART_SWITCHING_OMNISCIENT ? gBattleMons[opposingBattler].moves[i] : playerMoves[i]; + if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH && gBattleMons[opposingBattler].pp[i] > 0) + { + damageTaken = AI_GetDamage(opposingBattler, battler, i, AI_DEFENDING, gAiLogicData); + if (damageTaken > maxDamageTaken && !AI_DoesChoiceEffectBlockMove(opposingBattler, playerMove)) + { + maxDamageTaken = damageTaken; + bestPlayerMove = playerMove; + } + if (GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], playerMove) > 0 && damageTaken > maxDamageTakenPriority && !AI_DoesChoiceEffectBlockMove(opposingBattler, playerMove)) + { + maxDamageTakenPriority = damageTaken; + bestPlayerPriorityMove = playerMove; + } + } + } - // Gets types of player (opposingBattler) and computer (battler) - atkType1 = gBattleMons[opposingBattler].types[0]; - atkType2 = gBattleMons[opposingBattler].types[1]; - defType1 = gBattleMons[battler].types[0]; - defType2 = gBattleMons[battler].types[1]; + hitsToKoAI = GetNoOfHitsToKOBattlerDmg(maxDamageTaken, battler); + hitsToKoAIPriority = GetNoOfHitsToKOBattlerDmg(maxDamageTakenPriority, battler); + expectedMove = gAiThinkingStruct->aiFlags[battler] & AI_FLAG_PREDICT_MOVE ? GetIncomingMove(battler, opposingBattler, gAiLogicData) : bestPlayerMove; for (i = 0; i < MAX_MON_MOVES; i++) { aiMove = gBattleMons[battler].moves[i]; aiMoveEffect = GetMoveEffect(aiMove); - if (aiMove != MOVE_NONE) + if (aiMove != MOVE_NONE && gBattleMons[battler].pp[i] > 0) { u32 nonVolatileStatus = GetMoveNonVolatileStatus(aiMove); // Check if mon has an "important" status move if (aiMoveEffect == EFFECT_REFLECT || aiMoveEffect == EFFECT_LIGHT_SCREEN || aiMoveEffect == EFFECT_SPIKES || aiMoveEffect == EFFECT_TOXIC_SPIKES || aiMoveEffect == EFFECT_STEALTH_ROCK || aiMoveEffect == EFFECT_STICKY_WEB || aiMoveEffect == EFFECT_LEECH_SEED - || aiMoveEffect == EFFECT_EXPLOSION + || aiMoveEffect == EFFECT_EXPLOSION || aiMoveEffect == EFFECT_MISTY_EXPLOSION || nonVolatileStatus == MOVE_EFFECT_SLEEP || nonVolatileStatus == MOVE_EFFECT_TOXIC || nonVolatileStatus == MOVE_EFFECT_PARALYSIS @@ -222,64 +272,39 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) } // Only check damage if it's a damaging move - if (!IsBattleMoveStatus(aiMove)) + if (!IsBattleMoveStatus(aiMove) && !AI_DoesChoiceEffectBlockMove(battler, aiMove)) { // Check if mon has a super effective move - if (AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) >= UQ_4_12(2.0) && !AI_DoesChoiceItemBlockMove(battler, aiMove)) + if (gAiLogicData->effectiveness[battler][opposingBattler][i] >= UQ_4_12(2.0)) hasSuperEffectiveMove = TRUE; // Get maximum damage mon can deal damageDealt = AI_GetDamage(battler, opposingBattler, i, AI_ATTACKING, gAiLogicData); - if (damageDealt > maxDamageDealt && !AI_DoesChoiceItemBlockMove(battler, aiMove)) - { + if (damageDealt > maxDamageDealt) maxDamageDealt = damageDealt; - aiBestMove = aiMove; + if (!canBattlerWin1v1 ) // Once we can win a 1v1 we don't need to track this, but want to run the rest of the function to keep the runtime the same regardless of when we find the winning move + { + hitsToKoPlayer = GetNoOfHitsToKOBattlerDmg(damageDealt, opposingBattler); + isBattlerFirst = AI_IsFaster(battler, opposingBattler, aiMove, expectedMove, CONSIDER_PRIORITY); + isBattlerFirstPriority = AI_IsFaster(battler, opposingBattler, aiMove, bestPlayerPriorityMove, CONSIDER_PRIORITY); + canBattlerWin1v1 = CanBattlerWin1v1(hitsToKoAI, hitsToKoPlayer, isBattlerFirst) && CanBattlerWin1v1(hitsToKoAIPriority, hitsToKoPlayer, isBattlerFirstPriority); } } } } - hitsToKoPlayer = GetNoOfHitsToKOBattlerDmg(maxDamageDealt, opposingBattler); - // Calculate type advantage - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType1, defType1))); - if (atkType2 != atkType1) - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType2, defType1))); - if (defType2 != defType1) - { - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType1, defType2))); - if (atkType2 != atkType1) - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType2, defType2))); - } - - // Get max damage mon could take - for (i = 0; i < MAX_MON_MOVES; i++) - { - playerMove = gBattleMons[opposingBattler].moves[i]; - if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH) - { - damageTaken = AI_GetDamage(opposingBattler, battler, i, AI_DEFENDING, gAiLogicData); - if (playerMove == gBattleStruct->choicedMove[opposingBattler]) // If player is choiced, only care about the choice locked move - { - return maxDamageTaken = damageTaken; - break; - } - if (damageTaken > maxDamageTaken) - maxDamageTaken = damageTaken; - } - } - - hitsToKoAI = GetNoOfHitsToKOBattlerDmg(maxDamageTaken, battler); + typeMatchup = GetBattleMonTypeMatchup(gBattleMons[opposingBattler], gBattleMons[battler]); // Check if mon gets one shot if (maxDamageTaken > gBattleMons[battler].hp - && !(gItemsInfo[gBattleMons[battler].item].holdEffect == HOLD_EFFECT_FOCUS_SASH || (!IsMoldBreakerTypeAbility(opposingBattler, gBattleMons[opposingBattler].ability) && B_STURDY >= GEN_5 && aiAbility == ABILITY_STURDY))) + && !(gItemsInfo[gBattleMons[battler].item].holdEffect == HOLD_EFFECT_FOCUS_SASH || (!IsMoldBreakerTypeAbility(opposingBattler, gAiLogicData->abilities[opposingBattler]) && GetConfig(CONFIG_STURDY) >= GEN_5 && aiAbility == ABILITY_STURDY))) { getsOneShot = TRUE; } // Check if current mon can 1v1 in spite of bad matchup, and don't switch out if it can - if (hitsToKoPlayer < hitsToKoAI || (hitsToKoPlayer == hitsToKoAI && AI_IsFaster(battler, opposingBattler, aiBestMove))) + if (canBattlerWin1v1) return FALSE; // If we don't have any other viable options, don't switch out @@ -288,11 +313,8 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) // Start assessing whether or not mon has bad odds // Jump straight to switching out in cases where mon gets OHKO'd - if (((getsOneShot && gBattleMons[opposingBattler].speed > gBattleMons[battler].speed) // If the player OHKOs and outspeeds OR OHKOs, doesn't outspeed but isn't 2HKO'd - || (getsOneShot && gBattleMons[opposingBattler].speed <= gBattleMons[battler].speed && maxDamageDealt < gBattleMons[opposingBattler].hp / 2)) - && (gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 2 // And the current mon has at least 1/2 their HP, or 1/4 HP and Regenerator - || (aiAbility == ABILITY_REGENERATOR - && gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 4))) + if ((getsOneShot && !canBattlerWin1v1) && (gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 2 // And the current mon has at least 1/2 their HP, or 1/4 HP and Regenerator + || (aiAbility == ABILITY_REGENERATOR && gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 4))) { // 50% chance to stay in regardless if (RandomPercentage(RNG_AI_SWITCH_HASBADODDS, (100 - GetSwitchChance(SHOULD_SWITCH_HASBADODDS))) && !gAiLogicData->aiPredictionInProgress) @@ -303,7 +325,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) } // General bad type matchups have more wiggle room - if (typeEffectiveness >= UQ_4_12(2.0)) // If the player has at least a 2x type advantage + if (typeMatchup > UQ_4_12(2.0)) // If the player has favourable offensive matchup (2.0 is neutral, this must be worse) { if (!hasSuperEffectiveMove // If the AI doesn't have a super effective move && (gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 2 // And the current mon has at least 1/2 their HP, or 1/4 HP and Regenerator @@ -364,7 +386,7 @@ static u32 FindMonWithMoveOfEffectiveness(u32 battler, u32 opposingBattler, uq4_ for (j = 0; j < MAX_MON_MOVES; j++) { move = GetMonData(&party[i], MON_DATA_MOVE1 + j); - if (move != MOVE_NONE && AI_GetMoveEffectiveness(move, battler, opposingBattler) >= effectiveness && gMovesInfo[move].power != 0) + if (move != MOVE_NONE && AI_GetMoveEffectiveness(move, battler, opposingBattler) >= effectiveness && GetMovePower(move) != 0) return SetSwitchinAndSwitch(battler, i); } } @@ -385,9 +407,10 @@ static bool32 ShouldSwitchIfAllMovesBad(u32 battler) for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { aiMove = gBattleMons[battler].moves[moveIndex]; - if ((AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) > UQ_4_12(0.0) - || AI_GetMoveEffectiveness(aiMove, battler, opposingPartner) > UQ_4_12(0.0)) - && aiMove != MOVE_NONE) + if (aiMove == MOVE_NONE) + continue; + if (gAiLogicData->effectiveness[battler][opposingBattler][moveIndex] > UQ_4_12(0.0) + || gAiLogicData->effectiveness[battler][opposingPartner][moveIndex] > UQ_4_12(0.0)) return FALSE; } } @@ -396,8 +419,10 @@ static bool32 ShouldSwitchIfAllMovesBad(u32 battler) for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { aiMove = gBattleMons[battler].moves[moveIndex]; - if (AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) > UQ_4_12(0.0) && aiMove != MOVE_NONE - && (!ALL_MOVES_BAD_STATUS_MOVES_BAD || gMovesInfo[aiMove].power != 0)) // If using ALL_MOVES_BAD_STATUS_MOVES_BAD, then need power to be non-zero + if (gAiLogicData->effectiveness[battler][opposingBattler][moveIndex] > UQ_4_12(0.0) && aiMove != MOVE_NONE + && !CanAbilityAbsorbMove(battler, opposingBattler, gAiLogicData->abilities[opposingBattler], aiMove, GetBattleMoveType(aiMove), AI_CHECK) + && !CanAbilityBlockMove(battler, opposingBattler, gBattleMons[battler].ability, gAiLogicData->abilities[opposingBattler], aiMove, AI_CHECK) + && (!ALL_MOVES_BAD_STATUS_MOVES_BAD || GetMovePower(aiMove) != 0)) // If using ALL_MOVES_BAD_STATUS_MOVES_BAD, then need power to be non-zero return FALSE; } } @@ -416,7 +441,7 @@ static bool32 ShouldSwitchIfAllMovesBad(u32 battler) static bool32 ShouldSwitchIfWonderGuard(u32 battler) { u32 opposingBattler = GetOppositeBattler(battler); - u32 i, move; + u32 i; if (IsDoubleBattle()) return FALSE; @@ -427,12 +452,8 @@ static bool32 ShouldSwitchIfWonderGuard(u32 battler) // Check if PokΓ©mon has a super effective move. for (i = 0; i < MAX_MON_MOVES; i++) { - move = gBattleMons[battler].moves[i]; - if (move != MOVE_NONE) - { - if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0)) - return FALSE; - } + if (gBattleMons[battler].moves[i] != MOVE_NONE && gAiLogicData->effectiveness[battler][opposingBattler][i] >= UQ_4_12(2.0)) + return FALSE; } if (RandomPercentage(RNG_AI_SWITCH_WONDER_GUARD, GetSwitchChance(SHOULD_SWITCH_WONDER_GUARD))) @@ -450,18 +471,21 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) { u8 battlerIn1, battlerIn2; u8 numAbsorbingAbilities = 0; - u16 absorbingTypeAbilities[3]; // Array size is maximum number of absorbing abilities for a single type + enum Ability absorbingTypeAbilities[3]; // Array size is maximum number of absorbing abilities for a single type s32 firstId; s32 lastId; struct Pokemon *party; - u16 monAbility, aiMove; + enum Ability monAbility; + u16 aiMove; u32 opposingBattler = GetOppositeBattler(battler); u32 incomingMove = GetIncomingMove(battler, opposingBattler, gAiLogicData); - u32 incomingType = GetMoveType(incomingMove); - bool32 isOpposingBattlerChargingOrInvulnerable = (IsSemiInvulnerable(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove)); + enum Type incomingType = CheckDynamicMoveType(GetBattlerMon(opposingBattler), incomingMove, opposingBattler, MON_IN_BATTLE); + bool32 isOpposingBattlerChargingOrInvulnerable = !BreaksThroughSemiInvulnerablity(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove); s32 i, j; - if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (!(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) + return FALSE; + if (GetMoveEffect(incomingMove) == EFFECT_HIDDEN_POWER && RandomPercentage(RNG_AI_SWITCH_ABSORBING_HIDDEN_POWER, SHOULD_SWITCH_ABSORBS_HIDDEN_POWER_PERCENTAGE)) return FALSE; if (gBattleStruct->prevTurnSpecies[battler] != gBattleMons[battler].species && !(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_PREDICT_MOVE)) // AI mon has changed, player's behaviour no longer reliable; override this if using AI_FLAG_PREDICT_MOVE return FALSE; @@ -481,7 +505,7 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) // Only check damage if it's a damaging move if (!IsBattleMoveStatus(aiMove)) { - if (!AI_DoesChoiceItemBlockMove(battler, aiMove) && AI_GetDamage(battler, opposingBattler, i, AI_ATTACKING, gAiLogicData) > gBattleMons[opposingBattler].hp) + if (!AI_DoesChoiceEffectBlockMove(battler, aiMove) && AI_GetDamage(battler, opposingBattler, i, AI_ATTACKING, gAiLogicData) > gBattleMons[opposingBattler].hp) return FALSE; } } @@ -510,14 +534,14 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) { absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_WATER_ABSORB; absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_DRY_SKIN; - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5) + if (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) >= GEN_5) absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_STORM_DRAIN; } else if (incomingType == TYPE_ELECTRIC || (isOpposingBattlerChargingOrInvulnerable && incomingType == TYPE_ELECTRIC)) { absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_VOLT_ABSORB; absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_MOTOR_DRIVE; - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5) + if (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) >= GEN_5) absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_LIGHTNING_ROD; } else if (incomingType == TYPE_GRASS || (isOpposingBattlerChargingOrInvulnerable && incomingType == TYPE_GRASS)) @@ -589,11 +613,12 @@ static bool32 ShouldSwitchIfOpponentChargingOrInvulnerable(u32 battler) u32 opposingBattler = GetOppositeBattler(battler); u32 incomingMove = GetIncomingMove(battler, opposingBattler, gAiLogicData); - bool32 isOpposingBattlerChargingOrInvulnerable = (IsSemiInvulnerable(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove)); + bool32 isOpposingBattlerChargingOrInvulnerable = !BreaksThroughSemiInvulnerablity(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove); - if (IsDoubleBattle() || !(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (IsDoubleBattle() || !(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) return FALSE; + // In a world with a unified ShouldSwitch function, also want to check whether we already win 1v1 and if we do don't switch; not worth doubling the HasBadOdds computation for now if (isOpposingBattlerChargingOrInvulnerable && gAiLogicData->mostSuitableMonId[battler] != PARTY_SIZE && RandomPercentage(RNG_AI_SWITCH_FREE_TURN, GetSwitchChance(SHOULD_SWITCH_FREE_TURN))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); @@ -606,11 +631,11 @@ static bool32 ShouldSwitchIfTrapperInParty(u32 battler) s32 lastId; struct Pokemon *party; s32 i; - u16 monAbility; + enum Ability monAbility; s32 opposingBattler = GetOppositeBattler(battler); // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer - if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (!(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) return FALSE; // Check if current mon has an ability that traps opponent @@ -628,10 +653,10 @@ static bool32 ShouldSwitchIfTrapperInParty(u32 battler) monAbility = GetMonAbility(&party[i]); - if (CanAbilityTrapOpponent(monAbility, opposingBattler) || (CanAbilityTrapOpponent(AI_GetBattlerAbility(opposingBattler), opposingBattler) && monAbility == ABILITY_TRACE)) + if (CanAbilityTrapOpponent(monAbility, opposingBattler) || (CanAbilityTrapOpponent(gAiLogicData->abilities[opposingBattler], opposingBattler) && monAbility == ABILITY_TRACE)) { // If mon in slot i is the most suitable switchin candidate, then it's a trapper than wins 1v1 - if (i == gAiLogicData->mostSuitableMonId[battler] && RandomPercentage(RNG_AI_SWITCH_FREE_TURN, GetSwitchChance(SHOULD_SWITCH_FREE_TURN))) + if (i == gAiLogicData->mostSuitableMonId[battler] && RandomPercentage(RNG_AI_SWITCH_TRAPPER, GetSwitchChance(SHOULD_SWITCH_TRAPPER))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } } @@ -641,23 +666,23 @@ static bool32 ShouldSwitchIfTrapperInParty(u32 battler) static bool32 ShouldSwitchIfBadlyStatused(u32 battler) { bool32 switchMon = FALSE; - u16 monAbility = gAiLogicData->abilities[battler]; - enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[battler]; + enum Ability monAbility = gAiLogicData->abilities[battler]; + enum HoldEffect holdEffect = gAiLogicData->holdEffects[battler]; u8 opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battler)); u8 opposingBattler = GetBattlerAtPosition(opposingPosition); bool32 hasStatRaised = AnyStatIsRaised(battler); //Perish Song - if (gStatuses3[battler] & STATUS3_PERISH_SONG + if (gBattleMons[battler].volatiles.perishSong && gDisableStructs[battler].perishSongTimer == 0 && monAbility != ABILITY_SOUNDPROOF && RandomPercentage(RNG_AI_SWITCH_PERISH_SONG, GetSwitchChance(SHOULD_SWITCH_PERISH_SONG))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING) { //Yawn - if (gStatuses3[battler] & STATUS3_YAWN + if (gBattleMons[battler].volatiles.yawn && CanBeSlept(battler, battler, monAbility, BLOCKED_BY_SLEEP_CLAUSE) // TODO: ask for help from pawwkie && gBattleMons[battler].hp > gBattleMons[battler].maxHP / 3 && RandomPercentage(RNG_AI_SWITCH_YAWN, GetSwitchChance(SHOULD_SWITCH_YAWN))) @@ -679,8 +704,8 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) || monAbility == ABILITY_EARLY_BIRD) || holdEffect == (HOLD_EFFECT_CURE_SLP | HOLD_EFFECT_CURE_STATUS) || HasMove(battler, MOVE_SLEEP_TALK) - || (HasMoveWithEffect(battler, MOVE_SNORE) && AI_GetMoveEffectiveness(MOVE_SNORE, battler, opposingBattler) >= UQ_4_12(2.0)) - || (IsBattlerGrounded(battler) + || (HasMove(battler, MOVE_SNORE) && gAiLogicData->effectiveness[battler][opposingBattler][GetIndexInMoveArray(battler, MOVE_SNORE)] >= UQ_4_12(2.0)) + || (IsBattlerGrounded(battler, monAbility, gAiLogicData->holdEffects[battler]) && (HasMove(battler, MOVE_MISTY_TERRAIN) || HasMove(battler, MOVE_ELECTRIC_TERRAIN))) ) switchMon = FALSE; @@ -690,9 +715,9 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) && gAiLogicData->abilities[opposingBattler] != ABILITY_UNAWARE && gAiLogicData->abilities[opposingBattler] != ABILITY_KEEN_EYE && gAiLogicData->abilities[opposingBattler] != ABILITY_MINDS_EYE - && (B_ILLUMINATE_EFFECT >= GEN_9 && gAiLogicData->abilities[opposingBattler] != ABILITY_ILLUMINATE) - && !(gBattleMons[battler].status2 & STATUS2_FORESIGHT) - && !(gStatuses3[battler] & STATUS3_MIRACLE_EYED)) + && (GetConfig(CONFIG_ILLUMINATE_EFFECT) >= GEN_9 && gAiLogicData->abilities[opposingBattler] != ABILITY_ILLUMINATE) + && !gBattleMons[battler].volatiles.foresight + && !gBattleMons[battler].volatiles.miracleEye) switchMon = FALSE; if (switchMon) @@ -712,23 +737,23 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) return SetSwitchinAndSwitch(battler, PARTY_SIZE); //Cursed - if (gBattleMons[battler].status2 & STATUS2_CURSED + if (gBattleMons[battler].volatiles.cursed && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_CURSED, GetSwitchChance(SHOULD_SWITCH_CURSED_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_CURSED, GetSwitchChance(SHOULD_SWITCH_CURSED)))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); //Nightmare - if (gBattleMons[battler].status2 & STATUS2_NIGHTMARE + if (gBattleMons[battler].volatiles.nightmare && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_NIGHTMARE, GetSwitchChance(SHOULD_SWITCH_NIGHTMARE_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_NIGHTMARE, GetSwitchChance(SHOULD_SWITCH_NIGHTMARE)))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); //Leech Seed - if (gStatuses3[battler] & STATUS3_LEECHSEED + if (gBattleMons[battler].volatiles.leechSeed && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_SEEDED, GetSwitchChance(SHOULD_SWITCH_SEEDED_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_SEEDED, GetSwitchChance(SHOULD_SWITCH_SEEDED)))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } // Infatuation - if (gBattleMons[battler].status2 & STATUS2_INFATUATION + if (gBattleMons[battler].volatiles.infatuation && !AiExpectsToFaintPlayer(battler) && gAiLogicData->mostSuitableMonId[battler] != PARTY_SIZE && RandomPercentage(RNG_AI_SWITCH_INFATUATION, GetSwitchChance(SHOULD_SWITCH_INFATUATION))) @@ -743,7 +768,7 @@ static bool32 ShouldSwitchIfAbilityBenefit(u32 battler) bool32 hasStatRaised = AnyStatIsRaised(battler); //Check if ability is blocked - if (gStatuses3[battler] & STATUS3_GASTRO_ACID + if (gBattleMons[battler].volatiles.gastroAcid || IsNeutralizingGasOnField()) return FALSE; @@ -800,13 +825,11 @@ static bool32 CanUseSuperEffectiveMoveAgainstOpponents(u32 battler) for (i = 0; i < MAX_MON_MOVES; i++) { move = gBattleMons[battler].moves[i]; - if (move == MOVE_NONE || AI_DoesChoiceItemBlockMove(battler, move)) + if (move == MOVE_NONE || AI_DoesChoiceEffectBlockMove(battler, move)) continue; - if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0)) - { + if (gAiLogicData->effectiveness[battler][opposingBattler][i] >= UQ_4_12(2.0)) return TRUE; - } } } if (!IsDoubleBattle()) @@ -819,13 +842,11 @@ static bool32 CanUseSuperEffectiveMoveAgainstOpponents(u32 battler) for (i = 0; i < MAX_MON_MOVES; i++) { move = gBattleMons[battler].moves[i]; - if (move == MOVE_NONE || AI_DoesChoiceItemBlockMove(battler, move)) + if (move == MOVE_NONE || AI_DoesChoiceEffectBlockMove(battler, move)) continue; - if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0)) - { + if (gAiLogicData->effectiveness[battler][opposingBattler][i] >= UQ_4_12(2.0)) return TRUE; - } } } @@ -842,7 +863,7 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 perc u16 move; // Similar functionality handled more thoroughly by ShouldSwitchIfHasBadOdds - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING) return FALSE; if (gLastLandedMoves[battler] == MOVE_NONE) @@ -873,7 +894,8 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 perc for (i = firstId; i < lastId; i++) { - u16 species, monAbility; + u16 species; + enum Ability monAbility; uq4_12_t typeMultiplier; u16 moveFlags = 0; @@ -901,7 +923,7 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 perc for (j = 0; j < MAX_MON_MOVES; j++) { move = GetMonData(&party[i], MON_DATA_MOVE1 + j); - if (move == 0) + if (move == MOVE_NONE) continue; if (AI_GetMoveEffectiveness(move, battler, battlerIn1) >= UQ_4_12(2.0) && (RandomPercentage(RNG_AI_SWITCH_SE_DEFENSIVE, percentChance) || gAiLogicData->aiPredictionInProgress)) @@ -917,7 +939,7 @@ static bool32 CanMonSurviveHazardSwitchin(u32 battler) { u32 battlerIn1, battlerIn2; u32 hazardDamage = 0, battlerHp = gBattleMons[battler].hp; - u32 ability = gAiLogicData->abilities[battler], aiMove; + enum Ability ability = gAiLogicData->abilities[battler], aiMove; s32 firstId, lastId, i, j; struct Pokemon *party; @@ -980,7 +1002,7 @@ static bool32 ShouldSwitchIfEncored(u32 battler) u32 opposingBattler = GetOppositeBattler(battler); // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer - if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (!(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) return FALSE; // If not Encore'd don't switch @@ -992,7 +1014,7 @@ static bool32 ShouldSwitchIfEncored(u32 battler) return SetSwitchinAndSwitch(battler, PARTY_SIZE); // Stay in if effective move - else if (AI_GetMoveEffectiveness(encoredMove, battler, opposingBattler) >= UQ_4_12(2.0)) + else if (gAiLogicData->effectiveness[battler][opposingBattler][GetIndexInMoveArray(battler, encoredMove)] >= UQ_4_12(2.0)) return FALSE; // Switch out 50% of the time otherwise @@ -1004,17 +1026,17 @@ static bool32 ShouldSwitchIfEncored(u32 battler) static bool32 ShouldSwitchIfBadChoiceLock(u32 battler) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); u32 lastUsedMove = gAiLogicData->lastUsedMove[battler]; u32 opposingBattler = GetOppositeBattler(battler); bool32 moveAffectsTarget = TRUE; if (lastUsedMove != MOVE_NONE && (AI_GetMoveEffectiveness(lastUsedMove, battler, opposingBattler) == UQ_4_12(0.0) - || CanAbilityAbsorbMove(battler, opposingBattler, gAiLogicData->abilities[opposingBattler], lastUsedMove, GetMoveType(lastUsedMove), ABILITY_CHECK_TRIGGER) - || CanAbilityBlockMove(battler, opposingBattler, gAiLogicData->abilities[battler], gAiLogicData->abilities[opposingBattler], lastUsedMove, ABILITY_CHECK_TRIGGER))) + || CanAbilityAbsorbMove(battler, opposingBattler, gAiLogicData->abilities[opposingBattler], lastUsedMove, CheckDynamicMoveType(GetBattlerMon(battler), lastUsedMove, battler, MON_IN_BATTLE), AI_CHECK) + || CanAbilityBlockMove(battler, opposingBattler, gAiLogicData->abilities[battler], gAiLogicData->abilities[opposingBattler], lastUsedMove, AI_CHECK))) moveAffectsTarget = FALSE; - if (HOLD_EFFECT_CHOICE(holdEffect) && IsBattlerItemEnabled(battler)) + if (IsHoldEffectChoice(holdEffect) && IsBattlerItemEnabled(battler)) { if ((GetMoveCategory(lastUsedMove) == DAMAGE_CATEGORY_STATUS || !moveAffectsTarget) && RandomPercentage(RNG_AI_SWITCH_CHOICE_LOCKED, GetSwitchChance(SHOULD_SWITCH_CHOICE_LOCKED))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); @@ -1030,7 +1052,7 @@ static bool32 ShouldSwitchIfAttackingStatsLowered(u32 battler) s8 spAttackingStage = gBattleMons[battler].statStages[STAT_SPATK]; // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer - if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (!(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) return FALSE; // Physical attacker @@ -1078,9 +1100,11 @@ bool32 ShouldSwitch(u32 battler) s32 i; s32 availableToSwitch; - if (gBattleMons[battler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) + if (gBattleMons[battler].volatiles.wrapped) return FALSE; - if (gStatuses3[battler] & STATUS3_ROOTED) + if (gBattleMons[battler].volatiles.escapePrevention) + return FALSE; + if (gBattleMons[battler].volatiles.root) return FALSE; if (IsAbilityPreventingEscape(battler)) return FALSE; @@ -1088,14 +1112,14 @@ bool32 ShouldSwitch(u32 battler) return FALSE; // Sequence Switching AI never switches mid-battle - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SEQUENCE_SWITCHING) + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SEQUENCE_SWITCHING) return FALSE; availableToSwitch = 0; if (IsDoubleBattle()) { - u32 partner = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerAtPosition(battler))); + u32 partner = BATTLE_PARTNER(battler); battlerIn1 = battler; if (gAbsentBattlerFlags & (1u << partner)) battlerIn2 = battler; @@ -1140,7 +1164,7 @@ bool32 ShouldSwitch(u32 battler) if (ShouldSwitchIfWonderGuard(battler)) return TRUE; - if ((gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) && (CanMonSurviveHazardSwitchin(battler) == FALSE)) + if ((gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING) && (CanMonSurviveHazardSwitchin(battler) == FALSE)) return FALSE; if (ShouldSwitchIfTrapperInParty(battler)) return TRUE; @@ -1168,7 +1192,7 @@ bool32 ShouldSwitch(u32 battler) // Removing switch capabilites under specific conditions // These Functions prevent the "FindMonWithFlagsAndSuperEffective" from getting out of hand. // We don't use FindMonWithFlagsAndSuperEffective with AI_FLAG_SMART_SWITCHING, so we can bail early. - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING) return FALSE; if (CanUseSuperEffectiveMoveAgainstOpponents(battler)) return FALSE; @@ -1187,7 +1211,7 @@ bool32 ShouldSwitch(u32 battler) bool32 ShouldSwitchIfAllScoresBad(u32 battler) { u32 i, score, opposingBattler = GetOppositeBattler(battler); - if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (!(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) return FALSE; for (i = 0; i < MAX_MON_MOVES; i++) @@ -1227,9 +1251,11 @@ void ModifySwitchAfterMoveScoring(u32 battler) s32 i; s32 availableToSwitch; - if (gBattleMons[battler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) + if (gBattleMons[battler].volatiles.wrapped) + return; + if (gBattleMons[battler].volatiles.escapePrevention) return; - if (gStatuses3[battler] & STATUS3_ROOTED) + if (gBattleMons[battler].volatiles.root) return; if (IsAbilityPreventingEscape(battler)) return; @@ -1237,14 +1263,14 @@ void ModifySwitchAfterMoveScoring(u32 battler) return; // Sequence Switching AI never switches mid-battle - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SEQUENCE_SWITCHING) + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SEQUENCE_SWITCHING) return; availableToSwitch = 0; if (IsDoubleBattle()) { - u32 partner = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerAtPosition(battler))); + u32 partner = BATTLE_PARTNER(battler); battlerIn1 = battler; if (gAbsentBattlerFlags & (1u << partner)) battlerIn2 = battler; @@ -1292,7 +1318,7 @@ bool32 IsSwitchinValid(u32 battler) // Edge case: See if partner already chose to switch into the same mon if (IsDoubleBattle()) { - u32 partner = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerAtPosition(battler))); + u32 partner = BATTLE_PARTNER(battler); if (gBattleStruct->AI_monToSwitchIntoId[battler] == PARTY_SIZE) // Generic switch { if ((gAiLogicData->shouldSwitch & (1u << partner)) && gAiLogicData->monToSwitchInId[partner] == gAiLogicData->mostSuitableMonId[battler]) @@ -1324,7 +1350,8 @@ void AI_TrySwitchOrUseItem(u32 battler) { if (gAiLogicData->shouldSwitch & (1u << battler) && IsSwitchinValid(battler)) { - BtlController_EmitTwoReturnValues(battler, 1, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_SWITCH, 0); + SetAIUsingGimmick(battler, NO_GIMMICK); if (gBattleStruct->AI_monToSwitchIntoId[battler] == PARTY_SIZE) { s32 monToSwitchId = gAiLogicData->mostSuitableMonId[battler]; @@ -1371,6 +1398,7 @@ void AI_TrySwitchOrUseItem(u32 battler) } else if (ShouldUseItem(battler)) { + SetAIUsingGimmick(battler, NO_GIMMICK); return; } } @@ -1414,33 +1442,18 @@ static u32 GetBestMonBatonPass(struct Pokemon *party, int firstId, int lastId, u static u32 GetBestMonTypeMatchup(struct Pokemon *party, int firstId, int lastId, u8 invalidMons, u32 battler, u32 opposingBattler) { int i, bits = 0; - while (bits != 0x3F) // All mons were checked. { - uq4_12_t bestResist = UQ_4_12(1.0); + u32 bestResist = UQ_4_12(2.0); int bestMonId = PARTY_SIZE; // Find the mon whose type is the most suitable defensively. for (i = firstId; i < lastId; i++) { if (!((1u << i) & invalidMons) && !((1u << i) & bits)) { - u16 species = GetMonData(&party[i], MON_DATA_SPECIES); - uq4_12_t typeEffectiveness = UQ_4_12(1.0); - - u8 atkType1 = gBattleMons[opposingBattler].types[0]; - u8 atkType2 = gBattleMons[opposingBattler].types[1]; - u8 defType1 = gSpeciesInfo[species].types[0]; - u8 defType2 = gSpeciesInfo[species].types[1]; - - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType1, defType1))); - if (atkType2 != atkType1) - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType2, defType1))); - if (defType2 != defType1) - { - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType1, defType2))); - if (atkType2 != atkType1) - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType2, defType2))); - } + InitializeSwitchinCandidate(&party[i]); + + u32 typeEffectiveness = GetBattleMonTypeMatchup(gBattleMons[opposingBattler], gAiLogicData->switchinCandidate.battleMon); if (typeEffectiveness < bestResist) { bestResist = typeEffectiveness; @@ -1478,8 +1491,8 @@ static u32 GetBestMonDmg(struct Pokemon *party, int firstId, int lastId, u8 inva int i, j; int dmg, bestDmg = 0; int bestMonId = PARTY_SIZE; - u32 aiMove; + uq4_12_t effectiveness; // If we couldn't find the best mon in terms of typing, find the one that deals most damage. for (i = firstId; i < lastId; i++) @@ -1493,7 +1506,7 @@ static u32 GetBestMonDmg(struct Pokemon *party, int firstId, int lastId, u8 inva if (aiMove != MOVE_NONE && !IsBattleMoveStatus(aiMove)) { aiMove = GetMonData(&party[i], MON_DATA_MOVE1 + j); - dmg = AI_CalcPartyMonDamage(aiMove, battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, AI_ATTACKING); + dmg = AI_CalcPartyMonDamage(aiMove, battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, &effectiveness, AI_ATTACKING); if (bestDmg < dmg) { bestDmg = dmg; @@ -1506,7 +1519,22 @@ static u32 GetBestMonDmg(struct Pokemon *party, int firstId, int lastId, u8 inva return bestMonId; } -bool32 IsMonGrounded(u16 heldItemEffect, u32 ability, u8 type1, u8 type2) +static u32 GetFirstNonInvalidMon(u32 firstId, u32 lastId, u32 invalidMons) +{ + u32 chosenMonId = PARTY_SIZE; + for (u32 i = (lastId-1); i > firstId; i--) + { + if (!((1 << i) & invalidMons)) + { + // first non invalid mon found + chosenMonId = i; + break; + } + } + return chosenMonId; +} + +bool32 IsMonGrounded(enum HoldEffect heldItemEffect, enum Ability ability, enum Type type1, enum Type type2) { // List that makes mon not grounded if (type1 == TYPE_FLYING || type2 == TYPE_FLYING || ability == ABILITY_LEVITATE @@ -1525,24 +1553,26 @@ bool32 IsMonGrounded(u16 heldItemEffect, u32 ability, u8 type1, u8 type2) // Gets hazard damage static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon) { - u8 defType1 = battleMon->types[0], defType2 = battleMon->types[1], tSpikesLayers; + enum Type defType1 = battleMon->types[0], defType2 = battleMon->types[1]; + u8 tSpikesLayers; u16 heldItemEffect = GetItemHoldEffect(battleMon->item); - u32 maxHP = battleMon->maxHP, ability = battleMon->ability, status = battleMon->status1; + u32 maxHP = battleMon->maxHP; + enum Ability ability = battleMon->ability, status = battleMon->status1; u32 spikesDamage = 0, tSpikesDamage = 0, hazardDamage = 0; - u32 hazardFlags = gSideStatuses[GetBattlerSide(battler)] & (SIDE_STATUS_SPIKES | SIDE_STATUS_STEALTH_ROCK | SIDE_STATUS_STICKY_WEB | SIDE_STATUS_TOXIC_SPIKES | SIDE_STATUS_SAFEGUARD); + u32 side = GetBattlerSide(battler); // Check ways mon might avoid all hazards if (ability != ABILITY_MAGIC_GUARD || (heldItemEffect == HOLD_EFFECT_HEAVY_DUTY_BOOTS && !((gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) || ability == ABILITY_KLUTZ))) { // Stealth Rock - if ((hazardFlags & SIDE_STATUS_STEALTH_ROCK) && heldItemEffect != HOLD_EFFECT_HEAVY_DUTY_BOOTS) + if (IsHazardOnSide(side, HAZARDS_STEALTH_ROCK) && heldItemEffect != HOLD_EFFECT_HEAVY_DUTY_BOOTS) hazardDamage += GetStealthHazardDamageByTypesAndHP(TYPE_SIDE_HAZARD_POINTED_STONES, defType1, defType2, battleMon->maxHP); // G-Max Steelsurge - if ((hazardFlags & SIDE_STATUS_STEELSURGE) && heldItemEffect != HOLD_EFFECT_HEAVY_DUTY_BOOTS) + if (IsHazardOnSide(side, HAZARDS_STEELSURGE) && heldItemEffect != HOLD_EFFECT_HEAVY_DUTY_BOOTS) hazardDamage += GetStealthHazardDamageByTypesAndHP(TYPE_SIDE_HAZARD_SHARP_STEEL, defType1, defType2, battleMon->maxHP); // Spikes - if ((hazardFlags & SIDE_STATUS_SPIKES) && IsMonGrounded(heldItemEffect, ability, defType1, defType2)) + if (IsHazardOnSide(side, HAZARDS_SPIKES) && IsMonGrounded(heldItemEffect, ability, defType1, defType2)) { spikesDamage = maxHP / ((5 - gSideTimers[GetBattlerSide(battler)].spikesAmount) * 2); if (spikesDamage == 0) @@ -1550,13 +1580,13 @@ static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon hazardDamage += spikesDamage; } - if ((hazardFlags & SIDE_STATUS_TOXIC_SPIKES) && (defType1 != TYPE_POISON && defType2 != TYPE_POISON + if (IsHazardOnSide(side, HAZARDS_TOXIC_SPIKES) && (defType1 != TYPE_POISON && defType2 != TYPE_POISON && defType1 != TYPE_STEEL && defType2 != TYPE_STEEL && ability != ABILITY_IMMUNITY && ability != ABILITY_POISON_HEAL && ability != ABILITY_COMATOSE && status == 0 - && !(hazardFlags & SIDE_STATUS_SAFEGUARD) + && !(gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD) && !IsAbilityOnSide(battler, ABILITY_PASTEL_VEIL) - && !IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN) + && !IsBattlerTerrainAffected(battler, ability, gAiLogicData->holdEffects[battler], STATUS_FIELD_MISTY_TERRAIN) && !IsAbilityStatusProtected(battler, ability) && heldItemEffect != HOLD_EFFECT_CURE_PSN && heldItemEffect != HOLD_EFFECT_CURE_STATUS && IsMonGrounded(heldItemEffect, ability, defType1, defType2))) @@ -1583,8 +1613,9 @@ static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon // Gets damage / healing from weather static s32 GetSwitchinWeatherImpact(void) { - s32 weatherImpact = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP, ability = gAiLogicData->switchinCandidate.battleMon.ability; - enum ItemHoldEffect holdEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); + s32 weatherImpact = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP; + enum Ability ability = gAiLogicData->switchinCandidate.battleMon.ability; + enum HoldEffect holdEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); if (HasWeatherEffect()) { @@ -1647,8 +1678,9 @@ static s32 GetSwitchinWeatherImpact(void) // Gets one turn of recurring healing static u32 GetSwitchinRecurringHealing(void) { - u32 recurringHealing = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP, ability = gAiLogicData->switchinCandidate.battleMon.ability; - enum ItemHoldEffect holdEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); + u32 recurringHealing = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP; + enum Ability ability = gAiLogicData->switchinCandidate.battleMon.ability; + enum HoldEffect holdEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); // Items if (ability != ABILITY_KLUTZ) @@ -1681,8 +1713,9 @@ static u32 GetSwitchinRecurringHealing(void) // Gets one turn of recurring damage static u32 GetSwitchinRecurringDamage(void) { - u32 passiveDamage = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP, ability = gAiLogicData->switchinCandidate.battleMon.ability; - enum ItemHoldEffect holdEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); + u32 passiveDamage = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP; + enum Ability ability = gAiLogicData->switchinCandidate.battleMon.ability; + enum HoldEffect holdEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); // Items if (ability != ABILITY_MAGIC_GUARD && ability != ABILITY_KLUTZ) @@ -1712,10 +1745,11 @@ static u32 GetSwitchinRecurringDamage(void) // Gets one turn of status damage static u32 GetSwitchinStatusDamage(u32 battler) { - u8 defType1 = gAiLogicData->switchinCandidate.battleMon.types[0], defType2 = gAiLogicData->switchinCandidate.battleMon.types[1]; + enum Type defType1 = gAiLogicData->switchinCandidate.battleMon.types[0], defType2 = gAiLogicData->switchinCandidate.battleMon.types[1]; u8 tSpikesLayers = gSideTimers[GetBattlerSide(battler)].toxicSpikesAmount; u16 heldItemEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); - u32 status = gAiLogicData->switchinCandidate.battleMon.status1, ability = gAiLogicData->switchinCandidate.battleMon.ability, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP; + u32 status = gAiLogicData->switchinCandidate.battleMon.status1; + enum Ability ability = gAiLogicData->switchinCandidate.battleMon.ability, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP; u32 statusDamage = 0; // Status condition damage @@ -1723,7 +1757,7 @@ static u32 GetSwitchinStatusDamage(u32 battler) { if (status & STATUS1_BURN) { - if (B_BURN_DAMAGE >= GEN_7) + if (GetConfig(CONFIG_BURN_DAMAGE) >= GEN_7) statusDamage = maxHP / 16; else statusDamage = maxHP / 8; @@ -1734,7 +1768,7 @@ static u32 GetSwitchinStatusDamage(u32 battler) } else if (status & STATUS1_FROSTBITE) { - if (B_BURN_DAMAGE >= GEN_7) + if (GetConfig(CONFIG_BURN_DAMAGE) >= GEN_7) statusDamage = maxHP / 16; else statusDamage = maxHP / 8; @@ -1791,17 +1825,17 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) u32 recurringDamage = GetSwitchinRecurringDamage(); u32 recurringHealing = GetSwitchinRecurringHealing(); u32 statusDamage = GetSwitchinStatusDamage(battler); - u32 hitsToKO = 0, singleUseItemHeal = 0; + u32 hitsToKO = 0; u16 maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP, item = gAiLogicData->switchinCandidate.battleMon.item, heldItemEffect = GetItemHoldEffect(item); u8 weatherDuration = gWishFutureKnock.weatherDuration, holdEffectParam = GetItemHoldEffectParam(item); u32 opposingBattler = GetOppositeBattler(battler); - u32 opposingAbility = gBattleMons[opposingBattler].ability, ability = gAiLogicData->switchinCandidate.battleMon.ability; + enum Ability opposingAbility = gAiLogicData->abilities[opposingBattler], ability = gAiLogicData->switchinCandidate.battleMon.ability; bool32 usedSingleUseHealingItem = FALSE, opponentCanBreakMold = IsMoldBreakerTypeAbility(opposingBattler, opposingAbility); - s32 currentHP = startingHP; + s32 currentHP = startingHP, singleUseItemHeal = 0; // No damage being dealt if ((damageTaken + statusDamage + recurringDamage <= recurringHealing) || damageTaken + statusDamage + recurringDamage == 0) - return startingHP; + return hitsToKO; // Mon fainted to hazards if (startingHP == 0) @@ -1818,16 +1852,16 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) currentHP = currentHP - damageTaken; // One shot prevention effects - if (damageTaken >= maxHP && startingHP == maxHP && (heldItemEffect == HOLD_EFFECT_FOCUS_SASH || (!opponentCanBreakMold && B_STURDY >= GEN_5 && ability == ABILITY_STURDY)) && hitsToKO < 1) + if (damageTaken >= maxHP && startingHP == maxHP && (heldItemEffect == HOLD_EFFECT_FOCUS_SASH || (!opponentCanBreakMold && GetConfig(CONFIG_STURDY) >= GEN_5 && ability == ABILITY_STURDY)) && hitsToKO < 1) currentHP = 1; // If mon is still alive, apply weather impact first, as it might KO the mon before it can heal with its item (order is weather -> item -> status) - if (currentHP != 0) + if (currentHP > 0) currentHP = currentHP - weatherImpact; // Check if we're at a single use healing item threshold - if (gAiLogicData->switchinCandidate.battleMon.ability != ABILITY_KLUTZ && usedSingleUseHealingItem == FALSE - && !(opposingAbility == ABILITY_UNNERVE && GetPocketByItemId(item) == POCKET_BERRIES)) + if (currentHP > 0 && gAiLogicData->switchinCandidate.battleMon.ability != ABILITY_KLUTZ && usedSingleUseHealingItem == FALSE + && !(opposingAbility == ABILITY_UNNERVE && GetItemPocket(item) == POCKET_BERRIES)) { switch (heldItemEffect) { @@ -1869,7 +1903,7 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) } // Healing from items occurs before status so we can do the rest in one line - if (currentHP >= 0) + if (currentHP > 0) currentHP = currentHP + recurringHealing - recurringDamage - statusDamage; // Recalculate toxic damage if needed @@ -1884,7 +1918,7 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) } // Disguise will always add an extra hit to KO - if (opponentCanBreakMold && gAiLogicData->switchinCandidate.battleMon.species == SPECIES_MIMIKYU_DISGUISED) + if (!opponentCanBreakMold && gAiLogicData->switchinCandidate.battleMon.species == SPECIES_MIMIKYU_DISGUISED) hitsToKO++; // If mon had a hypothetical status from TSpikes, clear it @@ -1896,25 +1930,34 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) return hitsToKO; } -static u16 GetSwitchinTypeMatchup(u32 opposingBattler, struct BattlePokemon battleMon) +static u32 GetBattleMonTypeMatchup(struct BattlePokemon opposingBattleMon, struct BattlePokemon battleMon) { - // Check type matchup - u16 typeEffectiveness = UQ_4_12(1.0); - u8 atkType1 = gSpeciesInfo[gBattleMons[opposingBattler].species].types[0], atkType2 = gSpeciesInfo[gBattleMons[opposingBattler].species].types[1], - defType1 = battleMon.types[0], defType2 = battleMon.types[1]; + u32 typeEffectiveness1 = UQ_4_12(1.0), typeEffectiveness2 = UQ_4_12(1.0); + enum Type atkType1 = opposingBattleMon.types[0], atkType2 = opposingBattleMon.types[1]; + enum Type defType1 = battleMon.types[0], defType2 = battleMon.types[1]; - // Multiply type effectiveness by a factor depending on type matchup - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType1, defType1))); - if (atkType2 != atkType1) - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType2, defType1))); + // Add each independent defensive type matchup together + typeEffectiveness1 = uq4_12_multiply(typeEffectiveness1, (GetTypeModifier(atkType1, defType1))); if (defType2 != defType1) + typeEffectiveness1 = uq4_12_multiply(typeEffectiveness1, (GetTypeModifier(atkType1, defType2))); + if (typeEffectiveness1 == 0) // Immunity + typeEffectiveness1 = UQ_4_12(0.1); + + if (atkType2 != atkType1) { - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType1, defType2))); - if (atkType2 != atkType1) - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType2, defType2))); + typeEffectiveness2 = uq4_12_multiply(typeEffectiveness2, (GetTypeModifier(atkType2, defType1))); + if (defType2 != defType1) + typeEffectiveness2 = uq4_12_multiply(typeEffectiveness2, (GetTypeModifier(atkType2, defType2))); + if (typeEffectiveness2 == 0) // Immunity + typeEffectiveness2 = UQ_4_12(0.1); } - return typeEffectiveness; + else + { + typeEffectiveness2 = typeEffectiveness1; + } + + return typeEffectiveness1 + typeEffectiveness2; } static int GetRandomSwitchinWithBatonPass(int aliveCount, int bits, int firstId, int lastId, int currentMonId) @@ -1937,28 +1980,69 @@ static int GetRandomSwitchinWithBatonPass(int aliveCount, int bits, int firstId, return PARTY_SIZE; } -static s32 GetMaxDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposingBattler, struct BattlePokemon battleMon) +static s32 GetMaxDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposingBattler, struct BattlePokemon battleMon, u32 *bestPlayerMove) +{ + int i = 0; + u32 playerMove; + u16 *playerMoves = GetMovesArray(opposingBattler); + s32 damageTaken = 0, maxDamageTaken = 0; + uq4_12_t effectiveness; + + for (i = 0; i < MAX_MON_MOVES; i++) + { + playerMove = SMART_SWITCHING_OMNISCIENT ? gBattleMons[opposingBattler].moves[i] : playerMoves[i]; + if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH && gBattleMons[opposingBattler].pp[i] > 0) + { + damageTaken = AI_CalcPartyMonDamage(playerMove, opposingBattler, battler, battleMon, &effectiveness, AI_DEFENDING); + if (playerMove == gBattleStruct->choicedMove[opposingBattler]) // If player is choiced, only care about the choice locked move + { + *bestPlayerMove = playerMove; + return damageTaken; + } + if (damageTaken > maxDamageTaken) + { + maxDamageTaken = damageTaken; + *bestPlayerMove = playerMove; + } + } + } + return maxDamageTaken; +} + +static s32 GetMaxPriorityDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposingBattler, struct BattlePokemon battleMon, u32 *bestPlayerPriorityMove) { int i = 0; u32 playerMove; + u16 *playerMoves = GetMovesArray(opposingBattler); s32 damageTaken = 0, maxDamageTaken = 0; + uq4_12_t effectiveness = UQ_4_12(1.0); for (i = 0; i < MAX_MON_MOVES; i++) { - playerMove = gBattleMons[opposingBattler].moves[i]; - if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH) + // If player is choiced into a non-priority move, AI understands that it can't deal priority damage + if (gBattleStruct->choicedMove[opposingBattler] !=MOVE_NONE && GetMovePriority(gBattleStruct->choicedMove[opposingBattler]) < 1) + break; + playerMove = SMART_SWITCHING_OMNISCIENT ? gBattleMons[opposingBattler].moves[i] : playerMoves[i]; + if (GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], playerMove) > 0 + && playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH && gBattleMons[opposingBattler].pp[i] > 0) { - damageTaken = AI_CalcPartyMonDamage(playerMove, opposingBattler, battler, battleMon, AI_DEFENDING); + damageTaken = AI_CalcPartyMonDamage(playerMove, opposingBattler, battler, battleMon, &effectiveness, AI_DEFENDING); if (playerMove == gBattleStruct->choicedMove[opposingBattler]) // If player is choiced, only care about the choice locked move + { + *bestPlayerPriorityMove = playerMove; return damageTaken; + } if (damageTaken > maxDamageTaken) + { maxDamageTaken = damageTaken; + *bestPlayerPriorityMove = playerMove; + } } } return maxDamageTaken; } -static bool32 CanAbilityTrapOpponent(u16 ability, u32 opponent) +static bool32 CanAbilityTrapOpponent(enum Ability ability, u32 opponent) { if ((B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(opponent, TYPE_GHOST))) return FALSE; @@ -1969,7 +2053,7 @@ static bool32 CanAbilityTrapOpponent(u16 ability, u32 opponent) else return TRUE; } - else if (ability == ABILITY_ARENA_TRAP && IsBattlerGrounded(opponent)) + else if (ability == ABILITY_ARENA_TRAP && IsBattlerGrounded(opponent, gAiLogicData->abilities[opponent], gAiLogicData->holdEffects[opponent])) return TRUE; else if (ability == ABILITY_MAGNET_PULL && IS_BATTLER_OF_TYPE(opponent, TYPE_STEEL)) return TRUE; @@ -1990,7 +2074,7 @@ static inline bool32 IsFreeSwitch(enum SwitchType switchType, u32 battlerSwitchi return TRUE; if (gAiLogicData->ejectPackSwitch) { - u32 opposingAbility = AI_GetBattlerAbility(opposingBattler); + enum Ability opposingAbility = GetBattlerAbilityIgnoreMoldBreaker(opposingBattler); // If faster, not a free switch; likely lowered own stats if (!movedSecond && opposingAbility != ABILITY_INTIMIDATE && opposingAbility != ABILITY_SUPERSWEET_SYRUP) // Intimidate triggers switches before turn starts return FALSE; @@ -2008,6 +2092,18 @@ static inline bool32 IsFreeSwitch(enum SwitchType switchType, u32 battlerSwitchi static inline bool32 CanSwitchinWin1v1(u32 hitsToKOAI, u32 hitsToKOPlayer, bool32 isSwitchinFirst, bool32 isFreeSwitch) { + // Player's best move deals 0 damage + if (hitsToKOAI == 0 && hitsToKOPlayer > 0) + return TRUE; + + // AI's best move deals 0 damage + if (hitsToKOPlayer == 0 && hitsToKOAI > 0) + return FALSE; + + // Neither mon can damage the other + if (hitsToKOPlayer == 0 && hitsToKOAI == 0) + return FALSE; + // Free switch, need to outspeed or take 1 extra hit if (isFreeSwitch) { @@ -2024,14 +2120,16 @@ static inline bool32 CanSwitchinWin1v1(u32 hitsToKOAI, u32 hitsToKOPlayer, bool3 // Everything runs in the same loop to minimize computation time. This makes it harder to read, but hopefully the comments can guide you! static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, u32 battler, u32 opposingBattler, u32 battlerIn1, u32 battlerIn2, enum SwitchType switchType) { - int revengeKillerId = PARTY_SIZE, slowRevengeKillerId = PARTY_SIZE, fastThreatenId = PARTY_SIZE, slowThreatenId = PARTY_SIZE, damageMonId = PARTY_SIZE; + int revengeKillerId = PARTY_SIZE, slowRevengeKillerId = PARTY_SIZE, fastThreatenId = PARTY_SIZE, slowThreatenId = PARTY_SIZE, damageMonId = PARTY_SIZE, generic1v1MonId = PARTY_SIZE; int batonPassId = PARTY_SIZE, typeMatchupId = PARTY_SIZE, typeMatchupEffectiveId = PARTY_SIZE, defensiveMonId = PARTY_SIZE, aceMonId = PARTY_SIZE, trapperId = PARTY_SIZE; int i, j, aliveCount = 0, bits = 0, aceMonCount = 0; s32 defensiveMonHitKOThreshold = 3; // 3HKO threshold that candidate defensive mons must exceed - s32 playerMonHP = gBattleMons[opposingBattler].hp, maxDamageDealt = 0, damageDealt = 0; - u32 aiMove, hitsToKOAI, maxHitsToKO = 0; - u16 bestResist = UQ_4_12(1.0), bestResistEffective = UQ_4_12(1.0), typeMatchup; - bool32 isFreeSwitch = IsFreeSwitch(switchType, battlerIn1, opposingBattler), isSwitchinFirst, canSwitchinWin1v1; + s32 playerMonHP = gBattleMons[opposingBattler].hp, maxDamageDealt = 0, damageDealt = 0, monMaxDamage = 0; + u32 aiMove, hitsToKOAI, hitsToKOPlayer, hitsToKOAIPriority, bestPlayerMove = MOVE_NONE, bestPlayerPriorityMove = MOVE_NONE, maxHitsToKO = 0; + u32 bestResist = UQ_4_12(2.0), bestResistEffective = UQ_4_12(2.0), typeMatchup; // 2.0 is the default "Neutral" matchup from GetBattleMonTypeMatchup + bool32 isFreeSwitch = IsFreeSwitch(switchType, battlerIn1, opposingBattler), isSwitchinFirst, isSwitchinFirstPriority, canSwitchinWin1v1; + u32 invalidMons = 0; + uq4_12_t effectiveness = UQ_4_12(1.0); // Iterate through mons for (i = firstId; i < lastId; i++) @@ -2043,6 +2141,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, || i == gBattleStruct->monToSwitchIntoId[battlerIn1] || i == gBattleStruct->monToSwitchIntoId[battlerIn2]) { + invalidMons |= 1u << i; continue; } // Save Ace Pokemon for last @@ -2050,6 +2149,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, { aceMonId = i; aceMonCount++; + invalidMons |= 1u << i; continue; } else @@ -2062,20 +2162,27 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, continue; // Get max number of hits for player to KO AI mon and type matchup for defensive switching - hitsToKOAI = GetSwitchinHitsToKO(GetMaxDamagePlayerCouldDealToSwitchin(battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon), battler); - typeMatchup = GetSwitchinTypeMatchup(opposingBattler, gAiLogicData->switchinCandidate.battleMon); + hitsToKOAI = GetSwitchinHitsToKO(GetMaxDamagePlayerCouldDealToSwitchin(battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, &bestPlayerMove), battler); + hitsToKOAIPriority = GetSwitchinHitsToKO(GetMaxPriorityDamagePlayerCouldDealToSwitchin(battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, &bestPlayerPriorityMove), battler); + typeMatchup = GetBattleMonTypeMatchup(gBattleMons[opposingBattler], gAiLogicData->switchinCandidate.battleMon); + + monMaxDamage = 0; // Check through current mon's moves for (j = 0; j < MAX_MON_MOVES; j++) { - aiMove = gAiLogicData->switchinCandidate.battleMon.moves[j]; + // Check that move has PP remaining before running calcs + if (gAiLogicData->switchinCandidate.battleMon.pp[j] < 1) + continue; - if (aiMove != MOVE_NONE && !IsBattleMoveStatus(aiMove)) - damageDealt = AI_CalcPartyMonDamage(aiMove, battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, AI_ATTACKING); + aiMove = gAiLogicData->switchinCandidate.battleMon.moves[j]; + damageDealt = AI_CalcPartyMonDamage(aiMove, battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, &effectiveness, AI_ATTACKING); + hitsToKOPlayer = GetNoOfHitsToKOBattlerDmg(damageDealt, opposingBattler); // Offensive switchin decisions are based on which whether switchin moves first and whether it can win a 1v1 - isSwitchinFirst = AI_WhoStrikesFirstPartyMon(battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, aiMove); - canSwitchinWin1v1 = CanSwitchinWin1v1(hitsToKOAI, GetNoOfHitsToKOBattlerDmg(damageDealt, opposingBattler), isSwitchinFirst, isFreeSwitch); + isSwitchinFirst = AI_IsPartyMonFaster(battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, aiMove, bestPlayerMove, CONSIDER_PRIORITY); + isSwitchinFirstPriority = AI_IsPartyMonFaster(battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, aiMove, bestPlayerPriorityMove, CONSIDER_PRIORITY); + canSwitchinWin1v1 = CanSwitchinWin1v1(hitsToKOAI, hitsToKOPlayer, isSwitchinFirst, isFreeSwitch) && CanSwitchinWin1v1(hitsToKOAIPriority, hitsToKOPlayer, isSwitchinFirstPriority, isFreeSwitch); // AI must successfully 1v1 with and without priority to be considered a good option // Check for Baton Pass; hitsToKO requirements mean mon can boost and BP without dying whether it's slower or not if (GetMoveEffect(aiMove) == EFFECT_BATON_PASS) @@ -2102,12 +2209,15 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, defensiveMonId = i; } + if (canSwitchinWin1v1) + generic1v1MonId = i; + // Check for mon with resistance and super effective move for best type matchup mon with effective move if (aiMove != MOVE_NONE && !IsBattleMoveStatus(aiMove)) { if (typeMatchup < bestResistEffective) { - if (AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) >= UQ_4_12(2.0)) + if (effectiveness >= UQ_4_12(2.0)) { if (canSwitchinWin1v1) { @@ -2118,9 +2228,13 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, } // If a self destruction move doesn't OHKO, don't factor it into revenge killing - if (GetMoveEffect(aiMove) == EFFECT_EXPLOSION && damageDealt < playerMonHP) + enum BattleMoveEffects aiEffect = GetMoveEffect(aiMove); + if ((aiEffect == EFFECT_EXPLOSION || aiEffect == EFFECT_MISTY_EXPLOSION) + && damageDealt < playerMonHP) continue; + if (damageDealt > monMaxDamage) + monMaxDamage = damageDealt; // Check that mon isn't one shot and set best damage mon if (damageDealt > maxDamageDealt) { @@ -2133,7 +2247,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, // Check if current mon can revenge kill in some capacity // If AI mon can one shot - if (damageDealt > playerMonHP) + if (damageDealt >= playerMonHP) { if (canSwitchinWin1v1) { @@ -2145,7 +2259,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, } // If AI mon can two shot - if (damageDealt > playerMonHP / 2) + if (damageDealt >= (playerMonHP / 2 + playerMonHP % 2)) // Modulo to handle odd numbers in non-decimal division { if (canSwitchinWin1v1) { @@ -2158,12 +2272,14 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, // If mon can trap if ((CanAbilityTrapOpponent(gAiLogicData->switchinCandidate.battleMon.ability, opposingBattler) - || (CanAbilityTrapOpponent(AI_GetBattlerAbility(opposingBattler), opposingBattler) && gAiLogicData->switchinCandidate.battleMon.ability == ABILITY_TRACE)) + || (CanAbilityTrapOpponent(gAiLogicData->abilities[opposingBattler], opposingBattler) && gAiLogicData->switchinCandidate.battleMon.ability == ABILITY_TRACE)) && CountUsablePartyMons(opposingBattler) > 0 && canSwitchinWin1v1) trapperId = i; } } + if (monMaxDamage == 0) + invalidMons |= 1u << i; } batonPassId = GetRandomSwitchinWithBatonPass(aliveCount, bits, firstId, lastId, i); @@ -2180,6 +2296,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, else if (typeMatchupEffectiveId != PARTY_SIZE) return typeMatchupEffectiveId; else if (typeMatchupId != PARTY_SIZE) return typeMatchupId; else if (batonPassId != PARTY_SIZE) return batonPassId; + else if (generic1v1MonId != PARTY_SIZE) return generic1v1MonId; else if (damageMonId != PARTY_SIZE) return damageMonId; } else @@ -2190,10 +2307,19 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, else if (typeMatchupId != PARTY_SIZE) return typeMatchupId; else if (defensiveMonId != PARTY_SIZE) return defensiveMonId; else if (batonPassId != PARTY_SIZE) return batonPassId; + else if (generic1v1MonId != PARTY_SIZE) return generic1v1MonId; } + + if (switchType == SWITCH_MID_BATTLE_OPTIONAL) + return PARTY_SIZE; + + // Fallback + u32 bestMonId = GetFirstNonInvalidMon(firstId, lastId, invalidMons); + if (bestMonId != PARTY_SIZE) + return bestMonId; + // If ace mon is the last available Pokemon and U-Turn/Volt Switch or Eject Pack/Button was used - switch to the mon. - if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount - && (IsSwitchOutEffect(GetMoveEffect(gCurrentMove)) || gAiLogicData->ejectButtonSwitch || gAiLogicData->ejectPackSwitch)) + if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount) return aceMonId; return PARTY_SIZE; @@ -2255,14 +2381,14 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType) GetAIPartyIndexes(battler, &firstId, &lastId); party = GetBattlerParty(battler); - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SEQUENCE_SWITCHING) + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SEQUENCE_SWITCHING) { bestMonId = GetNextMonInParty(party, firstId, lastId, battlerIn1, battlerIn2); return bestMonId; } // Only use better mon selection if AI_FLAG_SMART_MON_CHOICES is set for the trainer. - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_MON_CHOICES && !IsDoubleBattle()) // Double Battles aren't included in AI_FLAG_SMART_MON_CHOICE. Defaults to regular switch in logic + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_MON_CHOICES && !IsDoubleBattle()) // Double Battles aren't included in AI_FLAG_SMART_MON_CHOICE. Defaults to regular switch in logic { bestMonId = GetBestMonIntegrated(party, firstId, lastId, battler, opposingBattler, battlerIn1, battlerIn2, switchType); return bestMonId; @@ -2300,6 +2426,9 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType) if (bestMonId != PARTY_SIZE) return bestMonId; + if (aceMonId != PARTY_SIZE && aliveCount == 0) + return aceMonId; + bestMonId = GetBestMonTypeMatchup(party, firstId, lastId, invalidMons, battler, opposingBattler); if (bestMonId != PARTY_SIZE) return bestMonId; @@ -2308,9 +2437,15 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType) if (bestMonId != PARTY_SIZE) return bestMonId; - // If ace mon is the last available Pokemon and U-Turn/Volt Switch or Eject Pack/Button was used - switch to the mon. - if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount - && (IsSwitchOutEffect(GetMoveEffect(gCurrentMove)) || gAiLogicData->ejectButtonSwitch || gAiLogicData->ejectPackSwitch)) + if (switchType == SWITCH_MID_BATTLE_OPTIONAL) + return PARTY_SIZE; + + // Fallback + bestMonId = GetFirstNonInvalidMon(firstId, lastId, invalidMons); + if (bestMonId != PARTY_SIZE) + return bestMonId; + + if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount) return aceMonId; return PARTY_SIZE; @@ -2326,7 +2461,7 @@ static bool32 AiExpectsToFaintPlayer(u32 battler) if (!IsBattlerAlly(target, battler) && CanIndexMoveFaintTarget(battler, target, gAiBattleData->chosenMoveIndex[battler], AI_ATTACKING) - && AI_IsFaster(battler, target, GetAIChosenMove(battler))) + && AI_IsFaster(battler, target, GetAIChosenMove(battler), GetIncomingMove(battler, target, gAiLogicData), CONSIDER_PRIORITY)) { // We expect to faint the target and move first -> dont use an item return TRUE; @@ -2348,10 +2483,10 @@ static bool32 ShouldUseItem(u32 battler) // If teaming up with player and Pokemon is on the right, or Pokemon is currently held by Sky Drop if ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT) - || gStatuses3[battler] & STATUS3_SKY_DROPPED) + || gBattleMons[battler].volatiles.semiInvulnerable == STATE_SKY_DROP) return FALSE; - if (gStatuses3[battler] & STATUS3_EMBARGO) + if (gBattleMons[battler].volatiles.embargo) return FALSE; if (AiExpectsToFaintPlayer(battler)) @@ -2391,19 +2526,13 @@ static bool32 ShouldUseItem(u32 battler) shouldUse = AI_ShouldHeal(battler, healAmount); break; case EFFECT_ITEM_CURE_STATUS: - if (itemEffects[3] & ITEM3_SLEEP && gBattleMons[battler].status1 & STATUS1_SLEEP) - shouldUse = TRUE; - if (itemEffects[3] & ITEM3_POISON && (gBattleMons[battler].status1 & STATUS1_POISON - || gBattleMons[battler].status1 & STATUS1_TOXIC_POISON)) - shouldUse = TRUE; - if (itemEffects[3] & ITEM3_BURN && gBattleMons[battler].status1 & STATUS1_BURN) - shouldUse = TRUE; - if (itemEffects[3] & ITEM3_FREEZE && (gBattleMons[battler].status1 & STATUS1_FREEZE || gBattleMons[battler].status1 & STATUS1_FROSTBITE)) - shouldUse = TRUE; - if (itemEffects[3] & ITEM3_PARALYSIS && gBattleMons[battler].status1 & STATUS1_PARALYSIS) - shouldUse = TRUE; - if (itemEffects[3] & ITEM3_CONFUSION && gBattleMons[battler].status2 & STATUS2_CONFUSION) - shouldUse = TRUE; + if ((itemEffects[3] & ITEM3_SLEEP && gBattleMons[battler].status1 & STATUS1_SLEEP) + || (itemEffects[3] & ITEM3_POISON && gBattleMons[battler].status1 & STATUS1_PSN_ANY) + || (itemEffects[3] & ITEM3_BURN && gBattleMons[battler].status1 & STATUS1_BURN) + || (itemEffects[3] & ITEM3_FREEZE && gBattleMons[battler].status1 & STATUS1_ICY_ANY) + || (itemEffects[3] & ITEM3_PARALYSIS && gBattleMons[battler].status1 & STATUS1_PARALYSIS) + || (itemEffects[3] & ITEM3_CONFUSION && gBattleMons[battler].volatiles.confusionTurns > 0)) + shouldUse = ShouldCureStatusWithItem(battler, battler, gAiLogicData); break; case EFFECT_ITEM_INCREASE_STAT: case EFFECT_ITEM_INCREASE_ALL_STATS: @@ -2414,7 +2543,8 @@ static bool32 ShouldUseItem(u32 battler) break; case EFFECT_ITEM_SET_FOCUS_ENERGY: if (!gDisableStructs[battler].isFirstTurn - || gBattleMons[battler].status2 & STATUS2_FOCUS_ENERGY_ANY + || gBattleMons[battler].volatiles.dragonCheer + || gBattleMons[battler].volatiles.focusEnergy || AI_OpponentCanFaintAiWithMod(battler, 0)) break; shouldUse = TRUE; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 93801927bdad..20ebfdb27f00 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -3,6 +3,7 @@ #include "malloc.h" #include "battle.h" #include "battle_anim.h" +#include "battle_ai_field_statuses.h" #include "battle_ai_util.h" #include "battle_ai_main.h" #include "battle_ai_switch_items.h" @@ -19,11 +20,24 @@ #include "constants/abilities.h" #include "constants/battle_ai.h" #include "constants/battle_move_effects.h" -#include "constants/hold_effects.h" #include "constants/moves.h" #include "constants/items.h" +static u32 GetAIEffectGroup(enum BattleMoveEffects effect); +static u32 GetAIEffectGroupFromMove(u32 battler, u32 move); + // Functions +static u32 AI_GetMoldBreakerSanitizedAbility(u32 battlerAtk, enum Ability abilityAtk, enum Ability abilityDef, u32 holdEffectDef, u32 move) +{ + if (MoveIgnoresTargetAbility(move)) + return ABILITY_NONE; + + if (holdEffectDef != HOLD_EFFECT_ABILITY_SHIELD && IsMoldBreakerTypeAbility(battlerAtk, abilityAtk)) + return ABILITY_NONE; + + return abilityDef; +} + static bool32 AI_IsDoubleSpreadMove(u32 battlerAtk, u32 move) { u32 numOfTargets = 0; @@ -50,6 +64,11 @@ static bool32 AI_IsDoubleSpreadMove(u32 battlerAtk, u32 move) return FALSE; } +bool32 AI_IsBattlerGrounded(u32 battler) +{ + return IsBattlerGrounded(battler, gAiLogicData->abilities[battler], gAiLogicData->holdEffects[battler]); +} + u32 AI_GetDamage(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcContext calcContext, struct AiLogicData *aiData) { if (calcContext == AI_ATTACKING && BattlerHasAi(battlerAtk)) @@ -75,14 +94,24 @@ u32 AI_GetDamage(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcC } } -bool32 AI_IsFaster(u32 battlerAi, u32 battlerDef, u32 move) +bool32 AI_IsFaster(u32 battlerAi, u32 battlerDef, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority) +{ + return (AI_WhoStrikesFirst(battlerAi, battlerDef, aiMove, playerMove, considerPriority) == AI_IS_FASTER); +} + +bool32 AI_IsSlower(u32 battlerAi, u32 battlerDef, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority) +{ + return (AI_WhoStrikesFirst(battlerAi, battlerDef, aiMove, playerMove, considerPriority) == AI_IS_SLOWER); +} + +bool32 AI_IsPartyMonFaster(u32 battlerAi, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority) { - return (AI_WhoStrikesFirst(battlerAi, battlerDef, move) == AI_IS_FASTER); + return (AI_WhoStrikesFirstPartyMon(battlerAi, battlerDef, switchinCandidate, aiMove, playerMove, considerPriority) == AI_IS_FASTER); } -bool32 AI_IsSlower(u32 battlerAi, u32 battlerDef, u32 move) +bool32 AI_IsPartyMonSlower(u32 battlerAi, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority) { - return (AI_WhoStrikesFirst(battlerAi, battlerDef, move) == AI_IS_SLOWER); + return (AI_WhoStrikesFirstPartyMon(battlerAi, battlerDef, switchinCandidate, aiMove, playerMove, considerPriority) == AI_IS_SLOWER); } u32 GetAIChosenMove(u32 battlerId) @@ -132,6 +161,24 @@ bool32 IsAiBattlerAware(u32 battlerId) return BattlerHasAi(battlerId); } +bool32 IsAiBattlerAssumingStab() +{ + if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_ASSUME_STAB + || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_ASSUME_STAB) + return TRUE; + + return FALSE; +} + +bool32 IsAiBattlerAssumingStatusMoves() +{ + if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_ASSUME_STATUS_MOVES + || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_ASSUME_STATUS_MOVES) + return TRUE; + + return FALSE; +} + bool32 IsAiBattlerPredictingAbility(u32 battlerId) { if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_WEIGH_ABILITY_PREDICTION @@ -141,11 +188,17 @@ bool32 IsAiBattlerPredictingAbility(u32 battlerId) return BattlerHasAi(battlerId); } +bool32 CanAiPredictMove(void) +{ + return gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_PREDICT_MOVE + || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_PREDICT_MOVE; +} + bool32 IsBattlerPredictedToSwitch(u32 battler) { // Check for prediction flag on AI, whether they're using those predictions this turn, and whether the AI thinks the player should switch - if (gAiThinkingStruct->aiFlags[gAiLogicData->battlerDoingPrediction] & AI_FLAG_PREDICT_SWITCH - || gAiThinkingStruct->aiFlags[gAiLogicData->battlerDoingPrediction] & AI_FLAG_PREDICT_SWITCH) + if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_PREDICT_SWITCH + || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_PREDICT_SWITCH) { if (gAiLogicData->predictingSwitch && gAiLogicData->shouldSwitch & (1u << battler)) return TRUE; @@ -156,12 +209,19 @@ bool32 IsBattlerPredictedToSwitch(u32 battler) // Either a predicted move or the last used move from an opposing battler u32 GetIncomingMove(u32 battler, u32 opposingBattler, struct AiLogicData *aiData) { - if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_PREDICT_MOVE && aiData->predictingMove) + if (aiData->predictingMove && CanAiPredictMove()) return aiData->predictedMove[opposingBattler]; - return aiData->lastUsedMove[opposingBattler]; } +// When not predicting, don't want to reference player's previous move; leads to weird behaviour for cases like Fake Out or Protect, especially in doubles +u32 GetIncomingMoveSpeedCheck(u32 battler, u32 opposingBattler, struct AiLogicData *aiData) +{ + if (aiData->predictingMove && CanAiPredictMove()) + return aiData->predictedMove[opposingBattler]; + return MOVE_NONE; +} + void ClearBattlerMoveHistory(u32 battlerId) { memset(gBattleHistory->usedMoves[battlerId], 0, sizeof(gBattleHistory->usedMoves[battlerId])); @@ -200,7 +260,7 @@ void RecordAllMoves(u32 battler) memcpy(gAiPartyData->mons[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].moves, gBattleMons[battler].moves, MAX_MON_MOVES * sizeof(u16)); } -void RecordAbilityBattle(u32 battlerId, u32 abilityId) +void RecordAbilityBattle(u32 battlerId, enum Ability abilityId) { gBattleHistory->abilities[battlerId] = abilityId; gAiPartyData->mons[GetBattlerSide(battlerId)][gBattlerPartyIndexes[battlerId]].ability = abilityId; @@ -211,7 +271,7 @@ void ClearBattlerAbilityHistory(u32 battlerId) gBattleHistory->abilities[battlerId] = ABILITY_NONE; } -void RecordItemEffectBattle(u32 battlerId, u32 itemEffect) +void RecordItemEffectBattle(u32 battlerId, enum HoldEffect itemEffect) { gBattleHistory->itemEffects[battlerId] = itemEffect; gAiPartyData->mons[GetBattlerSide(battlerId)][gBattlerPartyIndexes[battlerId]].heldEffect = itemEffect; @@ -240,6 +300,66 @@ void SaveBattlerData(u32 battlerId) gAiThinkingStruct->saved[battlerId].types[1] = gBattleMons[battlerId].types[1]; } +bool32 ShouldRecordStatusMove(u32 move) +{ + if (ASSUME_STATUS_MOVES_HAS_TUNING) + { + switch (GetMoveEffect(move)) + { + // variable odds by additional effect + case EFFECT_NON_VOLATILE_STATUS: + if (GetMoveNonVolatileStatus(move) == MOVE_EFFECT_SLEEP && RandomPercentage(RNG_AI_ASSUME_STATUS_SLEEP, ASSUME_STATUS_HIGH_ODDS)) + return TRUE; + else if (RandomPercentage(RNG_AI_ASSUME_STATUS_NONVOLATILE, ASSUME_STATUS_MEDIUM_ODDS)) + return TRUE; + break; + // High odds + case EFFECT_AURORA_VEIL: + case EFFECT_CHILLY_RECEPTION: + case EFFECT_FIRST_TURN_ONLY: + case EFFECT_FOLLOW_ME: + case EFFECT_INSTRUCT: + case EFFECT_JUNGLE_HEALING: + case EFFECT_SHED_TAIL: + return RandomPercentage(RNG_AI_ASSUME_STATUS_HIGH_ODDS, ASSUME_STATUS_HIGH_ODDS); + // Medium odds + case EFFECT_AFTER_YOU: + case EFFECT_DOODLE: + case EFFECT_ENCORE: + case EFFECT_HAZE: + case EFFECT_PARTING_SHOT: + case EFFECT_PROTECT: + case EFFECT_REST: + case EFFECT_ROAR: + case EFFECT_ROOST: + case EFFECT_SLEEP_TALK: + case EFFECT_TAUNT: + case EFFECT_TAILWIND: + case EFFECT_TRICK: + case EFFECT_TRICK_ROOM: + // defoggables / screens and hazards + case EFFECT_LIGHT_SCREEN: + case EFFECT_REFLECT: + case EFFECT_SPIKES: + case EFFECT_STEALTH_ROCK: + case EFFECT_STICKY_WEB: + case EFFECT_TOXIC_SPIKES: + return RandomPercentage(RNG_AI_ASSUME_STATUS_MEDIUM_ODDS, ASSUME_STATUS_MEDIUM_ODDS); + // Low odds + case EFFECT_ENTRAINMENT: + case EFFECT_FIXED_PERCENT_DAMAGE: + case EFFECT_GASTRO_ACID: + case EFFECT_IMPRISON: + case EFFECT_TELEPORT: + return RandomPercentage(RNG_AI_ASSUME_STATUS_LOW_ODDS, ASSUME_STATUS_LOW_ODDS); + default: + break; + } + } + + return RandomPercentage(RNG_AI_ASSUME_ALL_STATUS, ASSUME_ALL_STATUS_ODDS) && IsBattleMoveStatus(move); +} + static bool32 ShouldFailForIllusion(u32 illusionSpecies, u32 battlerId) { u32 i, j; @@ -289,11 +409,11 @@ void SetBattlerData(u32 battlerId) if (illusionSpecies != SPECIES_NONE && ShouldFailForIllusion(illusionSpecies, battlerId)) { // If the battler's type has not been changed, AI assumes the types of the illusion mon. - if (gBattleMons[battlerId].types[0] == gSpeciesInfo[species].types[0] - && gBattleMons[battlerId].types[1] == gSpeciesInfo[species].types[1]) + if (gBattleMons[battlerId].types[0] == GetSpeciesType(species, 0) + && gBattleMons[battlerId].types[1] == GetSpeciesType(species, 1)) { - gBattleMons[battlerId].types[0] = gSpeciesInfo[illusionSpecies].types[0]; - gBattleMons[battlerId].types[1] = gSpeciesInfo[illusionSpecies].types[1]; + gBattleMons[battlerId].types[0] = GetSpeciesType(illusionSpecies, 0); + gBattleMons[battlerId].types[1] = GetSpeciesType(illusionSpecies, 1); } species = illusionSpecies; } @@ -302,9 +422,9 @@ void SetBattlerData(u32 battlerId) if (gAiPartyData->mons[side][gBattlerPartyIndexes[battlerId]].ability != ABILITY_NONE) gBattleMons[battlerId].ability = gAiPartyData->mons[side][gBattlerPartyIndexes[battlerId]].ability; // Check if mon can only have one ability. - else if (gSpeciesInfo[species].abilities[1] == ABILITY_NONE - || gSpeciesInfo[species].abilities[1] == gSpeciesInfo[species].abilities[0]) - gBattleMons[battlerId].ability = gSpeciesInfo[species].abilities[0]; + else if (GetSpeciesAbility(species, 1) == ABILITY_NONE + || GetSpeciesAbility(species, 1) == GetSpeciesAbility(species, 0)) + gBattleMons[battlerId].ability = GetSpeciesAbility(species, 0); // The ability is unknown. else gBattleMons[battlerId].ability = ABILITY_NONE; @@ -352,7 +472,7 @@ bool32 AI_BattlerAtMaxHp(u32 battlerId) bool32 AI_CanBattlerEscape(u32 battler) { - enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[battler]; + enum HoldEffect holdEffect = gAiLogicData->holdEffects[battler]; if (B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return TRUE; @@ -364,9 +484,16 @@ bool32 AI_CanBattlerEscape(u32 battler) bool32 IsBattlerTrapped(u32 battlerAtk, u32 battlerDef) { - if (gBattleMons[battlerDef].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED)) + if (AI_CanBattlerEscape(battlerDef)) + return FALSE; + + if (gBattleMons[battlerDef].volatiles.wrapped) + return TRUE; + if (gBattleMons[battlerDef].volatiles.escapePrevention) + return TRUE; + if (gBattleMons[battlerDef].volatiles.semiInvulnerable == STATE_SKY_DROP) return TRUE; - if (gStatuses3[battlerDef] & (STATUS3_ROOTED | STATUS3_SKY_DROPPED)) + if (gBattleMons[battlerDef].volatiles.root) return TRUE; if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) return TRUE; @@ -374,28 +501,32 @@ bool32 IsBattlerTrapped(u32 battlerAtk, u32 battlerDef) && (B_SHADOW_TAG_ESCAPE >= GEN_4 && gAiLogicData->abilities[battlerDef] != ABILITY_SHADOW_TAG)) return TRUE; if (AI_IsAbilityOnSide(battlerAtk, ABILITY_ARENA_TRAP) - && IsBattlerGrounded(battlerAtk)) + && AI_IsBattlerGrounded(battlerAtk)) return TRUE; if (AI_IsAbilityOnSide(battlerAtk, ABILITY_MAGNET_PULL) && IS_BATTLER_OF_TYPE(battlerAtk, TYPE_STEEL)) return TRUE; + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && CountUsablePartyMons(battlerDef) == 0) + return TRUE; + return FALSE; } u32 GetTotalBaseStat(u32 species) { - return gSpeciesInfo[species].baseHP - + gSpeciesInfo[species].baseAttack - + gSpeciesInfo[species].baseDefense - + gSpeciesInfo[species].baseSpeed - + gSpeciesInfo[species].baseSpAttack - + gSpeciesInfo[species].baseSpDefense; + return GetSpeciesBaseHP(species) + + GetSpeciesBaseAttack(species) + + GetSpeciesBaseDefense(species) + + GetSpeciesBaseSpeed(species) + + GetSpeciesBaseSpAttack(species) + + GetSpeciesBaseSpDefense(species); } bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler) { int i; + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAI, opposingBattler, gAiLogicData); for (i = 0; i < MAX_MON_MOVES; i++) { @@ -403,32 +534,49 @@ bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler) enum BattleMoveEffects effect = GetMoveEffect(move); if (effect == EFFECT_PROTECT && move != MOVE_ENDURE) return TRUE; - if (effect == EFFECT_SEMI_INVULNERABLE && AI_IsSlower(battlerAI, opposingBattler, GetAIChosenMove(battlerAI))) + if (effect == EFFECT_SEMI_INVULNERABLE && AI_IsSlower(battlerAI, opposingBattler, GetAIChosenMove(battlerAI), predictedMoveSpeedCheck, CONSIDER_PRIORITY)) return TRUE; } return FALSE; } -// move checks -bool32 IsAffectedByPowder(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) +bool32 Ai_IsPriorityBlocked(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData) { - if (ability == ABILITY_OVERCOAT - || (B_POWDER_GRASS >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GRASS)) - || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES) + s32 atkPriority = GetBattleMovePriority(battlerAtk, aiData->abilities[battlerAtk], move); + + if (atkPriority <= 0 || IsBattlerAlly(battlerAtk, battlerDef)) return FALSE; - return TRUE; + + if (IsMoldBreakerTypeAbility(battlerAtk, aiData->abilities[battlerAtk]) || MoveIgnoresTargetAbility(move)) + return FALSE; + + if (IsDazzlingAbility(aiData->abilities[battlerDef])) + return TRUE; + + if (IsDoubleBattle() && IsDazzlingAbility(aiData->abilities[BATTLE_PARTNER(battlerDef)])) + return TRUE; + + return FALSE; } // This function checks if all physical/special moves are either unusable or unreasonable to use. // Consider a pokemon boosting their attack against a ghost pokemon having only normal-type physical attacks. -bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, u32 category) +bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, enum DamageCategory category) { - s32 i, moveType; u32 usable = 0; u16 *moves = GetMovesArray(attacker); u32 moveLimitations = gAiLogicData->moveLimitations[attacker]; - for (i = 0; i < MAX_MON_MOVES; i++) + struct DamageContext ctx = {0}; + ctx.battlerAtk = attacker; + ctx.battlerDef = target; + ctx.updateFlags = FALSE; + ctx.abilityAtk = gAiLogicData->abilities[attacker]; + ctx.abilityDef = gAiLogicData->abilities[target]; + ctx.holdEffectAtk = gAiLogicData->items[attacker]; + ctx.holdEffectDef = gAiLogicData->items[target]; + + for (u32 i = 0; i < MAX_MON_MOVES; i++) { if (IsMoveUnusable(i, moves[i], moveLimitations)) continue; @@ -436,8 +584,10 @@ bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, u32 category) if (GetBattleMoveCategory(moves[i]) == category) { SetTypeBeforeUsingMove(moves[i], attacker); - moveType = GetBattleMoveType(moves[i]); - if (CalcTypeEffectivenessMultiplier(moves[i], moveType, attacker, target, gAiLogicData->abilities[target], FALSE) != 0) + ctx.move = ctx.chosenMove = moves[i]; + ctx.moveType = GetBattleMoveType(moves[i]); + + if (CalcTypeEffectivenessMultiplier(&ctx)) usable |= 1u << i; } } @@ -446,7 +596,7 @@ bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, u32 category) } // To save computation time this function has 2 variants. One saves, sets and restores battlers, while the other doesn't. -struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, bool32 considerZPower) +struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef) { struct SimulatedDamage dmg; @@ -454,7 +604,7 @@ struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 b SaveBattlerData(battlerDef); SetBattlerData(battlerAtk); SetBattlerData(battlerDef); - dmg = AI_CalcDamage(move, battlerAtk, battlerDef, typeEffectiveness, considerZPower, AI_GetWeather()); + dmg = AI_CalcDamage(move, battlerAtk, battlerDef, typeEffectiveness, considerGimmickAtk, considerGimmickDef, AI_GetWeather()); RestoreBattlerData(battlerAtk); RestoreBattlerData(battlerDef); return dmg; @@ -481,88 +631,89 @@ static inline s32 DmgRoll(s32 dmg) return dmg; } -bool32 IsDamageMoveUnusable(u32 battlerAtk, u32 battlerDef, u32 move, u32 moveType, uq4_12_t effectiveness, u32 weather) +bool32 IsDamageMoveUnusable(struct DamageContext *ctx) { - u32 battlerDefAbility; - u32 partnerDefAbility; + enum Ability battlerDefAbility; + enum Ability partnerDefAbility; struct AiLogicData *aiData = gAiLogicData; - if (effectiveness == UQ_4_12(0.0)) + if (ctx->typeEffectivenessModifier == UQ_4_12(0.0)) return TRUE; - if (gBattleStruct->battlerState[battlerDef].commandingDondozo) + if (gBattleStruct->battlerState[ctx->battlerDef].commandingDondozo) return TRUE; // aiData->abilities does not check for Mold Breaker since it happens during combat so it needs to be done manually - if (IsMoldBreakerTypeAbility(battlerAtk, aiData->abilities[battlerAtk]) || MoveIgnoresTargetAbility(move)) + if (IsMoldBreakerTypeAbility(ctx->battlerAtk, ctx->abilityAtk) || MoveIgnoresTargetAbility(ctx->move)) { battlerDefAbility = ABILITY_NONE; partnerDefAbility = ABILITY_NONE; } else { - battlerDefAbility = aiData->abilities[battlerDef]; - partnerDefAbility = aiData->abilities[BATTLE_PARTNER(battlerDef)]; + battlerDefAbility = ctx->abilityDef; + partnerDefAbility = aiData->abilities[BATTLE_PARTNER(ctx->battlerDef)]; } - if (CanAbilityBlockMove(battlerAtk, battlerDef, aiData->abilities[battlerAtk], battlerDefAbility, move, ABILITY_CHECK_TRIGGER)) + if (Ai_IsPriorityBlocked(ctx->battlerAtk, ctx->battlerDef, ctx->move, aiData)) + return TRUE; + + if (CanAbilityBlockMove(ctx->battlerAtk, ctx->battlerDef, ctx->abilityAtk, battlerDefAbility, ctx->move, AI_CHECK)) return TRUE; - if (CanAbilityAbsorbMove(battlerAtk, battlerDef, battlerDefAbility, move, moveType, ABILITY_CHECK_TRIGGER)) + if (CanAbilityAbsorbMove(ctx->battlerAtk, ctx->battlerDef, battlerDefAbility, ctx->move, ctx->moveType, AI_CHECK)) return TRUE; // Limited to Lighning Rod and Storm Drain because otherwise the AI would consider Water Absorb, etc... if (partnerDefAbility == ABILITY_LIGHTNING_ROD || partnerDefAbility == ABILITY_STORM_DRAIN) { - if (CanAbilityAbsorbMove(battlerAtk, BATTLE_PARTNER(battlerDef), partnerDefAbility, move, moveType, ABILITY_CHECK_TRIGGER)) + if (CanAbilityAbsorbMove(ctx->battlerAtk, BATTLE_PARTNER(ctx->battlerDef), partnerDefAbility, ctx->move, ctx->moveType, AI_CHECK)) return TRUE; } if (HasWeatherEffect()) { - if (weather & B_WEATHER_SUN_PRIMAL && moveType == TYPE_WATER) + if (ctx->weather & B_WEATHER_SUN_PRIMAL && ctx->moveType == TYPE_WATER) return TRUE; - if (weather & B_WEATHER_RAIN_PRIMAL && moveType == TYPE_FIRE) + if (ctx->weather & B_WEATHER_RAIN_PRIMAL && ctx->moveType == TYPE_FIRE) return TRUE; } - switch (GetMoveEffect(move)) + if (IsMoveDampBanned(ctx->move) && (battlerDefAbility == ABILITY_DAMP || partnerDefAbility == ABILITY_DAMP)) + return TRUE; + + switch (GetMoveEffect(ctx->move)) { case EFFECT_DREAM_EATER: - if (!AI_IsBattlerAsleepOrComatose(battlerDef)) + if (!AI_IsBattlerAsleepOrComatose(ctx->battlerDef)) return TRUE; break; case EFFECT_BELCH: - if (IsBelchPreventingMove(battlerAtk, move)) + if (IsBelchPreventingMove(ctx->battlerAtk, ctx->move)) return TRUE; break; case EFFECT_LAST_RESORT: - if (!CanUseLastResort(battlerAtk)) + if (!CanUseLastResort(ctx->battlerAtk) && !IsConsideringZMove(ctx->battlerAtk, ctx->battlerDef, ctx->move)) return TRUE; break; case EFFECT_LOW_KICK: case EFFECT_HEAT_CRASH: - if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) + if (GetActiveGimmick(ctx->battlerDef) == GIMMICK_DYNAMAX) return TRUE; break; case EFFECT_FAIL_IF_NOT_ARG_TYPE: - if (!IS_BATTLER_OF_TYPE(battlerAtk, GetMoveArgType(move))) + if (!IS_BATTLER_OF_TYPE(ctx->battlerAtk, GetMoveArgType(ctx->move))) return TRUE; break; - case EFFECT_HIT_SET_REMOVE_TERRAIN: - if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) && GetMoveEffectArg_MoveProperty(move) == ARG_TRY_REMOVE_TERRAIN_FAIL) + case EFFECT_STEEL_ROLLER: + if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) return TRUE; break; case EFFECT_POLTERGEIST: - if (gAiLogicData->items[battlerDef] == ITEM_NONE || !IsBattlerItemEnabled(battlerDef)) + if (gAiLogicData->items[ctx->battlerDef] == ITEM_NONE || !IsBattlerItemEnabled(ctx->battlerDef)) return TRUE; break; case EFFECT_FIRST_TURN_ONLY: - if (!gDisableStructs[battlerAtk].isFirstTurn) - return TRUE; - break; - case EFFECT_EXPLOSION: - case EFFECT_MIND_BLOWN: - if (battlerDefAbility == ABILITY_DAMP || partnerDefAbility == ABILITY_DAMP) + if (!gDisableStructs[ctx->battlerAtk].isFirstTurn) return TRUE; break; default: @@ -572,6 +723,17 @@ bool32 IsDamageMoveUnusable(u32 battlerAtk, u32 battlerDef, u32 move, u32 moveTy return FALSE; } +bool32 IsAdditionalEffectBlocked(u32 battlerAtk, u32 abilityAtk, u32 battlerDef, u32 abilityDef) +{ + if (gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_COVERT_CLOAK) + return TRUE; + + if (abilityDef == ABILITY_SHIELD_DUST && !IsMoldBreakerTypeAbility(battlerAtk, abilityAtk)) + return TRUE; + + return FALSE; +} + static inline s32 GetDamageByRollType(s32 dmg, enum DamageRollType rollType) { if (rollType == DMG_ROLL_LOWEST) @@ -601,24 +763,23 @@ static inline s32 SetFixedMoveBasePower(u32 battlerAtk, u32 move) return fixedBasePower; } -static inline void AI_StoreBattlerTypes(u32 battlerAtk, u32 *types) +static inline void AI_StoreBattlerTypes(u32 battlerAtk, enum Type *types) { types[0] = gBattleMons[battlerAtk].types[0]; types[1] = gBattleMons[battlerAtk].types[1]; types[2] = gBattleMons[battlerAtk].types[2]; } -static inline void AI_RestoreBattlerTypes(u32 battlerAtk, u32 *types) +static inline void AI_RestoreBattlerTypes(u32 battlerAtk, enum Type *types) { gBattleMons[battlerAtk].types[0] = types[0]; gBattleMons[battlerAtk].types[1] = types[1]; gBattleMons[battlerAtk].types[2] = types[2]; } -static inline void CalcDynamicMoveDamage(struct DamageCalculationData *damageCalcData, u16 *medianDamage, u16 *minimumDamage, u16 *maximumDamage, enum ItemHoldEffect holdEffectAtk, u32 abilityAtk) +static inline void CalcDynamicMoveDamage(struct DamageContext *ctx, u16 *medianDamage, u16 *minimumDamage, u16 *maximumDamage) { - u32 move = damageCalcData->move; - enum BattleMoveEffects effect = GetMoveEffect(move); + enum BattleMoveEffects effect = GetMoveEffect(ctx->move); u16 median = *medianDamage; u16 minimum = *minimumDamage; u16 maximum = *maximumDamage; @@ -626,19 +787,19 @@ static inline void CalcDynamicMoveDamage(struct DamageCalculationData *damageCal switch (effect) { case EFFECT_MULTI_HIT: - if (move == MOVE_WATER_SHURIKEN && gBattleMons[damageCalcData->battlerAtk].species == SPECIES_GRENINJA_ASH) + if (ctx->move == MOVE_WATER_SHURIKEN && gBattleMons[ctx->battlerAtk].species == SPECIES_GRENINJA_ASH) { median *= 3; minimum *= 3; maximum *= 3; } - else if (abilityAtk == ABILITY_SKILL_LINK) + else if (ctx->abilityAtk == ABILITY_SKILL_LINK) { median *= 5; minimum *= 5; maximum *= 5; } - else if (holdEffectAtk == HOLD_EFFECT_LOADED_DICE) + else if (ctx->holdEffectAtk == HOLD_EFFECT_LOADED_DICE) { median *= 9; median /= 2; @@ -654,21 +815,19 @@ static inline void CalcDynamicMoveDamage(struct DamageCalculationData *damageCal break; case EFFECT_ENDEAVOR: // If target has less HP than user, Endeavor does no damage - median = maximum = minimum = max(0, gBattleMons[damageCalcData->battlerDef].hp - gBattleMons[damageCalcData->battlerAtk].hp); - break; - case EFFECT_FINAL_GAMBIT: - median = maximum = minimum = gBattleMons[damageCalcData->battlerAtk].hp; + median = maximum = minimum = max(0, gBattleMons[ctx->battlerDef].hp - gBattleMons[ctx->battlerAtk].hp); break; case EFFECT_BEAT_UP: - if (B_BEAT_UP >= GEN_5) + if (GetConfig(CONFIG_BEAT_UP) >= GEN_5) { - u32 partyCount = CalculatePartyCount(GetBattlerParty(damageCalcData->battlerAtk)); + u32 partyCount = CalculatePartyCount(GetBattlerParty(ctx->battlerAtk)); u32 i; gBattleStruct->beatUpSlot = 0; - damageCalcData->isCrit = FALSE; + ctx->isCrit = FALSE; + ctx->fixedBasePower = 0; median = 0; for (i = 0; i < partyCount; i++) - median += CalculateMoveDamage(damageCalcData, 0); + median += CalculateMoveDamage(ctx); maximum = minimum = median; gBattleStruct->beatUpSlot = 0; } @@ -678,7 +837,7 @@ static inline void CalcDynamicMoveDamage(struct DamageCalculationData *damageCal } // Handle other multi-strike moves - u32 strikeCount = GetMoveStrikeCount(move); + u32 strikeCount = GetMoveStrikeCount(ctx->move); if (strikeCount > 1 && effect != EFFECT_TRIPLE_KICK) { median *= strikeCount; @@ -686,11 +845,11 @@ static inline void CalcDynamicMoveDamage(struct DamageCalculationData *damageCal maximum *= strikeCount; } - if (abilityAtk == ABILITY_PARENTAL_BOND + if (ctx->abilityAtk == ABILITY_PARENTAL_BOND && !strikeCount && effect != EFFECT_TRIPLE_KICK && effect != EFFECT_MULTI_HIT - && !AI_IsDoubleSpreadMove(damageCalcData->battlerAtk, move)) + && !AI_IsDoubleSpreadMove(ctx->battlerAtk, ctx->move)) { median += median / (B_PARENTAL_BOND_DMG >= GEN_7 ? 4 : 2); minimum += minimum / (B_PARENTAL_BOND_DMG >= GEN_7 ? 4 : 2); @@ -714,7 +873,7 @@ static inline bool32 ShouldCalcCritDamage(u32 battlerAtk, u32 battlerDef, u32 mo s32 critChanceIndex = 0; // Get crit chance - if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_1) + if (GetConfig(CONFIG_CRIT_CHANCE) == GEN_1) critChanceIndex = CalcCritChanceStageGen1(battlerAtk, battlerDef, move, FALSE, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], aiData->holdEffects[battlerAtk]); else critChanceIndex = CalcCritChanceStage(battlerAtk, battlerDef, move, FALSE, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], aiData->holdEffects[battlerAtk]); @@ -723,23 +882,22 @@ static inline bool32 ShouldCalcCritDamage(u32 battlerAtk, u32 battlerDef, u32 mo return TRUE; if (critChanceIndex >= RISKY_AI_CRIT_STAGE_THRESHOLD // Not guaranteed but above Risky threshold && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY) - && GetGenConfig(GEN_CONFIG_CRIT_CHANCE) != GEN_1) + && GetConfig(CONFIG_CRIT_CHANCE) != GEN_1) return TRUE; if (critChanceIndex >= RISKY_AI_CRIT_THRESHOLD_GEN_1 // Not guaranteed but above Risky threshold && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY) - && GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_1) + && GetConfig(CONFIG_CRIT_CHANCE) == GEN_1) return TRUE; return FALSE; } -struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, bool32 considerZPower, u32 weather) +struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef, u32 weather) { - struct SimulatedDamage simDamage; - s32 moveType; + struct SimulatedDamage simDamage = {0}; enum BattleMoveEffects moveEffect = GetMoveEffect(move); - uq4_12_t effectivenessMultiplier; bool32 isDamageMoveUnusable = FALSE; - bool32 toggledGimmick = FALSE; + bool32 toggledGimmickAtk = FALSE; + bool32 toggledGimmickDef = FALSE; struct AiLogicData *aiData = gAiLogicData; gAiLogicData->aiCalcInProgress = TRUE; @@ -748,101 +906,91 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u // Temporarily enable gimmicks for damage calcs if planned if (gBattleStruct->gimmick.usableGimmick[battlerAtk] && GetActiveGimmick(battlerAtk) == GIMMICK_NONE - && !(gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_Z_MOVE && !considerZPower)) + && gBattleStruct->gimmick.usableGimmick[battlerAtk] != GIMMICK_NONE && considerGimmickAtk == USE_GIMMICK) { - // Set Z-Move variables if needed - if (gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_Z_MOVE && IsViableZMove(battlerAtk, move)) - gBattleStruct->zmove.baseMoves[battlerAtk] = move; - - toggledGimmick = TRUE; + toggledGimmickAtk = TRUE; SetActiveGimmick(battlerAtk, gBattleStruct->gimmick.usableGimmick[battlerAtk]); } + if (gBattleStruct->gimmick.usableGimmick[battlerDef] && GetActiveGimmick(battlerDef) == GIMMICK_NONE + && gBattleStruct->gimmick.usableGimmick[battlerDef] != GIMMICK_NONE && considerGimmickDef == USE_GIMMICK) + { + toggledGimmickDef = TRUE; + SetActiveGimmick(battlerDef, gBattleStruct->gimmick.usableGimmick[battlerDef]); + } + SetDynamicMoveCategory(battlerAtk, battlerDef, move); SetTypeBeforeUsingMove(move, battlerAtk); - moveType = GetBattleMoveType(move); - effectivenessMultiplier = CalcTypeEffectivenessMultiplier(move, moveType, battlerAtk, battlerDef, aiData->abilities[battlerDef], FALSE); + + // We can set those globals because they are going to get rerolled on attack execution + gBattleStruct->magnitudeBasePower = 70; + gBattleStruct->presentBasePower = 80; + + struct DamageContext ctx = {0}; + ctx.battlerAtk = battlerAtk; + ctx.battlerDef = battlerDef; + ctx.move = ctx.chosenMove = move; + ctx.moveType = GetBattleMoveType(move); + ctx.isCrit = ShouldCalcCritDamage(battlerAtk, battlerDef, move, aiData); + ctx.randomFactor = FALSE; + ctx.updateFlags = FALSE; + ctx.weather = weather; + ctx.fixedBasePower = SetFixedMoveBasePower(battlerAtk, move); + ctx.holdEffectAtk = aiData->holdEffects[battlerAtk]; + ctx.holdEffectDef = aiData->holdEffects[battlerDef]; + ctx.abilityAtk = aiData->abilities[battlerAtk]; + ctx.abilityDef = AI_GetMoldBreakerSanitizedAbility(battlerAtk, ctx.abilityAtk, aiData->abilities[battlerDef], ctx.holdEffectDef, move); + ctx.typeEffectivenessModifier = CalcTypeEffectivenessMultiplier(&ctx); u32 movePower = GetMovePower(move); if (movePower) - isDamageMoveUnusable = IsDamageMoveUnusable(battlerAtk, battlerDef, move, moveType, effectivenessMultiplier, weather); + isDamageMoveUnusable = IsDamageMoveUnusable(&ctx); if (movePower && !isDamageMoveUnusable) { - u32 types[3]; + enum Type types[3]; AI_StoreBattlerTypes(battlerAtk, types); + ProteanTryChangeType(battlerAtk, aiData->abilities[battlerAtk], move, ctx.moveType); - ProteanTryChangeType(battlerAtk, aiData->abilities[battlerAtk], move, moveType); - s32 fixedBasePower = SetFixedMoveBasePower(battlerAtk, move); - - struct DamageCalculationData damageCalcData; - damageCalcData.battlerAtk = battlerAtk; - damageCalcData.battlerDef = battlerDef; - damageCalcData.move = move; - damageCalcData.moveType = moveType; - damageCalcData.isCrit = ShouldCalcCritDamage(battlerAtk, battlerDef, move, aiData); - damageCalcData.randomFactor = FALSE; - damageCalcData.updateFlags = FALSE; - - if (moveEffect == EFFECT_TRIPLE_KICK) + s32 fixedDamage = DoFixedDamageMoveCalc(&ctx); + if (fixedDamage != INT32_MAX) + { + simDamage.minimum = simDamage.median = simDamage.maximum = fixedDamage; + } + else if (moveEffect == EFFECT_TRIPLE_KICK) { for (gMultiHitCounter = GetMoveStrikeCount(move); gMultiHitCounter > 0; gMultiHitCounter--) // The global is used to simulate actual damage done { s32 damageByRollType = 0; - s32 oneTripleKickHit = CalculateMoveDamageVars(&damageCalcData, fixedBasePower, - effectivenessMultiplier, weather, - aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef], - aiData->abilities[battlerAtk], aiData->abilities[battlerDef]); + s32 oneTripleKickHit = CalculateMoveDamageVars(&ctx); damageByRollType = GetDamageByRollType(oneTripleKickHit, DMG_ROLL_LOWEST); - simDamage.minimum += ApplyModifiersAfterDmgRoll(damageByRollType, &damageCalcData, effectivenessMultiplier, - aiData->abilities[battlerAtk], aiData->abilities[battlerDef], - aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef]); + simDamage.minimum += ApplyModifiersAfterDmgRoll(&ctx, damageByRollType); damageByRollType = GetDamageByRollType(oneTripleKickHit, DMG_ROLL_DEFAULT); - simDamage.median += ApplyModifiersAfterDmgRoll(damageByRollType, &damageCalcData, effectivenessMultiplier, - aiData->abilities[battlerAtk], aiData->abilities[battlerDef], - aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef]); + simDamage.median += ApplyModifiersAfterDmgRoll(&ctx, damageByRollType); damageByRollType = GetDamageByRollType(oneTripleKickHit, DMG_ROLL_HIGHEST); - simDamage.maximum += ApplyModifiersAfterDmgRoll(damageByRollType, &damageCalcData, effectivenessMultiplier, - aiData->abilities[battlerAtk], aiData->abilities[battlerDef], - aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef]); + simDamage.maximum += ApplyModifiersAfterDmgRoll(&ctx, damageByRollType); } } else { - u32 damage = CalculateMoveDamageVars(&damageCalcData, fixedBasePower, - effectivenessMultiplier, weather, - aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef], - aiData->abilities[battlerAtk], aiData->abilities[battlerDef]); + u32 damage = CalculateMoveDamageVars(&ctx); simDamage.minimum = GetDamageByRollType(damage, DMG_ROLL_LOWEST); - simDamage.minimum = ApplyModifiersAfterDmgRoll(simDamage.minimum, &damageCalcData, effectivenessMultiplier, - aiData->abilities[battlerAtk], aiData->abilities[battlerDef], - aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef]); + simDamage.minimum = ApplyModifiersAfterDmgRoll(&ctx, simDamage.minimum); simDamage.median = GetDamageByRollType(damage, DMG_ROLL_DEFAULT); - simDamage.median = ApplyModifiersAfterDmgRoll(simDamage.median, &damageCalcData, effectivenessMultiplier, - aiData->abilities[battlerAtk], aiData->abilities[battlerDef], - aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef]); - + simDamage.median = ApplyModifiersAfterDmgRoll(&ctx, simDamage.median); + simDamage.maximum = GetDamageByRollType(damage, DMG_ROLL_HIGHEST); - simDamage.maximum = ApplyModifiersAfterDmgRoll(simDamage.maximum, &damageCalcData, effectivenessMultiplier, - aiData->abilities[battlerAtk], aiData->abilities[battlerDef], - aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef]); + simDamage.maximum = ApplyModifiersAfterDmgRoll(&ctx, simDamage.maximum); } if (GetActiveGimmick(battlerAtk) != GIMMICK_Z_MOVE) - { - CalcDynamicMoveDamage(&damageCalcData, - &simDamage.median, - &simDamage.minimum, - &simDamage.maximum, - aiData->holdEffects[battlerAtk], - aiData->abilities[battlerAtk]); - } + CalcDynamicMoveDamage(&ctx, &simDamage.median, &simDamage.minimum, &simDamage.maximum); AI_RestoreBattlerTypes(battlerAtk, types); } @@ -854,21 +1002,22 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u } // convert multiper to AI_EFFECTIVENESS_xX - *typeEffectiveness = effectivenessMultiplier; + *typeEffectiveness = ctx.typeEffectivenessModifier; // Undo temporary settings gBattleStruct->dynamicMoveType = 0; gBattleStruct->swapDamageCategory = FALSE; - gBattleStruct->zmove.baseMoves[battlerAtk] = MOVE_NONE; - if (toggledGimmick) + if (toggledGimmickAtk) SetActiveGimmick(battlerAtk, GIMMICK_NONE); + if (toggledGimmickDef) + SetActiveGimmick(battlerDef, GIMMICK_NONE); gAiLogicData->aiCalcInProgress = FALSE; return simDamage; } bool32 AI_IsDamagedByRecoil(u32 battler) { - u32 ability = gAiLogicData->abilities[battler]; + enum Ability ability = gAiLogicData->abilities[battler]; if (ability == ABILITY_MAGIC_GUARD || ability == ABILITY_ROCK_HEAD) return FALSE; return TRUE; @@ -878,8 +1027,11 @@ bool32 AI_IsDamagedByRecoil(u32 battler) static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s32 noOfHitsToKo) { u32 i; - u32 abilityDef = gAiLogicData->abilities[battlerDef]; - u32 abilityAtk = gAiLogicData->abilities[battlerAtk]; + enum Ability abilityDef = gAiLogicData->abilities[battlerDef]; + enum Ability abilityAtk = gAiLogicData->abilities[battlerAtk]; + + if (IsSheerForceAffected(move, abilityAtk)) + return FALSE; switch (GetMoveEffect(move)) { @@ -909,6 +1061,49 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 { switch (additionalEffect->moveEffect) { + case MOVE_EFFECT_ATK_MINUS_1: + case MOVE_EFFECT_ATK_MINUS_2: + if (abilityAtk == ABILITY_CONTRARY && BattlerStatCanRise(battlerAtk, abilityAtk, STAT_ATK)) + return TRUE; + break; + case MOVE_EFFECT_DEF_MINUS_1: + case MOVE_EFFECT_DEF_MINUS_2: + if (abilityAtk == ABILITY_CONTRARY && BattlerStatCanRise(battlerAtk, abilityAtk, STAT_ATK)) + return TRUE; + break; + case MOVE_EFFECT_SPD_MINUS_1: + case MOVE_EFFECT_SPD_MINUS_2: + if (abilityAtk == ABILITY_CONTRARY && BattlerStatCanRise(battlerAtk, abilityAtk, STAT_DEF)) + return TRUE; + break; + case MOVE_EFFECT_SP_ATK_MINUS_1: + case MOVE_EFFECT_SP_ATK_MINUS_2: + if (abilityAtk == ABILITY_CONTRARY && BattlerStatCanRise(battlerAtk, abilityAtk, STAT_SPATK)) + return TRUE; + break; + case MOVE_EFFECT_SP_DEF_MINUS_1: + case MOVE_EFFECT_SP_DEF_MINUS_2: + if (abilityAtk == ABILITY_CONTRARY && BattlerStatCanRise(battlerAtk, abilityAtk, STAT_SPDEF)) + return TRUE; + break; + case MOVE_EFFECT_EVS_MINUS_1: + case MOVE_EFFECT_EVS_MINUS_2: + if (abilityAtk == ABILITY_CONTRARY && BattlerStatCanRise(battlerAtk, abilityAtk, STAT_EVASION)) + return TRUE; + break; + case MOVE_EFFECT_ACC_MINUS_1: + case MOVE_EFFECT_ACC_MINUS_2: + if (abilityAtk == ABILITY_CONTRARY && BattlerStatCanRise(battlerAtk, abilityAtk, STAT_ACC)) + return TRUE; + break; + case MOVE_EFFECT_ATK_DEF_DOWN: + if (abilityAtk == ABILITY_CONTRARY && (BattlerStatCanRise(battlerAtk, abilityAtk, STAT_ATK) || BattlerStatCanRise(battlerAtk, abilityAtk, STAT_DEF))) + return TRUE; + break; + case MOVE_EFFECT_DEF_SPDEF_DOWN: + if (abilityAtk == ABILITY_CONTRARY && (BattlerStatCanRise(battlerAtk, abilityAtk, STAT_DEF) || BattlerStatCanRise(battlerAtk, abilityAtk, STAT_SPDEF))) + return TRUE; + break; case MOVE_EFFECT_ATK_PLUS_1: case MOVE_EFFECT_ATK_PLUS_2: if (BattlerStatCanRise(battlerAtk, abilityAtk, STAT_ATK)) @@ -946,10 +1141,15 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 return TRUE; } break; + default: + break; } } else // consider move effects that hinder the target { + if (IsAdditionalEffectBlocked(battlerAtk, abilityAtk, battlerDef, abilityDef)) + continue; + switch (additionalEffect->moveEffect) { case MOVE_EFFECT_POISON: @@ -984,7 +1184,7 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 case MOVE_EFFECT_SP_DEF_MINUS_1: case MOVE_EFFECT_ACC_MINUS_1: case MOVE_EFFECT_EVS_MINUS_1: - if (ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK + (additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_1)) && noOfHitsToKo != 1) + if (CanLowerStat(battlerAtk, battlerDef, gAiLogicData, STAT_ATK + (additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_1)) && noOfHitsToKo > 1) return TRUE; break; case MOVE_EFFECT_ATK_MINUS_2: @@ -994,9 +1194,11 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 case MOVE_EFFECT_SP_DEF_MINUS_2: case MOVE_EFFECT_ACC_MINUS_2: case MOVE_EFFECT_EVS_MINUS_2: - if (ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK + (additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_2)) && noOfHitsToKo != 1) + if (CanLowerStat(battlerAtk, battlerDef, gAiLogicData, STAT_ATK + (additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_2)) && noOfHitsToKo > 1) return TRUE; break; + default: + break; } } } @@ -1006,16 +1208,16 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s32 noOfHitsToKo) { - u32 abilityAtk = gAiLogicData->abilities[battlerAtk]; - u32 abilityDef = gAiLogicData->abilities[battlerDef]; + enum Ability abilityAtk = gAiLogicData->abilities[battlerAtk]; + enum Ability abilityDef = gAiLogicData->abilities[battlerDef]; u8 i; switch (GetMoveEffect(move)) { case EFFECT_MAX_HP_50_RECOIL: - case EFFECT_MIND_BLOWN: case EFFECT_CHLOROBLAST: case EFFECT_EXPLOSION: + case EFFECT_MISTY_EXPLOSION: case EFFECT_FINAL_GAMBIT: return TRUE; case EFFECT_RECOIL: @@ -1049,7 +1251,7 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s case MOVE_EFFECT_ATK_DEF_DOWN: case MOVE_EFFECT_DEF_SPDEF_DOWN: if ((additionalEffect->self && abilityAtk != ABILITY_CONTRARY) - || (noOfHitsToKo != 1 && abilityDef == ABILITY_CONTRARY && !DoesBattlerIgnoreAbilityChecks(battlerAtk, abilityAtk, move))) + || (noOfHitsToKo > 1 && !additionalEffect->self && abilityDef == ABILITY_CONTRARY && !DoesBattlerIgnoreAbilityChecks(battlerAtk, abilityAtk, move))) return TRUE; break; case MOVE_EFFECT_RECHARGE: @@ -1070,9 +1272,11 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s case MOVE_EFFECT_ACC_PLUS_2: case MOVE_EFFECT_ALL_STATS_UP: if ((additionalEffect->self && abilityAtk == ABILITY_CONTRARY) - || (noOfHitsToKo != 1 && !(abilityDef == ABILITY_CONTRARY && !DoesBattlerIgnoreAbilityChecks(battlerAtk, abilityAtk, move)))) + || (noOfHitsToKo > 1 && !additionalEffect->self && !(abilityDef == ABILITY_CONTRARY && !DoesBattlerIgnoreAbilityChecks(battlerAtk, abilityAtk, move)))) return TRUE; break; + default: + break; } } break; @@ -1082,11 +1286,11 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s } // Checks if one of the moves has side effects or perks, assuming equal dmg or equal no of hits to KO -s32 AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo) +enum MoveComparisonResult AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo) { bool32 effect1, effect2; - u32 defAbility = gAiLogicData->abilities[battlerDef]; - u32 atkAbility = gAiLogicData->abilities[battlerAtk]; + enum Ability defAbility = gAiLogicData->abilities[battlerDef]; + enum Ability atkAbility = gAiLogicData->abilities[battlerAtk]; // Check if physical moves hurt. if (gAiLogicData->holdEffects[battlerAtk] != HOLD_EFFECT_PROTECTIVE_PADS && atkAbility != ABILITY_LONG_REACH @@ -1096,27 +1300,27 @@ s32 AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 bool32 moveContact1 = MoveMakesContact(move1); bool32 moveContact2 = MoveMakesContact(move2); if (moveContact1 && !moveContact2) - return -1; + return MOVE_LOST_COMPARISON; if (moveContact2 && !moveContact1) - return 1; + return MOVE_WON_COMPARISON; } // Check additional effects. effect1 = AI_IsMoveEffectInMinus(battlerAtk, battlerDef, move1, noOfHitsToKo); effect2 = AI_IsMoveEffectInMinus(battlerAtk, battlerDef, move2, noOfHitsToKo); if (effect2 && !effect1) - return 1; + return MOVE_WON_COMPARISON; if (effect1 && !effect2) - return -1; + return MOVE_LOST_COMPARISON; effect1 = AI_IsMoveEffectInPlus(battlerAtk, battlerDef, move1, noOfHitsToKo); effect2 = AI_IsMoveEffectInPlus(battlerAtk, battlerDef, move2, noOfHitsToKo); if (effect2 && !effect1) - return -1; + return MOVE_LOST_COMPARISON; if (effect1 && !effect2) - return 1; + return MOVE_WON_COMPARISON; - return 0; + return MOVE_NEUTRAL_COMPARISON; } u32 GetNoOfHitsToKO(u32 dmg, s32 hp) @@ -1136,6 +1340,29 @@ u32 GetNoOfHitsToKOBattler(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum D return GetNoOfHitsToKOBattlerDmg(AI_GetDamage(battlerAtk, battlerDef, moveIndex, calcContext, gAiLogicData), battlerDef); } +u32 GetBestNoOfHitsToKO(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext) +{ + u32 result = 100; + u32 tempResult = 0; + + struct AiLogicData *aiData = gAiLogicData; + s32 moveIndex; + u16 *moves = GetMovesArray(battlerAtk); + u32 moveLimitations = aiData->moveLimitations[battlerAtk]; + + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + if (IsMoveUnusable(moveIndex, moves[moveIndex], moveLimitations)) + continue; + + tempResult = GetNoOfHitsToKOBattler(battlerAtk, battlerDef, moveIndex, calcContext); + if (tempResult != 0 && tempResult < result) + result = tempResult; + } + + return result; +} + u32 GetCurrDamageHpPercent(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext) { int bestDmg = AI_GetDamage(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, calcContext, gAiLogicData); @@ -1146,7 +1373,6 @@ u32 GetCurrDamageHpPercent(u32 battlerAtk, u32 battlerDef, enum DamageCalcContex uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) { uq4_12_t typeEffectiveness; - u32 moveType; SaveBattlerData(battlerAtk); SaveBattlerData(battlerDef); @@ -1156,8 +1382,17 @@ uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) gBattleStruct->dynamicMoveType = 0; SetTypeBeforeUsingMove(move, battlerAtk); - moveType = GetBattleMoveType(move); - typeEffectiveness = CalcTypeEffectivenessMultiplier(move, moveType, battlerAtk, battlerDef, gAiLogicData->abilities[battlerDef], FALSE); + struct DamageContext ctx = {0}; + ctx.battlerAtk = battlerAtk; + ctx.battlerDef = battlerDef; + ctx.move = ctx.chosenMove = move; + ctx.moveType = GetBattleMoveType(move); + ctx.updateFlags = FALSE; + ctx.abilityAtk = gAiLogicData->abilities[battlerAtk]; + ctx.abilityDef = gAiLogicData->abilities[battlerDef]; + ctx.holdEffectAtk = gAiLogicData->items[battlerAtk]; + ctx.holdEffectDef = gAiLogicData->items[battlerDef]; + typeEffectiveness = CalcTypeEffectivenessMultiplier(&ctx); RestoreBattlerData(battlerAtk); RestoreBattlerData(battlerDef); @@ -1171,26 +1406,27 @@ uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) * AI_IS_FASTER: is user(ai) faster * AI_IS_SLOWER: is target faster */ -s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler, u32 moveConsidered) +s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler, u32 aiMoveConsidered, u32 playerMoveConsidered, enum ConsiderPriority considerPriority) { u32 speedBattlerAI, speedBattler; - enum ItemHoldEffect holdEffectAI = gAiLogicData->holdEffects[battlerAI]; - enum ItemHoldEffect holdEffectPlayer = gAiLogicData->holdEffects[battler]; - u32 abilityAI = gAiLogicData->abilities[battlerAI]; - u32 abilityPlayer = gAiLogicData->abilities[battler]; - - u32 predictedMove = GetIncomingMove(battlerAI, battler, gAiLogicData); + enum HoldEffect holdEffectAI = gAiLogicData->holdEffects[battlerAI]; + enum HoldEffect holdEffectPlayer = gAiLogicData->holdEffects[battler]; + enum Ability abilityAI = gAiLogicData->abilities[battlerAI]; + enum Ability abilityPlayer = gAiLogicData->abilities[battler]; - s8 aiPriority = GetBattleMovePriority(battlerAI, abilityAI, moveConsidered); - s8 playerPriority = GetBattleMovePriority(battler, abilityPlayer, predictedMove); + if (considerPriority == CONSIDER_PRIORITY) + { + s8 aiPriority = GetBattleMovePriority(battlerAI, abilityAI, aiMoveConsidered); + s8 playerPriority = GetBattleMovePriority(battler, abilityPlayer, playerMoveConsidered); - if (aiPriority > playerPriority) - return AI_IS_FASTER; - else if (aiPriority < playerPriority) - return AI_IS_SLOWER; + if (aiPriority > playerPriority) + return AI_IS_FASTER; + else if (aiPriority < playerPriority) + return AI_IS_SLOWER; + } - speedBattlerAI = GetBattlerTotalSpeedStatArgs(battlerAI, abilityAI, holdEffectAI); - speedBattler = GetBattlerTotalSpeedStatArgs(battler, abilityPlayer, holdEffectPlayer); + speedBattlerAI = GetBattlerTotalSpeedStat(battlerAI, abilityAI, holdEffectAI); + speedBattler = GetBattlerTotalSpeedStat(battler, abilityPlayer, holdEffectPlayer); if (holdEffectAI == HOLD_EFFECT_LAGGING_TAIL && holdEffectPlayer != HOLD_EFFECT_LAGGING_TAIL) return AI_IS_SLOWER; @@ -1224,21 +1460,21 @@ s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler, u32 moveConsidered) return AI_IS_SLOWER; } -static bool32 CanEndureHit(u32 battler, u32 battlerTarget, u32 move) +bool32 CanEndureHit(u32 battler, u32 battlerTarget, u32 move) { enum BattleMoveEffects effect = GetMoveEffect(move); - if (!AI_BattlerAtMaxHp(battlerTarget) || effect == EFFECT_MULTI_HIT) + if (!AI_BattlerAtMaxHp(battlerTarget) || effect == EFFECT_MULTI_HIT || gAiLogicData->abilities[battler] == ABILITY_PARENTAL_BOND) return FALSE; - if (GetMoveStrikeCount(move) > 1 && !(effect == EFFECT_DRAGON_DARTS && IsValidDoubleBattle(battlerTarget))) + if (GetMoveStrikeCount(move) > 1 && !(effect == EFFECT_DRAGON_DARTS && !HasTwoOpponents(battler))) return FALSE; if (gAiLogicData->holdEffects[battlerTarget] == HOLD_EFFECT_FOCUS_SASH) return TRUE; if (!DoesBattlerIgnoreAbilityChecks(battler, gAiLogicData->abilities[battler], move)) { - if (B_STURDY >= GEN_5 && gAiLogicData->abilities[battlerTarget] == ABILITY_STURDY) + if (GetConfig(CONFIG_STURDY) >= GEN_5 && gAiLogicData->abilities[battlerTarget] == ABILITY_STURDY) return TRUE; - if (gBattleMons[battlerTarget].species == SPECIES_MIMIKYU_DISGUISED) + if (IsMimikyuDisguised(battlerTarget)) return TRUE; } @@ -1266,7 +1502,7 @@ bool32 CanTargetFaintAi(u32 battlerDef, u32 battlerAtk) return FALSE; } -u32 NoOfHitsForTargetToFaintAI(u32 battlerDef, u32 battlerAtk) +u32 NoOfHitsForTargetToFaintBattler(u32 battlerDef, u32 battlerAtk) { u32 i; u32 currNumberOfHits; @@ -1284,6 +1520,32 @@ u32 NoOfHitsForTargetToFaintAI(u32 battlerDef, u32 battlerAtk) return leastNumberOfHits; } +u32 NoOfHitsForTargetToFaintBattlerWithMod(u32 battlerDef, u32 battlerAtk, s32 hpMod) +{ + u32 i; + u32 currNumberOfHits; + u32 leastNumberOfHits = UNKNOWN_NO_OF_HITS; + u32 hpCheck = gBattleMons[battlerAtk].hp + hpMod; + u32 damageDealt = 0; + + if (hpCheck > gBattleMons[battlerAtk].maxHP) + hpCheck = gBattleMons[battlerAtk].maxHP; + + for (i = 0; i < MAX_MON_MOVES; i++) + { + damageDealt = AI_GetDamage(battlerDef, battlerAtk, i, AI_DEFENDING, gAiLogicData); + if (damageDealt == 0) + continue; + currNumberOfHits = hpCheck / (damageDealt + 1) + 1; + if (currNumberOfHits != 0) + { + if (currNumberOfHits < leastNumberOfHits) + leastNumberOfHits = currNumberOfHits; + } + } + return leastNumberOfHits; +} + u32 GetBestDmgMoveFromBattler(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext) { struct AiLogicData *aiData = gAiLogicData; @@ -1360,12 +1622,33 @@ bool32 CanAIFaintTarget(u32 battlerAtk, u32 battlerDef, u32 numHits) return FALSE; } +// Can battler KO the target ignoring any Endure effects (Sturdy, Focus Sash, etc.) +bool32 CanBattlerKOTargetIgnoringSturdy(u32 battlerAtk, u32 battlerDef) +{ + struct AiLogicData *aiData = gAiLogicData; + s32 moveIndex, dmg; + u16 *moves = GetMovesArray(battlerAtk); + u32 moveLimitations = aiData->moveLimitations[battlerAtk]; + + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + if (IsMoveUnusable(moveIndex, moves[moveIndex], moveLimitations)) + continue; + dmg = AI_GetDamage(battlerAtk, battlerDef, moveIndex, AI_ATTACKING, aiData); + + if (gBattleMons[battlerDef].hp <= dmg && CanEndureHit(battlerAtk, battlerDef, moves[moveIndex])) + return TRUE; + } + return FALSE; +} + bool32 CanTargetMoveFaintAi(u32 move, u32 battlerDef, u32 battlerAtk, u32 nHits) { u32 indexSlot = GetMoveSlot(GetMovesArray(battlerDef), move); if (indexSlot < MAX_MON_MOVES) { - if (GetNoOfHitsToKO(AI_GetDamage(battlerDef, battlerAtk, indexSlot, AI_DEFENDING, gAiLogicData), gBattleMons[battlerAtk].hp) <= nHits) + u32 hitsToKO = GetNoOfHitsToKO(AI_GetDamage(battlerDef, battlerAtk, indexSlot, AI_DEFENDING, gAiLogicData), gBattleMons[battlerAtk].hp); + if (hitsToKO <= nHits && hitsToKO != 0 && !(CanEndureHit(battlerDef, battlerAtk, move) && hitsToKO == 1)) return TRUE; } return FALSE; @@ -1394,14 +1677,21 @@ bool32 CanTargetFaintAiWithMod(u32 battlerDef, u32 battlerAtk, s32 hpMod, s32 dm if (dmgMod) dmg *= dmgMod; - if (dmg >= hpCheck) + // Applies modified HP percent to AI data for consideration when running CanEndureHit + gAiLogicData->hpPercents[battlerAtk] = (hpCheck/gBattleMons[battlerAtk].maxHP)*100; + + if (dmg >= hpCheck && !(CanEndureHit(battlerDef, battlerAtk, moves[moveIndex]) && (dmgMod <= 1))) + { + gAiLogicData->hpPercents[battlerAtk] = (gBattleMons[battlerAtk].hp / gBattleMons[battlerAtk].maxHP) * 100; return TRUE; + } + gAiLogicData->hpPercents[battlerAtk] = (gBattleMons[battlerAtk].hp / gBattleMons[battlerAtk].maxHP) * 100; } return FALSE; } -bool32 AI_IsAbilityOnSide(u32 battlerId, u32 ability) +bool32 AI_IsAbilityOnSide(u32 battlerId, enum Ability ability) { if (IsBattlerAlive(battlerId) && gAiLogicData->abilities[battlerId] == ability) return TRUE; @@ -1411,37 +1701,21 @@ bool32 AI_IsAbilityOnSide(u32 battlerId, u32 ability) return FALSE; } -u32 AI_GetBattlerAbility(u32 battler) -{ - if (gAbilitiesInfo[gBattleMons[battler].ability].cantBeSuppressed) - return gBattleMons[battler].ability; - - if (gStatuses3[battler] & STATUS3_GASTRO_ACID) - return ABILITY_NONE; - - if (IsNeutralizingGasOnField() - && gBattleMons[battler].ability != ABILITY_NEUTRALIZING_GAS - && GetBattlerHoldEffectIgnoreAbility(battler, TRUE) != HOLD_EFFECT_ABILITY_SHIELD) - return ABILITY_NONE; - - return gBattleMons[battler].ability; -} - // does NOT include ability suppression checks -s32 AI_DecideKnownAbilityForTurn(u32 battlerId) +enum Ability AI_DecideKnownAbilityForTurn(u32 battlerId) { u32 validAbilities[NUM_ABILITY_SLOTS]; u8 i, numValidAbilities = 0; - u32 knownAbility = AI_GetBattlerAbility(battlerId); - u32 indexAbility; - u32 abilityAiRatings[NUM_ABILITY_SLOTS] = {0}; + enum Ability knownAbility = GetBattlerAbilityIgnoreMoldBreaker(battlerId); + enum Ability indexAbility; + enum Ability abilityAiRatings[NUM_ABILITY_SLOTS] = {0}; // We've had ability overwritten by e.g. Worry Seed. It is not part of gAiPartyData in case of switching if (gDisableStructs[battlerId].overwrittenAbility) return gDisableStructs[battlerId].overwrittenAbility; - // The AI knows its own ability. - if (IsAiBattlerAware(battlerId)) + // The AI knows its own ability, and omniscience handling + if (IsAiBattlerAware(battlerId) || (IsAiBattlerAssumingStab() && ASSUME_STAB_SEES_ABILITY)) return knownAbility; // Check neutralizing gas, gastro acid @@ -1457,7 +1731,7 @@ s32 AI_DecideKnownAbilityForTurn(u32 battlerId) for (i = 0; i < NUM_ABILITY_SLOTS; i++) { - indexAbility = gSpeciesInfo[gBattleMons[battlerId].species].abilities[i]; + indexAbility = GetSpeciesAbility(gBattleMons[battlerId].species, i); if (indexAbility != ABILITY_NONE) { abilityAiRatings[numValidAbilities] = gAbilitiesInfo[indexAbility].aiRating; @@ -1474,33 +1748,39 @@ s32 AI_DecideKnownAbilityForTurn(u32 battlerId) return ABILITY_NONE; // Unknown. } -enum ItemHoldEffect AI_DecideHoldEffectForTurn(u32 battlerId) +enum HoldEffect AI_DecideHoldEffectForTurn(u32 battlerId) { - enum ItemHoldEffect holdEffect; + enum HoldEffect holdEffect = HOLD_EFFECT_NONE; + + if (gBattleMons[battlerId].item == ITEM_NONE) // Failsafe for when user recorded an item but it was consumed + return holdEffect; if (!IsAiBattlerAware(battlerId)) holdEffect = gAiPartyData->mons[GetBattlerSide(battlerId)][gBattlerPartyIndexes[battlerId]].heldEffect; else - holdEffect = GetBattlerHoldEffect(battlerId, FALSE); + holdEffect = GetBattlerHoldEffectIgnoreNegation(battlerId); if (gAiThinkingStruct->aiFlags[battlerId] & AI_FLAG_NEGATE_UNAWARE) return holdEffect; - if (gStatuses3[battlerId] & STATUS3_EMBARGO) + if (gBattleMons[battlerId].volatiles.embargo) return HOLD_EFFECT_NONE; if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) return HOLD_EFFECT_NONE; - if (gAiLogicData->abilities[battlerId] == ABILITY_KLUTZ && !(gStatuses3[battlerId] & STATUS3_GASTRO_ACID)) + if (gAiLogicData->abilities[battlerId] == ABILITY_KLUTZ && !gBattleMons[battlerId].volatiles.gastroAcid) return HOLD_EFFECT_NONE; return holdEffect; } -bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, u32 atkAbility, u32 move) +bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, enum Ability atkAbility, u32 move) { if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_NEGATE_UNAWARE) return FALSE; // AI handicap flag: doesn't understand ability suppression concept + if (atkAbility == ABILITY_MYCELIUM_MIGHT && IsBattleMoveStatus(move)) + return TRUE; + if (IsMoldBreakerTypeAbility(battlerAtk, atkAbility) || MoveIgnoresTargetAbility(move)) return TRUE; @@ -1525,6 +1805,33 @@ u32 AI_GetWeather(void) return gBattleWeather; } +u32 AI_GetSwitchinWeather(struct BattlePokemon battleMon) +{ + enum Ability ability = battleMon.ability; + // Forced weather behaviour + if (!AI_WeatherHasEffect()) + return B_WEATHER_NONE; + if (ability == ABILITY_CLOUD_NINE || ability == ABILITY_AIR_LOCK) + return B_WEATHER_NONE; + if (gBattleWeather & B_WEATHER_PRIMAL_ANY) + return gBattleWeather; + + // Switchin will introduce new weather + switch(ability) + { + case ABILITY_DRIZZLE: + return B_WEATHER_RAIN_NORMAL; + case ABILITY_DROUGHT: + return B_WEATHER_SUN_NORMAL; + case ABILITY_SAND_STREAM: + return B_WEATHER_SANDSTORM; + case ABILITY_SNOW_WARNING: + return GetConfig(CONFIG_SNOW_WARNING) >= GEN_9 ? B_WEATHER_SNOW : B_WEATHER_HAIL; + default: + return gBattleWeather; + } +} + enum WeatherState IsWeatherActive(u32 flags) { enum WeatherState state = WEATHER_INACTIVE; @@ -1585,10 +1892,12 @@ bool32 IsHazardMove(u32 move) u32 i, moveEffect = GetMoveEffect(move); switch (moveEffect) { + case EFFECT_CEASELESS_EDGE: case EFFECT_SPIKES: - case EFFECT_TOXIC_SPIKES: - case EFFECT_STICKY_WEB: case EFFECT_STEALTH_ROCK: + case EFFECT_STICKY_WEB: + case EFFECT_STONE_AXE: + case EFFECT_TOXIC_SPIKES: return TRUE; } @@ -1598,8 +1907,11 @@ bool32 IsHazardMove(u32 move) const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); switch (additionalEffect->moveEffect) { + case MOVE_EFFECT_STEALTH_ROCK: case MOVE_EFFECT_STEELSURGE: return TRUE; + default: + break; } } return FALSE; @@ -1615,7 +1927,7 @@ bool32 IsHazardClearingMove(u32 move) case EFFECT_TIDY_UP: return TRUE; case EFFECT_DEFOG: - if (B_DEFOG_EFFECT_CLEARING >= GEN_6) + if (GetConfig(CONFIG_DEFOG_EFFECT_CLEARING) >= GEN_6) return TRUE; break; } @@ -1628,6 +1940,8 @@ bool32 IsHazardClearingMove(u32 move) { case MOVE_EFFECT_DEFOG: return TRUE; + default: + break; } } @@ -1679,7 +1993,7 @@ bool32 IsAllyProtectingFromMove(u32 battlerAtk, u32 attackerMove, u32 allyMove) } } -bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, u32 atkAbility) +bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, enum Ability atkAbility) { if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_NEGATE_UNAWARE) return FALSE; @@ -1693,75 +2007,21 @@ bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, u32 atkAbility) return FALSE; } -bool32 IsSemiInvulnerable(u32 battlerDef, u32 move) +bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, enum Ability defAbility, u32 move) { - if (gStatuses3[battlerDef] & STATUS3_PHANTOM_FORCE) - return TRUE; - else if (gBattleStruct->battlerState[battlerDef].commandingDondozo) - return TRUE; - else if (!MoveDamagesAirborne(move) && gStatuses3[battlerDef] & STATUS3_ON_AIR) - return TRUE; - else if (!MoveDamagesUnderWater(move) && gStatuses3[battlerDef] & STATUS3_UNDERWATER) - return TRUE; - else if (!MoveDamagesUnderground(move) && gStatuses3[battlerDef] & STATUS3_UNDERGROUND) - return TRUE; - else - return FALSE; -} + enum HoldEffect holdEffect = gAiLogicData->holdEffects[battlerDef]; + u32 accuracy = gAiLogicData->moveAccuracy[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex]; -bool32 IsMoveEncouragedToHit(u32 battlerAtk, u32 battlerDef, u32 move) -{ - u32 weather; - if (IsSemiInvulnerable(battlerDef, move)) + gPotentialItemEffectBattler = battlerDef; + if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < gAiLogicData->holdEffectParams[battlerDef]) + return FALSE; //probabilistically speaking, focus band should activate so dont OHKO + else if (holdEffect == HOLD_EFFECT_FOCUS_SASH && AI_BattlerAtMaxHp(battlerDef)) return FALSE; - //TODO - anticipate protect move? - - // always hits - if (gStatuses3[battlerDef] & STATUS3_ALWAYS_HITS || gDisableStructs[battlerDef].battlerWithSureHit == battlerAtk) - return TRUE; + if (!DoesBattlerIgnoreAbilityChecks(battlerAtk, atkAbility, move) && defAbility == ABILITY_STURDY) + return FALSE; - if (gAiLogicData->abilities[battlerDef] == ABILITY_NO_GUARD || gAiLogicData->abilities[battlerAtk] == ABILITY_NO_GUARD) - return TRUE; - - u32 nonVolatileStatus = GetMoveNonVolatileStatus(move); - if (B_TOXIC_NEVER_MISS >= GEN_6 - && nonVolatileStatus == MOVE_EFFECT_TOXIC - && IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON)) - return TRUE; - - // discouraged from hitting - weather = AI_GetWeather(); - if ((weather & B_WEATHER_SUN) && MoveHas50AccuracyInSun(move)) - return FALSE; - - if ((weather & B_WEATHER_RAIN) && MoveAlwaysHitsInRain(move)) - return TRUE; - if ((weather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) && MoveAlwaysHitsInHailSnow(move)) - return TRUE; - if (B_MINIMIZE_DMG_ACC >= GEN_6 && (gStatuses3[battlerDef] & STATUS3_MINIMIZED) && MoveIncreasesPowerToMinimizedTargets(move)) - return TRUE; - if (GetMoveAccuracy(move) == 0) - return TRUE; - - return FALSE; -} - -bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbility, u32 move) -{ - enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[battlerDef]; - u32 accuracy = gAiLogicData->moveAccuracy[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex]; - - gPotentialItemEffectBattler = battlerDef; - if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < gAiLogicData->holdEffectParams[battlerDef]) - return FALSE; //probabilistically speaking, focus band should activate so dont OHKO - else if (holdEffect == HOLD_EFFECT_FOCUS_SASH && AI_BattlerAtMaxHp(battlerDef)) - return FALSE; - - if (!DoesBattlerIgnoreAbilityChecks(battlerAtk, atkAbility, move) && defAbility == ABILITY_STURDY) - return FALSE; - - if ((((gStatuses3[battlerDef] & STATUS3_ALWAYS_HITS) + if (((gBattleMons[battlerDef].volatiles.lockOn && gDisableStructs[battlerDef].battlerWithSureHit == battlerAtk) || atkAbility == ABILITY_NO_GUARD || defAbility == ABILITY_NO_GUARD) && gBattleMons[battlerAtk].level >= gBattleMons[battlerDef].level) @@ -1771,7 +2031,7 @@ bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbil else // test the odds { u32 odds = accuracy + (gBattleMons[battlerAtk].level - gBattleMons[battlerDef].level); - if (B_SHEER_COLD_ACC >= GEN_7 && move == MOVE_SHEER_COLD && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ICE)) + if (B_SHEER_COLD_ACC >= GEN_7 && GetMoveEffect(move) == EFFECT_SHEER_COLD && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ICE)) odds -= 10; if (Random() % 100 + 1 < odds && gBattleMons[battlerAtk].level >= gBattleMons[battlerDef].level) return TRUE; @@ -1779,114 +2039,87 @@ bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbil return FALSE; } -bool32 ShouldSetSandstorm(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) +bool32 ShouldRaiseAnyStat(u32 battlerAtk, u32 battlerDef) { - if (IsWeatherActive(B_WEATHER_SANDSTORM | B_WEATHER_PRIMAL_ANY) != WEATHER_INACTIVE) + if (AreBattlersStatsMaxed(battlerAtk)) return FALSE; - if (ability == ABILITY_SAND_VEIL - || ability == ABILITY_SAND_RUSH - || ability == ABILITY_SAND_FORCE - || ability == ABILITY_OVERCOAT - || ability == ABILITY_MAGIC_GUARD - || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES - || IS_BATTLER_ANY_TYPE(battler, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL) - || HasMoveWithEffect(battler, EFFECT_SHORE_UP) - || HasMoveWithEffect(battler, EFFECT_WEATHER_BALL)) - { - return TRUE; - } - return FALSE; -} + // Don't increase stats if opposing battler has Unaware + if (AI_IsAbilityOnSide(battlerDef, ABILITY_UNAWARE)) + return FALSE; -bool32 ShouldSetHail(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) -{ - if (IsWeatherActive(B_WEATHER_HAIL | B_WEATHER_SNOW | B_WEATHER_PRIMAL_ANY) != WEATHER_INACTIVE) + // Don't set up if AI is dead to residual damage from weather + if (GetBattlerSecondaryDamage(battlerAtk) >= gBattleMons[battlerAtk].hp) return FALSE; - if (ability == ABILITY_SNOW_CLOAK - || ability == ABILITY_ICE_BODY - || ability == ABILITY_FORECAST - || ability == ABILITY_SLUSH_RUSH - || ability == ABILITY_MAGIC_GUARD - || ability == ABILITY_OVERCOAT - || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES - || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) - || HasMoveWithFlag(battler, MoveAlwaysHitsInHailSnow) - || HasMoveWithEffect(battler, EFFECT_AURORA_VEIL) - || HasMoveWithEffect(battler, EFFECT_WEATHER_BALL)) - { - return TRUE; - } - return FALSE; + // Don't increase stats if opposing battler has Opportunist + if (AI_IsAbilityOnSide(battlerDef, ABILITY_OPPORTUNIST)) + return FALSE; + + // Don't increase stats if opposing battler has used Haze effect or AI effect + if (!RandomPercentage(RNG_AI_BOOST_INTO_HAZE, BOOST_INTO_HAZE_CHANCE) + && HasBattlerSideUsedMoveWithEffect(battlerDef, EFFECT_HAZE)) + return FALSE; + + if (CountPositiveStatStages(battlerAtk) > 0 + && HasBattlerSideMoveWithAIEffect(battlerDef, AI_EFFECT_RESET_STATS)) + return FALSE; + + // Don't increase stats if AI could KO target through Sturdy effect, as otherwise it always 2HKOs + if (CanBattlerKOTargetIgnoringSturdy(battlerAtk, battlerDef)) + return FALSE; + + return TRUE; } -bool32 ShouldSetRain(u32 battlerAtk, u32 atkAbility, enum ItemHoldEffect holdEffect) +bool32 ShouldSetWeather(u32 battler, u32 weather) { - if (IsWeatherActive(B_WEATHER_RAIN | B_WEATHER_PRIMAL_ANY) != WEATHER_INACTIVE) + if (AI_GetWeather() & weather) return FALSE; - if (holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA - && (atkAbility == ABILITY_SWIFT_SWIM - || atkAbility == ABILITY_FORECAST - || atkAbility == ABILITY_HYDRATION - || atkAbility == ABILITY_RAIN_DISH - || atkAbility == ABILITY_DRY_SKIN - || HasMoveWithFlag(battlerAtk, MoveAlwaysHitsInRain) - || HasMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL) - || HasMoveWithType(battlerAtk, TYPE_WATER))) - { - return TRUE; - } - return FALSE; + return WeatherChecker(battler, weather, FIELD_EFFECT_POSITIVE); } -bool32 ShouldSetSun(u32 battlerAtk, u32 atkAbility, enum ItemHoldEffect holdEffect) +bool32 ShouldClearWeather(u32 battler, u32 weather) { - if (IsWeatherActive(B_WEATHER_SUN | B_WEATHER_PRIMAL_ANY) != WEATHER_INACTIVE) - return FALSE; + return WeatherChecker(battler, weather, FIELD_EFFECT_NEGATIVE); +} - if (holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA - && (atkAbility == ABILITY_CHLOROPHYLL - || atkAbility == ABILITY_FLOWER_GIFT - || atkAbility == ABILITY_FORECAST - || atkAbility == ABILITY_LEAF_GUARD - || atkAbility == ABILITY_SOLAR_POWER - || atkAbility == ABILITY_HARVEST - || HasMoveWithEffect(battlerAtk, EFFECT_SOLAR_BEAM) - || HasMoveWithEffect(battlerAtk, EFFECT_MORNING_SUN) - || HasMoveWithEffect(battlerAtk, EFFECT_SYNTHESIS) - || HasMoveWithEffect(battlerAtk, EFFECT_MOONLIGHT) - || HasMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL) - || HasMoveWithEffect(battlerAtk, EFFECT_GROWTH) - || HasMoveWithType(battlerAtk, TYPE_FIRE))) +bool32 ShouldSetFieldStatus(u32 battler, u32 fieldStatus) +{ + if (gFieldStatuses & fieldStatus) { - return TRUE; + if (!(fieldStatus & STATUS_FIELD_TRICK_ROOM)) + return FALSE; + // DOUBLE_TRICK_ROOM_ON_LAST_TURN_CHANCE + else if (gFieldTimers.trickRoomTimer != 1) + return FALSE; } - return FALSE; + + return FieldStatusChecker(battler, fieldStatus, FIELD_EFFECT_POSITIVE); } -bool32 ShouldSetSnow(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) +bool32 ShouldClearFieldStatus(u32 battler, u32 fieldStatus) { - if (IsWeatherActive(B_WEATHER_SNOW | B_WEATHER_HAIL | B_WEATHER_PRIMAL_ANY) != WEATHER_INACTIVE) - return FALSE; + return FieldStatusChecker(battler, fieldStatus, FIELD_EFFECT_NEGATIVE); +} - if (ability == ABILITY_SNOW_CLOAK - || ability == ABILITY_ICE_BODY - || ability == ABILITY_FORECAST - || ability == ABILITY_SLUSH_RUSH - || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) - || HasMoveWithFlag(battler, MoveAlwaysHitsInHailSnow) - || HasMoveWithEffect(battler, EFFECT_AURORA_VEIL) - || HasMoveWithEffect(battler, EFFECT_WEATHER_BALL)) - { - return TRUE; - } - return FALSE; +bool32 IsBattlerDamagedByStatus(u32 battler) +{ + return gBattleMons[battler].status1 & STATUS1_DAMAGING + || gBattleMons[battler].volatiles.wrapped + || gBattleMons[battler].volatiles.nightmare + || gBattleMons[battler].volatiles.cursed + || gBattleMons[battler].volatiles.saltCure + || gBattleMons[battler].volatiles.leechSeed + || gBattleMons[battler].volatiles.perishSong + || gSideStatuses[GetBattlerSide(battler)] & (SIDE_STATUS_SEA_OF_FIRE | SIDE_STATUS_DAMAGE_NON_TYPES); } -void ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove, s32 *score) +s32 ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove) { + s32 score = 0; + // TODO more sophisticated logic u32 uses = gDisableStructs[battlerAtk].protectUses; @@ -1899,82 +2132,169 @@ void ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove, if (uses == 0) { if (predictedMove != MOVE_NONE && predictedMove != 0xFFFF && !IsBattleMoveStatus(predictedMove)) - ADJUST_SCORE_PTR(DECENT_EFFECT); + score += DECENT_EFFECT; else if (Random() % 256 < 100) - ADJUST_SCORE_PTR(WEAK_EFFECT); + score += WEAK_EFFECT; } else { - if (IsDoubleBattle()) - ADJUST_SCORE_PTR(-(2 * min(uses, 3))); + if (!IsBattle1v1()) + score -= (2 * min(uses, 3)); else - ADJUST_SCORE_PTR(-(min(uses, 3))); + score -= (min(uses, 3)); } - if (gBattleMons[battlerAtk].status1 & (STATUS1_PSN_ANY | STATUS1_BURN | STATUS1_FROSTBITE) - || gBattleMons[battlerAtk].status2 & (STATUS2_CURSED | STATUS2_INFATUATION) - || gStatuses3[battlerAtk] & (STATUS3_PERISH_SONG | STATUS3_LEECHSEED | STATUS3_YAWN)) + if (IsBattlerDamagedByStatus(battlerAtk)) { - ADJUST_SCORE_PTR(-1); + score -= 1; } - if (gBattleMons[battlerDef].status1 & STATUS1_TOXIC_POISON - || gBattleMons[battlerDef].status2 & (STATUS2_CURSED | STATUS2_INFATUATION) - || gStatuses3[battlerDef] & (STATUS3_PERISH_SONG | STATUS3_LEECHSEED | STATUS3_YAWN)) - ADJUST_SCORE_PTR(DECENT_EFFECT); + if (IsBattlerDamagedByStatus(battlerDef)) + { + score += DECENT_EFFECT; + } + + return score; } // stat stages -bool32 ShouldLowerStat(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 stat) +bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData, enum Stat stat) { if (gBattleMons[battlerDef].statStages[stat] == MIN_STAT_STAGE) return FALSE; - if (gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CLEAR_AMULET) + if (aiData->holdEffects[battlerDef] == HOLD_EFFECT_CLEAR_AMULET) + return FALSE; + + u32 move = gAiThinkingStruct->moveConsidered; + enum Ability abilityAtk = aiData->abilities[battlerAtk]; + + if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_MIST && abilityAtk != ABILITY_INFILTRATOR) return FALSE; - switch (abilityDef) + if (!DoesBattlerIgnoreAbilityChecks(battlerAtk, abilityAtk, move)) { - case ABILITY_SPEED_BOOST: - if (stat == STAT_SPEED) - return FALSE; - case ABILITY_HYPER_CUTTER: - if (stat == STAT_ATK) + if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_GRASS) && AI_IsAbilityOnSide(battlerDef, ABILITY_FLOWER_VEIL)) return FALSE; - case ABILITY_BIG_PECKS: - if (stat == STAT_DEF) + + switch (aiData->abilities[battlerDef]) + { + case ABILITY_SPEED_BOOST: + if (stat == STAT_SPEED) + return FALSE; + case ABILITY_HYPER_CUTTER: + if (stat == STAT_ATK) + return FALSE; + case ABILITY_BIG_PECKS: + if (stat == STAT_DEF) + return FALSE; + case ABILITY_ILLUMINATE: + if (GetConfig(CONFIG_ILLUMINATE_EFFECT) < GEN_9) + break; + case ABILITY_KEEN_EYE: + case ABILITY_MINDS_EYE: + if (stat == STAT_ACC) + return FALSE; + case ABILITY_CONTRARY: + case ABILITY_CLEAR_BODY: + case ABILITY_WHITE_SMOKE: + case ABILITY_FULL_METAL_BODY: return FALSE; - case ABILITY_ILLUMINATE: - if (B_ILLUMINATE_EFFECT < GEN_9) + case ABILITY_SHIELD_DUST: + if (!IsBattleMoveStatus(move) && GetActiveGimmick(battlerAtk) != GIMMICK_DYNAMAX) + return FALSE; break; - case ABILITY_KEEN_EYE: - case ABILITY_MINDS_EYE: - if (stat == STAT_ACC) - return FALSE; - case ABILITY_FLOWER_VEIL: - if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_GRASS)) - return FALSE; - break; - case ABILITY_CONTRARY: - case ABILITY_CLEAR_BODY: - case ABILITY_WHITE_SMOKE: - case ABILITY_FULL_METAL_BODY: - return FALSE; + default: + break; + } } - // This should be a viability check if (stat == STAT_SPEED) { + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); // If AI is faster and doesn't have any mons left, lowering speed doesn't give any - return !(AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) + return !(AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, DONT_CONSIDER_PRIORITY) && CountUsablePartyMons(battlerAtk) == 0 - && !HasMoveWithEffect(battlerAtk, EFFECT_ELECTRO_BALL)); + && !HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_ELECTRO_BALL)); } return TRUE; } -bool32 BattlerStatCanRise(u32 battler, u32 battlerAbility, u32 stat) +u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, enum Stat stat) +{ + u32 tempScore = NO_INCREASE; + + // Don't increase score if target is already -3 stat stage + if (stat != STAT_SPEED && gBattleMons[battlerDef].statStages[stat] <= DEFAULT_STAT_STAGE - 3) + return NO_INCREASE; + + // Don't decrease stat if target will die to residual damage + if (GetBattlerSecondaryDamage(battlerDef) >= gBattleMons[battlerDef].hp) + return NO_INCREASE; + + if (DoesAbilityRaiseStatsWhenLowered(gAiLogicData->abilities[battlerDef])) + return NO_INCREASE; + + // TODO: Avoid decreasing stat if + // player can kill ai in 2 hits with decreased attack / sp atk stages + // ai can kill target in 2 hits without decreasing defense / sp def stages + + switch (stat) + { + case STAT_ATK: + if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)) + tempScore += DECENT_EFFECT; + break; + case STAT_DEF: + if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL) + || HasMoveWithCategory(BATTLE_PARTNER(battlerAtk), DAMAGE_CATEGORY_PHYSICAL)) + tempScore += DECENT_EFFECT; + break; + case STAT_SPEED: + { + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + if (AI_IsSlower(battlerAtk, battlerDef, MOVE_NONE, predictedMoveSpeedCheck, DONT_CONSIDER_PRIORITY) + || AI_IsSlower(BATTLE_PARTNER(battlerAtk), battlerDef, MOVE_NONE, predictedMoveSpeedCheck, DONT_CONSIDER_PRIORITY)) + tempScore += DECENT_EFFECT; + break; + } + case STAT_SPATK: + if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)) + tempScore += DECENT_EFFECT; + break; + case STAT_SPDEF: + if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL) + || HasMoveWithCategory(BATTLE_PARTNER(battlerAtk), DAMAGE_CATEGORY_SPECIAL)) + tempScore += DECENT_EFFECT; + break; + case STAT_ACC: + tempScore += WEAK_EFFECT; + if (IsBattlerTrapped(battlerAtk, battlerDef)) + tempScore += DECENT_EFFECT; + if (gBattleMons[battlerDef].volatiles.leechSeed) + tempScore += WEAK_EFFECT; + if (gBattleMons[battlerDef].volatiles.cursed) + tempScore += WEAK_EFFECT; + break; + case STAT_EVASION: + if (gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY) + tempScore += WEAK_EFFECT; + if (gBattleMons[battlerDef].volatiles.leechSeed) + tempScore += WEAK_EFFECT; + if (gBattleMons[battlerDef].volatiles.root) + tempScore += WEAK_EFFECT; + if (gBattleMons[battlerDef].volatiles.cursed) + tempScore += WEAK_EFFECT; + break; + default: + break; + } + + return (tempScore > BEST_EFFECT) ? BEST_EFFECT : tempScore; // don't inflate score so only max +4 +} + +bool32 BattlerStatCanRise(u32 battler, enum Ability battlerAbility, enum Stat stat) { if ((gBattleMons[battler].statStages[stat] < MAX_STAT_STAGE && battlerAbility != ABILITY_CONTRARY) || (battlerAbility == ABILITY_CONTRARY && gBattleMons[battler].statStages[stat] > MIN_STAT_STAGE)) @@ -1984,7 +2304,7 @@ bool32 BattlerStatCanRise(u32 battler, u32 battlerAbility, u32 stat) bool32 AreBattlersStatsMaxed(u32 battlerId) { - u32 i; + enum Stat i; for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) { if (gBattleMons[battlerId].statStages[i] < MAX_STAT_STAGE) @@ -1995,7 +2315,7 @@ bool32 AreBattlersStatsMaxed(u32 battlerId) bool32 AnyStatIsRaised(u32 battlerId) { - u32 i; + enum Stat i; for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) { @@ -2008,7 +2328,7 @@ bool32 AnyStatIsRaised(u32 battlerId) u32 CountPositiveStatStages(u32 battlerId) { u32 count = 0; - u32 i; + enum Stat i; for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) { if (gBattleMons[battlerId].statStages[i] > DEFAULT_STAT_STAGE) @@ -2020,7 +2340,7 @@ u32 CountPositiveStatStages(u32 battlerId) u32 CountNegativeStatStages(u32 battlerId) { u32 count = 0; - u32 i; + enum Stat i; for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) { if (gBattleMons[battlerId].statStages[i] < DEFAULT_STAT_STAGE) @@ -2029,128 +2349,6 @@ u32 CountNegativeStatStages(u32 battlerId) return count; } -bool32 ShouldLowerAttack(u32 battlerAtk, u32 battlerDef, u32 defAbility) -{ - if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) - && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) - && CanAIFaintTarget(battlerAtk, battlerDef, 0)) - return FALSE; // Don't bother lowering stats if can kill enemy. - - if (gBattleMons[battlerDef].statStages[STAT_ATK] > 4 - && HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL) - && defAbility != ABILITY_CONTRARY - && defAbility != ABILITY_CLEAR_BODY - && defAbility != ABILITY_WHITE_SMOKE - && defAbility != ABILITY_FULL_METAL_BODY - && defAbility != ABILITY_HYPER_CUTTER - && gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) - return TRUE; - return FALSE; -} - -bool32 ShouldLowerDefense(u32 battlerAtk, u32 battlerDef, u32 defAbility) -{ - if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) - && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) - && CanAIFaintTarget(battlerAtk, battlerDef, 0)) - return FALSE; // Don't bother lowering stats if can kill enemy. - - if (gBattleMons[battlerDef].statStages[STAT_DEF] > 4 - && HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL) - && defAbility != ABILITY_CONTRARY - && defAbility != ABILITY_CLEAR_BODY - && defAbility != ABILITY_WHITE_SMOKE - && defAbility != ABILITY_FULL_METAL_BODY - && defAbility != ABILITY_BIG_PECKS - && gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) - return TRUE; - return FALSE; -} - -bool32 ShouldLowerSpeed(u32 battlerAtk, u32 battlerDef, u32 defAbility) -{ - if (defAbility == ABILITY_CONTRARY - || defAbility == ABILITY_CLEAR_BODY - || defAbility == ABILITY_FULL_METAL_BODY - || defAbility == ABILITY_WHITE_SMOKE - || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CLEAR_AMULET) - return FALSE; - - return (AI_IsSlower(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered)); -} - -bool32 ShouldLowerSpAtk(u32 battlerAtk, u32 battlerDef, u32 defAbility) -{ - if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) - && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) - && CanAIFaintTarget(battlerAtk, battlerDef, 0)) - return FALSE; // Don't bother lowering stats if can kill enemy. - - if (gBattleMons[battlerDef].statStages[STAT_SPATK] > 4 - && HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL) - && defAbility != ABILITY_CONTRARY - && defAbility != ABILITY_CLEAR_BODY - && defAbility != ABILITY_FULL_METAL_BODY - && defAbility != ABILITY_WHITE_SMOKE - && gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) - return TRUE; - return FALSE; -} - -bool32 ShouldLowerSpDef(u32 battlerAtk, u32 battlerDef, u32 defAbility) -{ - if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) - && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) - && CanAIFaintTarget(battlerAtk, battlerDef, 0)) - return FALSE; // Don't bother lowering stats if can kill enemy. - - if (gBattleMons[battlerDef].statStages[STAT_SPDEF] > 4 - && HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL) - && defAbility != ABILITY_CONTRARY - && defAbility != ABILITY_CLEAR_BODY - && defAbility != ABILITY_FULL_METAL_BODY - && defAbility != ABILITY_WHITE_SMOKE - && gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) - return TRUE; - return FALSE; -} - -bool32 ShouldLowerAccuracy(u32 battlerAtk, u32 battlerDef, u32 defAbility) -{ - if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) - && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) - && CanAIFaintTarget(battlerAtk, battlerDef, 0)) - return FALSE; // Don't bother lowering stats if can kill enemy. - - if (defAbility != ABILITY_CONTRARY - && defAbility != ABILITY_CLEAR_BODY - && defAbility != ABILITY_WHITE_SMOKE - && defAbility != ABILITY_FULL_METAL_BODY - && defAbility != ABILITY_KEEN_EYE - && defAbility != ABILITY_MINDS_EYE - && (B_ILLUMINATE_EFFECT >= GEN_9 && defAbility != ABILITY_ILLUMINATE) - && gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) - return TRUE; - return FALSE; -} - -bool32 ShouldLowerEvasion(u32 battlerAtk, u32 battlerDef, u32 defAbility) -{ - if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) - && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) - && CanAIFaintTarget(battlerAtk, battlerDef, 0)) - return FALSE; // Don't bother lowering stats if can kill enemy. - - if (gBattleMons[battlerDef].statStages[STAT_EVASION] > DEFAULT_STAT_STAGE - && defAbility != ABILITY_CONTRARY - && defAbility != ABILITY_CLEAR_BODY - && defAbility != ABILITY_FULL_METAL_BODY - && defAbility != ABILITY_WHITE_SMOKE - && gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) - return TRUE; - return FALSE; -} - bool32 CanIndexMoveFaintTarget(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcContext calcContext) { s32 dmg; @@ -2166,18 +2364,6 @@ bool32 CanIndexMoveFaintTarget(u32 battlerAtk, u32 battlerDef, u32 moveIndex, en return FALSE; } -bool32 CanIndexMoveGuaranteeFaintTarget(u32 battlerAtk, u32 battlerDef, u32 moveIndex) -{ - s32 dmg; - u16 *moves = gBattleMons[battlerAtk].moves; - - dmg = gAiLogicData->simulatedDmg[battlerAtk][battlerDef][moveIndex].minimum; // Explictly care about guaranteed KOs universally - - if (gBattleMons[battlerDef].hp <= dmg && !CanEndureHit(battlerAtk, battlerDef, moves[moveIndex])) - return TRUE; - return FALSE; -} - u16 *GetMovesArray(u32 battler) { if (IsAiBattlerAware(battler) || IsAiBattlerAware(BATTLE_PARTNER(battler))) @@ -2186,7 +2372,19 @@ u16 *GetMovesArray(u32 battler) return gBattleHistory->usedMoves[battler]; } -bool32 HasOnlyMovesWithCategory(u32 battlerId, u32 category, bool32 onlyOffensive) +u32 GetIndexInMoveArray(u32 battler, u32 move) +{ + u16 *moves = GetMovesArray(battler); + u32 i; + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] == move) + return i; + } + return MAX_MON_MOVES; +} + +bool32 HasOnlyMovesWithCategory(u32 battlerId, enum DamageCategory category, bool32 onlyOffensive) { u32 i; u16 *moves = GetMovesArray(battlerId); @@ -2202,7 +2400,7 @@ bool32 HasOnlyMovesWithCategory(u32 battlerId, u32 category, bool32 onlyOffensiv return TRUE; } -bool32 HasMoveWithCategory(u32 battler, u32 category) +bool32 HasMoveWithCategory(u32 battler, enum DamageCategory category) { u32 i; u16 *moves = GetMovesArray(battler); @@ -2215,7 +2413,7 @@ bool32 HasMoveWithCategory(u32 battler, u32 category) return FALSE; } -bool32 HasMoveWithType(u32 battler, u32 type) +bool32 HasMoveWithType(u32 battler, enum Type type) { s32 i; u16 *moves = GetMovesArray(battler); @@ -2229,42 +2427,84 @@ bool32 HasMoveWithType(u32 battler, u32 type) return FALSE; } -bool32 HasMoveWithEffect(u32 battlerId, enum BattleMoveEffects effect) +bool32 HasMoveWithEffect(u32 battler, enum BattleMoveEffects effect) { s32 i; - u16 *moves = GetMovesArray(battlerId); + u16 *moves = GetMovesArray(battler); for (i = 0; i < MAX_MON_MOVES; i++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE - && GetMoveEffect(moves[i]) == effect) + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetMoveEffect(moves[i]) == effect) return TRUE; } return FALSE; } +bool32 HasMoveWithAIEffect(u32 battler, u32 aiEffect) +{ + s32 i; + u16 *moves = GetMovesArray(battler); + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE) + { + if (GetAIEffectGroupFromMove(battler, moves[i]) & aiEffect) + return TRUE; + } + } + + return FALSE; +} + bool32 HasBattlerSideMoveWithEffect(u32 battler, u32 effect) { if (HasMoveWithEffect(battler, effect)) return TRUE; - if (IsDoubleBattle() && HasMoveWithEffect(BATTLE_OPPOSITE(battler), effect)) + if (HasPartnerIgnoreFlags(battler) && HasMoveWithEffect(BATTLE_PARTNER(battler), effect)) + return TRUE; + return FALSE; +} + +bool32 HasBattlerSideMoveWithAIEffect(u32 battler, u32 aiEffect) +{ + if (HasMoveWithAIEffect(battler, aiEffect)) + return TRUE; + if (HasPartnerIgnoreFlags(battler) && HasMoveWithAIEffect(BATTLE_PARTNER(battler), aiEffect)) return TRUE; return FALSE; } // HasBattlerSideMoveWithEffect checks if the AI knows a side has a move effect, -// while HasBattlerSideUsedMoveWithEffect checks if the side has ever used a move effect. -// The former acts the same way as the latter if AI_FLAG_OMNISCIENT isn't used. +// while HasBattlerSideUsedMoveWithEffect checks if the side has actively USED the move effect. +// It matches both on move effect and on AI move effect; eg, EFFECT_HAZE will also bring up Freezy Frost or Clear Smog, anything with AI_EFFECT_RESET_STATS. bool32 HasBattlerSideUsedMoveWithEffect(u32 battler, u32 effect) { + u32 aiEffect = GetAIEffectGroup(effect); u32 i; for (i = 0; i < MAX_MON_MOVES; i++) { if (GetMoveEffect(gBattleHistory->usedMoves[battler][i]) == effect) return TRUE; - if (IsDoubleBattle() && GetMoveEffect(gBattleHistory->usedMoves[BATTLE_OPPOSITE(battler)][i]) == effect) - return TRUE; + + if (aiEffect != AI_EFFECT_NONE) + { + if (GetAIEffectGroupFromMove(battler, gBattleHistory->usedMoves[battler][i]) & aiEffect) + return TRUE; + } + + if (HasPartnerIgnoreFlags(battler)) + { + if (GetMoveEffect(gBattleHistory->usedMoves[BATTLE_PARTNER(battler)][i]) == effect) + return TRUE; + + if (aiEffect != AI_EFFECT_NONE) + { + if (GetAIEffectGroupFromMove(battler, gBattleHistory->usedMoves[BATTLE_PARTNER(battler)][i]) & aiEffect) + return TRUE; + } + } } return FALSE; } @@ -2318,27 +2558,11 @@ bool32 HasBattlerSideMoveWithAdditionalEffect(u32 battler, u32 moveEffect) { if (HasMoveWithAdditionalEffect(battler, moveEffect)) return TRUE; - if (IsDoubleBattle() && HasMoveWithAdditionalEffect(BATTLE_OPPOSITE(battler), moveEffect)) + if (HasPartnerIgnoreFlags(battler) && HasMoveWithAdditionalEffect(BATTLE_PARTNER(battler), moveEffect)) return TRUE; return FALSE; } -// HasBattlerSideMoveWithAdditionalEffect checks if the AI knows a side has a move effect, -// while HasBattlerSideUsedMoveWithAdditionalEffect checks if the side has ever used a move effect. -// The former acts the same way as the latter if AI_FLAG_OMNISCIENT isn't used. -bool32 HasBattlerSideUsedMoveWithAdditionalEffect(u32 battler, u32 moveEffect) -{ - u32 i; - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (MoveHasAdditionalEffect(gBattleHistory->usedMoves[battler][i], moveEffect)) - return TRUE; - if (IsDoubleBattle() && MoveHasAdditionalEffect(gBattleHistory->usedMoves[BATTLE_OPPOSITE(battler)][i], moveEffect)) - return TRUE; - } - return FALSE; -} - bool32 HasMoveWithCriticalHitChance(u32 battlerId) { s32 i; @@ -2420,21 +2644,43 @@ bool32 HasMoveThatLowersOwnStats(u32 battlerId) return FALSE; } -bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool32 ignoreStatus, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect) +bool32 HasMoveThatRaisesOwnStats(u32 battlerId) { - s32 i; - u16 *moves = GetMovesArray(battlerAtk); - u32 moveLimitations = gAiLogicData->moveLimitations[battlerAtk]; - + s32 i, j; + u32 aiMove; + u16 *moves = GetMovesArray(battlerId); for (i = 0; i < MAX_MON_MOVES; i++) { - if (IsMoveUnusable(i, moves[i], moveLimitations)) - continue; - - if (ignoreStatus && IsBattleMoveStatus(moves[i])) - continue; - else if ((!IsBattleMoveStatus(moves[i]) && GetMoveAccuracy(moves[i]) == 0) - || GetBattlerMoveTargetType(battlerAtk, moves[i]) & (MOVE_TARGET_USER | MOVE_TARGET_OPPONENTS_FIELD)) + aiMove = moves[i]; + if (aiMove != MOVE_NONE && aiMove != MOVE_UNAVAILABLE) + { + u32 additionalEffectCount = GetMoveAdditionalEffectCount(aiMove); + for (j = 0; j < additionalEffectCount; j++) + { + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(aiMove, j); + if (IsSelfStatRaisingEffect(additionalEffect->moveEffect) && additionalEffect->self) + return TRUE; + } + } + } + return FALSE; +} + +bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool32 ignoreStatus) +{ + s32 i; + u16 *moves = GetMovesArray(battlerAtk); + u32 moveLimitations = gAiLogicData->moveLimitations[battlerAtk]; + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (IsMoveUnusable(i, moves[i], moveLimitations)) + continue; + + if (ignoreStatus && IsBattleMoveStatus(moves[i])) + continue; + else if ((!IsBattleMoveStatus(moves[i]) && GetMoveAccuracy(moves[i]) == 0) + || GetBattlerMoveTargetType(battlerAtk, moves[i]) & (MOVE_TARGET_USER | MOVE_TARGET_OPPONENTS_FIELD)) continue; if (gAiLogicData->moveAccuracy[battlerAtk][battlerDef][i] <= accCheck) @@ -2552,11 +2798,13 @@ bool32 IsStatRaisingEffect(enum BattleMoveEffects effect) { switch (effect) { + case EFFECT_ATTACK_UP_USER_ALLY: case EFFECT_ATTACK_UP: case EFFECT_ATTACK_UP_2: case EFFECT_DEFENSE_UP: case EFFECT_DEFENSE_UP_2: case EFFECT_DEFENSE_UP_3: + case EFFECT_AUTOTOMIZE: case EFFECT_SPEED_UP: case EFFECT_SPEED_UP_2: case EFFECT_SPECIAL_ATTACK_UP: @@ -2622,7 +2870,7 @@ bool32 IsStatLoweringEffect(enum BattleMoveEffects effect) } } -bool32 IsSelfStatLoweringEffect(enum BattleMoveEffects effect) +bool32 IsSelfStatLoweringEffect(enum MoveEffect effect) { // Self stat lowering moves like Overheart, Superpower etc. switch (effect) @@ -2650,13 +2898,38 @@ bool32 IsSelfStatLoweringEffect(enum BattleMoveEffects effect) } } +bool32 IsSelfStatRaisingEffect(enum MoveEffect effect) +{ + // Self stat lowering moves like Power Up Punch or Charge Beam + switch (effect) + { + case MOVE_EFFECT_ATK_PLUS_1: + case MOVE_EFFECT_DEF_PLUS_1: + case MOVE_EFFECT_SPD_PLUS_1: + case MOVE_EFFECT_SP_ATK_PLUS_1: + case MOVE_EFFECT_SP_DEF_PLUS_1: + case MOVE_EFFECT_EVS_PLUS_1: + case MOVE_EFFECT_ACC_PLUS_1: + case MOVE_EFFECT_ATK_PLUS_2: + case MOVE_EFFECT_DEF_PLUS_2: + case MOVE_EFFECT_SPD_PLUS_2: + case MOVE_EFFECT_SP_ATK_PLUS_2: + case MOVE_EFFECT_SP_DEF_PLUS_2: + case MOVE_EFFECT_EVS_PLUS_2: + case MOVE_EFFECT_ACC_PLUS_2: + return TRUE; + default: + return FALSE; + } +} + bool32 IsSwitchOutEffect(enum BattleMoveEffects effect) { // Switch out effects like U-Turn, Volt Switch, etc. switch (effect) { case EFFECT_TELEPORT: - if (B_TELEPORT_BEHAVIOR >= GEN_8) + if (GetConfig(CONFIG_TELEPORT_BEHAVIOR) >= GEN_8) return TRUE; case EFFECT_HIT_ESCAPE: case EFFECT_PARTING_SHOT: @@ -2725,35 +2998,45 @@ static inline bool32 IsMoveSleepClauseTrigger(u32 move) case MOVE_EFFECT_EFFECT_SPORE_SIDE: case MOVE_EFFECT_YAWN_FOE: return TRUE; + default: + break; } } return FALSE; } -bool32 HasDamagingMove(u32 battlerId) +bool32 HasDamagingMove(u32 battler) { u32 i; - u16 *moves = GetMovesArray(battlerId); + u16 *moves = GetMovesArray(battler); for (i = 0; i < MAX_MON_MOVES; i++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && !IsBattleMoveStatus(moves[i])) + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetMovePower(moves[i]) > 0) return TRUE; } return FALSE; } -bool32 HasDamagingMoveOfType(u32 battlerId, u32 type) +bool32 HasDamagingMoveOfType(u32 battler, enum Type type) { s32 i; - u16 *moves = GetMovesArray(battlerId); + u16 *moves = GetMovesArray(battler); for (i = 0; i < MAX_MON_MOVES; i++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE - && GetMoveType(moves[i]) == type && !IsBattleMoveStatus(moves[i])) - return TRUE; + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetMovePower(moves[i]) > 0) + { + enum Type moveType = GetDynamicMoveType(GetBattlerMon(battler), moves[i], battler, MON_IN_BATTLE); + + if (moveType != TYPE_NONE && type == moveType) + return TRUE; + if (GetMoveType(moves[i]) == type) + return TRUE; + if (GetMoveEffect(moves[i]) == EFFECT_NATURE_POWER && GetMoveType(GetNaturePowerMove(moves[i])) == type) + return TRUE; + } } return FALSE; @@ -2788,13 +3071,13 @@ bool32 IsTwoTurnNotSemiInvulnerableMove(u32 battlerAtk, u32 move) } } -static u32 GetLeechSeedDamage(u32 battlerId) +static u32 GetLeechSeedDamage(u32 battler) { u32 damage = 0; - if ((gStatuses3[battlerId] & STATUS3_LEECHSEED) - && gBattleMons[gStatuses3[battlerId] & STATUS3_LEECHSEED_BATTLER].hp != 0) + u32 leechSeeder = gBattleMons[battler].volatiles.leechSeed; + if (leechSeeder && gBattleMons[leechSeeder - 1].hp != 0) { - damage = GetNonDynamaxMaxHP(battlerId) / 8; + damage = GetNonDynamaxMaxHP(battler) / 8; if (damage == 0) damage = 1; } @@ -2804,7 +3087,7 @@ static u32 GetLeechSeedDamage(u32 battlerId) static u32 GetNightmareDamage(u32 battlerId) { u32 damage = 0; - if ((gBattleMons[battlerId].status2 & STATUS2_NIGHTMARE) && gBattleMons[battlerId].status1 & STATUS1_SLEEP) + if (gBattleMons[battlerId].volatiles.nightmare && gBattleMons[battlerId].status1 & STATUS1_SLEEP) { damage = GetNonDynamaxMaxHP(battlerId) / 4; if (damage == 0) @@ -2816,7 +3099,7 @@ static u32 GetNightmareDamage(u32 battlerId) static u32 GetCurseDamage(u32 battlerId) { u32 damage = 0; - if (gBattleMons[battlerId].status2 & STATUS2_CURSED) + if (gBattleMons[battlerId].volatiles.cursed) { damage = GetNonDynamaxMaxHP(battlerId) / 4; if (damage == 0) @@ -2825,17 +3108,16 @@ static u32 GetCurseDamage(u32 battlerId) return damage; } -static u32 GetTrapDamage(u32 battlerId) +static u32 GetTrapDamage(u32 battler) { // ai has no knowledge about turns remaining u32 damage = 0; - enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[gBattleStruct->wrappedBy[battlerId]]; - if (gBattleMons[battlerId].status2 & STATUS2_WRAPPED) + if (gBattleMons[battler].volatiles.wrapped) { - if (holdEffect == HOLD_EFFECT_BINDING_BAND) - damage = GetNonDynamaxMaxHP(battlerId) / (B_BINDING_DAMAGE >= GEN_6 ? 6 : 8); + if (gAiLogicData->holdEffects[gBattleMons[battler].volatiles.wrappedBy] == HOLD_EFFECT_BINDING_BAND) + damage = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 6 : 8); else - damage = GetNonDynamaxMaxHP(battlerId) / (B_BINDING_DAMAGE >= GEN_6 ? 8 : 16); + damage = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 8 : 16); if (damage == 0) damage = 1; @@ -2869,7 +3151,7 @@ static u32 GetPoisonDamage(u32 battlerId) return damage; } -static bool32 BattlerAffectedBySandstorm(u32 battlerId, u32 ability) +static bool32 BattlerAffectedBySandstorm(u32 battlerId, enum Ability ability) { if (!IS_BATTLER_ANY_TYPE(battlerId, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL) && ability != ABILITY_SAND_VEIL @@ -2880,7 +3162,7 @@ static bool32 BattlerAffectedBySandstorm(u32 battlerId, u32 ability) return FALSE; } -static bool32 BattlerAffectedByHail(u32 battlerId, u32 ability) +static bool32 BattlerAffectedByHail(u32 battlerId, enum Ability ability) { if (!IS_BATTLER_OF_TYPE(battlerId, TYPE_ICE) && ability != ABILITY_SNOW_CLOAK @@ -2892,8 +3174,8 @@ static bool32 BattlerAffectedByHail(u32 battlerId, u32 ability) static u32 GetWeatherDamage(u32 battlerId) { - u32 ability = gAiLogicData->abilities[battlerId]; - enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[battlerId]; + enum Ability ability = gAiLogicData->abilities[battlerId]; + enum HoldEffect holdEffect = gAiLogicData->holdEffects[battlerId]; u32 damage = 0; u32 weather = AI_GetWeather(); if (!weather) @@ -2902,7 +3184,8 @@ static u32 GetWeatherDamage(u32 battlerId) if (weather & B_WEATHER_SANDSTORM) { if (BattlerAffectedBySandstorm(battlerId, ability) - && !(gStatuses3[battlerId] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) + && gBattleMons[battlerId].volatiles.semiInvulnerable != STATE_UNDERGROUND + && gBattleMons[battlerId].volatiles.semiInvulnerable != STATE_UNDERWATER && holdEffect != HOLD_EFFECT_SAFETY_GOGGLES) { damage = GetNonDynamaxMaxHP(battlerId) / 16; @@ -2913,7 +3196,8 @@ static u32 GetWeatherDamage(u32 battlerId) if ((weather & B_WEATHER_HAIL) && ability != ABILITY_ICE_BODY) { if (BattlerAffectedByHail(battlerId, ability) - && !(gStatuses3[battlerId] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) + && gBattleMons[battlerId].volatiles.semiInvulnerable != STATE_UNDERGROUND + && gBattleMons[battlerId].volatiles.semiInvulnerable != STATE_UNDERWATER && holdEffect != HOLD_EFFECT_SAFETY_GOGGLES) { damage = GetNonDynamaxMaxHP(battlerId) / 16; @@ -2941,7 +3225,7 @@ u32 GetBattlerSecondaryDamage(u32 battlerId) return secondaryDamage; } -bool32 BattlerWillFaintFromWeather(u32 battler, u32 ability) +bool32 BattlerWillFaintFromWeather(u32 battler, enum Ability ability) { if ((BattlerAffectedBySandstorm(battler, ability) || BattlerAffectedByHail(battler, ability)) && gBattleMons[battler].hp <= max(1, gBattleMons[battler].maxHP / 16)) @@ -2950,7 +3234,7 @@ bool32 BattlerWillFaintFromWeather(u32 battler, u32 ability) return FALSE; } -bool32 BattlerWillFaintFromSecondaryDamage(u32 battler, u32 ability) +bool32 BattlerWillFaintFromSecondaryDamage(u32 battler, enum Ability ability) { if (GetBattlerSecondaryDamage(battler) != 0 && gBattleMons[battler].hp <= max(1, gBattleMons[battler].maxHP / 16)) @@ -2960,7 +3244,7 @@ bool32 BattlerWillFaintFromSecondaryDamage(u32 battler, u32 ability) static bool32 AnyUsefulStatIsRaised(u32 battler) { - u32 statId; + enum Stat statId; for (statId = STAT_ATK; statId < NUM_BATTLE_STATS; statId++) { @@ -2978,6 +3262,8 @@ static bool32 AnyUsefulStatIsRaised(u32 battler) break; case STAT_SPEED: return TRUE; + default: + break; } } } @@ -2988,16 +3274,16 @@ static bool32 AnyUsefulStatIsRaised(u32 battler) static bool32 PartyBattlerShouldAvoidHazards(u32 currBattler, u32 switchBattler) { struct Pokemon *mon = &GetBattlerParty(currBattler)[switchBattler]; - u32 ability = GetMonAbility(mon); // we know our own party data - enum ItemHoldEffect holdEffect; + enum Ability ability = GetMonAbility(mon); // we know our own party data + enum HoldEffect holdEffect; u32 species = GetMonData(mon, MON_DATA_SPECIES); - u32 flags = gSideStatuses[GetBattlerSide(currBattler)] & (SIDE_STATUS_SPIKES | SIDE_STATUS_STEALTH_ROCK | SIDE_STATUS_STEELSURGE | SIDE_STATUS_STICKY_WEB | SIDE_STATUS_TOXIC_SPIKES); s32 hazardDamage = 0; - u32 type1 = gSpeciesInfo[species].types[0]; - u32 type2 = gSpeciesInfo[species].types[1]; + enum Type type1 = GetSpeciesType(species, 0); + enum Type type2 = GetSpeciesType(species, 1); u32 maxHp = GetMonData(mon, MON_DATA_MAX_HP); + u32 side = GetBattlerSide(currBattler); - if (flags == 0) + if (!AreAnyHazardsOnSide(side)) return FALSE; if (ability == ABILITY_MAGIC_GUARD) @@ -3009,12 +3295,12 @@ static bool32 PartyBattlerShouldAvoidHazards(u32 currBattler, u32 switchBattler) if (holdEffect == HOLD_EFFECT_HEAVY_DUTY_BOOTS) return FALSE; - if (flags & SIDE_STATUS_STEALTH_ROCK) + if (IsHazardOnSide(side, HAZARDS_STEALTH_ROCK)) hazardDamage += GetStealthHazardDamageByTypesAndHP(TYPE_SIDE_HAZARD_POINTED_STONES, type1, type2, maxHp); - if ((flags & SIDE_STATUS_STEELSURGE)) + if (IsHazardOnSide(side, HAZARDS_STEELSURGE)) hazardDamage += GetStealthHazardDamageByTypesAndHP(TYPE_SIDE_HAZARD_SHARP_STEEL, type1, type2, maxHp); - if (flags & SIDE_STATUS_SPIKES && ((type1 != TYPE_FLYING && type2 != TYPE_FLYING + if (IsHazardOnSide(side, HAZARDS_SPIKES) && ((type1 != TYPE_FLYING && type2 != TYPE_FLYING && ability != ABILITY_LEVITATE && holdEffect != HOLD_EFFECT_AIR_BALLOON) || holdEffect == HOLD_EFFECT_IRON_BALL || gFieldStatuses & STATUS_FIELD_GRAVITY)) { @@ -3029,12 +3315,11 @@ static bool32 PartyBattlerShouldAvoidHazards(u32 currBattler, u32 switchBattler) return FALSE; } -enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 moveIndex) +enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 moveIndex) { bool32 hasStatBoost = AnyUsefulStatIsRaised(battlerAtk) || gBattleMons[battlerDef].statStages[STAT_EVASION] >= 9; //Significant boost in evasion for any class u32 battlerToSwitch; - - battlerToSwitch = gBattleStruct->AI_monToSwitchIntoId[battlerAtk]; + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); // Palafin always wants to activate Zero to Hero if (gBattleMons[battlerAtk].species == SPECIES_PALAFIN_ZERO @@ -3042,10 +3327,14 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 mov && CountUsablePartyMons(battlerAtk) != 0) return SHOULD_PIVOT; + battlerToSwitch = gAiLogicData->mostSuitableMonId[battlerAtk]; + // This shouldn't ever happen, but it's there to make sure we don't accidentally read past the gParty array. + if (battlerToSwitch >= PARTY_SIZE) + battlerToSwitch = 0; if (PartyBattlerShouldAvoidHazards(battlerAtk, battlerToSwitch)) return DONT_PIVOT; - if (!IsDoubleBattle()) + if (IsBattle1v1()) { if (CountUsablePartyMons(battlerAtk) == 0) return CAN_TRY_PIVOT; // can't switch, but attack might still be useful @@ -3053,7 +3342,7 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 mov if (IsBattlerPredictedToSwitch(battlerDef)) return SHOULD_PIVOT; // Try pivoting so you can switch to a better matchup to counter your new opponent - if (AI_IsFaster(battlerAtk, battlerDef, move)) // Attacker goes first + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Attacker goes first { if (!CanAIFaintTarget(battlerAtk, battlerDef, 0)) // Can't KO foe otherwise { @@ -3065,7 +3354,7 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 mov if (!IsBattleMoveStatus(move) && ((gAiLogicData->shouldSwitch & (1u << battlerAtk)) || (AI_BattlerAtMaxHp(battlerDef) && (gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_FOCUS_SASH - || (B_STURDY >= GEN_5 && defAbility == ABILITY_STURDY) + || (GetConfig(CONFIG_STURDY) >= GEN_5 && defAbility == ABILITY_STURDY) || defAbility == ABILITY_MULTISCALE || defAbility == ABILITY_SHADOW_SHIELD)))) return SHOULD_PIVOT; // pivot to break sash/sturdy/multiscale @@ -3073,7 +3362,7 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 mov else if (!hasStatBoost) { if (!IsBattleMoveStatus(move) && (AI_BattlerAtMaxHp(battlerDef) && (gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_FOCUS_SASH - || (B_STURDY >= GEN_5 && defAbility == ABILITY_STURDY) + || (GetConfig(CONFIG_STURDY) >= GEN_5 && defAbility == ABILITY_STURDY) || defAbility == ABILITY_MULTISCALE || defAbility == ABILITY_SHADOW_SHIELD))) return SHOULD_PIVOT; // pivot to break sash/sturdy/multiscale @@ -3082,7 +3371,7 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 mov return SHOULD_PIVOT; /* TODO - check if switchable mon unafffected by/will remove hazards - if (gSideStatuses[battlerAtk] & SIDE_STATUS_SPIKES && switchScore >= SWITCHING_INCREASE_CAN_REMOVE_HAZARDS) + if (IsHazardOnSide(GetBattlerSide(battlerAtk, HAZARDS_SPIKES) && switchScore >= SWITCHING_INCREASE_CAN_REMOVE_HAZARDS) return SHOULD_PIVOT;*/ /*if (BattlerWillFaintFromSecondaryDamage(battlerAtk, gAiLogicData->abilities[battlerAtk]) && switchScore >= SWITCHING_INCREASE_WALLS_FOE) @@ -3164,7 +3453,7 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 mov if (!hasStatBoost) { // TODO - check if switching prevents/removes hazards - //if (gSideStatuses[battlerAtk] & SIDE_STATUS_SPIKES && switchScore >= SWITCHING_INCREASE_CAN_REMOVE_HAZARDS) + //if (IsHazardOnSide(GetBattlerSide(battlerAtk, HAZARDS_SPIKES) && switchScore >= SWITCHING_INCREASE_CAN_REMOVE_HAZARDS) //return SHOULD_PIVOT; // TODO - not always a good idea @@ -3228,7 +3517,7 @@ bool32 CanKnockOffItem(u32 battler, u32 item) } // status checks -bool32 IsBattlerIncapacitated(u32 battler, u32 ability) +bool32 IsBattlerIncapacitated(u32 battler, enum Ability ability) { if ((gBattleMons[battler].status1 & STATUS1_FREEZE) && !HasThawingMove(battler)) return TRUE; // if battler has thawing move we assume they will definitely use it, and thus being frozen should be neglected @@ -3236,13 +3525,13 @@ bool32 IsBattlerIncapacitated(u32 battler, u32 ability) if (gBattleMons[battler].status1 & STATUS1_SLEEP && !HasMoveWithEffect(battler, EFFECT_SLEEP_TALK)) return TRUE; - if (gBattleMons[battler].status2 & STATUS2_RECHARGE || (ability == ABILITY_TRUANT && gDisableStructs[battler].truantCounter != 0)) + if (gDisableStructs[battler].rechargeTimer > 0 || (ability == ABILITY_TRUANT && gDisableStructs[battler].truantCounter != 0)) return TRUE; return FALSE; } -bool32 AI_CanPutToSleep(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove) +bool32 AI_CanPutToSleep(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove) { if (!CanBeSlept(battlerAtk, battlerDef, defAbility, BLOCKED_BY_SLEEP_CLAUSE) || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) @@ -3251,7 +3540,7 @@ bool32 AI_CanPutToSleep(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move return TRUE; } -static inline bool32 DoesBattlerBenefitFromAllVolatileStatus(u32 battler, u32 ability) +static inline bool32 DoesBattlerBenefitFromAllVolatileStatus(u32 battler, enum Ability ability) { if (ability == ABILITY_MARVEL_SCALE || ability == ABILITY_QUICK_FEET @@ -3265,7 +3554,7 @@ static inline bool32 DoesBattlerBenefitFromAllVolatileStatus(u32 battler, u32 ab bool32 ShouldPoison(u32 battlerAtk, u32 battlerDef) { - u32 abilityDef = gAiLogicData->abilities[battlerDef]; + enum Ability abilityDef = gAiLogicData->abilities[battlerDef]; // Battler can be poisoned and has move/ability that synergizes with being poisoned if (CanBePoisoned(battlerAtk, battlerDef, gAiLogicData->abilities[battlerAtk], abilityDef) && ( DoesBattlerBenefitFromAllVolatileStatus(battlerDef, abilityDef) @@ -3283,7 +3572,7 @@ bool32 ShouldPoison(u32 battlerAtk, u32 battlerDef) return TRUE; } -bool32 ShouldBurn(u32 battlerAtk, u32 battlerDef, u32 abilityDef) +bool32 ShouldBurn(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef) { // Battler can be burned and has move/ability that synergizes with being burned if (CanBeBurned(battlerAtk, battlerDef, abilityDef) && ( @@ -3303,7 +3592,7 @@ bool32 ShouldBurn(u32 battlerAtk, u32 battlerDef, u32 abilityDef) return TRUE; } -bool32 ShouldFreezeOrFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef) +bool32 ShouldFreezeOrFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef) { if (!B_USE_FROSTBITE) { @@ -3335,7 +3624,7 @@ bool32 ShouldFreezeOrFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef) } } -bool32 ShouldParalyze(u32 battlerAtk, u32 battlerDef, u32 abilityDef) +bool32 ShouldParalyze(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef) { // Battler can be paralyzed and has move/ability that synergizes with being paralyzed if (CanBeParalyzed(battlerAtk, battlerDef, abilityDef) && ( @@ -3352,7 +3641,7 @@ bool32 ShouldParalyze(u32 battlerAtk, u32 battlerDef, u32 abilityDef) return TRUE; } -bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove) +bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove) { if (!CanBePoisoned(battlerAtk, battlerDef, gAiLogicData->abilities[battlerAtk], defAbility) || gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0) @@ -3363,7 +3652,7 @@ bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u3 return TRUE; } -bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove) +bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove) { if (!CanBeParalyzed(battlerAtk, battlerDef, defAbility) || gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0) @@ -3373,18 +3662,18 @@ bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, return TRUE; } -bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, u32 ability) +bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability abilityDef) { - if ((gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) - || (ability == ABILITY_OWN_TEMPO && !DoesBattlerIgnoreAbilityChecks(battlerAtk, gAiLogicData->abilities[battlerAtk], move)) - || IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN) + if (gBattleMons[battlerDef].volatiles.confusionTurns > 0 + || (abilityDef == ABILITY_OWN_TEMPO && !DoesBattlerIgnoreAbilityChecks(battlerAtk, gAiLogicData->abilities[battlerAtk], move)) + || IsBattlerTerrainAffected(battlerDef, abilityDef, gAiLogicData->holdEffects[battlerDef], STATUS_FIELD_MISTY_TERRAIN) || gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SAFEGUARD || DoesSubstituteBlockMove(battlerAtk, battlerDef, move)) return FALSE; return TRUE; } -bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove) +bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove) { if (GetBattlerMoveTargetType(battlerAtk, move) == MOVE_TARGET_FOES_AND_ALLY && AI_CanBeConfused(battlerAtk, battlerDef, move, defAbility) @@ -3398,7 +3687,7 @@ bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battler return TRUE; } -bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove) +bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove) { if (!CanBeBurned(battlerAtk, battlerDef, defAbility) || gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0) @@ -3410,7 +3699,7 @@ bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtk return TRUE; } -bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove) +bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove) { if (!CanBeFrozen(battlerAtk, battlerDef, defAbility) || gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0) @@ -3422,9 +3711,9 @@ bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 b return TRUE; } -bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, u32 defAbility) +bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, enum Ability defAbility) { - if ((gBattleMons[battlerDef].status2 & STATUS2_INFATUATION) + if (gBattleMons[battlerDef].volatiles.infatuation || gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0) || defAbility == ABILITY_OBLIVIOUS || !AreBattlersOfOppositeGender(battlerAtk, battlerDef) @@ -3433,20 +3722,21 @@ bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, u32 defAbility) return TRUE; } -u32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbility, u32 move) +u32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, enum Ability defAbility, u32 move) { + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); if (((!IsMoldBreakerTypeAbility(battlerAtk, gAiLogicData->abilities[battlerAtk]) && (defAbility == ABILITY_SHIELD_DUST || defAbility == ABILITY_INNER_FOCUS)) || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_COVERT_CLOAK || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) - || AI_IsSlower(battlerAtk, battlerDef, move))) // Opponent goes first + || AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY))) // Opponent goes first { return 0; } else if ((atkAbility == ABILITY_SERENE_GRACE || gBattleMons[battlerDef].status1 & STATUS1_PARALYSIS - || gBattleMons[battlerDef].status2 & STATUS2_INFATUATION - || gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) - || ((AI_IsFaster(battlerAtk, battlerDef, move)) && CanTargetFaintAi(battlerDef, battlerAtk))) + || gBattleMons[battlerDef].volatiles.infatuation + || gBattleMons[battlerDef].volatiles.confusionTurns > 0) + || ((AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) && CanTargetFaintAi(battlerDef, battlerAtk))) { return 2; // good idea to flinch } @@ -3474,18 +3764,58 @@ bool32 ShouldTrap(u32 battlerAtk, u32 battlerDef, u32 move) return FALSE; } -bool32 ShouldFakeOut(u32 battlerAtk, u32 battlerDef, u32 move) +bool32 IsFlinchGuaranteed(u32 battlerAtk, u32 battlerDef, u32 move) { - if ((!gDisableStructs[battlerAtk].isFirstTurn && MoveHasAdditionalEffectWithChance(move, MOVE_EFFECT_FLINCH, 100)) - || gAiLogicData->abilities[battlerAtk] == ABILITY_GORILLA_TACTICS - || gAiLogicData->holdEffects[battlerAtk] == HOLD_EFFECT_CHOICE_BAND - || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_COVERT_CLOAK - || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) - || (!IsMoldBreakerTypeAbility(battlerAtk, gAiLogicData->abilities[battlerAtk]) - && (gAiLogicData->abilities[battlerDef] == ABILITY_SHIELD_DUST || gAiLogicData->abilities[battlerDef] == ABILITY_INNER_FOCUS))) + if (!MoveHasAdditionalEffect(move, MOVE_EFFECT_FLINCH)) return FALSE; - return TRUE; + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) + return FALSE; + + u32 i; + u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); + // check move additional effects that are likely to happen + for (i = 0; i < additionalEffectCount; i++) + { + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + // Only consider effects with a guaranteed chance to happen + if (!MoveEffectIsGuaranteed(battlerAtk, gAiLogicData->abilities[battlerAtk], additionalEffect)) + continue; + + if (additionalEffect->moveEffect == MOVE_EFFECT_FLINCH) + { + if (gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_COVERT_CLOAK + || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) + || (!IsMoldBreakerTypeAbility(battlerAtk, gAiLogicData->abilities[battlerAtk]) + && (gAiLogicData->abilities[battlerDef] == ABILITY_SHIELD_DUST || gAiLogicData->abilities[battlerDef] == ABILITY_INNER_FOCUS))) + return FALSE; + else + return TRUE; + } + } + return FALSE; +} + +bool32 HasChoiceEffect(u32 battler) +{ + enum Ability ability = gAiLogicData->abilities[battler]; + if (ability == ABILITY_GORILLA_TACTICS) + return TRUE; + + if (ability == ABILITY_KLUTZ) + return FALSE; + + enum HoldEffect holdEffect = gAiLogicData->holdEffects[battler]; + switch (holdEffect) + { + case HOLD_EFFECT_CHOICE_BAND: + case HOLD_EFFECT_CHOICE_SCARF: + case HOLD_EFFECT_CHOICE_SPECS: + return TRUE; + default: + return FALSE; + } } static u32 FindMoveUsedXTurnsAgo(u32 battlerId, u32 x) @@ -3512,19 +3842,21 @@ bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) { struct Pokemon *party; u32 i, battlerOnField1, battlerOnField2; + bool32 hasStatusToCure = FALSE; party = GetBattlerParty(battlerId); - if (IsDoubleBattle()) + if (HasPartner(battlerId)) { battlerOnField1 = gBattlerPartyIndexes[battlerId]; battlerOnField2 = gBattlerPartyIndexes[GetPartnerBattler(battlerId)]; // Check partner's status - if ((GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 + if ((GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 || gAiLogicData->abilities[BATTLE_PARTNER(battlerId)] != ABILITY_SOUNDPROOF || !checkSoundproof) - && GetMonData(&party[battlerOnField2], MON_DATA_STATUS) != STATUS1_NONE) - return TRUE; + && GetMonData(&party[battlerOnField2], MON_DATA_STATUS) != STATUS1_NONE + && ShouldCureStatus(battlerId, BATTLE_PARTNER(battlerId), gAiLogicData)) + hasStatusToCure = TRUE; } else // In singles there's only one battlerId by side. { @@ -3533,18 +3865,19 @@ bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) } // Check attacker's status - if ((GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 - || GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) >= GEN_8 + if ((GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 + || GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) >= GEN_8 || gAiLogicData->abilities[battlerId] != ABILITY_SOUNDPROOF || !checkSoundproof) - && GetMonData(&party[battlerOnField1], MON_DATA_STATUS) != STATUS1_NONE) - return TRUE; + && GetMonData(&party[battlerOnField1], MON_DATA_STATUS) != STATUS1_NONE + && ShouldCureStatus(battlerId, battlerId, gAiLogicData)) + hasStatusToCure = TRUE; // Check inactive party mons' status for (i = 0; i < PARTY_SIZE; i++) { if (i == battlerOnField1 || i == battlerOnField2) continue; - if (GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) < GEN_5 + if (GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) < GEN_5 && checkSoundproof && GetMonAbility(&party[i]) == ABILITY_SOUNDPROOF) continue; @@ -3552,28 +3885,7 @@ bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) return TRUE; } - return FALSE; -} - -u32 GetBattlerSideSpeedAverage(u32 battler) -{ - u32 speed1 = 0; - u32 speed2 = 0; - u32 numBattlersAlive = 0; - - if (IsBattlerAlive(battler)) - { - speed1 = gAiLogicData->speedStats[battler]; - numBattlersAlive++; - } - - if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battler))) - { - speed2 = gAiLogicData->speedStats[BATTLE_PARTNER(battler)]; - numBattlersAlive++; - } - - return (speed1 + speed2) / numBattlersAlive; + return hasStatusToCure; } bool32 ShouldUseRecoilMove(u32 battlerAtk, u32 battlerDef, u32 recoilDmg, u32 moveIndex) @@ -3592,12 +3904,13 @@ bool32 ShouldUseRecoilMove(u32 battlerAtk, u32 battlerDef, u32 recoilDmg, u32 mo bool32 ShouldAbsorb(u32 battlerAtk, u32 battlerDef, u32 move, s32 damage) { - if (move == 0xFFFF || AI_IsFaster(battlerAtk, battlerDef, move)) + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + if (move == 0xFFFF || AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) { // using item or user goes first s32 healDmg = (GetMoveAbsorbPercentage(move) * damage) / 100; - if (gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK) + if (gBattleMons[battlerAtk].volatiles.healBlock) healDmg = 0; if (CanTargetFaintAi(battlerDef, battlerAtk) @@ -3616,21 +3929,31 @@ bool32 ShouldAbsorb(u32 battlerAtk, u32 battlerDef, u32 move, s32 damage) return FALSE; } -bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, u32 move, u32 healPercent, enum DamageCalcContext calcContext) +bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, u32 move, u32 healPercent) { - if (move == 0xFFFF || AI_IsFaster(battlerAtk, battlerDef, move)) + u32 maxHP = gBattleMons[battlerAtk].maxHP; + u32 healAmount = (healPercent * maxHP) / 100; + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + if (healAmount > maxHP) + healAmount = maxHP; + if (gBattleMons[battlerAtk].volatiles.healBlock) + healAmount = 0; + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) { - // using item or user going first - s32 damage = AI_GetDamage(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, calcContext, gAiLogicData); - s32 healAmount = (healPercent * damage) / 100; - if (gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK) - healAmount = 0; - if (CanTargetFaintAi(battlerDef, battlerAtk) && !CanTargetFaintAiWithMod(battlerDef, battlerAtk, healAmount, 0)) return TRUE; // target can faint attacker unless they heal - else if (!CanTargetFaintAi(battlerDef, battlerAtk) && gAiLogicData->hpPercents[battlerAtk] < 60 && (Random() % 3)) - return TRUE; // target can't faint attacker at all, attacker health is about half, 2/3rds rate of encouraging healing + else if (!CanTargetFaintAi(battlerDef, battlerAtk) && gAiLogicData->hpPercents[battlerAtk] < ENABLE_RECOVERY_THRESHOLD && RandomPercentage(RNG_AI_SHOULD_RECOVER, SHOULD_RECOVER_CHANCE)) + return TRUE; // target can't faint attacker at all, generally safe + } + else + { + if (!CanTargetFaintAi(battlerDef, battlerAtk) + && GetBestDmgFromBattler(battlerDef, battlerAtk, AI_DEFENDING) < healAmount + && NoOfHitsForTargetToFaintBattler(battlerDef, battlerAtk) < NoOfHitsForTargetToFaintBattlerWithMod(battlerDef, battlerAtk, healAmount)) + return TRUE; // target can't faint attacker and is dealing less damage than we're healing + else if (!CanTargetFaintAi(battlerDef, battlerAtk) && gAiLogicData->hpPercents[battlerAtk] < ENABLE_RECOVERY_THRESHOLD && RandomPercentage(RNG_AI_SHOULD_RECOVER, SHOULD_RECOVER_CHANCE)) + return TRUE; // target can't faint attacker at all, generally safe } return FALSE; } @@ -3640,28 +3963,27 @@ bool32 ShouldSetScreen(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects mo u32 atkSide = GetBattlerSide(battlerAtk); // Don't waste a turn if screens will be broken - if (HasMoveWithEffect(battlerDef, EFFECT_BRICK_BREAK) - || HasMoveWithEffect(battlerDef, EFFECT_RAGING_BULL)) + if (HasMoveWithAIEffect(battlerDef, AI_EFFECT_BREAK_SCREENS)) return FALSE; switch (moveEffect) { case EFFECT_AURORA_VEIL: // Use only in Hail and only if AI doesn't already have Reflect, Light Screen or Aurora Veil itself active. - if ((AI_GetWeather() & (B_WEATHER_HAIL | B_WEATHER_SNOW)) + if ((AI_GetWeather() & (B_WEATHER_ICY_ANY)) && !(gSideStatuses[atkSide] & (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL))) return TRUE; break; case EFFECT_REFLECT: // Use only if the player has a physical move and AI doesn't already have Reflect itself active. if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL) - && !(gSideStatuses[atkSide] & SIDE_STATUS_REFLECT)) + && !(gSideStatuses[atkSide] & (SIDE_STATUS_REFLECT | SIDE_STATUS_AURORA_VEIL))) return TRUE; break; case EFFECT_LIGHT_SCREEN: // Use only if the player has a special move and AI doesn't already have Light Screen itself active. if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL) - && !(gSideStatuses[atkSide] & SIDE_STATUS_LIGHTSCREEN)) + && !(gSideStatuses[atkSide] & (SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL))) return TRUE; break; default: @@ -3671,166 +3993,412 @@ bool32 ShouldSetScreen(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects mo return FALSE; } -// Partner Logic -bool32 IsValidDoubleBattle(u32 battlerAtk) -{ - if (IsDoubleBattle() - && ((IsBattlerAlive(BATTLE_OPPOSITE(battlerAtk)) && IsBattlerAlive(BATTLE_PARTNER(BATTLE_OPPOSITE(battlerAtk)))) || IsBattlerAlive(BATTLE_PARTNER(battlerAtk)))) - return TRUE; - return FALSE; -} - -u32 GetAllyChosenMove(u32 battlerId) +static bool32 ShouldCureStatusInternal(u32 battlerAtk, u32 battlerDef, bool32 usingItem, struct AiLogicData *aiData) { - u32 partnerBattler = BATTLE_PARTNER(battlerId); + bool32 targetingSelf = (battlerAtk == battlerDef); + bool32 targetingAlly = IsTargetingPartner(battlerAtk, battlerDef); + u32 status = gBattleMons[battlerDef].status1; - if (!IsBattlerAlive(partnerBattler) || !IsAiBattlerAware(partnerBattler)) - return MOVE_NONE; - else if (partnerBattler > battlerId) // Battler with the lower id chooses the move first. - return gLastMoves[partnerBattler]; - else - return gBattleMons[partnerBattler].moves[gBattleStruct->chosenMovePositions[partnerBattler]]; -} + if (status & STATUS1_SLEEP) + { + if (targetingAlly || targetingSelf) + { + if (HasMoveWithEffect(battlerDef, EFFECT_SLEEP_TALK) || HasMoveWithEffect(battlerDef, EFFECT_SNORE)) + return FALSE; + else + return usingItem || targetingAlly; + } + return FALSE; + } -//PARTNER_MOVE_EFFECT_IS_SAME -bool32 DoesPartnerHaveSameMoveEffect(u32 battlerAtkPartner, u32 battlerDef, u32 move, u32 partnerMove) -{ - if (!IsDoubleBattle()) + if (status & STATUS1_FREEZE) + { + if (targetingAlly || targetingSelf) + { + if (HasThawingMove(battlerDef)) + return FALSE; + return usingItem || targetingAlly; + } return FALSE; + } - if (GetMoveEffect(move) == GetMoveEffect(partnerMove) - && partnerMove != MOVE_NONE - && gBattleStruct->moveTarget[battlerAtkPartner] == battlerDef) + bool32 isHarmless = FALSE; + + if (DoesBattlerBenefitFromAllVolatileStatus(battlerDef, aiData->abilities[battlerDef])) + isHarmless = TRUE; + + if (status & STATUS1_PSN_ANY) { - return TRUE; + if (aiData->holdEffects[battlerDef] == HOLD_EFFECT_TOXIC_ORB) + return FALSE; + + if (aiData->abilities[battlerDef] == ABILITY_POISON_HEAL) + isHarmless = TRUE; + + if (aiData->abilities[battlerDef] == ABILITY_TOXIC_BOOST && !isHarmless) + { + if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)) + isHarmless = TRUE; + else if (!(targetingSelf || targetingAlly) && !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)) + isHarmless = TRUE; + } + } + + if (status & STATUS1_BURN) + { + if (aiData->holdEffects[battlerDef] == HOLD_EFFECT_FLAME_ORB) + return FALSE; + + if (aiData->abilities[battlerDef] == ABILITY_FLARE_BOOST && !isHarmless) + { + if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)) + isHarmless = TRUE; + else if (!(targetingSelf || targetingAlly) && !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)) + isHarmless = TRUE; + } + } + +/* + if (status & STATUS1_PARALYSIS) + if (status & STATUS1_FROSTBITE) +*/ + + if (isHarmless) + { + if (targetingSelf || targetingAlly) + return FALSE; + else + return TRUE; + } + else + { + if (targetingSelf || targetingAlly) + return TRUE; + else + return FALSE; } - return FALSE; } -//PARTNER_MOVE_EFFECT_IS_SAME_NO_TARGET -bool32 PartnerHasSameMoveEffectWithoutTarget(u32 battlerAtkPartner, u32 move, u32 partnerMove) +bool32 ShouldCureStatus(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData) { - if (!IsDoubleBattle()) - return FALSE; + return ShouldCureStatusInternal(battlerAtk, battlerDef, FALSE, aiData); +} - if (GetMoveEffect(move) == GetMoveEffect(partnerMove) - && partnerMove != MOVE_NONE) - return TRUE; - return FALSE; +bool32 ShouldCureStatusWithItem(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData) +{ + return ShouldCureStatusInternal(battlerAtk, battlerDef, TRUE, aiData); } -//PARTNER_MOVE_EFFECT_IS_STATUS_SAME_TARGET -bool32 PartnerMoveEffectIsStatusSameTarget(u32 battlerAtkPartner, u32 battlerDef, u32 partnerMove) +// Partner Logic +bool32 IsBattle1v1(void) { - if (!IsDoubleBattle()) + if (IsDoubleBattle() + && ((IsBattlerAlive(B_POSITION_PLAYER_LEFT) && IsBattlerAlive(B_POSITION_PLAYER_RIGHT)) + || (IsBattlerAlive(B_POSITION_OPPONENT_LEFT) && IsBattlerAlive(B_POSITION_OPPONENT_RIGHT)))) return FALSE; + return TRUE; +} - enum BattleMoveEffects partnerEffect = GetMoveEffect(partnerMove); - u32 nonVolatileStatus = GetMoveNonVolatileStatus(partnerMove); - if (partnerMove != MOVE_NONE - && gBattleStruct->moveTarget[battlerAtkPartner] == battlerDef - && (nonVolatileStatus == MOVE_EFFECT_POISON - || nonVolatileStatus == MOVE_EFFECT_TOXIC - || nonVolatileStatus == MOVE_EFFECT_SLEEP - || nonVolatileStatus == MOVE_EFFECT_PARALYSIS - || nonVolatileStatus == MOVE_EFFECT_BURN - || partnerEffect == EFFECT_YAWN)) +bool32 HasTwoOpponents(u32 battler) +{ + if (IsDoubleBattle() + && IsBattlerAlive(LEFT_FOE(battler)) && IsBattlerAlive(RIGHT_FOE(battler))) return TRUE; return FALSE; } -bool32 IsMoveEffectWeather(u32 move) +bool32 HasPartner(u32 battler) { - enum BattleMoveEffects effect = GetMoveEffect(move); - if (move != MOVE_NONE - && (effect == EFFECT_SUNNY_DAY - || effect == EFFECT_RAIN_DANCE - || effect == EFFECT_SANDSTORM - || effect == EFFECT_HAIL - || effect == EFFECT_SNOWSCAPE - || effect == EFFECT_CHILLY_RECEPTION)) - return TRUE; + if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battler))) + { + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_ATTACKS_PARTNER) + return FALSE; + else + return TRUE; + } return FALSE; } -//PARTNER_MOVE_EFFECT_IS_TERRAIN -bool32 PartnerMoveEffectIsTerrain(u32 battlerAtkPartner, u32 partnerMove) +bool32 HasPartnerIgnoreFlags(u32 battler) { - if (!IsDoubleBattle()) - return FALSE; - - enum BattleMoveEffects partnerEffect = GetMoveEffect(partnerMove); - if (partnerMove != MOVE_NONE - && (partnerEffect == EFFECT_GRASSY_TERRAIN - || partnerEffect == EFFECT_MISTY_TERRAIN - || partnerEffect == EFFECT_ELECTRIC_TERRAIN - || partnerEffect == EFFECT_PSYCHIC_TERRAIN)) + if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battler))) + { return TRUE; - + } return FALSE; } -//PARTNER_MOVE_EFFECT_IS -bool32 PartnerMoveEffectIs(u32 battlerAtkPartner, u32 partnerMove, enum BattleMoveEffects effectCheck) +bool32 IsTargetingPartner(u32 battlerAtk, u32 battlerDef) { - if (!IsDoubleBattle()) + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_ATTACKS_PARTNER) return FALSE; - - if (partnerMove != MOVE_NONE && GetMoveEffect(partnerMove) == effectCheck) - return TRUE; - - return FALSE; + return ((battlerAtk) == (battlerDef ^ BIT_FLANK)); } -//PARTNER_MOVE_IS_TAILWIND_TRICKROOM -bool32 PartnerMoveIs(u32 battlerAtkPartner, u32 partnerMove, u32 moveCheck) +u32 GetAllyChosenMove(u32 battlerId) { - if (!IsDoubleBattle()) - return FALSE; + u32 partnerBattler = BATTLE_PARTNER(battlerId); - if (partnerMove != MOVE_NONE && partnerMove == moveCheck) - return TRUE; - return FALSE; + if (!IsBattlerAlive(partnerBattler) || !IsAiBattlerAware(partnerBattler)) + return MOVE_NONE; + else if (partnerBattler > battlerId) // Battler with the lower id chooses the move first. + return gAiLogicData->lastUsedMove[partnerBattler]; + else + return GetChosenMoveFromPosition(partnerBattler); } -//PARTNER_MOVE_IS_SAME -bool32 PartnerMoveIsSameAsAttacker(u32 battlerAtkPartner, u32 battlerDef, u32 move, u32 partnerMove) +bool32 AreMovesEquivalent(u32 battlerAtk, u32 battlerAtkPartner, u32 move, u32 partnerMove) { - if (!IsDoubleBattle()) + if (!IsBattlerAlive(battlerAtkPartner) || partnerMove == MOVE_NONE) return FALSE; - if (partnerMove != MOVE_NONE && move == partnerMove && gBattleStruct->moveTarget[battlerAtkPartner] == battlerDef) - return TRUE; - return FALSE; -} + u32 battlerDef = gBattleStruct->moveTarget[battlerAtk]; -//PARTNER_MOVE_IS_SAME_NO_TARGET -bool32 PartnerMoveIsSameNoTarget(u32 battlerAtkPartner, u32 move, u32 partnerMove) -{ - if (!IsDoubleBattle()) + // We don't care the effect is basically the same; we would use this move anyway. + if (GetBestDmgMoveFromBattler(battlerAtk, battlerDef, AI_ATTACKING) == move) return FALSE; - if (partnerMove != MOVE_NONE && move == partnerMove) + + u32 atkEffect = GetAIEffectGroupFromMove(battlerAtk, move); + u32 partnerEffect = GetAIEffectGroupFromMove(battlerAtkPartner, partnerMove); + + // shared bits indicate they're meaningfully the same in some way + if (atkEffect & partnerEffect) + { + if (GetMoveTarget(move) == MOVE_TARGET_SELECTED && GetMoveTarget(partnerMove) == MOVE_TARGET_SELECTED) + { + if (battlerDef == gBattleStruct->moveTarget[battlerAtkPartner]) + return TRUE; + else + return FALSE; + } return TRUE; + } return FALSE; } -bool32 PartnerMoveActivatesSleepClause(u32 partnerMove) -{ - if (!IsDoubleBattle() || !IsSleepClauseEnabled()) - return FALSE; - return IsMoveSleepClauseTrigger(partnerMove); -} - -bool32 ShouldUseWishAromatherapy(u32 battlerAtk, u32 battlerDef, u32 move) +static u32 GetAIEffectGroup(enum BattleMoveEffects effect) { - u32 i; - s32 firstId, lastId; - struct Pokemon* party; - bool32 hasStatus = AnyPartyMemberStatused(battlerAtk, IsSoundMove(move)); - bool32 needHealing = FALSE; + u32 aiEffect = AI_EFFECT_NONE; - GetAIPartyIndexes(battlerAtk, &firstId, &lastId); - party = GetBattlerParty(battlerAtk); + switch (effect) + { + case EFFECT_SUNNY_DAY: + case EFFECT_RAIN_DANCE: + case EFFECT_SANDSTORM: + case EFFECT_HAIL: + case EFFECT_SNOWSCAPE: + case EFFECT_CHILLY_RECEPTION: + aiEffect |= AI_EFFECT_WEATHER; + break; + case EFFECT_ELECTRIC_TERRAIN: + case EFFECT_GRASSY_TERRAIN: + case EFFECT_MISTY_TERRAIN: + case EFFECT_PSYCHIC_TERRAIN: + case EFFECT_STEEL_ROLLER: + case EFFECT_ICE_SPINNER: + aiEffect |= AI_EFFECT_TERRAIN; + break; + case EFFECT_COURT_CHANGE: + aiEffect |= AI_EFFECT_CLEAR_HAZARDS | AI_EFFECT_AURORA_VEIL | AI_EFFECT_BREAK_SCREENS; + break; + case EFFECT_DEFOG: + aiEffect |= AI_EFFECT_CLEAR_HAZARDS | AI_EFFECT_BREAK_SCREENS; + break; + case EFFECT_RAPID_SPIN: + case EFFECT_TIDY_UP: + aiEffect |= AI_EFFECT_CLEAR_HAZARDS; + break; + case EFFECT_BRICK_BREAK: + case EFFECT_RAGING_BULL: + aiEffect |= AI_EFFECT_BREAK_SCREENS; + break; + case EFFECT_HAZE: + aiEffect |= AI_EFFECT_RESET_STATS; + break; + case EFFECT_HIT_SWITCH_TARGET: + case EFFECT_ROAR: + aiEffect |= AI_EFFECT_FORCE_SWITCH; + break; + case EFFECT_TORMENT: + aiEffect |= AI_EFFECT_TORMENT; + break; + case EFFECT_AURORA_VEIL: + aiEffect |= AI_EFFECT_AURORA_VEIL; + break; + case EFFECT_LIGHT_SCREEN: + aiEffect |= AI_EFFECT_LIGHT_SCREEN; + break; + case EFFECT_REFLECT: + aiEffect |= AI_EFFECT_REFLECT; + break; + case EFFECT_GRAVITY: + aiEffect |= AI_EFFECT_GRAVITY; + break; + case EFFECT_DOODLE: + case EFFECT_ENTRAINMENT: + case EFFECT_GASTRO_ACID: + case EFFECT_ROLE_PLAY: + case EFFECT_SKILL_SWAP: + case EFFECT_OVERWRITE_ABILITY: + aiEffect |= AI_EFFECT_CHANGE_ABILITY; + break; + default: + break; + } + return aiEffect; +} + +static u32 GetAIEffectGroupFromMove(u32 battler, u32 move) +{ + u32 aiEffect = GetAIEffectGroup(GetMoveEffect(move)); + + u32 i; + u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); + for (i = 0; i < additionalEffectCount; i++) + { + switch (GetMoveAdditionalEffectById(move, i)->moveEffect) + { + case MOVE_EFFECT_SUN: + case MOVE_EFFECT_RAIN: + case MOVE_EFFECT_SANDSTORM: + case MOVE_EFFECT_HAIL: + aiEffect |= AI_EFFECT_WEATHER; + break; + case MOVE_EFFECT_ELECTRIC_TERRAIN: + case MOVE_EFFECT_GRASSY_TERRAIN: + case MOVE_EFFECT_MISTY_TERRAIN: + case MOVE_EFFECT_PSYCHIC_TERRAIN: + aiEffect |= AI_EFFECT_TERRAIN; + break; + case MOVE_EFFECT_DEFOG: + aiEffect |= AI_EFFECT_CLEAR_HAZARDS | AI_EFFECT_BREAK_SCREENS; + break; + case MOVE_EFFECT_CLEAR_SMOG: + case MOVE_EFFECT_HAZE: + aiEffect |= AI_EFFECT_RESET_STATS; + break; + case MOVE_EFFECT_TORMENT_SIDE: + aiEffect |= AI_EFFECT_TORMENT; + break; + case MOVE_EFFECT_LIGHT_SCREEN: + aiEffect |= AI_EFFECT_LIGHT_SCREEN; + break; + case MOVE_EFFECT_REFLECT: + aiEffect |= AI_EFFECT_REFLECT; + break; + case MOVE_EFFECT_AURORA_VEIL: + aiEffect |= AI_EFFECT_AURORA_VEIL; + break; + case MOVE_EFFECT_GRAVITY: + aiEffect |= AI_EFFECT_GRAVITY; + break; + default: + break; + } + } + + return aiEffect; +} + +// It matches both on move effect and on AI move effect; eg, EFFECT_HAZE will also bring up Freezy Frost or Clear Smog, anything with AI_EFFECT_RESET_STATS. +bool32 DoesPartnerHaveSameMoveEffect(u32 battlerAtkPartner, u32 battlerDef, u32 move, u32 partnerMove) +{ + if (!HasPartner(battlerAtkPartner)) + return FALSE; + + if (GetMoveEffect(move) == GetMoveEffect(partnerMove) + && partnerMove != MOVE_NONE) + { + if (GetMoveTarget(move) == MOVE_TARGET_SELECTED && GetMoveTarget(partnerMove) == MOVE_TARGET_SELECTED) + { + return gBattleStruct->moveTarget[battlerAtkPartner] == battlerDef; + } + return TRUE; + } + return FALSE; +} + +//PARTNER_MOVE_EFFECT_IS_STATUS_SAME_TARGET +bool32 PartnerMoveEffectIsStatusSameTarget(u32 battlerAtkPartner, u32 battlerDef, u32 partnerMove) +{ + if (!HasPartner(battlerAtkPartner)) + return FALSE; + + enum BattleMoveEffects partnerEffect = GetMoveEffect(partnerMove); + u32 nonVolatileStatus = GetMoveNonVolatileStatus(partnerMove); + if (partnerMove != MOVE_NONE + && gBattleStruct->moveTarget[battlerAtkPartner] == battlerDef + && (nonVolatileStatus == MOVE_EFFECT_POISON + || nonVolatileStatus == MOVE_EFFECT_TOXIC + || nonVolatileStatus == MOVE_EFFECT_SLEEP + || nonVolatileStatus == MOVE_EFFECT_PARALYSIS + || nonVolatileStatus == MOVE_EFFECT_BURN + || partnerEffect == EFFECT_YAWN)) + return TRUE; + return FALSE; +} + +//PARTNER_MOVE_EFFECT_IS +bool32 PartnerMoveEffectIs(u32 battlerAtkPartner, u32 partnerMove, enum BattleMoveEffects effectCheck) +{ + if (!HasPartner(battlerAtkPartner)) + return FALSE; + + if (partnerMove != MOVE_NONE && GetMoveEffect(partnerMove) == effectCheck) + return TRUE; + + return FALSE; +} + +//PARTNER_MOVE_IS_TAILWIND_TRICKROOM +bool32 PartnerMoveIs(u32 battlerAtkPartner, u32 partnerMove, u32 moveCheck) +{ + if (!HasPartner(battlerAtkPartner)) + return FALSE; + + if (partnerMove != MOVE_NONE && partnerMove == moveCheck) + return TRUE; + return FALSE; +} + +//PARTNER_MOVE_IS_SAME +bool32 PartnerMoveIsSameAsAttacker(u32 battlerAtkPartner, u32 battlerDef, u32 move, u32 partnerMove) +{ + if (!HasPartner(battlerAtkPartner)) + return FALSE; + + if (partnerMove != MOVE_NONE && move == partnerMove && gBattleStruct->moveTarget[battlerAtkPartner] == battlerDef) + return TRUE; + return FALSE; +} + +//PARTNER_MOVE_IS_SAME_NO_TARGET +bool32 PartnerMoveIsSameNoTarget(u32 battlerAtkPartner, u32 move, u32 partnerMove) +{ + if (!HasPartner(battlerAtkPartner)) + return FALSE; + if (partnerMove != MOVE_NONE && move == partnerMove) + return TRUE; + return FALSE; +} + +bool32 PartnerMoveActivatesSleepClause(u32 partnerMove) +{ + if (IsBattle1v1() || !IsSleepClauseEnabled()) + return FALSE; + return IsMoveSleepClauseTrigger(partnerMove); +} + +bool32 ShouldUseWishAromatherapy(u32 battlerAtk, u32 battlerDef, u32 move) +{ + u32 i; + s32 firstId, lastId; + struct Pokemon* party; + bool32 hasStatus = AnyPartyMemberStatused(battlerAtk, IsSoundMove(move)); + bool32 needHealing = FALSE; + + GetAIPartyIndexes(battlerAtk, &firstId, &lastId); + party = GetBattlerParty(battlerAtk); if (CountUsablePartyMons(battlerAtk) == 0 && (CanTargetFaintAi(battlerDef, battlerAtk) || BattlerWillFaintFromSecondaryDamage(battlerAtk, gAiLogicData->abilities[battlerAtk]))) @@ -3851,7 +4419,7 @@ bool32 ShouldUseWishAromatherapy(u32 battlerAtk, u32 battlerDef, u32 move) } } - if (!IsDoubleBattle()) + if (IsBattle1v1()) { switch (GetMoveEffect(move)) { @@ -3872,7 +4440,7 @@ bool32 ShouldUseWishAromatherapy(u32 battlerAtk, u32 battlerDef, u32 move) switch (GetMoveEffect(move)) { case EFFECT_WISH: - return ShouldRecover(battlerAtk, battlerDef, move, 50, AI_DEFENDING); // Switch recovery isn't good idea in doubles + return ShouldRecover(battlerAtk, battlerDef, move, 50); // Switch recovery isn't good idea in doubles case EFFECT_HEAL_BELL: if (hasStatus) return TRUE; @@ -3900,11 +4468,32 @@ void FreeRestoreBattleMons(struct BattlePokemon *savedBattleMons) Free(savedBattleMons); } +// Set potential field effect from ability for switch in +static void SetBattlerFieldStatusForSwitchin(u32 battler) +{ + switch (gAiLogicData->abilities[battler]) + { + case ABILITY_VESSEL_OF_RUIN: + gBattleMons[battler].volatiles.vesselOfRuin = TRUE; + break; + case ABILITY_SWORD_OF_RUIN: + gBattleMons[battler].volatiles.swordOfRuin = TRUE; + break; + case ABILITY_TABLETS_OF_RUIN: + gBattleMons[battler].volatiles.tabletsOfRuin = TRUE; + break; + case ABILITY_BEADS_OF_RUIN: + gBattleMons[battler].volatiles.beadsOfRuin = TRUE; + break; + default: + break; + } +} + // party logic -s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, enum DamageCalcContext calcContext) +s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, uq4_12_t *effectiveness, enum DamageCalcContext calcContext) { struct SimulatedDamage dmg; - uq4_12_t effectiveness; struct BattlePokemon *savedBattleMons = AllocSaveBattleMons(); if (calcContext == AI_ATTACKING) @@ -3912,6 +4501,7 @@ s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct Battl gBattleMons[battlerAtk] = switchinCandidate; gAiThinkingStruct->saved[battlerDef].saved = TRUE; SetBattlerAiData(battlerAtk, gAiLogicData); // set known opposing battler data + SetBattlerFieldStatusForSwitchin(battlerAtk); gAiThinkingStruct->saved[battlerDef].saved = FALSE; } else if (calcContext == AI_DEFENDING) @@ -3919,11 +4509,11 @@ s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct Battl gBattleMons[battlerDef] = switchinCandidate; gAiThinkingStruct->saved[battlerAtk].saved = TRUE; SetBattlerAiData(battlerDef, gAiLogicData); // set known opposing battler data + SetBattlerFieldStatusForSwitchin(battlerDef); gAiThinkingStruct->saved[battlerAtk].saved = FALSE; } - dmg = AI_CalcDamage(move, battlerAtk, battlerDef, &effectiveness, FALSE, AI_GetWeather()); - + dmg = AI_CalcDamage(move, battlerAtk, battlerDef, effectiveness, NO_GIMMICK, NO_GIMMICK, AI_GetSwitchinWeather(switchinCandidate)); // restores original gBattleMon struct FreeRestoreBattleMons(savedBattleMons); @@ -3952,17 +4542,17 @@ s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct Battl return dmg.median; } -u32 AI_WhoStrikesFirstPartyMon(u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 moveConsidered) +u32 AI_WhoStrikesFirstPartyMon(u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 aiMoveConsidered, u32 playerMoveConsidered, enum ConsiderPriority considerPriority) { struct BattlePokemon *savedBattleMons = AllocSaveBattleMons(); gBattleMons[battlerAtk] = switchinCandidate; SetBattlerAiData(battlerAtk, gAiLogicData); - u32 aiMonFaster = AI_IsFaster(battlerAtk, battlerDef, moveConsidered); + u32 aiWhoStrikesFirst = AI_WhoStrikesFirst(battlerAtk, battlerDef, aiMoveConsidered, playerMoveConsidered, considerPriority); FreeRestoreBattleMons(savedBattleMons); SetBattlerAiData(battlerAtk, gAiLogicData); - return aiMonFaster; + return aiWhoStrikesFirst; } s32 CountUsablePartyMons(u32 battlerId) @@ -3983,7 +4573,9 @@ s32 CountUsablePartyMons(u32 battlerId) } ret = 0; - for (i = 0; i < PARTY_SIZE; i++) + s32 firstId, lastId; + GetAIPartyIndexes(battlerId, &firstId, &lastId); + for (i = firstId; i < lastId; i++) { if (i != battlerOnField1 && i != battlerOnField2 && GetMonData(&party[i], MON_DATA_HP) != 0 @@ -4015,7 +4607,7 @@ bool32 IsPartyFullyHealedExceptBattler(u32 battlerId) return TRUE; } -bool32 PartyHasMoveCategory(u32 battlerId, u32 category) +bool32 PartyHasMoveCategory(u32 battlerId, enum DamageCategory category) { struct Pokemon *party = GetBattlerParty(battlerId); u32 i, j; @@ -4042,9 +4634,9 @@ bool32 PartyHasMoveCategory(u32 battlerId, u32 category) return FALSE; } -bool32 SideHasMoveCategory(u32 battlerId, u32 category) +bool32 SideHasMoveCategory(u32 battlerId, enum DamageCategory category) { - if (IsDoubleBattle()) + if (HasPartnerIgnoreFlags(battlerId)) { if (HasMoveWithCategory(battlerId, category) || HasMoveWithCategory(BATTLE_PARTNER(battlerId), category)) return TRUE; @@ -4057,7 +4649,7 @@ bool32 SideHasMoveCategory(u32 battlerId, u32 category) return FALSE; } -bool32 IsAbilityOfRating(u32 ability, s8 rating) +bool32 IsAbilityOfRating(enum Ability ability, s8 rating) { if (gAbilitiesInfo[ability].aiRating >= rating) return TRUE; @@ -4141,19 +4733,117 @@ bool32 IsRecycleEncouragedItem(u32 item) return FALSE; } -static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, enum StatChange statId, bool32 considerContrary) +static bool32 HasMoveThatChangesKOThreshold(u32 battlerId, u32 noOfHitsToFaint, u32 aiIsFaster) +{ + s32 i, j; + u16 *moves = GetMovesArray(battlerId); + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] == MOVE_NONE || moves[i] == MOVE_UNAVAILABLE) + continue; + if (noOfHitsToFaint <= 2) + { + if (GetMovePriority(moves[i]) > 0) + return TRUE; + + u32 additionalEffectCount = GetMoveAdditionalEffectCount(moves[i]); + for (j = 0; j < additionalEffectCount; j++) + { + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(moves[i], j); + switch (additionalEffect->moveEffect) + { + case MOVE_EFFECT_SPD_MINUS_1: + case MOVE_EFFECT_SPD_MINUS_2: + { + if (aiIsFaster && !additionalEffect->self) + return TRUE; + } + default: + break; + } + } + } + } + + return FALSE; +} + +static enum Stat GetStatBeingChanged(enum StatChange statChange) +{ + switch(statChange) + { + case STAT_CHANGE_ATK: + case STAT_CHANGE_ATK_2: + case STAT_CHANGE_ATK_3: + return STAT_ATK; + case STAT_CHANGE_DEF: + case STAT_CHANGE_DEF_2: + case STAT_CHANGE_DEF_3: + return STAT_DEF; + case STAT_CHANGE_SPEED: + case STAT_CHANGE_SPEED_2: + case STAT_CHANGE_SPEED_3: + return STAT_SPEED; + case STAT_CHANGE_SPATK: + case STAT_CHANGE_SPATK_2: + case STAT_CHANGE_SPATK_3: + return STAT_SPATK; + case STAT_CHANGE_SPDEF: + case STAT_CHANGE_SPDEF_2: + case STAT_CHANGE_SPDEF_3: + return STAT_SPDEF; + case STAT_CHANGE_ACC: + return STAT_ACC; + case STAT_CHANGE_EVASION: + return STAT_EVASION; + } + return 0; // STAT_HP, should never be getting changed +} + +static u32 GetStagesOfStatChange(enum StatChange statChange) +{ + switch(statChange) + { + case STAT_CHANGE_ATK: + case STAT_CHANGE_DEF: + case STAT_CHANGE_SPEED: + case STAT_CHANGE_SPATK: + case STAT_CHANGE_SPDEF: + case STAT_CHANGE_ACC: + case STAT_CHANGE_EVASION: + return 1; + case STAT_CHANGE_ATK_2: + case STAT_CHANGE_DEF_2: + case STAT_CHANGE_SPEED_2: + case STAT_CHANGE_SPATK_2: + case STAT_CHANGE_SPDEF_2: + return 2; + case STAT_CHANGE_ATK_3: + case STAT_CHANGE_DEF_3: + case STAT_CHANGE_SPEED_3: + case STAT_CHANGE_SPATK_3: + case STAT_CHANGE_SPDEF_3: + return 3; + } + return 0; // STAT_HP, should never be getting changed +} + +static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, enum StatChange statChange, bool32 considerContrary) { enum AIScore tempScore = NO_INCREASE; - u32 noOfHitsToFaint = NoOfHitsForTargetToFaintAI(battlerDef, battlerAtk); - u32 aiIsFaster = AI_IsFaster(battlerAtk, battlerDef, TRUE); + u32 noOfHitsToFaint = NoOfHitsForTargetToFaintBattler(battlerDef, battlerAtk); + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + u32 aiIsFaster = AI_IsFaster(battlerAtk, battlerDef, MOVE_NONE, predictedMoveSpeedCheck, DONT_CONSIDER_PRIORITY); // Don't care about the priority of our setup move, care about outspeeding otherwise u32 shouldSetUp = ((noOfHitsToFaint >= 2 && aiIsFaster) || (noOfHitsToFaint >= 3 && !aiIsFaster) || noOfHitsToFaint == UNKNOWN_NO_OF_HITS); u32 i; + enum Stat statId = GetStatBeingChanged(statChange); + u32 stages = GetStagesOfStatChange(statChange); if (considerContrary && gAiLogicData->abilities[battlerAtk] == ABILITY_CONTRARY) return NO_INCREASE; - // Don't increase stats if opposing battler has Unaware - if (HasBattlerSideAbility(battlerDef, ABILITY_UNAWARE, gAiLogicData)) + if (!ShouldRaiseAnyStat(battlerAtk, battlerDef)) return NO_INCREASE; // Don't increase stat if AI is at +4 @@ -4164,29 +4854,13 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, if (gAiLogicData->hpPercents[battlerAtk] < 70 && noOfHitsToFaint == UNKNOWN_NO_OF_HITS) return NO_INCREASE; - // Don't set up if AI is dead to residual damage from weather - if (GetBattlerSecondaryDamage(battlerAtk) >= gBattleMons[battlerAtk].hp) - return NO_INCREASE; - - // Don't increase stats if opposing battler has Opportunist - if (gAiLogicData->abilities[battlerDef] == ABILITY_OPPORTUNIST) - return NO_INCREASE; - - // Don't increase stats if opposing battler has Encore - if (HasBattlerSideMoveWithEffect(battlerDef, EFFECT_ENCORE)) - return NO_INCREASE; - - // Don't increase stats if opposing battler has used Haze effect - if (HasBattlerSideUsedMoveWithEffect(battlerDef, EFFECT_HAZE) - || HasBattlerSideUsedMoveWithAdditionalEffect(battlerDef, MOVE_EFFECT_CLEAR_SMOG) - || HasBattlerSideUsedMoveWithAdditionalEffect(battlerDef, MOVE_EFFECT_HAZE)) + // Don't increase stats if player has a move that can change the KO threshold + if (HasMoveThatChangesKOThreshold(battlerDef, noOfHitsToFaint, aiIsFaster)) return NO_INCREASE; - // Don't increase if AI is at +1 and opponent has Haze effect - if (gBattleMons[battlerAtk].statStages[statId] >= MAX_STAT_STAGE - 5 && (HasBattlerSideMoveWithEffect(battlerDef, EFFECT_HAZE) - || HasBattlerSideMoveWithAdditionalEffect(battlerDef, MOVE_EFFECT_CLEAR_SMOG) - || HasBattlerSideMoveWithAdditionalEffect(battlerDef, MOVE_EFFECT_HAZE))) - return NO_INCREASE; + // Stat stages are effectively doubled under Simple. + if (gAiLogicData->abilities[battlerAtk] == ABILITY_SIMPLE) + stages *= 2; // Predicting switch if (IsBattlerPredictedToSwitch(battlerDef)) @@ -4208,89 +4882,84 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, switch (statId) { - case STAT_CHANGE_ATK: + case STAT_ATK: if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL) && shouldSetUp) - tempScore += DECENT_EFFECT; + { + if (stages == 1) + tempScore += DECENT_EFFECT; + else + tempScore += GOOD_EFFECT; + } break; - case STAT_CHANGE_DEF: + case STAT_DEF: if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL) || !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)) { if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL) - tempScore += DECENT_EFFECT; - else tempScore += WEAK_EFFECT; + if (stages == 1) + tempScore += WEAK_EFFECT; + else + tempScore += DECENT_EFFECT; } break; - case STAT_CHANGE_SPEED: + case STAT_SPEED: if ((noOfHitsToFaint >= 3 && !aiIsFaster) || noOfHitsToFaint == UNKNOWN_NO_OF_HITS) - tempScore += DECENT_EFFECT; - break; - case STAT_CHANGE_SPATK: - if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL) && shouldSetUp) - tempScore += DECENT_EFFECT; - break; - case STAT_CHANGE_SPDEF: - if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL) || !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)) { - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL) + if (stages == 1) tempScore += DECENT_EFFECT; else - tempScore += WEAK_EFFECT; + tempScore += GOOD_EFFECT; } break; - case STAT_CHANGE_ATK_2: - if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL) && shouldSetUp) - tempScore += GOOD_EFFECT; - break; - case STAT_CHANGE_DEF_2: - if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL) || !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)) + case STAT_SPATK: + if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL) && shouldSetUp) { - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL) - tempScore += GOOD_EFFECT; - else + if (stages == 1) tempScore += DECENT_EFFECT; + else + tempScore += GOOD_EFFECT; } break; - case STAT_CHANGE_SPEED_2: - if ((noOfHitsToFaint >= 3 && !aiIsFaster) || noOfHitsToFaint == UNKNOWN_NO_OF_HITS) - tempScore += GOOD_EFFECT; - break; - case STAT_CHANGE_SPATK_2: - if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL) && shouldSetUp) - tempScore += GOOD_EFFECT; - break; - case STAT_CHANGE_SPDEF_2: + case STAT_SPDEF: if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL) || !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)) { if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL) - tempScore += GOOD_EFFECT; + tempScore += WEAK_EFFECT; + if (stages == 1) + tempScore += WEAK_EFFECT; else tempScore += DECENT_EFFECT; } break; - case STAT_CHANGE_ACC: - if (gBattleMons[battlerAtk].statStages[STAT_ACC] <= 3) // Increase only if necessary + case STAT_ACC: + if (gBattleMons[battlerAtk].statStages[statId] <= 3) // Increase only if necessary tempScore += DECENT_EFFECT; break; - case STAT_CHANGE_EVASION: + case STAT_EVASION: if (noOfHitsToFaint > 3 || noOfHitsToFaint == UNKNOWN_NO_OF_HITS) tempScore += GOOD_EFFECT; else tempScore += DECENT_EFFECT; break; + default: + break; } + // if already inclined to boost, be slightly more likely to if boost levels matter + if (tempScore > 0 && HasMoveWithEffect(battlerAtk, EFFECT_STORED_POWER)) + tempScore += WEAK_EFFECT; + return tempScore; } -u32 IncreaseStatUpScore(u32 battlerAtk, u32 battlerDef, enum StatChange statId) +u32 IncreaseStatUpScore(u32 battlerAtk, u32 battlerDef, enum StatChange statChange) { - return IncreaseStatUpScoreInternal(battlerAtk, battlerDef, statId, TRUE); + return IncreaseStatUpScoreInternal(battlerAtk, battlerDef, statChange, TRUE); } -u32 IncreaseStatUpScoreContrary(u32 battlerAtk, u32 battlerDef, enum StatChange statId) +u32 IncreaseStatUpScoreContrary(u32 battlerAtk, u32 battlerDef, enum StatChange statChange) { - return IncreaseStatUpScoreInternal(battlerAtk, battlerDef, statId, FALSE); + return IncreaseStatUpScoreInternal(battlerAtk, battlerDef, statChange, FALSE); } void IncreasePoisonScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) @@ -4326,7 +4995,7 @@ void IncreaseBurnScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) { if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL) || (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_OMNISCIENT) // Not Omniscient but expects physical attacker - && gSpeciesInfo[gBattleMons[battlerDef].species].baseAttack >= gSpeciesInfo[gBattleMons[battlerDef].species].baseSpAttack + 10)) + && GetSpeciesBaseAttack(gBattleMons[battlerDef].species) >= GetSpeciesBaseSpAttack(gBattleMons[battlerDef].species) + 10)) { if (GetMoveCategory(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING)) == DAMAGE_CATEGORY_PHYSICAL) ADJUST_SCORE_PTR(DECENT_EFFECT); @@ -4354,8 +5023,8 @@ void IncreaseParalyzeScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) if ((defSpeed >= atkSpeed && defSpeed / 2 < atkSpeed) // You'll go first after paralyzing foe || IsPowerBasedOnStatus(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_PARALYSIS) || (HasMoveWithMoveEffectExcept(battlerAtk, MOVE_EFFECT_FLINCH, EFFECT_FIRST_TURN_ONLY)) // filter out Fake Out - || gBattleMons[battlerDef].status2 & STATUS2_INFATUATION - || gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) + || gBattleMons[battlerDef].volatiles.infatuation + || gBattleMons[battlerDef].volatiles.confusionTurns > 0) ADJUST_SCORE_PTR(GOOD_EFFECT); else ADJUST_SCORE_PTR(DECENT_EFFECT); @@ -4393,7 +5062,7 @@ void IncreaseConfusionScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score && gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CURE_STATUS) { if (gBattleMons[battlerDef].status1 & STATUS1_PARALYSIS - || gBattleMons[battlerDef].status2 & STATUS2_INFATUATION + || gBattleMons[battlerDef].volatiles.infatuation || (gAiLogicData->abilities[battlerAtk] == ABILITY_SERENE_GRACE && HasMoveWithMoveEffectExcept(battlerAtk, MOVE_EFFECT_FLINCH, EFFECT_FIRST_TURN_ONLY))) ADJUST_SCORE_PTR(GOOD_EFFECT); else @@ -4410,7 +5079,7 @@ void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score { if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL) || (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_OMNISCIENT) // Not Omniscient but expects special attacker - && gSpeciesInfo[gBattleMons[battlerDef].species].baseSpAttack >= gSpeciesInfo[gBattleMons[battlerDef].species].baseAttack + 10)) + && GetSpeciesBaseSpAttack(gBattleMons[battlerDef].species) >= GetSpeciesBaseAttack(gBattleMons[battlerDef].species) + 10)) { if (GetMoveCategory(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING)) == DAMAGE_CATEGORY_SPECIAL) ADJUST_SCORE_PTR(DECENT_EFFECT); @@ -4424,7 +5093,7 @@ void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score } } -bool32 AI_MoveMakesContact(u32 ability, enum ItemHoldEffect holdEffect, u32 move) +bool32 AI_MoveMakesContact(enum Ability ability, enum HoldEffect holdEffect, u32 move) { if (MoveMakesContact(move) && ability != ABILITY_LONG_REACH @@ -4433,36 +5102,164 @@ bool32 AI_MoveMakesContact(u32 ability, enum ItemHoldEffect holdEffect, u32 move return FALSE; } + +bool32 IsConsideringZMove(u32 battlerAtk, u32 battlerDef, u32 move) +{ + if (GetMovePower(move) == 0 && GetMoveZEffect(move) == Z_EFFECT_NONE) + return FALSE; + + return gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_Z_MOVE && ShouldUseZMove(battlerAtk, battlerDef, move); +} + //TODO - this could use some more sophisticated logic bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) { + // simple logic. just upgrades chosen move to z move if possible, unless regular move would kill opponent - if ((IsDoubleBattle()) && battlerDef == BATTLE_PARTNER(battlerAtk)) + if ((IsDoubleBattle()) && battlerDef == BATTLE_PARTNER(battlerAtk) && !(GetBattlerMoveTargetType(battlerAtk, chosenMove) & MOVE_TARGET_ALLY)) return FALSE; // don't use z move on partner if (HasTrainerUsedGimmick(battlerAtk, GIMMICK_Z_MOVE)) return FALSE; // can't use z move twice if (IsViableZMove(battlerAtk, chosenMove)) { - uq4_12_t effectiveness; - u32 zMove = GetUsableZMove(battlerAtk, chosenMove); - struct SimulatedDamage dmg; + enum BattleMoveEffects baseEffect = GetMoveEffect(chosenMove); + bool32 isEager = FALSE; // more likely to use a z move than typical - if (gBattleMons[battlerDef].ability == ABILITY_DISGUISE - && !MoveIgnoresTargetAbility(zMove) - && (gBattleMons[battlerDef].species == SPECIES_MIMIKYU_DISGUISED || gBattleMons[battlerDef].species == SPECIES_MIMIKYU_TOTEM_DISGUISED)) - return FALSE; // Don't waste a Z-Move busting disguise + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + bool32 isSlower = AI_IsSlower(battlerAtk, battlerDef, chosenMove, predictedMoveSpeedCheck, CONSIDER_PRIORITY); + + switch (baseEffect) + { + case EFFECT_BELLY_DRUM: + case EFFECT_FILLET_AWAY: + if (isSlower) + return TRUE; + isEager = TRUE; + break; + case EFFECT_PROTECT: + if (HasDamagingMoveOfType(battlerAtk, GetMoveType(gMovesInfo[chosenMove].type))) + return FALSE; + else + isEager = TRUE; + break; + case EFFECT_TELEPORT: + isEager = TRUE; + break; + case EFFECT_TRANSFORM: + if (IsBattlerTrapped(battlerDef, battlerAtk) && !HasDamagingMoveOfType(battlerDef, GetMoveType(gMovesInfo[chosenMove].type))) + return TRUE; + if (isSlower) + isEager = TRUE; + break; + default: + break; + } + + u32 zMove = GetUsableZMove(battlerAtk, chosenMove); + + if (IsBattleMoveStatus(chosenMove)) + { + u8 zEffect = GetMoveZEffect(chosenMove); + enum StatChange statChange = 0; + + if (zEffect == Z_EFFECT_CURSE) + { + if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GHOST)) + zEffect = Z_EFFECT_RECOVER_HP; + else + zEffect = Z_EFFECT_ATK_UP_1; + } + + switch (zEffect) + { + case Z_EFFECT_NONE: + if (GetMovePower(chosenMove) == 0) + return FALSE; + break; + case Z_EFFECT_RESET_STATS: + if (CountNegativeStatStages(battlerAtk) > 1) + return TRUE; + break; + case Z_EFFECT_ALL_STATS_UP_1: + return ShouldRaiseAnyStat(battlerAtk, battlerDef); + case Z_EFFECT_BOOST_CRITS: + return TRUE; + case Z_EFFECT_FOLLOW_ME: + return HasPartnerIgnoreFlags(battlerAtk) && (GetHealthPercentage(battlerAtk) <= Z_EFFECT_FOLLOW_ME_THRESHOLD || GetBestNoOfHitsToKO(battlerDef, battlerAtk, AI_DEFENDING) == 1); + break; + case Z_EFFECT_RECOVER_HP: + if (GetBestNoOfHitsToKO(battlerDef, battlerAtk, AI_DEFENDING) == 1 && GetHealthPercentage(battlerAtk) > Z_EFFECT_RESTORE_HP_HIGHER_THRESHOLD) + return TRUE; + if (isEager) + return GetHealthPercentage(battlerAtk) <= Z_EFFECT_RESTORE_HP_HIGHER_THRESHOLD; + return GetHealthPercentage(battlerAtk) <= Z_EFFECT_RESTORE_HP_LOWER_THRESHOLD; + case Z_EFFECT_RESTORE_REPLACEMENT_HP: + break; + case Z_EFFECT_ACC_UP_1: + case Z_EFFECT_ACC_UP_2: + case Z_EFFECT_ACC_UP_3: + statChange = STAT_CHANGE_ACC; + break; + case Z_EFFECT_EVSN_UP_1: + case Z_EFFECT_EVSN_UP_2: + case Z_EFFECT_EVSN_UP_3: + statChange = STAT_CHANGE_EVASION; + break; + case Z_EFFECT_ATK_UP_1: + case Z_EFFECT_DEF_UP_1: + case Z_EFFECT_SPD_UP_1: + case Z_EFFECT_SPATK_UP_1: + case Z_EFFECT_SPDEF_UP_1: + statChange = STAT_CHANGE_ATK + zEffect - Z_EFFECT_ATK_UP_1; + break; + case Z_EFFECT_ATK_UP_2: + case Z_EFFECT_DEF_UP_2: + case Z_EFFECT_SPD_UP_2: + case Z_EFFECT_SPATK_UP_2: + case Z_EFFECT_SPDEF_UP_2: + statChange = STAT_CHANGE_ATK_2 + zEffect - Z_EFFECT_ATK_UP_2; + break; + case Z_EFFECT_ATK_UP_3: + case Z_EFFECT_DEF_UP_3: + case Z_EFFECT_SPD_UP_3: + case Z_EFFECT_SPATK_UP_3: + case Z_EFFECT_SPDEF_UP_3: + statChange = STAT_CHANGE_ATK_2 + zEffect - Z_EFFECT_ATK_UP_3; + break; + default: + return FALSE; + } + + if (statChange != 0 && (isEager || IncreaseStatUpScore(battlerAtk, battlerDef, statChange) > 0)) + return TRUE; + + } + else if (GetMoveEffect(zMove) == EFFECT_EXTREME_EVOBOOST) + { + return ShouldRaiseAnyStat(battlerAtk, battlerDef); + } + else if (!IsBattleMoveStatus(chosenMove) && IsBattleMoveStatus(zMove)) + { + return FALSE; + } + + if (GetMoveEffect(chosenMove) == EFFECT_LAST_RESORT && !CanUseLastResort(battlerAtk)) + return TRUE; + + uq4_12_t effectiveness; + struct SimulatedDamage dmg; + + if (gBattleMons[battlerDef].ability == ABILITY_DISGUISE + && !MoveIgnoresTargetAbility(zMove) + && IsMimikyuDisguised(battlerDef)) + return FALSE; // Don't waste a Z-Move busting disguise if (gBattleMons[battlerDef].ability == ABILITY_ICE_FACE && !MoveIgnoresTargetAbility(zMove) && gBattleMons[battlerDef].species == SPECIES_EISCUE_ICE && IsBattleMovePhysical(chosenMove)) return FALSE; // Don't waste a Z-Move busting Ice Face - if (IsBattleMoveStatus(chosenMove) && !IsBattleMoveStatus(zMove)) - return FALSE; - else if (!IsBattleMoveStatus(chosenMove) && IsBattleMoveStatus(zMove)) - return FALSE; - - dmg = AI_CalcDamageSaveBattlers(chosenMove, battlerAtk, battlerDef, &effectiveness, FALSE); + dmg = AI_CalcDamageSaveBattlers(chosenMove, battlerAtk, battlerDef, &effectiveness, NO_GIMMICK, NO_GIMMICK); if (!IsBattleMoveStatus(chosenMove) && dmg.minimum >= gBattleMons[battlerDef].hp) return FALSE; // don't waste damaging z move if can otherwise faint target @@ -4473,6 +5270,269 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) return FALSE; } +void SetAIUsingGimmick(u32 battler, enum AIConsiderGimmick use) +{ + if (use == USE_GIMMICK) + gAiBattleData->aiUsingGimmick |= (1<aiUsingGimmick &= ~(1<aiUsingGimmick & (1<gimmick.usableGimmick[battler] != GIMMICK_TERA) + return; + + if (!(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_TERA)) + return; + + // TODO: Currently only single battles are considered. + if (!IsBattle1v1()) + return; + + // TODO: A lot of these checks are most effective for an omnicient ai. + // If we don't have enough information about the opponent's moves, consider simpler checks based on type effectivness. + + u32 opposingBattler = GetOppositeBattler(battler); + + // Default calculations automatically assume gimmicks for the attacker, but not the defender. + // Consider calcs for the other possibilities. + struct AltTeraCalcs altCalcs; + + struct SimulatedDamage noDmg = {0}; + + uq4_12_t effectivenessTakenWithTera[MAX_MON_MOVES]; + + u16* aiMoves = GetMovesArray(battler); + u16* oppMoves = GetMovesArray(opposingBattler); + + uq4_12_t effectiveness; + + for (int i = 0; i < MAX_MON_MOVES; i++) + { + if (!IsMoveUnusable(i, aiMoves[i], gAiLogicData->moveLimitations[battler]) && !IsBattleMoveStatus(aiMoves[i])) + altCalcs.dealtWithoutTera[i] = AI_CalcDamage(aiMoves[i], battler, opposingBattler, &effectiveness, NO_GIMMICK, NO_GIMMICK, AI_GetWeather()); + else + altCalcs.dealtWithoutTera[i] = noDmg; + + + if (!IsMoveUnusable(i, oppMoves[i], gAiLogicData->moveLimitations[opposingBattler]) && !IsBattleMoveStatus(oppMoves[i])) + { + altCalcs.takenWithTera[i] = AI_CalcDamage(oppMoves[i], opposingBattler, battler, &effectiveness, USE_GIMMICK, USE_GIMMICK, AI_GetWeather()); + effectivenessTakenWithTera[i] = effectiveness; + } + else + { + altCalcs.takenWithTera[i] = noDmg; + effectivenessTakenWithTera[i] = Q_4_12(0.0); + } + } + + + enum AIConsiderGimmick res = ShouldTeraFromCalcs(battler, opposingBattler, &altCalcs); + + + if (res == USE_GIMMICK) + { + // Damage calcs for damage received assumed we wouldn't tera. Adjust that so that further AI decisions are more accurate. + for (int i = 0; i < MAX_MON_MOVES; i++) + { + gAiLogicData->simulatedDmg[opposingBattler][battler][i] = altCalcs.takenWithTera[i]; + gAiLogicData->effectiveness[opposingBattler][battler][i] = effectivenessTakenWithTera[i]; + } + } + else + { + // Damage calcs for damage dealt assumed we would tera. Adjust that so that further AI decisions are more accurate. + for (int i = 0; i < MAX_MON_MOVES; i++) + gAiLogicData->simulatedDmg[battler][opposingBattler][i] = altCalcs.dealtWithoutTera[i]; + } + + SetAIUsingGimmick(battler, res); + return; +} + +// macros are not expanded recursively +#define dealtWithTera gAiLogicData->simulatedDmg[battler][opposingBattler] +#define dealtWithoutTera altCalcs->dealtWithoutTera +#define takenWithTera altCalcs->takenWithTera +#define takenWithoutTera gAiLogicData->simulatedDmg[opposingBattler][battler] + +enum AIConsiderGimmick ShouldTeraFromCalcs(u32 battler, u32 opposingBattler, struct AltTeraCalcs *altCalcs) +{ + struct Pokemon* party = GetBattlerParty(battler); + + // Check how many pokemon we have that could tera + int numPossibleTera = 0; + for (int i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&party[i], MON_DATA_HP) != 0 + && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE + && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG + && GetMonData(&party[i], MON_DATA_TERA_TYPE) > 0) + numPossibleTera++; + } + + u16 aiHp = gBattleMons[battler].hp; + u16 oppHp = gBattleMons[opposingBattler].hp; + + u16* aiMoves = GetMovesArray(battler); + u16* oppMoves = GetMovesArray(opposingBattler); + + // Check whether tera enables a KO + bool32 hasKoWithout = FALSE; + u16 killingMove = MOVE_NONE; + + for (int i = 0; i < MAX_MON_MOVES; i++) + { + if (dealtWithTera[i].median >= oppHp) + { + u16 move = aiMoves[i]; + if (killingMove == MOVE_NONE || GetBattleMovePriority(battler, gAiLogicData->abilities[battler], move) > GetBattleMovePriority(battler, gAiLogicData->abilities[battler], killingMove)) + killingMove = move; + } + if (dealtWithoutTera[i].median >= oppHp) + hasKoWithout = TRUE; + } + + bool32 enablesKo = (killingMove != MOVE_NONE) && !hasKoWithout; + + // Check whether tera saves us from a KO + bool32 savedFromKo = FALSE; + bool32 getsKodRegardlessBySingleMove = FALSE; + + for (int i = 0; i < MAX_MON_MOVES; i++) + { + if (takenWithoutTera[i].maximum >= aiHp && takenWithTera[i].maximum >= aiHp) + getsKodRegardlessBySingleMove = TRUE; + + if (takenWithoutTera[i].maximum >= aiHp && takenWithTera[i].maximum < aiHp) + savedFromKo = TRUE; + } + + if (getsKodRegardlessBySingleMove) + savedFromKo = FALSE; + + // Check whether opponent can punish tera by ko'ing + u16 hardPunishingMove = MOVE_NONE; + for (int i = 0; i < MAX_MON_MOVES; i++) + { + if (takenWithTera[i].maximum >= aiHp) + { + u16 move = oppMoves[i]; + if (hardPunishingMove == MOVE_NONE || GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], move) > GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], hardPunishingMove)) + hardPunishingMove = move; + } + } + + // Check whether there is a move that deals over half hp, and all such moves are reduced to under 1/4 hp by tera + // (e.g. a weakness becomes a resistance, a 4x weakness becomes neutral, etc) + bool32 takesBigHit = FALSE; + bool32 savedFromAllBigHits = TRUE; + for (int i = 0; i < MAX_MON_MOVES; i++) + { + if (takenWithoutTera[i].median > aiHp/2) + { + takesBigHit = TRUE; + if (takenWithTera[i].median > aiHp/4) + savedFromAllBigHits = FALSE; + } + } + + // Check for any benefit whatsoever. Only used for the last possible mon that could tera. + bool32 anyOffensiveBenefit = FALSE; + for (int i = 0; i < MAX_MON_MOVES; i++) + { + if (dealtWithTera[i].median > dealtWithoutTera[i].median) + anyOffensiveBenefit = TRUE; + } + + bool32 anyDefensiveBenefit = FALSE; + bool32 anyDefensiveDrawback = FALSE; + for (int i = 0; i < MAX_MON_MOVES; i++) + { + if (takenWithTera[i].median < takenWithoutTera[i].median) + anyDefensiveBenefit = TRUE; + + if (takenWithTera[i].median > takenWithoutTera[i].median) + anyDefensiveDrawback = TRUE; + } + + // Make decisions + // This is done after all loops to minimize the possibility of a timing attack in which the player could + // determine whether the AI will tera based on the time taken to select a move. + + if (enablesKo) + { + if (hardPunishingMove == MOVE_NONE) + { + return USE_GIMMICK; + } + else + { + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battler, opposingBattler, gAiLogicData); + // will we go first? + if (AI_WhoStrikesFirst(battler, opposingBattler, killingMove, predictedMoveSpeedCheck, CONSIDER_PRIORITY) == AI_IS_FASTER && GetBattleMovePriority(battler, gAiLogicData->abilities[battler], killingMove) >= GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], hardPunishingMove)) + return USE_GIMMICK; + } + } + + // Decide to conserve tera based on number of possible later oppotunities + u16 conserveTeraChance = AI_CONSERVE_TERA_CHANCE_PER_MON * (numPossibleTera-1); + if (RandomPercentage(RNG_AI_CONSERVE_TERA, conserveTeraChance)) + return NO_GIMMICK; + + if (savedFromKo) + { + if (hardPunishingMove == MOVE_NONE) + { + return USE_GIMMICK; + } + else + { + // If tera saves us from a ko from one move, but enables a ko otherwise, randomly predict + // savesFromKo being true ensures opponent doesn't have a ko if we don't tera + if (Random() % 100 < AI_TERA_PREDICT_CHANCE) + return USE_GIMMICK; + } + } + + if (hardPunishingMove != MOVE_NONE) + return NO_GIMMICK; + + if (takesBigHit && savedFromAllBigHits) + return USE_GIMMICK; + + // No strongly compelling reason to tera. Conserve it if possible. + if (numPossibleTera > 1) + return NO_GIMMICK; + + if (anyOffensiveBenefit || (anyDefensiveBenefit && !anyDefensiveDrawback)) + return USE_GIMMICK; + + // TODO: Effects other than direct damage are not yet considered. For example, may want to tera poison to avoid a Toxic. + + + return NO_GIMMICK; +} +#undef dealtWithTera +#undef dealtWithoutTera +#undef takenWithTera +#undef takenWithoutTera + + bool32 AI_IsBattlerAsleepOrComatose(u32 battlerId) { return (gBattleMons[battlerId].status1 & STATUS1_SLEEP) || gAiLogicData->abilities[battlerId] == ABILITY_COMATOSE; @@ -4488,7 +5548,7 @@ s32 AI_TryToClearStats(u32 battlerAtk, u32 battlerDef, bool32 isDoubleBattle) bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef) { - u8 i; + enum Stat i; // Want to copy positive stat changes for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) { @@ -4501,13 +5561,15 @@ bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef) case STAT_SPATK: return (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL)); case STAT_ACC: - return (HasLowAccuracyMove(battlerAtk, battlerDef)); + return HasMoveWithLowAccuracy(battlerAtk, battlerDef, LOW_ACCURACY_THRESHOLD, FALSE); case STAT_EVASION: case STAT_SPEED: return TRUE; case STAT_DEF: case STAT_SPDEF: return (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL); + default: + break; } } } @@ -4516,60 +5578,63 @@ bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef) } //TODO - track entire opponent party data to determine hazard effectiveness -bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData) -{ - if (aiData->abilities[battlerDef] == ABILITY_MAGIC_BOUNCE - || CountUsablePartyMons(battlerDef) == 0 - || HasMoveWithEffect(battlerDef, EFFECT_RAPID_SPIN) - || HasMoveWithEffect(battlerDef, EFFECT_TIDY_UP) - || HasMoveWithEffect(battlerDef, EFFECT_DEFOG) - || HasMoveWithAdditionalEffect(battlerDef, MOVE_EFFECT_DEFOG) - || HasMoveWithEffect(battlerDef, EFFECT_MAGIC_COAT)) +bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData) +{ + if (CountUsablePartyMons(battlerDef) == 0 + || HasBattlerSideMoveWithAIEffect(battlerDef, AI_EFFECT_CLEAR_HAZARDS)) return FALSE; + if (IsBattleMoveStatus(move)) + { + if (HasMoveWithEffect(battlerDef, EFFECT_MAGIC_COAT)) + return FALSE; + if (DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) + return TRUE; + if (aiData->abilities[battlerDef] == ABILITY_MAGIC_BOUNCE) + return FALSE; + } + else + { + if (DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) + return TRUE; + if (aiData->abilities[battlerDef] == ABILITY_SHIELD_DUST) + return FALSE; + } return TRUE; } void IncreaseTidyUpScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) { - if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY && CountUsablePartyMons(battlerAtk) != 0) + if (AreAnyHazardsOnSide(GetBattlerSide(battlerAtk)) && CountUsablePartyMons(battlerAtk) != 0) ADJUST_SCORE_PTR(GOOD_EFFECT); - if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_HAZARDS_ANY && CountUsablePartyMons(battlerDef) != 0) + if (AreAnyHazardsOnSide(GetBattlerSide(battlerDef)) && CountUsablePartyMons(battlerDef) != 0) ADJUST_SCORE_PTR(-2); - - if (gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE && AI_IsFaster(battlerAtk, battlerDef, move)) + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + if (gBattleMons[battlerAtk].volatiles.substitute && AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, DONT_CONSIDER_PRIORITY)) ADJUST_SCORE_PTR(-10); - if (gBattleMons[battlerDef].status2 & STATUS2_SUBSTITUTE) + if (gBattleMons[battlerDef].volatiles.substitute) ADJUST_SCORE_PTR(GOOD_EFFECT); - if (gStatuses3[battlerAtk] & STATUS3_LEECHSEED) + if (gBattleMons[battlerAtk].volatiles.leechSeed) ADJUST_SCORE_PTR(DECENT_EFFECT); - if (gStatuses3[battlerDef] & STATUS3_LEECHSEED) + if (gBattleMons[battlerDef].volatiles.leechSeed) ADJUST_SCORE_PTR(-2); } bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, struct AiLogicData *aiData) { u32 preventsStatLoss; - u32 partnerAbility; - u32 partnerHoldEffect = aiData->holdEffects[battlerAtkPartner]; - - if (DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) - partnerAbility = ABILITY_NONE; - else - partnerAbility = aiData->abilities[battlerAtkPartner]; + enum Ability partnerAbility = aiData->abilities[battlerAtkPartner]; + u32 opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battlerAtk)); + u32 opposingBattler = GetBattlerAtPosition(opposingPosition); if (gBattleMons[battlerAtkPartner].statStages[STAT_ATK] == MAX_STAT_STAGE || partnerAbility == ABILITY_CONTRARY || partnerAbility == ABILITY_GOOD_AS_GOLD - || HasMoveWithEffect(BATTLE_OPPOSITE(battlerAtk), EFFECT_FOUL_PLAY) - || HasMoveWithEffect(BATTLE_OPPOSITE(battlerAtkPartner), EFFECT_FOUL_PLAY)) + || HasBattlerSideMoveWithEffect(LEFT_FOE(battlerAtk), EFFECT_FOUL_PLAY)) return FALSE; - preventsStatLoss = (partnerAbility == ABILITY_CLEAR_BODY - || partnerAbility == ABILITY_FULL_METAL_BODY - || partnerAbility == ABILITY_WHITE_SMOKE - || partnerHoldEffect == HOLD_EFFECT_CLEAR_AMULET); + preventsStatLoss = !CanLowerStat(battlerAtk, battlerAtkPartner, aiData, STAT_DEF); switch (GetMoveEffect(aiData->partnerMove)) { @@ -4583,9 +5648,9 @@ bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, st default: break; } - + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, opposingBattler, gAiLogicData); return (preventsStatLoss - && AI_IsFaster(battlerAtk, battlerAtkPartner, TRUE) + && AI_IsFaster(battlerAtk, battlerAtkPartner, MOVE_NONE, predictedMoveSpeedCheck, CONSIDER_PRIORITY) && HasMoveWithCategory(battlerAtkPartner, DAMAGE_CATEGORY_PHYSICAL)); } @@ -4605,12 +5670,12 @@ u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) scoreIncrease += BEST_EFFECT; } - if (gStatuses3[battlerDef] & STATUS3_PERISH_SONG) + if (gBattleMons[battlerDef].volatiles.perishSong) scoreIncrease += GOOD_EFFECT; if (gBattleMons[battlerDef].status1 & STATUS1_SLEEP) scoreIncrease += GOOD_EFFECT; - else if (gBattleMons[battlerDef].status1 & (STATUS1_BURN | STATUS1_PSN_ANY | STATUS1_FROSTBITE)) + else if (gBattleMons[battlerDef].status1 & STATUS1_DAMAGING) scoreIncrease += DECENT_EFFECT; if (IsBattlerPredictedToSwitch(battlerDef)) @@ -4629,50 +5694,32 @@ u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) return scoreIncrease; } -bool32 HasLowAccuracyMove(u32 battlerAtk, u32 battlerDef) -{ - int i; - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gAiLogicData->moveAccuracy[battlerAtk][battlerDef][i] <= LOW_ACCURACY_THRESHOLD) - return TRUE; - } - return FALSE; -} - bool32 IsBattlerItemEnabled(u32 battler) { if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_NEGATE_UNAWARE) return TRUE; if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) return FALSE; - if (gStatuses3[battler] & STATUS3_EMBARGO) + if (gBattleMons[battler].volatiles.embargo) return FALSE; - if (gBattleMons[battler].ability == ABILITY_KLUTZ && !(gStatuses3[battler] & STATUS3_GASTRO_ACID)) + if (gBattleMons[battler].ability == ABILITY_KLUTZ && !gBattleMons[battler].volatiles.gastroAcid) return FALSE; return TRUE; } -bool32 HasBattlerSideAbility(u32 battler, u32 ability, struct AiLogicData *aiData) -{ - if (aiData->abilities[battler] == ability) - return TRUE; - if (IsDoubleBattle() && gAiLogicData->abilities[BATTLE_PARTNER(battler)] == ability) - return TRUE; - return FALSE; -} - u32 GetFriendlyFireKOThreshold(u32 battler) { if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_RISKY) return FRIENDLY_FIRE_RISKY_THRESHOLD; if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_CONSERVATIVE) return FRIENDLY_FIRE_CONSERVATIVE_THRESHOLD; + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_ATTACKS_PARTNER) + return 0; return FRIENDLY_FIRE_NORMAL_THRESHOLD; } -bool32 IsMoxieTypeAbility(u32 ability) +bool32 IsMoxieTypeAbility(enum Ability ability) { switch (ability) { @@ -4688,55 +5735,436 @@ bool32 IsMoxieTypeAbility(u32 ability) } } -// Should the AI use a spread move to deliberately activate its partner's ability? -bool32 ShouldTriggerAbility(u32 battler, u32 ability) +bool32 DoesAbilityRaiseStatsWhenLowered(enum Ability ability) { switch (ability) { + case ABILITY_CONTRARY: + case ABILITY_COMPETITIVE: + case ABILITY_DEFIANT: + return TRUE; + default: + return FALSE; + } +} + +bool32 DoesIntimidateRaiseStats(enum Ability ability) +{ + switch (ability) + { + case ABILITY_COMPETITIVE: + case ABILITY_CONTRARY: + case ABILITY_DEFIANT: + case ABILITY_GUARD_DOG: + case ABILITY_RATTLED: + return TRUE; + default: + return FALSE; + } +} + +// TODO: work out when to attack into the player's contextually 'beneficial' ability +bool32 ShouldTriggerAbility(u32 battlerAtk, u32 battlerDef, enum Ability ability) +{ + if (IsTargetingPartner(battlerAtk, battlerDef)) + { + switch (ability) + { case ABILITY_LIGHTNING_ROD: case ABILITY_STORM_DRAIN: - if (B_REDIRECT_ABILITY_IMMUNITY < GEN_5) + if (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) < GEN_5) return FALSE; else - return (BattlerStatCanRise(battler, ability, STAT_SPATK) && HasMoveWithCategory(battler, DAMAGE_CATEGORY_SPECIAL)); + return (BattlerStatCanRise(battlerDef, ability, STAT_SPATK) && HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)); case ABILITY_DEFIANT: case ABILITY_JUSTIFIED: case ABILITY_MOXIE: case ABILITY_SAP_SIPPER: case ABILITY_THERMAL_EXCHANGE: - return (BattlerStatCanRise(battler, ability, STAT_ATK) && HasMoveWithCategory(battler, DAMAGE_CATEGORY_PHYSICAL)); + return (BattlerStatCanRise(battlerDef, ability, STAT_ATK) && HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)); case ABILITY_COMPETITIVE: - return (BattlerStatCanRise(battler, ability, STAT_SPATK) && HasMoveWithCategory(battler, DAMAGE_CATEGORY_SPECIAL)); + return (BattlerStatCanRise(battlerDef, ability, STAT_SPATK) && HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)); + // TODO: logic for when to trigger Contrary case ABILITY_CONTRARY: return TRUE; case ABILITY_DRY_SKIN: case ABILITY_VOLT_ABSORB: case ABILITY_WATER_ABSORB: - return (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_HP_AWARE); + return (gAiThinkingStruct->aiFlags[battlerDef] & AI_FLAG_HP_AWARE); case ABILITY_RATTLED: case ABILITY_STEAM_ENGINE: - return BattlerStatCanRise(battler, ability, STAT_SPEED); + return BattlerStatCanRise(battlerDef, ability, STAT_SPEED); case ABILITY_FLASH_FIRE: - return (HasMoveWithType(battler, TYPE_FIRE) && !gDisableStructs[battler].flashFireBoosted); + return (HasMoveWithType(battlerDef, TYPE_FIRE) && !gDisableStructs[battlerDef].flashFireBoosted); case ABILITY_WATER_COMPACTION: case ABILITY_WELL_BAKED_BODY: - return (BattlerStatCanRise(battler, ability, STAT_DEF)); + return (BattlerStatCanRise(battlerDef, ability, STAT_DEF)); default: return FALSE; + } + } + else + { + return FALSE; + } +} + +// Used by CheckBadMove; this is determining purely if the effect CAN change an ability, not if it SHOULD. +// At the moment, the parts about Mummy and Wandering Spirit are not actually used. +bool32 CanEffectChangeAbility(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData) +{ + u32 effect = GetMoveEffect(move); + + // Dynamaxed Pokemon are immune to some ability-changing effects. + if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) + { + switch (effect) + { + case EFFECT_ENTRAINMENT: + case EFFECT_SKILL_SWAP: + return FALSE; + default: + break; + } + } + + if (gBattleMons[battlerDef].volatiles.gastroAcid) + return FALSE; + + enum Ability atkAbility = aiData->abilities[battlerAtk]; + enum Ability defAbility = aiData->abilities[battlerDef]; + bool32 hasSameAbility = (atkAbility == defAbility); + + if (defAbility == ABILITY_NONE) + return FALSE; + + if (atkAbility == ABILITY_NONE) + { + switch (effect) + { + case EFFECT_DOODLE: + case EFFECT_ENTRAINMENT: + case EFFECT_ROLE_PLAY: + case EFFECT_SKILL_SWAP: + return FALSE; + + default: + break; + } + } + + // Checking for Ability-specific immunities. + switch (effect) + { + case EFFECT_DOODLE: + if (hasSameAbility || gAbilitiesInfo[atkAbility].cantBeSuppressed || gAbilitiesInfo[defAbility].cantBeCopied) + return FALSE; + + if (HasPartnerIgnoreFlags(battlerAtk)) + { + u32 partnerAbility = aiData->abilities[BATTLE_PARTNER(battlerAtk)]; + if (gAbilitiesInfo[partnerAbility].cantBeSuppressed) + return FALSE; + if (partnerAbility == defAbility) + return FALSE; + } + break; + + case EFFECT_ROLE_PLAY: + if (hasSameAbility || gAbilitiesInfo[atkAbility].cantBeSuppressed || gAbilitiesInfo[defAbility].cantBeCopied) + return FALSE; + break; + + case EFFECT_SKILL_SWAP: + if (hasSameAbility || gAbilitiesInfo[atkAbility].cantBeSwapped || gAbilitiesInfo[defAbility].cantBeSwapped) + return FALSE; + break; + + case EFFECT_GASTRO_ACID: + if (gAbilitiesInfo[defAbility].cantBeSuppressed) + return FALSE; + break; + + case EFFECT_ENTRAINMENT: + if (hasSameAbility || gAbilitiesInfo[defAbility].cantBeOverwritten || gAbilitiesInfo[atkAbility].cantBeCopied) + return FALSE; + break; + + case EFFECT_OVERWRITE_ABILITY: + if (defAbility == GetMoveOverwriteAbility(move) || gAbilitiesInfo[defAbility].cantBeOverwritten) + return FALSE; + break; + + default: + return FALSE; + } + + if (aiData->holdEffects[battlerDef] == HOLD_EFFECT_ABILITY_SHIELD) + { + switch (effect) + { + case EFFECT_ENTRAINMENT: + case EFFECT_GASTRO_ACID: + case EFFECT_ROLE_PLAY: + case EFFECT_SKILL_SWAP: + case EFFECT_OVERWRITE_ABILITY: + return FALSE; + default: + break; + } + } + + if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_ABILITY_SHIELD) + { + switch (effect) + { + case EFFECT_DOODLE: + case EFFECT_ROLE_PLAY: + case EFFECT_SKILL_SWAP: + return FALSE; + default: + break; + } } + + return TRUE; } -u32 GetThinkingBattler(u32 battler) +bool32 DoesEffectReplaceTargetAbility(u32 effect) { - if (gAiLogicData->aiPredictionInProgress) - return gAiLogicData->battlerDoingPrediction; - return battler; + switch (effect) + { + case EFFECT_ENTRAINMENT: + case EFFECT_GASTRO_ACID: + case EFFECT_SKILL_SWAP: + case EFFECT_OVERWRITE_ABILITY: + return TRUE; + default: + return FALSE; + } +} + +void AbilityChangeScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score, struct AiLogicData *aiData) +{ + u32 effect = GetMoveEffect(move); + bool32 isTargetingPartner = IsTargetingPartner(battlerAtk, battlerDef); + enum Ability abilityAtk = aiData->abilities[battlerAtk]; + enum Ability abilityDef = aiData->abilities[battlerDef]; + bool32 partnerHasBadAbility = FALSE; + u32 partnerAbility = ABILITY_NONE; + bool32 attackerHasBadAbility = (gAbilitiesInfo[abilityAtk].aiRating < 0); + s32 currentAbilityScore, transferredAbilityScore = 0; + + if (HasPartner(battlerAtk)) + { + partnerAbility = aiData->abilities[BATTLE_PARTNER(battlerAtk)]; + if (!(gAbilitiesInfo[partnerAbility].cantBeSuppressed) && (gAbilitiesInfo[partnerAbility].aiRating < 0)) + partnerHasBadAbility = TRUE; + } + + if (effect == EFFECT_GASTRO_ACID) + abilityAtk = ABILITY_NONE; + else if (effect == EFFECT_OVERWRITE_ABILITY) + abilityAtk = GetMoveOverwriteAbility(move); + + if (effect == EFFECT_DOODLE || effect == EFFECT_ROLE_PLAY || effect == EFFECT_SKILL_SWAP) + { + if (partnerHasBadAbility && effect == EFFECT_DOODLE) + ADJUST_SCORE_PTR(DECENT_EFFECT); + + if (attackerHasBadAbility) + ADJUST_SCORE_PTR(DECENT_EFFECT); + + currentAbilityScore = BattlerBenefitsFromAbilityScore(battlerAtk, abilityAtk, aiData); + transferredAbilityScore = BattlerBenefitsFromAbilityScore(battlerAtk, abilityDef, aiData); + ADJUST_SCORE_PTR(transferredAbilityScore - currentAbilityScore); + } + + if (isTargetingPartner) + { + if (DoesEffectReplaceTargetAbility(effect)) + { + if (partnerHasBadAbility) + ADJUST_SCORE_PTR(BEST_EFFECT); + + currentAbilityScore = BattlerBenefitsFromAbilityScore(battlerDef, abilityDef, aiData); + transferredAbilityScore = BattlerBenefitsFromAbilityScore(battlerDef, abilityAtk, aiData); + ADJUST_SCORE_PTR(transferredAbilityScore - currentAbilityScore); + } + else // This is only Role Play as Doodle can't target the partner + { + ADJUST_SCORE_PTR(-20); + } + + // Trigger Plus or Minus in modern gens. This is not in the overarching function because Skill Swap is rarely beneficial here. + if (B_PLUS_MINUS_INTERACTION >= GEN_5) + { + if (((effect == EFFECT_ENTRAINMENT) && (abilityAtk == ABILITY_PLUS || abilityAtk == ABILITY_MINUS)) || ((effect == EFFECT_ROLE_PLAY) && (abilityDef == ABILITY_PLUS || abilityDef == ABILITY_MINUS))) + ADJUST_SCORE_PTR(DECENT_EFFECT); + } + + } + // Targeting an opponent. + else + { + // We already checked if we want their ability, so now we look to see if we want them to lose their ability. + if (DoesEffectReplaceTargetAbility(effect)) + { + currentAbilityScore = BattlerBenefitsFromAbilityScore(battlerDef, abilityDef, aiData); + transferredAbilityScore = BattlerBenefitsFromAbilityScore(battlerDef, abilityAtk, aiData); + ADJUST_SCORE_PTR(currentAbilityScore - transferredAbilityScore); + } + } +} + +s32 BattlerBenefitsFromAbilityScore(u32 battler, enum Ability ability, struct AiLogicData *aiData) +{ + if (gAbilitiesInfo[ability].aiRating < 0) + return WORST_EFFECT; + + switch (ability) + { + // Transferrable abilities that can be assumed to be always beneficial. + case ABILITY_CLEAR_BODY: + case ABILITY_GOOD_AS_GOLD: + case ABILITY_MAGIC_GUARD: + case ABILITY_MOODY: + case ABILITY_PURIFYING_SALT: + case ABILITY_SPEED_BOOST: + case ABILITY_WHITE_SMOKE: + return GOOD_EFFECT; + // Conditional ability logic goes here. + case ABILITY_COMPOUND_EYES: + if (HasMoveWithLowAccuracy(battler, LEFT_FOE(battler), 90, FALSE) + || HasMoveWithLowAccuracy(battler, RIGHT_FOE(battler), 90, FALSE)) + return GOOD_EFFECT; + break; + case ABILITY_CONTRARY: + if (HasMoveThatLowersOwnStats(battler)) + return BEST_EFFECT; + if (HasMoveThatRaisesOwnStats(battler)) + return AWFUL_EFFECT; + break; + case ABILITY_FRIEND_GUARD: + case ABILITY_POWER_SPOT: + case ABILITY_VICTORY_STAR: + if (HasPartner(battler) && aiData->abilities[BATTLE_PARTNER(battler)] != ability) + return BEST_EFFECT; + break; + case ABILITY_GUTS: + if (HasMoveWithCategory(battler, DAMAGE_CATEGORY_PHYSICAL) && gBattleMons[battler].status1 & (STATUS1_CAN_MOVE)) + return GOOD_EFFECT; + break; + case ABILITY_HUGE_POWER: + case ABILITY_PURE_POWER: + if (HasMoveWithCategory(battler, DAMAGE_CATEGORY_PHYSICAL)) + return BEST_EFFECT; + break; + // Also used to Worry Seed WORRY_SEED + case ABILITY_INSOMNIA: + case ABILITY_VITAL_SPIRIT: + if (HasMoveWithEffect(battler, EFFECT_REST)) + return WORST_EFFECT; + break; + case ABILITY_INTIMIDATE: + { + enum Ability abilityDef = aiData->abilities[LEFT_FOE(battler)]; + if (DoesIntimidateRaiseStats(abilityDef)) + { + return AWFUL_EFFECT; + } + else + { + if (HasTwoOpponents(battler)) + { + abilityDef = aiData->abilities[RIGHT_FOE(battler)]; + if (DoesIntimidateRaiseStats(abilityDef)) + { + return AWFUL_EFFECT; + } + else + { + s32 score1 = IncreaseStatDownScore(battler, LEFT_FOE(battler), STAT_ATK); + s32 score2 = IncreaseStatDownScore(battler, RIGHT_FOE(battler), STAT_ATK); + if (score1 > score2) + return score1; + else + return score2; + } + } + return IncreaseStatDownScore(battler, LEFT_FOE(battler), STAT_ATK); + } + } + case ABILITY_NO_GUARD: + if (HasMoveWithLowAccuracy(battler, LEFT_FOE(battler), LOW_ACCURACY_THRESHOLD, FALSE) + || HasMoveWithLowAccuracy(battler, RIGHT_FOE(battler), LOW_ACCURACY_THRESHOLD, FALSE)) + return GOOD_EFFECT; + break; + // Toxic counter ticks upward while Poison Healed; losing Poison Heal while Toxiced can KO. + case ABILITY_POISON_HEAL: + if (gBattleMons[battler].status1 & (STATUS1_POISON)) + return WEAK_EFFECT; + if (gBattleMons[battler].status1 & (STATUS1_TOXIC_POISON)) + return BEST_EFFECT; + if (gBattleMons[battler].status1 & STATUS1_ANY) + return NO_INCREASE; + break; + // Also used to Simple Beam SIMPLE_BEAM. + case ABILITY_SIMPLE: + // Prioritize moves like Metal Claw, Charge Beam, or Power up Punch + if (HasMoveThatRaisesOwnStats(battler)) + return GOOD_EFFECT; + return NO_INCREASE; + case ABILITY_BEADS_OF_RUIN: + case ABILITY_SWORD_OF_RUIN: + case ABILITY_TABLETS_OF_RUIN: + case ABILITY_VESSEL_OF_RUIN: + if (HasPartner(battler)) + { + if (aiData->abilities[BATTLE_PARTNER(battler)] != ability) + return GOOD_EFFECT; + else + return NO_INCREASE; + } + return GOOD_EFFECT; + case ABILITY_NONE: + return NO_INCREASE; + default: + break; + } + + return WEAK_EFFECT; +} + +bool32 IsNaturalEnemy(u32 speciesAttacker, u32 speciesTarget) +{ + if (B_WILD_NATURAL_ENEMIES != TRUE) + return FALSE; + + switch (speciesAttacker) + { + case SPECIES_ZANGOOSE: + return (speciesTarget == SPECIES_SEVIPER); + case SPECIES_SEVIPER: + return (speciesTarget == SPECIES_ZANGOOSE); + case SPECIES_HEATMOR: + return (speciesTarget == SPECIES_DURANT); + case SPECIES_DURANT: + return (speciesTarget == SPECIES_HEATMOR); + case SPECIES_SABLEYE: + return (speciesTarget == SPECIES_CARBINK); + case SPECIES_MAREANIE: + return (speciesTarget == SPECIES_CORSOLA); + default: + return FALSE; + } + return FALSE; } diff --git a/src/battle_anim.c b/src/battle_anim.c index 3840c9101228..0e178192132e 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -13,6 +13,7 @@ #include "graphics.h" #include "main.h" #include "malloc.h" +#include "menu.h" #include "m4a.h" #include "palette.h" #include "pokemon.h" @@ -195,6 +196,7 @@ static const u8* const sBattleAnims_StatusConditions[NUM_B_ANIMS_STATUS] = [B_ANIM_STATUS_FRZ] = gBattleAnimStatus_Freeze, [B_ANIM_STATUS_CURSED] = gBattleAnimStatus_Curse, [B_ANIM_STATUS_NIGHTMARE] = gBattleAnimStatus_Nightmare, + [B_ANIM_STATUS_FRB] = gBattleAnimStatus_Frostbite, }; static const u8* const sBattleAnims_General[NUM_B_ANIMS_GENERAL] = @@ -253,6 +255,8 @@ static const u8* const sBattleAnims_General[NUM_B_ANIMS_GENERAL] = [B_ANIM_TERA_ACTIVATE] = gBattleAnimGeneral_TeraActivate, [B_ANIM_SIMPLE_HEAL] = gBattleAnimGeneral_SimpleHeal, [B_ANIM_POWER_CONSTRUCT] = gBattleAnimGeneral_PowerConstruct, + [B_ANIM_SWAP_TO_SUBSTITUTE] = gBattleAnimGeneral_SwapToSubstitute, + [B_ANIM_SWAP_FROM_SUBSTITUTE] = gBattleAnimGeneral_SwapFromSubstitute, }; static const u8* const sBattleAnims_Special[NUM_B_ANIMS_SPECIAL] = @@ -1568,20 +1572,17 @@ void LoadMoveBg(u16 bgId) { if (IsContest()) { - void *decompressionBuffer = Alloc(0x800); - const u32 *tilemap = gBattleAnimBackgroundTable[bgId].tilemap; - - LZDecompressWram(tilemap, decompressionBuffer); + void *decompressionBuffer = malloc_and_decompress(gBattleAnimBackgroundTable[bgId].tilemap, NULL); RelocateBattleBgPal(GetBattleBgPaletteNum(), decompressionBuffer, 0x100, FALSE); DmaCopy32(3, decompressionBuffer, (void *)BG_SCREEN_ADDR(26), 0x800); - LZDecompressVram(gBattleAnimBackgroundTable[bgId].image, (void *)BG_SCREEN_ADDR(4)); - LoadPalette(gBattleAnimBackgroundTable[bgId].palette, BG_PLTT_ID(GetBattleBgPaletteNum()), PLTT_SIZE_4BPP); Free(decompressionBuffer); + DecompressDataWithHeaderVram(gBattleAnimBackgroundTable[bgId].image, (void *)BG_SCREEN_ADDR(4)); + LoadPalette(gBattleAnimBackgroundTable[bgId].palette, BG_PLTT_ID(GetBattleBgPaletteNum()), PLTT_SIZE_4BPP); } else { - LZDecompressVram(gBattleAnimBackgroundTable[bgId].tilemap, (void *)BG_SCREEN_ADDR(26)); - LZDecompressVram(gBattleAnimBackgroundTable[bgId].image, (void *)BG_CHAR_ADDR(2)); + DecompressDataWithHeaderVram(gBattleAnimBackgroundTable[bgId].tilemap, (void *)BG_SCREEN_ADDR(26)); + DecompressDataWithHeaderVram(gBattleAnimBackgroundTable[bgId].image, (void *)BG_CHAR_ADDR(2)); LoadPalette(gBattleAnimBackgroundTable[bgId].palette, BG_PLTT_ID(2), PLTT_SIZE_4BPP); } } @@ -2223,7 +2224,7 @@ static void Cmd_stopsound(void) static void Cmd_jumpifmovetypeequal(void) { - const u8 *type = sBattleAnimScriptPtr + 1; + const enum Type *type = sBattleAnimScriptPtr + 1; sBattleAnimScriptPtr += 2; if (*type != GetBattleMoveType(gCurrentMove)) sBattleAnimScriptPtr += 4; diff --git a/src/battle_anim_dark.c b/src/battle_anim_dark.c index 12a75efa3121..f8f2dcd0d0af 100644 --- a/src/battle_anim_dark.c +++ b/src/battle_anim_dark.c @@ -257,6 +257,21 @@ const struct SpriteTemplate gPunishmentImpactSpriteTemplate = .callback = AnimPunishment, }; +// See AnimShadowBall in battle_anim_ghost.c for more specifics +// arg 0: duration step 1 (attacker -> center) +// arg 1: duration step 2 (spin center) +// arg 2: duration step 3 (center -> target) +const struct SpriteTemplate gDarkPulseSpriteTemplate = +{ + .tileTag = ANIM_TAG_PURPLE_RING, + .paletteTag = ANIM_TAG_PURPLE_RING, + .oam = &gOamData_AffineDouble_ObjNormal_16x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_SpinningBone, + .callback = AnimShadowBall, +}; + // arg 0: x pixel offset // arg 1: y pixel offset // arg 2: Something diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index bc3b4a2c4472..4699f2008a7b 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -154,7 +154,6 @@ static void AnimDoubleTeam(struct Sprite *); static void AnimNightSlash(struct Sprite *); static void AnimRockPolishStreak(struct Sprite *); static void AnimRockPolishSparkle(struct Sprite *); -static void AnimPoisonJabProjectile(struct Sprite *); static void AnimNightSlash(struct Sprite *); static void AnimPluck(struct Sprite *); static void AnimAcrobaticsSlashes(struct Sprite *); @@ -5190,7 +5189,7 @@ void AnimNeedleArmSpike(struct Sprite *sprite) { if (gBattleAnimArgs[0] == 0) { - if (IsDoubleBattle()) + if (GetMoveTarget(gAnimMoveIndex) == MOVE_TARGET_BOTH) { SetAverageBattlerPositions(gBattleAnimAttacker, TRUE, &a, &b); } @@ -5202,7 +5201,7 @@ void AnimNeedleArmSpike(struct Sprite *sprite) } else { - if (IsDoubleBattle()) + if (GetMoveTarget(gAnimMoveIndex) == MOVE_TARGET_BOTH) { SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &a, &b); } @@ -6832,10 +6831,10 @@ static void TrySwapStickyWebBattlerId(u32 battlerAtk, u32 battlerPartner) static void TrySwapWishBattlerIds(u32 battlerAtk, u32 battlerPartner) { u32 i, temp; - u32 oppSide = GetBattlerSide(BATTLE_OPPOSITE(battlerAtk)); // if used future sight on opposing side, properly track who used it - if (gSideStatuses[oppSide] & SIDE_STATUS_FUTUREATTACK) + if (gWishFutureKnock.futureSightCounter[LEFT_FOE(battlerAtk)] > 0 + || gWishFutureKnock.futureSightCounter[RIGHT_FOE(battlerAtk)] > 0) { for (i = 0; i < gBattlersCount; i++) { @@ -6859,11 +6858,56 @@ static void TrySwapWishBattlerIds(u32 battlerAtk, u32 battlerPartner) } // swap wish party indices - if (gWishFutureKnock.wishCounter[battlerAtk] > gBattleTurnCounter - || gWishFutureKnock.wishCounter[battlerPartner] > gBattleTurnCounter) + if (gWishFutureKnock.wishCounter[battlerAtk] > 0 + || gWishFutureKnock.wishCounter[battlerPartner] > 0) SWAP(gWishFutureKnock.wishPartyId[battlerAtk], gWishFutureKnock.wishPartyId[battlerPartner], temp); } +static void TrySwapAttractBattlerIds(u32 battlerAtk, u32 battlerPartner) +{ + u32 attractedTo; + + // our own infatuation handled with gBattleMons struct data swapping + + // if another battler is infatuated with one of us, change to other battler + for (u32 i = 0; i < gBattlersCount; i++) + { + if (i == battlerAtk || i == battlerPartner || !gBattleMons[i].volatiles.infatuation) + continue; + + attractedTo = INFATUATED_WITH(i); + if (attractedTo == battlerAtk) + { + gBattleMons[i].volatiles.infatuation = INFATUATED_WITH(battlerPartner); + break; + } + else if (attractedTo == battlerPartner) + { + gBattleMons[i].volatiles.infatuation = INFATUATED_WITH(battlerAtk); + break; + } + } +} + +static void SwapBattlerMoveData(u32 battler1, u32 battler2) +{ + u32 temp; + SWAP(gBattleStruct->chosenMovePositions[battler1], gBattleStruct->chosenMovePositions[battler2], temp); + SWAP(gChosenMoveByBattler[battler1], gChosenMoveByBattler[battler2], temp); + SWAP(gBattleStruct->moveTarget[battler1], gBattleStruct->moveTarget[battler2], temp); + SWAP(gMoveSelectionCursor[battler1], gMoveSelectionCursor[battler2], temp); + SWAP(gLockedMoves[battler1], gLockedMoves[battler2], temp); + + // update last moves + SWAP(gLastPrintedMoves[battler1], gLastPrintedMoves[battler2], temp); + SWAP(gLastMoves[battler1], gLastMoves[battler2], temp); + SWAP(gLastLandedMoves[battler1], gLastLandedMoves[battler2], temp); + SWAP(gLastHitByType[battler1], gLastHitByType[battler2], temp); + SWAP(gLastUsedMoveType[battler1], gLastUsedMoveType[battler2], temp); + SWAP(gLastResultingMoves[battler1], gLastResultingMoves[battler2], temp); + SWAP(gLastHitBy[battler1], gLastHitBy[battler2], temp); +} + static void AnimTask_AllySwitchDataSwap(u8 taskId) { s32 i, j; @@ -6888,13 +6932,9 @@ static void AnimTask_AllySwitchDataSwap(u8 taskId) SWAP(gBattleSpritesDataPtr->battlerData[battlerAtk].invisible, gBattleSpritesDataPtr->battlerData[battlerPartner].invisible, temp); SWAP(gTransformedPersonalities[battlerAtk], gTransformedPersonalities[battlerPartner], temp); SWAP(gTransformedShininess[battlerAtk], gTransformedShininess[battlerPartner], temp); - SWAP(gStatuses3[battlerAtk], gStatuses3[battlerPartner], temp); - SWAP(gStatuses4[battlerAtk], gStatuses4[battlerPartner], temp); - SWAP(gBattleStruct->chosenMovePositions[battlerAtk], gBattleStruct->chosenMovePositions[battlerPartner], temp); - SWAP(gChosenMoveByBattler[battlerAtk], gChosenMoveByBattler[battlerPartner], temp); - SWAP(gLockedMoves[battlerAtk], gLockedMoves[battlerPartner], temp); - SWAP(gBattleStruct->moveTarget[battlerAtk], gBattleStruct->moveTarget[battlerPartner], temp); - SWAP(gMoveSelectionCursor[battlerAtk], gMoveSelectionCursor[battlerPartner], temp); + + SwapBattlerMoveData(battlerAtk, battlerPartner); + // Swap turn order, so that all the battlers take action SWAP(gChosenActionByBattler[battlerAtk], gChosenActionByBattler[battlerPartner], temp); for (i = 0; i < gBattlersCount; i++) @@ -6919,11 +6959,12 @@ static void AnimTask_AllySwitchDataSwap(u8 taskId) TrySwapSkyDropTargets(battlerAtk, battlerPartner); TrySwapStickyWebBattlerId(battlerAtk, battlerPartner); TrySwapWishBattlerIds(battlerAtk, battlerPartner); + TrySwapAttractBattlerIds(battlerAtk, battlerPartner); // For Snipe Shot and abilities Stalwart/Propeller Tail - keep the original target. for (i = 0; i < gBattlersCount; i++) { - u16 ability = GetBattlerAbility(i); + enum Ability ability = GetBattlerAbility(i); // if not targeting a slot that got switched, continue if (!IsBattlerAlly(gBattleStruct->moveTarget[i], battlerAtk)) continue; @@ -7450,7 +7491,7 @@ static void AnimRockPolishSparkle(struct Sprite *sprite) // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: duration -static void AnimPoisonJabProjectile(struct Sprite *sprite) +void AnimPoisonJabProjectile(struct Sprite *sprite) { s16 targetXPos; s16 targetYPos; diff --git a/src/battle_anim_effects_2.c b/src/battle_anim_effects_2.c index 10080dc84b25..96e78cb0d6ed 100755 --- a/src/battle_anim_effects_2.c +++ b/src/battle_anim_effects_2.c @@ -2581,7 +2581,7 @@ static void AnimPencil_Step(struct Sprite *sprite) sprite->y -= 1; sprite->data[2]++; if (sprite->data[2] % 10 == 0) - PlaySE12WithPanning(SE_M_SKETCH, sprite->data[6]); + PlaySE12WithPanning((gAnimMoveIndex == MOVE_DOODLE) ? SE_M_REVERSAL : SE_M_SKETCH, sprite->data[6]); } sprite->data[4] += sprite->data[3]; if (sprite->data[4] > 31) diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c index 409244ccacfb..cc6203ce5bdd 100644 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -1325,6 +1325,41 @@ const struct SpriteTemplate gTeraCrystalSpreadSpriteTemplate = .callback = AnimTask_TeraCrystalShatter, }; +// See AnimSpriteOnMonPos in battle_anim_mons.c for more specifics +// Reuses the Mega Symbol affine animation seen in Mega Evolution +// gBattleAnimArgs 0-3 used +// 0, 1 used for position +// 2, 3 as some control variables +const struct SpriteTemplate gTeraSymbolSpriteTemplate = +{ + .tileTag = ANIM_TAG_TERA_SYMBOL, + .paletteTag = ANIM_TAG_TERA_SYMBOL, + .oam = &gOamData_AffineDouble_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_MegaSymbol, + .callback = AnimSpriteOnMonPos, +}; + +// Swirls particle in vortex. Used for moves like Fire Spin or Sand Tomb +// args[0] - initial x offset +// args[1] - initial y offset +// args[2] - y increment +// args[3] - duration +// args[4] - increments some sin parameter +// args[5] - fixed sin parameter +// args[6] - attacker or target +const struct SpriteTemplate gTeraSmokeSpriteTemplate = +{ + .tileTag = ANIM_TAG_SPARKLE_6, + .paletteTag = ANIM_TAG_SPARKLE_6, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimParticleInVortex, +}; + const struct SpriteTemplate gPinkPetalVortexTemplate = { .tileTag = ANIM_TAG_PINK_PETAL, @@ -2449,11 +2484,10 @@ void AnimTask_HideSwapSprite(u8 taskId) case 0: gTasks[taskId].data[11] = gSprites[spriteId].x; // Save battler position gSprites[spriteId].x = -64; // hide it from screen to avoid the blip/glitch effect when swapping the sprite. - gTasks[taskId].data[10] = gBattleAnimArgs[0]; gTasks[taskId].data[0]++; break; case 1: - HandleSpeciesGfxDataChange(gBattleAnimAttacker, gBattleAnimTarget, gTasks[taskId].data[10], gBattleAnimArgs[1]); + HandleSpeciesGfxDataChange(gBattleAnimAttacker, gBattleAnimTarget, SPECIES_GFX_CHANGE_FORM_CHANGE); GetBgDataForTransform(&animBg, gBattleAnimAttacker); if (IsContest()) @@ -2501,20 +2535,38 @@ void AnimTask_HideSwapSprite(u8 taskId) break; case 2: gSprites[spriteId].x = gTasks[taskId].data[11]; // restores battler position - if (!IsContest()) - { - if (!IsOnPlayerSide(gBattleAnimAttacker)) - { - if (gTasks[taskId].data[10] == 0) - SetBattlerShadowSpriteCallback(gBattleAnimAttacker, gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies); - } - } DestroyAnimVisualTask(taskId); break; } } +void AnimTask_HideOpponentShadows(u8 taskId) +{ + u32 battlerLeft = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerLeft].shadowSpriteIdPrimary].callback = SpriteCB_SetInvisible; + gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerLeft].shadowSpriteIdSecondary].callback = SpriteCB_SetInvisible; + if (IsDoubleBattle()) + { + u32 battlerRight = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); + gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerRight].shadowSpriteIdPrimary].callback = SpriteCB_SetInvisible; + gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerRight].shadowSpriteIdSecondary].callback = SpriteCB_SetInvisible; + } + DestroyAnimVisualTask(taskId); +} + +void AnimTask_SetOpponentShadowCallbacks(u8 taskId) +{ + u32 battlerLeft = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + SetBattlerShadowSpriteCallback(battlerLeft, gBattleMons[battlerLeft].species); + if (IsDoubleBattle()) + { + u32 battlerRight = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); + SetBattlerShadowSpriteCallback(battlerRight, gBattleMons[battlerRight].species); + } + DestroyAnimVisualTask(taskId); +} + void AnimTask_TransformMon(u8 taskId) { int i, j; @@ -2535,7 +2587,6 @@ void AnimTask_TransformMon(u8 taskId) SetAnimBgAttribute(2, BG_ANIM_MOSAIC, 1); gTasks[taskId].data[10] = gBattleAnimArgs[0]; - gTasks[taskId].data[11] = gBattleAnimArgs[1]; gTasks[taskId].data[0]++; break; case 1: @@ -2550,7 +2601,7 @@ void AnimTask_TransformMon(u8 taskId) } break; case 2: - HandleSpeciesGfxDataChange(gBattleAnimAttacker, gBattleAnimTarget, gTasks[taskId].data[10], gTasks[taskId].data[11]); + HandleSpeciesGfxDataChange(gBattleAnimAttacker, gBattleAnimTarget, gTasks[taskId].data[10]); GetBgDataForTransform(&animBg, gBattleAnimAttacker); if (IsContest()) @@ -2619,7 +2670,7 @@ void AnimTask_TransformMon(u8 taskId) { if (!IsOnPlayerSide(gBattleAnimAttacker)) { - if (gTasks[taskId].data[10] == 0) + if (gTasks[taskId].data[10] == SPECIES_GFX_CHANGE_TRANSFORM) SetBattlerShadowSpriteCallback(gBattleAnimAttacker, gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies); } } @@ -5724,7 +5775,7 @@ static void AnimRecycle_Step(struct Sprite *sprite) void AnimTask_GetWeather(u8 taskId) { - bool32 utilityUmbrellaAffected = GetBattlerHoldEffect(gBattleAnimAttacker, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA; + bool32 utilityUmbrellaAffected = GetBattlerHoldEffect(gBattleAnimAttacker) == HOLD_EFFECT_UTILITY_UMBRELLA; gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_NONE; if (gWeatherMoveAnim & B_WEATHER_SUN && !utilityUmbrellaAffected) diff --git a/src/battle_anim_electric.c b/src/battle_anim_electric.c index bc8d32145835..269d582f3bd7 100644 --- a/src/battle_anim_electric.c +++ b/src/battle_anim_electric.c @@ -10,7 +10,7 @@ static void AnimLightning(struct Sprite *); static void AnimLightning_Step(struct Sprite *); static void AnimUnusedSpinningFist(struct Sprite *); static void AnimUnusedSpinningFist_Step(struct Sprite *); -static void AnimUnusedCirclingShock(struct Sprite *); +static void AnimCirclingElectricShock(struct Sprite *); static void AnimZapCannonSpark_Step(struct Sprite *); static void AnimThunderboltOrb(struct Sprite *); static void AnimThunderboltOrb_Step(struct Sprite *); @@ -83,7 +83,9 @@ static const struct SpriteTemplate sUnusedSpinningFistSpriteTemplate = .callback = AnimUnusedSpinningFist, }; -static const union AnimCmd sAnim_UnusedCirclingShock[] = +// Previously an unused function named sAnim_CirclingElectricShock +// Now used for Tera Blast Electric +static const union AnimCmd sAnim_CirclingElectricShock[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(16, 5), @@ -94,21 +96,24 @@ static const union AnimCmd sAnim_UnusedCirclingShock[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sAnims_UnusedCirclingShock[] = +// Previously an unused function named sAnims_UnusedCirclingShock +// Now used for Tera Blast Electric +const union AnimCmd *const sAnims_CirclingElectricShock[] = { - sAnim_UnusedCirclingShock, + sAnim_CirclingElectricShock, }; -// Unused -static const struct SpriteTemplate sUnusedCirclingShockSpriteTemplate = +// Previously named sUnusedCirclingShockSpriteTemplate +// Still unused, but renamed for consistency +static const struct SpriteTemplate sCirclingElectricShockSpriteTemplate = { .tileTag = ANIM_TAG_SHOCK, .paletteTag = ANIM_TAG_SHOCK, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_UnusedCirclingShock, + .anims = sAnims_CirclingElectricShock, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = AnimUnusedCirclingShock, + .callback = AnimCirclingElectricShock, }; const struct SpriteTemplate gSparkElectricitySpriteTemplate = @@ -343,6 +348,19 @@ static const union AffineAnimCmd sAffineAnim_GrowingElectricOrb_2[] = AFFINEANIMCMD_END, }; +static const union AffineAnimCmd sAffineAnim_GrowingElectricOrb_3[] = +{ + AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0), + AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 60), + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_LOOP(0), + AFFINEANIMCMD_FRAME(0xFFFC, 0xFFFC, 0, 5), + AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 5), + AFFINEANIMCMD_LOOP(10), + AFFINEANIMCMD_FRAME(-4, -4, 0, 60), + AFFINEANIMCMD_END, +}; + static const union AffineAnimCmd sAffineAnim_GrowingElectricOrb_4[] = { AFFINEANIMCMD_FRAME(5, 5, 0, 0), @@ -368,6 +386,11 @@ const union AffineAnimCmd *const gAffineAnims_GrowingElectricOrb2[] = sAffineAnim_GrowingElectricOrb_4, }; +const union AffineAnimCmd *const gAffineAnims_GrowingElectricOrb3[] = +{ + sAffineAnim_GrowingElectricOrb_3, +}; + const struct SpriteTemplate gGrowingChargeOrbSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, @@ -391,6 +414,18 @@ const struct SpriteTemplate gGrowingChargeOrb2SpriteTemplate = .callback = AnimGrowingChargeOrb, }; +// For Dynamax Cannon - orb gets smaller at the end +const struct SpriteTemplate gGrowingChargeOrb3SpriteTemplate = +{ + .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_GrowingElectricOrb3, + .callback = AnimGrowingChargeOrb, +}; + static const union AnimCmd sAnim_ElectricPuff[] = { ANIMCMD_FRAME(0, 3), @@ -492,6 +527,17 @@ const struct SpriteTemplate gFairyLockChainsSpriteTemplate = .callback = AnimVoltTackleBolt, }; +const struct SpriteTemplate gCollisionCourseSpriteTemplate = +{ + .tileTag = ANIM_TAG_SMALL_EMBER, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &gOamData_AffineOff_ObjNormal_64x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimVoltTackleBolt, +}; + const struct SpriteTemplate gGrowingShockWaveOrbSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, @@ -634,7 +680,7 @@ static void AnimUnusedSpinningFist_Step(struct Sprite *sprite) DestroySpriteAndMatrix(sprite); } -static void AnimUnusedCirclingShock(struct Sprite *sprite) +static void AnimCirclingElectricShock(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); @@ -1256,19 +1302,25 @@ void AnimTask_VoltTackleBolt(u8 taskId) static bool8 CreateVoltTackleBolt(struct Task *task, u8 taskId) { u32 spriteId; - bool32 isFairyLock = (gAnimMoveIndex == MOVE_FAIRY_LOCK); - - if (isFairyLock) - spriteId = CreateSprite(&gFairyLockChainsSpriteTemplate, task->data[3], task->data[5] + 10, 35); - else - spriteId = CreateSprite(&gVoltTackleBoltSpriteTemplate, task->data[3], task->data[5], 35); + switch(gAnimMoveIndex) + { + case MOVE_FAIRY_LOCK: + spriteId = CreateSprite(&gFairyLockChainsSpriteTemplate, task->data[3], task->data[5] + 10, 35); + break; + case MOVE_COLLISION_COURSE: + spriteId = CreateSprite(&gCollisionCourseSpriteTemplate, task->data[3], task->data[5], 35); + break; + default: + spriteId = CreateSprite(&gVoltTackleBoltSpriteTemplate, task->data[3], task->data[5], 35); + } + bool32 doDestroyOamMatrix = (gAnimMoveIndex == MOVE_FAIRY_LOCK) || (gAnimMoveIndex == MOVE_COLLISION_COURSE); if (spriteId != MAX_SPRITES) { gSprites[spriteId].data[6] = taskId; gSprites[spriteId].data[7] = 7; - gSprites[spriteId].data[1] = isFairyLock ? 25 : 12; // How long the chains / bolts stay on screen. - gSprites[spriteId].data[2] = isFairyLock; // Whether to destroy the Oam Matrix. + gSprites[spriteId].data[1] = (gAnimMoveIndex == MOVE_FAIRY_LOCK) ? 25 : 12; // How long the chains / bolts stay on screen. + gSprites[spriteId].data[2] = doDestroyOamMatrix; // Whether to destroy the Oam Matrix. task->data[7]++; } diff --git a/src/battle_anim_fight.c b/src/battle_anim_fight.c index 63500ab701eb..49386f0334bc 100644 --- a/src/battle_anim_fight.c +++ b/src/battle_anim_fight.c @@ -525,7 +525,7 @@ void AnimBasicFistOrFoot(struct Sprite *sprite) { StartSpriteAnim(sprite, gBattleAnimArgs[4]); - if (gBattleAnimArgs[3] == 0) + if (gBattleAnimArgs[3] == ANIM_ATTACKER) InitSpritePosToAnimAttacker(sprite, TRUE); else InitSpritePosToAnimTarget(sprite, TRUE); diff --git a/src/battle_anim_fire.c b/src/battle_anim_fire.c index 276b8c8c079c..5d34d4766114 100644 --- a/src/battle_anim_fire.c +++ b/src/battle_anim_fire.c @@ -1296,6 +1296,12 @@ static void AnimWillOWispFire(struct Sprite *sprite) sprite->data[3] += 0xC0 * 2; sprite->data[4] += 0xA0; + if (IsDoubleBattle() + && !IsContest() + && IsBattlerAlive(BATTLE_PARTNER(gBattleAnimTarget)) + && GetMoveTarget(gAnimMoveIndex) == MOVE_TARGET_BOTH) + SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->x, &sprite->y); + sprite->x2 = Sin(sprite->data[1], sprite->data[3] >> 8); sprite->y2 = Cos(sprite->data[1], sprite->data[4] >> 8); diff --git a/src/battle_anim_flying.c b/src/battle_anim_flying.c index 2a346bb2ee82..10afc34759a0 100644 --- a/src/battle_anim_flying.c +++ b/src/battle_anim_flying.c @@ -356,6 +356,17 @@ const struct SpriteTemplate gSkyAttackBirdSpriteTemplate = .callback = AnimSkyAttackBird, }; +const struct SpriteTemplate gGlaiveRushSpriteTemplate = +{ + .tileTag = ANIM_TAG_DRAGON_ASCENT, + .paletteTag = ANIM_TAG_DRAGON_ASCENT, + .oam = &gOamData_AffineNormal_ObjNormal_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSkyAttackBird, +}; + // same as AnimEllipticalGust but centered on targets in a double battle static void AnimEllipticalGustCentered(struct Sprite *sprite) { diff --git a/src/battle_anim_ground.c b/src/battle_anim_ground.c index eb96414b55fe..1ba6fc0b62a8 100644 --- a/src/battle_anim_ground.c +++ b/src/battle_anim_ground.c @@ -7,7 +7,6 @@ #include "constants/rgb.h" static void AnimBonemerangProjectile(struct Sprite *); -static void AnimBoneHitProjectile(struct Sprite *); static void AnimDirtPlumeParticle_Step(struct Sprite *); static void AnimDigDirtMound(struct Sprite *); static void AnimBonemerangProjectile_Step(struct Sprite *); @@ -84,7 +83,7 @@ static const union AnimCmd sAnim_MudSlapMud[] = ANIMCMD_END, }; -static const union AnimCmd *const sAnims_MudSlapMud[] = +const union AnimCmd *const sAnims_MudSlapMud[] = { sAnim_MudSlapMud, }; @@ -199,7 +198,7 @@ static void AnimBonemerangProjectile_End(struct Sprite *sprite) // arg 2: target x pixel offset // arg 3: target y pixel offset // arg 4: duration -static void AnimBoneHitProjectile(struct Sprite *sprite) +void AnimBoneHitProjectile(struct Sprite *sprite) { InitSpritePosToAnimTarget(sprite, TRUE); if (!IsOnPlayerSide(gBattleAnimAttacker)) diff --git a/src/battle_anim_ice.c b/src/battle_anim_ice.c index 8aa4ae256313..5b8c599c84c4 100644 --- a/src/battle_anim_ice.c +++ b/src/battle_anim_ice.c @@ -28,7 +28,6 @@ struct HailStruct { static void AnimUnusedIceCrystalThrow(struct Sprite *); static void AnimUnusedIceCrystalThrow_Step(struct Sprite *); static void AnimIcePunchSwirlingParticle(struct Sprite *); -static void AnimIceBeamParticle(struct Sprite *); static void AnimFlickerIceEffectParticle(struct Sprite *); static void AnimSwirlingSnowball(struct Sprite *); static void AnimSwirlingSnowball_Step2(struct Sprite *); @@ -703,7 +702,7 @@ static void AnimIcePunchSwirlingParticle(struct Sprite *sprite) // arg 2: target x offset // arg 3: target y offset // arg 4: duration -static void AnimIceBeamParticle(struct Sprite *sprite) +void AnimIceBeamParticle(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index f7c98bef56f9..5b734e392620 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -777,6 +777,24 @@ void InitSpritePosToAnimAttackerPartner(struct Sprite *sprite, bool8 respectMonP sprite->y += gBattleAnimArgs[1]; } +void InitSpritePosToAnimBothTargets(struct Sprite *sprite, bool8 respectMonPicOffsets) +{ + if (!respectMonPicOffsets) + { + sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X) + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_X); + sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y) + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_Y); + } + else + { + sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X_2) + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_X_2); + sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_Y_PIC_OFFSET); + } + sprite->x = sprite->x / 2; + sprite->y = sprite->y / 2; + SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); + sprite->y += gBattleAnimArgs[1]; +} + bool32 InitSpritePosToAnimBattler(u32 animBattlerId, struct Sprite *sprite, bool8 respectMonPicOffsets) { u32 battler = GetAnimBattlerId(animBattlerId); @@ -916,7 +934,7 @@ void ClearBattleAnimBg(u32 bgId) void AnimLoadCompressedBgGfx(u32 bgId, const u32 *src, u32 tilesOffset) { CpuFill32(0, gBattleAnimBgTileBuffer, 0x2000); - LZDecompressWram(src, gBattleAnimBgTileBuffer); + DecompressDataWithHeaderWram(src, gBattleAnimBgTileBuffer); LoadBgTiles(bgId, gBattleAnimBgTileBuffer, 0x2000, tilesOffset); } @@ -1445,12 +1463,24 @@ void AnimSpriteOnMonPos(struct Sprite *sprite) else respectMonPicOffsets = FALSE; - if (gBattleAnimArgs[2] == 0) - InitSpritePosToAnimAttacker(sprite, respectMonPicOffsets); - else if (gBattleAnimArgs[2] == 1) - InitSpritePosToAnimTarget(sprite, respectMonPicOffsets); - else if (gBattleAnimArgs[2] == 2) - InitSpritePosToAnimAttackerPartner(sprite, respectMonPicOffsets); + switch(gBattleAnimArgs[2]) + { + case 0: + InitSpritePosToAnimAttacker(sprite, respectMonPicOffsets); + break; + case 1: + InitSpritePosToAnimTarget(sprite, respectMonPicOffsets); + break; + case 2: + InitSpritePosToAnimAttackerPartner(sprite, respectMonPicOffsets); + break; + case 3: + if(IsDoubleBattle()) + InitSpritePosToAnimBothTargets(sprite, respectMonPicOffsets); + else + InitSpritePosToAnimTarget(sprite, respectMonPicOffsets); + break; + } sprite->data[0]++; @@ -2180,6 +2210,37 @@ void SetAverageBattlerPositions(u8 battler, bool8 respectMonPicOffsets, s16 *x, *y = (battlerY + partnerY) / 2; } +void SetToPartnerPositions(u8 battler, bool8 respectMonPicOffsets, s16 *x, s16 *y) +{ + u8 xCoordType, yCoordType; + s16 returnX, returnY; + + if (!respectMonPicOffsets) + { + xCoordType = BATTLER_COORD_X; + yCoordType = BATTLER_COORD_Y; + } + else + { + xCoordType = BATTLER_COORD_X_2; + yCoordType = BATTLER_COORD_Y_PIC_OFFSET; + } + + if (IsDoubleBattle() && !IsContest() && IsBattlerAlive(BATTLE_PARTNER(battler))) + { + returnX = GetBattlerSpriteCoord(BATTLE_PARTNER(battler), xCoordType); + returnY = GetBattlerSpriteCoord(BATTLE_PARTNER(battler), yCoordType); + } + else + { + returnX = GetBattlerSpriteCoord(battler, xCoordType); + returnY = GetBattlerSpriteCoord(battler, yCoordType); + } + + *x = returnX; + *y = returnY; +} + u8 CreateInvisibleSpriteCopy(int battler, u8 spriteId, int species) { u8 newSpriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index 40d3602e6c61..fff35b407364 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -4403,6 +4403,17 @@ const struct SpriteTemplate gUTurnBallBackSpriteTemplate = .callback = AnimAbsorptionOrb, }; +// dynamax cannon +const struct SpriteTemplate gSpriteTemplate_DynamaxCannonOrb = { + .tileTag = ANIM_TAG_HYDRO_PUMP, + .paletteTag = ANIM_TAG_HYDRO_PUMP, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_HydroCannonBall, + .callback = AnimShadowBall +}; + // wicked blow static const union AffineAnimCmd sSpriteAffineAnim_DrainPunchFist[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 1), //Double sprite size @@ -4729,7 +4740,7 @@ static const union AffineAnimCmd* const sSpriteAffineAnimTable_Flutterby[] = { const struct SpriteTemplate gSpriteTemplate_InfernalParadeFlame = { .tileTag = ANIM_TAG_PURPLE_FLAME, .paletteTag = ANIM_TAG_PURPLE_FLAME, - .oam = &gOamData_AffineDouble_ObjBlend_32x16, + .oam = &gOamData_AffineDouble_ObjNormal_16x32, .anims = gAnims_GrudgeFlame, .images = NULL, .affineAnims = sSpriteAffineAnimTable_Flutterby, @@ -5684,7 +5695,7 @@ const struct SpriteTemplate gBlackHoleEclipseBlueRingSpriteTemplate = const struct SpriteTemplate gBlackHoleEclipseBlackRingSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, - .paletteTag = ANIM_TAG_HANDS_AND_FEET, + .paletteTag = ANIM_TAG_SHADOW_BALL, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, @@ -7301,6 +7312,287 @@ const struct SpriteTemplate gOmegaGeyserSpriteTemplate = .callback = SpriteCB_Geyser, }; +// Moves objects (ice crystals) in a wave-like behavior. Seen in Max Flutterby +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: wave amplitude +const struct SpriteTemplate gIceShardSpriteTemplate = +{ + .tileTag = ANIM_TAG_ICE_CRYSTALS, + .paletteTag = ANIM_TAG_ICE_CRYSTALS, + .oam = &gOamData_AffineDouble_ObjBlend_8x8, + .anims = gAnims_IceCrystalSmall, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_Flutterby, + .callback = SpriteCB_MaxFlutterby +}; + +const struct SpriteTemplate gSpinningVineSpriteTemplate = +{ + .tileTag = ANIM_TAG_PUNISHMENT_BLADES, + .paletteTag = ANIM_TAG_LEAF, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_SpinningBone, + .callback = AnimBoneHitProjectile, +}; + +const struct SpriteTemplate gMaxFlutterbyButterflySpriteTemplate = +{ + .tileTag = ANIM_TAG_SPARKLE_6, + .paletteTag = ANIM_TAG_SPARKLE_6, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_Flutterby, + .callback = SpriteCB_MaxFlutterby +}; + +const struct SpriteTemplate gReallyBigRockBlastRockSpriteTemplate = +{ + .tileTag = ANIM_TAG_REALLY_BIG_ROCK, + .paletteTag = ANIM_TAG_REALLY_BIG_ROCK, + .oam = &gOamData_AffineDouble_ObjNormal_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimRockBlastRock, +}; + +const struct SpriteTemplate gOrderUpTatsugiriCurlySpriteTemplate = +{ + .tileTag = ANIM_TAG_TATSUGIRI_CURLY, + .paletteTag = ANIM_TAG_TATSUGIRI_CURLY, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_DreepyMissilePlayer, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimRockTomb, +}; + +const struct SpriteTemplate gOrderUpTatsugiriDroopySpriteTemplate = +{ + .tileTag = ANIM_TAG_TATSUGIRI_DROOPY, + .paletteTag = ANIM_TAG_TATSUGIRI_DROOPY, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_DreepyMissilePlayer, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimRockTomb, +}; + +const struct SpriteTemplate gOrderUpTatsugiriStretchySpriteTemplate = +{ + .tileTag = ANIM_TAG_TATSUGIRI_STRETCHY, + .paletteTag = ANIM_TAG_TATSUGIRI_STRETCHY, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_DreepyMissilePlayer, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimRockTomb, +}; + +// Start of Tera Blast sprite templates +const struct SpriteTemplate gFireSpreadBlastSpriteTemplate = +{ + .tileTag = ANIM_TAG_SMALL_EMBER, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_BasicFire, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimIceBeamParticle, +}; + +const struct SpriteTemplate gPurpleFlameSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_PURPLE_FLAME, + .paletteTag = ANIM_TAG_PURPLE_FLAME, + .oam = &gOamData_AffineOff_ObjBlend_16x32, + .anims = gAnims_GrudgeFlame, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate gAirWaveSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_AIR_WAVE_2, + .paletteTag = ANIM_TAG_AIR_WAVE_2, + .oam = &gOamData_AffineOff_ObjNormal_32x16, + .anims = gAffineAnims_AirWaveCrescent, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate gPinkVioletOrbSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_PINKVIO_ORB, + .paletteTag = ANIM_TAG_PINKVIO_ORB, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate gHydroPumpSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_HYDRO_PUMP, + .paletteTag = ANIM_TAG_HYDRO_PUMP, + .oam = &gOamData_AffineOff_ObjBlend_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate sCirclingShockSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_SHOCK, + .paletteTag = ANIM_TAG_SHOCK, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = sAnims_CirclingElectricShock, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate sIceCrystalSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_ICE_CRYSTALS, + .paletteTag = ANIM_TAG_ICE_CRYSTALS, + .oam = &gOamData_AffineDouble_ObjBlend_8x16, + .anims = gAnims_IceCrystalLarge, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate sMudSandSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_MUD_SAND, + .paletteTag = ANIM_TAG_MUD_SAND, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = sAnims_MudSlapMud, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate sPoisonSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_POISON_BUBBLE, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = &gAnims_PoisonProjectile[0], + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate sRockSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_ROCKS, + .paletteTag = ANIM_TAG_ROCKS, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_FlyingRock, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate sMetalBallSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_METAL_BALL, + .paletteTag = ANIM_TAG_METAL_BALL, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate sPinkHeartSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_PINK_HEART, + .paletteTag = ANIM_TAG_PINK_HEART, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate gDragonDanceOrbSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_HOLLOW_ORB, + .paletteTag = ANIM_TAG_HOLLOW_ORB, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate gYellowStarSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_YELLOW_STAR, + .paletteTag = ANIM_TAG_YELLOW_STAR, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate gTeraBlastFlyingSpriteTemplate = +{ + .tileTag = ANIM_TAG_METAL_SOUND_WAVES, + .paletteTag = ANIM_TAG_METAL_SOUND_WAVES, + .oam = &gOamData_AffineDouble_ObjNormal_32x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_SpinningBone, + .callback = AnimShadowBall, +}; + +const struct SpriteTemplate gTeraBlastWaterSpriteTemplate = +{ + .tileTag = ANIM_TAG_HYDRO_PUMP, + .paletteTag = ANIM_TAG_HYDRO_PUMP, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimDracoMeteorRock, +}; + +const struct SpriteTemplate gTeraBlastRockSpriteTemplate = +{ + .tileTag = ANIM_TAG_ROCKS, + .paletteTag = ANIM_TAG_ROCKS, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = sAnims_BasicRock, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimDracoMeteorRock, +}; + +const struct SpriteTemplate gGhostProjectileSpriteTemplate = +{ + .tileTag = ANIM_TAG_GHOSTLY_SPIRIT, + .paletteTag = ANIM_TAG_GHOSTLY_SPIRIT, + .oam = &gOamData_AffineOff_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimPoisonJabProjectile, +}; +// End of Tera Blast sprite templates + const union AnimCmd gSproutAnimCmds[] = { ANIMCMD_FRAME(96, 5), @@ -7965,7 +8257,7 @@ void SpriteCB_RandomCentredHits(struct Sprite *sprite) StartSpriteAffineAnim(sprite, gBattleAnimArgs[1]); - if (gBattleAnimArgs[0] == 0) + if (gBattleAnimArgs[0] == ANIM_ATTACKER) { if (IsDoubleBattle()) InitSpritePosToAnimAttackersCentre(sprite, FALSE); @@ -8766,7 +9058,7 @@ void AnimTask_ShellSideArm(u8 taskId) void AnimTask_TerrainPulse(u8 taskId) { - if (IsBattlerTerrainAffected(gBattleAnimAttacker, STATUS_FIELD_TERRAIN_ANY)) + if (IsBattlerTerrainAffected(gBattleAnimAttacker, GetBattlerAbility(gBattleAnimAttacker), GetBattlerHoldEffect(gBattleAnimAttacker), STATUS_FIELD_TERRAIN_ANY)) { if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) gBattleAnimArgs[0] = TYPE_ELECTRIC; @@ -9137,6 +9429,18 @@ static void SpriteCB_DragonEnergyShot(struct Sprite* sprite) //arg 2: wave amplitude static void SpriteCB_MaxFlutterby(struct Sprite* sprite) { + s16 target_x; + s16 target_y; + if (GetMoveTarget(gAnimMoveIndex) == MOVE_TARGET_BOTH) + { + SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &target_x, &target_y); + } + else + { + target_x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); + target_y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); + } + InitSpritePosToAnimAttacker(sprite, FALSE); sprite->data[0] = 0x10; //Speed delay @@ -9152,7 +9456,8 @@ static void SpriteCB_MaxFlutterbyStep1(struct Sprite* sprite) { if (!FuncIsActiveTask(AnimTask_DynamaxGrowthStep)) { - if (gAnimMoveIndex != MOVE_INFERNAL_PARADE) + if (gAnimMoveIndex != MOVE_INFERNAL_PARADE + && gAnimMoveIndex != MOVE_ASTRAL_BARRAGE) PlaySE(SE_M_SAND_ATTACK); StartSpriteAffineAnim(sprite, 1); @@ -9327,7 +9632,7 @@ void AnimTask_RandomBool(u8 taskId) // Credit to Skeli #define PRIMAL_PULSE_SCALE_SIZE 16 #define PRIMAL_PULSE_FRAME_COUNT 4 -static const union AffineAnimCmd sSpriteAffineAnim_PrimalSymbol[] = +static const union AffineAnimCmd sSpriteAffineAnim_PrimalSymbol[] = { AFFINEANIMCMD_FRAME(16, 16, 0, 0), AFFINEANIMCMD_FRAME(32, 32, 0, 15), @@ -9370,3 +9675,25 @@ const union AffineAnimCmd* const gSpriteAffineAnimTable_MegaSymbol[] = { sSpriteAffineAnim_MegaSymbol, }; + +// Used for determining which animation to use for Order Up +void AnimTask_GetCommanderType(u8 taskId) +{ + switch (gBattleStruct->battlerState[gEffectBattler].commanderSpecies) + { + case SPECIES_TATSUGIRI_CURLY: + gBattleAnimArgs[ARG_RET_ID] = ANIM_ORDER_UP_CURLY; + break; + case SPECIES_TATSUGIRI_DROOPY: + gBattleAnimArgs[ARG_RET_ID] = ANIM_ORDER_UP_DROOPY; + break; + case SPECIES_TATSUGIRI_STRETCHY: + gBattleAnimArgs[ARG_RET_ID] = ANIM_ORDER_UP_STRETCHY; + break; + default: + gBattleAnimArgs[ARG_RET_ID] = ANIM_ORDER_UP_NONE; + break; + } + + DestroyAnimVisualTask(taskId); +} diff --git a/src/battle_anim_poison.c b/src/battle_anim_poison.c index 39f30708c41e..e47f0321694d 100644 --- a/src/battle_anim_poison.c +++ b/src/battle_anim_poison.c @@ -520,12 +520,44 @@ static void AnimSludgeProjectile(struct Sprite *sprite) { if (!gBattleAnimArgs[3]) StartSpriteAnim(sprite, 2); + if (gBattleAnimArgs[4] && IsDoubleBattle()) + { + u32 targetPartner; + if (IsOnPlayerSide(gBattleAnimTarget)) + { + if (gBattleAnimTarget == 0) + targetPartner = 2; + else + targetPartner = 0; + } + else + { + if (gBattleAnimTarget == 1) + targetPartner = 3; + else + targetPartner = 1; + } + + if (IsBattlerAlive(gBattleAnimTarget) && !IsBattlerAlive(targetPartner)) + { + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); + } + else + { + sprite->data[2] = GetBattlerSpriteCoord(targetPartner, BATTLER_COORD_X_2); + sprite->data[4] = GetBattlerSpriteCoord(targetPartner, BATTLER_COORD_Y_PIC_OFFSET); + } + } + else + { + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); + } InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[2]; - sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); - sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[5] = -30; InitAnimArcTranslation(sprite); @@ -600,7 +632,12 @@ static void AnimSludgeBombHitParticle_Step(struct Sprite *sprite) static void AnimAcidPoisonDroplet(struct Sprite *sprite) { if (gBattleAnimArgs[5]) - SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->x, &sprite->y); + { + if (gBattleAnimArgs[5] == 1) + SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->x, &sprite->y); + if (gBattleAnimArgs[5] == 2) + SetToPartnerPositions(gBattleAnimTarget, TRUE, &sprite->x, &sprite->y); + } if (!IsOnPlayerSide(gBattleAnimAttacker)) gBattleAnimArgs[0] = -gBattleAnimArgs[0]; diff --git a/src/battle_anim_rock.c b/src/battle_anim_rock.c index 4ac83e444696..23b244957c68 100644 --- a/src/battle_anim_rock.c +++ b/src/battle_anim_rock.c @@ -11,7 +11,6 @@ static void AnimTask_Rollout_Step(u8 taskId); static void AnimRolloutParticle(struct Sprite *); -static void AnimRockTomb(struct Sprite *); static void AnimRockTomb_Step(struct Sprite *sprite); static void AnimRockScatter(struct Sprite *); static void AnimRockScatter_Step(struct Sprite *sprite); @@ -174,7 +173,7 @@ static const union AnimCmd sAnim_Rock_Smallest[] = ANIMCMD_END, }; -static const union AnimCmd *const sAnims_BasicRock[] = +const union AnimCmd *const sAnims_BasicRock[] = { sAnim_Rock_Biggest, sAnim_Rock_Bigger, @@ -935,7 +934,7 @@ static u8 GetRolloutCounter(void) return retVal; } -static void AnimRockTomb(struct Sprite *sprite) +void AnimRockTomb(struct Sprite *sprite) { StartSpriteAnim(sprite, gBattleAnimArgs[4]); @@ -1078,3 +1077,14 @@ const struct SpriteTemplate gSaltCureSwirlSpriteTemplate = .affineAnims = gAffineAnims_Whirlpool, .callback = AnimParticleInVortex, }; + +const struct SpriteTemplate gRockPlumeSpriteTemplate = +{ + .tileTag = ANIM_TAG_ROCKS, + .paletteTag = ANIM_TAG_ROCKS, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_FlyingRock, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimDirtPlumeParticle, +}; diff --git a/src/battle_anim_sound_tasks.c b/src/battle_anim_sound_tasks.c index 1bd7008aa448..6645e6273bf8 100644 --- a/src/battle_anim_sound_tasks.c +++ b/src/battle_anim_sound_tasks.c @@ -311,6 +311,13 @@ void SoundTask_PlayCryWithEcho(u8 taskId) DestroyAnimVisualTask(taskId); } +void SoundTask_PlayDynamaxCry(u8 taskId) +{ + u16 species = (GetIllusionMonSpecies(gBattleAnimAttacker) != SPECIES_NONE) ? GetIllusionMonSpecies(gBattleAnimAttacker) : gAnimBattlerSpecies[gBattleAnimAttacker]; + PlayCry_ByMode(species, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER), CRY_MODE_DYNAMAX); + gTasks[taskId].func = SoundTask_WaitForCry; +} + static void SoundTask_PlayCryWithEcho_Step(u8 taskId) { u16 species = gTasks[taskId].tSpecies; diff --git a/src/battle_anim_status_effects.c b/src/battle_anim_status_effects.c index b70f481d6cb4..f27d7da0ea20 100644 --- a/src/battle_anim_status_effects.c +++ b/src/battle_anim_status_effects.c @@ -530,7 +530,7 @@ static void AnimTask_FrozenIceCube_Step4(u8 taskId) void AnimTask_StatsChange(u8 taskId) { bool16 goesDown = FALSE; - s16 animStatId = 0; + enum StatAnimPal animStatId = 0; bool16 sharply = FALSE; switch (gBattleSpritesDataPtr->animationData->animArg) diff --git a/src/battle_anim_throw.c b/src/battle_anim_throw.c index 54f16003befe..d276c80ddb29 100644 --- a/src/battle_anim_throw.c +++ b/src/battle_anim_throw.c @@ -14,6 +14,7 @@ #include "sound.h" #include "sprite.h" #include "task.h" +#include "test_runner.h" #include "trig.h" #include "util.h" #include "data.h" @@ -2312,7 +2313,7 @@ void AnimTask_SwapMonSpriteToFromSubstitute(u8 taskId) { u8 spriteId; u32 x; - u32 done = FALSE; + bool32 done = FALSE; spriteId = gBattlerSpriteIds[gBattleAnimAttacker]; switch (gTasks[taskId].data[10]) @@ -2435,7 +2436,7 @@ void TryShinyAnimation(u8 battler, struct Pokemon *mon) if (illusionMon != NULL) mon = illusionMon; - if (IsBattlerSpriteVisible(battler) && IsValidForBattle(mon)) + if (IsBattlerSpriteVisible(battler) && IsValidForBattle(mon) && !gTestRunnerHeadless) { if (isShiny) { @@ -2768,4 +2769,3 @@ static void CB_CriticalCaptureThrownBallMovement(struct Sprite *sprite) sprite->callback = SpriteCB_Ball_Bounce_Step; } } - diff --git a/src/battle_anim_utility_funcs.c b/src/battle_anim_utility_funcs.c index 54b9f949ba85..54aa3e14aa5b 100644 --- a/src/battle_anim_utility_funcs.c +++ b/src/battle_anim_utility_funcs.c @@ -480,7 +480,7 @@ static void StatsChangeAnimation_Step2(u8 taskId) AnimLoadCompressedBgTilemapHandleContest(&animBgData, gStatAnim_Decrease_Tilemap, FALSE); AnimLoadCompressedBgGfx(animBgData.bgId, gStatAnim_Gfx, animBgData.tilesOffset); - switch (sAnimStatsChangeData->aAnimStatId) + switch ((enum StatAnimPal)sAnimStatsChangeData->aAnimStatId) { case STAT_ANIM_PAL_ATK: LoadPalette(gStatAnim_Attack_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); diff --git a/src/battle_anim_water.c b/src/battle_anim_water.c index 490136d116db..5674cd5cc7d8 100644 --- a/src/battle_anim_water.c +++ b/src/battle_anim_water.c @@ -45,6 +45,7 @@ static void AnimTask_RunSinAnimTimer(u8); static void AnimTask_CreateSurfWave_Step1(u8); static void AnimTask_CreateSurfWave_Step2(u8); static void AnimTask_SurfWaveScanlineEffect(u8); +static void AnimTask_BrineRain_Step(u8); static void AnimTask_WaterSpoutLaunch_Step(u8); static void AnimTask_WaterSpoutRain_Step(u8); static u8 GetWaterSpoutPowerForAnim(void); @@ -1442,24 +1443,97 @@ static void AnimSmallWaterOrb(struct Sprite *sprite) } } +#define tRainState data[0] +#define tWaterSpoutPower data[1] +#define tDropTaskDelay data[2] +#define tDropInitialXPos data[4] +#define tDropXRange data[5] +#define tDropEndYPos data[6] +#define tDropXPos data[7] +#define tSineTableIndex data[8] +#define tCurrentDropSprites data[9] +#define tDropHasHit data[10] +#define tCreatedDropSprites data[11] +#define tMaxDropSprites data[12] +#define tShakeTasksCreated data[13] +#define tDropInitialYPos data[14] + +void AnimTask_BrineRain(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + if (IsOnPlayerSide(gBattleAnimAttacker)) + { + task->tDropEndYPos = 40; + task->tDropInitialYPos = 0; + } + else + { + task->tDropEndYPos = 90; + task->tDropInitialYPos = 40; + } + task->tDropInitialXPos = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); + task->tDropXRange = 40; + task->tDropXPos = task->tDropInitialXPos; + task->tMaxDropSprites = 10; + task->func = AnimTask_BrineRain_Step; +} + +static void AnimTask_BrineRain_Step(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + u8 taskId2; + + switch (task->tRainState) + { + case 0: + if (++task->tDropTaskDelay > 2) + { + task->tDropTaskDelay = 0; + CreateWaterSpoutRainDroplet(task, taskId); + } + if (task->tDropHasHit != FALSE && task->tShakeTasksCreated == FALSE) + { + gBattleAnimArgs[0] = ANIM_TARGET; + gBattleAnimArgs[1] = 0; + gBattleAnimArgs[2] = 12; + taskId2 = CreateTask(AnimTask_HorizontalShake, 80); + if (taskId2 != TASK_NONE) + { + gTasks[taskId2].func(taskId2); + gAnimVisualTaskCount++; + } + task->tShakeTasksCreated = TRUE; + } + if (task->tCreatedDropSprites >= task->tMaxDropSprites) + task->tRainState++; + break; + case 1: + if (task->tCurrentDropSprites == 0) + DestroyAnimVisualTask(taskId); + break; + } +} + void AnimTask_WaterSpoutRain(u8 taskId) { struct Task *task = &gTasks[taskId]; - task->data[1] = GetWaterSpoutPowerForAnim(); + task->tWaterSpoutPower = GetWaterSpoutPowerForAnim(); if (IsOnPlayerSide(gBattleAnimAttacker)) { - task->data[4] = 136; - task->data[6] = 40; + task->tDropInitialXPos = 136; + task->tDropEndYPos = 40; } else { - task->data[4] = 16; - task->data[6] = 80; + task->tDropInitialXPos = 16; + task->tDropEndYPos = 80; } - task->data[5] = 98; - task->data[7] = task->data[4] + 49; - task->data[12] = task->data[1] * 5 + 5; + task->tDropXRange = 98; + task->tDropXPos = task->tDropInitialXPos + 49; + task->tMaxDropSprites = task->tWaterSpoutPower * 5 + 5; + task->tDropInitialYPos = 0; task->func = AnimTask_WaterSpoutRain_Step; } @@ -1468,15 +1542,15 @@ static void AnimTask_WaterSpoutRain_Step(u8 taskId) struct Task *task = &gTasks[taskId]; u8 taskId2; - switch (task->data[0]) + switch (task->tRainState) { case 0: - if (++task->data[2] > 2) + if (++task->tDropTaskDelay > 2) { - task->data[2] = 0; + task->tDropTaskDelay = 0; CreateWaterSpoutRainDroplet(task, taskId); } - if (task->data[10] != 0 && task->data[13] == 0) + if (task->tDropHasHit != FALSE && task->tShakeTasksCreated == FALSE) { gBattleAnimArgs[0] = ANIM_TARGET; gBattleAnimArgs[1] = 0; @@ -1494,13 +1568,13 @@ static void AnimTask_WaterSpoutRain_Step(u8 taskId) gTasks[taskId2].func(taskId2); gAnimVisualTaskCount++; } - task->data[13] = 1; + task->tShakeTasksCreated = TRUE; } - if (task->data[11] >= task->data[12]) - task->data[0]++; + if (task->tCreatedDropSprites >= task->tMaxDropSprites) + task->tRainState++; break; case 1: - if (task->data[9] == 0) + if (task->tCurrentDropSprites == 0) DestroyAnimVisualTask(taskId); break; } @@ -1508,8 +1582,8 @@ static void AnimTask_WaterSpoutRain_Step(u8 taskId) static void CreateWaterSpoutRainDroplet(struct Task *task, u8 taskId) { - u16 yPosArg = ((gSineTable[task->data[8]] + 3) >> 4) + task->data[6]; - u8 spriteId = CreateSprite(&gSmallWaterOrbSpriteTemplate, task->data[7], 0, 0); + u16 yPosArg = ((gSineTable[task->tSineTableIndex] + 3) >> 4) + task->tDropEndYPos; + u8 spriteId = CreateSprite(&gSmallWaterOrbSpriteTemplate, task->tDropXPos, task->tDropInitialYPos, 0); if (spriteId != MAX_SPRITES) { @@ -1517,11 +1591,11 @@ static void CreateWaterSpoutRainDroplet(struct Task *task, u8 taskId) gSprites[spriteId].data[5] = yPosArg; gSprites[spriteId].data[6] = taskId; gSprites[spriteId].data[7] = 9; - task->data[9]++; + task->tCurrentDropSprites++; } - task->data[11]++; - task->data[8] = (task->data[8] + 39) & 0xFF; - task->data[7] = (ISO_RANDOMIZE2(task->data[7]) % task->data[5]) + task->data[4]; + task->tCreatedDropSprites++; + task->tSineTableIndex = (task->tSineTableIndex + 39) & 0xFF; + task->tDropXPos = (ISO_RANDOMIZE2(task->tDropXPos) % task->tDropXRange) + task->tDropInitialXPos; } static void AnimWaterSpoutRain(struct Sprite *sprite) @@ -1531,7 +1605,7 @@ static void AnimWaterSpoutRain(struct Sprite *sprite) sprite->y += 8; if (sprite->y >= sprite->data[5]) { - gTasks[sprite->data[6]].data[10] = 1; + gTasks[sprite->data[6]].tDropHasHit = TRUE; sprite->data[1] = CreateSprite(&gWaterHitSplatSpriteTemplate, sprite->x, sprite->y, 1); if (sprite->data[1] != MAX_SPRITES) { @@ -1560,6 +1634,21 @@ static void AnimWaterSpoutRainHit(struct Sprite *sprite) } } +#undef tRainState +#undef tWaterSpoutPower +#undef tDropTaskDelay +#undef tDropInitialXPos +#undef tDropXRange +#undef tDropEndYPos +#undef tDropXPos +#undef tSineTableIndex +#undef tCurrentDropSprites +#undef tDropHasHit +#undef tCreatedDropSprites +#undef tMaxDropSprites +#undef tShakeTasksCreated +#undef tDropInitialYPos + void AnimTask_WaterSport(u8 taskId) { struct Task *task = &gTasks[taskId]; diff --git a/src/battle_arena.c b/src/battle_arena.c index 8474595b0d7f..3708fec02480 100644 --- a/src/battle_arena.c +++ b/src/battle_arena.c @@ -427,14 +427,11 @@ void BattleArena_DeductSkillPoints(u8 battler, enum StringID stringId) case STRINGID_PKMNSXBLOCKSY2: case STRINGID_PKMNSXPREVENTSYLOSS: case STRINGID_PKMNSXMADEYINEFFECTIVE: - case STRINGID_PKMNSXPREVENTSBURNS: case STRINGID_PKMNSXBLOCKSY: case STRINGID_PKMNPROTECTEDBY: case STRINGID_PKMNPREVENTSUSAGE: case STRINGID_PKMNRESTOREDHPUSING: - case STRINGID_PKMNPREVENTSPARALYSISWITH: case STRINGID_PKMNPREVENTSROMANCEWITH: - case STRINGID_PKMNPREVENTSPOISONINGWITH: case STRINGID_PKMNPREVENTSCONFUSIONWITH: case STRINGID_PKMNRAISEDFIREPOWERWITH: case STRINGID_PKMNANCHORSITSELFWITH: diff --git a/src/battle_bg.c b/src/battle_bg.c index a0df9017c799..14244c4e9520 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -5,6 +5,7 @@ #include "battle_main.h" #include "battle_message.h" #include "battle_setup.h" +#include "battle_environment.h" #include "bg.h" #include "data.h" #include "decompress.h" @@ -18,15 +19,16 @@ #include "sound.h" #include "sprite.h" #include "task.h" +#include "test_runner.h" #include "text_window.h" #include "trig.h" #include "window.h" -#include "constants/map_types.h" #include "constants/rgb.h" #include "constants/songs.h" #include "constants/trainers.h" #include "constants/battle_anim.h" #include "constants/battle_partner.h" +#include "data/battle_environment.h" // .rodata @@ -610,98 +612,81 @@ const struct WindowTemplate *const gBattleWindowTemplates[] = [B_WIN_TYPE_ARENA] = sBattleArenaWindowTemplates, }; -const struct BattleBackground sBattleEnvironmentTable[] = +// If current map scene equals any of the values in sMapBattleSceneMapping, +// use its battle terrain value. Otherwise, use the default. +static u8 GetBattleEnvironmentByMapScene(u8 mapBattleScene) { - [BATTLE_ENVIRONMENT_GRASS] = + int i; + for (i = 0; i < NELEMS(sMapBattleSceneMapping); i++) { - .tileset = gBattleEnvironmentTiles_TallGrass, - .tilemap = gBattleEnvironmentTilemap_TallGrass, - .entryTileset = gBattleEnvironmentAnimTiles_TallGrass, - .entryTilemap = gBattleEnvironmentAnimTilemap_TallGrass, - .palette = gBattleEnvironmentPalette_TallGrass, - }, - - [BATTLE_ENVIRONMENT_LONG_GRASS] = - { - .tileset = gBattleEnvironmentTiles_LongGrass, - .tilemap = gBattleEnvironmentTilemap_LongGrass, - .entryTileset = gBattleEnvironmentAnimTiles_LongGrass, - .entryTilemap = gBattleEnvironmentAnimTilemap_LongGrass, - .palette = gBattleEnvironmentPalette_LongGrass, - }, + if (mapBattleScene == sMapBattleSceneMapping[i].mapScene) + return sMapBattleSceneMapping[i].battleEnvironment; + } + return BATTLE_ENVIRONMENT_PLAIN; +} - [BATTLE_ENVIRONMENT_SAND] = - { - .tileset = gBattleEnvironmentTiles_Sand, - .tilemap = gBattleEnvironmentTilemap_Sand, - .entryTileset = gBattleEnvironmentAnimTiles_Sand, - .entryTilemap = gBattleEnvironmentAnimTilemap_Sand, - .palette = gBattleEnvironmentPalette_Sand, - }, +// Loads the initial battle terrain. +static void LoadBattleEnvironmentGfx(u16 terrain) +{ + if (terrain >= NELEMS(gBattleEnvironmentInfo)) + terrain = BATTLE_ENVIRONMENT_PLAIN; // If higher than the number of entries in gBattleEnvironmentInfo, use the default. + // Copy to bg3 + DecompressDataWithHeaderVram(gBattleEnvironmentInfo[terrain].background.tileset, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentInfo[terrain].background.tilemap, (void *)(BG_SCREEN_ADDR(26))); + LoadPalette(gBattleEnvironmentInfo[terrain].background.palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); +} - [BATTLE_ENVIRONMENT_UNDERWATER] = - { - .tileset = gBattleEnvironmentTiles_Underwater, - .tilemap = gBattleEnvironmentTilemap_Underwater, - .entryTileset = gBattleEnvironmentAnimTiles_Underwater, - .entryTilemap = gBattleEnvironmentAnimTilemap_Underwater, - .palette = gBattleEnvironmentPalette_Underwater, - }, +// Loads the entry associated with the battle terrain. +// This can be the grass moving on the screen at the start of a wild encounter in tall grass. +static void LoadBattleEnvironmentEntryGfx(u16 terrain) +{ + if (terrain >= NELEMS(gBattleEnvironmentInfo)) + terrain = BATTLE_ENVIRONMENT_PLAIN; + // Copy to bg1 + DecompressDataWithHeaderVram(gBattleEnvironmentInfo[terrain].background.entryTileset, (void *)BG_CHAR_ADDR(1)); + DecompressDataWithHeaderVram(gBattleEnvironmentInfo[terrain].background.entryTilemap, (void *)BG_SCREEN_ADDR(28)); +} - [BATTLE_ENVIRONMENT_WATER] = - { - .tileset = gBattleEnvironmentTiles_Water, - .tilemap = gBattleEnvironmentTilemap_Water, - .entryTileset = gBattleEnvironmentAnimTiles_Water, - .entryTilemap = gBattleEnvironmentAnimTilemap_Water, - .palette = gBattleEnvironmentPalette_Water, - }, +static u8 GetBattleEnvironmentOverride(void) +{ + u8 battleScene = GetCurrentMapBattleScene(); - [BATTLE_ENVIRONMENT_POND] = + if (TestRunner_Battle_GetForcedEnvironment() + && gBattleEnvironmentInfo[gBattleEnvironment].background.tilemap + && gBattleEnvironmentInfo[gBattleEnvironment].background.tileset) { - .tileset = gBattleEnvironmentTiles_PondWater, - .tilemap = gBattleEnvironmentTilemap_PondWater, - .entryTileset = gBattleEnvironmentAnimTiles_PondWater, - .entryTilemap = gBattleEnvironmentAnimTilemap_PondWater, - .palette = gBattleEnvironmentPalette_PondWater, - }, - - [BATTLE_ENVIRONMENT_MOUNTAIN] = + return gBattleEnvironment; + } + else if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER)) + return BATTLE_ENVIRONMENT_FRONTIER; + else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) { - .tileset = gBattleEnvironmentTiles_Rock, - .tilemap = gBattleEnvironmentTilemap_Rock, - .entryTileset = gBattleEnvironmentAnimTiles_Rock, - .entryTilemap = gBattleEnvironmentAnimTilemap_Rock, - .palette = gBattleEnvironmentPalette_Rock, - }, - - [BATTLE_ENVIRONMENT_CAVE] = + switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL)) + { + case SPECIES_GROUDON: + return BATTLE_ENVIRONMENT_GROUDON; + case SPECIES_KYOGRE: + return BATTLE_ENVIRONMENT_KYOGRE; + case SPECIES_RAYQUAZA: + return BATTLE_ENVIRONMENT_RAYQUAZA; + default: + return gBattleEnvironment; + } + } + else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - .tileset = gBattleEnvironmentTiles_Cave, - .tilemap = gBattleEnvironmentTilemap_Cave, - .entryTileset = gBattleEnvironmentAnimTiles_Cave, - .entryTilemap = gBattleEnvironmentAnimTilemap_Cave, - .palette = gBattleEnvironmentPalette_Cave, - }, + u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); + if (trainerClass == TRAINER_CLASS_LEADER) + return BATTLE_ENVIRONMENT_LEADER; + else if (trainerClass == TRAINER_CLASS_CHAMPION) + return BATTLE_ENVIRONMENT_CHAMPION; + } - [BATTLE_ENVIRONMENT_BUILDING] = - { - .tileset = gBattleEnvironmentTiles_Building, - .tilemap = gBattleEnvironmentTilemap_Building, - .entryTileset = gBattleEnvironmentAnimTiles_Building, - .entryTilemap = gBattleEnvironmentAnimTilemap_Building, - .palette = gBattleEnvironmentPalette_Building, - }, + if (battleScene == MAP_BATTLE_SCENE_NORMAL) + return gBattleEnvironment; - [BATTLE_ENVIRONMENT_PLAIN] = - { - .tileset = gBattleEnvironmentTiles_Building, - .tilemap = gBattleEnvironmentTilemap_Building, - .entryTileset = gBattleEnvironmentAnimTiles_Building, - .entryTilemap = gBattleEnvironmentAnimTilemap_Building, - .palette = gBattleEnvironmentPalette_Plain, - }, -}; + return GetBattleEnvironmentByMapScene(battleScene); +} void BattleInitBgsAndWindows(void) { @@ -752,114 +737,12 @@ void LoadBattleMenuWindowGfx(void) void DrawMainBattleBackground(void) { - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_RECORDED_LINK)) - { - LZDecompressVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_Frontier, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - } - else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) - { - switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL)) - { - case SPECIES_GROUDON: - LZDecompressVram(gBattleEnvironmentTiles_Cave, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Cave, (void*)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_Groudon, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case SPECIES_KYOGRE: - LZDecompressVram(gBattleEnvironmentTiles_Water, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Water, (void*)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_Kyogre, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case SPECIES_RAYQUAZA: - LZDecompressVram(gBattleEnvironmentTiles_Rayquaza, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Rayquaza, (void*)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_Rayquaza, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - default: - LZDecompressVram(sBattleEnvironmentTable[gBattleEnvironment].tileset, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(sBattleEnvironmentTable[gBattleEnvironment].tilemap, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(sBattleEnvironmentTable[gBattleEnvironment].palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - } - } - else - { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); - if (trainerClass == TRAINER_CLASS_LEADER) - { - LZDecompressVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_BuildingLeader, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - return; - } - else if (trainerClass == TRAINER_CLASS_CHAMPION) - { - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_StadiumWallace, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - return; - } - } - - switch (GetCurrentMapBattleScene()) - { - default: - case MAP_BATTLE_SCENE_NORMAL: - LZDecompressVram(sBattleEnvironmentTable[gBattleEnvironment].tileset, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(sBattleEnvironmentTable[gBattleEnvironment].tilemap, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(sBattleEnvironmentTable[gBattleEnvironment].palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_GYM: - LZDecompressVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_BuildingGym, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_MAGMA: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_StadiumMagma, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_AQUA: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_StadiumAqua, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_SIDNEY: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_StadiumSidney, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_PHOEBE: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_StadiumPhoebe, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_GLACIA: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_StadiumGlacia, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_DRAKE: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_StadiumDrake, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_FRONTIER: - LZDecompressVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_Frontier, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - } - } + LoadBattleEnvironmentGfx(GetBattleEnvironmentOverride()); } void LoadBattleTextboxAndBackground(void) { - LZDecompressVram(gBattleTextboxTiles, (void *)(BG_CHAR_ADDR(0))); + DecompressDataWithHeaderVram(gBattleTextboxTiles, (void *)(BG_CHAR_ADDR(0))); CopyToBgTilemapBuffer(0, gBattleTextboxTilemap, 0, 0); CopyBgTilemapBufferToVram(0); LoadPalette(gBattleTextboxPalette, BG_PLTT_ID(0), 2 * PLTT_SIZE_4BPP); @@ -1028,7 +911,7 @@ void InitLinkBattleVsScreen(u8 taskId) case 0: if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - for (i = 0; i < MAX_BATTLERS_COUNT; i++) + for (i = 0; i < MAX_LINK_PLAYERS; i++) { name = gLinkPlayers[i].name; linkPlayer = &gLinkPlayers[i]; @@ -1129,8 +1012,8 @@ void DrawBattleEntryBackground(void) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) { - LZDecompressVram(gBattleVSFrame_Gfx, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(gVsLettersGfx, (void *)OBJ_VRAM0); + DecompressDataWithHeaderVram(gBattleVSFrame_Gfx, (void *)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(gVsLettersGfx, (void *)OBJ_VRAM0); LoadPalette(gBattleVSFrame_Pal, BG_PLTT_ID(6), PLTT_SIZE_4BPP); SetBgAttribute(1, BG_ATTR_SCREENSIZE, 1); SetGpuReg(REG_OFFSET_BG1CNT, 0x5C04); @@ -1146,10 +1029,15 @@ void DrawBattleEntryBackground(void) } else if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER)) { - if (!(gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) || gPartnerTrainerId > TRAINER_PARTNER(PARTNER_NONE)) + if (TestRunner_Battle_GetForcedEnvironment() + && gBattleEnvironmentInfo[gBattleEnvironment].background.tilemap + && gBattleEnvironmentInfo[gBattleEnvironment].background.tileset) + { + LoadBattleEnvironmentEntryGfx(gBattleEnvironment); + } + else if (!(gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) || gPartnerTrainerId > TRAINER_PARTNER(PARTNER_NONE)) { - LZDecompressVram(gBattleEnvironmentAnimTiles_Building, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(gBattleEnvironmentAnimTilemap_Building, (void *)(BG_SCREEN_ADDR(28))); + LoadBattleEnvironmentEntryGfx(BATTLE_ENVIRONMENT_BUILDING); } else { @@ -1168,20 +1056,17 @@ void DrawBattleEntryBackground(void) switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL)) { case SPECIES_GROUDON: - LZDecompressVram(gBattleEnvironmentAnimTiles_Cave, (void*)(BG_CHAR_ADDR(1))); - LZDecompressVram(gBattleEnvironmentAnimTilemap_Cave, (void*)(BG_SCREEN_ADDR(28))); + LoadBattleEnvironmentEntryGfx(BATTLE_ENVIRONMENT_CAVE); break; case SPECIES_KYOGRE: - LZDecompressVram(gBattleEnvironmentAnimTiles_Underwater, (void*)(BG_CHAR_ADDR(1))); - LZDecompressVram(gBattleEnvironmentAnimTilemap_Underwater, (void*)(BG_SCREEN_ADDR(28))); + LoadBattleEnvironmentEntryGfx(BATTLE_ENVIRONMENT_UNDERWATER); break; case SPECIES_RAYQUAZA: - LZDecompressVram(gBattleEnvironmentAnimTiles_Rayquaza, (void*)(BG_CHAR_ADDR(1))); - LZDecompressVram(gBattleEnvironmentAnimTilemap_Rayquaza, (void*)(BG_SCREEN_ADDR(28))); + LoadBattleEnvironmentEntryGfx(BATTLE_ENVIRONMENT_RAYQUAZA); break; default: - LZDecompressVram(sBattleEnvironmentTable[gBattleEnvironment].entryTileset, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(sBattleEnvironmentTable[gBattleEnvironment].entryTilemap, (void *)(BG_SCREEN_ADDR(28))); + DecompressDataWithHeaderVram(gBattleEnvironmentInfo[gBattleEnvironment].background.entryTileset, (void *)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(gBattleEnvironmentInfo[gBattleEnvironment].background.entryTilemap, (void *)(BG_SCREEN_ADDR(28))); break; } } @@ -1189,30 +1074,26 @@ void DrawBattleEntryBackground(void) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); + enum TrainerClassID trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (trainerClass == TRAINER_CLASS_LEADER) { - LZDecompressVram(gBattleEnvironmentAnimTiles_Building, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(gBattleEnvironmentAnimTilemap_Building, (void *)(BG_SCREEN_ADDR(28))); + LoadBattleEnvironmentEntryGfx(BATTLE_ENVIRONMENT_BUILDING); return; } else if (trainerClass == TRAINER_CLASS_CHAMPION) { - LZDecompressVram(gBattleEnvironmentAnimTiles_Building, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(gBattleEnvironmentAnimTilemap_Building, (void *)(BG_SCREEN_ADDR(28))); + LoadBattleEnvironmentEntryGfx(BATTLE_ENVIRONMENT_BUILDING); return; } } if (GetCurrentMapBattleScene() == MAP_BATTLE_SCENE_NORMAL) { - LZDecompressVram(sBattleEnvironmentTable[gBattleEnvironment].entryTileset, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(sBattleEnvironmentTable[gBattleEnvironment].entryTilemap, (void *)(BG_SCREEN_ADDR(28))); + LoadBattleEnvironmentEntryGfx(gBattleEnvironment); } else { - LZDecompressVram(gBattleEnvironmentAnimTiles_Building, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(gBattleEnvironmentAnimTilemap_Building, (void *)(BG_SCREEN_ADDR(28))); + LoadBattleEnvironmentEntryGfx(gBattleEnvironment); } } } @@ -1224,7 +1105,7 @@ bool8 LoadChosenBattleElement(u8 caseId) switch (caseId) { case 0: - LZDecompressVram(gBattleTextboxTiles, (void *)(BG_CHAR_ADDR(0))); + DecompressDataWithHeaderVram(gBattleTextboxTiles, (void *)(BG_CHAR_ADDR(0))); break; case 1: CopyToBgTilemapBuffer(0, gBattleTextboxTilemap, 0, 0); @@ -1234,195 +1115,13 @@ bool8 LoadChosenBattleElement(u8 caseId) LoadPalette(gBattleTextboxPalette, BG_PLTT_ID(0), 2 * PLTT_SIZE_4BPP); break; case 3: - if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER)) - { - LZDecompressVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); - } - else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) - { - switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL)) - { - case SPECIES_GROUDON: - LZDecompressVram(gBattleEnvironmentTiles_Cave, (void*)(BG_CHAR_ADDR(2))); - break; - case SPECIES_KYOGRE: - LZDecompressVram(gBattleEnvironmentTilemap_Water, (void*)(BG_SCREEN_ADDR(2))); - break; - } - } - else - { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); - if (trainerClass == TRAINER_CLASS_LEADER) - { - LZDecompressVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); - break; - } - else if (trainerClass == TRAINER_CLASS_CHAMPION) - { - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - break; - } - } - - switch (GetCurrentMapBattleScene()) - { - default: - case MAP_BATTLE_SCENE_NORMAL: - LZDecompressVram(sBattleEnvironmentTable[gBattleEnvironment].tileset, (void *)(BG_CHAR_ADDR(2))); - break; - case MAP_BATTLE_SCENE_GYM: - LZDecompressVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); - break; - case MAP_BATTLE_SCENE_MAGMA: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - break; - case MAP_BATTLE_SCENE_AQUA: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - break; - case MAP_BATTLE_SCENE_SIDNEY: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - break; - case MAP_BATTLE_SCENE_PHOEBE: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - break; - case MAP_BATTLE_SCENE_GLACIA: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - break; - case MAP_BATTLE_SCENE_DRAKE: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - break; - case MAP_BATTLE_SCENE_FRONTIER: - LZDecompressVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); - break; - } - } + DecompressDataWithHeaderVram(gBattleEnvironmentInfo[GetBattleEnvironmentOverride()].background.tileset, (void *)(BG_CHAR_ADDR(2))); break; case 4: - if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER)) - { - LZDecompressVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); - } - else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) - { - if (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL) == SPECIES_GROUDON) - LZDecompressVram(gBattleEnvironmentTilemap_Cave, (void*)(BG_SCREEN_ADDR(26))); - else - LZDecompressVram(gBattleEnvironmentTilemap_Water, (void *)(BG_SCREEN_ADDR(26))); - } - else - { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); - if (trainerClass == TRAINER_CLASS_LEADER) - { - LZDecompressVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); - break; - } - else if (trainerClass == TRAINER_CLASS_CHAMPION) - { - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - break; - } - } - - switch (GetCurrentMapBattleScene()) - { - default: - case MAP_BATTLE_SCENE_NORMAL: - LZDecompressVram(sBattleEnvironmentTable[gBattleEnvironment].tilemap, (void *)(BG_SCREEN_ADDR(26))); - break; - case MAP_BATTLE_SCENE_GYM: - LZDecompressVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); - break; - case MAP_BATTLE_SCENE_MAGMA: - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - break; - case MAP_BATTLE_SCENE_AQUA: - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - break; - case MAP_BATTLE_SCENE_SIDNEY: - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - break; - case MAP_BATTLE_SCENE_PHOEBE: - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - break; - case MAP_BATTLE_SCENE_GLACIA: - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - break; - case MAP_BATTLE_SCENE_DRAKE: - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - break; - case MAP_BATTLE_SCENE_FRONTIER: - LZDecompressVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); - break; - } - } + DecompressDataWithHeaderVram(gBattleEnvironmentInfo[GetBattleEnvironmentOverride()].background.tilemap, (void *)(BG_SCREEN_ADDR(26))); break; case 5: - if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER)) - { - LoadPalette(gBattleEnvironmentPalette_Frontier, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - } - else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) - { - if (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL) == SPECIES_GROUDON) - LoadPalette(gBattleEnvironmentPalette_Groudon, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - else - LoadPalette(gBattleEnvironmentPalette_Kyogre, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - } - else - { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); - if (trainerClass == TRAINER_CLASS_LEADER) - { - LoadPalette(gBattleEnvironmentPalette_BuildingLeader, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - } - else if (trainerClass == TRAINER_CLASS_CHAMPION) - { - LoadPalette(gBattleEnvironmentPalette_StadiumWallace, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - } - } - - switch (GetCurrentMapBattleScene()) - { - default: - case MAP_BATTLE_SCENE_NORMAL: - LoadPalette(sBattleEnvironmentTable[gBattleEnvironment].palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_GYM: - LoadPalette(gBattleEnvironmentPalette_BuildingGym, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_MAGMA: - LoadPalette(gBattleEnvironmentPalette_StadiumMagma, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_AQUA: - LoadPalette(gBattleEnvironmentPalette_StadiumAqua, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_SIDNEY: - LoadPalette(gBattleEnvironmentPalette_StadiumSidney, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_PHOEBE: - LoadPalette(gBattleEnvironmentPalette_StadiumPhoebe, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_GLACIA: - LoadPalette(gBattleEnvironmentPalette_StadiumGlacia, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_DRAKE: - LoadPalette(gBattleEnvironmentPalette_StadiumDrake, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_FRONTIER: - LoadPalette(gBattleEnvironmentPalette_Frontier, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - } - } + LoadPalette(gBattleEnvironmentInfo[GetBattleEnvironmentOverride()].background.palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); break; case 6: LoadBattleMenuWindowGfx(); diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index a039a5b52219..341829353017 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -30,23 +30,15 @@ #include "recorded_battle.h" #include "random.h" -static void LinkOpponentHandleLoadMonSprite(u32 battler); -static void LinkOpponentHandleSwitchInAnim(u32 battler); static void LinkOpponentHandleDrawTrainerPic(u32 battler); static void LinkOpponentHandleTrainerSlide(u32 battler); static void LinkOpponentHandleTrainerSlideBack(u32 battler); -static void LinkOpponentHandleMoveAnimation(u32 battler); -static void LinkOpponentHandlePrintString(u32 battler); -static void LinkOpponentHandleHealthBarUpdate(u32 battler); static void LinkOpponentHandleIntroTrainerBallThrow(u32 battler); static void LinkOpponentHandleDrawPartyStatusSummary(u32 battler); -static void LinkOpponentHandleBattleAnimation(u32 battler); static void LinkOpponentHandleLinkStandbyMsg(u32 battler); static void LinkOpponentHandleEndLinkBattle(u32 battler); static void LinkOpponentBufferRunCommand(u32 battler); -static void LinkOpponentBufferExecCompleted(u32 battler); -static void SwitchIn_HandleSoundAndEnd(u32 battler); static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = { @@ -54,8 +46,8 @@ static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 batt [CONTROLLER_GETRAWMONDATA] = BtlController_Empty, [CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData, [CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData, - [CONTROLLER_LOADMONSPRITE] = LinkOpponentHandleLoadMonSprite, - [CONTROLLER_SWITCHINANIM] = LinkOpponentHandleSwitchInAnim, + [CONTROLLER_LOADMONSPRITE] = BtlController_HandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = LinkOpponentHandleDrawTrainerPic, [CONTROLLER_TRAINERSLIDE] = LinkOpponentHandleTrainerSlide, @@ -65,8 +57,8 @@ static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 batt [CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty, [CONTROLLER_BALLTHROWANIM] = BtlController_Empty, [CONTROLLER_PAUSE] = BtlController_Empty, - [CONTROLLER_MOVEANIMATION] = LinkOpponentHandleMoveAnimation, - [CONTROLLER_PRINTSTRING] = LinkOpponentHandlePrintString, + [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, [CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_Empty, [CONTROLLER_CHOOSEACTION] = BtlController_Empty, [CONTROLLER_YESNOBOX] = BtlController_Empty, @@ -74,7 +66,7 @@ static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 batt [CONTROLLER_OPENBAG] = BtlController_Empty, [CONTROLLER_CHOOSEPOKEMON] = BtlController_Empty, [CONTROLLER_23] = BtlController_Empty, - [CONTROLLER_HEALTHBARUPDATE] = LinkOpponentHandleHealthBarUpdate, + [CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = BtlController_Empty, [CONTROLLER_STATUSICONUPDATE] = BtlController_HandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = BtlController_HandleStatusAnimation, @@ -98,7 +90,7 @@ static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 batt [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary, [CONTROLLER_ENDBOUNCE] = BtlController_Empty, [CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility, - [CONTROLLER_BATTLEANIMATION] = LinkOpponentHandleBattleAnimation, + [CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = LinkOpponentHandleLinkStandbyMsg, [CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty, [CONTROLLER_ENDLINKBATTLE] = LinkOpponentHandleEndLinkBattle, @@ -119,16 +111,7 @@ static void LinkOpponentBufferRunCommand(u32 battler) if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sLinkOpponentBufferCommands)) sLinkOpponentBufferCommands[gBattleResources->bufferA[battler][0]](battler); else - LinkOpponentBufferExecCompleted(battler); - } -} - -static void Intro_DelayAndEnd(u32 battler) -{ - if (--gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay == (u8)-1) - { - gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0; - LinkOpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -167,8 +150,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + FreeShinyStars(); } else { @@ -180,13 +162,12 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) if (GetBattlerPosition(battler) == B_POSITION_OPPONENT_RIGHT) { - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + FreeShinyStars(); } } gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3; - gBattlerControllerFuncs[battler] = Intro_DelayAndEnd; + gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd; } } @@ -267,7 +248,7 @@ static void Intro_TryShinyAnimShowHealthbox(u32 battler) DestroySprite(&gSprites[gBattleControllerData[battler]]); - SetBattlerShadowSpriteCallback(battler, GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES)); + SetBattlerShadowSpriteCallback(battler, GetBattlerVisualSpecies(battler)); gBattleSpritesDataPtr->animationData->introAnimActive = FALSE; gBattleSpritesDataPtr->healthBoxesData[battler].bgmRestored = FALSE; @@ -278,37 +259,7 @@ static void Intro_TryShinyAnimShowHealthbox(u32 battler) } } -static void TryShinyAnimAfterMonAnim(u32 battler) -{ - if (TryShinyAnimAfterMonAnimUtil(battler)) - LinkOpponentBufferExecCompleted(battler); -} - -static void SwitchIn_ShowSubstitute(u32 battler) -{ - if (SwitchIn_ShowSubstituteUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_HandleSoundAndEnd; -} - -static void SwitchIn_HandleSoundAndEnd(u32 battler) -{ - if (SwitchIn_HandleSoundAndEndUtil(battler)) - LinkOpponentBufferExecCompleted(battler); -} - -static void SwitchIn_ShowHealthbox(u32 battler) -{ - if (SwitchIn_ShowHealthboxUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute; -} - -static void SwitchIn_TryShinyAnim(u32 battler) -{ - if (SwitchIn_TryShinyAnimUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox; -} - -static void LinkOpponentBufferExecCompleted(u32 battler) +void LinkOpponentBufferExecCompleted(u32 battler) { gBattlerControllerFuncs[battler] = LinkOpponentBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) @@ -324,16 +275,6 @@ static void LinkOpponentBufferExecCompleted(u32 battler) } } -static void LinkOpponentHandleLoadMonSprite(u32 battler) -{ - BtlController_HandleLoadMonSprite(battler, TryShinyAnimAfterMonAnim); -} - -static void LinkOpponentHandleSwitchInAnim(u32 battler) -{ - BtlController_HandleSwitchInAnim(battler, FALSE, SwitchIn_TryShinyAnim); -} - static void LinkOpponentHandleDrawTrainerPic(u32 battler) { s16 xPos; @@ -419,7 +360,7 @@ static void LinkOpponentHandleTrainerSlide(u32 battler) trainerPicId = GetFrontierTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentB); BtlController_HandleTrainerSlide(battler, trainerPicId); - LinkOpponentBufferExecCompleted(battler); // Possibly a bug, because execution should be completed after the slide in finishes. See Controller_WaitForTrainerPic. + BtlController_Complete(battler); // Possibly a bug, because execution should be completed after the slide in finishes. See Controller_WaitForTrainerPic. } static void LinkOpponentHandleTrainerSlideBack(u32 battler) @@ -427,21 +368,6 @@ static void LinkOpponentHandleTrainerSlideBack(u32 battler) BtlController_HandleTrainerSlideBack(battler, 35, FALSE); } -static void LinkOpponentHandleMoveAnimation(u32 battler) -{ - BtlController_HandleMoveAnimation(battler, TRUE); -} - -static void LinkOpponentHandlePrintString(u32 battler) -{ - BtlController_HandlePrintString(battler, TRUE, FALSE); -} - -static void LinkOpponentHandleHealthBarUpdate(u32 battler) -{ - BtlController_HandleHealthBarUpdate(battler, FALSE); -} - static void LinkOpponentHandleIntroTrainerBallThrow(u32 battler) { BtlController_HandleIntroTrainerBallThrow(battler, 0, NULL, 0, Intro_TryShinyAnimShowHealthbox); @@ -452,15 +378,10 @@ static void LinkOpponentHandleDrawPartyStatusSummary(u32 battler) BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_OPPONENT, TRUE); } -static void LinkOpponentHandleBattleAnimation(u32 battler) -{ - BtlController_HandleBattleAnimation(battler, FALSE, TRUE); -} - static void LinkOpponentHandleLinkStandbyMsg(u32 battler) { RecordedBattle_RecordAllBattlerData(&gBattleResources->bufferA[battler][2]); - LinkOpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } static void LinkOpponentHandleEndLinkBattle(u32 battler) @@ -475,6 +396,6 @@ static void LinkOpponentHandleEndLinkBattle(u32 battler) gSaveBlock2Ptr->frontier.disableRecordBattle = gBattleResources->bufferA[battler][2]; FadeOutMapMusic(5); BeginFastPaletteFade(3); - LinkOpponentBufferExecCompleted(battler); + BtlController_Complete(battler); gBattlerControllerFuncs[battler] = SetBattleEndCallbacks; } diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index 9b27309bf6f2..408cc629e1b2 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -30,22 +30,14 @@ #include "recorded_battle.h" #include "random.h" -static void LinkPartnerHandleLoadMonSprite(u32 battler); -static void LinkPartnerHandleSwitchInAnim(u32 battler); static void LinkPartnerHandleDrawTrainerPic(u32 battler); static void LinkPartnerHandleTrainerSlideBack(u32 battler); -static void LinkPartnerHandleMoveAnimation(u32 battler); -static void LinkPartnerHandlePrintString(u32 battler); -static void LinkPartnerHandleHealthBarUpdate(u32 battler); static void LinkPartnerHandleIntroTrainerBallThrow(u32 battler); static void LinkPartnerHandleDrawPartyStatusSummary(u32 battler); -static void LinkPartnerHandleBattleAnimation(u32 battler); static void LinkPartnerHandleLinkStandbyMsg(u32 battler); static void LinkPartnerHandleEndLinkBattle(u32 battler); static void LinkPartnerBufferRunCommand(u32 battler); -static void LinkPartnerBufferExecCompleted(u32 battler); -static void SwitchIn_WaitAndEnd(u32 battler); static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = { @@ -53,8 +45,8 @@ static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battl [CONTROLLER_GETRAWMONDATA] = BtlController_Empty, [CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData, [CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData, - [CONTROLLER_LOADMONSPRITE] = LinkPartnerHandleLoadMonSprite, - [CONTROLLER_SWITCHINANIM] = LinkPartnerHandleSwitchInAnim, + [CONTROLLER_LOADMONSPRITE] = BtlController_HandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = LinkPartnerHandleDrawTrainerPic, [CONTROLLER_TRAINERSLIDE] = BtlController_Empty, @@ -64,8 +56,8 @@ static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battl [CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty, [CONTROLLER_BALLTHROWANIM] = BtlController_Empty, [CONTROLLER_PAUSE] = BtlController_Empty, - [CONTROLLER_MOVEANIMATION] = LinkPartnerHandleMoveAnimation, - [CONTROLLER_PRINTSTRING] = LinkPartnerHandlePrintString, + [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, [CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_Empty, [CONTROLLER_CHOOSEACTION] = BtlController_Empty, [CONTROLLER_YESNOBOX] = BtlController_Empty, @@ -73,7 +65,7 @@ static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battl [CONTROLLER_OPENBAG] = BtlController_Empty, [CONTROLLER_CHOOSEPOKEMON] = BtlController_Empty, [CONTROLLER_23] = BtlController_Empty, - [CONTROLLER_HEALTHBARUPDATE] = LinkPartnerHandleHealthBarUpdate, + [CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = BtlController_Empty, [CONTROLLER_STATUSICONUPDATE] = BtlController_HandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = BtlController_HandleStatusAnimation, @@ -97,7 +89,7 @@ static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battl [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary, [CONTROLLER_ENDBOUNCE] = BtlController_Empty, [CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility, - [CONTROLLER_BATTLEANIMATION] = LinkPartnerHandleBattleAnimation, + [CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = LinkPartnerHandleLinkStandbyMsg, [CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty, [CONTROLLER_ENDLINKBATTLE] = LinkPartnerHandleEndLinkBattle, @@ -118,41 +110,11 @@ static void LinkPartnerBufferRunCommand(u32 battler) if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sLinkPartnerBufferCommands)) sLinkPartnerBufferCommands[gBattleResources->bufferA[battler][0]](battler); else - LinkPartnerBufferExecCompleted(battler); + BtlController_Complete(battler); } } -static void WaitForMonAnimAfterLoad(u32 battler) -{ - if (gSprites[gBattlerSpriteIds[battler]].animEnded && gSprites[gBattlerSpriteIds[battler]].x2 == 0) - LinkPartnerBufferExecCompleted(battler); -} - -static void SwitchIn_ShowSubstitute(u32 battler) -{ - if (SwitchIn_ShowSubstituteUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_WaitAndEnd; -} - -static void SwitchIn_WaitAndEnd(u32 battler) -{ - if (SwitchIn_WaitAndEndUtil(battler)) - LinkPartnerBufferExecCompleted(battler); -} - -static void SwitchIn_ShowHealthbox(u32 battler) -{ - if (SwitchIn_ShowHealthboxUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute; -} - -static void SwitchIn_TryShinyAnim(u32 battler) -{ - if (SwitchIn_TryShinyAnimUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox; -} - -static void LinkPartnerBufferExecCompleted(u32 battler) +void LinkPartnerBufferExecCompleted(u32 battler) { gBattlerControllerFuncs[battler] = LinkPartnerBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) @@ -168,16 +130,6 @@ static void LinkPartnerBufferExecCompleted(u32 battler) } } -static void LinkPartnerHandleLoadMonSprite(u32 battler) -{ - BtlController_HandleLoadMonSprite(battler, WaitForMonAnimAfterLoad); -} - -static void LinkPartnerHandleSwitchInAnim(u32 battler) -{ - BtlController_HandleSwitchInAnim(battler, TRUE, SwitchIn_TryShinyAnim); -} - static void LinkPartnerHandleDrawTrainerPic(u32 battler) { s16 xPos; @@ -206,21 +158,6 @@ static void LinkPartnerHandleTrainerSlideBack(u32 battler) BtlController_HandleTrainerSlideBack(battler, 35, FALSE); } -static void LinkPartnerHandleMoveAnimation(u32 battler) -{ - BtlController_HandleMoveAnimation(battler, TRUE); -} - -static void LinkPartnerHandlePrintString(u32 battler) -{ - BtlController_HandlePrintString(battler, TRUE, FALSE); -} - -static void LinkPartnerHandleHealthBarUpdate(u32 battler) -{ - BtlController_HandleHealthBarUpdate(battler, FALSE); -} - static void LinkPartnerHandleIntroTrainerBallThrow(u32 battler) { u32 trainerPicId = LinkPlayerGetTrainerPicId(GetBattlerMultiplayerId(battler)); @@ -234,15 +171,10 @@ static void LinkPartnerHandleDrawPartyStatusSummary(u32 battler) BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_PLAYER, TRUE); } -static void LinkPartnerHandleBattleAnimation(u32 battler) -{ - BtlController_HandleBattleAnimation(battler, FALSE, TRUE); -} - static void LinkPartnerHandleLinkStandbyMsg(u32 battler) { RecordedBattle_RecordAllBattlerData(&gBattleResources->bufferA[battler][2]); - LinkPartnerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void LinkPartnerHandleEndLinkBattle(u32 battler) @@ -252,6 +184,6 @@ static void LinkPartnerHandleEndLinkBattle(u32 battler) gSaveBlock2Ptr->frontier.disableRecordBattle = gBattleResources->bufferA[battler][2]; FadeOutMapMusic(5); BeginFastPaletteFade(3); - LinkPartnerBufferExecCompleted(battler); + BtlController_Complete(battler); gBattlerControllerFuncs[battler] = SetBattleEndCallbacks; } diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index f6fae5ae576c..a2d40bc5e1a0 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -39,27 +39,19 @@ #include "constants/trainers.h" #include "trainer_hill.h" #include "test_runner.h" +#include "test/battle.h" +#include "test/test_runner_battle.h" -static void OpponentHandleLoadMonSprite(u32 battler); -static void OpponentHandleSwitchInAnim(u32 battler); static void OpponentHandleDrawTrainerPic(u32 battler); static void OpponentHandleTrainerSlideBack(u32 battler); -static void OpponentHandleMoveAnimation(u32 battler); -static void OpponentHandlePrintString(u32 battler); static void OpponentHandleChooseAction(u32 battler); static void OpponentHandleChooseMove(u32 battler); static void OpponentHandleChooseItem(u32 battler); static void OpponentHandleChoosePokemon(u32 battler); -static void OpponentHandleHealthBarUpdate(u32 battler); static void OpponentHandleIntroTrainerBallThrow(u32 battler); static void OpponentHandleDrawPartyStatusSummary(u32 battler); -static void OpponentHandleBattleAnimation(u32 battler); static void OpponentHandleEndLinkBattle(u32 battler); -static u8 CountAIAliveNonEggMonsExcept(u8 slotToIgnore); - static void OpponentBufferRunCommand(u32 battler); -static void OpponentBufferExecCompleted(u32 battler); -static void SwitchIn_HandleSoundAndEnd(u32 battler); static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = { @@ -67,8 +59,8 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) [CONTROLLER_GETRAWMONDATA] = BtlController_HandleGetRawMonData, [CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData, [CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData, - [CONTROLLER_LOADMONSPRITE] = OpponentHandleLoadMonSprite, - [CONTROLLER_SWITCHINANIM] = OpponentHandleSwitchInAnim, + [CONTROLLER_LOADMONSPRITE] = BtlController_HandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = OpponentHandleDrawTrainerPic, [CONTROLLER_TRAINERSLIDE] = OpponentHandleTrainerSlide, @@ -78,8 +70,8 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) [CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty, [CONTROLLER_BALLTHROWANIM] = BtlController_Empty, [CONTROLLER_PAUSE] = BtlController_Empty, - [CONTROLLER_MOVEANIMATION] = OpponentHandleMoveAnimation, - [CONTROLLER_PRINTSTRING] = OpponentHandlePrintString, + [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, [CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_Empty, [CONTROLLER_CHOOSEACTION] = OpponentHandleChooseAction, [CONTROLLER_YESNOBOX] = BtlController_Empty, @@ -87,7 +79,7 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) [CONTROLLER_OPENBAG] = OpponentHandleChooseItem, [CONTROLLER_CHOOSEPOKEMON] = OpponentHandleChoosePokemon, [CONTROLLER_23] = BtlController_Empty, - [CONTROLLER_HEALTHBARUPDATE] = OpponentHandleHealthBarUpdate, + [CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = BtlController_Empty, [CONTROLLER_STATUSICONUPDATE] = BtlController_HandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = BtlController_HandleStatusAnimation, @@ -111,7 +103,7 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary, [CONTROLLER_ENDBOUNCE] = BtlController_Empty, [CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility, - [CONTROLLER_BATTLEANIMATION] = OpponentHandleBattleAnimation, + [CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = BtlController_Empty, [CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty, [CONTROLLER_ENDLINKBATTLE] = OpponentHandleEndLinkBattle, @@ -132,16 +124,7 @@ static void OpponentBufferRunCommand(u32 battler) if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sOpponentBufferCommands)) sOpponentBufferCommands[gBattleResources->bufferA[battler][0]](battler); else - OpponentBufferExecCompleted(battler); - } -} - -static void Intro_DelayAndEnd(u32 battler) -{ - if (--gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay == (u8)-1) - { - gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0; - OpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -176,8 +159,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + FreeShinyStars(); } else { @@ -191,8 +173,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) if (!gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].finishedShinyMonAnim) { - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + FreeShinyStars(); } else { @@ -208,7 +189,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) } gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3; - gBattlerControllerFuncs[battler] = Intro_DelayAndEnd; + gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd; } } @@ -310,49 +291,7 @@ static void Intro_TryShinyAnimShowHealthbox(u32 battler) } } -static void TryShinyAnimAfterMonAnim(u32 battler) -{ - if (gSprites[gBattlerSpriteIds[battler]].x2 == 0 - && !gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim - && !gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim) - TryShinyAnimation(battler, GetBattlerMon(battler)); - - if (gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy - && gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim) - { - gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); - OpponentBufferExecCompleted(battler); - } -} - -static void SwitchIn_ShowSubstitute(u32 battler) -{ - if (SwitchIn_ShowSubstituteUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_HandleSoundAndEnd; -} - -static void SwitchIn_HandleSoundAndEnd(u32 battler) -{ - if (SwitchIn_HandleSoundAndEndUtil(battler)) - OpponentBufferExecCompleted(battler); -} - -static void SwitchIn_ShowHealthbox(u32 battler) -{ - if (SwitchIn_ShowHealthboxUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute; -} - -static void SwitchIn_TryShinyAnim(u32 battler) -{ - if (SwitchIn_TryShinyAnimUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox; -} - -static void OpponentBufferExecCompleted(u32 battler) +void OpponentBufferExecCompleted(u32 battler) { gBattlerControllerFuncs[battler] = OpponentBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) @@ -368,17 +307,6 @@ static void OpponentBufferExecCompleted(u32 battler) } } -static void OpponentHandleLoadMonSprite(u32 battler) -{ - BtlController_HandleLoadMonSprite(battler, TryShinyAnimAfterMonAnim); -} - -static void OpponentHandleSwitchInAnim(u32 battler) -{ - gBattleStruct->monToSwitchIntoId[battler] = PARTY_SIZE; - BtlController_HandleSwitchInAnim(battler, FALSE, SwitchIn_TryShinyAnim); -} - static u32 OpponentGetTrainerPicId(u32 battlerId) { u32 trainerPicId; @@ -441,18 +369,40 @@ static u32 OpponentGetTrainerPicId(u32 battlerId) static void OpponentHandleDrawTrainerPic(u32 battler) { s16 xPos; - u32 trainerPicId = OpponentGetTrainerPicId(battler); - - if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS) && !BATTLE_TWO_VS_ONE_OPPONENT) + u32 trainerPicId; + + // Sets Multibattle test opponent sprites to not be Hiker + if (IsMultibattleTest()) { - if ((GetBattlerPosition(battler) & BIT_FLANK) != 0) // second mon + if (GetBattlerPosition(battler) == B_POSITION_OPPONENT_LEFT) + { + trainerPicId = TRAINER_PIC_LEAF; + if (!(gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)) + xPos = 176; + else + xPos = 200; + } + else + { + trainerPicId = TRAINER_PIC_RED; xPos = 152; - else // first mon - xPos = 200; + } } else { - xPos = 176; + trainerPicId = OpponentGetTrainerPicId(battler); + + if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS) && !BATTLE_TWO_VS_ONE_OPPONENT) + { + if ((GetBattlerPosition(battler) & BIT_FLANK) != 0) // second mon + xPos = 152; + else // first mon + xPos = 200; + } + else + { + xPos = 176; + } } BtlController_HandleDrawTrainerPic(battler, trainerPicId, TRUE, xPos, 40, -1); @@ -469,20 +419,10 @@ static void OpponentHandleTrainerSlideBack(u32 battler) BtlController_HandleTrainerSlideBack(battler, 35, FALSE); } -static void OpponentHandleMoveAnimation(u32 battler) -{ - BtlController_HandleMoveAnimation(battler, FALSE); -} - -static void OpponentHandlePrintString(u32 battler) -{ - BtlController_HandlePrintString(battler, FALSE, TRUE); -} - static void OpponentHandleChooseAction(u32 battler) { AI_TrySwitchOrUseItem(battler); - OpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } static void OpponentHandleChooseMove(u32 battler) @@ -495,7 +435,7 @@ static void OpponentHandleChooseMove(u32 battler) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace(battler)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, ChooseMoveAndTargetInBattlePalace(battler)); } else if (gAiBattleData->actionFlee) { @@ -522,18 +462,19 @@ static void OpponentHandleChooseMove(u32 battler) gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); } // If opponent can and should use a gimmick (considering trainer data), do it - if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE - && !(gBattleStruct->gimmick.usableGimmick[battler] == GIMMICK_Z_MOVE - && !ShouldUseZMove(battler, gBattlerTarget, moveInfo->moves[chosenMoveIndex]))) + enum Gimmick usableGimmick = gBattleStruct->gimmick.usableGimmick[battler]; + if (usableGimmick != GIMMICK_NONE && IsAIUsingGimmick(battler) && !HasTrainerUsedGimmick(battler, usableGimmick)) { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, (chosenMoveIndex) | (RET_GIMMICK) | (gBattlerTarget << 8)); + gBattleStruct->gimmick.toActivate |= 1u << battler; + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (RET_GIMMICK) | (gBattlerTarget << 8)); } else { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, (chosenMoveIndex) | (gBattlerTarget << 8)); + SetAIUsingGimmick(battler, NO_GIMMICK); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (gBattlerTarget << 8)); } } - OpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } else // Wild pokemon - use random move { @@ -547,7 +488,7 @@ static void OpponentHandleChooseMove(u32 battler) if (GetBattlerMoveTargetType(battler, move) & MOVE_TARGET_USER) { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, (chosenMoveIndex) | (battler << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (battler << 8)); } else if (IsDoubleBattle()) { @@ -555,85 +496,61 @@ static void OpponentHandleChooseMove(u32 battler) target = GetBattlerAtPosition(Random() & 2); } while (!CanTargetBattler(battler, target, move)); - // Don't bother to loop through table if the move can't attack ally + // Don't bother to check if they're enemies if the move can't attack ally if (B_WILD_NATURAL_ENEMIES == TRUE && !(GetBattlerMoveTargetType(battler, move) & MOVE_TARGET_BOTH)) { - u16 i, speciesAttacker, speciesTarget, isPartnerEnemy = FALSE; - static const u16 naturalEnemies[][2] = - { - // Attacker Target - {SPECIES_ZANGOOSE, SPECIES_SEVIPER}, - {SPECIES_SEVIPER, SPECIES_ZANGOOSE}, - {SPECIES_HEATMOR, SPECIES_DURANT}, - {SPECIES_DURANT, SPECIES_HEATMOR}, - {SPECIES_SABLEYE, SPECIES_CARBINK}, - {SPECIES_MAREANIE, SPECIES_CORSOLA}, - }; + u32 speciesAttacker, speciesTarget; speciesAttacker = gBattleMons[battler].species; speciesTarget = gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(battler))].species; - for (i = 0; i < ARRAY_COUNT(naturalEnemies); i++) - { - if (speciesAttacker == naturalEnemies[i][0] && speciesTarget == naturalEnemies[i][1]) - { - isPartnerEnemy = TRUE; - break; - } - } + bool32 isPartnerEnemy = IsNaturalEnemy(speciesAttacker, speciesTarget); + if (isPartnerEnemy && CanTargetBattler(battler, target, move)) - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, (chosenMoveIndex) | (GetBattlerAtPosition(BATTLE_PARTNER(battler)) << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (GetBattlerAtPosition(BATTLE_PARTNER(battler)) << 8)); else - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, (chosenMoveIndex) | (target << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (target << 8)); } else { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, (chosenMoveIndex) | (target << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (target << 8)); } } else - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, (chosenMoveIndex) | (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) << 8)); - OpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } } static void OpponentHandleChooseItem(u32 battler) { BtlController_EmitOneReturnValue(battler, B_COMM_TO_ENGINE, gBattleStruct->chosenItem[battler]); - OpponentBufferExecCompleted(battler); -} - -static inline bool32 IsAcePokemon(u32 chosenMonId, u32 pokemonInBattle, u32 battler) -{ - return gAiThinkingStruct->aiFlags[battler] & AI_FLAG_ACE_POKEMON - && (chosenMonId == CalculateEnemyPartyCountInSide(battler) - 1) - && CountAIAliveNonEggMonsExcept(PARTY_SIZE) != pokemonInBattle; -} - -static inline bool32 IsDoubleAcePokemon(u32 chosenMonId, u32 pokemonInBattle, u32 battler) -{ - return gAiThinkingStruct->aiFlags[battler] & AI_FLAG_DOUBLE_ACE_POKEMON - && (chosenMonId == CalculateEnemyPartyCountInSide(battler) - 1) - && (chosenMonId == CalculateEnemyPartyCountInSide(battler) - 2) - && CountAIAliveNonEggMonsExcept(PARTY_SIZE) != pokemonInBattle - && CountAIAliveNonEggMonsExcept(PARTY_SIZE-1) != pokemonInBattle; + BtlController_Complete(battler); } static void OpponentHandleChoosePokemon(u32 battler) { s32 chosenMonId; - s32 pokemonInBattle = 1; + enum SwitchType switchType = SWITCH_AFTER_KO; // Choosing Revival Blessing target - if ((gBattleResources->bufferA[battler][1] & 0xF) == PARTY_ACTION_CHOOSE_FAINTED_MON) + if (gBattleResources->bufferA[battler][1] == PARTY_ACTION_CHOOSE_FAINTED_MON) { chosenMonId = gSelectedMonPartyId = GetFirstFaintedPartyIndex(battler); } // Switching out else if (gBattleStruct->AI_monToSwitchIntoId[battler] == PARTY_SIZE) { - chosenMonId = GetMostSuitableMonToSwitchInto(battler, SWITCH_AFTER_KO); - if (chosenMonId == PARTY_SIZE) + if (IsSwitchOutEffect(GetMoveEffect(gCurrentMove)) || gAiLogicData->ejectButtonSwitch || gAiLogicData->ejectPackSwitch) + switchType = SWITCH_MID_BATTLE_FORCED; + + // reset the AI data to consider the correct on-field state at time of switch + SetBattlerAiData(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT), gAiLogicData); + if (IsDoubleBattle()) + SetBattlerAiData(GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT), gAiLogicData); + + chosenMonId = GetMostSuitableMonToSwitchInto(battler, switchType); + if (chosenMonId == PARTY_SIZE) // Advanced logic failed so we pick the next available battler { s32 battler1, battler2, firstId, lastId; @@ -645,19 +562,14 @@ static void OpponentHandleChoosePokemon(u32 battler) { battler1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); battler2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); - pokemonInBattle = 2; } GetAIPartyIndexes(battler, &firstId, &lastId); - for (chosenMonId = (lastId-1); chosenMonId >= firstId; chosenMonId--) + for (chosenMonId = firstId; chosenMonId < lastId; chosenMonId++) { - if (!IsValidForBattle(&gEnemyParty[chosenMonId]) - || chosenMonId == gBattlerPartyIndexes[battler1] - || chosenMonId == gBattlerPartyIndexes[battler2]) - continue; - - if (!IsAcePokemon(chosenMonId, pokemonInBattle, battler) - && !IsDoubleAcePokemon(chosenMonId, pokemonInBattle, battler)) + if (IsValidForBattle(&gEnemyParty[chosenMonId]) + && chosenMonId != gBattlerPartyIndexes[battler1] + && chosenMonId != gBattlerPartyIndexes[battler2]) break; } } @@ -673,28 +585,7 @@ static void OpponentHandleChoosePokemon(u32 battler) TestRunner_Battle_CheckSwitch(battler, chosenMonId); #endif // TESTING BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, chosenMonId, NULL); - OpponentBufferExecCompleted(battler); -} - -static u8 CountAIAliveNonEggMonsExcept(u8 slotToIgnore) -{ - u16 i, count; - - for (i = 0, count = 0; i < PARTY_SIZE; i++) - { - if (i != slotToIgnore - && IsValidForBattle(&gEnemyParty[i])) - { - count++; - } - } - - return count; -} - -static void OpponentHandleHealthBarUpdate(u32 battler) -{ - BtlController_HandleHealthBarUpdate(battler, FALSE); + BtlController_Complete(battler); } static void OpponentHandleIntroTrainerBallThrow(u32 battler) @@ -707,11 +598,6 @@ static void OpponentHandleDrawPartyStatusSummary(u32 battler) BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_OPPONENT, TRUE); } -static void OpponentHandleBattleAnimation(u32 battler) -{ - BtlController_HandleBattleAnimation(battler, FALSE, FALSE); -} - static void OpponentHandleEndLinkBattle(u32 battler) { if (gBattleTypeFlags & BATTLE_TYPE_LINK && !(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER)) @@ -720,5 +606,5 @@ static void OpponentHandleEndLinkBattle(u32 battler) gMain.callback1 = gPreBattleCallback1; SetMainCallback2(gMain.savedCallback); } - OpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index a0b4e73ece98..aba9d7d8375b 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -35,7 +35,6 @@ #include "constants/battle_anim.h" #include "constants/battle_move_effects.h" #include "constants/battle_partner.h" -#include "constants/hold_effects.h" #include "constants/items.h" #include "constants/moves.h" #include "constants/party_menu.h" @@ -47,25 +46,21 @@ #include "pokemon_summary_screen.h" #include "type_icons.h" #include "pokedex.h" +#include "test/battle.h" +#include "test/test_runner_battle.h" -static void PlayerBufferExecCompleted(u32 battler); static void PlayerHandleLoadMonSprite(u32 battler); -static void PlayerHandleSwitchInAnim(u32 battler); static void PlayerHandleDrawTrainerPic(u32 battler); static void PlayerHandleTrainerSlide(u32 battler); static void PlayerHandleTrainerSlideBack(u32 battler); static void PlayerHandlePaletteFade(u32 battler); static void PlayerHandleSuccessBallThrowAnim(u32 battler); static void PlayerHandlePause(u32 battler); -static void PlayerHandleMoveAnimation(u32 battler); -static void PlayerHandlePrintString(u32 battler); -static void PlayerHandlePrintSelectionString(u32 battler); static void PlayerHandleChooseAction(u32 battler); static void PlayerHandleYesNoBox(u32 battler); static void PlayerHandleChooseItem(u32 battler); static void PlayerHandleChoosePokemon(u32 battler); static void PlayerHandleCmd23(u32 battler); -static void PlayerHandleHealthBarUpdate(u32 battler); static void PlayerHandleStatusXor(u32 battler); static void PlayerHandleDMA3Transfer(u32 battler); static void PlayerHandlePlayBGM(u32 battler); @@ -76,7 +71,6 @@ static void PlayerHandleOneReturnValue_Duplicate(u32 battler); static void PlayerHandleIntroTrainerBallThrow(u32 battler); static void PlayerHandleDrawPartyStatusSummary(u32 battler); static void PlayerHandleEndBounceEffect(u32 battler); -static void PlayerHandleBattleAnimation(u32 battler); static void PlayerHandleLinkStandbyMsg(u32 battler); static void PlayerHandleResetActionMoveSelection(u32 battler); static void PlayerHandleEndLinkBattle(u32 battler); @@ -89,7 +83,6 @@ static void MoveSelectionDisplayMoveType(u32 battler); static void MoveSelectionDisplayMoveNames(u32 battler); static void TryMoveSelectionDisplayMoveDescription(u32 battler); static void MoveSelectionDisplayMoveDescription(u32 battler); -static void SwitchIn_HandleSoundAndEnd(u32 battler); static void WaitForMonSelection(u32 battler); static void CompleteWhenChoseItem(u32 battler); static void Task_LaunchLvlUpAnim(u8); @@ -100,7 +93,7 @@ static void Task_UpdateLvlInHealthbox(u8); static void PrintLinkStandbyMsg(void); static void ReloadMoveNames(u32 battler); -static u32 CheckTypeEffectiveness(u32 targetId, u32 battler); +static u32 CheckTypeEffectiveness(u32 battlerAtk, u32 battlerDef); static u32 CheckTargetTypeEffectiveness(u32 battler); static void MoveSelectionDisplayMoveEffectiveness(u32 foeEffectiveness, u32 battler); @@ -111,7 +104,7 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData, [CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData, [CONTROLLER_LOADMONSPRITE] = PlayerHandleLoadMonSprite, - [CONTROLLER_SWITCHINANIM] = PlayerHandleSwitchInAnim, + [CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = PlayerHandleDrawTrainerPic, [CONTROLLER_TRAINERSLIDE] = PlayerHandleTrainerSlide, @@ -121,16 +114,16 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_SUCCESSBALLTHROWANIM] = PlayerHandleSuccessBallThrowAnim, [CONTROLLER_BALLTHROWANIM] = PlayerHandleBallThrowAnim, [CONTROLLER_PAUSE] = PlayerHandlePause, - [CONTROLLER_MOVEANIMATION] = PlayerHandleMoveAnimation, - [CONTROLLER_PRINTSTRING] = PlayerHandlePrintString, - [CONTROLLER_PRINTSTRINGPLAYERONLY] = PlayerHandlePrintSelectionString, + [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_HandlePrintStringPlayerOnly, [CONTROLLER_CHOOSEACTION] = PlayerHandleChooseAction, [CONTROLLER_YESNOBOX] = PlayerHandleYesNoBox, [CONTROLLER_CHOOSEMOVE] = PlayerHandleChooseMove, [CONTROLLER_OPENBAG] = PlayerHandleChooseItem, [CONTROLLER_CHOOSEPOKEMON] = PlayerHandleChoosePokemon, [CONTROLLER_23] = PlayerHandleCmd23, - [CONTROLLER_HEALTHBARUPDATE] = PlayerHandleHealthBarUpdate, + [CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = PlayerHandleExpUpdate, [CONTROLLER_STATUSICONUPDATE] = BtlController_HandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = BtlController_HandleStatusAnimation, @@ -154,7 +147,7 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary, [CONTROLLER_ENDBOUNCE] = PlayerHandleEndBounceEffect, [CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility, - [CONTROLLER_BATTLEANIMATION] = PlayerHandleBattleAnimation, + [CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = PlayerHandleLinkStandbyMsg, [CONTROLLER_RESETACTIONMOVESELECTION] = PlayerHandleResetActionMoveSelection, [CONTROLLER_ENDLINKBATTLE] = PlayerHandleEndLinkBattle, @@ -170,7 +163,7 @@ void SetControllerToPlayer(u32 battler) gPlayerDpadHoldFrames = 0; } -static void PlayerBufferExecCompleted(u32 battler) +void PlayerBufferExecCompleted(u32 battler) { gBattlerControllerFuncs[battler] = PlayerBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) @@ -193,58 +186,48 @@ static void PlayerBufferRunCommand(u32 battler) if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sPlayerBufferCommands)) sPlayerBufferCommands[gBattleResources->bufferA[battler][0]](battler); else - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } } static void CompleteOnBattlerSpritePosX_0(u32 battler) { if (gSprites[gBattlerSpriteIds[battler]].x2 == 0) - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static u16 GetPrevBall(u16 ballId) { - u16 ballPrev; - s32 i, j; - CompactItemsInBagPocket(&gBagPockets[BALLS_POCKET]); - for (i = 0; i < gBagPockets[BALLS_POCKET].capacity; i++) + s32 i; + s32 index = ItemIdToBallId(ballId); + u32 newBall = 0; + for (i = 0; i < POKEBALL_COUNT; i++) { - if (ballId == gBagPockets[BALLS_POCKET].itemSlots[i].itemId) - { - if (i <= 0) - { - for (j = gBagPockets[BALLS_POCKET].capacity - 1; j >= 0; j--) - { - ballPrev = gBagPockets[BALLS_POCKET].itemSlots[j].itemId; - if (ballPrev != ITEM_NONE) - return ballPrev; - } - } - i--; - break; - } + index--; + if (index == -1) + index = POKEBALL_COUNT - 1; + newBall = gBallItemIds[index]; + if (CheckBagHasItem(newBall, 1)) + return newBall; } - return gBagPockets[BALLS_POCKET].itemSlots[i].itemId; + return ballId; } static u32 GetNextBall(u32 ballId) { - u32 ballNext = ITEM_NONE; s32 i; - CompactItemsInBagPocket(&gBagPockets[BALLS_POCKET]); - for (i = 1; i < gBagPockets[BALLS_POCKET].capacity; i++) + s32 index = ItemIdToBallId(ballId); + u32 newBall = 0; + for (i = 0; i < POKEBALL_COUNT; i++) { - if (ballId == gBagPockets[BALLS_POCKET].itemSlots[i-1].itemId) - { - ballNext = gBagPockets[BALLS_POCKET].itemSlots[i].itemId; - break; - } + index++; + if (index == POKEBALL_COUNT) + index = 0; + newBall = gBallItemIds[index]; + if (CheckBagHasItem(newBall, 1)) + return newBall; } - if (ballNext == ITEM_NONE) - return gBagPockets[BALLS_POCKET].itemSlots[0].itemId; // Zeroth slot - else - return ballNext; + return ballId; } static void HandleInputChooseAction(u32 battler) @@ -311,7 +294,7 @@ static void HandleInputChooseAction(u32 battler) ArrowsChangeColorLastBallCycle(FALSE); TryHideLastUsedBall(); BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_THROW_BALL, 0); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } return; } @@ -337,7 +320,7 @@ static void HandleInputChooseAction(u32 battler) BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_RUN, 0); break; } - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } else if (JOY_NEW(DPAD_LEFT)) { @@ -393,7 +376,7 @@ static void HandleInputChooseAction(u32 battler) } PlaySE(SE_SELECT); BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_CANCEL_PARTNER, 0); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } else if (B_QUICK_MOVE_CURSOR_TO_RUN) { @@ -413,7 +396,7 @@ static void HandleInputChooseAction(u32 battler) else if (DEBUG_BATTLE_MENU == TRUE && JOY_NEW(SELECT_BUTTON)) { BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_DEBUG, 0); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } else if (B_LAST_USED_BALL == TRUE && B_LAST_USED_BALL_CYCLE == FALSE && JOY_NEW(B_LAST_USED_BALL_BUTTON) && CanThrowLastUsedBall()) @@ -421,7 +404,7 @@ static void HandleInputChooseAction(u32 battler) PlaySE(SE_SELECT); TryHideLastUsedBall(); BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_THROW_BALL, 0); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -449,19 +432,26 @@ void HandleInputChooseTarget(u32 battler) PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_HideAsMoveTarget; if (gBattleStruct->gimmick.playerSelect) - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, gMoveSelectionCursor[battler] | RET_GIMMICK | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, gMoveSelectionCursor[battler] | RET_GIMMICK | (gMultiUsePlayerCursor << 8)); else - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX); TryHideLastUsedBall(); HideGimmickTriggerSprite(); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } else if (JOY_NEW(B_BUTTON) || gPlayerDpadHoldFrames > 59) { PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_HideAsMoveTarget; gBattlerControllerFuncs[battler] = HandleInputChooseMove; + if (gBattleStruct->gimmick.playerSelect == 1 && gBattleStruct->gimmick.usableGimmick[battler] == GIMMICK_Z_MOVE) + { + gBattleStruct->gimmick.playerSelect = 0; + gBattleStruct->zmove.viewing = TRUE; + ReloadMoveNames(battler); + } + TryToAddMoveInfoWindow(); DoBounceEffect(battler, BOUNCE_HEALTHBOX, 7, 1); DoBounceEffect(battler, BOUNCE_MON, 7, 1); EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX); @@ -507,7 +497,7 @@ void HandleInputChooseTarget(u32 battler) break; } if (B_SHOW_EFFECTIVENESS) - MoveSelectionDisplayMoveEffectiveness(CheckTypeEffectiveness(GetBattlerPosition(gMultiUsePlayerCursor), battler), battler); + MoveSelectionDisplayMoveEffectiveness(CheckTypeEffectiveness(battler, GetBattlerPosition(gMultiUsePlayerCursor)), battler); if (gAbsentBattlerFlags & (1u << gMultiUsePlayerCursor) || !CanTargetBattler(battler, gMultiUsePlayerCursor, move) @@ -558,7 +548,7 @@ void HandleInputChooseTarget(u32 battler) break; } if (B_SHOW_EFFECTIVENESS) - MoveSelectionDisplayMoveEffectiveness(CheckTypeEffectiveness(GetBattlerPosition(gMultiUsePlayerCursor), battler), battler); + MoveSelectionDisplayMoveEffectiveness(CheckTypeEffectiveness(battler, GetBattlerPosition(gMultiUsePlayerCursor)), battler); if (gAbsentBattlerFlags & (1u << gMultiUsePlayerCursor) || !CanTargetBattler(battler, gMultiUsePlayerCursor, move) @@ -609,11 +599,11 @@ void HandleInputShowEntireFieldTargets(u32 battler) PlaySE(SE_SELECT); HideAllTargets(); if (gBattleStruct->gimmick.playerSelect) - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, gMoveSelectionCursor[battler] | RET_GIMMICK | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, gMoveSelectionCursor[battler] | RET_GIMMICK | (gMultiUsePlayerCursor << 8)); else - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); HideGimmickTriggerSprite(); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } else if (JOY_NEW(B_BUTTON) || gPlayerDpadHoldFrames > 59) { @@ -637,12 +627,12 @@ void HandleInputShowTargets(u32 battler) PlaySE(SE_SELECT); HideShownTargets(battler); if (gBattleStruct->gimmick.playerSelect) - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, gMoveSelectionCursor[battler] | RET_GIMMICK | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, gMoveSelectionCursor[battler] | RET_GIMMICK | (gMultiUsePlayerCursor << 8)); else - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); HideGimmickTriggerSprite(); TryHideLastUsedBall(); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } else if (JOY_NEW(B_BUTTON) || gPlayerDpadHoldFrames > 59) { @@ -741,12 +731,12 @@ void HandleInputChooseMove(u32 battler) case 0: default: if (gBattleStruct->gimmick.playerSelect) - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, gMoveSelectionCursor[battler] | RET_GIMMICK | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, gMoveSelectionCursor[battler] | RET_GIMMICK | (gMultiUsePlayerCursor << 8)); else - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); HideGimmickTriggerSprite(); TryHideLastUsedBall(); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); break; case 1: gBattlerControllerFuncs[battler] = HandleInputChooseTarget; @@ -758,7 +748,7 @@ void HandleInputChooseMove(u32 battler) else gMultiUsePlayerCursor = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); if (B_SHOW_EFFECTIVENESS) - MoveSelectionDisplayMoveEffectiveness(CheckTypeEffectiveness(GetBattlerPosition(gMultiUsePlayerCursor), battler), battler); + MoveSelectionDisplayMoveEffectiveness(CheckTypeEffectiveness(battler, GetBattlerPosition(gMultiUsePlayerCursor)), battler); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_ShowAsMoveTarget; break; @@ -781,9 +771,9 @@ void HandleInputChooseMove(u32 battler) } else { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, 0xFFFF); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, 0xFFFF); HideGimmickTriggerSprite(); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); TryToHideMoveInfoWindow(); } } @@ -897,7 +887,10 @@ void HandleInputChooseMove(u32 battler) } else if (JOY_NEW(START_BUTTON)) { - if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE && !HasTrainerUsedGimmick(battler, gBattleStruct->gimmick.usableGimmick[battler])) + if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE + && !HasTrainerUsedGimmick(battler, gBattleStruct->gimmick.usableGimmick[battler]) + && !(gBattleStruct->gimmick.usableGimmick[battler] == GIMMICK_Z_MOVE + && GetUsableZMove(battler, moveInfo->moves[gMoveSelectionCursor[battler]]) == MOVE_NONE)) { gBattleStruct->gimmick.playerSelect ^= 1; ReloadMoveNames(battler); @@ -1033,7 +1026,7 @@ void HandleMoveSwitching(u32 battler) gBattleMons[battler].pp[i] = moveInfo->currentPp[i]; } - if (!(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) + if (!(gBattleMons[battler].volatiles.transformed)) { for (i = 0; i < MAX_MON_MOVES; i++) { @@ -1226,15 +1219,6 @@ void SetBattleEndCallbacks(u32 battler) } } -static void Intro_DelayAndEnd(u32 battler) -{ - if (--gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay == (u8)-1) - { - gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0; - PlayerBufferExecCompleted(battler); - } -} - static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) { bool8 healthboxAnimDone = FALSE; @@ -1261,8 +1245,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + FreeShinyStars(); HandleLowHpMusicChange(GetBattlerMon(battler), battler); @@ -1270,7 +1253,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) HandleLowHpMusicChange(GetBattlerMon(BATTLE_PARTNER(battler)), BATTLE_PARTNER(battler)); gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3; - gBattlerControllerFuncs[battler] = Intro_DelayAndEnd; + gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd; } } @@ -1360,48 +1343,6 @@ static void Intro_TryShinyAnimShowHealthbox(u32 battler) } } -static void SwitchIn_CleanShinyAnimShowSubstitute(u32 battler) -{ - if (gSprites[gHealthboxSpriteIds[battler]].callback == SpriteCallbackDummy - && gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim - && gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy) - { - CopyBattleSpriteInvisibility(battler); - - // Reset shiny anim (even if it didn't occur) - gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); - - // Check if Substitute should be shown - if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) - InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_MON_TO_SUBSTITUTE); - - gBattlerControllerFuncs[battler] = SwitchIn_HandleSoundAndEnd; - } -} - -static void SwitchIn_HandleSoundAndEnd(u32 battler) -{ - if (SwitchIn_HandleSoundAndEndUtil(battler)) - { - HandleLowHpMusicChange(GetBattlerMon(battler), battler); - PlayerBufferExecCompleted(battler); - } -} - -static void SwitchIn_TryShinyAnimShowHealthbox(u32 battler) -{ - if (SwitchIn_TryShinyAnimUtil(battler)) - { - UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_ALL); - StartHealthboxSlideIn(battler); - SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]); - gBattlerControllerFuncs[battler] = SwitchIn_CleanShinyAnimShowSubstitute; - } -} - void Task_PlayerController_RestoreBgmAfterCry(u8 taskId) { if (!IsCryPlayingOrClearCrySongs()) @@ -1616,10 +1557,10 @@ static void WaitForMonSelection(u32 battler) else BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, PARTY_SIZE, NULL); - if ((gBattleResources->bufferA[battler][1] & 0xF) == 1) + if (gBattleResources->bufferA[battler][1] == PARTY_ACTION_SEND_OUT) PrintLinkStandbyMsg(); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -1639,7 +1580,7 @@ static void CompleteWhenChoseItem(u32 battler) if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { BtlController_EmitOneReturnValue(battler, B_COMM_TO_ENGINE, gSpecialVar_ItemId); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -1665,17 +1606,17 @@ static void PlayerHandleYesNoInput(u32 battler) PlaySE(SE_SELECT); if (gMultiUsePlayerCursor != 0) - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 0xE, 0); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_UNK_14, 0); else - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 0xD, 0); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_NOTHING_FAINTED, 0); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } if (JOY_NEW(B_BUTTON)) { HandleBattleWindow(YESNOBOX_X_Y, WINDOW_CLEAR); PlaySE(SE_SELECT); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -1729,7 +1670,7 @@ static void MoveSelectionDisplayMoveType(u32 battler) struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleResources->bufferA[battler][4]); txtPtr = StringCopy(gDisplayedStringBattle, gText_MoveInterfaceType); u32 move = moveInfo->moves[gMoveSelectionCursor[battler]]; - u32 type = GetMoveType(move); + enum Type type = GetMoveType(move); enum BattleMoveEffects effect = GetMoveEffect(move); if (effect == EFFECT_TERA_BLAST) @@ -1742,7 +1683,7 @@ static void MoveSelectionDisplayMoveType(u32 battler) if (speciesId == SPECIES_OGERPON_WELLSPRING || speciesId == SPECIES_OGERPON_WELLSPRING_TERA || speciesId == SPECIES_OGERPON_HEARTHFLAME || speciesId == SPECIES_OGERPON_HEARTHFLAME_TERA || speciesId == SPECIES_OGERPON_CORNERSTONE || speciesId == SPECIES_OGERPON_CORNERSTONE_TERA) - type = gSpeciesInfo[speciesId].types[1]; + type = GetSpeciesType(speciesId, 1); } else if (GetMoveCategory(move) == DAMAGE_CATEGORY_STATUS && (GetActiveGimmick(battler) == GIMMICK_DYNAMAX || IsGimmickSelected(battler, GIMMICK_DYNAMAX))) @@ -1781,6 +1722,14 @@ static void MoveSelectionDisplayMoveDescription(u32 battler) u16 move = moveInfo->moves[gMoveSelectionCursor[battler]]; u16 pwr = GetMovePower(move); u16 acc = GetMoveAccuracy(move); + enum DamageCategory cat = GetBattleMoveCategory(move); + + if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX || IsGimmickSelected(battler, GIMMICK_DYNAMAX)) + { + pwr = GetMaxMovePower(move); + move = GetMaxMove(battler, move); + acc = 0; + } u8 pwr_num[3], acc_num[3]; u8 cat_desc[7] = _("CAT: "); @@ -1814,7 +1763,7 @@ static void MoveSelectionDisplayMoveDescription(u32 battler) if (gCategoryIconSpriteId == 0xFF) gCategoryIconSpriteId = CreateSprite(&gSpriteTemplate_CategoryIcons, 38, 64, 1); - StartSpriteAnim(&gSprites[gCategoryIconSpriteId], GetBattleMoveCategory(move)); + StartSpriteAnim(&gSprites[gCategoryIconSpriteId], cat); CopyWindowToVram(B_WIN_MOVE_DESCRIPTION, COPYWIN_FULL); } @@ -1886,13 +1835,6 @@ static void PlayerHandleLoadMonSprite(u32 battler) gBattlerControllerFuncs[battler] = CompleteOnBattlerSpritePosX_0; } -static void PlayerHandleSwitchInAnim(u32 battler) -{ - gActionSelectionCursor[battler] = 0; - gMoveSelectionCursor[battler] = 0; - BtlController_HandleSwitchInAnim(battler, TRUE, SwitchIn_TryShinyAnimShowHealthbox); -} - u32 LinkPlayerGetTrainerPicId(u32 multiplayerId) { u32 trainerPicId; @@ -1930,30 +1872,40 @@ static void PlayerHandleDrawTrainerPic(u32 battler) bool32 isFrontPic; s16 xPos, yPos; u32 trainerPicId; - - trainerPicId = PlayerGetTrainerBackPicId(); - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + if (IsMultibattleTest()) { - if ((GetBattlerPosition(battler) & BIT_FLANK) != B_FLANK_LEFT) // Second mon, on the right. - xPos = 90; - else // First mon, on the left. + trainerPicId = TRAINER_BACK_PIC_BRENDAN; + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) xPos = 32; - - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId < TRAINER_PARTNER(PARTNER_NONE)) + else + xPos = 80; + yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; + } + else + { + trainerPicId = PlayerGetTrainerBackPicId(); + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - xPos = 90; - yPos = 80; + if ((GetBattlerPosition(battler) & BIT_FLANK) != B_FLANK_LEFT) // Second mon, on the right. + xPos = 90; + else // First mon, on the left. + xPos = 32; + + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId < TRAINER_PARTNER(PARTNER_NONE)) + { + xPos = 90; + yPos = 80; + } + else + { + yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; + } } else { + xPos = 80; yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; } - - } - else - { - xPos = 80; - yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; } // Use front pic table for any tag battles unless your partner is Steven or a custom partner. @@ -1984,7 +1936,7 @@ static void PlayerHandleTrainerSlideBack(u32 battler) static void PlayerHandlePaletteFade(u32 battler) { BeginNormalPaletteFade(PALETTES_ALL, 2, 0, 16, RGB_BLACK); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerHandleSuccessBallThrowAnim(u32 battler) @@ -2004,25 +1956,7 @@ static void PlayerHandlePause(u32 battler) while (timer != 0) timer--; - PlayerBufferExecCompleted(battler); -} - -static void PlayerHandleMoveAnimation(u32 battler) -{ - BtlController_HandleMoveAnimation(battler, TRUE); -} - -static void PlayerHandlePrintString(u32 battler) -{ - BtlController_HandlePrintString(battler, TRUE, TRUE); -} - -static void PlayerHandlePrintSelectionString(u32 battler) -{ - if (IsOnPlayerSide(battler)) - PlayerHandlePrintString(battler); - else - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void HandleChooseActionAfterDma3(u32 battler) @@ -2071,7 +2005,7 @@ static void PlayerHandleChooseAction(u32 battler) if (B_SHOW_PARTNER_TARGET && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && IsBattlerAlive(B_POSITION_PLAYER_RIGHT)) { StringCopy(gStringVar1, COMPOUND_STRING("Partner will use:\n")); - u32 move = gBattleMons[B_POSITION_PLAYER_RIGHT].moves[gBattleStruct->chosenMovePositions[B_POSITION_PLAYER_RIGHT]]; + u32 move = GetChosenMoveFromPosition(B_POSITION_PLAYER_RIGHT); StringAppend(gStringVar1, GetMoveName(move)); u32 moveTarget = GetBattlerMoveTargetType(B_POSITION_PLAYER_RIGHT, move); if (moveTarget == MOVE_TARGET_SELECTED) @@ -2083,7 +2017,7 @@ static void PlayerHandleChooseAction(u32 battler) else if (gAiBattleData->chosenTarget[B_POSITION_PLAYER_RIGHT] == B_POSITION_PLAYER_LEFT) StringAppend(gStringVar1, COMPOUND_STRING(" {DOWN_ARROW}-")); else if (gAiBattleData->chosenTarget[B_POSITION_PLAYER_RIGHT] == B_POSITION_PLAYER_RIGHT) - StringAppend(gStringVar1, COMPOUND_STRING(" {DOWN_ARROW}-")); + StringAppend(gStringVar1, COMPOUND_STRING(" -{DOWN_ARROW}")); } else if (moveTarget == MOVE_TARGET_BOTH) { @@ -2117,7 +2051,7 @@ static void PlayerHandleYesNoBox(u32 battler) } else { - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -2138,8 +2072,8 @@ static void PlayerChooseMoveInBattlePalace(u32 battler) if (--gBattleStruct->arenaMindPoints[battler] == 0) { gBattlePalaceMoveSelectionRngValue = gRngValue; - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace(battler)); - PlayerBufferExecCompleted(battler); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, ChooseMoveAndTargetInBattlePalace(battler)); + BtlController_Complete(battler); } } @@ -2163,6 +2097,8 @@ void PlayerHandleChooseMove(u32 battler) if (!IsGimmickTriggerSpriteActive()) gBattleStruct->gimmick.triggerSpriteId = 0xFF; + else if (!IsGimmickTriggerSpriteMatchingBattler(battler)) + DestroyGimmickTriggerSprite(); if (!(gBattleStruct->gimmick.usableGimmick[battler] == GIMMICK_Z_MOVE && !gBattleStruct->zmove.viable)) CreateGimmickTriggerSprite(battler); @@ -2203,18 +2139,18 @@ static void PlayerHandleChoosePokemon(u32 battler) for (i = 0; i < ARRAY_COUNT(gBattlePartyCurrentOrder); i++) gBattlePartyCurrentOrder[i] = gBattleResources->bufferA[battler][4 + i]; - if (gBattleTypeFlags & BATTLE_TYPE_ARENA && (gBattleResources->bufferA[battler][1] & 0xF) != PARTY_ACTION_CANT_SWITCH - && (gBattleResources->bufferA[battler][1] & 0xF) != PARTY_ACTION_CHOOSE_FAINTED_MON - && (gBattleResources->bufferA[battler][1] & 0xF) != PARTY_ACTION_SEND_MON_TO_BOX) + if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleResources->bufferA[battler][1] != PARTY_ACTION_CANT_SWITCH + && gBattleResources->bufferA[battler][1] != PARTY_ACTION_CHOOSE_FAINTED_MON + && gBattleResources->bufferA[battler][1] != PARTY_ACTION_SEND_MON_TO_BOX) { BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, gBattlerPartyIndexes[battler] + 1, gBattlePartyCurrentOrder); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } else { gBattleControllerData[battler] = CreateTask(TaskDummy, 0xFF); - gTasks[gBattleControllerData[battler]].data[0] = gBattleResources->bufferA[battler][1] & 0xF; - *(&gBattleStruct->battlerPreventingSwitchout) = gBattleResources->bufferA[battler][1] >> 4; + gTasks[gBattleControllerData[battler]].data[0] = gBattleResources->bufferA[battler][1]; + *(&gBattleStruct->battlerPreventingSwitchout) = gBattleResources->bufferA[battler][8]; *(&gBattleStruct->prevSelectedPartySlot) = gBattleResources->bufferA[battler][2]; *(&gBattleStruct->abilityPreventingSwitchout) = (gBattleResources->bufferA[battler][3] & 0xFF) | (gBattleResources->bufferA[battler][7] << 8); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); @@ -2227,12 +2163,7 @@ static void PlayerHandleCmd23(u32 battler) { BattleStopLowHpSound(); BeginNormalPaletteFade(PALETTES_ALL, 2, 0, 16, RGB_BLACK); - PlayerBufferExecCompleted(battler); -} - -static void PlayerHandleHealthBarUpdate(u32 battler) -{ - BtlController_HandleHealthBarUpdate(battler, TRUE); + BtlController_Complete(battler); } void PlayerHandleExpUpdate(u32 battler) @@ -2242,7 +2173,7 @@ void PlayerHandleExpUpdate(u32 battler) if (GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL) >= MAX_LEVEL) { - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } else { @@ -2268,7 +2199,7 @@ static void PlayerHandleStatusXor(u32 battler) u32 val = GetMonData(GetBattlerMon(battler), MON_DATA_STATUS) ^ gBattleResources->bufferA[battler][1]; SetMonData(GetBattlerMon(battler), MON_DATA_STATUS, &val); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerHandleDMA3Transfer(u32 battler) @@ -2295,37 +2226,37 @@ static void PlayerHandleDMA3Transfer(u32 battler) dst += 0x1000; size -= 0x1000; } - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerHandlePlayBGM(u32 battler) { PlayBGM(gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8)); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerHandleTwoReturnValues(u32 battler) { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 0, 0); - PlayerBufferExecCompleted(battler); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_USE_MOVE, 0); + BtlController_Complete(battler); } static void PlayerHandleChosenMonReturnValue(u32 battler) { BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, 0, NULL); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerHandleOneReturnValue(u32 battler) { BtlController_EmitOneReturnValue(battler, B_COMM_TO_ENGINE, 0); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerHandleOneReturnValue_Duplicate(u32 battler) { BtlController_EmitOneReturnValue_Duplicate(battler, B_COMM_TO_ENGINE, 0); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerHandleIntroTrainerBallThrow(u32 battler) @@ -2344,12 +2275,7 @@ static void PlayerHandleEndBounceEffect(u32 battler) { EndBounceEffect(battler, BOUNCE_HEALTHBOX); EndBounceEffect(battler, BOUNCE_MON); - PlayerBufferExecCompleted(battler); -} - -static void PlayerHandleBattleAnimation(u32 battler) -{ - BtlController_HandleBattleAnimation(battler, FALSE, TRUE); + BtlController_Complete(battler); } static void PlayerHandleLinkStandbyMsg(u32 battler) @@ -2368,7 +2294,7 @@ static void PlayerHandleLinkStandbyMsg(u32 battler) PrintLinkStandbyMsg(); break; } - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerHandleResetActionMoveSelection(u32 battler) @@ -2386,7 +2312,7 @@ static void PlayerHandleResetActionMoveSelection(u32 battler) gMoveSelectionCursor[battler] = 0; break; } - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerHandleEndLinkBattle(u32 battler) @@ -2396,7 +2322,7 @@ static void PlayerHandleEndLinkBattle(u32 battler) gSaveBlock2Ptr->frontier.disableRecordBattle = gBattleResources->bufferA[battler][2]; FadeOutMapMusic(5); BeginFastPaletteFade(3); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); gBattlerControllerFuncs[battler] = SetBattleEndCallbacks; } @@ -2404,7 +2330,7 @@ static void Controller_WaitForDebug(u32 battler) { if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -2436,15 +2362,23 @@ static bool32 ShouldShowTypeEffectiveness(u32 targetId) return TRUE; } -static u32 CheckTypeEffectiveness(u32 targetId, u32 battler) +static u32 CheckTypeEffectiveness(u32 battlerAtk, u32 battlerDef) { - struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleResources->bufferA[battler][4]); - struct Pokemon *mon = GetBattlerMon(battler); - u32 move = moveInfo->moves[gMoveSelectionCursor[battler]]; - u32 moveType = CheckDynamicMoveType(mon, move, battler, MON_IN_BATTLE); - uq4_12_t modifier = CalcTypeEffectivenessMultiplier(move, moveType, battler, targetId, GetBattlerAbility(targetId), FALSE); + struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleResources->bufferA[battlerAtk][4]); + struct DamageContext ctx = {0}; + ctx.battlerAtk = battlerAtk; + ctx.battlerDef = battlerDef; + ctx.move = moveInfo->moves[gMoveSelectionCursor[battlerAtk]]; + ctx.moveType = CheckDynamicMoveType(GetBattlerMon(battlerAtk), ctx.move, battlerAtk, MON_IN_BATTLE); + ctx.updateFlags = FALSE; + ctx.abilityAtk = GetBattlerAbility(battlerAtk); + ctx.abilityDef = GetBattlerAbility(battlerDef); + ctx.holdEffectAtk = GetBattlerHoldEffect(battlerAtk); + ctx.holdEffectDef = GetBattlerHoldEffect(battlerDef); + + uq4_12_t modifier = CalcTypeEffectivenessMultiplier(&ctx); - if (!ShouldShowTypeEffectiveness(targetId)) + if (!ShouldShowTypeEffectiveness(battlerDef)) return EFFECTIVENESS_CANNOT_VIEW; if (modifier == UQ_4_12(0.0)) @@ -2459,12 +2393,12 @@ static u32 CheckTypeEffectiveness(u32 targetId, u32 battler) static u32 CheckTargetTypeEffectiveness(u32 battler) { u32 battlerFoe = BATTLE_OPPOSITE(GetBattlerPosition(battler)); - u32 foeEffectiveness = CheckTypeEffectiveness(battlerFoe, battler); + u32 foeEffectiveness = CheckTypeEffectiveness(battler, battlerFoe); if (IsDoubleBattle()) { u32 partnerFoe = BATTLE_PARTNER(battlerFoe); - u32 partnerFoeEffectiveness = CheckTypeEffectiveness(partnerFoe, battler); + u32 partnerFoeEffectiveness = CheckTypeEffectiveness(battler, partnerFoe); if (!IsBattlerAlive(battlerFoe)) return partnerFoeEffectiveness; if (IsBattlerAlive(battlerFoe) && IsBattlerAlive(partnerFoe) diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 9929f421ccb3..37af6497df2e 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -31,25 +31,19 @@ #include "constants/songs.h" #include "constants/party_menu.h" #include "constants/trainers.h" +#include "test/battle.h" +#include "test/test_runner_battle.h" -static void PlayerPartnerHandleLoadMonSprite(u32 battler); -static void PlayerPartnerHandleSwitchInAnim(u32 battler); static void PlayerPartnerHandleDrawTrainerPic(u32 battler); static void PlayerPartnerHandleTrainerSlideBack(u32 battler); -static void PlayerPartnerHandleMoveAnimation(u32 battler); -static void PlayerPartnerHandlePrintString(u32 battler); static void PlayerPartnerHandleChooseAction(u32 battler); static void PlayerPartnerHandleChooseMove(u32 battler); static void PlayerPartnerHandleChoosePokemon(u32 battler); -static void PlayerPartnerHandleHealthBarUpdate(u32 battler); static void PlayerPartnerHandleIntroTrainerBallThrow(u32 battler); static void PlayerPartnerHandleDrawPartyStatusSummary(u32 battler); -static void PlayerPartnerHandleBattleAnimation(u32 battler); static void PlayerPartnerHandleEndLinkBattle(u32 battler); static void PlayerPartnerBufferRunCommand(u32 battler); -static void PlayerPartnerBufferExecCompleted(u32 battler); -static void SwitchIn_WaitAndEnd(u32 battler); static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = { @@ -57,8 +51,8 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 bat [CONTROLLER_GETRAWMONDATA] = BtlController_Empty, [CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData, [CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData, - [CONTROLLER_LOADMONSPRITE] = PlayerPartnerHandleLoadMonSprite, - [CONTROLLER_SWITCHINANIM] = PlayerPartnerHandleSwitchInAnim, + [CONTROLLER_LOADMONSPRITE] = BtlController_HandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = PlayerPartnerHandleDrawTrainerPic, [CONTROLLER_TRAINERSLIDE] = BtlController_Empty, @@ -68,8 +62,8 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 bat [CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty, [CONTROLLER_BALLTHROWANIM] = BtlController_Empty, [CONTROLLER_PAUSE] = BtlController_Empty, - [CONTROLLER_MOVEANIMATION] = PlayerPartnerHandleMoveAnimation, - [CONTROLLER_PRINTSTRING] = PlayerPartnerHandlePrintString, + [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, [CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_Empty, [CONTROLLER_CHOOSEACTION] = PlayerPartnerHandleChooseAction, [CONTROLLER_YESNOBOX] = BtlController_Empty, @@ -77,7 +71,7 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 bat [CONTROLLER_OPENBAG] = BtlController_Empty, [CONTROLLER_CHOOSEPOKEMON] = PlayerPartnerHandleChoosePokemon, [CONTROLLER_23] = BtlController_Empty, - [CONTROLLER_HEALTHBARUPDATE] = PlayerPartnerHandleHealthBarUpdate, + [CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = PlayerHandleExpUpdate, // Partner's player gets experience the same way as the player. [CONTROLLER_STATUSICONUPDATE] = BtlController_HandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = BtlController_HandleStatusAnimation, @@ -101,7 +95,7 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 bat [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary, [CONTROLLER_ENDBOUNCE] = BtlController_Empty, [CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility, - [CONTROLLER_BATTLEANIMATION] = PlayerPartnerHandleBattleAnimation, + [CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = BtlController_Empty, [CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty, [CONTROLLER_ENDLINKBATTLE] = PlayerPartnerHandleEndLinkBattle, @@ -122,16 +116,7 @@ static void PlayerPartnerBufferRunCommand(u32 battler) if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sPlayerPartnerBufferCommands)) sPlayerPartnerBufferCommands[gBattleResources->bufferA[battler][0]](battler); else - PlayerPartnerBufferExecCompleted(battler); - } -} - -static void Intro_DelayAndEnd(u32 battler) -{ - if (--gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay == (u8)-1) - { - gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0; - BattleControllerComplete(battler); + BtlController_Complete(battler); } } @@ -159,7 +144,7 @@ static void Intro_WaitForHealthbox(u32 battler) if (finished) { gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3; - gBattlerControllerFuncs[battler] = Intro_DelayAndEnd; + gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd; } } @@ -194,37 +179,7 @@ void Controller_PlayerPartnerShowIntroHealthbox(u32 battler) } } -static void WaitForMonAnimAfterLoad(u32 battler) -{ - if (gSprites[gBattlerSpriteIds[battler]].animEnded && gSprites[gBattlerSpriteIds[battler]].x2 == 0) - PlayerPartnerBufferExecCompleted(battler); -} - -static void SwitchIn_ShowSubstitute(u32 battler) -{ - if (SwitchIn_ShowSubstituteUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_WaitAndEnd; -} - -static void SwitchIn_WaitAndEnd(u32 battler) -{ - if (SwitchIn_WaitAndEndUtil(battler)) - PlayerPartnerBufferExecCompleted(battler); -} - -static void SwitchIn_ShowHealthbox(u32 battler) -{ - if (SwitchIn_ShowHealthboxUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute; -} - -static void SwitchIn_TryShinyAnim(u32 battler) -{ - if (SwitchIn_TryShinyAnimUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox; -} - -static void PlayerPartnerBufferExecCompleted(u32 battler) +void PlayerPartnerBufferExecCompleted(u32 battler) { gBattlerControllerFuncs[battler] = PlayerPartnerBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) @@ -240,16 +195,6 @@ static void PlayerPartnerBufferExecCompleted(u32 battler) } } -static void PlayerPartnerHandleLoadMonSprite(u32 battler) -{ - BtlController_HandleLoadMonSprite(battler, WaitForMonAnimAfterLoad); -} - -static void PlayerPartnerHandleSwitchInAnim(u32 battler) -{ - BtlController_HandleSwitchInAnim(battler, TRUE, SwitchIn_TryShinyAnim); -} - // some explanation here // in emerald it's possible to have a tag battle in the battle frontier facilities with AI // which use the front sprite for both the player and the partner as opposed to any other battles (including the one with Steven) that use the back pic as well as animate it @@ -261,9 +206,15 @@ static void PlayerPartnerHandleDrawTrainerPic(u32 battler) enum DifficultyLevel difficulty = GetBattlePartnerDifficultyLevel(gPartnerTrainerId); - if (gPartnerTrainerId > TRAINER_PARTNER(PARTNER_NONE)) + if (IsMultibattleTest()) { - trainerPicId = gBattlePartners[difficulty][gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerPic; + trainerPicId = TRAINER_BACK_PIC_STEVEN; + xPos = 90; + yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; + } + else if (gPartnerTrainerId > TRAINER_PARTNER(PARTNER_NONE)) + { + trainerPicId = gBattlePartners[difficulty][gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerBackPic; xPos = 90; yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; } @@ -294,20 +245,10 @@ static void PlayerPartnerHandleTrainerSlideBack(u32 battler) BtlController_HandleTrainerSlideBack(battler, 35, FALSE); } -static void PlayerPartnerHandleMoveAnimation(u32 battler) -{ - BtlController_HandleMoveAnimation(battler, FALSE); -} - -static void PlayerPartnerHandlePrintString(u32 battler) -{ - BtlController_HandlePrintString(battler, FALSE, FALSE); -} - static void PlayerPartnerHandleChooseAction(u32 battler) { AI_TrySwitchOrUseItem(battler); - PlayerPartnerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerPartnerHandleChooseMove(u32 battler) @@ -328,25 +269,26 @@ static void PlayerPartnerHandleChooseMove(u32 battler) gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); } // If partner can and should use a gimmick (considering trainer data), do it - if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE - && !(gBattleStruct->gimmick.usableGimmick[battler] == GIMMICK_Z_MOVE - && !ShouldUseZMove(battler, gBattlerTarget, moveInfo->moves[chosenMoveIndex]))) + enum Gimmick usableGimmick = gBattleStruct->gimmick.usableGimmick[battler]; + if (usableGimmick != GIMMICK_NONE && IsAIUsingGimmick(battler) && !HasTrainerUsedGimmick(battler, usableGimmick)) { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, (chosenMoveIndex) | (RET_GIMMICK) | (gBattlerTarget << 8)); + gBattleStruct->gimmick.toActivate |= 1u << battler; + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (RET_GIMMICK) | (gBattlerTarget << 8)); } else { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, (chosenMoveIndex) | (gBattlerTarget << 8)); + SetAIUsingGimmick(battler, NO_GIMMICK); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (gBattlerTarget << 8)); } - PlayerPartnerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerPartnerHandleChoosePokemon(u32 battler) { s32 chosenMonId; // Choosing Revival Blessing target - if ((gBattleResources->bufferA[battler][1] & 0xF) == PARTY_ACTION_CHOOSE_FAINTED_MON) + if (gBattleResources->bufferA[battler][1] == PARTY_ACTION_CHOOSE_FAINTED_MON) { chosenMonId = gSelectedMonPartyId = GetFirstFaintedPartyIndex(battler); } @@ -354,7 +296,6 @@ static void PlayerPartnerHandleChoosePokemon(u32 battler) else if (gBattleStruct->monToSwitchIntoId[battler] >= PARTY_SIZE || !IsValidForBattle(&gPlayerParty[gBattleStruct->monToSwitchIntoId[battler]])) { chosenMonId = GetMostSuitableMonToSwitchInto(battler, SWITCH_AFTER_KO); - if (chosenMonId == PARTY_SIZE || !IsValidForBattle(&gPlayerParty[chosenMonId])) // just switch to the next mon { s32 firstId = (IsAiVsAiBattle()) ? 0 : (PARTY_SIZE / 2); @@ -379,13 +320,10 @@ static void PlayerPartnerHandleChoosePokemon(u32 battler) gBattleStruct->AI_monToSwitchIntoId[battler] = PARTY_SIZE; gBattleStruct->monToSwitchIntoId[battler] = chosenMonId; } + if (TESTING) + TestRunner_Battle_CheckSwitch(battler, chosenMonId); BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, chosenMonId, NULL); - PlayerPartnerBufferExecCompleted(battler); -} - -static void PlayerPartnerHandleHealthBarUpdate(u32 battler) -{ - BtlController_HandleHealthBarUpdate(battler, FALSE); + BtlController_Complete(battler); } static void PlayerPartnerHandleIntroTrainerBallThrow(u32 battler) @@ -394,9 +332,9 @@ static void PlayerPartnerHandleIntroTrainerBallThrow(u32 battler) enum DifficultyLevel difficulty = GetBattlePartnerDifficultyLevel(gPartnerTrainerId); if (gPartnerTrainerId > TRAINER_PARTNER(PARTNER_NONE)) - trainerPal = gTrainerBacksprites[gBattlePartners[difficulty][gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerPic].palette.data; + trainerPal = gTrainerBacksprites[gBattlePartners[difficulty][gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerBackPic].palette.data; else if (IsAiVsAiBattle()) - trainerPal = gTrainerSprites[GetTrainerPicFromId(gPartnerTrainerId)].palette.data; + trainerPal = gTrainerSprites[GetTrainerBackPicFromId(gPartnerTrainerId)].palette.data; else trainerPal = gTrainerSprites[GetFrontierTrainerFrontSpriteId(gPartnerTrainerId)].palette.data; // 2 vs 2 multi battle in Battle Frontier, load front sprite and pal. @@ -408,16 +346,11 @@ static void PlayerPartnerHandleDrawPartyStatusSummary(u32 battler) BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_PLAYER, TRUE); } -static void PlayerPartnerHandleBattleAnimation(u32 battler) -{ - BtlController_HandleBattleAnimation(battler, FALSE, FALSE); -} - static void PlayerPartnerHandleEndLinkBattle(u32 battler) { gBattleOutcome = gBattleResources->bufferA[battler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); - PlayerPartnerBufferExecCompleted(battler); + BtlController_Complete(battler); gBattlerControllerFuncs[battler] = SetBattleEndCallbacks; } diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 944cf6e0724c..954fdc4bc30c 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -31,28 +31,22 @@ #include "constants/battle_anim.h" #include "constants/songs.h" #include "constants/trainers.h" +#include "test/battle.h" +#include "test/test_runner_battle.h" -static void RecordedOpponentHandleLoadMonSprite(u32 battler); -static void RecordedOpponentHandleSwitchInAnim(u32 battler); static void RecordedOpponentHandleDrawTrainerPic(u32 battler); static void RecordedOpponentHandleTrainerSlideBack(u32 battler); -static void RecordedOpponentHandleMoveAnimation(u32 battler); -static void RecordedOpponentHandlePrintString(u32 battler); static void RecordedOpponentHandleChooseAction(u32 battler); static void RecordedOpponentHandleChooseMove(u32 battler); static void RecordedOpponentHandleChooseItem(u32 battler); static void RecordedOpponentHandleChoosePokemon(u32 battler); -static void RecordedOpponentHandleHealthBarUpdate(u32 battler); static void RecordedOpponentHandleStatusIconUpdate(u32 battler); static void RecordedOpponentHandleStatusAnimation(u32 battler); static void RecordedOpponentHandleIntroTrainerBallThrow(u32 battler); static void RecordedOpponentHandleDrawPartyStatusSummary(u32 battler); -static void RecordedOpponentHandleBattleAnimation(u32 battler); static void RecordedOpponentHandleEndLinkBattle(u32 battler); static void RecordedOpponentBufferRunCommand(u32 battler); -static void RecordedOpponentBufferExecCompleted(u32 battler); -static void SwitchIn_HandleSoundAndEnd(u32 battler); static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = { @@ -60,8 +54,8 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 [CONTROLLER_GETRAWMONDATA] = BtlController_Empty, [CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData, [CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData, - [CONTROLLER_LOADMONSPRITE] = RecordedOpponentHandleLoadMonSprite, - [CONTROLLER_SWITCHINANIM] = RecordedOpponentHandleSwitchInAnim, + [CONTROLLER_LOADMONSPRITE] = BtlController_HandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = RecordedOpponentHandleDrawTrainerPic, [CONTROLLER_TRAINERSLIDE] = OpponentHandleTrainerSlide, @@ -71,8 +65,8 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 [CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty, [CONTROLLER_BALLTHROWANIM] = BtlController_Empty, [CONTROLLER_PAUSE] = BtlController_Empty, - [CONTROLLER_MOVEANIMATION] = RecordedOpponentHandleMoveAnimation, - [CONTROLLER_PRINTSTRING] = RecordedOpponentHandlePrintString, + [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, [CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_Empty, [CONTROLLER_CHOOSEACTION] = RecordedOpponentHandleChooseAction, [CONTROLLER_YESNOBOX] = BtlController_Empty, @@ -80,7 +74,7 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 [CONTROLLER_OPENBAG] = RecordedOpponentHandleChooseItem, [CONTROLLER_CHOOSEPOKEMON] = RecordedOpponentHandleChoosePokemon, [CONTROLLER_23] = BtlController_Empty, - [CONTROLLER_HEALTHBARUPDATE] = RecordedOpponentHandleHealthBarUpdate, + [CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = BtlController_Empty, [CONTROLLER_STATUSICONUPDATE] = RecordedOpponentHandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = RecordedOpponentHandleStatusAnimation, @@ -104,7 +98,7 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary, [CONTROLLER_ENDBOUNCE] = BtlController_Empty, [CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility, - [CONTROLLER_BATTLEANIMATION] = RecordedOpponentHandleBattleAnimation, + [CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = BtlController_Empty, [CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty, [CONTROLLER_ENDLINKBATTLE] = RecordedOpponentHandleEndLinkBattle, @@ -125,11 +119,11 @@ static void RecordedOpponentBufferRunCommand(u32 battler) if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sRecordedOpponentBufferCommands)) sRecordedOpponentBufferCommands[gBattleResources->bufferA[battler][0]](battler); else - RecordedOpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } } -static void RecordedOpponentBufferExecCompleted(u32 battler) +void RecordedOpponentBufferExecCompleted(u32 battler) { gBattlerControllerFuncs[battler] = RecordedOpponentBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) @@ -145,15 +139,6 @@ static void RecordedOpponentBufferExecCompleted(u32 battler) } } -static void Intro_DelayAndEnd(u32 battler) -{ - if (--gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay == (u8)-1) - { - gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0; - RecordedOpponentBufferExecCompleted(battler); - } -} - static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) { bool8 healthboxAnimDone = FALSE; @@ -187,12 +172,11 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + FreeShinyStars(); } gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3; - gBattlerControllerFuncs[battler] = Intro_DelayAndEnd; + gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd; } } @@ -286,52 +270,29 @@ static void Intro_TryShinyAnimShowHealthbox(u32 battler) } } -static void TryShinyAnimAfterMonAnim(u32 battler) -{ - if (TryShinyAnimAfterMonAnimUtil(battler)) - RecordedOpponentBufferExecCompleted(battler); -} - -static void SwitchIn_ShowSubstitute(u32 battler) -{ - if (SwitchIn_ShowSubstituteUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_HandleSoundAndEnd; -} - -static void SwitchIn_HandleSoundAndEnd(u32 battler) -{ - if (SwitchIn_HandleSoundAndEndUtil(battler)) - RecordedOpponentBufferExecCompleted(battler); -} - -static void SwitchIn_ShowHealthbox(u32 battler) -{ - if (SwitchIn_ShowHealthboxUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute; -} - -static void SwitchIn_TryShinyAnim(u32 battler) -{ - if (SwitchIn_TryShinyAnimUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox; -} - -static void RecordedOpponentHandleLoadMonSprite(u32 battler) -{ - BtlController_HandleLoadMonSprite(battler, TryShinyAnimAfterMonAnim); -} - -static void RecordedOpponentHandleSwitchInAnim(u32 battler) -{ - BtlController_HandleSwitchInAnim(battler, FALSE, SwitchIn_TryShinyAnim); -} - static void RecordedOpponentHandleDrawTrainerPic(u32 battler) { s16 xPos; u32 trainerPicId; - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + // Sets Multibattle test opponent sprites to not be Hiker + if (IsMultibattleTest()) + { + if (GetBattlerPosition(battler) == B_POSITION_OPPONENT_LEFT) + { + trainerPicId = TRAINER_PIC_LEAF; + if (!(gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)) + xPos = 176; + else + xPos = 200; + } + else + { + trainerPicId = TRAINER_PIC_RED; + xPos = 152; + } + } + else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if ((GetBattlerPosition(battler) & BIT_FLANK) != 0) // second mon xPos = 152; @@ -371,36 +332,26 @@ static void RecordedOpponentHandleTrainerSlideBack(u32 battler) BtlController_HandleTrainerSlideBack(battler, 35, FALSE); } -static void RecordedOpponentHandleMoveAnimation(u32 battler) -{ - BtlController_HandleMoveAnimation(battler, FALSE); -} - -static void RecordedOpponentHandlePrintString(u32 battler) -{ - BtlController_HandlePrintString(battler, FALSE, FALSE); -} - static void RecordedOpponentHandleChooseAction(u32 battler) { BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, RecordedBattle_GetBattlerAction(RECORDED_ACTION_TYPE, battler), 0); - RecordedOpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } static void RecordedOpponentHandleChooseMove(u32 battler) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace(battler)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, ChooseMoveAndTargetInBattlePalace(battler)); } else { u8 moveId = RecordedBattle_GetBattlerAction(RECORDED_MOVE_SLOT, battler); u8 target = RecordedBattle_GetBattlerAction(RECORDED_MOVE_TARGET, battler); - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, moveId | (target << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, moveId | (target << 8)); } - RecordedOpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } static void RecordedOpponentHandleChooseItem(u32 battler) @@ -411,7 +362,7 @@ static void RecordedOpponentHandleChooseItem(u32 battler) gBattleStruct->itemPartyIndex[battler] = RecordedBattle_GetBattlerAction(RECORDED_ITEM_TARGET, battler); gBattleStruct->itemMoveIndex[battler] = RecordedBattle_GetBattlerAction(RECORDED_ITEM_MOVE, battler); BtlController_EmitOneReturnValue(battler, B_COMM_TO_ENGINE, gBattleStruct->chosenItem[battler]); - RecordedOpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } static void RecordedOpponentHandleChoosePokemon(u32 battler) @@ -419,12 +370,7 @@ static void RecordedOpponentHandleChoosePokemon(u32 battler) gBattleStruct->monToSwitchIntoId[battler] = RecordedBattle_GetBattlerAction(RECORDED_PARTY_INDEX, battler); gSelectedMonPartyId = gBattleStruct->monToSwitchIntoId[battler]; // Revival Blessing BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, gBattleStruct->monToSwitchIntoId[battler], NULL); - RecordedOpponentBufferExecCompleted(battler); -} - -static void RecordedOpponentHandleHealthBarUpdate(u32 battler) -{ - BtlController_HandleHealthBarUpdate(battler, FALSE); + BtlController_Complete(battler); } static void RecordedOpponentHandleStatusIconUpdate(u32 battler) @@ -452,11 +398,6 @@ static void RecordedOpponentHandleDrawPartyStatusSummary(u32 battler) BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_OPPONENT, TRUE); } -static void RecordedOpponentHandleBattleAnimation(u32 battler) -{ - BtlController_HandleBattleAnimation(battler, FALSE, FALSE); -} - static void RecordedOpponentHandleEndLinkBattle(u32 battler) { if (gBattleResources->bufferA[battler][1] == B_OUTCOME_DREW) @@ -466,6 +407,6 @@ static void RecordedOpponentHandleEndLinkBattle(u32 battler) FadeOutMapMusic(5); BeginFastPaletteFade(3); - RecordedOpponentBufferExecCompleted(battler); + BtlController_Complete(battler); gBattlerControllerFuncs[battler] = SetBattleEndCallbacks; } diff --git a/src/battle_controller_recorded_partner.c b/src/battle_controller_recorded_partner.c new file mode 100644 index 000000000000..d1353296354c --- /dev/null +++ b/src/battle_controller_recorded_partner.c @@ -0,0 +1,269 @@ +#include "global.h" +#include "battle.h" +#include "battle_ai_main.h" +#include "battle_ai_util.h" +#include "battle_anim.h" +#include "battle_controllers.h" +#include "battle_message.h" +#include "battle_interface.h" +#include "battle_setup.h" +#include "battle_tower.h" +#include "battle_z_move.h" +#include "bg.h" +#include "data.h" +#include "item_use.h" +#include "link.h" +#include "main.h" +#include "m4a.h" +#include "palette.h" +#include "party_menu.h" +#include "pokeball.h" +#include "pokemon.h" +#include "recorded_battle.h" +#include "reshow_battle_screen.h" +#include "sound.h" +#include "string_util.h" +#include "task.h" +#include "test_runner.h" +#include "text.h" +#include "util.h" +#include "window.h" +#include "constants/battle_anim.h" +#include "constants/battle_partner.h" +#include "constants/songs.h" +#include "constants/party_menu.h" +#include "constants/trainers.h" + +static void RecordedPartnerHandleDrawTrainerPic(u32 battler); +static void RecordedPartnerHandleTrainerSlideBack(u32 battler); +static void RecordedPartnerHandleChooseAction(u32 battler); +static void RecordedPartnerHandleChooseMove(u32 battler); +static void RecordedPartnerHandleChoosePokemon(u32 battler); +static void RecordedPartnerHandleIntroTrainerBallThrow(u32 battler); +static void RecordedPartnerHandleDrawPartyStatusSummary(u32 battler); +static void RecordedPartnerHandleEndLinkBattle(u32 battler); +static void RecordedPartnerBufferRunCommand(u32 battler); + +static void (*const sRecordedPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = +{ + [CONTROLLER_GETMONDATA] = BtlController_HandleGetMonData, + [CONTROLLER_GETRAWMONDATA] = BtlController_Empty, + [CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData, + [CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData, + [CONTROLLER_LOADMONSPRITE] = BtlController_HandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim, + [CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall, + [CONTROLLER_DRAWTRAINERPIC] = RecordedPartnerHandleDrawTrainerPic, + [CONTROLLER_TRAINERSLIDE] = BtlController_Empty, + [CONTROLLER_TRAINERSLIDEBACK] = RecordedPartnerHandleTrainerSlideBack, + [CONTROLLER_FAINTANIMATION] = BtlController_HandleFaintAnimation, + [CONTROLLER_PALETTEFADE] = BtlController_Empty, + [CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty, + [CONTROLLER_BALLTHROWANIM] = BtlController_Empty, + [CONTROLLER_PAUSE] = BtlController_Empty, + [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_Empty, + [CONTROLLER_CHOOSEACTION] = RecordedPartnerHandleChooseAction, + [CONTROLLER_YESNOBOX] = BtlController_Empty, + [CONTROLLER_CHOOSEMOVE] = RecordedPartnerHandleChooseMove, + [CONTROLLER_OPENBAG] = BtlController_Empty, + [CONTROLLER_CHOOSEPOKEMON] = RecordedPartnerHandleChoosePokemon, + [CONTROLLER_23] = BtlController_Empty, + [CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate, + [CONTROLLER_EXPUPDATE] = PlayerHandleExpUpdate, // Partner's player gets experience the same way as the player. + [CONTROLLER_STATUSICONUPDATE] = BtlController_HandleStatusIconUpdate, + [CONTROLLER_STATUSANIMATION] = BtlController_HandleStatusAnimation, + [CONTROLLER_STATUSXOR] = BtlController_Empty, + [CONTROLLER_DATATRANSFER] = BtlController_Empty, + [CONTROLLER_DMA3TRANSFER] = BtlController_Empty, + [CONTROLLER_PLAYBGM] = BtlController_Empty, + [CONTROLLER_32] = BtlController_Empty, + [CONTROLLER_TWORETURNVALUES] = BtlController_Empty, + [CONTROLLER_CHOSENMONRETURNVALUE] = BtlController_Empty, + [CONTROLLER_ONERETURNVALUE] = BtlController_Empty, + [CONTROLLER_ONERETURNVALUE_DUPLICATE] = BtlController_Empty, + [CONTROLLER_HITANIMATION] = BtlController_HandleHitAnimation, + [CONTROLLER_CANTSWITCH] = BtlController_Empty, + [CONTROLLER_PLAYSE] = BtlController_HandlePlaySE, + [CONTROLLER_PLAYFANFAREORBGM] = BtlController_HandlePlayFanfareOrBGM, + [CONTROLLER_FAINTINGCRY] = BtlController_HandleFaintingCry, + [CONTROLLER_INTROSLIDE] = BtlController_HandleIntroSlide, + [CONTROLLER_INTROTRAINERBALLTHROW] = RecordedPartnerHandleIntroTrainerBallThrow, + [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = RecordedPartnerHandleDrawPartyStatusSummary, + [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary, + [CONTROLLER_ENDBOUNCE] = BtlController_Empty, + [CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility, + [CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation, + [CONTROLLER_LINKSTANDBYMSG] = BtlController_Empty, + [CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty, + [CONTROLLER_ENDLINKBATTLE] = RecordedPartnerHandleEndLinkBattle, + [CONTROLLER_DEBUGMENU] = BtlController_Empty, + [CONTROLLER_TERMINATOR_NOP] = BtlController_TerminatorNop +}; + +void SetControllerToRecordedPartner(u32 battler) +{ + gBattlerControllerEndFuncs[battler] = RecordedPartnerBufferExecCompleted; + gBattlerControllerFuncs[battler] = RecordedPartnerBufferRunCommand; +} + +static void RecordedPartnerBufferRunCommand(u32 battler) +{ + if (IsBattleControllerActiveOnLocal(battler)) + { + if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sRecordedPartnerBufferCommands)) + sRecordedPartnerBufferCommands[gBattleResources->bufferA[battler][0]](battler); + else + BtlController_Complete(battler); + } +} + +static void Intro_WaitForHealthbox(u32 battler) +{ + bool32 finished = FALSE; + + if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) + { + if (gSprites[gHealthboxSpriteIds[battler]].callback == SpriteCallbackDummy) + finished = TRUE; + } + else + { + if (gSprites[gHealthboxSpriteIds[battler]].callback == SpriteCallbackDummy + && gSprites[gHealthboxSpriteIds[BATTLE_PARTNER(battler)]].callback == SpriteCallbackDummy) + { + finished = TRUE; + } + } + + if (IsCryPlayingOrClearCrySongs()) + finished = FALSE; + + if (finished) + { + gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3; + gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd; + } +} + +void Controller_RecordedPartnerShowIntroHealthbox(u32 battler) +{ + if (!gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive + && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].ballAnimActive + && gSprites[gBattleControllerData[battler]].callback == SpriteCallbackDummy + && gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy + && ++gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay != 1) + { + gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0; + TryShinyAnimation(battler, GetBattlerMon(battler)); + + if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { + DestroySprite(&gSprites[gBattleControllerData[BATTLE_PARTNER(battler)]]); + UpdateHealthboxAttribute(gHealthboxSpriteIds[BATTLE_PARTNER(battler)], GetBattlerMon(BATTLE_PARTNER(battler)), HEALTHBOX_ALL); + StartHealthboxSlideIn(BATTLE_PARTNER(battler)); + SetHealthboxSpriteVisible(gHealthboxSpriteIds[BATTLE_PARTNER(battler)]); + } + + DestroySprite(&gSprites[gBattleControllerData[battler]]); + UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_ALL); + StartHealthboxSlideIn(battler); + SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]); + + gBattleSpritesDataPtr->animationData->introAnimActive = FALSE; + + gBattlerControllerFuncs[battler] = Intro_WaitForHealthbox; + } +} + +void RecordedPartnerBufferExecCompleted(u32 battler) +{ + gBattlerControllerFuncs[battler] = RecordedPartnerBufferRunCommand; + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + u8 playerId = GetMultiplayerId(); + + PrepareBufferDataTransferLink(battler, B_COMM_CONTROLLER_IS_DONE, 4, &playerId); + gBattleResources->bufferA[battler][0] = CONTROLLER_TERMINATOR_NOP; + } + else + { + MarkBattleControllerIdleOnLocal(battler); + } +} + +// some explanation here +// in emerald it's possible to have a tag battle in the battle frontier facilities with AI +// which use the front sprite for both the player and the partner as opposed to any other battles (including the one with Steven) that use the back pic as well as animate it +static void RecordedPartnerHandleDrawTrainerPic(u32 battler) +{ + bool32 isFrontPic; + s16 xPos, yPos; + u32 trainerPicId; + + trainerPicId = TRAINER_BACK_PIC_STEVEN; + xPos = 90; + yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; + + isFrontPic = FALSE; + + BtlController_HandleDrawTrainerPic(battler, trainerPicId, isFrontPic, xPos, yPos, -1); +} + +static void RecordedPartnerHandleTrainerSlideBack(u32 battler) +{ + BtlController_HandleTrainerSlideBack(battler, 35, FALSE); +} + +static void RecordedPartnerHandleChooseAction(u32 battler) +{ + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, RecordedBattle_GetBattlerAction(RECORDED_ACTION_TYPE, battler), 0); + BtlController_Complete(battler); +} + +static void RecordedPartnerHandleChooseMove(u32 battler) +{ + u8 moveIndex = RecordedBattle_GetBattlerAction(RECORDED_MOVE_SLOT, battler); + u8 target = RecordedBattle_GetBattlerAction(RECORDED_MOVE_TARGET, battler); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, moveIndex | (target << 8)); + + BtlController_Complete(battler); +} + +static void RecordedPartnerHandleChoosePokemon(u32 battler) +{ + gBattleStruct->monToSwitchIntoId[battler] = RecordedBattle_GetBattlerAction(RECORDED_PARTY_INDEX, battler); + gSelectedMonPartyId = gBattleStruct->monToSwitchIntoId[battler]; // Revival Blessing + BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, gBattleStruct->monToSwitchIntoId[battler], NULL); + BtlController_Complete(battler); +} + +static void RecordedPartnerHandleIntroTrainerBallThrow(u32 battler) +{ + const u16 *trainerPal; + enum DifficultyLevel difficulty = GetBattlePartnerDifficultyLevel(gPartnerTrainerId); + + if (gPartnerTrainerId > TRAINER_PARTNER(PARTNER_NONE)) + trainerPal = gTrainerBacksprites[gBattlePartners[difficulty][gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerPic].palette.data; + else if (IsAiVsAiBattle()) + trainerPal = gTrainerSprites[GetTrainerPicFromId(gPartnerTrainerId)].palette.data; + else + trainerPal = gTrainerSprites[GetFrontierTrainerFrontSpriteId(gPartnerTrainerId)].palette.data; // 2 vs 2 multi battle in Battle Frontier, load front sprite and pal. + + BtlController_HandleIntroTrainerBallThrow(battler, 0xD6F9, trainerPal, 24, Controller_RecordedPartnerShowIntroHealthbox); +} + +static void RecordedPartnerHandleDrawPartyStatusSummary(u32 battler) +{ + BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_PLAYER, TRUE); +} + +static void RecordedPartnerHandleEndLinkBattle(u32 battler) +{ + gBattleOutcome = gBattleResources->bufferA[battler][1]; + FadeOutMapMusic(5); + BeginFastPaletteFade(3); + BtlController_Complete(battler); + gBattlerControllerFuncs[battler] = SetBattleEndCallbacks; +} diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index a3032db1a8e4..51bfa5327b56 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -28,28 +28,21 @@ #include "constants/battle_anim.h" #include "constants/songs.h" #include "constants/trainers.h" +#include "test/battle.h" +#include "test/test_runner_battle.h" -static void RecordedPlayerHandleLoadMonSprite(u32 battler); -static void RecordedPlayerHandleSwitchInAnim(u32 battler); static void RecordedPlayerHandleDrawTrainerPic(u32 battler); static void RecordedPlayerHandleTrainerSlideBack(u32 battler); -static void RecordedPlayerHandleMoveAnimation(u32 battler); -static void RecordedPlayerHandlePrintString(u32 battler); static void RecordedPlayerHandleChooseAction(u32 battler); static void RecordedPlayerHandleChooseMove(u32 battler); static void RecordedPlayerHandleChooseItem(u32 battler); static void RecordedPlayerHandleChoosePokemon(u32 battler); -static void RecordedPlayerHandleHealthBarUpdate(u32 battler); static void RecordedPlayerHandleStatusIconUpdate(u32 battler); static void RecordedPlayerHandleStatusAnimation(u32 battler); static void RecordedPlayerHandleIntroTrainerBallThrow(u32 battler); static void RecordedPlayerHandleDrawPartyStatusSummary(u32 battler); -static void RecordedPlayerHandleBattleAnimation(u32 battler); static void RecordedPlayerHandleEndLinkBattle(u32 battler); - static void RecordedPlayerBufferRunCommand(u32 battler); -static void RecordedPlayerBufferExecCompleted(u32 battler); -static void SwitchIn_WaitAndEnd(u32 battler); static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = { @@ -57,8 +50,8 @@ static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 ba [CONTROLLER_GETRAWMONDATA] = BtlController_Empty, [CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData, [CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData, - [CONTROLLER_LOADMONSPRITE] = RecordedPlayerHandleLoadMonSprite, - [CONTROLLER_SWITCHINANIM] = RecordedPlayerHandleSwitchInAnim, + [CONTROLLER_LOADMONSPRITE] = BtlController_HandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = RecordedPlayerHandleDrawTrainerPic, [CONTROLLER_TRAINERSLIDE] = BtlController_Empty, @@ -68,8 +61,8 @@ static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 ba [CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty, [CONTROLLER_BALLTHROWANIM] = PlayerHandleBallThrowAnim, [CONTROLLER_PAUSE] = BtlController_Empty, - [CONTROLLER_MOVEANIMATION] = RecordedPlayerHandleMoveAnimation, - [CONTROLLER_PRINTSTRING] = RecordedPlayerHandlePrintString, + [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, [CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_Empty, [CONTROLLER_CHOOSEACTION] = RecordedPlayerHandleChooseAction, [CONTROLLER_YESNOBOX] = BtlController_Empty, @@ -77,7 +70,7 @@ static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 ba [CONTROLLER_OPENBAG] = RecordedPlayerHandleChooseItem, [CONTROLLER_CHOOSEPOKEMON] = RecordedPlayerHandleChoosePokemon, [CONTROLLER_23] = BtlController_Empty, - [CONTROLLER_HEALTHBARUPDATE] = RecordedPlayerHandleHealthBarUpdate, + [CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = PlayerHandleExpUpdate, [CONTROLLER_STATUSICONUPDATE] = RecordedPlayerHandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = RecordedPlayerHandleStatusAnimation, @@ -101,7 +94,7 @@ static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 ba [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary, [CONTROLLER_ENDBOUNCE] = BtlController_Empty, [CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility, - [CONTROLLER_BATTLEANIMATION] = RecordedPlayerHandleBattleAnimation, + [CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = BtlController_Empty, [CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty, [CONTROLLER_ENDLINKBATTLE] = RecordedPlayerHandleEndLinkBattle, @@ -122,16 +115,7 @@ static void RecordedPlayerBufferRunCommand(u32 battler) if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sRecordedPlayerBufferCommands)) sRecordedPlayerBufferCommands[gBattleResources->bufferA[battler][0]](battler); else - RecordedPlayerBufferExecCompleted(battler); - } -} - -static void Intro_DelayAndEnd(u32 battler) -{ - if (--gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay == (u8)-1) - { - gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0; - RecordedPlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -164,15 +148,14 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + FreeShinyStars(); HandleLowHpMusicChange(GetBattlerMon(battler), battler); if (IsDoubleBattle()) HandleLowHpMusicChange(GetBattlerMon(BATTLE_PARTNER(battler)), BATTLE_PARTNER(battler)); gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3; - gBattlerControllerFuncs[battler] = Intro_DelayAndEnd; + gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd; } } else @@ -197,7 +180,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) if (healthboxAnimDone) { gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3; - gBattlerControllerFuncs[battler] = Intro_DelayAndEnd; + gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd; } } } @@ -271,37 +254,7 @@ static void Intro_TryShinyAnimShowHealthbox(u32 battler) } } -static void WaitForMonAnimAfterLoad(u32 battler) -{ - if (gSprites[gBattlerSpriteIds[battler]].animEnded && gSprites[gBattlerSpriteIds[battler]].x2 == 0) - RecordedPlayerBufferExecCompleted(battler); -} - -static void SwitchIn_ShowSubstitute(u32 battler) -{ - if (SwitchIn_ShowSubstituteUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_WaitAndEnd; -} - -static void SwitchIn_WaitAndEnd(u32 battler) -{ - if (SwitchIn_WaitAndEndUtil(battler)) - RecordedPlayerBufferExecCompleted(battler); -} - -static void SwitchIn_ShowHealthbox(u32 battler) -{ - if (SwitchIn_ShowHealthboxUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute; -} - -static void SwitchIn_TryShinyAnim(u32 battler) -{ - if (SwitchIn_TryShinyAnimUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox; -} - -static void RecordedPlayerBufferExecCompleted(u32 battler) +void RecordedPlayerBufferExecCompleted(u32 battler) { gBattlerControllerFuncs[battler] = RecordedPlayerBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) @@ -317,59 +270,60 @@ static void RecordedPlayerBufferExecCompleted(u32 battler) } } -static void RecordedPlayerHandleLoadMonSprite(u32 battler) -{ - BtlController_HandleLoadMonSprite(battler, WaitForMonAnimAfterLoad); -} - -static void RecordedPlayerHandleSwitchInAnim(u32 battler) -{ - BtlController_HandleSwitchInAnim(battler, TRUE, SwitchIn_TryShinyAnim); -} - static void RecordedPlayerHandleDrawTrainerPic(u32 battler) { bool32 isFrontPic; s16 xPos, yPos; u32 trainerPicId; - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) + // Sets Multibattle test player sprites to not be Hiker + if (IsMultibattleTest()) { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - trainerPicId = GetBattlerLinkPlayerGender(battler); + trainerPicId = TRAINER_BACK_PIC_BRENDAN; + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + xPos = 32; else - trainerPicId = gLinkPlayers[gRecordedBattleMultiplayerId].gender; - } - else - { - trainerPicId = gLinkPlayers[0].gender; + xPos = 80; + yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; } - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + else { - if ((GetBattlerPosition(battler) & BIT_FLANK) != 0) // second mon - xPos = 90; - else // first mon - xPos = 32; + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) + { + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + trainerPicId = GetBattlerLinkPlayerGender(battler); + else + trainerPicId = gLinkPlayers[gRecordedBattleMultiplayerId].gender; + } + else + trainerPicId = gLinkPlayers[0].gender; - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - xPos = 90; - yPos = 80; + if ((GetBattlerPosition(battler) & BIT_FLANK) != 0) // second mon + xPos = 90; + else // first mon + xPos = 32; + + // !TESTING added as otherwise first test battle sprite is positioned incorrectly + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && !TESTING) + { + xPos = 90; + yPos = 80; + } + else + { + yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; + } } else { + xPos = 80; yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; } - - } - else - { - xPos = 80; - yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; } - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && !TESTING) isFrontPic = TRUE; else isFrontPic = FALSE; @@ -382,22 +336,12 @@ static void RecordedPlayerHandleTrainerSlideBack(u32 battler) BtlController_HandleTrainerSlideBack(battler, 35, FALSE); } -static void RecordedPlayerHandleMoveAnimation(u32 battler) -{ - BtlController_HandleMoveAnimation(battler, FALSE); -} - -static void RecordedPlayerHandlePrintString(u32 battler) -{ - BtlController_HandlePrintString(battler, FALSE, FALSE); -} - static void ChooseActionInBattlePalace(u32 battler) { if (gBattleCommunication[4] >= gBattlersCount / 2) { BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, RecordedBattle_GetBattlerAction(RECORDED_BATTLE_PALACE_ACTION, battler), 0); - RecordedPlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -410,7 +354,7 @@ static void RecordedPlayerHandleChooseAction(u32 battler) else { BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, RecordedBattle_GetBattlerAction(RECORDED_ACTION_TYPE, battler), 0); - RecordedPlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -418,16 +362,16 @@ static void RecordedPlayerHandleChooseMove(u32 battler) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace(battler)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, ChooseMoveAndTargetInBattlePalace(battler)); } else { u8 moveIndex = RecordedBattle_GetBattlerAction(RECORDED_MOVE_SLOT, battler); u8 target = RecordedBattle_GetBattlerAction(RECORDED_MOVE_TARGET, battler); - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, moveIndex | (target << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, moveIndex | (target << 8)); } - RecordedPlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void RecordedPlayerHandleChooseItem(u32 battler) @@ -438,7 +382,7 @@ static void RecordedPlayerHandleChooseItem(u32 battler) gBattleStruct->itemPartyIndex[battler] = RecordedBattle_GetBattlerAction(RECORDED_ITEM_TARGET, battler); gBattleStruct->itemMoveIndex[battler] = RecordedBattle_GetBattlerAction(RECORDED_ITEM_MOVE, battler); BtlController_EmitOneReturnValue(battler, B_COMM_TO_ENGINE, gBattleStruct->chosenItem[battler]); - RecordedPlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void RecordedPlayerHandleChoosePokemon(u32 battler) @@ -446,12 +390,7 @@ static void RecordedPlayerHandleChoosePokemon(u32 battler) gBattleStruct->monToSwitchIntoId[battler] = RecordedBattle_GetBattlerAction(RECORDED_PARTY_INDEX, battler); gSelectedMonPartyId = gBattleStruct->monToSwitchIntoId[battler]; // Revival Blessing BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, gBattleStruct->monToSwitchIntoId[battler], NULL); - RecordedPlayerBufferExecCompleted(battler); -} - -static void RecordedPlayerHandleHealthBarUpdate(u32 battler) -{ - BtlController_HandleHealthBarUpdate(battler, TRUE); + BtlController_Complete(battler); } static void RecordedPlayerHandleStatusIconUpdate(u32 battler) @@ -488,16 +427,11 @@ static void RecordedPlayerHandleDrawPartyStatusSummary(u32 battler) BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_PLAYER, TRUE); } -static void RecordedPlayerHandleBattleAnimation(u32 battler) -{ - BtlController_HandleBattleAnimation(battler, FALSE, FALSE); -} - static void RecordedPlayerHandleEndLinkBattle(u32 battler) { gBattleOutcome = gBattleResources->bufferA[battler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); - RecordedPlayerBufferExecCompleted(battler); + BtlController_Complete(battler); gBattlerControllerFuncs[battler] = SetBattleEndCallbacks; } diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index 9311c2f7a1fa..c8f5cf193975 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -31,19 +31,15 @@ static void SafariHandleDrawTrainerPic(u32 battler); static void SafariHandleSuccessBallThrowAnim(u32 battler); static void SafariHandleBallThrowAnim(u32 battler); -static void SafariHandlePrintString(u32 battler); -static void SafariHandlePrintSelectionString(u32 battler); static void SafariHandleChooseAction(u32 battler); static void SafariHandleChooseItem(u32 battler); static void SafariHandleChoosePokemon(u32 battler); static void SafariHandleStatusIconUpdate(u32 battler); static void SafariHandleFaintingCry(u32 battler); static void SafariHandleIntroTrainerBallThrow(u32 battler); -static void SafariHandleBattleAnimation(u32 battler); static void SafariHandleEndLinkBattle(u32 battler); static void SafariBufferRunCommand(u32 battler); -static void SafariBufferExecCompleted(u32 battler); static void CompleteWhenChosePokeblock(u32 battler); static void WaitForMonSelection(u32 battler); @@ -65,8 +61,8 @@ static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_BALLTHROWANIM] = SafariHandleBallThrowAnim, [CONTROLLER_PAUSE] = BtlController_Empty, [CONTROLLER_MOVEANIMATION] = BtlController_Empty, - [CONTROLLER_PRINTSTRING] = SafariHandlePrintString, - [CONTROLLER_PRINTSTRINGPLAYERONLY] = SafariHandlePrintSelectionString, + [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_HandlePrintStringPlayerOnly, [CONTROLLER_CHOOSEACTION] = SafariHandleChooseAction, [CONTROLLER_YESNOBOX] = BtlController_Empty, [CONTROLLER_CHOOSEMOVE] = BtlController_Empty, @@ -97,7 +93,7 @@ static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_Empty, [CONTROLLER_ENDBOUNCE] = BtlController_Empty, [CONTROLLER_SPRITEINVISIBILITY] = BtlController_Empty, - [CONTROLLER_BATTLEANIMATION] = SafariHandleBattleAnimation, + [CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = BtlController_Empty, [CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty, [CONTROLLER_ENDLINKBATTLE] = SafariHandleEndLinkBattle, @@ -118,7 +114,7 @@ static void SafariBufferRunCommand(u32 battler) if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sSafariBufferCommands)) sSafariBufferCommands[gBattleResources->bufferA[battler][0]](battler); else - SafariBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -143,7 +139,7 @@ static void HandleInputChooseAction(u32 battler) BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_SAFARI_RUN, 0); break; } - SafariBufferExecCompleted(battler); + BtlController_Complete(battler); } else if (JOY_NEW(DPAD_LEFT)) { @@ -197,7 +193,7 @@ static void HandleInputChooseAction(u32 battler) static void Controller_WaitForHealthbox(u32 battler) { if (gSprites[gHealthboxSpriteIds[battler]].callback == SpriteCallbackDummy) - SafariBufferExecCompleted(battler); + BtlController_Complete(battler); } static void SafariSetBattleEndCallbacks(u32 battler) @@ -225,7 +221,7 @@ static void CompleteWhenChosePokeblock(u32 battler) if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { BtlController_EmitOneReturnValue(battler, B_COMM_TO_ENGINE, gSpecialVar_ItemId); - SafariBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -264,7 +260,7 @@ static void WaitForMonSelection(u32 battler) } } -static void SafariBufferExecCompleted(u32 battler) +void SafariBufferExecCompleted(u32 battler) { gBattlerControllerFuncs[battler] = SafariBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) @@ -299,19 +295,6 @@ static void SafariHandleBallThrowAnim(u32 battler) BtlController_HandleBallThrowAnim(battler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER, FALSE); } -static void SafariHandlePrintString(u32 battler) -{ - BtlController_HandlePrintString(battler, FALSE, FALSE); -} - -static void SafariHandlePrintSelectionString(u32 battler) -{ - if (IsOnPlayerSide(battler)) - SafariHandlePrintString(battler); - else - SafariBufferExecCompleted(battler); -} - static void HandleChooseActionAfterDma3(u32 battler) { if (!IsDma3ManagerBusyWithBgCopy()) @@ -372,7 +355,7 @@ static void SafariHandleChoosePokemon(u32 battler) static void SafariHandleStatusIconUpdate(u32 battler) { UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_SAFARI_BALLS_TEXT); - SafariBufferExecCompleted(battler); + BtlController_Complete(battler); } // All of the other controllers(except Wally's) use CRY_MODE_FAINT. @@ -382,8 +365,8 @@ static void SafariHandleFaintingCry(u32 battler) u16 species = GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES); PlayCry_Normal(species, 25); - SafariBufferExecCompleted(battler); - SafariBufferExecCompleted(battler); + BtlController_Complete(battler); + BtlController_Complete(battler); } static void SafariHandleIntroTrainerBallThrow(u32 battler) @@ -394,17 +377,12 @@ static void SafariHandleIntroTrainerBallThrow(u32 battler) gBattlerControllerFuncs[battler] = Controller_WaitForHealthbox; } -static void SafariHandleBattleAnimation(u32 battler) -{ - BtlController_HandleBattleAnimation(battler, TRUE, FALSE); -} - static void SafariHandleEndLinkBattle(u32 battler) { gBattleOutcome = gBattleResources->bufferA[battler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); - SafariBufferExecCompleted(battler); + BtlController_Complete(battler); if ((gBattleTypeFlags & BATTLE_TYPE_LINK) && !(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER)) gBattlerControllerFuncs[battler] = SafariSetBattleEndCallbacks; } diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index 6cba0fc3e75d..11955787d957 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -36,22 +36,15 @@ static void WallyHandleDrawTrainerPic(u32 battler); static void WallyHandleTrainerSlide(u32 battler); static void WallyHandleSuccessBallThrowAnim(u32 battler); static void WallyHandleBallThrowAnim(u32 battler); -static void WallyHandleMoveAnimation(u32 battler); -static void WallyHandlePrintString(u32 battler); -static void WallyHandlePrintSelectionString(u32 battler); static void WallyHandleChooseAction(u32 battler); static void WallyHandleChooseMove(u32 battler); static void WallyHandleChooseItem(u32 battler); -static void WallyHandleHealthBarUpdate(u32 battler); -static void WallyHandlePlaySE(u32 battler); static void WallyHandleFaintingCry(u32 battler); static void WallyHandleIntroTrainerBallThrow(u32 battler); static void WallyHandleDrawPartyStatusSummary(u32 battler); -static void WallyHandleBattleAnimation(u32 battler); static void WallyHandleEndLinkBattle(u32 battler); static void WallyBufferRunCommand(u32 battler); -static void WallyBufferExecCompleted(u32 battler); static void CompleteOnChosenItem(u32 battler); static void Intro_WaitForShinyAnimAndHealthbox(u32 battler); @@ -72,16 +65,16 @@ static void (*const sWallyBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_SUCCESSBALLTHROWANIM] = WallyHandleSuccessBallThrowAnim, [CONTROLLER_BALLTHROWANIM] = WallyHandleBallThrowAnim, [CONTROLLER_PAUSE] = BtlController_Empty, - [CONTROLLER_MOVEANIMATION] = WallyHandleMoveAnimation, - [CONTROLLER_PRINTSTRING] = WallyHandlePrintString, - [CONTROLLER_PRINTSTRINGPLAYERONLY] = WallyHandlePrintSelectionString, + [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_HandlePrintStringPlayerOnly, [CONTROLLER_CHOOSEACTION] = WallyHandleChooseAction, [CONTROLLER_YESNOBOX] = BtlController_Empty, [CONTROLLER_CHOOSEMOVE] = WallyHandleChooseMove, [CONTROLLER_OPENBAG] = WallyHandleChooseItem, [CONTROLLER_CHOOSEPOKEMON] = BtlController_Empty, [CONTROLLER_23] = BtlController_Empty, - [CONTROLLER_HEALTHBARUPDATE] = WallyHandleHealthBarUpdate, + [CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = BtlController_Empty, [CONTROLLER_STATUSICONUPDATE] = BtlController_Empty, [CONTROLLER_STATUSANIMATION] = BtlController_Empty, @@ -96,7 +89,7 @@ static void (*const sWallyBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_ONERETURNVALUE_DUPLICATE] = BtlController_Empty, [CONTROLLER_HITANIMATION] = BtlController_HandleHitAnimation, [CONTROLLER_CANTSWITCH] = BtlController_Empty, - [CONTROLLER_PLAYSE] = WallyHandlePlaySE, + [CONTROLLER_PLAYSE] = BtlController_HandlePlaySE, [CONTROLLER_PLAYFANFAREORBGM] = BtlController_HandlePlayFanfareOrBGM, [CONTROLLER_FAINTINGCRY] = WallyHandleFaintingCry, [CONTROLLER_INTROSLIDE] = BtlController_HandleIntroSlide, @@ -105,7 +98,7 @@ static void (*const sWallyBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_Empty, [CONTROLLER_ENDBOUNCE] = BtlController_Empty, [CONTROLLER_SPRITEINVISIBILITY] = BtlController_Empty, - [CONTROLLER_BATTLEANIMATION] = WallyHandleBattleAnimation, + [CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = BtlController_Empty, [CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty, [CONTROLLER_ENDLINKBATTLE] = WallyHandleEndLinkBattle, @@ -130,7 +123,7 @@ static void WallyBufferRunCommand(u32 battler) if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sWallyBufferCommands)) sWallyBufferCommands[gBattleResources->bufferA[battler][0]](battler); else - WallyBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -146,7 +139,7 @@ static void WallyHandleActions(u32 battler) { PlaySE(SE_SELECT); BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_USE_MOVE, 0); - WallyBufferExecCompleted(battler); + BtlController_Complete(battler); gBattleStruct->wallyBattleState++; gBattleStruct->wallyMovesState = 0; gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG; @@ -157,7 +150,7 @@ static void WallyHandleActions(u32 battler) { PlaySE(SE_SELECT); BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_USE_MOVE, 0); - WallyBufferExecCompleted(battler); + BtlController_Complete(battler); gBattleStruct->wallyBattleState++; gBattleStruct->wallyMovesState = 0; gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG; @@ -167,7 +160,7 @@ static void WallyHandleActions(u32 battler) if (--gBattleStruct->wallyWaitFrames == 0) { BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_WALLY_THROW, 0); - WallyBufferExecCompleted(battler); + BtlController_Complete(battler); gBattleStruct->wallyBattleState++; gBattleStruct->wallyMovesState = 0; gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG; @@ -188,7 +181,7 @@ static void WallyHandleActions(u32 battler) { PlaySE(SE_SELECT); BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_USE_ITEM, 0); - WallyBufferExecCompleted(battler); + BtlController_Complete(battler); } break; } @@ -210,7 +203,7 @@ static void CompleteOnChosenItem(u32 battler) if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { BtlController_EmitOneReturnValue(battler, B_COMM_TO_ENGINE, gSpecialVar_ItemId); - WallyBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -262,17 +255,16 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + FreeShinyStars(); CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); HandleLowHpMusicChange(GetBattlerMon(battler), battler); - WallyBufferExecCompleted(battler); + BtlController_Complete(battler); } } -static void WallyBufferExecCompleted(u32 battler) +void WallyBufferExecCompleted(u32 battler) { gBattlerControllerFuncs[battler] = WallyBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) @@ -314,24 +306,6 @@ static void WallyHandleBallThrowAnim(u32 battler) BtlController_HandleBallThrowAnim(battler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER, FALSE); } -static void WallyHandleMoveAnimation(u32 battler) -{ - BtlController_HandleMoveAnimation(battler, FALSE); -} - -static void WallyHandlePrintString(u32 battler) -{ - BtlController_HandlePrintString(battler, FALSE, FALSE); -} - -static void WallyHandlePrintSelectionString(u32 battler) -{ - if (IsOnPlayerSide(battler)) - WallyHandlePrintString(battler); - else - WallyBufferExecCompleted(battler); -} - static void HandleChooseActionAfterDma3(u32 battler) { if (!IsDma3ManagerBusyWithBgCopy()) @@ -378,8 +352,8 @@ static void WallyHandleChooseMove(u32 battler) if (--gBattleStruct->wallyMoveFrames == 0) { PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, 0x100); - WallyBufferExecCompleted(battler); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, 0x100); + BtlController_Complete(battler); } break; } @@ -392,18 +366,6 @@ static void WallyHandleChooseItem(u32 battler) gBattlerInMenuId = battler; } -static void WallyHandleHealthBarUpdate(u32 battler) -{ - BtlController_HandleHealthBarUpdate(battler, TRUE); -} - -// For some reason Wally's SE don't take side into account and pan is always the same. Possibly a bug -static void WallyHandlePlaySE(u32 battler) -{ - PlaySE(gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8)); - WallyBufferExecCompleted(battler); -} - // All of the other controllers use CRY_MODE_FAINT. // Wally's PokΓ©mon during the tutorial is never intended to faint, so that's probably why it's different here. static void WallyHandleFaintingCry(u32 battler) @@ -411,7 +373,7 @@ static void WallyHandleFaintingCry(u32 battler) u16 species = GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES); PlayCry_Normal(species, 25); - WallyBufferExecCompleted(battler); + BtlController_Complete(battler); } static void WallyHandleIntroTrainerBallThrow(u32 battler) @@ -425,17 +387,12 @@ static void WallyHandleDrawPartyStatusSummary(u32 battler) BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_PLAYER, FALSE); } -static void WallyHandleBattleAnimation(u32 battler) -{ - BtlController_HandleBattleAnimation(battler, TRUE, FALSE); -} - static void WallyHandleEndLinkBattle(u32 battler) { gBattleOutcome = gBattleResources->bufferA[battler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); - WallyBufferExecCompleted(battler); + BtlController_Complete(battler); if (!(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) && gBattleTypeFlags & BATTLE_TYPE_LINK) gBattlerControllerFuncs[battler] = SetBattleEndCallbacks; diff --git a/src/battle_controllers.c b/src/battle_controllers.c index ec3dfa742602..06ed79c89287 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -12,9 +12,11 @@ #include "battle_tv.h" #include "cable_club.h" #include "event_object_movement.h" +#include "item.h" #include "link.h" #include "link_rfu.h" #include "m4a.h" +#include "overworld.h" #include "palette.h" #include "party_menu.h" #include "recorded_battle.h" @@ -25,7 +27,11 @@ #include "util.h" #include "text.h" #include "constants/abilities.h" +#include "constants/item_effects.h" #include "constants/songs.h" +#include "test/battle.h" +#include "test/test.h" +#include "test/test_runner_battle.h" #include "pokemon_animation.h" static EWRAM_DATA u8 sLinkSendTaskId = 0; @@ -36,8 +42,7 @@ COMMON_DATA u8 gBattleControllerData[MAX_BATTLERS_COUNT] = {0}; // Used by the b COMMON_DATA void (*gBattlerControllerEndFuncs[MAX_BATTLERS_COUNT])(u32 battler) = {0}; // Controller's buffer complete function for each battler static void CreateTasksForSendRecvLinkBuffers(void); -static void InitLinkBtlControllers(void); -static void InitSinglePlayerBtlControllers(void); +static void InitBtlControllersInternal(void); static void SetBattlePartyIds(void); static void Task_HandleSendLinkBuffersData(u8 taskId); static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId); @@ -102,10 +107,7 @@ void InitBattleControllers(void) if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) RecordedBattle_SaveParties(); - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - InitLinkBtlControllers(); - else - InitSinglePlayerBtlControllers(); + InitBtlControllersInternal(); SetBattlePartyIds(); @@ -122,492 +124,200 @@ void InitBattleControllers(void) *((u8 *)(&gBattleStruct->tv) + i) = 0; } -static void InitSinglePlayerBtlControllers(void) +static void InitBtlControllersInternal(void) { s32 i; - - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) - { + bool32 isLink = (gBattleTypeFlags & BATTLE_TYPE_LINK); + bool32 isDouble = IsDoubleBattle(); + bool32 isMaster = (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER); + bool32 isRecorded = (gBattleTypeFlags & BATTLE_TYPE_RECORDED); + bool32 isRecordedMaster = (gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER); + bool32 isRecordedLink = (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK); + bool32 isMulti = (gBattleTypeFlags & BATTLE_TYPE_MULTI); + bool32 isInGamePartner = (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER); + bool32 isAIvsAI = IsAiVsAiBattle(); + + if (!isLink || isMaster) gBattleMainFunc = BeginBattleIntro; - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) - { - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedPlayer; - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayerPartner; - gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; - - gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; - } - else - { - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer; - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayerPartner; - gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; - - gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; - } - + if (!isDouble) + gBattlersCount = 2; + else gBattlersCount = MAX_BATTLERS_COUNT; - BufferBattlePartyCurrentOrderBySide(0, 0); - BufferBattlePartyCurrentOrderBySide(1, 0); - BufferBattlePartyCurrentOrderBySide(2, 1); - BufferBattlePartyCurrentOrderBySide(3, 1); - - gBattlerPartyIndexes[0] = 0; - gBattlerPartyIndexes[1] = 0; - if (BATTLE_TWO_VS_ONE_OPPONENT || WILD_DOUBLE_BATTLE) - { - gBattlerPartyIndexes[2] = 3; - gBattlerPartyIndexes[3] = 1; - } + if ((gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + || !isMulti + || (IsMultibattleTest()) + || (!isLink && !isRecorded) + || (isLink && !isDouble)) + { + bool32 isPlayerPrimary; + if (isLink) + isPlayerPrimary = (isMaster || (isDouble && isMulti)); + else if (!isRecorded) + isPlayerPrimary = TRUE; + else if (isDouble) + isPlayerPrimary = (isInGamePartner || isMulti || isMaster); else + isPlayerPrimary = (!isRecordedLink || isRecordedMaster); + + gBattlerPositions[B_BATTLER_0] = isPlayerPrimary ? B_POSITION_PLAYER_LEFT : B_POSITION_OPPONENT_LEFT; + gBattlerPositions[B_BATTLER_1] = isPlayerPrimary ? B_POSITION_OPPONENT_LEFT : B_POSITION_PLAYER_LEFT; + if (isDouble) { - gBattlerPartyIndexes[2] = 3; - gBattlerPartyIndexes[3] = 3; + gBattlerPositions[B_BATTLER_2] = isPlayerPrimary ? B_POSITION_PLAYER_RIGHT : B_POSITION_OPPONENT_RIGHT; + gBattlerPositions[B_BATTLER_3] = isPlayerPrimary ? B_POSITION_OPPONENT_RIGHT : B_POSITION_PLAYER_RIGHT; } - } - else if (!IsDoubleBattle()) - { - gBattleMainFunc = BeginBattleIntro; - - if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToSafari; - else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToWally; - else if (IsAiVsAiBattle()) - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayerPartner; - else - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer; - - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - - gBattlersCount = 2; - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) + if (isLink) { - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) - { - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER) - { - gBattleMainFunc = BeginBattleIntro; - - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedPlayer; - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToRecordedOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - - gBattlersCount = 2; - } - else // see how the banks are switched - { - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToRecordedPlayer; - gBattlerPositions[B_BATTLER_1] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedOpponent; - gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT; + if (isDouble && isMulti && !isMaster) + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_0)] = SetControllerToLinkPartner; + else + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_0)] = SetControllerToPlayer; - gBattlersCount = 2; - } + if (!isDouble || !isMulti || !isMaster) + { + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_1)] = SetControllerToLinkOpponent; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_2)] = SetControllerToPlayer; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_3)] = SetControllerToLinkOpponent; } else { - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedPlayer; - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_1)] = SetControllerToOpponent; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_2)] = SetControllerToLinkPartner; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_3)] = SetControllerToOpponent; } } - } - else - { - gBattleMainFunc = BeginBattleIntro; - - if (IsAiVsAiBattle()) - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayerPartner; else - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer; - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - - if (IsAiVsAiBattle()) - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayerPartner; - else - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayer; - gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; - - gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; - - gBattlersCount = MAX_BATTLERS_COUNT; - - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) - { - gBattleMainFunc = BeginBattleIntro; - - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedPlayer; - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToRecordedPlayer; - gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; - - gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; + // Player 1 + if (isRecorded) + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_0)] = SetControllerToRecordedPlayer; + else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_0)] = SetControllerToSafari; + else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_0)] = SetControllerToWally; + else if (isAIvsAI) + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_0)] = SetControllerToPlayerPartner; + else + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_0)] = SetControllerToPlayer; - gBattlersCount = MAX_BATTLERS_COUNT; + // Opponent 1 + bool32 isOpponent1Recorded; + if (isDouble) + isOpponent1Recorded = ((!isInGamePartner && isRecorded && !isMulti && isRecordedLink) || (IsMultibattleTest() && isRecordedLink)); + else + isOpponent1Recorded = isRecorded && isRecordedLink; - BufferBattlePartyCurrentOrderBySide(0, 0); - BufferBattlePartyCurrentOrderBySide(1, 0); - BufferBattlePartyCurrentOrderBySide(2, 1); - BufferBattlePartyCurrentOrderBySide(3, 1); + if (isOpponent1Recorded) + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_1)] = SetControllerToRecordedOpponent; + else + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_1)] = SetControllerToOpponent; - gBattlerPartyIndexes[0] = 0; - gBattlerPartyIndexes[1] = 0; - gBattlerPartyIndexes[2] = 3; - gBattlerPartyIndexes[3] = 3; + // Player 2 + if (IsMultibattleTest() && isRecordedLink) + { + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_2)] = SetControllerToRecordedPartner; + } + else if (IsMultibattleTest() && isRecorded && !isRecordedLink) + { // Sets to PlayerPartner if EXPECT_XXXX used in test for partner trainer, else sets to RecordedPartner. + if (gBattleTestRunnerState->data.expectedAiActions[B_BATTLER_2][0].actionSet == TRUE) + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_2)] = SetControllerToPlayerPartner; + else + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_2)] = SetControllerToRecordedPartner; } - else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + else if ((isInGamePartner && !isRecorded) + || isAIvsAI) { - u8 multiplayerId; - - for (multiplayerId = gRecordedBattleMultiplayerId, i = 0; i < MAX_BATTLERS_COUNT; i++) - { - switch (gLinkPlayers[i].id) - { - case 0: - case 3: - BufferBattlePartyCurrentOrderBySide(gLinkPlayers[i].id, 0); - break; - case 1: - case 2: - BufferBattlePartyCurrentOrderBySide(gLinkPlayers[i].id, 1); - break; - } - - if (i == multiplayerId) - { - gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToRecordedPlayer; - switch (gLinkPlayers[i].id) - { - case 0: - case 3: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 0; - break; - case 1: - case 2: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_RIGHT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 3; - break; - } - } - else if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[multiplayerId].id & 1)) - || ((gLinkPlayers[i].id & 1) && (gLinkPlayers[multiplayerId].id & 1))) - { - gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToRecordedPlayer; - switch (gLinkPlayers[i].id) - { - case 0: - case 3: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 0; - break; - case 1: - case 2: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_RIGHT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 3; - break; - } - } - else - { - gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToRecordedOpponent; - switch (gLinkPlayers[i].id) - { - case 0: - case 3: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_OPPONENT_LEFT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 0; - break; - case 1: - case 2: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_OPPONENT_RIGHT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 3; - break; - } - } - } + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_2)] = SetControllerToPlayerPartner; } - else if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) + else if (isRecorded) { - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedPlayer; - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToRecordedPlayer; - gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; - - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) - { - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToRecordedOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - - gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToRecordedOpponent; - gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; - } - else - { - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - - gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; - } + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_2)] = SetControllerToRecordedPlayer; } else { - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToRecordedPlayer; - gBattlerPositions[B_BATTLER_1] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToRecordedPlayer; - gBattlerPositions[B_BATTLER_3] = B_POSITION_PLAYER_RIGHT; - - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) - { - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedOpponent; - gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT; - - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToRecordedOpponent; - gBattlerPositions[B_BATTLER_2] = B_POSITION_OPPONENT_RIGHT; - } - else - { - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT; - - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_2] = B_POSITION_OPPONENT_RIGHT; - } + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_2)] = SetControllerToPlayer; } - } - } -} - -static void InitLinkBtlControllers(void) -{ - s32 i; - u8 multiplayerId; - - if (!IsDoubleBattle()) - { - if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) - { - gBattleMainFunc = BeginBattleIntro; - - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer; - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToLinkOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - gBattlersCount = 2; + // Opponent 2 + if (IsMultibattleTest() && isRecordedLink) + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_3)] = SetControllerToRecordedOpponent; + else if (isInGamePartner || !isRecorded || isMulti || !isRecordedLink) + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_3)] = SetControllerToOpponent; + else + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_3)] = SetControllerToRecordedOpponent; } - else - { - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToPlayer; - gBattlerPositions[B_BATTLER_1] = B_POSITION_PLAYER_LEFT; - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToLinkOpponent; - gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT; - - gBattlersCount = 2; - } - } - else if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) && IsDoubleBattle()) - { - if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) - { - gBattleMainFunc = BeginBattleIntro; + bool32 bufferPartyOrders; - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer; - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToLinkOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayer; - gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; - - gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToLinkOpponent; - gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; - - gBattlersCount = MAX_BATTLERS_COUNT; - } + if (!isLink) + bufferPartyOrders = (isInGamePartner || (isRecorded && isMulti)); else - { - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToPlayer; - gBattlerPositions[B_BATTLER_1] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToLinkOpponent; - gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT; - - gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToPlayer; - gBattlerPositions[B_BATTLER_3] = B_POSITION_PLAYER_RIGHT; - - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToLinkOpponent; - gBattlerPositions[B_BATTLER_2] = B_POSITION_OPPONENT_RIGHT; - - gBattlersCount = MAX_BATTLERS_COUNT; - } - } - else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) - { - if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) - { - gBattleMainFunc = BeginBattleIntro; - - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer; - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToLinkPartner; - gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; + bufferPartyOrders = (isDouble && isMulti); - gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; - - gBattlersCount = MAX_BATTLERS_COUNT; - } - else + if (bufferPartyOrders) { - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToLinkPartner; - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToLinkOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayer; - gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; + BufferBattlePartyCurrentOrderBySide(0, 0); + BufferBattlePartyCurrentOrderBySide(1, 0); + BufferBattlePartyCurrentOrderBySide(2, 1); + BufferBattlePartyCurrentOrderBySide(3, 1); - gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToLinkOpponent; - gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; - - gBattlersCount = MAX_BATTLERS_COUNT; + gBattlerPartyIndexes[0] = 0; + gBattlerPartyIndexes[1] = 0; + gBattlerPartyIndexes[2] = 3; + if (!isLink && isInGamePartner && (BATTLE_TWO_VS_ONE_OPPONENT || WILD_DOUBLE_BATTLE)) + gBattlerPartyIndexes[3] = 1; + else + gBattlerPartyIndexes[3] = 3; } - - BufferBattlePartyCurrentOrderBySide(0, 0); - BufferBattlePartyCurrentOrderBySide(1, 0); - BufferBattlePartyCurrentOrderBySide(2, 1); - BufferBattlePartyCurrentOrderBySide(3, 1); - gBattlerPartyIndexes[0] = 0; - gBattlerPartyIndexes[1] = 0; - gBattlerPartyIndexes[2] = 3; - gBattlerPartyIndexes[3] = 3; } else { - multiplayerId = GetMultiplayerId(); - - if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) - gBattleMainFunc = BeginBattleIntro; + u8 multiplayerId = isLink ? GetMultiplayerId() : gRecordedBattleMultiplayerId; - for (i = 0; i < MAX_BATTLERS_COUNT; i++) + for (i = 0; i < MAX_LINK_PLAYERS; i++) { + u32 linkPositionLeft, linkPositionRight; + BattleControllerFunc linkBtlControllerFunc; + + if (i == multiplayerId) + { + linkPositionLeft = B_POSITION_PLAYER_LEFT; + linkPositionRight = B_POSITION_PLAYER_RIGHT; + linkBtlControllerFunc = isLink ? SetControllerToPlayer : SetControllerToRecordedPlayer; + } + else if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[multiplayerId].id & 1)) + || ((gLinkPlayers[i].id & 1) && (gLinkPlayers[multiplayerId].id & 1))) + { + linkPositionLeft = B_POSITION_PLAYER_LEFT; + linkPositionRight = B_POSITION_PLAYER_RIGHT; + linkBtlControllerFunc = isLink ? SetControllerToLinkPartner : SetControllerToRecordedPlayer; + } + else + { + linkPositionLeft = B_POSITION_OPPONENT_LEFT; + linkPositionRight = B_POSITION_OPPONENT_RIGHT; + linkBtlControllerFunc = isLink ? SetControllerToLinkOpponent : SetControllerToRecordedOpponent; + } + gBattlerControllerFuncs[gLinkPlayers[i].id] = linkBtlControllerFunc; switch (gLinkPlayers[i].id) { case 0: case 3: BufferBattlePartyCurrentOrderBySide(gLinkPlayers[i].id, 0); + gBattlerPositions[gLinkPlayers[i].id] = linkPositionLeft; + gBattlerPartyIndexes[gLinkPlayers[i].id] = 0; break; case 1: case 2: BufferBattlePartyCurrentOrderBySide(gLinkPlayers[i].id, 1); + gBattlerPositions[gLinkPlayers[i].id] = linkPositionRight; + gBattlerPartyIndexes[gLinkPlayers[i].id] = 3; break; } - - if (i == multiplayerId) - { - gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToPlayer; - switch (gLinkPlayers[i].id) - { - case 0: - case 3: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 0; - break; - case 1: - case 2: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_RIGHT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 3; - break; - } - } - else - { - if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[multiplayerId].id & 1)) - || ((gLinkPlayers[i].id & 1) && (gLinkPlayers[multiplayerId].id & 1))) - { - gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToLinkPartner; - switch (gLinkPlayers[i].id) - { - case 0: - case 3: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 0; - break; - case 1: - case 2: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_RIGHT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 3; - break; - } - } - else - { - gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToLinkOpponent; - switch (gLinkPlayers[i].id) - { - case 0: - case 3: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_OPPONENT_LEFT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 0; - break; - case 1: - case 2: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_OPPONENT_RIGHT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 3; - break; - } - } - } } - - gBattlersCount = MAX_BATTLERS_COUNT; } } @@ -620,6 +330,66 @@ bool32 IsValidForBattle(struct Pokemon *mon) && GetMonData(mon, MON_DATA_IS_EGG) == FALSE); } +bool32 IsValidForBattleButDead(struct Pokemon *mon) +{ + u32 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG); + return (species != SPECIES_NONE + && species != SPECIES_EGG + && GetMonData(mon, MON_DATA_IS_EGG) == FALSE); +} + +static inline bool32 IsControllerPlayer(u32 battler) +{ + return (gBattlerControllerEndFuncs[battler] == PlayerBufferExecCompleted); +} + +static inline bool32 IsControllerRecordedPlayer(u32 battler) +{ + return (gBattlerControllerEndFuncs[battler] == RecordedPlayerBufferExecCompleted); +} + +static inline bool32 IsControllerRecordedPartner(u32 battler) +{ + return (gBattlerControllerEndFuncs[battler] == RecordedPartnerBufferExecCompleted); +} + +static inline bool32 IsControllerOpponent(u32 battler) +{ + return (gBattlerControllerEndFuncs[battler] == OpponentBufferExecCompleted); +} + +static inline bool32 IsControllerPlayerPartner(u32 battler) +{ + return (gBattlerControllerEndFuncs[battler] == PlayerPartnerBufferExecCompleted); +} + +static inline bool32 IsControllerWally(u32 battler) +{ + return (gBattlerControllerEndFuncs[battler] == WallyBufferExecCompleted); +} + +static inline bool32 IsControllerRecordedOpponent(u32 battler) +{ + return (gBattlerControllerEndFuncs[battler] == RecordedOpponentBufferExecCompleted); +} + +static inline bool32 IsControllerLinkOpponent(u32 battler) +{ + return (gBattlerControllerEndFuncs[battler] == LinkOpponentBufferExecCompleted); +} + +static inline bool32 IsControllerLinkPartner(u32 battler) +{ + return (gBattlerControllerEndFuncs[battler] == LinkPartnerBufferExecCompleted); +} + +bool32 ShouldUpdateTvData(u32 battler) +{ + return (IsControllerPlayer(battler) + || IsControllerLinkPartner(battler) + || IsControllerLinkOpponent(battler)); +} + static void SetBattlePartyIds(void) { s32 i, j; @@ -653,21 +423,41 @@ static void SetBattlePartyIds(void) { if (IsOnPlayerSide(i)) { - if (IsValidForBattle(&gPlayerParty[j]) && gBattlerPartyIndexes[i - 2] != j) + if (gBattlerPartyIndexes[i - 2] == j) + { + // Exclude already assigned pokemon; + } + else if (IsValidForBattle(&gPlayerParty[j])) { gBattlerPartyIndexes[i] = j; break; } + else if (IsValidForBattleButDead(&gPlayerParty[j]) && gBattlerPartyIndexes[i] < PARTY_SIZE) + { + // Put an "option" on a dead mon that can be revived; + gBattlerPartyIndexes[i] = j + PARTY_SIZE; + } } else { - if (IsValidForBattle(&gEnemyParty[j]) && gBattlerPartyIndexes[i - 2] != j) + if (gBattlerPartyIndexes[i - 2] == j) + { + // Exclude already assigned pokemon; + } + else if (IsValidForBattle(&gEnemyParty[j])) { gBattlerPartyIndexes[i] = j; break; } + else if (IsValidForBattleButDead(&gEnemyParty[j]) && gBattlerPartyIndexes[i] < PARTY_SIZE) + { + // Put an "option" on a dead mon that can be revived; + gBattlerPartyIndexes[i] = j + PARTY_SIZE; + } } + if (gBattlerPartyIndexes[i] >= PARTY_SIZE) + continue; // No valid mons were found. Add the empty slot. if (gBattlerPartyIndexes[i - 2] == 0) gBattlerPartyIndexes[i] = 1; @@ -675,6 +465,8 @@ static void SetBattlePartyIds(void) gBattlerPartyIndexes[i] = 0; } } + if (gBattlerPartyIndexes[i] >= PARTY_SIZE) + gBattlerPartyIndexes[i] -= PARTY_SIZE; } if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) @@ -1266,7 +1058,7 @@ void BtlController_EmitChooseItem(u32 battler, u32 bufferId, u8 *battlePartyOrde PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 4); } -void BtlController_EmitChoosePokemon(u32 battler, u32 bufferId, u8 caseId, u8 slotId, u16 abilityId, u8 *data) +void BtlController_EmitChoosePokemon(u32 battler, u32 bufferId, u8 caseId, u8 slotId, u16 abilityId, u8 battlerPreventingSwitchout, u8 *data) { s32 i; @@ -1275,9 +1067,10 @@ void BtlController_EmitChoosePokemon(u32 battler, u32 bufferId, u8 caseId, u8 sl gBattleResources->transferBuffer[2] = slotId; gBattleResources->transferBuffer[3] = abilityId & 0xFF; gBattleResources->transferBuffer[7] = (abilityId >> 8) & 0xFF; + gBattleResources->transferBuffer[8] = battlerPreventingSwitchout; for (i = 0; i < 3; i++) gBattleResources->transferBuffer[4 + i] = data[i]; - PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 8); // Only 7 bytes were written. + PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 9); // Only 7 bytes were written. } static void UNUSED BtlController_EmitCmd23(u32 battler, u32 bufferId) @@ -1310,24 +1103,20 @@ void BtlController_EmitExpUpdate(u32 battler, u32 bufferId, u8 partyId, s32 expP PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 6); } -void BtlController_EmitStatusIconUpdate(u32 battler, u32 bufferId, u32 status1, u32 status2) +void BtlController_EmitStatusIconUpdate(u32 battler, u32 bufferId, u32 status) { gBattleResources->transferBuffer[0] = CONTROLLER_STATUSICONUPDATE; - gBattleResources->transferBuffer[1] = status1; - gBattleResources->transferBuffer[2] = (status1 & 0x0000FF00) >> 8; - gBattleResources->transferBuffer[3] = (status1 & 0x00FF0000) >> 16; - gBattleResources->transferBuffer[4] = (status1 & 0xFF000000) >> 24; - gBattleResources->transferBuffer[5] = status2; - gBattleResources->transferBuffer[6] = (status2 & 0x0000FF00) >> 8; - gBattleResources->transferBuffer[7] = (status2 & 0x00FF0000) >> 16; - gBattleResources->transferBuffer[8] = (status2 & 0xFF000000) >> 24; - PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 9); + gBattleResources->transferBuffer[1] = status; + gBattleResources->transferBuffer[2] = (status & 0x0000FF00) >> 8; + gBattleResources->transferBuffer[3] = (status & 0x00FF0000) >> 16; + gBattleResources->transferBuffer[4] = (status & 0xFF000000) >> 24; + PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 5); } -void BtlController_EmitStatusAnimation(u32 battler, u32 bufferId, bool8 status2, u32 status) +void BtlController_EmitStatusAnimation(u32 battler, u32 bufferId, bool8 isVolatile, u32 status) { gBattleResources->transferBuffer[0] = CONTROLLER_STATUSANIMATION; - gBattleResources->transferBuffer[1] = status2; + gBattleResources->transferBuffer[1] = isVolatile; gBattleResources->transferBuffer[2] = status; gBattleResources->transferBuffer[3] = (status & 0x0000FF00) >> 8; gBattleResources->transferBuffer[4] = (status & 0x00FF0000) >> 16; @@ -1592,7 +1381,7 @@ void BtlController_EmitDebugMenu(u32 battler, u32 bufferId) // Standardized Controller functions // Can be used for all the controllers. -void BattleControllerComplete(u32 battler) +void BtlController_Complete(u32 battler) { gBattlerControllerEndFuncs[battler](battler); } @@ -1652,7 +1441,7 @@ static u32 GetBattlerMonData(u32 battler, struct Pokemon *party, u32 monId, u8 * u32 side = GetBattlerSide(battler); u32 partyIndex = gBattlerPartyIndexes[battler]; if (TestRunner_Battle_GetForcedAbility(side, partyIndex)) - gBattleMons[battler].ability = gDisableStructs[battler].overwrittenAbility = TestRunner_Battle_GetForcedAbility(side, partyIndex); + gBattleMons[battler].ability = TestRunner_Battle_GetForcedAbility(side, partyIndex); } #endif break; @@ -2172,9 +1961,7 @@ void StartSendOutAnim(u32 battler, bool32 dontClearTransform, bool32 dontClearSu ClearTemporarySpeciesSpriteData(battler, dontClearTransform, dontClearSubstituteBit); gBattlerPartyIndexes[battler] = gBattleResources->bufferA[battler][1]; - species = GetIllusionMonSpecies(battler); - if (species == SPECIES_NONE) - species = GetMonData(mon, MON_DATA_SPECIES); + species = GetBattlerVisualSpecies(battler); gBattleControllerData[battler] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); // Load sprite for opponent only, player sprite is expected to be already loaded. if (!IsOnPlayerSide(battler)) @@ -2212,7 +1999,7 @@ static void Controller_ReturnMonToBall2(u32 battler) if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive) { FreeMonSprite(battler); - BattleControllerComplete(battler); + BtlController_Complete(battler); } } @@ -2246,7 +2033,7 @@ static void Controller_FaintPlayerMon(u32 battler) FreeOamMatrix(gSprites[spriteId].oam.matrixNum); DestroySprite(&gSprites[spriteId]); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[battler]); - BattleControllerComplete(battler); + BtlController_Complete(battler); } } @@ -2255,7 +2042,7 @@ static void Controller_FaintOpponentMon(u32 battler) if (!gSprites[gBattlerSpriteIds[battler]].inUse) { SetHealthboxSpriteInvisible(gHealthboxSpriteIds[battler]); - BattleControllerComplete(battler); + BtlController_Complete(battler); } } @@ -2303,7 +2090,7 @@ static void Controller_DoMoveAnimation(u32 battler) CopyAllBattleSpritesInvisibilities(); TrySetBehindSubstituteSpriteBit(battler, gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[battler].animationState = 0; - BattleControllerComplete(battler); + BtlController_Complete(battler); } break; } @@ -2317,7 +2104,7 @@ static void Controller_HandleTrainerSlideBack(u32 battler) FreeTrainerFrontPicPalette(gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.affineParam); FreeSpriteOamMatrix(&gSprites[gBattleStruct->trainerSlideSpriteIds[battler]]); DestroySprite(&gSprites[gBattleStruct->trainerSlideSpriteIds[battler]]); - BattleControllerComplete(battler); + BtlController_Complete(battler); } } @@ -2334,38 +2121,38 @@ void Controller_WaitForHealthBar(u32 battler) { if (IsOnPlayerSide(battler)) HandleLowHpMusicChange(GetBattlerMon(battler), battler); - BattleControllerComplete(battler); + BtlController_Complete(battler); } } static void Controller_WaitForBallThrow(u32 battler) { if (!gDoingBattleAnim || !gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive) - BattleControllerComplete(battler); + BtlController_Complete(battler); } static void Controller_WaitForBattleAnimation(u32 battler) { if (!gBattleSpritesDataPtr->healthBoxesData[battler].animFromTableActive) - BattleControllerComplete(battler); + BtlController_Complete(battler); } static void Controller_WaitForStatusAnimation(u32 battler) { if (!gBattleSpritesDataPtr->healthBoxesData[battler].statusAnimActive) - BattleControllerComplete(battler); + BtlController_Complete(battler); } static void Controller_WaitForTrainerPic(u32 battler) { if (gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].callback == SpriteCallbackDummy) - BattleControllerComplete(battler); + BtlController_Complete(battler); } void Controller_WaitForString(u32 battler) { if (!IsTextPrinterActive(B_WIN_MSG)) - BattleControllerComplete(battler); + BtlController_Complete(battler); } static void Controller_WaitForPartyStatusSummary(u32 battler) @@ -2373,7 +2160,7 @@ static void Controller_WaitForPartyStatusSummary(u32 battler) if (gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusDelayTimer++ > 92) { gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusDelayTimer = 0; - BattleControllerComplete(battler); + BtlController_Complete(battler); } } @@ -2386,7 +2173,7 @@ static void Controller_HitAnimation(u32 battler) gSprites[spriteId].data[1] = 0; gSprites[spriteId].invisible = FALSE; gDoingBattleAnim = FALSE; - BattleControllerComplete(battler); + BtlController_Complete(battler); } else { @@ -2399,7 +2186,7 @@ static void Controller_HitAnimation(u32 battler) // Used for all the commands which do nothing. void BtlController_Empty(u32 battler) { - BattleControllerComplete(battler); + BtlController_Complete(battler); } // Dummy function at the end of the table. @@ -2435,7 +2222,7 @@ void BtlController_HandleGetMonData(u32 battler) } } BtlController_EmitDataTransfer(battler, B_COMM_TO_ENGINE, size, monData); - BattleControllerComplete(battler); + BtlController_Complete(battler); } void BtlController_HandleGetRawMonData(u32 battler) @@ -2451,7 +2238,7 @@ void BtlController_HandleGetRawMonData(u32 battler) dst[i] = src[i]; BtlController_EmitDataTransfer(battler, B_COMM_TO_ENGINE, gBattleResources->bufferA[battler][2], dst); - BattleControllerComplete(battler); + BtlController_Complete(battler); } void BtlController_HandleSetMonData(u32 battler) @@ -2473,7 +2260,7 @@ void BtlController_HandleSetMonData(u32 battler) monToCheck >>= 1; } } - BattleControllerComplete(battler); + BtlController_Complete(battler); } void BtlController_HandleSetRawMonData(u32 battler) @@ -2484,13 +2271,13 @@ void BtlController_HandleSetRawMonData(u32 battler) for (i = 0; i < gBattleResources->bufferA[battler][2]; i++) dst[i] = gBattleResources->bufferA[battler][3 + i]; - BattleControllerComplete(battler); + BtlController_Complete(battler); } -void BtlController_HandleLoadMonSprite(u32 battler, void (*controllerCallback)(u32 battler)) +void BtlController_HandleLoadMonSprite(u32 battler) { struct Pokemon *mon = GetBattlerMon(battler); - u16 species = GetMonData(mon, MON_DATA_SPECIES); + u16 species = GetBattlerVisualSpecies(battler); BattleLoadMonSpriteGfx(mon, battler); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battler)); @@ -2508,18 +2295,37 @@ void BtlController_HandleLoadMonSprite(u32 battler, void (*controllerCallback)(u SetBattlerShadowSpriteCallback(battler, species); - gBattlerControllerFuncs[battler] = controllerCallback; + if (IsControllerOpponent(battler) || IsControllerLinkOpponent(battler) || IsControllerRecordedOpponent(battler)) + gBattlerControllerFuncs[battler] = TryShinyAnimAfterMonAnim; + else + gBattlerControllerFuncs[battler] = WaitForMonAnimAfterLoad; } -void BtlController_HandleSwitchInAnim(u32 battler, bool32 isPlayerSide, void (*controllerCallback)(u32 battler)) +void BtlController_HandleSwitchInAnim(u32 battler) { + bool32 isPlayerSide = (IsControllerPlayer(battler) + || IsControllerPlayerPartner(battler) + || IsControllerRecordedPlayer(battler) + || IsControllerRecordedPartner(battler) + || IsControllerLinkPartner(battler)); + + if (IsControllerPlayer(battler)) + { + gActionSelectionCursor[battler] = 0; + gMoveSelectionCursor[battler] = 0; + } + else if (IsControllerOpponent(battler)) + { + gBattleStruct->monToSwitchIntoId[battler] = PARTY_SIZE; + } + if (isPlayerSide) ClearTemporarySpeciesSpriteData(battler, gBattleResources->bufferA[battler][2], gBattleResources->bufferA[battler][3]); gBattlerPartyIndexes[battler] = gBattleResources->bufferA[battler][1]; if (isPlayerSide) BattleLoadMonSpriteGfx(GetBattlerMon(battler), battler); StartSendOutAnim(battler, gBattleResources->bufferA[battler][2], gBattleResources->bufferA[battler][3], FALSE); - gBattlerControllerFuncs[battler] = controllerCallback; + gBattlerControllerFuncs[battler] = BtlController_HandleSwitchInTryShinyAnim; } void BtlController_HandleReturnMonToBall(u32 battler) @@ -2532,7 +2338,7 @@ void BtlController_HandleReturnMonToBall(u32 battler) else { FreeMonSprite(battler); - BattleControllerComplete(battler); + BtlController_Complete(battler); } } @@ -2591,7 +2397,8 @@ void BtlController_HandleDrawTrainerPic(u32 battler, u32 trainerPicId, bool32 is if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) && GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT) gBattlerSpriteIds[battler] = gBattleStruct->trainerSlideSpriteIds[battler]; - gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = battler; + // Aiming for palette slots 8 and 9 for Player and PlayerPartner to prevent Trainer Slides causing mons to change colour + gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = (8 + battler/2); } gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].x2 = DISPLAY_WIDTH; gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].sSpeedX = -2; @@ -2616,7 +2423,8 @@ void BtlController_HandleTrainerSlide(u32 battler, u32 trainerPicId) 30); if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) && GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT) gBattlerSpriteIds[battler] = gBattleStruct->trainerSlideSpriteIds[battler]; - gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = battler; + // Aiming for palette slots 8 and 9 for Player and PlayerPartner to prevent Trainer Slides causing mons to change colour + gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = (8 + battler/2); gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].x2 = -96; gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].sSpeedX = 2; } @@ -2715,7 +2523,7 @@ void BtlController_HandleBallThrowAnim(u32 battler, u32 target, u32 animId, bool HandleBallThrow(battler, target, animId, allowCriticalCapture); } -void BtlController_HandleMoveAnimation(u32 battler, bool32 updateTvData) +void BtlController_HandleMoveAnimation(u32 battler) { if (!IsBattleSEPlaying(battler)) { @@ -2731,12 +2539,12 @@ void BtlController_HandleMoveAnimation(u32 battler, bool32 updateTvData) gTransformedShininess[battler] = gAnimDisableStructPtr->transformedMonShininess; gBattleSpritesDataPtr->healthBoxesData[battler].animationState = 0; gBattlerControllerFuncs[battler] = Controller_DoMoveAnimation; - if (updateTvData) + if (ShouldUpdateTvData(battler)) BattleTv_SetDataBasedOnMove(move, gWeatherMoveAnim, gAnimDisableStructPtr); } } -void BtlController_HandlePrintString(u32 battler, bool32 updateTvData, bool32 arenaPtsDeduct) +void BtlController_HandlePrintString(u32 battler) { u16 *stringId; @@ -2750,20 +2558,29 @@ void BtlController_HandlePrintString(u32 battler, bool32 updateTvData, bool32 ar TestRunner_Battle_RecordMessage(gDisplayedStringBattle); if (gTestRunnerHeadless) { - BattleControllerComplete(battler); + BtlController_Complete(battler); return; } } BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gBattlerControllerFuncs[battler] = Controller_WaitForString; - if (updateTvData) + if (ShouldUpdateTvData(battler)) BattleTv_SetDataBasedOnString(*stringId); - if (arenaPtsDeduct) + if (IsControllerPlayer(battler) + || IsControllerOpponent(battler)) BattleArena_DeductSkillPoints(battler, *stringId); } -void BtlController_HandleHealthBarUpdate(u32 battler, bool32 updateHpText) +void BtlController_HandlePrintStringPlayerOnly(u32 battler) +{ + if (IsOnPlayerSide(battler)) + BtlController_HandlePrintString(battler); + else + BtlController_Complete(battler); +} + +void BtlController_HandleHealthBarUpdate(u32 battler) { s32 maxHP, curHP; s16 hpVal; @@ -2782,7 +2599,10 @@ void BtlController_HandleHealthBarUpdate(u32 battler, bool32 updateHpText) else { SetBattleBarStruct(battler, gHealthboxSpriteIds[battler], maxHP, 0, hpVal); - if (updateHpText) + if (IsControllerPlayer(battler) + || IsControllerRecordedPlayer(battler) + || IsControllerRecordedPartner(battler) + || IsControllerWally(battler)) UpdateHpTextInHealthbox(gHealthboxSpriteIds[battler], HP_CURRENT, 0, maxHP); TestRunner_Battle_RecordHP(battler, curHP, 0); } @@ -2819,9 +2639,9 @@ void BtlController_HandleStatusAnimation(u32 battler) void BtlController_HandleHitAnimation(u32 battler) { - if (gSprites[gBattlerSpriteIds[battler]].invisible == TRUE) + if (gSprites[gBattlerSpriteIds[battler]].invisible == TRUE || (gTestRunnerHeadless && !gBattleTestRunnerState->forceMoveAnim)) { - BattleControllerComplete(battler); + BtlController_Complete(battler); } else { @@ -2834,14 +2654,24 @@ void BtlController_HandleHitAnimation(u32 battler) void BtlController_HandlePlaySE(u32 battler) { + if (gTestRunnerHeadless && !gBattleTestRunnerState->forceMoveAnim) + { + BtlController_Complete(battler); + return; + } s32 pan = IsOnPlayerSide(battler) ? SOUND_PAN_ATTACKER : SOUND_PAN_TARGET; PlaySE12WithPanning(gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8), pan); - BattleControllerComplete(battler); + BtlController_Complete(battler); } void BtlController_HandlePlayFanfareOrBGM(u32 battler) { + if (gTestRunnerHeadless && !gBattleTestRunnerState->forceMoveAnim) + { + BtlController_Complete(battler); + return; + } if (gBattleResources->bufferA[battler][3]) { BattleStopLowHpSound(); @@ -2852,7 +2682,7 @@ void BtlController_HandlePlayFanfareOrBGM(u32 battler) PlayFanfare(gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8)); } - BattleControllerComplete(battler); + BtlController_Complete(battler); } void BtlController_HandleFaintingCry(u32 battler) @@ -2872,14 +2702,14 @@ void BtlController_HandleFaintingCry(u32 battler) } PlayCry_ByMode(GetMonData(&party[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES), pan, CRY_MODE_FAINT); - BattleControllerComplete(battler); + BtlController_Complete(battler); } void BtlController_HandleIntroSlide(u32 battler) { HandleIntroSlide(gBattleResources->bufferA[battler][1]); gIntroSlideFlags |= 1; - BattleControllerComplete(battler); + BtlController_Complete(battler); } void BtlController_HandleSpriteInvisibility(u32 battler) @@ -2889,7 +2719,7 @@ void BtlController_HandleSpriteInvisibility(u32 battler) gSprites[gBattlerSpriteIds[battler]].invisible = gBattleResources->bufferA[battler][1]; CopyBattleSpriteInvisibility(battler); } - BattleControllerComplete(battler); + BtlController_Complete(battler); } bool32 TwoPlayerIntroMons(u32 battler) // Double battle with both player pokemon active. @@ -2917,7 +2747,7 @@ bool32 TwoOpponentIntroMons(u32 battler) // Double battle with both opponent pok void BtlController_HandleIntroTrainerBallThrow(u32 battler, u16 tagTrainerPal, const u16 *trainerPal, s16 framesToWait, void (*controllerCallback)(u32 battler)) { u8 paletteNum, taskId; - u32 side = GetBattlerSide(battler); + enum BattleSide side = GetBattlerSide(battler); SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattleStruct->trainerSlideSpriteIds[battler]]); if (side == B_SIDE_PLAYER) @@ -2942,7 +2772,7 @@ void BtlController_HandleIntroTrainerBallThrow(u32 battler, u16 tagTrainerPal, c paletteNum = AllocSpritePalette(tagTrainerPal); LoadPalette(trainerPal, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); - gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = paletteNum; + gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = (8 + battler/2); } else { @@ -3043,11 +2873,11 @@ static void SpriteCB_FreeOpponentSprite(struct Sprite *sprite) #undef sBattlerId -void BtlController_HandleDrawPartyStatusSummary(u32 battler, u32 side, bool32 considerDelay) +void BtlController_HandleDrawPartyStatusSummary(u32 battler, enum BattleSide side, bool32 considerDelay) { if (gBattleResources->bufferA[battler][1] != 0 && IsOnPlayerSide(battler)) { - BattleControllerComplete(battler); + BtlController_Complete(battler); } else { @@ -3081,12 +2911,13 @@ void BtlController_HandleHidePartyStatusSummary(u32 battler) { if (gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusSummaryShown) gTasks[gBattlerStatusSummaryTaskId[battler]].func = Task_HidePartyStatusSummary; - BattleControllerComplete(battler); + BtlController_Complete(battler); } -void BtlController_HandleBattleAnimation(u32 battler, bool32 ignoreSE, bool32 updateTvData) +void BtlController_HandleBattleAnimation(u32 battler) { - if (ignoreSE || !IsBattleSEPlaying(battler)) + if ((gBattleTypeFlags & (BATTLE_TYPE_SAFARI | BATTLE_TYPE_WALLY_TUTORIAL)) + || !IsBattleSEPlaying(battler)) { u8 animationId = gBattleResources->bufferA[battler][1]; u16 argument = gBattleResources->bufferA[battler][2] | (gBattleResources->bufferA[battler][3] << 8); @@ -3094,15 +2925,24 @@ void BtlController_HandleBattleAnimation(u32 battler, bool32 ignoreSE, bool32 up gAnimDisableStructPtr = (struct DisableStruct *)&gBattleResources->bufferA[battler][4]; if (TryHandleLaunchBattleTableAnimation(battler, battler, battler, animationId, argument)) - BattleControllerComplete(battler); + BtlController_Complete(battler); else gBattlerControllerFuncs[battler] = Controller_WaitForBattleAnimation; - if (updateTvData) + if (ShouldUpdateTvData(battler)) BattleTv_SetDataBasedOnAnimation(animationId); } } +void AnimateMonAfterPokeBallFail(u32 battler) +{ + if (B_ANIMATE_MON_AFTER_FAILED_POKEBALL == FALSE) + return; + + LaunchKOAnimation(battler, ReturnAnimIdForBattler(TRUE, battler), TRUE); + TryShinyAnimation(gBattlerTarget, GetBattlerMon(gBattlerTarget)); +} + static void AnimateMonAfterKnockout(u32 battler) { if (B_ANIMATE_MON_AFTER_KO == FALSE) @@ -3124,6 +2964,8 @@ static void LaunchKOAnimation(u32 battlerId, u16 animId, bool32 isFront) u32 species = GetBattlerVisualSpecies(battlerId); u32 spriteId = gBattlerSpriteIds[battlerId]; + gBattleStruct->battlerKOAnimsRunning++; + if (isFront) { LaunchAnimationTaskForFrontSprite(&gSprites[spriteId], animId); @@ -3153,110 +2995,199 @@ void TrySetBattlerShadowSpriteCallback(u32 battler) if (gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].shadowSpriteIdPrimary].callback == SpriteCallbackDummy && (B_ENEMY_MON_SHADOW_STYLE <= GEN_3 || P_GBA_STYLE_SPECIES_GFX == TRUE || gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].shadowSpriteIdSecondary].callback == SpriteCallbackDummy)) - SetBattlerShadowSpriteCallback(battler, GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES)); + SetBattlerShadowSpriteCallback(battler, GetBattlerVisualSpecies(battler)); } -bool32 TryShinyAnimAfterMonAnimUtil(u32 battler) +void TryShinyAnimAfterMonAnim(u32 battler) { - if (gSprites[gBattlerSpriteIds[battler]].callback != SpriteCallbackDummy - || gSprites[gBattlerSpriteIds[battler]].x2 != 0) - return FALSE; - - if (!gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim) + if (gSprites[gBattlerSpriteIds[battler]].x2 == 0) { - TryShinyAnimation(battler, GetBattlerMon(battler)); - return FALSE; - } - - if (!gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim) - return FALSE; - - gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + if (!gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim) + { + TryShinyAnimation(battler, GetBattlerMon(battler)); + } - return TRUE; + if (gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim) + { + gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; + FreeShinyStars(); + BtlController_Complete(battler); + } + } } -bool32 SwitchIn_ShowSubstituteUtil(u32 battler) +void WaitForMonAnimAfterLoad(u32 battler) { - if (gSprites[gHealthboxSpriteIds[battler]].callback != SpriteCallbackDummy) - return FALSE; + if (gSprites[gBattlerSpriteIds[battler]].animEnded && gSprites[gBattlerSpriteIds[battler]].x2 == 0) + BtlController_Complete(battler); +} - if (GetBattlerSide(battler) == B_SIDE_PLAYER) - CopyBattleSpriteInvisibility(battler); +void BtlController_HandleSwitchInShowSubstitute(u32 battler) +{ + if (gSprites[gHealthboxSpriteIds[battler]].callback == SpriteCallbackDummy) + { + if (IsOnPlayerSide(battler)) + CopyBattleSpriteInvisibility(battler); - if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) - InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_MON_TO_SUBSTITUTE); + if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) + InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_MON_TO_SUBSTITUTE); - return TRUE; + if (IsControllerOpponent(battler) + && IsControllerLinkOpponent(battler) + && IsControllerRecordedOpponent(battler)) + gBattlerControllerFuncs[battler] = BtlController_HandleSwitchInSoundAndEnd; + else + gBattlerControllerFuncs[battler] = BtlController_HandleSwitchInWaitAndEnd; + } } -bool32 SwitchIn_WaitAndEndUtil(u32 battler) +void BtlController_HandleSwitchInWaitAndEnd(u32 battler) { - return !gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive - && gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy; + if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive + && gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy) + BtlController_Complete(battler); } -bool32 SwitchIn_HandleSoundAndEndUtil(u32 battler) +void BtlController_Intro_DelayAndEnd(u32 battler) { - if (gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive || IsCryPlayingOrClearCrySongs()) - return FALSE; - - if (gSprites[gBattlerSpriteIds[battler]].callback != SpriteCallbackDummy - && gSprites[gBattlerSpriteIds[battler]].callback != SpriteCallbackDummy_2 - && GetBattlerSide(battler) == B_SIDE_OPPONENT) - return FALSE; + if (--gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay == (u8)-1) + { + gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0; + BtlController_Complete(battler); + } +} - m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); - return TRUE; +void BtlController_HandleSwitchInSoundAndEnd(u32 battler) +{ + if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive && !IsCryPlayingOrClearCrySongs()) + { + if (gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy + || gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy_2 + || IsOnPlayerSide(battler)) + { + m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); + if (IsControllerPlayer(battler)) + HandleLowHpMusicChange(GetBattlerMon(battler), battler); + BtlController_Complete(battler); + } + } } -bool32 SwitchIn_ShowHealthboxUtil(u32 battler) +void BtlController_HandleSwitchInShowHealthbox(u32 battler) { - u32 side = GetBattlerSide(battler); + enum BattleSide side = GetBattlerSide(battler); + if (gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim + && (side == B_SIDE_PLAYER || gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy)) + { + gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; + FreeShinyStars(); - if (!gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim - || (side == B_SIDE_OPPONENT && gSprites[gBattlerSpriteIds[battler]].callback != SpriteCallbackDummy)) - return FALSE; + if (side == B_SIDE_PLAYER) + { + CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); + HandleLowHpMusicChange(GetBattlerMon(battler), battler); + } - gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 0); + UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_ALL); + StartHealthboxSlideIn(battler); + SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]); - if (side == B_SIDE_PLAYER) - { - CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); - HandleLowHpMusicChange(GetBattlerMon(battler), battler); + if (side == B_SIDE_OPPONENT) + CopyBattleSpriteInvisibility(battler); + gBattlerControllerFuncs[battler] = BtlController_HandleSwitchInShowSubstitute; } +} - StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 0); - UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_ALL); - StartHealthboxSlideIn(battler); - SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]); - - if (side == B_SIDE_OPPONENT) +static void SwitchIn_CleanShinyAnimShowSubstitute(u32 battler) +{ + if (gSprites[gHealthboxSpriteIds[battler]].callback == SpriteCallbackDummy + && gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim + && gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy) + { CopyBattleSpriteInvisibility(battler); - return TRUE; + // Reset shiny anim (even if it didn't occur) + gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; + FreeShinyStars(); + + // Check if Substitute should be shown + if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) + InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_MON_TO_SUBSTITUTE); + + gBattlerControllerFuncs[battler] = BtlController_HandleSwitchInSoundAndEnd; + } } -bool32 SwitchIn_TryShinyAnimUtil(u32 battler) +void BtlController_HandleSwitchInTryShinyAnim(u32 battler) { if (!gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim) TryShinyAnimation(battler, GetBattlerMon(battler)); - if (gSprites[gBattleControllerData[battler]].callback != SpriteCallbackDummy - || gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive) - return FALSE; + if (gSprites[gBattleControllerData[battler]].callback == SpriteCallbackDummy + && !gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive) + { + DestroySprite(&gSprites[gBattleControllerData[battler]]); - DestroySprite(&gSprites[gBattleControllerData[battler]]); + if (GetBattlerSide(battler) == B_SIDE_OPPONENT) + SetBattlerShadowSpriteCallback(battler, GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES)); - if (GetBattlerSide(battler) == B_SIDE_OPPONENT) - SetBattlerShadowSpriteCallback(battler, GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES)); + if (IsControllerPlayer(battler)) + { + UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_ALL); + StartHealthboxSlideIn(battler); + SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]); + gBattlerControllerFuncs[battler] = SwitchIn_CleanShinyAnimShowSubstitute; + } + else + { + gBattlerControllerFuncs[battler] = BtlController_HandleSwitchInShowHealthbox; + } + } +} - return TRUE; +void UpdateFriendshipFromXItem(u32 battler) +{ + struct Pokemon *party = GetBattlerParty(battler); + + u8 friendship; + gBattleResources->bufferA[battler][1] = REQUEST_FRIENDSHIP_BATTLE; + GetBattlerMonData(battler, party, gBattlerPartyIndexes[battler], &friendship); + + u16 heldItem; + gBattleResources->bufferA[battler][1] = REQUEST_HELDITEM_BATTLE; + GetBattlerMonData(battler, party, gBattlerPartyIndexes[battler], (u8*)&heldItem); + + if (friendship < X_ITEM_MAX_FRIENDSHIP) + { + friendship += CalculateFriendshipBonuses(GetBattlerMon(battler), X_ITEM_FRIENDSHIP_INCREASE, GetItemHoldEffect(heldItem)); + + if (friendship > MAX_FRIENDSHIP) + friendship = MAX_FRIENDSHIP; + + gBattleMons[battler].friendship = friendship; + gBattleResources->bufferA[battler][3] = friendship; + gBattleResources->bufferA[battler][1] = REQUEST_FRIENDSHIP_BATTLE; + SetBattlerMonData(battler, GetBattlerParty(battler), gBattlerPartyIndexes[battler]); + } +} + +bool32 ShouldBattleRestrictionsApply(u32 battler) +{ + return IsControllerPlayer(battler); +} + +void FreeShinyStars(void) +{ + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim) + return; + } + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); } diff --git a/src/battle_debug.c b/src/battle_debug.c index ffe1b76cea97..836329d66007 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -35,7 +35,6 @@ #include "constants/moves.h" #include "constants/items.h" #include "constants/rgb.h" -#include "constants/hold_effects.h" #define MAX_MODIFY_DIGITS 4 @@ -104,15 +103,15 @@ enum LIST_ITEM_STATS, LIST_ITEM_STAT_STAGES, LIST_ITEM_STATUS1, - LIST_ITEM_STATUS2, - LIST_ITEM_STATUS3, - LIST_ITEM_STATUS4, + LIST_ITEM_VOLATILE, + LIST_ITEM_HAZARDS, LIST_ITEM_SIDE_STATUS, LIST_ITEM_AI, LIST_ITEM_AI_MOVES_PTS, LIST_ITEM_AI_INFO, LIST_ITEM_AI_PARTY, LIST_ITEM_VARIOUS, + LIST_ITEM_INSTANT_WIN, LIST_ITEM_COUNT }; @@ -141,72 +140,22 @@ enum enum { - LIST_STATUS2_CONFUSION, - LIST_STATUS2_FLINCHED, - LIST_STATUS2_TORMENT, - LIST_STATUS2_POWDER, - LIST_STATUS2_DEFENSE_CURL, - LIST_STATUS2_RECHARGE, - LIST_STATUS2_RAGE, - LIST_STATUS2_DESTINY_BOND, - LIST_STATUS2_ESCAPE_PREVENTION, - LIST_STATUS2_CURSED, - LIST_STATUS2_FORESIGHT, - LIST_STATUS2_DRAGON_CHEER, - LIST_STATUS2_FOCUS_ENERGY -}; - -enum -{ - LIST_STATUS3_LEECH_SEED_HEALER, - LIST_STATUS3_LEECH_SEEDED, - LIST_STATUS3_ALWAYS_HITS, - LIST_STATUS3_PERISH_SONG, - LIST_STATUS3_ON_AIR, - LIST_STATUS3_UNDERGROUND, - LIST_STATUS3_MINIMIZED, - LIST_STATUS3_CHARGED_UP, - LIST_STATUS3_ROOTED, - LIST_STATUS3_YAWN, - LIST_STATUS3_IMPRISONED_OTHERS, - LIST_STATUS3_GRUDGE, - LIST_STATUS3_GASTRO_ACID, - LIST_STATUS3_EMBARGO, - LIST_STATUS3_UNDERWATER, - LIST_STATUS3_SMACKED_DOWN, - LIST_STATUS3_TELEKINESIS, - LIST_STATUS3_MIRACLE_EYED, - LIST_STATUS3_MAGNET_RISE, - LIST_STATUS3_HEAL_BLOCK, - LIST_STATUS3_AQUA_RING, - LIST_STATUS3_LASER_FOCUS, - LIST_STATUS3_POWER_TRICK, -}; - -enum -{ - LIST_STATUS4_ELECTRIFIED, - LIST_STATUS4_MUD_SPORT, - LIST_STATUS4_WATER_SPORT, - LIST_STATUS4_SALT_CURE, - LIST_STATUS4_SYRUP_BOMB, - LIST_STATUS4_GLAIVE_RUSH, + LIST_SIDE_STICKY_WEB, + LIST_SIDE_SPIKES, + LIST_SIDE_TOXIC_SPIKES, + LIST_SIDE_STEALTH_ROCK, + LIST_SIDE_STEELSURGE, }; enum { LIST_SIDE_REFLECT, LIST_SIDE_LIGHTSCREEN, - LIST_SIDE_STICKY_WEB, - LIST_SIDE_SPIKES, LIST_SIDE_SAFEGUARD, LIST_SIDE_MIST, LIST_SIDE_TAILWIND, LIST_SIDE_AURORA_VEIL, LIST_SIDE_LUCKY_CHANT, - LIST_SIDE_TOXIC_SPIKES, - LIST_SIDE_STEALTH_ROCK, - LIST_SIDE_STEELSURGE, LIST_SIDE_DAMAGE_NON_TYPES, LIST_SIDE_RAINBOW, LIST_SIDE_SEA_OF_FIRE, @@ -268,6 +217,8 @@ enum VAL_BITFIELD_8, VAL_BITFIELD_16, VAL_BITFIELD_32, + VAL_VOLATILE, + VAL_HAZARDS, VAR_SIDE_STATUS, VAR_SHOW_HP, VAR_SUBSTITUTE, @@ -278,150 +229,13 @@ enum }; // Static Declarations -static const u8 *GetHoldEffectName(enum ItemHoldEffect holdEffect); +static const u8 *GetHoldEffectName(enum HoldEffect holdEffect); // const rom data -static const u8 sText_Moves[] = _("Moves"); static const u8 sText_Ability[] = _("Ability"); static const u8 sText_HeldItem[] = _("Held Item"); static const u8 sText_HoldEffect[] = _("Hold Effect"); -static const u8 sText_PP[] = _("PP"); -static const u8 sText_Types[] = _("Types"); -static const u8 sText_Stats[] = _("Stats"); -static const u8 sText_StatStages[] = _("Stat Stages"); -static const u8 sText_Status1[] = _("Status1"); -static const u8 sText_Status2[] = _("Status2"); -static const u8 sText_Status3[] = _("Status3"); -static const u8 sText_Status4[] = _("Status4"); -static const u8 sText_SideStatus[] = _("Side Status"); -static const u8 sText_AI[] = _("AI"); -static const u8 sText_AIMovePts[] = _("AI Pts/Dmg"); -static const u8 sText_AiKnowledge[] = _("AI Info"); -static const u8 sText_AiParty[] = _("AI Party"); -static const u8 sText_Various[] = _("Various"); -static const u8 sText_CurrHp[] = _("HP Current"); -static const u8 sText_MaxHp[] = _("HP Max"); -static const u8 sText_Attack[] = _("Attack"); -static const u8 sText_Defense[] = _("Defense"); -static const u8 sText_Speed[] = _("Speed"); -static const u8 sText_SpAtk[] = _("Sp. Atk"); -static const u8 sText_SpDef[] = _("Sp. Def"); -static const u8 sText_Sleep[] = _("Sleep"); -static const u8 sText_Poison[] = _("Poison"); -static const u8 sText_Burn[] = _("Burn"); -static const u8 sText_Freeze[] = _("Freeze"); -static const u8 sText_Paralysis[] = _("Paralysis"); -static const u8 sText_ToxicPoison[] = _("Toxic Poison"); -static const u8 sText_ToxicCounter[] = _("Toxic Counter"); -static const u8 sText_Frostbite[] = _("Frostbite"); -static const u8 sText_Confusion[] = _("Confusion"); -static const u8 sText_Flinched[] = _("Flinched"); -static const u8 sText_Uproar[] = _("Uproar"); -static const u8 sText_Torment[] = _("Torment"); -static const u8 sText_Bide[] = _("Bide"); -static const u8 sText_LockConfuse[] = _("Lock Confuse"); -static const u8 sText_MultipleTurns[] = _("Multiple Turns"); -static const u8 sText_Wrapped[] = _("Wrapped"); -static const u8 sText_Powder[] = _("Powder"); -static const u8 sText_Infatuation[] = _("Infatuation"); -static const u8 sText_DefenseCurl[] = _("Defense Curl"); -static const u8 sText_Transformed[] = _("Transformed"); -static const u8 sText_Recharge[] = _("Recharge"); -static const u8 sText_Rage[] = _("Rage"); -static const u8 sText_Substitute[] = _("Substitute"); -static const u8 sText_DestinyBond[] = _("Destiny Bond"); -static const u8 sText_EscapePrevention[] = _("Escape Prevention"); -static const u8 sText_Nightmare[] = _("Nightmare"); -static const u8 sText_Cursed[] = _("Cursed"); -static const u8 sText_Foresight[] = _("Foresight"); -static const u8 sText_DragonCheer[] = _("Dragon Cheer"); -static const u8 sText_FocusEnergy[] = _("Focus Energy"); -static const u8 sText_LeechSeedHealer[] = _("Leech Seed Healer"); -static const u8 sText_LeechSeeded[] = _("Leech Seeded"); -static const u8 sText_AlwaysHits[] = _("Always Hits"); -static const u8 sText_PerishSong[] = _("Perish Song"); -static const u8 sText_OnAir[] = _("On Air"); -static const u8 sText_Underground[] = _("Underground"); -static const u8 sText_Minimized[] = _("Minimized"); -static const u8 sText_ChargedUp[] = _("Charged Up"); -static const u8 sText_Rooted[] = _("Rooted"); -static const u8 sText_Yawn[] = _("Yawn"); -static const u8 sText_ImprisonedOthers[] = _("Imprisoned Others"); -static const u8 sText_Grudge[] = _("Grudge"); -static const u8 sText_GastroAcid[] = _("Gastro Acid"); -static const u8 sText_Embargo[] = _("Embargo"); -static const u8 sText_Underwater[] = _("Underwater"); -static const u8 sText_Trace[] = _("Trace"); -static const u8 sText_SmackedDown[] = _("Smacked Down"); -static const u8 sText_MeFirst[] = _("Me First"); -static const u8 sText_Telekinesis[] = _("Telekinesis"); -static const u8 sText_PhantomForce[] = _("Phantom Force"); -static const u8 sText_MiracleEyed[] = _("Miracle Eyed"); -static const u8 sText_MagnetRise[] = _("Magnet Rise"); -static const u8 sText_HealBlock[] = _("Heal Block"); -static const u8 sText_AquaRing[] = _("Aqua Ring"); -static const u8 sText_LaserFocus[] = _("Laser Focus"); -static const u8 sText_PowerTrick[] = _("Power Trick"); -static const u8 sText_SkyDropped[] = _("Sky Dropped"); -static const u8 sText_Electrified[] = _("Electrified"); -static const u8 sText_MudSport[] = _("Mud Sport"); -static const u8 sText_WaterSport[] = _("Water Sport"); -static const u8 sText_InfiniteConfusion[] = _("Infinite Confusion"); -static const u8 sText_SaltCure[] = _("Salt Cure"); -static const u8 sText_SyrupBomb[] = _("Syrup Bomb"); -static const u8 sText_GlaiveRush[] = _("Glaive Rush"); -static const u8 sText_Reflect[] = _("Reflect"); -static const u8 sText_LightScreen[] = _("Light Screen"); -static const u8 sText_StickyWeb[] = _("Sticky Web"); -static const u8 sText_Spikes[] = _("Spikes"); -static const u8 sText_Safeguard[] = _("Safeguard"); -static const u8 sText_FutureAttack[] = _("Future Attack"); -static const u8 sText_Mist[] = _("Mist"); -static const u8 sText_Tailwind[] = _("Tailwind"); -static const u8 sText_AuroraVeil[] = _("Aurora Veil"); -static const u8 sText_LuckyChant[] = _("Lucky Chant"); -static const u8 sText_ToxicSpikes[] = _("Toxic Spikes"); -static const u8 sText_StealthRock[] = _("Stealth Rock"); -static const u8 sText_Steelsurge[] = _("Steelsurge"); -static const u8 sText_DamageNonTypes[] = _("Damage Non-Types"); -static const u8 sText_Rainbow[] = _("Rainbow"); -static const u8 sText_SeaOfFire[] = _("Sea of Fire"); -static const u8 sText_Swamp[] = _("Swamp"); -static const u8 sText_CheckBadMove[] = _("Check Bad Move"); -static const u8 sText_TryToFaint[] = _("Try to Faint"); -static const u8 sText_CheckViability[] = _("Check Viability"); -static const u8 sText_ForceSetupFirstTurn[] = _("Force Setup First Turn"); -static const u8 sText_Risky[] = _("Risky"); -static const u8 sText_TryTo2HKO[] = _("Try to 2HKO"); -static const u8 sText_PreferBatonPass[] = _("Prefer Baton Pass"); -static const u8 sText_DoubleBattle[] = _("Double Battle"); -static const u8 sText_HpAware[] = _("HP Aware"); -static const u8 sText_PowerfulStatus[] = _("Powerful Status"); -static const u8 sText_NegateUnaware[] = _("Negate Unaware"); -static const u8 sText_WillSuicide[] = _("Will Suicide"); -static const u8 sText_PreferStatusMoves[] = _("Prefer Status Moves"); -static const u8 sText_Stall[] = _("Stall"); -static const u8 sText_SmartSwitching[] = _("Smart Switching"); -static const u8 sText_AcePokemon[] = _("Ace PokΓ©mon"); -static const u8 sText_Omniscient[] = _("Omniscient"); -static const u8 sText_SmartMonChoices[] = _("Smart Mon Choices"); -static const u8 sText_Conservative[] = _("Conservative"); -static const u8 sText_SequenceSwitching[] = _("Sequence Switching"); -static const u8 sText_DoubleAcePokemon[] = _("Double Ace PokΓ©mon"); -static const u8 sText_WeighAbilityPrediction[] = _("Weigh Ability Prediction"); -static const u8 sText_PreferHighestDamageMove[] = _("Prefer Highest Damage Move"); -static const u8 sText_PredictSwitch[] = _("Predict Switch"); -static const u8 sText_PredictIncomingMon[] = _("Predict Incoming Mon"); -static const u8 sText_DynamicFunc[] = _("Dynamic Func"); -static const u8 sText_Roaming[] = _("Roaming"); -static const u8 sText_Safari[] = _("Safari"); -static const u8 sText_FirstBattle[] = _("First Battle"); -static const u8 sText_ShowHP[] = _("Show HP"); -static const u8 sText_SubstituteHp[] = _("Substitute HP"); -static const u8 sText_InLove[] = _("In Love"); -static const u8 sText_Unknown[] = _("Unknown"); static const u8 sText_EmptyString[] = _(""); -static const u8 sText_IsSwitching[] = _("Switching to "); static const struct BitfieldInfo sStatus1Bitfield[] = { @@ -435,23 +249,6 @@ static const struct BitfieldInfo sStatus1Bitfield[] = {/*Frostbite*/ 1, 12}, }; -static const struct BitfieldInfo sStatus2Bitfield[] = -{ - {/*Confusion*/ 3, 0}, - {/*Flinched*/ 1, 3}, - {/*Torment*/ 1, 7}, - {/*Powder*/ 1, 14}, - {/*Defense Curl*/ 1, 20}, - {/*Recharge*/ 1, 22}, - {/*Rage*/ 1, 23}, - {/*Destiny Bond*/ 1, 25}, - {/*Escape Prevention*/ 1, 26}, - {/*Cursed*/ 1, 28}, - {/*Foresight*/ 1, 29}, - {/*Dragon Cheer*/ 1, 30}, - {/*Focus Energy*/ 1, 31}, -}; - static const struct BitfieldInfo sStatus3Bitfield[] = { {/*Leech Seed Battler*/ 2, 0}, @@ -479,16 +276,6 @@ static const struct BitfieldInfo sStatus3Bitfield[] = {/*Power Trick*/ 1, 30}, }; -static const struct BitfieldInfo sStatus4Bitfield[] = -{ - {/*Electrified*/ 1, 0}, - {/*Mud Sport*/ 1, 1}, - {/*Water Sport*/ 1, 2}, - {/*Salt Cure*/ 1, 4}, - {/*Syrup Bomb*/ 1, 5}, - {/*Glaive Rush*/ 1, 6}, -}; - static const struct BitfieldInfo sAIBitfield[] = { {/*Check Bad Move*/ 1, 0}, @@ -524,160 +311,152 @@ static const struct BitfieldInfo sAIBitfield[] = static const struct ListMenuItem sMainListItems[] = { - {sText_Moves, LIST_ITEM_MOVES}, - {sText_Ability, LIST_ITEM_ABILITY}, - {sText_HeldItem, LIST_ITEM_HELD_ITEM}, - {sText_PP, LIST_ITEM_PP}, - {sText_Types, LIST_ITEM_TYPES}, - {sText_Stats, LIST_ITEM_STATS}, - {sText_StatStages, LIST_ITEM_STAT_STAGES}, - {sText_Status1, LIST_ITEM_STATUS1}, - {sText_Status2, LIST_ITEM_STATUS2}, - {sText_Status3, LIST_ITEM_STATUS3}, - {sText_Status4, LIST_ITEM_STATUS4}, - {sText_SideStatus, LIST_ITEM_SIDE_STATUS}, - {sText_AI, LIST_ITEM_AI}, - {sText_AIMovePts, LIST_ITEM_AI_MOVES_PTS}, - {sText_AiKnowledge, LIST_ITEM_AI_INFO}, - {sText_AiParty, LIST_ITEM_AI_PARTY}, - {sText_Various, LIST_ITEM_VARIOUS}, + {COMPOUND_STRING("Moves"), LIST_ITEM_MOVES}, + {sText_Ability, LIST_ITEM_ABILITY}, + {sText_HeldItem, LIST_ITEM_HELD_ITEM}, + {COMPOUND_STRING("PP"), LIST_ITEM_PP}, + {COMPOUND_STRING("Types"), LIST_ITEM_TYPES}, + {COMPOUND_STRING("Stats"), LIST_ITEM_STATS}, + {COMPOUND_STRING("Stat Stages"), LIST_ITEM_STAT_STAGES}, + {COMPOUND_STRING("Status1"), LIST_ITEM_STATUS1}, + {COMPOUND_STRING("Volatiles"), LIST_ITEM_VOLATILE}, + {COMPOUND_STRING("Hazards"), LIST_ITEM_HAZARDS}, + {COMPOUND_STRING("Side Status"), LIST_ITEM_SIDE_STATUS}, + {COMPOUND_STRING("AI"), LIST_ITEM_AI}, + {COMPOUND_STRING("AI Pts/Dmg"), LIST_ITEM_AI_MOVES_PTS}, + {COMPOUND_STRING("AI Info"), LIST_ITEM_AI_INFO}, + {COMPOUND_STRING("AI Party"), LIST_ITEM_AI_PARTY}, + {COMPOUND_STRING("Various"), LIST_ITEM_VARIOUS}, + {COMPOUND_STRING("Instant Win"), LIST_ITEM_INSTANT_WIN}, }; static const struct ListMenuItem sStatsListItems[] = { - {sText_CurrHp, LIST_STAT_HP_CURRENT}, - {sText_MaxHp, LIST_STAT_HP_MAX}, - {sText_Attack, LIST_STAT_ATTACK}, - {sText_Defense, LIST_STAT_DEFENSE}, - {sText_Speed, LIST_STAT_SPEED}, - {sText_SpAtk, LIST_STAT_SP_ATK}, - {sText_SpDef, LIST_STAT_SP_DEF}, + {COMPOUND_STRING("HP Current"), LIST_STAT_HP_CURRENT}, + {COMPOUND_STRING("HP Max"), LIST_STAT_HP_MAX}, + {COMPOUND_STRING("Attack"), LIST_STAT_ATTACK}, + {COMPOUND_STRING("Defense"), LIST_STAT_DEFENSE}, + {COMPOUND_STRING("Speed"), LIST_STAT_SPEED}, + {COMPOUND_STRING("Sp. Atk"), LIST_STAT_SP_ATK}, + {COMPOUND_STRING("Sp. Def"), LIST_STAT_SP_DEF}, }; static const struct ListMenuItem sStatus1ListItems[] = { - {sText_Sleep, LIST_STATUS1_SLEEP}, - {sText_Poison, LIST_STATUS1_POISON}, - {sText_Burn, LIST_STATUS1_BURN}, - {sText_Freeze, LIST_STATUS1_FREEZE}, - {sText_Paralysis, LIST_STATUS1_PARALYSIS}, - {sText_ToxicPoison, LIST_STATUS1_TOXIC_POISON}, - {sText_ToxicCounter, LIST_STATUS1_TOXIC_COUNTER}, - {sText_Frostbite, LIST_STATUS1_FROSTBITE}, + {COMPOUND_STRING("Sleep"), LIST_STATUS1_SLEEP}, + {COMPOUND_STRING("Poison"), LIST_STATUS1_POISON}, + {COMPOUND_STRING("Burn"), LIST_STATUS1_BURN}, + {COMPOUND_STRING("Freeze"), LIST_STATUS1_FREEZE}, + {COMPOUND_STRING("Paralysis"), LIST_STATUS1_PARALYSIS}, + {COMPOUND_STRING("Toxic Poison"), LIST_STATUS1_TOXIC_POISON}, + {COMPOUND_STRING("Toxic Counter"), LIST_STATUS1_TOXIC_COUNTER}, + {COMPOUND_STRING("Frostbite"), LIST_STATUS1_FROSTBITE}, }; -static const struct ListMenuItem sStatus2ListItems[] = -{ - {sText_Confusion, LIST_STATUS2_CONFUSION}, - {sText_Flinched, LIST_STATUS2_FLINCHED}, - {sText_Torment, LIST_STATUS2_TORMENT}, - {sText_Powder, LIST_STATUS2_POWDER}, - {sText_DefenseCurl, LIST_STATUS2_DEFENSE_CURL}, - {sText_Recharge, LIST_STATUS2_RECHARGE}, - {sText_Rage, LIST_STATUS2_RAGE}, - {sText_DestinyBond, LIST_STATUS2_DESTINY_BOND}, - {sText_EscapePrevention, LIST_STATUS2_ESCAPE_PREVENTION}, - {sText_Cursed, LIST_STATUS2_CURSED}, - {sText_Foresight, LIST_STATUS2_FORESIGHT}, - {sText_DragonCheer, LIST_STATUS2_DRAGON_CHEER}, - {sText_FocusEnergy, LIST_STATUS2_FOCUS_ENERGY}, +static const struct ListMenuItem sVolatileStatusListItems[] = +{ + {COMPOUND_STRING("Confusion"), VOLATILE_CONFUSION}, + {COMPOUND_STRING("Flinched"), VOLATILE_FLINCHED}, + {COMPOUND_STRING("Torment"), VOLATILE_TORMENT}, + {COMPOUND_STRING("Powder"), VOLATILE_POWDER}, + {COMPOUND_STRING("DefenseCurl"), VOLATILE_DEFENSE_CURL}, + {COMPOUND_STRING("Rage"), VOLATILE_RAGE}, + {COMPOUND_STRING("DestinyBond"), VOLATILE_DESTINY_BOND}, + {COMPOUND_STRING("EscapePrevention"), VOLATILE_ESCAPE_PREVENTION}, + {COMPOUND_STRING("Cursed"), VOLATILE_CURSED}, + {COMPOUND_STRING("Foresight"), VOLATILE_FORESIGHT}, + {COMPOUND_STRING("DragonCheer"), VOLATILE_DRAGON_CHEER}, + {COMPOUND_STRING("FocusEnergy"), VOLATILE_FOCUS_ENERGY}, + {COMPOUND_STRING("Electrified"), VOLATILE_ELECTRIFIED}, + {COMPOUND_STRING("MudSport"), VOLATILE_MUD_SPORT}, + {COMPOUND_STRING("WaterSport"), VOLATILE_WATER_SPORT}, + {COMPOUND_STRING("Infinite Confusion"), VOLATILE_INFINITE_CONFUSION}, + {COMPOUND_STRING("Salt Cure"), VOLATILE_SALT_CURE}, + {COMPOUND_STRING("Syrup Bomb"), VOLATILE_SYRUP_BOMB}, + {COMPOUND_STRING("Glaive Rush"), VOLATILE_GLAIVE_RUSH}, + {COMPOUND_STRING("Leech Seed"), VOLATILE_LEECH_SEED}, + {COMPOUND_STRING("Lock On"), VOLATILE_LOCK_ON}, + {COMPOUND_STRING("Perish Song"), VOLATILE_PERISH_SONG}, + {COMPOUND_STRING("Minimize"), VOLATILE_MINIMIZE}, + {COMPOUND_STRING("Charge"), VOLATILE_CHARGE_TIMER}, + {COMPOUND_STRING("Root"), VOLATILE_ROOT}, + {COMPOUND_STRING("Yawn"), VOLATILE_YAWN}, + {COMPOUND_STRING("Imprison"), VOLATILE_IMPRISON}, + {COMPOUND_STRING("Grudge"), VOLATILE_GRUDGE}, + {COMPOUND_STRING("Gastro Acid"), VOLATILE_GASTRO_ACID}, + {COMPOUND_STRING("Embargo"), VOLATILE_EMBARGO}, + {COMPOUND_STRING("Smack Down"), VOLATILE_SMACK_DOWN}, + {COMPOUND_STRING("Telekinesis"), VOLATILE_TELEKINESIS}, + {COMPOUND_STRING("Miracle Eye"), VOLATILE_MIRACLE_EYE}, + {COMPOUND_STRING("Magnet Rise"), VOLATILE_MAGNET_RISE}, + {COMPOUND_STRING("Heal Block"), VOLATILE_HEAL_BLOCK}, + {COMPOUND_STRING("Aqua Ring"), VOLATILE_AQUA_RING}, + {COMPOUND_STRING("Laser Focus"), VOLATILE_LASER_FOCUS}, + {COMPOUND_STRING("Power Trick"), VOLATILE_POWER_TRICK}, }; -static const struct ListMenuItem sStatus3ListItems[] = -{ - {sText_LeechSeedHealer, LIST_STATUS3_LEECH_SEED_HEALER}, - {sText_LeechSeeded, LIST_STATUS3_LEECH_SEEDED}, - {sText_AlwaysHits, LIST_STATUS3_ALWAYS_HITS}, - {sText_PerishSong, LIST_STATUS3_PERISH_SONG}, - {sText_OnAir, LIST_STATUS3_ON_AIR}, - {sText_Underground, LIST_STATUS3_UNDERGROUND}, - {sText_Minimized, LIST_STATUS3_MINIMIZED}, - {sText_ChargedUp, LIST_STATUS3_CHARGED_UP}, - {sText_Rooted, LIST_STATUS3_ROOTED}, - {sText_Yawn, LIST_STATUS3_YAWN}, - {sText_ImprisonedOthers, LIST_STATUS3_IMPRISONED_OTHERS}, - {sText_Grudge, LIST_STATUS3_GRUDGE}, - {sText_GastroAcid, LIST_STATUS3_GASTRO_ACID}, - {sText_Embargo, LIST_STATUS3_EMBARGO}, - {sText_Underwater, LIST_STATUS3_UNDERWATER}, - {sText_SmackedDown, LIST_STATUS3_SMACKED_DOWN}, - {sText_Telekinesis, LIST_STATUS3_TELEKINESIS}, - {sText_MiracleEyed, LIST_STATUS3_MIRACLE_EYED}, - {sText_MagnetRise, LIST_STATUS3_MAGNET_RISE}, - {sText_HealBlock, LIST_STATUS3_HEAL_BLOCK}, - {sText_AquaRing, LIST_STATUS3_AQUA_RING}, - {sText_LaserFocus, LIST_STATUS3_LASER_FOCUS}, - {sText_PowerTrick, LIST_STATUS3_POWER_TRICK}, -}; - -static const struct ListMenuItem sStatus4ListItems[] = +static const struct ListMenuItem sHazardsListItems[] = { - {sText_Electrified, LIST_STATUS4_ELECTRIFIED}, - {sText_MudSport, LIST_STATUS4_MUD_SPORT}, - {sText_WaterSport, LIST_STATUS4_WATER_SPORT}, - {sText_SaltCure, LIST_STATUS4_SALT_CURE}, - {sText_SyrupBomb, LIST_STATUS4_SYRUP_BOMB}, - {sText_GlaiveRush, LIST_STATUS4_GLAIVE_RUSH}, + {COMPOUND_STRING("Spikes"), LIST_SIDE_SPIKES}, + {COMPOUND_STRING("Sticky Web"), LIST_SIDE_STICKY_WEB}, + {COMPOUND_STRING("Toxic Spikes"), LIST_SIDE_TOXIC_SPIKES}, + {COMPOUND_STRING("Stealth Rock"), LIST_SIDE_STEALTH_ROCK}, + {COMPOUND_STRING("Steelsurge"), LIST_SIDE_STEELSURGE}, }; static const struct ListMenuItem sSideStatusListItems[] = { - {sText_Reflect, LIST_SIDE_REFLECT}, - {sText_LightScreen, LIST_SIDE_LIGHTSCREEN}, - {sText_StickyWeb, LIST_SIDE_STICKY_WEB}, - {sText_Spikes, LIST_SIDE_SPIKES}, - {sText_Safeguard, LIST_SIDE_SAFEGUARD}, - {sText_Mist, LIST_SIDE_MIST}, - {sText_Tailwind, LIST_SIDE_TAILWIND}, - {sText_AuroraVeil, LIST_SIDE_AURORA_VEIL}, - {sText_LuckyChant, LIST_SIDE_LUCKY_CHANT}, - {sText_ToxicSpikes, LIST_SIDE_TOXIC_SPIKES}, - {sText_StealthRock, LIST_SIDE_STEALTH_ROCK}, - {sText_Steelsurge, LIST_SIDE_STEELSURGE}, - {sText_DamageNonTypes, LIST_SIDE_DAMAGE_NON_TYPES}, - {sText_Rainbow, LIST_SIDE_RAINBOW}, - {sText_SeaOfFire, LIST_SIDE_SEA_OF_FIRE}, - {sText_Swamp, LIST_SIDE_SWAMP}, + {COMPOUND_STRING("Reflect"), LIST_SIDE_REFLECT}, + {COMPOUND_STRING("Light Screen"), LIST_SIDE_LIGHTSCREEN}, + {COMPOUND_STRING("Safeguard"), LIST_SIDE_SAFEGUARD}, + {COMPOUND_STRING("Mist"), LIST_SIDE_MIST}, + {COMPOUND_STRING("Tailwind"), LIST_SIDE_TAILWIND}, + {COMPOUND_STRING("Aurora Veil"), LIST_SIDE_AURORA_VEIL}, + {COMPOUND_STRING("Lucky Chant"), LIST_SIDE_LUCKY_CHANT}, + {COMPOUND_STRING("Damage Non-Types"), LIST_SIDE_DAMAGE_NON_TYPES}, + {COMPOUND_STRING("Rainbow"), LIST_SIDE_RAINBOW}, + {COMPOUND_STRING("Sea of Fire"), LIST_SIDE_SEA_OF_FIRE}, + {COMPOUND_STRING("Swamp"), LIST_SIDE_SWAMP}, }; static const struct ListMenuItem sAIListItems[] = { - {sText_CheckBadMove, LIST_AI_CHECK_BAD_MOVE}, - {sText_TryToFaint, LIST_AI_TRY_TO_FAINT}, - {sText_CheckViability, LIST_AI_CHECK_VIABILITY}, - {sText_ForceSetupFirstTurn, LIST_AI_FORCE_SETUP_FIRST_TURN}, - {sText_Risky, LIST_AI_RISKY}, - {sText_TryTo2HKO, LIST_AI_TRY_TO_2HKO}, - {sText_PreferBatonPass, LIST_AI_PREFER_BATON_PASS}, - {sText_DoubleBattle, LIST_AI_DOUBLE_BATTLE}, - {sText_HpAware, LIST_AI_HP_AWARE}, - {sText_PowerfulStatus, LIST_AI_POWERFUL_STATUS}, - {sText_NegateUnaware, LIST_AI_NEGATE_UNAWARE}, - {sText_WillSuicide, LIST_AI_WILL_SUICIDE}, - {sText_PreferStatusMoves, LIST_AI_PREFER_STATUS_MOVES}, - {sText_Stall, LIST_AI_STALL}, - {sText_SmartSwitching, LIST_AI_SMART_SWITCHING}, - {sText_AcePokemon, LIST_AI_ACE_POKEMON}, - {sText_Omniscient, LIST_AI_OMNISCIENT}, - {sText_SmartMonChoices, LIST_AI_SMART_MON_CHOICES}, - {sText_Conservative, LIST_AI_CONSERVATIVE}, - {sText_SequenceSwitching, LIST_AI_SEQUENCE_SWITCHING}, - {sText_DoubleAcePokemon, LIST_AI_DOUBLE_ACE_POKEMON}, - {sText_WeighAbilityPrediction, LIST_AI_WEIGH_ABILITY_PREDICTION}, - {sText_PreferHighestDamageMove, LIST_AI_PREFER_HIGHEST_DAMAGE_MOVE}, - {sText_PredictSwitch, LIST_AI_PREDICT_SWITCH}, - {sText_PredictIncomingMon, LIST_AI_PREDICT_INCOMING_MON}, - {sText_DynamicFunc, LIST_AI_DYNAMIC_FUNC}, - {sText_Roaming, LIST_AI_ROAMING}, - {sText_Safari, LIST_AI_SAFARI}, - {sText_FirstBattle, LIST_AI_FIRST_BATTLE}, + {COMPOUND_STRING("Check Bad Move"), LIST_AI_CHECK_BAD_MOVE}, + {COMPOUND_STRING("Try to Faint"), LIST_AI_TRY_TO_FAINT}, + {COMPOUND_STRING("Check Viability"), LIST_AI_CHECK_VIABILITY}, + {COMPOUND_STRING("Force Setup First Turn"), LIST_AI_FORCE_SETUP_FIRST_TURN}, + {COMPOUND_STRING("Risky"), LIST_AI_RISKY}, + {COMPOUND_STRING("Try to 2HKO"), LIST_AI_TRY_TO_2HKO}, + {COMPOUND_STRING("Prefer Baton Pass"), LIST_AI_PREFER_BATON_PASS}, + {COMPOUND_STRING("Double Battle"), LIST_AI_DOUBLE_BATTLE}, + {COMPOUND_STRING("HP Aware"), LIST_AI_HP_AWARE}, + {COMPOUND_STRING("Powerful Status"), LIST_AI_POWERFUL_STATUS}, + {COMPOUND_STRING("Negate Unaware"), LIST_AI_NEGATE_UNAWARE}, + {COMPOUND_STRING("Will Suicide"), LIST_AI_WILL_SUICIDE}, + {COMPOUND_STRING("Prefer Status Moves"), LIST_AI_PREFER_STATUS_MOVES}, + {COMPOUND_STRING("Stall"), LIST_AI_STALL}, + {COMPOUND_STRING("Smart Switching"), LIST_AI_SMART_SWITCHING}, + {COMPOUND_STRING("Ace PokΓ©mon"), LIST_AI_ACE_POKEMON}, + {COMPOUND_STRING("Omniscient"), LIST_AI_OMNISCIENT}, + {COMPOUND_STRING("Smart Mon Choices"), LIST_AI_SMART_MON_CHOICES}, + {COMPOUND_STRING("Conservative"), LIST_AI_CONSERVATIVE}, + {COMPOUND_STRING("Sequence Switching"), LIST_AI_SEQUENCE_SWITCHING}, + {COMPOUND_STRING("Double Ace PokΓ©mon"), LIST_AI_DOUBLE_ACE_POKEMON}, + {COMPOUND_STRING("Weigh Ability Prediction"), LIST_AI_WEIGH_ABILITY_PREDICTION}, + {COMPOUND_STRING("Prefer Highest Damage Move"), LIST_AI_PREFER_HIGHEST_DAMAGE_MOVE}, + {COMPOUND_STRING("Predict Switch"), LIST_AI_PREDICT_SWITCH}, + {COMPOUND_STRING("Predict Incoming Mon"), LIST_AI_PREDICT_INCOMING_MON}, + {COMPOUND_STRING("Dynamic Func"), LIST_AI_DYNAMIC_FUNC}, + {COMPOUND_STRING("Roaming"), LIST_AI_ROAMING}, + {COMPOUND_STRING("Safari"), LIST_AI_SAFARI}, + {COMPOUND_STRING("First Battle"), LIST_AI_FIRST_BATTLE}, }; static const struct ListMenuItem sVariousListItems[] = { - {sText_ShowHP, VARIOUS_SHOW_HP}, - {sText_SubstituteHp, VARIOUS_SUBSTITUTE_HP}, - {sText_InLove, VARIOUS_IN_LOVE}, + {COMPOUND_STRING("Show HP"), VARIOUS_SHOW_HP}, + {COMPOUND_STRING("Substitute HP"), VARIOUS_SUBSTITUTE_HP}, + {COMPOUND_STRING("In Love"), VARIOUS_IN_LOVE}, }; static const struct ListMenuItem sSecondaryListItems[] = @@ -805,19 +584,6 @@ static const struct BgTemplate sBgTemplates[] = } }; -static const u8 sBitsToMaxDigit[] = -{ - [0] = 0, - [1] = 1, // max 1 - [2] = 1, // max 3 - [3] = 1, // max 7 - [4] = 2, // max 15 - [5] = 2, // max 31 - [6] = 2, // max 63 - [7] = 3, // max 127 - [8] = 3, // max 255 -}; - static const bool8 sHasChangeableEntries[LIST_ITEM_COUNT] = { [LIST_ITEM_MOVES] = TRUE, @@ -844,6 +610,8 @@ static void PrintDigitChars(struct BattleDebugMenu *data); static void SetUpModifyArrows(struct BattleDebugMenu *data); static void UpdateBattlerValue(struct BattleDebugMenu *data); static void UpdateMonData(struct BattleDebugMenu *data); +static void ChangeHazardsValue(struct BattleDebugMenu *data); +static u32 GetHazardsValue(struct BattleDebugMenu *data); static u16 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, bool32 statusTrue); static bool32 TryMoveDigit(struct BattleDebugModifyArrows *modArrows, bool32 moveUp); static void SwitchToDebugView(u8 taskId); @@ -950,17 +718,27 @@ void CB2_BattleDebugMenu(void) } } +enum { + COLORID_RED, +}; + +static const u8 sTextColorTable[][3] = +{ + [COLORID_RED] = {TEXT_COLOR_WHITE, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED}, +}; + static void PutMovesPointsText(struct BattleDebugMenu *data) { - u32 i, j, count, battlerDef; + u32 i, j, count, battlerDef, chosenMoveIndex = gAiBattleData->chosenMoveIndex[data->aiBattlerId]; u8 *text = Alloc(0x50); FillWindowPixelBuffer(data->aiMovesWindowId, 0x11); + AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, COMPOUND_STRING("Score/Dmg"), 3, 0, 0, NULL); for (i = 0; i < MAX_MON_MOVES; i++) { text[0] = CHAR_SPACE; StringCopy(text + 1, GetMoveName(gBattleMons[data->aiBattlerId].moves[i])); - AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, text, 0, i * 15, 0, NULL); + AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, text, 0, (i * 15) + 15, 0, NULL); for (count = 0, j = 0; j < MAX_BATTLERS_COUNT; j++) { if (data->spriteIds.aiIconSpriteIds[j] == 0xFF) @@ -969,12 +747,24 @@ static void PutMovesPointsText(struct BattleDebugMenu *data) ConvertIntToDecimalStringN(text, gAiBattleData->finalScore[data->aiBattlerId][battlerDef][i], STR_CONV_MODE_RIGHT_ALIGN, 3); - AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, text, 83 + count * 54, i * 15, 0, NULL); + // If chosen move and chosen target + if ((chosenMoveIndex == i) && (gAiBattleData->chosenTarget[data->aiBattlerId] == j) && !(gAiLogicData->shouldSwitch & (1u << data->aiBattlerId))) + AddTextPrinterParameterized3(data->aiMovesWindowId, FONT_NORMAL, 84 + count * 54, (i * 15) + 15, sTextColorTable[COLORID_RED], 0, text); + else + AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, text, 84 + count * 54, (i * 15) + 15, 0, NULL); + + if ((chosenMoveIndex == i) && (gAiBattleData->chosenTarget[data->aiBattlerId] == j) && !(gAiLogicData->shouldSwitch & (1u << data->aiBattlerId))) + AddTextPrinterParameterized3(data->aiMovesWindowId, FONT_NORMAL, 103 + count * 54, (i * 15) + 15, sTextColorTable[COLORID_RED], 0, COMPOUND_STRING("/")); + else + AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, COMPOUND_STRING("/"), 103 + count * 54, (i * 15) + 15, 0, NULL); ConvertIntToDecimalStringN(text, AI_GetDamage(data->aiBattlerId, battlerDef, i, AI_ATTACKING, gAiLogicData), - STR_CONV_MODE_RIGHT_ALIGN, 3); - AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, text, 110 + count * 54, i * 15, 0, NULL); + STR_CONV_MODE_LEADING_ZEROS, 3); + if ((chosenMoveIndex == i) && (gAiBattleData->chosenTarget[data->aiBattlerId] == j) && !(gAiLogicData->shouldSwitch & (1u << data->aiBattlerId))) + AddTextPrinterParameterized3(data->aiMovesWindowId, FONT_NORMAL, 110 + count * 54, (i * 15) + 15, sTextColorTable[COLORID_RED], 0, text); + else + AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, text, 110 + count * 54, (i * 15) + 15, 0, NULL); count++; } @@ -982,10 +772,10 @@ static void PutMovesPointsText(struct BattleDebugMenu *data) if (gAiLogicData->shouldSwitch & (1u << data->aiBattlerId)) { - u32 switchMon = GetMonData(&gEnemyParty[gAiLogicData->mostSuitableMonId[data->aiBattlerId]], MON_DATA_SPECIES); - - AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, sText_IsSwitching, 74, 64, 0, NULL); - AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, gSpeciesInfo[switchMon].speciesName, 74 + 68, 64, 0, NULL); + struct Pokemon *party = GetBattlerParty(data->aiBattlerId); + u32 switchMon = GetMonData(&party[gAiLogicData->mostSuitableMonId[data->aiBattlerId]], MON_DATA_SPECIES); + AddTextPrinterParameterized3(data->aiMovesWindowId, FONT_NORMAL, 74, 79, sTextColorTable[COLORID_RED], 0, COMPOUND_STRING("Switching to ")); + AddTextPrinterParameterized3(data->aiMovesWindowId, FONT_NORMAL, 74 + 68, 79, sTextColorTable[COLORID_RED], 0, gSpeciesInfo[switchMon].speciesName); } CopyWindowToVram(data->aiMovesWindowId, COPYWIN_FULL); @@ -1037,7 +827,7 @@ static void Task_ShowAiPoints(u8 taskId) { data->spriteIds.aiIconSpriteIds[i] = CreateMonIcon(gBattleMons[i].species, SpriteCallbackDummy, - 95 + (count * 60), 17, 0, 0); + 106 + (count * 54), 17, 0, 0); gSprites[data->spriteIds.aiIconSpriteIds[i]].data[0] = i; // battler id count++; } @@ -1052,7 +842,7 @@ static void Task_ShowAiPoints(u8 taskId) GetMonData(mon, MON_DATA_IS_SHINY), gBattleMons[data->aiBattlerId].personality, TRUE, - 39, 130, 15, TAG_NONE); + 39, 135, 15, TAG_NONE); data->aiViewState++; break; // Put text @@ -1128,8 +918,8 @@ static void PutAiInfoText(struct BattleDebugMenu *data) { if (IsOnPlayerSide(i) && IsBattlerAlive(i)) { - u16 ability = gAiLogicData->abilities[i]; - enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[i]; + enum Ability ability = gAiLogicData->abilities[i]; + enum HoldEffect holdEffect = gAiLogicData->holdEffects[i]; u16 item = gAiLogicData->items[i]; u8 x = (i == B_POSITION_PLAYER_LEFT) ? 83 + (i) * 75 : 83 + (i-1) * 75; AddTextPrinterParameterized(data->aiMovesWindowId, FONT_SMALL, gAbilitiesInfo[ability].name, x, 0, 0, NULL); @@ -1415,6 +1205,13 @@ static void Task_DebugMenuProcessInput(u8 taskId) SwitchToAiPartyView(taskId); return; } + else if (listItemId == LIST_ITEM_INSTANT_WIN && JOY_NEW(A_BUTTON)) + { + BattleDebug_WonBattle(); + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_DebugMenuFadeOut; + return; + } data->currentMainListItemId = listItemId; // Create the secondary menu list. @@ -1586,20 +1383,9 @@ static void CreateSecondaryListMenu(struct BattleDebugMenu *data) itemsCount = ARRAY_COUNT(sStatus1ListItems); data->bitfield = sStatus1Bitfield; break; - case LIST_ITEM_STATUS2: - listTemplate.items = sStatus2ListItems; - itemsCount = ARRAY_COUNT(sStatus2ListItems); - data->bitfield = sStatus2Bitfield; - break; - case LIST_ITEM_STATUS3: - listTemplate.items = sStatus3ListItems; - itemsCount = ARRAY_COUNT(sStatus3ListItems); - data->bitfield = sStatus3Bitfield; - break; - case LIST_ITEM_STATUS4: - listTemplate.items = sStatus4ListItems; - itemsCount = ARRAY_COUNT(sStatus4ListItems); - data->bitfield = sStatus4Bitfield; + case LIST_ITEM_VOLATILE: + listTemplate.items = sVolatileStatusListItems; + itemsCount = ARRAY_COUNT(sVolatileStatusListItems); break; case LIST_ITEM_AI: listTemplate.items = sAIListItems; @@ -1610,10 +1396,15 @@ static void CreateSecondaryListMenu(struct BattleDebugMenu *data) listTemplate.items = sVariousListItems; itemsCount = ARRAY_COUNT(sVariousListItems); break; + case LIST_ITEM_HAZARDS: + listTemplate.items = sHazardsListItems; + itemsCount = ARRAY_COUNT(sHazardsListItems); + break; case LIST_ITEM_SIDE_STATUS: listTemplate.items = sSideStatusListItems; itemsCount = ARRAY_COUNT(sSideStatusListItems); break; + case LIST_ITEM_INSTANT_WIN: case LIST_ITEM_AI_MOVES_PTS: case LIST_ITEM_AI_INFO: return; @@ -1703,7 +1494,7 @@ static void PrintSecondaryEntries(struct BattleDebugMenu *data) case LIST_ITEM_TYPES: for (i = 0; i < 3; i++) { - u8 *types = &gBattleMons[data->battlerId].types[0]; + enum Type *types = &gBattleMons[data->battlerId].types[0]; PadString(gTypesInfo[types[i]].name, text); printer.currentY = printer.y = (i * yMultiplier) + sSecondaryListTemplate.upText_Y; @@ -1808,6 +1599,12 @@ static void UpdateBattlerValue(struct BattleDebugMenu *data) *(u32 *)(data->modifyArrows.modifiedValPtr) &= ~(GetBitfieldToAndValue(data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount)); *(u32 *)(data->modifyArrows.modifiedValPtr) |= (data->modifyArrows.currValue << data->bitfield[data->currentSecondaryListItemId].currBit); break; + case VAL_VOLATILE: + SetMonVolatile(data->battlerId, data->currentSecondaryListItemId, data->modifyArrows.currValue); + break; + case VAL_HAZARDS: + ChangeHazardsValue(data); + break; case VAR_SIDE_STATUS: *GetSideStatusValue(data, TRUE, data->modifyArrows.currValue != 0) = data->modifyArrows.currValue; break; @@ -1818,12 +1615,12 @@ static void UpdateBattlerValue(struct BattleDebugMenu *data) *(u8 *)(data->modifyArrows.modifiedValPtr) = data->modifyArrows.currValue; if (*(u8 *)(data->modifyArrows.modifiedValPtr) == 0) { - gBattleMons[data->battlerId].status2 &= ~STATUS2_SUBSTITUTE; + gBattleMons[data->battlerId].volatiles.substitute = FALSE; gBattleSpritesDataPtr->battlerData[data->battlerId].behindSubstitute = 0; } else { - gBattleMons[data->battlerId].status2 |= STATUS2_SUBSTITUTE; + gBattleMons[data->battlerId].volatiles.substitute = TRUE; gBattleSpritesDataPtr->battlerData[data->battlerId].behindSubstitute = 1; } break; @@ -1831,13 +1628,13 @@ static void UpdateBattlerValue(struct BattleDebugMenu *data) if (data->modifyArrows.currValue) { if (IsBattlerAlive(BATTLE_OPPOSITE(data->battlerId))) - gBattleMons[data->battlerId].status2 |= STATUS2_INFATUATED_WITH(BATTLE_OPPOSITE(data->battlerId)); + gBattleMons[data->battlerId].volatiles.infatuation = INFATUATED_WITH(BATTLE_OPPOSITE(data->battlerId)); else - gBattleMons[data->battlerId].status2 |= STATUS2_INFATUATED_WITH(BATTLE_PARTNER(BATTLE_OPPOSITE(data->battlerId))); + gBattleMons[data->battlerId].volatiles.infatuation = INFATUATED_WITH(BATTLE_PARTNER(BATTLE_OPPOSITE(data->battlerId))); } else { - gBattleMons[data->battlerId].status2 &= ~STATUS2_INFATUATION; + gBattleMons[data->battlerId].volatiles.infatuation = 0; } break; } @@ -1885,6 +1682,83 @@ static void ValueToCharDigits(u8 *charDigits, u32 newValue, u8 maxDigits) charDigits[i] = valueDigits[i] + CHAR_0; } +static void ChangeHazardsValue(struct BattleDebugMenu *data) +{ + u32 side = GetBattlerSide(data->battlerId); + + switch (data->currentSecondaryListItemId) + { + case LIST_SIDE_SPIKES: + if (data->modifyArrows.currValue > 0) + { + if (gSideTimers[side].spikesAmount == 0) + PushHazardTypeToQueue(side, HAZARDS_SPIKES); + gSideTimers[side].spikesAmount = data->modifyArrows.currValue; + } + else if (data->modifyArrows.currValue == 0) + { + gSideTimers[side].spikesAmount = 0; + RemoveHazardFromField(side, HAZARDS_SPIKES); + } + break; + case LIST_SIDE_TOXIC_SPIKES: + if (data->modifyArrows.currValue > 0) + { + if (gSideTimers[side].toxicSpikesAmount == 0) + PushHazardTypeToQueue(side, HAZARDS_TOXIC_SPIKES); + gSideTimers[side].toxicSpikesAmount = data->modifyArrows.currValue; + } + else if (data->modifyArrows.currValue == 0) + { + gSideTimers[side].toxicSpikesAmount = 0; + RemoveHazardFromField(side, HAZARDS_TOXIC_SPIKES); + } + break; + case LIST_SIDE_STICKY_WEB: + if (data->modifyArrows.currValue > 0) + PushHazardTypeToQueue(side, HAZARDS_STICKY_WEB); + else if (data->modifyArrows.currValue == 0) + RemoveHazardFromField(side, HAZARDS_STICKY_WEB); + break; + case LIST_SIDE_STEALTH_ROCK: + if (data->modifyArrows.currValue > 0) + PushHazardTypeToQueue(side, HAZARDS_STEALTH_ROCK); + else if (data->modifyArrows.currValue == 0) + RemoveHazardFromField(side, HAZARDS_STEALTH_ROCK); + break; + case LIST_SIDE_STEELSURGE: + if (data->modifyArrows.currValue > 0) + PushHazardTypeToQueue(side, HAZARDS_STEELSURGE); + else if (data->modifyArrows.currValue == 0) + RemoveHazardFromField(side, HAZARDS_STEELSURGE); + break; + } +} + +static u32 GetHazardsValue(struct BattleDebugMenu *data) +{ + u32 hazardsLayers = 0; + switch (data->currentSecondaryListItemId) + { + case LIST_SIDE_SPIKES: + hazardsLayers = gSideTimers[GetBattlerSide(data->battlerId)].spikesAmount; + break; + case LIST_SIDE_TOXIC_SPIKES: + hazardsLayers = gSideTimers[GetBattlerSide(data->battlerId)].toxicSpikesAmount; + break; + case LIST_SIDE_STICKY_WEB: + hazardsLayers = IsHazardOnSide(GetBattlerSide(data->battlerId), HAZARDS_STICKY_WEB); + break; + case LIST_SIDE_STEALTH_ROCK: + hazardsLayers = IsHazardOnSide(GetBattlerSide(data->battlerId), HAZARDS_STEALTH_ROCK); + break; + case LIST_SIDE_STEELSURGE: + hazardsLayers = IsHazardOnSide(GetBattlerSide(data->battlerId), HAZARDS_STEELSURGE); + break; + } + return hazardsLayers; +} + static u16 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, bool32 statusTrue) { struct SideTimer *sideTimer = &gSideTimers[GetBattlerSide(data->battlerId)]; @@ -1909,26 +1783,6 @@ static u16 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus *(u32 *)(data->modifyArrows.modifiedValPtr) &= ~SIDE_STATUS_LIGHTSCREEN; } return &sideTimer->lightscreenTimer; - case LIST_SIDE_STICKY_WEB: - if (changeStatus) - { - if (statusTrue) - *(u32 *)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_STICKY_WEB; - else - *(u32 *)(data->modifyArrows.modifiedValPtr) &= ~SIDE_STATUS_STICKY_WEB; - sideTimer->stickyWebBattlerId = data->battlerId; - sideTimer->stickyWebBattlerSide = GetBattlerSide(data->battlerId); - } - return &sideTimer->stickyWebAmount; - case LIST_SIDE_SPIKES: - if (changeStatus) - { - if (statusTrue) - *(u32 *)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_SPIKES; - else - *(u32 *)(data->modifyArrows.modifiedValPtr) &= ~SIDE_STATUS_SPIKES; - } - return &sideTimer->spikesAmount; case LIST_SIDE_SAFEGUARD: if (changeStatus) { @@ -1974,33 +1828,6 @@ static u16 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus *(u32 *)(data->modifyArrows.modifiedValPtr) &= ~SIDE_STATUS_LUCKY_CHANT; } return &sideTimer->luckyChantTimer; - case LIST_SIDE_TOXIC_SPIKES: - if (changeStatus) - { - if (statusTrue) - *(u32 *)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_TOXIC_SPIKES; - else - *(u32 *)(data->modifyArrows.modifiedValPtr) &= ~SIDE_STATUS_TOXIC_SPIKES; - } - return &sideTimer->toxicSpikesAmount; - case LIST_SIDE_STEALTH_ROCK: - if (changeStatus) - { - if (statusTrue) - *(u32 *)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_STEALTH_ROCK; - else - *(u32 *)(data->modifyArrows.modifiedValPtr) &= ~SIDE_STATUS_STEALTH_ROCK; - } - return &sideTimer->stealthRockAmount; - case LIST_SIDE_STEELSURGE: - if (changeStatus) - { - if (statusTrue) - *(u32 *)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_STEELSURGE; - else - *(u32 *)(data->modifyArrows.modifiedValPtr) &= ~SIDE_STATUS_STEELSURGE; - } - return &sideTimer->steelsurgeAmount; case LIST_SIDE_DAMAGE_NON_TYPES: if (changeStatus) { @@ -2167,7 +1994,7 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) data->modifyArrows.maxDigits = 1; data->modifyArrows.modifiedValPtr = NULL; data->modifyArrows.typeOfVal = VAR_IN_LOVE; - data->modifyArrows.currValue = (gBattleMons[data->battlerId].status2 & STATUS2_INFATUATION) != 0; + data->modifyArrows.currValue = gBattleMons[data->battlerId].volatiles.infatuation; } break; case LIST_ITEM_STATUS1: @@ -2175,21 +2002,28 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) data->modifyArrows.currValue = GetBitfieldValue(gBattleMons[data->battlerId].status1, data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); data->modifyArrows.typeOfVal = VAL_BITFIELD_32; goto CASE_ITEM_STATUS; - case LIST_ITEM_STATUS2: - data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].status2; - data->modifyArrows.currValue = GetBitfieldValue(gBattleMons[data->battlerId].status2, data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); - data->modifyArrows.typeOfVal = VAL_BITFIELD_32; - goto CASE_ITEM_STATUS; - case LIST_ITEM_STATUS3: - data->modifyArrows.modifiedValPtr = &gStatuses3[data->battlerId]; - data->modifyArrows.currValue = GetBitfieldValue(gStatuses3[data->battlerId], data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); - data->modifyArrows.typeOfVal = VAL_BITFIELD_32; - goto CASE_ITEM_STATUS; - case LIST_ITEM_STATUS4: - data->modifyArrows.modifiedValPtr = &gStatuses4[data->battlerId]; - data->modifyArrows.currValue = GetBitfieldValue(gStatuses4[data->battlerId], data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); - data->modifyArrows.typeOfVal = VAL_BITFIELD_32; - goto CASE_ITEM_STATUS; + case LIST_ITEM_VOLATILE: + data->modifyArrows.currValue = GetBattlerVolatile(data->battlerId, data->currentSecondaryListItemId); + data->modifyArrows.typeOfVal = VAL_VOLATILE; + data->modifyArrows.minValue = 0; +#define UNPACK_VOLATILE_MAX_SIZE(_enum, _fieldName, _typeMaxValue, ...) case _enum: data->modifyArrows.maxValue = min(MAX_u16, GET_VOLATILE_MAXIMUM(_typeMaxValue)); break; + switch (data->currentSecondaryListItemId) + { + VOLATILE_DEFINITIONS(UNPACK_VOLATILE_MAX_SIZE) + /* Expands to the following: + * case VOLATILE_CONFUSION: + data->modifyArrows.maxValue = MAX_BITS(3); // Max value 7 + break; + * case VOLATILE_FLINCHED: + data->modifyArrows.maxValue = MAX_BITS(1); // Max value 1 + break; + * ...etc. + */ + default: + data->modifyArrows.maxValue = 0; + } + data->modifyArrows.maxDigits = MAX_DIGITS(data->modifyArrows.maxValue); + break; case LIST_ITEM_AI: data->modifyArrows.modifiedValPtr = &gAiThinkingStruct->aiFlags[data->battlerId]; data->modifyArrows.currValue = GetBitfieldValue(gAiThinkingStruct->aiFlags[data->battlerId], data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); @@ -2198,18 +2032,31 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) CASE_ITEM_STATUS: data->modifyArrows.minValue = 0; data->modifyArrows.maxValue = (1 << data->bitfield[data->currentSecondaryListItemId].bitsCount) - 1; - data->modifyArrows.maxDigits = sBitsToMaxDigit[data->bitfield[data->currentSecondaryListItemId].bitsCount]; + data->modifyArrows.maxDigits = MAX_DIGITS(data->modifyArrows.maxValue); break; - case LIST_ITEM_SIDE_STATUS: + case LIST_ITEM_HAZARDS: data->modifyArrows.minValue = 0; - - if (data->currentSecondaryListItemId == LIST_SIDE_SPIKES) + switch (data->currentSecondaryListItemId) + { + case LIST_SIDE_SPIKES: data->modifyArrows.maxValue = 3; - else if (data->currentSecondaryListItemId == LIST_SIDE_STEALTH_ROCK || data->currentSecondaryListItemId == LIST_SIDE_STICKY_WEB) + break; + case LIST_SIDE_TOXIC_SPIKES: + data->modifyArrows.maxValue = 2; + break; + case LIST_SIDE_STICKY_WEB: + case LIST_SIDE_STEALTH_ROCK: + case LIST_SIDE_STEELSURGE: data->modifyArrows.maxValue = 1; - else - data->modifyArrows.maxValue = 9; - + break; + } + data->modifyArrows.maxDigits = 2; + data->modifyArrows.typeOfVal = VAL_HAZARDS; + data->modifyArrows.currValue = GetHazardsValue(data); + break; + case LIST_ITEM_SIDE_STATUS: + data->modifyArrows.minValue = 0; + data->modifyArrows.maxValue = 9; data->modifyArrows.maxDigits = 2; data->modifyArrows.modifiedValPtr = &gSideStatuses[GetBattlerSide(data->battlerId)]; data->modifyArrows.typeOfVal = VAR_SIDE_STATUS; @@ -2308,276 +2155,145 @@ static void UpdateMonData(struct BattleDebugMenu *data) } } -static const u8 sText_HoldEffectNone[] = _("????????"); -static const u8 sText_HoldEffectRestoreHp[] = _("Restore Hp"); -static const u8 sText_HoldEffectCurePar[] = _("Cure Par"); -static const u8 sText_HoldEffectCureSlp[] = _("Cure Slp"); -static const u8 sText_HoldEffectCurePsn[] = _("Cure Psn"); -static const u8 sText_HoldEffectCureBrn[] = _("Cure Brn"); -static const u8 sText_HoldEffectCureFrz[] = _("Cure Frz"); -static const u8 sText_HoldEffectRestorePp[] = _("Restore Pp"); -static const u8 sText_HoldEffectCureConfusion[] = _("Cure Confusion"); -static const u8 sText_HoldEffectCureStatus[] = _("Cure Status"); -static const u8 sText_HoldEffectConfuseSpicy[] = _("Confuse Spicy"); -static const u8 sText_HoldEffectConfuseDry[] = _("Confuse Dry"); -static const u8 sText_HoldEffectConfuseSweet[] = _("Confuse Sweet"); -static const u8 sText_HoldEffectConfuseBitter[] = _("Confuse Bitter"); -static const u8 sText_HoldEffectConfuseSour[] = _("Confuse Sour"); -static const u8 sText_HoldEffectAttackUp[] = _("Attack Up"); -static const u8 sText_HoldEffectDefenseUp[] = _("Defense Up"); -static const u8 sText_HoldEffectSpeedUp[] = _("Speed Up"); -static const u8 sText_HoldEffectSpAttackUp[] = _("Sp Attack Up"); -static const u8 sText_HoldEffectSpDefenseUp[] = _("Sp Defense Up"); -static const u8 sText_HoldEffectCriticalUp[] = _("Critical Up"); -static const u8 sText_HoldEffectRandomStatUp[] = _("Random Stat Up"); -static const u8 sText_HoldEffectEvasionUp[] = _("Evasion Up"); -static const u8 sText_HoldEffectRestoreStats[] = _("Restore Stats"); -static const u8 sText_HoldEffectMachoBrace[] = _("Macho Brace"); -static const u8 sText_HoldEffectExpShare[] = _("Exp Share"); -static const u8 sText_HoldEffectQuickClaw[] = _("Quick Claw"); -static const u8 sText_HoldEffectFriendshipUp[] = _("Friendship Up"); -static const u8 sText_HoldEffectMentalHerb[] = _("Mental Herb"); -static const u8 sText_HoldEffectChoiceBand[] = _("Choice Band"); -static const u8 sText_HoldEffectFlinch[] = _("Flinch"); -static const u8 sText_HoldEffectDoublePrize[] = _("Double Prize"); -static const u8 sText_HoldEffectRepel[] = _("Repel"); -static const u8 sText_HoldEffectSoulDew[] = _("Soul Dew"); -static const u8 sText_HoldEffectDeepSeaTooth[] = _("Deep Sea Tooth"); -static const u8 sText_HoldEffectDeepSeaScale[] = _("Deep Sea Scale"); -static const u8 sText_HoldEffectCanAlwaysRun[] = _("Can Always Run"); -static const u8 sText_HoldEffectPreventEvolve[] = _("Prevent Evolve"); -static const u8 sText_HoldEffectFocusBand[] = _("Focus Band"); -static const u8 sText_HoldEffectLuckyEgg[] = _("Lucky Egg"); -static const u8 sText_HoldEffectScopeLens[] = _("Scope Lens"); -static const u8 sText_HoldEffectLeftovers[] = _("Leftovers"); -static const u8 sText_HoldEffectDragonScale[] = _("Dragon Scale"); -static const u8 sText_HoldEffectLightBall[] = _("Light Ball"); -static const u8 sText_HoldEffectTypePower[] = _("Type Power"); -static const u8 sText_HoldEffectUpgrade[] = _("Upgrade"); -static const u8 sText_HoldEffectShellBell[] = _("Shell Bell"); -static const u8 sText_HoldEffectLuckyPunch[] = _("Lucky Punch"); -static const u8 sText_HoldEffectMetalPowder[] = _("Metal Powder"); -static const u8 sText_HoldEffectThickClub[] = _("Thick Club"); -static const u8 sText_HoldEffectLeek[] = _("Leek"); -static const u8 sText_HoldEffectChoiceScarf[] = _("Choice Scarf"); -static const u8 sText_HoldEffectChoiceSpecs[] = _("Choice Specs"); -static const u8 sText_HoldEffectDampRock[] = _("Damp Rock"); -static const u8 sText_HoldEffectGripClaw[] = _("Grip Claw"); -static const u8 sText_HoldEffectHeatRock[] = _("Heat Rock"); -static const u8 sText_HoldEffectIcyRock[] = _("Icy Rock"); -static const u8 sText_HoldEffectLightClay[] = _("Light Clay"); -static const u8 sText_HoldEffectSmoothRock[] = _("Smooth Rock"); -static const u8 sText_HoldEffectPowerHerb[] = _("Power Herb"); -static const u8 sText_HoldEffectBigRoot[] = _("Big Root"); -static const u8 sText_HoldEffectExpertBelt[] = _("Expert Belt"); -static const u8 sText_HoldEffectLifeOrb[] = _("Life Orb"); -static const u8 sText_HoldEffectMetronome[] = _("Metronome"); -static const u8 sText_HoldEffectMuscleBand[] = _("Muscle Band"); -static const u8 sText_HoldEffectWideLens[] = _("Wide Lens"); -static const u8 sText_HoldEffectWiseGlasses[] = _("Wise Glasses"); -static const u8 sText_HoldEffectZoomLens[] = _("Zoom Lens"); -static const u8 sText_HoldEffectLaggingTail[] = _("Lagging Tail"); -static const u8 sText_HoldEffectFocusSash[] = _("Focus Sash"); -static const u8 sText_HoldEffectFlameOrb[] = _("Flame Orb"); -static const u8 sText_HoldEffectToxicOrb[] = _("Toxic Orb"); -static const u8 sText_HoldEffectStickyBarb[] = _("Sticky Barb"); -static const u8 sText_HoldEffectIronBall[] = _("Iron Ball"); -static const u8 sText_HoldEffectBlackSludge[] = _("Black Sludge"); -static const u8 sText_HoldEffectDestinyKnot[] = _("Destiny Knot"); -static const u8 sText_HoldEffectShedShell[] = _("Shed Shell"); -static const u8 sText_HoldEffectQuickPowder[] = _("Quick Powder"); -static const u8 sText_HoldEffectAdamantOrb[] = _("Adamant Orb"); -static const u8 sText_HoldEffectLustrousOrb[] = _("Lustrous Orb"); -static const u8 sText_HoldEffectGriseousOrb[] = _("Griseous Orb"); -static const u8 sText_HoldEffectEnigmaBerry[] = _("Enigma Berry"); -static const u8 sText_HoldEffectResistBerry[] = _("Resist Berry"); -static const u8 sText_HoldEffectPowerItem[] = _("Power Item"); -static const u8 sText_HoldEffectRestorePctHp[] = _("Restore Pct Hp"); -static const u8 sText_HoldEffectMicleBerry[] = _("Micle Berry"); -static const u8 sText_HoldEffectCustapBerry[] = _("Custap Berry"); -static const u8 sText_HoldEffectJabocaBerry[] = _("Jaboca Berry"); -static const u8 sText_HoldEffectRowapBerry[] = _("Rowap Berry"); -static const u8 sText_HoldEffectKeeBerry[] = _("Kee Berry"); -static const u8 sText_HoldEffectMarangaBerry[] = _("Maranga Berry"); -static const u8 sText_HoldEffectFloatStone[] = _("Float Stone"); -static const u8 sText_HoldEffectEviolite[] = _("Eviolite"); -static const u8 sText_HoldEffectAssaultVest[] = _("Assault Vest"); -static const u8 sText_HoldEffectDrive[] = _("Drive"); -static const u8 sText_HoldEffectGems[] = _("Gems"); -static const u8 sText_HoldEffectRockyHelmet[] = _("Rocky Helmet"); -static const u8 sText_HoldEffectAirBalloon[] = _("Air Balloon"); -static const u8 sText_HoldEffectRedCard[] = _("Red Card"); -static const u8 sText_HoldEffectRingTarget[] = _("Ring Target"); -static const u8 sText_HoldEffectBindingBand[] = _("Binding Band"); -static const u8 sText_HoldEffectEjectButton[] = _("Eject Button"); -static const u8 sText_HoldEffectAbsorbBulb[] = _("Absorb Bulb"); -static const u8 sText_HoldEffectCellBattery[] = _("Cell Battery"); -static const u8 sText_HoldEffectMegaStone[] = _("Mega Stone"); -static const u8 sText_HoldEffectSafetyGoggles[] = _("Safety Goggles"); -static const u8 sText_HoldEffectLuminousMoss[] = _("Luminous Moss"); -static const u8 sText_HoldEffectSnowball[] = _("Snowball"); -static const u8 sText_HoldEffectWeaknessPolicy[] = _("Weakness Policy"); -static const u8 sText_HoldEffectPrimalOrb[] = _("Primal Orb"); -static const u8 sText_HoldEffectProtectivePads[] = _("Protective Pads"); -static const u8 sText_HoldEffectTerrainExtender[] = _("Terrain Extender"); -static const u8 sText_HoldEffectSeeds[] = _("Seeds"); -static const u8 sText_HoldEffectAdrenalineOrb[] = _("Adrenaline Orb"); -static const u8 sText_HoldEffectMemory[] = _("Memory"); -static const u8 sText_HoldEffectZCrystal[] = _("Z-Crystal"); -static const u8 sText_HoldEffectPlate[] = _("Plate"); -static const u8 sText_HoldEffectUtilityUmbrella[] = _("Utility Umbrella"); -static const u8 sText_HoldEffectEjectPack[] = _("Eject Pack"); -static const u8 sText_HoldEffectRoomService[] = _("Room Service"); -static const u8 sText_HoldEffectBlunderPolicy[] = _("Blunder Policy"); -static const u8 sText_HoldEffectHeavyDutyBoots[] = _("Heavy Duty Boots"); -static const u8 sText_HoldEffectThroatSpray[] = _("Throat Spray"); -static const u8 sText_HoldEffectAbilityShield[] = _("Ability Shield"); -static const u8 sText_HoldEffectClearAmulet[] = _("Clear Amulet"); -static const u8 sText_HoldEffectMirrorHerb[] = _("Mirror Herb"); -static const u8 sText_HoldEffectPunchingGlove[] = _("Punching Glove"); -static const u8 sText_HoldEffectCovertCloak[] = _("Covert Cloak"); -static const u8 sText_HoldEffectLoadedDice[] = _("Loaded Dice"); -static const u8 sText_HoldEffectBoosterEnergy[] = _("Booster Energy"); -static const u8 sText_HoldEffectBerserkGene[] = _("Berserk Gene"); -static const u8 sText_HoldEffectOgerponMask[] = _("Ogerpon Mask"); -static const u8 *const sHoldEffectNames[] = -{ - [HOLD_EFFECT_NONE] = sText_HoldEffectNone, - [HOLD_EFFECT_RESTORE_HP] = sText_HoldEffectRestoreHp, - [HOLD_EFFECT_CURE_PAR] = sText_HoldEffectCurePar, - [HOLD_EFFECT_CURE_SLP] = sText_HoldEffectCureSlp, - [HOLD_EFFECT_CURE_PSN] = sText_HoldEffectCurePsn, - [HOLD_EFFECT_CURE_BRN] = sText_HoldEffectCureBrn, - [HOLD_EFFECT_CURE_FRZ] = sText_HoldEffectCureFrz, - [HOLD_EFFECT_RESTORE_PP] = sText_HoldEffectRestorePp, - [HOLD_EFFECT_CURE_CONFUSION] = sText_HoldEffectCureConfusion, - [HOLD_EFFECT_CURE_STATUS] = sText_HoldEffectCureStatus, - [HOLD_EFFECT_CONFUSE_SPICY] = sText_HoldEffectConfuseSpicy, - [HOLD_EFFECT_CONFUSE_DRY] = sText_HoldEffectConfuseDry, - [HOLD_EFFECT_CONFUSE_SWEET] = sText_HoldEffectConfuseSweet, - [HOLD_EFFECT_CONFUSE_BITTER] = sText_HoldEffectConfuseBitter, - [HOLD_EFFECT_CONFUSE_SOUR] = sText_HoldEffectConfuseSour, - [HOLD_EFFECT_ATTACK_UP] = sText_HoldEffectAttackUp, - [HOLD_EFFECT_DEFENSE_UP] = sText_HoldEffectDefenseUp, - [HOLD_EFFECT_SPEED_UP] = sText_HoldEffectSpeedUp, - [HOLD_EFFECT_SP_ATTACK_UP] = sText_HoldEffectSpAttackUp, - [HOLD_EFFECT_SP_DEFENSE_UP] = sText_HoldEffectSpDefenseUp, - [HOLD_EFFECT_CRITICAL_UP] = sText_HoldEffectCriticalUp, - [HOLD_EFFECT_RANDOM_STAT_UP] = sText_HoldEffectRandomStatUp, - [HOLD_EFFECT_EVASION_UP] = sText_HoldEffectEvasionUp, - [HOLD_EFFECT_WHITE_HERB] = sText_HoldEffectRestoreStats, - [HOLD_EFFECT_MACHO_BRACE] = sText_HoldEffectMachoBrace, - [HOLD_EFFECT_EXP_SHARE] = sText_HoldEffectExpShare, - [HOLD_EFFECT_QUICK_CLAW] = sText_HoldEffectQuickClaw, - [HOLD_EFFECT_FRIENDSHIP_UP] = sText_HoldEffectFriendshipUp, - [HOLD_EFFECT_MENTAL_HERB] = sText_HoldEffectMentalHerb, - [HOLD_EFFECT_CHOICE_BAND] = sText_HoldEffectChoiceBand, - [HOLD_EFFECT_FLINCH] = sText_HoldEffectFlinch, - [HOLD_EFFECT_DOUBLE_PRIZE] = sText_HoldEffectDoublePrize, - [HOLD_EFFECT_REPEL] = sText_HoldEffectRepel, - [HOLD_EFFECT_SOUL_DEW] = sText_HoldEffectSoulDew, - [HOLD_EFFECT_DEEP_SEA_TOOTH] = sText_HoldEffectDeepSeaTooth, - [HOLD_EFFECT_DEEP_SEA_SCALE] = sText_HoldEffectDeepSeaScale, - [HOLD_EFFECT_CAN_ALWAYS_RUN] = sText_HoldEffectCanAlwaysRun, - [HOLD_EFFECT_PREVENT_EVOLVE] = sText_HoldEffectPreventEvolve, - [HOLD_EFFECT_FOCUS_BAND] = sText_HoldEffectFocusBand, - [HOLD_EFFECT_LUCKY_EGG] = sText_HoldEffectLuckyEgg, - [HOLD_EFFECT_SCOPE_LENS] = sText_HoldEffectScopeLens, - [HOLD_EFFECT_LEFTOVERS] = sText_HoldEffectLeftovers, - [HOLD_EFFECT_DRAGON_SCALE] = sText_HoldEffectDragonScale, - [HOLD_EFFECT_LIGHT_BALL] = sText_HoldEffectLightBall, - [HOLD_EFFECT_TYPE_POWER] = sText_HoldEffectTypePower, - [HOLD_EFFECT_UPGRADE] = sText_HoldEffectUpgrade, - [HOLD_EFFECT_SHELL_BELL] = sText_HoldEffectShellBell, - [HOLD_EFFECT_LUCKY_PUNCH] = sText_HoldEffectLuckyPunch, - [HOLD_EFFECT_METAL_POWDER] = sText_HoldEffectMetalPowder, - [HOLD_EFFECT_THICK_CLUB] = sText_HoldEffectThickClub, - [HOLD_EFFECT_LEEK] = sText_HoldEffectLeek, - [HOLD_EFFECT_CHOICE_SCARF] = sText_HoldEffectChoiceScarf, - [HOLD_EFFECT_CHOICE_SPECS] = sText_HoldEffectChoiceSpecs, - [HOLD_EFFECT_DAMP_ROCK] = sText_HoldEffectDampRock, - [HOLD_EFFECT_GRIP_CLAW] = sText_HoldEffectGripClaw, - [HOLD_EFFECT_HEAT_ROCK] = sText_HoldEffectHeatRock, - [HOLD_EFFECT_ICY_ROCK] = sText_HoldEffectIcyRock, - [HOLD_EFFECT_LIGHT_CLAY] = sText_HoldEffectLightClay, - [HOLD_EFFECT_SMOOTH_ROCK] = sText_HoldEffectSmoothRock, - [HOLD_EFFECT_POWER_HERB] = sText_HoldEffectPowerHerb, - [HOLD_EFFECT_BIG_ROOT] = sText_HoldEffectBigRoot, - [HOLD_EFFECT_EXPERT_BELT] = sText_HoldEffectExpertBelt, - [HOLD_EFFECT_LIFE_ORB] = sText_HoldEffectLifeOrb, - [HOLD_EFFECT_METRONOME] = sText_HoldEffectMetronome, - [HOLD_EFFECT_MUSCLE_BAND] = sText_HoldEffectMuscleBand, - [HOLD_EFFECT_WIDE_LENS] = sText_HoldEffectWideLens, - [HOLD_EFFECT_WISE_GLASSES] = sText_HoldEffectWiseGlasses, - [HOLD_EFFECT_ZOOM_LENS] = sText_HoldEffectZoomLens, - [HOLD_EFFECT_LAGGING_TAIL] = sText_HoldEffectLaggingTail, - [HOLD_EFFECT_FOCUS_SASH] = sText_HoldEffectFocusSash, - [HOLD_EFFECT_FLAME_ORB] = sText_HoldEffectFlameOrb, - [HOLD_EFFECT_TOXIC_ORB] = sText_HoldEffectToxicOrb, - [HOLD_EFFECT_STICKY_BARB] = sText_HoldEffectStickyBarb, - [HOLD_EFFECT_IRON_BALL] = sText_HoldEffectIronBall, - [HOLD_EFFECT_BLACK_SLUDGE] = sText_HoldEffectBlackSludge, - [HOLD_EFFECT_DESTINY_KNOT] = sText_HoldEffectDestinyKnot, - [HOLD_EFFECT_SHED_SHELL] = sText_HoldEffectShedShell, - [HOLD_EFFECT_QUICK_POWDER] = sText_HoldEffectQuickPowder, - [HOLD_EFFECT_ADAMANT_ORB] = sText_HoldEffectAdamantOrb, - [HOLD_EFFECT_LUSTROUS_ORB] = sText_HoldEffectLustrousOrb, - [HOLD_EFFECT_GRISEOUS_ORB] = sText_HoldEffectGriseousOrb, - [HOLD_EFFECT_ENIGMA_BERRY] = sText_HoldEffectEnigmaBerry, - [HOLD_EFFECT_RESIST_BERRY] = sText_HoldEffectResistBerry, - [HOLD_EFFECT_POWER_ITEM] = sText_HoldEffectPowerItem, - [HOLD_EFFECT_RESTORE_PCT_HP] = sText_HoldEffectRestorePctHp, - [HOLD_EFFECT_MICLE_BERRY] = sText_HoldEffectMicleBerry, - [HOLD_EFFECT_CUSTAP_BERRY] = sText_HoldEffectCustapBerry, - [HOLD_EFFECT_JABOCA_BERRY] = sText_HoldEffectJabocaBerry, - [HOLD_EFFECT_ROWAP_BERRY] = sText_HoldEffectRowapBerry, - [HOLD_EFFECT_KEE_BERRY] = sText_HoldEffectKeeBerry, - [HOLD_EFFECT_MARANGA_BERRY] = sText_HoldEffectMarangaBerry, - [HOLD_EFFECT_PLATE] = sText_HoldEffectPlate, - [HOLD_EFFECT_FLOAT_STONE] = sText_HoldEffectFloatStone, - [HOLD_EFFECT_EVIOLITE] = sText_HoldEffectEviolite, - [HOLD_EFFECT_ASSAULT_VEST] = sText_HoldEffectAssaultVest, - [HOLD_EFFECT_DRIVE] = sText_HoldEffectDrive, - [HOLD_EFFECT_GEMS] = sText_HoldEffectGems, - [HOLD_EFFECT_ROCKY_HELMET] = sText_HoldEffectRockyHelmet, - [HOLD_EFFECT_AIR_BALLOON] = sText_HoldEffectAirBalloon, - [HOLD_EFFECT_RED_CARD] = sText_HoldEffectRedCard, - [HOLD_EFFECT_RING_TARGET] = sText_HoldEffectRingTarget, - [HOLD_EFFECT_BINDING_BAND] = sText_HoldEffectBindingBand, - [HOLD_EFFECT_EJECT_BUTTON] = sText_HoldEffectEjectButton, - [HOLD_EFFECT_ABSORB_BULB] = sText_HoldEffectAbsorbBulb, - [HOLD_EFFECT_CELL_BATTERY] = sText_HoldEffectCellBattery, - [HOLD_EFFECT_MEGA_STONE] = sText_HoldEffectMegaStone, - [HOLD_EFFECT_SAFETY_GOGGLES] = sText_HoldEffectSafetyGoggles, - [HOLD_EFFECT_LUMINOUS_MOSS] = sText_HoldEffectLuminousMoss, - [HOLD_EFFECT_SNOWBALL] = sText_HoldEffectSnowball, - [HOLD_EFFECT_WEAKNESS_POLICY] = sText_HoldEffectWeaknessPolicy, - [HOLD_EFFECT_PRIMAL_ORB] = sText_HoldEffectPrimalOrb, - [HOLD_EFFECT_PROTECTIVE_PADS] = sText_HoldEffectProtectivePads, - [HOLD_EFFECT_TERRAIN_EXTENDER] = sText_HoldEffectTerrainExtender, - [HOLD_EFFECT_SEEDS] = sText_HoldEffectSeeds, - [HOLD_EFFECT_ADRENALINE_ORB] = sText_HoldEffectAdrenalineOrb, - [HOLD_EFFECT_MEMORY] = sText_HoldEffectMemory, - [HOLD_EFFECT_Z_CRYSTAL] = sText_HoldEffectZCrystal, - [HOLD_EFFECT_UTILITY_UMBRELLA] = sText_HoldEffectUtilityUmbrella, - [HOLD_EFFECT_EJECT_PACK] = sText_HoldEffectEjectPack, - [HOLD_EFFECT_ROOM_SERVICE] = sText_HoldEffectRoomService, - [HOLD_EFFECT_BLUNDER_POLICY] = sText_HoldEffectBlunderPolicy, - [HOLD_EFFECT_HEAVY_DUTY_BOOTS] = sText_HoldEffectHeavyDutyBoots, - [HOLD_EFFECT_THROAT_SPRAY] = sText_HoldEffectThroatSpray, - [HOLD_EFFECT_ABILITY_SHIELD] = sText_HoldEffectAbilityShield, - [HOLD_EFFECT_CLEAR_AMULET] = sText_HoldEffectClearAmulet, - [HOLD_EFFECT_MIRROR_HERB] = sText_HoldEffectMirrorHerb, - [HOLD_EFFECT_PUNCHING_GLOVE] = sText_HoldEffectPunchingGlove, - [HOLD_EFFECT_COVERT_CLOAK] = sText_HoldEffectCovertCloak, - [HOLD_EFFECT_LOADED_DICE] = sText_HoldEffectLoadedDice, - [HOLD_EFFECT_BOOSTER_ENERGY] = sText_HoldEffectBoosterEnergy, - [HOLD_EFFECT_OGERPON_MASK] = sText_HoldEffectOgerponMask, - [HOLD_EFFECT_BERSERK_GENE] = sText_HoldEffectBerserkGene, +static const u8 *const sHoldEffectNames[HOLD_EFFECT_COUNT] = +{ + [HOLD_EFFECT_NONE] = COMPOUND_STRING("????????"), + [HOLD_EFFECT_RESTORE_HP] = COMPOUND_STRING("Restore Hp"), + [HOLD_EFFECT_CURE_PAR] = COMPOUND_STRING("Cure Par"), + [HOLD_EFFECT_CURE_SLP] = COMPOUND_STRING("Cure Slp"), + [HOLD_EFFECT_CURE_PSN] = COMPOUND_STRING("Cure Psn"), + [HOLD_EFFECT_CURE_BRN] = COMPOUND_STRING("Cure Brn"), + [HOLD_EFFECT_CURE_FRZ] = COMPOUND_STRING("Cure Frz"), + [HOLD_EFFECT_RESTORE_PP] = COMPOUND_STRING("Restore Pp"), + [HOLD_EFFECT_CURE_CONFUSION] = COMPOUND_STRING("Cure Confusion"), + [HOLD_EFFECT_CURE_STATUS] = COMPOUND_STRING("Cure Status"), + [HOLD_EFFECT_CONFUSE_SPICY] = COMPOUND_STRING("Confuse Spicy"), + [HOLD_EFFECT_CONFUSE_DRY] = COMPOUND_STRING("Confuse Dry"), + [HOLD_EFFECT_CONFUSE_SWEET] = COMPOUND_STRING("Confuse Sweet"), + [HOLD_EFFECT_CONFUSE_BITTER] = COMPOUND_STRING("Confuse Bitter"), + [HOLD_EFFECT_CONFUSE_SOUR] = COMPOUND_STRING("Confuse Sour"), + [HOLD_EFFECT_ATTACK_UP] = COMPOUND_STRING("Attack Up"), + [HOLD_EFFECT_DEFENSE_UP] = COMPOUND_STRING("Defense Up"), + [HOLD_EFFECT_SPEED_UP] = COMPOUND_STRING("Speed Up"), + [HOLD_EFFECT_SP_ATTACK_UP] = COMPOUND_STRING("Sp Attack Up"), + [HOLD_EFFECT_SP_DEFENSE_UP] = COMPOUND_STRING("Sp Defense Up"), + [HOLD_EFFECT_CRITICAL_UP] = COMPOUND_STRING("Critical Up"), + [HOLD_EFFECT_RANDOM_STAT_UP] = COMPOUND_STRING("Random Stat Up"), + [HOLD_EFFECT_EVASION_UP] = COMPOUND_STRING("Evasion Up"), + [HOLD_EFFECT_WHITE_HERB] = COMPOUND_STRING("Restore Stats"), + [HOLD_EFFECT_MACHO_BRACE] = COMPOUND_STRING("Macho Brace"), + [HOLD_EFFECT_EXP_SHARE] = COMPOUND_STRING("Exp Share"), + [HOLD_EFFECT_QUICK_CLAW] = COMPOUND_STRING("Quick Claw"), + [HOLD_EFFECT_FRIENDSHIP_UP] = COMPOUND_STRING("Friendship Up"), + [HOLD_EFFECT_MENTAL_HERB] = COMPOUND_STRING("Mental Herb"), + [HOLD_EFFECT_CHOICE_BAND] = COMPOUND_STRING("Choice Band"), + [HOLD_EFFECT_FLINCH] = COMPOUND_STRING("Flinch"), + [HOLD_EFFECT_DOUBLE_PRIZE] = COMPOUND_STRING("Double Prize"), + [HOLD_EFFECT_REPEL] = COMPOUND_STRING("Repel"), + [HOLD_EFFECT_SOUL_DEW] = COMPOUND_STRING("Soul Dew"), + [HOLD_EFFECT_DEEP_SEA_TOOTH] = COMPOUND_STRING("Deep Sea Tooth"), + [HOLD_EFFECT_DEEP_SEA_SCALE] = COMPOUND_STRING("Deep Sea Scale"), + [HOLD_EFFECT_CAN_ALWAYS_RUN] = COMPOUND_STRING("Can Always Run"), + [HOLD_EFFECT_PREVENT_EVOLVE] = COMPOUND_STRING("Prevent Evolve"), + [HOLD_EFFECT_FOCUS_BAND] = COMPOUND_STRING("Focus Band"), + [HOLD_EFFECT_LUCKY_EGG] = COMPOUND_STRING("Lucky Egg"), + [HOLD_EFFECT_SCOPE_LENS] = COMPOUND_STRING("Scope Lens"), + [HOLD_EFFECT_LEFTOVERS] = COMPOUND_STRING("Leftovers"), + [HOLD_EFFECT_DRAGON_SCALE] = COMPOUND_STRING("Dragon Scale"), + [HOLD_EFFECT_LIGHT_BALL] = COMPOUND_STRING("Light Ball"), + [HOLD_EFFECT_TYPE_POWER] = COMPOUND_STRING("Type Power"), + [HOLD_EFFECT_UPGRADE] = COMPOUND_STRING("Upgrade"), + [HOLD_EFFECT_SHELL_BELL] = COMPOUND_STRING("Shell Bell"), + [HOLD_EFFECT_LUCKY_PUNCH] = COMPOUND_STRING("Lucky Punch"), + [HOLD_EFFECT_METAL_POWDER] = COMPOUND_STRING("Metal Powder"), + [HOLD_EFFECT_THICK_CLUB] = COMPOUND_STRING("Thick Club"), + [HOLD_EFFECT_LEEK] = COMPOUND_STRING("Leek"), + [HOLD_EFFECT_CHOICE_SCARF] = COMPOUND_STRING("Choice Scarf"), + [HOLD_EFFECT_CHOICE_SPECS] = COMPOUND_STRING("Choice Specs"), + [HOLD_EFFECT_DAMP_ROCK] = COMPOUND_STRING("Damp Rock"), + [HOLD_EFFECT_GRIP_CLAW] = COMPOUND_STRING("Grip Claw"), + [HOLD_EFFECT_HEAT_ROCK] = COMPOUND_STRING("Heat Rock"), + [HOLD_EFFECT_ICY_ROCK] = COMPOUND_STRING("Icy Rock"), + [HOLD_EFFECT_LIGHT_CLAY] = COMPOUND_STRING("Light Clay"), + [HOLD_EFFECT_SMOOTH_ROCK] = COMPOUND_STRING("Smooth Rock"), + [HOLD_EFFECT_POWER_HERB] = COMPOUND_STRING("Power Herb"), + [HOLD_EFFECT_BIG_ROOT] = COMPOUND_STRING("Big Root"), + [HOLD_EFFECT_EXPERT_BELT] = COMPOUND_STRING("Expert Belt"), + [HOLD_EFFECT_LIFE_ORB] = COMPOUND_STRING("Life Orb"), + [HOLD_EFFECT_METRONOME] = COMPOUND_STRING("Metronome"), + [HOLD_EFFECT_MUSCLE_BAND] = COMPOUND_STRING("Muscle Band"), + [HOLD_EFFECT_WIDE_LENS] = COMPOUND_STRING("Wide Lens"), + [HOLD_EFFECT_WISE_GLASSES] = COMPOUND_STRING("Wise Glasses"), + [HOLD_EFFECT_ZOOM_LENS] = COMPOUND_STRING("Zoom Lens"), + [HOLD_EFFECT_LAGGING_TAIL] = COMPOUND_STRING("Lagging Tail"), + [HOLD_EFFECT_FOCUS_SASH] = COMPOUND_STRING("Focus Sash"), + [HOLD_EFFECT_FLAME_ORB] = COMPOUND_STRING("Flame Orb"), + [HOLD_EFFECT_TOXIC_ORB] = COMPOUND_STRING("Toxic Orb"), + [HOLD_EFFECT_STICKY_BARB] = COMPOUND_STRING("Sticky Barb"), + [HOLD_EFFECT_IRON_BALL] = COMPOUND_STRING("Iron Ball"), + [HOLD_EFFECT_BLACK_SLUDGE] = COMPOUND_STRING("Black Sludge"), + [HOLD_EFFECT_DESTINY_KNOT] = COMPOUND_STRING("Destiny Knot"), + [HOLD_EFFECT_SHED_SHELL] = COMPOUND_STRING("Shed Shell"), + [HOLD_EFFECT_QUICK_POWDER] = COMPOUND_STRING("Quick Powder"), + [HOLD_EFFECT_ADAMANT_ORB] = COMPOUND_STRING("Adamant Orb"), + [HOLD_EFFECT_LUSTROUS_ORB] = COMPOUND_STRING("Lustrous Orb"), + [HOLD_EFFECT_GRISEOUS_ORB] = COMPOUND_STRING("Griseous Orb"), + [HOLD_EFFECT_ENIGMA_BERRY] = COMPOUND_STRING("Enigma Berry"), + [HOLD_EFFECT_RESIST_BERRY] = COMPOUND_STRING("Resist Berry"), + [HOLD_EFFECT_POWER_ITEM] = COMPOUND_STRING("Power Item"), + [HOLD_EFFECT_RESTORE_PCT_HP] = COMPOUND_STRING("Restore Pct Hp"), + [HOLD_EFFECT_MICLE_BERRY] = COMPOUND_STRING("Micle Berry"), + [HOLD_EFFECT_CUSTAP_BERRY] = COMPOUND_STRING("Custap Berry"), + [HOLD_EFFECT_JABOCA_BERRY] = COMPOUND_STRING("Jaboca Berry"), + [HOLD_EFFECT_ROWAP_BERRY] = COMPOUND_STRING("Rowap Berry"), + [HOLD_EFFECT_KEE_BERRY] = COMPOUND_STRING("Kee Berry"), + [HOLD_EFFECT_MARANGA_BERRY] = COMPOUND_STRING("Maranga Berry"), + [HOLD_EFFECT_PLATE] = COMPOUND_STRING("Plate"), + [HOLD_EFFECT_FLOAT_STONE] = COMPOUND_STRING("Float Stone"), + [HOLD_EFFECT_EVIOLITE] = COMPOUND_STRING("Eviolite"), + [HOLD_EFFECT_ASSAULT_VEST] = COMPOUND_STRING("Assault Vest"), + [HOLD_EFFECT_DRIVE] = COMPOUND_STRING("Drive"), + [HOLD_EFFECT_GEMS] = COMPOUND_STRING("Gems"), + [HOLD_EFFECT_ROCKY_HELMET] = COMPOUND_STRING("Rocky Helmet"), + [HOLD_EFFECT_AIR_BALLOON] = COMPOUND_STRING("Air Balloon"), + [HOLD_EFFECT_RED_CARD] = COMPOUND_STRING("Red Card"), + [HOLD_EFFECT_RING_TARGET] = COMPOUND_STRING("Ring Target"), + [HOLD_EFFECT_BINDING_BAND] = COMPOUND_STRING("Binding Band"), + [HOLD_EFFECT_EJECT_BUTTON] = COMPOUND_STRING("Eject Button"), + [HOLD_EFFECT_ABSORB_BULB] = COMPOUND_STRING("Absorb Bulb"), + [HOLD_EFFECT_CELL_BATTERY] = COMPOUND_STRING("Cell Battery"), + [HOLD_EFFECT_MEGA_STONE] = COMPOUND_STRING("Mega Stone"), + [HOLD_EFFECT_SAFETY_GOGGLES] = COMPOUND_STRING("Safety Goggles"), + [HOLD_EFFECT_LUMINOUS_MOSS] = COMPOUND_STRING("Luminous Moss"), + [HOLD_EFFECT_SNOWBALL] = COMPOUND_STRING("Snowball"), + [HOLD_EFFECT_WEAKNESS_POLICY] = COMPOUND_STRING("Weakness Policy"), + [HOLD_EFFECT_PRIMAL_ORB] = COMPOUND_STRING("Primal Orb"), + [HOLD_EFFECT_PROTECTIVE_PADS] = COMPOUND_STRING("Protective Pads"), + [HOLD_EFFECT_TERRAIN_EXTENDER] = COMPOUND_STRING("Terrain Extender"), + [HOLD_EFFECT_TERRAIN_SEED] = COMPOUND_STRING("Seeds"), + [HOLD_EFFECT_ADRENALINE_ORB] = COMPOUND_STRING("Adrenaline Orb"), + [HOLD_EFFECT_MEMORY] = COMPOUND_STRING("Memory"), + [HOLD_EFFECT_Z_CRYSTAL] = COMPOUND_STRING("Z-Crystal"), + [HOLD_EFFECT_UTILITY_UMBRELLA] = COMPOUND_STRING("Utility Umbrella"), + [HOLD_EFFECT_EJECT_PACK] = COMPOUND_STRING("Eject Pack"), + [HOLD_EFFECT_ROOM_SERVICE] = COMPOUND_STRING("Room Service"), + [HOLD_EFFECT_BLUNDER_POLICY] = COMPOUND_STRING("Blunder Policy"), + [HOLD_EFFECT_HEAVY_DUTY_BOOTS] = COMPOUND_STRING("Heavy Duty Boots"), + [HOLD_EFFECT_THROAT_SPRAY] = COMPOUND_STRING("Throat Spray"), + [HOLD_EFFECT_ABILITY_SHIELD] = COMPOUND_STRING("Ability Shield"), + [HOLD_EFFECT_CLEAR_AMULET] = COMPOUND_STRING("Clear Amulet"), + [HOLD_EFFECT_MIRROR_HERB] = COMPOUND_STRING("Mirror Herb"), + [HOLD_EFFECT_PUNCHING_GLOVE] = COMPOUND_STRING("Punching Glove"), + [HOLD_EFFECT_COVERT_CLOAK] = COMPOUND_STRING("Covert Cloak"), + [HOLD_EFFECT_LOADED_DICE] = COMPOUND_STRING("Loaded Dice"), + [HOLD_EFFECT_BOOSTER_ENERGY] = COMPOUND_STRING("Booster Energy"), + [HOLD_EFFECT_OGERPON_MASK] = COMPOUND_STRING("Ogerpon Mask"), + [HOLD_EFFECT_BERSERK_GENE] = COMPOUND_STRING("Berserk Gene"), }; -static const u8 *GetHoldEffectName(enum ItemHoldEffect holdEffect) + +static const u8 *GetHoldEffectName(enum HoldEffect holdEffect) { - if (holdEffect > ARRAY_COUNT(sHoldEffectNames)) + if (sHoldEffectNames[holdEffect] == NULL) return sHoldEffectNames[0]; return sHoldEffectNames[holdEffect]; } diff --git a/src/battle_dome.c b/src/battle_dome.c index 28de62c07a92..30075fad88b8 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -27,6 +27,7 @@ #include "sound.h" #include "pokemon_icon.h" #include "data.h" +#include "item.h" #include "international_string_util.h" #include "trainer_pokemon_sprites.h" #include "scanline_effect.h" @@ -2030,8 +2031,8 @@ static void InitDomeTrainers(void) rankingScores[0] += GetMonData(&gPlayerParty[trainerId], MON_DATA_SPDEF, NULL); rankingScores[0] += GetMonData(&gPlayerParty[trainerId], MON_DATA_SPEED, NULL); rankingScores[0] += GetMonData(&gPlayerParty[trainerId], MON_DATA_MAX_HP, NULL); - monTypesBits |= 1u << gSpeciesInfo[GetMonData(&gPlayerParty[trainerId], MON_DATA_SPECIES, NULL)].types[0]; - monTypesBits |= 1u << gSpeciesInfo[GetMonData(&gPlayerParty[trainerId], MON_DATA_SPECIES, NULL)].types[1]; + monTypesBits |= 1u << GetSpeciesType(GetMonData(&gPlayerParty[trainerId], MON_DATA_SPECIES, NULL), 0); + monTypesBits |= 1u << GetSpeciesType(GetMonData(&gPlayerParty[trainerId], MON_DATA_SPECIES, NULL), 1); } // Count the number of types in the players party, to factor into the ranking @@ -2062,8 +2063,8 @@ static void InitDomeTrainers(void) rankingScores[i] += statValues[STAT_SPDEF]; rankingScores[i] += statValues[STAT_SPEED]; rankingScores[i] += statValues[STAT_HP]; - monTypesBits |= 1u << gSpeciesInfo[gFacilityTrainerMons[DOME_MONS[i][j]].species].types[0]; - monTypesBits |= 1u << gSpeciesInfo[gFacilityTrainerMons[DOME_MONS[i][j]].species].types[1]; + monTypesBits |= 1u << GetSpeciesType(gFacilityTrainerMons[DOME_MONS[i][j]].species, 0); + monTypesBits |= 1u << GetSpeciesType(gFacilityTrainerMons[DOME_MONS[i][j]].species, 1); } for (monTypesCount = 0, j = 0; j < 32; j++) @@ -2135,9 +2136,8 @@ static void InitDomeTrainers(void) static void CalcDomeMonStats(const struct TrainerMon *fmon, int level, u8 ivs, int *stats) { int evs[NUM_STATS]; - int i; - for (i = 0; i < NUM_STATS; i++) + for (enum Stat i = 0; i < NUM_STATS; i++) { if (fmon->ev != NULL) evs[i] = fmon->ev[i]; @@ -2151,7 +2151,7 @@ static void CalcDomeMonStats(const struct TrainerMon *fmon, int level, u8 ivs, i } else { - int n = 2 * gSpeciesInfo[fmon->species].baseHP; + int n = 2 * GetSpeciesBaseHP(fmon->species); stats[STAT_HP] = (((n + ivs + evs[STAT_HP] / 4) * level) / 100) + level + 10; } @@ -2392,15 +2392,16 @@ static int SelectOpponentMonsFromParty(int *partyMovePoints, bool8 allowRandom) static int GetTypeEffectivenessPoints(int move, int targetSpecies, int mode) { - int defType1, defType2, defAbility, moveType; + enum Type defType1, defType2, moveType; int typePower = TYPE_x1; + enum Ability defAbility; if (move == MOVE_NONE || move == MOVE_UNAVAILABLE || IsBattleMoveStatus(move)) return 0; - defType1 = gSpeciesInfo[targetSpecies].types[0]; - defType2 = gSpeciesInfo[targetSpecies].types[1]; - defAbility = gSpeciesInfo[targetSpecies].abilities[0]; + defType1 = GetSpeciesType(targetSpecies, 0); + defType2 = GetSpeciesType(targetSpecies, 1); + defAbility = GetSpeciesAbility(targetSpecies, 0); moveType = GetMoveType(move); if (defAbility == ABILITY_LEVITATE && moveType == TYPE_GROUND) @@ -3938,6 +3939,7 @@ static bool32 IsDomeRiskyMoveEffect(enum BattleMoveEffects effect) switch(effect) { case EFFECT_EXPLOSION: + case EFFECT_MISTY_EXPLOSION: case EFFECT_SPITE: case EFFECT_DESTINY_BOND: case EFFECT_PERISH_SONG: @@ -3954,7 +3956,8 @@ static bool32 IsDomeLuckyMove(u32 move) switch(GetMoveEffect(move)) { case EFFECT_COUNTER: - case EFFECT_OHKO: // Technically redundant because of the above accuracy check + case EFFECT_OHKO: + case EFFECT_SHEER_COLD: case EFFECT_METRONOME: case EFFECT_MIRROR_MOVE: case EFFECT_SKETCH: @@ -3974,12 +3977,12 @@ static bool32 IsDomeLuckyMove(u32 move) static bool32 IsDomePopularMove(u32 move) { u8 i; - for (i = 0; i < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; i++) + for (i = 0; i < NUM_ALL_MACHINES; i++) { - if (ItemIdToBattleMoveId(ITEM_TM01 + i) == move) + if (GetTMHMMoveId(i + 1) == move) return TRUE; } - if (i == NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES) + if (i == NUM_ALL_MACHINES) return FALSE; // Filter in TMs/HMs if (GetMovePower(move) >= 90) @@ -5125,18 +5128,20 @@ static u16 GetWinningMove(int winnerTournamentId, int loserTournamentId, u8 roun moves[i * MAX_MON_MOVES + j] = gFacilityTrainerMons[DOME_MONS[winnerTournamentId][i]].moves[j]; movePower = GetMovePower(moves[i * MAX_MON_MOVES + j]); + enum BattleMoveEffects effect = GetMoveEffect(moves[i * MAX_MON_MOVES + j]); if (IsBattleMoveStatus(moves[i * MAX_MON_MOVES + j])) movePower = 40; else if (movePower == 1) movePower = 60; - else if (GetMoveEffect(moves[i * MAX_MON_MOVES + j]) == EFFECT_EXPLOSION) + else if (B_EXPLOSION_DEFENSE < GEN_5 + && (effect == EFFECT_EXPLOSION || EFFECT_MISTY_EXPLOSION)) movePower /= 2; for (k = 0; k < FRONTIER_PARTY_SIZE; k++) { u32 personality = 0; u32 targetSpecies = 0; - u32 targetAbility = 0; + enum Ability targetAbility = 0; uq4_12_t typeMultiplier = 0; do { @@ -5146,14 +5151,14 @@ static u16 GetWinningMove(int winnerTournamentId, int loserTournamentId, u8 roun targetSpecies = gFacilityTrainerMons[DOME_MONS[loserTournamentId][k]].species; if (personality & 1) - targetAbility = gSpeciesInfo[targetSpecies].abilities[1]; + targetAbility = GetSpeciesAbility(targetSpecies, 1); else - targetAbility = gSpeciesInfo[targetSpecies].abilities[0]; + targetAbility = GetSpeciesAbility(targetSpecies, 0); typeMultiplier = CalcPartyMonTypeEffectivenessMultiplier(moves[i * 4 + j], targetSpecies, targetAbility); if (typeMultiplier == UQ_4_12(0)) moveScores[i * MAX_MON_MOVES + j] += 0; - else if (typeMultiplier >= UQ_4_12(2)) + else if (typeMultiplier >= UQ_4_12(2.0)) moveScores[i * MAX_MON_MOVES + j] += movePower * 2; else if (typeMultiplier <= UQ_4_12(0.5)) moveScores[i * MAX_MON_MOVES + j] += movePower / 2; @@ -5260,7 +5265,7 @@ static void Task_ShowTourneyTree(u8 taskId) break; case 2: sTilemapBuffer = AllocZeroed(BG_SCREEN_SIZE); - LZDecompressWram(gDomeTourneyTree_Tilemap, sTilemapBuffer); + DecompressDataWithHeaderWram(gDomeTourneyTree_Tilemap, sTilemapBuffer); SetBgTilemapBuffer(1, sTilemapBuffer); CopyBgTilemapBufferToVram(1); DecompressAndLoadBgGfxUsingHeap(1, gDomeTourneyTree_Gfx, 0x2000, 0, 0); @@ -5676,7 +5681,7 @@ static void ResetSketchedMoves(void) count = 0; while (count < MAX_MON_MOVES) { - if (GetMonData(&gSaveBlock1Ptr->playerParty[playerMonId], MON_DATA_MOVE1 + count, NULL) == GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + moveSlot, NULL)) + if (GetMonData(GetSavedPlayerPartyMon(playerMonId), MON_DATA_MOVE1 + count, NULL) == GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + moveSlot, NULL)) break; count++; } @@ -5684,7 +5689,7 @@ static void ResetSketchedMoves(void) SetMonMoveSlot(&gPlayerParty[i], MOVE_SKETCH, moveSlot); } - gSaveBlock1Ptr->playerParty[playerMonId] = gPlayerParty[i]; + SavePlayerPartyMon(playerMonId, &gPlayerParty[i]); } } @@ -5695,7 +5700,7 @@ static void RestoreDomePlayerPartyHeldItems(void) for (i = 0; i < DOME_BATTLE_PARTY_SIZE; i++) { int playerMonId = gSaveBlock2Ptr->frontier.selectedPartyMons[gSelectedOrderFromParty[i] - 1] - 1; - u16 item = GetMonData(&gSaveBlock1Ptr->playerParty[playerMonId], MON_DATA_HELD_ITEM, NULL); + u16 item = GetMonData(GetSavedPlayerPartyMon(playerMonId), MON_DATA_HELD_ITEM, NULL); SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &item); } } @@ -5820,8 +5825,8 @@ static void InitRandomTourneyTreeResults(void) statSums[i] += statValues[STAT_SPDEF]; statSums[i] += statValues[STAT_SPEED]; statSums[i] += statValues[STAT_HP]; - monTypesBits |= 1u << gSpeciesInfo[gFacilityTrainerMons[DOME_MONS[i][j]].species].types[0]; - monTypesBits |= 1u << gSpeciesInfo[gFacilityTrainerMons[DOME_MONS[i][j]].species].types[1]; + monTypesBits |= 1u << GetSpeciesType(gFacilityTrainerMons[DOME_MONS[i][j]].species, 0); + monTypesBits |= 1u << GetSpeciesType(gFacilityTrainerMons[DOME_MONS[i][j]].species, 1); } // Because GF hates temporary vars, trainerId acts like monTypesCount here. @@ -5947,12 +5952,7 @@ static void DecideRoundWinners(u8 roundId) } } species = gFacilityTrainerMons[DOME_MONS[tournamentId1][monId1]].species; - points1 += ( gSpeciesInfo[species].baseHP - + gSpeciesInfo[species].baseAttack - + gSpeciesInfo[species].baseDefense - + gSpeciesInfo[species].baseSpeed - + gSpeciesInfo[species].baseSpAttack - + gSpeciesInfo[species].baseSpDefense) / 10; + points1 += GetTotalBaseStat(species) / 10; } // Random part of the formula. points1 += (Random() & 0x1F); @@ -5970,12 +5970,7 @@ static void DecideRoundWinners(u8 roundId) } } species = gFacilityTrainerMons[DOME_MONS[tournamentId2][monId1]].species; - points2 += ( gSpeciesInfo[species].baseHP - + gSpeciesInfo[species].baseAttack - + gSpeciesInfo[species].baseDefense - + gSpeciesInfo[species].baseSpeed - + gSpeciesInfo[species].baseSpAttack - + gSpeciesInfo[species].baseSpDefense) / 10; + points2 += GetTotalBaseStat(species) / 10; } // Random part of the formula. points2 += (Random() & 0x1F); diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index 93642f4c93c4..d5edbc0e61eb 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -19,7 +19,6 @@ #include "constants/battle_move_effects.h" #include "constants/battle_string_ids.h" #include "constants/flags.h" -#include "constants/hold_effects.h" #include "constants/items.h" #include "constants/moves.h" @@ -28,7 +27,7 @@ static u32 GetMaxPowerTier(u32 move); struct GMaxMove { u16 species; - u8 moveType; + enum Type moveType; u16 gmaxMove; }; @@ -66,15 +65,15 @@ static const struct GMaxMove sGMaxMoveTable[] = {SPECIES_ALCREMIE_GMAX, TYPE_FAIRY, MOVE_G_MAX_FINALE}, {SPECIES_COPPERAJAH_GMAX, TYPE_STEEL, MOVE_G_MAX_STEELSURGE}, {SPECIES_DURALUDON_GMAX, TYPE_DRAGON, MOVE_G_MAX_DEPLETION}, - {SPECIES_URSHIFU_SINGLE_STRIKE_GMAX,TYPE_DARK, MOVE_G_MAX_ONE_BLOW}, - {SPECIES_URSHIFU_RAPID_STRIKE_GMAX, TYPE_WATER, MOVE_G_MAX_RAPID_FLOW}, + {SPECIES_URSHIFU_SINGLE_STRIKE_GMAX, TYPE_DARK, MOVE_G_MAX_ONE_BLOW}, + {SPECIES_URSHIFU_RAPID_STRIKE_GMAX, TYPE_WATER, MOVE_G_MAX_RAPID_FLOW}, }; // Returns whether a battler can Dynamax. bool32 CanDynamax(u32 battler) { u16 species = GetBattlerVisualSpecies(battler); - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum HoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); // Prevents Zigzagoon from dynamaxing in vanilla. if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE && !IsOnPlayerSide(battler)) @@ -178,17 +177,17 @@ void ActivateDynamax(u32 battler) // Set appropriate use flags. SetActiveGimmick(battler, GIMMICK_DYNAMAX); SetGimmickAsActivated(battler, GIMMICK_DYNAMAX); - gBattleStruct->dynamax.dynamaxTurns[battler] = gBattleTurnCounter + DYNAMAX_TURNS_COUNT; + gBattleStruct->dynamax.dynamaxTurns[battler] = DYNAMAX_TURNS_COUNT; // Substitute is removed upon Dynamaxing. - gBattleMons[battler].status2 &= ~STATUS2_SUBSTITUTE; + gBattleMons[battler].volatiles.substitute = FALSE; ClearBehindSubstituteBit(battler); // Choiced Moves are reset upon Dynamaxing. gBattleStruct->choicedMove[battler] = MOVE_NONE; // Try Gigantamax form change. - if (!(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) // Ditto cannot Gigantamax. + if (!gBattleMons[battler].volatiles.transformed) // Ditto cannot Gigantamax. TryBattleFormChange(battler, FORM_CHANGE_BATTLE_GIGANTAMAX); BattleScriptExecute(BattleScript_DynamaxBegins); @@ -234,22 +233,7 @@ bool32 IsMoveBlockedByMaxGuard(u32 move) return FALSE; } -// Weight-based moves (and some other moves in Raids) are blocked by Dynamax. -bool32 IsMoveBlockedByDynamax(u32 move) -{ - // TODO: Certain moves are banned in raids. - switch (GetMoveEffect(move)) - { - case EFFECT_HEAT_CRASH: - case EFFECT_LOW_KICK: - return TRUE; - default: - break; - } - return FALSE; -} - -static u16 GetTypeBasedMaxMove(u32 battler, u32 type) +static u16 GetTypeBasedMaxMove(u32 battler, enum Type type) { // Gigantamax check u32 i; @@ -280,7 +264,7 @@ static u16 GetTypeBasedMaxMove(u32 battler, u32 type) // Returns the appropriate Max Move or G-Max Move for a battler to use. u16 GetMaxMove(u32 battler, u32 baseMove) { - u32 moveType; + enum Type moveType; SetTypeBeforeUsingMove(baseMove, battler); moveType = GetBattleMoveType(baseMove); @@ -333,7 +317,7 @@ u32 GetMaxMovePower(u32 move) } tier = GetMaxPowerTier(move); - u32 moveType = GetMoveType(move); + enum Type moveType = GetMoveType(move); if (moveType == TYPE_FIGHTING || moveType == TYPE_POISON || move == MOVE_MULTI_ATTACK) @@ -387,7 +371,7 @@ static u32 GetMaxPowerTier(u32 move) switch (GetMoveEffect(move)) { case EFFECT_BIDE: - case EFFECT_SUPER_FANG: + case EFFECT_FIXED_PERCENT_DAMAGE: case EFFECT_LEVEL_DAMAGE: case EFFECT_PSYWAVE: case EFFECT_COUNTER: @@ -400,13 +384,14 @@ static u32 GetMaxPowerTier(u32 move) case EFFECT_TERRAIN_PULSE: case EFFECT_PUNISHMENT: case EFFECT_TRUMP_CARD: - case EFFECT_FIXED_DAMAGE_ARG: + case EFFECT_FIXED_HP_DAMAGE: case EFFECT_SPIT_UP: case EFFECT_NATURAL_GIFT: case EFFECT_MIRROR_COAT: case EFFECT_FINAL_GAMBIT: return MAX_POWER_TIER_2; case EFFECT_OHKO: + case EFFECT_SHEER_COLD: case EFFECT_RETURN: case EFFECT_FRUSTRATION: case EFFECT_HEAT_CRASH: @@ -452,7 +437,7 @@ bool32 IsMaxMove(u32 move) } // Assigns the multistring to use for the "Damage Non- Types" G-Max effect. -void ChooseDamageNonTypesString(u8 type) +void ChooseDamageNonTypesString(enum Type type) { switch (type) { @@ -468,6 +453,8 @@ void ChooseDamageNonTypesString(u8 type) case TYPE_ROCK: gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SURROUNDED_BY_ROCKS; break; + default: + break; } } @@ -502,10 +489,9 @@ void BS_UndoDynamax(void) if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX) { - BattleScriptPushCursor(); UndoDynamax(battler); gBattleScripting.battler = battler; - gBattlescriptCurrInstr = BattleScript_DynamaxEnds_Ret; + BattleScriptCall(BattleScript_DynamaxEnds_Ret); return; } diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index 6cf45ded4dd8..ef5539ebbfee 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -1,5 +1,6 @@ #include "global.h" #include "battle.h" +#include "battle_hold_effects.h" #include "battle_util.h" #include "battle_controllers.h" #include "battle_ai_util.h" @@ -7,116 +8,10 @@ #include "battle_scripts.h" #include "constants/battle.h" #include "constants/battle_string_ids.h" -#include "constants/hold_effects.h" #include "constants/abilities.h" #include "constants/items.h" #include "constants/moves.h" -// General End Turn Effects based on research from smogon from vanilla games: -// https://www.smogon.com/forums/threads/sword-shield-battle-mechanics-research.3655528/page-64#post-9244179 -enum EndTurnResolutionOrder -{ - ENDTURN_ORDER, - ENDTURN_VARIOUS, - ENDTURN_WEATHER, - ENDTURN_WEATHER_DAMAGE, - ENDTURN_GEN_3_BERRY_ACTIVATION, - ENDTURN_EMERGENCY_EXIT_1, - ENDTURN_AFFECTION, - ENDTURN_FUTURE_SIGHT, - ENDTURN_WISH, - ENDTURN_FIRST_EVENT_BLOCK, - ENDTURN_EMERGENCY_EXIT_2, - ENDTURN_AQUA_RING, - ENDTURN_INGRAIN, - ENDTURN_LEECH_SEED, - ENDTURN_POISON, - ENDTURN_BURN, - ENDTURN_FROSTBITE, - ENDTURN_NIGHTMARE, - ENDTURN_CURSE, - ENDTURN_WRAP, - ENDTURN_SALT_CURE, - ENDTURN_OCTOLOCK, - ENDTURN_SYRUP_BOMB, - ENDTURN_TAUNT, - ENDTURN_TORMENT, - ENDTURN_ENCORE, - ENDTURN_DISABLE, - ENDTURN_MAGNET_RISE, - ENDTURN_TELEKINESIS, - ENDTURN_HEAL_BLOCK, - ENDTURN_EMBARGO, - ENDTURN_YAWN, - ENDTURN_PERISH_SONG, - ENDTURN_ROOST, - ENDTURN_EMERGENCY_EXIT_3, - ENDTURN_SECOND_EVENT_BLOCK, - ENDTURN_TRICK_ROOM, - ENDTURN_GRAVITY, - ENDTURN_WATER_SPORT, - ENDTURN_MUD_SPORT, - ENDTURN_WONDER_ROOM, - ENDTURN_MAGIC_ROOM, - ENDTURN_TERRAIN, - ENDTURN_THIRD_EVENT_BLOCK, - ENDTURN_EMERGENCY_EXIT_4, - ENDTURN_ABILITIES, - ENDTURN_FOURTH_EVENT_BLOCK, - ENDTURN_DYNAMAX, - ENDTURN_COUNT, -}; - -// Block that handles effects for each individual battler on the field (eg residual damage) -enum FirstEventBlock -{ - FIRST_EVENT_BLOCK_GMAX_MOVE_RESIDUAL, // Needs to be split - FIRST_EVENT_BLOCK_SEA_OF_FIRE_DAMAGE, - FIRST_EVENT_BLOCK_THRASH, // Thrash isn't handled here in vanilla but for now it is that best place for it. - FIRST_EVENT_BLOCK_GRASSY_TERRAIN_HEAL, - FIRST_EVENT_BLOCK_ABILITIES, - FIRST_EVENT_BLOCK_HEAL_ITEMS, -}; - -// Block that tries to remove side statuses -enum SecondEventBlock -{ - SECOND_EVENT_BLOCK_REFLECT, - SECOND_EVENT_BLOCK_LIGHT_SCREEN, - SECOND_EVENT_BLOCK_SAFEGUARD, - SECOND_EVENT_BLOCK_MIST, - SECOND_EVENT_BLOCK_TAILWIND, - SECOND_EVENT_BLOCK_LUCKY_CHANT, - SECOND_EVENT_BLOCK_RAINBOW, - SECOND_EVENT_BLOCK_SEA_OF_FIRE, - SECOND_EVENT_BLOCK_SWAMP, - SECOND_EVENT_BLOCK_AURORA_VEIL, -}; - -// Block that handles Uproar, items and non-form changing abilities -enum ThirdEventBlock -{ - THIRD_EVENT_BLOCK_UPROAR, - THIRD_EVENT_BLOCK_ABILITIES, - THIRD_EVENT_BLOCK_ITEMS, -}; - -// Form changing abilities and Eject Pack -enum FourthEventBlock -{ - FOURTH_EVENT_BLOCK_HUNGER_SWITCH, - FOURTH_EVENT_BLOCK_EJECT_PACK, -}; - -static inline bool32 IsBattlerProtectedByMagicGuard(u32 battler, u32 ability) -{ - if (ability != ABILITY_MAGIC_GUARD) - return FALSE; - - RecordAbilityBattle(battler, ability); - return TRUE; -} - static u32 GetBattlerSideForMessage(u32 side) { u32 battler = 0; @@ -135,21 +30,11 @@ static bool32 HandleEndTurnOrder(u32 battler) bool32 effect = FALSE; gBattleTurnCounter++; - gBattleStruct->endTurnEventsCounter++; + gBattleStruct->eventState.endTurn++; - u32 i, j; - for (i = 0; i < gBattlersCount; i++) - { + for (u32 i = 0; i < gBattlersCount; i++) gBattlerByTurnOrder[i] = i; - } - for (i = 0; i < gBattlersCount - 1; i++) - { - for (j = i + 1; j < gBattlersCount; j++) - { - if (GetWhichBattlerFaster(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], FALSE) == -1) - SwapTurnOrder(i, j); - } - } + SortBattlersBySpeed(gBattlerByTurnOrder, FALSE); return effect; } @@ -159,29 +44,43 @@ static bool32 HandleEndTurnVarious(u32 battler) u32 i; bool32 effect = FALSE; - gBattleStruct->endTurnEventsCounter++; + gBattleStruct->eventState.endTurn++; - if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK && gFieldTimers.fairyLockTimer == gBattleTurnCounter) + if (gFieldTimers.fairyLockTimer > 0 && --gFieldTimers.fairyLockTimer == 0) gFieldStatuses &= ~STATUS_FIELD_FAIRY_LOCK; for (i = 0; i < NUM_BATTLE_SIDES; i++) { - if (gSideStatuses[i] & SIDE_STATUS_DAMAGE_NON_TYPES && gSideTimers[i].damageNonTypesTimer == gBattleTurnCounter) + if (gSideTimers[i].damageNonTypesTimer > 0 && --gSideTimers[i].damageNonTypesTimer == 0) gSideStatuses[i] &= ~SIDE_STATUS_DAMAGE_NON_TYPES; } for (i = 0; i < gBattlersCount; i++) { - if (gStatuses3[i] & STATUS3_ALWAYS_HITS) - gStatuses3[i] -= STATUS3_ALWAYS_HITS_TURN(1); + if (gDisableStructs[i].throatChopTimer > 0) + gDisableStructs[i].throatChopTimer--; + + if (gBattleMons[i].volatiles.lockOn > 0) + gBattleMons[i].volatiles.lockOn--; - if (gDisableStructs[i].chargeTimer && --gDisableStructs[i].chargeTimer == 0) - gStatuses3[i] &= ~STATUS3_CHARGED_UP; + if (B_CHARGE < GEN_9 && gBattleMons[i].volatiles.chargeTimer > 0) + gBattleMons[i].volatiles.chargeTimer--; - if (gStatuses3[i] & STATUS3_LASER_FOCUS && gDisableStructs[i].laserFocusTimer == gBattleTurnCounter) - gStatuses3[i] &= ~STATUS3_LASER_FOCUS; + if (gDisableStructs[i].laserFocusTimer > 0 && --gDisableStructs[i].laserFocusTimer == 0) + gBattleMons[i].volatiles.laserFocus = FALSE; - gBattleStruct->hpBefore[i] = gBattleMons[i].hp; + gBattleStruct->battlerState[i].wasAboveHalfHp = gBattleMons[i].hp > gBattleMons[i].maxHP / 2; + } + + if (gBattleStruct->incrementEchoedVoice) + { + if (gBattleStruct->echoedVoiceCounter < 4) + gBattleStruct->echoedVoiceCounter++; + gBattleStruct->incrementEchoedVoice = FALSE; + } + else + { + gBattleStruct->echoedVoiceCounter = 0; } return effect; @@ -189,7 +88,7 @@ static bool32 HandleEndTurnVarious(u32 battler) static bool32 HandleEndTurnWeather(u32 battler) { - gBattleStruct->endTurnEventsCounter++; + gBattleStruct->eventState.endTurn++; return EndOrContinueWeather(); } @@ -197,18 +96,18 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler) { bool32 effect = FALSE; - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); u32 currBattleWeather = GetCurrentBattleWeather(); if (currBattleWeather == 0xFF) { // If there is no weather on the field, no need to check other battlers so go to next state - gBattleStruct->turnEffectsBattlerId = 0; - gBattleStruct->endTurnEventsCounter++; + gBattleStruct->eventState.endTurnBattler = 0; + gBattleStruct->eventState.endTurn++; return effect; } - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; if (!IsBattlerAlive(battler) || !HasWeatherEffect()) return effect; @@ -241,14 +140,13 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler) && ability != ABILITY_SAND_FORCE && ability != ABILITY_SAND_RUSH && ability != ABILITY_OVERCOAT - && !IS_BATTLER_ANY_TYPE(gBattlerAttacker, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL) - && !(gStatuses3[gBattlerAttacker] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES - && !IsBattlerProtectedByMagicGuard(battler, ability)) + && !IS_BATTLER_ANY_TYPE(battler, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL) + && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERGROUND + && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERWATER + && GetBattlerHoldEffect(battler) != HOLD_EFFECT_SAFETY_GOGGLES + && !IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD)) { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 16); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SANDSTORM; BattleScriptExecute(BattleScript_DamagingWeather); effect = TRUE; @@ -266,13 +164,12 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler) if (ability != ABILITY_SNOW_CLOAK && ability != ABILITY_OVERCOAT && !IS_BATTLER_OF_TYPE(battler, TYPE_ICE) - && !(gStatuses3[battler] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES - && !IsBattlerProtectedByMagicGuard(battler, ability)) + && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERGROUND + && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERWATER + && GetBattlerHoldEffect(battler) != HOLD_EFFECT_SAFETY_GOGGLES + && !IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD)) { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 16); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_HAIL; BattleScriptExecute(BattleScript_DamagingWeather); effect = TRUE; @@ -284,49 +181,24 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler) return effect; } -static bool32 HandleEndTurnGenThreeBerryActivation(u32 battler) -{ - bool32 effect = FALSE; - - if (B_HP_BERRIES >= GEN_4) // Skip handler for > Gen3 - { - gBattleStruct->endTurnEventsCounter++; - return effect; - } - gBattleStruct->turnEffectsBattlerId++; - effect = TryRestoreHPBerries(battler, ITEMEFFECT_NORMAL); - return effect; -} - static bool32 HandleEndTurnEmergencyExit(u32 battler) { bool32 effect = FALSE; - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; - if (ability == ABILITY_EMERGENCY_EXIT || ability == ABILITY_WIMP_OUT) + if (EmergencyExitCanBeTriggered(battler)) { - u32 cutoff = gBattleMons[battler].maxHP / 2; - bool32 HadMoreThanHalfHpNowDoesnt = gBattleStruct->hpBefore[battler] > cutoff && gBattleMons[battler].hp <= cutoff; - - if (HadMoreThanHalfHpNowDoesnt - && IsBattlerAlive(battler) - && (CanBattlerSwitch(battler) || !(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) - && !(gBattleTypeFlags & BATTLE_TYPE_ARENA) - && CountUsablePartyMons(battler) > 0 - && !(gStatuses3[battler] & STATUS3_SKY_DROPPED)) // Not currently held by Sky Drop - { - gBattlerAbility = battler; - gLastUsedAbility = ability; + gBattlerAbility = battler; + gLastUsedAbility = ability; - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER || IsOnPlayerSide(battler)) - BattleScriptExecute(BattleScript_EmergencyExitEnd2); - else - BattleScriptExecute(BattleScript_EmergencyExitWildEnd2); + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + BattleScriptExecute(BattleScript_EmergencyExitEnd2); + else + BattleScriptExecute(BattleScript_EmergencyExitWildEnd2); - effect = TRUE; - } + effect = TRUE; } return effect; @@ -336,7 +208,7 @@ static bool32 HandleEndTurnAffection(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; if (!B_AFFECTION_MECHANICS || !IsBattlerAlive(battler) @@ -359,16 +231,10 @@ static bool32 HandleEndTurnFutureSight(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; - if (gWishFutureKnock.futureSightCounter[battler] == gBattleTurnCounter) + if (gWishFutureKnock.futureSightCounter[battler] > 0 && --gWishFutureKnock.futureSightCounter[battler] == 0) { - if (gWishFutureKnock.futureSightCounter[battler] == gBattleTurnCounter - && gWishFutureKnock.futureSightCounter[BATTLE_PARTNER(battler)] <= gBattleTurnCounter) - { - gSideStatuses[GetBattlerSide(battler)] &= ~SIDE_STATUS_FUTUREATTACK; - } - if (!IsBattlerAlive(battler)) return effect; @@ -397,26 +263,27 @@ static bool32 HandleEndTurnWish(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; - if (gWishFutureKnock.wishCounter[battler] == gBattleTurnCounter && IsBattlerAlive(battler)) + if (gWishFutureKnock.wishCounter[battler] > 0 && --gWishFutureKnock.wishCounter[battler] == 0 && IsBattlerAlive(battler)) { + s32 wishHeal = 0; gBattlerTarget = battler; PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, battler, gWishFutureKnock.wishPartyId[battler]) - if (B_WISH_HP_SOURCE >= GEN_5) + if (GetConfig(CONFIG_WISH_HP_SOURCE) >= GEN_5) { if (IsOnPlayerSide(battler)) - gBattleStruct->moveDamage[battler] = max(1, GetMonData(&gPlayerParty[gWishFutureKnock.wishPartyId[battler]], MON_DATA_MAX_HP) / 2); + wishHeal = GetMonData(&gPlayerParty[gWishFutureKnock.wishPartyId[battler]], MON_DATA_MAX_HP) / 2; else - gBattleStruct->moveDamage[battler] = max(1, GetMonData(&gEnemyParty[gWishFutureKnock.wishPartyId[battler]], MON_DATA_MAX_HP) / 2); + wishHeal = GetMonData(&gEnemyParty[gWishFutureKnock.wishPartyId[battler]], MON_DATA_MAX_HP) / 2; } else { - gBattleStruct->moveDamage[battler] = max(1, GetNonDynamaxMaxHP(battler) / 2); + wishHeal = GetNonDynamaxMaxHP(battler) / 2; } - gBattleStruct->moveDamage[battler] *= -1; - if (gStatuses3[battler] & STATUS3_HEAL_BLOCK) + SetHealAmount(battler, wishHeal); + if (gBattleMons[battler].volatiles.healBlock) BattleScriptExecute(BattleScript_WishButHealBlocked); else if (gBattleMons[battler].hp == gBattleMons[battler].maxHP) BattleScriptExecute(BattleScript_WishButFullHp); @@ -432,76 +299,82 @@ static bool32 HandleEndTurnWish(u32 battler) static bool32 HandleEndTurnFirstEventBlock(u32 battler) { bool32 effect = FALSE; - u32 side; - switch (gBattleStruct->eventBlockCounter) + if (!IsBattlerAlive(battler)) + { + gBattleStruct->eventState.endTurnBlock = 0; + gBattleStruct->eventState.endTurnBattler++; + return effect; + } + + switch (gBattleStruct->eventState.endTurnBlock) { case FIRST_EVENT_BLOCK_GMAX_MOVE_RESIDUAL: // TODO: Has to be split into 3 statuses and needs a queue side = GetBattlerSide(battler); if (gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES) { - if (IsBattlerAlive(battler) - && !IS_BATTLER_OF_TYPE(battler, gSideTimers[side].damageNonTypesType) - && !IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + if (!IS_BATTLER_OF_TYPE(battler, gSideTimers[side].damageNonTypesType) + && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { - gBattlerAttacker = battler; - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 6; + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 6); ChooseDamageNonTypesString(gSideTimers[side].damageNonTypesType); BattleScriptExecute(BattleScript_DamageNonTypesContinues); effect = TRUE; } } - gBattleStruct->eventBlockCounter++; + gBattleStruct->eventState.endTurnBlock++; break; case FIRST_EVENT_BLOCK_SEA_OF_FIRE_DAMAGE: - if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SEA_OF_FIRE && IsBattlerAlive(battler)) + if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SEA_OF_FIRE) { gBattlerAttacker = battler; - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 8); BtlController_EmitStatusAnimation(battler, B_COMM_TO_CONTROLLER, FALSE, STATUS1_BURN); MarkBattlerForControllerExec(battler); BattleScriptExecute(BattleScript_HurtByTheSeaOfFire); effect = TRUE; } - gBattleStruct->eventBlockCounter++; + gBattleStruct->eventState.endTurnBlock++; break; case FIRST_EVENT_BLOCK_THRASH: - if (gBattleMons[battler].status2 & STATUS2_LOCK_CONFUSE && !(gStatuses3[battler] & STATUS3_SKY_DROPPED)) + if (gBattleMons[battler].volatiles.lockConfusionTurns && gBattleMons[battler].volatiles.semiInvulnerable != STATE_SKY_DROP) { - gBattleMons[battler].status2 -= STATUS2_LOCK_CONFUSE_TURN(1); + gBattleMons[battler].volatiles.lockConfusionTurns--; if (WasUnableToUseMove(battler)) { CancelMultiTurnMoves(battler, SKY_DROP_IGNORE); } - else if (!(gBattleMons[battler].status2 & STATUS2_LOCK_CONFUSE) && (gBattleMons[battler].status2 & STATUS2_MULTIPLETURNS)) + else if (!gBattleMons[battler].volatiles.lockConfusionTurns && gBattleMons[battler].volatiles.multipleTurns) { - gBattleMons[battler].status2 &= ~STATUS2_MULTIPLETURNS; - if (!(gBattleMons[battler].status2 & STATUS2_CONFUSION)) + gBattleMons[battler].volatiles.multipleTurns = FALSE; + if (!gBattleMons[battler].volatiles.confusionTurns) { - gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER; - SetMoveEffect(TRUE, FALSE); - if (gBattleMons[battler].status2 & STATUS2_CONFUSION) + SetMoveEffect(battler, battler, MOVE_EFFECT_CONFUSION, gBattlescriptCurrInstr, EFFECT_PRIMARY); + if (gBattleMons[battler].volatiles.confusionTurns) BattleScriptExecute(BattleScript_ThrashConfuses); effect = TRUE; } } } - gBattleStruct->eventBlockCounter++; + gBattleStruct->eventState.endTurnBlock++; break; case FIRST_EVENT_BLOCK_GRASSY_TERRAIN_HEAL: - if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && IsBattlerAlive(battler) && !IsBattlerAtMaxHp(battler) && IsBattlerGrounded(battler)) + if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN + && !IsBattlerAtMaxHp(battler) + && !gBattleMons[battler].volatiles.healBlock + && !IsSemiInvulnerable(battler, CHECK_ALL) + && IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler))) { - gBattlerAttacker = battler; - gBattleStruct->moveDamage[battler] = -(GetNonDynamaxMaxHP(battler) / 16); + SetHealAmount(battler, GetNonDynamaxMaxHP(battler) / 16); BattleScriptExecute(BattleScript_GrassyTerrainHeals); effect = TRUE; } - gBattleStruct->eventBlockCounter++; + gBattleStruct->eventState.endTurnBlock++; break; case FIRST_EVENT_BLOCK_ABILITIES: { - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); switch (ability) { case ABILITY_HEALER: @@ -510,27 +383,18 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE)) effect = TRUE; break; - } - gBattleStruct->eventBlockCounter++; - break; - } - case FIRST_EVENT_BLOCK_HEAL_ITEMS: - { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); - switch (holdEffect) - { - case HOLD_EFFECT_LEFTOVERS: - case HOLD_EFFECT_BLACK_SLUDGE: - if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler, FALSE)) - effect = TRUE; - break; default: break; } - gBattleStruct->eventBlockCounter = 0; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBlock++; break; } + case FIRST_EVENT_BLOCK_HEAL_ITEMS: + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsLeftoversActivation)) + effect = TRUE; + gBattleStruct->eventState.endTurnBlock = 0; + gBattleStruct->eventState.endTurnBattler++; + break; } return effect; @@ -540,14 +404,14 @@ static bool32 HandleEndTurnAquaRing(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; - if (gStatuses3[battler] & STATUS3_AQUA_RING - && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK) + if (gBattleMons[battler].volatiles.aquaRing + && !gBattleMons[battler].volatiles.healBlock && !IsBattlerAtMaxHp(battler) && IsBattlerAlive(battler)) { - gBattleStruct->moveDamage[battler] = GetDrainedBigRootHp(battler, GetNonDynamaxMaxHP(battler) / 16); + SetHealAmount(battler, GetDrainedBigRootHp(battler, GetNonDynamaxMaxHP(battler) / 16)); BattleScriptExecute(BattleScript_AquaRingHeal); effect = TRUE; } @@ -559,14 +423,14 @@ static bool32 HandleEndTurnIngrain(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; - if (gStatuses3[battler] & STATUS3_ROOTED - && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK) + if (gBattleMons[battler].volatiles.root + && !gBattleMons[battler].volatiles.healBlock && !IsBattlerAtMaxHp(battler) && IsBattlerAlive(battler)) { - gBattleStruct->moveDamage[battler] = GetDrainedBigRootHp(battler, GetNonDynamaxMaxHP(battler) / 16); + SetHealAmount(battler, GetDrainedBigRootHp(battler, GetNonDynamaxMaxHP(battler) / 16)); BattleScriptExecute(BattleScript_IngrainTurnHeal); effect = TRUE; } @@ -578,31 +442,33 @@ static bool32 HandleEndTurnLeechSeed(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; - if (gStatuses3[battler] & STATUS3_LEECHSEED - && IsBattlerAlive(gStatuses3[battler] & STATUS3_LEECHSEED_BATTLER) + if (gBattleMons[battler].volatiles.leechSeed + && IsBattlerAlive(gBattleMons[battler].volatiles.leechSeed - 1) && IsBattlerAlive(battler) - && !IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { - gBattlerTarget = gStatuses3[battler] & STATUS3_LEECHSEED_BATTLER; // Notice gBattlerTarget is actually the HP receiver. + gBattlerTarget = gBattleMons[battler].volatiles.leechSeed - 1; // leech seed receiver gBattleScripting.animArg1 = gBattlerTarget; gBattleScripting.animArg2 = gBattlerAttacker; - gBattleStruct->moveDamage[gBattlerAttacker] = max(1, GetNonDynamaxMaxHP(battler) / 8); - gBattleStruct->moveDamage[gBattlerTarget] = GetDrainedBigRootHp(gBattlerTarget, gBattleStruct->moveDamage[gBattlerAttacker]); - gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE; + s32 drainAmount = GetNonDynamaxMaxHP(gBattlerAttacker) / 8; + s32 healAmount = GetDrainedBigRootHp(gBattlerTarget, drainAmount); if (GetBattlerAbility(battler) == ABILITY_LIQUID_OOZE) { - gBattleStruct->moveDamage[gBattlerTarget] = gBattleStruct->moveDamage[gBattlerTarget] * -1; + SetPassiveDamageAmount(gBattlerAttacker, drainAmount); + SetPassiveDamageAmount(gBattlerTarget, healAmount); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_OOZE; BattleScriptExecute(BattleScript_LeechSeedTurnDrainLiquidOoze); } - else if (gStatuses3[gBattlerTarget] & STATUS3_HEAL_BLOCK) + else if (gBattleMons[gBattlerTarget].volatiles.healBlock) { BattleScriptExecute(BattleScript_LeechSeedTurnDrainHealBlock); } else { + SetPassiveDamageAmount(gBattlerAttacker, drainAmount); + SetHealAmount(gBattlerTarget, healAmount); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_DRAIN; BattleScriptExecute(BattleScript_LeechSeedTurnDrainRecovery); } @@ -616,42 +482,35 @@ static bool32 HandleEndTurnPoison(u32 battler) { bool32 effect = FALSE; - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; if ((gBattleMons[battler].status1 & STATUS1_POISON || gBattleMons[battler].status1 & STATUS1_TOXIC_POISON) && IsBattlerAlive(battler) - && !IsBattlerProtectedByMagicGuard(battler, ability)) + && !IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD)) { if (ability == ABILITY_POISON_HEAL) { - if (!IsBattlerAtMaxHp(battler) && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) + if (!IsBattlerAtMaxHp(battler) && !gBattleMons[battler].volatiles.healBlock) { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; + SetHealAmount(battler, GetNonDynamaxMaxHP(battler) / 8); BattleScriptExecute(BattleScript_PoisonHealActivates); effect = TRUE; } } else if (gBattleMons[battler].status1 & STATUS1_TOXIC_POISON) { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 16); if ((gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) != STATUS1_TOXIC_TURN(15)) // not 16 turns gBattleMons[battler].status1 += STATUS1_TOXIC_TURN(1); - gBattleStruct->moveDamage[battler] *= (gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) >> 8; + gBattleStruct->passiveHpUpdate[battler] *= (gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) >> 8; BattleScriptExecute(BattleScript_PoisonTurnDmg); effect = TRUE; } else { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 8); BattleScriptExecute(BattleScript_PoisonTurnDmg); effect = TRUE; } @@ -664,23 +523,22 @@ static bool32 HandleEndTurnBurn(u32 battler) { bool32 effect = FALSE; - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; if (gBattleMons[battler].status1 & STATUS1_BURN && IsBattlerAlive(battler) - && !IsBattlerProtectedByMagicGuard(battler, ability)) + && !IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD)) { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); + s32 burnDamage = GetNonDynamaxMaxHP(battler) / (GetConfig(CONFIG_BURN_DAMAGE) >= GEN_7 ? 16 : 8); if (ability == ABILITY_HEATPROOF) { - if (gBattleStruct->moveDamage[battler] > (gBattleStruct->moveDamage[battler] / 2) + 1) // Record ability if the burn takes less damage than it normally would. + if (burnDamage > (burnDamage / 2) + 1) // Record ability if the burn takes less damage than it normally would. RecordAbilityBattle(battler, ABILITY_HEATPROOF); - gBattleStruct->moveDamage[battler] /= 2; + burnDamage /= 2; } - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + SetPassiveDamageAmount(battler, burnDamage); BattleScriptExecute(BattleScript_BurnTurnDmg); effect = TRUE; } @@ -692,15 +550,13 @@ static bool32 HandleEndTurnFrostbite(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; if (gBattleMons[battler].status1 & STATUS1_FROSTBITE && IsBattlerAlive(battler) - && !IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / (GetConfig(CONFIG_BURN_DAMAGE) >= GEN_7 ? 16 : 8)); BattleScriptExecute(BattleScript_FrostbiteTurnDmg); effect = TRUE; } @@ -712,23 +568,21 @@ static bool32 HandleEndTurnNightmare(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; - if (gBattleMons[battler].status2 & STATUS2_NIGHTMARE + if (gBattleMons[battler].volatiles.nightmare && IsBattlerAlive(battler) - && !IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { if (gBattleMons[battler].status1 & STATUS1_SLEEP) { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 4; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 4); BattleScriptExecute(BattleScript_NightmareTurnDmg); effect = TRUE; } else { - gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; + gBattleMons[battler].volatiles.nightmare = FALSE; } } @@ -739,15 +593,13 @@ static bool32 HandleEndTurnCurse(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; - if (gBattleMons[battler].status2 & STATUS2_CURSED + if (gBattleMons[battler].volatiles.cursed && IsBattlerAlive(battler) - && !IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 4; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 4); BattleScriptExecute(BattleScript_CurseTurnDmg); effect = TRUE; } @@ -759,31 +611,31 @@ static bool32 HandleEndTurnWrap(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; - if (gBattleMons[battler].status2 & STATUS2_WRAPPED && IsBattlerAlive(battler)) + if (gBattleMons[battler].volatiles.wrapped && IsBattlerAlive(battler)) { - if (--gDisableStructs[battler].wrapTurns != 0) + if (gDisableStructs[battler].wrapTurns != 0) { - if (IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + gDisableStructs[battler].wrapTurns--; + if (IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) return effect; - gBattleScripting.animArg1 = gBattleStruct->wrappedMove[battler]; - gBattleScripting.animArg2 = gBattleStruct->wrappedMove[battler] >> 8; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[battler]); + gBattleScripting.animArg1 = gBattleMons[battler].volatiles.wrappedMove; + gBattleScripting.animArg2 = gBattleMons[battler].volatiles.wrappedMove >> 8; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[battler].volatiles.wrappedMove); BattleScriptExecute(BattleScript_WrapTurnDmg); - if (GetBattlerHoldEffect(gBattleStruct->wrappedBy[battler], TRUE) == HOLD_EFFECT_BINDING_BAND) - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 6 : 8); + s32 bindDamage = 0; + if (GetBattlerHoldEffect(gBattleMons[battler].volatiles.wrappedBy) == HOLD_EFFECT_BINDING_BAND) + bindDamage = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 6 : 8); else - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 8 : 16); - - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + bindDamage = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 8 : 16); + SetPassiveDamageAmount(battler, bindDamage); } else // broke free { - gBattleMons[battler].status2 &= ~STATUS2_WRAPPED; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[battler]); + gBattleMons[battler].volatiles.wrapped = FALSE; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[battler].volatiles.wrappedMove); BattleScriptExecute(BattleScript_WrapEnds); } effect = TRUE; @@ -796,18 +648,18 @@ static bool32 HandleEndTurnSaltCure(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; - if (gStatuses4[battler] & STATUS4_SALT_CURE + if (gBattleMons[battler].volatiles.saltCure && IsBattlerAlive(battler) - && !IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { + s32 saltCureDamage = 0; if (IS_BATTLER_ANY_TYPE(battler, TYPE_STEEL, TYPE_WATER)) - gBattleStruct->moveDamage[battler] = gBattleMons[battler].maxHP / 4; + saltCureDamage = GetNonDynamaxMaxHP(battler) / 4; else - gBattleStruct->moveDamage[battler] = gBattleMons[battler].maxHP / 8; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + saltCureDamage = GetNonDynamaxMaxHP(battler) / 8; + SetPassiveDamageAmount(battler, saltCureDamage); PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SALT_CURE); BattleScriptExecute(BattleScript_SaltCureExtraDamage); effect = TRUE; @@ -820,7 +672,7 @@ static bool32 HandleEndTurnOctolock(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; if (gDisableStructs[battler].octolock) { @@ -837,12 +689,12 @@ static bool32 HandleEndTurnSyrupBomb(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; - if ((gStatuses4[battler] & STATUS4_SYRUP_BOMB) && (IsBattlerAlive(battler))) + if (gBattleMons[battler].volatiles.syrupBomb && (IsBattlerAlive(battler))) { if (gDisableStructs[battler].syrupBombTimer > 0 && --gDisableStructs[battler].syrupBombTimer == 0) - gStatuses4[battler] &= ~STATUS4_SYRUP_BOMB; + gBattleMons[battler].volatiles.syrupBomb = FALSE; PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SYRUP_BOMB); gBattlescriptCurrInstr = BattleScript_SyrupBombEndTurn; BattleScriptExecute(gBattlescriptCurrInstr); @@ -856,10 +708,11 @@ static bool32 HandleEndTurnTaunt(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; if (gDisableStructs[battler].tauntTimer && --gDisableStructs[battler].tauntTimer == 0) { + gBattleScripting.battler = battler; BattleScriptExecute(BattleScript_BufferEndTurn); PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_TAUNT); effect = TRUE; @@ -872,11 +725,12 @@ static bool32 HandleEndTurnTorment(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; - if (gDisableStructs[battler].tormentTimer == gBattleTurnCounter) + if (gDisableStructs[battler].tormentTimer > 0 && --gDisableStructs[battler].tormentTimer == 0) { - gBattleMons[battler].status2 &= ~STATUS2_TORMENT; + gBattleMons[battler].volatiles.torment = FALSE; + gBattleScripting.battler = battler; BattleScriptExecute(BattleScript_TormentEnds); effect = TRUE; } @@ -888,7 +742,7 @@ static bool32 HandleEndTurnEncore(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; if (gDisableStructs[battler].encoreTimer != 0) { @@ -902,6 +756,7 @@ static bool32 HandleEndTurnEncore(u32 battler) { gDisableStructs[battler].encoredMove = 0; gDisableStructs[battler].encoreTimer = 0; + gBattleScripting.battler = battler; BattleScriptExecute(BattleScript_EncoredNoMore); effect = TRUE; } @@ -915,7 +770,7 @@ static bool32 HandleEndTurnDisable(u32 battler) bool32 effect = FALSE; u32 moveIndex = 0; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; if (gDisableStructs[battler].disableTimer != 0) { @@ -932,6 +787,7 @@ static bool32 HandleEndTurnDisable(u32 battler) else if (--gDisableStructs[battler].disableTimer == 0) // disable ends { gDisableStructs[battler].disabledMove = 0; + gBattleScripting.battler = battler; BattleScriptExecute(BattleScript_DisabledNoMore); effect = TRUE; } @@ -944,11 +800,11 @@ static bool32 HandleEndTurnMagnetRise(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; - if (gStatuses3[battler] & STATUS3_MAGNET_RISE && gDisableStructs[battler].magnetRiseTimer == gBattleTurnCounter) + if (gDisableStructs[battler].magnetRiseTimer > 0 && --gDisableStructs[battler].magnetRiseTimer == 0) { - gStatuses3[battler] &= ~STATUS3_MAGNET_RISE; + gBattleMons[battler].volatiles.magnetRise = FALSE; BattleScriptExecute(BattleScript_BufferEndTurn); PREPARE_STRING_BUFFER(gBattleTextBuff1, STRINGID_ELECTROMAGNETISM); effect = TRUE; @@ -961,11 +817,11 @@ static bool32 HandleEndTurnTelekinesis(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; - if (gStatuses3[battler] & STATUS3_TELEKINESIS && gDisableStructs[battler].telekinesisTimer == gBattleTurnCounter) + if (gDisableStructs[battler].telekinesisTimer > 0 && --gDisableStructs[battler].telekinesisTimer == 0) { - gStatuses3[battler] &= ~STATUS3_TELEKINESIS; + gBattleMons[battler].volatiles.telekinesis = FALSE; BattleScriptExecute(BattleScript_TelekinesisEndTurn); effect = TRUE; } @@ -977,11 +833,12 @@ static bool32 HandleEndTurnHealBlock(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; - if (gStatuses3[battler] & STATUS3_HEAL_BLOCK && gDisableStructs[battler].healBlockTimer == gBattleTurnCounter) + if (gDisableStructs[battler].healBlockTimer > 0 && --gDisableStructs[battler].healBlockTimer == 0) { - gStatuses3[battler] &= ~STATUS3_HEAL_BLOCK; + gBattleMons[battler].volatiles.healBlock = FALSE; + gBattleScripting.battler = battler; BattleScriptExecute(BattleScript_BufferEndTurn); PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_HEAL_BLOCK); effect = TRUE; @@ -994,11 +851,11 @@ static bool32 HandleEndTurnEmbargo(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; - if (gStatuses3[battler] & STATUS3_EMBARGO && gDisableStructs[battler].embargoTimer == gBattleTurnCounter) + if (gDisableStructs[battler].embargoTimer > 0 && --gDisableStructs[battler].embargoTimer == 0) { - gStatuses3[battler] &= ~STATUS3_EMBARGO; + gBattleMons[battler].volatiles.embargo = FALSE; BattleScriptExecute(BattleScript_EmbargoEndTurn); effect = TRUE; } @@ -1010,34 +867,43 @@ static bool32 HandleEndTurnYawn(u32 battler) { bool32 effect = FALSE; - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; - if (gStatuses3[battler] & STATUS3_YAWN) + if (gBattleMons[battler].volatiles.yawn > 0) { - gStatuses3[battler] -= STATUS3_YAWN_TURN(1); - if (!(gStatuses3[battler] & STATUS3_YAWN) && !(gBattleMons[battler].status1 & STATUS1_ANY) + gBattleMons[battler].volatiles.yawn--; + if (!gBattleMons[battler].volatiles.yawn + && !(gBattleMons[battler].status1 & STATUS1_ANY) && ability != ABILITY_VITAL_SPIRIT && ability != ABILITY_INSOMNIA && !UproarWakeUpCheck(battler) && !IsLeafGuardProtected(battler, ability)) { - CancelMultiTurnMoves(battler, SKY_DROP_STATUS_YAWN); gEffectBattler = gBattlerTarget = battler; - if (IsBattlerTerrainAffected(battler, STATUS_FIELD_ELECTRIC_TERRAIN)) + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); + if (IsBattlerTerrainAffected(battler, ability, holdEffect, STATUS_FIELD_ELECTRIC_TERRAIN)) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAINPREVENTS_ELECTRIC; BattleScriptExecute(BattleScript_TerrainPreventsEnd2); } - else if (IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN)) + else if (IsBattlerTerrainAffected(battler, ability, holdEffect, STATUS_FIELD_MISTY_TERRAIN)) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAINPREVENTS_MISTY; BattleScriptExecute(BattleScript_TerrainPreventsEnd2); } else if (IsSleepClauseActiveForSide(GetBattlerSide(battler))) { - BattleScriptExecute(BattleScript_SleepClausePreventsEnd); + BattleScriptExecute(BattleScript_SleepClausePreventsEnd2); + } + else if ((gBattleScripting.battler = IsAbilityOnSide(battler, ABILITY_SWEET_VEIL))) + { + gBattleScripting.battler--; + gLastUsedAbility = ABILITY_SWEET_VEIL; + gBattlerAbility = gBattleScripting.battler; + RecordAbilityBattle(gBattleScripting.battler, ABILITY_SWEET_VEIL); + BattleScriptExecute(BattleScript_ImmunityProtectedEnd2); } else { @@ -1046,10 +912,11 @@ static bool32 HandleEndTurnYawn(u32 battler) else gBattleMons[battler].status1 |= ((Random() % 4) + 3); + CancelMultiTurnMoves(battler, SKY_DROP_STATUS_YAWN); TryActivateSleepClause(battler, gBattlerPartyIndexes[battler]); BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); MarkBattlerForControllerExec(battler); - BattleScriptExecute(BattleScript_YawnMakesAsleep); + BattleScriptExecute(BattleScript_YawnMakesAsleepEnd2); } effect = TRUE; } @@ -1062,15 +929,15 @@ static bool32 HandleEndTurnPerishSong(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; - if (IsBattlerAlive(battler) && gStatuses3[battler] & STATUS3_PERISH_SONG) + if (IsBattlerAlive(battler) && gBattleMons[battler].volatiles.perishSong) { PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[battler].perishSongTimer); if (gDisableStructs[battler].perishSongTimer == 0) { - gStatuses3[battler] &= ~STATUS3_PERISH_SONG; - gBattleStruct->moveDamage[battler] = gBattleMons[battler].hp; + gBattleMons[battler].volatiles.perishSong = FALSE; + SetPassiveDamageAmount(battler, gBattleMons[battler].hp); BattleScriptExecute(BattleScript_PerishSongTakesLife); } else @@ -1088,7 +955,7 @@ static bool32 HandleEndTurnRoost(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; if (gDisableStructs[battler].roostActive) gDisableStructs[battler].roostActive = FALSE; @@ -1100,12 +967,12 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler) { bool32 effect = FALSE; - u32 side = gBattleStruct->turnSideTracker; + u32 side = gBattleStruct->eventState.battlerSide; - switch (gBattleStruct->eventBlockCounter) + switch (gBattleStruct->eventState.endTurnBlock) { case SECOND_EVENT_BLOCK_REFLECT: - if (gSideStatuses[side] & SIDE_STATUS_REFLECT && gSideTimers[side].reflectTimer == gBattleTurnCounter) + if (gSideTimers[side].reflectTimer > 0 && --gSideTimers[side].reflectTimer == 0) { gBattlerAttacker = GetBattlerSideForMessage(side); gSideStatuses[side] &= ~SIDE_STATUS_REFLECT; @@ -1114,10 +981,10 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler) PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_REFLECT); effect = TRUE; } - gBattleStruct->eventBlockCounter++; + gBattleStruct->eventState.endTurnBlock++; break; case SECOND_EVENT_BLOCK_LIGHT_SCREEN: - if (gSideStatuses[side] & SIDE_STATUS_LIGHTSCREEN && gSideTimers[side].lightscreenTimer == gBattleTurnCounter) + if (gSideTimers[side].lightscreenTimer > 0 && --gSideTimers[side].lightscreenTimer == 0) { gBattlerAttacker = GetBattlerSideForMessage(side); gSideStatuses[side] &= ~SIDE_STATUS_LIGHTSCREEN; @@ -1126,20 +993,20 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler) PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_LIGHT_SCREEN); effect = TRUE; } - gBattleStruct->eventBlockCounter++; + gBattleStruct->eventState.endTurnBlock++; break; case SECOND_EVENT_BLOCK_SAFEGUARD: - if (gSideStatuses[side] & SIDE_STATUS_SAFEGUARD && gSideTimers[side].safeguardTimer == gBattleTurnCounter) + if (gSideTimers[side].safeguardTimer > 0 && --gSideTimers[side].safeguardTimer == 0) { gBattlerAttacker = GetBattlerSideForMessage(side); gSideStatuses[side] &= ~SIDE_STATUS_SAFEGUARD; BattleScriptExecute(BattleScript_SafeguardEnds); effect = TRUE; } - gBattleStruct->eventBlockCounter++; + gBattleStruct->eventState.endTurnBlock++; break; case SECOND_EVENT_BLOCK_MIST: - if (gSideTimers[side].mistTimer != 0 && gSideTimers[side].mistTimer == gBattleTurnCounter) + if (gSideTimers[side].mistTimer > 0 && --gSideTimers[side].mistTimer == 0) { gBattlerAttacker = GetBattlerSideForMessage(side); gSideStatuses[side] &= ~SIDE_STATUS_MIST; @@ -1148,59 +1015,59 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler) PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_MIST); effect = TRUE; } - gBattleStruct->eventBlockCounter++; + gBattleStruct->eventState.endTurnBlock++; break; case SECOND_EVENT_BLOCK_TAILWIND: - if (gSideStatuses[side] & SIDE_STATUS_TAILWIND && gSideTimers[side].tailwindTimer == gBattleTurnCounter) + if (gSideTimers[side].tailwindTimer > 0 && --gSideTimers[side].tailwindTimer == 0) { gBattlerAttacker = GetBattlerSideForMessage(side); gSideStatuses[side] &= ~SIDE_STATUS_TAILWIND; BattleScriptExecute(BattleScript_TailwindEnds); effect = TRUE; } - gBattleStruct->eventBlockCounter++; + gBattleStruct->eventState.endTurnBlock++; break; case SECOND_EVENT_BLOCK_LUCKY_CHANT: - if (gSideStatuses[side] & SIDE_STATUS_LUCKY_CHANT && gSideTimers[side].luckyChantTimer == gBattleTurnCounter) + if (gSideTimers[side].luckyChantTimer > 0 && --gSideTimers[side].luckyChantTimer == 0) { gBattlerAttacker = GetBattlerSideForMessage(side); gSideStatuses[side] &= ~SIDE_STATUS_LUCKY_CHANT; BattleScriptExecute(BattleScript_LuckyChantEnds); effect = TRUE; } - gBattleStruct->eventBlockCounter++; + gBattleStruct->eventState.endTurnBlock++; break; case SECOND_EVENT_BLOCK_RAINBOW: gBattlerAttacker = GetBattlerSideForMessage(side); - if (gSideStatuses[side] & SIDE_STATUS_RAINBOW && gSideTimers[side].rainbowTimer == gBattleTurnCounter) + if (gSideTimers[side].rainbowTimer > 0 && --gSideTimers[side].rainbowTimer == 0) { gSideStatuses[side] &= ~SIDE_STATUS_RAINBOW; BattleScriptExecute(BattleScript_TheRainbowDisappeared); effect = TRUE; } - gBattleStruct->eventBlockCounter++; + gBattleStruct->eventState.endTurnBlock++; break; case SECOND_EVENT_BLOCK_SEA_OF_FIRE: - if (gSideStatuses[side] & SIDE_STATUS_SEA_OF_FIRE && gSideTimers[side].seaOfFireTimer == gBattleTurnCounter) + if (gSideTimers[side].seaOfFireTimer > 0 && --gSideTimers[side].seaOfFireTimer == 0) { gSideStatuses[side] &= ~SIDE_STATUS_SEA_OF_FIRE; BattleScriptExecute(BattleScript_TheSeaOfFireDisappeared); effect = TRUE; } - gBattleStruct->eventBlockCounter++; + gBattleStruct->eventState.endTurnBlock++; break; case SECOND_EVENT_BLOCK_SWAMP: gBattlerAttacker = GetBattlerSideForMessage(side); - if (gSideStatuses[side] & SIDE_STATUS_SWAMP && gSideTimers[side].swampTimer == gBattleTurnCounter) + if (gSideTimers[side].swampTimer > 0 && --gSideTimers[side].swampTimer == 0) { gSideStatuses[side] &= ~SIDE_STATUS_SWAMP; BattleScriptExecute(BattleScript_TheSwampDisappeared); effect = TRUE; } - gBattleStruct->eventBlockCounter++; + gBattleStruct->eventState.endTurnBlock++; break; case SECOND_EVENT_BLOCK_AURORA_VEIL: - if (gSideStatuses[side] & SIDE_STATUS_AURORA_VEIL && gSideTimers[side].auroraVeilTimer == gBattleTurnCounter) + if (gSideTimers[side].auroraVeilTimer > 0 && --gSideTimers[side].auroraVeilTimer == 0) { gBattlerAttacker = GetBattlerSideForMessage(side); gSideStatuses[side] &= ~SIDE_STATUS_AURORA_VEIL; @@ -1209,8 +1076,8 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler) PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_AURORA_VEIL); effect = TRUE; } - gBattleStruct->turnSideTracker++; - gBattleStruct->eventBlockCounter = 0; + gBattleStruct->eventState.battlerSide++; + gBattleStruct->eventState.endTurnBlock = 0; break; } @@ -1221,9 +1088,9 @@ static bool32 HandleEndTurnTrickRoom(u32 battler) { bool32 effect = FALSE; - gBattleStruct->endTurnEventsCounter++; + gBattleStruct->eventState.endTurn++; - if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == gBattleTurnCounter) + if (gFieldTimers.trickRoomTimer > 0 && --gFieldTimers.trickRoomTimer == 0) { gFieldStatuses &= ~STATUS_FIELD_TRICK_ROOM; BattleScriptExecute(BattleScript_TrickRoomEnds); @@ -1237,9 +1104,9 @@ static bool32 HandleEndTurnGravity(u32 battler) { bool32 effect = FALSE; - gBattleStruct->endTurnEventsCounter++; + gBattleStruct->eventState.endTurn++; - if (gFieldStatuses & STATUS_FIELD_GRAVITY && gFieldTimers.gravityTimer == gBattleTurnCounter) + if (gFieldTimers.gravityTimer > 0 && --gFieldTimers.gravityTimer == 0) { gFieldStatuses &= ~STATUS_FIELD_GRAVITY; BattleScriptExecute(BattleScript_GravityEnds); @@ -1253,9 +1120,9 @@ static bool32 HandleEndTurnWaterSport(u32 battler) { bool32 effect = FALSE; - gBattleStruct->endTurnEventsCounter++; + gBattleStruct->eventState.endTurn++; - if (gFieldStatuses & STATUS_FIELD_WATERSPORT && gFieldTimers.waterSportTimer == gBattleTurnCounter) + if (gFieldTimers.waterSportTimer > 0 && --gFieldTimers.waterSportTimer == 0) { gFieldStatuses &= ~STATUS_FIELD_WATERSPORT; BattleScriptExecute(BattleScript_WaterSportEnds); @@ -1269,9 +1136,9 @@ static bool32 HandleEndTurnMudSport(u32 battler) { bool32 effect = FALSE; - gBattleStruct->endTurnEventsCounter++; + gBattleStruct->eventState.endTurn++; - if (gFieldStatuses & STATUS_FIELD_MUDSPORT && gFieldTimers.mudSportTimer == gBattleTurnCounter) + if (gFieldTimers.mudSportTimer > 0 && --gFieldTimers.mudSportTimer == 0) { gFieldStatuses &= ~STATUS_FIELD_MUDSPORT; BattleScriptExecute(BattleScript_MudSportEnds); @@ -1285,9 +1152,9 @@ static bool32 HandleEndTurnWonderRoom(u32 battler) { bool32 effect = FALSE; - gBattleStruct->endTurnEventsCounter++; + gBattleStruct->eventState.endTurn++; - if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM && gFieldTimers.wonderRoomTimer == gBattleTurnCounter) + if (gFieldTimers.wonderRoomTimer > 0 && --gFieldTimers.wonderRoomTimer == 0) { gFieldStatuses &= ~STATUS_FIELD_WONDER_ROOM; BattleScriptExecute(BattleScript_WonderRoomEnds); @@ -1301,9 +1168,9 @@ static bool32 HandleEndTurnMagicRoom(u32 battler) { bool32 effect = FALSE; - gBattleStruct->endTurnEventsCounter++; + gBattleStruct->eventState.endTurn++; - if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM && gFieldTimers.magicRoomTimer == gBattleTurnCounter) + if (gFieldTimers.magicRoomTimer > 0 && --gFieldTimers.magicRoomTimer == 0) { gFieldStatuses &= ~STATUS_FIELD_MAGIC_ROOM; BattleScriptExecute(BattleScript_MagicRoomEnds); @@ -1315,7 +1182,7 @@ static bool32 HandleEndTurnMagicRoom(u32 battler) static bool32 EndTurnTerrain(u32 terrainFlag, u32 stringTableId) { - if (gFieldStatuses & terrainFlag && gFieldTimers.terrainTimer == gBattleTurnCounter) + if (gFieldTimers.terrainTimer > 0 && --gFieldTimers.terrainTimer == 0) { gFieldStatuses &= ~terrainFlag; TryToRevertMimicryAndFlags(); @@ -1331,7 +1198,7 @@ static bool32 HandleEndTurnTerrain(u32 battler) { bool32 effect = FALSE; - gBattleStruct->endTurnEventsCounter++; + gBattleStruct->eventState.endTurn++; if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) effect = EndTurnTerrain(STATUS_FIELD_ELECTRIC_TERRAIN, B_MSG_TERRAIN_END_ELECTRIC); @@ -1351,46 +1218,43 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler) if (!IsBattlerAlive(battler)) { - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; return effect; } - switch (gBattleStruct->eventBlockCounter) + switch (gBattleStruct->eventState.endTurnBlock) { case THIRD_EVENT_BLOCK_UPROAR: - if (gBattleMons[battler].status2 & STATUS2_UPROAR) + if (gBattleMons[battler].volatiles.uproarTurns) { - for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++) + for (gEffectBattler = 0; gEffectBattler < gBattlersCount; gEffectBattler++) { - if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) - && GetBattlerAbility(gBattlerAttacker) != ABILITY_SOUNDPROOF) + if ((gBattleMons[gEffectBattler].status1 & STATUS1_SLEEP) + && GetBattlerAbility(gEffectBattler) != ABILITY_SOUNDPROOF) { - gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP; - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; + gBattleMons[gEffectBattler].status1 &= ~STATUS1_SLEEP; + gBattleMons[gEffectBattler].volatiles.nightmare = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = 1; BattleScriptExecute(BattleScript_MonWokeUpInUproar); - BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBattlerAttacker].status1); - MarkBattlerForControllerExec(gBattlerAttacker); + BtlController_EmitSetMonData(gEffectBattler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBattlerAttacker].status1); + MarkBattlerForControllerExec(gEffectBattler); + effect = TRUE; break; } } - if (gBattlerAttacker != gBattlersCount) - { - break; - } - else + if (effect == FALSE) { gBattlerAttacker = battler; - gBattleMons[battler].status2 -= STATUS2_UPROAR_TURN(1); // uproar timer goes down + gBattleMons[battler].volatiles.uproarTurns--; // uproar timer goes down if (WasUnableToUseMove(battler)) { CancelMultiTurnMoves(battler, SKY_DROP_IGNORE); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_ENDS; } - else if (gBattleMons[battler].status2 & STATUS2_UPROAR) + else if (gBattleMons[battler].volatiles.uproarTurns) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_CONTINUES; - gBattleMons[battler].status2 |= STATUS2_MULTIPLETURNS; + gBattleMons[battler].volatiles.multipleTurns = TRUE; } else { @@ -1401,11 +1265,11 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler) effect = TRUE; } } - gBattleStruct->eventBlockCounter++; + gBattleStruct->eventState.endTurnBlock++; break; case THIRD_EVENT_BLOCK_ABILITIES: { - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); switch (ability) { case ABILITY_TRUANT: // Not fully accurate but it has to be handled somehow. TODO: Find a better way. @@ -1420,30 +1284,33 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler) if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE)) effect = TRUE; break; + default: + break; } - gBattleStruct->eventBlockCounter++; + gBattleStruct->eventState.endTurnBlock++; break; } case THIRD_EVENT_BLOCK_ITEMS: { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + // TODO: simplify + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); switch (holdEffect) { case HOLD_EFFECT_FLAME_ORB: case HOLD_EFFECT_STICKY_BARB: case HOLD_EFFECT_TOXIC_ORB: - if (ItemBattleEffects(ITEMEFFECT_ORBS, battler, FALSE)) + if (ItemBattleEffects(battler, 0, holdEffect, IsOrbsActivation)) effect = TRUE; break; case HOLD_EFFECT_WHITE_HERB: - if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler, FALSE)) + if (ItemBattleEffects(battler, 0, holdEffect, IsWhiteHerbEndTurnActivation)) effect = TRUE; break; default: break; } - gBattleStruct->eventBlockCounter = 0; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBlock = 0; + gBattleStruct->eventState.endTurnBattler++; break; } } @@ -1451,13 +1318,13 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler) return effect; } -static bool32 HandleEndTurnAbilities(u32 battler) +static bool32 HandleEndTurnFormChangeAbilities(u32 battler) { bool32 effect = FALSE; - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; switch (ability) { @@ -1465,54 +1332,29 @@ static bool32 HandleEndTurnAbilities(u32 battler) case ABILITY_SCHOOLING: case ABILITY_SHIELDS_DOWN: case ABILITY_ZEN_MODE: + case ABILITY_HUNGER_SWITCH: if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE)) effect = TRUE; + default: + break; } return effect; } -static bool32 HandleEndTurnFourthEventBlock(u32 battler) +static bool32 HandleEndTurnEjectPack(u32 battler) { - bool32 effect = FALSE; - - switch (gBattleStruct->eventBlockCounter) - { - case FOURTH_EVENT_BLOCK_HUNGER_SWITCH: - { - u32 ability = GetBattlerAbility(battler); - if (ability == ABILITY_HUNGER_SWITCH) - { - if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE)) - effect = TRUE; - } - gBattleStruct->eventBlockCounter++; - break; - } - case FOURTH_EVENT_BLOCK_EJECT_PACK: - { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); - if (holdEffect == HOLD_EFFECT_EJECT_PACK) - { - if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler, FALSE)) - effect = TRUE; - } - gBattleStruct->eventBlockCounter = 0; - gBattleStruct->turnEffectsBattlerId++; - break; - } - } - - return effect; + gBattleStruct->eventState.endTurn++; + return TrySwitchInEjectPack(END_TURN); } static bool32 HandleEndTurnDynamax(u32 battler) { bool32 effect = FALSE; - gBattleStruct->turnEffectsBattlerId++; + gBattleStruct->eventState.endTurnBattler++; - if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX && gBattleStruct->dynamax.dynamaxTurns[battler] == gBattleTurnCounter) + if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX && gBattleStruct->dynamax.dynamaxTurns[battler] > 0 && --gBattleStruct->dynamax.dynamaxTurns[battler] == 0) { gBattleScripting.battler = battler; UndoDynamax(battler); @@ -1523,13 +1365,25 @@ static bool32 HandleEndTurnDynamax(u32 battler) return effect; } +/* + * Various end turn effects that happen after all battlers moved. + * Each Case will apply the effects for each battler. Moving to the next case when all battlers are done. + * If an effect is going to be applied on a better, the bool effect will be set to TRUE and a script set. + * The script is set with `BattleScriptExecute` and should have the ending `end2` + Example: + BattleScriptExecute(BattleScript_X); + + (in battle_scripts_1.s) + BattleScript_X: + some commands + end2 + */ static bool32 (*const sEndTurnEffectHandlers[])(u32 battler) = { [ENDTURN_ORDER] = HandleEndTurnOrder, [ENDTURN_VARIOUS] = HandleEndTurnVarious, [ENDTURN_WEATHER] = HandleEndTurnWeather, [ENDTURN_WEATHER_DAMAGE] = HandleEndTurnWeatherDamage, - [ENDTURN_GEN_3_BERRY_ACTIVATION] = HandleEndTurnGenThreeBerryActivation, [ENDTURN_EMERGENCY_EXIT_1] = HandleEndTurnEmergencyExit, [ENDTURN_AFFECTION] = HandleEndTurnAffection, [ENDTURN_FUTURE_SIGHT] = HandleEndTurnFutureSight, @@ -1570,37 +1424,33 @@ static bool32 (*const sEndTurnEffectHandlers[])(u32 battler) = [ENDTURN_TERRAIN] = HandleEndTurnTerrain, [ENDTURN_THIRD_EVENT_BLOCK] = HandleEndTurnThirdEventBlock, [ENDTURN_EMERGENCY_EXIT_4] = HandleEndTurnEmergencyExit, - [ENDTURN_ABILITIES] = HandleEndTurnAbilities, - [ENDTURN_FOURTH_EVENT_BLOCK] = HandleEndTurnFourthEventBlock, + [ENDTURN_FORM_CHANGE_ABILITIES] = HandleEndTurnFormChangeAbilities, + [ENDTURN_EJECT_PACK] = HandleEndTurnEjectPack, [ENDTURN_DYNAMAX] = HandleEndTurnDynamax, }; u32 DoEndTurnEffects(void) { u32 battler = MAX_BATTLERS_COUNT; - gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE); for (;;) { // If either turnEffectsBattlerId or turnSideTracker are at max count, reest values and go to the next state - if (gBattleStruct->turnEffectsBattlerId == gBattlersCount || gBattleStruct->turnSideTracker == NUM_BATTLE_SIDES) + if (gBattleStruct->eventState.endTurnBattler == gBattlersCount || gBattleStruct->eventState.battlerSide == NUM_BATTLE_SIDES) { - gBattleStruct->turnEffectsBattlerId = 0; - gBattleStruct->turnSideTracker = 0; - gBattleStruct->eventBlockCounter = 0; - gBattleStruct->endTurnEventsCounter++; + gBattleStruct->eventState.endTurnBattler = 0; + gBattleStruct->eventState.battlerSide = 0; + gBattleStruct->eventState.endTurnBlock = 0; + gBattleStruct->eventState.endTurn++; } // Jump out if possible after endTurnEventsCounter was increased in the above code block - if (gBattleStruct->endTurnEventsCounter == ENDTURN_COUNT) - { - gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE); + if (gBattleStruct->eventState.endTurn == ENDTURN_COUNT) return FALSE; - } - battler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->turnEffectsBattlerId]; + battler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->eventState.endTurnBattler]; - if (sEndTurnEffectHandlers[gBattleStruct->endTurnEventsCounter](battler)) + if (sEndTurnEffectHandlers[gBattleStruct->eventState.endTurn](battler)) return TRUE; } } diff --git a/src/battle_factory.c b/src/battle_factory.c index 5a9ab561273a..50434bd09c00 100644 --- a/src/battle_factory.c +++ b/src/battle_factory.c @@ -560,9 +560,9 @@ static void GetOpponentMostCommonMonType(void) for (i = 0; i < FRONTIER_PARTY_SIZE; i++) { u32 species = gFacilityTrainerMons[gFrontierTempParty[i]].species; - typeCounts[gSpeciesInfo[species].types[0]]++; - if (gSpeciesInfo[species].types[0] != gSpeciesInfo[species].types[1]) - typeCounts[gSpeciesInfo[species].types[1]]++; + typeCounts[GetSpeciesType(species, 0)]++; + if (GetSpeciesType(species, 0) != GetSpeciesType(species, 1)) + typeCounts[GetSpeciesType(species, 1)]++; } // Determine which are the two most-common types. diff --git a/src/battle_factory_screen.c b/src/battle_factory_screen.c index d6233c88fb7d..c7fef8002945 100644 --- a/src/battle_factory_screen.c +++ b/src/battle_factory_screen.c @@ -125,7 +125,7 @@ struct FactorySelectScreen struct SwapScreenAction { u8 id; - void (*func)(u8 taskId); + TaskFunc func; }; struct FactorySwapScreen @@ -253,7 +253,7 @@ static EWRAM_DATA u8 *sSwapMenuTilemapBuffer = NULL; static EWRAM_DATA u8 *sSwapMonPicBgTilemapBuffer = NULL; static struct FactorySelectScreen *sFactorySelectScreen; -static void (*sSwap_CurrentOptionFunc)(u8 taskId); +static TaskFunc sSwap_CurrentOptionFunc; static struct FactorySwapScreen *sFactorySwapScreen; COMMON_DATA u8 (*gFactorySelect_CurrentOptionFunc)(void) = NULL; @@ -886,7 +886,7 @@ static const struct SpriteTemplate sSpriteTemplate_Swap_MonPicBgAnim = .callback = SpriteCallbackDummy }; -void static (*const sSwap_MenuOptionFuncs[])(u8 taskId) = +static const TaskFunc sSwap_MenuOptionFuncs[] = { Swap_OptionSummary, Swap_OptionSwap, diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 3d8d2f48be22..0ae16a69cb9f 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -23,6 +23,7 @@ #include "data.h" #include "palette.h" #include "contest.h" +#include "trainer_pokemon_sprites.h" #include "constants/songs.h" #include "constants/rgb.h" #include "constants/battle_palace.h" @@ -330,6 +331,7 @@ static u8 GetBattlePalaceMoveGroup(u8 battler, u16 move) case MOVE_TARGET_RANDOM: case MOVE_TARGET_BOTH: case MOVE_TARGET_FOES_AND_ALLY: + case MOVE_TARGET_ALL_BATTLERS: if (IsBattleMoveStatus(move)) return PALACE_MOVE_GROUP_SUPPORT; else @@ -337,6 +339,7 @@ static u8 GetBattlePalaceMoveGroup(u8 battler, u16 move) break; case MOVE_TARGET_DEPENDS: case MOVE_TARGET_OPPONENTS_FIELD: + case MOVE_TARGET_ALLY: return PALACE_MOVE_GROUP_SUPPORT; case MOVE_TARGET_USER: return PALACE_MOVE_GROUP_DEFENSE; @@ -458,13 +461,15 @@ static void SpriteCB_TrainerSlideVertical(struct Sprite *sprite) #undef sSpeedX -void InitAndLaunchChosenStatusAnimation(u32 battler, bool32 isStatus2, u32 status) +void InitAndLaunchChosenStatusAnimation(u32 battler, bool32 isVolatile, u32 status) { gBattleSpritesDataPtr->healthBoxesData[battler].statusAnimActive = 1; - if (!isStatus2) + if (!isVolatile) { - if (status == STATUS1_FREEZE || status == STATUS1_FROSTBITE) + if (status == STATUS1_FREEZE) LaunchStatusAnimation(battler, B_ANIM_STATUS_FRZ); + else if (status == STATUS1_FROSTBITE) + LaunchStatusAnimation(battler, B_ANIM_STATUS_FRB); else if (status == STATUS1_POISON || status & STATUS1_TOXIC_POISON) LaunchStatusAnimation(battler, B_ANIM_STATUS_PSN); else if (status == STATUS1_BURN) @@ -478,13 +483,13 @@ void InitAndLaunchChosenStatusAnimation(u32 battler, bool32 isStatus2, u32 statu } else { - if (status & STATUS2_INFATUATION) + if (status == VOLATILE_INFATUATION) LaunchStatusAnimation(battler, B_ANIM_STATUS_INFATUATION); - else if (status & STATUS2_CONFUSION) + else if (status == VOLATILE_CONFUSION) LaunchStatusAnimation(battler, B_ANIM_STATUS_CONFUSION); - else if (status & STATUS2_CURSED) + else if (status == VOLATILE_CURSED) LaunchStatusAnimation(battler, B_ANIM_STATUS_CURSED); - else if (status & STATUS2_NIGHTMARE) + else if (status == VOLATILE_NIGHTMARE) LaunchStatusAnimation(battler, B_ANIM_STATUS_NIGHTMARE); else // no animation gBattleSpritesDataPtr->healthBoxesData[battler].statusAnimActive = 0; @@ -541,6 +546,9 @@ static bool8 ShouldAnimBeDoneRegardlessOfSubstitute(u8 animId) { switch (animId) { + case B_ANIM_ILLUSION_OFF: + case B_ANIM_SWAP_TO_SUBSTITUTE: + case B_ANIM_SWAP_FROM_SUBSTITUTE: case B_ANIM_SUBSTITUTE_FADE: case B_ANIM_RAIN_CONTINUES: case B_ANIM_SUN_CONTINUES: @@ -549,6 +557,7 @@ static bool8 ShouldAnimBeDoneRegardlessOfSubstitute(u8 animId) case B_ANIM_SNOW_CONTINUES: case B_ANIM_FOG_CONTINUES: case B_ANIM_SNATCH_MOVE: + case B_ANIM_STATS_CHANGE: return TRUE; default: return FALSE; @@ -630,15 +639,8 @@ void BattleLoadMonSpriteGfx(struct Pokemon *mon, u32 battler) if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX && GetMonData(mon, MON_DATA_GIGANTAMAX_FACTOR)) gBattleSpritesDataPtr->battlerData[battler].transformSpecies = species = GetGMaxTargetSpecies(species); - if (B_TRANSFORM_SHINY >= GEN_4) - { - personalityValue = gTransformedPersonalities[battler]; - isShiny = gTransformedShininess[battler]; - } - else - { - personalityValue = GetMonData(mon, MON_DATA_PERSONALITY); - } + personalityValue = gTransformedPersonalities[battler]; + isShiny = gTransformedShininess[battler]; } position = GetBattlerPosition(battler); @@ -657,7 +659,7 @@ void BattleLoadMonSpriteGfx(struct Pokemon *mon, u32 battler) LoadPalette(paletteData, BG_PLTT_ID(8) + BG_PLTT_ID(battler), PLTT_SIZE_4BPP); // transform's pink color - if (gBattleSpritesDataPtr->battlerData[battler].transformSpecies != SPECIES_NONE) + if (gBattleMons[battler].volatiles.transformed) { BlendPalette(paletteOffset, 16, 6, RGB_WHITE); CpuCopy32(&gPlttBufferFaded[paletteOffset], &gPlttBufferUnfaded[paletteOffset], PLTT_SIZEOF(16)); @@ -697,10 +699,10 @@ void DecompressTrainerFrontPic(u16 frontPicId, u8 battler) void DecompressTrainerBackPic(u16 backPicId, u8 battler) { u8 position = GetBattlerPosition(battler); - DecompressPicFromTable(&gTrainerBacksprites[backPicId].backPic, - gMonSpritesGfxPtr->spritesGfx[position]); + CopyTrainerBackspriteFramesToDest(backPicId, gMonSpritesGfxPtr->spritesGfx[position]); + // Aiming for palette slots 8 and 9 for Player and PlayerPartner to prevent Trainer Slides causing mons to change colour LoadPalette(gTrainerBacksprites[backPicId].palette.data, - OBJ_PLTT_ID(battler), PLTT_SIZE_4BPP); + OBJ_PLTT_ID(8 + battler/2), PLTT_SIZE_4BPP); } void FreeTrainerFrontPicPalette(u16 frontPicId) @@ -811,7 +813,7 @@ bool8 BattleLoadAllHealthBoxesGfx(u8 state) void LoadBattleBarGfx(u8 unused) { - LZDecompressWram(gBattleInterfaceGfx_BattleBar, gMonSpritesGfxPtr->barFontGfx); + DecompressDataWithHeaderWram(gBattleInterfaceGfx_BattleBar, gMonSpritesGfxPtr->barFontGfx); } bool8 BattleInitAllSprites(u8 *state1, u8 *battler) @@ -866,15 +868,8 @@ bool8 BattleInitAllSprites(u8 *state1, u8 *battler) } break; case 5: - if (IsOnPlayerSide(*battler)) - { - if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) - UpdateHealthboxAttribute(gHealthboxSpriteIds[*battler], GetBattlerMon(*battler), HEALTHBOX_ALL); - } - else - { + if (!IsOnPlayerSide(*battler) || !(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) UpdateHealthboxAttribute(gHealthboxSpriteIds[*battler], GetBattlerMon(*battler), HEALTHBOX_ALL); - } SetHealthboxSpriteInvisible(gHealthboxSpriteIds[*battler]); (*battler)++; if (*battler == gBattlersCount) @@ -918,7 +913,7 @@ void CopyBattleSpriteInvisibility(u8 battler) gBattleSpritesDataPtr->battlerData[battler].invisible = gSprites[gBattlerSpriteIds[battler]].invisible; } -void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool32 megaEvo, bool8 trackEnemyPersonality) +void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, u8 changeType) { u32 personalityValue, position, paletteOffset, targetSpecies; bool32 isShiny; @@ -943,33 +938,32 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool32 megaEvo, bo else { position = GetBattlerPosition(battlerAtk); - if (gBattleSpritesDataPtr->battlerData[battlerAtk].transformSpecies == SPECIES_NONE) + if (changeType == SPECIES_GFX_CHANGE_TRANSFORM) { // Get base form if its currently Gigantamax if (IsGigantamaxed(battlerDef)) - targetSpecies = gBattleStruct->changedSpecies[GetBattlerSide(battlerDef)][gBattlerPartyIndexes[battlerDef]]; + targetSpecies = GetBattlerPartyState(battlerDef)->changedSpecies; else if (gBattleStruct->illusion[battlerDef].state == ILLUSION_ON) targetSpecies = GetIllusionMonSpecies(battlerDef); else targetSpecies = GetMonData(monDef, MON_DATA_SPECIES); - personalityValue = GetMonData(monAtk, MON_DATA_PERSONALITY); - isShiny = GetMonData(monAtk, MON_DATA_IS_SHINY); } else { - targetSpecies = gBattleSpritesDataPtr->battlerData[battlerAtk].transformSpecies; - if (B_TRANSFORM_SHINY >= GEN_4 && trackEnemyPersonality && !megaEvo) - { - personalityValue = GetMonData(monDef, MON_DATA_PERSONALITY); - isShiny = GetMonData(monDef, MON_DATA_IS_SHINY); - } - else - { - personalityValue = GetMonData(monAtk, MON_DATA_PERSONALITY); - isShiny = GetMonData(monAtk, MON_DATA_IS_SHINY); - } + targetSpecies = GetMonData(monAtk, MON_DATA_SPECIES); } + gBattleSpritesDataPtr->battlerData[battlerAtk].transformSpecies = targetSpecies; + if (changeType == SPECIES_GFX_CHANGE_TRANSFORM) + { + personalityValue = gDisableStructs[battlerAtk].transformedMonPersonality; + isShiny = gDisableStructs[battlerAtk].transformedMonShininess; + } + else + { + personalityValue = GetMonData(monAtk, MON_DATA_PERSONALITY); + isShiny = GetMonData(monAtk, MON_DATA_IS_SHINY); + } HandleLoadSpecialPokePic(!IsOnPlayerSide(battlerAtk), gMonSpritesGfxPtr->spritesGfx[position], targetSpecies, @@ -982,14 +976,10 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool32 megaEvo, bo paletteData = GetMonSpritePalFromSpeciesAndPersonality(targetSpecies, isShiny, personalityValue); LoadPalette(paletteData, paletteOffset, PLTT_SIZE_4BPP); - if (!megaEvo) + if (changeType == SPECIES_GFX_CHANGE_TRANSFORM) { BlendPalette(paletteOffset, 16, 6, RGB_WHITE); CpuCopy32(&gPlttBufferFaded[paletteOffset], &gPlttBufferUnfaded[paletteOffset], PLTT_SIZEOF(16)); - if (!IsContest()) - { - gBattleSpritesDataPtr->battlerData[battlerAtk].transformSpecies = targetSpecies; - } } // dynamax tint @@ -1004,7 +994,7 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool32 megaEvo, bo } // Terastallization's tint - if (GetActiveGimmick(battlerAtk) == GIMMICK_TERA) + if (changeType != SPECIES_GFX_CHANGE_ILLUSION_OFF && GetActiveGimmick(battlerAtk) == GIMMICK_TERA) { BlendPalette(paletteOffset, 16, 8, GetTeraTypeRGB(GetBattlerTeraType(battlerAtk))); CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, PLTT_SIZEOF(16)); @@ -1026,11 +1016,11 @@ void BattleLoadSubstituteOrMonSpriteGfx(u8 battler, bool8 loadMonSprite) position = GetBattlerPosition(battler); if (IsContest()) - LZDecompressVram(gBattleAnimSpriteGfx_SubstituteBack, gMonSpritesGfxPtr->spritesGfx[position]); + DecompressDataWithHeaderVram(gBattleAnimSpriteGfx_SubstituteBack, gMonSpritesGfxPtr->spritesGfx[position]); else if (!IsOnPlayerSide(battler)) - LZDecompressVram(gBattleAnimSpriteGfx_Substitute, gMonSpritesGfxPtr->spritesGfx[position]); + DecompressDataWithHeaderVram(gBattleAnimSpriteGfx_Substitute, gMonSpritesGfxPtr->spritesGfx[position]); else - LZDecompressVram(gBattleAnimSpriteGfx_SubstituteBack, gMonSpritesGfxPtr->spritesGfx[position]); + DecompressDataWithHeaderVram(gBattleAnimSpriteGfx_SubstituteBack, gMonSpritesGfxPtr->spritesGfx[position]); for (i = 1; i < 4; i++) { @@ -1168,7 +1158,7 @@ void CreateEnemyShadowSprite(u32 battler) { if (B_ENEMY_MON_SHADOW_STYLE >= GEN_4 && P_GBA_STYLE_SPECIES_GFX == FALSE) { - u16 species = SanitizeSpeciesId(gBattleMons[battler].species); + u16 species = GetBattlerVisualSpecies(battler); u8 size = gSpeciesInfo[species].enemyShadowSize; gBattleSpritesDataPtr->healthBoxesData[battler].shadowSpriteIdPrimary = CreateSprite(&gSpriteTemplate_EnemyShadow, @@ -1254,6 +1244,12 @@ void LoadAndCreateEnemyShadowSprites(void) void SpriteCB_EnemyShadow(struct Sprite *shadowSprite) { + if (gBattleSpritesDataPtr == NULL) + { + shadowSprite->callback = SpriteCB_SetInvisible; + return; + } + bool8 invisible = FALSE; u8 battler = shadowSprite->tBattlerId; struct Sprite *battlerSprite = &gSprites[gBattlerSpriteIds[battler]]; @@ -1272,8 +1268,8 @@ void SpriteCB_EnemyShadow(struct Sprite *shadowSprite) } else if (transformSpecies != SPECIES_NONE) { - xOffset = gSpeciesInfo[transformSpecies].enemyShadowXOffset; - yOffset = gSpeciesInfo[transformSpecies].enemyShadowYOffset; + xOffset = gSpeciesInfo[transformSpecies].enemyShadowXOffset + (shadowSprite->tSpriteSide == SPRITE_SIDE_LEFT ? -16 : 16); + yOffset = gSpeciesInfo[transformSpecies].enemyShadowYOffset + 16; size = gSpeciesInfo[transformSpecies].enemyShadowSize; invisible = (B_ENEMY_MON_SHADOW_STYLE >= GEN_4 && P_GBA_STYLE_SPECIES_GFX == FALSE) @@ -1282,7 +1278,7 @@ void SpriteCB_EnemyShadow(struct Sprite *shadowSprite) } else if (B_ENEMY_MON_SHADOW_STYLE >= GEN_4 && P_GBA_STYLE_SPECIES_GFX == FALSE) { - u16 species = SanitizeSpeciesId(gBattleMons[battler].species); + u16 species = GetBattlerVisualSpecies(battler); xOffset = gSpeciesInfo[species].enemyShadowXOffset + (shadowSprite->tSpriteSide == SPRITE_SIDE_LEFT ? -16 : 16); yOffset = gSpeciesInfo[species].enemyShadowYOffset + 16; size = gSpeciesInfo[species].enemyShadowSize; diff --git a/src/battle_gimmick.c b/src/battle_gimmick.c index 76ea80a4f682..7a94b185b6d2 100644 --- a/src/battle_gimmick.c +++ b/src/battle_gimmick.c @@ -91,20 +91,15 @@ bool32 ShouldTrainerBattlerUseGimmick(u32 battler, enum Gimmick gimmick) // Returns whether a trainer has used a gimmick during a battle. bool32 HasTrainerUsedGimmick(u32 battler, enum Gimmick gimmick) { - // Check whether partner battler has used gimmick or plans to during turn. - if (IsDoubleBattle() - && IsPartnerMonFromSameTrainer(battler) - && (gBattleStruct->gimmick.activated[BATTLE_PARTNER(battler)][gimmick] - || ((gBattleStruct->gimmick.toActivate & (1u << BATTLE_PARTNER(battler)) - && gBattleStruct->gimmick.usableGimmick[BATTLE_PARTNER(battler)] == gimmick)))) - { - return TRUE; - } - // Otherwise, return whether current battler has used gimmick. - else + if (IsDoubleBattle() && IsPartnerMonFromSameTrainer(battler)) { - return gBattleStruct->gimmick.activated[battler][gimmick]; + u32 partner = BATTLE_PARTNER(battler); + if (gBattleStruct->gimmick.activated[partner][gimmick] + || ((gBattleStruct->gimmick.toActivate & (1u << partner)) && gBattleStruct->gimmick.usableGimmick[partner] == gimmick)) + return TRUE; } + + return gBattleStruct->gimmick.activated[battler][gimmick]; } // Sets a gimmick as used by a trainer with checks for Multi Battles. @@ -152,7 +147,7 @@ void CreateGimmickTriggerSprite(u32 battler) if (gBattleStruct->gimmick.triggerSpriteId == 0xFF) { - if (IsDoubleBattle()) + if (GetBattlerCoordsIndex(battler) == BATTLE_COORDS_DOUBLES) gBattleStruct->gimmick.triggerSpriteId = CreateSprite(gimmick->triggerTemplate, gSprites[gHealthboxSpriteIds[battler]].x - DOUBLES_GIMMICK_TRIGGER_POS_X_SLIDE, gSprites[gHealthboxSpriteIds[battler]].y - DOUBLES_GIMMICK_TRIGGER_POS_Y_DIFF, 0); @@ -178,6 +173,13 @@ bool32 IsGimmickTriggerSpriteActive(void) return FALSE; } +bool32 IsGimmickTriggerSpriteMatchingBattler(u32 battler) +{ + if (battler == gSprites[gBattleStruct->gimmick.triggerSpriteId].tBattler) + return TRUE; + return FALSE; +} + void HideGimmickTriggerSprite(void) { if (gBattleStruct->gimmick.triggerSpriteId != 0xFF) @@ -202,7 +204,7 @@ static void SpriteCb_GimmickTrigger(struct Sprite *sprite) s32 yDiff; s32 xHealthbox = gSprites[gHealthboxSpriteIds[sprite->tBattler]].x; - if (IsDoubleBattle()) + if (GetBattlerCoordsIndex(sprite->tBattler) == BATTLE_COORDS_DOUBLES) { xSlide = DOUBLES_GIMMICK_TRIGGER_POS_X_SLIDE; xPriority = DOUBLES_GIMMICK_TRIGGER_POS_X_PRIORITY; diff --git a/src/battle_hold_effects.c b/src/battle_hold_effects.c new file mode 100644 index 000000000000..9f363ea12082 --- /dev/null +++ b/src/battle_hold_effects.c @@ -0,0 +1,1275 @@ +#include "global.h" +#include "battle.h" +#include "battle_anim.h" +#include "battle_ai_util.h" // maybe move some stuff over to battle.h +#include "battle_controllers.h" +#include "battle_util.h" +#include "battle_hold_effects.h" +#include "battle_scripts.h" +#include "item.h" +#include "string_util.h" +#include "data/hold_effects.h" +#include "constants/berry.h" + +bool32 IsOnSwitchInActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onSwitchIn; } +bool32 IsOnSwitchInFirstTurnActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onSwitchInFirstTurn; } +bool32 IsMirrorHerbActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].mirrorHerb; } +bool32 IsMirrorHerbFirstTurnActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].mirrorHerbFirstTurn; } +bool32 IsWhiteHerbActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].whiteHerb; } +bool32 IsWhiteHerbFirstTurnActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].whiteHerbFirstTurn; } +bool32 IsWhiteHerbEndTurnActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].whiteHerbEndTurn; } +bool32 IsOnStatusChangeActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onStatusChange; } +bool32 IsOnHpThresholdActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onHpThreshold; } +bool32 IsKeeMarangaBerryActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].keeMarangaBerry; } +bool32 IsOnTargetHitActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onTargetAfterHit; } +bool32 IsOnAttackerAfterHitActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onAttackerAfterHit; } +bool32 IsLifeOrbShellBellActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].lifeOrbShellBell; } +bool32 IsLeftoversActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].leftovers; } +bool32 IsOrbsActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].orbs; } +bool32 IsOnEffectActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onEffect; } +bool32 IsOnBerryActivation(enum HoldEffect holdEffect) { return GetItemPocket(gLastUsedItem) == POCKET_BERRIES; } +bool32 IsOnFlingActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onFling; } + +bool32 IsForceTriggerItemActivation(enum HoldEffect holdEffect) +{ + return gHoldEffectsInfo[holdEffect].onSwitchIn + || gHoldEffectsInfo[holdEffect].whiteHerb + || gHoldEffectsInfo[holdEffect].onStatusChange + || gHoldEffectsInfo[holdEffect].onHpThreshold; +} + +static enum ItemEffect TryDoublePrize(u32 battler) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsOnPlayerSide(battler) && !gBattleStruct->moneyMultiplierItem) + { + gBattleStruct->moneyMultiplier *= 2; + gBattleStruct->moneyMultiplierItem = TRUE; + } + + return effect; +} + +enum ItemEffect TryBoosterEnergy(u32 battler, enum Ability ability, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (gDisableStructs[battler].boosterEnergyActivated || gBattleMons[battler].volatiles.transformed) + return ITEM_NO_EFFECT; + + if (((ability == ABILITY_PROTOSYNTHESIS) && !((gBattleWeather & B_WEATHER_SUN) && HasWeatherEffect())) + || ((ability == ABILITY_QUARK_DRIVE) && !(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN))) + { + gDisableStructs[battler].paradoxBoostedStat = GetParadoxHighestStatId(battler); + PREPARE_STAT_BUFFER(gBattleTextBuff1, gDisableStructs[battler].paradoxBoostedStat); + gBattlerAbility = gBattleScripting.battler = battler; + gDisableStructs[battler].boosterEnergyActivated = TRUE; + RecordAbilityBattle(battler, ability); + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BoosterEnergyEnd2); + else + BattleScriptCall(BattleScript_BoosterEnergyRet); + effect = ITEM_EFFECT_OTHER; + } + + return effect; +} + +static enum ItemEffect TryRoomService(u32 battler, ActivationTiming timing) +{ + if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && CompareStat(battler, STAT_SPEED, MIN_STAT_STAGE, CMP_GREATER_THAN, GetBattlerAbility(battler))) + { + gEffectBattler = gBattleScripting.battler = battler; + SET_STATCHANGER(STAT_SPEED, 1, TRUE); + gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + STAT_SPEED; + gBattleScripting.animArg2 = 0; + + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); + else + BattleScriptCall(BattleScript_ConsumableStatRaiseRet); + + return ITEM_STATS_CHANGE; + } + + return ITEM_NO_EFFECT; +} + +enum ItemEffect TryHandleSeed(u32 battler, u32 terrainFlag, enum Stat statId, ActivationTiming timing) +{ + if (gFieldStatuses & terrainFlag && CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN, GetBattlerAbility(battler))) + { + gEffectBattler = gBattleScripting.battler = battler; + SET_STATCHANGER(statId, 1, FALSE); + gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + statId; + gBattleScripting.animArg2 = 0; + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); + else + BattleScriptCall(BattleScript_ConsumableStatRaiseRet); + return ITEM_STATS_CHANGE; + } + return ITEM_NO_EFFECT; +} + +static enum ItemEffect TryTerrainSeeds(u32 battler, u32 item, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + switch (GetItemHoldEffectParam(item)) + { + case HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN: + effect = TryHandleSeed(battler, STATUS_FIELD_ELECTRIC_TERRAIN, STAT_DEF, timing); + break; + case HOLD_EFFECT_PARAM_GRASSY_TERRAIN: + effect = TryHandleSeed(battler, STATUS_FIELD_GRASSY_TERRAIN, STAT_DEF, timing); + break; + case HOLD_EFFECT_PARAM_MISTY_TERRAIN: + effect = TryHandleSeed(battler, STATUS_FIELD_MISTY_TERRAIN, STAT_SPDEF, timing); + break; + case HOLD_EFFECT_PARAM_PSYCHIC_TERRAIN: + effect = TryHandleSeed(battler, STATUS_FIELD_PSYCHIC_TERRAIN, STAT_SPDEF, timing); + break; + } + + return effect; +} + +static bool32 CanBeInfinitelyConfused(u32 battler) +{ + enum Ability ability = GetBattlerAbility(battler); + if (ability == ABILITY_OWN_TEMPO + || IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler), STATUS_FIELD_MISTY_TERRAIN) + || gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD) + return FALSE; + return TRUE; +} + +static enum ItemEffect TryBerserkGene(u32 battler, ActivationTiming timing) +{ + if (CanBeInfinitelyConfused(battler)) + gBattleMons[battler].volatiles.infiniteConfusion = TRUE; + + SET_STATCHANGER(STAT_ATK, 2, FALSE); + gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + STAT_ATK; + gBattleScripting.animArg2 = 0; + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BerserkGeneRetEnd2); + else + BattleScriptCall(BattleScript_BerserkGeneRet); + + return ITEM_STATS_CHANGE; +} + +static enum ItemEffect RestoreWhiteHerbStats(u32 battler, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + for (u32 i = 0; i < NUM_BATTLE_STATS; i++) + { + if (gBattleMons[battler].statStages[i] < DEFAULT_STAT_STAGE) + { + gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE; + effect = ITEM_STATS_CHANGE; + } + } + if (effect != ITEM_NO_EFFECT) + { + if (timing == IsWhiteHerbActivation || timing == IsOnFlingActivation) + BattleScriptCall(BattleScript_WhiteHerbRet); + else + BattleScriptExecute(BattleScript_WhiteHerbEnd2); + } + + return effect; +} + +static enum ItemEffect TryConsumeMirrorHerb(u32 battler, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (gProtectStructs[battler].eatMirrorHerb) + { + gProtectStructs[battler].eatMirrorHerb = 0; + ChooseStatBoostAnimation(battler); + if (timing == IsMirrorHerbFirstTurnActivation) + BattleScriptExecute(BattleScript_MirrorHerbCopyStatChangeEnd2); + else + BattleScriptCall(BattleScript_MirrorHerbCopyStatChange); + effect = ITEM_STATS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryKingsRock(u32 battlerAtk, u32 battlerDef, u32 item) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (!IsBattlerAlive(battlerDef) + || !IsBattlerTurnDamaged(battlerDef) + || MoveIgnoresKingsRock(gCurrentMove) + || MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_FLINCH)) + return effect; + + enum Ability ability = GetBattlerAbility(battlerAtk); + u32 holdEffectParam = GetItemHoldEffectParam(item); + + if (B_SERENE_GRACE_BOOST >= GEN_5 && ability == ABILITY_SERENE_GRACE) + holdEffectParam *= 2; + if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_RAINBOW && gCurrentMove != MOVE_SECRET_POWER) + holdEffectParam *= 2; + if (ability != ABILITY_STENCH && RandomPercentage(RNG_HOLD_EFFECT_FLINCH, holdEffectParam)) + { + SetMoveEffect(battlerAtk, battlerDef, MOVE_EFFECT_FLINCH, gBattlescriptCurrInstr, NO_FLAGS); + effect = ITEM_EFFECT_OTHER; + } + + return effect; +} + +static enum ItemEffect TryAirBalloon(u32 battler, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (timing == IsOnTargetHitActivation) + { + if (IsBattlerTurnDamaged(battler)) + { + BattleScriptCall(BattleScript_AirBalloonMsgPop); + effect = ITEM_EFFECT_OTHER; + } + } + else if (!gSpecialStatuses[battler].switchInItemDone) + { + gSpecialStatuses[battler].switchInItemDone = TRUE; + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptPushCursorAndCallback(BattleScript_AirBalloonMsgIn); + else + BattleScriptCall(BattleScript_AirBalloonMsgInRet); + RecordItemEffectBattle(battler, HOLD_EFFECT_AIR_BALLOON); + effect = ITEM_EFFECT_OTHER; + } + + return effect; +} + +static enum ItemEffect TryRockyHelmet(u32 battlerDef, u32 battlerAtk, u32 item) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + enum Ability ability = GetBattlerAbility(battlerAtk); + + if (IsBattlerTurnDamaged(battlerDef) + && IsBattlerAlive(battlerAtk) + && !CanBattlerAvoidContactEffects(battlerAtk, battlerDef, ability, GetBattlerHoldEffect(battlerAtk), gCurrentMove) + && !IsAbilityAndRecord(battlerAtk, ability, ABILITY_MAGIC_GUARD)) + { + SetPassiveDamageAmount(battlerAtk, GetNonDynamaxMaxHP(battlerAtk) / 6); + PREPARE_ITEM_BUFFER(gBattleTextBuff1, item); + BattleScriptCall(BattleScript_RockyHelmetActivates); + effect = ITEM_HP_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryWeaknessPolicy(u32 battlerDef) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsBattlerAlive(battlerDef) + && IsBattlerTurnDamaged(battlerDef) + && gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_SUPER_EFFECTIVE) + { + BattleScriptCall(BattleScript_WeaknessPolicy); + effect = ITEM_STATS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TrySnowball(u32 battlerDef) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsBattlerAlive(battlerDef) + && IsBattlerTurnDamaged(battlerDef) + && GetBattleMoveType(gCurrentMove) == TYPE_ICE) + { + BattleScriptCall(BattleScript_TargetItemStatRaise); + SET_STATCHANGER(STAT_ATK, 1, FALSE); + effect = ITEM_STATS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryLuminousMoss(u32 battlerDef) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsBattlerAlive(battlerDef) + && IsBattlerTurnDamaged(battlerDef) + && GetBattleMoveType(gCurrentMove) == TYPE_WATER) + { + BattleScriptCall(BattleScript_TargetItemStatRaise); + SET_STATCHANGER(STAT_SPDEF, 1, FALSE); + effect = ITEM_STATS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryCellBattery(u32 battlerDef) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsBattlerAlive(battlerDef) + && IsBattlerTurnDamaged(battlerDef) + && GetBattleMoveType(gCurrentMove) == TYPE_ELECTRIC) + { + BattleScriptCall(BattleScript_TargetItemStatRaise); + SET_STATCHANGER(STAT_ATK, 1, FALSE); + effect = ITEM_STATS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryAbsorbBulb(u32 battlerDef) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsBattlerAlive(battlerDef) + && IsBattlerTurnDamaged(battlerDef) + && GetBattleMoveType(gCurrentMove) == TYPE_WATER) + { + effect = ITEM_STATS_CHANGE; + BattleScriptCall(BattleScript_TargetItemStatRaise); + SET_STATCHANGER(STAT_SPATK, 1, FALSE); + } + + return effect; +} + +static enum ItemEffect TryJabocaBerry(u32 battlerDef, u32 battlerAtk, u32 item) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsBattlerAlive(battlerAtk) + && IsBattlerTurnDamaged(battlerDef) + && !DoesSubstituteBlockMove(battlerAtk, battlerDef, gCurrentMove) + && IsBattleMovePhysical(gCurrentMove) + && !IsAbilityAndRecord(battlerAtk, GetBattlerAbility(battlerAtk), ABILITY_MAGIC_GUARD)) + { + s32 jabocaDamage = GetNonDynamaxMaxHP(battlerAtk) / 8; + if (GetBattlerAbility(battlerDef) == ABILITY_RIPEN) + jabocaDamage *= 2; + SetPassiveDamageAmount(battlerAtk, jabocaDamage); + BattleScriptCall(BattleScript_JabocaRowapBerryActivates); + PREPARE_ITEM_BUFFER(gBattleTextBuff1, item); + effect = ITEM_HP_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryRowapBerry(u32 battlerDef, u32 battlerAtk, u32 item) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsBattlerAlive(battlerAtk) + && IsBattlerTurnDamaged(battlerDef) + && !DoesSubstituteBlockMove(battlerAtk, battlerDef, gCurrentMove) + && IsBattleMoveSpecial(gCurrentMove) + && !IsAbilityAndRecord(battlerAtk, GetBattlerAbility(battlerAtk), ABILITY_MAGIC_GUARD)) + { + s32 rowapDamage = GetNonDynamaxMaxHP(battlerAtk) / 8; + if (GetBattlerAbility(battlerDef) == ABILITY_RIPEN) + rowapDamage *= 2; + SetPassiveDamageAmount(battlerAtk, rowapDamage); + BattleScriptCall(BattleScript_JabocaRowapBerryActivates); + PREPARE_ITEM_BUFFER(gBattleTextBuff1, item); + effect = ITEM_HP_CHANGE; + } + + return effect; +} + +static enum ItemEffect TrySetEnigmaBerry(u32 battlerDef, u32 battlerAtk) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsBattlerAlive(battlerDef) + && !DoesSubstituteBlockMove(battlerAtk, battlerDef, gCurrentMove) + && ((IsBattlerTurnDamaged(battlerDef) && gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_SUPER_EFFECTIVE) || gBattleScripting.overrideBerryRequirements) + && !(gBattleScripting.overrideBerryRequirements && gBattleMons[battlerDef].hp == gBattleMons[battlerDef].maxHP) + && !(B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battlerDef].volatiles.healBlock)) + { + s32 healAmount = gBattleMons[battlerDef].maxHP * 25 / 100; + if (GetBattlerAbility(battlerDef) == ABILITY_RIPEN) + healAmount *= 2; + SetHealAmount(battlerDef, healAmount); + BattleScriptCall(BattleScript_ItemHealHP_RemoveItemRet); + effect = ITEM_HP_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryBlunderPolicy(u32 battlerAtk) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (gBattleStruct->blunderPolicy + && IsBattlerAlive(battlerAtk) + && CompareStat(battlerAtk, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN, GetBattlerAbility(battlerAtk))) + { + gBattleStruct->blunderPolicy = FALSE; + SET_STATCHANGER(STAT_SPEED, 2, FALSE); + BattleScriptCall(BattleScript_AttackerItemStatRaise); + effect = ITEM_STATS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryMentalHerb(u32 battler) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + // Check infatuation + if (gBattleMons[battler].volatiles.infatuation) + { + gBattleMons[battler].volatiles.infatuation = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_INFATUATION; + StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); + effect = ITEM_EFFECT_OTHER; + } + if (B_MENTAL_HERB >= GEN_5) + { + // Check taunt + if (gDisableStructs[battler].tauntTimer != 0) + { + gDisableStructs[battler].tauntTimer = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TAUNT; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_TAUNT); + effect = ITEM_EFFECT_OTHER; + } + // Check encore + if (gDisableStructs[battler].encoreTimer != 0) + { + gDisableStructs[battler].encoredMove = 0; + gDisableStructs[battler].encoreTimer = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_ENCORE; + effect = ITEM_EFFECT_OTHER; + } + // Check torment + if (gBattleMons[battler].volatiles.torment == TRUE) + { + gBattleMons[battler].volatiles.torment = FALSE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TORMENT; + effect = ITEM_EFFECT_OTHER; + } + // Check heal block + if (gBattleMons[battler].volatiles.healBlock) + { + gBattleMons[battler].volatiles.healBlock = FALSE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_HEALBLOCK; + effect = ITEM_EFFECT_OTHER; + } + // Check disable + if (gDisableStructs[battler].disableTimer != 0) + { + gDisableStructs[battler].disableTimer = 0; + gDisableStructs[battler].disabledMove = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_DISABLE; + effect = ITEM_EFFECT_OTHER; + } + } + + if (effect) + BattleScriptCall(BattleScript_MentalHerbCureRet); + + return effect; +} + +static enum ItemEffect TryThroatSpray(u32 battlerAtk) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsSoundMove(gCurrentMove) + && gMultiHitCounter == 0 + && IsBattlerAlive(battlerAtk) + && IsAnyTargetTurnDamaged(battlerAtk) + && CompareStat(battlerAtk, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN, GetBattlerAbility(battlerAtk)) + && !NoAliveMonsForEitherParty()) // Don't activate if battle will end + { + SET_STATCHANGER(STAT_SPATK, 1, FALSE); + BattleScriptCall(BattleScript_AttackerItemStatRaise); + effect = ITEM_STATS_CHANGE; + } + + return effect; +} + +static enum ItemEffect DamagedStatBoostBerryEffect(u32 battlerDef, u32 battlerAtk, enum Stat statId, enum DamageCategory category) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (!IsBattlerAlive(battlerDef) || !CompareStat(battlerDef, statId, MAX_STAT_STAGE, CMP_LESS_THAN, GetBattlerAbility(battlerDef))) + return effect; + + if (gBattleScripting.overrideBerryRequirements + || (!DoesSubstituteBlockMove(battlerAtk, battlerDef, gCurrentMove) + && GetBattleMoveCategory(gCurrentMove) == category + && IsBattlerTurnDamaged(battlerDef))) + { + if (GetBattlerAbility(battlerDef) == ABILITY_RIPEN) + SET_STATCHANGER(statId, 2, FALSE); + else + SET_STATCHANGER(statId, 1, FALSE); + + gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + statId; + gBattleScripting.animArg2 = 0; + BattleScriptCall(BattleScript_ConsumableStatRaiseRet); + effect = ITEM_STATS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryShellBell(u32 battlerAtk) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (gBattleScripting.savedDmg > 0 + && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + && (IsAnyTargetTurnDamaged(battlerAtk) || gBattleScripting.savedDmg > 0) + && !IsBattlerAtMaxHp(battlerAtk) + && IsBattlerAlive(battlerAtk) + && GetMoveEffect(gCurrentMove) != EFFECT_PAIN_SPLIT + && !IsFutureSightAttackerInParty(battlerAtk, gBattlerTarget, gCurrentMove) + && !(B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battlerAtk].volatiles.healBlock)) + { + SetHealAmount(battlerAtk, gBattleScripting.savedDmg / GetBattlerHoldEffectParam(battlerAtk)); + BattleScriptCall(BattleScript_ItemHealHP_Ret); + effect = ITEM_HP_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryLifeOrb(u32 battlerAtk) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsBattlerAlive(battlerAtk) + && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + && (IsAnyTargetTurnDamaged(battlerAtk) || gBattleScripting.savedDmg > 0) + && !IsAbilityAndRecord(battlerAtk, GetBattlerAbility(battlerAtk), ABILITY_MAGIC_GUARD) + && GetMoveEffect(gCurrentMove) != EFFECT_PAIN_SPLIT + && !IsFutureSightAttackerInParty(battlerAtk, gBattlerTarget, gCurrentMove)) + { + SetPassiveDamageAmount(battlerAtk, GetNonDynamaxMaxHP(battlerAtk) / 10); + BattleScriptCall(BattleScript_ItemHurtRet); + effect = ITEM_HP_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryStickyBarbOnTargetHit(u32 battlerDef, u32 battlerAtk, u32 item) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsBattlerTurnDamaged(battlerDef) + && !CanBattlerAvoidContactEffects(battlerAtk, battlerDef, GetBattlerAbility(battlerAtk), GetBattlerHoldEffect(battlerAtk), gCurrentMove) + && !DoesSubstituteBlockMove(battlerAtk, battlerDef, gCurrentMove) + && IsBattlerAlive(battlerAtk) + && CanStealItem(battlerAtk, battlerDef, item) + && gBattleMons[battlerAtk].item == ITEM_NONE) + { + // No sticky hold checks. + gEffectBattler = battlerDef; + StealTargetItem(battlerAtk, battlerDef); // Attacker takes target's barb + BattleScriptCall(BattleScript_StickyBarbTransfer); + effect = ITEM_EFFECT_OTHER; + } + + return effect; +} + +static enum ItemEffect TryStickyBarbOnEndTurn(u32 battler, u32 item) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (!IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) + { + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 8); + PREPARE_ITEM_BUFFER(gBattleTextBuff1, item); + BattleScriptExecute(BattleScript_ItemHurtEnd2); + effect = ITEM_HP_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryToxicOrb(u32 battler) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + enum Ability ability = GetBattlerAbility(battler); + + if (CanBePoisoned(battler, battler, ability, ability)) // Can corrosion trigger toxic orb on itself? + { + gBattleMons[battler].status1 = STATUS1_TOXIC_POISON; + BattleScriptExecute(BattleScript_ToxicOrb); + effect = ITEM_STATUS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryFlameOrb(u32 battler) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + enum Ability ability = GetBattlerAbility(battler); + + if (CanBeBurned(battler, battler, ability)) + { + gBattleMons[battler].status1 = STATUS1_BURN; + BattleScriptExecute(BattleScript_FlameOrb); + effect = ITEM_STATUS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryLeftovers(u32 battler, enum HoldEffect holdEffect) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (gBattleMons[battler].hp < gBattleMons[battler].maxHP + && !(B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battler].volatiles.healBlock)) + { + SetHealAmount(battler, GetNonDynamaxMaxHP(battler) / 16); + RecordItemEffectBattle(battler, holdEffect); + BattleScriptExecute(BattleScript_ItemHealHP_End2); + effect = ITEM_HP_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryBlackSludgeDamage(u32 battler, enum HoldEffect holdEffect) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (!IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) + { + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 8); + RecordItemEffectBattle(battler, holdEffect); + BattleScriptExecute(BattleScript_ItemHurtEnd2); + effect = ITEM_HP_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryCureParalysis(u32 battler, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) + { + gBattleMons[battler].status1 &= ~STATUS1_PARALYSIS; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PARALYSIS; + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BerryCureStatusEnd2); + else + BattleScriptCall(BattleScript_BerryCureStatusRet); + effect = ITEM_STATUS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryCurePoison(u32 battler, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (gBattleMons[battler].status1 & STATUS1_PSN_ANY) + { + gBattleMons[battler].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_POISON; + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BerryCureStatusEnd2); + else + BattleScriptCall(BattleScript_BerryCureStatusRet); + effect = ITEM_STATUS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryCureBurn(u32 battler, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (gBattleMons[battler].status1 & STATUS1_BURN) + { + gBattleMons[battler].status1 &= ~STATUS1_BURN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_BURN; + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BerryCureStatusEnd2); + else + BattleScriptCall(BattleScript_BerryCureStatusRet); + effect = ITEM_STATUS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryCureFreezeOrFrostbite(u32 battler, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (gBattleMons[battler].status1 & STATUS1_FREEZE) + { + gBattleMons[battler].status1 &= ~STATUS1_FREEZE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_FREEEZE; + effect = ITEM_STATUS_CHANGE; + } + else if (gBattleMons[battler].status1 & STATUS1_FROSTBITE) + { + gBattleMons[battler].status1 &= ~STATUS1_FROSTBITE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_FROSTBITE; + effect = ITEM_STATUS_CHANGE; + } + + if (effect == ITEM_STATUS_CHANGE) + { + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BerryCureStatusEnd2); + else + BattleScriptCall(BattleScript_BerryCureStatusRet); + } + + return effect; +} + +static enum ItemEffect TryCureSleep(u32 battler, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (gBattleMons[battler].status1 & STATUS1_SLEEP) + { + gBattleMons[battler].status1 &= ~STATUS1_SLEEP; + gBattleMons[battler].volatiles.nightmare = FALSE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_SLEEP; + TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BerryCureStatusEnd2); + else + BattleScriptCall(BattleScript_BerryCureStatusRet); + effect = ITEM_STATUS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryCureConfusion(u32 battler, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (gBattleMons[battler].volatiles.confusionTurns > 0) + { + RemoveConfusionStatus(battler); + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BerryCureConfusionEnd2); + else + BattleScriptCall(BattleScript_BerryCureConfusionRet); + effect = ITEM_EFFECT_OTHER; + } + + return effect; +} + +static enum ItemEffect TryCureAnyStatus(u32 battler, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + u32 string = 0; + + if ((gBattleMons[battler].status1 & STATUS1_ANY || gBattleMons[battler].volatiles.confusionTurns > 0)) + { + if (gBattleMons[battler].status1 & STATUS1_PSN_ANY) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); + string++; + } + if (gBattleMons[battler].status1 & STATUS1_SLEEP) + { + gBattleMons[battler].volatiles.nightmare = FALSE; + StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); + TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); + string++; + } + if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); + string++; + } + if (gBattleMons[battler].status1 & STATUS1_BURN) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); + string++; + } + if (gBattleMons[battler].status1 & STATUS1_FREEZE || gBattleMons[battler].status1 & STATUS1_FROSTBITE) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); + string++; + } + if (gBattleMons[battler].volatiles.confusionTurns > 0) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); + string++; + } + if (string <= 1) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; + else + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_NORMALIZED_STATUS; + gBattleMons[battler].status1 = 0; + RemoveConfusionStatus(battler); + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BerryCureStatusEnd2); + else + BattleScriptCall(BattleScript_BerryCureStatusRet); + effect = ITEM_STATUS_CHANGE; + } + + return effect; +} + +enum HealAmount +{ + FIXED_HEAL_AMOUNT, + PERCENT_HEAL_AMOUNT, +}; + +static u32 ItemHealHp(u32 battler, u32 itemId, enum HealAmount percentHeal, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + enum Ability ability = GetBattlerAbility(battler); + + if (!(gBattleScripting.overrideBerryRequirements && gBattleMons[battler].hp == gBattleMons[battler].maxHP) + && !(B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battler].volatiles.healBlock) + && HasEnoughHpToEatBerry(battler, ability, 2, itemId)) + { + s32 healAmount = 0; + if (percentHeal == PERCENT_HEAL_AMOUNT) + healAmount = (GetNonDynamaxMaxHP(battler) * GetItemHoldEffectParam(itemId) / 100); + else + healAmount = GetItemHoldEffectParam(itemId); + + if (ability == ABILITY_RIPEN && GetItemPocket(itemId) == POCKET_BERRIES) + healAmount *= 2; + + SetHealAmount(battler, healAmount); + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_ItemHealHP_RemoveItemEnd2); + else + BattleScriptCall(BattleScript_ItemHealHP_RemoveItemRet); + + effect = ITEM_HP_CHANGE; + } + + return effect; +} + +static u32 ItemRestorePp(u32 battler, u32 itemId, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + struct Pokemon *mon = GetBattlerMon(battler); + u32 i, changedPP = 0; + enum Ability ability = GetBattlerAbility(battler); + + for (i = 0; i < MAX_MON_MOVES; i++) + { + u32 move = GetMonData(mon, MON_DATA_MOVE1 + i); + u32 currentPP = GetMonData(mon, MON_DATA_PP1 + i); + u32 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); + u32 maxPP = CalculatePPWithBonus(move, ppBonuses, i); + if (move && (currentPP == 0 || (gBattleScripting.overrideBerryRequirements && currentPP != maxPP))) + { + u32 ppRestored = GetItemHoldEffectParam(itemId); + + if (ability == ABILITY_RIPEN) + { + ppRestored *= 2; + gBattlerAbility = battler; + } + if (currentPP + ppRestored > maxPP) + changedPP = maxPP; + else + changedPP = currentPP + ppRestored; + + PREPARE_MOVE_BUFFER(gBattleTextBuff1, move); + + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BerryPPHealEnd2); + else + BattleScriptCall(BattleScript_BerryPPHealRet); + + gBattleScripting.battler = battler; + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); + MarkBattlerForControllerExec(battler); + if (MOVE_IS_PERMANENT(battler, i)) + gBattleMons[battler].pp[i] = changedPP; + effect = ITEM_PP_CHANGE; + } + } + return effect; +} + +static enum ItemEffect HealConfuseBerry(u32 battler, u32 itemId, u32 flavorId, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + u32 hpFraction = B_CONFUSE_BERRIES_HEAL >= GEN_7 ? 4 : 2; + u32 ability = GetBattlerAbility(battler); + + if (HasEnoughHpToEatBerry(battler, ability, hpFraction, itemId) + && !(B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battler].volatiles.healBlock)) + { + s32 healAmount = GetNonDynamaxMaxHP(battler) / GetItemHoldEffectParam(itemId); + if (ability == ABILITY_RIPEN) + healAmount *= 2; + SetHealAmount(battler, healAmount); + if (timing == IsOnSwitchInFirstTurnActivation) + { + if (GetFlavorRelationByPersonality(gBattleMons[battler].personality, flavorId) < 0) + BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); + else + BattleScriptExecute(BattleScript_ItemHealHP_RemoveItemEnd2); + } + else + { + if (GetFlavorRelationByPersonality(gBattleMons[battler].personality, flavorId) < 0) + BattleScriptCall(BattleScript_BerryConfuseHealRet); + else + BattleScriptCall(BattleScript_ItemHealHP_RemoveItemRet); + } + PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, flavorId); + effect = ITEM_HP_CHANGE; + } + + return effect; +} + +static enum ItemEffect StatRaiseBerry(u32 battler, u32 itemId, enum Stat statId, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + enum Ability ability = GetBattlerAbility(battler); + + if (CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN, ability) + && HasEnoughHpToEatBerry(battler, ability, GetItemHoldEffectParam(itemId), itemId)) + { + gEffectBattler = gBattleScripting.battler = battler; + SET_STATCHANGER(statId, ability == ABILITY_RIPEN ? 2 : 1, FALSE); + gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + statId; + gBattleScripting.animArg2 = 0; + + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); + else + BattleScriptCall(BattleScript_ConsumableStatRaiseRet); + effect = ITEM_STATS_CHANGE; + } + + return effect; +} + +static enum ItemEffect CriticalHitRatioUp(u32 battler, u32 itemId, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (!gBattleMons[battler].volatiles.focusEnergy + && !gBattleMons[battler].volatiles.dragonCheer + && HasEnoughHpToEatBerry(battler, GetBattlerAbility(battler), GetItemHoldEffectParam(itemId), itemId)) + { + gBattleMons[battler].volatiles.focusEnergy = TRUE; + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2); + else + BattleScriptCall(BattleScript_BerryFocusEnergyRet); + effect = ITEM_EFFECT_OTHER; + } + + return effect; +} + +static enum ItemEffect RandomStatRaiseBerry(u32 battler, u32 itemId, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + enum Stat stat; + enum Ability ability = GetBattlerAbility(battler); + + for (stat = STAT_ATK; stat < NUM_STATS; stat++) + { + if (CompareStat(battler, stat, MAX_STAT_STAGE, CMP_LESS_THAN, ability)) + break; + } + + if (stat == NUM_STATS) + return effect; + + if (HasEnoughHpToEatBerry(battler, ability, GetItemHoldEffectParam(itemId), itemId)) + { + u32 savedAttacker = gBattlerAttacker; + // MoodyCantRaiseStat requires that the battler is set to gBattlerAttacker + gBattlerAttacker = gBattleScripting.battler = battler; + gBattleScripting.statChanger = 0; + if (ability != ABILITY_CONTRARY) + stat = RandomUniformExcept(RNG_RANDOM_STAT_UP, STAT_ATK, NUM_STATS - 1, MoodyCantRaiseStat); + else + stat = RandomUniformExcept(RNG_RANDOM_STAT_UP, STAT_ATK, NUM_STATS - 1, MoodyCantLowerStat); + gBattlerAttacker = savedAttacker; + + PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); + SET_STATCHANGER(stat, ability == ABILITY_RIPEN ? 4 : 2, FALSE); + gBattleScripting.animArg1 = STAT_ANIM_PLUS2 + stat; + gBattleScripting.animArg2 = 0; + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); + else + BattleScriptCall(BattleScript_ConsumableStatRaiseRet); + effect = ITEM_STATS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TrySetMicleBerry(u32 battler, u32 itemId, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (HasEnoughHpToEatBerry(battler, GetBattlerAbility(battler), 4, itemId)) + { + gBattleStruct->battlerState[battler].usedMicleBerry = TRUE; + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_MicleBerryActivateEnd2); + else + BattleScriptCall(BattleScript_MicleBerryActivateRet); + effect = ITEM_EFFECT_OTHER; + } + return effect; +} + +enum ItemEffect ItemBattleEffects(u32 itemBattler, u32 battler, enum HoldEffect holdEffect, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + u32 item; + + if (timing == IsOnBerryActivation || timing == IsOnFlingActivation) + item = gLastUsedItem; + else + item = gBattleMons[itemBattler].item; + + if (holdEffect == HOLD_EFFECT_NONE + || !timing(holdEffect) + || IsUnnerveBlocked(itemBattler, item)) + return effect; + + if (!IsBattlerAlive(itemBattler) + && holdEffect != HOLD_EFFECT_ROWAP_BERRY // Hacky workaround for them right now + && holdEffect != HOLD_EFFECT_JABOCA_BERRY + && holdEffect != HOLD_EFFECT_ROCKY_HELMET) + return effect; + + switch (holdEffect) + { + case HOLD_EFFECT_DOUBLE_PRIZE: + effect = TryDoublePrize(itemBattler); + break; + case HOLD_EFFECT_ROOM_SERVICE: + effect = TryRoomService(itemBattler, timing); + break; + case HOLD_EFFECT_TERRAIN_SEED: + effect = TryTerrainSeeds(itemBattler, item, timing); + break; + case HOLD_EFFECT_BERSERK_GENE: + effect = TryBerserkGene(itemBattler, timing); + break; + case HOLD_EFFECT_BOOSTER_ENERGY: + effect = TryBoosterEnergy(itemBattler, GetBattlerAbility(itemBattler), timing); + break; + case HOLD_EFFECT_WHITE_HERB: + effect = RestoreWhiteHerbStats(itemBattler, timing); + break; + case HOLD_EFFECT_MIRROR_HERB: + effect = TryConsumeMirrorHerb(itemBattler, timing); + break; + case HOLD_EFFECT_FLINCH: // Kings Rock + effect = TryKingsRock(itemBattler, battler, item); + break; + case HOLD_EFFECT_AIR_BALLOON: + effect = TryAirBalloon(itemBattler, timing); + break; + case HOLD_EFFECT_ROCKY_HELMET: + effect = TryRockyHelmet(itemBattler, battler, item); + break; + case HOLD_EFFECT_WEAKNESS_POLICY: + effect = TryWeaknessPolicy(itemBattler); + break; + case HOLD_EFFECT_SNOWBALL: + effect = TrySnowball(itemBattler); + break; + case HOLD_EFFECT_LUMINOUS_MOSS: + effect = TryLuminousMoss(itemBattler); + break; + case HOLD_EFFECT_CELL_BATTERY: + effect = TryCellBattery(itemBattler); + break; + case HOLD_EFFECT_ABSORB_BULB: + effect = TryAbsorbBulb(itemBattler); + break; + case HOLD_EFFECT_JABOCA_BERRY: + effect = TryJabocaBerry(itemBattler, battler, item); + break; + case HOLD_EFFECT_ROWAP_BERRY: + effect = TryRowapBerry(itemBattler, battler, item); + break; + case HOLD_EFFECT_ENIGMA_BERRY: // consume and heal if hit by super effective move + effect = TrySetEnigmaBerry(itemBattler, battler); + break; + case HOLD_EFFECT_BLUNDER_POLICY: + effect = TryBlunderPolicy(itemBattler); + break; + case HOLD_EFFECT_MENTAL_HERB: + effect = TryMentalHerb(itemBattler); + break; + case HOLD_EFFECT_THROAT_SPRAY: + effect = TryThroatSpray(itemBattler); + break; + case HOLD_EFFECT_KEE_BERRY: // consume and boost defense if used physical move + effect = DamagedStatBoostBerryEffect(itemBattler, battler, STAT_DEF, DAMAGE_CATEGORY_PHYSICAL); + break; + case HOLD_EFFECT_MARANGA_BERRY: // consume and boost sp. defense if used special move + effect = DamagedStatBoostBerryEffect(itemBattler, battler, STAT_SPDEF, DAMAGE_CATEGORY_SPECIAL); + break; + case HOLD_EFFECT_SHELL_BELL: + effect = TryShellBell(itemBattler); + break; + case HOLD_EFFECT_LIFE_ORB: + effect = TryLifeOrb(itemBattler); + break; + case HOLD_EFFECT_STICKY_BARB: + if (timing == IsOnTargetHitActivation) + effect = TryStickyBarbOnTargetHit(itemBattler, battler, item); + else + effect = TryStickyBarbOnEndTurn(itemBattler, item); + break; + case HOLD_EFFECT_TOXIC_ORB: + effect = TryToxicOrb(itemBattler); + break; + case HOLD_EFFECT_FLAME_ORB: + effect = TryFlameOrb(itemBattler); + break; + case HOLD_EFFECT_LEFTOVERS: + effect = TryLeftovers(itemBattler, holdEffect); + break; + case HOLD_EFFECT_BLACK_SLUDGE: + if (IS_BATTLER_OF_TYPE(itemBattler, TYPE_POISON)) + effect = TryLeftovers(itemBattler, holdEffect); + else + effect = TryBlackSludgeDamage(itemBattler, holdEffect); + break; + case HOLD_EFFECT_CURE_PAR: // Cheri Berry + effect = TryCureParalysis(itemBattler, timing); + break; + case HOLD_EFFECT_CURE_PSN: // Pecha Berry + effect = TryCurePoison(itemBattler, timing); + break; + case HOLD_EFFECT_CURE_BRN: // Rawst Berry + effect = TryCureBurn(itemBattler, timing); + break; + case HOLD_EFFECT_CURE_FRZ: // Aspear Berry + effect = TryCureFreezeOrFrostbite(itemBattler, timing); + break; + case HOLD_EFFECT_CURE_SLP: // Chesto Berry + effect = TryCureSleep(itemBattler, timing); + break; + case HOLD_EFFECT_CURE_CONFUSION: // Persim Berry + effect = TryCureConfusion(itemBattler, timing); + break; + case HOLD_EFFECT_CURE_STATUS: // Lum Berry + effect = TryCureAnyStatus(itemBattler, timing); + break; + case HOLD_EFFECT_RESTORE_HP: // Oran / Sitrus Berry / Berry Juice + effect = ItemHealHp(itemBattler, item, FIXED_HEAL_AMOUNT, timing); + break; + case HOLD_EFFECT_RESTORE_PCT_HP: // Sitrus Berry + effect = ItemHealHp(itemBattler, item, PERCENT_HEAL_AMOUNT, timing); + break; + case HOLD_EFFECT_RESTORE_PP: // Leppa Berry + effect = ItemRestorePp(itemBattler, item, timing); + break; + case HOLD_EFFECT_CONFUSE_SPICY: // Figy Berry + effect = HealConfuseBerry(itemBattler, item, FLAVOR_SPICY, timing); + break; + case HOLD_EFFECT_CONFUSE_DRY: // Wiki Berry + effect = HealConfuseBerry(itemBattler, item, FLAVOR_DRY, timing); + break; + case HOLD_EFFECT_CONFUSE_SWEET: // Mago Berry + effect = HealConfuseBerry(itemBattler, item, FLAVOR_SWEET, timing); + break; + case HOLD_EFFECT_CONFUSE_BITTER: // Aguav Berry + effect = HealConfuseBerry(itemBattler, item, FLAVOR_BITTER, timing); + break; + case HOLD_EFFECT_CONFUSE_SOUR: // Iapapa Berry + effect = HealConfuseBerry(itemBattler, item, FLAVOR_SOUR, timing); + break; + case HOLD_EFFECT_ATTACK_UP: // Liechi Berry + effect = StatRaiseBerry(itemBattler, item, STAT_ATK, timing); + break; + case HOLD_EFFECT_DEFENSE_UP: // Ganlon Berry + effect = StatRaiseBerry(itemBattler, item, STAT_DEF, timing); + break; + case HOLD_EFFECT_SPEED_UP: // Salac Berry + effect = StatRaiseBerry(itemBattler, item, STAT_SPEED, timing); + break; + case HOLD_EFFECT_SP_ATTACK_UP: // Petaya Berry + effect = StatRaiseBerry(itemBattler, item, STAT_SPATK, timing); + break; + case HOLD_EFFECT_SP_DEFENSE_UP: // Apicot Berry + effect = StatRaiseBerry(itemBattler, item, STAT_SPDEF, timing); + break; + case HOLD_EFFECT_CRITICAL_UP: // Lansat Berry + effect = CriticalHitRatioUp(itemBattler, item, timing); + break; + case HOLD_EFFECT_RANDOM_STAT_UP: // Starf Berry + effect = RandomStatRaiseBerry(itemBattler, item, timing); + break; + case HOLD_EFFECT_MICLE_BERRY: + effect = TrySetMicleBerry(itemBattler, item, timing); + break; + default: + break; + } + + if (effect == ITEM_STATUS_CHANGE) + { + BtlController_EmitSetMonData(itemBattler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[itemBattler].status1); + MarkBattlerForControllerExec(itemBattler); + } + + if (effect) + { + gLastUsedItem = item; + gBattleScripting.battler = gPotentialItemEffectBattler = itemBattler; + if ((item >= FIRST_BERRY_INDEX && item <= LAST_BERRY_INDEX)) + GetBattlerPartyState(itemBattler)->ateBerry = TRUE; + } + + return effect; +} diff --git a/src/battle_interface.c b/src/battle_interface.c index 80c85bb141e6..f87a88964119 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -1175,12 +1175,13 @@ void SwapHpBarsWithHpText(void) for (i = 0; i < gBattlersCount; i++) { + struct Pokemon *mon = GetBattlerMon(i); if (gSprites[gHealthboxSpriteIds[i]].callback == SpriteCallbackDummy && IsOnPlayerSide(i) && (GetBattlerCoordsIndex(i) != BATTLE_COORDS_SINGLES || !IsOnPlayerSide(i))) { - s32 currHp = GetMonData(GetBattlerMon(i), MON_DATA_HP); - s32 maxHp = GetMonData(GetBattlerMon(i), MON_DATA_MAX_HP); + s32 currHp = GetMonData(mon, MON_DATA_HP); + s32 maxHp = GetMonData(mon, MON_DATA_MAX_HP); bool8 noBars; gBattleSpritesDataPtr->battlerData[i].hpNumbersNoBars ^= 1; @@ -1202,7 +1203,7 @@ void SwapHpBarsWithHpText(void) else // text to bars { UpdateStatusIconInHealthbox(gHealthboxSpriteIds[i]); - UpdateHealthboxAttribute(gHealthboxSpriteIds[i], GetBattlerMon(i), HEALTHBOX_HEALTH_BAR); + UpdateHealthboxAttribute(gHealthboxSpriteIds[i], mon, HEALTHBOX_HEALTH_BAR); CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_FRAME_END_BAR), (void *)(OBJ_VRAM0 + 0x680 + gSprites[gHealthboxSpriteIds[i]].oam.tileNum * TILE_SIZE_4BPP), 32); } } @@ -1213,7 +1214,7 @@ void SwapHpBarsWithHpText(void) if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) { // Most likely a debug function. - PrintSafariMonInfo(gHealthboxSpriteIds[i], GetBattlerMon(i)); + PrintSafariMonInfo(gHealthboxSpriteIds[i], mon); } else { @@ -1226,9 +1227,9 @@ void SwapHpBarsWithHpText(void) else // text to bars { UpdateStatusIconInHealthbox(gHealthboxSpriteIds[i]); - UpdateHealthboxAttribute(gHealthboxSpriteIds[i], GetBattlerMon(i), HEALTHBOX_HEALTH_BAR); + UpdateHealthboxAttribute(gHealthboxSpriteIds[i], mon, HEALTHBOX_HEALTH_BAR); if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - UpdateHealthboxAttribute(gHealthboxSpriteIds[i], GetBattlerMon(i), HEALTHBOX_NICK); + UpdateHealthboxAttribute(gHealthboxSpriteIds[i], mon, HEALTHBOX_NICK); } } gSprites[gHealthboxSpriteIds[i]].hMain_Data7 ^= 1; @@ -1805,9 +1806,9 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) battler = gSprites[healthboxSpriteId].hMain_Battler; healthBarSpriteId = gSprites[healthboxSpriteId].hMain_HealthBarSpriteId; + status = GetMonData(GetBattlerMon(battler), MON_DATA_STATUS); if (IsOnPlayerSide(battler)) { - status = GetMonData(GetBattlerMon(battler), MON_DATA_STATUS); switch (GetBattlerCoordsIndex(battler)) { case BATTLE_COORDS_SINGLES: @@ -1820,7 +1821,6 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) } else { - status = GetMonData(GetBattlerMon(battler), MON_DATA_STATUS); tileNumAdder = 0x11; } @@ -2258,10 +2258,11 @@ static u8 CalcBarFilledPixels(s32 maxValue, s32 oldValue, s32 receivedValue, s32 for (i = 0; i < scale; i++) pixelsArray[i] = 0; + // Safe Div, because 2vs1 battles can have maxValue 0. if (maxValue < totalPixels) - pixels = (*currValue * totalPixels / maxValue) >> 8; + pixels = SAFE_DIV(*currValue * totalPixels, maxValue) >> 8; else - pixels = *currValue * totalPixels / maxValue; + pixels = SAFE_DIV(*currValue * totalPixels, maxValue); filledPixels = pixels; @@ -2410,30 +2411,69 @@ static void SafariTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 wi CpuCopy32(windowTileData + 256, dest + 256, windowWidth * TILE_SIZE_4BPP); } -#define ABILITY_POP_UP_TAG 0xD720 +#define ABILITY_POP_UP_POS_X_DIFF 64 +#define ABILITY_POP_UP_POS_X_SLIDE 128 +#define ABILITY_POP_UP_POS_X_SPEED 4 -// for sprite -#define tOriginalX data[0] -#define tHide data[1] -#define tFrames data[2] -#define tRightToLeft data[3] -#define tBattlerId data[4] -#define tIsMain data[5] +#define ABILITY_POP_UP_WIN_WIDTH 10 +#define ABILITY_POP_UP_STR_WIDTH (ABILITY_POP_UP_WIN_WIDTH * 8) -// for task -#define tSpriteId1 data[6] -#define tSpriteId2 data[7] +#define ABILITY_POP_UP_PLAYER_LEFT_WIN_W 6 +#define ABILITY_POP_UP_PLAYER_RIGHT_WIN_W 4 +#define ABILITY_POP_UP_OPPONENT_LEFT_WIN_W 7 +#define ABILITY_POP_UP_OPPONENT_RIGHT_WIN_W 3 -static const u8 ALIGNED(4) sAbilityPopUpGfx[] = INCBIN_U8("graphics/battle_interface/ability_pop_up.4bpp"); +#define ABILITY_POP_UP_WAIT_FRAMES 48 + +/* + * BG = BackGround + * FG = ForeGround + * SH = SHadow + */ +#define ABILITY_POP_UP_BATTLER_BG_TXTCLR 2 +#define ABILITY_POP_UP_BATTLER_FG_TXTCLR 7 +#define ABILITY_POP_UP_BATTLER_SH_TXTCLR 1 + +#define ABILITY_POP_UP_ABILITY_BG_TXTCLR 7 +#define ABILITY_POP_UP_ABILITY_FG_TXTCLR 9 +#define ABILITY_POP_UP_ABILITY_SH_TXTCLR 1 + +#define sState data[0] +#define sAutoDestroy data[1] +#define sTimer data[2] +#define sIsPlayerSide data[3] +#define sBattlerId data[4] +#define sIsMain data[5] + +enum +{ + APU_STATE_SLIDE_IN = 0, + APU_STATE_IDLE, + APU_STATE_SLIDE_OUT, + APU_STATE_END +}; + +enum +{ + TAG_ABILITY_POP_UP = 0xD720, // Only used for the SpritePalette, the rest below is for the SpriteSheets. + TAG_ABILITY_POP_UP_PLAYER1 = TAG_ABILITY_POP_UP, + TAG_ABILITY_POP_UP_OPPONENT1, + TAG_ABILITY_POP_UP_PLAYER2, + TAG_ABILITY_POP_UP_OPPONENT2, + TAG_LAST_BALL_WINDOW, +}; + +static const u32 sAbilityPopUpGfx[] = INCBIN_U32("graphics/battle_interface/ability_pop_up.4bpp"); static const u16 sAbilityPopUpPalette[] = INCBIN_U16("graphics/battle_interface/ability_pop_up.gbapal"); static const struct SpriteSheet sSpriteSheet_AbilityPopUp = { - sAbilityPopUpGfx, sizeof(sAbilityPopUpGfx), ABILITY_POP_UP_TAG + sAbilityPopUpGfx, sizeof(sAbilityPopUpGfx), TAG_ABILITY_POP_UP }; + static const struct SpritePalette sSpritePalette_AbilityPopUp = { - sAbilityPopUpPalette, ABILITY_POP_UP_TAG + sAbilityPopUpPalette, TAG_ABILITY_POP_UP }; static const struct OamData sOamData_AbilityPopUp = @@ -2447,8 +2487,8 @@ static const struct OamData sOamData_AbilityPopUp = static const struct SpriteTemplate sSpriteTemplate_AbilityPopUp = { - .tileTag = ABILITY_POP_UP_TAG, - .paletteTag = ABILITY_POP_UP_TAG, + .tileTag = TAG_NONE, // Changed on the fly. + .paletteTag = TAG_ABILITY_POP_UP, .oam = &sOamData_AbilityPopUp, .anims = gDummySpriteAnimTable, .images = NULL, @@ -2456,279 +2496,150 @@ static const struct SpriteTemplate sSpriteTemplate_AbilityPopUp = .callback = SpriteCb_AbilityPopUp }; -#define ABILITY_POP_UP_POS_X_DIFF (64 - 7) // Hide second sprite underneath to gain proper letter spacing -#define ABILITY_POP_UP_POS_X_SLIDE 68 - static const s16 sAbilityPopUpCoordsDoubles[MAX_BATTLERS_COUNT][2] = { - {29, 80}, // player left - {186, 19}, // opponent left - {29, 97}, // player right - {186, 36}, // opponent right + { 24, 80}, // Player left + {178, 19}, // Opponent left + { 24, 97}, // Player right + {178, 36}, // Opponent right }; static const s16 sAbilityPopUpCoordsSingles[MAX_BATTLERS_COUNT][2] = { - {29, 97}, // player - {186, 57}, // opponent + { 24, 97}, // Player + {178, 57}, // Opponent }; -#define POPUP_WINDOW_WIDTH 8 -#define MAX_POPUP_STRING_WIDTH (POPUP_WINDOW_WIDTH * 8) - -static u8* AddTextPrinterAndCreateWindowOnAbilityPopUp(const u8 *str, u32 x, u32 y, u32 color1, u32 color2, u32 color3, u32 *windowId) +static u8 *AddTextPrinterAndCreateWindowOnAbilityPopUp(const u8 *str, u32 x, u32 y, u32 bgColor, u32 fgColor, u32 shadowColor, u32 *windowId) { u32 fontId; - u8 color[3] = {color1, color2, color3}; + u8 color[3] = {bgColor, fgColor, shadowColor}; struct WindowTemplate winTemplate = {0}; - winTemplate.width = POPUP_WINDOW_WIDTH; + winTemplate.width = ABILITY_POP_UP_WIN_WIDTH; winTemplate.height = 2; *windowId = AddWindow(&winTemplate); - FillWindowPixelBuffer(*windowId, PIXEL_FILL(color1)); + FillWindowPixelBuffer(*windowId, PIXEL_FILL(bgColor)); - fontId = GetFontIdToFit(str, FONT_SMALL, 0, 76); + fontId = GetFontIdToFit(str, FONT_SMALL, 0, ABILITY_POP_UP_STR_WIDTH); AddTextPrinterParameterized4(*windowId, fontId, x, y, 0, 0, color, TEXT_SKIP_DRAW, str); + return (u8 *)(GetWindowAttribute(*windowId, WINDOW_TILE_DATA)); } -static void TextIntoAbilityPopUp(void *dest, u8 *windowTileData, s32 xTileAmount, bool32 arg3) +static void TextIntoAbilityPopUp(void *dest, u8 *windowTileData, s32 windowWidth, bool32 printNickname) { - CpuCopy32(windowTileData + 256, dest + 256, xTileAmount * 32); - if (xTileAmount > 0) + #define PIXELS(n) (n * 4) + if (windowWidth > 0) { do { - if (arg3) - CpuCopy32(windowTileData + 16, dest + 16, 16); + if (printNickname) + { + CpuCopy32(windowTileData + PIXELS(3), dest + PIXELS(3), PIXELS(5)); + CpuCopy32(windowTileData + TILE_OFFSET_4BPP(ABILITY_POP_UP_WIN_WIDTH), dest + TILE_OFFSET_4BPP(8), PIXELS(5)); + } else - CpuCopy32(windowTileData + 20, dest + 20, 12); - dest += 32, windowTileData += 32; - xTileAmount--; - } while (xTileAmount != 0); + { + CpuCopy32(windowTileData + PIXELS(7), dest + PIXELS(7), PIXELS(1)); + CpuCopy32(windowTileData + TILE_OFFSET_4BPP(ABILITY_POP_UP_WIN_WIDTH), dest + TILE_OFFSET_4BPP(8), TILE_SIZE_4BPP); + } + + dest += TILE_SIZE_4BPP, windowTileData += TILE_SIZE_4BPP; + windowWidth--; + } while (windowWidth != 0); } + #undef PIXELS } -static void PrintOnAbilityPopUp(const u8 *str, u8 *spriteTileData1, u8 *spriteTileData2, u32 x1, u32 x2, u32 y, u32 color1, u32 color2, u32 color3) +static void PrintOnAbilityPopUp(const u8 *str, u8 *spriteTileData1, u8 *spriteTileData2, u32 x, u32 y, u32 bgColor, u32 fgColor, u32 shadowColor, u32 printNickname, u32 battler) { - u32 windowId; - u8 *windowTileData; - u16 width; + u32 windowId, fontId; + u8 *windowTileData = AddTextPrinterAndCreateWindowOnAbilityPopUp(str, x, y, bgColor, fgColor, shadowColor, &windowId); + u32 size1 = ABILITY_POP_UP_OPPONENT_LEFT_WIN_W, size2 = ABILITY_POP_UP_OPPONENT_RIGHT_WIN_W; - windowTileData = AddTextPrinterAndCreateWindowOnAbilityPopUp(str, x1, y, color1, color2, color3, &windowId); - TextIntoAbilityPopUp(spriteTileData1, windowTileData, 8, (y == 0)); - RemoveWindow(windowId); - - width = GetStringWidth(FONT_SMALL, str, 0); + spriteTileData1 += TILE_OFFSET_4BPP(1); + if (IsOnPlayerSide(battler)) + { + size1 = ABILITY_POP_UP_PLAYER_LEFT_WIN_W, size2 = ABILITY_POP_UP_PLAYER_RIGHT_WIN_W; + // Increment again as the *first* column of the sprite + // is not shown for player's pop up when sliding in. + spriteTileData1 += TILE_OFFSET_4BPP(1); + } - if (width > MAX_POPUP_STRING_WIDTH - 5) + TextIntoAbilityPopUp(spriteTileData1, windowTileData, size1, printNickname); + fontId = GetFontIdToFit(str, FONT_SMALL, 0, ABILITY_POP_UP_STR_WIDTH); + if (GetStringWidth(fontId, str, 0) > (size1 * 8)) { - windowTileData = AddTextPrinterAndCreateWindowOnAbilityPopUp(str, x2 - MAX_POPUP_STRING_WIDTH, y, color1, color2, color3, &windowId); - TextIntoAbilityPopUp(spriteTileData2, windowTileData, 3, (y == 0)); - RemoveWindow(windowId); + windowTileData += TILE_OFFSET_4BPP(size1); + TextIntoAbilityPopUp(spriteTileData2, windowTileData, size2, printNickname); } -} -static const u8 sText_Spaces20[]= _(" "); -static void ClearAbilityName(u8 spriteId1, u8 spriteId2) -{ - PrintOnAbilityPopUp(sText_Spaces20, - (void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32) + 256, - (void*)(OBJ_VRAM0) + (gSprites[spriteId2].oam.tileNum * 32) + 256, - 5, 12, - 4, - 7, 9, 1); + RemoveWindow(windowId); } static void PrintBattlerOnAbilityPopUp(u8 battler, u8 spriteId1, u8 spriteId2) { - int i; - u8 lastChar; - u8* textPtr; - u8 monName[POKEMON_NAME_LENGTH + 3] = {0}; + u32 totalChar = 0, lastChar; struct Pokemon *illusionMon = GetIllusionMonPtr(battler); - u8 nick[POKEMON_NAME_LENGTH + 1] = {0}; if (illusionMon != NULL) - GetMonData(illusionMon, MON_DATA_NICKNAME, nick); + GetMonData(illusionMon, MON_DATA_NICKNAME, gStringVar1); else - GetMonData(GetBattlerMon(battler), MON_DATA_NICKNAME, nick); + GetMonData(GetBattlerMon(battler), MON_DATA_NICKNAME, gStringVar1); - for (i = 0; i < POKEMON_NAME_LENGTH; ++i) - { - if (nick[i] == EOS) // End of string - break; + while (gStringVar1[totalChar] != EOS) + totalChar++; - monName[i] = nick[i]; - } - - textPtr = monName + i; - - lastChar = *(textPtr - 1); - - // Make the string say "[NAME]'s" instead of "[NAME]" - textPtr[0] = CHAR_SGL_QUOTE_RIGHT; // apostraphe - textPtr++; + lastChar = gStringVar1[totalChar - 1]; + StringAppend(gStringVar1, COMPOUND_STRING("'")); if (lastChar != CHAR_S && lastChar != CHAR_s) - { - textPtr[0] = CHAR_s; - textPtr++; - } - - textPtr[0] = EOS; + StringAppend(gStringVar1, COMPOUND_STRING("s")); - PrintOnAbilityPopUp((const u8 *)monName, - (void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32), - (void*)(OBJ_VRAM0) + (gSprites[spriteId2].oam.tileNum * 32), - 5, 12, - 0, - 2, 7, 1); + PrintOnAbilityPopUp(gStringVar1, + (void *)(OBJ_VRAM0) + TILE_OFFSET_4BPP(gSprites[spriteId1].oam.tileNum), + (void *)(OBJ_VRAM0) + TILE_OFFSET_4BPP(gSprites[spriteId2].oam.tileNum), + 0, 0, + ABILITY_POP_UP_BATTLER_BG_TXTCLR, ABILITY_POP_UP_BATTLER_FG_TXTCLR, ABILITY_POP_UP_BATTLER_SH_TXTCLR, + TRUE, gSprites[spriteId1].sBattlerId); } -static void PrintAbilityOnAbilityPopUp(u32 ability, u8 spriteId1, u8 spriteId2) +static void PrintAbilityOnAbilityPopUp(enum Ability ability, u8 spriteId1, u8 spriteId2) { - ClearAbilityName(spriteId1, spriteId2); + PrintOnAbilityPopUp(COMPOUND_STRING(" "), + (void *)(OBJ_VRAM0) + TILE_OFFSET_4BPP(gSprites[spriteId1].oam.tileNum) + TILE_OFFSET_4BPP(8), + (void *)(OBJ_VRAM0) + TILE_OFFSET_4BPP(gSprites[spriteId2].oam.tileNum) + TILE_OFFSET_4BPP(8), + 0, 4, + ABILITY_POP_UP_ABILITY_BG_TXTCLR, ABILITY_POP_UP_ABILITY_FG_TXTCLR, ABILITY_POP_UP_ABILITY_SH_TXTCLR, + FALSE, gSprites[spriteId1].sBattlerId); PrintOnAbilityPopUp(gAbilitiesInfo[ability].name, - (void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32) + 256, - (void*)(OBJ_VRAM0) + (gSprites[spriteId2].oam.tileNum * 32) + 256, - 5, 12, - 4, - 7, 9, 1); -} - -#define PIXEL_COORDS_TO_OFFSET(x, y)( \ -/*Add tiles by X*/ \ -((y / 8) * 32 * 8) \ -/*Add tiles by X*/ \ -+ ((x / 8) * 32) \ -/*Add pixels by Y*/ \ -+ ((((y) - ((y / 8) * 8))) * 4) \ -/*Add pixels by X*/ \ -+ ((((x) - ((x / 8) * 8)) / 2))) - -static const u16 sOverwrittenPixelsTable[][2] = -{ - {PIXEL_COORDS_TO_OFFSET(0, 0), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 1), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 2), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 3), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 4), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 5), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 6), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 7), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 8), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 9), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 10), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 11), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 12), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 13), 8}, - - {PIXEL_COORDS_TO_OFFSET(8, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(16, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(24, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(32, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(40, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(48, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(56, 13), 8}, - - {PIXEL_COORDS_TO_OFFSET(0, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(8, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(16, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(24, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(32, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(40, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(48, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(56, 14), 8}, - - {PIXEL_COORDS_TO_OFFSET(0, 15), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 16), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 17), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 18), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 19), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 20), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 21), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 22), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 23), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 24), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 25), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 26), 3}, - -//Second Row Of Image - {PIXEL_COORDS_TO_OFFSET(0, 45), 8}, - {PIXEL_COORDS_TO_OFFSET(0, 46), 8}, - {PIXEL_COORDS_TO_OFFSET(0, 47), 8}, - {PIXEL_COORDS_TO_OFFSET(8, 45), 8}, - {PIXEL_COORDS_TO_OFFSET(8, 46), 8}, - {PIXEL_COORDS_TO_OFFSET(8, 47), 8}, - {PIXEL_COORDS_TO_OFFSET(16, 45), 8}, - {PIXEL_COORDS_TO_OFFSET(16, 46), 8}, - {PIXEL_COORDS_TO_OFFSET(16, 47), 8}, -}; - -static inline void CopyPixels(u8 *dest, const u8 *src, u32 pixelCount) -{ - u32 i = 0; - - if (pixelCount & 1) - { - while (pixelCount != 0) - { - dest[i] &= ~(0xF); - dest[i] |= (src[i] & 0xF); - if (--pixelCount != 0) - { - dest[i] &= ~(0xF0); - dest[i] |= (src[i] & 0xF0); - pixelCount--; - } - i++; - } - } - else - { - for (i = 0; i < pixelCount / 2; i++) - dest[i] = src[i]; - } -} - -static void RestoreOverwrittenPixels(u8 *tiles) -{ - u32 i; - u8 *buffer = Alloc(sizeof(sAbilityPopUpGfx) * 2); - - CpuCopy32(tiles, buffer, sizeof(sAbilityPopUpGfx)); - - for (i = 0; i < ARRAY_COUNT(sOverwrittenPixelsTable); i++) - { - CopyPixels(buffer + sOverwrittenPixelsTable[i][0], - sAbilityPopUpGfx + sOverwrittenPixelsTable[i][0], - sOverwrittenPixelsTable[i][1]); - } - - CpuCopy32(buffer, tiles, sizeof(sAbilityPopUpGfx)); - Free(buffer); + (void *)(OBJ_VRAM0) + TILE_OFFSET_4BPP(gSprites[spriteId1].oam.tileNum) + TILE_OFFSET_4BPP(8), + (void *)(OBJ_VRAM0) + TILE_OFFSET_4BPP(gSprites[spriteId2].oam.tileNum) + TILE_OFFSET_4BPP(8), + 0, 4, + ABILITY_POP_UP_ABILITY_BG_TXTCLR, ABILITY_POP_UP_ABILITY_FG_TXTCLR, ABILITY_POP_UP_ABILITY_SH_TXTCLR, + FALSE, gSprites[spriteId1].sBattlerId); } static inline bool32 IsAnyAbilityPopUpActive(void) { + u32 activeAbilityPopUps = 0; for (u32 battler = 0; battler < gBattlersCount; battler++) { if (gBattleStruct->battlerState[battler].activeAbilityPopUps) - return TRUE; + activeAbilityPopUps++; } - return FALSE; + return activeAbilityPopUps; } -void CreateAbilityPopUp(u8 battler, u32 ability, bool32 isDoubleBattle) +void CreateAbilityPopUp(u8 battler, enum Ability ability, bool32 isDoubleBattle) { + u8 *spriteIds; + u32 xSlide, tileTag, battlerPosition = GetBattlerPosition(battler); + struct SpriteTemplate template; const s16 (*coords)[2]; - u8 spriteId1, spriteId2, battlerPosition, taskId; - - if (B_ABILITY_POP_UP == FALSE) - return; - if (gBattleScripting.abilityPopupOverwrite != 0) + if (gBattleScripting.abilityPopupOverwrite) ability = gBattleScripting.abilityPopupOverwrite; if (gTestRunnerEnabled) @@ -2739,111 +2650,122 @@ void CreateAbilityPopUp(u8 battler, u32 ability, bool32 isDoubleBattle) } if (!IsAnyAbilityPopUpActive()) - { - LoadSpriteSheet(&sSpriteSheet_AbilityPopUp); LoadSpritePalette(&sSpritePalette_AbilityPopUp); - } - gBattleStruct->battlerState[battler].activeAbilityPopUps = TRUE; - battlerPosition = GetBattlerPosition(battler); + tileTag = (TAG_ABILITY_POP_UP_PLAYER1 + battler); + if (IndexOfSpriteTileTag(tileTag) == 0xFF) + { + struct SpriteSheet sheet = sSpriteSheet_AbilityPopUp; + sheet.tag = tileTag; + LoadSpriteSheet(&sheet); + } - if (isDoubleBattle) - coords = sAbilityPopUpCoordsDoubles; - else - coords = sAbilityPopUpCoordsSingles; + coords = isDoubleBattle ? sAbilityPopUpCoordsDoubles : sAbilityPopUpCoordsSingles; + xSlide = IsOnPlayerSide(battler) ? -ABILITY_POP_UP_POS_X_SLIDE : ABILITY_POP_UP_POS_X_SLIDE; - if ((battlerPosition & BIT_SIDE) == B_SIDE_PLAYER) - { - spriteId1 = CreateSprite(&sSpriteTemplate_AbilityPopUp, - coords[battlerPosition][0] - ABILITY_POP_UP_POS_X_SLIDE, - coords[battlerPosition][1], 0); - spriteId2 = CreateSprite(&sSpriteTemplate_AbilityPopUp, - coords[battlerPosition][0] - ABILITY_POP_UP_POS_X_SLIDE + ABILITY_POP_UP_POS_X_DIFF, - coords[battlerPosition][1], 1); //Appears below + template = sSpriteTemplate_AbilityPopUp; + template.tileTag = tileTag; + spriteIds = gBattleStruct->abilityPopUpSpriteIds[battler]; + spriteIds[0] = CreateSprite(&template, coords[battlerPosition][0] + xSlide, + coords[battlerPosition][1], 0); + spriteIds[1] = CreateSprite(&template, coords[battlerPosition][0] + xSlide + ABILITY_POP_UP_POS_X_DIFF, + coords[battlerPosition][1], 0); - gSprites[spriteId1].tRightToLeft = TRUE; - gSprites[spriteId2].tRightToLeft = TRUE; - } - else + if (IsOnPlayerSide(battler)) { - spriteId1 = CreateSprite(&sSpriteTemplate_AbilityPopUp, - coords[battlerPosition][0] + ABILITY_POP_UP_POS_X_SLIDE, - coords[battlerPosition][1], 0); - spriteId2 = CreateSprite(&sSpriteTemplate_AbilityPopUp, - coords[battlerPosition][0] + ABILITY_POP_UP_POS_X_SLIDE + ABILITY_POP_UP_POS_X_DIFF, - coords[battlerPosition][1], 1); //Appears below - - gSprites[spriteId1].tRightToLeft = FALSE; - gSprites[spriteId2].tRightToLeft = FALSE; + gSprites[spriteIds[0]].sIsPlayerSide = TRUE; + gSprites[spriteIds[1]].sIsPlayerSide = TRUE; } - gSprites[spriteId1].tOriginalX = coords[battlerPosition][0]; - gSprites[spriteId2].tOriginalX = coords[battlerPosition][0] + ABILITY_POP_UP_POS_X_DIFF; - gSprites[spriteId2].oam.tileNum += (8 * 4); //Second half of pop up + gSprites[spriteIds[1]].oam.tileNum += 32; // Second half of the pop up tiles. - gBattleStruct->abilityPopUpSpriteIds[battler][0] = spriteId1; - gBattleStruct->abilityPopUpSpriteIds[battler][1] = spriteId2; - - taskId = CreateTask(Task_FreeAbilityPopUpGfx, 5); - gTasks[taskId].tSpriteId1 = spriteId1; - gTasks[taskId].tSpriteId2 = spriteId2; + // Create only one instance, as it's only used for + // tracking the SpriteSheet(s) and SpritePalette. + if (!IsAnyAbilityPopUpActive()) + CreateTask(Task_FreeAbilityPopUpGfx, 5); - gSprites[spriteId1].tIsMain = TRUE; - gSprites[spriteId1].tBattlerId = battler; - gSprites[spriteId2].tBattlerId = battler; + gBattleStruct->battlerState[battler].activeAbilityPopUps = TRUE; - StartSpriteAnim(&gSprites[spriteId1], 0); - StartSpriteAnim(&gSprites[spriteId2], 0); + gSprites[spriteIds[0]].sIsMain = TRUE; + gSprites[spriteIds[0]].sBattlerId = battler; + gSprites[spriteIds[1]].sBattlerId = battler; - PrintBattlerOnAbilityPopUp(battler, spriteId1, spriteId2); - PrintAbilityOnAbilityPopUp(ability, spriteId1, spriteId2); - RestoreOverwrittenPixels((void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32)); + PrintBattlerOnAbilityPopUp(battler, spriteIds[0], spriteIds[1]); + PrintAbilityOnAbilityPopUp(ability, spriteIds[0], spriteIds[1]); } void UpdateAbilityPopup(u8 battler) { - u8 spriteId1 = gBattleStruct->abilityPopUpSpriteIds[battler][0]; - u8 spriteId2 = gBattleStruct->abilityPopUpSpriteIds[battler][1]; - u16 ability = (gBattleScripting.abilityPopupOverwrite != 0) ? gBattleScripting.abilityPopupOverwrite : gBattleMons[battler].ability; - - PrintAbilityOnAbilityPopUp(ability, spriteId1, spriteId2); - RestoreOverwrittenPixels((void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32)); + u8 *spriteIds = gBattleStruct->abilityPopUpSpriteIds[battler]; + enum Ability ability = (gBattleScripting.abilityPopupOverwrite) ? gBattleScripting.abilityPopupOverwrite + : gBattleMons[battler].ability; + PrintAbilityOnAbilityPopUp(ability, spriteIds[0], spriteIds[1]); } -#define FRAMES_TO_WAIT 48 - static void SpriteCb_AbilityPopUp(struct Sprite *sprite) { - if (!sprite->tHide) // Show + s16 *data = sprite->data; + u32 battlerPosition = GetBattlerPosition(sBattlerId); + u32 fullX = sprite->x + sprite->x2; + u32 speed; + + switch (sState) + { + case APU_STATE_SLIDE_IN: { - if (sprite->tIsMain && ++sprite->tFrames == 4) + const s16 (*coords)[2] = IsDoubleBattle() ? sAbilityPopUpCoordsDoubles : sAbilityPopUpCoordsSingles; + u32 xCoord = coords[battlerPosition][0]; + + if (sIsMain && ++sTimer == 4) PlaySE(SE_BALL_TRAY_ENTER); - if ((!sprite->tRightToLeft && (sprite->x -= 4) <= sprite->tOriginalX) - || (sprite->tRightToLeft && (sprite->x += 4) >= sprite->tOriginalX) - ) - { - sprite->x = sprite->tOriginalX; - sprite->tHide = TRUE; - sprite->tFrames = FRAMES_TO_WAIT; - } + + if (!sIsMain) + xCoord += ABILITY_POP_UP_POS_X_DIFF; + + if (fullX == xCoord) + { + sTimer = ABILITY_POP_UP_WAIT_FRAMES; + sState = APU_STATE_IDLE; + break; + } + + speed = sIsPlayerSide ? ABILITY_POP_UP_POS_X_SPEED : -ABILITY_POP_UP_POS_X_SPEED; + sprite->x2 += speed; + break; } - else // Hide + case APU_STATE_IDLE: { - if (sprite->tFrames == 0) + if (!sTimer || sAutoDestroy) { - if ((!sprite->tRightToLeft && (sprite->x += 4) >= sprite->tOriginalX + ABILITY_POP_UP_POS_X_SLIDE) - ||(sprite->tRightToLeft && (sprite->x -= 4) <= sprite->tOriginalX - ABILITY_POP_UP_POS_X_SLIDE) - ) - { - gBattleStruct->battlerState[sprite->tBattlerId].activeAbilityPopUps = FALSE; - DestroySprite(sprite); - } - } - else - { - if (!gBattleScripting.fixedPopup) - sprite->tFrames--; + sState = APU_STATE_SLIDE_OUT; + break; } + + if (!gBattleScripting.fixedPopup) + sTimer--; + + break; + } + case APU_STATE_SLIDE_OUT: + { + if (fullX == sprite->x) + { + sState = APU_STATE_END; + break; + } + + speed = sIsPlayerSide ? -ABILITY_POP_UP_POS_X_SPEED : ABILITY_POP_UP_POS_X_SPEED; + sprite->x2 += speed; + break; + } + case APU_STATE_END: + { + if (sIsMain) + gBattleStruct->battlerState[sBattlerId].activeAbilityPopUps = FALSE; + + DestroySprite(sprite); + break; + } } } @@ -2851,26 +2773,33 @@ void DestroyAbilityPopUp(u8 battler) { if (gBattleStruct->battlerState[battler].activeAbilityPopUps) { - gSprites[gBattleStruct->abilityPopUpSpriteIds[battler][0]].tFrames = 0; - gSprites[gBattleStruct->abilityPopUpSpriteIds[battler][1]].tFrames = 0; + gSprites[gBattleStruct->abilityPopUpSpriteIds[battler][0]].sAutoDestroy = TRUE; + gSprites[gBattleStruct->abilityPopUpSpriteIds[battler][1]].sAutoDestroy = TRUE; } - gBattleScripting.fixedPopup = FALSE; } static void Task_FreeAbilityPopUpGfx(u8 taskId) { - if (!gSprites[gTasks[taskId].tSpriteId1].inUse - && !gSprites[gTasks[taskId].tSpriteId2].inUse - && !IsAnyAbilityPopUpActive()) + if (!IsAnyAbilityPopUpActive()) { - FreeSpriteTilesByTag(ABILITY_POP_UP_TAG); - FreeSpritePaletteByTag(ABILITY_POP_UP_TAG); + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (IndexOfSpriteTileTag(TAG_ABILITY_POP_UP_PLAYER1 + battler) != 0xFF) + FreeSpriteTilesByTag(TAG_ABILITY_POP_UP_PLAYER1 + battler); + } + FreeSpritePaletteByTag(TAG_ABILITY_POP_UP); DestroyTask(taskId); } } +#undef sState +#undef sAutoDestroy +#undef sTimer +#undef sIsPlayerSide +#undef sBattlerId +#undef sIsMain + // last used ball -#define LAST_BALL_WINDOW_TAG 0xD721 static const struct OamData sOamData_LastUsedBall = { @@ -2891,8 +2820,8 @@ static const struct OamData sOamData_LastUsedBall = static const struct SpriteTemplate sSpriteTemplate_LastUsedBallWindow = { - .tileTag = LAST_BALL_WINDOW_TAG, - .paletteTag = ABILITY_POP_UP_TAG, + .tileTag = TAG_LAST_BALL_WINDOW, + .paletteTag = TAG_ABILITY_POP_UP, .oam = &sOamData_LastUsedBall, .anims = gDummySpriteAnimTable, .images = NULL, @@ -2922,7 +2851,7 @@ static const struct OamData sOamData_MoveInfoWindow = static const struct SpriteTemplate sSpriteTemplate_MoveInfoWindow = { .tileTag = MOVE_INFO_WINDOW_TAG, - .paletteTag = ABILITY_POP_UP_TAG, + .paletteTag = TAG_ABILITY_POP_UP, .oam = &sOamData_MoveInfoWindow, .anims = gDummySpriteAnimTable, .images = NULL, @@ -2941,7 +2870,7 @@ static const struct SpriteTemplate sSpriteTemplate_MoveInfoWindow = #endif static const struct SpriteSheet sSpriteSheet_LastUsedBallWindow = { - sLastUsedBallWindowGfx, sizeof(sLastUsedBallWindowGfx), LAST_BALL_WINDOW_TAG + sLastUsedBallWindowGfx, sizeof(sLastUsedBallWindowGfx), TAG_LAST_BALL_WINDOW }; #if B_MOVE_DESCRIPTION_BUTTON == R_BUTTON @@ -2997,9 +2926,9 @@ void TryAddLastUsedBallItemSprites(void) u16 firstBall; // we have to compact the bag first bc it is typically only compacted when you open it - CompactItemsInBagPocket(&gBagPockets[BALLS_POCKET]); + CompactItemsInBagPocket(POCKET_POKE_BALLS); - firstBall = gBagPockets[BALLS_POCKET].itemSlots[0].itemId; + firstBall = GetBagItemId(POCKET_POKE_BALLS, 0); if (firstBall > ITEM_NONE) gBallToDisplay = firstBall; } @@ -3020,7 +2949,7 @@ void TryAddLastUsedBallItemSprites(void) // window LoadSpritePalette(&sSpritePalette_AbilityPopUp); - if (GetSpriteTileStartByTag(LAST_BALL_WINDOW_TAG) == 0xFFFF) + if (GetSpriteTileStartByTag(TAG_LAST_BALL_WINDOW) == 0xFFFF) LoadSpriteSheet(&sSpriteSheet_LastUsedBallWindow); if (gBattleStruct->ballSpriteIds[1] == MAX_SPRITES) @@ -3038,8 +2967,9 @@ void TryAddLastUsedBallItemSprites(void) static void DestroyLastUsedBallWinGfx(struct Sprite *sprite) { - FreeSpriteTilesByTag(LAST_BALL_WINDOW_TAG); - FreeSpritePaletteByTag(ABILITY_POP_UP_TAG); + FreeSpriteTilesByTag(TAG_LAST_BALL_WINDOW); + if (GetSpriteTileStartByTag(MOVE_INFO_WINDOW_TAG) == 0xFFFF) + FreeSpritePaletteByTag(TAG_ABILITY_POP_UP); DestroySprite(sprite); gBattleStruct->ballSpriteIds[1] = MAX_SPRITES; } @@ -3076,7 +3006,8 @@ void TryToHideMoveInfoWindow(void) static void DestroyMoveInfoWinGfx(struct Sprite *sprite) { FreeSpriteTilesByTag(MOVE_INFO_WINDOW_TAG); - FreeSpritePaletteByTag(ABILITY_POP_UP_TAG); + if (GetSpriteTileStartByTag(TAG_LAST_BALL_WINDOW) == 0xFFFF) + FreeSpritePaletteByTag(TAG_ABILITY_POP_UP); DestroySprite(sprite); gBattleStruct->moveInfoSpriteId = MAX_SPRITES; } diff --git a/src/battle_intro.c b/src/battle_intro.c index 5239a815759a..ebc737dac150 100644 --- a/src/battle_intro.c +++ b/src/battle_intro.c @@ -125,6 +125,9 @@ void HandleIntroSlide(u8 environment) } else { + if (environment >= NELEMS(sBattleIntroSlideFuncs) + || sBattleIntroSlideFuncs[environment] == NULL) + environment = BATTLE_ENVIRONMENT_PLAIN; taskId = CreateTask(sBattleIntroSlideFuncs[environment], 0); } diff --git a/src/battle_main.c b/src/battle_main.c index fc7304b1a314..787e05608ed4 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -6,6 +6,7 @@ #include "battle_arena.h" #include "battle_controllers.h" #include "battle_end_turn.h" +#include "battle_hold_effects.h" #include "battle_interface.h" #include "battle_main.h" #include "battle_message.h" @@ -13,7 +14,6 @@ #include "battle_scripts.h" #include "battle_setup.h" #include "battle_tower.h" -#include "battle_util.h" #include "battle_z_move.h" #include "battle_gimmick.h" #include "berry.h" @@ -53,6 +53,7 @@ #include "string_util.h" #include "strings.h" #include "task.h" +#include "test/battle.h" #include "test_runner.h" #include "text.h" #include "trainer_pools.h" @@ -66,7 +67,6 @@ #include "constants/battle_move_effects.h" #include "constants/battle_string_ids.h" #include "constants/battle_partner.h" -#include "constants/hold_effects.h" #include "constants/items.h" #include "constants/moves.h" #include "constants/party_menu.h" @@ -76,6 +76,7 @@ #include "constants/trainers.h" #include "constants/weather.h" #include "cable_club.h" +#include "test/test_runner_battle.h" extern const struct BgTemplate gBattleBgTemplates[]; extern const struct WindowTemplate *const gBattleWindowTemplates[]; @@ -112,7 +113,7 @@ static void SetActionsAndBattlersTurnOrder(void); static void UpdateBattlerPartyOrdersOnSwitch(u32 battler); static bool8 AllAtActionConfirmed(void); static void TryChangeTurnOrder(void); -static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2, u32 *quickClawRandom, u32 *quickDrawRandom); +static void TryChangingTurnOrderEffects(struct BattleContext *ctx, u32 *quickClawRandom, u32 *quickDrawRandom); static void CheckChangingTurnOrderEffects(void); static void FreeResetData_ReturnToOvOrDoEvolutions(void); static void ReturnFromBattleToOverworld(void); @@ -167,7 +168,7 @@ EWRAM_DATA u16 gChosenMove = 0; EWRAM_DATA u16 gCalledMove = 0; EWRAM_DATA s32 gBideDmg[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gLastUsedItem = 0; -EWRAM_DATA u16 gLastUsedAbility = 0; +EWRAM_DATA enum Ability gLastUsedAbility = 0; EWRAM_DATA u8 gBattlerAttacker = 0; EWRAM_DATA u8 gBattlerTarget = 0; EWRAM_DATA u8 gBattlerFainted = 0; @@ -193,8 +194,6 @@ EWRAM_DATA u32 gHitMarker = 0; EWRAM_DATA u8 gBideTarget[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u32 gSideStatuses[NUM_BATTLE_SIDES] = {0}; EWRAM_DATA struct SideTimer gSideTimers[NUM_BATTLE_SIDES] = {0}; -EWRAM_DATA u32 gStatuses3[MAX_BATTLERS_COUNT] = {0}; -EWRAM_DATA u32 gStatuses4[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gPauseCounterBattle = 0; EWRAM_DATA u16 gPaydayMoney = 0; @@ -238,7 +237,7 @@ EWRAM_DATA u16 gBattleTurnCounter = 0; EWRAM_DATA u8 gBattlerAbility = 0; EWRAM_DATA struct QueuedStatBoost gQueuedStatBoosts[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA bool8 gHasFetchedBall = FALSE; -EWRAM_DATA u8 gLastUsedBall = 0; +EWRAM_DATA u16 gLastUsedBall = 0; EWRAM_DATA u16 gLastThrownBall = 0; EWRAM_DATA u16 gBallToDisplay = 0; EWRAM_DATA bool8 gLastUsedBallMenuPresent = FALSE; @@ -246,7 +245,7 @@ EWRAM_DATA u8 gPartyCriticalHits[PARTY_SIZE] = {0}; EWRAM_DATA static u8 sTriedEvolving = 0; EWRAM_DATA u8 gCategoryIconSpriteId = 0; -COMMON_DATA void (*gPreBattleCallback1)(void) = NULL; +COMMON_DATA MainCallback gPreBattleCallback1 = NULL; COMMON_DATA void (*gBattleMainFunc)(void) = NULL; COMMON_DATA struct BattleResults gBattleResults = {0}; COMMON_DATA u8 gLeveledUpInBattle = 0; @@ -306,7 +305,7 @@ const struct TrainerClass gTrainerClasses[TRAINER_CLASS_COUNT] = { [TRAINER_CLASS_PKMN_TRAINER_1] = { _("{PKMN} TRAINER") }, [TRAINER_CLASS_PKMN_TRAINER_2] = { _("{PKMN} TRAINER") }, - [TRAINER_CLASS_HIKER] = { _("HIKER"), 10 }, + [TRAINER_CLASS_HIKER] = { _("HIKER"), 10, B_TRAINER_CLASS_POKE_BALLS >= GEN_8 ? BALL_ULTRA : BALL_POKE }, [TRAINER_CLASS_TEAM_AQUA] = { _("TEAM AQUA") }, [TRAINER_CLASS_PKMN_BREEDER] = { _("{PKMN} BREEDER"), 10, B_TRAINER_CLASS_POKE_BALLS >= GEN_8 ? BALL_HEAL : BALL_FRIEND }, [TRAINER_CLASS_COOLTRAINER] = { _("COOLTRAINER"), 12, BALL_ULTRA }, @@ -325,7 +324,7 @@ const struct TrainerClass gTrainerClasses[TRAINER_CLASS_COUNT] = [TRAINER_CLASS_TUBER_F] = { _("TUBER"), 1 }, [TRAINER_CLASS_TUBER_M] = { _("TUBER"), 1 }, [TRAINER_CLASS_LADY] = { _("LADY"), 50 }, - [TRAINER_CLASS_BEAUTY] = { _("BEAUTY"), 20 }, + [TRAINER_CLASS_BEAUTY] = { _("BEAUTY"), 20, B_TRAINER_CLASS_POKE_BALLS >= GEN_8 ? BALL_GREAT : BALL_POKE }, [TRAINER_CLASS_RICH_BOY] = { _("RICH BOY"), 50 }, [TRAINER_CLASS_POKEMANIAC] = { _("POKΓ©MANIAC"), 15 }, [TRAINER_CLASS_GUITARIST] = { _("GUITARIST"), 8 }, @@ -336,13 +335,13 @@ const struct TrainerClass gTrainerClasses[TRAINER_CLASS_COUNT] = [TRAINER_CLASS_PSYCHIC] = { _("PSYCHIC"), 6 }, [TRAINER_CLASS_GENTLEMAN] = { _("GENTLEMAN"), 20, BALL_LUXURY }, [TRAINER_CLASS_ELITE_FOUR] = { _("ELITE FOUR"), 25, BALL_ULTRA }, - [TRAINER_CLASS_LEADER] = { _("LEADER"), 25 }, + [TRAINER_CLASS_LEADER] = { _("LEADER"), 25, B_TRAINER_CLASS_POKE_BALLS >= GEN_8 ? BALL_ULTRA : BALL_POKE }, [TRAINER_CLASS_SCHOOL_KID] = { _("SCHOOL KID") }, [TRAINER_CLASS_SR_AND_JR] = { _("SR. AND JR."), 4 }, [TRAINER_CLASS_WINSTRATE] = { _("WINSTRATE"), 10 }, [TRAINER_CLASS_POKEFAN] = { _("POKΓ©FAN"), 20 }, [TRAINER_CLASS_YOUNGSTER] = { _("YOUNGSTER"), 4 }, - [TRAINER_CLASS_CHAMPION] = { _("CHAMPION"), 50 }, + [TRAINER_CLASS_CHAMPION] = { _("CHAMPION"), 50, BALL_ULTRA }, [TRAINER_CLASS_FISHERMAN] = { _("FISHERMAN"), 10, B_TRAINER_CLASS_POKE_BALLS >= GEN_8 ? BALL_DIVE : BALL_LURE }, [TRAINER_CLASS_TRIATHLETE] = { _("TRIATHLETE"), 10 }, [TRAINER_CLASS_DRAGON_TAMER] = { _("DRAGON TAMER"), 12 }, @@ -362,7 +361,7 @@ const struct TrainerClass gTrainerClasses[TRAINER_CLASS_COUNT] = [TRAINER_CLASS_YOUNG_COUPLE] = { _("YOUNG COUPLE"), 8 }, [TRAINER_CLASS_OLD_COUPLE] = { _("OLD COUPLE"), 10 }, [TRAINER_CLASS_SIS_AND_BRO] = { _("SIS AND BRO"), 3 }, - [TRAINER_CLASS_SALON_MAIDEN] = { _("SALON MAIDEN") }, + [TRAINER_CLASS_SALON_MAIDEN] = { _("SALON MAIDEN"), 0, BALL_ULTRA }, [TRAINER_CLASS_DOME_ACE] = { _("DOME ACE") }, [TRAINER_CLASS_PALACE_MAVEN] = { _("PALACE MAVEN") }, [TRAINER_CLASS_ARENA_TYCOON] = { _("ARENA TYCOON") }, @@ -487,10 +486,9 @@ static void CB2_InitBattleInternal(void) else { gBattle_WIN0V = WIN_RANGE(DISPLAY_HEIGHT / 2, DISPLAY_HEIGHT / 2 + 1); + ScanlineEffect_Clear(); if (B_FAST_INTRO_NO_SLIDE == FALSE && !gTestRunnerHeadless) { - ScanlineEffect_Clear(); - for (i = 0; i < DISPLAY_HEIGHT / 2; i++) { gScanlineEffectRegBuffers[0][i] = 0xF0; @@ -523,6 +521,8 @@ static void CB2_InitBattleInternal(void) } if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) gBattleEnvironment = BATTLE_ENVIRONMENT_BUILDING; + if (TestRunner_Battle_GetForcedEnvironment()) + gBattleEnvironment = TestRunner_Battle_GetForcedEnvironment() - 1; if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && !(gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_EREADER_TRAINER @@ -550,9 +550,9 @@ static void CB2_InitBattleInternal(void) SetVBlankCallback(VBlankCB_Battle); SetUpBattleVarsAndBirchZigzagoon(); - if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) - SetMainCallback2(CB2_HandleStartMultiPartnerBattle); - else if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + if ((IsMultibattleTest() && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + || (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + || (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)) SetMainCallback2(CB2_HandleStartMultiPartnerBattle); else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) SetMainCallback2(CB2_HandleStartMultiBattle); @@ -1987,7 +1987,7 @@ u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer } if (partyData[monIndex].isShiny) { - u32 data = TRUE; + bool32 data = TRUE; SetMonData(&party[i], MON_DATA_IS_SHINY, &data); } if (partyData[monIndex].dynamaxLevel > 0) @@ -2005,7 +2005,7 @@ u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer if (partyData[monIndex].teraType > 0) { gBattleStruct->opponentMonCanTera |= 1 << i; - u32 data = partyData[monIndex].teraType; + enum Type data = partyData[monIndex].teraType; SetMonData(&party[i], MON_DATA_TERA_TYPE, &data); } CalculateMonStats(&party[i]); @@ -2026,7 +2026,24 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir u8 retVal; if (trainerNum == TRAINER_SECRET_BASE) return 0; - retVal = CreateNPCTrainerPartyFromTrainer(party, GetTrainerStructFromId(trainerNum), firstTrainer, gBattleTypeFlags); + if (GetTrainerStructFromId(trainerNum)->overrideTrainer) + { + struct Trainer tempTrainer; + memcpy(&tempTrainer, GetTrainerStructFromId(trainerNum), sizeof(struct Trainer)); + const struct Trainer *origTrainer = GetTrainerStructFromId(tempTrainer.overrideTrainer); + + tempTrainer.party = origTrainer->party; + + tempTrainer.poolSize = origTrainer->poolSize; + if (tempTrainer.partySize == 0) + tempTrainer.partySize = origTrainer->partySize; + + retVal = CreateNPCTrainerPartyFromTrainer(party, (const struct Trainer *)(&tempTrainer), firstTrainer, gBattleTypeFlags); + } + else + { + retVal = CreateNPCTrainerPartyFromTrainer(party, GetTrainerStructFromId(trainerNum), firstTrainer, gBattleTypeFlags); + } return retVal; } @@ -2967,7 +2984,7 @@ void BeginBattleIntro(void) { BattleStartClearSetData(); gBattleCommunication[1] = 0; - gBattleStruct->introState = 0; + gBattleStruct->eventState.battleIntro = 0; gBattleMainFunc = DoBattleIntro; } @@ -2988,8 +3005,11 @@ static void ClearSetBScriptingStruct(void) memset(&gBattleScripting, 0, sizeof(gBattleScripting)); gBattleScripting.windowsType = temp; - gBattleScripting.battleStyle = gSaveBlock2Ptr->optionsBattleStyle; - gBattleScripting.expOnCatch = (B_EXP_CATCH >= GEN_6); + if (TESTING) + gBattleScripting.battleStyle = OPTIONS_BATTLE_STYLE_SET; + else + gBattleScripting.battleStyle = gSaveBlock2Ptr->optionsBattleStyle; + gBattleScripting.expOnCatch = (GetConfig(CONFIG_EXP_CATCH) >= GEN_6); gBattleScripting.specialTrainerBattleType = specialBattleType; } @@ -2998,7 +3018,7 @@ static void BattleStartClearSetData(void) s32 i; TurnValuesCleanUp(FALSE); - SpecialStatusesClear(); + memset(&gSpecialStatuses, 0, sizeof(gSpecialStatuses)); memset(&gDisableStructs, 0, sizeof(gDisableStructs)); memset(&gFieldTimers, 0, sizeof(gFieldTimers)); @@ -3010,8 +3030,6 @@ static void BattleStartClearSetData(void) for (i = 0; i < MAX_BATTLERS_COUNT; i++) { - gStatuses3[i] = 0; - gStatuses4[i] = 0; gDisableStructs[i].isFirstTurn = 2; gLastMoves[i] = MOVE_NONE; gLastLandedMoves[i] = MOVE_NONE; @@ -3090,13 +3108,12 @@ static void BattleStartClearSetData(void) { gSideTimers[i].stickyWebBattlerId = 0xFF; } - gBattleStruct->appearedInBattle = 0; gBattleStruct->beatUpSlot = 0; for (i = 0; i < PARTY_SIZE; i++) { - gBattleStruct->usedHeldItems[i][B_SIDE_PLAYER] = 0; - gBattleStruct->usedHeldItems[i][B_SIDE_OPPONENT] = 0; + gBattleStruct->partyState[B_SIDE_PLAYER][i].usedHeldItem = ITEM_NONE; + gBattleStruct->partyState[B_SIDE_OPPONENT][i].usedHeldItem = ITEM_NONE; gBattleStruct->itemLost[B_SIDE_PLAYER][i].originalItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); gBattleStruct->itemLost[B_SIDE_OPPONENT][i].originalItem = GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM); gPartyCriticalHits[i] = 0; @@ -3117,7 +3134,9 @@ static void BattleStartClearSetData(void) } } -void SwitchInClearSetData(u32 battler) +#define UNPACK_VOLATILE_BATON_PASSABLES(_enum, _fieldName, _typeMaxValue, ...) __VA_OPT__(if ((FIRST(__VA_ARGS__)) & V_BATON_PASSABLE) gBattleMons[battler].volatiles._fieldName = volatilesCopy->_fieldName;) + +void SwitchInClearSetData(u32 battler, struct Volatiles *volatilesCopy) { s32 i; enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove); @@ -3130,50 +3149,52 @@ void SwitchInClearSetData(u32 battler) gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE; for (i = 0; i < gBattlersCount; i++) { - if ((gBattleMons[i].status2 & STATUS2_ESCAPE_PREVENTION) && gDisableStructs[i].battlerPreventingEscape == battler) - gBattleMons[i].status2 &= ~STATUS2_ESCAPE_PREVENTION; - if ((gStatuses3[i] & STATUS3_ALWAYS_HITS) && gDisableStructs[i].battlerWithSureHit == battler) + if (gBattleMons[i].volatiles.escapePrevention && gDisableStructs[i].battlerPreventingEscape == battler) + gBattleMons[i].volatiles.escapePrevention = FALSE; + if (gBattleMons[i].volatiles.lockOn && gDisableStructs[i].battlerWithSureHit == battler) { - gStatuses3[i] &= ~STATUS3_ALWAYS_HITS; + gBattleMons[i].volatiles.lockOn = 0; gDisableStructs[i].battlerWithSureHit = 0; } } } + + // Clear volatiles - reapply some if Baton Pass was used + memset(&gBattleMons[battler].volatiles, 0, sizeof(struct Volatiles)); if (effect == EFFECT_BATON_PASS) { - gBattleMons[battler].status2 &= (STATUS2_CONFUSION | STATUS2_FOCUS_ENERGY_ANY | STATUS2_SUBSTITUTE | STATUS2_ESCAPE_PREVENTION | STATUS2_CURSED); - gStatuses3[battler] &= (STATUS3_LEECHSEED_BATTLER | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED - | STATUS3_GASTRO_ACID | STATUS3_EMBARGO | STATUS3_TELEKINESIS | STATUS3_MAGNET_RISE | STATUS3_HEAL_BLOCK - | STATUS3_AQUA_RING | STATUS3_POWER_TRICK); - gStatuses4[battler] &= (STATUS4_MUD_SPORT | STATUS4_WATER_SPORT | STATUS4_INFINITE_CONFUSION); + // Transfer Baton Passable volatile statuses + VOLATILE_DEFINITIONS(UNPACK_VOLATILE_BATON_PASSABLES) + /* Expands to the following (compiler removes `if` statements): + * gBattleMons[battler].volatiles.confusionTurns = volatilesCopy->confusionTurns; + * gBattleMons[battler].volatiles.substitute = volatilesCopy->substitute; + * gBattleMons[battler].volatiles.escapePrevention = volatilesCopy->escapePrevention; + * ...etc + */ + for (i = 0; i < gBattlersCount; i++) { if (!IsBattlerAlly(battler, i) - && (gStatuses3[i] & STATUS3_ALWAYS_HITS) != 0 + && gBattleMons[i].volatiles.lockOn != 0 && (gDisableStructs[i].battlerWithSureHit == battler)) { - gStatuses3[i] &= ~STATUS3_ALWAYS_HITS; - gStatuses3[i] |= STATUS3_ALWAYS_HITS_TURN(2); + gBattleMons[i].volatiles.lockOn = 0; } } - if (gStatuses3[battler] & STATUS3_POWER_TRICK) + if (gBattleMons[battler].volatiles.powerTrick) SWAP(gBattleMons[battler].attack, gBattleMons[battler].defense, i); } - else - { - gBattleMons[battler].status2 = 0; - gStatuses3[battler] = 0; - gStatuses4[battler] = 0; - } for (i = 0; i < gBattlersCount; i++) { - if (gBattleMons[i].status2 & STATUS2_INFATUATED_WITH(battler)) - gBattleMons[i].status2 &= ~STATUS2_INFATUATED_WITH(battler); - if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && gBattleStruct->wrappedBy[i] == battler) - gBattleMons[i].status2 &= ~STATUS2_WRAPPED; - if ((gStatuses4[i] & STATUS4_SYRUP_BOMB) && gBattleStruct->stickySyrupdBy[i] == battler) - gStatuses4[i] &= ~STATUS4_SYRUP_BOMB; + if (gBattleMons[i].volatiles.infatuation == INFATUATED_WITH(battler)) + gBattleMons[i].volatiles.infatuation = 0; + if (gBattleMons[i].volatiles.wrapped && gBattleMons[i].volatiles.wrappedBy == battler) + gBattleMons[i].volatiles.wrapped = FALSE; + if (gBattleMons[i].volatiles.syrupBomb && gBattleMons[i].volatiles.stickySyrupedBy == battler) + gBattleMons[i].volatiles.syrupBomb = FALSE; + if (gDisableStructs[i].octolock && gDisableStructs[i].octolockedBy == battler) + gDisableStructs[i].octolock = FALSE; } gActionSelectionCursor[battler] = 0; @@ -3181,6 +3202,9 @@ void SwitchInClearSetData(u32 battler) memset(&gDisableStructs[battler], 0, sizeof(struct DisableStruct)); + if (GetProtectType(gProtectStructs[battler].protected) == PROTECT_TYPE_SINGLE) // Side type protects expire at the end of the turn + gProtectStructs[battler].protected = PROTECT_NONE; + if (effect == EFFECT_BATON_PASS) { gDisableStructs[battler].substituteHP = disableStructCopy.substituteHP; @@ -3192,7 +3216,7 @@ void SwitchInClearSetData(u32 battler) } else if (effect == EFFECT_SHED_TAIL) { - gBattleMons[battler].status2 |= STATUS2_SUBSTITUTE; + gBattleMons[battler].volatiles.substitute = TRUE; gDisableStructs[battler].substituteHP = disableStructCopy.substituteHP; } @@ -3208,7 +3232,7 @@ void SwitchInClearSetData(u32 battler) gLastHitBy[battler] = 0xFF; gBattleStruct->lastTakenMove[battler] = 0; - gBattleStruct->sameMoveTurns[battler] = 0; + gBattleStruct->metronomeItemCounter[battler] = 0; gBattleStruct->lastTakenMoveFrom[battler][0] = 0; gBattleStruct->lastTakenMoveFrom[battler][1] = 0; gBattleStruct->lastTakenMoveFrom[battler][2] = 0; @@ -3216,6 +3240,10 @@ void SwitchInClearSetData(u32 battler) gBattleStruct->battlerState[battler].stompingTantrumTimer = 0; gBattleStruct->palaceFlags &= ~(1u << battler); gBattleStruct->battlerState[battler].canPickupItem = FALSE; + gBattleStruct->battlerState[battler].wasAboveHalfHp = gBattleMons[battler].hp > gBattleMons[battler].maxHP / 2; + gBattleStruct->hazardsCounter = 0; + gDisableStructs[battler].hazardsDone = FALSE; + gSpecialStatuses[battler].switchInItemDone = FALSE; ClearPursuitValuesIfSet(battler); @@ -3235,8 +3263,7 @@ void SwitchInClearSetData(u32 battler) } gBattleStruct->choicedMove[battler] = MOVE_NONE; - gCurrentMove = MOVE_NONE; - gBattleStruct->arenaTurnCounter = 0xFF; + gBattleStruct->eventState.arenaTurn = 0xFF; // Restore struct member so replacement does not miss timing gSpecialStatuses[battler].switchInAbilityDone = FALSE; @@ -3250,9 +3277,6 @@ void SwitchInClearSetData(u32 battler) gAiLogicData->ejectButtonSwitch = FALSE; gAiLogicData->ejectPackSwitch = FALSE; - // Reset G-Max Chi Strike boosts. - gBattleStruct->bonusCritStages[battler] = 0; - // Clear selected party ID so Revival Blessing doesn't get confused. gSelectedMonPartyId = PARTY_SIZE; @@ -3263,7 +3287,7 @@ void SwitchInClearSetData(u32 battler) u32 side = GetBattlerSide(battler); u32 partyIndex = gBattlerPartyIndexes[battler]; if (TestRunner_Battle_GetForcedAbility(side, partyIndex)) - gBattleMons[i].ability = gDisableStructs[i].overwrittenAbility = TestRunner_Battle_GetForcedAbility(side, partyIndex); + gBattleMons[i].ability = TestRunner_Battle_GetForcedAbility(side, partyIndex); } #endif // TESTING @@ -3278,20 +3302,22 @@ const u8* FaintClearSetData(u32 battler) for (i = 0; i < NUM_BATTLE_STATS; i++) gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE; - gBattleMons[battler].status2 = 0; - gStatuses3[battler] &= STATUS3_GASTRO_ACID; // Edge case: Keep Gastro Acid if pokemon's ability can have effect after fainting, for example Innards Out. - gStatuses4[battler] = 0; + bool32 keepGastroAcid = gBattleMons[battler].volatiles.gastroAcid; + memset(&gBattleMons[battler].volatiles, 0, sizeof(struct Volatiles)); + gBattleMons[battler].volatiles.gastroAcid = keepGastroAcid; // Edge case: Keep Gastro Acid if pokemon's ability can have effect after fainting, for example Innards Out. for (i = 0; i < gBattlersCount; i++) { - if ((gBattleMons[i].status2 & STATUS2_ESCAPE_PREVENTION) && gDisableStructs[i].battlerPreventingEscape == battler) - gBattleMons[i].status2 &= ~STATUS2_ESCAPE_PREVENTION; - if (gBattleMons[i].status2 & STATUS2_INFATUATED_WITH(battler)) - gBattleMons[i].status2 &= ~STATUS2_INFATUATED_WITH(battler); - if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && gBattleStruct->wrappedBy[i] == battler) - gBattleMons[i].status2 &= ~STATUS2_WRAPPED; - if ((gStatuses4[i] & STATUS4_SYRUP_BOMB) && gBattleStruct->stickySyrupdBy[i] == battler) - gStatuses4[i] &= ~STATUS4_SYRUP_BOMB; + if (gBattleMons[i].volatiles.escapePrevention && gDisableStructs[i].battlerPreventingEscape == battler) + gBattleMons[i].volatiles.escapePrevention = FALSE; + if (gBattleMons[i].volatiles.infatuation == INFATUATED_WITH(battler)) + gBattleMons[i].volatiles.infatuation = 0; + if (gBattleMons[i].volatiles.wrapped && gBattleMons[i].volatiles.wrappedBy == battler) + gBattleMons[i].volatiles.wrapped = FALSE; + if (gBattleMons[i].volatiles.syrupBomb && gBattleMons[i].volatiles.stickySyrupedBy == battler) + gBattleMons[i].volatiles.syrupBomb = FALSE; + if (gDisableStructs[i].octolock && gDisableStructs[i].octolockedBy == battler) + gDisableStructs[i].octolock = FALSE; } gActionSelectionCursor[battler] = 0; @@ -3303,9 +3329,8 @@ const u8* FaintClearSetData(u32 battler) gProtectStructs[battler].protected = PROTECT_NONE; gProtectStructs[battler].quash = FALSE; - gProtectStructs[battler].endured = FALSE; gProtectStructs[battler].noValidMoves = FALSE; - gProtectStructs[battler].helpingHand = FALSE; + gProtectStructs[battler].helpingHand = 0; gProtectStructs[battler].bounceMove = FALSE; gProtectStructs[battler].stealMove = FALSE; gProtectStructs[battler].nonVolatileStatusImmobility = FALSE; @@ -3313,9 +3338,7 @@ const u8* FaintClearSetData(u32 battler) gProtectStructs[battler].confusionSelfDmg = FALSE; gProtectStructs[battler].chargingTurn = FALSE; gProtectStructs[battler].fleeType = 0; - gProtectStructs[battler].notFirstStrike = FALSE; gProtectStructs[battler].statRaised = FALSE; - gProtectStructs[battler].statFell = FALSE; gProtectStructs[battler].pranksterElevated = FALSE; gDisableStructs[battler].isFirstTurn = 2; @@ -3329,7 +3352,7 @@ const u8* FaintClearSetData(u32 battler) gLastHitBy[battler] = 0xFF; gBattleStruct->choicedMove[battler] = MOVE_NONE; - gBattleStruct->sameMoveTurns[battler] = 0; + gBattleStruct->metronomeItemCounter[battler] = 0; gBattleStruct->lastTakenMove[battler] = MOVE_NONE; gBattleStruct->lastTakenMoveFrom[battler][0] = 0; gBattleStruct->lastTakenMoveFrom[battler][1] = 0; @@ -3339,7 +3362,7 @@ const u8* FaintClearSetData(u32 battler) ClearPursuitValuesIfSet(battler); - if (gBattleStruct->commanderActive[battler] != SPECIES_NONE) + if (gBattleStruct->battlerState[battler].commanderSpecies != SPECIES_NONE) { u32 partner = BATTLE_PARTNER(battler); if (IsBattlerAlive(partner)) @@ -3364,8 +3387,8 @@ const u8* FaintClearSetData(u32 battler) gBattleStruct->lastTakenMoveFrom[i][battler] = 0; } - gBattleMons[battler].types[0] = gSpeciesInfo[gBattleMons[battler].species].types[0]; - gBattleMons[battler].types[1] = gSpeciesInfo[gBattleMons[battler].species].types[1]; + gBattleMons[battler].types[0] = GetSpeciesType(gBattleMons[battler].species, 0); + gBattleMons[battler].types[1] = GetSpeciesType(gBattleMons[battler].species, 1); gBattleMons[battler].types[2] = TYPE_MYSTERY; Ai_UpdateFaintData(battler); @@ -3382,27 +3405,28 @@ const u8* FaintClearSetData(u32 battler) gBattleStruct->skyDropTargets[otherSkyDropper] = SKY_DROP_NO_TARGET; // If the other Pokemon involved in this Sky Drop was the target, not the attacker - if (gStatuses3[otherSkyDropper] & STATUS3_SKY_DROPPED) + if (gBattleMons[otherSkyDropper].volatiles.semiInvulnerable == STATE_SKY_DROP) { // Release the target and take them out of the semi-invulnerable state - gStatuses3[otherSkyDropper] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); + gBattleMons[otherSkyDropper].volatiles.semiInvulnerable = STATE_NONE; // Make the target's sprite visible gSprites[gBattlerSpriteIds[otherSkyDropper]].invisible = FALSE; // If the target was sky dropped in the middle of using Outrage/Petal Dance/Thrash, // confuse them upon release and print "confused via fatigue" message and animation. - if (gBattleMons[otherSkyDropper].status2 & STATUS2_LOCK_CONFUSE) + if (gBattleMons[otherSkyDropper].volatiles.lockConfusionTurns) { - gBattleMons[otherSkyDropper].status2 &= ~(STATUS2_LOCK_CONFUSE); + gBattleMons[otherSkyDropper].volatiles.lockConfusionTurns = 0; // If the released mon can be confused, do so. // Don't use CanBeConfused here, since it can cause issues in edge cases. - if (!(GetBattlerAbility(otherSkyDropper) == ABILITY_OWN_TEMPO - || gBattleMons[otherSkyDropper].status2 & STATUS2_CONFUSION - || IsBattlerTerrainAffected(otherSkyDropper, STATUS_FIELD_MISTY_TERRAIN))) + enum Ability ability = GetBattlerAbility(otherSkyDropper); + if (!(ability == ABILITY_OWN_TEMPO + || gBattleMons[otherSkyDropper].volatiles.confusionTurns + || IsBattlerTerrainAffected(otherSkyDropper, ability, GetBattlerHoldEffect(otherSkyDropper), STATUS_FIELD_MISTY_TERRAIN))) { - gBattleMons[otherSkyDropper].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); + gBattleMons[otherSkyDropper].volatiles.confusionTurns = ((Random()) % 4) + 2; gBattlerAttacker = otherSkyDropper; result = BattleScript_ThrashConfuses; } @@ -3418,21 +3442,21 @@ static void DoBattleIntro(void) s32 i; u32 battler; - switch ((enum BattleIntroStates)gBattleStruct->introState) + switch ((enum BattleIntroStates)gBattleStruct->eventState.battleIntro) { case BATTLE_INTRO_STATE_GET_MON_DATA: battler = gBattleCommunication[1]; BtlController_EmitGetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_ALL_BATTLE, 0); MarkBattlerForControllerExec(battler); - gBattleStruct->introState++; + gBattleStruct->eventState.battleIntro++; break; case BATTLE_INTRO_STATE_LOOP_BATTLER_DATA: if (!gBattleControllerExecFlags) { if (++gBattleCommunication[1] == gBattlersCount) - gBattleStruct->introState++; + gBattleStruct->eventState.battleIntro++; else - gBattleStruct->introState = BATTLE_INTRO_STATE_GET_MON_DATA; + gBattleStruct->eventState.battleIntro = BATTLE_INTRO_STATE_GET_MON_DATA; } break; case BATTLE_INTRO_STATE_PREPARE_BG_SLIDE: @@ -3443,12 +3467,12 @@ static void DoBattleIntro(void) MarkBattlerForControllerExec(battler); gBattleCommunication[0] = 0; gBattleCommunication[1] = 0; - gBattleStruct->introState++; + gBattleStruct->eventState.battleIntro++; } break; case BATTLE_INTRO_STATE_WAIT_FOR_BG_SLIDE: if (!gBattleControllerExecFlags) - gBattleStruct->introState++; + gBattleStruct->eventState.battleIntro++; break; case BATTLE_INTRO_STATE_DRAW_SPRITES: for (battler = 0; battler < gBattlersCount; battler++) @@ -3460,12 +3484,12 @@ static void DoBattleIntro(void) else { memcpy(&gBattleMons[battler], &gBattleResources->bufferB[battler][4], sizeof(struct BattlePokemon)); - gBattleMons[battler].types[0] = gSpeciesInfo[gBattleMons[battler].species].types[0]; - gBattleMons[battler].types[1] = gSpeciesInfo[gBattleMons[battler].species].types[1]; + gBattleMons[battler].types[0] = GetSpeciesType(gBattleMons[battler].species, 0); + gBattleMons[battler].types[1] = GetSpeciesType(gBattleMons[battler].species, 1); gBattleMons[battler].types[2] = TYPE_MYSTERY; gBattleMons[battler].ability = GetAbilityBySpecies(gBattleMons[battler].species, gBattleMons[battler].abilityNum); gBattleStruct->hpOnSwitchout[GetBattlerSide(battler)] = gBattleMons[battler].hp; - gBattleMons[battler].status2 = 0; + memset(&gBattleMons[battler].volatiles, 0, sizeof(struct Volatiles)); for (i = 0; i < NUM_BATTLE_STATS; i++) gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE; #if TESTING @@ -3474,7 +3498,7 @@ static void DoBattleIntro(void) u32 side = GetBattlerSide(battler); u32 partyIndex = gBattlerPartyIndexes[battler]; if (TestRunner_Battle_GetForcedAbility(side, partyIndex)) - gBattleMons[battler].ability = gDisableStructs[battler].overwrittenAbility = TestRunner_Battle_GetForcedAbility(side, partyIndex); + gBattleMons[battler].ability = TestRunner_Battle_GetForcedAbility(side, partyIndex); } #endif } @@ -3529,9 +3553,9 @@ static void DoBattleIntro(void) } if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - gBattleStruct->introState++; + gBattleStruct->eventState.battleIntro++; else // Skip party summary since it is a wild battle. - gBattleStruct->introState = BATTLE_INTRO_STATE_INTRO_TEXT; + gBattleStruct->eventState.battleIntro = BATTLE_INTRO_STATE_INTRO_TEXT; break; case BATTLE_INTRO_STATE_DRAW_PARTY_SUMMARY: if (!gBattleControllerExecFlags) @@ -3576,18 +3600,18 @@ static void DoBattleIntro(void) BtlController_EmitDrawPartyStatusSummary(battler, B_COMM_TO_CONTROLLER, hpStatus, PARTY_SUMM_SKIP_DRAW_DELAY); MarkBattlerForControllerExec(battler); - gBattleStruct->introState++; + gBattleStruct->eventState.battleIntro++; } break; case BATTLE_INTRO_STATE_WAIT_FOR_PARTY_SUMMARY: if (!gBattleControllerExecFlags) - gBattleStruct->introState++; + gBattleStruct->eventState.battleIntro++; break; case BATTLE_INTRO_STATE_INTRO_TEXT: if (!IsBattlerMarkedForControllerExec(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT))) { PrepareStringBattle(STRINGID_INTROMSG, GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)); - gBattleStruct->introState++; + gBattleStruct->eventState.battleIntro++; } break; case BATTLE_INTRO_STATE_WAIT_FOR_INTRO_TEXT: @@ -3595,14 +3619,14 @@ static void DoBattleIntro(void) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - gBattleStruct->introState++; + gBattleStruct->eventState.battleIntro++; } else { if (B_FAST_INTRO_PKMN_TEXT == TRUE) - gBattleStruct->introState = BATTLE_INTRO_STATE_WAIT_FOR_WILD_BATTLE_TEXT; + gBattleStruct->eventState.battleIntro = BATTLE_INTRO_STATE_WAIT_FOR_WILD_BATTLE_TEXT; else - gBattleStruct->introState = BATTLE_INTRO_STATE_WAIT_FOR_TRAINER_2_SEND_OUT_ANIM; + gBattleStruct->eventState.battleIntro = BATTLE_INTRO_STATE_WAIT_FOR_TRAINER_2_SEND_OUT_ANIM; } } break; @@ -3611,11 +3635,11 @@ static void DoBattleIntro(void) PrepareStringBattle(STRINGID_INTROSENDOUT, GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)); else PrepareStringBattle(STRINGID_INTROSENDOUT, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)); - gBattleStruct->introState++; + gBattleStruct->eventState.battleIntro++; break; case BATTLE_INTRO_STATE_WAIT_FOR_TRAINER_SEND_OUT_TEXT: if (!gBattleControllerExecFlags) - gBattleStruct->introState++; + gBattleStruct->eventState.battleIntro++; break; case BATTLE_INTRO_STATE_TRAINER_1_SEND_OUT_ANIM: if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && !(gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER)) @@ -3625,7 +3649,7 @@ static void DoBattleIntro(void) BtlController_EmitIntroTrainerBallThrow(battler, B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(battler); - gBattleStruct->introState++; + gBattleStruct->eventState.battleIntro++; break; case BATTLE_INTRO_STATE_TRAINER_2_SEND_OUT_ANIM: if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS) && !BATTLE_TWO_VS_ONE_OPPONENT) @@ -3640,17 +3664,17 @@ static void DoBattleIntro(void) } if (B_FAST_INTRO_PKMN_TEXT == TRUE && !(gBattleTypeFlags & (BATTLE_TYPE_RECORDED | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_RECORDED_IS_MASTER | BATTLE_TYPE_LINK))) - gBattleStruct->introState = BATTLE_INTRO_STATE_WAIT_FOR_WILD_BATTLE_TEXT; // Print at the same time as trainer sends out second mon. + gBattleStruct->eventState.battleIntro = BATTLE_INTRO_STATE_WAIT_FOR_WILD_BATTLE_TEXT; // Print at the same time as trainer sends out second mon. else - gBattleStruct->introState++; + gBattleStruct->eventState.battleIntro++; break; case BATTLE_INTRO_STATE_WAIT_FOR_TRAINER_2_SEND_OUT_ANIM: if (!gBattleControllerExecFlags) - gBattleStruct->introState++; + gBattleStruct->eventState.battleIntro++; break; case BATTLE_INTRO_STATE_WAIT_FOR_WILD_BATTLE_TEXT: if (!IsBattlerMarkedForControllerExec(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT))) - gBattleStruct->introState++; + gBattleStruct->eventState.battleIntro++; break; case BATTLE_INTRO_STATE_PRINT_PLAYER_SEND_OUT_TEXT: if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) @@ -3671,7 +3695,7 @@ static void DoBattleIntro(void) PrepareStringBattle(STRINGID_INTROSENDOUT, battler); } - gBattleStruct->introState++; + gBattleStruct->eventState.battleIntro++; break; case BATTLE_INTRO_STATE_WAIT_FOR_PLAYER_SEND_OUT_TEXT: if (!(gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleControllerExecFlags)) @@ -3682,7 +3706,7 @@ static void DoBattleIntro(void) battler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); if (!IsBattlerMarkedForControllerExec(battler)) - gBattleStruct->introState++; + gBattleStruct->eventState.battleIntro++; } break; case BATTLE_INTRO_STATE_PRINT_PLAYER_1_SEND_OUT_TEXT: @@ -3693,7 +3717,7 @@ static void DoBattleIntro(void) BtlController_EmitIntroTrainerBallThrow(battler, B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(battler); - gBattleStruct->introState++; + gBattleStruct->eventState.battleIntro++; break; case BATTLE_INTRO_STATE_PRINT_PLAYER_2_SEND_OUT_TEXT: if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER)) @@ -3706,16 +3730,19 @@ static void DoBattleIntro(void) BtlController_EmitIntroTrainerBallThrow(battler, B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(battler); } - gBattleStruct->introState++; + gBattleStruct->eventState.battleIntro++; break; case BATTLE_INTRO_STATE_SET_DEX_AND_BATTLE_VARS: if (!gBattleControllerExecFlags) { - gBattleStruct->eventsBeforeFirstTurnState = 0; + gBattleStruct->eventState.beforeFristTurn = 0; gBattleStruct->switchInBattlerCounter = 0; - gBattleStruct->overworldWeatherDone = FALSE; Ai_InitPartyStruct(); // Save mons party counts, and first 2/4 mons on the battlefield. + // mark all battlers as sent out + for (battler = 0; battler < gBattlersCount; battler++) + GetBattlerPartyState(battler)->sentOut = TRUE; + // Try to set a status to start the battle with gBattleStruct->startingStatus = 0; if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && GetTrainerStartingStatusFromId(TRAINER_BATTLE_PARAM.opponentB)) @@ -3746,7 +3773,7 @@ static void TryDoEventsBeforeFirstTurn(void) if (gBattleControllerExecFlags) return; - switch ((enum FirstTurnEventsStates)gBattleStruct->eventsBeforeFirstTurnState) + switch (gBattleStruct->eventState.beforeFristTurn) { case FIRST_TURN_EVENTS_START: // Set invalid mons as absent(for example when starting a double battle with only one pokemon). @@ -3770,7 +3797,7 @@ static void TryDoEventsBeforeFirstTurn(void) u32 side = GetBattlerSide(i); u32 partyIndex = gBattlerPartyIndexes[i]; if (TestRunner_Battle_GetForcedAbility(side, partyIndex)) - gBattleMons[i].ability = gDisableStructs[i].overwrittenAbility = TestRunner_Battle_GetForcedAbility(side, partyIndex); + gBattleMons[i].ability = TestRunner_Battle_GetForcedAbility(side, partyIndex); } } #endif // TESTING @@ -3778,45 +3805,40 @@ static void TryDoEventsBeforeFirstTurn(void) gBattleStruct->speedTieBreaks = RandomUniform(RNG_SPEED_TIE, 0, Factorial(MAX_BATTLERS_COUNT) - 1); gBattleTurnCounter = 0; + struct BattleContext ctx = {0}; for (i = 0; i < gBattlersCount; i++) + { gBattlerByTurnOrder[i] = i; + ctx.abilities[i] = GetBattlerAbility(i); + ctx.holdEffects[i] = GetBattlerHoldEffect(i); + } for (i = 0; i < gBattlersCount - 1; i++) { for (j = i + 1; j < gBattlersCount; j++) { - if (GetWhichBattlerFaster(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], TRUE) == -1) + ctx.battlerAtk = gBattlerByTurnOrder[i]; + ctx.battlerDef = gBattlerByTurnOrder[j]; + + if (GetWhichBattlerFaster(&ctx, TRUE) == -1) SwapTurnOrder(i, j); } } - gBattleStruct->eventsBeforeFirstTurnState++; + gBattleStruct->eventState.beforeFristTurn++; break; case FIRST_TURN_EVENTS_OVERWORLD_WEATHER: - if (!gBattleStruct->overworldWeatherDone - && AbilityBattleEffects(ABILITYEFFECT_SWITCH_IN_WEATHER, 0, 0, ABILITYEFFECT_SWITCH_IN_WEATHER, 0) != 0) - { - gBattleStruct->overworldWeatherDone = TRUE; + gBattleStruct->eventState.beforeFristTurn++; + if (TryFieldEffects(FIELD_EFFECT_OVERWORLD_WEATHER)) return; - } - gBattleStruct->eventsBeforeFirstTurnState++; break; case FIRST_TURN_EVENTS_TERRAIN: - if (!gBattleStruct->terrainDone - && AbilityBattleEffects(ABILITYEFFECT_SWITCH_IN_TERRAIN, 0, 0, ABILITYEFFECT_SWITCH_IN_TERRAIN, 0) != 0) - { - gBattleStruct->terrainDone = TRUE; + gBattleStruct->eventState.beforeFristTurn++; + if (TryFieldEffects(FIELD_EFFECT_OVERWORLD_TERRAIN)) return; - } - gBattleStruct->eventsBeforeFirstTurnState++; break; case FIRST_TURN_EVENTS_STARTING_STATUS: - if (!gBattleStruct->startingStatusDone - && gBattleStruct->startingStatus - && AbilityBattleEffects(ABILITYEFFECT_SWITCH_IN_STATUSES, 0, 0, ABILITYEFFECT_SWITCH_IN_STATUSES, 0) != 0) - { - gBattleStruct->startingStatusDone = TRUE; + gBattleStruct->eventState.beforeFristTurn++; + if (TryFieldEffects(FIELD_EFFECT_TRAINER_STATUSES)) return; - } - gBattleStruct->eventsBeforeFirstTurnState++; break; case FIRST_TURN_EVENTS_TOTEM_BOOST: for (i = 0; i < gBattlersCount; i++) @@ -3829,46 +3851,79 @@ static void TryDoEventsBeforeFirstTurn(void) } } memset(gQueuedStatBoosts, 0, sizeof(gQueuedStatBoosts)); // erase all totem boosts for Mirror Herb and Opportunist - gBattleStruct->eventsBeforeFirstTurnState++; + gBattleStruct->eventState.beforeFristTurn++; break; case FIRST_TURN_EVENTS_NEUTRALIZING_GAS: - if (AbilityBattleEffects(ABILITYEFFECT_NEUTRALIZINGGAS, 0, 0, 0, 0) != 0) - return; - gBattleStruct->eventsBeforeFirstTurnState++; + while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest + { + i = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++]; + if (AbilityBattleEffects(ABILITYEFFECT_NEUTRALIZINGGAS_FIRST_TURN, i, 0, 0, 0) != 0) + return; + } + gBattleStruct->switchInBattlerCounter = 0; + gBattleStruct->eventState.beforeFristTurn++; break; case FIRST_TURN_EVENTS_SWITCH_IN_ABILITIES: while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest { - i = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++]; + u32 battler = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++]; - if (TryPrimalReversion(i)) + if (TryPrimalReversion(battler)) return; - if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, i, 0, 0, 0) != 0) + if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, battler, 0, 0, 0)) return; - if (TryClearIllusion(i, ABILITYEFFECT_ON_SWITCHIN)) + if (TryClearIllusion(battler, ABILITYEFFECT_ON_SWITCHIN)) + return; + if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES, battler, 0, 0, 0) != 0) return; } gBattleStruct->switchInBattlerCounter = 0; - gBattleStruct->eventsBeforeFirstTurnState++; - break; - case FIRST_TURN_EVENTS_OPPORTUNIST_1: - if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, 0, 0, 0, 0)) - return; - gBattleStruct->eventsBeforeFirstTurnState++; + gBattleStruct->eventState.beforeFristTurn++; break; case FIRST_TURN_EVENTS_ITEM_EFFECTS: while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest { - if (ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN, gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++], FALSE)) + u32 battler = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++]; + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsOnSwitchInFirstTurnActivation)) + return; + } + gBattleStruct->switchInBattlerCounter = 0; + gBattleStruct->eventState.beforeFristTurn++; + break; + case FIRST_TURN_EVENTS_WHITE_HERB: + while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest + { + u32 battler = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++]; + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsWhiteHerbFirstTurnActivation)) + return; + } + gBattleStruct->switchInBattlerCounter = 0; + gBattleStruct->eventState.beforeFristTurn++; + break; + case FIRST_TURN_EVENTS_OPPORTUNIST: + while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest + { + u32 battler = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++]; + if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST_FIRST_TURN, battler, GetBattlerAbility(battler), 0, 0)) + return; + } + gBattleStruct->switchInBattlerCounter = 0; + gBattleStruct->eventState.beforeFristTurn++; + break; + case FIRST_TURN_EVENTS_MIRROR_HERB: + while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest + { + u32 battler = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++]; + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsMirrorHerbFirstTurnActivation)) return; } gBattleStruct->switchInBattlerCounter = 0; - gBattleStruct->eventsBeforeFirstTurnState++; + gBattleStruct->eventState.beforeFristTurn++; break; - case FIRST_TURN_EVENTS_OPPORTUNIST_2: - if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, 0, 0, 0, 0)) + case FIRST_TURN_EVENTS_EJECT_PACK: + gBattleStruct->eventState.beforeFristTurn++; + if (TrySwitchInEjectPack(FIRST_TURN)) return; - gBattleStruct->eventsBeforeFirstTurnState++; break; case FIRST_TURN_EVENTS_END: for (i = 0; i < MAX_BATTLERS_COUNT; i++) @@ -3876,10 +3931,9 @@ static void TryDoEventsBeforeFirstTurn(void) gBattleStruct->monToSwitchIntoId[i] = PARTY_SIZE; gChosenActionByBattler[i] = B_ACTION_NONE; gChosenMoveByBattler[i] = MOVE_NONE; - gBattleStruct->battlerState[i].absent = (gAbsentBattlerFlags & (1u << i) ? TRUE : FALSE); } TurnValuesCleanUp(FALSE); - SpecialStatusesClear(); + memset(&gSpecialStatuses, 0, sizeof(gSpecialStatuses)); BattlePutTextOnWindow(gText_EmptyString3, B_WIN_MSG); AssignUsableGimmicks(); gBattleMainFunc = HandleTurnActionSelectionState; @@ -3888,19 +3942,11 @@ static void TryDoEventsBeforeFirstTurn(void) for (i = 0; i < BATTLE_COMMUNICATION_ENTRIES_COUNT; i++) gBattleCommunication[i] = 0; - for (i = 0; i < gBattlersCount; i++) - { - gBattleMons[i].status2 &= ~STATUS2_FLINCHED; - // Record party slots of player's mons that appeared in battle - if (!BattlerHasAi(i)) - gBattleStruct->appearedInBattle |= 1u << gBattlerPartyIndexes[i]; - } - - *(&gBattleStruct->eventBlockCounter) = 0; - *(&gBattleStruct->turnEffectsBattlerId) = 0; + gBattleStruct->eventState.endTurnBlock = 0; + gBattleStruct->eventState.endTurnBattler = 0; gBattleScripting.moveendState = 0; - gBattleStruct->faintedActionsState = 0; - gBattleStruct->endTurnEventsCounter = 0; + gBattleStruct->eventState.faintedAction = 0; + gBattleStruct->eventState.endTurn = 0; memset(gQueuedStatBoosts, 0, sizeof(gQueuedStatBoosts)); SetShellSideArmCategory(); @@ -3914,7 +3960,7 @@ static void TryDoEventsBeforeFirstTurn(void) if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_BEFORE_FIRST_TURN))) BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2); - gBattleStruct->eventsBeforeFirstTurnState = 0; + gBattleStruct->eventState.beforeFristTurn = 0; break; } } @@ -3930,13 +3976,13 @@ static void HandleEndTurn_ContinueBattle(void) gBattleCommunication[i] = 0; for (i = 0; i < gBattlersCount; i++) { - gBattleMons[i].status2 &= ~STATUS2_FLINCHED; - if ((gBattleMons[i].status1 & STATUS1_SLEEP) && (gBattleMons[i].status2 & STATUS2_MULTIPLETURNS)) + gBattleMons[i].volatiles.flinched = FALSE; + if ((gBattleMons[i].status1 & STATUS1_SLEEP) && (gBattleMons[i].volatiles.multipleTurns)) CancelMultiTurnMoves(i, SKY_DROP_IGNORE); } - gBattleStruct->eventBlockCounter = 0; - gBattleStruct->turnEffectsBattlerId = 0; - gBattleStruct->endTurnEventsCounter = 0; + gBattleStruct->eventState.endTurnBlock = 0; + gBattleStruct->eventState.endTurnBattler = 0; + gBattleStruct->eventState.endTurn = 0; } } @@ -3955,13 +4001,11 @@ void BattleTurnPassed(void) if (HandleFaintedMonActions()) return; - gBattleStruct->faintedActionsState = 0; + gBattleStruct->eventState.faintedAction = 0; TurnValuesCleanUp(FALSE); - gHitMarker &= ~HITMARKER_NO_ATTACKSTRING; gHitMarker &= ~HITMARKER_UNABLE_TO_USE_MOVE; gHitMarker &= ~HITMARKER_PLAYER_FAINTED; - gHitMarker &= ~HITMARKER_PASSIVE_DAMAGE; gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; gBattleScripting.moveendState = 0; @@ -3979,18 +4023,17 @@ void BattleTurnPassed(void) if (gBattleResults.battleTurnCounter < 0xFF) { gBattleResults.battleTurnCounter++; - gBattleStruct->arenaTurnCounter++; + gBattleStruct->eventState.arenaTurn++; } for (i = 0; i < gBattlersCount; i++) { gChosenActionByBattler[i] = B_ACTION_NONE; gChosenMoveByBattler[i] = MOVE_NONE; - gBattleStruct->battlerState[i].absent = (gAbsentBattlerFlags & (1u << i) ? TRUE : FALSE); gBattleStruct->monToSwitchIntoId[i] = PARTY_SIZE; - gStatuses4[i] &= ~STATUS4_ELECTRIFIED; - gBattleMons[i].status2 &= ~STATUS2_FLINCHED; - gBattleMons[i].status2 &= ~STATUS2_POWDER; + gBattleMons[i].volatiles.electrified = FALSE; + gBattleMons[i].volatiles.flinched = FALSE; + gBattleMons[i].volatiles.powder = FALSE; if (gBattleStruct->battlerState[i].stompingTantrumTimer > 0) gBattleStruct->battlerState[i].stompingTantrumTimer--; @@ -4012,7 +4055,7 @@ void BattleTurnPassed(void) if (gBattleTypeFlags & BATTLE_TYPE_PALACE) BattleScriptExecute(BattleScript_PalacePrintFlavorText); - else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->arenaTurnCounter == 0) + else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->eventState.arenaTurn == 0) BattleScriptExecute(BattleScript_ArenaTurnBeginning); else if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_LAST_LOW_HP))) BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2); @@ -4032,7 +4075,7 @@ void BattleTurnPassed(void) u8 IsRunningFromBattleImpossible(u32 battler) { - enum ItemHoldEffect holdEffect; + enum HoldEffect holdEffect; u32 i; if (FlagGet(B_FLAG_NO_RUNNING)) @@ -4165,10 +4208,10 @@ static void HandleTurnActionSelectionState(void) gBattleStruct->monToSwitchIntoId[battler] = PARTY_SIZE; if (gBattleTypeFlags & BATTLE_TYPE_MULTI || (position & BIT_FLANK) == B_FLANK_LEFT - || gBattleStruct->battlerState[GetBattlerAtPosition(BATTLE_PARTNER(position))].absent + || gAbsentBattlerFlags & 1u << GetBattlerAtPosition(BATTLE_PARTNER(position)) || gBattleCommunication[GetBattlerAtPosition(BATTLE_PARTNER(position))] == STATE_WAIT_ACTION_CONFIRMED) { - if (gBattleStruct->battlerState[battler].absent || gBattleStruct->battlerState[battler].commandingDondozo) + if (gAbsentBattlerFlags & 1u << battler || gBattleStruct->battlerState[battler].commandingDondozo) { gChosenActionByBattler[battler] = B_ACTION_NOTHING_FAINTED; if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) @@ -4178,8 +4221,8 @@ static void HandleTurnActionSelectionState(void) } else { - if (gBattleMons[battler].status2 & STATUS2_MULTIPLETURNS - || gBattleMons[battler].status2 & STATUS2_RECHARGE) + if (gBattleMons[battler].volatiles.multipleTurns + || gDisableStructs[battler].rechargeTimer > 0) { gChosenActionByBattler[battler] = B_ACTION_USE_MOVE; gBattleCommunication[battler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY; @@ -4224,16 +4267,23 @@ static void HandleTurnActionSelectionState(void) if (AreAllMovesUnusable(battler)) { gBattleCommunication[battler] = STATE_SELECTION_SCRIPT; - gBattleStruct->selectionScriptFinished[battler] = FALSE; + gBattleStruct->battlerState[battler].selectionScriptFinished = FALSE; gBattleStruct->stateIdAfterSelScript[battler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY; gBattleStruct->moveTarget[battler] = gBattleResources->bufferB[battler][3]; return; } - else if (gDisableStructs[battler].encoredMove != 0) + else if (GetConfig(CONFIG_ENCORE_TARGET) < GEN_5 && gDisableStructs[battler].encoredMove != MOVE_NONE) { gChosenMoveByBattler[battler] = gDisableStructs[battler].encoredMove; gBattleStruct->chosenMovePositions[battler] = gDisableStructs[battler].encoredMovePos; gBattleCommunication[battler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY; + if (gTestRunnerEnabled) + { + UNUSED enum Gimmick gimmick = GIMMICK_NONE; + if (gBattleResources->bufferB[battler][2] & RET_GIMMICK) + gimmick = gBattleStruct->gimmick.usableGimmick[battler]; + TestRunner_Battle_CheckChosenMove(battler, gDisableStructs[battler].encoredMove, gDisableStructs[battler].encoredMovePos, gimmick); + } return; } else @@ -4261,12 +4311,12 @@ static void HandleTurnActionSelectionState(void) } break; case B_ACTION_USE_ITEM: - if (FlagGet(B_FLAG_NO_BAG_USE)) + if (ShouldBattleRestrictionsApply(battler) && !IsAllowedToUseBag()) { RecordedBattle_ClearBattlerAction(battler, 1); gSelectionBattleScripts[battler] = BattleScript_ActionSelectionItemsCantBeUsed; gBattleCommunication[battler] = STATE_SELECTION_SCRIPT; - gBattleStruct->selectionScriptFinished[battler] = FALSE; + gBattleStruct->battlerState[battler].selectionScriptFinished = FALSE; gBattleStruct->stateIdAfterSelScript[battler] = STATE_BEFORE_ACTION_CHOSEN; return; } @@ -4277,12 +4327,12 @@ static void HandleTurnActionSelectionState(void) | BATTLE_TYPE_RECORDED_LINK)) && !gTestRunnerEnabled) // Or if currently held by Sky Drop - || gStatuses3[battler] & STATUS3_SKY_DROPPED) + || gBattleMons[battler].volatiles.semiInvulnerable == STATE_SKY_DROP) { RecordedBattle_ClearBattlerAction(battler, 1); gSelectionBattleScripts[battler] = BattleScript_ActionSelectionItemsCantBeUsed; gBattleCommunication[battler] = STATE_SELECTION_SCRIPT; - gBattleStruct->selectionScriptFinished[battler] = FALSE; + gBattleStruct->battlerState[battler].selectionScriptFinished = FALSE; gBattleStruct->stateIdAfterSelScript[battler] = STATE_BEFORE_ACTION_CHOSEN; return; } @@ -4295,23 +4345,23 @@ static void HandleTurnActionSelectionState(void) case B_ACTION_SWITCH: gBattleStruct->battlerPartyIndexes[battler] = gBattlerPartyIndexes[battler]; if (gBattleTypeFlags & BATTLE_TYPE_ARENA - || !CanBattlerEscape(battler)) + || (!CanBattlerEscape(battler) && GetBattlerHoldEffect(battler) != HOLD_EFFECT_SHED_SHELL)) { - BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CANT_SWITCH, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CANT_SWITCH, PARTY_SIZE, ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[battler]); } else if (GetItemHoldEffect(gBattleMons[battler].item) != HOLD_EFFECT_SHED_SHELL && (i = IsAbilityPreventingEscape(battler))) // must be last to keep i value integrity { - BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, ((i - 1) << 4) | PARTY_ACTION_ABILITY_PREVENTS, PARTY_SIZE, gBattleMons[i - 1].ability, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_ABILITY_PREVENTS, PARTY_SIZE, gBattleMons[i - 1].ability, i - 1, gBattleStruct->battlerPartyOrders[battler]); } else { if (battler == 2 && gChosenActionByBattler[0] == B_ACTION_SWITCH) - BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, gBattleStruct->monToSwitchIntoId[0], ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, gBattleStruct->monToSwitchIntoId[0], ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[battler]); else if (battler == 3 && gChosenActionByBattler[1] == B_ACTION_SWITCH) - BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, gBattleStruct->monToSwitchIntoId[1], ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, gBattleStruct->monToSwitchIntoId[1], ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[battler]); else - BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, PARTY_SIZE, ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[battler]); } MarkBattlerForControllerExec(battler); break; @@ -4320,7 +4370,7 @@ static void HandleTurnActionSelectionState(void) { gSelectionBattleScripts[battler] = BattleScript_PrintFullBox; gBattleCommunication[battler] = STATE_SELECTION_SCRIPT; - gBattleStruct->selectionScriptFinished[battler] = FALSE; + gBattleStruct->battlerState[battler].selectionScriptFinished = FALSE; gBattleStruct->stateIdAfterSelScript[battler] = STATE_BEFORE_ACTION_CHOSEN; return; } @@ -4333,8 +4383,8 @@ static void HandleTurnActionSelectionState(void) gBattleCommunication[battler] = STATE_WAIT_SET_BEFORE_ACTION; gBattleCommunication[GetPartnerBattler(battler)] = STATE_BEFORE_ACTION_CHOSEN; RecordedBattle_ClearBattlerAction(battler, 1); - if (gBattleMons[GetPartnerBattler(battler)].status2 & STATUS2_MULTIPLETURNS - || gBattleMons[GetPartnerBattler(battler)].status2 & STATUS2_RECHARGE) + if (gBattleMons[GetPartnerBattler(battler)].volatiles.multipleTurns + || gDisableStructs[GetPartnerBattler(battler)].rechargeTimer > 0) { BtlController_EmitEndBounceEffect(battler, B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(battler); @@ -4381,7 +4431,7 @@ static void HandleTurnActionSelectionState(void) { gSelectionBattleScripts[battler] = BattleScript_AskIfWantsToForfeitMatch; gBattleCommunication[battler] = STATE_SELECTION_SCRIPT_MAY_RUN; - gBattleStruct->selectionScriptFinished[battler] = FALSE; + gBattleStruct->battlerState[battler].selectionScriptFinished = FALSE; gBattleStruct->stateIdAfterSelScript[battler] = STATE_BEFORE_ACTION_CHOSEN; return; } @@ -4389,7 +4439,7 @@ static void HandleTurnActionSelectionState(void) { gSelectionBattleScripts[battler] = BattleScript_QuestionForfeitBattle; gBattleCommunication[battler] = STATE_SELECTION_SCRIPT_MAY_RUN; - gBattleStruct->selectionScriptFinished[battler] = FALSE; + gBattleStruct->battlerState[battler].selectionScriptFinished = FALSE; gBattleStruct->stateIdAfterSelScript[battler] = STATE_BEFORE_ACTION_CHOSEN; return; } @@ -4406,7 +4456,7 @@ static void HandleTurnActionSelectionState(void) { gSelectionBattleScripts[battler] = BattleScript_PrintCantEscapeFromBattle; gBattleCommunication[battler] = STATE_SELECTION_SCRIPT; - gBattleStruct->selectionScriptFinished[battler] = FALSE; + gBattleStruct->battlerState[battler].selectionScriptFinished = FALSE; gBattleStruct->stateIdAfterSelScript[battler] = STATE_BEFORE_ACTION_CHOSEN; return; } @@ -4448,7 +4498,7 @@ static void HandleTurnActionSelectionState(void) { RecordedBattle_ClearBattlerAction(battler, 1); gBattleCommunication[battler] = STATE_SELECTION_SCRIPT; - gBattleStruct->selectionScriptFinished[battler] = FALSE; + gBattleStruct->battlerState[battler].selectionScriptFinished = FALSE; gBattleResources->bufferB[battler][1] = B_ACTION_USE_MOVE; gBattleStruct->stateIdAfterSelScript[battler] = STATE_WAIT_ACTION_CHOSEN; return; @@ -4463,8 +4513,12 @@ static void HandleTurnActionSelectionState(void) // Get the chosen move position (and thus the chosen move) and target from the returned buffer. gBattleStruct->chosenMovePositions[battler] = gBattleResources->bufferB[battler][2] & ~RET_GIMMICK; - gChosenMoveByBattler[battler] = gBattleMons[battler].moves[gBattleStruct->chosenMovePositions[battler]]; + gChosenMoveByBattler[battler] = GetChosenMoveFromPosition(battler); gBattleStruct->moveTarget[battler] = gBattleResources->bufferB[battler][3]; + if (IsBattleMoveStatus(gChosenMoveByBattler[battler]) && GetBattlerAbility(battler) == ABILITY_MYCELIUM_MIGHT) + gProtectStructs[battler].myceliumMight = TRUE; + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_LAGGING_TAIL) + gProtectStructs[battler].laggingTail = TRUE; // Check to see if any gimmicks need to be prepared. if (gBattleResources->bufferB[battler][2] & RET_GIMMICK) @@ -4473,13 +4527,16 @@ static void HandleTurnActionSelectionState(void) // Max Move check if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX || IsGimmickSelected(battler, GIMMICK_DYNAMAX)) { - gBattleStruct->dynamax.baseMoves[battler] = gBattleMons[battler].moves[gBattleStruct->chosenMovePositions[battler]]; + gBattleStruct->dynamax.baseMoves[battler] = GetChosenMoveFromPosition(battler); } gBattleCommunication[battler]++; if (gTestRunnerEnabled) { - TestRunner_Battle_CheckChosenMove(battler, gChosenMoveByBattler[battler], gBattleStruct->moveTarget[battler]); + UNUSED enum Gimmick gimmick = GIMMICK_NONE; + if (gBattleResources->bufferB[battler][2] & RET_GIMMICK) + gimmick = gBattleStruct->gimmick.usableGimmick[battler]; + TestRunner_Battle_CheckChosenMove(battler, gChosenMoveByBattler[battler], gBattleStruct->moveTarget[battler], gimmick); } } break; @@ -4556,7 +4613,7 @@ static void HandleTurnActionSelectionState(void) if (((gBattleTypeFlags & BATTLE_TYPE_MULTI) || !IsDoubleBattle()) || (position & BIT_FLANK) != B_FLANK_LEFT - || gBattleStruct->battlerState[GetBattlerAtPosition(BATTLE_PARTNER(position))].absent) + || gAbsentBattlerFlags & 1u << GetBattlerAtPosition(BATTLE_PARTNER(position))) { BtlController_EmitLinkStandbyMsg(battler, B_COMM_TO_CONTROLLER, LINK_STANDBY_MSG_STOP_BOUNCE, i); } @@ -4575,7 +4632,7 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_SELECTION_SCRIPT: - if (gBattleStruct->selectionScriptFinished[battler]) + if (gBattleStruct->battlerState[battler].selectionScriptFinished) { gBattleCommunication[battler] = gBattleStruct->stateIdAfterSelScript[battler]; } @@ -4597,7 +4654,7 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_SELECTION_SCRIPT_MAY_RUN: - if (gBattleStruct->selectionScriptFinished[battler]) + if (gBattleStruct->battlerState[battler].selectionScriptFinished) { if (gBattleResources->bufferB[battler][1] == B_ACTION_NOTHING_FAINTED) { @@ -4698,7 +4755,7 @@ void SwapTurnOrder(u8 id1, u8 id2) } // For AI, so it doesn't 'cheat' by knowing player's ability -u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) +u32 GetBattlerTotalSpeedStat(u32 battler, enum Ability ability, enum HoldEffect holdEffect) { u32 speed = gBattleMons[battler].speed; @@ -4726,10 +4783,10 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, enum ItemHoldEffect h speed *= 2; else if (ability == ABILITY_SLOW_START && gDisableStructs[battler].slowStartTimer != 0) speed /= 2; - else if (ability == ABILITY_PROTOSYNTHESIS && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) && ((gBattleWeather & B_WEATHER_SUN && HasWeatherEffect()) || gDisableStructs[battler].boosterEnergyActivates)) - speed = (GetHighestStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; - else if (ability == ABILITY_QUARK_DRIVE && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) && (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battler].boosterEnergyActivates)) - speed = (GetHighestStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; + else if (ability == ABILITY_PROTOSYNTHESIS && !(gBattleMons[battler].volatiles.transformed) && ((gBattleWeather & B_WEATHER_SUN && HasWeatherEffect()) || gDisableStructs[battler].boosterEnergyActivated)) + speed = (GetParadoxBoostedStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; + else if (ability == ABILITY_QUARK_DRIVE && !(gBattleMons[battler].volatiles.transformed) && (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battler].boosterEnergyActivated)) + speed = (GetParadoxBoostedStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; else if (ability == ABILITY_UNBURDEN && gDisableStructs[battler].unburdenActive) speed *= 2; @@ -4738,7 +4795,7 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, enum ItemHoldEffect h && ShouldGetStatBadgeBoost(B_FLAG_BADGE_BOOST_SPEED, battler) && IsOnPlayerSide(battler)) { - speed = (speed * 110) / 100; + speed = uq4_12_multiply_by_int_half_down(GetBadgeBoostModifier(), speed); } // item effects @@ -4748,7 +4805,7 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, enum ItemHoldEffect h speed /= 2; else if (holdEffect == HOLD_EFFECT_CHOICE_SCARF && GetActiveGimmick(battler) != GIMMICK_DYNAMAX) speed = (speed * 150) / 100; - else if (holdEffect == HOLD_EFFECT_QUICK_POWDER && gBattleMons[battler].species == SPECIES_DITTO && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) + else if (holdEffect == HOLD_EFFECT_QUICK_POWDER && gBattleMons[battler].species == SPECIES_DITTO && !(gBattleMons[battler].volatiles.transformed)) speed *= 2; // various effects @@ -4757,7 +4814,7 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, enum ItemHoldEffect h // paralysis drop if (gBattleMons[battler].status1 & STATUS1_PARALYSIS && ability != ABILITY_QUICK_FEET) - speed /= GetGenConfig(GEN_CONFIG_PARALYSIS_SPEED) >= GEN_7 ? 2 : 4; + speed /= GetConfig(CONFIG_PARALYSIS_SPEED) >= GEN_7 ? 2 : 4; if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SWAMP) speed /= 4; @@ -4765,14 +4822,7 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, enum ItemHoldEffect h return speed; } -u32 GetBattlerTotalSpeedStat(u32 battler) -{ - u32 ability = GetBattlerAbility(battler); - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); - return GetBattlerTotalSpeedStatArgs(battler, ability, holdEffect); -} - -s32 GetChosenMovePriority(u32 battler, u32 ability) +s32 GetChosenMovePriority(u32 battler, enum Ability ability) { u16 move; @@ -4780,12 +4830,12 @@ s32 GetChosenMovePriority(u32 battler, u32 ability) if (gProtectStructs[battler].noValidMoves) move = MOVE_STRUGGLE; else - move = gBattleMons[battler].moves[gBattleStruct->chosenMovePositions[battler]]; + move = GetChosenMoveFromPosition(battler); return GetBattleMovePriority(battler, ability, move); } -s32 GetBattleMovePriority(u32 battler, u32 ability, u32 move) +s32 GetBattleMovePriority(u32 battler, enum Ability ability, u32 move) { s32 priority = 0; @@ -4798,32 +4848,34 @@ s32 GetBattleMovePriority(u32 battler, u32 ability, u32 move) if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX && GetMoveCategory(move) == DAMAGE_CATEGORY_STATUS) return GetMovePriority(MOVE_MAX_GUARD); - if (ability == ABILITY_GALE_WINGS - && (GetGenConfig(GEN_CONFIG_GALE_WINGS) < GEN_7 || IsBattlerAtMaxHp(battler)) - && GetMoveType(move) == TYPE_FLYING) + if (gProtectStructs[battler].quash) + { + priority = -8; + } + else if (ability == ABILITY_GALE_WINGS + && (GetConfig(CONFIG_GALE_WINGS) < GEN_7 || IsBattlerAtMaxHp(battler)) + && GetMoveType(move) == TYPE_FLYING) { priority++; } - else if (ability == ABILITY_PRANKSTER && IsBattleMoveStatus(move)) + else if (IsBattleMoveStatus(move) && IsAbilityAndRecord(battler, ability, ABILITY_PRANKSTER)) { gProtectStructs[battler].pranksterElevated = 1; priority++; } - else if (GetMoveEffect(move) == EFFECT_GRASSY_GLIDE && IsBattlerTerrainAffected(battler, STATUS_FIELD_GRASSY_TERRAIN) && GetActiveGimmick(gBattlerAttacker) != GIMMICK_DYNAMAX && !IsGimmickSelected(battler, GIMMICK_DYNAMAX)) + else if (GetMoveEffect(move) == EFFECT_GRASSY_GLIDE && IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler), STATUS_FIELD_GRASSY_TERRAIN) && GetActiveGimmick(gBattlerAttacker) != GIMMICK_DYNAMAX && !IsGimmickSelected(battler, GIMMICK_DYNAMAX)) { priority++; } else if (ability == ABILITY_TRIAGE && IsHealingMove(move)) + { priority += 3; - - if (gProtectStructs[battler].quash) - priority = -8; + } return priority; } -s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMoves, u32 ability1, u32 ability2, - enum ItemHoldEffect holdEffectBattler1, enum ItemHoldEffect holdEffectBattler2, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2) +s32 GetWhichBattlerFasterArgs(struct BattleContext *ctx, bool32 ignoreChosenMoves, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2) { u32 strikesFirst = 0; @@ -4832,18 +4884,18 @@ s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMov // Quick Claw / Quick Draw / Custap Berry - always first // Stall / Mycelium Might - last but before Lagging Tail // Lagging Tail - always last - bool32 battler1HasQuickEffect = gProtectStructs[battler1].quickDraw || gProtectStructs[battler1].usedCustapBerry; - bool32 battler2HasQuickEffect = gProtectStructs[battler2].quickDraw || gProtectStructs[battler2].usedCustapBerry; - bool32 battler1HasStallingAbility = ability1 == ABILITY_STALL || (ability1 == ABILITY_MYCELIUM_MIGHT && IsBattleMoveStatus(gChosenMoveByBattler[battler1])); - bool32 battler2HasStallingAbility = ability2 == ABILITY_STALL || (ability2 == ABILITY_MYCELIUM_MIGHT && IsBattleMoveStatus(gChosenMoveByBattler[battler2])); + bool32 battler1HasQuickEffect = gProtectStructs[ctx->battlerAtk].quickDraw || gProtectStructs[ctx->battlerAtk].usedCustapBerry; + bool32 battler2HasQuickEffect = gProtectStructs[ctx->battlerDef].quickDraw || gProtectStructs[ctx->battlerDef].usedCustapBerry; + bool32 battler1HasStallingAbility = ctx->abilities[ctx->battlerAtk] == ABILITY_STALL || gProtectStructs[ctx->battlerAtk].myceliumMight; + bool32 battler2HasStallingAbility = ctx->abilities[ctx->battlerDef] == ABILITY_STALL || gProtectStructs[ctx->battlerDef].myceliumMight; if (battler1HasQuickEffect && !battler2HasQuickEffect) strikesFirst = 1; else if (battler2HasQuickEffect && !battler1HasQuickEffect) strikesFirst = -1; - else if (holdEffectBattler1 == HOLD_EFFECT_LAGGING_TAIL && holdEffectBattler2 != HOLD_EFFECT_LAGGING_TAIL) + else if (gProtectStructs[ctx->battlerAtk].laggingTail && !gProtectStructs[ctx->battlerDef].laggingTail) strikesFirst = -1; - else if (holdEffectBattler2 == HOLD_EFFECT_LAGGING_TAIL && holdEffectBattler1 != HOLD_EFFECT_LAGGING_TAIL) + else if (gProtectStructs[ctx->battlerDef].laggingTail && !gProtectStructs[ctx->battlerAtk].laggingTail) strikesFirst = 1; else if (battler1HasStallingAbility && !battler2HasStallingAbility) strikesFirst = -1; @@ -4885,32 +4937,27 @@ s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMov return strikesFirst; } -s32 GetWhichBattlerFasterOrTies(u32 battler1, u32 battler2, bool32 ignoreChosenMoves) +s32 GetWhichBattlerFasterOrTies(struct BattleContext *ctx, bool32 ignoreChosenMoves) { s32 priority1 = 0, priority2 = 0; - u32 ability1 = GetBattlerAbility(battler1); - u32 speedBattler1 = GetBattlerTotalSpeedStat(battler1); - enum ItemHoldEffect holdEffectBattler1 = GetBattlerHoldEffect(battler1, TRUE); - u32 speedBattler2 = GetBattlerTotalSpeedStat(battler2); - enum ItemHoldEffect holdEffectBattler2 = GetBattlerHoldEffect(battler2, TRUE); - u32 ability2 = GetBattlerAbility(battler2); + u32 speedBattler1 = GetBattlerTotalSpeedStat(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk], ctx->holdEffects[ctx->battlerAtk]); + u32 speedBattler2 = GetBattlerTotalSpeedStat(ctx->battlerDef, ctx->abilities[ctx->battlerDef], ctx->holdEffects[ctx->battlerDef]); if (!ignoreChosenMoves) { - if (gChosenActionByBattler[battler1] == B_ACTION_USE_MOVE) - priority1 = GetChosenMovePriority(battler1, ability1); - if (gChosenActionByBattler[battler2] == B_ACTION_USE_MOVE) - priority2 = GetChosenMovePriority(battler2, ability2); + if (gChosenActionByBattler[ctx->battlerAtk] == B_ACTION_USE_MOVE) + priority1 = GetChosenMovePriority(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk]); + if (gChosenActionByBattler[ctx->battlerDef] == B_ACTION_USE_MOVE) + priority2 = GetChosenMovePriority(ctx->battlerDef, ctx->abilities[ctx->battlerDef]); } return GetWhichBattlerFasterArgs( - battler1, battler2, + ctx, ignoreChosenMoves, - ability1, ability2, - holdEffectBattler1, holdEffectBattler2, - speedBattler1, speedBattler2, - priority1, priority2 - ); + speedBattler1, + speedBattler2, + priority1, + priority2); } // 24 == MAX_BATTLERS_COUNT!. @@ -4944,13 +4991,13 @@ static const u8 sBattlerOrders[24][4] = { 3, 2, 1, 0 }, }; -s32 GetWhichBattlerFaster(u32 battler1, u32 battler2, bool32 ignoreChosenMoves) +s32 GetWhichBattlerFaster(struct BattleContext *ctx, bool32 ignoreChosenMoves) { - s32 strikesFirst = GetWhichBattlerFasterOrTies(battler1, battler2, ignoreChosenMoves); + s32 strikesFirst = GetWhichBattlerFasterOrTies(ctx, ignoreChosenMoves); if (strikesFirst == 0) { - s32 order1 = sBattlerOrders[gBattleStruct->speedTieBreaks][battler1]; - s32 order2 = sBattlerOrders[gBattleStruct->speedTieBreaks][battler2]; + s32 order1 = sBattlerOrders[gBattleStruct->speedTieBreaks][ctx->battlerAtk]; + s32 order2 = sBattlerOrders[gBattleStruct->speedTieBreaks][ctx->battlerDef]; if (order1 < order2) strikesFirst = 1; else @@ -5044,13 +5091,19 @@ static void SetActionsAndBattlersTurnOrder(void) turnOrderId++; } } + struct BattleContext ctx = {0}; + for (i = 0; i < gBattlersCount; i++) + { + ctx.abilities[i] = GetBattlerAbility(i); + ctx.holdEffects[i] = GetBattlerHoldEffect(i); + } for (i = 0; i < gBattlersCount - 1; i++) { for (j = i + 1; j < gBattlersCount; j++) { - u8 battler1 = gBattlerByTurnOrder[i]; - u8 battler2 = gBattlerByTurnOrder[j]; - TryChangingTurnOrderEffects(battler1, battler2, quickClawRandom, quickDrawRandom); + ctx.battlerAtk = gBattlerByTurnOrder[i]; + ctx.battlerDef = gBattlerByTurnOrder[j]; + TryChangingTurnOrderEffects(&ctx, quickClawRandom, quickDrawRandom); if (gActionsByTurnOrder[i] != B_ACTION_USE_ITEM && gActionsByTurnOrder[j] != B_ACTION_USE_ITEM && gActionsByTurnOrder[i] != B_ACTION_SWITCH @@ -5058,7 +5111,7 @@ static void SetActionsAndBattlersTurnOrder(void) && gActionsByTurnOrder[i] != B_ACTION_THROW_BALL && gActionsByTurnOrder[j] != B_ACTION_THROW_BALL) { - if (GetWhichBattlerFaster(battler1, battler2, FALSE) == -1) + if (GetWhichBattlerFaster(&ctx, FALSE) == -1) SwapTurnOrder(i, j); } } @@ -5091,38 +5144,34 @@ static void TurnValuesCleanUp(bool8 var0) gDisableStructs[i].isFirstTurn--; if (gDisableStructs[i].rechargeTimer) - { gDisableStructs[i].rechargeTimer--; - if (gDisableStructs[i].rechargeTimer == 0) - gBattleMons[i].status2 &= ~STATUS2_RECHARGE; - } + gBattleStruct->battlerState[i].canPickupItem = FALSE; + gBattleStruct->battlerState[i].wasAboveHalfHp = FALSE; } if (gDisableStructs[i].substituteHP == 0) - gBattleMons[i].status2 &= ~STATUS2_SUBSTITUTE; + gBattleMons[i].volatiles.substitute = FALSE; - if (!(gStatuses3[i] & STATUS3_COMMANDER)) + if (gBattleMons[i].volatiles.semiInvulnerable != STATE_COMMANDER) gBattleStruct->battlerState[i].commandingDondozo = FALSE; gSpecialStatuses[i].parentalBondState = PARENTAL_BOND_OFF; gBattleStruct->battlerState[i].usedEjectItem = FALSE; gProtectStructs[i].lashOutAffected = FALSE; + gDisableStructs[i].endured = FALSE; } gSideTimers[B_SIDE_PLAYER].followmeTimer = 0; gSideTimers[B_SIDE_OPPONENT].followmeTimer = 0; - gBattleStruct->pledgeMove = FALSE; // combined pledge move may not have been used due to a canceller + gBattleStruct->pledgeMove = FALSE; // combined pledge move may not have been used due to a canceler + gBattleStruct->tryDestinyBond = FALSE; + gBattleStruct->tryGrudge = FALSE; ClearPursuitValues(); ClearDamageCalcResults(); } -void SpecialStatusesClear(void) -{ - memset(&gSpecialStatuses, 0, sizeof(gSpecialStatuses)); -} - static void PopulateArrayWithBattlers(u8 *battlers) { u32 i; @@ -5162,7 +5211,7 @@ static bool32 TryDoGimmicksBeforeMoves(void) } } - if (B_MEGA_EVO_TURN_ORDER >= GEN_7) + if (GetConfig(CONFIG_MEGA_EVO_TURN_ORDER) >= GEN_7) TryChangeTurnOrder(); // This will just do nothing if no mon has mega evolved. return FALSE; } @@ -5210,29 +5259,38 @@ static bool32 TryDoMoveEffectsBeforeMoves(void) static void TryChangeTurnOrder(void) { u32 i, j; + + struct BattleContext ctx = {0}; + for (i = 0; i < gBattlersCount; i++) + { + ctx.abilities[i] = GetBattlerAbility(i); + ctx.holdEffects[i] = GetBattlerHoldEffect(i); + } for (i = gCurrentTurnActionNumber; i < gBattlersCount - 1; i++) { for (j = i + 1; j < gBattlersCount; j++) { - u32 battler1 = gBattlerByTurnOrder[i]; - u32 battler2 = gBattlerByTurnOrder[j]; + ctx.battlerAtk = gBattlerByTurnOrder[i]; + ctx.battlerDef = gBattlerByTurnOrder[j]; if (gActionsByTurnOrder[i] == B_ACTION_USE_MOVE && gActionsByTurnOrder[j] == B_ACTION_USE_MOVE) { - if (GetWhichBattlerFaster(battler1, battler2, FALSE) == -1) + if (GetWhichBattlerFaster(&ctx, FALSE) == -1) SwapTurnOrder(i, j); } } } } -static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2, u32 *quickClawRandom, u32 *quickDrawRandom) +static void TryChangingTurnOrderEffects(struct BattleContext *ctx, u32 *quickClawRandom, u32 *quickDrawRandom) { - u32 ability1 = GetBattlerAbility(battler1); - enum ItemHoldEffect holdEffectBattler1 = GetBattlerHoldEffect(battler1, TRUE); - enum ItemHoldEffect holdEffectBattler2 = GetBattlerHoldEffect(battler2, TRUE); - u32 ability2 = GetBattlerAbility(battler2); + u32 battler1 = ctx->battlerAtk; + u32 battler2 = ctx->battlerDef; + enum Ability ability1 = ctx->abilities[ctx->battlerAtk]; + enum Ability ability2 = ctx->abilities[ctx->battlerDef]; + enum HoldEffect holdEffectBattler1 = ctx->holdEffects[ctx->battlerAtk]; + enum HoldEffect holdEffectBattler2 = ctx->holdEffects[ctx->battlerDef]; // Battler 1 // Quick Draw @@ -5241,7 +5299,7 @@ static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2, u32 *quickCl // Quick Claw and Custap Berry if (!gProtectStructs[battler1].quickDraw && ((holdEffectBattler1 == HOLD_EFFECT_QUICK_CLAW && quickClawRandom[battler1]) - || (holdEffectBattler1 == HOLD_EFFECT_CUSTAP_BERRY && HasEnoughHpToEatBerry(battler1, 4, gBattleMons[battler1].item)))) + || (holdEffectBattler1 == HOLD_EFFECT_CUSTAP_BERRY && HasEnoughHpToEatBerry(battler1, ability1, 4, gBattleMons[battler1].item)))) gProtectStructs[battler1].usedCustapBerry = TRUE; // Battler 2 @@ -5251,7 +5309,7 @@ static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2, u32 *quickCl // Quick Claw and Custap Berry if (!gProtectStructs[battler2].quickDraw && ((holdEffectBattler2 == HOLD_EFFECT_QUICK_CLAW && quickClawRandom[battler2]) - || (holdEffectBattler2 == HOLD_EFFECT_CUSTAP_BERRY && HasEnoughHpToEatBerry(battler2, 4, gBattleMons[battler2].item)))) + || (holdEffectBattler2 == HOLD_EFFECT_CUSTAP_BERRY && HasEnoughHpToEatBerry(battler2, ability2, 4, gBattleMons[battler2].item)))) gProtectStructs[battler2].usedCustapBerry = TRUE; } @@ -5276,14 +5334,14 @@ static void CheckChangingTurnOrderEffects(void) { gLastUsedItem = gBattleMons[battler].item; PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); - if (GetBattlerHoldEffect(battler, FALSE) == HOLD_EFFECT_CUSTAP_BERRY) + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_CUSTAP_BERRY) { // don't record berry since its gone now BattleScriptExecute(BattleScript_CustapBerryActivation); } else { - RecordItemEffectBattle(battler, GetBattlerHoldEffect(battler, FALSE)); + RecordItemEffectBattle(battler, GetBattlerHoldEffect(battler)); BattleScriptExecute(BattleScript_QuickClawActivation); } } @@ -5309,14 +5367,13 @@ static void CheckChangingTurnOrderEffects(void) for (i = 0; i < MAX_BATTLERS_COUNT; i++) { gBattleStruct->battlerState[i].focusPunchBattlers = FALSE; - gBattleStruct->ateBoost[i] = FALSE; + gBattleStruct->battlerState[i].ateBoost = FALSE; gSpecialStatuses[i].gemBoost = FALSE; } gBattleMainFunc = RunTurnActionsFunctions; gBattleCommunication[3] = 0; gBattleCommunication[4] = 0; - gBattleScripting.multihitMoveEffect = 0; gBattleResources->battleScriptsStack->size = 0; } @@ -5348,16 +5405,12 @@ static void RunTurnActionsFunctions(void) if (gCurrentTurnActionNumber >= gBattlersCount) // everyone did their actions, turn finished { - gHitMarker &= ~HITMARKER_PASSIVE_DAMAGE; gBattleMainFunc = sEndTurnFuncsTable[gBattleOutcome & 0x7F]; } else { if (gBattleStruct->savedTurnActionNumber != gCurrentTurnActionNumber) // action turn has been done, clear hitmarker bits for another battler - { - gHitMarker &= ~HITMARKER_NO_ATTACKSTRING; gHitMarker &= ~HITMARKER_UNABLE_TO_USE_MOVE; - } } } @@ -5533,12 +5586,29 @@ static void HandleEndTurn_FinishBattle(void) GetMonData(GetBattlerMon(battler), MON_DATA_NICKNAME, gBattleResults.playerMon2Name); } } - else if (!IsOnPlayerSide(battler)) + } + TryPutPokemonTodayOnAir(); + } + + if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK + | BATTLE_TYPE_EREADER_TRAINER + | BATTLE_TYPE_RECORDED_LINK + | BATTLE_TYPE_TRAINER_HILL + | BATTLE_TYPE_FRONTIER))) + { + for (enum BattleSide side = 0; side < NUM_BATTLE_SIDES; side++) + { + struct Pokemon *party = GetSideParty(side); + + if (side == B_SIDE_PLAYER && !B_PARTNER_MONS_MARKED_SEEN) + continue; + + for (u32 partySlot = 0; partySlot < PARTY_SIZE; partySlot++) { - HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[battler].species), FLAG_SET_SEEN, gBattleMons[battler].personality); + if (gBattleStruct->partyState[side][partySlot].sentOut) + HandleSetPokedexFlagFromMon(&party[partySlot], FLAG_SET_SEEN); } } - TryPutPokemonTodayOnAir(); } if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK @@ -5571,18 +5641,7 @@ static void HandleEndTurn_FinishBattle(void) for (i = 0; i < PARTY_SIZE; i++) { - bool8 changedForm = FALSE; - - // Appeared in battle and didn't faint - if ((gBattleStruct->appearedInBattle & (1u << i)) && GetMonData(&gPlayerParty[i], MON_DATA_HP, NULL) != 0) - changedForm = TryFormChange(i, B_SIDE_PLAYER, FORM_CHANGE_END_BATTLE_TERRAIN); - - if (!changedForm) - changedForm = TryFormChange(i, B_SIDE_PLAYER, FORM_CHANGE_END_BATTLE); - - // Clear original species field - gBattleStruct->changedSpecies[B_SIDE_PLAYER][i] = SPECIES_NONE; - gBattleStruct->changedSpecies[B_SIDE_OPPONENT][i] = SPECIES_NONE; + bool32 changedForm = TryRevertPartyMonFormChange(i); // Recalculate the stats of every party member before the end if (!changedForm && B_RECALCULATE_STATS >= GEN_5) @@ -5619,6 +5678,7 @@ static void FreeResetData_ReturnToOvOrDoEvolutions(void) else gSaveBlock3Ptr->dexNavChain = 0; + ClearCurrentTrainerWantRematchVsSeeker(); gDexNavSpecies = SPECIES_NONE; ResetSpriteData(); if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK @@ -5666,20 +5726,24 @@ static void TryEvolvePokemon(void) if (!(sTriedEvolving & (1u << i))) { bool32 canStopEvo = TRUE; - u32 species = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_BATTLE_SPECIAL, i, NULL, &canStopEvo, CHECK_EVO); + enum EvolutionMode mode = EVO_MODE_BATTLE_SPECIAL; + u32 evolutionItemArg = i; + u32 species = GetEvolutionTargetSpecies(&gPlayerParty[i], mode, evolutionItemArg, NULL, &canStopEvo, CHECK_EVO); sTriedEvolving |= 1u << i; if (species == SPECIES_NONE && (gLeveledUpInBattle & (1u << i))) { gLeveledUpInBattle &= ~(1u << i); - species = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_BATTLE_ONLY, gLeveledUpInBattle, NULL, &canStopEvo, CHECK_EVO); + mode = EVO_MODE_BATTLE_ONLY; + evolutionItemArg = gLeveledUpInBattle; + species = GetEvolutionTargetSpecies(&gPlayerParty[i], mode, evolutionItemArg, NULL, &canStopEvo, CHECK_EVO); } if (species != SPECIES_NONE) { FreeAllWindowBuffers(); gBattleMainFunc = WaitForEvoSceneToFinish; - GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_BATTLE_ONLY, gLeveledUpInBattle, NULL, &canStopEvo, DO_EVO); + GetEvolutionTargetSpecies(&gPlayerParty[i], mode, evolutionItemArg, NULL, &canStopEvo, DO_EVO); EvolutionScene(&gPlayerParty[i], species, canStopEvo, i); return; } @@ -5749,9 +5813,9 @@ void RunBattleScriptCommands(void) gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); } -u32 TrySetAteType(u32 move, u32 battlerAtk, u32 attackerAbility) +enum Type TrySetAteType(u32 move, u32 battlerAtk, enum Ability attackerAbility) { - u32 ateType = TYPE_NONE; + enum Type ateType = TYPE_NONE; switch (GetMoveEffect(move)) { @@ -5797,22 +5861,24 @@ u32 TrySetAteType(u32 move, u32 battlerAtk, u32 attackerAbility) } // Returns TYPE_NONE if type doesn't change. -u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState state) +enum Type GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState state) { - u32 moveType = GetMoveType(move); + enum Type moveType = GetMoveType(move); enum BattleMoveEffects moveEffect = GetMoveEffect(move); - u32 species, heldItem, ability, type1, type2, type3; - enum ItemHoldEffect holdEffect; + u32 species, heldItem; + enum Type type1, type2, type3; + enum Ability ability; + enum HoldEffect holdEffect; enum Gimmick gimmick = GetActiveGimmick(battler); - if (move == MOVE_STRUGGLE) - return TYPE_NORMAL; - if (state == MON_IN_BATTLE) { + if (moveEffect == EFFECT_STRUGGLE) + return TYPE_MYSTERY; + species = gBattleMons[battler].species; heldItem = gBattleMons[battler].item; - holdEffect = GetBattlerHoldEffect(battler, TRUE); + holdEffect = GetBattlerHoldEffect(battler); ability = GetBattlerAbility(battler); type1 = gBattleMons[battler].types[0]; type2 = gBattleMons[battler].types[1]; @@ -5824,8 +5890,8 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); holdEffect = GetItemHoldEffect(heldItem); ability = GetMonAbility(mon); - type1 = gSpeciesInfo[species].types[0]; - type2 = gSpeciesInfo[species].types[1]; + type1 = GetSpeciesType(species, 0); + type2 = GetSpeciesType(species, 1); type3 = TYPE_MYSTERY; } @@ -5910,7 +5976,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState case EFFECT_REVELATION_DANCE: if (gimmick != GIMMICK_Z_MOVE) { - u32 teraType; + enum Type teraType; if (gimmick == GIMMICK_TERA && ((teraType = GetMonData(mon, MON_DATA_TERA_TYPE)) != TYPE_STELLAR)) return teraType; else if (type1 != TYPE_MYSTERY && !(gDisableStructs[battler].roostActive && type1 == TYPE_FLYING)) @@ -5931,7 +5997,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState case SPECIES_TAUROS_PALDEA_COMBAT: case SPECIES_TAUROS_PALDEA_BLAZE: case SPECIES_TAUROS_PALDEA_AQUA: - return gSpeciesInfo[species].types[1]; + return GetSpeciesType(species, 1); } break; case EFFECT_IVY_CUDGEL: @@ -5943,7 +6009,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState case SPECIES_OGERPON_HEARTHFLAME_TERA: case SPECIES_OGERPON_CORNERSTONE: case SPECIES_OGERPON_CORNERSTONE_TERA: - return gSpeciesInfo[species].types[1]; + return GetSpeciesType(species, 1); } break; case EFFECT_NATURAL_GIFT: @@ -5954,7 +6020,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState case EFFECT_TERRAIN_PULSE: if (state == MON_IN_BATTLE) { - if (IsBattlerTerrainAffected(battler, STATUS_FIELD_TERRAIN_ANY)) + if (IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler), STATUS_FIELD_TERRAIN_ANY)) { if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) return TYPE_ELECTRIC; @@ -6014,7 +6080,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState { u32 ateType = TrySetAteType(move, battler, ability); if (ateType != TYPE_NONE && state == MON_IN_BATTLE) - gBattleStruct->ateBoost[battler] = TRUE; + gBattleStruct->battlerState[battler].ateBoost = TRUE; return ateType; } else if (moveEffect != EFFECT_CHANGE_TYPE_ON_ITEM @@ -6026,7 +6092,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState && gimmick != GIMMICK_Z_MOVE) { if (state == MON_IN_BATTLE && gimmick != GIMMICK_DYNAMAX) - gBattleStruct->ateBoost[battler] = TRUE; + gBattleStruct->battlerState[battler].ateBoost = TRUE; return TYPE_NORMAL; } @@ -6035,12 +6101,12 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState void SetTypeBeforeUsingMove(u32 move, u32 battler) { - u32 moveType; + enum Type moveType; u32 heldItem = gBattleMons[battler].item; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); gBattleStruct->dynamicMoveType = 0; - gBattleStruct->ateBoost[battler] = FALSE; + gBattleStruct->battlerState[battler].ateBoost = FALSE; gSpecialStatuses[battler].gemBoost = FALSE; moveType = GetDynamicMoveType(GetBattlerMon(battler), @@ -6052,7 +6118,8 @@ void SetTypeBeforeUsingMove(u32 move, u32 battler) gBattleStruct->dynamicMoveType = moveType | F_DYNAMIC_TYPE_SET; moveType = GetBattleMoveType(move); - if ((gFieldStatuses & STATUS_FIELD_ION_DELUGE && moveType == TYPE_NORMAL) || gStatuses4[battler] & STATUS4_ELECTRIFIED) + if ((gFieldStatuses & STATUS_FIELD_ION_DELUGE && moveType == TYPE_NORMAL) + || gBattleMons[battler].volatiles.electrified) gBattleStruct->dynamicMoveType = TYPE_ELECTRIC | F_DYNAMIC_TYPE_SET; // Check if a gem should activate. @@ -6061,7 +6128,7 @@ void SetTypeBeforeUsingMove(u32 move, u32 battler) && GetBattleMoveType(move) == GetItemSecondaryId(heldItem) && effect != EFFECT_PLEDGE && effect != EFFECT_OHKO - && effect != EFFECT_STRUGGLE) + && effect != EFFECT_SHEER_COLD) { gSpecialStatuses[battler].gemParam = GetBattlerHoldEffectParam(battler); gSpecialStatuses[battler].gemBoost = TRUE; @@ -6127,3 +6194,10 @@ bool32 DidPlayerForfeitNormalTrainerBattle(void) return (gBattleOutcome == B_OUTCOME_FORFEITED); } + +// Wins the battle instantly. Used in the battle debug with LIST_ITEM_INSTANT_WIN +void BattleDebug_WonBattle(void) +{ + gBattleOutcome |= B_OUTCOME_WON; + gBattleMainFunc = sEndTurnFuncsTable[gBattleOutcome & 0x7F]; +} diff --git a/src/battle_message.c b/src/battle_message.c index 78708d47d6aa..1d73aed23074 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -67,7 +67,7 @@ const u8 gText_PkmnsXPreventsSwitching[] = _("{B_BUFF1} is preventing switching const u8 gText_StatSharply[] = _("sharply "); const u8 gText_StatRose[] = _("rose!"); const u8 gText_StatFell[] = _("fell!"); -const u8 gText_DefendersStatRose[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}"); +const u8 gText_DefendersStatRose[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}rose!"); static const u8 sText_GotAwaySafely[] = _("{PLAY_SE SE_FLEE}You got away safely!\p"); static const u8 sText_PlayerDefeatedLinkTrainer[] = _("You defeated {B_LINK_OPPONENT1_NAME}!"); static const u8 sText_TwoLinkTrainersDefeated[] = _("You defeated {B_LINK_OPPONENT1_NAME} and {B_LINK_OPPONENT2_NAME}!"); @@ -108,6 +108,7 @@ static const u8 sText_PkmnComeBack[] = _("{B_BUFF1}, come back!"); static const u8 sText_PkmnOkComeBack[] = _("OK, {B_BUFF1}! Come back!"); static const u8 sText_PkmnGoodComeBack[] = _("Good job, {B_BUFF1}! Come back!"); static const u8 sText_Trainer1WithdrewPkmn[] = _("{B_TRAINER1_NAME_WITH_CLASS} withdrew {B_BUFF1}!"); +static const u8 sText_Trainer2WithdrewPkmn[] = _("{B_TRAINER2_NAME_WITH_CLASS} withdrew {B_BUFF1}!"); static const u8 sText_LinkTrainer1WithdrewPkmn[] = _("{B_LINK_OPPONENT1_NAME} withdrew {B_BUFF1}!"); static const u8 sText_LinkTrainer2WithdrewPkmn[] = _("{B_LINK_SCR_TRAINER_NAME} withdrew {B_BUFF1}!"); static const u8 sText_WildPkmnPrefix[] = _("The wild "); @@ -187,22 +188,18 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_STATSWONTINCREASE2] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s stats won't go any higher!"), [STRINGID_AVOIDEDDAMAGE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} avoided damage with {B_DEF_ABILITY}!"), //not in gen 5+, ability popup [STRINGID_ITDOESNTAFFECT] = COMPOUND_STRING("It doesn't affect {B_DEF_NAME_WITH_PREFIX2}…"), - [STRINGID_ATTACKERFAINTED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} fainted!\p"), - [STRINGID_TARGETFAINTED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} fainted!\p"), + [STRINGID_BATTLERFAINTED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} fainted!\p"), [STRINGID_PLAYERGOTMONEY] = COMPOUND_STRING("You got Β₯{B_BUFF1} for winning!\p"), [STRINGID_PLAYERWHITEOUT] = COMPOUND_STRING("You have no more PokΓ©mon that can fight!\p"), -#if B_WHITEOUT_MONEY >= GEN_4 - [STRINGID_PLAYERWHITEOUT2] = COMPOUND_STRING("You panicked and dropped Β₯{B_BUFF1}…\pYou were overwhelmed by your defeat!{PAUSE_UNTIL_PRESS}"), -#else - [STRINGID_PLAYERWHITEOUT2] = COMPOUND_STRING("You were overwhelmed by your defeat!{PAUSE_UNTIL_PRESS}"), -#endif - [STRINGID_PREVENTSESCAPE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} prevents escape with {B_SCR_ACTIVE_ABILITY}!\p"), + [STRINGID_PLAYERWHITEOUT2_WILD] = COMPOUND_STRING("You panicked and dropped Β₯{B_BUFF1}…"), + [STRINGID_PLAYERWHITEOUT2_TRAINER] = COMPOUND_STRING("You gave Β₯{B_BUFF1} to the winner…"), + [STRINGID_PLAYERWHITEOUT3] = COMPOUND_STRING("You were overwhelmed by your defeat!"), + [STRINGID_PREVENTSESCAPE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} prevents escape with {B_SCR_ABILITY}!\p"), [STRINGID_HITXTIMES] = COMPOUND_STRING("The PokΓ©mon was hit {B_BUFF1} time(s)!"), //SV has dynamic plural here [STRINGID_PKMNFELLASLEEP] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} fell asleep!"), [STRINGID_PKMNMADESLEEP] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_BUFF1} made {B_EFF_NAME_WITH_PREFIX2} sleep!"), //not in gen 5+, ability popup [STRINGID_PKMNALREADYASLEEP] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is already asleep!"), [STRINGID_PKMNALREADYASLEEP2] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is already asleep!"), - [STRINGID_PKMNWASNTAFFECTED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} wasn't affected!"), //not in gen 5+, ability popup [STRINGID_PKMNWASPOISONED] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} was poisoned!"), [STRINGID_PKMNPOISONEDBY] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} was poisoned by {B_SCR_NAME_WITH_PREFIX2}'s {B_BUFF1}!"), //not in gen 5+, ability popup [STRINGID_PKMNHURTBYPOISON] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} was hurt by its poisoning!"), @@ -223,11 +220,8 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNISPARALYZED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} couldn't move because it's paralyzed!"), [STRINGID_PKMNISALREADYPARALYZED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is already paralyzed!"), [STRINGID_PKMNHEALEDPARALYSIS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} was cured of paralysis!"), - [STRINGID_PKMNDREAMEATEN] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s dream was eaten!"), //not in gen 5+, expansion doesn't use anymore [STRINGID_STATSWONTINCREASE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} won't go any higher!"), [STRINGID_STATSWONTDECREASE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1} won't go any lower!"), - [STRINGID_TEAMSTOPPEDWORKING] = COMPOUND_STRING("Your team's {B_BUFF1} stopped working!"), //unused - [STRINGID_FOESTOPPEDWORKING] = COMPOUND_STRING("The foe's {B_BUFF1} stopped working!"), //unused [STRINGID_PKMNISCONFUSED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is confused!"), [STRINGID_PKMNHEALEDCONFUSION] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} snapped out of its confusion!"), [STRINGID_PKMNWASCONFUSED] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} became confused!"), @@ -235,7 +229,6 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNFELLINLOVE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} fell in love!"), [STRINGID_PKMNINLOVE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is in love with {B_SCR_NAME_WITH_PREFIX2}!"), [STRINGID_PKMNIMMOBILIZEDBYLOVE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is immobilized by love!"), - [STRINGID_PKMNBLOWNAWAY] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} was blown away!"), //unused [STRINGID_PKMNCHANGEDTYPE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} transformed into the {B_BUFF1} type!"), [STRINGID_PKMNFLINCHED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} flinched and couldn't move!"), [STRINGID_PKMNREGAINEDHEALTH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s HP was restored."), @@ -273,13 +266,12 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNFASTASLEEP] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is fast asleep."), [STRINGID_PKMNWOKEUP] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} woke up!"), [STRINGID_PKMNUPROARKEPTAWAKE] = COMPOUND_STRING("But the uproar kept {B_SCR_NAME_WITH_PREFIX2} awake!"), - [STRINGID_PKMNWOKEUPINUPROAR] = COMPOUND_STRING("The uproar woke {B_ATK_NAME_WITH_PREFIX2}!"), + [STRINGID_PKMNWOKEUPINUPROAR] = COMPOUND_STRING("The uproar woke {B_EFF_NAME_WITH_PREFIX2}!"), [STRINGID_PKMNCAUSEDUPROAR] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} caused an uproar!"), [STRINGID_PKMNMAKINGUPROAR] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is making an uproar!"), [STRINGID_PKMNCALMEDDOWN] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} calmed down."), [STRINGID_PKMNCANTSLEEPINUPROAR] = COMPOUND_STRING("But {B_DEF_NAME_WITH_PREFIX2} can't sleep in an uproar!"), [STRINGID_PKMNSTOCKPILED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} stockpiled {B_BUFF1}!"), - [STRINGID_PKMNCANTSTOCKPILE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} can't stockpile any more!"), //I think this was replaced with just "But it failed!" [STRINGID_PKMNCANTSLEEPINUPROAR2] = COMPOUND_STRING("But {B_DEF_NAME_WITH_PREFIX2} can't sleep in an uproar!"), [STRINGID_UPROARKEPTPKMNAWAKE] = COMPOUND_STRING("But the uproar kept {B_DEF_NAME_WITH_PREFIX2} awake!"), [STRINGID_PKMNSTAYEDAWAKEUSING] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} stayed awake using its {B_DEF_ABILITY}!"), //not in gen 5+, ability popup @@ -297,15 +289,16 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNRAGEBUILDING] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s rage is building!"), [STRINGID_PKMNMOVEWASDISABLED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1} was disabled!"), [STRINGID_PKMNMOVEISDISABLED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_CURRENT_MOVE} is disabled!\p"), - [STRINGID_PKMNMOVEDISABLEDNOMORE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s move is no longer disabled!"), + [STRINGID_PKMNMOVEDISABLEDNOMORE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s move is no longer disabled!"), [STRINGID_PKMNGOTENCORE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} must do an encore!"), - [STRINGID_PKMNENCOREENDED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} ended its encore!"), + [STRINGID_PKMNGOTENCOREDMOVE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} can only use {B_CURRENT_MOVE}!\p"), + [STRINGID_PKMNENCOREENDED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} ended its encore!"), [STRINGID_PKMNTOOKAIM] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} took aim at {B_DEF_NAME_WITH_PREFIX2}!"), [STRINGID_PKMNSKETCHEDMOVE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} sketched {B_BUFF1}!"), [STRINGID_PKMNTRYINGTOTAKEFOE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is hoping to take its attacker down with it!"), [STRINGID_PKMNTOOKFOE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} took its attacker down with it!"), [STRINGID_PKMNREDUCEDPP] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s PP was reduced!"), - [STRINGID_PKMNSTOLEITEM] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} stole {B_DEF_NAME_WITH_PREFIX2}'s {B_LAST_ITEM}!"), + [STRINGID_PKMNSTOLEITEM] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} stole {B_EFF_NAME_WITH_PREFIX2}'s {B_LAST_ITEM}!"), [STRINGID_TARGETCANTESCAPENOW] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} can no longer escape!"), [STRINGID_PKMNFELLINTONIGHTMARE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} began having a nightmare!"), [STRINGID_PKMNLOCKEDINNIGHTMARE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is locked in a nightmare!"), @@ -319,14 +312,14 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNENDUREDHIT] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} endured the hit!"), [STRINGID_MAGNITUDESTRENGTH] = COMPOUND_STRING("Magnitude {B_BUFF1}!"), [STRINGID_PKMNCUTHPMAXEDATTACK] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} cut its own HP and maximized its Attack!"), - [STRINGID_PKMNCOPIEDSTATCHANGES] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} copied {B_DEF_NAME_WITH_PREFIX2}'s stat changes!"), + [STRINGID_PKMNCOPIEDSTATCHANGES] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} copied {B_EFF_NAME_WITH_PREFIX2}'s stat changes!"), [STRINGID_PKMNGOTFREE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} got free of {B_DEF_NAME_WITH_PREFIX2}'s {B_BUFF1}!"), //not in gen 5+, generic rapid spin? [STRINGID_PKMNSHEDLEECHSEED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} shed Leech Seed!"), //not in gen 5+, generic rapid spin? [STRINGID_PKMNBLEWAWAYSPIKES] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} blew away Spikes!"), //not in gen 5+, generic rapid spin? [STRINGID_PKMNFLEDFROMBATTLE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} fled from battle!"), [STRINGID_PKMNFORESAWATTACK] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} foresaw an attack!"), [STRINGID_PKMNTOOKATTACK] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} took the {B_BUFF1} attack!"), - [STRINGID_PKMNATTACK] = COMPOUND_STRING("{B_BUFF1}'s attack!"), //not in gen 5+, expansion doesn't use anymore + [STRINGID_PKMNATTACK] = COMPOUND_STRING("{B_BUFF1}'s attack!"), //not in gen 5+ [STRINGID_PKMNCENTERATTENTION] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} became the center of attention!"), [STRINGID_PKMNCHARGINGPOWER] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} began charging power!"), [STRINGID_NATUREPOWERTURNEDINTO] = COMPOUND_STRING("Nature Power turned into {B_CURRENT_MOVE}!"), @@ -340,7 +333,6 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNREADYTOHELP] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is ready to help {B_DEF_NAME_WITH_PREFIX2}!"), [STRINGID_PKMNSWITCHEDITEMS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} switched items with its target!"), [STRINGID_PKMNCOPIEDFOE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} copied {B_DEF_NAME_WITH_PREFIX2}'s Ability!"), - [STRINGID_PKMNMADEWISH] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} made a wish!"), //unused [STRINGID_PKMNWISHCAMETRUE] = COMPOUND_STRING("{B_BUFF1}'s wish came true!"), [STRINGID_PKMNPLANTEDROOTS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} planted its roots!"), [STRINGID_PKMNABSORBEDNUTRIENTS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} absorbed nutrients with its roots!"), @@ -356,30 +348,27 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNMOVEBOUNCED] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} bounced the {B_CURRENT_MOVE} back!"), [STRINGID_PKMNWAITSFORTARGET] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} waits for a target to make a move!"), [STRINGID_PKMNSNATCHEDMOVE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} snatched {B_SCR_NAME_WITH_PREFIX2}'s move!"), - [STRINGID_PKMNMADEITRAIN] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} made it rain!"), //not in gen 5+, ability popup - [STRINGID_PKMNRAISEDSPEED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} raised its Speed!"), //not in gen 5+, ability popup + [STRINGID_PKMNMADEITRAIN] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} made it rain!"), //not in gen 5+, ability popup [STRINGID_PKMNPROTECTEDBY] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} was protected by {B_DEF_ABILITY}!"), //not in gen 5+, ability popup [STRINGID_PKMNPREVENTSUSAGE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} prevents {B_ATK_NAME_WITH_PREFIX2} from using {B_CURRENT_MOVE}!"), //I don't see this in SV text [STRINGID_PKMNRESTOREDHPUSING] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} restored HP using its {B_DEF_ABILITY}!"), //not in gen 5+, ability popup - [STRINGID_PKMNCHANGEDTYPEWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} made it the {B_BUFF1} type!"), //not in gen 5+, ability popup - [STRINGID_PKMNPREVENTSPARALYSISWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_LAST_ABILITY} prevents paralysis!"), //not in gen 5+, ability popup + [STRINGID_PKMNCHANGEDTYPEWITH] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX}'s {B_EFF_ABILITY} made it the {B_BUFF1} type!"), //not in gen 5+, ability popup [STRINGID_PKMNPREVENTSROMANCEWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} prevents romance!"), //not in gen 5+, ability popup - [STRINGID_PKMNPREVENTSPOISONINGWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_LAST_ABILITY} prevents poisoning!"), //not in gen 5+, ability popup - [STRINGID_PKMNPREVENTSCONFUSIONWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} prevents confusion!"), //not in gen 5+, ability popup + [STRINGID_PKMNPREVENTSCONFUSIONWITH] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} prevents confusion!"), //not in gen 5+, ability popup [STRINGID_PKMNRAISEDFIREPOWERWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} raised the power of Fire-type moves!"), //not in gen 5+, ability popup [STRINGID_PKMNANCHORSITSELFWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} anchors itself with {B_DEF_ABILITY}!"), //not in gen 5+, ability popup - [STRINGID_PKMNCUTSATTACKWITH] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} cuts {B_DEF_NAME_WITH_PREFIX2}'s Attack!"), //not in gen 5+, ability popup - [STRINGID_PKMNPREVENTSSTATLOSSWITH] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} prevents stat loss!"), //not in gen 5+, ability popup + [STRINGID_PKMNCUTSATTACKWITH] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} cuts {B_DEF_NAME_WITH_PREFIX2}'s Attack!"), //not in gen 5+, ability popup + [STRINGID_PKMNPREVENTSSTATLOSSWITH] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} prevents stat loss!"), //not in gen 5+, ability popup [STRINGID_PKMNHURTSWITH] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} was hurt by {B_DEF_NAME_WITH_PREFIX2}'s {B_BUFF1}!"), [STRINGID_PKMNTRACED] = COMPOUND_STRING("It traced {B_BUFF1}'s {B_BUFF2}!"), [STRINGID_STATSHARPLY] = gText_StatSharply, [STRINGID_STATROSE] = gText_StatRose, [STRINGID_STATHARSHLY] = COMPOUND_STRING("harshly "), [STRINGID_STATFELL] = gText_StatFell, - [STRINGID_ATTACKERSSTATROSE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}"), + [STRINGID_ATTACKERSSTATROSE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}rose!"), [STRINGID_DEFENDERSSTATROSE] = gText_DefendersStatRose, - [STRINGID_ATTACKERSSTATFELL] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}"), - [STRINGID_DEFENDERSSTATFELL] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}"), + [STRINGID_ATTACKERSSTATFELL] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}fell!"), + [STRINGID_DEFENDERSSTATFELL] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}fell!"), [STRINGID_CRITICALHIT] = COMPOUND_STRING("A critical hit!"), [STRINGID_ONEHITKO] = COMPOUND_STRING("It's a one-hit KO!"), [STRINGID_123POOF] = COMPOUND_STRING("One…{PAUSE 10}two…{PAUSE 10}and…{PAUSE 10}{PAUSE 20}{PLAY_SE SE_BALL_BOUNCE_1}ta-da!\p"), @@ -394,7 +383,6 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_BUTNOTHINGHAPPENED] = COMPOUND_STRING("But nothing happened!"), [STRINGID_BUTITFAILED] = COMPOUND_STRING("But it failed!"), [STRINGID_ITHURTCONFUSION] = COMPOUND_STRING("It hurt itself in its confusion!"), - [STRINGID_MIRRORMOVEFAILED] = COMPOUND_STRING("The Mirror Move failed!"), //not in gen 5+, uses "but it failed" [STRINGID_STARTEDTORAIN] = COMPOUND_STRING("It started to rain!"), [STRINGID_DOWNPOURSTARTED] = COMPOUND_STRING("A downpour started!"), // corresponds to DownpourText in pokegold and pokecrystal and is used by Rain Dance in GSC [STRINGID_RAINCONTINUES] = COMPOUND_STRING("Rain continues to fall."), //not in gen 5+ @@ -409,9 +397,6 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_STARTEDHAIL] = COMPOUND_STRING("It started to hail!"), [STRINGID_HAILCONTINUES] = COMPOUND_STRING("The hail is crashing down."), [STRINGID_HAILSTOPPED] = COMPOUND_STRING("The hail stopped."), - [STRINGID_FAILEDTOSPITUP] = COMPOUND_STRING("But it failed to spit up a thing!"), //not in gen 5+, uses "but it failed" - [STRINGID_FAILEDTOSWALLOW] = COMPOUND_STRING("But it failed to swallow a thing!"), //not in gen 5+, uses "but it failed" - [STRINGID_WINDBECAMEHEATWAVE] = COMPOUND_STRING("The wind turned into a Heat Wave!"), //unused [STRINGID_STATCHANGESGONE] = COMPOUND_STRING("All stat changes were eliminated!"), [STRINGID_COINSSCATTERED] = COMPOUND_STRING("Coins were scattered everywhere!"), [STRINGID_TOOWEAKFORSUBSTITUTE] = COMPOUND_STRING("But it does not have enough HP left to make a substitute!"), @@ -468,14 +453,13 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_ITEMALLOWSONLYYMOVE] = COMPOUND_STRING("{B_LAST_ITEM} only allows the use of {B_CURRENT_MOVE}!\p"), [STRINGID_PKMNHUNGONWITHX] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} hung on using its {B_LAST_ITEM}!"), [STRINGID_EMPTYSTRING3] = gText_EmptyString3, - [STRINGID_PKMNSXPREVENTSBURNS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_LAST_ABILITY} prevents burns!"), //not in gen 5+, ability popup [STRINGID_PKMNSXBLOCKSY] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} blocks {B_CURRENT_MOVE}!"), //not in gen 5+, ability popup [STRINGID_PKMNSXRESTOREDHPALITTLE2] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} restored its HP a little!"), //not in gen 5+, ability popup - [STRINGID_PKMNSXWHIPPEDUPSANDSTORM] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} whipped up a sandstorm!"), //not in gen 5+, ability popup - [STRINGID_PKMNSXPREVENTSYLOSS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} prevents {B_BUFF1} loss!"), //not in gen 5+, ability popup + [STRINGID_PKMNSXWHIPPEDUPSANDSTORM] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} whipped up a sandstorm!"), //not in gen 5+, ability popup + [STRINGID_PKMNSXPREVENTSYLOSS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} prevents {B_BUFF1} loss!"), //not in gen 5+, ability popup [STRINGID_PKMNSXINFATUATEDY] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} infatuated {B_ATK_NAME_WITH_PREFIX2}!"), //not in gen 5+, ability popup [STRINGID_PKMNSXMADEYINEFFECTIVE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} made {B_CURRENT_MOVE} ineffective!"), //not in gen 5+, ability popup - [STRINGID_PKMNSXCUREDYPROBLEM] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} cured its {B_BUFF1} problem!"), //not in gen 5+, ability popup + [STRINGID_PKMNSXCUREDYPROBLEM] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} cured its {B_BUFF1} problem!"), //not in gen 5+, ability popup [STRINGID_ITSUCKEDLIQUIDOOZE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} sucked up the liquid ooze!"), [STRINGID_PKMNTRANSFORMED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} transformed!"), [STRINGID_ELECTRICITYWEAKENED] = COMPOUND_STRING("Electricity's power was weakened!"), @@ -487,14 +471,14 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PLAYERDEFEATEDTRAINER1] = sText_PlayerDefeatedLinkTrainerTrainer1, [STRINGID_SOOTHINGAROMA] = COMPOUND_STRING("A soothing aroma wafted through the area!"), [STRINGID_ITEMSCANTBEUSEDNOW] = COMPOUND_STRING("Items can't be used now.{PAUSE 64}"), //not in gen 5+, i think - [STRINGID_FORXCOMMAYZ] = COMPOUND_STRING("For {B_SCR_NAME_WITH_PREFIX2}, {B_LAST_ITEM} {B_BUFF1}"), //not in gen 5+, expansion doesn't use anymore - [STRINGID_USINGITEMSTATOFPKMNROSE] = COMPOUND_STRING("Using {B_LAST_ITEM}, the {B_BUFF1} of {B_SCR_NAME_WITH_PREFIX2} {B_BUFF2}"), //todo: update this, will require code changes + [STRINGID_USINGITEMSTATOFPKMNROSE] = COMPOUND_STRING("Using {B_LAST_ITEM}, the {B_BUFF1} of {B_SCR_NAME_WITH_PREFIX2} {B_BUFF2}rose!"), //todo: update this, will require code changes + [STRINGID_USINGITEMSTATOFPKMNFELL] = COMPOUND_STRING("Using {B_LAST_ITEM}, the {B_BUFF1} of {B_SCR_NAME_WITH_PREFIX2} {B_BUFF2}fell!"), [STRINGID_PKMNUSEDXTOGETPUMPED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} used the {B_LAST_ITEM} to get pumped!"), [STRINGID_PKMNSXMADEYUSELESS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} made {B_CURRENT_MOVE} useless!"), //not in gen 5+, ability popup [STRINGID_PKMNTRAPPEDBYSANDTOMB] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} became trapped by the quicksand!"), [STRINGID_EMPTYSTRING4] = COMPOUND_STRING(""), [STRINGID_ABOOSTED] = COMPOUND_STRING(" a boosted"), - [STRINGID_PKMNSXINTENSIFIEDSUN] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} intensified the sun's rays!"), //not in gen 5+, ability popup + [STRINGID_PKMNSXINTENSIFIEDSUN] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} intensified the sun's rays!"), //not in gen 5+, ability popup [STRINGID_PKMNMAKESGROUNDMISS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} makes Ground-type moves miss with {B_DEF_ABILITY}!"), //not in gen 5+, ability popup [STRINGID_YOUTHROWABALLNOWRIGHT] = COMPOUND_STRING("You throw a Ball now, right? I… I'll do my best!"), [STRINGID_PKMNSXTOOKATTACK] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} took the attack!"), //In gen 5+ but without naming the ability @@ -504,28 +488,23 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNFLEDUSINGITS] = COMPOUND_STRING("{PLAY_SE SE_FLEE}{B_ATK_NAME_WITH_PREFIX} fled using its {B_LAST_ITEM}!\p"), [STRINGID_PKMNFLEDUSING] = COMPOUND_STRING("{PLAY_SE SE_FLEE}{B_ATK_NAME_WITH_PREFIX} fled using {B_ATK_ABILITY}!\p"), //not in gen 5+ [STRINGID_PKMNWASDRAGGEDOUT] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} was dragged out!\p"), - [STRINGID_PREVENTEDFROMWORKING] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} prevented {B_SCR_NAME_WITH_PREFIX2}'s {B_BUFF1} from working!"), //unused [STRINGID_PKMNSITEMNORMALIZEDSTATUS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_LAST_ITEM} normalized its status!"), [STRINGID_TRAINER1USEDITEM] = COMPOUND_STRING("{B_ATK_TRAINER_NAME_WITH_CLASS} used {B_LAST_ITEM}!"), [STRINGID_BOXISFULL] = COMPOUND_STRING("The Box is full! You can't catch any more!\p"), [STRINGID_PKMNAVOIDEDATTACK] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} avoided the attack!"), - [STRINGID_PKMNSXMADEITINEFFECTIVE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} made it ineffective!"), //not in gen 5+, ability popup + [STRINGID_PKMNSXMADEITINEFFECTIVE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} made it ineffective!"), //not in gen 5+, ability popup [STRINGID_PKMNSXPREVENTSFLINCHING] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX}'s {B_EFF_ABILITY} prevents flinching!"), //not in gen 5+, ability popup [STRINGID_PKMNALREADYHASBURN] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is already burned!"), [STRINGID_STATSWONTDECREASE2] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s stats won't go any lower!"), - [STRINGID_PKMNSXBLOCKSY2] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} blocks {B_CURRENT_MOVE}!"), //not in gen 5+, ability popup + [STRINGID_PKMNSXBLOCKSY2] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} blocks {B_CURRENT_MOVE}!"), //not in gen 5+, ability popup [STRINGID_PKMNSXWOREOFF] = COMPOUND_STRING("{B_ATK_TEAM1} team's {B_BUFF1} wore off!"), - [STRINGID_PKMNRAISEDDEFALITTLE] = COMPOUND_STRING("{B_ATK_PREFIX1}'s {B_CURRENT_MOVE} raised DEFENSE a little!"), //expansion doesn't use anymore - [STRINGID_PKMNRAISEDSPDEFALITTLE] = COMPOUND_STRING("{B_ATK_PREFIX1}'s {B_CURRENT_MOVE} raised SP. DEF a little!"), //expansion doesn't use anymore [STRINGID_THEWALLSHATTERED] = COMPOUND_STRING("The wall shattered!"), //not in gen5+, uses "your teams light screen wore off!" etc instead - [STRINGID_PKMNSXPREVENTSYSZ] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} prevents {B_DEF_NAME_WITH_PREFIX2}'s {B_DEF_ABILITY} from working!"), - [STRINGID_PKMNSXCUREDITSYPROBLEM] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} cured its {B_BUFF1} problem!"), //not in gen 5+, ability popup + [STRINGID_PKMNSXCUREDITSYPROBLEM] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} cured its {B_BUFF1} problem!"), //not in gen 5+, ability popup [STRINGID_ATTACKERCANTESCAPE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} can't escape!"), [STRINGID_PKMNOBTAINEDX] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} obtained {B_BUFF1}."), [STRINGID_PKMNOBTAINEDX2] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} obtained {B_BUFF2}."), [STRINGID_PKMNOBTAINEDXYOBTAINEDZ] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} obtained {B_BUFF1}.\p{B_DEF_NAME_WITH_PREFIX} obtained {B_BUFF2}."), [STRINGID_BUTNOEFFECT] = COMPOUND_STRING("But it had no effect!"), - [STRINGID_PKMNSXHADNOEFFECTONY] = COMPOUND_STRING("Target protected by {B_LAST_ABILITY}!"), //not in gen 5+, ability popup [STRINGID_TWOENEMIESDEFEATED] = sText_TwoInGameTrainersDefeated, [STRINGID_TRAINER2LOSETEXT] = COMPOUND_STRING("{B_TRAINER2_LOSE_TEXT}"), [STRINGID_PKMNINCAPABLEOFPOWER] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} appears incapable of using its power!"), @@ -584,10 +563,8 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_FELLSTRAIGHTDOWN] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} fell straight down!"), [STRINGID_TARGETCHANGEDTYPE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} transformed into the {B_BUFF1} type!"), [STRINGID_PKMNACQUIREDSIMPLE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} acquired Simple!"), //shouldn't directly use the name - [STRINGID_EMPTYSTRING5] = sText_EmptyString4, [STRINGID_KINDOFFER] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} took the kind offer!"), [STRINGID_RESETSTARGETSSTATLEVELS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s stat changes were removed!"), - [STRINGID_EMPTYSTRING6] = sText_EmptyString4, [STRINGID_ALLYSWITCHPOSITION] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} and {B_SCR_NAME_WITH_PREFIX2} switched places!"), [STRINGID_RESTORETARGETSHEALTH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s HP was restored!"), [STRINGID_TOOKPJMNINTOTHESKY] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} took {B_DEF_NAME_WITH_PREFIX2} into the sky!"), @@ -597,7 +574,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_TRANSFERHELDITEM] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} received {B_LAST_ITEM} from {B_ATK_NAME_WITH_PREFIX2}"), [STRINGID_EMBARGOENDS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} can use items again!"), [STRINGID_ELECTROMAGNETISM] = COMPOUND_STRING("electromagnetism"), - [STRINGID_BUFFERENDS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} wore off!"), + [STRINGID_BUFFERENDS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_BUFF1} wore off!"), [STRINGID_TELEKINESISENDS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} was freed from the telekinesis!"), [STRINGID_TAILWINDENDS] = COMPOUND_STRING("{B_ATK_TEAM1} team's Tailwind petered out!"), [STRINGID_LUCKYCHANTENDS] = COMPOUND_STRING("{B_ATK_TEAM1} team's Lucky Chant wore off!"), @@ -612,9 +589,9 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_MISTYTERRAINENDS] = COMPOUND_STRING("The mist disappeared from the battlefield."), [STRINGID_PSYCHICTERRAINENDS] = COMPOUND_STRING("The weirdness disappeared from the battlefield!"), [STRINGID_GRASSYTERRAINENDS] = COMPOUND_STRING("The grass disappeared from the battlefield."), - [STRINGID_TARGETABILITYSTATRAISE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} raised its {B_BUFF1}!"), + [STRINGID_TARGETABILITYSTATRAISE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} {B_BUFF2}raised its {B_BUFF1}!"), [STRINGID_TARGETSSTATWASMAXEDOUT] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} maxed its {B_BUFF1}!"), - [STRINGID_ATTACKERABILITYSTATRAISE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} raised its {B_BUFF1}!"), + [STRINGID_ATTACKERABILITYSTATRAISE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} {B_BUFF2}raised its {B_BUFF1}!"), [STRINGID_POISONHEALHPUP] = COMPOUND_STRING("The poisoning healed {B_ATK_NAME_WITH_PREFIX2} a little bit!"), //don't think this message is displayed anymore [STRINGID_BADDREAMSDMG] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is tormented!"), [STRINGID_MOLDBREAKERENTERS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} breaks the mold!"), @@ -625,26 +602,26 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_SOLARPOWERHPDROP] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} takes its toll!"), //don't think this message is displayed anymore [STRINGID_AFTERMATHDMG] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} was hurt!"), [STRINGID_ANTICIPATIONACTIVATES] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} shuddered!"), - [STRINGID_FOREWARNACTIVATES] = COMPOUND_STRING("{B_SCR_ACTIVE_ABILITY} alerted {B_SCR_NAME_WITH_PREFIX2} to {B_DEF_NAME_WITH_PREFIX2}'s {B_BUFF1}!"), + [STRINGID_FOREWARNACTIVATES] = COMPOUND_STRING("{B_SCR_ABILITY} alerted {B_SCR_NAME_WITH_PREFIX2} to {B_EFF_NAME_WITH_PREFIX2}'s {B_BUFF1}!"), [STRINGID_ICEBODYHPGAIN] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} healed it a little bit!"), //don't think this message is displayed anymore [STRINGID_SNOWWARNINGHAIL] = COMPOUND_STRING("It started to hail!"), [STRINGID_FRISKACTIVATES] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} frisked {B_DEF_NAME_WITH_PREFIX2} and found its {B_LAST_ITEM}!"), - [STRINGID_UNNERVEENTERS] = COMPOUND_STRING("{B_DEF_TEAM1} team is too nervous to eat Berries!"), + [STRINGID_UNNERVEENTERS] = COMPOUND_STRING("{B_EFF_TEAM1} team is too nervous to eat Berries!"), [STRINGID_HARVESTBERRY] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} harvested its {B_LAST_ITEM}!"), [STRINGID_MAGICBOUNCEACTIVATES] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} bounced the {B_ATK_NAME_WITH_PREFIX2} back!"), [STRINGID_PROTEANTYPECHANGE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} transformed it into the {B_BUFF1} type!"), [STRINGID_SYMBIOSISITEMPASS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} passed its {B_LAST_ITEM} to {B_EFF_NAME_WITH_PREFIX2} through {B_LAST_ABILITY}!"), [STRINGID_STEALTHROCKDMG] = COMPOUND_STRING("Pointed stones dug into {B_SCR_NAME_WITH_PREFIX2}!"), - [STRINGID_TOXICSPIKESABSORBED] = COMPOUND_STRING("The poison spikes disappeared from the ground around {B_SCR_TEAM2} team!"), + [STRINGID_TOXICSPIKESABSORBED] = COMPOUND_STRING("The poison spikes disappeared from the ground around {B_EFF_TEAM2} team!"), [STRINGID_TOXICSPIKESPOISONED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} was poisoned!"), [STRINGID_TOXICSPIKESBADLYPOISONED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} was badly poisoned!"), [STRINGID_STICKYWEBSWITCHIN] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} was caught in a sticky web!"), [STRINGID_HEALINGWISHCAMETRUE] = COMPOUND_STRING("The healing wish came true for {B_ATK_NAME_WITH_PREFIX2}!"), [STRINGID_HEALINGWISHHEALED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} regained health!"), [STRINGID_LUNARDANCECAMETRUE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} became cloaked in mystical moonlight!"), - [STRINGID_CUSEDBODYDISABLED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} was disabled by {B_DEF_NAME_WITH_PREFIX2}'s {B_DEF_ABILITY}!"), + [STRINGID_CURSEDBODYDISABLED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} was disabled by {B_DEF_NAME_WITH_PREFIX2}'s {B_DEF_ABILITY}!"), [STRINGID_ATTACKERACQUIREDABILITY] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} acquired {B_ATK_ABILITY}!"), - [STRINGID_TARGETABILITYSTATLOWER] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} lowered its {B_BUFF1}!"), + [STRINGID_TARGETABILITYSTATLOWER] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} {B_BUFF2}lowered its {B_BUFF1}!"), [STRINGID_TARGETSTATWONTGOHIGHER] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1} won't go any higher!"), [STRINGID_PKMNMOVEBOUNCEDABILITY] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_CURRENT_MOVE} was bounced back by {B_DEF_NAME_WITH_PREFIX2}'s {B_DEF_ABILITY}!"), [STRINGID_IMPOSTERTRANSFORM] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} transformed into {B_DEF_NAME_WITH_PREFIX2} using {B_LAST_ABILITY}!"), @@ -683,13 +660,13 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_MISTYTERRAINPREVENTS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} surrounds itself with a protective mist!"), [STRINGID_GRASSYTERRAINHEALS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is healed by the grassy terrain!"), [STRINGID_ELECTRICTERRAINPREVENTS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} surrounds itself with electrified terrain!"), - [STRINGID_PSYCHICTERRAINPREVENTS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} surrounds itself with psychic terrain!"), + [STRINGID_PSYCHICTERRAINPREVENTS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is protected by the Psychic Terrain!"), [STRINGID_SAFETYGOGGLESPROTECTED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is not affected thanks to its {B_LAST_ITEM}!"), [STRINGID_FLOWERVEILPROTECTED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} surrounded itself with a veil of petals!"), [STRINGID_SWEETVEILPROTECTED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} can't fall asleep due to a veil of sweetness!"), [STRINGID_AROMAVEILPROTECTED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is protected by an aromatic veil!"), [STRINGID_CELEBRATEMESSAGE] = COMPOUND_STRING("Congratulations, {B_PLAYER_NAME}!"), - [STRINGID_USEDINSTRUCTEDMOVE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} followed {B_BUFF1}'s instructions!"), + [STRINGID_USEDINSTRUCTEDMOVE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} followed {B_SCR_NAME_WITH_PREFIX2}'s instructions!"), [STRINGID_THROATCHOPENDS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} can use sound-based moves again!"), [STRINGID_PKMNCANTUSEMOVETHROATCHOP] = COMPOUND_STRING("The effects of Throat Chop prevent {B_ATK_NAME_WITH_PREFIX2} from using certain moves!\p"), [STRINGID_LASERFOCUS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} concentrated intensely!"), @@ -703,11 +680,11 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_ATTACKERCUREDTARGETSTATUS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} cured {B_DEF_NAME_WITH_PREFIX2}'s problem!"), [STRINGID_ATTACKERLOSTFIRETYPE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} burned itself out!"), [STRINGID_HEALERCURE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_LAST_ABILITY} cured {B_SCR_NAME_WITH_PREFIX2}'s problem!"), - [STRINGID_SCRIPTINGABILITYSTATRAISE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} raised its {B_BUFF1}!"), - [STRINGID_RECEIVERABILITYTAKEOVER] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} was taken over!"), + [STRINGID_SCRIPTINGABILITYSTATRAISE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} {B_BUFF2}raised its {B_BUFF1}!"), + [STRINGID_RECEIVERABILITYTAKEOVER] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} was taken over!"), [STRINGID_PKNMABSORBINGPOWER] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is absorbing power!"), [STRINGID_NOONEWILLBEABLETORUNAWAY] = COMPOUND_STRING("No one will be able to run away during the next turn!"), - [STRINGID_DESTINYKNOTACTIVATES] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} fell in love because of the {B_LAST_ITEM}!"), + [STRINGID_DESTINYKNOTACTIVATES] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} fell in love because of the {B_LAST_ITEM}!"), [STRINGID_CLOAKEDINAFREEZINGLIGHT] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} became cloaked in a freezing light!"), [STRINGID_CLEARAMULETWONTLOWERSTATS] = COMPOUND_STRING("The effects of the {B_LAST_ITEM} held by {B_SCR_NAME_WITH_PREFIX2} prevents its stats from being lowered!"), [STRINGID_FERVENTWISHREACHED] = COMPOUND_STRING("{B_ATK_TRAINER_NAME}'s fervent wish has reached {B_ATK_NAME_WITH_PREFIX2}!"), @@ -719,10 +696,8 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_COMATOSEENTERS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} is drowsing!"), [STRINGID_SCREENCLEANERENTERS] = COMPOUND_STRING("All screens on the field were cleansed!"), [STRINGID_FETCHEDPOKEBALL] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} found a {B_LAST_ITEM}!"), - [STRINGID_BATTLERABILITYRAISEDSTAT] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} raised its {B_BUFF1}!"), [STRINGID_ASANDSTORMKICKEDUP] = COMPOUND_STRING("A sandstorm kicked up!"), [STRINGID_PKMNSWILLPERISHIN3TURNS] = COMPOUND_STRING("Both PokΓ©mon will perish in three turns!"), //don't think this message is displayed anymore - [STRINGID_ABILITYRAISEDSTATDRASTICALLY] = COMPOUND_STRING("{B_DEF_ABILITY} raised {B_DEF_NAME_WITH_PREFIX2}'s {B_BUFF1} drastically!"), [STRINGID_AURAFLAREDTOLIFE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s aura flared to life!"), [STRINGID_ASONEENTERS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} has two Abilities!"), [STRINGID_CURIOUSMEDICINEENTERS] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX}'s stat changes were removed!"), @@ -735,9 +710,9 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNBURNHEALED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s burn was cured!"), [STRINGID_REDCARDACTIVATE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} held up its Red Card against {B_ATK_NAME_WITH_PREFIX2}!"), [STRINGID_EJECTBUTTONACTIVATE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} is switched out with the {B_LAST_ITEM}!"), - [STRINGID_ATKGOTOVERINFATUATION] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} got over its infatuation!"), - [STRINGID_TORMENTEDNOMORE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is no longer tormented!"), - [STRINGID_HEALBLOCKEDNOMORE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is cured of its heal block!"), + [STRINGID_ATKGOTOVERINFATUATION] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} got over its infatuation!"), + [STRINGID_TORMENTEDNOMORE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} is no longer tormented!"), + [STRINGID_HEALBLOCKEDNOMORE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} is cured of its heal block!"), [STRINGID_ATTACKERBECAMEFULLYCHARGED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} became fully charged due to its bond with its trainer!\p"), [STRINGID_ATTACKERBECAMEASHSPECIES] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} became Ash-Greninja!\p"), [STRINGID_EXTREMELYHARSHSUNLIGHT] = COMPOUND_STRING("The sunlight turned extremely harsh!"), @@ -759,7 +734,6 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_BROKETHROUGHPROTECTION] = COMPOUND_STRING("It broke through {B_DEF_NAME_WITH_PREFIX2}'s protection!"), [STRINGID_ABILITYALLOWSONLYMOVE] = COMPOUND_STRING("{B_ATK_ABILITY} only allows the use of {B_CURRENT_MOVE}!\p"), [STRINGID_SWAPPEDABILITIES] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} swapped Abilities with its target!"), - [STRINGID_PASTELVEILPROTECTED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is protected by a pastel veil!"), [STRINGID_PASTELVEILENTERS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} was cured of its poisoning!"), [STRINGID_BATTLERTYPECHANGEDTO] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s type changed to {B_BUFF1}!"), [STRINGID_BOTHCANNOLONGERESCAPE] = COMPOUND_STRING("Neither PokΓ©mon can run away!"), @@ -775,8 +749,6 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_METEORBEAMCHARGING] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is overflowing with space power!"), [STRINGID_HEATUPBEAK] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} started heating up its beak!"), [STRINGID_COURTCHANGE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} swapped the battle effects affecting each side of the field!"), - [STRINGID_PLAYERLOSTTOENEMYTRAINER] = COMPOUND_STRING("You have no more PokΓ©mon that can fight!\pYou lost to {B_TRAINER1_NAME_WITH_CLASS}!{PAUSE_UNTIL_PRESS}"), - [STRINGID_PLAYERPAIDPRIZEMONEY] = COMPOUND_STRING("You gave Β₯{B_BUFF1} to the winner…\pYou were overwhelmed by your defeat!{PAUSE_UNTIL_PRESS}"), [STRINGID_ZPOWERSURROUNDS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} surrounded itself with its Z-Power!"), [STRINGID_ZMOVEUNLEASHED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} unleashes its full-force Z-Move!"), [STRINGID_ZMOVERESETSSTATS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} returned its decreased stats to normal using its Z-Power!"), @@ -797,9 +769,9 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_SUNLIGHTACTIVATEDABILITY] = COMPOUND_STRING("The harsh sunlight activated {B_SCR_NAME_WITH_PREFIX2}'s Protosynthesis!"), [STRINGID_STATWASHEIGHTENED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_BUFF1} was heightened!"), [STRINGID_ELECTRICTERRAINACTIVATEDABILITY] = COMPOUND_STRING("The Electric Terrain activated {B_SCR_NAME_WITH_PREFIX2}'s Quark Drive!"), - [STRINGID_ABILITYWEAKENEDSURROUNDINGMONSSTAT] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} weakened the {B_BUFF1} of all surrounding PokΓ©mon!\p"), + [STRINGID_ABILITYWEAKENEDSURROUNDINGMONSSTAT] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} weakened the {B_BUFF1} of all surrounding PokΓ©mon!\p"), [STRINGID_ATTACKERGAINEDSTRENGTHFROMTHEFALLEN] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} gained strength from the fallen!"), - [STRINGID_PKMNSABILITYPREVENTSABILITY] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} prevents {B_DEF_NAME_WITH_PREFIX2}'s {B_DEF_ABILITY} from working!"), //not in gen 5+, ability popup + [STRINGID_PKMNSABILITYPREVENTSABILITY] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} prevents {B_DEF_NAME_WITH_PREFIX2}'s {B_DEF_ABILITY} from working!"), //not in gen 5+, ability popup [STRINGID_PREPARESHELLTRAP] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} set a shell trap!"), [STRINGID_SHELLTRAPDIDNTWORK] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s shell trap didn't work!"), [STRINGID_SPIKESDISAPPEAREDFROMTEAM] = COMPOUND_STRING("The spikes disappeared from the ground around {B_ATK_TEAM2} team!"), @@ -831,7 +803,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_TEAMGAINEDEXP] = COMPOUND_STRING("The rest of your team gained Exp. Points thanks to the Exp. Share!\p"), [STRINGID_CURRENTMOVECANTSELECT] = COMPOUND_STRING("{B_BUFF1} cannot be used!\p"), [STRINGID_TARGETISBEINGSALTCURED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is being salt cured!"), - [STRINGID_TARGETISHURTBYSALTCURE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is hurt by {B_BUFF1}!"), + [STRINGID_TARGETISHURTBYSALTCURE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is hurt by {B_BUFF1}!"), [STRINGID_TARGETCOVEREDINSTICKYCANDYSYRUP] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} got covered in sticky candy syrup!"), [STRINGID_SHARPSTEELFLOATS] = COMPOUND_STRING("Sharp-pointed pieces of steel started floating around {B_DEF_TEAM2} PokΓ©mon!"), [STRINGID_SHARPSTEELDMG] = COMPOUND_STRING("The sharp steel bit into {B_DEF_NAME_WITH_PREFIX2}!"), @@ -857,7 +829,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_SWAMPENVELOPEDSIDE] = COMPOUND_STRING("A swamp enveloped {B_DEF_TEAM2} team!"), [STRINGID_THESWAMPDISAPPEARED] = COMPOUND_STRING("The swamp around {B_ATK_TEAM2} team disappeared!"), [STRINGID_PKMNTELLCHILLINGRECEPTIONJOKE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is preparing to tell a chillingly bad joke!"), - [STRINGID_HOSPITALITYRESTORATION] = COMPOUND_STRING("{B_ATK_PARTNER_NAME} drank down all the matcha that {B_ATK_NAME_WITH_PREFIX2} made!"), + [STRINGID_HOSPITALITYRESTORATION] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} drank down all the matcha that {B_SCR_NAME_WITH_PREFIX2} made!"), [STRINGID_ELECTROSHOTCHARGING] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} absorbed electricity!"), [STRINGID_ITEMWASUSEDUP] = COMPOUND_STRING("The {B_LAST_ITEM} was used up…"), [STRINGID_ATTACKERLOSTITSTYPE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} lost its {B_BUFF1} type!"), @@ -869,7 +841,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_BIZARREAREACREATED] = COMPOUND_STRING("A bizarre area was created in which Defense and Sp. Def stats are swapped!"), [STRINGID_TIDYINGUPCOMPLETE] = COMPOUND_STRING("Tidying up complete!"), [STRINGID_PKMNTERASTALLIZEDINTO] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} terastallized into the {B_BUFF1} type!"), - [STRINGID_BOOSTERENERGYACTIVATES] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} used its {B_LAST_ITEM} to activate {B_SCR_ACTIVE_ABILITY}!"), + [STRINGID_BOOSTERENERGYACTIVATES] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} used its {B_LAST_ITEM} to activate {B_SCR_ABILITY}!"), [STRINGID_FOGCREPTUP] = COMPOUND_STRING("Fog crept up as thick as soup!"), [STRINGID_FOGISDEEP] = COMPOUND_STRING("The fog is deep…"), [STRINGID_FOGLIFTED] = COMPOUND_STRING("The fog lifted."), @@ -898,9 +870,9 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_TIMETODYNAMAX] = COMPOUND_STRING("Time to Dynamax!"), [STRINGID_TIMETOGIGANTAMAX] = COMPOUND_STRING("Time to Gigantamax!"), [STRINGID_QUESTIONFORFEITBATTLE] = COMPOUND_STRING("Would you like to give up on this battle and quit now? Quitting the battle is the same as losing the battle."), - [STRINGID_FORFEITBATTLEGAVEMONEY] = COMPOUND_STRING("You gave Β₯{B_BUFF1} to the winner…{PAUSE_UNTIL_PRESS}"), [STRINGID_POWERCONSTRUCTPRESENCEOFMANY] = COMPOUND_STRING("You sense the presence of many!"), [STRINGID_POWERCONSTRUCTTRANSFORM] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} transformed into its Complete Forme!"), + [STRINGID_ABILITYSHIELDPROTECTS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s Ability is protected by the effects of its {B_LAST_ITEM}!"), }; const u16 gTrainerUsedItemStringIds[] = @@ -1098,24 +1070,12 @@ const u16 gUproarOverTurnStringIds[] = [B_MSG_UPROAR_ENDS] = STRINGID_PKMNCALMEDDOWN }; -const u16 gStockpileUsedStringIds[] = -{ - [B_MSG_STOCKPILED] = STRINGID_PKMNSTOCKPILED, - [B_MSG_CANT_STOCKPILE] = STRINGID_PKMNCANTSTOCKPILE, -}; - const u16 gWokeUpStringIds[] = { [B_MSG_WOKE_UP] = STRINGID_PKMNWOKEUP, [B_MSG_WOKE_UP_UPROAR] = STRINGID_PKMNWOKEUPINUPROAR }; -const u16 gSwallowFailStringIds[] = -{ - [B_MSG_SWALLOW_FAILED] = STRINGID_FAILEDTOSWALLOW, - [B_MSG_SWALLOW_FULL_HP] = STRINGID_PKMNHPFULL -}; - const u16 gUproarAwakeStringIds[] = { [B_MSG_CANT_SLEEP_UPROAR] = STRINGID_PKMNCANTSLEEPINUPROAR2, @@ -1124,20 +1084,21 @@ const u16 gUproarAwakeStringIds[] = const u16 gStatUpStringIds[] = { - [B_MSG_ATTACKER_STAT_ROSE] = STRINGID_ATTACKERSSTATROSE, - [B_MSG_DEFENDER_STAT_ROSE] = STRINGID_DEFENDERSSTATROSE, - [B_MSG_STAT_WONT_INCREASE] = STRINGID_STATSWONTINCREASE, - [B_MSG_STAT_ROSE_EMPTY] = STRINGID_EMPTYSTRING3, - [B_MSG_STAT_ROSE_ITEM] = STRINGID_USINGITEMSTATOFPKMNROSE, - [B_MSG_USED_DIRE_HIT] = STRINGID_PKMNUSEDXTOGETPUMPED, + [B_MSG_ATTACKER_STAT_CHANGED] = STRINGID_ATTACKERSSTATROSE, + [B_MSG_DEFENDER_STAT_CHANGED] = STRINGID_DEFENDERSSTATROSE, + [B_MSG_STAT_WONT_CHANGE] = STRINGID_STATSWONTINCREASE, + [B_MSG_STAT_CHANGE_EMPTY] = STRINGID_EMPTYSTRING3, + [B_MSG_STAT_CHANGED_ITEM] = STRINGID_USINGITEMSTATOFPKMNROSE, + [B_MSG_USED_DIRE_HIT] = STRINGID_PKMNUSEDXTOGETPUMPED, }; const u16 gStatDownStringIds[] = { - [B_MSG_ATTACKER_STAT_FELL] = STRINGID_ATTACKERSSTATFELL, - [B_MSG_DEFENDER_STAT_FELL] = STRINGID_DEFENDERSSTATFELL, - [B_MSG_STAT_WONT_DECREASE] = STRINGID_STATSWONTDECREASE, - [B_MSG_STAT_FELL_EMPTY] = STRINGID_EMPTYSTRING3, + [B_MSG_ATTACKER_STAT_CHANGED] = STRINGID_ATTACKERSSTATFELL, + [B_MSG_DEFENDER_STAT_CHANGED] = STRINGID_DEFENDERSSTATFELL, + [B_MSG_STAT_WONT_CHANGE] = STRINGID_STATSWONTDECREASE, + [B_MSG_STAT_CHANGE_EMPTY] = STRINGID_EMPTYSTRING3, + [B_MSG_STAT_CHANGED_ITEM] = STRINGID_USINGITEMSTATOFPKMNFELL, }; // Index copied from move's index in sTrappingMoves @@ -1205,7 +1166,8 @@ const u16 gGotBurnedStringIds[] = const u16 gGotFrostbiteStringIds[] = { - [B_MSG_STATUSED] = STRINGID_PKMNGOTFROSTBITE + [B_MSG_STATUSED] = STRINGID_PKMNGOTFROSTBITE, + [B_MSG_STATUSED_BY_ABILITY] = STRINGID_PKMNGOTFROSTBITE, }; const u16 gFrostbiteHealedStringIds[] = @@ -1330,22 +1292,18 @@ const u16 gSafariPokeblockResultStringIds[] = [B_MSG_MON_IGNORED] = STRINGID_PKMNIGNOREDX }; -const u16 gBerryEffectStringIds[] = +const u16 CureStatusBerryEffectStringID[] = { + [B_MSG_CURED_PARALYSIS] = STRINGID_PKMNSITEMCUREDPARALYSIS, + [B_MSG_CURED_POISON] = STRINGID_PKMNSITEMCUREDPOISON, + [B_MSG_CURED_BURN] = STRINGID_PKMNSITEMHEALEDBURN, + [B_MSG_CURED_FREEEZE] = STRINGID_PKMNSITEMDEFROSTEDIT, + [B_MSG_CURED_FROSTBITE] = STRINGID_PKMNSITEMHEALEDFROSTBITE, + [B_MSG_CURED_SLEEP] = STRINGID_PKMNSITEMWOKEIT, [B_MSG_CURED_PROBLEM] = STRINGID_PKMNSITEMCUREDPROBLEM, [B_MSG_NORMALIZED_STATUS] = STRINGID_PKMNSITEMNORMALIZEDSTATUS }; -const u16 gStatusPreventionStringIds[] = -{ - [B_MSG_ABILITY_PREVENTS_MOVE_BURN] = STRINGID_PKMNSXPREVENTSBURNS, - [B_MSG_ABILITY_PREVENTS_MOVE_PARALYSIS] = STRINGID_PKMNPREVENTSPARALYSISWITH, - [B_MSG_ABILITY_PREVENTS_MOVE_POISON] = STRINGID_PKMNPREVENTSPOISONINGWITH, - [B_MSG_ABILITY_PREVENTS_ABILITY_STATUS] = STRINGID_PKMNSXPREVENTSYSZ, - [B_MSG_STATUS_HAD_NO_EFFECT] = STRINGID_PKMNSXHADNOEFFECTONY, - [B_MSG_ABILITY_PASTEL_VEIL] = STRINGID_PASTELVEILPROTECTED -}; - const u16 gItemSwapStringIds[] = { [B_MSG_ITEM_SWAP_TAKEN] = STRINGID_PKMNOBTAINEDX, @@ -1381,11 +1339,6 @@ const u16 gStatusConditionsStringIds[] = STRINGID_PKMNWASPOISONED, STRINGID_PKMNBADLYPOISONED, STRINGID_PKMNWASBURNED, STRINGID_PKMNWASPARALYZED, STRINGID_PKMNFELLASLEEP, STRINGID_PKMNGOTFROSTBITE }; -const u16 gStatus2StringIds[] = -{ - STRINGID_PKMNWASCONFUSED, STRINGID_PKMNFELLINLOVE, STRINGID_TARGETCANTESCAPENOW, STRINGID_PKMNSUBJECTEDTOTORMENT -}; - const u16 gDamageNonTypesStartStringIds[] = { [B_MSG_TRAPPED_WITH_VINES] = STRINGID_TEAMTRAPPEDWITHVINES, @@ -1402,6 +1355,24 @@ const u16 gDamageNonTypesDmgStringIds[] = [B_MSG_HURT_BY_ROCKS_THROWN] = STRINGID_PKMNHURTBYROCKSTHROWN, }; +const u16 gDefogHazardsStringIds[] = +{ + [HAZARDS_SPIKES] = STRINGID_SPIKESDISAPPEAREDFROMTEAM, + [HAZARDS_STICKY_WEB] = STRINGID_STICKYWEBDISAPPEAREDFROMTEAM, + [HAZARDS_TOXIC_SPIKES] = STRINGID_TOXICSPIKESDISAPPEAREDFROMTEAM, + [HAZARDS_STEALTH_ROCK] = STRINGID_STEALTHROCKDISAPPEAREDFROMTEAM, + [HAZARDS_STEELSURGE] = STRINGID_SHARPSTEELDISAPPEAREDFROMTEAM, +}; + +const u16 gSpinHazardsStringIds[] = +{ + [HAZARDS_SPIKES] = STRINGID_PKMNBLEWAWAYSPIKES, + [HAZARDS_STICKY_WEB] = STRINGID_PKMNBLEWAWAYSTICKYWEB, + [HAZARDS_TOXIC_SPIKES] = STRINGID_PKMNBLEWAWAYTOXICSPIKES, + [HAZARDS_STEALTH_ROCK] = STRINGID_PKMNBLEWAWAYSTEALTHROCK, + [HAZARDS_STEELSURGE] = STRINGID_PKMNBLEWAWAYSHARPSTEEL, +}; + const u8 gText_PkmnIsEvolving[] = _("What?\n{STR_VAR_1} is evolving!"); const u8 gText_CongratsPkmnEvolved[] = _("Congratulations! Your {STR_VAR_1}\nevolved into {STR_VAR_2}!{WAIT_SE}\p"); const u8 gText_PkmnStoppedEvolving[] = _("Huh? {STR_VAR_1}\nstopped evolving!\p"); @@ -1472,6 +1443,8 @@ static const u8 sText_TwoTrainersSentPkmn[] = _("{B_TRAINER1_NAME_WITH_CLASS} se static const u8 sText_Trainer2SentOutPkmn[] = _("{B_TRAINER2_NAME_WITH_CLASS} sent out {B_BUFF1}!"); static const u8 sText_TwoTrainersWantToBattle[] = _("You are challenged by {B_TRAINER1_NAME_WITH_CLASS} and {B_TRAINER2_NAME_WITH_CLASS}!\p"); static const u8 sText_InGamePartnerSentOutZGoN[] = _("{B_PARTNER_NAME_WITH_CLASS} sent out {B_PLAYER_MON2_NAME}! Go, {B_PLAYER_MON1_NAME}!"); +static const u8 sText_InGamePartnerSentOutPkmn2[] = _("{B_PARTNER_NAME_WITH_CLASS} sent out {B_PLAYER_MON2_NAME}!"); +static const u8 sText_InGamePartnerWithdrewPkmn2[] = _("{B_PARTNER_NAME_WITH_CLASS} withdrew {B_PLAYER_MON2_NAME}!"); const u16 gBattlePalaceFlavorTextTable[] = { @@ -2094,9 +2067,31 @@ void BufferStringBattle(enum StringID stringID, u32 battler) else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) - stringPtr = sText_TwoLinkTrainersWantToBattlePause; + { + if (TESTING && gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if (!(gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)) + stringPtr = sText_Trainer1WantsToBattle; + else + stringPtr = sText_TwoTrainersWantToBattle; + } + else if (TESTING && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + { + stringPtr = sText_TwoTrainersWantToBattle; + } + else if (!(gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)) + { + stringPtr = sText_LinkTrainerWantsToBattlePause; + } + else + { + stringPtr = sText_TwoLinkTrainersWantToBattlePause; + } + } else + { stringPtr = sText_TwoLinkTrainersWantToBattle; + } } else { @@ -2182,7 +2177,9 @@ void BufferStringBattle(enum StringID stringID, u32 battler) case STRINGID_RETURNMON: // sending poke to ball msg if (IsOnPlayerSide(battler)) { - if (*(&gBattleStruct->hpScale) == 0) + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT) + stringPtr = sText_InGamePartnerWithdrewPkmn2; + else if (*(&gBattleStruct->hpScale) == 0) stringPtr = sText_PkmnThatsEnough; else if (*(&gBattleStruct->hpScale) == 1 || IsDoubleBattle()) stringPtr = sText_PkmnComeBack; @@ -2202,14 +2199,27 @@ void BufferStringBattle(enum StringID stringID, u32 battler) } else { - stringPtr = sText_Trainer1WithdrewPkmn; + if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + { + if (GetBattlerPosition(battler) == B_POSITION_OPPONENT_LEFT) + stringPtr = sText_Trainer1WithdrewPkmn; + else + stringPtr = sText_Trainer2WithdrewPkmn; + + } + else + { + stringPtr = sText_Trainer1WithdrewPkmn; + } } } break; case STRINGID_SWITCHINMON: // switch-in msg if (IsOnPlayerSide(gBattleScripting.battler)) { - if (*(&gBattleStruct->hpScale) == 0 || IsDoubleBattle()) + if ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) && (GetBattlerAtPosition(gBattleScripting.battler) == 2)) + stringPtr = sText_InGamePartnerSentOutPkmn2; + else if (*(&gBattleStruct->hpScale) == 0 || IsDoubleBattle()) stringPtr = sText_GoPkmn2; else if (*(&gBattleStruct->hpScale) == 1) stringPtr = sText_DoItPkmn; @@ -2231,12 +2241,39 @@ void BufferStringBattle(enum StringID stringID, u32 battler) } else { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + if (TESTING && gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if (gBattleScripting.battler == 1) + { + stringPtr = sText_Trainer1SentOutPkmn; + } + else + { + if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + stringPtr = sText_Trainer2SentOutPkmn; + else + stringPtr = sText_Trainer1SentOutPkmn2; + } + } + else if (TESTING && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + { + if (gBattleScripting.battler == 1) + stringPtr = sText_Trainer1SentOutPkmn; + else + stringPtr = sText_Trainer2SentOutPkmn; + } + else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { stringPtr = sText_LinkTrainerMultiSentOutPkmn; + } else if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_UNION_ROOM) + { stringPtr = sText_Trainer1SentOutPkmn2; + } else + { stringPtr = sText_LinkTrainerSentOutPkmn2; + } } } else @@ -3110,14 +3147,14 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) else toCpy = sText_Opposing2; break; - case B_TXT_SCR_TEAM1: - if (IsOnPlayerSide(gBattleScripting.battler)) + case B_TXT_EFF_TEAM1: + if (IsOnPlayerSide(gEffectBattler)) toCpy = sText_Your1; else toCpy = sText_Opposing1; break; - case B_TXT_SCR_TEAM2: - if (IsOnPlayerSide(gBattleScripting.battler)) + case B_TXT_EFF_TEAM2: + if (IsOnPlayerSide(gEffectBattler)) toCpy = sText_Your2; else toCpy = sText_Opposing2; @@ -3187,7 +3224,7 @@ static void IllusionNickHack(u32 battler, u32 partyId, u8 *dst) else partnerMon = mon; - id = GetIllusionMonPartyId(gEnemyParty, mon, partnerMon); + id = GetIllusionMonPartyId(gEnemyParty, mon, partnerMon, battler); } if (id != PARTY_SIZE) diff --git a/src/battle_pike.c b/src/battle_pike.c index f1857b5d8242..199a5eea5036 100644 --- a/src/battle_pike.c +++ b/src/battle_pike.c @@ -811,7 +811,7 @@ static void HealMon(struct Pokemon *mon) static bool8 DoesAbilityPreventStatus(struct Pokemon *mon, u32 status) { - u16 ability = GetMonAbility(mon); + enum Ability ability = GetMonAbility(mon); bool8 ret = FALSE; if (ability == ABILITY_COMATOSE) @@ -851,22 +851,22 @@ static bool8 DoesTypePreventStatus(u16 species, u32 status) switch (status) { case STATUS1_TOXIC_POISON: - if (gSpeciesInfo[species].types[0] == TYPE_STEEL || gSpeciesInfo[species].types[0] == TYPE_POISON - || gSpeciesInfo[species].types[1] == TYPE_STEEL || gSpeciesInfo[species].types[1] == TYPE_POISON) + if (GetSpeciesType(species, 0) == TYPE_STEEL || GetSpeciesType(species, 0) == TYPE_POISON + || GetSpeciesType(species, 1) == TYPE_STEEL || GetSpeciesType(species, 1) == TYPE_POISON) ret = TRUE; break; case STATUS1_FREEZE: case STATUS1_FROSTBITE: - if (gSpeciesInfo[species].types[0] == TYPE_ICE || gSpeciesInfo[species].types[1] == TYPE_ICE) + if (GetSpeciesType(species, 0) == TYPE_ICE || GetSpeciesType(species, 1) == TYPE_ICE) ret = TRUE; break; case STATUS1_PARALYSIS: - if (gSpeciesInfo[species].types[0] == TYPE_GROUND || gSpeciesInfo[species].types[1] == TYPE_GROUND - || (B_PARALYZE_ELECTRIC >= GEN_6 && (gSpeciesInfo[species].types[0] == TYPE_ELECTRIC || gSpeciesInfo[species].types[1] == TYPE_ELECTRIC))) + if (GetSpeciesType(species, 0) == TYPE_GROUND || GetSpeciesType(species, 1) == TYPE_GROUND + || (GetConfig(CONFIG_PARALYZE_ELECTRIC) >= GEN_6 && (GetSpeciesType(species, 0) == TYPE_ELECTRIC || GetSpeciesType(species, 1) == TYPE_ELECTRIC))) ret = TRUE; break; case STATUS1_BURN: - if (gSpeciesInfo[species].types[0] == TYPE_FIRE || gSpeciesInfo[species].types[1] == TYPE_FIRE) + if (GetSpeciesType(species, 0) == TYPE_FIRE || GetSpeciesType(species, 1) == TYPE_FIRE) ret = TRUE; break; case STATUS1_SLEEP: @@ -1141,7 +1141,7 @@ bool32 TryGenerateBattlePikeWildMon(bool8 checkKeenEyeIntimidate) MON_DATA_EXP, &gExperienceTables[gSpeciesInfo[wildMons[headerId][pikeMonId].species].growthRate][monLevel]); - if (gSpeciesInfo[wildMons[headerId][pikeMonId].species].abilities[1]) + if (GetSpeciesAbility(wildMons[headerId][pikeMonId].species, 1)) abilityNum = Random() % 2; else abilityNum = 0; @@ -1587,7 +1587,7 @@ static void SaveMonHeldItems(void) for (i = 0; i < FRONTIER_PARTY_SIZE; i++) { - int heldItem = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], + int heldItem = GetMonData(GetSavedPlayerPartyMon(gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1), MON_DATA_HELD_ITEM); gSaveBlock2Ptr->frontier.pikeHeldItemsBackup[i] = heldItem; } @@ -1623,7 +1623,7 @@ static bool8 CanEncounterWildMon(u8 enemyMonLevel) { if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) { - u16 monAbility = GetMonAbility(&gPlayerParty[0]); + enum Ability monAbility = GetMonAbility(&gPlayerParty[0]); if (monAbility == ABILITY_KEEN_EYE || monAbility == ABILITY_INTIMIDATE) { u8 playerMonLevel = GetMonData(&gPlayerParty[0], MON_DATA_LEVEL); diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index 6e56f4867b90..a93e3a7b8e27 100644 --- a/src/battle_pyramid.c +++ b/src/battle_pyramid.c @@ -81,7 +81,7 @@ static void HidePyramidItem(void); static void SetPyramidFacilityTrainers(void); static void ShowPostBattleHintText(void); static void UpdatePyramidWinStreak(void); -static void GetInBattlePyramid(void); +static void GetCurrentBattlePyramidLocation(void); static void UpdatePyramidLightRadius(void); static void ClearPyramidPartyHeldItems(void); static void SetPyramidFloorPalette(void); @@ -805,7 +805,7 @@ static void (*const sBattlePyramidFunctions[])(void) = [BATTLE_PYRAMID_FUNC_SET_TRAINERS] = SetPyramidFacilityTrainers, [BATTLE_PYRAMID_FUNC_SHOW_HINT_TEXT] = ShowPostBattleHintText, [BATTLE_PYRAMID_FUNC_UPDATE_STREAK] = UpdatePyramidWinStreak, - [BATTLE_PYRAMID_FUNC_IS_IN] = GetInBattlePyramid, + [BATTLE_PYRAMID_FUNC_CURRENT_LOCATION] = GetCurrentBattlePyramidLocation, [BATTLE_PYRAMID_FUNC_UPDATE_LIGHT] = UpdatePyramidLightRadius, [BATTLE_PYRAMID_FUNC_CLEAR_HELD_ITEMS] = ClearPyramidPartyHeldItems, [BATTLE_PYRAMID_FUNC_SET_FLOOR_PALETTE] = SetPyramidFloorPalette, @@ -1127,9 +1127,9 @@ static void UpdatePyramidWinStreak(void) gSaveBlock2Ptr->frontier.pyramidRecordStreaks[lvlMode] = gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode]; } -static void GetInBattlePyramid(void) +static void GetCurrentBattlePyramidLocation(void) { - gSpecialVar_Result = InBattlePyramid(); + gSpecialVar_Result = CurrentBattlePyramidLocation(); } static void UpdatePyramidLightRadius(void) @@ -1221,19 +1221,19 @@ static void RestorePyramidPlayerParty(void) int partyIndex = gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1; for (j = 0; j < FRONTIER_PARTY_SIZE; j++) { - if (GetMonData(&gSaveBlock1Ptr->playerParty[partyIndex], MON_DATA_SPECIES, NULL) == GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL)) + if (GetMonData(GetSavedPlayerPartyMon(partyIndex), MON_DATA_SPECIES, NULL) == GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL)) { for (k = 0; k < MAX_MON_MOVES; k++) { for (l = 0; l < MAX_MON_MOVES; l++) { - if (GetMonData(&gSaveBlock1Ptr->playerParty[partyIndex], MON_DATA_MOVE1 + l, NULL) == GetMonData(&gPlayerParty[j], MON_DATA_MOVE1 + k, NULL)) + if (GetMonData(GetSavedPlayerPartyMon(partyIndex), MON_DATA_MOVE1 + l, NULL) == GetMonData(&gPlayerParty[j], MON_DATA_MOVE1 + k, NULL)) break; } if (l == MAX_MON_MOVES) SetMonMoveSlot(&gPlayerParty[j], MOVE_SKETCH, k); } - gSaveBlock1Ptr->playerParty[partyIndex] = gPlayerParty[j]; + SavePlayerPartyMon(partyIndex, &gPlayerParty[j]); gSelectedOrderFromParty[j] = partyIndex + 1; break; } @@ -1426,7 +1426,7 @@ void GenerateBattlePyramidWildMon(void) continue; // check type - if (reqs->type != TYPE_MYSTERY && gSpeciesInfo[species].types[0] != reqs->type && gSpeciesInfo[species].types[1] != reqs->type) + if (reqs->type != TYPE_MYSTERY && GetSpeciesType(species, 0) != reqs->type && GetSpeciesType(species, 1) != reqs->type) continue; // check base stat total @@ -1459,7 +1459,7 @@ void GenerateBattlePyramidWildMon(void) { for (j = 0; j < NUM_ABILITY_SLOTS; j++) { - if (gSpeciesInfo[species].abilities[j] == reqs->abilities[i]) + if (GetSpeciesAbility(species, j) == reqs->abilities[i]) { abilities[abilityCount] = reqs->abilities[i]; abilityCount++; @@ -1520,7 +1520,7 @@ void GenerateBattlePyramidWildMon(void) } // Initialize a random ability num - if (gSpeciesInfo[species].abilities[1]) + if (GetSpeciesAbility(species, 1)) { i = GetMonData(&gEnemyParty[0], MON_DATA_PERSONALITY, NULL) % 2; SetMonData(&gEnemyParty[0], MON_DATA_ABILITY_NUM, &i); @@ -1540,7 +1540,7 @@ void GenerateBattlePyramidWildMon(void) id = abilities[Random() % abilityCount]; for (j = 0; j < NUM_ABILITY_SLOTS; j++) { - if (id == gSpeciesInfo[species].abilities[j]) + if (id == GetSpeciesAbility(species, j)) { // Set this ability num SetMonData(&gEnemyParty[0], MON_DATA_ABILITY_NUM, &id); @@ -1606,7 +1606,7 @@ void GenerateBattlePyramidWildMon(void) break; case ABILITY_RANDOM: default: - if (gSpeciesInfo[wildMons[id].species].abilities[1]) + if (GetSpeciesAbility(wildMons[id].species, 1)) { i = GetMonData(&gEnemyParty[0], MON_DATA_PERSONALITY, NULL) % 2; SetMonData(&gEnemyParty[0], MON_DATA_ABILITY_NUM, &i); @@ -1643,14 +1643,14 @@ u8 GetPyramidRunMultiplier(void) return sPyramidFloorTemplates[id].runMultiplier; } -u8 InBattlePyramid(void) +u8 CurrentBattlePyramidLocation(void) { if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR) - return 1; + return PYRAMID_LOCATION_FLOOR; else if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP) - return 2; + return PYRAMID_LOCATION_TOP; else - return FALSE; + return PYRAMID_LOCATION_NONE; } bool8 InBattlePyramid_(void) @@ -1661,7 +1661,7 @@ bool8 InBattlePyramid_(void) void PausePyramidChallenge(void) { - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) { RestorePyramidPlayerParty(); gSaveBlock2Ptr->frontier.challengeStatus = CHALLENGE_STATUS_PAUSED; @@ -1672,7 +1672,7 @@ void PausePyramidChallenge(void) void SoftResetInBattlePyramid(void) { - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) DoSoftReset(); } @@ -1781,6 +1781,7 @@ void GenerateBattlePyramidFloorLayout(u16 *backupMapData, bool8 setPlayerPositio gSaveBlock1Ptr->pos.x = (mapLayout->width * (i % PYRAMID_FLOOR_SQUARES_WIDE)) + x; gSaveBlock1Ptr->pos.y = (mapLayout->height * (i / PYRAMID_FLOOR_SQUARES_WIDE)) + y; } + // Copy the elevation and collision, but overwrite the metatile ID map[x] = (layoutMap[x] & (MAPGRID_ELEVATION_MASK | MAPGRID_COLLISION_MASK)) | METATILE_BattlePyramid_Floor; } else diff --git a/src/battle_pyramid_bag.c b/src/battle_pyramid_bag.c index 9cc8a05aa6bb..cd74e6c40b4c 100644 --- a/src/battle_pyramid_bag.c +++ b/src/battle_pyramid_bag.c @@ -16,7 +16,6 @@ #include "item_use.h" #include "list_menu.h" #include "mail.h" -#include "main.h" #include "malloc.h" #include "menu.h" #include "menu_helpers.h" @@ -414,7 +413,7 @@ void CB2_ReturnToPyramidBagMenu(void) GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_PREV, gPyramidBagMenuState.exitCallback); } -void GoToBattlePyramidBagMenu(u8 location, void (*exitCallback)(void)) +void GoToBattlePyramidBagMenu(u8 location, MainCallback exitCallback) { gPyramidBagMenu = AllocZeroed(sizeof(*gPyramidBagMenu)); @@ -573,7 +572,7 @@ static bool8 LoadPyramidBagGfx(void) case 1: if (FreeTempTileDataBuffersIfPossible() != TRUE) { - LZDecompressWram(gBattlePyramidBagTilemap, gPyramidBagMenu->tilemapBuffer); + DecompressDataWithHeaderWram(gBattlePyramidBagTilemap, gPyramidBagMenu->tilemapBuffer); gPyramidBagMenu->state++; } break; @@ -1526,7 +1525,7 @@ static void CreatePyramidBagYesNo(u8 taskId, const struct YesNoFuncTable *yesNoT CreateYesNoMenuWithCallbacks(taskId, &sWindowTemplates_MenuActions[MENU_WIN_YESNO], 1, 0, 2, 1, 0xE, yesNoTable); } -void DisplayItemMessageInBattlePyramid(u8 taskId, const u8 *str, void (*callback)(u8 taskId)) +void DisplayItemMessageInBattlePyramid(u8 taskId, const u8 *str, TaskFunc callback) { FillWindowPixelBuffer(WIN_MSG, PIXEL_FILL(1)); DisplayMessageAndContinueTask(taskId, WIN_MSG, 0xA, 0xD, FONT_NORMAL, GetPlayerTextSpeedDelay(), str, callback); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 41b473c5af1a..9dbbbe914d57 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1,10 +1,12 @@ #include "global.h" #include "battle.h" +#include "battle_hold_effects.h" #include "battle_message.h" #include "battle_anim.h" #include "battle_ai_main.h" #include "battle_ai_util.h" #include "battle_scripts.h" +#include "battle_environment.h" #include "battle_z_move.h" #include "item.h" #include "util.h" @@ -52,20 +54,23 @@ #include "constants/battle_move_effects.h" #include "constants/battle_string_ids.h" #include "constants/battle_partner.h" -#include "constants/hold_effects.h" #include "constants/items.h" #include "constants/item_effects.h" -#include "constants/map_types.h" #include "constants/moves.h" #include "constants/party_menu.h" #include "constants/rgb.h" #include "constants/songs.h" #include "constants/trainer_slide.h" #include "constants/trainers.h" +#include "test/battle.h" #include "battle_util.h" #include "constants/pokemon.h" #include "config/battle.h" #include "data/battle_move_effects.h" +#include "test/battle.h" +#include "follower_npc.h" +#include "load_save.h" +#include "test/test_runner_battle.h" // table to avoid ugly powing on gba (courtesy of doesnt) // this returns (i^2.5)/4 @@ -285,20 +290,6 @@ static const s32 sExperienceScalingFactors[] = 159767, }; -static const u16 sTrappingMoves[NUM_TRAPPING_MOVES] = -{ - MOVE_BIND, - MOVE_WRAP, - MOVE_FIRE_SPIN, - MOVE_CLAMP, - MOVE_WHIRLPOOL, - MOVE_SAND_TOMB, - MOVE_MAGMA_STORM, - MOVE_INFESTATION, - MOVE_SNAP_TRAP, - MOVE_THUNDER_CAGE -}; - static const u16 sWhiteOutBadgeMoney[9] = { 8, 16, 24, 36, 48, 64, 80, 100, 120 }; enum GiveCaughtMonStates @@ -319,8 +310,7 @@ enum GiveCaughtMonStates #define TAG_LVLUP_BANNER_MON_ICON 55130 -static void TrySetDestinyBondToHappen(void); -static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr); +static u32 ChangeStatBuffs(u32 battler, s8 statValue, enum Stat statId, union StatChangeFlags flags, u32 stats, const u8 *BS_ptr); static bool32 IsMonGettingExpSentOut(void); static void InitLevelUpBanner(void); static bool8 SlideInLevelUpBanner(void); @@ -332,24 +322,27 @@ static void DrawLevelUpBannerText(void); static void SpriteCB_MonIconOnLvlUpBanner(struct Sprite *sprite); static bool32 CriticalCapture(u32 odds); static void BestowItem(u32 battlerAtk, u32 battlerDef); -static bool8 IsFinalStrikeEffect(enum BattleMoveEffects moveEffect); +static bool32 IsFinalStrikeEffect(enum MoveEffect moveEffect); static void TryUpdateRoundTurnOrder(void); static bool32 ChangeOrderTargetAfterAttacker(void); static bool32 SetTargetToNextPursuiter(u32 battlerDef); void ApplyExperienceMultipliers(s32 *expAmount, u8 expGetterMonId, u8 faintedBattler); static void RemoveAllWeather(void); static void RemoveAllTerrains(void); -static bool32 CanAbilityPreventStatLoss(u32 abilityDef); +static bool32 CanAbilityPreventStatLoss(enum Ability abilityDef); static u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent); static void TryUpdateEvolutionTracker(u32 evolutionCondition, u32 upAmount, u16 usedMove); static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u8 *failInstr, u16 move); static void ResetValuesForCalledMove(void); -static void TryRestoreDamageAfterCheekPouch(u32 battler); +static bool32 TrySymbiosis(u32 battler, u32 itemId, bool32 moveEnd); +static bool32 CanAbilityShieldActivateForBattler(u32 battler); +static void TryClearChargeVolatile(u32 moveType); +static bool32 IsAnyTargetAffected(void); static void Cmd_attackcanceler(void); static void Cmd_accuracycheck(void); -static void Cmd_attackstring(void); -static void Cmd_ppreduce(void); +static void Cmd_printattackstring(void); +static void Cmd_unused_0x3(void); static void Cmd_critcalc(void); static void Cmd_damagecalc(void); static void Cmd_typecalc(void); @@ -370,16 +363,16 @@ static void Cmd_printselectionstringfromtable(void); static void Cmd_setadditionaleffects(void); static void Cmd_seteffectprimary(void); static void Cmd_seteffectsecondary(void); -static void Cmd_clearstatusfromeffect(void); +static void Cmd_clearvolatile(void); static void Cmd_tryfaintmon(void); static void Cmd_dofaintanimation(void); static void Cmd_cleareffectsonfaint(void); static void Cmd_jumpifstatus(void); -static void Cmd_jumpifstatus2(void); +static void Cmd_jumpifvolatile(void); static void Cmd_jumpifability(void); static void Cmd_jumpifsideaffecting(void); static void Cmd_jumpifstat(void); -static void Cmd_jumpifstatus3condition(void); +static void Cmd_jumpifstatignorecontrary(void); static void Cmd_jumpbasedontype(void); static void Cmd_getexp(void); static void Cmd_checkteamslost(void); @@ -405,20 +398,20 @@ static void Cmd_bichalfword(void); static void Cmd_bicword(void); static void Cmd_pause(void); static void Cmd_waitstate(void); -static void Cmd_absorb(void); +static void Cmd_isdmgblockedbydisguise(void); static void Cmd_return(void); static void Cmd_end(void); static void Cmd_end2(void); static void Cmd_end3(void); -static void Cmd_unused5(void); +static void Cmd_setchargingturn(void); static void Cmd_call(void); static void Cmd_setroost(void); static void Cmd_jumpifabilitypresent(void); static void Cmd_endselectionscript(void); static void Cmd_playanimation(void); static void Cmd_playanimation_var(void); -static void Cmd_setgraphicalstatchangevalues(void); -static void Cmd_playstatchangeanimation(void); +static void Cmd_jumpfifsemiinvulnerable(void); +static void Cmd_unused_0x48(void); static void Cmd_moveend(void); static void Cmd_sethealblock(void); static void Cmd_returnatktoball(void); @@ -447,8 +440,8 @@ static void Cmd_drawpartystatussummary(void); static void Cmd_hidepartystatussummary(void); static void Cmd_jumptocalledmove(void); static void Cmd_statusanimation(void); -static void Cmd_status2animation(void); -static void Cmd_chosenstatusanimation(void); +static void Cmd_unused_0x65(void); +static void Cmd_unused_0x66(void); static void Cmd_yesnobox(void); static void Cmd_cancelallactions(void); static void Cmd_setgravity(void); @@ -464,25 +457,25 @@ static void Cmd_jumpifplayerran(void); static void Cmd_hpthresholds(void); static void Cmd_hpthresholds2(void); static void Cmd_useitemonopponent(void); -static void Cmd_various(void); +static void Cmd_unused_0x78(void); static void Cmd_setprotectlike(void); static void Cmd_tryexplosion(void); static void Cmd_setatkhptozero(void); static void Cmd_jumpifnexttargetvalid(void); static void Cmd_tryhealhalfhealth(void); -static void Cmd_trymirrormove(void); +static void Cmd_unused_0x7e(void); static void Cmd_setfieldweather(void); static void Cmd_setreflect(void); static void Cmd_setseeded(void); static void Cmd_manipulatedamage(void); static void Cmd_trysetrest(void); -static void Cmd_jumpifnotfirstturn(void); -static void Cmd_setmiracleeye(void); +static void Cmd_unused_0x82(void); +static void Cmd_unused_0x83(void); static void Cmd_jumpifuproarwakes(void); static void Cmd_stockpile(void); static void Cmd_stockpiletobasedamage(void); static void Cmd_stockpiletohpheal(void); -static void Cmd_setdrainedhp(void); +static void Cmd_unused_0x88(void); static void Cmd_statbuffchange(void); static void Cmd_normalisebuffs(void); static void Cmd_setbide(void); @@ -494,9 +487,9 @@ static void Cmd_tryconversiontypechange(void); static void Cmd_givepaydaymoney(void); static void Cmd_setlightscreen(void); static void Cmd_tryKO(void); -static void Cmd_unused_0x94(void); +static void Cmd_checknonvolatiletrigger(void); static void Cmd_copybidedmg(void); -static void Cmd_unused_96(void); +static void Cmd_animatewildpokemonafterfailedpokeball(void); static void Cmd_tryinfatuating(void); static void Cmd_updatestatusicon(void); static void Cmd_setmist(void); @@ -504,7 +497,7 @@ static void Cmd_setfocusenergy(void); static void Cmd_transformdataexecution(void); static void Cmd_setsubstitute(void); static void Cmd_mimicattackcopy(void); -static void Cmd_metronome(void); +static void Cmd_setcalledmove(void); static void Cmd_unused_0x9f(void); static void Cmd_unused_0xA0(void); static void Cmd_counterdamagecalculator(void); @@ -515,15 +508,15 @@ static void Cmd_painsplitdmgcalc(void); static void Cmd_settypetorandomresistance(void); static void Cmd_setalwayshitflag(void); static void Cmd_copymovepermanently(void); -static void Cmd_trychoosesleeptalkmove(void); -static void Cmd_trysetdestinybond(void); -static void Cmd_trysetdestinybondtohappen(void); +static void Cmd_unused_0xA9(void); +static void Cmd_unused_AA(void); +static void Cmd_unused_0xab(void); static void Cmd_settailwind(void); static void Cmd_tryspiteppreduce(void); static void Cmd_healpartystatus(void); static void Cmd_cursetarget(void); static void Cmd_trysetspikes(void); -static void Cmd_setforesight(void); +static void Cmd_setvolatile(void); static void Cmd_trysetperishsong(void); static void Cmd_handlerollout(void); static void Cmd_jumpifconfusedandstatmaxed(void); @@ -533,24 +526,24 @@ static void Cmd_presentdamagecalculation(void); static void Cmd_setsafeguard(void); static void Cmd_magnitudedamagecalculation(void); static void Cmd_jumpifnopursuitswitchdmg(void); -static void Cmd_tryrestorehpberry(void); +static void Cmd_tryactivateitem(void); static void Cmd_halvehp(void); static void Cmd_copyfoestats(void); static void Cmd_rapidspinfree(void); -static void Cmd_setdefensecurlbit(void); +static void Cmd_unused_0xBF(void); static void Cmd_recoverbasedonsunlight(void); static void Cmd_setstickyweb(void); static void Cmd_selectfirstvalidtarget(void); -static void Cmd_trysetfutureattack(void); +static void Cmd_setfutureattack(void); static void Cmd_trydobeatup(void); static void Cmd_setsemiinvulnerablebit(void); static void Cmd_tryfiretwoturnmovenowbyeffect(void); -static void Cmd_setminimize(void); +static void Cmd_unused_0xC7(void); static void Cmd_unused_c8(void); static void Cmd_trymemento(void); static void Cmd_setforcedtarget(void); -static void Cmd_setcharge(void); -static void Cmd_callenvironmentattack(void); +static void Cmd_unused_0xcb(void); +static void Cmd_unused_0xCC(void); static void Cmd_curestatuswithmove(void); static void Cmd_settorment(void); static void Cmd_jumpifnodamage(void); @@ -567,14 +560,14 @@ static void Cmd_setroom(void); static void Cmd_tryswapabilities(void); static void Cmd_tryimprison(void); static void Cmd_setstealthrock(void); -static void Cmd_setuserstatus3(void); -static void Cmd_assistattackselect(void); +static void Cmd_trysetvolatile(void); +static void Cmd_unused_0xde(void); static void Cmd_trysetmagiccoat(void); static void Cmd_trysetsnatch(void); static void Cmd_unused2(void); static void Cmd_switchoutabilities(void); static void Cmd_jumpifhasnohp(void); -static void Cmd_jumpifnotcurrentmoveargtype(void); +static void Cmd_unused_0xE4(void); static void Cmd_pickup(void); static void Cmd_unused_0xE6(void); static void Cmd_unused_0xE7(void); @@ -590,7 +583,7 @@ static void Cmd_givecaughtmon(void); static void Cmd_trysetcaughtmondexflags(void); static void Cmd_displaydexinfo(void); static void Cmd_trygivecaughtmonnick(void); -static void Cmd_subattackerhpbydmg(void); +static void Cmd_unused_0xf4(void); static void Cmd_removeattackerstatus1(void); static void Cmd_finishaction(void); static void Cmd_finishturn(void); @@ -600,15 +593,15 @@ static void Cmd_swapstatstages(void); static void Cmd_averagestats(void); static void Cmd_jumpifcaptivateaffected(void); static void Cmd_setnonvolatilestatus(void); -static void Cmd_tryworryseed(void); +static void Cmd_tryoverwriteability(void); static void Cmd_callnative(void); void (*const gBattleScriptingCommandsTable[])(void) = { Cmd_attackcanceler, //0x0 Cmd_accuracycheck, //0x1 - Cmd_attackstring, //0x2 - Cmd_ppreduce, //0x3 + Cmd_printattackstring, //0x2 + Cmd_unused_0x3, //0x3 Cmd_critcalc, //0x4 Cmd_damagecalc, //0x5 Cmd_typecalc, //0x6 @@ -629,16 +622,16 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_setadditionaleffects, //0x15 Cmd_seteffectprimary, //0x16 Cmd_seteffectsecondary, //0x17 - Cmd_clearstatusfromeffect, //0x18 + Cmd_clearvolatile, //0x18 Cmd_tryfaintmon, //0x19 Cmd_dofaintanimation, //0x1A Cmd_cleareffectsonfaint, //0x1B Cmd_jumpifstatus, //0x1C - Cmd_jumpifstatus2, //0x1D + Cmd_jumpifvolatile, //0x1D Cmd_jumpifability, //0x1E Cmd_jumpifsideaffecting, //0x1F Cmd_jumpifstat, //0x20 - Cmd_jumpifstatus3condition, //0x21 + Cmd_jumpifstatignorecontrary, //0x21 Cmd_jumpbasedontype, //0x22 Cmd_getexp, //0x23 Cmd_checkteamslost, //0x24 @@ -664,20 +657,20 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_bicword, //0x38 Cmd_pause, //0x39 Cmd_waitstate, //0x3A - Cmd_absorb, //0x3B + Cmd_isdmgblockedbydisguise, //0x3B Cmd_return, //0x3C Cmd_end, //0x3D Cmd_end2, //0x3E Cmd_end3, //0x3F - Cmd_unused5, //0x40 + Cmd_setchargingturn, //0x40 Cmd_call, //0x41 Cmd_setroost, //0x42 Cmd_jumpifabilitypresent, //0x43 Cmd_endselectionscript, //0x44 Cmd_playanimation, //0x45 Cmd_playanimation_var, //0x46 - Cmd_setgraphicalstatchangevalues, //0x47 - Cmd_playstatchangeanimation, //0x48 + Cmd_jumpfifsemiinvulnerable, //0x47 + Cmd_unused_0x48, //0x48 Cmd_moveend, //0x49 Cmd_sethealblock, //0x4A Cmd_returnatktoball, //0x4B @@ -706,8 +699,8 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_hidepartystatussummary, //0x62 Cmd_jumptocalledmove, //0x63 Cmd_statusanimation, //0x64 - Cmd_status2animation, //0x65 - Cmd_chosenstatusanimation, //0x66 + Cmd_unused_0x65, //0x65 + Cmd_unused_0x66, //0x66 Cmd_yesnobox, //0x67 Cmd_cancelallactions, //0x68 Cmd_setgravity, //0x69 @@ -723,25 +716,25 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_hpthresholds, //0x73 Cmd_hpthresholds2, //0x74 Cmd_useitemonopponent, //0x75 - Cmd_various, //0x76 + Cmd_unused_0x78, //0x76 Cmd_setprotectlike, //0x77 Cmd_tryexplosion, //0x78 Cmd_setatkhptozero, //0x79 Cmd_jumpifnexttargetvalid, //0x7A Cmd_tryhealhalfhealth, //0x7B - Cmd_trymirrormove, //0x7C + Cmd_unused_0x7e, //0x7C Cmd_setfieldweather, //0x7D Cmd_setreflect, //0x7E Cmd_setseeded, //0x7F Cmd_manipulatedamage, //0x80 Cmd_trysetrest, //0x81 - Cmd_jumpifnotfirstturn, //0x82 - Cmd_setmiracleeye, //0x83 + Cmd_unused_0x82, //0x82 + Cmd_unused_0x83, //0x83 Cmd_jumpifuproarwakes, //0x84 Cmd_stockpile, //0x85 Cmd_stockpiletobasedamage, //0x86 Cmd_stockpiletohpheal, //0x87 - Cmd_setdrainedhp, //0x88 + Cmd_unused_0x88, //0x88 Cmd_statbuffchange, //0x89 Cmd_normalisebuffs, //0x8A Cmd_setbide, //0x8B @@ -753,9 +746,9 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_givepaydaymoney, //0x91 Cmd_setlightscreen, //0x92 Cmd_tryKO, //0x93 - Cmd_unused_0x94, //0x94 + Cmd_checknonvolatiletrigger, //0x94 Cmd_copybidedmg, //0x95 - Cmd_unused_96, //0x96 + Cmd_animatewildpokemonafterfailedpokeball, //0x96 Cmd_tryinfatuating, //0x97 Cmd_updatestatusicon, //0x98 Cmd_setmist, //0x99 @@ -763,7 +756,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_transformdataexecution, //0x9B Cmd_setsubstitute, //0x9C Cmd_mimicattackcopy, //0x9D - Cmd_metronome, //0x9E + Cmd_setcalledmove, //0x9E Cmd_unused_0x9f, //0x9F Cmd_unused_0xA0, //0xA0 Cmd_counterdamagecalculator, //0xA1 @@ -774,15 +767,15 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_settypetorandomresistance, //0xA6 Cmd_setalwayshitflag, //0xA7 Cmd_copymovepermanently, //0xA8 - Cmd_trychoosesleeptalkmove, //0xA9 - Cmd_trysetdestinybond, //0xAA - Cmd_trysetdestinybondtohappen, //0xAB + Cmd_unused_0xA9, //0xA9 + Cmd_unused_AA, //0xAA + Cmd_unused_0xab, //0xAB Cmd_settailwind, //0xAC Cmd_tryspiteppreduce, //0xAD Cmd_healpartystatus, //0xAE Cmd_cursetarget, //0xAF Cmd_trysetspikes, //0xB0 - Cmd_setforesight, //0xB1 + Cmd_setvolatile, //0xB1 Cmd_trysetperishsong, //0xB2 Cmd_handlerollout, //0xB3 Cmd_jumpifconfusedandstatmaxed, //0xB4 @@ -792,24 +785,24 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_setsafeguard, //0xB8 Cmd_magnitudedamagecalculation, //0xB9 Cmd_jumpifnopursuitswitchdmg, //0xBA - Cmd_tryrestorehpberry, //0xBB + Cmd_tryactivateitem, //0xBB Cmd_halvehp, //0xBC Cmd_copyfoestats, //0xBD Cmd_rapidspinfree, //0xBE - Cmd_setdefensecurlbit, //0xBF + Cmd_unused_0xBF, //0xBF Cmd_recoverbasedonsunlight, //0xC0 Cmd_setstickyweb, //0xC1 Cmd_selectfirstvalidtarget, //0xC2 - Cmd_trysetfutureattack, //0xC3 + Cmd_setfutureattack, //0xC3 Cmd_trydobeatup, //0xC4 Cmd_setsemiinvulnerablebit, //0xC5 Cmd_tryfiretwoturnmovenowbyeffect, //0xC6 - Cmd_setminimize, //0xC7 + Cmd_unused_0xC7, //0xC7 Cmd_unused_c8, //0xC8 Cmd_trymemento, //0xC9 Cmd_setforcedtarget, //0xCA - Cmd_setcharge, //0xCB - Cmd_callenvironmentattack, //0xCC + Cmd_unused_0xcb, //0xCB + Cmd_unused_0xCC, //0xCC Cmd_curestatuswithmove, //0xCD Cmd_settorment, //0xCE Cmd_jumpifnodamage, //0xCF @@ -826,14 +819,14 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_tryswapabilities, //0xDA Cmd_tryimprison, //0xDB Cmd_setstealthrock, //0xDC - Cmd_setuserstatus3, //0xDD - Cmd_assistattackselect, //0xDE + Cmd_trysetvolatile, //0xDD + Cmd_unused_0xde, //0xDE Cmd_trysetmagiccoat, //0xDF Cmd_trysetsnatch, //0xE0 Cmd_unused2, //0xE1 Cmd_switchoutabilities, //0xE2 Cmd_jumpifhasnohp, //0xE3 - Cmd_jumpifnotcurrentmoveargtype, //0xE4 + Cmd_unused_0xE4, //0xE4 Cmd_pickup, //0xE5 Cmd_unused_0xE6, //0xE6 Cmd_unused_0xE7, //0xE7 @@ -849,7 +842,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_trysetcaughtmondexflags, //0xF1 Cmd_displaydexinfo, //0xF2 Cmd_trygivecaughtmonnick, //0xF3 - Cmd_subattackerhpbydmg, //0xF4 + Cmd_unused_0xf4, //0xF4 Cmd_removeattackerstatus1, //0xF5 Cmd_finishaction, //0xF6 Cmd_finishturn, //0xF7 @@ -859,7 +852,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_averagestats, //0xFB Cmd_jumpifcaptivateaffected, //0xFC Cmd_setnonvolatilestatus, //0xFD - Cmd_tryworryseed, //0xFE + Cmd_tryoverwriteability, //0xFE Cmd_callnative, //0xFF }; @@ -880,41 +873,6 @@ const struct StatFractions gAccuracyStageRatios[] = { 3, 1}, // +6 }; -static const u32 sStatusFlagsForMoveEffects[NUM_MOVE_EFFECTS] = -{ - [MOVE_EFFECT_SLEEP] = STATUS1_SLEEP, - [MOVE_EFFECT_POISON] = STATUS1_POISON, - [MOVE_EFFECT_BURN] = STATUS1_BURN, - [MOVE_EFFECT_FREEZE] = STATUS1_FREEZE, - [MOVE_EFFECT_PARALYSIS] = STATUS1_PARALYSIS, - [MOVE_EFFECT_TOXIC] = STATUS1_TOXIC_POISON, - [MOVE_EFFECT_FROSTBITE] = STATUS1_FROSTBITE, - [MOVE_EFFECT_CONFUSION] = STATUS2_CONFUSION, - [MOVE_EFFECT_FLINCH] = STATUS2_FLINCHED, - [MOVE_EFFECT_UPROAR] = STATUS2_UPROAR, - [MOVE_EFFECT_CHARGING] = STATUS2_MULTIPLETURNS, - [MOVE_EFFECT_WRAP] = STATUS2_WRAPPED, - [MOVE_EFFECT_RECHARGE] = STATUS2_RECHARGE, - [MOVE_EFFECT_PREVENT_ESCAPE] = STATUS2_ESCAPE_PREVENTION, - [MOVE_EFFECT_NIGHTMARE] = STATUS2_NIGHTMARE, - [MOVE_EFFECT_THRASH] = STATUS2_LOCK_CONFUSE, -}; - -static const u8 *const sMoveEffectBS_Ptrs[] = -{ - [MOVE_EFFECT_SLEEP] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_POISON] = BattleScript_MoveEffectPoison, - [MOVE_EFFECT_BURN] = BattleScript_MoveEffectBurn, - [MOVE_EFFECT_FREEZE] = BattleScript_MoveEffectFreeze, - [MOVE_EFFECT_PARALYSIS] = BattleScript_MoveEffectParalysis, - [MOVE_EFFECT_TOXIC] = BattleScript_MoveEffectToxic, - [MOVE_EFFECT_CONFUSION] = BattleScript_MoveEffectConfusion, - [MOVE_EFFECT_UPROAR] = BattleScript_MoveEffectUproar, - [MOVE_EFFECT_PAYDAY] = BattleScript_MoveEffectPayDay, - [MOVE_EFFECT_WRAP] = BattleScript_MoveEffectWrap, - [MOVE_EFFECT_FROSTBITE] = BattleScript_MoveEffectFrostbite, -}; - static const struct WindowTemplate sUnusedWinTemplate = { .bg = 0, @@ -927,7 +885,7 @@ static const struct WindowTemplate sUnusedWinTemplate = }; static const u16 sLevelUpBanner_Pal[] = INCBIN_U16("graphics/battle_interface/level_up_banner.gbapal"); -static const u32 sLevelUpBanner_Gfx[] = INCBIN_U32("graphics/battle_interface/level_up_banner.4bpp.lz"); +static const u32 sLevelUpBanner_Gfx[] = INCBIN_U32("graphics/battle_interface/level_up_banner.4bpp.smol"); static const struct OamData sOamData_MonIconOnLvlUpBanner = { @@ -959,89 +917,6 @@ static const struct SpriteTemplate sSpriteTemplate_MonIconOnLvlUpBanner = static const u16 sProtectSuccessRates[] = {USHRT_MAX, USHRT_MAX / 2, USHRT_MAX / 4, USHRT_MAX / 8}; -static const u16 sFinalStrikeOnlyEffects[] = -{ - MOVE_EFFECT_BUG_BITE, - MOVE_EFFECT_STEAL_ITEM, - MOVE_EFFECT_REMOVE_ARG_TYPE, - MOVE_EFFECT_REMOVE_STATUS, - MOVE_EFFECT_RECOIL_HP_25, - MOVE_EFFECT_PREVENT_ESCAPE, - MOVE_EFFECT_WRAP, -}; - -static const u16 sNaturePowerMoves[BATTLE_ENVIRONMENT_COUNT] = -{ -#if B_NATURE_POWER_MOVES >= GEN_7 - [BATTLE_ENVIRONMENT_GRASS] = MOVE_ENERGY_BALL, - [BATTLE_ENVIRONMENT_LONG_GRASS] = MOVE_ENERGY_BALL, - [BATTLE_ENVIRONMENT_SAND] = MOVE_EARTH_POWER, - [BATTLE_ENVIRONMENT_WATER] = MOVE_HYDRO_PUMP, - [BATTLE_ENVIRONMENT_POND] = MOVE_HYDRO_PUMP, - [BATTLE_ENVIRONMENT_MOUNTAIN] = MOVE_EARTH_POWER, - [BATTLE_ENVIRONMENT_CAVE] = MOVE_EARTH_POWER, - [BATTLE_ENVIRONMENT_BUILDING] = MOVE_TRI_ATTACK, - [BATTLE_ENVIRONMENT_PLAIN] = MOVE_TRI_ATTACK, - [BATTLE_ENVIRONMENT_SNOW] = MOVE_ICE_BEAM, -#elif B_NATURE_POWER_MOVES == GEN_6 - [BATTLE_ENVIRONMENT_GRASS] = MOVE_ENERGY_BALL, - [BATTLE_ENVIRONMENT_LONG_GRASS] = MOVE_ENERGY_BALL, - [BATTLE_ENVIRONMENT_SAND] = MOVE_EARTH_POWER, - [BATTLE_ENVIRONMENT_WATER] = MOVE_HYDRO_PUMP, - [BATTLE_ENVIRONMENT_POND] = MOVE_HYDRO_PUMP, - [BATTLE_ENVIRONMENT_MOUNTAIN] = MOVE_EARTH_POWER, - [BATTLE_ENVIRONMENT_CAVE] = MOVE_EARTH_POWER, - [BATTLE_ENVIRONMENT_BUILDING] = MOVE_TRI_ATTACK, - [BATTLE_ENVIRONMENT_PLAIN] = MOVE_TRI_ATTACK, - [BATTLE_ENVIRONMENT_SNOW] = MOVE_FROST_BREATH, -#elif B_NATURE_POWER_MOVES == GEN_5 - [BATTLE_ENVIRONMENT_GRASS] = MOVE_SEED_BOMB, - [BATTLE_ENVIRONMENT_LONG_GRASS] = MOVE_SEED_BOMB, - [BATTLE_ENVIRONMENT_SAND] = MOVE_EARTHQUAKE, - [BATTLE_ENVIRONMENT_WATER] = MOVE_HYDRO_PUMP, - [BATTLE_ENVIRONMENT_POND] = MOVE_HYDRO_PUMP, - [BATTLE_ENVIRONMENT_MOUNTAIN] = MOVE_EARTHQUAKE, - [BATTLE_ENVIRONMENT_CAVE] = MOVE_EARTHQUAKE, - [BATTLE_ENVIRONMENT_BUILDING] = MOVE_TRI_ATTACK, - [BATTLE_ENVIRONMENT_PLAIN] = MOVE_EARTHQUAKE, - [BATTLE_ENVIRONMENT_SNOW] = MOVE_BLIZZARD, -#elif B_NATURE_POWER_MOVES == GEN_4 - [BATTLE_ENVIRONMENT_GRASS] = MOVE_SEED_BOMB, - [BATTLE_ENVIRONMENT_LONG_GRASS] = MOVE_SEED_BOMB, - [BATTLE_ENVIRONMENT_SAND] = MOVE_EARTHQUAKE, - [BATTLE_ENVIRONMENT_WATER] = MOVE_HYDRO_PUMP, - [BATTLE_ENVIRONMENT_POND] = MOVE_HYDRO_PUMP, - [BATTLE_ENVIRONMENT_MOUNTAIN] = MOVE_ROCK_SLIDE, - [BATTLE_ENVIRONMENT_CAVE] = MOVE_ROCK_SLIDE, - [BATTLE_ENVIRONMENT_BUILDING] = MOVE_TRI_ATTACK, - [BATTLE_ENVIRONMENT_PLAIN] = MOVE_EARTHQUAKE, - [BATTLE_ENVIRONMENT_SNOW] = MOVE_BLIZZARD, -#else // Gen 1-3 - [BATTLE_ENVIRONMENT_GRASS] = MOVE_STUN_SPORE, - [BATTLE_ENVIRONMENT_LONG_GRASS] = MOVE_RAZOR_LEAF, - [BATTLE_ENVIRONMENT_SAND] = MOVE_EARTHQUAKE, - [BATTLE_ENVIRONMENT_WATER] = MOVE_SURF, - [BATTLE_ENVIRONMENT_POND] = MOVE_BUBBLE_BEAM, - [BATTLE_ENVIRONMENT_MOUNTAIN] = MOVE_ROCK_SLIDE, - [BATTLE_ENVIRONMENT_CAVE] = MOVE_SHADOW_BALL, - [BATTLE_ENVIRONMENT_BUILDING] = MOVE_SWIFT, - [BATTLE_ENVIRONMENT_PLAIN] = MOVE_SWIFT, - [BATTLE_ENVIRONMENT_SNOW] = MOVE_BLIZZARD, -#endif - [BATTLE_ENVIRONMENT_UNDERWATER] = MOVE_HYDRO_PUMP, - [BATTLE_ENVIRONMENT_SOARING] = MOVE_AIR_SLASH, - [BATTLE_ENVIRONMENT_SKY_PILLAR] = MOVE_AIR_SLASH, - [BATTLE_ENVIRONMENT_BURIAL_GROUND] = MOVE_SHADOW_BALL, - [BATTLE_ENVIRONMENT_PUDDLE] = MOVE_MUD_BOMB, - [BATTLE_ENVIRONMENT_MARSH] = MOVE_MUD_BOMB, - [BATTLE_ENVIRONMENT_SWAMP] = MOVE_MUD_BOMB, - [BATTLE_ENVIRONMENT_ICE] = MOVE_ICE_BEAM, - [BATTLE_ENVIRONMENT_VOLCANO] = MOVE_LAVA_PLUME, - [BATTLE_ENVIRONMENT_DISTORTION_WORLD] = MOVE_TRI_ATTACK, - [BATTLE_ENVIRONMENT_SPACE] = MOVE_DRACO_METEOR, - [BATTLE_ENVIRONMENT_ULTRA_SPACE] = MOVE_PSYSHOCK, -}; - #define _ 0 static const struct PickupItem sPickupTable[] = @@ -1080,31 +955,23 @@ static const struct PickupItem sPickupTable[] = #undef _ -static const u8 sEnvironmentToType[BATTLE_ENVIRONMENT_COUNT] = -{ - [BATTLE_ENVIRONMENT_GRASS] = TYPE_GRASS, - [BATTLE_ENVIRONMENT_LONG_GRASS] = TYPE_GRASS, - [BATTLE_ENVIRONMENT_SAND] = TYPE_GROUND, - [BATTLE_ENVIRONMENT_UNDERWATER] = TYPE_WATER, - [BATTLE_ENVIRONMENT_WATER] = TYPE_WATER, - [BATTLE_ENVIRONMENT_POND] = TYPE_WATER, - [BATTLE_ENVIRONMENT_CAVE] = TYPE_ROCK, - [BATTLE_ENVIRONMENT_BUILDING] = TYPE_NORMAL, - [BATTLE_ENVIRONMENT_SOARING] = TYPE_FLYING, - [BATTLE_ENVIRONMENT_SKY_PILLAR] = TYPE_FLYING, - [BATTLE_ENVIRONMENT_BURIAL_GROUND] = TYPE_GHOST, - [BATTLE_ENVIRONMENT_PUDDLE] = TYPE_GROUND, - [BATTLE_ENVIRONMENT_MARSH] = TYPE_GROUND, - [BATTLE_ENVIRONMENT_SWAMP] = TYPE_GROUND, - [BATTLE_ENVIRONMENT_SNOW] = TYPE_ICE, - [BATTLE_ENVIRONMENT_ICE] = TYPE_ICE, - [BATTLE_ENVIRONMENT_VOLCANO] = TYPE_FIRE, - [BATTLE_ENVIRONMENT_DISTORTION_WORLD] = TYPE_NORMAL, - [BATTLE_ENVIRONMENT_SPACE] = TYPE_DRAGON, - [BATTLE_ENVIRONMENT_ULTRA_SPACE] = TYPE_PSYCHIC, - [BATTLE_ENVIRONMENT_MOUNTAIN] = (B_CAMOUFLAGE_TYPES >= GEN_5 ? TYPE_GROUND : TYPE_ROCK), - [BATTLE_ENVIRONMENT_PLAIN] = (B_CAMOUFLAGE_TYPES >= GEN_4 ? TYPE_GROUND : TYPE_NORMAL), -}; +static void ValidateSavedBattlerCounts(void) +{ + if (gBattleStruct->savedAttackerCount > 0) + { + if (TESTING) + Test_ExitWithResult(TEST_RESULT_ERROR, 0, "savedAttackerCount is greater than 0! More calls to SaveBattlerAttacker than RestoreBattlerAttacker!", __FILE__, __LINE__); + else + DebugPrintfLevel(MGBA_LOG_WARN, "savedAttackerCount is greater than 0! More calls to SaveBattlerAttacker than RestoreBattlerAttacker!"); + } + if (gBattleStruct->savedTargetCount > 0) + { + if (TESTING) + Test_ExitWithResult(TEST_RESULT_ERROR, 0, "savedTargetCount is greater than 0! More calls to SaveBattlerTarget than RestoreBattlerTarget!", __FILE__, __LINE__); + else + DebugPrintfLevel(MGBA_LOG_WARN, "savedTargetCount is greater than 0! More calls to SaveBattlerTarget than RestoreBattlerTarget!"); + } +} static bool32 NoTargetPresent(u8 battler, u32 move) { @@ -1132,7 +999,7 @@ static bool32 NoTargetPresent(u8 battler, u32 move) return FALSE; } -bool32 ProteanTryChangeType(u32 battler, u32 ability, u32 move, u32 moveType) +bool32 ProteanTryChangeType(u32 battler, enum Ability ability, u32 move, enum Type moveType) { if ((ability == ABILITY_PROTEAN || ability == ABILITY_LIBERO) && !gDisableStructs[gBattlerAttacker].usedProteanLibero @@ -1152,6 +1019,34 @@ bool32 IsMoveNotAllowedInSkyBattles(u32 move) return (gBattleStruct->isSkyBattle && IsMoveSkyBattleBanned(gCurrentMove)); } +static void TryClearChargeVolatile(u32 moveType) +{ + if (B_CHARGE < GEN_9) // Prior to gen9, charge is cleared during the end turn + return; + + if (moveType == TYPE_ELECTRIC && gBattleMons[gBattlerAttacker].volatiles.chargeTimer == 1) + gBattleMons[gBattlerAttacker].volatiles.chargeTimer = 0; + + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (gBattleMons[battler].volatiles.chargeTimer == 2) // Has been set this turn by move + gBattleMons[battler].volatiles.chargeTimer--; + } +} + +static bool32 IsAnyTargetAffected(void) +{ + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (battler == gBattlerAttacker) + continue; + + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT)) + return TRUE; + } + return FALSE; +} + u32 NumAffectedSpreadMoveTargets(void) { u32 targetCount = 0; @@ -1170,9 +1065,9 @@ u32 NumAffectedSpreadMoveTargets(void) u32 NumFaintedBattlersByAttacker(u32 battlerAtk) { - u32 numMonsFainted = 0; + u32 battler, numMonsFainted = 0; - for (u32 battler = 0; battler < gBattlersCount; battler++) + for (battler = 0; battler < gBattlersCount; battler++) { if (battler == battlerAtk) continue; @@ -1184,52 +1079,43 @@ u32 NumFaintedBattlersByAttacker(u32 battlerAtk) return numMonsFainted; } -bool32 IsMovePowderBlocked(u32 battlerAtk, u32 battlerDef, u32 move) +bool32 IsPowderMoveBlocked(struct BattleContext *ctx) { - bool32 effect = FALSE; - - if (IsPowderMove(move) && (battlerAtk != battlerDef)) - { - if (B_POWDER_GRASS >= GEN_6 - && (IS_BATTLER_OF_TYPE(battlerDef, TYPE_GRASS) || GetBattlerAbility(battlerDef) == ABILITY_OVERCOAT)) - { - gBattlerAbility = battlerDef; - RecordAbilityBattle(gBattlerTarget, ABILITY_OVERCOAT); - effect = TRUE; - } - else if (GetBattlerHoldEffect(battlerDef, TRUE) == HOLD_EFFECT_SAFETY_GOGGLES) - { - RecordItemEffectBattle(battlerDef, HOLD_EFFECT_SAFETY_GOGGLES); - gLastUsedItem = gBattleMons[battlerDef].item; - effect = TRUE; - } - - if (effect) - gBattlescriptCurrInstr = BattleScript_PowderMoveNoEffect; - } + if (!IsPowderMove(ctx->currentMove) + || ctx->battlerAtk == ctx->battlerDef + || IsAffectedByPowderMove(ctx->battlerDef, ctx->abilities[ctx->battlerDef], GetBattlerHoldEffect(ctx->battlerDef))) + return FALSE; - return effect; + gBattlescriptCurrInstr = BattleScript_PowderMoveNoEffect; + return TRUE; } bool32 EmergencyExitCanBeTriggered(u32 battler) { - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); if (ability != ABILITY_EMERGENCY_EXIT && ability != ABILITY_WIMP_OUT) return FALSE; - if (IsBattlerTurnDamaged(battler) - && IsBattlerAlive(battler) + if (IsBattlerAlive(battler) && HadMoreThanHalfHpNowDoesnt(battler) && (CanBattlerSwitch(battler) || !(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) && !(gBattleTypeFlags & BATTLE_TYPE_ARENA) - && CountUsablePartyMons(battler) > 0 - && !(gStatuses3[battler] & STATUS3_SKY_DROPPED)) + && gBattleMons[battler].volatiles.semiInvulnerable != STATE_SKY_DROP) return TRUE; return FALSE; } +static inline bool32 IsBattlerUsingBeakBlast(u32 battler) +{ + if (gChosenActionByBattler[battler] != B_ACTION_USE_MOVE) + return FALSE; + if (GetMoveEffect(gChosenMoveByBattler[battler]) != EFFECT_BEAK_BLAST) + return FALSE; + return !HasBattlerActedThisTurn(battler); +} + static void Cmd_attackcanceler(void) { CMD_ARGS(); @@ -1247,19 +1133,31 @@ static void Cmd_attackcanceler(void) return; } - enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove); + struct BattleContext ctx = {0}; + ctx.battlerAtk = gBattlerAttacker; + ctx.battlerDef = gBattlerTarget; + ctx.currentMove = gCurrentMove; + + enum BattleMoveEffects moveEffect = GetMoveEffect(ctx.currentMove); - if (!IsBattlerAlive(gBattlerAttacker) && effect != EFFECT_EXPLOSION && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) + if (!IsBattlerAlive(gBattlerAttacker) + && moveEffect != EFFECT_EXPLOSION + && moveEffect != EFFECT_MISTY_EXPLOSION) { gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattlescriptCurrInstr = BattleScript_MoveEnd; return; } - if (AtkCanceller_MoveSuccessOrder()) + + // With how attackcanceler works right now we only need attacker and target abilities. Might change in the future + ctx.abilities[ctx.battlerAtk] = GetBattlerAbility(ctx.battlerAtk); + ctx.abilities[ctx.battlerDef] = GetBattlerAbility(ctx.battlerDef); + + if (AtkCanceler_MoveSuccessOrder(&ctx) != MOVE_STEP_SUCCESS) return; if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_OFF - && GetBattlerAbility(gBattlerAttacker) == ABILITY_PARENTAL_BOND + && ctx.abilities[ctx.battlerAtk] == ABILITY_PARENTAL_BOND && IsMoveAffectedByParentalBond(gCurrentMove, gBattlerAttacker) && !(gAbsentBattlerFlags & (1u << gBattlerTarget)) && GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE) @@ -1270,68 +1168,73 @@ static void Cmd_attackcanceler(void) return; } - - u32 abilityDef = GetBattlerAbility(gBattlerTarget); - if (CanAbilityBlockMove(gBattlerAttacker, - gBattlerTarget, - GetBattlerAbility(gBattlerAttacker), - abilityDef, - gCurrentMove, - ABILITY_RUN_SCRIPT)) + if (CanAbilityBlockMove( + ctx.battlerAtk, + ctx.battlerDef, + ctx.abilities[ctx.battlerAtk], + ctx.abilities[ctx.battlerDef], + ctx.currentMove, + RUN_SCRIPT)) return; - if (GetMoveNonVolatileStatus(gCurrentMove) == MOVE_EFFECT_PARALYSIS) + if (GetMoveNonVolatileStatus(ctx.currentMove) == MOVE_EFFECT_PARALYSIS) { - if (CanAbilityAbsorbMove(gBattlerAttacker, - gBattlerTarget, - abilityDef, - gCurrentMove, - GetBattleMoveType(gCurrentMove), - ABILITY_RUN_SCRIPT)) + if (CanAbilityAbsorbMove( + ctx.battlerAtk, + ctx.battlerDef, + ctx.abilities[ctx.battlerDef], + ctx.currentMove, + GetBattleMoveType(ctx.currentMove), + RUN_SCRIPT)) return; } - if (IsMovePowderBlocked(gBattlerAttacker, gBattlerTarget, gCurrentMove)) - return; - - if (!gBattleMons[gBattlerAttacker].pp[gCurrMovePos] && gCurrentMove != MOVE_STRUGGLE - && !(gHitMarker & (HITMARKER_ALLOW_NO_PP | HITMARKER_NO_ATTACKSTRING | HITMARKER_NO_PPDEDUCT)) - && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) - { - gBattlescriptCurrInstr = BattleScript_NoPPForMove; - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + if (IsPowderMoveBlocked(&ctx)) return; - } - - gHitMarker &= ~HITMARKER_ALLOW_NO_PP; // Check if no available target present on the field or if Sky Battles ban the move if ((NoTargetPresent(gBattlerAttacker, gCurrentMove) - && (!gBattleMoveEffects[effect].twoTurnEffect || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS))) + && (!gBattleMoveEffects[moveEffect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns))) || (IsMoveNotAllowedInSkyBattles(gCurrentMove))) { gBattleStruct->noTargetPresent = TRUE; - if (effect == EFFECT_FLING) // Edge case for removing a mon's item when there is no target available after using Fling. + if (moveEffect == EFFECT_FLING) // Edge case for removing a mon's item when there is no target available after using Fling. gBattlescriptCurrInstr = BattleScript_FlingFailConsumeItem; else - gBattlescriptCurrInstr = BattleScript_FailedFromAtkString; + gBattlescriptCurrInstr = BattleScript_ButItFailed; - if (!gBattleMoveEffects[effect].twoTurnEffect || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + if (!gBattleMoveEffects[moveEffect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns)) + CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELER_CHECK); return; } u32 isBounceable = MoveCanBeBouncedBack(gCurrentMove); - if (gProtectStructs[gBattlerTarget].bounceMove + bool32 bounceActive = (gProtectStructs[gBattlerTarget].bounceMove && IsBattlerAlive(gBattlerTarget)); + + if (!bounceActive + && !gBattleStruct->bouncedMoveIsUsed + && isBounceable + && GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove) == MOVE_TARGET_OPPONENTS_FIELD) + { + u32 partner = BATTLE_PARTNER(gBattlerTarget); + + if (partner < gBattlersCount + && GetBattlerSide(partner) == GetBattlerSide(gBattlerTarget) + && gProtectStructs[partner].bounceMove + && IsBattlerAlive(partner)) + { + gBattlerTarget = partner; + bounceActive = TRUE; + } + } + + if (bounceActive && isBounceable && !gBattleStruct->bouncedMoveIsUsed) { gBattleStruct->bouncedMoveIsUsed = TRUE; // Edge case for bouncing a powder move against a grass type pokemon. - - ClearDamageCalcResults(); - SetAtkCancellerForCalledMove(); gEffectBattler = gBattlerTarget; if (BlocksPrankster(gCurrentMove, gBattlerTarget, gBattlerAttacker, TRUE)) { @@ -1341,8 +1244,7 @@ static void Cmd_attackcanceler(void) } else { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MagicCoat; + BattleScriptCall(BattleScript_MagicCoat); } return; } @@ -1350,7 +1252,7 @@ static void Cmd_attackcanceler(void) { u32 battler = gBattlerTarget; - if (abilityDef == ABILITY_MAGIC_BOUNCE) + if (ctx.abilities[ctx.battlerDef] == ABILITY_MAGIC_BOUNCE) { battler = gBattlerTarget; gBattleStruct->bouncedMoveIsUsed = TRUE; @@ -1365,10 +1267,7 @@ static void Cmd_attackcanceler(void) if (gBattleStruct->bouncedMoveIsUsed) { - ClearDamageCalcResults(); - SetAtkCancellerForCalledMove(); // Edge case for bouncing a powder move against a grass type pokemon. - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MagicBounce; + BattleScriptCall(BattleScript_MagicBounce); gBattlerAbility = battler; return; } @@ -1384,45 +1283,32 @@ static void Cmd_attackcanceler(void) return; } - for (u32 i = 0; i < gBattlersCount; i++) + u32 i; + for (i = 0; i < gBattlersCount; i++) { if ((gProtectStructs[gBattlerByTurnOrder[i]].stealMove) && MoveCanBeSnatched(gCurrentMove)) { gProtectStructs[gBattlerByTurnOrder[i]].stealMove = FALSE; gBattleStruct->snatchedMoveIsUsed = TRUE; gBattleScripting.battler = gBattlerByTurnOrder[i]; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SnatchedMove; + BattleScriptCall(BattleScript_SnatchedMove); return; } } - if (gSpecialStatuses[gBattlerTarget].lightningRodRedirected) - { - gSpecialStatuses[gBattlerTarget].lightningRodRedirected = FALSE; - gLastUsedAbility = ABILITY_LIGHTNING_ROD; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TookAttack; - RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); - } - else if (gSpecialStatuses[gBattlerTarget].stormDrainRedirected) + if (gSpecialStatuses[gBattlerTarget].abilityRedirected) { - gSpecialStatuses[gBattlerTarget].stormDrainRedirected = FALSE; - gLastUsedAbility = ABILITY_STORM_DRAIN; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TookAttack; - RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); + gSpecialStatuses[gBattlerTarget].abilityRedirected = FALSE; + BattleScriptCall(BattleScript_TookAttack); } else if (IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove) - && (effect != EFFECT_CURSE || IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) - && (!gBattleMoveEffects[effect].twoTurnEffect || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) - && effect != EFFECT_SUCKER_PUNCH - && effect != EFFECT_COUNTER - && effect != EFFECT_UPPER_HAND) + && (moveEffect != EFFECT_CURSE || IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) + && (!gBattleMoveEffects[moveEffect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns)) + && moveEffect != EFFECT_COUNTER) { - if (IsMoveMakingContact(gCurrentMove, gBattlerAttacker)) + if (!CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove)) gProtectStructs[gBattlerAttacker].touchedProtectLike = TRUE; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELER_CHECK); gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; gLastLandedMoves[gBattlerTarget] = 0; gLastHitByType[gBattlerTarget] = 0; @@ -1436,7 +1322,8 @@ static void Cmd_attackcanceler(void) gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED; gBattlescriptCurrInstr = cmd->nextInstr; } - else if (gProtectStructs[gBattlerTarget].beakBlastCharge && IsMoveMakingContact(gCurrentMove, gBattlerAttacker)) + else if (IsBattlerUsingBeakBlast(gBattlerTarget) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove)) { gProtectStructs[gBattlerAttacker].touchedProtectLike = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; @@ -1458,22 +1345,29 @@ static void JumpIfMoveFailed(u32 adder, u32 move, u32 moveType, const u8 *failIn } else { - TrySetDestinyBondToHappen(); - if (CanAbilityAbsorbMove(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerTarget), move, moveType, - ABILITY_RUN_SCRIPT)) + RUN_SCRIPT)) return; } gBattlescriptCurrInstr += adder; } -static void Cmd_unused5(void) +static void Cmd_setchargingturn(void) { + CMD_ARGS(); + + if (!gBattleMons[gBattlerAttacker].volatiles.multipleTurns) + { + gBattleMons[gBattlerAttacker].volatiles.multipleTurns = TRUE; + gLockedMoves[gBattlerAttacker] = gCurrentMove; + gProtectStructs[gBattlerAttacker].chargingTurn = TRUE; + } + gBattlescriptCurrInstr = cmd->nextInstr; } static bool32 JumpIfMoveAffectedByProtect(u32 move, u32 battler, u32 shouldJump, const u8 *failInstr) @@ -1488,227 +1382,39 @@ static bool32 JumpIfMoveAffectedByProtect(u32 move, u32 battler, u32 shouldJump, return affected; } -static bool32 AccuracyCalcHelper(u32 move, u32 battler) -{ - bool32 effect = FALSE; - u32 ability = ABILITY_NONE; - enum BattleMoveEffects moveEffect = GetMoveEffect(move); - u32 nonVolatileStatus = GetMoveNonVolatileStatus(move); - - if ((gStatuses3[battler] & STATUS3_ALWAYS_HITS && gDisableStructs[battler].battlerWithSureHit == gBattlerAttacker) - || (B_TOXIC_NEVER_MISS >= GEN_6 - && nonVolatileStatus == MOVE_EFFECT_TOXIC - && IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_POISON)) - || gStatuses4[battler] & STATUS4_GLAIVE_RUSH) - { - effect = TRUE; - } - // If the attacker has the ability No Guard and they aren't targeting a Pokemon involved in a Sky Drop with the move Sky Drop, move hits. - else if (GetBattlerAbility(gBattlerAttacker) == ABILITY_NO_GUARD - && !(gStatuses3[battler] & STATUS3_COMMANDER) - && (moveEffect != EFFECT_SKY_DROP || gBattleStruct->skyDropTargets[battler] == SKY_DROP_NO_TARGET)) - { - effect = TRUE; - ability = ABILITY_NO_GUARD; - } - // If the target has the ability No Guard and they aren't involved in a Sky Drop or the current move isn't Sky Drop, move hits. - else if (GetBattlerAbility(battler) == ABILITY_NO_GUARD - && (moveEffect != EFFECT_SKY_DROP || gBattleStruct->skyDropTargets[battler] == SKY_DROP_NO_TARGET)) - { - effect = TRUE; - ability = ABILITY_NO_GUARD; - } - // If the target is under the effects of Telekinesis, and the move isn't a OH-KO move, move hits. - else if (gStatuses3[battler] & STATUS3_TELEKINESIS - && !(gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE) - && moveEffect != EFFECT_OHKO) - { - effect = TRUE; - } - else if (gBattleStruct->battlerState[battler].pursuitTarget) - { - effect = TRUE; - } - else if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !(gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE)) - { - effect = TRUE; - } - else if ((gStatuses3[battler] & STATUS3_COMMANDER) - || (gStatuses3[battler] & STATUS3_PHANTOM_FORCE) - || ((gStatuses3[battler] & STATUS3_ON_AIR) && !(MoveDamagesAirborne(move) || MoveDamagesAirborneDoubleDamage(move))) - || ((gStatuses3[battler] & STATUS3_UNDERGROUND) && !MoveDamagesUnderground(move)) - || ((gStatuses3[battler] & STATUS3_UNDERWATER) && !MoveDamagesUnderWater(move))) - { - gBattleStruct->moveResultFlags[battler] |= MOVE_RESULT_MISSED; - effect = TRUE; - } - else if (B_MINIMIZE_DMG_ACC >= GEN_6 - && (gStatuses3[battler] & STATUS3_MINIMIZED) - && MoveIncreasesPowerToMinimizedTargets(move)) - { - effect = TRUE; - } - else if (GetMoveAccuracy(move) == 0) - { - effect = TRUE; - } - - if (!effect && HasWeatherEffect()) - { - if (MoveAlwaysHitsInRain(move) && IsBattlerWeatherAffected(battler, B_WEATHER_RAIN)) - effect = TRUE; - else if ((gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) && MoveAlwaysHitsInHailSnow(move)) - effect = TRUE; - - if (effect) - return effect; - } - - if (ability != ABILITY_NONE) - RecordAbilityBattle(gBattlerAttacker, ABILITY_NO_GUARD); - - return effect; -} - -u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect) -{ - u32 calc, moveAcc; - s8 buff, accStage, evasionStage; - u32 atkParam = GetBattlerHoldEffectParam(battlerAtk); - u32 defParam = GetBattlerHoldEffectParam(battlerDef); - u32 atkAlly = BATTLE_PARTNER(battlerAtk); - u32 atkAllyAbility = GetBattlerAbility(atkAlly); - - gPotentialItemEffectBattler = battlerDef; - accStage = gBattleMons[battlerAtk].statStages[STAT_ACC]; - evasionStage = gBattleMons[battlerDef].statStages[STAT_EVASION]; - if (atkAbility == ABILITY_UNAWARE || atkAbility == ABILITY_KEEN_EYE || atkAbility == ABILITY_MINDS_EYE - || (B_ILLUMINATE_EFFECT >= GEN_9 && atkAbility == ABILITY_ILLUMINATE)) - evasionStage = DEFAULT_STAT_STAGE; - if (MoveIgnoresDefenseEvasionStages(move)) - evasionStage = DEFAULT_STAT_STAGE; - if (defAbility == ABILITY_UNAWARE) - accStage = DEFAULT_STAT_STAGE; - - if (gBattleMons[battlerDef].status2 & STATUS2_FORESIGHT || gStatuses3[battlerDef] & STATUS3_MIRACLE_EYED) - buff = accStage; - else - buff = accStage + DEFAULT_STAT_STAGE - evasionStage; - - if (buff < MIN_STAT_STAGE) - buff = MIN_STAT_STAGE; - if (buff > MAX_STAT_STAGE) - buff = MAX_STAT_STAGE; - - moveAcc = GetMoveAccuracy(move); - // Check Thunder and Hurricane on sunny weather. - if (IsBattlerWeatherAffected(battlerDef, B_WEATHER_SUN) && MoveHas50AccuracyInSun(move)) - moveAcc = 50; - // Check Wonder Skin. - if (defAbility == ABILITY_WONDER_SKIN && IsBattleMoveStatus(move) && moveAcc > 50) - moveAcc = 50; - - calc = gAccuracyStageRatios[buff].dividend * moveAcc; - calc /= gAccuracyStageRatios[buff].divisor; - - // Attacker's ability - switch (atkAbility) - { - case ABILITY_COMPOUND_EYES: - calc = (calc * 130) / 100; // 1.3 compound eyes boost - break; - case ABILITY_VICTORY_STAR: - calc = (calc * 110) / 100; // 1.1 victory star boost - break; - case ABILITY_HUSTLE: - if (IsBattleMovePhysical(move)) - calc = (calc * 80) / 100; // 1.2 hustle loss - break; - } - - // Target's ability - switch (defAbility) - { - case ABILITY_SAND_VEIL: - if (HasWeatherEffect() && gBattleWeather & B_WEATHER_SANDSTORM) - calc = (calc * 80) / 100; // 1.2 sand veil loss - break; - case ABILITY_SNOW_CLOAK: - if (HasWeatherEffect() && (gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW))) - calc = (calc * 80) / 100; // 1.2 snow cloak loss - break; - case ABILITY_TANGLED_FEET: - if (gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) - calc = (calc * 50) / 100; // 1.5 tangled feet loss - break; - } - - // Attacker's ally's ability - switch (atkAllyAbility) - { - case ABILITY_VICTORY_STAR: - if (IsBattlerAlive(atkAlly)) - calc = (calc * 110) / 100; // 1.1 ally's victory star boost - break; - } - - // Attacker's hold effect - switch (atkHoldEffect) - { - case HOLD_EFFECT_WIDE_LENS: - calc = (calc * (100 + atkParam)) / 100; - break; - case HOLD_EFFECT_ZOOM_LENS: - if (GetBattlerTurnOrderNum(battlerAtk) > GetBattlerTurnOrderNum(battlerDef)) - calc = (calc * (100 + atkParam)) / 100; - break; - } - - // Target's hold effect - switch (defHoldEffect) - { - case HOLD_EFFECT_EVASION_UP: - calc = (calc * (100 - defParam)) / 100; - break; - } - - if (gBattleStruct->battlerState[battlerAtk].usedMicleBerry) - { - if (atkAbility == ABILITY_RIPEN) - calc = (calc * 140) / 100; // ripen gives 40% acc boost - else - calc = (calc * 120) / 100; // 20% acc boost - } - - if (gFieldStatuses & STATUS_FIELD_GRAVITY) - calc = (calc * 5) / 3; // 1.66 Gravity acc boost - - if (B_AFFECTION_MECHANICS == TRUE && GetBattlerAffectionHearts(battlerDef) == AFFECTION_FIVE_HEARTS) - calc = (calc * 90) / 100; - - if (HasWeatherEffect() && gBattleWeather & B_WEATHER_FOG) - calc = (calc * 60) / 100; // modified by 3/5 - - return calc; -} - static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u8 *failInstr, u16 move) { if (move == ACC_CURR_MOVE) move = gCurrentMove; - enum BattleMoveEffects effect = GetMoveEffect(move); - u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); - enum ItemHoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); - if (move == NO_ACC_CALC_CHECK_LOCK_ON) { - if (gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) + if (gBattleMons[gBattlerTarget].volatiles.lockOn && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) + { gBattlescriptCurrInstr = nextInstr; - else if (gStatuses3[gBattlerTarget] & (STATUS3_SEMI_INVULNERABLE)) + } + else if (IsSemiInvulnerable(gBattlerTarget, CHECK_ALL)) + { + if (gBattlerTarget != BATTLE_PARTNER(gBattlerAttacker)) + { + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + gBattleStruct->missStringId[gBattlerTarget] = gBattleCommunication[MISS_TYPE] = B_MSG_AVOIDED_ATK; + } gBattlescriptCurrInstr = failInstr; - else if (!JumpIfMoveAffectedByProtect(gCurrentMove, gBattlerTarget, TRUE, failInstr)) + } + else if (IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove)) + { + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + gBattleStruct->missStringId[gBattlerTarget] = gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED; + gLastLandedMoves[gBattlerTarget] = 0; + gLastHitByType[gBattlerTarget] = 0; + gBattlescriptCurrInstr = failInstr; + } + else + { gBattlescriptCurrInstr = nextInstr; + } + if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX) { if (gProtectStructs[gBattlerTarget].protected == PROTECT_MAX_GUARD) @@ -1719,10 +1425,16 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u GetBattlerAbility(gBattlerTarget), gCurrentMove, GetBattleMoveType(gCurrentMove), - ABILITY_RUN_SCRIPT); + RUN_SCRIPT); } + return; } - else if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_2ND_HIT + + enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); + enum HoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker); + enum BattleMoveEffects effect = GetMoveEffect(move); + + if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_2ND_HIT || (gSpecialStatuses[gBattlerAttacker].multiHitOn && (abilityAtk == ABILITY_SKILL_LINK || holdEffectAtk == HOLD_EFFECT_LOADED_DICE || !(effect == EFFECT_TRIPLE_KICK || effect == EFFECT_POPULATION_BOMB)))) @@ -1732,33 +1444,37 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u } else { - u32 numTargets = 0; - u32 numMisses = 0; - u32 moveType = GetBattleMoveType(move); - u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, move); + u32 battlerDef, + numTargets = 0, + numMisses = 0, + moveType = GetBattleMoveType(move), + moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, move); bool32 calcSpreadMove = IsSpreadMove(moveTarget) && !IsBattleMoveStatus(move); - for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { if (gBattleStruct->calculatedSpreadMoveAccuracy) break; if ((!calcSpreadMove && battlerDef != gBattlerTarget) || IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) - || (gBattleStruct->noResultString[battlerDef] && gBattleStruct->noResultString[battlerDef] != DO_ACCURACY_CHECK)) + || gBattleStruct->noResultString[battlerDef] == WILL_FAIL) continue; numTargets++; - if (JumpIfMoveAffectedByProtect(move, battlerDef, FALSE, failInstr) || AccuracyCalcHelper(move, battlerDef)) + enum Ability abilityDef = GetBattlerAbility(battlerDef); + if (JumpIfMoveAffectedByProtect(move, battlerDef, FALSE, failInstr) + || CanMoveSkipAccuracyCalc(gBattlerAttacker, battlerDef, abilityAtk, abilityDef, move, RUN_SCRIPT)) continue; + u32 holdEffectDef = GetBattlerHoldEffect(battlerDef); u32 accuracy = GetTotalAccuracy(gBattlerAttacker, battlerDef, move, abilityAtk, - GetBattlerAbility(battlerDef), + abilityDef, holdEffectAtk, - GetBattlerHoldEffect(battlerDef, TRUE)); + holdEffectDef); if (!RandomPercentage(RNG_ACCURACY, accuracy)) { @@ -1783,7 +1499,21 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u } if (GetMovePower(move) != 0) - CalcTypeEffectivenessMultiplier(move, moveType, gBattlerAttacker, battlerDef, GetBattlerAbility(battlerDef), TRUE); + { + struct DamageContext ctx = {0}; + ctx.battlerAtk = gBattlerAttacker; + ctx.battlerDef = battlerDef; + ctx.move = move; + ctx.chosenMove = gChosenMove; + ctx.moveType = moveType; + ctx.updateFlags = TRUE; + ctx.abilityAtk = abilityAtk; + ctx.abilityDef = abilityDef; + ctx.holdEffectAtk = holdEffectAtk; + ctx.holdEffectDef = holdEffectDef; + + CalcTypeEffectivenessMultiplier(&ctx); + } } } @@ -1810,76 +1540,20 @@ static void Cmd_accuracycheck(void) AccuracyCheck(FALSE, cmd->nextInstr, cmd->failInstr, cmd->move); } -static void Cmd_attackstring(void) +static void Cmd_printattackstring(void) { CMD_ARGS(); if (gBattleControllerExecFlags) return; - if (!(gHitMarker & (HITMARKER_NO_ATTACKSTRING | HITMARKER_ATTACKSTRING_PRINTED))) - { - PrepareStringBattle(STRINGID_USEDMOVE, gBattlerAttacker); - gHitMarker |= HITMARKER_ATTACKSTRING_PRINTED; - } - gBattlescriptCurrInstr = cmd->nextInstr; + PrepareStringBattle(STRINGID_USEDMOVE, gBattlerAttacker); gBattleCommunication[MSG_DISPLAY] = 0; + gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_ppreduce(void) +static void Cmd_unused_0x3(void) { - CMD_ARGS(); - - s32 i, ppToDeduct = 1; - u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); - - if (gBattleControllerExecFlags) - return; - - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) - gHitMarker |= HITMARKER_NO_PPDEDUCT; - - if (moveTarget == MOVE_TARGET_BOTH - || moveTarget == MOVE_TARGET_FOES_AND_ALLY - || moveTarget == MOVE_TARGET_ALL_BATTLERS - || MoveForcesPressure(gCurrentMove)) - { - for (i = 0; i < gBattlersCount; i++) - { - if (!IsBattlerAlly(i, gBattlerAttacker) && IsBattlerAlive(i)) - ppToDeduct += (GetBattlerAbility(i) == ABILITY_PRESSURE); - } - } - else if (moveTarget != MOVE_TARGET_OPPONENTS_FIELD) - { - if (gBattlerAttacker != gBattlerTarget && GetBattlerAbility(gBattlerTarget) == ABILITY_PRESSURE) - ppToDeduct++; - } - - if (!(gHitMarker & (HITMARKER_NO_PPDEDUCT | HITMARKER_NO_ATTACKSTRING)) && gBattleMons[gBattlerAttacker].pp[gCurrMovePos]) - { - gProtectStructs[gBattlerAttacker].notFirstStrike = TRUE; - - // For item Metronome, echoed voice - if (gCurrentMove != gLastResultingMoves[gBattlerAttacker] || WasUnableToUseMove(gBattlerAttacker)) - gBattleStruct->sameMoveTurns[gBattlerAttacker] = 0; - - if (gBattleMons[gBattlerAttacker].pp[gCurrMovePos] > ppToDeduct) - gBattleMons[gBattlerAttacker].pp[gCurrMovePos] -= ppToDeduct; - else - gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = 0; - - if (MOVE_IS_PERMANENT(gBattlerAttacker, gCurrMovePos)) - { - BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, - sizeof(gBattleMons[gBattlerAttacker].pp[gCurrMovePos]), - &gBattleMons[gBattlerAttacker].pp[gCurrMovePos]); - MarkBattlerForControllerExec(gBattlerAttacker); - } - } - - gHitMarker &= ~HITMARKER_NO_PPDEDUCT; - gBattlescriptCurrInstr = cmd->nextInstr; } // The chance is 1/N for each stage. @@ -1890,17 +1564,17 @@ static const u32 sGen2CriticalHitOdds[] = {17, 32, 64, 85, 128}; // X/256 static inline u32 GetCriticalHitOdds(u32 critChance) { - if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) >= GEN_7) + if (GetConfig(CONFIG_CRIT_CHANCE) >= GEN_7) return sGen7CriticalHitOdds[critChance]; - if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_6) + if (GetConfig(CONFIG_CRIT_CHANCE) == GEN_6) return sGen6CriticalHitOdds[critChance]; - if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_2) + if (GetConfig(CONFIG_CRIT_CHANCE) == GEN_2) return sGen2CriticalHitOdds[critChance]; return sCriticalHitOdds[critChance]; } -static inline u32 IsBattlerLeekAffected(u32 battler, enum ItemHoldEffect holdEffect) +static inline u32 IsBattlerLeekAffected(u32 battler, enum HoldEffect holdEffect) { if (holdEffect == HOLD_EFFECT_LEEK) { @@ -1910,7 +1584,7 @@ static inline u32 IsBattlerLeekAffected(u32 battler, enum ItemHoldEffect holdEff return FALSE; } -static inline u32 GetHoldEffectCritChanceIncrease(u32 battler, enum ItemHoldEffect holdEffect) +static inline u32 GetHoldEffectCritChanceIncrease(u32 battler, enum HoldEffect holdEffect) { u32 critStageIncrease = 0; @@ -1935,15 +1609,15 @@ static inline u32 GetHoldEffectCritChanceIncrease(u32 battler, enum ItemHoldEffe return critStageIncrease; } -s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk) +s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum HoldEffect holdEffectAtk) { s32 critChance = 0; - if (gSideStatuses[battlerDef] & SIDE_STATUS_LUCKY_CHANT) + if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_LUCKY_CHANT) { critChance = CRITICAL_HIT_BLOCKED; } - else if (gStatuses3[battlerAtk] & STATUS3_LASER_FOCUS + else if (gBattleMons[battlerAtk].volatiles.laserFocus || MoveAlwaysCrits(move) || (abilityAtk == ABILITY_MERCILESS && gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY)) { @@ -1951,13 +1625,13 @@ s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordA } else { - critChance = 2 * ((gBattleMons[battlerAtk].status2 & STATUS2_FOCUS_ENERGY) != 0) - + 1 * ((gBattleMons[battlerAtk].status2 & STATUS2_DRAGON_CHEER) != 0) + critChance = (gBattleMons[battlerAtk].volatiles.focusEnergy != 0 ? 2 : 0) + + (gBattleMons[battlerAtk].volatiles.dragonCheer != 0 ? 1 : 0) + GetMoveCriticalHitStage(move) + GetHoldEffectCritChanceIncrease(battlerAtk, holdEffectAtk) - + 2 * (B_AFFECTION_MECHANICS == TRUE && GetBattlerAffectionHearts(battlerAtk) == AFFECTION_FIVE_HEARTS) - + (abilityAtk == ABILITY_SUPER_LUCK) - + gBattleStruct->bonusCritStages[gBattlerAttacker]; + + ((B_AFFECTION_MECHANICS == TRUE && GetBattlerAffectionHearts(battlerAtk) == AFFECTION_FIVE_HEARTS) ? 2 : 0) + + (abilityAtk == ABILITY_SUPER_LUCK ? 1 : 0) + + gBattleMons[battlerAtk].volatiles.bonusCritStages; if (critChance >= ARRAY_COUNT(sCriticalHitOdds)) critChance = ARRAY_COUNT(sCriticalHitOdds) - 1; @@ -1984,13 +1658,13 @@ s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordA // Threshold = Base Speed / 2 // High crit move = 8 * (Base Speed / 2) // Focus Energy = 4 * (Base Speed / 2) -s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk) +s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum HoldEffect holdEffectAtk) { s32 critChance = 0; s32 moveCritStage = GetMoveCriticalHitStage(gCurrentMove); - s32 bonusCritStage = gBattleStruct->bonusCritStages[battlerAtk]; // G-Max Chi Strike + s32 bonusCritStage = gBattleMons[battlerAtk].volatiles.bonusCritStages; // G-Max Chi Strike u32 holdEffectCritStage = GetHoldEffectCritChanceIncrease(battlerAtk, holdEffectAtk); - u16 baseSpeed = gSpeciesInfo[gBattleMons[battlerAtk].species].baseSpeed; + u16 baseSpeed = GetSpeciesBaseSpeed(gBattleMons[battlerAtk].species); critChance = baseSpeed / 2; @@ -2001,9 +1675,9 @@ s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 rec if (bonusCritStage > 0) critChance *= bonusCritStage; - if (gBattleMons[battlerAtk].status2 & STATUS2_FOCUS_ENERGY) + if (gBattleMons[battlerAtk].volatiles.focusEnergy) critChance *= 4; - else if (gBattleMons[battlerAtk].status2 & STATUS2_DRAGON_CHEER) + else if (gBattleMons[battlerAtk].volatiles.dragonCheer) critChance *= 2; if (holdEffectCritStage > 0) @@ -2026,7 +1700,7 @@ s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 rec } // Guaranteed crits - else if (gStatuses3[battlerAtk] & STATUS3_LASER_FOCUS + else if (gBattleMons[battlerAtk].volatiles.laserFocus || MoveAlwaysCrits(move) || (abilityAtk == ABILITY_MERCILESS && gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY)) { @@ -2048,14 +1722,14 @@ static void Cmd_critcalc(void) { CMD_ARGS(); - u32 partySlot = gBattlerPartyIndexes[gBattlerAttacker]; - u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); + u32 partySlot = gBattlerPartyIndexes[gBattlerAttacker], + moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove), + battlerDef; bool32 calcSpreadMoveDamage = IsSpreadMove(moveTarget) && !IsBattleMoveStatus(gCurrentMove); - u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); - enum ItemHoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + enum HoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker); gPotentialItemEffectBattler = gBattlerAttacker; - for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { if (gBattleStruct->calculatedDamageDone) break; @@ -2064,13 +1738,14 @@ static void Cmd_critcalc(void) continue; if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) - || gBattleStruct->noResultString[battlerDef] + || gBattleStruct->noResultString[battlerDef] != CAN_DAMAGE || gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT) continue; - u32 abilityDef = GetBattlerAbility(battlerDef); + enum Ability abilityDef = GetBattlerAbility(battlerDef); + enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); - if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_1) + if (GetConfig(CONFIG_CRIT_CHANCE) == GEN_1) gBattleStruct->critChance[battlerDef] = CalcCritChanceStageGen1(gBattlerAttacker, battlerDef, gCurrentMove, TRUE, abilityAtk, abilityDef, holdEffectAtk); else gBattleStruct->critChance[battlerDef] = CalcCritChanceStage(gBattlerAttacker, battlerDef, gCurrentMove, TRUE, abilityAtk, abilityDef, holdEffectAtk); @@ -2083,9 +1758,9 @@ static void Cmd_critcalc(void) gSpecialStatuses[battlerDef].criticalHit = TRUE; else { - if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_1) + if (GetConfig(CONFIG_CRIT_CHANCE) == GEN_1) gSpecialStatuses[battlerDef].criticalHit = RandomChance(RNG_CRITICAL_HIT, gBattleStruct->critChance[battlerDef], 256); - else if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_2) + else if (GetConfig(CONFIG_CRIT_CHANCE) == GEN_2) gSpecialStatuses[battlerDef].criticalHit = RandomChance(RNG_CRITICAL_HIT, GetCriticalHitOdds(gBattleStruct->critChance[battlerDef]), 256); else gSpecialStatuses[battlerDef].criticalHit = RandomChance(RNG_CRITICAL_HIT, 1, GetCriticalHitOdds(gBattleStruct->critChance[battlerDef])); @@ -2100,18 +1775,18 @@ static void Cmd_critcalc(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static inline void CalculateAndSetMoveDamage(struct DamageCalculationData *damageCalcData, u32 battlerDef) +static inline void CalculateAndSetMoveDamage(struct DamageContext *ctx) { - SetDynamicMoveCategory(gBattlerAttacker, battlerDef, gCurrentMove); - damageCalcData->battlerDef = battlerDef; - damageCalcData->isCrit = gSpecialStatuses[battlerDef].criticalHit; - gBattleStruct->moveDamage[battlerDef] = CalculateMoveDamage(damageCalcData, 0); + SetDynamicMoveCategory(gBattlerAttacker, ctx->battlerDef, gCurrentMove); + ctx->isCrit = gSpecialStatuses[ctx->battlerDef].criticalHit; + ctx->fixedBasePower = 0; + gBattleStruct->moveDamage[ctx->battlerDef] = CalculateMoveDamage(ctx); // Slighly hacky but we need to check move result flags for distortion match-up as well but it can only be done after damage calcs - if (gSpecialStatuses[battlerDef].distortedTypeMatchups && gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT) + if (gSpecialStatuses[ctx->battlerDef].distortedTypeMatchups && gBattleStruct->moveResultFlags[ctx->battlerDef] & MOVE_RESULT_NO_EFFECT) { - gSpecialStatuses[battlerDef].distortedTypeMatchups = FALSE; - gSpecialStatuses[battlerDef].teraShellAbilityDone = FALSE; + gSpecialStatuses[ctx->battlerDef].distortedTypeMatchups = FALSE; + gSpecialStatuses[ctx->battlerDef].teraShellAbilityDone = FALSE; } } @@ -2127,12 +1802,13 @@ static void Cmd_damagecalc(void) u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); - struct DamageCalculationData damageCalcData; - damageCalcData.battlerAtk = gBattlerAttacker; - damageCalcData.move = gCurrentMove; - damageCalcData.moveType = GetBattleMoveType(gCurrentMove); - damageCalcData.randomFactor = TRUE; - damageCalcData.updateFlags = TRUE; + struct DamageContext ctx = {0}; + ctx.battlerAtk = gBattlerAttacker; + ctx.move = gCurrentMove; + ctx.chosenMove = gChosenMove; + ctx.moveType = GetBattleMoveType(gCurrentMove); + ctx.randomFactor = TRUE; + ctx.updateFlags = TRUE; if (IsSpreadMove(moveTarget)) { @@ -2140,16 +1816,18 @@ static void Cmd_damagecalc(void) for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) - || gBattleStruct->noResultString[battlerDef] + || gBattleStruct->noResultString[battlerDef] != CAN_DAMAGE || gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT) continue; - CalculateAndSetMoveDamage(&damageCalcData, battlerDef); + ctx.battlerDef = battlerDef; + CalculateAndSetMoveDamage(&ctx); } } else { - CalculateAndSetMoveDamage(&damageCalcData, gBattlerTarget); + ctx.battlerDef = gBattlerTarget; + CalculateAndSetMoveDamage(&ctx); } gBattlescriptCurrInstr = cmd->nextInstr; @@ -2159,10 +1837,21 @@ static void Cmd_typecalc(void) { CMD_ARGS(); - if (!IsSpreadMove(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove))) // Handled in CANCELLER_MULTI_TARGET_MOVES for Spread Moves + if (!IsSpreadMove(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove))) // Handled in CANCELER_MULTI_TARGET_MOVES for Spread Moves { - u32 moveType = GetBattleMoveType(gCurrentMove); - CalcTypeEffectivenessMultiplier(gCurrentMove, moveType, gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerTarget), TRUE); + struct DamageContext ctx = {0}; + ctx.battlerAtk = gBattlerAttacker; + ctx.battlerDef = gBattlerTarget; + ctx.move = gCurrentMove; + ctx.chosenMove = gChosenMove; + ctx.moveType = GetBattleMoveType(gCurrentMove); + ctx.updateFlags = TRUE; + ctx.abilityAtk = GetBattlerAbility(gBattlerAttacker); + ctx.abilityDef = GetBattlerAbility(gBattlerTarget); + ctx.holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker); + ctx.holdEffectDef = GetBattlerHoldEffect(gBattlerTarget); + + CalcTypeEffectivenessMultiplier(&ctx); } gBattlescriptCurrInstr = cmd->nextInstr; @@ -2172,15 +1861,15 @@ static void Cmd_adjustdamage(void) { CMD_ARGS(); - enum ItemHoldEffect holdEffect; + enum HoldEffect holdEffect; u8 param; u32 battlerDef; u32 rand = Random() % 100; - u32 affectionScore = GetBattlerAffectionHearts(gBattlerTarget); + u32 affectionScore; u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); bool32 calcSpreadMoveDamage = IsSpreadMove(moveTarget) && !IsBattleMoveStatus(gCurrentMove); - bool32 enduredHit = FALSE; + u32 enduredHit = 0; for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { @@ -2191,7 +1880,7 @@ static void Cmd_adjustdamage(void) continue; if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) - || gBattleStruct->noResultString[battlerDef]) + || gBattleStruct->noResultString[battlerDef] != CAN_DAMAGE) continue; if (DoesSubstituteBlockMove(gBattlerAttacker, battlerDef, gCurrentMove)) @@ -2209,46 +1898,47 @@ static void Cmd_adjustdamage(void) gBattleStruct->moveResultFlags[battlerDef] &= ~(MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE); gBattleStruct->moveDamage[battlerDef] = 0; gSpecialStatuses[battlerDef].enduredDamage = TRUE; - RecordAbilityBattle(gBattlerTarget, ABILITY_ICE_FACE); + RecordAbilityBattle(battlerDef, ABILITY_ICE_FACE); gDisableStructs[battlerDef].iceFaceActivationPrevention = TRUE; // Form change will be done after attack animation in Cmd_resultmessage. continue; } - if (gBattleMons[gBattlerTarget].hp > gBattleStruct->moveDamage[battlerDef]) + if (gBattleMons[battlerDef].hp > gBattleStruct->moveDamage[battlerDef]) continue; - holdEffect = GetBattlerHoldEffect(battlerDef, TRUE); + holdEffect = GetBattlerHoldEffect(battlerDef); param = GetBattlerHoldEffectParam(battlerDef); + affectionScore = GetBattlerAffectionHearts(battlerDef); gPotentialItemEffectBattler = battlerDef; if (moveEffect == EFFECT_FALSE_SWIPE) { - enduredHit = TRUE; + enduredHit |= 1u << battlerDef; } - else if (gProtectStructs[battlerDef].endured) + else if (gDisableStructs[battlerDef].endured) { - enduredHit = TRUE; + enduredHit |= 1u << battlerDef; gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_FOE_ENDURED; } else if (holdEffect == HOLD_EFFECT_FOCUS_BAND && rand < param) { - enduredHit = TRUE; + enduredHit |= 1u << battlerDef; RecordItemEffectBattle(battlerDef, holdEffect); gLastUsedItem = gBattleMons[battlerDef].item; gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_FOE_HUNG_ON; } - else if (B_STURDY >= GEN_5 && GetBattlerAbility(battlerDef) == ABILITY_STURDY && IsBattlerAtMaxHp(battlerDef)) + else if (GetConfig(CONFIG_STURDY) >= GEN_5 && GetBattlerAbility(battlerDef) == ABILITY_STURDY && IsBattlerAtMaxHp(battlerDef)) { - enduredHit = TRUE; + enduredHit |= 1u << battlerDef; RecordAbilityBattle(battlerDef, ABILITY_STURDY); gLastUsedAbility = ABILITY_STURDY; gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_STURDIED; } else if (holdEffect == HOLD_EFFECT_FOCUS_SASH && IsBattlerAtMaxHp(battlerDef)) { - enduredHit = TRUE; + enduredHit |= 1u << battlerDef; RecordItemEffectBattle(battlerDef, holdEffect); gLastUsedItem = gBattleMons[battlerDef].item; gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_FOE_HUNG_ON; @@ -2259,16 +1949,17 @@ static void Cmd_adjustdamage(void) || (affectionScore == AFFECTION_FOUR_HEARTS && rand < 15) || (affectionScore == AFFECTION_THREE_HEARTS && rand < 10)) { - enduredHit = TRUE; + enduredHit |= 1u << battlerDef; gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_FOE_ENDURED_AFFECTION; } } // Handle reducing the dmg to 1 hp. - if (enduredHit) + if (enduredHit & 1u << battlerDef) { gBattleStruct->moveDamage[battlerDef] = gBattleMons[battlerDef].hp - 1; gSpecialStatuses[battlerDef].enduredDamage = TRUE; + gProtectStructs[battlerDef].assuranceDoubled = TRUE; } } @@ -2282,8 +1973,7 @@ static void Cmd_adjustdamage(void) && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && gBattleMons[gBattlerAttacker].item) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_GemActivates; + BattleScriptCall(BattleScript_GemActivates); gLastUsedItem = gBattleMons[gBattlerAttacker].item; } } @@ -2301,8 +1991,7 @@ static void Cmd_multihitresultmessage(void) if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_STURDIED) { gBattleStruct->moveResultFlags[gBattlerTarget] &= ~(MOVE_RESULT_STURDIED | MOVE_RESULT_FOE_HUNG_ON); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SturdiedMsg; + BattleScriptCall(BattleScript_SturdiedMsg); return; } else if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_FOE_HUNG_ON) @@ -2310,8 +1999,7 @@ static void Cmd_multihitresultmessage(void) gLastUsedItem = gBattleMons[gBattlerTarget].item; gPotentialItemEffectBattler = gBattlerTarget; gBattleStruct->moveResultFlags[gBattlerTarget] &= ~(MOVE_RESULT_STURDIED | MOVE_RESULT_FOE_HUNG_ON); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_HangedOnMsg; + BattleScriptCall(BattleScript_HangedOnMsg); return; } } @@ -2321,9 +2009,9 @@ static void Cmd_multihitresultmessage(void) static inline bool32 DoesBattlerNegateDamage(u32 battler) { u32 species = gBattleMons[battler].species; - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); - if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + if (gBattleMons[battler].volatiles.transformed) return FALSE; if (ability == ABILITY_DISGUISE && species == SPECIES_MIMIKYU) return TRUE; @@ -2340,8 +2028,8 @@ static u32 UpdateEffectivenessResultFlagsForDoubleSpreadMoves(u32 resultFlags) { for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { - if ((gBattleStruct->moveResultFlags[battlerDef] & (MOVE_RESULT_MISSED | MOVE_RESULT_NO_EFFECT) - || gBattleStruct->noResultString[battlerDef])) + if (gBattleStruct->moveResultFlags[battlerDef] & (MOVE_RESULT_MISSED | MOVE_RESULT_NO_EFFECT) + || gBattleStruct->noResultString[battlerDef] != CAN_DAMAGE) continue; switch (sound) @@ -2377,8 +2065,7 @@ static inline bool32 TryStrongWindsWeakenAttack(u32 battlerDef, u32 moveType) && !gBattleStruct->printedStrongWindsWeakenedAttack) { gBattleStruct->printedStrongWindsWeakenedAttack = TRUE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AttackWeakenedByStrongWinds; + BattleScriptCall(BattleScript_AttackWeakenedByStrongWinds); return TRUE; } } @@ -2392,8 +2079,7 @@ static inline bool32 TryTeraShellDistortTypeMatchups(u32 battlerDef) { gSpecialStatuses[battlerDef].teraShellAbilityDone = FALSE; gBattleScripting.battler = battlerDef; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TeraShellDistortingTypeMatchups; + BattleScriptCall(BattleScript_TeraShellDistortingTypeMatchups); return TRUE; } return FALSE; @@ -2401,15 +2087,19 @@ static inline bool32 TryTeraShellDistortTypeMatchups(u32 battlerDef) // According to Gen5 Weakness berry activation happens after the attackanimation. // It doesn't have any impact on gameplay and is only a visual thing which can be adjusted later. -static inline bool32 TryActivateWeakenessBerry(u32 battlerDef) +static inline bool32 TryActivateWeaknessBerry(u32 battlerDef) { + if (DoesDisguiseBlockMove(battlerDef, gCurrentMove)) + { + gSpecialStatuses[battlerDef].berryReduced = FALSE; + return FALSE; + } if (gSpecialStatuses[battlerDef].berryReduced && gBattleMons[battlerDef].item != ITEM_NONE) { gBattleScripting.battler = battlerDef; gLastUsedItem = gBattleMons[battlerDef].item; - gBattleStruct->partyState[GetBattlerSide(battlerDef)][gBattlerPartyIndexes[battlerDef]].ateBerry = TRUE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryReduceDmg; + GetBattlerPartyState(battlerDef)->ateBerry = TRUE; + BattleScriptCall(BattleScript_BerryReduceDmg); return TRUE; } @@ -2422,13 +2112,14 @@ static bool32 ProcessPreAttackAnimationFuncs(void) if (IsDoubleSpreadMove()) { u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); + if (!gBattleStruct->printedStrongWindsWeakenedAttack) { for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) || (battlerDef == BATTLE_PARTNER(gBattlerAttacker) && !(moveTarget & MOVE_TARGET_FOES_AND_ALLY)) - || (gBattleStruct->noResultString[battlerDef] && gBattleStruct->noResultString[battlerDef] != DO_ACCURACY_CHECK)) + || gBattleStruct->noResultString[battlerDef] == WILL_FAIL) continue; if (TryStrongWindsWeakenAttack(battlerDef, moveType)) @@ -2440,12 +2131,12 @@ static bool32 ProcessPreAttackAnimationFuncs(void) { if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) || (battlerDef == BATTLE_PARTNER(gBattlerAttacker) && !(moveTarget & MOVE_TARGET_FOES_AND_ALLY)) - || (gBattleStruct->noResultString[battlerDef] && gBattleStruct->noResultString[battlerDef] != DO_ACCURACY_CHECK)) + || gBattleStruct->noResultString[battlerDef] == WILL_FAIL) continue; if (TryTeraShellDistortTypeMatchups(battlerDef)) return TRUE; - if (TryActivateWeakenessBerry(battlerDef)) + if (TryActivateWeaknessBerry(battlerDef)) return TRUE; } } @@ -2455,7 +2146,7 @@ static bool32 ProcessPreAttackAnimationFuncs(void) return TRUE; if (TryTeraShellDistortTypeMatchups(gBattlerTarget)) return TRUE; - if (TryActivateWeakenessBerry(gBattlerTarget)) + if (TryActivateWeaknessBerry(gBattlerTarget)) return TRUE; } @@ -2471,14 +2162,15 @@ static void Cmd_attackanimation(void) u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); u32 moveResultFlags = gBattleStruct->moveResultFlags[gBattlerTarget]; + enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove); if (IsDoubleSpreadMove()) moveResultFlags = UpdateEffectivenessResultFlagsForDoubleSpreadMoves(gBattleStruct->moveResultFlags[gBattlerTarget]); if ((gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION)) - && gCurrentMove != MOVE_TRANSFORM - && gCurrentMove != MOVE_SUBSTITUTE - && gCurrentMove != MOVE_ALLY_SWITCH + && effect != EFFECT_TRANSFORM + && effect != EFFECT_SUBSTITUTE + && effect != EFFECT_ALLY_SWITCH // In a wild double battle gotta use the teleport animation if two wild pokemon are alive. && !(GetMoveEffect(gCurrentMove) == EFFECT_TELEPORT && WILD_DOUBLE_BATTLE && !IsOnPlayerSide(gBattlerAttacker) && IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker)))) { @@ -2511,7 +2203,7 @@ static void Cmd_attackanimation(void) if (!(moveResultFlags & MOVE_RESULT_NO_EFFECT)) { u32 multihit; - if (gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE) + if (gBattleMons[gBattlerTarget].volatiles.substitute) { multihit = gMultiHitCounter; } @@ -2536,6 +2228,10 @@ static void Cmd_attackanimation(void) gBattleMons[gBattlerAttacker].friendship, &gDisableStructs[gBattlerAttacker], multihit); +#if T_SHOULD_RUN_MOVE_ANIM + gCountAllocs = TRUE; + gSpriteAllocs = 0; +#endif gBattleScripting.animTurn++; gBattleScripting.animTargetsHit++; MarkBattlerForControllerExec(gBattlerAttacker); @@ -2553,31 +2249,33 @@ static void Cmd_waitanimation(void) { CMD_ARGS(); - if (gBattleControllerExecFlags == 0) + if (gBattleControllerExecFlags == 0 && gBattleStruct->battlerKOAnimsRunning == 0) + { +#if T_SHOULD_RUN_MOVE_ANIM + gCountAllocs = FALSE; +#endif gBattlescriptCurrInstr = cmd->nextInstr; + } } static void DoublesHPBarReduction(void) { - if (gBattleStruct->doneDoublesSpreadHit - || gHitMarker & (HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE)) + if (gBattleStruct->doneDoublesSpreadHit) return; for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { if (gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT || gBattleStruct->moveDamage[battlerDef] == 0 - || gBattleStruct->noResultString[battlerDef] + || gBattleStruct->noResultString[battlerDef] != CAN_DAMAGE || DoesSubstituteBlockMove(gBattlerAttacker, battlerDef, gCurrentMove) || DoesDisguiseBlockMove(battlerDef, gCurrentMove)) continue; - s32 currDmg = gBattleStruct->moveDamage[battlerDef]; - s32 healthValue = min(currDmg, 10000); // Max damage (10000) not present in R/S, ensures that huge damage values don't change sign - BtlController_EmitHealthBarUpdate(battlerDef, B_COMM_TO_CONTROLLER, healthValue); + s32 dmgUpdate = min(gBattleStruct->moveDamage[battlerDef], 10000); + BtlController_EmitHealthBarUpdate(battlerDef, B_COMM_TO_CONTROLLER, dmgUpdate); MarkBattlerForControllerExec(battlerDef); - - if (IsOnPlayerSide(battlerDef) && currDmg > 0) + if (IsOnPlayerSide(battlerDef) && dmgUpdate > 0) gBattleResults.playerMonWasDamaged = TRUE; } @@ -2586,170 +2284,201 @@ static void DoublesHPBarReduction(void) static void Cmd_healthbarupdate(void) { - CMD_ARGS(u8 battler); + CMD_ARGS(u8 battler, u8 updateState); u32 battler = GetBattlerForBattleScript(cmd->battler); if (gBattleControllerExecFlags) return; - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) || (gHitMarker & HITMARKER_PASSIVE_DAMAGE)) + switch (cmd->updateState) { - if (DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) && gDisableStructs[battler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) - { + case PASSIVE_HP_UPDATE: + BtlController_EmitHealthBarUpdate(battler, B_COMM_TO_CONTROLLER, min(gBattleStruct->passiveHpUpdate[battler], 10000)); + MarkBattlerForControllerExec(battler); + break; + case MOVE_DAMAGE_HP_UPDATE: + if (IsDoubleSpreadMove()) + { + DoublesHPBarReduction(); + if (DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove)) + PrepareStringBattle(STRINGID_SUBSTITUTEDAMAGED, battler); + } + else if (DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove)) + { PrepareStringBattle(STRINGID_SUBSTITUTEDAMAGED, battler); - if (IsDoubleSpreadMove()) - DoublesHPBarReduction(); } - else if (!DoesDisguiseBlockMove(battler, gCurrentMove)) + else if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) + && !DoesDisguiseBlockMove(battler, gCurrentMove)) { - if (IsDoubleSpreadMove()) - { - DoublesHPBarReduction(); - } - else - { - s16 healthValue = min(gBattleStruct->moveDamage[battler], 10000); // Max damage (10000) not present in R/S, ensures that huge damage values don't change sign - - BtlController_EmitHealthBarUpdate(battler, B_COMM_TO_CONTROLLER, healthValue); - MarkBattlerForControllerExec(battler); - - if (IsOnPlayerSide(battler) && gBattleStruct->moveDamage[battler] > 0) - gBattleResults.playerMonWasDamaged = TRUE; - } + s32 damage = min(gBattleStruct->moveDamage[battler], 10000); + BtlController_EmitHealthBarUpdate(battler, B_COMM_TO_CONTROLLER, damage); + MarkBattlerForControllerExec(battler); + if (IsOnPlayerSide(battler) && damage > 0) + gBattleResults.playerMonWasDamaged = TRUE; } - } - else if (IsDoubleSpreadMove()) - { - DoublesHPBarReduction(); + break; } gBattlescriptCurrInstr = cmd->nextInstr; } -// Update the active battler's HP and various HP trackers (Substitute, Bide, etc.) -static void Cmd_datahpupdate(void) +static void PassiveDataHpUpdate(u32 battler, const u8 *nextInstr) { - CMD_ARGS(u8 battler); + if (gBattleStruct->passiveHpUpdate[battler] < 0) + { + // Negative damage is HP gain + gBattleMons[battler].hp += -gBattleStruct->passiveHpUpdate[battler]; + if (gBattleMons[battler].hp > gBattleMons[battler].maxHP) + gBattleMons[battler].hp = gBattleMons[battler].maxHP; + } + else + { + if (gBattleMons[battler].hp > gBattleStruct->passiveHpUpdate[battler]) + gBattleMons[battler].hp -= gBattleStruct->passiveHpUpdate[battler]; + else + gBattleMons[battler].hp = 0; + // Since this is reset for the next turn, it should be fine to set it here. + gProtectStructs[battler].assuranceDoubled = TRUE; + } - if (gBattleControllerExecFlags) - return; + // Send updated HP + BtlController_EmitSetMonData( + battler, + B_COMM_TO_CONTROLLER, + REQUEST_HP_BATTLE, + 0, + sizeof(gBattleMons[battler].hp), &gBattleMons[battler].hp); + MarkBattlerForControllerExec(battler); - u32 battler = GetBattlerForBattleScript(cmd->battler); + gBattleStruct->passiveHpUpdate[battler] = 0; + gBattlescriptCurrInstr = nextInstr; +} - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) || (gHitMarker & HITMARKER_PASSIVE_DAMAGE)) +static void MoveDamageDataHpUpdate(u32 battler, u32 scriptBattler, const u8 *nextInstr) +{ + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) + { + gBattlescriptCurrInstr = nextInstr; + return; + } + else if (DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) && gDisableStructs[battler].substituteHP) { - if (DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) && gDisableStructs[battler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) + if (gDisableStructs[battler].substituteHP >= gBattleStruct->moveDamage[battler]) { - if (gDisableStructs[battler].substituteHP >= gBattleStruct->moveDamage[battler]) - { - gDisableStructs[battler].substituteHP -= gBattleStruct->moveDamage[battler]; - } - else - { - gBattleStruct->moveDamage[battler] = gDisableStructs[battler].substituteHP; - gDisableStructs[battler].substituteHP = 0; - } - // check substitute fading - if (gDisableStructs[battler].substituteHP == 0) - { - gBattlescriptCurrInstr = cmd->nextInstr; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SubstituteFade; - return; - } + TestRunner_Battle_RecordSubHit(battler, gBattleStruct->moveDamage[battler], FALSE); + gDisableStructs[battler].substituteHP -= gBattleStruct->moveDamage[battler]; } - else if (DoesDisguiseBlockMove(battler, gCurrentMove)) + else { - // TODO: Convert this to a proper FORM_CHANGE type. - u32 side = GetBattlerSide(battler); - gBattleScripting.battler = battler; - if (gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[battler]] == SPECIES_NONE) - gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[battler]] = gBattleMons[battler].species; - if (gBattleMons[battler].species == SPECIES_MIMIKYU_TOTEM_DISGUISED) - gBattleMons[battler].species = SPECIES_MIMIKYU_BUSTED_TOTEM; - else - gBattleMons[battler].species = SPECIES_MIMIKYU_BUSTED; - if (B_DISGUISE_HP_LOSS >= GEN_8) - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = BattleScript_TargetFormChange; - return; + TestRunner_Battle_RecordSubHit(battler, gDisableStructs[battler].substituteHP, TRUE); + gBattleStruct->moveDamage[battler] = gDisableStructs[battler].substituteHP; + gDisableStructs[battler].substituteHP = 0; + } + // check substitute fading + if (gDisableStructs[battler].substituteHP == 0) + { + gBattlescriptCurrInstr = nextInstr; + BattleScriptCall(BattleScript_SubstituteFade); + } + else + { + gBattlescriptCurrInstr = nextInstr; + } + return; + } + else if (DoesDisguiseBlockMove(battler, gCurrentMove)) + { + // TODO: Convert this to a proper FORM_CHANGE type. + gBattleScripting.battler = battler; + gBattleStruct->moveDamage[battler] = 0; + gBattleStruct->moveResultFlags[battler] &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE); + if (GetBattlerPartyState(battler)->changedSpecies == SPECIES_NONE) + GetBattlerPartyState(battler)->changedSpecies = gBattleMons[battler].species; + if (gBattleMons[battler].species == SPECIES_MIMIKYU_TOTEM_DISGUISED) + gBattleMons[battler].species = SPECIES_MIMIKYU_BUSTED_TOTEM; + else + gBattleMons[battler].species = SPECIES_MIMIKYU_BUSTED; + if (GetConfig(CONFIG_DISGUISE_HP_LOSS) >= GEN_8) + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 8); + BattleScriptPush(nextInstr); + gBattlescriptCurrInstr = BattleScript_TargetFormChange; + } + else + { + if (gBattleStruct->moveDamage[battler] < 0) + { + // Negative damage is HP gain + gBattleMons[battler].hp += -gBattleStruct->moveDamage[battler]; + if (gBattleMons[battler].hp > gBattleMons[battler].maxHP) + gBattleMons[battler].hp = gBattleMons[battler].maxHP; } else { - gHitMarker &= ~HITMARKER_IGNORE_SUBSTITUTE; - if (gBattleStruct->moveDamage[battler] < 0) + gBideDmg[battler] += gBattleStruct->moveDamage[battler]; + if (scriptBattler == BS_TARGET) + gBideTarget[battler] = gBattlerAttacker; + else + gBideTarget[battler] = gBattlerTarget; + + // Deal damage to the battler + if (gBattleMons[battler].hp > gBattleStruct->moveDamage[battler]) { - // Negative damage is HP gain - gBattleMons[battler].hp += -gBattleStruct->moveDamage[battler]; - if (gBattleMons[battler].hp > gBattleMons[battler].maxHP) - gBattleMons[battler].hp = gBattleMons[battler].maxHP; + gBattleMons[battler].hp -= gBattleStruct->moveDamage[battler]; } else { - if (gHitMarker & HITMARKER_IGNORE_BIDE) - { - gHitMarker &= ~HITMARKER_IGNORE_BIDE; - } - else - { - gBideDmg[battler] += gBattleStruct->moveDamage[battler]; - if (cmd->battler == BS_TARGET) - gBideTarget[battler] = gBattlerAttacker; - else - gBideTarget[battler] = gBattlerTarget; - } + gBattleStruct->moveDamage[battler] = gBattleMons[battler].hp; + gBattleMons[battler].hp = 0; + } + gProtectStructs[battler].assuranceDoubled = TRUE; + gProtectStructs[battler].revengeDoubled |= 1u << gBattlerAttacker; - // Deal damage to the battler - if (gBattleMons[battler].hp > gBattleStruct->moveDamage[battler]) - { - gBattleMons[battler].hp -= gBattleStruct->moveDamage[battler]; - } - else - { - gBattleStruct->moveDamage[battler] = gBattleMons[battler].hp; - gBattleMons[battler].hp = 0; - } + } + // Send updated HP + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[battler].hp), &gBattleMons[battler].hp); + MarkBattlerForControllerExec(battler); + gBattlescriptCurrInstr = nextInstr; + } - enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove); + // Note: While physicalDmg/specialDmg below are only distinguished between for Counter/Mirror Coat, + // they are used in combination as general damage trackers for other purposes. + if (IsBattleMovePhysical(gCurrentMove)) + { + gProtectStructs[battler].physicalDmg = gBattleStruct->moveDamage[battler] + 1; + gSpecialStatuses[battler].physicalDmg = gBattleStruct->moveDamage[battler] + 1; + gProtectStructs[battler].physicalBattlerId = gBattlerAttacker; + } + else // Special move + { + gProtectStructs[battler].specialDmg = gBattleStruct->moveDamage[battler] + 1; + gSpecialStatuses[battler].specialDmg = gBattleStruct->moveDamage[battler] + 1; + gProtectStructs[battler].specialBattlerId = gBattlerAttacker; + } - // Note: While physicalDmg/specialDmg below are only distinguished between for Counter/Mirror Coat, they are - // used in combination as general damage trackers for other purposes. specialDmg is additionally used - // to help determine if a fire move should defrost the target. - if (IsBattleMovePhysical(gCurrentMove) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE) && effect != EFFECT_PAIN_SPLIT) - { - gProtectStructs[battler].physicalDmg = gBattleStruct->moveDamage[battler]; - gSpecialStatuses[battler].physicalDmg = gBattleStruct->moveDamage[battler]; - if (cmd->battler == BS_TARGET) - gProtectStructs[battler].physicalBattlerId = gBattlerAttacker; - else - gProtectStructs[battler].physicalBattlerId = gBattlerTarget; - } - else if (!IsBattleMovePhysical(gCurrentMove) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE) && effect != EFFECT_PAIN_SPLIT) - { - // Record special damage/attacker for Mirror Coat - gProtectStructs[battler].specialDmg = gBattleStruct->moveDamage[battler]; - gSpecialStatuses[battler].specialDmg = gBattleStruct->moveDamage[battler]; - if (cmd->battler == BS_TARGET) - gProtectStructs[battler].specialBattlerId = gBattlerAttacker; - else - gProtectStructs[battler].specialBattlerId = gBattlerTarget; - } - } - gHitMarker &= ~HITMARKER_PASSIVE_DAMAGE; - // Send updated HP - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[battler].hp), &gBattleMons[battler].hp); - MarkBattlerForControllerExec(battler); - } + if (IsBattlerTurnDamaged(gBattlerTarget) && GetMoveCategory(gCurrentMove) != DAMAGE_CATEGORY_STATUS) + GetBattlerPartyState(battler)->timesGotHit++; +} - if (gBattlerAttacker != gBattlerTarget - && GetMoveCategory(gCurrentMove) != DAMAGE_CATEGORY_STATUS - && IsBattlerTurnDamaged(gBattlerTarget)) - gBattleStruct->timesGotHit[GetBattlerSide(gBattlerTarget)][gBattlerPartyIndexes[gBattlerTarget]]++; +static void Cmd_datahpupdate(void) +{ + CMD_ARGS(u8 battler, u8 updateState); + u32 battler = GetBattlerForBattleScript(cmd->battler); + + if (gBattleControllerExecFlags) + return; + + switch (cmd->updateState) + { + case PASSIVE_HP_UPDATE: + PassiveDataHpUpdate(battler, cmd->nextInstr); + break; + case MOVE_DAMAGE_HP_UPDATE: + MoveDamageDataHpUpdate(battler, cmd->battler, cmd->nextInstr); + break; } + if (gBattleMons[battler].hp > gBattleMons[battler].maxHP / 2) + gBattleStruct->battlerState[battler].wasAboveHalfHp = TRUE; - TryRestoreDamageAfterCheekPouch(battler); - gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_critmessage(void) @@ -2840,7 +2569,7 @@ static inline bool32 ShouldPrintTwoFoesMessage(u32 moveResult) { return gBattlerTarget == BATTLE_OPPOSITE(gBattlerAttacker) && gBattleStruct->moveResultFlags[BATTLE_PARTNER(gBattlerTarget)] & moveResult - && !gBattleStruct->noResultString[BATTLE_PARTNER(gBattlerTarget)]; + && gBattleStruct->noResultString[BATTLE_PARTNER(gBattlerTarget)] == CAN_DAMAGE; } static inline bool32 ShouldRelyOnTwoFoesMessage(u32 moveResult) @@ -2848,7 +2577,7 @@ static inline bool32 ShouldRelyOnTwoFoesMessage(u32 moveResult) return gBattlerTarget == BATTLE_PARTNER(BATTLE_OPPOSITE(gBattlerAttacker)) && gBattleStruct->moveResultFlags[BATTLE_OPPOSITE(gBattlerAttacker)] & moveResult && !(gBattleStruct->moveResultFlags[BATTLE_OPPOSITE(gBattlerAttacker)] & MOVE_RESULT_MISSED && gBattleStruct->missStringId[BATTLE_OPPOSITE(gBattlerAttacker)] > B_MSG_AVOIDED_ATK) - && !gBattleStruct->noResultString[BATTLE_OPPOSITE(gBattlerAttacker)]; + && gBattleStruct->noResultString[BATTLE_OPPOSITE(gBattlerAttacker)] == CAN_DAMAGE; } static void Cmd_resultmessage(void) @@ -2866,13 +2595,11 @@ static void Cmd_resultmessage(void) if (gDisableStructs[gBattlerTarget].iceFaceActivationPrevention) { gDisableStructs[gBattlerTarget].iceFaceActivationPrevention = FALSE; - u32 side = GetBattlerSide(gBattlerTarget); - if (gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[gBattlerTarget]] == SPECIES_NONE) - gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[gBattlerTarget]] = gBattleMons[gBattlerTarget].species; + if (GetBattlerPartyState(gBattlerTarget)->changedSpecies == SPECIES_NONE) + GetBattlerPartyState(gBattlerTarget)->changedSpecies = gBattleMons[gBattlerTarget].species; gBattleMons[gBattlerTarget].species = SPECIES_EISCUE_NOICE; gBattleScripting.battler = gBattlerTarget; // For STRINGID_PKMNTRANSFORMED - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_IceFaceNullsDamage; + BattleScriptCall(BattleScript_IceFaceNullsDamage); return; } @@ -2883,13 +2610,19 @@ static void Cmd_resultmessage(void) { gMultiHitCounter = 0; *moveResultFlags &= ~MOVE_RESULT_MISSED; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; + BattleScriptCall(BattleScript_MultiHitPrintStrings); + return; + } + + if (gBattleStruct->missStringId[gBattlerTarget] > B_MSG_AVOIDED_ATK) // Wonder Guard or Levitate + { + gBattlerAbility = gBattlerTarget; + gBattleCommunication[MULTISTRING_CHOOSER] = gBattleStruct->missStringId[gBattlerTarget]; + gBattlescriptCurrInstr = cmd->nextInstr; + BattleScriptCall(BattleScript_AbilityAvoidsDamage); return; } - if (gBattleStruct->missStringId[gBattlerTarget] > B_MSG_AVOIDED_ATK) // Wonder Guard or Levitate - show the ability pop-up - CreateAbilityPopUp(gBattlerTarget, gBattleMons[gBattlerTarget].ability, IsDoubleBattle()); gBattleCommunication[MSG_DISPLAY] = 1; stringId = gMissStringIds[gBattleStruct->missStringId[gBattlerTarget]]; } @@ -2962,8 +2695,7 @@ static void Cmd_resultmessage(void) gLastUsedItem = gBattleMons[gBattlerTarget].item; gPotentialItemEffectBattler = gBattlerTarget; *moveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_HangedOnMsg; + BattleScriptCall(BattleScript_HangedOnMsg); return; default: if (*moveResultFlags & MOVE_RESULT_ONE_HIT_KO) @@ -2971,22 +2703,19 @@ static void Cmd_resultmessage(void) *moveResultFlags &= ~MOVE_RESULT_ONE_HIT_KO; *moveResultFlags &= ~MOVE_RESULT_SUPER_EFFECTIVE; *moveResultFlags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_OneHitKOMsg; + BattleScriptCall(BattleScript_OneHitKOMsg); return; } else if (*moveResultFlags & MOVE_RESULT_STURDIED) { *moveResultFlags &= ~(MOVE_RESULT_STURDIED | MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SturdiedMsg; + BattleScriptCall(BattleScript_SturdiedMsg); return; } else if (*moveResultFlags & MOVE_RESULT_FOE_ENDURED) { *moveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_EnduredMsg; + BattleScriptCall(BattleScript_EnduredMsg); return; } else if (*moveResultFlags & MOVE_RESULT_FOE_HUNG_ON) @@ -2994,8 +2723,7 @@ static void Cmd_resultmessage(void) gLastUsedItem = gBattleMons[gBattlerTarget].item; gPotentialItemEffectBattler = gBattlerTarget; *moveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_HangedOnMsg; + BattleScriptCall(BattleScript_HangedOnMsg); return; } else if (*moveResultFlags & MOVE_RESULT_FAILED) @@ -3005,8 +2733,7 @@ static void Cmd_resultmessage(void) else if (B_AFFECTION_MECHANICS == TRUE && (*moveResultFlags & MOVE_RESULT_FOE_ENDURED_AFFECTION)) { *moveResultFlags &= ~MOVE_RESULT_FOE_ENDURED_AFFECTION; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AffectionBasedEndurance; + BattleScriptCall(BattleScript_AffectionBasedEndurance); return; } } @@ -3101,9 +2828,20 @@ static void Cmd_printselectionstringfromtable(void) } } -u8 GetBattlerTurnOrderNum(u8 battler) +bool32 HasBattlerActedThisTurn(u32 battler) { - s32 i; + u32 i; + for (i = 0; i < gCurrentTurnActionNumber; i++) + { + if (gBattlerByTurnOrder[i] == battler) + return TRUE; + } + return FALSE; +} + +u32 GetBattlerTurnOrderNum(u32 battler) +{ + u32 i; for (i = 0; i < gBattlersCount; i++) { if (gBattlerByTurnOrder[i] == battler) @@ -3114,22 +2852,19 @@ u8 GetBattlerTurnOrderNum(u8 battler) static void CheckSetUnburden(u8 battler) { - if (GetBattlerAbility(battler) == ABILITY_UNBURDEN) - { + if (IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_UNBURDEN)) gDisableStructs[battler].unburdenActive = TRUE; - RecordAbilityBattle(battler, ABILITY_UNBURDEN); - } } -// battlerStealer steals the item of battlerItem -void StealTargetItem(u8 battlerStealer, u8 battlerItem) +// battlerStealer steals the item of itemBattler +void StealTargetItem(u8 battlerStealer, u8 itemBattler) { - gLastUsedItem = gBattleMons[battlerItem].item; - gBattleMons[battlerItem].item = ITEM_NONE; + gLastUsedItem = gBattleMons[itemBattler].item; + gBattleMons[itemBattler].item = ITEM_NONE; - if (B_STEAL_WILD_ITEMS >= GEN_9 + if (GetConfig(CONFIG_STEAL_WILD_ITEMS) >= GEN_9 && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_PALACE)) - && MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_STEAL_ITEM) + && GetMoveEffect(gCurrentMove) == EFFECT_STEAL_ITEM && battlerStealer == gBattlerAttacker) // ensure that Pickpocket isn't activating this { AddBagItem(gLastUsedItem, 1); @@ -3144,15 +2879,16 @@ void StealTargetItem(u8 battlerStealer, u8 battlerItem) MarkBattlerForControllerExec(battlerStealer); } - RecordItemEffectBattle(battlerItem, ITEM_NONE); - CheckSetUnburden(battlerItem); + RecordItemEffectBattle(itemBattler, ITEM_NONE); + CheckSetUnburden(itemBattler); - BtlController_EmitSetMonData(battlerItem, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[battlerItem].item); // remove target item - MarkBattlerForControllerExec(battlerItem); + BtlController_EmitSetMonData(itemBattler, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[itemBattler].item), &gBattleMons[itemBattler].item); // remove target item + MarkBattlerForControllerExec(itemBattler); - gBattleStruct->choicedMove[battlerItem] = 0; + if (GetBattlerAbility(itemBattler) != ABILITY_GORILLA_TACTICS) + gBattleStruct->choicedMove[itemBattler] = MOVE_NONE; - TrySaveExchangedItem(battlerItem, gLastUsedItem); + TrySaveExchangedItem(itemBattler, gLastUsedItem); } static inline bool32 TrySetReflect(u32 battler) @@ -3161,10 +2897,10 @@ static inline bool32 TrySetReflect(u32 battler) if (!(gSideStatuses[side] & SIDE_STATUS_REFLECT)) { gSideStatuses[side] |= SIDE_STATUS_REFLECT; - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[side].reflectTimer = gBattleTurnCounter + 8; + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_LIGHT_CLAY) + gSideTimers[side].reflectTimer = 8; else - gSideTimers[side].reflectTimer = gBattleTurnCounter + 5; + gSideTimers[side].reflectTimer = 5; if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, battler) == 2) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_DOUBLE; @@ -3182,10 +2918,10 @@ static inline bool32 TrySetLightScreen(u32 battler) if (!(gSideStatuses[side] & SIDE_STATUS_LIGHTSCREEN)) { gSideStatuses[side] |= SIDE_STATUS_LIGHTSCREEN; - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[side].lightscreenTimer = gBattleTurnCounter + 8; + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_LIGHT_CLAY) + gSideTimers[side].lightscreenTimer = 8; else - gSideTimers[side].lightscreenTimer = gBattleTurnCounter + 5; + gSideTimers[side].lightscreenTimer = 5; if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, battler) == 2) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_DOUBLE; @@ -3197,8 +2933,10 @@ static inline bool32 TrySetLightScreen(u32 battler) return FALSE; } -void SetNonVolatileStatusCondition(u32 effectBattler, enum MoveEffects effect) +static void SetNonVolatileStatus(u32 effectBattler, enum MoveEffect effect, const u8 *battleScript, enum StatusTrigger trigger) { + gEffectBattler = effectBattler; + if (effect == MOVE_EFFECT_SLEEP || effect == MOVE_EFFECT_FREEZE) { @@ -3208,36 +2946,53 @@ void SetNonVolatileStatusCondition(u32 effectBattler, enum MoveEffects effect) gBattlescriptCurrInstr = cancelMultiTurnMovesResult; } - BattleScriptPush(gBattlescriptCurrInstr + 1); + BattleScriptPush(battleScript); - if (sStatusFlagsForMoveEffects[effect] == STATUS1_SLEEP) + switch (effect) { + case MOVE_EFFECT_SLEEP: if (B_SLEEP_TURNS >= GEN_5) gBattleMons[effectBattler].status1 |= STATUS1_SLEEP_TURN(1 + RandomUniform(RNG_SLEEP_TURNS, 1, 3)); else gBattleMons[effectBattler].status1 |= STATUS1_SLEEP_TURN(1 + RandomUniform(RNG_SLEEP_TURNS, 2, 5)); - TryActivateSleepClause(effectBattler, gBattlerPartyIndexes[effectBattler]); - } - else - { - gBattleMons[effectBattler].status1 |= sStatusFlagsForMoveEffects[effect]; + gBattlescriptCurrInstr = BattleScript_MoveEffectSleep; + break; + case MOVE_EFFECT_POISON: + gBattleMons[effectBattler].status1 |= STATUS1_POISON; + gBattlescriptCurrInstr = BattleScript_MoveEffectPoison; + break; + case MOVE_EFFECT_BURN: + gBattleMons[effectBattler].status1 |= STATUS1_BURN; + gBattlescriptCurrInstr = BattleScript_MoveEffectBurn; + break; + case MOVE_EFFECT_FREEZE: + gBattleMons[effectBattler].status1 |= STATUS1_FREEZE; + gBattlescriptCurrInstr = BattleScript_MoveEffectFreeze; + break; + case MOVE_EFFECT_PARALYSIS: + gBattleMons[effectBattler].status1 |= STATUS1_PARALYSIS; + gBattlescriptCurrInstr = BattleScript_MoveEffectParalysis; + break; + case MOVE_EFFECT_TOXIC: + gBattleMons[effectBattler].status1 |= STATUS1_TOXIC_POISON; + gBattlescriptCurrInstr = BattleScript_MoveEffectToxic; + break; + case MOVE_EFFECT_FROSTBITE: + gBattleMons[effectBattler].status1 |= STATUS1_FROSTBITE; + gBattlescriptCurrInstr = BattleScript_MoveEffectFrostbite; + break; + default: + break; } - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[effect]; - BtlController_EmitSetMonData(effectBattler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[effectBattler].status1), &gBattleMons[effectBattler].status1); MarkBattlerForControllerExec(effectBattler); - if (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) - { + if (trigger == TRIGGER_ON_ABILITY) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUSED_BY_ABILITY; - gHitMarker &= ~HITMARKER_STATUS_ABILITY_EFFECT; - } else - { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUSED; - } gBattleScripting.moveEffect = MOVE_EFFECT_NONE; @@ -3246,1252 +3001,1129 @@ void SetNonVolatileStatusCondition(u32 effectBattler, enum MoveEffects effect) || effect == MOVE_EFFECT_TOXIC || effect == MOVE_EFFECT_PARALYSIS || effect == MOVE_EFFECT_BURN) - { gBattleStruct->synchronizeMoveEffect = effect; - gHitMarker |= HITMARKER_SYNCHRONIZE_EFFECT; - } if (effect == MOVE_EFFECT_POISON || effect == MOVE_EFFECT_TOXIC) gBattleStruct->poisonPuppeteerConfusion = TRUE; } -#define INCREMENT_RESET_RETURN \ -{ \ - gBattlescriptCurrInstr++; \ - gBattleScripting.moveEffect = 0; \ - return; \ -} - -void SetMoveEffect(bool32 primary, bool32 certain) +// To avoid confusion the arguments are naned battler/effectBattler since they can be different from gBattlerAttacker/gBattlerTarget +void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, const u8 *battleScript, enum SetMoveEffectFlags effectFlags) { - s32 i, affectsUser = 0; - bool32 statusChanged = FALSE; + s32 i; + bool32 primary = effectFlags & EFFECT_PRIMARY; + bool32 certain = effectFlags & EFFECT_CERTAIN; + bool32 affectsUser = (battler == effectBattler); bool32 mirrorArmorReflected = (GetBattlerAbility(gBattlerTarget) == ABILITY_MIRROR_ARMOR); - u32 flags = 0; + union StatChangeFlags flags = {0}; u32 battlerAbility; bool32 activateAfterFaint = FALSE; // NULL move effect - if (gBattleScripting.moveEffect == 0) + if (moveEffect == MOVE_EFFECT_NONE) return; if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_1ST_HIT && IsBattlerAlive(gBattlerTarget) - && IsFinalStrikeEffect(gBattleScripting.moveEffect)) + && IsFinalStrikeEffect(moveEffect)) { - gBattlescriptCurrInstr++; + gBattlescriptCurrInstr = battleScript; return; } - switch (gBattleScripting.moveEffect) // Set move effects which happen later on + switch (moveEffect) // Set move effects which happen later on { case MOVE_EFFECT_STEALTH_ROCK: - case MOVE_EFFECT_SPIKES: case MOVE_EFFECT_PAYDAY: case MOVE_EFFECT_BUG_BITE: - case MOVE_EFFECT_STEAL_ITEM: activateAfterFaint = TRUE; break; + default: + break; } - if (gBattleScripting.moveEffect & MOVE_EFFECT_AFFECTS_USER) - { - gEffectBattler = gBattlerAttacker; // battler that effects get applied on - gBattleScripting.moveEffect &= ~MOVE_EFFECT_AFFECTS_USER; - affectsUser = MOVE_EFFECT_AFFECTS_USER; - gBattleScripting.battler = gBattlerTarget; // theoretically the attacker - } - else - { - gEffectBattler = gBattlerTarget; - gBattleScripting.battler = gBattlerAttacker; - } - + gBattleScripting.battler = battler; + gEffectBattler = effectBattler; battlerAbility = GetBattlerAbility(gEffectBattler); - // Just in case this flag is still set - gBattleScripting.moveEffect &= ~MOVE_EFFECT_CERTAIN; + if (!primary && !affectsUser && IsMoveEffectBlockedByTarget(battlerAbility)) + moveEffect = MOVE_EFFECT_NONE; + else if (!primary + && IsSheerForceAffected(gCurrentMove, GetBattlerAbility(battler)) + && !(GetMoveEffect(gCurrentMove) == EFFECT_ORDER_UP && gBattleStruct->battlerState[gBattlerAttacker].commanderSpecies != SPECIES_NONE)) + moveEffect = MOVE_EFFECT_NONE; + else if (!IsBattlerAlive(gEffectBattler) && !activateAfterFaint) + moveEffect = MOVE_EFFECT_NONE; + else if (DoesSubstituteBlockMove(gBattlerAttacker, gEffectBattler, gCurrentMove) && !affectsUser) + moveEffect = MOVE_EFFECT_NONE; - if (!primary && affectsUser != MOVE_EFFECT_AFFECTS_USER - && !(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) - && IsMoveEffectBlockedByTarget(battlerAbility)) - INCREMENT_RESET_RETURN + gBattleScripting.moveEffect = moveEffect; // ChangeStatBuffs still needs the global moveEffect - if (gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) - && !primary && gBattleScripting.moveEffect <= MOVE_EFFECT_CONFUSION) - INCREMENT_RESET_RETURN - - if (!(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) - && TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove) - && !(GetMoveEffect(gCurrentMove) == EFFECT_ORDER_UP && gBattleStruct->commanderActive[gBattlerAttacker]) - && !primary - && gBattleScripting.moveEffect != MOVE_EFFECT_CHARGING) - INCREMENT_RESET_RETURN - - if (!IsBattlerAlive(gEffectBattler) && !activateAfterFaint) - INCREMENT_RESET_RETURN - - if (DoesSubstituteBlockMove(gBattlerAttacker, gEffectBattler, gCurrentMove) && affectsUser != MOVE_EFFECT_AFFECTS_USER) - INCREMENT_RESET_RETURN - - if (gBattleScripting.moveEffect <= PRIMARY_STATUS_MOVE_EFFECT) // status change + switch (moveEffect) { - if (!(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT)) // Calcs already done + case MOVE_EFFECT_NONE: + gBattlescriptCurrInstr = battleScript; + break; + case MOVE_EFFECT_SLEEP: + case MOVE_EFFECT_POISON: + case MOVE_EFFECT_BURN: + case MOVE_EFFECT_FREEZE: + case MOVE_EFFECT_PARALYSIS: + case MOVE_EFFECT_TOXIC: + case MOVE_EFFECT_FROSTBITE: + if (gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_SAFEGUARD && !primary) + gBattlescriptCurrInstr = battleScript; + else if (CanSetNonVolatileStatus( + gBattlerAttacker, + gEffectBattler, + GetBattlerAbility(gBattlerAttacker), + battlerAbility, + moveEffect, + CHECK_TRIGGER)) + SetNonVolatileStatus(gEffectBattler, moveEffect, battleScript, TRIGGER_ON_MOVE); + break; + case MOVE_EFFECT_CONFUSION: + if (!CanBeConfused(gEffectBattler) + || gBattleMons[gEffectBattler].volatiles.confusionTurns + || (gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_SAFEGUARD && !primary)) { - statusChanged = CanSetNonVolatileStatus(gBattlerAttacker, - gEffectBattler, - GetBattlerAbility(gBattlerAttacker), - battlerAbility, - gBattleScripting.moveEffect, - STATUS_CHECK_TRIGGER); + gBattlescriptCurrInstr = battleScript; } + else + { + gBattleMons[gEffectBattler].volatiles.confusionTurns = ((Random()) % 4) + 2; // 2-5 turns - if (statusChanged || gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) + // If the confusion is activating due to being released from Sky Drop, go to "confused due to fatigue" script. + // Otherwise, do normal confusion script. + if (GetMoveEffect(gCurrentMove) == EFFECT_SKY_DROP) + { + gBattleMons[gEffectBattler].volatiles.lockConfusionTurns = 0; + gBattlerAttacker = gEffectBattler; + gBattlescriptCurrInstr = BattleScript_ThrashConfuses; + } + else + { + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_MoveEffectConfusion; + } + } + break; + case MOVE_EFFECT_FLINCH: + if (battlerAbility == ABILITY_INNER_FOCUS) { - SetNonVolatileStatusCondition(gEffectBattler, gBattleScripting.moveEffect); + // Inner Focus ALWAYS prevents flinching but only activates + // on a move that's supposed to flinch, like Fake Out + if (primary || certain) + { + gLastUsedAbility = ABILITY_INNER_FOCUS; + gBattlerAbility = gEffectBattler; + RecordAbilityBattle(gEffectBattler, ABILITY_INNER_FOCUS); + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_FlinchPrevention; + } + else + { + gBattlescriptCurrInstr = battleScript; + } } - else + else if (gBattleMons[gEffectBattler].volatiles.flinched) { - gBattleScripting.moveEffect = 0; - gBattlescriptCurrInstr++; + gBattlescriptCurrInstr = battleScript; } - return; - } - else - { - if (gBattleMons[gEffectBattler].status2 & sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]) + else if (!HasBattlerActedThisTurn(gEffectBattler) + && GetActiveGimmick(gEffectBattler) != GIMMICK_DYNAMAX) { - gBattlescriptCurrInstr++; + gBattleMons[gEffectBattler].volatiles.flinched = TRUE; + gBattlescriptCurrInstr = battleScript; } else { - switch (gBattleScripting.moveEffect) - { - case MOVE_EFFECT_CONFUSION: - if (!CanBeConfused(gEffectBattler)) - { - gBattlescriptCurrInstr++; - } - else - { - gBattleMons[gEffectBattler].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); // 2-5 turns + gBattlescriptCurrInstr = battleScript; + } + break; + case MOVE_EFFECT_UPROAR: + if (!gBattleMons[gEffectBattler].volatiles.uproarTurns) + { + gBattleMons[gEffectBattler].volatiles.multipleTurns = TRUE; + gLockedMoves[gEffectBattler] = gCurrentMove; + gBattleMons[gEffectBattler].volatiles.uproarTurns = B_UPROAR_TURNS >= GEN_5 ? 3 : (Random() & 3) + 2; - // If the confusion is activating due to being released from Sky Drop, go to "confused due to fatigue" script. - // Otherwise, do normal confusion script. - if (GetMoveEffect(gCurrentMove) == EFFECT_SKY_DROP) - { - gBattleMons[gEffectBattler].status2 &= ~(STATUS2_LOCK_CONFUSE); - gBattlerAttacker = gEffectBattler; - gBattlescriptCurrInstr = BattleScript_ThrashConfuses; - } - else - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; - } - } - break; - case MOVE_EFFECT_FLINCH: - if (battlerAbility == ABILITY_INNER_FOCUS) - { - // Inner Focus ALWAYS prevents flinching but only activates - // on a move that's supposed to flinch, like Fake Out - if (primary == TRUE || certain == TRUE) - { - gLastUsedAbility = ABILITY_INNER_FOCUS; - gBattlerAbility = gEffectBattler; - RecordAbilityBattle(gEffectBattler, ABILITY_INNER_FOCUS); - gBattlescriptCurrInstr = BattleScript_FlinchPrevention; - } - else - { - gBattlescriptCurrInstr++; - } - } - else if (GetBattlerTurnOrderNum(gEffectBattler) > gCurrentTurnActionNumber - && !(GetActiveGimmick(gEffectBattler) == GIMMICK_DYNAMAX)) - { - gBattleMons[gEffectBattler].status2 |= sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]; - gBattlescriptCurrInstr++; - } - else - { - gBattlescriptCurrInstr++; - } - break; - case MOVE_EFFECT_UPROAR: - if (!(gBattleMons[gEffectBattler].status2 & STATUS2_UPROAR)) - { - gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS; - gLockedMoves[gEffectBattler] = gCurrentMove; - gBattleMons[gEffectBattler].status2 |= STATUS2_UPROAR_TURN(B_UPROAR_TURNS >= GEN_5 ? 3 : (Random() & 3) + 2); + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_MoveEffectUproar; + } + else + { + gBattlescriptCurrInstr = battleScript; + } + break; + case MOVE_EFFECT_PAYDAY: + // Don't scatter coins on the second hit of Parental Bond + if (IsOnPlayerSide(gBattlerAttacker) && gSpecialStatuses[gBattlerAttacker].parentalBondState!= PARENTAL_BOND_2ND_HIT) + { + u16 payday = gPaydayMoney; + u16 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); + gPaydayMoney += (gBattleMons[gBattlerAttacker].level * 5); + if (payday > gPaydayMoney) + gPaydayMoney = 0xFFFF; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; - } - else - { - gBattlescriptCurrInstr++; - } - break; - case MOVE_EFFECT_PAYDAY: - // Don't scatter coins on the second hit of Parental Bond - if (IsOnPlayerSide(gBattlerAttacker) && gSpecialStatuses[gBattlerAttacker].parentalBondState!= PARENTAL_BOND_2ND_HIT) - { - u16 payday = gPaydayMoney; - u16 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); - gPaydayMoney += (gBattleMons[gBattlerAttacker].level * 5); - if (payday > gPaydayMoney) - gPaydayMoney = 0xFFFF; - - // For a move that hits multiple targets (i.e. Make it Rain) - // we only want to print the message on the final hit - if (!(NumAffectedSpreadMoveTargets() > 1 && GetNextTarget(moveTarget, TRUE) != MAX_BATTLERS_COUNT)) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectPayDay; - } - else - gBattlescriptCurrInstr++; - } - else - { - gBattlescriptCurrInstr++; - } - break; - case MOVE_EFFECT_HAPPY_HOUR: - if (IsOnPlayerSide(gBattlerAttacker) && !gBattleStruct->moneyMultiplierMove) - { - gBattleStruct->moneyMultiplier *= 2; - gBattleStruct->moneyMultiplierMove = 1; - } - gBattlescriptCurrInstr++; - break; - case MOVE_EFFECT_TRI_ATTACK: - if (gBattleMons[gEffectBattler].status1) - { - gBattlescriptCurrInstr++; - } - else - { - static const u8 sTriAttackEffects[] = - { - MOVE_EFFECT_BURN, - MOVE_EFFECT_FREEZE_OR_FROSTBITE, - MOVE_EFFECT_PARALYSIS - }; - gBattleScripting.moveEffect = RandomElement(RNG_TRI_ATTACK, sTriAttackEffects); - SetMoveEffect(primary, certain); - } - break; - case MOVE_EFFECT_CHARGING: - gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS; - gLockedMoves[gEffectBattler] = gCurrentMove; - gProtectStructs[gEffectBattler].chargingTurn = TRUE; - gBattlescriptCurrInstr++; - break; - case MOVE_EFFECT_WRAP: - if (gBattleMons[gEffectBattler].status2 & STATUS2_WRAPPED) - { - gBattlescriptCurrInstr++; - } - else - { - gBattleMons[gEffectBattler].status2 |= STATUS2_WRAPPED; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_GRIP_CLAW) - gDisableStructs[gEffectBattler].wrapTurns = B_BINDING_TURNS >= GEN_5 ? 7 : 5; - else - gDisableStructs[gEffectBattler].wrapTurns = B_BINDING_TURNS >= GEN_5 ? (Random() % 2) + 4 : (Random() % 4) + 2; + // For a move that hits multiple targets (i.e. Make it Rain) + // we only want to print the message on the final hit + if (!(NumAffectedSpreadMoveTargets() > 1 && GetNextTarget(moveTarget, TRUE) != MAX_BATTLERS_COUNT)) + { + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_MoveEffectPayDay; + } + else + gBattlescriptCurrInstr = battleScript; + } + else + { + gBattlescriptCurrInstr = battleScript; + } + break; + case MOVE_EFFECT_HAPPY_HOUR: + if (IsOnPlayerSide(gBattlerAttacker) && !gBattleStruct->moneyMultiplierMove) + { + gBattleStruct->moneyMultiplier *= 2; + gBattleStruct->moneyMultiplierMove = 1; + } + gBattlescriptCurrInstr = battleScript; + break; + case MOVE_EFFECT_TRI_ATTACK: + if (gBattleMons[gEffectBattler].status1) + { + gBattlescriptCurrInstr = battleScript; + } + else + { + static const u8 sTriAttackEffects[] = + { + MOVE_EFFECT_BURN, + MOVE_EFFECT_FREEZE_OR_FROSTBITE, + MOVE_EFFECT_PARALYSIS + }; + SetMoveEffect(battler, effectBattler, RandomElement(RNG_TRI_ATTACK, sTriAttackEffects), battleScript, effectFlags); + } + break; + case MOVE_EFFECT_WRAP: + if (gBattleMons[gEffectBattler].volatiles.wrapped) + { + gBattlescriptCurrInstr = battleScript; + } + else + { + if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_GRIP_CLAW) + gDisableStructs[gEffectBattler].wrapTurns = B_BINDING_TURNS >= GEN_5 ? 7 : 5; + else + gDisableStructs[gEffectBattler].wrapTurns = B_BINDING_TURNS >= GEN_5 ? RandomUniform(RNG_WRAP, 4, 5) : RandomUniform(RNG_WRAP, 2, 5); + gBattleMons[gEffectBattler].volatiles.wrapped = TRUE; + gBattleMons[gEffectBattler].volatiles.wrappedMove = gCurrentMove; + gBattleMons[gEffectBattler].volatiles.wrappedBy = gBattlerAttacker; + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_MoveEffectWrap; + } + break; + case MOVE_EFFECT_ATK_PLUS_1: + case MOVE_EFFECT_DEF_PLUS_1: + case MOVE_EFFECT_SPD_PLUS_1: + case MOVE_EFFECT_SP_ATK_PLUS_1: + case MOVE_EFFECT_SP_DEF_PLUS_1: + case MOVE_EFFECT_ACC_PLUS_1: + case MOVE_EFFECT_EVS_PLUS_1: + if (NoAliveMonsForEitherParty() + || ChangeStatBuffs( + effectBattler, + SET_STAT_BUFF_VALUE(1), + moveEffect - MOVE_EFFECT_ATK_PLUS_1 + 1, + STAT_CHANGE_UPDATE_MOVE_EFFECT, + 0, 0) == STAT_CHANGE_DIDNT_WORK) + { + gBattlescriptCurrInstr = battleScript; + } + else + { + gBattleScripting.animArg1 = moveEffect; + gBattleScripting.animArg2 = 0; + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_StatUp; + } + break; + case MOVE_EFFECT_ATK_MINUS_1: + case MOVE_EFFECT_DEF_MINUS_1: + case MOVE_EFFECT_SPD_MINUS_1: + case MOVE_EFFECT_SP_ATK_MINUS_1: + case MOVE_EFFECT_SP_DEF_MINUS_1: + case MOVE_EFFECT_ACC_MINUS_1: + case MOVE_EFFECT_EVS_MINUS_1: + flags.certain = affectsUser; + if (mirrorArmorReflected && !affectsUser) + flags.allowPtr = TRUE; + else + flags.updateMoveEffect = TRUE; - gBattleStruct->wrappedMove[gEffectBattler] = gCurrentMove; - gBattleStruct->wrappedBy[gEffectBattler] = gBattlerAttacker; + if (ChangeStatBuffs( + effectBattler, + SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE, + moveEffect - MOVE_EFFECT_ATK_MINUS_1 + 1, + flags, + 0, battleScript) == STAT_CHANGE_DIDNT_WORK) + { + if (!mirrorArmorReflected) + gBattlescriptCurrInstr = battleScript; + } + else + { + gBattleScripting.animArg1 = moveEffect; + gBattleScripting.animArg2 = 0; + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_StatDown; + } + break; + case MOVE_EFFECT_ATK_PLUS_2: + case MOVE_EFFECT_DEF_PLUS_2: + case MOVE_EFFECT_SPD_PLUS_2: + case MOVE_EFFECT_SP_ATK_PLUS_2: + case MOVE_EFFECT_SP_DEF_PLUS_2: + case MOVE_EFFECT_ACC_PLUS_2: + case MOVE_EFFECT_EVS_PLUS_2: + if (NoAliveMonsForEitherParty() + || ChangeStatBuffs( + effectBattler, + SET_STAT_BUFF_VALUE(2), + moveEffect - MOVE_EFFECT_ATK_PLUS_2 + 1, + STAT_CHANGE_UPDATE_MOVE_EFFECT, + 0, 0) == STAT_CHANGE_DIDNT_WORK) + { + gBattlescriptCurrInstr = battleScript; + } + else + { + gBattleScripting.animArg1 = moveEffect; + gBattleScripting.animArg2 = 0; + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_StatUp; + } + break; + case MOVE_EFFECT_ATK_MINUS_2: + case MOVE_EFFECT_DEF_MINUS_2: + case MOVE_EFFECT_SPD_MINUS_2: + case MOVE_EFFECT_SP_ATK_MINUS_2: + case MOVE_EFFECT_SP_DEF_MINUS_2: + case MOVE_EFFECT_ACC_MINUS_2: + case MOVE_EFFECT_EVS_MINUS_2: + flags.certain = affectsUser; + if (mirrorArmorReflected && !affectsUser) + flags.allowPtr = TRUE; + else + flags.updateMoveEffect = TRUE; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; + if (ChangeStatBuffs( + effectBattler, + SET_STAT_BUFF_VALUE(2) | STAT_BUFF_NEGATIVE, + moveEffect - MOVE_EFFECT_ATK_MINUS_2 + 1, + flags, + 0, battleScript) == STAT_CHANGE_DIDNT_WORK) + { + if (!mirrorArmorReflected) + gBattlescriptCurrInstr = battleScript; + } + else + { + gBattleScripting.animArg1 = moveEffect; + gBattleScripting.animArg2 = 0; + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_StatDown; + } + break; + case MOVE_EFFECT_RECHARGE: + if (B_SKIP_RECHARGE == GEN_1 && !IsBattlerAlive(gBattlerTarget)) // Skip recharge if gen 1 and foe is KO'd + break; - for (gBattleCommunication[MULTISTRING_CHOOSER] = 0; gBattleCommunication[MULTISTRING_CHOOSER] < NUM_TRAPPING_MOVES; gBattleCommunication[MULTISTRING_CHOOSER]++) - { - if (sTrappingMoves[gBattleCommunication[MULTISTRING_CHOOSER]] == gCurrentMove) - break; - } - } - break; - case MOVE_EFFECT_ATK_PLUS_1: - case MOVE_EFFECT_DEF_PLUS_1: - case MOVE_EFFECT_SPD_PLUS_1: - case MOVE_EFFECT_SP_ATK_PLUS_1: - case MOVE_EFFECT_SP_DEF_PLUS_1: - case MOVE_EFFECT_ACC_PLUS_1: - case MOVE_EFFECT_EVS_PLUS_1: - if (NoAliveMonsForEitherParty() - || ChangeStatBuffs(SET_STAT_BUFF_VALUE(1), - gBattleScripting.moveEffect - MOVE_EFFECT_ATK_PLUS_1 + 1, - affectsUser | STAT_CHANGE_UPDATE_MOVE_EFFECT, 0) == STAT_CHANGE_DIDNT_WORK) - { - gBattlescriptCurrInstr++; - } - else - { - gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); - gBattleScripting.animArg2 = 0; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_StatUp; - } + gDisableStructs[gEffectBattler].rechargeTimer = 2; + gLockedMoves[gEffectBattler] = gCurrentMove; + gBattlescriptCurrInstr = battleScript; + break; + case MOVE_EFFECT_RAGE: + gBattleMons[gBattlerAttacker].volatiles.rage = TRUE; + gBattlescriptCurrInstr = battleScript; + break; + case MOVE_EFFECT_PREVENT_ESCAPE: + if (!gBattleMons[gBattlerTarget].volatiles.escapePrevention) // Do we need to check if the status is already set? + { + gBattleMons[gBattlerTarget].volatiles.escapePrevention = TRUE; + gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; + } + gBattlescriptCurrInstr = battleScript; + break; + case MOVE_EFFECT_NIGHTMARE: + gBattleMons[gBattlerTarget].volatiles.nightmare = TRUE; + gBattlescriptCurrInstr = battleScript; + break; + case MOVE_EFFECT_ALL_STATS_UP: + if (!NoAliveMonsForEitherParty()) + { + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_AllStatsUp; + } + break; + case MOVE_EFFECT_ATK_DEF_DOWN: // SuperPower + if (!NoAliveMonsForEitherParty()) + { + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_AtkDefDown; + } + break; + case MOVE_EFFECT_DEF_SPDEF_DOWN: // Close Combat + if (!NoAliveMonsForEitherParty()) + { + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_DefSpDefDown; + } + break; + case MOVE_EFFECT_RECOIL_HP_25: // Struggle + { + s32 recoil = (gBattleMons[gEffectBattler].maxHP) / 4; + if (recoil == 0) + recoil = 1; + if (GetBattlerAbility(gEffectBattler) == ABILITY_PARENTAL_BOND) + recoil *= 2; + SetPassiveDamageAmount(gEffectBattler, recoil); + TryUpdateEvolutionTracker(IF_RECOIL_DAMAGE_GE, gBattleStruct->passiveHpUpdate[gBattlerAttacker], MOVE_NONE); + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; + break; + } + case MOVE_EFFECT_THRASH: + // Petal Dance doesn't lock mons that copy the move with Dancer + if (gSpecialStatuses[gEffectBattler].dancerUsedMove || gBattleMons[gEffectBattler].volatiles.lockConfusionTurns) + { + gBattlescriptCurrInstr = battleScript; + } + else + { + gBattleMons[gEffectBattler].volatiles.multipleTurns = TRUE; + gLockedMoves[gEffectBattler] = gCurrentMove; + gBattleMons[gEffectBattler].volatiles.lockConfusionTurns = RandomUniform(RNG_RAMPAGE_TURNS, 2, 3); + } + break; + case MOVE_EFFECT_CLEAR_SMOG: + for (i = 0; i < NUM_BATTLE_STATS; i++) + { + if (gBattleMons[gEffectBattler].statStages[i] != DEFAULT_STAT_STAGE) break; - case MOVE_EFFECT_ATK_MINUS_1: - case MOVE_EFFECT_DEF_MINUS_1: - case MOVE_EFFECT_SPD_MINUS_1: - case MOVE_EFFECT_SP_ATK_MINUS_1: - case MOVE_EFFECT_SP_DEF_MINUS_1: - case MOVE_EFFECT_ACC_MINUS_1: - case MOVE_EFFECT_EVS_MINUS_1: - if (affectsUser == MOVE_EFFECT_AFFECTS_USER) - flags = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN; - else - flags = 0; - if (mirrorArmorReflected && !affectsUser) - flags |= STAT_CHANGE_ALLOW_PTR; - else - flags |= STAT_CHANGE_UPDATE_MOVE_EFFECT; + } + if (IsBattlerTurnDamaged(gEffectBattler) && i != NUM_BATTLE_STATS) + { + for (i = 0; i < NUM_BATTLE_STATS; i++) + gBattleMons[gEffectBattler].statStages[i] = DEFAULT_STAT_STAGE; + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_MoveEffectClearSmog; + } + break; + case MOVE_EFFECT_FLAME_BURST: + if (IsBattlerAlive(BATTLE_PARTNER(gBattlerTarget)) + && !IsSemiInvulnerable(BATTLE_PARTNER(gBattlerTarget), CHECK_ALL) + && GetBattlerAbility(BATTLE_PARTNER(gBattlerTarget)) != ABILITY_MAGIC_GUARD) + { + u32 partnerTarget = BATTLE_PARTNER(gBattlerTarget); + gBattleScripting.battler = partnerTarget; + SetPassiveDamageAmount(partnerTarget, gBattleMons[partnerTarget].maxHP / 16); + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_MoveEffectFlameBurst; + } + break; + case MOVE_EFFECT_FEINT: + i = FALSE; // Remove Protect if any + if (gProtectStructs[gBattlerTarget].protected != PROTECT_NONE + && gProtectStructs[gBattlerTarget].protected != PROTECT_MAX_GUARD) + { + gProtectStructs[gBattlerTarget].protected = PROTECT_NONE; + i = TRUE; + } + if (GetProtectType(gProtectStructs[BATTLE_PARTNER(gBattlerTarget)].protected) == PROTECT_TYPE_SIDE) + { + gProtectStructs[BATTLE_PARTNER(gBattlerTarget)].protected = PROTECT_NONE; + i = TRUE; + } + if (i) + { + BattleScriptPush(battleScript); + if (gCurrentMove == MOVE_HYPERSPACE_FURY) + gBattlescriptCurrInstr = BattleScript_HyperspaceFuryRemoveProtect; + else + gBattlescriptCurrInstr = BattleScript_MoveEffectFeint; + } + break; + case MOVE_EFFECT_V_CREATE: + if (!NoAliveMonsForEitherParty()) + { + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_VCreateStatLoss; + } + break; + case MOVE_EFFECT_CORE_ENFORCER: + if (HasBattlerActedThisTurn(gBattlerTarget) + && !NoAliveMonsForEitherParty()) + { + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_MoveEffectCoreEnforcer; + } + break; + case MOVE_EFFECT_THROAT_CHOP: + gDisableStructs[gEffectBattler].throatChopTimer = 2; + gBattlescriptCurrInstr = battleScript; + break; + case MOVE_EFFECT_INCINERATE: + if ((gBattleMons[gEffectBattler].item >= FIRST_BERRY_INDEX && gBattleMons[gEffectBattler].item <= LAST_BERRY_INDEX) + || (B_INCINERATE_GEMS >= GEN_6 && GetBattlerHoldEffect(gEffectBattler) == HOLD_EFFECT_GEMS)) + { + gLastUsedItem = gBattleMons[gEffectBattler].item; + gBattleMons[gEffectBattler].item = 0; + CheckSetUnburden(gEffectBattler); - if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE, - gBattleScripting.moveEffect - MOVE_EFFECT_ATK_MINUS_1 + 1, - flags, gBattlescriptCurrInstr + 1) == STAT_CHANGE_DIDNT_WORK) - { - if (!mirrorArmorReflected) - gBattlescriptCurrInstr++; - } - else - { - gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); - gBattleScripting.animArg2 = 0; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_StatDown; - } - break; - case MOVE_EFFECT_ATK_PLUS_2: - case MOVE_EFFECT_DEF_PLUS_2: - case MOVE_EFFECT_SPD_PLUS_2: - case MOVE_EFFECT_SP_ATK_PLUS_2: - case MOVE_EFFECT_SP_DEF_PLUS_2: - case MOVE_EFFECT_ACC_PLUS_2: - case MOVE_EFFECT_EVS_PLUS_2: - if (NoAliveMonsForEitherParty() - || ChangeStatBuffs(SET_STAT_BUFF_VALUE(2), - gBattleScripting.moveEffect - MOVE_EFFECT_ATK_PLUS_2 + 1, - affectsUser | STAT_CHANGE_UPDATE_MOVE_EFFECT, 0) == STAT_CHANGE_DIDNT_WORK) - { - gBattlescriptCurrInstr++; - } - else - { - gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); - gBattleScripting.animArg2 = 0; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_StatUp; - } - break; - case MOVE_EFFECT_ATK_MINUS_2: - case MOVE_EFFECT_DEF_MINUS_2: - case MOVE_EFFECT_SPD_MINUS_2: - case MOVE_EFFECT_SP_ATK_MINUS_2: - case MOVE_EFFECT_SP_DEF_MINUS_2: - case MOVE_EFFECT_ACC_MINUS_2: - case MOVE_EFFECT_EVS_MINUS_2: - if (affectsUser == MOVE_EFFECT_AFFECTS_USER) - flags = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN; - else - flags = 0; - if (mirrorArmorReflected && !affectsUser) - flags |= STAT_CHANGE_ALLOW_PTR; - else - flags |= STAT_CHANGE_UPDATE_MOVE_EFFECT; + BtlController_EmitSetMonData(gEffectBattler, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gEffectBattler].item), &gBattleMons[gEffectBattler].item); + MarkBattlerForControllerExec(gEffectBattler); + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_MoveEffectIncinerate; + } + break; + case MOVE_EFFECT_BUG_BITE: + if (GetBattlerHoldEffect(gEffectBattler) == HOLD_EFFECT_JABOCA_BERRY) + { + // jaboca berry triggers instead of being stolen + gBattlescriptCurrInstr = battleScript; + } + else if (GetItemPocket(gBattleMons[gEffectBattler].item) == POCKET_BERRIES + && battlerAbility != ABILITY_STICKY_HOLD) + { + // target loses their berry + gLastUsedItem = gBattleMons[gEffectBattler].item; + gBattleMons[gEffectBattler].item = 0; + CheckSetUnburden(gEffectBattler); - if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(2) | STAT_BUFF_NEGATIVE, - gBattleScripting.moveEffect - MOVE_EFFECT_ATK_MINUS_2 + 1, - flags, gBattlescriptCurrInstr + 1) == STAT_CHANGE_DIDNT_WORK) - { - if (!mirrorArmorReflected) - gBattlescriptCurrInstr++; - } - else - { - gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); - gBattleScripting.animArg2 = 0; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_StatDown; - } - break; - case MOVE_EFFECT_RECHARGE: - if (B_SKIP_RECHARGE == GEN_1 && !IsBattlerAlive(gBattlerTarget)) // Skip recharge if gen 1 and foe is KO'd - break; + BtlController_EmitSetMonData(gEffectBattler, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gEffectBattler].item), &gBattleMons[gEffectBattler].item); + MarkBattlerForControllerExec(gEffectBattler); + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_MoveEffectBugBite; + } + break; + case MOVE_EFFECT_TRAP_BOTH: + if (!(gBattleMons[gBattlerTarget].volatiles.escapePrevention || gBattleMons[gBattlerAttacker].volatiles.escapePrevention)) + { + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_BothCanNoLongerEscape; + } + if (!gBattleMons[gBattlerTarget].volatiles.escapePrevention) + gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; + + if (!gBattleMons[gBattlerAttacker].volatiles.escapePrevention) + gDisableStructs[gBattlerAttacker].battlerPreventingEscape = gBattlerTarget; - gBattleMons[gEffectBattler].status2 |= STATUS2_RECHARGE; - gDisableStructs[gEffectBattler].rechargeTimer = 2; - gLockedMoves[gEffectBattler] = gCurrentMove; - gBattlescriptCurrInstr++; + gBattleMons[gBattlerTarget].volatiles.escapePrevention = TRUE; + gBattleMons[gBattlerAttacker].volatiles.escapePrevention = TRUE; + break; + case MOVE_EFFECT_REMOVE_ARG_TYPE: + { + u32 type = GetMoveArgType(gCurrentMove); + // This seems unnecessary but is done to make it work properly with Parental Bond + BattleScriptPush(battleScript); + switch (type) + { + case TYPE_FIRE: // Burn Up + gBattlescriptCurrInstr = BattleScript_RemoveFireType; break; - case MOVE_EFFECT_RAGE: - gBattleMons[gBattlerAttacker].status2 |= STATUS2_RAGE; - gBattlescriptCurrInstr++; + case TYPE_ELECTRIC: // Double Shot + gBattlescriptCurrInstr = BattleScript_RemoveElectricType; break; - case MOVE_EFFECT_STEAL_ITEM: - if (!CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) - || gBattleMons[gBattlerAttacker].item != ITEM_NONE - || gBattleMons[gBattlerTarget].item == ITEM_NONE) - { - gBattlescriptCurrInstr++; - } - else if (GetBattlerAbility(gBattlerTarget) == ABILITY_STICKY_HOLD) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_NoItemSteal; - - gLastUsedAbility = gBattleMons[gBattlerTarget].ability; - RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); - } - else - { - StealTargetItem(gBattlerAttacker, gBattlerTarget); // Attacker steals target item - - if (!(B_STEAL_WILD_ITEMS >= GEN_9 - && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_PALACE)))) - { - gBattleMons[gBattlerAttacker].item = ITEM_NONE; // Item assigned later on with thief (see MOVEEND_CHANGED_ITEMS) - gBattleStruct->changedItems[gBattlerAttacker] = gLastUsedItem; // Stolen item to be assigned later - } - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_ItemSteal; - } + default: + gBattlescriptCurrInstr = BattleScript_RemoveGenericType; break; - case MOVE_EFFECT_PREVENT_ESCAPE: - gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION; - gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; - gBattlescriptCurrInstr++; + } + RemoveBattlerType(gEffectBattler, type); + break; + } + case MOVE_EFFECT_ROUND: + TryUpdateRoundTurnOrder(); // If another PokΓ©mon uses Round before the user this turn, the user will use Round directly after it + gBattlescriptCurrInstr = battleScript; + break; + case MOVE_EFFECT_DIRE_CLAW: + if (!gBattleMons[gEffectBattler].status1) + { + static const u8 sDireClawEffects[] = { MOVE_EFFECT_POISON, MOVE_EFFECT_PARALYSIS, MOVE_EFFECT_SLEEP }; + SetMoveEffect(battler, effectBattler, RandomElement(RNG_DIRE_CLAW, sDireClawEffects), battleScript, effectFlags); + } + break; + case MOVE_EFFECT_STEALTH_ROCK: + if (!IsHazardOnSide(GetBattlerSide(gEffectBattler), HAZARDS_STEALTH_ROCK)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_POINTEDSTONESFLOAT; + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_StealthRockActivates; + } + break; + case MOVE_EFFECT_SYRUP_BOMB: + if (!gBattleMons[gEffectBattler].volatiles.syrupBomb) + { + struct Pokemon *mon = GetBattlerMon(gBattlerAttacker); + + gBattleMons[gEffectBattler].volatiles.syrupBomb = TRUE; + gBattleMons[gEffectBattler].volatiles.stickySyrupedBy = gBattlerAttacker; + gDisableStructs[gEffectBattler].syrupBombTimer = 3; + gDisableStructs[gEffectBattler].syrupBombIsShiny = IsMonShiny(mon); + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_SyrupBombActivates; + } + break; + case MOVE_EFFECT_SECRET_POWER: + if (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) + { + switch (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) + { + case STATUS_FIELD_MISTY_TERRAIN: + moveEffect = MOVE_EFFECT_SP_ATK_MINUS_1; break; - case MOVE_EFFECT_NIGHTMARE: - gBattleMons[gBattlerTarget].status2 |= STATUS2_NIGHTMARE; - gBattlescriptCurrInstr++; + case STATUS_FIELD_GRASSY_TERRAIN: + moveEffect = MOVE_EFFECT_SLEEP; break; - case MOVE_EFFECT_ALL_STATS_UP: - if (!NoAliveMonsForEitherParty()) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_AllStatsUp; - } + case STATUS_FIELD_ELECTRIC_TERRAIN: + moveEffect = MOVE_EFFECT_PARALYSIS; break; - case MOVE_EFFECT_ATK_DEF_DOWN: // SuperPower - if (!NoAliveMonsForEitherParty()) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_AtkDefDown; - } + case STATUS_FIELD_PSYCHIC_TERRAIN: + moveEffect = MOVE_EFFECT_SPD_MINUS_1; break; - case MOVE_EFFECT_DEF_SPDEF_DOWN: // Close Combat - if (!NoAliveMonsForEitherParty()) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_DefSpDefDown; - } + default: + moveEffect = MOVE_EFFECT_PARALYSIS; break; - case MOVE_EFFECT_RECOIL_HP_25: // Struggle - gBattleStruct->moveDamage[gEffectBattler] = (gBattleMons[gEffectBattler].maxHP) / 4; - if (gBattleStruct->moveDamage[gEffectBattler] == 0) - gBattleStruct->moveDamage[gEffectBattler] = 1; - if (GetBattlerAbility(gEffectBattler) == ABILITY_PARENTAL_BOND) - gBattleStruct->moveDamage[gEffectBattler] *= 2; - - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; + } + } + else + SetMoveEffect(battler, effectBattler, gBattleEnvironmentInfo[gBattleEnvironment].secretPowerEffect, battleScript, effectFlags); + break; + case MOVE_EFFECT_PSYCHIC_NOISE: + battlerAbility = IsAbilityOnSide(gEffectBattler, ABILITY_AROMA_VEIL); + + if (battlerAbility) + { + gBattlerAbility = battlerAbility - 1; + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_AromaVeilProtectsRet; + } + else if (!gBattleMons[gEffectBattler].volatiles.healBlock) + { + gBattleMons[gEffectBattler].volatiles.healBlock = TRUE; + gDisableStructs[gEffectBattler].healBlockTimer = 2; + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectPsychicNoise; + } + break; + case MOVE_EFFECT_TERA_BLAST: + if (GetActiveGimmick(gEffectBattler) == GIMMICK_TERA + && GetBattlerTeraType(gEffectBattler) == TYPE_STELLAR + && !NoAliveMonsForEitherParty()) + { + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_LowerAtkSpAtk; + } + break; + case MOVE_EFFECT_ORDER_UP: + { + enum Stat stat = 0; + bool32 commanderAffected = TRUE; + switch (gBattleStruct->battlerState[gEffectBattler].commanderSpecies) + { + case SPECIES_TATSUGIRI_CURLY: + stat = STAT_ATK; break; - case MOVE_EFFECT_THRASH: - // Petal Dance doesn't lock mons that copy the move with Dancer - if (gSpecialStatuses[gEffectBattler].dancerUsedMove) - { - gBattlescriptCurrInstr++; - } - else - { - gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS; - gLockedMoves[gEffectBattler] = gCurrentMove; - gBattleMons[gEffectBattler].status2 |= STATUS2_LOCK_CONFUSE_TURN(RandomUniform(RNG_RAMPAGE_TURNS, 2, 3)); - } + case SPECIES_TATSUGIRI_DROOPY: + stat = STAT_DEF; break; - case MOVE_EFFECT_CLEAR_SMOG: - for (i = 0; i < NUM_BATTLE_STATS; i++) - { - if (gBattleMons[gEffectBattler].statStages[i] != DEFAULT_STAT_STAGE) - break; - } - if ((gSpecialStatuses[gEffectBattler].physicalDmg || gSpecialStatuses[gEffectBattler].specialDmg) && i != NUM_BATTLE_STATS) - { - for (i = 0; i < NUM_BATTLE_STATS; i++) - gBattleMons[gEffectBattler].statStages[i] = DEFAULT_STAT_STAGE; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectClearSmog; - } + case SPECIES_TATSUGIRI_STRETCHY: + stat = STAT_SPEED; break; - case MOVE_EFFECT_FLAME_BURST: - if (IsBattlerAlive(BATTLE_PARTNER(gBattlerTarget)) - && !(gStatuses3[BATTLE_PARTNER(gBattlerTarget)] & STATUS3_SEMI_INVULNERABLE) - && GetBattlerAbility(BATTLE_PARTNER(gBattlerTarget)) != ABILITY_MAGIC_GUARD) - { - i = BATTLE_PARTNER(gBattlerTarget); - gBattleScripting.savedBattler = i; - gBattleStruct->moveDamage[i] = gBattleMons[i].maxHP / 16; - if (gBattleStruct->moveDamage[i] == 0) - gBattleStruct->moveDamage[i] = 1; - gBattlescriptCurrInstr = BattleScript_MoveEffectFlameBurst; - } + default: + commanderAffected = FALSE; break; - case MOVE_EFFECT_FEINT: - i = FALSE; // Remove Protect if any - if (gProtectStructs[gBattlerTarget].protected != PROTECT_NONE - && gProtectStructs[gBattlerTarget].protected != PROTECT_MAX_GUARD) - { - gProtectStructs[gBattlerTarget].protected = PROTECT_NONE; - i = TRUE; - } - if (GetProtectType(gProtectStructs[BATTLE_PARTNER(gBattlerTarget)].protected) == PROTECT_TYPE_SIDE) - { - gProtectStructs[BATTLE_PARTNER(gBattlerTarget)].protected = PROTECT_NONE; - i = TRUE; - } - if (i) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - if (gCurrentMove == MOVE_HYPERSPACE_FURY) - gBattlescriptCurrInstr = BattleScript_HyperspaceFuryRemoveProtect; - else - gBattlescriptCurrInstr = BattleScript_MoveEffectFeint; - } - break; - case MOVE_EFFECT_V_CREATE: - if (!NoAliveMonsForEitherParty()) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_VCreateStatLoss; - } - break; - case MOVE_EFFECT_CORE_ENFORCER: - if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget) - && !NoAliveMonsForEitherParty()) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectCoreEnforcer; - } - break; - case MOVE_EFFECT_THROAT_CHOP: - gDisableStructs[gEffectBattler].throatChopTimer = gBattleTurnCounter + 2; - gBattlescriptCurrInstr++; - break; - case MOVE_EFFECT_INCINERATE: - if ((gBattleMons[gEffectBattler].item >= FIRST_BERRY_INDEX && gBattleMons[gEffectBattler].item <= LAST_BERRY_INDEX) - || (B_INCINERATE_GEMS >= GEN_6 && GetBattlerHoldEffect(gEffectBattler, FALSE) == HOLD_EFFECT_GEMS)) - { - gLastUsedItem = gBattleMons[gEffectBattler].item; - gBattleMons[gEffectBattler].item = 0; - CheckSetUnburden(gEffectBattler); - - BtlController_EmitSetMonData(gEffectBattler, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gEffectBattler].item), &gBattleMons[gEffectBattler].item); - MarkBattlerForControllerExec(gEffectBattler); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectIncinerate; - } - break; - case MOVE_EFFECT_BUG_BITE: - if (GetItemPocket(gBattleMons[gEffectBattler].item) == POCKET_BERRIES - && battlerAbility != ABILITY_STICKY_HOLD) - { - // target loses their berry - gLastUsedItem = gBattleMons[gEffectBattler].item; - gBattleMons[gEffectBattler].item = 0; - CheckSetUnburden(gEffectBattler); - - BtlController_EmitSetMonData(gEffectBattler, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gEffectBattler].item), &gBattleMons[gEffectBattler].item); - MarkBattlerForControllerExec(gEffectBattler); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectBugBite; - } - break; - case MOVE_EFFECT_TRAP_BOTH: - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_ESCAPE_PREVENTION) && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_ESCAPE_PREVENTION)) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_BothCanNoLongerEscape; - } - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_ESCAPE_PREVENTION)) - gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; - - if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_ESCAPE_PREVENTION)) - gDisableStructs[gBattlerAttacker].battlerPreventingEscape = gBattlerTarget; + } + if (!commanderAffected + || NoAliveMonsForEitherParty() + || ChangeStatBuffs( + effectBattler, + SET_STAT_BUFF_VALUE(1), + stat, + STAT_CHANGE_UPDATE_MOVE_EFFECT, + 0, + 0) == STAT_CHANGE_DIDNT_WORK) + { + gBattlescriptCurrInstr = battleScript; + } + else + { + gBattleScripting.animArg1 = moveEffect; + gBattleScripting.animArg2 = 0; + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_StatUp; + } + } + break; + case MOVE_EFFECT_ION_DELUGE: + if (!(gFieldStatuses & STATUS_FIELD_ION_DELUGE)) + { + gFieldStatuses |= STATUS_FIELD_ION_DELUGE; + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_MoveEffectIonDeluge; + } + break; + case MOVE_EFFECT_HAZE: + for (i = 0; i < gBattlersCount; i++) + TryResetBattlerStatChanges(i); + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_MoveEffectHaze; + break; + case MOVE_EFFECT_LEECH_SEED: + if (!IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_GRASS) && !gBattleMons[gBattlerTarget].volatiles.leechSeed) + { + gBattleMons[gBattlerTarget].volatiles.leechSeed = LEECHSEEDED_BY(gBattlerAttacker); + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_MoveEffectLeechSeed; + } + break; + case MOVE_EFFECT_REFLECT: + if (TrySetReflect(gBattlerAttacker)) + { + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_MoveEffectReflect; + } + break; + case MOVE_EFFECT_LIGHT_SCREEN: + if (TrySetLightScreen(gBattlerAttacker)) + { + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_MoveEffectLightScreen; + } + break; + case MOVE_EFFECT_SALT_CURE: + if (!gBattleMons[gBattlerTarget].volatiles.saltCure) + { + gBattleMons[gBattlerTarget].volatiles.saltCure = TRUE; + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_MoveEffectSaltCure; + } + break; + case MOVE_EFFECT_EERIE_SPELL: + if (gLastMoves[gBattlerTarget] != MOVE_NONE && gLastMoves[gBattlerTarget] != 0xFFFF) + { + u32 i; - gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION; - gBattleMons[gBattlerAttacker].status2 |= STATUS2_ESCAPE_PREVENTION; - break; - case MOVE_EFFECT_REMOVE_ARG_TYPE: + for (i = 0; i < MAX_MON_MOVES; i++) { - u32 type = GetMoveArgType(gCurrentMove); - // This seems unnecessary but is done to make it work properly with Parental Bond - BattleScriptPush(gBattlescriptCurrInstr + 1); - switch (type) - { - case TYPE_FIRE: // Burn Up - gBattlescriptCurrInstr = BattleScript_RemoveFireType; - break; - case TYPE_ELECTRIC: // Double Shot - gBattlescriptCurrInstr = BattleScript_RemoveElectricType; - break; - default: - gBattlescriptCurrInstr = BattleScript_RemoveGenericType; - break; - } - RemoveBattlerType(gEffectBattler, type); - break; + if (gLastMoves[gBattlerTarget] == gBattleMons[gBattlerTarget].moves[i]) + break; } - case MOVE_EFFECT_ROUND: - TryUpdateRoundTurnOrder(); // If another PokΓ©mon uses Round before the user this turn, the user will use Round directly after it - gBattlescriptCurrInstr++; - break; - case MOVE_EFFECT_DIRE_CLAW: - if (!gBattleMons[gEffectBattler].status1) - { - static const u8 sDireClawEffects[] = { MOVE_EFFECT_POISON, MOVE_EFFECT_PARALYSIS, MOVE_EFFECT_SLEEP }; - gBattleScripting.moveEffect = RandomElement(RNG_DIRE_CLAW, sDireClawEffects); - SetMoveEffect(primary, certain); - } - break; - case MOVE_EFFECT_STEALTH_ROCK: - if (!(gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_STEALTH_ROCK)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_POINTEDSTONESFLOAT; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_StealthRockActivates; - } - break; - case MOVE_EFFECT_SPIKES: - if (gSideTimers[GetBattlerSide(gEffectBattler)].spikesAmount < 3) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SPIKESSCATTERED; - BattleScriptPush(gBattlescriptCurrInstr + 1); - if (gBattleStruct->isSkyBattle) - gBattlescriptCurrInstr++; - else - gBattlescriptCurrInstr = BattleScript_SpikesActivates; - } - break; - case MOVE_EFFECT_SYRUP_BOMB: - if (!(gStatuses4[gEffectBattler] & STATUS4_SYRUP_BOMB)) - { - struct Pokemon *mon = GetBattlerMon(gBattlerAttacker); - - gStatuses4[gEffectBattler] |= STATUS4_SYRUP_BOMB; - gDisableStructs[gEffectBattler].syrupBombTimer = 3; - gDisableStructs[gEffectBattler].syrupBombIsShiny = IsMonShiny(mon); - gBattleStruct->stickySyrupdBy[gEffectBattler] = gBattlerAttacker; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_SyrupBombActivates; - } - break; - case MOVE_EFFECT_SECRET_POWER: - if (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) - { - switch (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) - { - case STATUS_FIELD_MISTY_TERRAIN: - gBattleScripting.moveEffect = MOVE_EFFECT_SP_ATK_MINUS_1; - break; - case STATUS_FIELD_GRASSY_TERRAIN: - gBattleScripting.moveEffect = MOVE_EFFECT_SLEEP; - break; - case STATUS_FIELD_ELECTRIC_TERRAIN: - gBattleScripting.moveEffect = MOVE_EFFECT_PARALYSIS; - break; - case STATUS_FIELD_PSYCHIC_TERRAIN: - gBattleScripting.moveEffect = MOVE_EFFECT_SPD_MINUS_1; - break; - default: - gBattleScripting.moveEffect = MOVE_EFFECT_PARALYSIS; - break; - } - } - else - { - switch (gBattleEnvironment) - { - case BATTLE_ENVIRONMENT_GRASS: - gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_4 ? MOVE_EFFECT_SLEEP : MOVE_EFFECT_POISON); - break; - case BATTLE_ENVIRONMENT_UNDERWATER: - gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_6 ? MOVE_EFFECT_ATK_MINUS_1 : MOVE_EFFECT_DEF_MINUS_1); - break; - case BATTLE_ENVIRONMENT_POND: - gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_4 ? MOVE_EFFECT_ATK_MINUS_1 : MOVE_EFFECT_SPD_MINUS_1); - break; - case BATTLE_ENVIRONMENT_MOUNTAIN: - if (B_SECRET_POWER_EFFECT >= GEN_5) - gBattleScripting.moveEffect = MOVE_EFFECT_ACC_MINUS_1; - else if (B_SECRET_POWER_EFFECT >= GEN_4) - gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH; - else - gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION; - break; - case BATTLE_ENVIRONMENT_PUDDLE: - gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_5 ? MOVE_EFFECT_SPD_MINUS_1 : MOVE_EFFECT_ACC_MINUS_1); - break; - case BATTLE_ENVIRONMENT_LONG_GRASS: - gBattleScripting.moveEffect = MOVE_EFFECT_SLEEP; - break; - case BATTLE_ENVIRONMENT_SAND: - gBattleScripting.moveEffect = MOVE_EFFECT_ACC_MINUS_1; - break; - case BATTLE_ENVIRONMENT_WATER: - gBattleScripting.moveEffect = MOVE_EFFECT_ATK_MINUS_1; - break; - case BATTLE_ENVIRONMENT_CAVE: - case BATTLE_ENVIRONMENT_BURIAL_GROUND: - case BATTLE_ENVIRONMENT_SPACE: - gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH; - break; - case BATTLE_ENVIRONMENT_SOARING: - case BATTLE_ENVIRONMENT_SKY_PILLAR: - case BATTLE_ENVIRONMENT_MARSH: - case BATTLE_ENVIRONMENT_SWAMP: - gBattleScripting.moveEffect = MOVE_EFFECT_SPD_MINUS_1; - break; - case BATTLE_ENVIRONMENT_SNOW: - case BATTLE_ENVIRONMENT_ICE: - gBattleScripting.moveEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE; - break; - case BATTLE_ENVIRONMENT_VOLCANO: - gBattleScripting.moveEffect = MOVE_EFFECT_BURN; - break; - case BATTLE_ENVIRONMENT_ULTRA_SPACE: - gBattleScripting.moveEffect = MOVE_EFFECT_DEF_MINUS_1; - break; - default: - gBattleScripting.moveEffect = MOVE_EFFECT_PARALYSIS; - break; - } - } - SetMoveEffect(primary, certain); - break; - case MOVE_EFFECT_PSYCHIC_NOISE: - battlerAbility = IsAbilityOnSide(gEffectBattler, ABILITY_AROMA_VEIL); + if (i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] != 0) + { + u32 ppToDeduct = 3; - if (battlerAbility) - { - gBattlerAbility = battlerAbility - 1; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_AromaVeilProtectsRet; - } - else if (!(gStatuses3[gEffectBattler] & STATUS3_HEAL_BLOCK)) - { - gStatuses3[gEffectBattler] |= STATUS3_HEAL_BLOCK; - gDisableStructs[gEffectBattler].healBlockTimer = gBattleTurnCounter + 2; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectPsychicNoise; - } - break; - case MOVE_EFFECT_TERA_BLAST: - if (GetActiveGimmick(gEffectBattler) == GIMMICK_TERA - && GetBattlerTeraType(gEffectBattler) == TYPE_STELLAR - && !NoAliveMonsForEitherParty()) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_LowerAtkSpAtk; - } - break; - case MOVE_EFFECT_ORDER_UP: - { - u32 stat = 0; - bool32 commanderAffected = TRUE; - switch (gBattleStruct->commanderActive[gEffectBattler]) - { - case SPECIES_TATSUGIRI_CURLY: - stat = STAT_ATK; - break; - case SPECIES_TATSUGIRI_DROOPY: - stat = STAT_DEF; - break; - case SPECIES_TATSUGIRI_STRETCHY: - stat = STAT_SPEED; - break; - default: - commanderAffected = FALSE; - break; - } - if (!commanderAffected - || NoAliveMonsForEitherParty() - || ChangeStatBuffs(SET_STAT_BUFF_VALUE(1), - stat, - affectsUser | STAT_CHANGE_UPDATE_MOVE_EFFECT, - 0) == STAT_CHANGE_DIDNT_WORK) - { - gBattlescriptCurrInstr++; - } - else - { - gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); - gBattleScripting.animArg2 = 0; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_StatUp; - } - } - break; - case MOVE_EFFECT_ION_DELUGE: - if (!(gFieldStatuses & STATUS_FIELD_ION_DELUGE)) - { - gFieldStatuses |= STATUS_FIELD_ION_DELUGE; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectIonDeluge; - } - break; - case MOVE_EFFECT_HAZE: - for (i = 0; i < gBattlersCount; i++) - TryResetBattlerStatChanges(i); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectHaze; - break; - case MOVE_EFFECT_LEECH_SEED: - if (!IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_GRASS) && !(gStatuses3[gBattlerTarget] & STATUS3_LEECHSEED)) - { - gStatuses3[gBattlerTarget] |= gBattlerAttacker; - gStatuses3[gBattlerTarget] |= STATUS3_LEECHSEED; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectLeechSeed; - } - break; - case MOVE_EFFECT_REFLECT: - if (TrySetReflect(gBattlerAttacker)) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectReflect; - } - break; - case MOVE_EFFECT_LIGHT_SCREEN: - if (TrySetLightScreen(gBattlerAttacker)) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectLightScreen; - } - break; - case MOVE_EFFECT_SALT_CURE: - if (!(gStatuses4[gBattlerTarget] & STATUS4_SALT_CURE)) + if (gBattleMons[gBattlerTarget].pp[i] < ppToDeduct) + ppToDeduct = gBattleMons[gBattlerTarget].pp[i]; + + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastMoves[gBattlerTarget]) + ConvertIntToDecimalStringN(gBattleTextBuff2, ppToDeduct, STR_CONV_MODE_LEFT_ALIGN, 1); + PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 1, ppToDeduct) + gBattleMons[gBattlerTarget].pp[i] -= ppToDeduct; + if (!(gDisableStructs[gBattlerTarget].mimickedMoves & (1u << i)) + && !(gBattleMons[gBattlerTarget].volatiles.transformed)) { - gStatuses4[gBattlerTarget] |= STATUS4_SALT_CURE; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectSaltCure; + BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + i, 0, sizeof(gBattleMons[gBattlerTarget].pp[i]), &gBattleMons[gBattlerTarget].pp[i]); + MarkBattlerForControllerExec(gBattlerTarget); } - break; - case MOVE_EFFECT_EERIE_SPELL: - if (gLastMoves[gBattlerTarget] != MOVE_NONE && gLastMoves[gBattlerTarget] != 0xFFFF) - { - u32 i; - - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gLastMoves[gBattlerTarget] == gBattleMons[gBattlerTarget].moves[i]) - break; - } - - if (i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] != 0) - { - u32 ppToDeduct = 3; - - if (gBattleMons[gBattlerTarget].pp[i] < ppToDeduct) - ppToDeduct = gBattleMons[gBattlerTarget].pp[i]; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastMoves[gBattlerTarget]) - ConvertIntToDecimalStringN(gBattleTextBuff2, ppToDeduct, STR_CONV_MODE_LEFT_ALIGN, 1); - PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 1, ppToDeduct) - gBattleMons[gBattlerTarget].pp[i] -= ppToDeduct; - if (!(gDisableStructs[gBattlerTarget].mimickedMoves & (1u << i)) - && !(gBattleMons[gBattlerTarget].status2 & STATUS2_TRANSFORMED)) - { - BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + i, 0, sizeof(gBattleMons[gBattlerTarget].pp[i]), &gBattleMons[gBattlerTarget].pp[i]); - MarkBattlerForControllerExec(gBattlerTarget); - } + if (gBattleMons[gBattlerTarget].pp[i] == 0 && gBattleStruct->skyDropTargets[gBattlerTarget] == SKY_DROP_NO_TARGET) + CancelMultiTurnMoves(gBattlerTarget, SKY_DROP_IGNORE); - if (gBattleMons[gBattlerTarget].pp[i] == 0 && gBattleStruct->skyDropTargets[gBattlerTarget] == SKY_DROP_NO_TARGET) - CancelMultiTurnMoves(gBattlerTarget, SKY_DROP_IGNORE); - - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectEerieSpell; - } - } - break; - case MOVE_EFFECT_RAISE_TEAM_ATTACK: - if (!NoAliveMonsForEitherParty()) - { - // Max Effects are ordered by stat ID. - SET_STATCHANGER(STAT_ATK, 1, FALSE); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; - } - break; - case MOVE_EFFECT_RAISE_TEAM_DEFENSE: - if (!NoAliveMonsForEitherParty()) - { - // Max Effects are ordered by stat ID. - SET_STATCHANGER(STAT_DEF, 1, FALSE); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; - } - break; - case MOVE_EFFECT_RAISE_TEAM_SPEED: - if (!NoAliveMonsForEitherParty()) - { - // Max Effects are ordered by stat ID. - SET_STATCHANGER(STAT_SPEED, 1, FALSE); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; - } - break; - case MOVE_EFFECT_RAISE_TEAM_SP_ATK: - if (!NoAliveMonsForEitherParty()) - { - // Max Effects are ordered by stat ID. - SET_STATCHANGER(STAT_SPATK, 1, FALSE); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; - } - break; - case MOVE_EFFECT_RAISE_TEAM_SP_DEF: - if (!NoAliveMonsForEitherParty()) - { + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_MoveEffectEerieSpell; + } + } + break; + case MOVE_EFFECT_RAISE_TEAM_ATTACK: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_ATK, 1, FALSE); + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_RAISE_TEAM_DEFENSE: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_DEF, 1, FALSE); + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_RAISE_TEAM_SPEED: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_SPEED, 1, FALSE); + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_RAISE_TEAM_SP_ATK: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_SPATK, 1, FALSE); + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_RAISE_TEAM_SP_DEF: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_SPDEF, 1, FALSE); + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_LOWER_ATTACK_SIDE: + case MOVE_EFFECT_LOWER_DEFENSE_SIDE: + case MOVE_EFFECT_LOWER_SPEED_SIDE: + case MOVE_EFFECT_LOWER_SP_ATK_SIDE: + case MOVE_EFFECT_LOWER_SP_DEF_SIDE: + case MOVE_EFFECT_LOWER_SPEED_2_SIDE: + case MOVE_EFFECT_LOWER_EVASIVENESS_SIDE: + if (!NoAliveMonsForEitherParty()) + { + enum Stat statId = 0; + u32 stage = 1; + switch (moveEffect) + { + case MOVE_EFFECT_LOWER_SPEED_2_SIDE: + statId = STAT_SPEED; + stage = 2; + break; + case MOVE_EFFECT_LOWER_EVASIVENESS_SIDE: + statId = STAT_EVASION; + break; + default: // Max Effects are ordered by stat ID. - SET_STATCHANGER(STAT_SPDEF, 1, FALSE); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; - } - break; - case MOVE_EFFECT_LOWER_ATTACK_SIDE: - case MOVE_EFFECT_LOWER_DEFENSE_SIDE: - case MOVE_EFFECT_LOWER_SPEED_SIDE: - case MOVE_EFFECT_LOWER_SP_ATK_SIDE: - case MOVE_EFFECT_LOWER_SP_DEF_SIDE: - case MOVE_EFFECT_LOWER_SPEED_2_SIDE: - case MOVE_EFFECT_LOWER_EVASIVENESS_SIDE: - if (!NoAliveMonsForEitherParty()) - { - u32 statId = 0; - u32 stage = 1; - switch (gBattleScripting.moveEffect) - { - case MOVE_EFFECT_LOWER_SPEED_2_SIDE: - statId = STAT_SPEED; - stage = 2; - break; - case MOVE_EFFECT_LOWER_EVASIVENESS_SIDE: - statId = STAT_EVASION; - break; - default: - // Max Effects are ordered by stat ID. - statId = gBattleScripting.moveEffect - MOVE_EFFECT_LOWER_ATTACK_SIDE + 1; - break; - } - SET_STATCHANGER(statId, stage, TRUE); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectLowerStatFoes; - } - break; + statId = moveEffect - MOVE_EFFECT_LOWER_ATTACK_SIDE + 1; + break; + } + SET_STATCHANGER(statId, stage, TRUE); + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectLowerStatFoes; + } + break; + case MOVE_EFFECT_SUN: + case MOVE_EFFECT_RAIN: + case MOVE_EFFECT_SANDSTORM: + case MOVE_EFFECT_HAIL: + { + u8 weather = 0, msg = 0; + switch (moveEffect) + { case MOVE_EFFECT_SUN: + weather = BATTLE_WEATHER_SUN; + msg = B_MSG_STARTED_SUNLIGHT; + break; case MOVE_EFFECT_RAIN: + weather = BATTLE_WEATHER_RAIN; + msg = B_MSG_STARTED_RAIN; + break; case MOVE_EFFECT_SANDSTORM: + weather = BATTLE_WEATHER_SANDSTORM; + msg = B_MSG_STARTED_SANDSTORM; + break; case MOVE_EFFECT_HAIL: - { - u8 weather = 0, msg = 0; - switch (gBattleScripting.moveEffect) + if (B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_SNOW) { - case MOVE_EFFECT_SUN: - weather = BATTLE_WEATHER_SUN; - msg = B_MSG_STARTED_SUNLIGHT; - break; - case MOVE_EFFECT_RAIN: - weather = BATTLE_WEATHER_RAIN; - msg = B_MSG_STARTED_RAIN; - break; - case MOVE_EFFECT_SANDSTORM: - weather = BATTLE_WEATHER_SANDSTORM; - msg = B_MSG_STARTED_SANDSTORM; - break; - case MOVE_EFFECT_HAIL: - if (B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_SNOW) - { - weather = BATTLE_WEATHER_SNOW; - msg = B_MSG_STARTED_SNOW; - } - else - { - weather = BATTLE_WEATHER_HAIL; - msg = B_MSG_STARTED_HAIL; - } - break; + weather = BATTLE_WEATHER_SNOW; + msg = B_MSG_STARTED_SNOW; } - if (TryChangeBattleWeather(gBattlerAttacker, weather, FALSE)) + else { - gBattleCommunication[MULTISTRING_CHOOSER] = msg; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectSetWeather; + weather = BATTLE_WEATHER_HAIL; + msg = B_MSG_STARTED_HAIL; } break; - } + default: + break; + } + if (TryChangeBattleWeather(gBattlerAttacker, weather, ABILITY_NONE)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = msg; + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectSetWeather; + } + break; + } + case MOVE_EFFECT_MISTY_TERRAIN: + case MOVE_EFFECT_GRASSY_TERRAIN: + case MOVE_EFFECT_ELECTRIC_TERRAIN: + case MOVE_EFFECT_PSYCHIC_TERRAIN: + { + u32 statusFlag = 0; + switch (moveEffect) + { case MOVE_EFFECT_MISTY_TERRAIN: + statusFlag = STATUS_FIELD_MISTY_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY; + break; case MOVE_EFFECT_GRASSY_TERRAIN: + statusFlag = STATUS_FIELD_GRASSY_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_GRASSY; + break; case MOVE_EFFECT_ELECTRIC_TERRAIN: + statusFlag = STATUS_FIELD_ELECTRIC_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC; + break; case MOVE_EFFECT_PSYCHIC_TERRAIN: - { - u32 statusFlag = 0; - switch (gBattleScripting.moveEffect) - { - case MOVE_EFFECT_MISTY_TERRAIN: - statusFlag = STATUS_FIELD_MISTY_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY; - break; - case MOVE_EFFECT_GRASSY_TERRAIN: - statusFlag = STATUS_FIELD_GRASSY_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_GRASSY; - break; - case MOVE_EFFECT_ELECTRIC_TERRAIN: - statusFlag = STATUS_FIELD_ELECTRIC_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC; - break; - case MOVE_EFFECT_PSYCHIC_TERRAIN: - statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_PSYCHIC; - break; - } - if (!(gFieldStatuses & statusFlag) && statusFlag != 0) - { - gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; - gFieldStatuses |= statusFlag; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER) - gFieldTimers.terrainTimer = gBattleTurnCounter + 8; - else - gFieldTimers.terrainTimer = gBattleTurnCounter + 5; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectSetTerrain; - } + statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_PSYCHIC; break; - } - case MOVE_EFFECT_VINE_LASH: - case MOVE_EFFECT_CANNONADE: - case MOVE_EFFECT_WILDFIRE: - case MOVE_EFFECT_VOLCALITH: - { - u8 side = GetBattlerSide(gBattlerTarget); - if (!(gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES)) - { - u32 moveType = GetMoveType(gCurrentMove); - gSideStatuses[side] |= SIDE_STATUS_DAMAGE_NON_TYPES; - gSideTimers[side].damageNonTypesTimer = gBattleTurnCounter + 5; // damage is dealt for 4 turns, ends on 5th - gSideTimers[side].damageNonTypesType = moveType; - BattleScriptPush(gBattlescriptCurrInstr + 1); - ChooseDamageNonTypesString(moveType); - gBattlescriptCurrInstr = BattleScript_DamageNonTypesStarts; - } - break; - } - case MOVE_EFFECT_STEELSURGE: - if (!(gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_STEELSURGE)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SHARPSTEELFLOATS; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectSteelsurge; - } - break; - case MOVE_EFFECT_DEFOG: - if (gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_SCREEN_ANY - || gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_HAZARDS_ANY - || gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_HAZARDS_ANY - || gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_DefogTryHazards; - } - break; - case MOVE_EFFECT_AURORA_VEIL: - if (!(gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_AURORA_VEIL)) - { - gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_AURORA_VEIL; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 8; - else - gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 5; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SAFEGUARD; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectAuroraVeilSuccess; - } - break; - case MOVE_EFFECT_GRAVITY: - if (!(gFieldStatuses & STATUS_FIELD_GRAVITY)) - { - gFieldStatuses |= STATUS_FIELD_GRAVITY; - gFieldTimers.gravityTimer = gBattleTurnCounter + 5; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectGravitySuccess; - } + default: break; - case MOVE_EFFECT_SANDBLAST_SIDE: - case MOVE_EFFECT_FIRE_SPIN_SIDE: + } + if (!(gFieldStatuses & statusFlag) && statusFlag != 0) + { + gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; + gFieldStatuses |= statusFlag; + if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_TERRAIN_EXTENDER) + gFieldTimers.terrainTimer = 8; + else + gFieldTimers.terrainTimer = 5; + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectSetTerrain; + } + break; + } + case MOVE_EFFECT_VINE_LASH: + case MOVE_EFFECT_CANNONADE: + case MOVE_EFFECT_WILDFIRE: + case MOVE_EFFECT_VOLCALITH: + { + u8 side = GetBattlerSide(gBattlerTarget); + if (!(gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES)) + { + u32 moveType = GetMoveType(gCurrentMove); + gSideStatuses[side] |= SIDE_STATUS_DAMAGE_NON_TYPES; + gSideTimers[side].damageNonTypesTimer = 5; + gSideTimers[side].damageNonTypesType = moveType; + BattleScriptPush(battleScript); + ChooseDamageNonTypesString(moveType); + gBattlescriptCurrInstr = BattleScript_DamageNonTypesStarts; + } + break; + } + case MOVE_EFFECT_STEELSURGE: + if (!IsHazardOnSide(GetBattlerSide(gBattlerTarget), HAZARDS_STEELSURGE)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SHARPSTEELFLOATS; + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectSteelsurge; + } + break; + case MOVE_EFFECT_DEFOG: + if (gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_SCREEN_ANY + || AreAnyHazardsOnSide(GetBattlerSide(gBattlerTarget)) + || AreAnyHazardsOnSide(GetBattlerSide(gBattlerAttacker)) + || gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) + { + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_MoveEffectDefog; + } + break; + case MOVE_EFFECT_AURORA_VEIL: + if (!(gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_AURORA_VEIL)) + { + gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_AURORA_VEIL; + if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_LIGHT_CLAY) + gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = 8; + else + gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = 5; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SAFEGUARD; + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_MoveEffectAuroraVeil; + } + break; + case MOVE_EFFECT_GRAVITY: + if (!(gFieldStatuses & STATUS_FIELD_GRAVITY)) + { + gFieldStatuses |= STATUS_FIELD_GRAVITY; + gFieldTimers.gravityTimer = 5; + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectGravitySuccess; + } + break; + case MOVE_EFFECT_SANDBLAST_SIDE: + case MOVE_EFFECT_FIRE_SPIN_SIDE: + { + // Affects both opponents, but doesn't print strings so we can handle it here. + u8 battler; + for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler) + { + if (!IsBattlerAlly(battler, gBattlerTarget)) + continue; + if (!gBattleMons[battler].volatiles.wrapped) { - // Affects both opponents, but doesn't print strings so we can handle it here. - u8 battler; - for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler) - { - if (!IsBattlerAlly(battler, gBattlerTarget)) - continue; - if (!(gBattleMons[battler].status2 & STATUS2_WRAPPED)) - { - gBattleMons[battler].status2 |= STATUS2_WRAPPED; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_GRIP_CLAW) - gDisableStructs[battler].wrapTurns = (B_BINDING_TURNS >= GEN_5) ? 7 : 5; - else - gDisableStructs[battler].wrapTurns = (Random() % 2) + 4; - // The Wrap effect does not expire when the user switches, so here's some cheese. - gBattleStruct->wrappedBy[battler] = gBattlerTarget; - if (gBattleScripting.moveEffect == MOVE_EFFECT_SANDBLAST_SIDE) - gBattleStruct->wrappedMove[battler] = MOVE_SAND_TOMB; - else - gBattleStruct->wrappedMove[battler] = MOVE_FIRE_SPIN; - } - } - break; + gBattleMons[battler].volatiles.wrapped = TRUE; + if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_GRIP_CLAW) + gDisableStructs[battler].wrapTurns = (B_BINDING_TURNS >= GEN_5) ? 7 : 5; + else + gDisableStructs[battler].wrapTurns = (Random() % 2) + 4; + // The Wrap effect does not expire when the user switches, so here's some cheese. + gBattleMons[battler].volatiles.wrappedBy = gBattlerTarget; + if (moveEffect == MOVE_EFFECT_SANDBLAST_SIDE) + gBattleMons[battler].volatiles.wrappedMove = MOVE_SAND_TOMB; + else + gBattleMons[battler].volatiles.wrappedMove = MOVE_FIRE_SPIN; } - case MOVE_EFFECT_YAWN_FOE: + } + break; + } + case MOVE_EFFECT_YAWN_FOE: + { + if (gBattleMons[gBattlerTarget].volatiles.yawn == 0 + && CanBeSlept(gBattlerTarget, gBattlerTarget, GetBattlerAbility(gBattlerTarget), BLOCKED_BY_SLEEP_CLAUSE) + && RandomPercentage(RNG_G_MAX_SNOOZE, 50)) + { + gBattleMons[gBattlerTarget].volatiles.yawn = 2; + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_MoveEffectYawnSide; + } + break; + } + case MOVE_EFFECT_SPITE: + if (gLastMoves[gBattlerTarget] != MOVE_NONE + && gLastMoves[gBattlerTarget] != MOVE_UNAVAILABLE) + { + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectTryReducePP; + } + break; + case MOVE_EFFECT_PARALYZE_SIDE: + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectParalyzeSide; + break; + case MOVE_EFFECT_POISON_SIDE: + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectPoisonSide; + break; + case MOVE_EFFECT_POISON_PARALYZE_SIDE: + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectPoisonParalyzeSide; + break; + case MOVE_EFFECT_EFFECT_SPORE_SIDE: + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectEffectSporeSide; + break; + case MOVE_EFFECT_CONFUSE_PAY_DAY_SIDE: + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + u32 payday = gPaydayMoney; + gPaydayMoney += (gBattleMons[gBattlerAttacker].level * 100); + if (payday > gPaydayMoney) + gPaydayMoney = 0xFFFF; + gBattleCommunication[CURSOR_POSITION] = 1; // add "Coins scattered." message + } + // fall through + case MOVE_EFFECT_CONFUSE_SIDE: + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectConfuseSide; + break; + case MOVE_EFFECT_INFATUATE_SIDE: + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectInfatuateSide; + break; + case MOVE_EFFECT_TORMENT_SIDE: + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectTormentSide; + break; + case MOVE_EFFECT_PREVENT_ESCAPE_SIDE: + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectMeanLookSide; + break; + case MOVE_EFFECT_CRIT_PLUS_SIDE: + if (gBattleMons[gBattlerAttacker].volatiles.bonusCritStages < 3) + gBattleMons[gBattlerAttacker].volatiles.bonusCritStages++; + if (gBattleMons[BATTLE_PARTNER(gBattlerAttacker)].volatiles.bonusCritStages < 3) + gBattleMons[BATTLE_PARTNER(gBattlerAttacker)].volatiles.bonusCritStages++; + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectRaiseCritAlliesAnim; + break; + case MOVE_EFFECT_HEAL_TEAM: + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectHealOneSixthAllies; + break; + case MOVE_EFFECT_AROMATHERAPY: + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_MoveEffectAromatherapy; + break; + case MOVE_EFFECT_RECYCLE_BERRIES: + if (RandomPercentage(RNG_G_MAX_REPLENISH, 50)) + { + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_EffectRecycleBerriesAllies; + } + break; + case MOVE_EFFECT_REMOVE_STATUS: + { + u32 argStatus = GetMoveEffectArg_Status(gCurrentMove); + if ((gBattleMons[gEffectBattler].status1 & argStatus) + && (NumAffectedSpreadMoveTargets() > 1 || !IsMoveEffectBlockedByTarget(GetBattlerAbility(gEffectBattler)))) + { + gBattleMons[gEffectBattler].status1 &= ~(argStatus); + BtlController_EmitSetMonData(gEffectBattler, 0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBattler].status1); + MarkBattlerForControllerExec(gEffectBattler); + BattleScriptPush(battleScript); + + switch (argStatus) { - if (!(gStatuses3[gBattlerTarget] & STATUS3_YAWN) - && CanBeSlept(gBattlerTarget, gBattlerTarget, GetBattlerAbility(gBattlerTarget), BLOCKED_BY_SLEEP_CLAUSE) - && RandomPercentage(RNG_G_MAX_SNOOZE, 50)) - { - gStatuses3[gBattlerTarget] |= STATUS3_YAWN_TURN(2); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectYawnSuccess; - } - break; - } - case MOVE_EFFECT_SPITE: - if (gLastMoves[gBattlerTarget] != MOVE_NONE - && gLastMoves[gBattlerTarget] != MOVE_UNAVAILABLE) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectTryReducePP; - } - break; - case MOVE_EFFECT_PARALYZE_SIDE: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectParalyzeSide; - break; - case MOVE_EFFECT_POISON_SIDE: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectPoisonSide; - break; - case MOVE_EFFECT_POISON_PARALYZE_SIDE: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectPoisonParalyzeSide; + case STATUS1_PARALYSIS: + gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal; break; - case MOVE_EFFECT_EFFECT_SPORE_SIDE: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectEffectSporeSide; + case STATUS1_SLEEP: + TryDeactivateSleepClause(GetBattlerSide(gEffectBattler), gBattlerPartyIndexes[gBattlerTarget]); + gBattlescriptCurrInstr = BattleScript_TargetWokeUp; break; - case MOVE_EFFECT_CONFUSE_PAY_DAY_SIDE: - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - u32 payday = gPaydayMoney; - gPaydayMoney += (gBattleMons[gBattlerAttacker].level * 100); - if (payday > gPaydayMoney) - gPaydayMoney = 0xFFFF; - gBattleCommunication[CURSOR_POSITION] = 1; // add "Coins scattered." message - } - // fall through - case MOVE_EFFECT_CONFUSE_SIDE: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectConfuseSide; - break; - case MOVE_EFFECT_INFATUATE_SIDE: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectInfatuateSide; - break; - case MOVE_EFFECT_TORMENT_SIDE: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectTormentSide; + case STATUS1_BURN: + gBattlescriptCurrInstr = BattleScript_TargetBurnHeal; break; - case MOVE_EFFECT_PREVENT_ESCAPE_SIDE: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectMeanLookSide; - break; - case MOVE_EFFECT_CRIT_PLUS_SIDE: - gBattleStruct->bonusCritStages[gBattlerAttacker]++; - gBattleStruct->bonusCritStages[BATTLE_PARTNER(gBattlerAttacker)]++; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRaiseCritAlliesAnim; - break; - case MOVE_EFFECT_HEAL_TEAM: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectHealOneSixthAllies; - break; - case MOVE_EFFECT_AROMATHERAPY: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectHealBell_FromHeal; + case STATUS1_FREEZE: + gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove; break; - case MOVE_EFFECT_RECYCLE_BERRIES: - { - if (RandomPercentage(RNG_G_MAX_REPLENISH, 50)) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRecycleBerriesAllies; - } + case STATUS1_FROSTBITE: + gBattlescriptCurrInstr = BattleScript_FrostbiteHealedViaFireMove; break; - } - case MOVE_EFFECT_REMOVE_STATUS: - { - u32 argStatus = GetMoveEffectArg_Status(gCurrentMove); - if ((gBattleMons[gEffectBattler].status1 & argStatus) - && (NumAffectedSpreadMoveTargets() > 1 || !IsMoveEffectBlockedByTarget(GetBattlerAbility(gEffectBattler)))) - { - gBattleMons[gEffectBattler].status1 &= ~(argStatus); - BtlController_EmitSetMonData(gEffectBattler, 0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBattler].status1); - MarkBattlerForControllerExec(gEffectBattler); - BattleScriptPush(gBattlescriptCurrInstr + 1); - - switch (argStatus) - { - case STATUS1_PARALYSIS: - gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal; - break; - case STATUS1_SLEEP: - TryDeactivateSleepClause(GetBattlerSide(gEffectBattler), gBattlerPartyIndexes[gBattlerTarget]); - gBattlescriptCurrInstr = BattleScript_TargetWokeUp; - break; - case STATUS1_BURN: - gBattlescriptCurrInstr = BattleScript_TargetBurnHeal; - break; - case STATUS1_FREEZE: - gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove; - break; - case STATUS1_FROSTBITE: - gBattlescriptCurrInstr = BattleScript_FrostbiteHealedViaFireMove; - break; - case STATUS1_POISON: - case STATUS1_TOXIC_POISON: - case STATUS1_PSN_ANY: - gBattlescriptCurrInstr = BattleScript_TargetPoisonHealed; - break; - } - } + case STATUS1_POISON: + case STATUS1_TOXIC_POISON: + case STATUS1_PSN_ANY: + gBattlescriptCurrInstr = BattleScript_TargetPoisonHealed; break; } - } } + break; + } + default: + break; } - gBattleScripting.moveEffect = 0; + gBattleScripting.moveEffect = MOVE_EFFECT_NONE; } static bool32 CanApplyAdditionalEffect(const struct AdditionalEffect *additionalEffect) { + // If Toxic Chain will activate it blocks all other non volatile effects + if (gBattleStruct->toxicChainPriority && additionalEffect->moveEffect <= MOVE_EFFECT_FROSTBITE) + return FALSE; + if (additionalEffect->self && NumAffectedSpreadMoveTargets() > 1 && GetNextTarget(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove), TRUE) != MAX_BATTLERS_COUNT) @@ -4508,6 +4140,20 @@ static bool32 CanApplyAdditionalEffect(const struct AdditionalEffect *additional return TRUE; } +static void SetToxicChainPriority(void) +{ + if (gBattleStruct->toxicChainPriority) + return; + + enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); + if (abilityAtk == ABILITY_TOXIC_CHAIN + && IsBattlerAlive(gBattlerTarget) + && CanBePoisoned(gBattlerAttacker, gBattlerTarget, abilityAtk, GetBattlerAbility(gBattlerTarget)) + && IsBattlerTurnDamaged(gBattlerTarget) + && RandomWeighted(RNG_TOXIC_CHAIN, 7, 3)) + gBattleStruct->toxicChainPriority = TRUE; +} + static void Cmd_setadditionaleffects(void) { CMD_ARGS(); @@ -4515,6 +4161,7 @@ static void Cmd_setadditionaleffects(void) if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) { u32 numAdditionalEffects = GetMoveAdditionalEffectCount(gCurrentMove); + SetToxicChainPriority(); if (numAdditionalEffects > gBattleStruct->additionalEffectsCounter) { u32 percentChance; @@ -4529,11 +4176,18 @@ static void Cmd_setadditionaleffects(void) // Activate effect if it's primary (chance == 0) or if RNGesus says so if ((percentChance == 0) || RandomPercentage(RNG_SECONDARY_EFFECT + gBattleStruct->additionalEffectsCounter, percentChance)) { - gBattleScripting.moveEffect = additionalEffect->moveEffect | (MOVE_EFFECT_AFFECTS_USER * (additionalEffect->self)); + gBattleCommunication[MULTISTRING_CHOOSER] = *((u8 *) &additionalEffect->multistring); + + enum SetMoveEffectFlags flags = NO_FLAGS; + if (percentChance == 0) flags |= EFFECT_PRIMARY; + if (percentChance >= 100) flags |= EFFECT_CERTAIN; SetMoveEffect( - percentChance == 0, // a primary effect - percentChance >= 100 // certain to happen + gBattlerAttacker, + additionalEffect->self ? gBattlerAttacker : gBattlerTarget, + additionalEffect->moveEffect, + cmd->nextInstr, + flags ); } } @@ -4560,48 +4214,43 @@ static void Cmd_setadditionaleffects(void) gBattleScripting.moveEffect = 0; gBattlescriptCurrInstr = cmd->nextInstr; } - - gBattleScripting.multihitMoveEffect = 0; } static void Cmd_seteffectprimary(void) { - CMD_ARGS(); + CMD_ARGS(u8 battler, u8 effectBattler); - SetMoveEffect(TRUE, FALSE); + u32 battler = GetBattlerForBattleScript(cmd->battler); + u32 effectBattler = GetBattlerForBattleScript(cmd->effectBattler); + SetMoveEffect(battler, effectBattler, gBattleScripting.moveEffect, cmd->nextInstr, EFFECT_PRIMARY); } static void Cmd_seteffectsecondary(void) { - CMD_ARGS(); + CMD_ARGS(u8 battler, u8 effectBattler); - SetMoveEffect(FALSE, FALSE); + u32 battler = GetBattlerForBattleScript(cmd->battler); + u32 effectBattler = GetBattlerForBattleScript(cmd->effectBattler); + SetMoveEffect(battler, effectBattler, gBattleScripting.moveEffect, cmd->nextInstr, EFFECT_PRIMARY); } -static void Cmd_clearstatusfromeffect(void) +static void Cmd_clearvolatile(void) { - CMD_ARGS(u8 battler); + CMD_ARGS(u8 battler, u8 _volatile); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (gBattleScripting.moveEffect <= PRIMARY_STATUS_MOVE_EFFECT) - gBattleMons[battler].status1 &= (~sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]); - else - { - gBattleMons[battler].status2 &= (~sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]); - if (gBattleScripting.moveEffect == MOVE_EFFECT_CHARGING) - gProtectStructs[battler].chargingTurn = FALSE; - } + SetMonVolatile(battler, cmd->_volatile, 0); + if (cmd->_volatile == VOLATILE_MULTIPLETURNS) + gProtectStructs[battler].chargingTurn = FALSE; - gBattleScripting.moveEffect = 0; gBattlescriptCurrInstr = cmd->nextInstr; - gBattleScripting.multihitMoveEffect = 0; } static void Cmd_tryfaintmon(void) { CMD_ARGS(u8 battler, bool8 isSpikes, const u8 *instr); - u32 battler, destinyBondBattler; + u32 battler; const u8 *faintScript; battler = GetBattlerForBattleScript(cmd->battler); @@ -4619,25 +4268,24 @@ static void Cmd_tryfaintmon(void) } else { - if (gBattleMons[battler].ability == ABILITY_NEUTRALIZING_GAS + if (gDisableStructs[battler].neutralizingGas && !(gAbsentBattlerFlags & (1u << battler)) && !IsBattlerAlive(battler)) { - gBattleMons[battler].ability = ABILITY_NONE; - BattleScriptPush(gBattlescriptCurrInstr); - gBattlescriptCurrInstr = BattleScript_NeutralizingGasExits; - return; + gDisableStructs[battler].neutralizingGas = FALSE; + if (!IsNeutralizingGasOnField()) + { + BattleScriptPush(gBattlescriptCurrInstr); + gBattlescriptCurrInstr = BattleScript_NeutralizingGasExits; + return; + } } + if (cmd->battler == BS_ATTACKER) - { - destinyBondBattler = gBattlerTarget; - faintScript = BattleScript_FaintAttacker; - } - else - { - destinyBondBattler = gBattlerAttacker; - faintScript = BattleScript_FaintTarget; - } + TryUpdateEvolutionTracker(IF_DEFEAT_X_WITH_ITEMS, 1, MOVE_NONE); + + gBattlerFainted = battler; + faintScript = BattleScript_FaintBattler; if (!(gAbsentBattlerFlags & (1u << battler)) && !IsBattlerAlive(battler)) { @@ -4659,30 +4307,11 @@ static void Cmd_tryfaintmon(void) gBattleResults.lastOpponentSpecies = GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES, NULL); gSideTimers[B_SIDE_OPPONENT].retaliateTimer = 2; } - if ((gHitMarker & HITMARKER_DESTINYBOND) && IsBattlerAlive(gBattlerAttacker) - && !(GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX)) - { - gHitMarker &= ~HITMARKER_DESTINYBOND; - BattleScriptPush(gBattlescriptCurrInstr); - gBattleStruct->moveDamage[destinyBondBattler] = gBattleMons[destinyBondBattler].hp; - gBattlescriptCurrInstr = BattleScript_DestinyBondTakesLife; - } - if ((gStatuses3[gBattlerTarget] & STATUS3_GRUDGE) - && !(gHitMarker & HITMARKER_GRUDGE) - && !IsBattlerAlly(gBattlerAttacker, gBattlerTarget) - && IsBattlerAlive(gBattlerAttacker) - && gCurrentMove != MOVE_STRUGGLE) - { - u8 moveIndex = gBattleStruct->chosenMovePositions[gBattlerAttacker]; - - gBattleMons[gBattlerAttacker].pp[moveIndex] = 0; - BattleScriptPush(gBattlescriptCurrInstr); - gBattlescriptCurrInstr = BattleScript_GrudgeTakesPp; - BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, moveIndex + REQUEST_PPMOVE1_BATTLE, 0, sizeof(gBattleMons[gBattlerAttacker].pp[moveIndex]), &gBattleMons[gBattlerAttacker].pp[moveIndex]); - MarkBattlerForControllerExec(gBattlerAttacker); - PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].moves[moveIndex]) - } + if (gBattleMons[gBattlerTarget].volatiles.destinyBond) + gBattleStruct->tryDestinyBond = TRUE; + if (gBattleMons[gBattlerTarget].volatiles.grudge) + gBattleStruct->tryGrudge = TRUE; TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); } @@ -4704,10 +4333,9 @@ static void Cmd_dofaintanimation(void) if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX) { - BattleScriptPushCursor(); UndoDynamax(battler); gBattleScripting.battler = battler; - gBattlescriptCurrInstr = BattleScript_DynamaxEnds_Ret; + BattleScriptCall(BattleScript_DynamaxEnds_Ret); return; } @@ -4753,15 +4381,14 @@ static void Cmd_jumpifstatus(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_jumpifstatus2(void) +static void Cmd_jumpifvolatile(void) { - CMD_ARGS(u8 battler, u32 flags, const u8 *jumpInstr); + CMD_ARGS(u8 battler, u8 _volatile, const u8 *jumpInstr); u8 battler = GetBattlerForBattleScript(cmd->battler); - u32 flags = cmd->flags; const u8 *jumpInstr = cmd->jumpInstr; - if (gBattleMons[battler].status2 & flags && IsBattlerAlive(battler)) + if (GetBattlerVolatile(battler, cmd->_volatile) != 0 && IsBattlerAlive(battler)) gBattlescriptCurrInstr = jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; @@ -4769,11 +4396,11 @@ static void Cmd_jumpifstatus2(void) static void Cmd_jumpifability(void) { - CMD_ARGS(u8 battler, u16 ability, const u8 *jumpInstr); + CMD_ARGS(u8 battler, enum Ability ability, const u8 *jumpInstr); u32 battler; bool32 hasAbility = FALSE; - u32 ability = cmd->ability; + enum Ability ability = cmd->ability; switch (cmd->battler) { @@ -4835,7 +4462,7 @@ static void Cmd_jumpifstat(void) u8 value = cmd->value; u8 comparison = cmd->comparison; - ret = CompareStat(battler, stat, value, comparison); + ret = CompareStat(battler, stat, value, comparison, GetBattlerAbility(battler)); if (ret) gBattlescriptCurrInstr = cmd->jumpInstr; @@ -4843,25 +4470,22 @@ static void Cmd_jumpifstat(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_jumpifstatus3condition(void) +static void Cmd_jumpifstatignorecontrary(void) { - CMD_ARGS(u8 battler, u32 flags, bool8 jumpIfTrue, const u8 *jumpInstr); + CMD_ARGS(u8 battler, u8 comparison, u8 stat, u8 value, const u8 *jumpInstr); - u32 battler = GetBattlerForBattleScript(cmd->battler); - if (cmd->jumpIfTrue) - { - if ((gStatuses3[battler] & cmd->flags) != 0) - gBattlescriptCurrInstr = cmd->nextInstr; - else - gBattlescriptCurrInstr = cmd->jumpInstr; - } + bool32 ret = 0; + u8 battler = GetBattlerForBattleScript(cmd->battler); + u8 stat = cmd->stat; + u8 value = cmd->value; + u8 comparison = cmd->comparison; + + ret = CompareStat(battler, stat, value, comparison, ABILITY_NONE); + + if (ret) + gBattlescriptCurrInstr = cmd->jumpInstr; else - { - if ((gStatuses3[battler] & cmd->flags) != 0) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - } + gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_jumpbasedontype(void) @@ -4911,7 +4535,7 @@ static bool32 BattleTypeAllowsExp(void) static u32 GetMonHoldEffect(struct Pokemon *mon) { - enum ItemHoldEffect holdEffect; + enum HoldEffect holdEffect; u32 item = GetMonData(mon, MON_DATA_HELD_ITEM); if (item == ITEM_ENIGMA_BERRY_E_READER) @@ -4930,7 +4554,7 @@ static void Cmd_getexp(void) { CMD_ARGS(u8 battler); - enum ItemHoldEffect holdEffect; + enum HoldEffect holdEffect; s32 i; // also used as stringId u8 *expMonId = &gBattleStruct->expGetterMonId; u32 currLvl; @@ -5059,7 +4683,7 @@ static void Cmd_getexp(void) if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) && (gBattleMons[0].hp || (IsDoubleBattle() && gBattleMons[2].hp)) && !IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) - && !IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)) + && (!IsDoubleBattle() || !IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))) && !gBattleStruct->wildVictorySong) { BattleStopLowHpSound(); @@ -5084,7 +4708,7 @@ static void Cmd_getexp(void) if (B_EXP_CAP_TYPE == EXP_CAP_HARD && gBattleStruct->battlerExpReward != 0) { - u32 growthRate = gSpeciesInfo[GetMonData(&gPlayerParty[*expMonId], MON_DATA_SPECIES)].growthRate; + enum GrowthRate growthRate = gSpeciesInfo[GetMonData(&gPlayerParty[*expMonId], MON_DATA_SPECIES)].growthRate; u32 currentExp = GetMonData(&gPlayerParty[*expMonId], MON_DATA_EXP); u32 levelCap = GetCurrentLevelCap(); @@ -5179,9 +4803,8 @@ static void Cmd_getexp(void) PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, expBattler, *expMonId); PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 3, GetMonData(&gPlayerParty[*expMonId], MON_DATA_LEVEL)); - BattleScriptPushCursor(); gLeveledUpInBattle |= 1 << *expMonId; - gBattlescriptCurrInstr = BattleScript_LevelUp; + BattleScriptCall(BattleScript_LevelUp); gBattleStruct->battlerExpReward = T1_READ_32(&gBattleResources->bufferB[expBattler][2]); AdjustFriendship(&gPlayerParty[*expMonId], FRIENDSHIP_EVENT_GROW_LEVEL); @@ -5193,8 +4816,16 @@ static void Cmd_getexp(void) if (battler != 0xFF) { - CopyMonLevelAndBaseStatsToBattleMon(battler, &gPlayerParty[*expMonId]); - if (gStatuses3[battler] & STATUS3_POWER_TRICK) + if (gBattleMons[battler].volatiles.transformed) + { + gBattleMons[battler].level = GetMonData(&gPlayerParty[*expMonId], MON_DATA_LEVEL); + gBattleMons[battler].hp = GetMonData(&gPlayerParty[*expMonId], MON_DATA_HP); + } + else + { + CopyMonLevelAndBaseStatsToBattleMon(battler, &gPlayerParty[*expMonId]); + } + if (gBattleMons[battler].volatiles.powerTrick) SWAP(gBattleMons[battler].attack, gBattleMons[battler].defense, temp); } @@ -5232,8 +4863,6 @@ static void Cmd_getexp(void) // not sure why gf clears the item and ability here gBattleStruct->expOrderId = 0; gBattleStruct->teamGotExpMsgPrinted = FALSE; - gBattleMons[gBattlerFainted].item = ITEM_NONE; - gBattleMons[gBattlerFainted].ability = ABILITY_NONE; gBattlescriptCurrInstr = cmd->nextInstr; } break; @@ -5279,22 +4908,20 @@ bool32 NoAliveMonsForPlayer(void) { HP_count += GetMonData(&gPlayerParty[i], MON_DATA_HP); } - // Get the number of fainted mons or eggs (not empty slots) in the first three party slots. if (i < 3 && ((GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_HP)) || GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))) ineligibleMonsCount++; } - // Get the number of inelligible slots in the saved player party. if (B_MULTI_BATTLE_WHITEOUT > GEN_3 && gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER) - && !(gBattleTypeFlags & BATTLE_TYPE_ARENA)) + && !(gBattleTypeFlags & BATTLE_TYPE_ARENA) && !(IsMultibattleTest())) // Multibattle tests appear to not save the player party data for the check below. { for (i = 0; i < PARTY_SIZE; i++) { - if (!GetMonData(&gSaveBlock1Ptr->playerParty[i], MON_DATA_SPECIES) - || !GetMonData(&gSaveBlock1Ptr->playerParty[i], MON_DATA_HP) - || GetMonData(&gSaveBlock1Ptr->playerParty[i], MON_DATA_IS_EGG)) + if (!GetMonData(GetSavedPlayerPartyMon(i), MON_DATA_SPECIES) + || !GetMonData(GetSavedPlayerPartyMon(i), MON_DATA_HP) + || GetMonData(GetSavedPlayerPartyMon(i), MON_DATA_IS_EGG)) ineligibleMonsCount++; } @@ -5341,7 +4968,6 @@ static void Cmd_checkteamslost(void) if (NoAliveMonsForPlayer()) gBattleOutcome |= B_OUTCOME_LOST; - if (NoAliveMonsForOpponent()) gBattleOutcome |= B_OUTCOME_WON; @@ -5356,14 +4982,14 @@ static void Cmd_checkteamslost(void) for (emptyPlayerSpots = 0, i = 0; i < gBattlersCount; i += 2) { - if ((gHitMarker & HITMARKER_FAINTED2(i)) && (!gSpecialStatuses[i].faintedHasReplacement)) + if ((gHitMarker & HITMARKER_FAINTED(i)) && (!gSpecialStatuses[i].faintedHasReplacement)) emptyPlayerSpots++; } emptyOpponentSpots = 0; for (i = 1; i < gBattlersCount; i += 2) { - if ((gHitMarker & HITMARKER_FAINTED2(i)) && (!gSpecialStatuses[i].faintedHasReplacement)) + if ((gHitMarker & HITMARKER_FAINTED(i)) && (!gSpecialStatuses[i].faintedHasReplacement)) emptyOpponentSpots++; } @@ -5395,11 +5021,11 @@ static void Cmd_checkteamslost(void) static void MoveValuesCleanUp(void) { - gBattleScripting.moveEffect = 0; + gBattleScripting.moveEffect = MOVE_EFFECT_NONE; + gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_NONE; gBattleCommunication[MISS_TYPE] = 0; - if (!gMultiHitCounter) - gHitMarker &= ~HITMARKER_DESTINYBOND; - gHitMarker &= ~HITMARKER_SYNCHRONIZE_EFFECT; + gBattleStruct->tryDestinyBond = FALSE; + gBattleStruct->tryGrudge = FALSE; } static void Cmd_movevaluescleanup(void) @@ -5749,21 +5375,29 @@ static void Cmd_waitstate(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_absorb(void) +static void Cmd_isdmgblockedbydisguise(void) { - CMD_ARGS(u8 battler); + CMD_ARGS(); - if (gBattleControllerExecFlags) + if (!IsMimikyuDisguised(gBattlerAttacker) + || gBattleMons[gBattlerAttacker].volatiles.transformed + || !IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_DISGUISE)) + { + gBattlescriptCurrInstr = cmd->nextInstr; return; + } - u32 battler = GetBattlerForBattleScript(cmd->battler); - BtlController_EmitHealthBarUpdate(battler, B_COMM_TO_CONTROLLER, gBattleStruct->moveDamage[battler]); - MarkBattlerForControllerExec(battler); - - if (IsOnPlayerSide(battler) && gBattleStruct->moveDamage[battler] > 0) - gBattleResults.playerMonWasDamaged = TRUE; - - gBattlescriptCurrInstr = cmd->nextInstr; + gBattleScripting.battler = gBattlerAttacker; + if (GetBattlerPartyState(gBattlerAttacker)->changedSpecies == SPECIES_NONE) + GetBattlerPartyState(gBattlerAttacker)->changedSpecies = gBattleMons[gBattlerAttacker].species; + if (gBattleMons[gBattlerAttacker].species == SPECIES_MIMIKYU_TOTEM_DISGUISED) + gBattleMons[gBattlerAttacker].species = SPECIES_MIMIKYU_BUSTED_TOTEM; + else + gBattleMons[gBattlerAttacker].species = SPECIES_MIMIKYU_BUSTED; + if (GetConfig(CONFIG_DISGUISE_HP_LOSS) >= GEN_8) + SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 8); + BattleScriptPush(BattleScript_MoveEnd); + gBattlescriptCurrInstr = BattleScript_TargetFormChange; } static void Cmd_return(void) @@ -5812,18 +5446,15 @@ static void Cmd_setroost(void) CMD_ARGS(); gDisableStructs[gBattlerAttacker].roostActive = TRUE; - gBattleStruct->roostTypes[gBattlerAttacker][0] = gBattleMons[gBattlerAttacker].types[0]; - gBattleStruct->roostTypes[gBattlerAttacker][1] = gBattleMons[gBattlerAttacker].types[1]; - gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_jumpifabilitypresent(void) { - CMD_ARGS(u16 ability, const u8 *jumpInstr); + CMD_ARGS(enum Ability ability, const u8 *jumpInstr); - u16 ability = cmd->ability; - u32 abilityBattler = IsAbilityOnField(ability); + enum Ability ability = cmd->ability; + enum Ability abilityBattler = IsAbilityOnField(ability); if (abilityBattler) { gBattlerAbility = abilityBattler - 1; @@ -5838,8 +5469,7 @@ static void Cmd_jumpifabilitypresent(void) static void Cmd_endselectionscript(void) { CMD_ARGS(); - - *(gBattlerAttacker + gBattleStruct->selectionScriptFinished) = TRUE; + gBattleStruct->battlerState[gBattlerAttacker].selectionScriptFinished = TRUE; } static void PlayAnimation(u32 battler, u8 animId, const u16 *argPtr, const u8 *nextInstr) @@ -5882,7 +5512,7 @@ static void PlayAnimation(u32 battler, u8 animId, const u16 *argPtr, const u8 *n MarkBattlerForControllerExec(battler); gBattlescriptCurrInstr = nextInstr; } - else if (gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE) + else if (IsSemiInvulnerable(battler, CHECK_ALL)) { gBattlescriptCurrInstr = nextInstr; } @@ -5911,220 +5541,41 @@ static void Cmd_playanimation_var(void) PlayAnimation(battler, *(cmd->animIdPtr), cmd->argPtr, cmd->nextInstr); } -static void Cmd_setgraphicalstatchangevalues(void) +static void Cmd_jumpfifsemiinvulnerable(void) { - CMD_ARGS(); - - u8 value = GET_STAT_BUFF_VALUE_WITH_SIGN(gBattleScripting.statChanger); + CMD_ARGS(u8 battler, u8 state, const u8 *jumpInstr); + u32 battler = GetBattlerForBattleScript(cmd->battler); - switch (value) - { - case SET_STAT_BUFF_VALUE(1): // +1 - value = STAT_ANIM_PLUS1 + 1; - break; - case SET_STAT_BUFF_VALUE(2): // +2 - value = STAT_ANIM_PLUS2 + 1; - break; - case SET_STAT_BUFF_VALUE(3): // +3 - value = STAT_ANIM_PLUS2 + 1; - break; - case SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE: // -1 - value = STAT_ANIM_MINUS1 + 1; - break; - case SET_STAT_BUFF_VALUE(2) | STAT_BUFF_NEGATIVE: // -2 - value = STAT_ANIM_MINUS2 + 1; - break; - case SET_STAT_BUFF_VALUE(3) | STAT_BUFF_NEGATIVE: // -3 - value = STAT_ANIM_MINUS2 + 1; - break; - default: // <-12,-4> and <4, 12> - if (value & STAT_BUFF_NEGATIVE) - value = STAT_ANIM_MINUS2 + 1; - else - value = STAT_ANIM_PLUS2 + 1; - break; - } - gBattleScripting.animArg1 = GET_STAT_BUFF_ID(gBattleScripting.statChanger) + value - 1; - gBattleScripting.animArg2 = 0; - gBattlescriptCurrInstr = cmd->nextInstr; + if (gBattleMons[battler].volatiles.semiInvulnerable == cmd->state) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_playstatchangeanimation(void) +static void Cmd_unused_0x48(void) { - CMD_ARGS(u8 battler, u8 stats, u8 flags); +} - u32 currStat = 0; - u32 statAnimId = 0; - u32 changeableStatsCount = 0; - u32 startingStatAnimId = 0; - u32 flags = cmd->flags; - u32 battler = GetBattlerForBattleScript(cmd->battler); - u32 ability = GetBattlerAbility(battler); - u32 stats = cmd->stats; - - // Handle Contrary and Simple - if (ability == ABILITY_CONTRARY) - { - flags ^= STAT_CHANGE_NEGATIVE; - RecordAbilityBattle(battler, ability); - } - else if (ability == ABILITY_SIMPLE) - { - flags |= STAT_CHANGE_BY_TWO; - RecordAbilityBattle(battler, ability); - } - - if (flags & STAT_CHANGE_NEGATIVE) // goes down - { - if (flags & STAT_CHANGE_BY_TWO) - startingStatAnimId = STAT_ANIM_MINUS2; - else - startingStatAnimId = STAT_ANIM_MINUS1; - - while (stats != 0) - { - if (stats & 1) - { - if (flags & STAT_CHANGE_CANT_PREVENT) - { - if (gBattleMons[battler].statStages[currStat] > MIN_STAT_STAGE) - { - statAnimId = startingStatAnimId + currStat; - changeableStatsCount++; - } - } - else if (!gSideTimers[GetBattlerSide(battler)].mistTimer - && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_CLEAR_AMULET - && ability != ABILITY_CLEAR_BODY - && ability != ABILITY_FULL_METAL_BODY - && ability != ABILITY_WHITE_SMOKE - && !((ability == ABILITY_KEEN_EYE || ability == ABILITY_MINDS_EYE) && currStat == STAT_ACC) - && !(B_ILLUMINATE_EFFECT >= GEN_9 && ability == ABILITY_ILLUMINATE && currStat == STAT_ACC) - && !(ability == ABILITY_HYPER_CUTTER && currStat == STAT_ATK) - && !(ability == ABILITY_BIG_PECKS && currStat == STAT_DEF)) - { - if (gBattleMons[battler].statStages[currStat] > MIN_STAT_STAGE) - { - statAnimId = startingStatAnimId + currStat; - changeableStatsCount++; - } - } - } - stats >>= 1, currStat++; - } - - if (changeableStatsCount > 1) // more than one stat, so the color is gray - { - if (flags & STAT_CHANGE_BY_TWO) - statAnimId = STAT_ANIM_MULTIPLE_MINUS2; - else - statAnimId = STAT_ANIM_MULTIPLE_MINUS1; - } - } - else // goes up - { - if (flags & STAT_CHANGE_BY_TWO) - startingStatAnimId = STAT_ANIM_PLUS2; - else - startingStatAnimId = STAT_ANIM_PLUS1; - - while (stats != 0) - { - if (stats & 1 && gBattleMons[battler].statStages[currStat] < MAX_STAT_STAGE) - { - statAnimId = startingStatAnimId + currStat; - changeableStatsCount++; - } - stats >>= 1, currStat++; - } - - if (changeableStatsCount > 1) // more than one stat, so the color is gray - { - if (flags & STAT_CHANGE_BY_TWO) - statAnimId = STAT_ANIM_MULTIPLE_PLUS2; - else - statAnimId = STAT_ANIM_MULTIPLE_PLUS1; - } - } - - if (flags & STAT_CHANGE_MULTIPLE_STATS && changeableStatsCount < 2) - { - gBattlescriptCurrInstr = cmd->nextInstr; - } - else if (changeableStatsCount != 0 && !gBattleScripting.statAnimPlayed) - { - BtlController_EmitBattleAnimation(battler, B_COMM_TO_CONTROLLER, B_ANIM_STATS_CHANGE, &gDisableStructs[battler], statAnimId); - MarkBattlerForControllerExec(battler); - if (flags & STAT_CHANGE_MULTIPLE_STATS && changeableStatsCount > 1) - gBattleScripting.statAnimPlayed = TRUE; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->nextInstr; - } -} - -static bool32 TryKnockOffBattleScript(u32 battlerDef) -{ - if (gBattleMons[battlerDef].item != 0 - && CanBattlerGetOrLoseItem(battlerDef, gBattleMons[battlerDef].item) - && !NoAliveMonsForEitherParty()) - { - if (GetBattlerAbility(battlerDef) == ABILITY_STICKY_HOLD && IsBattlerAlive(battlerDef)) - { - gBattlerAbility = battlerDef; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_StickyHoldActivates; - } - else - { - u32 side = GetBattlerSide(battlerDef); - - gLastUsedItem = gBattleMons[battlerDef].item; - gBattleMons[battlerDef].item = 0; - if (gBattleMons[battlerDef].ability != ABILITY_GORILLA_TACTICS) - gBattleStruct->choicedMove[battlerDef] = 0; - CheckSetUnburden(battlerDef); - - // In Gen 5+, Knock Off removes the target's item rather than rendering it unusable. - if (B_KNOCK_OFF_REMOVAL >= GEN_5) - { - BtlController_EmitSetMonData(battlerDef, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[battlerDef].item), &gBattleMons[battlerDef].item); - MarkBattlerForControllerExec(battlerDef); - } - else - { - gWishFutureKnock.knockedOffMons[side] |= 1u << gBattlerPartyIndexes[battlerDef]; - } - - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_KnockedOff; - } - return TRUE; - } - return FALSE; -} - -static inline bool32 TryTriggerSymbiosis(u32 battler, u32 ally) -{ - return GetBattlerAbility(ally) == ABILITY_SYMBIOSIS - && gBattleMons[battler].item == ITEM_NONE - && gBattleMons[ally].item != ITEM_NONE - && CanBattlerGetOrLoseItem(battler, gBattleMons[ally].item) - && CanBattlerGetOrLoseItem(ally, gBattleMons[ally].item) - && IsBattlerAlive(battler) - && IsBattlerAlive(ally); -} +static inline bool32 TryTriggerSymbiosis(u32 battler, u32 ally) +{ + return GetBattlerAbility(ally) == ABILITY_SYMBIOSIS + && gBattleMons[battler].item == ITEM_NONE + && gBattleMons[ally].item != ITEM_NONE + && CanBattlerGetOrLoseItem(battler, gBattleMons[ally].item) + && CanBattlerGetOrLoseItem(ally, gBattleMons[ally].item) + && IsBattlerAlive(battler) + && IsBattlerAlive(ally); +} static u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent) { u32 battler; for (battler = 0; battler < MAX_BATTLERS_COUNT; battler++) { - if (battler != gBattlerAttacker - && !(excludeCurrent && battler == gBattlerTarget) - && IsBattlerAlive(battler) + if (battler == gBattlerAttacker || !IsBattlerAlive(battler)) + continue; + + if (!(excludeCurrent && battler == gBattlerTarget) && !gBattleStruct->battlerState[gBattlerAttacker].targetsDone[battler] && (!IsBattlerAlly(battler, gBattlerAttacker) || moveTarget == MOVE_TARGET_FOES_AND_ALLY)) break; @@ -6132,7 +5583,7 @@ static u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent) return battler; } -static inline bool32 IsProtectivePadsProtected(u32 battler, enum ItemHoldEffect holdEffect) +static inline bool32 IsProtectivePadsProtected(u32 battler, enum HoldEffect holdEffect) { if (holdEffect != HOLD_EFFECT_PROTECTIVE_PADS) return FALSE; @@ -6141,31 +5592,9 @@ static inline bool32 IsProtectivePadsProtected(u32 battler, enum ItemHoldEffect return TRUE; } -static inline bool32 IsProtectEffectAffected(u32 battler, u32 move) -{ - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); - if (IsProtectivePadsProtected(battler, holdEffect)) - return TRUE; - - if (holdEffect == HOLD_EFFECT_CLEAR_AMULET) - { - RecordItemEffectBattle(battler, holdEffect); - return TRUE; - } - - u32 ability = GetBattlerAbility(gBattlerAttacker); - if (CanAbilityPreventStatLoss(ability)) - { - RecordAbilityBattle(battler, ability); - return TRUE; - } - - return FALSE; -} - static inline bool32 CanEjectButtonTrigger(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects moveEffect) { - if (GetBattlerHoldEffect(battlerDef, TRUE) == HOLD_EFFECT_EJECT_BUTTON + if (GetBattlerHoldEffect(battlerDef) == HOLD_EFFECT_EJECT_BUTTON && battlerAtk != battlerDef && IsBattlerTurnDamaged(battlerDef) && IsBattlerAlive(battlerDef) @@ -6178,8 +5607,8 @@ static inline bool32 CanEjectButtonTrigger(u32 battlerAtk, u32 battlerDef, enum static inline bool32 CanEjectPackTrigger(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects moveEffect) { - if (gProtectStructs[battlerDef].statFell - && GetBattlerHoldEffect(battlerDef, TRUE) == HOLD_EFFECT_EJECT_PACK + if (gDisableStructs[battlerDef].tryEjectPack + && GetBattlerHoldEffect(battlerDef) == HOLD_EFFECT_EJECT_PACK && IsBattlerAlive(battlerDef) && CountUsablePartyMons(battlerDef) > 0 && !gProtectStructs[battlerDef].disableEjectPack @@ -6193,28 +5622,59 @@ static inline bool32 CanEjectPackTrigger(u32 battlerAtk, u32 battlerDef, enum Ba static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move) { bool32 effect = FALSE; - u32 abilityAtk = GetBattlerAbility(battlerAtk); + enum Ability abilityAtk = GetBattlerAbility(battlerAtk); switch (abilityAtk) { case ABILITY_MAGICIAN: - if (move != MOVE_FLING && move != MOVE_NATURAL_GIFT + if (GetMoveEffect(move) != EFFECT_FLING + && GetMoveEffect(move) != EFFECT_NATURAL_GIFT && gBattleMons[battlerAtk].item == ITEM_NONE - && gBattleMons[battlerDef].item != ITEM_NONE && IsBattlerAlive(battlerAtk) - && IsBattlerTurnDamaged(battlerDef) - && CanStealItem(battlerAtk, battlerDef, gBattleMons[battlerDef].item) - && !gSpecialStatuses[battlerAtk].gemBoost // In base game, gems are consumed after magician would activate. - && !(gWishFutureKnock.knockedOffMons[GetBattlerSide(battlerDef)] & (1u << gBattlerPartyIndexes[battlerDef])) - && !DoesSubstituteBlockMove(battlerAtk, battlerDef, move) - && (GetBattlerAbility(battlerDef) != ABILITY_STICKY_HOLD || !IsBattlerAlive(battlerDef))) - { - StealTargetItem(battlerAtk, battlerDef); - gBattleScripting.battler = gBattlerAbility = battlerAtk; - gEffectBattler = battlerDef; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MagicianActivates; - effect = TRUE; + && !gSpecialStatuses[battlerAtk].gemBoost) // In base game, gems are consumed after magician would activate. + { + u32 numMagicianTargets = 0; + u32 magicianTargets = 0; + + for (u32 i = 0; i < gBattlersCount; i++) + { + if (gBattleMons[i].item != ITEM_NONE + && i != battlerAtk + && IsBattlerTurnDamaged(i) + && CanStealItem(battlerAtk, i, gBattleMons[i].item) + && !(gWishFutureKnock.knockedOffMons[GetBattlerSide(i)] & (1u << gBattlerPartyIndexes[i])) + && !DoesSubstituteBlockMove(battlerAtk, i, move) + && (GetBattlerAbility(i) != ABILITY_STICKY_HOLD || !IsBattlerAlive(i))) + { + magicianTargets |= 1u << i; + numMagicianTargets++; + } + } + + if (numMagicianTargets == 0) + { + effect = FALSE; + break; + } + + u8 battlers[4] = {0, 1, 2, 3}; + if (numMagicianTargets > 1) + SortBattlersBySpeed(battlers, FALSE); + + for (u32 i = 0; i < gBattlersCount; i++) + { + u32 battler = battlers[i]; + + if (!(magicianTargets & 1u << battler)) + continue; + + StealTargetItem(battlerAtk, battler); + gBattlerAbility = battlerAtk; + gEffectBattler = battler; + BattleScriptCall(BattleScript_MagicianActivates); + effect = TRUE; + break; // found target to steal from + } } break; case ABILITY_MOXIE: @@ -6227,7 +5687,7 @@ static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move if (!IsBattlerAlive(battlerAtk) || NoAliveMonsForEitherParty()) break; - u32 stat = STAT_ATK; + enum Stat stat = STAT_ATK; u32 numMonsFainted = NumFaintedBattlersByAttacker(battlerAtk); if (abilityAtk == ABILITY_BEAST_BOOST) @@ -6235,7 +5695,7 @@ static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move else if (abilityAtk == ABILITY_GRIM_NEIGH || abilityAtk == ABILITY_AS_ONE_SHADOW_RIDER) stat = STAT_SPATK; - if (numMonsFainted && CompareStat(battlerAtk, stat, MAX_STAT_STAGE, CMP_LESS_THAN)) + if (numMonsFainted && CompareStat(battlerAtk, stat, MAX_STAT_STAGE, CMP_LESS_THAN, abilityAtk)) { gLastUsedAbility = abilityAtk; if (abilityAtk == ABILITY_AS_ONE_ICE_RIDER) @@ -6246,8 +5706,7 @@ static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move SET_STATCHANGER(stat, numMonsFainted, FALSE); PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); gBattleScripting.animArg1 = GET_STAT_BUFF_ID(stat) + (numMonsFainted > 1 ? STAT_ANIM_PLUS2 : STAT_ANIM_PLUS1); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_RaiseStatOnFaintingTarget; + BattleScriptCall(BattleScript_RaiseStatOnFaintingTarget); effect = TRUE; } } @@ -6259,37 +5718,34 @@ static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move || NumFaintedBattlersByAttacker(battlerAtk) == 0) break; - u32 side = GetBattlerSide(battlerAtk); - - if (gBattleStruct->partyState[side][gBattlerPartyIndexes[battlerAtk]].battleBondBoost) + if (GetBattlerPartyState(battlerAtk)->battleBondBoost) break; - if (GetGenConfig(GEN_CONFIG_BATTLE_BOND) < GEN_9 && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_BATTLE_BOND) + if (GetConfig(CONFIG_BATTLE_BOND) < GEN_9 && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_BATTLE_BOND) { // TODO: Convert this to a proper FORM_CHANGE type. gLastUsedAbility = abilityAtk; - gBattleStruct->partyState[side][gBattlerPartyIndexes[battlerAtk]].battleBondBoost = TRUE; + GetBattlerPartyState(battlerAtk)->battleBondBoost = TRUE; PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[battlerAtk].species); - gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[battlerAtk]] = gBattleMons[battlerAtk].species; + GetBattlerPartyState(battlerAtk)->changedSpecies = gBattleMons[battlerAtk].species; gBattleMons[battlerAtk].species = SPECIES_GRENINJA_ASH; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BattleBondActivatesOnMoveEndAttacker; + BattleScriptCall(BattleScript_BattleBondActivatesOnMoveEndAttacker); effect = TRUE; } else { u32 numStatBuffs = 0; - if (CompareStat(battlerAtk, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) + if (CompareStat(battlerAtk, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN, abilityAtk)) { gBattleScripting.animArg1 = GET_STAT_BUFF_ID(STAT_ATK) + STAT_ANIM_PLUS1; numStatBuffs++; } - if (CompareStat(battlerAtk, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN)) + if (CompareStat(battlerAtk, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN, abilityAtk)) { gBattleScripting.animArg1 = GET_STAT_BUFF_ID(STAT_SPATK) + STAT_ANIM_PLUS1; numStatBuffs++; } - if (CompareStat(battlerAtk, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN)) + if (CompareStat(battlerAtk, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN, abilityAtk)) { gBattleScripting.animArg1 = GET_STAT_BUFF_ID(STAT_SPEED) + STAT_ANIM_PLUS1; numStatBuffs++; @@ -6302,199 +5758,487 @@ static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move gLastUsedAbility = abilityAtk; gBattlerAbility = battlerAtk; - gBattleStruct->partyState[side][gBattlerPartyIndexes[battlerAtk]].battleBondBoost = TRUE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_EffectBattleBondStatIncrease; + GetBattlerPartyState(battlerAtk)->battleBondBoost = TRUE; + BattleScriptCall(BattleScript_EffectBattleBondStatIncrease); effect = TRUE; } } } break; + default: + break; } return effect; } -static void Cmd_moveend(void) +static bool32 HandleMoveEndMoveBlock(u32 moveEffect) { - CMD_ARGS(u8 endMode, u8 endState); + if (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + return FALSE; - s32 i; bool32 effect = FALSE; - u32 moveType = 0; - enum ItemHoldEffect holdEffectAtk = HOLD_EFFECT_NONE; - u32 endMode, endState; - u32 originallyUsedMove; - - if (gChosenMove == MOVE_UNAVAILABLE) - originallyUsedMove = MOVE_NONE; - else - originallyUsedMove = gChosenMove; - - endMode = cmd->endMode; - endState = cmd->endState; - - holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); - moveType = GetBattleMoveType(gCurrentMove); - - enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); - - do + enum BattleSide side = GetBattlerSide(gBattlerTarget); + switch (moveEffect) { - switch (gBattleScripting.moveendState) + case EFFECT_KNOCK_OFF: + if (gBattleMons[gBattlerTarget].item != ITEM_NONE + && IsBattlerAlive(gBattlerAttacker) + && !(B_KNOCK_OFF_REMOVAL >= GEN_5 && side == B_SIDE_PLAYER && !(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) + && IsBattlerTurnDamaged(gBattlerTarget) + && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove) + && CanBattlerGetOrLoseItem(gBattlerTarget, gBattleMons[gBattlerTarget].item) + && !NoAliveMonsForEitherParty()) { - case MOVEEND_SUM_DAMAGE: // Sum and store damage dealt for multi strike recoil - gBattleScripting.savedDmg += gBattleStruct->moveDamage[gBattlerTarget]; - gBattleScripting.moveendState++; - break; - case MOVEEND_PROTECT_LIKE_EFFECT: - if (gProtectStructs[gBattlerAttacker].touchedProtectLike) - { - enum ProtectMethod method = gProtectStructs[gBattlerTarget].protected; - switch (method) - { - case PROTECT_SPIKY_SHIELD: - if (moveEffect != EFFECT_COUNTER - && !IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE)) - && !IsMagicGuardProtected(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker))) - { - gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 8; - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SPIKY_SHIELD); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SpikyShieldEffect; - effect = 1; - } - break; - case PROTECT_KINGS_SHIELD: - if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE))) - { - gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; - i = gBattlerAttacker; - gBattlerAttacker = gBattlerTarget; - gBattlerTarget = i; // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable - if (B_KINGS_SHIELD_LOWER_ATK >= GEN_8) - gBattleScripting.moveEffect = MOVE_EFFECT_ATK_MINUS_1; - else - gBattleScripting.moveEffect = MOVE_EFFECT_ATK_MINUS_2; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_KingsShieldEffect; - effect = 1; - } - break; - case PROTECT_BANEFUL_BUNKER: - if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE))) - { - gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; - gBattleScripting.moveEffect = MOVE_EFFECT_POISON | MOVE_EFFECT_AFFECTS_USER; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_BANEFUL_BUNKER); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BanefulBunkerEffect; - effect = 1; - } - break; - case PROTECT_BURNING_BULWARK: - if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE))) - { - gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; - gBattleScripting.moveEffect = MOVE_EFFECT_BURN | MOVE_EFFECT_AFFECTS_USER; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_BURNING_BULWARK); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BanefulBunkerEffect; - effect = 1; - } - break; - case PROTECT_OBSTRUCT: - if (moveEffect != EFFECT_SUCKER_PUNCH // Why??? - && moveEffect != EFFECT_UPPER_HAND // Why??? - && !IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE))) - { - gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; - i = gBattlerAttacker; - gBattlerAttacker = gBattlerTarget; - gBattlerTarget = i; // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable - gBattleScripting.moveEffect = MOVE_EFFECT_DEF_MINUS_2; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_KingsShieldEffect; - effect = 1; - } - break; - case PROTECT_SILK_TRAP: - if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE))) - { - gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; - i = gBattlerAttacker; - gBattlerAttacker = gBattlerTarget; - gBattlerTarget = i; // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable - gBattleScripting.moveEffect = MOVE_EFFECT_SPD_MINUS_1; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_KingsShieldEffect; - effect = 1; - } - break; - default: - break; - } + u32 side = GetBattlerSide(gBattlerTarget); - // Not strictly a protect effect, but works the same way - if (gProtectStructs[gBattlerTarget].beakBlastCharge - && CanBeBurned(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker)) - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) - { - gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; - gBattleMons[gBattlerAttacker].status1 = STATUS1_BURN; - BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerAttacker].status1), &gBattleMons[gBattlerAttacker].status1); - MarkBattlerForControllerExec(gBattlerAttacker); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BeakBlastBurn; - effect = 1; - } - } - gBattleScripting.moveendState++; - break; - case MOVEEND_ABSORB: - if (moveEffect == EFFECT_ABSORB - && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && !(gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK) - && IsBattlerAlive(gBattlerAttacker) - && IsBattlerTurnDamaged(gBattlerTarget)) + if (GetBattlerAbility(gBattlerTarget) == ABILITY_STICKY_HOLD) { - gBattleStruct->moveDamage[gBattlerAttacker] = max(1, (gBattleStruct->moveDamage[gBattlerTarget] * GetMoveAbsorbPercentage(gCurrentMove) / 100)); - gBattleStruct->moveDamage[gBattlerAttacker] = GetDrainedBigRootHp(gBattlerAttacker, gBattleStruct->moveDamage[gBattlerAttacker]); - gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE; + gBattlerAbility = gBattlerTarget; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_StickyHoldActivatesRet; effect = TRUE; - if (GetBattlerAbility(gBattlerTarget) == ABILITY_LIQUID_OOZE) - { - gBattleStruct->moveDamage[gBattlerAttacker] *= -1; - gHitMarker |= HITMARKER_PASSIVE_DAMAGE; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB_OOZE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_EffectAbsorbLiquidOoze; - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_EffectAbsorb; - } + break; } - gBattleScripting.moveendState++; - break; + gLastUsedItem = gBattleMons[gBattlerTarget].item; + gBattleMons[gBattlerTarget].item = 0; + if (gBattleMons[gBattlerTarget].ability != ABILITY_GORILLA_TACTICS) + gBattleStruct->choicedMove[gBattlerTarget] = MOVE_NONE; + CheckSetUnburden(gBattlerTarget); + + // In Gen 5+, Knock Off removes the target's item rather than rendering it unusable + if (B_KNOCK_OFF_REMOVAL >= GEN_5) + { + BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); + MarkBattlerForControllerExec(gBattlerTarget); + // Mark item as stolen so it will be restored after battle + gBattleStruct->itemLost[side][gBattlerPartyIndexes[gBattlerTarget]].stolen = TRUE; + } + else + { + gWishFutureKnock.knockedOffMons[side] |= 1u << gBattlerPartyIndexes[gBattlerTarget]; + } + + BattleScriptCall(BattleScript_KnockedOff); + effect = TRUE; + } + break; + case EFFECT_STEAL_ITEM: + if (!CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) + || gBattleMons[gBattlerAttacker].item != ITEM_NONE + || gBattleMons[gBattlerTarget].item == ITEM_NONE + || !IsBattlerAlive(gBattlerAttacker) + || !IsBattlerTurnDamaged(gBattlerTarget)) + { + effect = FALSE; + } + else if (GetBattlerAbility(gBattlerTarget) == ABILITY_STICKY_HOLD) + { + BattleScriptCall(BattleScript_NoItemSteal); + gLastUsedAbility = gBattleMons[gBattlerTarget].ability; + RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); + effect = TRUE; + } + else + { + StealTargetItem(gBattlerAttacker, gBattlerTarget); // Attacker steals target item + + if (!(GetConfig(CONFIG_STEAL_WILD_ITEMS) >= GEN_9 + && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_PALACE)))) + { + gBattleMons[gBattlerAttacker].item = ITEM_NONE; // Item assigned later on with thief (see MOVEEND_CHANGED_ITEMS) + gBattleStruct->changedItems[gBattlerAttacker] = gLastUsedItem; // Stolen item to be assigned later + } + gEffectBattler = gBattlerTarget; + BattleScriptCall(BattleScript_ItemSteal); + effect = TRUE; + } + break; + case EFFECT_HIT_SWITCH_TARGET: + if (IsBattlerTurnDamaged(gBattlerTarget) + && IsBattlerAlive(gBattlerTarget) + && IsBattlerAlive(gBattlerAttacker) + && gBattleMons[BATTLE_PARTNER(gBattlerTarget)].volatiles.semiInvulnerable != STATE_COMMANDER) + { + u32 targetAbility = GetBattlerAbility(gBattlerTarget); + if (targetAbility == ABILITY_GUARD_DOG) + return FALSE; + + if (targetAbility == ABILITY_SUCTION_CUPS) + { + BattleScriptCall(BattleScript_AbilityPreventsPhasingOutRet); + } + else if (gBattleMons[gBattlerTarget].volatiles.root) + { + BattleScriptCall(BattleScript_PrintMonIsRootedRet); + } + else if (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) + { + BattleScriptCall(BattleScript_HitSwitchTargetDynamaxed); + } + else + { + gBattleScripting.switchCase = B_SWITCH_HIT; + BattleScriptCall(BattleScript_TryHitSwitchTarget); + } + effect = TRUE; + } + break; + case EFFECT_SMACK_DOWN: + if (!IsBattlerGrounded(gBattlerTarget, GetBattlerAbility(gBattlerTarget), GetBattlerHoldEffect(gBattlerTarget)) + && IsBattlerTurnDamaged(gBattlerTarget) + && IsBattlerAlive(gBattlerTarget) + && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) + { + gBattleMons[gBattlerTarget].volatiles.smackDown = TRUE; + gBattleMons[gBattlerTarget].volatiles.telekinesis = FALSE; + gBattleMons[gBattlerTarget].volatiles.magnetRise = FALSE; + gBattleMons[gBattlerTarget].volatiles.semiInvulnerable = STATE_NONE; + BattleScriptCall(BattleScript_MoveEffectSmackDown); + effect = TRUE; + } + break; + case EFFECT_RECOIL_IF_MISS: + if (IsBattlerAlive(gBattlerAttacker) + && (!IsBattlerTurnDamaged(gBattlerTarget) || gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) + && !gBattleStruct->noTargetPresent) + { + s32 recoil = 0; + if (B_RECOIL_IF_MISS_DMG >= GEN_5 || (B_CRASH_IF_TARGET_IMMUNE == GEN_4 && gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_DOESNT_AFFECT_FOE)) + recoil = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; + else if (B_RECOIL_IF_MISS_DMG == GEN_4 && (GetNonDynamaxMaxHP(gBattlerTarget) / 2) < gBattleStruct->moveDamage[gBattlerTarget]) + recoil = GetNonDynamaxMaxHP(gBattlerTarget) / 2; + else if (B_RECOIL_IF_MISS_DMG == GEN_3) + recoil = GetNonDynamaxMaxHP(gBattlerTarget) / 2; + else if (B_RECOIL_IF_MISS_DMG == GEN_2) + recoil = GetNonDynamaxMaxHP(gBattlerTarget) / 8; + else + recoil = 1; + SetPassiveDamageAmount(gBattlerAttacker, recoil); + BattleScriptCall(BattleScript_RecoilIfMiss); + effect = TRUE; + } + break; + case EFFECT_RECOIL: + if (IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker) && gBattleStruct->moveDamage[gBattlerTarget] > 0) + { + enum Ability ability = GetBattlerAbility(gBattlerAttacker); + if (IsAbilityAndRecord(gBattlerAttacker, ability, ABILITY_ROCK_HEAD) + || IsAbilityAndRecord(gBattlerAttacker, ability, ABILITY_MAGIC_GUARD)) + break; + + SetPassiveDamageAmount(gBattlerAttacker, gBattleScripting.savedDmg * max(1, GetMoveRecoil(gCurrentMove)) / 100); + TryUpdateEvolutionTracker(IF_RECOIL_DAMAGE_GE, gBattleStruct->passiveHpUpdate[gBattlerAttacker], MOVE_NONE); + BattleScriptCall(BattleScript_MoveEffectRecoil); + effect = TRUE; + } + break; + case EFFECT_EXPLOSION: + case EFFECT_MISTY_EXPLOSION: + if (!IsAbilityOnField(ABILITY_DAMP)) + { + gBattleStruct->passiveHpUpdate[gBattlerAttacker] = 0; + BattleScriptCall(BattleScript_FaintAttackerForExplosion); + effect = TRUE; + } + break; + case EFFECT_MAX_HP_50_RECOIL: + if (IsBattlerAlive(gBattlerAttacker) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_FAILED) + && !IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD)) + { + s32 recoil = (GetNonDynamaxMaxHP(gBattlerAttacker) + 1) / 2; // Half of Max HP Rounded UP + SetPassiveDamageAmount(gBattlerAttacker, recoil); + TryUpdateEvolutionTracker(IF_RECOIL_DAMAGE_GE, gBattleStruct->passiveHpUpdate[gBattlerAttacker], MOVE_NONE); + BattleScriptCall(BattleScript_MaxHp50Recoil); + effect = TRUE; + } + break; + case EFFECT_CHLOROBLAST: + if (IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker)) + { + enum Ability ability = GetBattlerAbility(gBattlerAttacker); + if (IsAbilityAndRecord(gBattlerAttacker, ability, ABILITY_ROCK_HEAD) + || IsAbilityAndRecord(gBattlerAttacker, ability, ABILITY_MAGIC_GUARD)) + break; + + s32 recoil = (GetNonDynamaxMaxHP(gBattlerAttacker) + 1) / 2; // Half of Max HP Rounded UP + SetPassiveDamageAmount(gBattlerAttacker, recoil); + TryUpdateEvolutionTracker(IF_RECOIL_DAMAGE_GE, gBattleStruct->passiveHpUpdate[gBattlerAttacker], MOVE_NONE); + BattleScriptCall(BattleScript_MoveEffectRecoil); + effect = TRUE; + } + break; + case EFFECT_RAPID_SPIN: + if (IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker)) + { + BattleScriptCall(BattleScript_RapidSpinAway); + effect = TRUE; + } + break; + case EFFECT_FELL_STINGER: + if (IsBattlerAlive(gBattlerAttacker) + && !IsBattlerAlive(gBattlerTarget) + && IsBattlerTurnDamaged(gBattlerTarget) + && !NoAliveMonsForEitherParty() + && CompareStat(gBattlerAttacker, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN, GetBattlerAbility(gBattlerAttacker))) + { + SET_STATCHANGER(STAT_ATK, GetConfig(CONFIG_FELL_STINGER_STAT_RAISE) >= GEN_7 ? 3 : 2, FALSE); + PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_FellStingerRaisesStat; + effect = TRUE; + } + break; + case EFFECT_STONE_AXE: + if (!IsHazardOnSide(side, HAZARDS_STEALTH_ROCK) + && IsBattlerTurnDamaged(gBattlerTarget) + && IsBattlerAlive(gBattlerAttacker)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_POINTEDSTONESFLOAT; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_StealthRockActivates; + effect = TRUE; + } + break; + case EFFECT_CEASELESS_EDGE: + if (gSideTimers[side].spikesAmount < 3 + && IsBattlerTurnDamaged(gBattlerTarget) + && IsBattlerAlive(gBattlerAttacker)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SPIKESSCATTERED; + BattleScriptPush(gBattlescriptCurrInstr + 1); + if (gBattleStruct->isSkyBattle) + { + effect = FALSE; + } + else + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_SpikesActivates; + effect = TRUE; + } + } + break; + default: + effect = FALSE; + break; + } + + return effect; +} + +static void Cmd_moveend(void) +{ + CMD_ARGS(u8 endMode, u8 endState); + + s32 i; + bool32 effect = FALSE; + u32 moveType = 0; + u32 endMode, endState; + u32 originallyUsedMove; + + if (gChosenMove == MOVE_UNAVAILABLE) + originallyUsedMove = MOVE_NONE; + else + originallyUsedMove = gChosenMove; + + endMode = cmd->endMode; + endState = cmd->endState; + + moveType = GetBattleMoveType(gCurrentMove); + + enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); + + do + { + switch (gBattleScripting.moveendState) + { + case MOVEEND_SET_VALUES: + gBattleScripting.savedDmg += gBattleStruct->moveDamage[gBattlerTarget]; + gBattleStruct->eventState.moveEndBattler = 0; + gBattleScripting.moveendState++; + break; + case MOVEEND_PROTECT_LIKE_EFFECT: + if (gProtectStructs[gBattlerAttacker].touchedProtectLike) + { + enum ProtectMethod method = gProtectStructs[gBattlerTarget].protected; + switch (method) + { + case PROTECT_SPIKY_SHIELD: + if (moveEffect != EFFECT_COUNTER + && !IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker)) + && !IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD)) + { + gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; + SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 8); + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SPIKY_SHIELD); + BattleScriptCall(BattleScript_SpikyShieldEffect); + effect = 1; + } + break; + case PROTECT_KINGS_SHIELD: + if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker))) + { + gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; + SWAP(gBattlerAttacker, gBattlerTarget, i); // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable + if (B_KINGS_SHIELD_LOWER_ATK >= GEN_8) + gBattleScripting.moveEffect = MOVE_EFFECT_ATK_MINUS_1; + else + gBattleScripting.moveEffect = MOVE_EFFECT_ATK_MINUS_2; + BattleScriptCall(BattleScript_KingsShieldEffect); + effect = 1; + } + break; + case PROTECT_BANEFUL_BUNKER: + if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker)) + && CanBePoisoned(gBattlerTarget, gBattlerAttacker, gLastUsedAbility, GetBattlerAbility(gBattlerAttacker))) + { + gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; + gBattleScripting.moveEffect = MOVE_EFFECT_POISON; + BattleScriptCall(BattleScript_BanefulBunkerEffect); + effect = 1; + } + break; + case PROTECT_BURNING_BULWARK: + if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker)) + && CanBeBurned(gBattlerTarget, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker))) + { + gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; + gBattleScripting.moveEffect = MOVE_EFFECT_BURN; + BattleScriptCall(BattleScript_BanefulBunkerEffect); + effect = 1; + } + break; + case PROTECT_OBSTRUCT: + if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker))) + { + gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; + SWAP(gBattlerAttacker, gBattlerTarget, i); // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable + gBattleScripting.moveEffect = MOVE_EFFECT_DEF_MINUS_2; + BattleScriptCall(BattleScript_KingsShieldEffect); + effect = 1; + } + break; + case PROTECT_SILK_TRAP: + if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker))) + { + gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; + SWAP(gBattlerAttacker, gBattlerTarget, i); // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable + gBattleScripting.moveEffect = MOVE_EFFECT_SPD_MINUS_1; + BattleScriptCall(BattleScript_KingsShieldEffect); + effect = 1; + } + break; + default: + break; + } + + // Not strictly a protect effect, but works the same way + if (IsBattlerUsingBeakBlast(gBattlerTarget) + && CanBeBurned(gBattlerAttacker, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker)) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) + { + gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; + gBattleMons[gBattlerAttacker].status1 = STATUS1_BURN; + BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerAttacker].status1), &gBattleMons[gBattlerAttacker].status1); + MarkBattlerForControllerExec(gBattlerAttacker); + BattleScriptCall(BattleScript_BeakBlastBurn); + effect = 1; + } + } + gBattleScripting.moveendState++; + break; + + case MOVEEND_GRUDGE: + if (gBattleStruct->tryGrudge + && IsBattlerTurnDamaged(gBattlerTarget) + && !IsBattlerAlive(gBattlerTarget) + && IsBattlerAlive(gBattlerAttacker) + && !IsBattlerAlly(gBattlerAttacker, gBattlerTarget) + && !IsZMove(gCurrentMove) + && gCurrentMove != MOVE_STRUGGLE) + { + u32 moveIndex = gBattleStruct->chosenMovePositions[gBattlerAttacker]; + + gBattleStruct->tryGrudge = FALSE; + gBattleMons[gBattlerAttacker].pp[moveIndex] = 0; + BattleScriptCall(BattleScript_GrudgeTakesPp); + BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, moveIndex + REQUEST_PPMOVE1_BATTLE, 0, sizeof(gBattleMons[gBattlerAttacker].pp[moveIndex]), &gBattleMons[gBattlerAttacker].pp[moveIndex]); + MarkBattlerForControllerExec(gBattlerAttacker); + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].moves[moveIndex]) + } + gBattleScripting.moveendState++; + break; + + case MOVEEND_DESTINY_BOND: + if (gBattleStruct->tryDestinyBond + && IsBattlerTurnDamaged(gBattlerTarget) + && !IsBattlerAlive(gBattlerTarget) + && IsBattlerAlive(gBattlerAttacker) + && !(GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX) + && !IsBattlerAlly(gBattlerAttacker, gBattlerTarget)) + { + gBattleStruct->tryDestinyBond = FALSE; + gBattleStruct->passiveHpUpdate[gBattlerAttacker] = gBattleMons[gBattlerAttacker].hp; + BattleScriptCall(BattleScript_DestinyBondTakesLife); + effect = TRUE; + } + gBattleScripting.moveendState++; + break; + case MOVEEND_ABSORB: + if (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE + || !IsBattlerTurnDamaged(gBattlerTarget)) + { + gBattleScripting.moveendState++; + break; + } + switch (moveEffect) + { + case EFFECT_ABSORB: + case EFFECT_DREAM_EATER: + if (!gBattleMons[gBattlerAttacker].volatiles.healBlock + && gBattleStruct->moveDamage[gBattlerTarget] > 0 + && IsBattlerAlive(gBattlerAttacker)) + { + s32 healAmount = (gBattleStruct->moveDamage[gBattlerTarget] * GetMoveAbsorbPercentage(gCurrentMove) / 100); + healAmount = GetDrainedBigRootHp(gBattlerAttacker, healAmount); + effect = TRUE; + if ((moveEffect == EFFECT_DREAM_EATER && GetConfig(CONFIG_DREAM_EATER_LIQUID_OOZE) < GEN_5) + || GetBattlerAbility(gBattlerTarget) != ABILITY_LIQUID_OOZE) + { + SetHealAmount(gBattlerAttacker, healAmount); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB; + BattleScriptCall(BattleScript_EffectAbsorb); + } + else // Liquid Ooze damage + { + SetPassiveDamageAmount(gBattlerAttacker, healAmount); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB_OOZE; + BattleScriptCall(BattleScript_EffectAbsorbLiquidOoze); + } + } + break; + case EFFECT_FINAL_GAMBIT: + BattleScriptCall(BattleScript_FinalGambit); + effect = TRUE; + break; + default: + break; + } + gBattleScripting.moveendState++; + break; case MOVEEND_RAGE: // rage check - if (gBattleMons[gBattlerTarget].status2 & STATUS2_RAGE + if (gBattleMons[gBattlerTarget].volatiles.rage && IsBattlerAlive(gBattlerTarget) && gBattlerAttacker != gBattlerTarget && !IsBattlerAlly(gBattlerAttacker, gBattlerTarget) - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerTurnDamaged(gBattlerTarget) && !IsBattleMoveStatus(gCurrentMove) - && CompareStat(gBattlerTarget, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) + && CompareStat(gBattlerTarget, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN, GetBattlerAbility(gBattlerTarget))) { SET_STATCHANGER(STAT_ATK, 1, FALSE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_RageIsBuilding; + BattleScriptCall(BattleScript_RageIsBuilding); effect = TRUE; } gBattleScripting.moveendState++; @@ -6517,9 +6261,12 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_STATUS_IMMUNITY_ABILITIES: // status immunities - if (AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, 0, 0, 0, 0)) - effect = TRUE; // it loops through all battlers, so we increment after its done with all battlers - else + for (u16 battler = 0; battler < gBattlersCount; battler++) + { + if (AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, battler, 0, 0, 0)) + effect = TRUE; + } + if (!effect) gBattleScripting.moveendState++; break; case MOVEEND_SYNCHRONIZE_ATTACKER: // attacker synchronize @@ -6527,120 +6274,46 @@ static void Cmd_moveend(void) effect = TRUE; gBattleScripting.moveendState++; break; - case MOVEEND_CHOICE_MOVE: // update choice band move - { - u16 *choicedMoveAtk = &gBattleStruct->choicedMove[gBattlerAttacker]; - if (gHitMarker & HITMARKER_OBEYS - && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && gChosenMove != MOVE_STRUGGLE - && (*choicedMoveAtk == MOVE_NONE || *choicedMoveAtk == MOVE_UNAVAILABLE) - && (HOLD_EFFECT_CHOICE(holdEffectAtk) || GetBattlerAbility(gBattlerAttacker) == ABILITY_GORILLA_TACTICS)) - { - if ((moveEffect == EFFECT_BATON_PASS || moveEffect == EFFECT_HEALING_WISH) - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_FAILED)) - { - gBattleScripting.moveendState++; - break; - } - *choicedMoveAtk = gChosenMove; - } - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBattleMons[gBattlerAttacker].moves[i] == *choicedMoveAtk) - break; - } - if (i == MAX_MON_MOVES) - { - *choicedMoveAtk = MOVE_NONE; - } - gBattleScripting.moveendState++; - break; - } case MOVEEND_ITEM_EFFECTS_TARGET: - if (ItemBattleEffects(ITEMEFFECT_TARGET, gBattlerTarget, FALSE)) + { + enum HoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); + if (ItemBattleEffects(gBattlerTarget, gBattlerAttacker, holdEffect, IsOnTargetHitActivation) + || ItemBattleEffects(gBattlerTarget, gBattlerAttacker, holdEffect, IsOnStatusChangeActivation)) effect = TRUE; gBattleScripting.moveendState++; break; - case MOVEEND_FIRST_MOVE_BLOCK: - if ((gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_1ST_HIT && IsBattlerAlive(gBattlerTarget)) - || gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT - || gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - { - gBattleScripting.moveendState++; - break; - } - - switch (moveEffect) + } + case MOVEEND_ITEM_EFFECTS_ATTACKER_1: + { + enum HoldEffect holdEffect = GetBattlerHoldEffect(gBattlerAttacker); + if (ItemBattleEffects(gBattlerAttacker, gBattlerTarget, holdEffect, IsOnAttackerAfterHitActivation) + || ItemBattleEffects(gBattlerAttacker, gBattlerTarget, holdEffect, IsOnStatusChangeActivation) + || ItemBattleEffects(gBattlerAttacker, gBattlerTarget, holdEffect, IsOnHpThresholdActivation)) + effect = TRUE; + gBattleScripting.moveendState++; + break; + } + case MOVEEND_SYMBIOSIS: + for (i = 0; i < gBattlersCount; i++) { - case EFFECT_KNOCK_OFF: - if (!DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) - effect = TryKnockOffBattleScript(gBattlerTarget); - break; - case EFFECT_HIT_SWITCH_TARGET: - if (IsBattlerTurnDamaged(gBattlerTarget) - && IsBattlerAlive(gBattlerTarget) - && IsBattlerAlive(gBattlerAttacker) - && !(gStatuses3[BATTLE_PARTNER(gBattlerTarget)] & STATUS3_COMMANDER)) + if ((gSpecialStatuses[i].berryReduced + || (GetConfig(CONFIG_SYMBIOSIS_GEMS) >= GEN_7 && gSpecialStatuses[i].gemBoost)) + && TryTriggerSymbiosis(i, BATTLE_PARTNER(i))) { - u32 targetAbility = GetBattlerAbility(gBattlerTarget); - if (targetAbility == ABILITY_GUARD_DOG) - { - gBattleScripting.moveendState++; - break; - } - - effect = TRUE; + BestowItem(BATTLE_PARTNER(i), i); + gLastUsedAbility = gBattleMons[BATTLE_PARTNER(i)].ability; + gEffectBattler = i; + gBattleScripting.battler = gBattlerAbility = BATTLE_PARTNER(i); + gBattlerAttacker = i; BattleScriptPushCursor(); - if (targetAbility == ABILITY_SUCTION_CUPS) - { - gBattlescriptCurrInstr = BattleScript_AbilityPreventsPhasingOutRet; - } - else if (gStatuses3[gBattlerTarget] & STATUS3_ROOTED) - { - gBattlescriptCurrInstr = BattleScript_PrintMonIsRootedRet; - } - else if (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) - { - gBattlescriptCurrInstr = BattleScript_HitSwitchTargetDynamaxed; - } - else - { - gBattleScripting.switchCase = B_SWITCH_HIT; - gBattlescriptCurrInstr = BattleScript_TryHitSwitchTarget; - } - } - break; - case EFFECT_SMACK_DOWN: - if (!IsBattlerGrounded(gBattlerTarget) - && IsBattlerAlive(gBattlerTarget) - && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) - { - gStatuses3[gBattlerTarget] |= STATUS3_SMACKED_DOWN; - gStatuses3[gBattlerTarget] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS | STATUS3_ON_AIR); + gBattlescriptCurrInstr = BattleScript_SymbiosisActivates; effect = TRUE; - BattleScriptPush(gBattlescriptCurrInstr); - gBattlescriptCurrInstr = BattleScript_MoveEffectSmackDown; } - break; - default: - break; } gBattleScripting.moveendState++; break; - case MOVEEND_ITEM_EFFECTS_ALL: // item effects for all battlers - if (ItemBattleEffects(ITEMEFFECT_MOVE_END, 0, FALSE)) - effect = TRUE; - else - gBattleScripting.moveendState++; - break; - case MOVEEND_KINGSROCK: // King's rock - // These effects will occur at each hit in a multi-strike move - if (ItemBattleEffects(ITEMEFFECT_KINGSROCK, 0, FALSE)) - effect = TRUE; - gBattleScripting.moveendState++; - break; case MOVEEND_ATTACKER_INVISIBLE: // make attacker sprite invisible - if (gStatuses3[gBattlerAttacker] & (STATUS3_SEMI_INVULNERABLE) + if (IsSemiInvulnerable(gBattlerAttacker, CHECK_ALL) && gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION)) { BtlController_EmitSpriteInvisibility(gBattlerAttacker, B_COMM_TO_CONTROLLER, TRUE); @@ -6652,12 +6325,12 @@ static void Cmd_moveend(void) break; case MOVEEND_ATTACKER_VISIBLE: // make attacker sprite visible if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT - || !(gStatuses3[gBattlerAttacker] & (STATUS3_SEMI_INVULNERABLE)) + || !IsSemiInvulnerable(gBattlerAttacker, CHECK_ALL) || WasUnableToUseMove(gBattlerAttacker)) { BtlController_EmitSpriteInvisibility(gBattlerAttacker, B_COMM_TO_CONTROLLER, FALSE); MarkBattlerForControllerExec(gBattlerAttacker); - gStatuses3[gBattlerAttacker] &= ~STATUS3_SEMI_INVULNERABLE; + gBattleMons[gBattlerAttacker].volatiles.semiInvulnerable = STATE_NONE; gSpecialStatuses[gBattlerAttacker].restoredBattlerSprite = TRUE; gBattleScripting.moveendState++; return; @@ -6666,11 +6339,11 @@ static void Cmd_moveend(void) break; case MOVEEND_TARGET_VISIBLE: // make target sprite visible if (!gSpecialStatuses[gBattlerTarget].restoredBattlerSprite && gBattlerTarget < gBattlersCount - && !(gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE)) + && !IsSemiInvulnerable(gBattlerTarget, CHECK_ALL)) { BtlController_EmitSpriteInvisibility(gBattlerTarget, B_COMM_TO_CONTROLLER, FALSE); MarkBattlerForControllerExec(gBattlerTarget); - gStatuses3[gBattlerTarget] &= ~STATUS3_SEMI_INVULNERABLE; + gBattleMons[gBattlerTarget].volatiles.semiInvulnerable = STATE_NONE; gBattleScripting.moveendState++; return; } @@ -6680,7 +6353,7 @@ static void Cmd_moveend(void) for (i = 0; i < gBattlersCount; i++) { if (gDisableStructs[i].substituteHP == 0) - gBattleMons[i].status2 &= ~STATUS2_SUBSTITUTE; + gBattleMons[i].volatiles.substitute = FALSE; } gBattleScripting.moveendState++; break; @@ -6715,17 +6388,19 @@ static void Cmd_moveend(void) if (!IsOnPlayerSide(gBattlerAttacker)) UpdateStallMons(); if ((gBattleStruct->moveResultFlags[gBattlerTarget] & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE)) - || (gBattleMons[gBattlerAttacker].status2 & (STATUS2_FLINCHED)) + || gBattleMons[gBattlerAttacker].volatiles.flinched + || gBattleStruct->pledgeMove == TRUE // Is the battler that uses the first Pledge move in the combo || gProtectStructs[gBattlerAttacker].nonVolatileStatusImmobility) gBattleStruct->battlerState[gBattlerAttacker].stompingTantrumTimer = 2; // Set ShellTrap to activate after the attacker's turn if target was hit by a physical move. if (GetMoveEffect(gChosenMoveByBattler[gBattlerTarget]) == EFFECT_SHELL_TRAP + && IsBattleMovePhysical(gCurrentMove) + && IsBattlerTurnDamaged(gBattlerTarget) && gBattlerTarget != gBattlerAttacker && !IsBattlerAlly(gBattlerTarget, gBattlerAttacker) - && gProtectStructs[gBattlerTarget].physicalDmg && gProtectStructs[gBattlerTarget].physicalBattlerId == gBattlerAttacker - && !TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove)) + && !IsSheerForceAffected(gCurrentMove, GetBattlerAbility(gBattlerAttacker))) { gProtectStructs[gBattlerTarget].shellTrap = TRUE; // Change move order in double battles, so the hit mon with shell trap moves immediately after being hit. @@ -6746,18 +6421,12 @@ static void Cmd_moveend(void) { gDisableStructs[gBattlerAttacker].usedMoves |= 1u << gCurrMovePos; gBattleStruct->lastMoveTarget[gBattlerAttacker] = gBattlerTarget; - if (gHitMarker & HITMARKER_ATTACKSTRING_PRINTED) - { - gLastPrintedMoves[gBattlerAttacker] = gChosenMove; - gLastUsedMove = gCurrentMove; - if (IsMaxMove(gCurrentMove)) - gBattleStruct->dynamax.lastUsedBaseMove = gBattleStruct->dynamax.baseMoves[gBattlerAttacker]; - } } enum BattleMoveEffects originalEffect = GetMoveEffect(originallyUsedMove); - if (!(gAbsentBattlerFlags & (1u << gBattlerAttacker)) - && !gBattleStruct->battlerState[gBattlerAttacker].absent - && originalEffect != EFFECT_BATON_PASS && originalEffect != EFFECT_HEALING_WISH) + if (IsBattlerAlive(gBattlerAttacker) + && originalEffect != EFFECT_BATON_PASS + && originalEffect != EFFECT_HEALING_WISH + && originalEffect != EFFECT_LUNAR_DANCE) { if (gHitMarker & HITMARKER_OBEYS) { @@ -6789,6 +6458,12 @@ static void Cmd_moveend(void) { gLastLandedMoves[gBattlerTarget] = gCurrentMove; gLastHitByType[gBattlerTarget] = GetBattleMoveType(gCurrentMove); + if (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove) + { + gLastUsedMove = gCurrentMove; + if (IsMaxMove(gCurrentMove)) + gBattleStruct->dynamax.lastUsedBaseMove = gBattleStruct->dynamax.baseMoves[gBattlerAttacker]; + } } } else @@ -6800,7 +6475,6 @@ static void Cmd_moveend(void) break; case MOVEEND_MIRROR_MOVE: // mirror move if (!(gAbsentBattlerFlags & (1u << gBattlerAttacker)) - && !gBattleStruct->battlerState[gBattlerAttacker].absent && !IsMoveMirrorMoveBanned(originallyUsedMove) && gHitMarker & HITMARKER_OBEYS && gBattlerAttacker != gBattlerTarget @@ -6812,6 +6486,35 @@ static void Cmd_moveend(void) } gBattleScripting.moveendState++; break; + case MOVEEND_DEFROST: + if (gBattleMons[gBattlerTarget].status1 & STATUS1_FREEZE + && IsBattlerTurnDamaged(gBattlerTarget) + && IsBattlerAlive(gBattlerTarget) + && gBattlerAttacker != gBattlerTarget + && (moveType == TYPE_FIRE || CanBurnHitThaw(gCurrentMove)) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) + { + gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FREEZE; + BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); + MarkBattlerForControllerExec(gBattlerTarget); + BattleScriptCall(BattleScript_DefrostedViaFireMove); + effect = TRUE; + } + if (gBattleMons[gBattlerTarget].status1 & STATUS1_FROSTBITE + && IsBattlerTurnDamaged(gBattlerTarget) + && IsBattlerAlive(gBattlerTarget) + && gBattlerAttacker != gBattlerTarget + && MoveThawsUser(originallyUsedMove) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) + { + gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FROSTBITE; + BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); + MarkBattlerForControllerExec(gBattlerTarget); + BattleScriptCall(BattleScript_FrostbiteHealedViaFireMove); + effect = TRUE; + } + gBattleScripting.moveendState++; + break; case MOVEEND_NEXT_TARGET: // For moves hitting two opposing Pokemon. { u16 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); @@ -6821,21 +6524,23 @@ static void Cmd_moveend(void) && IsDoubleBattle() && !gProtectStructs[gBattlerAttacker].chargingTurn && (moveTarget == MOVE_TARGET_BOTH - || moveTarget == MOVE_TARGET_FOES_AND_ALLY) - && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) + || moveTarget == MOVE_TARGET_FOES_AND_ALLY)) { u32 nextTarget = GetNextTarget(moveTarget, FALSE); - gHitMarker |= HITMARKER_NO_PPDEDUCT; if (nextTarget != MAX_BATTLERS_COUNT) { gBattleStruct->moveTarget[gBattlerAttacker] = gBattlerTarget = nextTarget; // Fix for moxie spread moves gBattleScripting.moveendState = 0; MoveValuesCleanUp(); - gBattleScripting.moveEffect = gBattleScripting.savedMoveEffect; - if (moveEffect == EFFECT_EXPLOSION) - BattleScriptPush(gBattleMoveEffects[EFFECT_HIT].battleScript); // Edge case for Explosion not changing targets + // Edge cases for moves that shouldn't repeat their own script + if (moveEffect == EFFECT_EXPLOSION + || moveEffect == EFFECT_MISTY_EXPLOSION + || moveEffect == EFFECT_MAGNITUDE + || moveEffect == EFFECT_SYNCHRONOISE + || gBattleMoveEffects[moveEffect].battleScript == BattleScript_EffectTwoTurnsAttack) + BattleScriptPush(gBattleMoveEffects[EFFECT_HIT].battleScript); else BattleScriptPush(GetMoveBattleScript(gCurrentMove)); gBattlescriptCurrInstr = BattleScript_FlushMessageBox; @@ -6864,20 +6569,23 @@ static void Cmd_moveend(void) return; } } - - gHitMarker |= HITMARKER_NO_ATTACKSTRING; - gHitMarker &= ~HITMARKER_NO_PPDEDUCT; } RecordLastUsedMoveBy(gBattlerAttacker, gCurrentMove); gBattleScripting.moveendState++; break; } + case MOVEEND_HP_THRESHHOLD_ITEMS_TARGET: + if (gMultiHitCounter + && ItemBattleEffects(gBattlerTarget, gBattlerAttacker, GetBattlerHoldEffect(gBattlerTarget), IsOnHpThresholdActivation)) + effect = TRUE; + gBattleScripting.moveendState++; + break; case MOVEEND_MULTIHIT_MOVE: { if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && gMultiHitCounter - && !(moveEffect == EFFECT_PRESENT && gBattleStruct->presentBasePower == 0)) // Silly edge case + && !(moveEffect == EFFECT_PRESENT && gBattleStruct->presentBasePower == 0)) // Parental Bond edge case { gMultiHitCounter--; if (!IsBattlerAlive(gBattlerTarget) && moveEffect != EFFECT_DRAGON_DARTS) @@ -6886,11 +6594,12 @@ static void Cmd_moveend(void) gBattleScripting.multihitString[4]++; if (gMultiHitCounter == 0) { - BattleScriptPushCursor(); - if (GetMoveEffectArg_MoveProperty(gCurrentMove) == MOVE_EFFECT_SCALE_SHOT && !NoAliveMonsForEitherParty()) - gBattlescriptCurrInstr = BattleScript_ScaleShot; + if (moveEffect == EFFECT_MULTI_HIT + && GetMoveEffectArg_MoveProperty(gCurrentMove) == MOVE_EFFECT_SCALE_SHOT + && !NoAliveMonsForEitherParty()) + BattleScriptCall(BattleScript_ScaleShot); else - gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; + BattleScriptCall(BattleScript_MultiHitPrintStrings); effect = TRUE; } else @@ -6912,7 +6621,6 @@ static void Cmd_moveend(void) if (gSpecialStatuses[gBattlerAttacker].parentalBondState) gSpecialStatuses[gBattlerAttacker].parentalBondState--; - gHitMarker |= (HITMARKER_NO_PPDEDUCT | HITMARKER_NO_ATTACKSTRING); gBattleScripting.animTargetsHit = 0; gBattleScripting.moveendState = 0; gSpecialStatuses[gBattlerAttacker].multiHitOn = TRUE; @@ -6923,8 +6631,7 @@ static void Cmd_moveend(void) } else { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; + BattleScriptCall(BattleScript_MultiHitPrintStrings); effect = TRUE; } } @@ -6935,143 +6642,102 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; } - case MOVEEND_DEFROST: - if (gBattleMons[gBattlerTarget].status1 & STATUS1_FREEZE - && IsBattlerTurnDamaged(gBattlerTarget) - && IsBattlerAlive(gBattlerTarget) - && gBattlerAttacker != gBattlerTarget - && (moveType == TYPE_FIRE || CanBurnHitThaw(gCurrentMove)) - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) - { - gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FREEZE; - BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); - MarkBattlerForControllerExec(gBattlerTarget); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove; + case MOVEEND_MOVE_BLOCK: + effect = HandleMoveEndMoveBlock(moveEffect); + gBattleScripting.moveendState++; + break; + case MOVEEND_ITEM_EFFECTS_ATTACKER_2: + { + enum HoldEffect holdEffect = GetBattlerHoldEffect(gBattlerAttacker); + if (ItemBattleEffects(gBattlerAttacker, gBattlerTarget, holdEffect, IsOnStatusChangeActivation) + || ItemBattleEffects(gBattlerAttacker, gBattlerTarget, holdEffect, IsOnHpThresholdActivation)) effect = TRUE; - } - if (gBattleMons[gBattlerTarget].status1 & STATUS1_FROSTBITE - && IsBattlerAlive(gBattlerTarget) - && gBattlerAttacker != gBattlerTarget - && MoveThawsUser(originallyUsedMove) - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) + gBattleScripting.moveendState++; + break; + } + case MOVEEND_ABILITY_BLOCK: + effect = HandleMoveEndAbilityBlock(gBattlerAttacker, gBattlerTarget, gCurrentMove); + gBattleScripting.moveendState++; + break; + case MOVEEND_SHEER_FORCE: + if (IsSheerForceAffected(gCurrentMove, GetBattlerAbility(gBattlerAttacker))) + gBattleScripting.moveendState = MOVEEND_EJECT_PACK; + else + gBattleScripting.moveendState++; + break; + case MOVEEND_COLOR_CHANGE: + while (gBattleStruct->eventState.moveEndBattler < gBattlersCount) { - gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FROSTBITE; - BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); - MarkBattlerForControllerExec(gBattlerTarget); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_FrostbiteHealedViaFireMove; - effect = TRUE; + u32 battler = gBattleStruct->eventState.moveEndBattler++; + if (battler == gBattlerAttacker) + continue; + if (AbilityBattleEffects(ABILITYEFFECT_COLOR_CHANGE, battler, GetBattlerAbility(battler), 0, 0)) + return; } + gBattleStruct->eventState.moveEndBattler = 0; gBattleScripting.moveendState++; break; - case MOVEEND_SECOND_MOVE_BLOCK: - if (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + case MOVEEND_KEE_MARANGA_HP_THRESHOLD_ITEM_TARGET: + while (gBattleStruct->eventState.moveEndBattler < gBattlersCount) { - gBattleScripting.moveendState++; - break; + u32 battlerDef = gBattleStruct->eventState.moveEndBattler++; + if (battlerDef == gBattlerAttacker) + continue; + enum HoldEffect holdEffect = GetBattlerHoldEffect(battlerDef); + if (ItemBattleEffects(battlerDef, gBattlerAttacker, holdEffect, IsKeeMarangaBerryActivation) + || ItemBattleEffects(battlerDef, gBattlerAttacker, holdEffect, IsOnHpThresholdActivation)) + return; } - - switch (moveEffect) + gBattleScripting.moveendState++; + break; + case MOVEEND_RED_CARD: { - case EFFECT_RECOIL_IF_MISS: - if (IsBattlerAlive(gBattlerAttacker) - && (!IsBattlerTurnDamaged(gBattlerTarget) || gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && !gBattleStruct->noTargetPresent) - { - if (B_RECOIL_IF_MISS_DMG >= GEN_5 || (B_CRASH_IF_TARGET_IMMUNE == GEN_4 && gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_DOESNT_AFFECT_FOE)) - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; - else if (B_RECOIL_IF_MISS_DMG == GEN_4 && (GetNonDynamaxMaxHP(gBattlerTarget) / 2) < gBattleStruct->moveDamage[gBattlerTarget]) - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerTarget) / 2; - else // Fallback if B_RECOIL_IF_MISS_DMG is set to gen3 or lower. - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerTarget) / 2; - - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_RecoilIfMiss; - effect = TRUE; - } - break; - case EFFECT_RECOIL: - if (IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker)) - { - gBattleStruct->moveDamage[gBattlerAttacker] = max(1, gBattleStruct->moveDamage[gBattlerTarget] * max(1, GetMoveRecoil(gCurrentMove)) / 100); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; - effect = TRUE; - } - break; - case EFFECT_EXPLOSION: - if (!IsAbilityOnField(ABILITY_DAMP)) - { - gBattleStruct->moveDamage[gBattlerAttacker] = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_FaintAttackerForExplosion; - effect = TRUE; - } - break; - case EFFECT_MAX_HP_50_RECOIL: - case EFFECT_MIND_BLOWN: - if (IsBattlerAlive(gBattlerAttacker) - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_FAILED) - && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) - { - gBattleStruct->moveDamage[gBattlerAttacker] = (GetNonDynamaxMaxHP(gBattlerAttacker) + 1) / 2; // Half of Max HP Rounded UP - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MaxHp50Recoil; - effect = TRUE; - } - break; - case EFFECT_CHLOROBLAST: - if (IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker)) - { - gBattleStruct->moveDamage[gBattlerAttacker] = (GetNonDynamaxMaxHP(gBattlerAttacker) + 1) / 2; // Half of Max HP Rounded UP - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; - effect = TRUE; - } - break; - case EFFECT_RAPID_SPIN: - if (IsBattlerTurnDamaged(gBattlerTarget)) + u32 redCardBattlers = 0, i; + for (i = 0; i < gBattlersCount; i++) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_RapidSpinAway; - effect = TRUE; + if (i == gBattlerAttacker) + continue; + if (GetBattlerHoldEffect(i) == HOLD_EFFECT_RED_CARD) + redCardBattlers |= (1u << i); } - break; - case EFFECT_FELL_STINGER: - if (IsBattlerAlive(gBattlerAttacker) - && !IsBattlerAlive(gBattlerTarget) - && IsBattlerTurnDamaged(gBattlerTarget) - && !NoAliveMonsForEitherParty() - && CompareStat(gBattlerAttacker, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) + if (redCardBattlers && IsBattlerAlive(gBattlerAttacker)) { - SET_STATCHANGER(STAT_ATK, GetGenConfig(GEN_CONFIG_FELL_STINGER_STAT_RAISE) >= GEN_7 ? 3 : 2, FALSE); - PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_FellStingerRaisesStat; - effect = TRUE; + // Since we check if battler was damaged, we don't need to check move result. + // In fact, doing so actually prevents multi-target moves from activating red card properly + u8 battlers[4] = {0, 1, 2, 3}; + SortBattlersBySpeed(battlers, FALSE); + for (i = 0; i < gBattlersCount; i++) + { + u32 battler = battlers[i]; + // Search for fastest hit pokemon with a red card + // Attacker is the one to be switched out, battler is one with red card + if (redCardBattlers & (1u << battler) + && IsBattlerAlive(battler) + && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) + && IsBattlerTurnDamaged(battler) + && CanBattlerSwitch(gBattlerAttacker) + && !(moveEffect == EFFECT_HIT_SWITCH_TARGET && CanBattlerSwitch(battler))) + { + effect = TRUE; + gLastUsedItem = gBattleMons[battler].item; + SaveBattlerTarget(battler); // save battler with red card + SaveBattlerAttacker(gBattlerAttacker); + gBattleScripting.battler = battler; + gEffectBattler = gBattlerAttacker; + BattleScriptPushCursor(); + if (gBattleStruct->battlerState[gBattlerAttacker].commanderSpecies != SPECIES_NONE + || GetBattlerAbility(gBattlerAttacker) == ABILITY_GUARD_DOG + || GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX) + gBattlescriptCurrInstr = BattleScript_RedCardActivationNoSwitch; + else + gBattlescriptCurrInstr = BattleScript_RedCardActivates; + break; // Only fastest red card activates + } + } } - break; - default: - break; } - gBattleScripting.moveendState++; - break; - case MOVEEND_ITEM_EFFECTS_ATTACKER: - if (ItemBattleEffects(ITEMEFFECT_MOVE_END, gBattlerAttacker, FALSE)) - effect = TRUE; - gBattleScripting.moveendState++; - break; - case MOVEEND_ABILITY_BLOCK: - effect = HandleMoveEndAbilityBlock(gBattlerAttacker, gBattlerTarget, gCurrentMove); - gBattleScripting.moveendState++; - break; - case MOVEEND_SHEER_FORCE: - if (TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove)) - gBattleScripting.moveendState = MOVEEND_EJECT_PACK; + if (effect) + gBattleScripting.moveendState = MOVEEND_JUMP_TO_HIT_ESCAPE_PLUS_ONE; else gBattleScripting.moveendState++; break; @@ -7096,6 +6762,9 @@ static void Cmd_moveend(void) break; } + for (u32 i = 0; i < gBattlersCount; i++) + gDisableStructs[i].tryEjectPack = FALSE; + u8 battlers[4] = {0, 1, 2, 3}; if (numEjectButtonBattlers > 1) SortBattlersBySpeed(battlers, FALSE); @@ -7111,44 +6780,120 @@ static void Cmd_moveend(void) gLastUsedItem = gBattleMons[battler].item; effect = TRUE; gBattleStruct->battlerState[battler].usedEjectItem = TRUE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_EjectButtonActivates; + BattleScriptCall(BattleScript_EjectButtonActivates); gAiLogicData->ejectButtonSwitch = TRUE; break; // Only the fastest Eject Button activates } } if (effect) - gBattleScripting.moveendState = MOVEEND_OPPORTUNIST; + gBattleScripting.moveendState = MOVEEND_JUMP_TO_HIT_ESCAPE_PLUS_ONE; else gBattleScripting.moveendState++; break; - case MOVEEND_EJECT_PACK: + case MOVEEND_LIFE_ORB_SHELL_BELL: + if (ItemBattleEffects(gBattlerAttacker, 0, GetBattlerHoldEffect(gBattlerAttacker), IsLifeOrbShellBellActivation)) + effect = TRUE; + gBattleScripting.moveendState++; + break; + case MOVEEND_FORM_CHANGE: + if (TryBattleFormChange(gBattlerAttacker, FORM_CHANGE_BATTLE_AFTER_MOVE)) { - // Because sorting the battlers by speed takes lots of cycles, it's better to just check if any of the battlers has the Eject items. - u32 ejectPackBattlers = 0; - u32 numEjectPackBattlers = 0; + effect = TRUE; + BattleScriptCall(BattleScript_AttackerFormChangeMoveEffect); + } + gBattleScripting.moveendState++; + break; + case MOVEEND_EMERGENCY_EXIT: // Special case, because moves hitting multiple opponents stop after switching out + { + // Because sorting the battlers by speed takes lots of cycles, + // we check if EE can be activated and count how many. + u32 numEmergencyExitBattlers = 0; + u32 emergencyExitBattlers = 0; for (i = 0; i < gBattlersCount; i++) { - if (CanEjectPackTrigger(gBattlerAttacker, i, moveEffect)) + if (IsBattlerTurnDamaged(i) && EmergencyExitCanBeTriggered(i)) { - ejectPackBattlers |= 1u << i; - numEjectPackBattlers++; + emergencyExitBattlers |= 1u << i; + numEmergencyExitBattlers++; } } - if (numEjectPackBattlers == 0) + if (numEmergencyExitBattlers == 0) { gBattleScripting.moveendState++; break; } + for (u32 i = 0; i < gBattlersCount; i++) + gDisableStructs[i].tryEjectPack = FALSE; + u8 battlers[4] = {0, 1, 2, 3}; - if (numEjectPackBattlers > 1) + if (numEmergencyExitBattlers > 1) + SortBattlersBySpeed(battlers, FALSE); + + for (i = 0; i < gBattlersCount; i++) + { + u32 battler = battlers[i]; + + if (!(emergencyExitBattlers & 1u << battler)) + continue; + + effect = TRUE; + gBattleScripting.battler = battler; + + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + BattleScriptCall(BattleScript_EmergencyExit); + else + BattleScriptCall(BattleScript_EmergencyExitWild); + + break; // Only the fastest Emergency Exit / Wimp Out activates + } + } + if (effect) + gBattleScripting.moveendState = MOVEEND_JUMP_TO_HIT_ESCAPE_PLUS_ONE; + else + gBattleScripting.moveendState++; + break; + case MOVEEND_HIT_ESCAPE: + if (moveEffect == EFFECT_HIT_ESCAPE + && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + && IsBattlerTurnDamaged(gBattlerTarget) + && IsBattlerAlive(gBattlerAttacker) + && !NoAliveMonsForBattlerSide(gBattlerTarget)) + { + effect = TRUE; + BattleScriptCall(BattleScript_EffectHitEscape); + } + gBattleScripting.moveendState++; + break; + case MOVEEND_EJECT_PACK: + { + // Because sorting the battlers by speed takes lots of cycles, it's better to just check if any of the battlers has the Eject items. + u32 ejectPackBattlers = 0; + u32 numEjectPackBattlers = 0; + + for (i = 0; i < gBattlersCount; i++) + { + if (CanEjectPackTrigger(gBattlerAttacker, i, moveEffect)) + { + ejectPackBattlers |= 1u << i; + numEjectPackBattlers++; + } + } + + if (numEjectPackBattlers == 0) + { + gBattleScripting.moveendState++; + break; + } + + u8 battlers[4] = {0, 1, 2, 3}; + if (numEjectPackBattlers > 1) SortBattlersBySpeed(battlers, FALSE); for (i = 0; i < gBattlersCount; i++) - gProtectStructs[i].statFell = FALSE; // restore for every possible eject pack battler + gDisableStructs[i].tryEjectPack = FALSE; for (i = 0; i < gBattlersCount; i++) { @@ -7157,104 +6902,73 @@ static void Cmd_moveend(void) if (!(ejectPackBattlers & 1u << battler)) continue; - // Hit escape moves activate before Eject Pack for user - if (moveEffect == EFFECT_HIT_ESCAPE && gBattlerAttacker == battler) - continue; - gBattleScripting.battler = battler; gLastUsedItem = gBattleMons[battler].item; effect = TRUE; gBattleStruct->battlerState[battler].usedEjectItem = TRUE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_EjectPackActivates; + BattleScriptCall(BattleScript_EjectPackActivates); gAiLogicData->ejectPackSwitch = TRUE; break; // Only the fastest Eject item activates } } - if (effect) - gBattleScripting.moveendState = MOVEEND_OPPORTUNIST; - else - gBattleScripting.moveendState++; + gBattleScripting.moveendState++; + break; + + case MOVEEND_ITEMS_EFFECTS_ALL: + while (gBattleStruct->eventState.moveEndBattler < gBattlersCount) + { + u32 battler = gBattleStruct->eventState.moveEndBattler++; + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); + if (ItemBattleEffects(battler, 0, holdEffect, IsOnStatusChangeActivation) + || ItemBattleEffects(battler, 0, holdEffect, IsOnHpThresholdActivation)) + return; + } + gBattleStruct->eventState.moveEndBattler = 0; + gBattleScripting.moveendState++; break; case MOVEEND_WHITE_HERB: - for (i = 0; i < gBattlersCount; i++) + while (gBattleStruct->eventState.moveEndBattler < gBattlersCount) { - if (!IsBattlerAlive(i)) + u32 battler = gBattleStruct->eventState.moveEndBattler++; + if (!IsBattlerAlive(battler)) continue; - if (GetBattlerHoldEffect(i, TRUE) == HOLD_EFFECT_WHITE_HERB - && RestoreWhiteHerbStats(i)) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_WhiteHerbRet; - effect = TRUE; - break; - } + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsWhiteHerbActivation)) + return; } - if (!effect) - gBattleScripting.moveendState++; + gBattleStruct->eventState.moveEndBattler = 0; + gBattleScripting.moveendState++; break; - case MOVEEND_RED_CARD: + case MOVEEND_OPPORTUNIST: + while (gBattleStruct->eventState.moveEndBattler < gBattlersCount) { - u32 redCardBattlers = 0, i; - for (i = 0; i < gBattlersCount; i++) - { - if (i == gBattlerAttacker) - continue; - if (GetBattlerHoldEffect(i, TRUE) == HOLD_EFFECT_RED_CARD) - redCardBattlers |= (1u << i); - } - if (redCardBattlers && IsBattlerAlive(gBattlerAttacker)) - { - // Since we check if battler was damaged, we don't need to check move result. - // In fact, doing so actually prevents multi-target moves from activating red card properly - u8 battlers[4] = {0, 1, 2, 3}; - SortBattlersBySpeed(battlers, FALSE); - for (i = 0; i < gBattlersCount; i++) - { - u32 battler = battlers[i]; - // Search for fastest hit pokemon with a red card - // Attacker is the one to be switched out, battler is one with red card - if (redCardBattlers & (1u << battler) - && IsBattlerAlive(battler) - && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) - && IsBattlerTurnDamaged(battler) - && CanBattlerSwitch(gBattlerAttacker) - && !(moveEffect == EFFECT_HIT_SWITCH_TARGET && CanBattlerSwitch(battler))) - { - effect = TRUE; - gLastUsedItem = gBattleMons[battler].item; - SaveBattlerTarget(battler); // save battler with red card - SaveBattlerAttacker(gBattlerAttacker); - gBattleScripting.battler = battler; - gEffectBattler = gBattlerAttacker; - BattleScriptPushCursor(); - if (gBattleStruct->commanderActive[gBattlerAttacker] != SPECIES_NONE - || GetBattlerAbility(gBattlerAttacker) == ABILITY_GUARD_DOG - || GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX) - gBattlescriptCurrInstr = BattleScript_RedCardActivationNoSwitch; - else - gBattlescriptCurrInstr = BattleScript_RedCardActivates; - break; // Only fastest red card activates - } - } - } + u32 battler = gBattleStruct->eventState.moveEndBattler++; + if (!IsBattlerAlive(battler)) + continue; + if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, battler, GetBattlerAbility(battler), 0, 0)) + return; } - if (effect) - gBattleScripting.moveendState = MOVEEND_OPPORTUNIST; - else - gBattleScripting.moveendState++; + gBattleStruct->eventState.moveEndBattler = 0; + gBattleScripting.moveendState++; break; - case MOVEEND_LIFEORB_SHELLBELL: - if (ItemBattleEffects(ITEMEFFECT_LIFEORB_SHELLBELL, 0, FALSE)) - effect = TRUE; + case MOVEEND_MIRROR_HERB: + while (gBattleStruct->eventState.moveEndBattler < gBattlersCount) + { + u32 battler = gBattleStruct->eventState.moveEndBattler++; + if (!IsBattlerAlive(battler)) + continue; + + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsMirrorHerbActivation)) + return; + } + gBattleStruct->eventState.moveEndBattler = 0; gBattleScripting.moveendState++; break; case MOVEEND_PICKPOCKET: if (IsBattlerAlive(gBattlerAttacker) && gBattleMons[gBattlerAttacker].item != ITEM_NONE // Attacker must be holding an item && !(gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerAttacker)] & (1u << gBattlerPartyIndexes[gBattlerAttacker])) // But not knocked off - && IsMoveMakingContact(gCurrentMove, gBattlerAttacker) // Pickpocket requires contact + && IsMoveMakingContact(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove) // Pickpocket requires contact && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) // Obviously attack needs to have worked { u8 battlers[4] = {0, 1, 2, 3}; @@ -7277,8 +6991,7 @@ static void Cmd_moveend(void) StealTargetItem(gBattlerTarget, gBattlerAttacker); // Target takes attacker's item gEffectBattler = gBattlerAttacker; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_Pickpocket; // Includes sticky hold check to print separate string + BattleScriptCall(BattleScript_Pickpocket); // Includes sticky hold check to print separate string effect = TRUE; break; // Pickpocket activates on fastest mon, so exit loop. } @@ -7286,102 +6999,51 @@ static void Cmd_moveend(void) } gBattleScripting.moveendState++; break; - case MOVEEND_EMERGENCY_EXIT: // Special case, because moves hitting multiple opponents stop after switching out + case MOVEEND_THIRD_MOVE_BLOCK: + switch (moveEffect) { - // Because sorting the battlers by speed takes lots of cycles, - // we check if EE can be activated and cound how many. - u32 numEmergencyExitBattlers = 0; - u32 emergencyExitBattlers = 0; - - for (i = 0; i < gBattlersCount; i++) - { - if (EmergencyExitCanBeTriggered(i)) - { - emergencyExitBattlers |= 1u << i; - numEmergencyExitBattlers++; - } - } - - if (numEmergencyExitBattlers == 0) + case EFFECT_STEEL_ROLLER: + if (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY && IsBattlerTurnDamaged(gBattlerTarget)) { - gBattleScripting.moveendState++; - break; + BattleScriptCall(BattleScript_RemoveTerrain); + effect = TRUE; } - - u8 battlers[4] = {0, 1, 2, 3}; - if (numEmergencyExitBattlers > 1) - SortBattlersBySpeed(battlers, FALSE); - - for (i = 0; i < gBattlersCount; i++) + case EFFECT_ICE_SPINNER: + if (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY + && gLastPrintedMoves[gBattlerAttacker] == gCurrentMove + && IsBattlerAlive(gBattlerAttacker) + && IsBattlerTurnDamaged(gBattlerTarget)) { - u32 battler = battlers[i]; - - if (!(emergencyExitBattlers & 1u << battler)) - continue; - + BattleScriptCall(BattleScript_RemoveTerrain); effect = TRUE; - gBattleScripting.battler = battler; - BattleScriptPushCursor(); - - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER || IsOnPlayerSide(battler)) - gBattlescriptCurrInstr = BattleScript_EmergencyExit; - else - gBattlescriptCurrInstr = BattleScript_EmergencyExitWild; - - break; // Only the fastest Emergency Exit / Wimp Out activates } - } - if (effect) - gBattleScripting.moveendState = MOVEEND_OPPORTUNIST; - else - gBattleScripting.moveendState++; - break; - case MOVEEND_HIT_ESCAPE: - if (moveEffect == EFFECT_HIT_ESCAPE - && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && IsBattlerTurnDamaged(gBattlerTarget) - && IsBattlerAlive(gBattlerAttacker) - && !NoAliveMonsForBattlerSide(gBattlerTarget)) - { - effect = TRUE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_EffectHitEscape; - } - gBattleScripting.moveendState++; - break; - case MOVEEND_OPPORTUNIST: - if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, 0, 0, 0, 0)) - effect = TRUE; // it loops through all battlers, so we increment after its done with all battlers - else - gBattleScripting.moveendState++; - break; - case MOVEEND_SYMBIOSIS: - for (i = 0; i < gBattlersCount; i++) - { - if ((gSpecialStatuses[i].berryReduced - || (B_SYMBIOSIS_GEMS >= GEN_7 && gSpecialStatuses[i].gemBoost)) - && TryTriggerSymbiosis(i, BATTLE_PARTNER(i))) + break; + case EFFECT_NATURAL_GIFT: + if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && GetItemPocket(gBattleMons[gBattlerAttacker].item) == POCKET_BERRIES) { - BestowItem(BATTLE_PARTNER(i), i); - gLastUsedAbility = gBattleMons[BATTLE_PARTNER(i)].ability; - gBattleScripting.battler = gBattlerAbility = BATTLE_PARTNER(i); - gBattlerAttacker = i; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SymbiosisActivates; - effect = TRUE; + u32 item = gBattleMons[gBattlerAttacker].item; + gBattleMons[gBattlerAttacker].item = ITEM_NONE; + gBattleStruct->battlerState[gBattlerAttacker].canPickupItem = TRUE; + GetBattlerPartyState(gBattlerAttacker)->usedHeldItem = item; + CheckSetUnburden(gBattlerAttacker); + BtlController_EmitSetMonData( + gBattlerAttacker, + B_COMM_TO_CONTROLLER, + REQUEST_HELDITEM_BATTLE, + 0, + sizeof(gBattleMons[gBattlerAttacker].item), + &gBattleMons[gBattlerAttacker].item); + MarkBattlerForControllerExec(gBattlerAttacker); + ClearBattlerItemEffectHistory(gBattlerAttacker); + + if (!TrySymbiosis(gBattlerAttacker, item, TRUE)) + effect = TRUE; } + default: + break; } gBattleScripting.moveendState++; break; - case MOVEEND_SAME_MOVE_TURNS: - if (gCurrentMove != gLastResultingMoves[gBattlerAttacker] - || gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT - || gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - gBattleStruct->sameMoveTurns[gBattlerAttacker] = 0; - else if (gCurrentMove == gLastResultingMoves[gBattlerAttacker] && gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_1ST_HIT) - gBattleStruct->sameMoveTurns[gBattlerAttacker]++; - gBattleScripting.moveendState++; - break; case MOVEEND_CHANGED_ITEMS: for (i = 0; i < gBattlersCount; i++) { @@ -7393,6 +7055,13 @@ static void Cmd_moveend(void) } gBattleScripting.moveendState++; break; + case MOVEEND_SAME_MOVE_TURNS: + if (gCurrentMove != gLastResultingMoves[gBattlerAttacker] || (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) || !IsAnyTargetAffected()) + gBattleStruct->metronomeItemCounter[gBattlerAttacker] = 0; + else if (gCurrentMove == gLastResultingMoves[gBattlerAttacker] && gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_1ST_HIT) + gBattleStruct->metronomeItemCounter[gBattlerAttacker]++; + gBattleScripting.moveendState++; + break; case MOVEEND_CLEAR_BITS: // Clear/Set bits for things like using a move for all targets and all hits. if (gSpecialStatuses[gBattlerAttacker].instructedChosenTarget) gBattleStruct->moveTarget[gBattlerAttacker] = gSpecialStatuses[gBattlerAttacker].instructedChosenTarget & 0x3; @@ -7406,45 +7075,32 @@ static void Cmd_moveend(void) if (B_RAMPAGE_CANCELLING >= GEN_5 && MoveHasAdditionalEffectSelf(gCurrentMove, MOVE_EFFECT_THRASH) // If we're rampaging && gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT // And it is unusable - && (gBattleMons[gBattlerAttacker].status2 & STATUS2_LOCK_CONFUSE) != STATUS2_LOCK_CONFUSE_TURN(1)) // And won't end this turn + && gBattleMons[gBattlerAttacker].volatiles.lockConfusionTurns != 1) // And won't end this turn CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_IGNORE); // Cancel it - if (gBattleStruct->savedAttackerCount > 0) - { - // #if TESTING - // Test_ExitWithResult(TEST_RESULT_ERROR, "savedAttackerCount is greater than 0! More calls to SaveBattlerAttacker than RestoreBattlerAttacker!"); - // #else - DebugPrintfLevel(MGBA_LOG_WARN, "savedAttackerCount is greater than 0! More calls to SaveBattlerAttacker than RestoreBattlerAttacker!"); - // #endif - } - if (gBattleStruct->savedTargetCount > 0) - { - // #if TESTING - // Test_ExitWithResult(TEST_RESULT_ERROR, "savedTargetCount is greater than 0! More calls to SaveBattlerTarget than RestoreBattlerTarget!"); - // #else - DebugPrintfLevel(MGBA_LOG_WARN, "savedTargetCount is greater than 0! More calls to SaveBattlerTarget than RestoreBattlerTarget!"); - // #endif - } + TryClearChargeVolatile(moveType); + ValidateSavedBattlerCounts(); gProtectStructs[gBattlerAttacker].shellTrap = FALSE; - gBattleStruct->ateBoost[gBattlerAttacker] = FALSE; - gSpecialStatuses[gBattlerAttacker].gemBoost = FALSE; - gSpecialStatuses[gBattlerTarget].berryReduced = FALSE; - gSpecialStatuses[gBattlerTarget].distortedTypeMatchups = FALSE; - gBattleScripting.moveEffect = 0; - gBattleStruct->isAtkCancelerForCalledMove = FALSE; + gBattleStruct->battlerState[gBattlerAttacker].ateBoost = FALSE; + gBattleScripting.moveEffect = MOVE_EFFECT_NONE; gBattleStruct->swapDamageCategory = FALSE; gBattleStruct->categoryOverride = FALSE; gBattleStruct->additionalEffectsCounter = 0; gBattleStruct->poisonPuppeteerConfusion = FALSE; gBattleStruct->fickleBeamBoosted = FALSE; + gBattleStruct->tryDestinyBond = FALSE; + gBattleStruct->tryGrudge = FALSE; gBattleStruct->battlerState[gBattlerAttacker].usedMicleBerry = FALSE; gBattleStruct->noTargetPresent = FALSE; + gBattleStruct->toxicChainPriority = FALSE; if (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) gBattleStruct->pledgeMove = FALSE; if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE) SetActiveGimmick(gBattlerAttacker, GIMMICK_NONE); - if (B_CHARGE >= GEN_9 && moveType == TYPE_ELECTRIC && (IsBattlerTurnDamaged(gBattlerTarget) || gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) - gStatuses3[gBattlerAttacker] &= ~(STATUS3_CHARGED_UP); + if (gBattleMons[gBattlerAttacker].volatiles.destinyBond > 0) + gBattleMons[gBattlerAttacker].volatiles.destinyBond--; + if (moveEffect == EFFECT_ECHOED_VOICE && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE)) + gBattleStruct->incrementEchoedVoice = TRUE; // check if Stellar type boost should be used up if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA && GetBattlerTeraType(gBattlerAttacker) == TYPE_STELLAR @@ -7456,24 +7112,21 @@ static void Cmd_moveend(void) for (i = 0; i < gBattlersCount; i++) { gBattleStruct->battlerState[gBattlerAttacker].targetsDone[i] = FALSE; + gDisableStructs[i].tryEjectPack = FALSE; - if (gBattleStruct->commanderActive[i] != SPECIES_NONE && !IsBattlerAlive(i)) + if (gBattleStruct->battlerState[i].commanderSpecies != SPECIES_NONE && !IsBattlerAlive(i)) { u32 partner = BATTLE_PARTNER(i); - gBattleStruct->commanderActive[i] = SPECIES_NONE; + gBattleStruct->battlerState[i].commanderSpecies = SPECIES_NONE; if (IsBattlerAlive(partner)) - gStatuses3[partner] &= ~STATUS3_COMMANDER; + gBattleMons[partner].volatiles.semiInvulnerable = STATE_NONE; } } gBattleScripting.moveendState++; break; case MOVEEND_DANCER: - if (gCurrentMove == MOVE_NONE) - originallyUsedMove = gChosenMove; // Fallback to chosen move in case attacker is switched out in the middle of an attack resolution (eg red card) - else - originallyUsedMove = gCurrentMove; - if (IsDanceMove(originallyUsedMove) && !gBattleStruct->snatchedMoveIsUsed) + if (IsDanceMove(gCurrentMove) && !gBattleStruct->snatchedMoveIsUsed) { u32 battler, nextDancer = 0; bool32 hasDancerTriggered = FALSE; @@ -7488,7 +7141,7 @@ static void Cmd_moveend(void) } } - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE) + if (!(!IsAnyTargetAffected() || (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE && !hasDancerTriggered) || (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove && gBattleStruct->bouncedMoveIsUsed))) { // Dance move succeeds @@ -7507,7 +7160,7 @@ static void Cmd_moveend(void) nextDancer = battler | 0x4; } } - if (nextDancer && AbilityBattleEffects(ABILITYEFFECT_MOVE_END_OTHER, nextDancer & 0x3, 0, 0, originallyUsedMove)) + if (nextDancer && AbilityBattleEffects(ABILITYEFFECT_MOVE_END_OTHER, nextDancer & 0x3, 0, 0, gCurrentMove)) effect = TRUE; } } @@ -7556,14 +7209,14 @@ static void Cmd_sethealblock(void) { CMD_ARGS(const u8 *failInstr); - if (gStatuses3[gBattlerTarget] & STATUS3_HEAL_BLOCK) + if (gBattleMons[gBattlerTarget].volatiles.healBlock) { gBattlescriptCurrInstr = cmd->failInstr; } else { - gStatuses3[gBattlerTarget] |= STATUS3_HEAL_BLOCK; - gDisableStructs[gBattlerTarget].healBlockTimer = gBattleTurnCounter + 5; + gBattleMons[gBattlerTarget].volatiles.healBlock = TRUE; + gDisableStructs[gBattlerTarget].healBlockTimer = 5; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -7588,6 +7241,11 @@ static void Cmd_getswitchedmondata(void) if (gBattleControllerExecFlags) return; + if (TESTING + && gBattlerPartyIndexes[battler] == gBattleStruct->monToSwitchIntoId[battler] + && IsBattlerAlive(battler)) + Test_ExitWithResult(TEST_RESULT_ERROR, 0, ":L:%s:%d: battler is trying to switch to themself", __FILE__, __LINE__); + gBattlerPartyIndexes[battler] = gBattleStruct->monToSwitchIntoId[battler]; BtlController_EmitGetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_ALL_BATTLE, 1u << gBattlerPartyIndexes[battler]); @@ -7643,8 +7301,8 @@ static void Cmd_switchindataupdate(void) } } - gBattleMons[battler].types[0] = gSpeciesInfo[gBattleMons[battler].species].types[0]; - gBattleMons[battler].types[1] = gSpeciesInfo[gBattleMons[battler].species].types[1]; + gBattleMons[battler].types[0] = GetSpeciesType(gBattleMons[battler].species, 0); + gBattleMons[battler].types[1] = GetSpeciesType(gBattleMons[battler].species, 1); gBattleMons[battler].types[2] = TYPE_MYSTERY; gBattleMons[battler].ability = GetAbilityBySpecies(gBattleMons[battler].species, gBattleMons[battler].abilityNum); #if TESTING @@ -7670,10 +7328,9 @@ static void Cmd_switchindataupdate(void) { gBattleMons[battler].statStages[i] = oldData.statStages[i]; } - gBattleMons[battler].status2 = oldData.status2; } - SwitchInClearSetData(battler); + SwitchInClearSetData(battler, &oldData.volatiles); if (gBattleTypeFlags & BATTLE_TYPE_PALACE && gBattleMons[battler].maxHP / 2 >= gBattleMons[battler].hp @@ -7701,13 +7358,7 @@ static void Cmd_switchinanim(void) battler = GetBattlerForBattleScript(cmd->battler); - if (!IsOnPlayerSide(battler) - && !(gBattleTypeFlags & (BATTLE_TYPE_LINK - | BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_RECORDED_LINK - | BATTLE_TYPE_TRAINER_HILL - | BATTLE_TYPE_FRONTIER))) - HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[battler].species), FLAG_SET_SEEN, gBattleMons[battler].personality); + GetBattlerPartyState(battler)->sentOut = TRUE; gAbsentBattlerFlags &= ~(1u << battler); @@ -7868,7 +7519,7 @@ static void Cmd_jumpifcantswitch(void) CMD_ARGS(u8 battler:7, u8 ignoreEscapePrevention:1, const u8 *jumpInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (!cmd->ignoreEscapePrevention && !CanBattlerEscape(battler)) + if (!cmd->ignoreEscapePrevention && !CanBattlerEscape(battler) && GetBattlerHoldEffect(battler) != HOLD_EFFECT_SHED_SHELL) { gBattlescriptCurrInstr = cmd->jumpInstr; } @@ -7890,7 +7541,7 @@ static void ChooseMonToSendOut(u32 battler, u8 slotId) gBattleStruct->monToSwitchIntoId[battler] = PARTY_SIZE; gBattleStruct->field_93 &= ~(1u << battler); - BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_SEND_OUT, slotId, ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_SEND_OUT, slotId, ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[battler]); MarkBattlerForControllerExec(battler); } @@ -7940,7 +7591,7 @@ static void Cmd_openpartyscreen(void) { if (((1u << i) & hitmarkerFaintBits)) { - u32 skipPartnerCheck = FALSE; + bool32 skipPartnerCheck = FALSE; if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && GetBattlerSide(i) == B_SIDE_OPPONENT && TRAINER_BATTLE_PARAM.opponentB != TRAINER_NONE) @@ -8068,7 +7719,7 @@ static void Cmd_openpartyscreen(void) gBattleStruct->monToSwitchIntoId[battler] = PARTY_SIZE; gBattleStruct->field_93 &= ~(1u << battler); - BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, hitmarkerFaintBits, gBattleStruct->monToSwitchIntoId[BATTLE_PARTNER(battler)], ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, hitmarkerFaintBits, gBattleStruct->monToSwitchIntoId[BATTLE_PARTNER(battler)], ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[battler]); MarkBattlerForControllerExec(battler); gBattlescriptCurrInstr = cmd->nextInstr; @@ -8172,24 +7823,6 @@ static void Cmd_switchhandleorder(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void SetDmgHazardsBattlescript(u8 battler, u8 multistringId) -{ - gBattleMons[battler].status2 &= ~STATUS2_DESTINY_BOND; - gHitMarker &= ~HITMARKER_DESTINYBOND; - gBattleScripting.battler = battler; - gBattleCommunication[MULTISTRING_CHOOSER] = multistringId; - - BattleScriptPushCursor(); - if (gBattlescriptCurrInstr[1] == BS_TARGET) - gBattlescriptCurrInstr = BattleScript_DmgHazardsOnTarget; - else if (gBattlescriptCurrInstr[1] == BS_ATTACKER) - gBattlescriptCurrInstr = BattleScript_DmgHazardsOnAttacker; - else if (gBattlescriptCurrInstr[1] == BS_SCRIPTING) - gBattlescriptCurrInstr = BattleScript_DmgHazardsOnBattlerScripting; - else - gBattlescriptCurrInstr = BattleScript_DmgHazardsOnFaintedBattler; -} - bool32 DoSwitchInAbilities(u32 battler) { return (TryPrimalReversion(battler) @@ -8204,138 +7837,170 @@ static void UpdateSentMonFlags(u32 battler) gHitMarker &= ~HITMARKER_FAINTED(battler); gSpecialStatuses[battler].faintedHasReplacement = FALSE; +} + +static void SetDmgHazardsBattlescript(u8 battler, u8 multistringId) +{ + gBattleScripting.battler = battler; + gBattleCommunication[MULTISTRING_CHOOSER] = multistringId; - if (!BattlerHasAi(battler)) - gBattleStruct->appearedInBattle |= 1u << gBattlerPartyIndexes[battler]; + if (gBattlescriptCurrInstr[1] == BS_TARGET) + BattleScriptCall(BattleScript_DmgHazardsOnTarget); + else if (gBattlescriptCurrInstr[1] == BS_ATTACKER) + BattleScriptCall(BattleScript_DmgHazardsOnAttacker); + else if (gBattlescriptCurrInstr[1] == BS_SCRIPTING) + BattleScriptCall(BattleScript_DmgHazardsOnBattlerScripting); + else + BattleScriptCall(BattleScript_DmgHazardsOnFaintedBattler); } -static bool32 DoSwitchInEffectsForBattler(u32 battler) +void TryHazardsOnSwitchIn(u32 battler, u32 side, enum Hazards hazardType) { - u32 i = 0; - // Neutralizing Gas announces itself before hazards - if (gBattleMons[battler].ability == ABILITY_NEUTRALIZING_GAS && gSpecialStatuses[battler].announceNeutralizingGas == 0) + switch (hazardType) { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_NEUTRALIZING_GAS; - gSpecialStatuses[battler].announceNeutralizingGas = TRUE; - gDisableStructs[battler].neutralizingGas = TRUE; - gBattlerAbility = battler; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SwitchInAbilityMsgRet; - } - // Healing Wish activates before hazards. - // Starting from Gen8 - it heals only pokemon which can be healed. In gens 5,6,7 the effect activates anyways. - else if ((gBattleStruct->battlerState[battler].storedHealingWish || gBattleStruct->battlerState[battler].storedLunarDance) - && (gBattleMons[battler].hp != gBattleMons[battler].maxHP || gBattleMons[battler].status1 != 0 || B_HEALING_WISH_SWITCH < GEN_8)) + case HAZARDS_NONE: + break; + case HAZARDS_SPIKES: { - gBattlerAttacker = battler; - if (gBattleStruct->battlerState[battler].storedHealingWish) + enum Ability ability = GetBattlerAbility(battler); + if (ability != ABILITY_MAGIC_GUARD + && IsBattlerAffectedByHazards(battler, FALSE) + && IsBattlerGrounded(battler, ability, GetBattlerHoldEffect(battler))) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_HealingWishActivates; - gBattleStruct->battlerState[battler].storedHealingWish = FALSE; + s32 spikesDmg = GetNonDynamaxMaxHP(battler) / ((5 - gSideTimers[side].spikesAmount) * 2); + SetPassiveDamageAmount(battler, spikesDmg); + SetDmgHazardsBattlescript(battler, B_MSG_PKMNHURTBYSPIKES); } - else // Lunar Dance + break; + } + case HAZARDS_STICKY_WEB: + if (IsBattlerAffectedByHazards(battler, FALSE) && IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler))) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_LunarDanceActivates; - gBattleStruct->battlerState[battler].storedLunarDance = FALSE; + gBattleScripting.battler = battler; + SET_STATCHANGER(STAT_SPEED, 1, TRUE); + BattleScriptCall(BattleScript_StickyWebOnSwitchIn); } - } - else if (!(gDisableStructs[battler].spikesDone) - && (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SPIKES) - && GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD - && IsBattlerAffectedByHazards(battler, FALSE) - && IsBattlerGrounded(battler)) - { - u8 spikesDmg = (5 - gSideTimers[GetBattlerSide(battler)].spikesAmount) * 2; - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (spikesDmg); - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - - gDisableStructs[battler].spikesDone = TRUE; - SetDmgHazardsBattlescript(battler, B_MSG_PKMNHURTBYSPIKES); - } - else if (!(gDisableStructs[battler].stealthRockDone) - && (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_STEALTH_ROCK) - && IsBattlerAffectedByHazards(battler, FALSE) - && GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD) - { - gDisableStructs[battler].stealthRockDone = TRUE; - gBattleStruct->moveDamage[battler] = GetStealthHazardDamage(TYPE_SIDE_HAZARD_POINTED_STONES, battler); + break; + case HAZARDS_TOXIC_SPIKES: + if (!IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler))) + break; - if (gBattleStruct->moveDamage[battler] != 0) - SetDmgHazardsBattlescript(battler, B_MSG_STEALTHROCKDMG); - } - else if (!(gDisableStructs[battler].toxicSpikesDone) - && (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_TOXIC_SPIKES) - && IsBattlerGrounded(battler)) - { - gDisableStructs[battler].toxicSpikesDone = TRUE; if (IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) // Absorb the toxic spikes. { - gSideStatuses[GetBattlerSide(battler)] &= ~SIDE_STATUS_TOXIC_SPIKES; + gBattleStruct->hazardsCounter--; // reduce counter so the next hazard can be applied gSideTimers[GetBattlerSide(battler)].toxicSpikesAmount = 0; - gBattleScripting.battler = battler; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ToxicSpikesAbsorbed; + RemoveHazardFromField(side, HAZARDS_TOXIC_SPIKES); + gEffectBattler = battler; + BattleScriptCall(BattleScript_ToxicSpikesAbsorbed); } - else if (IsBattlerAffectedByHazards(battler, TRUE)) + else if (IsBattlerAffectedByHazards(battler, TRUE) + && CanBePoisoned(battler, battler, GetBattlerAbility(battler), GetBattlerAbility(battler))) { - if (CanBePoisoned(gBattlerAttacker, battler, GetBattlerAbility(gBattlerAttacker), GetBattlerAbility(battler))) + gBattleScripting.battler = battler; + BattleScriptPushCursor(); + if (gSideTimers[GetBattlerSide(battler)].toxicSpikesAmount >= 2) { - gBattleScripting.battler = battler; - BattleScriptPushCursor(); - if (gSideTimers[GetBattlerSide(battler)].toxicSpikesAmount >= 2) - { - gBattlescriptCurrInstr = BattleScript_ToxicSpikesBadlyPoisoned; - gBattleMons[battler].status1 |= STATUS1_TOXIC_POISON; - } - else - { - gBattlescriptCurrInstr = BattleScript_ToxicSpikesPoisoned; - gBattleMons[battler].status1 |= STATUS1_POISON; - } - - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[battler].status1), &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); + gBattlescriptCurrInstr = BattleScript_ToxicSpikesBadlyPoisoned; + gBattleMons[battler].status1 |= STATUS1_TOXIC_POISON; + } + else + { + gBattlescriptCurrInstr = BattleScript_ToxicSpikesPoisoned; + gBattleMons[battler].status1 |= STATUS1_POISON; } + + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[battler].status1), &gBattleMons[battler].status1); + MarkBattlerForControllerExec(battler); + } + break; + case HAZARDS_STEALTH_ROCK: + if (IsBattlerAffectedByHazards(battler, FALSE) && GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD) + { + gBattleStruct->passiveHpUpdate[battler] = GetStealthHazardDamage(TYPE_SIDE_HAZARD_POINTED_STONES, battler); + if (gBattleStruct->passiveHpUpdate[battler] != 0) + SetDmgHazardsBattlescript(battler, B_MSG_STEALTHROCKDMG); } + break; + case HAZARDS_STEELSURGE: + if (IsBattlerAffectedByHazards(battler, FALSE) && GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD) + { + gBattleStruct->passiveHpUpdate[battler] = GetStealthHazardDamage(TYPE_SIDE_HAZARD_SHARP_STEEL, battler); + if (gBattleStruct->passiveHpUpdate[battler] != 0) + SetDmgHazardsBattlescript(battler, B_MSG_SHARPSTEELDMG); + } + break; + case HAZARDS_MAX_COUNT: + break; } - else if (!(gDisableStructs[battler].stickyWebDone) - && (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_STICKY_WEB) - && IsBattlerAffectedByHazards(battler, FALSE) - && IsBattlerGrounded(battler)) +} + +static bool32 DoSwitchInEffectsForBattler(u32 battler) +{ + u32 i = 0; + u32 side = GetBattlerSide(battler); + // Neutralizing Gas announces itself before hazards + if (AbilityBattleEffects(ABILITYEFFECT_NEUTRALIZINGGAS, battler, 0, 0, 0)) { - gDisableStructs[battler].stickyWebDone = TRUE; - gBattleScripting.battler = battler; - SET_STATCHANGER(STAT_SPEED, 1, TRUE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_StickyWebOnSwitchIn; + return TRUE; } - else if (!(gDisableStructs[battler].steelSurgeDone) - && (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_STEELSURGE) - && IsBattlerAffectedByHazards(battler, FALSE) - && GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD) + // Healing Wish and Lunar Dance activate before hazards. + // Starting from Gen8 - it heals only pokemon which can be healed. + // In Gen5-7 the effect activates anyways. + else if ((gBattleStruct->battlerState[battler].storedHealingWish) + && (GetConfig(CONFIG_HEALING_WISH_SWITCH) < GEN_8 + || gBattleMons[battler].hp != gBattleMons[battler].maxHP + || gBattleMons[battler].status1 != 0)) { - gDisableStructs[battler].steelSurgeDone = TRUE; - gBattleStruct->moveDamage[battler] = GetStealthHazardDamage(TYPE_SIDE_HAZARD_SHARP_STEEL, battler); - - if (gBattleStruct->moveDamage[battler] != 0) - SetDmgHazardsBattlescript(battler, B_MSG_SHARPSTEELDMG); + gBattlerAttacker = battler; + BattleScriptCall(BattleScript_HealingWishActivates); + gBattleStruct->battlerState[battler].storedHealingWish = FALSE; + } + else if ((gBattleStruct->battlerState[battler].storedLunarDance) + && (GetConfig(CONFIG_HEALING_WISH_SWITCH) < GEN_8 + || gBattleMons[battler].hp != gBattleMons[battler].maxHP + || gBattleMons[battler].status1 != 0 + || gBattleMons[battler].pp[0] < CalculatePPWithBonus(gBattleMons[battler].moves[0], gBattleMons[battler].ppBonuses, 0) + || gBattleMons[battler].pp[1] < CalculatePPWithBonus(gBattleMons[battler].moves[1], gBattleMons[battler].ppBonuses, 1) + || gBattleMons[battler].pp[2] < CalculatePPWithBonus(gBattleMons[battler].moves[2], gBattleMons[battler].ppBonuses, 2) + || gBattleMons[battler].pp[3] < CalculatePPWithBonus(gBattleMons[battler].moves[3], gBattleMons[battler].ppBonuses, 3))) + { + gBattlerAttacker = battler; + BattleScriptCall(BattleScript_LunarDanceActivates); + gBattleStruct->battlerState[battler].storedLunarDance = FALSE; + } + else if (EmergencyExitCanBeTriggered(battler)) + { + gBattleScripting.battler = gBattlerAbility = battler; + gSpecialStatuses[battler].switchInItemDone = FALSE; + gBattleStruct->battlerState[battler].forcedSwitch = FALSE; + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + BattleScriptCall(BattleScript_EmergencyExit); + else + BattleScriptCall(BattleScript_EmergencyExitWild); + } + else if (!gDisableStructs[battler].hazardsDone) + { + TryHazardsOnSwitchIn(battler, side, gBattleStruct->hazardsQueue[side][gBattleStruct->hazardsCounter]); + gBattleStruct->hazardsCounter++; + // Done once we reach the first element without any hazard type or the array is full + if (gBattleStruct->hazardsQueue[side][gBattleStruct->hazardsCounter] == HAZARDS_NONE + || gBattleStruct->hazardsCounter == HAZARDS_MAX_COUNT) + { + gDisableStructs[battler].hazardsDone = TRUE; + gBattleStruct->hazardsCounter = 0; + } } else if (gBattleMons[battler].hp != gBattleMons[battler].maxHP && gBattleStruct->zmove.healReplacement) { gBattleStruct->zmove.healReplacement = FALSE; - gBattleStruct->moveDamage[battler] = -1 * (gBattleMons[battler].maxHP); + SetHealAmount(battler, gBattleMons[battler].maxHP); gBattleScripting.battler = battler; - BattleScriptPushCursor(); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_Z_HP_TRAP; - gBattlescriptCurrInstr = BattleScript_HealReplacementZMove; - return TRUE; + BattleScriptCall(BattleScript_HealReplacementZMove); } else { - u32 battlerAbility = GetBattlerAbility(battler); + enum Ability battlerAbility = GetBattlerAbility(battler); // There is a hack here to ensure the truant counter will be 0 when the battler's next turn starts. // The truant counter is not updated in the case where a mon switches in after a lost judgment in the battle arena. if (battlerAbility == ABILITY_TRUANT @@ -8345,9 +8010,10 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) gDisableStructs[battler].truantSwitchInHack = 0; - if (DoSwitchInAbilities(battler) || ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, battler, FALSE)) + if (DoSwitchInAbilities(battler)) return TRUE; - else if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, battler, 0, 0, 0)) + + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsOnSwitchInActivation)) return TRUE; for (i = 0; i < gBattlersCount; i++) @@ -8355,29 +8021,42 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) if (i == battler) continue; - switch (GetBattlerAbility(i)) + enum Ability ability = GetBattlerAbility(i); + switch (ability) { case ABILITY_TRACE: case ABILITY_COMMANDER: - if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, i, 0, 0, 0)) + if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, i, ability, 0, 0)) return TRUE; break; case ABILITY_FORECAST: case ABILITY_FLOWER_GIFT: case ABILITY_PROTOSYNTHESIS: - if (AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, i, 0, 0, 0)) + if (AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, i, ability, 0, 0)) return TRUE; break; + default: + break; } if (TryClearIllusion(i, ABILITYEFFECT_ON_SWITCHIN)) return TRUE; } - gDisableStructs[battler].stickyWebDone = FALSE; - gDisableStructs[battler].spikesDone = FALSE; - gDisableStructs[battler].toxicSpikesDone = FALSE; - gDisableStructs[battler].stealthRockDone = FALSE; - gDisableStructs[battler].steelSurgeDone = FALSE; + for (i = 0; i < gBattlersCount; i++) + { + if (ItemBattleEffects(i, 0, GetBattlerHoldEffect(i), IsWhiteHerbActivation)) + return TRUE; + } + for (i = 0; i < gBattlersCount; i++) + { + if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, i, GetBattlerAbility(i), 0, 0)) + return TRUE; + } + for (i = 0; i < gBattlersCount; i++) + { + if (ItemBattleEffects(i, 0, GetBattlerHoldEffect(i), IsMirrorHerbActivation)) + return TRUE; + } for (i = 0; i < gBattlersCount; i++) { @@ -8387,7 +8066,9 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) gBattleStruct->hpOnSwitchout[GetBattlerSide(i)] = gBattleMons[i].hp; } + gSpecialStatuses[battler].switchInItemDone = FALSE; gBattleStruct->battlerState[battler].forcedSwitch = FALSE; + gBattleStruct->battlerState[battler].wasAboveHalfHp = FALSE; return FALSE; } @@ -8438,6 +8119,8 @@ static void Cmd_switchineffects(void) return; } } + if (TrySwitchInEjectPack(OTHER)) + return; // All battlers done, end for (i = 0; i < gBattlersCount; i++) gBattleStruct->battlerState[i].multipleSwitchInBattlers = FALSE; @@ -8448,7 +8131,7 @@ static void Cmd_switchineffects(void) break; default: UpdateSentMonFlags(battler); - if (!DoSwitchInEffectsForBattler(battler)) + if (!DoSwitchInEffectsForBattler(battler) && !TrySwitchInEjectPack(OTHER)) gBattlescriptCurrInstr = cmd->nextInstr; break; } @@ -8568,7 +8251,7 @@ static void Cmd_handlelearnnewmove(void) u32 battler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); if (gBattlerPartyIndexes[battler] == monId - && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) + && !(gBattleMons[battler].volatiles.transformed)) { GiveMoveToBattleMon(&gBattleMons[battler], learnMove); } @@ -8576,7 +8259,7 @@ static void Cmd_handlelearnnewmove(void) { battler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); if (gBattlerPartyIndexes[battler] == monId - && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) + && !(gBattleMons[battler].volatiles.transformed)) { GiveMoveToBattleMon(&gBattleMons[battler], learnMove); } @@ -8659,7 +8342,7 @@ static void Cmd_yesnoboxlearnmove(void) else { u16 move = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MOVE1 + movePosition); - if (IsMoveHM(move)) + if (CannotForgetMove(move)) { PrepareStringBattle(STRINGID_HMMOVESCANTBEFORGOTTEN, B_POSITION_PLAYER_LEFT); gBattleScripting.learnMoveState = 6; @@ -8751,6 +8434,7 @@ static void Cmd_yesnoboxstoplearningmove(void) } } +// TODO: passive damage hit anim for sub static void Cmd_hitanimation(void) { CMD_ARGS(u8 battler); @@ -8761,7 +8445,7 @@ static void Cmd_hitanimation(void) if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT)) { - if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) + if (gBattleStruct->passiveHpUpdate[battler] > 0 || !(DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove)) || gDisableStructs[battler].substituteHP == 0) { @@ -8776,11 +8460,10 @@ static void Cmd_hitanimation(void) for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { if (gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT - || gBattleStruct->noResultString[battlerDef]) + || gBattleStruct->noResultString[battlerDef] != CAN_DAMAGE) continue; - if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) - || !(DoesSubstituteBlockMove(gBattlerAttacker, battlerDef, gCurrentMove)) + if (!(DoesSubstituteBlockMove(gBattlerAttacker, battlerDef, gCurrentMove)) || gDisableStructs[battlerDef].substituteHP == 0) { BtlController_EmitHitAnimation(battlerDef, B_COMM_TO_CONTROLLER); @@ -8965,9 +8648,9 @@ static void Cmd_hidepartystatussummary(void) static void ResetValuesForCalledMove(void) { if (gBattlerByTurnOrder[gCurrentTurnActionNumber] != gBattlerAttacker) - gBattleStruct->atkCancellerTracker = 0; + gBattleStruct->eventState.atkCanceler = 0; else - SetAtkCancellerForCalledMove(); + gBattleStruct->eventState.atkCanceler = CANCELER_VOLATILE_BLOCKED; gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; SetTypeBeforeUsingMove(gCurrentMove, gBattlerAttacker); @@ -8991,58 +8674,29 @@ static void Cmd_jumptocalledmove(void) static void Cmd_statusanimation(void) { - CMD_ARGS(u8 battler); + CMD_ARGS(u8 battler, u32 status, bool8 isVolatile); if (gBattleControllerExecFlags == 0) { - u32 battler = GetBattlerForBattleScript(cmd->battler); - if (!(gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE) + u32 battler = GetBattlerForBattleScript(cmd->battler), + statusFlag = (cmd->isVolatile || cmd->status) ? cmd->status : gBattleMons[battler].status1; + if (!IsSemiInvulnerable(battler, CHECK_ALL) && gDisableStructs[battler].substituteHP == 0 && !(gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION))) { - BtlController_EmitStatusAnimation(battler, B_COMM_TO_CONTROLLER, FALSE, gBattleMons[battler].status1); + BtlController_EmitStatusAnimation(battler, B_COMM_TO_CONTROLLER, cmd->isVolatile, statusFlag); MarkBattlerForControllerExec(battler); } gBattlescriptCurrInstr = cmd->nextInstr; } } -static void Cmd_status2animation(void) +static void Cmd_unused_0x65(void) { - CMD_ARGS(u8 battler, u32 status2); - - if (gBattleControllerExecFlags == 0) - { - u32 battler = GetBattlerForBattleScript(cmd->battler); - u32 status2ToAnim = cmd->status2; - if (!(gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE) - && gDisableStructs[battler].substituteHP == 0 - && !(gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION))) - { - BtlController_EmitStatusAnimation(battler, B_COMM_TO_CONTROLLER, TRUE, gBattleMons[battler].status2 & status2ToAnim); - MarkBattlerForControllerExec(battler); - } - gBattlescriptCurrInstr = cmd->nextInstr; - } } -static void Cmd_chosenstatusanimation(void) +static void Cmd_unused_0x66(void) { - CMD_ARGS(u8 battler, bool8 isStatus2, u32 status); - - if (gBattleControllerExecFlags == 0) - { - u32 battler = GetBattlerForBattleScript(cmd->battler); - u32 wantedStatus = cmd->status; - if (!(gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE) - && gDisableStructs[battler].substituteHP == 0 - && !(gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION))) - { - BtlController_EmitStatusAnimation(battler, B_COMM_TO_CONTROLLER, cmd->isStatus2, wantedStatus); - MarkBattlerForControllerExec(battler); - } - gBattlescriptCurrInstr = cmd->nextInstr; - } } static void Cmd_yesnobox(void) @@ -9113,7 +8767,7 @@ static void Cmd_setgravity(void) else { gFieldStatuses |= STATUS_FIELD_GRAVITY; - gFieldTimers.gravityTimer = gBattleTurnCounter + 5; + gFieldTimers.gravityTimer = 5; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -9122,17 +8776,12 @@ static bool32 TryCheekPouch(u32 battler, u32 itemId) { if (GetItemPocket(itemId) == POCKET_BERRIES && GetBattlerAbility(battler) == ABILITY_CHEEK_POUCH - && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK) - && gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].ateBerry + && !gBattleMons[battler].volatiles.healBlock + && GetBattlerPartyState(battler)->ateBerry && !IsBattlerAtMaxHp(battler)) { - gBattleStruct->cheekPouchActivated = TRUE; - gBattleStruct->savedcheekPouchDamage = gBattleStruct->moveDamage[battler]; - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 3; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; gBattlerAbility = battler; + SetHealAmount(battler, GetNonDynamaxMaxHP(battler) / 3); BattleScriptPush(gBattlescriptCurrInstr + 2); gBattlescriptCurrInstr = BattleScript_CheekPouchActivates; return TRUE; @@ -9140,16 +8789,6 @@ static bool32 TryCheekPouch(u32 battler, u32 itemId) return FALSE; } -// When Cheek Pouch activates mid-battle it overwrites the current damage, so restore it -static void TryRestoreDamageAfterCheekPouch(u32 battler) -{ - if (gBattleStruct->cheekPouchActivated) - { - gBattleStruct->moveDamage[battler] = gBattleStruct->savedcheekPouchDamage; - gBattleStruct->cheekPouchActivated = FALSE; - } -} - // Used by Bestow and Symbiosis to take an item from one battler and give to another. static void BestowItem(u32 battlerAtk, u32 battlerDef) { @@ -9167,21 +8806,25 @@ static void BestowItem(u32 battlerAtk, u32 battlerDef) } // Called by Cmd_removeitem. itemId represents the item that was removed, not being given. -static bool32 TrySymbiosis(u32 battler, u32 itemId) +static bool32 TrySymbiosis(u32 battler, u32 itemId, bool32 moveEnd) { if (!gBattleStruct->itemLost[B_SIDE_PLAYER][gBattlerPartyIndexes[battler]].stolen && gBattleStruct->changedItems[battler] == ITEM_NONE - && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_EJECT_BUTTON - && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_EJECT_PACK - && (B_SYMBIOSIS_GEMS < GEN_7 || !(gSpecialStatuses[battler].gemBoost)) - && gCurrentMove != MOVE_FLING //Fling and damage-reducing berries are handled separately. + && GetBattlerHoldEffect(battler) != HOLD_EFFECT_EJECT_BUTTON + && GetBattlerHoldEffect(battler) != HOLD_EFFECT_EJECT_PACK + && (GetConfig(CONFIG_SYMBIOSIS_GEMS) < GEN_7 || !(gSpecialStatuses[battler].gemBoost)) + && GetMoveEffect(gCurrentMove) != EFFECT_FLING //Fling and damage-reducing berries are handled separately. && !gSpecialStatuses[battler].berryReduced && TryTriggerSymbiosis(battler, BATTLE_PARTNER(battler))) { BestowItem(BATTLE_PARTNER(battler), battler); gLastUsedAbility = gBattleMons[BATTLE_PARTNER(battler)].ability; + gEffectBattler = battler; gBattleScripting.battler = gBattlerAbility = BATTLE_PARTNER(battler); - BattleScriptPush(gBattlescriptCurrInstr + 2); + if (moveEnd) + BattleScriptPushCursor(); + else + BattleScriptPush(gBattlescriptCurrInstr + 2); gBattlescriptCurrInstr = BattleScript_SymbiosisActivates; return TRUE; } @@ -9207,9 +8850,9 @@ static void Cmd_removeitem(void) // Popped Air Balloon cannot be restored by any means. // Corroded items cannot be restored either. - if (GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_AIR_BALLOON - && GetMoveEffect(gCurrentMove) != EFFECT_CORROSIVE_GAS) - gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)] = itemId; // Remember if switched out + if (GetBattlerHoldEffect(battler) != HOLD_EFFECT_AIR_BALLOON + && GetMoveEffect(gCurrentMove) != EFFECT_CORROSIVE_GAS) + GetBattlerPartyState(battler)->usedHeldItem = itemId; // Remember if switched out gBattleMons[battler].item = ITEM_NONE; gBattleStruct->battlerState[battler].canPickupItem = TRUE; @@ -9219,7 +8862,7 @@ static void Cmd_removeitem(void) MarkBattlerForControllerExec(battler); ClearBattlerItemEffectHistory(battler); - if (!TryCheekPouch(battler, itemId) && !TrySymbiosis(battler, itemId)) + if (!TryCheekPouch(battler, itemId) && !TrySymbiosis(battler, itemId, FALSE)) gBattlescriptCurrInstr = cmd->nextInstr; } @@ -9636,18 +9279,18 @@ static void Cmd_useitemonopponent(void) bool32 CanUseLastResort(u8 battler) { - u32 i; - u32 knownMovesCount = 0, usedMovesCount = 0; - - for (i = 0; i < 4; i++) + u32 moveIndex; + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (gBattleMons[battler].moves[i] != MOVE_NONE) - knownMovesCount++; - if (i != gCurrMovePos && gDisableStructs[battler].usedMoves & (1u << i)) // Increment used move count for all moves except current Last Resort. - usedMovesCount++; + u32 move = gBattleMons[battler].moves[moveIndex]; + // Assumes that an empty slot cannot have a non-empty slot after it + if (move == MOVE_NONE) + break; + // If not Last Resort and has not been used, can't use Last Resort + if (GetMoveEffect(move) != EFFECT_LAST_RESORT && !(gDisableStructs[battler].usedMoves & (1u << moveIndex))) + return FALSE; } - - return (knownMovesCount >= 2 && usedMovesCount >= knownMovesCount - 1); + return moveIndex >= 2; // At least two usable moves that are either Last Resort or have been used } static void RemoveAllWeather(void) @@ -9708,8 +9351,7 @@ static void RemoveAllTerrains(void) PREPARE_MOVE_BUFFER(gBattleTextBuff1, move);\ *sideStatuses &= ~status; \ sideTimer->structField = 0; \ - BattleScriptPushCursor(); \ - gBattlescriptCurrInstr = battlescript; \ + BattleScriptCall(battlescript); \ } \ else \ { \ @@ -9719,6 +9361,32 @@ static void RemoveAllTerrains(void) } \ } +static bool32 DefogClearHazards(u32 saveBattler, u32 side, bool32 clear) +{ + if (!AreAnyHazardsOnSide(side)) + return FALSE; + + for (u32 hazardType = HAZARDS_NONE + 1; hazardType < HAZARDS_MAX_COUNT; hazardType++) + { + bool32 checkOrClear = clear ? IsHazardOnSideAndClear(side, hazardType) : IsHazardOnSide(side, hazardType); + if (checkOrClear) + { + if (clear) + { + gBattleStruct->numHazards[side]--; + gBattleCommunication[MULTISTRING_CHOOSER] = hazardType; + BattleScriptCall(BattleScript_DefogClearHazards); + } + else + { + gBattlerAttacker = saveBattler; + } + return TRUE; + } + } + return FALSE; +} + static bool32 TryDefogClear(u32 battlerAtk, bool32 clear) { s32 i; @@ -9738,27 +9406,28 @@ static bool32 TryDefogClear(u32 battlerAtk, bool32 clear) DEFOG_CLEAR(SIDE_STATUS_AURORA_VEIL, auroraVeilTimer, BattleScript_SideStatusWoreOffReturn, MOVE_AURORA_VEIL); DEFOG_CLEAR(SIDE_STATUS_SAFEGUARD, safeguardTimer, BattleScript_SideStatusWoreOffReturn, MOVE_SAFEGUARD); } - if (B_DEFOG_EFFECT_CLEARING >= GEN_6) + if (GetConfig(CONFIG_DEFOG_EFFECT_CLEARING) >= GEN_6) { gBattlerAttacker = i; // For correct battle string. Ally's / Foe's - DEFOG_CLEAR(SIDE_STATUS_SPIKES, spikesAmount, BattleScript_SpikesDefog, 0); - DEFOG_CLEAR(SIDE_STATUS_STEALTH_ROCK, stealthRockAmount, BattleScript_StealthRockDefog, 0); - DEFOG_CLEAR(SIDE_STATUS_TOXIC_SPIKES, toxicSpikesAmount, BattleScript_ToxicSpikesDefog, 0); - DEFOG_CLEAR(SIDE_STATUS_STICKY_WEB, stickyWebAmount, BattleScript_StickyWebDefog, 0); - DEFOG_CLEAR(SIDE_STATUS_STEELSURGE, steelsurgeAmount, BattleScript_SteelsurgeDefog, 0); + if (DefogClearHazards(saveBattler, i, clear)) + return TRUE; } if (gBattleWeather & B_WEATHER_FOG) { - gBattleWeather &= ~B_WEATHER_FOG; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_FogEnded_Ret; + if (clear) + { + gBattleWeather &= ~B_WEATHER_FOG; + BattleScriptCall(BattleScript_FogEnded_Ret); + } return TRUE; } - if (B_DEFOG_EFFECT_CLEARING >= GEN_8 && (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) + if (GetConfig(CONFIG_DEFOG_EFFECT_CLEARING) >= GEN_8 && (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) { - RemoveAllTerrains(); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TerrainEnds_Ret; + if (clear) + { + RemoveAllTerrains(); + BattleScriptCall(BattleScript_TerrainEnds_Ret); + } return TRUE; } } @@ -9775,27 +9444,21 @@ static bool32 TryTidyUpClear(u32 battlerAtk, bool32 clear) for (i = 0; i < NUM_BATTLE_SIDES; i++) { - struct SideTimer *sideTimer = &gSideTimers[i]; - u32 *sideStatuses = &gSideStatuses[i]; - gBattlerAttacker = i; // For correct battle string. Ally's / Foe's - DEFOG_CLEAR(SIDE_STATUS_SPIKES, spikesAmount, BattleScript_SpikesDefog, 0); - DEFOG_CLEAR(SIDE_STATUS_STEALTH_ROCK, stealthRockAmount, BattleScript_StealthRockDefog, 0); - DEFOG_CLEAR(SIDE_STATUS_TOXIC_SPIKES, toxicSpikesAmount, BattleScript_ToxicSpikesDefog, 0); - DEFOG_CLEAR(SIDE_STATUS_STICKY_WEB, stickyWebAmount, BattleScript_StickyWebDefog, 0); + if (DefogClearHazards(saveBattler, i, clear)) + return TRUE; } for (i = 0; i < MAX_BATTLERS_COUNT; i++) { - if (gBattleMons[i].status2 & STATUS2_SUBSTITUTE) + if (gBattleMons[i].volatiles.substitute) { if (clear) { gBattlerTarget = i; gDisableStructs[i].substituteHP = 0; - gBattleMons[i].status2 &= ~STATUS2_SUBSTITUTE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SubstituteFade; + gBattleMons[i].volatiles.substitute = FALSE; + BattleScriptCall(BattleScript_SubstituteFade); } gBattlerAttacker = saveBattler; return TRUE; @@ -9814,7 +9477,7 @@ u32 IsFlowerVeilProtected(u32 battler) return 0; } -u32 IsLeafGuardProtected(u32 battler, u32 ability) +u32 IsLeafGuardProtected(u32 battler, enum Ability ability) { if (IsBattlerWeatherAffected(battler, B_WEATHER_SUN)) return ability == ABILITY_LEAF_GUARD; @@ -9822,54 +9485,35 @@ u32 IsLeafGuardProtected(u32 battler, u32 ability) return 0; } -bool32 IsShieldsDownProtected(u32 battler, u32 ability) +bool32 IsShieldsDownProtected(u32 battler, enum Ability ability) { return (ability == ABILITY_SHIELDS_DOWN && GetFormIdFromFormSpeciesId(gBattleMons[battler].species) < GetFormIdFromFormSpeciesId(SPECIES_MINIOR_CORE_RED)); // Minior is not in core form } -u32 IsAbilityStatusProtected(u32 battler, u32 ability) +u32 IsAbilityStatusProtected(u32 battler, enum Ability ability) { return IsLeafGuardProtected(battler, ability) || IsShieldsDownProtected(battler, ability) || IsFlowerVeilProtected(battler); } -u32 GetHighestStatId(u32 battler) -{ - u32 i, highestId = STAT_ATK, highestStat = gBattleMons[battler].attack; - - for (i = STAT_DEF; i < NUM_STATS; i++) - { - u16 *statVal = &gBattleMons[battler].attack + (i - 1); - if (*statVal > highestStat && i != STAT_SPEED) - { - highestStat = *statVal; - highestId = i; - } - } - if (gBattleMons[battler].speed > highestStat) - highestId = STAT_SPEED; - - return highestId; -} - static bool32 IsRototillerAffected(u32 battler) { if (!IsBattlerAlive(battler)) return FALSE; - if (!IsBattlerGrounded(battler)) + if (!IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler))) return FALSE; // Only grounded battlers affected if (!IS_BATTLER_OF_TYPE(battler, TYPE_GRASS)) return FALSE; // Only grass types affected - if (gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE) + if (IsSemiInvulnerable(battler, CHECK_ALL)) return FALSE; // Rototiller doesn't affected semi-invulnerable battlers if (BlocksPrankster(MOVE_ROTOTILLER, gBattlerAttacker, battler, FALSE)) return FALSE; return TRUE; } -static bool32 IsElectricAbilityAffected(u32 battler, u32 ability) +static bool32 IsElectricAbilityAffected(u32 battler, enum Ability ability) { u32 moveType; @@ -9881,7 +9525,7 @@ static bool32 IsElectricAbilityAffected(u32 battler, u32 ability) moveType = GetMoveType(gCurrentMove); if (moveType == TYPE_ELECTRIC - && (ability != ABILITY_LIGHTNING_ROD || B_REDIRECT_ABILITY_IMMUNITY >= GEN_5) + && (ability != ABILITY_LIGHTNING_ROD || GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) >= GEN_5) && GetBattlerAbility(battler) == ability) return TRUE; else @@ -9892,7 +9536,7 @@ static bool32 IsTeatimeAffected(u32 battler) { if (GetItemPocket(gBattleMons[battler].item) != POCKET_BERRIES) return FALSE; // Only berries - if (gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE) + if (IsSemiInvulnerable(battler, CHECK_ALL)) return FALSE; // Teatime doesn't affected semi-invulnerable battlers return TRUE; } @@ -9935,17 +9579,23 @@ void BS_CourtChangeSwapSideStatuses(void) COURTCHANGE_SWAP(SIDE_STATUS_TAILWIND, tailwindTimer, temp); // Lucky Chant doesn't exist in gen 8, but seems like it should be affected by Court Change COURTCHANGE_SWAP(SIDE_STATUS_LUCKY_CHANT, luckyChantTimer, temp); - COURTCHANGE_SWAP(SIDE_STATUS_SPIKES, spikesAmount, temp); - COURTCHANGE_SWAP(SIDE_STATUS_STEALTH_ROCK, stealthRockAmount, temp); - COURTCHANGE_SWAP(SIDE_STATUS_TOXIC_SPIKES, toxicSpikesAmount, temp); - COURTCHANGE_SWAP(SIDE_STATUS_STICKY_WEB, stickyWebAmount, temp); - COURTCHANGE_SWAP(SIDE_STATUS_STEELSURGE, steelsurgeAmount, temp); COURTCHANGE_SWAP(SIDE_STATUS_DAMAGE_NON_TYPES, damageNonTypesTimer, temp); // Track Pledge effect side COURTCHANGE_SWAP(SIDE_STATUS_RAINBOW, rainbowTimer, temp); COURTCHANGE_SWAP(SIDE_STATUS_SEA_OF_FIRE, seaOfFireTimer, temp); COURTCHANGE_SWAP(SIDE_STATUS_SWAMP, swampTimer, temp); + // Hazards + u32 tempQueue[HAZARDS_MAX_COUNT] = {HAZARDS_NONE}; + for (u32 i = 0; i < HAZARDS_MAX_COUNT; i++) + tempQueue[i] = gBattleStruct->hazardsQueue[B_SIDE_PLAYER][i]; + for (u32 i = 0; i < HAZARDS_MAX_COUNT; i++) + gBattleStruct->hazardsQueue[B_SIDE_PLAYER][i] = gBattleStruct->hazardsQueue[B_SIDE_OPPONENT][i]; + for (u32 i = 0; i < HAZARDS_MAX_COUNT; i++) + gBattleStruct->hazardsQueue[B_SIDE_OPPONENT][i] = tempQueue[i]; + SWAP(sideTimerPlayer->spikesAmount, sideTimerOpp->spikesAmount, temp); + SWAP(sideTimerPlayer->toxicSpikesAmount, sideTimerOpp->toxicSpikesAmount, temp); + // Change battler IDs of swapped effects. Needed for the correct string when they expire UPDATE_COURTCHANGED_BATTLER(stickyWebBattlerId); @@ -9999,25 +9649,27 @@ static bool32 ChangeOrderTargetAfterAttacker(void) u32 i; u8 data[MAX_BATTLERS_COUNT]; u8 actionsData[MAX_BATTLERS_COUNT]; + u32 attackerTurnOrderNum = GetBattlerTurnOrderNum(gBattlerAttacker); + u32 targetTurnOrderNum = GetBattlerTurnOrderNum(gBattlerTarget); - if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) + if (attackerTurnOrderNum > targetTurnOrderNum) return FALSE; - if (GetBattlerTurnOrderNum(gBattlerAttacker) + 1 == GetBattlerTurnOrderNum(gBattlerTarget)) - return B_AFTER_YOU_TURN_ORDER >= GEN_8; + if (attackerTurnOrderNum + 1 == targetTurnOrderNum) + return GetConfig(CONFIG_AFTER_YOU_TURN_ORDER) >= GEN_8; for (i = 0; i < MAX_BATTLERS_COUNT; i++) { data[i] = gBattlerByTurnOrder[i]; actionsData[i] = gActionsByTurnOrder[i]; } - if (GetBattlerTurnOrderNum(gBattlerAttacker) == 0 && GetBattlerTurnOrderNum(gBattlerTarget) == 2) + if (attackerTurnOrderNum == 0 && targetTurnOrderNum == 2) { gBattlerByTurnOrder[1] = gBattlerTarget; gActionsByTurnOrder[1] = actionsData[2]; gBattlerByTurnOrder[2] = data[1]; gActionsByTurnOrder[2] = actionsData[1]; } - else if (GetBattlerTurnOrderNum(gBattlerAttacker) == 0 && GetBattlerTurnOrderNum(gBattlerTarget) == 3) + else if (attackerTurnOrderNum == 0 && targetTurnOrderNum == 3) { gBattlerByTurnOrder[1] = gBattlerTarget; gActionsByTurnOrder[1] = actionsData[3]; @@ -10026,7 +9678,7 @@ static bool32 ChangeOrderTargetAfterAttacker(void) gBattlerByTurnOrder[3] = data[2]; gActionsByTurnOrder[3] = actionsData[2]; } - else // Attacker == 1, Target == 3 + else // attackerTurnOrderNum == 1, targetTurnOrderNum == 3 { gBattlerByTurnOrder[2] = gBattlerTarget; gActionsByTurnOrder[2] = actionsData[3]; @@ -10036,1963 +9688,1970 @@ static bool32 ChangeOrderTargetAfterAttacker(void) return TRUE; } -static void Cmd_various(void) +static void Cmd_unused_0x78(void) { - CMD_ARGS(u8 battler, u8 id); +} - struct Pokemon *mon; - s32 i; - u8 data[10]; - u32 battler, bits; - enum CmdVarious variousId = cmd->id; +static void TryResetProtectUseCounter(u32 battler) +{ + u32 lastMove = gLastResultingMoves[battler]; + enum BattleMoveEffects lastEffect = GetMoveEffect(lastMove); + if (lastMove == MOVE_UNAVAILABLE + || (!gBattleMoveEffects[lastEffect].usesProtectCounter + && ((GetConfig(CONFIG_ALLY_SWITCH_FAIL_CHANCE) >= GEN_9 && lastEffect != EFFECT_ALLY_SWITCH) + || GetConfig(CONFIG_ALLY_SWITCH_FAIL_CHANCE) < GEN_9))) + gDisableStructs[battler].protectUses = 0; +} - if (gBattleControllerExecFlags) - return; +static void Cmd_setprotectlike(void) +{ + CMD_ARGS(); - battler = GetBattlerForBattleScript(cmd->battler); + bool32 protectFails = TRUE; + bool32 notLastTurn = TRUE; + u32 protectMethod = GetMoveProtectMethod(gCurrentMove); - switch (variousId) - { - // Roar will fail in a double wild battle when used by the player against one of the two alive wild mons. - // Also when an opposing wild mon uses it againt its partner. - // Also when B_FLAG_NO_RUNNING is enabled. - case VARIOUS_JUMP_IF_ROAR_FAILS: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if (WILD_DOUBLE_BATTLE - && IsOnPlayerSide(gBattlerAttacker) - && !IsOnPlayerSide(gBattlerTarget) - && IS_WHOLE_SIDE_ALIVE(gBattlerTarget)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else if (WILD_DOUBLE_BATTLE - && !IsOnPlayerSide(gBattlerAttacker) - && !IsOnPlayerSide(gBattlerTarget)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else if (FlagGet(B_FLAG_NO_RUNNING)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_JUMP_IF_ABSENT: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if (!IsBattlerAlive(battler)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED: + TryResetProtectUseCounter(gBattlerAttacker); + + if (IsLastMonToMove(gBattlerAttacker)) + notLastTurn = FALSE; + + if ((sProtectSuccessRates[gDisableStructs[gBattlerAttacker].protectUses] >= RandomUniform(RNG_PROTECT_FAIL, 0, USHRT_MAX) && notLastTurn) + || (protectMethod == PROTECT_WIDE_GUARD && GetConfig(CONFIG_WIDE_GUARD) >= GEN_6) + || (protectMethod == PROTECT_QUICK_GUARD && GetConfig(CONFIG_QUICK_GUARD) >= GEN_6)) { - VARIOUS_ARGS(const u8 *jumpInstr); - if (IsShieldsDownProtected(battler, GetBattlerAbility(battler))) - { - gBattlerAbility = battler; - gBattlescriptCurrInstr = cmd->jumpInstr; - } - else + if (GetMoveEffect(gCurrentMove) == EFFECT_ENDURE) { - gBattlescriptCurrInstr = cmd->nextInstr; + gDisableStructs[gBattlerAttacker].endured = TRUE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BRACED_ITSELF; } - return; - } - case VARIOUS_JUMP_IF_HOLD_EFFECT: - { - VARIOUS_ARGS(u8 holdEffect, const u8 *jumpInstr, u8 equal); - if ((GetBattlerHoldEffect(battler, TRUE) == cmd->holdEffect) == cmd->equal) + else if (GetProtectType(protectMethod) == PROTECT_TYPE_SIDE) { - if (cmd->equal) - gLastUsedItem = gBattleMons[battler].item; // For B_LAST_USED_ITEM - gBattlescriptCurrInstr = cmd->jumpInstr; + gProtectStructs[gBattlerAttacker].protected = protectMethod; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECTED_TEAM; } else { - if (!cmd->equal) - gLastUsedItem = gBattleMons[battler].item; // For B_LAST_USED_ITEM - gBattlescriptCurrInstr = cmd->nextInstr; + gProtectStructs[gBattlerAttacker].protected = protectMethod; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECTED_ITSELF; } - return; - } - case VARIOUS_JUMP_IF_NO_ALLY: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if (!IsBattlerAlive(BATTLE_PARTNER(battler))) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_INFATUATE_WITH_BATTLER: - { - VARIOUS_ARGS(u8 infatuateWith); - gBattleScripting.battler = battler; - gBattleMons[battler].status2 |= STATUS2_INFATUATED_WITH(GetBattlerForBattleScript(cmd->infatuateWith)); - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_SET_LAST_USED_ITEM: - { - VARIOUS_ARGS(); - gLastUsedItem = gBattleMons[battler].item; - break; + + gDisableStructs[gBattlerAttacker].protectUses++; + protectFails = FALSE; } - case VARIOUS_TRY_FAIRY_LOCK: + + if (protectFails) { - VARIOUS_ARGS(const u8 *failInstr); - if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - gFieldStatuses |= STATUS_FIELD_FAIRY_LOCK; - gFieldTimers.fairyLockTimer = gBattleTurnCounter + 2; - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; + gDisableStructs[gBattlerAttacker].protectUses = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECT_FAILED; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + gBattleStruct->battlerState[gBattlerAttacker].stompingTantrumTimer = 2; } - case VARIOUS_GET_STAT_VALUE: - { - VARIOUS_ARGS(u8 stat); - i = cmd->stat; - gBattleStruct->moveDamage[gBattlerAttacker] = *(u16 *)(&gBattleMons[battler].attack) + (i - 1); - gBattleStruct->moveDamage[gBattlerAttacker] *= gStatStageRatios[gBattleMons[battler].statStages[i]][0]; - gBattleStruct->moveDamage[gBattlerAttacker] /= gStatStageRatios[gBattleMons[battler].statStages[i]][1]; - gBattlescriptCurrInstr = cmd->nextInstr; + + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void Cmd_tryexplosion(void) +{ + CMD_ARGS(); + + if (gBattleControllerExecFlags) return; - } - case VARIOUS_JUMP_IF_FULL_HP: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if (IsBattlerAtMaxHp(battler)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; + + gBattleStruct->passiveHpUpdate[gBattlerAttacker] = gBattleMons[gBattlerAttacker].hp; + BtlController_EmitHealthBarUpdate(gBattlerAttacker, B_COMM_TO_CONTROLLER, INSTANT_HP_BAR_DROP); + MarkBattlerForControllerExec(gBattlerAttacker); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void Cmd_setatkhptozero(void) +{ + CMD_ARGS(); + + if (gBattleControllerExecFlags) return; - } - case VARIOUS_TRY_FRISK: - { - VARIOUS_ARGS(); - while (gBattleStruct->friskedBattler < gBattlersCount) - { - gBattlerTarget = gBattleStruct->friskedBattler++; - if (!IsBattlerAlly(battler, gBattlerTarget) - && IsBattlerAlive(gBattlerTarget) - && gBattleMons[gBattlerTarget].item != ITEM_NONE) - { - gLastUsedItem = gBattleMons[gBattlerTarget].item; - RecordItemEffectBattle(gBattlerTarget, GetBattlerHoldEffect(gBattlerTarget, FALSE)); - BattleScriptPushCursor(); - // If Frisk identifies two mons' items, show the pop-up only once. - if (gBattleStruct->friskedAbility) - { - gBattlescriptCurrInstr = BattleScript_FriskMsg; - } - else - { - gBattleStruct->friskedAbility = TRUE; - gBattlescriptCurrInstr = BattleScript_FriskMsgWithPopup; - } - return; - } - } - gBattleStruct->friskedBattler = 0; - gBattleStruct->friskedAbility = FALSE; - break; - } - case VARIOUS_TRACE_ABILITY: - { - VARIOUS_ARGS(); - gBattleMons[battler].ability = gDisableStructs[battler].overwrittenAbility = gBattleStruct->tracedAbility[battler]; - break; - } - case VARIOUS_TRY_ILLUSION_OFF: + + gBattleMons[gBattlerAttacker].hp = 0; + BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[gBattlerAttacker].hp), &gBattleMons[gBattlerAttacker].hp); + MarkBattlerForControllerExec(gBattlerAttacker); + + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void Cmd_jumpifnexttargetvalid(void) +{ + CMD_ARGS(const u8 *jumpInstr); + + const u8 *jumpInstr = cmd->jumpInstr; + + for (gBattlerTarget++; gBattlerTarget < gBattlersCount; gBattlerTarget++) { - VARIOUS_ARGS(); - if (TryClearIllusion(battler, ABILITYEFFECT_MOVE_END)) - return; - break; + if (gBattlerTarget == gBattlerAttacker && !(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove) & MOVE_TARGET_USER)) + continue; + if (IsBattlerAlive(gBattlerTarget)) + break; } - case VARIOUS_SET_SPRITEIGNORE0HP: + + if (gBattlerTarget >= gBattlersCount) { - VARIOUS_ARGS(bool8 ignore0HP); - gBattleStruct->spriteIgnore0Hp = cmd->ignore0HP; + gBattlerTarget = gBattlersCount - 1; gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_UPDATE_NICK: - { - VARIOUS_ARGS(); - if (IsOnPlayerSide(battler)) - mon = GetBattlerMon(battler); - else - mon = GetBattlerMon(battler); - UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], mon, HEALTHBOX_NICK); - break; } - case VARIOUS_JUMP_IF_NOT_BERRY: + else { - VARIOUS_ARGS(const u8 *jumpInstr); - if (GetItemPocket(gBattleMons[battler].item) == POCKET_BERRIES) - gBattlescriptCurrInstr = cmd->nextInstr; - else - gBattlescriptCurrInstr = cmd->jumpInstr; - return; + gBattlescriptCurrInstr = jumpInstr; } - case VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS: - { - VARIOUS_ARGS(const u8 *failInstr); - if ((gStatuses3[battler] & (STATUS3_SEMI_INVULNERABLE | STATUS3_HEAL_BLOCK)) - || IsBattlerAtMaxHp(battler) - || !gBattleMons[battler].hp - || !(IsBattlerGrounded(battler))) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; +} - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; - } - case VARIOUS_GRAVITY_ON_AIRBORNE_MONS: - { - VARIOUS_ARGS(); - // Cancel all multiturn moves of IN_AIR Pokemon except those being targeted by Sky Drop. - if (gStatuses3[battler] & STATUS3_ON_AIR && !(gStatuses3[battler] & STATUS3_SKY_DROPPED)) - CancelMultiTurnMoves(battler, SKY_DROP_GRAVITY_ON_AIRBORNE); +static void Cmd_tryhealhalfhealth(void) +{ + CMD_ARGS(u8 battler, const u8 *failInstr); - gStatuses3[battler] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS | STATUS3_ON_AIR | STATUS3_SKY_DROPPED); - break; - } - case VARIOUS_SET_POWDER: - { - VARIOUS_ARGS(); - gBattleMons[battler].status2 |= STATUS2_POWDER; - break; - } - case VARIOUS_ACUPRESSURE: - { - VARIOUS_ARGS(const u8 *failInstr); - bits = 0; - for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) - { - if (CompareStat(battler, i, MAX_STAT_STAGE, CMP_LESS_THAN)) - bits |= 1u << i; - } - if (bits) - { - u32 statId; - do - { - statId = (Random() % (NUM_BATTLE_STATS - 1)) + 1; - } while (!(bits & (1u << statId))); + const u8 *failInstr = cmd->failInstr; - SET_STATCHANGER(statId, 2, FALSE); - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } + if (cmd->battler == BS_ATTACKER) + gBattlerTarget = gBattlerAttacker; + + SetHealAmount(gBattlerTarget, GetNonDynamaxMaxHP(gBattlerTarget) / 2); + if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) + gBattlescriptCurrInstr = failInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void Cmd_unused_0x7e(void) +{ +} + +static void Cmd_setfieldweather(void) +{ + CMD_ARGS(u8 weather); + + u8 battleWeatherId = cmd->weather; + + if (!TryChangeBattleWeather(gBattlerAttacker, battleWeatherId, ABILITY_NONE)) + { + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_FAILED; + gBattlescriptCurrInstr = cmd->nextInstr; return; } - case VARIOUS_CANCEL_MULTI_TURN_MOVES: + + switch (battleWeatherId) { - VARIOUS_ARGS(); - const u8 *result; - result = CancelMultiTurnMoves(battler, SKY_DROP_CANCEL_MULTI_TURN_MOVES); - if (result) - { - gBattlescriptCurrInstr = result; - return; - } + case BATTLE_WEATHER_RAIN: + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_RAIN; break; - } - case VARIOUS_IS_RUNNING_IMPOSSIBLE: - { - VARIOUS_ARGS(); - gBattleCommunication[0] = IsRunningFromBattleImpossible(battler); + case BATTLE_WEATHER_SUN: + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SUNLIGHT; break; - } - case VARIOUS_GET_MOVE_TARGET: - { - VARIOUS_ARGS(); - gBattlerTarget = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); + case BATTLE_WEATHER_SANDSTORM: + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SANDSTORM; break; - } - case VARIOUS_GET_BATTLER_FAINTED: - { - VARIOUS_ARGS(); - if (gHitMarker & HITMARKER_FAINTED(battler)) - gBattleCommunication[0] = TRUE; - else - gBattleCommunication[0] = FALSE; + case BATTLE_WEATHER_HAIL: + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_HAIL; break; - } - case VARIOUS_RESET_SWITCH_IN_ABILITY_BITS: - { - VARIOUS_ARGS(); - gSpecialStatuses[battler].switchInAbilityDone = FALSE; + case BATTLE_WEATHER_SNOW: + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SNOW; break; } - case VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP: - { - VARIOUS_ARGS(); - if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId || gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId) - { - if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId) - battler = 0; - else - battler = 2; - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBattleMons[battler].moves[i] == gBattleStruct->choicedMove[battler]) - break; - } - if (i == MAX_MON_MOVES) - gBattleStruct->choicedMove[battler] = MOVE_NONE; - } - break; - } - case VARIOUS_RESET_PLAYER_FAINTED: - { - VARIOUS_ARGS(); - if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE)) - && gBattleTypeFlags & BATTLE_TYPE_TRAINER - && IsBattlerAlive(B_POSITION_PLAYER_LEFT) - && IsBattlerAlive(B_POSITION_OPPONENT_LEFT)) - { - gHitMarker &= ~HITMARKER_PLAYER_FAINTED; - } - break; - } - case VARIOUS_PALACE_FLAVOR_TEXT: + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void Cmd_setreflect(void) +{ + CMD_ARGS(); + if (!TrySetReflect(gBattlerAttacker)) { - VARIOUS_ARGS(); - // Try and print end-of-turn Battle Palace flavor text (e.g. "A glint appears in mon's eyes") - gBattleCommunication[0] = FALSE; // whether or not msg should be printed - gBattleScripting.battler = battler = gBattleCommunication[1]; - if (!(gBattleStruct->palaceFlags & (1u << battler)) - && gBattleMons[battler].maxHP / 2 >= gBattleMons[battler].hp - && IsBattlerAlive(battler) - && !(gBattleMons[battler].status1 & STATUS1_SLEEP)) - { - gBattleStruct->palaceFlags |= 1u << battler; - gBattleCommunication[0] = TRUE; - gBattleCommunication[MULTISTRING_CHOOSER] = gNaturesInfo[GetNatureFromPersonality(gBattleMons[battler].personality)].battlePalaceFlavorText; - } - break; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED; } - case VARIOUS_ARENA_JUDGMENT_WINDOW: - { - VARIOUS_ARGS(); - i = BattleArena_ShowJudgmentWindow(&gBattleCommunication[0]); + gBattlescriptCurrInstr = cmd->nextInstr; +} - // BattleArena_ShowJudgmentWindow's last state was an intermediate step. - // Return without advancing the current instruction so that it will be called again. - if (i == ARENA_RESULT_RUNNING) - return; +static void Cmd_setseeded(void) +{ + CMD_ARGS(); - gBattleCommunication[1] = i; - break; - } - case VARIOUS_ARENA_OPPONENT_MON_LOST: + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT || gBattleMons[gBattlerTarget].volatiles.leechSeed) { - VARIOUS_ARGS(); - gBattleMons[1].hp = 0; - gHitMarker |= HITMARKER_FAINTED(1); - gBattleStruct->arenaLostOpponentMons |= 1u << gBattlerPartyIndexes[1]; - gDisableStructs[1].truantSwitchInHack = 1; - break; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_MISS; } - case VARIOUS_ARENA_PLAYER_MON_LOST: + else if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_GRASS)) { - VARIOUS_ARGS(); - gBattleMons[0].hp = 0; - gHitMarker |= HITMARKER_FAINTED(0); - gHitMarker |= HITMARKER_PLAYER_FAINTED; - gBattleStruct->arenaLostPlayerMons |= 1u << gBattlerPartyIndexes[0]; - gDisableStructs[0].truantSwitchInHack = 1; - break; - } - case VARIOUS_ARENA_BOTH_MONS_LOST: - { - VARIOUS_ARGS(); - gBattleMons[0].hp = 0; - gBattleMons[1].hp = 0; - gHitMarker |= HITMARKER_FAINTED(0); - gHitMarker |= HITMARKER_FAINTED(1); - gHitMarker |= HITMARKER_PLAYER_FAINTED; - gBattleStruct->arenaLostPlayerMons |= 1u << gBattlerPartyIndexes[0]; - gBattleStruct->arenaLostOpponentMons |= 1u << gBattlerPartyIndexes[1]; - gDisableStructs[0].truantSwitchInHack = 1; - gDisableStructs[1].truantSwitchInHack = 1; - break; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_FAIL; } - case VARIOUS_EMIT_YESNOBOX: + else { - VARIOUS_ARGS(); - BtlController_EmitYesNoBox(battler, B_COMM_TO_CONTROLLER); - MarkBattlerForControllerExec(battler); - break; + gBattleMons[gBattlerTarget].volatiles.leechSeed = LEECHSEEDED_BY(gBattlerAttacker); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_SET; } - case VARIOUS_DRAW_ARENA_REF_TEXT_BOX: + + gBattlescriptCurrInstr = cmd->nextInstr; +} + +// TODO: Needs tests for everything +static void Cmd_manipulatedamage(void) +{ + CMD_ARGS(u8 mode); + + switch (cmd->mode) { - VARIOUS_ARGS(); - DrawArenaRefereeTextBox(); + case DMG_CHANGE_SIGN: + gBattleStruct->passiveHpUpdate[gBattlerAttacker] *= -1; break; - } - case VARIOUS_ERASE_ARENA_REF_TEXT_BOX: - { - VARIOUS_ARGS(); - EraseArenaRefereeTextBox(); + case DMG_1_8_TARGET_HP: + SetPassiveDamageAmount(gBattlerTarget, GetNonDynamaxMaxHP(gBattlerTarget) / 8); break; - } - case VARIOUS_ARENA_JUDGMENT_STRING: - { - CMD_ARGS(u8 id, u8 _); - BattleStringExpandPlaceholdersToDisplayedString(gRefereeStringsTable[cmd->id]); - BattlePutTextOnWindow(gDisplayedStringBattle, ARENA_WIN_JUDGMENT_TEXT); + case DMG_FULL_ATTACKER_HP: + gBattleStruct->passiveHpUpdate[gBattlerTarget] = GetNonDynamaxMaxHP(gBattlerAttacker); break; - } - case VARIOUS_ARENA_WAIT_STRING: - { - VARIOUS_ARGS(); - if (IsTextPrinterActive(ARENA_WIN_JUDGMENT_TEXT)) - return; + case DMG_BIG_ROOT: + gBattleStruct->passiveHpUpdate[gBattlerAttacker] = -1 * GetDrainedBigRootHp(gBattlerAttacker, gBattleStruct->passiveHpUpdate[gBattlerAttacker]); break; } - case VARIOUS_WAIT_CRY: + + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void Cmd_trysetrest(void) +{ + CMD_ARGS(); + + gBattlerTarget = gBattlerAttacker; + SetHealAmount(gBattlerTarget, gBattleMons[gBattlerTarget].maxHP); + enum Ability ability = GetBattlerAbility(gBattlerTarget); + enum HoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); + + if (IsBattlerTerrainAffected(gBattlerTarget, ability, holdEffect, STATUS_FIELD_ELECTRIC_TERRAIN)) { - VARIOUS_ARGS(); - if (!IsCryFinished()) - return; - break; + gBattlescriptCurrInstr = BattleScript_ElectricTerrainPrevents; } - case VARIOUS_RETURN_OPPONENT_MON1: + else if (IsBattlerTerrainAffected(gBattlerTarget, ability, holdEffect, STATUS_FIELD_MISTY_TERRAIN)) { - VARIOUS_ARGS(); - battler = 1; - if (IsBattlerAlive(battler)) - { - BtlController_EmitReturnMonToBall(battler, B_COMM_TO_CONTROLLER, FALSE); - MarkBattlerForControllerExec(battler); - } - break; + gBattlescriptCurrInstr = BattleScript_MistyTerrainPrevents; } - case VARIOUS_RETURN_OPPONENT_MON2: + else { - VARIOUS_ARGS(); - if (gBattlersCount > 3) - { - battler = 3; - if (IsBattlerAlive(battler)) - { - BtlController_EmitReturnMonToBall(battler, B_COMM_TO_CONTROLLER, FALSE); - MarkBattlerForControllerExec(battler); - } - } - break; + if (gBattleMons[gBattlerTarget].status1 & ((u8)(~STATUS1_SLEEP))) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_REST_STATUSED; + else + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_REST; + + gBattleMons[gBattlerTarget].status1 = STATUS1_SLEEP_TURN(3); + BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); + MarkBattlerForControllerExec(gBattlerTarget); + gBattlescriptCurrInstr = cmd->nextInstr; } - case VARIOUS_VOLUME_DOWN: +} + +static void Cmd_unused_0x82(void) +{ +} + +static void Cmd_unused_0x83(void) +{ +} + +bool8 UproarWakeUpCheck(u8 battler) +{ + s32 i; + bool32 hasSoundproof = (B_UPROAR_IGNORE_SOUNDPROOF < GEN_5 && GetBattlerAbility(battler) == ABILITY_SOUNDPROOF); + + for (i = 0; i < gBattlersCount; i++) { - VARIOUS_ARGS(); - m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x55); + if (!(gBattleMons[i].volatiles.uproarTurns) || hasSoundproof) + continue; + + gBattleScripting.battler = i; + + if (gBattlerTarget == 0xFF) + gBattlerTarget = i; + else if (gBattlerTarget == i) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CANT_SLEEP_UPROAR; + else + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_KEPT_AWAKE; + break; } - case VARIOUS_VOLUME_UP: + + if (i == gBattlersCount) + return FALSE; + else + return TRUE; +} + +static void Cmd_jumpifuproarwakes(void) +{ + CMD_ARGS(const u8 *jumpInstr); + + if (UproarWakeUpCheck(gBattlerTarget)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void Cmd_stockpile(void) +{ + CMD_ARGS(u8 id); + + switch (cmd->id) { - VARIOUS_ARGS(); - m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); + case 0: + gDisableStructs[gBattlerAttacker].stockpileCounter++; + gDisableStructs[gBattlerAttacker].stockpileBeforeDef = gBattleMons[gBattlerAttacker].statStages[STAT_DEF]; + gDisableStructs[gBattlerAttacker].stockpileBeforeSpDef = gBattleMons[gBattlerAttacker].statStages[STAT_SPDEF]; + PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[gBattlerAttacker].stockpileCounter); break; - } - case VARIOUS_SET_ALREADY_STATUS_MOVE_ATTEMPT: - { - VARIOUS_ARGS(); - gBattleStruct->battlerState[battler].alreadyStatusedMoveAttempt = TRUE; + case 1: // Save def/sp def stats. + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) + { + gDisableStructs[gBattlerAttacker].stockpileDef += gBattleMons[gBattlerAttacker].statStages[STAT_DEF] - gDisableStructs[gBattlerAttacker].stockpileBeforeDef; + gDisableStructs[gBattlerAttacker].stockpileSpDef += gBattleMons[gBattlerAttacker].statStages[STAT_SPDEF] - gDisableStructs[gBattlerAttacker].stockpileBeforeSpDef; + } break; } - case VARIOUS_PALACE_TRY_ESCAPE_STATUS: + + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void Cmd_stockpiletobasedamage(void) +{ + CMD_ARGS(); + + if (gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED) + gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; + + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void Cmd_stockpiletohpheal(void) +{ + CMD_ARGS(const u8 *failInstr); + + const u8 *failInstr = cmd->failInstr; + + if (gBattleMons[gBattlerAttacker].maxHP == gBattleMons[gBattlerAttacker].hp) { - VARIOUS_ARGS(); - if (BattlePalace_TryEscapeStatus(battler)) - return; - break; + gDisableStructs[gBattlerAttacker].stockpileCounter = 0; + gBattlescriptCurrInstr = failInstr; + gBattlerTarget = gBattlerAttacker; } - case VARIOUS_SET_TELEPORT_OUTCOME: + else { - VARIOUS_ARGS(); - // Don't end the battle if one of the wild mons teleported from the wild double battle - // and its partner is still alive. - if (!IsOnPlayerSide(battler) && IsBattlerAlive(BATTLE_PARTNER(battler))) + if (gDisableStructs[gBattlerAttacker].stockpileCounter > 0) { - gAbsentBattlerFlags |= 1u << battler; - gHitMarker |= HITMARKER_FAINTED(battler); - gBattleMons[battler].hp = 0; - SetMonData(GetBattlerMon(battler), MON_DATA_HP, &gBattleMons[battler].hp); - SetHealthboxSpriteInvisible(gHealthboxSpriteIds[battler]); - FaintClearSetData(battler); - } - else if (IsOnPlayerSide(battler)) - { - gBattleOutcome = B_OUTCOME_PLAYER_TELEPORTED; + SetHealAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / (1 << (3 - gDisableStructs[gBattlerAttacker].stockpileCounter))); + gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; } - else + else // Snatched move { - gBattleOutcome = B_OUTCOME_MON_TELEPORTED; + SetHealAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 4); + gBattleScripting.animTurn = 1; } - break; - } - case VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC: - { - VARIOUS_ARGS(); - BtlController_EmitPlayFanfareOrBGM(battler, B_COMM_TO_CONTROLLER, MUS_VICTORY_TRAINER, TRUE); - MarkBattlerForControllerExec(battler); - break; - } - case VARIOUS_STAT_TEXT_BUFFER: - { - VARIOUS_ARGS(); - PREPARE_STAT_BUFFER(gBattleTextBuff1, gBattleCommunication[0]); - break; + + gBattlescriptCurrInstr = cmd->nextInstr; + gBattlerTarget = gBattlerAttacker; } - case VARIOUS_SWITCHIN_ABILITIES: +} + +void BS_RemoveStockpileCounters(void) +{ + NATIVE_ARGS(); + + if (GetMoveEffect(gCurrentMove) == EFFECT_SPIT_UP + && gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_1ST_HIT + && IsBattlerAlive(gBattlerTarget)) { - VARIOUS_ARGS(); gBattlescriptCurrInstr = cmd->nextInstr; - AbilityBattleEffects(ABILITYEFFECT_NEUTRALIZINGGAS, battler, 0, 0, 0); - AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, battler, 0, 0, 0); - AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, battler, 0, 0, 0); - return; } - case VARIOUS_INSTANT_HP_DROP: + else { - VARIOUS_ARGS(); - BtlController_EmitHealthBarUpdate(battler, B_COMM_TO_CONTROLLER, INSTANT_HP_BAR_DROP); - MarkBattlerForControllerExec(battler); - break; + gDisableStructs[gBattlerAttacker].stockpileCounter = 0; + BattleScriptPush(cmd->nextInstr); + gBattlescriptCurrInstr = BattleScript_MoveEffectStockpileWoreOff; } - case VARIOUS_CLEAR_STATUS: +} + +static void Cmd_unused_0x88(void) +{ +} + +static u16 ReverseStatChangeMoveEffect(u16 moveEffect) +{ + switch (moveEffect) { - VARIOUS_ARGS(); - gBattleMons[battler].status1 = 0; - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[battler].status1), &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - break; + // +1 + case MOVE_EFFECT_ATK_PLUS_1: + return MOVE_EFFECT_ATK_MINUS_1; + case MOVE_EFFECT_DEF_PLUS_1: + return MOVE_EFFECT_DEF_MINUS_1; + case MOVE_EFFECT_SPD_PLUS_1: + return MOVE_EFFECT_SPD_MINUS_1; + case MOVE_EFFECT_SP_ATK_PLUS_1: + return MOVE_EFFECT_SP_ATK_MINUS_1; + case MOVE_EFFECT_SP_DEF_PLUS_1: + return MOVE_EFFECT_SP_DEF_MINUS_1; + case MOVE_EFFECT_ACC_PLUS_1: + return MOVE_EFFECT_ACC_MINUS_1; + case MOVE_EFFECT_EVS_PLUS_1: + return MOVE_EFFECT_EVS_MINUS_1; + // -1 + case MOVE_EFFECT_ATK_MINUS_1: + return MOVE_EFFECT_ATK_PLUS_1; + case MOVE_EFFECT_DEF_MINUS_1: + return MOVE_EFFECT_DEF_PLUS_1; + case MOVE_EFFECT_SPD_MINUS_1: + return MOVE_EFFECT_SPD_PLUS_1; + case MOVE_EFFECT_SP_ATK_MINUS_1: + return MOVE_EFFECT_SP_ATK_PLUS_1; + case MOVE_EFFECT_SP_DEF_MINUS_1: + return MOVE_EFFECT_SP_DEF_PLUS_1; + case MOVE_EFFECT_ACC_MINUS_1: + return MOVE_EFFECT_ACC_PLUS_1; + case MOVE_EFFECT_EVS_MINUS_1: + // +2 + case MOVE_EFFECT_ATK_PLUS_2: + return MOVE_EFFECT_ATK_MINUS_2; + case MOVE_EFFECT_DEF_PLUS_2: + return MOVE_EFFECT_DEF_MINUS_2; + case MOVE_EFFECT_SPD_PLUS_2: + return MOVE_EFFECT_SPD_MINUS_2; + case MOVE_EFFECT_SP_ATK_PLUS_2: + return MOVE_EFFECT_SP_ATK_MINUS_2; + case MOVE_EFFECT_SP_DEF_PLUS_2: + return MOVE_EFFECT_SP_DEF_MINUS_2; + case MOVE_EFFECT_ACC_PLUS_2: + return MOVE_EFFECT_ACC_MINUS_2; + case MOVE_EFFECT_EVS_PLUS_2: + return MOVE_EFFECT_EVS_MINUS_2; + // -2 + case MOVE_EFFECT_ATK_MINUS_2: + return MOVE_EFFECT_ATK_PLUS_2; + case MOVE_EFFECT_DEF_MINUS_2: + return MOVE_EFFECT_DEF_PLUS_2; + case MOVE_EFFECT_SPD_MINUS_2: + return MOVE_EFFECT_SPD_PLUS_2; + case MOVE_EFFECT_SP_ATK_MINUS_2: + return MOVE_EFFECT_SP_ATK_PLUS_2; + case MOVE_EFFECT_SP_DEF_MINUS_2: + return MOVE_EFFECT_SP_DEF_PLUS_2; + case MOVE_EFFECT_ACC_MINUS_2: + return MOVE_EFFECT_ACC_PLUS_2; + case MOVE_EFFECT_EVS_MINUS_2: + return MOVE_EFFECT_EVS_PLUS_2; + default: + return 0; } - case VARIOUS_RESTORE_PP: +} + +static void TryPlayStatChangeAnimation(u32 battler, enum Ability ability, u32 stats, s32 statValue, u32 statId, bool32 certain) +{ + enum Stat currStat = 0; + u32 changeableStatsCount = 1; // current stat is counted automatically + u32 statAnimId = statId; + bool32 statChangeByTwo = statValue > 1 || statValue < -1; + + if (statValue <= -1) // goes down { - VARIOUS_ARGS(); - for (i = 0; i < 4; i++) + if (statChangeByTwo) + statAnimId += STAT_ANIM_MINUS2; + else + statAnimId += STAT_ANIM_MINUS1; + + while (stats != 0) { - gBattleMons[battler].pp[i] = CalculatePPWithBonus(gBattleMons[battler].moves[i], gBattleMons[battler].ppBonuses, i); - data[i] = gBattleMons[battler].pp[i]; + if (stats & 1) + { + if (certain) + { + if (gBattleMons[battler].statStages[currStat] > MIN_STAT_STAGE) + { + changeableStatsCount++; + break; + } + } + else if (!((ability == ABILITY_KEEN_EYE || ability == ABILITY_MINDS_EYE) && currStat == STAT_ACC) + && !(GetConfig(CONFIG_ILLUMINATE_EFFECT) >= GEN_9 && ability == ABILITY_ILLUMINATE && currStat == STAT_ACC) + && !(ability == ABILITY_HYPER_CUTTER && currStat == STAT_ATK) + && !(ability == ABILITY_BIG_PECKS && currStat == STAT_DEF)) + { + if (gBattleMons[battler].statStages[currStat] > MIN_STAT_STAGE) + { + changeableStatsCount++; + break; + } + } + } + stats >>= 1, currStat++; } - data[i] = gBattleMons[battler].ppBonuses; - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_PP_DATA_BATTLE, 0, 5, data); - MarkBattlerForControllerExec(battler); - break; - } - case VARIOUS_TRY_ACTIVATE_RECEIVER: // Partner gets fainted's ally ability - { - VARIOUS_ARGS(); - gBattlerAbility = BATTLE_PARTNER(battler); - i = GetBattlerAbility(gBattlerAbility); - if (IsBattlerAlive(gBattlerAbility) - && (i == ABILITY_RECEIVER || i == ABILITY_POWER_OF_ALCHEMY) - && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_ABILITY_SHIELD - && !gAbilitiesInfo[gBattleMons[battler].ability].cantBeCopied) + + if (changeableStatsCount > 1) // more than one stat, so the color is gray { - gBattleStruct->tracedAbility[gBattlerAbility] = gBattleMons[battler].ability; // re-using the variable for trace - gBattleScripting.battler = battler; - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = BattleScript_ReceiverActivates; - return; + if (statChangeByTwo) + statAnimId = STAT_ANIM_MULTIPLE_MINUS2; + else + statAnimId = STAT_ANIM_MULTIPLE_MINUS1; } - break; } - case VARIOUS_TRY_ACTIVATE_SOULHEART: + else // goes up { - VARIOUS_ARGS(); - while (gBattleStruct->soulheartBattlerId < gBattlersCount) + if (statChangeByTwo) + statAnimId += STAT_ANIM_PLUS2; + else + statAnimId += STAT_ANIM_PLUS1; + + while (stats != 0) { - gBattleScripting.battler = gBattleStruct->soulheartBattlerId++; - if (GetBattlerAbility(gBattleScripting.battler) == ABILITY_SOUL_HEART - && IsBattlerAlive(gBattleScripting.battler) - && !NoAliveMonsForEitherParty() - && CompareStat(gBattleScripting.battler, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN)) + if (stats & 1 && gBattleMons[battler].statStages[currStat] < MAX_STAT_STAGE) { - SET_STATCHANGER(STAT_SPATK, 1, FALSE); - PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ScriptingAbilityStatRaise; - return; + changeableStatsCount++; + break; } + stats >>= 1, currStat++; + } + + if (changeableStatsCount > 1) // more than one stat, so the color is gray + { + if (statChangeByTwo) + statAnimId = STAT_ANIM_MULTIPLE_PLUS2; + else + statAnimId = STAT_ANIM_MULTIPLE_PLUS1; } - gBattleStruct->soulheartBattlerId = 0; - break; } - case VARIOUS_PLAY_MOVE_ANIMATION: + + if (!gBattleScripting.statAnimPlayed) { - VARIOUS_ARGS(u16 move); - BtlController_EmitMoveAnimation(battler, B_COMM_TO_CONTROLLER, cmd->move, gBattleScripting.animTurn, 0, 0, gBattleMons[battler].friendship, &gDisableStructs[battler], gMultiHitCounter); + BtlController_EmitBattleAnimation(battler, B_COMM_TO_CONTROLLER, B_ANIM_STATS_CHANGE, &gDisableStructs[battler], statAnimId); MarkBattlerForControllerExec(battler); - gBattlescriptCurrInstr = cmd->nextInstr; - return; + if (changeableStatsCount > 1) + gBattleScripting.statAnimPlayed = TRUE; } - case VARIOUS_SET_LUCKY_CHANT: + else if (changeableStatsCount == 1) // final stat that can be changed { - VARIOUS_ARGS(const u8 *failInstr); - if (!(gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_LUCKY_CHANT)) - { - gSideStatuses[GetBattlerSide(battler)] |= SIDE_STATUS_LUCKY_CHANT; - gSideTimers[GetBattlerSide(battler)].luckyChantTimer = gBattleTurnCounter + 5; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } - return; - } - case VARIOUS_SUCKER_PUNCH_CHECK: - { - VARIOUS_ARGS(const u8 *failInstr); - if (gProtectStructs[gBattlerTarget].protected == PROTECT_OBSTRUCT) - gBattlescriptCurrInstr = cmd->failInstr; - else if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) - gBattlescriptCurrInstr = cmd->failInstr; - else if (IsBattleMoveStatus(gBattleMons[gBattlerTarget].moves[gBattleStruct->chosenMovePositions[gBattlerTarget]]) && !gProtectStructs[gBattlerTarget].noValidMoves) - gBattlescriptCurrInstr = cmd->failInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; + gBattleScripting.statAnimPlayed = FALSE; } - case VARIOUS_SET_SIMPLE_BEAM: +} + +static u32 ChangeStatBuffs(u32 battler, s8 statValue, enum Stat statId, union StatChangeFlags flags, u32 stats, const u8 *BS_ptr) +{ + u32 index, battlerAbility; + enum HoldEffect battlerHoldEffect; + battlerAbility = GetBattlerAbility(battler); + battlerHoldEffect = GetBattlerHoldEffect(battler); + gSpecialStatuses[battler].changedStatsBattlerId = gBattlerAttacker; + + if (battlerAbility == ABILITY_CONTRARY) { - VARIOUS_ARGS(const u8 *failInstr); - if (gAbilitiesInfo[gBattleMons[gBattlerTarget].ability].cantBeOverwritten - || gBattleMons[gBattlerTarget].ability == ABILITY_SIMPLE) - { - RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability); - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) - { - RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_ABILITY_SHIELD); - gBattlescriptCurrInstr = cmd->failInstr; - } - else + statValue ^= STAT_BUFF_NEGATIVE; + if (!flags.onlyChecking) { - if (gBattleMons[gBattlerTarget].ability == ABILITY_NEUTRALIZING_GAS) - gSpecialStatuses[gBattlerTarget].neutralizingGasRemoved = TRUE; - - gBattleScripting.abilityPopupOverwrite = gBattleMons[gBattlerTarget].ability; - gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = ABILITY_SIMPLE; - gBattlescriptCurrInstr = cmd->nextInstr; + gBattleScripting.statChanger ^= STAT_BUFF_NEGATIVE; + RecordAbilityBattle(battler, battlerAbility); + if (flags.updateMoveEffect) + gBattleScripting.moveEffect = ReverseStatChangeMoveEffect(gBattleScripting.moveEffect); } - return; } - case VARIOUS_TRY_ENTRAINMENT: + else if (battlerAbility == ABILITY_SIMPLE && !flags.onlyChecking) + { + statValue = (SET_STAT_BUFF_VALUE(GET_STAT_BUFF_VALUE(statValue) * 2)) | ((statValue <= -1) ? STAT_BUFF_NEGATIVE : 0); + RecordAbilityBattle(battler, battlerAbility); + } + + PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); + + if (statValue <= -1) // Stat decrease. { - VARIOUS_ARGS(const u8 *failInstr); - if (gAbilitiesInfo[gBattleMons[gBattlerAttacker].ability].cantBeCopied - || gAbilitiesInfo[gBattleMons[gBattlerTarget].ability].cantBeOverwritten) + if (gSideTimers[GetBattlerSide(battler)].mistTimer + && !flags.certain && gCurrentMove != MOVE_CURSE + && !(battler == gBattlerTarget && GetBattlerAbility(gBattlerAttacker) == ABILITY_INFILTRATOR)) { - RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability); - gBattlescriptCurrInstr = cmd->failInstr; + if (flags.allowPtr) + { + if (gSpecialStatuses[battler].statLowered) + { + gBattlescriptCurrInstr = BS_ptr; + } + else + { + BattleScriptPush(BS_ptr); + gBattleScripting.battler = battler; + gBattlescriptCurrInstr = BattleScript_MistProtected; + gSpecialStatuses[battler].statLowered = TRUE; + } + } + return STAT_CHANGE_DIDNT_WORK; } - else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + else if (gCurrentMove != MOVE_CURSE + && !flags.notProtectAffected && JumpIfMoveAffectedByProtect(gCurrentMove, gBattlerTarget, TRUE, BattleScript_ButItFailed)) { - RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_ABILITY_SHIELD); - gBattlescriptCurrInstr = cmd->failInstr; + return STAT_CHANGE_DIDNT_WORK; } - else + else if ((battlerHoldEffect == HOLD_EFFECT_CLEAR_AMULET || CanAbilityPreventStatLoss(battlerAbility)) + && (flags.statDropPrevention || gBattlerAttacker != gBattlerTarget || flags.mirrorArmored) && !flags.certain && gCurrentMove != MOVE_CURSE) { - if (gBattleMons[gBattlerTarget].ability == gBattleMons[gBattlerAttacker].ability - || (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX)) + if (flags.allowPtr) { - gBattlescriptCurrInstr = cmd->failInstr; + if (gSpecialStatuses[battler].statLowered) + { + gBattlescriptCurrInstr = BS_ptr; + } + else + { + gBattleScripting.battler = battler; + if (battlerHoldEffect == HOLD_EFFECT_CLEAR_AMULET) + { + gLastUsedItem = gBattleMons[battler].item; + BattleScriptPush(BS_ptr); + gBattlescriptCurrInstr = BattleScript_ItemNoStatLoss; + RecordItemEffectBattle(battler, HOLD_EFFECT_CLEAR_AMULET); + } + else + { + gBattlerAbility = battler; + BattleScriptPush(BS_ptr); + gBattlescriptCurrInstr = BattleScript_AbilityNoStatLoss; + gLastUsedAbility = battlerAbility; + RecordAbilityBattle(battler, gLastUsedAbility); + } + gSpecialStatuses[battler].statLowered = TRUE; + } } - else + return STAT_CHANGE_DIDNT_WORK; + } + else if ((index = IsFlowerVeilProtected(battler)) && !flags.certain) + { + if (flags.allowPtr) { - gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = gBattleMons[gBattlerAttacker].ability; - gBattlescriptCurrInstr = cmd->nextInstr; + if (gSpecialStatuses[battler].statLowered) + { + gBattlescriptCurrInstr = BS_ptr; + } + else + { + BattleScriptPush(BS_ptr); + gBattleScripting.battler = battler; + gBattlerAbility = index - 1; + gBattlescriptCurrInstr = BattleScript_FlowerVeilProtectsRet; + gLastUsedAbility = ABILITY_FLOWER_VEIL; + gSpecialStatuses[battler].statLowered = TRUE; + } } + return STAT_CHANGE_DIDNT_WORK; } - return; - } - case VARIOUS_SET_LAST_USED_ABILITY: - { - VARIOUS_ARGS(); - gLastUsedAbility = gBattleMons[battler].ability; - break; - } - case VARIOUS_INVERT_STAT_STAGES: - { - VARIOUS_ARGS(); - for (i = 0; i < NUM_BATTLE_STATS; i++) + else if (!flags.certain + && (((battlerAbility == ABILITY_KEEN_EYE || battlerAbility == ABILITY_MINDS_EYE) && statId == STAT_ACC) + || (GetConfig(CONFIG_ILLUMINATE_EFFECT) >= GEN_9 && battlerAbility == ABILITY_ILLUMINATE && statId == STAT_ACC) + || (battlerAbility == ABILITY_HYPER_CUTTER && statId == STAT_ATK) + || (battlerAbility == ABILITY_BIG_PECKS && statId == STAT_DEF))) { - if (gBattleMons[battler].statStages[i] < DEFAULT_STAT_STAGE) // Negative becomes positive. - gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE + (DEFAULT_STAT_STAGE - gBattleMons[battler].statStages[i]); - else if (gBattleMons[battler].statStages[i] > DEFAULT_STAT_STAGE) // Positive becomes negative. - gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE - (gBattleMons[battler].statStages[i] - DEFAULT_STAT_STAGE); + if (flags.allowPtr) + { + BattleScriptPush(BS_ptr); + gBattleScripting.battler = battler; + gBattlerAbility = battler; + gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; + gLastUsedAbility = battlerAbility; + RecordAbilityBattle(battler, gLastUsedAbility); + } + return STAT_CHANGE_DIDNT_WORK; } - break; - } - case VARIOUS_TRY_ME_FIRST: - { - VARIOUS_ARGS(const u8 *failInstr); - u16 move = gBattleMons[gBattlerTarget].moves[gBattleStruct->chosenMovePositions[gBattlerTarget]]; - if (IsBattleMoveStatus(move) || IsMoveMeFirstBanned(move) - || GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) - gBattlescriptCurrInstr = cmd->failInstr; - else + else if (battlerAbility == ABILITY_MIRROR_ARMOR && !flags.mirrorArmored && gBattlerAttacker != gBattlerTarget && battler == gBattlerTarget) + { + if (flags.allowPtr) + { + SET_STATCHANGER(statId, GET_STAT_BUFF_VALUE(statValue) | STAT_BUFF_NEGATIVE, TRUE); + BattleScriptPush(BS_ptr); + gBattleScripting.battler = battler; + gBattlerAbility = battler; + gBattlescriptCurrInstr = BattleScript_MirrorArmorReflect; + RecordAbilityBattle(battler, gBattleMons[battler].ability); + } + return STAT_CHANGE_DIDNT_WORK; + } + else // try to decrease { - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(move)) + statValue = -GET_STAT_BUFF_VALUE(statValue); + if (gBattleMons[battler].statStages[statId] == 1) + statValue = -1; + else if (gBattleMons[battler].statStages[statId] == 2 && statValue < -2) + statValue = -2; + + if (statValue == -2) + { + PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATHARSHLY); + } + else if (statValue <= -3) { - gBattleStruct->zmove.baseMoves[gBattlerAttacker] = move; - gCalledMove = GetTypeBasedZMove(move); + PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_SEVERELY); } else { - gCalledMove = move; + PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_EMPTYSTRING3); + } + + gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == battler); // B_MSG_ATTACKER_STAT_CHANGED or B_MSG_DEFENDER_STAT_CHANGED + + if (gBattleMons[battler].statStages[statId] == MIN_STAT_STAGE) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAT_WONT_CHANGE; + gBattleScripting.statChanger |= STAT_BUFF_NEGATIVE; + } + else if (!flags.onlyChecking) + { + gDisableStructs[battler].tryEjectPack = TRUE; + gProtectStructs[battler].lashOutAffected = TRUE; + gBattleScripting.statChanger |= STAT_BUFF_NEGATIVE; } - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; - gBattlerTarget = GetBattleMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; - } - case VARIOUS_JUMP_IF_BATTLE_END: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if (NoAliveMonsForEitherParty()) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_TRY_ELECTRIFY: - { - VARIOUS_ARGS(const u8 *failInstr); - if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - gStatuses4[gBattlerTarget] |= STATUS4_ELECTRIFIED; - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; - } - case VARIOUS_TRY_SOAK: - { - VARIOUS_ARGS(const u8 *failInstr); - u32 types[3]; - GetBattlerTypes(gBattlerTarget, FALSE, types); - u32 moveType = GetMoveType(gCurrentMove); - if ((types[0] == moveType && types[1] == moveType) - || GetActiveGimmick(gBattlerTarget) == GIMMICK_TERA) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - SET_BATTLER_TYPE(gBattlerTarget, moveType); - PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); - gBattlescriptCurrInstr = cmd->nextInstr; } - return; } - case VARIOUS_HANDLE_FORM_CHANGE: + else // stat increase { - VARIOUS_ARGS(u8 case_); - mon = GetBattlerMon(battler); + statValue = GET_STAT_BUFF_VALUE(statValue); + if (gBattleMons[battler].statStages[statId] == 11) + statValue = 1; + else if (gBattleMons[battler].statStages[statId] == 10 && statValue > 2) + statValue = 2; - // Change species. - if (cmd->case_ == 0) - { - /* What was the idea here? - if (!gBattleTextBuff1) - PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[battler].species); - */ - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_SPECIES_BATTLE, 1u << gBattlerPartyIndexes[battler], sizeof(gBattleMons[battler].species), &gBattleMons[battler].species); - MarkBattlerForControllerExec(battler); - } - // Change stats. - else if (cmd->case_ == 1) - { - RecalcBattlerStats(battler, mon, FALSE); - } - // Update healthbox. - else + if (statValue == 2) { - UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], mon, HEALTHBOX_ALL); + PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATSHARPLY); } - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_TRY_LAST_RESORT: - { - VARIOUS_ARGS(const u8 *failInstr); - if (CanUseLastResort(battler)) - gBattlescriptCurrInstr = cmd->nextInstr; - else - gBattlescriptCurrInstr = cmd->failInstr; - return; - } - case VARIOUS_TRY_AUTOTOMIZE: - { - VARIOUS_ARGS(const u8 *failInstr); - if (GetBattlerWeight(battler) > 1) + else if (statValue >= 3) { - gDisableStructs[battler].autotomizeCount++; - gBattlescriptCurrInstr = cmd->nextInstr; + PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_DRASTICALLY); } else { - gBattlescriptCurrInstr = cmd->failInstr; + PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_EMPTYSTRING3); } - return; - } - case VARIOUS_TRY_INSTRUCT: - { - VARIOUS_ARGS(const u8 *failInstr); - u16 move = gLastPrintedMoves[gBattlerTarget]; - if (move == MOVE_NONE || move == MOVE_UNAVAILABLE || MoveHasAdditionalEffectSelf(move, MOVE_EFFECT_RECHARGE) - || IsMoveInstructBanned(move) - || gBattleMoveEffects[GetMoveEffect(move)].twoTurnEffect - || (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) - || IsZMove(move) - || IsMaxMove(move)) + + gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == battler); // B_MSG_ATTACKER_STAT_CHANGED or B_MSG_DEFENDER_STAT_CHANGED + + if (gBattleMons[battler].statStages[statId] == MAX_STAT_STAGE) { - gBattlescriptCurrInstr = cmd->failInstr; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAT_WONT_CHANGE; + gBattleScripting.statChanger &= ~STAT_BUFF_NEGATIVE; } - else + else if (!flags.onlyChecking) { - gSpecialStatuses[gBattlerTarget].instructedChosenTarget = gBattleStruct->moveTarget[gBattlerTarget] | 0x4; - gCalledMove = move; - for (i = 0; i < MAX_MON_MOVES; i++) + u32 statIncrease; + if ((statValue + gBattleMons[battler].statStages[statId]) > MAX_STAT_STAGE) + statIncrease = MAX_STAT_STAGE - gBattleMons[battler].statStages[statId]; + else + statIncrease = statValue; + + gProtectStructs[battler].statRaised = TRUE; + gBattleScripting.statChanger &= ~STAT_BUFF_NEGATIVE; + + if (statIncrease) { - if (gBattleMons[gBattlerTarget].moves[i] == gCalledMove) + // Check Mirror Herb / Opportunist + for (index = 0; index < gBattlersCount; index++) { - gCurrMovePos = i; - i = 4; - break; + if (IsBattlerAlly(index, battler)) + continue; // Only triggers on opposing side + + if (GetBattlerAbility(index) == ABILITY_OPPORTUNIST + && gProtectStructs[battler].activateOpportunist == 0) // don't activate opportunist on other mon's opportunist raises + { + gProtectStructs[index].activateOpportunist = 2; // set stats to copy + } + if (GetBattlerHoldEffect(index) == HOLD_EFFECT_MIRROR_HERB) + { + gProtectStructs[index].eatMirrorHerb = 1; + } + + if (gProtectStructs[index].activateOpportunist == 2 || gProtectStructs[index].eatMirrorHerb == 1) + { + gQueuedStatBoosts[index].stats |= (1 << (statId - 1)); // -1 to start at atk + gQueuedStatBoosts[index].statChanges[statId - 1] += statIncrease; + } } } - if (i != 4 || gBattleMons[gBattlerTarget].pp[gCurrMovePos] == 0) - gBattlescriptCurrInstr = cmd->failInstr; - else - { - gEffectBattler = gBattleStruct->lastMoveTarget[gBattlerTarget]; - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; - PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, battler, gBattlerPartyIndexes[battler]); - gBattlescriptCurrInstr = cmd->nextInstr; - } } - return; } - case VARIOUS_ABILITY_POPUP: - { - VARIOUS_ARGS(); - CreateAbilityPopUp(battler, gBattleMons[battler].ability, (IsDoubleBattle()) != 0); - break; - } - case VARIOUS_UPDATE_ABILITY_POPUP: - { - VARIOUS_ARGS(); - UpdateAbilityPopup(battler); - break; - } - case VARIOUS_JUMP_IF_TARGET_ALLY: + + if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_STAT_WONT_CHANGE) // at max or min { - VARIOUS_ARGS(const u8 *jumpInstr); - if (!IsBattlerAlly(gBattlerAttacker, gBattlerTarget)) - gBattlescriptCurrInstr = cmd->nextInstr; - else - gBattlescriptCurrInstr = cmd->jumpInstr; - return; + if (!flags.allowPtr) + return STAT_CHANGE_DIDNT_WORK; + return STAT_CHANGE_WORKED; } - case VARIOUS_TRY_SYNCHRONOISE: - { - VARIOUS_ARGS(const u8 *failInstr); - if (!DoBattlersShareType(gBattlerAttacker, gBattlerTarget)) - gBattlescriptCurrInstr = cmd->failInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_LOSE_TYPE: - { - VARIOUS_ARGS(u8 type); - RemoveBattlerType(battler, cmd->type); + + if (flags.onlyChecking) + return STAT_CHANGE_WORKED; + + gBattleMons[battler].statStages[statId] += statValue; + if (gBattleMons[battler].statStages[statId] < MIN_STAT_STAGE) + gBattleMons[battler].statStages[statId] = MIN_STAT_STAGE; + if (gBattleMons[battler].statStages[statId] > MAX_STAT_STAGE) + gBattleMons[battler].statStages[statId] = MAX_STAT_STAGE; + + if (ShouldDefiantCompetitiveActivate(battler, battlerAbility)) + stats = 0; // use single stat animations when Defiant/Competitive activate + else + stats &= ~(1u << statId); + + TryPlayStatChangeAnimation(battler, battlerAbility, stats, statValue, statId, flags.certain); + + return STAT_CHANGE_WORKED; +} + +static void Cmd_statbuffchange(void) +{ + CMD_ARGS(u8 battler, u16 flags, const u8 *failInstr, u8 stats); + + u16 flags = cmd->flags; + u32 stats = cmd->stats; + const u8 *ptrBefore = gBattlescriptCurrInstr; + const u8 *failInstr = cmd->failInstr; + + if (ChangeStatBuffs( + GetBattlerForBattleScript(cmd->battler), + GET_STAT_BUFF_VALUE_WITH_SIGN(gBattleScripting.statChanger), + GET_STAT_BUFF_ID(gBattleScripting.statChanger), + flags, + stats, + failInstr) == STAT_CHANGE_WORKED) gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_PSYCHO_SHIFT: - { - VARIOUS_ARGS(const u8 *failInstr, const u8 *sleepClauseFailInstr); - u32 targetAbility = GetBattlerAbility(gBattlerTarget); - // Psycho shift works - if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_POISON) && CanBePoisoned(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), targetAbility)) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_TOXIC_POISON) && CanBePoisoned(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), targetAbility)) - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_BURN) && CanBeBurned(gBattlerAttacker, gBattlerTarget, targetAbility)) - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) && CanBeParalyzed(gBattlerAttacker, gBattlerTarget, targetAbility)) - gBattleCommunication[MULTISTRING_CHOOSER] = 3; - else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) && CanBeSlept(gBattlerAttacker, gBattlerTarget, targetAbility, BLOCKED_BY_SLEEP_CLAUSE)) - gBattleCommunication[MULTISTRING_CHOOSER] = 4; - else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_FROSTBITE) && CanBeFrozen(gBattlerAttacker, gBattlerTarget, targetAbility)) - gBattleCommunication[MULTISTRING_CHOOSER] = 5; - else if (IsSleepClauseActiveForSide(GetBattlerSide(battler))) - { - gBattlescriptCurrInstr = cmd->sleepClauseFailInstr; - return; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - return; - } - gBattleMons[gBattlerTarget].status1 = gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY; - battler = gBattlerTarget; - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[battler].status1), &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - gBattlescriptCurrInstr = cmd->nextInstr; - TryActivateSleepClause(battler, gBattlerPartyIndexes[battler]); - return; - } - case VARIOUS_CURE_STATUS: - { - VARIOUS_ARGS(); + else if (gBattlescriptCurrInstr == ptrBefore) // Prevent infinite looping. + gBattlescriptCurrInstr = failInstr; +} - if (gBattleMons[battler].status1 & STATUS1_SLEEP) - TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); +bool32 TryResetBattlerStatChanges(u8 battler) +{ + u32 j; + bool32 ret = FALSE; - gBattleMons[battler].status1 = 0; - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[battler].status1), &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - break; - } - case VARIOUS_POWER_TRICK: + gDisableStructs[battler].stockpileDef = 0; + gDisableStructs[battler].stockpileSpDef = 0; + for (j = 0; j < NUM_BATTLE_STATS; j++) { - VARIOUS_ARGS(); - gStatuses3[battler] ^= STATUS3_POWER_TRICK; - SWAP(gBattleMons[battler].attack, gBattleMons[battler].defense, i); - break; + if (gBattleMons[battler].statStages[j] != DEFAULT_STAT_STAGE) + ret = TRUE; // returns TRUE if any stat was reset + + gBattleMons[battler].statStages[j] = DEFAULT_STAT_STAGE; } - case VARIOUS_AFTER_YOU: + + return ret; +} + +// Haze +static void Cmd_normalisebuffs(void) +{ + CMD_ARGS(); + + s32 i; + + for (i = 0; i < gBattlersCount; i++) + TryResetBattlerStatChanges(i); + + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void Cmd_setbide(void) +{ + CMD_ARGS(); + + gBattleMons[gBattlerAttacker].volatiles.multipleTurns = TRUE; + gLockedMoves[gBattlerAttacker] = gCurrentMove; + gBideDmg[gBattlerAttacker] = 0; + gBattleMons[gBattlerAttacker].volatiles.bideTurns = 2; + + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void Cmd_twoturnmoveschargestringandanimation(void) +{ + CMD_ARGS(const u8 *animationThenStringPtr); + + gBattleScripting.savedStringId = GetMoveTwoTurnAttackStringId(gCurrentMove); + if (B_UPDATED_MOVE_DATA < GEN_5 || MoveHasChargeTurnAdditionalEffect(gCurrentMove)) + gBattlescriptCurrInstr = cmd->animationThenStringPtr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void Cmd_trynonvolatilestatus(void) +{ + CMD_ARGS(); + bool32 canInflictStatus = TRUE; + + if (!CanSetNonVolatileStatus( + gBattlerAttacker, + gBattlerTarget, + GetBattlerAbility(gBattlerAttacker), + GetBattlerAbility(gBattlerTarget), + GetMoveNonVolatileStatus(gCurrentMove), + RUN_SCRIPT)) + canInflictStatus = FALSE; + + if (canInflictStatus && DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) { - VARIOUS_ARGS(const u8 *failInstr); - if (ChangeOrderTargetAfterAttacker()) - { - gSpecialStatuses[gBattlerTarget].afterYou = 1; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } - return; + canInflictStatus = FALSE; + gBattlescriptCurrInstr = BattleScript_ButItFailed; } - case VARIOUS_BESTOW: + + if (canInflictStatus) + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void Cmd_initmultihitstring(void) +{ + CMD_ARGS(); + + PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) + + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void Cmd_forcerandomswitch(void) +{ + CMD_ARGS(const u8 *failInstr); + + s32 battler1PartyId = 0; + s32 battler2PartyId = 0; + + s32 firstMonId; + s32 lastMonId = 0; // + 1 + struct Pokemon *party = NULL; + u8 validMons[PARTY_SIZE]; + s32 validMonsCount = 0; + + bool32 redCardForcedSwitch = FALSE; + + // Red card checks against wild pokemon. If we have reached here, the player has a mon to switch into + // Red card swaps attacker with target to get the animation correct, so here we check attacker which is really the target. Thanks GF... + if (gBattleScripting.switchCase == B_SWITCH_RED_CARD + && !(gBattleTypeFlags & BATTLE_TYPE_TRAINER) + && !IsOnPlayerSide(gBattlerAttacker)) // Check opponent's red card activating { - VARIOUS_ARGS(const u8 *failInstr); - if (gBattleMons[gBattlerAttacker].item == ITEM_NONE - || gBattleMons[gBattlerTarget].item != ITEM_NONE - || !CanBattlerGetOrLoseItem(gBattlerAttacker, gBattleMons[gBattlerAttacker].item) - || !CanBattlerGetOrLoseItem(gBattlerTarget, gBattleMons[gBattlerAttacker].item) - || gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerTarget)] & (1u << gBattlerPartyIndexes[gBattlerTarget])) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else + if (!WILD_DOUBLE_BATTLE) { - BestowItem(gBattlerAttacker, gBattlerTarget); - gBattlescriptCurrInstr = cmd->nextInstr; + // Wild mon with red card will end single battle + gBattlescriptCurrInstr = BattleScript_RoarSuccessEndBattle; + return; } - return; - } - case VARIOUS_JUMP_IF_NOT_GROUNDED: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if (!IsBattlerGrounded(battler)) - gBattlescriptCurrInstr = cmd->jumpInstr; else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_HANDLE_TRAINER_SLIDE_MSG: - { - VARIOUS_ARGS(u8 case_); - if (cmd->case_ == PRINT_SLIDE_MESSAGE) - { - BtlController_EmitPrintString(battler, B_COMM_TO_CONTROLLER, STRINGID_TRAINERSLIDE); - MarkBattlerForControllerExec(battler); - } - else if (cmd->case_ == RESTORE_BATTLER_SLIDE_CONTROL) { - if (IsBattlerAlive(battler)) + // Wild double battle, wild mon red card activation on player + if (IS_WHOLE_SIDE_ALIVE(gBattlerTarget)) { - SetBattlerShadowSpriteCallback(battler, gBattleMons[battler].species); - BattleLoadMonSpriteGfx(GetBattlerMon(battler), battler); + // Both player's battlers are alive + redCardForcedSwitch = FALSE; } - i = BATTLE_PARTNER(battler); - if (IsBattlerAlive(i)) + else { - SetBattlerShadowSpriteCallback(i, gBattleMons[i].species); - BattleLoadMonSpriteGfx(GetBattlerMon(i), i); + // Player has only one mon alive -> force red card switch before manually switching to other mon + redCardForcedSwitch = TRUE; } } - gBattlescriptCurrInstr = cmd->nextInstr; - return; } - case VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF: + + // Swapping pokemon happens in: + // trainer battles + // wild double battles when an opposing pokemon uses it against one of the two alive player mons + // wild double battle when a player pokemon uses it against its partner + if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) + || (WILD_DOUBLE_BATTLE + && !IsOnPlayerSide(gBattlerAttacker) + && IsOnPlayerSide(gBattlerTarget) + && IS_WHOLE_SIDE_ALIVE(gBattlerTarget)) + || (WILD_DOUBLE_BATTLE + && IsOnPlayerSide(gBattlerAttacker) + && IsOnPlayerSide(gBattlerTarget)) + || redCardForcedSwitch + ) { - VARIOUS_ARGS(); - if ((i = ShouldDoTrainerSlide(battler, TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN))) + party = GetBattlerParty(gBattlerTarget); + + if (BATTLE_TWO_VS_ONE_OPPONENT && !IsOnPlayerSide(gBattlerTarget)) { - gBattleScripting.battler = battler; - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = (i == 1 ? BattleScript_TrainerASlideMsgRet : BattleScript_TrainerBSlideMsgRet); - return; + firstMonId = 0; + lastMonId = 6; + battler2PartyId = gBattlerPartyIndexes[gBattlerTarget]; + battler1PartyId = gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerTarget)]; } - break; - } - case VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON: - { - VARIOUS_ARGS(); - if ((i = ShouldDoTrainerSlide(battler, TRAINER_SLIDE_LAST_SWITCHIN))) + else if ((gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER && gBattleTypeFlags & BATTLE_TYPE_LINK) + || (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER && gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) + || (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)) { - gBattleScripting.battler = battler; - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = (i == 1 ? BattleScript_TrainerASlideMsgRet : BattleScript_TrainerBSlideMsgRet); - return; + if ((gBattlerTarget & BIT_FLANK) != B_FLANK_LEFT) + { + firstMonId = PARTY_SIZE / 2; + lastMonId = PARTY_SIZE; + } + else + { + firstMonId = 0; + lastMonId = PARTY_SIZE / 2; + } + battler2PartyId = gBattlerPartyIndexes[gBattlerTarget]; + battler1PartyId = gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerTarget)]; } - break; - } - case VARIOUS_SET_AURORA_VEIL: - { - VARIOUS_ARGS(); - if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_AURORA_VEIL - || !(HasWeatherEffect() && gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW))) + else if ((gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_LINK) + || (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK)) { - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(gBattlerTarget)) == B_FLANK_RIGHT) + { + firstMonId = PARTY_SIZE / 2; + lastMonId = PARTY_SIZE; + } + else + { + firstMonId = 0; + lastMonId = PARTY_SIZE / 2; + } + battler2PartyId = gBattlerPartyIndexes[gBattlerTarget]; + battler1PartyId = gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerTarget)]; } - else + else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) { - gSideStatuses[GetBattlerSide(battler)] |= SIDE_STATUS_AURORA_VEIL; - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[GetBattlerSide(battler)].auroraVeilTimer = gBattleTurnCounter + 8; + if (IsOnPlayerSide(gBattlerTarget)) + { + firstMonId = 0; + lastMonId = PARTY_SIZE; + } else - gSideTimers[GetBattlerSide(battler)].auroraVeilTimer = gBattleTurnCounter + 5; - - if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) - gBattleCommunication[MULTISTRING_CHOOSER] = 5; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 5; + { + if ((gBattlerTarget & BIT_FLANK) != B_FLANK_LEFT) + { + firstMonId = PARTY_SIZE / 2; + lastMonId = PARTY_SIZE; + } + else + { + firstMonId = 0; + lastMonId = PARTY_SIZE / 2; + } + } + battler2PartyId = gBattlerPartyIndexes[gBattlerTarget]; + battler1PartyId = gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerTarget)]; } - break; - } - case VARIOUS_TRY_THIRD_TYPE: - { - VARIOUS_ARGS(const u8 *failInstr); - u32 type = GetMoveArgType(gCurrentMove); - if (IS_BATTLER_OF_TYPE(battler, type) || GetActiveGimmick(battler) == GIMMICK_TERA) + else if (IsDoubleBattle()) { - gBattlescriptCurrInstr = cmd->failInstr; + firstMonId = 0; + lastMonId = PARTY_SIZE; + battler2PartyId = gBattlerPartyIndexes[gBattlerTarget]; + battler1PartyId = gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerTarget)]; } else { - gBattleMons[battler].types[2] = type; - PREPARE_TYPE_BUFFER(gBattleTextBuff1, type); - gBattlescriptCurrInstr = cmd->nextInstr; + firstMonId = 0; + lastMonId = PARTY_SIZE; + battler2PartyId = gBattlerPartyIndexes[gBattlerTarget]; // there is only one PokΓ©mon out in single battles + battler1PartyId = gBattlerPartyIndexes[gBattlerTarget]; } - return; - } - case VARIOUS_DESTROY_ABILITY_POPUP: - { - VARIOUS_ARGS(); - DestroyAbilityPopUp(battler); - break; - } - case VARIOUS_TOTEM_BOOST: - { - VARIOUS_ARGS(const u8 *jumpInstr); - battler = gBattlerAttacker; - if (gQueuedStatBoosts[battler].stats == 0) + + for (u32 i = firstMonId; i < lastMonId; i++) + { + if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE + && !GetMonData(&party[i], MON_DATA_IS_EGG) + && GetMonData(&party[i], MON_DATA_HP) != 0 + && i != battler1PartyId + && i != battler2PartyId) + { + validMons[validMonsCount++] = i; + } + } + + if (validMonsCount == 0) { - gBattlescriptCurrInstr = cmd->nextInstr; // stats done, exit + gBattlescriptCurrInstr = cmd->failInstr; } else { - for (i = 0; i < (NUM_BATTLE_STATS - 1); i++) - { - if (gQueuedStatBoosts[battler].stats & (1 << i)) - { - if (gQueuedStatBoosts[battler].statChanges[i] <= -1) - SET_STATCHANGER(i + 1, abs(gQueuedStatBoosts[battler].statChanges[i]), TRUE); - else - SET_STATCHANGER(i + 1, gQueuedStatBoosts[battler].statChanges[i], FALSE); + gBattleStruct->battlerPartyIndexes[gBattlerTarget] = gBattlerPartyIndexes[gBattlerTarget]; + gBattlescriptCurrInstr = BattleScript_RoarSuccessSwitch; + gBattleStruct->battlerState[gBattlerTarget].forcedSwitch = TRUE; + gBattleStruct->monToSwitchIntoId[gBattlerTarget] = validMons[RandomUniform(RNG_FORCE_RANDOM_SWITCH, 0, validMonsCount - 1)]; - gQueuedStatBoosts[battler].stats &= ~(1 << i); - gBattleScripting.battler = battler; - gBattlerTarget = battler; - if (gQueuedStatBoosts[battler].stats & 0x80) - { - gQueuedStatBoosts[battler].stats &= ~0x80; // set 'aura flared to life' flag - gBattlescriptCurrInstr = BattleScript_TotemFlaredToLife; - } - else - { - gBattlescriptCurrInstr = cmd->jumpInstr; // do boost - } - return; - } + if (!IsMultiBattle()) + SwitchPartyOrder(gBattlerTarget); + + if ((gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + || (gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & BATTLE_TYPE_MULTI) + || (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + || (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { + SwitchPartyOrderLinkMulti(gBattlerTarget, gBattleStruct->monToSwitchIntoId[gBattlerTarget], 0); + SwitchPartyOrderLinkMulti(BATTLE_PARTNER(gBattlerTarget), gBattleStruct->monToSwitchIntoId[gBattlerTarget], 1); } - gBattlescriptCurrInstr = cmd->nextInstr; // exit if loop failed (failsafe) + + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + SwitchPartyOrderInGameMulti(gBattlerTarget, gBattleStruct->monToSwitchIntoId[gBattlerTarget]); } - return; - } - case VARIOUS_MOVEEND_ITEM_EFFECTS: - { - VARIOUS_ARGS(); - if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler, FALSE)) - return; - break; } - case VARIOUS_ROOM_SERVICE: + else { - VARIOUS_ARGS(const u8 *failInstr); - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_ROOM_SERVICE && TryRoomService(battler)) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ConsumableStatRaiseRet; - } + // In normal wild doubles, Roar will always fail if the user's level is less than the target's. + if (gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) + gBattlescriptCurrInstr = BattleScript_RoarSuccessEndBattle; else - { gBattlescriptCurrInstr = cmd->failInstr; - } - return; } - case VARIOUS_TERRAIN_SEED: - { - VARIOUS_ARGS(const u8 *failInstr); - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_SEEDS) - { - enum ItemEffect effect = ITEM_NO_EFFECT; - u16 item = gBattleMons[battler].item; - switch (GetBattlerHoldEffectParam(battler)) - { - case HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_ELECTRIC_TERRAIN, STAT_DEF, item, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_PARAM_GRASSY_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_GRASSY_TERRAIN, STAT_DEF, item, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_PARAM_MISTY_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_MISTY_TERRAIN, STAT_SPDEF, item, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_PARAM_PSYCHIC_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_PSYCHIC_TERRAIN, STAT_SPDEF, item, ITEMEFFECT_NONE); - break; - } +} - if (effect != ITEM_NO_EFFECT) - return; - } +static void Cmd_tryconversiontypechange(void) +{ + CMD_ARGS(const u8 *failInstr); + + u8 validMoves = 0; + u8 moveChecked = 0; + u8 moveType = 0; + + if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA) + { gBattlescriptCurrInstr = cmd->failInstr; return; } - case VARIOUS_MAKE_INVISIBLE: - { - VARIOUS_ARGS(); - if (gBattleControllerExecFlags) - break; - BtlController_EmitSpriteInvisibility(battler, B_COMM_TO_CONTROLLER, TRUE); - MarkBattlerForControllerExec(battler); - break; - } - case VARIOUS_JUMP_IF_TEAM_HEALTHY: + if (B_UPDATED_CONVERSION >= GEN_6) { - VARIOUS_ARGS(const u8 *jumpInstr); - if ((IsDoubleBattle()) && IsBattlerAlive(BATTLE_PARTNER(battler))) + // Changes user's type to its first move's type + for (moveChecked = 0; moveChecked < MAX_MON_MOVES; moveChecked++) { - u8 partner = BATTLE_PARTNER(battler); - if ((gBattleMons[battler].hp == gBattleMons[battler].maxHP && !(gBattleMons[battler].status1 & STATUS1_ANY)) - && (gBattleMons[partner].hp == gBattleMons[partner].maxHP && !(gBattleMons[partner].status1 & STATUS1_ANY))) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; + if (gBattleMons[gBattlerAttacker].moves[moveChecked] != MOVE_NONE) + { + moveType = GetMoveType(gBattleMons[gBattlerAttacker].moves[moveChecked]); + break; + } } - else // single battle + if (IS_BATTLER_OF_TYPE(gBattlerAttacker, moveType)) { - if (gBattleMons[battler].hp == gBattleMons[battler].maxHP && !(gBattleMons[battler].status1 & STATUS1_ANY)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; - } - case VARIOUS_TRY_HEAL_QUARTER_HP: - { - VARIOUS_ARGS(const u8 *failInstr); - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 4; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; - - if (gBattleMons[battler].hp == gBattleMons[battler].maxHP) - gBattlescriptCurrInstr = cmd->failInstr; // fail - else - gBattlescriptCurrInstr = cmd->nextInstr; // can heal - return; - } - case VARIOUS_JUMP_IF_UNDER_200: - { - VARIOUS_ARGS(const u8 *jumpInstr); - // If the Pokemon is less than 200 kg, or weighing less than 441 lbs, then Sky Drop will work. Otherwise, it will fail. - if (GetBattlerWeight(gBattlerTarget) < 2000) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_SET_SKY_DROP: - { - VARIOUS_ARGS(); - gStatuses3[gBattlerTarget] |= (STATUS3_SKY_DROPPED | STATUS3_ON_AIR); - /* skyDropTargets holds the information of who is in a particular instance of Sky Drop. - This is needed in the case that multiple Pokemon use Sky Drop in the same turn or if - the target of a Sky Drop faints while in the air.*/ - gBattleStruct->skyDropTargets[gBattlerAttacker] = gBattlerTarget; - gBattleStruct->skyDropTargets[gBattlerTarget] = gBattlerAttacker; - - // End any multiturn effects caused by the target except STATUS2_LOCK_CONFUSE - gBattleMons[gBattlerTarget].status2 &= ~(STATUS2_MULTIPLETURNS); - gBattleMons[gBattlerTarget].status2 &= ~(STATUS2_UPROAR); - gBattleMons[gBattlerTarget].status2 &= ~(STATUS2_BIDE); - gDisableStructs[gBattlerTarget].rolloutTimer = 0; - gDisableStructs[gBattlerTarget].furyCutterCounter = 0; - - // End any Follow Me/Rage Powder effects caused by the target - if (gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTimer != 0 && gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTarget == gBattlerTarget) - gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTimer = 0; - - break; - } - case VARIOUS_CLEAR_SKY_DROP: - { - VARIOUS_ARGS(const u8 *failInstr); - // Check to see if the initial target of this Sky Drop fainted before the 2nd turn of Sky Drop. - // If so, make the move fail. If not, clear all of the statuses and continue the move. - if (gBattleStruct->skyDropTargets[gBattlerAttacker] == SKY_DROP_NO_TARGET) gBattlescriptCurrInstr = cmd->failInstr; + } else { - gBattleStruct->skyDropTargets[gBattlerAttacker] = SKY_DROP_NO_TARGET; - gBattleStruct->skyDropTargets[gBattlerTarget] = SKY_DROP_NO_TARGET; - gStatuses3[gBattlerTarget] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); + SET_BATTLER_TYPE(gBattlerAttacker, moveType); + PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); gBattlescriptCurrInstr = cmd->nextInstr; } - - // Confuse target if they were in the middle of Petal Dance/Outrage/Thrash when targeted. - if (gBattleMons[gBattlerTarget].status2 & STATUS2_LOCK_CONFUSE) - gBattleScripting.moveEffect = (MOVE_EFFECT_CONFUSION | MOVE_EFFECT_CERTAIN); - return; } - case VARIOUS_SKY_DROP_YAWN: // If the mon that's sleeping due to Yawn was holding a Pokemon in Sky Drop, release the target and clear Sky Drop data. + else { - VARIOUS_ARGS(); - if (gBattleStruct->skyDropTargets[gEffectBattler] != SKY_DROP_NO_TARGET && !(gStatuses3[gEffectBattler] & STATUS3_SKY_DROPPED)) + // Randomly changes user's type to one of its moves' type + while (validMoves < MAX_MON_MOVES) { - // Set the target of Sky Drop as gEffectBattler - gEffectBattler = gBattleStruct->skyDropTargets[gEffectBattler]; + if (gBattleMons[gBattlerAttacker].moves[validMoves] == MOVE_NONE) + break; + + validMoves++; + } - // Clear skyDropTargets data - gBattleStruct->skyDropTargets[gBattleStruct->skyDropTargets[gEffectBattler]] = SKY_DROP_NO_TARGET; - gBattleStruct->skyDropTargets[gEffectBattler] = SKY_DROP_NO_TARGET; + for (moveChecked = 0; moveChecked < validMoves; moveChecked++) + { + moveType = GetMoveType(gBattleMons[gBattlerAttacker].moves[moveChecked]); - // If the target was in the middle of Outrage/Thrash/etc. when targeted by Sky Drop, confuse them on release and do proper animation - if (gBattleMons[gEffectBattler].status2 & STATUS2_LOCK_CONFUSE && CanBeConfused(gEffectBattler)) + if (moveType == TYPE_MYSTERY) { - gBattleMons[gEffectBattler].status2 &= ~(STATUS2_LOCK_CONFUSE); - gBattlerAttacker = gEffectBattler; - gBattleMons[gBattlerTarget].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); - gBattlescriptCurrInstr = BattleScript_ThrashConfuses; - return; + if (IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) + moveType = TYPE_GHOST; + else + moveType = TYPE_NORMAL; + } + if (moveType != gBattleMons[gBattlerAttacker].types[0] + && moveType != gBattleMons[gBattlerAttacker].types[1] + && moveType != gBattleMons[gBattlerAttacker].types[2]) + { + break; } } - break; - } - case VARIOUS_JUMP_IF_PRANKSTER_BLOCKED: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if (BlocksPrankster(gCurrentMove, gBattlerAttacker, battler, TRUE)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER: - { - bool8 shouldNotClear = FALSE; - for (i = 0; i < gBattlersCount; i++) - { - u32 ability = GetBattlerAbility(i); - if (((ability == ABILITY_DESOLATE_LAND && gBattleWeather & B_WEATHER_SUN_PRIMAL) - || (ability == ABILITY_PRIMORDIAL_SEA && gBattleWeather & B_WEATHER_RAIN_PRIMAL) - || (ability == ABILITY_DELTA_STREAM && gBattleWeather & B_WEATHER_STRONG_WINDS)) - && IsBattlerAlive(i)) - shouldNotClear = TRUE; - } - if (gBattleWeather & B_WEATHER_SUN_PRIMAL && !shouldNotClear) - { - gBattleWeather &= ~B_WEATHER_SUN_PRIMAL; - PrepareStringBattle(STRINGID_EXTREMESUNLIGHTFADED, battler); - gBattleCommunication[MSG_DISPLAY] = 1; - } - else if (gBattleWeather & B_WEATHER_RAIN_PRIMAL && !shouldNotClear) - { - gBattleWeather &= ~B_WEATHER_RAIN_PRIMAL; - PrepareStringBattle(STRINGID_HEAVYRAINLIFTED, battler); - gBattleCommunication[MSG_DISPLAY] = 1; - } - else if (gBattleWeather & B_WEATHER_STRONG_WINDS && !shouldNotClear) - { - gBattleWeather &= ~B_WEATHER_STRONG_WINDS; - PrepareStringBattle(STRINGID_STRONGWINDSDISSIPATED, battler); - gBattleCommunication[MSG_DISPLAY] = 1; - } - break; - } - case VARIOUS_TRY_END_NEUTRALIZING_GAS: - { - VARIOUS_ARGS(); - if (gSpecialStatuses[battler].neutralizingGasRemoved) + if (moveChecked == validMoves) { - gSpecialStatuses[battler].neutralizingGasRemoved = FALSE; - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = BattleScript_NeutralizingGasExits; - return; + gBattlescriptCurrInstr = cmd->failInstr; } - break; - } - case VARIOUS_GET_ROTOTILLER_TARGETS: - { - VARIOUS_ARGS(const u8 *failInstr); - // Gets the battlers to be affected by rototiller. If there are none, print 'But it failed!' + else { - u32 count = 0; - for (i = 0; i < gBattlersCount; i++) + do { - gSpecialStatuses[i].rototillerAffected = FALSE; - if (IsRototillerAffected(i)) + while ((moveChecked = MOD(Random(), MAX_MON_MOVES)) >= validMoves); + + moveType = GetMoveType(gBattleMons[gBattlerAttacker].moves[moveChecked]); + + if (moveType == TYPE_MYSTERY) { - gSpecialStatuses[i].rototillerAffected = TRUE; - count++; + if (IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) + moveType = TYPE_GHOST; + else + moveType = TYPE_NORMAL; } } + while (moveType == gBattleMons[gBattlerAttacker].types[0] || moveType == gBattleMons[gBattlerAttacker].types[1] || moveType == gBattleMons[gBattlerAttacker].types[2]); + + SET_BATTLER_TYPE(gBattlerAttacker, moveType); + PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); - if (count == 0) - gBattlescriptCurrInstr = cmd->failInstr; // Rototiller fails - else - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; - } - case VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if (gSpecialStatuses[battler].rototillerAffected) - { - gSpecialStatuses[battler].rototillerAffected = FALSE; gBattlescriptCurrInstr = cmd->nextInstr; } - else - { - gBattlescriptCurrInstr = cmd->jumpInstr; // Unaffected by rototiller - print STRINGID_NOEFFECTONTARGET - } - return; } - case VARIOUS_CONSUME_BERRY: - { - VARIOUS_ARGS(bool8 fromBattler); - if (gBattleScripting.overrideBerryRequirements == 2) - { - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } +} - if (cmd->fromBattler) - gLastUsedItem = gBattleMons[battler].item; +static void Cmd_givepaydaymoney(void) +{ + CMD_ARGS(); - gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].ateBerry = TRUE; - gBattleScripting.battler = gEffectBattler = gBattlerTarget = battler; // Cover all berry effect battler cases. e.g. ChangeStatBuffs uses target ID - if (ItemBattleEffects(ITEMEFFECT_USE_LAST_ITEM, battler, FALSE)) - return; + if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) && gPaydayMoney != 0) + { + u32 bonusMoney = gPaydayMoney * gBattleStruct->moneyMultiplier; + AddMoney(&gSaveBlock1Ptr->money, bonusMoney); + + PREPARE_HWORD_NUMBER_BUFFER(gBattleTextBuff1, 5, bonusMoney) + + BattleScriptPush(cmd->nextInstr); + gBattlescriptCurrInstr = BattleScript_PrintPayDayMoneyString; + } + else + { gBattlescriptCurrInstr = cmd->nextInstr; - return; } - case VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL: +} + +static void Cmd_setlightscreen(void) +{ + CMD_ARGS(); + + if (!TrySetLightScreen(gBattlerAttacker)) { - VARIOUS_ARGS(const u8 *jumpInstr); - if (GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_PRIMAL_REVERSION) == gBattleMons[battler].species) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED; } - case VARIOUS_JUMP_IF_WEATHER_AFFECTED: - { - VARIOUS_ARGS(u32 flags, const u8 *jumpInstr); - u32 flags = cmd->flags; - if (IsBattlerWeatherAffected(battler, flags)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_JUMP_IF_SPECIES: + + gBattlescriptCurrInstr = cmd->nextInstr; +} + +// for var lands +#define NO_HIT 0 +#define CALC_ACC 1 +#define SURE_HIT 2 +// for var endured +#define NOT_ENDURED 0 +#define FOCUS_SASHED 1 +#define FOCUS_BANDED 2 +#define AFFECTION_ENDURED 3 +static void Cmd_tryKO(void) +{ + CMD_ARGS(const u8 *failInstr); + + enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove); + enum HoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); + enum Ability targetAbility = GetBattlerAbility(gBattlerTarget); + u32 rand = Random() % 100; + u32 affectionScore = GetBattlerAffectionHearts(gBattlerTarget); + u32 endured = NOT_ENDURED; + + // Dynamaxed Pokemon cannot be hit by OHKO moves. + if ((GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX)) { - VARIOUS_ARGS(u16 species, const u8 *jumpInstr); - if (gBattleMons[battler].species == cmd->species) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_KO_UNAFFECTED; + gBattlescriptCurrInstr = cmd->failInstr; return; } - case VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED: + + gPotentialItemEffectBattler = gBattlerTarget; + if (holdEffect == HOLD_EFFECT_FOCUS_BAND + && (Random() % 100) < GetBattlerHoldEffectParam(gBattlerTarget)) + { + endured = FOCUS_BANDED; + RecordItemEffectBattle(gBattlerTarget, holdEffect); + } + else if (holdEffect == HOLD_EFFECT_FOCUS_SASH && IsBattlerAtMaxHp(gBattlerTarget)) { - VARIOUS_ARGS(const u8 *jumpInstr); - if (IsLeafGuardProtected(battler, GetBattlerAbility(battler))) - { - gBattlerAbility = battler; - gBattlescriptCurrInstr = cmd->jumpInstr; - } - else - { - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; + endured = FOCUS_SASHED; + RecordItemEffectBattle(gBattlerTarget, holdEffect); } - case VARIOUS_SET_ATTACKER_STICKY_WEB_USER: + else if (B_AFFECTION_MECHANICS == TRUE && IsOnPlayerSide(gBattlerTarget) && affectionScore >= AFFECTION_THREE_HEARTS) { - VARIOUS_ARGS(); - // For Mirror Armor: "If the PokΓ©mon with this Ability is affected by Sticky Web, the effect is reflected back to the PokΓ©mon which set it up. - // If PokΓ©mon which set up Sticky Web is not on the field, no PokΓ©mon have their Speed lowered." - gBattlerAttacker = gBattlerTarget; // Initialize 'fail' condition - SET_STATCHANGER(STAT_SPEED, 1, TRUE); - if (gSideTimers[GetBattlerSide(battler)].stickyWebBattlerId != 0xFF) - gBattlerAttacker = gSideTimers[GetBattlerSide(battler)].stickyWebBattlerId; - break; + if ((affectionScore == AFFECTION_FIVE_HEARTS && rand < 20) + || (affectionScore == AFFECTION_FOUR_HEARTS && rand < 15) + || (affectionScore == AFFECTION_THREE_HEARTS && rand < 10)) + endured = AFFECTION_ENDURED; } - case VARIOUS_CUT_1_3_HP_RAISE_STATS: - { - VARIOUS_ARGS(const u8 *failInstr); - bool8 atLeastOneStatBoosted = FALSE; - u16 hpFraction = max(1, GetNonDynamaxMaxHP(gBattlerAttacker) / 3); + if (targetAbility == ABILITY_STURDY) + { + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + gLastUsedAbility = ABILITY_STURDY; + gBattlescriptCurrInstr = BattleScript_SturdyPreventsOHKO; + gBattlerAbility = gBattlerTarget; + } + else + { + u32 lands = NO_HIT; + if (gBattleMons[gBattlerTarget].level > gBattleMons[gBattlerAttacker].level) + lands = NO_HIT; + else if ((gBattleMons[gBattlerTarget].volatiles.lockOn && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) + || IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_NO_GUARD) + || IsAbilityAndRecord(gBattlerTarget, targetAbility, ABILITY_NO_GUARD)) + lands = SURE_HIT; + else if (IsSemiInvulnerable(gBattlerTarget, CHECK_ALL)) + lands = NO_HIT; + else if (!JumpIfMoveAffectedByProtect(gCurrentMove, gBattlerTarget, TRUE, cmd->failInstr)) + lands = CALC_ACC; + + if (lands == CALC_ACC) + { + u16 odds = GetMoveAccuracy(gCurrentMove) + (gBattleMons[gBattlerAttacker].level - gBattleMons[gBattlerTarget].level); + if (B_SHEER_COLD_ACC >= GEN_7 && effect == EFFECT_SHEER_COLD && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ICE)) + odds -= 10; + if (RandomPercentage(RNG_ACCURACY, odds) && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) + lands = SURE_HIT; + } - for (i = 1; i < NUM_STATS; i++) + if (lands == SURE_HIT) + { + if (gDisableStructs[gBattlerTarget].endured) { - if (CompareStat(gBattlerAttacker, i, MAX_STAT_STAGE, CMP_LESS_THAN)) - { - atLeastOneStatBoosted = TRUE; - break; - } + gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].hp - 1; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_FOE_ENDURED; } - if (atLeastOneStatBoosted && gBattleMons[gBattlerAttacker].hp > hpFraction) + else if (endured == FOCUS_BANDED || endured == FOCUS_SASHED) { - gBattleStruct->moveDamage[gBattlerAttacker] = hpFraction; - gBattlescriptCurrInstr = cmd->nextInstr; + gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].hp - 1; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_FOE_HUNG_ON; + gLastUsedItem = gBattleMons[gBattlerTarget].item; + } + else if (endured == AFFECTION_ENDURED) + { + gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].hp - 1; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_FOE_ENDURED_AFFECTION; } else { - gBattlescriptCurrInstr = cmd->failInstr; + gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].hp; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_ONE_HIT_KO; } - return; - } - case VARIOUS_CHECK_POLTERGEIST: - { - VARIOUS_ARGS(const u8 *failInstr); - if (gBattleMons[battler].item == ITEM_NONE - || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM - || GetBattlerAbility(battler) == ABILITY_KLUTZ) - { - gBattlescriptCurrInstr = cmd->failInstr; + gBattlescriptCurrInstr = cmd->nextInstr; } else { - PREPARE_ITEM_BUFFER(gBattleTextBuff1, gBattleMons[battler].item); - gLastUsedItem = gBattleMons[battler].item; - gBattlescriptCurrInstr = cmd->nextInstr; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + if (gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_KO_MISS; + else + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_KO_UNAFFECTED; + gBattlescriptCurrInstr = cmd->failInstr; } - return; } - case VARIOUS_TRY_NO_RETREAT: +} +#undef NO_HIT +#undef CALC_ACC +#undef SURE_HIT +#undef NOT_ENDURED +#undef FOCUS_SASHED +#undef FOCUS_BANDED +#undef AFFECTION_ENDURED + +static void Cmd_checknonvolatiletrigger(void) +{ + CMD_ARGS(u16 nonVolatile, const u8 *failInstr); + + if (!CanSetNonVolatileStatus( + gBattlerAttacker, + gBattlerTarget, + GetBattlerAbility(gBattlerAttacker), + GetBattlerAbility(gBattlerTarget), + cmd->nonVolatile, + CHECK_TRIGGER)) + gBattlescriptCurrInstr = cmd->failInstr; + else if (DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) + gBattlescriptCurrInstr = cmd->failInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void Cmd_copybidedmg(void) +{ + CMD_ARGS(); + gBattleStruct->moveDamage[gBattlerTarget] = gBideDmg[gBattlerAttacker] * 2; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void Cmd_animatewildpokemonafterfailedpokeball(void) +{ + CMD_ARGS(u8 battler); + u8 battler = GetBattlerForBattleScript(cmd->battler); + AnimateMonAfterPokeBallFail(battler); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void Cmd_tryinfatuating(void) +{ + CMD_ARGS(const u8 *failInstr); + + if (GetBattlerAbility(gBattlerTarget) == ABILITY_OBLIVIOUS) + { + gBattlescriptCurrInstr = BattleScript_NotAffectedAbilityPopUp; + gLastUsedAbility = ABILITY_OBLIVIOUS; + RecordAbilityBattle(gBattlerTarget, ABILITY_OBLIVIOUS); + } + else { - VARIOUS_ARGS(const u8 *failInstr); - if (gDisableStructs[battler].noRetreat) + if (gBattleMons[gBattlerTarget].volatiles.infatuation + || !AreBattlersOfOppositeGender(gBattlerAttacker, gBattlerTarget)) { gBattlescriptCurrInstr = cmd->failInstr; } else { - if (!(gBattleMons[battler].status2 & STATUS2_ESCAPE_PREVENTION)) - gDisableStructs[battler].noRetreat = TRUE; + gBattleMons[gBattlerTarget].volatiles.infatuation = INFATUATED_WITH(gBattlerAttacker); gBattlescriptCurrInstr = cmd->nextInstr; } - return; } - case VARIOUS_CURE_CERTAIN_STATUSES: +} + +static void Cmd_updatestatusicon(void) +{ + CMD_ARGS(u8 battler); + u32 battler; + + if (gBattleControllerExecFlags) + return; + + if (cmd->battler == BS_PLAYER2) { - VARIOUS_ARGS(); - // Check infatuation - if (gBattleMons[battler].status2 & STATUS2_INFATUATION) - { - gBattleMons[battler].status2 &= ~(STATUS2_INFATUATION); - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_INFATUATION; // STRINGID_TARGETGOTOVERINFATUATION - StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); - } - // Check taunt - if (gDisableStructs[battler].tauntTimer != 0) - { - gDisableStructs[battler].tauntTimer = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TAUNT; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_TAUNT); - } - // Check encore - if (gDisableStructs[battler].encoreTimer != 0) - { - gDisableStructs[battler].encoredMove = 0; - gDisableStructs[battler].encoreTimer = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_ENCORE; // STRINGID_PKMNENCOREENDED - } - // Check torment - if (gBattleMons[battler].status2 & STATUS2_TORMENT) + for (battler = gBattleControllerExecFlags; battler < gBattlersCount; battler++) { - gBattleMons[battler].status2 &= ~(STATUS2_TORMENT); - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TORMENT; + if (!(gAbsentBattlerFlags & (1u << battler))) + { + BtlController_EmitStatusIconUpdate(battler, B_COMM_TO_CONTROLLER, gBattleMons[battler].status1); + MarkBattlerForControllerExec(battler); + } } - // Check heal block - if (gStatuses3[battler] & STATUS3_HEAL_BLOCK) + gBattlescriptCurrInstr = cmd->nextInstr; + } + else if (cmd->battler == BS_ATTACKER_WITH_PARTNER) + { + battler = gBattlerAttacker; + if (!(gAbsentBattlerFlags & (1u << battler))) { - gStatuses3[battler] &= ~(STATUS3_HEAL_BLOCK); - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_HEALBLOCK; + BtlController_EmitStatusIconUpdate(battler, B_COMM_TO_CONTROLLER, gBattleMons[battler].status1); + MarkBattlerForControllerExec(battler); } - // Check disable - if (gDisableStructs[battler].disableTimer != 0) + if ((IsDoubleBattle())) { - gDisableStructs[battler].disableTimer = 0; - gDisableStructs[battler].disabledMove = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_DISABLE; + battler = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerAttacker))); + if (!(gAbsentBattlerFlags & (1u << battler))) + { + BtlController_EmitStatusIconUpdate(battler, B_COMM_TO_CONTROLLER, gBattleMons[battler].status1); + MarkBattlerForControllerExec(battler); + } } gBattlescriptCurrInstr = cmd->nextInstr; - return; } - case VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES: + else { - VARIOUS_ARGS(); - battler = gBattlerTarget; - for (i = 0; i < NUM_BATTLE_STATS; i++) - if (gBattleMons[battler].statStages[i] < DEFAULT_STAT_STAGE) - gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE; + battler = GetBattlerForBattleScript(cmd->battler); + BtlController_EmitStatusIconUpdate(battler, B_COMM_TO_CONTROLLER, gBattleMons[battler].status1); + MarkBattlerForControllerExec(battler); gBattlescriptCurrInstr = cmd->nextInstr; - return; } - case VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY: +} + +static void Cmd_setmist(void) +{ + CMD_ARGS(); + + if (gSideTimers[GetBattlerSide(gBattlerAttacker)].mistTimer) { - VARIOUS_ARGS(const u8 *jumpInstr); - if (GetItemPocket(gLastUsedItem) == POCKET_BERRIES) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_FAILED; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MIST_FAILED; } - case VARIOUS_SAVE_BATTLER_ITEM: + else { - VARIOUS_ARGS(); - gBattleHistory->heldItems[battler] = gBattleMons[battler].item; - break; + gSideTimers[GetBattlerSide(gBattlerAttacker)].mistTimer = 5; + gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_MIST; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_MIST; + } + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void Cmd_setfocusenergy(void) +{ + CMD_ARGS(u8 battler); + u8 battler = GetBattlerForBattleScript(cmd->battler); + enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove); + + if ((effect == EFFECT_DRAGON_CHEER && (!(IsDoubleBattle()) || (gAbsentBattlerFlags & (1u << battler)))) + || gBattleMons[battler].volatiles.dragonCheer || gBattleMons[battler].volatiles.focusEnergy) + { + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_FAILED; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FOCUS_ENERGY_FAILED; } - case VARIOUS_RESTORE_BATTLER_ITEM: + else if (effect == EFFECT_DRAGON_CHEER && !IS_BATTLER_OF_TYPE(battler, TYPE_DRAGON)) { - VARIOUS_ARGS(); - gBattleMons[battler].item = gBattleHistory->heldItems[battler]; - break; + gBattleMons[battler].volatiles.dragonCheer = TRUE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_GETTING_PUMPED; } - case VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM: + else { - VARIOUS_ARGS(); - gBattleMons[battler].item = gLastUsedItem; - break; + if (GetConfig(CONFIG_FOCUS_ENERGY_CRIT_RATIO) >= GEN_3 + || GetConfig(CONFIG_CRIT_CHANCE) == GEN_1) + gBattleMons[battler].volatiles.focusEnergy = TRUE; + else + gBattleMons[battler].volatiles.dragonCheer = TRUE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_GETTING_PUMPED; } - } // End of switch (cmd->id) - gBattlescriptCurrInstr = cmd->nextInstr; } -static void TryResetProtectUseCounter(u32 battler) +static void Cmd_transformdataexecution(void) { - u32 lastMove = gLastResultingMoves[battler]; - enum BattleMoveEffects lastEffect = GetMoveEffect(lastMove); - if (lastMove == MOVE_UNAVAILABLE - || (!gBattleMoveEffects[lastEffect].usesProtectCounter - && ((B_ALLY_SWITCH_FAIL_CHANCE >= GEN_9 && lastEffect != EFFECT_ALLY_SWITCH) - || B_ALLY_SWITCH_FAIL_CHANCE < GEN_9))) - gDisableStructs[battler].protectUses = 0; + CMD_ARGS(); + + gChosenMove = MOVE_UNAVAILABLE; + gBattlescriptCurrInstr = cmd->nextInstr; + if (gBattleMons[gBattlerTarget].volatiles.transformed + || gBattleStruct->illusion[gBattlerTarget].state == ILLUSION_ON + || IsSemiInvulnerable(gBattlerTarget, EXCLUDE_COMMANDER)) + { + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_FAILED; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TRANSFORM_FAILED; + } + else + { + s32 i; + u8 *battleMonAttacker, *battleMonTarget; + u8 timesGotHit; + + gBattleMons[gBattlerAttacker].volatiles.transformed = TRUE; + gDisableStructs[gBattlerAttacker].disabledMove = MOVE_NONE; + gDisableStructs[gBattlerAttacker].disableTimer = 0; + gDisableStructs[gBattlerAttacker].transformedMonPersonality = gBattleMons[gBattlerTarget].personality; + if (B_TRANSFORM_SHINY >= GEN_4) + gDisableStructs[gBattlerAttacker].transformedMonShininess = gBattleMons[gBattlerTarget].isShiny; + else + gDisableStructs[gBattlerAttacker].transformedMonShininess = gBattleMons[gBattlerAttacker].isShiny; + gDisableStructs[gBattlerAttacker].mimickedMoves = 0; + gDisableStructs[gBattlerAttacker].usedMoves = 0; + + timesGotHit = GetBattlerPartyState(gBattlerTarget)->timesGotHit; + GetBattlerPartyState(gBattlerAttacker)->timesGotHit = timesGotHit; + + PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].species) + + battleMonAttacker = (u8 *)(&gBattleMons[gBattlerAttacker]); + battleMonTarget = (u8 *)(&gBattleMons[gBattlerTarget]); + + for (i = 0; i < offsetof(struct BattlePokemon, pp); i++) + battleMonAttacker[i] = battleMonTarget[i]; + + gDisableStructs[gBattlerAttacker].overwrittenAbility = GetBattlerAbility(gBattlerTarget); + for (i = 0; i < MAX_MON_MOVES; i++) + { + u32 pp = GetMovePP(gBattleMons[gBattlerAttacker].moves[i]); + if (pp < 5) + gBattleMons[gBattlerAttacker].pp[i] = pp; + else + gBattleMons[gBattlerAttacker].pp[i] = 5; + } + + // update AI knowledge + RecordAllMoves(gBattlerAttacker); + RecordAbilityBattle(gBattlerAttacker, gBattleMons[gBattlerAttacker].ability); + + BtlController_EmitResetActionMoveSelection(gBattlerAttacker, B_COMM_TO_CONTROLLER, RESET_MOVE_SELECTION); + MarkBattlerForControllerExec(gBattlerAttacker); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TRANSFORMED; + } } -static void Cmd_setprotectlike(void) +static void Cmd_setsubstitute(void) { CMD_ARGS(); - bool32 protectFails = TRUE; - bool32 notLastTurn = TRUE; - u32 protectMethod = GetMoveProtectMethod(gCurrentMove); + u32 factor = GetMoveEffect(gCurrentMove) == EFFECT_SHED_TAIL ? 2 : 4; + s32 hp = 0; - TryResetProtectUseCounter(gBattlerAttacker); + if (factor == 2) + hp = (GetNonDynamaxMaxHP(gBattlerAttacker)+1) / factor; // shed tail rounds up + else + hp = GetNonDynamaxMaxHP(gBattlerAttacker) / factor; // one bit value will only work for PokΓ©mon which max hp can go to 1020(which is more than possible in games) - if (gCurrentTurnActionNumber == (gBattlersCount - 1)) - notLastTurn = FALSE; + if (hp == 0) + hp = 1; - if ((sProtectSuccessRates[gDisableStructs[gBattlerAttacker].protectUses] >= Random() && notLastTurn) - || (protectMethod == PROTECT_WIDE_GUARD && B_WIDE_GUARD != GEN_5) - || (protectMethod == PROTECT_QUICK_GUARD && B_QUICK_GUARD != GEN_5)) + if (gBattleMons[gBattlerAttacker].hp <= hp) { - if (GetMoveEffect(gCurrentMove) == EFFECT_ENDURE) + hp = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SUBSTITUTE_FAILED; + } + else + { + gBattleMons[gBattlerAttacker].volatiles.substitute = TRUE; + gBattleMons[gBattlerAttacker].volatiles.wrapped = FALSE; + // gDisableStructs[gBattlerAttacker].substituteHP = (factor == 2) ? (hp / 2) : hp; + if (factor == 2) + gDisableStructs[gBattlerAttacker].substituteHP = hp / 2; + else + gDisableStructs[gBattlerAttacker].substituteHP = hp; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SUBSTITUTE; + } + + gBattleStruct->passiveHpUpdate[gBattlerAttacker] = hp; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void Cmd_mimicattackcopy(void) +{ + CMD_ARGS(const u8 *failInstr); + + if ((IsMoveMimicBanned(gLastMoves[gBattlerTarget])) + || (gBattleMons[gBattlerAttacker].volatiles.transformed) + || gLastMoves[gBattlerTarget] == MOVE_NONE + || gLastMoves[gBattlerTarget] == MOVE_UNAVAILABLE) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + int i; + + for (i = 0; i < MAX_MON_MOVES; i++) { - gProtectStructs[gBattlerAttacker].endured = TRUE; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BRACED_ITSELF; + if (gBattleMons[gBattlerAttacker].moves[i] == gLastMoves[gBattlerTarget]) + break; } - else if (GetProtectType(protectMethod) == PROTECT_TYPE_SIDE) + + if (i == MAX_MON_MOVES) { - gProtectStructs[gBattlerAttacker].protected = protectMethod; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECTED_TEAM; + gChosenMove = 0xFFFF; + gBattleMons[gBattlerAttacker].moves[gCurrMovePos] = gLastMoves[gBattlerTarget]; + u32 pp = GetMovePP(gLastMoves[gBattlerTarget]); + if (pp < 5) + gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = pp; + else + gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = 5; + + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastMoves[gBattlerTarget]) + + gDisableStructs[gBattlerAttacker].mimickedMoves |= 1u << gCurrMovePos; + gBattlescriptCurrInstr = cmd->nextInstr; } else { - gProtectStructs[gBattlerAttacker].protected = protectMethod; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECTED_ITSELF; + gBattlescriptCurrInstr = cmd->failInstr; } - - gDisableStructs[gBattlerAttacker].protectUses++; - protectFails = FALSE; - } - - if (protectFails) - { - gDisableStructs[gBattlerAttacker].protectUses = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECT_FAILED; - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; } - - gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_tryexplosion(void) +static void Cmd_setcalledmove(void) { CMD_ARGS(); - - if (gBattleControllerExecFlags) - return; - - gBattleStruct->moveDamage[gBattlerAttacker] = gBattleMons[gBattlerAttacker].hp; - BtlController_EmitHealthBarUpdate(gBattlerAttacker, B_COMM_TO_CONTROLLER, INSTANT_HP_BAR_DROP); - MarkBattlerForControllerExec(gBattlerAttacker); + gCurrentMove = gCalledMove; gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_setatkhptozero(void) +static void Cmd_unused_0x9f(void) { - CMD_ARGS(); - - if (gBattleControllerExecFlags) - return; +} - gBattleMons[gBattlerAttacker].hp = 0; - BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[gBattlerAttacker].hp), &gBattleMons[gBattlerAttacker].hp); - MarkBattlerForControllerExec(gBattlerAttacker); +static void Cmd_unused_0xA0(void) +{ +} - gBattlescriptCurrInstr = cmd->nextInstr; +static void CalcReflectBackDamage(u32 baseDamage, u32 percentMult) +{ + s32 damage = (baseDamage - 1) * percentMult / 100; + damage = max(damage, 1); + gBattleStruct->moveDamage[gBattlerTarget] = damage; } -static void Cmd_jumpifnexttargetvalid(void) +static void Cmd_counterdamagecalculator(void) { - CMD_ARGS(const u8 *jumpInstr); + CMD_ARGS(const u8 *failInstr); - const u8 *jumpInstr = cmd->jumpInstr; + u8 sideAttacker = GetBattlerSide(gBattlerAttacker); + u8 sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].physicalBattlerId); - for (gBattlerTarget++; gBattlerTarget < gBattlersCount; gBattlerTarget++) + if (gProtectStructs[gBattlerAttacker].physicalDmg + && sideAttacker != sideTarget + && gBattleMons[gProtectStructs[gBattlerAttacker].physicalBattlerId].hp) { - if (gBattlerTarget == gBattlerAttacker && !(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove) & MOVE_TARGET_USER)) - continue; - if (IsBattlerAlive(gBattlerTarget)) - break; - } + if (IsAffectedByFollowMe(gBattlerAttacker, sideTarget, gCurrentMove)) + gBattlerTarget = gSideTimers[sideTarget].followmeTarget; + else + gBattlerTarget = gProtectStructs[gBattlerAttacker].physicalBattlerId; - if (gBattlerTarget >= gBattlersCount) - { - gBattlerTarget = gBattlersCount - 1; + CalcReflectBackDamage(gProtectStructs[gBattlerAttacker].physicalDmg, 200); gBattlescriptCurrInstr = cmd->nextInstr; } else { - gBattlescriptCurrInstr = jumpInstr; + gBattlescriptCurrInstr = cmd->failInstr; } } -static void Cmd_tryhealhalfhealth(void) +// A copy of Cmd with the physical -> special field changes +static void Cmd_mirrorcoatdamagecalculator(void) { - CMD_ARGS(const u8 *failInstr, u8 battler); + CMD_ARGS(const u8 *failInstr); - const u8 *failInstr = cmd->failInstr; + u8 sideAttacker = GetBattlerSide(gBattlerAttacker); + u8 sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].specialBattlerId); - if (cmd->battler == BS_ATTACKER) - gBattlerTarget = gBattlerAttacker; + if (gProtectStructs[gBattlerAttacker].specialDmg + && sideAttacker != sideTarget + && gBattleMons[gProtectStructs[gBattlerAttacker].specialBattlerId].hp) + { - gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxMaxHP(gBattlerTarget) / 2; - if (gBattleStruct->moveDamage[gBattlerTarget] == 0) - gBattleStruct->moveDamage[gBattlerTarget] = 1; - gBattleStruct->moveDamage[gBattlerTarget] *= -1; + if (IsAffectedByFollowMe(gBattlerAttacker, sideTarget, gCurrentMove)) + gBattlerTarget = gSideTimers[sideTarget].followmeTarget; + else + gBattlerTarget = gProtectStructs[gBattlerAttacker].specialBattlerId; - if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) - gBattlescriptCurrInstr = failInstr; - else + CalcReflectBackDamage(gProtectStructs[gBattlerAttacker].specialDmg, 200); gBattlescriptCurrInstr = cmd->nextInstr; -} - -static void SetMoveForMirrorMove(u32 move) -{ - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; - // Edge case, we used Z Mirror Move, got the stat boost and now need to use the Z-move - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(move)) - { - gBattleStruct->zmove.baseMoves[gBattlerAttacker] = move; - gCurrentMove = GetTypeBasedZMove(move); } else { - gCurrentMove = move; + gBattlescriptCurrInstr = cmd->failInstr; } - - gBattlerTarget = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); - ResetValuesForCalledMove(); - gBattlescriptCurrInstr = GetMoveBattleScript(gCurrentMove); } -static void Cmd_trymirrormove(void) +static void Cmd_disablelastusedattack(void) { - CMD_ARGS(); - - s32 i, validMovesCount; - u16 move; - u16 validMoves[MAX_BATTLERS_COUNT] = {0}; + CMD_ARGS(const u8 *failInstr); - for (validMovesCount = 0, i = 0; i < gBattlersCount; i++) - { - if (i != gBattlerAttacker) - { - move = gBattleStruct->lastTakenMoveFrom[gBattlerAttacker][i]; - if (move != MOVE_NONE && move != MOVE_UNAVAILABLE) - { - validMoves[validMovesCount] = move; - validMovesCount++; - } - } - } + s32 i; - move = gBattleStruct->lastTakenMove[gBattlerAttacker]; - if (move != MOVE_NONE && move != MOVE_UNAVAILABLE) + for (i = 0; i < MAX_MON_MOVES; i++) { - SetMoveForMirrorMove(move); + if (gBattleMons[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget]) + break; } - else if (validMovesCount != 0) + if (gDisableStructs[gBattlerTarget].disabledMove == MOVE_NONE + && i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] != 0) { - SetMoveForMirrorMove(validMoves[Random() % validMovesCount]); + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].moves[i]) + + gDisableStructs[gBattlerTarget].disabledMove = gBattleMons[gBattlerTarget].moves[i]; + if (B_DISABLE_TURNS >= GEN_5) + gDisableStructs[gBattlerTarget].disableTimer = 4; + else if (B_DISABLE_TURNS >= GEN_4) + gDisableStructs[gBattlerTarget].disableTimer = (Random() & 3) + 4; // 4-7 turns + else + gDisableStructs[gBattlerTarget].disableTimer = (Random() & 3) + 2; // 2-5 turns + gBattlescriptCurrInstr = cmd->nextInstr; } - else // no valid moves found + else { - gBattlescriptCurrInstr = cmd->nextInstr; + gBattlescriptCurrInstr = cmd->failInstr; } } -static void Cmd_setfieldweather(void) +static void Cmd_trysetencore(void) { - CMD_ARGS(u8 weather); + CMD_ARGS(const u8 *failInstr); - u8 battleWeatherId = cmd->weather; + s32 i; - if (!TryChangeBattleWeather(gBattlerAttacker, battleWeatherId, FALSE)) + if (IsMaxMove(gLastMoves[gBattlerTarget]) && !(GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX)) { - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_FAILED; - gBattlescriptCurrInstr = cmd->nextInstr; - return; + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (gBattleMons[gBattlerTarget].moves[i] == gBattleStruct->dynamax.baseMoves[gBattlerTarget]) + break; + } } - - switch (battleWeatherId) + else { - case BATTLE_WEATHER_RAIN: - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_RAIN; - break; - case BATTLE_WEATHER_SUN: - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SUNLIGHT; - break; - case BATTLE_WEATHER_SANDSTORM: - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SANDSTORM; - break; - case BATTLE_WEATHER_HAIL: - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_HAIL; - break; - case BATTLE_WEATHER_SNOW: - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SNOW; - break; + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (gBattleMons[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget]) + break; + } } - gBattlescriptCurrInstr = cmd->nextInstr; -} - -static void Cmd_setreflect(void) -{ - CMD_ARGS(); - if (!TrySetReflect(gBattlerAttacker)) + if ((IsMoveEncoreBanned(gLastMoves[gBattlerTarget])) + || i == MAX_MON_MOVES + || gLastMoves[gBattlerTarget] == MOVE_NONE + || gLastMoves[gBattlerTarget] == MOVE_UNAVAILABLE + || gBattleMons[gBattlerTarget].pp[i] == 0 + || gDisableStructs[gBattlerTarget].encoredMove != MOVE_NONE + || GetMoveEffect(gChosenMoveByBattler[gBattlerTarget]) == EFFECT_SHELL_TRAP) { - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED; + gBattlescriptCurrInstr = cmd->failInstr; } + else + { + gDisableStructs[gBattlerTarget].encoredMove = gBattleMons[gBattlerTarget].moves[i]; + gDisableStructs[gBattlerTarget].encoredMovePos = i; - gBattlescriptCurrInstr = cmd->nextInstr; + // If the target's selected move is not the same as the move being Encored into, + // the target will select a random opposing target + // Redirection such as Follow Me is already covered in HandleAction_UseMove of battle_util.c + if (gDisableStructs[gBattlerTarget].encoredMove != GetChosenMoveFromPosition(gBattlerTarget)) + gBattleStruct->moveTarget[gBattlerTarget] = SetRandomTarget(gBattlerTarget); + + // Encore always lasts 3 turns, but we need to account for a scenario where Encore changes the move during the same turn. + if (HasBattlerActedThisTurn(gBattlerTarget)) + gDisableStructs[gBattlerTarget].encoreTimer = 4; + else + gDisableStructs[gBattlerTarget].encoreTimer = 3; + gBattlescriptCurrInstr = cmd->nextInstr; + } } -static void Cmd_setseeded(void) +static void Cmd_painsplitdmgcalc(void) { - CMD_ARGS(); + CMD_ARGS(const u8 *failInstr); - if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT || gStatuses3[gBattlerTarget] & STATUS3_LEECHSEED) - { - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_MISS; - } - else if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_GRASS)) + if (!(DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove))) { - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_FAIL; + s32 hpDiff = (gBattleMons[gBattlerAttacker].hp + GetNonDynamaxHP(gBattlerTarget)) / 2; + + gBattleStruct->passiveHpUpdate[gBattlerTarget] = GetNonDynamaxHP(gBattlerTarget) - hpDiff; + gBattleStruct->passiveHpUpdate[gBattlerAttacker] = gBattleMons[gBattlerAttacker].hp - hpDiff; + + gBattlescriptCurrInstr = cmd->nextInstr; } else { - gStatuses3[gBattlerTarget] |= gBattlerAttacker; - gStatuses3[gBattlerTarget] |= STATUS3_LEECHSEED; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_SET; + gBattlescriptCurrInstr = cmd->failInstr; } - - gBattlescriptCurrInstr = cmd->nextInstr; } -// TODO: Needs tests for everything -static void Cmd_manipulatedamage(void) +// Conversion 2 +static void Cmd_settypetorandomresistance(void) { - CMD_ARGS(u8 mode); + CMD_ARGS(const u8 *failInstr); - switch (cmd->mode) + // Before Gen 5 Conversion 2 only worked on a move the attacker was actually hit by. + // This changed later to the last move used by the selected target. + u32 moveToCheck; + u32 typeToCheck; + + if (GetConfig(CONFIG_UPDATED_CONVERSION_2) < GEN_5) { - case DMG_CHANGE_SIGN: - gBattleStruct->moveDamage[gBattlerAttacker] *= -1; - break; - case DMG_DOUBLED: - gBattleStruct->moveDamage[gBattlerTarget] *= 2; - break; - case DMG_1_8_TARGET_HP: - gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxMaxHP(gBattlerTarget) / 8; - if (gBattleStruct->moveDamage[gBattlerTarget] == 0) - gBattleStruct->moveDamage[gBattlerTarget] = 1; - break; - case DMG_FULL_ATTACKER_HP: - gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxMaxHP(gBattlerAttacker); - break; - case DMG_BIG_ROOT: - gBattleStruct->moveDamage[gBattlerAttacker] = GetDrainedBigRootHp(gBattlerAttacker, gBattleStruct->moveDamage[gBattlerAttacker]); - break; - case DMG_CURR_ATTACKER_HP: - gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxHP(gBattlerAttacker); - break; + moveToCheck = gLastLandedMoves[gBattlerAttacker]; + if (GetMoveEffect(moveToCheck) == EFFECT_STRUGGLE) + typeToCheck = TYPE_NORMAL; + else + typeToCheck = gLastHitByType[gBattlerAttacker]; + } + else + { + moveToCheck = gLastResultingMoves[gBattlerTarget]; + typeToCheck = gLastUsedMoveType[gBattlerTarget]; } - gBattlescriptCurrInstr = cmd->nextInstr; -} - -static void Cmd_trysetrest(void) -{ - CMD_ARGS(const u8 *failInstr); - - const u8 *failInstr = cmd->failInstr; - gBattlerTarget = gBattlerAttacker; - gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].maxHP * (-1); - - if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) + if (moveToCheck == MOVE_NONE + || moveToCheck == MOVE_UNAVAILABLE) { - gBattlescriptCurrInstr = failInstr; + gBattlescriptCurrInstr = cmd->failInstr; } - else if (IsBattlerTerrainAffected(gBattlerTarget, STATUS_FIELD_ELECTRIC_TERRAIN)) + else if (!BreaksThroughSemiInvulnerablity(gBattlerTarget, moveToCheck)) { - gBattlescriptCurrInstr = BattleScript_ElectricTerrainPrevents; + gBattlescriptCurrInstr = cmd->failInstr; } - else if (IsBattlerTerrainAffected(gBattlerTarget, STATUS_FIELD_MISTY_TERRAIN)) + else if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA) { - gBattlescriptCurrInstr = BattleScript_MistyTerrainPrevents; + gBattlescriptCurrInstr = cmd->failInstr; + } + else if (typeToCheck == TYPE_NONE || typeToCheck == TYPE_STELLAR || typeToCheck == TYPE_MYSTERY) + { + gBattlescriptCurrInstr = cmd->failInstr; } else { - if (gBattleMons[gBattlerTarget].status1 & ((u8)(~STATUS1_SLEEP))) - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_REST_STATUSED; - else - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_REST; + u32 i, resistTypes = 0; - gBattleMons[gBattlerTarget].status1 = STATUS1_SLEEP_TURN(3); - BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); - MarkBattlerForControllerExec(gBattlerTarget); - gBattlescriptCurrInstr = cmd->nextInstr; + for (i = 0; i < NUMBER_OF_MON_TYPES; i++) // Find all types that resist. + { + switch (GetTypeModifier(typeToCheck, i)) + { + case UQ_4_12(0): + case UQ_4_12(0.5): + resistTypes |= 1u << i; + break; + } + } + + while (resistTypes != 0) + { + i = Random() % NUMBER_OF_MON_TYPES; + if (resistTypes & 1u << i) + { + if (IS_BATTLER_OF_TYPE(gBattlerAttacker, i)) + { + resistTypes &= ~(1u << i); // Type resists, but the user is already of this type. + } + else + { + SET_BATTLER_TYPE(gBattlerAttacker, i); + PREPARE_TYPE_BUFFER(gBattleTextBuff1, i); + gBattlescriptCurrInstr = cmd->nextInstr; + return; + } + } + } + + gBattlescriptCurrInstr = cmd->failInstr; } } -static void Cmd_jumpifnotfirstturn(void) +static void Cmd_setalwayshitflag(void) { - CMD_ARGS(const u8 *jumpInstr); - - const u8 *jumpInstr = cmd->jumpInstr; - - if (gDisableStructs[gBattlerAttacker].isFirstTurn && !(gSpecialStatuses[gBattlerAttacker].instructedChosenTarget)) - gBattlescriptCurrInstr = cmd->nextInstr; - else - gBattlescriptCurrInstr = jumpInstr; + CMD_ARGS(); + gBattleMons[gBattlerTarget].volatiles.lockOn = 2; + gDisableStructs[gBattlerTarget].battlerWithSureHit = gBattlerAttacker; + gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_setmiracleeye(void) +// Sketch +static void Cmd_copymovepermanently(void) { CMD_ARGS(const u8 *failInstr); - if (!(gStatuses3[gBattlerTarget] & STATUS3_MIRACLE_EYED)) + gChosenMove = MOVE_UNAVAILABLE; + + if (!(gBattleMons[gBattlerAttacker].volatiles.transformed) + && gLastPrintedMoves[gBattlerTarget] != MOVE_UNAVAILABLE + && !IsMoveSketchBanned(gLastPrintedMoves[gBattlerTarget])) { - gStatuses3[gBattlerTarget] |= STATUS3_MIRACLE_EYED; - gBattlescriptCurrInstr = cmd->nextInstr; + s32 i; + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (GetMoveEffect(gBattleMons[gBattlerAttacker].moves[i]) == EFFECT_SKETCH) + continue; + if (gBattleMons[gBattlerAttacker].moves[i] == gLastPrintedMoves[gBattlerTarget]) + break; + } + + if (i != MAX_MON_MOVES) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else // sketch worked + { + struct MovePpInfo movePpData; + + gBattleMons[gBattlerAttacker].moves[gCurrMovePos] = gLastPrintedMoves[gBattlerTarget]; + gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = GetMovePP(gLastPrintedMoves[gBattlerTarget]); + + for (i = 0; i < MAX_MON_MOVES; i++) + { + movePpData.moves[i] = gBattleMons[gBattlerAttacker].moves[i]; + movePpData.pp[i] = gBattleMons[gBattlerAttacker].pp[i]; + } + movePpData.ppBonuses = gBattleMons[gBattlerAttacker].ppBonuses; + + BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_MOVES_PP_BATTLE, 0, sizeof(movePpData), &movePpData); + MarkBattlerForControllerExec(gBattlerAttacker); + + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastPrintedMoves[gBattlerTarget]) + + gBattlescriptCurrInstr = cmd->nextInstr; + } } else { @@ -12000,1441 +11659,1173 @@ static void Cmd_setmiracleeye(void) } } -bool8 UproarWakeUpCheck(u8 battler) +static void Cmd_unused_0xA9(void) { - s32 i; - bool32 hasSoundproof = (B_UPROAR_IGNORE_SOUNDPROOF < GEN_5 && GetBattlerAbility(battler) == ABILITY_SOUNDPROOF); +} - for (i = 0; i < gBattlersCount; i++) +static inline bool32 IsDanamaxMonPresent(void) +{ + for (u32 battler = 0; battler < gBattlersCount; battler++) { - if (!(gBattleMons[i].status2 & STATUS2_UPROAR) || hasSoundproof) + if (battler == gBattlerAttacker) continue; - gBattleScripting.battler = i; - - if (gBattlerTarget == 0xFF) - gBattlerTarget = i; - else if (gBattlerTarget == i) - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CANT_SLEEP_UPROAR; - else - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_KEPT_AWAKE; - - break; + if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX) + return TRUE; } - if (i == gBattlersCount) - return FALSE; - else - return TRUE; + return FALSE; } -static void Cmd_jumpifuproarwakes(void) +static void Cmd_unused_AA(void) { - CMD_ARGS(const u8 *jumpInstr); - - if (UproarWakeUpCheck(gBattlerTarget)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_stockpile(void) +static void Cmd_unused_0xab(void) { - CMD_ARGS(u8 id); - - switch (cmd->id) - { - case 0: - if (gDisableStructs[gBattlerAttacker].stockpileCounter >= 3) - { - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CANT_STOCKPILE; - } - else - { - gDisableStructs[gBattlerAttacker].stockpileCounter++; - gDisableStructs[gBattlerAttacker].stockpileBeforeDef = gBattleMons[gBattlerAttacker].statStages[STAT_DEF]; - gDisableStructs[gBattlerAttacker].stockpileBeforeSpDef = gBattleMons[gBattlerAttacker].statStages[STAT_SPDEF]; - PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[gBattlerAttacker].stockpileCounter); - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STOCKPILED; - } - break; - case 1: // Save def/sp def stats. - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) - { - gDisableStructs[gBattlerAttacker].stockpileDef += gBattleMons[gBattlerAttacker].statStages[STAT_DEF] - gDisableStructs[gBattlerAttacker].stockpileBeforeDef; - gDisableStructs[gBattlerAttacker].stockpileSpDef += gBattleMons[gBattlerAttacker].statStages[STAT_SPDEF] - gDisableStructs[gBattlerAttacker].stockpileBeforeSpDef; - } - break; - } - - gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_stockpiletobasedamage(void) +static void Cmd_settailwind(void) { CMD_ARGS(const u8 *failInstr); - const u8 *failInstr = cmd->failInstr; - if (gDisableStructs[gBattlerAttacker].stockpileCounter == 0) + u8 side = GetBattlerSide(gBattlerAttacker); + + if (!(gSideStatuses[side] & SIDE_STATUS_TAILWIND)) { - gBattlescriptCurrInstr = failInstr; + gSideStatuses[side] |= SIDE_STATUS_TAILWIND; + gSideTimers[side].tailwindTimer = (GetConfig(CONFIG_TAILWIND_TURNS) >= GEN_5 ? 4 : 3); + gBattlescriptCurrInstr = cmd->nextInstr; } else { - if (gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED) - gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; - - gBattlescriptCurrInstr = cmd->nextInstr; + gBattlescriptCurrInstr = cmd->failInstr; } } -static void Cmd_stockpiletohpheal(void) +static void Cmd_tryspiteppreduce(void) { CMD_ARGS(const u8 *failInstr); - const u8 *failInstr = cmd->failInstr; - - if (gDisableStructs[gBattlerAttacker].stockpileCounter == 0 && !gBattleStruct->snatchedMoveIsUsed) - { - gBattlescriptCurrInstr = failInstr; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWALLOW_FAILED; - } - else + if (gLastMoves[gBattlerTarget] != MOVE_NONE + && gLastMoves[gBattlerTarget] != MOVE_UNAVAILABLE) { - if (gBattleMons[gBattlerAttacker].maxHP == gBattleMons[gBattlerAttacker].hp) + s32 i; + + // Get move slot to reduce PP. + if (IsMaxMove(gLastMoves[gBattlerTarget])) { - gDisableStructs[gBattlerAttacker].stockpileCounter = 0; - gBattlescriptCurrInstr = failInstr; - gBattlerTarget = gBattlerAttacker; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWALLOW_FULL_HP; + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (gBattleStruct->dynamax.baseMoves[gBattlerTarget] == gBattleMons[gBattlerTarget].moves[i]) + break; + } } else { - if (gDisableStructs[gBattlerAttacker].stockpileCounter > 0) + for (i = 0; i < MAX_MON_MOVES; i++) { - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / (1 << (3 - gDisableStructs[gBattlerAttacker].stockpileCounter)); - gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; + if (gLastMoves[gBattlerTarget] == gBattleMons[gBattlerTarget].moves[i]) + break; } - else // Snatched move + } + + if (i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] > (B_CAN_SPITE_FAIL >= GEN_4 ? 0 : 1)) + { + s32 ppToDeduct = B_PP_REDUCED_BY_SPITE >= GEN_4 ? 4 : (Random() & 3) + 2; + // G-Max Depletion only deducts 2 PP. + if (IsMaxMove(gCurrentMove) && MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_SPITE)) + ppToDeduct = 2; + + if (gBattleMons[gBattlerTarget].pp[i] < ppToDeduct) + ppToDeduct = gBattleMons[gBattlerTarget].pp[i]; + + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastMoves[gBattlerTarget]) + + ConvertIntToDecimalStringN(gBattleTextBuff2, ppToDeduct, STR_CONV_MODE_LEFT_ALIGN, 1); + + PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 1, ppToDeduct) + + gBattleMons[gBattlerTarget].pp[i] -= ppToDeduct; + + // if (MOVE_IS_PERMANENT(gBattlerTarget, i)), but backwards + if (!(gDisableStructs[gBattlerTarget].mimickedMoves & (1u << i)) + && !(gBattleMons[gBattlerTarget].volatiles.transformed)) { - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; - gBattleScripting.animTurn = 1; + BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + i, 0, sizeof(gBattleMons[gBattlerTarget].pp[i]), &gBattleMons[gBattlerTarget].pp[i]); + MarkBattlerForControllerExec(gBattlerTarget); } - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - gBattleStruct->moveDamage[gBattlerAttacker] *= -1; - gBattlescriptCurrInstr = cmd->nextInstr; - gBattlerTarget = gBattlerAttacker; + + // Don't cut off Sky Drop if pp is brought to zero. + if (gBattleMons[gBattlerTarget].pp[i] == 0 && gBattleStruct->skyDropTargets[gBattlerTarget] == SKY_DROP_NO_TARGET) + CancelMultiTurnMoves(gBattlerTarget, SKY_DROP_IGNORE); + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; } } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } } -void BS_RemoveStockpileCounters(void) +static void Cmd_healpartystatus(void) { - NATIVE_ARGS(); + CMD_ARGS(); - if (GetMoveEffect(gCurrentMove) == EFFECT_SWALLOW - && gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_1ST_HIT - && IsBattlerAlive(gBattlerTarget)) + u32 i = 0; + u32 zero = 0; + u32 toHeal = 0; + u32 partner = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerAttacker))); + struct Pokemon *party = GetBattlerParty(gBattlerAttacker); + bool32 isSoundMove = IsSoundMove(gCurrentMove); + + if (GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 + || GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) >= GEN_8 + || !(isSoundMove && GetBattlerAbility(gBattlerAttacker) == ABILITY_SOUNDPROOF)) { - gBattlescriptCurrInstr = cmd->nextInstr; + if (isSoundMove) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BELL; + else + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SOOTHING_AROMA; + gBattleMons[gBattlerAttacker].status1 = 0; + gBattleMons[gBattlerAttacker].volatiles.nightmare = FALSE; } else { - gDisableStructs[gBattlerAttacker].stockpileCounter = 0; - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = BattleScript_MoveEffectStockpileWoreOff; + RecordAbilityBattle(gBattlerAttacker, gBattleMons[gBattlerAttacker].ability); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BELL_SOUNDPROOF_ATTACKER; } -} -// Sign change for drained HP handled in GetDrainedBigRootHp -static void Cmd_setdrainedhp(void) -{ - CMD_ARGS(); + gBattleScripting.battler = partner; + + if (IsBattlerAlive(partner)) + { + if (GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 + || !(isSoundMove && GetBattlerAbility(partner) == ABILITY_SOUNDPROOF)) + { + gBattleMons[partner].status1 = 0; + gBattleMons[partner].volatiles.nightmare = FALSE; + } + else + { + RecordAbilityBattle(partner, gBattleMons[partner].ability); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BELL_SOUNDPROOF_PARTNER; + } + } + + // Because the above MULTISTRING_CHOOSER are ORd, if both are set then it will be B_MSG_BELL_BOTH_SOUNDPROOF + + for (i = 0; i < PARTY_SIZE; i++) + { + u16 species = GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG); + u8 abilityNum = GetMonData(&party[i], MON_DATA_ABILITY_NUM); + + if (species != SPECIES_NONE && species != SPECIES_EGG) + { + enum Ability ability; + bool32 isAttacker = gBattlerPartyIndexes[gBattlerAttacker] == i; + bool32 isDoublesPartner = gBattlerPartyIndexes[partner] == i && IsBattlerAlive(partner); + + if (GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 + || (GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) >= GEN_8 && isAttacker)) + ability = ABILITY_NONE; + else if (GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) > GEN_5 && !isAttacker && !isDoublesPartner) + ability = ABILITY_NONE; + else if (isAttacker) + ability = GetBattlerAbility(gBattlerAttacker); + else if (isDoublesPartner) + ability = GetBattlerAbility(partner); + else + { + ability = GetAbilityBySpecies(species, abilityNum); + #if TESTING + if (gTestRunnerEnabled) + { + u32 side = GetBattlerSide(gBattlerAttacker); + if (TestRunner_Battle_GetForcedAbility(side, i)) + ability = TestRunner_Battle_GetForcedAbility(side, i); + } + #endif + } - gBattleStruct->moveDamage[gBattlerAttacker] = (gBattleStruct->moveDamage[gBattlerTarget] * GetMoveAbsorbPercentage(gCurrentMove) / 100); + if (!(isSoundMove && ability == ABILITY_SOUNDPROOF)) + { + toHeal |= (1 << i); + TryDeactivateSleepClause(GetBattlerSide(gBattlerAttacker), i); + } + } + } - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; + if (toHeal) + { + BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, toHeal, sizeof(zero), &zero); + MarkBattlerForControllerExec(gBattlerAttacker); + } gBattlescriptCurrInstr = cmd->nextInstr; } -static u16 ReverseStatChangeMoveEffect(u16 moveEffect) +static void Cmd_cursetarget(void) { - switch (moveEffect) + CMD_ARGS(const u8 *failInstr); + + if (gBattleMons[gBattlerTarget].volatiles.cursed) { - // +1 - case MOVE_EFFECT_ATK_PLUS_1: - return MOVE_EFFECT_ATK_MINUS_1; - case MOVE_EFFECT_DEF_PLUS_1: - return MOVE_EFFECT_DEF_MINUS_1; - case MOVE_EFFECT_SPD_PLUS_1: - return MOVE_EFFECT_SPD_MINUS_1; - case MOVE_EFFECT_SP_ATK_PLUS_1: - return MOVE_EFFECT_SP_ATK_MINUS_1; - case MOVE_EFFECT_SP_DEF_PLUS_1: - return MOVE_EFFECT_SP_DEF_MINUS_1; - case MOVE_EFFECT_ACC_PLUS_1: - return MOVE_EFFECT_ACC_MINUS_1; - case MOVE_EFFECT_EVS_PLUS_1: - return MOVE_EFFECT_EVS_MINUS_1; - // -1 - case MOVE_EFFECT_ATK_MINUS_1: - return MOVE_EFFECT_ATK_PLUS_1; - case MOVE_EFFECT_DEF_MINUS_1: - return MOVE_EFFECT_DEF_PLUS_1; - case MOVE_EFFECT_SPD_MINUS_1: - return MOVE_EFFECT_SPD_PLUS_1; - case MOVE_EFFECT_SP_ATK_MINUS_1: - return MOVE_EFFECT_SP_ATK_PLUS_1; - case MOVE_EFFECT_SP_DEF_MINUS_1: - return MOVE_EFFECT_SP_DEF_PLUS_1; - case MOVE_EFFECT_ACC_MINUS_1: - return MOVE_EFFECT_ACC_PLUS_1; - case MOVE_EFFECT_EVS_MINUS_1: - // +2 - case MOVE_EFFECT_ATK_PLUS_2: - return MOVE_EFFECT_ATK_MINUS_2; - case MOVE_EFFECT_DEF_PLUS_2: - return MOVE_EFFECT_DEF_MINUS_2; - case MOVE_EFFECT_SPD_PLUS_2: - return MOVE_EFFECT_SPD_MINUS_2; - case MOVE_EFFECT_SP_ATK_PLUS_2: - return MOVE_EFFECT_SP_ATK_MINUS_2; - case MOVE_EFFECT_SP_DEF_PLUS_2: - return MOVE_EFFECT_SP_DEF_MINUS_2; - case MOVE_EFFECT_ACC_PLUS_2: - return MOVE_EFFECT_ACC_MINUS_2; - case MOVE_EFFECT_EVS_PLUS_2: - return MOVE_EFFECT_EVS_MINUS_2; - // -2 - case MOVE_EFFECT_ATK_MINUS_2: - return MOVE_EFFECT_ATK_PLUS_2; - case MOVE_EFFECT_DEF_MINUS_2: - return MOVE_EFFECT_DEF_PLUS_2; - case MOVE_EFFECT_SPD_MINUS_2: - return MOVE_EFFECT_SPD_PLUS_2; - case MOVE_EFFECT_SP_ATK_MINUS_2: - return MOVE_EFFECT_SP_ATK_PLUS_2; - case MOVE_EFFECT_SP_DEF_MINUS_2: - return MOVE_EFFECT_SP_DEF_PLUS_2; - case MOVE_EFFECT_ACC_MINUS_2: - return MOVE_EFFECT_ACC_PLUS_2; - case MOVE_EFFECT_EVS_MINUS_2: - return MOVE_EFFECT_EVS_PLUS_2; - default: - return 0; + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + gBattleMons[gBattlerTarget].volatiles.cursed = TRUE; + SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 2); + gBattlescriptCurrInstr = cmd->nextInstr; } } -static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr) +static void Cmd_trysetspikes(void) { - bool32 certain = FALSE; - bool32 notProtectAffected = FALSE; - u32 index, battler, battlerAbility; - enum ItemHoldEffect battlerHoldEffect; - bool32 affectsUser = (flags & MOVE_EFFECT_AFFECTS_USER); - bool32 mirrorArmored = (flags & STAT_CHANGE_MIRROR_ARMOR); + CMD_ARGS(const u8 *failInstr); - if (affectsUser) - battler = gBattlerAttacker; - else - battler = gBattlerTarget; + u8 targetSide = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker)); - battlerAbility = GetBattlerAbility(battler); - battlerHoldEffect = GetBattlerHoldEffect(battler, TRUE); + if (gSideTimers[targetSide].spikesAmount == 3) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + if (gSideTimers[targetSide].spikesAmount == 0) // Add only once to the queue + PushHazardTypeToQueue(targetSide, HAZARDS_SPIKES); + gSideTimers[targetSide].spikesAmount++; + gBattlescriptCurrInstr = cmd->nextInstr; + } +} - gSpecialStatuses[battler].changedStatsBattlerId = gBattlerAttacker; +static void Cmd_setvolatile(void) +{ + CMD_ARGS(u8 battler, u8 _volatile, u8 value); - flags &= ~(MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_MIRROR_ARMOR); + SetMonVolatile(GetBattlerForBattleScript(cmd->battler), cmd->_volatile, cmd->value); + gBattlescriptCurrInstr = cmd->nextInstr; +} - if (flags & MOVE_EFFECT_CERTAIN) - certain = TRUE; - flags &= ~MOVE_EFFECT_CERTAIN; +static void Cmd_trysetperishsong(void) +{ + CMD_ARGS(const u8 *failInstr); - if (flags & STAT_CHANGE_NOT_PROTECT_AFFECTED) - notProtectAffected++; - flags &= ~STAT_CHANGE_NOT_PROTECT_AFFECTED; + s32 i; + s32 notAffectedCount = 0; - if (battlerAbility == ABILITY_CONTRARY) + for (i = 0; i < gBattlersCount; i++) { - statValue ^= STAT_BUFF_NEGATIVE; - gBattleScripting.statChanger ^= STAT_BUFF_NEGATIVE; - RecordAbilityBattle(battler, battlerAbility); - if (flags & STAT_CHANGE_UPDATE_MOVE_EFFECT) + if (gBattleMons[i].volatiles.perishSong + || GetBattlerAbility(i) == ABILITY_SOUNDPROOF + || BlocksPrankster(gCurrentMove, gBattlerAttacker, i, TRUE) + || gBattleMons[i].volatiles.semiInvulnerable == STATE_COMMANDER) { - flags &= ~STAT_CHANGE_UPDATE_MOVE_EFFECT; - gBattleScripting.moveEffect = ReverseStatChangeMoveEffect(gBattleScripting.moveEffect); + notAffectedCount++; + } + else + { + gBattleMons[i].volatiles.perishSong = TRUE; + gDisableStructs[i].perishSongTimer = 3; } - } - else if (battlerAbility == ABILITY_SIMPLE) - { - statValue = (SET_STAT_BUFF_VALUE(GET_STAT_BUFF_VALUE(statValue) * 2)) | ((statValue <= -1) ? STAT_BUFF_NEGATIVE : 0); } - PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); + if (notAffectedCount == gBattlersCount) + gBattlescriptCurrInstr = cmd->failInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} - if (statValue <= -1) // Stat decrease. - { - if (gSideTimers[GetBattlerSide(battler)].mistTimer - && !certain && gCurrentMove != MOVE_CURSE - && !(battler == gBattlerTarget && GetBattlerAbility(gBattlerAttacker) == ABILITY_INFILTRATOR)) - { - if (flags == STAT_CHANGE_ALLOW_PTR) - { - if (gSpecialStatuses[battler].statLowered) - { - gBattlescriptCurrInstr = BS_ptr; - } - else - { - BattleScriptPush(BS_ptr); - gBattleScripting.battler = battler; - gBattlescriptCurrInstr = BattleScript_MistProtected; - gSpecialStatuses[battler].statLowered = TRUE; - } - } - return STAT_CHANGE_DIDNT_WORK; - } - else if (gCurrentMove != MOVE_CURSE - && notProtectAffected != TRUE && JumpIfMoveAffectedByProtect(gCurrentMove, gBattlerTarget, TRUE, BattleScript_ButItFailed)) - { - return STAT_CHANGE_DIDNT_WORK; - } - else if ((battlerHoldEffect == HOLD_EFFECT_CLEAR_AMULET || CanAbilityPreventStatLoss(battlerAbility)) - && (!affectsUser || mirrorArmored) && !certain && gCurrentMove != MOVE_CURSE) - { - if (flags == STAT_CHANGE_ALLOW_PTR) - { - if (gSpecialStatuses[battler].statLowered) - { - gBattlescriptCurrInstr = BS_ptr; - } - else - { - gBattleScripting.battler = battler; - if (battlerHoldEffect == HOLD_EFFECT_CLEAR_AMULET) - { - gLastUsedItem = gBattleMons[battler].item; - BattleScriptPush(BS_ptr); - gBattlescriptCurrInstr = BattleScript_ItemNoStatLoss; - RecordItemEffectBattle(battler, HOLD_EFFECT_CLEAR_AMULET); - } - else - { - gBattlerAbility = battler; - BattleScriptPush(BS_ptr); - gBattlescriptCurrInstr = BattleScript_AbilityNoStatLoss; - gLastUsedAbility = battlerAbility; - RecordAbilityBattle(battler, gLastUsedAbility); - } - gSpecialStatuses[battler].statLowered = TRUE; - } - } - return STAT_CHANGE_DIDNT_WORK; - } - else if ((index = IsFlowerVeilProtected(battler)) && !certain) - { - if (flags == STAT_CHANGE_ALLOW_PTR) - { - if (gSpecialStatuses[battler].statLowered) - { - gBattlescriptCurrInstr = BS_ptr; - } - else - { - BattleScriptPush(BS_ptr); - gBattleScripting.battler = battler; - gBattlerAbility = index - 1; - gBattlescriptCurrInstr = BattleScript_FlowerVeilProtectsRet; - gLastUsedAbility = ABILITY_FLOWER_VEIL; - gSpecialStatuses[battler].statLowered = TRUE; - } - } - return STAT_CHANGE_DIDNT_WORK; - } - else if (!certain - && (((battlerAbility == ABILITY_KEEN_EYE || battlerAbility == ABILITY_MINDS_EYE) && statId == STAT_ACC) - || (B_ILLUMINATE_EFFECT >= GEN_9 && battlerAbility == ABILITY_ILLUMINATE && statId == STAT_ACC) - || (battlerAbility == ABILITY_HYPER_CUTTER && statId == STAT_ATK) - || (battlerAbility == ABILITY_BIG_PECKS && statId == STAT_DEF))) - { - if (flags == STAT_CHANGE_ALLOW_PTR) - { - BattleScriptPush(BS_ptr); - gBattleScripting.battler = battler; - gBattlerAbility = battler; - gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; - gLastUsedAbility = battlerAbility; - RecordAbilityBattle(battler, gLastUsedAbility); - } - return STAT_CHANGE_DIDNT_WORK; - } - else if (battlerAbility == ABILITY_MIRROR_ARMOR && !affectsUser && !mirrorArmored && gBattlerAttacker != gBattlerTarget && battler == gBattlerTarget) - { - if (flags == STAT_CHANGE_ALLOW_PTR) - { - SET_STATCHANGER(statId, GET_STAT_BUFF_VALUE(statValue) | STAT_BUFF_NEGATIVE, TRUE); - BattleScriptPush(BS_ptr); - gBattleScripting.battler = battler; - gBattlerAbility = battler; - gBattlescriptCurrInstr = BattleScript_MirrorArmorReflect; - RecordAbilityBattle(battler, gBattleMons[battler].ability); - } - return STAT_CHANGE_DIDNT_WORK; - } - else // try to decrease - { - statValue = -GET_STAT_BUFF_VALUE(statValue); - if (gBattleMons[battler].statStages[statId] == 1) - statValue = -1; - else if (gBattleMons[battler].statStages[statId] == 2 && statValue < -2) - statValue = -2; - gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; - index = 1; - if (statValue == -2) - { - gBattleTextBuff2[1] = B_BUFF_STRING; - gBattleTextBuff2[2] = STRINGID_STATHARSHLY; - gBattleTextBuff2[3] = STRINGID_STATHARSHLY >> 8; - index = 4; - } - else if (statValue <= -3) - { - gBattleTextBuff2[1] = B_BUFF_STRING; - gBattleTextBuff2[2] = STRINGID_SEVERELY & 0xFF; - gBattleTextBuff2[3] = STRINGID_SEVERELY >> 8; - index = 4; - } - gBattleTextBuff2[index++] = B_BUFF_STRING; - gBattleTextBuff2[index++] = STRINGID_STATFELL; - gBattleTextBuff2[index++] = STRINGID_STATFELL >> 8; - gBattleTextBuff2[index] = B_BUFF_EOS; +static void Cmd_handlerollout(void) +{ + CMD_ARGS(); - if (gBattleMons[battler].statStages[statId] == MIN_STAT_STAGE) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAT_WONT_DECREASE; - } - else - { - gProtectStructs[battler].statFell = TRUE; - gProtectStructs[battler].lashOutAffected = TRUE; - gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == battler); // B_MSG_ATTACKER_STAT_FELL or B_MSG_DEFENDER_STAT_FELL - } - } + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) + { + CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_IGNORE); + gBattlescriptCurrInstr = BattleScript_MoveMissedPause; } - else // stat increase + else { - statValue = GET_STAT_BUFF_VALUE(statValue); - if (gBattleMons[battler].statStages[statId] == 11) - statValue = 1; - else if (gBattleMons[battler].statStages[statId] == 10 && statValue > 2) - statValue = 2; - gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; - index = 1; - if (statValue == 2) - { - gBattleTextBuff2[1] = B_BUFF_STRING; - gBattleTextBuff2[2] = STRINGID_STATSHARPLY; - gBattleTextBuff2[3] = STRINGID_STATSHARPLY >> 8; - index = 4; - } - else if (statValue >= 3) + if (!(gBattleMons[gBattlerAttacker].volatiles.multipleTurns)) // First hit. { - gBattleTextBuff2[1] = B_BUFF_STRING; - gBattleTextBuff2[2] = STRINGID_DRASTICALLY & 0xFF; - gBattleTextBuff2[3] = STRINGID_DRASTICALLY >> 8; - index = 4; + gDisableStructs[gBattlerAttacker].rolloutTimer = 5; + gDisableStructs[gBattlerAttacker].rolloutTimerStartValue = 5; + gBattleMons[gBattlerAttacker].volatiles.multipleTurns = TRUE; + gLockedMoves[gBattlerAttacker] = gCurrentMove; } - gBattleTextBuff2[index++] = B_BUFF_STRING; - gBattleTextBuff2[index++] = STRINGID_STATROSE; - gBattleTextBuff2[index++] = STRINGID_STATROSE >> 8; - gBattleTextBuff2[index] = B_BUFF_EOS; - - if (gBattleMons[battler].statStages[statId] == MAX_STAT_STAGE) + if (--gDisableStructs[gBattlerAttacker].rolloutTimer == 0) // Last hit. { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAT_WONT_INCREASE; + gBattleMons[gBattlerAttacker].volatiles.multipleTurns = FALSE; } - else - { - u32 statIncrease; - if ((statValue + gBattleMons[battler].statStages[statId]) > MAX_STAT_STAGE) - statIncrease = MAX_STAT_STAGE - gBattleMons[battler].statStages[statId]; - else - statIncrease = statValue; - - gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == battler); - gProtectStructs[battler].statRaised = TRUE; - - // Check Mirror Herb / Opportunist - for (index = 0; index < gBattlersCount; index++) - { - if (IsBattlerAlly(index, battler)) - continue; // Only triggers on opposing side - - if (GetBattlerAbility(index) == ABILITY_OPPORTUNIST - && gProtectStructs[battler].activateOpportunist == 0) // don't activate opportunist on other mon's opportunist raises - { - gProtectStructs[index].activateOpportunist = 2; // set stats to copy - } - if (GetBattlerHoldEffect(index, TRUE) == HOLD_EFFECT_MIRROR_HERB) - { - gProtectStructs[index].eatMirrorHerb = 1; - } - if (gProtectStructs[index].activateOpportunist == 2 || gProtectStructs[index].eatMirrorHerb == 1) - { - gQueuedStatBoosts[index].stats |= (1 << (statId - 1)); // -1 to start at atk - gQueuedStatBoosts[index].statChanges[statId - 1] += statIncrease; - } - } - } + gBattlescriptCurrInstr = cmd->nextInstr; } - - gBattleMons[battler].statStages[statId] += statValue; - if (gBattleMons[battler].statStages[statId] < MIN_STAT_STAGE) - gBattleMons[battler].statStages[statId] = MIN_STAT_STAGE; - if (gBattleMons[battler].statStages[statId] > MAX_STAT_STAGE) - gBattleMons[battler].statStages[statId] = MAX_STAT_STAGE; - - if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_STAT_WONT_INCREASE && flags & STAT_CHANGE_ALLOW_PTR) - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - - if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_STAT_WONT_INCREASE && !(flags & STAT_CHANGE_ALLOW_PTR)) - return STAT_CHANGE_DIDNT_WORK; - - return STAT_CHANGE_WORKED; } -static void Cmd_statbuffchange(void) +static void Cmd_jumpifconfusedandstatmaxed(void) { - CMD_ARGS(u16 flags, const u8 *failInstr); - - u16 flags = cmd->flags; - const u8 *ptrBefore = gBattlescriptCurrInstr; - const u8 *failInstr = cmd->failInstr; + CMD_ARGS(u8 stat, const u8 *jumpInstr); - if (ChangeStatBuffs(GET_STAT_BUFF_VALUE_WITH_SIGN(gBattleScripting.statChanger), - GET_STAT_BUFF_ID(gBattleScripting.statChanger), - flags, - failInstr) == STAT_CHANGE_WORKED) + if (gBattleMons[gBattlerTarget].volatiles.confusionTurns > 0 + && !CompareStat(gBattlerTarget, cmd->stat, MAX_STAT_STAGE, CMP_LESS_THAN, GetBattlerAbility(gBattlerTarget))) + gBattlescriptCurrInstr = cmd->jumpInstr; // Fails if we're confused AND stat cannot be raised + else gBattlescriptCurrInstr = cmd->nextInstr; - else if (gBattlescriptCurrInstr == ptrBefore) // Prevent infinite looping. - gBattlescriptCurrInstr = failInstr; } -bool32 TryResetBattlerStatChanges(u8 battler) +static void Cmd_handlefurycutter(void) { - u32 j; - bool32 ret = FALSE; + CMD_ARGS(); - gDisableStructs[battler].stockpileDef = 0; - gDisableStructs[battler].stockpileSpDef = 0; - for (j = 0; j < NUM_BATTLE_STATS; j++) + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) { - if (gBattleMons[battler].statStages[j] != DEFAULT_STAT_STAGE) - ret = TRUE; // returns TRUE if any stat was reset - - gBattleMons[battler].statStages[j] = DEFAULT_STAT_STAGE; + gDisableStructs[gBattlerAttacker].furyCutterCounter = 0; + gBattlescriptCurrInstr = BattleScript_MoveMissedPause; } + else + { + u32 max; - return ret; -} - -// Haze -static void Cmd_normalisebuffs(void) -{ - CMD_ARGS(); - - s32 i; + if (B_UPDATED_MOVE_DATA >= GEN_6) + max = 3; + else if (B_UPDATED_MOVE_DATA == GEN_5) + max = 4; + else + max = 5; - for (i = 0; i < gBattlersCount; i++) - TryResetBattlerStatChanges(i); + if (gDisableStructs[gBattlerAttacker].furyCutterCounter < max + && gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_2ND_HIT) // Don't increment counter on second hit + gDisableStructs[gBattlerAttacker].furyCutterCounter++; - gBattlescriptCurrInstr = cmd->nextInstr; + gBattlescriptCurrInstr = cmd->nextInstr; + } } -static void Cmd_setbide(void) +static void Cmd_setembargo(void) { - CMD_ARGS(); - - gBattleMons[gBattlerAttacker].status2 |= STATUS2_MULTIPLETURNS; - gLockedMoves[gBattlerAttacker] = gCurrentMove; - gBideDmg[gBattlerAttacker] = 0; - gBattleMons[gBattlerAttacker].status2 |= STATUS2_BIDE_TURN(2); + CMD_ARGS(const u8 *failInstr); - gBattlescriptCurrInstr = cmd->nextInstr; + if (gBattleMons[gBattlerTarget].volatiles.embargo) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + gBattleMons[gBattlerTarget].volatiles.embargo = TRUE; + gDisableStructs[gBattlerTarget].embargoTimer = 5; + gBattlescriptCurrInstr = cmd->nextInstr; + } } -static void Cmd_twoturnmoveschargestringandanimation(void) +static void Cmd_presentdamagecalculation(void) { - CMD_ARGS(const u8 *animationThenStringPtr); + CMD_ARGS(); - gBattleScripting.savedStringId = GetMoveTwoTurnAttackStringId(gCurrentMove); - if (B_UPDATED_MOVE_DATA < GEN_5 || MoveHasChargeTurnAdditionalEffect(gCurrentMove)) - gBattlescriptCurrInstr = cmd->animationThenStringPtr; + u32 rand = RandomUniform(RNG_PRESENT, 0, 0xFF); + + /* Don't reroll present effect/power for the second hit of Parental Bond. + * Not sure if this is the correct behaviour, but bulbapedia states + * that if present heals the foe, it doesn't strike twice, and if it deals + * damage, the second strike will always deal damage too. This is a simple way + * to replicate that effect. + */ + if (gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_2ND_HIT) + { + if (rand < 102) + { + gBattleStruct->presentBasePower = 40; + } + else if (rand < 178) + { + gBattleStruct->presentBasePower = 80; + } + else if (rand < 204) + { + gBattleStruct->presentBasePower = 120; + } + else + { + SetHealAmount(gBattlerTarget, GetNonDynamaxMaxHP(gBattlerTarget) / 4); + gBattleStruct->presentBasePower = 0; + } + } + + if (gBattleStruct->presentBasePower) + { + gBattlescriptCurrInstr = BattleScript_HitFromCritCalc; + } + else if (gBattleMons[gBattlerTarget].maxHP == gBattleMons[gBattlerTarget].hp) + { + gBattlescriptCurrInstr = BattleScript_AlreadyAtFullHp; + } else - gBattlescriptCurrInstr = cmd->nextInstr; + { + gBattleStruct->moveResultFlags[gBattlerTarget] &= ~MOVE_RESULT_DOESNT_AFFECT_FOE; + gBattlescriptCurrInstr = BattleScript_PresentHealTarget; + } } -static void Cmd_trynonvolatilestatus(void) +static void Cmd_setsafeguard(void) { CMD_ARGS(); - bool32 canInflictStatus = TRUE; - - if (!CanSetNonVolatileStatus(gBattlerAttacker, - gBattlerTarget, - GetBattlerAbility(gBattlerAttacker), - GetBattlerAbility(gBattlerTarget), - GetMoveNonVolatileStatus(gCurrentMove), - STATUS_RUN_SCRIPT)) - canInflictStatus = FALSE; - if (canInflictStatus && DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) + if (gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_SAFEGUARD) { - canInflictStatus = FALSE; - gBattlescriptCurrInstr = BattleScript_ButItFailed; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED; + } + else + { + gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_SAFEGUARD; + gSideTimers[GetBattlerSide(gBattlerAttacker)].safeguardTimer = 5; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SAFEGUARD; } - if (canInflictStatus) - gBattlescriptCurrInstr = cmd->nextInstr; + gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_initmultihitstring(void) +static void Cmd_magnitudedamagecalculation(void) { CMD_ARGS(); - PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) + u32 magnitude = RandomUniform(RNG_MAGNITUDE, 0, 99); + + if (magnitude < 5) + { + gBattleStruct->magnitudeBasePower = 10; + magnitude = 4; + } + else if (magnitude < 15) + { + gBattleStruct->magnitudeBasePower = 30; + magnitude = 5; + } + else if (magnitude < 35) + { + gBattleStruct->magnitudeBasePower = 50; + magnitude = 6; + } + else if (magnitude < 65) + { + gBattleStruct->magnitudeBasePower = 70; + magnitude = 7; + } + else if (magnitude < 85) + { + gBattleStruct->magnitudeBasePower = 90; + magnitude = 8; + } + else if (magnitude < 95) + { + gBattleStruct->magnitudeBasePower = 110; + magnitude = 9; + } + else + { + gBattleStruct->magnitudeBasePower = 150; + magnitude = 10; + } + + PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 2, magnitude) + + for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) + { + if (gBattlerTarget == gBattlerAttacker) + continue; + if (!(gAbsentBattlerFlags & (1u << gBattlerTarget))) // A valid target was found. + break; + } gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_forcerandomswitch(void) +static bool32 SetTargetToNextPursuiter(u32 battlerDef) { - CMD_ARGS(const u8 *failInstr); + u32 i; + for (i = gCurrentTurnActionNumber + 1; i < gBattlersCount; i++) + { + u32 battler = gBattlerByTurnOrder[i]; + if (gChosenActionByBattler[battler] == B_ACTION_USE_MOVE + && GetMoveEffect(gChosenMoveByBattler[battler]) == EFFECT_PURSUIT + && IsBattlerAlive(battlerDef) + && IsBattlerAlive(battler) + && !IsBattlerAlly(battler, battlerDef) + && (B_PURSUIT_TARGET >= GEN_4 || gBattleStruct->moveTarget[battler] == battlerDef) + && !IsGimmickSelected(battler, GIMMICK_Z_MOVE) + && !IsGimmickSelected(battler, GIMMICK_DYNAMAX) + && GetActiveGimmick(battler) != GIMMICK_DYNAMAX) + { + gBattlerTarget = battler; + return TRUE; + } + } + return FALSE; +} - s32 battler1PartyId = 0; - s32 battler2PartyId = 0; +static void Cmd_jumpifnopursuitswitchdmg(void) +{ + CMD_ARGS(const u8 *jumpInstr); - s32 firstMonId; - s32 lastMonId = 0; // + 1 - struct Pokemon *party = NULL; - u8 validMons[PARTY_SIZE]; - s32 validMonsCount = 0; + u32 savedTarget = gBattlerTarget; - bool32 redCardForcedSwitch = FALSE; + if (SetTargetToNextPursuiter(gBattlerAttacker)) + { + ChangeOrderTargetAfterAttacker(); + gBattleStruct->battlerState[gBattlerAttacker].pursuitTarget = TRUE; + gBattleStruct->pursuitStoredSwitch = gBattleStruct->monToSwitchIntoId[gBattlerAttacker]; + gBattleStruct->moveTarget[gBattlerTarget] = gBattlerAttacker; + gBattlerTarget = savedTarget; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->jumpInstr; + } +} - // Red card checks against wild pokemon. If we have reached here, the player has a mon to switch into - // Red card swaps attacker with target to get the animation correct, so here we check attacker which is really the target. Thanks GF... - if (gBattleScripting.switchCase == B_SWITCH_RED_CARD - && !(gBattleTypeFlags & BATTLE_TYPE_TRAINER) - && !IsOnPlayerSide(gBattlerAttacker)) // Check opponent's red card activating +static void Cmd_tryactivateitem(void) +{ + CMD_ARGS(u8 battler, u8 flag); + u32 battler = GetBattlerForBattleScript(cmd->battler); + + gBattlescriptCurrInstr = cmd->nextInstr; + + switch ((enum ItemActivationState)cmd->flag) { - if (!WILD_DOUBLE_BATTLE) - { - // Wild mon with red card will end single battle - gBattlescriptCurrInstr = BattleScript_RoarSuccessEndBattle; + case ACTIVATION_ON_USABLE_AGAIN: + case ACTIVATION_ON_PICK_UP: + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsForceTriggerItemActivation)) return; - } - else + break; + case ACTIVATION_ON_HARVEST: + gLastUsedItem = gBattleMons[battler].item; + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsOnBerryActivation)) + return; + break; + case ACTIVATION_ON_HP_THRESHOLD: + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsOnHpThresholdActivation)) + return; + break; + } +} + +// Belly Drum, Fillet Away +static void Cmd_halvehp(void) +{ + CMD_ARGS(const u8 *failInstr); + + u32 halfHp = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; + + if (!(GetNonDynamaxMaxHP(gBattlerAttacker) / 2)) + halfHp = 1; + + if (gBattleMons[gBattlerAttacker].hp > halfHp) + { + SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 2); + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +// Psych Up +static void Cmd_copyfoestats(void) +{ + CMD_ARGS(); + + s32 i; + + for (i = 0; i < NUM_BATTLE_STATS; i++) + { + gBattleMons[gBattlerAttacker].statStages[i] = gBattleMons[gBattlerTarget].statStages[i]; + } + gBattleScripting.battler = gBattlerTarget; + + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void Cmd_rapidspinfree(void) +{ + CMD_ARGS(); + + u8 atkSide = GetBattlerSide(gBattlerAttacker); + + if (gBattleMons[gBattlerAttacker].volatiles.wrapped) + { + gBattleScripting.battler = gBattlerTarget; + gBattleMons[gBattlerAttacker].volatiles.wrapped = FALSE; + gBattlerTarget = gBattleMons[gBattlerAttacker].volatiles.wrappedBy; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].volatiles.wrappedMove); + BattleScriptCall(BattleScript_WrapFree); + } + else if (gBattleMons[gBattlerAttacker].volatiles.leechSeed) + { + gBattleMons[gBattlerAttacker].volatiles.leechSeed = 0; + BattleScriptCall(BattleScript_LeechSeedFree); + } + else if (AreAnyHazardsOnSide(atkSide)) + { + for (u32 hazardType = HAZARDS_NONE + 1; hazardType < HAZARDS_MAX_COUNT; hazardType++) { - // Wild double battle, wild mon red card activation on player - if (IS_WHOLE_SIDE_ALIVE(gBattlerTarget)) - { - // Both player's battlers are alive - redCardForcedSwitch = FALSE; - } - else + if (IsHazardOnSideAndClear(atkSide, hazardType)) { - // Player has only one mon alive -> force red card switch before manually switching to other mon - redCardForcedSwitch = TRUE; + gBattleStruct->numHazards[atkSide]--; + gBattleCommunication[MULTISTRING_CHOOSER] = hazardType; + BattleScriptCall(BattleScript_SpinHazardsAway); + return; } } } + else + { + gBattlescriptCurrInstr = cmd->nextInstr; + } +} - // Swapping pokemon happens in: - // trainer battles - // wild double battles when an opposing pokemon uses it against one of the two alive player mons - // wild double battle when a player pokemon uses it against its partner - if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) - || (WILD_DOUBLE_BATTLE - && !IsOnPlayerSide(gBattlerAttacker) - && IsOnPlayerSide(gBattlerTarget) - && IS_WHOLE_SIDE_ALIVE(gBattlerTarget)) - || (WILD_DOUBLE_BATTLE - && IsOnPlayerSide(gBattlerAttacker) - && IsOnPlayerSide(gBattlerTarget)) - || redCardForcedSwitch - ) - { - party = GetBattlerParty(gBattlerTarget); +static void Cmd_unused_0xBF(void) +{ +} - if (BATTLE_TWO_VS_ONE_OPPONENT && !IsOnPlayerSide(gBattlerTarget)) - { - firstMonId = 0; - lastMonId = 6; - battler2PartyId = gBattlerPartyIndexes[gBattlerTarget]; - battler1PartyId = gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerTarget)]; - } - else if ((gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER && gBattleTypeFlags & BATTLE_TYPE_LINK) - || (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER && gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) - || (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)) +static void Cmd_recoverbasedonsunlight(void) +{ + CMD_ARGS(const u8 *failInstr); + + gBattlerTarget = gBattlerAttacker; + if (gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP) + { + s32 recoverAmount = 0; + if (GetMoveEffect(gCurrentMove) == EFFECT_SHORE_UP) { - if ((gBattlerTarget & BIT_FLANK) != B_FLANK_LEFT) - { - firstMonId = PARTY_SIZE / 2; - lastMonId = PARTY_SIZE; - } + if (HasWeatherEffect() && gBattleWeather & B_WEATHER_SANDSTORM) + recoverAmount = 20 * GetNonDynamaxMaxHP(gBattlerAttacker) / 30; else - { - firstMonId = 0; - lastMonId = PARTY_SIZE / 2; - } - battler2PartyId = gBattlerPartyIndexes[gBattlerTarget]; - battler1PartyId = gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerTarget)]; + recoverAmount = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; } - else if ((gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_LINK) - || (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK)) + else if (GetConfig(CONFIG_TIME_OF_DAY_HEALING_MOVES) != GEN_2) { - if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(gBattlerTarget)) == B_FLANK_RIGHT) - { - firstMonId = PARTY_SIZE / 2; - lastMonId = PARTY_SIZE; - } - else - { - firstMonId = 0; - lastMonId = PARTY_SIZE / 2; - } - battler2PartyId = gBattlerPartyIndexes[gBattlerTarget]; - battler1PartyId = gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerTarget)]; + if (!(gBattleWeather & B_WEATHER_ANY) || !HasWeatherEffect() || GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_UTILITY_UMBRELLA) + recoverAmount = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; + else if (gBattleWeather & B_WEATHER_SUN) + recoverAmount = 20 * GetNonDynamaxMaxHP(gBattlerAttacker) / 30; + else // not sunny weather + recoverAmount = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; } - else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + else // B_TIME_OF_DAY_HEALING_MOVES == GEN_2 { - if (IsOnPlayerSide(gBattlerTarget)) - { - firstMonId = 0; - lastMonId = PARTY_SIZE; - } - else + u32 healingModifier = 1; + u32 time = GetTimeOfDay(); + + switch (GetMoveEffect(gCurrentMove)) { - if ((gBattlerTarget & BIT_FLANK) != B_FLANK_LEFT) - { - firstMonId = PARTY_SIZE / 2; - lastMonId = PARTY_SIZE; - } - else - { - firstMonId = 0; - lastMonId = PARTY_SIZE / 2; - } + case EFFECT_MOONLIGHT: + if (time == TIME_NIGHT || time == TIME_EVENING) + healingModifier = 2; + break; + case EFFECT_MORNING_SUN: + if ((OW_TIMES_OF_DAY == GEN_3 && time == TIME_DAY) // Gen 3 doesn't have morning + || (OW_TIMES_OF_DAY != GEN_3 && time == TIME_MORNING)) + healingModifier = 2; + break; + case EFFECT_SYNTHESIS: + if (time == TIME_DAY) + healingModifier = 2; + break; + default: + healingModifier = 1; + break; } - battler2PartyId = gBattlerPartyIndexes[gBattlerTarget]; - battler1PartyId = gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerTarget)]; - } - else if (IsDoubleBattle()) - { - firstMonId = 0; - lastMonId = PARTY_SIZE; - battler2PartyId = gBattlerPartyIndexes[gBattlerTarget]; - battler1PartyId = gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerTarget)]; - } - else - { - firstMonId = 0; - lastMonId = PARTY_SIZE; - battler2PartyId = gBattlerPartyIndexes[gBattlerTarget]; // there is only one PokΓ©mon out in single battles - battler1PartyId = gBattlerPartyIndexes[gBattlerTarget]; - } - for (u32 i = firstMonId; i < lastMonId; i++) - { - if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE - && !GetMonData(&party[i], MON_DATA_IS_EGG) - && GetMonData(&party[i], MON_DATA_HP) != 0 - && i != battler1PartyId - && i != battler2PartyId) - { - validMons[validMonsCount++] = i; - } - } + if (!(gBattleWeather & B_WEATHER_ANY) || !HasWeatherEffect() || GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_UTILITY_UMBRELLA) + recoverAmount = healingModifier * GetNonDynamaxMaxHP(gBattlerAttacker) / 4; + else if (gBattleWeather & B_WEATHER_SUN) + recoverAmount = healingModifier * GetNonDynamaxMaxHP(gBattlerAttacker) / 2; + else // not sunny weather + recoverAmount = healingModifier * GetNonDynamaxMaxHP(gBattlerAttacker) / 8; - if (validMonsCount == 0) - { - gBattlescriptCurrInstr = cmd->failInstr; } - else - { - gBattleStruct->battlerPartyIndexes[gBattlerTarget] = gBattlerPartyIndexes[gBattlerTarget]; - gBattlescriptCurrInstr = BattleScript_RoarSuccessSwitch; - gBattleStruct->battlerState[gBattlerTarget].forcedSwitch = TRUE; - gBattleStruct->monToSwitchIntoId[gBattlerTarget] = validMons[RandomUniform(RNG_FORCE_RANDOM_SWITCH, 0, validMonsCount - 1)]; - - if (!IsMultiBattle()) - SwitchPartyOrder(gBattlerTarget); - - if ((gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) - || (gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & BATTLE_TYPE_MULTI) - || (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) - || (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { - SwitchPartyOrderLinkMulti(gBattlerTarget, gBattleStruct->monToSwitchIntoId[gBattlerTarget], 0); - SwitchPartyOrderLinkMulti(BATTLE_PARTNER(gBattlerTarget), gBattleStruct->monToSwitchIntoId[gBattlerTarget], 1); - } - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) - SwitchPartyOrderInGameMulti(gBattlerTarget, gBattleStruct->monToSwitchIntoId[gBattlerTarget]); - } + SetHealAmount(gBattlerAttacker, recoverAmount); + gBattlescriptCurrInstr = cmd->nextInstr; } else { - // In normal wild doubles, Roar will always fail if the user's level is less than the target's. - if (gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) - gBattlescriptCurrInstr = BattleScript_RoarSuccessEndBattle; - else - gBattlescriptCurrInstr = cmd->failInstr; + gBattlescriptCurrInstr = cmd->failInstr; } } -static void Cmd_tryconversiontypechange(void) +static void Cmd_setstickyweb(void) { CMD_ARGS(const u8 *failInstr); - u8 validMoves = 0; - u8 moveChecked = 0; - u8 moveType = 0; + u8 targetSide = GetBattlerSide(gBattlerTarget); - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA) + if (IsHazardOnSide(targetSide, HAZARDS_STICKY_WEB)) { gBattlescriptCurrInstr = cmd->failInstr; - return; - } - - if (B_UPDATED_CONVERSION >= GEN_6) - { - // Changes user's type to its first move's type - for (moveChecked = 0; moveChecked < MAX_MON_MOVES; moveChecked++) - { - if (gBattleMons[gBattlerAttacker].moves[moveChecked] != MOVE_NONE) - { - moveType = GetMoveType(gBattleMons[gBattlerAttacker].moves[moveChecked]); - break; - } - } - if (IS_BATTLER_OF_TYPE(gBattlerAttacker, moveType)) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - SET_BATTLER_TYPE(gBattlerAttacker, moveType); - PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); - gBattlescriptCurrInstr = cmd->nextInstr; - } } else { - // Randomly changes user's type to one of its moves' type - while (validMoves < MAX_MON_MOVES) - { - if (gBattleMons[gBattlerAttacker].moves[validMoves] == MOVE_NONE) - break; - - validMoves++; - } - - for (moveChecked = 0; moveChecked < validMoves; moveChecked++) - { - moveType = GetMoveType(gBattleMons[gBattlerAttacker].moves[moveChecked]); - - if (moveType == TYPE_MYSTERY) - { - if (IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) - moveType = TYPE_GHOST; - else - moveType = TYPE_NORMAL; - } - if (moveType != gBattleMons[gBattlerAttacker].types[0] - && moveType != gBattleMons[gBattlerAttacker].types[1] - && moveType != gBattleMons[gBattlerAttacker].types[2]) - { - break; - } - } - - if (moveChecked == validMoves) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - do - { - while ((moveChecked = MOD(Random(), MAX_MON_MOVES)) >= validMoves); - - moveType = GetMoveType(gBattleMons[gBattlerAttacker].moves[moveChecked]); - - if (moveType == TYPE_MYSTERY) - { - if (IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) - moveType = TYPE_GHOST; - else - moveType = TYPE_NORMAL; - } - } - while (moveType == gBattleMons[gBattlerAttacker].types[0] || moveType == gBattleMons[gBattlerAttacker].types[1] || moveType == gBattleMons[gBattlerAttacker].types[2]); - - SET_BATTLER_TYPE(gBattlerAttacker, moveType); - PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); - - gBattlescriptCurrInstr = cmd->nextInstr; - } + PushHazardTypeToQueue(targetSide, HAZARDS_STICKY_WEB); + gSideTimers[targetSide].stickyWebBattlerId = gBattlerAttacker; // For Mirror Armor + gSideTimers[targetSide].stickyWebBattlerSide = GetBattlerSide(gBattlerAttacker); // For Court Change/Defiant - set this to the user's side + gBattlescriptCurrInstr = cmd->nextInstr; } } -static void Cmd_givepaydaymoney(void) +static void Cmd_selectfirstvalidtarget(void) { CMD_ARGS(); - if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) && gPaydayMoney != 0) - { - u32 bonusMoney = gPaydayMoney * gBattleStruct->moneyMultiplier; - AddMoney(&gSaveBlock1Ptr->money, bonusMoney); - - PREPARE_HWORD_NUMBER_BUFFER(gBattleTextBuff1, 5, bonusMoney) - - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = BattleScript_PrintPayDayMoneyString; - } - else + for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) { - gBattlescriptCurrInstr = cmd->nextInstr; + if (gBattlerTarget == gBattlerAttacker && !(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove) & MOVE_TARGET_USER)) + continue; + if (IsBattlerAlive(gBattlerTarget)) + break; } + if (gBattlerTarget >= gBattlersCount) + gBattlerTarget = 0; + gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_setlightscreen(void) +static void Cmd_setfutureattack(void) { CMD_ARGS(); - if (!TrySetLightScreen(gBattlerAttacker)) - { - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED; - } + gWishFutureKnock.futureSightMove[gBattlerTarget] = gCurrentMove; + gWishFutureKnock.futureSightBattlerIndex[gBattlerTarget] = gBattlerAttacker; + gWishFutureKnock.futureSightPartyIndex[gBattlerTarget] = gBattlerPartyIndexes[gBattlerAttacker]; + gWishFutureKnock.futureSightCounter[gBattlerTarget] = 3; + + if (gCurrentMove == MOVE_DOOM_DESIRE) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOOM_DESIRE; + else + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FUTURE_SIGHT; gBattlescriptCurrInstr = cmd->nextInstr; } -#define NOT_ENDURED 0 -#define FOCUS_SASHED 1 -#define FOCUS_BANDED 2 -#define AFFECTION_ENDURED 3 -static void Cmd_tryKO(void) +static void Cmd_trydobeatup(void) { - CMD_ARGS(const u8 *failInstr); - - bool32 lands = FALSE; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); - u16 targetAbility = GetBattlerAbility(gBattlerTarget); - u32 rand = Random() % 100; - u32 affectionScore = GetBattlerAffectionHearts(gBattlerTarget); - u32 endured = NOT_ENDURED; - - // Dynamaxed Pokemon cannot be hit by OHKO moves. - if ((GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX)) - { - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_KO_UNAFFECTED; - gBattlescriptCurrInstr = cmd->failInstr; - return; - } + CMD_ARGS(const u8 *endInstr, const u8 *failInstr); - gPotentialItemEffectBattler = gBattlerTarget; - if (holdEffect == HOLD_EFFECT_FOCUS_BAND - && (Random() % 100) < GetBattlerHoldEffectParam(gBattlerTarget)) + if (!IsBattlerAlive(gBattlerTarget)) { - endured = FOCUS_BANDED; - RecordItemEffectBattle(gBattlerTarget, holdEffect); + gMultiHitCounter = 0; + gBattlescriptCurrInstr = cmd->endInstr; } - else if (holdEffect == HOLD_EFFECT_FOCUS_SASH && IsBattlerAtMaxHp(gBattlerTarget)) + else if (gBattleStruct->beatUpSlot == 0 && gMultiHitCounter == 0) { - endured = FOCUS_SASHED; - RecordItemEffectBattle(gBattlerTarget, holdEffect); + gBattlescriptCurrInstr = cmd->failInstr; } - else if (B_AFFECTION_MECHANICS == TRUE && IsOnPlayerSide(gBattlerTarget) && affectionScore >= AFFECTION_THREE_HEARTS) + else { - if ((affectionScore == AFFECTION_FIVE_HEARTS && rand < 20) - || (affectionScore == AFFECTION_FOUR_HEARTS && rand < 15) - || (affectionScore == AFFECTION_THREE_HEARTS && rand < 10)) - endured = AFFECTION_ENDURED; + PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattleStruct->beatUpSpecies[gBattleStruct->beatUpSlot]) + gBattlescriptCurrInstr = cmd->nextInstr; } +} - if (targetAbility == ABILITY_STURDY) - { - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - gLastUsedAbility = ABILITY_STURDY; - gBattlescriptCurrInstr = BattleScript_SturdyPreventsOHKO; - gBattlerAbility = gBattlerTarget; - } - else - { - if ((((gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS) - && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) - || GetBattlerAbility(gBattlerAttacker) == ABILITY_NO_GUARD - || targetAbility == ABILITY_NO_GUARD) - && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) - { - lands = TRUE; - } - else - { - u16 odds = GetMoveAccuracy(gCurrentMove) + (gBattleMons[gBattlerAttacker].level - gBattleMons[gBattlerTarget].level); - if (B_SHEER_COLD_ACC >= GEN_7 && gCurrentMove == MOVE_SHEER_COLD && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ICE)) - odds -= 10; - if (RandomPercentage(RNG_ACCURACY, odds) && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) - lands = TRUE; - } +static void Cmd_setsemiinvulnerablebit(void) +{ + CMD_ARGS(bool8 clear); - if (lands) - { - if (gProtectStructs[gBattlerTarget].endured) - { - gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].hp - 1; - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_FOE_ENDURED; - } - else if (endured == FOCUS_BANDED || endured == FOCUS_SASHED) - { - gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].hp - 1; - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_FOE_HUNG_ON; - gLastUsedItem = gBattleMons[gBattlerTarget].item; - } - else if (endured == AFFECTION_ENDURED) - { - gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].hp - 1; - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_FOE_ENDURED_AFFECTION; - } - else - { - gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].hp; - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_ONE_HIT_KO; - } - gBattlescriptCurrInstr = cmd->nextInstr; - } + if (gBattleMoveEffects[GetMoveEffect(gCurrentMove)].semiInvulnerableEffect == TRUE) + { + u32 semiInvulnerableEffect = GetMoveTwoTurnAttackStatus(gCurrentMove); + if (cmd->clear) + gBattleMons[gBattlerAttacker].volatiles.semiInvulnerable = STATE_NONE; else - { - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - if (gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_KO_MISS; - else - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_KO_UNAFFECTED; - gBattlescriptCurrInstr = cmd->failInstr; - } + gBattleMons[gBattlerAttacker].volatiles.semiInvulnerable = semiInvulnerableEffect; } + + gBattlescriptCurrInstr = cmd->nextInstr; } -#undef NOT_ENDURED -#undef FOCUS_SASHED -#undef FOCUS_BANDED -#undef AFFECTION_ENDURED -static void Cmd_unused_0x94(void) +static bool32 CheckIfCanFireTwoTurnMoveNow(u8 battler, bool8 checkChargeTurnEffects) { + // Semi-invulnerable moves cannot skip their charge turn (except with Power Herb) + if (gBattleMoveEffects[GetMoveEffect(gCurrentMove)].semiInvulnerableEffect == TRUE) + return FALSE; + + // If this move has charge turn effects, it must charge, activate them, then try to fire + if (checkChargeTurnEffects && MoveHasChargeTurnAdditionalEffect(gCurrentMove)) + return FALSE; + + // Insert custom conditions here + + // Certain two-turn moves may fire on the first turn in the right weather (Solar Beam, Electro Shot) + // By default, all two-turn moves have the option of adding weather to their argument + if (IsBattlerWeatherAffected(battler, GetMoveTwoTurnAttackWeather(gCurrentMove))) + return TRUE; + + return FALSE; } -static void Cmd_copybidedmg(void) +static void Cmd_tryfiretwoturnmovenowbyeffect(void) { - CMD_ARGS(); - gBattleStruct->moveDamage[gBattlerTarget] = gBideDmg[gBattlerAttacker] * 2; - gBattlescriptCurrInstr = cmd->nextInstr; + CMD_ARGS(u8 battler, bool8 checkChargeTurnEffects, const u8 *jumpInstr); + + if (CheckIfCanFireTwoTurnMoveNow(cmd->battler, cmd->checkChargeTurnEffects) == TRUE) + { + gBattleScripting.animTurn = 1; + gBattlescriptCurrInstr = cmd->jumpInstr; + } + else + gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_unused_96(void) +static void Cmd_unused_0xC7(void) { } -static void Cmd_tryinfatuating(void) +static void Cmd_unused_c8(void) +{ +} + +static void Cmd_trymemento(void) { CMD_ARGS(const u8 *failInstr); - if (GetBattlerAbility(gBattlerTarget) == ABILITY_OBLIVIOUS) + if (B_MEMENTO_FAIL >= GEN_4 + && (gBattleCommunication[MISS_TYPE] == B_MSG_PROTECTED + || IsSemiInvulnerable(gBattlerTarget, CHECK_ALL) + || IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove) + || DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove))) { - gBattlescriptCurrInstr = BattleScript_NotAffectedAbilityPopUp; - gLastUsedAbility = ABILITY_OBLIVIOUS; - RecordAbilityBattle(gBattlerTarget, ABILITY_OBLIVIOUS); + // Failed, target was protected. + gBattlescriptCurrInstr = cmd->failInstr; + } + else if (B_MEMENTO_FAIL < GEN_4 + && gBattleMons[gBattlerTarget].statStages[STAT_ATK] == MIN_STAT_STAGE + && gBattleMons[gBattlerTarget].statStages[STAT_SPATK] == MIN_STAT_STAGE + && gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED) + { + // Failed, unprotected target already has minimum Attack and Special Attack. + gBattlescriptCurrInstr = cmd->failInstr; } else { - if (gBattleMons[gBattlerTarget].status2 & STATUS2_INFATUATION - || !AreBattlersOfOppositeGender(gBattlerAttacker, gBattlerTarget)) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - gBattleMons[gBattlerTarget].status2 |= STATUS2_INFATUATED_WITH(gBattlerAttacker); - gBattlescriptCurrInstr = cmd->nextInstr; - } + // Success, drop user's HP bar to 0 + gBattleStruct->passiveHpUpdate[gBattlerAttacker] = gBattleMons[gBattlerAttacker].hp; + BtlController_EmitHealthBarUpdate(gBattlerAttacker, B_COMM_TO_CONTROLLER, INSTANT_HP_BAR_DROP); + MarkBattlerForControllerExec(gBattlerAttacker); + + gBattlescriptCurrInstr = cmd->nextInstr; } } -static void Cmd_updatestatusicon(void) +// Follow Me +static void Cmd_setforcedtarget(void) { - CMD_ARGS(u8 battler); - u32 battler; + CMD_ARGS(); - if (gBattleControllerExecFlags) - return; + gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTimer = 1; + gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTarget = gBattlerTarget; + gSideTimers[GetBattlerSide(gBattlerTarget)].followmePowder = IsPowderMove(gCurrentMove); + gBattlescriptCurrInstr = cmd->nextInstr; +} - if (cmd->battler == BS_PLAYER2) - { - for (battler = gBattleControllerExecFlags; battler < gBattlersCount; battler++) - { - if (!(gAbsentBattlerFlags & (1u << battler))) - { - BtlController_EmitStatusIconUpdate(battler, B_COMM_TO_CONTROLLER, gBattleMons[battler].status1, gBattleMons[battler].status2); - MarkBattlerForControllerExec(battler); - } - } - gBattlescriptCurrInstr = cmd->nextInstr; - } - else if (cmd->battler == BS_ATTACKER_WITH_PARTNER) +static void Cmd_unused_0xcb(void) +{ +} + +static void Cmd_unused_0xCC(void) +{ +} + +static void Cmd_curestatuswithmove(void) +{ + CMD_ARGS(const u8 *failInstr); + u32 shouldHeal; + + if (GetMoveEffect(gCurrentMove) == EFFECT_REFRESH) + shouldHeal = gBattleMons[gBattlerAttacker].status1 & STATUS1_CAN_MOVE; + else // Take Heart + shouldHeal = gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY; + + if (shouldHeal) { - battler = gBattlerAttacker; - if (!(gAbsentBattlerFlags & (1u << battler))) - { - BtlController_EmitStatusIconUpdate(battler, B_COMM_TO_CONTROLLER, gBattleMons[battler].status1, gBattleMons[battler].status2); - MarkBattlerForControllerExec(battler); - } - if ((IsDoubleBattle())) - { - battler = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerAttacker))); - if (!(gAbsentBattlerFlags & (1u << battler))) - { - BtlController_EmitStatusIconUpdate(battler, B_COMM_TO_CONTROLLER, gBattleMons[battler].status1, gBattleMons[battler].status2); - MarkBattlerForControllerExec(battler); - } - } + if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) + TryDeactivateSleepClause(GetBattlerSide(gBattlerAttacker), gBattlerPartyIndexes[gBattlerAttacker]); + + gBattleMons[gBattlerAttacker].status1 = 0; gBattlescriptCurrInstr = cmd->nextInstr; + BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerAttacker].status1), &gBattleMons[gBattlerAttacker].status1); + MarkBattlerForControllerExec(gBattlerAttacker); } else { - battler = GetBattlerForBattleScript(cmd->battler); - BtlController_EmitStatusIconUpdate(battler, B_COMM_TO_CONTROLLER, gBattleMons[battler].status1, gBattleMons[battler].status2); - MarkBattlerForControllerExec(battler); - gBattlescriptCurrInstr = cmd->nextInstr; + gBattlescriptCurrInstr = cmd->failInstr; } } -static void Cmd_setmist(void) +static void Cmd_settorment(void) { - CMD_ARGS(); + CMD_ARGS(const u8 *failInstr); - if (gSideTimers[GetBattlerSide(gBattlerAttacker)].mistTimer) + if (gBattleMons[gBattlerTarget].volatiles.torment == TRUE + || (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX)) { - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_FAILED; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MIST_FAILED; + gBattlescriptCurrInstr = cmd->failInstr; } else { - gSideTimers[GetBattlerSide(gBattlerAttacker)].mistTimer = gBattleTurnCounter + 5; - gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_MIST; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_MIST; + gBattleMons[gBattlerTarget].volatiles.torment = TRUE; + gBattlescriptCurrInstr = cmd->nextInstr; } - gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_setfocusenergy(void) +static void Cmd_jumpifnodamage(void) { - CMD_ARGS(u8 battler); - u8 battler = GetBattlerForBattleScript(cmd->battler); - enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove); + CMD_ARGS(const u8 *jumpInstr); - if ((effect == EFFECT_DRAGON_CHEER && (!(IsDoubleBattle()) || (gAbsentBattlerFlags & (1u << battler)))) - || gBattleMons[battler].status2 & STATUS2_FOCUS_ENERGY_ANY) - { - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_FAILED; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FOCUS_ENERGY_FAILED; - } - else if (effect == EFFECT_DRAGON_CHEER && !IS_BATTLER_OF_TYPE(battler, TYPE_DRAGON)) - { - gBattleMons[battler].status2 |= STATUS2_DRAGON_CHEER; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_GETTING_PUMPED; - } + if (gProtectStructs[gBattlerAttacker].physicalDmg || gProtectStructs[gBattlerAttacker].specialDmg) + gBattlescriptCurrInstr = cmd->nextInstr; else - { - if (GetGenConfig(GEN_CONFIG_FOCUS_ENERGY_CRIT_RATIO) >= GEN_3) - gBattleMons[battler].status2 |= STATUS2_FOCUS_ENERGY; - else - gBattleMons[battler].status2 |= STATUS2_DRAGON_CHEER; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_GETTING_PUMPED; - } - gBattlescriptCurrInstr = cmd->nextInstr; + gBattlescriptCurrInstr = cmd->jumpInstr; } -static void Cmd_transformdataexecution(void) +static void Cmd_settaunt(void) { - CMD_ARGS(); + CMD_ARGS(const u8 *failInstr); - gChosenMove = MOVE_UNAVAILABLE; - gBattlescriptCurrInstr = cmd->nextInstr; - if (gBattleMons[gBattlerTarget].status2 & STATUS2_TRANSFORMED - || gBattleStruct->illusion[gBattlerTarget].state == ILLUSION_ON - || gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE_NO_COMMANDER) + if (GetConfig(CONFIG_OBLIVIOUS_TAUNT) >= GEN_6 && GetBattlerAbility(gBattlerTarget) == ABILITY_OBLIVIOUS) { - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_FAILED; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TRANSFORM_FAILED; + gBattlescriptCurrInstr = BattleScript_NotAffectedAbilityPopUp; + gLastUsedAbility = ABILITY_OBLIVIOUS; + RecordAbilityBattle(gBattlerTarget, ABILITY_OBLIVIOUS); } - else + else if (gDisableStructs[gBattlerTarget].tauntTimer == 0) { - s32 i; - u8 *battleMonAttacker, *battleMonTarget; - u8 timesGotHit; - - gBattleMons[gBattlerAttacker].status2 |= STATUS2_TRANSFORMED; - gDisableStructs[gBattlerAttacker].disabledMove = MOVE_NONE; - gDisableStructs[gBattlerAttacker].disableTimer = 0; - gDisableStructs[gBattlerAttacker].transformedMonPersonality = gBattleMons[gBattlerTarget].personality; - gDisableStructs[gBattlerAttacker].transformedMonShininess = gBattleMons[gBattlerTarget].isShiny; - gDisableStructs[gBattlerAttacker].mimickedMoves = 0; - gDisableStructs[gBattlerAttacker].usedMoves = 0; - - timesGotHit = gBattleStruct->timesGotHit[GetBattlerSide(gBattlerTarget)][gBattlerPartyIndexes[gBattlerTarget]]; - gBattleStruct->timesGotHit[GetBattlerSide(gBattlerAttacker)][gBattlerPartyIndexes[gBattlerAttacker]] = timesGotHit; - - PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].species) - - battleMonAttacker = (u8 *)(&gBattleMons[gBattlerAttacker]); - battleMonTarget = (u8 *)(&gBattleMons[gBattlerTarget]); - - for (i = 0; i < offsetof(struct BattlePokemon, pp); i++) - battleMonAttacker[i] = battleMonTarget[i]; - - gDisableStructs[gBattlerAttacker].overwrittenAbility = GetBattlerAbility(gBattlerTarget); - for (i = 0; i < MAX_MON_MOVES; i++) + u8 turns; + if (B_TAUNT_TURNS >= GEN_5) { - u32 pp = GetMovePP(gBattleMons[gBattlerAttacker].moves[i]); - if (pp < 5) - gBattleMons[gBattlerAttacker].pp[i] = pp; - else - gBattleMons[gBattlerAttacker].pp[i] = 5; + turns = 4; + if (!HasBattlerActedThisTurn(gBattlerTarget)) + turns--; // If the target hasn't yet moved this turn, Taunt lasts for only three turns (source: Bulbapedia) + } + else if (B_TAUNT_TURNS >= GEN_4) + { + turns = (Random() & 2) + 3; + } + else + { + turns = 2; } - // update AI knowledge - RecordAllMoves(gBattlerAttacker); - RecordAbilityBattle(gBattlerAttacker, gBattleMons[gBattlerAttacker].ability); - - BtlController_EmitResetActionMoveSelection(gBattlerAttacker, B_COMM_TO_CONTROLLER, RESET_MOVE_SELECTION); - MarkBattlerForControllerExec(gBattlerAttacker); - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TRANSFORMED; + gDisableStructs[gBattlerTarget].tauntTimer = turns; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; } } -static void Cmd_setsubstitute(void) +static void Cmd_trysethelpinghand(void) { - CMD_ARGS(); - - u32 factor = GetMoveEffect(gCurrentMove) == EFFECT_SHED_TAIL ? 2 : 4; - u32 hp; + CMD_ARGS(const u8 *failInstr); - if (factor == 2) - hp = (GetNonDynamaxMaxHP(gBattlerAttacker)+1) / factor; // shed tail rounds up - else - hp = GetNonDynamaxMaxHP(gBattlerAttacker) / factor; // one bit value will only work for PokΓ©mon which max hp can go to 1020(which is more than possible in games) + if (!IsDoubleBattle()) + { + gBattlescriptCurrInstr = cmd->failInstr; + return; + } - if (hp == 0) - hp = 1; + gBattlerTarget = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerAttacker))); - if (gBattleMons[gBattlerAttacker].hp <= hp) + if (!(gAbsentBattlerFlags & (1u << gBattlerTarget)) + && !HasBattlerActedThisTurn(gBattlerTarget)) { - gBattleStruct->moveDamage[gBattlerAttacker] = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SUBSTITUTE_FAILED; + gProtectStructs[gBattlerTarget].helpingHand++; + gBattlescriptCurrInstr = cmd->nextInstr; } else { - gBattleStruct->moveDamage[gBattlerAttacker] = hp; // one bit value will only work for PokΓ©mon which max hp can go to 1020(which is more than possible in games) - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - - gBattleMons[gBattlerAttacker].status2 |= STATUS2_SUBSTITUTE; - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_WRAPPED; - if (factor == 2) - gDisableStructs[gBattlerAttacker].substituteHP = gBattleStruct->moveDamage[gBattlerAttacker] / 2; - else - gDisableStructs[gBattlerAttacker].substituteHP = gBattleStruct->moveDamage[gBattlerAttacker]; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SUBSTITUTE; - gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE; + gBattlescriptCurrInstr = cmd->failInstr; } - - gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_mimicattackcopy(void) +// Trick +static void Cmd_tryswapitems(void) { CMD_ARGS(const u8 *failInstr); - if ((IsMoveMimicBanned(gLastMoves[gBattlerTarget])) - || (gBattleMons[gBattlerAttacker].status2 & STATUS2_TRANSFORMED) - || gLastMoves[gBattlerTarget] == MOVE_NONE - || gLastMoves[gBattlerTarget] == MOVE_UNAVAILABLE) + // opponent can't swap items with player in regular battles + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL + || (!IsOnPlayerSide(gBattlerAttacker) + && !(gBattleTypeFlags & (BATTLE_TYPE_LINK + | BATTLE_TYPE_EREADER_TRAINER + | BATTLE_TYPE_FRONTIER + | BATTLE_TYPE_SECRET_BASE + | BATTLE_TYPE_RECORDED_LINK + | (B_TRAINERS_KNOCK_OFF_ITEMS == TRUE ? BATTLE_TYPE_TRAINER : 0) + )))) { gBattlescriptCurrInstr = cmd->failInstr; } else { - int i; + u8 sideAttacker = GetBattlerSide(gBattlerAttacker); + u8 sideTarget = GetBattlerSide(gBattlerTarget); - for (i = 0; i < MAX_MON_MOVES; i++) + // You can't swap items if they were knocked off in regular battles + if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK + | BATTLE_TYPE_EREADER_TRAINER + | BATTLE_TYPE_FRONTIER + | BATTLE_TYPE_SECRET_BASE + | BATTLE_TYPE_RECORDED_LINK)) + && (gWishFutureKnock.knockedOffMons[sideAttacker] & (1u << gBattlerPartyIndexes[gBattlerAttacker]) + || gWishFutureKnock.knockedOffMons[sideTarget] & (1u << gBattlerPartyIndexes[gBattlerTarget]))) { - if (gBattleMons[gBattlerAttacker].moves[i] == gLastMoves[gBattlerTarget]) - break; + gBattlescriptCurrInstr = cmd->failInstr; } - - if (i == MAX_MON_MOVES) + // can't swap if two PokΓ©mon don't have an item + // or if either of them is an enigma berry or a mail + else if ((gBattleMons[gBattlerAttacker].item == ITEM_NONE && gBattleMons[gBattlerTarget].item == ITEM_NONE) + || !CanBattlerGetOrLoseItem(gBattlerAttacker, gBattleMons[gBattlerAttacker].item) + || !CanBattlerGetOrLoseItem(gBattlerAttacker, gBattleMons[gBattlerTarget].item) + || !CanBattlerGetOrLoseItem(gBattlerTarget, gBattleMons[gBattlerTarget].item) + || !CanBattlerGetOrLoseItem(gBattlerTarget, gBattleMons[gBattlerAttacker].item)) { - gChosenMove = 0xFFFF; - gBattleMons[gBattlerAttacker].moves[gCurrMovePos] = gLastMoves[gBattlerTarget]; - u32 pp = GetMovePP(gLastMoves[gBattlerTarget]); - if (pp < 5) - gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = pp; - else - gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = 5; - - PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastMoves[gBattlerTarget]) - - gDisableStructs[gBattlerAttacker].mimickedMoves |= 1u << gCurrMovePos; - gBattlescriptCurrInstr = cmd->nextInstr; + gBattlescriptCurrInstr = cmd->failInstr; } - else + // check if ability prevents swapping + else if (GetBattlerAbility(gBattlerAttacker) == ABILITY_STICKY_HOLD) { gBattlescriptCurrInstr = cmd->failInstr; } - } -} + else if (GetBattlerAbility(gBattlerTarget) == ABILITY_STICKY_HOLD) + { + gBattlescriptCurrInstr = BattleScript_StickyHoldActivates; + gLastUsedAbility = gBattleMons[gBattlerTarget].ability; + RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); + } + // took a while, but all checks passed and items can be safely swapped + else + { + u16 oldItemAtk, *newItemAtk; -static bool32 InvalidMetronomeMove(u32 move) -{ - return GetMoveEffect(move) == EFFECT_PLACEHOLDER - || IsMoveMetronomeBanned(move); -} + newItemAtk = &gBattleStruct->changedItems[gBattlerAttacker]; + oldItemAtk = gBattleMons[gBattlerAttacker].item; + *newItemAtk = gBattleMons[gBattlerTarget].item; -static void Cmd_metronome(void) -{ - CMD_ARGS(); + gBattleMons[gBattlerAttacker].item = ITEM_NONE; + gBattleMons[gBattlerTarget].item = oldItemAtk; -#if B_METRONOME_MOVES >= GEN_9 - u32 moveCount = MOVES_COUNT_GEN9; -#elif B_METRONOME_MOVES >= GEN_8 - u32 moveCount = MOVES_COUNT_GEN8; -#elif B_METRONOME_MOVES >= GEN_7 - u32 moveCount = MOVES_COUNT_GEN7; -#elif B_METRONOME_MOVES >= GEN_6 - u32 moveCount = MOVES_COUNT_GEN6; -#elif B_METRONOME_MOVES >= GEN_5 - u32 moveCount = MOVES_COUNT_GEN5; -#elif B_METRONOME_MOVES >= GEN_4 - u32 moveCount = MOVES_COUNT_GEN4; -#elif B_METRONOME_MOVES >= GEN_3 - u32 moveCount = MOVES_COUNT_GEN3; -#elif B_METRONOME_MOVES >= GEN_2 - u32 moveCount = MOVES_COUNT_GEN2; -#else - u32 moveCount = MOVES_COUNT_GEN1; -#endif + RecordItemEffectBattle(gBattlerAttacker, 0); + RecordItemEffectBattle(gBattlerTarget, GetItemHoldEffect(oldItemAtk)); - gCurrentMove = RandomUniformExcept(RNG_METRONOME, 1, moveCount - 1, InvalidMetronomeMove); - PrepareStringBattle(STRINGID_WAGGLINGAFINGER, gBattlerAttacker); - gBattlescriptCurrInstr = GetMoveBattleScript(gCurrentMove); - gBattlerTarget = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); - ResetValuesForCalledMove(); -} + BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(*newItemAtk), newItemAtk); + MarkBattlerForControllerExec(gBattlerAttacker); -static void Cmd_unused_0x9f(void) -{ -} + BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); + MarkBattlerForControllerExec(gBattlerTarget); -static void Cmd_unused_0xA0(void) -{ -} + if (GetBattlerAbility(gBattlerTarget) != ABILITY_GORILLA_TACTICS) + gBattleStruct->choicedMove[gBattlerTarget] = MOVE_NONE; + if (GetBattlerAbility(gBattlerTarget) != ABILITY_GORILLA_TACTICS) + gBattleStruct->choicedMove[gBattlerAttacker] = MOVE_NONE; -static void Cmd_counterdamagecalculator(void) -{ - CMD_ARGS(const u8 *failInstr); + gBattlescriptCurrInstr = cmd->nextInstr; - u8 sideAttacker = GetBattlerSide(gBattlerAttacker); - u8 sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].physicalBattlerId); + PREPARE_ITEM_BUFFER(gBattleTextBuff1, *newItemAtk) + PREPARE_ITEM_BUFFER(gBattleTextBuff2, oldItemAtk) - if (gProtectStructs[gBattlerAttacker].physicalDmg - && sideAttacker != sideTarget - && gBattleMons[gProtectStructs[gBattlerAttacker].physicalBattlerId].hp) - { - gBattleStruct->moveDamage[gBattlerTarget] = gProtectStructs[gBattlerAttacker].physicalDmg * 2; + if (!(sideAttacker == sideTarget && IsPartnerMonFromSameTrainer(gBattlerAttacker))) + { + // if targeting your own side and you aren't in a multi battle, don't save items as stolen + if (IsOnPlayerSide(gBattlerAttacker)) + TrySaveExchangedItem(gBattlerAttacker, oldItemAtk); + if (IsOnPlayerSide(gBattlerTarget)) + TrySaveExchangedItem(gBattlerTarget, *newItemAtk); + } - if (IsAffectedByFollowMe(gBattlerAttacker, sideTarget, gCurrentMove)) - gBattlerTarget = gSideTimers[sideTarget].followmeTarget; - else - gBattlerTarget = gProtectStructs[gBattlerAttacker].physicalBattlerId; + if (oldItemAtk != ITEM_NONE && *newItemAtk != ITEM_NONE) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_BOTH; // attacker's item -> <- target's item + } + else if (oldItemAtk == ITEM_NONE && *newItemAtk != ITEM_NONE) + { + if (GetBattlerAbility(gBattlerAttacker) == ABILITY_UNBURDEN && gDisableStructs[gBattlerAttacker].unburdenActive) + gDisableStructs[gBattlerAttacker].unburdenActive = FALSE; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_TAKEN; // nothing -> <- target's item + } + else + { + CheckSetUnburden(gBattlerAttacker); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_GIVEN; // attacker's item -> <- nothing + } + } } } -// A copy of Cmd with the physical -> special field changes -static void Cmd_mirrorcoatdamagecalculator(void) +static bool32 CanAbilityShieldActivateForBattler(u32 battler) { - CMD_ARGS(const u8 *failInstr); + if (GetBattlerHoldEffectIgnoreAbility(battler) != HOLD_EFFECT_ABILITY_SHIELD) + return FALSE; - u8 sideAttacker = GetBattlerSide(gBattlerAttacker); - u8 sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].specialBattlerId); + RecordItemEffectBattle(battler, HOLD_EFFECT_ABILITY_SHIELD); + gBattlerAbility = battler; + gLastUsedItem = gBattleMons[battler].item; + return TRUE; +} - if (gProtectStructs[gBattlerAttacker].specialDmg - && sideAttacker != sideTarget - && gBattleMons[gProtectStructs[gBattlerAttacker].specialBattlerId].hp) - { - gBattleStruct->moveDamage[gBattlerTarget] = gProtectStructs[gBattlerAttacker].specialDmg * 2; +// Role Play, Doodle +static void Cmd_trycopyability(void) +{ + CMD_ARGS(u8 battler, const u8 *failInstr); - if (IsAffectedByFollowMe(gBattlerAttacker, sideTarget, gCurrentMove)) - gBattlerTarget = gSideTimers[sideTarget].followmeTarget; - else - gBattlerTarget = gProtectStructs[gBattlerAttacker].specialBattlerId; + u32 battler = GetBattlerForBattleScript(cmd->battler); + u32 partner = BATTLE_PARTNER(battler); + enum Ability defAbility = gBattleMons[gBattlerTarget].ability; + bool32 shouldConsiderPartner = IsBattlerAlive(partner) && GetMoveEffect(gCurrentMove) == EFFECT_DOODLE; - gBattlescriptCurrInstr = cmd->nextInstr; + if (gBattleMons[battler].ability == defAbility + || defAbility == ABILITY_NONE + || gAbilitiesInfo[gBattleMons[battler].ability].cantBeSuppressed + || (shouldConsiderPartner && gAbilitiesInfo[gBattleMons[partner].ability].cantBeSuppressed) + || gAbilitiesInfo[defAbility].cantBeCopied) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else if (CanAbilityShieldActivateForBattler(battler) || (shouldConsiderPartner && CanAbilityShieldActivateForBattler(partner))) + { + gBattlescriptCurrInstr = BattleScript_MoveEnd; + BattleScriptCall(BattleScript_AbilityShieldProtects); } else { - gBattlescriptCurrInstr = cmd->failInstr; + RemoveAbilityFlags(battler); + gBattleScripting.abilityPopupOverwrite = gBattleMons[battler].ability; + gBattleMons[battler].ability = gDisableStructs[battler].overwrittenAbility = defAbility; + gLastUsedAbility = defAbility; + gBattlescriptCurrInstr = cmd->nextInstr; } } -static void Cmd_disablelastusedattack(void) +static void Cmd_trywish(void) { CMD_ARGS(const u8 *failInstr); - s32 i; - - for (i = 0; i < MAX_MON_MOVES; i++) + if (gBattleMons[gBattlerTarget].volatiles.healBlock) { - if (gBattleMons[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget]) - break; + gBattlescriptCurrInstr = cmd->failInstr; } - if (gDisableStructs[gBattlerTarget].disabledMove == MOVE_NONE - && i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] != 0) + else if (gWishFutureKnock.wishCounter[gBattlerAttacker] == 0) { - PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].moves[i]) - - gDisableStructs[gBattlerTarget].disabledMove = gBattleMons[gBattlerTarget].moves[i]; - if (B_DISABLE_TURNS >= GEN_5) - gDisableStructs[gBattlerTarget].disableTimer = 4; - else if (B_DISABLE_TURNS >= GEN_4) - gDisableStructs[gBattlerTarget].disableTimer = (Random() & 3) + 4; // 4-7 turns - else - gDisableStructs[gBattlerTarget].disableTimer = (Random() & 3) + 2; // 2-5 turns + gWishFutureKnock.wishCounter[gBattlerAttacker] = 2; + gWishFutureKnock.wishPartyId[gBattlerAttacker] = gBattlerPartyIndexes[gBattlerAttacker]; gBattlescriptCurrInstr = cmd->nextInstr; } else @@ -13443,3078 +12834,2724 @@ static void Cmd_disablelastusedattack(void) } } -static void Cmd_trysetencore(void) +static void Cmd_settoxicspikes(void) { CMD_ARGS(const u8 *failInstr); - s32 i; - - if (IsMaxMove(gLastMoves[gBattlerTarget]) && !(GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX)) + u8 targetSide = GetBattlerSide(gBattlerTarget); + if (gSideTimers[targetSide].toxicSpikesAmount >= 2) { - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBattleMons[gBattlerTarget].moves[i] == gBattleStruct->dynamax.baseMoves[gBattlerTarget]) - break; - } + gBattlescriptCurrInstr = cmd->failInstr; } else { - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBattleMons[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget]) - break; - } + if (gSideTimers[targetSide].toxicSpikesAmount == 0) + PushHazardTypeToQueue(targetSide, HAZARDS_TOXIC_SPIKES); + gSideTimers[targetSide].toxicSpikesAmount++; + gBattlescriptCurrInstr = cmd->nextInstr; } +} - if ((IsMoveEncoreBanned(gLastMoves[gBattlerTarget])) - || gLastMoves[gBattlerTarget] == MOVE_NONE - || gLastMoves[gBattlerTarget] == MOVE_UNAVAILABLE) +static void Cmd_setgastroacid(void) +{ + CMD_ARGS(const u8 *failInstr); + + if (gAbilitiesInfo[gBattleMons[gBattlerTarget].ability].cantBeSuppressed) { - i = MAX_MON_MOVES; + gBattlescriptCurrInstr = cmd->failInstr; } - - if (gDisableStructs[gBattlerTarget].encoredMove == MOVE_NONE - && i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] != 0) + else if (GetBattlerHoldEffectIgnoreAbility(gBattlerTarget) == HOLD_EFFECT_ABILITY_SHIELD) { - gDisableStructs[gBattlerTarget].encoredMove = gBattleMons[gBattlerTarget].moves[i]; - gDisableStructs[gBattlerTarget].encoredMovePos = i; - // Encore always lasts 3 turns, but we need to account for a scenario where Encore changes the move during the same turn. - if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) - gDisableStructs[gBattlerTarget].encoreTimer = 4; - else - gDisableStructs[gBattlerTarget].encoreTimer = 3; - gBattlescriptCurrInstr = cmd->nextInstr; + RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_ABILITY_SHIELD); + gBattlescriptCurrInstr = cmd->failInstr; } else { - gBattlescriptCurrInstr = cmd->failInstr; + if (gDisableStructs[gBattlerTarget].neutralizingGas) + gSpecialStatuses[gBattlerTarget].neutralizingGasRemoved = TRUE; + + gBattleMons[gBattlerTarget].volatiles.gastroAcid = TRUE; + gBattlescriptCurrInstr = cmd->nextInstr; } } -static void Cmd_painsplitdmgcalc(void) +static void Cmd_setyawn(void) { CMD_ARGS(const u8 *failInstr); + enum Ability ability = GetBattlerAbility(gBattlerTarget); + enum HoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); - if (!(DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove))) + if (gBattleMons[gBattlerTarget].volatiles.yawn + || gBattleMons[gBattlerTarget].status1 & STATUS1_ANY) { - s32 hpDiff = (gBattleMons[gBattlerAttacker].hp + GetNonDynamaxHP(gBattlerTarget)) / 2; - - gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxHP(gBattlerTarget) - hpDiff; - gBattleStruct->moveDamage[gBattlerAttacker] = gBattleMons[gBattlerAttacker].hp - hpDiff; - - gBattlescriptCurrInstr = cmd->nextInstr; + gBattlescriptCurrInstr = cmd->failInstr; + } + else if (IsBattlerTerrainAffected(gBattlerTarget, ability, holdEffect, STATUS_FIELD_ELECTRIC_TERRAIN)) + { + // When Yawn is used while Electric Terrain is set and drowsiness is set from Yawn being used against target in the previous turn: + // "But it failed" will display first. + gBattlescriptCurrInstr = BattleScript_ElectricTerrainPrevents; + } + else if (IsBattlerTerrainAffected(gBattlerTarget, ability, holdEffect, STATUS_FIELD_MISTY_TERRAIN)) + { + // When Yawn is used while Misty Terrain is set and drowsiness is set from Yawn being used against target in the previous turn: + // "But it failed" will display first. + gBattlescriptCurrInstr = BattleScript_MistyTerrainPrevents; } else { - gBattlescriptCurrInstr = cmd->failInstr; + gBattleMons[gBattlerTarget].volatiles.yawn = 2; + gBattlescriptCurrInstr = cmd->nextInstr; } } -// Conversion 2 -static void Cmd_settypetorandomresistance(void) +static void Cmd_setdamagetohealthdifference(void) { CMD_ARGS(const u8 *failInstr); - // Before Gen 5 Conversion 2 only worked on a move the attacker was actually hit by. - // This changed later to the last move used by the selected target. - if (B_UPDATED_CONVERSION_2 < GEN_5) + if (GetNonDynamaxHP(gBattlerTarget) <= gBattleMons[gBattlerAttacker].hp) { - if (gLastLandedMoves[gBattlerAttacker] == MOVE_NONE - || gLastLandedMoves[gBattlerAttacker] == MOVE_UNAVAILABLE) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (gBattleMoveEffects[GetMoveEffect(gLastLandedMoves[gBattlerAttacker])].twoTurnEffect - && gBattleMons[gLastHitBy[gBattlerAttacker]].status2 & STATUS2_MULTIPLETURNS) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (gLastHitByType[gBattlerAttacker] == TYPE_STELLAR || gLastHitByType[gBattlerAttacker] == TYPE_MYSTERY) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - u32 i, resistTypes = 0; - u32 hitByType = gLastHitByType[gBattlerAttacker]; - - for (i = 0; i < NUMBER_OF_MON_TYPES; i++) // Find all types that resist. - { - switch (GetTypeModifier(hitByType, i)) - { - case UQ_4_12(0): - case UQ_4_12(0.5): - resistTypes |= 1u << i; - break; - } - } - - while (resistTypes != 0) - { - i = Random() % NUMBER_OF_MON_TYPES; - if (resistTypes & 1u << i) - { - if (IS_BATTLER_OF_TYPE(gBattlerAttacker, i)) - { - resistTypes &= ~(1u << i); // Type resists, but the user is already of this type. - } - else - { - SET_BATTLER_TYPE(gBattlerAttacker, i); - PREPARE_TYPE_BUFFER(gBattleTextBuff1, i); - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - } - } - - gBattlescriptCurrInstr = cmd->failInstr; - } + gBattlescriptCurrInstr = cmd->failInstr; } else { - if (gLastResultingMoves[gBattlerTarget] == MOVE_NONE - || gLastResultingMoves[gBattlerTarget] == MOVE_UNAVAILABLE - || gLastResultingMoves[gBattlerTarget] == MOVE_STRUGGLE) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (IsSemiInvulnerable(gBattlerTarget, gCurrentMove)) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (gLastUsedMoveType[gBattlerTarget] == TYPE_NONE || gLastUsedMoveType[gBattlerTarget] == TYPE_STELLAR || gLastUsedMoveType[gBattlerTarget] == TYPE_MYSTERY) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - u32 i, resistTypes = 0; - - for (i = 0; i < NUMBER_OF_MON_TYPES; i++) // Find all types that resist. - { - switch (GetTypeModifier(gLastUsedMoveType[gBattlerTarget], i)) - { - case UQ_4_12(0): - case UQ_4_12(0.5): - resistTypes |= 1u << i; - break; - } - } - - while (resistTypes != 0) - { - i = Random() % NUMBER_OF_MON_TYPES; - if (resistTypes & 1u << i) - { - if (IS_BATTLER_OF_TYPE(gBattlerAttacker, i)) - { - resistTypes &= ~(1u << i); // Type resists, but the user is already of this type. - } - else - { - SET_BATTLER_TYPE(gBattlerAttacker, i); - PREPARE_TYPE_BUFFER(gBattleTextBuff1, i); - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - } - } + gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxHP(gBattlerTarget) - gBattleMons[gBattlerAttacker].hp; + gBattlescriptCurrInstr = cmd->nextInstr; + } +} - gBattlescriptCurrInstr = cmd->failInstr; - } +static void HandleRoomMove(u32 statusFlag, u16 *timer, u8 stringId) +{ + if (gFieldStatuses & statusFlag) + { + gFieldStatuses &= ~statusFlag; + gBattleCommunication[MULTISTRING_CHOOSER] = stringId + 1; + } + else + { + gFieldStatuses |= statusFlag; + *timer = 5; + gBattleCommunication[MULTISTRING_CHOOSER] = stringId; } } -static void Cmd_setalwayshitflag(void) +static void Cmd_setroom(void) { CMD_ARGS(); - gStatuses3[gBattlerTarget] &= ~STATUS3_ALWAYS_HITS; - gStatuses3[gBattlerTarget] |= STATUS3_ALWAYS_HITS_TURN(2); - gDisableStructs[gBattlerTarget].battlerWithSureHit = gBattlerAttacker; + switch (GetMoveEffect(gCurrentMove)) + { + case EFFECT_TRICK_ROOM: + HandleRoomMove(STATUS_FIELD_TRICK_ROOM, &gFieldTimers.trickRoomTimer, 0); + break; + case EFFECT_WONDER_ROOM: + HandleRoomMove(STATUS_FIELD_WONDER_ROOM, &gFieldTimers.wonderRoomTimer, 2); + break; + case EFFECT_MAGIC_ROOM: + HandleRoomMove(STATUS_FIELD_MAGIC_ROOM, &gFieldTimers.magicRoomTimer, 4); + break; + default: + gBattleCommunication[MULTISTRING_CHOOSER] = 6; + break; + } gBattlescriptCurrInstr = cmd->nextInstr; } -// Sketch -static void Cmd_copymovepermanently(void) +// Skill Swap +static void Cmd_tryswapabilities(void) { CMD_ARGS(const u8 *failInstr); - gChosenMove = MOVE_UNAVAILABLE; - - if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_TRANSFORMED) - && gLastPrintedMoves[gBattlerTarget] != MOVE_UNAVAILABLE - && !IsMoveSketchBanned(gLastPrintedMoves[gBattlerTarget])) + if (gAbilitiesInfo[gBattleMons[gBattlerAttacker].ability].cantBeSwapped + || gAbilitiesInfo[gBattleMons[gBattlerTarget].ability].cantBeSwapped) { - s32 i; - - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (GetMoveEffect(gBattleMons[gBattlerAttacker].moves[i]) == EFFECT_SKETCH) - continue; - if (gBattleMons[gBattlerAttacker].moves[i] == gLastPrintedMoves[gBattlerTarget]) - break; - } - - if (i != MAX_MON_MOVES) + RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability); + gBattlescriptCurrInstr = cmd->failInstr; + } + else if (CanAbilityShieldActivateForBattler(gBattlerAttacker) || CanAbilityShieldActivateForBattler(gBattlerTarget)) + { + gBattlescriptCurrInstr = BattleScript_MoveEnd; + BattleScriptCall(BattleScript_AbilityShieldProtects); + } + else + { + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT || (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX)) { gBattlescriptCurrInstr = cmd->failInstr; } - else // sketch worked + else { - struct MovePpInfo movePpData; - - gBattleMons[gBattlerAttacker].moves[gCurrMovePos] = gLastPrintedMoves[gBattlerTarget]; - gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = GetMovePP(gLastPrintedMoves[gBattlerTarget]); - - for (i = 0; i < MAX_MON_MOVES; i++) - { - movePpData.moves[i] = gBattleMons[gBattlerAttacker].moves[i]; - movePpData.pp[i] = gBattleMons[gBattlerAttacker].pp[i]; - } - movePpData.ppBonuses = gBattleMons[gBattlerAttacker].ppBonuses; - - BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_MOVES_PP_BATTLE, 0, sizeof(movePpData), &movePpData); - MarkBattlerForControllerExec(gBattlerAttacker); - - PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastPrintedMoves[gBattlerTarget]) + if (!IsBattlerAlly(gBattlerAttacker, gBattlerTarget)) + gBattleScripting.abilityPopupOverwrite = gBattleMons[gBattlerAttacker].ability; + gLastUsedAbility = gBattleMons[gBattlerTarget].ability; + RemoveAbilityFlags(gBattlerTarget); + RemoveAbilityFlags(gBattlerAttacker); + gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = gBattleMons[gBattlerAttacker].ability; + gBattleMons[gBattlerAttacker].ability = gDisableStructs[gBattlerAttacker].overwrittenAbility = gLastUsedAbility; gBattlescriptCurrInstr = cmd->nextInstr; } } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } } -static void Cmd_trychoosesleeptalkmove(void) +static void Cmd_tryimprison(void) { CMD_ARGS(const u8 *failInstr); - u32 i, unusableMovesBits = 0, movePosition; - - for (i = 0; i < MAX_MON_MOVES; i++) + if (gBattleMons[gBattlerAttacker].volatiles.imprison) { - if (IsMoveSleepTalkBanned(gBattleMons[gBattlerAttacker].moves[i]) - || gBattleMoveEffects[GetMoveEffect(gBattleMons[gBattlerAttacker].moves[i])].twoTurnEffect) - { - unusableMovesBits |= (1 << (i)); - } + gBattlescriptCurrInstr = cmd->failInstr; } - - unusableMovesBits = CheckMoveLimitations(gBattlerAttacker, unusableMovesBits, ~(MOVE_LIMITATION_PP | MOVE_LIMITATION_CHOICE_ITEM)); - if (unusableMovesBits == ALL_MOVES_MASK) // all 4 moves cannot be chosen + else if (B_IMPRISON >= GEN_5) { + gBattleMons[gBattlerAttacker].volatiles.imprison = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; } - else // at least one move can be chosen + else { - // Set Sleep Talk as used move, so it works with Last Resort. - gDisableStructs[gBattlerAttacker].usedMoves |= 1u << gCurrMovePos; - do - { - movePosition = MOD(Random(), MAX_MON_MOVES); - } while ((1u << movePosition) & unusableMovesBits); + u8 battler; - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(gBattleMons[gBattlerAttacker].moves[movePosition])) - { - gBattleStruct->zmove.baseMoves[gBattlerAttacker] = gBattleMons[gBattlerAttacker].moves[movePosition]; - gCalledMove = GetTypeBasedZMove(gBattleMons[gBattlerAttacker].moves[movePosition]); - } - else + for (battler = 0; battler < gBattlersCount; battler++) { - gCalledMove = gBattleMons[gBattlerAttacker].moves[movePosition]; + if (!IsBattlerAlly(gBattlerAttacker, battler)) + { + s32 attackerMoveId; + for (attackerMoveId = 0; attackerMoveId < MAX_MON_MOVES; attackerMoveId++) + { + s32 i; + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (gBattleMons[gBattlerAttacker].moves[attackerMoveId] == gBattleMons[battler].moves[i] + && gBattleMons[gBattlerAttacker].moves[attackerMoveId] != MOVE_NONE) + break; + } + if (i != MAX_MON_MOVES) + break; + } + if (attackerMoveId != MAX_MON_MOVES) + { + gBattleMons[gBattlerAttacker].volatiles.imprison = TRUE; + gBattlescriptCurrInstr = cmd->nextInstr; + break; + } + } } - gCurrMovePos = movePosition; - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; - gBattlerTarget = GetBattleMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); - gBattlescriptCurrInstr = cmd->failInstr; + if (battler == gBattlersCount) // In Generation 3 games, Imprison fails if the user doesn't share any moves with any of the foes. + gBattlescriptCurrInstr = cmd->failInstr; } } -static inline bool32 IsDanamaxMonPresent(void) +static void Cmd_setstealthrock(void) { - for (u32 battler = 0; battler < gBattlersCount; battler++) - { - if (battler == gBattlerAttacker) - continue; + CMD_ARGS(const u8 *failInstr); - if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX) - return TRUE; + u8 targetSide = GetBattlerSide(gBattlerTarget); + if (IsHazardOnSide(targetSide, HAZARDS_STEALTH_ROCK)) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + PushHazardTypeToQueue(targetSide, HAZARDS_STEALTH_ROCK); + gBattlescriptCurrInstr = cmd->nextInstr; } - - return FALSE; } -static void Cmd_trysetdestinybond(void) +static void Cmd_trysetvolatile(void) { - CMD_ARGS(const u8 *failInstr); + CMD_ARGS(u8 battler, u8 _volatile, const u8 *failInstr); - if (IsDanamaxMonPresent()) - { - gBattlescriptCurrInstr = BattleScript_MoveBlockedByDynamax; - } - else if (DoesDestinyBondFail(gBattlerAttacker)) + u32 battler = GetBattlerForBattleScript(cmd->battler); + + if (GetBattlerVolatile(battler, cmd->_volatile) != 0) { gBattlescriptCurrInstr = cmd->failInstr; } else { - gBattleMons[gBattlerAttacker].status2 |= STATUS2_DESTINY_BOND; + SetMonVolatile(battler, cmd->_volatile, TRUE); + switch (cmd->_volatile) + { + case VOLATILE_MAGNET_RISE: + gDisableStructs[battler].magnetRiseTimer = 5; + break; + case VOLATILE_LASER_FOCUS: + gDisableStructs[battler].laserFocusTimer = 2; + break; + default: + break; + } gBattlescriptCurrInstr = cmd->nextInstr; } } -static void TrySetDestinyBondToHappen(void) +static void Cmd_unused_0xde(void) { - if (gBattleMons[gBattlerTarget].status2 & STATUS2_DESTINY_BOND - && !IsBattlerAlly(gBattlerAttacker, gBattlerTarget) - && !(gHitMarker & HITMARKER_GRUDGE)) - { - gHitMarker |= HITMARKER_DESTINYBOND; - } } -static void Cmd_trysetdestinybondtohappen(void) +static void Cmd_trysetmagiccoat(void) { - CMD_ARGS(); + CMD_ARGS(const u8 *failInstr); - TrySetDestinyBondToHappen(); - gBattlescriptCurrInstr = cmd->nextInstr; + if (IsLastMonToMove(gBattlerAttacker)) // fails if moving last + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + gProtectStructs[gBattlerAttacker].bounceMove = TRUE; + gBattlescriptCurrInstr = cmd->nextInstr; + } } -static void Cmd_settailwind(void) +// Snatch +static void Cmd_trysetsnatch(void) { CMD_ARGS(const u8 *failInstr); - u8 side = GetBattlerSide(gBattlerAttacker); - - if (!(gSideStatuses[side] & SIDE_STATUS_TAILWIND)) + if (IsLastMonToMove(gBattlerAttacker)) // fails if moving last { - gSideStatuses[side] |= SIDE_STATUS_TAILWIND; - gSideTimers[side].tailwindTimer = gBattleTurnCounter + (B_TAILWIND_TURNS >= GEN_5 ? 4 : 3); - gBattlescriptCurrInstr = cmd->nextInstr; + gBattlescriptCurrInstr = cmd->failInstr; } else { - gBattlescriptCurrInstr = cmd->failInstr; + gProtectStructs[gBattlerAttacker].stealMove = TRUE; + gBattlescriptCurrInstr = cmd->nextInstr; } } -static void Cmd_tryspiteppreduce(void) +static void Cmd_unused2(void) { - CMD_ARGS(const u8 *failInstr); +} - if (gLastMoves[gBattlerTarget] != MOVE_NONE - && gLastMoves[gBattlerTarget] != MOVE_UNAVAILABLE) - { - s32 i; +static void Cmd_switchoutabilities(void) +{ + CMD_ARGS(u8 battler); - // Get move slot to reduce PP. - if (IsMaxMove(gLastMoves[gBattlerTarget])) - { - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBattleStruct->dynamax.baseMoves[gBattlerTarget] == gBattleMons[gBattlerTarget].moves[i]) - break; - } - } - else + u32 battler = GetBattlerForBattleScript(cmd->battler); + if (gDisableStructs[battler].neutralizingGas) + { + gDisableStructs[battler].neutralizingGas = FALSE; + if (!IsNeutralizingGasOnField()) { - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gLastMoves[gBattlerTarget] == gBattleMons[gBattlerTarget].moves[i]) - break; - } + BattleScriptPush(gBattlescriptCurrInstr); + gBattlescriptCurrInstr = BattleScript_NeutralizingGasExits; + return; } + } - if (i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] > (B_CAN_SPITE_FAIL >= GEN_4 ? 0 : 1)) - { - s32 ppToDeduct = B_PP_REDUCED_BY_SPITE >= GEN_4 ? 4 : (Random() & 3) + 2; - // G-Max Depletion only deducts 2 PP. - if (IsMaxMove(gCurrentMove) && MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_SPITE)) - ppToDeduct = 2; - - if (gBattleMons[gBattlerTarget].pp[i] < ppToDeduct) - ppToDeduct = gBattleMons[gBattlerTarget].pp[i]; - - PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastMoves[gBattlerTarget]) - - ConvertIntToDecimalStringN(gBattleTextBuff2, ppToDeduct, STR_CONV_MODE_LEFT_ALIGN, 1); + switch (GetBattlerAbility(battler)) + { + case ABILITY_NATURAL_CURE: + if (gBattleMons[battler].status1 & STATUS1_SLEEP) + TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); - PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 1, ppToDeduct) + gBattleMons[battler].status1 = 0; + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, + 1u << gBattleStruct->battlerPartyIndexes[battler], + sizeof(gBattleMons[battler].status1), + &gBattleMons[battler].status1); + MarkBattlerForControllerExec(battler); + break; + case ABILITY_REGENERATOR: + { + u32 regenerate = GetNonDynamaxMaxHP(battler) / 3; + regenerate += gBattleMons[battler].hp; + if (regenerate > gBattleMons[battler].maxHP) + regenerate = gBattleMons[battler].maxHP; + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_HP_BATTLE, + 1u << gBattleStruct->battlerPartyIndexes[battler], + sizeof(regenerate), + ®enerate); + MarkBattlerForControllerExec(battler); + break; + } + default: + break; + } - gBattleMons[gBattlerTarget].pp[i] -= ppToDeduct; + gBattlescriptCurrInstr = cmd->nextInstr; +} - // if (MOVE_IS_PERMANENT(gBattlerTarget, i)), but backwards - if (!(gDisableStructs[gBattlerTarget].mimickedMoves & (1u << i)) - && !(gBattleMons[gBattlerTarget].status2 & STATUS2_TRANSFORMED)) - { - BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + i, 0, sizeof(gBattleMons[gBattlerTarget].pp[i]), &gBattleMons[gBattlerTarget].pp[i]); - MarkBattlerForControllerExec(gBattlerTarget); - } +static void Cmd_jumpifhasnohp(void) +{ + CMD_ARGS(u8 battler, const u8 *jumpInstr); - gBattlescriptCurrInstr = cmd->nextInstr; + u32 battler = GetBattlerForBattleScript(cmd->battler); - // Don't cut off Sky Drop if pp is brought to zero. - if (gBattleMons[gBattlerTarget].pp[i] == 0 && gBattleStruct->skyDropTargets[gBattlerTarget] == SKY_DROP_NO_TARGET) - CancelMultiTurnMoves(gBattlerTarget, SKY_DROP_IGNORE); - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } - } + if (!IsBattlerAlive(battler)) + gBattlescriptCurrInstr = cmd->jumpInstr; else - { - gBattlescriptCurrInstr = cmd->failInstr; - } + gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_healpartystatus(void) +static void Cmd_unused_0xE4(void) { - CMD_ARGS(); - - u32 i = 0; - u32 zero = 0; - u32 toHeal = 0; - u32 partner = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerAttacker))); - struct Pokemon *party = GetBattlerParty(gBattlerAttacker); - bool32 isSoundMove = IsSoundMove(gCurrentMove); +} - if (GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 - || GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) >= GEN_8 - || !(isSoundMove && GetBattlerAbility(gBattlerAttacker) == ABILITY_SOUNDPROOF)) - { - if (isSoundMove) - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BELL; - else - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SOOTHING_AROMA; - gBattleMons[gBattlerAttacker].status1 = 0; - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; - } - else - { - RecordAbilityBattle(gBattlerAttacker, gBattleMons[gBattlerAttacker].ability); - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BELL_SOUNDPROOF_ATTACKER; - } +static void Cmd_pickup(void) +{ + CMD_ARGS(); - gBattleScripting.battler = partner; + u32 i, j; + u16 species, heldItem; + u8 lvlDivBy10; + enum Ability ability; - if (IsBattlerAlive(partner)) + if (!InBattlePike()) // No items in Battle Pike. { - if (GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 - || !(isSoundMove && GetBattlerAbility(partner) == ABILITY_SOUNDPROOF)) - { - gBattleMons[partner].status1 = 0; - gBattleMons[partner].status2 &= ~STATUS2_NIGHTMARE; - } - else + bool32 isInPyramid = CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE; + for (i = 0; i < PARTY_SIZE; i++) { - RecordAbilityBattle(partner, gBattleMons[partner].ability); - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BELL_SOUNDPROOF_PARTNER; - } - } - - // Because the above MULTISTRING_CHOOSER are ORd, if both are set then it will be B_MSG_BELL_BOTH_SOUNDPROOF + species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG); + heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); + lvlDivBy10 = (GetMonData(&gPlayerParty[i], MON_DATA_LEVEL)-1) / 10; //Moving this here makes it easier to add in abilities like Honey Gather. + if (lvlDivBy10 > 9) + lvlDivBy10 = 9; - for (i = 0; i < PARTY_SIZE; i++) - { - u16 species = GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG); - u8 abilityNum = GetMonData(&party[i], MON_DATA_ABILITY_NUM); + ability = GetSpeciesAbility(species, GetMonData(&gPlayerParty[i], MON_DATA_ABILITY_NUM)); - if (species != SPECIES_NONE && species != SPECIES_EGG) - { - u16 ability; - bool32 isAttacker = gBattlerPartyIndexes[gBattlerAttacker] == i; - bool32 isDoublesPartner = gBattlerPartyIndexes[partner] == i && IsBattlerAlive(partner); + if (ability == ABILITY_PICKUP + && species != SPECIES_NONE + && species != SPECIES_EGG + && heldItem == ITEM_NONE + && (Random() % 10) == 0) + { + if (isInPyramid) + { + heldItem = GetBattlePyramidPickupItemId(); + SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &heldItem); + } + else + { + u32 rand = Random() % 100; + u32 percentTotal = 0; - if (GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 - || (GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) >= GEN_8 && isAttacker)) - ability = ABILITY_NONE; - else if (GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) > GEN_5 && !isAttacker && !isDoublesPartner) - ability = ABILITY_NONE; - else if (isAttacker) - ability = GetBattlerAbility(gBattlerAttacker); - else if (isDoublesPartner) - ability = GetBattlerAbility(partner); - else + for (j = 0; j < ARRAY_COUNT(sPickupTable); j++) + { + percentTotal += sPickupTable[j].percentage[lvlDivBy10]; + if (rand < percentTotal) + { + SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &sPickupTable[j].itemId); + break; + } + } + } + } + else if (ability == ABILITY_HONEY_GATHER + && species != 0 + && species != SPECIES_EGG + && heldItem == ITEM_NONE) { - ability = GetAbilityBySpecies(species, abilityNum); - #if TESTING - if (gTestRunnerEnabled) + if ((lvlDivBy10 + 1 ) * 5 > Random() % 100) { - u32 side = GetBattlerSide(gBattlerAttacker); - if (TestRunner_Battle_GetForcedAbility(side, i)) - ability = TestRunner_Battle_GetForcedAbility(side, i); + heldItem = ITEM_HONEY; + SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &heldItem); } - #endif } - - if (!(isSoundMove && ability == ABILITY_SOUNDPROOF)) + else if (P_SHUCKLE_BERRY_JUICE == GEN_2 + && species == SPECIES_SHUCKLE + && heldItem == ITEM_ORAN_BERRY + && (Random() % 16) == 0) { - toHeal |= (1 << i); - TryDeactivateSleepClause(GetBattlerSide(gBattlerAttacker), i); + heldItem = ITEM_BERRY_JUICE; + SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &heldItem); } } } - if (toHeal) - { - BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, toHeal, sizeof(zero), &zero); - MarkBattlerForControllerExec(gBattlerAttacker); - } - gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_cursetarget(void) -{ - CMD_ARGS(const u8 *failInstr); - - if (gBattleMons[gBattlerTarget].status2 & STATUS2_CURSED) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - gBattleMons[gBattlerTarget].status2 |= STATUS2_CURSED; - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - - gBattlescriptCurrInstr = cmd->nextInstr; - } -} - -static void Cmd_trysetspikes(void) +static void Cmd_unused_0xE6(void) { - CMD_ARGS(const u8 *failInstr); - - u8 targetSide = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker)); - - if (gSideTimers[targetSide].spikesAmount == 3) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - gSideStatuses[targetSide] |= SIDE_STATUS_SPIKES; - gSideTimers[targetSide].spikesAmount++; - gBattlescriptCurrInstr = cmd->nextInstr; - } } -static void Cmd_setforesight(void) +static void Cmd_unused_0xE7(void) { - CMD_ARGS(); - - gBattleMons[gBattlerTarget].status2 |= STATUS2_FORESIGHT; - gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_trysetperishsong(void) +// Water and Mud Sport +static void Cmd_settypebasedhalvers(void) { CMD_ARGS(const u8 *failInstr); - s32 i; - s32 notAffectedCount = 0; + bool8 worked = FALSE; - for (i = 0; i < gBattlersCount; i++) + if (GetMoveEffect(gCurrentMove) == EFFECT_MUD_SPORT) { - if (gStatuses3[i] & STATUS3_PERISH_SONG - || GetBattlerAbility(i) == ABILITY_SOUNDPROOF - || BlocksPrankster(gCurrentMove, gBattlerAttacker, i, TRUE) - || gStatuses3[i] & STATUS3_COMMANDER) + if (B_SPORT_TURNS >= GEN_6) { - notAffectedCount++; + if (!(gFieldStatuses & STATUS_FIELD_MUDSPORT)) + { + gFieldStatuses |= STATUS_FIELD_MUDSPORT; + gFieldTimers.mudSportTimer = 5; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_ELECTRIC; + worked = TRUE; + } } else { - gStatuses3[i] |= STATUS3_PERISH_SONG; - gDisableStructs[i].perishSongTimer = 3; + if (!gBattleMons[gBattlerAttacker].volatiles.waterSport) + { + gBattleMons[gBattlerAttacker].volatiles.waterSport = TRUE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_ELECTRIC; + worked = TRUE; + } } } - - if (notAffectedCount == gBattlersCount) - gBattlescriptCurrInstr = cmd->failInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; -} - -static void Cmd_handlerollout(void) -{ - CMD_ARGS(); - - if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - { - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_IGNORE); - gBattlescriptCurrInstr = BattleScript_MoveMissedPause; - } - else + else // Water Sport { - if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) // First hit. + if (B_SPORT_TURNS >= GEN_6) { - gDisableStructs[gBattlerAttacker].rolloutTimer = 5; - gDisableStructs[gBattlerAttacker].rolloutTimerStartValue = 5; - gBattleMons[gBattlerAttacker].status2 |= STATUS2_MULTIPLETURNS; - gLockedMoves[gBattlerAttacker] = gCurrentMove; + if (!(gFieldStatuses & STATUS_FIELD_WATERSPORT)) + { + gFieldStatuses |= STATUS_FIELD_WATERSPORT; + gFieldTimers.waterSportTimer = 5; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_FIRE; + worked = TRUE; + } } - if (--gDisableStructs[gBattlerAttacker].rolloutTimer == 0) // Last hit. + else { - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_MULTIPLETURNS; + if (!gBattleMons[gBattlerAttacker].volatiles.mudSport) + { + gBattleMons[gBattlerAttacker].volatiles.mudSport = TRUE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_FIRE; + worked = TRUE; + } } + } + if (worked) gBattlescriptCurrInstr = cmd->nextInstr; - } + else + gBattlescriptCurrInstr = cmd->failInstr; } -static void Cmd_jumpifconfusedandstatmaxed(void) +bool32 DoesSubstituteBlockMove(u32 battlerAtk, u32 battlerDef, u32 move) { - CMD_ARGS(u8 stat, const u8 *jumpInstr); + if (!gBattleMons[battlerDef].volatiles.substitute) + return FALSE; + else if (MoveIgnoresSubstitute(move)) + return FALSE; + else if (IsAbilityAndRecord(battlerAtk, GetBattlerAbility(battlerAtk), ABILITY_INFILTRATOR)) + return FALSE; + else + return TRUE; +} - if (gBattleMons[gBattlerTarget].status2 & STATUS2_CONFUSION - && !CompareStat(gBattlerTarget, cmd->stat, MAX_STAT_STAGE, CMP_LESS_THAN)) - gBattlescriptCurrInstr = cmd->jumpInstr; // Fails if we're confused AND stat cannot be raised +bool32 DoesDisguiseBlockMove(u32 battler, u32 move) +{ + if (!IsMimikyuDisguised(battler) + || gBattleMons[battler].volatiles.transformed + || (!gProtectStructs[battler].confusionSelfDmg && IsBattleMoveStatus(move)) + || !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_DISGUISE)) + return FALSE; + else + return TRUE; +} + +static void Cmd_jumpifsubstituteblocks(void) +{ + CMD_ARGS(const u8 *jumpInstr); + + if (DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) + gBattlescriptCurrInstr = cmd->jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_handlefurycutter(void) +static void Cmd_tryrecycleitem(void) { - CMD_ARGS(); + CMD_ARGS(const u8 *failInstr); - if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - { - gDisableStructs[gBattlerAttacker].furyCutterCounter = 0; - gBattlescriptCurrInstr = BattleScript_MoveMissedPause; - } + u16 *usedHeldItem; + + if (gCurrentMove == MOVE_NONE && GetBattlerAbility(gBattlerAttacker) == ABILITY_PICKUP) + usedHeldItem = &GetBattlerPartyState(gBattlerTarget)->usedHeldItem; else + usedHeldItem = &GetBattlerPartyState(gBattlerAttacker)->usedHeldItem; + if (*usedHeldItem != ITEM_NONE && gBattleMons[gBattlerAttacker].item == ITEM_NONE) { - u32 max; - - if (B_UPDATED_MOVE_DATA >= GEN_6) - max = 3; - else if (B_UPDATED_MOVE_DATA == GEN_5) - max = 4; - else - max = 5; + gLastUsedItem = *usedHeldItem; + *usedHeldItem = ITEM_NONE; + gBattleMons[gBattlerAttacker].item = gLastUsedItem; - if (gDisableStructs[gBattlerAttacker].furyCutterCounter < max - && gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_2ND_HIT) // Don't increment counter on second hit - gDisableStructs[gBattlerAttacker].furyCutterCounter++; + BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerAttacker].item), &gBattleMons[gBattlerAttacker].item); + MarkBattlerForControllerExec(gBattlerAttacker); gBattlescriptCurrInstr = cmd->nextInstr; } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } } -static void Cmd_setembargo(void) +bool32 CanCamouflage(u8 battler) +{ + if (IS_BATTLER_OF_TYPE(battler, gBattleEnvironmentInfo[gBattleEnvironment].camouflageType)) + return FALSE; + return TRUE; +} + +static void Cmd_settypetoenvironment(void) { CMD_ARGS(const u8 *failInstr); - if (gStatuses3[gBattlerTarget] & STATUS3_EMBARGO) + u8 environmentType; + switch(gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) { - gBattlescriptCurrInstr = cmd->failInstr; + case STATUS_FIELD_ELECTRIC_TERRAIN: + environmentType = TYPE_ELECTRIC; + break; + case STATUS_FIELD_GRASSY_TERRAIN: + environmentType = TYPE_GRASS; + break; + case STATUS_FIELD_MISTY_TERRAIN: + environmentType = TYPE_FAIRY; + break; + case STATUS_FIELD_PSYCHIC_TERRAIN: + environmentType = TYPE_PSYCHIC; + break; + default: + environmentType = gBattleEnvironmentInfo[gBattleEnvironment].camouflageType; + break; } - else + + if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, environmentType) && GetActiveGimmick(gBattlerAttacker) != GIMMICK_TERA) { - gStatuses3[gBattlerTarget] |= STATUS3_EMBARGO; - gDisableStructs[gBattlerTarget].embargoTimer = gBattleTurnCounter + 5; + SET_BATTLER_TYPE(gBattlerAttacker, environmentType); + PREPARE_TYPE_BUFFER(gBattleTextBuff1, environmentType); + gBattlescriptCurrInstr = cmd->nextInstr; } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } } -static void Cmd_presentdamagecalculation(void) +// Unused +static void Cmd_pursuitdoubles(void) { - CMD_ARGS(); + CMD_ARGS(const u8 *failInstr); - u32 rand = Random() & 0xFF; - - /* Don't reroll present effect/power for the second hit of Parental Bond. - * Not sure if this is the correct behaviour, but bulbapedia states - * that if present heals the foe, it doesn't strike twice, and if it deals - * damage, the second strike will always deal damage too. This is a simple way - * to replicate that effect. - */ - if (gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_2ND_HIT) - { - if (rand < 102) - { - gBattleStruct->presentBasePower = 40; - } - else if (rand < 178) - { - gBattleStruct->presentBasePower = 80; - } - else if (rand < 204) - { - gBattleStruct->presentBasePower = 120; - } - else - { - // TODO: Check if this is correct - gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxMaxHP(gBattlerTarget) / 4; - if (gBattleStruct->moveDamage[gBattlerTarget] == 0) - gBattleStruct->moveDamage[gBattlerTarget] = 1; - gBattleStruct->moveDamage[gBattlerTarget] *= -1; - gBattleStruct->presentBasePower = 0; - } - } + u32 battler = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerAttacker))); - if (gBattleStruct->presentBasePower) - { - gBattlescriptCurrInstr = BattleScript_HitFromCritCalc; - } - else if (gBattleMons[gBattlerTarget].maxHP == gBattleMons[gBattlerTarget].hp) + if (IsDoubleBattle() + && !(gAbsentBattlerFlags & (1u << battler)) + && gChosenActionByBattler[battler] == B_ACTION_USE_MOVE + && GetMoveEffect(gChosenMoveByBattler[battler]) == EFFECT_PURSUIT) { - gBattlescriptCurrInstr = BattleScript_AlreadyAtFullHp; + gActionsByTurnOrder[battler] = B_ACTION_TRY_FINISH; + gCurrentMove = gChosenMoveByBattler[battler]; + gBattlescriptCurrInstr = cmd->nextInstr; + gBattleScripting.animTurn = 1; + gBattleScripting.savedBattler = gBattlerAttacker; + gBattlerAttacker = battler; } else { - gBattleStruct->moveResultFlags[gBattlerTarget] &= ~MOVE_RESULT_DOESNT_AFFECT_FOE; - gBattlescriptCurrInstr = BattleScript_PresentHealTarget; + gBattlescriptCurrInstr = cmd->failInstr; } } -static void Cmd_setsafeguard(void) +static void Cmd_snatchsetbattlers(void) { CMD_ARGS(); - if (gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_SAFEGUARD) - { - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED; - } + gEffectBattler = gBattlerAttacker; + + if (gBattlerAttacker == gBattlerTarget) + gBattlerAttacker = gBattlerTarget = gBattleScripting.battler; else - { - gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_SAFEGUARD; - gSideTimers[GetBattlerSide(gBattlerAttacker)].safeguardTimer = gBattleTurnCounter + 5; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SAFEGUARD; - } + gBattlerTarget = gBattleScripting.battler; + gBattleScripting.battler = gEffectBattler; gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_magnitudedamagecalculation(void) +static void Cmd_removescreens(void) { CMD_ARGS(); - u32 magnitude = Random() % 100; + u8 side; + bool32 failed; - if (magnitude < 5) - { - gBattleStruct->magnitudeBasePower = 10; - magnitude = 4; - } - else if (magnitude < 15) - { - gBattleStruct->magnitudeBasePower = 30; - magnitude = 5; - } - else if (magnitude < 35) - { - gBattleStruct->magnitudeBasePower = 50; - magnitude = 6; - } - else if (magnitude < 65) - { - gBattleStruct->magnitudeBasePower = 70; - magnitude = 7; - } - else if (magnitude < 85) - { - gBattleStruct->magnitudeBasePower = 90; - magnitude = 8; - } - else if (magnitude < 95) - { - gBattleStruct->magnitudeBasePower = 110; - magnitude = 9; - } + if (B_BRICK_BREAK >= GEN_4) + side = GetBattlerSide(gBattlerTarget); // From Gen 4 onwards, Brick Break can remove screens on the user's side if used on an ally else - { - gBattleStruct->magnitudeBasePower = 150; - magnitude = 10; - } - - PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 2, magnitude) - - for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) - { - if (gBattlerTarget == gBattlerAttacker) - continue; - if (!(gAbsentBattlerFlags & (1u << gBattlerTarget))) // A valid target was found. - break; - } - - gBattlescriptCurrInstr = cmd->nextInstr; -} - -static bool32 SetTargetToNextPursuiter(u32 battlerDef) -{ - u32 i; - for (i = gCurrentTurnActionNumber + 1; i < gBattlersCount; i++) - { - u32 battler = gBattlerByTurnOrder[i]; - if (gChosenActionByBattler[battler] == B_ACTION_USE_MOVE - && GetMoveEffect(gChosenMoveByBattler[battler]) == EFFECT_PURSUIT - && IsBattlerAlive(battlerDef) - && IsBattlerAlive(battler) - && !IsBattlerAlly(battler, battlerDef) - && (B_PURSUIT_TARGET >= GEN_4 || gBattleStruct->moveTarget[battler] == battlerDef) - && !IsGimmickSelected(battler, GIMMICK_Z_MOVE) - && !IsGimmickSelected(battler, GIMMICK_DYNAMAX) - && GetActiveGimmick(battler) != GIMMICK_DYNAMAX) - { - gBattlerTarget = battler; - return TRUE; - } - } - return FALSE; -} - -static void Cmd_jumpifnopursuitswitchdmg(void) -{ - CMD_ARGS(const u8 *jumpInstr); + side = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE; - u32 savedTarget = gBattlerTarget; + if (B_BRICK_BREAK >= GEN_5) + failed = gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT; + else + failed = FALSE; - if (SetTargetToNextPursuiter(gBattlerAttacker)) + if (!failed && gSideStatuses[side] & SIDE_STATUS_SCREEN_ANY) { - ChangeOrderTargetAfterAttacker(); - gBattleStruct->battlerState[gBattlerAttacker].pursuitTarget = TRUE; - gBattleStruct->pursuitStoredSwitch = gBattleStruct->monToSwitchIntoId[gBattlerAttacker]; - gBattleStruct->moveTarget[gBattlerTarget] = gBattlerAttacker; - gBattlerTarget = savedTarget; - gBattlescriptCurrInstr = cmd->nextInstr; + gSideStatuses[side] &= ~SIDE_STATUS_SCREEN_ANY; + gBattleScripting.animTurn = 1; + gBattleScripting.animTargetsHit = 1; } else { - gBattlescriptCurrInstr = cmd->jumpInstr; + gBattleScripting.animTurn = 0; + gBattleScripting.animTargetsHit = 0; } -} -static void Cmd_tryrestorehpberry(void) -{ - CMD_ARGS(); - if (TryRestoreHPBerries(gBattlerAttacker, ITEMEFFECT_TRY_HEALING)) - return; gBattlescriptCurrInstr = cmd->nextInstr; } -// Belly Drum, Fillet Away -static void Cmd_halvehp(void) +u8 GetCatchingBattler(void) { - CMD_ARGS(const u8 *failInstr); - - u32 halfHp = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; - - if (!(GetNonDynamaxMaxHP(gBattlerAttacker) / 2)) - halfHp = 1; - - if (gBattleMons[gBattlerAttacker].hp > halfHp) - { - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - - gBattlescriptCurrInstr = cmd->nextInstr; - } + if (IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT))) + return GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); else - { - gBattlescriptCurrInstr = cmd->failInstr; - } + return GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); } -// Psych Up -static void Cmd_copyfoestats(void) +static void Cmd_handleballthrow(void) { - CMD_ARGS(const u8 *unused); - - s32 i; - - for (i = 0; i < NUM_BATTLE_STATS; i++) - { - gBattleMons[gBattlerAttacker].statStages[i] = gBattleMons[gBattlerTarget].statStages[i]; - } + CMD_ARGS(); - gBattlescriptCurrInstr = cmd->nextInstr; // Has an unused jump ptr(possibly for a failed attempt) parameter. -} + u16 ballMultiplier = 100; + s8 ballAddition = 0; -static void Cmd_rapidspinfree(void) -{ - CMD_ARGS(); + if (gBattleControllerExecFlags) + return; - u8 atkSide = GetBattlerSide(gBattlerAttacker); + gBattlerTarget = GetCatchingBattler(); - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_WRAPPED) - { - gBattleScripting.battler = gBattlerTarget; - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_WRAPPED; - gBattlerTarget = gBattleStruct->wrappedBy[gBattlerAttacker]; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[gBattlerAttacker]); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_WrapFree; - } - else if (gStatuses3[gBattlerAttacker] & STATUS3_LEECHSEED) - { - gStatuses3[gBattlerAttacker] &= ~STATUS3_LEECHSEED; - gStatuses3[gBattlerAttacker] &= ~STATUS3_LEECHSEED_BATTLER; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_LeechSeedFree; - } - else if (gSideStatuses[atkSide] & SIDE_STATUS_SPIKES) - { - gSideStatuses[atkSide] &= ~SIDE_STATUS_SPIKES; - gSideTimers[atkSide].spikesAmount = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SpikesFree; - } - else if (gSideStatuses[atkSide] & SIDE_STATUS_TOXIC_SPIKES) - { - gSideStatuses[atkSide] &= ~SIDE_STATUS_TOXIC_SPIKES; - gSideTimers[atkSide].toxicSpikesAmount = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ToxicSpikesFree; - } - else if (gSideStatuses[atkSide] & SIDE_STATUS_STICKY_WEB) - { - gSideStatuses[atkSide] &= ~SIDE_STATUS_STICKY_WEB; - gSideTimers[atkSide].stickyWebAmount = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_StickyWebFree; - } - else if (gSideStatuses[atkSide] & SIDE_STATUS_STEALTH_ROCK) + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - gSideStatuses[atkSide] &= ~SIDE_STATUS_STEALTH_ROCK; - gSideTimers[atkSide].stealthRockAmount = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_StealthRockFree; + BtlController_EmitBallThrowAnim(gBattlerAttacker, B_COMM_TO_CONTROLLER, BALL_TRAINER_BLOCK); + MarkBattlerForControllerExec(gBattlerAttacker); + gBattlescriptCurrInstr = BattleScript_TrainerBallBlock; } - else if (gSideStatuses[atkSide] & SIDE_STATUS_STEELSURGE) + else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) { - gSideStatuses[atkSide] &= ~SIDE_STATUS_STEELSURGE; - gSideTimers[atkSide].steelsurgeAmount = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SteelsurgeFree; + BtlController_EmitBallThrowAnim(gBattlerAttacker, B_COMM_TO_CONTROLLER, BALL_3_SHAKES_SUCCESS); + MarkBattlerForControllerExec(gBattlerAttacker); + gBattlescriptCurrInstr = BattleScript_WallyBallThrow; } else { - gBattlescriptCurrInstr = cmd->nextInstr; - } -} - -static void Cmd_setdefensecurlbit(void) -{ - CMD_ARGS(); - - gBattleMons[gBattlerAttacker].status2 |= STATUS2_DEFENSE_CURL; - gBattlescriptCurrInstr = cmd->nextInstr; -} + u32 odds, i; + u32 catchRate; + u32 ballId = ItemIdToBallId(gLastUsedItem); -static void Cmd_recoverbasedonsunlight(void) -{ - CMD_ARGS(const u8 *failInstr); + gBallToDisplay = gLastThrownBall = gLastUsedItem; + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + catchRate = gBattleStruct->safariCatchFactor * 1275 / 100; + else + catchRate = gSpeciesInfo[gBattleMons[gBattlerTarget].species].catchRate; - gBattlerTarget = gBattlerAttacker; - if (gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP) - { - if (GetMoveEffect(gCurrentMove) == EFFECT_SHORE_UP) + if (gSpeciesInfo[gBattleMons[gBattlerTarget].species].isUltraBeast) { - if (HasWeatherEffect() && gBattleWeather & B_WEATHER_SANDSTORM) - gBattleStruct->moveDamage[gBattlerAttacker] = 20 * GetNonDynamaxMaxHP(gBattlerAttacker) / 30; + if (ballId == BALL_BEAST) + ballMultiplier = 500; else - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; + ballMultiplier = 10; } else { - if (!(gBattleWeather & B_WEATHER_ANY) || !HasWeatherEffect() || GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA) - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; - else if (gBattleWeather & B_WEATHER_SUN) - gBattleStruct->moveDamage[gBattlerAttacker] = 20 * GetNonDynamaxMaxHP(gBattlerAttacker) / 30; - else // not sunny weather - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; - } - - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - gBattleStruct->moveDamage[gBattlerAttacker] *= -1; - - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } -} - -static void Cmd_setstickyweb(void) -{ - CMD_ARGS(const u8 *failInstr); - - u8 targetSide = GetBattlerSide(gBattlerTarget); - - if (gSideStatuses[targetSide] & SIDE_STATUS_STICKY_WEB) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - gSideStatuses[targetSide] |= SIDE_STATUS_STICKY_WEB; - gSideTimers[targetSide].stickyWebBattlerId = gBattlerAttacker; // For Mirror Armor - gSideTimers[targetSide].stickyWebBattlerSide = GetBattlerSide(gBattlerAttacker); // For Court Change/Defiant - set this to the user's side - gSideTimers[targetSide].stickyWebAmount = 1; - gBattlescriptCurrInstr = cmd->nextInstr; - } -} - -static void Cmd_selectfirstvalidtarget(void) -{ - CMD_ARGS(); - - for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) - { - if (gBattlerTarget == gBattlerAttacker && !(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove) & MOVE_TARGET_USER)) - continue; - if (IsBattlerAlive(gBattlerTarget)) + switch (ballId) + { + case BALL_ULTRA: + ballMultiplier = 200; + break; + case BALL_SPORT: + if (B_SPORT_BALL_MODIFIER <= GEN_7) + ballMultiplier = 150; + break; + case BALL_GREAT: + ballMultiplier = 150; + break; + case BALL_SAFARI: + if (B_SAFARI_BALL_MODIFIER <= GEN_7) + ballMultiplier = 150; + break; + case BALL_NET: + if (IS_BATTLER_ANY_TYPE(gBattlerTarget, TYPE_WATER, TYPE_BUG)) + ballMultiplier = B_NET_BALL_MODIFIER >= GEN_7 ? 350 : 300; + break; + case BALL_DIVE: + if (GetCurrentMapType() == MAP_TYPE_UNDERWATER + || (B_DIVE_BALL_MODIFIER >= GEN_4 && (gIsFishingEncounter || gIsSurfingEncounter))) + ballMultiplier = 350; + break; + case BALL_NEST: + if (B_NEST_BALL_MODIFIER >= GEN_6) + { + //((41 - PokΓ©mon's level) Γ· 10)Γ— if PokΓ©mon's level is between 1 and 29, 1Γ— otherwise. + if (gBattleMons[gBattlerTarget].level < 30) + ballMultiplier = 410 - (gBattleMons[gBattlerTarget].level * 10); + } + else if (B_NEST_BALL_MODIFIER >= GEN_5) + { + //((41 - PokΓ©mon's level) Γ· 10)Γ—, minimum 1Γ— + if (gBattleMons[gBattlerTarget].level < 31) + ballMultiplier = 410 - (gBattleMons[gBattlerTarget].level * 10); + } + else if (gBattleMons[gBattlerTarget].level < 40) + { + //((40 - PokΓ©mon's level) Γ· 10)Γ—, minimum 1Γ— + ballMultiplier = 400 - (gBattleMons[gBattlerTarget].level * 10); + if (ballMultiplier <= 90) + ballMultiplier = 100; + } + break; + case BALL_REPEAT: + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBattlerTarget].species), FLAG_GET_CAUGHT)) + ballMultiplier = (B_REPEAT_BALL_MODIFIER >= GEN_7 ? 350 : 300); + break; + case BALL_TIMER: + ballMultiplier = 100 + (gBattleResults.battleTurnCounter * (B_TIMER_BALL_MODIFIER >= GEN_5 ? 30 : 10)); + if (ballMultiplier > 400) + ballMultiplier = 400; + break; + case BALL_DUSK: + i = GetTimeOfDay(); + if (i == TIME_EVENING || i == TIME_NIGHT || gMapHeader.cave || gMapHeader.mapType == MAP_TYPE_UNDERGROUND) + ballMultiplier = (B_DUSK_BALL_MODIFIER >= GEN_7 ? 300 : 350); + break; + case BALL_QUICK: + if (gBattleResults.battleTurnCounter == 0) + ballMultiplier = (B_QUICK_BALL_MODIFIER >= GEN_5 ? 500 : 400); + break; + case BALL_LEVEL: + if (gBattleMons[gBattlerAttacker].level >= 4 * gBattleMons[gBattlerTarget].level) + ballMultiplier = 800; + else if (gBattleMons[gBattlerAttacker].level > 2 * gBattleMons[gBattlerTarget].level) + ballMultiplier = 400; + else if (gBattleMons[gBattlerAttacker].level > gBattleMons[gBattlerTarget].level) + ballMultiplier = 200; + break; + case BALL_LURE: + if (gIsFishingEncounter) + { + if (B_LURE_BALL_MODIFIER >= GEN_8) + ballMultiplier = 400; + else if (B_LURE_BALL_MODIFIER >= GEN_7) + ballMultiplier = 500; + else + ballMultiplier = 300; + } + break; + case BALL_MOON: + { + const struct Evolution *evolutions = GetSpeciesEvolutions(gBattleMons[gBattlerTarget].species); + if (evolutions == NULL) + break; + for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) + { + if (evolutions[i].method == EVO_ITEM + && evolutions[i].param == ITEM_MOON_STONE) + ballMultiplier = 400; + } + } break; - } - gBattlescriptCurrInstr = cmd->nextInstr; -} - -static void Cmd_trysetfutureattack(void) -{ - CMD_ARGS(const u8 *failInstr); + case BALL_LOVE: + if (gBattleMons[gBattlerTarget].species == gBattleMons[gBattlerAttacker].species) + { + u8 gender1 = GetMonGender(GetBattlerMon(gBattlerTarget)); + u8 gender2 = GetMonGender(GetBattlerMon(gBattlerAttacker)); - if (gWishFutureKnock.futureSightCounter[gBattlerTarget] > gBattleTurnCounter) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - gSideStatuses[GetBattlerSide(gBattlerTarget)] |= SIDE_STATUS_FUTUREATTACK; - gWishFutureKnock.futureSightMove[gBattlerTarget] = gCurrentMove; - gWishFutureKnock.futureSightBattlerIndex[gBattlerTarget] = gBattlerAttacker; - gWishFutureKnock.futureSightPartyIndex[gBattlerTarget] = gBattlerPartyIndexes[gBattlerAttacker]; - gWishFutureKnock.futureSightCounter[gBattlerTarget] = gBattleTurnCounter + 3; + if (gender1 != gender2 && gender1 != MON_GENDERLESS && gender2 != MON_GENDERLESS) + ballMultiplier = 800; + } + break; + case BALL_FAST: + if (GetSpeciesBaseSpeed(gBattleMons[gBattlerTarget].species) >= 100) + ballMultiplier = 400; + break; + case BALL_HEAVY: + i = GetSpeciesWeight(gBattleMons[gBattlerTarget].species); + if (B_HEAVY_BALL_MODIFIER >= GEN_7) + { + if (i < 1000) + ballAddition = -20; + else if (i < 2000) + ballAddition = 0; + else if (i < 3000) + ballAddition = 20; + else + ballAddition = 30; + } + else if (B_HEAVY_BALL_MODIFIER >= GEN_4) + { + if (i < 2048) + ballAddition = -20; + else if (i < 3072) + ballAddition = 20; + else if (i < 4096) + ballAddition = 30; + else + ballAddition = 40; + } + else + { + if (i < 1024) + ballAddition = -20; + else if (i < 2048) + ballAddition = 0; + else if (i < 3072) + ballAddition = 20; + else if (i < 4096) + ballAddition = 30; + else + ballAddition = 40; + } + break; + case BALL_DREAM: + if (B_DREAM_BALL_MODIFIER >= GEN_8 && (gBattleMons[gBattlerTarget].status1 & STATUS1_SLEEP || GetBattlerAbility(gBattlerTarget) == ABILITY_COMATOSE)) + ballMultiplier = 400; + break; + case BALL_BEAST: + ballMultiplier = 10; + break; + } + } - if (gCurrentMove == MOVE_DOOM_DESIRE) - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOOM_DESIRE; + // catchRate is unsigned, which means that it may potentially overflow if sum is applied directly. + if (catchRate < 21 && ballAddition == -20) + catchRate = 1; else - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FUTURE_SIGHT; - - gBattlescriptCurrInstr = cmd->nextInstr; - } -} + catchRate = catchRate + ballAddition; -static void Cmd_trydobeatup(void) -{ -#if B_BEAT_UP >= GEN_5 - CMD_ARGS(); + odds = (catchRate * ballMultiplier / 100) + * (gBattleMons[gBattlerTarget].maxHP * 3 - gBattleMons[gBattlerTarget].hp * 2) + / (3 * gBattleMons[gBattlerTarget].maxHP); - gBattleStruct->beatUpSlot++; - gBattlescriptCurrInstr = cmd->nextInstr; -#else - CMD_ARGS(const u8 *endInstr, const u8 *failInstr); - struct Pokemon *party = GetBattlerParty(gBattlerAttacker); + if (gBattleMons[gBattlerTarget].status1 & STATUS1_INCAPACITATED) + odds *= 2; + if (gBattleMons[gBattlerTarget].status1 & STATUS1_CAN_MOVE) + odds = (odds * 15) / 10; - if (!IsBattlerAlive(gBattlerTarget)) - { - gBattlescriptCurrInstr = cmd->endInstr; - } - else - { - u8 beforeLoop = gBattleCommunication[0]; - for (;gBattleCommunication[0] < PARTY_SIZE; gBattleCommunication[0]++) - { - if (GetMonData(&party[gBattleCommunication[0]], MON_DATA_HP) - && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE - && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG - && !GetMonData(&party[gBattleCommunication[0]], MON_DATA_STATUS)) - break; - } + if (gBattleResults.catchAttempts[ballId] < 255) + gBattleResults.catchAttempts[ballId]++; - if (gBattleCommunication[0] < PARTY_SIZE) + if (odds > 254) // mon caught { - PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattleCommunication[0]) - - gBattlescriptCurrInstr = cmd->nextInstr; + BtlController_EmitBallThrowAnim(gBattlerAttacker, B_COMM_TO_CONTROLLER, BALL_3_SHAKES_SUCCESS); + MarkBattlerForControllerExec(gBattlerAttacker); + TryBattleFormChange(gBattlerTarget, FORM_CHANGE_END_BATTLE); + gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; + struct Pokemon *caughtMon = GetBattlerMon(gBattlerTarget); + SetMonData(caughtMon, MON_DATA_POKEBALL, &ballId); - gBattleStruct->moveDamage[gBattlerTarget] = gSpeciesInfo[GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES)].baseAttack; - gBattleStruct->moveDamage[gBattlerTarget] *= GetMovePower(gCurrentMove); - gBattleStruct->moveDamage[gBattlerTarget] *= (GetMonData(&party[gBattleCommunication[0]], MON_DATA_LEVEL) * 2 / 5 + 2); - gBattleStruct->moveDamage[gBattlerTarget] /= gSpeciesInfo[gBattleMons[gBattlerTarget].species].baseDefense; - gBattleStruct->moveDamage[gBattlerTarget] = (gBattleStruct->moveDamage[gBattlerTarget] / 50) + 2; - if (gProtectStructs[gBattlerAttacker].helpingHand) - gBattleStruct->moveDamage[gBattlerTarget] = gBattleStruct->moveDamage[gBattlerTarget] * 15 / 10; + if (CalculatePlayerPartyCount() == PARTY_SIZE) + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + else + gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gBattleCommunication[0]++; + if (ballId == BALL_HEAL) + { + MonRestorePP(caughtMon); + HealStatusConditions(caughtMon, STATUS1_ANY, gBattlerTarget); + gBattleMons[gBattlerTarget].hp = gBattleMons[gBattlerTarget].maxHP; + SetMonData(caughtMon, MON_DATA_HP, &gBattleMons[gBattlerTarget].hp); + } + else if (ballId == BALL_FRIEND) + { + u32 friendship = (B_FRIEND_BALL_MODIFIER >= GEN_8 ? 150 : 200); + SetMonData(caughtMon, MON_DATA_FRIENDSHIP, &friendship); + } } - else if (beforeLoop != 0) + else // mon may be caught, calculate shakes { - gBattlescriptCurrInstr = cmd->endInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; + u8 shakes; + u8 maxShakes; + + gBattleSpritesDataPtr->animationData->isCriticalCapture = FALSE; + gBattleSpritesDataPtr->animationData->criticalCaptureSuccess = FALSE; + + if (CriticalCapture(odds)) + { + maxShakes = BALL_1_SHAKE; // critical capture doesn't guarantee capture + gBattleSpritesDataPtr->animationData->isCriticalCapture = TRUE; + } + else + { + maxShakes = BALL_3_SHAKES_SUCCESS; + } + + if (ballId == BALL_MASTER) + { + shakes = maxShakes; + } + else + { + odds = Sqrt(Sqrt(16711680 / odds)); + odds = 1048560 / odds; + for (shakes = 0; shakes < maxShakes; shakes++) + { + if (RandomUniform(RNG_BALLTHROW_SHAKE, 0, MAX_u16) >= odds) + break; + } + } + + BtlController_EmitBallThrowAnim(gBattlerAttacker, B_COMM_TO_CONTROLLER, shakes); + MarkBattlerForControllerExec(gBattlerAttacker); + + if (shakes == maxShakes) // mon caught, copy of the code above + { + enum NationalDexOrder natDexNo = SpeciesToNationalPokedexNum(gBattleMons[gBattlerTarget].species); + if ((B_CRITICAL_CAPTURE_IF_OWNED >= GEN_9 && GetSetPokedexFlag(natDexNo, FLAG_GET_CAUGHT)) + || IsCriticalCapture()) + { + gBattleSpritesDataPtr->animationData->isCriticalCapture = TRUE; + gBattleSpritesDataPtr->animationData->criticalCaptureSuccess = TRUE; + } + TryBattleFormChange(gBattlerTarget, FORM_CHANGE_END_BATTLE); + gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; + struct Pokemon *caughtMon = GetBattlerMon(gBattlerTarget); + SetMonData(caughtMon, MON_DATA_POKEBALL, &ballId); + + if (CalculatePlayerPartyCount() == PARTY_SIZE) + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + else + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + + if (ballId == BALL_HEAL) + { + MonRestorePP(caughtMon); + HealStatusConditions(caughtMon, STATUS1_ANY, gBattlerTarget); + gBattleMons[gBattlerTarget].hp = gBattleMons[gBattlerTarget].maxHP; + SetMonData(caughtMon, MON_DATA_HP, &gBattleMons[gBattlerTarget].hp); + } + else if (ballId == BALL_FRIEND) + { + u32 friendship = (B_FRIEND_BALL_MODIFIER >= GEN_8 ? 150 : 200); + SetMonData(caughtMon, MON_DATA_FRIENDSHIP, &friendship); + } + } + else // not caught + { + if (!gHasFetchedBall) + gLastUsedBall = gLastUsedItem; + + if (IsCriticalCapture()) + gBattleCommunication[MULTISTRING_CHOOSER] = BALL_3_SHAKES_FAIL; + else + gBattleCommunication[MULTISTRING_CHOOSER] = shakes; + + gBattlescriptCurrInstr = BattleScript_ShakeBallThrow; + } } } -#endif } -static void Cmd_setsemiinvulnerablebit(void) +static void Cmd_givecaughtmon(void) { - CMD_ARGS(bool8 clear); + CMD_ARGS(const u8 *passInstr); + enum GiveCaughtMonStates state = gBattleCommunication[MULTIUSE_STATE]; + // Restore players party in order to handle properly the case when a wild mon is caught. + if (IsNPCFollowerWildBattle()) + LoadPlayerParty(); - if (gBattleMoveEffects[GetMoveEffect(gCurrentMove)].semiInvulnerableEffect == TRUE) + switch (state) { - u32 semiInvulnerableEffect = GetMoveTwoTurnAttackStatus(gCurrentMove); - if (cmd->clear) - gStatuses3[gBattlerAttacker] &= ~semiInvulnerableEffect; + case GIVECAUGHTMON_CHECK_PARTY_SIZE: + if (CalculatePlayerPartyCount() == PARTY_SIZE && B_CATCH_SWAP_INTO_PARTY >= GEN_7) + { + PrepareStringBattle(STRINGID_SENDCAUGHTMONPARTYORBOX, gBattlerAttacker); + gBattleCommunication[MSG_DISPLAY] = 1; + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_ASK_ADD_TO_PARTY; + } else - gStatuses3[gBattlerAttacker] |= semiInvulnerableEffect; - } - - gBattlescriptCurrInstr = cmd->nextInstr; -} + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_NO_MESSSAGE_SKIP; + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; + } + break; + case GIVECAUGHTMON_ASK_ADD_TO_PARTY: + HandleBattleWindow(YESNOBOX_X_Y, 0); + BattlePutTextOnWindow(gText_BattleYesNoChoice, B_WIN_YESNO); + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_HANDLE_INPUT; + gBattleCommunication[CURSOR_POSITION] = 0; + BattleCreateYesNoCursorAt(0); + break; + case GIVECAUGHTMON_HANDLE_INPUT: + if (JOY_NEW(DPAD_UP) && gBattleCommunication[CURSOR_POSITION] != 0) + { + PlaySE(SE_SELECT); + BattleDestroyYesNoCursorAt(gBattleCommunication[CURSOR_POSITION]); + gBattleCommunication[CURSOR_POSITION] = 0; + BattleCreateYesNoCursorAt(0); + } + if (JOY_NEW(DPAD_DOWN) && gBattleCommunication[CURSOR_POSITION] == 0) + { + PlaySE(SE_SELECT); + BattleDestroyYesNoCursorAt(gBattleCommunication[CURSOR_POSITION]); + gBattleCommunication[CURSOR_POSITION] = 1; + BattleCreateYesNoCursorAt(1); + } + if (JOY_NEW(A_BUTTON)) + { + PlaySE(SE_SELECT); + if (gBattleCommunication[CURSOR_POSITION] == 0) + { + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_DO_CHOOSE_MON; + } + else + { + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; + } + } + else if (JOY_NEW(B_BUTTON)) + { + PlaySE(SE_SELECT); + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; + } + break; + case GIVECAUGHTMON_DO_CHOOSE_MON: + if (!gPaletteFade.active) + { + BtlController_EmitChoosePokemon(gBattlerAttacker, B_COMM_TO_CONTROLLER, PARTY_ACTION_SEND_MON_TO_BOX, PARTY_SIZE, ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[gBattlerAttacker]); + MarkBattlerForControllerExec(gBattlerAttacker); + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_HANDLE_CHOSEN_MON; + } + break; + case GIVECAUGHTMON_HANDLE_CHOSEN_MON: + if (gSelectedMonPartyId != PARTY_SIZE) + { + if (gSelectedMonPartyId > PARTY_SIZE) + { + // Choosing Pokemon was cancelled + gSelectedMonPartyId = PARTY_SIZE; + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; + } + else + { + //Before sending to PC, we revert battle form + TryRevertPartyMonFormChange(gSelectedMonPartyId); + // Mon chosen, try to put it in the PC + if (CopyMonToPC(&gPlayerParty[gSelectedMonPartyId]) == MON_GIVEN_TO_PC) + { + GetMonNickname(&gPlayerParty[gSelectedMonPartyId], gStringVar2); + StringCopy(gStringVar1, GetBoxNamePtr(GetPCBoxToSendMon())); + ZeroMonData(&gPlayerParty[gSelectedMonPartyId]); + gBattleStruct->itemLost[B_SIDE_PLAYER][gSelectedMonPartyId].originalItem = ITEM_NONE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWAPPED_INTO_PARTY; + gSelectedMonPartyId = PARTY_SIZE; + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; + } + else + { + gSelectedMonPartyId = PARTY_SIZE; + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; + } + } + } + break; + case GIVECAUGHTMON_GIVE_AND_SHOW_MSG: + { + struct Pokemon *caughtMon = GetBattlerMon(GetCatchingBattler()); + if (B_RESTORE_HELD_BATTLE_ITEMS >= GEN_9) + { + u16 lostItem = gBattleStruct->itemLost[B_SIDE_OPPONENT][gBattlerPartyIndexes[GetCatchingBattler()]].originalItem; + if (lostItem != ITEM_NONE && GetItemPocket(lostItem) != POCKET_BERRIES) + SetMonData(caughtMon, MON_DATA_HELD_ITEM, &lostItem); // Restore non-berry items + } -static bool32 CheckIfCanFireTwoTurnMoveNow(u8 battler, bool8 checkChargeTurnEffects) -{ - // Semi-invulnerable moves cannot skip their charge turn (except with Power Herb) - if (gBattleMoveEffects[GetMoveEffect(gCurrentMove)].semiInvulnerableEffect == TRUE) - return FALSE; + if (GiveMonToPlayer(caughtMon) != MON_GIVEN_TO_PARTY + && gBattleCommunication[MULTISTRING_CHOOSER] != B_MSG_SWAPPED_INTO_PARTY) + { + if (!ShouldShowBoxWasFullMessage()) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SENT_SOMEONES_PC; + StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); + GetMonData(caughtMon, MON_DATA_NICKNAME, gStringVar2); + } + else + { + StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); // box the mon was sent to + GetMonData(caughtMon, MON_DATA_NICKNAME, gStringVar2); + StringCopy(gStringVar3, GetBoxNamePtr(GetPCBoxToSendMon())); //box the mon was going to be sent to + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SOMEONES_BOX_FULL; + } - // If this move has charge turn effects, it must charge, activate them, then try to fire - if (checkChargeTurnEffects && MoveHasChargeTurnAdditionalEffect(gCurrentMove)) - return FALSE; + // Change to B_MSG_SENT_LANETTES_PC or B_MSG_LANETTES_BOX_FULL + if (FlagGet(FLAG_SYS_PC_LANETTE)) + gBattleCommunication[MULTISTRING_CHOOSER]++; + } - // Insert custom conditions here + gBattleResults.caughtMonSpecies = GetMonData(caughtMon, MON_DATA_SPECIES, NULL); + GetMonData(caughtMon, MON_DATA_NICKNAME, gBattleResults.caughtMonNick); + gBattleResults.caughtMonBall = GetMonData(caughtMon, MON_DATA_POKEBALL, NULL); - // Certain two-turn moves may fire on the first turn in the right weather (Solar Beam, Electro Shot) - // By default, all two-turn moves have the option of adding weather to their argument - if (IsBattlerWeatherAffected(battler, GetMoveTwoTurnAttackWeather(gCurrentMove))) - return TRUE; + gSelectedMonPartyId = PARTY_SIZE; + gBattleCommunication[MULTIUSE_STATE] = 0; - return FALSE; + if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_NO_MESSSAGE_SKIP) + gBattlescriptCurrInstr = cmd->passInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; + break; + } + } + // Save the player's party again to not interferes with RestorePartyAfterFollowerNPCBattle() called after battle. + if (IsNPCFollowerWildBattle()) + SavePlayerParty(); } -static void Cmd_tryfiretwoturnmovenowbyeffect(void) +static void Cmd_trysetcaughtmondexflags(void) { - CMD_ARGS(u8 battler, bool8 checkChargeTurnEffects, const u8 *jumpInstr); + CMD_ARGS(const u8 *failInstr); - if (CheckIfCanFireTwoTurnMoveNow(cmd->battler, cmd->checkChargeTurnEffects) == TRUE) + struct Pokemon *caughtMon = GetBattlerMon(GetCatchingBattler()); + u32 species = GetMonData(caughtMon, MON_DATA_SPECIES, NULL); + u32 personality = GetMonData(caughtMon, MON_DATA_PERSONALITY, NULL); + + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) { - gBattleScripting.animTurn = 1; - gBattlescriptCurrInstr = cmd->jumpInstr; + gBattlescriptCurrInstr = cmd->failInstr; } else + { + HandleSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_SET_CAUGHT, personality); gBattlescriptCurrInstr = cmd->nextInstr; + } } -static void Cmd_setminimize(void) +static void Cmd_displaydexinfo(void) { CMD_ARGS(); - if (gHitMarker & HITMARKER_OBEYS) - gStatuses3[gBattlerAttacker] |= STATUS3_MINIMIZED; - - gBattlescriptCurrInstr = cmd->nextInstr; -} - -static void Cmd_unused_c8(void) -{ -} - -static void Cmd_trymemento(void) -{ - CMD_ARGS(const u8 *failInstr); + u32 caughtBattler = GetCatchingBattler(); + struct Pokemon *mon = GetBattlerMon(caughtBattler); + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); - if (B_MEMENTO_FAIL >= GEN_4 - && (gBattleCommunication[MISS_TYPE] == B_MSG_PROTECTED - || gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE - || IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove) - || DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove))) + switch (gBattleCommunication[0]) { - // Failed, target was protected. - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (B_MEMENTO_FAIL < GEN_4 - && gBattleMons[gBattlerTarget].statStages[STAT_ATK] == MIN_STAT_STAGE - && gBattleMons[gBattlerTarget].statStages[STAT_SPATK] == MIN_STAT_STAGE - && gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED) + case 0: + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + ClearTemporarySpeciesSpriteData(caughtBattler, FALSE, FALSE); + BattleLoadMonSpriteGfx(mon, caughtBattler); + gBattleCommunication[0]++; + break; + case 1: + if (!gPaletteFade.active) + { + FreeAllWindowBuffers(); + gBattleCommunication[TASK_ID] = DisplayCaughtMonDexPage(species, + GetMonData(mon, MON_DATA_IS_SHINY), + GetMonData(mon, MON_DATA_PERSONALITY)); + gBattleCommunication[0]++; + } + break; + case 2: + if (!gPaletteFade.active + && gMain.callback2 == BattleMainCB2 + && !gTasks[gBattleCommunication[TASK_ID]].isActive) + { + SetVBlankCallback(VBlankCB_Battle); + gBattleCommunication[0]++; + } + break; + case 3: + InitBattleBgsVideo(); + LoadBattleTextboxAndBackground(); + gBattle_BG3_X = 256; + gBattleCommunication[0]++; + break; + case 4: + if (!IsDma3ManagerBusyWithBgCopy()) + { + BeginNormalPaletteFade(PALETTES_BG, 0, 16, 0, RGB_BLACK); + ShowBg(0); + ShowBg(3); + gBattleCommunication[0]++; + } + break; + case 5: + if (!gPaletteFade.active) + { + gBattlescriptCurrInstr = cmd->nextInstr; + } + break; + } +} + +void HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags) +{ + s32 destY, destX, bgId; + u16 var = 0; + + for (destY = yStart; destY <= yEnd; destY++) { - // Failed, unprotected target already has minimum Attack and Special Attack. - gBattlescriptCurrInstr = cmd->failInstr; + for (destX = xStart; destX <= xEnd; destX++) + { + if (destY == yStart) + { + if (destX == xStart) + var = 0x1022; + else if (destX == xEnd) + var = 0x1024; + else + var = 0x1023; + } + else if (destY == yEnd) + { + if (destX == xStart) + var = 0x1028; + else if (destX == xEnd) + var = 0x102A; + else + var = 0x1029; + } + else + { + if (destX == xStart) + var = 0x1025; + else if (destX == xEnd) + var = 0x1027; + else + var = 0x1026; + } + + if (flags & WINDOW_CLEAR) + var = 0; + + bgId = (flags & WINDOW_BG1) ? 1 : 0; + CopyToBgTilemapBufferRect_ChangePalette(bgId, &var, destX, destY, 1, 1, 0x11); + } } - else +} + +void BattleCreateYesNoCursorAt(u8 cursorPosition) +{ + u16 src[2]; + src[0] = 1; + src[1] = 2; + + CopyToBgTilemapBufferRect_ChangePalette(0, src, 0x19, 9 + (2 * cursorPosition), 1, 2, 0x11); + CopyBgTilemapBufferToVram(0); +} + +void BattleDestroyYesNoCursorAt(u8 cursorPosition) +{ + u16 src[2]; + src[0] = 0x1016; + src[1] = 0x1016; + + CopyToBgTilemapBufferRect_ChangePalette(0, src, 0x19, 9 + (2 * cursorPosition), 1, 2, 0x11); + CopyBgTilemapBufferToVram(0); +} + +static void Cmd_trygivecaughtmonnick(void) +{ + CMD_ARGS(); + + switch (gBattleCommunication[MULTIUSE_STATE]) { - // Success, drop user's HP bar to 0 - gBattleStruct->moveDamage[gBattlerAttacker] = gBattleMons[gBattlerAttacker].hp; - BtlController_EmitHealthBarUpdate(gBattlerAttacker, B_COMM_TO_CONTROLLER, INSTANT_HP_BAR_DROP); - MarkBattlerForControllerExec(gBattlerAttacker); + case 0: + HandleBattleWindow(YESNOBOX_X_Y, 0); + BattlePutTextOnWindow(gText_BattleYesNoChoice, B_WIN_YESNO); + gBattleCommunication[MULTIUSE_STATE]++; + gBattleCommunication[CURSOR_POSITION] = 0; + BattleCreateYesNoCursorAt(0); + break; + case 1: + if (JOY_NEW(DPAD_UP) && gBattleCommunication[CURSOR_POSITION] != 0) + { + PlaySE(SE_SELECT); + BattleDestroyYesNoCursorAt(gBattleCommunication[CURSOR_POSITION]); + gBattleCommunication[CURSOR_POSITION] = 0; + BattleCreateYesNoCursorAt(0); + } + if (JOY_NEW(DPAD_DOWN) && gBattleCommunication[CURSOR_POSITION] == 0) + { + PlaySE(SE_SELECT); + BattleDestroyYesNoCursorAt(gBattleCommunication[CURSOR_POSITION]); + gBattleCommunication[CURSOR_POSITION] = 1; + BattleCreateYesNoCursorAt(1); + } + if (JOY_NEW(A_BUTTON)) + { + PlaySE(SE_SELECT); + if (gBattleCommunication[CURSOR_POSITION] == 0) + { + gBattleCommunication[MULTIUSE_STATE]++; + BeginFastPaletteFade(3); + } + else + { + gBattleCommunication[MULTIUSE_STATE] = 4; + } + } + else if (JOY_NEW(B_BUTTON)) + { + PlaySE(SE_SELECT); + gBattleCommunication[MULTIUSE_STATE] = 4; + } + break; + case 2: + if (!gPaletteFade.active) + { + struct Pokemon *caughtMon = GetBattlerMon(gBattlerTarget); + GetMonData(caughtMon, MON_DATA_NICKNAME, gBattleStruct->caughtMonNick); + FreeAllWindowBuffers(); + MainCallback callback = CalculatePlayerPartyCount() == PARTY_SIZE ? ReshowBlankBattleScreenAfterMenu : BattleMainCB2; + + DoNamingScreen(NAMING_SCREEN_CAUGHT_MON, gBattleStruct->caughtMonNick, + GetMonData(caughtMon, MON_DATA_SPECIES), + GetMonGender(caughtMon), + GetMonData(caughtMon, MON_DATA_PERSONALITY, NULL), + callback); + + gBattleCommunication[MULTIUSE_STATE]++; + } + break; + case 3: + if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) + { + SetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_NICKNAME, gBattleStruct->caughtMonNick); + gBattleCommunication[MULTIUSE_STATE]++; + } + break; + case 4: + gBattleCommunication[MULTIUSE_STATE] = 0; gBattlescriptCurrInstr = cmd->nextInstr; + break; } } -// Follow Me -static void Cmd_setforcedtarget(void) +static void Cmd_unused_0xf4(void) +{ +} + +static void Cmd_removeattackerstatus1(void) { CMD_ARGS(); - gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTimer = 1; - gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTarget = gBattlerTarget; - gSideTimers[GetBattlerSide(gBattlerTarget)].followmePowder = IsPowderMove(gCurrentMove); + gBattleMons[gBattlerAttacker].status1 = 0; gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_setcharge(void) +// CMD_ARGS is not needed for these functions as they end the script execution. +static void Cmd_finishaction(void) { - CMD_ARGS(u8 battler); + gCurrentActionFuncId = B_ACTION_FINISHED; +} - u8 battler = GetBattlerForBattleScript(cmd->battler); - gStatuses3[battler] |= STATUS3_CHARGED_UP; - if (B_CHARGE < GEN_9) - gDisableStructs[battler].chargeTimer = 2; - else - gDisableStructs[battler].chargeTimer = 0; - gBattlescriptCurrInstr = cmd->nextInstr; +static void Cmd_finishturn(void) +{ + gCurrentActionFuncId = B_ACTION_FINISHED; + gCurrentTurnActionNumber = gBattlersCount; } -// Nature Power -static void Cmd_callenvironmentattack(void) +static void Cmd_trainerslideout(void) { - CMD_ARGS(); + CMD_ARGS(u8 position); + + u32 battler = GetBattlerForBattleScript(cmd->position); + BtlController_EmitTrainerSlideBack(battler, B_COMM_TO_CONTROLLER); + MarkBattlerForControllerExec(battler); - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; - gCurrentMove = GetNaturePowerMove(gBattlerAttacker); - gBattlerTarget = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); - BattleScriptPush(GetMoveBattleScript(gCurrentMove)); gBattlescriptCurrInstr = cmd->nextInstr; } -u32 GetNaturePowerMove(u32 battler) +static const u16 sTelekinesisBanList[] = +{ + SPECIES_DIGLETT, + SPECIES_DUGTRIO, + SPECIES_DIGLETT_ALOLA, + SPECIES_DUGTRIO_ALOLA, + SPECIES_SANDYGAST, + SPECIES_PALOSSAND, + SPECIES_GENGAR_MEGA, +}; + +bool32 IsTelekinesisBannedSpecies(u16 species) { - u32 move = sNaturePowerMoves[gBattleEnvironment]; - if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN) - move = MOVE_MOONBLAST; - else if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) - move = MOVE_THUNDERBOLT; - else if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN) - move = MOVE_ENERGY_BALL; - else if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN) - move = MOVE_PSYCHIC; - else if (sNaturePowerMoves[gBattleEnvironment] == MOVE_NONE) - move = MOVE_TRI_ATTACK; + u32 i; - if (GetActiveGimmick(battler) == GIMMICK_Z_MOVE) + for (i = 0; i < ARRAY_COUNT(sTelekinesisBanList); i++) { - gBattleStruct->zmove.baseMoves[gBattlerAttacker] = move; - move = GetTypeBasedZMove(move); + if (species == sTelekinesisBanList[i]) + return TRUE; } - - return move; + return FALSE; } -static void Cmd_curestatuswithmove(void) +static void Cmd_settelekinesis(void) { CMD_ARGS(const u8 *failInstr); - u32 shouldHeal; - - if (GetMoveEffect(gCurrentMove) == EFFECT_REFRESH) - shouldHeal = gBattleMons[gBattlerAttacker].status1 & STATUS1_REFRESH; - else // Take Heart - shouldHeal = gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY; - if (shouldHeal) + if (gBattleMons[gBattlerTarget].volatiles.telekinesis + || gBattleMons[gBattlerTarget].volatiles.root + || gBattleMons[gBattlerTarget].volatiles.smackDown + || gFieldStatuses & STATUS_FIELD_GRAVITY + || IsTelekinesisBannedSpecies(gBattleMons[gBattlerTarget].species)) { - if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) - TryDeactivateSleepClause(GetBattlerSide(gBattlerAttacker), gBattlerPartyIndexes[gBattlerAttacker]); - - gBattleMons[gBattlerAttacker].status1 = 0; - gBattlescriptCurrInstr = cmd->nextInstr; - BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerAttacker].status1), &gBattleMons[gBattlerAttacker].status1); - MarkBattlerForControllerExec(gBattlerAttacker); + gBattlescriptCurrInstr = cmd->failInstr; } else { - gBattlescriptCurrInstr = cmd->failInstr; + gBattleMons[gBattlerTarget].volatiles.telekinesis = TRUE; + gDisableStructs[gBattlerTarget].telekinesisTimer = 3; + gBattlescriptCurrInstr = cmd->nextInstr; } } -static void Cmd_settorment(void) +static void Cmd_swapstatstages(void) { - CMD_ARGS(const u8 *failInstr); + CMD_ARGS(u8 stat); - if (gBattleMons[gBattlerTarget].status2 & STATUS2_TORMENT - || (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX)) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else + u8 stat = cmd->stat; + s8 atkStatStage = gBattleMons[gBattlerAttacker].statStages[stat]; + s8 defStatStage = gBattleMons[gBattlerTarget].statStages[stat]; + + gBattleMons[gBattlerAttacker].statStages[stat] = defStatStage; + gBattleMons[gBattlerTarget].statStages[stat] = atkStatStage; + + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static u16 *GetBattlerStat(struct BattlePokemon *battler, enum Stat stat) +{ + switch (stat) { - gBattleMons[gBattlerTarget].status2 |= STATUS2_TORMENT; - gBattlescriptCurrInstr = cmd->nextInstr; + case STAT_ATK: return &battler->attack; + case STAT_DEF: return &battler->defense; + case STAT_SPATK: return &battler->spAttack; + case STAT_SPDEF: return &battler->spDefense; + default: return NULL; } } -static void Cmd_jumpifnodamage(void) +static void Cmd_averagestats(void) { - CMD_ARGS(const u8 *jumpInstr); + CMD_ARGS(u8 stat); - if (gProtectStructs[gBattlerAttacker].physicalDmg || gProtectStructs[gBattlerAttacker].specialDmg) - gBattlescriptCurrInstr = cmd->nextInstr; - else - gBattlescriptCurrInstr = cmd->jumpInstr; + u16 *stat1 = GetBattlerStat(&gBattleMons[gBattlerAttacker], cmd->stat); + u16 *stat2 = GetBattlerStat(&gBattleMons[gBattlerTarget], cmd->stat); + u16 avg = (*stat1 + *stat2) / 2; + *stat1 = *stat2 = avg; + + gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_settaunt(void) +static void Cmd_jumpifcaptivateaffected(void) { - CMD_ARGS(const u8 *failInstr); + CMD_ARGS(const u8 *jumpInstr); - if (B_OBLIVIOUS_TAUNT >= GEN_6 && GetBattlerAbility(gBattlerTarget) == ABILITY_OBLIVIOUS) + if (GetBattlerAbility(gBattlerTarget) == ABILITY_OBLIVIOUS) { gBattlescriptCurrInstr = BattleScript_NotAffectedAbilityPopUp; gLastUsedAbility = ABILITY_OBLIVIOUS; RecordAbilityBattle(gBattlerTarget, ABILITY_OBLIVIOUS); } - else if (gDisableStructs[gBattlerTarget].tauntTimer == 0) + else if (AreBattlersOfOppositeGender(gBattlerAttacker, gBattlerTarget)) { - u8 turns; - if (B_TAUNT_TURNS >= GEN_5) - { - turns = 4; - if (GetBattlerTurnOrderNum(gBattlerTarget) > GetBattlerTurnOrderNum(gBattlerAttacker)) - turns--; // If the target hasn't yet moved this turn, Taunt lasts for only three turns (source: Bulbapedia) - } - else if (B_TAUNT_TURNS >= GEN_4) - { - turns = (Random() & 2) + 3; - } - else - { - turns = 2; - } - - gDisableStructs[gBattlerTarget].tauntTimer = turns; - gBattlescriptCurrInstr = cmd->nextInstr; + gBattlescriptCurrInstr = cmd->jumpInstr; } else { - gBattlescriptCurrInstr = cmd->failInstr; + gBattlescriptCurrInstr = cmd->nextInstr; } } -static void Cmd_trysethelpinghand(void) +static void Cmd_setnonvolatilestatus(void) { - CMD_ARGS(const u8 *failInstr); - - gBattlerTarget = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerAttacker))); + CMD_ARGS(u8 trigger); - if (IsDoubleBattle() - && !(gAbsentBattlerFlags & (1u << gBattlerTarget)) - && !gProtectStructs[gBattlerAttacker].helpingHand - && !gProtectStructs[gBattlerTarget].helpingHand) + switch (cmd->trigger) { - gProtectStructs[gBattlerTarget].helpingHand = TRUE; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; + case TRIGGER_ON_ABILITY: + if (gBattleScripting.moveEffect >= MOVE_EFFECT_CONFUSION) + SetMoveEffect(gBattleScripting.battler, gEffectBattler, gBattleScripting.moveEffect, cmd->nextInstr, EFFECT_PRIMARY); + else + SetNonVolatileStatus(gEffectBattler, gBattleScripting.moveEffect, cmd->nextInstr, TRIGGER_ON_ABILITY); + break; + case TRIGGER_ON_MOVE: + SetNonVolatileStatus(gBattlerTarget, GetMoveNonVolatileStatus(gCurrentMove), cmd->nextInstr, TRIGGER_ON_MOVE); + break; + case TRIGGER_ON_PROTECT: + SetNonVolatileStatus(gBattlerAttacker, gBattleScripting.moveEffect, cmd->nextInstr, TRIGGER_ON_PROTECT); + break; } } -// Trick -static void Cmd_tryswapitems(void) +static void Cmd_tryoverwriteability(void) { CMD_ARGS(const u8 *failInstr); - // opponent can't swap items with player in regular battles - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL - || (!IsOnPlayerSide(gBattlerAttacker) - && !(gBattleTypeFlags & (BATTLE_TYPE_LINK - | BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_FRONTIER - | BATTLE_TYPE_SECRET_BASE - | BATTLE_TYPE_RECORDED_LINK - | (B_TRAINERS_KNOCK_OFF_ITEMS == TRUE ? BATTLE_TYPE_TRAINER : 0) - )))) + if (gAbilitiesInfo[gBattleMons[gBattlerTarget].ability].cantBeOverwritten + || gBattleMons[gBattlerTarget].ability == GetMoveOverwriteAbility(gCurrentMove)) { + RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability); gBattlescriptCurrInstr = cmd->failInstr; } + else if (CanAbilityShieldActivateForBattler(gBattlerTarget)) + { + gBattlescriptCurrInstr = BattleScript_MoveEnd; + BattleScriptCall(BattleScript_AbilityShieldProtects); + } else { - u8 sideAttacker = GetBattlerSide(gBattlerAttacker); - u8 sideTarget = GetBattlerSide(gBattlerTarget); - - // You can't swap items if they were knocked off in regular battles - if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK - | BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_FRONTIER - | BATTLE_TYPE_SECRET_BASE - | BATTLE_TYPE_RECORDED_LINK)) - && (gWishFutureKnock.knockedOffMons[sideAttacker] & (1u << gBattlerPartyIndexes[gBattlerAttacker]) - || gWishFutureKnock.knockedOffMons[sideTarget] & (1u << gBattlerPartyIndexes[gBattlerTarget]))) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - // can't swap if two PokΓ©mon don't have an item - // or if either of them is an enigma berry or a mail - else if ((gBattleMons[gBattlerAttacker].item == ITEM_NONE && gBattleMons[gBattlerTarget].item == ITEM_NONE) - || !CanBattlerGetOrLoseItem(gBattlerAttacker, gBattleMons[gBattlerAttacker].item) - || !CanBattlerGetOrLoseItem(gBattlerAttacker, gBattleMons[gBattlerTarget].item) - || !CanBattlerGetOrLoseItem(gBattlerTarget, gBattleMons[gBattlerTarget].item) - || !CanBattlerGetOrLoseItem(gBattlerTarget, gBattleMons[gBattlerAttacker].item)) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - // check if ability prevents swapping - else if (GetBattlerAbility(gBattlerTarget) == ABILITY_STICKY_HOLD) - { - gBattlescriptCurrInstr = BattleScript_StickyHoldActivates; - gLastUsedAbility = gBattleMons[gBattlerTarget].ability; - RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); - } - // took a while, but all checks passed and items can be safely swapped - else - { - u16 oldItemAtk, *newItemAtk; - - newItemAtk = &gBattleStruct->changedItems[gBattlerAttacker]; - oldItemAtk = gBattleMons[gBattlerAttacker].item; - *newItemAtk = gBattleMons[gBattlerTarget].item; - - gBattleMons[gBattlerAttacker].item = ITEM_NONE; - gBattleMons[gBattlerTarget].item = oldItemAtk; - - RecordItemEffectBattle(gBattlerAttacker, 0); - RecordItemEffectBattle(gBattlerTarget, GetItemHoldEffect(oldItemAtk)); - - BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(*newItemAtk), newItemAtk); - MarkBattlerForControllerExec(gBattlerAttacker); - - BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); - MarkBattlerForControllerExec(gBattlerTarget); - - gBattleStruct->choicedMove[gBattlerTarget] = MOVE_NONE; - gBattleStruct->choicedMove[gBattlerAttacker] = MOVE_NONE; - - gBattlescriptCurrInstr = cmd->nextInstr; - - PREPARE_ITEM_BUFFER(gBattleTextBuff1, *newItemAtk) - PREPARE_ITEM_BUFFER(gBattleTextBuff2, oldItemAtk) - - if (!(sideAttacker == sideTarget && IsPartnerMonFromSameTrainer(gBattlerAttacker))) - { - // if targeting your own side and you aren't in a multi battle, don't save items as stolen - if (IsOnPlayerSide(gBattlerAttacker)) - TrySaveExchangedItem(gBattlerAttacker, oldItemAtk); - if (IsOnPlayerSide(gBattlerTarget)) - TrySaveExchangedItem(gBattlerTarget, *newItemAtk); - } - - if (oldItemAtk != ITEM_NONE && *newItemAtk != ITEM_NONE) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_BOTH; // attacker's item -> <- target's item - } - else if (oldItemAtk == ITEM_NONE && *newItemAtk != ITEM_NONE) - { - if (GetBattlerAbility(gBattlerAttacker) == ABILITY_UNBURDEN && gDisableStructs[gBattlerAttacker].unburdenActive) - gDisableStructs[gBattlerAttacker].unburdenActive = FALSE; + if (gDisableStructs[gBattlerTarget].neutralizingGas) + gSpecialStatuses[gBattlerTarget].neutralizingGasRemoved = TRUE; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_TAKEN; // nothing -> <- target's item - } - else - { - CheckSetUnburden(gBattlerAttacker); - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_GIVEN; // attacker's item -> <- nothing - } - } + RemoveAbilityFlags(gBattlerTarget); + gBattleScripting.abilityPopupOverwrite = gBattleMons[gBattlerTarget].ability; + gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = GetMoveOverwriteAbility(gCurrentMove); + gBattlescriptCurrInstr = cmd->nextInstr; } } -// Role Play, Doodle -static void Cmd_trycopyability(void) +static void Cmd_callnative(void) { - CMD_ARGS(u8 battler, const u8 *failInstr); + CMD_ARGS(void (*func)(void)); + void (*func)(void) = cmd->func; + func(); +} - u32 battler = GetBattlerForBattleScript(cmd->battler); - u16 defAbility = gBattleMons[gBattlerTarget].ability; +// Callnative Funcs - if (gBattleMons[battler].ability == defAbility - || defAbility == ABILITY_NONE - || gAbilitiesInfo[gBattleMons[battler].ability].cantBeSuppressed - || (IsBattlerAlive(BATTLE_PARTNER(battler)) && gAbilitiesInfo[gBattleMons[BATTLE_PARTNER(battler)].ability].cantBeSuppressed && GetMoveEffect(gCurrentMove) == EFFECT_DOODLE) - || gAbilitiesInfo[defAbility].cantBeCopied) - { - gBattlescriptCurrInstr = cmd->failInstr; - } +void SaveBattlerTarget(u32 battler) +{ + if (gBattleStruct->savedTargetCount < NELEMS(gBattleStruct->savedBattlerTarget)) + gBattleStruct->savedBattlerTarget[gBattleStruct->savedTargetCount++] = battler; else - { - gBattleScripting.abilityPopupOverwrite = gBattleMons[battler].ability; - gBattleMons[battler].ability = gDisableStructs[battler].overwrittenAbility = defAbility; - gLastUsedAbility = defAbility; - gBattlescriptCurrInstr = cmd->nextInstr; - } + DebugPrintfLevel(MGBA_LOG_WARN, "Attempting to exceed savedBattlerTarget array size!"); } -static void Cmd_trywish(void) +void SaveBattlerAttacker(u32 battler) { - CMD_ARGS(const u8 *failInstr); - - if (gStatuses3[gBattlerTarget] & STATUS3_HEAL_BLOCK) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (gWishFutureKnock.wishCounter[gBattlerAttacker] <= gBattleTurnCounter) - { - gWishFutureKnock.wishCounter[gBattlerAttacker] = gBattleTurnCounter + 2; - gWishFutureKnock.wishPartyId[gBattlerAttacker] = gBattlerPartyIndexes[gBattlerAttacker]; - gBattlescriptCurrInstr = cmd->nextInstr; - } + if (gBattleStruct->savedAttackerCount < NELEMS(gBattleStruct->savedBattlerAttacker)) + gBattleStruct->savedBattlerAttacker[gBattleStruct->savedAttackerCount++] = battler; else - { - gBattlescriptCurrInstr = cmd->failInstr; - } + DebugPrintfLevel(MGBA_LOG_WARN, "Attempting to exceed savedBattlerAttacker array size!"); } -static void Cmd_settoxicspikes(void) +void BS_SaveTarget(void) { - CMD_ARGS(const u8 *failInstr); + NATIVE_ARGS(); + SaveBattlerTarget(gBattlerTarget); + gBattlescriptCurrInstr = cmd->nextInstr; +} - u8 targetSide = GetBattlerSide(gBattlerTarget); - if (gSideTimers[targetSide].toxicSpikesAmount >= 2) +void BS_RestoreTarget(void) +{ + NATIVE_ARGS(); + if (gBattleStruct->savedTargetCount > 0) { - gBattlescriptCurrInstr = cmd->failInstr; + gBattleStruct->savedTargetCount--; + gBattlerTarget = gBattleStruct->savedBattlerTarget[gBattleStruct->savedTargetCount]; } else { - gSideTimers[targetSide].toxicSpikesAmount++; - gSideStatuses[targetSide] |= SIDE_STATUS_TOXIC_SPIKES; - gBattlescriptCurrInstr = cmd->nextInstr; + // #if TESTING + // Test_ExitWithResult(TEST_RESULT_ERROR, "BS_RestoreTarget attempting to restore an empty target!"); + // #else + DebugPrintfLevel(MGBA_LOG_WARN, "BS_RestoreTarget attempting to restore an empty target!"); + // #endif } + gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_setgastroacid(void) +void BS_SaveAttacker(void) { - CMD_ARGS(const u8 *failInstr); + NATIVE_ARGS(); + SaveBattlerAttacker(gBattlerAttacker); + gBattlescriptCurrInstr = cmd->nextInstr; +} - if (gAbilitiesInfo[gBattleMons[gBattlerTarget].ability].cantBeSuppressed) +void BS_RestoreAttacker(void) +{ + NATIVE_ARGS(); + if (gBattleStruct->savedAttackerCount > 0) { - gBattlescriptCurrInstr = cmd->failInstr; + gBattleStruct->savedAttackerCount--; + gBattlerAttacker = gBattleStruct->savedBattlerAttacker[gBattleStruct->savedAttackerCount]; } else { - if (gBattleMons[gBattlerTarget].ability == ABILITY_NEUTRALIZING_GAS) - gSpecialStatuses[gBattlerTarget].neutralizingGasRemoved = TRUE; - - gStatuses3[gBattlerTarget] |= STATUS3_GASTRO_ACID; - gBattlescriptCurrInstr = cmd->nextInstr; + // #if TESTING + // Test_ExitWithResult(TEST_RESULT_ERROR, "BS_RestoreAttacker attempting to restore an empty attacker!"); + // #else + DebugPrintfLevel(MGBA_LOG_WARN, "BS_RestoreAttacker attempting to restore an empty attacker!"); + // #endif } + gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_setyawn(void) +void BS_CalcMetalBurstDmg(void) { - CMD_ARGS(const u8 *failInstr); + NATIVE_ARGS(const u8 *failInstr); - if (gStatuses3[gBattlerTarget] & STATUS3_YAWN - || gBattleMons[gBattlerTarget].status1 & STATUS1_ANY) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (IsBattlerTerrainAffected(gBattlerTarget, STATUS_FIELD_ELECTRIC_TERRAIN)) + u8 sideAttacker = GetBattlerSide(gBattlerAttacker); + u8 sideTarget = 0; + + if (gProtectStructs[gBattlerAttacker].physicalDmg + && sideAttacker != (sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].physicalBattlerId)) + && gBattleMons[gProtectStructs[gBattlerAttacker].physicalBattlerId].hp) { - // When Yawn is used while Electric Terrain is set and drowsiness is set from Yawn being used against target in the previous turn: - // "But it failed" will display first. - gBattlescriptCurrInstr = BattleScript_ElectricTerrainPrevents; + + if (IsAffectedByFollowMe(gBattlerAttacker, sideTarget, gCurrentMove)) + gBattlerTarget = gSideTimers[sideTarget].followmeTarget; + else + gBattlerTarget = gProtectStructs[gBattlerAttacker].physicalBattlerId; + + CalcReflectBackDamage(gProtectStructs[gBattlerAttacker].physicalDmg, 150); + gBattlescriptCurrInstr = cmd->nextInstr; } - else if (IsBattlerTerrainAffected(gBattlerTarget, STATUS_FIELD_MISTY_TERRAIN)) + else if (gProtectStructs[gBattlerAttacker].specialDmg + && sideAttacker != (sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].specialBattlerId)) + && gBattleMons[gProtectStructs[gBattlerAttacker].specialBattlerId].hp) { - // When Yawn is used while Misty Terrain is set and drowsiness is set from Yawn being used against target in the previous turn: - // "But it failed" will display first. - gBattlescriptCurrInstr = BattleScript_MistyTerrainPrevents; + + if (IsAffectedByFollowMe(gBattlerAttacker, sideTarget, gCurrentMove)) + gBattlerTarget = gSideTimers[sideTarget].followmeTarget; + else + gBattlerTarget = gProtectStructs[gBattlerAttacker].specialBattlerId; + + CalcReflectBackDamage(gProtectStructs[gBattlerAttacker].specialDmg, 150); + gBattlescriptCurrInstr = cmd->nextInstr; } else { - gStatuses3[gBattlerTarget] |= STATUS3_YAWN_TURN(2); - gBattlescriptCurrInstr = cmd->nextInstr; + gBattlescriptCurrInstr = cmd->failInstr; } } -static void Cmd_setdamagetohealthdifference(void) +void BS_JumpIfMoreThanHalfHP(void) { - CMD_ARGS(const u8 *failInstr); + NATIVE_ARGS(u8 battler, const u8 *jumpInstr); - if (GetNonDynamaxHP(gBattlerTarget) <= gBattleMons[gBattlerAttacker].hp) - { - gBattlescriptCurrInstr = cmd->failInstr; - } + u32 battler = GetBattlerForBattleScript(cmd->battler); + if (gBattleMons[battler].hp > (gBattleMons[battler].maxHP + 1) / 2) + gBattlescriptCurrInstr = cmd->jumpInstr; else - { - gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxHP(gBattlerTarget) - gBattleMons[gBattlerAttacker].hp; gBattlescriptCurrInstr = cmd->nextInstr; - } } -static void HandleRoomMove(u32 statusFlag, u16 *timer, u8 stringId) +void BS_DoStockpileStatChangesWearOff(void) { - if (gFieldStatuses & statusFlag) + NATIVE_ARGS(u8 battler, const u8 *statChangeInstr); + + u32 battler = GetBattlerForBattleScript(cmd->battler); + if (gDisableStructs[battler].stockpileDef != 0) { - gFieldStatuses &= ~statusFlag; - gBattleCommunication[MULTISTRING_CHOOSER] = stringId + 1; + SET_STATCHANGER(STAT_DEF, abs(gDisableStructs[battler].stockpileDef), TRUE); + gDisableStructs[battler].stockpileDef = 0; + BattleScriptCall(cmd->statChangeInstr); + } + else if (gDisableStructs[battler].stockpileSpDef) + { + SET_STATCHANGER(STAT_SPDEF, abs(gDisableStructs[battler].stockpileSpDef), TRUE); + gDisableStructs[battler].stockpileSpDef = 0; + BattleScriptCall(cmd->statChangeInstr); } else { - gFieldStatuses |= statusFlag; - *timer = gBattleTurnCounter + 5; - gBattleCommunication[MULTISTRING_CHOOSER] = stringId; + gBattlescriptCurrInstr = cmd->nextInstr; } } -static void Cmd_setroom(void) +static bool32 CriticalCapture(u32 odds) { - CMD_ARGS(); + u32 numCaught; + u32 totalDexCount; + u32 charmBoost = 1; - switch (GetMoveEffect(gCurrentMove)) - { - case EFFECT_TRICK_ROOM: - HandleRoomMove(STATUS_FIELD_TRICK_ROOM, &gFieldTimers.trickRoomTimer, 0); - break; - case EFFECT_WONDER_ROOM: - HandleRoomMove(STATUS_FIELD_WONDER_ROOM, &gFieldTimers.wonderRoomTimer, 2); - break; - case EFFECT_MAGIC_ROOM: - HandleRoomMove(STATUS_FIELD_MAGIC_ROOM, &gFieldTimers.magicRoomTimer, 4); - break; - default: - gBattleCommunication[MULTISTRING_CHOOSER] = 6; - break; - } - gBattlescriptCurrInstr = cmd->nextInstr; -} + if (B_CRITICAL_CAPTURE == FALSE) + return FALSE; -// Skill Swap -static void Cmd_tryswapabilities(void) -{ - CMD_ARGS(const u8 *failInstr); + if (B_CRITICAL_CAPTURE_LOCAL_DEX == TRUE) + totalDexCount = HOENN_DEX_COUNT; + else + totalDexCount = NATIONAL_DEX_COUNT; - if (gAbilitiesInfo[gBattleMons[gBattlerAttacker].ability].cantBeSwapped - || gAbilitiesInfo[gBattleMons[gBattlerTarget].ability].cantBeSwapped) - { - RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability); - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) - { - RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_ABILITY_SHIELD); - gBattlescriptCurrInstr = cmd->failInstr; - } + if (CheckBagHasItem(ITEM_CATCHING_CHARM, 1)) + charmBoost = (100 + B_CATCHING_CHARM_BOOST) / 100; + + numCaught = GetNationalPokedexCount(FLAG_GET_CAUGHT); + if (numCaught > (totalDexCount * 600) / 650) + odds = (odds * (250 * charmBoost)) / 100; + else if (numCaught > (totalDexCount * 450) / 650) + odds = (odds * (200 * charmBoost)) / 100; + else if (numCaught > (totalDexCount * 300) / 650) + odds = (odds * (150 * charmBoost)) / 100; + else if (numCaught > (totalDexCount * 150) / 650) + odds = (odds * (100 * charmBoost)) / 100; + else if (numCaught > (totalDexCount * 30) / 650) + odds = (odds * (50 * charmBoost)) / 100; else - { - if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT || (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX)) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - if (!IsBattlerAlly(gBattlerAttacker, gBattlerTarget)) - gBattleScripting.abilityPopupOverwrite = gBattleMons[gBattlerAttacker].ability; - gLastUsedAbility = gBattleMons[gBattlerTarget].ability; - gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = gBattleMons[gBattlerAttacker].ability; - gBattleMons[gBattlerAttacker].ability = gDisableStructs[gBattlerAttacker].overwrittenAbility = gLastUsedAbility; + return FALSE; - gBattlescriptCurrInstr = cmd->nextInstr; - } - } + if (odds > 255) + odds = 255; + + odds /= 6; + if (RandomUniform(RNG_BALLTHROW_CRITICAL, 0, MAX_u8) < odds) + return TRUE; + + return FALSE; } -static void Cmd_tryimprison(void) +bool32 IsMoveAffectedByParentalBond(u32 move, u32 battler) { - CMD_ARGS(const u8 *failInstr); - - if ((gStatuses3[gBattlerAttacker] & STATUS3_IMPRISONED_OTHERS)) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (B_IMPRISON >= GEN_5) - { - gStatuses3[gBattlerAttacker] |= STATUS3_IMPRISONED_OTHERS; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else + if (move != MOVE_NONE && move != MOVE_UNAVAILABLE && move != MOVE_STRUGGLE + && !IsMoveParentalBondBanned(move) + && GetMoveCategory(move) != DAMAGE_CATEGORY_STATUS + && GetMoveStrikeCount(move) < 2 + && GetMoveEffect(move) != EFFECT_SEMI_INVULNERABLE + && GetMoveEffect(move) != EFFECT_TWO_TURNS_ATTACK + && GetMoveEffect(move) != EFFECT_MULTI_HIT) { - u8 battler; - - for (battler = 0; battler < gBattlersCount; battler++) + if (IsDoubleBattle()) { - if (!IsBattlerAlly(gBattlerAttacker, battler)) + switch (GetBattlerMoveTargetType(battler, move)) { - s32 attackerMoveId; - for (attackerMoveId = 0; attackerMoveId < MAX_MON_MOVES; attackerMoveId++) - { - s32 i; - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBattleMons[gBattlerAttacker].moves[attackerMoveId] == gBattleMons[battler].moves[i] - && gBattleMons[gBattlerAttacker].moves[attackerMoveId] != MOVE_NONE) - break; - } - if (i != MAX_MON_MOVES) - break; - } - if (attackerMoveId != MAX_MON_MOVES) - { - gStatuses3[gBattlerAttacker] |= STATUS3_IMPRISONED_OTHERS; - gBattlescriptCurrInstr = cmd->nextInstr; - break; - } + // Both foes are alive, spread move strikes once + case MOVE_TARGET_BOTH: + if (CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerTarget) >= 2) + return FALSE; + break; + // Either both foes or one foe and its ally are alive; spread move strikes once + case MOVE_TARGET_FOES_AND_ALLY: + if (CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER, gBattlerAttacker) >= 2) + return FALSE; + break; + default: + break; } } - if (battler == gBattlersCount) // In Generation 3 games, Imprison fails if the user doesn't share any moves with any of the foes. - gBattlescriptCurrInstr = cmd->failInstr; + return TRUE; } + return FALSE; } -static void Cmd_setstealthrock(void) +static bool32 IsFinalStrikeEffect(enum MoveEffect moveEffect) { - CMD_ARGS(const u8 *failInstr); - - u8 targetSide = GetBattlerSide(gBattlerTarget); - if (gSideStatuses[targetSide] & SIDE_STATUS_STEALTH_ROCK) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else + switch (moveEffect) { - gSideStatuses[targetSide] |= SIDE_STATUS_STEALTH_ROCK; - gSideTimers[targetSide].stealthRockAmount = 1; - gBattlescriptCurrInstr = cmd->nextInstr; + case MOVE_EFFECT_REMOVE_ARG_TYPE: + case MOVE_EFFECT_REMOVE_STATUS: + case MOVE_EFFECT_RECOIL_HP_25: + case MOVE_EFFECT_PREVENT_ESCAPE: + case MOVE_EFFECT_WRAP: + return TRUE; + default: + return FALSE; } } -static void Cmd_setuserstatus3(void) +static bool32 CanAbilityPreventStatLoss(enum Ability abilityDef) { - CMD_ARGS(u32 flags, const u8 *failInstr); - - u32 flags = cmd->flags; - - if (gStatuses3[gBattlerAttacker] & flags) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else + switch (abilityDef) { - gStatuses3[gBattlerAttacker] |= flags; - if (flags & STATUS3_MAGNET_RISE) - gDisableStructs[gBattlerAttacker].magnetRiseTimer = gBattleTurnCounter + 5; - if (flags & STATUS3_LASER_FOCUS) - gDisableStructs[gBattlerAttacker].laserFocusTimer = gBattleTurnCounter + 2; - gBattlescriptCurrInstr = cmd->nextInstr; + case ABILITY_CLEAR_BODY: + case ABILITY_FULL_METAL_BODY: + case ABILITY_WHITE_SMOKE: + return TRUE; + default: + break; } + return FALSE; } -static void Cmd_assistattackselect(void) +bool32 CanBurnHitThaw(u16 move) { - CMD_ARGS(const u8 *failInstr); - - s32 chooseableMovesNo = 0; - struct Pokemon *party; - s32 monId, moveId; - u16 *validMoves = Alloc(sizeof(u16) * PARTY_SIZE * MAX_MON_MOVES); + u8 i; - if (validMoves != NULL) + if (GetConfig(CONFIG_BURN_HIT_THAW) >= GEN_6) { - party = GetBattlerParty(gBattlerAttacker); - - for (monId = 0; monId < PARTY_SIZE; monId++) + u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); + for (i = 0; i < numAdditionalEffects; i++) { - if (monId == gBattlerPartyIndexes[gBattlerAttacker]) - continue; - if (GetMonData(&party[monId], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE) - continue; - if (GetMonData(&party[monId], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG) - continue; - - for (moveId = 0; moveId < MAX_MON_MOVES; moveId++) - { - u16 move = GetMonData(&party[monId], MON_DATA_MOVE1 + moveId); - - if (IsMoveAssistBanned(move)) - continue; - - validMoves[chooseableMovesNo++] = move; - } + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + if (additionalEffect->moveEffect == MOVE_EFFECT_BURN) + return TRUE; } } - - if (chooseableMovesNo) - { - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; - gCalledMove = validMoves[Random() % chooseableMovesNo]; - gBattlerTarget = GetBattleMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } - - TRY_FREE_AND_SET_NULL(validMoves); + return FALSE; } -static void Cmd_trysetmagiccoat(void) +void BS_CheckParentalBondCounter(void) { - CMD_ARGS(const u8 *failInstr); - - if (gCurrentTurnActionNumber == gBattlersCount - 1) // moves last turn - { - gBattlescriptCurrInstr = cmd->failInstr; - } + NATIVE_ARGS(u8 counter, const u8 *jumpInstr); + // Some effects should only happen on the first or second strike of Parental Bond, + // so a way to check this in battle scripts is useful + if (gSpecialStatuses[gBattlerAttacker].parentalBondState == cmd->counter && IsBattlerAlive(gBattlerTarget)) + gBattlescriptCurrInstr = cmd->jumpInstr; else - { - gProtectStructs[gBattlerAttacker].bounceMove = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; - } } -// Snatch -static void Cmd_trysetsnatch(void) +void BS_JumpIfCantLoseItem(void) { - CMD_ARGS(const u8 *failInstr); + NATIVE_ARGS(u8 battler, const u8 *jumpInstr); + u8 battler = GetBattlerForBattleScript(cmd->battler); + u16 item = gBattleMons[battler].item; - if (gCurrentTurnActionNumber == gBattlersCount - 1) // moves last turn - { - gBattlescriptCurrInstr = cmd->failInstr; - } + if (item == ITEM_NONE || !CanBattlerGetOrLoseItem(battler, item)) + gBattlescriptCurrInstr = cmd->jumpInstr; else - { - gProtectStructs[gBattlerAttacker].stealMove = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; - } } -static void Cmd_unused2(void) +void BS_GetBattlerSide(void) { + NATIVE_ARGS(u8 battler); + gBattleCommunication[0] = GetBattlerSide(GetBattlerForBattleScript(cmd->battler)); + gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_switchoutabilities(void) +void BS_TrySymbiosis(void) { - CMD_ARGS(u8 battler); - + NATIVE_ARGS(u8 battler); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (gBattleMons[battler].ability == ABILITY_NEUTRALIZING_GAS) - { - gBattleMons[battler].ability = ABILITY_NONE; - BattleScriptPush(gBattlescriptCurrInstr); - gBattlescriptCurrInstr = BattleScript_NeutralizingGasExits; - } - else + //called by Bestow, Fling, and Bug Bite, which don't work with Cmd_removeitem. + u32 partner = BATTLE_PARTNER(battler); + if (TryTriggerSymbiosis(battler, partner)) { - switch (GetBattlerAbility(battler)) - { - case ABILITY_NATURAL_CURE: - if (gBattleMons[battler].status1 & STATUS1_SLEEP) - TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); - - gBattleMons[battler].status1 = 0; - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, - 1u << gBattleStruct->battlerPartyIndexes[battler], - sizeof(gBattleMons[battler].status1), - &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - break; - case ABILITY_REGENERATOR: - { - u32 regenerate = GetNonDynamaxMaxHP(battler) / 3; - regenerate += gBattleMons[battler].hp; - if (regenerate > gBattleMons[battler].maxHP) - regenerate = gBattleMons[battler].maxHP; - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_HP_BATTLE, - 1u << gBattleStruct->battlerPartyIndexes[battler], - sizeof(regenerate), - ®enerate); - MarkBattlerForControllerExec(battler); - break; - } - } - - gBattlescriptCurrInstr = cmd->nextInstr; + BestowItem(partner, battler); + gLastUsedAbility = gBattleMons[partner].ability; + gBattleScripting.battler = gBattlerAbility = partner; + gEffectBattler = battler; + BattleScriptCall(BattleScript_SymbiosisActivates); + return; } -} - -static void Cmd_jumpifhasnohp(void) -{ - CMD_ARGS(u8 battler, const u8 *jumpInstr); - u32 battler = GetBattlerForBattleScript(cmd->battler); - - if (!IsBattlerAlive(battler)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; + gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_jumpifnotcurrentmoveargtype(void) +void BS_SetZEffect(void) { - CMD_ARGS(u8 battler, const u8 *failInstr); - - u8 battler = GetBattlerForBattleScript(cmd->battler); - const u8 *failInstr = cmd->failInstr; - u32 type = GetMoveArgType(gCurrentMove); - - if (!IS_BATTLER_OF_TYPE(battler, type)) - gBattlescriptCurrInstr = failInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; + SetZEffect(); // Handles battle script jumping internally } -static void Cmd_pickup(void) +static void TryUpdateRoundTurnOrder(void) { - CMD_ARGS(); - - u32 i, j; - u16 species, heldItem, ability; - u8 lvlDivBy10; - - if (!InBattlePike()) // No items in Battle Pike. + if (IsDoubleBattle()) { - bool32 isInPyramid = InBattlePyramid_(); - for (i = 0; i < PARTY_SIZE; i++) + u32 i; + u32 j = 0; + u32 k = 0; + u32 currRounder = 0; + u8 roundUsers[3] = {0xFF, 0xFF, 0xFF}; + u8 nonRoundUsers[3] = {0xFF, 0xFF, 0xFF}; + for (i = 0; i < gBattlersCount; i++) { - species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG); - heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); - lvlDivBy10 = (GetMonData(&gPlayerParty[i], MON_DATA_LEVEL)-1) / 10; //Moving this here makes it easier to add in abilities like Honey Gather. - if (lvlDivBy10 > 9) - lvlDivBy10 = 9; - - ability = gSpeciesInfo[species].abilities[GetMonData(&gPlayerParty[i], MON_DATA_ABILITY_NUM)]; - - if (ability == ABILITY_PICKUP - && species != SPECIES_NONE - && species != SPECIES_EGG - && heldItem == ITEM_NONE - && (Random() % 10) == 0) - { - if (isInPyramid) - { - heldItem = GetBattlePyramidPickupItemId(); - SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &heldItem); - } - else - { - u32 rand = Random() % 100; - u32 percentTotal = 0; - - for (j = 0; j < ARRAY_COUNT(sPickupTable); j++) - { - percentTotal += sPickupTable[j].percentage[lvlDivBy10]; - if (rand < percentTotal) - { - SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &sPickupTable[j].itemId); - break; - } - } - } - } - else if (ability == ABILITY_HONEY_GATHER - && species != 0 - && species != SPECIES_EGG - && heldItem == ITEM_NONE) - { - if ((lvlDivBy10 + 1 ) * 5 > Random() % 100) - { - heldItem = ITEM_HONEY; - SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &heldItem); - } - } - else if (P_SHUCKLE_BERRY_JUICE == GEN_2 - && species == SPECIES_SHUCKLE - && heldItem == ITEM_ORAN_BERRY - && (Random() % 16) == 0) + if (gBattlerByTurnOrder[i] == gBattlerAttacker) { - heldItem = ITEM_BERRY_JUICE; - SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &heldItem); + currRounder = i + 1; // Current battler going after attacker + break; } } - } - gBattlescriptCurrInstr = cmd->nextInstr; -} + // Get battlers after attacker using round + for (i = currRounder; i < gBattlersCount; i++) + { + if (gChosenMoveByBattler[gBattlerByTurnOrder[i]] == MOVE_ROUND) + roundUsers[j++] = gBattlerByTurnOrder[i]; + else + nonRoundUsers[k++] = gBattlerByTurnOrder[i]; + } -static void Cmd_unused_0xE6(void) -{ -} + // update turn order for round users + for (i = 0; i < 3 && roundUsers[i] != 0xFF; i++) + { + gBattlerByTurnOrder[currRounder] = roundUsers[i]; + gProtectStructs[roundUsers[i]].quash = TRUE; // Make it so their turn order can't be changed again + currRounder++; + } -static void Cmd_unused_0xE7(void) -{ + // Update turn order for non-round users + for (i = 0; i < 3 && nonRoundUsers[i] != 0xFF; i++) + { + gBattlerByTurnOrder[currRounder] = nonRoundUsers[i]; + currRounder++; + } + } } -// Water and Mud Sport -static void Cmd_settypebasedhalvers(void) +u8 GetFirstFaintedPartyIndex(u8 battler) { - CMD_ARGS(const u8 *failInstr); - - bool8 worked = FALSE; + u32 i; + u32 start = 0; + u32 end = PARTY_SIZE; + struct Pokemon *party = GetBattlerParty(battler); - if (GetMoveEffect(gCurrentMove) == EFFECT_MUD_SPORT) + // Check whether partner is separate trainer. + if ((IsOnPlayerSide(battler) && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + || (!IsOnPlayerSide(battler) && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)) { - if (B_SPORT_TURNS >= GEN_6) + if (GetBattlerPosition(battler) == B_POSITION_OPPONENT_LEFT + || GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT) { - if (!(gFieldStatuses & STATUS_FIELD_MUDSPORT)) - { - gFieldStatuses |= STATUS_FIELD_MUDSPORT; - gFieldTimers.mudSportTimer = gBattleTurnCounter + 5; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_ELECTRIC; - worked = TRUE; - } + end = PARTY_SIZE / 2; } else { - if (!(gStatuses4[gBattlerAttacker] & STATUS4_MUD_SPORT)) - { - gStatuses4[gBattlerAttacker] |= STATUS4_MUD_SPORT; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_ELECTRIC; - worked = TRUE; - } + start = PARTY_SIZE / 2; } } - else // Water Sport + + // Loop through to find fainted battler. + for (i = start; i < end; ++i) { - if (B_SPORT_TURNS >= GEN_6) + u32 species = GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG); + if (species != SPECIES_NONE + && species != SPECIES_EGG + && GetMonData(&party[i], MON_DATA_HP) == 0) { - if (!(gFieldStatuses & STATUS_FIELD_WATERSPORT)) - { - gFieldStatuses |= STATUS_FIELD_WATERSPORT; - gFieldTimers.waterSportTimer = gBattleTurnCounter + 5; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_FIRE; - worked = TRUE; - } - } - else - { - if (!(gStatuses4[gBattlerAttacker] & STATUS4_WATER_SPORT)) - { - gStatuses4[gBattlerAttacker] |= STATUS4_WATER_SPORT; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_FIRE; - worked = TRUE; - } + return i; } } - if (worked) - gBattlescriptCurrInstr = cmd->nextInstr; - else - gBattlescriptCurrInstr = cmd->failInstr; -} - -bool32 DoesSubstituteBlockMove(u32 battlerAtk, u32 battlerDef, u32 move) -{ - if (!(gBattleMons[battlerDef].status2 & STATUS2_SUBSTITUTE)) - return FALSE; - else if (MoveIgnoresSubstitute(move)) - return FALSE; - else if (GetBattlerAbility(battlerAtk) == ABILITY_INFILTRATOR) - return FALSE; - else - return TRUE; -} - -bool32 DoesDisguiseBlockMove(u32 battler, u32 move) -{ - if (!(gBattleMons[battler].species == SPECIES_MIMIKYU_DISGUISED || gBattleMons[battler].species == SPECIES_MIMIKYU_TOTEM_DISGUISED) - || gBattleMons[battler].status2 & STATUS2_TRANSFORMED - || (!gProtectStructs[battler].confusionSelfDmg && (IsBattleMoveStatus(move) || gHitMarker & HITMARKER_PASSIVE_DAMAGE)) - || gHitMarker & HITMARKER_IGNORE_DISGUISE - || GetBattlerAbility(battler) != ABILITY_DISGUISE) - return FALSE; - else - return TRUE; -} - -static void Cmd_jumpifsubstituteblocks(void) -{ - CMD_ARGS(const u8 *jumpInstr); - - if (DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; -} - -static void Cmd_tryrecycleitem(void) -{ - CMD_ARGS(const u8 *failInstr); - - u16 *usedHeldItem; - - if (gCurrentMove == MOVE_NONE && GetBattlerAbility(gBattlerAttacker) == ABILITY_PICKUP) - usedHeldItem = &gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gBattlerTarget]][GetBattlerSide(gBattlerTarget)]; - else - usedHeldItem = &gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gBattlerAttacker]][GetBattlerSide(gBattlerAttacker)]; - if (*usedHeldItem != ITEM_NONE && gBattleMons[gBattlerAttacker].item == ITEM_NONE) - { - gLastUsedItem = *usedHeldItem; - *usedHeldItem = ITEM_NONE; - gBattleMons[gBattlerAttacker].item = gLastUsedItem; - - BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerAttacker].item), &gBattleMons[gBattlerAttacker].item); - MarkBattlerForControllerExec(gBattlerAttacker); - - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } -} - -bool32 CanCamouflage(u8 battler) -{ - if (IS_BATTLER_OF_TYPE(battler, sEnvironmentToType[gBattleEnvironment])) - return FALSE; - return TRUE; -} - -static void Cmd_settypetoenvironment(void) -{ - CMD_ARGS(const u8 *failInstr); - - u8 environmentType; - switch(gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) - { - case STATUS_FIELD_ELECTRIC_TERRAIN: - environmentType = TYPE_ELECTRIC; - break; - case STATUS_FIELD_GRASSY_TERRAIN: - environmentType = TYPE_GRASS; - break; - case STATUS_FIELD_MISTY_TERRAIN: - environmentType = TYPE_FAIRY; - break; - case STATUS_FIELD_PSYCHIC_TERRAIN: - environmentType = TYPE_PSYCHIC; - break; - default: - environmentType = sEnvironmentToType[gBattleEnvironment]; - break; - } - - if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, environmentType) && GetActiveGimmick(gBattlerAttacker) != GIMMICK_TERA) - { - SET_BATTLER_TYPE(gBattlerAttacker, environmentType); - PREPARE_TYPE_BUFFER(gBattleTextBuff1, environmentType); - - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } -} - -// Unused -static void Cmd_pursuitdoubles(void) -{ - CMD_ARGS(const u8 *failInstr); - - u32 battler = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerAttacker))); - - if (IsDoubleBattle() - && !(gAbsentBattlerFlags & (1u << battler)) - && gChosenActionByBattler[battler] == B_ACTION_USE_MOVE - && GetMoveEffect(gChosenMoveByBattler[battler]) == EFFECT_PURSUIT) - { - gActionsByTurnOrder[battler] = B_ACTION_TRY_FINISH; - gCurrentMove = gChosenMoveByBattler[battler]; - gBattlescriptCurrInstr = cmd->nextInstr; - gBattleScripting.animTurn = 1; - gBattleScripting.savedBattler = gBattlerAttacker; - gBattlerAttacker = battler; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } -} - -static void Cmd_snatchsetbattlers(void) -{ - CMD_ARGS(); - - gEffectBattler = gBattlerAttacker; - - if (gBattlerAttacker == gBattlerTarget) - gBattlerAttacker = gBattlerTarget = gBattleScripting.battler; - else - gBattlerTarget = gBattleScripting.battler; - - gBattleScripting.battler = gEffectBattler; - gBattlescriptCurrInstr = cmd->nextInstr; -} - -static void Cmd_removescreens(void) -{ - CMD_ARGS(); - - u8 side; - bool32 failed; - - if (B_BRICK_BREAK >= GEN_4) - side = GetBattlerSide(gBattlerTarget); // From Gen 4 onwards, Brick Break can remove screens on the user's side if used on an ally - else - side = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE; - - if (B_BRICK_BREAK >= GEN_5) - failed = gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT; - else - failed = FALSE; - - if (!failed && gSideStatuses[side] & SIDE_STATUS_SCREEN_ANY) - { - gSideStatuses[side] &= ~SIDE_STATUS_SCREEN_ANY; - gBattleScripting.animTurn = 1; - gBattleScripting.animTargetsHit = 1; - } - else - { - gBattleScripting.animTurn = 0; - gBattleScripting.animTargetsHit = 0; - } - - gBattlescriptCurrInstr = cmd->nextInstr; -} - -u8 GetCatchingBattler(void) -{ - if (IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT))) - return GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - else - return GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); + // Returns PARTY_SIZE if none found. + return PARTY_SIZE; } -static void Cmd_handleballthrow(void) +void ApplyExperienceMultipliers(s32 *expAmount, u8 expGetterMonId, u8 faintedBattler) { - CMD_ARGS(); - - u16 ballMultiplier = 100; - s8 ballAddition = 0; - - if (gBattleControllerExecFlags) - return; + enum HoldEffect holdEffect = GetMonHoldEffect(&gPlayerParty[expGetterMonId]); - gBattlerTarget = GetCatchingBattler(); + if (IsTradedMon(&gPlayerParty[expGetterMonId])) + *expAmount = (*expAmount * 150) / 100; + if (holdEffect == HOLD_EFFECT_LUCKY_EGG) + *expAmount = (*expAmount * 150) / 100; + if (B_UNEVOLVED_EXP_MULTIPLIER >= GEN_6 && IsMonPastEvolutionLevel(&gPlayerParty[expGetterMonId])) + *expAmount = (*expAmount * 4915) / 4096; + if (B_AFFECTION_MECHANICS == TRUE && GetMonAffectionHearts(&gPlayerParty[expGetterMonId]) >= AFFECTION_FOUR_HEARTS) + *expAmount = (*expAmount * 4915) / 4096; + if (CheckBagHasItem(ITEM_EXP_CHARM, 1)) //is also for other exp boosting Powers if/when implemented + *expAmount = (*expAmount * 150) / 100; - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - BtlController_EmitBallThrowAnim(gBattlerAttacker, B_COMM_TO_CONTROLLER, BALL_TRAINER_BLOCK); - MarkBattlerForControllerExec(gBattlerAttacker); - gBattlescriptCurrInstr = BattleScript_TrainerBallBlock; - } - else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) - { - BtlController_EmitBallThrowAnim(gBattlerAttacker, B_COMM_TO_CONTROLLER, BALL_3_SHAKES_SUCCESS); - MarkBattlerForControllerExec(gBattlerAttacker); - gBattlescriptCurrInstr = BattleScript_WallyBallThrow; - } - else + if (B_SCALED_EXP >= GEN_5 && B_SCALED_EXP != GEN_6) { - u32 odds, i; - u32 catchRate; - u32 ballId = ItemIdToBallId(gLastUsedItem); - - gBallToDisplay = gLastThrownBall = gLastUsedItem; - if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - catchRate = gBattleStruct->safariCatchFactor * 1275 / 100; - else - catchRate = gSpeciesInfo[gBattleMons[gBattlerTarget].species].catchRate; - - if (gSpeciesInfo[gBattleMons[gBattlerTarget].species].isUltraBeast) - { - if (ballId == BALL_BEAST) - ballMultiplier = 500; - else - ballMultiplier = 10; - } - else - { - switch (ballId) - { - case BALL_ULTRA: - ballMultiplier = 200; - break; - case BALL_SPORT: - if (B_SPORT_BALL_MODIFIER <= GEN_7) - ballMultiplier = 150; - break; - case BALL_GREAT: - ballMultiplier = 150; - break; - case BALL_SAFARI: - if (B_SAFARI_BALL_MODIFIER <= GEN_7) - ballMultiplier = 150; - break; - case BALL_NET: - if (IS_BATTLER_ANY_TYPE(gBattlerTarget, TYPE_WATER, TYPE_BUG)) - ballMultiplier = B_NET_BALL_MODIFIER >= GEN_7 ? 350 : 300; - break; - case BALL_DIVE: - if (GetCurrentMapType() == MAP_TYPE_UNDERWATER - || (B_DIVE_BALL_MODIFIER >= GEN_4 && (gIsFishingEncounter || gIsSurfingEncounter))) - ballMultiplier = 350; - break; - case BALL_NEST: - if (B_NEST_BALL_MODIFIER >= GEN_6) - { - //((41 - PokΓ©mon's level) Γ· 10)Γ— if PokΓ©mon's level is between 1 and 29, 1Γ— otherwise. - if (gBattleMons[gBattlerTarget].level < 30) - ballMultiplier = 410 - (gBattleMons[gBattlerTarget].level * 10); - } - else if (B_NEST_BALL_MODIFIER >= GEN_5) - { - //((41 - PokΓ©mon's level) Γ· 10)Γ—, minimum 1Γ— - if (gBattleMons[gBattlerTarget].level < 31) - ballMultiplier = 410 - (gBattleMons[gBattlerTarget].level * 10); - } - else if (gBattleMons[gBattlerTarget].level < 40) - { - //((40 - PokΓ©mon's level) Γ· 10)Γ—, minimum 1Γ— - ballMultiplier = 400 - (gBattleMons[gBattlerTarget].level * 10); - if (ballMultiplier <= 90) - ballMultiplier = 100; - } - break; - case BALL_REPEAT: - if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBattlerTarget].species), FLAG_GET_CAUGHT)) - ballMultiplier = (B_REPEAT_BALL_MODIFIER >= GEN_7 ? 350 : 300); - break; - case BALL_TIMER: - ballMultiplier = 100 + (gBattleResults.battleTurnCounter * (B_TIMER_BALL_MODIFIER >= GEN_5 ? 30 : 10)); - if (ballMultiplier > 400) - ballMultiplier = 400; - break; - case BALL_DUSK: - i = GetTimeOfDay(); - if (i == TIME_EVENING || i == TIME_NIGHT || gMapHeader.cave || gMapHeader.mapType == MAP_TYPE_UNDERGROUND) - ballMultiplier = (B_DUSK_BALL_MODIFIER >= GEN_7 ? 300 : 350); - break; - case BALL_QUICK: - if (gBattleResults.battleTurnCounter == 0) - ballMultiplier = (B_QUICK_BALL_MODIFIER >= GEN_5 ? 500 : 400); - break; - case BALL_LEVEL: - if (gBattleMons[gBattlerAttacker].level >= 4 * gBattleMons[gBattlerTarget].level) - ballMultiplier = 800; - else if (gBattleMons[gBattlerAttacker].level > 2 * gBattleMons[gBattlerTarget].level) - ballMultiplier = 400; - else if (gBattleMons[gBattlerAttacker].level > gBattleMons[gBattlerTarget].level) - ballMultiplier = 200; - break; - case BALL_LURE: - if (gIsFishingEncounter) - { - if (B_LURE_BALL_MODIFIER >= GEN_8) - ballMultiplier = 400; - else if (B_LURE_BALL_MODIFIER >= GEN_7) - ballMultiplier = 500; - else - ballMultiplier = 300; - } - break; - case BALL_MOON: - { - const struct Evolution *evolutions = GetSpeciesEvolutions(gBattleMons[gBattlerTarget].species); - if (evolutions == NULL) - break; - for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) - { - if (evolutions[i].method == EVO_ITEM - && evolutions[i].param == ITEM_MOON_STONE) - ballMultiplier = 400; - } - } - break; - case BALL_LOVE: - if (gBattleMons[gBattlerTarget].species == gBattleMons[gBattlerAttacker].species) - { - u8 gender1 = GetMonGender(GetBattlerMon(gBattlerTarget)); - u8 gender2 = GetMonGender(GetBattlerMon(gBattlerAttacker)); + // Note: There is an edge case where if a pokemon receives a large amount of exp, it wouldn't be properly calculated + // because of multiplying by scaling factor(the value would simply be larger than an u32 can hold). Hence u64 is needed. + u64 value = *expAmount; + u8 faintedLevel = gBattleMons[faintedBattler].level; + u8 expGetterLevel = GetMonData(&gPlayerParty[expGetterMonId], MON_DATA_LEVEL); - if (gender1 != gender2 && gender1 != MON_GENDERLESS && gender2 != MON_GENDERLESS) - ballMultiplier = 800; - } - break; - case BALL_FAST: - if (gSpeciesInfo[gBattleMons[gBattlerTarget].species].baseSpeed >= 100) - ballMultiplier = 400; - break; - case BALL_HEAVY: - i = GetSpeciesWeight(gBattleMons[gBattlerTarget].species); - if (B_HEAVY_BALL_MODIFIER >= GEN_7) - { - if (i < 1000) - ballAddition = -20; - else if (i < 2000) - ballAddition = 0; - else if (i < 3000) - ballAddition = 20; - else - ballAddition = 30; - } - else if (B_HEAVY_BALL_MODIFIER >= GEN_4) - { - if (i < 2048) - ballAddition = -20; - else if (i < 3072) - ballAddition = 20; - else if (i < 4096) - ballAddition = 30; - else - ballAddition = 40; - } - else - { - if (i < 1024) - ballAddition = -20; - else if (i < 2048) - ballAddition = 0; - else if (i < 3072) - ballAddition = 20; - else if (i < 4096) - ballAddition = 30; - else - ballAddition = 40; - } - break; - case BALL_DREAM: - if (B_DREAM_BALL_MODIFIER >= GEN_8 && (gBattleMons[gBattlerTarget].status1 & STATUS1_SLEEP || GetBattlerAbility(gBattlerTarget) == ABILITY_COMATOSE)) - ballMultiplier = 400; - break; - case BALL_BEAST: - ballMultiplier = 10; - break; - } - } + value *= sExperienceScalingFactors[(faintedLevel * 2) + 10]; + value /= sExperienceScalingFactors[faintedLevel + expGetterLevel + 10]; - // catchRate is unsigned, which means that it may potentially overflow if sum is applied directly. - if (catchRate < 21 && ballAddition == -20) - catchRate = 1; - else - catchRate = catchRate + ballAddition; + *expAmount = value + 1; + } +} - odds = (catchRate * ballMultiplier / 100) - * (gBattleMons[gBattlerTarget].maxHP * 3 - gBattleMons[gBattlerTarget].hp * 2) - / (3 * gBattleMons[gBattlerTarget].maxHP); +void BS_ItemRestoreHP(void) +{ + NATIVE_ARGS(const u8 *alreadyMaxHpInstr, const u8 *restoreBattlerInstr); + u16 healAmount; + u32 battler = MAX_BATTLERS_COUNT; + u32 healParam = GetItemEffect(gLastUsedItem)[6]; + struct Pokemon *party = GetBattlerParty(gBattlerAttacker); + u16 hp = GetMonData(&party[gBattleStruct->itemPartyIndex[gBattlerAttacker]], MON_DATA_HP); + u16 maxHP = GetMonData(&party[gBattleStruct->itemPartyIndex[gBattlerAttacker]], MON_DATA_MAX_HP); + gBattleCommunication[MULTIUSE_STATE] = 0; - if (gBattleMons[gBattlerTarget].status1 & (STATUS1_SLEEP | STATUS1_FREEZE)) - odds *= 2; - if (gBattleMons[gBattlerTarget].status1 & (STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON | STATUS1_FROSTBITE)) - odds = (odds * 15) / 10; + if (hp == maxHP) + { + gBattlescriptCurrInstr = cmd->alreadyMaxHpInstr; + } + else + { + // Track the number of Revives used in a battle. + if (hp == 0 && IsOnPlayerSide(gBattlerAttacker) && gBattleResults.numRevivesUsed < 255) + gBattleResults.numRevivesUsed++; - if (gBattleResults.catchAttempts[ballId] < 255) - gBattleResults.catchAttempts[ballId]++; + // Check if the recipient is an active battler. + if (gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[gBattlerAttacker]) + battler = gBattlerAttacker; + else if (IsDoubleBattle() && gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerAttacker)]) + battler = BATTLE_PARTNER(gBattlerAttacker); - if (odds > 254) // mon caught + // Get amount to heal. + switch (healParam) { - BtlController_EmitBallThrowAnim(gBattlerAttacker, B_COMM_TO_CONTROLLER, BALL_3_SHAKES_SUCCESS); - MarkBattlerForControllerExec(gBattlerAttacker); - TryBattleFormChange(gBattlerTarget, FORM_CHANGE_END_BATTLE); - gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; - SetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_POKEBALL, &ballId); + case ITEM6_HEAL_HP_FULL: + healAmount = maxHP; + break; + case ITEM6_HEAL_HP_HALF: + healAmount = maxHP / 2; + break; + case ITEM6_HEAL_HP_QUARTER: + healAmount = maxHP / 4; + break; + default: + healAmount = healParam; + break; + } + if (hp + healAmount > maxHP) + healAmount = maxHP - hp; - if (CalculatePlayerPartyCount() == PARTY_SIZE) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleScripting.battler = battler; + PREPARE_SPECIES_BUFFER(gBattleTextBuff1, GetMonData(&party[gBattleStruct->itemPartyIndex[gBattlerAttacker]], MON_DATA_SPECIES)); - if (ballId == BALL_HEAL) - { - MonRestorePP(GetBattlerMon(gBattlerTarget)); - HealStatusConditions(GetBattlerMon(gBattlerTarget), STATUS1_ANY, gBattlerTarget); - gBattleMons[gBattlerTarget].hp = gBattleMons[gBattlerTarget].maxHP; - SetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_HP, &gBattleMons[gBattlerTarget].hp); - } - else if (ballId == BALL_FRIEND) - { - u32 friendship = (B_FRIEND_BALL_MODIFIER >= GEN_8 ? 150 : 200); - SetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_FRIENDSHIP, &friendship); - } + // Heal is applied as move damage if battler is active. + if (battler != MAX_BATTLERS_COUNT && hp != 0) + { + gBattleStruct->passiveHpUpdate[battler] = -healAmount; + gBattlescriptCurrInstr = cmd->restoreBattlerInstr; } - else // mon may be caught, calculate shakes + else { - u8 shakes; - u8 maxShakes; - - gBattleSpritesDataPtr->animationData->isCriticalCapture = FALSE; - gBattleSpritesDataPtr->animationData->criticalCaptureSuccess = FALSE; - - if (CriticalCapture(odds)) - { - maxShakes = BALL_1_SHAKE; // critical capture doesn't guarantee capture - gBattleSpritesDataPtr->animationData->isCriticalCapture = TRUE; - } - else - { - maxShakes = BALL_3_SHAKES_SUCCESS; - } + hp += healAmount; + SetMonData(&party[gBattleStruct->itemPartyIndex[gBattlerAttacker]], MON_DATA_HP, &hp); - if (ballId == BALL_MASTER) - { - shakes = maxShakes; - } - else + u32 partner = BATTLE_PARTNER(gBattlerAttacker); + // Absent battlers on the field need to be replaced + if (IsDoubleBattle() && (gAbsentBattlerFlags & (1u << partner))) { - odds = Sqrt(Sqrt(16711680 / odds)); - odds = 1048560 / odds; - for (shakes = 0; shakes < maxShakes && Random() < odds; shakes++); + gAbsentBattlerFlags &= ~(1u << partner); + gBattleCommunication[MULTIUSE_STATE] = TRUE; + gBattleScripting.battler = partner; + BtlController_EmitChosenMonReturnValue(partner, B_COMM_TO_ENGINE, gBattleStruct->itemPartyIndex[gBattlerAttacker], NULL); } + gBattlescriptCurrInstr = cmd->nextInstr; + } + } +} - BtlController_EmitBallThrowAnim(gBattlerAttacker, B_COMM_TO_CONTROLLER, shakes); - MarkBattlerForControllerExec(gBattlerAttacker); - - if (shakes == maxShakes) // mon caught, copy of the code above - { - if (IsCriticalCapture()) - gBattleSpritesDataPtr->animationData->criticalCaptureSuccess = TRUE; - - TryBattleFormChange(gBattlerTarget, FORM_CHANGE_END_BATTLE); - gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; - SetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_POKEBALL, &ballId); +void BS_ItemCureStatus(void) +{ + NATIVE_ARGS(const u8 *noStatusInstr, const u8 *restoreBattlerInstr); + u32 targetBattler = MAX_BATTLERS_COUNT; + bool32 statusChanged = FALSE; + struct Pokemon *party = GetBattlerParty(gBattlerAttacker); - if (CalculatePlayerPartyCount() == PARTY_SIZE) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + // Heal volatile conditions if battler is active. + if (gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[gBattlerAttacker]) + { + statusChanged = ItemHealMonVolatile(gBattlerAttacker, gLastUsedItem); + targetBattler = gBattlerAttacker; + } + else if (IsDoubleBattle() + && gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerAttacker)]) + { + statusChanged = ItemHealMonVolatile(BATTLE_PARTNER(gBattlerAttacker), gLastUsedItem); + targetBattler = BATTLE_PARTNER(gBattlerAttacker); + } - if (ballId == BALL_HEAL) - { - MonRestorePP(GetBattlerMon(gBattlerTarget)); - HealStatusConditions(GetBattlerMon(gBattlerTarget), STATUS1_ANY, gBattlerTarget); - gBattleMons[gBattlerTarget].hp = gBattleMons[gBattlerTarget].maxHP; - SetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_HP, &gBattleMons[gBattlerTarget].hp); - } - else if (ballId == BALL_FRIEND) - { - u32 friendship = (B_FRIEND_BALL_MODIFIER >= GEN_8 ? 150 : 200); - SetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_FRIENDSHIP, &friendship); - } - } - else // not caught - { - if (!gHasFetchedBall) - gLastUsedBall = gLastUsedItem; + // Heal Status1 conditions. + if (!HealStatusConditions(&party[gBattleStruct->itemPartyIndex[gBattlerAttacker]], GetItemStatus1Mask(gLastUsedItem), targetBattler)) + { + statusChanged = TRUE; + if (GetItemStatus1Mask(gLastUsedItem) & STATUS1_SLEEP) + gBattleMons[targetBattler].volatiles.nightmare = FALSE; + } - if (IsCriticalCapture()) - gBattleCommunication[MULTISTRING_CHOOSER] = BALL_3_SHAKES_FAIL; - else - gBattleCommunication[MULTISTRING_CHOOSER] = shakes; + if (!statusChanged) + { + gBattlescriptCurrInstr = cmd->noStatusInstr; + return; + } - gBattlescriptCurrInstr = BattleScript_ShakeBallThrow; - } - } + PREPARE_SPECIES_BUFFER(gBattleTextBuff1, GetMonData(&party[gBattleStruct->itemPartyIndex[gBattlerAttacker]], MON_DATA_SPECIES)); + if (targetBattler == MAX_BATTLERS_COUNT) + { + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattleScripting.battler = targetBattler; + gBattlescriptCurrInstr = cmd->restoreBattlerInstr; } } -static void Cmd_givecaughtmon(void) +void BS_ItemIncreaseStat(void) { - CMD_ARGS(const u8 *passInstr); - enum GiveCaughtMonStates state = gBattleCommunication[MULTIUSE_STATE]; + NATIVE_ARGS(); + u16 statId = GetItemEffect(gLastUsedItem)[1]; + u16 stages = GetItemHoldEffectParam(gLastUsedItem); + SET_STATCHANGER(statId, stages, FALSE); + gBattlescriptCurrInstr = cmd->nextInstr; +} - switch (state) +void BS_ItemRestorePP(void) +{ + NATIVE_ARGS(); + const u8 *effect = GetItemEffect(gLastUsedItem); + u32 i, pp, maxPP, moveId, loopEnd; + u32 battler = MAX_BATTLERS_COUNT; + struct Pokemon *mon = (IsOnPlayerSide(gBattlerAttacker)) ? &gPlayerParty[gBattleStruct->itemPartyIndex[gBattlerAttacker]] : &gEnemyParty[gBattleStruct->itemPartyIndex[gBattlerAttacker]]; + + // Check whether to apply to all moves. + if (effect[4] & ITEM4_HEAL_PP_ONE) { - case GIVECAUGHTMON_CHECK_PARTY_SIZE: - if (CalculatePlayerPartyCount() == PARTY_SIZE && B_CATCH_SWAP_INTO_PARTY >= GEN_7) - { - PrepareStringBattle(STRINGID_SENDCAUGHTMONPARTYORBOX, gBattlerAttacker); - gBattleCommunication[MSG_DISPLAY] = 1; - gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_ASK_ADD_TO_PARTY; - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_NO_MESSSAGE_SKIP; - gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; - } - break; - case GIVECAUGHTMON_ASK_ADD_TO_PARTY: - HandleBattleWindow(YESNOBOX_X_Y, 0); - BattlePutTextOnWindow(gText_BattleYesNoChoice, B_WIN_YESNO); - gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_HANDLE_INPUT; - gBattleCommunication[CURSOR_POSITION] = 0; - BattleCreateYesNoCursorAt(0); - break; - case GIVECAUGHTMON_HANDLE_INPUT: - if (JOY_NEW(DPAD_UP) && gBattleCommunication[CURSOR_POSITION] != 0) - { - PlaySE(SE_SELECT); - BattleDestroyYesNoCursorAt(gBattleCommunication[CURSOR_POSITION]); - gBattleCommunication[CURSOR_POSITION] = 0; - BattleCreateYesNoCursorAt(0); - } - if (JOY_NEW(DPAD_DOWN) && gBattleCommunication[CURSOR_POSITION] == 0) - { - PlaySE(SE_SELECT); - BattleDestroyYesNoCursorAt(gBattleCommunication[CURSOR_POSITION]); - gBattleCommunication[CURSOR_POSITION] = 1; - BattleCreateYesNoCursorAt(1); - } - if (JOY_NEW(A_BUTTON)) - { - PlaySE(SE_SELECT); - if (gBattleCommunication[CURSOR_POSITION] == 0) - { - gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_DO_CHOOSE_MON; - } - else - { - gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; - } - } - else if (JOY_NEW(B_BUTTON)) - { - PlaySE(SE_SELECT); - gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; - } - break; - case GIVECAUGHTMON_DO_CHOOSE_MON: - if (!gPaletteFade.active) - { - BtlController_EmitChoosePokemon(gBattlerAttacker, B_COMM_TO_CONTROLLER, PARTY_ACTION_SEND_MON_TO_BOX, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gBattlerAttacker]); - MarkBattlerForControllerExec(gBattlerAttacker); - gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_HANDLE_CHOSEN_MON; - } - break; - case GIVECAUGHTMON_HANDLE_CHOSEN_MON: - if (gSelectedMonPartyId != PARTY_SIZE) + i = gBattleStruct->itemMoveIndex[gBattlerAttacker]; + loopEnd = i + 1; + } + else + { + i = 0; + loopEnd = MAX_MON_MOVES; + } + + // Check if the recipient is an active battler. + if (gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[gBattlerAttacker]) + battler = gBattlerAttacker; + else if (IsDoubleBattle() + && gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerAttacker)]) + battler = BATTLE_PARTNER(gBattlerAttacker); + + // Heal PP! + for (; i < loopEnd; i++) + { + pp = GetMonData(mon, MON_DATA_PP1 + i, NULL); + moveId = GetMonData(mon, MON_DATA_MOVE1 + i, NULL); + maxPP = CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), i); + if (pp != maxPP) { - if (gSelectedMonPartyId > PARTY_SIZE) - { - // Choosing Pokemon was cancelled - gSelectedMonPartyId = PARTY_SIZE; - gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; - } - else + pp += effect[6]; + if (pp > maxPP) + pp = maxPP; + SetMonData(mon, MON_DATA_PP1 + i, &pp); + + // Update battler PP if needed. + if (battler != MAX_BATTLERS_COUNT + && gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[battler] + && MOVE_IS_PERMANENT(battler, i)) { - // Mon chosen, try to put it in the PC - if (CopyMonToPC(&gPlayerParty[gSelectedMonPartyId]) == MON_GIVEN_TO_PC) - { - GetMonNickname(&gPlayerParty[gSelectedMonPartyId], gStringVar2); - StringCopy(gStringVar1, GetBoxNamePtr(GetPCBoxToSendMon())); - ZeroMonData(&gPlayerParty[gSelectedMonPartyId]); - gBattleStruct->itemLost[B_SIDE_PLAYER][gSelectedMonPartyId].originalItem = ITEM_NONE; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWAPPED_INTO_PARTY; - gSelectedMonPartyId = PARTY_SIZE; - gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; - } - else - { - gSelectedMonPartyId = PARTY_SIZE; - gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; - } + gBattleMons[battler].pp[i] = pp; } } - break; - case GIVECAUGHTMON_GIVE_AND_SHOW_MSG: - if (B_RESTORE_HELD_BATTLE_ITEMS >= GEN_9) - { - u16 lostItem = gBattleStruct->itemLost[B_SIDE_OPPONENT][gBattlerPartyIndexes[GetCatchingBattler()]].originalItem; - if (lostItem != ITEM_NONE && GetItemPocket(lostItem) != POCKET_BERRIES) - SetMonData(GetBattlerMon(GetCatchingBattler()), MON_DATA_HELD_ITEM, &lostItem); // Restore non-berry items - } + } + gBattleScripting.battler = battler; + PREPARE_SPECIES_BUFFER(gBattleTextBuff1, GetMonData(mon, MON_DATA_SPECIES)); + gBattlescriptCurrInstr = cmd->nextInstr; +} - if (GiveMonToPlayer(GetBattlerMon(GetCatchingBattler())) != MON_GIVEN_TO_PARTY - && gBattleCommunication[MULTISTRING_CHOOSER] != B_MSG_SWAPPED_INTO_PARTY) - { - if (!ShouldShowBoxWasFullMessage()) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SENT_SOMEONES_PC; - StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); - GetMonData(GetBattlerMon(GetCatchingBattler()), MON_DATA_NICKNAME, gStringVar2); - } - else - { - StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); // box the mon was sent to - GetMonData(GetBattlerMon(GetCatchingBattler()), MON_DATA_NICKNAME, gStringVar2); - StringCopy(gStringVar3, GetBoxNamePtr(GetPCBoxToSendMon())); //box the mon was going to be sent to - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SOMEONES_BOX_FULL; - } +void BS_TryRevertWeatherForm(void) +{ + NATIVE_ARGS(); + if (IsBattlerAlive(gBattlerTarget) && TryBattleFormChange(gBattlerTarget, FORM_CHANGE_BATTLE_WEATHER)) + { + gBattleScripting.battler = gBattlerTarget; + BattleScriptPush(cmd->nextInstr); + gBattlescriptCurrInstr = BattleScript_TargetFormChangeWithStringNoPopup; + return; + } + gBattlescriptCurrInstr = cmd->nextInstr; +} - // Change to B_MSG_SENT_LANETTES_PC or B_MSG_LANETTES_BOX_FULL - if (FlagGet(FLAG_SYS_PC_LANETTE)) - gBattleCommunication[MULTISTRING_CHOOSER]++; - } +void BS_HandleMegaEvolution(void) +{ + NATIVE_ARGS(u8 battler, u8 caseId); - gBattleResults.caughtMonSpecies = GetMonData(GetBattlerMon(GetCatchingBattler()), MON_DATA_SPECIES, NULL); - GetMonData(GetBattlerMon(GetCatchingBattler()), MON_DATA_NICKNAME, gBattleResults.caughtMonNick); - gBattleResults.caughtMonBall = GetMonData(GetBattlerMon(GetCatchingBattler()), MON_DATA_POKEBALL, NULL); + u8 battler = GetBattlerForBattleScript(cmd->battler); + HandleScriptMegaPrimalBurst(cmd->caseId, battler, HANDLE_TYPE_MEGA_EVOLUTION); + gBattlescriptCurrInstr = cmd->nextInstr; +} - gSelectedMonPartyId = PARTY_SIZE; - gBattleCommunication[MULTIUSE_STATE] = 0; +void BS_HandlePrimalReversion(void) +{ + NATIVE_ARGS(u8 battler, u8 caseId); - if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_NO_MESSSAGE_SKIP) - gBattlescriptCurrInstr = cmd->passInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - break; - } + u8 battler = GetBattlerForBattleScript(cmd->battler); + HandleScriptMegaPrimalBurst(cmd->caseId, battler, HANDLE_TYPE_PRIMAL_REVERSION); + gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_trysetcaughtmondexflags(void) +void BS_HandleUltraBurst(void) { - CMD_ARGS(const u8 *failInstr); + NATIVE_ARGS(u8 battler, u8 caseId); - u32 species = GetMonData(GetBattlerMon(GetCatchingBattler()), MON_DATA_SPECIES, NULL); - u32 personality = GetMonData(GetBattlerMon(GetCatchingBattler()), MON_DATA_PERSONALITY, NULL); + u8 battler = GetBattlerForBattleScript(cmd->battler); + HandleScriptMegaPrimalBurst(cmd->caseId, battler, HANDLE_TYPE_ULTRA_BURST); + gBattlescriptCurrInstr = cmd->nextInstr; +} - if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) - { - gBattlescriptCurrInstr = cmd->failInstr; - } +void BS_JumpIfShellTrap(void) +{ + NATIVE_ARGS(u8 battler, const u8 *jumpInstr); + + u8 battler = GetBattlerForBattleScript(cmd->battler); + if (gProtectStructs[battler].shellTrap) + gBattlescriptCurrInstr = cmd->jumpInstr; else - { - HandleSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_SET_CAUGHT, personality); gBattlescriptCurrInstr = cmd->nextInstr; - } } -static void Cmd_displaydexinfo(void) +void BS_JumpIfElectricAbilityAffected(void) { - CMD_ARGS(); + NATIVE_ARGS(u8 battler, enum Ability ability, const u8 *jumpInstr); + u32 battler = GetBattlerForBattleScript(cmd->battler); + + if (IsElectricAbilityAffected(battler, cmd->ability)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} - u16 species = GetMonData(GetBattlerMon(GetCatchingBattler()), MON_DATA_SPECIES, NULL); +void BS_SetTerrain(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); + u32 statusFlag = 0; - switch (gBattleCommunication[0]) + switch (GetMoveEffect(gCurrentMove)) { - case 0: - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); - gBattleCommunication[0]++; - break; - case 1: - if (!gPaletteFade.active) + case EFFECT_MISTY_TERRAIN: + if (!(gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN)) { - struct Pokemon *mon = GetBattlerMon(GetCatchingBattler()); - FreeAllWindowBuffers(); - gBattleCommunication[TASK_ID] = DisplayCaughtMonDexPage(species, - GetMonData(mon, MON_DATA_IS_SHINY), - GetMonData(mon, MON_DATA_PERSONALITY)); - gBattleCommunication[0]++; + statusFlag = STATUS_FIELD_MISTY_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY; } break; - case 2: - if (!gPaletteFade.active - && gMain.callback2 == BattleMainCB2 - && !gTasks[gBattleCommunication[TASK_ID]].isActive) + case EFFECT_GRASSY_TERRAIN: + if (!(gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN)) { - SetVBlankCallback(VBlankCB_Battle); - gBattleCommunication[0]++; + statusFlag = STATUS_FIELD_GRASSY_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_GRASSY; } break; - case 3: - InitBattleBgsVideo(); - LoadBattleTextboxAndBackground(); - gBattle_BG3_X = 256; - gBattleCommunication[0]++; - break; - case 4: - if (!IsDma3ManagerBusyWithBgCopy()) + case EFFECT_ELECTRIC_TERRAIN: + if (!(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN)) { - BeginNormalPaletteFade(PALETTES_BG, 0, 16, 0, RGB_BLACK); - ShowBg(0); - ShowBg(3); - gBattleCommunication[0]++; + statusFlag = STATUS_FIELD_ELECTRIC_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC; } break; - case 5: - if (!gPaletteFade.active) + case EFFECT_PSYCHIC_TERRAIN: + if (!(gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN)) { - gBattlescriptCurrInstr = cmd->nextInstr; + statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_PSYCHIC; } break; + default: + break; + } + if (gBattleStruct->isSkyBattle) + { + gBattlescriptCurrInstr = cmd->jumpInstr; + } + else if (statusFlag) + { + TryChangeBattleTerrain(gBattlerAttacker, statusFlag); + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->jumpInstr; } } -void HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags) +void BS_JumpIfTerrainAffected(void) { - s32 destY, destX, bgId; - u16 var = 0; + NATIVE_ARGS(u8 battler, u32 flags, const u8 *jumpInstr); + u32 battler = GetBattlerForBattleScript(cmd->battler); - for (destY = yStart; destY <= yEnd; destY++) - { - for (destX = xStart; destX <= xEnd; destX++) - { - if (destY == yStart) - { - if (destX == xStart) - var = 0x1022; - else if (destX == xEnd) - var = 0x1024; - else - var = 0x1023; - } - else if (destY == yEnd) - { - if (destX == xStart) - var = 0x1028; - else if (destX == xEnd) - var = 0x102A; - else - var = 0x1029; - } - else - { - if (destX == xStart) - var = 0x1025; - else if (destX == xEnd) - var = 0x1027; - else - var = 0x1026; - } + if (IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler), cmd->flags)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} - if (flags & WINDOW_CLEAR) - var = 0; +void BS_TryReflectType(void) +{ + NATIVE_ARGS(const u8 *failInstr); + u16 targetBaseSpecies = GET_BASE_SPECIES_ID(gBattleMons[gBattlerTarget].species); + enum Type targetTypes[3]; + GetBattlerTypes(gBattlerTarget, FALSE, targetTypes); - bgId = (flags & WINDOW_BG1) ? 1 : 0; - CopyToBgTilemapBufferRect_ChangePalette(bgId, &var, destX, destY, 1, 1, 0x11); - } + if (targetBaseSpecies == SPECIES_ARCEUS || targetBaseSpecies == SPECIES_SILVALLY) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else if (IS_BATTLER_TYPELESS(gBattlerTarget)) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else if (targetTypes[0] == TYPE_MYSTERY && targetTypes[1] == TYPE_MYSTERY && targetTypes[2] != TYPE_MYSTERY) + { + gBattleMons[gBattlerAttacker].types[0] = TYPE_NORMAL; + gBattleMons[gBattlerAttacker].types[1] = TYPE_NORMAL; + gBattleMons[gBattlerAttacker].types[2] = targetTypes[2]; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else if (targetTypes[0] == TYPE_MYSTERY && targetTypes[1] != TYPE_MYSTERY) + { + gBattleMons[gBattlerAttacker].types[0] = targetTypes[1]; + gBattleMons[gBattlerAttacker].types[1] = targetTypes[1]; + gBattleMons[gBattlerAttacker].types[2] = targetTypes[2]; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else if (targetTypes[0] != TYPE_MYSTERY && targetTypes[1] == TYPE_MYSTERY) + { + gBattleMons[gBattlerAttacker].types[0] = targetTypes[0]; + gBattleMons[gBattlerAttacker].types[1] = targetTypes[0]; + gBattleMons[gBattlerAttacker].types[2] = targetTypes[2]; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattleMons[gBattlerAttacker].types[0] = targetTypes[0]; + gBattleMons[gBattlerAttacker].types[1] = targetTypes[1]; + gBattleMons[gBattlerAttacker].types[2] = targetTypes[2]; + gBattlescriptCurrInstr = cmd->nextInstr; } } -void BattleCreateYesNoCursorAt(u8 cursorPosition) +void BS_TrySetOctolock(void) { - u16 src[2]; - src[0] = 1; - src[1] = 2; + NATIVE_ARGS(const u8 *failInstr); - CopyToBgTilemapBufferRect_ChangePalette(0, src, 0x19, 9 + (2 * cursorPosition), 1, 2, 0x11); - CopyBgTilemapBufferToVram(0); + if (gDisableStructs[gBattlerTarget].octolock) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + gDisableStructs[gBattlerTarget].octolock = TRUE; + gDisableStructs[gBattlerTarget].octolockedBy = gBattlerAttacker; + gBattleMons[gBattlerTarget].volatiles.escapePrevention = TRUE; + gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; + gBattlescriptCurrInstr = cmd->nextInstr; + } } -void BattleDestroyYesNoCursorAt(u8 cursorPosition) +void BS_SetPledge(void) { - u16 src[2]; - src[0] = 0x1016; - src[1] = 0x1016; - - CopyToBgTilemapBufferRect_ChangePalette(0, src, 0x19, 9 + (2 * cursorPosition), 1, 2, 0x11); - CopyBgTilemapBufferToVram(0); -} + NATIVE_ARGS(const u8 *jumpInstr); -static void Cmd_trygivecaughtmonnick(void) -{ - CMD_ARGS(); + u32 partner = BATTLE_PARTNER(gBattlerAttacker); + u32 partnerMove = GetChosenMoveFromPosition(partner); + u32 i = 0; + u32 k = 0; - switch (gBattleCommunication[MULTIUSE_STATE]) + if (gBattleStruct->pledgeMove && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE)) { - case 0: - HandleBattleWindow(YESNOBOX_X_Y, 0); - BattlePutTextOnWindow(gText_BattleYesNoChoice, B_WIN_YESNO); - gBattleCommunication[MULTIUSE_STATE]++; - gBattleCommunication[CURSOR_POSITION] = 0; - BattleCreateYesNoCursorAt(0); - break; - case 1: - if (JOY_NEW(DPAD_UP) && gBattleCommunication[CURSOR_POSITION] != 0) + if ((gCurrentMove == MOVE_GRASS_PLEDGE && partnerMove == MOVE_WATER_PLEDGE) + || (gCurrentMove == MOVE_WATER_PLEDGE && partnerMove == MOVE_GRASS_PLEDGE)) { - PlaySE(SE_SELECT); - BattleDestroyYesNoCursorAt(gBattleCommunication[CURSOR_POSITION]); - gBattleCommunication[CURSOR_POSITION] = 0; - BattleCreateYesNoCursorAt(0); + gCurrentMove = MOVE_GRASS_PLEDGE; + gBattlescriptCurrInstr = BattleScript_EffectCombinedPledge_Grass; } - if (JOY_NEW(DPAD_DOWN) && gBattleCommunication[CURSOR_POSITION] == 0) + else if ((gCurrentMove == MOVE_FIRE_PLEDGE && partnerMove == MOVE_GRASS_PLEDGE) + || (gCurrentMove == MOVE_GRASS_PLEDGE && partnerMove == MOVE_FIRE_PLEDGE)) { - PlaySE(SE_SELECT); - BattleDestroyYesNoCursorAt(gBattleCommunication[CURSOR_POSITION]); - gBattleCommunication[CURSOR_POSITION] = 1; - BattleCreateYesNoCursorAt(1); + gCurrentMove = MOVE_FIRE_PLEDGE; + gBattlescriptCurrInstr = BattleScript_EffectCombinedPledge_Fire; } - if (JOY_NEW(A_BUTTON)) + else if ((gCurrentMove == MOVE_WATER_PLEDGE && partnerMove == MOVE_FIRE_PLEDGE) + || (gCurrentMove == MOVE_FIRE_PLEDGE && partnerMove == MOVE_WATER_PLEDGE)) { - PlaySE(SE_SELECT); - if (gBattleCommunication[CURSOR_POSITION] == 0) - { - gBattleCommunication[MULTIUSE_STATE]++; - BeginFastPaletteFade(3); - } - else + gCurrentMove = MOVE_WATER_PLEDGE; + gBattlescriptCurrInstr = BattleScript_EffectCombinedPledge_Water; + } + + gBattleCommunication[MSG_DISPLAY] = 0; + } + else if ((gChosenActionByBattler[partner] == B_ACTION_USE_MOVE) + && IsDoubleBattle() + && IsBattlerAlive(partner) + && !HasBattlerActedThisTurn(partner) + && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + && gCurrentMove != partnerMove + && GetMoveEffect(partnerMove) == EFFECT_PLEDGE) + { + u32 currPledgeUser = 0; + u32 newTurnOrder[] = {0xFF, 0xFF}; + + for (i = 0; i < gBattlersCount; i++) + { + if (gBattlerByTurnOrder[i] == gBattlerAttacker) { - gBattleCommunication[MULTIUSE_STATE] = 4; + currPledgeUser = i + 1; // Current battler going after attacker + break; } } - else if (JOY_NEW(B_BUTTON)) + for (i = currPledgeUser; i < gBattlersCount; i++) { - PlaySE(SE_SELECT); - gBattleCommunication[MULTIUSE_STATE] = 4; + if (gBattlerByTurnOrder[i] != partner) + { + newTurnOrder[k] = gBattlerByTurnOrder[i]; + k++; + } } - break; - case 2: - if (!gPaletteFade.active) - { - GetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_NICKNAME, gBattleStruct->caughtMonNick); - FreeAllWindowBuffers(); - MainCallback callback = CalculatePlayerPartyCount() == PARTY_SIZE ? ReshowBlankBattleScreenAfterMenu : BattleMainCB2; - DoNamingScreen(NAMING_SCREEN_CAUGHT_MON, gBattleStruct->caughtMonNick, - GetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_SPECIES), - GetMonGender(GetBattlerMon(gBattlerTarget)), - GetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_PERSONALITY, NULL), - callback); + gBattlerByTurnOrder[currPledgeUser] = partner; + currPledgeUser++; - gBattleCommunication[MULTIUSE_STATE]++; - } - break; - case 3: - if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) + for (i = 0; newTurnOrder[i] != 0xFF && i < 2; i++) { - SetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_NICKNAME, gBattleStruct->caughtMonNick); - gBattleCommunication[MULTIUSE_STATE]++; + gBattlerByTurnOrder[currPledgeUser] = newTurnOrder[i]; + currPledgeUser++; } - break; - case 4: - gBattleCommunication[MULTIUSE_STATE] = 0; + + gBattleStruct->pledgeMove = TRUE; + gBattleScripting.battler = partner; gBattlescriptCurrInstr = cmd->nextInstr; - break; + } + else + { + gBattleStruct->pledgeMove = FALSE; + gBattlescriptCurrInstr = cmd->jumpInstr; } } -static void Cmd_subattackerhpbydmg(void) +void BS_SetPledgeStatus(void) { - CMD_ARGS(); + NATIVE_ARGS(u8 battler, u32 sideStatus); - gBattleMons[gBattlerAttacker].hp -= gBattleStruct->moveDamage[gBattlerTarget]; - gBattlescriptCurrInstr = cmd->nextInstr; -} + u32 battler = GetBattlerForBattleScript(cmd->battler); + u32 side = GetBattlerSide(battler); -static void Cmd_removeattackerstatus1(void) -{ - CMD_ARGS(); + gBattleStruct->pledgeMove = FALSE; + if (!(gSideStatuses[side] & cmd->sideStatus)) + { + gSideStatuses[side] |= cmd->sideStatus; - gBattleMons[gBattlerAttacker].status1 = 0; - gBattlescriptCurrInstr = cmd->nextInstr; -} + switch (cmd->sideStatus) + { + case SIDE_STATUS_RAINBOW: + gSideTimers[side].rainbowTimer = 4; + break; + case SIDE_STATUS_SEA_OF_FIRE: + gSideTimers[side].seaOfFireTimer = 4; + break; + case SIDE_STATUS_SWAMP: + gSideTimers[side].swampTimer = 4; + } -// CMD_ARGS is not needed for these functions as they end the script execution. -static void Cmd_finishaction(void) -{ - gCurrentActionFuncId = B_ACTION_FINISHED; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + gBattlescriptCurrInstr = BattleScript_MoveEnd; } -static void Cmd_finishturn(void) +void BS_TryTrainerSlideZMoveMsg(void) { - gCurrentActionFuncId = B_ACTION_FINISHED; - gCurrentTurnActionNumber = gBattlersCount; + NATIVE_ARGS(); + s32 shouldSlide; + + if ((shouldSlide = ShouldDoTrainerSlide(gBattlerAttacker, TRAINER_SLIDE_Z_MOVE))) + { + gBattleScripting.battler = gBattlerAttacker; + BattleScriptPush(cmd->nextInstr); + gBattlescriptCurrInstr = (shouldSlide == 1 ? BattleScript_TrainerASlideMsgRet : BattleScript_TrainerBSlideMsgRet); + } + else + gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_trainerslideout(void) +void BS_TryTrainerSlideMegaEvolutionMsg(void) { - CMD_ARGS(u8 position); - - u32 battler = GetBattlerForBattleScript(cmd->position); - BtlController_EmitTrainerSlideBack(battler, B_COMM_TO_CONTROLLER); - MarkBattlerForControllerExec(battler); + NATIVE_ARGS(); + s32 shouldSlide; - gBattlescriptCurrInstr = cmd->nextInstr; + if ((shouldSlide = ShouldDoTrainerSlide(gBattlerAttacker, TRAINER_SLIDE_MEGA_EVOLUTION))) + { + gBattleScripting.battler = gBattlerAttacker; + BattleScriptPush(cmd->nextInstr); + gBattlescriptCurrInstr = (shouldSlide == 1 ? BattleScript_TrainerASlideMsgRet : BattleScript_TrainerBSlideMsgRet); + } + else + gBattlescriptCurrInstr = cmd->nextInstr; } -static const u16 sTelekinesisBanList[] = -{ - SPECIES_DIGLETT, - SPECIES_DUGTRIO, - SPECIES_DIGLETT_ALOLA, - SPECIES_DUGTRIO_ALOLA, - SPECIES_SANDYGAST, - SPECIES_PALOSSAND, - SPECIES_GENGAR_MEGA, -}; - -bool32 IsTelekinesisBannedSpecies(u16 species) +void BS_TryTrainerSlideDynamaxMsg(void) { - u32 i; + NATIVE_ARGS(); + s32 shouldSlide; - for (i = 0; i < ARRAY_COUNT(sTelekinesisBanList); i++) + if ((shouldSlide = ShouldDoTrainerSlide(gBattleScripting.battler, TRAINER_SLIDE_DYNAMAX))) { - if (species == sTelekinesisBanList[i]) - return TRUE; + BattleScriptPush(cmd->nextInstr); + gBattlescriptCurrInstr = (shouldSlide == 1 ? BattleScript_TrainerASlideMsgRet : BattleScript_TrainerBSlideMsgRet); } - return FALSE; + else + gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_settelekinesis(void) +void BS_TryHealPulse(void) { - CMD_ARGS(const u8 *failInstr); + NATIVE_ARGS(const u8 *failInstr); - if (gStatuses3[gBattlerTarget] & (STATUS3_TELEKINESIS | STATUS3_ROOTED | STATUS3_SMACKED_DOWN) - || gFieldStatuses & STATUS_FIELD_GRAVITY - || IsTelekinesisBannedSpecies(gBattleMons[gBattlerTarget].species)) + if (IsBattlerAtMaxHp(gBattlerTarget)) { gBattlescriptCurrInstr = cmd->failInstr; } else { - gStatuses3[gBattlerTarget] |= STATUS3_TELEKINESIS; - gDisableStructs[gBattlerTarget].telekinesisTimer = gBattleTurnCounter + 3; + s32 healAmount = 0; + if (GetBattlerAbility(gBattlerAttacker) == ABILITY_MEGA_LAUNCHER && IsPulseMove(gCurrentMove)) + healAmount = GetNonDynamaxMaxHP(gBattlerTarget) * 75 / 100; + else if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && GetMoveEffectArg_MoveProperty(gCurrentMove) == MOVE_EFFECT_FLORAL_HEALING) + healAmount = GetNonDynamaxMaxHP(gBattlerTarget) * 2 / 3; + else + healAmount = GetNonDynamaxMaxHP(gBattlerTarget) / 2; + + SetHealAmount(gBattlerTarget, healAmount); gBattlescriptCurrInstr = cmd->nextInstr; } } -static void Cmd_swapstatstages(void) +void BS_TryDefog(void) { - CMD_ARGS(u8 stat); + NATIVE_ARGS(u8 clear, const u8 *failInstr); - u8 stat = cmd->stat; - s8 atkStatStage = gBattleMons[gBattlerAttacker].statStages[stat]; - s8 defStatStage = gBattleMons[gBattlerTarget].statStages[stat]; + if (cmd->clear) + { + if (TryDefogClear(gEffectBattler, TRUE)) + return; + else + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + if (TryDefogClear(gBattlerAttacker, FALSE)) + gBattlescriptCurrInstr = cmd->nextInstr; + else + gBattlescriptCurrInstr = cmd->failInstr; + } +} - gBattleMons[gBattlerAttacker].statStages[stat] = defStatStage; - gBattleMons[gBattlerTarget].statStages[stat] = atkStatStage; +void BS_TryTriggerStatusForm(void) +{ + NATIVE_ARGS(); + if (TryBattleFormChange(gBattlerTarget, FORM_CHANGE_STATUS)) + { + gBattleScripting.battler = gBattlerTarget; + BattleScriptPush(cmd->nextInstr); + gBattlescriptCurrInstr = BattleScript_TargetFormChangeWithStringNoPopup; + return; + } + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_AllySwitchSwapBattler(void) +{ + NATIVE_ARGS(); + gBattleScripting.battler = gBattlerAttacker; + gBattlerAttacker ^= BIT_FLANK; + gProtectStructs[gBattlerAttacker].usedAllySwitch = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; } -static u16 *GetBattlerStat(struct BattlePokemon *battler, u32 stat) +void BS_TryAllySwitch(void) { - switch (stat) + NATIVE_ARGS(const u8 *failInstr); + + if (!IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker)) || HasPartnerTrainer(gBattlerAttacker)) { - case STAT_ATK: return &battler->attack; - case STAT_DEF: return &battler->defense; - case STAT_SPATK: return &battler->spAttack; - case STAT_SPDEF: return &battler->spDefense; - default: return NULL; + gBattlescriptCurrInstr = cmd->failInstr; + } + else if (GetConfig(CONFIG_ALLY_SWITCH_FAIL_CHANCE) >= GEN_9) + { + TryResetProtectUseCounter(gBattlerAttacker); + if (sProtectSuccessRates[gDisableStructs[gBattlerAttacker].protectUses] < Random()) + { + gDisableStructs[gBattlerAttacker].protectUses = 0; + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + gDisableStructs[gBattlerAttacker].protectUses++; + gBattlescriptCurrInstr = cmd->nextInstr; + } + } + else + { + gBattlescriptCurrInstr = cmd->nextInstr; } } -static void Cmd_averagestats(void) +static void TryUpdateEvolutionTracker(u32 evolutionCondition, u32 upAmount, u16 usedMove) { - CMD_ARGS(u8 stat); + u32 i, j; - u16 *stat1 = GetBattlerStat(&gBattleMons[gBattlerAttacker], cmd->stat); - u16 *stat2 = GetBattlerStat(&gBattleMons[gBattlerTarget], cmd->stat); - u16 avg = (*stat1 + *stat2) / 2; - *stat1 = *stat2 = avg; + if (IsOnPlayerSide(gBattlerAttacker) + && !(gBattleTypeFlags & (BATTLE_TYPE_LINK + | BATTLE_TYPE_EREADER_TRAINER + | BATTLE_TYPE_RECORDED_LINK + | BATTLE_TYPE_TRAINER_HILL + | BATTLE_TYPE_FRONTIER))) + { + const struct Evolution *evolutions = GetSpeciesEvolutions(gBattleMons[gBattlerAttacker].species); + if (evolutions == NULL) + return; - gBattlescriptCurrInstr = cmd->nextInstr; + for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) + { + if (SanitizeSpeciesId(evolutions[i].targetSpecies) == SPECIES_NONE) + continue; + if (evolutions[i].params == NULL) + continue; + + for (j = 0; evolutions[i].params[j].condition != CONDITIONS_END; j++) + { + if (evolutions[i].params[j].condition == evolutionCondition) + { + struct Pokemon *monAtk = GetBattlerMon(gBattlerAttacker); + struct Pokemon *monDef = GetBattlerMon(gBattlerTarget); + // We only have 10 bits to use + u16 val = min(1023, GetMonData(monAtk, MON_DATA_EVOLUTION_TRACKER) + upAmount); + // Reset progress if you faint for the recoil method. + switch (evolutionCondition) + { + case IF_USED_MOVE_X_TIMES: + if (evolutions[i].params[j].arg1 == usedMove) + SetMonData(monAtk, MON_DATA_EVOLUTION_TRACKER, &val); + break; + case IF_RECOIL_DAMAGE_GE: + if (gBattleMons[gBattlerAttacker].hp == 0) + val = 0; + SetMonData(monAtk, MON_DATA_EVOLUTION_TRACKER, &val); + break; + case IF_DEFEAT_X_WITH_ITEMS: + if (GetMonData(monDef, MON_DATA_SPECIES) == evolutions[i].params[j].arg1 + && GetMonData(monDef, MON_DATA_HELD_ITEM) == evolutions[i].params[j].arg2) + SetMonData(monAtk, MON_DATA_EVOLUTION_TRACKER, &val); + break; + } + return; + } + } + } + } } -static void Cmd_jumpifcaptivateaffected(void) +void BS_TryTidyUp(void) { - CMD_ARGS(const u8 *jumpInstr); + NATIVE_ARGS(u8 clear, const u8 *jumpInstr); - if (GetBattlerAbility(gBattlerTarget) == ABILITY_OBLIVIOUS) + if (cmd->clear) { - gBattlescriptCurrInstr = BattleScript_NotAffectedAbilityPopUp; - gLastUsedAbility = ABILITY_OBLIVIOUS; - RecordAbilityBattle(gBattlerTarget, ABILITY_OBLIVIOUS); + if (TryTidyUpClear(gEffectBattler, TRUE)) + return; + else + gBattlescriptCurrInstr = cmd->nextInstr; } - else if (AreBattlersOfOppositeGender(gBattlerAttacker, gBattlerTarget)) + else { - gBattlescriptCurrInstr = cmd->jumpInstr; + if (TryTidyUpClear(gBattlerAttacker, FALSE)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; + } +} + +void BS_TryGulpMissile(void) +{ + NATIVE_ARGS(); + + if ((gBattleMons[gBattlerAttacker].species == SPECIES_CRAMORANT) + && (gCurrentMove == MOVE_DIVE) + && GetBattlerAbility(gBattlerAttacker) == ABILITY_GULP_MISSILE + && TryBattleFormChange(gBattlerAttacker, FORM_CHANGE_BATTLE_HP_PERCENT)) + { + gBattleScripting.battler = gBattlerAttacker; + gBattlescriptCurrInstr = BattleScript_GulpMissileFormChange; } else { @@ -16522,2240 +15559,2452 @@ static void Cmd_jumpifcaptivateaffected(void) } } -static void Cmd_setnonvolatilestatus(void) +void BS_TryActivateGulpMissile(void) { - CMD_ARGS(); - gEffectBattler = gBattlerTarget; - SetNonVolatileStatusCondition(gBattlerTarget, GetMoveNonVolatileStatus(gCurrentMove)); + NATIVE_ARGS(); + + if (!gProtectStructs[gBattlerAttacker].confusionSelfDmg + && IsBattlerAlive(gBattlerAttacker) + && IsBattlerTurnDamaged(gBattlerTarget) + && gBattleMons[gBattlerTarget].species != SPECIES_CRAMORANT + && GetBattlerAbility(gBattlerTarget) == ABILITY_GULP_MISSILE) + { + if (!IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD)) + SetPassiveDamageAmount(gBattlerTarget, GetNonDynamaxMaxHP(gBattlerAttacker) / 4); + + switch(gBattleMons[gBattlerTarget].species) + { + case SPECIES_CRAMORANT_GORGING: + TryBattleFormChange(gBattlerTarget, FORM_CHANGE_HIT_BY_MOVE); + BattleScriptCall(BattleScript_GulpMissileGorging); + return; + case SPECIES_CRAMORANT_GULPING: + TryBattleFormChange(gBattlerTarget, FORM_CHANGE_HIT_BY_MOVE); + BattleScriptCall(BattleScript_GulpMissileGulping); + return; + } + } + gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_tryworryseed(void) +void BS_TryQuash(void) { - CMD_ARGS(const u8 *failInstr); + NATIVE_ARGS(const u8 *failInstr); + u32 i, j; - if (gAbilitiesInfo[gBattleMons[gBattlerTarget].ability].cantBeOverwritten - || gBattleMons[gBattlerTarget].ability == ABILITY_INSOMNIA) + // It's true if foe is faster, has a bigger priority, or switches + if (HasBattlerActedThisTurn(gBattlerTarget)) { - RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability); gBattlescriptCurrInstr = cmd->failInstr; + return; } - else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + + // If the above condition is not true, it means we are faster than the foe, so we can set the quash bit + gProtectStructs[gBattlerTarget].quash = TRUE; + + struct BattleContext ctx = {0}; + for (i = 0; i < gBattlersCount; i++) { - RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_ABILITY_SHIELD); - gBattlescriptCurrInstr = cmd->failInstr; + ctx.abilities[i] = GetBattlerAbility(i); + ctx.holdEffects[i] = GetBattlerHoldEffect(i); } - else + // this implementation assumes turn order is correct when using Quash + i = GetBattlerTurnOrderNum(gBattlerTarget); + for (j = i + 1; j < gBattlersCount; j++) { - if (gBattleMons[gBattlerTarget].ability == ABILITY_NEUTRALIZING_GAS) - gSpecialStatuses[gBattlerTarget].neutralizingGasRemoved = TRUE; + ctx.battlerAtk = gBattlerByTurnOrder[i]; + ctx.battlerDef = gBattlerByTurnOrder[j]; - gBattleScripting.abilityPopupOverwrite = gBattleMons[gBattlerTarget].ability; - gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = ABILITY_INSOMNIA; - gBattlescriptCurrInstr = cmd->nextInstr; + // Gen 7- config makes target go last so that the order of quash targets is kept for the correct turn order + // Gen 8+ config alters Turn Order of the target according to speed, dynamic speed should handle the rest + if (B_QUASH_TURN_ORDER < GEN_8 || GetWhichBattlerFaster(&ctx, FALSE) == -1) + SwapTurnOrder(i, j); + else + break; + i++; } + gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_callnative(void) +void BS_CopyFoesStatIncrease(void) { - CMD_ARGS(void (*func)(void)); - void (*func)(void) = cmd->func; - func(); -} + NATIVE_ARGS(u8 battler, const u8 *jumpInstr); + u32 stat = 0; + u32 battler = GetBattlerForBattleScript(cmd->battler); -// Callnative Funcs + if (gQueuedStatBoosts[battler].stats == 0) + { + for (stat = 0; stat < (NUM_BATTLE_STATS - 1); stat++) + { + if (gQueuedStatBoosts[battler].statChanges[stat] != 0) + gQueuedStatBoosts[battler].stats |= (1 << stat); + } + gBattlescriptCurrInstr = cmd->jumpInstr; + return; + } -void SaveBattlerTarget(u32 battler) -{ - if (gBattleStruct->savedTargetCount < NELEMS(gBattleStruct->savedBattlerTarget)) - gBattleStruct->savedBattlerTarget[gBattleStruct->savedTargetCount++] = battler; - else - DebugPrintfLevel(MGBA_LOG_WARN, "Attempting to exceed savedBattlerTarget array size!"); + for (stat = 0; stat < (NUM_BATTLE_STATS - 1); stat++) + { + if (gQueuedStatBoosts[battler].stats & (1 << stat)) + { + if (gQueuedStatBoosts[battler].statChanges[stat] <= -1) + SET_STATCHANGER(stat + 1, abs(gQueuedStatBoosts[battler].statChanges[stat]), TRUE); + else + SET_STATCHANGER(stat + 1, gQueuedStatBoosts[battler].statChanges[stat], FALSE); + + gQueuedStatBoosts[battler].stats &= ~(1 << stat); + gBattlescriptCurrInstr = cmd->nextInstr; + return; + } + } + gBattlescriptCurrInstr = cmd->jumpInstr; } -void SaveBattlerAttacker(u32 battler) +void BS_RemoveWeather(void) { - if (gBattleStruct->savedAttackerCount < NELEMS(gBattleStruct->savedBattlerAttacker)) - gBattleStruct->savedBattlerAttacker[gBattleStruct->savedAttackerCount++] = battler; - else - DebugPrintfLevel(MGBA_LOG_WARN, "Attempting to exceed savedBattlerAttacker array size!"); + NATIVE_ARGS(); + RemoveAllWeather(); + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_SaveTarget(void) +void BS_ApplyTerastallization(void) { NATIVE_ARGS(); - SaveBattlerTarget(gBattlerTarget); + ApplyBattlerVisualsForTeraAnim(gBattlerAttacker); gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_RestoreTarget(void) +void BS_JumpIfSleepClause(void) { - NATIVE_ARGS(); - if (gBattleStruct->savedTargetCount > 0) + NATIVE_ARGS(const u8 *jumpInstr); + + // Can freely sleep own partner + if (IsDoubleBattle() && IsSleepClauseEnabled() && IsBattlerAlly(gBattlerAttacker, gBattlerTarget)) { - gBattleStruct->savedTargetCount--; - gBattlerTarget = gBattleStruct->savedBattlerTarget[gBattleStruct->savedTargetCount]; + gBattleStruct->battlerState[gBattlerTarget].sleepClauseEffectExempt = TRUE; + gBattlescriptCurrInstr = cmd->nextInstr; + return; } + gBattleStruct->battlerState[gBattlerTarget].sleepClauseEffectExempt = FALSE; + // Can't sleep if clause is active otherwise + if (IsSleepClauseActiveForSide(GetBattlerSide(gBattlerTarget))) + gBattlescriptCurrInstr = cmd->jumpInstr; else - { - // #if TESTING - // Test_ExitWithResult(TEST_RESULT_ERROR, "BS_RestoreTarget attempting to restore an empty target!"); - // #else - DebugPrintfLevel(MGBA_LOG_WARN, "BS_RestoreTarget attempting to restore an empty target!"); - // #endif - } - gBattlescriptCurrInstr = cmd->nextInstr; + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_SaveAttacker(void) +void BS_FickleBeamDamageCalculation(void) { NATIVE_ARGS(); - SaveBattlerAttacker(gBattlerAttacker); - gBattlescriptCurrInstr = cmd->nextInstr; -} -void BS_RestoreAttacker(void) -{ - NATIVE_ARGS(); - if (gBattleStruct->savedAttackerCount > 0) + if (RandomPercentage(RNG_FICKLE_BEAM, 30)) { - gBattleStruct->savedAttackerCount--; - gBattlerAttacker = gBattleStruct->savedBattlerAttacker[gBattleStruct->savedAttackerCount]; + gBattleStruct->fickleBeamBoosted = TRUE; + gBattlescriptCurrInstr = BattleScript_FickleBeamDoubled; } else { - // #if TESTING - // Test_ExitWithResult(TEST_RESULT_ERROR, "BS_RestoreAttacker attempting to restore an empty attacker!"); - // #else - DebugPrintfLevel(MGBA_LOG_WARN, "BS_RestoreAttacker attempting to restore an empty attacker!"); - // #endif + gBattlescriptCurrInstr = cmd->nextInstr; } - gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_CalcMetalBurstDmg(void) +void BS_TryTarShot(void) { NATIVE_ARGS(const u8 *failInstr); - - u8 sideAttacker = GetBattlerSide(gBattlerAttacker); - u8 sideTarget = 0; - - if (gProtectStructs[gBattlerAttacker].physicalDmg - && sideAttacker != (sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].physicalBattlerId)) - && gBattleMons[gProtectStructs[gBattlerAttacker].physicalBattlerId].hp) + if (gDisableStructs[gBattlerTarget].tarShot || GetActiveGimmick(gBattlerTarget) == GIMMICK_TERA) { - gBattleStruct->moveDamage[gBattlerTarget] = gProtectStructs[gBattlerAttacker].physicalDmg * 150 / 100; - - if (IsAffectedByFollowMe(gBattlerAttacker, sideTarget, gCurrentMove)) - gBattlerTarget = gSideTimers[sideTarget].followmeTarget; - else - gBattlerTarget = gProtectStructs[gBattlerAttacker].physicalBattlerId; - - gBattlescriptCurrInstr = cmd->nextInstr; + gBattlescriptCurrInstr = cmd->failInstr; } - else if (gProtectStructs[gBattlerAttacker].specialDmg - && sideAttacker != (sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].specialBattlerId)) - && gBattleMons[gProtectStructs[gBattlerAttacker].specialBattlerId].hp) + else { - gBattleStruct->moveDamage[gBattlerTarget] = gProtectStructs[gBattlerAttacker].specialDmg * 150 / 100; - - if (IsAffectedByFollowMe(gBattlerAttacker, sideTarget, gCurrentMove)) - gBattlerTarget = gSideTimers[sideTarget].followmeTarget; - else - gBattlerTarget = gProtectStructs[gBattlerAttacker].specialBattlerId; - + gDisableStructs[gBattlerTarget].tarShot = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; } +} + +void BS_CanTarShotWork(void) +{ + NATIVE_ARGS(const u8 *failInstr); + // Tar Shot fails if the target can't be made weaker to fire and it's speed can't be lowered further + if (!(gDisableStructs[gBattlerTarget].tarShot || GetActiveGimmick(gBattlerTarget) == GIMMICK_TERA) + || CompareStat(gBattlerTarget, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN, GetBattlerAbility(gBattlerTarget))) + gBattlescriptCurrInstr = cmd->nextInstr; else - { gBattlescriptCurrInstr = cmd->failInstr; - } } -void BS_JumpIfCantFling(void) +void BS_JumpIfBlockedBySoundproof(void) { NATIVE_ARGS(u8 battler, const u8 *jumpInstr); - u32 battler = GetBattlerForBattleScript(cmd->battler); - if (!CanFling(battler)) + if (IsSoundMove(gCurrentMove) && GetBattlerAbility(battler) == ABILITY_SOUNDPROOF) + { + gLastUsedAbility = ABILITY_SOUNDPROOF; gBattlescriptCurrInstr = cmd->jumpInstr; + RecordAbilityBattle(battler, gLastUsedAbility); + gBattlerAbility = battler; + } else + { gBattlescriptCurrInstr = cmd->nextInstr; + } } -void BS_JumpIfMoreThanHalfHP(void) +void BS_SetMagicCoatTarget(void) +{ + NATIVE_ARGS(); + gBattleStruct->attackerBeforeBounce = gBattleScripting.battler = gBattlerAttacker; + gBattlerAttacker = gBattlerTarget; + gBattlerTarget = gBattleStruct->attackerBeforeBounce; + HandleMoveTargetRedirection(); + ClearDamageCalcResults(); + + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_TeatimeInvul(void) { NATIVE_ARGS(u8 battler, const u8 *jumpInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (gBattleMons[battler].hp > (gBattleMons[battler].maxHP + 1) / 2) + if (GetItemPocket(gBattleMons[battler].item) == POCKET_BERRIES && !IsSemiInvulnerable(gBattlerTarget, CHECK_ALL)) + gBattlescriptCurrInstr = cmd->nextInstr; + else gBattlescriptCurrInstr = cmd->jumpInstr; +} + +void BS_TeatimeTargets(void) +{ + NATIVE_ARGS(const u8 *failInstr); + u32 count = 0, i; + + for (i = 0; i < gBattlersCount; i++) + { + if (IsTeatimeAffected(i)) + count++; + } + if (count == 0) + gBattlescriptCurrInstr = cmd->failInstr; else gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_DoStockpileStatChangesWearOff(void) +void BS_TryWindRiderPower(void) { - NATIVE_ARGS(u8 battler, const u8 *statChangeInstr); + NATIVE_ARGS(u8 battler, const u8 *failInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (gDisableStructs[battler].stockpileDef != 0) - { - SET_STATCHANGER(STAT_DEF, abs(gDisableStructs[battler].stockpileDef), TRUE); - gDisableStructs[battler].stockpileDef = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = cmd->statChangeInstr; - } - else if (gDisableStructs[battler].stockpileSpDef) + enum Ability ability = GetBattlerAbility(battler); + if (IsBattlerAlly(battler, gBattlerAttacker) + && (ability == ABILITY_WIND_RIDER || ability == ABILITY_WIND_POWER)) { - SET_STATCHANGER(STAT_SPDEF, abs(gDisableStructs[battler].stockpileSpDef), TRUE); - gDisableStructs[battler].stockpileSpDef = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = cmd->statChangeInstr; + gLastUsedAbility = ability; + RecordAbilityBattle(battler, gLastUsedAbility); + gBattlerAbility = gBattleScripting.battler = battler; + gBattlescriptCurrInstr = cmd->nextInstr; } else { - gBattlescriptCurrInstr = cmd->nextInstr; + gBattlescriptCurrInstr = cmd->failInstr; } } -static bool32 CriticalCapture(u32 odds) +void BS_ActivateWeatherChangeAbilities(void) { - u32 numCaught; - u32 totalDexCount; - - if (B_CRITICAL_CAPTURE == FALSE) - return FALSE; + NATIVE_ARGS(u8 battler); - if (B_CRITICAL_CAPTURE_LOCAL_DEX == TRUE) - totalDexCount = HOENN_DEX_COUNT; - else - totalDexCount = NATIONAL_DEX_COUNT; + u32 battler = GetBattlerForBattleScript(cmd->battler); + gBattlescriptCurrInstr = cmd->nextInstr; + AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, battler, 0, 0, 0); +} - numCaught = GetNationalPokedexCount(FLAG_GET_CAUGHT); +void BS_ActivateTerrainChangeAbilities(void) +{ + NATIVE_ARGS(u8 battler); - if (numCaught <= (totalDexCount * 30) / 650) - odds = 0; - else if (numCaught <= (totalDexCount * 150) / 650) - odds /= 2; - else if (numCaught <= (totalDexCount * 300) / 650) - ; // odds = (odds * 100) / 100; - else if (numCaught <= (totalDexCount * 450) / 650) - odds = (odds * 150) / 100; - else if (numCaught <= (totalDexCount * 600) / 650) - odds *= 2; - else - odds = (odds * 250) / 100; + u32 battler = GetBattlerForBattleScript(cmd->battler); + gBattlescriptCurrInstr = cmd->nextInstr; + AbilityBattleEffects(ABILITYEFFECT_ON_TERRAIN, battler, 0, 0, 0); +} - if (CheckBagHasItem(ITEM_CATCHING_CHARM, 1)) - odds = (odds * (100 + B_CATCHING_CHARM_BOOST)) / 100; +void BS_ResetTerrainAbilityFlags(void) +{ + NATIVE_ARGS(); + // reset terrain ability checks + for (u32 i = 0; i < gBattlersCount; i++) + gDisableStructs[i].terrainAbilityDone = 0; - odds /= 6; + gBattlescriptCurrInstr = cmd->nextInstr; +} - if ((Random() % 255) < odds) - return TRUE; +void BS_StoreHealingWish(void) +{ + NATIVE_ARGS(u8 battler); - return FALSE; + u32 battler = GetBattlerForBattleScript(cmd->battler); + if (GetMoveEffect(gCurrentMove) == EFFECT_LUNAR_DANCE) + gBattleStruct->battlerState[battler].storedLunarDance = TRUE; + else + gBattleStruct->battlerState[battler].storedHealingWish = TRUE; + gBattlescriptCurrInstr = cmd->nextInstr; } -bool32 IsMoveAffectedByParentalBond(u32 move, u32 battler) +void BS_TryRevivalBlessing(void) { - if (move != MOVE_NONE && move != MOVE_UNAVAILABLE && move != MOVE_STRUGGLE - && !IsMoveParentalBondBanned(move) - && GetMoveCategory(move) != DAMAGE_CATEGORY_STATUS - && GetMoveStrikeCount(move) < 2 - && GetMoveEffect(move) != EFFECT_SEMI_INVULNERABLE - && GetMoveEffect(move) != EFFECT_TWO_TURNS_ATTACK - && GetMoveEffect(move) != EFFECT_MULTI_HIT) + NATIVE_ARGS(const u8 *failInstr); + u8 index = GetFirstFaintedPartyIndex(gBattlerAttacker); + + // Move fails if there are no battlers to revive. + if (index == PARTY_SIZE) { - if (IsDoubleBattle()) + gBattlescriptCurrInstr = cmd->failInstr; + return; + } + + // Battler selected! Revive and go to next instruction. + if (gSelectedMonPartyId != PARTY_SIZE) + { + struct Pokemon *party = GetBattlerParty(gBattlerAttacker); + + u16 hp = GetMonData(&party[gSelectedMonPartyId], MON_DATA_MAX_HP) / 2; + BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_HP_BATTLE, 1u << gSelectedMonPartyId, sizeof(hp), &hp); + MarkBattlerForControllerExec(gBattlerAttacker); + PREPARE_SPECIES_BUFFER(gBattleTextBuff1, GetMonData(&party[gSelectedMonPartyId], MON_DATA_SPECIES)); + + // If an on-field battler is revived, it needs to be sent out again. + if (IsDoubleBattle() && + gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerAttacker)] == gSelectedMonPartyId) { - switch (GetBattlerMoveTargetType(battler, move)) - { - // Both foes are alive, spread move strikes once - case MOVE_TARGET_BOTH: - if (CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerTarget) >= 2) - return FALSE; - break; - // Either both foes or one foe and its ally are alive; spread move strikes once - case MOVE_TARGET_FOES_AND_ALLY: - if (CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER, gBattlerAttacker) >= 2) - return FALSE; - break; - default: - break; - } + u32 i = BATTLE_PARTNER(gBattlerAttacker); + gAbsentBattlerFlags &= ~(1u << i); + gBattleStruct->monToSwitchIntoId[i] = gSelectedMonPartyId; + gBattleScripting.battler = i; + gBattleCommunication[MULTIUSE_STATE] = TRUE; } - return TRUE; + + gSelectedMonPartyId = PARTY_SIZE; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + // Open party menu, wait to go to next instruction. + BtlController_EmitChoosePokemon(gBattlerAttacker, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_FAINTED_MON, PARTY_SIZE, ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[gBattlerAttacker]); + MarkBattlerForControllerExec(gBattlerAttacker); } - return FALSE; } -static bool8 IsFinalStrikeEffect(enum BattleMoveEffects moveEffect) +void BS_JumpIfCommanderActive(void) { - u32 i; + NATIVE_ARGS(const u8 *jumpInstr); - for (i = 0; i < ARRAY_COUNT(sFinalStrikeOnlyEffects); i++) - { - if (moveEffect == sFinalStrikeOnlyEffects[i]) - return TRUE; - } - return FALSE; + if (gBattleStruct->battlerState[gBattlerTarget].commanderSpecies != SPECIES_NONE) + gBattlescriptCurrInstr = cmd->jumpInstr; + else if (gBattleMons[gBattlerTarget].volatiles.semiInvulnerable == STATE_COMMANDER) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; } -static bool32 CanAbilityPreventStatLoss(u32 abilityDef) +static void UpdatePokeFlutePartyStatus(struct Pokemon* party, u8 position) { - switch (abilityDef) + s32 i; + u8 battler; + u32 monToCheck, status; + u16 species, abilityNum; + monToCheck = 0; + for (i = 0; i < PARTY_SIZE; i++) { - case ABILITY_CLEAR_BODY: - case ABILITY_FULL_METAL_BODY: - case ABILITY_WHITE_SMOKE: - return TRUE; + species = GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG); + abilityNum = GetMonData(&party[i], MON_DATA_ABILITY_NUM); + status = GetMonData(&party[i], MON_DATA_STATUS); + if (species != SPECIES_NONE + && species != SPECIES_EGG + && status & AILMENT_FNT + && GetAbilityBySpecies(species, abilityNum) != ABILITY_SOUNDPROOF) + monToCheck |= (1 << i); + } + if (monToCheck) + { + battler = GetBattlerAtPosition(position); + status = 0; + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, monToCheck, 4, &status); + MarkBattlerForControllerExec(battler); + gBattleCommunication[MULTISTRING_CHOOSER] = 1; } - return FALSE; } -bool32 CanBurnHitThaw(u16 move) +void BS_CheckPokeFlute(void) { - u8 i; + NATIVE_ARGS(); + gBattleCommunication[MULTISTRING_CHOOSER] = 0; - if (B_BURN_HIT_THAW >= GEN_6) + s32 i; + for (i = 0; i < gBattlersCount; i++) { - u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); - for (i = 0; i < numAdditionalEffects; i++) + if (GetBattlerAbility(i) != ABILITY_SOUNDPROOF) { - const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); - if (additionalEffect->moveEffect == MOVE_EFFECT_BURN) - return TRUE; + gBattleMons[i].status1 &= ~STATUS1_SLEEP; + gBattleMons[i].volatiles.nightmare = FALSE; } } - return FALSE; -} -void BS_CheckParentalBondCounter(void) -{ - NATIVE_ARGS(u8 counter, const u8 *jumpInstr); - // Some effects should only happen on the first or second strike of Parental Bond, - // so a way to check this in battle scripts is useful - if (gSpecialStatuses[gBattlerAttacker].parentalBondState == cmd->counter && IsBattlerAlive(gBattlerTarget)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; + UpdatePokeFlutePartyStatus(gPlayerParty, B_POSITION_PLAYER_LEFT); + UpdatePokeFlutePartyStatus(gEnemyParty, B_POSITION_OPPONENT_LEFT); + + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_JumpIfCantLoseItem(void) +void BS_WaitFanfare(void) { - NATIVE_ARGS(u8 battler, const u8 *jumpInstr); - u8 battler = GetBattlerForBattleScript(cmd->battler); - u16 item = gBattleMons[battler].item; + NATIVE_ARGS(); - if (item == ITEM_NONE || !CanBattlerGetOrLoseItem(battler, item)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; + if (!IsFanfareTaskInactive()) + return; + + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_GetBattlerSide(void) +void BS_RemoveTerrain(void) { - NATIVE_ARGS(u8 battler); - gBattleCommunication[0] = GetBattlerSide(GetBattlerForBattleScript(cmd->battler)); + NATIVE_ARGS(); + RemoveAllTerrains(); gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TrySymbiosis(void) +void BS_TrySpectralThiefSteal(void) { - NATIVE_ARGS(u8 battler); - u32 battler = GetBattlerForBattleScript(cmd->battler); - //called by Bestow, Fling, and Bug Bite, which don't work with Cmd_removeitem. - u32 partner = BATTLE_PARTNER(battler); - if (TryTriggerSymbiosis(battler, partner)) + NATIVE_ARGS(const u8 *jumpInstr); + + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) { - BestowItem(partner, battler); - gLastUsedAbility = gBattleMons[partner].ability; - gBattleScripting.battler = gBattlerAbility = partner; - gEffectBattler = battler; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SymbiosisActivates; + gBattlescriptCurrInstr = cmd->nextInstr; return; } - gBattlescriptCurrInstr = cmd->nextInstr; -} + bool32 contrary = GetBattlerAbility(gBattlerAttacker) == ABILITY_CONTRARY; + gBattleStruct->stolenStats[0] = 0; // Stats to steal. + gBattleScripting.animArg1 = 0; + for (enum Stat stat = STAT_ATK; stat < NUM_BATTLE_STATS; stat++) + { + if (gBattleMons[gBattlerTarget].statStages[stat] > DEFAULT_STAT_STAGE && gBattleMons[gBattlerAttacker].statStages[stat] != MAX_STAT_STAGE) + { + bool32 byTwo = FALSE; -void BS_SetZEffect(void) -{ - SetZEffect(); // Handles battle script jumping internally + gBattleStruct->stolenStats[0] |= (1 << (stat)); + // Store by how many stages to raise the stat. + gBattleStruct->stolenStats[stat] = gBattleMons[gBattlerTarget].statStages[stat] - DEFAULT_STAT_STAGE; + + while (gBattleMons[gBattlerAttacker].statStages[stat] + gBattleStruct->stolenStats[stat] > MAX_STAT_STAGE) + gBattleStruct->stolenStats[stat]--; + + gBattleMons[gBattlerTarget].statStages[stat] = DEFAULT_STAT_STAGE; + + if (gBattleStruct->stolenStats[stat] >= 2) + byTwo++; + + if (gBattleScripting.animArg1 == 0) + { + if (byTwo) + gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MINUS2 : STAT_ANIM_PLUS2) + stat; + else + gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MINUS1 : STAT_ANIM_PLUS1) + stat; + } + else + { + if (byTwo) + gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MULTIPLE_MINUS2 : STAT_ANIM_MULTIPLE_PLUS2); + else + gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MULTIPLE_MINUS1 : STAT_ANIM_MULTIPLE_PLUS1); + } + } + } + + if (gBattleStruct->stolenStats[0] != 0) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; } -static void TryUpdateRoundTurnOrder(void) +void BS_SpectralThiefPrintStats(void) { - if (IsDoubleBattle()) + NATIVE_ARGS(); + + for (enum Stat stat = STAT_ATK; stat < NUM_BATTLE_STATS; stat++) { - u32 i; - u32 j = 0; - u32 k = 0; - u32 currRounder = 0; - u8 roundUsers[3] = {0xFF, 0xFF, 0xFF}; - u8 nonRoundUsers[3] = {0xFF, 0xFF, 0xFF}; - for (i = 0; i < gBattlersCount; i++) + if (gBattleStruct->stolenStats[0] & (1u << stat)) { - if (gBattlerByTurnOrder[i] == gBattlerAttacker) + gBattleStruct->stolenStats[0] &= ~(1u << stat); + SET_STATCHANGER(stat, gBattleStruct->stolenStats[stat], FALSE); + if (ChangeStatBuffs( + gBattlerAttacker, + GET_STAT_BUFF_VALUE_WITH_SIGN(gBattleScripting.statChanger), + stat, + STAT_CHANGE_CERTAIN, + 0, NULL) == STAT_CHANGE_WORKED) { - currRounder = i + 1; // Current battler going after attacker - break; + BattleScriptCall(BattleScript_StatUp); + return; } } + } + gBattlescriptCurrInstr = cmd->nextInstr; +} - // Get battlers after attacker using round - for (i = currRounder; i < gBattlersCount; i++) - { - if (gChosenMoveByBattler[gBattlerByTurnOrder[i]] == MOVE_ROUND) - roundUsers[j++] = gBattlerByTurnOrder[i]; - else - nonRoundUsers[k++] = gBattlerByTurnOrder[i]; - } +void BS_SetMoveResultFlags(void) +{ + NATIVE_ARGS(u16 value); + gBattleStruct->moveResultFlags[gBattlerTarget] |= cmd->value; + gBattlescriptCurrInstr = cmd->nextInstr; +} - // update turn order for round users - for (i = 0; roundUsers[i] != 0xFF && i < 3; i++) - { - gBattlerByTurnOrder[currRounder] = roundUsers[i]; - gProtectStructs[roundUsers[i]].quash = TRUE; // Make it so their turn order can't be changed again - currRounder++; - } +void BS_ClearMoveResultFlags(void) +{ + NATIVE_ARGS(u16 value); + gBattleStruct->moveResultFlags[gBattlerTarget] &= ~(cmd->value); + gBattlescriptCurrInstr = cmd->nextInstr; +} - // Update turn order for non-round users - for (i = 0; nonRoundUsers[i] != 0xFF && i < 3; i++) - { - gBattlerByTurnOrder[currRounder] = nonRoundUsers[i]; - currRounder++; - } - } +void BS_ClearSpecialStatuses(void) +{ + NATIVE_ARGS(); + memset(&gSpecialStatuses, 0, sizeof(gSpecialStatuses)); + gBattlescriptCurrInstr = cmd->nextInstr; } -u8 GetFirstFaintedPartyIndex(u8 battler) +void BS_JumpIfMoveResultFlags(void) { - u32 i; - u32 start = 0; - u32 end = PARTY_SIZE; - struct Pokemon *party = GetBattlerParty(battler); + NATIVE_ARGS(u16 value, const u8 *jumpInstr); - // Check whether partner is separate trainer. - if ((IsOnPlayerSide(battler) && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) - || (!IsOnPlayerSide(battler) && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)) - { - if (GetBattlerPosition(battler) == B_POSITION_OPPONENT_LEFT - || GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT) - { - end = PARTY_SIZE / 2; - } - else - { - start = PARTY_SIZE / 2; - } - } + if (gBattleStruct->moveResultFlags[gBattlerTarget] & cmd->value) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} - // Loop through to find fainted battler. - for (i = start; i < end; ++i) - { - u32 species = GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG); - if (species != SPECIES_NONE - && species != SPECIES_EGG - && GetMonData(&party[i], MON_DATA_HP) == 0) - { - return i; - } - } +void BS_JumpIfNotCriticalHit(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); - // Returns PARTY_SIZE if none found. - return PARTY_SIZE; + if (!gSpecialStatuses[gBattlerTarget].criticalHit) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; } -void ApplyExperienceMultipliers(s32 *expAmount, u8 expGetterMonId, u8 faintedBattler) +void BS_SwapStats(void) { - enum ItemHoldEffect holdEffect = GetMonHoldEffect(&gPlayerParty[expGetterMonId]); + NATIVE_ARGS(u8 stat); - if (IsTradedMon(&gPlayerParty[expGetterMonId])) - *expAmount = (*expAmount * 150) / 100; - if (holdEffect == HOLD_EFFECT_LUCKY_EGG) - *expAmount = (*expAmount * 150) / 100; - if (B_UNEVOLVED_EXP_MULTIPLIER >= GEN_6 && IsMonPastEvolutionLevel(&gPlayerParty[expGetterMonId])) - *expAmount = (*expAmount * 4915) / 4096; - if (B_AFFECTION_MECHANICS == TRUE && GetMonAffectionHearts(&gPlayerParty[expGetterMonId]) >= AFFECTION_FOUR_HEARTS) - *expAmount = (*expAmount * 4915) / 4096; - if (CheckBagHasItem(ITEM_EXP_CHARM, 1)) //is also for other exp boosting Powers if/when implemented - *expAmount = (*expAmount * 150) / 100; + enum Stat stat = cmd->stat; + u32 temp; - if (B_SCALED_EXP >= GEN_5 && B_SCALED_EXP != GEN_6) + switch (stat) { - // Note: There is an edge case where if a pokemon receives a large amount of exp, it wouldn't be properly calculated - // because of multiplying by scaling factor(the value would simply be larger than an u32 can hold). Hence u64 is needed. - u64 value = *expAmount; - u8 faintedLevel = gBattleMons[faintedBattler].level; - u8 expGetterLevel = GetMonData(&gPlayerParty[expGetterMonId], MON_DATA_LEVEL); - - value *= sExperienceScalingFactors[(faintedLevel * 2) + 10]; - value /= sExperienceScalingFactors[faintedLevel + expGetterLevel + 10]; - - *expAmount = value + 1; + case STAT_HP: + SWAP(gBattleMons[gBattlerAttacker].hp, gBattleMons[gBattlerTarget].hp, temp); + break; + case STAT_ATK: + SWAP(gBattleMons[gBattlerAttacker].attack, gBattleMons[gBattlerTarget].attack, temp); + break; + case STAT_DEF: + SWAP(gBattleMons[gBattlerAttacker].defense, gBattleMons[gBattlerTarget].defense, temp); + break; + case STAT_SPEED: + SWAP(gBattleMons[gBattlerAttacker].speed, gBattleMons[gBattlerTarget].speed, temp); + break; + case STAT_SPATK: + SWAP(gBattleMons[gBattlerAttacker].spAttack, gBattleMons[gBattlerTarget].spAttack, temp); + break; + case STAT_SPDEF: + SWAP(gBattleMons[gBattlerAttacker].spDefense, gBattleMons[gBattlerTarget].spDefense, temp); + break; + default: + break; } + PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_ItemRestoreHP(void) +static void TrySetParalysis(const u8 *nextInstr, const u8 *failInstr) { - NATIVE_ARGS(const u8 *alreadyMaxHpInstr, const u8 *restoreBattlerInstr); - u16 healAmount; - u32 battler = MAX_BATTLERS_COUNT; - u32 healParam = GetItemEffect(gLastUsedItem)[6]; - struct Pokemon *party = GetBattlerParty(gBattlerAttacker); - u16 hp = GetMonData(&party[gBattleStruct->itemPartyIndex[gBattlerAttacker]], MON_DATA_HP); - u16 maxHP = GetMonData(&party[gBattleStruct->itemPartyIndex[gBattlerAttacker]], MON_DATA_MAX_HP); - gBattleCommunication[MULTIUSE_STATE] = 0; - - if (hp == maxHP) - { - gBattlescriptCurrInstr = cmd->alreadyMaxHpInstr; - } + if (CanBeParalyzed(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerTarget))) + SetNonVolatileStatus(gBattlerTarget, MOVE_EFFECT_PARALYSIS, nextInstr, TRIGGER_ON_MOVE); else - { - // Track the number of Revives used in a battle. - if (hp == 0 && IsOnPlayerSide(gBattlerAttacker) && gBattleResults.numRevivesUsed < 255) - gBattleResults.numRevivesUsed++; - - // Check if the recipient is an active battler. - if (gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[gBattlerAttacker]) - battler = gBattlerAttacker; - else if (IsDoubleBattle() && gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerAttacker)]) - battler = BATTLE_PARTNER(gBattlerAttacker); - - // Get amount to heal. - switch (healParam) - { - case ITEM6_HEAL_HP_FULL: - healAmount = maxHP; - break; - case ITEM6_HEAL_HP_HALF: - healAmount = maxHP / 2; - break; - case ITEM6_HEAL_HP_QUARTER: - healAmount = maxHP / 4; - break; - default: - healAmount = healParam; - break; - } - if (hp + healAmount > maxHP) - healAmount = maxHP - hp; - - gBattleScripting.battler = battler; - PREPARE_SPECIES_BUFFER(gBattleTextBuff1, GetMonData(&party[gBattleStruct->itemPartyIndex[gBattlerAttacker]], MON_DATA_SPECIES)); + gBattlescriptCurrInstr = failInstr; +} - // Heal is applied as move damage if battler is active. - if (battler != MAX_BATTLERS_COUNT && hp != 0) - { - gBattleStruct->moveDamage[battler] = -healAmount; - gBattlescriptCurrInstr = cmd->restoreBattlerInstr; - } - else - { - hp += healAmount; - SetMonData(&party[gBattleStruct->itemPartyIndex[gBattlerAttacker]], MON_DATA_HP, &hp); +static void TrySetPoison(const u8 *nextInstr, const u8 *failInstr) +{ + if (CanBePoisoned(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerAbility(gBattlerTarget))) + SetNonVolatileStatus(gBattlerTarget, MOVE_EFFECT_POISON, nextInstr, TRIGGER_ON_MOVE); + else + gBattlescriptCurrInstr = failInstr; +} - // Revived battlers on the field need to be brought back. - if (IsDoubleBattle() && battler != MAX_BATTLERS_COUNT) - { - gAbsentBattlerFlags &= ~(1u << battler); - gBattleMons[battler].hp = hp; - gBattleCommunication[MULTIUSE_STATE] = TRUE; - } - gBattlescriptCurrInstr = cmd->nextInstr; - } - } +static void TrySetSleep(const u8 *nextInstr, const u8 *failInstr) +{ + if (CanBeSlept(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerTarget), BLOCKED_BY_SLEEP_CLAUSE)) + SetNonVolatileStatus(gBattlerTarget, MOVE_EFFECT_SLEEP, nextInstr, TRIGGER_ON_MOVE); + else + gBattlescriptCurrInstr = failInstr; } -void BS_ItemCureStatus(void) +void BS_TrySetParalysis(void) { - NATIVE_ARGS(const u8 *noStatusInstr); - u32 battler = gBattlerAttacker; - u32 previousStatus2 = 0; - bool32 statusChanged = FALSE; - struct Pokemon *party = GetBattlerParty(gBattlerAttacker); + NATIVE_ARGS(const u8 *failInstr); + TrySetParalysis(cmd->nextInstr, cmd->failInstr); +} - // Heal Status2 conditions if battler is active. - if (gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[gBattlerAttacker]) - { - previousStatus2 = gBattleMons[battler].status2; - gBattleMons[gBattlerAttacker].status2 &= ~GetItemStatus2Mask(gLastUsedItem); - } - else if (IsDoubleBattle() - && gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerAttacker)]) - { - battler = BATTLE_PARTNER(gBattlerAttacker); - previousStatus2 = gBattleMons[battler].status2; - gBattleMons[battler].status2 &= ~GetItemStatus2Mask(gLastUsedItem); - } +void BS_TrySetPoison(void) +{ + NATIVE_ARGS(const u8 *failInstr); + TrySetPoison(cmd->nextInstr, cmd->failInstr); +} - if (previousStatus2 != gBattleMons[battler].status2) - statusChanged = TRUE; +void BS_TrySetPoisonParalyzis(void) +{ + NATIVE_ARGS(const u8 *failInstr); - // Heal Status1 conditions. - if (!HealStatusConditions(&party[gBattleStruct->itemPartyIndex[gBattlerAttacker]], GetItemStatus1Mask(gLastUsedItem), battler)) - { - statusChanged = TRUE; - if (GetItemStatus1Mask(gLastUsedItem) & STATUS1_SLEEP) - gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; - if (GetItemStatus2Mask(gLastUsedItem) & STATUS2_CONFUSION) - gStatuses4[battler] &= ~STATUS4_INFINITE_CONFUSION; - } + static const u32 sStunShockEffects[] = {STATUS1_PARALYSIS, STATUS1_POISON}; + u32 status = RandomElement(RNG_G_MAX_STUN_SHOCK, sStunShockEffects); - if (statusChanged) - { - gBattleScripting.battler = battler; - PREPARE_SPECIES_BUFFER(gBattleTextBuff1, GetMonData(&party[gBattleStruct->itemPartyIndex[gBattlerAttacker]], MON_DATA_SPECIES)); - gBattlescriptCurrInstr = cmd->nextInstr; - } + if (status == STATUS1_PARALYSIS) + TrySetParalysis(cmd->nextInstr, cmd->failInstr); else - { - gBattlescriptCurrInstr = cmd->noStatusInstr; - } + TrySetPoison(cmd->nextInstr, cmd->failInstr); } -void BS_ItemIncreaseStat(void) +void BS_TrySetEffectSpore(void) { - NATIVE_ARGS(); - u16 statId = GetItemEffect(gLastUsedItem)[1]; - u16 stages = GetItemHoldEffectParam(gLastUsedItem); - SET_STATCHANGER(statId, stages, FALSE); - gBattlescriptCurrInstr = cmd->nextInstr; + NATIVE_ARGS(const u8 *failInstr); + + static const u32 sBefuddleEffects[] = {STATUS1_PARALYSIS, STATUS1_POISON, STATUS1_SLEEP}; + u32 status = RandomElement(RNG_G_MAX_BEFUDDLE, sBefuddleEffects); + + if (status == STATUS1_PARALYSIS) + TrySetParalysis(cmd->nextInstr, cmd->failInstr); + else if (status == STATUS1_POISON) + TrySetPoison(cmd->nextInstr, cmd->failInstr); + else + TrySetSleep(cmd->nextInstr, cmd->failInstr); } -void BS_ItemRestorePP(void) +void BS_TrySetConfusion(void) { - NATIVE_ARGS(); - const u8 *effect = GetItemEffect(gLastUsedItem); - u32 i, pp, maxPP, moveId, loopEnd; - u32 battler = MAX_BATTLERS_COUNT; - struct Pokemon *mon = (IsOnPlayerSide(gBattlerAttacker)) ? &gPlayerParty[gBattleStruct->itemPartyIndex[gBattlerAttacker]] : &gEnemyParty[gBattleStruct->itemPartyIndex[gBattlerAttacker]]; + NATIVE_ARGS(const u8 *failInstr); - // Check whether to apply to all moves. - if (effect[4] & ITEM4_HEAL_PP_ONE) + if (CanBeConfused(gBattlerTarget)) { - i = gBattleStruct->itemMoveIndex[gBattlerAttacker]; - loopEnd = i + 1; + gBattleMons[gBattlerTarget].volatiles.confusionTurns = ((Random()) % 4) + 2; + gBattleCommunication[MULTIUSE_STATE] = 1; + gEffectBattler = gBattlerTarget; + gBattlescriptCurrInstr = cmd->nextInstr; } else { - i = 0; - loopEnd = MAX_MON_MOVES; - } - - // Check if the recipient is an active battler. - if (gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[gBattlerAttacker]) - battler = gBattlerAttacker; - else if (IsDoubleBattle() - && gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerAttacker)]) - battler = BATTLE_PARTNER(gBattlerAttacker); - - // Heal PP! - for (; i < loopEnd; i++) - { - pp = GetMonData(mon, MON_DATA_PP1 + i, NULL); - moveId = GetMonData(mon, MON_DATA_MOVE1 + i, NULL); - maxPP = CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), i); - if (pp != maxPP) - { - pp += effect[6]; - if (pp > maxPP) - pp = maxPP; - SetMonData(mon, MON_DATA_PP1 + i, &pp); - - // Update battler PP if needed. - if (battler != MAX_BATTLERS_COUNT - && gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[battler] - && MOVE_IS_PERMANENT(battler, i)) - { - gBattleMons[battler].pp[i] = pp; - } - } + gBattlescriptCurrInstr = cmd->failInstr; } - gBattleScripting.battler = battler; - PREPARE_SPECIES_BUFFER(gBattleTextBuff1, GetMonData(mon, MON_DATA_SPECIES)); - gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TryRevertWeatherForm(void) +void BS_TrySetInfatuation(void) { - NATIVE_ARGS(); - if (TryBattleFormChange(gBattlerTarget, FORM_CHANGE_BATTLE_WEATHER)) + NATIVE_ARGS(const u8 *failInstr); + + if (!gBattleMons[gBattlerTarget].volatiles.infatuation + && gBattleMons[gBattlerTarget].ability != ABILITY_OBLIVIOUS + && !IsAbilityOnSide(gBattlerTarget, ABILITY_AROMA_VEIL) + && AreBattlersOfOppositeGender(gBattlerAttacker, gBattlerTarget)) { - gBattleScripting.battler = gBattlerTarget; - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = BattleScript_TargetFormChangeWithStringNoPopup; - return; + gBattleMons[gBattlerTarget].volatiles.infatuation = INFATUATED_WITH(gBattlerAttacker); + gBattleCommunication[MULTIUSE_STATE] = 2; + gEffectBattler = gBattlerTarget; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; } - gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_HandleMegaEvolution(void) +void BS_TrySetEscapePrevention(void) { - NATIVE_ARGS(u8 battler, u8 caseId); + NATIVE_ARGS(const u8 *failInstr); - u8 battler = GetBattlerForBattleScript(cmd->battler); - HandleScriptMegaPrimalBurst(cmd->caseId, battler, HANDLE_TYPE_MEGA_EVOLUTION); - gBattlescriptCurrInstr = cmd->nextInstr; + if (!gBattleMons[gBattlerTarget].volatiles.escapePrevention) + { + gBattleMons[gBattlerTarget].volatiles.escapePrevention = TRUE; + gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; + gEffectBattler = gBattlerTarget; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } } -void BS_HandlePrimalReversion(void) +void BS_TrySetTorment(void) { - NATIVE_ARGS(u8 battler, u8 caseId); + NATIVE_ARGS(const u8 *failInstr); - u8 battler = GetBattlerForBattleScript(cmd->battler); - HandleScriptMegaPrimalBurst(cmd->caseId, battler, HANDLE_TYPE_PRIMAL_REVERSION); - gBattlescriptCurrInstr = cmd->nextInstr; + if (!(gBattleMons[gBattlerTarget].volatiles.torment == TRUE) + && !IsAbilityOnSide(gBattlerTarget, ABILITY_AROMA_VEIL)) + { + gBattleMons[gBattlerTarget].volatiles.torment = TRUE; + gDisableStructs[gBattlerTarget].tormentTimer = 3; + gEffectBattler = gBattlerTarget; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } } -void BS_HandleUltraBurst(void) +// Heals one-sixth of the target's HP, including for Dynamaxed targets. +void BS_HealOneSixth(void) { - NATIVE_ARGS(u8 battler, u8 caseId); - - u8 battler = GetBattlerForBattleScript(cmd->battler); - HandleScriptMegaPrimalBurst(cmd->caseId, battler, HANDLE_TYPE_ULTRA_BURST); - gBattlescriptCurrInstr = cmd->nextInstr; + NATIVE_ARGS(const u8* failInstr); + SetHealAmount(gBattlerTarget, gBattleMons[gBattlerTarget].maxHP / 6); + if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) + gBattlescriptCurrInstr = cmd->failInstr; // fail + else + gBattlescriptCurrInstr = cmd->nextInstr; // can heal } -void BS_JumpIfShellTrap(void) +// Recycles the target's item if it is specifically holding a berry. +void BS_TryRecycleBerry(void) { - NATIVE_ARGS(u8 battler, const u8 *jumpInstr); + NATIVE_ARGS(const u8 *failInstr); + u16 *usedHeldItem = &GetBattlerPartyState(gBattlerTarget)->usedHeldItem; + if (gBattleMons[gBattlerTarget].item == ITEM_NONE + && gBattleStruct->changedItems[gBattlerTarget] == ITEM_NONE // Will not inherit an item + && GetItemPocket(*usedHeldItem) == POCKET_BERRIES) + { + gLastUsedItem = *usedHeldItem; + *usedHeldItem = ITEM_NONE; + gBattleMons[gBattlerTarget].item = gLastUsedItem; + + BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); + MarkBattlerForControllerExec(gBattlerTarget); - u8 battler = GetBattlerForBattleScript(cmd->battler); - if (gProtectStructs[battler].shellTrap) - gBattlescriptCurrInstr = cmd->jumpInstr; - else gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } } -void BS_JumpIfElectricAbilityAffected(void) +// Sets up sharp steel on the target's side. +void BS_SetSteelsurge(void) { - NATIVE_ARGS(u8 battler, u16 ability, const u8 *jumpInstr); - u32 battler = GetBattlerForBattleScript(cmd->battler); - - if (IsElectricAbilityAffected(battler, cmd->ability)) - gBattlescriptCurrInstr = cmd->jumpInstr; + NATIVE_ARGS(const u8 *failInstr); + u8 targetSide = GetBattlerSide(gBattlerTarget); + if (IsHazardOnSide(targetSide, HAZARDS_STEELSURGE)) + { + gBattlescriptCurrInstr = cmd->failInstr; + } else + { + PushHazardTypeToQueue(targetSide, HAZARDS_STEELSURGE); gBattlescriptCurrInstr = cmd->nextInstr; + } } -void BS_ApplySaltCure(void) +void BS_JumpIfIntimidateAbilityPrevented(void) { - NATIVE_ARGS(u8 battler); + NATIVE_ARGS(); - u8 battler = GetBattlerForBattleScript(cmd->battler); - gStatuses4[battler] |= STATUS4_SALT_CURE; - gBattlescriptCurrInstr = cmd->nextInstr; + bool32 hasAbility = FALSE; + enum Ability ability = GetBattlerAbility(gBattlerTarget); + + switch (ability) + { + case ABILITY_INNER_FOCUS: + case ABILITY_SCRAPPY: + case ABILITY_OWN_TEMPO: + case ABILITY_OBLIVIOUS: + if (GetConfig(CONFIG_UPDATED_INTIMIDATE) >= GEN_8) + { + hasAbility = TRUE; + gBattlescriptCurrInstr = BattleScript_IntimidatePrevented; + } + else + { + gBattlescriptCurrInstr = cmd->nextInstr; + } + break; + case ABILITY_GUARD_DOG: + hasAbility = TRUE; + gBattlescriptCurrInstr = BattleScript_IntimidateInReverse; + break; + default: + gBattlescriptCurrInstr = cmd->nextInstr; + break; + } + + if (hasAbility) + { + gLastUsedAbility = ability; + gBattlerAbility = gBattlerTarget; + RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); + } } -void BS_JumpIfMovePropertyArgument(void) +void BS_JumpIfCanGigantamax(void) { - NATIVE_ARGS(u8 argument, const u8 *jumpInstr); + NATIVE_ARGS(u8 battler, const u8 *jumpInstr); + u32 battler = GetBattlerForBattleScript(cmd->battler); - if (GetMoveEffectArg_MoveProperty(gCurrentMove) == cmd->argument) + if (GetMonData(GetBattlerMon(battler), MON_DATA_GIGANTAMAX_FACTOR) + && GetGMaxTargetSpecies(gBattleMons[battler].species) != SPECIES_NONE) gBattlescriptCurrInstr = cmd->jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_SetRemoveTerrain(void) +void BS_TryFlingHoldEffect(void) { - NATIVE_ARGS(const u8 *jumpInstr); - u32 statusFlag = 0; + NATIVE_ARGS(); + enum HoldEffect holdEffect = GetItemHoldEffect(gBattleStruct->flingItem); + gBattleStruct->flingItem = ITEM_NONE; - switch (GetMoveEffect(gCurrentMove)) + if (IsMoveEffectBlockedByTarget(GetBattlerAbility(gBattlerTarget))) { - case EFFECT_MISTY_TERRAIN: - statusFlag = STATUS_FIELD_MISTY_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY; + gBattlescriptCurrInstr = BattleScript_FlingBlockedByShieldDust; + return; + } + + switch (holdEffect) + { + case HOLD_EFFECT_FLAME_ORB: + SetMoveEffect(gBattlerAttacker, gBattlerTarget, MOVE_EFFECT_BURN, cmd->nextInstr, NO_FLAGS); break; - case EFFECT_GRASSY_TERRAIN: - statusFlag = STATUS_FIELD_GRASSY_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_GRASSY; + case HOLD_EFFECT_TOXIC_ORB: + SetMoveEffect(gBattlerAttacker, gBattlerTarget, MOVE_EFFECT_TOXIC, cmd->nextInstr, NO_FLAGS); break; - case EFFECT_ELECTRIC_TERRAIN: - statusFlag = STATUS_FIELD_ELECTRIC_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC; + case HOLD_EFFECT_LIGHT_BALL: + SetMoveEffect(gBattlerAttacker, gBattlerTarget, MOVE_EFFECT_PARALYSIS, cmd->nextInstr, NO_FLAGS); break; - case EFFECT_PSYCHIC_TERRAIN: - statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_PSYCHIC; + case HOLD_EFFECT_TYPE_POWER: + if (GetItemSecondaryId(gLastUsedItem) != TYPE_POISON) + gBattlescriptCurrInstr = cmd->nextInstr; + else + SetMoveEffect(gBattlerAttacker, gBattlerTarget, MOVE_EFFECT_POISON, cmd->nextInstr, NO_FLAGS); break; - case EFFECT_HIT_SET_REMOVE_TERRAIN: - switch (GetMoveEffectArg_MoveProperty(gCurrentMove)) - { - case ARG_SET_PSYCHIC_TERRAIN: // Genesis Supernova - statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_PSYCHIC; - break; - case ARG_TRY_REMOVE_TERRAIN_HIT: // Splintered Stormshards - case ARG_TRY_REMOVE_TERRAIN_FAIL: // Steel Roller - if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) - { - // No terrain to remove, jump to battle script pointer. - gBattlescriptCurrInstr = cmd->jumpInstr; - } - else - { - // Remove all terrains. - RemoveAllTerrains(); - gBattlescriptCurrInstr = cmd->nextInstr; - } + case HOLD_EFFECT_FLINCH: + SetMoveEffect(gBattlerAttacker, gBattlerTarget, MOVE_EFFECT_FLINCH, cmd->nextInstr, NO_FLAGS); + break; + case HOLD_EFFECT_MENTAL_HERB: + if (ItemBattleEffects(gBattlerTarget, 0, holdEffect, IsOnFlingActivation)) return; - default: - break; - } + else + gBattlescriptCurrInstr = cmd->nextInstr; + break; + case HOLD_EFFECT_WHITE_HERB: + if (ItemBattleEffects(gBattlerTarget, 0, holdEffect, IsOnFlingActivation)) + return; + else + gBattlescriptCurrInstr = cmd->nextInstr; break; default: + gBattlescriptCurrInstr = cmd->nextInstr; break; } +} - if (gFieldStatuses & statusFlag || statusFlag == 0) - { +void BS_JumpIfNoWhiteOut(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); + + if (FlagGet(B_FLAG_NO_WHITEOUT)) gBattlescriptCurrInstr = cmd->jumpInstr; - } else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_TryBoosterEnergy(void) +{ + NATIVE_ARGS(u8 onFieldStatus); + + for (u32 orderNum = 0; orderNum < gBattlersCount; orderNum++) { - enum ItemHoldEffect atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + u32 battler = gBattlerByTurnOrder[orderNum]; + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); + if (holdEffect != HOLD_EFFECT_BOOSTER_ENERGY) + continue; - gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; - gFieldStatuses |= statusFlag; - gFieldTimers.terrainTimer = gBattleTurnCounter + (atkHoldEffect == HOLD_EFFECT_TERRAIN_EXTENDER) ? 8 : 5; - gBattlescriptCurrInstr = cmd->nextInstr; + enum Ability ability = GetBattlerAbility(battler); + if (!(ability == ABILITY_PROTOSYNTHESIS && cmd->onFieldStatus != ON_TERRAIN) + && !(ability == ABILITY_QUARK_DRIVE && cmd->onFieldStatus != ON_WEATHER)) + continue; + + if (ItemBattleEffects(battler, 0, holdEffect, IsOnEffectActivation)) + return; } + + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_JumpIfTerrainAffected(void) +void BS_JumpIfAbilityCantBeReactivated(void) { - NATIVE_ARGS(u8 battler, u32 flags, const u8 *jumpInstr); + NATIVE_ARGS(u8 battler, const u8 *jumpInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); + u32 ability = gBattleMons[battler].ability; - if (IsBattlerTerrainAffected(battler, cmd->flags)) + switch (ability) + { + case ABILITY_IMPOSTER: + case ABILITY_NEUTRALIZING_GAS: + case ABILITY_AIR_LOCK: + case ABILITY_CLOUD_NINE: gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; + break; + default: + if (gAbilitiesInfo[ability].cantBeSuppressed) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; + break; + } } -void BS_TryReflectType(void) +void BS_TryActivateAbilityShield(void) { - NATIVE_ARGS(const u8 *failInstr); - u16 targetBaseSpecies = GET_BASE_SPECIES_ID(gBattleMons[gBattlerTarget].species); - u32 targetTypes[3]; - GetBattlerTypes(gBattlerTarget, FALSE, targetTypes); + NATIVE_ARGS(u8 battler); + u32 battler = GetBattlerForBattleScript(cmd->battler); + enum Ability ability = GetBattlerAbility(battler); - if (targetBaseSpecies == SPECIES_ARCEUS || targetBaseSpecies == SPECIES_SILVALLY) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (IS_BATTLER_TYPELESS(gBattlerTarget)) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (targetTypes[0] == TYPE_MYSTERY && targetTypes[1] == TYPE_MYSTERY && targetTypes[2] != TYPE_MYSTERY) + gBattlescriptCurrInstr = cmd->nextInstr; + + if (ability != ABILITY_NONE // if ability would be negated by breaking effects Ability Shield doesn't print message + && ability == GetBattlerAbilityInternal(battler, TRUE, TRUE)) + return; + + if (GetBattlerAbilityNoAbilityShield(battler) != ability) { - gBattleMons[gBattlerAttacker].types[0] = TYPE_NORMAL; - gBattleMons[gBattlerAttacker].types[1] = TYPE_NORMAL; - gBattleMons[gBattlerAttacker].types[2] = targetTypes[2]; - gBattlescriptCurrInstr = cmd->nextInstr; + gLastUsedItem = gBattleMons[battler].item; + RecordItemEffectBattle(battler, GetItemHoldEffect(gLastUsedItem)); + BattleScriptCall(BattleScript_AbilityShieldProtects); } - else if (targetTypes[0] == TYPE_MYSTERY && targetTypes[1] != TYPE_MYSTERY) +} + +void BS_TrySynchronoise(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); + bool32 atleastOneSharedType = FALSE; + + for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { - gBattleMons[gBattlerAttacker].types[0] = targetTypes[1]; - gBattleMons[gBattlerAttacker].types[1] = targetTypes[1]; - gBattleMons[gBattlerAttacker].types[2] = targetTypes[2]; - gBattlescriptCurrInstr = cmd->nextInstr; + if (gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_SYNCHRONOISE_AFFECTED + || gBattlerAttacker == battlerDef + || !IsBattlerAlive(battlerDef)) + continue; + + if (DoBattlersShareType(gBattlerAttacker, battlerDef)) + { + atleastOneSharedType = TRUE; + continue; + } + + if (!DoBattlersShareType(gBattlerAttacker, battlerDef)) + { + gBattleScripting.battler = battlerDef; + gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_NO_EFFECT | MOVE_RESULT_SYNCHRONOISE_AFFECTED; + BattleScriptCall(BattleScript_ItDoesntAffectFoe); + return; + } } - else if (targetTypes[0] != TYPE_MYSTERY && targetTypes[1] == TYPE_MYSTERY) - { - gBattleMons[gBattlerAttacker].types[0] = targetTypes[0]; - gBattleMons[gBattlerAttacker].types[1] = targetTypes[0]; - gBattleMons[gBattlerAttacker].types[2] = targetTypes[2]; + + if (atleastOneSharedType) gBattlescriptCurrInstr = cmd->nextInstr; - } else - { - gBattleMons[gBattlerAttacker].types[0] = targetTypes[0]; - gBattleMons[gBattlerAttacker].types[1] = targetTypes[1]; - gBattleMons[gBattlerAttacker].types[2] = targetTypes[2]; + gBattlescriptCurrInstr = cmd->jumpInstr; +} + +void BS_JumpIfRoarFails(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); + + if (WILD_DOUBLE_BATTLE + && IsOnPlayerSide(gBattlerAttacker) + && !IsOnPlayerSide(gBattlerTarget) + && IS_WHOLE_SIDE_ALIVE(gBattlerTarget)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else if (WILD_DOUBLE_BATTLE + && !IsOnPlayerSide(gBattlerAttacker) + && !IsOnPlayerSide(gBattlerTarget)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else if (FlagGet(B_FLAG_NO_RUNNING)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else gBattlescriptCurrInstr = cmd->nextInstr; - } } -void BS_TrySetOctolock(void) +void BS_JumpIfAbsent(void) { - NATIVE_ARGS(u8 battler, const u8 *failInstr); - u32 battler = GetBattlerForBattleScript(cmd->battler); + NATIVE_ARGS(u8 battler, const u8 *jumpInstr); + if (!IsBattlerAlive(GetBattlerForBattleScript(cmd->battler))) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} - if (gDisableStructs[battler].octolock) +void BS_JumpIfHoldEffect(void) +{ + NATIVE_ARGS(u8 battler, u8 holdEffect, const u8 *jumpInstr, u8 equal); + u32 battler = GetBattlerForBattleScript(cmd->battler); + if ((GetBattlerHoldEffect(battler) == cmd->holdEffect) == cmd->equal) { - gBattlescriptCurrInstr = cmd->failInstr; + if (cmd->equal) + gLastUsedItem = gBattleMons[battler].item; // For B_LAST_USED_ITEM + gBattlescriptCurrInstr = cmd->jumpInstr; } else { - gDisableStructs[battler].octolock = TRUE; - gBattleMons[battler].status2 |= STATUS2_ESCAPE_PREVENTION; - gDisableStructs[battler].battlerPreventingEscape = gBattlerAttacker; + if (!cmd->equal) + gLastUsedItem = gBattleMons[battler].item; // For B_LAST_USED_ITEM gBattlescriptCurrInstr = cmd->nextInstr; } } -void BS_SetGlaiveRush(void) +void BS_JumpIfNoAlly(void) { - NATIVE_ARGS(); - gStatuses4[gBattlerAttacker] |= STATUS4_GLAIVE_RUSH; - gBattlescriptCurrInstr = cmd->nextInstr; + NATIVE_ARGS(u8 battler, const u8 *jumpInstr); + u32 partner = BATTLE_PARTNER(GetBattlerForBattleScript(cmd->battler)); + if (!IsBattlerAlive(partner)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; } -// TODO: Convert this to a proper FORM_CHANGE type. -void BS_TryRelicSong(void) +void BS_SetLastUsedItem(void) { - NATIVE_ARGS(); + NATIVE_ARGS(u8 battler); + gLastUsedItem = gBattleMons[GetBattlerForBattleScript(cmd->battler)].item; + gBattleStruct->flingItem = gLastUsedItem; + gBattlescriptCurrInstr = cmd->nextInstr; +} - if (GetBattlerAbility(gBattlerAttacker) != ABILITY_SHEER_FORCE && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_TRANSFORMED) - && (gBattleMons[gBattlerAttacker].species == SPECIES_MELOETTA_ARIA || gBattleMons[gBattlerAttacker].species == SPECIES_MELOETTA_PIROUETTE)) +void BS_TrySetFairyLock(void) +{ + NATIVE_ARGS(const u8 *failInstr); + if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) { - if (gBattleMons[gBattlerAttacker].species == SPECIES_MELOETTA_ARIA) - gBattleMons[gBattlerAttacker].species = SPECIES_MELOETTA_PIROUETTE; - else if (gBattleMons[gBattlerAttacker].species == SPECIES_MELOETTA_PIROUETTE) - gBattleMons[gBattlerAttacker].species = SPECIES_MELOETTA_ARIA; - - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = BattleScript_AttackerFormChangeMoveEffect; + gBattlescriptCurrInstr = cmd->failInstr; } else { + gFieldStatuses |= STATUS_FIELD_FAIRY_LOCK; + gFieldTimers.fairyLockTimer = 2; gBattlescriptCurrInstr = cmd->nextInstr; } } -void BS_SetPledge(void) +void BS_GetStatValue(void) { - NATIVE_ARGS(const u8 *jumpInstr); - - u32 partner = BATTLE_PARTNER(gBattlerAttacker); - u32 partnerMove = gBattleMons[partner].moves[gBattleStruct->chosenMovePositions[partner]]; - u32 i = 0; - u32 k = 0; - - if (gBattleStruct->pledgeMove && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE)) - { - PrepareStringBattle(STRINGID_USEDMOVE, gBattlerAttacker); - gHitMarker |= HITMARKER_ATTACKSTRING_PRINTED; + NATIVE_ARGS(u8 stat); + u32 stat = cmd->stat; + gBattleStruct->passiveHpUpdate[gBattlerAttacker] = *(u16 *)(&gBattleMons[gBattlerTarget].attack) + (stat - 1); + gBattleStruct->passiveHpUpdate[gBattlerAttacker] *= gStatStageRatios[gBattleMons[gBattlerTarget].statStages[stat]][0]; + gBattleStruct->passiveHpUpdate[gBattlerAttacker] /= gStatStageRatios[gBattleMons[gBattlerTarget].statStages[stat]][1]; + gBattlescriptCurrInstr = cmd->nextInstr; +} - if ((gCurrentMove == MOVE_GRASS_PLEDGE && partnerMove == MOVE_WATER_PLEDGE) - || (gCurrentMove == MOVE_WATER_PLEDGE && partnerMove == MOVE_GRASS_PLEDGE)) - { - gCurrentMove = MOVE_GRASS_PLEDGE; - gBattlescriptCurrInstr = BattleScript_EffectCombinedPledge_Grass; - } - else if ((gCurrentMove == MOVE_FIRE_PLEDGE && partnerMove == MOVE_GRASS_PLEDGE) - || (gCurrentMove == MOVE_GRASS_PLEDGE && partnerMove == MOVE_FIRE_PLEDGE)) - { - gCurrentMove = MOVE_FIRE_PLEDGE; - gBattlescriptCurrInstr = BattleScript_EffectCombinedPledge_Fire; - } - else if ((gCurrentMove == MOVE_WATER_PLEDGE && partnerMove == MOVE_FIRE_PLEDGE) - || (gCurrentMove == MOVE_FIRE_PLEDGE && partnerMove == MOVE_WATER_PLEDGE)) - { - gCurrentMove = MOVE_WATER_PLEDGE; - gBattlescriptCurrInstr = BattleScript_EffectCombinedPledge_Water; - } +void BS_JumpIfFullHp(void) +{ + NATIVE_ARGS(u8 battler, const u8 *jumpInstr); + if (IsBattlerAtMaxHp(GetBattlerForBattleScript(cmd->battler))) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} - gBattleCommunication[MSG_DISPLAY] = 0; - } - else if ((gChosenActionByBattler[partner] == B_ACTION_USE_MOVE) - && IsDoubleBattle() - && IsBattlerAlive(partner) - && GetBattlerTurnOrderNum(gBattlerAttacker) < GetBattlerTurnOrderNum(partner) - && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && gCurrentMove != partnerMove - && GetMoveEffect(partnerMove) == EFFECT_PLEDGE) +void BS_TryFriskMessage(void) +{ + NATIVE_ARGS(); + while (gBattleStruct->friskedBattler < gBattlersCount) { - u32 currPledgeUser = 0; - u32 newTurnOrder[] = {0xFF, 0xFF}; - - for (i = 0; i < gBattlersCount; i++) + gBattlerTarget = gBattleStruct->friskedBattler++; + if (!IsBattlerAlly(gBattlerAttacker, gBattlerTarget) + && IsBattlerAlive(gBattlerTarget) + && gBattleMons[gBattlerTarget].item != ITEM_NONE) { - if (gBattlerByTurnOrder[i] == gBattlerAttacker) + gLastUsedItem = gBattleMons[gBattlerTarget].item; + RecordItemEffectBattle(gBattlerTarget, GetBattlerHoldEffectIgnoreNegation(gBattlerTarget)); + // If Frisk identifies two mons' items, show the pop-up only once. + if (gBattleStruct->friskedAbility) { - currPledgeUser = i + 1; // Current battler going after attacker - break; + BattleScriptCall(BattleScript_FriskMsg); } - } - for (i = currPledgeUser; i < gBattlersCount; i++) - { - if (gBattlerByTurnOrder[i] != partner) + else { - newTurnOrder[k] = gBattlerByTurnOrder[i]; - k++; + gBattleStruct->friskedAbility = TRUE; + BattleScriptCall(BattleScript_FriskMsgWithPopup); } + return; } + } + gBattleStruct->friskedBattler = 0; + gBattleStruct->friskedAbility = FALSE; + gBattlescriptCurrInstr = cmd->nextInstr; +} - gBattlerByTurnOrder[currPledgeUser] = partner; - currPledgeUser++; +void BS_SetTracedAbility(void) +{ + NATIVE_ARGS(u8 battler); + u32 battler = GetBattlerForBattleScript(cmd->battler); + gBattleMons[battler].ability = gDisableStructs[battler].overwrittenAbility = gBattleStruct->tracedAbility[battler]; + gBattlescriptCurrInstr = cmd->nextInstr; +} - for (i = 0; newTurnOrder[i] != 0xFF && i < 2; i++) - { - gBattlerByTurnOrder[currPledgeUser] = newTurnOrder[i]; - currPledgeUser++; - } +void BS_TryIllusionOff(void) +{ + NATIVE_ARGS(u8 battler); + if (TryClearIllusion(GetBattlerForBattleScript(cmd->battler), ABILITYEFFECT_MOVE_END)) + return; + gBattlescriptCurrInstr = cmd->nextInstr; +} - gBattleStruct->pledgeMove = TRUE; - gBattleScripting.battler = partner; +void BS_SetSpriteIgnore0Hp(void) +{ + NATIVE_ARGS(bool8 ignore0HP); + gBattleStruct->spriteIgnore0Hp = cmd->ignore0HP; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_UpdateNick(void) +{ + NATIVE_ARGS(); + u32 battler = gBattleScripting.battler; + UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_NICK); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_JumpIfNotBerry(void) +{ + NATIVE_ARGS(u8 battler, const u8 *jumpInstr); + if (GetItemPocket(gBattleMons[GetBattlerForBattleScript(cmd->battler)].item) == POCKET_BERRIES) gBattlescriptCurrInstr = cmd->nextInstr; - } else - { - gBattleStruct->pledgeMove = FALSE; gBattlescriptCurrInstr = cmd->jumpInstr; - } } -void BS_SetPledgeStatus(void) +void BS_GravityOnAirborneMons(void) { - NATIVE_ARGS(u8 battler, u32 sideStatus); + NATIVE_ARGS(); + // Cancel all multiturn moves of IN_AIR Pokemon except those being targeted by Sky Drop. + if (gBattleMons[gBattlerTarget].volatiles.semiInvulnerable == STATE_ON_AIR) + CancelMultiTurnMoves(gBattlerTarget, SKY_DROP_GRAVITY_ON_AIRBORNE); - u32 battler = GetBattlerForBattleScript(cmd->battler); - u32 side = GetBattlerSide(battler); + gBattleMons[gBattlerTarget].volatiles.semiInvulnerable = STATE_NONE; + gBattleMons[gBattlerTarget].volatiles.magnetRise = FALSE; + gBattleMons[gBattlerTarget].volatiles.telekinesis = FALSE; + gBattlescriptCurrInstr = cmd->nextInstr; +} - gBattleStruct->pledgeMove = FALSE; - if (!(gSideStatuses[side] & cmd->sideStatus)) +void BS_TryAcupressure(void) +{ + NATIVE_ARGS(const u8 *failInstr); + u32 bits = 0; + for (enum Stat stat = STAT_ATK; stat < NUM_BATTLE_STATS; stat++) { - gSideStatuses[side] |= cmd->sideStatus; - - switch (cmd->sideStatus) + if (CompareStat(gBattlerTarget, stat, MAX_STAT_STAGE, CMP_LESS_THAN, GetBattlerAbility(gBattlerTarget))) + bits |= 1u << stat; + } + if (bits) + { + u32 statId; + do { - case SIDE_STATUS_RAINBOW: - gSideTimers[side].rainbowTimer = gBattleTurnCounter + 4; - break; - case SIDE_STATUS_SEA_OF_FIRE: - gSideTimers[side].seaOfFireTimer = gBattleTurnCounter + 4; - break; - case SIDE_STATUS_SWAMP: - gSideTimers[side].swampTimer = gBattleTurnCounter + 4; - } + statId = (Random() % (NUM_BATTLE_STATS - 1)) + 1; + } while (!(bits & (1u << statId))); + SET_STATCHANGER(statId, 2, FALSE); gBattlescriptCurrInstr = cmd->nextInstr; } else - gBattlescriptCurrInstr = BattleScript_MoveEnd; + { + gBattlescriptCurrInstr = cmd->failInstr; + } } -void BS_TryTrainerSlideZMoveMsg(void) +void BS_CancelMultiTurnMoves(void) { NATIVE_ARGS(); - s32 shouldSlide; - - if ((shouldSlide = ShouldDoTrainerSlide(gBattlerAttacker, TRAINER_SLIDE_Z_MOVE))) - { - gBattleScripting.battler = gBattlerAttacker; - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = (shouldSlide == 1 ? BattleScript_TrainerASlideMsgRet : BattleScript_TrainerBSlideMsgRet); - } + const u8 *result = CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_CANCEL_MULTI_TURN_MOVES); + if (result) + gBattlescriptCurrInstr = result; else gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TryTrainerSlideMegaEvolutionMsg(void) +void BS_IsRunningImpossible(void) { NATIVE_ARGS(); - s32 shouldSlide; - - if ((shouldSlide = ShouldDoTrainerSlide(gBattlerAttacker, TRAINER_SLIDE_MEGA_EVOLUTION))) - { - gBattleScripting.battler = gBattlerAttacker; - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = (shouldSlide == 1 ? BattleScript_TrainerASlideMsgRet : BattleScript_TrainerBSlideMsgRet); - } - else - gBattlescriptCurrInstr = cmd->nextInstr; + gBattleCommunication[0] = IsRunningFromBattleImpossible(gBattlerAttacker); + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TryTrainerSlideDynamaxMsg(void) +void BS_GetMoveTarget(void) { NATIVE_ARGS(); - s32 shouldSlide; - - if ((shouldSlide = ShouldDoTrainerSlide(gBattleScripting.battler, TRAINER_SLIDE_DYNAMAX))) - { - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = (shouldSlide == 1 ? BattleScript_TrainerASlideMsgRet : BattleScript_TrainerBSlideMsgRet); - } - else - gBattlescriptCurrInstr = cmd->nextInstr; + gBattlerTarget = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TryHealPulse(void) +void BS_GetBattlerFainted(void) { - NATIVE_ARGS(const u8 *failInstr); - - if (IsBattlerAtMaxHp(gBattlerTarget)) - { - gBattlescriptCurrInstr = cmd->failInstr; - } + NATIVE_ARGS(u8 battler); + if (gHitMarker & HITMARKER_FAINTED(GetBattlerForBattleScript(cmd->battler))) + gBattleCommunication[0] = TRUE; else - { - if (GetBattlerAbility(gBattlerAttacker) == ABILITY_MEGA_LAUNCHER && IsPulseMove(gCurrentMove)) - gBattleStruct->moveDamage[gBattlerTarget] = -(GetNonDynamaxMaxHP(gBattlerTarget) * 75 / 100); - else if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && GetMoveEffectArg_MoveProperty(gCurrentMove) == MOVE_EFFECT_FLORAL_HEALING) - gBattleStruct->moveDamage[gBattlerTarget] = -(GetNonDynamaxMaxHP(gBattlerTarget) * 2 / 3); - else - gBattleStruct->moveDamage[gBattlerTarget] = -(GetNonDynamaxMaxHP(gBattlerTarget) / 2); - - if (gBattleStruct->moveDamage[gBattlerTarget] == 0) - gBattleStruct->moveDamage[gBattlerTarget] = -1; - gBattlescriptCurrInstr = cmd->nextInstr; - } + gBattleCommunication[0] = FALSE; + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TryCopycat(void) +void BS_ResetSwitchInAbilityBits(void) { - NATIVE_ARGS(const u8 *failInstr); + NATIVE_ARGS(); + gSpecialStatuses[gBattlerAttacker].switchInAbilityDone = FALSE; + gBattlescriptCurrInstr = cmd->nextInstr; +} - if (gLastUsedMove == MOVE_NONE || gLastUsedMove == MOVE_UNAVAILABLE || IsMoveCopycatBanned(gLastUsedMove) || IsZMove(gLastUsedMove)) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else +void BS_UpdateChoiceMoveOnLvlUp(void) +{ + NATIVE_ARGS(); + if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId || gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId) { - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(gLastUsedMove)) - { - gBattleStruct->zmove.baseMoves[gBattlerAttacker] = gLastUsedMove; - gCalledMove = GetTypeBasedZMove(gLastUsedMove); - } - else if (IsMaxMove(gLastUsedMove)) - { - gCalledMove = gBattleStruct->dynamax.lastUsedBaseMove; - } + u32 battler; + if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId) + battler = 0; else + battler = 2; + + u32 moveIndex; + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - gCalledMove = gLastUsedMove; + if (gBattleMons[battler].moves[moveIndex] == gBattleStruct->choicedMove[battler]) + break; } - - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; - gBattlerTarget = GetBattleMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); - gBattlescriptCurrInstr = cmd->nextInstr; + if (moveIndex == MAX_MON_MOVES) + gBattleStruct->choicedMove[battler] = MOVE_NONE; } + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TryDefog(void) +void BS_ResetPlayerFainted(void) { - NATIVE_ARGS(u8 clear, const u8 *failInstr); - - if (cmd->clear) + NATIVE_ARGS(); + if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE)) + && gBattleTypeFlags & BATTLE_TYPE_TRAINER + && IsBattlerAlive(B_POSITION_PLAYER_LEFT) + && IsBattlerAlive(B_POSITION_OPPONENT_LEFT)) { - if (TryDefogClear(gEffectBattler, TRUE)) - return; - else - gBattlescriptCurrInstr = cmd->nextInstr; + gHitMarker &= ~HITMARKER_PLAYER_FAINTED; } - else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_PalaceFlavorText(void) +{ + NATIVE_ARGS(); + // Try and print end-of-turn Battle Palace flavor text (e.g. "A glint appears in mon's eyes") + u32 battler; + gBattleCommunication[0] = FALSE; // whether or not msg should be printed + gBattleScripting.battler = battler = gBattleCommunication[1]; + if (!(gBattleStruct->palaceFlags & (1u << battler)) + && gBattleMons[battler].maxHP / 2 >= gBattleMons[battler].hp + && IsBattlerAlive(battler) + && !(gBattleMons[battler].status1 & STATUS1_SLEEP)) { - if (TryDefogClear(gBattlerAttacker, FALSE)) - gBattlescriptCurrInstr = cmd->nextInstr; - else - gBattlescriptCurrInstr = cmd->failInstr; + gBattleStruct->palaceFlags |= 1u << battler; + gBattleCommunication[0] = TRUE; + gBattleCommunication[MULTISTRING_CHOOSER] = gNaturesInfo[GetNatureFromPersonality(gBattleMons[battler].personality)].battlePalaceFlavorText; } + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TryUpperHand(void) +void BS_ArenaJudgmentWindow(void) { - NATIVE_ARGS(const u8 *failInstr); + NATIVE_ARGS(); + u32 judgmentWindow = BattleArena_ShowJudgmentWindow(&gBattleCommunication[0]); - u32 abilityDef = GetBattlerAbility(gBattlerTarget); - u32 prio = GetChosenMovePriority(gBattlerTarget, abilityDef); + // BattleArena_ShowJudgmentWindow's last state was an intermediate step. + // Return without advancing the current instruction so that it will be called again. + if (judgmentWindow == ARENA_RESULT_RUNNING) + return; - if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget) - || gChosenMoveByBattler[gBattlerTarget] == MOVE_NONE - || IsBattleMoveStatus(gChosenMoveByBattler[gBattlerTarget]) - || prio < 1 - || prio > 3) // Fails if priority is less than 1 or greater than 3, if target already moved, or if using a status - gBattlescriptCurrInstr = cmd->failInstr; + gBattleCommunication[1] = judgmentWindow; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void SetArenMonLostValues(u32 battler, u32 side) +{ + gBattleMons[battler].hp = 0; + gHitMarker |= HITMARKER_FAINTED(battler); + if (side == B_SIDE_PLAYER) + gBattleStruct->arenaLostPlayerMons |= 1u << gBattlerPartyIndexes[battler]; else - gBattlescriptCurrInstr = cmd->nextInstr; + gBattleStruct->arenaLostOpponentMons |= 1u << gBattlerPartyIndexes[battler]; + gDisableStructs[battler].truantSwitchInHack = TRUE; } -void BS_TryTriggerStatusForm(void) +#define playerMon 0 +#define opponentMon 1 +void BS_ArenaOpponentMonLost(void) { NATIVE_ARGS(); - if (TryBattleFormChange(gBattlerTarget, FORM_CHANGE_STATUS)) - { - gBattleScripting.battler = gBattlerTarget; - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = BattleScript_TargetFormChangeWithStringNoPopup; - return; - } + SetArenMonLostValues(opponentMon, B_SIDE_OPPONENT); gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_AllySwitchSwapBattler(void) +void BS_ArenaPlayerMonLost(void) { NATIVE_ARGS(); - - gBattleScripting.battler = gBattlerAttacker; - gBattlerAttacker ^= BIT_FLANK; - gProtectStructs[gBattlerAttacker].usedAllySwitch = TRUE; + SetArenMonLostValues(playerMon, B_SIDE_PLAYER); gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TryAllySwitch(void) +void BS_ArenaBothMonsLost(void) { - NATIVE_ARGS(const u8 *failInstr); - - if (!IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker)) - || (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) - || (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (B_ALLY_SWITCH_FAIL_CHANCE >= GEN_9) - { - TryResetProtectUseCounter(gBattlerAttacker); - if (sProtectSuccessRates[gDisableStructs[gBattlerAttacker].protectUses] < Random()) - { - gDisableStructs[gBattlerAttacker].protectUses = 0; - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - gDisableStructs[gBattlerAttacker].protectUses++; - gBattlescriptCurrInstr = cmd->nextInstr; - } - } - else - { - gBattlescriptCurrInstr = cmd->nextInstr; - } + NATIVE_ARGS(); + SetArenMonLostValues(playerMon, B_SIDE_PLAYER); + SetArenMonLostValues(opponentMon, B_SIDE_OPPONENT); + gBattlescriptCurrInstr = cmd->nextInstr; } +#undef playerMon +#undef opponentMon -void BS_RunStatChangeItems(void) +void BS_ForfeitYesNoBox(void) { - NATIVE_ARGS(u8 battler); - - // Change instruction before calling ItemBattleEffects. + NATIVE_ARGS(); + BtlController_EmitYesNoBox(gBattlerAttacker, B_COMM_TO_CONTROLLER); + MarkBattlerForControllerExec(gBattlerAttacker); gBattlescriptCurrInstr = cmd->nextInstr; - ItemBattleEffects(ITEMEFFECT_STATS_CHANGED, GetBattlerForBattleScript(cmd->battler), FALSE); } -static void TryUpdateEvolutionTracker(u32 evolutionCondition, u32 upAmount, u16 usedMove) +void BS_DrawArenaRefTextBox(void) { - u32 i, j; - - if (IsOnPlayerSide(gBattlerAttacker) - && !(gBattleTypeFlags & (BATTLE_TYPE_LINK - | BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_RECORDED_LINK - | BATTLE_TYPE_TRAINER_HILL - | BATTLE_TYPE_FRONTIER))) - { - const struct Evolution *evolutions = GetSpeciesEvolutions(gBattleMons[gBattlerAttacker].species); - if (evolutions == NULL) - return; + NATIVE_ARGS(); + DrawArenaRefereeTextBox(); + gBattlescriptCurrInstr = cmd->nextInstr; +} - for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) - { - if (SanitizeSpeciesId(evolutions[i].targetSpecies) == SPECIES_NONE) - continue; - if (evolutions[i].params == NULL) - continue; +void BS_EraseArenaRefTextBox(void) +{ + NATIVE_ARGS(); + EraseArenaRefereeTextBox(); + gBattlescriptCurrInstr = cmd->nextInstr; +} - for (j = 0; evolutions[i].params[j].condition != CONDITIONS_END; j++) - { - if (evolutions[i].params[j].condition == evolutionCondition) - { - // We only have 10 bits to use - u16 val = min(1023, GetMonData(GetBattlerMon(gBattlerAttacker), MON_DATA_EVOLUTION_TRACKER) + upAmount); - // Reset progress if you faint for the recoil method. - switch (evolutionCondition) - { - case IF_USED_MOVE_X_TIMES: - if (evolutions[i].params[j].arg1 == usedMove) - SetMonData(GetBattlerMon(gBattlerAttacker), MON_DATA_EVOLUTION_TRACKER, &val); - break; - case IF_RECOIL_DAMAGE_GE: - if (gBattleMons[gBattlerAttacker].hp == 0) - val = 0; - SetMonData(GetBattlerMon(gBattlerAttacker), MON_DATA_EVOLUTION_TRACKER, &val); - break; - case IF_DEFEAT_X_WITH_ITEMS: - if (GetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_SPECIES) == evolutions[i].params[j].arg1 - && GetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_HELD_ITEM) == evolutions[i].params[j].arg2) - SetMonData(GetBattlerMon(gBattlerAttacker), MON_DATA_EVOLUTION_TRACKER, &val); - break; - } - return; - } - } - } - } +void BS_ArenaJudgmentString(void) +{ + NATIVE_ARGS(u8 id); + BattleStringExpandPlaceholdersToDisplayedString(gRefereeStringsTable[cmd->id]); + BattlePutTextOnWindow(gDisplayedStringBattle, ARENA_WIN_JUDGMENT_TEXT); + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TryUpdateRecoilTracker(void) +void BS_ArenaWaitMessage(void) { NATIVE_ARGS(); - TryUpdateEvolutionTracker(IF_RECOIL_DAMAGE_GE, gBattleStruct->moveDamage[gBattlerAttacker], MOVE_NONE); + if (IsTextPrinterActive(ARENA_WIN_JUDGMENT_TEXT)) + return; gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TryUpdateLeadersCrestTracker(void) +void BS_WaitCry(void) { NATIVE_ARGS(); - TryUpdateEvolutionTracker(IF_DEFEAT_X_WITH_ITEMS, 1, MOVE_NONE); + if (!IsCryFinished()) + return; gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TryTidyUp(void) +#define opponentFirstBattler 1 +#define opponentSecondBattler 3 +void BS_ReturnOpponentMon1ToBall(void) { - NATIVE_ARGS(u8 clear, const u8 *jumpInstr); - - if (cmd->clear) + NATIVE_ARGS(); + if (IsBattlerAlive(opponentFirstBattler)) { - if (TryTidyUpClear(gEffectBattler, TRUE)) - return; - else - gBattlescriptCurrInstr = cmd->nextInstr; + BtlController_EmitReturnMonToBall(opponentFirstBattler, B_COMM_TO_CONTROLLER, FALSE); + MarkBattlerForControllerExec(opponentFirstBattler); } - else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_ReturnOpponentMon2ToBall(void) +{ + NATIVE_ARGS(); + if (gBattlersCount > opponentSecondBattler) { - if (TryTidyUpClear(gBattlerAttacker, FALSE)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; + if (IsBattlerAlive(opponentSecondBattler)) + { + BtlController_EmitReturnMonToBall(opponentSecondBattler, B_COMM_TO_CONTROLLER, FALSE); + MarkBattlerForControllerExec(opponentSecondBattler); + } } + gBattlescriptCurrInstr = cmd->nextInstr; } +#undef opponentFirstBattler +#undef opponentSecondBattler -void BS_TryGulpMissile(void) +void BS_VolumeDown(void) { NATIVE_ARGS(); - - if ((gBattleMons[gBattlerAttacker].species == SPECIES_CRAMORANT) - && (gCurrentMove == MOVE_DIVE) - && (GetBattlerAbility(gBattlerAttacker) == ABILITY_GULP_MISSILE) - && TryBattleFormChange(gBattlerAttacker, FORM_CHANGE_BATTLE_HP_PERCENT)) - gBattlescriptCurrInstr = BattleScript_GulpMissileFormChange; - else - gBattlescriptCurrInstr = cmd->nextInstr; + m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x55); + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TryActivateGulpMissile(void) +void BS_VolumeUp(void) { NATIVE_ARGS(); - - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && IsBattlerAlive(gBattlerAttacker) - && IsBattlerTurnDamaged(gBattlerTarget) - && gBattleMons[gBattlerTarget].species != SPECIES_CRAMORANT - && GetBattlerAbility(gBattlerTarget) == ABILITY_GULP_MISSILE) - { - if (GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) - { - gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; - if (gBattleStruct->moveDamage[gBattlerTarget] == 0) - gBattleStruct->moveDamage[gBattlerTarget] = 1; - } - - switch(gBattleMons[gBattlerTarget].species) - { - case SPECIES_CRAMORANT_GORGING: - BattleScriptPushCursor(); - TryBattleFormChange(gBattlerTarget, FORM_CHANGE_HIT_BY_MOVE); - gBattlescriptCurrInstr = BattleScript_GulpMissileGorging; - return; - case SPECIES_CRAMORANT_GULPING: - BattleScriptPushCursor(); - TryBattleFormChange(gBattlerTarget, FORM_CHANGE_HIT_BY_MOVE); - gBattlescriptCurrInstr = BattleScript_GulpMissileGulping; - return; - } - } + m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TryQuash(void) +void BS_SetAlreadyStatusedMoveAttempt(void) { - NATIVE_ARGS(const u8 *failInstr); - u32 i, j; + NATIVE_ARGS(); + gBattleStruct->battlerState[gBattlerAttacker].alreadyStatusedMoveAttempt = TRUE; + gBattlescriptCurrInstr = cmd->nextInstr; +} - // It's true if foe is faster, has a bigger priority, or switches - if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) - { - gBattlescriptCurrInstr = cmd->failInstr; +void BS_PalaceTryEscapeStatus(void) +{ + NATIVE_ARGS(); + if (BattlePalace_TryEscapeStatus(gBattlerAttacker)) return; - } - - // If the above condition is not true, it means we are faster than the foe, so we can set the quash bit - gProtectStructs[gBattlerTarget].quash = TRUE; - - // this implementation assumes turn order is correct when using Quash - i = GetBattlerTurnOrderNum(gBattlerTarget); - for (j = i + 1; j < gBattlersCount; j++) - { - // Gen 7- config makes target go last so that the order of quash targets is kept for the correct turn order - // Gen 8+ config alters Turn Order of the target according to speed, dynamic speed should handle the rest - if (B_QUASH_TURN_ORDER < GEN_8 || GetWhichBattlerFaster(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], FALSE) == -1) - SwapTurnOrder(i, j); - else - break; - i++; - } gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_CopyFoesStatIncrease(void) +void BS_SetTeleportOutcome(void) { - NATIVE_ARGS(u8 battler, const u8 *jumpInstr); - u32 stat = 0; + NATIVE_ARGS(u8 battler); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (gQueuedStatBoosts[battler].stats == 0) + // Don't end the battle if one of the wild mons teleported from the wild double battle + // and its partner is still alive. + if (!IsOnPlayerSide(battler) && IsBattlerAlive(BATTLE_PARTNER(battler))) { - for (stat = 0; stat < (NUM_BATTLE_STATS - 1); stat++) - { - if (gQueuedStatBoosts[battler].statChanges[stat] != 0) - gQueuedStatBoosts[battler].stats |= (1 << stat); - } - gBattlescriptCurrInstr = cmd->jumpInstr; - return; + gAbsentBattlerFlags |= 1u << battler; + gHitMarker |= HITMARKER_FAINTED(battler); + gBattleMons[battler].hp = 0; + SetMonData(GetBattlerMon(battler), MON_DATA_HP, &gBattleMons[battler].hp); + SetHealthboxSpriteInvisible(gHealthboxSpriteIds[battler]); + FaintClearSetData(battler); } - - for (stat = 0; stat < (NUM_BATTLE_STATS - 1); stat++) + else if (IsOnPlayerSide(battler)) { - if (gQueuedStatBoosts[battler].stats & (1 << stat)) - { - if (gQueuedStatBoosts[battler].statChanges[stat] <= -1) - SET_STATCHANGER(stat + 1, abs(gQueuedStatBoosts[battler].statChanges[stat]), TRUE); - else - SET_STATCHANGER(stat + 1, gQueuedStatBoosts[battler].statChanges[stat], FALSE); - - gQueuedStatBoosts[battler].stats &= ~(1 << stat); - gBattlerTarget = battler; - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } + gBattleOutcome = B_OUTCOME_PLAYER_TELEPORTED; } - gBattlescriptCurrInstr = cmd->jumpInstr; + else + { + gBattleOutcome = B_OUTCOME_MON_TELEPORTED; + } + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_RemoveWeather(void) +void BS_PlayTrainerDefeatedMusic(void) { NATIVE_ARGS(); - RemoveAllWeather(); + BtlController_EmitPlayFanfareOrBGM(gBattlerAttacker, B_COMM_TO_CONTROLLER, MUS_VICTORY_TRAINER, TRUE); + MarkBattlerForControllerExec(gBattlerAttacker); gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_ApplyTerastallization(void) +void BS_StatTextBuffer(void) { NATIVE_ARGS(); - ApplyBattlerVisualsForTeraAnim(gBattlerAttacker); + PREPARE_STAT_BUFFER(gBattleTextBuff1, gBattleCommunication[0]); gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_DamageToQuarterTargetHP(void) +void BS_SwitchinAbilities(void) { - NATIVE_ARGS(); - gBattleStruct->moveDamage[gBattlerTarget] = (3 * GetNonDynamaxHP(gBattlerTarget)) / 4; - if (gBattleStruct->moveDamage[gBattlerTarget] == 0) - gBattleStruct->moveDamage[gBattlerTarget] = 1; - + NATIVE_ARGS(u8 battler); + u32 battler = GetBattlerForBattleScript(cmd->battler); gBattlescriptCurrInstr = cmd->nextInstr; + AbilityBattleEffects(ABILITYEFFECT_NEUTRALIZINGGAS, battler, 0, 0, 0); + AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, battler, 0, 0, 0); + AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, battler, 0, 0, 0); + AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, battler, 0, 0, 0); + + if (gBattleWeather & B_WEATHER_ANY && HasWeatherEffect()) + AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, battler, 0, 0, 0); + + if (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) + AbilityBattleEffects(ABILITYEFFECT_ON_TERRAIN, battler, 0, 0, 0); } -void BS_JumpIfSleepClause(void) +void BS_InstantHpDrop(void) { - NATIVE_ARGS(const u8 *jumpInstr); + NATIVE_ARGS(); + BtlController_EmitHealthBarUpdate(gBattlerAttacker, B_COMM_TO_CONTROLLER, INSTANT_HP_BAR_DROP); + MarkBattlerForControllerExec(gBattlerAttacker); + gBattlescriptCurrInstr = cmd->nextInstr; +} - // Can freely sleep own partner - if (IsDoubleBattle() && IsSleepClauseEnabled() && IsBattlerAlly(gBattlerAttacker, gBattlerTarget)) - { - gBattleStruct->battlerState[gBattlerTarget].sleepClauseEffectExempt = TRUE; - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - gBattleStruct->battlerState[gBattlerTarget].sleepClauseEffectExempt = FALSE; - // Can't sleep if clause is active otherwise - if (IsSleepClauseActiveForSide(GetBattlerSide(gBattlerTarget))) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; +void BS_ClearStatus(void) +{ + NATIVE_ARGS(); + gBattleMons[gBattlerAttacker].status1 = 0; + BtlController_EmitSetMonData( + gBattlerAttacker, + B_COMM_TO_CONTROLLER, + REQUEST_STATUS_BATTLE, + 0, + sizeof(gBattleMons[gBattlerAttacker].status1), + &gBattleMons[gBattlerAttacker].status1); + MarkBattlerForControllerExec(gBattlerAttacker); + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_FickleBeamDamageCalculation(void) +// NEW BATCH + +void BS_RestoreMovePp(void) { NATIVE_ARGS(); - gBattleStruct->fickleBeamBoosted = FALSE; - - if (RandomPercentage(RNG_FICKLE_BEAM, 30)) - { - gBattleStruct->fickleBeamBoosted = TRUE; - gBattlescriptCurrInstr = BattleScript_FickleBeamDoubled; - } - else + u32 moveIndex; + u32 data[MAX_MON_MOVES + 1]; + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - gBattlescriptCurrInstr = cmd->nextInstr; + gBattleMons[gBattlerAttacker].pp[moveIndex] = CalculatePPWithBonus(gBattleMons[gBattlerAttacker].moves[moveIndex], gBattleMons[gBattlerAttacker].ppBonuses, moveIndex); + data[moveIndex] = gBattleMons[gBattlerAttacker].pp[moveIndex]; } + data[moveIndex] = gBattleMons[gBattlerAttacker].ppBonuses; + BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_PP_DATA_BATTLE, 0, 5, data); + MarkBattlerForControllerExec(gBattlerAttacker); + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TryTarShot(void) +void BS_TryActivateReceiver(void) { - NATIVE_ARGS(const u8 *failInstr); - if (gDisableStructs[gBattlerTarget].tarShot || GetActiveGimmick(gBattlerTarget) == GIMMICK_TERA) - { - gBattlescriptCurrInstr = cmd->failInstr; + NATIVE_ARGS(u8 battler); + u32 battler = GetBattlerForBattleScript(cmd->battler); + gBattlerAbility = BATTLE_PARTNER(battler); + u32 partnerAbility = GetBattlerAbility(gBattlerAbility); + if (IsBattlerAlive(gBattlerAbility) + && (partnerAbility == ABILITY_RECEIVER || partnerAbility == ABILITY_POWER_OF_ALCHEMY) + && GetBattlerHoldEffectIgnoreAbility(battler) != HOLD_EFFECT_ABILITY_SHIELD + && !gAbilitiesInfo[gBattleMons[battler].ability].cantBeCopied) + { + gBattleStruct->tracedAbility[gBattlerAbility] = gBattleMons[battler].ability; // re-using the variable for trace + gBattleScripting.battler = battler; + BattleScriptPush(cmd->nextInstr); + gBattlescriptCurrInstr = BattleScript_ReceiverActivates; } else { - gDisableStructs[gBattlerTarget].tarShot = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; } } -void BS_CanTarShotWork(void) +void BS_TryActivateSoulheart(void) +{ + NATIVE_ARGS(); + while (gBattleStruct->soulheartBattlerId < gBattlersCount) + { + gBattleScripting.battler = gBattleStruct->soulheartBattlerId++; + u32 ability = GetBattlerAbility(gBattleScripting.battler); + if (ability == ABILITY_SOUL_HEART + && IsBattlerAlive(gBattleScripting.battler) + && !NoAliveMonsForEitherParty() + && CompareStat(gBattleScripting.battler, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN, ability)) + { + SET_STATCHANGER(STAT_SPATK, 1, FALSE); + PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK); + BattleScriptCall(BattleScript_ScriptingAbilityStatRaise); + return; + } + } + gBattleStruct->soulheartBattlerId = 0; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_PlayMoveAnimation(void) +{ + NATIVE_ARGS(u16 move); + BtlController_EmitMoveAnimation( + gBattlerAttacker, + B_COMM_TO_CONTROLLER, + cmd->move, + gBattleScripting.animTurn, + 0, + 0, + gBattleMons[gBattlerAttacker].friendship, + &gDisableStructs[gBattlerAttacker], + gMultiHitCounter); + MarkBattlerForControllerExec(gBattlerAttacker); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_SetLuckyChant(void) { NATIVE_ARGS(const u8 *failInstr); - // Tar Shot will fail if it's already been used on the target or if its speed can't be lowered further - if (!gDisableStructs[gBattlerTarget].tarShot - && CompareStat(gBattlerTarget, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN)) + u32 side = GetBattlerSide(gBattlerAttacker); + if (!(gSideStatuses[side] & SIDE_STATUS_LUCKY_CHANT)) + { + gSideStatuses[side] |= SIDE_STATUS_LUCKY_CHANT; + gSideTimers[side].luckyChantTimer = 5; gBattlescriptCurrInstr = cmd->nextInstr; + } else + { gBattlescriptCurrInstr = cmd->failInstr; + } } -void BS_JumpIfBlockedBySoundproof(void) +void BS_TryEntrainment(void) { - NATIVE_ARGS(u8 battler, const u8 *jumpInstr); - u32 battler = GetBattlerForBattleScript(cmd->battler); - if (IsSoundMove(gCurrentMove) && GetBattlerAbility(battler) == ABILITY_SOUNDPROOF) + NATIVE_ARGS(const u8 *failInstr); + if (gAbilitiesInfo[gBattleMons[gBattlerAttacker].ability].cantBeCopied + || gAbilitiesInfo[gBattleMons[gBattlerTarget].ability].cantBeOverwritten) { - gLastUsedAbility = ABILITY_SOUNDPROOF; - gBattlescriptCurrInstr = cmd->jumpInstr; - RecordAbilityBattle(battler, gLastUsedAbility); - gBattlerAbility = battler; + RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability); + gBattlescriptCurrInstr = cmd->failInstr; + } + else if (CanAbilityShieldActivateForBattler(gBattlerTarget)) + { + gBattlescriptCurrInstr = BattleScript_MoveEnd; + BattleScriptCall(BattleScript_AbilityShieldProtects); } else { - gBattlescriptCurrInstr = cmd->nextInstr; + if (gBattleMons[gBattlerTarget].ability == gBattleMons[gBattlerAttacker].ability + || (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX)) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + RemoveAbilityFlags(gBattlerTarget); + gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = gBattleMons[gBattlerAttacker].ability; + gBattlescriptCurrInstr = cmd->nextInstr; + } } } -void BS_SetMagicCoatTarget(void) +void BS_SetLastUsedAbility(void) { NATIVE_ARGS(); - gBattleStruct->attackerBeforeBounce = gBattleScripting.battler = gBattlerAttacker; - gBattlerAttacker = gBattlerTarget; - gBattlerTarget = gBattleStruct->attackerBeforeBounce; - HandleMoveTargetRedirection(); - + gLastUsedAbility = gBattleMons[gBattlerTarget].ability; gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TeatimeInvul(void) +void BS_InvertStatStages(void) { - NATIVE_ARGS(u8 battler, const u8 *jumpInstr); - - u32 battler = GetBattlerForBattleScript(cmd->battler); - if (GetItemPocket(gBattleMons[battler].item) == POCKET_BERRIES && !(gStatuses3[gBattlerTarget] & (STATUS3_SEMI_INVULNERABLE))) - gBattlescriptCurrInstr = cmd->nextInstr; - else - gBattlescriptCurrInstr = cmd->jumpInstr; + NATIVE_ARGS(); + for (u32 i = 0; i < NUM_BATTLE_STATS; i++) + { + if (gBattleMons[gBattlerTarget].statStages[i] < DEFAULT_STAT_STAGE) // Negative becomes positive. + gBattleMons[gBattlerTarget].statStages[i] = DEFAULT_STAT_STAGE + (DEFAULT_STAT_STAGE - gBattleMons[gBattlerTarget].statStages[i]); + else if (gBattleMons[gBattlerTarget].statStages[i] > DEFAULT_STAT_STAGE) // Positive becomes negative. + gBattleMons[gBattlerTarget].statStages[i] = DEFAULT_STAT_STAGE - (gBattleMons[gBattlerTarget].statStages[i] - DEFAULT_STAT_STAGE); + } + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TeatimeTargets(void) +void BS_TryElectrify(void) { NATIVE_ARGS(const u8 *failInstr); - u32 count = 0, i; - - for (i = 0; i < gBattlersCount; i++) + if (HasBattlerActedThisTurn(gBattlerTarget)) { - if (IsTeatimeAffected(i)) - count++; - } - if (count == 0) gBattlescriptCurrInstr = cmd->failInstr; + } else + { + gBattleMons[gBattlerTarget].volatiles.electrified = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; + } } -void BS_TryWindRiderPower(void) +void BS_TrySoak(void) { - NATIVE_ARGS(u8 battler, const u8 *failInstr); - - u32 battler = GetBattlerForBattleScript(cmd->battler); - u16 ability = GetBattlerAbility(battler); - if (IsBattlerAlly(battler, gBattlerAttacker) - && (ability == ABILITY_WIND_RIDER || ability == ABILITY_WIND_POWER)) + NATIVE_ARGS(const u8 *failInstr); + enum Type types[3]; + GetBattlerTypes(gBattlerTarget, FALSE, types); + enum Type typeToSet = GetMoveArgType(gCurrentMove); + if ((types[0] == typeToSet && types[1] == typeToSet) + || GetActiveGimmick(gBattlerTarget) == GIMMICK_TERA) { - gLastUsedAbility = ability; - RecordAbilityBattle(battler, gLastUsedAbility); - gBattlerAbility = gBattleScripting.battler = battler; - gBattlescriptCurrInstr = cmd->nextInstr; + gBattlescriptCurrInstr = cmd->failInstr; } else { - gBattlescriptCurrInstr = cmd->failInstr; + SET_BATTLER_TYPE(gBattlerTarget, typeToSet); + PREPARE_TYPE_BUFFER(gBattleTextBuff1, typeToSet); + gBattlescriptCurrInstr = cmd->nextInstr; } } -void BS_ActivateWeatherChangeAbilities(void) +void BS_HandleFormChange(void) { - NATIVE_ARGS(u8 battler); - + NATIVE_ARGS(u8 battler, u8 case_); u32 battler = GetBattlerForBattleScript(cmd->battler); - gBattlescriptCurrInstr = cmd->nextInstr; - AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, battler, 0, 0, 0); -} - -void BS_ActivateTerrainChangeAbilities(void) -{ - NATIVE_ARGS(u8 battler); + struct Pokemon *mon = GetBattlerMon(battler); - u32 battler = GetBattlerForBattleScript(cmd->battler); + if (cmd->case_ == 0) // Change species. + { + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_SPECIES_BATTLE, 1u << gBattlerPartyIndexes[battler], sizeof(gBattleMons[battler].species), &gBattleMons[battler].species); + MarkBattlerForControllerExec(battler); + } + else if (cmd->case_ == 1) // Change stats. + { + RecalcBattlerStats(battler, mon, FALSE); + } + else // Update healthbox. + { + UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], mon, HEALTHBOX_ALL); + } gBattlescriptCurrInstr = cmd->nextInstr; - AbilityBattleEffects(ABILITYEFFECT_ON_TERRAIN, battler, 0, 0, 0); } -void BS_StoreHealingWish(void) +void BS_TryAutotomize(void) { - NATIVE_ARGS(u8 battler); - - u32 battler = GetBattlerForBattleScript(cmd->battler); - if (gCurrentMove == MOVE_LUNAR_DANCE) - gBattleStruct->battlerState[battler].storedLunarDance = TRUE; + NATIVE_ARGS(const u8 *failInstr); + if (GetBattlerWeight(gBattlerAttacker) > 1) + { + gDisableStructs[gBattlerAttacker].autotomizeCount++; + gBattlescriptCurrInstr = cmd->nextInstr; + } else - gBattleStruct->battlerState[battler].storedHealingWish = TRUE; - gBattlescriptCurrInstr = cmd->nextInstr; + { + gBattlescriptCurrInstr = cmd->failInstr; + } } -void BS_TryRevivalBlessing(void) +void BS_TryInstruct(void) { NATIVE_ARGS(const u8 *failInstr); - u8 index = GetFirstFaintedPartyIndex(gBattlerAttacker); - - // Move fails if there are no battlers to revive. - if (index == PARTY_SIZE) + u16 move = gLastPrintedMoves[gBattlerTarget]; + if (move == MOVE_NONE || move == MOVE_UNAVAILABLE || MoveHasAdditionalEffectSelf(move, MOVE_EFFECT_RECHARGE) + || IsMoveInstructBanned(move) + || gBattleMoveEffects[GetMoveEffect(move)].twoTurnEffect + || (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) + || IsZMove(move) + || IsMaxMove(move)) { gBattlescriptCurrInstr = cmd->failInstr; - return; } - - // Battler selected! Revive and go to next instruction. - if (gSelectedMonPartyId != PARTY_SIZE) + else { - struct Pokemon *party = GetBattlerParty(gBattlerAttacker); - - u16 hp = GetMonData(&party[gSelectedMonPartyId], MON_DATA_MAX_HP) / 2; - BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_HP_BATTLE, 1u << gSelectedMonPartyId, sizeof(hp), &hp); - MarkBattlerForControllerExec(gBattlerAttacker); - PREPARE_SPECIES_BUFFER(gBattleTextBuff1, GetMonData(&party[gSelectedMonPartyId], MON_DATA_SPECIES)); - - // If an on-field battler is revived, it needs to be sent out again. - if (IsDoubleBattle() && - gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerAttacker)] == gSelectedMonPartyId) + gSpecialStatuses[gBattlerTarget].instructedChosenTarget = gBattleStruct->moveTarget[gBattlerTarget] | 0x4; + gCalledMove = move; + u32 moveIndex; + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - u32 i = BATTLE_PARTNER(gBattlerAttacker); - gAbsentBattlerFlags &= ~(1u << i); - gBattleStruct->monToSwitchIntoId[i] = gSelectedMonPartyId; - gBattleScripting.battler = i; - gBattleCommunication[MULTIUSE_STATE] = TRUE; + if (gBattleMons[gBattlerTarget].moves[moveIndex] == gCalledMove) + { + gCurrMovePos = moveIndex; + moveIndex = MAX_MON_MOVES; + break; + } + } + if (moveIndex != MAX_MON_MOVES || gBattleMons[gBattlerTarget].pp[gCurrMovePos] == 0) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + gBattleScripting.battler = gBattlerAttacker; // for message + gEffectBattler = gBattleStruct->lastMoveTarget[gBattlerTarget]; + gBattlescriptCurrInstr = cmd->nextInstr; } - - gSelectedMonPartyId = PARTY_SIZE; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - // Open party menu, wait to go to next instruction. - BtlController_EmitChoosePokemon(gBattlerAttacker, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_FAINTED_MON, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gBattlerAttacker]); - MarkBattlerForControllerExec(gBattlerAttacker); } } -void BS_JumpIfCommanderActive(void) +void BS_ShowAbilityPopup(void) { - NATIVE_ARGS(const u8 *jumpInstr); + NATIVE_ARGS(); + CreateAbilityPopUp(gBattlerAbility, gBattleMons[gBattlerAbility].ability, (IsDoubleBattle()) != 0); + gBattlescriptCurrInstr = cmd->nextInstr; +} - if (gBattleStruct->commanderActive[gBattlerTarget] != SPECIES_NONE) - gBattlescriptCurrInstr = cmd->jumpInstr; - else if (gStatuses3[gBattlerTarget] & STATUS3_COMMANDER) - gBattlescriptCurrInstr = cmd->jumpInstr; - else +void BS_UpdateAbilityPopup(void) +{ + NATIVE_ARGS(); + UpdateAbilityPopup(gBattlerAbility); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_JumpIfTargetAlly(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); + if (!IsBattlerAlly(gBattlerAttacker, gBattlerTarget)) gBattlescriptCurrInstr = cmd->nextInstr; + else + gBattlescriptCurrInstr = cmd->jumpInstr; } -static void UpdatePokeFlutePartyStatus(struct Pokemon* party, u8 position) +void BS_TryPsychoShift(void) { - s32 i; - u8 battler; - u32 monToCheck, status; - u16 species, abilityNum; - monToCheck = 0; - for (i = 0; i < PARTY_SIZE; i++) + NATIVE_ARGS(const u8 *failInstr, const u8 *sleepClauseFailInstr); + u32 targetAbility = GetBattlerAbility(gBattlerTarget); + // Psycho shift works + if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_POISON) && CanBePoisoned(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), targetAbility)) { - species = GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG); - abilityNum = GetMonData(&party[i], MON_DATA_ABILITY_NUM); - status = GetMonData(&party[i], MON_DATA_STATUS); - if (species != SPECIES_NONE - && species != SPECIES_EGG - && status & AILMENT_FNT - && GetAbilityBySpecies(species, abilityNum) != ABILITY_SOUNDPROOF) - monToCheck |= (1 << i); + gBattleCommunication[MULTISTRING_CHOOSER] = 0; } - if (monToCheck) + else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_TOXIC_POISON) && CanBePoisoned(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), targetAbility)) { - battler = GetBattlerAtPosition(position); - status = 0; - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, monToCheck, 4, &status); - MarkBattlerForControllerExec(battler); gBattleCommunication[MULTISTRING_CHOOSER] = 1; } -} - -void BS_CheckPokeFlute(void) -{ - NATIVE_ARGS(); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - - s32 i; - for (i = 0; i < gBattlersCount; i++) + else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_BURN) && CanBeBurned(gBattlerAttacker, gBattlerTarget, targetAbility)) { - if (GetBattlerAbility(i) != ABILITY_SOUNDPROOF) - { - gBattleMons[i].status1 &= ~STATUS1_SLEEP; - gBattleMons[i].status2 &= ~STATUS2_NIGHTMARE; - } + gBattleCommunication[MULTISTRING_CHOOSER] = 2; } - - UpdatePokeFlutePartyStatus(gPlayerParty, B_POSITION_PLAYER_LEFT); - UpdatePokeFlutePartyStatus(gEnemyParty, B_POSITION_OPPONENT_LEFT); - + else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) && CanBeParalyzed(gBattlerAttacker, gBattlerTarget, targetAbility)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + } + else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) && CanBeSlept(gBattlerAttacker, gBattlerTarget, targetAbility, BLOCKED_BY_SLEEP_CLAUSE)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 4; + } + else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_FROSTBITE) && CanBeFrozen(gBattlerAttacker, gBattlerTarget, targetAbility)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 5; + } + else if (IsSleepClauseActiveForSide(GetBattlerSide(gBattlerTarget))) + { + gBattlescriptCurrInstr = cmd->sleepClauseFailInstr; + return; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + return; + } + gBattleMons[gBattlerTarget].status1 = gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY; + BtlController_EmitSetMonData( + gBattlerTarget, + B_COMM_TO_CONTROLLER, + REQUEST_STATUS_BATTLE, + 0, + sizeof(gBattleMons[gBattlerTarget].status1), + &gBattleMons[gBattlerTarget].status1); + MarkBattlerForControllerExec(gBattlerTarget); + TryActivateSleepClause(gBattlerTarget, gBattlerPartyIndexes[gBattlerTarget]); gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_WaitFanfare(void) +void BS_CureStatus(void) { - NATIVE_ARGS(); - - if (!IsFanfareTaskInactive()) - return; + NATIVE_ARGS(u8 battler); + u32 battler = GetBattlerForBattleScript(cmd->battler); - gBattlescriptCurrInstr = cmd->nextInstr; -} + if (gBattleMons[battler].status1 & STATUS1_SLEEP) + TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); -void BS_SetBeakBlast(void) -{ - NATIVE_ARGS(); - gProtectStructs[gBattlerAttacker].beakBlastCharge = TRUE; + gBattleMons[battler].status1 = 0; + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[battler].status1), &gBattleMons[battler].status1); + MarkBattlerForControllerExec(battler); gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_RemoveTerrain(void) +void BS_PowerTrick(void) { NATIVE_ARGS(); - RemoveAllTerrains(); + u32 temp; + gBattleMons[gBattlerAttacker].volatiles.powerTrick = !gBattleMons[gBattlerAttacker].volatiles.powerTrick; + SWAP(gBattleMons[gBattlerAttacker].attack, gBattleMons[gBattlerAttacker].defense, temp); gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TrySpectralThiefSteal(void) +void BS_TryAfterYou(void) { - NATIVE_ARGS(const u8 *jumpInstr); - - if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) + NATIVE_ARGS(const u8 *failInstr); + if (ChangeOrderTargetAfterAttacker()) { + gSpecialStatuses[gBattlerTarget].afterYou = 1; gBattlescriptCurrInstr = cmd->nextInstr; - return; } - - bool32 contrary = GetBattlerAbility(gBattlerAttacker) == ABILITY_CONTRARY; - gBattleStruct->stolenStats[0] = 0; // Stats to steal. - gBattleScripting.animArg1 = 0; - for (u32 stat = STAT_ATK; stat < NUM_BATTLE_STATS; stat++) + else { - if (gBattleMons[gBattlerTarget].statStages[stat] > DEFAULT_STAT_STAGE && gBattleMons[gBattlerAttacker].statStages[stat] != MAX_STAT_STAGE) - { - bool32 byTwo = FALSE; - - gBattleStruct->stolenStats[0] |= (1 << (stat)); - // Store by how many stages to raise the stat. - gBattleStruct->stolenStats[stat] = gBattleMons[gBattlerTarget].statStages[stat] - DEFAULT_STAT_STAGE; - - while (gBattleMons[gBattlerAttacker].statStages[stat] + gBattleStruct->stolenStats[stat] > MAX_STAT_STAGE) - gBattleStruct->stolenStats[stat]--; - - gBattleMons[gBattlerTarget].statStages[stat] = DEFAULT_STAT_STAGE; - - if (gBattleStruct->stolenStats[stat] >= 2) - byTwo++; - - if (gBattleScripting.animArg1 == 0) - { - if (byTwo) - gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MINUS2 : STAT_ANIM_PLUS2) + stat; - else - gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MINUS1 : STAT_ANIM_PLUS1) + stat; - } - else - { - if (byTwo) - gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MULTIPLE_MINUS2 : STAT_ANIM_MULTIPLE_PLUS2); - else - gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MULTIPLE_MINUS1 : STAT_ANIM_MULTIPLE_PLUS1); - } - } + gBattlescriptCurrInstr = cmd->failInstr; } +} - if (gBattleStruct->stolenStats[0] != 0) - gBattlescriptCurrInstr = cmd->jumpInstr; +void BS_TryBestow(void) +{ + NATIVE_ARGS(const u8 *failInstr); + if (gBattleMons[gBattlerAttacker].item == ITEM_NONE + || gBattleMons[gBattlerTarget].item != ITEM_NONE + || !CanBattlerGetOrLoseItem(gBattlerAttacker, gBattleMons[gBattlerAttacker].item) + || !CanBattlerGetOrLoseItem(gBattlerTarget, gBattleMons[gBattlerAttacker].item) + || GetBattlerAbility(gBattlerAttacker) == ABILITY_STICKY_HOLD + || gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerTarget)] & (1u << gBattlerPartyIndexes[gBattlerTarget])) + { + gBattlescriptCurrInstr = cmd->failInstr; + } else + { + BestowItem(gBattlerAttacker, gBattlerTarget); gBattlescriptCurrInstr = cmd->nextInstr; + } } -void BS_SpectralThiefPrintStats(void) +void BS_HandleTrainerSlideMsg(void) { - NATIVE_ARGS(); - - for (u32 stat = STAT_ATK; stat < NUM_BATTLE_STATS; stat++) + NATIVE_ARGS(u8 battler, u8 case_); + u32 battler = GetBattlerForBattleScript(cmd->battler); + if (cmd->case_ == PRINT_SLIDE_MESSAGE) { - if (gBattleStruct->stolenStats[0] & (1u << stat)) + BtlController_EmitPrintString(battler, B_COMM_TO_CONTROLLER, STRINGID_TRAINERSLIDE); + MarkBattlerForControllerExec(battler); + } + else if (cmd->case_ == RESTORE_BATTLER_SLIDE_CONTROL) + { + if (IsBattlerAlive(battler)) { - gBattleStruct->stolenStats[0] &= ~(1u << stat); - SET_STATCHANGER(stat, gBattleStruct->stolenStats[stat], FALSE); - if (ChangeStatBuffs(GET_STAT_BUFF_VALUE_WITH_SIGN(gBattleScripting.statChanger), - stat, - MOVE_EFFECT_CERTAIN | MOVE_EFFECT_AFFECTS_USER, NULL) == STAT_CHANGE_WORKED) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_StatUpMsg; - return; - } + SetBattlerShadowSpriteCallback(battler, gBattleMons[battler].species); + BattleLoadMonSpriteGfx(GetBattlerMon(battler), battler); + } + u32 partner = BATTLE_PARTNER(battler); + if (IsBattlerAlive(partner)) + { + SetBattlerShadowSpriteCallback(partner, gBattleMons[partner].species); + BattleLoadMonSpriteGfx(GetBattlerMon(partner), partner); } } gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_SetMoveResultFlags(void) -{ - NATIVE_ARGS(u16 value); - gBattleStruct->moveResultFlags[gBattlerTarget] |= cmd->value; - gBattlescriptCurrInstr = cmd->nextInstr; -} - -void BS_ClearMoveResultFlags(void) -{ - NATIVE_ARGS(u16 value); - gBattleStruct->moveResultFlags[gBattlerTarget] &= ~(cmd->value); - gBattlescriptCurrInstr = cmd->nextInstr; -} - -void BS_JumpIfMoveResultFlags(void) +void BS_TryTrainerSlideMsgFirstOff(void) { - NATIVE_ARGS(u16 value, const u8 *jumpInstr); - - if (gBattleStruct->moveResultFlags[gBattlerTarget] & cmd->value) - gBattlescriptCurrInstr = cmd->jumpInstr; + NATIVE_ARGS(u8 battler); + u32 battler = GetBattlerForBattleScript(cmd->battler); + u32 shouldDoTrainerSlide = 0; + if ((shouldDoTrainerSlide = ShouldDoTrainerSlide(battler, TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN))) + { + gBattleScripting.battler = battler; + BattleScriptPush(cmd->nextInstr); + gBattlescriptCurrInstr = (shouldDoTrainerSlide == 1 ? BattleScript_TrainerASlideMsgRet : BattleScript_TrainerBSlideMsgRet); + } else + { gBattlescriptCurrInstr = cmd->nextInstr; + } } -void BS_JumpIfCriticalHit(void) +void BS_TryTrainerSlideMsgLastOn(void) { - NATIVE_ARGS(const u8 *jumpInstr); - - if (gSpecialStatuses[gBattlerTarget].criticalHit) - gBattlescriptCurrInstr = cmd->jumpInstr; + NATIVE_ARGS(u8 battler); + u32 shouldDoTrainerSlide = 0; + u32 battler = GetBattlerForBattleScript(cmd->battler); + if ((shouldDoTrainerSlide = ShouldDoTrainerSlide(battler, TRAINER_SLIDE_LAST_SWITCHIN))) + { + gBattleScripting.battler = battler; + BattleScriptPush(cmd->nextInstr); + gBattlescriptCurrInstr = (shouldDoTrainerSlide == 1 ? BattleScript_TrainerASlideMsgRet : BattleScript_TrainerBSlideMsgRet); + } else + { gBattlescriptCurrInstr = cmd->nextInstr; + } } -void BS_SwapStats(void) +// Potential bug with failing message and missed result on wrong battler +void BS_SetAuroraVeil(void) { - NATIVE_ARGS(u8 stat); - - u32 stat = cmd->stat; - u32 temp; - - switch (stat) + NATIVE_ARGS(); + u32 side = GetBattlerSide(gBattlerAttacker); + if (gSideStatuses[side] & SIDE_STATUS_AURORA_VEIL) { - case STAT_HP: - SWAP(gBattleMons[gBattlerAttacker].hp, gBattleMons[gBattlerTarget].hp, temp); - break; - case STAT_ATK: - SWAP(gBattleMons[gBattlerAttacker].attack, gBattleMons[gBattlerTarget].attack, temp); - break; - case STAT_DEF: - SWAP(gBattleMons[gBattlerAttacker].defense, gBattleMons[gBattlerTarget].defense, temp); - break; - case STAT_SPEED: - SWAP(gBattleMons[gBattlerAttacker].speed, gBattleMons[gBattlerTarget].speed, temp); - break; - case STAT_SPATK: - SWAP(gBattleMons[gBattlerAttacker].spAttack, gBattleMons[gBattlerTarget].spAttack, temp); - break; - case STAT_SPDEF: - SWAP(gBattleMons[gBattlerAttacker].spDefense, gBattleMons[gBattlerTarget].spDefense, temp); - break; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + else + { + gSideStatuses[side] |= SIDE_STATUS_AURORA_VEIL; + if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_LIGHT_CLAY) + gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = 8; + else + gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = 5; + + if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) + gBattleCommunication[MULTISTRING_CHOOSER] = 5; + else + gBattleCommunication[MULTISTRING_CHOOSER] = 5; } - PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); gBattlescriptCurrInstr = cmd->nextInstr; } -static void TrySetParalysis(const u8 *nextInstr, const u8 *failInstr) +void BS_TryThirdType(void) { - if (CanBeParalyzed(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerTarget))) + NATIVE_ARGS(const u8 *failInstr); + u32 type = GetMoveArgType(gCurrentMove); + if (IS_BATTLER_OF_TYPE(gBattlerTarget, type) || GetActiveGimmick(gBattlerTarget) == GIMMICK_TERA) { - gBattleMons[gBattlerTarget].status1 |= STATUS1_PARALYSIS; - gBattleCommunication[MULTISTRING_CHOOSER] = 3; - gEffectBattler = gBattlerTarget; - BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); - MarkBattlerForControllerExec(gBattlerTarget); - gBattlescriptCurrInstr = nextInstr; + gBattlescriptCurrInstr = cmd->failInstr; } else { - gBattlescriptCurrInstr = failInstr; + gBattleMons[gBattlerTarget].types[2] = type; + PREPARE_TYPE_BUFFER(gBattleTextBuff1, type); + gBattlescriptCurrInstr = cmd->nextInstr; } } -static void TrySetPoison(const u8 *nextInstr, const u8 *failInstr) +void BS_DestroyAbilityPopup(void) { - if (CanBePoisoned(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerAbility(gBattlerTarget))) + NATIVE_ARGS(); + for (u32 battler = 0; battler < gBattlersCount; battler++) + DestroyAbilityPopUp(battler); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_GetTotemBoost(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); + u32 battler = gBattlerAttacker; + if (gQueuedStatBoosts[battler].stats == 0) { - gBattleMons[gBattlerTarget].status1 |= STATUS1_POISON; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gEffectBattler = gBattlerTarget; - BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); - MarkBattlerForControllerExec(gBattlerTarget); - gBattlescriptCurrInstr = nextInstr; + gBattlescriptCurrInstr = cmd->nextInstr; // stats done, exit } else { - gBattlescriptCurrInstr = failInstr; + for (u32 i = 0; i < (NUM_BATTLE_STATS - 1); i++) + { + if (gQueuedStatBoosts[battler].stats & (1 << i)) + { + if (gQueuedStatBoosts[battler].statChanges[i] <= -1) + SET_STATCHANGER(i + 1, abs(gQueuedStatBoosts[battler].statChanges[i]), TRUE); + else + SET_STATCHANGER(i + 1, gQueuedStatBoosts[battler].statChanges[i], FALSE); + + gQueuedStatBoosts[battler].stats &= ~(1 << i); + gBattleScripting.battler = battler; + gBattlerTarget = battler; + if (gQueuedStatBoosts[battler].stats & 0x80) + { + gQueuedStatBoosts[battler].stats &= ~0x80; // set 'aura flared to life' flag + gBattlescriptCurrInstr = BattleScript_TotemFlaredToLife; + } + else + { + gBattlescriptCurrInstr = cmd->jumpInstr; // do boost + } + return; + } + } + gBattlescriptCurrInstr = cmd->nextInstr; // exit if loop failed (failsafe) } } -static void TrySetSleep(const u8 *nextInstr, const u8 *failInstr) +void BS_ActivateItemEffects(void) { - if (CanBeSlept(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerTarget), BLOCKED_BY_SLEEP_CLAUSE)) + NATIVE_ARGS(); + for (u32 battler = 0; battler < gBattlersCount; battler++) { - if (B_SLEEP_TURNS >= GEN_5) - gBattleMons[gBattlerTarget].status1 |= STATUS1_SLEEP_TURN((Random() % 3) + 2); - else - gBattleMons[gBattlerTarget].status1 |= STATUS1_SLEEP_TURN((Random() % 4) + 3); + if (!IsBattlerAlive(battler)) + continue; - TryActivateSleepClause(gBattlerTarget, gBattlerPartyIndexes[gBattlerTarget]); - gBattleCommunication[MULTISTRING_CHOOSER] = 4; - gEffectBattler = gBattlerTarget; - BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); - MarkBattlerForControllerExec(gBattlerTarget); - gBattlescriptCurrInstr = nextInstr; + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsForceTriggerItemActivation)) + return; } - else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_TryRoomService(void) +{ + NATIVE_ARGS(u8 battler, const u8 *failInstr); + u32 battler = GetBattlerForBattleScript(cmd->battler); + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); + if (holdEffect == HOLD_EFFECT_ROOM_SERVICE && ItemBattleEffects(battler, 0, holdEffect, IsOnEffectActivation)) + return; + gBattlescriptCurrInstr = cmd->failInstr; +} + +void BS_TryTerrainSeed(void) +{ + NATIVE_ARGS(u8 battler, const u8 *failInstr); + u32 battler = GetBattlerForBattleScript(cmd->battler); + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); + if (holdEffect == HOLD_EFFECT_TERRAIN_SEED && ItemBattleEffects(battler, 0, holdEffect, IsOnEffectActivation)) + return; + gBattlescriptCurrInstr = cmd->failInstr; +} + +void BS_MakeInvisible(void) +{ + NATIVE_ARGS(u8 battler); + u32 battler = GetBattlerForBattleScript(cmd->battler); + + if (gBattleControllerExecFlags) + return; + + BtlController_EmitSpriteInvisibility(battler, B_COMM_TO_CONTROLLER, TRUE); + MarkBattlerForControllerExec(battler); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_JumpIfTeamHealthy(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); + u32 battler = gBattlerAttacker; + if ((IsDoubleBattle()) && IsBattlerAlive(BATTLE_PARTNER(battler))) { - gBattlescriptCurrInstr = failInstr; + u8 partner = BATTLE_PARTNER(battler); + if ((gBattleMons[battler].hp == gBattleMons[battler].maxHP && !(gBattleMons[battler].status1 & STATUS1_ANY)) + && (gBattleMons[partner].hp == gBattleMons[partner].maxHP && !(gBattleMons[partner].status1 & STATUS1_ANY))) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; + } + else // single battle + { + if (gBattleMons[battler].hp == gBattleMons[battler].maxHP && !(gBattleMons[battler].status1 & STATUS1_ANY)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; } } -void BS_TrySetParalysis(void) -{ - NATIVE_ARGS(const u8 *failInstr); - TrySetParalysis(cmd->nextInstr, cmd->failInstr); -} - -void BS_TrySetPoison(void) +void BS_TryHealQuarterHealth(void) { - NATIVE_ARGS(const u8 *failInstr); - TrySetPoison(cmd->nextInstr, cmd->failInstr); + NATIVE_ARGS(u8 battler, const u8 *failInstr); + u32 battler = GetBattlerForBattleScript(cmd->battler); + SetHealAmount(battler, GetNonDynamaxMaxHP(battler) / 4); + if (gBattleMons[battler].hp == gBattleMons[battler].maxHP) + gBattlescriptCurrInstr = cmd->failInstr; // fail + else + gBattlescriptCurrInstr = cmd->nextInstr; // can heal } -void BS_TrySetPoisonParalyzis(void) +void BS_JumpIfUnder200(void) { - NATIVE_ARGS(const u8 *failInstr); - - static const u32 sStunShockEffects[] = {STATUS1_PARALYSIS, STATUS1_POISON}; - u32 status = RandomElement(RNG_G_MAX_STUN_SHOCK, sStunShockEffects); - - if (status == STATUS1_PARALYSIS) - TrySetParalysis(cmd->nextInstr, cmd->failInstr); + NATIVE_ARGS(const u8 *jumpInstr); + // If the Pokemon is less than 200 kg, or weighing less than 441 lbs, then Sky Drop will work. Otherwise, it will fail. + if (GetBattlerWeight(gBattlerTarget) < 2000) + gBattlescriptCurrInstr = cmd->jumpInstr; else - TrySetPoison(cmd->nextInstr, cmd->failInstr); + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TrySetEffectSpore(void) +void BS_SetSkyDrop(void) { - NATIVE_ARGS(const u8 *failInstr); - - static const u32 sBefuddleEffects[] = {STATUS1_PARALYSIS, STATUS1_POISON, STATUS1_SLEEP}; - u32 status = RandomElement(RNG_G_MAX_BEFUDDLE, sBefuddleEffects); + NATIVE_ARGS(); + gBattleMons[gBattlerTarget].volatiles.semiInvulnerable = STATE_SKY_DROP; + /* skyDropTargets holds the information of who is in a particular instance of Sky Drop. + This is needed in the case that multiple Pokemon use Sky Drop in the same turn or if + the target of a Sky Drop faints while in the air.*/ + gBattleStruct->skyDropTargets[gBattlerAttacker] = gBattlerTarget; + gBattleStruct->skyDropTargets[gBattlerTarget] = gBattlerAttacker; + + // End any multiturn effects caused by the target except VOLATILE_LOCK_CONFUSE + gBattleMons[gBattlerTarget].volatiles.multipleTurns = 0; + gBattleMons[gBattlerTarget].volatiles.uproarTurns = 0; + gBattleMons[gBattlerTarget].volatiles.bideTurns = 0; + gDisableStructs[gBattlerTarget].rolloutTimer = 0; + gDisableStructs[gBattlerTarget].furyCutterCounter = 0; + + // End any Follow Me/Rage Powder effects caused by the target + if (gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTimer != 0 && gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTarget == gBattlerTarget) + gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTimer = 0; - if (status == STATUS1_PARALYSIS) - TrySetParalysis(cmd->nextInstr, cmd->failInstr); - else if (status == STATUS1_POISON) - TrySetPoison(cmd->nextInstr, cmd->failInstr); - else - TrySetSleep(cmd->nextInstr, cmd->failInstr); + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TrySetConfusion(void) +void BS_ClearSkyDrop(void) { NATIVE_ARGS(const u8 *failInstr); - - if (CanBeConfused(gBattlerTarget)) + // Check to see if the initial target of this Sky Drop fainted before the 2nd turn of Sky Drop. + // If so, make the move fail. If not, clear all of the statuses and continue the move. + if (gBattleStruct->skyDropTargets[gBattlerAttacker] == SKY_DROP_NO_TARGET) { - gBattleMons[gBattlerTarget].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gBattleCommunication[MULTIUSE_STATE] = 1; - gEffectBattler = gBattlerTarget; - gBattlescriptCurrInstr = cmd->nextInstr; + gBattlescriptCurrInstr = cmd->failInstr; } else { - gBattlescriptCurrInstr = cmd->failInstr; + gBattleStruct->skyDropTargets[gBattlerAttacker] = SKY_DROP_NO_TARGET; + gBattleStruct->skyDropTargets[gBattlerTarget] = SKY_DROP_NO_TARGET; + gBattleMons[gBattlerTarget].volatiles.semiInvulnerable = STATE_NONE; + gBattlescriptCurrInstr = cmd->nextInstr; } + + // Confuse target if they were in the middle of Petal Dance/Outrage/Thrash when targeted. + if (gBattleMons[gBattlerTarget].volatiles.lockConfusionTurns) + gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION; } -void BS_TrySetInfatuation(void) +void BS_SkyDropYawn(void) { - NATIVE_ARGS(const u8 *failInstr); - - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_INFATUATION) - && gBattleMons[gBattlerTarget].ability != ABILITY_OBLIVIOUS - && !IsAbilityOnSide(gBattlerTarget, ABILITY_AROMA_VEIL) - && AreBattlersOfOppositeGender(gBattlerAttacker, gBattlerTarget)) + NATIVE_ARGS(); + if (gBattleStruct->skyDropTargets[gEffectBattler] != SKY_DROP_NO_TARGET && gBattleMons[gEffectBattler].volatiles.semiInvulnerable != STATE_SKY_DROP) { - gBattleMons[gBattlerTarget].status2 |= STATUS2_INFATUATED_WITH(gBattlerAttacker); - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gBattleCommunication[MULTIUSE_STATE] = 2; - gEffectBattler = gBattlerTarget; - gBattlescriptCurrInstr = cmd->nextInstr; + // Set the target of Sky Drop as gEffectBattler + gEffectBattler = gBattleStruct->skyDropTargets[gEffectBattler]; + + // Clear skyDropTargets data + gBattleStruct->skyDropTargets[gBattleStruct->skyDropTargets[gEffectBattler]] = SKY_DROP_NO_TARGET; + gBattleStruct->skyDropTargets[gEffectBattler] = SKY_DROP_NO_TARGET; + + // If the target was in the middle of Outrage/Thrash/etc. when targeted by Sky Drop, confuse them on release and do proper animation + if (gBattleMons[gEffectBattler].volatiles.lockConfusionTurns && CanBeConfused(gEffectBattler)) + { + gBattleMons[gEffectBattler].volatiles.lockConfusionTurns = 0; + gBattlerAttacker = gEffectBattler; + gBattleMons[gBattlerTarget].volatiles.confusionTurns = ((Random()) % 4) + 2; + gBattlescriptCurrInstr = BattleScript_ThrashConfuses; + } + else + { + gBattlescriptCurrInstr = cmd->nextInstr; + } } else { - gBattlescriptCurrInstr = cmd->failInstr; + gBattlescriptCurrInstr = cmd->nextInstr; } } -void BS_TrySetEscapePrevention(void) +void BS_JumpIfPranksterBlocked(void) { - NATIVE_ARGS(const u8 *failInstr); - - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_ESCAPE_PREVENTION)) - { - gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION; - gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - gEffectBattler = gBattlerTarget; - gBattlescriptCurrInstr = cmd->nextInstr; - } + NATIVE_ARGS(const u8 *jumpInstr); + if (BlocksPrankster(gCurrentMove, gBattlerAttacker, gBattlerTarget, TRUE)) + gBattlescriptCurrInstr = cmd->jumpInstr; else - { - gBattlescriptCurrInstr = cmd->failInstr; - } + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TrySetTorment(void) +void BS_TryToClearPrimalWeather(void) { - NATIVE_ARGS(const u8 *failInstr); + NATIVE_ARGS(); + bool32 shouldNotClear = FALSE; - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_TORMENT) - && !IsAbilityOnSide(gBattlerTarget, ABILITY_AROMA_VEIL)) + for (u32 i = 0; i < gBattlersCount; i++) { - gBattleMons[gBattlerTarget].status2 |= STATUS2_TORMENT; - gDisableStructs[gBattlerTarget].tormentTimer = gBattleTurnCounter + 3; // 3 turns excluding current turn - gBattleCommunication[MULTISTRING_CHOOSER] = 3; - gEffectBattler = gBattlerTarget; - gBattlescriptCurrInstr = cmd->nextInstr; + enum Ability ability = GetBattlerAbility(i); + if (((ability == ABILITY_DESOLATE_LAND && gBattleWeather & B_WEATHER_SUN_PRIMAL) + || (ability == ABILITY_PRIMORDIAL_SEA && gBattleWeather & B_WEATHER_RAIN_PRIMAL) + || (ability == ABILITY_DELTA_STREAM && gBattleWeather & B_WEATHER_STRONG_WINDS)) + && IsBattlerAlive(i)) + shouldNotClear = TRUE; } - else + if (gBattleWeather & B_WEATHER_SUN_PRIMAL && !shouldNotClear) { - gBattlescriptCurrInstr = cmd->failInstr; + gBattleWeather &= ~B_WEATHER_SUN_PRIMAL; + PrepareStringBattle(STRINGID_EXTREMESUNLIGHTFADED, gBattlerAttacker); + gBattleCommunication[MSG_DISPLAY] = 1; + } + else if (gBattleWeather & B_WEATHER_RAIN_PRIMAL && !shouldNotClear) + { + gBattleWeather &= ~B_WEATHER_RAIN_PRIMAL; + PrepareStringBattle(STRINGID_HEAVYRAINLIFTED, gBattlerAttacker); + gBattleCommunication[MSG_DISPLAY] = 1; + } + else if (gBattleWeather & B_WEATHER_STRONG_WINDS && !shouldNotClear) + { + gBattleWeather &= ~B_WEATHER_STRONG_WINDS; + PrepareStringBattle(STRINGID_STRONGWINDSDISSIPATED, gBattlerAttacker); + gBattleCommunication[MSG_DISPLAY] = 1; } + gBattlescriptCurrInstr = cmd->nextInstr; } -// Heals one-sixth of the target's HP, including for Dynamaxed targets. -void BS_HealOneSixth(void) +void BS_TryEndNeutralizingGas(void) { - NATIVE_ARGS(const u8* failInstr); - gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].maxHP / 6; - if (gBattleStruct->moveDamage[gBattlerTarget] == 0) - gBattleStruct->moveDamage[gBattlerTarget] = 1; - gBattleStruct->moveDamage[gBattlerTarget] *= -1; + NATIVE_ARGS(); + if (gSpecialStatuses[gBattlerTarget].neutralizingGasRemoved) + { + gSpecialStatuses[gBattlerTarget].neutralizingGasRemoved = FALSE; + gDisableStructs[gBattlerTarget].neutralizingGas = FALSE; + if (!IsNeutralizingGasOnField()) + { + BattleScriptPush(cmd->nextInstr); + gBattlescriptCurrInstr = BattleScript_NeutralizingGasExits; + return; + } + } - if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) - gBattlescriptCurrInstr = cmd->failInstr; // fail - else - gBattlescriptCurrInstr = cmd->nextInstr; // can heal + gBattlescriptCurrInstr = cmd->nextInstr; } -// Recycles the target's item if it is specifically holding a berry. -void BS_TryRecycleBerry(void) +void BS_GetRototillerTargets(void) { NATIVE_ARGS(const u8 *failInstr); - u16* usedHeldItem = &gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gBattlerTarget]][GetBattlerSide(gBattlerTarget)]; - if (gBattleMons[gBattlerTarget].item == ITEM_NONE - && gBattleStruct->changedItems[gBattlerTarget] == ITEM_NONE // Will not inherit an item - && GetItemPocket(*usedHeldItem) == POCKET_BERRIES) + u32 count = 0; + for (u32 battler = 0; battler < gBattlersCount; battler++) { - gLastUsedItem = *usedHeldItem; - *usedHeldItem = ITEM_NONE; - gBattleMons[gBattlerTarget].item = gLastUsedItem; - - BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); - MarkBattlerForControllerExec(gBattlerTarget); - - gBattlescriptCurrInstr = cmd->nextInstr; + gSpecialStatuses[battler].rototillerAffected = FALSE; + if (IsRototillerAffected(battler)) + { + gSpecialStatuses[battler].rototillerAffected = TRUE; + count++; + } } + + if (count == 0) + gBattlescriptCurrInstr = cmd->failInstr; // Rototiller fails else - { - gBattlescriptCurrInstr = cmd->failInstr; - } + gBattlescriptCurrInstr = cmd->nextInstr; } -// Sets up sharp steel on the target's side. -void BS_SetSteelsurge(void) +void BS_JumpIfNotRototillerAffected(void) { - NATIVE_ARGS(const u8 *failInstr); - u8 targetSide = GetBattlerSide(gBattlerTarget); - if (gSideStatuses[targetSide] & SIDE_STATUS_STEELSURGE) + NATIVE_ARGS(const u8 *jumpInstr); + if (gSpecialStatuses[gBattlerTarget].rototillerAffected) { - gBattlescriptCurrInstr = cmd->failInstr; + gSpecialStatuses[gBattlerTarget].rototillerAffected = FALSE; + gBattlescriptCurrInstr = cmd->nextInstr; } else { - gSideStatuses[targetSide] |= SIDE_STATUS_STEELSURGE; - gSideTimers[targetSide].steelsurgeAmount = 1; - gBattlescriptCurrInstr = cmd->nextInstr; + gBattlescriptCurrInstr = cmd->jumpInstr; // Unaffected by rototiller - print STRINGID_NOEFFECTONTARGET } } -void BS_JumpIfIntimidateAbilityPrevented(void) +// TODO: There might be a way to do it without a flag +void BS_ConsumeBerry(void) { - NATIVE_ARGS(); + NATIVE_ARGS(u8 battler, bool8 fromBattler); + u32 battler = GetBattlerForBattleScript(cmd->battler); - u32 hasAbility = FALSE; - u32 ability = GetBattlerAbility(gBattlerTarget); + if (cmd->fromBattler) + gLastUsedItem = gBattleMons[battler].item; - switch (ability) + if (GetItemPocket(gLastUsedItem) != POCKET_BERRIES || gBattleScripting.overrideBerryRequirements == 2) { - case ABILITY_INNER_FOCUS: - case ABILITY_SCRAPPY: - case ABILITY_OWN_TEMPO: - case ABILITY_OBLIVIOUS: - if (B_UPDATED_INTIMIDATE >= GEN_8) - { - hasAbility = TRUE; - gBattlescriptCurrInstr = BattleScript_IntimidatePrevented; - } - else - { - gBattlescriptCurrInstr = cmd->nextInstr; - } - break; - case ABILITY_GUARD_DOG: - hasAbility = TRUE; - gBattlescriptCurrInstr = BattleScript_IntimidateInReverse; - break; - default: + gBattleScripting.overrideBerryRequirements = 0; gBattlescriptCurrInstr = cmd->nextInstr; - break; + return; } - if (hasAbility) + gBattleScripting.overrideBerryRequirements = 1; + GetBattlerPartyState(battler)->ateBerry = TRUE; + if (ItemBattleEffects(battler, 0, GetItemHoldEffect(gLastUsedItem), IsOnBerryActivation)) { - gLastUsedAbility = ability; - gBattlerAbility = gBattlerTarget; - RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); + gBattleScripting.overrideBerryRequirements = 2; + return; } + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TryIntimidateEjectPack(void) +void BS_JumpIfWeatherAffected(void) { - NATIVE_ARGS(); + NATIVE_ARGS(u16 flags, const u8 *jumpInstr); + u32 weather = cmd->flags; + if (IsBattlerWeatherAffected(gBattlerAttacker, weather)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_JumpIfSpecies(void) +{ + NATIVE_ARGS(u16 species, const u8 *jumpInstr); + if (gBattleMons[gBattlerAttacker].species == cmd->species) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} - u32 affectedBattler = 0xFF; - u32 battler = BATTLE_OPPOSITE(gBattlerAttacker); - u32 partnerBattler = BATTLE_PARTNER(battler); +void BS_JumpIfAbilityPreventsRest(void) +{ + NATIVE_ARGS(u8 battler, const u8 *jumpInstr); + u32 battler = GetBattlerForBattleScript(cmd->battler); + u32 ability = GetBattlerAbility(battler); + if (GetConfig(CONFIG_LEAF_GUARD_PREVENTS_REST) >= GEN_5 && IsLeafGuardProtected(battler, ability)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else if (IsShieldsDownProtected(battler, ability)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} - bool32 ejectPackBattler = CanEjectPackTrigger(gBattlerAttacker, battler, MOVE_NONE); - bool32 ejectPackPartnerBattler = CanEjectPackTrigger(gBattlerAttacker, partnerBattler, MOVE_NONE); +void BS_SetAttackerToStickyWebUser(void) +{ + NATIVE_ARGS(); + // For Mirror Armor: "If the PokΓ©mon with this Ability is affected by Sticky Web, the effect is reflected back to the PokΓ©mon which set it up. + // If PokΓ©mon which set up Sticky Web is not on the field, no PokΓ©mon have their Speed lowered." + gBattlerAttacker = gBattlerTarget; // Initialize 'fail' condition + SET_STATCHANGER(STAT_SPEED, 1, TRUE); + if (gSideTimers[GetBattlerSide(gBattlerTarget)].stickyWebBattlerId != 0xFF) + gBattlerAttacker = gSideTimers[GetBattlerSide(gBattlerTarget)].stickyWebBattlerId; + gBattlescriptCurrInstr = cmd->nextInstr; +} - if (ejectPackBattler && ejectPackPartnerBattler) - { - u32 battlerSpeed = GetBattlerTotalSpeedStat(battler); - u32 partnerbattlerSpeed = GetBattlerTotalSpeedStat(partnerBattler); +void BS_CutOneThirdHpAndRaiseStats(void) +{ + NATIVE_ARGS(const u8 *failInstr); + bool32 atLeastOneStatBoosted = FALSE; + u32 ability = GetBattlerAbility(gBattlerAttacker); - if (battlerSpeed >= partnerbattlerSpeed) - affectedBattler = battler; - else - affectedBattler = partnerBattler; - } - else if (ejectPackBattler) + for (u32 stat = 1; stat < NUM_STATS; stat++) { - affectedBattler = battler; + if (CompareStat(gBattlerAttacker, stat, MAX_STAT_STAGE, CMP_LESS_THAN, ability)) + { + atLeastOneStatBoosted = TRUE; + break; + } } - else if (ejectPackPartnerBattler) + if (atLeastOneStatBoosted) { - affectedBattler = partnerBattler; + SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 3); + gBattlescriptCurrInstr = cmd->nextInstr; } - - gBattlescriptCurrInstr = cmd->nextInstr; - if (affectedBattler != 0xFF) + else { - gProtectStructs[battler].statFell = FALSE; - gProtectStructs[partnerBattler].statFell = FALSE; - gAiLogicData->ejectPackSwitch = TRUE; - gBattleScripting.battler = affectedBattler; - gLastUsedItem = gBattleMons[affectedBattler].item; - RecordItemEffectBattle(affectedBattler, HOLD_EFFECT_EJECT_PACK); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_EjectPackActivate_Ret; + gBattlescriptCurrInstr = cmd->failInstr; } } -void BS_JumpIfCanGigantamax(void) +void BS_SetPoltergeistMessage(void) { - NATIVE_ARGS(u8 battler, const u8 *jumpInstr); - u32 battler = GetBattlerForBattleScript(cmd->battler); + NATIVE_ARGS(const u8 *failInstr); + PREPARE_ITEM_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].item); + gLastUsedItem = gBattleMons[gBattlerTarget].item; + gBattlescriptCurrInstr = cmd->nextInstr; +} - if (GetMonData(GetBattlerMon(battler), MON_DATA_GIGANTAMAX_FACTOR) - && GetGMaxTargetSpecies(gBattleMons[battler].species) != SPECIES_NONE) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; +void BS_TryResetNegativeStatStages(void) +{ + NATIVE_ARGS(); + for (u32 stat = 0; stat < NUM_BATTLE_STATS; stat++) + if (gBattleMons[gBattlerTarget].statStages[stat] < DEFAULT_STAT_STAGE) + gBattleMons[gBattlerTarget].statStages[stat] = DEFAULT_STAT_STAGE; + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_JumpIfLastUsedItemHoldEffect(void) +void BS_JumpIfLastUsedItemBerry(void) { - NATIVE_ARGS(u8 holdEffect, u16 secondaryId, const u8 *jumpInstr); - if (GetItemHoldEffect(gLastUsedItem) == cmd->holdEffect - && (cmd->secondaryId == 0 || GetItemSecondaryId(gLastUsedItem) == cmd->secondaryId)) + NATIVE_ARGS(const u8 *jumpInstr); + if (GetItemPocket(gLastUsedItem) == POCKET_BERRIES) gBattlescriptCurrInstr = cmd->jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_JumpIfNoWhiteOut(void) +void BS_SaveBattlerItem(void) { - NATIVE_ARGS(const u8 *jumpInstr); + NATIVE_ARGS(); + gBattleHistory->heldItems[gBattlerTarget] = gBattleMons[gBattlerTarget].item; + gBattlescriptCurrInstr = cmd->nextInstr; +} - if (FlagGet(B_FLAG_NO_WHITEOUT)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; +void BS_RestoreBattlerItem(void) +{ + NATIVE_ARGS(); + gBattleMons[gBattlerTarget].item = gBattleHistory->heldItems[gBattlerTarget]; + gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_JumpIfAbilityCantBeSuppressed(void) +void BS_BattlerItemToLastUsedItem(void) { - NATIVE_ARGS(u8 battler, const u8 *jumpInstr); - u32 battler = GetBattlerForBattleScript(cmd->battler); + NATIVE_ARGS(); + gBattleMons[gBattlerTarget].item = gLastUsedItem; + gBattlescriptCurrInstr = cmd->nextInstr; +} - if (gAbilitiesInfo[gBattleMons[battler].ability].cantBeSuppressed) +void BS_JumpIfGenConfigLowerThan(void) +{ + NATIVE_ARGS(u16 tag, u8 gen, const u8 *jumpInstr); + if (GetConfig(cmd->tag) < cmd->gen) gBattlescriptCurrInstr = cmd->jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; diff --git a/src/battle_setup.c b/src/battle_setup.c index 5c6a01c9321c..1ad284d05e7f 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -42,19 +42,20 @@ #include "data.h" #include "vs_seeker.h" #include "item.h" +#include "field_name_box.h" #include "constants/battle_frontier.h" #include "constants/battle_setup.h" #include "constants/event_objects.h" #include "constants/game_stat.h" #include "constants/items.h" #include "constants/songs.h" -#include "constants/map_types.h" #include "constants/trainers.h" #include "constants/trainer_hill.h" #include "constants/weather.h" -#include "wild_encounter.h" +#include "fishing.h" -enum { +enum TransitionType +{ TRANSITION_TYPE_NORMAL, TRANSITION_TYPE_CAVE, TRANSITION_TYPE_FLASH, @@ -260,7 +261,7 @@ static void Task_BattleStart(u8 taskId) } } -static void CreateBattleStartTask(u8 transition, u16 song) +static void CreateBattleStartTask(enum BattleTransition transition, u16 song) { u8 taskId = CreateTask(Task_BattleStart, 1); @@ -337,7 +338,7 @@ static void DoStandardWildBattle(bool32 isDouble) } else if (isDouble) gBattleTypeFlags |= BATTLE_TYPE_DOUBLE; - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) { VarSet(VAR_TEMP_E, 0); gBattleTypeFlags |= BATTLE_TYPE_PYRAMID; @@ -356,7 +357,7 @@ void DoStandardWildBattle_Debug(void) StopPlayerAvatar(); gMain.savedCallback = CB2_EndWildBattle; gBattleTypeFlags = 0; - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) { VarSet(VAR_TEMP_PLAYING_PYRAMID_MUSIC, 0); gBattleTypeFlags |= BATTLE_TYPE_PYRAMID; @@ -416,7 +417,7 @@ static void DoTrainerBattle(void) static void DoBattlePyramidTrainerHillBattle(void) { - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) CreateBattleStartTask(GetSpecialBattleTransition(B_TRANSITION_GROUP_B_PYRAMID), 0); else CreateBattleStartTask(GetSpecialBattleTransition(B_TRANSITION_GROUP_TRAINER_HILL), 0); @@ -533,7 +534,7 @@ void StartGroudonKyogreBattle(void) void StartRegiBattle(void) { - u8 transitionId; + enum BattleTransition transitionId; u16 species; LockPlayerFieldControls(); @@ -591,7 +592,7 @@ static void CB2_EndWildBattle(void) HealPlayerParty(); } - if (IsPlayerDefeated(gBattleOutcome) == TRUE && !InBattlePyramid() && !InBattlePike()) + if (IsPlayerDefeated(gBattleOutcome) == TRUE && CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE && !InBattlePike()) { SetMainCallback2(CB2_WhiteOut); } @@ -610,7 +611,7 @@ static void CB2_EndScriptedWildBattle(void) if (IsPlayerDefeated(gBattleOutcome) == TRUE) { - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); else SetMainCallback2(CB2_WhiteOut); @@ -622,12 +623,12 @@ static void CB2_EndScriptedWildBattle(void) } } -u8 BattleSetup_GetEnvironmentId(void) +enum BattleEnvironments BattleSetup_GetEnvironmentId(void) { u16 tileBehavior; s16 x, y; - if (I_FISHING_ENVIRONMENT >= GEN_4 && gIsFishingEncounter) + if (ShouldUseFishingEnvironmentInBattle()) GetXYCoordsOneStepInFrontOfPlayer(&x, &y); else PlayerGetDestCoords(&x, &y); @@ -686,7 +687,7 @@ u8 BattleSetup_GetEnvironmentId(void) return BATTLE_ENVIRONMENT_PLAIN; } -static u8 GetBattleTransitionTypeByMap(void) +static enum TransitionType GetBattleTransitionTypeByMap(void) { u16 tileBehavior; s16 x, y; @@ -749,7 +750,7 @@ static u8 GetSumOfEnemyPartyLevel(u16 opponentId, u8 numMons) return sum; } -u8 GetWildBattleTransition(void) +enum BattleTransition GetWildBattleTransition(void) { u8 transitionType = GetBattleTransitionTypeByMap(); u8 enemyLevel = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL); @@ -757,28 +758,28 @@ u8 GetWildBattleTransition(void) if (enemyLevel < playerLevel) { - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) return B_TRANSITION_BLUR; else return sBattleTransitionTable_Wild[transitionType][0]; } else { - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) return B_TRANSITION_GRID_SQUARES; else return sBattleTransitionTable_Wild[transitionType][1]; } } -u8 GetTrainerBattleTransition(void) +enum BattleTransition GetTrainerBattleTransition(void) { u8 minPartyCount = 1; u8 transitionType; u8 enemyLevel; u8 playerLevel; u32 trainerId = SanitizeTrainerId(TRAINER_BATTLE_PARAM.opponentA); - u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); + enum TrainerClassID trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (DoesTrainerHaveMugshot(trainerId)) return B_TRANSITION_MUGSHOT; @@ -814,7 +815,7 @@ u8 GetTrainerBattleTransition(void) } #define RANDOM_TRANSITION(table) (table[Random() % ARRAY_COUNT(table)]) -u8 GetSpecialBattleTransition(s32 id) +enum BattleTransition GetSpecialBattleTransition(enum BattleTransitionGroup id) { u16 var; u8 enemyLevel = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL); @@ -832,6 +833,8 @@ u8 GetSpecialBattleTransition(s32 id) return RANDOM_TRANSITION(sBattleTransitionTable_BattlePyramid); case B_TRANSITION_GROUP_B_DOME: return RANDOM_TRANSITION(sBattleTransitionTable_BattleDome); + default: + break; } if (VarGet(VAR_FRONTIER_BATTLE_MODE) != FRONTIER_MODE_LINK_MULTIS) @@ -849,6 +852,8 @@ u8 GetSpecialBattleTransition(s32 id) return RANDOM_TRANSITION(sBattleTransitionTable_BattlePyramid); case B_TRANSITION_GROUP_B_DOME: return RANDOM_TRANSITION(sBattleTransitionTable_BattleDome); + default: + break; } if (VarGet(VAR_FRONTIER_BATTLE_MODE) != FRONTIER_MODE_LINK_MULTIS) @@ -1005,7 +1010,7 @@ void TrainerBattleLoadArgsSecondTrainer(const u8 *data) void SetMapVarsToTrainerA(void) { - if (TRAINER_BATTLE_PARAM.objEventLocalIdA != 0) + if (TRAINER_BATTLE_PARAM.objEventLocalIdA != LOCALID_NONE) { gSpecialVar_LastTalked = TRAINER_BATTLE_PARAM.objEventLocalIdA; gSelectedObjectEvent = GetObjectEventIdByLocalIdAndMap(TRAINER_BATTLE_PARAM.objEventLocalIdA, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); @@ -1126,6 +1131,17 @@ bool32 GetTrainerFlagFromScriptPointer(const u8 *data) TrainerBattleParameter *temp = (TrainerBattleParameter*)(data + OPCODE_OFFSET); return FlagGet(TRAINER_FLAGS_START + temp->params.opponentA); } + +bool32 GetRematchFromScriptPointer(const u8 *data) +{ +#if FREE_MATCH_CALL + return FALSE; +#else + TrainerBattleParameter *temp = (TrainerBattleParameter*)(data + OPCODE_OFFSET); + return ShouldTryRematchBattleForTrainerId(temp->params.opponentA); +#endif +} + #undef OPCODE_OFFSET // Set trainer's movement type so they stop and remain facing that direction @@ -1144,7 +1160,7 @@ u8 GetTrainerBattleMode(void) bool8 GetTrainerFlag(void) { - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) return GetBattlePyramidTrainerFlag(gSelectedObjectEvent); else if (InTrainerHill()) return GetHillTrainerFlag(gSelectedObjectEvent); @@ -1201,7 +1217,7 @@ void BattleSetup_StartTrainerBattle(void) } } - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) { VarSet(VAR_TEMP_PLAYING_PYRAMID_MUSIC, 0); gBattleTypeFlags |= BATTLE_TYPE_PYRAMID; @@ -1241,7 +1257,7 @@ void BattleSetup_StartTrainerBattle(void) gWhichTrainerToFaceAfterBattle = 0; gMain.savedCallback = CB2_EndTrainerBattle; - if (InBattlePyramid() || InTrainerHillChallenge()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE || InTrainerHillChallenge()) DoBattlePyramidTrainerHillBattle(); else DoTrainerBattle(); @@ -1270,7 +1286,7 @@ static void SaveChangesToPlayerParty(void) { if ((participatedPokemon >> i & 1) == 1) { - gSaveBlock1Ptr->playerParty[i] = gPlayerParty[j]; + SavePlayerPartyMon(i, &gPlayerParty[j]); j++; } } @@ -1289,6 +1305,7 @@ static void CB2_EndTrainerBattle(void) { HandleBattleVariantEndParty(); + gIsDebugBattle = FALSE; if (FollowerNPCIsBattlePartner()) { RestorePartyAfterFollowerNPCBattle(); @@ -1305,7 +1322,7 @@ static void CB2_EndTrainerBattle(void) } else if (IsPlayerDefeated(gBattleOutcome) == TRUE) { - if (InBattlePyramid() || InTrainerHillChallenge() || (!NoAliveMonsForPlayer()) || FlagGet(B_FLAG_NO_WHITEOUT)) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE || InTrainerHillChallenge() || (!NoAliveMonsForPlayer()) || FlagGet(B_FLAG_NO_WHITEOUT)) SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); else SetMainCallback2(CB2_WhiteOut); @@ -1318,7 +1335,7 @@ static void CB2_EndTrainerBattle(void) { SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); DowngradeBadPoison(); - if (!InBattlePyramid() && !InTrainerHillChallenge()) + if (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE && !InTrainerHillChallenge()) { RegisterTrainerInMatchCall(); SetBattledTrainersFlags(); @@ -1357,7 +1374,7 @@ void BattleSetup_StartRematchBattle(void) void ShowTrainerIntroSpeech(void) { - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) { if (gNoOfApproachingTrainers == 0 || gNoOfApproachingTrainers == 1) CopyPyramidTrainerSpeechBefore(LocalIdToPyramidTrainerId(gSpecialVar_LastTalked)); @@ -1489,9 +1506,19 @@ static const u8 *ReturnEmptyStringIfNull(const u8 *string) static const u8 *GetIntroSpeechOfApproachingTrainer(void) { if (gApproachingTrainerId == 0) + { + if (OW_NAME_BOX_NPC_TRAINER) + gSpeakerName = GetTrainerNameFromId(TRAINER_BATTLE_PARAM.opponentA); + return ReturnEmptyStringIfNull(TRAINER_BATTLE_PARAM.introTextA); + } else + { + if (OW_NAME_BOX_NPC_TRAINER) + gSpeakerName = GetTrainerNameFromId(TRAINER_BATTLE_PARAM.opponentB); + return ReturnEmptyStringIfNull(TRAINER_BATTLE_PARAM.introTextB); + } } const u8 *GetTrainerALoseText(void) @@ -1742,6 +1769,20 @@ static void ClearTrainerWantRematchState(const struct RematchTrainer *table, u16 #endif //FREE_MATCH_CALL } +void ClearCurrentTrainerWantRematchVsSeeker(void) +{ +#if FREE_MATCH_CALL == FALSE + if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) && FlagGet(I_VS_SEEKER_CHARGING) && (I_VS_SEEKER_CHARGING != 0)) + { + for (u32 i = 0; i < REMATCH_TABLE_ENTRIES; i++) + { + if (gSaveBlock1Ptr->trainerRematches[i] == TRAINER_BATTLE_PARAM.opponentA) + gSaveBlock1Ptr->trainerRematches[i] = 0; + } + } +#endif //FREE_MATCH_CALL +} + static u32 GetTrainerMatchCallFlag(u32 trainerId) { s32 i; @@ -1773,12 +1814,18 @@ static bool8 WasSecondRematchWon(const struct RematchTrainer *table, u16 firstBa return FALSE; if (!HasTrainerBeenFought(table[tableId].trainerIds[1])) return FALSE; - +#if FREE_MATCH_CALL == FALSE + if (I_VS_SEEKER_CHARGING) + { + if (gSaveBlock1Ptr->trainerRematches[tableId] == 0) + return FALSE; + } +#endif return TRUE; } #if FREE_MATCH_CALL == FALSE -static bool32 HasAtLeastFiveBadges(void) +static bool32 HasEnoughBadgesForRematch(void) { s32 i, count; @@ -1786,7 +1833,7 @@ static bool32 HasAtLeastFiveBadges(void) { if (FlagGet(gBadgeFlags[i]) == TRUE) { - if (++count >= 5) + if (++count >= OW_REMATCH_BADGE_COUNT) return TRUE; } } @@ -1800,7 +1847,7 @@ static bool32 HasAtLeastFiveBadges(void) void IncrementRematchStepCounter(void) { #if FREE_MATCH_CALL == FALSE - if (!HasAtLeastFiveBadges()) + if (!HasEnoughBadgesForRematch()) return; if (IsVsSeekerEnabled()) @@ -1816,7 +1863,7 @@ void IncrementRematchStepCounter(void) #if FREE_MATCH_CALL == FALSE static bool32 IsRematchStepCounterMaxed(void) { - if (HasAtLeastFiveBadges() && gSaveBlock1Ptr->trainerRematchStepCounter >= STEP_COUNTER_MAX) + if (HasEnoughBadgesForRematch() && gSaveBlock1Ptr->trainerRematchStepCounter >= STEP_COUNTER_MAX) return TRUE; else return FALSE; @@ -1856,10 +1903,15 @@ u16 GetLastBeatenRematchTrainerId(u16 trainerId) bool8 ShouldTryRematchBattle(void) { - if (IsFirstTrainerIdReadyForRematch(gRematchTable, TRAINER_BATTLE_PARAM.opponentA)) + return ShouldTryRematchBattleForTrainerId(TRAINER_BATTLE_PARAM.opponentA); +} + +bool8 ShouldTryRematchBattleForTrainerId(u16 trainerId) +{ + if (IsFirstTrainerIdReadyForRematch(gRematchTable, trainerId)) return TRUE; - return WasSecondRematchWon(gRematchTable, TRAINER_BATTLE_PARAM.opponentA); + return WasSecondRematchWon(gRematchTable, trainerId); } bool8 IsTrainerReadyForRematch(void) diff --git a/src/battle_terastal.c b/src/battle_terastal.c index 6984f3fc6cfa..f0e720c93e6e 100644 --- a/src/battle_terastal.c +++ b/src/battle_terastal.c @@ -14,7 +14,6 @@ #include "sprite.h" #include "util.h" #include "constants/abilities.h" -#include "constants/hold_effects.h" #include "constants/rgb.h" // Sets flags and variables upon a battler's Terastallization. @@ -62,9 +61,9 @@ void ApplyBattlerVisualsForTeraAnim(u32 battler) // Returns whether a battler can Terastallize. bool32 CanTerastallize(u32 battler) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum HoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); - if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED && GET_BASE_SPECIES_ID(gBattleMons[battler].species) == SPECIES_TERAPAGOS) + if (gBattleMons[battler].volatiles.transformed && GET_BASE_SPECIES_ID(gBattleMons[battler].species) == SPECIES_TERAPAGOS) return FALSE; // Prevents Zigzagoon from terastalizing in vanilla. @@ -109,20 +108,20 @@ bool32 CanTerastallize(u32 battler) } // Returns a battler's Tera type. -u32 GetBattlerTeraType(u32 battler) +enum Type GetBattlerTeraType(u32 battler) { return GetMonData(GetBattlerMon(battler), MON_DATA_TERA_TYPE); } // Uses up a type's Stellar boost. -void ExpendTypeStellarBoost(u32 battler, u32 type) +void ExpendTypeStellarBoost(u32 battler, enum Type type) { if (type < 32 && gBattleMons[battler].species != SPECIES_TERAPAGOS_STELLAR) // avoid OOB access gBattleStruct->stellarBoostFlags[GetBattlerSide(battler)] |= 1u << type; } // Checks whether a type's Stellar boost has been expended. -bool32 IsTypeStellarBoosted(u32 battler, u32 type) +bool32 IsTypeStellarBoosted(u32 battler, enum Type type) { if (type < 32) // avoid OOB access return !(gBattleStruct->stellarBoostFlags[GetBattlerSide(battler)] & (1u << type)); @@ -132,20 +131,19 @@ bool32 IsTypeStellarBoosted(u32 battler, u32 type) // Returns the STAB power multiplier to use when Terastallized. // Power multipliers from Smogon Research thread. -uq4_12_t GetTeraMultiplier(u32 battler, u32 type) +uq4_12_t GetTeraMultiplier(struct DamageContext *ctx) { - u32 teraType = GetBattlerTeraType(battler); - bool32 hasAdaptability = (GetBattlerAbility(battler) == ABILITY_ADAPTABILITY); + enum Type teraType = GetBattlerTeraType(ctx->battlerAtk); // Safety check. - if (GetActiveGimmick(battler) != GIMMICK_TERA) + if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_TERA) return UQ_4_12(1.0); // Stellar-type checks. if (teraType == TYPE_STELLAR) { - bool32 shouldBoost = IsTypeStellarBoosted(battler, type); - if (IS_BATTLER_OF_BASE_TYPE(battler, type)) + bool32 shouldBoost = IsTypeStellarBoosted(ctx->battlerAtk, ctx->moveType); + if (IS_BATTLER_OF_BASE_TYPE(ctx->battlerAtk, ctx->moveType)) { if (shouldBoost) return UQ_4_12(2.0); @@ -158,18 +156,18 @@ uq4_12_t GetTeraMultiplier(u32 battler, u32 type) return UQ_4_12(1.0); } // Base and Tera type. - if (type == teraType && IS_BATTLER_OF_BASE_TYPE(battler, type)) + if (ctx->moveType == teraType && IS_BATTLER_OF_BASE_TYPE(ctx->battlerAtk, ctx->moveType)) { - if (hasAdaptability) + if (ctx->abilityAtk == ABILITY_ADAPTABILITY) return UQ_4_12(2.25); else return UQ_4_12(2.0); } // Base or Tera type only. - else if ((type == teraType && !IS_BATTLER_OF_BASE_TYPE(battler, type)) - || (type != teraType && IS_BATTLER_OF_BASE_TYPE(battler, type))) + else if ((ctx->moveType == teraType && !IS_BATTLER_OF_BASE_TYPE(ctx->battlerAtk, ctx->moveType)) + || (ctx->moveType != teraType && IS_BATTLER_OF_BASE_TYPE(ctx->battlerAtk, ctx->moveType))) { - if (hasAdaptability) + if (ctx->abilityAtk == ABILITY_ADAPTABILITY) return UQ_4_12(2.0); else return UQ_4_12(1.5); @@ -181,7 +179,7 @@ uq4_12_t GetTeraMultiplier(u32 battler, u32 type) } } -u16 GetTeraTypeRGB(u32 type) +u16 GetTeraTypeRGB(enum Type type) { return gTypesInfo[type].teraTypeRGBValue; } diff --git a/src/battle_tower.c b/src/battle_tower.c index 19a123c41261..d589cb757a92 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -25,6 +25,7 @@ #include "battle_factory.h" #include "constants/abilities.h" #include "constants/apprentice.h" +#include "constants/battle_ai.h" #include "constants/battle_dome.h" #include "constants/battle_frontier.h" #include "constants/battle_frontier_mons.h" @@ -39,6 +40,8 @@ #include "constants/trainers.h" #include "constants/event_objects.h" #include "constants/moves.h" +#include "test/battle.h" +#include "test/test_runner_battle.h" // EWRAM vars. EWRAM_DATA const struct BattleFrontierTrainer *gFacilityTrainers = NULL; @@ -1351,9 +1354,9 @@ u8 GetFrontierTrainerFrontSpriteId(u16 trainerId) } } -u8 GetFrontierOpponentClass(u16 trainerId) +enum TrainerClassID GetFrontierOpponentClass(u16 trainerId) { - u8 trainerClass = 0; + enum TrainerClassID trainerClass = 0; enum DifficultyLevel difficulty = GetBattlePartnerDifficultyLevel(trainerId); SetFacilityPtrsGetLevel(); @@ -1568,7 +1571,8 @@ void CreateFacilityMon(const struct TrainerMon *fmon, u16 level, u8 fixedIV, u32 { u8 ball = (fmon->ball == 0xFF) ? Random() % POKEBALL_COUNT : fmon->ball; u16 move; - u32 personality = 0, ability, friendship, j; + u32 personality = 0, friendship, j; + enum Ability ability; if (fmon->gender == TRAINER_MON_MALE) { @@ -1628,7 +1632,7 @@ void CreateFacilityMon(const struct TrainerMon *fmon, u16 level, u8 fixedIV, u32 if (fmon->isShiny) { - u32 data = TRUE; + bool32 data = TRUE; SetMonData(dst, MON_DATA_IS_SHINY, &data); } if (fmon->dynamaxLevel > 0) @@ -1643,12 +1647,12 @@ void CreateFacilityMon(const struct TrainerMon *fmon, u16 level, u8 fixedIV, u32 } if (fmon->teraType) { - u32 data = fmon->teraType; + enum Type data = fmon->teraType; SetMonData(dst, MON_DATA_TERA_TYPE, &data); } - - SetMonData(dst, MON_DATA_POKEBALL, &ball); + if (ball != BALL_STRANGE) + SetMonData(dst, MON_DATA_POKEBALL, &ball); CalculateMonStats(dst); } @@ -1932,7 +1936,7 @@ static void HandleSpecialTrainerBattleEnd(void) case SPECIAL_BATTLE_SECRET_BASE: for (i = 0; i < PARTY_SIZE; i++) { - u16 itemBefore = GetMonData(&gSaveBlock1Ptr->playerParty[i], MON_DATA_HELD_ITEM); + u16 itemBefore = GetMonData(GetSavedPlayerPartyMon(i), MON_DATA_HELD_ITEM); SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &itemBefore); } break; @@ -1943,7 +1947,7 @@ static void HandleSpecialTrainerBattleEnd(void) for (i = 0; i < 3; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES)) - gSaveBlock1Ptr->playerParty[i] = gPlayerParty[i]; + SavePlayerPartyMon(i, &gPlayerParty[i]); } break; } @@ -1986,7 +1990,7 @@ void DoSpecialTrainerBattle(void) gBattleTypeFlags |= BATTLE_TYPE_DOUBLE | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS; break; case FRONTIER_MODE_LINK_MULTIS: - gBattleTypeFlags |= BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_MULTI | BATTLE_TYPE_TOWER_LINK_MULTI; + gBattleTypeFlags |= BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_MULTI | BATTLE_TYPE_TOWER_LINK_MULTI | BATTLE_TYPE_TWO_OPPONENTS; FillFrontierTrainersParties(FRONTIER_MULTI_PARTY_SIZE); break; } @@ -1998,7 +2002,7 @@ void DoSpecialTrainerBattle(void) for (i = 0; i < PARTY_SIZE; i++) { u16 itemBefore = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); - SetMonData(&gSaveBlock1Ptr->playerParty[i], MON_DATA_HELD_ITEM, &itemBefore); + SetMonData(GetSavedPlayerPartyMon(i), MON_DATA_HELD_ITEM, &itemBefore); } CreateTask(Task_StartBattleAfterTransition, 1); PlayMapChosenOrBattleBGM(0); @@ -2769,11 +2773,11 @@ static void AwardBattleTowerRibbons(void) partyIndex = gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1; ribbons[i].partyIndex = partyIndex; ribbons[i].count = 0; - if (!GetMonData(&gSaveBlock1Ptr->playerParty[partyIndex], ribbonType)) + if (!GetMonData(GetSavedPlayerPartyMon(partyIndex), ribbonType)) { gSpecialVar_Result = TRUE; - SetMonData(&gSaveBlock1Ptr->playerParty[partyIndex], ribbonType, &gSpecialVar_Result); - ribbons[i].count = GetRibbonCount(&gSaveBlock1Ptr->playerParty[partyIndex]); + SetMonData(GetSavedPlayerPartyMon(partyIndex), ribbonType, &gSpecialVar_Result); + ribbons[i].count = GetRibbonCount(GetSavedPlayerPartyMon(partyIndex)); } } } @@ -2792,7 +2796,7 @@ static void AwardBattleTowerRibbons(void) } if (ribbons[0].count > NUM_CUTIES_RIBBONS) { - TryPutSpotTheCutiesOnAir(&gSaveBlock1Ptr->playerParty[ribbons[0].partyIndex], ribbonType); + TryPutSpotTheCutiesOnAir(GetSavedPlayerPartyMon(ribbons[0].partyIndex), ribbonType); } } } @@ -2846,7 +2850,7 @@ u8 GetEreaderTrainerFrontSpriteId(void) #endif //FREE_BATTLE_TOWER_E_READER } -u8 GetEreaderTrainerClassId(void) +enum TrainerClassID GetEreaderTrainerClassId(void) { #if FREE_BATTLE_TOWER_E_READER == FALSE return gFacilityClassToTrainerClass[gSaveBlock2Ptr->frontier.ereaderTrainer.facilityClass]; @@ -3555,18 +3559,20 @@ bool32 ValidateBattleTowerRecord(u8 recordId) // unused void TrySetLinkBattleTowerEnemyPartyLevel(void) { - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) + if (!IsMultibattleTest()) { - s32 i; - u8 enemyLevel = SetFacilityPtrsGetLevel(); - - for (i = 0; i < PARTY_SIZE; i++) + if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) { - u32 species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES, NULL); - if (species) + u8 enemyLevel = SetFacilityPtrsGetLevel(); + + for (u32 i = 0; i < PARTY_SIZE; i++) { - SetMonData(&gEnemyParty[i], MON_DATA_EXP, &gExperienceTables[gSpeciesInfo[species].growthRate][enemyLevel]); - CalculateMonStats(&gEnemyParty[i]); + u32 species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES, NULL); + if (species) + { + SetMonData(&gEnemyParty[i], MON_DATA_EXP, &gExperienceTables[gSpeciesInfo[species].growthRate][enemyLevel]); + CalculateMonStats(&gEnemyParty[i]); + } } } } diff --git a/src/battle_transition.c b/src/battle_transition.c index fe7188203bc5..2b28bf7dc759 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -302,10 +302,10 @@ static const u8 sUnusedBrendan_Gfx[] = INCBIN_U8("graphics/battle_transitions/un static const u8 sUnusedLass_Gfx[] = INCBIN_U8("graphics/battle_transitions/unused_lass.4bpp"); static const u32 sShrinkingBoxTileset[] = INCBIN_U32("graphics/battle_transitions/shrinking_box.4bpp"); static const u16 sEvilTeam_Palette[] = INCBIN_U16("graphics/battle_transitions/evil_team.gbapal"); -static const u32 sTeamAqua_Tileset[] = INCBIN_U32("graphics/battle_transitions/team_aqua.4bpp.lz"); -static const u32 sTeamAqua_Tilemap[] = INCBIN_U32("graphics/battle_transitions/team_aqua.bin.lz"); -static const u32 sTeamMagma_Tileset[] = INCBIN_U32("graphics/battle_transitions/team_magma.4bpp.lz"); -static const u32 sTeamMagma_Tilemap[] = INCBIN_U32("graphics/battle_transitions/team_magma.bin.lz"); +static const u32 sTeamAqua_Tileset[] = INCBIN_U32("graphics/battle_transitions/team_aqua.4bpp.smol"); +static const u32 sTeamAqua_Tilemap[] = INCBIN_U32("graphics/battle_transitions/team_aqua.bin.smolTM"); +static const u32 sTeamMagma_Tileset[] = INCBIN_U32("graphics/battle_transitions/team_magma.4bpp.smol"); +static const u32 sTeamMagma_Tilemap[] = INCBIN_U32("graphics/battle_transitions/team_magma.bin.smolTM"); static const u32 sRegis_Tileset[] = INCBIN_U32("graphics/battle_transitions/regis.4bpp"); static const u16 sRegice_Palette[] = INCBIN_U16("graphics/battle_transitions/regice.gbapal"); static const u16 sRegisteel_Palette[] = INCBIN_U16("graphics/battle_transitions/registeel.gbapal"); @@ -314,10 +314,10 @@ static const u32 sRegice_Tilemap[] = INCBIN_U32("graphics/battle_transitions/reg static const u32 sRegisteel_Tilemap[] = INCBIN_U32("graphics/battle_transitions/registeel.bin"); static const u32 sRegirock_Tilemap[] = INCBIN_U32("graphics/battle_transitions/regirock.bin"); static const u16 sUnused_Palette[] = INCBIN_U16("graphics/battle_transitions/unused.gbapal"); -static const u32 sKyogre_Tileset[] = INCBIN_U32("graphics/battle_transitions/kyogre.4bpp.lz"); -static const u32 sKyogre_Tilemap[] = INCBIN_U32("graphics/battle_transitions/kyogre.bin.lz"); -static const u32 sGroudon_Tileset[] = INCBIN_U32("graphics/battle_transitions/groudon.4bpp.lz"); -static const u32 sGroudon_Tilemap[] = INCBIN_U32("graphics/battle_transitions/groudon.bin.lz"); +static const u32 sKyogre_Tileset[] = INCBIN_U32("graphics/battle_transitions/kyogre.4bpp.smol"); +static const u32 sKyogre_Tilemap[] = INCBIN_U32("graphics/battle_transitions/kyogre.bin.smolTM"); +static const u32 sGroudon_Tileset[] = INCBIN_U32("graphics/battle_transitions/groudon.4bpp.smol"); +static const u32 sGroudon_Tilemap[] = INCBIN_U32("graphics/battle_transitions/groudon.bin.smolTM"); static const u16 sKyogre1_Palette[] = INCBIN_U16("graphics/battle_transitions/kyogre_pt1.gbapal"); static const u16 sKyogre2_Palette[] = INCBIN_U16("graphics/battle_transitions/kyogre_pt2.gbapal"); static const u16 sGroudon1_Palette[] = INCBIN_U16("graphics/battle_transitions/groudon_pt1.gbapal"); @@ -326,13 +326,13 @@ static const u16 sRayquaza_Palette[] = INCBIN_U16("graphics/battle_transitions/r static const u32 sRayquaza_Tileset[] = INCBIN_U32("graphics/battle_transitions/rayquaza.4bpp"); static const u32 sRayquaza_Tilemap[] = INCBIN_U32("graphics/battle_transitions/rayquaza.bin"); static const u16 sFrontierLogo_Palette[] = INCBIN_U16("graphics/battle_transitions/frontier_logo.gbapal"); -static const u32 sFrontierLogo_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_logo.4bpp.lz"); -static const u32 sFrontierLogo_Tilemap[] = INCBIN_U32("graphics/battle_transitions/frontier_logo.bin.lz"); +static const u32 sFrontierLogo_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_logo.4bpp.smol"); +static const u32 sFrontierLogo_Tilemap[] = INCBIN_U32("graphics/battle_transitions/frontier_logo.bin.smolTM"); static const u16 sFrontierSquares_Palette[] = INCBIN_U16("graphics/battle_transitions/frontier_squares_blanktiles.gbapal"); -static const u32 sFrontierSquares_FilledBg_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_1.4bpp.lz"); -static const u32 sFrontierSquares_EmptyBg_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_2.4bpp.lz"); -static const u32 sFrontierSquares_Shrink1_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_3.4bpp.lz"); -static const u32 sFrontierSquares_Shrink2_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_4.4bpp.lz"); +static const u32 sFrontierSquares_FilledBg_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_1.4bpp.smol"); +static const u32 sFrontierSquares_EmptyBg_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_2.4bpp.smol"); +static const u32 sFrontierSquares_Shrink1_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_3.4bpp.smol"); +static const u32 sFrontierSquares_Shrink2_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_4.4bpp.smol"); static const u32 sFrontierSquares_Tilemap[] = INCBIN_U32("graphics/battle_transitions/frontier_squares.bin"); // All battle transitions use the same intro @@ -1048,6 +1048,9 @@ static void Task_BattleTransition(u8 taskId) static bool8 Transition_StartIntro(struct Task *task) { SetWeatherScreenFadeOut(); + // cause all shadow sprites to destroy themselves, + // freeing up sprite slots for the transition + gWeatherPtr->noShadows = TRUE; CpuCopy32(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE); if (sTasks_Intro[task->tTransitionId] != NULL) { @@ -1385,7 +1388,7 @@ static bool8 Aqua_Init(struct Task *task) InitPatternWeaveTransition(task); GetBg0TilesDst(&tilemap, &tileset); CpuFill16(0, tilemap, BG_SCREEN_SIZE); - LZ77UnCompVram(sTeamAqua_Tileset, tileset); + DecompressDataWithHeaderVram(sTeamAqua_Tileset, tileset); LoadPalette(sEvilTeam_Palette, BG_PLTT_ID(15), sizeof(sEvilTeam_Palette)); task->tState++; @@ -1400,7 +1403,7 @@ static bool8 Magma_Init(struct Task *task) InitPatternWeaveTransition(task); GetBg0TilesDst(&tilemap, &tileset); CpuFill16(0, tilemap, BG_SCREEN_SIZE); - LZ77UnCompVram(sTeamMagma_Tileset, tileset); + DecompressDataWithHeaderVram(sTeamMagma_Tileset, tileset); LoadPalette(sEvilTeam_Palette, BG_PLTT_ID(15), sizeof(sEvilTeam_Palette)); task->tState++; @@ -1460,7 +1463,7 @@ static bool8 Aqua_SetGfx(struct Task *task) u16 *tilemap, *tileset; GetBg0TilesDst(&tilemap, &tileset); - LZ77UnCompVram(sTeamAqua_Tilemap, tilemap); + DecompressDataWithHeaderVram(sTeamAqua_Tilemap, tilemap); SetSinWave((s16*)gScanlineEffectRegBuffers[0], 0, task->tSinIndex, 132, task->tAmplitude, DISPLAY_HEIGHT); task->tState++; @@ -1472,7 +1475,7 @@ static bool8 Magma_SetGfx(struct Task *task) u16 *tilemap, *tileset; GetBg0TilesDst(&tilemap, &tileset); - LZ77UnCompVram(sTeamMagma_Tilemap, tilemap); + DecompressDataWithHeaderVram(sTeamMagma_Tilemap, tilemap); SetSinWave((s16*)gScanlineEffectRegBuffers[0], 0, task->tSinIndex, 132, task->tAmplitude, DISPLAY_HEIGHT); task->tState++; @@ -1526,8 +1529,8 @@ static bool8 Kyogre_Init(struct Task *task) GetBg0TilesDst(&tilemap, &tileset); CpuFill16(0, tilemap, BG_SCREEN_SIZE); - LZ77UnCompVram(sKyogre_Tileset, tileset); - LZ77UnCompVram(sKyogre_Tilemap, tilemap); + DecompressDataWithHeaderVram(sKyogre_Tileset, tileset); + DecompressDataWithHeaderVram(sKyogre_Tilemap, tilemap); task->tState++; return FALSE; @@ -2277,7 +2280,7 @@ static bool8 Mugshot_SetGfx(struct Task *task) s16 i, j; u16 *tilemap, *tileset; const u16 *mugshotsMap = sMugshotsTilemap; - u8 mugshotColor = GetTrainerMugshotColorFromId(TRAINER_BATTLE_PARAM.opponentA); + enum MugshotColor mugshotColor = GetTrainerMugshotColorFromId(TRAINER_BATTLE_PARAM.opponentA); GetBg0TilesDst(&tilemap, &tileset); CpuSet(sEliteFour_Tileset, tileset, 0xF0); @@ -2584,7 +2587,7 @@ static void Mugshots_CreateTrainerPics(struct Task *task) u8 trainerAPicId = GetTrainerPicFromId(TRAINER_BATTLE_PARAM.opponentA); u8 trainerBPicId = GetTrainerPicFromId(TRAINER_BATTLE_PARAM.opponentB); - u8 partnerPicId = gTrainerPicToTrainerBackPic[GetTrainerPicFromId(gPartnerTrainerId)]; + u8 partnerPicId = GetTrainerPicFromId(gPartnerTrainerId); s16 opponentARotationScales = 0; s16 opponentBRotationScales = 0; @@ -3418,8 +3421,8 @@ static bool8 Groudon_Init(struct Task *task) GetBg0TilesDst(&tilemap, &tileset); CpuFill16(0, tilemap, BG_SCREEN_SIZE); - LZ77UnCompVram(sGroudon_Tileset, tileset); - LZ77UnCompVram(sGroudon_Tilemap, tilemap); + DecompressDataWithHeaderVram(sGroudon_Tileset, tileset); + DecompressDataWithHeaderVram(sGroudon_Tilemap, tilemap); task->tState++; task->tTimer = 0; @@ -4304,7 +4307,7 @@ static bool8 FrontierLogoWiggle_Init(struct Task *task) InitPatternWeaveTransition(task); GetBg0TilesDst(&tilemap, &tileset); CpuFill16(0, tilemap, BG_SCREEN_SIZE); - LZ77UnCompVram(sFrontierLogo_Tileset, tileset); + DecompressDataWithHeaderVram(sFrontierLogo_Tileset, tileset); LoadPalette(sFrontierLogo_Palette, BG_PLTT_ID(15), sizeof(sFrontierLogo_Palette)); task->tState++; @@ -4316,7 +4319,7 @@ static bool8 FrontierLogoWiggle_SetGfx(struct Task *task) u16 *tilemap, *tileset; GetBg0TilesDst(&tilemap, &tileset); - LZ77UnCompVram(sFrontierLogo_Tilemap, tilemap); + DecompressDataWithHeaderVram(sFrontierLogo_Tilemap, tilemap); SetSinWave((s16*)gScanlineEffectRegBuffers[0], 0, task->tSinIndex, 132, task->tAmplitude, DISPLAY_HEIGHT); task->tState++; @@ -4366,7 +4369,7 @@ static bool8 FrontierLogoWave_Init(struct Task *task) REG_BLDALPHA = sTransitionData->BLDALPHA; GetBg0TilesDst(&tilemap, &tileset); CpuFill16(0, tilemap, BG_SCREEN_SIZE); - LZ77UnCompVram(sFrontierLogo_Tileset, tileset); + DecompressDataWithHeaderVram(sFrontierLogo_Tileset, tileset); LoadPalette(sFrontierLogo_Palette, BG_PLTT_ID(15), sizeof(sFrontierLogo_Palette)); sTransitionData->cameraY = 0; UpdateShadowColor(RGB_GRAY); @@ -4380,7 +4383,7 @@ static bool8 FrontierLogoWave_SetGfx(struct Task *task) u16 *tilemap, *tileset; GetBg0TilesDst(&tilemap, &tileset); - LZ77UnCompVram(sFrontierLogo_Tilemap, tilemap); + DecompressDataWithHeaderVram(sFrontierLogo_Tilemap, tilemap); task->tState++; return TRUE; @@ -4512,7 +4515,7 @@ static bool8 FrontierSquares_Init(struct Task *task) u16 *tilemap, *tileset; GetBg0TilesDst(&tilemap, &tileset); - LZ77UnCompVram(sFrontierSquares_FilledBg_Tileset, tileset); + DecompressDataWithHeaderVram(sFrontierSquares_FilledBg_Tileset, tileset); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32); FillBgTilemapBufferRect(0, 1, 0, 0, MARGIN_SIZE, 32, 15); @@ -4570,13 +4573,13 @@ static bool8 FrontierSquares_Shrink(struct Task *task) break; case 1: BlendPalettes(PALETTES_ALL & ~(1 << 15), 16, RGB_BLACK); - LZ77UnCompVram(sFrontierSquares_EmptyBg_Tileset, tileset); + DecompressDataWithHeaderVram(sFrontierSquares_EmptyBg_Tileset, tileset); break; case 2: - LZ77UnCompVram(sFrontierSquares_Shrink1_Tileset, tileset); + DecompressDataWithHeaderVram(sFrontierSquares_Shrink1_Tileset, tileset); break; case 3: - LZ77UnCompVram(sFrontierSquares_Shrink2_Tileset, tileset); + DecompressDataWithHeaderVram(sFrontierSquares_Shrink2_Tileset, tileset); break; default: FillBgTilemapBufferRect_Palette0(0, 1, 0, 0, 32, 32); @@ -4607,7 +4610,7 @@ static bool8 FrontierSquaresSpiral_Init(struct Task *task) u16 *tilemap, *tileset; GetBg0TilesDst(&tilemap, &tileset); - LZ77UnCompVram(sFrontierSquares_FilledBg_Tileset, tileset); + DecompressDataWithHeaderVram(sFrontierSquares_FilledBg_Tileset, tileset); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32); FillBgTilemapBufferRect(0, 1, 0, 0, MARGIN_SIZE, 32, 15); @@ -4725,7 +4728,7 @@ static bool8 FrontierSquaresScroll_Init(struct Task *task) u16 *tilemap, *tileset; GetBg0TilesDst(&tilemap, &tileset); - LZ77UnCompVram(sFrontierSquares_FilledBg_Tileset, tileset); + DecompressDataWithHeaderVram(sFrontierSquares_FilledBg_Tileset, tileset); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32); CopyBgTilemapBufferToVram(0); LoadPalette(sFrontierSquares_Palette, BG_PLTT_ID(15), sizeof(sFrontierSquares_Palette)); diff --git a/src/battle_transition_frontier.c b/src/battle_transition_frontier.c index 3e40129fa5ef..bef484d416af 100644 --- a/src/battle_transition_frontier.c +++ b/src/battle_transition_frontier.c @@ -45,9 +45,9 @@ static bool8 CirclesSymmetricSpiralInSeq_End(struct Task *task); #define PALTAG_LOGO_CIRCLES 0x2E90 -static const u32 sLogoCenter_Gfx[] = INCBIN_U32("graphics/battle_transitions/frontier_logo_center.4bpp.lz"); -static const u32 sLogoCenter_Tilemap[] = INCBIN_U32("graphics/battle_transitions/frontier_logo_center.bin.lz"); -static const u32 sLogoCircles_Gfx[] = INCBIN_U32("graphics/battle_transitions/frontier_logo_circles.4bpp.lz"); +static const u32 sLogoCenter_Gfx[] = INCBIN_U32("graphics/battle_transitions/frontier_logo_center.4bpp.smol"); +static const u32 sLogoCenter_Tilemap[] = INCBIN_U32("graphics/battle_transitions/frontier_logo_center.bin.smolTM"); +static const u32 sLogoCircles_Gfx[] = INCBIN_U32("graphics/battle_transitions/frontier_logo_circles.4bpp.smol"); static const u16 sLogo_Pal[] = INCBIN_U16("graphics/battle_transitions/frontier_logo_circles.gbapal"); static const struct OamData sOamData_LogoCircles = @@ -221,8 +221,8 @@ static void LoadLogoGfx(void) u16 *tilemap, *tileset; GetBg0TilesDst(&tilemap, &tileset); - LZ77UnCompVram(sLogoCenter_Gfx, tileset); - LZ77UnCompVram(sLogoCenter_Tilemap, tilemap); + DecompressDataWithHeaderVram(sLogoCenter_Gfx, tileset); + DecompressDataWithHeaderVram(sLogoCenter_Tilemap, tilemap); LoadPalette(sLogo_Pal, BG_PLTT_ID(15), sizeof(sLogo_Pal)); LoadCompressedSpriteSheet(&sSpriteSheet_LogoCircles); LoadSpritePalette(&sSpritePalette_LogoCircles); diff --git a/src/battle_tv.c b/src/battle_tv.c index 96ce63344038..cecab5efb31c 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -14,7 +14,7 @@ static bool8 IsNotSpecialBattleString(enum StringID stringId); static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3); static void TrySetBattleSeminarShow(void); -static void AddPointsOnFainting(bool8 targetFainted); +static void AddPointsOnFainting(void); static void AddPointsBasedOnWeather(u16 weatherFlags, u16 move, u8 moveSlot); static bool8 ShouldCalculateDamage(u16 move, s32 *dmg, u16 *powerOverride); @@ -124,12 +124,23 @@ static const u16 *const sPointsArray[] = // even if current PokΓ©mon does not have corresponding move static const u16 sSpecialBattleStrings[] = { - STRINGID_PKMNPERISHCOUNTFELL, STRINGID_PKMNWISHCAMETRUE, STRINGID_PKMNLOSTPPGRUDGE, - STRINGID_PKMNTOOKFOE, STRINGID_PKMNABSORBEDNUTRIENTS, STRINGID_PKMNANCHOREDITSELF, - STRINGID_PKMNAFFLICTEDBYCURSE, STRINGID_PKMNSAPPEDBYLEECHSEED, STRINGID_PKMNLOCKEDINNIGHTMARE, - STRINGID_PKMNHURTBY, STRINGID_PKMNHURTBYBURN, STRINGID_PKMNHURTBYPOISON, - STRINGID_PKMNHURTBYSPIKES, STRINGID_ATTACKERFAINTED, STRINGID_TARGETFAINTED, - STRINGID_PKMNHITWITHRECOIL, STRINGID_PKMNCRASHED, TABLE_END + STRINGID_PKMNPERISHCOUNTFELL, + STRINGID_PKMNWISHCAMETRUE, + STRINGID_PKMNLOSTPPGRUDGE, + STRINGID_PKMNTOOKFOE, + STRINGID_PKMNABSORBEDNUTRIENTS, + STRINGID_PKMNANCHOREDITSELF, + STRINGID_PKMNAFFLICTEDBYCURSE, + STRINGID_PKMNSAPPEDBYLEECHSEED, + STRINGID_PKMNLOCKEDINNIGHTMARE, + STRINGID_PKMNHURTBY, + STRINGID_PKMNHURTBYBURN, + STRINGID_PKMNHURTBYPOISON, + STRINGID_PKMNHURTBYSPIKES, + STRINGID_BATTLERFAINTED, + STRINGID_PKMNHITWITHRECOIL, + STRINGID_PKMNCRASHED, + TABLE_END }; // code @@ -139,7 +150,7 @@ void BattleTv_SetDataBasedOnString(enum StringID stringId) u32 atkSide, defSide, effSide, scriptingSide; struct Pokemon *atkMon, *defMon; u8 moveSlot; - u32 atkFlank, defFlank, effFlank; + u32 atkFlank, defFlank, effFlank, flank; u8 *perishCount; u16 *statStringId, *finishedMoveId; @@ -452,8 +463,6 @@ void BattleTv_SetDataBasedOnString(enum StringID stringId) tvPtr->pos[atkSide][atkFlank].mudSportMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; tvPtr->pos[atkSide][atkFlank].mudSportMoveSlot = moveSlot; break; - case STRINGID_ATTACKERFAINTED: - AddPointsOnFainting(FALSE); case STRINGID_RETURNMON: if (tvPtr->pos[atkSide][atkFlank].waterSportMonId != 0) { @@ -466,26 +475,29 @@ void BattleTv_SetDataBasedOnString(enum StringID stringId) tvPtr->pos[atkSide][atkFlank].mudSportMoveSlot = 0; } break; - case STRINGID_TARGETFAINTED: - AddPointsOnFainting(TRUE); - if (tvPtr->pos[atkSide][defFlank].waterSportMonId != 0) + case STRINGID_BATTLERFAINTED: + AddPointsOnFainting(); + if (gBattlerAttacker == gBattleScripting.battler) + flank = atkFlank; + else + flank = defFlank; + + if (tvPtr->pos[atkSide][flank].waterSportMonId != 0) { - tvPtr->pos[atkSide][defFlank].waterSportMonId = 0; - tvPtr->pos[atkSide][defFlank].waterSportMoveSlot = 0; + tvPtr->pos[atkSide][flank].waterSportMonId = 0; + tvPtr->pos[atkSide][flank].waterSportMoveSlot = 0; } - if (tvPtr->pos[atkSide][defFlank].mudSportMonId != 0) + if (tvPtr->pos[atkSide][flank].mudSportMonId != 0) { - tvPtr->pos[atkSide][defFlank].mudSportMonId = 0; - tvPtr->pos[atkSide][defFlank].mudSportMoveSlot = 0; + tvPtr->pos[atkSide][flank].mudSportMonId = 0; + tvPtr->pos[atkSide][flank].mudSportMoveSlot = 0; } break; case STRINGID_PKMNRAISEDDEF: - case STRINGID_PKMNRAISEDDEFALITTLE: tvPtr->side[atkSide].reflectMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; tvPtr->side[atkSide].reflectMoveSlot = moveSlot; break; case STRINGID_PKMNRAISEDSPDEF: - case STRINGID_PKMNRAISEDSPDEFALITTLE: tvPtr->side[atkSide].lightScreenMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; tvPtr->side[atkSide].lightScreenMoveSlot = moveSlot; break; @@ -591,7 +603,7 @@ void BattleTv_SetDataBasedOnMove(u16 move, u16 weatherFlags, struct DisableStruc tvPtr->side[atkSide].usedMoveSlot = moveSlot; AddMovePoints(PTS_MOVE_EFFECT, moveSlot, move, 0); AddPointsBasedOnWeather(weatherFlags, move, moveSlot); - if (gStatuses3[gBattlerAttacker] & STATUS3_CHARGED_UP) + if (gBattleMons[gBattlerAttacker].volatiles.chargeTimer > 0) AddMovePoints(PTS_ELECTRIC, move, moveSlot, 0); if (move == MOVE_WISH) @@ -599,7 +611,8 @@ void BattleTv_SetDataBasedOnMove(u16 move, u16 weatherFlags, struct DisableStruc tvPtr->side[atkSide].wishMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; tvPtr->side[atkSide].wishMoveSlot = moveSlot; } - if (GetMoveEffect(move) == EFFECT_EXPLOSION) + enum BattleMoveEffects effect = GetMoveEffect(move); + if (effect == EFFECT_EXPLOSION || effect == EFFECT_MISTY_EXPLOSION) { tvPtr->side[atkSide ^ BIT_SIDE].explosionMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; tvPtr->side[atkSide ^ BIT_SIDE].explosionMoveSlot = moveSlot; @@ -760,14 +773,14 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) // Changes depending on the effect switch (effect) { - case EFFECT_FIXED_DAMAGE_ARG: - baseFromEffect *= (GetMoveFixedDamage(move) / 20); + case EFFECT_FIXED_HP_DAMAGE: + baseFromEffect *= (GetMoveFixedHPDamage(move) / 20); break; case EFFECT_TWO_TURNS_ATTACK: for (i = 0; i < GetMoveAdditionalEffectCount(move); i++) { const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); - switch ((enum MoveEffects)additionalEffect->moveEffect) + switch ((enum MoveEffect)additionalEffect->moveEffect) { case MOVE_EFFECT_ATK_PLUS_1: case MOVE_EFFECT_DEF_PLUS_1: @@ -839,10 +852,6 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); switch (additionalEffect->moveEffect) { - case MOVE_EFFECT_STEAL_ITEM: - if ((additionalEffect->chance == 100 || additionalEffect->chance == 0)) - baseFromEffect += 3; - break; case MOVE_EFFECT_THRASH: if (additionalEffect->self == TRUE) baseFromEffect += 3; @@ -866,6 +875,8 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) if (additionalEffect->self == TRUE && (additionalEffect->chance == 100 || additionalEffect->chance == 0)) baseFromEffect += 2; break; + default: + break; } } @@ -1067,7 +1078,7 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) } } -static void AddPointsOnFainting(bool8 targetFainted) +static void AddPointsOnFainting(void) { struct BattleTv *tvPtr = &gBattleStruct->tv; u32 atkSide = GetBattlerSide(gBattlerAttacker); @@ -1190,7 +1201,7 @@ static void AddPointsOnFainting(bool8 targetFainted) } break; case FNT_RECOIL: - if (targetFainted == TRUE) + if (gBattlerAttacker == gBattleScripting.battler) { AddMovePoints(PTS_FAINT_SET_UP, 0, atkSide, (gBattlerPartyIndexes[gBattlerAttacker]) * 4 + tvPtr->side[atkSide].usedMoveSlot); @@ -1254,22 +1265,24 @@ static void TrySetBattleSeminarShow(void) dmgByMove[gMoveSelectionCursor[gBattlerAttacker]] = gBattleStruct->moveDamage[gBattlerTarget]; // TODO: Not sure currMoveSaved = gCurrentMove; + u16 storedMoveResultFlags = gBattleStruct->moveResultFlags[gBattlerTarget]; for (i = 0; i < MAX_MON_MOVES; i++) { gCurrentMove = gBattleMons[gBattlerAttacker].moves[i]; powerOverride = 0; if (ShouldCalculateDamage(gCurrentMove, &dmgByMove[i], &powerOverride)) { - struct DamageCalculationData damageCalcData; - damageCalcData.battlerAtk = gBattlerAttacker; - damageCalcData.battlerDef = gBattlerTarget; - damageCalcData.move = gCurrentMove; - damageCalcData.moveType = GetMoveType(gCurrentMove); - damageCalcData.isCrit = FALSE; - damageCalcData.randomFactor = FALSE; - damageCalcData.updateFlags = FALSE; - gBattleStruct->moveDamage[gBattlerTarget] = CalculateMoveDamage(&damageCalcData, powerOverride); - dmgByMove[i] = gBattleStruct->moveDamage[gBattlerTarget]; + struct DamageContext ctx = {0}; + ctx.battlerAtk = gBattlerAttacker; + ctx.battlerDef = gBattlerTarget; + ctx.move = ctx.chosenMove = gCurrentMove; + ctx.moveType = GetMoveType(gCurrentMove); + ctx.isCrit = FALSE; + ctx.randomFactor = FALSE; + ctx.updateFlags = FALSE; + ctx.isSelfInflicted = FALSE; + ctx.fixedBasePower = powerOverride; + dmgByMove[i] = CalculateMoveDamage(&ctx); if (dmgByMove[i] == 0 && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) dmgByMove[i] = 1; } @@ -1300,8 +1313,8 @@ static void TrySetBattleSeminarShow(void) } } - gBattleStruct->moveDamage[gBattlerTarget] = dmgByMove[gMoveSelectionCursor[gBattlerAttacker]]; gCurrentMove = currMoveSaved; + gBattleStruct->moveResultFlags[gBattlerTarget] = storedMoveResultFlags; } static bool8 ShouldCalculateDamage(u16 move, s32 *dmg, u16 *powerOverride) diff --git a/src/battle_util.c b/src/battle_util.c index 226b041be069..11a5ef583c9f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2,6 +2,7 @@ #include "battle.h" #include "battle_anim.h" #include "battle_arena.h" +#include "battle_environment.h" #include "battle_pyramid.h" #include "battle_util.h" #include "battle_controllers.h" @@ -9,6 +10,7 @@ #include "battle_setup.h" #include "battle_z_move.h" #include "battle_gimmick.h" +#include "battle_hold_effects.h" #include "generational_changes.h" #include "party_menu.h" #include "pokemon.h" @@ -42,8 +44,8 @@ #include "constants/battle_move_effects.h" #include "constants/battle_script_commands.h" #include "constants/battle_string_ids.h" -#include "constants/hold_effects.h" #include "constants/items.h" +#include "constants/item_effects.h" #include "constants/moves.h" #include "constants/songs.h" #include "constants/species.h" @@ -58,16 +60,24 @@ match the ROM; this is also why sSoundMovesTable's declaration is in the middle functions instead of at the top of the file with the other declarations. */ -typedef void (*MoveSuccessOrderCancellers)(u32 *effect); static bool32 TryRemoveScreens(u32 battler); static bool32 IsUnnerveAbilityOnOpposingSide(u32 battler); static u32 GetFlingPowerFromItemId(u32 itemId); static void SetRandomMultiHitCounter(); -static u32 GetBattlerItemHoldEffectParam(u32 battler, u32 item); -static bool32 CanBeInfinitelyConfused(u32 battler); -static bool32 IsAnyTargetAffected(u32 battlerAtk); -static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, u32 abilityDef, u32 abilityAffected, const u8 *battleScript, enum NonVolatileStatus option); -static bool32 CanSleepDueToSleepClause(u32 battlerAtk, u32 battlerDef, enum NonVolatileStatus option); +static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, enum Ability abilityDef, enum Ability abilityAffected, const u8 *battleScript, enum FunctionCallOption option); +static bool32 CanSleepDueToSleepClause(u32 battlerAtk, u32 battlerDef, enum FunctionCallOption option); +static bool32 IsOpposingSideEmpty(u32 battler); +static void ResetParadoxWeatherStat(u32 battler); +static void ResetParadoxTerrainStat(u32 battler); +static bool32 CanBattlerFormChange(u32 battler, enum FormChanges method); + +// Submoves +static u32 GetMirrorMoveMove(void); +static u32 GetMetronomeMove(void); +static u32 GetAssistMove(void); +static u32 GetSleepTalkMove(void); +static u32 GetCopyCatMove(void); +static u32 GetMeFirstMove(void); ARM_FUNC NOINLINE static uq4_12_t PercentToUQ4_12(u32 percent); ARM_FUNC NOINLINE static uq4_12_t PercentToUQ4_12_Floored(u32 percent); @@ -204,6 +214,24 @@ static const struct BattleWeatherInfo sBattleWeatherInfo[BATTLE_WEATHER_COUNT] = }, }; +// Helper function for actual dmg calcs during battle. For simulated AI dmg, CalcTypeEffectivenessMultiplier should be used directly +// This should stay a static function. Ideally everything else is handled through CalcTypeEffectivenessMultiplier just like AI +static uq4_12_t CalcTypeEffectivenessMultiplierHelper(u32 move, enum Type moveType, u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, bool32 recordAbilities) +{ + struct DamageContext ctx = {0}; + ctx.battlerAtk = battlerAtk; + ctx.battlerDef = battlerDef; + ctx.move = ctx.chosenMove = move; + ctx.moveType = moveType; + ctx.updateFlags = recordAbilities; + ctx.abilityAtk = abilityAtk; + ctx.abilityDef = abilityDef; + ctx.holdEffectAtk = GetBattlerHoldEffect(battlerAtk); + ctx.holdEffectDef = GetBattlerHoldEffect(battlerDef); + + return CalcTypeEffectivenessMultiplier(&ctx); +} + u32 GetCurrentBattleWeather(void) { u32 currBattleWeather = 0xFF; @@ -231,7 +259,10 @@ bool32 EndOrContinueWeather(void) { gBattleWeather = B_WEATHER_NONE; for (u32 battler = 0; battler < gBattlersCount; battler++) + { gDisableStructs[battler].weatherAbilityDone = FALSE; + ResetParadoxWeatherStat(battler); + } gBattleCommunication[MULTISTRING_CHOOSER] = sBattleWeatherInfo[currBattleWeather].endMessage; BattleScriptExecute(BattleScript_WeatherFaded); return TRUE; @@ -247,20 +278,36 @@ bool32 EndOrContinueWeather(void) return FALSE; } +// Gen5+ static u32 CalcBeatUpPower(void) { - u32 basePower; - u32 species; - struct Pokemon *party = GetBattlerParty(gBattlerAttacker); + u32 species = gBattleStruct->beatUpSpecies[gBattleStruct->beatUpSlot++]; + return (GetSpeciesBaseAttack(species) / 10) + 5; +} + +// Gen 3/4 +static s32 CalcBeatUpDamage(struct DamageContext *ctx) +{ + u32 partyIndex = gBattleStruct->beatUpSpecies[gBattleStruct->beatUpSlot++]; + struct Pokemon *party = GetBattlerParty(ctx->battlerAtk); + u32 species = GetMonData(&party[partyIndex], MON_DATA_SPECIES); + u32 levelFactor = GetMonData(&party[partyIndex], MON_DATA_LEVEL) * 2 / 5 + 2; + s32 dmg = GetSpeciesBaseAttack(species); - // Party slot is incremented by the battle script for Beat Up after this damage calculation - species = GetMonData(&party[gBattleStruct->beatUpSlot], MON_DATA_SPECIES); - basePower = (gSpeciesInfo[species].baseAttack / 10) + 5; + dmg *= GetMovePower(ctx->move); + dmg *= levelFactor; + dmg /= GetSpeciesBaseDefense(gBattleMons[ctx->battlerDef].species); + dmg = (dmg / 50) + 2; - return basePower; + if (gProtectStructs[ctx->battlerAtk].helpingHand) + dmg = dmg * 15 / 10; + if (ctx->isCrit) + dmg *= 2; + + return dmg; } -static bool32 ShouldTeraShellDistortTypeMatchups(u32 move, u32 battlerDef, u32 abilityDef) +static bool32 ShouldTeraShellDistortTypeMatchups(u32 move, u32 battlerDef, enum Ability abilityDef) { if (!gSpecialStatuses[battlerDef].distortedTypeMatchups && gBattleMons[battlerDef].species == SPECIES_TERAPAGOS_TERASTAL @@ -283,23 +330,62 @@ static inline bool32 IsDragonDartsSecondHit(u32 effect) return FALSE; } +bool32 IsUnnerveBlocked(u32 battler, u32 itemId) +{ + if (GetItemPocket(itemId) != POCKET_BERRIES) + return FALSE; + + if (gBattleScripting.overrideBerryRequirements > 0) // Berries that aren't eaten naturally ignore unnerve + return FALSE; + + if (IsUnnerveAbilityOnOpposingSide(battler)) + return TRUE; + + return FALSE; +} + +static bool32 IsUnnerveAbilityOnOpposingSide(u32 battler) +{ + for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + { + if (battler == battlerDef || IsBattlerAlly(battler, battlerDef)) + continue; + + if (!IsBattlerAlive(battlerDef)) + continue; + + enum Ability ability = GetBattlerAbility(battlerDef); + switch (ability) + { + case ABILITY_UNNERVE: + case ABILITY_AS_ONE_ICE_RIDER: + case ABILITY_AS_ONE_SHADOW_RIDER: + return TRUE; + default: + break; + } + } + + return FALSE; +} + bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move) { - u32 ability = GetBattlerAbility(battlerAtk); + enum Ability ability = GetBattlerAbility(battlerAtk); enum BattleMoveEffects effect = GetMoveEffect(move); if (gSideTimers[defSide].followmeTimer == 0 || (!IsBattlerAlive(gSideTimers[defSide].followmeTarget) && !IsDragonDartsSecondHit(effect)) || effect == EFFECT_SNIPE_SHOT || effect == EFFECT_SKY_DROP - || ability == ABILITY_PROPELLER_TAIL - || ability == ABILITY_STALWART) + || IsAbilityAndRecord(battlerAtk, ability, ABILITY_PROPELLER_TAIL) + || IsAbilityAndRecord(battlerAtk, ability, ABILITY_STALWART)) return FALSE; if (effect == EFFECT_PURSUIT && IsPursuitTargetSet()) return FALSE; - if (gSideTimers[defSide].followmePowder && !IsAffectedByPowder(battlerAtk, ability, GetBattlerHoldEffect(battlerAtk, TRUE))) + if (gSideTimers[defSide].followmePowder && !IsAffectedByPowderMove(battlerAtk, ability, GetBattlerHoldEffect(battlerAtk))) return FALSE; return TRUE; @@ -309,10 +395,10 @@ bool32 HandleMoveTargetRedirection(void) { u32 redirectorOrderNum = MAX_BATTLERS_COUNT; u16 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); - u32 moveType = GetBattleMoveType(gCurrentMove); + enum Type moveType = GetBattleMoveType(gCurrentMove); enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); u32 side = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker)); - u32 ability = GetBattlerAbility(gBattleStruct->moveTarget[gBattlerAttacker]); + enum Ability ability = GetBattlerAbility(gBattleStruct->moveTarget[gBattlerAttacker]); if (IsAffectedByFollowMe(gBattlerAttacker, side, gCurrentMove) && moveTarget == MOVE_TARGET_SELECTED @@ -328,6 +414,7 @@ bool32 HandleMoveTargetRedirection(void) || (ability != ABILITY_STORM_DRAIN && moveType == TYPE_WATER))) { // Find first battler that redirects the move (in turn order) + enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); u32 battler; for (battler = 0; battler < gBattlersCount; battler++) { @@ -340,23 +427,19 @@ bool32 HandleMoveTargetRedirection(void) && GetBattlerTurnOrderNum(battler) < redirectorOrderNum && moveEffect != EFFECT_SNIPE_SHOT && moveEffect != EFFECT_PLEDGE - && GetBattlerAbility(gBattlerAttacker) != ABILITY_PROPELLER_TAIL - && GetBattlerAbility(gBattlerAttacker) != ABILITY_STALWART) + && !IsAbilityAndRecord(gBattlerAttacker, abilityAtk, ABILITY_PROPELLER_TAIL) + && !IsAbilityAndRecord(gBattlerAttacker, abilityAtk, ABILITY_STALWART)) { redirectorOrderNum = GetBattlerTurnOrderNum(battler); } } - if (redirectorOrderNum != MAX_BATTLERS_COUNT) + if (redirectorOrderNum != MAX_BATTLERS_COUNT && gCurrentMove != MOVE_TEATIME) { - u16 battlerAbility; + enum Ability battlerAbility; battler = gBattlerByTurnOrder[redirectorOrderNum]; battlerAbility = GetBattlerAbility(battler); - - RecordAbilityBattle(battler, gBattleMons[battler].ability); - if (battlerAbility == ABILITY_LIGHTNING_ROD && gCurrentMove != MOVE_TEATIME) - gSpecialStatuses[battler].lightningRodRedirected = TRUE; - else if (battlerAbility == ABILITY_STORM_DRAIN) - gSpecialStatuses[battler].stormDrainRedirected = TRUE; + RecordAbilityBattle(battler, battlerAbility); + gSpecialStatuses[battler].abilityRedirected = TRUE; gBattlerTarget = battler; return TRUE; } @@ -370,7 +453,7 @@ void HandleAction_UseMove(void) u32 i, moveTarget; gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; - if (gBattleStruct->battlerState[gBattlerAttacker].absent + if (gAbsentBattlerFlags & 1u << gBattlerAttacker || gBattleStruct->battlerState[gBattlerAttacker].commandingDondozo || !IsBattlerAlive(gBattlerAttacker)) { @@ -378,12 +461,6 @@ void HandleAction_UseMove(void) return; } - gBattleStruct->atkCancellerTracker = 0; - ClearDamageCalcResults(); - gMultiHitCounter = 0; - gBattleScripting.savedDmg = 0; - gBattleCommunication[MISS_TYPE] = 0; - gBattleScripting.savedMoveEffect = 0; gCurrMovePos = gChosenMovePos = gBattleStruct->chosenMovePositions[gBattlerAttacker]; // choose move @@ -391,10 +468,9 @@ void HandleAction_UseMove(void) { gProtectStructs[gBattlerAttacker].noValidMoves = FALSE; gCurrentMove = gChosenMove = MOVE_STRUGGLE; - gHitMarker |= HITMARKER_NO_PPDEDUCT; gBattleStruct->moveTarget[gBattlerAttacker] = GetBattleMoveTarget(MOVE_STRUGGLE, NO_TARGET_OVERRIDE); } - else if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS || gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE) + else if (gBattleMons[gBattlerAttacker].volatiles.multipleTurns || gDisableStructs[gBattlerAttacker].rechargeTimer > 0) { gCurrentMove = gChosenMove = gLockedMoves[gBattlerAttacker]; } @@ -404,7 +480,8 @@ void HandleAction_UseMove(void) { gCurrentMove = gChosenMove = gDisableStructs[gBattlerAttacker].encoredMove; gCurrMovePos = gChosenMovePos = gDisableStructs[gBattlerAttacker].encoredMovePos; - gBattleStruct->moveTarget[gBattlerAttacker] = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); + if (GetConfig(CONFIG_ENCORE_TARGET) < GEN_5) + gBattleStruct->moveTarget[gBattlerAttacker] = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); } // check if the encored move wasn't overwritten else if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].encoredMove != MOVE_NONE @@ -451,6 +528,11 @@ void HandleAction_UseMove(void) gCurrentMove = gChosenMove = GetMaxMove(gBattlerAttacker, gCurrentMove); } + gBattleStruct->eventState.atkCanceler = 0; + ClearDamageCalcResults(); + gMultiHitCounter = 0; + gBattleCommunication[MISS_TYPE] = 0; + moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); if (!HandleMoveTargetRedirection()) @@ -487,9 +569,10 @@ void HandleAction_UseMove(void) } else { - gBattlerTarget = *(gBattleStruct->moveTarget + gBattlerAttacker); + gBattlerTarget = gBattleStruct->moveTarget[gBattlerAttacker]; if (!IsBattlerAlive(gBattlerTarget) && moveTarget != MOVE_TARGET_OPPONENTS_FIELD + && IsDoubleBattle() && (!IsBattlerAlly(gBattlerAttacker, gBattlerTarget))) { gBattlerTarget = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerTarget))); @@ -517,8 +600,7 @@ void HandleAction_UseMove(void) gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; } } - - if (IsBattlerAlly(gBattlerAttacker, gBattlerTarget) && !IsBattlerAlive(gBattlerTarget)) + else if (IsBattlerAlly(gBattlerAttacker, gBattlerTarget) && !IsBattlerAlive(gBattlerTarget)) { gBattlescriptCurrInstr = BattleScript_FailedFromAtkCanceler; } @@ -537,7 +619,7 @@ void HandleAction_UseMove(void) BattleArena_AddMindPoints(gBattlerAttacker); for (i = 0; i < MAX_BATTLERS_COUNT; i++) - gBattleStruct->hpBefore[i] = gBattleMons[i].hp; + gBattleStruct->battlerState[i].wasAboveHalfHp = gBattleMons[i].hp > gBattleMons[i].maxHP / 2; gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } @@ -580,6 +662,11 @@ void HandleAction_UseItem(void) ClearVariousBattlerFlags(gBattlerAttacker); gLastUsedItem = gBattleResources->bufferB[gBattlerAttacker][1] | (gBattleResources->bufferB[gBattlerAttacker][2] << 8); + if (X_ITEM_FRIENDSHIP_INCREASE > 0 + && GetItemEffectType(gLastUsedItem) == ITEM_EFFECT_X_ITEM + && !ShouldSkipFriendshipChange()) + UpdateFriendshipFromXItem(gBattlerAttacker); + gBattlescriptCurrInstr = gBattlescriptsForUsingItem[GetItemBattleUsage(gLastUsedItem) - 1]; gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } @@ -614,7 +701,7 @@ bool32 TryRunFromBattle(u32 battler) } else if (GetBattlerAbility(battler) == ABILITY_RUN_AWAY) { - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) { gBattleStruct->runTries++; pyramidMultiplier = GetPyramidRunMultiplier(); @@ -647,7 +734,7 @@ bool32 TryRunFromBattle(u32 battler) if (!IsBattlerAlive(runningFromBattler)) runningFromBattler |= BIT_FLANK; - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) { pyramidMultiplier = GetPyramidRunMultiplier(); speedVar = (gBattleMons[battler].speed * pyramidMultiplier) / (gBattleMons[runningFromBattler].speed) + (gBattleStruct->runTries * 30); @@ -717,7 +804,9 @@ void HandleAction_Run(void) } else { - if (!CanBattlerEscape(gBattlerAttacker)) + if (GetBattlerHoldEffect(gBattlerAttacker) != HOLD_EFFECT_CAN_ALWAYS_RUN + && GetBattlerAbility(gBattlerAttacker) != ABILITY_RUN_AWAY + && !CanBattlerEscape(gBattlerAttacker)) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ATTACKER_CANT_ESCAPE; gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString; @@ -845,7 +934,7 @@ void HandleAction_TryFinish(void) { if (!HandleFaintedMonActions()) { - gBattleStruct->faintedActionsState = 0; + gBattleStruct->eventState.faintedAction = 0; gCurrentActionFuncId = B_ACTION_FINISHED; } } @@ -854,9 +943,8 @@ void HandleAction_NothingIsFainted(void) { gCurrentTurnActionNumber++; gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; - gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED - | HITMARKER_NO_PPDEDUCT | HITMARKER_STATUS_ABILITY_EFFECT | HITMARKER_PASSIVE_DAMAGE - | HITMARKER_OBEYS | HITMARKER_SYNCHRONIZE_EFFECT | HITMARKER_CHARGING); + gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_NONE; + gHitMarker &= ~(HITMARKER_OBEYS); } void HandleAction_ActionFinished(void) @@ -866,14 +954,11 @@ void HandleAction_ActionFinished(void) gBattleStruct->monToSwitchIntoId[gBattlerByTurnOrder[gCurrentTurnActionNumber]] = gSelectedMonPartyId = PARTY_SIZE; gCurrentTurnActionNumber++; gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; - SpecialStatusesClear(); - gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED - | HITMARKER_NO_PPDEDUCT | HITMARKER_STATUS_ABILITY_EFFECT | HITMARKER_PASSIVE_DAMAGE - | HITMARKER_OBEYS | HITMARKER_SYNCHRONIZE_EFFECT - | HITMARKER_CHARGING | HITMARKER_IGNORE_DISGUISE); + memset(&gSpecialStatuses, 0, sizeof(gSpecialStatuses)); + gHitMarker &= ~(HITMARKER_OBEYS); + gCurrentMove = MOVE_NONE; ClearDamageCalcResults(); - gCurrentMove = 0; gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; gBattleStruct->dynamicMoveType = 0; @@ -882,34 +967,41 @@ void HandleAction_ActionFinished(void) gBattleScripting.moveendState = 0; gBattleCommunication[3] = 0; gBattleCommunication[4] = 0; - gBattleScripting.multihitMoveEffect = 0; gBattleResources->battleScriptsStack->size = 0; + gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_NONE; - if (B_RECALC_TURN_AFTER_ACTIONS >= GEN_8 && !afterYouActive && !gBattleStruct->pledgeMove && !IsPursuitTargetSet()) + if (GetConfig(CONFIG_RECALC_TURN_AFTER_ACTIONS) >= GEN_8 && !afterYouActive && !gBattleStruct->pledgeMove && !IsPursuitTargetSet()) { // i starts at `gCurrentTurnActionNumber` because we don't want to recalculate turn order for mon that have already // taken action. It's been previously increased, which we want in order to not recalculate the turn of the mon that just finished its action + + struct BattleContext ctx = {0}; + for (i = 0; i < gBattlersCount; i++) + { + ctx.abilities[i] = GetBattlerAbility(i); + ctx.holdEffects[i] = GetBattlerHoldEffect(i); + } for (i = gCurrentTurnActionNumber; i < gBattlersCount - 1; i++) { for (j = i + 1; j < gBattlersCount; j++) { - u32 battler1 = gBattlerByTurnOrder[i]; - u32 battler2 = gBattlerByTurnOrder[j]; + ctx.battlerAtk = gBattlerByTurnOrder[i]; + ctx.battlerDef = gBattlerByTurnOrder[j]; - if (gProtectStructs[battler1].quash || gProtectStructs[battler2].quash - || gProtectStructs[battler1].shellTrap || gProtectStructs[battler2].shellTrap) + if (gProtectStructs[ctx.battlerAtk].quash || gProtectStructs[ctx.battlerDef].quash + || gProtectStructs[ctx.battlerAtk].shellTrap || gProtectStructs[ctx.battlerDef].shellTrap) continue; // We recalculate order only for action of the same priority. If any action other than switch/move has been taken, they should // have been executed before. The only recalculation needed is for moves/switch. Mega evolution is handled in src/battle_main.c/TryChangeOrder if ((gActionsByTurnOrder[i] == B_ACTION_USE_MOVE && gActionsByTurnOrder[j] == B_ACTION_USE_MOVE)) { - if (GetWhichBattlerFaster(battler1, battler2, FALSE) == -1) + if (GetWhichBattlerFaster(&ctx, FALSE) == -1) SwapTurnOrder(i, j); } else if ((gActionsByTurnOrder[i] == B_ACTION_SWITCH && gActionsByTurnOrder[j] == B_ACTION_SWITCH)) { - if (GetWhichBattlerFaster(battler1, battler2, TRUE) == -1) // If the actions chosen are switching, we recalc order but ignoring the moves + if (GetWhichBattlerFaster(&ctx, TRUE) == -1) // If the actions chosen are switching, we recalc order but ignoring the moves SwapTurnOrder(i, j); } } @@ -1028,7 +1120,7 @@ const u8 *CheckSkyDropState(u32 battler, enum SkyDropState skyDropState) const u8 *result = NULL; u8 otherSkyDropper = gBattleStruct->skyDropTargets[battler]; - gStatuses3[otherSkyDropper] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); + gBattleMons[battler].volatiles.semiInvulnerable = STATE_NONE; // Makes both attacker and target's sprites visible gSprites[gBattlerSpriteIds[battler]].invisible = FALSE; @@ -1037,28 +1129,29 @@ const u8 *CheckSkyDropState(u32 battler, enum SkyDropState skyDropState) // If target was sky dropped in the middle of Outrage/Thrash/Petal Dance, // confuse them upon release and display "confused by fatigue" message & animation. // Don't do this if this CancelMultiTurnMoves is caused by falling asleep via Yawn. - if (gBattleMons[otherSkyDropper].status2 & STATUS2_LOCK_CONFUSE && skyDropState != SKY_DROP_STATUS_YAWN) + if (gBattleMons[otherSkyDropper].volatiles.lockConfusionTurns && skyDropState != SKY_DROP_STATUS_YAWN) { - gBattleMons[otherSkyDropper].status2 &= ~(STATUS2_LOCK_CONFUSE); + gBattleMons[otherSkyDropper].volatiles.lockConfusionTurns = 0; // If the target can be confused, confuse them. // Don't use CanBeConfused, can cause issues in edge cases. - if (!(GetBattlerAbility(otherSkyDropper) == ABILITY_OWN_TEMPO - || gBattleMons[otherSkyDropper].status2 & STATUS2_CONFUSION - || IsBattlerTerrainAffected(otherSkyDropper, STATUS_FIELD_MISTY_TERRAIN))) + enum Ability ability = GetBattlerAbility(otherSkyDropper); + if (!(gBattleMons[otherSkyDropper].volatiles.confusionTurns > 0 + || IsAbilityAndRecord(otherSkyDropper, ability, ABILITY_OWN_TEMPO) + || IsBattlerTerrainAffected(otherSkyDropper, ability, GetBattlerHoldEffect(otherSkyDropper), STATUS_FIELD_MISTY_TERRAIN))) { // Set confused status - gBattleMons[otherSkyDropper].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); + gBattleMons[otherSkyDropper].volatiles.confusionTurns = ((Random()) % 4) + 2; - if (skyDropState == SKY_DROP_ATTACKCANCELLER_CHECK) + if (skyDropState == SKY_DROP_ATTACKCANCELER_CHECK) { gBattleStruct->skyDropTargets[battler] = SKY_DROP_RELEASED_TARGET; } else if (skyDropState == SKY_DROP_GRAVITY_ON_AIRBORNE) { - // Reapplying STATUS3_SKY_DROPPED allows for avoiding unecessary messages when Gravity is applied to the target. + // Reapplying STATE_SKY_DROPPED allows for avoiding unecessary messages when Gravity is applied to the target. gBattleStruct->skyDropTargets[battler] = SKY_DROP_RELEASED_TARGET; - gStatuses3[otherSkyDropper] |= STATUS3_SKY_DROPPED; + gBattleMons[otherSkyDropper].volatiles.semiInvulnerable = STATE_SKY_DROP; } else if (skyDropState == SKY_DROP_CANCEL_MULTI_TURN_MOVES) { @@ -1075,7 +1168,7 @@ const u8 *CheckSkyDropState(u32 battler, enum SkyDropState skyDropState) } // Clear skyDropTargets data, unless this CancelMultiTurnMoves is caused by Yawn, attackcanceler, or VARIOUS_GRAVITY_ON_AIRBORNE_MONS - if (!(gBattleMons[otherSkyDropper].status2 & STATUS2_LOCK_CONFUSE) && gBattleStruct->skyDropTargets[battler] < 4) + if (!(gBattleMons[otherSkyDropper].volatiles.lockConfusionTurns) && gBattleStruct->skyDropTargets[battler] < 4) { gBattleStruct->skyDropTargets[battler] = SKY_DROP_NO_TARGET; gBattleStruct->skyDropTargets[otherSkyDropper] = SKY_DROP_NO_TARGET; @@ -1087,25 +1180,25 @@ const u8 *CheckSkyDropState(u32 battler, enum SkyDropState skyDropState) const u8 *CancelMultiTurnMoves(u32 battler, enum SkyDropState skyDropState) { const u8 *result = NULL; - gBattleMons[battler].status2 &= ~(STATUS2_UPROAR); - gBattleMons[battler].status2 &= ~(STATUS2_BIDE); + gBattleMons[battler].volatiles.uproarTurns = 0; + gBattleMons[battler].volatiles.bideTurns = 0; if (B_RAMPAGE_CANCELLING < GEN_5) { - gBattleMons[battler].status2 &= ~(STATUS2_MULTIPLETURNS); - gBattleMons[battler].status2 &= ~(STATUS2_LOCK_CONFUSE); + gBattleMons[battler].volatiles.multipleTurns = 0; + gBattleMons[battler].volatiles.lockConfusionTurns = 0; } - else if (!(gBattleMons[battler].status2 & STATUS2_LOCK_CONFUSE) - || ((gBattleMons[battler].status2 & STATUS2_LOCK_CONFUSE) > STATUS2_LOCK_CONFUSE_TURN(1))) + else if (!gBattleMons[battler].volatiles.lockConfusionTurns + || gBattleMons[battler].volatiles.lockConfusionTurns > 1) { - gBattleMons[battler].status2 &= ~(STATUS2_MULTIPLETURNS); + gBattleMons[battler].volatiles.multipleTurns = 0; } // Clear battler's semi-invulnerable bits if they are not held by Sky Drop. - if (!(gStatuses3[battler] & STATUS3_SKY_DROPPED)) - gStatuses3[battler] &= ~(STATUS3_SEMI_INVULNERABLE); + if (gBattleMons[battler].volatiles.semiInvulnerable != STATE_SKY_DROP) + gBattleMons[battler].volatiles.semiInvulnerable = STATE_NONE; - if (gBattleStruct->skyDropTargets[battler] != SKY_DROP_NO_TARGET && !(gStatuses3[battler] & STATUS3_SKY_DROPPED)) + if (gBattleStruct->skyDropTargets[battler] != SKY_DROP_NO_TARGET && gBattleMons[battler].volatiles.semiInvulnerable != STATE_SKY_DROP) result = CheckSkyDropState(battler, skyDropState); gDisableStructs[battler].rolloutTimer = 0; @@ -1118,57 +1211,109 @@ bool32 WasUnableToUseMove(u32 battler) { if (gProtectStructs[battler].nonVolatileStatusImmobility || gProtectStructs[battler].unableToUseMove - || gProtectStructs[battler].powderSelfDmg || gProtectStructs[battler].confusionSelfDmg) return TRUE; return FALSE; } +// Returns TRUE if no other battler after this one in turn order will use a move +bool32 IsLastMonToMove(u32 battler) +{ + u32 i; + u32 battlerTurnOrderNum = GetBattlerTurnOrderNum(battler); + + if (battlerTurnOrderNum >= gBattlersCount - 1) + return TRUE; + + for (i = battlerTurnOrderNum + 1; i < gBattlersCount; i++) + { + u32 otherBattler = gBattlerByTurnOrder[i]; + if (!IsBattlerAlive(otherBattler)) + continue; + if (gActionsByTurnOrder[i] == B_ACTION_USE_MOVE) + return FALSE; + } + return TRUE; +} + +bool32 ShouldDefiantCompetitiveActivate(u32 battler, enum Ability ability) +{ + u32 side = GetBattlerSide(battler); + if (ability != ABILITY_DEFIANT && ability != ABILITY_COMPETITIVE) + return FALSE; + // if an ally dropped the stats (except for Sticky Web), don't activate + if (IsBattlerAlly(gSpecialStatuses[battler].changedStatsBattlerId, battler) && !gBattleScripting.stickyWebStatDrop) + return FALSE; + + if (GetConfig(CONFIG_DEFIANT_STICKY_WEB) >= GEN_9 || !gBattleScripting.stickyWebStatDrop) + return TRUE; + // only activate Defiant/Competitive if Web was setup by foe + return gSideTimers[side].stickyWebBattlerSide != side; +} + void PrepareStringBattle(enum StringID stringId, u32 battler) { - u32 targetSide = GetBattlerSide(gBattlerTarget); u16 battlerAbility = GetBattlerAbility(battler); u16 targetAbility = GetBattlerAbility(gBattlerTarget); // Support for Contrary ability. // If a move attempted to raise stat - print "won't increase". // If a move attempted to lower stat - print "won't decrease". - if (stringId == STRINGID_STATSWONTDECREASE && !(gBattleScripting.statChanger & STAT_BUFF_NEGATIVE)) - stringId = STRINGID_STATSWONTINCREASE; - else if (stringId == STRINGID_STATSWONTINCREASE && gBattleScripting.statChanger & STAT_BUFF_NEGATIVE) - stringId = STRINGID_STATSWONTDECREASE; - - else if (stringId == STRINGID_STATSWONTDECREASE2 && battlerAbility == ABILITY_CONTRARY) - stringId = STRINGID_STATSWONTINCREASE2; - else if (stringId == STRINGID_STATSWONTINCREASE2 && battlerAbility == ABILITY_CONTRARY) - stringId = STRINGID_STATSWONTDECREASE2; - - // Check Defiant and Competitive stat raise whenever a stat is lowered. - else if ((stringId == STRINGID_DEFENDERSSTATFELL || stringId == STRINGID_PKMNCUTSATTACKWITH) - && ((targetAbility == ABILITY_DEFIANT && CompareStat(gBattlerTarget, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) - || (targetAbility == ABILITY_COMPETITIVE && CompareStat(gBattlerTarget, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN))) - && gSpecialStatuses[gBattlerTarget].changedStatsBattlerId != BATTLE_PARTNER(gBattlerTarget) - && ((gSpecialStatuses[gBattlerTarget].changedStatsBattlerId != gBattlerTarget) || gBattleScripting.stickyWebStatDrop == 1) - && !(gBattleScripting.stickyWebStatDrop == 1 && gSideTimers[targetSide].stickyWebBattlerSide == targetSide)) // Sticky Web must have been set by the foe + switch (stringId) + { + case STRINGID_ATTACKERSSTATROSE: + case STRINGID_DEFENDERSSTATROSE: + case STRINGID_STATSWONTINCREASE: + case STRINGID_USINGITEMSTATOFPKMNROSE: + if (gBattleScripting.statChanger & STAT_BUFF_NEGATIVE) + stringId = gStatDownStringIds[gBattleCommunication[MULTISTRING_CHOOSER]]; + break; + case STRINGID_ATTACKERSSTATFELL: + case STRINGID_DEFENDERSSTATFELL: + case STRINGID_STATSWONTDECREASE: + case STRINGID_USINGITEMSTATOFPKMNFELL: + if (!(gBattleScripting.statChanger & STAT_BUFF_NEGATIVE)) + stringId = gStatUpStringIds[gBattleCommunication[MULTISTRING_CHOOSER]]; + break; + case STRINGID_STATSWONTINCREASE2: + if (battlerAbility == ABILITY_CONTRARY) + stringId = STRINGID_STATSWONTDECREASE2; + break; + case STRINGID_STATSWONTDECREASE2: + if (battlerAbility == ABILITY_CONTRARY) + stringId = STRINGID_STATSWONTINCREASE2; + break; + case STRINGID_PKMNCUTSATTACKWITH: + if (GetConfig(CONFIG_UPDATED_INTIMIDATE) >= GEN_8 + && targetAbility == ABILITY_RATTLED + && CompareStat(gBattlerTarget, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN, targetAbility)) + { + gBattlerAbility = gBattlerTarget; + BattleScriptCall(BattleScript_AbilityRaisesDefenderStat); + SET_STATCHANGER(STAT_SPEED, 1, FALSE); + } + else if (targetAbility == ABILITY_CONTRARY) + { + stringId = STRINGID_DEFENDERSSTATROSE; + } + break; + case STRINGID_ITDOESNTAFFECT: + case STRINGID_PKMNUNAFFECTED: + TryInitializeTrainerSlideEnemyMonUnaffected(gBattlerTarget); + break; + default: + break; + } + + if ((stringId == STRINGID_PKMNCUTSATTACKWITH || stringId == STRINGID_DEFENDERSSTATFELL) + && ShouldDefiantCompetitiveActivate(gBattlerTarget, targetAbility)) { gBattlerAbility = gBattlerTarget; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityRaisesDefenderStat; + BattleScriptCall(BattleScript_AbilityRaisesDefenderStat); if (targetAbility == ABILITY_DEFIANT) SET_STATCHANGER(STAT_ATK, 2, FALSE); else SET_STATCHANGER(STAT_SPATK, 2, FALSE); } - else if (B_UPDATED_INTIMIDATE >= GEN_8 && stringId == STRINGID_PKMNCUTSATTACKWITH && targetAbility == ABILITY_RATTLED - && CompareStat(gBattlerTarget, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN)) - { - gBattlerAbility = gBattlerTarget; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityRaisesDefenderStat; - SET_STATCHANGER(STAT_SPEED, 1, FALSE); - } - - if ((stringId == STRINGID_ITDOESNTAFFECT || stringId == STRINGID_PKMNWASNTAFFECTED || stringId == STRINGID_PKMNUNAFFECTED)) - TryInitializeTrainerSlideEnemyMonUnaffected(gBattlerTarget); BtlController_EmitPrintString(battler, B_COMM_TO_CONTROLLER, stringId); MarkBattlerForControllerExec(battler); @@ -1232,6 +1377,12 @@ void BattleScriptPushCursor(void) gBattleResources->battleScriptsStack->ptr[gBattleResources->battleScriptsStack->size++] = gBattlescriptCurrInstr; } +void BattleScriptCall(const u8 *bsPtr) +{ + BattleScriptPushCursor(); + gBattlescriptCurrInstr = bsPtr; +} + void BattleScriptPop(void) { if (gBattleResources->battleScriptsStack->size != 0) @@ -1248,7 +1399,7 @@ static bool32 IsGravityPreventingMove(u32 move) bool32 IsHealBlockPreventingMove(u32 battler, u32 move) { - if (!(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) + if (!gBattleMons[battler].volatiles.healBlock) return FALSE; return IsHealingMove(move); @@ -1259,7 +1410,7 @@ bool32 IsBelchPreventingMove(u32 battler, u32 move) if (GetMoveEffect(move) != EFFECT_BELCH) return FALSE; - return !gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].ateBerry; + return !GetBattlerPartyState(battler)->ateBerry; } // Dynamax bypasses all selection prevention except Taunt and Assault Vest. @@ -1270,10 +1421,28 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) u32 limitations = 0; u8 moveId = gBattleResources->bufferB[battler][2] & ~RET_GIMMICK; u32 move = gBattleMons[battler].moves[moveId]; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); u16 *choicedMove = &gBattleStruct->choicedMove[battler]; enum BattleMoveEffects moveEffect = GetMoveEffect(move); + if (GetConfig(CONFIG_ENCORE_TARGET) >= GEN_5 + && DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gDisableStructs[battler].encoredMove != move && gDisableStructs[battler].encoredMove != MOVE_NONE) + { + gBattleScripting.battler = battler; + gCurrentMove = gDisableStructs[battler].encoredMove; + if (gBattleTypeFlags & BATTLE_TYPE_PALACE) + { + gPalaceSelectionBattleScripts[battler] = BattleScript_EncoredMoveInPalace; + gProtectStructs[battler].palaceUnableToUseMove = TRUE; + } + else + { + gSelectionBattleScripts[battler] = BattleScript_EncoredMove; + limitations++; + } + return limitations; + } + if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gDisableStructs[battler].disabledMove == move && move != MOVE_NONE) { gBattleScripting.battler = battler; @@ -1290,7 +1459,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && move == gLastMoves[battler] && move != MOVE_STRUGGLE && (gBattleMons[battler].status2 & STATUS2_TORMENT)) + if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && move == gLastMoves[battler] && move != MOVE_STRUGGLE && (gBattleMons[battler].volatiles.torment == TRUE)) { CancelMultiTurnMoves(battler, SKY_DROP_IGNORE); if (gBattleTypeFlags & BATTLE_TYPE_PALACE) @@ -1323,7 +1492,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gDisableStructs[battler].throatChopTimer > gBattleTurnCounter && IsSoundMove(move)) + if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gDisableStructs[battler].throatChopTimer > 0 && IsSoundMove(move)) { gCurrentMove = move; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) @@ -1430,7 +1599,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } gPotentialItemEffectBattler = battler; - if (DYNAMAX_BYPASS_CHECK && HOLD_EFFECT_CHOICE(holdEffect) && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != move) + if (DYNAMAX_BYPASS_CHECK && IsHoldEffectChoice(holdEffect) && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != move) { gCurrentMove = *choicedMove; gLastUsedItem = gBattleMons[battler].item; @@ -1510,11 +1679,11 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) return limitations; } -u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) +u32 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) { u32 move; enum BattleMoveEffects moveEffect; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); u16 *choicedMove = &gBattleStruct->choicedMove[battler]; s32 i; @@ -1537,7 +1706,7 @@ u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) else if (check & MOVE_LIMITATION_DISABLED && move == gDisableStructs[battler].disabledMove) unusableMoves |= 1u << i; // Torment - else if (check & MOVE_LIMITATION_TORMENTED && move == gLastMoves[battler] && gBattleMons[battler].status2 & STATUS2_TORMENT) + else if (check & MOVE_LIMITATION_TORMENTED && move == gLastMoves[battler] && gBattleMons[battler].volatiles.torment == TRUE) unusableMoves |= 1u << i; // Taunt else if (check & MOVE_LIMITATION_TAUNT && gDisableStructs[battler].tauntTimer && IsBattleMoveStatus(move)) @@ -1549,7 +1718,7 @@ u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) else if (check & MOVE_LIMITATION_ENCORE && gDisableStructs[battler].encoreTimer && gDisableStructs[battler].encoredMove != move) unusableMoves |= 1u << i; // Choice Items - else if (check & MOVE_LIMITATION_CHOICE_ITEM && HOLD_EFFECT_CHOICE(holdEffect) && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != move) + else if (check & MOVE_LIMITATION_CHOICE_ITEM && IsHoldEffectChoice(holdEffect) && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != move) unusableMoves |= 1u << i; // Assault Vest else if (check & MOVE_LIMITATION_ASSAULT_VEST && holdEffect == HOLD_EFFECT_ASSAULT_VEST && IsBattleMoveStatus(move) && moveEffect != EFFECT_ME_FIRST) @@ -1564,7 +1733,7 @@ u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) else if (check & MOVE_LIMITATION_BELCH && IsBelchPreventingMove(battler, move)) unusableMoves |= 1u << i; // Throat Chop - else if (check & MOVE_LIMITATION_THROAT_CHOP && gDisableStructs[battler].throatChopTimer > gBattleTurnCounter && IsSoundMove(move)) + else if (check & MOVE_LIMITATION_THROAT_CHOP && gDisableStructs[battler].throatChopTimer > 0 && IsSoundMove(move)) unusableMoves |= 1u << i; // Stuff Cheeks else if (check & MOVE_LIMITATION_STUFF_CHEEKS && moveEffect == EFFECT_STUFF_CHEEKS && GetItemPocket(gBattleMons[battler].item) != POCKET_BERRIES) @@ -1582,7 +1751,7 @@ u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) #define ALL_MOVES_MASK ((1 << MAX_MON_MOVES) - 1) bool32 AreAllMovesUnusable(u32 battler) { - u8 unusable = CheckMoveLimitations(battler, 0, MOVE_LIMITATIONS_ALL); + u32 unusable = CheckMoveLimitations(battler, 0, MOVE_LIMITATIONS_ALL); if (unusable == ALL_MOVES_MASK) // All moves are unusable. { @@ -1605,7 +1774,7 @@ u8 GetImprisonedMovesCount(u32 battler, u16 move) for (i = 0; i < gBattlersCount; i++) { - if (battlerSide != GetBattlerSide(i) && gStatuses3[i] & STATUS3_IMPRISONED_OTHERS) + if (battlerSide != GetBattlerSide(i) && gBattleMons[i].volatiles.imprison) { s32 j; for (j = 0; j < MAX_MON_MOVES; j++) @@ -1642,33 +1811,30 @@ u32 GetBattlerAffectionHearts(u32 battler) // gBattlerAttacker is the battler that's trying to raise their stats and due to limitations of RandomUniformExcept, cannot be an argument bool32 MoodyCantRaiseStat(u32 stat) { - return CompareStat(gBattlerAttacker, stat, MAX_STAT_STAGE, CMP_EQUAL); + return CompareStat(gBattlerAttacker, stat, MAX_STAT_STAGE, CMP_EQUAL, GetBattlerAbility(gBattlerAttacker)); } // gBattlerAttacker is the battler that's trying to lower their stats and due to limitations of RandomUniformExcept, cannot be an argument bool32 MoodyCantLowerStat(u32 stat) { - return stat == GET_STAT_BUFF_ID(gBattleScripting.statChanger) || CompareStat(gBattlerAttacker, stat, MIN_STAT_STAGE, CMP_EQUAL); + return stat == GET_STAT_BUFF_ID(gBattleScripting.statChanger) || CompareStat(gBattlerAttacker, stat, MIN_STAT_STAGE, CMP_EQUAL, GetBattlerAbility(gBattlerAttacker)); } void TryToRevertMimicryAndFlags(void) { - u32 i; - - for (i = 0; i < gBattlersCount; i++) + for (u32 battler = 0; battler < gBattlersCount; battler++) { - gDisableStructs[i].terrainAbilityDone = FALSE; - if (GetBattlerAbility(i) == ABILITY_MIMICRY) - RESTORE_BATTLER_TYPE(i); + gDisableStructs[battler].terrainAbilityDone = FALSE; + ResetParadoxTerrainStat(battler); + if (IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MIMICRY)) + RESTORE_BATTLER_TYPE(battler); } } bool32 BattleArenaTurnEnd(void) { - gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE); - if ((gBattleTypeFlags & BATTLE_TYPE_ARENA) - && gBattleStruct->arenaTurnCounter == 2 + && gBattleStruct->eventState.arenaTurn == 2 && IsBattlerAlive(B_POSITION_PLAYER_LEFT) && IsBattlerAlive(B_POSITION_OPPONENT_LEFT)) { for (u32 battler = 0; battler < 2; battler++) @@ -1678,34 +1844,30 @@ bool32 BattleArenaTurnEnd(void) BattleScriptExecute(BattleScript_ArenaDoJudgment); return TRUE; } - - gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE); - return FALSE; } // Ingrain, Leech Seed, Strength Sap and Aqua Ring s32 GetDrainedBigRootHp(u32 battler, s32 hp) { - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_BIG_ROOT) + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_BIG_ROOT) hp = (hp * 1300) / 1000; if (hp == 0) hp = 1; - return hp * -1; + return hp; } -// This should always be the last check. Otherwise the ability might be recorded when it is not supposed to be -bool32 IsMagicGuardProtected(u32 battler, u32 ability) +// Should always be the last check. Otherwise the ability might be wrongly recorded. +bool32 IsAbilityAndRecord(u32 battler, enum Ability battlerAbility, enum Ability abilityToCheck) { - if (ability != ABILITY_MAGIC_GUARD) + if (battlerAbility != abilityToCheck) return FALSE; - RecordAbilityBattle(battler, ability); + RecordAbilityBattle(battler, abilityToCheck); return TRUE; } -#define FAINTED_ACTIONS_MAX_CASE 7 bool32 HandleFaintedMonActions(void) { if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) @@ -1713,38 +1875,38 @@ bool32 HandleFaintedMonActions(void) do { s32 i; - switch (gBattleStruct->faintedActionsState) + switch (gBattleStruct->eventState.faintedAction) { - case 0: - gBattleStruct->faintedActionsBattlerId = 0; - gBattleStruct->faintedActionsState++; + case FAINTED_ACTIONS_NO_MONS_TO_SWITCH: + gBattleStruct->eventState.faintedActionBattler = 0; + gBattleStruct->eventState.faintedAction++; for (i = 0; i < gBattlersCount; i++) { if (gAbsentBattlerFlags & (1u << i) && !HasNoMonsToSwitch(i, PARTY_SIZE, PARTY_SIZE)) gAbsentBattlerFlags &= ~(1u << i); } // fall through - case 1: + case FAINTED_ACTIONS_GIVE_EXP: do { - gBattlerFainted = gBattlerTarget = gBattleStruct->faintedActionsBattlerId; - if (gBattleMons[gBattleStruct->faintedActionsBattlerId].hp == 0 - && !(gBattleStruct->givenExpMons & (1u << gBattlerPartyIndexes[gBattleStruct->faintedActionsBattlerId])) - && !(gAbsentBattlerFlags & (1u << gBattleStruct->faintedActionsBattlerId))) + gBattlerFainted = gBattlerTarget = gBattleStruct->eventState.faintedActionBattler; + if (gBattleMons[gBattleStruct->eventState.faintedActionBattler].hp == 0 + && !(gBattleStruct->givenExpMons & (1u << gBattlerPartyIndexes[gBattleStruct->eventState.faintedActionBattler])) + && !(gAbsentBattlerFlags & (1u << gBattleStruct->eventState.faintedActionBattler))) { BattleScriptExecute(BattleScript_GiveExp); - gBattleStruct->faintedActionsState = 2; + gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_SET_ABSENT_FLAGS; return TRUE; } - } while (++gBattleStruct->faintedActionsBattlerId != gBattlersCount); - gBattleStruct->faintedActionsState = 3; + } while (++gBattleStruct->eventState.faintedActionBattler != gBattlersCount); + gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_WAIT_STATE; break; - case 2: + case FAINTED_ACTIONS_SET_ABSENT_FLAGS: OpponentSwitchInResetSentPokesToOpponentValue(gBattlerFainted); - if (++gBattleStruct->faintedActionsBattlerId == gBattlersCount) - gBattleStruct->faintedActionsState = 3; + if (++gBattleStruct->eventState.faintedActionBattler == gBattlersCount) + gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_WAIT_STATE; else - gBattleStruct->faintedActionsState = 1; + gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_GIVE_EXP; // Don't switch mons until all pokemon performed their actions or the battle's over. if (B_FAINT_SWITCH_IN >= GEN_4 && gBattleOutcome == 0 @@ -1752,11 +1914,11 @@ bool32 HandleFaintedMonActions(void) && gCurrentTurnActionNumber != gBattlersCount) { gAbsentBattlerFlags |= 1u << gBattlerFainted; - if (gBattleStruct->faintedActionsState != 1) + if (gBattleStruct->eventState.faintedAction != FAINTED_ACTIONS_GIVE_EXP) return FALSE; } break; - case 3: + case FAINTED_ACTIONS_WAIT_STATE: // Don't switch mons until all pokemon performed their actions or the battle's over. if (B_FAINT_SWITCH_IN >= GEN_4 && gBattleOutcome == 0 @@ -1765,38 +1927,33 @@ bool32 HandleFaintedMonActions(void) { return FALSE; } - gBattleStruct->faintedActionsBattlerId = 0; - gBattleStruct->faintedActionsState++; + gBattleStruct->eventState.faintedActionBattler = 0; + gBattleStruct->eventState.faintedAction++; // fall through - case 4: + case FAINTED_ACTIONS_HANDLE_FAINTED_MON: do { - gBattlerFainted = gBattlerTarget = gBattleStruct->faintedActionsBattlerId; - if (gBattleMons[gBattleStruct->faintedActionsBattlerId].hp == 0 - && !(gAbsentBattlerFlags & (1u << gBattleStruct->faintedActionsBattlerId))) + gBattlerFainted = gBattlerTarget = gBattleStruct->eventState.faintedActionBattler; + if (gBattleMons[gBattleStruct->eventState.faintedActionBattler].hp == 0 + && !(gAbsentBattlerFlags & (1u << gBattleStruct->eventState.faintedActionBattler))) { BattleScriptExecute(BattleScript_HandleFaintedMon); - gBattleStruct->faintedActionsState = 5; + gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_HANDLE_NEXT_BATTLER; return TRUE; } - } while (++gBattleStruct->faintedActionsBattlerId != gBattlersCount); - gBattleStruct->faintedActionsState = 6; + } while (++gBattleStruct->eventState.faintedActionBattler != gBattlersCount); + gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_MAX_CASE; break; - case 5: - if (++gBattleStruct->faintedActionsBattlerId == gBattlersCount) - gBattleStruct->faintedActionsState = 6; + case FAINTED_ACTIONS_HANDLE_NEXT_BATTLER: + if (++gBattleStruct->eventState.faintedActionBattler == gBattlersCount) + gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_MAX_CASE; else - gBattleStruct->faintedActionsState = 4; - break; - case 6: - if (ItemBattleEffects(ITEMEFFECT_NORMAL, 0, TRUE)) - return TRUE; - gBattleStruct->faintedActionsState++; + gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_HANDLE_FAINTED_MON; break; case FAINTED_ACTIONS_MAX_CASE: break; } - } while (gBattleStruct->faintedActionsState != FAINTED_ACTIONS_MAX_CASE); + } while (gBattleStruct->eventState.faintedAction != FAINTED_ACTIONS_MAX_CASE); return FALSE; } @@ -1805,8 +1962,8 @@ void TryClearRageAndFuryCutter(void) s32 i; for (i = 0; i < gBattlersCount; i++) { - if ((gBattleMons[i].status2 & STATUS2_RAGE) && gChosenMoveByBattler[i] != MOVE_RAGE) - gBattleMons[i].status2 &= ~STATUS2_RAGE; + if (gBattleMons[i].volatiles.rage && gChosenMoveByBattler[i] != MOVE_RAGE) + gBattleMons[i].volatiles.rage = FALSE; if (gDisableStructs[i].furyCutterCounter != 0 && gChosenMoveByBattler[i] != MOVE_FURY_CUTTER) gDisableStructs[i].furyCutterCounter = 0; } @@ -1820,15 +1977,15 @@ static inline bool32 TryFormChangeBeforeMove(void) if (!result) return FALSE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AttackerFormChange; + gBattleScripting.battler = gBattlerAttacker; + BattleScriptCall(BattleScript_BattlerFormChange); return TRUE; } static inline bool32 TryActivatePowderStatus(u32 move) { - u32 partnerMove = gBattleMons[BATTLE_PARTNER(gBattlerAttacker)].moves[gBattleStruct->chosenMovePositions[BATTLE_PARTNER(gBattlerAttacker)]]; - if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_POWDER)) + u32 partnerMove = GetChosenMoveFromPosition(BATTLE_PARTNER(gBattlerAttacker)); + if (!gBattleMons[gBattlerAttacker].volatiles.powder) return FALSE; if (GetBattleMoveType(move) == TYPE_FIRE && !gBattleStruct->pledgeMove) return TRUE; @@ -1839,531 +1996,901 @@ static inline bool32 TryActivatePowderStatus(u32 move) return FALSE; } -void SetAtkCancellerForCalledMove(void) +static enum MoveCanceler CancelerClearFlags(struct BattleContext *ctx) { - gBattleStruct->atkCancellerTracker = CANCELLER_HEAL_BLOCKED; - gBattleStruct->isAtkCancelerForCalledMove = TRUE; + gBattleMons[ctx->battlerAtk].volatiles.grudge = FALSE; + gBattleMons[ctx->battlerAtk].volatiles.glaiveRush = FALSE; + return MOVE_STEP_SUCCESS; } -static void CancellerFlags(u32 *effect) +static enum MoveCanceler CancelerStanceChangeOne(struct BattleContext *ctx) { - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_DESTINY_BOND; - gStatuses3[gBattlerAttacker] &= ~STATUS3_GRUDGE; - gStatuses4[gBattlerAttacker] &= ~STATUS4_GLAIVE_RUSH; + if (B_STANCE_CHANGE_FAIL < GEN_7 && gChosenMove == ctx->currentMove && TryFormChangeBeforeMove()) + return MOVE_STEP_BREAK; + return MOVE_STEP_SUCCESS; } -static void CancellerStanceChangeOne(u32 *effect) -{ - if (B_STANCE_CHANGE_FAIL < GEN_7 && TryFormChangeBeforeMove()) - *effect = 1; -} - -static void CancellerSkyDrop(u32 *effect) +static enum MoveCanceler CancelerSkyDrop(struct BattleContext *ctx) { // If Pokemon is being held in Sky Drop - if (gStatuses3[gBattlerAttacker] & STATUS3_SKY_DROPPED) + if (gBattleMons[ctx->battlerAtk].volatiles.semiInvulnerable == STATE_SKY_DROP) { gBattlescriptCurrInstr = BattleScript_MoveEnd; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + return MOVE_STEP_FAILURE; } + return MOVE_STEP_SUCCESS; } -static void CancellerRecharge(u32 *effect) +static enum MoveCanceler CancelerRecharge(struct BattleContext *ctx) { - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE) + if (gDisableStructs[ctx->battlerAtk].rechargeTimer > 0) { - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_RECHARGE; - gDisableStructs[gBattlerAttacker].rechargeTimer = 0; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedMustRecharge; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + return MOVE_STEP_FAILURE; } + return MOVE_STEP_SUCCESS; } -static void CancellerAsleep(u32 *effect) +static enum MoveCanceler CancelerAsleepOrFrozen(struct BattleContext *ctx) { - if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) + if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_SLEEP) { - if (UproarWakeUpCheck(gBattlerAttacker)) + if (UproarWakeUpCheck(ctx->battlerAtk)) { - TryDeactivateSleepClause(GetBattlerSide(gBattlerAttacker), gBattlerPartyIndexes[gBattlerAttacker]); - gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP; - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; - BattleScriptPushCursor(); + TryDeactivateSleepClause(GetBattlerSide(ctx->battlerAtk), gBattlerPartyIndexes[ctx->battlerAtk]); + gBattleMons[ctx->battlerAtk].status1 &= ~STATUS1_SLEEP; + gBattleMons[ctx->battlerAtk].volatiles.nightmare = FALSE; + gEffectBattler = ctx->battlerAtk; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP_UPROAR; - gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; - *effect = 2; + BattleScriptCall(BattleScript_MoveUsedWokeUp); + return MOVE_STEP_REMOVES_STATUS; } else { u8 toSub; - if (GetBattlerAbility(gBattlerAttacker) == ABILITY_EARLY_BIRD) + if (IsAbilityAndRecord(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk], ABILITY_EARLY_BIRD)) toSub = 2; else toSub = 1; - if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) < toSub) - gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP; + if ((gBattleMons[ctx->battlerAtk].status1 & STATUS1_SLEEP) < toSub) + gBattleMons[ctx->battlerAtk].status1 &= ~STATUS1_SLEEP; else - gBattleMons[gBattlerAttacker].status1 -= toSub; - if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) + gBattleMons[ctx->battlerAtk].status1 -= toSub; + + enum BattleMoveEffects moveEffect = GetMoveEffect(ctx->currentMove); + if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_SLEEP) { - enum BattleMoveEffects moveEffect = GetMoveEffect(gChosenMove); if (moveEffect != EFFECT_SNORE && moveEffect != EFFECT_SLEEP_TALK) { - gProtectStructs[gBattlerAttacker].nonVolatileStatusImmobility = TRUE; + gProtectStructs[ctx->battlerAtk].nonVolatileStatusImmobility = TRUE; gBattlescriptCurrInstr = BattleScript_MoveUsedIsAsleep; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 2; + return MOVE_STEP_FAILURE; } } else { - TryDeactivateSleepClause(GetBattlerSide(gBattlerAttacker), gBattlerPartyIndexes[gBattlerAttacker]); - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; - BattleScriptPushCursor(); + TryDeactivateSleepClause(GetBattlerSide(ctx->battlerAtk), gBattlerPartyIndexes[ctx->battlerAtk]); + gBattleMons[ctx->battlerAtk].volatiles.nightmare = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP; - gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; - *effect = 2; + BattleScriptCall(BattleScript_MoveUsedWokeUp); + return MOVE_STEP_REMOVES_STATUS; } } } -} - -static void CancellerFrozen(u32 *effect) -{ - if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE && !MoveThawsUser(gCurrentMove)) + else if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_FREEZE && !MoveThawsUser(ctx->currentMove)) { if (!RandomPercentage(RNG_FROZEN, 20)) { - gProtectStructs[gBattlerAttacker].nonVolatileStatusImmobility = TRUE; + gProtectStructs[ctx->battlerAtk].nonVolatileStatusImmobility = TRUE; gBattlescriptCurrInstr = BattleScript_MoveUsedIsFrozen; - gHitMarker |= (HITMARKER_NO_ATTACKSTRING | HITMARKER_UNABLE_TO_USE_MOVE); + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; } else // unfreeze { - gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FREEZE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; + gBattleMons[ctx->battlerAtk].status1 &= ~STATUS1_FREEZE; + BattleScriptCall(BattleScript_MoveUsedUnfroze); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED; } - *effect = 2; + return MOVE_STEP_REMOVES_STATUS; // Move failure but also removes status } + return MOVE_STEP_SUCCESS; } -static void CancellerObedience(u32 *effect) +static enum MoveCanceler CancelerObedience(struct BattleContext *ctx) { - u32 obedienceResult = GetAttackerObedienceForAction(); - if (obedienceResult != OBEYS - && !(gHitMarker & HITMARKER_NO_PPDEDUCT) // Don't check obedience after first hit of multi target move or multi hit moves - && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) + if (!gBattleMons[ctx->battlerAtk].volatiles.multipleTurns) { + enum Obedience obedienceResult = GetAttackerObedienceForAction(); switch (obedienceResult) { + case OBEYS: + gHitMarker |= HITMARKER_OBEYS; + return MOVE_STEP_SUCCESS; case DISOBEYS_LOAFS: // Randomly select, then print a disobedient string // B_MSG_LOAFING, B_MSG_WONT_OBEY, B_MSG_TURNED_AWAY, or B_MSG_PRETEND_NOT_NOTICE gBattleCommunication[MULTISTRING_CHOOSER] = MOD(Random(), NUM_LOAF_STRINGS); gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - break; + gBattleStruct->moveResultFlags[ctx->battlerDef] |= MOVE_RESULT_MISSED; + return MOVE_STEP_FAILURE; case DISOBEYS_HITS_SELF: - gBattlerTarget = gBattlerAttacker; - struct DamageCalculationData damageCalcData; - damageCalcData.battlerAtk = damageCalcData.battlerDef = gBattlerAttacker; - damageCalcData.move = MOVE_NONE; - damageCalcData.moveType = TYPE_MYSTERY; - damageCalcData.isCrit = FALSE; - damageCalcData.randomFactor = FALSE; - damageCalcData.updateFlags = TRUE; - gBattleStruct->moveDamage[gBattlerAttacker] = CalculateMoveDamage(&damageCalcData, 40); + gBattlerTarget = ctx->battlerAtk; + struct DamageContext dmgCtx = {0}; + dmgCtx.battlerAtk = dmgCtx.battlerDef = ctx->battlerAtk; + dmgCtx.move = dmgCtx.chosenMove = MOVE_NONE; + dmgCtx.moveType = TYPE_MYSTERY; + dmgCtx.isCrit = FALSE; + dmgCtx.randomFactor = FALSE; + dmgCtx.updateFlags = TRUE; + dmgCtx.isSelfInflicted = TRUE; + dmgCtx.fixedBasePower = 40; + gBattleStruct->moveDamage[ctx->battlerAtk] = CalculateMoveDamage(&dmgCtx); gBattlescriptCurrInstr = BattleScript_IgnoresAndHitsItself; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gHitMarker |= HITMARKER_OBEYS; - break; + return MOVE_STEP_FAILURE; // Move doesn't fail but mon hits itself case DISOBEYS_FALL_ASLEEP: if (IsSleepClauseEnabled()) - gBattleStruct->battlerState[gBattlerAttacker].sleepClauseEffectExempt = TRUE; + gBattleStruct->battlerState[ctx->battlerAtk].sleepClauseEffectExempt = TRUE; gBattlescriptCurrInstr = BattleScript_IgnoresAndFallsAsleep; - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[ctx->battlerDef] |= MOVE_RESULT_MISSED; + return MOVE_STEP_FAILURE; break; case DISOBEYS_WHILE_ASLEEP: gBattlescriptCurrInstr = BattleScript_IgnoresWhileAsleep; - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - break; + gBattleStruct->moveResultFlags[ctx->battlerDef] |= MOVE_RESULT_MISSED; + return MOVE_STEP_FAILURE; case DISOBEYS_RANDOM_MOVE: - gCalledMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos]; - SetAtkCancellerForCalledMove(); - gBattlescriptCurrInstr = BattleScript_IgnoresAndUsesRandomMove; + gCurrentMove = gCalledMove = gBattleMons[ctx->battlerAtk].moves[gCurrMovePos]; + BattleScriptCall(BattleScript_IgnoresAndUsesRandomMove); gBattlerTarget = GetBattleMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); gHitMarker |= HITMARKER_OBEYS; - break; + return MOVE_STEP_BREAK; } - *effect = 1; } - else + gHitMarker |= HITMARKER_OBEYS; + return MOVE_STEP_SUCCESS; +} + +static enum MoveCanceler CancelerPowerPoints(struct BattleContext *ctx) +{ + if (gBattleMons[ctx->battlerAtk].pp[gCurrMovePos] == 0 + && ctx->currentMove != MOVE_STRUGGLE + && !gSpecialStatuses[ctx->battlerAtk].dancerUsedMove + && !gBattleMons[ctx->battlerAtk].volatiles.multipleTurns) { - gHitMarker |= HITMARKER_OBEYS; + gBattlescriptCurrInstr = BattleScript_NoPPForMove; + gBattleStruct->moveResultFlags[ctx->battlerDef] |= MOVE_RESULT_MISSED; + return MOVE_STEP_FAILURE; } + + return MOVE_STEP_SUCCESS; } -static void CancellerTruant(u32 *effect) +static enum MoveCanceler CancelerTruant(struct BattleContext *ctx) { - if (GetBattlerAbility(gBattlerAttacker) == ABILITY_TRUANT && gDisableStructs[gBattlerAttacker].truantCounter) + if (GetBattlerAbility(ctx->battlerAtk) == ABILITY_TRUANT && gDisableStructs[ctx->battlerAtk].truantCounter) { - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LOAFING; - gBattlerAbility = gBattlerAttacker; + gBattlerAbility = ctx->battlerAtk; gBattlescriptCurrInstr = BattleScript_TruantLoafingAround; - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - *effect = 1; + gBattleStruct->moveResultFlags[ctx->battlerDef] |= MOVE_RESULT_MISSED; + return MOVE_STEP_FAILURE; } + return MOVE_STEP_SUCCESS; } -static void CancellerFlinch(u32 *effect) +static enum MoveCanceler CancelerFlinch(struct BattleContext *ctx) { - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_FLINCHED) + if (gBattleMons[ctx->battlerAtk].volatiles.flinched) { - gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedFlinched; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; - } -} - -static void CancellerInLove(u32 *effect) -{ - if (!gBattleStruct->isAtkCancelerForCalledMove && gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) - { - gBattleScripting.battler = CountTrailingZeroBits((gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) >> 0x10); - if (!RandomPercentage(RNG_INFATUATION, 50)) - { - BattleScriptPushCursor(); - } - else - { - BattleScriptPush(BattleScript_MoveUsedIsInLoveCantAttack); - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); - } - gBattlescriptCurrInstr = BattleScript_MoveUsedIsInLove; - *effect = 1; + return MOVE_STEP_FAILURE; } + return MOVE_STEP_SUCCESS; } -static void CancellerDisabled(u32 *effect) +static enum MoveCanceler CancelerDisabled(struct BattleContext *ctx) { - if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].disabledMove == gCurrentMove && gDisableStructs[gBattlerAttacker].disabledMove != MOVE_NONE) + if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE + && gDisableStructs[ctx->battlerAtk].disabledMove == ctx->currentMove + && gDisableStructs[ctx->battlerAtk].disabledMove != MOVE_NONE) { - gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; - gBattleScripting.battler = gBattlerAttacker; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; + gBattleScripting.battler = ctx->battlerAtk; + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsDisabled; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + return MOVE_STEP_FAILURE; } + return MOVE_STEP_SUCCESS; } -static void CancellerHealBlocked(u32 *effect) +static enum MoveCanceler CancelerVolatileBlocked(struct BattleContext *ctx) { - if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK && IsHealBlockPreventingMove(gBattlerAttacker, gCurrentMove)) + if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE + && gBattleMons[ctx->battlerAtk].volatiles.healBlock + && IsHealBlockPreventingMove(ctx->battlerAtk, ctx->currentMove)) { - gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; - gBattleScripting.battler = gBattlerAttacker; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; + gBattleScripting.battler = ctx->battlerAtk; + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedHealBlockPrevents; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + return MOVE_STEP_FAILURE; } -} - -static void CancellerGravity(u32 *effect) -{ - if (gFieldStatuses & STATUS_FIELD_GRAVITY && IsGravityPreventingMove(gCurrentMove)) + else if (gFieldStatuses & STATUS_FIELD_GRAVITY && IsGravityPreventingMove(ctx->currentMove)) { - gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; - gBattleScripting.battler = gBattlerAttacker; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; + gBattleScripting.battler = ctx->battlerAtk; + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedGravityPrevents; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + return MOVE_STEP_FAILURE; } -} - -static void CancellerThroatChop(u32 *effect) -{ - if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].throatChopTimer > gBattleTurnCounter && IsSoundMove(gCurrentMove)) + else if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE && gDisableStructs[ctx->battlerAtk].throatChopTimer > 0 && IsSoundMove(ctx->currentMove)) { - gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsThroatChopPrevented; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + return MOVE_STEP_FAILURE; } + return MOVE_STEP_SUCCESS; } -static void CancellerTaunted(u32 *effect) +static enum MoveCanceler CancelerTaunted(struct BattleContext *ctx) { - if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].tauntTimer && IsBattleMoveStatus(gCurrentMove)) + if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE && gDisableStructs[ctx->battlerAtk].tauntTimer && IsBattleMoveStatus(ctx->currentMove)) { - gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsTaunted; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + return MOVE_STEP_BREAK; } + return MOVE_STEP_SUCCESS; } -static void CancellerImprisoned(u32 *effect) +static enum MoveCanceler CancelerImprisoned(struct BattleContext *ctx) { - if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && GetImprisonedMovesCount(gBattlerAttacker, gCurrentMove)) + if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE && GetImprisonedMovesCount(ctx->battlerAtk, ctx->currentMove)) { - gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsImprisoned; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + return MOVE_STEP_FAILURE; } + return MOVE_STEP_SUCCESS; } -static void CancellerConfused(u32 *effect) +static enum MoveCanceler CancelerConfused(struct BattleContext *ctx) { - if (gBattleStruct->isAtkCancelerForCalledMove) - return; - - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) + if (gBattleMons[ctx->battlerAtk].volatiles.confusionTurns) { - if (!(gStatuses4[gBattlerAttacker] & STATUS4_INFINITE_CONFUSION)) - gBattleMons[gBattlerAttacker].status2 -= STATUS2_CONFUSION_TURN(1); - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) + if (!gBattleMons[ctx->battlerAtk].volatiles.infiniteConfusion) + gBattleMons[ctx->battlerAtk].volatiles.confusionTurns--; + if (gBattleMons[ctx->battlerAtk].volatiles.confusionTurns) { // confusion dmg - if (RandomPercentage(RNG_CONFUSION, (GetGenConfig(GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE) >= GEN_7 ? 33 : 50))) + if (RandomPercentage(RNG_CONFUSION, (GetConfig(CONFIG_CONFUSION_SELF_DMG_CHANCE) >= GEN_7 ? 33 : 50))) { gBattleCommunication[MULTISTRING_CHOOSER] = TRUE; - gBattlerTarget = gBattlerAttacker; - struct DamageCalculationData damageCalcData; - damageCalcData.battlerAtk = damageCalcData.battlerDef = gBattlerAttacker; - damageCalcData.move = MOVE_NONE; - damageCalcData.moveType = TYPE_MYSTERY; - damageCalcData.isCrit = FALSE; - damageCalcData.randomFactor = FALSE; - damageCalcData.updateFlags = TRUE; - gBattleStruct->moveDamage[gBattlerAttacker] = CalculateMoveDamage(&damageCalcData, 40); - gProtectStructs[gBattlerAttacker].confusionSelfDmg = TRUE; + struct DamageContext dmgCtx = {0}; + dmgCtx.battlerAtk = dmgCtx.battlerDef = ctx->battlerAtk; + dmgCtx.move = dmgCtx.chosenMove = MOVE_NONE; + dmgCtx.moveType = TYPE_MYSTERY; + dmgCtx.isCrit = FALSE; + dmgCtx.randomFactor = FALSE; + dmgCtx.updateFlags = TRUE; + dmgCtx.isSelfInflicted = TRUE; + dmgCtx.fixedBasePower = 40; + gBattleStruct->passiveHpUpdate[ctx->battlerAtk] = CalculateMoveDamage(&dmgCtx); + gProtectStructs[ctx->battlerAtk].confusionSelfDmg = TRUE; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfused; + return MOVE_STEP_FAILURE; } else { gBattleCommunication[MULTISTRING_CHOOSER] = FALSE; - BattleScriptPushCursor(); + BattleScriptCall(BattleScript_MoveUsedIsConfused); + return MOVE_STEP_BREAK; } - gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfused; } else // snapped out of confusion { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfusedNoMore; + BattleScriptCall(BattleScript_MoveUsedIsConfusedNoMore); + return MOVE_STEP_BREAK; } - *effect = 1; } + return MOVE_STEP_SUCCESS; } -static void CancellerParalysed(u32 *effect) +static enum MoveCanceler CancelerParalyzed(struct BattleContext *ctx) { - if (!gBattleStruct->isAtkCancelerForCalledMove - && (gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) - && !(B_MAGIC_GUARD == GEN_4 && GetBattlerAbility(gBattlerAttacker) == ABILITY_MAGIC_GUARD) + if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_PARALYSIS + && !(B_MAGIC_GUARD == GEN_4 && IsAbilityAndRecord(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk], ABILITY_MAGIC_GUARD)) && !RandomPercentage(RNG_PARALYSIS, 75)) { - gProtectStructs[gBattlerAttacker].nonVolatileStatusImmobility = TRUE; + gProtectStructs[ctx->battlerAtk].nonVolatileStatusImmobility = TRUE; // This is removed in FRLG and Emerald for some reason - //CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + //CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsParalyzed; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + return MOVE_STEP_FAILURE; + } + return MOVE_STEP_SUCCESS; +} + +static enum MoveCanceler CancelerInfatuation(struct BattleContext *ctx) +{ + if (gBattleMons[ctx->battlerAtk].volatiles.infatuation) + { + gBattleScripting.battler = gBattleMons[ctx->battlerAtk].volatiles.infatuation - 1; + if (!RandomPercentage(RNG_INFATUATION, 50)) + { + BattleScriptCall(BattleScript_MoveUsedIsInLove); + return MOVE_STEP_BREAK; + } + else + { + BattleScriptPush(BattleScript_MoveUsedIsInLoveCantAttack); + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); + gBattlescriptCurrInstr = BattleScript_MoveUsedIsInLove; + return MOVE_STEP_FAILURE; + } } + return MOVE_STEP_SUCCESS; } -static void CancellerBide(u32 *effect) +static enum MoveCanceler CancelerBide(struct BattleContext *ctx) { - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE) + if (gBattleMons[ctx->battlerAtk].volatiles.bideTurns) { - gBattleMons[gBattlerAttacker].status2 -= STATUS2_BIDE_TURN(1); - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE) + if (--gBattleMons[ctx->battlerAtk].volatiles.bideTurns) { gBattlescriptCurrInstr = BattleScript_BideStoringEnergy; } else { // This is removed in FRLG and Emerald for some reason - //gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_MULTIPLETURNS; - if (gBideDmg[gBattlerAttacker]) + //gBattleMons[gBattlerAttacker].volatiles.multipleTurns = FALSE; + if (gBideDmg[ctx->battlerAtk]) { gCurrentMove = MOVE_BIDE; - gBattlerTarget = gBideTarget[gBattlerAttacker]; - if (gAbsentBattlerFlags & (1u << gBattlerTarget)) + gBattlerTarget = gBideTarget[ctx->battlerAtk]; + if (gAbsentBattlerFlags & (1u << ctx->battlerDef)) gBattlerTarget = GetBattleMoveTarget(MOVE_BIDE, MOVE_TARGET_SELECTED + 1); gBattlescriptCurrInstr = BattleScript_BideAttack; + return MOVE_STEP_BREAK; // Jumps to a different script but no failure } else { gBattlescriptCurrInstr = BattleScript_BideNoEnergyToAttack; + return MOVE_STEP_FAILURE; } } - *effect = 1; } + return MOVE_STEP_SUCCESS; } -static void CancellerThaw(u32 *effect) +static enum MoveCanceler CancelerZMoves(struct BattleContext *ctx) { - if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE) - { - if (!(IsMoveEffectRemoveSpeciesType(gCurrentMove, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_FIRE))) - { - gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FREEZE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED_BY_MOVE; - } - *effect = 2; - } - if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FROSTBITE && MoveThawsUser(gCurrentMove)) + if (GetActiveGimmick(ctx->battlerAtk) == GIMMICK_Z_MOVE) { - if (!(IsMoveEffectRemoveSpeciesType(gCurrentMove, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_FIRE))) - { - gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FROSTBITE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveUsedUnfrostbite; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FROSTBITE_HEALED_BY_MOVE; - } - *effect = 2; + // attacker has a queued z move + RecordItemEffectBattle(ctx->battlerAtk, HOLD_EFFECT_Z_CRYSTAL); + SetGimmickAsActivated(ctx->battlerAtk, GIMMICK_Z_MOVE); + + gBattleScripting.battler = ctx->battlerAtk; + if (GetMoveCategory(ctx->currentMove) == DAMAGE_CATEGORY_STATUS) + BattleScriptCall(BattleScript_ZMoveActivateStatus); + else + BattleScriptCall(BattleScript_ZMoveActivateDamaging); + + return MOVE_STEP_BREAK; } + return MOVE_STEP_SUCCESS; } -static void CancellerStanceChangeTwo(u32 *effect) +static enum MoveCanceler CancelerChoiceLock(struct BattleContext *ctx) { - if (B_STANCE_CHANGE_FAIL >= GEN_7 && !gBattleStruct->isAtkCancelerForCalledMove && TryFormChangeBeforeMove()) - *effect = 1; -} + u16 *choicedMoveAtk = &gBattleStruct->choicedMove[ctx->battlerAtk]; + enum HoldEffect holdEffect = GetBattlerHoldEffect(ctx->battlerAtk); -static void CancellerWeatherPrimal(u32 *effect) -{ - if (HasWeatherEffect() && GetMovePower(gCurrentMove) > 0) + if (gChosenMove != MOVE_STRUGGLE + && (*choicedMoveAtk == MOVE_NONE || *choicedMoveAtk == MOVE_UNAVAILABLE) + && (IsHoldEffectChoice(holdEffect) || ctx->abilities[ctx->battlerAtk] == ABILITY_GORILLA_TACTICS)) + *choicedMoveAtk = gChosenMove; + + u32 moveIndex; + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - u32 moveType = GetBattleMoveType(gCurrentMove); - if (moveType == TYPE_FIRE && (gBattleWeather & B_WEATHER_RAIN_PRIMAL) && (B_POWDER_RAIN >= GEN_7 || !TryActivatePowderStatus(gCurrentMove))) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PRIMAL_WEATHER_FIZZLED_BY_RAIN; - *effect = 1; - } - else if (moveType == TYPE_WATER && (gBattleWeather & B_WEATHER_SUN_PRIMAL)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PRIMAL_WEATHER_EVAPORATED_IN_SUN; - *effect = 1; - } - if (*effect == 1) - { - gBattleScripting.moveEffect = 0; - gProtectStructs[gBattlerAttacker].chargingTurn = FALSE; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_PrimalWeatherBlocksMove; - } + if (gBattleMons[ctx->battlerAtk].moves[moveIndex] == *choicedMoveAtk) + break; } + + if (moveIndex == MAX_MON_MOVES) + *choicedMoveAtk = MOVE_NONE; + + return MOVE_STEP_SUCCESS; } -static void CancellerDynamaxBlocked(u32 *effect) +static enum MoveCanceler CancelerCallSubmove(struct BattleContext *ctx) { - if ((GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) && IsMoveBlockedByDynamax(gCurrentMove)) + bool32 noEffect = FALSE; + u32 calledMove = MOVE_NONE; + const u8 *battleScript = NULL; + battleScript = BattleScript_SubmoveAttackstring; + + switch(GetMoveEffect(ctx->currentMove)) { - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveBlockedByDynamax; - *effect = 1; + case EFFECT_MIRROR_MOVE: + calledMove = GetMirrorMoveMove(); + break; + case EFFECT_METRONOME: + calledMove = GetMetronomeMove(); + battleScript = BattleScript_MetronomeAttackstring; + break; + case EFFECT_ASSIST: + calledMove = GetAssistMove(); + break; + case EFFECT_NATURE_POWER: + calledMove = GetNaturePowerMove(ctx->battlerAtk); + battleScript = BattleScript_NaturePowerAttackstring; + break; + case EFFECT_SLEEP_TALK: + calledMove = GetSleepTalkMove(); + battleScript = BattleScript_SleepTalkAttackstring; + break; + case EFFECT_COPYCAT: + calledMove = GetCopyCatMove(); + break; + case EFFECT_ME_FIRST: + calledMove = GetMeFirstMove(); + break; + default: + noEffect = TRUE; + break; } -} -static void CancellerPowderStatus(u32 *effect) -{ - if (TryActivatePowderStatus(gCurrentMove)) + if (noEffect) { - gProtectStructs[gBattlerAttacker].powderSelfDmg = TRUE; - if (GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; + gBattleStruct->submoveAnnouncement = SUBMOVE_NO_EFFECT; + return MOVE_STEP_SUCCESS; + } - if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE - || HasTrainerUsedGimmick(gBattlerAttacker, GIMMICK_Z_MOVE)) - gBattlescriptCurrInstr = BattleScript_MoveUsedPowder; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + if (calledMove != MOVE_NONE) + { + if (GetActiveGimmick(ctx->battlerAtk) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(calledMove)) + calledMove = GetTypeBasedZMove(calledMove); + if (GetMoveEffect(ctx->currentMove) == EFFECT_COPYCAT && IsMaxMove(calledMove)) + calledMove = gBattleStruct->dynamax.lastUsedBaseMove; + + gBattleStruct->submoveAnnouncement = SUBMOVE_SUCCESS; + gCalledMove = calledMove; + BattleScriptCall(battleScript); + return MOVE_STEP_BREAK; } + + gBattleStruct->submoveAnnouncement = SUBMOVE_FAILURE; + return MOVE_STEP_SUCCESS; } -static void CancellerProtean(u32 *effect) +static enum MoveCanceler CancelerThaw(struct BattleContext *ctx) { - u32 moveType = GetBattleMoveType(gCurrentMove); - if (ProteanTryChangeType(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), gCurrentMove, moveType)) + if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_FREEZE) { - if (B_PROTEAN_LIBERO == GEN_9) - gDisableStructs[gBattlerAttacker].usedProteanLibero = TRUE; - PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); - gBattlerAbility = gBattlerAttacker; - BattleScriptPushCursor(); - PrepareStringBattle(STRINGID_EMPTYSTRING3, gBattlerAttacker); - gBattleCommunication[MSG_DISPLAY] = 1; - gBattlescriptCurrInstr = BattleScript_ProteanActivates; - *effect = 1; + if (!(IsMoveEffectRemoveSpeciesType(ctx->currentMove, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) && !IS_BATTLER_OF_TYPE(ctx->battlerAtk, TYPE_FIRE))) + { + gBattleMons[ctx->battlerAtk].status1 &= ~STATUS1_FREEZE; + BattleScriptCall(BattleScript_MoveUsedUnfroze); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED_BY_MOVE; + } + return MOVE_STEP_REMOVES_STATUS; } + if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_FROSTBITE && MoveThawsUser(ctx->currentMove)) + { + if (!(IsMoveEffectRemoveSpeciesType(ctx->currentMove, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) && !IS_BATTLER_OF_TYPE(ctx->battlerAtk, TYPE_FIRE))) + { + gBattleMons[ctx->battlerAtk].status1 &= ~STATUS1_FROSTBITE; + BattleScriptCall(BattleScript_MoveUsedUnfrostbite); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FROSTBITE_HEALED_BY_MOVE; + } + return MOVE_STEP_REMOVES_STATUS; + } + return MOVE_STEP_SUCCESS; } -static void CancellerPsychicTerrain(u32 *effect) +static enum MoveCanceler CancelerStanceChangeTwo(struct BattleContext *ctx) { - if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN - && IsBattlerGrounded(gBattlerTarget) - && GetChosenMovePriority(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker)) > 0 - && GetMoveTarget(gCurrentMove) != MOVE_TARGET_ALL_BATTLERS - && GetMoveTarget(gCurrentMove) != MOVE_TARGET_OPPONENTS_FIELD - && !IsBattlerAlly(gBattlerAttacker, gBattlerTarget)) - { - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); - gBattlescriptCurrInstr = BattleScript_MoveUsedPsychicTerrainPrevents; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; - } + if (B_STANCE_CHANGE_FAIL >= GEN_7 && gChosenMove == ctx->currentMove && TryFormChangeBeforeMove()) + return MOVE_STEP_BREAK; + return MOVE_STEP_SUCCESS; } -static void CancellerExplodingDamp(u32 *effect) +static enum MoveCanceler CancelerAttackstring(struct BattleContext *ctx) { - u32 dampBattler = IsAbilityOnField(ABILITY_DAMP); - if (dampBattler && (GetMoveEffect(gCurrentMove) == EFFECT_EXPLOSION - || GetMoveEffect(gCurrentMove) == EFFECT_MIND_BLOWN)) - { - gBattleScripting.battler = dampBattler - 1; - gBattlescriptCurrInstr = BattleScript_DampStopsExplosion; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; - } + BattleScriptCall(BattleScript_Attackstring); + if (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove) + gLastPrintedMoves[gBattlerAttacker] = gChosenMove; + return MOVE_STEP_BREAK; } -static void CancellerMultihitMoves(u32 *effect) +static enum MoveCanceler CancelerPPDeduction(struct BattleContext *ctx) { - if (GetMoveEffect(gCurrentMove) == EFFECT_MULTI_HIT) - { - u32 ability = GetBattlerAbility(gBattlerAttacker); + if (gBattleMons[ctx->battlerAtk].volatiles.multipleTurns + || gSpecialStatuses[ctx->battlerAtk].dancerUsedMove + || ctx->currentMove == MOVE_STRUGGLE) + return MOVE_STEP_SUCCESS; - if (ability == ABILITY_SKILL_LINK) + s32 ppToDeduct = 1; + u32 moveTarget = GetBattlerMoveTargetType(ctx->battlerAtk, ctx->currentMove); + u32 movePosition = gCurrMovePos; + + if (gBattleStruct->submoveAnnouncement == SUBMOVE_SUCCESS) + movePosition = gChosenMovePos; + + if (moveTarget == MOVE_TARGET_BOTH + || moveTarget == MOVE_TARGET_FOES_AND_ALLY + || moveTarget == MOVE_TARGET_ALL_BATTLERS + || MoveForcesPressure(ctx->currentMove)) + { + for (u32 i = 0; i < gBattlersCount; i++) + { + if (!IsBattlerAlly(i, ctx->battlerAtk) && IsBattlerAlive(i)) + ppToDeduct += (GetBattlerAbility(i) == ABILITY_PRESSURE); + } + } + else if (moveTarget != MOVE_TARGET_OPPONENTS_FIELD) + { + if (ctx->battlerAtk != ctx->battlerDef && ctx->abilities[ctx->battlerDef] == ABILITY_PRESSURE) + ppToDeduct++; + } + + // For item Metronome, echoed voice + if (ctx->currentMove != gLastResultingMoves[ctx->battlerAtk] || WasUnableToUseMove(ctx->battlerAtk)) + gBattleStruct->metronomeItemCounter[ctx->battlerAtk] = 0; + + if (gBattleMons[ctx->battlerAtk].pp[movePosition] > ppToDeduct) + gBattleMons[ctx->battlerAtk].pp[movePosition] -= ppToDeduct; + else + gBattleMons[ctx->battlerAtk].pp[movePosition] = 0; + + if (MOVE_IS_PERMANENT(ctx->battlerAtk, movePosition)) + { + BtlController_EmitSetMonData( + ctx->battlerAtk, + B_COMM_TO_CONTROLLER, + REQUEST_PPMOVE1_BATTLE + movePosition, + 0, + sizeof(gBattleMons[ctx->battlerAtk].pp[movePosition]), + &gBattleMons[ctx->battlerAtk].pp[movePosition]); + MarkBattlerForControllerExec(ctx->battlerAtk); + } + + if (gBattleStruct->submoveAnnouncement != SUBMOVE_NO_EFFECT) + { + if (gBattleStruct->submoveAnnouncement == SUBMOVE_FAILURE) + { + gBattleStruct->submoveAnnouncement = SUBMOVE_NO_EFFECT; + gBattlescriptCurrInstr = BattleScript_ButItFailed; + return MOVE_STEP_FAILURE; + } + else if (CancelerVolatileBlocked(ctx) == MOVE_STEP_FAILURE) // Check Gravity/Heal Block/Throat Chop for Submove + { + gBattleStruct->submoveAnnouncement = SUBMOVE_NO_EFFECT; + return MOVE_STEP_FAILURE; + } + else + { + gBattleStruct->submoveAnnouncement = SUBMOVE_NO_EFFECT; + gBattlerTarget = GetBattleMoveTarget(ctx->currentMove, NO_TARGET_OVERRIDE); + gBattleScripting.animTurn = 0; + gBattleScripting.animTargetsHit = 0; + + // Possibly better to just move type setting and redirection to attackcanceler as a new case at this point + SetTypeBeforeUsingMove(ctx->currentMove, ctx->battlerAtk); + HandleMoveTargetRedirection(); + ClearDamageCalcResults(); + gBattlescriptCurrInstr = GetMoveBattleScript(ctx->currentMove); + return MOVE_STEP_BREAK; + } + } + + return MOVE_STEP_SUCCESS; +} + +static enum MoveCanceler CancelerWeatherPrimal(struct BattleContext *ctx) +{ + enum MoveCanceler effect = MOVE_STEP_SUCCESS; + if (HasWeatherEffect() && GetMovePower(ctx->currentMove) > 0) + { + enum Type moveType = GetBattleMoveType(ctx->currentMove); + if (moveType == TYPE_FIRE && (gBattleWeather & B_WEATHER_RAIN_PRIMAL) && (GetConfig(CONFIG_POWDER_RAIN) >= GEN_7 || !TryActivatePowderStatus(ctx->currentMove))) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PRIMAL_WEATHER_FIZZLED_BY_RAIN; + effect = MOVE_STEP_FAILURE; + } + else if (moveType == TYPE_WATER && (gBattleWeather & B_WEATHER_SUN_PRIMAL)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PRIMAL_WEATHER_EVAPORATED_IN_SUN; + effect = MOVE_STEP_FAILURE; + } + if (effect == MOVE_STEP_FAILURE) + { + gProtectStructs[ctx->battlerAtk].chargingTurn = FALSE; + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + gBattlescriptCurrInstr = BattleScript_PrimalWeatherBlocksMove; + } + } + return effect; +} + +static enum MoveCanceler CancelerMoveFailure(struct BattleContext *ctx) +{ + const u8 *battleScript = NULL; + + switch (GetMoveEffect(ctx->currentMove)) + { + case EFFECT_FAIL_IF_NOT_ARG_TYPE: + if (!IS_BATTLER_OF_TYPE(ctx->battlerAtk, GetMoveArgType(ctx->currentMove))) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_AURA_WHEEL: + if (gBattleMons[ctx->battlerAtk].species != SPECIES_MORPEKO_FULL_BELLY + && gBattleMons[ctx->battlerAtk].species != SPECIES_MORPEKO_HANGRY) + battleScript = BattleScript_PokemonCantUseTheMove; + break; + case EFFECT_AURORA_VEIL: + if (!(gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW) && HasWeatherEffect())) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_CLANGOROUS_SOUL: + if (gBattleMons[ctx->battlerAtk].hp <= max(1, GetNonDynamaxMaxHP(ctx->battlerAtk) / 3)) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_COUNTER: + case EFFECT_MIRROR_COAT: + case EFFECT_METAL_BURST: + // TODO: Needs a refactor because the moves currently don't work according to new gens + break; + case EFFECT_DESTINY_BOND: + if (DoesDestinyBondFail(ctx->battlerAtk)) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_FIRST_TURN_ONLY: + if (!gDisableStructs[ctx->battlerAtk].isFirstTurn || gSpecialStatuses[ctx->battlerAtk].instructedChosenTarget) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_MAT_BLOCK: + if (!gDisableStructs[ctx->battlerAtk].isFirstTurn || gSpecialStatuses[ctx->battlerAtk].instructedChosenTarget) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_FLING: + if (!CanFling(ctx->battlerAtk)) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_FOLLOW_ME: + if (B_UPDATED_MOVE_DATA >= GEN_8 && !(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_FUTURE_SIGHT: + if (gWishFutureKnock.futureSightCounter[ctx->battlerDef] > 0) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_LAST_RESORT: + if (!CanUseLastResort(ctx->battlerAtk)) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_NO_RETREAT: + if (gBattleMons[ctx->battlerDef].volatiles.noRetreat) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_POLTERGEIST: + if (gBattleMons[ctx->battlerDef].item == ITEM_NONE + || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM + || ctx->abilities[ctx->battlerDef] == ABILITY_KLUTZ) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_PROTECT: + // TODO + break; + case EFFECT_REST: + if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_SLEEP + || ctx->abilities[ctx->battlerAtk] == ABILITY_COMATOSE) + battleScript = BattleScript_RestIsAlreadyAsleep; + else if (gBattleMons[ctx->battlerAtk].hp == gBattleMons[ctx->battlerAtk].maxHP) + battleScript = BattleScript_AlreadyAtFullHp; + else if (ctx->abilities[ctx->battlerAtk] == ABILITY_INSOMNIA + || ctx->abilities[ctx->battlerAtk] == ABILITY_VITAL_SPIRIT + || ctx->abilities[ctx->battlerAtk] == ABILITY_PURIFYING_SALT) + battleScript = BattleScript_InsomniaProtects; + break; + case EFFECT_SUCKER_PUNCH: + if (HasBattlerActedThisTurn(ctx->battlerDef) + || (IsBattleMoveStatus(GetChosenMoveFromPosition(ctx->battlerDef)) && !gProtectStructs[ctx->battlerDef].noValidMoves)) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_UPPER_HAND: + { + u32 prio = GetChosenMovePriority(ctx->battlerDef, ctx->abilities[ctx->battlerDef]); + if (prio < 1 || prio > 3 // Fails if priority is less than 1 or greater than 3, if target already moved, or if using a status + || HasBattlerActedThisTurn(ctx->battlerDef) + || gChosenMoveByBattler[ctx->battlerDef] == MOVE_NONE + || IsBattleMoveStatus(gChosenMoveByBattler[ctx->battlerDef])) + battleScript = BattleScript_ButItFailed; + break; + } + case EFFECT_SNORE: + if (!(gBattleMons[ctx->battlerAtk].status1 & STATUS1_SLEEP) + && ctx->abilities[ctx->battlerAtk] != ABILITY_COMATOSE) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_STEEL_ROLLER: + if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_STOCKPILE: + if (gDisableStructs[ctx->battlerAtk].stockpileCounter >= 3) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_STUFF_CHEEKS: + if (GetItemPocket(gBattleMons[ctx->battlerAtk].item) != POCKET_BERRIES) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_SWALLOW: + case EFFECT_SPIT_UP: + if (gDisableStructs[ctx->battlerAtk].stockpileCounter == 0 && !gBattleStruct->snatchedMoveIsUsed) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_TELEPORT: + // TODO: follow up: Can't make sense of teleport logic + break; + case EFFECT_LOW_KICK: + case EFFECT_HEAT_CRASH: + if (GetActiveGimmick(ctx->battlerDef) == GIMMICK_DYNAMAX) + battleScript = BattleScript_MoveBlockedByDynamax; + break; + default: + break; + } + + if (battleScript != NULL) + { + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + gBattlescriptCurrInstr = battleScript; + return MOVE_STEP_FAILURE; + } + + return MOVE_STEP_SUCCESS; +} + +static enum MoveCanceler CancelerPowderStatus(struct BattleContext *ctx) +{ + if (TryActivatePowderStatus(ctx->currentMove)) + { + if (!IsAbilityAndRecord(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk], ABILITY_MAGIC_GUARD)) + SetPassiveDamageAmount(ctx->battlerAtk, GetNonDynamaxMaxHP(ctx->battlerAtk) / 4); + + // This might be incorrect + if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE + || HasTrainerUsedGimmick(ctx->battlerAtk, GIMMICK_Z_MOVE)) + gBattlescriptCurrInstr = BattleScript_MoveUsedPowder; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + return MOVE_STEP_FAILURE; + } + return MOVE_STEP_SUCCESS; +} + +bool32 IsDazzlingAbility(enum Ability ability) +{ + switch (ability) + { + case ABILITY_DAZZLING: return TRUE; + case ABILITY_QUEENLY_MAJESTY: return TRUE; + case ABILITY_ARMOR_TAIL: return TRUE; + default: break; + } + return FALSE; +} + +static enum MoveCanceler CancelerPriorityBlock(struct BattleContext *ctx) +{ + bool32 effect = FALSE; + s32 priority = GetChosenMovePriority(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk]); + u32 blockAbility = ABILITY_NONE; // ability of battler who is blocking + u32 blockedByBattler = ctx->battlerDef; + + if (priority <= 0 || IsBattlerAlly(ctx->battlerAtk, ctx->battlerDef)) + return MOVE_STEP_SUCCESS; + + if (IsDazzlingAbility(ctx->abilities[ctx->battlerDef])) + { + blockAbility = ctx->abilities[ctx->battlerDef]; + effect = TRUE; + } + else if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(ctx->battlerDef))) + { + blockAbility = GetBattlerAbility(BATTLE_PARTNER(ctx->battlerDef)); + if (IsDazzlingAbility(blockAbility)) + { + blockedByBattler = BATTLE_PARTNER(ctx->battlerDef); + effect = TRUE; + } + } + + if (effect) + { + gMultiHitCounter = 0; // Prevent multi-hit moves from hitting more than once after move has been absorbed. + gLastUsedAbility = blockAbility; + RecordAbilityBattle(blockedByBattler, blockAbility); + gBattleScripting.battler = gBattlerAbility = blockedByBattler; + gBattlescriptCurrInstr = BattleScript_DazzlingProtected; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + return MOVE_STEP_FAILURE; + } + + return MOVE_STEP_SUCCESS; +} + +static enum MoveCanceler CancelerProtean(struct BattleContext *ctx) +{ + enum Type moveType = GetBattleMoveType(ctx->currentMove); + if (ProteanTryChangeType(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk], ctx->currentMove, moveType)) + { + if (GetConfig(CONFIG_PROTEAN_LIBERO) >= GEN_9) + gDisableStructs[ctx->battlerAtk].usedProteanLibero = TRUE; + PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); + gBattlerAbility = ctx->battlerAtk; + PrepareStringBattle(STRINGID_EMPTYSTRING3, ctx->battlerAtk); + gBattleCommunication[MSG_DISPLAY] = 1; + BattleScriptCall(BattleScript_ProteanActivates); + return MOVE_STEP_BREAK; + } + return MOVE_STEP_SUCCESS; +} + +static enum MoveCanceler CancelerExplodingDamp(struct BattleContext *ctx) +{ + u32 dampBattler = IsAbilityOnField(ABILITY_DAMP); + if (dampBattler && IsMoveDampBanned(ctx->currentMove)) + { + gBattleScripting.battler = dampBattler - 1; + gBattlescriptCurrInstr = BattleScript_DampStopsExplosion; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + return MOVE_STEP_FAILURE; + } + return MOVE_STEP_SUCCESS; +} + +static enum MoveCanceler CancelerMultihitMoves(struct BattleContext *ctx) +{ + if (GetMoveEffect(ctx->currentMove) == EFFECT_MULTI_HIT) + { + enum Ability ability = ctx->abilities[ctx->battlerAtk]; + + if (ability == ABILITY_SKILL_LINK) { gMultiHitCounter = 5; } else if (ability == ABILITY_BATTLE_BOND - && gCurrentMove == MOVE_WATER_SHURIKEN - && gBattleMons[gBattlerAttacker].species == SPECIES_GRENINJA_ASH) + && ctx->currentMove == MOVE_WATER_SHURIKEN + && gBattleMons[ctx->battlerAtk].species == SPECIES_GRENINJA_ASH) { gMultiHitCounter = 3; } @@ -2374,92 +2901,63 @@ static void CancellerMultihitMoves(u32 *effect) PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) } - else if (GetMoveStrikeCount(gCurrentMove) > 1) + else if (GetMoveStrikeCount(ctx->currentMove) > 1) { - if (GetMoveEffect(gCurrentMove) == EFFECT_POPULATION_BOMB && GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LOADED_DICE) + if (GetMoveEffect(ctx->currentMove) == EFFECT_POPULATION_BOMB && GetBattlerHoldEffect(ctx->battlerAtk) == HOLD_EFFECT_LOADED_DICE) { gMultiHitCounter = RandomUniform(RNG_LOADED_DICE, 4, 10); } else { - gMultiHitCounter = GetMoveStrikeCount(gCurrentMove); + gMultiHitCounter = GetMoveStrikeCount(ctx->currentMove); - if (GetMoveEffect(gCurrentMove) == EFFECT_DRAGON_DARTS - && !IsAffectedByFollowMe(gBattlerAttacker, GetBattlerSide(gBattlerTarget), gCurrentMove) - && CanTargetPartner(gBattlerAttacker, gBattlerTarget) - && TargetFullyImmuneToCurrMove(gBattlerAttacker, gBattlerTarget)) - gBattlerTarget = BATTLE_PARTNER(gBattlerTarget); + if (GetMoveEffect(ctx->currentMove) == EFFECT_DRAGON_DARTS + && !IsAffectedByFollowMe(ctx->battlerAtk, GetBattlerSide(ctx->battlerDef), ctx->currentMove) + && CanTargetPartner(ctx->battlerAtk, ctx->battlerDef) + && TargetFullyImmuneToCurrMove(ctx->battlerAtk, ctx->battlerDef)) + gBattlerTarget = BATTLE_PARTNER(ctx->battlerDef); } PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 3, 0) } - else if (B_BEAT_UP >= GEN_5 && GetMoveEffect(gCurrentMove) == EFFECT_BEAT_UP) + else if (GetMoveEffect(ctx->currentMove) == EFFECT_BEAT_UP) { - struct Pokemon* party = GetBattlerParty(gBattlerAttacker); + struct Pokemon* party = GetBattlerParty(ctx->battlerAtk); int i; + gBattleStruct->beatUpSlot = 0; + gMultiHitCounter = 0; + memset(gBattleStruct->beatUpSpecies, 0xFF, sizeof(gBattleStruct->beatUpSpecies)); for (i = 0; i < PARTY_SIZE; i++) { - if (GetMonData(&party[i], MON_DATA_HP) - && GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE + u32 species = GetMonData(&party[i], MON_DATA_SPECIES); + if (species != SPECIES_NONE + && GetMonData(&party[i], MON_DATA_HP) && !GetMonData(&party[i], MON_DATA_IS_EGG) && !GetMonData(&party[i], MON_DATA_STATUS)) + { + if (GetConfig(CONFIG_BEAT_UP) >= GEN_5) + gBattleStruct->beatUpSpecies[gMultiHitCounter] = species; + else + gBattleStruct->beatUpSpecies[gMultiHitCounter] = i; gMultiHitCounter++; + } } - gBattleStruct->beatUpSlot = 0; PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) } else { gMultiHitCounter = 0; } -} - -static void CancellerZMoves(u32 *effect) -{ - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE) - { - // For Z-Mirror Move, so it doesn't play the animation twice. - bool32 alreadyUsed = HasTrainerUsedGimmick(gBattlerAttacker, GIMMICK_Z_MOVE); - - // attacker has a queued z move - RecordItemEffectBattle(gBattlerAttacker, HOLD_EFFECT_Z_CRYSTAL); - SetGimmickAsActivated(gBattlerAttacker, GIMMICK_Z_MOVE); - gBattleScripting.battler = gBattlerAttacker; - if (gProtectStructs[gBattlerAttacker].powderSelfDmg) - { - if (!alreadyUsed) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ZMoveActivatePowder; - } - } - else if (GetMoveCategory(gCurrentMove) == DAMAGE_CATEGORY_STATUS) - { - if (!alreadyUsed) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ZMoveActivateStatus; - } - } - else - { - if (!alreadyUsed) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ZMoveActivateDamaging; - } - } - *effect = 1; - } + return MOVE_STEP_SUCCESS; } -static void CancellerMultiTargetMoves(u32 *effect) +static enum MoveCanceler CancelerMultiTargetMoves(struct BattleContext *ctx) { - u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); - u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); + u32 moveTarget = GetBattlerMoveTargetType(ctx->battlerAtk, ctx->currentMove); + enum Ability abilityAtk = ctx->abilities[ctx->battlerAtk]; if (IsSpreadMove(moveTarget)) { @@ -2468,87 +2966,97 @@ static void CancellerMultiTargetMoves(u32 *effect) if (gBattleStruct->bouncedMoveIsUsed && !IsOnPlayerSide(battlerDef)) continue; - u32 abilityDef = GetBattlerAbility(battlerDef); + enum Ability abilityDef = GetBattlerAbility(battlerDef); - if (gBattlerAttacker == battlerDef + if (ctx->battlerAtk == battlerDef || !IsBattlerAlive(battlerDef) - || (moveTarget == MOVE_TARGET_BOTH && gBattlerAttacker == BATTLE_PARTNER(battlerDef)) - || IsBattlerProtected(gBattlerAttacker, battlerDef, gCurrentMove)) // Missing Invulnerable check + || (GetMoveEffect(ctx->currentMove) == EFFECT_SYNCHRONOISE && !DoBattlersShareType(ctx->battlerAtk, battlerDef)) + || (moveTarget == MOVE_TARGET_BOTH && ctx->battlerAtk == BATTLE_PARTNER(battlerDef)) + || IsBattlerProtected(ctx->battlerAtk, battlerDef, ctx->currentMove)) // Missing Invulnerable check { gBattleStruct->moveResultFlags[battlerDef] = MOVE_RESULT_NO_EFFECT; - gBattleStruct->noResultString[battlerDef] = TRUE; + gBattleStruct->noResultString[battlerDef] = WILL_FAIL; } - else if (CanAbilityBlockMove(gBattlerAttacker, battlerDef, abilityAtk, abilityDef, gCurrentMove, ABILITY_CHECK_TRIGGER) - || (IsBattlerTerrainAffected(gBattlerAttacker, STATUS_FIELD_PSYCHIC_TERRAIN) && GetBattleMovePriority(gBattlerAttacker, abilityAtk, gCurrentMove) > 0)) + else if (CanAbilityBlockMove(ctx->battlerAtk, battlerDef, abilityAtk, abilityDef, ctx->currentMove, CHECK_TRIGGER)) { gBattleStruct->moveResultFlags[battlerDef] = 0; - gBattleStruct->noResultString[battlerDef] = TRUE; + gBattleStruct->noResultString[battlerDef] = WILL_FAIL; } - else if (CanAbilityAbsorbMove(gBattlerAttacker, battlerDef, abilityDef, gCurrentMove, GetBattleMoveType(gCurrentMove), ABILITY_CHECK_TRIGGER)) + else if (CanAbilityAbsorbMove(ctx->battlerAtk, battlerDef, abilityDef, ctx->currentMove, GetBattleMoveType(gCurrentMove), CHECK_TRIGGER)) { gBattleStruct->moveResultFlags[battlerDef] = 0; - gBattleStruct->noResultString[battlerDef] = DO_ACCURACY_CHECK; + gBattleStruct->noResultString[battlerDef] = CHECK_ACCURACY; } else { - CalcTypeEffectivenessMultiplier(gCurrentMove, GetBattleMoveType(gCurrentMove), gBattlerAttacker, battlerDef, GetBattlerAbility(battlerDef), TRUE); + CalcTypeEffectivenessMultiplierHelper(ctx->currentMove, GetBattleMoveType(ctx->currentMove), ctx->battlerAtk, battlerDef, abilityAtk, abilityDef, TRUE); // Sets moveResultFlags + gBattleStruct->noResultString[battlerDef] = CAN_DAMAGE; } } if (moveTarget == MOVE_TARGET_BOTH) - gBattleStruct->numSpreadTargets = CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER_SIDE, gBattlerAttacker); + gBattleStruct->numSpreadTargets = CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER_SIDE, ctx->battlerAtk); else - gBattleStruct->numSpreadTargets = CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER, gBattlerAttacker); - } -} - -static const MoveSuccessOrderCancellers sMoveSuccessOrderCancellers[] = -{ - [CANCELLER_FLAGS] = CancellerFlags, - [CANCELLER_STANCE_CHANGE_1] = CancellerStanceChangeOne, - [CANCELLER_SKY_DROP] = CancellerSkyDrop, - [CANCELLER_RECHARGE] = CancellerRecharge, - [CANCELLER_ASLEEP] = CancellerAsleep, - [CANCELLER_FROZEN] = CancellerFrozen, - [CANCELLER_OBEDIENCE] = CancellerObedience, - [CANCELLER_TRUANT] = CancellerTruant, - [CANCELLER_FLINCH] = CancellerFlinch, - [CANCELLER_IN_LOVE] = CancellerInLove, - [CANCELLER_DISABLED] = CancellerDisabled, - [CANCELLER_HEAL_BLOCKED] = CancellerHealBlocked, - [CANCELLER_GRAVITY] = CancellerGravity, - [CANCELLER_THROAT_CHOP] = CancellerThroatChop, - [CANCELLER_TAUNTED] = CancellerTaunted, - [CANCELLER_IMPRISONED] = CancellerImprisoned, - [CANCELLER_CONFUSED] = CancellerConfused, - [CANCELLER_PARALYSED] = CancellerParalysed, - [CANCELLER_BIDE] = CancellerBide, - [CANCELLER_THAW] = CancellerThaw, - [CANCELLER_STANCE_CHANGE_2] = CancellerStanceChangeTwo, - [CANCELLER_WEATHER_PRIMAL] = CancellerWeatherPrimal, - [CANCELLER_DYNAMAX_BLOCKED] = CancellerDynamaxBlocked, - [CANCELLER_POWDER_STATUS] = CancellerPowderStatus, - [CANCELLER_PROTEAN] = CancellerProtean, - [CANCELLER_PSYCHIC_TERRAIN] = CancellerPsychicTerrain, - [CANCELLER_EXPLODING_DAMP] = CancellerExplodingDamp, - [CANCELLER_MULTIHIT_MOVES] = CancellerMultihitMoves, - [CANCELLER_Z_MOVES] = CancellerZMoves, - [CANCELLER_MULTI_TARGET_MOVES] = CancellerMultiTargetMoves, + gBattleStruct->numSpreadTargets = CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER, ctx->battlerAtk); + } + return MOVE_STEP_SUCCESS; +} + +static enum MoveCanceler (*const sMoveSuccessOrderCancelers[])(struct BattleContext *ctx) = +{ + [CANCELER_CLEAR_FLAGS] = CancelerClearFlags, + [CANCELER_STANCE_CHANGE_1] = CancelerStanceChangeOne, + [CANCELER_SKY_DROP] = CancelerSkyDrop, + [CANCELER_RECHARGE] = CancelerRecharge, + [CANCELER_ASLEEP_OR_FROZEN] = CancelerAsleepOrFrozen, + [CANCELER_OBEDIENCE] = CancelerObedience, + [CANCELER_POWER_POINTS] = CancelerPowerPoints, + [CANCELER_TRUANT] = CancelerTruant, + [CANCELER_FLINCH] = CancelerFlinch, + [CANCELER_DISABLED] = CancelerDisabled, + [CANCELER_VOLATILE_BLOCKED] = CancelerVolatileBlocked, + [CANCELER_TAUNTED] = CancelerTaunted, + [CANCELER_IMPRISONED] = CancelerImprisoned, + [CANCELER_CONFUSED] = CancelerConfused, + [CANCELER_PARALYZED] = CancelerParalyzed, + [CANCELER_INFATUATION] = CancelerInfatuation, + [CANCELER_BIDE] = CancelerBide, + [CANCELER_Z_MOVES] = CancelerZMoves, + [CANCELER_CHOICE_LOCK] = CancelerChoiceLock, + [CANCELER_CALLSUBMOVE] = CancelerCallSubmove, + [CANCELER_THAW] = CancelerThaw, + [CANCELER_STANCE_CHANGE_2] = CancelerStanceChangeTwo, + [CANCELER_ATTACKSTRING] = CancelerAttackstring, + [CANCELER_PPDEDUCTION] = CancelerPPDeduction, + [CANCELER_WEATHER_PRIMAL] = CancelerWeatherPrimal, + [CANCELER_MOVE_FAILURE] = CancelerMoveFailure, + [CANCELER_POWDER_STATUS] = CancelerPowderStatus, + [CANCELER_PRIORITY_BLOCK] = CancelerPriorityBlock, + [CANCELER_PROTEAN] = CancelerProtean, + [CANCELER_EXPLODING_DAMP] = CancelerExplodingDamp, + [CANCELER_MULTIHIT_MOVES] = CancelerMultihitMoves, + [CANCELER_MULTI_TARGET_MOVES] = CancelerMultiTargetMoves, }; -u32 AtkCanceller_MoveSuccessOrder(void) +enum MoveCanceler AtkCanceler_MoveSuccessOrder(struct BattleContext *ctx) { - u32 effect = 0; + enum MoveCanceler effect = MOVE_STEP_SUCCESS; - while (gBattleStruct->atkCancellerTracker < CANCELLER_END && effect == 0) + while (gBattleStruct->eventState.atkCanceler < CANCELER_END && effect == MOVE_STEP_SUCCESS) { - sMoveSuccessOrderCancellers[gBattleStruct->atkCancellerTracker](&effect); - gBattleStruct->atkCancellerTracker++; + effect = sMoveSuccessOrderCancelers[gBattleStruct->eventState.atkCanceler](ctx); + gBattleStruct->eventState.atkCanceler++; } - if (effect == 2) + if (effect == MOVE_STEP_REMOVES_STATUS) { - BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBattlerAttacker].status1); - MarkBattlerForControllerExec(gBattlerAttacker); + BtlController_EmitSetMonData( + ctx->battlerAtk, + B_COMM_TO_CONTROLLER, + REQUEST_STATUS_BATTLE, + 0, + 4, + &gBattleMons[gBattlerAttacker].status1); + MarkBattlerForControllerExec(ctx->battlerAtk); } return effect; @@ -2712,24 +3220,27 @@ bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2 } } -bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, bool32 viaAbility) +bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, u32 ability) { - u16 battlerAbility = GetBattlerAbility(battler); - if (gBattleWeather & sBattleWeatherInfo[battleWeatherId].flag) { return FALSE; } else if (gBattleWeather & B_WEATHER_PRIMAL_ANY - && battlerAbility != ABILITY_DESOLATE_LAND - && battlerAbility != ABILITY_PRIMORDIAL_SEA - && battlerAbility != ABILITY_DELTA_STREAM) + && ability != ABILITY_DESOLATE_LAND + && ability != ABILITY_PRIMORDIAL_SEA + && ability != ABILITY_DELTA_STREAM) { return FALSE; } - else if (GetGenConfig(GEN_CONFIG_ABILITY_WEATHER) < GEN_6 && viaAbility) + else if (GetConfig(CONFIG_ABILITY_WEATHER) < GEN_6 && ability != ABILITY_NONE) { gBattleWeather = sBattleWeatherInfo[battleWeatherId].flag; + for (u32 i = 0; i < gBattlersCount; i++) + { + gDisableStructs[i].weatherAbilityDone = FALSE; + ResetParadoxWeatherStat(i); + } return TRUE; } else @@ -2738,29 +3249,39 @@ bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, bool32 viaAbilit gBattleWeather = sBattleWeatherInfo[battleWeatherId].flag; if (gBattleWeather & B_WEATHER_PRIMAL_ANY) gWishFutureKnock.weatherDuration = 0; - else if (rock != 0 && GetBattlerHoldEffect(battler, TRUE) == rock) + else if (rock != 0 && GetBattlerHoldEffect(battler) == rock) gWishFutureKnock.weatherDuration = 8; else gWishFutureKnock.weatherDuration = 5; + for (u32 i = 0; i < gBattlersCount; i++) + { + gDisableStructs[i].weatherAbilityDone = FALSE; + ResetParadoxWeatherStat(i); + } return TRUE; } return FALSE; } -static bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag, u16 *timer) +bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag) { - if ((!(gFieldStatuses & statusFlag) && (!gBattleStruct->isSkyBattle))) + if (gBattleStruct->isSkyBattle) + return FALSE; + + if (!(gFieldStatuses & statusFlag)) { gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; gFieldStatuses |= statusFlag; - gDisableStructs[battler].terrainAbilityDone = FALSE; - - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER) - *timer = gBattleTurnCounter + 8; + for (u32 i = 0; i < gBattlersCount; i++) + { + gDisableStructs[i].terrainAbilityDone = FALSE; + ResetParadoxTerrainStat(i); + } + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_TERRAIN_EXTENDER) + gFieldTimers.terrainTimer = 8; else - *timer = gBattleTurnCounter + 5; - + gFieldTimers.terrainTimer = 5; gBattleScripting.battler = battler; return TRUE; } @@ -2792,6 +3313,7 @@ static void ForewarnChooseMove(u32 battler) switch (GetMoveEffect(data[count].moveId)) { case EFFECT_OHKO: + case EFFECT_SHEER_COLD: data[count].power = 150; break; case EFFECT_COUNTER: @@ -2822,16 +3344,16 @@ static void ForewarnChooseMove(u32 battler) bestId = i; } - gBattlerTarget = data[bestId].battler; + gEffectBattler = data[bestId].battler; PREPARE_MOVE_BUFFER(gBattleTextBuff1, data[bestId].moveId) - RecordKnownMove(gBattlerTarget, data[bestId].moveId); + RecordKnownMove(data[bestId].battler, data[bestId].moveId); Free(data); } bool32 ChangeTypeBasedOnTerrain(u32 battler) { - u32 battlerType; + enum Type battlerType; if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) battlerType = TYPE_ELECTRIC; @@ -2849,7 +3371,7 @@ bool32 ChangeTypeBasedOnTerrain(u32 battler) return TRUE; } -static inline u8 GetSideFaintCounter(u32 side) +static inline u8 GetSideFaintCounter(enum BattleSide side) { return (side == B_SIDE_PLAYER) ? gBattleResults.playerFaintCounter : gBattleResults.opponentFaintCounter; } @@ -2867,10 +3389,9 @@ static inline uq4_12_t GetSupremeOverlordModifier(u32 battler) bool32 HadMoreThanHalfHpNowDoesnt(u32 battler) { - u32 cutoff = gBattleMons[battler].maxHP / 2; // Had more than half of hp before, now has less - return gBattleStruct->hpBefore[battler] > cutoff - && gBattleMons[battler].hp <= cutoff; + return gBattleStruct->battlerState[battler].wasAboveHalfHp + && gBattleMons[battler].hp <= gBattleMons[battler].maxHP / 2; } #define ANIM_STAT_HP 0 @@ -2881,7 +3402,7 @@ bool32 HadMoreThanHalfHpNowDoesnt(u32 battler) #define ANIM_STAT_SPEED 5 #define ANIM_STAT_ACC 6 #define ANIM_STAT_EVASION 7 -static void ChooseStatBoostAnimation(u32 battler) +void ChooseStatBoostAnimation(u32 battler) { u32 stat; bool32 statBuffMoreThan1 = FALSE; @@ -2921,44 +3442,19 @@ static void ChooseStatBoostAnimation(u32 battler) #undef ANIM_STAT_ACC #undef ANIM_STAT_EVASION -bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, u32 move, enum AbilityEffectOptions option) +bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, u32 move, enum FunctionCallOption option) { const u8 *battleScriptBlocksMove = NULL; - u32 battlerAbility = battlerDef; - s32 atkPriority = 0; - - if (option == ABILITY_CHECK_TRIGGER_AI) - atkPriority = GetBattleMovePriority(battlerAtk, abilityAtk, move); - else - atkPriority = GetChosenMovePriority(battlerAtk, abilityAtk); switch (abilityDef) { case ABILITY_SOUNDPROOF: if (IsSoundMove(move) && !(GetBattlerMoveTargetType(battlerAtk, move) & MOVE_TARGET_USER)) - { - if (gBattleMons[battlerAtk].status2 & STATUS2_MULTIPLETURNS) - gHitMarker |= HITMARKER_NO_PPDEDUCT; battleScriptBlocksMove = BattleScript_SoundproofProtected; - } break; case ABILITY_BULLETPROOF: if (IsBallisticMove(move)) - { - if (gBattleMons[battlerAtk].status2 & STATUS2_MULTIPLETURNS) - gHitMarker |= HITMARKER_NO_PPDEDUCT; battleScriptBlocksMove = BattleScript_SoundproofProtected; - } - break; - case ABILITY_DAZZLING: - case ABILITY_QUEENLY_MAJESTY: - case ABILITY_ARMOR_TAIL: - if (atkPriority > 0 && !IsBattlerAlly(battlerAtk, battlerDef)) - { - if (gBattleMons[battlerAtk].status2 & STATUS2_MULTIPLETURNS) - gHitMarker |= HITMARKER_NO_PPDEDUCT; - battleScriptBlocksMove = BattleScript_DazzlingProtected; - } break; case ABILITY_GOOD_AS_GOLD: if (IsBattleMoveStatus(move)) @@ -2967,44 +3463,43 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a battleScriptBlocksMove = BattleScript_GoodAsGoldActivates; } break; + default: + break; } - if (atkPriority > 0) + if (battleScriptBlocksMove == NULL) { - // Prankster check - if (battleScriptBlocksMove == NULL - && IsBattleMoveStatus(move) - && BlocksPrankster(move, battlerAtk, battlerDef, TRUE) - && !(IsBattleMoveStatus(move) && (abilityDef == ABILITY_MAGIC_BOUNCE || gProtectStructs[battlerDef].bounceMove))) - { - if (option == ABILITY_RUN_SCRIPT && !IsSpreadMove(GetBattlerMoveTargetType(battlerAtk, move))) - CancelMultiTurnMoves(battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); // Don't cancel moves that can hit two targets bc one target might not be protected + s32 atkPriority = 0; + if (option == AI_CHECK) + atkPriority = GetBattleMovePriority(battlerAtk, abilityAtk, move); + else + atkPriority = GetChosenMovePriority(battlerAtk, abilityAtk); - battleScriptBlocksMove = BattleScript_DarkTypePreventsPrankster; + if (atkPriority <= 0) + { + // Not a priority move } - - // Check def partner ability - u32 partnerDef = BATTLE_PARTNER(battlerDef); - if (battleScriptBlocksMove == NULL - && IsDoubleBattle() - && IsBattlerAlive(partnerDef) - && !IsBattlerAlly(battlerAtk, partnerDef)) + else if (IsBattleMoveStatus(move) + && BlocksPrankster(move, battlerAtk, battlerDef, TRUE) + && !(IsBattleMoveStatus(move) && (abilityDef == ABILITY_MAGIC_BOUNCE || gProtectStructs[battlerDef].bounceMove))) { - if (option == ABILITY_CHECK_TRIGGER_AI) - abilityDef = gAiLogicData->abilities[partnerDef]; - else - abilityDef = GetBattlerAbility(partnerDef); - - switch (abilityDef) + if (option == RUN_SCRIPT && !IsSpreadMove(GetBattlerMoveTargetType(battlerAtk, move))) + CancelMultiTurnMoves(battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); // Don't cancel moves that can hit two targets bc one target might not be protected + battleScriptBlocksMove = BattleScript_DoesntAffectTargetAtkString; + } + else if (IsBattlerTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef), STATUS_FIELD_PSYCHIC_TERRAIN) // Not an ability but similar conditions + && !IsBattlerAlly(battlerAtk, battlerDef) + && GetMoveTarget(move) != MOVE_TARGET_ALL_BATTLERS + && GetMoveTarget(move) != MOVE_TARGET_OPPONENTS_FIELD) + { + battleScriptBlocksMove = BattleScript_MoveUsedPsychicTerrainPrevents; + if (option == RUN_SCRIPT) { - case ABILITY_DAZZLING: - case ABILITY_QUEENLY_MAJESTY: - case ABILITY_ARMOR_TAIL: - if (gBattleMons[battlerAtk].status2 & STATUS2_MULTIPLETURNS) - gHitMarker |= HITMARKER_NO_PPDEDUCT; - battlerAbility = partnerDef; - battleScriptBlocksMove = BattleScript_DazzlingProtected; - break; + gMultiHitCounter = 0; // Prevent multi-hit moves from hitting more than once after move has been absorbed. + if (!IsSpreadMove(GetBattlerMoveTargetType(battlerAtk, move))) + CancelMultiTurnMoves(battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); // Don't cancel moves that can hit two targets bc one target might not be protected + gBattlescriptCurrInstr = BattleScript_MoveUsedPsychicTerrainPrevents; + return TRUE; // Early return since we don't want to set remaining values } } } @@ -3012,23 +3507,23 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a if (battleScriptBlocksMove == NULL) return FALSE; - if (option == ABILITY_RUN_SCRIPT) + if (option == RUN_SCRIPT) { - gMultiHitCounter = 0; // Prevent multi-hit moves from hitting more than once after move has been absorbed. + gMultiHitCounter = 0; // Prevent multi-hit moves from hitting more than once after move has been absorbed. gLastUsedAbility = abilityDef; RecordAbilityBattle(battlerDef, abilityDef); - gBattleScripting.battler = gBattlerAbility = battlerAbility; + gBattleScripting.battler = gBattlerAbility = battlerDef; gBattlescriptCurrInstr = battleScriptBlocksMove; } return TRUE; } -bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 move, u32 moveType, enum AbilityEffectOptions option) +bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef, u32 move, enum Type moveType, enum FunctionCallOption option) { enum MoveAbsorbed effect = MOVE_ABSORBED_BY_NO_ABILITY; const u8 *battleScript = NULL; - u32 statId = 0; + enum Stat statId = 0; u32 statAmount = 1; switch (abilityDef) @@ -3057,14 +3552,14 @@ bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 } break; case ABILITY_LIGHTNING_ROD: - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5 && moveType == TYPE_ELECTRIC && GetBattlerMoveTargetType(battlerAtk, move) != MOVE_TARGET_ALL_BATTLERS) + if (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) >= GEN_5 && moveType == TYPE_ELECTRIC && GetBattlerMoveTargetType(battlerAtk, move) != MOVE_TARGET_ALL_BATTLERS) { effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; statId = STAT_SPATK; } break; case ABILITY_STORM_DRAIN: - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5 && moveType == TYPE_WATER) + if (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) >= GEN_5 && moveType == TYPE_WATER) { effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; statId = STAT_SPATK; @@ -3098,7 +3593,7 @@ bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 break; } - if (effect == MOVE_ABSORBED_BY_NO_ABILITY || option != ABILITY_RUN_SCRIPT) + if (effect == MOVE_ABSORBED_BY_NO_ABILITY || option != RUN_SCRIPT) return effect; switch (effect) @@ -3107,42 +3602,25 @@ bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 return FALSE; case MOVE_ABSORBED_BY_DRAIN_HP_ABILITY: gBattleStruct->pledgeMove = FALSE; - if (IsBattlerAtMaxHp(battlerDef) || (B_HEAL_BLOCKING >= GEN_5 && gStatuses3[battlerDef] & STATUS3_HEAL_BLOCK)) + if (IsBattlerAtMaxHp(battlerDef) || (B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battlerDef].volatiles.healBlock)) { - if ((gProtectStructs[battlerAtk].notFirstStrike)) - battleScript = BattleScript_MonMadeMoveUseless; - else - battleScript = BattleScript_MonMadeMoveUseless_PPLoss; + battleScript = BattleScript_MonMadeMoveUseless; } else { - if (gProtectStructs[battlerAtk].notFirstStrike) - battleScript = BattleScript_MoveHPDrain; - else - battleScript = BattleScript_MoveHPDrain_PPLoss; - - gBattleStruct->moveDamage[battlerDef] = GetNonDynamaxMaxHP(battlerDef) / 4; - if (gBattleStruct->moveDamage[battlerDef] == 0) - gBattleStruct->moveDamage[battlerDef] = 1; - gBattleStruct->moveDamage[battlerDef] *= -1; + battleScript = BattleScript_MoveHPDrain; + SetHealAmount(battlerDef, GetNonDynamaxMaxHP(battlerDef) / 4); } break; case MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY: gBattleStruct->pledgeMove = FALSE; - if (!CompareStat(battlerDef, statId, MAX_STAT_STAGE, CMP_LESS_THAN)) + if (!CompareStat(battlerDef, statId, MAX_STAT_STAGE, CMP_LESS_THAN, abilityDef)) { - if ((gProtectStructs[battlerAtk].notFirstStrike)) - battleScript = BattleScript_MonMadeMoveUseless; - else - battleScript = BattleScript_MonMadeMoveUseless_PPLoss; + battleScript = BattleScript_MonMadeMoveUseless; } else { - if (gProtectStructs[battlerAtk].notFirstStrike) - battleScript = BattleScript_MoveStatDrain; - else - battleScript = BattleScript_MoveStatDrain_PPLoss; - + battleScript = BattleScript_MoveStatDrain; SET_STATCHANGER(statId, statAmount, FALSE); if (B_ABSORBING_ABILITY_STRING < GEN_5) PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); @@ -3153,19 +3631,13 @@ bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 if (!gDisableStructs[battlerDef].flashFireBoosted) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_BOOST; - if (gProtectStructs[battlerAtk].notFirstStrike) - battleScript = BattleScript_FlashFireBoost; - else - battleScript = BattleScript_FlashFireBoost_PPLoss; + battleScript = BattleScript_FlashFireBoost; gDisableStructs[battlerDef].flashFireBoosted = TRUE; } else { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_NO_BOOST; - if (gProtectStructs[battlerAtk].notFirstStrike) - battleScript = BattleScript_FlashFireBoost; - else - battleScript = BattleScript_FlashFireBoost_PPLoss; + battleScript = BattleScript_FlashFireBoost; } break; } @@ -3182,7 +3654,7 @@ bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 return effect; } -static inline u32 SetStartingFieldStatus(u32 flag, u32 message, u32 anim, u16 *timer) +static inline bool32 SetStartingFieldStatus(u32 flag, u32 message, u32 anim, u16 *timer) { if (!(gFieldStatuses & flag)) { @@ -3190,17 +3662,17 @@ static inline u32 SetStartingFieldStatus(u32 flag, u32 message, u32 anim, u16 *t gFieldStatuses |= flag; gBattleScripting.animArg1 = anim; if (gBattleStruct->startingStatusTimer) - *timer = gBattleTurnCounter + gBattleStruct->startingStatusTimer; + *timer = gBattleStruct->startingStatusTimer; else *timer = 0; // Infinite - return 1; + return TRUE; } - return 0; + return FALSE; } -static inline u32 SetStartingSideStatus(u32 flag, u32 side, u32 message, u32 anim, u16 *timer) +static inline bool32 SetStartingSideStatus(u32 flag, u32 side, u32 message, u32 anim, u16 *timer) { if (!(gSideStatuses[side] & flag)) { @@ -3209,163 +3681,158 @@ static inline u32 SetStartingSideStatus(u32 flag, u32 side, u32 message, u32 ani gSideStatuses[side] |= flag; gBattleScripting.animArg1 = anim; if (gBattleStruct->startingStatusTimer) - *timer = gBattleTurnCounter + gBattleStruct->startingStatusTimer; + *timer = gBattleStruct->startingStatusTimer; else *timer = 0; // Infinite - return 1; + return TRUE; } - return 0; + return FALSE; } -u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 moveArg) +bool32 TryFieldEffects(enum FieldEffectCases caseId) { - u32 effect = 0; - u32 moveType = 0, move = 0; - u32 side = 0; - u32 i = 0, j = 0; - u32 partner = 0; - struct Pokemon *mon; + bool32 effect = FALSE; + bool32 isTerrain = FALSE; if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - return 0; - - if (gBattlerAttacker >= gBattlersCount) - gBattlerAttacker = battler; + return FALSE; - if (special) - gLastUsedAbility = special; - else if (ability) - gLastUsedAbility = ability; - else - gLastUsedAbility = GetBattlerAbility(battler); - - if (moveArg) - move = moveArg; - else - move = gCurrentMove; - - moveType = GetBattleMoveType(move); - - switch (caseID) + switch (caseId) { - case ABILITYEFFECT_SWITCH_IN_STATUSES: // starting field/side/etc statuses with a variable + case FIELD_EFFECT_TRAINER_STATUSES: // starting field/side/etc statuses with a variable + switch ((enum StartingStatus) gBattleStruct->startingStatus) + { + case STARTING_STATUS_NONE: + break; + case STARTING_STATUS_ELECTRIC_TERRAIN: + effect = SetStartingFieldStatus( + STATUS_FIELD_ELECTRIC_TERRAIN, + B_MSG_TERRAIN_SET_ELECTRIC, + 0, + &gFieldTimers.terrainTimer); + isTerrain = TRUE; + break; + case STARTING_STATUS_MISTY_TERRAIN: + effect = SetStartingFieldStatus( + STATUS_FIELD_MISTY_TERRAIN, + B_MSG_TERRAIN_SET_MISTY, + 0, + &gFieldTimers.terrainTimer); + isTerrain = TRUE; + break; + case STARTING_STATUS_GRASSY_TERRAIN: + effect = SetStartingFieldStatus( + STATUS_FIELD_GRASSY_TERRAIN, + B_MSG_TERRAIN_SET_GRASSY, + 0, + &gFieldTimers.terrainTimer); + isTerrain = TRUE; + break; + case STARTING_STATUS_PSYCHIC_TERRAIN: + effect = SetStartingFieldStatus( + STATUS_FIELD_PSYCHIC_TERRAIN, + B_MSG_TERRAIN_SET_PSYCHIC, + 0, + &gFieldTimers.terrainTimer); + isTerrain = TRUE; + break; + case STARTING_STATUS_TRICK_ROOM: + effect = SetStartingFieldStatus( + STATUS_FIELD_TRICK_ROOM, + B_MSG_SET_TRICK_ROOM, + B_ANIM_TRICK_ROOM, + &gFieldTimers.trickRoomTimer); + break; + case STARTING_STATUS_MAGIC_ROOM: + effect = SetStartingFieldStatus( + STATUS_FIELD_MAGIC_ROOM, + B_MSG_SET_MAGIC_ROOM, + B_ANIM_MAGIC_ROOM, + &gFieldTimers.magicRoomTimer); + break; + case STARTING_STATUS_WONDER_ROOM: + effect = SetStartingFieldStatus( + STATUS_FIELD_WONDER_ROOM, + B_MSG_SET_WONDER_ROOM, + B_ANIM_WONDER_ROOM, + &gFieldTimers.wonderRoomTimer); + break; + case STARTING_STATUS_TAILWIND_PLAYER: + effect = SetStartingSideStatus( + SIDE_STATUS_TAILWIND, + B_SIDE_PLAYER, + B_MSG_SET_TAILWIND, + B_ANIM_TAILWIND, + &gSideTimers[B_SIDE_PLAYER].tailwindTimer); + break; + case STARTING_STATUS_TAILWIND_OPPONENT: + effect = SetStartingSideStatus( + SIDE_STATUS_TAILWIND, + B_SIDE_OPPONENT, + B_MSG_SET_TAILWIND, + B_ANIM_TAILWIND, + &gSideTimers[B_SIDE_OPPONENT].tailwindTimer); + break; + case STARTING_STATUS_RAINBOW_PLAYER: + effect = SetStartingSideStatus( + SIDE_STATUS_RAINBOW, + B_SIDE_PLAYER, + B_MSG_SET_RAINBOW, + B_ANIM_RAINBOW, + &gSideTimers[B_SIDE_PLAYER].rainbowTimer); + break; + case STARTING_STATUS_RAINBOW_OPPONENT: + effect = SetStartingSideStatus( + SIDE_STATUS_RAINBOW, + B_SIDE_OPPONENT, + B_MSG_SET_RAINBOW, + B_ANIM_RAINBOW, + &gSideTimers[B_SIDE_OPPONENT].rainbowTimer); + break; + case STARTING_STATUS_SEA_OF_FIRE_PLAYER: + effect = SetStartingSideStatus( + SIDE_STATUS_SEA_OF_FIRE, + B_SIDE_PLAYER, + B_MSG_SET_SEA_OF_FIRE, + B_ANIM_SEA_OF_FIRE, + &gSideTimers[B_SIDE_PLAYER].seaOfFireTimer); + break; + case STARTING_STATUS_SEA_OF_FIRE_OPPONENT: + effect = SetStartingSideStatus( + SIDE_STATUS_SEA_OF_FIRE, + B_SIDE_OPPONENT, + B_MSG_SET_SEA_OF_FIRE, + B_ANIM_SEA_OF_FIRE, + &gSideTimers[B_SIDE_OPPONENT].seaOfFireTimer); + break; + case STARTING_STATUS_SWAMP_PLAYER: + effect = SetStartingSideStatus( + SIDE_STATUS_SWAMP, + B_SIDE_PLAYER, + B_MSG_SET_SWAMP, + B_ANIM_SWAMP, + &gSideTimers[B_SIDE_PLAYER].swampTimer); + break; + case STARTING_STATUS_SWAMP_OPPONENT: + effect = SetStartingSideStatus( + SIDE_STATUS_SWAMP, + B_SIDE_OPPONENT, + B_MSG_SET_SWAMP, + B_ANIM_SWAMP, + &gSideTimers[B_SIDE_OPPONENT].swampTimer); + break; + } + if (effect) { - gBattleScripting.battler = battler; - switch (gBattleStruct->startingStatus) - { - case STARTING_STATUS_ELECTRIC_TERRAIN: - effect = SetStartingFieldStatus(STATUS_FIELD_ELECTRIC_TERRAIN, - B_MSG_TERRAIN_SET_ELECTRIC, - 0, - &gFieldTimers.terrainTimer); - effect = (effect == 1) ? 2 : 0; - break; - case STARTING_STATUS_MISTY_TERRAIN: - effect = SetStartingFieldStatus(STATUS_FIELD_MISTY_TERRAIN, - B_MSG_TERRAIN_SET_MISTY, - 0, - &gFieldTimers.terrainTimer); - effect = (effect == 1) ? 2 : 0; - break; - case STARTING_STATUS_GRASSY_TERRAIN: - effect = SetStartingFieldStatus(STATUS_FIELD_GRASSY_TERRAIN, - B_MSG_TERRAIN_SET_GRASSY, - 0, - &gFieldTimers.terrainTimer); - effect = (effect == 1) ? 2 : 0; - break; - case STARTING_STATUS_PSYCHIC_TERRAIN: - effect = SetStartingFieldStatus(STATUS_FIELD_PSYCHIC_TERRAIN, - B_MSG_TERRAIN_SET_PSYCHIC, - 0, - &gFieldTimers.terrainTimer); - effect = (effect == 1) ? 2 : 0; - break; - case STARTING_STATUS_TRICK_ROOM: - effect = SetStartingFieldStatus(STATUS_FIELD_TRICK_ROOM, - B_MSG_SET_TRICK_ROOM, - B_ANIM_TRICK_ROOM, - &gFieldTimers.trickRoomTimer); - break; - case STARTING_STATUS_MAGIC_ROOM: - effect = SetStartingFieldStatus(STATUS_FIELD_MAGIC_ROOM, - B_MSG_SET_MAGIC_ROOM, - B_ANIM_MAGIC_ROOM, - &gFieldTimers.magicRoomTimer); - break; - case STARTING_STATUS_WONDER_ROOM: - effect = SetStartingFieldStatus(STATUS_FIELD_WONDER_ROOM, - B_MSG_SET_WONDER_ROOM, - B_ANIM_WONDER_ROOM, - &gFieldTimers.wonderRoomTimer); - break; - case STARTING_STATUS_TAILWIND_PLAYER: - effect = SetStartingSideStatus(SIDE_STATUS_TAILWIND, - B_SIDE_PLAYER, - B_MSG_SET_TAILWIND, - B_ANIM_TAILWIND, - &gSideTimers[B_SIDE_PLAYER].tailwindTimer); - break; - case STARTING_STATUS_TAILWIND_OPPONENT: - effect = SetStartingSideStatus(SIDE_STATUS_TAILWIND, - B_SIDE_OPPONENT, - B_MSG_SET_TAILWIND, - B_ANIM_TAILWIND, - &gSideTimers[B_SIDE_OPPONENT].tailwindTimer); - break; - case STARTING_STATUS_RAINBOW_PLAYER: - effect = SetStartingSideStatus(SIDE_STATUS_RAINBOW, - B_SIDE_PLAYER, - B_MSG_SET_RAINBOW, - B_ANIM_RAINBOW, - &gSideTimers[B_SIDE_PLAYER].rainbowTimer); - break; - case STARTING_STATUS_RAINBOW_OPPONENT: - effect = SetStartingSideStatus(SIDE_STATUS_RAINBOW, - B_SIDE_OPPONENT, - B_MSG_SET_RAINBOW, - B_ANIM_RAINBOW, - &gSideTimers[B_SIDE_OPPONENT].rainbowTimer); - break; - case STARTING_STATUS_SEA_OF_FIRE_PLAYER: - effect = SetStartingSideStatus(SIDE_STATUS_SEA_OF_FIRE, - B_SIDE_PLAYER, - B_MSG_SET_SEA_OF_FIRE, - B_ANIM_SEA_OF_FIRE, - &gSideTimers[B_SIDE_PLAYER].seaOfFireTimer); - break; - case STARTING_STATUS_SEA_OF_FIRE_OPPONENT: - effect = SetStartingSideStatus(SIDE_STATUS_SEA_OF_FIRE, - B_SIDE_OPPONENT, - B_MSG_SET_SEA_OF_FIRE, - B_ANIM_SEA_OF_FIRE, - &gSideTimers[B_SIDE_OPPONENT].seaOfFireTimer); - break; - case STARTING_STATUS_SWAMP_PLAYER: - effect = SetStartingSideStatus(SIDE_STATUS_SWAMP, - B_SIDE_PLAYER, - B_MSG_SET_SWAMP, - B_ANIM_SWAMP, - &gSideTimers[B_SIDE_PLAYER].swampTimer); - break; - case STARTING_STATUS_SWAMP_OPPONENT: - effect = SetStartingSideStatus(SIDE_STATUS_SWAMP, - B_SIDE_OPPONENT, - B_MSG_SET_SWAMP, - B_ANIM_SWAMP, - &gSideTimers[B_SIDE_OPPONENT].swampTimer); - break; - } - - if (effect == 1) - BattleScriptPushCursorAndCallback(BattleScript_OverworldStatusStarts); - else if (effect == 2) + if (isTerrain) BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain); + else + BattleScriptPushCursorAndCallback(BattleScript_OverworldStatusStarts); } break; - case ABILITYEFFECT_SWITCH_IN_TERRAIN: // terrain starting from overworld weather + case FIELD_EFFECT_OVERWORLD_TERRAIN: // terrain starting from overworld weather if (B_THUNDERSTORM_TERRAIN == TRUE && !(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) && GetCurrentWeather() == WEATHER_RAIN_THUNDERSTORM) @@ -3375,7 +3842,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gFieldTimers.terrainTimer = 0; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC; BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain); - effect++; + effect = TRUE; } else if (B_OVERWORLD_FOG >= GEN_8 && (GetCurrentWeather() == WEATHER_FOG_HORIZONTAL || GetCurrentWeather() == WEATHER_FOG_DIAGONAL) @@ -3385,11 +3852,10 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gFieldTimers.terrainTimer = 0; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY; BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain); - effect++; + effect = TRUE; } break; - case ABILITYEFFECT_SWITCH_IN_WEATHER: - gBattleScripting.battler = battler; + case FIELD_EFFECT_OVERWORLD_WEATHER: if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) { switch (GetCurrentWeather()) @@ -3401,7 +3867,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { gBattleWeather = B_WEATHER_RAIN_NORMAL; gBattleScripting.animArg1 = B_ANIM_RAIN_CONTINUES; - effect++; + effect = TRUE; } break; case WEATHER_SANDSTORM: @@ -3409,7 +3875,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { gBattleWeather = B_WEATHER_SANDSTORM; gBattleScripting.animArg1 = B_ANIM_SANDSTORM_CONTINUES; - effect++; + effect = TRUE; } break; case WEATHER_DROUGHT: @@ -3417,7 +3883,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { gBattleWeather = B_WEATHER_SUN_NORMAL; gBattleScripting.animArg1 = B_ANIM_SUN_CONTINUES; - effect++; + effect = TRUE; } break; case WEATHER_SNOW: @@ -3433,29 +3899,62 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattleWeather = B_WEATHER_HAIL; gBattleScripting.animArg1 = B_ANIM_HAIL_CONTINUES; } - effect++; + effect = TRUE; } break; case WEATHER_FOG_DIAGONAL: case WEATHER_FOG_HORIZONTAL: - if (B_OVERWORLD_FOG == GEN_4) + if (B_OVERWORLD_FOG == GEN_4 && !(gBattleWeather & B_WEATHER_FOG)) { - if (!(gBattleWeather & B_WEATHER_FOG)) - { - gBattleWeather = B_WEATHER_FOG; - gBattleScripting.animArg1 = B_ANIM_FOG_CONTINUES; - effect++; - } - break; + gBattleWeather = B_WEATHER_FOG; + gBattleScripting.animArg1 = B_ANIM_FOG_CONTINUES; + effect = TRUE; } + break; } } - if (effect != 0) + if (effect) { gBattleCommunication[MULTISTRING_CHOOSER] = GetCurrentWeather(); BattleScriptPushCursorAndCallback(BattleScript_OverworldWeatherStarts); } break; + } + + return effect; +} + +u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ability, u32 special, u32 moveArg) +{ + u32 effect = 0; + enum Type moveType = 0; + u32 move = 0; + u32 side = 0; + u32 i = 0, j = 0; + u32 partner = 0; + + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + return 0; + + if (gBattlerAttacker >= gBattlersCount) + gBattlerAttacker = battler; + + if (special) + gLastUsedAbility = special; + else if (ability) + gLastUsedAbility = ability; + else + gLastUsedAbility = GetBattlerAbility(battler); + + if (moveArg) + move = moveArg; + else + move = gCurrentMove; + + moveType = GetBattleMoveType(move); + + switch (caseID) + { case ABILITYEFFECT_ON_SWITCHIN: gBattleScripting.battler = battler; switch (gLastUsedAbility) @@ -3468,6 +3967,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (gSpecialStatuses[battler].switchInAbilityDone) break; + if (GetBattlerHoldEffectIgnoreAbility(battler) == HOLD_EFFECT_ABILITY_SHIELD) + break; side = (BATTLE_OPPOSITE(GetBattlerPosition(battler))) & BIT_SIDE; target1 = GetBattlerAtPosition(side); @@ -3493,8 +3994,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 BattleScriptPushCursorAndCallback(BattleScript_TraceActivates); gBattleStruct->tracedAbility[battler] = gLastUsedAbility = gBattleMons[chosenTarget].ability; RecordAbilityBattle(chosenTarget, gLastUsedAbility); // Record the opposing battler has this ability - gBattlerAbility = battler; - PREPARE_MON_NICK_WITH_PREFIX_LOWER_BUFFER(gBattleTextBuff1, chosenTarget, gBattlerPartyIndexes[chosenTarget]) PREPARE_ABILITY_BUFFER(gBattleTextBuff2, gLastUsedAbility) } @@ -3510,11 +4009,14 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (gDisableStructs[battler].isFirstTurn == 2 && !gDisableStructs[battler].overwrittenAbility && IsBattlerAlive(diagonalBattler) - && !(gBattleMons[diagonalBattler].status2 & (STATUS2_TRANSFORMED | STATUS2_SUBSTITUTE)) - && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + && !gBattleMons[diagonalBattler].volatiles.substitute + && !gBattleMons[diagonalBattler].volatiles.transformed + && !gBattleMons[battler].volatiles.transformed && gBattleStruct->illusion[diagonalBattler].state != ILLUSION_ON - && !(gStatuses3[diagonalBattler] & STATUS3_SEMI_INVULNERABLE_NO_COMMANDER)) + && !IsSemiInvulnerable(diagonalBattler, EXCLUDE_COMMANDER)) { + SaveBattlerAttacker(gBattlerAttacker); + SaveBattlerTarget(gBattlerTarget); gBattlerAttacker = battler; gBattlerTarget = diagonalBattler; BattleScriptPushCursorAndCallback(BattleScript_ImposterActivates); @@ -3552,7 +4054,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_SLOW_START: if (!gSpecialStatuses[battler].switchInAbilityDone) { - gDisableStructs[battler].slowStartTimer = gBattleTurnCounter + 5; + gDisableStructs[battler].slowStartTimer = 5; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_SLOWSTART; gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); @@ -3562,7 +4064,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_UNNERVE: if (!gSpecialStatuses[battler].switchInAbilityDone && !gDisableStructs[battler].unnerveActivated) { - gBattlerTarget = GetOppositeBattler(battler); + gEffectBattler = GetOppositeBattler(battler); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_UNNERVE; gDisableStructs[battler].unnerveActivated = TRUE; gSpecialStatuses[battler].switchInAbilityDone = TRUE; @@ -3574,7 +4076,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_AS_ONE_SHADOW_RIDER: if (!gSpecialStatuses[battler].switchInAbilityDone && !gDisableStructs[battler].unnerveActivated) { - gBattlerTarget = GetOppositeBattler(battler); + gEffectBattler = GetOppositeBattler(battler); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_ASONE; gDisableStructs[battler].unnerveActivated = TRUE; gSpecialStatuses[battler].switchInAbilityDone = TRUE; @@ -3596,6 +4098,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_PASTEL_VEIL: if (!gSpecialStatuses[battler].switchInAbilityDone) { + SaveBattlerTarget(gBattlerTarget); gBattlerTarget = battler; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_PASTEL_VEIL; BattleScriptPushCursorAndCallback(BattleScript_PastelVeilActivates); @@ -3606,6 +4109,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_ANTICIPATION: if (!gSpecialStatuses[battler].switchInAbilityDone) { + struct DamageContext ctx = {0}; + uq4_12_t modifier = UQ_4_12(1.0); for (i = 0; i < MAX_BATTLERS_COUNT; i++) { if (IsBattlerAlive(i) && !IsBattlerAlly(i, battler)) @@ -3613,8 +4118,19 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 for (j = 0; j < MAX_MON_MOVES; j++) { move = gBattleMons[i].moves[j]; + enum BattleMoveEffects moveEffect = GetMoveEffect(move); moveType = GetBattleMoveType(move); - if (CalcTypeEffectivenessMultiplier(move, moveType, i, battler, ABILITY_ANTICIPATION, FALSE) >= UQ_4_12(2.0) || GetMoveEffect(move) == EFFECT_OHKO) + + ctx.battlerAtk = i; + ctx.battlerDef = battler; + ctx.move = ctx.chosenMove = move; + ctx.moveType = moveType; + ctx.isAnticipation = TRUE; + modifier = CalcTypeEffectivenessMultiplier(&ctx); + + if (modifier >= UQ_4_12(2.0) + || moveEffect == EFFECT_OHKO + || moveEffect == EFFECT_SHEER_COLD) { effect++; break; @@ -3635,7 +4151,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (!gSpecialStatuses[battler].switchInAbilityDone) { gSpecialStatuses[battler].switchInAbilityDone = TRUE; - gBattleScripting.battler = battler; BattleScriptPushCursorAndCallback(BattleScript_FriskActivates); // Try activate effect++; } @@ -3653,7 +4168,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_DOWNLOAD: if (!gSpecialStatuses[battler].switchInAbilityDone) { - u32 statId, opposingBattler; + enum Stat statId; + u32 opposingBattler; u32 opposingDef = 0, opposingSpDef = 0; opposingBattler = BATTLE_OPPOSITE(battler); @@ -3677,9 +4193,10 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gSpecialStatuses[battler].switchInAbilityDone = TRUE; - if (CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN)) + if (CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility)) { SET_STATCHANGER(statId, 1, FALSE); + SaveBattlerAttacker(gBattlerAttacker); gBattlerAttacker = battler; PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); BattleScriptPushCursorAndCallback(BattleScript_AttackerAbilityStatRaiseEnd3); @@ -3742,7 +4259,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_DRIZZLE: - if (TryChangeBattleWeather(battler, BATTLE_WEATHER_RAIN, TRUE)) + if (TryChangeBattleWeather(battler, BATTLE_WEATHER_RAIN, gLastUsedAbility)) { BattleScriptPushCursorAndCallback(BattleScript_DrizzleActivates); effect++; @@ -3755,7 +4272,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_SAND_STREAM: - if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SANDSTORM, TRUE)) + if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SANDSTORM, gLastUsedAbility)) { BattleScriptPushCursorAndCallback(BattleScript_SandstreamActivates); effect++; @@ -3767,8 +4284,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 effect++; } break; + case ABILITY_ORICHALCUM_PULSE: case ABILITY_DROUGHT: - if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SUN, TRUE)) + if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SUN, gLastUsedAbility)) { BattleScriptPushCursorAndCallback(BattleScript_DroughtActivates); effect++; @@ -3781,12 +4299,12 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_SNOW_WARNING: - if (B_SNOW_WARNING >= GEN_9 && TryChangeBattleWeather(battler, BATTLE_WEATHER_SNOW, TRUE)) + if (GetConfig(CONFIG_SNOW_WARNING) >= GEN_9 && TryChangeBattleWeather(battler, BATTLE_WEATHER_SNOW, gLastUsedAbility)) { BattleScriptPushCursorAndCallback(BattleScript_SnowWarningActivatesSnow); effect++; } - else if (B_SNOW_WARNING < GEN_9 && TryChangeBattleWeather(battler, BATTLE_WEATHER_HAIL, TRUE)) + else if (GetConfig(CONFIG_SNOW_WARNING) < GEN_9 && TryChangeBattleWeather(battler, BATTLE_WEATHER_HAIL, gLastUsedAbility)) { BattleScriptPushCursorAndCallback(BattleScript_SnowWarningActivatesHail); effect++; @@ -3800,36 +4318,37 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_ELECTRIC_SURGE: case ABILITY_HADRON_ENGINE: - if (TryChangeBattleTerrain(battler, STATUS_FIELD_ELECTRIC_TERRAIN, &gFieldTimers.terrainTimer)) + if (TryChangeBattleTerrain(battler, STATUS_FIELD_ELECTRIC_TERRAIN)) { BattleScriptPushCursorAndCallback(BattleScript_ElectricSurgeActivates); effect++; } break; case ABILITY_GRASSY_SURGE: - if (TryChangeBattleTerrain(battler, STATUS_FIELD_GRASSY_TERRAIN, &gFieldTimers.terrainTimer)) + if (TryChangeBattleTerrain(battler, STATUS_FIELD_GRASSY_TERRAIN)) { BattleScriptPushCursorAndCallback(BattleScript_GrassySurgeActivates); effect++; } break; case ABILITY_MISTY_SURGE: - if (TryChangeBattleTerrain(battler, STATUS_FIELD_MISTY_TERRAIN, &gFieldTimers.terrainTimer)) + if (TryChangeBattleTerrain(battler, STATUS_FIELD_MISTY_TERRAIN)) { BattleScriptPushCursorAndCallback(BattleScript_MistySurgeActivates); effect++; } break; case ABILITY_PSYCHIC_SURGE: - if (TryChangeBattleTerrain(battler, STATUS_FIELD_PSYCHIC_TERRAIN, &gFieldTimers.terrainTimer)) + if (TryChangeBattleTerrain(battler, STATUS_FIELD_PSYCHIC_TERRAIN)) { BattleScriptPushCursorAndCallback(BattleScript_PsychicSurgeActivates); effect++; } break; case ABILITY_INTIMIDATE: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (!gSpecialStatuses[battler].switchInAbilityDone && !IsOpposingSideEmpty(battler)) { + SaveBattlerAttacker(gBattlerAttacker); gBattlerAttacker = battler; gSpecialStatuses[battler].switchInAbilityDone = TRUE; SET_STATCHANGER(STAT_ATK, 1, TRUE); @@ -3839,11 +4358,13 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_SUPERSWEET_SYRUP: if (!gSpecialStatuses[battler].switchInAbilityDone - && !gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].supersweetSyrup) + && !GetBattlerPartyState(battler)->supersweetSyrup + && !IsOpposingSideEmpty(battler)) { + SaveBattlerAttacker(gBattlerAttacker); gBattlerAttacker = battler; gSpecialStatuses[battler].switchInAbilityDone = TRUE; - gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].supersweetSyrup = TRUE; + GetBattlerPartyState(battler)->supersweetSyrup = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SupersweetSyrupActivates); effect++; } @@ -3865,6 +4386,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 BattleScriptPushCursorAndCallback(BattleScript_ActivateTeraformZero); effect++; } + break; case ABILITY_SCHOOLING: if (gBattleMons[battler].level < 20) break; @@ -3873,46 +4395,45 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_SHIELDS_DOWN: if (TryBattleFormChange(battler, FORM_CHANGE_BATTLE_HP_PERCENT)) { - gBattlerAttacker = battler; - BattleScriptPushCursorAndCallback(BattleScript_AttackerFormChangeEnd3); + BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeEnd3); effect++; } break; case ABILITY_INTREPID_SWORD: - if (!gSpecialStatuses[battler].switchInAbilityDone && CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN) - && !gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].intrepidSwordBoost) + if (!gSpecialStatuses[battler].switchInAbilityDone + && !GetBattlerPartyState(battler)->intrepidSwordBoost) { - gBattleScripting.savedBattler = gBattlerAttacker; - gBattlerAttacker = battler; - if (B_INTREPID_SWORD == GEN_9) - gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].intrepidSwordBoost = TRUE; + if (GetConfig(CONFIG_INTREPID_SWORD) == GEN_9) + GetBattlerPartyState(battler)->intrepidSwordBoost = TRUE; gSpecialStatuses[battler].switchInAbilityDone = TRUE; - SET_STATCHANGER(STAT_ATK, 1, FALSE); - BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); - effect++; + if (CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility)) + { + SET_STATCHANGER(STAT_ATK, 1, FALSE); + BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); + effect++; + } } break; case ABILITY_DAUNTLESS_SHIELD: - if (!gSpecialStatuses[battler].switchInAbilityDone && CompareStat(battler, STAT_DEF, MAX_STAT_STAGE, CMP_LESS_THAN) - && !gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].dauntlessShieldBoost) + if (!gSpecialStatuses[battler].switchInAbilityDone + && !GetBattlerPartyState(battler)->dauntlessShieldBoost) { - gBattleScripting.savedBattler = gBattlerAttacker; - gBattlerAttacker = battler; - if (B_DAUNTLESS_SHIELD == GEN_9) - gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].dauntlessShieldBoost = TRUE; + if (GetConfig(CONFIG_DAUNTLESS_SHIELD) == GEN_9) + GetBattlerPartyState(battler)->dauntlessShieldBoost = TRUE; gSpecialStatuses[battler].switchInAbilityDone = TRUE; - SET_STATCHANGER(STAT_DEF, 1, FALSE); - BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); - effect++; + if (CompareStat(battler, STAT_DEF, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility)) + { + SET_STATCHANGER(STAT_DEF, 1, FALSE); + BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); + effect++; + } } break; case ABILITY_WIND_RIDER: if (!gSpecialStatuses[battler].switchInAbilityDone - && CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN) + && CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility) && gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_TAILWIND) { - gBattleScripting.savedBattler = gBattlerAttacker; - gBattlerAttacker = battler; gSpecialStatuses[battler].switchInAbilityDone = TRUE; SET_STATCHANGER(STAT_ATK, 1, FALSE); BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); @@ -3920,21 +4441,21 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_DESOLATE_LAND: - if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SUN_PRIMAL, TRUE)) + if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SUN_PRIMAL, gLastUsedAbility)) { BattleScriptPushCursorAndCallback(BattleScript_DesolateLandActivates); effect++; } break; case ABILITY_PRIMORDIAL_SEA: - if (TryChangeBattleWeather(battler, BATTLE_WEATHER_RAIN_PRIMAL, TRUE)) + if (TryChangeBattleWeather(battler, BATTLE_WEATHER_RAIN_PRIMAL, gLastUsedAbility)) { BattleScriptPushCursorAndCallback(BattleScript_PrimordialSeaActivates); effect++; } break; case ABILITY_DELTA_STREAM: - if (TryChangeBattleWeather(battler, BATTLE_WEATHER_STRONG_WINDS, TRUE)) + if (TryChangeBattleWeather(battler, BATTLE_WEATHER_STRONG_WINDS, gLastUsedAbility)) { BattleScriptPushCursorAndCallback(BattleScript_DeltaStreamActivates); effect++; @@ -3943,6 +4464,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_VESSEL_OF_RUIN: if (!gSpecialStatuses[battler].switchInAbilityDone) { + gBattleMons[battler].volatiles.vesselOfRuin = TRUE; PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK); gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_RuinAbilityActivates); @@ -3952,6 +4474,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_SWORD_OF_RUIN: if (!gSpecialStatuses[battler].switchInAbilityDone) { + gBattleMons[battler].volatiles.swordOfRuin = TRUE; PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_DEF); gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_RuinAbilityActivates); @@ -3961,6 +4484,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_TABLETS_OF_RUIN: if (!gSpecialStatuses[battler].switchInAbilityDone) { + gBattleMons[battler].volatiles.tabletsOfRuin = TRUE; PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_RuinAbilityActivates); @@ -3970,19 +4494,13 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_BEADS_OF_RUIN: if (!gSpecialStatuses[battler].switchInAbilityDone) { + gBattleMons[battler].volatiles.beadsOfRuin = TRUE; PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPDEF); gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_RuinAbilityActivates); effect++; } break; - case ABILITY_ORICHALCUM_PULSE: - if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SUN, TRUE)) - { - BattleScriptPushCursorAndCallback(BattleScript_DroughtActivates); - effect++; - } - break; case ABILITY_SUPREME_OVERLORD: if (!gSpecialStatuses[battler].switchInAbilityDone) { @@ -3996,30 +4514,31 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_COSTAR: + partner = BATTLE_PARTNER(battler); if (!gSpecialStatuses[battler].switchInAbilityDone && IsDoubleBattle() - && IsBattlerAlive(BATTLE_PARTNER(battler)) - && CountBattlerStatIncreases(BATTLE_PARTNER(battler), FALSE)) + && IsBattlerAlive(partner) + && BattlerHasCopyableChanges(partner)) { gSpecialStatuses[battler].switchInAbilityDone = TRUE; - gBattlerAttacker = gBattlerAbility = battler; for (i = 0; i < NUM_BATTLE_STATS; i++) - gBattleMons[battler].statStages[i] = gBattleMons[BATTLE_PARTNER(battler)].statStages[i]; - gBattleScripting.battler = BATTLE_PARTNER(battler); + gBattleMons[battler].statStages[i] = gBattleMons[partner].statStages[i]; + // Copy crit boosts (Focus Energy, Dragon Cheer, G-Max Chi Strike) + gBattleMons[battler].volatiles.focusEnergy = gBattleMons[partner].volatiles.focusEnergy; + gBattleMons[battler].volatiles.dragonCheer = gBattleMons[partner].volatiles.dragonCheer; + gBattleMons[battler].volatiles.bonusCritStages = gBattleMons[partner].volatiles.bonusCritStages; + gEffectBattler = partner; BattleScriptPushCursorAndCallback(BattleScript_CostarActivates); effect++; } break; case ABILITY_ZERO_TO_HERO: - side = GetBattlerSide(battler); - mon = GetBattlerMon(battler); - if (!gSpecialStatuses[battler].switchInAbilityDone - && GetMonData(mon, MON_DATA_SPECIES) == SPECIES_PALAFIN_HERO - && !gBattleStruct->partyState[side][gBattlerPartyIndexes[battler]].transformZeroToHero) + && GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES) == SPECIES_PALAFIN_HERO + && !GetBattlerPartyState(battler)->transformZeroToHero) { gSpecialStatuses[battler].switchInAbilityDone = TRUE; - gBattleStruct->partyState[side][gBattlerPartyIndexes[battler]].transformZeroToHero = TRUE; + GetBattlerPartyState(battler)->transformZeroToHero = TRUE; BattleScriptPushCursorAndCallback(BattleScript_ZeroToHeroActivates); effect++; } @@ -4029,14 +4548,13 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (!gSpecialStatuses[battler].switchInAbilityDone && IsDoubleBattle() - && !(gStatuses3[partner] & STATUS3_HEAL_BLOCK) + && !gBattleMons[partner].volatiles.healBlock && gBattleMons[partner].hp < gBattleMons[partner].maxHP && IsBattlerAlive(partner)) { - gBattlerTarget = partner; - gBattlerAttacker = battler; + gEffectBattler = partner; gSpecialStatuses[battler].switchInAbilityDone = TRUE; - gBattleStruct->moveDamage[partner] = (GetNonDynamaxMaxHP(partner) / 4) * -1; + SetHealAmount(partner, GetNonDynamaxMaxHP(partner) / 4); BattleScriptPushCursorAndCallback(BattleScript_HospitalityActivates); effect++; } @@ -4047,7 +4565,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_EMBODY_ASPECT_CORNERSTONE_MASK: if (!gSpecialStatuses[battler].switchInAbilityDone) { - u32 stat; + enum Stat stat; if (gLastUsedAbility == ABILITY_EMBODY_ASPECT_HEARTHFLAME_MASK) stat = STAT_ATK; @@ -4058,11 +4576,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 else //ABILITY_EMBODY_ASPECT_TEAL_MASK stat = STAT_SPEED; - if (CompareStat(battler, stat, MAX_STAT_STAGE, CMP_EQUAL)) + if (CompareStat(battler, stat, MAX_STAT_STAGE, CMP_EQUAL, gLastUsedAbility)) break; - gBattleScripting.savedBattler = gBattlerAttacker; - gBattlerAttacker = battler; gSpecialStatuses[battler].switchInAbilityDone = TRUE; SET_STATCHANGER(stat, 1, FALSE); BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); @@ -4074,20 +4590,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && gBattleMons[battler].species == SPECIES_TERAPAGOS_NORMAL && TryBattleFormChange(battler, FORM_CHANGE_BATTLE_SWITCH)) { - gBattlerAttacker = battler; gBattleScripting.abilityPopupOverwrite = gLastUsedAbility = ABILITY_TERA_SHIFT; gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_AttackerFormChangeWithStringEnd3); - effect++; - } - break; - case ABILITY_ICE_FACE: - if (IsBattlerWeatherAffected(battler, B_WEATHER_HAIL | B_WEATHER_SNOW) - && gBattleMons[battler].species == SPECIES_EISCUE_NOICE - && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) - { - // TODO: Convert this to a proper FORM_CHANGE type. - gBattleMons[battler].species = SPECIES_EISCUE_ICE; BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeWithStringEnd3); effect++; } @@ -4097,7 +4601,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (!gSpecialStatuses[battler].switchInAbilityDone && IsBattlerAlive(partner) && IsBattlerAlive(battler) - && gBattleStruct->commanderActive[partner] == SPECIES_NONE + && gBattleStruct->battlerState[partner].commanderSpecies == SPECIES_NONE && gBattleMons[partner].species == SPECIES_DONDOZO && GET_BASE_SPECIES_ID(GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES)) == SPECIES_TATSUGIRI) { @@ -4105,17 +4609,18 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gSpecialStatuses[battler].switchInAbilityDone = TRUE; gBattlerAttacker = partner; gBattleStruct->battlerState[battler].commandingDondozo = TRUE; - gBattleStruct->commanderActive[partner] = gBattleMons[battler].species; - gStatuses3[battler] |= STATUS3_COMMANDER; - if (gBattleMons[battler].status2 & STATUS2_CONFUSION - && !(gStatuses4[battler] & STATUS4_INFINITE_CONFUSION)) - gBattleMons[battler].status2 -= STATUS2_CONFUSION_TURN(1); + gBattleStruct->battlerState[partner].commanderSpecies = gBattleMons[battler].species; + gBattleMons[battler].volatiles.semiInvulnerable = STATE_COMMANDER; + if (gBattleMons[battler].volatiles.confusionTurns > 0 && !gBattleMons[battler].volatiles.infiniteConfusion) + gBattleMons[battler].volatiles.confusionTurns--; BtlController_EmitSpriteInvisibility(battler, B_COMM_TO_CONTROLLER, TRUE); MarkBattlerForControllerExec(battler); BattleScriptPushCursorAndCallback(BattleScript_CommanderActivates); effect++; } break; + default: + break; } break; case ABILITYEFFECT_ENDTURN: @@ -4130,8 +4635,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && PickupHasValidTarget(battler)) { gBattlerTarget = RandomUniformExcept(RNG_PICKUP, 0, gBattlersCount - 1, CantPickupItem); - gLastUsedItem = GetUsedHeldItem(gBattlerTarget); - BattleScriptPushCursorAndCallback(BattleScript_PickupActivates); + gLastUsedItem = GetBattlerPartyState(gBattlerTarget)->usedHeldItem; + BattleScriptExecute(BattleScript_PickupActivates); effect++; } break; @@ -4139,24 +4644,22 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if ((IsBattlerWeatherAffected(battler, B_WEATHER_SUN) || RandomPercentage(RNG_HARVEST, 50)) && gBattleMons[battler].item == ITEM_NONE && gBattleStruct->changedItems[battler] == ITEM_NONE // Will not inherit an item - && GetItemPocket(GetUsedHeldItem(battler)) == POCKET_BERRIES) + && GetItemPocket(GetBattlerPartyState(battler)->usedHeldItem) == POCKET_BERRIES) { - gLastUsedItem = GetUsedHeldItem(battler); - BattleScriptPushCursorAndCallback(BattleScript_HarvestActivates); + gLastUsedItem = GetBattlerPartyState(battler)->usedHeldItem; + BattleScriptExecute(BattleScript_HarvestActivates); effect++; } break; case ABILITY_ICE_BODY: if (IsBattlerWeatherAffected(battler, B_WEATHER_HAIL | B_WEATHER_SNOW) && !IsBattlerAtMaxHp(battler) - && !(gStatuses3[battler] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) + && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERGROUND + && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERWATER + && !gBattleMons[battler].volatiles.healBlock) { - BattleScriptPushCursorAndCallback(BattleScript_IceBodyHeal); - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; + BattleScriptExecute(BattleScript_IceBodyHeal); + SetHealAmount(battler, GetNonDynamaxMaxHP(battler) / 16); effect++; } break; @@ -4167,13 +4670,11 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_RAIN_DISH: if (IsBattlerWeatherAffected(battler, B_WEATHER_RAIN) && !IsBattlerAtMaxHp(battler) - && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) + && !gBattleMons[battler].volatiles.healBlock) { - BattleScriptPushCursorAndCallback(BattleScript_RainDishActivates); - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (gLastUsedAbility == ABILITY_RAIN_DISH ? 16 : 8); - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; + s32 healAmount = gLastUsedAbility == ABILITY_RAIN_DISH ? 16 : 8; + SetHealAmount(battler, GetNonDynamaxMaxHP(battler) / healAmount); + BattleScriptExecute(BattleScript_RainDishActivates); effect++; } break; @@ -4205,19 +4706,20 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); gBattleMons[battler].status1 = 0; - gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; + gBattleMons[battler].volatiles.nightmare = FALSE; gBattleScripting.battler = battler; - BattleScriptPushCursorAndCallback(BattleScript_ShedSkinActivates); + BattleScriptExecute(BattleScript_ShedSkinActivates); BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); MarkBattlerForControllerExec(battler); effect++; } break; case ABILITY_SPEED_BOOST: - if (CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN) && gDisableStructs[battler].isFirstTurn != 2) + if (CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility) && gDisableStructs[battler].isFirstTurn != 2) { + SaveBattlerAttacker(gBattlerAttacker); SET_STATCHANGER(STAT_SPEED, 1, FALSE); - BattleScriptPushCursorAndCallback(BattleScript_SpeedBoostActivates); + BattleScriptExecute(BattleScript_AttackerAbilityStatRaiseEnd2); gBattleScripting.battler = battler; effect++; } @@ -4226,13 +4728,13 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (gDisableStructs[battler].isFirstTurn != 2) { u32 validToRaise = 0, validToLower = 0; - u32 statsNum = GetGenConfig(GEN_CONFIG_MOODY_STATS) >= GEN_8 ? NUM_STATS : NUM_BATTLE_STATS; + u32 statsNum = GetConfig(CONFIG_MOODY_ACC_EVASION) >= GEN_8 ? NUM_STATS : NUM_BATTLE_STATS; for (i = STAT_ATK; i < statsNum; i++) { - if (CompareStat(battler, i, MIN_STAT_STAGE, CMP_GREATER_THAN)) + if (CompareStat(battler, i, MIN_STAT_STAGE, CMP_GREATER_THAN, gLastUsedAbility)) validToLower |= 1u << i; - if (CompareStat(battler, i, MAX_STAT_STAGE, CMP_LESS_THAN)) + if (CompareStat(battler, i, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility)) validToRaise |= 1u << i; } @@ -4249,7 +4751,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 i = RandomUniformExcept(RNG_MOODY_DECREASE, STAT_ATK, statsNum - 1, MoodyCantLowerStat); SET_STATCHANGER2(gBattleScripting.savedStatChanger, i, 1, TRUE); } - BattleScriptPushCursorAndCallback(BattleScript_MoodyActivates); + BattleScriptExecute(BattleScript_MoodyActivates); effect++; } break; @@ -4257,24 +4759,22 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gDisableStructs[gBattlerAttacker].truantCounter ^= 1; break; case ABILITY_SLOW_START: - if (gDisableStructs[battler].slowStartTimer == gBattleTurnCounter) + if (gDisableStructs[battler].slowStartTimer > 0 && --gDisableStructs[battler].slowStartTimer == 0) { BattleScriptExecute(BattleScript_SlowStartEnds); effect++; } break; case ABILITY_BAD_DREAMS: - BattleScriptPushCursorAndCallback(BattleScript_BadDreamsActivates); + BattleScriptExecute(BattleScript_BadDreamsActivates); effect++; break; case ABILITY_SOLAR_POWER: if (IsBattlerWeatherAffected(battler, B_WEATHER_SUN)) { SOLAR_POWER_HP_DROP: - BattleScriptPushCursorAndCallback(BattleScript_SolarPowerActivates); - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 8); + BattleScriptExecute(BattleScript_SolarPowerActivates); effect++; } break; @@ -4284,7 +4784,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && gBattleMons[gBattleScripting.battler].status1 & STATUS1_ANY && RandomPercentage(RNG_HEALER, 30)) { - BattleScriptPushCursorAndCallback(BattleScript_HealerActivates); + BattleScriptExecute(BattleScript_HealerActivates); effect++; } break; @@ -4296,40 +4796,41 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_SHIELDS_DOWN: if (TryBattleFormChange(battler, FORM_CHANGE_BATTLE_HP_PERCENT)) { - gBattlerAttacker = battler; - BattleScriptPushCursorAndCallback(BattleScript_AttackerFormChangeEnd3); + gBattleScripting.battler = battler; + BattleScriptExecute(BattleScript_BattlerFormChangeEnd2); effect++; } break; case ABILITY_POWER_CONSTRUCT: if (TryBattleFormChange(battler, FORM_CHANGE_BATTLE_HP_PERCENT)) { - gBattlerAttacker = battler; - BattleScriptPushCursorAndCallback(BattleScript_PowerConstruct); + gBattleScripting.battler = battler; + BattleScriptExecute(BattleScript_PowerConstruct); effect++; } break; case ABILITY_BALL_FETCH: if (gBattleMons[battler].item == ITEM_NONE - && gBattleResults.catchAttempts[gLastUsedBall - ITEM_ULTRA_BALL] >= 1 + && gBattleResults.catchAttempts[ItemIdToBallId(gLastUsedBall)] >= 1 && !gHasFetchedBall) { + gLastUsedItem = gLastUsedBall; gBattleScripting.battler = battler; - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedBall); + gBattleMons[battler].item = gLastUsedItem; + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem); MarkBattlerForControllerExec(battler); gHasFetchedBall = TRUE; - gLastUsedItem = gLastUsedBall; - BattleScriptPushCursorAndCallback(BattleScript_BallFetch); + BattleScriptExecute(BattleScript_BallFetch); effect++; } break; case ABILITY_HUNGER_SWITCH: - if (!(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + if (!gBattleMons[battler].volatiles.transformed && GetActiveGimmick(battler) != GIMMICK_TERA && TryBattleFormChange(battler, FORM_CHANGE_BATTLE_TURN_END)) { - gBattlerAttacker = battler; - BattleScriptPushCursorAndCallback(BattleScript_AttackerFormChangeEnd3NoPopup); + gBattleScripting.battler = battler; + BattleScriptExecute(BattleScript_BattlerFormChangeEnd3NoPopup); effect++; } break; @@ -4338,241 +4839,231 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { gBattleScripting.battler = battler; gDisableStructs[battler].cudChew = FALSE; - gLastUsedItem = gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)]; - gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)] = ITEM_NONE; - BattleScriptPushCursorAndCallback(BattleScript_CudChewActivates); + gLastUsedItem = GetBattlerPartyState(battler)->usedHeldItem; + GetBattlerPartyState(battler)->usedHeldItem = ITEM_NONE; + BattleScriptExecute(BattleScript_CudChewActivates); effect++; } - else if (!gDisableStructs[battler].cudChew && GetItemPocket(GetUsedHeldItem(battler)) == POCKET_BERRIES) + else if (!gDisableStructs[battler].cudChew && GetItemPocket(GetBattlerPartyState(battler)->usedHeldItem) == POCKET_BERRIES) { gDisableStructs[battler].cudChew = TRUE; } break; + default: + break; + } + } + break; + case ABILITYEFFECT_COLOR_CHANGE: + switch (gLastUsedAbility) + { + case ABILITY_COLOR_CHANGE: + if (IsBattlerTurnDamaged(battler) + && IsBattlerAlive(battler) + && !IS_BATTLER_OF_TYPE(battler, moveType) + && move != MOVE_STRUGGLE + && moveType != TYPE_STELLAR + && moveType != TYPE_MYSTERY) + { + gEffectBattler = gBattlerAbility = battler; + SET_BATTLER_TYPE(battler, moveType); + PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); + BattleScriptCall(BattleScript_ColorChangeActivates); + effect++; + } + break; + case ABILITY_BERSERK: + if (IsBattlerTurnDamaged(battler) + && IsBattlerAlive(battler) + && HadMoreThanHalfHpNowDoesnt(battler) + && CompareStat(battler, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility)) + { + gEffectBattler = gBattlerAbility = battler; + SET_STATCHANGER(STAT_SPATK, 1, FALSE); + BattleScriptCall(BattleScript_BerserkActivates); + effect++; + } + break; + case ABILITY_ANGER_SHELL: + if (IsBattlerTurnDamaged(battler) + && IsBattlerAlive(battler) + && HadMoreThanHalfHpNowDoesnt(battler)) + { + gEffectBattler = gBattlerAbility = battler; + BattleScriptCall(BattleScript_AngerShellActivates); + effect++; } + break; + default: + break; } break; case ABILITYEFFECT_MOVE_END: // Think contact abilities. switch (gLastUsedAbility) { case ABILITY_JUSTIFIED: - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) - && IsBattlerTurnDamaged(gBattlerTarget) + if (IsBattlerTurnDamaged(battler) && IsBattlerAlive(battler) && moveType == TYPE_DARK - && CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) + && CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility)) { - gEffectBattler = battler; + gEffectBattler = gBattlerAbility = battler; SET_STATCHANGER(STAT_ATK, 1, FALSE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseRet; + BattleScriptCall(BattleScript_TargetAbilityStatRaiseRet); effect++; } break; case ABILITY_RATTLED: - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) - && IsBattlerTurnDamaged(gBattlerTarget) + if (IsBattlerTurnDamaged(battler) && IsBattlerAlive(battler) && (moveType == TYPE_DARK || moveType == TYPE_BUG || moveType == TYPE_GHOST) - && CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN)) + && CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility)) { - gEffectBattler = battler; + gEffectBattler = gBattlerAbility = battler; SET_STATCHANGER(STAT_SPEED, 1, FALSE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseRet; + BattleScriptCall(BattleScript_TargetAbilityStatRaiseRet); effect++; } break; case ABILITY_WATER_COMPACTION: - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) - && IsBattlerTurnDamaged(gBattlerTarget) + if (IsBattlerTurnDamaged(battler) && IsBattlerAlive(battler) && moveType == TYPE_WATER - && CompareStat(battler, STAT_DEF, MAX_STAT_STAGE, CMP_LESS_THAN)) + && CompareStat(battler, STAT_DEF, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility)) { - gEffectBattler = battler; + gEffectBattler = gBattlerAbility = battler; SET_STATCHANGER(STAT_DEF, 2, FALSE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseRet; + BattleScriptCall(BattleScript_TargetAbilityStatRaiseRet); effect++; } break; case ABILITY_STAMINA: - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) - && gBattlerAttacker != gBattlerTarget + if (gBattlerAttacker != gBattlerTarget && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) - && CompareStat(battler, STAT_DEF, MAX_STAT_STAGE, CMP_LESS_THAN)) + && CompareStat(battler, STAT_DEF, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility)) { - gEffectBattler = battler; + gEffectBattler = gBattlerAbility = battler; SET_STATCHANGER(STAT_DEF, 1, FALSE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseRet; - effect++; - } - break; - case ABILITY_BERSERK: - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) - && IsBattlerTurnDamaged(gBattlerTarget) - && IsBattlerAlive(battler) - && HadMoreThanHalfHpNowDoesnt(battler) - && (gMultiHitCounter == 0 || gMultiHitCounter == 1) - && !(TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove)) - && CompareStat(battler, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN)) - { - gEffectBattler = battler; - SET_STATCHANGER(STAT_SPATK, 1, FALSE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseRet; + BattleScriptCall(BattleScript_TargetAbilityStatRaiseRet); effect++; } break; case ABILITY_WEAK_ARMOR: - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) - && IsBattlerTurnDamaged(gBattlerTarget) + if (IsBattlerTurnDamaged(battler) && IsBattlerAlive(battler) && IsBattleMovePhysical(gCurrentMove) - && (CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN) // Don't activate if both Speed and Defense cannot be raised. - || CompareStat(battler, STAT_DEF, MIN_STAT_STAGE, CMP_GREATER_THAN))) + && (CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility) // Don't activate if both Speed and Defense cannot be raised. + || CompareStat(battler, STAT_DEF, MIN_STAT_STAGE, CMP_GREATER_THAN, gLastUsedAbility))) { if (GetMoveEffect(gCurrentMove) == EFFECT_HIT_ESCAPE && CanBattlerSwitch(gBattlerAttacker)) gProtectStructs[battler].disableEjectPack = TRUE; // Set flag for target - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_WeakArmorActivates; + BattleScriptCall(BattleScript_WeakArmorActivates); effect++; } break; case ABILITY_CURSED_BODY: - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) - && IsBattlerTurnDamaged(gBattlerTarget) + if (IsBattlerTurnDamaged(gBattlerTarget) && gDisableStructs[gBattlerAttacker].disabledMove == MOVE_NONE && IsBattlerAlive(gBattlerAttacker) && !IsAbilityOnSide(gBattlerAttacker, ABILITY_AROMA_VEIL) - && gBattleMons[gBattlerAttacker].pp[gChosenMovePos] != 0 - && !(GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX) // TODO: Max Moves don't make contact, useless? + && gChosenMove != MOVE_STRUGGLE && RandomPercentage(RNG_CURSED_BODY, 30)) { gDisableStructs[gBattlerAttacker].disabledMove = gChosenMove; gDisableStructs[gBattlerAttacker].disableTimer = 4; PREPARE_MOVE_BUFFER(gBattleTextBuff1, gChosenMove); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_CursedBodyActivates; + BattleScriptCall(BattleScript_CursedBodyActivates); effect++; } break; case ABILITY_LINGERING_AROMA: case ABILITY_MUMMY: - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerAttacker) + if (IsBattlerAlive(gBattlerAttacker) && IsBattlerTurnDamaged(gBattlerTarget) - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS - && IsMoveMakingContact(move, gBattlerAttacker) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) && gDisableStructs[gBattlerAttacker].overwrittenAbility != GetBattlerAbility(gBattlerTarget) && gBattleMons[gBattlerAttacker].ability != ABILITY_MUMMY && gBattleMons[gBattlerAttacker].ability != ABILITY_LINGERING_AROMA && !gAbilitiesInfo[gBattleMons[gBattlerAttacker].ability].cantBeSuppressed) { - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + if (GetBattlerHoldEffectIgnoreAbility(gBattlerAttacker) == HOLD_EFFECT_ABILITY_SHIELD) { RecordItemEffectBattle(gBattlerAttacker, HOLD_EFFECT_ABILITY_SHIELD); break; } + RemoveAbilityFlags(gBattlerAttacker); gLastUsedAbility = gBattleMons[gBattlerAttacker].ability; gBattleMons[gBattlerAttacker].ability = gDisableStructs[gBattlerAttacker].overwrittenAbility = gBattleMons[gBattlerTarget].ability; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MummyActivates; + BattleScriptCall(BattleScript_MummyActivates); effect++; break; } break; case ABILITY_WANDERING_SPIRIT: - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerAttacker) + if (IsBattlerAlive(gBattlerAttacker) && IsBattlerTurnDamaged(gBattlerTarget) - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS - && IsMoveMakingContact(move, gBattlerAttacker) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) && !(GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) && !gAbilitiesInfo[gBattleMons[gBattlerAttacker].ability].cantBeSwapped) { - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + if (GetBattlerHoldEffectIgnoreAbility(gBattlerAttacker) == HOLD_EFFECT_ABILITY_SHIELD) { RecordItemEffectBattle(gBattlerAttacker, HOLD_EFFECT_ABILITY_SHIELD); break; } + if (GetBattlerHoldEffectIgnoreAbility(gBattlerTarget) == HOLD_EFFECT_ABILITY_SHIELD) + { + RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_ABILITY_SHIELD); + break; + } + RemoveAbilityFlags(gBattlerAttacker); gLastUsedAbility = gBattleMons[gBattlerAttacker].ability; gBattleMons[gBattlerAttacker].ability = gDisableStructs[gBattlerAttacker].overwrittenAbility = gBattleMons[gBattlerTarget].ability; gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = gLastUsedAbility; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_WanderingSpiritActivates; + BattleScriptCall(BattleScript_WanderingSpiritActivates); effect++; break; } break; case ABILITY_ANGER_POINT: - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) - && gSpecialStatuses[battler].criticalHit - && IsBattlerTurnDamaged(gBattlerTarget) + if (gSpecialStatuses[battler].criticalHit + && IsBattlerTurnDamaged(battler) && IsBattlerAlive(battler) - && CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) + && CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility)) { SET_STATCHANGER(STAT_ATK, MAX_STAT_STAGE - gBattleMons[battler].statStages[STAT_ATK], FALSE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetsStatWasMaxedOut; - effect++; - } - break; - case ABILITY_COLOR_CHANGE: - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) - && move != MOVE_STRUGGLE - && !IsBattleMoveStatus(move) - && IsBattlerTurnDamaged(gBattlerTarget) - && !IS_BATTLER_OF_TYPE(battler, moveType) - && moveType != TYPE_STELLAR - && moveType != TYPE_MYSTERY - && IsBattlerAlive(battler)) - { - SET_BATTLER_TYPE(battler, moveType); - PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ColorChangeActivates; + BattleScriptCall(BattleScript_TargetsStatWasMaxedOut); effect++; } break; case ABILITY_GOOEY: case ABILITY_TANGLING_HAIR: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerAttacker) - && (CompareStat(gBattlerAttacker, STAT_SPEED, MIN_STAT_STAGE, CMP_GREATER_THAN) || GetBattlerAbility(gBattlerAttacker) == ABILITY_MIRROR_ARMOR) + if (IsBattlerAlive(gBattlerAttacker) + && (CompareStat(gBattlerAttacker, STAT_SPEED, MIN_STAT_STAGE, CMP_GREATER_THAN, gLastUsedAbility) || GetBattlerAbility(gBattlerAttacker) == ABILITY_MIRROR_ARMOR) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS - && IsMoveMakingContact(move, gBattlerAttacker)) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move)) { SET_STATCHANGER(STAT_SPEED, 1, TRUE); PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_GooeyActivates; - gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; + BattleScriptCall(BattleScript_GooeyActivates); effect++; } break; case ABILITY_ROUGH_SKIN: case ABILITY_IRON_BARBS: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerAttacker) + if (IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS - && IsMoveMakingContact(move, gBattlerAttacker)) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move)) { - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / (B_ROUGH_SKIN_DMG >= GEN_4 ? 8 : 16); - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; + SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / (B_ROUGH_SKIN_DMG >= GEN_4 ? 8 : 16)); PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_RoughSkinActivates; + BattleScriptCall(BattleScript_RoughSkinActivates); effect++; } break; @@ -4580,23 +5071,18 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !IsBattlerAlive(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker) - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS - && IsMoveMakingContact(move, gBattlerAttacker)) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move)) { if ((battler = IsAbilityOnField(ABILITY_DAMP))) { gBattleScripting.battler = battler - 1; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_DampPreventsAftermath; + BattleScriptCall(BattleScript_DampPreventsAftermath); } else { gBattleScripting.battler = gBattlerTarget; - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AftermathDmg; + SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 4); + BattleScriptCall(BattleScript_AftermathDmg); } effect++; } @@ -4611,18 +5097,16 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; gBattleScripting.battler = gBattlerTarget; - gBattleStruct->moveDamage[gBattlerAttacker] = gBattleStruct->moveDamage[gBattlerTarget]; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AftermathDmg; + SetPassiveDamageAmount(gBattlerAttacker, gBattleStruct->moveDamage[gBattlerTarget]); + BattleScriptCall(BattleScript_AftermathDmg); effect++; } break; case ABILITY_EFFECT_SPORE: { - u32 ability = GetBattlerAbility(gBattlerAttacker); - if ((!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GRASS) || B_POWDER_GRASS < GEN_6) - && ability != ABILITY_OVERCOAT - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES) + enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); + enum HoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker); + if (IsAffectedByPowderMove(gBattlerAttacker, abilityAtk, holdEffectAtk)) { u32 poison, paralysis, sleep; @@ -4645,21 +5129,19 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 goto STATIC; // Sleep if (i < sleep - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) - && CanBeSlept(gBattlerAttacker, gBattlerTarget, ability, NOT_BLOCKED_BY_SLEEP_CLAUSE) - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS - && IsMoveMakingContact(move, gBattlerAttacker)) + && CanBeSlept(gBattlerTarget, gBattlerAttacker, abilityAtk, NOT_BLOCKED_BY_SLEEP_CLAUSE) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, abilityAtk, holdEffectAtk, move)) { if (IsSleepClauseEnabled()) gBattleStruct->battlerState[gBattlerAttacker].sleepClauseEffectExempt = TRUE; - gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_SLEEP; + gEffectBattler = gBattlerAttacker; + gBattleScripting.battler = gBattlerTarget; + gBattleScripting.moveEffect = MOVE_EFFECT_SLEEP; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; - gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; + BattleScriptCall(BattleScript_AbilityStatusEffect); effect++; } } @@ -4669,79 +5151,76 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_POISON_POINT, 30) : RandomChance(RNG_POISON_POINT, 1, 3)) { POISON_POINT: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerAttacker) + { + enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); + if (IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) - && CanBePoisoned(gBattlerTarget, gBattlerAttacker, gLastUsedAbility, GetBattlerAbility(gBattlerAttacker)) - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS - && IsMoveMakingContact(move, gBattlerAttacker)) + && CanBePoisoned(gBattlerTarget, gBattlerAttacker, gLastUsedAbility, abilityAtk) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, abilityAtk, GetBattlerHoldEffect(gBattlerAttacker), move)) { - gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_POISON; + gEffectBattler = gBattlerAttacker; + gBattleScripting.battler = gBattlerTarget; + gBattleScripting.moveEffect = MOVE_EFFECT_POISON; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; - gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; + BattleScriptCall(BattleScript_AbilityStatusEffect); effect++; } } + } break; case ABILITY_STATIC: if (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_STATIC, 30) : RandomChance(RNG_STATIC, 1, 3)) { STATIC: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerAttacker) + { + enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); + if (IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) - && CanBeParalyzed(gBattlerTarget, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker)) - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS - && IsMoveMakingContact(move, gBattlerAttacker)) + && CanBeParalyzed(gBattlerTarget, gBattlerAttacker, abilityAtk) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, abilityAtk, GetBattlerHoldEffect(gBattlerAttacker), move)) { - gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_PARALYSIS; + gEffectBattler = gBattlerAttacker; + gBattleScripting.battler = gBattlerTarget; + gBattleScripting.moveEffect = MOVE_EFFECT_PARALYSIS; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; - gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; + BattleScriptCall(BattleScript_AbilityStatusEffect); effect++; } } + } break; case ABILITY_FLAME_BODY: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerAttacker) + if (IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS - && (IsMoveMakingContact(move, gBattlerAttacker)) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) && IsBattlerTurnDamaged(gBattlerTarget) && CanBeBurned(gBattlerTarget, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker)) && (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_FLAME_BODY, 30) : RandomChance(RNG_FLAME_BODY, 1, 3))) { - gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_BURN; + gEffectBattler = gBattlerAttacker; + gBattleScripting.battler = gBattlerTarget; + gBattleScripting.moveEffect = MOVE_EFFECT_BURN; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; - gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; + BattleScriptCall(BattleScript_AbilityStatusEffect); effect++; } break; case ABILITY_CUTE_CHARM: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerAttacker) + if (IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) && (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_CUTE_CHARM, 30) : RandomChance(RNG_CUTE_CHARM, 1, 3)) - && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) + && !(gBattleMons[gBattlerAttacker].volatiles.infatuation) && AreBattlersOfOppositeGender(gBattlerAttacker, gBattlerTarget) - && GetBattlerAbility(gBattlerAttacker) != ABILITY_OBLIVIOUS - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS - && IsMoveMakingContact(move, gBattlerAttacker) + && !IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_OBLIVIOUS) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) && !IsAbilityOnSide(gBattlerAttacker, ABILITY_AROMA_VEIL)) { - gBattleMons[gBattlerAttacker].status2 |= STATUS2_INFATUATED_WITH(gBattlerTarget); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_CuteCharmActivates; + gBattleMons[gBattlerAttacker].volatiles.infatuation = INFATUATED_WITH(gBattlerTarget); + BattleScriptCall(BattleScript_CuteCharmActivates); effect++; } break; @@ -4749,147 +5228,111 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (gBattleStruct->illusion[gBattlerTarget].state == ILLUSION_ON && IsBattlerTurnDamaged(gBattlerTarget)) { gBattleScripting.battler = gBattlerTarget; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_IllusionOff; + BattleScriptCall(BattleScript_IllusionOff); effect++; } break; case ABILITY_COTTON_DOWN: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerAttacker) + if (IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget)) { gEffectBattler = gBattlerTarget; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_CottonDownActivates; + BattleScriptCall(BattleScript_CottonDownActivates); effect++; } break; case ABILITY_STEAM_ENGINE: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerTurnDamaged(gBattlerTarget) + if (IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) - && CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN) + && CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility) && (moveType == TYPE_FIRE || moveType == TYPE_WATER)) { - gEffectBattler = battler; + gEffectBattler = gBattlerAbility = battler; SET_STATCHANGER(STAT_SPEED, 6, FALSE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseRet; + BattleScriptCall(BattleScript_TargetAbilityStatRaiseRet); effect++; } break; case ABILITY_SAND_SPIT: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + if (!gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && !(gBattleWeather & B_WEATHER_SANDSTORM && HasWeatherEffect())) { if (gBattleWeather & B_WEATHER_PRIMAL_ANY && HasWeatherEffect()) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BlockedByPrimalWeatherRet; + BattleScriptCall(BattleScript_BlockedByPrimalWeatherRet); effect++; } - else if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SANDSTORM, TRUE)) + else if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SANDSTORM, gLastUsedAbility)) { gBattleScripting.battler = battler; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SandSpitActivates; + BattleScriptCall(BattleScript_SandSpitActivates); effect++; } } break; case ABILITY_PERISH_BODY: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + if (!gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS - && (IsMoveMakingContact(move, gBattlerAttacker)) - && !(gStatuses3[gBattlerAttacker] & STATUS3_PERISH_SONG)) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) + && !gBattleMons[gBattlerAttacker].volatiles.perishSong) { - if (!(gStatuses3[battler] & STATUS3_PERISH_SONG)) + if (!gBattleMons[battler].volatiles.perishSong) { - gStatuses3[battler] |= STATUS3_PERISH_SONG; + gBattleMons[battler].volatiles.perishSong = TRUE; gDisableStructs[battler].perishSongTimer = 3; } - gStatuses3[gBattlerAttacker] |= STATUS3_PERISH_SONG; + gBattleMons[gBattlerAttacker].volatiles.perishSong = TRUE; gDisableStructs[gBattlerAttacker].perishSongTimer = 3; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_PerishBodyActivates; + BattleScriptCall(BattleScript_PerishBodyActivates); effect++; } break; case ABILITY_GULP_MISSILE: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + if (!gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker) && gBattleMons[gBattlerTarget].species != SPECIES_CRAMORANT) { - if (GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) - { - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - } + if (!IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD)) + SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 4); - switch(gBattleMons[gBattlerTarget].species) + switch (gBattleMons[gBattlerTarget].species) { case SPECIES_CRAMORANT_GORGING: TryBattleFormChange(battler, FORM_CHANGE_HIT_BY_MOVE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_GulpMissileGorging; + BattleScriptCall(BattleScript_GulpMissileGorging); effect++; break; case SPECIES_CRAMORANT_GULPING: TryBattleFormChange(battler, FORM_CHANGE_HIT_BY_MOVE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_GulpMissileGulping; + BattleScriptCall(BattleScript_GulpMissileGulping); effect++; break; } } break; case ABILITY_SEED_SOWER: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + if (!gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) - && TryChangeBattleTerrain(gBattlerTarget, STATUS_FIELD_GRASSY_TERRAIN, &gFieldTimers.terrainTimer)) + && TryChangeBattleTerrain(gBattlerTarget, STATUS_FIELD_GRASSY_TERRAIN)) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SeedSowerActivates; + BattleScriptCall(BattleScript_SeedSowerActivates); effect++; } break; case ABILITY_THERMAL_EXCHANGE: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerTurnDamaged(gBattlerTarget) + if (IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) - && CompareStat(gBattlerTarget, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN) + && CompareStat(gBattlerTarget, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility) && moveType == TYPE_FIRE) { - gEffectBattler = gBattlerTarget; + gEffectBattler = gBattlerAbility = gBattlerTarget; SET_STATCHANGER(STAT_ATK, 1, FALSE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseRet; - effect++; - } - break; - case ABILITY_ANGER_SHELL: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && IsBattlerTurnDamaged(gBattlerTarget) - && (gMultiHitCounter == 0 || gMultiHitCounter == 1) // Activates after all hits from a multi-hit move. - && IsBattlerAlive(gBattlerTarget) - && HadMoreThanHalfHpNowDoesnt(gBattlerTarget) - && !(TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove))) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AngerShellActivates; + BattleScriptCall(BattleScript_TargetAbilityStatRaiseRet); effect++; } break; @@ -4898,91 +5341,82 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; // fall through case ABILITY_ELECTROMORPHOSIS: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + if (!gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget)) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_WindPowerActivates; + BattleScriptCall(BattleScript_WindPowerActivates); effect++; } break; case ABILITY_TOXIC_DEBRIS: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && (!gBattleStruct->isSkyBattle) + if (!gBattleStruct->isSkyBattle && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattleMovePhysical(gCurrentMove) && IsBattlerTurnDamaged(gBattlerTarget) && (gSideTimers[GetBattlerSide(gBattlerAttacker)].toxicSpikesAmount != 2)) { - SWAP(gBattlerAttacker, gBattlerTarget, i); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ToxicDebrisActivates; + SaveBattlerTarget(gBattlerTarget); + SaveBattlerAttacker(gBattlerAttacker); + gBattlerAttacker = gBattlerTarget; + gBattlerTarget = BATTLE_OPPOSITE(gBattlerAttacker); + BattleScriptCall(BattleScript_ToxicDebrisActivates); effect++; } break; + default: + break; } break; case ABILITYEFFECT_MOVE_END_ATTACKER: // Same as above, but for attacker switch (gLastUsedAbility) { case ABILITY_POISON_TOUCH: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerTarget) + if (IsBattlerAlive(gBattlerTarget) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && CanBePoisoned(gBattlerAttacker, gBattlerTarget, gLastUsedAbility, GetBattlerAbility(gBattlerTarget)) - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS - && IsMoveMakingContact(move, gBattlerAttacker) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) && IsBattlerTurnDamaged(gBattlerTarget) // Need to actually hit the target && RandomPercentage(RNG_POISON_TOUCH, 30)) { + gEffectBattler = gBattlerTarget; + gBattleScripting.battler = gBattlerAttacker; gBattleScripting.moveEffect = MOVE_EFFECT_POISON; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; - gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; + BattleScriptCall(BattleScript_AbilityStatusEffect); effect++; } break; case ABILITY_TOXIC_CHAIN: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerTarget) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && CanBePoisoned(gBattlerAttacker, gBattlerTarget, gLastUsedAbility, GetBattlerAbility(gBattlerTarget)) - && IsBattlerTurnDamaged(gBattlerTarget) // Need to actually hit the target - && RandomWeighted(RNG_TOXIC_CHAIN, 7, 3)) + if (gBattleStruct->toxicChainPriority) { + gBattleStruct->toxicChainPriority = FALSE; + gEffectBattler = gBattlerTarget; + gBattleScripting.battler = gBattlerAttacker; gBattleScripting.moveEffect = MOVE_EFFECT_TOXIC; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; - gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; + BattleScriptCall(BattleScript_AbilityStatusEffect); effect++; } break; case ABILITY_STENCH: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerTarget) + if (IsBattlerAlive(gBattlerTarget) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && RandomChance(RNG_STENCH, 1, 10) && IsBattlerTurnDamaged(gBattlerTarget) && !MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_FLINCH)) { - gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH; - BattleScriptPushCursor(); - SetMoveEffect(FALSE, FALSE); - BattleScriptPop(); + SetMoveEffect(gBattlerAttacker, gBattlerTarget, MOVE_EFFECT_FLINCH, gBattlescriptCurrInstr, EFFECT_PRIMARY); effect++; } break; case ABILITY_GULP_MISSILE: if ((gBattleMons[gBattlerAttacker].species == SPECIES_CRAMORANT) - && ((gCurrentMove == MOVE_SURF && IsBattlerTurnDamaged(gBattlerTarget)) || gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER) + && ((gCurrentMove == MOVE_SURF && IsBattlerTurnDamaged(gBattlerTarget)) || gBattleMons[gBattlerAttacker].volatiles.semiInvulnerable == STATE_UNDERWATER) && TryBattleFormChange(gBattlerAttacker, FORM_CHANGE_BATTLE_HP_PERCENT)) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AttackerFormChange; + gBattleScripting.battler = gBattlerAttacker; + BattleScriptCall(BattleScript_BattlerFormChange); effect++; } break; @@ -4994,11 +5428,12 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattleStruct->poisonPuppeteerConfusion = FALSE; gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; + BattleScriptCall(BattleScript_AbilityStatusEffect); effect++; } break; + default: + break; } break; case ABILITYEFFECT_MOVE_END_OTHER: // Abilities that activate on *another* battler's moveend: Dancer, Soul-Heart, Receiver, Symbiosis @@ -5019,285 +5454,149 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 // Set the target to the original target of the mon that first used a Dance move gBattlerTarget = gBattleScripting.savedBattler & 0x3; - // Edge case for dance moves that hit multiply targets - gHitMarker &= ~HITMARKER_NO_ATTACKSTRING; - // Make sure that the target isn't an ally - if it is, target the original user if (IsBattlerAlly(gBattlerTarget, gBattlerAttacker)) gBattlerTarget = (gBattleScripting.savedBattler & 0xF0) >> 4; - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; BattleScriptExecute(BattleScript_DancerActivates); effect++; } break; + default: + break; } break; case ABILITYEFFECT_OPPORTUNIST: - /* Similar to ABILITYEFFECT_IMMUNITY in that it loops through all battlers. - * Is called after ABILITYEFFECT_ON_SWITCHIN to copy any boosts - * from switch in abilities e.g. intrepid sword, as - */ - for (battler = 0; battler < gBattlersCount; battler++) + case ABILITYEFFECT_OPPORTUNIST_FIRST_TURN: + switch (ability) { - switch (GetBattlerAbility(battler)) + case ABILITY_OPPORTUNIST: + if (gProtectStructs[battler].activateOpportunist == 2) { - case ABILITY_OPPORTUNIST: - if (gProtectStructs[battler].activateOpportunist == 2) - { - gBattleScripting.battler = battler; - gProtectStructs[battler].activateOpportunist--; - ChooseStatBoostAnimation(battler); - BattleScriptPushCursorAndCallback(BattleScript_OpportunistCopyStatChange); - effect = 1; - } - break; + gBattleScripting.battler = battler; + gProtectStructs[battler].activateOpportunist--; + ChooseStatBoostAnimation(battler); + if (caseID == ABILITYEFFECT_OPPORTUNIST_FIRST_TURN) + BattleScriptPushCursorAndCallback(BattleScript_OpportunistCopyStatChangeEnd3); + else + BattleScriptCall(BattleScript_OpportunistCopyStatChange); + effect = 1; } + break; + default: + break; } break; case ABILITYEFFECT_IMMUNITY: - gBattleStruct->bypassMoldBreakerChecks = TRUE; - for (battler = 0; battler < gBattlersCount; battler++) - { - switch (GetBattlerAbility(battler)) - { - case ABILITY_IMMUNITY: - case ABILITY_PASTEL_VEIL: - if (gBattleMons[battler].status1 & (STATUS1_POISON | STATUS1_TOXIC_POISON | STATUS1_TOXIC_COUNTER)) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); - effect = 1; - } - break; - case ABILITY_OWN_TEMPO: - if (gBattleMons[battler].status2 & STATUS2_CONFUSION) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); - effect = 2; - } - break; - case ABILITY_LIMBER: - if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); - effect = 1; - } - break; - case ABILITY_INSOMNIA: - case ABILITY_VITAL_SPIRIT: - if (gBattleMons[battler].status1 & STATUS1_SLEEP) - { - TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); - gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; - StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); - effect = 1; - } - break; - case ABILITY_WATER_VEIL: - case ABILITY_WATER_BUBBLE: - case ABILITY_THERMAL_EXCHANGE: - if (gBattleMons[battler].status1 & STATUS1_BURN) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); - effect = 1; - } - break; - case ABILITY_MAGMA_ARMOR: - if (gBattleMons[battler].status1 & (STATUS1_FREEZE | STATUS1_FROSTBITE)) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); - effect = 1; - } - break; - case ABILITY_OBLIVIOUS: - if (gBattleMons[battler].status2 & STATUS2_INFATUATION) - effect = 3; - else if (gDisableStructs[battler].tauntTimer != 0) - effect = 4; - break; - } - - if (effect != 0) - { - switch (effect) - { - case 1: // status cleared - gBattleMons[battler].status1 = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityCuredStatus; - break; - case 2: // get rid of confusion - RemoveConfusionStatus(battler); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityCuredStatus; - break; - case 3: // get rid of infatuation - gBattleMons[battler].status2 &= ~STATUS2_INFATUATION; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BattlerGotOverItsInfatuation; - break; - case 4: // get rid of taunt - gDisableStructs[battler].tauntTimer = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BattlerShookOffTaunt; - break; - } - - gBattleScripting.battler = gBattlerAbility = battler; - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - return effect; - } - } - gBattleStruct->bypassMoldBreakerChecks = FALSE; + effect = TryImmunityAbilityHealStatus(battler, caseID); + if (effect) + return effect; + break; + case ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES: + effect = TryImmunityAbilityHealStatus(battler, caseID); break; case ABILITYEFFECT_SYNCHRONIZE: - if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONIZE_EFFECT)) + if (gLastUsedAbility == ABILITY_SYNCHRONIZE && gBattleStruct->synchronizeMoveEffect != MOVE_EFFECT_NONE) { - gHitMarker &= ~HITMARKER_SYNCHRONIZE_EFFECT; - - bool32 statusChanged = CanSetNonVolatileStatus(gBattlerTarget, - gBattlerAttacker, - gLastUsedAbility, - GetBattlerAbility(gBattlerAttacker), - gBattleStruct->synchronizeMoveEffect, - STATUS_CHECK_TRIGGER); - - BattleScriptPushCursor(); gBattleScripting.battler = gBattlerAbility = gBattlerTarget; RecordAbilityBattle(gBattlerTarget, ABILITY_SYNCHRONIZE); - if (statusChanged) - { - gBattleStruct->synchronizeMoveEffect &= ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); - if (B_SYNCHRONIZE_TOXIC < GEN_5 && gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) - gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; + if (GetConfig(CONFIG_SYNCHRONIZE_TOXIC) < GEN_5 && gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) + gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; - gBattleScripting.moveEffect = gBattleStruct->synchronizeMoveEffect + MOVE_EFFECT_AFFECTS_USER; + if (CanSetNonVolatileStatus( + gBattlerTarget, + gBattlerAttacker, + gLastUsedAbility, + GetBattlerAbility(gBattlerAttacker), + gBattleStruct->synchronizeMoveEffect, + CHECK_TRIGGER)) + { + gEffectBattler = gBattlerAttacker; + gBattleScripting.moveEffect = gBattleStruct->synchronizeMoveEffect; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, ABILITY_SYNCHRONIZE); - gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; - gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; + BattleScriptCall(BattleScript_SynchronizeActivates); effect++; } else // Synchronize ability pop up still shows up even if status fails { - gBattlescriptCurrInstr = BattleScript_AbilityPopUp; + BattleScriptCall(BattleScript_AbilityPopUp); } + gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_NONE; } break; case ABILITYEFFECT_ATK_SYNCHRONIZE: - if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONIZE_EFFECT)) + if (gLastUsedAbility == ABILITY_SYNCHRONIZE && gBattleStruct->synchronizeMoveEffect != MOVE_EFFECT_NONE) { - gHitMarker &= ~HITMARKER_SYNCHRONIZE_EFFECT; - - bool32 statusChanged = CanSetNonVolatileStatus(gBattlerAttacker, - gBattlerTarget, - gLastUsedAbility, - GetBattlerAbility(gBattlerAttacker), - gBattleStruct->synchronizeMoveEffect, - STATUS_CHECK_TRIGGER); - - BattleScriptPushCursor(); gBattleScripting.battler = gBattlerAbility = gBattlerAttacker; RecordAbilityBattle(gBattlerAttacker, ABILITY_SYNCHRONIZE); - if (statusChanged) + if (GetConfig(CONFIG_SYNCHRONIZE_TOXIC) < GEN_5 && gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) + gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; + + if (CanSetNonVolatileStatus( + gBattlerAttacker, + gBattlerTarget, + gLastUsedAbility, + GetBattlerAbility(gBattlerAttacker), + gBattleStruct->synchronizeMoveEffect, + CHECK_TRIGGER)) { - gBattleStruct->synchronizeMoveEffect &= ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); if (gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; + gEffectBattler = gBattlerTarget; gBattleScripting.moveEffect = gBattleStruct->synchronizeMoveEffect; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, ABILITY_SYNCHRONIZE); - gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; - gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; + BattleScriptCall(BattleScript_SynchronizeActivates); effect++; } else // Synchronize ability pop up still shows up even if status fails { - gBattlescriptCurrInstr = BattleScript_AbilityPopUp; + BattleScriptCall(BattleScript_AbilityPopUp); } + gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_NONE; } break; case ABILITYEFFECT_NEUTRALIZINGGAS: + case ABILITYEFFECT_NEUTRALIZINGGAS_FIRST_TURN: // Prints message only. separate from ABILITYEFFECT_ON_SWITCHIN bc activates before entry hazards - for (i = 0; i < gBattlersCount; i++) + if (gLastUsedAbility == ABILITY_NEUTRALIZING_GAS && !gDisableStructs[battler].neutralizingGas) { - if (gBattleMons[i].ability == ABILITY_NEUTRALIZING_GAS && !gDisableStructs[i].neutralizingGas) - { - gDisableStructs[i].neutralizingGas = TRUE; - gBattlerAbility = i; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_NEUTRALIZING_GAS; + gDisableStructs[battler].neutralizingGas = TRUE; + gBattlerAbility = battler; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_NEUTRALIZING_GAS; + if (caseID == ABILITYEFFECT_NEUTRALIZINGGAS_FIRST_TURN) BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); - effect++; - } - - if (effect != 0) - break; - } - break; - case ABILITYEFFECT_FIELD_SPORT: - switch (gLastUsedAbility) - { - case ABILITYEFFECT_MUD_SPORT: - for (i = 0; i < gBattlersCount; i++) - { - if (gStatuses4[i] & STATUS4_MUD_SPORT) - effect = i + 1; - } - break; - case ABILITYEFFECT_WATER_SPORT: - for (i = 0; i < gBattlersCount; i++) - { - if (gStatuses4[i] & STATUS4_WATER_SPORT) - effect = i + 1; - } - break; - default: - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleMons[i].ability == ability) - { - gLastUsedAbility = ability; - effect = i + 1; - } - } - break; + else + BattleScriptCall(BattleScript_SwitchInAbilityMsgRet); + effect++; } break; case ABILITYEFFECT_ON_WEATHER: // For ability effects that activate when the battle weather changes. + if (!IsBattlerAlive(battler)) + return effect; gLastUsedAbility = GetBattlerAbility(battler); switch (gLastUsedAbility) { case ABILITY_FORECAST: case ABILITY_FLOWER_GIFT: - if ((IsBattlerWeatherAffected(battler, gBattleWeather) - || gBattleWeather == B_WEATHER_NONE - || !HasWeatherEffect()) // Air Lock active - && TryBattleFormChange(battler, FORM_CHANGE_BATTLE_WEATHER)) - { - gBattleScripting.battler = battler; - BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeWithStringEnd3); - effect++; - } - break; case ABILITY_ICE_FACE: { - u32 battlerWeatherAffected = IsBattlerWeatherAffected(battler, B_WEATHER_HAIL | B_WEATHER_SNOW); - if (battlerWeatherAffected && gBattleMons[battler].species == SPECIES_EISCUE) + u32 battlerWeatherAffected = IsBattlerWeatherAffected(battler, gBattleWeather); + if (battlerWeatherAffected && !CanBattlerFormChange(battler, FORM_CHANGE_BATTLE_WEATHER)) { // If Hail/Snow activates when in Eiscue is in base, prevent reversion when Eiscue Noice gets broken gDisableStructs[battler].weatherAbilityDone = TRUE; } - if (!gDisableStructs[battler].weatherAbilityDone - && battlerWeatherAffected - && gBattleMons[battler].species == SPECIES_EISCUE_NOICE - && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) + + if (((!gDisableStructs[battler].weatherAbilityDone && battlerWeatherAffected) + || gBattleWeather == B_WEATHER_NONE + || !HasWeatherEffect()) // Air Lock active + && TryBattleFormChange(battler, FORM_CHANGE_BATTLE_WEATHER)) { - // TODO: Convert this to a proper FORM_CHANGE type. gBattleScripting.battler = battler; gDisableStructs[battler].weatherAbilityDone = TRUE; - gBattleMons[battler].species = SPECIES_EISCUE_ICE; BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeWithStringEnd3); effect++; } @@ -5306,19 +5605,24 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_PROTOSYNTHESIS: if (!gDisableStructs[battler].weatherAbilityDone && (gBattleWeather & B_WEATHER_SUN) && HasWeatherEffect() - && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) - && !gDisableStructs[battler].boosterEnergyActivates) + && !gBattleMons[battler].volatiles.transformed + && !gDisableStructs[battler].boosterEnergyActivated) { gDisableStructs[battler].weatherAbilityDone = TRUE; - PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); + gDisableStructs[battler].paradoxBoostedStat = GetParadoxHighestStatId(battler); + PREPARE_STAT_BUFFER(gBattleTextBuff1, gDisableStructs[battler].paradoxBoostedStat); gBattleScripting.battler = battler; BattleScriptPushCursorAndCallback(BattleScript_ProtosynthesisActivates); effect++; } break; + default: + break; } break; case ABILITYEFFECT_ON_TERRAIN: // For ability effects that activate when the field terrain changes. + if (!IsBattlerAlive(battler)) + return effect; gLastUsedAbility = GetBattlerAbility(battler); switch (gLastUsedAbility) { @@ -5335,16 +5639,19 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_QUARK_DRIVE: if (!gDisableStructs[battler].terrainAbilityDone && gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN - && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) - && !gDisableStructs[battler].boosterEnergyActivates) + && !gBattleMons[battler].volatiles.transformed + && !gDisableStructs[battler].boosterEnergyActivated) { gDisableStructs[battler].terrainAbilityDone = TRUE; - PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); + gDisableStructs[battler].paradoxBoostedStat = GetParadoxHighestStatId(battler); + PREPARE_STAT_BUFFER(gBattleTextBuff1, gDisableStructs[battler].paradoxBoostedStat); gBattlerAbility = gBattleScripting.battler = battler; BattleScriptPushCursorAndCallback(BattleScript_QuarkDriveActivates); effect++; } break; + default: + break; } break; } @@ -5359,7 +5666,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 bool32 TryPrimalReversion(u32 battler) { - if (GetBattlerHoldEffect(battler, FALSE) == HOLD_EFFECT_PRIMAL_ORB + if (GetBattlerHoldEffectIgnoreNegation(battler) == HOLD_EFFECT_PRIMAL_ORB && GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_PRIMAL_REVERSION) != gBattleMons[battler].species) { gBattleScripting.battler = battler; @@ -5375,69 +5682,86 @@ bool32 IsNeutralizingGasOnField(void) for (i = 0; i < gBattlersCount; i++) { - if (IsBattlerAlive(i) && gBattleMons[i].ability == ABILITY_NEUTRALIZING_GAS && !(gStatuses3[i] & STATUS3_GASTRO_ACID)) + if (gDisableStructs[i].neutralizingGas && !gBattleMons[i].volatiles.gastroAcid) return TRUE; } return FALSE; } -bool32 IsMoldBreakerTypeAbility(u32 battler, u32 ability) +bool32 IsMoldBreakerTypeAbility(u32 battler, enum Ability ability) { - if (gStatuses3[battler] & STATUS3_GASTRO_ACID) + if (gBattleMons[battler].volatiles.gastroAcid) return FALSE; - return (ability == ABILITY_MOLD_BREAKER || ability == ABILITY_TERAVOLT || ability == ABILITY_TURBOBLAZE - || (ability == ABILITY_MYCELIUM_MIGHT && IsBattleMoveStatus(gCurrentMove))); + if (ability == ABILITY_MOLD_BREAKER + || ability == ABILITY_TERAVOLT + || ability == ABILITY_TURBOBLAZE + || (ability == ABILITY_MYCELIUM_MIGHT && IsBattleMoveStatus(gCurrentMove))) + { + RecordAbilityBattle(battler, ability); + return TRUE; + } + + return FALSE; } -static inline bool32 CanBreakThroughAbility(u32 battlerAtk, u32 battlerDef, u32 ability, u32 hasAbilityShield) +static inline bool32 CanBreakThroughAbility(u32 battlerAtk, u32 battlerDef, u32 hasAbilityShield, u32 ignoreMoldBreaker) { - if (hasAbilityShield || gBattleStruct->bypassMoldBreakerChecks) + if (hasAbilityShield || ignoreMoldBreaker || battlerDef == battlerAtk) return FALSE; + return gBattleStruct->moldBreakerActive && gAbilitiesInfo[gBattleMons[battlerDef].ability].breakable; +} + +u32 GetBattlerAbilityNoAbilityShield(u32 battler) +{ + return GetBattlerAbilityInternal(battler, FALSE, TRUE); +} + +u32 GetBattlerAbilityIgnoreMoldBreaker(u32 battler) +{ + return GetBattlerAbilityInternal(battler, TRUE, FALSE); +} - return ((IsMoldBreakerTypeAbility(battlerAtk, ability) || MoveIgnoresTargetAbility(gCurrentMove)) - && battlerDef != battlerAtk - && gAbilitiesInfo[gBattleMons[battlerDef].ability].breakable - && gBattlerByTurnOrder[gCurrentTurnActionNumber] == battlerAtk - && gActionsByTurnOrder[gCurrentTurnActionNumber] == B_ACTION_USE_MOVE - && gCurrentTurnActionNumber < gBattlersCount); +enum Ability GetBattlerAbility(u32 battler) +{ + return GetBattlerAbilityInternal(battler, FALSE, FALSE); } -u32 GetBattlerAbility(u32 battler) +u32 GetBattlerAbilityInternal(u32 battler, u32 ignoreMoldBreaker, u32 noAbilityShield) { - bool32 hasAbilityShield = GetBattlerHoldEffectIgnoreAbility(battler, TRUE) == HOLD_EFFECT_ABILITY_SHIELD; + bool32 hasAbilityShield = !noAbilityShield && GetBattlerHoldEffectIgnoreAbility(battler) == HOLD_EFFECT_ABILITY_SHIELD; bool32 abilityCantBeSuppressed = gAbilitiesInfo[gBattleMons[battler].ability].cantBeSuppressed; if (abilityCantBeSuppressed) { // Edge case: pokemon under the effect of gastro acid transforms into a pokemon with Comatose (Todo: verify how other unsuppressable abilities behave) - if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED - && gStatuses3[battler] & STATUS3_GASTRO_ACID + if (gBattleMons[battler].volatiles.transformed + && gBattleMons[battler].volatiles.gastroAcid && gBattleMons[battler].ability == ABILITY_COMATOSE) return ABILITY_NONE; - if (CanBreakThroughAbility(gBattlerAttacker, battler, gBattleMons[gBattlerAttacker].ability, hasAbilityShield)) + if (CanBreakThroughAbility(gBattlerAttacker, battler, hasAbilityShield, ignoreMoldBreaker)) return ABILITY_NONE; return gBattleMons[battler].ability; } - if (gStatuses3[battler] & STATUS3_GASTRO_ACID) + if (gBattleMons[battler].volatiles.gastroAcid) return ABILITY_NONE; if (!hasAbilityShield && IsNeutralizingGasOnField() - && gBattleMons[battler].ability != ABILITY_NEUTRALIZING_GAS) + && (gBattleMons[battler].ability != ABILITY_NEUTRALIZING_GAS || gBattleMons[battler].volatiles.gastroAcid)) return ABILITY_NONE; - if (CanBreakThroughAbility(gBattlerAttacker, battler, gBattleMons[gBattlerAttacker].ability, hasAbilityShield)) + if (CanBreakThroughAbility(gBattlerAttacker, battler, hasAbilityShield, ignoreMoldBreaker)) return ABILITY_NONE; return gBattleMons[battler].ability; } -u32 IsAbilityOnSide(u32 battler, u32 ability) +u32 IsAbilityOnSide(u32 battler, enum Ability ability) { if (IsBattlerAlive(battler) && GetBattlerAbility(battler) == ability) return battler + 1; @@ -5447,12 +5771,12 @@ u32 IsAbilityOnSide(u32 battler, u32 ability) return 0; } -u32 IsAbilityOnOpposingSide(u32 battler, u32 ability) +u32 IsAbilityOnOpposingSide(u32 battler, enum Ability ability) { return IsAbilityOnSide(BATTLE_OPPOSITE(battler), ability); } -u32 IsAbilityOnField(u32 ability) +u32 IsAbilityOnField(enum Ability ability) { u32 i; @@ -5465,7 +5789,7 @@ u32 IsAbilityOnField(u32 ability) return 0; } -u32 IsAbilityOnFieldExcept(u32 battler, u32 ability) +u32 IsAbilityOnFieldExcept(u32 battler, enum Ability ability) { u32 i; @@ -5483,17 +5807,18 @@ u32 IsAbilityPreventingEscape(u32 battler) if (B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return 0; + bool32 isBattlerGrounded = IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler)); for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { if (battler == battlerDef || IsBattlerAlly(battler, battlerDef)) continue; - u32 ability = GetBattlerAbility(battlerDef); + enum Ability ability = GetBattlerAbility(battlerDef); if (ability == ABILITY_SHADOW_TAG && (B_SHADOW_TAG_ESCAPE <= GEN_3 || GetBattlerAbility(battler) != ABILITY_SHADOW_TAG)) return battlerDef + 1; - if (ability == ABILITY_ARENA_TRAP && IsBattlerGrounded(battler)) + if (ability == ABILITY_ARENA_TRAP && isBattlerGrounded) return battlerDef + 1; if (ability == ABILITY_MAGNET_PULL && IS_BATTLER_OF_TYPE(battler, TYPE_STEEL)) @@ -5505,19 +5830,19 @@ u32 IsAbilityPreventingEscape(u32 battler) bool32 CanBattlerEscape(u32 battler) // no ability check { - if (gBattleStruct->commanderActive[battler] != SPECIES_NONE) + if (gBattleStruct->battlerState[battler].commanderSpecies != SPECIES_NONE) return FALSE; - else if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_SHED_SHELL) - return TRUE; else if (B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return TRUE; - else if (gBattleMons[battler].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED)) + else if (gBattleMons[battler].volatiles.escapePrevention) + return FALSE; + else if (gBattleMons[battler].volatiles.wrapped) return FALSE; - else if (gStatuses3[battler] & STATUS3_ROOTED) + else if (gBattleMons[battler].volatiles.root) return FALSE; else if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) return FALSE; - else if (gStatuses3[battler] & STATUS3_SKY_DROPPED) + else if (gBattleMons[battler].volatiles.semiInvulnerable == STATE_SKY_DROP) return FALSE; else return TRUE; @@ -5533,100 +5858,212 @@ void BattleScriptExecute(const u8 *BS_ptr) void BattleScriptPushCursorAndCallback(const u8 *BS_ptr) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BS_ptr; + BattleScriptCall(BS_ptr); gBattleResources->battleCallbackStack->function[gBattleResources->battleCallbackStack->size++] = gBattleMainFunc; gBattleMainFunc = RunBattleScriptCommands; } -bool32 IsBattlerTerrainAffected(u32 battler, u32 terrainFlag) +bool32 IsBattlerTerrainAffected(u32 battler, enum Ability ability, enum HoldEffect holdEffect, u32 terrainFlag) { if (!(gFieldStatuses & terrainFlag)) return FALSE; - else if (gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE) + if (IsSemiInvulnerable(battler, CHECK_ALL)) return FALSE; - return IsBattlerGrounded(battler); + return IsBattlerGrounded(battler, ability, holdEffect); +} + +u32 GetHighestStatId(u32 battler) +{ + u32 highestId = STAT_ATK; + u32 highestStat = gBattleMons[battler].attack; + + for (u32 stat = STAT_DEF; stat < NUM_STATS; stat++) + { + if (stat == STAT_SPEED) + continue; + + u16 *statVal = &gBattleMons[battler].attack + (stat - 1); + if (*statVal > highestStat) + { + highestStat = *statVal; + highestId = stat; + } + } + + if (gBattleMons[battler].speed > highestStat) + highestId = STAT_SPEED; + + return highestId; +} + +static u32 GetStatValueWithStages(u32 battler, u32 stat) +{ + u32 statValue; + + switch (stat) + { + case STAT_ATK: + statValue = gBattleMons[battler].attack; + break; + case STAT_DEF: + statValue = gBattleMons[battler].defense; + break; + case STAT_SPATK: + statValue = gBattleMons[battler].spAttack; + break; + case STAT_SPDEF: + statValue = gBattleMons[battler].spDefense; + break; + case STAT_SPEED: + statValue = gBattleMons[battler].speed; + break; + default: + return 0; + } + + statValue *= gStatStageRatios[gBattleMons[battler].statStages[stat]][0]; + statValue /= gStatStageRatios[gBattleMons[battler].statStages[stat]][1]; + + return statValue; +} + +u32 GetParadoxHighestStatId(u32 battler) +{ + u32 highestId = STAT_ATK; + u32 highestStat = GetStatValueWithStages(battler, STAT_ATK); + + for (u32 stat = STAT_DEF; stat < NUM_STATS; stat++) + { + if (stat == STAT_SPEED) + continue; + + u32 statValue = GetStatValueWithStages(battler, stat); + if (statValue > highestStat) + { + highestStat = statValue; + highestId = stat; + } + } + + u32 speed = GetStatValueWithStages(battler, STAT_SPEED); + if (speed > highestStat) + highestId = STAT_SPEED; + + return highestId; +} + +static void ResetParadoxWeatherStat(u32 battler) +{ + if (gBattleMons[battler].ability == ABILITY_PROTOSYNTHESIS + && !gDisableStructs[battler].boosterEnergyActivated) + gDisableStructs[battler].paradoxBoostedStat = 0; +} + +static void ResetParadoxTerrainStat(u32 battler) +{ + if (gBattleMons[battler].ability == ABILITY_QUARK_DRIVE + && !gDisableStructs[battler].boosterEnergyActivated) + gDisableStructs[battler].paradoxBoostedStat = 0; +} + +u32 GetParadoxBoostedStatId(u32 battler) +{ + if (gDisableStructs[battler].paradoxBoostedStat == 0) + gDisableStructs[battler].paradoxBoostedStat = GetParadoxHighestStatId(battler); + + return gDisableStructs[battler].paradoxBoostedStat; } -bool32 CanBeSlept(u32 battlerAtk, u32 battlerDef, u32 abilityDef, enum SleepClauseBlock isBlockedBySleepClause) +bool32 CanBeSlept(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef, enum SleepClauseBlock isBlockedBySleepClause) { - if (IsSleepClauseActiveForSide(GetBattlerSide(battlerDef)) && isBlockedBySleepClause) + if (IsSleepClauseActiveForSide(GetBattlerSide(battlerDef)) && isBlockedBySleepClause != NOT_BLOCKED_BY_SLEEP_CLAUSE) return FALSE; - if (CanSetNonVolatileStatus(battlerAtk, - battlerDef, - ABILITY_NONE, // attacker ability does not matter - abilityDef, - MOVE_EFFECT_SLEEP, // also covers yawn - STATUS_CHECK_TRIGGER)) - return TRUE; - return FALSE; + if (isBlockedBySleepClause == NOT_BLOCKED_BY_SLEEP_CLAUSE) + gBattleStruct->sleepClauseNotBlocked = TRUE; + + bool32 effect = FALSE; + if (CanSetNonVolatileStatus( + battlerAtk, + battlerDef, + ABILITY_NONE, // attacker ability does not matter + abilityDef, + MOVE_EFFECT_SLEEP, // also covers yawn + CHECK_TRIGGER)) + effect = TRUE; + + gBattleStruct->sleepClauseNotBlocked = FALSE; + return effect; } -bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef) +bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef) { - if (CanSetNonVolatileStatus(battlerAtk, - battlerDef, - abilityAtk, - abilityDef, - MOVE_EFFECT_TOXIC, // also covers poison - STATUS_CHECK_TRIGGER)) + if (CanSetNonVolatileStatus( + battlerAtk, + battlerDef, + abilityAtk, + abilityDef, + MOVE_EFFECT_TOXIC, // also covers poison + CHECK_TRIGGER)) return TRUE; return FALSE; } // TODO: check order of battlerAtk and battlerDef -bool32 CanBeBurned(u32 battlerAtk, u32 battlerDef, u32 abilityDef) -{ - if (CanSetNonVolatileStatus(battlerAtk, - battlerDef, - ABILITY_NONE, // attacker ability does not matter - abilityDef, - MOVE_EFFECT_BURN, - STATUS_CHECK_TRIGGER)) +bool32 CanBeBurned(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef) +{ + if (CanSetNonVolatileStatus( + battlerAtk, + battlerDef, + ABILITY_NONE, // attacker ability does not matter + abilityDef, + MOVE_EFFECT_BURN, + CHECK_TRIGGER)) return TRUE; return FALSE; } -bool32 CanBeParalyzed(u32 battlerAtk, u32 battlerDef, u32 abilityDef) +bool32 CanBeParalyzed(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef) { - if (CanSetNonVolatileStatus(battlerAtk, - battlerDef, - ABILITY_NONE, // attacker ability does not matter - abilityDef, - MOVE_EFFECT_PARALYSIS, - STATUS_CHECK_TRIGGER)) + if (CanSetNonVolatileStatus( + battlerAtk, + battlerDef, + ABILITY_NONE, // attacker ability does not matter + abilityDef, + MOVE_EFFECT_PARALYSIS, + CHECK_TRIGGER)) return TRUE; return FALSE; } -bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, u32 abilityDef) +bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef) { - if (CanSetNonVolatileStatus(battlerAtk, - battlerDef, - ABILITY_NONE, // attacker ability does not matter - abilityDef, - MOVE_EFFECT_FREEZE, - STATUS_CHECK_TRIGGER)) + if (CanSetNonVolatileStatus( + battlerAtk, + battlerDef, + ABILITY_NONE, // attacker ability does not matter + abilityDef, + MOVE_EFFECT_FREEZE, + CHECK_TRIGGER)) return TRUE; return FALSE; } - -// Unused, technically also redundant -bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef) +// Unused, technically also redundant because it is just a copy of CanBeFrozen +bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef) { - if (CanSetNonVolatileStatus(battlerAtk, - battlerDef, - ABILITY_NONE, // attacker ability does not matter - abilityDef, - MOVE_EFFECT_FREEZE_OR_FROSTBITE, // also covers frostbite - STATUS_CHECK_TRIGGER)) + if (CanSetNonVolatileStatus( + battlerAtk, + battlerDef, + ABILITY_NONE, // attacker ability does not matter + abilityDef, + MOVE_EFFECT_FREEZE_OR_FROSTBITE, // also covers frostbite + CHECK_TRIGGER)) return TRUE; return FALSE; } -bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, enum MoveEffects effect, enum NonVolatileStatus option) +bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, enum MoveEffect effect, enum FunctionCallOption option) { const u8 *battleScript = NULL; u32 sideBattler = ABILITY_NONE; @@ -5650,13 +6087,11 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u abilityAffected = TRUE; battlerDef = sideBattler - 1; abilityDef = ABILITY_PASTEL_VEIL; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PASTEL_VEIL; battleScript = BattleScript_ImmunityProtected; } else if (abilityDef == ABILITY_IMMUNITY) { abilityAffected = TRUE; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_MOVE_POISON; battleScript = BattleScript_ImmunityProtected; } break; @@ -5665,12 +6100,12 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u { battleScript = BattleScript_AlreadyParalyzed; } - else if (B_PARALYZE_ELECTRIC >= GEN_6 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ELECTRIC)) + else if (GetConfig(CONFIG_PARALYZE_ELECTRIC) >= GEN_6 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ELECTRIC)) { battleScript = BattleScript_NotAffected; } - else if (option == STATUS_RUN_SCRIPT // Check only important during battle execution for moves - && CalcTypeEffectivenessMultiplier(gCurrentMove, GetBattleMoveType(gCurrentMove), battlerAtk, battlerDef, abilityDef, TRUE) + else if (option == RUN_SCRIPT // Check only important during battle execution for moves + && CalcTypeEffectivenessMultiplierHelper(gCurrentMove, GetBattleMoveType(gCurrentMove), battlerAtk, battlerDef, abilityAtk, abilityDef, TRUE) && gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT) { battleScript = BattleScript_ButItFailed; @@ -5678,7 +6113,6 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u else if (abilityDef == ABILITY_LIMBER) { abilityAffected = TRUE; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_MOVE_PARALYSIS; battleScript = BattleScript_ImmunityProtected; } break; @@ -5694,7 +6128,6 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u else if (abilityDef == ABILITY_WATER_VEIL || abilityDef == ABILITY_WATER_BUBBLE) { abilityAffected = TRUE; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_MOVE_BURN; battleScript = BattleScript_ImmunityProtected; } else if (abilityDef == ABILITY_THERMAL_EXCHANGE) @@ -5712,11 +6145,11 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u { battleScript = BattleScript_CantMakeAsleep; } - else if (CanSleepDueToSleepClause(battlerAtk, battlerDef, option)) + else if (!gBattleStruct->sleepClauseNotBlocked && CanSleepDueToSleepClause(battlerAtk, battlerDef, option)) { battleScript = BattleScript_SleepClauseBlocked; } - else if (IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_ELECTRIC_TERRAIN)) + else if (IsBattlerTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef), STATUS_FIELD_ELECTRIC_TERRAIN)) { battleScript = BattleScript_ElectricTerrainPrevents; } @@ -5725,7 +6158,6 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u abilityAffected = TRUE; battlerDef = sideBattler - 1; abilityDef = ABILITY_SWEET_VEIL; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUS_HAD_NO_EFFECT; battleScript = BattleScript_ImmunityProtected; } else if (abilityDef == ABILITY_VITAL_SPIRIT || abilityDef == ABILITY_INSOMNIA) @@ -5759,13 +6191,12 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u // Checks that apply to all non volatile statuses if (abilityDef == ABILITY_COMATOSE - || abilityDef == ABILITY_SHIELDS_DOWN || abilityDef == ABILITY_PURIFYING_SALT) { abilityAffected = TRUE; battleScript = BattleScript_AbilityProtectsDoesntAffect; } - else if (IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN)) + else if (IsBattlerTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef), STATUS_FIELD_MISTY_TERRAIN)) { battleScript = BattleScript_MistyTerrainPrevents; } @@ -5774,6 +6205,11 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u abilityAffected = TRUE; battleScript = BattleScript_AbilityProtectsDoesntAffect; } + else if (IsShieldsDownProtected(battlerDef, abilityDef)) + { + abilityAffected = TRUE; + battleScript = BattleScript_AbilityProtectsDoesntAffect; + } else if ((sideBattler = IsFlowerVeilProtected(battlerDef))) { abilityAffected = TRUE; @@ -5796,11 +6232,11 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u return TRUE; } -static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, u32 abilityDef, u32 abilityAffected, const u8 *battleScript, enum NonVolatileStatus option) +static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, enum Ability abilityDef, enum Ability abilityAffected, const u8 *battleScript, enum FunctionCallOption option) { if (battleScript != NULL) { - if (option == STATUS_RUN_SCRIPT) + if (option == RUN_SCRIPT) { if (battleScript != BattleScript_NotAffected) gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_FAILED; @@ -5821,17 +6257,17 @@ static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, u32 abilityDef, u32 abi return FALSE; } -static bool32 CanSleepDueToSleepClause(u32 battlerAtk, u32 battlerDef, enum NonVolatileStatus option) +static bool32 CanSleepDueToSleepClause(u32 battlerAtk, u32 battlerDef, enum FunctionCallOption option) { // Can freely sleep own partner if (IsDoubleBattle() && IsSleepClauseEnabled() && IsBattlerAlly(battlerAtk, battlerDef)) { - if (option == STATUS_RUN_SCRIPT) + if (option == RUN_SCRIPT) gBattleStruct->battlerState[battlerDef].sleepClauseEffectExempt = TRUE; return FALSE; } - if (option == STATUS_RUN_SCRIPT) + if (option == RUN_SCRIPT) gBattleStruct->battlerState[battlerDef].sleepClauseEffectExempt = FALSE; // Can't sleep if clause is active otherwise if (IsSleepClauseActiveForSide(GetBattlerSide(battlerDef))) @@ -5842,2073 +6278,551 @@ static bool32 CanSleepDueToSleepClause(u32 battlerAtk, u32 battlerDef, enum NonV bool32 CanBeConfused(u32 battler) { - if (GetBattlerAbility(battler) == ABILITY_OWN_TEMPO - || gBattleMons[battler].status2 & STATUS2_CONFUSION - || IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN)) + enum Ability ability = GetBattlerAbility(battler); + if (gBattleMons[battler].volatiles.confusionTurns > 0 + || IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler), STATUS_FIELD_MISTY_TERRAIN) + || IsAbilityAndRecord(battler, ability, ABILITY_OWN_TEMPO)) return FALSE; return TRUE; } // second argument is 1/X of current hp compared to max hp -bool32 HasEnoughHpToEatBerry(u32 battler, u32 hpFraction, u32 itemId) +bool32 HasEnoughHpToEatBerry(u32 battler, enum Ability ability, u32 hpFraction, u32 itemId) { - bool32 isBerry = (GetItemPocket(itemId) == POCKET_BERRIES); - if (!IsBattlerAlive(battler)) return FALSE; if (gBattleScripting.overrideBerryRequirements) return TRUE; - // Unnerve prevents consumption of opponents' berries. - if (isBerry && IsUnnerveAbilityOnOpposingSide(battler)) - return FALSE; if (gBattleMons[battler].hp <= gBattleMons[battler].maxHP / hpFraction) return TRUE; - if (hpFraction <= 4 && GetBattlerAbility(battler) == ABILITY_GLUTTONY && isBerry - && gBattleMons[battler].hp <= gBattleMons[battler].maxHP / 2) - { - RecordAbilityBattle(battler, ABILITY_GLUTTONY); + if (hpFraction <= 4 && GetItemPocket(itemId) == POCKET_BERRIES + && gBattleMons[battler].hp <= gBattleMons[battler].maxHP / 2 + && IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_GLUTTONY)) return TRUE; - } return FALSE; } -static enum ItemEffect HealConfuseBerry(u32 battler, u32 itemId, u32 flavorId, enum ItemCaseId caseID) +void ClearVariousBattlerFlags(u32 battler) { - if (HasEnoughHpToEatBerry(battler, (B_CONFUSE_BERRIES_HEAL >= GEN_7 ? 4 : 2), itemId) - && (B_HEAL_BLOCKING < GEN_5 || !(gStatuses3[battler] & STATUS3_HEAL_BLOCK))) - { - PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, flavorId); - - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / GetBattlerItemHoldEffectParam(battler, itemId); - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; - - if (GetBattlerAbility(battler) == ABILITY_RIPEN) - { - gBattleStruct->moveDamage[battler] *= 2; - gBattlerAbility = battler; - } - gBattleScripting.battler = battler; - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) - { - if (GetFlavorRelationByPersonality(gBattleMons[battler].personality, flavorId) < 0) - BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); - else - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItemEnd2); - } - else - { - BattleScriptPushCursor(); - if (GetFlavorRelationByPersonality(gBattleMons[battler].personality, flavorId) < 0) - gBattlescriptCurrInstr = BattleScript_BerryConfuseHealRet; - else - gBattlescriptCurrInstr = BattleScript_ItemHealHP_RemoveItemRet; - } - - return ITEM_HP_CHANGE; - } - return ITEM_NO_EFFECT; + gDisableStructs[battler].furyCutterCounter = 0; + gBattleMons[battler].volatiles.destinyBond = 0; + gBattleMons[battler].volatiles.glaiveRush = FALSE; + gBattleMons[battler].volatiles.grudge = FALSE; } -static enum ItemEffect StatRaiseBerry(u32 battler, u32 itemId, u32 statId, enum ItemCaseId caseID) +void HandleAction_RunBattleScript(void) // identical to RunBattleScriptCommands { - if (CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN) && HasEnoughHpToEatBerry(battler, GetBattlerItemHoldEffectParam(battler, itemId), itemId)) - { - BufferStatChange(battler, statId, STRINGID_STATROSE); - gEffectBattler = gBattleScripting.battler = battler; - if (GetBattlerAbility(battler) == ABILITY_RIPEN) - SET_STATCHANGER(statId, 2, FALSE); - else - SET_STATCHANGER(statId, 1, FALSE); - - gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + statId; - gBattleScripting.animArg2 = 0; - - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) - { - BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); - } - else - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ConsumableStatRaiseRet; - } - return ITEM_STATS_CHANGE; - } - return ITEM_NO_EFFECT; + if (gBattleControllerExecFlags == 0) + gBattleScriptingCommandsTable[*gBattlescriptCurrInstr](); } -static enum ItemEffect RandomStatRaiseBerry(u32 battler, u32 itemId, enum ItemCaseId caseID) +u32 SetRandomTarget(u32 battlerAtk) { - s32 stat; - enum StringID stringId; + u32 target; + static const u8 targets[2][2] = + { + [B_SIDE_PLAYER] = {B_POSITION_OPPONENT_LEFT, B_POSITION_OPPONENT_RIGHT}, + [B_SIDE_OPPONENT] = {B_POSITION_PLAYER_LEFT, B_POSITION_PLAYER_RIGHT}, + }; - for (stat = STAT_ATK; stat < NUM_STATS; stat++) + if (IsDoubleBattle()) { - if (CompareStat(battler, stat, MAX_STAT_STAGE, CMP_LESS_THAN)) - break; + target = GetBattlerAtPosition(targets[GetBattlerSide(battlerAtk)][RandomUniform(RNG_RANDOM_TARGET, 0, 1)]); + if (!IsBattlerAlive(target)) + target ^= BIT_FLANK; } - if (stat != NUM_STATS && HasEnoughHpToEatBerry(battler, GetBattlerItemHoldEffectParam(battler, itemId), itemId)) + else { - u16 battlerAbility = GetBattlerAbility(battler); - u32 savedAttacker = gBattlerAttacker; - // MoodyCantRaiseStat requires that the battler is set to gBattlerAttacker - gBattlerAttacker = gBattleScripting.battler = battler; - stat = RandomUniformExcept(RNG_RANDOM_STAT_UP, STAT_ATK, NUM_STATS - 1, MoodyCantRaiseStat); - gBattlerAttacker = savedAttacker; + target = GetBattlerAtPosition(targets[GetBattlerSide(battlerAtk)][0]); + } - PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); - stringId = (battlerAbility == ABILITY_CONTRARY) ? STRINGID_STATFELL : STRINGID_STATROSE; - gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; - gBattleTextBuff2[1] = B_BUFF_STRING; - gBattleTextBuff2[2] = STRINGID_STATSHARPLY; - gBattleTextBuff2[3] = STRINGID_STATSHARPLY >> 8; - gBattleTextBuff2[4] = B_BUFF_STRING; - gBattleTextBuff2[5] = stringId; - gBattleTextBuff2[6] = stringId >> 8; - gBattleTextBuff2[7] = EOS; - gEffectBattler = battler; - if (battlerAbility == ABILITY_RIPEN) - SET_STATCHANGER(stat, 4, FALSE); - else - SET_STATCHANGER(stat, 2, FALSE); - - gBattleScripting.animArg1 = STAT_ANIM_PLUS2 + stat; - gBattleScripting.animArg2 = 0; - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) - { - BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); - } - else - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ConsumableStatRaiseRet; - } - - return ITEM_STATS_CHANGE; - } - return ITEM_NO_EFFECT; + return target; } -static enum ItemEffect TrySetMicleBerry(u32 battler, u32 itemId, enum ItemCaseId caseID) +u32 GetBattleMoveTarget(u16 move, u8 setTarget) { - if (HasEnoughHpToEatBerry(battler, 4, itemId)) + u8 targetBattler = 0; + u32 moveTarget, side; + enum Type moveType = GetBattleMoveType(move); + + if (setTarget != NO_TARGET_OVERRIDE) + moveTarget = setTarget - 1; + else + moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, move); + + switch (moveTarget) { - gBattleStruct->battlerState[battler].usedMicleBerry = TRUE; - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) + case MOVE_TARGET_SELECTED: + case MOVE_TARGET_OPPONENT: + side = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker)); + if (IsAffectedByFollowMe(gBattlerAttacker, side, move)) { - BattleScriptExecute(BattleScript_MicleBerryActivateEnd2); + targetBattler = gSideTimers[side].followmeTarget; } else { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MicleBerryActivateRet; + enum Ability battlerAbilityOnField = 0; + + targetBattler = SetRandomTarget(gBattlerAttacker); + if (moveType == TYPE_ELECTRIC && GetBattlerAbility(targetBattler) != ABILITY_LIGHTNING_ROD) + { + if (B_REDIRECT_ABILITY_ALLIES >= GEN_4) + battlerAbilityOnField = IsAbilityOnField(ABILITY_LIGHTNING_ROD); + else + battlerAbilityOnField = IsAbilityOnOpposingSide(targetBattler, ABILITY_LIGHTNING_ROD); + + if (battlerAbilityOnField > 0 && (battlerAbilityOnField - 1) != gBattlerAttacker) + { + targetBattler = battlerAbilityOnField - 1; + RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability); + gSpecialStatuses[targetBattler].abilityRedirected = TRUE; + } + } + else if (moveType == TYPE_WATER && GetBattlerAbility(targetBattler) != ABILITY_STORM_DRAIN) + { + if (B_REDIRECT_ABILITY_ALLIES >= GEN_4) + battlerAbilityOnField = IsAbilityOnField(ABILITY_STORM_DRAIN); + else + battlerAbilityOnField = IsAbilityOnOpposingSide(targetBattler, ABILITY_STORM_DRAIN); + + if (battlerAbilityOnField > 0 && (battlerAbilityOnField - 1) != gBattlerAttacker) + { + targetBattler = battlerAbilityOnField - 1; + RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability); + gSpecialStatuses[targetBattler].abilityRedirected = TRUE; + } + } } - return ITEM_EFFECT_OTHER; + break; + case MOVE_TARGET_DEPENDS: + case MOVE_TARGET_BOTH: + case MOVE_TARGET_FOES_AND_ALLY: + targetBattler = GetOpposingSideBattler(gBattlerAttacker); + if (IsDoubleBattle() && !IsBattlerAlive(targetBattler)) + targetBattler ^= BIT_FLANK; + break; + case MOVE_TARGET_OPPONENTS_FIELD: + targetBattler = GetOpposingSideBattler(gBattlerAttacker); + break; + case MOVE_TARGET_RANDOM: + side = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker)); + if (IsAffectedByFollowMe(gBattlerAttacker, side, move)) + targetBattler = gSideTimers[side].followmeTarget; + else if (IsDoubleBattle() && moveTarget & MOVE_TARGET_RANDOM) + targetBattler = SetRandomTarget(gBattlerAttacker); + else + targetBattler = GetOpposingSideBattler(gBattlerAttacker); + break; + case MOVE_TARGET_USER: + default: + targetBattler = gBattlerAttacker; + break; + case MOVE_TARGET_ALLY: + if (IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker))) + targetBattler = BATTLE_PARTNER(gBattlerAttacker); + else + targetBattler = gBattlerAttacker; + break; } - return ITEM_NO_EFFECT; -} -static enum ItemEffect TrySetEnigmaBerry(u32 battler) -{ - if (IsBattlerAlive(battler) - && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) - && ((IsBattlerTurnDamaged(battler) && gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_SUPER_EFFECTIVE) || gBattleScripting.overrideBerryRequirements) - && !(gBattleScripting.overrideBerryRequirements && gBattleMons[battler].hp == gBattleMons[battler].maxHP) - && (B_HEAL_BLOCKING < GEN_5 || !(gStatuses3[battler] & STATUS3_HEAL_BLOCK))) - { - gBattleScripting.battler = battler; - gBattleStruct->moveDamage[battler] = (gBattleMons[battler].maxHP * 25 / 100) * -1; - if (GetBattlerAbility(battler) == ABILITY_RIPEN) - gBattleStruct->moveDamage[battler] *= 2; + gBattleStruct->moveTarget[gBattlerAttacker] = targetBattler; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ItemHealHP_RemoveItemRet; - return ITEM_HP_CHANGE; - } - return ITEM_NO_EFFECT; + return targetBattler; } -static enum ItemEffect DamagedStatBoostBerryEffect(u32 battler, u8 statId, u8 category) +u8 GetAttackerObedienceForAction() { - if (IsBattlerAlive(battler) - && CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN) - && (gBattleScripting.overrideBerryRequirements - || (!DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) - && GetBattleMoveCategory(gCurrentMove) == category - && battler != gBattlerAttacker - && IsBattlerTurnDamaged(battler))) - ) - { - BufferStatChange(battler, statId, STRINGID_STATROSE); + s32 rnd; + s32 calc; + u8 obedienceLevel = 0; + u8 levelReferenced; - gEffectBattler = battler; - if (GetBattlerAbility(battler) == ABILITY_RIPEN) - SET_STATCHANGER(statId, 2, FALSE); - else - SET_STATCHANGER(statId, 1, FALSE); + if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) + return OBEYS; + if (BattlerHasAi(gBattlerAttacker)) + return OBEYS; - gBattleScripting.battler = battler; - gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + statId; - gBattleScripting.animArg2 = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ConsumableStatRaiseRet; - return ITEM_STATS_CHANGE; - } - return ITEM_NO_EFFECT; -} + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBattlerPosition(gBattlerAttacker) == B_POSITION_PLAYER_RIGHT) + return OBEYS; + if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) + return OBEYS; + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) + return OBEYS; + if (B_OBEDIENCE_MECHANICS < GEN_8 && !IsOtherTrainer(gBattleMons[gBattlerAttacker].otId, gBattleMons[gBattlerAttacker].otName)) + return OBEYS; + if (FlagGet(FLAG_BADGE08_GET)) // Rain Badge, ignore obedience altogether + return OBEYS; -enum ItemEffect TryHandleSeed(u32 battler, u32 terrainFlag, u32 statId, u32 itemId, enum ItemCaseId caseID) -{ - if (gFieldStatuses & terrainFlag && CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN)) - { - BufferStatChange(battler, statId, STRINGID_STATROSE); - gLastUsedItem = itemId; // For surge abilities - gEffectBattler = gBattleScripting.battler = battler; - SET_STATCHANGER(statId, 1, FALSE); - gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + statId; - gBattleScripting.animArg2 = 0; - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN) - { - BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); - } - else - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ConsumableStatRaiseRet; - } - return ITEM_STATS_CHANGE; - } - return ITEM_NO_EFFECT; -} + obedienceLevel = 10; -static enum ItemEffect TryEjectPack(u32 battler, enum ItemCaseId caseID) -{ - if (gProtectStructs[battler].statFell - && !gProtectStructs[battler].disableEjectPack - && CountUsablePartyMons(battler) > 0 - && !(GetMoveEffect(gCurrentMove) == EFFECT_PARTING_SHOT && CanBattlerSwitch(gBattlerAttacker))) // Does not activate if attacker used Parting Shot and can switch out + if (FlagGet(FLAG_BADGE01_GET)) // Stone Badge + obedienceLevel = 20; + if (FlagGet(FLAG_BADGE02_GET)) // Knuckle Badge + obedienceLevel = 30; + if (FlagGet(FLAG_BADGE03_GET)) // Dynamo Badge + obedienceLevel = 40; + if (FlagGet(FLAG_BADGE04_GET)) // Heat Badge + obedienceLevel = 50; + if (FlagGet(FLAG_BADGE05_GET)) // Balance Badge + obedienceLevel = 60; + if (FlagGet(FLAG_BADGE06_GET)) // Feather Badge + obedienceLevel = 70; + if (FlagGet(FLAG_BADGE07_GET)) // Mind Badge + obedienceLevel = 80; + + if (B_OBEDIENCE_MECHANICS >= GEN_8 + && !IsOtherTrainer(gBattleMons[gBattlerAttacker].otId, gBattleMons[gBattlerAttacker].otName)) + levelReferenced = gBattleMons[gBattlerAttacker].metLevel; + else + levelReferenced = gBattleMons[gBattlerAttacker].level; + + if (levelReferenced <= obedienceLevel) + return OBEYS; + + rnd = Random(); + calc = (levelReferenced + obedienceLevel) * (rnd & 255) >> 8; + if (calc < obedienceLevel) + return OBEYS; + + // Clear the Z-Move flags if the battler is disobedient as to not waste the Z-Move + if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE) { - gProtectStructs[battler].statFell = FALSE; - gBattleScripting.battler = battler; - gAiLogicData->ejectPackSwitch = TRUE; - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN) - { - BattleScriptExecute(BattleScript_EjectPackActivate_End2); - } - else - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_EjectPackActivate_Ret; - } - return ITEM_STATS_CHANGE; + gBattleStruct->gimmick.activated[gBattlerAttacker][GIMMICK_Z_MOVE] = FALSE; + gBattleStruct->gimmick.activeGimmick[GetBattlerSide(gBattlerAttacker)][gBattlerPartyIndexes[gBattlerAttacker]] = GIMMICK_NONE; } - return ITEM_NO_EFFECT; -} -static enum ItemEffect ConsumeBerserkGene(u32 battler, enum ItemCaseId caseID) -{ - if (CanBeInfinitelyConfused(battler)) - gStatuses4[battler] |= STATUS4_INFINITE_CONFUSION; + // is not obedient + enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); + if (moveEffect == EFFECT_RAGE) + gBattleMons[gBattlerAttacker].volatiles.rage = FALSE; + if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP && (moveEffect == EFFECT_SNORE || moveEffect == EFFECT_SLEEP_TALK)) + return DISOBEYS_WHILE_ASLEEP; - BufferStatChange(battler, STAT_ATK, STRINGID_STATROSE); - gBattlerAttacker = gEffectBattler = battler; - SET_STATCHANGER(STAT_ATK, 2, FALSE); - gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + STAT_ATK; - gBattleScripting.animArg2 = 0; - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) + calc = (levelReferenced + obedienceLevel) * ((rnd >> 8) & 255) >> 8; + if (calc < obedienceLevel) { - BattleScriptExecute(BattleScript_BerserkGeneRetEnd2); + calc = CheckMoveLimitations(gBattlerAttacker, 1u << gCurrMovePos, MOVE_LIMITATIONS_ALL); + if (calc == ALL_MOVES_MASK) // all moves cannot be used + return DISOBEYS_LOAFS; + else // use a random move + do + gCurrMovePos = gChosenMovePos = MOD(Random(), MAX_MON_MOVES); + while ((1u << gCurrMovePos) & calc); + return DISOBEYS_RANDOM_MOVE; } else { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerserkGeneRet; + obedienceLevel = levelReferenced - obedienceLevel; + + calc = ((rnd >> 16) & 255); + if (calc < obedienceLevel && CanBeSlept(gBattlerAttacker, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), NOT_BLOCKED_BY_SLEEP_CLAUSE)) + { + // try putting asleep + int i; + for (i = 0; i < gBattlersCount; i++) + if (gBattleMons[i].volatiles.uproarTurns) + break; + if (i == gBattlersCount) + return DISOBEYS_FALL_ASLEEP; + } + calc -= obedienceLevel; + if (calc < obedienceLevel) + return DISOBEYS_HITS_SELF; + else + return DISOBEYS_LOAFS; } - return ITEM_STATS_CHANGE; } -static u32 ItemRestorePp(u32 battler, u32 itemId, enum ItemCaseId caseID) +enum HoldEffect GetBattlerHoldEffect(u32 battler) { - struct Pokemon *mon = GetBattlerMon(battler); - u32 i, changedPP = 0; - - for (i = 0; i < MAX_MON_MOVES; i++) - { - u32 move = GetMonData(mon, MON_DATA_MOVE1 + i); - u32 currentPP = GetMonData(mon, MON_DATA_PP1 + i); - u32 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); - u32 maxPP = CalculatePPWithBonus(move, ppBonuses, i); - if (move && (currentPP == 0 || (gBattleScripting.overrideBerryRequirements && currentPP != maxPP))) - { - u32 ppRestored = GetBattlerItemHoldEffectParam(battler, itemId); - - if (GetBattlerAbility(battler) == ABILITY_RIPEN) - { - ppRestored *= 2; - gBattlerAbility = battler; - } - if (currentPP + ppRestored > maxPP) - changedPP = maxPP; - else - changedPP = currentPP + ppRestored; - - PREPARE_MOVE_BUFFER(gBattleTextBuff1, move); + return GetBattlerHoldEffectInternal(battler, GetBattlerAbility(battler)); +} - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) - { - BattleScriptExecute(BattleScript_BerryPPHealEnd2); - } - else - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryPPHealRet; - } - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); - MarkBattlerForControllerExec(battler); - if (MOVE_IS_PERMANENT(battler, i)) - gBattleMons[battler].pp[i] = changedPP; - return ITEM_PP_CHANGE; - } - } - return 0; +enum HoldEffect GetBattlerHoldEffectIgnoreAbility(u32 battler) +{ + return GetBattlerHoldEffectInternal(battler, ABILITY_NONE); } -static u32 ItemHealHp(u32 battler, u32 itemId, enum ItemCaseId caseID, bool32 percentHeal) +enum HoldEffect GetBattlerHoldEffectInternal(u32 battler, u32 ability) { - if (!(gBattleScripting.overrideBerryRequirements && gBattleMons[battler].hp == gBattleMons[battler].maxHP) - && (B_HEAL_BLOCKING < GEN_5 || !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) - && HasEnoughHpToEatBerry(battler, 2, itemId)) - { - if (percentHeal) - gBattleStruct->moveDamage[battler] = (GetNonDynamaxMaxHP(battler) * GetBattlerItemHoldEffectParam(battler, itemId) / 100) * -1; - else - gBattleStruct->moveDamage[battler] = GetBattlerItemHoldEffectParam(battler, itemId) * -1; + if (gBattleMons[battler].volatiles.embargo) + return HOLD_EFFECT_NONE; + if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) + return HOLD_EFFECT_NONE; + if (ability == ABILITY_KLUTZ && !gBattleMons[battler].volatiles.gastroAcid) + return HOLD_EFFECT_NONE; - // check ripen - if (GetItemPocket(itemId) == POCKET_BERRIES && GetBattlerAbility(battler) == ABILITY_RIPEN) - gBattleStruct->moveDamage[battler] *= 2; + gPotentialItemEffectBattler = battler; - gBattlerAbility = battler; // in SWSH, berry juice shows ability pop up but has no effect. This is mimicked here - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) - { - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItemEnd2); - } - else - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ItemHealHP_RemoveItemRet; - } + if (gBattleMons[battler].item == ITEM_ENIGMA_BERRY_E_READER) + return gEnigmaBerries[battler].holdEffect; + else + return GetItemHoldEffect(gBattleMons[battler].item); +} - return ITEM_HP_CHANGE; - } - return 0; +enum HoldEffect GetBattlerHoldEffectIgnoreNegation(u32 battler) +{ + gPotentialItemEffectBattler = battler; + if (gBattleMons[battler].item == ITEM_ENIGMA_BERRY_E_READER) + return gEnigmaBerries[battler].holdEffect; + else + return GetItemHoldEffect(gBattleMons[battler].item); } -static bool32 UnnerveOn(u32 battler, u32 itemId) +u32 GetBattlerHoldEffectParam(u32 battler) { - if (gBattleScripting.overrideBerryRequirements > 0) // Berries that aren't eaten naturally ignore unnerve - return FALSE; + if (gBattleMons[battler].item == ITEM_ENIGMA_BERRY_E_READER) + return gEnigmaBerries[battler].holdEffectParam; + else + return GetItemHoldEffectParam(gBattleMons[battler].item); +} - if (GetItemPocket(itemId) == POCKET_BERRIES && IsUnnerveAbilityOnOpposingSide(battler)) +bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum HoldEffect holdEffectAtk, u32 move) +{ + if (holdEffectAtk == HOLD_EFFECT_PROTECTIVE_PADS) + { + RecordItemEffectBattle(battlerAtk, HOLD_EFFECT_PROTECTIVE_PADS); return TRUE; - return FALSE; + } + + return !IsMoveMakingContact(battlerAtk, battlerDef, abilityAtk, holdEffectAtk, move); } -static bool32 GetMentalHerbEffect(u32 battler) +bool32 IsMoveMakingContact(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum HoldEffect holdEffectAtk, u32 move) { - bool32 ret = FALSE; - - // Check infatuation - if (gBattleMons[battler].status2 & STATUS2_INFATUATION) + if (!(MoveMakesContact(move) || (GetMoveEffect(move) == EFFECT_SHELL_SIDE_ARM + && gBattleStruct->shellSideArmCategory[battlerAtk][battlerDef] == DAMAGE_CATEGORY_PHYSICAL))) { - gBattleMons[battler].status2 &= ~STATUS2_INFATUATION; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_INFATUATION; // STRINGID_TARGETGOTOVERINFATUATION - StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); - ret = TRUE; + return FALSE; } - if (B_MENTAL_HERB >= GEN_5) + else if (holdEffectAtk == HOLD_EFFECT_PUNCHING_GLOVE && IsPunchingMove(move)) { - // Check taunt - if (gDisableStructs[battler].tauntTimer != 0) - { - gDisableStructs[battler].tauntTimer = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TAUNT; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_TAUNT); - ret = TRUE; - } - // Check encore - if (gDisableStructs[battler].encoreTimer != 0) - { - gDisableStructs[battler].encoredMove = 0; - gDisableStructs[battler].encoreTimer = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_ENCORE; // STRINGID_PKMNENCOREENDED - ret = TRUE; - } - // Check torment - if (gBattleMons[battler].status2 & STATUS2_TORMENT) - { - gBattleMons[battler].status2 &= ~STATUS2_TORMENT; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TORMENT; - ret = TRUE; - } - // Check heal block - if (gStatuses3[battler] & STATUS3_HEAL_BLOCK) - { - gStatuses3[battler] &= ~STATUS3_HEAL_BLOCK; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_HEALBLOCK; - ret = TRUE; - } - // Check disable - if (gDisableStructs[battler].disableTimer != 0) - { - gDisableStructs[battler].disableTimer = 0; - gDisableStructs[battler].disabledMove = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_DISABLE; - ret = TRUE; - } + RecordItemEffectBattle(battlerAtk, HOLD_EFFECT_PUNCHING_GLOVE); + return FALSE; } - return ret; + else if (abilityAtk == ABILITY_LONG_REACH) + { + RecordAbilityBattle(battlerAtk, ABILITY_LONG_REACH); + return FALSE; + } + return TRUE; } -static u32 TryConsumeMirrorHerb(u32 battler, enum ItemCaseId caseID) +static inline bool32 IsSideProtected(u32 battler, enum ProtectMethod method) { - u32 effect = 0; + return gProtectStructs[battler].protected == method + || gProtectStructs[BATTLE_PARTNER(battler)].protected == method; +} - if (gProtectStructs[battler].eatMirrorHerb) - { +bool32 IsBattlerProtected(u32 battlerAtk, u32 battlerDef, u32 move) +{ + if (gProtectStructs[battlerDef].protected == PROTECT_NONE + && gProtectStructs[BATTLE_PARTNER(battlerDef)].protected == PROTECT_NONE) + return FALSE; - gLastUsedItem = gBattleMons[battler].item; - gBattleScripting.battler = battler; - gProtectStructs[battler].eatMirrorHerb = 0; - ChooseStatBoostAnimation(battler); - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) - { - BattleScriptExecute(BattleScript_MirrorHerbCopyStatChangeEnd2); - } - else - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MirrorHerbCopyStatChange; - } - effect = ITEM_STATS_CHANGE; + if (gProtectStructs[battlerDef].protected != PROTECT_MAX_GUARD && !MoveIgnoresProtect(move)) + { + if (IsZMove(move) || IsMaxMove(move)) + return FALSE; // Z-Moves and Max Moves bypass protection (except Max Guard). + if (GetBattlerAbility(battlerAtk) == ABILITY_UNSEEN_FIST + && IsMoveMakingContact(battlerAtk, battlerDef, ABILITY_UNSEEN_FIST, GetBattlerHoldEffect(battlerAtk), move)) + return FALSE; } - return effect; + + bool32 isProtected = FALSE; + + if (IsSideProtected(battlerDef, PROTECT_CRAFTY_SHIELD) + && IsBattleMoveStatus(move) + && GetMoveEffect(move) != EFFECT_COACHING) + isProtected = TRUE; + else if (MoveIgnoresProtect(move)) + isProtected = FALSE; + else if (IsSideProtected(battlerDef, PROTECT_WIDE_GUARD) && IsSpreadMove(GetBattlerMoveTargetType(battlerAtk, move))) + isProtected = TRUE; + else if (gProtectStructs[battlerDef].protected == PROTECT_NORMAL) + isProtected = TRUE; + else if (gProtectStructs[battlerDef].protected == PROTECT_SPIKY_SHIELD) + isProtected = TRUE; + else if (gProtectStructs[battlerDef].protected == PROTECT_MAX_GUARD) + isProtected = TRUE; + else if (gProtectStructs[battlerDef].protected == PROTECT_BANEFUL_BUNKER) + isProtected = TRUE; + else if (gProtectStructs[battlerDef].protected == PROTECT_BURNING_BULWARK) + isProtected = TRUE; + else if (gProtectStructs[battlerDef].protected == PROTECT_OBSTRUCT && !IsBattleMoveStatus(move)) + isProtected = TRUE; + else if (gProtectStructs[battlerDef].protected == PROTECT_SILK_TRAP && !IsBattleMoveStatus(move)) + isProtected = TRUE; + else if (gProtectStructs[battlerDef].protected == PROTECT_KINGS_SHIELD && !IsBattleMoveStatus(move)) + isProtected = TRUE; + else if (IsSideProtected(battlerDef, PROTECT_QUICK_GUARD) && GetChosenMovePriority(battlerAtk, GetBattlerAbility(battlerAtk)) > 0) + isProtected = TRUE; + else if (IsSideProtected(battlerDef, PROTECT_MAT_BLOCK) && !IsBattleMoveStatus(move)) + isProtected = TRUE; + else + isProtected = FALSE; + + if (isProtected) + gBattleStruct->missStringId[battlerDef] = gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED; + + return isProtected; } -static inline u32 TryBoosterEnergy(u32 battler, enum ItemCaseId caseID) +u32 GetProtectType(enum ProtectMethod method) { - if (gDisableStructs[battler].boosterEnergyActivates || gBattleMons[battler].status2 & STATUS2_TRANSFORMED) - return ITEM_NO_EFFECT; - - if (((GetBattlerAbility(battler) == ABILITY_PROTOSYNTHESIS) && !((gBattleWeather & B_WEATHER_SUN) && HasWeatherEffect())) - || ((GetBattlerAbility(battler) == ABILITY_QUARK_DRIVE) && !(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN))) + switch (method) { - PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); - gBattlerAbility = gBattleScripting.battler = battler; - gDisableStructs[battler].boosterEnergyActivates = TRUE; - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) - { - BattleScriptExecute(BattleScript_BoosterEnergyEnd2); - } - else - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BoosterEnergyRet; - } - return ITEM_EFFECT_OTHER; + case PROTECT_NONE: + return PROTECT_TYPE_NONE; + case PROTECT_NORMAL: + case PROTECT_SPIKY_SHIELD: + case PROTECT_KINGS_SHIELD: + case PROTECT_BANEFUL_BUNKER: + case PROTECT_BURNING_BULWARK: + case PROTECT_OBSTRUCT: + case PROTECT_SILK_TRAP: + case PROTECT_MAX_GUARD: + return PROTECT_TYPE_SINGLE; + case PROTECT_WIDE_GUARD: + case PROTECT_QUICK_GUARD: + case PROTECT_CRAFTY_SHIELD: + case PROTECT_MAT_BLOCK: + return PROTECT_TYPE_SIDE; } - return ITEM_NO_EFFECT; + return FALSE; } -u32 RestoreWhiteHerbStats(u32 battler) +enum InverseBattleCheck { - u32 i, effect = 0; + INVERSE_BATTLE, + NOT_INVERSE_BATTLE +}; - for (i = 0; i < NUM_BATTLE_STATS; i++) - { - if (gBattleMons[battler].statStages[i] < DEFAULT_STAT_STAGE) - { - gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE; - effect = ITEM_STATS_CHANGE; - } - } - if (effect != 0) +enum IronBallCheck +{ + CHECK_IRON_BALL, + IGNORE_IRON_BALL +}; + +// Only called directly when calculating damage type effectiveness, and Iron Ball's type effectiveness mechanics +static bool32 IsBattlerGroundedInverseCheck(u32 battler, enum Ability ability, enum HoldEffect holdEffect, enum InverseBattleCheck checkInverse, bool32 isAnticipation) +{ + if (holdEffect == HOLD_EFFECT_IRON_BALL) + return TRUE; + if (gFieldStatuses & STATUS_FIELD_GRAVITY && isAnticipation == FALSE) + return TRUE; + if (B_ROOTED_GROUNDING >= GEN_4 && gBattleMons[battler].volatiles.root) + return TRUE; + if (gBattleMons[battler].volatiles.smackDown) + return TRUE; + if (gBattleMons[battler].volatiles.telekinesis) + return FALSE; + if (gBattleMons[battler].volatiles.magnetRise) + return FALSE; + if (holdEffect == HOLD_EFFECT_AIR_BALLOON) + return FALSE; + if (ability == ABILITY_LEVITATE) + return FALSE; + if (IS_BATTLER_OF_TYPE(battler, TYPE_FLYING) && (checkInverse != INVERSE_BATTLE || !FlagGet(B_FLAG_INVERSE_BATTLE))) + return FALSE; + return TRUE; +} + +bool32 IsBattlerGrounded(u32 battler, enum Ability ability, enum HoldEffect holdEffect) +{ + return IsBattlerGroundedInverseCheck(battler, ability, holdEffect, NOT_INVERSE_BATTLE, FALSE); +} + +u32 GetMoveSlot(u16 *moves, u32 move) +{ + u32 i; + + for (i = 0; i < MAX_MON_MOVES; i++) { - gLastUsedItem = gBattleMons[battler].item; - gBattleScripting.battler = battler; - gPotentialItemEffectBattler = battler; + if (moves[i] == move) + break; } - return effect; + return i; } -static u8 ItemEffectMoveEnd(u32 battler, enum ItemHoldEffect holdEffect) +u32 GetBattlerWeight(u32 battler) { - u8 effect = 0; + u32 i; + u32 weight = GetSpeciesWeight(gBattleMons[battler].species); + enum Ability ability = GetBattlerAbility(battler); + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); + + if (ability == ABILITY_HEAVY_METAL) + weight *= 2; + else if (ability == ABILITY_LIGHT_METAL) + weight /= 2; + + if (holdEffect == HOLD_EFFECT_FLOAT_STONE) + weight /= 2; - switch (holdEffect) + for (i = 0; i < gDisableStructs[battler].autotomizeCount; i++) { - case HOLD_EFFECT_MICLE_BERRY: - if (B_HP_BERRIES >= GEN_4) - effect = TrySetMicleBerry(battler, gLastUsedItem, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_RESTORE_HP: - if (B_HP_BERRIES >= GEN_4) - effect = ItemHealHp(battler, gLastUsedItem, ITEMEFFECT_NONE, FALSE); - break; - case HOLD_EFFECT_RESTORE_PCT_HP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = ItemHealHp(battler, gLastUsedItem, ITEMEFFECT_NONE, TRUE); - break; - case HOLD_EFFECT_RESTORE_PP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = ItemRestorePp(battler, gLastUsedItem, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_CONFUSE_SPICY: - if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SPICY, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_CONFUSE_DRY: - if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_DRY, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_CONFUSE_SWEET: - if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SWEET, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_CONFUSE_BITTER: - if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_BITTER, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_CONFUSE_SOUR: - if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SOUR, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_ATTACK_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_ATK, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_DEFENSE_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_DEF, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_SPEED_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPEED, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_SP_ATTACK_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPATK, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_SP_DEFENSE_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPDEF, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_ENIGMA_BERRY: // consume and heal if hit by super effective move - effect = TrySetEnigmaBerry(battler); - break; - case HOLD_EFFECT_KEE_BERRY: // consume and boost defense if used physical move - effect = DamagedStatBoostBerryEffect(battler, STAT_DEF, DAMAGE_CATEGORY_PHYSICAL); - break; - case HOLD_EFFECT_MARANGA_BERRY: // consume and boost sp. defense if used special move - effect = DamagedStatBoostBerryEffect(battler, STAT_SPDEF, DAMAGE_CATEGORY_SPECIAL); - break; - case HOLD_EFFECT_RANDOM_STAT_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = RandomStatRaiseBerry(battler, gLastUsedItem, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_CURE_PAR: - if (gBattleMons[battler].status1 & STATUS1_PARALYSIS && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_PARALYSIS; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureParRet; - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_PSN: - if (gBattleMons[battler].status1 & STATUS1_PSN_ANY && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryCurePsnRet; - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_BRN: - if (gBattleMons[battler].status1 & STATUS1_BURN && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_BURN; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureBrnRet; - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_FRZ: - if (gBattleMons[battler].status1 & STATUS1_FREEZE && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_FREEZE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureFrzRet; - effect = ITEM_STATUS_CHANGE; - } - if (gBattleMons[battler].status1 & STATUS1_FROSTBITE && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_FROSTBITE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureFrbRet; - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_SLP: - if (gBattleMons[battler].status1 & STATUS1_SLEEP && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_SLEEP; - gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureSlpRet; - effect = ITEM_STATUS_CHANGE; - TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); - } - break; - case HOLD_EFFECT_CURE_CONFUSION: - if (gBattleMons[battler].status2 & STATUS2_CONFUSION && !UnnerveOn(battler, gLastUsedItem)) + if (weight > 1000) { - RemoveConfusionStatus(battler); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureConfusionRet; - effect = ITEM_EFFECT_OTHER; + weight -= 1000; } - break; - case HOLD_EFFECT_MENTAL_HERB: - if (GetMentalHerbEffect(battler)) + else if (weight <= 1000) { - gBattleScripting.savedBattler = gBattlerAttacker; - gBattlerAttacker = battler; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MentalHerbCureRet; - effect = ITEM_EFFECT_OTHER; + weight = 1; + break; } - break; - case HOLD_EFFECT_CURE_STATUS: - if ((gBattleMons[battler].status1 & STATUS1_ANY || gBattleMons[battler].status2 & STATUS2_CONFUSION) && !UnnerveOn(battler, gLastUsedItem)) - { - if (gBattleMons[battler].status1 & STATUS1_PSN_ANY) - StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); + } - if (gBattleMons[battler].status1 & STATUS1_SLEEP) - { - gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; - StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); - TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); - } + if (weight == 0) + weight = 1; + + return weight; +} - if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) - StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); +u32 CountBattlerStatIncreases(u32 battler, bool32 countEvasionAcc) +{ + enum Stat i; + u32 count = 0; - if (gBattleMons[battler].status1 & STATUS1_BURN) - StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); + for (i = 0; i < NUM_BATTLE_STATS; i++) + { + if ((i == STAT_ACC || i == STAT_EVASION) && !countEvasionAcc) + continue; + if (gBattleMons[battler].statStages[i] > DEFAULT_STAT_STAGE) // Stat is increased. + count += gBattleMons[battler].statStages[i] - DEFAULT_STAT_STAGE; + } - if (gBattleMons[battler].status1 & STATUS1_FREEZE || gBattleMons[battler].status1 & STATUS1_FROSTBITE) - StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); + return count; +} - if (gBattleMons[battler].status2 & STATUS2_CONFUSION) - StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); +bool32 BattlerHasCopyableChanges(u32 battler) +{ + u32 i; - gBattleMons[battler].status1 = 0; - RemoveConfusionStatus(battler); - BattleScriptPushCursor(); - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; - gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet; - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CRITICAL_UP: // lansat berry - if (B_BERRIES_INSTANT >= GEN_4 - && !(gBattleMons[battler].status2 & STATUS2_FOCUS_ENERGY_ANY) - && HasEnoughHpToEatBerry(battler, GetBattlerItemHoldEffectParam(battler, gLastUsedItem), gLastUsedItem)) - { - gBattleMons[battler].status2 |= STATUS2_FOCUS_ENERGY; - gBattleScripting.battler = battler; - gPotentialItemEffectBattler = battler; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryFocusEnergyRet; - effect = ITEM_EFFECT_OTHER; - } - break; - case HOLD_EFFECT_BERSERK_GENE: - effect = ConsumeBerserkGene(battler, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_MIRROR_HERB: - effect = TryConsumeMirrorHerb(battler, ITEMEFFECT_NONE); - break; - default: - break; + for (i = 0; i < NUM_BATTLE_STATS; i++) + { + if (gBattleMons[battler].statStages[i] != DEFAULT_STAT_STAGE) + return TRUE; } - return effect; + if (gBattleMons[battler].volatiles.focusEnergy + || gBattleMons[battler].volatiles.dragonCheer + || gBattleMons[battler].volatiles.bonusCritStages != 0) + return TRUE; + + return FALSE; } -static inline bool32 TryCureStatus(u32 battler, enum ItemCaseId caseId) +u32 GetMoveTargetCount(struct DamageContext *ctx) { - u32 effect = ITEM_NO_EFFECT; - u32 string = 0; + u32 battlerAtk = ctx->battlerAtk; + u32 battlerDef = ctx->battlerDef; + u32 move = ctx->move; - if ((gBattleMons[battler].status1 & STATUS1_ANY || gBattleMons[battler].status2 & STATUS2_CONFUSION) && !UnnerveOn(battler, gLastUsedItem)) - { - if (gBattleMons[battler].status1 & STATUS1_PSN_ANY) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); - string++; - } - if (gBattleMons[battler].status1 & STATUS1_SLEEP) - { - gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; - StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); - string++; - TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); - } - if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); - string++; - } - if (gBattleMons[battler].status1 & STATUS1_BURN) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); - string++; - } - if (gBattleMons[battler].status1 & STATUS1_FREEZE || gBattleMons[battler].status1 & STATUS1_FROSTBITE) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); - string++; - } - if (gBattleMons[battler].status2 & STATUS2_CONFUSION) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); - string++; - } - if (string <= 1) - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; - else - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_NORMALIZED_STATUS; - gBattleMons[battler].status1 = 0; - RemoveConfusionStatus(battler); - if (caseId == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseId == ITEMEFFECT_NORMAL) - { - BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2); - } - else - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet; - } - effect = ITEM_STATUS_CHANGE; - } - - return effect; -} - -u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) -{ - u32 moveType = 0; - enum ItemEffect effect = ITEM_NO_EFFECT; - enum ItemHoldEffect battlerHoldEffect = 0, atkHoldEffect = 0; - u32 atkHoldEffectParam = 0; - u32 atkItem = 0; - - if (caseID != ITEMEFFECT_USE_LAST_ITEM) - { - gLastUsedItem = gBattleMons[battler].item; - battlerHoldEffect = GetBattlerHoldEffect(battler, TRUE); - } - - atkItem = gBattleMons[gBattlerAttacker].item; - atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); - atkHoldEffectParam = GetBattlerHoldEffectParam(gBattlerAttacker); - - switch (caseID) - { - case ITEMEFFECT_NONE: - break; - case ITEMEFFECT_ON_SWITCH_IN: - case ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN: - if (!gSpecialStatuses[battler].switchInItemDone) - { - switch (battlerHoldEffect) - { - case HOLD_EFFECT_DOUBLE_PRIZE: - if (IsOnPlayerSide(battler) && !gBattleStruct->moneyMultiplierItem) - { - gBattleStruct->moneyMultiplier *= 2; - gBattleStruct->moneyMultiplierItem = 1; - } - break; - case HOLD_EFFECT_WHITE_HERB: - effect = RestoreWhiteHerbStats(battler); - if (effect != 0) - BattleScriptExecute(BattleScript_WhiteHerbEnd2); - break; - case HOLD_EFFECT_CONFUSE_SPICY: - if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SPICY, caseID); - break; - case HOLD_EFFECT_CONFUSE_DRY: - if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_DRY, caseID); - break; - case HOLD_EFFECT_CONFUSE_SWEET: - if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SWEET, caseID); - break; - case HOLD_EFFECT_CONFUSE_BITTER: - if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_BITTER, caseID); - break; - case HOLD_EFFECT_CONFUSE_SOUR: - if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SOUR, caseID); - break; - case HOLD_EFFECT_ATTACK_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_ATK, caseID); - break; - case HOLD_EFFECT_DEFENSE_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_DEF, caseID); - break; - case HOLD_EFFECT_SPEED_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPEED, caseID); - break; - case HOLD_EFFECT_SP_ATTACK_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPATK, caseID); - break; - case HOLD_EFFECT_SP_DEFENSE_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPDEF, caseID); - break; - case HOLD_EFFECT_CRITICAL_UP: - if (B_BERRIES_INSTANT >= GEN_4 - && !(gBattleMons[battler].status2 & STATUS2_FOCUS_ENERGY_ANY) - && HasEnoughHpToEatBerry(battler, GetBattlerItemHoldEffectParam(battler, gLastUsedItem), gLastUsedItem)) - { - gBattleMons[battler].status2 |= STATUS2_FOCUS_ENERGY; - gBattleScripting.battler = battler; - BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2); - effect = ITEM_EFFECT_OTHER; - } - break; - case HOLD_EFFECT_RANDOM_STAT_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = RandomStatRaiseBerry(battler, gLastUsedItem, caseID); - break; - case HOLD_EFFECT_CURE_PAR: - if (B_BERRIES_INSTANT >= GEN_4 - && gBattleMons[battler].status1 & STATUS1_PARALYSIS - && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_PARALYSIS; - BattleScriptExecute(BattleScript_BerryCurePrlzEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_PSN: - if (B_BERRIES_INSTANT >= GEN_4 - && (gBattleMons[battler].status1 & STATUS1_PSN_ANY) - && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER); - BattleScriptExecute(BattleScript_BerryCurePsnEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_BRN: - if (B_BERRIES_INSTANT >= GEN_4 - && (gBattleMons[battler].status1 & STATUS1_BURN) - && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_BURN; - BattleScriptExecute(BattleScript_BerryCureBrnEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_FRZ: - if (B_BERRIES_INSTANT >= GEN_4 - && (gBattleMons[battler].status1 & STATUS1_FREEZE) - && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_FREEZE; - BattleScriptExecute(BattleScript_BerryCureFrzEnd2); - effect = ITEM_STATUS_CHANGE; - } - if (B_BERRIES_INSTANT >= GEN_4 - && (gBattleMons[battler].status1 & STATUS1_FROSTBITE) - && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_FROSTBITE; - BattleScriptExecute(BattleScript_BerryCureFrbEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_SLP: - if (B_BERRIES_INSTANT >= GEN_4 - && (gBattleMons[battler].status1 & STATUS1_SLEEP) - && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_SLEEP; - gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; - BattleScriptExecute(BattleScript_BerryCureSlpEnd2); - effect = ITEM_STATUS_CHANGE; - TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); - } - break; - case HOLD_EFFECT_CURE_STATUS: - if (B_BERRIES_INSTANT >= GEN_4) - effect = TryCureStatus(battler, caseID); - break; - case HOLD_EFFECT_RESTORE_HP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = ItemHealHp(battler, gLastUsedItem, caseID, FALSE); - break; - case HOLD_EFFECT_RESTORE_PCT_HP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = ItemHealHp(battler, gLastUsedItem, caseID, TRUE); - break; - case HOLD_EFFECT_AIR_BALLOON: - effect = ITEM_EFFECT_OTHER; - gBattleScripting.battler = battler; - BattleScriptPushCursorAndCallback(BattleScript_AirBaloonMsgIn); - RecordItemEffectBattle(battler, HOLD_EFFECT_AIR_BALLOON); - break; - case HOLD_EFFECT_ROOM_SERVICE: - if (TryRoomService(battler)) - { - BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } - break; - case HOLD_EFFECT_SEEDS: - switch (GetBattlerHoldEffectParam(battler)) - { - case HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_ELECTRIC_TERRAIN, STAT_DEF, gLastUsedItem, caseID); - break; - case HOLD_EFFECT_PARAM_GRASSY_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_GRASSY_TERRAIN, STAT_DEF, gLastUsedItem, caseID); - break; - case HOLD_EFFECT_PARAM_MISTY_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_MISTY_TERRAIN, STAT_SPDEF, gLastUsedItem, caseID); - break; - case HOLD_EFFECT_PARAM_PSYCHIC_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_PSYCHIC_TERRAIN, STAT_SPDEF, gLastUsedItem, caseID); - break; - } - break; - case HOLD_EFFECT_EJECT_PACK: - effect = TryEjectPack(battler, caseID); - break; - case HOLD_EFFECT_BERSERK_GENE: - effect = ConsumeBerserkGene(battler, caseID); - break; - case HOLD_EFFECT_MIRROR_HERB: - effect = TryConsumeMirrorHerb(battler, caseID); - break; - case HOLD_EFFECT_BOOSTER_ENERGY: - effect = TryBoosterEnergy(battler, caseID); - break; - default: - break; - } - if (effect != 0) - { - gSpecialStatuses[battler].switchInItemDone = TRUE; - gBattlerAttacker = gPotentialItemEffectBattler = gBattleScripting.battler = battler; - if (effect == ITEM_STATUS_CHANGE) - { - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - } - } - } - break; - case ITEMEFFECT_NORMAL: - case ITEMEFFECT_TRY_HEALING: - if (gBattleMons[battler].hp) - { - switch (battlerHoldEffect) - { - case HOLD_EFFECT_RESTORE_HP: - if (!moveTurn) - effect = ItemHealHp(battler, gLastUsedItem, caseID, FALSE); - break; - case HOLD_EFFECT_RESTORE_PCT_HP: - if (!moveTurn) - effect = ItemHealHp(battler, gLastUsedItem, caseID, TRUE); - break; - case HOLD_EFFECT_RESTORE_PP: - if (!moveTurn) - effect = ItemRestorePp(battler, gLastUsedItem, caseID); - break; - case HOLD_EFFECT_WHITE_HERB: - effect = RestoreWhiteHerbStats(battler); - if (effect != 0) - BattleScriptExecute(BattleScript_WhiteHerbEnd2); - break; - case HOLD_EFFECT_BLACK_SLUDGE: - if (IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) - { - goto LEFTOVERS; - } - else if (GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD && !moveTurn) - { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - BattleScriptExecute(BattleScript_ItemHurtEnd2); - effect = ITEM_HP_CHANGE; - RecordItemEffectBattle(battler, battlerHoldEffect); - PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); - } - break; - case HOLD_EFFECT_LEFTOVERS: - LEFTOVERS: - if (gBattleMons[battler].hp < gBattleMons[battler].maxHP && !moveTurn - && (B_HEAL_BLOCKING < GEN_5 || !(gStatuses3[battler] & STATUS3_HEAL_BLOCK))) - { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; - BattleScriptExecute(BattleScript_ItemHealHP_End2); - effect = ITEM_HP_CHANGE; - RecordItemEffectBattle(battler, battlerHoldEffect); - } - break; - case HOLD_EFFECT_CONFUSE_SPICY: - if (!moveTurn) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SPICY, caseID); - break; - case HOLD_EFFECT_CONFUSE_DRY: - if (!moveTurn) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_DRY, caseID); - break; - case HOLD_EFFECT_CONFUSE_SWEET: - if (!moveTurn) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SWEET, caseID); - break; - case HOLD_EFFECT_CONFUSE_BITTER: - if (!moveTurn) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_BITTER, caseID); - break; - case HOLD_EFFECT_CONFUSE_SOUR: - if (!moveTurn) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SOUR, caseID); - break; - case HOLD_EFFECT_ATTACK_UP: - if (!moveTurn) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_ATK, caseID); - break; - case HOLD_EFFECT_DEFENSE_UP: - if (!moveTurn) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_DEF, caseID); - break; - case HOLD_EFFECT_SPEED_UP: - if (!moveTurn) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPEED, caseID); - break; - case HOLD_EFFECT_SP_ATTACK_UP: - if (!moveTurn) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPATK, caseID); - break; - case HOLD_EFFECT_SP_DEFENSE_UP: - if (!moveTurn) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPDEF, caseID); - break; - case HOLD_EFFECT_CRITICAL_UP: - if (!moveTurn && !(gBattleMons[battler].status2 & STATUS2_FOCUS_ENERGY_ANY) - && HasEnoughHpToEatBerry(battler, GetBattlerItemHoldEffectParam(battler, gLastUsedItem), gLastUsedItem)) - { - gBattleMons[battler].status2 |= STATUS2_FOCUS_ENERGY; - gBattleScripting.battler = battler; - BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2); - effect = ITEM_EFFECT_OTHER; - } - break; - case HOLD_EFFECT_RANDOM_STAT_UP: - if (!moveTurn) - effect = RandomStatRaiseBerry(battler, gLastUsedItem, caseID); - break; - case HOLD_EFFECT_CURE_PAR: - if (gBattleMons[battler].status1 & STATUS1_PARALYSIS && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_PARALYSIS; - BattleScriptExecute(BattleScript_BerryCurePrlzEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_PSN: - if (gBattleMons[battler].status1 & STATUS1_PSN_ANY && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER); - BattleScriptExecute(BattleScript_BerryCurePsnEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_BRN: - if (gBattleMons[battler].status1 & STATUS1_BURN && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_BURN; - BattleScriptExecute(BattleScript_BerryCureBrnEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_FRZ: - if (gBattleMons[battler].status1 & STATUS1_FREEZE && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_FREEZE; - BattleScriptExecute(BattleScript_BerryCureFrzEnd2); - effect = ITEM_STATUS_CHANGE; - } - if (gBattleMons[battler].status1 & STATUS1_FROSTBITE && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_FROSTBITE; - BattleScriptExecute(BattleScript_BerryCureFrbEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_SLP: - if (gBattleMons[battler].status1 & STATUS1_SLEEP && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_SLEEP; - gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; - BattleScriptExecute(BattleScript_BerryCureSlpEnd2); - effect = ITEM_STATUS_CHANGE; - TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); - } - break; - case HOLD_EFFECT_CURE_CONFUSION: - if (gBattleMons[battler].status2 & STATUS2_CONFUSION && !UnnerveOn(battler, gLastUsedItem)) - { - RemoveConfusionStatus(battler); - BattleScriptExecute(BattleScript_BerryCureConfusionEnd2); - effect = ITEM_EFFECT_OTHER; - } - break; - case HOLD_EFFECT_CURE_STATUS: - effect = TryCureStatus(battler, caseID); - break; - case HOLD_EFFECT_MENTAL_HERB: - if (GetMentalHerbEffect(battler)) - { - gBattleScripting.savedBattler = gBattlerAttacker; - gBattlerAttacker = battler; - BattleScriptExecute(BattleScript_MentalHerbCureEnd2); - effect = ITEM_EFFECT_OTHER; - } - break; - case HOLD_EFFECT_MICLE_BERRY: - if (!moveTurn) - effect = TrySetMicleBerry(battler, gLastUsedItem, caseID); - break; - case HOLD_EFFECT_BERSERK_GENE: - effect = ConsumeBerserkGene(battler, caseID); - break; - case HOLD_EFFECT_MIRROR_HERB: - effect = TryConsumeMirrorHerb(battler, caseID); - break; - case HOLD_EFFECT_BOOSTER_ENERGY: - effect = TryBoosterEnergy(battler, caseID); - break; - default: - break; - } - - if (effect != 0) - { - gBattlerAttacker = gPotentialItemEffectBattler = gBattleScripting.battler = battler; - if (effect == ITEM_STATUS_CHANGE) - { - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - } - } - } - break; - case ITEMEFFECT_USE_LAST_ITEM: - effect = ItemEffectMoveEnd(battler, GetItemHoldEffect(gLastUsedItem)); - gBattleScripting.overrideBerryRequirements = 2; // to exit VARIOUS_CONSUME_BERRIES - if (effect) - { - gPotentialItemEffectBattler = gBattleScripting.battler = battler; - if (effect == ITEM_STATUS_CHANGE) - { - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - } - break; - } - break; - case ITEMEFFECT_MOVE_END: - for (battler = 0; battler < gBattlersCount; battler++) - { - gLastUsedItem = gBattleMons[battler].item; - effect = ItemEffectMoveEnd(battler, GetBattlerHoldEffect(battler, TRUE)); - if (effect) - { - gPotentialItemEffectBattler = gBattleScripting.battler = battler; - if (effect == ITEM_STATUS_CHANGE) - { - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - } - break; - } - } - break; - case ITEMEFFECT_KINGSROCK: - // Occur on each hit of a multi-strike move - switch (atkHoldEffect) - { - case HOLD_EFFECT_FLINCH: - { - u16 ability = GetBattlerAbility(gBattlerAttacker); - if (B_SERENE_GRACE_BOOST >= GEN_5 && ability == ABILITY_SERENE_GRACE) - atkHoldEffectParam *= 2; - if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_RAINBOW && gCurrentMove != MOVE_SECRET_POWER) - atkHoldEffectParam *= 2; - if (IsBattlerTurnDamaged(gBattlerTarget) - && !MoveIgnoresKingsRock(gCurrentMove) - && gBattleMons[gBattlerTarget].hp - && RandomPercentage(RNG_HOLD_EFFECT_FLINCH, atkHoldEffectParam) - && ability != ABILITY_STENCH) - { - gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH; - BattleScriptPushCursor(); - SetMoveEffect(FALSE, FALSE); - BattleScriptPop(); - } - } - break; - case HOLD_EFFECT_BLUNDER_POLICY: - if (gBattleStruct->blunderPolicy - && IsBattlerAlive(gBattlerAttacker) - && CompareStat(gBattlerAttacker, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN)) - { - gBattleStruct->blunderPolicy = FALSE; - gLastUsedItem = atkItem; - SET_STATCHANGER(STAT_SPEED, 2, FALSE); - effect = ITEM_STATS_CHANGE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AttackerItemStatRaise; - } - break; - default: - break; - } - break; - case ITEMEFFECT_LIFEORB_SHELLBELL: - // Occur after the final hit of a multi-strike move - switch (atkHoldEffect) - { - case HOLD_EFFECT_SHELL_BELL: - if (gBattleScripting.savedDmg > 0 - && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && gBattlerAttacker != gBattlerTarget - && !IsBattlerAtMaxHp(gBattlerAttacker) - && IsBattlerAlive(gBattlerAttacker) - && GetMoveEffect(gCurrentMove) != EFFECT_FUTURE_SIGHT - && GetMoveEffect(gCurrentMove) != EFFECT_PAIN_SPLIT - && (B_HEAL_BLOCKING < GEN_5 || !(gStatuses3[battler] & STATUS3_HEAL_BLOCK))) - { - gLastUsedItem = atkItem; - gPotentialItemEffectBattler = gBattlerAttacker; - gBattleScripting.battler = gBattlerAttacker; - gBattleStruct->moveDamage[gBattlerAttacker] = (gBattleScripting.savedDmg / atkHoldEffectParam) * -1; - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = -1; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ItemHealHP_Ret; - effect = ITEM_HP_CHANGE; - } - break; - case HOLD_EFFECT_LIFE_ORB: - if (IsBattlerAlive(gBattlerAttacker) - && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && !IsBattleMoveStatus(gCurrentMove) - && (IsBattlerTurnDamaged(gBattlerTarget) || !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) // Needs the second check in case of Substitute - && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && !IsFutureSightAttackerInParty(gBattlerAttacker, gBattlerTarget, gCurrentMove)) - { - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 10; - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - effect = ITEM_HP_CHANGE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ItemHurtRet; - gLastUsedItem = atkItem; - } - break; - case HOLD_EFFECT_THROAT_SPRAY: // Does NOT need to be a damaging move - if (IsSoundMove(gCurrentMove) - && IsBattlerAlive(gBattlerAttacker) - && IsAnyTargetAffected(gBattlerAttacker) - && CompareStat(gBattlerAttacker, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN) - && !NoAliveMonsForEitherParty()) // Don't activate if battle will end - { - gLastUsedItem = atkItem; - gBattleScripting.battler = gBattlerAttacker; - SET_STATCHANGER(STAT_SPATK, 1, FALSE); - effect = ITEM_STATS_CHANGE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AttackerItemStatRaise; - } - break; - default: - break; - } - break; - case ITEMEFFECT_TARGET: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) - { - moveType = GetBattleMoveType(gCurrentMove); - switch (battlerHoldEffect) - { - case HOLD_EFFECT_AIR_BALLOON: - if (IsBattlerTurnDamaged(gBattlerTarget)) - { - effect = ITEM_EFFECT_OTHER; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AirBaloonMsgPop; - } - break; - case HOLD_EFFECT_ROCKY_HELMET: - if (IsBattlerTurnDamaged(gBattlerTarget) - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS - && IsMoveMakingContact(gCurrentMove, gBattlerAttacker) - && IsBattlerAlive(gBattlerAttacker) - && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) - { - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 6; - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - effect = ITEM_HP_CHANGE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_RockyHelmetActivates; - PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); - RecordItemEffectBattle(battler, HOLD_EFFECT_ROCKY_HELMET); - } - break; - case HOLD_EFFECT_WEAKNESS_POLICY: - if (IsBattlerAlive(battler) - && IsBattlerTurnDamaged(gBattlerTarget) - && gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_SUPER_EFFECTIVE) - { - effect = ITEM_STATS_CHANGE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_WeaknessPolicy; - } - break; - case HOLD_EFFECT_SNOWBALL: - if (IsBattlerAlive(battler) - && IsBattlerTurnDamaged(gBattlerTarget) - && moveType == TYPE_ICE) - { - effect = ITEM_STATS_CHANGE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetItemStatRaise; - SET_STATCHANGER(STAT_ATK, 1, FALSE); - } - break; - case HOLD_EFFECT_LUMINOUS_MOSS: - if (IsBattlerAlive(battler) - && IsBattlerTurnDamaged(gBattlerTarget) - && moveType == TYPE_WATER) - { - effect = ITEM_STATS_CHANGE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetItemStatRaise; - SET_STATCHANGER(STAT_SPDEF, 1, FALSE); - } - break; - case HOLD_EFFECT_CELL_BATTERY: - if (IsBattlerAlive(battler) - && IsBattlerTurnDamaged(gBattlerTarget) - && moveType == TYPE_ELECTRIC) - { - effect = ITEM_STATS_CHANGE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetItemStatRaise; - SET_STATCHANGER(STAT_ATK, 1, FALSE); - } - break; - case HOLD_EFFECT_ABSORB_BULB: - if (IsBattlerAlive(battler) - && IsBattlerTurnDamaged(gBattlerTarget) - && moveType == TYPE_WATER) - { - effect = ITEM_STATS_CHANGE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetItemStatRaise; - SET_STATCHANGER(STAT_SPATK, 1, FALSE); - } - break; - case HOLD_EFFECT_ENIGMA_BERRY: // consume and heal if hit by super effective move - effect = TrySetEnigmaBerry(battler); - break; - case HOLD_EFFECT_JABOCA_BERRY: // consume and damage attacker if used physical move - if (IsBattlerAlive(gBattlerAttacker) - && IsBattlerTurnDamaged(gBattlerTarget) - && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) - && IsBattleMovePhysical(gCurrentMove) - && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) - { - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 8; - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - if (GetBattlerAbility(battler) == ABILITY_RIPEN) - gBattleStruct->moveDamage[gBattlerAttacker] *= 2; - - effect = ITEM_HP_CHANGE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_JabocaRowapBerryActivates; - PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); - RecordItemEffectBattle(battler, HOLD_EFFECT_JABOCA_BERRY); - } - break; - case HOLD_EFFECT_ROWAP_BERRY: // consume and damage attacker if used special move - if (IsBattlerAlive(gBattlerAttacker) - && IsBattlerTurnDamaged(gBattlerTarget) - && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) - && IsBattleMoveSpecial(gCurrentMove) - && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) - { - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 8; - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - if (GetBattlerAbility(battler) == ABILITY_RIPEN) - gBattleStruct->moveDamage[gBattlerAttacker] *= 2; - - effect = ITEM_HP_CHANGE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_JabocaRowapBerryActivates; - PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); - RecordItemEffectBattle(battler, HOLD_EFFECT_ROWAP_BERRY); - } - break; - case HOLD_EFFECT_KEE_BERRY: // consume and boost defense if used physical move - effect = DamagedStatBoostBerryEffect(battler, STAT_DEF, DAMAGE_CATEGORY_PHYSICAL); - break; - case HOLD_EFFECT_MARANGA_BERRY: // consume and boost sp. defense if used special move - effect = DamagedStatBoostBerryEffect(battler, STAT_SPDEF, DAMAGE_CATEGORY_SPECIAL); - break; - case HOLD_EFFECT_CURE_STATUS: // only Toxic Chain's interaction with Knock Off - case HOLD_EFFECT_CURE_PSN: - if (gBattleMons[battler].status1 & STATUS1_PSN_ANY && !UnnerveOn(battler, gLastUsedItem) && GetBattlerAbility(gBattlerAttacker) == ABILITY_TOXIC_CHAIN && GetMoveEffect(gCurrentMove) == EFFECT_KNOCK_OFF) - { - gBattleScripting.battler = battler; - gBattleMons[battler].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER); - BattleScriptExecute(BattleScript_BerryCurePsnEnd2); - BtlController_EmitSetMonData(battler, 0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_STICKY_BARB: - if (IsBattlerTurnDamaged(gBattlerTarget) - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS - && IsMoveMakingContact(gCurrentMove, gBattlerAttacker) - && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) - && IsBattlerAlive(gBattlerAttacker) - && CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) - && gBattleMons[gBattlerAttacker].item == ITEM_NONE) - { - // No sticky hold checks. - gEffectBattler = battler; // gEffectBattler = target - StealTargetItem(gBattlerAttacker, gBattlerTarget); // Attacker takes target's barb - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_StickyBarbTransfer; - effect = ITEM_EFFECT_OTHER; - } - break; - default: - break; - } - } - break; - case ITEMEFFECT_ORBS: - { - u16 battlerAbility = GetBattlerAbility(battler); - switch (battlerHoldEffect) - { - case HOLD_EFFECT_TOXIC_ORB: - if (CanBePoisoned(battler, battler, battlerAbility, battlerAbility)) // Can corrosion trigger toxic orb on itself? - { - effect = ITEM_STATUS_CHANGE; - gBattleMons[battler].status1 = STATUS1_TOXIC_POISON; - BattleScriptExecute(BattleScript_ToxicOrb); - RecordItemEffectBattle(battler, battlerHoldEffect); - } - break; - case HOLD_EFFECT_FLAME_ORB: - if (CanBeBurned(battler, battler, battlerAbility)) - { - effect = ITEM_STATUS_CHANGE; - gBattleMons[battler].status1 = STATUS1_BURN; - BattleScriptExecute(BattleScript_FlameOrb); - RecordItemEffectBattle(battler, battlerHoldEffect); - } - break; - case HOLD_EFFECT_STICKY_BARB: // Not an orb per se, but similar effect, and needs to NOT activate with pickpocket - if (battlerAbility != ABILITY_MAGIC_GUARD) - { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - BattleScriptExecute(BattleScript_ItemHurtEnd2); - effect = ITEM_HP_CHANGE; - RecordItemEffectBattle(battler, battlerHoldEffect); - PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); - } - break; - default: - break; - } - - if (effect == ITEM_STATUS_CHANGE) - { - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - } - } - break; - case ITEMEFFECT_STATS_CHANGED: - switch (battlerHoldEffect) - { - case HOLD_EFFECT_WHITE_HERB: - effect = RestoreWhiteHerbStats(battler); - if (effect != 0) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_WhiteHerbRet; - } - break; - default: - break; - } - break; - } - - // Berry was successfully used on a Pokemon. - if (effect && (gLastUsedItem >= FIRST_BERRY_INDEX && gLastUsedItem <= LAST_BERRY_INDEX)) - gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].ateBerry = TRUE; - - return effect; -} - -void ClearVariousBattlerFlags(u32 battler) -{ - gDisableStructs[battler].furyCutterCounter = 0; - gBattleMons[battler].status2 &= ~STATUS2_DESTINY_BOND; - gStatuses3[battler] &= ~STATUS3_GRUDGE; - gStatuses4[battler] &= ~ STATUS4_GLAIVE_RUSH; -} - -void HandleAction_RunBattleScript(void) // identical to RunBattleScriptCommands -{ - if (gBattleControllerExecFlags == 0) - gBattleScriptingCommandsTable[*gBattlescriptCurrInstr](); -} - -u32 SetRandomTarget(u32 battlerAtk) -{ - u32 target; - static const u8 targets[2][2] = - { - [B_SIDE_PLAYER] = {B_POSITION_OPPONENT_LEFT, B_POSITION_OPPONENT_RIGHT}, - [B_SIDE_OPPONENT] = {B_POSITION_PLAYER_LEFT, B_POSITION_PLAYER_RIGHT}, - }; - - if (IsDoubleBattle()) - { - target = GetBattlerAtPosition(targets[GetBattlerSide(battlerAtk)][RandomUniform(RNG_RANDOM_TARGET, 0, 1)]); - if (!IsBattlerAlive(target)) - target ^= BIT_FLANK; - } - else - { - target = GetBattlerAtPosition(targets[GetBattlerSide(battlerAtk)][0]); - } - - return target; -} - -u32 GetBattleMoveTarget(u16 move, u8 setTarget) -{ - u8 targetBattler = 0; - u32 moveTarget, side; - u32 moveType = GetBattleMoveType(move); - - if (setTarget != NO_TARGET_OVERRIDE) - moveTarget = setTarget - 1; - else - moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, move); - - switch (moveTarget) - { - case MOVE_TARGET_SELECTED: - case MOVE_TARGET_OPPONENT: - side = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker)); - if (IsAffectedByFollowMe(gBattlerAttacker, side, move)) - { - targetBattler = gSideTimers[side].followmeTarget; - } - else - { - u32 battlerAbilityOnField = 0; - - targetBattler = SetRandomTarget(gBattlerAttacker); - if (moveType == TYPE_ELECTRIC && GetBattlerAbility(targetBattler) != ABILITY_LIGHTNING_ROD) - { - if (B_REDIRECT_ABILITY_ALLIES >= GEN_4) - battlerAbilityOnField = IsAbilityOnField(ABILITY_LIGHTNING_ROD); - else - battlerAbilityOnField = IsAbilityOnOpposingSide(targetBattler, ABILITY_LIGHTNING_ROD); - - if (battlerAbilityOnField > 0) - { - targetBattler = battlerAbilityOnField - 1; - RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability); - gSpecialStatuses[targetBattler].lightningRodRedirected = TRUE; - } - } - else if (moveType == TYPE_WATER && GetBattlerAbility(targetBattler) != ABILITY_STORM_DRAIN) - { - if (B_REDIRECT_ABILITY_ALLIES >= GEN_4) - battlerAbilityOnField = IsAbilityOnField(ABILITY_STORM_DRAIN); - else - battlerAbilityOnField = IsAbilityOnOpposingSide(targetBattler, ABILITY_STORM_DRAIN); - - if (battlerAbilityOnField > 0) - { - targetBattler = battlerAbilityOnField - 1; - RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability); - gSpecialStatuses[targetBattler].lightningRodRedirected = TRUE; - } - } - } - break; - case MOVE_TARGET_DEPENDS: - case MOVE_TARGET_BOTH: - case MOVE_TARGET_FOES_AND_ALLY: - targetBattler = GetOpposingSideBattler(gBattlerAttacker); - if (!IsBattlerAlive(targetBattler)) - targetBattler ^= BIT_FLANK; - break; - case MOVE_TARGET_OPPONENTS_FIELD: - targetBattler = GetOpposingSideBattler(gBattlerAttacker); - break; - case MOVE_TARGET_RANDOM: - side = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker)); - if (IsAffectedByFollowMe(gBattlerAttacker, side, move)) - targetBattler = gSideTimers[side].followmeTarget; - else if (IsDoubleBattle() && moveTarget & MOVE_TARGET_RANDOM) - targetBattler = SetRandomTarget(gBattlerAttacker); - else - targetBattler = GetOpposingSideBattler(gBattlerAttacker); - break; - case MOVE_TARGET_USER: - default: - targetBattler = gBattlerAttacker; - break; - case MOVE_TARGET_ALLY: - if (IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker))) - targetBattler = BATTLE_PARTNER(gBattlerAttacker); - else - targetBattler = gBattlerAttacker; - break; - } - - gBattleStruct->moveTarget[gBattlerAttacker] = targetBattler; - - return targetBattler; -} - -u8 GetAttackerObedienceForAction() -{ - s32 rnd; - s32 calc; - u8 obedienceLevel = 0; - u8 levelReferenced; - - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) - return OBEYS; - if (BattlerHasAi(gBattlerAttacker)) - return OBEYS; - - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBattlerPosition(gBattlerAttacker) == B_POSITION_PLAYER_RIGHT) - return OBEYS; - if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) - return OBEYS; - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) - return OBEYS; - if (B_OBEDIENCE_MECHANICS < GEN_8 && !IsOtherTrainer(gBattleMons[gBattlerAttacker].otId, gBattleMons[gBattlerAttacker].otName)) - return OBEYS; - if (FlagGet(FLAG_BADGE08_GET)) // Rain Badge, ignore obedience altogether - return OBEYS; - - obedienceLevel = 10; - - if (FlagGet(FLAG_BADGE01_GET)) // Stone Badge - obedienceLevel = 20; - if (FlagGet(FLAG_BADGE02_GET)) // Knuckle Badge - obedienceLevel = 30; - if (FlagGet(FLAG_BADGE03_GET)) // Dynamo Badge - obedienceLevel = 40; - if (FlagGet(FLAG_BADGE04_GET)) // Heat Badge - obedienceLevel = 50; - if (FlagGet(FLAG_BADGE05_GET)) // Balance Badge - obedienceLevel = 60; - if (FlagGet(FLAG_BADGE06_GET)) // Feather Badge - obedienceLevel = 70; - if (FlagGet(FLAG_BADGE07_GET)) // Mind Badge - obedienceLevel = 80; - - if (B_OBEDIENCE_MECHANICS >= GEN_8 - && !IsOtherTrainer(gBattleMons[gBattlerAttacker].otId, gBattleMons[gBattlerAttacker].otName)) - levelReferenced = gBattleMons[gBattlerAttacker].metLevel; - else - levelReferenced = gBattleMons[gBattlerAttacker].level; - - if (levelReferenced <= obedienceLevel) - return OBEYS; - - rnd = Random(); - calc = (levelReferenced + obedienceLevel) * (rnd & 255) >> 8; - if (calc < obedienceLevel) - return OBEYS; - - // Clear the Z-Move flags if the battler is disobedient as to not waste the Z-Move - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE) - { - gBattleStruct->gimmick.activated[gBattlerAttacker][GIMMICK_Z_MOVE] = FALSE; - gBattleStruct->gimmick.activeGimmick[GetBattlerSide(gBattlerAttacker)][gBattlerPartyIndexes[gBattlerAttacker]] = GIMMICK_NONE; - } - - // is not obedient - enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); - if (moveEffect == EFFECT_RAGE) - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_RAGE; - if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP && (moveEffect == EFFECT_SNORE || moveEffect == EFFECT_SLEEP_TALK)) - return DISOBEYS_WHILE_ASLEEP; - - calc = (levelReferenced + obedienceLevel) * ((rnd >> 8) & 255) >> 8; - if (calc < obedienceLevel) - { - calc = CheckMoveLimitations(gBattlerAttacker, 1u << gCurrMovePos, MOVE_LIMITATIONS_ALL); - if (calc == ALL_MOVES_MASK) // all moves cannot be used - return DISOBEYS_LOAFS; - else // use a random move - do - gCurrMovePos = gChosenMovePos = MOD(Random(), MAX_MON_MOVES); - while ((1u << gCurrMovePos) & calc); - return DISOBEYS_RANDOM_MOVE; - } - else - { - obedienceLevel = levelReferenced - obedienceLevel; - - calc = ((rnd >> 16) & 255); - if (calc < obedienceLevel && CanBeSlept(gBattlerAttacker, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), NOT_BLOCKED_BY_SLEEP_CLAUSE)) - { - // try putting asleep - int i; - for (i = 0; i < gBattlersCount; i++) - if (gBattleMons[i].status2 & STATUS2_UPROAR) - break; - if (i == gBattlersCount) - return DISOBEYS_FALL_ASLEEP; - } - calc -= obedienceLevel; - if (calc < obedienceLevel) - return DISOBEYS_HITS_SELF; - else - return DISOBEYS_LOAFS; - } -} - -enum ItemHoldEffect GetBattlerHoldEffect(u32 battler, bool32 checkNegating) -{ - return GetBattlerHoldEffectInternal(battler, checkNegating, TRUE); -} - -enum ItemHoldEffect GetBattlerHoldEffectIgnoreAbility(u32 battler, bool32 checkNegating) -{ - return GetBattlerHoldEffectInternal(battler, checkNegating, FALSE); -} - -enum ItemHoldEffect GetBattlerHoldEffectInternal(u32 battler, bool32 checkNegating, bool32 checkAbility) -{ - if (checkNegating) - { - if (gStatuses3[battler] & STATUS3_EMBARGO) - return HOLD_EFFECT_NONE; - if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) - return HOLD_EFFECT_NONE; - if (checkAbility && GetBattlerAbility(battler) == ABILITY_KLUTZ && !(gStatuses3[battler] & STATUS3_GASTRO_ACID)) - return HOLD_EFFECT_NONE; - } - - gPotentialItemEffectBattler = battler; - - if (gBattleMons[battler].item == ITEM_ENIGMA_BERRY_E_READER) - return gEnigmaBerries[battler].holdEffect; - else - return GetItemHoldEffect(gBattleMons[battler].item); -} - -static u32 GetBattlerItemHoldEffectParam(u32 battler, u32 item) -{ - if (item == ITEM_ENIGMA_BERRY_E_READER) - return gEnigmaBerries[battler].holdEffectParam; - else - return GetItemHoldEffectParam(item); -} - -u32 GetBattlerHoldEffectParam(u32 battler) -{ - if (gBattleMons[battler].item == ITEM_ENIGMA_BERRY_E_READER) - return gEnigmaBerries[battler].holdEffectParam; - else - return GetItemHoldEffectParam(gBattleMons[battler].item); -} - -bool32 IsMoveMakingContact(u32 move, u32 battlerAtk) -{ - enum ItemHoldEffect atkHoldEffect = GetBattlerHoldEffect(battlerAtk, TRUE); - - if (!MoveMakesContact(move)) - { - if (GetMoveEffect(move) == EFFECT_SHELL_SIDE_ARM && gBattleStruct->shellSideArmCategory[battlerAtk][gBattlerTarget] == DAMAGE_CATEGORY_PHYSICAL) - return TRUE; - else - return FALSE; - } - else if ((atkHoldEffect == HOLD_EFFECT_PUNCHING_GLOVE && IsPunchingMove(move)) - || GetBattlerAbility(battlerAtk) == ABILITY_LONG_REACH) - { - return FALSE; - } - else - { - return TRUE; - } -} - -static inline bool32 IsSideProtected(u32 battler, enum ProtectMethod method) -{ - return gProtectStructs[battler].protected == method - || gProtectStructs[BATTLE_PARTNER(battler)].protected == method; -} - -bool32 IsBattlerProtected(u32 battlerAtk, u32 battlerDef, u32 move) -{ - if (gProtectStructs[battlerDef].protected == PROTECT_NONE - && gProtectStructs[BATTLE_PARTNER(battlerDef)].protected == PROTECT_NONE) - return FALSE; - - if (gProtectStructs[battlerDef].protected != PROTECT_MAX_GUARD && !MoveIgnoresProtect(move)) - { - if (IsZMove(move) || IsMaxMove(move)) - return FALSE; // Z-Moves and Max Moves bypass protection (except Max Guard). - if (IsMoveMakingContact(move, battlerAtk) && GetBattlerAbility(battlerAtk) == ABILITY_UNSEEN_FIST) - return FALSE; - } - - bool32 isProtected = FALSE; - - if (IsSideProtected(battlerDef, PROTECT_CRAFTY_SHIELD) - && IsBattleMoveStatus(move) - && GetMoveEffect(move) != EFFECT_COACHING) - isProtected = TRUE; - else if (MoveIgnoresProtect(move)) - isProtected = FALSE; - else if (IsSideProtected(battlerDef, PROTECT_WIDE_GUARD) && IsSpreadMove(GetBattlerMoveTargetType(battlerAtk, move))) - isProtected = TRUE; - else if (gProtectStructs[battlerDef].protected == PROTECT_NORMAL) - isProtected = TRUE; - else if (gProtectStructs[battlerDef].protected == PROTECT_SPIKY_SHIELD) - isProtected = TRUE; - else if (gProtectStructs[battlerDef].protected == PROTECT_MAX_GUARD) - isProtected = TRUE; - else if (gProtectStructs[battlerDef].protected == PROTECT_BANEFUL_BUNKER) - isProtected = TRUE; - else if (gProtectStructs[battlerDef].protected == PROTECT_BURNING_BULWARK) - isProtected = TRUE; - else if (gProtectStructs[battlerDef].protected == PROTECT_OBSTRUCT && !IsBattleMoveStatus(move)) - isProtected = TRUE; - else if (gProtectStructs[battlerDef].protected == PROTECT_SILK_TRAP && !IsBattleMoveStatus(move)) - isProtected = TRUE; - else if (gProtectStructs[battlerDef].protected == PROTECT_KINGS_SHIELD && !IsBattleMoveStatus(move)) - isProtected = TRUE; - else if (IsSideProtected(battlerDef, PROTECT_QUICK_GUARD) && GetChosenMovePriority(battlerAtk, GetBattlerAbility(battlerAtk)) > 0) - isProtected = TRUE; - else if (IsSideProtected(battlerDef, PROTECT_MAT_BLOCK) && !IsBattleMoveStatus(move)) - isProtected = TRUE; - else - isProtected = FALSE; - - if (isProtected) - gBattleStruct->missStringId[battlerDef] = gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED; - - return isProtected; -} - -u32 GetProtectType(enum ProtectMethod method) -{ - switch (method) - { - case PROTECT_NONE: - return PROTECT_TYPE_NONE; - case PROTECT_NORMAL: - case PROTECT_SPIKY_SHIELD: - case PROTECT_KINGS_SHIELD: - case PROTECT_BANEFUL_BUNKER: - case PROTECT_BURNING_BULWARK: - case PROTECT_OBSTRUCT: - case PROTECT_SILK_TRAP: - case PROTECT_MAX_GUARD: - return PROTECT_TYPE_SINGLE; - case PROTECT_WIDE_GUARD: - case PROTECT_QUICK_GUARD: - case PROTECT_CRAFTY_SHIELD: - case PROTECT_MAT_BLOCK: - return PROTECT_TYPE_SIDE; - } - - return FALSE; -} - -enum InverseBattleCheck -{ - INVERSE_BATTLE, - NOT_INVERSE_BATTLE -}; - -enum IronBallCheck -{ - CHECK_IRON_BALL, - IGNORE_IRON_BALL -}; - -// Only called directly when calculating damage type effectiveness, and Iron Ball's type effectiveness mechanics -static bool32 IsBattlerGroundedInverseCheck(u32 battler, enum InverseBattleCheck checkInverse, enum IronBallCheck checkIronBall) -{ - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); - - if (!(checkIronBall == IGNORE_IRON_BALL) && holdEffect == HOLD_EFFECT_IRON_BALL) - return TRUE; - if (gFieldStatuses & STATUS_FIELD_GRAVITY) - return TRUE; - if (B_ROOTED_GROUNDING >= GEN_4 && gStatuses3[battler] & STATUS3_ROOTED) - return TRUE; - if (gStatuses3[battler] & STATUS3_SMACKED_DOWN) - return TRUE; - if (gStatuses3[battler] & STATUS3_TELEKINESIS) - return FALSE; - if (gStatuses3[battler] & STATUS3_MAGNET_RISE) - return FALSE; - if (holdEffect == HOLD_EFFECT_AIR_BALLOON) - return FALSE; - if ((gAiLogicData->aiCalcInProgress ? gAiLogicData->abilities[battler] : GetBattlerAbility(battler)) == ABILITY_LEVITATE) - return FALSE; - if (IS_BATTLER_OF_TYPE(battler, TYPE_FLYING) && (!(checkInverse == INVERSE_BATTLE) || !FlagGet(B_FLAG_INVERSE_BATTLE))) - return FALSE; - return TRUE; -} - -bool32 IsBattlerGrounded(u32 battler) -{ - return IsBattlerGroundedInverseCheck(battler, NOT_INVERSE_BATTLE, CHECK_IRON_BALL); -} - -u32 GetMoveSlot(u16 *moves, u32 move) -{ - u32 i; - - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (moves[i] == move) - break; - } - return i; -} - -u32 GetBattlerWeight(u32 battler) -{ - u32 i; - u32 weight = GetSpeciesWeight(gBattleMons[battler].species); - u32 ability = GetBattlerAbility(battler); - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); - - if (ability == ABILITY_HEAVY_METAL) - weight *= 2; - else if (ability == ABILITY_LIGHT_METAL) - weight /= 2; - - if (holdEffect == HOLD_EFFECT_FLOAT_STONE) - weight /= 2; - - for (i = 0; i < gDisableStructs[battler].autotomizeCount; i++) - { - if (weight > 1000) - { - weight -= 1000; - } - else if (weight <= 1000) - { - weight = 1; - break; - } - } - - if (weight == 0) - weight = 1; - - return weight; -} - -u32 CountBattlerStatIncreases(u32 battler, bool32 countEvasionAcc) -{ - u32 i; - u32 count = 0; - - for (i = 0; i < NUM_BATTLE_STATS; i++) - { - if ((i == STAT_ACC || i == STAT_EVASION) && !countEvasionAcc) - continue; - if (gBattleMons[battler].statStages[i] > DEFAULT_STAT_STAGE) // Stat is increased. - count += gBattleMons[battler].statStages[i] - DEFAULT_STAT_STAGE; - } - - return count; -} - -u32 GetMoveTargetCount(struct DamageCalculationData *damageCalcData) -{ - u32 battlerAtk = damageCalcData->battlerAtk; - u32 battlerDef = damageCalcData->battlerDef; - u32 move = damageCalcData->move; - - switch (GetBattlerMoveTargetType(battlerAtk, move)) + switch (GetBattlerMoveTargetType(battlerAtk, move)) { case MOVE_TARGET_BOTH: return !(gAbsentBattlerFlags & (1u << battlerDef)) @@ -8032,7 +6946,7 @@ u32 CalcRolloutBasePower(u32 battlerAtk, u32 basePower, u32 rolloutTimer) u32 i; for (i = 1; i < (5 - rolloutTimer); i++) basePower *= 2; - if (gBattleMons[battlerAtk].status2 & STATUS2_DEFENSE_CURL) + if (gBattleMons[battlerAtk].volatiles.defenseCurl) basePower *= 2; return basePower; } @@ -8045,23 +6959,58 @@ u32 CalcFuryCutterBasePower(u32 basePower, u32 furyCutterCounter) return basePower; } -static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData, u32 abilityDef, u32 weather) +static inline u32 IsFieldMudSportAffected(enum Type moveType) +{ + if (moveType == TYPE_ELECTRIC && (gFieldStatuses & STATUS_FIELD_MUDSPORT)) + return TRUE; + + if (B_SPORT_TURNS < GEN_6) + { + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (gBattleMons[battler].volatiles.mudSport) + return TRUE; + } + } + + return FALSE; +} + +static inline u32 IsFieldWaterSportAffected(enum Type moveType) +{ + if (moveType == TYPE_FIRE && (gFieldStatuses & STATUS_FIELD_WATERSPORT)) + return TRUE; + + if (B_SPORT_TURNS < GEN_6) + { + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (gBattleMons[battler].volatiles.waterSport) + return TRUE; + } + } + + return FALSE; +} + +static inline u32 CalcMoveBasePower(struct DamageContext *ctx) { - u32 battlerAtk = damageCalcData->battlerAtk; - u32 battlerDef = damageCalcData->battlerDef; - u32 move = damageCalcData->move; + u32 battlerAtk = ctx->battlerAtk; + u32 battlerDef = ctx->battlerDef; + u32 move = ctx->move; u32 i; u32 basePower = GetMovePower(move); + u32 moveEffect = GetMoveEffect(move); u32 weight, hpFraction, speed; if (GetActiveGimmick(battlerAtk) == GIMMICK_Z_MOVE) - return GetZMovePower(gBattleStruct->zmove.baseMoves[battlerAtk]); + return GetZMovePower(gCurrentMove); if (GetActiveGimmick(battlerAtk) == GIMMICK_DYNAMAX) return GetMaxMovePower(move); - switch (GetMoveEffect(move)) + switch (moveEffect) { case EFFECT_PLEDGE: if (gBattleStruct->pledgeMove) @@ -8107,14 +7056,11 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData basePower = 100 * gDisableStructs[battlerAtk].stockpileCounter; break; case EFFECT_REVENGE: - if ((gProtectStructs[battlerAtk].physicalDmg - && gProtectStructs[battlerAtk].physicalBattlerId == battlerDef) - || (gProtectStructs[battlerAtk].specialDmg - && gProtectStructs[battlerAtk].specialBattlerId == battlerDef)) + if (gProtectStructs[battlerAtk].revengeDoubled & 1u << battlerDef) basePower *= 2; break; case EFFECT_WEATHER_BALL: - if (weather & B_WEATHER_ANY) + if (ctx->weather & B_WEATHER_ANY) basePower *= 2; break; case EFFECT_PURSUIT: @@ -8126,7 +7072,7 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData break; case EFFECT_DOUBLE_POWER_ON_ARG_STATUS: // Comatose targets treated as if asleep - if ((gBattleMons[battlerDef].status1 | (STATUS1_SLEEP * (abilityDef == ABILITY_COMATOSE))) & GetMoveEffectArg_Status(move) + if ((gBattleMons[battlerDef].status1 | (STATUS1_SLEEP * (ctx->abilityDef == ABILITY_COMATOSE))) & GetMoveEffectArg_Status(move) && !((GetMoveAdditionalEffectById(move, 0)->moveEffect == MOVE_EFFECT_REMOVE_STATUS) && DoesSubstituteBlockMove(battlerAtk, battlerDef, move))) basePower *= 2; break; @@ -8134,7 +7080,7 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData basePower = gBattleMons[battlerDef].hp * basePower / gBattleMons[battlerDef].maxHP; break; case EFFECT_ASSURANCE: - if (gProtectStructs[battlerDef].physicalDmg != 0 || gProtectStructs[battlerDef].specialDmg != 0 || gProtectStructs[battlerDef].confusionSelfDmg) + if (gProtectStructs[battlerDef].assuranceDoubled) basePower *= 2; break; case EFFECT_TRUMP_CARD: @@ -8150,7 +7096,7 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData case EFFECT_ACROBATICS: if (gBattleMons[battlerAtk].item == ITEM_NONE // Edge case, because removal of items happens after damage calculation. - || (gSpecialStatuses[battlerAtk].gemBoost && GetBattlerHoldEffect(battlerAtk, FALSE) == HOLD_EFFECT_GEMS)) + || (gSpecialStatuses[battlerAtk].gemBoost && GetBattlerHoldEffect(battlerAtk) == HOLD_EFFECT_GEMS)) basePower *= 2; break; case EFFECT_LOW_KICK: @@ -8181,3283 +7127,4135 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData basePower += (CountBattlerStatIncreases(battlerAtk, TRUE) * 20); break; case EFFECT_ELECTRO_BALL: - speed = GetBattlerTotalSpeedStat(battlerAtk) / GetBattlerTotalSpeedStat(battlerDef); + speed = GetBattlerTotalSpeedStat(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk) / GetBattlerTotalSpeedStat(battlerDef, ctx->abilityDef, ctx->holdEffectDef); if (speed >= ARRAY_COUNT(sSpeedDiffPowerTable)) speed = ARRAY_COUNT(sSpeedDiffPowerTable) - 1; basePower = sSpeedDiffPowerTable[speed]; break; case EFFECT_GYRO_BALL: - basePower = ((25 * GetBattlerTotalSpeedStat(battlerDef)) / GetBattlerTotalSpeedStat(battlerAtk)) + 1; - if (basePower > 150) - basePower = 150; - break; + { + u32 attackerSpeed = GetBattlerTotalSpeedStat(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk); + if (attackerSpeed == 0) + { + basePower = 1; + } + else + { + basePower = ((25 * GetBattlerTotalSpeedStat(battlerDef, ctx->abilityDef, ctx->holdEffectDef)) / attackerSpeed) + 1; + if (basePower > 150) + basePower = 150; + } + break; + } case EFFECT_ECHOED_VOICE: - // gBattleStruct->sameMoveTurns incremented in ppreduce - if (gBattleStruct->sameMoveTurns[battlerAtk] != 0) + // gBattleStruct->echoedVoiceCounter incremented in EndTurnVarious called by DoEndTurnEffects + if (gBattleStruct->echoedVoiceCounter != 0) { - basePower += (basePower * gBattleStruct->sameMoveTurns[battlerAtk]); + basePower += (basePower * gBattleStruct->echoedVoiceCounter); if (basePower > 200) basePower = 200; } break; - case EFFECT_PAYBACK: - if (GetBattlerTurnOrderNum(battlerAtk) > GetBattlerTurnOrderNum(battlerDef) - && (B_PAYBACK_SWITCH_BOOST < GEN_5 || gDisableStructs[battlerDef].isFirstTurn != 2)) - basePower *= 2; + case EFFECT_PAYBACK: + if (HasBattlerActedThisTurn(battlerDef) + && (B_PAYBACK_SWITCH_BOOST < GEN_5 || gDisableStructs[battlerDef].isFirstTurn != 2)) + basePower *= 2; + break; + case EFFECT_BOLT_BEAK: + if (!HasBattlerActedThisTurn(battlerDef) + || gDisableStructs[battlerDef].isFirstTurn == 2) + basePower *= 2; + break; + case EFFECT_FUSION_COMBO: + if (move == gLastUsedMove) + break; + // fallthrough + case EFFECT_ROUND: + // don't double power due to previous turn's Round/Fusion move + if (gCurrentTurnActionNumber != 0 + && gActionsByTurnOrder[gCurrentTurnActionNumber - 1] == B_ACTION_USE_MOVE + && GetMoveEffect(gLastUsedMove) == moveEffect) + basePower *= 2; + break; + case EFFECT_LASH_OUT: + if (gProtectStructs[battlerAtk].lashOutAffected) + basePower *= 2; + break; + case EFFECT_MISTY_EXPLOSION: + if (IsBattlerTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, STATUS_FIELD_MISTY_TERRAIN)) + basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); + break; + case EFFECT_DYNAMAX_DOUBLE_DMG: + if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) + basePower *= 2; + break; + case EFFECT_HIDDEN_POWER: + { + if (B_HIDDEN_POWER_DMG < GEN_6) + { + u8 powerBits = ((gBattleMons[battlerAtk].hpIV & 2) >> 1) + | ((gBattleMons[battlerAtk].attackIV & 2) << 0) + | ((gBattleMons[battlerAtk].defenseIV & 2) << 1) + | ((gBattleMons[battlerAtk].speedIV & 2) << 2) + | ((gBattleMons[battlerAtk].spAttackIV & 2) << 3) + | ((gBattleMons[battlerAtk].spDefenseIV & 2) << 4); + + basePower = (40 * powerBits) / 63 + 30; + } + break; + } + case EFFECT_GRAV_APPLE: + if (gFieldStatuses & STATUS_FIELD_GRAVITY) + basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); + break; + case EFFECT_TERRAIN_PULSE: + if (IsBattlerTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, STATUS_FIELD_TERRAIN_ANY)) + basePower *= 2; + break; + case EFFECT_EXPANDING_FORCE: + if (IsBattlerTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, STATUS_FIELD_PSYCHIC_TERRAIN)) + basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); + break; + case EFFECT_RISING_VOLTAGE: + if (IsBattlerTerrainAffected(battlerDef, ctx->abilityDef, ctx->holdEffectDef, STATUS_FIELD_ELECTRIC_TERRAIN)) + basePower *= 2; + break; + case EFFECT_BEAT_UP: + if (GetConfig(CONFIG_BEAT_UP) >= GEN_5) + basePower = CalcBeatUpPower(); + break; + case EFFECT_PSYBLADE: + if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) + basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); + break; + case EFFECT_MAX_MOVE: + basePower = GetMaxMovePower(GetChosenMoveFromPosition(battlerAtk)); + break; + case EFFECT_RAGE_FIST: + basePower += 50 * GetBattlerPartyState(battlerAtk)->timesGotHit; + basePower = (basePower > 350) ? 350 : basePower; + break; + case EFFECT_FICKLE_BEAM: + if (gBattleStruct->fickleBeamBoosted) + basePower *= 2; + break; + case EFFECT_TERA_BLAST: + if (GetActiveGimmick(battlerAtk) == GIMMICK_TERA && GetBattlerTeraType(battlerAtk) == TYPE_STELLAR) + basePower = 100; + break; + case EFFECT_LAST_RESPECTS: + basePower += (basePower * min(100, GetBattlerSideFaintCounter(battlerAtk))); + break; + default: + break; + } + + // Move-specific base power changes + switch (move) + { + case MOVE_WATER_SHURIKEN: + if (gBattleMons[battlerAtk].species == SPECIES_GRENINJA_ASH) + basePower = 20; + break; + } + + if (basePower == 0) + basePower = 1; + return basePower; +} + +static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) +{ + u32 holdEffectParamAtk; + u32 basePower = CalcMoveBasePower(ctx); + u32 battlerAtk = ctx->battlerAtk; + u32 battlerDef = ctx->battlerDef; + u32 move = ctx->move; + enum Type moveType = ctx->moveType; + enum BattleMoveEffects moveEffect = GetMoveEffect(move); + + uq4_12_t holdEffectModifier; + uq4_12_t modifier = UQ_4_12(1.0); + u32 atkSide = GetBattlerSide(battlerAtk); + + // move effect + switch (moveEffect) + { + case EFFECT_FACADE: + if (gBattleMons[battlerAtk].status1 & (STATUS1_BURN | STATUS1_PSN_ANY | STATUS1_PARALYSIS | STATUS1_FROSTBITE)) + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); + break; + case EFFECT_BRINE: + if (gBattleMons[battlerDef].hp <= (gBattleMons[battlerDef].maxHP / 2)) + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); + break; + case EFFECT_RETALIATE: + if (gSideTimers[atkSide].retaliateTimer == 1) + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); + break; + case EFFECT_SOLAR_BEAM: + if (IsBattlerWeatherAffected(battlerAtk, (B_WEATHER_HAIL | B_WEATHER_SANDSTORM | B_WEATHER_RAIN | B_WEATHER_SNOW | B_WEATHER_FOG))) + modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); + break; + case EFFECT_STOMPING_TANTRUM: + if (gBattleStruct->battlerState[battlerAtk].stompingTantrumTimer == 1) + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); + break; + case EFFECT_MAGNITUDE: + case EFFECT_EARTHQUAKE: + if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && !IsSemiInvulnerable(battlerDef, CHECK_ALL)) + modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); + break; + case EFFECT_KNOCK_OFF: + if (B_KNOCK_OFF_DMG >= GEN_6 + && gBattleMons[battlerDef].item != ITEM_NONE + && CanBattlerGetOrLoseItem(battlerDef, gBattleMons[battlerDef].item)) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); + break; + default: + break; + } + + // various effects + for (u32 i = 0; i < gProtectStructs[battlerAtk].helpingHand; i++) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); + + if (gSpecialStatuses[battlerAtk].gemBoost) + modifier = uq4_12_multiply(modifier, uq4_12_add(UQ_4_12(1.0), PercentToUQ4_12(gSpecialStatuses[battlerAtk].gemParam))); + if (moveType == TYPE_ELECTRIC && gBattleMons[battlerAtk].volatiles.chargeTimer > 0) + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); + if (GetMoveEffect(ctx->chosenMove) == EFFECT_ME_FIRST) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); + if (IsBattlerTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, STATUS_FIELD_GRASSY_TERRAIN) && moveType == TYPE_GRASS) + modifier = uq4_12_multiply(modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8 ? UQ_4_12(1.3) : UQ_4_12(1.5))); + if (IsBattlerTerrainAffected(battlerDef, ctx->abilityDef, ctx->holdEffectDef, STATUS_FIELD_MISTY_TERRAIN) && moveType == TYPE_DRAGON) + modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); + if (IsBattlerTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, STATUS_FIELD_ELECTRIC_TERRAIN) && moveType == TYPE_ELECTRIC) + modifier = uq4_12_multiply(modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8 ? UQ_4_12(1.3) : UQ_4_12(1.5))); + if (IsBattlerTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, STATUS_FIELD_PSYCHIC_TERRAIN) && moveType == TYPE_PSYCHIC) + modifier = uq4_12_multiply(modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8 ? UQ_4_12(1.3) : UQ_4_12(1.5))); + if (IsFieldMudSportAffected(ctx->moveType)) + modifier = uq4_12_multiply(modifier, UQ_4_12(B_SPORT_DMG_REDUCTION >= GEN_5 ? 0.33 : 0.5)); + if (IsFieldWaterSportAffected(ctx->moveType)) + modifier = uq4_12_multiply(modifier, UQ_4_12(B_SPORT_DMG_REDUCTION >= GEN_5 ? 0.33 : 0.5)); + + // attacker's abilities + switch (ctx->abilityAtk) + { + case ABILITY_TECHNICIAN: + if (basePower <= 60) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); + break; + case ABILITY_FLARE_BOOST: + if (gBattleMons[battlerAtk].status1 & STATUS1_BURN && IsBattleMoveSpecial(move)) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); + break; + case ABILITY_TOXIC_BOOST: + if (gBattleMons[battlerAtk].status1 & STATUS1_PSN_ANY && IsBattleMovePhysical(move)) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); + break; + case ABILITY_RECKLESS: + if (moveEffect == EFFECT_RECOIL || moveEffect == EFFECT_RECOIL_IF_MISS) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); + break; + case ABILITY_IRON_FIST: + if (IsPunchingMove(move)) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); + break; + case ABILITY_SHEER_FORCE: + if (MoveIsAffectedBySheerForce(move)) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); + break; + case ABILITY_SAND_FORCE: + if ((moveType == TYPE_STEEL || moveType == TYPE_ROCK || moveType == TYPE_GROUND) + && ctx->weather & B_WEATHER_SANDSTORM) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); + break; + case ABILITY_RIVALRY: + if (AreBattlersOfSameGender(battlerAtk, battlerDef)) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.25)); + else if (AreBattlersOfOppositeGender(battlerAtk, battlerDef)) + modifier = uq4_12_multiply(modifier, UQ_4_12(0.75)); + break; + case ABILITY_ANALYTIC: + if (IsLastMonToMove(battlerAtk) && move != MOVE_FUTURE_SIGHT && move != MOVE_DOOM_DESIRE) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); + break; + case ABILITY_TOUGH_CLAWS: + if (IsMoveMakingContact(battlerAtk, battlerDef, ctx->abilityAtk, ctx->holdEffectAtk, ctx->move)) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); + break; + case ABILITY_STRONG_JAW: + if (IsBitingMove(move)) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); + break; + case ABILITY_MEGA_LAUNCHER: + if (IsPulseMove(move)) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); + break; + case ABILITY_WATER_BUBBLE: + if (moveType == TYPE_WATER) + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); + break; + case ABILITY_STEELWORKER: + if (moveType == TYPE_STEEL) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); + break; + case ABILITY_PIXILATE: + if (moveType == TYPE_FAIRY && gBattleStruct->battlerState[battlerAtk].ateBoost) + modifier = uq4_12_multiply(modifier, UQ_4_12(GetConfig(CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); + break; + case ABILITY_GALVANIZE: + if (moveType == TYPE_ELECTRIC && gBattleStruct->battlerState[battlerAtk].ateBoost) + modifier = uq4_12_multiply(modifier, UQ_4_12(GetConfig(CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); break; - case EFFECT_BOLT_BEAK: - if (GetBattlerTurnOrderNum(battlerAtk) < GetBattlerTurnOrderNum(battlerDef) - || gDisableStructs[battlerDef].isFirstTurn == 2) - basePower *= 2; + case ABILITY_REFRIGERATE: + if (moveType == TYPE_ICE && gBattleStruct->battlerState[battlerAtk].ateBoost) + modifier = uq4_12_multiply(modifier, UQ_4_12(GetConfig(CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); break; - case EFFECT_ROUND: - for (i = 0; i < gBattlersCount; i++) - { - if (i != battlerAtk && IsBattlerAlive(i) && GetMoveEffect(gLastUsedMove) == EFFECT_ROUND) - { - basePower *= 2; - break; - } - } + case ABILITY_AERILATE: + if (moveType == TYPE_FLYING && gBattleStruct->battlerState[battlerAtk].ateBoost) + modifier = uq4_12_multiply(modifier, UQ_4_12(GetConfig(CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); break; - case EFFECT_FUSION_COMBO: - if (GetMoveEffect(gLastUsedMove) == EFFECT_FUSION_COMBO && move != gLastUsedMove) - basePower *= 2; + case ABILITY_NORMALIZE: + if (moveType == TYPE_NORMAL && gBattleStruct->battlerState[battlerAtk].ateBoost && GetConfig(CONFIG_ATE_MULTIPLIER) >= GEN_7) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); break; - case EFFECT_LASH_OUT: - if (gProtectStructs[battlerAtk].lashOutAffected) - basePower *= 2; + case ABILITY_PUNK_ROCK: + if (IsSoundMove(move)) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); break; - case EFFECT_EXPLOSION: - if (move == MOVE_MISTY_EXPLOSION && IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_MISTY_TERRAIN)) - basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); + case ABILITY_STEELY_SPIRIT: + if (moveType == TYPE_STEEL) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; - case EFFECT_DYNAMAX_DOUBLE_DMG: - if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) - basePower *= 2; + case ABILITY_SHARPNESS: + if (IsSlicingMove(move)) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; - case EFFECT_HIDDEN_POWER: + case ABILITY_SUPREME_OVERLORD: + modifier = uq4_12_multiply(modifier, GetSupremeOverlordModifier(battlerAtk)); + break; + default: + break; + } + + // field abilities + if ((IsAbilityOnField(ABILITY_DARK_AURA) && moveType == TYPE_DARK) + || (IsAbilityOnField(ABILITY_FAIRY_AURA) && moveType == TYPE_FAIRY)) { - if (B_HIDDEN_POWER_DMG < GEN_6) + if (IsAbilityOnField(ABILITY_AURA_BREAK)) + modifier = uq4_12_multiply(modifier, UQ_4_12(0.75)); + else + modifier = uq4_12_multiply(modifier, UQ_4_12(1.33)); + } + + // attacker partner's abilities + if (IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) + { + switch (GetBattlerAbility(BATTLE_PARTNER(battlerAtk))) { - u8 powerBits = ((gBattleMons[battlerAtk].hpIV & 2) >> 1) - | ((gBattleMons[battlerAtk].attackIV & 2) << 0) - | ((gBattleMons[battlerAtk].defenseIV & 2) << 1) - | ((gBattleMons[battlerAtk].speedIV & 2) << 2) - | ((gBattleMons[battlerAtk].spAttackIV & 2) << 3) - | ((gBattleMons[battlerAtk].spDefenseIV & 2) << 4); + case ABILITY_BATTERY: + if (IsBattleMoveSpecial(move)) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); + break; + case ABILITY_POWER_SPOT: + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); + break; + case ABILITY_STEELY_SPIRIT: + if (moveType == TYPE_STEEL) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); + break; + default: + break; + } + } - basePower = (40 * powerBits) / 63 + 30; + // target's abilities + switch (ctx->abilityDef) + { + case ABILITY_HEATPROOF: + case ABILITY_WATER_BUBBLE: + if (moveType == TYPE_FIRE) + { + modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); + if (ctx->updateFlags) + RecordAbilityBattle(battlerDef, ctx->abilityDef); } break; - } - case EFFECT_GRAV_APPLE: - if (gFieldStatuses & STATUS_FIELD_GRAVITY) - basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); + case ABILITY_DRY_SKIN: + if (moveType == TYPE_FIRE) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.25)); break; - case EFFECT_TERRAIN_PULSE: - if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_TERRAIN_ANY)) - basePower *= 2; + case ABILITY_PROTOSYNTHESIS: + { + enum Stat defHighestStat = GetParadoxBoostedStatId(battlerDef); + if (((ctx->weather & B_WEATHER_SUN && HasWeatherEffect()) || gDisableStructs[battlerDef].boosterEnergyActivated) + && ((IsBattleMovePhysical(move) && defHighestStat == STAT_DEF) || (IsBattleMoveSpecial(move) && defHighestStat == STAT_SPDEF)) + && !(gBattleMons[battlerDef].volatiles.transformed)) + modifier = uq4_12_multiply(modifier, UQ_4_12(0.7)); + } break; - case EFFECT_EXPANDING_FORCE: - if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_PSYCHIC_TERRAIN)) - basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); + case ABILITY_QUARK_DRIVE: + { + u32 defHighestStat = GetParadoxBoostedStatId(battlerDef); + if ((gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battlerDef].boosterEnergyActivated) + && ((IsBattleMovePhysical(move) && defHighestStat == STAT_DEF) || (IsBattleMoveSpecial(move) && defHighestStat == STAT_SPDEF)) + && !(gBattleMons[battlerDef].volatiles.transformed)) + modifier = uq4_12_multiply(modifier, UQ_4_12(0.7)); + } break; - case EFFECT_RISING_VOLTAGE: - if (IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_ELECTRIC_TERRAIN)) - basePower *= 2; + default: break; - case EFFECT_BEAT_UP: - if (B_BEAT_UP >= GEN_5) - basePower = CalcBeatUpPower(); + } + + holdEffectParamAtk = GetBattlerHoldEffectParam(battlerAtk); + if (holdEffectParamAtk > 100) + holdEffectParamAtk = 100; + + holdEffectModifier = uq4_12_add(UQ_4_12(1.0), PercentToUQ4_12(holdEffectParamAtk)); + + // attacker's hold effect + switch (ctx->holdEffectAtk) + { + case HOLD_EFFECT_MUSCLE_BAND: + if (IsBattleMovePhysical(move)) + modifier = uq4_12_multiply(modifier, uq4_12_add(UQ_4_12(1.0), PercentToUQ4_12_Floored(holdEffectParamAtk))); break; - case EFFECT_PSYBLADE: - if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) - basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); + case HOLD_EFFECT_WISE_GLASSES: + if (IsBattleMoveSpecial(move)) + modifier = uq4_12_multiply(modifier, uq4_12_add(UQ_4_12(1.0), PercentToUQ4_12_Floored(holdEffectParamAtk))); break; - case EFFECT_MAX_MOVE: - basePower = GetMaxMovePower(gBattleMons[battlerAtk].moves[gBattleStruct->chosenMovePositions[battlerAtk]]); + case HOLD_EFFECT_LUSTROUS_ORB: + if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_PALKIA && (moveType == TYPE_WATER || moveType == TYPE_DRAGON)) + modifier = uq4_12_multiply(modifier, holdEffectModifier); break; - case EFFECT_RAGE_FIST: - basePower += 50 * gBattleStruct->timesGotHit[GetBattlerSide(battlerAtk)][gBattlerPartyIndexes[battlerAtk]]; - basePower = (basePower > 350) ? 350 : basePower; + case HOLD_EFFECT_ADAMANT_ORB: + if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_DIALGA && (moveType == TYPE_STEEL || moveType == TYPE_DRAGON)) + modifier = uq4_12_multiply(modifier, holdEffectModifier); break; - case EFFECT_FICKLE_BEAM: - if (gBattleStruct->fickleBeamBoosted) - basePower *= 2; + case HOLD_EFFECT_GRISEOUS_ORB: + if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_GIRATINA && (moveType == TYPE_GHOST || moveType == TYPE_DRAGON)) + modifier = uq4_12_multiply(modifier, holdEffectModifier); break; - case EFFECT_TERA_BLAST: - if (GetActiveGimmick(battlerAtk) == GIMMICK_TERA && GetBattlerTeraType(battlerAtk) == TYPE_STELLAR) - basePower = 100; + case HOLD_EFFECT_SOUL_DEW: + if ((gBattleMons[battlerAtk].species == SPECIES_LATIAS || gBattleMons[battlerAtk].species == SPECIES_LATIOS) + && ((B_SOUL_DEW_BOOST >= GEN_7 && (moveType == TYPE_PSYCHIC || moveType == TYPE_DRAGON)) + || (B_SOUL_DEW_BOOST < GEN_7 && !(gBattleTypeFlags & BATTLE_TYPE_FRONTIER) && IsBattleMoveSpecial(move)))) + modifier = uq4_12_multiply(modifier, holdEffectModifier); break; - case EFFECT_LAST_RESPECTS: - basePower += (basePower * min(100, GetBattlerSideFaintCounter(battlerAtk))); + case HOLD_EFFECT_TYPE_POWER: + case HOLD_EFFECT_PLATE: + if (moveType == GetItemSecondaryId(gBattleMons[battlerAtk].item)) + modifier = uq4_12_multiply(modifier, holdEffectModifier); + break; + case HOLD_EFFECT_PUNCHING_GLOVE: + if (IsPunchingMove(move)) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.1)); + break; + case HOLD_EFFECT_OGERPON_MASK: + if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_OGERPON) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); break; default: break; } - // Move-specific base power changes - switch (move) - { - case MOVE_WATER_SHURIKEN: - if (gBattleMons[battlerAtk].species == SPECIES_GRENINJA_ASH) - basePower = 20; - break; - } + // Terastallization boosts weak, non-priority, non-multi hit moves after modifiers to 60 BP. + if (GetActiveGimmick(battlerAtk) == GIMMICK_TERA + && (moveType == GetBattlerTeraType(battlerAtk) + || (GetBattlerTeraType(battlerAtk) == TYPE_STELLAR && IsTypeStellarBoosted(battlerAtk, moveType))) + && uq4_12_multiply_by_int_half_down(modifier, basePower) < 60 + && GetMovePower(move) > 1 + && GetMoveStrikeCount(move) < 2 + && moveEffect != EFFECT_POWER_BASED_ON_USER_HP + && moveEffect != EFFECT_POWER_BASED_ON_TARGET_HP + && moveEffect != EFFECT_MULTI_HIT + && GetMovePriority(move) == 0) + { + return 60; + } + + return uq4_12_multiply_by_int_half_down(modifier, basePower); +} + +static bool32 IsRuinStatusActive(u32 fieldEffect) +{ + bool32 isNeutralizingGasOnField = IsNeutralizingGasOnField(); + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + // Mold Breaker doesn't ignore Ruin field status but Gastro Acid and Neutralizing Gas do + if (gBattleMons[battler].volatiles.gastroAcid) + continue; + if (GetBattlerHoldEffectIgnoreAbility(battler) != HOLD_EFFECT_ABILITY_SHIELD + && isNeutralizingGasOnField + && gBattleMons[battler].ability != ABILITY_NEUTRALIZING_GAS) + continue; + + if (GetBattlerVolatile(battler, fieldEffect)) + return TRUE; + } + + return FALSE; +} + +static inline uq4_12_t ApplyOffensiveBadgeBoost(uq4_12_t modifier, u32 battler, u32 move) +{ + if (ShouldGetStatBadgeBoost(B_FLAG_BADGE_BOOST_ATTACK, battler) && IsBattleMovePhysical(move)) + modifier = uq4_12_multiply_half_down(modifier, GetBadgeBoostModifier()); + if (ShouldGetStatBadgeBoost(B_FLAG_BADGE_BOOST_SPATK, battler) && IsBattleMoveSpecial(move)) + modifier = uq4_12_multiply_half_down(modifier, GetBadgeBoostModifier()); + return modifier; +} + +static inline uq4_12_t ApplyDefensiveBadgeBoost(uq4_12_t modifier, u32 battler, u32 move) +{ + if (ShouldGetStatBadgeBoost(B_FLAG_BADGE_BOOST_DEFENSE, battler) && IsBattleMovePhysical(move)) + modifier = uq4_12_multiply_half_down(modifier, GetBadgeBoostModifier()); + if (ShouldGetStatBadgeBoost(B_FLAG_BADGE_BOOST_SPDEF, battler) && IsBattleMoveSpecial(move)) + modifier = uq4_12_multiply_half_down(modifier, GetBadgeBoostModifier()); + return modifier; +} + +static inline u32 CalcAttackStat(struct DamageContext *ctx) +{ + u8 atkStage; + u32 atkStat; + uq4_12_t modifier; + u16 atkBaseSpeciesId; + u32 battlerAtk = ctx->battlerAtk; + u32 battlerDef = ctx->battlerDef; + u32 move = ctx->move; + enum Type moveType = ctx->moveType; + enum BattleMoveEffects moveEffect = GetMoveEffect(move); + + atkBaseSpeciesId = GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species); + + if (moveEffect == EFFECT_FOUL_PLAY) + { + if (IsBattleMovePhysical(move)) + { + atkStat = gBattleMons[battlerDef].attack; + atkStage = gBattleMons[battlerDef].statStages[STAT_ATK]; + } + else + { + atkStat = gBattleMons[battlerDef].spAttack; + atkStage = gBattleMons[battlerDef].statStages[STAT_SPATK]; + } + } + else if (moveEffect == EFFECT_BODY_PRESS) + { + if (IsBattleMovePhysical(move)) + { + atkStat = gBattleMons[battlerAtk].defense; + // Edge case: Body Press used during Wonder Room. For some reason, it still uses Defense over Sp.Def, but uses Sp.Def stat changes + if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM) + atkStage = gBattleMons[battlerAtk].statStages[STAT_SPDEF]; + else + atkStage = gBattleMons[battlerAtk].statStages[STAT_DEF]; + } + else + { + atkStat = gBattleMons[battlerAtk].spDefense; + atkStage = gBattleMons[battlerAtk].statStages[STAT_SPDEF]; + } + } + else + { + if (IsBattleMovePhysical(move)) + { + atkStat = gBattleMons[battlerAtk].attack; + atkStage = gBattleMons[battlerAtk].statStages[STAT_ATK]; + } + else + { + atkStat = gBattleMons[battlerAtk].spAttack; + atkStage = gBattleMons[battlerAtk].statStages[STAT_SPATK]; + } + } + + // critical hits ignore attack stat's stage drops + if (ctx->isCrit && atkStage < DEFAULT_STAT_STAGE) + atkStage = DEFAULT_STAT_STAGE; + // pokemon with unaware ignore attack stat changes while taking damage + if (ctx->abilityDef == ABILITY_UNAWARE) + atkStage = DEFAULT_STAT_STAGE; - if (basePower == 0) - basePower = 1; - return basePower; -} + atkStat *= gStatStageRatios[atkStage][0]; + atkStat /= gStatStageRatios[atkStage][1]; -static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData *damageCalcData, u32 atkAbility, u32 defAbility, enum ItemHoldEffect holdEffectAtk, u32 weather) -{ - u32 holdEffectParamAtk; - u32 basePower = CalcMoveBasePower(damageCalcData, defAbility, weather); - u32 battlerAtk = damageCalcData->battlerAtk; - u32 battlerDef = damageCalcData->battlerDef; - u32 move = damageCalcData->move; - u32 moveType = damageCalcData->moveType; - enum BattleMoveEffects moveEffect = GetMoveEffect(move); + // apply attack stat modifiers + modifier = UQ_4_12(1.0); - uq4_12_t holdEffectModifier; - uq4_12_t modifier = UQ_4_12(1.0); - u32 atkSide = GetBattlerSide(battlerAtk); + if (ctx->isSelfInflicted) + return uq4_12_multiply_by_int_half_down(ApplyOffensiveBadgeBoost(modifier, battlerAtk, move), atkStat); - // move effect - switch (moveEffect) + // attacker's abilities + switch (ctx->abilityAtk) { - case EFFECT_FACADE: - if (gBattleMons[battlerAtk].status1 & (STATUS1_BURN | STATUS1_PSN_ANY | STATUS1_PARALYSIS | STATUS1_FROSTBITE)) - modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); + case ABILITY_HUGE_POWER: + case ABILITY_PURE_POWER: + if (IsBattleMovePhysical(move)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; - case EFFECT_BRINE: - if (gBattleMons[battlerDef].hp <= (gBattleMons[battlerDef].maxHP / 2)) - modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); + case ABILITY_SLOW_START: + if (gDisableStructs[battlerAtk].slowStartTimer > 0) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.5)); break; - case EFFECT_RETALIATE: - if (gSideTimers[atkSide].retaliateTimer == 1) - modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); + case ABILITY_SOLAR_POWER: + if (IsBattleMoveSpecial(move) && IsBattlerWeatherAffected(battlerAtk, B_WEATHER_SUN)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; - case EFFECT_SOLAR_BEAM: - if (IsBattlerWeatherAffected(battlerAtk, (B_WEATHER_HAIL | B_WEATHER_SANDSTORM | B_WEATHER_RAIN | B_WEATHER_SNOW | B_WEATHER_FOG))) - modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); + case ABILITY_DEFEATIST: + if (gBattleMons[battlerAtk].hp <= (gBattleMons[battlerAtk].maxHP / 2)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.5)); break; - case EFFECT_STOMPING_TANTRUM: - if (gBattleStruct->battlerState[battlerAtk].stompingTantrumTimer == 1) - modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); + case ABILITY_FLASH_FIRE: + if (moveType == TYPE_FIRE && gDisableStructs[battlerAtk].flashFireBoosted) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; - case EFFECT_MAGNITUDE: - case EFFECT_EARTHQUAKE: - if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && !(gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE)) - modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); + case ABILITY_SWARM: + if (moveType == TYPE_BUG && gBattleMons[battlerAtk].hp <= (gBattleMons[battlerAtk].maxHP / 3)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; - case EFFECT_KNOCK_OFF: - if (B_KNOCK_OFF_DMG >= GEN_6 - && gBattleMons[battlerDef].item != ITEM_NONE - && CanBattlerGetOrLoseItem(battlerDef, gBattleMons[battlerDef].item)) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); + case ABILITY_TORRENT: + if (moveType == TYPE_WATER && gBattleMons[battlerAtk].hp <= (gBattleMons[battlerAtk].maxHP / 3)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; - default: + case ABILITY_BLAZE: + if (moveType == TYPE_FIRE && gBattleMons[battlerAtk].hp <= (gBattleMons[battlerAtk].maxHP / 3)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; - } - - // various effects - if (gProtectStructs[battlerAtk].helpingHand) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); - if (gSpecialStatuses[battlerAtk].gemBoost) - modifier = uq4_12_multiply(modifier, uq4_12_add(UQ_4_12(1.0), PercentToUQ4_12(gSpecialStatuses[battlerAtk].gemParam))); - if (gStatuses3[battlerAtk] & STATUS3_CHARGED_UP && moveType == TYPE_ELECTRIC) - modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); - if (GetMoveEffect(gChosenMove) == EFFECT_ME_FIRST) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); - if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_GRASSY_TERRAIN) && moveType == TYPE_GRASS) - modifier = uq4_12_multiply(modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8 ? UQ_4_12(1.3) : UQ_4_12(1.5))); - if (IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN) && moveType == TYPE_DRAGON) - modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); - if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_ELECTRIC_TERRAIN) && moveType == TYPE_ELECTRIC) - modifier = uq4_12_multiply(modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8 ? UQ_4_12(1.3) : UQ_4_12(1.5))); - if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_PSYCHIC_TERRAIN) && moveType == TYPE_PSYCHIC) - modifier = uq4_12_multiply(modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8 ? UQ_4_12(1.3) : UQ_4_12(1.5))); - - if (moveType == TYPE_ELECTRIC && ((gFieldStatuses & STATUS_FIELD_MUDSPORT) - || AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, ABILITYEFFECT_MUD_SPORT, 0))) - modifier = uq4_12_multiply(modifier, UQ_4_12(B_SPORT_DMG_REDUCTION >= GEN_5 ? 0.33 : 0.5)); - if (moveType == TYPE_FIRE && ((gFieldStatuses & STATUS_FIELD_WATERSPORT) - || AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, ABILITYEFFECT_WATER_SPORT, 0))) - modifier = uq4_12_multiply(modifier, UQ_4_12(B_SPORT_DMG_REDUCTION >= GEN_5 ? 0.33 : 0.5)); - - // attacker's abilities - switch (atkAbility) - { - case ABILITY_TECHNICIAN: - if (basePower <= 60) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); + case ABILITY_OVERGROW: + if (moveType == TYPE_GRASS && gBattleMons[battlerAtk].hp <= (gBattleMons[battlerAtk].maxHP / 3)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; - case ABILITY_FLARE_BOOST: - if (gBattleMons[battlerAtk].status1 & STATUS1_BURN && IsBattleMoveSpecial(move)) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); + case ABILITY_PLUS: + if (IsBattleMoveSpecial(move) && IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) + { + enum Ability partnerAbility = GetBattlerAbility(BATTLE_PARTNER(battlerAtk)); + if (partnerAbility == ABILITY_MINUS + || (B_PLUS_MINUS_INTERACTION >= GEN_5 && partnerAbility == ABILITY_PLUS)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); + } break; - case ABILITY_TOXIC_BOOST: - if (gBattleMons[battlerAtk].status1 & STATUS1_PSN_ANY && IsBattleMovePhysical(move)) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); + case ABILITY_MINUS: + if (IsBattleMoveSpecial(move) && IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) + { + enum Ability partnerAbility = GetBattlerAbility(BATTLE_PARTNER(battlerAtk)); + if (partnerAbility == ABILITY_PLUS + || (B_PLUS_MINUS_INTERACTION >= GEN_5 && partnerAbility == ABILITY_MINUS)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); + } break; - case ABILITY_RECKLESS: - if (moveEffect == EFFECT_RECOIL || moveEffect == EFFECT_RECOIL_IF_MISS) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); + case ABILITY_FLOWER_GIFT: + if (gBattleMons[battlerAtk].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(battlerAtk, B_WEATHER_SUN) && IsBattleMovePhysical(move)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; - case ABILITY_IRON_FIST: - if (IsPunchingMove(move)) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); + case ABILITY_HUSTLE: + if (IsBattleMovePhysical(move)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; - case ABILITY_SHEER_FORCE: - if (MoveIsAffectedBySheerForce(move)) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); + case ABILITY_STAKEOUT: + if (gDisableStructs[battlerDef].isFirstTurn == 2) // just switched in + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; - case ABILITY_SAND_FORCE: - if ((moveType == TYPE_STEEL || moveType == TYPE_ROCK || moveType == TYPE_GROUND) - && weather & B_WEATHER_SANDSTORM) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); + case ABILITY_GUTS: + if (gBattleMons[battlerAtk].status1 & STATUS1_ANY && IsBattleMovePhysical(move)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; - case ABILITY_RIVALRY: - if (AreBattlersOfSameGender(battlerAtk, battlerDef)) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.25)); - else if (AreBattlersOfOppositeGender(battlerAtk, battlerDef)) - modifier = uq4_12_multiply(modifier, UQ_4_12(0.75)); + case ABILITY_TRANSISTOR: + if (moveType == TYPE_ELECTRIC) + { + if (GetConfig(CONFIG_TRANSISTOR_BOOST) >= GEN_9) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); + else + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); + } break; - case ABILITY_ANALYTIC: - if (GetBattlerTurnOrderNum(battlerAtk) == gBattlersCount - 1 && move != MOVE_FUTURE_SIGHT && move != MOVE_DOOM_DESIRE) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); + case ABILITY_DRAGONS_MAW: + if (moveType == TYPE_DRAGON) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; - case ABILITY_TOUGH_CLAWS: - if (IsMoveMakingContact(move, battlerAtk)) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); + case ABILITY_GORILLA_TACTICS: + if (IsBattleMovePhysical(move)) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; - case ABILITY_STRONG_JAW: - if (IsBitingMove(move)) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); + case ABILITY_ROCKY_PAYLOAD: + if (moveType == TYPE_ROCK) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; - case ABILITY_MEGA_LAUNCHER: - if (IsPulseMove(move)) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); + case ABILITY_PROTOSYNTHESIS: + if (!(gBattleMons[battlerAtk].volatiles.transformed)) + { + enum Stat atkHighestStat = GetParadoxBoostedStatId(battlerAtk); + if (((ctx->weather & B_WEATHER_SUN) && HasWeatherEffect()) || gDisableStructs[battlerAtk].boosterEnergyActivated) + { + if ((IsBattleMovePhysical(move) && atkHighestStat == STAT_ATK) || (IsBattleMoveSpecial(move) && atkHighestStat == STAT_SPATK)) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); + } + } break; - case ABILITY_WATER_BUBBLE: - if (moveType == TYPE_WATER) - modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); + case ABILITY_QUARK_DRIVE: + if (!(gBattleMons[battlerAtk].volatiles.transformed)) + { + enum Stat atkHighestStat = GetParadoxBoostedStatId(battlerAtk); + if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battlerAtk].boosterEnergyActivated) + { + if ((IsBattleMovePhysical(move) && atkHighestStat == STAT_ATK) || (IsBattleMoveSpecial(move) && atkHighestStat == STAT_SPATK)) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); + } + } break; - case ABILITY_STEELWORKER: - if (moveType == TYPE_STEEL) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); + case ABILITY_ORICHALCUM_PULSE: + if ((ctx->weather & B_WEATHER_SUN) && HasWeatherEffect() && IsBattleMovePhysical(move)) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3333)); break; - case ABILITY_PIXILATE: - if (moveType == TYPE_FAIRY && gBattleStruct->ateBoost[battlerAtk]) - modifier = uq4_12_multiply(modifier, UQ_4_12(GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); + case ABILITY_HADRON_ENGINE: + if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && IsBattleMoveSpecial(move)) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3333)); break; - case ABILITY_GALVANIZE: - if (moveType == TYPE_ELECTRIC && gBattleStruct->ateBoost[battlerAtk]) - modifier = uq4_12_multiply(modifier, UQ_4_12(GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); + default: break; - case ABILITY_REFRIGERATE: - if (moveType == TYPE_ICE && gBattleStruct->ateBoost[battlerAtk]) - modifier = uq4_12_multiply(modifier, UQ_4_12(GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); + } + + // target's abilities + switch (ctx->abilityDef) + { + case ABILITY_THICK_FAT: + if (moveType == TYPE_FIRE || moveType == TYPE_ICE) + { + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.5)); + if (ctx->updateFlags) + RecordAbilityBattle(battlerDef, ABILITY_THICK_FAT); + } break; - case ABILITY_AERILATE: - if (moveType == TYPE_FLYING && gBattleStruct->ateBoost[battlerAtk]) - modifier = uq4_12_multiply(modifier, UQ_4_12(GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); + case ABILITY_PURIFYING_SALT: + if (moveType == TYPE_GHOST) + { + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.5)); + if (ctx->updateFlags) + RecordAbilityBattle(battlerDef, ABILITY_PURIFYING_SALT); + } break; - case ABILITY_NORMALIZE: - if (moveType == TYPE_NORMAL && gBattleStruct->ateBoost[battlerAtk] && GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); + default: + break; + } + + // ally's abilities + if (IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) + { + switch (GetBattlerAbility(BATTLE_PARTNER(battlerAtk))) + { + case ABILITY_FLOWER_GIFT: + if (gBattleMons[BATTLE_PARTNER(battlerAtk)].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(BATTLE_PARTNER(battlerAtk), B_WEATHER_SUN) && IsBattleMovePhysical(move)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); + break; + default: + break; + } + } + + // Ruin field effects + if (IsBattleMoveSpecial(move) && !gBattleMons[ctx->battlerAtk].volatiles.vesselOfRuin && IsRuinStatusActive(VOLATILE_VESSEL_OF_RUIN)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.75)); + + if (IsBattleMovePhysical(move) && !gBattleMons[ctx->battlerAtk].volatiles.tabletsOfRuin && IsRuinStatusActive(VOLATILE_TABLETS_OF_RUIN)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.75)); + + // attacker's hold effect + switch (ctx->holdEffectAtk) + { + case HOLD_EFFECT_THICK_CLUB: + if ((atkBaseSpeciesId == SPECIES_CUBONE || atkBaseSpeciesId == SPECIES_MAROWAK) && IsBattleMovePhysical(move)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; - case ABILITY_PUNK_ROCK: - if (IsSoundMove(move)) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); + case HOLD_EFFECT_DEEP_SEA_TOOTH: + if (gBattleMons[battlerAtk].species == SPECIES_CLAMPERL && IsBattleMoveSpecial(move)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; - case ABILITY_STEELY_SPIRIT: - if (moveType == TYPE_STEEL) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); + case HOLD_EFFECT_LIGHT_BALL: + if (atkBaseSpeciesId == SPECIES_PIKACHU && (GetConfig(CONFIG_LIGHT_BALL_ATTACK_BOOST) >= GEN_4 || IsBattleMoveSpecial(move))) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; - case ABILITY_SHARPNESS: - if (IsSlicingMove(move)) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); + case HOLD_EFFECT_CHOICE_BAND: + if (IsBattleMovePhysical(move) && GetActiveGimmick(battlerAtk) != GIMMICK_DYNAMAX) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; - case ABILITY_SUPREME_OVERLORD: - modifier = uq4_12_multiply(modifier, GetSupremeOverlordModifier(battlerAtk)); + case HOLD_EFFECT_CHOICE_SPECS: + if (IsBattleMoveSpecial(move) && GetActiveGimmick(battlerAtk) != GIMMICK_DYNAMAX) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); + break; + default: break; } - // field abilities - if ((IsAbilityOnField(ABILITY_DARK_AURA) && moveType == TYPE_DARK) - || (IsAbilityOnField(ABILITY_FAIRY_AURA) && moveType == TYPE_FAIRY)) + modifier = ApplyOffensiveBadgeBoost(modifier, battlerAtk, move); + + return uq4_12_multiply_by_int_half_down(modifier, atkStat); +} + +static bool32 CanEvolve(u32 species) +{ + u32 i; + const struct Evolution *evolutions = GetSpeciesEvolutions(species); + + if (evolutions != NULL) { - if (IsAbilityOnField(ABILITY_AURA_BREAK)) - modifier = uq4_12_multiply(modifier, UQ_4_12(0.75)); - else - modifier = uq4_12_multiply(modifier, UQ_4_12(1.33)); + for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) + { + if (evolutions[i].method + && SanitizeSpeciesId(evolutions[i].targetSpecies) != SPECIES_NONE) + return TRUE; + } } + return FALSE; +} - // attacker partner's abilities - if (IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) +static inline u32 CalcDefenseStat(struct DamageContext *ctx) +{ + bool32 usesDefStat; + u8 defStage; + u32 defStat, def, spDef; + uq4_12_t modifier; + u32 battlerDef = ctx->battlerDef; + u32 move = ctx->move; + enum BattleMoveEffects moveEffect = GetMoveEffect(move); + + def = gBattleMons[battlerDef].defense; + spDef = gBattleMons[battlerDef].spDefense; + + if (moveEffect == EFFECT_PSYSHOCK || IsBattleMovePhysical(move)) // uses defense stat instead of sp.def { - switch (GetBattlerAbility(BATTLE_PARTNER(battlerAtk))) + if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM) // the defense stats are swapped { - case ABILITY_BATTERY: - if (IsBattleMoveSpecial(move)) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); - break; - case ABILITY_POWER_SPOT: - modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); - break; - case ABILITY_STEELY_SPIRIT: - if (moveType == TYPE_STEEL) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); - break; + defStat = spDef; + usesDefStat = FALSE; + } + else + { + defStat = def; + usesDefStat = TRUE; + } + defStage = gBattleMons[battlerDef].statStages[STAT_DEF]; + } + else // is special + { + if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM) // the defense stats are swapped + { + defStat = def; + usesDefStat = TRUE; + } + else + { + defStat = spDef; + usesDefStat = FALSE; } + defStage = gBattleMons[battlerDef].statStages[STAT_SPDEF]; } + // Self-destruct / Explosion cut defense in half + if (B_EXPLOSION_DEFENSE < GEN_5 && (moveEffect == EFFECT_EXPLOSION + || moveEffect == EFFECT_MISTY_EXPLOSION)) + defStat /= 2; + + // critical hits ignore positive stat changes + if (ctx->isCrit && defStage > DEFAULT_STAT_STAGE) + defStage = DEFAULT_STAT_STAGE; + // pokemon with unaware ignore defense stat changes while dealing damage + if (ctx->abilityAtk == ABILITY_UNAWARE) + defStage = DEFAULT_STAT_STAGE; + // certain moves also ignore stat changes + if (MoveIgnoresDefenseEvasionStages(move)) + defStage = DEFAULT_STAT_STAGE; + + defStat *= gStatStageRatios[defStage][0]; + defStat /= gStatStageRatios[defStage][1]; + + // apply defense stat modifiers + modifier = UQ_4_12(1.0); + + if (ctx->isSelfInflicted) + return uq4_12_multiply_by_int_half_down(ApplyDefensiveBadgeBoost(modifier, battlerDef, move), defStat); + // target's abilities - switch (defAbility) + switch (ctx->abilityDef) { - case ABILITY_HEATPROOF: - case ABILITY_WATER_BUBBLE: - if (moveType == TYPE_FIRE) + case ABILITY_MARVEL_SCALE: + if (gBattleMons[battlerDef].status1 & STATUS1_ANY && usesDefStat) { - modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); - if (damageCalcData->updateFlags) - RecordAbilityBattle(battlerDef, defAbility); + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); + if (ctx->updateFlags) + RecordAbilityBattle(battlerDef, ABILITY_MARVEL_SCALE); } break; - case ABILITY_DRY_SKIN: - if (moveType == TYPE_FIRE) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.25)); - break; - case ABILITY_PROTOSYNTHESIS: + case ABILITY_FUR_COAT: + if (usesDefStat) { - u8 defHighestStat = GetHighestStatId(battlerDef); - if (((weather & B_WEATHER_SUN && HasWeatherEffect()) || gDisableStructs[battlerDef].boosterEnergyActivates) - && ((IsBattleMovePhysical(move) && defHighestStat == STAT_DEF) || (IsBattleMoveSpecial(move) && defHighestStat == STAT_SPDEF)) - && !(gBattleMons[battlerDef].status2 & STATUS2_TRANSFORMED)) - modifier = uq4_12_multiply(modifier, UQ_4_12(0.7)); + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); + if (ctx->updateFlags) + RecordAbilityBattle(battlerDef, ABILITY_FUR_COAT); } break; - case ABILITY_QUARK_DRIVE: + case ABILITY_GRASS_PELT: + if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && usesDefStat) { - u8 defHighestStat = GetHighestStatId(battlerDef); - if ((gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battlerDef].boosterEnergyActivates) - && ((IsBattleMovePhysical(move) && defHighestStat == STAT_DEF) || (IsBattleMoveSpecial(move) && defHighestStat == STAT_SPDEF)) - && !(gBattleMons[battlerDef].status2 & STATUS2_TRANSFORMED)) - modifier = uq4_12_multiply(modifier, UQ_4_12(0.7)); + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); + if (ctx->updateFlags) + RecordAbilityBattle(battlerDef, ABILITY_GRASS_PELT); } break; + case ABILITY_FLOWER_GIFT: + if (gBattleMons[battlerDef].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(battlerDef, B_WEATHER_SUN) && !usesDefStat) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); + break; + default: + break; } - holdEffectParamAtk = GetBattlerHoldEffectParam(battlerAtk); - if (holdEffectParamAtk > 100) - holdEffectParamAtk = 100; + // ally's abilities + if (IsBattlerAlive(BATTLE_PARTNER(battlerDef))) + { + switch (GetBattlerAbility(BATTLE_PARTNER(battlerDef))) + { + case ABILITY_FLOWER_GIFT: + if (gBattleMons[BATTLE_PARTNER(battlerDef)].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(BATTLE_PARTNER(battlerDef), B_WEATHER_SUN) && !usesDefStat) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); + break; + default: + break; + } + } - holdEffectModifier = uq4_12_add(UQ_4_12(1.0), PercentToUQ4_12(holdEffectParamAtk)); + // Ruin field effects + if (usesDefStat && !gBattleMons[ctx->battlerDef].volatiles.swordOfRuin && IsRuinStatusActive(VOLATILE_SWORD_OF_RUIN)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.75)); - // attacker's hold effect - switch (holdEffectAtk) + if (!usesDefStat && !gBattleMons[ctx->battlerDef].volatiles.beadsOfRuin && IsRuinStatusActive(VOLATILE_BEADS_OF_RUIN)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.75)); + + // target's hold effects + switch (ctx->holdEffectDef) { - case HOLD_EFFECT_MUSCLE_BAND: - if (IsBattleMovePhysical(move)) - modifier = uq4_12_multiply(modifier, uq4_12_add(UQ_4_12(1.0), PercentToUQ4_12_Floored(holdEffectParamAtk))); - break; - case HOLD_EFFECT_WISE_GLASSES: - if (IsBattleMoveSpecial(move)) - modifier = uq4_12_multiply(modifier, uq4_12_add(UQ_4_12(1.0), PercentToUQ4_12_Floored(holdEffectParamAtk))); + case HOLD_EFFECT_DEEP_SEA_SCALE: + if (gBattleMons[battlerDef].species == SPECIES_CLAMPERL && !usesDefStat) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; - case HOLD_EFFECT_LUSTROUS_ORB: - if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_PALKIA && (moveType == TYPE_WATER || moveType == TYPE_DRAGON)) - modifier = uq4_12_multiply(modifier, holdEffectModifier); + case HOLD_EFFECT_METAL_POWDER: + if (gBattleMons[battlerDef].species == SPECIES_DITTO && usesDefStat && !(gBattleMons[battlerDef].volatiles.transformed)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; - case HOLD_EFFECT_ADAMANT_ORB: - if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_DIALGA && (moveType == TYPE_STEEL || moveType == TYPE_DRAGON)) - modifier = uq4_12_multiply(modifier, holdEffectModifier); + case HOLD_EFFECT_EVIOLITE: + if (CanEvolve(gBattleMons[battlerDef].species)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; - case HOLD_EFFECT_GRISEOUS_ORB: - if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_GIRATINA && (moveType == TYPE_GHOST || moveType == TYPE_DRAGON)) - modifier = uq4_12_multiply(modifier, holdEffectModifier); + case HOLD_EFFECT_ASSAULT_VEST: + if (!usesDefStat) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; case HOLD_EFFECT_SOUL_DEW: - if ((gBattleMons[battlerAtk].species == SPECIES_LATIAS || gBattleMons[battlerAtk].species == SPECIES_LATIOS) - && ((B_SOUL_DEW_BOOST >= GEN_7 && (moveType == TYPE_PSYCHIC || moveType == TYPE_DRAGON)) - || (B_SOUL_DEW_BOOST < GEN_7 && !(gBattleTypeFlags & BATTLE_TYPE_FRONTIER) && IsBattleMoveSpecial(move)))) - modifier = uq4_12_multiply(modifier, holdEffectModifier); - break; - case HOLD_EFFECT_TYPE_POWER: - case HOLD_EFFECT_PLATE: - if (moveType == GetItemSecondaryId(gBattleMons[battlerAtk].item)) - modifier = uq4_12_multiply(modifier, holdEffectModifier); - break; - case HOLD_EFFECT_PUNCHING_GLOVE: - if (IsPunchingMove(move)) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.1)); - break; - case HOLD_EFFECT_OGERPON_MASK: - if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_OGERPON) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); + if (B_SOUL_DEW_BOOST < GEN_7 + && (gBattleMons[battlerDef].species == SPECIES_LATIAS || gBattleMons[battlerDef].species == SPECIES_LATIOS) + && !(gBattleTypeFlags & BATTLE_TYPE_FRONTIER) + && !usesDefStat) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; default: break; } - // Terastallization boosts weak, non-priority, non-multi hit moves after modifiers to 60 BP. - if (GetActiveGimmick(battlerAtk) == GIMMICK_TERA - && (moveType == GetBattlerTeraType(battlerAtk) - || (GetBattlerTeraType(battlerAtk) == TYPE_STELLAR && IsTypeStellarBoosted(battlerAtk, moveType))) - && uq4_12_multiply_by_int_half_down(modifier, basePower) < 60 - && GetMovePower(move) > 1 - && GetMoveStrikeCount(move) < 2 - && moveEffect != EFFECT_POWER_BASED_ON_USER_HP - && moveEffect != EFFECT_POWER_BASED_ON_TARGET_HP - && moveEffect != EFFECT_MULTI_HIT - && GetMovePriority(move) == 0) + // sandstorm sp.def boost for rock types + if (GetConfig(CONFIG_SANDSTORM_SPDEF_BOOST) >= GEN_4 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ROCK) && IsBattlerWeatherAffected(battlerDef, B_WEATHER_SANDSTORM) && !usesDefStat) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); + // snow def boost for ice types + if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE) && IsBattlerWeatherAffected(battlerDef, B_WEATHER_SNOW) && usesDefStat) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); + + modifier = ApplyDefensiveBadgeBoost(modifier, battlerDef, move); + + return uq4_12_multiply_by_int_half_down(modifier, defStat); +} + +// base damage formula before adding any modifiers +static inline s32 CalculateBaseDamage(u32 power, u32 userFinalAttack, u32 level, u32 targetFinalDefense) +{ + return power * userFinalAttack * (2 * level / 5 + 2) / targetFinalDefense / 50 + 2; +} + +static inline uq4_12_t GetTargetDamageModifier(struct DamageContext *ctx) +{ + if (IsDoubleBattle()) + { + if (GetMoveTargetCount(ctx) == 2) + return B_MULTIPLE_TARGETS_DMG >= GEN_4 ? UQ_4_12(0.75) : UQ_4_12(0.5); + else if (GetMoveTargetCount(ctx) >= 3) + return B_MULTIPLE_TARGETS_DMG >= GEN_4 ? UQ_4_12(0.75) : UQ_4_12(1.0); + } + return UQ_4_12(1.0); +} + +static inline uq4_12_t GetParentalBondModifier(u32 battlerAtk) +{ + if (gSpecialStatuses[battlerAtk].parentalBondState != PARENTAL_BOND_2ND_HIT) + return UQ_4_12(1.0); + return B_PARENTAL_BOND_DMG >= GEN_7 ? UQ_4_12(0.25) : UQ_4_12(0.5); +} + +static inline uq4_12_t GetSameTypeAttackBonusModifier(struct DamageContext *ctx) +{ + if (ctx->moveType == TYPE_MYSTERY) + return UQ_4_12(1.0); + else if (gBattleStruct->pledgeMove && IS_BATTLER_OF_TYPE(BATTLE_PARTNER(ctx->battlerAtk), ctx->moveType)) + return (ctx->abilityAtk == ABILITY_ADAPTABILITY) ? UQ_4_12(2.0) : UQ_4_12(1.5); + else if (!IS_BATTLER_OF_TYPE(ctx->battlerAtk, ctx->moveType) || ctx->move == MOVE_STRUGGLE || ctx->move == MOVE_NONE) + return UQ_4_12(1.0); + return (ctx->abilityAtk == ABILITY_ADAPTABILITY) ? UQ_4_12(2.0) : UQ_4_12(1.5); +} + +// Utility Umbrella holders take normal damage from what would be rain- and sun-weakened attacks. +static uq4_12_t GetWeatherDamageModifier(struct DamageContext *ctx) +{ + if (ctx->weather == B_WEATHER_NONE) + return UQ_4_12(1.0); + if (GetMoveEffect(ctx->move) == EFFECT_HYDRO_STEAM && (ctx->weather & B_WEATHER_SUN) && ctx->holdEffectAtk != HOLD_EFFECT_UTILITY_UMBRELLA) + return UQ_4_12(1.5); + if (ctx->holdEffectDef == HOLD_EFFECT_UTILITY_UMBRELLA) + return UQ_4_12(1.0); + + if (ctx->weather & B_WEATHER_RAIN) { - return 60; + if (ctx->moveType != TYPE_FIRE && ctx->moveType != TYPE_WATER) + return UQ_4_12(1.0); + return (ctx->moveType == TYPE_FIRE) ? UQ_4_12(0.5) : UQ_4_12(1.5); } + if (ctx->weather & B_WEATHER_SUN) + { + if (ctx->moveType != TYPE_FIRE && ctx->moveType != TYPE_WATER) + return UQ_4_12(1.0); + return (ctx->moveType == TYPE_WATER) ? UQ_4_12(0.5) : UQ_4_12(1.5); + } + return UQ_4_12(1.0); +} - return uq4_12_multiply_by_int_half_down(modifier, basePower); +static inline uq4_12_t GetBurnOrFrostBiteModifier(struct DamageContext *ctx) +{ + enum BattleMoveEffects moveEffect = GetMoveEffect(ctx->move); + + if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_BURN + && IsBattleMovePhysical(ctx->move) + && (GetConfig(CONFIG_BURN_FACADE_DMG) < GEN_6 || moveEffect != EFFECT_FACADE) + && ctx->abilityAtk != ABILITY_GUTS) + return UQ_4_12(0.5); + if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_FROSTBITE + && IsBattleMoveSpecial(ctx->move) + && (GetConfig(CONFIG_BURN_FACADE_DMG) < GEN_6 || moveEffect != EFFECT_FACADE)) + return UQ_4_12(0.5); + return UQ_4_12(1.0); } -static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u32 atkAbility, u32 defAbility, enum ItemHoldEffect holdEffectAtk, u32 weather) +static inline uq4_12_t GetCriticalModifier(bool32 isCrit) { - u8 atkStage; - u32 atkStat; - uq4_12_t modifier; - u16 atkBaseSpeciesId; - u32 battlerAtk = damageCalcData->battlerAtk; - u32 battlerDef = damageCalcData->battlerDef; - u32 move = damageCalcData->move; - u32 moveType = damageCalcData->moveType; - enum BattleMoveEffects moveEffect = GetMoveEffect(move); + if (isCrit) + return GetConfig(CONFIG_CRIT_MULTIPLIER) >= GEN_6 ? UQ_4_12(1.5) : UQ_4_12(2.0); + return UQ_4_12(1.0); +} - atkBaseSpeciesId = GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species); +static inline uq4_12_t GetGlaiveRushModifier(u32 battlerDef) +{ + if (gBattleMons[battlerDef].volatiles.glaiveRush) + return UQ_4_12(2.0); + return UQ_4_12(1.0); +} - if (moveEffect == EFFECT_FOUL_PLAY) +static inline uq4_12_t GetZMaxMoveAgainstProtectionModifier(struct DamageContext *ctx) +{ + if (!IsZMove(ctx->move) && !IsMaxMove(ctx->move)) + return UQ_4_12(1.0); + + u32 protected = gProtectStructs[ctx->battlerDef].protected; + if (GetProtectType(protected) == PROTECT_TYPE_SINGLE && protected != PROTECT_MAX_GUARD) + return UQ_4_12(0.25); + return UQ_4_12(1.0); +} + +static inline uq4_12_t GetMinimizeModifier(u32 move, u32 battlerDef) +{ + if (MoveIncreasesPowerToMinimizedTargets(move) && gBattleMons[battlerDef].volatiles.minimize) + return UQ_4_12(2.0); + return UQ_4_12(1.0); +} + +static inline uq4_12_t GetUndergroundModifier(u32 move, u32 battlerDef) +{ + if (MoveDamagesUnderground(move) && gBattleMons[battlerDef].volatiles.semiInvulnerable == STATE_UNDERGROUND) + return UQ_4_12(2.0); + return UQ_4_12(1.0); +} + +static inline uq4_12_t GetDiveModifier(u32 move, u32 battlerDef) +{ + if (MoveDamagesUnderWater(move) && gBattleMons[battlerDef].volatiles.semiInvulnerable == STATE_UNDERWATER) + return UQ_4_12(2.0); + return UQ_4_12(1.0); +} + +static inline uq4_12_t GetAirborneModifier(u32 move, u32 battlerDef) +{ + if (MoveDamagesAirborneDoubleDamage(move) && gBattleMons[battlerDef].volatiles.semiInvulnerable == STATE_ON_AIR) + return UQ_4_12(2.0); + return UQ_4_12(1.0); +} + +static inline uq4_12_t GetScreensModifier(struct DamageContext *ctx) +{ + u32 sideStatus = gSideStatuses[GetBattlerSide(ctx->battlerDef)]; + bool32 lightScreen = (sideStatus & SIDE_STATUS_LIGHTSCREEN) && IsBattleMoveSpecial(ctx->move); + bool32 reflect = (sideStatus & SIDE_STATUS_REFLECT) && IsBattleMovePhysical(ctx->move); + bool32 auroraVeil = sideStatus & SIDE_STATUS_AURORA_VEIL; + + if (ctx->isCrit || gProtectStructs[ctx->battlerAtk].confusionSelfDmg) { - if (IsBattleMovePhysical(move)) - { - atkStat = gBattleMons[battlerDef].attack; - atkStage = gBattleMons[battlerDef].statStages[STAT_ATK]; - } - else - { - atkStat = gBattleMons[battlerDef].spAttack; - atkStage = gBattleMons[battlerDef].statStages[STAT_SPATK]; - } + return UQ_4_12(1.0); } - else if (moveEffect == EFFECT_BODY_PRESS) + if (ctx->abilityAtk == ABILITY_INFILTRATOR) { - if (IsBattleMovePhysical(move)) - { - atkStat = gBattleMons[battlerAtk].defense; - // Edge case: Body Press used during Wonder Room. For some reason, it still uses Defense over Sp.Def, but uses Sp.Def stat changes - if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM) - atkStage = gBattleMons[battlerAtk].statStages[STAT_SPDEF]; - else - atkStage = gBattleMons[battlerAtk].statStages[STAT_DEF]; - } - else - { - atkStat = gBattleMons[battlerAtk].spDefense; - atkStage = gBattleMons[battlerAtk].statStages[STAT_SPDEF]; - } + if (ctx->updateFlags) + RecordAbilityBattle(ctx->battlerAtk, ctx->abilityDef); + return UQ_4_12(1.0); } - else + if (reflect || lightScreen || auroraVeil) { - if (IsBattleMovePhysical(move)) - { - atkStat = gBattleMons[battlerAtk].attack; - atkStage = gBattleMons[battlerAtk].statStages[STAT_ATK]; - } - else - { - atkStat = gBattleMons[battlerAtk].spAttack; - atkStage = gBattleMons[battlerAtk].statStages[STAT_SPATK]; - } + return (IsDoubleBattle()) ? UQ_4_12(0.667) : UQ_4_12(0.5); } + return UQ_4_12(1.0); +} - // critical hits ignore attack stat's stage drops - if (damageCalcData->isCrit && atkStage < DEFAULT_STAT_STAGE) - atkStage = DEFAULT_STAT_STAGE; - // pokemon with unaware ignore attack stat changes while taking damage - if (defAbility == ABILITY_UNAWARE) - atkStage = DEFAULT_STAT_STAGE; - - atkStat *= gStatStageRatios[atkStage][0]; - atkStat /= gStatStageRatios[atkStage][1]; - - // apply attack stat modifiers - modifier = UQ_4_12(1.0); +static inline uq4_12_t GetCollisionCourseElectroDriftModifier(u32 move, uq4_12_t typeEffectivenessModifier) +{ + if (GetMoveEffect(move) == EFFECT_COLLISION_COURSE && typeEffectivenessModifier >= UQ_4_12(2.0)) + return UQ_4_12(1.3333); + return UQ_4_12(1.0); +} - // attacker's abilities - switch (atkAbility) +static inline uq4_12_t GetAttackerAbilitiesModifier(u32 battlerAtk, uq4_12_t typeEffectivenessModifier, bool32 isCrit, enum Ability abilityAtk) +{ + switch (abilityAtk) { - case ABILITY_HUGE_POWER: - case ABILITY_PURE_POWER: - if (IsBattleMovePhysical(move)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); - break; - case ABILITY_SLOW_START: - if (gDisableStructs[battlerAtk].slowStartTimer > gBattleTurnCounter) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.5)); - break; - case ABILITY_SOLAR_POWER: - if (IsBattleMoveSpecial(move) && IsBattlerWeatherAffected(battlerAtk, B_WEATHER_SUN)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); - break; - case ABILITY_DEFEATIST: - if (gBattleMons[battlerAtk].hp <= (gBattleMons[battlerAtk].maxHP / 2)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.5)); - break; - case ABILITY_FLASH_FIRE: - if (moveType == TYPE_FIRE && gDisableStructs[battlerAtk].flashFireBoosted) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); - break; - case ABILITY_SWARM: - if (moveType == TYPE_BUG && gBattleMons[battlerAtk].hp <= (gBattleMons[battlerAtk].maxHP / 3)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); + case ABILITY_NEUROFORCE: + if (typeEffectivenessModifier >= UQ_4_12(2.0)) + return UQ_4_12(1.25); break; - case ABILITY_TORRENT: - if (moveType == TYPE_WATER && gBattleMons[battlerAtk].hp <= (gBattleMons[battlerAtk].maxHP / 3)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); + case ABILITY_SNIPER: + if (isCrit) + return UQ_4_12(1.5); break; - case ABILITY_BLAZE: - if (moveType == TYPE_FIRE && gBattleMons[battlerAtk].hp <= (gBattleMons[battlerAtk].maxHP / 3)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); + case ABILITY_TINTED_LENS: + if (typeEffectivenessModifier <= UQ_4_12(0.5)) + return UQ_4_12(2.0); break; - case ABILITY_OVERGROW: - if (moveType == TYPE_GRASS && gBattleMons[battlerAtk].hp <= (gBattleMons[battlerAtk].maxHP / 3)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); + default: break; - case ABILITY_PLUS: - if (IsBattleMoveSpecial(move) && IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) + } + return UQ_4_12(1.0); +} + +static inline uq4_12_t GetDefenderAbilitiesModifier(struct DamageContext *ctx) +{ + bool32 recordAbility = FALSE; + uq4_12_t modifier = UQ_4_12(1.0); + + switch (ctx->abilityDef) + { + case ABILITY_MULTISCALE: + case ABILITY_SHADOW_SHIELD: + if (IsBattlerAtMaxHp(ctx->battlerDef)) { - u32 partnerAbility = GetBattlerAbility(BATTLE_PARTNER(battlerAtk)); - if (partnerAbility == ABILITY_MINUS - || (B_PLUS_MINUS_INTERACTION >= GEN_5 && partnerAbility == ABILITY_PLUS)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); + modifier = UQ_4_12(0.5); + recordAbility = TRUE; } break; - case ABILITY_MINUS: - if (IsBattleMoveSpecial(move) && IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) + case ABILITY_FILTER: + case ABILITY_SOLID_ROCK: + case ABILITY_PRISM_ARMOR: + if (ctx->typeEffectivenessModifier >= UQ_4_12(2.0)) { - u32 partnerAbility = GetBattlerAbility(BATTLE_PARTNER(battlerAtk)); - if (partnerAbility == ABILITY_PLUS - || (B_PLUS_MINUS_INTERACTION >= GEN_5 && partnerAbility == ABILITY_MINUS)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); + modifier = UQ_4_12(0.75); + recordAbility = TRUE; } break; - case ABILITY_FLOWER_GIFT: - if (gBattleMons[battlerAtk].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(battlerAtk, B_WEATHER_SUN) && IsBattleMovePhysical(move)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); - break; - case ABILITY_HUSTLE: - if (IsBattleMovePhysical(move)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); - break; - case ABILITY_STAKEOUT: - if (gDisableStructs[battlerDef].isFirstTurn == 2) // just switched in - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); - break; - case ABILITY_GUTS: - if (gBattleMons[battlerAtk].status1 & STATUS1_ANY && IsBattleMovePhysical(move)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); - break; - case ABILITY_TRANSISTOR: - if (moveType == TYPE_ELECTRIC) + case ABILITY_FLUFFY: + if (ctx->moveType == TYPE_FIRE && !IsMoveMakingContact(ctx->battlerAtk, ctx->battlerDef, ABILITY_NONE, ctx->holdEffectAtk, ctx->move)) { - if (B_TRANSISTOR_BOOST >= GEN_9) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); - else - modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); + modifier = UQ_4_12(2.0); + recordAbility = TRUE; } - break; - case ABILITY_DRAGONS_MAW: - if (moveType == TYPE_DRAGON) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); - break; - case ABILITY_GORILLA_TACTICS: - if (IsBattleMovePhysical(move)) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); - break; - case ABILITY_ROCKY_PAYLOAD: - if (moveType == TYPE_ROCK) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); - break; - case ABILITY_PROTOSYNTHESIS: - if (!(gBattleMons[battlerAtk].status2 & STATUS2_TRANSFORMED)) + if (ctx->moveType != TYPE_FIRE && IsMoveMakingContact(ctx->battlerAtk, ctx->battlerDef, ABILITY_NONE, ctx->holdEffectAtk, ctx->move)) { - u32 atkHighestStat = GetHighestStatId(battlerAtk); - if (((weather & B_WEATHER_SUN) && HasWeatherEffect()) || gDisableStructs[battlerAtk].boosterEnergyActivates) - { - if ((IsBattleMovePhysical(move) && atkHighestStat == STAT_ATK) || (IsBattleMoveSpecial(move) && atkHighestStat == STAT_SPATK)) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); - } + modifier = UQ_4_12(0.5); + recordAbility = TRUE; } break; - case ABILITY_QUARK_DRIVE: - if (!(gBattleMons[battlerAtk].status2 & STATUS2_TRANSFORMED)) + case ABILITY_PUNK_ROCK: + if (IsSoundMove(ctx->move)) { - u32 atkHighestStat = GetHighestStatId(battlerAtk); - if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battlerAtk].boosterEnergyActivates) - { - if ((IsBattleMovePhysical(move) && atkHighestStat == STAT_ATK) || (IsBattleMoveSpecial(move) && atkHighestStat == STAT_SPATK)) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); - } + modifier = UQ_4_12(0.5); + recordAbility = TRUE; } break; - case ABILITY_ORICHALCUM_PULSE: - if ((weather & B_WEATHER_SUN) && HasWeatherEffect() && IsBattleMovePhysical(move)) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.3333)); - break; - case ABILITY_HADRON_ENGINE: - if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && IsBattleMoveSpecial(move)) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.3333)); - break; - } - - // target's abilities - switch (defAbility) - { - case ABILITY_THICK_FAT: - if (moveType == TYPE_FIRE || moveType == TYPE_ICE) + case ABILITY_ICE_SCALES: + if (IsBattleMoveSpecial(ctx->move)) { - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.5)); - if (damageCalcData->updateFlags) - RecordAbilityBattle(battlerDef, ABILITY_THICK_FAT); + modifier = UQ_4_12(0.5); + recordAbility = TRUE; } break; + default: + break; } - // ally's abilities - if (IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) - { - switch (GetBattlerAbility(BATTLE_PARTNER(battlerAtk))) - { - case ABILITY_FLOWER_GIFT: - if (gBattleMons[BATTLE_PARTNER(battlerAtk)].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(BATTLE_PARTNER(battlerAtk), B_WEATHER_SUN) && IsBattleMovePhysical(move)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); - break; - } - } + if (recordAbility && ctx->updateFlags) + RecordAbilityBattle(ctx->battlerAtk, ctx->abilityDef); - // field abilities - if (IsAbilityOnField(ABILITY_VESSEL_OF_RUIN) && atkAbility != ABILITY_VESSEL_OF_RUIN && IsBattleMoveSpecial(move)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.75)); + return modifier; +} - if (IsAbilityOnField(ABILITY_TABLETS_OF_RUIN) && atkAbility != ABILITY_TABLETS_OF_RUIN && IsBattleMovePhysical(move)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.75)); +static inline uq4_12_t GetDefenderPartnerAbilitiesModifier(u32 battlerPartnerDef) +{ + if (!IsBattlerAlive(battlerPartnerDef)) + return UQ_4_12(1.0); - // attacker's hold effect - switch (holdEffectAtk) + switch (GetBattlerAbility(battlerPartnerDef)) { - case HOLD_EFFECT_THICK_CLUB: - if ((atkBaseSpeciesId == SPECIES_CUBONE || atkBaseSpeciesId == SPECIES_MAROWAK) && IsBattleMovePhysical(move)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); + case ABILITY_FRIEND_GUARD: + return UQ_4_12(0.75); break; - case HOLD_EFFECT_DEEP_SEA_TOOTH: - if (gBattleMons[battlerAtk].species == SPECIES_CLAMPERL && IsBattleMoveSpecial(move)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); + default: break; - case HOLD_EFFECT_LIGHT_BALL: - if (atkBaseSpeciesId == SPECIES_PIKACHU && (B_LIGHT_BALL_ATTACK_BOOST >= GEN_4 || IsBattleMoveSpecial(move))) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); + } + return UQ_4_12(1.0); +} + +static inline uq4_12_t GetAttackerItemsModifier(u32 battlerAtk, uq4_12_t typeEffectivenessModifier, enum HoldEffect holdEffectAtk) +{ + u32 metronomeTurns; + uq4_12_t metronomeBoostBase; + switch (holdEffectAtk) + { + case HOLD_EFFECT_METRONOME: + metronomeBoostBase = PercentToUQ4_12(GetBattlerHoldEffectParam(battlerAtk)); + metronomeTurns = min(gBattleStruct->metronomeItemCounter[battlerAtk], 5); + // according to bulbapedia this is the "correct" way to calculate the metronome boost + // due to the limited domain of damage numbers it will never really matter whether this is off by one + return uq4_12_add(UQ_4_12(1.0), metronomeBoostBase * metronomeTurns); break; - case HOLD_EFFECT_CHOICE_BAND: - if (IsBattleMovePhysical(move) && GetActiveGimmick(battlerAtk) != GIMMICK_DYNAMAX) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); + case HOLD_EFFECT_EXPERT_BELT: + if (typeEffectivenessModifier >= UQ_4_12(2.0)) + return UQ_4_12(1.2); break; - case HOLD_EFFECT_CHOICE_SPECS: - if (IsBattleMoveSpecial(move) && GetActiveGimmick(battlerAtk) != GIMMICK_DYNAMAX) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); + case HOLD_EFFECT_LIFE_ORB: + return UQ_4_12_FLOORED(1.3); break; default: break; } - - // The offensive stats of a Player's PokΓ©mon are boosted by x1.1 (+10%) if they have the corresponding flags set (eg. Badges) - if (ShouldGetStatBadgeBoost(B_FLAG_BADGE_BOOST_ATTACK, battlerAtk) && IsBattleMovePhysical(move)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.1)); - if (ShouldGetStatBadgeBoost(B_FLAG_BADGE_BOOST_SPATK, battlerAtk) && IsBattleMoveSpecial(move)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.1)); - - return uq4_12_multiply_by_int_half_down(modifier, atkStat); + return UQ_4_12(1.0); } -static bool32 CanEvolve(u32 species) +static inline uq4_12_t GetDefenderItemsModifier(struct DamageContext *ctx) { - u32 i; - const struct Evolution *evolutions = GetSpeciesEvolutions(species); - - if (evolutions != NULL) + switch (ctx->holdEffectDef) { - for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) + case HOLD_EFFECT_RESIST_BERRY: + if (IsUnnerveBlocked(ctx->battlerDef, gBattleMons[ctx->battlerDef].item)) + return UQ_4_12(1.0); + if (ctx->moveType == GetBattlerHoldEffectParam(ctx->battlerDef) && (ctx->moveType == TYPE_NORMAL || ctx->typeEffectivenessModifier >= UQ_4_12(2.0))) { - if (evolutions[i].method - && SanitizeSpeciesId(evolutions[i].targetSpecies) != SPECIES_NONE) - return TRUE; + if (ctx->updateFlags) + gSpecialStatuses[ctx->battlerDef].berryReduced = TRUE; + return (ctx->abilityDef == ABILITY_RIPEN) ? UQ_4_12(0.25) : UQ_4_12(0.5); } + break; + default: + break; } - return FALSE; + return UQ_4_12(1.0); } -static inline u32 CalcDefenseStat(struct DamageCalculationData *damageCalcData, u32 atkAbility, u32 defAbility, enum ItemHoldEffect holdEffectDef, u32 weather) +#define DAMAGE_MULTIPLY_MODIFIER(modifier) do { \ + finalModifier = uq4_12_multiply_half_down(modifier, finalModifier); \ +} while (0) + +// Calculates the "other" modifier which accounts for held items, abilities, +// or very specific interactions of moves that are not handled in the basic +// damage calculation. It is implemented as described by bulbapedia: +// https://bulbapedia.bulbagarden.net/wiki/Damage#Generation_V_onward +// Please Note: Fixed Point Multiplication is not associative. +// The order of operations is relevant. +static inline uq4_12_t GetOtherModifiers(struct DamageContext *ctx) { - bool32 usesDefStat; - u8 defStage; - u32 defStat, def, spDef; - uq4_12_t modifier; - u32 battlerDef = damageCalcData->battlerDef; - u32 move = damageCalcData->move; - u32 moveType = damageCalcData->moveType; - enum BattleMoveEffects moveEffect = GetMoveEffect(move); + uq4_12_t finalModifier = UQ_4_12(1.0); + u32 battlerDefPartner = BATTLE_PARTNER(ctx->battlerDef); + u32 unmodifiedAttackerSpeed = gBattleMons[ctx->battlerAtk].speed; + u32 unmodifiedDefenderSpeed = gBattleMons[ctx->battlerDef].speed; + + //TODO: Behemoth Blade, Behemoth Bash, Dynamax Cannon (Dynamax) + DAMAGE_MULTIPLY_MODIFIER(GetMinimizeModifier(ctx->move, ctx->battlerDef)); + DAMAGE_MULTIPLY_MODIFIER(GetUndergroundModifier(ctx->move, ctx->battlerDef)); + DAMAGE_MULTIPLY_MODIFIER(GetDiveModifier(ctx->move, ctx->battlerDef)); + DAMAGE_MULTIPLY_MODIFIER(GetAirborneModifier(ctx->move, ctx->battlerDef)); + DAMAGE_MULTIPLY_MODIFIER(GetScreensModifier(ctx)); + DAMAGE_MULTIPLY_MODIFIER(GetCollisionCourseElectroDriftModifier(ctx->move, ctx->typeEffectivenessModifier)); - if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM) // the defense stats are swapped + if (unmodifiedAttackerSpeed >= unmodifiedDefenderSpeed) { - def = gBattleMons[battlerDef].spDefense; - spDef = gBattleMons[battlerDef].defense; + DAMAGE_MULTIPLY_MODIFIER(GetAttackerAbilitiesModifier(ctx->battlerAtk, ctx->typeEffectivenessModifier, ctx->isCrit, ctx->abilityAtk)); + DAMAGE_MULTIPLY_MODIFIER(GetDefenderAbilitiesModifier(ctx)); + DAMAGE_MULTIPLY_MODIFIER(GetDefenderPartnerAbilitiesModifier(battlerDefPartner)); + DAMAGE_MULTIPLY_MODIFIER(GetAttackerItemsModifier(ctx->battlerAtk, ctx->typeEffectivenessModifier, ctx->holdEffectAtk)); + DAMAGE_MULTIPLY_MODIFIER(GetDefenderItemsModifier(ctx)); } else { - def = gBattleMons[battlerDef].defense; - spDef = gBattleMons[battlerDef].spDefense; + DAMAGE_MULTIPLY_MODIFIER(GetDefenderAbilitiesModifier(ctx)); + DAMAGE_MULTIPLY_MODIFIER(GetDefenderPartnerAbilitiesModifier(battlerDefPartner)); + DAMAGE_MULTIPLY_MODIFIER(GetAttackerAbilitiesModifier(ctx->battlerAtk, ctx->typeEffectivenessModifier, ctx->isCrit, ctx->abilityAtk)); + DAMAGE_MULTIPLY_MODIFIER(GetDefenderItemsModifier(ctx)); + DAMAGE_MULTIPLY_MODIFIER(GetAttackerItemsModifier(ctx->battlerAtk, ctx->typeEffectivenessModifier, ctx->holdEffectAtk)); } + return finalModifier; +} - if (moveEffect == EFFECT_PSYSHOCK || IsBattleMovePhysical(move)) // uses defense stat instead of sp.def +#undef DAMAGE_ACCUMULATE_MULTIPLIER + +#define DAMAGE_APPLY_MODIFIER(modifier) do { \ + dmg = uq4_12_multiply_by_int_half_down(modifier, dmg); \ +} while (0) + +static inline s32 DoMoveDamageCalcVars(struct DamageContext *ctx) +{ + s32 dmg; + u32 userFinalAttack; + u32 targetFinalDefense; + + if (ctx->fixedBasePower) + gBattleMovePower = ctx->fixedBasePower; + else + gBattleMovePower = CalcMoveBasePowerAfterModifiers(ctx); + + userFinalAttack = CalcAttackStat(ctx); + targetFinalDefense = CalcDefenseStat(ctx); + + dmg = CalculateBaseDamage(gBattleMovePower, userFinalAttack, gBattleMons[ctx->battlerAtk].level, targetFinalDefense); + DAMAGE_APPLY_MODIFIER(GetTargetDamageModifier(ctx)); + DAMAGE_APPLY_MODIFIER(GetParentalBondModifier(ctx->battlerAtk)); + DAMAGE_APPLY_MODIFIER(GetWeatherDamageModifier(ctx)); + DAMAGE_APPLY_MODIFIER(GetCriticalModifier(ctx->isCrit)); + DAMAGE_APPLY_MODIFIER(GetGlaiveRushModifier(ctx->battlerDef)); + + if (ctx->randomFactor) { - defStat = def; - defStage = gBattleMons[battlerDef].statStages[STAT_DEF]; - usesDefStat = TRUE; + dmg *= DMG_ROLL_PERCENT_HI - RandomUniform(RNG_DAMAGE_MODIFIER, 0, DMG_ROLL_PERCENT_HI - DMG_ROLL_PERCENT_LO); + dmg /= 100; } - else // is special + else // Apply rest of modifiers in the ai function { - defStat = spDef; - defStage = gBattleMons[battlerDef].statStages[STAT_SPDEF]; - usesDefStat = FALSE; + if (dmg == 0) + dmg = 1; + return dmg; } - // Self-destruct / Explosion cut defense in half - if (B_EXPLOSION_DEFENSE < GEN_5 && moveEffect == EFFECT_EXPLOSION) - defStat /= 2; + dmg = ApplyModifiersAfterDmgRoll(ctx, dmg); - // critical hits ignore positive stat changes - if (damageCalcData->isCrit && defStage > DEFAULT_STAT_STAGE) - defStage = DEFAULT_STAT_STAGE; - // pokemon with unaware ignore defense stat changes while dealing damage - if (atkAbility == ABILITY_UNAWARE) - defStage = DEFAULT_STAT_STAGE; - // certain moves also ignore stat changes - if (MoveIgnoresDefenseEvasionStages(move)) - defStage = DEFAULT_STAT_STAGE; + if (dmg == 0) + dmg = 1; + return dmg; +} - defStat *= gStatStageRatios[defStage][0]; - defStat /= gStatStageRatios[defStage][1]; +s32 ApplyModifiersAfterDmgRoll(struct DamageContext *ctx, s32 dmg) +{ + if (GetActiveGimmick(ctx->battlerAtk) == GIMMICK_TERA) + DAMAGE_APPLY_MODIFIER(GetTeraMultiplier(ctx)); + else + DAMAGE_APPLY_MODIFIER(GetSameTypeAttackBonusModifier(ctx)); + DAMAGE_APPLY_MODIFIER(ctx->typeEffectivenessModifier); + DAMAGE_APPLY_MODIFIER(GetBurnOrFrostBiteModifier(ctx)); + DAMAGE_APPLY_MODIFIER(GetZMaxMoveAgainstProtectionModifier(ctx)); + DAMAGE_APPLY_MODIFIER(GetOtherModifiers(ctx)); - // apply defense stat modifiers - modifier = UQ_4_12(1.0); + return dmg; +} - // target's abilities - switch (defAbility) +s32 DoFixedDamageMoveCalc(struct DamageContext *ctx) +{ + s32 dmg = 0; + s32 randDamage; + + switch (GetMoveEffect(ctx->move)) { - case ABILITY_MARVEL_SCALE: - if (gBattleMons[battlerDef].status1 & STATUS1_ANY && usesDefStat) - { - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); - if (damageCalcData->updateFlags) - RecordAbilityBattle(battlerDef, ABILITY_MARVEL_SCALE); - } + case EFFECT_LEVEL_DAMAGE: + dmg = gBattleMons[ctx->battlerAtk].level; break; - case ABILITY_FUR_COAT: - if (usesDefStat) - { - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); - if (damageCalcData->updateFlags) - RecordAbilityBattle(battlerDef, ABILITY_FUR_COAT); - } + case EFFECT_PSYWAVE: + randDamage = B_PSYWAVE_DMG >= GEN_5 ? (Random() % 101) : ((Random() % 11) * 10); + dmg = gBattleMons[ctx->battlerAtk].level * (randDamage + 50) / 100; break; - case ABILITY_GRASS_PELT: - if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && usesDefStat) - { - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); - if (damageCalcData->updateFlags) - RecordAbilityBattle(battlerDef, ABILITY_GRASS_PELT); - } + case EFFECT_FIXED_HP_DAMAGE: + dmg = GetMoveFixedHPDamage(ctx->move); break; - case ABILITY_FLOWER_GIFT: - if (gBattleMons[battlerDef].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(battlerDef, B_WEATHER_SUN) && !usesDefStat) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); + case EFFECT_FIXED_PERCENT_DAMAGE: + dmg = GetNonDynamaxHP(ctx->battlerDef) * GetMoveDamagePercentage(ctx->move) / 100; break; - case ABILITY_PURIFYING_SALT: - if (moveType == TYPE_GHOST) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); + case EFFECT_FINAL_GAMBIT: + dmg = GetNonDynamaxHP(ctx->battlerAtk); + break; + case EFFECT_BEAT_UP: + if (GetConfig(CONFIG_BEAT_UP) < GEN_5) + dmg = CalcBeatUpDamage(ctx); + else + return INT32_MAX; break; + default: + return INT32_MAX; } - // ally's abilities - if (IsBattlerAlive(BATTLE_PARTNER(battlerDef))) - { - switch (GetBattlerAbility(BATTLE_PARTNER(battlerDef))) - { - case ABILITY_FLOWER_GIFT: - if (gBattleMons[BATTLE_PARTNER(battlerDef)].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(BATTLE_PARTNER(battlerDef), B_WEATHER_SUN) && !usesDefStat) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); - break; - } - } + gBattleStruct->moveResultFlags[ctx->battlerDef] &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE); - // field abilities - if (IsAbilityOnField(ABILITY_SWORD_OF_RUIN) && defAbility != ABILITY_SWORD_OF_RUIN && usesDefStat) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.75)); + if (dmg == 0) + dmg = 1; - if (IsAbilityOnField(ABILITY_BEADS_OF_RUIN) && defAbility != ABILITY_BEADS_OF_RUIN && !usesDefStat) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.75)); + return dmg; +} - // target's hold effects - switch (holdEffectDef) - { - case HOLD_EFFECT_DEEP_SEA_SCALE: - if (gBattleMons[battlerDef].species == SPECIES_CLAMPERL && !usesDefStat) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); - break; - case HOLD_EFFECT_METAL_POWDER: - if (gBattleMons[battlerDef].species == SPECIES_DITTO && usesDefStat && !(gBattleMons[battlerDef].status2 & STATUS2_TRANSFORMED)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); - break; - case HOLD_EFFECT_EVIOLITE: - if (CanEvolve(gBattleMons[battlerDef].species)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); - break; - case HOLD_EFFECT_ASSAULT_VEST: - if (!usesDefStat) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); - break; - case HOLD_EFFECT_SOUL_DEW: - if (B_SOUL_DEW_BOOST < GEN_7 - && (gBattleMons[battlerDef].species == SPECIES_LATIAS || gBattleMons[battlerDef].species == SPECIES_LATIOS) - && !(gBattleTypeFlags & BATTLE_TYPE_FRONTIER) - && !usesDefStat) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); - break; - default: - break; +static inline s32 DoMoveDamageCalc(struct DamageContext *ctx) +{ + if (ctx->typeEffectivenessModifier == UQ_4_12(0.0)) + return 0; + + s32 dmg = DoFixedDamageMoveCalc(ctx); + if (dmg != INT32_MAX) + return dmg; + + ctx->abilityAtk = GetBattlerAbility(ctx->battlerAtk); + ctx->abilityDef = GetBattlerAbility(ctx->battlerDef); + ctx->holdEffectDef = GetBattlerHoldEffect(ctx->battlerDef); + ctx->holdEffectAtk = GetBattlerHoldEffect(ctx->battlerAtk); + + return DoMoveDamageCalcVars(ctx); +} + +static inline s32 DoFutureSightAttackDamageCalcVars(struct DamageContext *ctx) +{ + s32 dmg; + u32 userFinalAttack; + u32 targetFinalDefense; + u32 battlerAtk = ctx->battlerAtk; + u32 battlerDef = ctx->battlerDef; + u32 move = ctx->move; + enum Type moveType = ctx->moveType; + + struct Pokemon *party = GetBattlerParty(battlerAtk); + struct Pokemon *partyMon = &party[gWishFutureKnock.futureSightPartyIndex[battlerDef]]; + u32 partyMonLevel = GetMonData(partyMon, MON_DATA_LEVEL, NULL); + u32 partyMonSpecies = GetMonData(partyMon, MON_DATA_SPECIES, NULL); + gBattleMovePower = GetMovePower(move); + + if (IsBattleMovePhysical(move)) + userFinalAttack = GetMonData(partyMon, MON_DATA_ATK, NULL); + else + userFinalAttack = GetMonData(partyMon, MON_DATA_SPATK, NULL); + + targetFinalDefense = CalcDefenseStat(ctx); + dmg = CalculateBaseDamage(gBattleMovePower, userFinalAttack, partyMonLevel, targetFinalDefense); + + DAMAGE_APPLY_MODIFIER(GetCriticalModifier(ctx->isCrit)); + + if (ctx->randomFactor) + { + dmg *= DMG_ROLL_PERCENT_HI - RandomUniform(RNG_DAMAGE_MODIFIER, 0, DMG_ROLL_PERCENT_HI - DMG_ROLL_PERCENT_LO); + dmg /= 100; } - // sandstorm sp.def boost for rock types - if (B_SANDSTORM_SPDEF_BOOST >= GEN_4 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ROCK) && IsBattlerWeatherAffected(battlerDef, B_WEATHER_SANDSTORM) && !usesDefStat) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); - // snow def boost for ice types - if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE) && IsBattlerWeatherAffected(battlerDef, B_WEATHER_SNOW) && usesDefStat) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); + // Same type attack bonus + if (GetSpeciesType(partyMonSpecies, 0) == moveType || GetSpeciesType(partyMonSpecies, 1) == moveType) + DAMAGE_APPLY_MODIFIER(UQ_4_12(1.5)); + else + DAMAGE_APPLY_MODIFIER(UQ_4_12(1.0)); + DAMAGE_APPLY_MODIFIER(ctx->typeEffectivenessModifier); - // The offensive stats of a Player's PokΓ©mon are boosted by x1.1 (+10%) if they have the corresponding flags set (eg. Badges) - if (ShouldGetStatBadgeBoost(B_FLAG_BADGE_BOOST_DEFENSE, battlerDef) && IsBattleMovePhysical(move)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.1)); - if (ShouldGetStatBadgeBoost(B_FLAG_BADGE_BOOST_SPDEF, battlerDef) && IsBattleMoveSpecial(move)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.1)); + if (dmg == 0) + dmg = 1; - return uq4_12_multiply_by_int_half_down(modifier, defStat); + return dmg; } -// base damage formula before adding any modifiers -static inline s32 CalculateBaseDamage(u32 power, u32 userFinalAttack, u32 level, u32 targetFinalDefense) +static inline s32 DoFutureSightAttackDamageCalc(struct DamageContext *ctx) { - return power * userFinalAttack * (2 * level / 5 + 2) / targetFinalDefense / 50 + 2; -} + if (ctx->typeEffectivenessModifier == UQ_4_12(0.0)) + return 0; -static inline uq4_12_t GetTargetDamageModifier(struct DamageCalculationData *damageCalcData) -{ - if (IsDoubleBattle() && GetMoveTargetCount(damageCalcData) >= 2) - return B_MULTIPLE_TARGETS_DMG >= GEN_4 ? UQ_4_12(0.75) : UQ_4_12(0.5); - return UQ_4_12(1.0); + return DoFutureSightAttackDamageCalcVars(ctx); } -static inline uq4_12_t GetParentalBondModifier(u32 battlerAtk) -{ - if (gSpecialStatuses[battlerAtk].parentalBondState != PARENTAL_BOND_2ND_HIT) - return UQ_4_12(1.0); - return B_PARENTAL_BOND_DMG >= GEN_7 ? UQ_4_12(0.25) : UQ_4_12(0.5); -} +#undef DAMAGE_APPLY_MODIFIER -static inline uq4_12_t GetSameTypeAttackBonusModifier(struct DamageCalculationData *damageCalcData, u32 abilityAtk) +static u32 GetWeather(void) { - u32 battlerAtk = damageCalcData->battlerAtk; - u32 move = damageCalcData->move; - u32 moveType = damageCalcData->moveType; - - if (moveType == TYPE_MYSTERY) - return UQ_4_12(1.0); - else if (gBattleStruct->pledgeMove && IS_BATTLER_OF_TYPE(BATTLE_PARTNER(battlerAtk), moveType)) - return (abilityAtk == ABILITY_ADAPTABILITY) ? UQ_4_12(2.0) : UQ_4_12(1.5); - else if (!IS_BATTLER_OF_TYPE(battlerAtk, moveType) || move == MOVE_STRUGGLE || move == MOVE_NONE) - return UQ_4_12(1.0); - return (abilityAtk == ABILITY_ADAPTABILITY) ? UQ_4_12(2.0) : UQ_4_12(1.5); + if (gBattleWeather == B_WEATHER_NONE || !HasWeatherEffect()) + return B_WEATHER_NONE; + else + return gBattleWeather; } -// Utility Umbrella holders take normal damage from what would be rain- and sun-weakened attacks. -static uq4_12_t GetWeatherDamageModifier(struct DamageCalculationData *damageCalcData, enum ItemHoldEffect holdEffectAtk, enum ItemHoldEffect holdEffectDef, u32 weather) +bool32 IsFutureSightAttackerInParty(u32 battlerAtk, u32 battlerDef, u32 move) { - u32 move = damageCalcData->move; - u32 moveType = damageCalcData->moveType; - - if (weather == B_WEATHER_NONE) - return UQ_4_12(1.0); - if (GetMoveEffect(move) == EFFECT_HYDRO_STEAM && (weather & B_WEATHER_SUN) && holdEffectAtk != HOLD_EFFECT_UTILITY_UMBRELLA) - return UQ_4_12(1.5); - if (holdEffectDef == HOLD_EFFECT_UTILITY_UMBRELLA) - return UQ_4_12(1.0); + if (GetMoveEffect(move) != EFFECT_FUTURE_SIGHT) + return FALSE; - if (weather & B_WEATHER_RAIN) - { - if (moveType != TYPE_FIRE && moveType != TYPE_WATER) - return UQ_4_12(1.0); - return (moveType == TYPE_FIRE) ? UQ_4_12(0.5) : UQ_4_12(1.5); - } - if (weather & B_WEATHER_SUN) + struct Pokemon *party = GetBattlerParty(battlerAtk); + if (IsDoubleBattle()) { - if (moveType != TYPE_FIRE && moveType != TYPE_WATER) - return UQ_4_12(1.0); - return (moveType == TYPE_WATER) ? UQ_4_12(0.5) : UQ_4_12(1.5); + return &party[gWishFutureKnock.futureSightPartyIndex[battlerDef]] != &party[gBattlerPartyIndexes[battlerAtk]] + && &party[gWishFutureKnock.futureSightPartyIndex[battlerDef]] != &party[gBattlerPartyIndexes[BATTLE_PARTNER(battlerAtk)]]; } - return UQ_4_12(1.0); + + return &party[gWishFutureKnock.futureSightPartyIndex[battlerDef]] != &party[gBattlerPartyIndexes[battlerAtk]]; } -static inline uq4_12_t GetBurnOrFrostBiteModifier(struct DamageCalculationData *damageCalcData, u32 abilityAtk) +s32 CalculateMoveDamage(struct DamageContext *ctx) { - u32 battlerAtk = damageCalcData->battlerAtk; - u32 move = damageCalcData->move; - enum BattleMoveEffects moveEffect = GetMoveEffect(move); + ctx->weather = GetWeather(); + ctx->abilityAtk = GetBattlerAbility(ctx->battlerAtk); + ctx->abilityDef = GetBattlerAbility(ctx->battlerDef); + ctx->holdEffectAtk = GetBattlerHoldEffect(ctx->battlerAtk); + ctx->holdEffectDef = GetBattlerHoldEffect(ctx->battlerDef); - if (gBattleMons[battlerAtk].status1 & STATUS1_BURN - && IsBattleMovePhysical(move) - && (B_BURN_FACADE_DMG < GEN_6 || moveEffect != EFFECT_FACADE) - && abilityAtk != ABILITY_GUTS) - return UQ_4_12(0.5); - if (gBattleMons[battlerAtk].status1 & STATUS1_FROSTBITE - && IsBattleMoveSpecial(move) - && (B_BURN_FACADE_DMG < GEN_6 || moveEffect != EFFECT_FACADE)) - return UQ_4_12(0.5); - return UQ_4_12(1.0); -} + ctx->typeEffectivenessModifier = CalcTypeEffectivenessMultiplier(ctx); -static inline uq4_12_t GetCriticalModifier(bool32 isCrit) -{ - if (isCrit) - return GetGenConfig(GEN_CONFIG_CRIT_MULTIPLIER) >= GEN_6 ? UQ_4_12(1.5) : UQ_4_12(2.0); - return UQ_4_12(1.0); -} + if (IsFutureSightAttackerInParty(ctx->battlerAtk, ctx->battlerDef, ctx->move)) + return DoFutureSightAttackDamageCalc(ctx); -static inline uq4_12_t GetGlaiveRushModifier(u32 battlerDef) -{ - if (gStatuses4[battlerDef] & STATUS4_GLAIVE_RUSH) - return UQ_4_12(2.0); - return UQ_4_12(1.0); + return DoMoveDamageCalc(ctx); } -static inline uq4_12_t GetZMaxMoveAgainstProtectionModifier(struct DamageCalculationData *damageCalcData) +// for AI so that typeEffectivenessModifier, weather, abilities and holdEffects are calculated only once +s32 CalculateMoveDamageVars(struct DamageContext *ctx) { - if (!IsZMove(damageCalcData->move) && !IsMaxMove(damageCalcData->move)) - return UQ_4_12(1.0); + s32 dmg = DoFixedDamageMoveCalc(ctx); + if (dmg != INT32_MAX) + return dmg; - u32 protected = gProtectStructs[damageCalcData->battlerDef].protected; - if (protected != PROTECT_NONE - && protected != PROTECT_WIDE_GUARD - && protected != PROTECT_QUICK_GUARD - && protected != PROTECT_CRAFTY_SHIELD - && protected != PROTECT_MAT_BLOCK - && protected != PROTECT_MAX_GUARD) - return UQ_4_12(0.25); - return UQ_4_12(1.0); + return DoMoveDamageCalcVars(ctx); } -static inline uq4_12_t GetMinimizeModifier(u32 move, u32 battlerDef) +static inline void MulByTypeEffectiveness(struct DamageContext *ctx, uq4_12_t *modifier, enum Type defType) { - if (MoveIncreasesPowerToMinimizedTargets(move) && gStatuses3[battlerDef] & STATUS3_MINIMIZED) - return UQ_4_12(2.0); - return UQ_4_12(1.0); -} + uq4_12_t mod = GetTypeModifier(ctx->moveType, defType); -static inline uq4_12_t GetUndergroundModifier(u32 move, u32 battlerDef) -{ - if (MoveDamagesUnderground(move) && gStatuses3[battlerDef] & STATUS3_UNDERGROUND) - return UQ_4_12(2.0); - return UQ_4_12(1.0); -} + if (mod == UQ_4_12(0.0) && ctx->holdEffectDef == HOLD_EFFECT_RING_TARGET) + { + mod = UQ_4_12(1.0); + if (ctx->updateFlags) + RecordItemEffectBattle(ctx->battlerDef, HOLD_EFFECT_RING_TARGET); + } + else if ((ctx->moveType == TYPE_FIGHTING || ctx->moveType == TYPE_NORMAL) && defType == TYPE_GHOST && gBattleMons[ctx->battlerDef].volatiles.foresight && mod == UQ_4_12(0.0)) + { + mod = UQ_4_12(1.0); + } + else if ((ctx->moveType == TYPE_FIGHTING || ctx->moveType == TYPE_NORMAL) && defType == TYPE_GHOST + && (ctx->abilityAtk == ABILITY_SCRAPPY || ctx->abilityAtk == ABILITY_MINDS_EYE) + && mod == UQ_4_12(0.0)) + { + mod = UQ_4_12(1.0); + if (ctx->updateFlags) + RecordAbilityBattle(ctx->battlerAtk, ctx->abilityAtk); + } -static inline uq4_12_t GetDiveModifier(u32 move, u32 battlerDef) -{ - if (MoveDamagesUnderWater(move) && gStatuses3[battlerDef] & STATUS3_UNDERWATER) - return UQ_4_12(2.0); - return UQ_4_12(1.0); -} + if (ctx->moveType == TYPE_PSYCHIC && defType == TYPE_DARK && gBattleMons[ctx->battlerDef].volatiles.miracleEye && mod == UQ_4_12(0.0)) + mod = UQ_4_12(1.0); + if (GetMoveEffect(ctx->move) == EFFECT_SUPER_EFFECTIVE_ON_ARG && defType == GetMoveArgType(ctx->move) && !ctx->isAnticipation) + mod = UQ_4_12(2.0); + if (ctx->moveType == TYPE_GROUND && defType == TYPE_FLYING && IsBattlerGrounded(ctx->battlerDef, ctx->abilityDef, ctx->holdEffectDef) && mod == UQ_4_12(0.0)) + mod = UQ_4_12(1.0); + if (ctx->moveType == TYPE_STELLAR && GetActiveGimmick(ctx->battlerDef) == GIMMICK_TERA) + mod = UQ_4_12(2.0); -static inline uq4_12_t GetAirborneModifier(u32 move, u32 battlerDef) -{ - if (MoveDamagesAirborneDoubleDamage(move) && gStatuses3[battlerDef] & STATUS3_ON_AIR) - return UQ_4_12(2.0); - return UQ_4_12(1.0); -} + // B_WEATHER_STRONG_WINDS weakens Super Effective moves against Flying-type PokΓ©mon + if (gBattleWeather & B_WEATHER_STRONG_WINDS && HasWeatherEffect() && !ctx->isAnticipation) + { + if (defType == TYPE_FLYING && mod >= UQ_4_12(2.0)) + mod = UQ_4_12(1.0); + } -static inline uq4_12_t GetScreensModifier(u32 move, u32 battlerAtk, u32 battlerDef, bool32 isCrit, u32 abilityAtk) -{ - u32 sideStatus = gSideStatuses[GetBattlerSide(battlerDef)]; - bool32 lightScreen = (sideStatus & SIDE_STATUS_LIGHTSCREEN) && IsBattleMoveSpecial(move); - bool32 reflect = (sideStatus & SIDE_STATUS_REFLECT) && IsBattleMovePhysical(move); - bool32 auroraVeil = sideStatus & SIDE_STATUS_AURORA_VEIL; + if (gSpecialStatuses[ctx->battlerDef].distortedTypeMatchups || (mod > UQ_4_12(0.0) && ShouldTeraShellDistortTypeMatchups(ctx->move, ctx->battlerDef, ctx->abilityDef))) + { + mod = UQ_4_12(0.5); + if (ctx->updateFlags) + { + RecordAbilityBattle(ctx->battlerDef, ctx->abilityDef); + gSpecialStatuses[ctx->battlerDef].distortedTypeMatchups = TRUE; + gSpecialStatuses[ctx->battlerDef].teraShellAbilityDone = TRUE; + } + } - if (isCrit || abilityAtk == ABILITY_INFILTRATOR || gProtectStructs[battlerAtk].confusionSelfDmg) - return UQ_4_12(1.0); - if (reflect || lightScreen || auroraVeil) - return (IsDoubleBattle()) ? UQ_4_12(0.667) : UQ_4_12(0.5); - return UQ_4_12(1.0); + *modifier = uq4_12_multiply(*modifier, mod); } -static inline uq4_12_t GetCollisionCourseElectroDriftModifier(u32 move, uq4_12_t typeEffectivenessModifier) +static inline void TryNoticeIllusionInTypeEffectiveness(u32 move, enum Type moveType, u32 battlerAtk, u32 battlerDef, uq4_12_t resultingModifier, u32 illusionSpecies) { - if (GetMoveEffect(move) == EFFECT_COLLISION_COURSE && typeEffectivenessModifier >= UQ_4_12(2.0)) - return UQ_4_12(1.3333); - return UQ_4_12(1.0); + // Check if the type effectiveness would've been different if the pokemon really had the types as the disguise. + uq4_12_t presumedModifier = UQ_4_12(1.0); + + struct DamageContext ctx = {0}; + ctx.battlerAtk = battlerAtk; + ctx.battlerDef = battlerDef; + ctx.move = ctx.chosenMove = move; + ctx.moveType = moveType; + ctx.updateFlags = FALSE; + ctx.abilityAtk = GetBattlerAbility(battlerAtk); + ctx.abilityDef = ABILITY_ILLUSION; + ctx.holdEffectAtk = GetBattlerHoldEffect(battlerAtk); + ctx.holdEffectDef = GetBattlerHoldEffect(battlerDef); + + MulByTypeEffectiveness(&ctx, &presumedModifier, GetSpeciesType(illusionSpecies, 0)); + if (GetSpeciesType(illusionSpecies, 1) != GetSpeciesType(illusionSpecies, 0)) + MulByTypeEffectiveness(&ctx, &presumedModifier, GetSpeciesType(illusionSpecies, 1)); + + if (presumedModifier != resultingModifier) + RecordAbilityBattle(ctx.battlerDef, ABILITY_ILLUSION); } -static inline uq4_12_t GetAttackerAbilitiesModifier(u32 battlerAtk, uq4_12_t typeEffectivenessModifier, bool32 isCrit, u32 abilityAtk) +void UpdateMoveResultFlags(uq4_12_t modifier, u16 *resultFlags) { - switch (abilityAtk) + if (modifier == UQ_4_12(0.0)) { - case ABILITY_NEUROFORCE: - if (typeEffectivenessModifier >= UQ_4_12(2.0)) - return UQ_4_12(1.25); - break; - case ABILITY_SNIPER: - if (isCrit) - return UQ_4_12(1.5); - break; - case ABILITY_TINTED_LENS: - if (typeEffectivenessModifier <= UQ_4_12(0.5)) - return UQ_4_12(2.0); - break; + *resultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; + *resultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE); + gBattleStruct->blunderPolicy = FALSE; // Don't activate if missed + } + else if (modifier == UQ_4_12(1.0)) + { + *resultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE); + } + else if (modifier > UQ_4_12(1.0)) + { + *resultFlags |= MOVE_RESULT_SUPER_EFFECTIVE; + *resultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE); + } + else //if (modifier < UQ_4_12(1.0)) + { + *resultFlags |= MOVE_RESULT_NOT_VERY_EFFECTIVE; + *resultFlags &= ~(MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE); } - return UQ_4_12(1.0); } -static inline uq4_12_t GetDefenderAbilitiesModifier(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, uq4_12_t typeEffectivenessModifier, u32 abilityDef) +static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(struct DamageContext *ctx, uq4_12_t modifier) { - switch (abilityDef) + u32 illusionSpecies; + enum Type types[3]; + GetBattlerTypes(ctx->battlerDef, FALSE, types); + + MulByTypeEffectiveness(ctx, &modifier, types[0]); + if (types[1] != types[0]) + MulByTypeEffectiveness(ctx, &modifier, types[1]); + if (types[2] != TYPE_MYSTERY && types[2] != types[1] && types[2] != types[0]) + MulByTypeEffectiveness(ctx, &modifier, types[2]); + if (ctx->moveType == TYPE_FIRE && gDisableStructs[ctx->battlerDef].tarShot) + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); + + if (ctx->updateFlags && (illusionSpecies = GetIllusionMonSpecies(ctx->battlerDef))) + TryNoticeIllusionInTypeEffectiveness(ctx->move, ctx->moveType, ctx->battlerAtk, ctx->battlerDef, modifier, illusionSpecies); + + if (GetMoveCategory(ctx->move) == DAMAGE_CATEGORY_STATUS && ctx->move != MOVE_THUNDER_WAVE) { - case ABILITY_MULTISCALE: - case ABILITY_SHADOW_SHIELD: - if (IsBattlerAtMaxHp(battlerDef)) - return UQ_4_12(0.5); - break; - case ABILITY_FILTER: - case ABILITY_SOLID_ROCK: - case ABILITY_PRISM_ARMOR: - if (typeEffectivenessModifier >= UQ_4_12(2.0)) - return UQ_4_12(0.75); - break; - case ABILITY_FLUFFY: - if (!IsMoveMakingContact(move, battlerAtk) && moveType == TYPE_FIRE) - return UQ_4_12(2.0); - if (IsMoveMakingContact(move, battlerAtk) && moveType != TYPE_FIRE) - return UQ_4_12(0.5); - break; - case ABILITY_PUNK_ROCK: - if (IsSoundMove(move)) - return UQ_4_12(0.5); - break; - case ABILITY_ICE_SCALES: - if (IsBattleMoveSpecial(move)) - return UQ_4_12(0.5); - break; + modifier = UQ_4_12(1.0); + if (B_GLARE_GHOST < GEN_4 && ctx->move == MOVE_GLARE && IS_BATTLER_OF_TYPE(ctx->battlerDef, TYPE_GHOST)) + modifier = UQ_4_12(0.0); + } + else if (ctx->moveType == TYPE_GROUND && !IsBattlerGroundedInverseCheck(ctx->battlerDef, ctx->abilityDef, ctx->holdEffectDef, INVERSE_BATTLE, ctx->isAnticipation) && !(MoveIgnoresTypeIfFlyingAndUngrounded(ctx->move))) + { + modifier = UQ_4_12(0.0); + if (ctx->updateFlags && ctx->abilityDef == ABILITY_LEVITATE) + { + gBattleStruct->moveResultFlags[ctx->battlerDef] |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); + gLastUsedAbility = ABILITY_LEVITATE; + gLastLandedMoves[ctx->battlerDef] = 0; + gBattleStruct->missStringId[ctx->battlerDef] = B_MSG_GROUND_MISS; + RecordAbilityBattle(ctx->battlerDef, ABILITY_LEVITATE); + } + } + else if (GetConfig(CONFIG_SHEER_COLD_IMMUNITY) >= GEN_7 && GetMoveEffect(ctx->move) == EFFECT_SHEER_COLD && IS_BATTLER_OF_TYPE(ctx->battlerDef, TYPE_ICE)) + { + modifier = UQ_4_12(0.0); } - return UQ_4_12(1.0); -} -static inline uq4_12_t GetDefenderPartnerAbilitiesModifier(u32 battlerPartnerDef) -{ - if (!IsBattlerAlive(battlerPartnerDef)) - return UQ_4_12(1.0); + // Thousand Arrows ignores type modifiers for flying mons + if (MoveIgnoresTypeIfFlyingAndUngrounded(ctx->move) + && !IsBattlerGrounded(ctx->battlerDef, ctx->abilityDef, ctx->holdEffectDef) + && IS_BATTLER_OF_TYPE(ctx->battlerDef, TYPE_FLYING)) + { + modifier = UQ_4_12(1.0); + } - switch (GetBattlerAbility(battlerPartnerDef)) + // Iron Ball ignores type modifiers for flying-type mons if it is the only source of grounding + if (GetConfig(CONFIG_IRON_BALL) >= GEN_5 + && ctx->moveType == TYPE_GROUND + && ctx->holdEffectDef == HOLD_EFFECT_IRON_BALL + && IS_BATTLER_OF_TYPE(ctx->battlerDef, TYPE_FLYING) + && !IsBattlerGrounded(ctx->battlerDef, ctx->abilityDef, HOLD_EFFECT_NONE) // We want to ignore Iron Ball so skip item check + && !FlagGet(B_FLAG_INVERSE_BATTLE)) { - case ABILITY_FRIEND_GUARD: - return UQ_4_12(0.75); - break; + modifier = UQ_4_12(1.0); } - return UQ_4_12(1.0); -} -static inline uq4_12_t GetAttackerItemsModifier(u32 battlerAtk, uq4_12_t typeEffectivenessModifier, enum ItemHoldEffect holdEffectAtk) -{ - u32 metronomeTurns; - uq4_12_t metronomeBoostBase; - switch (holdEffectAtk) + if (((ctx->abilityDef == ABILITY_WONDER_GUARD && modifier <= UQ_4_12(1.0)) + || (ctx->abilityDef == ABILITY_TELEPATHY && ctx->battlerDef == BATTLE_PARTNER(ctx->battlerAtk))) + && GetMovePower(ctx->move) != 0) { - case HOLD_EFFECT_METRONOME: - metronomeBoostBase = PercentToUQ4_12(GetBattlerHoldEffectParam(battlerAtk)); - metronomeTurns = min(gBattleStruct->sameMoveTurns[battlerAtk], 5); - // according to bulbapedia this is the "correct" way to calculate the metronome boost - // due to the limited domain of damage numbers it will never really matter whether this is off by one - return uq4_12_add(UQ_4_12(1.0), metronomeBoostBase * metronomeTurns); - break; - case HOLD_EFFECT_EXPERT_BELT: - if (typeEffectivenessModifier >= UQ_4_12(2.0)) - return UQ_4_12(1.2); - break; - case HOLD_EFFECT_LIFE_ORB: - return UQ_4_12_FLOORED(1.3); - break; - default: - break; + modifier = UQ_4_12(0.0); + if (ctx->updateFlags) + { + gLastUsedAbility = gBattleMons[ctx->battlerDef].ability; + gBattleStruct->moveResultFlags[ctx->battlerDef] |= MOVE_RESULT_MISSED; + gLastLandedMoves[ctx->battlerDef] = 0; + gBattleStruct->missStringId[ctx->battlerDef] = B_MSG_AVOIDED_DMG; + RecordAbilityBattle(ctx->battlerDef, gBattleMons[ctx->battlerDef].ability); + } } - return UQ_4_12(1.0); + + if (ctx->updateFlags) + TryInitializeFirstSTABMoveTrainerSlide(ctx->battlerDef, ctx->battlerAtk, ctx->moveType); + + return modifier; } -static inline uq4_12_t GetDefenderItemsModifier(struct DamageCalculationData *damageCalcData, uq4_12_t typeEffectivenessModifier, u32 abilityDef, enum ItemHoldEffect holdEffectDef) +uq4_12_t CalcTypeEffectivenessMultiplier(struct DamageContext *ctx) { - u32 battlerDef = damageCalcData->battlerDef; - u32 moveType = damageCalcData->moveType; - - u32 holdEffectDefParam = GetBattlerHoldEffectParam(battlerDef); - u32 itemDef = gBattleMons[battlerDef].item; + uq4_12_t modifier = UQ_4_12(1.0); - switch (holdEffectDef) + if (ctx->move != MOVE_STRUGGLE && ctx->moveType != TYPE_MYSTERY) { - case HOLD_EFFECT_RESIST_BERRY: - if (UnnerveOn(battlerDef, itemDef)) - return UQ_4_12(1.0); - if (moveType == holdEffectDefParam && (moveType == TYPE_NORMAL || typeEffectivenessModifier >= UQ_4_12(2.0))) + modifier = CalcTypeEffectivenessMultiplierInternal(ctx, modifier); + if (GetMoveEffect(ctx->move) == EFFECT_TWO_TYPED_MOVE && !ctx->isAnticipation) { - if (damageCalcData->updateFlags) - gSpecialStatuses[battlerDef].berryReduced = TRUE; - return (abilityDef == ABILITY_RIPEN) ? UQ_4_12(0.25) : UQ_4_12(0.5); + ctx->moveType = GetMoveArgType(ctx->move); + modifier = CalcTypeEffectivenessMultiplierInternal(ctx, modifier); } - break; - default: - break; } - return UQ_4_12(1.0); -} -#define DAMAGE_MULTIPLY_MODIFIER(modifier) do { \ - finalModifier = uq4_12_multiply_half_down(modifier, finalModifier); \ -} while (0) + if (ctx->updateFlags) + UpdateMoveResultFlags(modifier, &gBattleStruct->moveResultFlags[ctx->battlerDef]); + return modifier; +} -// Calculates the "other" modifier which accounts for held items, abilities, -// or very specific interactions of moves that are not handled in the basic -// damage calculation. It is implemented as described by bulbapedia: -// https://bulbapedia.bulbagarden.net/wiki/Damage#Generation_V_onward -// Please Note: Fixed Point Multiplication is not associative. -// The order of operations is relevant. -static inline uq4_12_t GetOtherModifiers(struct DamageCalculationData *damageCalcData, uq4_12_t typeEffectivenessModifier, - u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk, enum ItemHoldEffect holdEffectDef) +uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, enum Ability abilityDef) { - u32 battlerAtk = damageCalcData->battlerAtk; - u32 battlerDef = damageCalcData->battlerDef; - u32 move = damageCalcData->move; - u32 moveType = damageCalcData->moveType; - u32 isCrit = damageCalcData->isCrit; - - uq4_12_t finalModifier = UQ_4_12(1.0); - u32 battlerDefPartner = BATTLE_PARTNER(battlerDef); - u32 unmodifiedAttackerSpeed = gBattleMons[battlerAtk].speed; - u32 unmodifiedDefenderSpeed = gBattleMons[battlerDef].speed; - //TODO: Behemoth Blade, Behemoth Bash, Dynamax Cannon (Dynamax) - DAMAGE_MULTIPLY_MODIFIER(GetMinimizeModifier(move, battlerDef)); - DAMAGE_MULTIPLY_MODIFIER(GetUndergroundModifier(move, battlerDef)); - DAMAGE_MULTIPLY_MODIFIER(GetDiveModifier(move, battlerDef)); - DAMAGE_MULTIPLY_MODIFIER(GetAirborneModifier(move, battlerDef)); - DAMAGE_MULTIPLY_MODIFIER(GetScreensModifier(move, battlerAtk, battlerDef, isCrit, abilityAtk)); - DAMAGE_MULTIPLY_MODIFIER(GetCollisionCourseElectroDriftModifier(move, typeEffectivenessModifier)); + uq4_12_t modifier = UQ_4_12(1.0); + enum Type moveType = GetBattleMoveType(move); - if (unmodifiedAttackerSpeed >= unmodifiedDefenderSpeed) + if (move != MOVE_STRUGGLE && moveType != TYPE_MYSTERY) { - DAMAGE_MULTIPLY_MODIFIER(GetAttackerAbilitiesModifier(battlerAtk, typeEffectivenessModifier, isCrit, abilityAtk)); - DAMAGE_MULTIPLY_MODIFIER(GetDefenderAbilitiesModifier(move, moveType, battlerAtk, battlerDef, typeEffectivenessModifier, abilityDef)); - DAMAGE_MULTIPLY_MODIFIER(GetDefenderPartnerAbilitiesModifier(battlerDefPartner)); - DAMAGE_MULTIPLY_MODIFIER(GetAttackerItemsModifier(battlerAtk, typeEffectivenessModifier, holdEffectAtk)); - DAMAGE_MULTIPLY_MODIFIER(GetDefenderItemsModifier(damageCalcData, typeEffectivenessModifier, abilityDef, holdEffectDef)); + struct DamageContext ctx = {0}; + ctx.move = ctx.chosenMove = move; + ctx.moveType = moveType; + ctx.updateFlags = FALSE; + ctx.abilityDef = abilityDef; + + MulByTypeEffectiveness(&ctx, &modifier, GetSpeciesType(speciesDef, 0)); + if (GetSpeciesType(speciesDef, 1) != GetSpeciesType(speciesDef, 0)) + MulByTypeEffectiveness(&ctx, &modifier, GetSpeciesType(speciesDef, 1)); + + if (ctx.moveType == TYPE_GROUND && abilityDef == ABILITY_LEVITATE && !(gFieldStatuses & STATUS_FIELD_GRAVITY)) + modifier = UQ_4_12(0.0); + if (abilityDef == ABILITY_WONDER_GUARD && modifier <= UQ_4_12(1.0) && GetMovePower(move) != 0) + modifier = UQ_4_12(0.0); } - else + + return modifier; +} + +static uq4_12_t GetInverseTypeMultiplier(uq4_12_t multiplier) +{ + switch (multiplier) { - DAMAGE_MULTIPLY_MODIFIER(GetDefenderAbilitiesModifier(move, moveType, battlerAtk, battlerDef, typeEffectivenessModifier, abilityDef)); - DAMAGE_MULTIPLY_MODIFIER(GetDefenderPartnerAbilitiesModifier(battlerDefPartner)); - DAMAGE_MULTIPLY_MODIFIER(GetAttackerAbilitiesModifier(battlerAtk, typeEffectivenessModifier, isCrit, abilityAtk)); - DAMAGE_MULTIPLY_MODIFIER(GetDefenderItemsModifier(damageCalcData, typeEffectivenessModifier, abilityDef, holdEffectDef)); - DAMAGE_MULTIPLY_MODIFIER(GetAttackerItemsModifier(battlerAtk, typeEffectivenessModifier, holdEffectAtk)); + case UQ_4_12(0.0): + case UQ_4_12(0.5): + return UQ_4_12(2.0); + case UQ_4_12(2.0): + return UQ_4_12(0.5); + case UQ_4_12(1.0): + default: + return UQ_4_12(1.0); } - return finalModifier; } -#undef DAMAGE_ACCUMULATE_MULTIPLIER - -#define DAMAGE_APPLY_MODIFIER(modifier) do { \ - dmg = uq4_12_multiply_by_int_half_down(modifier, dmg); \ -} while (0) - -static inline s32 DoMoveDamageCalcVars(struct DamageCalculationData *damageCalcData, u32 fixedBasePower, uq4_12_t typeEffectivenessModifier, u32 weather, - enum ItemHoldEffect holdEffectAtk, enum ItemHoldEffect holdEffectDef, u32 abilityAtk, u32 abilityDef) +uq4_12_t GetOverworldTypeEffectiveness(struct Pokemon *mon, enum Type moveType) { - s32 dmg; - u32 userFinalAttack; - u32 targetFinalDefense; - u32 battlerAtk = damageCalcData->battlerAtk; - u32 battlerDef = damageCalcData->battlerDef; - - if (fixedBasePower) - gBattleMovePower = fixedBasePower; - else - gBattleMovePower = CalcMoveBasePowerAfterModifiers(damageCalcData, abilityAtk, abilityDef, holdEffectAtk, weather); + uq4_12_t modifier = UQ_4_12(1.0); + enum Ability abilityDef = GetMonAbility(mon); + u16 speciesDef = GetMonData(mon, MON_DATA_SPECIES); + enum Type type1 = GetSpeciesType(speciesDef, 0); + enum Type type2 = GetSpeciesType(speciesDef, 1); - userFinalAttack = CalcAttackStat(damageCalcData, abilityAtk, abilityDef, holdEffectAtk, weather); - targetFinalDefense = CalcDefenseStat(damageCalcData, abilityAtk, abilityDef, holdEffectDef, weather); + if (moveType == TYPE_MYSTERY) + return modifier; - dmg = CalculateBaseDamage(gBattleMovePower, userFinalAttack, gBattleMons[battlerAtk].level, targetFinalDefense); - DAMAGE_APPLY_MODIFIER(GetTargetDamageModifier(damageCalcData)); - DAMAGE_APPLY_MODIFIER(GetParentalBondModifier(battlerAtk)); - DAMAGE_APPLY_MODIFIER(GetWeatherDamageModifier(damageCalcData, holdEffectAtk, holdEffectDef, weather)); - DAMAGE_APPLY_MODIFIER(GetCriticalModifier(damageCalcData->isCrit)); - DAMAGE_APPLY_MODIFIER(GetGlaiveRushModifier(battlerDef)); + struct DamageContext ctx = {0}; + ctx.move = ctx.chosenMove = MOVE_POUND; + ctx.moveType = moveType; + ctx.updateFlags = FALSE; - if (damageCalcData->randomFactor) - { - dmg *= DMG_ROLL_PERCENT_HI - RandomUniform(RNG_DAMAGE_MODIFIER, 0, DMG_ROLL_PERCENT_HI - DMG_ROLL_PERCENT_LO); - dmg /= 100; - } - else // Apply rest of modifiers in the ai function - { - if (dmg == 0) - dmg = 1; - return dmg; - } + MulByTypeEffectiveness(&ctx, &modifier, type1); + if (type2 != type1) + MulByTypeEffectiveness(&ctx, &modifier, type2); - dmg = ApplyModifiersAfterDmgRoll(dmg, damageCalcData, typeEffectivenessModifier, abilityAtk, abilityDef, holdEffectAtk, holdEffectDef); + if ((modifier <= UQ_4_12(1.0) && abilityDef == ABILITY_WONDER_GUARD) + || CanAbilityAbsorbMove(0, 0, abilityDef, MOVE_NONE, moveType, CHECK_TRIGGER)) + modifier = UQ_4_12(0.0); - if (dmg == 0) - dmg = 1; - return dmg; + return modifier; } -s32 ApplyModifiersAfterDmgRoll(s32 dmg, struct DamageCalculationData *damageCalcData, uq4_12_t typeEffectivenessModifier, u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk, enum ItemHoldEffect holdEffectDef) +uq4_12_t GetTypeModifier(enum Type atkType, enum Type defType) { - if (GetActiveGimmick(damageCalcData->battlerAtk) == GIMMICK_TERA) - DAMAGE_APPLY_MODIFIER(GetTeraMultiplier(damageCalcData->battlerAtk, damageCalcData->moveType)); - else - DAMAGE_APPLY_MODIFIER(GetSameTypeAttackBonusModifier(damageCalcData, abilityAtk)); - DAMAGE_APPLY_MODIFIER(typeEffectivenessModifier); - DAMAGE_APPLY_MODIFIER(GetBurnOrFrostBiteModifier(damageCalcData, abilityAtk)); - DAMAGE_APPLY_MODIFIER(GetZMaxMoveAgainstProtectionModifier(damageCalcData)); - DAMAGE_APPLY_MODIFIER(GetOtherModifiers(damageCalcData, typeEffectivenessModifier, abilityAtk, abilityDef, holdEffectAtk, holdEffectDef)); - - return dmg; + if (B_FLAG_INVERSE_BATTLE != 0 && FlagGet(B_FLAG_INVERSE_BATTLE)) + return GetInverseTypeMultiplier(gTypeEffectivenessTable[atkType][defType]); + return gTypeEffectivenessTable[atkType][defType]; } -static inline s32 DoFixedDamageMoveCalc(struct DamageCalculationData *damageCalcData) +s32 GetStealthHazardDamageByTypesAndHP(enum TypeSideHazard hazardType, enum Type type1, enum Type type2, u32 maxHp) { s32 dmg = 0; - s32 randDamage; + uq4_12_t modifier = UQ_4_12(1.0); + + modifier = uq4_12_multiply(modifier, GetTypeModifier((u8)hazardType, type1)); + if (type2 != type1) + modifier = uq4_12_multiply(modifier, GetTypeModifier((u8)hazardType, type2)); - switch (GetMoveEffect(damageCalcData->move)) + switch (modifier) { - case EFFECT_LEVEL_DAMAGE: - dmg = gBattleMons[damageCalcData->battlerAtk].level; + case UQ_4_12(0.0): + dmg = 0; break; - case EFFECT_PSYWAVE: - randDamage = B_PSYWAVE_DMG >= GEN_6 ? (Random() % 101) : ((Random() % 11) * 10); - dmg = gBattleMons[damageCalcData->battlerAtk].level * (randDamage + 50) / 100; + case UQ_4_12(0.25): + dmg = maxHp / 32; + if (dmg == 0) + dmg = 1; break; - case EFFECT_FIXED_DAMAGE_ARG: - dmg = GetMoveFixedDamage(damageCalcData->move); + case UQ_4_12(0.5): + dmg = maxHp / 16; + if (dmg == 0) + dmg = 1; break; - case EFFECT_SUPER_FANG: - dmg = GetNonDynamaxHP(damageCalcData->battlerDef) / 2; + case UQ_4_12(1.0): + dmg = maxHp / 8; + if (dmg == 0) + dmg = 1; + break; + case UQ_4_12(2.0): + dmg = maxHp / 4; + if (dmg == 0) + dmg = 1; + break; + case UQ_4_12(4.0): + dmg = maxHp / 2; + if (dmg == 0) + dmg = 1; break; - default: - return INT32_MAX; } - gBattleStruct->moveResultFlags[damageCalcData->battlerDef] &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE); - - if (dmg == 0) - dmg = 1; - return dmg; } -static inline s32 DoMoveDamageCalc(struct DamageCalculationData *damageCalcData, u32 fixedBasePower, uq4_12_t typeEffectivenessModifier, u32 weather) +s32 GetStealthHazardDamage(enum TypeSideHazard hazardType, u32 battler) { - enum ItemHoldEffect holdEffectAtk, holdEffectDef; - u32 abilityAtk, abilityDef; + enum Type types[3]; + GetBattlerTypes(battler, FALSE, types); + u32 maxHp = gBattleMons[battler].maxHP; - if (typeEffectivenessModifier == UQ_4_12(0.0)) - return 0; + return GetStealthHazardDamageByTypesAndHP(hazardType, types[0], types[1], maxHp); +} - s32 dmg = DoFixedDamageMoveCalc(damageCalcData); - if (dmg != INT32_MAX) - return dmg; +bool32 IsPartnerMonFromSameTrainer(u32 battler) +{ + if (!IsOnPlayerSide(battler)) + return !(gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS); + else + return !(gBattleTypeFlags & BATTLE_TYPE_MULTI); +} - holdEffectAtk = GetBattlerHoldEffect(damageCalcData->battlerAtk, TRUE); - holdEffectDef = GetBattlerHoldEffect(damageCalcData->battlerDef, TRUE); - abilityAtk = GetBattlerAbility(damageCalcData->battlerAtk); - abilityDef = GetBattlerAbility(damageCalcData->battlerDef); +bool32 DoesSpeciesUseHoldItemToChangeForm(u16 species, u16 heldItemId) +{ + u32 i; + const struct FormChange *formChanges = GetSpeciesFormChanges(species); - return DoMoveDamageCalcVars(damageCalcData, fixedBasePower, typeEffectivenessModifier, weather, holdEffectAtk, holdEffectDef, abilityAtk, abilityDef); + for (i = 0; formChanges != NULL && formChanges[i].method != FORM_CHANGE_TERMINATOR; i++) + { + enum FormChanges method = formChanges[i].method; + switch (method) + { + case FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM: + case FORM_CHANGE_BATTLE_PRIMAL_REVERSION: + case FORM_CHANGE_BATTLE_ULTRA_BURST: + case FORM_CHANGE_ITEM_HOLD: + case FORM_CHANGE_BEGIN_BATTLE: + if (formChanges[i].param1 == heldItemId) + return TRUE; + break; + default: + break; + } + } + return FALSE; } -static inline s32 DoFutureSightAttackDamageCalcVars(struct DamageCalculationData *damageCalcData, uq4_12_t typeEffectivenessModifier, - u32 weather, enum ItemHoldEffect holdEffectDef, u32 abilityDef) +bool32 CanMegaEvolve(u32 battler) { - s32 dmg; - u32 userFinalAttack; - u32 targetFinalDefense; - u32 battlerAtk = damageCalcData->battlerAtk; - u32 battlerDef = damageCalcData->battlerDef; - u32 move = damageCalcData->move; - u32 moveType = damageCalcData->moveType; + enum HoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); - struct Pokemon *party = GetBattlerParty(battlerAtk); - struct Pokemon *partyMon = &party[gWishFutureKnock.futureSightPartyIndex[battlerDef]]; - u32 partyMonLevel = GetMonData(partyMon, MON_DATA_LEVEL, NULL); - u32 partyMonSpecies = GetMonData(partyMon, MON_DATA_SPECIES, NULL); - gBattleMovePower = GetMovePower(move); + // Check if Player has a Mega Ring. + if (!TESTING + && (GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT || (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) && GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT)) + && !CheckBagHasItem(ITEM_MEGA_RING, 1)) + return FALSE; - if (IsBattleMovePhysical(move)) - userFinalAttack = GetMonData(partyMon, MON_DATA_ATK, NULL); - else - userFinalAttack = GetMonData(partyMon, MON_DATA_SPATK, NULL); + // Check if Trainer has already Mega Evolved. + if (HasTrainerUsedGimmick(battler, GIMMICK_MEGA)) + return FALSE; - targetFinalDefense = CalcDefenseStat(damageCalcData, ABILITY_NONE, abilityDef, holdEffectDef, weather); - dmg = CalculateBaseDamage(gBattleMovePower, userFinalAttack, partyMonLevel, targetFinalDefense); + // Check if battler has another gimmick active. + if (GetActiveGimmick(battler) != GIMMICK_NONE) + return FALSE; - DAMAGE_APPLY_MODIFIER(GetCriticalModifier(damageCalcData->isCrit)); + // Check if battler is currently held by Sky Drop. + if (gBattleMons[battler].volatiles.semiInvulnerable == STATE_SKY_DROP) + return FALSE; - if (damageCalcData->randomFactor) - { - dmg *= DMG_ROLL_PERCENT_HI - RandomUniform(RNG_DAMAGE_MODIFIER, 0, DMG_ROLL_PERCENT_HI - DMG_ROLL_PERCENT_LO); - dmg /= 100; - } + // Check if battler is holding a Z-Crystal. + if (holdEffect == HOLD_EFFECT_Z_CRYSTAL) + return FALSE; - // Same type attack bonus - if (gSpeciesInfo[partyMonSpecies].types[0] == moveType || gSpeciesInfo[partyMonSpecies].types[1] == moveType) - DAMAGE_APPLY_MODIFIER(UQ_4_12(1.5)); - else - DAMAGE_APPLY_MODIFIER(UQ_4_12(1.0)); - DAMAGE_APPLY_MODIFIER(typeEffectivenessModifier); + // Check if there is an entry in the form change table for regular Mega Evolution and battler is holding Mega Stone. + if (GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM) != gBattleMons[battler].species && holdEffect == HOLD_EFFECT_MEGA_STONE) + return TRUE; - if (dmg == 0) - dmg = 1; + // Check if there is an entry in the form change table for Wish Mega Evolution. + if (GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_MEGA_EVOLUTION_MOVE) != gBattleMons[battler].species) + return TRUE; - return dmg; + // No checks passed, the mon CAN'T mega evolve. + return FALSE; } -static inline s32 DoFutureSightAttackDamageCalc(struct DamageCalculationData *damageCalcData, uq4_12_t typeEffectivenessModifier, u32 weather) +bool32 CanUltraBurst(u32 battler) { - enum ItemHoldEffect holdEffectDef; - u32 abilityDef; + enum HoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); - if (typeEffectivenessModifier == UQ_4_12(0.0)) - return 0; + // Check if Player has a Z-Ring + if (!TESTING && (GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT + || (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) && GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT)) + && !CheckBagHasItem(ITEM_Z_POWER_RING, 1)) + return FALSE; - holdEffectDef = GetBattlerHoldEffect(damageCalcData->battlerDef, TRUE); - abilityDef = GetBattlerAbility(damageCalcData->battlerDef); + // Check if Trainer has already Ultra Bursted. + if (HasTrainerUsedGimmick(battler, GIMMICK_ULTRA_BURST)) + return FALSE; - return DoFutureSightAttackDamageCalcVars(damageCalcData, typeEffectivenessModifier, weather, holdEffectDef, abilityDef); -} + // Check if battler has another gimmick active. + if (GetActiveGimmick(battler) != GIMMICK_NONE) + return FALSE; -#undef DAMAGE_APPLY_MODIFIER + // Check if mon is currently held by Sky Drop + if (gBattleMons[battler].volatiles.semiInvulnerable == STATE_SKY_DROP) + return FALSE; -static u32 GetWeather(void) + // Check if there is an entry in the form change table for Ultra Burst and battler is holding a Z-Crystal. + if (GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_ULTRA_BURST) != gBattleMons[battler].species && holdEffect == HOLD_EFFECT_Z_CRYSTAL) + return TRUE; + + // No checks passed, the mon CAN'T ultra burst. + return FALSE; +} + +void ActivateMegaEvolution(u32 battler) { - if (gBattleWeather == B_WEATHER_NONE || !HasWeatherEffect()) - return B_WEATHER_NONE; + gLastUsedItem = gBattleMons[battler].item; + SetActiveGimmick(battler, GIMMICK_MEGA); + if (GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_MEGA_EVOLUTION_MOVE) != gBattleMons[battler].species) + BattleScriptExecute(BattleScript_WishMegaEvolution); else - return gBattleWeather; + BattleScriptExecute(BattleScript_MegaEvolution); } -bool32 IsFutureSightAttackerInParty(u32 battlerAtk, u32 battlerDef, u32 move) +void ActivateUltraBurst(u32 battler) { - if (GetMoveEffect(move) != EFFECT_FUTURE_SIGHT) - return FALSE; - - struct Pokemon *party = GetBattlerParty(battlerAtk); - if (IsDoubleBattle()) - { - return &party[gWishFutureKnock.futureSightPartyIndex[battlerDef]] != &party[gBattlerPartyIndexes[battlerAtk]] - && &party[gWishFutureKnock.futureSightPartyIndex[battlerDef]] != &party[gBattlerPartyIndexes[BATTLE_PARTNER(battlerAtk)]]; - } - - return &party[gWishFutureKnock.futureSightPartyIndex[battlerDef]] != &party[gBattlerPartyIndexes[battlerAtk]]; + gLastUsedItem = gBattleMons[battler].item; + SetActiveGimmick(battler, GIMMICK_ULTRA_BURST); + BattleScriptExecute(BattleScript_UltraBurst); } -s32 CalculateMoveDamage(struct DamageCalculationData *damageCalcData, u32 fixedBasePower) +bool32 IsBattlerMegaEvolved(u32 battler) { - u32 typeEffectivenessMultiplier = CalcTypeEffectivenessMultiplier(damageCalcData->move, - damageCalcData->moveType, - damageCalcData->battlerAtk, - damageCalcData->battlerDef, - GetBattlerAbility(damageCalcData->battlerDef), - damageCalcData->updateFlags); - - if (IsFutureSightAttackerInParty(damageCalcData->battlerAtk, damageCalcData->battlerDef, damageCalcData->move)) - return DoFutureSightAttackDamageCalc(damageCalcData, typeEffectivenessMultiplier, GetWeather()); - - return DoMoveDamageCalc(damageCalcData, fixedBasePower, typeEffectivenessMultiplier, GetWeather()); + // While Transform does copy stats and visuals, it shouldn't be counted as true Mega Evolution. + if (gBattleMons[battler].volatiles.transformed) + return FALSE; + return (gSpeciesInfo[gBattleMons[battler].species].isMegaEvolution); } -// for AI so that typeEffectivenessModifier, weather, abilities and holdEffects are calculated only once -s32 CalculateMoveDamageVars(struct DamageCalculationData *damageCalcData, u32 fixedBasePower, uq4_12_t typeEffectivenessModifier, - u32 weather, enum ItemHoldEffect holdEffectAtk, enum ItemHoldEffect holdEffectDef, u32 abilityAtk, u32 abilityDef) +bool32 IsBattlerPrimalReverted(u32 battler) { - s32 dmg = DoFixedDamageMoveCalc(damageCalcData); - if (dmg != INT32_MAX) - return dmg; - - return DoMoveDamageCalcVars(damageCalcData, fixedBasePower, typeEffectivenessModifier, weather, - holdEffectAtk, holdEffectDef, abilityAtk, abilityDef); + // While Transform does copy stats and visuals, it shouldn't be counted as true Primal Revesion. + if (gBattleMons[battler].volatiles.transformed) + return FALSE; + return (gSpeciesInfo[gBattleMons[battler].species].isPrimalReversion); } -static inline void MulByTypeEffectiveness(uq4_12_t *modifier, u32 move, u32 moveType, u32 battlerDef, u32 defAbility, u32 defType, u32 battlerAtk, bool32 recordAbilities) +bool32 IsBattlerUltraBursted(u32 battler) { - uq4_12_t mod = GetTypeModifier(moveType, defType); - u32 abilityAtk = GetBattlerAbility(battlerAtk); - - if (mod == UQ_4_12(0.0) && GetBattlerHoldEffect(battlerDef, TRUE) == HOLD_EFFECT_RING_TARGET) - { - mod = UQ_4_12(1.0); - if (recordAbilities) - RecordItemEffectBattle(battlerDef, HOLD_EFFECT_RING_TARGET); - } - else if ((moveType == TYPE_FIGHTING || moveType == TYPE_NORMAL) && defType == TYPE_GHOST && gBattleMons[battlerDef].status2 & STATUS2_FORESIGHT && mod == UQ_4_12(0.0)) - { - mod = UQ_4_12(1.0); - } - else if ((moveType == TYPE_FIGHTING || moveType == TYPE_NORMAL) && defType == TYPE_GHOST - && (abilityAtk == ABILITY_SCRAPPY || abilityAtk == ABILITY_MINDS_EYE) - && mod == UQ_4_12(0.0)) - { - mod = UQ_4_12(1.0); - if (recordAbilities) - RecordAbilityBattle(battlerAtk, abilityAtk); - } + // While Transform does copy stats and visuals, it shouldn't be counted as true Ultra Burst. + if (gBattleMons[battler].volatiles.transformed) + return FALSE; + return (gSpeciesInfo[gBattleMons[battler].species].isUltraBurst); +} - if (moveType == TYPE_PSYCHIC && defType == TYPE_DARK && gStatuses3[battlerDef] & STATUS3_MIRACLE_EYED && mod == UQ_4_12(0.0)) - mod = UQ_4_12(1.0); - if (GetMoveEffect(move) == EFFECT_SUPER_EFFECTIVE_ON_ARG && defType == GetMoveArgType(move)) - mod = UQ_4_12(2.0); - if (moveType == TYPE_GROUND && defType == TYPE_FLYING && IsBattlerGrounded(battlerDef) && mod == UQ_4_12(0.0)) - mod = UQ_4_12(1.0); - if (moveType == TYPE_STELLAR && GetActiveGimmick(battlerDef) == GIMMICK_TERA) - mod = UQ_4_12(2.0); +bool32 IsBattlerInTeraForm(u32 battler) +{ + // While Transform does copy stats and visuals, it shouldn't be counted as a true Tera Form. + if (gBattleMons[battler].volatiles.transformed) + return FALSE; + return (gSpeciesInfo[gBattleMons[battler].species].isTeraForm); +} - // B_WEATHER_STRONG_WINDS weakens Super Effective moves against Flying-type PokΓ©mon - if (gBattleWeather & B_WEATHER_STRONG_WINDS && HasWeatherEffect()) - { - if (defType == TYPE_FLYING && mod >= UQ_4_12(2.0)) - mod = UQ_4_12(1.0); - } +// Returns SPECIES_NONE if no form change is possible +u16 GetBattleFormChangeTargetSpecies(u32 battler, enum FormChanges method) +{ + u32 i; + u32 species = gBattleMons[battler].species; + u32 targetSpecies = species; + const struct FormChange *formChanges = GetSpeciesFormChanges(species); + struct Pokemon *mon = GetBattlerMon(battler); + u16 heldItem = gBattleMons[battler].item; - if (gSpecialStatuses[battlerDef].distortedTypeMatchups || (mod > UQ_4_12(0.0) && ShouldTeraShellDistortTypeMatchups(move, battlerDef, defAbility))) + for (i = 0; formChanges != NULL && formChanges[i].method != FORM_CHANGE_TERMINATOR; i++) { - mod = UQ_4_12(0.5); - if (recordAbilities) + if (method == formChanges[i].method && species != formChanges[i].targetSpecies) { - RecordAbilityBattle(battlerDef, defAbility); - gSpecialStatuses[battlerDef].distortedTypeMatchups = TRUE; - gSpecialStatuses[battlerDef].teraShellAbilityDone = TRUE; + switch (method) + { + case FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM: + case FORM_CHANGE_BATTLE_PRIMAL_REVERSION: + case FORM_CHANGE_BATTLE_ULTRA_BURST: + if (heldItem == formChanges[i].param1) + targetSpecies = formChanges[i].targetSpecies; + break; + case FORM_CHANGE_BATTLE_MEGA_EVOLUTION_MOVE: + if (gBattleMons[battler].moves[0] == formChanges[i].param1 + || gBattleMons[battler].moves[1] == formChanges[i].param1 + || gBattleMons[battler].moves[2] == formChanges[i].param1 + || gBattleMons[battler].moves[3] == formChanges[i].param1) + targetSpecies = formChanges[i].targetSpecies; + break; + case FORM_CHANGE_BATTLE_SWITCH: + if (formChanges[i].param1 == GetBattlerAbility(battler) || formChanges[i].param1 == ABILITY_NONE) + targetSpecies = formChanges[i].targetSpecies; + break; + case FORM_CHANGE_BATTLE_HP_PERCENT: + if (formChanges[i].param1 == GetBattlerAbility(battler)) + { + // We multiply by 100 to make sure that integer division doesn't mess with the health check. + u32 hpCheck = gBattleMons[battler].hp * 100 * 100 / gBattleMons[battler].maxHP; + switch(formChanges[i].param2) + { + case HP_HIGHER_THAN: + if (hpCheck > formChanges[i].param3 * 100) + targetSpecies = formChanges[i].targetSpecies; + break; + case HP_LOWER_EQ_THAN: + if (hpCheck <= formChanges[i].param3 * 100) + targetSpecies = formChanges[i].targetSpecies; + break; + } + } + break; + case FORM_CHANGE_BATTLE_GIGANTAMAX: + if (GetMonData(mon, MON_DATA_GIGANTAMAX_FACTOR)) + targetSpecies = formChanges[i].targetSpecies; + break; + case FORM_CHANGE_BATTLE_WEATHER: + // Check if there is a required ability and if the battler's ability does not match it + // or is suppressed. If so, revert to the no weather form. + if (formChanges[i].param2 + && GetBattlerAbility(battler) != formChanges[i].param2 + && formChanges[i].param1 == B_WEATHER_NONE) + { + targetSpecies = formChanges[i].targetSpecies; + } + // We need to revert the weather form if the field is under Air Lock, too. + else if (!HasWeatherEffect() && formChanges[i].param1 == B_WEATHER_NONE) + { + targetSpecies = formChanges[i].targetSpecies; + } + // Otherwise, just check for a match between the weather and the form change table. + // Added a check for whether the weather is in effect to prevent end-of-turn soft locks with Cloud Nine / Air Lock + else if (((gBattleWeather & formChanges[i].param1) && HasWeatherEffect()) + || (gBattleWeather == B_WEATHER_NONE && formChanges[i].param1 == B_WEATHER_NONE)) + { + targetSpecies = formChanges[i].targetSpecies; + } + break; + case FORM_CHANGE_BATTLE_TURN_END: + case FORM_CHANGE_HIT_BY_MOVE: + if (formChanges[i].param1 == GetBattlerAbility(battler)) + targetSpecies = formChanges[i].targetSpecies; + break; + case FORM_CHANGE_STATUS: + if (gBattleMons[battler].status1 & formChanges[i].param1) + targetSpecies = formChanges[i].targetSpecies; + break; + case FORM_CHANGE_BATTLE_TERASTALLIZATION: + if (GetBattlerTeraType(battler) == formChanges[i].param1) + targetSpecies = formChanges[i].targetSpecies; + break; + case FORM_CHANGE_BATTLE_BEFORE_MOVE: + case FORM_CHANGE_BATTLE_AFTER_MOVE: + if (formChanges[i].param1 == gCurrentMove + && (formChanges[i].param2 == ABILITY_NONE || formChanges[i].param2 == GetBattlerAbility(battler))) + targetSpecies = formChanges[i].targetSpecies; + break; + case FORM_CHANGE_BATTLE_BEFORE_MOVE_CATEGORY: + if (formChanges[i].param1 == GetBattleMoveCategory(gCurrentMove) + && (formChanges[i].param2 == ABILITY_NONE || formChanges[i].param2 == GetBattlerAbility(battler))) + targetSpecies = formChanges[i].targetSpecies; + break; + default: + break; + } } } - *modifier = uq4_12_multiply(*modifier, mod); + return targetSpecies; } -static inline void TryNoticeIllusionInTypeEffectiveness(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, uq4_12_t resultingModifier, u32 illusionSpecies) +static bool32 CanBattlerFormChange(u32 battler, enum FormChanges method) { - // Check if the type effectiveness would've been different if the pokemon really had the types as the disguise. - uq4_12_t presumedModifier = UQ_4_12(1.0); - MulByTypeEffectiveness(&presumedModifier, move, moveType, battlerDef, ABILITY_ILLUSION, gSpeciesInfo[illusionSpecies].types[0], battlerAtk, FALSE); - if (gSpeciesInfo[illusionSpecies].types[1] != gSpeciesInfo[illusionSpecies].types[0]) - MulByTypeEffectiveness(&presumedModifier, move, moveType, battlerDef, ABILITY_ILLUSION, gSpeciesInfo[illusionSpecies].types[1], battlerAtk, FALSE); - - if (presumedModifier != resultingModifier) - RecordAbilityBattle(battlerDef, ABILITY_ILLUSION); -} + // Can't change form if transformed. + if (gBattleMons[battler].volatiles.transformed + && B_TRANSFORM_FORM_CHANGES >= GEN_5) + return FALSE; -void UpdateMoveResultFlags(uq4_12_t modifier, u16 *resultFlags) -{ - if (modifier == UQ_4_12(0.0)) - { - *resultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - *resultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE); - gBattleStruct->blunderPolicy = FALSE; // Don't activate if missed - } - else if (modifier == UQ_4_12(1.0)) - { - *resultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE); - } - else if (modifier > UQ_4_12(1.0)) - { - *resultFlags |= MOVE_RESULT_SUPER_EFFECTIVE; - *resultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE); - } - else //if (modifier < UQ_4_12(1.0)) + switch (method) { - *resultFlags |= MOVE_RESULT_NOT_VERY_EFFECTIVE; - *resultFlags &= ~(MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE); + case FORM_CHANGE_END_BATTLE: + if (IsBattlerPrimalReverted(battler)) + return TRUE; + // Fallthrough + case FORM_CHANGE_FAINT: + if (IsBattlerMegaEvolved(battler) || IsBattlerUltraBursted(battler) || IsBattlerInTeraForm(battler) || IsGigantamaxed(battler)) + return TRUE; + break; + case FORM_CHANGE_BATTLE_SWITCH: + if (IsGigantamaxed(battler)) + return TRUE; + else if (GetActiveGimmick(battler) == GIMMICK_TERA && GetBattlerAbility(battler) == ABILITY_HUNGER_SWITCH) + return FALSE; + break; + default: + break; } + return DoesSpeciesHaveFormChangeMethod(gBattleMons[battler].species, method); } -static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, bool32 recordAbilities, uq4_12_t modifier, u32 defAbility) +bool32 TryRevertPartyMonFormChange(u32 partyIndex) { - u32 illusionSpecies; - u32 types[3]; - GetBattlerTypes(battlerDef, FALSE, types); + bool32 changedForm = FALSE; - MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, defAbility, types[0], battlerAtk, recordAbilities); - if (types[1] != types[0]) - MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, defAbility, types[1], battlerAtk, recordAbilities); - if (types[2] != TYPE_MYSTERY && types[2] != types[1] && types[2] != types[0]) - MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, defAbility, types[2], battlerAtk, recordAbilities); - if (moveType == TYPE_FIRE && gDisableStructs[battlerDef].tarShot) - modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); + // Appeared in battle and didn't faint + if (gBattleStruct->partyState[B_SIDE_PLAYER][partyIndex].sentOut && GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP, NULL) != 0) + changedForm = TryFormChange(partyIndex, B_SIDE_PLAYER, FORM_CHANGE_END_BATTLE_ENVIRONMENT); + + if (!changedForm) + changedForm = TryFormChange(partyIndex, B_SIDE_PLAYER, FORM_CHANGE_END_BATTLE); + + // Clear original species field + gBattleStruct->partyState[B_SIDE_PLAYER][partyIndex].changedSpecies = SPECIES_NONE; + + return changedForm; +} + +bool32 TryBattleFormChange(u32 battler, enum FormChanges method) +{ + u32 monId = gBattlerPartyIndexes[battler]; + struct Pokemon *party = GetBattlerParty(battler); + u32 currentSpecies = GetMonData(&party[monId], MON_DATA_SPECIES); + u32 targetSpecies; - if (recordAbilities && (illusionSpecies = GetIllusionMonSpecies(battlerDef))) - TryNoticeIllusionInTypeEffectiveness(move, moveType, battlerAtk, battlerDef, modifier, illusionSpecies); + if (!CanBattlerFormChange(battler, method)) + return FALSE; - if (GetMoveCategory(move) == DAMAGE_CATEGORY_STATUS && move != MOVE_THUNDER_WAVE) + targetSpecies = GetBattleFormChangeTargetSpecies(battler, method); + if (targetSpecies == currentSpecies) + targetSpecies = GetFormChangeTargetSpecies(&party[monId], method, 0); + if (targetSpecies != currentSpecies && targetSpecies != SPECIES_NONE) { - modifier = UQ_4_12(1.0); - if (B_GLARE_GHOST < GEN_4 && move == MOVE_GLARE && IS_BATTLER_OF_TYPE(battlerDef, TYPE_GHOST)) - modifier = UQ_4_12(0.0); + // Saves the original species on the first form change. + + if (GetBattlerPartyState(battler)->changedSpecies == SPECIES_NONE) + GetBattlerPartyState(battler)->changedSpecies = gBattleMons[battler].species; + + TryToSetBattleFormChangeMoves(&party[monId], method); + SetMonData(&party[monId], MON_DATA_SPECIES, &targetSpecies); + gBattleMons[battler].species = targetSpecies; + RecalcBattlerStats(battler, &party[monId], method == FORM_CHANGE_BATTLE_GIGANTAMAX); + return TRUE; } - else if (moveType == TYPE_GROUND && !IsBattlerGroundedInverseCheck(battlerDef, INVERSE_BATTLE, CHECK_IRON_BALL) && !(MoveIgnoresTypeIfFlyingAndUngrounded(move))) + else if (GetBattlerPartyState(battler)->changedSpecies != SPECIES_NONE) { - modifier = UQ_4_12(0.0); - if (recordAbilities && defAbility == ABILITY_LEVITATE) + bool32 restoreSpecies = FALSE; + + switch (method) { - gBattleStruct->moveResultFlags[battlerDef] |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); - gLastUsedAbility = ABILITY_LEVITATE; - gLastLandedMoves[battlerDef] = 0; - gBattleStruct->missStringId[battlerDef] = B_MSG_GROUND_MISS; - RecordAbilityBattle(battlerDef, ABILITY_LEVITATE); + case FORM_CHANGE_END_BATTLE: + restoreSpecies = TRUE; + break; + case FORM_CHANGE_FAINT: + if (IsBattlerMegaEvolved(battler) || IsBattlerUltraBursted(battler) || IsBattlerInTeraForm(battler) || IsGigantamaxed(battler)) + restoreSpecies = TRUE; + break; + case FORM_CHANGE_BATTLE_SWITCH: + if (IsGigantamaxed(battler)) + restoreSpecies = TRUE; + break; + default: + break; } - } - else if (B_SHEER_COLD_IMMUNITY >= GEN_7 && move == MOVE_SHEER_COLD && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE)) - { - modifier = UQ_4_12(0.0); - } - - // Thousand Arrows ignores type modifiers for flying mons - if (!IsBattlerGrounded(battlerDef) - && MoveIgnoresTypeIfFlyingAndUngrounded(move) - && IS_BATTLER_OF_TYPE(battlerDef, TYPE_FLYING)) - { - modifier = UQ_4_12(1.0); - } - - // Iron Ball ignores type modifiers for flying-type mons if it is the only source of grounding - if (B_IRON_BALL >= GEN_5 - && moveType == TYPE_GROUND - && IS_BATTLER_OF_TYPE(battlerDef, TYPE_FLYING) - && GetBattlerHoldEffect(battlerDef, TRUE) == HOLD_EFFECT_IRON_BALL - && !IsBattlerGroundedInverseCheck(battlerDef, NOT_INVERSE_BATTLE, IGNORE_IRON_BALL) - && !FlagGet(B_FLAG_INVERSE_BATTLE)) - { - modifier = UQ_4_12(1.0); - } - if (((defAbility == ABILITY_WONDER_GUARD && modifier <= UQ_4_12(1.0)) - || (defAbility == ABILITY_TELEPATHY && battlerDef == BATTLE_PARTNER(battlerAtk))) - && GetMovePower(move) != 0) - { - modifier = UQ_4_12(0.0); - if (recordAbilities) + if (restoreSpecies) { - gLastUsedAbility = gBattleMons[battlerDef].ability; - gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_MISSED; - gLastLandedMoves[battlerDef] = 0; - gBattleStruct->missStringId[battlerDef] = B_MSG_AVOIDED_DMG; - RecordAbilityBattle(battlerDef, gBattleMons[battlerDef].ability); + enum Ability abilityForm = gBattleMons[battler].ability; + // Reverts the original species + TryToSetBattleFormChangeMoves(&party[monId], method); + u32 changedSpecies = GetBattlerPartyState(battler)->changedSpecies; + SetMonData(&party[monId], MON_DATA_SPECIES, &changedSpecies); + RecalcBattlerStats(battler, &party[monId], method == FORM_CHANGE_BATTLE_GIGANTAMAX); + // Battler data is not updated with regular form's ability, not doing so could cause wrong ability activation. + if (method == FORM_CHANGE_FAINT) + gBattleMons[battler].ability = abilityForm; + return TRUE; } } - if (recordAbilities) - TryInitializeFirstSTABMoveTrainerSlide(battlerDef, battlerAtk, moveType); - - return modifier; + return FALSE; } -uq4_12_t CalcTypeEffectivenessMultiplier(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, u32 defAbility, bool32 recordAbilities) +bool32 DoBattlersShareType(u32 battler1, u32 battler2) { - uq4_12_t modifier = UQ_4_12(1.0); + s32 i; + enum Type types1[3], types2[3]; + GetBattlerTypes(battler1, FALSE, types1); + GetBattlerTypes(battler2, FALSE, types2); - if (move != MOVE_STRUGGLE && moveType != TYPE_MYSTERY) + if (types1[2] == TYPE_MYSTERY) + types1[2] = types1[0]; + if (types2[2] == TYPE_MYSTERY) + types2[2] = types2[0]; + + for (i = 0; i < 3; i++) { - modifier = CalcTypeEffectivenessMultiplierInternal(move, moveType, battlerAtk, battlerDef, recordAbilities, modifier, defAbility); - if (GetMoveEffect(move) == EFFECT_TWO_TYPED_MOVE) - modifier = CalcTypeEffectivenessMultiplierInternal(move, GetMoveArgType(move), battlerAtk, battlerDef, recordAbilities, modifier, defAbility); + if (types1[i] == types2[0] || types1[i] == types2[1] || types1[i] == types2[2]) + return TRUE; } - if (recordAbilities) - UpdateMoveResultFlags(modifier, &gBattleStruct->moveResultFlags[battlerDef]); - return modifier; + return FALSE; } -uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef) +bool32 CanBattlerGetOrLoseItem(u32 battler, u16 itemId) { - uq4_12_t modifier = UQ_4_12(1.0); - u32 moveType = GetBattleMoveType(move); - - if (move != MOVE_STRUGGLE && moveType != TYPE_MYSTERY) - { - MulByTypeEffectiveness(&modifier, move, moveType, 0, 0, gSpeciesInfo[speciesDef].types[0], 0, FALSE); - if (gSpeciesInfo[speciesDef].types[1] != gSpeciesInfo[speciesDef].types[0]) - MulByTypeEffectiveness(&modifier, move, moveType, 0, 0, gSpeciesInfo[speciesDef].types[1], 0, FALSE); - - if (moveType == TYPE_GROUND && abilityDef == ABILITY_LEVITATE && !(gFieldStatuses & STATUS_FIELD_GRAVITY)) - modifier = UQ_4_12(0.0); - if (abilityDef == ABILITY_WONDER_GUARD && modifier <= UQ_4_12(1.0) && GetMovePower(move) != 0) - modifier = UQ_4_12(0.0); - } + u16 species = gBattleMons[battler].species; + enum HoldEffect holdEffect = GetItemHoldEffect(itemId); - return modifier; + if (ItemIsMail(itemId)) + return FALSE; + else if (itemId == ITEM_ENIGMA_BERRY_E_READER) + return FALSE; + else if (DoesSpeciesUseHoldItemToChangeForm(species, itemId)) + return FALSE; + else if (holdEffect == HOLD_EFFECT_Z_CRYSTAL) + return FALSE; + else if (holdEffect == HOLD_EFFECT_BOOSTER_ENERGY + && (gSpeciesInfo[gBattleMons[battler].species].isParadox || gSpeciesInfo[gBattleMons[gBattlerTarget].species].isParadox)) + return FALSE; + else + return TRUE; } -static uq4_12_t GetInverseTypeMultiplier(uq4_12_t multiplier) +u32 GetBattlerVisualSpecies(u32 battler) { - switch (multiplier) - { - case UQ_4_12(0.0): - case UQ_4_12(0.5): - return UQ_4_12(2.0); - case UQ_4_12(2.0): - return UQ_4_12(0.5); - case UQ_4_12(1.0): - default: - return UQ_4_12(1.0); - } + u32 illusionSpecies = GetIllusionMonSpecies(battler); + if (illusionSpecies != SPECIES_NONE) + return illusionSpecies; + return gBattleMons[battler].species; } -uq4_12_t GetOverworldTypeEffectiveness(struct Pokemon *mon, u8 moveType) +bool32 TryClearIllusion(u32 battler, enum AbilityEffect caseID) { - uq4_12_t modifier = UQ_4_12(1.0); - u16 abilityDef = GetMonAbility(mon); - u16 speciesDef = GetMonData(mon, MON_DATA_SPECIES); - u8 type1 = gSpeciesInfo[speciesDef].types[0]; - u8 type2 = gSpeciesInfo[speciesDef].types[1]; - - if (moveType != TYPE_MYSTERY) - { - MulByTypeEffectiveness(&modifier, MOVE_POUND, moveType, 0, 0, type1, 0, FALSE); - if (type2 != type1) - MulByTypeEffectiveness(&modifier, MOVE_POUND, moveType, 0, 0, type2, 0, FALSE); - - if ((modifier <= UQ_4_12(1.0) && abilityDef == ABILITY_WONDER_GUARD) - || (moveType == TYPE_FIRE && abilityDef == ABILITY_FLASH_FIRE) - || (moveType == TYPE_GRASS && abilityDef == ABILITY_SAP_SIPPER) - || (moveType == TYPE_GROUND && (abilityDef == ABILITY_LEVITATE - || abilityDef == ABILITY_EARTH_EATER)) - || (moveType == TYPE_WATER && (abilityDef == ABILITY_WATER_ABSORB - || abilityDef == ABILITY_DRY_SKIN - || abilityDef == ABILITY_STORM_DRAIN)) - || (moveType == TYPE_ELECTRIC && (abilityDef == ABILITY_LIGHTNING_ROD // TODO: Add Gen 3/4 config check - || abilityDef == ABILITY_VOLT_ABSORB - || abilityDef == ABILITY_MOTOR_DRIVE))) - { - modifier = UQ_4_12(0.0); - } - } - return modifier; -} + if (gBattleStruct->illusion[battler].state != ILLUSION_ON) + return FALSE; + if (GetBattlerAbility(battler) == ABILITY_ILLUSION && IsBattlerAlive(battler)) + return FALSE; -uq4_12_t GetTypeModifier(u32 atkType, u32 defType) -{ - if (B_FLAG_INVERSE_BATTLE != 0 && FlagGet(B_FLAG_INVERSE_BATTLE)) - return GetInverseTypeMultiplier(gTypeEffectivenessTable[atkType][defType]); - return gTypeEffectivenessTable[atkType][defType]; + gBattleScripting.battler = battler; + if (caseID == ABILITYEFFECT_ON_SWITCHIN) + BattleScriptPushCursorAndCallback(BattleScript_IllusionOffEnd3); + else + BattleScriptCall(BattleScript_IllusionOff); + return TRUE; } -s32 GetStealthHazardDamageByTypesAndHP(enum TypeSideHazard hazardType, u8 type1, u8 type2, u32 maxHp) +struct Pokemon *GetIllusionMonPtr(u32 battler) { - s32 dmg = 0; - uq4_12_t modifier = UQ_4_12(1.0); - - modifier = uq4_12_multiply(modifier, GetTypeModifier((u8)hazardType, type1)); - if (type2 != type1) - modifier = uq4_12_multiply(modifier, GetTypeModifier((u8)hazardType, type2)); - - switch (modifier) - { - case UQ_4_12(0.0): - dmg = 0; - break; - case UQ_4_12(0.25): - dmg = maxHp / 32; - if (dmg == 0) - dmg = 1; - break; - case UQ_4_12(0.5): - dmg = maxHp / 16; - if (dmg == 0) - dmg = 1; - break; - case UQ_4_12(1.0): - dmg = maxHp / 8; - if (dmg == 0) - dmg = 1; - break; - case UQ_4_12(2.0): - dmg = maxHp / 4; - if (dmg == 0) - dmg = 1; - break; - case UQ_4_12(4.0): - dmg = maxHp / 2; - if (dmg == 0) - dmg = 1; - break; - } + if (gBattleStruct->illusion[battler].state == ILLUSION_NOT_SET) + SetIllusionMon(GetBattlerMon(battler), battler); + if (gBattleStruct->illusion[battler].state != ILLUSION_ON) + return NULL; - return dmg; + return gBattleStruct->illusion[battler].mon; } -s32 GetStealthHazardDamage(enum TypeSideHazard hazardType, u32 battler) +void ClearIllusionMon(u32 battler) { - u32 types[3]; - GetBattlerTypes(battler, FALSE, types); - u32 maxHp = gBattleMons[battler].maxHP; - - return GetStealthHazardDamageByTypesAndHP(hazardType, types[0], types[1], maxHp); + memset(&gBattleStruct->illusion[battler], 0, sizeof(gBattleStruct->illusion[battler])); } -bool32 IsPartnerMonFromSameTrainer(u32 battler) +u32 GetIllusionMonSpecies(u32 battler) { - if (!IsOnPlayerSide(battler) && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) - return FALSE; - else if (IsOnPlayerSide(battler) && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) - return FALSE; - else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - return FALSE; - else - return TRUE; + struct Pokemon *illusionMon = GetIllusionMonPtr(battler); + if (illusionMon != NULL) + return GetMonData(illusionMon, MON_DATA_SPECIES); + return SPECIES_NONE; } -bool32 DoesSpeciesUseHoldItemToChangeForm(u16 species, u16 heldItemId) +u32 GetIllusionMonPartyId(struct Pokemon *party, struct Pokemon *mon, struct Pokemon *partnerMon, u32 battler) { - u32 i; - const struct FormChange *formChanges = GetSpeciesFormChanges(species); + s32 partyEnd=6; + s32 partyStart=0; - for (i = 0; formChanges != NULL && formChanges[i].method != FORM_CHANGE_TERMINATOR; i++) + // Adjust party search range for Multibattles and Player vs two-trainers + if ((GetBattlerSide(battler) == B_SIDE_PLAYER && (gBattleTypeFlags & BATTLE_TYPE_MULTI)) + || (GetBattlerSide(battler) == B_SIDE_OPPONENT && (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS))) + { + if ((GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT) || (GetBattlerPosition(battler) == B_POSITION_OPPONENT_LEFT)) + { + partyEnd = 3; + partyStart = 0; + } + else + { + partyEnd = 6; + partyStart = 3; + } + } + + // Find last alive non-egg pokemon. + for (s32 id = partyEnd - 1; id >= partyStart; id--) { - enum FormChanges method = formChanges[i].method; - switch (method) + if (GetMonData(&party[id], MON_DATA_SANITY_HAS_SPECIES) + && GetMonData(&party[id], MON_DATA_HP) + && !GetMonData(&party[id], MON_DATA_IS_EGG)) { - case FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM: - case FORM_CHANGE_BATTLE_PRIMAL_REVERSION: - case FORM_CHANGE_BATTLE_ULTRA_BURST: - case FORM_CHANGE_ITEM_HOLD: - case FORM_CHANGE_BEGIN_BATTLE: - if (formChanges[i].param1 == heldItemId) - return TRUE; - break; - default: - break; + u32 species = GetMonData(&party[id], MON_DATA_SPECIES); + if (species == SPECIES_TERAPAGOS_STELLAR || (species >= SPECIES_OGERPON_TEAL_TERA && species <= SPECIES_OGERPON_CORNERSTONE_TERA)) + continue; + if (&party[id] != mon && &party[id] != partnerMon) + return id; + else // If this pokemon or its partner is last in the party, ignore Illusion. + return PARTY_SIZE; } } - return FALSE; + return PARTY_SIZE; } -bool32 CanMegaEvolve(u32 battler) +bool32 SetIllusionMon(struct Pokemon *mon, u32 battler) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); - - // Check if Player has a Mega Ring. - if (!TESTING - && (GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT || (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) && GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT)) - && !CheckBagHasItem(ITEM_MEGA_RING, 1)) - return FALSE; - - // Check if Trainer has already Mega Evolved. - if (HasTrainerUsedGimmick(battler, GIMMICK_MEGA)) - return FALSE; - - // Check if battler has another gimmick active. - if (GetActiveGimmick(battler) != GIMMICK_NONE) - return FALSE; + struct Pokemon *party, *partnerMon; + u32 id; - // Check if battler is currently held by Sky Drop. - if (gStatuses3[battler] & STATUS3_SKY_DROPPED) + gBattleStruct->illusion[battler].state = ILLUSION_OFF; + if (GetMonAbility(mon) != ABILITY_ILLUSION) return FALSE; - // Check if battler is holding a Z-Crystal. - if (holdEffect == HOLD_EFFECT_Z_CRYSTAL) - return FALSE; + party = GetBattlerParty(battler); - // Check if there is an entry in the form change table for regular Mega Evolution and battler is holding Mega Stone. - if (GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM) != gBattleMons[battler].species && holdEffect == HOLD_EFFECT_MEGA_STONE) - return TRUE; + if (IsBattlerAlive(BATTLE_PARTNER(battler))) + partnerMon = &party[gBattlerPartyIndexes[BATTLE_PARTNER(battler)]]; + else + partnerMon = mon; - // Check if there is an entry in the form change table for Wish Mega Evolution. - if (GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_MEGA_EVOLUTION_MOVE) != gBattleMons[battler].species) + id = GetIllusionMonPartyId(party, mon, partnerMon, battler); + if (id != PARTY_SIZE) + { + gBattleStruct->illusion[battler].state = ILLUSION_ON; + gBattleStruct->illusion[battler].mon = &party[id]; return TRUE; + } - // No checks passed, the mon CAN'T mega evolve. return FALSE; } -bool32 CanUltraBurst(u32 battler) +u32 TryImmunityAbilityHealStatus(u32 battler, enum AbilityEffect caseID) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); - - // Check if Player has a Z-Ring - if (!TESTING && (GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT - || (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) && GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT)) - && !CheckBagHasItem(ITEM_Z_POWER_RING, 1)) - return FALSE; - - // Check if Trainer has already Ultra Bursted. - if (HasTrainerUsedGimmick(battler, GIMMICK_ULTRA_BURST)) - return FALSE; - - // Check if battler has another gimmick active. - if (GetActiveGimmick(battler) != GIMMICK_NONE) - return FALSE; + u32 effect = 0; + switch (GetBattlerAbilityIgnoreMoldBreaker(battler)) + { + case ABILITY_IMMUNITY: + case ABILITY_PASTEL_VEIL: + if (gBattleMons[battler].status1 & (STATUS1_POISON | STATUS1_TOXIC_POISON | STATUS1_TOXIC_COUNTER)) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); + effect = 1; + } + break; + case ABILITY_OWN_TEMPO: + if (gBattleMons[battler].volatiles.confusionTurns > 0) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); + effect = 2; + } + break; + case ABILITY_LIMBER: + if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); + effect = 1; + } + break; + case ABILITY_INSOMNIA: + case ABILITY_VITAL_SPIRIT: + if (gBattleMons[battler].status1 & STATUS1_SLEEP) + { + TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); + gBattleMons[battler].volatiles.nightmare = FALSE; + StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); + effect = 1; + } + break; + case ABILITY_WATER_VEIL: + case ABILITY_WATER_BUBBLE: + case ABILITY_THERMAL_EXCHANGE: + if (gBattleMons[battler].status1 & STATUS1_BURN) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); + effect = 1; + } + break; + case ABILITY_MAGMA_ARMOR: + if (gBattleMons[battler].status1 & (STATUS1_FREEZE | STATUS1_FROSTBITE)) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); + effect = 1; + } + break; + case ABILITY_OBLIVIOUS: + if (gBattleMons[battler].volatiles.infatuation) + effect = 3; + else if (GetConfig(CONFIG_OBLIVIOUS_TAUNT) >= GEN_6 && gDisableStructs[battler].tauntTimer != 0) + effect = 4; + break; + } - // Check if mon is currently held by Sky Drop - if (gStatuses3[battler] & STATUS3_SKY_DROPPED) - return FALSE; + if (effect != 0) + { + switch (effect) + { + case 1: // status cleared + gBattleMons[battler].status1 = 0; + if (caseID == ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES) + BattleScriptExecute(BattleScript_AbilityCuredStatusEnd3); + else + BattleScriptCall(BattleScript_AbilityCuredStatus); + break; + case 2: // get rid of confusion + RemoveConfusionStatus(battler); + if (caseID == ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES) + BattleScriptExecute(BattleScript_AbilityCuredStatusEnd3); + else + BattleScriptCall(BattleScript_AbilityCuredStatus); + break; + case 3: // get rid of infatuation + gBattleMons[battler].volatiles.infatuation = 0; + if (caseID == ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES) + BattleScriptExecute(BattleScript_AbilityCuredStatusEnd3); + else + BattleScriptCall(BattleScript_AbilityCuredStatus); + break; + case 4: // get rid of taunt + gDisableStructs[battler].tauntTimer = 0; + if (caseID == ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES) + BattleScriptExecute(BattleScript_AbilityCuredStatusEnd3); + else + BattleScriptCall(BattleScript_AbilityCuredStatus); + break; + } - // Check if there is an entry in the form change table for Ultra Burst and battler is holding a Z-Crystal. - if (GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_ULTRA_BURST) != gBattleMons[battler].species && holdEffect == HOLD_EFFECT_Z_CRYSTAL) - return TRUE; + gBattleScripting.battler = gBattlerAbility = battler; + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); + MarkBattlerForControllerExec(battler); + return effect; + } - // No checks passed, the mon CAN'T ultra burst. - return FALSE; + return 0; } -void ActivateMegaEvolution(u32 battler) +uq4_12_t GetBadgeBoostModifier(void) { - gLastUsedItem = gBattleMons[battler].item; - SetActiveGimmick(battler, GIMMICK_MEGA); - if (GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_MEGA_EVOLUTION_MOVE) != gBattleMons[battler].species) - BattleScriptExecute(BattleScript_WishMegaEvolution); + if (GetConfig(CONFIG_BADGE_BOOST) < GEN_3) + return UQ_4_12(1.125); else - BattleScriptExecute(BattleScript_MegaEvolution); + return UQ_4_12(1.1); } -void ActivateUltraBurst(u32 battler) +bool32 ShouldGetStatBadgeBoost(u16 badgeFlag, u32 battler) { - gLastUsedItem = gBattleMons[battler].item; - SetActiveGimmick(battler, GIMMICK_ULTRA_BURST); - BattleScriptExecute(BattleScript_UltraBurst); + if (GetConfig(CONFIG_BADGE_BOOST) <= GEN_3 && badgeFlag != 0) + { + if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_FRONTIER)) + return FALSE; + else if (!IsOnPlayerSide(battler)) + return FALSE; + else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && TRAINER_BATTLE_PARAM.opponentA == TRAINER_SECRET_BASE) + return FALSE; + else if (FlagGet(badgeFlag)) + return TRUE; + } + return FALSE; } -bool32 IsBattlerMegaEvolved(u32 battler) +static enum DamageCategory SwapMoveDamageCategory(u32 move) { - // While Transform does copy stats and visuals, it shouldn't be counted as true Mega Evolution. - if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED) - return FALSE; - return (gSpeciesInfo[gBattleMons[battler].species].isMegaEvolution); + if (GetMoveCategory(move) == DAMAGE_CATEGORY_PHYSICAL) + return DAMAGE_CATEGORY_SPECIAL; + return DAMAGE_CATEGORY_PHYSICAL; } -bool32 IsBattlerPrimalReverted(u32 battler) +/* + The Global States gBattleStruct->categoryOverride and gBattleStruct->swapDamageCategory + can be removed but a lot of function arguments (battlerAtk and battlerDef) have to be added for this, about 50+. + This is potentially a good change because it is less likely to cause bugs in the future. +*/ +enum DamageCategory GetBattleMoveCategory(u32 move) { - // While Transform does copy stats and visuals, it shouldn't be counted as true Primal Revesion. - if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED) - return FALSE; - return (gSpeciesInfo[gBattleMons[battler].species].isPrimalReversion); -} + if (gMain.inBattle) + { + if (gBattleStruct->swapDamageCategory) // Photon Geyser, Shell Side Arm, Light That Burns the Sky, Tera Blast + return SwapMoveDamageCategory(move); + if (IsZMove(move) || IsMaxMove(move)) // TODO: Might be buggy depending on when this is called. + return gBattleStruct->categoryOverride; + if (IsBattleMoveStatus(move)) + return DAMAGE_CATEGORY_STATUS; + } -bool32 IsBattlerUltraBursted(u32 battler) -{ - // While Transform does copy stats and visuals, it shouldn't be counted as true Ultra Burst. - if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED) - return FALSE; - return (gSpeciesInfo[gBattleMons[battler].species].isUltraBurst); + if (B_PHYSICAL_SPECIAL_SPLIT < GEN_4) + return gTypesInfo[GetBattleMoveType(move)].damageCategory; + + return GetMoveCategory(move); } -bool32 IsBattlerInTeraForm(u32 battler) +void SetDynamicMoveCategory(u32 battlerAtk, u32 battlerDef, u32 move) { - // While Transform does copy stats and visuals, it shouldn't be counted as a true Tera Form. - if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED) - return FALSE; - return (gSpeciesInfo[gBattleMons[battler].species].isTeraForm); + switch (GetMoveEffect(move)) + { + case EFFECT_PHOTON_GEYSER: + gBattleStruct->swapDamageCategory = (GetCategoryBasedOnStats(battlerAtk) == DAMAGE_CATEGORY_PHYSICAL); + break; + case EFFECT_SHELL_SIDE_ARM: + if (gBattleStruct->shellSideArmCategory[battlerAtk][battlerDef] == DAMAGE_CATEGORY_PHYSICAL) + gBattleStruct->swapDamageCategory = TRUE; + break; + case EFFECT_TERA_BLAST: + if (GetActiveGimmick(battlerAtk) == GIMMICK_TERA) + gBattleStruct->swapDamageCategory = GetCategoryBasedOnStats(battlerAtk) == DAMAGE_CATEGORY_PHYSICAL; + break; + case EFFECT_TERA_STARSTORM: + if (GetActiveGimmick(battlerAtk) == GIMMICK_TERA && GET_BASE_SPECIES_ID(GetMonData(GetBattlerMon(battlerAtk), MON_DATA_SPECIES)) == SPECIES_TERAPAGOS) + gBattleStruct->swapDamageCategory = GetCategoryBasedOnStats(battlerAtk) == DAMAGE_CATEGORY_PHYSICAL; + break; + default: + gBattleStruct->swapDamageCategory = FALSE; + break; + } } -// Returns SPECIES_NONE if no form change is possible -u16 GetBattleFormChangeTargetSpecies(u32 battler, enum FormChanges method) +static bool32 TryRemoveScreens(u32 battler) { - u32 i; - u32 species = gBattleMons[battler].species; - u32 targetSpecies = species; - const struct FormChange *formChanges = GetSpeciesFormChanges(species); - struct Pokemon *mon = GetBattlerMon(battler); - u16 heldItem = gBattleMons[battler].item; + bool32 removed = FALSE; + u32 battlerSide = GetBattlerSide(battler); + u8 enemySide = GetBattlerSide(BATTLE_OPPOSITE(battler)); - for (i = 0; formChanges != NULL && formChanges[i].method != FORM_CHANGE_TERMINATOR; i++) + // try to remove from battler's side + if (gSideStatuses[battlerSide] & SIDE_STATUS_SCREEN_ANY) { - if (method == formChanges[i].method && species != formChanges[i].targetSpecies) - { - switch (method) - { - case FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM: - case FORM_CHANGE_BATTLE_PRIMAL_REVERSION: - case FORM_CHANGE_BATTLE_ULTRA_BURST: - if (heldItem == formChanges[i].param1) - targetSpecies = formChanges[i].targetSpecies; - break; - case FORM_CHANGE_BATTLE_MEGA_EVOLUTION_MOVE: - if (gBattleMons[battler].moves[0] == formChanges[i].param1 - || gBattleMons[battler].moves[1] == formChanges[i].param1 - || gBattleMons[battler].moves[2] == formChanges[i].param1 - || gBattleMons[battler].moves[3] == formChanges[i].param1) - targetSpecies = formChanges[i].targetSpecies; - break; - case FORM_CHANGE_BATTLE_SWITCH: - if (formChanges[i].param1 == GetBattlerAbility(battler) || formChanges[i].param1 == ABILITY_NONE) - targetSpecies = formChanges[i].targetSpecies; - break; - case FORM_CHANGE_BATTLE_HP_PERCENT: - if (formChanges[i].param1 == GetBattlerAbility(battler)) - { - // We multiply by 100 to make sure that integer division doesn't mess with the health check. - u32 hpCheck = gBattleMons[battler].hp * 100 * 100 / gBattleMons[battler].maxHP; - switch(formChanges[i].param2) - { - case HP_HIGHER_THAN: - if (hpCheck > formChanges[i].param3 * 100) - targetSpecies = formChanges[i].targetSpecies; - break; - case HP_LOWER_EQ_THAN: - if (hpCheck <= formChanges[i].param3 * 100) - targetSpecies = formChanges[i].targetSpecies; - break; - } - } - break; - case FORM_CHANGE_BATTLE_GIGANTAMAX: - if (GetMonData(mon, MON_DATA_GIGANTAMAX_FACTOR)) - targetSpecies = formChanges[i].targetSpecies; - break; - case FORM_CHANGE_BATTLE_WEATHER: - // Check if there is a required ability and if the battler's ability does not match it - // or is suppressed. If so, revert to the no weather form. - if (formChanges[i].param2 - && GetBattlerAbility(battler) != formChanges[i].param2 - && formChanges[i].param1 == B_WEATHER_NONE) - { - targetSpecies = formChanges[i].targetSpecies; - } - // We need to revert the weather form if the field is under Air Lock, too. - else if (!HasWeatherEffect() && formChanges[i].param1 == B_WEATHER_NONE) - { - targetSpecies = formChanges[i].targetSpecies; - } - // Otherwise, just check for a match between the weather and the form change table. - // Added a check for whether the weather is in effect to prevent end-of-turn soft locks with Cloud Nine / Air Lock - else if (((gBattleWeather & formChanges[i].param1) && HasWeatherEffect()) - || (gBattleWeather == B_WEATHER_NONE && formChanges[i].param1 == B_WEATHER_NONE)) - { - targetSpecies = formChanges[i].targetSpecies; - } - break; - case FORM_CHANGE_BATTLE_TURN_END: - case FORM_CHANGE_HIT_BY_MOVE: - if (formChanges[i].param1 == GetBattlerAbility(battler)) - targetSpecies = formChanges[i].targetSpecies; - break; - case FORM_CHANGE_STATUS: - if (gBattleMons[battler].status1 & formChanges[i].param1) - targetSpecies = formChanges[i].targetSpecies; - break; - case FORM_CHANGE_BATTLE_TERASTALLIZATION: - if (GetBattlerTeraType(battler) == formChanges[i].param1) - targetSpecies = formChanges[i].targetSpecies; - break; - case FORM_CHANGE_BATTLE_BEFORE_MOVE: - if (formChanges[i].param1 == gCurrentMove - && (formChanges[i].param2 == ABILITY_NONE || formChanges[i].param2 == GetBattlerAbility(battler))) - targetSpecies = formChanges[i].targetSpecies; - break; - case FORM_CHANGE_BATTLE_BEFORE_MOVE_CATEGORY: - if (formChanges[i].param1 == GetBattleMoveCategory(gCurrentMove) - && (formChanges[i].param2 == ABILITY_NONE || formChanges[i].param2 == GetBattlerAbility(battler))) - targetSpecies = formChanges[i].targetSpecies; - break; - default: - break; - } - } + gSideStatuses[battlerSide] &= ~SIDE_STATUS_SCREEN_ANY; + removed = TRUE; } - return targetSpecies; + // try to remove from battler opponent's side + if (gSideStatuses[enemySide] & SIDE_STATUS_SCREEN_ANY) + { + gSideStatuses[enemySide] &= ~SIDE_STATUS_SCREEN_ANY; + removed = TRUE; + } + + return removed; +} + +// Photon Geyser, Light That Burns the Sky, Tera Blast +enum DamageCategory GetCategoryBasedOnStats(u32 battler) +{ + u32 attack = gBattleMons[battler].attack; + u32 spAttack = gBattleMons[battler].spAttack; + + attack = attack * gStatStageRatios[gBattleMons[battler].statStages[STAT_ATK]][0]; + attack = attack / gStatStageRatios[gBattleMons[battler].statStages[STAT_ATK]][1]; + + spAttack = spAttack * gStatStageRatios[gBattleMons[battler].statStages[STAT_SPATK]][0]; + spAttack = spAttack / gStatStageRatios[gBattleMons[battler].statStages[STAT_SPATK]][1]; + + if (spAttack >= attack) + return DAMAGE_CATEGORY_SPECIAL; + else + return DAMAGE_CATEGORY_PHYSICAL; } -bool32 CanBattlerFormChange(u32 battler, enum FormChanges method) +static u32 GetFlingPowerFromItemId(u32 itemId) { - // Can't change form if transformed. - if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED - && B_TRANSFORM_FORM_CHANGES >= GEN_5) - return FALSE; - // Mega Evolved and Ultra Bursted PokΓ©mon should always revert to normal upon fainting or ending the battle. - if ((IsBattlerMegaEvolved(battler) || IsBattlerUltraBursted(battler) || IsBattlerInTeraForm(battler)) && (method == FORM_CHANGE_FAINT || method == FORM_CHANGE_END_BATTLE)) - return TRUE; - else if (IsBattlerPrimalReverted(battler) && (method == FORM_CHANGE_END_BATTLE)) - return TRUE; - // Gigantamaxed Pokemon should revert upon fainting, switching, or ending the battle. - else if (IsGigantamaxed(battler) && (method == FORM_CHANGE_FAINT || method == FORM_CHANGE_BATTLE_SWITCH || method == FORM_CHANGE_END_BATTLE)) - return TRUE; - return DoesSpeciesHaveFormChangeMethod(gBattleMons[battler].species, method); + if (gItemsInfo[itemId].pocket == POCKET_TM_HM) + { + u32 power = GetMovePower(ItemIdToBattleMoveId(itemId)); + if (power > 1) + return power; + return 10; // Status moves and moves with variable power always return 10 power. + } + else + return GetItemFlingPower(itemId); } -bool32 TryBattleFormChange(u32 battler, enum FormChanges method) +bool32 CanFling(u32 battler) { - u32 monId = gBattlerPartyIndexes[battler]; - u32 side = GetBattlerSide(battler); - struct Pokemon *party = GetBattlerParty(battler); - u32 currentSpecies = GetMonData(&party[monId], MON_DATA_SPECIES); - u32 targetSpecies; + u16 item = gBattleMons[battler].item; - if (!CanBattlerFormChange(battler, method)) + if (item == ITEM_NONE + || (GetConfig(CONFIG_KLUTZ_FLING_INTERACTION) >= GEN_5 && GetBattlerAbility(battler) == ABILITY_KLUTZ) + || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM + || gBattleMons[battler].volatiles.embargo + || GetFlingPowerFromItemId(item) == 0 + || !CanBattlerGetOrLoseItem(battler, item)) return FALSE; - targetSpecies = GetBattleFormChangeTargetSpecies(battler, method); - if (targetSpecies == currentSpecies) - targetSpecies = GetFormChangeTargetSpecies(&party[monId], method, 0); - if (targetSpecies != currentSpecies) - { - // Saves the original species on the first form change. - if (gBattleStruct->changedSpecies[side][monId] == SPECIES_NONE) - gBattleStruct->changedSpecies[side][monId] = gBattleMons[battler].species; - - TryToSetBattleFormChangeMoves(&party[monId], method); - SetMonData(&party[monId], MON_DATA_SPECIES, &targetSpecies); - gBattleMons[battler].species = targetSpecies; - RecalcBattlerStats(battler, &party[monId], method == FORM_CHANGE_BATTLE_GIGANTAMAX); - return TRUE; - } - else if (gBattleStruct->changedSpecies[side][monId] != SPECIES_NONE) - { - bool32 restoreSpecies = FALSE; + return TRUE; +} - // Mega Evolved and Ultra Bursted PokΓ©mon should always revert to normal upon fainting or ending the battle, so no need to add it to the form change tables. - if ((IsBattlerMegaEvolved(battler) || IsBattlerUltraBursted(battler) || IsBattlerInTeraForm(battler)) && (method == FORM_CHANGE_FAINT || method == FORM_CHANGE_END_BATTLE)) - restoreSpecies = TRUE; +// Sort an array of battlers by speed +// Useful for effects like pickpocket, eject button, red card, dancer +void SortBattlersBySpeed(u8 *battlers, bool32 slowToFast) +{ + int i, j, currSpeed, currBattler; + u16 speeds[MAX_BATTLERS_COUNT] = {0}; - // Unlike Megas, Primal Reversion isn't canceled on fainting. - else if (IsBattlerPrimalReverted(battler) && (method == FORM_CHANGE_END_BATTLE)) - restoreSpecies = TRUE; + for (i = 0; i < gBattlersCount; i++) + { + u32 battler = battlers[i]; + speeds[i] = GetBattlerTotalSpeedStat(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler)); + } - // Gigantamax Pokemon have their forms reverted after fainting, switching, or ending the battle. - else if (IsGigantamaxed(battler) && (method == FORM_CHANGE_FAINT || method == FORM_CHANGE_BATTLE_SWITCH || method == FORM_CHANGE_END_BATTLE)) - restoreSpecies = TRUE; + for (i = 1; i < gBattlersCount; i++) + { + currBattler = battlers[i]; + currSpeed = speeds[i]; + j = i - 1; - if (restoreSpecies) + if (slowToFast) { - u32 abilityForm = gBattleMons[battler].ability; - // Reverts the original species - TryToSetBattleFormChangeMoves(&party[monId], method); - SetMonData(&party[monId], MON_DATA_SPECIES, &gBattleStruct->changedSpecies[side][monId]); - RecalcBattlerStats(battler, &party[monId], method == FORM_CHANGE_BATTLE_GIGANTAMAX); - // Battler data is not updated with regular form's ability, not doing so could cause wrong ability activation. - if (method == FORM_CHANGE_FAINT) - gBattleMons[battler].ability = abilityForm; - return TRUE; + while (j >= 0 && speeds[j] > currSpeed) + { + battlers[j + 1] = battlers[j]; + speeds[j + 1] = speeds[j]; + j = j - 1; + } + } + else + { + while (j >= 0 && speeds[j] < currSpeed) + { + battlers[j + 1] = battlers[j]; + speeds[j + 1] = speeds[j]; + j = j - 1; + } } - } - return FALSE; + battlers[j + 1] = currBattler; + speeds[j + 1] = currSpeed; + } } -bool32 DoBattlersShareType(u32 battler1, u32 battler2) +void TryRestoreHeldItems(void) { - s32 i; - u32 types1[3], types2[3]; - GetBattlerTypes(battler1, FALSE, types1); - GetBattlerTypes(battler2, FALSE, types2); - - if (types1[2] == TYPE_MYSTERY) - types1[2] = types1[0]; - if (types2[2] == TYPE_MYSTERY) - types2[2] = types2[0]; + u32 i; + bool32 returnNPCItems = B_RETURN_STOLEN_NPC_ITEMS >= GEN_5 && gBattleTypeFlags & BATTLE_TYPE_TRAINER; - for (i = 0; i < 3; i++) + for (i = 0; i < PARTY_SIZE; i++) { - if (types1[i] == types2[0] || types1[i] == types2[1] || types1[i] == types2[2]) - return TRUE; - } + // Check if held items should be restored after battle based on generation + if (B_RESTORE_HELD_BATTLE_ITEMS >= GEN_9 || gBattleStruct->itemLost[B_SIDE_PLAYER][i].stolen || returnNPCItems) + { + u16 lostItem = gBattleStruct->itemLost[B_SIDE_PLAYER][i].originalItem; - return FALSE; + // Check if the lost item is a berry and the mon is not holding it + if (GetItemPocket(lostItem) == POCKET_BERRIES && GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM) != lostItem) + lostItem = ITEM_NONE; + + // Check if the lost item should be restored + if ((lostItem != ITEM_NONE || returnNPCItems) && GetItemPocket(lostItem) != POCKET_BERRIES) + SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &lostItem); + } + } } -bool32 CanBattlerGetOrLoseItem(u32 battler, u16 itemId) +bool32 CanStealItem(u32 battlerStealing, u32 battlerItem, u16 item) { - u16 species = gBattleMons[battler].species; - enum ItemHoldEffect holdEffect = GetItemHoldEffect(itemId); + enum BattleSide stealerSide = GetBattlerSide(battlerStealing); - if (ItemIsMail(itemId)) + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) return FALSE; - else if (itemId == ITEM_ENIGMA_BERRY_E_READER) + + // Check if the battler trying to steal should be able to + if (stealerSide == B_SIDE_OPPONENT + && !(gBattleTypeFlags & + (BATTLE_TYPE_EREADER_TRAINER + | BATTLE_TYPE_FRONTIER + | BATTLE_TYPE_LINK + | BATTLE_TYPE_RECORDED_LINK + | BATTLE_TYPE_SECRET_BASE + | (B_TRAINERS_KNOCK_OFF_ITEMS == TRUE ? BATTLE_TYPE_TRAINER : 0) + ))) + { return FALSE; - else if (DoesSpeciesUseHoldItemToChangeForm(species, itemId)) + } + else if (!(gBattleTypeFlags & + (BATTLE_TYPE_EREADER_TRAINER + | BATTLE_TYPE_FRONTIER + | BATTLE_TYPE_LINK + | BATTLE_TYPE_RECORDED_LINK + | BATTLE_TYPE_SECRET_BASE)) + && (gWishFutureKnock.knockedOffMons[stealerSide] & (1u << gBattlerPartyIndexes[battlerStealing]))) + { return FALSE; - else if (holdEffect == HOLD_EFFECT_Z_CRYSTAL) + } + + // It's supposed to pop before trying to steal but this also works + if (GetItemHoldEffect(item) == HOLD_EFFECT_AIR_BALLOON) return FALSE; - else if (holdEffect == HOLD_EFFECT_BOOSTER_ENERGY - && (gSpeciesInfo[gBattleMons[battler].species].isParadox || gSpeciesInfo[gBattleMons[gBattlerTarget].species].isParadox)) + + if (!CanBattlerGetOrLoseItem(battlerItem, item) // Battler with item cannot have it stolen + || !CanBattlerGetOrLoseItem(battlerStealing, item)) // Stealer cannot take the item return FALSE; - else - return TRUE; + + return TRUE; } -u32 GetBattlerVisualSpecies(u32 battler) +void TrySaveExchangedItem(u32 battler, u16 stolenItem) { - u32 illusionSpecies = GetIllusionMonSpecies(battler); - if (illusionSpecies != SPECIES_NONE) - return illusionSpecies; - return gBattleMons[battler].species; + // Because BtlController_EmitSetMonData does SetMonData, we need to save the stolen item only if it matches the battler's original + // So, if the player steals an item during battle and has it stolen from it, it will not end the battle with it (naturally) + if (B_TRAINERS_KNOCK_OFF_ITEMS == FALSE) + return; + // If regular trainer battle and mon's original item matches what is being stolen, save it to be restored at end of battle + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER + && !(gBattleTypeFlags & BATTLE_TYPE_FRONTIER) + && IsOnPlayerSide(battler) + && stolenItem == gBattleStruct->itemLost[B_SIDE_PLAYER][gBattlerPartyIndexes[battler]].originalItem) + gBattleStruct->itemLost[B_SIDE_PLAYER][gBattlerPartyIndexes[battler]].stolen = TRUE; } -bool32 TryClearIllusion(u32 battler, u32 caseID) +bool32 IsBattlerAffectedByHazards(u32 battler, bool32 toxicSpikes) { - if (gBattleStruct->illusion[battler].state != ILLUSION_ON) - return FALSE; - if (GetBattlerAbility(battler) == ABILITY_ILLUSION && IsBattlerAlive(battler)) - return FALSE; - - gBattleScripting.battler = battler; - if (caseID == ABILITYEFFECT_ON_SWITCHIN) + bool32 ret = TRUE; + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); + if (toxicSpikes && holdEffect == HOLD_EFFECT_HEAVY_DUTY_BOOTS && !IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) { - BattleScriptPushCursorAndCallback(BattleScript_IllusionOffEnd3); + ret = FALSE; + RecordItemEffectBattle(battler, holdEffect); } - else + else if (holdEffect == HOLD_EFFECT_HEAVY_DUTY_BOOTS) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_IllusionOff; + ret = FALSE; + RecordItemEffectBattle(battler, holdEffect); } - return TRUE; + return ret; } -struct Pokemon *GetIllusionMonPtr(u32 battler) +bool32 IsSheerForceAffected(u16 move, enum Ability ability) { - if (gBattleStruct->illusion[battler].state == ILLUSION_NOT_SET) - { - if (IsOnPlayerSide(battler)) - SetIllusionMon(GetBattlerMon(battler), battler); - else - SetIllusionMon(GetBattlerMon(battler), battler); - } - if (gBattleStruct->illusion[battler].state != ILLUSION_ON) - return NULL; - - return gBattleStruct->illusion[battler].mon; + return ability == ABILITY_SHEER_FORCE && MoveIsAffectedBySheerForce(move); } -void ClearIllusionMon(u32 battler) +// This function is the body of "jumpifstat", but can be used dynamically in a function +bool32 CompareStat(u32 battler, enum Stat statId, u8 cmpTo, u8 cmpKind, enum Ability ability) { - memset(&gBattleStruct->illusion[battler], 0, sizeof(gBattleStruct->illusion[battler])); -} + bool32 ret = FALSE; + u8 statValue = gBattleMons[battler].statStages[statId]; -u32 GetIllusionMonSpecies(u32 battler) -{ - struct Pokemon *illusionMon = GetIllusionMonPtr(battler); - if (illusionMon != NULL) - return GetMonData(illusionMon, MON_DATA_SPECIES); - return SPECIES_NONE; -} + // Because this command is used as a way of checking if a stat can be lowered/raised, + // we need to do some modification at run-time. + if (ability == ABILITY_CONTRARY) + { + if (cmpKind == CMP_GREATER_THAN) + cmpKind = CMP_LESS_THAN; + else if (cmpKind == CMP_LESS_THAN) + cmpKind = CMP_GREATER_THAN; -u32 GetIllusionMonPartyId(struct Pokemon *party, struct Pokemon *mon, struct Pokemon *partnerMon) -{ - s32 id; - // Find last alive non-egg pokemon. - for (id = PARTY_SIZE - 1; id >= 0; id--) + if (cmpTo == MIN_STAT_STAGE) + cmpTo = MAX_STAT_STAGE; + else if (cmpTo == MAX_STAT_STAGE) + cmpTo = MIN_STAT_STAGE; + } + + switch (cmpKind) { - if (GetMonData(&party[id], MON_DATA_SANITY_HAS_SPECIES) - && GetMonData(&party[id], MON_DATA_HP) - && !GetMonData(&party[id], MON_DATA_IS_EGG)) - { - u32 species = GetMonData(&party[id], MON_DATA_SPECIES); - if (species == SPECIES_TERAPAGOS_STELLAR || (species >= SPECIES_OGERPON_TEAL_TERA && species <= SPECIES_OGERPON_CORNERSTONE_TERA)) - continue; - if (&party[id] != mon && &party[id] != partnerMon) - return id; - else // If this pokemon or its partner is last in the party, ignore Illusion. - return PARTY_SIZE; - } + case CMP_EQUAL: + if (statValue == cmpTo) + ret = TRUE; + break; + case CMP_NOT_EQUAL: + if (statValue != cmpTo) + ret = TRUE; + break; + case CMP_GREATER_THAN: + if (statValue > cmpTo) + ret = TRUE; + break; + case CMP_LESS_THAN: + if (statValue < cmpTo) + ret = TRUE; + break; + case CMP_COMMON_BITS: + if (statValue & cmpTo) + ret = TRUE; + break; + case CMP_NO_COMMON_BITS: + if (!(statValue & cmpTo)) + ret = TRUE; + break; } - return PARTY_SIZE; + + return ret; } -bool32 SetIllusionMon(struct Pokemon *mon, u32 battler) +bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 checkTarget) { - struct Pokemon *party, *partnerMon; - u32 id; - - gBattleStruct->illusion[battler].state = ILLUSION_OFF; - if (GetMonAbility(mon) != ABILITY_ILLUSION) + if (GetConfig(CONFIG_PRANKSTER_DARK_TYPES) < GEN_7) + return FALSE; + if (!gProtectStructs[battlerPrankster].pranksterElevated) + return FALSE; + if (IsBattlerAlly(battlerPrankster, battlerDef)) + return FALSE; + if (checkTarget && (GetBattlerMoveTargetType(battlerPrankster, move) & (MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_DEPENDS))) + return FALSE; + if (!IS_BATTLER_OF_TYPE(battlerDef, TYPE_DARK)) + return FALSE; + if (IsSemiInvulnerable(battlerDef, CHECK_ALL)) return FALSE; - party = GetBattlerParty(battler); + return TRUE; +} - if (IsBattlerAlive(BATTLE_PARTNER(battler))) - partnerMon = &party[gBattlerPartyIndexes[BATTLE_PARTNER(battler)]]; - else - partnerMon = mon; +bool32 CantPickupItem(u32 battler) +{ + // Used by RandomUniformExcept() for RNG_PICKUP + if (battler == gBattlerAttacker && (GetConfig(CONFIG_PICKUP_WILD) < GEN_9 || gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK))) + return TRUE; + return !(IsBattlerAlive(battler) && GetBattlerPartyState(battler)->usedHeldItem && gBattleStruct->battlerState[battler].canPickupItem); +} - id = GetIllusionMonPartyId(party, mon, partnerMon); - if (id != PARTY_SIZE) +bool32 PickupHasValidTarget(u32 battler) +{ + u32 i; + for (i = 0; i < gBattlersCount; i++) { - gBattleStruct->illusion[battler].state = ILLUSION_ON; - gBattleStruct->illusion[battler].mon = &party[id]; - return TRUE; + if (!CantPickupItem(i)) + return TRUE; } - return FALSE; } -bool32 ShouldGetStatBadgeBoost(u16 badgeFlag, u32 battler) +bool32 IsBattlerWeatherAffected(u32 battler, u32 weatherFlags) { - if (B_BADGE_BOOST == GEN_3 && badgeFlag != 0) + if (gBattleWeather & weatherFlags && HasWeatherEffect()) { - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_FRONTIER)) - return FALSE; - else if (!IsOnPlayerSide(battler)) - return FALSE; - else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && TRAINER_BATTLE_PARAM.opponentA == TRAINER_SECRET_BASE) - return FALSE; - else if (FlagGet(badgeFlag)) - return TRUE; + // given weather is active -> check if its sun, rain against utility umbrella (since only 1 weather can be active at once) + if (gBattleWeather & (B_WEATHER_SUN | B_WEATHER_RAIN) && GetBattlerHoldEffect(battler) == HOLD_EFFECT_UTILITY_UMBRELLA) + return FALSE; // utility umbrella blocks sun, rain effects + + return TRUE; } return FALSE; } -static u32 SwapMoveDamageCategory(u32 move) +// Gets move target before redirection effects etc. are applied +// Possible return values are defined in battle.h following MOVE_TARGET_SELECTED +// TODO: Add args: ability and hold effect +u32 GetBattlerMoveTargetType(u32 battler, u32 move) { - if (GetMoveCategory(move) == DAMAGE_CATEGORY_PHYSICAL) - return DAMAGE_CATEGORY_SPECIAL; - return DAMAGE_CATEGORY_PHYSICAL; + enum BattleMoveEffects effect = GetMoveEffect(move); + if (effect == EFFECT_CURSE && !IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) + return MOVE_TARGET_USER; + if (effect == EFFECT_EXPANDING_FORCE && IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler), STATUS_FIELD_PSYCHIC_TERRAIN)) + return MOVE_TARGET_BOTH; + if (effect == EFFECT_TERA_STARSTORM && gBattleMons[battler].species == SPECIES_TERAPAGOS_STELLAR) + return MOVE_TARGET_BOTH; + + return GetMoveTarget(move); } -/* - The Global States gBattleStruct->categoryOverride and gBattleStruct->swapDamageCategory - can be removed but a lot of function arguments (battlerAtk and battlerDef) have to be added for this, about 50+. - This is potentially a good change because it is less likely to cause bugs in the future. -*/ -u32 GetBattleMoveCategory(u32 move) +bool32 CanTargetBattler(u32 battlerAtk, u32 battlerDef, u16 move) { - if (gMain.inBattle) - { - if (gBattleStruct->swapDamageCategory) // Photon Geyser, Shell Side Arm, Light That Burns the Sky, Tera Blast - return SwapMoveDamageCategory(move); - if (IsZMove(move) || IsMaxMove(move)) // TODO: Might be buggy depending on when this is called. - return gBattleStruct->categoryOverride; - if (IsBattleMoveStatus(move)) - return DAMAGE_CATEGORY_STATUS; - } - - if (B_PHYSICAL_SPECIAL_SPLIT <= GEN_4) - return gTypesInfo[GetBattleMoveType(move)].damageCategory; + if (GetMoveEffect(move) == EFFECT_HIT_ENEMY_HEAL_ALLY + && IsBattlerAlly(battlerAtk, battlerDef) + && gBattleMons[battlerAtk].volatiles.healBlock) + return FALSE; // PokΓ©mon affected by Heal Block cannot target allies with Pollen Puff + if (IsBattlerAlly(battlerAtk, battlerDef) && (GetActiveGimmick(battlerAtk) == GIMMICK_DYNAMAX + || IsGimmickSelected(battlerAtk, GIMMICK_DYNAMAX))) + return FALSE; - return GetMoveCategory(move); + return TRUE; } -void SetDynamicMoveCategory(u32 battlerAtk, u32 battlerDef, u32 move) +static void SetRandomMultiHitCounter() { - switch (GetMoveEffect(move)) - { - case EFFECT_PHOTON_GEYSER: - gBattleStruct->swapDamageCategory = (GetCategoryBasedOnStats(battlerAtk) == DAMAGE_CATEGORY_PHYSICAL); - break; - case EFFECT_SHELL_SIDE_ARM: - if (gBattleStruct->shellSideArmCategory[battlerAtk][battlerDef] == DAMAGE_CATEGORY_PHYSICAL) - gBattleStruct->swapDamageCategory = TRUE; - break; - case EFFECT_TERA_BLAST: - if (GetActiveGimmick(battlerAtk) == GIMMICK_TERA) - gBattleStruct->swapDamageCategory = GetCategoryBasedOnStats(battlerAtk) == DAMAGE_CATEGORY_PHYSICAL; - break; - case EFFECT_TERA_STARSTORM: - if (GetActiveGimmick(battlerAtk) == GIMMICK_TERA && GET_BASE_SPECIES_ID(GetMonData(GetBattlerMon(battlerAtk), MON_DATA_SPECIES)) == SPECIES_TERAPAGOS) - gBattleStruct->swapDamageCategory = GetCategoryBasedOnStats(battlerAtk) == DAMAGE_CATEGORY_PHYSICAL; - break; - default: - gBattleStruct->swapDamageCategory = FALSE; - break; - } + if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_LOADED_DICE) + gMultiHitCounter = RandomUniform(RNG_LOADED_DICE, 4, 5); + else if (GetConfig(CONFIG_MULTI_HIT_CHANCE) >= GEN_5) + gMultiHitCounter = RandomWeighted(RNG_HITS, 0, 0, 7, 7, 3, 3); // 35%: 2 hits, 35%: 3 hits, 15% 4 hits, 15% 5 hits. + else + gMultiHitCounter = RandomWeighted(RNG_HITS, 0, 0, 3, 3, 1, 1); // 37.5%: 2 hits, 37.5%: 3 hits, 12.5% 4 hits, 12.5% 5 hits. } -static bool32 TryRemoveScreens(u32 battler) +void CopyMonLevelAndBaseStatsToBattleMon(u32 battler, struct Pokemon *mon) { - bool32 removed = FALSE; - u32 battlerSide = GetBattlerSide(battler); - u8 enemySide = GetBattlerSide(BATTLE_OPPOSITE(battler)); - - // try to remove from battler's side - if (gSideStatuses[battlerSide] & SIDE_STATUS_SCREEN_ANY) - { - gSideStatuses[battlerSide] &= ~SIDE_STATUS_SCREEN_ANY; - removed = TRUE; - } - - // try to remove from battler opponent's side - if (gSideStatuses[enemySide] & SIDE_STATUS_SCREEN_ANY) - { - gSideStatuses[enemySide] &= ~SIDE_STATUS_SCREEN_ANY; - removed = TRUE; - } + gBattleMons[battler].level = GetMonData(mon, MON_DATA_LEVEL); + gBattleMons[battler].hp = GetMonData(mon, MON_DATA_HP); + gBattleMons[battler].maxHP = GetMonData(mon, MON_DATA_MAX_HP); + gBattleMons[battler].attack = GetMonData(mon, MON_DATA_ATK); + gBattleMons[battler].defense = GetMonData(mon, MON_DATA_DEF); + gBattleMons[battler].speed = GetMonData(mon, MON_DATA_SPEED); + gBattleMons[battler].spAttack = GetMonData(mon, MON_DATA_SPATK); + gBattleMons[battler].spDefense = GetMonData(mon, MON_DATA_SPDEF); +} - return removed; +void CopyMonAbilityAndTypesToBattleMon(u32 battler, struct Pokemon *mon) +{ + gBattleMons[battler].ability = GetMonAbility(mon); + gBattleMons[battler].types[0] = GetSpeciesType(gBattleMons[battler].species, 0); + gBattleMons[battler].types[1] = GetSpeciesType(gBattleMons[battler].species, 1); + gBattleMons[battler].types[2] = TYPE_MYSTERY; } -static bool32 IsUnnerveAbilityOnOpposingSide(u32 battler) +void RecalcBattlerStats(u32 battler, struct Pokemon *mon, bool32 isDynamaxing) { - for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + u32 hp = GetMonData(mon, MON_DATA_HP); + u32 oldMaxHp = GetMonData(mon, MON_DATA_MAX_HP); + CalculateMonStats(mon); + if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX && gChosenActionByBattler[battler] != B_ACTION_SWITCH) { - if (battler == battlerDef || IsBattlerAlly(battler, battlerDef)) - continue; - - if (!IsBattlerAlive(battlerDef)) - continue; - - u32 ability = GetBattlerAbility(battlerDef); - switch (ability) + ApplyDynamaxHPMultiplier(mon); + u32 newMaxHp = GetMonData(mon, MON_DATA_MAX_HP); + if (!isDynamaxing) { - case ABILITY_UNNERVE: - case ABILITY_AS_ONE_ICE_RIDER: - case ABILITY_AS_ONE_SHADOW_RIDER: - return TRUE; + if (newMaxHp > oldMaxHp) // restore hp gained from changing form, without this, dynamaxed form changes are calculated incorrectly + { + hp += (newMaxHp - oldMaxHp); + SetMonData(mon, MON_DATA_HP, &hp); + } + else + { + SetMonData(mon, MON_DATA_HP, &hp); + } } } + CopyMonLevelAndBaseStatsToBattleMon(battler, mon); + CopyMonAbilityAndTypesToBattleMon(battler, mon); +} - return FALSE; +void RemoveConfusionStatus(u32 battler) +{ + gBattleMons[battler].volatiles.confusionTurns = 0; + gBattleMons[battler].volatiles.infiniteConfusion = FALSE; } -// Photon Geyser, Light That Burns the Sky, Tera Blast -u8 GetCategoryBasedOnStats(u32 battler) +u8 GetBattlerGender(u32 battler) { - u32 attack = gBattleMons[battler].attack; - u32 spAttack = gBattleMons[battler].spAttack; + return GetGenderFromSpeciesAndPersonality(gBattleMons[battler].species, + gBattleMons[battler].personality); +} - attack = attack * gStatStageRatios[gBattleMons[battler].statStages[STAT_ATK]][0]; - attack = attack / gStatStageRatios[gBattleMons[battler].statStages[STAT_ATK]][1]; +bool32 AreBattlersOfOppositeGender(u32 battler1, u32 battler2) +{ + u8 gender1 = GetBattlerGender(battler1); + u8 gender2 = GetBattlerGender(battler2); - spAttack = spAttack * gStatStageRatios[gBattleMons[battler].statStages[STAT_SPATK]][0]; - spAttack = spAttack / gStatStageRatios[gBattleMons[battler].statStages[STAT_SPATK]][1]; + return (gender1 != MON_GENDERLESS && gender2 != MON_GENDERLESS && gender1 != gender2); +} - if (spAttack >= attack) - return DAMAGE_CATEGORY_SPECIAL; - else - return DAMAGE_CATEGORY_PHYSICAL; +bool32 AreBattlersOfSameGender(u32 battler1, u32 battler2) +{ + u8 gender1 = GetBattlerGender(battler1); + u8 gender2 = GetBattlerGender(battler2); + + return (gender1 != MON_GENDERLESS && gender2 != MON_GENDERLESS && gender1 == gender2); } -static u32 GetFlingPowerFromItemId(u32 itemId) +u32 CalcSecondaryEffectChance(u32 battler, enum Ability battlerAbility, const struct AdditionalEffect *additionalEffect) { - if (itemId >= ITEM_TM01 && itemId <= ITEM_HM08) - { - u32 power = GetMovePower(ItemIdToBattleMoveId(itemId)); - if (power > 1) - return power; - return 10; // Status moves and moves with variable power always return 10 power. - } - else - return GetItemFlingPower(itemId); + bool8 hasSereneGrace = (battlerAbility == ABILITY_SERENE_GRACE); + bool8 hasRainbow = (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_RAINBOW) != 0; + u16 secondaryEffectChance = additionalEffect->chance; + + if (hasRainbow && hasSereneGrace && additionalEffect->moveEffect == MOVE_EFFECT_FLINCH) + return secondaryEffectChance * 2; + + if (hasSereneGrace) + secondaryEffectChance *= 2; + if (hasRainbow && additionalEffect->moveEffect != MOVE_EFFECT_SECRET_POWER) + secondaryEffectChance *= 2; + + return secondaryEffectChance; } -bool32 CanFling(u32 battler) +bool32 MoveEffectIsGuaranteed(u32 battler, enum Ability battlerAbility, const struct AdditionalEffect *additionalEffect) { - u16 item = gBattleMons[battler].item; + return additionalEffect->chance == 0 || CalcSecondaryEffectChance(battler, battlerAbility, additionalEffect) >= 100; +} - if (item == ITEM_NONE - || (B_KLUTZ_FLING_INTERACTION >= GEN_5 && GetBattlerAbility(battler) == ABILITY_KLUTZ) - || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM - || gStatuses3[battler] & STATUS3_EMBARGO - || GetFlingPowerFromItemId(item) == 0 - || !CanBattlerGetOrLoseItem(battler, item)) +bool32 IsGen6ExpShareEnabled(void) +{ + if (I_EXP_SHARE_FLAG <= TEMP_FLAGS_END) return FALSE; - return TRUE; + return FlagGet(I_EXP_SHARE_FLAG); } -// Sort an array of battlers by speed -// Useful for effects like pickpocket, eject button, red card, dancer -void SortBattlersBySpeed(u8 *battlers, bool32 slowToFast) -{ - int i, j, currSpeed, currBattler; - u16 speeds[MAX_BATTLERS_COUNT] = {0}; - - for (i = 0; i < gBattlersCount; i++) - speeds[i] = GetBattlerTotalSpeedStat(battlers[i]); - for (i = 1; i < gBattlersCount; i++) +bool32 MoveHasAdditionalEffect(u32 move, u32 moveEffect) +{ + u32 i; + u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); + for (i = 0; i < numAdditionalEffects; i++) { - currBattler = battlers[i]; - currSpeed = speeds[i]; - j = i - 1; - - if (slowToFast) - { - while (j >= 0 && speeds[j] > currSpeed) - { - battlers[j + 1] = battlers[j]; - speeds[j + 1] = speeds[j]; - j = j - 1; - } - } - else - { - while (j >= 0 && speeds[j] < currSpeed) - { - battlers[j + 1] = battlers[j]; - speeds[j + 1] = speeds[j]; - j = j - 1; - } - } - - battlers[j + 1] = currBattler; - speeds[j + 1] = currSpeed; + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + if (additionalEffect->moveEffect == moveEffect && additionalEffect->self == FALSE) + return TRUE; } + return FALSE; } -void TryRestoreHeldItems(void) +bool32 MoveHasAdditionalEffectWithChance(u32 move, u32 moveEffect, u32 chance) { u32 i; - bool32 returnNPCItems = B_RETURN_STOLEN_NPC_ITEMS >= GEN_5 && gBattleTypeFlags & BATTLE_TYPE_TRAINER; - - for (i = 0; i < PARTY_SIZE; i++) + u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); + for (i = 0; i < numAdditionalEffects; i++) { - // Check if held items should be restored after battle based on generation - if (B_RESTORE_HELD_BATTLE_ITEMS >= GEN_9 || gBattleStruct->itemLost[B_SIDE_PLAYER][i].stolen || returnNPCItems) - { - u16 lostItem = gBattleStruct->itemLost[B_SIDE_PLAYER][i].originalItem; - - // Check if the lost item is a berry and the mon is not holding it - if (GetItemPocket(lostItem) == POCKET_BERRIES && GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM) != lostItem) - lostItem = ITEM_NONE; - - // Check if the lost item should be restored - if ((lostItem != ITEM_NONE || returnNPCItems) && GetItemPocket(lostItem) != POCKET_BERRIES) - SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &lostItem); - } + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + if (additionalEffect->moveEffect == moveEffect && additionalEffect->chance == chance) + return TRUE; } + return FALSE; } -bool32 CanStealItem(u32 battlerStealing, u32 battlerItem, u16 item) +bool32 MoveHasAdditionalEffectSelf(u32 move, u32 moveEffect) { - u8 stealerSide = GetBattlerSide(battlerStealing); - - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) - return FALSE; - - // Check if the battler trying to steal should be able to - if (stealerSide == B_SIDE_OPPONENT - && !(gBattleTypeFlags & - (BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_FRONTIER - | BATTLE_TYPE_LINK - | BATTLE_TYPE_RECORDED_LINK - | BATTLE_TYPE_SECRET_BASE - | (B_TRAINERS_KNOCK_OFF_ITEMS == TRUE ? BATTLE_TYPE_TRAINER : 0) - ))) - { - return FALSE; - } - else if (!(gBattleTypeFlags & - (BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_FRONTIER - | BATTLE_TYPE_LINK - | BATTLE_TYPE_RECORDED_LINK - | BATTLE_TYPE_SECRET_BASE)) - && (gWishFutureKnock.knockedOffMons[stealerSide] & (1u << gBattlerPartyIndexes[battlerStealing]))) + u32 i; + u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); + for (i = 0; i < numAdditionalEffects; i++) { - return FALSE; + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + if (additionalEffect->moveEffect == moveEffect && additionalEffect->self == TRUE) + return TRUE; } - - // It's supposed to pop before trying to steal but this also works - if (GetItemHoldEffect(item) == HOLD_EFFECT_AIR_BALLOON) - return FALSE; - - if (!CanBattlerGetOrLoseItem(battlerItem, item) // Battler with item cannot have it stolen - || !CanBattlerGetOrLoseItem(battlerStealing, item)) // Stealer cannot take the item - return FALSE; - - return TRUE; + return FALSE; } -void TrySaveExchangedItem(u32 battler, u16 stolenItem) +bool32 IsMoveEffectRemoveSpeciesType(u32 move, u32 moveEffect, u32 argument) { - // Because BtlController_EmitSetMonData does SetMonData, we need to save the stolen item only if it matches the battler's original - // So, if the player steals an item during battle and has it stolen from it, it will not end the battle with it (naturally) - if (B_TRAINERS_KNOCK_OFF_ITEMS == FALSE) - return; - // If regular trainer battle and mon's original item matches what is being stolen, save it to be restored at end of battle - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER - && !(gBattleTypeFlags & BATTLE_TYPE_FRONTIER) - && IsOnPlayerSide(battler) - && stolenItem == gBattleStruct->itemLost[B_SIDE_PLAYER][gBattlerPartyIndexes[battler]].originalItem) - gBattleStruct->itemLost[B_SIDE_PLAYER][gBattlerPartyIndexes[battler]].stolen = TRUE; + return (GetMoveArgType(move) == argument) && MoveHasAdditionalEffectSelf(move, moveEffect); } -bool32 IsBattlerAffectedByHazards(u32 battler, bool32 toxicSpikes) +bool32 MoveHasChargeTurnAdditionalEffect(u32 move) { - bool32 ret = TRUE; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); - if (toxicSpikes && holdEffect == HOLD_EFFECT_HEAVY_DUTY_BOOTS && !IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) - { - ret = FALSE; - RecordItemEffectBattle(battler, holdEffect); - } - else if (holdEffect == HOLD_EFFECT_HEAVY_DUTY_BOOTS) + u32 i; + u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); + for (i = 0; i < numAdditionalEffects; i++) { - ret = FALSE; - RecordItemEffectBattle(battler, holdEffect); + if (GetMoveAdditionalEffectById(move, i)->onChargeTurnOnly) + return TRUE; } - return ret; + return FALSE; } -bool32 TestIfSheerForceAffected(u32 battler, u16 move) +bool32 MoveIsAffectedBySheerForce(u32 move) { - return GetBattlerAbility(battler) == ABILITY_SHEER_FORCE && MoveIsAffectedBySheerForce(move); + u32 i; + u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); + for (i = 0; i < numAdditionalEffects; i++) + { + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + if ((additionalEffect->chance > 0) != additionalEffect->sheerForceOverride) + return TRUE; + } + return FALSE; } -// This function is the body of "jumpifstat", but can be used dynamically in a function -bool32 CompareStat(u32 battler, u8 statId, u8 cmpTo, u8 cmpKind) +bool8 CanMonParticipateInSkyBattle(struct Pokemon *mon) { - bool32 ret = FALSE; - u8 statValue = gBattleMons[battler].statStages[statId]; + u16 species = GetMonData(mon, MON_DATA_SPECIES); + u16 monAbilityNum = GetMonData(mon, MON_DATA_ABILITY_NUM, NULL); - // Because this command is used as a way of checking if a stat can be lowered/raised, - // we need to do some modification at run-time. - if (GetBattlerAbility(battler) == ABILITY_CONTRARY) + bool8 hasLevitateAbility = GetSpeciesAbility(species, monAbilityNum) == ABILITY_LEVITATE; + bool8 isFlyingType = GetSpeciesType(species, 0) == TYPE_FLYING || GetSpeciesType(species, 1) == TYPE_FLYING; + bool8 monIsValidAndNotEgg = GetMonData(mon, MON_DATA_SANITY_HAS_SPECIES) && !GetMonData(mon, MON_DATA_IS_EGG); + + if (monIsValidAndNotEgg) { - if (cmpKind == CMP_GREATER_THAN) - cmpKind = CMP_LESS_THAN; - else if (cmpKind == CMP_LESS_THAN) - cmpKind = CMP_GREATER_THAN; + if ((hasLevitateAbility || isFlyingType) && !IsMonBannedFromSkyBattles(species)) + return TRUE; + } + return FALSE; +} - if (cmpTo == MIN_STAT_STAGE) - cmpTo = MAX_STAT_STAGE; - else if (cmpTo == MAX_STAT_STAGE) - cmpTo = MIN_STAT_STAGE; +bool8 IsMonBannedFromSkyBattles(u16 species) +{ + switch (species) + { +#if B_SKY_BATTLE_STRICT_ELIGIBILITY == TRUE + case SPECIES_SPEAROW: + case SPECIES_FARFETCHD: + case SPECIES_DODUO: + case SPECIES_DODRIO: + case SPECIES_HOOTHOOT: + case SPECIES_NATU: + case SPECIES_MURKROW: + case SPECIES_DELIBIRD: + case SPECIES_TAILLOW: + case SPECIES_STARLY: + case SPECIES_CHATOT: + case SPECIES_SHAYMIN: + case SPECIES_PIDOVE: + case SPECIES_ARCHEN: + case SPECIES_DUCKLETT: + case SPECIES_RUFFLET: + case SPECIES_VULLABY: + case SPECIES_FLETCHLING: + case SPECIES_HAWLUCHA: + case SPECIES_ROWLET: + case SPECIES_PIKIPEK: +#endif + case SPECIES_EGG: + return TRUE; + default: + return FALSE; } +} - switch (cmpKind) +void GetBattlerTypes(u32 battler, bool32 ignoreTera, enum Type types[static 3]) +{ + // Terastallization. + bool32 isTera = GetActiveGimmick(battler) == GIMMICK_TERA; + if (!ignoreTera && isTera) { - case CMP_EQUAL: - if (statValue == cmpTo) - ret = TRUE; - break; - case CMP_NOT_EQUAL: - if (statValue != cmpTo) - ret = TRUE; - break; - case CMP_GREATER_THAN: - if (statValue > cmpTo) - ret = TRUE; - break; - case CMP_LESS_THAN: - if (statValue < cmpTo) - ret = TRUE; - break; - case CMP_COMMON_BITS: - if (statValue & cmpTo) - ret = TRUE; - break; - case CMP_NO_COMMON_BITS: - if (!(statValue & cmpTo)) - ret = TRUE; - break; + enum Type teraType = GetBattlerTeraType(battler); + if (teraType != TYPE_STELLAR) + { + types[0] = types[1] = types[2] = teraType; + return; + } } - return ret; + types[0] = gBattleMons[battler].types[0]; + types[1] = gBattleMons[battler].types[1]; + types[2] = gBattleMons[battler].types[2]; + + // Roost. + if (!isTera && gDisableStructs[battler].roostActive) + { + if (types[0] == TYPE_FLYING && types[1] == TYPE_FLYING) + types[0] = types[1] = B_ROOST_PURE_FLYING >= GEN_5 ? TYPE_NORMAL : TYPE_MYSTERY; + else if (types[0] == TYPE_FLYING) + types[0] = TYPE_MYSTERY; + else if (types[1] == TYPE_FLYING) + types[1] = TYPE_MYSTERY; + } } -void BufferStatChange(u32 battler, u8 statId, enum StringID stringId) +enum Type GetBattlerType(u32 battler, u32 typeIndex, bool32 ignoreTera) { - bool32 hasContrary = (GetBattlerAbility(battler) == ABILITY_CONTRARY); + enum Type types[3]; + GetBattlerTypes(battler, ignoreTera, types); + return types[typeIndex]; +} - PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); - if (stringId == STRINGID_STATFELL) - { - if (hasContrary) - PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE) - else - PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATFELL) - } - else if (stringId == STRINGID_STATROSE) - { - if (hasContrary) - PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATFELL) - else - PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE) - } - else +void RemoveBattlerType(u32 battler, enum Type type) +{ + u32 i; + if (GetActiveGimmick(battler) == GIMMICK_TERA) // don't remove type if Terastallized + return; + for (i = 0; i < 3; i++) { - PREPARE_STRING_BUFFER(gBattleTextBuff2, stringId) + if (*(u8 *)(&gBattleMons[battler].types[0] + i) == type) + *(u8 *)(&gBattleMons[battler].types[0] + i) = TYPE_MYSTERY; } } -bool32 TryRoomService(u32 battler) +void SetShellSideArmCategory(void) { - if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && CompareStat(battler, STAT_SPEED, MIN_STAT_STAGE, CMP_GREATER_THAN)) - { - BufferStatChange(battler, STAT_SPEED, STRINGID_STATFELL); - gEffectBattler = gBattleScripting.battler = battler; - SET_STATCHANGER(STAT_SPEED, 1, TRUE); - gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + STAT_SPEED; - gBattleScripting.animArg2 = 0; - gLastUsedItem = gBattleMons[battler].item; - return TRUE; - } - else + u32 battlerAtk, battlerDef; + u32 attackerAtkStat; + u32 targetDefStat; + u32 attackerSpAtkStat; + u32 targetSpDefStat; + u8 statStage; + u32 physical; + u32 special; + u32 power = GetMovePower(MOVE_SHELL_SIDE_ARM); + + // Don't run this check for Safari Battles. Because player's stats are zeroed out, this performs division by zero which previously would crash on certain emulators in Safari Zone. + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + return; + + for (battlerAtk = 0; battlerAtk < gBattlersCount; battlerAtk++) { - return FALSE; + attackerAtkStat = gBattleMons[battlerAtk].attack; + statStage = gBattleMons[battlerAtk].statStages[STAT_ATK]; + attackerAtkStat *= gStatStageRatios[statStage][0]; + attackerAtkStat /= gStatStageRatios[statStage][1]; + + attackerSpAtkStat = gBattleMons[battlerAtk].spAttack; + statStage = gBattleMons[battlerAtk].statStages[STAT_SPATK]; + attackerSpAtkStat *= gStatStageRatios[statStage][0]; + attackerSpAtkStat /= gStatStageRatios[statStage][1]; + + for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + { + if (battlerAtk == battlerDef) + continue; + + targetDefStat = gBattleMons[battlerDef].defense; + statStage = gBattleMons[battlerDef].statStages[STAT_DEF]; + targetDefStat *= gStatStageRatios[statStage][0]; + targetDefStat /= gStatStageRatios[statStage][1]; + if (targetDefStat == 0) + targetDefStat = 1; + + physical = ((((2 * gBattleMons[battlerAtk].level / 5 + 2) * power * attackerAtkStat) / targetDefStat) / 50); + + targetSpDefStat = gBattleMons[battlerDef].spDefense; + statStage = gBattleMons[battlerDef].statStages[STAT_SPDEF]; + targetSpDefStat *= gStatStageRatios[statStage][0]; + targetSpDefStat /= gStatStageRatios[statStage][1]; + if (targetSpDefStat == 0) + targetSpDefStat = 1; + + special = ((((2 * gBattleMons[battlerAtk].level / 5 + 2) * power * attackerSpAtkStat) / targetSpDefStat) / 50); + + if ((physical > special) || (physical == special && RandomPercentage(RNG_SHELL_SIDE_ARM, 50))) + gBattleStruct->shellSideArmCategory[battlerAtk][battlerDef] = DAMAGE_CATEGORY_PHYSICAL; + else + gBattleStruct->shellSideArmCategory[battlerAtk][battlerDef] = DAMAGE_CATEGORY_SPECIAL; + } } } -bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 checkTarget) +bool32 CanTargetPartner(u32 battlerAtk, u32 battlerDef) { - if (B_PRANKSTER_DARK_TYPES < GEN_7) - return FALSE; - if (!gProtectStructs[battlerPrankster].pranksterElevated) - return FALSE; - if (IsBattlerAlly(battlerPrankster, battlerDef)) - return FALSE; - if (checkTarget && (GetBattlerMoveTargetType(battlerPrankster, move) & (MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_DEPENDS))) - return FALSE; - if (!IS_BATTLER_OF_TYPE(battlerDef, TYPE_DARK)) - return FALSE; - if (gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE) - return FALSE; - - return TRUE; + return (IsDoubleBattle() + && IsBattlerAlive(BATTLE_PARTNER(battlerDef)) + && battlerDef != BATTLE_PARTNER(battlerAtk)); } -u16 GetUsedHeldItem(u32 battler) +static inline bool32 DoesBattlerHaveAbilityImmunity(u32 battlerAtk, u32 battlerDef, enum Type moveType) { - return gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)]; + enum Ability abilityDef = GetBattlerAbility(battlerDef); + + return CanAbilityBlockMove(battlerAtk, battlerDef, GetBattlerAbility(battlerAtk), abilityDef, gCurrentMove, CHECK_TRIGGER) + || CanAbilityAbsorbMove(battlerAtk, battlerDef, abilityDef, gCurrentMove, moveType, CHECK_TRIGGER); } -bool32 CantPickupItem(u32 battler) +bool32 TargetFullyImmuneToCurrMove(u32 battlerAtk, u32 battlerDef) { - // Used by RandomUniformExcept() for RNG_PICKUP - if (battler == gBattlerAttacker && (B_PICKUP_WILD < GEN_9 || gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK))) - return TRUE; - return !(IsBattlerAlive(battler) && GetUsedHeldItem(battler) && gBattleStruct->battlerState[battler].canPickupItem); + enum Type moveType = GetBattleMoveType(gCurrentMove); + return ((CalcTypeEffectivenessMultiplierHelper(gCurrentMove, moveType, battlerAtk, battlerDef, GetBattlerAbility(battlerAtk), GetBattlerAbility(battlerDef), FALSE) == UQ_4_12(0.0)) + || IsBattlerProtected(battlerAtk, battlerDef, gCurrentMove) + || !BreaksThroughSemiInvulnerablity(battlerDef, gCurrentMove) + || DoesBattlerHaveAbilityImmunity(battlerAtk, battlerDef, moveType)); } -bool32 PickupHasValidTarget(u32 battler) +enum Type GetBattleMoveType(u32 move) { - u32 i; - for (i = 0; i < gBattlersCount; i++) - { - if (!CantPickupItem(i)) - return TRUE; - } - return FALSE; + if (gMain.inBattle && gBattleStruct->dynamicMoveType) + return gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK; + else if (B_UPDATED_MOVE_TYPES < GEN_5 + && (move == MOVE_BEAT_UP + || move == MOVE_FUTURE_SIGHT + || move == MOVE_DOOM_DESIRE)) + return TYPE_MYSTERY; + return GetMoveType(move); } -bool32 IsBattlerWeatherAffected(u32 battler, u32 weatherFlags) +void TryActivateSleepClause(u32 battler, u32 indexInParty) { - if (gBattleWeather & weatherFlags && HasWeatherEffect()) + if (gBattleStruct->battlerState[battler].sleepClauseEffectExempt) { - // given weather is active -> check if its sun, rain against utility umbrella (since only 1 weather can be active at once) - if (gBattleWeather & (B_WEATHER_SUN | B_WEATHER_RAIN) && GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA) - return FALSE; // utility umbrella blocks sun, rain effects - - return TRUE; + gBattleStruct->battlerState[battler].sleepClauseEffectExempt = FALSE; + return; } - return FALSE; + + if (IsSleepClauseEnabled()) + gBattleStruct->monCausingSleepClause[GetBattlerSide(battler)] = indexInParty; } -// Gets move target before redirection effects etc. are applied -// Possible return values are defined in battle.h following MOVE_TARGET_SELECTED -u32 GetBattlerMoveTargetType(u32 battler, u32 move) +void TryDeactivateSleepClause(u32 battlerSide, u32 indexInParty) { - enum BattleMoveEffects effect = GetMoveEffect(move); - if (effect == EFFECT_CURSE && !IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) - return MOVE_TARGET_USER; - if (effect == EFFECT_EXPANDING_FORCE && IsBattlerTerrainAffected(battler, STATUS_FIELD_PSYCHIC_TERRAIN)) - return MOVE_TARGET_BOTH; - if (effect == EFFECT_TERA_STARSTORM && gBattleMons[battler].species == SPECIES_TERAPAGOS_STELLAR) - return MOVE_TARGET_BOTH; - - return GetMoveTarget(move); + // If the pokemon on the given side at the given index in the party is the one causing Sleep Clause to be active, + // set monCausingSleepClause[battlerSide] = PARTY_SIZE, which means Sleep Clause is not active for the given side + if (IsSleepClauseEnabled() && gBattleStruct->monCausingSleepClause[battlerSide] == indexInParty) + gBattleStruct->monCausingSleepClause[battlerSide] = PARTY_SIZE; } -bool32 CanTargetBattler(u32 battlerAtk, u32 battlerDef, u16 move) +bool32 IsSleepClauseActiveForSide(u32 battlerSide) { - if (GetMoveEffect(move) == EFFECT_HIT_ENEMY_HEAL_ALLY - && IsBattlerAlly(battlerAtk, battlerDef) - && gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK) - return FALSE; // PokΓ©mon affected by Heal Block cannot target allies with Pollen Puff - if (IsBattlerAlly(battlerAtk, battlerDef) && (GetActiveGimmick(battlerAtk) == GIMMICK_DYNAMAX - || IsGimmickSelected(battlerAtk, GIMMICK_DYNAMAX))) - return FALSE; + // If monCausingSleepClause[battlerSide] == PARTY_SIZE, Sleep Clause is not active for the given side. + // If monCausingSleepClause[battlerSide] < PARTY_SIZE, it means it is storing the index of the mon that is causing Sleep Clause to be active, + // from which it follows that Sleep Clause is active. + return (IsSleepClauseEnabled() && (gBattleStruct->monCausingSleepClause[battlerSide] < PARTY_SIZE)); +} - return TRUE; +bool32 IsSleepClauseEnabled() +{ + if (B_SLEEP_CLAUSE) + return TRUE; + if (FlagGet(B_FLAG_SLEEP_CLAUSE)) + return TRUE; + return FALSE; } -static void SetRandomMultiHitCounter() +void ClearDamageCalcResults(void) { - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LOADED_DICE) - gMultiHitCounter = RandomUniform(RNG_LOADED_DICE, 4, 5); - else if (GetGenConfig(GEN_CONFIG_MULTI_HIT_CHANCE) >= GEN_5) - gMultiHitCounter = RandomWeighted(RNG_HITS, 0, 0, 7, 7, 3, 3); // 35%: 2 hits, 35%: 3 hits, 15% 4 hits, 15% 5 hits. + for (u32 battler = 0; battler < MAX_BATTLERS_COUNT; battler++) + { + gBattleStruct->moveDamage[battler] = 0; + gBattleStruct->critChance[battler] = 0; + gBattleStruct->moveResultFlags[battler] = 0; + gBattleStruct->noResultString[battler] = CAN_DAMAGE; + gBattleStruct->missStringId[battler] = 0; + gSpecialStatuses[battler].criticalHit = FALSE; + } + + gBattleStruct->doneDoublesSpreadHit = FALSE; + gBattleStruct->calculatedDamageDone = FALSE; + gBattleStruct->calculatedSpreadMoveAccuracy = FALSE; + gBattleStruct->printedStrongWindsWeakenedAttack = FALSE; + gBattleStruct->numSpreadTargets = 0; + gBattleScripting.savedDmg = 0; + if (gCurrentMove != MOVE_NONE) + gBattleStruct->moldBreakerActive = IsMoldBreakerTypeAbility(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker)) || MoveIgnoresTargetAbility(gCurrentMove); else - gMultiHitCounter = RandomWeighted(RNG_HITS, 0, 0, 3, 3, 1, 1); // 37.5%: 2 hits, 37.5%: 3 hits, 12.5% 4 hits, 12.5% 5 hits. + gBattleStruct->moldBreakerActive = FALSE; } -void CopyMonLevelAndBaseStatsToBattleMon(u32 battler, struct Pokemon *mon) +bool32 DoesDestinyBondFail(u32 battler) { - gBattleMons[battler].level = GetMonData(mon, MON_DATA_LEVEL); - gBattleMons[battler].hp = GetMonData(mon, MON_DATA_HP); - gBattleMons[battler].maxHP = GetMonData(mon, MON_DATA_MAX_HP); - gBattleMons[battler].attack = GetMonData(mon, MON_DATA_ATK); - gBattleMons[battler].defense = GetMonData(mon, MON_DATA_DEF); - gBattleMons[battler].speed = GetMonData(mon, MON_DATA_SPEED); - gBattleMons[battler].spAttack = GetMonData(mon, MON_DATA_SPATK); - gBattleMons[battler].spDefense = GetMonData(mon, MON_DATA_SPDEF); + return GetConfig(CONFIG_DESTINY_BOND_FAIL) >= GEN_7 && gBattleMons[battler].volatiles.destinyBond; } -void CopyMonAbilityAndTypesToBattleMon(u32 battler, struct Pokemon *mon) +// This check has always to be the last in a condtion statement because of the recording of AI data. +bool32 IsMoveEffectBlockedByTarget(enum Ability ability) { - gBattleMons[battler].ability = GetMonAbility(mon); - gBattleMons[battler].types[0] = gSpeciesInfo[gBattleMons[battler].species].types[0]; - gBattleMons[battler].types[1] = gSpeciesInfo[gBattleMons[battler].species].types[1]; - gBattleMons[battler].types[2] = TYPE_MYSTERY; + if (ability == ABILITY_SHIELD_DUST) + { + RecordAbilityBattle(gBattlerTarget, ability); + return TRUE; + } + else if (GetBattlerHoldEffect(gBattlerTarget) == HOLD_EFFECT_COVERT_CLOAK) + { + RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_COVERT_CLOAK); + return TRUE; + } + + return FALSE; } -void RecalcBattlerStats(u32 battler, struct Pokemon *mon, bool32 isDynamaxing) +bool32 IsPursuitTargetSet(void) { - u32 hp = GetMonData(mon, MON_DATA_HP); - u32 oldMaxHp = GetMonData(mon, MON_DATA_MAX_HP); - CalculateMonStats(mon); - if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX && gChosenActionByBattler[battler] != B_ACTION_SWITCH) + for (u32 battler = 0; battler < gBattlersCount; battler++) { - ApplyDynamaxHPMultiplier(mon); - u32 newMaxHp = GetMonData(mon, MON_DATA_MAX_HP); - if (!isDynamaxing) - { - if (newMaxHp > oldMaxHp) // restore hp gained from changing form, without this, dynamaxed form changes are calculated incorrectly - { - hp += (newMaxHp - oldMaxHp); - SetMonData(mon, MON_DATA_HP, &hp); - } - else - { - SetMonData(mon, MON_DATA_HP, &hp); - } - } + if (gBattleStruct->battlerState[battler].pursuitTarget) + return TRUE; } - CopyMonLevelAndBaseStatsToBattleMon(battler, mon); - CopyMonAbilityAndTypesToBattleMon(battler, mon); + return FALSE; +} + +void ClearPursuitValues(void) +{ + for (u32 i = 0; i < gBattlersCount; i++) + gBattleStruct->battlerState[i].pursuitTarget = FALSE; + gBattleStruct->pursuitStoredSwitch = PARTY_SIZE; } -void RemoveConfusionStatus(u32 battler) +void ClearPursuitValuesIfSet(u32 battler) { - gBattleMons[battler].status2 &= ~STATUS2_CONFUSION; - gStatuses4[battler] &= ~STATUS4_INFINITE_CONFUSION; + if (gBattleStruct->battlerState[battler].pursuitTarget) + ClearPursuitValues(); } -static bool32 CanBeInfinitelyConfused(u32 battler) +bool32 HasWeatherEffect(void) { - if (GetBattlerAbility(battler) == ABILITY_OWN_TEMPO - || IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN) - || gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD) + for (u32 battler = 0; battler < gBattlersCount; battler++) { - return FALSE; + if (!IsBattlerAlive(battler)) + continue; + + enum Ability ability = GetBattlerAbility(battler); + switch (ability) + { + case ABILITY_CLOUD_NINE: + case ABILITY_AIR_LOCK: + return FALSE; + default: + break; + } } + return TRUE; } -u8 GetBattlerGender(u32 battler) +void UpdateStallMons(void) { - return GetGenderFromSpeciesAndPersonality(gBattleMons[battler].species, - gBattleMons[battler].personality); + if (IsBattlerTurnDamaged(gBattlerTarget) || IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove) || GetMoveCategory(gCurrentMove) == DAMAGE_CATEGORY_STATUS) + return; + if (!IsDoubleBattle() || GetMoveTarget(gCurrentMove) == MOVE_TARGET_SELECTED) + { + enum Type moveType = GetBattleMoveType(gCurrentMove); // Probably doesn't handle dynamic move types right now + enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); + enum Ability abilityDef = GetBattlerAbility(gBattlerTarget); + if (CanAbilityAbsorbMove(gBattlerAttacker, gBattlerTarget, abilityDef, gCurrentMove, moveType, CHECK_TRIGGER)) + { + gAiBattleData->playerStallMons[gBattlerPartyIndexes[gBattlerTarget]]++; + } + else if (CanAbilityBlockMove(gBattlerAttacker, gBattlerTarget, abilityAtk, abilityDef, gCurrentMove, CHECK_TRIGGER)) + { + gAiBattleData->playerStallMons[gBattlerPartyIndexes[gBattlerTarget]]++; + } + else if (AI_GetMoveEffectiveness(gCurrentMove, gBattlerAttacker, gBattlerTarget) == 0) + { + gAiBattleData->playerStallMons[gBattlerPartyIndexes[gBattlerTarget]]++; + } + } + // Handling for moves that target multiple opponents in doubles not handled currently } -bool32 AreBattlersOfOppositeGender(u32 battler1, u32 battler2) +bool32 TrySwitchInEjectPack(enum EjectPackTiming timing) { - u8 gender1 = GetBattlerGender(battler1); - u8 gender2 = GetBattlerGender(battler2); + // Because sorting the battlers by speed takes lots of cycles, it's better to just check if any of the battlers has the Eject items. + u32 ejectPackBattlers = 0; + u32 numEjectPackBattlers = 0; - return (gender1 != MON_GENDERLESS && gender2 != MON_GENDERLESS && gender1 != gender2); -} + for (u32 i = 0; i < gBattlersCount; i++) + { + if (gDisableStructs[i].tryEjectPack + && GetBattlerHoldEffect(i) == HOLD_EFFECT_EJECT_PACK + && IsBattlerAlive(i) + && CountUsablePartyMons(i) > 0) + { + ejectPackBattlers |= 1u << i; + numEjectPackBattlers++; + } + } -bool32 AreBattlersOfSameGender(u32 battler1, u32 battler2) -{ - u8 gender1 = GetBattlerGender(battler1); - u8 gender2 = GetBattlerGender(battler2); + if (numEjectPackBattlers == 0) + return FALSE; - return (gender1 != MON_GENDERLESS && gender2 != MON_GENDERLESS && gender1 == gender2); -} + u8 battlers[4] = {0, 1, 2, 3}; + if (numEjectPackBattlers > 1) + SortBattlersBySpeed(battlers, FALSE); -u32 CalcSecondaryEffectChance(u32 battler, u32 battlerAbility, const struct AdditionalEffect *additionalEffect) -{ - bool8 hasSereneGrace = (battlerAbility == ABILITY_SERENE_GRACE); - bool8 hasRainbow = (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_RAINBOW) != 0; - u16 secondaryEffectChance = additionalEffect->chance; + for (u32 i = 0; i < gBattlersCount; i++) + gDisableStructs[i].tryEjectPack = FALSE; - if (hasRainbow && hasSereneGrace && additionalEffect->moveEffect == MOVE_EFFECT_FLINCH) - return secondaryEffectChance * 2; + for (u32 i = 0; i < gBattlersCount; i++) + { + u32 battler = battlers[i]; - if (hasSereneGrace) - secondaryEffectChance *= 2; - if (hasRainbow && additionalEffect->moveEffect != MOVE_EFFECT_SECRET_POWER) - secondaryEffectChance *= 2; + if (!(ejectPackBattlers & 1u << battler)) + continue; - return secondaryEffectChance; -} + gBattleScripting.battler = battler; + gLastUsedItem = gBattleMons[battler].item; + if (timing == FIRST_TURN) + BattleScriptPushCursorAndCallback(BattleScript_EjectPackActivate_End3); + else if (timing == END_TURN) + BattleScriptExecute(BattleScript_EjectPackActivate_End2); + else + BattleScriptCall(BattleScript_EjectPackActivate_Ret); + gAiLogicData->ejectPackSwitch = TRUE; + return TRUE; + } -bool32 MoveEffectIsGuaranteed(u32 battler, u32 battlerAbility, const struct AdditionalEffect *additionalEffect) -{ - return additionalEffect->chance == 0 || CalcSecondaryEffectChance(battler, battlerAbility, additionalEffect) >= 100; + return FALSE; } -bool32 IsGen6ExpShareEnabled(void) -{ - if (I_EXP_SHARE_FLAG <= TEMP_FLAGS_END) - return FALSE; +#define UNPACK_VOLATILE_GETTERS(_enum, _fieldName, _typeMaxValue, ...) case _enum: return gBattleMons[battler].volatiles._fieldName; - return FlagGet(I_EXP_SHARE_FLAG); +// Gets the value of a volatile status flag for a certain battler +// Primarily used for the debug menu and scripts. Outside of it explicit references are preferred +u32 GetBattlerVolatile(u32 battler, enum Volatile _volatile) +{ + switch (_volatile) + { + VOLATILE_DEFINITIONS(UNPACK_VOLATILE_GETTERS) + /* Expands to: + case VOLATILE_CONFUSION: + return gBattleMons[battler].volatiles.confusionTurns; + */ + default: // Invalid volatile status + return 0; + } } +#define UNPACK_VOLATILE_SETTERS(_enum, _fieldName, _typeMaxValue, ...) case _enum: gBattleMons[battler].volatiles._fieldName = min(GET_VOLATILE_MAXIMUM(_typeMaxValue), newValue); break; -bool32 MoveHasAdditionalEffect(u32 move, u32 moveEffect) +// Sets the value of a volatile status flag for a certain battler +// Primarily used for the debug menu and scripts. Outside of it explicit references are preferred +void SetMonVolatile(u32 battler, enum Volatile _volatile, u32 newValue) { - u32 i; - u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); - for (i = 0; i < numAdditionalEffects; i++) + switch (_volatile) { - const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); - if (additionalEffect->moveEffect == moveEffect && additionalEffect->self == FALSE) - return TRUE; + VOLATILE_DEFINITIONS(UNPACK_VOLATILE_SETTERS) + /* Expands to: + case VOLATILE_CONFUSION: + gBattleMons[battler].volatiles.confusionTurns = min(MAX_BITS(3), newValue); + break; + */ + default: // Invalid volatile status + return; } - return FALSE; } -bool32 MoveHasAdditionalEffectWithChance(u32 move, u32 moveEffect, u32 chance) +bool32 ItemHealMonVolatile(u32 battler, u16 itemId) { - u32 i; - u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); - for (i = 0; i < numAdditionalEffects; i++) + bool32 statusChanged = FALSE; + const u8 *effect = GetItemEffect(itemId); + if (effect[3] & ITEM3_STATUS_ALL) { - const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); - if (additionalEffect->moveEffect == moveEffect && additionalEffect->chance == chance) - return TRUE; + statusChanged = (gBattleMons[battler].volatiles.infatuation || gBattleMons[battler].volatiles.confusionTurns > 0 || gBattleMons[battler].volatiles.infiniteConfusion); + gBattleMons[battler].volatiles.infatuation = 0; + gBattleMons[battler].volatiles.confusionTurns = 0; + gBattleMons[battler].volatiles.infiniteConfusion = FALSE; } - return FALSE; + else if (effect[0] & ITEM0_INFATUATION) + { + statusChanged = !!gBattleMons[battler].volatiles.infatuation; + gBattleMons[battler].volatiles.infatuation = 0; + } + else if (effect[3] & ITEM3_CONFUSION) + { + statusChanged = (gBattleMons[battler].volatiles.confusionTurns > 0 || gBattleMons[battler].volatiles.infiniteConfusion); + gBattleMons[battler].volatiles.confusionTurns = 0; + gBattleMons[battler].volatiles.infiniteConfusion = FALSE; + } + + return statusChanged; } -bool32 MoveHasAdditionalEffectSelf(u32 move, u32 moveEffect) +// Hazards are added to a queue and applied based in order (FIFO) +void PushHazardTypeToQueue(u32 side, enum Hazards hazardType) { - u32 i; - u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); - for (i = 0; i < numAdditionalEffects; i++) + if (!IsHazardOnSide(side, hazardType)) // Failsafe + gBattleStruct->hazardsQueue[side][gBattleStruct->numHazards[side]++] = hazardType; +} + +bool32 IsHazardOnSide(u32 side, enum Hazards hazardType) +{ + for (u32 i = 0; i < HAZARDS_MAX_COUNT; i++) { - const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); - if (additionalEffect->moveEffect == moveEffect && additionalEffect->self == TRUE) + if (gBattleStruct->hazardsQueue[side][i] == hazardType) return TRUE; } return FALSE; } -bool32 IsMoveEffectRemoveSpeciesType(u32 move, u32 moveEffect, u32 argument) +bool32 AreAnyHazardsOnSide(u32 side) { - return (GetMoveArgType(move) == argument) && MoveHasAdditionalEffectSelf(move, moveEffect); + return gBattleStruct->numHazards[side] > 0; } -bool32 MoveHasChargeTurnAdditionalEffect(u32 move) +bool32 IsHazardOnSideAndClear(u32 side, enum Hazards hazardType) { - u32 i; - u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); - for (i = 0; i < numAdditionalEffects; i++) + for (u32 i = 0; i < HAZARDS_MAX_COUNT; i++) { - if (GetMoveAdditionalEffectById(move, i)->onChargeTurnOnly) + if (gBattleStruct->hazardsQueue[side][i] == hazardType) + { + gBattleStruct->hazardsQueue[side][i] = HAZARDS_NONE; + if (hazardType == HAZARDS_SPIKES) + gSideTimers[side].spikesAmount = 0; + else if (hazardType == HAZARDS_TOXIC_SPIKES) + gSideTimers[side].toxicSpikesAmount = 0; return TRUE; + } } return FALSE; } -bool32 MoveIsAffectedBySheerForce(u32 move) +void RemoveAllHazardsFromField(u32 side) +{ + gSideTimers[side].spikesAmount = 0; + gSideTimers[side].toxicSpikesAmount = 0; + gBattleStruct->numHazards[side] = 0; + for (u32 i = 0; i < HAZARDS_MAX_COUNT; i++) + gBattleStruct->hazardsQueue[side][i] = HAZARDS_NONE; +} + +void RemoveHazardFromField(u32 side, enum Hazards hazardType) { u32 i; - u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); - for (i = 0; i < numAdditionalEffects; i++) + for (i = 0; i < HAZARDS_MAX_COUNT; i++) { - const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); - if (additionalEffect->sheerForceBoost == SHEER_FORCE_NO_BOOST) - continue; - - if (additionalEffect->chance > 0) - return TRUE; - if (additionalEffect->sheerForceBoost == SHEER_FORCE_BOOST) - return TRUE; + if (gBattleStruct->hazardsQueue[side][i] == hazardType) + { + gBattleStruct->hazardsQueue[side][i] = HAZARDS_NONE; + gBattleStruct->numHazards[side]--; + if (hazardType == HAZARDS_SPIKES) + gSideTimers[side].spikesAmount = 0; + else if (hazardType == HAZARDS_TOXIC_SPIKES) + gSideTimers[side].toxicSpikesAmount = 0; + break; + } + } + while (i < HAZARDS_MAX_COUNT) + { + if (i+1 == HAZARDS_MAX_COUNT) + { + gBattleStruct->hazardsQueue[side][i] = HAZARDS_NONE; + break; + } + gBattleStruct->hazardsQueue[side][i] = gBattleStruct->hazardsQueue[side][i+1]; + i++; } - return FALSE; } -bool8 CanMonParticipateInSkyBattle(struct Pokemon *mon) +bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, u32 move, enum FunctionCallOption option) { - u16 species = GetMonData(mon, MON_DATA_SPECIES); - u16 monAbilityNum = GetMonData(mon, MON_DATA_ABILITY_NUM, NULL); - - bool8 hasLevitateAbility = gSpeciesInfo[species].abilities[monAbilityNum] == ABILITY_LEVITATE; - bool8 isFlyingType = gSpeciesInfo[species].types[0] == TYPE_FLYING || gSpeciesInfo[species].types[1] == TYPE_FLYING; - bool8 monIsValidAndNotEgg = GetMonData(mon, MON_DATA_SANITY_HAS_SPECIES) && !GetMonData(mon, MON_DATA_IS_EGG); + bool32 effect = FALSE; + enum Ability ability = ABILITY_NONE; + enum BattleMoveEffects moveEffect = GetMoveEffect(move); + u32 nonVolatileStatus = GetMoveNonVolatileStatus(move); - if (monIsValidAndNotEgg) + if ((gBattleMons[battlerDef].volatiles.lockOn && gDisableStructs[battlerDef].battlerWithSureHit == battlerAtk) + || (GetConfig(CONFIG_TOXIC_NEVER_MISS) >= GEN_6 && nonVolatileStatus == MOVE_EFFECT_TOXIC && IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON)) + || gBattleMons[battlerDef].volatiles.glaiveRush) { - if ((hasLevitateAbility || isFlyingType) && !IsMonBannedFromSkyBattles(species)) - return TRUE; + effect = TRUE; } - return FALSE; -} - -bool8 IsMonBannedFromSkyBattles(u16 species) -{ - switch (species) + // If the attacker has the ability No Guard and they aren't targeting a Pokemon involved in a Sky Drop with the move Sky Drop, move hits. + else if (abilityAtk == ABILITY_NO_GUARD + && gBattleMons[battlerDef].volatiles.semiInvulnerable != STATE_COMMANDER + && (moveEffect != EFFECT_SKY_DROP || gBattleStruct->skyDropTargets[battlerDef] == SKY_DROP_NO_TARGET)) { -#if B_SKY_BATTLE_STRICT_ELIGIBILITY == TRUE - case SPECIES_SPEAROW: - case SPECIES_FARFETCHD: - case SPECIES_DODUO: - case SPECIES_DODRIO: - case SPECIES_HOOTHOOT: - case SPECIES_NATU: - case SPECIES_MURKROW: - case SPECIES_DELIBIRD: - case SPECIES_TAILLOW: - case SPECIES_STARLY: - case SPECIES_CHATOT: - case SPECIES_SHAYMIN: - case SPECIES_PIDOVE: - case SPECIES_ARCHEN: - case SPECIES_DUCKLETT: - case SPECIES_RUFFLET: - case SPECIES_VULLABY: - case SPECIES_FLETCHLING: - case SPECIES_HAWLUCHA: - case SPECIES_ROWLET: - case SPECIES_PIKIPEK: -#endif - case SPECIES_EGG: - return TRUE; - default: - return FALSE; + effect = TRUE; + ability = ABILITY_NO_GUARD; } -} - -void GetBattlerTypes(u32 battler, bool32 ignoreTera, u32 types[static 3]) -{ - // Terastallization. - bool32 isTera = GetActiveGimmick(battler) == GIMMICK_TERA; - if (!ignoreTera && isTera) + // If the target has the ability No Guard and they aren't involved in a Sky Drop or the current move isn't Sky Drop, move hits. + else if (abilityDef == ABILITY_NO_GUARD + && (moveEffect != EFFECT_SKY_DROP || gBattleStruct->skyDropTargets[battlerDef] == SKY_DROP_NO_TARGET)) { - u32 teraType = GetBattlerTeraType(battler); - if (teraType != TYPE_STELLAR) + effect = TRUE; + ability = ABILITY_NO_GUARD; + } + // If the target is under the effects of Telekinesis, and the move isn't a OH-KO move, move hits. + else if (gBattleMons[battlerDef].volatiles.telekinesis + && !IsSemiInvulnerable(battlerDef, CHECK_ALL) + && moveEffect != EFFECT_OHKO + && moveEffect != EFFECT_SHEER_COLD) + { + effect = TRUE; + } + else if (gBattleStruct->battlerState[battlerDef].pursuitTarget) + { + effect = TRUE; + } + else if (GetActiveGimmick(battlerAtk) == GIMMICK_Z_MOVE && !IsSemiInvulnerable(battlerDef, CHECK_ALL)) + { + effect = TRUE; + } + else if (!BreaksThroughSemiInvulnerablity(battlerDef, move)) + { + if (option == RUN_SCRIPT) { - types[0] = types[1] = types[2] = teraType; - return; + gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_MISSED; + effect = TRUE; + } + else + { + effect = FALSE; } } + else if (B_MINIMIZE_DMG_ACC >= GEN_6 + && gBattleMons[battlerDef].volatiles.minimize + && MoveIncreasesPowerToMinimizedTargets(move)) + { + effect = TRUE; + } + else if (GetMoveAccuracy(move) == 0) + { + effect = TRUE; + } - types[0] = gBattleMons[battler].types[0]; - types[1] = gBattleMons[battler].types[1]; - types[2] = gBattleMons[battler].types[2]; - - // Roost. - if (!isTera && gDisableStructs[battler].roostActive) + if (!effect && HasWeatherEffect()) { - if (types[0] == TYPE_FLYING && types[1] == TYPE_FLYING) - types[0] = types[1] = B_ROOST_PURE_FLYING >= GEN_5 ? TYPE_NORMAL : TYPE_MYSTERY; - else if (types[0] == TYPE_FLYING) - types[0] = TYPE_MYSTERY; - else if (types[1] == TYPE_FLYING) - types[1] = TYPE_MYSTERY; + if (MoveAlwaysHitsInRain(move) && IsBattlerWeatherAffected(battlerDef, B_WEATHER_RAIN)) + effect = TRUE; + else if ((gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) && MoveAlwaysHitsInHailSnow(move)) + effect = TRUE; + + if (effect) + return effect; } + + if (ability != ABILITY_NONE && option == RUN_SCRIPT) + RecordAbilityBattle(battlerAtk, ABILITY_NO_GUARD); + + return effect; } -u32 GetBattlerType(u32 battler, u32 typeIndex, bool32 ignoreTera) +u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability atkAbility, enum Ability defAbility, enum HoldEffect atkHoldEffect, enum HoldEffect defHoldEffect) { - u32 types[3]; - GetBattlerTypes(battler, ignoreTera, types); - return types[typeIndex]; -} + u32 calc, moveAcc; + s8 buff, accStage, evasionStage; + u32 atkParam = GetBattlerHoldEffectParam(battlerAtk); + u32 defParam = GetBattlerHoldEffectParam(battlerDef); + + gPotentialItemEffectBattler = battlerDef; + accStage = gBattleMons[battlerAtk].statStages[STAT_ACC]; + evasionStage = gBattleMons[battlerDef].statStages[STAT_EVASION]; + if (atkAbility == ABILITY_UNAWARE || atkAbility == ABILITY_KEEN_EYE || atkAbility == ABILITY_MINDS_EYE + || (GetConfig(CONFIG_ILLUMINATE_EFFECT) >= GEN_9 && atkAbility == ABILITY_ILLUMINATE)) + evasionStage = DEFAULT_STAT_STAGE; + if (MoveIgnoresDefenseEvasionStages(move)) + evasionStage = DEFAULT_STAT_STAGE; + if (defAbility == ABILITY_UNAWARE) + accStage = DEFAULT_STAT_STAGE; + + if (gBattleMons[battlerDef].volatiles.foresight || gBattleMons[battlerDef].volatiles.miracleEye) + buff = accStage; + else + buff = accStage + DEFAULT_STAT_STAGE - evasionStage; + + if (buff < MIN_STAT_STAGE) + buff = MIN_STAT_STAGE; + if (buff > MAX_STAT_STAGE) + buff = MAX_STAT_STAGE; + + moveAcc = GetMoveAccuracy(move); + // Check Thunder and Hurricane on sunny weather. + if (IsBattlerWeatherAffected(battlerDef, B_WEATHER_SUN) && MoveHas50AccuracyInSun(move)) + moveAcc = 50; + // Check Wonder Skin. + if (defAbility == ABILITY_WONDER_SKIN && IsBattleMoveStatus(move) && moveAcc > 50) + moveAcc = 50; + + calc = gAccuracyStageRatios[buff].dividend * moveAcc; + calc /= gAccuracyStageRatios[buff].divisor; + + // Attacker's ability + switch (atkAbility) + { + case ABILITY_COMPOUND_EYES: + calc = (calc * 130) / 100; // 1.3 compound eyes boost + break; + case ABILITY_VICTORY_STAR: + calc = (calc * 110) / 100; // 1.1 victory star boost + break; + case ABILITY_HUSTLE: + if (IsBattleMovePhysical(move)) + calc = (calc * 80) / 100; // 1.2 hustle loss + break; + default: + break; + } -void RemoveBattlerType(u32 battler, u8 type) -{ - u32 i; - if (GetActiveGimmick(battler) == GIMMICK_TERA) // don't remove type if Terastallized - return; - for (i = 0; i < 3; i++) + // Target's ability + switch (defAbility) { - if (*(u8 *)(&gBattleMons[battler].types[0] + i) == type) - *(u8 *)(&gBattleMons[battler].types[0] + i) = TYPE_MYSTERY; + case ABILITY_SAND_VEIL: + if (gBattleWeather & B_WEATHER_SANDSTORM && HasWeatherEffect()) + calc = (calc * 80) / 100; // 1.2 sand veil loss + break; + case ABILITY_SNOW_CLOAK: + if ((gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) && HasWeatherEffect()) + calc = (calc * 80) / 100; // 1.2 snow cloak loss + break; + case ABILITY_TANGLED_FEET: + if (gBattleMons[battlerDef].volatiles.confusionTurns) + calc = (calc * 50) / 100; // 1.5 tangled feet loss + break; + default: + break; } -} -void SetShellSideArmCategory(void) -{ - u32 battlerAtk, battlerDef; - u32 attackerAtkStat; - u32 targetDefStat; - u32 attackerSpAtkStat; - u32 targetSpDefStat; - u8 statStage; - u32 physical; - u32 special; - u32 power = GetMovePower(MOVE_SHELL_SIDE_ARM); + // Attacker's ally's ability + u32 atkAlly = BATTLE_PARTNER(battlerAtk); + switch (GetBattlerAbility(atkAlly)) + { + case ABILITY_VICTORY_STAR: + if (IsBattlerAlive(atkAlly)) + calc = (calc * 110) / 100; // 1.1 ally's victory star boost + break; + default: + break; + } - // Don't run this check for Safari Battles. Because player's stats are zeroed out, this performs division by zero which previously would crash on certain emulators in Safari Zone. - if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - return; + // Attacker's hold effect + switch (atkHoldEffect) + { + case HOLD_EFFECT_WIDE_LENS: + calc = (calc * (100 + atkParam)) / 100; + break; + case HOLD_EFFECT_ZOOM_LENS: + if (HasBattlerActedThisTurn(battlerDef)) + calc = (calc * (100 + atkParam)) / 100; + break; + default: + break; + } - for (battlerAtk = 0; battlerAtk < gBattlersCount; battlerAtk++) + // Target's hold effect + switch (defHoldEffect) { - attackerAtkStat = gBattleMons[battlerAtk].attack; - statStage = gBattleMons[battlerAtk].statStages[STAT_ATK]; - attackerAtkStat *= gStatStageRatios[statStage][0]; - attackerAtkStat /= gStatStageRatios[statStage][1]; + case HOLD_EFFECT_EVASION_UP: + calc = (calc * (100 - defParam)) / 100; + break; + default: + break; + } - attackerSpAtkStat = gBattleMons[battlerAtk].spAttack; - statStage = gBattleMons[battlerAtk].statStages[STAT_SPATK]; - attackerSpAtkStat *= gStatStageRatios[statStage][0]; - attackerSpAtkStat /= gStatStageRatios[statStage][1]; + if (gBattleStruct->battlerState[battlerAtk].usedMicleBerry) + { + // TODO: Is this true? + if (atkAbility == ABILITY_RIPEN) + calc = (calc * 140) / 100; // ripen gives 40% acc boost + else + calc = (calc * 120) / 100; // 20% acc boost + } - for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) - { - if (battlerAtk == battlerDef) - continue; + if (gFieldStatuses & STATUS_FIELD_GRAVITY) + calc = (calc * 5) / 3; // 1.66 Gravity acc boost - targetDefStat = gBattleMons[battlerDef].defense; - statStage = gBattleMons[battlerDef].statStages[STAT_DEF]; - targetDefStat *= gStatStageRatios[statStage][0]; - targetDefStat /= gStatStageRatios[statStage][1]; + if (B_AFFECTION_MECHANICS == TRUE && GetBattlerAffectionHearts(battlerDef) == AFFECTION_FIVE_HEARTS) + calc = (calc * 90) / 100; - physical = ((((2 * gBattleMons[battlerAtk].level / 5 + 2) * power * attackerAtkStat) / targetDefStat) / 50); + if (HasWeatherEffect() && gBattleWeather & B_WEATHER_FOG) + calc = (calc * 60) / 100; // modified by 3/5 - targetSpDefStat = gBattleMons[battlerDef].spDefense; - statStage = gBattleMons[battlerDef].statStages[STAT_SPDEF]; - targetSpDefStat *= gStatStageRatios[statStage][0]; - targetSpDefStat /= gStatStageRatios[statStage][1]; + return calc; +} - special = ((((2 * gBattleMons[battlerAtk].level / 5 + 2) * power * attackerSpAtkStat) / targetSpDefStat) / 50); +bool32 IsSemiInvulnerable(u32 battler, enum SemiInvulnerableExclusion excludeCommander) +{ + if (gBattleMons[battler].volatiles.semiInvulnerable == STATE_COMMANDER) + return excludeCommander != EXCLUDE_COMMANDER; + return gBattleMons[battler].volatiles.semiInvulnerable != STATE_NONE; +} - if ((physical > special) || (physical == special && RandomPercentage(RNG_SHELL_SIDE_ARM, 50))) - gBattleStruct->shellSideArmCategory[battlerAtk][battlerDef] = DAMAGE_CATEGORY_PHYSICAL; - else - gBattleStruct->shellSideArmCategory[battlerAtk][battlerDef] = DAMAGE_CATEGORY_SPECIAL; - } +bool32 BreaksThroughSemiInvulnerablity(u32 battler, u32 move) +{ + switch (gBattleMons[battler].volatiles.semiInvulnerable) + { + case STATE_UNDERGROUND: + return MoveDamagesUnderground(move); + case STATE_UNDERWATER: + return MoveDamagesUnderWater(move); + case STATE_ON_AIR: + case STATE_SKY_DROP: + return MoveDamagesAirborne(move) || MoveDamagesAirborneDoubleDamage(move); + case STATE_PHANTOM_FORCE: + return FALSE; + case STATE_COMMANDER: + return FALSE; + case STATE_NONE: + return TRUE; } + + return FALSE; } -bool32 CanTargetPartner(u32 battlerAtk, u32 battlerDef) +bool32 HasPartnerTrainer(u32 battler) { - return (IsDoubleBattle() - && IsBattlerAlive(BATTLE_PARTNER(battlerDef)) - && battlerDef != BATTLE_PARTNER(battlerAtk)); + if ((GetBattlerSide(battler) == B_SIDE_PLAYER && gBattleTypeFlags & BATTLE_TYPE_PLAYER_HAS_PARTNER) + || (GetBattlerSide(battler) == B_SIDE_OPPONENT && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)) + return TRUE; + else + return FALSE; } -static inline bool32 DoesBattlerHaveAbilityImmunity(u32 battlerAtk, u32 battlerDef, u32 moveType) +static bool32 IsOpposingSideEmpty(u32 battler) { - u32 abilityDef = GetBattlerAbility(battlerDef); + u32 oppositeBattler = BATTLE_OPPOSITE(battler); - return CanAbilityBlockMove(battlerAtk, battlerDef, GetBattlerAbility(battlerAtk), abilityDef, gCurrentMove, ABILITY_CHECK_TRIGGER) - || CanAbilityAbsorbMove(battlerAtk, battlerDef, abilityDef, gCurrentMove, moveType, ABILITY_CHECK_TRIGGER); -} + if (IsBattlerAlive(oppositeBattler)) + return FALSE; -bool32 TargetFullyImmuneToCurrMove(u32 battlerAtk, u32 battlerDef) -{ - u32 moveType = GetBattleMoveType(gCurrentMove); - return ((CalcTypeEffectivenessMultiplier(gCurrentMove, moveType, battlerAtk, battlerDef, GetBattlerAbility(battlerDef), FALSE) == UQ_4_12(0.0)) - || IsBattlerProtected(battlerAtk, battlerDef, gCurrentMove) - || IsSemiInvulnerable(battlerDef, gCurrentMove) - || DoesBattlerHaveAbilityImmunity(battlerAtk, battlerDef, moveType)); + if (!IsDoubleBattle()) + return TRUE; + + if (IsBattlerAlive(BATTLE_PARTNER(oppositeBattler))) + return FALSE; + return TRUE; } -u32 GetBattleMoveType(u32 move) +bool32 IsAffectedByPowderMove(u32 battler, u32 ability, enum HoldEffect holdEffect) { - if (gMain.inBattle && gBattleStruct->dynamicMoveType) - return gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK; - else if (B_UPDATED_MOVE_TYPES < GEN_5 - && (move == MOVE_BEAT_UP - || move == MOVE_FUTURE_SIGHT - || move == MOVE_DOOM_DESIRE)) - return TYPE_MYSTERY; - return GetMoveType(move); + if ((GetConfig(CONFIG_POWDER_OVERCOAT) >= GEN_6 && ability == ABILITY_OVERCOAT) + || (GetConfig(CONFIG_POWDER_GRASS) >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GRASS)) + || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES) + return FALSE; + return TRUE; } -void TryActivateSleepClause(u32 battler, u32 indexInParty) +static u32 GetMirrorMoveMove(void) { - if (gBattleStruct->battlerState[battler].sleepClauseEffectExempt) + s32 i, validMovesCount; + u16 move = MOVE_NONE; + u16 validMoves[MAX_BATTLERS_COUNT] = {0}; + + for (validMovesCount = 0, i = 0; i < gBattlersCount; i++) { - gBattleStruct->battlerState[battler].sleepClauseEffectExempt = FALSE; - return; + if (i != gBattlerAttacker) + { + move = gBattleStruct->lastTakenMoveFrom[gBattlerAttacker][i]; + if (move != MOVE_NONE && move != MOVE_UNAVAILABLE) + { + validMoves[validMovesCount] = move; + validMovesCount++; + } + } } - if (IsSleepClauseEnabled()) - gBattleStruct->monCausingSleepClause[GetBattlerSide(battler)] = indexInParty; -} + move = gBattleStruct->lastTakenMove[gBattlerAttacker]; + if ((move == MOVE_NONE || move == MOVE_UNAVAILABLE) && validMovesCount != 0) + move = validMoves[Random() % validMovesCount]; -void TryDeactivateSleepClause(u32 battlerSide, u32 indexInParty) -{ - // If the pokemon on the given side at the given index in the party is the one causing Sleep Clause to be active, - // set monCausingSleepClause[battlerSide] = PARTY_SIZE, which means Sleep Clause is not active for the given side - if (IsSleepClauseEnabled() && gBattleStruct->monCausingSleepClause[battlerSide] == indexInParty) - gBattleStruct->monCausingSleepClause[battlerSide] = PARTY_SIZE; + if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(move)) + move = GetTypeBasedZMove(move); + + return move; } -bool32 IsSleepClauseActiveForSide(u32 battlerSide) +static bool32 InvalidMetronomeMove(u32 move) { - // If monCausingSleepClause[battlerSide] == PARTY_SIZE, Sleep Clause is not active for the given side. - // If monCausingSleepClause[battlerSide] < PARTY_SIZE, it means it is storing the index of the mon that is causing Sleep Clause to be active, - // from which it follows that Sleep Clause is active. - return (IsSleepClauseEnabled() && (gBattleStruct->monCausingSleepClause[battlerSide] < PARTY_SIZE)); + return GetMoveEffect(move) == EFFECT_PLACEHOLDER + || IsMoveMetronomeBanned(move); } -bool32 IsSleepClauseEnabled() +static u32 GetMetronomeMove(void) { - if (B_SLEEP_CLAUSE) - return TRUE; - if (FlagGet(B_FLAG_SLEEP_CLAUSE)) - return TRUE; - return FALSE; + u32 move = MOVE_NONE; + +#if B_METRONOME_MOVES >= GEN_9 + u32 moveCount = MOVES_COUNT_GEN9; +#elif B_METRONOME_MOVES >= GEN_8 + u32 moveCount = MOVES_COUNT_GEN8; +#elif B_METRONOME_MOVES >= GEN_7 + u32 moveCount = MOVES_COUNT_GEN7; +#elif B_METRONOME_MOVES >= GEN_6 + u32 moveCount = MOVES_COUNT_GEN6; +#elif B_METRONOME_MOVES >= GEN_5 + u32 moveCount = MOVES_COUNT_GEN5; +#elif B_METRONOME_MOVES >= GEN_4 + u32 moveCount = MOVES_COUNT_GEN4; +#elif B_METRONOME_MOVES >= GEN_3 + u32 moveCount = MOVES_COUNT_GEN3; +#elif B_METRONOME_MOVES >= GEN_2 + u32 moveCount = MOVES_COUNT_GEN2; +#else + u32 moveCount = MOVES_COUNT_GEN1; +#endif + + move = RandomUniformExcept(RNG_METRONOME, 1, moveCount - 1, InvalidMetronomeMove); + return move; } -void ClearDamageCalcResults(void) +static u32 GetAssistMove(void) { - for (u32 battler = 0; battler < MAX_BATTLERS_COUNT; battler++) + u32 move = MOVE_NONE; + s32 chooseableMovesNo = 0; + struct Pokemon *party; + u16 *validMoves = Alloc(sizeof(u16) * PARTY_SIZE * MAX_MON_MOVES); + + if (validMoves != NULL) { - gBattleStruct->moveDamage[battler] = 0; - gBattleStruct->critChance[battler] = 0; - gBattleStruct->moveResultFlags[battler] = 0; - gBattleStruct->noResultString[battler] = 0; - gBattleStruct->missStringId[battler] = 0; - gSpecialStatuses[battler].criticalHit = FALSE; + party = GetBattlerParty(gBattlerAttacker); + + for (u32 monId = 0; monId < PARTY_SIZE; monId++) + { + if (monId == gBattlerPartyIndexes[gBattlerAttacker]) + continue; + if (GetMonData(&party[monId], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE) + continue; + if (GetMonData(&party[monId], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG) + continue; + + for (u32 moveId = 0; moveId < MAX_MON_MOVES; moveId++) + { + u16 move = GetMonData(&party[monId], MON_DATA_MOVE1 + moveId); + + if (IsMoveAssistBanned(move)) + continue; + + validMoves[chooseableMovesNo++] = move; + } + } } - gBattleStruct->doneDoublesSpreadHit = FALSE; - gBattleStruct->calculatedDamageDone = FALSE; - gBattleStruct->calculatedSpreadMoveAccuracy = FALSE; - gBattleStruct->printedStrongWindsWeakenedAttack = FALSE; - gBattleStruct->numSpreadTargets = 0; + if (chooseableMovesNo) + move = validMoves[Random() % chooseableMovesNo]; + + TRY_FREE_AND_SET_NULL(validMoves); + + return move; } -bool32 DoesDestinyBondFail(u32 battler) +u32 GetNaturePowerMove(u32 battler) { - if (B_DESTINY_BOND_FAIL >= GEN_7 - && GetMoveEffect(gLastLandedMoves[battler]) == EFFECT_DESTINY_BOND - && GetMoveEffect(gLastResultingMoves[battler]) == EFFECT_DESTINY_BOND) - return TRUE; - return FALSE; + u32 move = gBattleEnvironmentInfo[gBattleEnvironment].naturePower; + if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN) + move = MOVE_MOONBLAST; + else if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) + move = MOVE_THUNDERBOLT; + else if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN) + move = MOVE_ENERGY_BALL; + else if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN) + move = MOVE_PSYCHIC; + else if (gBattleEnvironmentInfo[gBattleEnvironment].naturePower == MOVE_NONE) + move = MOVE_TRI_ATTACK; + + return move; } -// This check has always to be the last in a condtion statement because of the recording of AI data. -bool32 IsMoveEffectBlockedByTarget(u32 ability) +static u32 GetSleepTalkMove(void) { - if (ability == ABILITY_SHIELD_DUST) - { - RecordAbilityBattle(gBattlerTarget, ability); - return TRUE; - } - else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_COVERT_CLOAK) + u32 move = MOVE_NONE; + + u32 i, unusableMovesBits = 0, movePosition; + + if (GetBattlerAbility(gBattlerAttacker) != ABILITY_COMATOSE + && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)) + return move; + + for (i = 0; i < MAX_MON_MOVES; i++) { - RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_COVERT_CLOAK); - return TRUE; + if (IsMoveSleepTalkBanned(gBattleMons[gBattlerAttacker].moves[i]) + || gBattleMoveEffects[GetMoveEffect(gBattleMons[gBattlerAttacker].moves[i])].twoTurnEffect) + unusableMovesBits |= (1 << (i)); } - return FALSE; -} + unusableMovesBits = CheckMoveLimitations(gBattlerAttacker, unusableMovesBits, ~(MOVE_LIMITATION_PP | MOVE_LIMITATION_CHOICE_ITEM)); + if (unusableMovesBits == ALL_MOVES_MASK) // all 4 moves cannot be chosen + return move; -bool32 IsPursuitTargetSet(void) -{ - for (u32 battler = 0; battler < gBattlersCount; battler++) + // Set Sleep Talk as used move, so it works with Last Resort. + gDisableStructs[gBattlerAttacker].usedMoves |= 1u << gCurrMovePos; + do { - if (gBattleStruct->battlerState[battler].pursuitTarget) - return TRUE; - } - return FALSE; + movePosition = MOD(Random(), MAX_MON_MOVES); + } while ((1u << movePosition) & unusableMovesBits); + + move = gBattleMons[gBattlerAttacker].moves[movePosition]; + gCurrMovePos = movePosition; + + return move; } -void ClearPursuitValues(void) +static u32 GetCopyCatMove(void) { - for (u32 i = 0; i < gBattlersCount; i++) - gBattleStruct->battlerState[i].pursuitTarget = FALSE; - gBattleStruct->pursuitStoredSwitch = PARTY_SIZE; + if (gLastUsedMove == MOVE_NONE + || gLastUsedMove == MOVE_UNAVAILABLE + || IsMoveCopycatBanned(gLastUsedMove) + || IsZMove(gLastUsedMove)) + return MOVE_NONE; + + return gLastUsedMove; } -void ClearPursuitValuesIfSet(u32 battler) +static u32 GetMeFirstMove(void) { - if (gBattleStruct->battlerState[battler].pursuitTarget) - ClearPursuitValues(); + u32 move = GetChosenMoveFromPosition(gBattlerTarget); + + if (IsBattleMoveStatus(move) + || IsMoveMeFirstBanned(move) + || HasBattlerActedThisTurn(gBattlerTarget)) + return MOVE_NONE; + + return move; } -bool32 HasWeatherEffect(void) +void RemoveAbilityFlags(u32 battler) { - for (u32 battler = 0; battler < gBattlersCount; battler++) + switch (GetBattlerAbility(battler)) { - if (!IsBattlerAlive(battler)) - continue; - - u32 ability = GetBattlerAbility(battler); - switch (ability) - { - case ABILITY_CLOUD_NINE: - case ABILITY_AIR_LOCK: - return FALSE; - } + case ABILITY_FLASH_FIRE: + gDisableStructs[battler].flashFireBoosted = FALSE; + break; + case ABILITY_VESSEL_OF_RUIN: + gBattleMons[battler].volatiles.vesselOfRuin = FALSE; + break; + case ABILITY_TABLETS_OF_RUIN: + gBattleMons[battler].volatiles.tabletsOfRuin = FALSE; + break; + case ABILITY_SWORD_OF_RUIN: + gBattleMons[battler].volatiles.swordOfRuin = FALSE; + break; + case ABILITY_BEADS_OF_RUIN: + gBattleMons[battler].volatiles.beadsOfRuin = FALSE; + break; + default: + break; } - - return TRUE; } -static bool32 IsAnyTargetAffected(u32 battlerAtk) +bool32 IsAnyTargetTurnDamaged(u32 battlerAtk) { for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { - if (battlerAtk == battlerDef) + if (battlerDef == battlerAtk) continue; - - if (!(gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT)) + if (IsBattlerTurnDamaged(battlerDef)) return TRUE; } return FALSE; } -void UpdateStallMons(void) +bool32 IsAllowedToUseBag(void) { - if (IsBattlerTurnDamaged(gBattlerTarget) || IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove) || gMovesInfo[gCurrentMove].category == DAMAGE_CATEGORY_STATUS) - return; - if (!IsDoubleBattle() || gMovesInfo[gCurrentMove].target == MOVE_TARGET_SELECTED) + switch(VarGet(B_VAR_NO_BAG_USE)) { - u32 moveType = GetBattleMoveType(gCurrentMove); // Probably doesn't handle dynamic move types right now - u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); - u32 abilityDef = GetBattlerAbility(gBattlerTarget); - if (CanAbilityAbsorbMove(gBattlerAttacker, gBattlerTarget, abilityDef, gCurrentMove, moveType, ABILITY_CHECK_TRIGGER)) - { - gAiBattleData->playerStallMons[gBattlerPartyIndexes[gBattlerTarget]]++; - } - else if (CanAbilityBlockMove(gBattlerAttacker, gBattlerTarget, abilityAtk, abilityDef, gCurrentMove, ABILITY_CHECK_TRIGGER)) - { - gAiBattleData->playerStallMons[gBattlerPartyIndexes[gBattlerTarget]]++; - } - else if (AI_GetMoveEffectiveness(gCurrentMove, gBattlerAttacker, gBattlerTarget) == 0) - { - gAiBattleData->playerStallMons[gBattlerPartyIndexes[gBattlerTarget]]++; - } + case NO_BAG_RESTRICTION: + return TRUE; + case NO_BAG_AGAINST_TRAINER: //True in wild battle; False in trainer battle + return (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER)); + case NO_BAG_IN_BATTLE: + return FALSE; + default: + return TRUE; // Undefined Behavior } - // Handling for moves that target multiple opponents in doubles not handled currently } -bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId) +bool32 IsMimikyuDisguised(u32 battler) { - if (gItemsInfo[gBattleMons[battler].item].pocket == POCKET_BERRIES - || GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_RESTORE_HP) // Edge case for Berry Juice - { - if (ItemBattleEffects(caseId, battler, FALSE)) - return TRUE; - } - return FALSE; + return gBattleMons[battler].species == SPECIES_MIMIKYU_DISGUISED + || gBattleMons[battler].species == SPECIES_MIMIKYU_TOTEM_DISGUISED; } diff --git a/src/battle_util2.c b/src/battle_util2.c index fd2312bb5b9b..3f252713009a 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -95,17 +95,10 @@ void AdjustFriendshipOnBattleFaint(u8 battler) opposingBattlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); } - if (gBattleMons[opposingBattlerId].level > gBattleMons[battler].level) - { - if (gBattleMons[opposingBattlerId].level - gBattleMons[battler].level > 29) - AdjustFriendship(GetBattlerMon(battler), FRIENDSHIP_EVENT_FAINT_LARGE); - else - AdjustFriendship(GetBattlerMon(battler), FRIENDSHIP_EVENT_FAINT_SMALL); - } + if (gBattleMons[opposingBattlerId].level - gBattleMons[battler].level > 29) + AdjustFriendship(GetBattlerMon(battler), FRIENDSHIP_EVENT_FAINT_LARGE); else - { AdjustFriendship(GetBattlerMon(battler), FRIENDSHIP_EVENT_FAINT_SMALL); - } } void SwitchPartyOrderInGameMulti(u8 battler, u8 arg1) @@ -139,11 +132,11 @@ u32 BattlePalace_TryEscapeStatus(u8 battler) if (UproarWakeUpCheck(battler)) { // Wake up from Uproar + gEffectBattler = battler; gBattleMons[battler].status1 &= ~(STATUS1_SLEEP); - gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE); - BattleScriptPushCursor(); + gBattleMons[battler].volatiles.nightmare = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP_UPROAR; - gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; + BattleScriptCall(BattleScript_MoveUsedWokeUp); effect = 2; } else @@ -170,10 +163,9 @@ u32 BattlePalace_TryEscapeStatus(u8 battler) else { // Wake up - gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE); - BattleScriptPushCursor(); + gBattleMons[battler].volatiles.nightmare = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP; - gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; + BattleScriptCall(BattleScript_MoveUsedWokeUp); effect = 2; } } @@ -192,8 +184,7 @@ u32 BattlePalace_TryEscapeStatus(u8 battler) { // Unfreeze gBattleMons[battler].status1 &= ~(STATUS1_FREEZE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; + BattleScriptCall(BattleScript_MoveUsedUnfroze); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED; } effect = 2; diff --git a/src/battle_z_move.c b/src/battle_z_move.c index 53df466af8ee..4b517ccc8f38 100644 --- a/src/battle_z_move.c +++ b/src/battle_z_move.c @@ -36,7 +36,6 @@ #include "constants/songs.h" #include "constants/items.h" #include "constants/species.h" -#include "constants/hold_effects.h" #include "constants/battle_string_ids.h" #include "constants/battle_move_effects.h" #include "constants/abilities.h" @@ -113,7 +112,7 @@ bool32 IsZMove(u32 move) bool32 CanUseZMove(u32 battler) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum HoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); // Check if Player has Z-Power Ring. if (!TESTING && (battler == B_POSITION_PLAYER_LEFT @@ -144,7 +143,7 @@ bool32 CanUseZMove(u32 battler) u32 GetUsableZMove(u32 battler, u32 move) { u32 item = gBattleMons[battler].item; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum HoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); if (holdEffect == HOLD_EFFECT_Z_CRYSTAL) { @@ -161,14 +160,13 @@ u32 GetUsableZMove(u32 battler, u32 move) void ActivateZMove(u32 battler) { - gBattleStruct->zmove.baseMoves[battler] = gBattleMons[battler].moves[gBattleStruct->chosenMovePositions[battler]]; SetActiveGimmick(battler, GIMMICK_Z_MOVE); } bool32 IsViableZMove(u32 battler, u32 move) { u32 item; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum HoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); int moveSlotIndex; item = gBattleMons[battler].item; @@ -420,7 +418,7 @@ static void ZMoveSelectionDisplayPpNumber(u32 battler) static void ZMoveSelectionDisplayMoveType(u16 zMove, u32 battler) { u8 *txtPtr, *end; - u32 zMoveType = GetBattleMoveType(zMove); + enum Type zMoveType = GetBattleMoveType(zMove); txtPtr = StringCopy(gDisplayedStringBattle, gText_MoveInterfaceType); *(txtPtr)++ = EXT_CTRL_CODE_BEGIN; @@ -438,7 +436,7 @@ static void ZMoveSelectionDisplayMoveType(u16 zMove, u32 battler) void SetZEffect(void) { u32 i; - u32 effect = GetMoveZEffect(gBattleStruct->zmove.baseMoves[gBattlerAttacker]); + u32 effect = GetMoveZEffect(gChosenMove); if (effect == Z_EFFECT_CURSE) { @@ -486,9 +484,9 @@ void SetZEffect(void) break; } case Z_EFFECT_BOOST_CRITS: - if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_FOCUS_ENERGY_ANY)) + if (!(gBattleMons[gBattlerAttacker].volatiles.dragonCheer || gBattleMons[gBattlerAttacker].volatiles.focusEnergy)) { - gBattleMons[gBattlerAttacker].status2 |= STATUS2_FOCUS_ENERGY; + gBattleMons[gBattlerAttacker].volatiles.focusEnergy = TRUE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_Z_BOOST_CRITS; BattleScriptPush(gBattlescriptCurrInstr + Z_EFFECT_BS_LENGTH); gBattlescriptCurrInstr = BattleScript_ZEffectPrintString; @@ -508,7 +506,7 @@ void SetZEffect(void) case Z_EFFECT_RECOVER_HP: if (gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP) { - gBattleStruct->moveDamage[gBattlerAttacker] = (-1) * gBattleMons[gBattlerAttacker].maxHP; + SetHealAmount(gBattlerAttacker, gBattleMons[gBattlerAttacker].maxHP); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_Z_RECOVER_HP; BattleScriptPush(gBattlescriptCurrInstr + Z_EFFECT_BS_LENGTH); gBattlescriptCurrInstr = BattleScript_RecoverHPZMove; @@ -549,7 +547,8 @@ u32 GetZMovePower(u32 move) { if (GetMoveCategory(move) == DAMAGE_CATEGORY_STATUS) return 0; - if (GetMoveEffect(move) == EFFECT_OHKO) + enum BattleMoveEffects moveEffect = GetMoveEffect(move); + if (moveEffect == EFFECT_OHKO || moveEffect == EFFECT_SHEER_COLD) return 180; u32 power = GetMoveZPowerOverride(move); @@ -568,4 +567,3 @@ u32 GetZMovePower(u32 move) else if (power >= 60) return 120; else return 100; } - diff --git a/src/berry_blender.c b/src/berry_blender.c index 547520812628..adb28dab072a 100644 --- a/src/berry_blender.c +++ b/src/berry_blender.c @@ -940,7 +940,7 @@ static bool8 LoadBerryBlenderGfx(void) { case 0: sBerryBlender->tilesBuffer = AllocZeroed(GetDecompressedDataSize(gBerryBlenderCenter_Gfx) + 100); - LZDecompressWram(gBerryBlenderCenter_Gfx, sBerryBlender->tilesBuffer); + DecompressDataWithHeaderWram(gBerryBlenderCenter_Gfx, sBerryBlender->tilesBuffer); sBerryBlender->loadGfxState++; break; case 1: @@ -954,7 +954,7 @@ static bool8 LoadBerryBlenderGfx(void) sBerryBlender->loadGfxState++; break; case 3: - LZDecompressWram(gBerryBlenderOuter_Gfx, sBerryBlender->tilesBuffer); + DecompressDataWithHeaderWram(gBerryBlenderOuter_Gfx, sBerryBlender->tilesBuffer); sBerryBlender->loadGfxState++; break; case 4: @@ -962,7 +962,7 @@ static bool8 LoadBerryBlenderGfx(void) sBerryBlender->loadGfxState++; break; case 5: - LZDecompressWram(gBerryBlenderOuter_Tilemap, sBerryBlender->tilesBuffer); + DecompressDataWithHeaderWram(gBerryBlenderOuter_Tilemap, sBerryBlender->tilesBuffer); sBerryBlender->loadGfxState++; break; case 6: @@ -2432,6 +2432,7 @@ static void CalculatePokeblock(struct BlenderBerry *berries, struct Pokeblock *p } // Factor in max RPM and round + multiuseVar = maxRPM / 333 + 100; for (i = 0; i < FLAVOR_COUNT; i++) { s32 remainder; diff --git a/src/berry_crush.c b/src/berry_crush.c index 3a2274f189e1..e3927d8780ae 100644 --- a/src/berry_crush.c +++ b/src/berry_crush.c @@ -4,6 +4,7 @@ #include "berry_powder.h" #include "bg.h" #include "decompress.h" +#include "digit_obj_util.h" #include "dynamic_placeholder_text_util.h" #include "event_data.h" #include "gpu_regs.h" @@ -17,11 +18,10 @@ #include "malloc.h" #include "math_util.h" #include "menu.h" +#include "minigame_countdown.h" #include "overworld.h" #include "palette.h" -#include "minigame_countdown.h" #include "random.h" -#include "digit_obj_util.h" #include "save.h" #include "scanline_effect.h" #include "script.h" @@ -582,13 +582,13 @@ static const u32 sPressingSpeedConversionTable[] = static const u16 sCrusherBase_Pal[] = INCBIN_U16("graphics/berry_crush/crusher_base.gbapal"); static const u16 sEffects_Pal[] = INCBIN_U16("graphics/berry_crush/effects.gbapal"); static const u16 sTimerDigits_Pal[] = INCBIN_U16("graphics/berry_crush/timer_digits.gbapal"); -static const u32 sCrusherBase_Gfx[] = INCBIN_U32("graphics/berry_crush/crusher_base.4bpp.lz"); -static const u32 sImpact_Gfx[] = INCBIN_U32("graphics/berry_crush/impact.4bpp.lz"); -static const u32 sSparkle_Gfx[] = INCBIN_U32("graphics/berry_crush/sparkle.4bpp.lz"); -static const u32 sTimerDigits_Gfx[] = INCBIN_U32("graphics/berry_crush/timer_digits.4bpp.lz"); -static const u8 sCrusherTop_Tilemap[] = INCBIN_U8("graphics/berry_crush/crusher_top.bin.lz"); -static const u8 sContainerCap_Tilemap[] = INCBIN_U8("graphics/berry_crush/container_cap.bin.lz"); -static const u8 sBg_Tilemap[] = INCBIN_U8("graphics/berry_crush/bg.bin.lz"); +static const u32 sCrusherBase_Gfx[] = INCBIN_U32("graphics/berry_crush/crusher_base.4bpp.smol"); +static const u32 sImpact_Gfx[] = INCBIN_U32("graphics/berry_crush/impact.4bpp.smol"); +static const u32 sSparkle_Gfx[] = INCBIN_U32("graphics/berry_crush/sparkle.4bpp.smol"); +static const u32 sTimerDigits_Gfx[] = INCBIN_U32("graphics/berry_crush/timer_digits.4bpp.smol"); +static const u8 sCrusherTop_Tilemap[] = INCBIN_U8("graphics/berry_crush/crusher_top.bin.smolTM"); +static const u8 sContainerCap_Tilemap[] = INCBIN_U8("graphics/berry_crush/container_cap.bin.smolTM"); +static const u8 sBg_Tilemap[] = INCBIN_U8("graphics/berry_crush/bg.bin.smolTM"); // Takes the number of players - 2 and a player id and returns the // index into sPlayerCoords where that player should be seated @@ -1157,18 +1157,7 @@ static void SetNamesAndTextSpeed(struct BerryCrushGame *game) game->players[i].name[PLAYER_NAME_LENGTH] = EOS; } - switch (gSaveBlock2Ptr->optionsTextSpeed) - { - case OPTIONS_TEXT_SPEED_SLOW: - game->textSpeed = 8; - break; - case OPTIONS_TEXT_SPEED_MID: - game->textSpeed = 4; - break; - case OPTIONS_TEXT_SPEED_FAST: - game->textSpeed = 1; - break; - } + game->textSpeed = GetPlayerTextSpeedDelay(); } static s32 ShowGameDisplay(void) diff --git a/src/berry_fix_graphics.c b/src/berry_fix_graphics.c index 80510a4ce173..3fd4fccd3ced 100644 --- a/src/berry_fix_graphics.c +++ b/src/berry_fix_graphics.c @@ -1,5 +1,6 @@ #include "global.h" #include "graphics.h" +#include "decompress.h" // Duplicate of sBerryFixGraphics in berry_fix_program.c static const struct { @@ -41,8 +42,8 @@ static void UNUSED LoadBerryFixGraphics(u32 idx) REG_BG0HOFS = 0; REG_BG0VOFS = 0; REG_BLDCNT = 0; - LZ77UnCompVram(sBerryFixGraphics[idx].gfx, (void *)BG_CHAR_ADDR(0)); - LZ77UnCompVram(sBerryFixGraphics[idx].tilemap, (void *)BG_SCREEN_ADDR(31)); + DecompressDataWithHeaderVram(sBerryFixGraphics[idx].gfx, (void *)BG_CHAR_ADDR(0)); + DecompressDataWithHeaderVram(sBerryFixGraphics[idx].tilemap, (void *)BG_SCREEN_ADDR(31)); CpuCopy16(sBerryFixGraphics[idx].pltt, (void *)BG_PLTT, BG_PLTT_SIZE); REG_BG0CNT = BGCNT_SCREENBASE(31); REG_DISPCNT = DISPCNT_BG0_ON; diff --git a/src/berry_fix_program.c b/src/berry_fix_program.c index 98938c78b57c..ab624add2ed6 100644 --- a/src/berry_fix_program.c +++ b/src/berry_fix_program.c @@ -12,6 +12,7 @@ #include "text.h" #include "menu.h" #include "m4a.h" +#include "decompress.h" #include "constants/rgb.h" enum { @@ -366,8 +367,8 @@ static void BerryFix_SetScene(int scene) break; } CopyBgTilemapBufferToVram(0); - LZ77UnCompVram(sBerryFixGraphics[scene].gfx, (void *)BG_CHAR_ADDR(1)); - LZ77UnCompVram(sBerryFixGraphics[scene].tilemap, (void *)BG_SCREEN_ADDR(31)); + DecompressDataWithHeaderVram(sBerryFixGraphics[scene].gfx, (void *)BG_CHAR_ADDR(1)); + DecompressDataWithHeaderVram(sBerryFixGraphics[scene].tilemap, (void *)BG_SCREEN_ADDR(31)); // These palettes range in size from 32-48 colors, so the below is interpreting whatever // follows the palette (by default, the corresponding tiles) as the remaining 80-96. CpuCopy32(sBerryFixGraphics[scene].palette, (void *)BG_PLTT, PLTT_SIZEOF(128)); diff --git a/src/berry_tag_screen.c b/src/berry_tag_screen.c index 7bc486f3fabf..6f0467f332c9 100644 --- a/src/berry_tag_screen.c +++ b/src/berry_tag_screen.c @@ -335,12 +335,12 @@ static bool8 LoadBerryTagGfx(void) case 1: if (FreeTempTileDataBuffersIfPossible() != TRUE) { - LZDecompressWram(gBerryTag_Gfx, sBerryTag->tilemapBuffers[0]); + DecompressDataWithHeaderWram(gBerryTag_Gfx, sBerryTag->tilemapBuffers[0]); sBerryTag->gfxState++; } break; case 2: - LZDecompressWram(gBerryTag_Tilemap, sBerryTag->tilemapBuffers[2]); + DecompressDataWithHeaderWram(gBerryTag_Tilemap, sBerryTag->tilemapBuffers[2]); sBerryTag->gfxState++; break; case 3: @@ -563,9 +563,9 @@ static void Task_HandleInput(u8 taskId) static void TryChangeDisplayedBerry(u8 taskId, s8 toMove) { s16 *data = gTasks[taskId].data; - s16 currPocketPosition = gBagPosition.scrollPosition[BERRIES_POCKET] + gBagPosition.cursorPosition[BERRIES_POCKET]; + s16 currPocketPosition = gBagPosition.scrollPosition[POCKET_BERRIES] + gBagPosition.cursorPosition[POCKET_BERRIES]; u32 newPocketPosition = currPocketPosition + toMove; - if (newPocketPosition < ITEM_TO_BERRY(LAST_BERRY_INDEX) && BagGetItemIdByPocketPosition(POCKET_BERRIES, newPocketPosition) != ITEM_NONE) + if (newPocketPosition < ITEM_TO_BERRY(LAST_BERRY_INDEX) && GetBagItemId(POCKET_BERRIES, newPocketPosition) != ITEM_NONE) { if (toMove < 0) tBgOp = BG_COORD_SUB; @@ -581,11 +581,11 @@ static void TryChangeDisplayedBerry(u8 taskId, s8 toMove) static void HandleBagCursorPositionChange(s8 toMove) { - u16 *scrollPos = &gBagPosition.scrollPosition[BERRIES_POCKET]; - u16 *cursorPos = &gBagPosition.cursorPosition[BERRIES_POCKET]; + u16 *scrollPos = &gBagPosition.scrollPosition[POCKET_BERRIES]; + u16 *cursorPos = &gBagPosition.cursorPosition[POCKET_BERRIES]; if (toMove > 0) { - if (*cursorPos < 4 || BagGetItemIdByPocketPosition(POCKET_BERRIES, *scrollPos + 8) == 0) + if (*cursorPos < 4 || GetBagItemId(POCKET_BERRIES, *scrollPos + 8) == 0) *cursorPos += toMove; else *scrollPos += toMove; @@ -598,7 +598,7 @@ static void HandleBagCursorPositionChange(s8 toMove) *scrollPos += toMove; } - sBerryTag->berryId = ItemIdToBerryType(BagGetItemIdByPocketPosition(POCKET_BERRIES, *scrollPos + *cursorPos)); + sBerryTag->berryId = ItemIdToBerryType(GetBagItemId(POCKET_BERRIES, *scrollPos + *cursorPos)); } #define DISPLAY_SPEED 16 diff --git a/src/bg.c b/src/bg.c index ab7b48c58d89..9080adf22c7a 100644 --- a/src/bg.c +++ b/src/bg.c @@ -5,6 +5,7 @@ #include "gpu_regs.h" #include "malloc.h" #include "menu.h" +#include "decompress.h" #define DISPCNT_ALL_BG_AND_MODE_BITS (DISPCNT_BG_ALL_ON | 0x7) @@ -874,7 +875,7 @@ void CopyToBgTilemapBuffer(u32 bg, const void *src, u32 mode, u32 destOffset) if (mode != 0) CpuCopy16(src, (void *)(sGpuBgConfigs2[bg].tilemap + (destOffset * 2)), mode); else - LZ77UnCompWram(src, (void *)(sGpuBgConfigs2[bg].tilemap + (destOffset * 2))); + DecompressDataWithHeaderWram(src, (void *)(sGpuBgConfigs2[bg].tilemap + (destOffset * 2))); } } @@ -910,8 +911,6 @@ void CopyBgTilemapBufferToVram(u32 bg) void CopyToBgTilemapBufferRect(u32 bg, const void *src, u8 destX, u8 destY, u8 width, u8 height) { - u16 destX16; - u16 destY16; u16 mode; if (!IsInvalidBg(bg) && !IsTileMapOutsideWram(bg)) @@ -921,11 +920,11 @@ void CopyToBgTilemapBufferRect(u32 bg, const void *src, u8 destX, u8 destY, u8 w case BG_TYPE_NORMAL: { const u16 *srcCopy = src; - for (destY16 = destY; destY16 < (destY + height); destY16++) + for (u32 j = destY; j < (destY + height); j++) { - for (destX16 = destX; destX16 < (destX + width); destX16++) + for (u32 i = destX; i < (destX + width); i++) { - ((u16 *)sGpuBgConfigs2[bg].tilemap)[((destY16 * 0x20) + destX16)] = *srcCopy++; + ((u16 *)sGpuBgConfigs2[bg].tilemap)[((j * 0x20) + i)] = *srcCopy++; } } break; @@ -934,11 +933,11 @@ void CopyToBgTilemapBufferRect(u32 bg, const void *src, u8 destX, u8 destY, u8 w { const u8 *srcCopy = src; mode = GetBgMetricAffineMode(bg, 0x1); - for (destY16 = destY; destY16 < (destY + height); destY16++) + for (u32 j = destY; j < (destY + height); j++) { - for (destX16 = destX; destX16 < (destX + width); destX16++) + for (u32 i = destX; i < (destX + width); i++) { - ((u8 *)sGpuBgConfigs2[bg].tilemap)[((destY16 * mode) + destX16)] = *srcCopy++; + ((u8 *)sGpuBgConfigs2[bg].tilemap)[((j * mode) + i)] = *srcCopy++; } } break; @@ -957,7 +956,6 @@ void CopyRectToBgTilemapBufferRect(u32 bg, const void *src, u8 srcX, u8 srcY, u8 u16 screenWidth, screenHeight, screenSize; u16 var; const void *srcPtr; - u16 i, j; if (!IsInvalidBg(bg) && !IsTileMapOutsideWram(bg)) { @@ -968,11 +966,11 @@ void CopyRectToBgTilemapBufferRect(u32 bg, const void *src, u8 srcX, u8 srcY, u8 { case BG_TYPE_NORMAL: srcPtr = src + ((srcY * srcWidth) + srcX) * 2; - for (i = destY; i < (destY + rectHeight); i++) + for (u32 j = destY; j < (destY + rectHeight); j++) { - for (j = destX; j < (destX + rectWidth); j++) + for (u32 i = destX; i < (destX + rectWidth); i++) { - u16 index = GetTileMapIndexFromCoords(j, i, screenSize, screenWidth, screenHeight); + u16 index = GetTileMapIndexFromCoords(i, j, screenSize, screenWidth, screenHeight); CopyTileMapEntry(srcPtr, sGpuBgConfigs2[bg].tilemap + (index * 2), palette1, tileOffset, palette2); srcPtr += 2; } @@ -982,11 +980,11 @@ void CopyRectToBgTilemapBufferRect(u32 bg, const void *src, u8 srcX, u8 srcY, u8 case BG_TYPE_AFFINE: srcPtr = src + ((srcY * srcWidth) + srcX); var = GetBgMetricAffineMode(bg, 0x1); - for (i = destY; i < (destY + rectHeight); i++) + for (u32 j = destY; j < (destY + rectHeight); j++) { - for (j = destX; j < (destX + rectWidth); j++) + for (u32 i = destX; i < (destX + rectWidth); i++) { - *(u8 *)(sGpuBgConfigs2[bg].tilemap + ((var * i) + j)) = *(u8 *)(srcPtr) + tileOffset; + *(u8 *)(sGpuBgConfigs2[bg].tilemap + ((var * j) + i)) = *(u8 *)(srcPtr) + tileOffset; srcPtr++; } srcPtr += (srcWidth - rectWidth); @@ -998,8 +996,6 @@ void CopyRectToBgTilemapBufferRect(u32 bg, const void *src, u8 srcX, u8 srcY, u8 void FillBgTilemapBufferRect_Palette0(u32 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height) { - u16 x16; - u16 y16; u16 mode; if (!IsInvalidBg(bg) && !IsTileMapOutsideWram(bg)) @@ -1007,21 +1003,21 @@ void FillBgTilemapBufferRect_Palette0(u32 bg, u16 tileNum, u8 x, u8 y, u8 width, switch (GetBgType(bg)) { case BG_TYPE_NORMAL: - for (y16 = y; y16 < (y + height); y16++) + for (u32 j = y; j < (y + height); j++) { - for (x16 = x; x16 < (x + width); x16++) + for (u32 i = x; i < (x + width); i++) { - ((u16 *)sGpuBgConfigs2[bg].tilemap)[((y16 * 0x20) + x16)] = tileNum; + ((u16 *)sGpuBgConfigs2[bg].tilemap)[((j * 0x20) + i)] = tileNum; } } break; case BG_TYPE_AFFINE: mode = GetBgMetricAffineMode(bg, 0x1); - for (y16 = y; y16 < (y + height); y16++) + for (u32 j = y; j < (y + height); j++) { - for (x16 = x; x16 < (x + width); x16++) + for (u32 i = x; i < (x + width); i++) { - ((u8 *)sGpuBgConfigs2[bg].tilemap)[((y16 * mode) + x16)] = tileNum; + ((u8 *)sGpuBgConfigs2[bg].tilemap)[((j * mode) + i)] = tileNum; } } break; @@ -1040,7 +1036,6 @@ void WriteSequenceToBgTilemapBuffer(u32 bg, u16 firstTileNum, u8 x, u8 y, u8 wid u16 mode2; u16 attribute; u16 mode3; - u16 x16, y16; if (!IsInvalidBg(bg) && !IsTileMapOutsideWram(bg)) { @@ -1050,22 +1045,22 @@ void WriteSequenceToBgTilemapBuffer(u32 bg, u16 firstTileNum, u8 x, u8 y, u8 wid switch (GetBgType(bg)) { case BG_TYPE_NORMAL: - for (y16 = y; y16 < (y + height); y16++) + for (u32 j = y; j < (y + height); j++) { - for (x16 = x; x16 < (x + width); x16++) + for (u32 i = x; i < (x + width); i++) { - CopyTileMapEntry(&firstTileNum, &((u16 *)sGpuBgConfigs2[bg].tilemap)[(u16)GetTileMapIndexFromCoords(x16, y16, attribute, mode, mode2)], paletteSlot, 0, 0); + CopyTileMapEntry(&firstTileNum, &((u16 *)sGpuBgConfigs2[bg].tilemap)[(u16)GetTileMapIndexFromCoords(i, j, attribute, mode, mode2)], paletteSlot, 0, 0); firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF); } } break; case BG_TYPE_AFFINE: mode3 = GetBgMetricAffineMode(bg, 0x1); - for (y16 = y; y16 < (y + height); y16++) + for (u32 j = y; j < (y + height); j++) { - for (x16 = x; x16 < (x + width); x16++) + for (u32 i = x; i < (x + width); i++) { - ((u8 *)sGpuBgConfigs2[bg].tilemap)[(y16 * mode3) + x16] = firstTileNum; + ((u8 *)sGpuBgConfigs2[bg].tilemap)[(j * mode3) + i] = firstTileNum; firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF); } } diff --git a/src/bike.c b/src/bike.c index afc3099ab7e8..3f4181f12913 100644 --- a/src/bike.c +++ b/src/bike.c @@ -5,9 +5,9 @@ #include "fieldmap.h" #include "field_specials.h" #include "metatile_behavior.h" +#include "oras_dowse.h" #include "overworld.h" #include "sound.h" -#include "constants/map_types.h" #include "constants/songs.h" // this file's functions @@ -1004,6 +1004,7 @@ void GetOnOffBike(u8 transitionFlags) } else { + EndORASDowsing(); SetPlayerAvatarTransitionFlags(transitionFlags); Overworld_SetSavedMusic(MUS_CYCLING); Overworld_ChangeMusicTo(MUS_CYCLING); diff --git a/src/braille.c b/src/braille.c index 91872b88a0bd..310384ba32f5 100644 --- a/src/braille.c +++ b/src/braille.c @@ -1,18 +1,12 @@ #include "global.h" #include "main.h" -#include "window.h" #include "text.h" #include "sound.h" +#include "window.h" // This file handles the braille font. // For printing braille messages, see ScrCmd_braillemessage -ALIGNED(4) -static const u8 sScrollDistances[] = { - [OPTIONS_TEXT_SPEED_SLOW] = 1, - [OPTIONS_TEXT_SPEED_MID] = 2, - [OPTIONS_TEXT_SPEED_FAST] = 4, -}; static const u16 sFont_Braille[] = INCBIN_U16("graphics/fonts/braille.fwjpnfont"); static void DecompressGlyph_Braille(u16); @@ -22,6 +16,7 @@ u16 FontFunc_Braille(struct TextPrinter *textPrinter) u16 char_; struct TextPrinterSubStruct *subStruct; subStruct = (struct TextPrinterSubStruct *)(&textPrinter->subStructFields); + u32 scrollSpeed = GetPlayerTextScrollSpeed(); switch (textPrinter->state) { @@ -164,15 +159,15 @@ u16 FontFunc_Braille(struct TextPrinter *textPrinter) case RENDER_STATE_SCROLL: if (textPrinter->scrollDistance) { - if (textPrinter->scrollDistance < sScrollDistances[gSaveBlock2Ptr->optionsTextSpeed]) + if (textPrinter->scrollDistance < scrollSpeed) { ScrollWindow(textPrinter->printerTemplate.windowId, 0, textPrinter->scrollDistance, PIXEL_FILL(textPrinter->printerTemplate.bgColor)); textPrinter->scrollDistance = 0; } else { - ScrollWindow(textPrinter->printerTemplate.windowId, 0, sScrollDistances[gSaveBlock2Ptr->optionsTextSpeed], PIXEL_FILL(textPrinter->printerTemplate.bgColor)); - textPrinter->scrollDistance -= sScrollDistances[gSaveBlock2Ptr->optionsTextSpeed]; + ScrollWindow(textPrinter->printerTemplate.windowId, 0, scrollSpeed, PIXEL_FILL(textPrinter->printerTemplate.bgColor)); + textPrinter->scrollDistance -= scrollSpeed; } CopyWindowToVram(textPrinter->printerTemplate.windowId, COPYWIN_GFX); } diff --git a/src/braille_puzzles.c b/src/braille_puzzles.c index 31497e137c62..217f62d2c7b3 100644 --- a/src/braille_puzzles.c +++ b/src/braille_puzzles.c @@ -81,9 +81,9 @@ void DoBrailleDigEffect(void) MapGridSetMetatileIdAt( 9 + MAP_OFFSET, 1 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_TopLeft); MapGridSetMetatileIdAt(10 + MAP_OFFSET, 1 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_TopMid); MapGridSetMetatileIdAt(11 + MAP_OFFSET, 1 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_TopRight); - MapGridSetMetatileIdAt( 9 + MAP_OFFSET, 2 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomLeft | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt( 9 + MAP_OFFSET, 2 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomLeft | MAPGRID_IMPASSABLE); MapGridSetMetatileIdAt(10 + MAP_OFFSET, 2 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomMid); - MapGridSetMetatileIdAt(11 + MAP_OFFSET, 2 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomRight | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(11 + MAP_OFFSET, 2 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomRight | MAPGRID_IMPASSABLE); DrawWholeMapView(); PlaySE(SE_BANG); FlagSet(FLAG_SYS_BRAILLE_DIG); @@ -207,9 +207,9 @@ static void DoBrailleRegirockEffect(void) MapGridSetMetatileIdAt(7 + MAP_OFFSET, 19 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_TopLeft); MapGridSetMetatileIdAt(8 + MAP_OFFSET, 19 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_TopMid); MapGridSetMetatileIdAt(9 + MAP_OFFSET, 19 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_TopRight); - MapGridSetMetatileIdAt(7 + MAP_OFFSET, 20 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomLeft | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(7 + MAP_OFFSET, 20 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomLeft | MAPGRID_IMPASSABLE); MapGridSetMetatileIdAt(8 + MAP_OFFSET, 20 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomMid); - MapGridSetMetatileIdAt(9 + MAP_OFFSET, 20 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomRight | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(9 + MAP_OFFSET, 20 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomRight | MAPGRID_IMPASSABLE); DrawWholeMapView(); PlaySE(SE_BANG); FlagSet(FLAG_SYS_REGIROCK_PUZZLE_COMPLETED); @@ -247,9 +247,9 @@ static void DoBrailleRegisteelEffect(void) MapGridSetMetatileIdAt(7 + MAP_OFFSET, 19 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_TopLeft); MapGridSetMetatileIdAt(8 + MAP_OFFSET, 19 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_TopMid); MapGridSetMetatileIdAt(9 + MAP_OFFSET, 19 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_TopRight); - MapGridSetMetatileIdAt(7 + MAP_OFFSET, 20 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomLeft | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(7 + MAP_OFFSET, 20 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomLeft | MAPGRID_IMPASSABLE); MapGridSetMetatileIdAt(8 + MAP_OFFSET, 20 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomMid); - MapGridSetMetatileIdAt(9 + MAP_OFFSET, 20 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomRight | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(9 + MAP_OFFSET, 20 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomRight | MAPGRID_IMPASSABLE); DrawWholeMapView(); PlaySE(SE_BANG); FlagSet(FLAG_SYS_REGISTEEL_PUZZLE_COMPLETED); diff --git a/src/cable_car.c b/src/cable_car.c index b5d3d0f53f6f..3ff3faf971b6 100644 --- a/src/cable_car.c +++ b/src/cable_car.c @@ -131,11 +131,11 @@ static const struct BgTemplate sBgTemplates[4] = { }, }; -static const u16 sGround_Tilemap[] = INCBIN_U16("graphics/cable_car/ground.bin.lz"); -static const u16 sTrees_Tilemap[] = INCBIN_U16("graphics/cable_car/trees.bin.lz"); -static const u16 sBgMountains_Tilemap[] = INCBIN_U16("graphics/cable_car/bg_mountains.bin.lz"); +static const u16 sGround_Tilemap[] = INCBIN_U16("graphics/cable_car/ground.bin.smolTM"); +static const u16 sTrees_Tilemap[] = INCBIN_U16("graphics/cable_car/trees.bin.smolTM"); +static const u16 sBgMountains_Tilemap[] = INCBIN_U16("graphics/cable_car/bg_mountains.bin.smolTM"); static const u16 sPylonTop_Tilemap[] = INCBIN_U16("graphics/cable_car/pylon_top.bin"); -static const u16 sPylonPole_Tilemap[] = INCBIN_U16("graphics/cable_car/pylon_pole.bin.lz"); +static const u16 sPylonPole_Tilemap[] = INCBIN_U16("graphics/cable_car/pylon_pole.bin.smolTM"); static const struct CompressedSpriteSheet sSpriteSheets[] = { { gCableCar_Gfx, 0x800, TAG_CABLE_CAR }, diff --git a/src/clock.c b/src/clock.c index f0a632c9ff21..2440f5b5a606 100644 --- a/src/clock.c +++ b/src/clock.c @@ -1,18 +1,19 @@ #include "global.h" +#include "berry.h" #include "clock.h" +#include "dewford_trend.h" #include "event_data.h" -#include "rtc.h" -#include "time_events.h" #include "field_specials.h" -#include "lottery_corner.h" -#include "dewford_trend.h" -#include "tv.h" #include "field_weather.h" -#include "berry.h" #include "main.h" +#include "lottery_corner.h" #include "overworld.h" +#include "rtc.h" +#include "time_events.h" +#include "tv.h" #include "wallclock.h" #include "constants/form_change_types.h" +#include "apricorn_tree.h" static void UpdatePerDay(struct Time *localTime); static void UpdatePerMinute(struct Time *localTime); @@ -55,6 +56,7 @@ static void UpdatePerDay(struct Time *localTime) SetShoalItemFlag(daysSince); SetRandomLotteryNumber(daysSince); UpdateDaysPassedSinceFormChange(daysSince); + DailyResetApricornTrees(); *days = localTime->days; } } diff --git a/src/contest.c b/src/contest.c index da11859dee7c..fcebf53aba9b 100644 --- a/src/contest.c +++ b/src/contest.c @@ -360,10 +360,32 @@ EWRAM_DATA u8 gCurContestWinnerSaveIdx = 0; // IWRAM common vars. COMMON_DATA rng_value_t gContestRngValue = {0}; -extern const u8 gText_LinkStandby4[]; +const u8 gText_LinkStandby4[] = COMPOUND_STRING("Link standby!"); extern const u8 gText_BDot[]; extern const u8 gText_CDot[]; -extern void (*const gContestEffectFuncs[])(void); + +//Text +const u8 gText_AppealNumWhichMoveWillBePlayed[] = COMPOUND_STRING("Appeal no. {STR_VAR_1}!\nWhich move will be played?"); +const u8 gText_AppealNumButItCantParticipate[] = COMPOUND_STRING("Appeal no. {STR_VAR_1}!\nBut it can't participate!"); +const u8 gText_MonAppealedWithMove[] = COMPOUND_STRING("{STR_VAR_1} appealed with\n{STR_VAR_2}!"); +const u8 gText_MonWasWatchingOthers[] = COMPOUND_STRING("{STR_VAR_1} was watching\nthe others.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"); +const u8 gText_AllOutOfAppealTime[] = COMPOUND_STRING("We're all out of\nAppeal Time!{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"); +const u8 gText_JudgeLookedAtMonExpectantly[] = COMPOUND_STRING("The JUDGE looked at\n{STR_VAR_1} expectantly.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"); +const u8 gText_AppealComboWentOverWell[] = COMPOUND_STRING("The appeal combo went\nover well.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"); +const u8 gText_AppealComboWentOverVeryWell[] = COMPOUND_STRING("The appeal combo went\nover very well.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"); +const u8 gText_AppealComboWentOverExcellently[] = COMPOUND_STRING("The appeal combo went\nover excellently.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"); +const u8 gText_MonWasTooNervousToMove[] = COMPOUND_STRING("{STR_VAR_1} was too\nnervous to move.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"); +const u8 gText_CouldntImproveItsCondition[] = COMPOUND_STRING("But it couldn't improve\nits condition…{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"); +const u8 gText_BadConditionResultedInWeakAppeal[] = COMPOUND_STRING("Its bad condition\nresulted in a weak appeal.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"); +const u8 gText_MonWasUnaffected[] = COMPOUND_STRING("{STR_VAR_1} was\nunaffected.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"); +const u8 gText_RepeatedAppeal[] = COMPOUND_STRING("{STR_VAR_1} disappointed\nby repeating an appeal.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"); +const u8 gText_MonsXWentOverGreat[] = COMPOUND_STRING("{STR_VAR_1}'s {STR_VAR_3}\nwent over great.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"); +const u8 gText_MonsXDidntGoOverWell[] = COMPOUND_STRING("{STR_VAR_1}'s {STR_VAR_3}\ndidn't go over well here…{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"); +const u8 gText_MonsXGotTheCrowdGoing[] = COMPOUND_STRING("{STR_VAR_1}'s {STR_VAR_3}\ngot the crowd going.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"); +const u8 gText_MonCantAppealNextTurn[] = COMPOUND_STRING("{STR_VAR_1} can't appeal\nnext turn…{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"); +const u8 gText_AttractedCrowdsAttention[] = COMPOUND_STRING("It attracted the crowd's\nattention.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"); +const u8 gText_CrowdContinuesToWatchMon[] = COMPOUND_STRING("The crowd continues to\nwatch {STR_VAR_3}.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"); +const u8 gText_MonsMoveIsIgnored[] = COMPOUND_STRING("{STR_VAR_1}'s\n{STR_VAR_2} is ignored.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"); static const u8 sSliderHeartYPositions[CONTESTANT_COUNT] = { @@ -688,84 +710,57 @@ static const u16 sText_Pal[] = INCBIN_U16("graphics/contest/text.gbapal"); #include "data/contest_text_tables.h" -const u8 *const gContestEffectDescriptionPointers[] = -{ - [CONTEST_EFFECT_HIGHLY_APPEALING] = COMPOUND_STRING("A highly appealing move."), - [CONTEST_EFFECT_USER_MORE_EASILY_STARTLED] = COMPOUND_STRING("After this move, the user is\nmore easily startled."), - [CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES] = COMPOUND_STRING("Makes a great appeal, but\nallows no more to the end."), - [CONTEST_EFFECT_REPETITION_NOT_BORING] = COMPOUND_STRING("Can be repeatedly used\nwithout boring the JUDGE."), - [CONTEST_EFFECT_AVOID_STARTLE_ONCE] = COMPOUND_STRING("Can avoid being startled\nby others once."), - [CONTEST_EFFECT_AVOID_STARTLE] = COMPOUND_STRING("Can avoid being startled\nby others."), - [CONTEST_EFFECT_AVOID_STARTLE_SLIGHTLY] = COMPOUND_STRING("Can avoid being startled\nby others a little."), - [CONTEST_EFFECT_USER_LESS_EASILY_STARTLED] = COMPOUND_STRING("After this move, the user is\nless likely to be startled."), - [CONTEST_EFFECT_STARTLE_FRONT_MON] = COMPOUND_STRING("Slightly startles the\nPOKΓ©MON in front."), - [CONTEST_EFFECT_SLIGHTLY_STARTLE_PREV_MONS] = COMPOUND_STRING("Slightly startles those\nthat have made appeals."), - [CONTEST_EFFECT_STARTLE_PREV_MON] = COMPOUND_STRING("Startles the POKΓ©MON that\nappealed before the user."), - [CONTEST_EFFECT_STARTLE_PREV_MONS] = COMPOUND_STRING("Startles all POKΓ©MON that\nhave done their appeals."), - [CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON] = COMPOUND_STRING("Badly startles the\nPOKΓ©MON in front."), - [CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS] = COMPOUND_STRING("Badly startles those that\nhave made appeals."), - [CONTEST_EFFECT_STARTLE_PREV_MON_2] = COMPOUND_STRING("Startles the POKΓ©MON that\nappealed before the user."), - [CONTEST_EFFECT_STARTLE_PREV_MONS_2] = COMPOUND_STRING("Startles all POKΓ©MON that\nhave done their appeals."), - [CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION] = COMPOUND_STRING("Shifts the JUDGE's\nattention from others."), - [CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION] = COMPOUND_STRING("Startles the POKΓ©MON that\nhas the JUDGE's attention."), - [CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN] = COMPOUND_STRING("Jams the others, and misses\none turn of appeals."), - [CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL] = COMPOUND_STRING("Startles POKΓ©MON that\nmade a same-type appeal."), - [CONTEST_EFFECT_STARTLE_MONS_COOL_APPEAL] = COMPOUND_STRING("Badly startles POKΓ©MON\nthat made COOL appeals."), - [CONTEST_EFFECT_STARTLE_MONS_BEAUTY_APPEAL] = COMPOUND_STRING("Badly startles POKΓ©MON\nthat made BEAUTY appeals."), - [CONTEST_EFFECT_STARTLE_MONS_CUTE_APPEAL] = COMPOUND_STRING("Badly startles POKΓ©MON\nthat made CUTE appeals."), - [CONTEST_EFFECT_STARTLE_MONS_SMART_APPEAL] = COMPOUND_STRING("Badly startles POKΓ©MON\nthat made SMART appeals."), - [CONTEST_EFFECT_STARTLE_MONS_TOUGH_APPEAL] = COMPOUND_STRING("Badly startles POKΓ©MON\nthat made TOUGH appeals."), - [CONTEST_EFFECT_MAKE_FOLLOWING_MON_NERVOUS] = COMPOUND_STRING("Makes one POKΓ©MON after\nthe user nervous."), - [CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS] = COMPOUND_STRING("Makes all POKΓ©MON after\nthe user nervous."), - [CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS] = COMPOUND_STRING("Worsens the condition of\nthose that made appeals."), - [CONTEST_EFFECT_BADLY_STARTLES_MONS_IN_GOOD_CONDITION] = COMPOUND_STRING("Badly startles POKΓ©MON in\ngood condition."), - [CONTEST_EFFECT_BETTER_IF_FIRST] = COMPOUND_STRING("The appeal works great if\nperformed first."), - [CONTEST_EFFECT_BETTER_IF_LAST] = COMPOUND_STRING("The appeal works great if\nperformed last."), - [CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES] = COMPOUND_STRING("Makes the appeal as good\nas those before it."), - [CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE] = COMPOUND_STRING("Makes the appeal as good\nas the one before it."), - [CONTEST_EFFECT_BETTER_WHEN_LATER] = COMPOUND_STRING("The appeal works better\nthe later it is performed."), - [CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING] = COMPOUND_STRING("The appeal's quality varies\ndepending on its timing."), - [CONTEST_EFFECT_BETTER_IF_SAME_TYPE] = COMPOUND_STRING("Works well if it's the same\ntype as the one before."), - [CONTEST_EFFECT_BETTER_IF_DIFF_TYPE] = COMPOUND_STRING("Works well if different in\ntype than the one before."), - [CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL] = COMPOUND_STRING("Affected by how well the\nappeal in front goes."), - [CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS] = COMPOUND_STRING("Ups the user's condition.\nHelps prevent nervousness."), - [CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION] = COMPOUND_STRING("The appeal works well if the\nuser's condition is good."), - [CONTEST_EFFECT_NEXT_APPEAL_EARLIER] = COMPOUND_STRING("The next appeal can be\nmade earlier next turn."), - [CONTEST_EFFECT_NEXT_APPEAL_LATER] = COMPOUND_STRING("The next appeal can be\nmade later next turn."), - [CONTEST_EFFECT_MAKE_SCRAMBLING_TURN_ORDER_EASIER] = COMPOUND_STRING("Makes the next turn's order\nmore easily scrambled."), - [CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER] = COMPOUND_STRING("Scrambles the order of\nappeals on the next turn."), - [CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST] = COMPOUND_STRING("An appeal that excites the\naudience in any CONTEST."), - [CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS] = COMPOUND_STRING("Badly startles all POKΓ©MON\nthat made good appeals."), - [CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED] = COMPOUND_STRING("The appeal works best the\nmore the crowd is excited."), - [CONTEST_EFFECT_DONT_EXCITE_AUDIENCE] = COMPOUND_STRING("Temporarily stops the\ncrowd from growing excited."), -}; - -const u8 *const gContestMoveTypeTextPointers[] = +const struct ContestCategory gContestCategoryInfo[CONTEST_CATEGORIES_COUNT + 1] = { - [CONTEST_CATEGORY_COOL] = COMPOUND_STRING("COOL"), - [CONTEST_CATEGORY_BEAUTY] = COMPOUND_STRING("BEAUTY"), - [CONTEST_CATEGORY_CUTE] = COMPOUND_STRING("CUTE"), - [CONTEST_CATEGORY_SMART] = COMPOUND_STRING("SMART"), - [CONTEST_CATEGORY_TOUGH] = COMPOUND_STRING("TOUGH"), -}; + [CONTEST_CATEGORY_COOL] = + { + .name = COMPOUND_STRING("COOL"), + .condition = COMPOUND_STRING("coolness"), + .generic = COMPOUND_STRING("COOL Move"), + .negativeTrait = COMPOUND_STRING("shyness"), + .palette = 13, + }, -static const u8 *const sContestConditions[] = -{ - [CONTEST_CATEGORY_COOL] = COMPOUND_STRING("coolness"), - [CONTEST_CATEGORY_BEAUTY] = COMPOUND_STRING("beauty"), - [CONTEST_CATEGORY_CUTE] = COMPOUND_STRING("cuteness"), - [CONTEST_CATEGORY_SMART] = COMPOUND_STRING("smartness"), - [CONTEST_CATEGORY_TOUGH] = COMPOUND_STRING("toughness"), -}; + [CONTEST_CATEGORY_BEAUTY] = + { + .name = COMPOUND_STRING("BEAUTY"), + .condition = COMPOUND_STRING("beauty"), + .generic = COMPOUND_STRING("BEAUTY Move"), + .negativeTrait = COMPOUND_STRING("anxiety"), + .palette = 14, + }, -static const u8 *const sInvalidContestMoveNames[] = -{ - [CONTEST_CATEGORY_COOL] = COMPOUND_STRING("COOL Move"), - [CONTEST_CATEGORY_BEAUTY] = COMPOUND_STRING("BEAUTY Move"), - [CONTEST_CATEGORY_CUTE] = COMPOUND_STRING("CUTE Move"), - [CONTEST_CATEGORY_SMART] = COMPOUND_STRING("SMART Move"), - [CONTEST_CATEGORY_TOUGH] = COMPOUND_STRING("TOUGH Move"), - [CONTEST_CATEGORIES_COUNT] = COMPOUND_STRING("???"), + [CONTEST_CATEGORY_CUTE] = + { + .name = COMPOUND_STRING("CUTE"), + .condition = COMPOUND_STRING("cuteness"), + .generic = COMPOUND_STRING("CUTE Move"), + .negativeTrait = COMPOUND_STRING("laziness"), + .palette = 14, + }, + + [CONTEST_CATEGORY_SMART] = + { + .name = COMPOUND_STRING("SMART"), + .condition = COMPOUND_STRING("smartness"), + .generic = COMPOUND_STRING("SMART Move"), + .negativeTrait = COMPOUND_STRING("hesitancy"), + .palette = 15, + }, + + [CONTEST_CATEGORY_TOUGH] = + { + .name = COMPOUND_STRING("TOUGH"), + .condition = COMPOUND_STRING("toughness"), + .generic = COMPOUND_STRING("TOUGH Move"), + .negativeTrait = COMPOUND_STRING("fear"), + .palette = 13, + }, + + [CONTEST_CATEGORIES_COUNT] = + { + .generic = COMPOUND_STRING("???"), + }, }; // Takes the .attentionLevel of a contestant as an index. @@ -1133,8 +1128,8 @@ void LoadContestBgAfterMoveAnim(void) { s32 i; - LZDecompressVram(gContestInterfaceGfx, (void *)VRAM); - LZDecompressVram(gContestAudienceGfx, (void *)(BG_SCREEN_ADDR(4))); + DecompressDataWithHeaderVram(gContestInterfaceGfx, (void *)VRAM); + DecompressDataWithHeaderVram(gContestAudienceGfx, (void *)(BG_SCREEN_ADDR(4))); CopyToBgTilemapBuffer(3, gContestAudienceTilemap, 0, 0); CopyBgTilemapBufferToVram(3); LoadPalette(gContestInterfaceAudiencePalette, BG_PLTT_OFFSET, BG_PLTT_SIZE); @@ -1414,10 +1409,10 @@ static bool8 SetupContestGraphics(u8 *stateVar) RequestDma3Fill(0, (void *)VRAM + 0x10000, 0x8000, 1); break; case 1: - LZDecompressVram(gContestInterfaceGfx, (void *)VRAM); + DecompressDataWithHeaderVram(gContestInterfaceGfx, (void *)VRAM); break; case 2: - LZDecompressVram(gContestAudienceGfx, (void *)(BG_SCREEN_ADDR(4))); + DecompressDataWithHeaderVram(gContestAudienceGfx, (void *)(BG_SCREEN_ADDR(4))); DmaCopyLarge32(3, (void *)(BG_SCREEN_ADDR(4)), eUnzippedContestAudience_Gfx, 0x2000, 0x1000); break; case 3: @@ -1914,7 +1909,7 @@ static void Task_DoAppeals(u8 taskId) if (eContestantStatus[contestant].currMove < MOVES_COUNT) StringCopy(gStringVar2, GetMoveName(eContestantStatus[contestant].currMove)); else - StringCopy(gStringVar2, sInvalidContestMoveNames[eContestantStatus[contestant].moveCategory]); + StringCopy(gStringVar2, gContestCategoryInfo[eContestantStatus[contestant].moveCategory].generic); StringExpandPlaceholders(gStringVar4, gText_MonAppealedWithMove); Contest_StartTextPrinter(gStringVar4, TRUE); gTasks[taskId].tState = APPEALSTATE_WAIT_USED_MOVE_MSG; @@ -2310,7 +2305,7 @@ static void Task_DoAppeals(u8 taskId) } else { - StringCopy(gStringVar3, sContestConditions[GetMoveContestCategory(eContestantStatus[contestant].currMove)]); + StringCopy(gStringVar3, gContestCategoryInfo[GetMoveContestCategory(eContestantStatus[contestant].currMove)].condition); } if (r3 > 0 && eContestantStatus[contestant].repeatedMove) @@ -3330,7 +3325,7 @@ static void PrintContestMoveDescription(u16 move) ContestBG_FillBoxWithTile(0, TILE_FILLED_JAM_HEART, 0x15, 0x20, numHearts, 0x01, 0x11); FillWindowPixelBuffer(WIN_MOVE_DESCRIPTION, PIXEL_FILL(0)); - Contest_PrintTextToBg0WindowStd(WIN_MOVE_DESCRIPTION, gContestEffectDescriptionPointers[GetMoveContestEffect(move)]); + Contest_PrintTextToBg0WindowStd(WIN_MOVE_DESCRIPTION, gContestEffects[GetMoveContestEffect(move)].description); Contest_PrintTextToBg0WindowStd(WIN_SLASH, gText_Slash); } @@ -4559,7 +4554,7 @@ static void CalculateAppealMoveImpact(u8 contestant) && !AreMovesContestCombo(eContestantStatus[contestant].prevMove, eContestantStatus[contestant].currMove)) eContestantStatus[contestant].hasJudgesAttention = FALSE; - gContestEffectFuncs[effect](); + gContestEffects[effect].function(); if (eContestantStatus[contestant].conditionMod == CONDITION_GAIN) eContestantStatus[contestant].appeal += eContestantStatus[contestant].condition - 10; @@ -4664,16 +4659,7 @@ static void PrintAppealMoveResultText(u8 contestant, u8 stringId) { StringCopy(gStringVar1, gContestMons[contestant].nickname); StringCopy(gStringVar2, GetMoveName(eContestantStatus[contestant].currMove)); - if (GetMoveContestCategory(eContestantStatus[eContestAppealResults.contestant].currMove) == CONTEST_CATEGORY_COOL) - StringCopy(gStringVar3, gText_Contest_Shyness); - else if (GetMoveContestCategory(eContestantStatus[eContestAppealResults.contestant].currMove) == CONTEST_CATEGORY_BEAUTY) - StringCopy(gStringVar3, gText_Contest_Anxiety); - else if (GetMoveContestCategory(eContestantStatus[eContestAppealResults.contestant].currMove) == CONTEST_CATEGORY_CUTE) - StringCopy(gStringVar3, gText_Contest_Laziness); - else if (GetMoveContestCategory(eContestantStatus[eContestAppealResults.contestant].currMove) == CONTEST_CATEGORY_SMART) - StringCopy(gStringVar3, gText_Contest_Hesitancy); - else - StringCopy(gStringVar3, gText_Contest_Fear); + StringCopy(gStringVar3, gContestCategoryInfo[GetMoveContestCategory(eContestantStatus[eContestAppealResults.contestant].currMove)].negativeTrait); StringExpandPlaceholders(gStringVar4, sAppealResultTexts[stringId]); ContestClearGeneralTextWindow(); Contest_StartTextPrinter(gStringVar4, TRUE); @@ -5411,7 +5397,7 @@ static void SetMoveSpecificAnimData(u8 contestant) switch (move) { case MOVE_CURSE: - if (gSpeciesInfo[species].types[0] == TYPE_GHOST || gSpeciesInfo[species].types[1] == TYPE_GHOST) + if (GetSpeciesType(species, 0) == TYPE_GHOST || GetSpeciesType(species, 1) == TYPE_GHOST) gAnimMoveTurn = 0; else gAnimMoveTurn = 1; diff --git a/src/contest_ai.c b/src/contest_ai.c index 77f27fcc916a..8d4a347280ae 100644 --- a/src/contest_ai.c +++ b/src/contest_ai.c @@ -1199,7 +1199,7 @@ static void ContestAICmd_if_condition_not_eq(void) static void ContestAICmd_get_used_combo_starter(void) { - u16 result = FALSE; + bool32 result = FALSE; u8 contestant = GetContestantIdByTurn(gAIScriptPtr[1]); if (IsContestantAllowedToCombo(contestant)) diff --git a/src/contest_effect.c b/src/contest_effect.c index 51416ba14a76..3190e9844346 100644 --- a/src/contest_effect.c +++ b/src/contest_effect.c @@ -133,7 +133,7 @@ static void ContestEffect_UserLessEasilyStartled(void) SetContestantEffectStringID(eContestAppealResults.contestant,CONTEST_STRING_STOPPED_CARING); } -// Slightly startles the POKοΏ½MON in front. +// Badly startles the PokΓ©mon in front. static void ContestEffect_StartleFrontMon(void) { u8 idx = 0; @@ -611,6 +611,7 @@ static void ContestEffect_BetterWhenLater(void) } // The appeal's quality varies depending on its timing. +// Despite the name, it seems to be random and not based on timing static void ContestEffect_QualityDependsOnTiming(void) { u8 rval = Random() % 10; diff --git a/src/contest_painting.c b/src/contest_painting.c index cb78caac265c..cbf6fd6297d4 100644 --- a/src/contest_painting.c +++ b/src/contest_painting.c @@ -42,63 +42,38 @@ static void PrintContestPaintingCaption(u8, u8); static void VBlankCB_ContestPainting(void); static void _InitContestMonPixels(u8 *spriteGfx, u16 *palette, u16 (*destPixels)[64][64]); -extern const u8 gContestHallPaintingCaption[]; -extern const u8 gContestCoolness[]; -extern const u8 gContestBeauty[]; -extern const u8 gContestCuteness[]; -extern const u8 gContestSmartness[]; -extern const u8 gContestToughness[]; -extern const u8 gContestRankNormal[]; -extern const u8 gContestRankSuper[]; -extern const u8 gContestRankHyper[]; -extern const u8 gContestRankMaster[]; -extern const u8 gContestLink[]; -extern const u8 gContestPaintingCool1[]; -extern const u8 gContestPaintingCool2[]; -extern const u8 gContestPaintingCool3[]; -extern const u8 gContestPaintingBeauty1[]; -extern const u8 gContestPaintingBeauty2[]; -extern const u8 gContestPaintingBeauty3[]; -extern const u8 gContestPaintingCute1[]; -extern const u8 gContestPaintingCute2[]; -extern const u8 gContestPaintingCute3[]; -extern const u8 gContestPaintingSmart1[]; -extern const u8 gContestPaintingSmart2[]; -extern const u8 gContestPaintingSmart3[]; -extern const u8 gContestPaintingTough1[]; -extern const u8 gContestPaintingTough2[]; -extern const u8 gContestPaintingTough3[]; - -static const u16 sPictureFramePalettes[] = INCBIN_U16("graphics/picture_frame/bg.gbapal"); -static const u8 sPictureFrameTiles_Cool[] = INCBIN_U8("graphics/picture_frame/cool.4bpp.rl"); -static const u8 sPictureFrameTiles_Beauty[] = INCBIN_U8("graphics/picture_frame/beauty.4bpp.rl"); -static const u8 sPictureFrameTiles_Cute[] = INCBIN_U8("graphics/picture_frame/cute.4bpp.rl"); -static const u8 sPictureFrameTiles_Smart[] = INCBIN_U8("graphics/picture_frame/smart.4bpp.rl"); -static const u8 sPictureFrameTiles_Tough[] = INCBIN_U8("graphics/picture_frame/tough.4bpp.rl"); -static const u8 sPictureFrameTiles_HallLobby[] = INCBIN_U8("graphics/picture_frame/lobby.4bpp.rl"); -static const u8 sPictureFrameTilemap_Cool[] = INCBIN_U8("graphics/picture_frame/cool_map.bin.rl"); -static const u8 sPictureFrameTilemap_Beauty[] = INCBIN_U8("graphics/picture_frame/beauty_map.bin.rl"); -static const u8 sPictureFrameTilemap_Cute[] = INCBIN_U8("graphics/picture_frame/cute_map.bin.rl"); -static const u8 sPictureFrameTilemap_Smart[] = INCBIN_U8("graphics/picture_frame/smart_map.bin.rl"); -static const u8 sPictureFrameTilemap_Tough[] = INCBIN_U8("graphics/picture_frame/tough_map.bin.rl"); -static const u8 sPictureFrameTilemap_HallLobby[] = INCBIN_U8("graphics/picture_frame/lobby_map.bin.rl"); +const u8 gContestHallPaintingCaption[] = COMPOUND_STRING("{STR_VAR_1}\n{STR_VAR_2}'s {STR_VAR_3}"); + +static const u16 sPictureFramePalettes[] = INCBIN_U16("graphics/picture_frame/bg.gbapal"); +static const u32 sPictureFrameTiles_Cool[] = INCBIN_U32("graphics/picture_frame/cool.4bpp.smol"); +static const u32 sPictureFrameTiles_Beauty[] = INCBIN_U32("graphics/picture_frame/beauty.4bpp.smol"); +static const u32 sPictureFrameTiles_Cute[] = INCBIN_U32("graphics/picture_frame/cute.4bpp.smol"); +static const u32 sPictureFrameTiles_Smart[] = INCBIN_U32("graphics/picture_frame/smart.4bpp.smol"); +static const u32 sPictureFrameTiles_Tough[] = INCBIN_U32("graphics/picture_frame/tough.4bpp.smol"); +static const u32 sPictureFrameTiles_HallLobby[] = INCBIN_U32("graphics/picture_frame/lobby.4bpp.smol"); +static const u32 sPictureFrameTilemap_Cool[] = INCBIN_U32("graphics/picture_frame/cool_map.bin.smolTM"); +static const u32 sPictureFrameTilemap_Beauty[] = INCBIN_U32("graphics/picture_frame/beauty_map.bin.smolTM"); +static const u32 sPictureFrameTilemap_Cute[] = INCBIN_U32("graphics/picture_frame/cute_map.bin.smolTM"); +static const u32 sPictureFrameTilemap_Smart[] = INCBIN_U32("graphics/picture_frame/smart_map.bin.smolTM"); +static const u32 sPictureFrameTilemap_Tough[] = INCBIN_U32("graphics/picture_frame/tough_map.bin.smolTM"); +static const u32 sPictureFrameTilemap_HallLobby[] = INCBIN_U32("graphics/picture_frame/lobby_map.bin.smolTM"); static const u8 *const sContestCategoryNames_Unused[] = { - [CONTEST_CATEGORY_COOL] = gContestCoolness, - [CONTEST_CATEGORY_BEAUTY] = gContestBeauty, - [CONTEST_CATEGORY_CUTE] = gContestCuteness, - [CONTEST_CATEGORY_SMART] = gContestSmartness, - [CONTEST_CATEGORY_TOUGH] = gContestToughness, + [CONTEST_CATEGORY_COOL] = COMPOUND_STRING("COOLNESS"), + [CONTEST_CATEGORY_BEAUTY] = COMPOUND_STRING("BEAUTY"), + [CONTEST_CATEGORY_CUTE] = COMPOUND_STRING("CUTENESS"), + [CONTEST_CATEGORY_SMART] = COMPOUND_STRING("SMARTNESS"), + [CONTEST_CATEGORY_TOUGH] = COMPOUND_STRING("TOUGHNESS"), }; static const u8 *const sContestRankNames[] = { - [CONTEST_RANK_NORMAL] = gContestRankNormal, - [CONTEST_RANK_SUPER] = gContestRankSuper, - [CONTEST_RANK_HYPER] = gContestRankHyper, - [CONTEST_RANK_MASTER] = gContestRankMaster, - [CONTEST_RANK_LINK] = gContestLink, + [CONTEST_RANK_NORMAL] = COMPOUND_STRING("NORMAL RANK"), + [CONTEST_RANK_SUPER] = COMPOUND_STRING("SUPER RANK"), + [CONTEST_RANK_HYPER] = COMPOUND_STRING("HYPER RANK"), + [CONTEST_RANK_MASTER] = COMPOUND_STRING("MASTER RANK"), + [CONTEST_RANK_LINK] = COMPOUND_STRING("LINK"), }; static const struct BgTemplate sBgTemplates[] = @@ -127,21 +102,21 @@ static const struct WindowTemplate sWindowTemplate = static const u8 *const sMuseumCaptions[NUM_PAINTING_CAPTIONS * CONTEST_CATEGORIES_COUNT] = { - [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_COOL] = gContestPaintingCool1, - [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_COOL] = gContestPaintingCool2, - [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_COOL] = gContestPaintingCool3, - [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_BEAUTY] = gContestPaintingBeauty1, - [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_BEAUTY] = gContestPaintingBeauty2, - [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_BEAUTY] = gContestPaintingBeauty3, - [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_CUTE] = gContestPaintingCute1, - [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_CUTE] = gContestPaintingCute2, - [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_CUTE] = gContestPaintingCute3, - [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_SMART] = gContestPaintingSmart1, - [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_SMART] = gContestPaintingSmart2, - [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_SMART] = gContestPaintingSmart3, - [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_TOUGH] = gContestPaintingTough1, - [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_TOUGH] = gContestPaintingTough2, - [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_TOUGH] = gContestPaintingTough3, + [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_COOL] = COMPOUND_STRING("Nonstop supercool--\nthe inestimable {STR_VAR_1}"), + [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_COOL] = COMPOUND_STRING("Hey, there!\nThe good-looking POKΓ©MON {STR_VAR_1}"), + [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_COOL] = COMPOUND_STRING("The marvelous, wonderful, and\nvery great {STR_VAR_1}"), + [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_BEAUTY] = COMPOUND_STRING("This century's last Venus--\nthe beautiful {STR_VAR_1}"), + [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_BEAUTY] = COMPOUND_STRING("{STR_VAR_1}'s dazzling,\nglittering smile"), + [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_BEAUTY] = COMPOUND_STRING("POKΓ©MON CENTER's super idol--\nthe incomparable {STR_VAR_1}"), + [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_CUTE] = COMPOUND_STRING("The lovely and sweet {STR_VAR_1}"), + [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_CUTE] = COMPOUND_STRING("The pretty {STR_VAR_1}'s\nwinning portrait"), + [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_CUTE] = COMPOUND_STRING("Give us a wink!\nThe cutie POKΓ©MON {STR_VAR_1}"), + [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_SMART] = COMPOUND_STRING("The smartness maestro--\nthe wise POKΓ©MON {STR_VAR_1}"), + [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_SMART] = COMPOUND_STRING("{STR_VAR_1}--the one chosen\nabove all POKΓ©MON"), + [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_SMART] = COMPOUND_STRING("The excellent {STR_VAR_1}'s\nmoment of elegance"), + [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_TOUGH] = COMPOUND_STRING("The powerfully muscular\nspeedster {STR_VAR_1}"), + [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_TOUGH] = COMPOUND_STRING("The strong, stronger, and\nstrongest {STR_VAR_1}"), + [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_TOUGH] = COMPOUND_STRING("The mighty tough\nhyper POKΓ©MON {STR_VAR_1}"), }; static const struct OamData sContestPaintingMonOamData = @@ -424,24 +399,24 @@ static void LoadContestPaintingFrame(u8 contestWinnerId, bool8 isForArtist) switch (gContestPaintingWinner->contestCategory / NUM_PAINTING_CAPTIONS) { case CONTEST_CATEGORY_COOL: - RLUnCompVram(sPictureFrameTiles_Cool, (void *)VRAM); - RLUnCompWram(sPictureFrameTilemap_Cool, gContestMonPixels); + DecompressDataWithHeaderVram(sPictureFrameTiles_Cool, (void *)VRAM); + DecompressDataWithHeaderWram(sPictureFrameTilemap_Cool, gContestMonPixels); break; case CONTEST_CATEGORY_BEAUTY: - RLUnCompVram(sPictureFrameTiles_Beauty, (void *)VRAM); - RLUnCompWram(sPictureFrameTilemap_Beauty, gContestMonPixels); + DecompressDataWithHeaderVram(sPictureFrameTiles_Beauty, (void *)VRAM); + DecompressDataWithHeaderWram(sPictureFrameTilemap_Beauty, gContestMonPixels); break; case CONTEST_CATEGORY_CUTE: - RLUnCompVram(sPictureFrameTiles_Cute, (void *)VRAM); - RLUnCompWram(sPictureFrameTilemap_Cute, gContestMonPixels); + DecompressDataWithHeaderVram(sPictureFrameTiles_Cute, (void *)VRAM); + DecompressDataWithHeaderWram(sPictureFrameTilemap_Cute, gContestMonPixels); break; case CONTEST_CATEGORY_SMART: - RLUnCompVram(sPictureFrameTiles_Smart, (void *)VRAM); - RLUnCompWram(sPictureFrameTilemap_Smart, gContestMonPixels); + DecompressDataWithHeaderVram(sPictureFrameTiles_Smart, (void *)VRAM); + DecompressDataWithHeaderWram(sPictureFrameTilemap_Smart, gContestMonPixels); break; case CONTEST_CATEGORY_TOUGH: - RLUnCompVram(sPictureFrameTiles_Tough, (void *)VRAM); - RLUnCompWram(sPictureFrameTilemap_Tough, gContestMonPixels); + DecompressDataWithHeaderVram(sPictureFrameTiles_Tough, (void *)VRAM); + DecompressDataWithHeaderWram(sPictureFrameTilemap_Tough, gContestMonPixels); break; } @@ -466,8 +441,8 @@ static void LoadContestPaintingFrame(u8 contestWinnerId, bool8 isForArtist) else if (contestWinnerId < MUSEUM_CONTEST_WINNERS_START) { // Load Contest Hall lobby frame - RLUnCompVram(sPictureFrameTiles_HallLobby, (void *)VRAM); - RLUnCompVram(sPictureFrameTilemap_HallLobby, (void *)(BG_SCREEN_ADDR(12))); + DecompressDataWithHeaderVram(sPictureFrameTiles_HallLobby, (void *)VRAM); + DecompressDataWithHeaderVram(sPictureFrameTilemap_HallLobby, (void *)(BG_SCREEN_ADDR(12))); } else { @@ -475,24 +450,24 @@ static void LoadContestPaintingFrame(u8 contestWinnerId, bool8 isForArtist) switch (gContestPaintingWinner->contestCategory / NUM_PAINTING_CAPTIONS) { case CONTEST_CATEGORY_COOL: - RLUnCompVram(sPictureFrameTiles_Cool, (void *)VRAM); - RLUnCompVram(sPictureFrameTilemap_Cool, (void *)(BG_SCREEN_ADDR(12))); + DecompressDataWithHeaderVram(sPictureFrameTiles_Cool, (void *)VRAM); + DecompressDataWithHeaderVram(sPictureFrameTilemap_Cool, (void *)(BG_SCREEN_ADDR(12))); break; case CONTEST_CATEGORY_BEAUTY: - RLUnCompVram(sPictureFrameTiles_Beauty, (void *)VRAM); - RLUnCompVram(sPictureFrameTilemap_Beauty, (void *)(BG_SCREEN_ADDR(12))); + DecompressDataWithHeaderVram(sPictureFrameTiles_Beauty, (void *)VRAM); + DecompressDataWithHeaderVram(sPictureFrameTilemap_Beauty, (void *)(BG_SCREEN_ADDR(12))); break; case CONTEST_CATEGORY_CUTE: - RLUnCompVram(sPictureFrameTiles_Cute, (void *)VRAM); - RLUnCompVram(sPictureFrameTilemap_Cute, (void *)(BG_SCREEN_ADDR(12))); + DecompressDataWithHeaderVram(sPictureFrameTiles_Cute, (void *)VRAM); + DecompressDataWithHeaderVram(sPictureFrameTilemap_Cute, (void *)(BG_SCREEN_ADDR(12))); break; case CONTEST_CATEGORY_SMART: - RLUnCompVram(sPictureFrameTiles_Smart, (void *)VRAM); - RLUnCompVram(sPictureFrameTilemap_Smart, (void *)(BG_SCREEN_ADDR(12))); + DecompressDataWithHeaderVram(sPictureFrameTiles_Smart, (void *)VRAM); + DecompressDataWithHeaderVram(sPictureFrameTilemap_Smart, (void *)(BG_SCREEN_ADDR(12))); break; case CONTEST_CATEGORY_TOUGH: - RLUnCompVram(sPictureFrameTiles_Tough, (void *)VRAM); - RLUnCompVram(sPictureFrameTilemap_Tough, (void *)(BG_SCREEN_ADDR(12))); + DecompressDataWithHeaderVram(sPictureFrameTiles_Tough, (void *)VRAM); + DecompressDataWithHeaderVram(sPictureFrameTilemap_Tough, (void *)(BG_SCREEN_ADDR(12))); break; } } diff --git a/src/contest_util.c b/src/contest_util.c index 66d0b575fe91..dd7070e9a33a 100644 --- a/src/contest_util.c +++ b/src/contest_util.c @@ -452,7 +452,7 @@ static void LoadContestResultsBgGfx(void) s8 numStars, round2Points; u16 tile1, tile2; - LZDecompressVram(gContestResults_Gfx, (void *)BG_CHAR_ADDR(0)); + DecompressDataWithHeaderVram(gContestResults_Gfx, (void *)BG_CHAR_ADDR(0)); CopyToBgTilemapBuffer(3, gContestResults_Bg_Tilemap, 0, 0); CopyToBgTilemapBuffer(2, gContestResults_Interface_Tilemap, 0, 0); CopyToBgTilemapBuffer(0, gContestResults_WinnerBanner_Tilemap, 0, 0); @@ -964,7 +964,8 @@ static void Task_ShowWinnerMonBanner(u8 taskId) static void Task_SetSeenWinnerMon(u8 taskId) { - int i, nationalDexNum; + int i; + enum NationalDexOrder nationalDexNum; if (JOY_NEW(A_BUTTON)) { @@ -1958,7 +1959,7 @@ void TryEnterContestMon(void) u16 HasMonWonThisContestBefore(void) { - u16 hasRankRibbon = FALSE; + bool32 hasRankRibbon = FALSE; struct Pokemon *mon = &gPlayerParty[gContestMonPartyIndex]; switch (gSpecialVar_ContestCategory) { diff --git a/src/credits.c b/src/credits.c index c06a6fca9b38..bfc2cda12a02 100644 --- a/src/credits.c +++ b/src/credits.c @@ -86,7 +86,7 @@ EWRAM_DATA bool8 gHasHallOfFameRecords = 0; static EWRAM_DATA struct CreditsData *sCreditsData = {0}; static const u16 sCredits_Pal[] = INCBIN_U16("graphics/credits/credits.gbapal"); -static const u32 sCreditsCopyrightEnd_Gfx[] = INCBIN_U32("graphics/credits/the_end_copyright.4bpp.lz"); +static const u32 sCreditsCopyrightEnd_Gfx[] = INCBIN_U32("graphics/credits/the_end_copyright.4bpp.smol"); static void SpriteCB_CreditsMonBg(struct Sprite *); static void Task_WaitPaletteFade(u8); @@ -538,8 +538,8 @@ static void Task_LoadShowMons(u8 taskId) ResetAllPicSprites(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 8; - LZ77UnCompVram(gBirchBagGrass_Gfx, (void *)VRAM); - LZ77UnCompVram(gBirchGrassTilemap, (void *)(BG_SCREEN_ADDR(7))); + DecompressDataWithHeaderVram(gBirchBagGrass_Gfx, (void *)VRAM); + DecompressDataWithHeaderVram(gBirchGrassTilemap, (void *)(BG_SCREEN_ADDR(7))); LoadPalette(gBirchBagGrass_Pal + 1, BG_PLTT_ID(0) + 1, PLTT_SIZEOF(2 * 16 - 1)); for (i = 0; i < MON_PIC_SIZE; i++) @@ -1282,7 +1282,7 @@ static void LoadTheEndScreen(u16 tileOffsetLoad, u16 tileOffsetWrite, u16 palOff u16 baseTile; u16 i; - LZ77UnCompVram(sCreditsCopyrightEnd_Gfx, (void *)(VRAM + tileOffsetLoad)); + DecompressDataWithHeaderVram(sCreditsCopyrightEnd_Gfx, (void *)(VRAM + tileOffsetLoad)); LoadPalette(gIntroCopyright_Pal, palOffset, sizeof(gIntroCopyright_Pal)); baseTile = (palOffset / 16) << 12; @@ -1542,7 +1542,7 @@ static void SpriteCB_CreditsMonBg(struct Sprite *sprite) static void DeterminePokemonToShow(void) { - u16 starter = SpeciesToNationalPokedexNum(GetStarterPokemon(VarGet(VAR_STARTER_MON))); + enum NationalDexOrder starter = SpeciesToNationalPokedexNum(GetStarterPokemon(VarGet(VAR_STARTER_MON))); u16 page; u16 dexNum; u16 j; diff --git a/src/data.c b/src/data.c index f5035262c59b..7b99254a8ea3 100644 --- a/src/data.c +++ b/src/data.c @@ -12,8 +12,8 @@ #include "constants/battle_ai.h" const u16 gMinigameDigits_Pal[] = INCBIN_U16("graphics/link/minigame_digits.gbapal"); -const u32 gMinigameDigits_Gfx[] = INCBIN_U32("graphics/link/minigame_digits.4bpp.lz"); -static const u32 sMinigameDigitsThin_Gfx[] = INCBIN_U32("graphics/link/minigame_digits2.4bpp.lz"); // Unused +const u32 gMinigameDigits_Gfx[] = INCBIN_U32("graphics/link/minigame_digits.4bpp.smol"); +static const u32 sMinigameDigitsThin_Gfx[] = INCBIN_U32("graphics/link/minigame_digits2.4bpp.smol"); // Unused #define BATTLER_OFFSET(i) (gHeap + 0x8000 + MON_PIC_SIZE * (i)) diff --git a/src/data/abilities.h b/src/data/abilities.h index f9a3adc96cd7..95b6a6e59152 100644 --- a/src/data/abilities.h +++ b/src/data/abilities.h @@ -1,4 +1,4 @@ -const struct Ability gAbilitiesInfo[ABILITIES_COUNT] = +const struct AbilityInfo gAbilitiesInfo[ABILITIES_COUNT] = { [ABILITY_NONE] = { @@ -1251,6 +1251,7 @@ const struct Ability gAbilitiesInfo[ABILITIES_COUNT] = .name = _("Flower Veil"), .description = COMPOUND_STRING("Protects Grass-types."), .aiRating = 0, + .breakable = TRUE, }, [ABILITY_CHEEK_POUCH] = @@ -1286,6 +1287,7 @@ const struct Ability gAbilitiesInfo[ABILITIES_COUNT] = { .name = _("Bulletproof"), .description = COMPOUND_STRING("Avoids some projectiles."), + .breakable = TRUE, .aiRating = 7, }, @@ -1413,6 +1415,7 @@ const struct Ability gAbilitiesInfo[ABILITIES_COUNT] = .name = _("Aura Break"), .description = COMPOUND_STRING("Reverse aura abilities."), .aiRating = 3, + .breakable = TRUE, }, [ABILITY_PRIMORDIAL_SEA] = @@ -1495,6 +1498,7 @@ const struct Ability gAbilitiesInfo[ABILITIES_COUNT] = .name = _("Water Bubble"), .description = COMPOUND_STRING("Guards from fire and burns."), .aiRating = 8, + .breakable = TRUE, }, [ABILITY_STEELWORKER] = diff --git a/src/data/apricorns.h b/src/data/apricorns.h new file mode 100644 index 000000000000..4f76f3064864 --- /dev/null +++ b/src/data/apricorns.h @@ -0,0 +1,18 @@ +struct ApricornTree +{ + u8 minimum; + u8 maximum; + enum ApricornType apricornType; +}; + +const struct ApricornTree gApricornTrees[APRICORN_TREE_COUNT] = +{ + #if APRICORN_TREE_COUNT > 0 + [APRICORN_TREE_NONE] = + { + .minimum = 1, + .maximum = 1, + .apricornType = APRICORN_RED, + }, + #endif +}; diff --git a/src/data/battle_anim.h b/src/data/battle_anim.h index 038f338cb21d..2ee7f4f1b58c 100644 --- a/src/data/battle_anim.h +++ b/src/data/battle_anim.h @@ -1468,6 +1468,10 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_PinkVioletOrb, 0x0080, ANIM_TAG_PINKVIO_ORB}, {gBattleAnimSpriteGfx_TeraStarstormBeam, 0x200, ANIM_TAG_STARSTORM}, {gBattleAnimSpriteGfx_SaltParticle, 0x400, ANIM_TAG_SALT_PARTICLE}, + {gBattleAnimSpriteGfx_TeraSymbol, 0x0200, ANIM_TAG_TERA_SYMBOL}, + {gBattleAnimSpriteGfx_TatsugiriCurly, 0x200, ANIM_TAG_TATSUGIRI_CURLY}, + {gBattleAnimSpriteGfx_TatsugiriDroopy, 0x200, ANIM_TAG_TATSUGIRI_DROOPY}, + {gBattleAnimSpriteGfx_TatsugiriStretchy, 0x200, ANIM_TAG_TATSUGIRI_STRETCHY}, }; const struct SpritePalette gBattleAnimPaletteTable[] = @@ -1937,6 +1941,10 @@ const struct SpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_PinkVioletOrb, ANIM_TAG_PINKVIO_ORB}, {gBattleAnimSpritePal_TeraStarstormBeam, ANIM_TAG_STARSTORM}, {gBattleAnimSpritePal_SaltParticle, ANIM_TAG_SALT_PARTICLE}, + {gBattleAnimSpritePal_TeraSymbol, ANIM_TAG_TERA_SYMBOL}, + {gBattleAnimSpritePal_TatsugiriCurly, ANIM_TAG_TATSUGIRI_CURLY}, + {gBattleAnimSpritePal_TatsugiriDroopy, ANIM_TAG_TATSUGIRI_DROOPY}, + {gBattleAnimSpritePal_TatsugiriStretchy, ANIM_TAG_TATSUGIRI_STRETCHY}, }; const struct BattleAnimBackground gBattleAnimBackgroundTable[] = @@ -2023,6 +2031,7 @@ const struct BattleAnimBackground gBattleAnimBackgroundTable[] = [BG_STEEL_BEAM_OPPONENT] = {gBattleAnimBgImage_Highspeed, gBattleAnimBgPalette_SteelBeam, gBattleAnimBgTilemap_HighspeedOpponent}, [BG_STEEL_BEAM_PLAYER] = {gBattleAnimBgImage_Highspeed, gBattleAnimBgPalette_SteelBeam, gBattleAnimBgTilemap_HighspeedPlayer}, [BG_CHLOROBLAST] = {gBattleAnimBgImage_HydroCannon, gBattleAnimBgPalette_Chloroblast, gBattleAnimBgTilemap_HydroCannon}, - [BG_RAINBOW] = {gBattleAnimBgImage_Rainbow, gBattleAnimBGPalette_Rainbow, gBattleAnimBgTilemap_Rainbow}, + [BG_RAINBOW_PLAYER] = {gBattleAnimBgImage_RainbowPlayer, gBattleAnimBGPalette_Rainbow, gBattleAnimBgTilemap_RainbowPlayer}, + [BG_RAINBOW_OPPONENT] = {gBattleAnimBgImage_RainbowOpponent, gBattleAnimBGPalette_Rainbow, gBattleAnimBgTilemap_RainbowOpponent}, [BG_SWAMP] = {gBattleAnimBgImage_Swamp, gBattleAnimBGPalette_Swamp, gBattleAnimBgTilemap_Swamp}, }; diff --git a/src/data/battle_environment.h b/src/data/battle_environment.h new file mode 100644 index 000000000000..5e485ad5b1c3 --- /dev/null +++ b/src/data/battle_environment.h @@ -0,0 +1,432 @@ +const u32 gBattleEnvironmentTiles_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/tiles.4bpp.smol"); +const u16 gBattleEnvironmentPalette_TallGrass[] = INCBIN_U16("graphics/battle_environment/tall_grass/palette.gbapal"); +const u32 gBattleEnvironmentTilemap_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/map.bin.smolTM"); + +const u32 gBattleEnvironmentTiles_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/tiles.4bpp.smol"); +const u16 gBattleEnvironmentPalette_LongGrass[] = INCBIN_U16("graphics/battle_environment/long_grass/palette.gbapal"); +const u32 gBattleEnvironmentTilemap_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/map.bin.smolTM"); + +const u32 gBattleEnvironmentTiles_Sand[] = INCBIN_U32("graphics/battle_environment/sand/tiles.4bpp.smol"); +const u16 gBattleEnvironmentPalette_Sand[] = INCBIN_U16("graphics/battle_environment/sand/palette.gbapal"); +const u32 gBattleEnvironmentTilemap_Sand[] = INCBIN_U32("graphics/battle_environment/sand/map.bin.smolTM"); + +const u32 gBattleEnvironmentTiles_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/tiles.4bpp.smol"); +const u16 gBattleEnvironmentPalette_Underwater[] = INCBIN_U16("graphics/battle_environment/underwater/palette.gbapal"); +const u32 gBattleEnvironmentTilemap_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/map.bin.smolTM"); + +const u32 gBattleEnvironmentTiles_Water[] = INCBIN_U32("graphics/battle_environment/water/tiles.4bpp.smol"); +const u16 gBattleEnvironmentPalette_Water[] = INCBIN_U16("graphics/battle_environment/water/palette.gbapal"); +const u32 gBattleEnvironmentTilemap_Water[] = INCBIN_U32("graphics/battle_environment/water/map.bin.smolTM"); + +const u32 gBattleEnvironmentTiles_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/tiles.4bpp.smol"); +const u16 gBattleEnvironmentPalette_PondWater[] = INCBIN_U16("graphics/battle_environment/pond_water/palette.gbapal"); +const u32 gBattleEnvironmentTilemap_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/map.bin.smolTM"); + +const u32 gBattleEnvironmentTiles_Rock[] = INCBIN_U32("graphics/battle_environment/rock/tiles.4bpp.smol"); +const u16 gBattleEnvironmentPalette_Rock[] = INCBIN_U16("graphics/battle_environment/rock/palette.gbapal"); +const u32 gBattleEnvironmentTilemap_Rock[] = INCBIN_U32("graphics/battle_environment/rock/map.bin.smolTM"); + +const u32 gBattleEnvironmentTiles_Cave[] = INCBIN_U32("graphics/battle_environment/cave/tiles.4bpp.smol"); +const u16 gBattleEnvironmentPalette_Cave[] = INCBIN_U16("graphics/battle_environment/cave/palette.gbapal"); +const u32 gBattleEnvironmentTilemap_Cave[] = INCBIN_U32("graphics/battle_environment/cave/map.bin.smolTM"); + +const u16 gBattleEnvironmentPalette_Plain[] = INCBIN_U16("graphics/battle_environment/plain/palette.gbapal"); + +const u32 gBattleEnvironmentTiles_Building[] = INCBIN_U32("graphics/battle_environment/building/tiles.4bpp.smol"); +const u16 gBattleEnvironmentPalette_Frontier[] = INCBIN_U16("graphics/battle_environment/stadium/battle_frontier.gbapal"); // this is also used for link battles +const u32 gBattleEnvironmentTilemap_Building[] = INCBIN_U32("graphics/battle_environment/building/map.bin.smolTM"); + +#define ENVIRONMENT_BACKGROUND(background) \ +{ \ + .tileset = gBattleEnvironmentTiles_##background, \ + .tilemap = gBattleEnvironmentTilemap_##background, \ + .entryTileset = gBattleEnvironmentAnimTiles_##background, \ + .entryTilemap = gBattleEnvironmentAnimTilemap_##background, \ + .palette = gBattleEnvironmentPalette_##background, \ +} + +const struct BattleEnvironment gBattleEnvironmentInfo[BATTLE_ENVIRONMENT_COUNT] = +{ + [BATTLE_ENVIRONMENT_GRASS] = + { + #if B_NATURE_POWER_MOVES >= GEN_6 + .naturePower = MOVE_ENERGY_BALL, + #elif B_NATURE_POWER_MOVES >= GEN_4 + .naturePower = MOVE_SEED_BOMB, + #else + .naturePower = MOVE_STUN_SPORE, + #endif + .secretPowerEffect = B_SECRET_POWER_EFFECT >= GEN_4 ? MOVE_EFFECT_SLEEP : MOVE_EFFECT_POISON, + .camouflageType = TYPE_GRASS, + .background = ENVIRONMENT_BACKGROUND(TallGrass), + }, + + [BATTLE_ENVIRONMENT_LONG_GRASS] = + { + #if B_NATURE_POWER_MOVES >= GEN_6 + .naturePower = MOVE_ENERGY_BALL, + #elif B_NATURE_POWER_MOVES >= GEN_4 + .naturePower = MOVE_SEED_BOMB, + #else + .naturePower = MOVE_RAZOR_LEAF, + #endif + .secretPowerEffect = MOVE_EFFECT_SLEEP, + .camouflageType = TYPE_GRASS, + .background = ENVIRONMENT_BACKGROUND(LongGrass), + }, + + [BATTLE_ENVIRONMENT_SAND] = + { + .naturePower = B_NATURE_POWER_MOVES >= GEN_6 ? MOVE_EARTH_POWER : MOVE_EARTHQUAKE, + .secretPowerEffect = MOVE_EFFECT_ACC_MINUS_1, + .camouflageType = TYPE_GROUND, + .background = ENVIRONMENT_BACKGROUND(Sand), + }, + + [BATTLE_ENVIRONMENT_UNDERWATER] = + { + .naturePower = MOVE_HYDRO_PUMP, + .secretPowerEffect = B_SECRET_POWER_EFFECT >= GEN_6 ? MOVE_EFFECT_ATK_MINUS_1 : MOVE_EFFECT_DEF_MINUS_1, + .camouflageType = TYPE_WATER, + .background = ENVIRONMENT_BACKGROUND(Underwater), + }, + + [BATTLE_ENVIRONMENT_WATER] = + { + .naturePower = B_NATURE_POWER_MOVES >= GEN_4 ? MOVE_HYDRO_PUMP : MOVE_SURF, + .secretPowerEffect = MOVE_EFFECT_ATK_MINUS_1, + .camouflageType = TYPE_WATER, + .background = ENVIRONMENT_BACKGROUND(Water), + }, + + [BATTLE_ENVIRONMENT_POND] = + { + .naturePower = B_NATURE_POWER_MOVES >= GEN_4 ? MOVE_HYDRO_PUMP : MOVE_BUBBLE_BEAM, + .secretPowerEffect = B_SECRET_POWER_EFFECT >= GEN_4 ? MOVE_EFFECT_ATK_MINUS_1 : MOVE_EFFECT_SPD_MINUS_1, + .camouflageType = TYPE_WATER, + .background = ENVIRONMENT_BACKGROUND(PondWater), + }, + + [BATTLE_ENVIRONMENT_MOUNTAIN] = + { + #if B_NATURE_POWER_MOVES >= GEN_6 + .naturePower = MOVE_EARTH_POWER, + #elif B_NATURE_POWER_MOVES >= GEN_5 + .naturePower = MOVE_EARTHQUAKE, + #else + .naturePower = MOVE_ROCK_SLIDE, + #endif + #if B_SECRET_POWER_EFFECT >= GEN_5 + .secretPowerEffect = MOVE_EFFECT_ACC_MINUS_1, + #elif B_SECRET_POWER_EFFECT >= GEN_4 + .secretPowerEffect = MOVE_EFFECT_FLINCH, + #else + .secretPowerEffect = MOVE_EFFECT_CONFUSION, + #endif + .camouflageType = B_CAMOUFLAGE_TYPES >= GEN_5 ? TYPE_GROUND : TYPE_ROCK, + .background = ENVIRONMENT_BACKGROUND(Rock), + }, + + [BATTLE_ENVIRONMENT_CAVE] = + { + #if B_NATURE_POWER_MOVES >= GEN_6 + .naturePower = MOVE_POWER_GEM, + #elif B_NATURE_POWER_MOVES >= GEN_4 + .naturePower = MOVE_ROCK_SLIDE, + #else + .naturePower = MOVE_SHADOW_BALL, + #endif + .secretPowerEffect = MOVE_EFFECT_FLINCH, + .camouflageType = TYPE_ROCK, + .background = ENVIRONMENT_BACKGROUND(Cave), + }, + + [BATTLE_ENVIRONMENT_BUILDING] = + { + .naturePower = B_NATURE_POWER_MOVES >= GEN_4 ? MOVE_TRI_ATTACK : MOVE_SWIFT, + .secretPowerEffect = MOVE_EFFECT_PARALYSIS, + .camouflageType = TYPE_NORMAL, + .background = ENVIRONMENT_BACKGROUND(Building), + }, + + [BATTLE_ENVIRONMENT_PLAIN] = + { + #if B_NATURE_POWER_MOVES >= GEN_6 + .naturePower = MOVE_TRI_ATTACK, + #elif B_NATURE_POWER_MOVES >= GEN_4 + .naturePower = MOVE_EARTHQUAKE, + #else + .naturePower = MOVE_SWIFT, + #endif + .secretPowerEffect = (B_SECRET_POWER_EFFECT == GEN_4 || B_SECRET_POWER_EFFECT == GEN_5) ? MOVE_EFFECT_ACC_MINUS_1 : MOVE_EFFECT_PARALYSIS, + .camouflageType = (B_CAMOUFLAGE_TYPES == GEN_4 || B_CAMOUFLAGE_TYPES == GEN_5) ? TYPE_GROUND : TYPE_NORMAL, + .background = + { + .tileset = gBattleEnvironmentTiles_Building, + .tilemap = gBattleEnvironmentTilemap_Building, + .entryTileset = gBattleEnvironmentAnimTiles_Building, + .entryTilemap = gBattleEnvironmentAnimTilemap_Building, + .palette = gBattleEnvironmentPalette_Plain, + }, + }, + + [BATTLE_ENVIRONMENT_FRONTIER] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Building, + .tilemap = gBattleEnvironmentTilemap_Building, + .entryTileset = gBattleEnvironmentAnimTiles_Building, + .entryTilemap = gBattleEnvironmentAnimTilemap_Building, + .palette = gBattleEnvironmentPalette_Frontier, + }, + }, + + [BATTLE_ENVIRONMENT_GYM] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Building, + .tilemap = gBattleEnvironmentTilemap_Building, + .entryTileset = gBattleEnvironmentAnimTiles_Building, + .entryTilemap = gBattleEnvironmentAnimTilemap_Building, + .palette = gBattleEnvironmentPalette_BuildingGym, + }, + }, + + [BATTLE_ENVIRONMENT_LEADER] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Building, + .tilemap = gBattleEnvironmentTilemap_Building, + .entryTileset = gBattleEnvironmentAnimTiles_Building, + .entryTilemap = gBattleEnvironmentAnimTilemap_Building, + .palette = gBattleEnvironmentPalette_BuildingLeader, + }, + }, + + [BATTLE_ENVIRONMENT_MAGMA] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Stadium, + .tilemap = gBattleEnvironmentTilemap_Stadium, + .entryTileset = gBattleEnvironmentAnimTiles_Building, + .entryTilemap = gBattleEnvironmentAnimTilemap_Building, + .palette = gBattleEnvironmentPalette_StadiumMagma, + }, + }, + + [BATTLE_ENVIRONMENT_AQUA] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Stadium, + .tilemap = gBattleEnvironmentTilemap_Stadium, + .entryTileset = gBattleEnvironmentAnimTiles_Building, + .entryTilemap = gBattleEnvironmentAnimTilemap_Building, + .palette = gBattleEnvironmentPalette_StadiumAqua, + }, + }, + + [BATTLE_ENVIRONMENT_SIDNEY] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Stadium, + .tilemap = gBattleEnvironmentTilemap_Stadium, + .entryTileset = gBattleEnvironmentAnimTiles_Building, + .entryTilemap = gBattleEnvironmentAnimTilemap_Building, + .palette = gBattleEnvironmentPalette_StadiumSidney, + }, + }, + + [BATTLE_ENVIRONMENT_PHOEBE] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Stadium, + .tilemap = gBattleEnvironmentTilemap_Stadium, + .entryTileset = gBattleEnvironmentAnimTiles_Building, + .entryTilemap = gBattleEnvironmentAnimTilemap_Building, + .palette = gBattleEnvironmentPalette_StadiumPhoebe, + }, + }, + + [BATTLE_ENVIRONMENT_GLACIA] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Stadium, + .tilemap = gBattleEnvironmentTilemap_Stadium, + .entryTileset = gBattleEnvironmentAnimTiles_Building, + .entryTilemap = gBattleEnvironmentAnimTilemap_Building, + .palette = gBattleEnvironmentPalette_StadiumGlacia, + }, + }, + + [BATTLE_ENVIRONMENT_DRAKE] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Stadium, + .tilemap = gBattleEnvironmentTilemap_Stadium, + .entryTileset = gBattleEnvironmentAnimTiles_Building, + .entryTilemap = gBattleEnvironmentAnimTilemap_Building, + .palette = gBattleEnvironmentPalette_StadiumDrake, + }, + }, + + [BATTLE_ENVIRONMENT_CHAMPION] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Stadium, + .tilemap = gBattleEnvironmentTilemap_Stadium, + .entryTileset = gBattleEnvironmentAnimTiles_Building, + .entryTilemap = gBattleEnvironmentAnimTilemap_Building, + .palette = gBattleEnvironmentPalette_StadiumWallace, + }, + }, + + [BATTLE_ENVIRONMENT_GROUDON] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Cave, + .tilemap = gBattleEnvironmentTilemap_Cave, + .entryTileset = gBattleEnvironmentAnimTiles_Cave, + .entryTilemap = gBattleEnvironmentAnimTilemap_Cave, + .palette = gBattleEnvironmentPalette_Groudon, + }, + }, + + [BATTLE_ENVIRONMENT_KYOGRE] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Water, + .tilemap = gBattleEnvironmentTilemap_Water, + .entryTileset = gBattleEnvironmentAnimTiles_Underwater, + .entryTilemap = gBattleEnvironmentAnimTilemap_Underwater, + .palette = gBattleEnvironmentPalette_Kyogre, + }, + }, + + [BATTLE_ENVIRONMENT_RAYQUAZA] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Rayquaza, + .tilemap = gBattleEnvironmentTilemap_Rayquaza, + .entryTileset = gBattleEnvironmentAnimTiles_Rayquaza, + .entryTilemap = gBattleEnvironmentAnimTilemap_Rayquaza, + .palette = gBattleEnvironmentPalette_Rayquaza, + }, + }, + + [BATTLE_ENVIRONMENT_SOARING] = + { + .naturePower = MOVE_AIR_SLASH, + .secretPowerEffect = MOVE_EFFECT_SPD_MINUS_1, + .camouflageType = TYPE_FLYING, + }, + + [BATTLE_ENVIRONMENT_SKY_PILLAR] = + { + .naturePower = MOVE_AIR_SLASH, + .secretPowerEffect = MOVE_EFFECT_SPD_MINUS_1, + .camouflageType = TYPE_FLYING, + }, + + [BATTLE_ENVIRONMENT_BURIAL_GROUND] = + { + .naturePower = MOVE_SHADOW_BALL, + .secretPowerEffect = MOVE_EFFECT_FLINCH, + .camouflageType = TYPE_GHOST, + }, + + [BATTLE_ENVIRONMENT_PUDDLE] = + { + .naturePower = MOVE_MUD_BOMB, + .secretPowerEffect = B_SECRET_POWER_EFFECT >= GEN_5 ? MOVE_EFFECT_SPD_MINUS_1 : MOVE_EFFECT_ACC_MINUS_1, + .camouflageType = TYPE_GROUND, + }, + + [BATTLE_ENVIRONMENT_MARSH] = + { + .naturePower = MOVE_MUD_BOMB, + .secretPowerEffect = MOVE_EFFECT_SPD_MINUS_1, + .camouflageType = TYPE_GROUND, + }, + + [BATTLE_ENVIRONMENT_SWAMP] = + { + .naturePower = MOVE_MUD_BOMB, + .secretPowerEffect = MOVE_EFFECT_SPD_MINUS_1, + .camouflageType = TYPE_GROUND, + }, + + [BATTLE_ENVIRONMENT_SNOW] = + { + #if B_NATURE_POWER_MOVES >= GEN_7 + .naturePower = MOVE_ICE_BEAM, + #elif B_NATURE_POWER_MOVES >= GEN_6 + .naturePower = MOVE_FROST_BREATH, + #else + .naturePower = MOVE_BLIZZARD, + #endif + .secretPowerEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE, + .camouflageType = TYPE_ICE, + }, + + [BATTLE_ENVIRONMENT_ICE] = + { + .naturePower = MOVE_ICE_BEAM, + .secretPowerEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE, + .camouflageType = TYPE_ICE, + }, + + [BATTLE_ENVIRONMENT_VOLCANO] = + { + .naturePower = MOVE_LAVA_PLUME, + .secretPowerEffect = MOVE_EFFECT_BURN, + .camouflageType = TYPE_FIRE, + }, + + [BATTLE_ENVIRONMENT_DISTORTION_WORLD] = + { + .naturePower = MOVE_TRI_ATTACK, + .secretPowerEffect = MOVE_EFFECT_PARALYSIS, + .camouflageType = TYPE_NORMAL, + }, + + [BATTLE_ENVIRONMENT_SPACE] = + { + .naturePower = MOVE_DRACO_METEOR, + .secretPowerEffect = MOVE_EFFECT_FLINCH, + .camouflageType = TYPE_DRAGON, + }, + + [BATTLE_ENVIRONMENT_ULTRA_SPACE] = + { + .naturePower = MOVE_PSYSHOCK, + .secretPowerEffect = MOVE_EFFECT_DEF_MINUS_1, + .camouflageType = TYPE_PSYCHIC, + }, +}; + +static const struct { + u8 mapScene; + u8 battleEnvironment; +} sMapBattleSceneMapping[] = { + {MAP_BATTLE_SCENE_GYM, BATTLE_ENVIRONMENT_GYM}, + {MAP_BATTLE_SCENE_MAGMA, BATTLE_ENVIRONMENT_MAGMA}, + {MAP_BATTLE_SCENE_AQUA, BATTLE_ENVIRONMENT_AQUA}, + {MAP_BATTLE_SCENE_SIDNEY, BATTLE_ENVIRONMENT_SIDNEY}, + {MAP_BATTLE_SCENE_PHOEBE, BATTLE_ENVIRONMENT_PHOEBE}, + {MAP_BATTLE_SCENE_GLACIA, BATTLE_ENVIRONMENT_GLACIA}, + {MAP_BATTLE_SCENE_DRAKE, BATTLE_ENVIRONMENT_DRAKE}, + {MAP_BATTLE_SCENE_FRONTIER, BATTLE_ENVIRONMENT_FRONTIER} +}; diff --git a/src/data/battle_frontier/battle_pyramid_wild_requirements.h b/src/data/battle_frontier/battle_pyramid_wild_requirements.h index fd5695344ac8..6679905f58b5 100644 --- a/src/data/battle_frontier/battle_pyramid_wild_requirements.h +++ b/src/data/battle_frontier/battle_pyramid_wild_requirements.h @@ -5,9 +5,9 @@ struct BattlePyramidRequirement { const u16 *moves; /* use moves instead of effects so we don't need to find moves with said effect in our loop */ - u16 abilities[10]; + enum Ability abilities[10]; u8 nAbilities; - u8 type; + enum Type type; u8 nMoves; const u16 *evoItems; u8 nEvoItems; diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index dfca0c5232a6..24ed815aa236 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -20,6 +20,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectNonVolatileStatus, .battleTvScore = 0, // Handled within the battle TV functions + .encourageEncore = TRUE, }, [EFFECT_ABSORB] = @@ -34,6 +35,12 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, + [EFFECT_MISTY_EXPLOSION] = + { + .battleScript = BattleScript_EffectExplosion, + .battleTvScore = 0, // TODO: Assign points + }, + [EFFECT_DREAM_EATER] = { .battleScript = BattleScript_EffectDreamEater, @@ -43,7 +50,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_MIRROR_MOVE] = { - .battleScript = BattleScript_EffectMirrorMove, + .battleScript = BattleScript_EffectHit, .battleTvScore = 1, }, @@ -203,20 +210,26 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 7, }, + [EFFECT_SHEER_COLD] = + { + .battleScript = BattleScript_EffectOHKO, + .battleTvScore = 7, + }, + [EFFECT_FUSION_COMBO] = { .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, - [EFFECT_SUPER_FANG] = + [EFFECT_FIXED_PERCENT_DAMAGE] = { .battleScript = BattleScript_EffectHit, .battleTvScore = 5, .encourageEncore = TRUE, }, - [EFFECT_FIXED_DAMAGE_ARG] = + [EFFECT_FIXED_HP_DAMAGE] = { .battleScript = BattleScript_EffectHit, .battleTvScore = 1, @@ -386,7 +399,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_METRONOME] = { - .battleScript = BattleScript_EffectMetronome, + .battleScript = BattleScript_EffectHit, .battleTvScore = 1, }, @@ -490,7 +503,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_SLEEP_TALK] = { - .battleScript = BattleScript_EffectSleepTalk, + .battleScript = BattleScript_EffectHit, .battleTvScore = 3, .encourageEncore = TRUE, }, @@ -565,6 +578,12 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, + [EFFECT_LUNAR_DANCE] = + { + .battleScript = BattleScript_EffectHealingWish, + .battleTvScore = 0, // TODO: Assign points + }, + [EFFECT_PROTECT] = { .battleScript = BattleScript_EffectProtect, @@ -807,14 +826,14 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_FIRST_TURN_ONLY] = { - .battleScript = BattleScript_EffectFirstTurnOnly, + .battleScript = BattleScript_EffectHit, .battleTvScore = 4, .encourageEncore = TRUE, }, [EFFECT_UPROAR] = { - .battleScript = BattleScript_EffectUproar, + .battleScript = BattleScript_EffectHit, .battleTvScore = 4, }, @@ -839,9 +858,9 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .encourageEncore = TRUE, }, - [EFFECT_WORRY_SEED] = + [EFFECT_OVERWRITE_ABILITY] = { - .battleScript = BattleScript_EffectWorrySeed, + .battleScript = BattleScript_EffectOverwriteAbility, .battleTvScore = 0, // TODO: Assign points .encourageEncore = TRUE, }, @@ -899,7 +918,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_NATURE_POWER] = { - .battleScript = BattleScript_EffectNaturePower, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, @@ -944,7 +963,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_ASSIST] = { - .battleScript = BattleScript_EffectAssist, + .battleScript = BattleScript_EffectHit, .battleTvScore = 2, }, @@ -992,6 +1011,12 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 2, }, + [EFFECT_STEAL_ITEM] = + { + .battleScript = BattleScript_EffectHit, + .battleTvScore = 3, + }, + [EFFECT_ENDEAVOR] = { .battleScript = BattleScript_EffectEndeavor, @@ -1374,13 +1399,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_SUCKER_PUNCH] = { - .battleScript = BattleScript_EffectSuckerPunch, - .battleTvScore = 0, // TODO: Assign points - }, - - [EFFECT_SIMPLE_BEAM] = - { - .battleScript = BattleScript_EffectSimpleBeam, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, @@ -1468,7 +1487,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_ME_FIRST] = { - .battleScript = BattleScript_EffectMeFirst, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, @@ -1513,7 +1532,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_LAST_RESORT] = { - .battleScript = BattleScript_EffectLastResort, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, @@ -1564,7 +1583,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_FINAL_GAMBIT] = { - .battleScript = BattleScript_EffectFinalGambit, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, @@ -1583,7 +1602,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_COPYCAT] = { - .battleScript = BattleScript_EffectCopycat, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, @@ -1703,7 +1722,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_MAT_BLOCK] = { - .battleScript = BattleScript_EffectMatBlock, + .battleScript = BattleScript_EffectProtect, .battleTvScore = 0, // TODO: Assign points .encourageEncore = TRUE, }, @@ -1756,7 +1775,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_FAIL_IF_NOT_ARG_TYPE] = { - .battleScript = BattleScript_FailIfNotArgType, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, @@ -1786,12 +1805,6 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, - [EFFECT_RELIC_SONG] = - { - .battleScript = BattleScript_EffectRelicSong, - .battleTvScore = 0, // TODO: Assign points - }, - [EFFECT_BODY_PRESS] = { .battleScript = BattleScript_EffectHit, @@ -1869,7 +1882,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_AURA_WHEEL] = { - .battleScript = BattleScript_EffectAuraWheel, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, @@ -1960,12 +1973,6 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, - [EFFECT_MIND_BLOWN] = - { - .battleScript = BattleScript_EffectHit, - .battleTvScore = 0, // TODO: Assign points - }, - [EFFECT_CHLOROBLAST] = { .battleScript = BattleScript_EffectHit, @@ -1978,12 +1985,6 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, - [EFFECT_HIT_SET_REMOVE_TERRAIN] = - { - .battleScript = BattleScript_EffectHitSetRemoveTerrain, - .battleTvScore = 0, // TODO: Assign points - }, - [EFFECT_DARK_VOID] = { .battleScript = BattleScript_EffectDarkVoid, @@ -2127,7 +2128,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_UPPER_HAND] = { - .battleScript = BattleScript_EffectUpperHand, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points .encourageEncore = TRUE, }, @@ -2177,12 +2178,6 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, - [EFFECT_GUARDIAN_OF_ALOLA] = - { - .battleScript = BattleScript_DamageToQuarterTargetHP, - .battleTvScore = 0, // TODO: Assign points - }, - [EFFECT_SHELL_SIDE_ARM] = { .battleScript = BattleScript_EffectHit, @@ -2218,4 +2213,34 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, + + [EFFECT_LIFE_DEW] = + { + .battleScript = BattleScript_EffectLifeDew, + .battleTvScore = 0, // TODO: Assign points + }, + + [EFFECT_ICE_SPINNER] = + { + .battleScript = BattleScript_EffectHit, + .battleTvScore = 0, // TODO: Assign points + }, + + [EFFECT_STEEL_ROLLER] = + { + .battleScript = BattleScript_EffectHit, + .battleTvScore = 0, // TODO: Assign points + }, + + [EFFECT_STONE_AXE] = + { + .battleScript = BattleScript_EffectHit, + .battleTvScore = 0, // TODO: Assign points + }, + + [EFFECT_CEASELESS_EDGE] = + { + .battleScript = BattleScript_EffectHit, + .battleTvScore = 0, // TODO: Assign points + }, }; diff --git a/src/data/battle_partners.h b/src/data/battle_partners.h deleted file mode 100644 index 34e30ea083df..000000000000 --- a/src/data/battle_partners.h +++ /dev/null @@ -1,105 +0,0 @@ -// -// DO NOT MODIFY THIS FILE! It is auto-generated from src/data/battle_partners.party -// -// If you want to modify this file set COMPETITIVE_PARTY_SYNTAX to FALSE -// in include/config/general.h and remove this notice. -// Use sed -i '/^#line/d' 'src/data/battle_partners.h' to remove #line markers. -// - -#line 1 "src/data/battle_partners.party" - -#line 1 - [DIFFICULTY_NORMAL][PARTNER_NONE] = - { -#line 3 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 4 - .trainerPic = TRAINER_BACK_PIC_BRENDAN, - .encounterMusic_gender = -#line 6 - TRAINER_ENCOUNTER_MUSIC_MALE, - .partySize = 0, - .party = (const struct TrainerMon[]) - { - }, - }, -#line 8 - [DIFFICULTY_NORMAL][PARTNER_STEVEN] = - { -#line 9 - .trainerName = _("STEVEN"), -#line 10 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 11 - .trainerPic = TRAINER_BACK_PIC_STEVEN, - .encounterMusic_gender = -#line 13 - TRAINER_ENCOUNTER_MUSIC_MALE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 15 - .species = SPECIES_METANG, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 19 - .ev = TRAINER_PARTY_EVS(0, 252, 252, 0, 6, 0), -#line 18 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 17 - .lvl = 42, -#line 16 - .nature = NATURE_BRAVE, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 20 - MOVE_LIGHT_SCREEN, - MOVE_PSYCHIC, - MOVE_REFLECT, - MOVE_METAL_CLAW, - }, - }, - { -#line 25 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 29 - .ev = TRAINER_PARTY_EVS(252, 0, 0, 0, 6, 252), -#line 28 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 27 - .lvl = 43, -#line 26 - .nature = NATURE_IMPISH, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 30 - MOVE_TOXIC, - MOVE_AERIAL_ACE, - MOVE_PROTECT, - MOVE_STEEL_WING, - }, - }, - { -#line 35 - .species = SPECIES_AGGRON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 39 - .ev = TRAINER_PARTY_EVS(0, 252, 0, 0, 252, 6), -#line 38 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 37 - .lvl = 44, -#line 36 - .nature = NATURE_ADAMANT, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 40 - MOVE_THUNDER, - MOVE_PROTECT, - MOVE_SOLAR_BEAM, - MOVE_DRAGON_CLAW, - }, - }, - }, - }, diff --git a/src/data/battle_partners.party b/src/data/battle_partners.party index e1ecfe35faaf..8de1dc0f2b45 100644 --- a/src/data/battle_partners.party +++ b/src/data/battle_partners.party @@ -4,6 +4,7 @@ Class: Pkmn Trainer 1 Pic: Brendan Gender: Male Music: Male +Back Pic: Brendan === PARTNER_STEVEN === Name: STEVEN @@ -11,6 +12,8 @@ Class: Rival Pic: Steven Gender: Male Music: Male +Back Pic: Steven +AI: Basic Trainer Metang Brave Nature diff --git a/src/data/battle_pool_rules.h b/src/data/battle_pool_rules.h index b88db3c797cf..eefb101f5520 100644 --- a/src/data/battle_pool_rules.h +++ b/src/data/battle_pool_rules.h @@ -12,6 +12,8 @@ const struct PoolRules defaultPoolRules = .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, .itemClause = B_POOL_RULE_ITEM_CLAUSE, .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, + .megaStoneClause = B_POOL_RULE_MEGA_STONE_CLAUSE, + .zCrystalClause = B_POOL_RULE_Z_CRYSTAL_CLAUSE, }; const struct PoolRules gPoolRulesetsList[] = { @@ -20,6 +22,8 @@ const struct PoolRules gPoolRulesetsList[] = { .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, .itemClause = B_POOL_RULE_ITEM_CLAUSE, .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, + .megaStoneClause = B_POOL_RULE_MEGA_STONE_CLAUSE, + .zCrystalClause = B_POOL_RULE_Z_CRYSTAL_CLAUSE, .tagMaxMembers[POOL_TAG_LEAD] = 1, .tagMaxMembers[POOL_TAG_ACE] = 1, }, @@ -28,6 +32,8 @@ const struct PoolRules gPoolRulesetsList[] = { .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, .itemClause = B_POOL_RULE_ITEM_CLAUSE, .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, + .megaStoneClause = B_POOL_RULE_MEGA_STONE_CLAUSE, + .zCrystalClause = B_POOL_RULE_Z_CRYSTAL_CLAUSE, .tagMaxMembers[POOL_TAG_LEAD] = 2, .tagMaxMembers[POOL_TAG_ACE] = 2, }, @@ -36,6 +42,8 @@ const struct PoolRules gPoolRulesetsList[] = { .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, .itemClause = B_POOL_RULE_ITEM_CLAUSE, .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, + .megaStoneClause = B_POOL_RULE_MEGA_STONE_CLAUSE, + .zCrystalClause = B_POOL_RULE_Z_CRYSTAL_CLAUSE, .tagMaxMembers[POOL_TAG_LEAD] = 1, .tagMaxMembers[POOL_TAG_ACE] = 1, .tagMaxMembers[POOL_TAG_WEATHER_SETTER] = 1, @@ -48,6 +56,8 @@ const struct PoolRules gPoolRulesetsList[] = { .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, .itemClause = B_POOL_RULE_ITEM_CLAUSE, .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, + .megaStoneClause = B_POOL_RULE_MEGA_STONE_CLAUSE, + .zCrystalClause = B_POOL_RULE_Z_CRYSTAL_CLAUSE, .tagMaxMembers[POOL_TAG_LEAD] = 2, .tagMaxMembers[POOL_TAG_ACE] = 2, .tagMaxMembers[POOL_TAG_WEATHER_SETTER] = 1, @@ -60,6 +70,8 @@ const struct PoolRules gPoolRulesetsList[] = { .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, .itemClause = B_POOL_RULE_ITEM_CLAUSE, .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, + .megaStoneClause = B_POOL_RULE_MEGA_STONE_CLAUSE, + .zCrystalClause = B_POOL_RULE_Z_CRYSTAL_CLAUSE, .tagMaxMembers[POOL_TAG_LEAD] = 2, .tagMaxMembers[POOL_TAG_ACE] = 2, .tagMaxMembers[POOL_TAG_SUPPORT] = 1, diff --git a/src/data/contest_moves.h b/src/data/contest_moves.h index ce88430bb6c2..39d6abbd5227 100644 --- a/src/data/contest_moves.h +++ b/src/data/contest_moves.h @@ -2,342 +2,422 @@ const struct ContestEffect gContestEffects[] = { [CONTEST_EFFECT_HIGHLY_APPEALING] = { + #if C_UPDATED_MOVE_EFFECTS >= GEN_6 + .description = COMPOUND_STRING("Quite the appealing move."), + #else + .description = COMPOUND_STRING("A highly appealing move."), + #endif .effectType = CONTEST_EFFECT_TYPE_APPEAL, .appeal = 40, .jam = 0, + .function = ContestEffect_HighlyAppealing, }, [CONTEST_EFFECT_USER_MORE_EASILY_STARTLED] = { + .description = COMPOUND_STRING("After this move, the user is\nmore easily startled."), .effectType = CONTEST_EFFECT_TYPE_APPEAL, .appeal = 60, .jam = 0, + .function = ContestEffect_UserMoreEasilyStartled, }, [CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES] = { + .description = COMPOUND_STRING("Makes a great appeal, but\nallows no more to the end."), .effectType = CONTEST_EFFECT_TYPE_APPEAL, .appeal = 80, .jam = 0, + .function = ContestEffect_GreatAppealButNoMoreMoves, }, [CONTEST_EFFECT_REPETITION_NOT_BORING] = { + .description = COMPOUND_STRING("Can be repeatedly used\nwithout boring the JUDGE."), .effectType = CONTEST_EFFECT_TYPE_APPEAL, .appeal = 30, .jam = 0, + .function = ContestEffect_RepetitionNotBoring, }, [CONTEST_EFFECT_AVOID_STARTLE_ONCE] = { + .description = COMPOUND_STRING("Can avoid being startled\nby others once."), .effectType = CONTEST_EFFECT_TYPE_AVOID_STARTLE, .appeal = 20, .jam = 0, + .function = ContestEffect_AvoidStartleOnce, }, [CONTEST_EFFECT_AVOID_STARTLE] = { + .description = COMPOUND_STRING("Can avoid being startled\nby others."), .effectType = CONTEST_EFFECT_TYPE_AVOID_STARTLE, .appeal = 10, .jam = 0, + .function = ContestEffect_AvoidStartle, }, [CONTEST_EFFECT_AVOID_STARTLE_SLIGHTLY] = { + .description = COMPOUND_STRING("Can avoid being startled\nby others a little."), .effectType = CONTEST_EFFECT_TYPE_AVOID_STARTLE, .appeal = 30, .jam = 0, + .function = ContestEffect_AvoidStartleSlightly, }, [CONTEST_EFFECT_USER_LESS_EASILY_STARTLED] = { + .description = COMPOUND_STRING("After this move, the user is\nless likely to be startled."), .effectType = CONTEST_EFFECT_TYPE_AVOID_STARTLE, .appeal = 30, .jam = 0, + .function = ContestEffect_UserLessEasilyStartled, }, [CONTEST_EFFECT_STARTLE_FRONT_MON] = { + .description = COMPOUND_STRING("Slightly startles the\nPOKΓ©MON in front."), .effectType = CONTEST_EFFECT_TYPE_STARTLE_MON, .appeal = 30, .jam = 20, + .function = ContestEffect_StartleFrontMon, }, [CONTEST_EFFECT_SLIGHTLY_STARTLE_PREV_MONS] = { + .description = COMPOUND_STRING("Slightly startles those\nthat have made appeals."), .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 30, .jam = 10, + .function = ContestEffect_StartlePrevMons, }, [CONTEST_EFFECT_STARTLE_PREV_MON] = { + #if C_UPDATED_MOVE_EFFECTS >= GEN_6 + .description = COMPOUND_STRING("Startles the last PokΓ©mon\nto act before the user."), + #else + .description = COMPOUND_STRING("Startles the POKΓ©MON that\nappealed before the user."), + #endif .effectType = CONTEST_EFFECT_TYPE_STARTLE_MON, .appeal = 20, .jam = 30, + .function = ContestEffect_StartleFrontMon, }, [CONTEST_EFFECT_STARTLE_PREV_MONS] = { + #if C_UPDATED_MOVE_EFFECTS >= GEN_6 + .description = COMPOUND_STRING("Startles all of the PokΓ©mon\nto act before the user."), + #else + .description = COMPOUND_STRING("Startles all POKΓ©MON that\nhave done their appeals."), + #endif .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 20, .jam = 20, + .function = ContestEffect_StartlePrevMons, }, [CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON] = { + .description = COMPOUND_STRING("Badly startles the\nPOKΓ©MON in front."), .effectType = CONTEST_EFFECT_TYPE_STARTLE_MON, .appeal = 10, .jam = 40, + .function = ContestEffect_StartleFrontMon, }, [CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS] = { + .description = COMPOUND_STRING("Badly startles those that\nhave made appeals."), .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 10, .jam = 30, + .function = ContestEffect_StartlePrevMons, }, [CONTEST_EFFECT_STARTLE_PREV_MON_2] = { + .description = COMPOUND_STRING("Startles the POKΓ©MON that\nappealed before the user."), .effectType = CONTEST_EFFECT_TYPE_STARTLE_MON, .appeal = 30, .jam = 20, + .function = ContestEffect_StartlePrevMon2, }, [CONTEST_EFFECT_STARTLE_PREV_MONS_2] = { + .description = COMPOUND_STRING("Startles all POKΓ©MON that\nhave done their appeals."), .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 30, .jam = 10, + .function = ContestEffect_StartlePrevMons2, }, [CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION] = { + #if C_UPDATED_MOVE_EFFECTS >= GEN_6 + .description = COMPOUND_STRING("Makes audience expect\nlittle of other contestants."), + #else + .description = COMPOUND_STRING("Shifts the JUDGE's\nattention from others."), + #endif .effectType = CONTEST_EFFECT_TYPE_WORSEN, .appeal = 30, .jam = 0, + .function = ContestEffect_ShiftJudgeAttention, }, [CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION] = { + .description = COMPOUND_STRING("Startles the POKΓ©MON that\nhas the JUDGE's attention."), .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 20, .jam = 10, + .function = ContestEffect_StartleMonWithJudgesAttention, }, [CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN] = { + .description = COMPOUND_STRING("Jams the others, and misses\none turn of appeals."), .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 40, .jam = 40, + .function = ContestEffect_JamsOthersButMissOneTurn, }, [CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL] = { + .description = COMPOUND_STRING("Startles POKΓ©MON that\nmade a same-type appeal."), .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 20, .jam = 10, + .function = ContestEffect_StartleMonsSameTypeAppeal, }, [CONTEST_EFFECT_STARTLE_MONS_COOL_APPEAL] = { + .description = COMPOUND_STRING("Badly startles POKΓ©MON\nthat made COOL appeals."), .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 20, .jam = 10, + .function = ContestEffect_StartleMonsCoolAppeal, }, [CONTEST_EFFECT_STARTLE_MONS_BEAUTY_APPEAL] = { + .description = COMPOUND_STRING("Badly startles POKΓ©MON\nthat made BEAUTY appeals."), .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 20, .jam = 10, + .function = ContestEffect_StartleMonsBeautyAppeal, }, [CONTEST_EFFECT_STARTLE_MONS_CUTE_APPEAL] = { + .description = COMPOUND_STRING("Badly startles POKΓ©MON\nthat made CUTE appeals."), .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 20, .jam = 10, + .function = ContestEffect_StartleMonsCuteAppeal, }, [CONTEST_EFFECT_STARTLE_MONS_SMART_APPEAL] = { + .description = COMPOUND_STRING("Badly startles POKΓ©MON\nthat made SMART appeals."), .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 20, .jam = 10, + .function = ContestEffect_StartleMonsSmartAppeal, }, [CONTEST_EFFECT_STARTLE_MONS_TOUGH_APPEAL] = { + .description = COMPOUND_STRING("Badly startles POKΓ©MON\nthat made TOUGH appeals."), .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 20, .jam = 10, + .function = ContestEffect_StartleMonsToughAppeal, }, [CONTEST_EFFECT_MAKE_FOLLOWING_MON_NERVOUS] = { + .description = COMPOUND_STRING("Makes one POKΓ©MON after\nthe user nervous."), .effectType = CONTEST_EFFECT_TYPE_WORSEN, .appeal = 20, .jam = 0, + .function = ContestEffect_MakeFollowingMonNervous, }, [CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS] = { + #if C_UPDATED_MOVE_EFFECTS >= GEN_6 + .description = COMPOUND_STRING("Makes the remaining\nPokΓ©mon nervous."), + #else + .description = COMPOUND_STRING("Makes all POKΓ©MON after\nthe user nervous."), + #endif .effectType = CONTEST_EFFECT_TYPE_WORSEN, .appeal = 20, .jam = 0, + .function = ContestEffect_MakeFollowingMonsNervous, }, [CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS] = { + .description = COMPOUND_STRING("Worsens the condition of\nthose that made appeals."), .effectType = CONTEST_EFFECT_TYPE_WORSEN, .appeal = 30, .jam = 0, + .function = ContestEffect_WorsenConditionOfPrevMons, }, [CONTEST_EFFECT_BADLY_STARTLES_MONS_IN_GOOD_CONDITION] = { + .description = COMPOUND_STRING("Badly startles POKΓ©MON in\ngood condition."), .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 30, .jam = 10, + .function = ContestEffect_BadlyStartlesMonsInGoodCondition, }, [CONTEST_EFFECT_BETTER_IF_FIRST] = { + .description = COMPOUND_STRING("The appeal works great if\nperformed first."), .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 20, .jam = 0, + .function = ContestEffect_BetterIfFirst, }, [CONTEST_EFFECT_BETTER_IF_LAST] = { + .description = COMPOUND_STRING("The appeal works great if\nperformed last."), .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 20, .jam = 0, + .function = ContestEffect_BetterIfLast, }, [CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES] = { + .description = COMPOUND_STRING("Makes the appeal as good\nas those before it."), .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 10, .jam = 0, + .function = ContestEffect_AppealAsGoodAsPrevOnes, }, [CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE] = { + .description = COMPOUND_STRING("Makes the appeal as good\nas the one before it."), .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 10, .jam = 0, + .function = ContestEffect_AppealAsGoodAsPrevOne, }, [CONTEST_EFFECT_BETTER_WHEN_LATER] = { + .description = COMPOUND_STRING("The appeal works better\nthe later it is performed."), .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 10, .jam = 0, + .function = ContestEffect_BetterWhenLater, }, [CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING] = { + #if C_UPDATED_MOVE_EFFECTS >= GEN_6 + .description = COMPOUND_STRING("Effectiveness varies\ndepending on when it is used."), + #else + .description = COMPOUND_STRING("The appeal's quality varies\ndepending on its timing."), + #endif .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 10, .jam = 0, + .function = ContestEffect_QualityDependsOnTiming, }, [CONTEST_EFFECT_BETTER_IF_SAME_TYPE] = { + .description = COMPOUND_STRING("Works well if it's the same\ntype as the one before."), .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 20, .jam = 0, + .function = ContestEffect_BetterIfSameType, }, [CONTEST_EFFECT_BETTER_IF_DIFF_TYPE] = { + .description = COMPOUND_STRING("Works well if different in\ntype than the one before."), .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 20, .jam = 0, + .function = ContestEffect_BetterIfDiffType, }, [CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL] = { + #if C_UPDATED_MOVE_EFFECTS >= GEN_6 + .description = COMPOUND_STRING("Affected by how well the\nprevious PokΓ©mon's move went."), + #else + .description = COMPOUND_STRING("Affected by how well the\nappeal in front goes."), + #endif .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 30, .jam = 0, + .function = ContestEffect_AffectedByPrevAppeal, }, [CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS] = { + .description = COMPOUND_STRING("Ups the user's condition.\nHelps prevent nervousness."), .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 10, .jam = 0, + .function = ContestEffect_ImproveConditionPreventNervousness, }, [CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION] = { + .description = COMPOUND_STRING("The appeal works well if the\nuser's condition is good."), .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 10, .jam = 0, + .function = ContestEffect_BetterWithGoodCondition, }, [CONTEST_EFFECT_NEXT_APPEAL_EARLIER] = { + #if C_UPDATED_MOVE_EFFECTS >= GEN_6 + .description = COMPOUND_STRING("Causes the user to move\nearlier on the next turn."), + #else + .description = COMPOUND_STRING("The next appeal can be\nmade earlier next turn."), + #endif .effectType = CONTEST_EFFECT_TYPE_TURN_ORDER, .appeal = 30, .jam = 0, + .function = ContestEffect_NextAppealEarlier, }, [CONTEST_EFFECT_NEXT_APPEAL_LATER] = { + #if C_UPDATED_MOVE_EFFECTS >= GEN_6 + .description = COMPOUND_STRING("Causes the user to move\nlater on the next turn."), + #else + .description = COMPOUND_STRING("The next appeal can be\nmade later next turn."), + #endif .effectType = CONTEST_EFFECT_TYPE_TURN_ORDER, .appeal = 30, .jam = 0, + .function = ContestEffect_NextAppealLater, }, [CONTEST_EFFECT_MAKE_SCRAMBLING_TURN_ORDER_EASIER] = { + .description = COMPOUND_STRING("Makes the next turn's order\nmore easily scrambled."), .effectType = CONTEST_EFFECT_TYPE_TURN_ORDER, .appeal = 30, .jam = 0, + .function = ContestEffect_MakeScramblingTurnOrderEasier, }, [CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER] = { + .description = COMPOUND_STRING("Scrambles the order of\nappeals on the next turn."), .effectType = CONTEST_EFFECT_TYPE_TURN_ORDER, .appeal = 30, .jam = 0, + .function = ContestEffect_ScrambleNextTurnOrder, }, [CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST] = { + .description = COMPOUND_STRING("An appeal that excites the\naudience in any CONTEST."), .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, - .appeal = 10, + .appeal = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? 20 : 10, .jam = 0, + .function = ContestEffect_ExciteAudienceInAnyContest, }, [CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS] = { + .description = COMPOUND_STRING("Badly startles all POKΓ©MON\nthat made good appeals."), .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 20, .jam = 10, + .function = ContestEffect_BadlyStartleMonsWithGoodAppeals, }, [CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED] = { + .description = COMPOUND_STRING("The appeal works best the\nmore the crowd is excited."), .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 10, .jam = 0, + .function = ContestEffect_BetterWhenAudienceExcited, }, [CONTEST_EFFECT_DONT_EXCITE_AUDIENCE] = { + .description = COMPOUND_STRING("Temporarily stops the\ncrowd from growing excited."), .effectType = CONTEST_EFFECT_TYPE_WORSEN, .appeal = 30, .jam = 0, + .function = ContestEffect_DontExciteAudience, }, }; - -void (*const gContestEffectFuncs[])(void) = -{ - ContestEffect_HighlyAppealing, - ContestEffect_UserMoreEasilyStartled, - ContestEffect_GreatAppealButNoMoreMoves, - ContestEffect_RepetitionNotBoring, - ContestEffect_AvoidStartleOnce, - ContestEffect_AvoidStartle, - ContestEffect_AvoidStartleSlightly, - ContestEffect_UserLessEasilyStartled, - ContestEffect_StartleFrontMon, - ContestEffect_StartlePrevMons, - ContestEffect_StartleFrontMon, - ContestEffect_StartlePrevMons, - ContestEffect_StartleFrontMon, - ContestEffect_StartlePrevMons, - ContestEffect_StartlePrevMon2, - ContestEffect_StartlePrevMons2, - ContestEffect_ShiftJudgeAttention, - ContestEffect_StartleMonWithJudgesAttention, - ContestEffect_JamsOthersButMissOneTurn, - ContestEffect_StartleMonsSameTypeAppeal, - ContestEffect_StartleMonsCoolAppeal, - ContestEffect_StartleMonsBeautyAppeal, - ContestEffect_StartleMonsCuteAppeal, - ContestEffect_StartleMonsSmartAppeal, - ContestEffect_StartleMonsToughAppeal, - ContestEffect_MakeFollowingMonNervous, - ContestEffect_MakeFollowingMonsNervous, - ContestEffect_WorsenConditionOfPrevMons, - ContestEffect_BadlyStartlesMonsInGoodCondition, - ContestEffect_BetterIfFirst, - ContestEffect_BetterIfLast, - ContestEffect_AppealAsGoodAsPrevOnes, - ContestEffect_AppealAsGoodAsPrevOne, - ContestEffect_BetterWhenLater, - ContestEffect_QualityDependsOnTiming, - ContestEffect_BetterIfSameType, - ContestEffect_BetterIfDiffType, - ContestEffect_AffectedByPrevAppeal, - ContestEffect_ImproveConditionPreventNervousness, - ContestEffect_BetterWithGoodCondition, - ContestEffect_NextAppealEarlier, - ContestEffect_NextAppealLater, - ContestEffect_MakeScramblingTurnOrderEasier, - ContestEffect_ScrambleNextTurnOrder, - ContestEffect_ExciteAudienceInAnyContest, - ContestEffect_BadlyStartleMonsWithGoodAppeals, - ContestEffect_BetterWhenAudienceExcited, - ContestEffect_DontExciteAudience, -}; diff --git a/src/data/contest_text_tables.h b/src/data/contest_text_tables.h index 3560b2af04d6..6de163b1b53a 100644 --- a/src/data/contest_text_tables.h +++ b/src/data/contest_text_tables.h @@ -1,151 +1,73 @@ #include "global.h" // sAppealResultTexts -extern const u8 gText_BecameMoreConsciousOfOtherMons[]; -extern const u8 gText_MonCantMakeAnAppealAfterThis[]; -extern const u8 gText_SettledDownJustLittleBit[]; -extern const u8 gText_BecameObliviousToOtherMons[]; -extern const u8 gText_BecameLessAwareOfOtherMons[]; -extern const u8 gText_StoppedCaringAboutOtherMons[]; -extern const u8 gText_TriedToStartleOtherMons[]; -extern const u8 gText_TriedToDazzleOthers[]; -extern const u8 gText_JudgeLookedAwayFromMon[]; -extern const u8 gText_TriedToUnnerveNextMon[]; -extern const u8 gText_MonBecameNervous[]; -extern const u8 gText_AppealTriedToUnnerveWaitingMons[]; -extern const u8 gText_TauntedMonsDoingWell[]; -extern const u8 gText_MonRegainedItsForm[]; -extern const u8 gText_TriedToJamMonDoingWell[]; -extern const u8 gText_StandoutMonHustledEvenMore[]; -extern const u8 gText_LargelyUnnoticedMonWorkedHard[]; -extern const u8 gText_WorkedAsMuchAsMonBefore[]; -extern const u8 gText_WorkedAsMuchAsPrecedingMon[]; -extern const u8 gText_MonsAppealWasDud[]; -extern const u8 gText_MonsAppealDidNotGoWell[]; -extern const u8 gText_MonsAppealDidNotGoWell2[]; -extern const u8 gText_MonsAppealDidNotGoWell3[]; -extern const u8 gText_MonsAppealDidNotWorkVeryWell[]; -extern const u8 gText_MonsAppealWentSlightlyWell[]; -extern const u8 gText_MonsAppealWentSlightlyWell2[]; -extern const u8 gText_MonsAppealWentPrettyWell[]; -extern const u8 gText_MonsAppealWentPrettyWell2[]; -extern const u8 gText_MonsAppealWentVeryWell[]; -extern const u8 gText_MonsAppealWentExcellently[]; -extern const u8 gText_MonsAppealWentExcellently2[]; -extern const u8 gText_SameTypeAsOneBeforeGood[]; -extern const u8 gText_NotSameTypeAsOneBeforeGood[]; -extern const u8 gText_StoodOutMuchMoreThanMonBefore[]; -extern const u8 gText_DidntDoAsWellAsMonBefore[]; -extern const u8 gText_MonsConditionRoseAboveUsual[]; -extern const u8 gText_MonsHotStatusMadeGreatAppeal[]; -extern const u8 gText_MovedUpInLineForNextAppeal[]; -extern const u8 gText_MovedBackInLineForNextAppeal[]; -extern const u8 gText_ScrambledUpOrderForNextTurn[]; extern const u8 gText_JudgeLookedAtMonExpectantly[]; extern const u8 gText_AppealComboWentOverWell[]; extern const u8 gText_AppealComboWentOverVeryWell[]; extern const u8 gText_AppealComboWentOverExcellently[]; -extern const u8 gText_MonManagedToAvertGaze[]; -extern const u8 gText_MonManagedToAvoidSeeingIt[]; -extern const u8 gText_MonIsntFazedByThatSortOfThing[]; -extern const u8 gText_MonBecameALittleDistracted[]; -extern const u8 gText_TriedToStartleOtherPokemon[]; -extern const u8 gText_MonLookedDownOutOfDistraction[]; -extern const u8 gText_MonTurnedBackOutOfDistraction[]; -extern const u8 gText_MonCouldntHelpUtteringCry[]; -extern const u8 gText_MonCouldntHelpLeapingUp[]; -extern const u8 gText_MonTrippedOutOfDistraction[]; -extern const u8 gText_ButItMessedUp2[]; -extern const u8 gText_ButItFailedToMakeTargetNervous[]; -extern const u8 gText_ButItFailedToMakeAnyoneNervous[]; -extern const u8 gText_ButItWasIgnored[]; -extern const u8 gText_CouldntImproveItsCondition[]; -extern const u8 gText_BadConditionResultedInWeakAppeal[]; -extern const u8 gText_MonWasUnaffected[]; -extern const u8 gText_AttractedCrowdsAttention[]; - -// Misc, used directly -extern const u8 gText_MonAppealedWithMove[]; -extern const u8 gText_MonCantAppealNextTurn[]; -extern const u8 gText_RepeatedAppeal[]; -extern const u8 gText_MonsXDidntGoOverWell[]; -extern const u8 gText_MonsXWentOverGreat[]; -extern const u8 gText_MonsXGotTheCrowdGoing[]; -extern const u8 gText_CrowdContinuesToWatchMon[]; -extern const u8 gText_MonsMoveIsIgnored[]; -extern const u8 gText_MonWasTooNervousToMove[]; -extern const u8 gText_MonWasWatchingOthers[]; -extern const u8 gText_AllOutOfAppealTime[]; -extern const u8 gText_Contest_Shyness[]; -extern const u8 gText_Contest_Anxiety[]; -extern const u8 gText_Contest_Laziness[]; -extern const u8 gText_Contest_Hesitancy[]; -extern const u8 gText_Contest_Fear[]; -extern const u8 gText_AppealNumWhichMoveWillBePlayed[]; -extern const u8 gText_AppealNumButItCantParticipate[]; static const u8 *const sAppealResultTexts[] = { - [CONTEST_STRING_MORE_CONSCIOUS] = gText_BecameMoreConsciousOfOtherMons, - [CONTEST_STRING_NO_APPEAL] = gText_MonCantMakeAnAppealAfterThis, - [CONTEST_STRING_SETTLE_DOWN] = gText_SettledDownJustLittleBit, - [CONTEST_STRING_OBLIVIOUS_TO_OTHERS] = gText_BecameObliviousToOtherMons, - [CONTEST_STRING_LESS_AWARE] = gText_BecameLessAwareOfOtherMons, - [CONTEST_STRING_STOPPED_CARING] = gText_StoppedCaringAboutOtherMons, - [CONTEST_STRING_STARTLE_ATTEMPT] = gText_TriedToStartleOtherMons, - [CONTEST_STRING_DAZZLE_ATTEMPT] = gText_TriedToDazzleOthers, - [CONTEST_STRING_JUDGE_LOOK_AWAY2] = gText_JudgeLookedAwayFromMon, - [CONTEST_STRING_UNNERVE_ATTEMPT] = gText_TriedToUnnerveNextMon, - [CONTEST_STRING_NERVOUS] = gText_MonBecameNervous, - [CONTEST_STRING_UNNERVE_WAITING] = gText_AppealTriedToUnnerveWaitingMons, - [CONTEST_STRING_TAUNT_WELL] = gText_TauntedMonsDoingWell, - [CONTEST_STRING_REGAINED_FORM] = gText_MonRegainedItsForm, - [CONTEST_STRING_JAM_WELL] = gText_TriedToJamMonDoingWell, - [CONTEST_STRING_HUSTLE_STANDOUT] = gText_StandoutMonHustledEvenMore, - [CONTEST_STRING_WORK_HARD_UNNOTICED] = gText_LargelyUnnoticedMonWorkedHard, - [CONTEST_STRING_WORK_BEFORE] = gText_WorkedAsMuchAsMonBefore, - [CONTEST_STRING_APPEAL_NOT_WELL] = gText_MonsAppealDidNotGoWell, - [CONTEST_STRING_WORK_PRECEDING] = gText_WorkedAsMuchAsPrecedingMon, - [CONTEST_STRING_APPEAL_NOT_WELL2] = gText_MonsAppealDidNotGoWell2, - [CONTEST_STRING_APPEAL_NOT_SHOWN_WELL] = gText_MonsAppealDidNotGoWell3, - [CONTEST_STRING_APPEAL_SLIGHTLY_WELL] = gText_MonsAppealWentSlightlyWell, - [CONTEST_STRING_APPEAL_PRETTY_WELL] = gText_MonsAppealWentPrettyWell, - [CONTEST_STRING_APPEAL_EXCELLENTLY] = gText_MonsAppealWentExcellently, - [CONTEST_STRING_APPEAL_DUD] = gText_MonsAppealWasDud, - [CONTEST_STRING_APPEAL_NOT_VERY_WELL] = gText_MonsAppealDidNotWorkVeryWell, - [CONTEST_STRING_APPEAL_SLIGHTLY_WELL2] = gText_MonsAppealWentSlightlyWell2, - [CONTEST_STRING_APPEAL_PRETTY_WELL2] = gText_MonsAppealWentPrettyWell2, - [CONTEST_STRING_APPEAL_VERY_WELL] = gText_MonsAppealWentVeryWell, - [CONTEST_STRING_APPEAL_EXCELLENTLY2] = gText_MonsAppealWentExcellently2, - [CONTEST_STRING_SAME_TYPE_GOOD] = gText_SameTypeAsOneBeforeGood, - [CONTEST_STRING_DIFF_TYPE_GOOD] = gText_NotSameTypeAsOneBeforeGood, - [CONTEST_STRING_STOOD_OUT_AS_MUCH] = gText_StoodOutMuchMoreThanMonBefore, - [CONTEST_STRING_NOT_AS_WELL] = gText_DidntDoAsWellAsMonBefore, - [CONTEST_STRING_CONDITION_ROSE] = gText_MonsConditionRoseAboveUsual, - [CONTEST_STRING_HOT_STATUS] = gText_MonsHotStatusMadeGreatAppeal, - [CONTEST_STRING_MOVE_UP_LINE] = gText_MovedUpInLineForNextAppeal, - [CONTEST_STRING_MOVE_BACK_LINE] = gText_MovedBackInLineForNextAppeal, - [CONTEST_STRING_SCRAMBLE_ORDER] = gText_ScrambledUpOrderForNextTurn, + [CONTEST_STRING_MORE_CONSCIOUS] = COMPOUND_STRING("It became more conscious\nof the other POKΓ©MON.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_NO_APPEAL] = COMPOUND_STRING("{STR_VAR_1} can't make an\nappeal after this.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_SETTLE_DOWN] = COMPOUND_STRING("It settled down just a\nlittle bit.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_OBLIVIOUS_TO_OTHERS] = COMPOUND_STRING("It became oblivious to\nthe other POKΓ©MON.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_LESS_AWARE] = COMPOUND_STRING("It became less aware of\nthe other POKΓ©MON.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_STOPPED_CARING] = COMPOUND_STRING("It stopped caring about\nother POKΓ©MON much.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_STARTLE_ATTEMPT] = COMPOUND_STRING("It tried to startle the\nother POKΓ©MON.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_DAZZLE_ATTEMPT] = COMPOUND_STRING("It tried to dazzle the\nothers.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_JUDGE_LOOK_AWAY2] = COMPOUND_STRING("The JUDGE looked away\nfrom {STR_VAR_1}.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_UNNERVE_ATTEMPT] = COMPOUND_STRING("It tried to unnerve the\nnext POKΓ©MON.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_NERVOUS] = COMPOUND_STRING("{STR_VAR_1} became\nnervous.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_UNNERVE_WAITING] = COMPOUND_STRING("The appeal tried to\nunnerve waiting POKΓ©MON.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_TAUNT_WELL] = COMPOUND_STRING("It taunted POKΓ©MON\ndoing well.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_REGAINED_FORM] = COMPOUND_STRING("{STR_VAR_1} regained its\nform.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_JAM_WELL] = COMPOUND_STRING("It tried to jam POKΓ©MON\ndoing well.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_HUSTLE_STANDOUT] = COMPOUND_STRING("The standout {STR_VAR_1}\nhustled even more.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_WORK_HARD_UNNOTICED] = COMPOUND_STRING("The largely unnoticed\n{STR_VAR_1} worked hard.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_WORK_BEFORE] = COMPOUND_STRING("It worked as much as\nPOKΓ©MON before it.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_APPEAL_NOT_WELL] = COMPOUND_STRING("{STR_VAR_1}'s appeal did\nnot go well.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_WORK_PRECEDING] = COMPOUND_STRING("It worked as much as the\npreceding POKΓ©MON.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_APPEAL_NOT_WELL2] = COMPOUND_STRING("{STR_VAR_1}'s appeal did\nnot go well.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_APPEAL_NOT_SHOWN_WELL] = COMPOUND_STRING("{STR_VAR_1}'s appeal did\nnot go well.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_APPEAL_SLIGHTLY_WELL] = COMPOUND_STRING("{STR_VAR_1}'s appeal\nwent slightly well.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_APPEAL_PRETTY_WELL] = COMPOUND_STRING("{STR_VAR_1}'s appeal\nwent pretty well.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_APPEAL_EXCELLENTLY] = COMPOUND_STRING("{STR_VAR_1}'s appeal\nwent excellently.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_APPEAL_DUD] = COMPOUND_STRING("{STR_VAR_1}'s appeal was\na dud.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_APPEAL_NOT_VERY_WELL] = COMPOUND_STRING("{STR_VAR_1}'s appeal did\nnot work very well.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_APPEAL_SLIGHTLY_WELL2] = COMPOUND_STRING("{STR_VAR_1}'s appeal\nwent slightly well.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_APPEAL_PRETTY_WELL2] = COMPOUND_STRING("{STR_VAR_1}'s appeal\nwent pretty well.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_APPEAL_VERY_WELL] = COMPOUND_STRING("{STR_VAR_1}'s appeal\nwent very well.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_APPEAL_EXCELLENTLY2] = COMPOUND_STRING("{STR_VAR_1}'s appeal\nwent excellently.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_SAME_TYPE_GOOD] = COMPOUND_STRING("It's the same type as the\nPOKΓ©MON before--good!{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_DIFF_TYPE_GOOD] = COMPOUND_STRING("It's not the same type as\nthe one before--good!{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_STOOD_OUT_AS_MUCH] = COMPOUND_STRING("It stood out much more\nthan the POKΓ©MON before.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_NOT_AS_WELL] = COMPOUND_STRING("It didn't do as well as the\nPOKΓ©MON before.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_CONDITION_ROSE] = COMPOUND_STRING("{STR_VAR_1}'s condition\nrose above usual.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_HOT_STATUS] = COMPOUND_STRING("{STR_VAR_1}'s hot status\nmade it a great appeal!{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_MOVE_UP_LINE] = COMPOUND_STRING("It moved up in line for\nthe next appeal.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_MOVE_BACK_LINE] = COMPOUND_STRING("It moved back in line once\nfor the next appeal.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), + [CONTEST_STRING_SCRAMBLE_ORDER] = COMPOUND_STRING("It scrambled up the\norder for the next turn.{PAUSE 15}{PAUSE 15}{PAUSE 15}{PAUSE 15}"), [CONTEST_STRING_JUDGE_EXPECTANTLY2] = gText_JudgeLookedAtMonExpectantly, [CONTEST_STRING_WENT_OVER_WELL] = gText_AppealComboWentOverWell, [CONTEST_STRING_WENT_OVER_VERY_WELL] = gText_AppealComboWentOverVeryWell, [CONTEST_STRING_APPEAL_COMBO_EXCELLENTLY] = gText_AppealComboWentOverExcellently, - [CONTEST_STRING_AVERT_GAZE] = gText_MonManagedToAvertGaze, - [CONTEST_STRING_AVOID_SEEING] = gText_MonManagedToAvoidSeeingIt, - [CONTEST_STRING_NOT_FAZED] = gText_MonIsntFazedByThatSortOfThing, - [CONTEST_STRING_LITTLE_DISTRACTED] = gText_MonBecameALittleDistracted, - [CONTEST_STRING_ATTEMPT_STARTLE] = gText_TriedToStartleOtherPokemon, - [CONTEST_STRING_LOOKED_DOWN] = gText_MonLookedDownOutOfDistraction, - [CONTEST_STRING_TURNED_BACK] = gText_MonTurnedBackOutOfDistraction, - [CONTEST_STRING_UTTER_CRY] = gText_MonCouldntHelpUtteringCry, - [CONTEST_STRING_LEAPT_UP] = gText_MonCouldntHelpLeapingUp, - [CONTEST_STRING_TRIPPED_OVER] = gText_MonTrippedOutOfDistraction, - [CONTEST_STRING_MESSED_UP2] = gText_ButItMessedUp2, - [CONTEST_STRING_FAILED_TARGET_NERVOUS] = gText_ButItFailedToMakeTargetNervous, - [CONTEST_STRING_FAILED_ANYONE_NERVOUS] = gText_ButItFailedToMakeAnyoneNervous, - [CONTEST_STRING_IGNORED] = gText_ButItWasIgnored, - [CONTEST_STRING_NO_CONDITION_IMPROVE] = gText_CouldntImproveItsCondition, - [CONTEST_STRING_BAD_CONDITION_WEAK_APPEAL] = gText_BadConditionResultedInWeakAppeal, - [CONTEST_STRING_UNAFFECTED] = gText_MonWasUnaffected, - [CONTEST_STRING_ATTRACTED_ATTENTION] = gText_AttractedCrowdsAttention + [CONTEST_STRING_AVERT_GAZE] = COMPOUND_STRING("{STR_VAR_1} managed to\navert its gaze.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"), + [CONTEST_STRING_AVOID_SEEING] = COMPOUND_STRING("{STR_VAR_1} managed to\navoid seeing it.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"), + [CONTEST_STRING_NOT_FAZED] = COMPOUND_STRING("{STR_VAR_1} isn't fazed\nby that sort of thing.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"), + [CONTEST_STRING_LITTLE_DISTRACTED] = COMPOUND_STRING("{STR_VAR_1} became a\nlittle distracted.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"), + [CONTEST_STRING_ATTEMPT_STARTLE] = COMPOUND_STRING("It tried to startle the\nother POKΓ©MON.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"), + [CONTEST_STRING_LOOKED_DOWN] = COMPOUND_STRING("{STR_VAR_1} looked down\nout of distraction.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"), + [CONTEST_STRING_TURNED_BACK] = COMPOUND_STRING("{STR_VAR_1} turned back\nout of distraction.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"), + [CONTEST_STRING_UTTER_CRY] = COMPOUND_STRING("{STR_VAR_1} couldn't help\nuttering a cry.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"), + [CONTEST_STRING_LEAPT_UP] = COMPOUND_STRING("{STR_VAR_1} couldn't help\nleaping up.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"), + [CONTEST_STRING_TRIPPED_OVER] = COMPOUND_STRING("{STR_VAR_1} tripped over\nout of distraction.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"), + [CONTEST_STRING_MESSED_UP2] = COMPOUND_STRING("But it messed up.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"), + [CONTEST_STRING_FAILED_TARGET_NERVOUS] = COMPOUND_STRING("But it failed to make\nthe target nervous.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"), + [CONTEST_STRING_FAILED_ANYONE_NERVOUS] = COMPOUND_STRING("But it failed to make\nanyone nervous.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"), + [CONTEST_STRING_IGNORED] = COMPOUND_STRING("But it was ignored…{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"), + [CONTEST_STRING_NO_CONDITION_IMPROVE] = COMPOUND_STRING("But it couldn't improve\nits condition…{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"), + [CONTEST_STRING_BAD_CONDITION_WEAK_APPEAL] = COMPOUND_STRING("Its bad condition\nresulted in a weak appeal.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"), + [CONTEST_STRING_UNAFFECTED] = COMPOUND_STRING("{STR_VAR_1} was\nunaffected.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}"), + [CONTEST_STRING_ATTRACTED_ATTENTION] = COMPOUND_STRING("It attracted the crowd's\nattention.{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}{PAUSE 0x0F}") }; diff --git a/src/data/debug_trainers.party b/src/data/debug_trainers.party new file mode 100644 index 000000000000..4a57d2c35ec4 --- /dev/null +++ b/src/data/debug_trainers.party @@ -0,0 +1,68 @@ +/* + +Parties for the debug menu. + +The trainer description for DEBUG_TRAINER_PLAYER is not used, +its party is given to the player whenever the Set Party action is selected, +or the Start Debug Battle action is selected. + +The debug menu will start a battle against DEBUG_TRAINER_AI when the +Start Debug Battle action is selected. + +*/ + +=== DEBUG_TRAINER_PLAYER === +Name: Player +Class: Pkmn Trainer 1 +Pic: Brendan +Gender: Male +Music: Male + +Buffie (Wobbuffet) +Brave Nature +Level: 100 +IVs: 31 HP / 31 Atk / 31 Def / 31 SpA / 31 SpD / 31 Spe +EVs: 252 Atk / 252 Def / 6 SpA +- Earthquake +- Flamethrower +- Celebrate +- Celebrate + +=== DEBUG_TRAINER_AI === +Name: Debugger +AI: Basic Trainer +Class: Rival +Battle Type: Singles +Pic: Steven +Gender: Male +Music: Male + +Metang +Brave Nature +Level: 42 +IVs: 31 HP / 31 Atk / 31 Def / 31 SpA / 31 SpD / 31 Spe +EVs: 252 Atk / 252 Def / 6 SpA +- Light Screen +- Psychic +- Reflect +- Metal Claw + +Skarmory +Impish Nature +Level: 43 +IVs: 31 HP / 31 Atk / 31 Def / 31 SpA / 31 SpD / 31 Spe +EVs: 252 HP / 6 SpA / 252 SpD +- Toxic +- Aerial Ace +- Protect +- Steel Wing + +Aggron +Adamant Nature +Level: 44 +IVs: 31 HP / 31 Atk / 31 Def / 31 SpA / 31 SpD / 31 Spe +EVs: 252 Atk / 252 SpA / 6 SpD +- Thunder +- Protect +- Solar Beam +- Dragon Claw diff --git a/src/data/field_effects/field_effect_object_template_pointers.h b/src/data/field_effects/field_effect_object_template_pointers.h index 7173ffbe584e..369b5821a9b3 100755 --- a/src/data/field_effects/field_effect_object_template_pointers.h +++ b/src/data/field_effects/field_effect_object_template_pointers.h @@ -40,6 +40,10 @@ extern const struct SpriteTemplate gFieldEffectObjectTemplate_SlitherTracks; extern const struct SpriteTemplate gFieldEffectObjectTemplate_BugTracks; extern const struct SpriteTemplate gFieldEffectObjectTemplate_SpotTracks; extern const struct SpriteTemplate gFieldEffectObjectTemplate_CaveDust; +extern const struct SpriteTemplate gFieldEffectObjectTemplate_RockClimbBlob; +extern const struct SpriteTemplate gFieldEffectObjectTemplate_RockClimbDust; +extern const struct SpriteTemplate gFieldEffectObjectTemplate_ORASDowsingBrendan; +extern const struct SpriteTemplate gFieldEffectObjectTemplate_ORASDowsingMay; const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = { [FLDEFFOBJ_SHADOW_S] = &gFieldEffectObjectTemplate_ShadowSmall, @@ -83,4 +87,8 @@ const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = { [FLDEFFOBJ_TRACKS_SPOT] = &gFieldEffectObjectTemplate_SpotTracks, [FLDEFFOBJ_TRACKS_BUG] = &gFieldEffectObjectTemplate_BugTracks, [FLDEFFOBJ_CAVE_DUST] = &gFieldEffectObjectTemplate_CaveDust, + [FLDEFFOBJ_ROCK_CLIMB_BLOB] = &gFieldEffectObjectTemplate_RockClimbBlob, + [FLDEFFOBJ_ROCK_CLIMB_DUST] = &gFieldEffectObjectTemplate_RockClimbDust, + [FLDEFFOBJ_ORAS_DOWSE_BRENDAN] = &gFieldEffectObjectTemplate_ORASDowsingBrendan, + [FLDEFFOBJ_ORAS_DOWSE_MAY] = &gFieldEffectObjectTemplate_ORASDowsingMay, }; diff --git a/src/data/field_effects/field_effect_objects.h b/src/data/field_effects/field_effect_objects.h index 5638ea46e2da..8b37f37b61d8 100755 --- a/src/data/field_effects/field_effect_objects.h +++ b/src/data/field_effects/field_effect_objects.h @@ -1386,7 +1386,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_Rayquaza = { static const struct SpritePalette sSpritePalette_Unused = {gObjectEventPal_Npc3, FLDEFF_PAL_TAG_UNKNOWN}; // cave dust -static const struct SpriteFrameImage sPicTable_CaveDust[] = +static const struct SpriteFrameImage sPicTable_CaveDust[] = { overworld_frame(gFieldEffectObjectPic_CaveDust, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_CaveDust, 2, 2, 1), @@ -1404,3 +1404,47 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_CaveDust = { }; const struct SpritePalette gSpritePalette_CaveDust = {gFieldEffectObjectPalette_CaveDust, FLDEFF_PAL_TAG_CAVE_DUST}; +static const struct SpriteFrameImage sPicTable_RockClimbBlob[] = { + overworld_frame(gFieldEffectObjectPic_RockClimbBlob, 4, 4, 1), + overworld_frame(gFieldEffectObjectPic_RockClimbBlob, 4, 4, 0), + overworld_frame(gFieldEffectObjectPic_RockClimbBlob, 4, 4, 2), +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_RockClimbBlob = { + .tileTag = 0xFFFF, + .paletteTag = 0xFFFF, + .oam = &gObjectEventBaseOam_32x32, + .anims = sAnimTable_SurfBlob, + .images = sPicTable_RockClimbBlob, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = UpdateSurfBlobFieldEffect, +}; + + +static const union AnimCmd sAnim_RockClimbDust[] = +{ + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(2, 12), + ANIMCMD_END, +}; +static const union AnimCmd *const sAnimTable_RockClimbDust[] = +{ + sAnim_RockClimbDust, +}; +static const struct SpriteFrameImage sPicTable_RockClimbDust[] = { + overworld_frame(gFieldEffectObjectPic_RockClimbDust, 4, 4, 0), + overworld_frame(gFieldEffectObjectPic_RockClimbDust, 4, 4, 1), + overworld_frame(gFieldEffectObjectPic_RockClimbDust, 4, 4, 2), +}; +const struct SpriteTemplate gFieldEffectObjectTemplate_RockClimbDust = { + .tileTag = 0xFFFF, + .paletteTag = FLDEFF_PAL_TAG_DUST_CLOUD, + .oam = &gObjectEventBaseOam_32x32, + .anims = sAnimTable_RockClimbDust, + .images = sPicTable_RockClimbDust, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = UpdateJumpImpactEffect, +}; + +const struct SpritePalette gSpritePalette_BigDust = {gFieldEffectPal_DustCloud, FLDEFF_PAL_TAG_DUST_CLOUD}; diff --git a/src/data/graphics/battle_environment.h b/src/data/graphics/battle_environment.h index 29339011f56c..4d271ea82d24 100644 --- a/src/data/graphics/battle_environment.h +++ b/src/data/graphics/battle_environment.h @@ -1,46 +1,8 @@ -const u32 gBattleEnvironmentTiles_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/tiles.4bpp.lz"); -const u16 gBattleEnvironmentPalette_TallGrass[] = INCBIN_U16("graphics/battle_environment/tall_grass/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/map.bin.lz"); +const u32 gBattleEnvironmentTiles_Stadium[] = INCBIN_U32("graphics/battle_environment/stadium/tiles.4bpp.smol"); +const u32 gBattleEnvironmentTilemap_Stadium[] = INCBIN_U32("graphics/battle_environment/stadium/map.bin.smolTM"); -const u32 gBattleEnvironmentTiles_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/tiles.4bpp.lz"); -const u16 gBattleEnvironmentPalette_LongGrass[] = INCBIN_U16("graphics/battle_environment/long_grass/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/map.bin.lz"); - -const u32 gBattleEnvironmentTiles_Sand[] = INCBIN_U32("graphics/battle_environment/sand/tiles.4bpp.lz"); -const u16 gBattleEnvironmentPalette_Sand[] = INCBIN_U16("graphics/battle_environment/sand/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_Sand[] = INCBIN_U32("graphics/battle_environment/sand/map.bin.lz"); - -const u32 gBattleEnvironmentTiles_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/tiles.4bpp.lz"); -const u16 gBattleEnvironmentPalette_Underwater[] = INCBIN_U16("graphics/battle_environment/underwater/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/map.bin.lz"); - -const u32 gBattleEnvironmentTiles_Water[] = INCBIN_U32("graphics/battle_environment/water/tiles.4bpp.lz"); -const u16 gBattleEnvironmentPalette_Water[] = INCBIN_U16("graphics/battle_environment/water/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_Water[] = INCBIN_U32("graphics/battle_environment/water/map.bin.lz"); - -const u32 gBattleEnvironmentTiles_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/tiles.4bpp.lz"); -const u16 gBattleEnvironmentPalette_PondWater[] = INCBIN_U16("graphics/battle_environment/pond_water/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/map.bin.lz"); - -const u32 gBattleEnvironmentTiles_Rock[] = INCBIN_U32("graphics/battle_environment/rock/tiles.4bpp.lz"); -const u16 gBattleEnvironmentPalette_Rock[] = INCBIN_U16("graphics/battle_environment/rock/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_Rock[] = INCBIN_U32("graphics/battle_environment/rock/map.bin.lz"); - -const u32 gBattleEnvironmentTiles_Cave[] = INCBIN_U32("graphics/battle_environment/cave/tiles.4bpp.lz"); -const u16 gBattleEnvironmentPalette_Cave[] = INCBIN_U16("graphics/battle_environment/cave/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_Cave[] = INCBIN_U32("graphics/battle_environment/cave/map.bin.lz"); - -const u16 gBattleEnvironmentPalette_Plain[] = INCBIN_U16("graphics/battle_environment/plain/palette.gbapal"); - -const u32 gBattleEnvironmentTiles_Building[] = INCBIN_U32("graphics/battle_environment/building/tiles.4bpp.lz"); -const u16 gBattleEnvironmentPalette_Frontier[] = INCBIN_U16("graphics/battle_environment/stadium/battle_frontier.gbapal"); // this is also used for link battles -const u32 gBattleEnvironmentTilemap_Building[] = INCBIN_U32("graphics/battle_environment/building/map.bin.lz"); - -const u32 gBattleEnvironmentTiles_Stadium[] = INCBIN_U32("graphics/battle_environment/stadium/tiles.4bpp.lz"); -const u32 gBattleEnvironmentTilemap_Stadium[] = INCBIN_U32("graphics/battle_environment/stadium/map.bin.lz"); - -const u32 gBattleEnvironmentTiles_Rayquaza[] = INCBIN_U32("graphics/battle_environment/sky/tiles.4bpp.lz"); -const u32 gBattleEnvironmentTilemap_Rayquaza[] = INCBIN_U32("graphics/battle_environment/sky/map.bin.lz"); +const u32 gBattleEnvironmentTiles_Rayquaza[] = INCBIN_U32("graphics/battle_environment/sky/tiles.4bpp.smol"); +const u32 gBattleEnvironmentTilemap_Rayquaza[] = INCBIN_U32("graphics/battle_environment/sky/map.bin.smolTM"); const u16 gBattleEnvironmentPalette_Building[] = INCBIN_U16("graphics/battle_environment/building/palette.gbapal"); @@ -57,32 +19,32 @@ const u16 gBattleEnvironmentPalette_StadiumDrake[] = INCBIN_U16("graphics/battle const u16 gBattleEnvironmentPalette_StadiumWallace[] = INCBIN_U16("graphics/battle_environment/stadium/palette7.gbapal"); const u16 gBattleEnvironmentPalette_Rayquaza[] = INCBIN_U16("graphics/battle_environment/sky/palette.gbapal"); -const u32 gBattleEnvironmentAnimTiles_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/anim_tiles.4bpp.lz"); -const u32 gBattleEnvironmentAnimTilemap_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/anim_map.bin.lz"); +const u32 gBattleEnvironmentAnimTiles_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/anim_tiles.4bpp.smol"); +const u32 gBattleEnvironmentAnimTilemap_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/anim_map.bin.smolTM"); -const u32 gBattleEnvironmentAnimTiles_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/anim_tiles.4bpp.lz"); -const u32 gBattleEnvironmentAnimTilemap_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/anim_map.bin.lz"); +const u32 gBattleEnvironmentAnimTiles_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/anim_tiles.4bpp.smol"); +const u32 gBattleEnvironmentAnimTilemap_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/anim_map.bin.smolTM"); -const u32 gBattleEnvironmentAnimTiles_Sand[] = INCBIN_U32("graphics/battle_environment/sand/anim_tiles.4bpp.lz"); -const u32 gBattleEnvironmentAnimTilemap_Sand[] = INCBIN_U32("graphics/battle_environment/sand/anim_map.bin.lz"); +const u32 gBattleEnvironmentAnimTiles_Sand[] = INCBIN_U32("graphics/battle_environment/sand/anim_tiles.4bpp.smol"); +const u32 gBattleEnvironmentAnimTilemap_Sand[] = INCBIN_U32("graphics/battle_environment/sand/anim_map.bin.smolTM"); -const u32 gBattleEnvironmentAnimTiles_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/anim_tiles.4bpp.lz"); -const u32 gBattleEnvironmentAnimTilemap_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/anim_map.bin.lz"); +const u32 gBattleEnvironmentAnimTiles_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/anim_tiles.4bpp.smol"); +const u32 gBattleEnvironmentAnimTilemap_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/anim_map.bin.smolTM"); -const u32 gBattleEnvironmentAnimTiles_Water[] = INCBIN_U32("graphics/battle_environment/water/anim_tiles.4bpp.lz"); -const u32 gBattleEnvironmentAnimTilemap_Water[] = INCBIN_U32("graphics/battle_environment/water/anim_map.bin.lz"); +const u32 gBattleEnvironmentAnimTiles_Water[] = INCBIN_U32("graphics/battle_environment/water/anim_tiles.4bpp.smol"); +const u32 gBattleEnvironmentAnimTilemap_Water[] = INCBIN_U32("graphics/battle_environment/water/anim_map.bin.smolTM"); -const u32 gBattleEnvironmentAnimTiles_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/anim_tiles.4bpp.lz"); -const u32 gBattleEnvironmentAnimTilemap_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/anim_map.bin.lz"); +const u32 gBattleEnvironmentAnimTiles_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/anim_tiles.4bpp.smol"); +const u32 gBattleEnvironmentAnimTilemap_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/anim_map.bin.smolTM"); -const u32 gBattleEnvironmentAnimTiles_Rock[] = INCBIN_U32("graphics/battle_environment/rock/anim_tiles.4bpp.lz"); -const u32 gBattleEnvironmentAnimTilemap_Rock[] = INCBIN_U32("graphics/battle_environment/rock/anim_map.bin.lz"); +const u32 gBattleEnvironmentAnimTiles_Rock[] = INCBIN_U32("graphics/battle_environment/rock/anim_tiles.4bpp.smol"); +const u32 gBattleEnvironmentAnimTilemap_Rock[] = INCBIN_U32("graphics/battle_environment/rock/anim_map.bin.smolTM"); -const u32 gBattleEnvironmentAnimTiles_Cave[] = INCBIN_U32("graphics/battle_environment/cave/anim_tiles.4bpp.lz"); -const u32 gBattleEnvironmentAnimTilemap_Cave[] = INCBIN_U32("graphics/battle_environment/cave/anim_map.bin.lz"); +const u32 gBattleEnvironmentAnimTiles_Cave[] = INCBIN_U32("graphics/battle_environment/cave/anim_tiles.4bpp.smol"); +const u32 gBattleEnvironmentAnimTilemap_Cave[] = INCBIN_U32("graphics/battle_environment/cave/anim_map.bin.smolTM"); -const u32 gBattleEnvironmentAnimTiles_Building[] = INCBIN_U32("graphics/battle_environment/building/anim_tiles.4bpp.lz"); -const u32 gBattleEnvironmentAnimTilemap_Building[] = INCBIN_U32("graphics/battle_environment/building/anim_map.bin.lz"); +const u32 gBattleEnvironmentAnimTiles_Building[] = INCBIN_U32("graphics/battle_environment/building/anim_tiles.4bpp.smol"); +const u32 gBattleEnvironmentAnimTilemap_Building[] = INCBIN_U32("graphics/battle_environment/building/anim_map.bin.smolTM"); -const u32 gBattleEnvironmentAnimTiles_Rayquaza[] = INCBIN_U32("graphics/battle_environment/sky/anim_tiles.4bpp.lz"); -const u32 gBattleEnvironmentAnimTilemap_Rayquaza[] = INCBIN_U32("graphics/battle_environment/sky/anim_map.bin.lz"); +const u32 gBattleEnvironmentAnimTiles_Rayquaza[] = INCBIN_U32("graphics/battle_environment/sky/anim_tiles.4bpp.smol"); +const u32 gBattleEnvironmentAnimTilemap_Rayquaza[] = INCBIN_U32("graphics/battle_environment/sky/anim_map.bin.smolTM"); diff --git a/src/data/graphics/berries.h b/src/data/graphics/berries.h index 3001337dfa35..d76a524ae1cb 100644 --- a/src/data/graphics/berries.h +++ b/src/data/graphics/berries.h @@ -1,78 +1,78 @@ -const u32 gBerryCheck_Gfx[] = INCBIN_U32("graphics/bag/check_berry.4bpp.lz"); +const u32 gBerryCheck_Gfx[] = INCBIN_U32("graphics/bag/check_berry.4bpp.smol"); const u16 gBerryCheck_Pal[] = INCBIN_U16("graphics/bag/check_berry.gbapal"); -const u32 gBerryTag_Gfx[] = INCBIN_U32("graphics/bag/berry_tag.bin.lz"); -const u32 gBerryTag_Tilemap[] = INCBIN_U32("graphics/bag/berry_tag_title.bin.lz"); +const u32 gBerryTag_Gfx[] = INCBIN_U32("graphics/bag/berry_tag.bin.smolTM"); +const u32 gBerryTag_Tilemap[] = INCBIN_U32("graphics/bag/berry_tag_title.bin.smolTM"); -const u32 gBerryCheckCircle_Gfx[] = INCBIN_U32("graphics/bag/check_berry_circle.4bpp.lz"); +const u32 gBerryCheckCircle_Gfx[] = INCBIN_U32("graphics/bag/check_berry_circle.4bpp.smol"); -const u32 gBerryPic_Cheri[] = INCBIN_U32("graphics/berries/cheri.4bpp.lz"); -const u32 gBerryPic_Chesto[] = INCBIN_U32("graphics/berries/chesto.4bpp.lz"); -const u32 gBerryPic_Pecha[] = INCBIN_U32("graphics/berries/pecha.4bpp.lz"); -const u32 gBerryPic_Rawst[] = INCBIN_U32("graphics/berries/rawst.4bpp.lz"); -const u32 gBerryPic_Aspear[] = INCBIN_U32("graphics/berries/aspear.4bpp.lz"); -const u32 gBerryPic_Leppa[] = INCBIN_U32("graphics/berries/leppa.4bpp.lz"); -const u32 gBerryPic_Oran[] = INCBIN_U32("graphics/berries/oran.4bpp.lz"); -const u32 gBerryPic_Persim[] = INCBIN_U32("graphics/berries/persim.4bpp.lz"); -const u32 gBerryPic_Lum[] = INCBIN_U32("graphics/berries/lum.4bpp.lz"); -const u32 gBerryPic_Sitrus[] = INCBIN_U32("graphics/berries/sitrus.4bpp.lz"); -const u32 gBerryPic_Figy[] = INCBIN_U32("graphics/berries/figy.4bpp.lz"); -const u32 gBerryPic_Wiki[] = INCBIN_U32("graphics/berries/wiki.4bpp.lz"); -const u32 gBerryPic_Mago[] = INCBIN_U32("graphics/berries/mago.4bpp.lz"); -const u32 gBerryPic_Aguav[] = INCBIN_U32("graphics/berries/aguav.4bpp.lz"); -const u32 gBerryPic_Iapapa[] = INCBIN_U32("graphics/berries/iapapa.4bpp.lz"); -const u32 gBerryPic_Razz[] = INCBIN_U32("graphics/berries/razz.4bpp.lz"); -const u32 gBerryPic_Bluk[] = INCBIN_U32("graphics/berries/bluk.4bpp.lz"); -const u32 gBerryPic_Nanab[] = INCBIN_U32("graphics/berries/nanab.4bpp.lz"); -const u32 gBerryPic_Wepear[] = INCBIN_U32("graphics/berries/wepear.4bpp.lz"); -const u32 gBerryPic_Pinap[] = INCBIN_U32("graphics/berries/pinap.4bpp.lz"); -const u32 gBerryPic_Pomeg[] = INCBIN_U32("graphics/berries/pomeg.4bpp.lz"); -const u32 gBerryPic_Kelpsy[] = INCBIN_U32("graphics/berries/kelpsy.4bpp.lz"); -const u32 gBerryPic_Qualot[] = INCBIN_U32("graphics/berries/qualot.4bpp.lz"); -const u32 gBerryPic_Hondew[] = INCBIN_U32("graphics/berries/hondew.4bpp.lz"); -const u32 gBerryPic_Grepa[] = INCBIN_U32("graphics/berries/grepa.4bpp.lz"); -const u32 gBerryPic_Tamato[] = INCBIN_U32("graphics/berries/tamato.4bpp.lz"); -const u32 gBerryPic_Cornn[] = INCBIN_U32("graphics/berries/cornn.4bpp.lz"); -const u32 gBerryPic_Magost[] = INCBIN_U32("graphics/berries/magost.4bpp.lz"); -const u32 gBerryPic_Rabuta[] = INCBIN_U32("graphics/berries/rabuta.4bpp.lz"); -const u32 gBerryPic_Nomel[] = INCBIN_U32("graphics/berries/nomel.4bpp.lz"); -const u32 gBerryPic_Spelon[] = INCBIN_U32("graphics/berries/spelon.4bpp.lz"); -const u32 gBerryPic_Pamtre[] = INCBIN_U32("graphics/berries/pamtre.4bpp.lz"); -const u32 gBerryPic_Watmel[] = INCBIN_U32("graphics/berries/watmel.4bpp.lz"); -const u32 gBerryPic_Durin[] = INCBIN_U32("graphics/berries/durin.4bpp.lz"); -const u32 gBerryPic_Belue[] = INCBIN_U32("graphics/berries/belue.4bpp.lz"); -const u32 gBerryPic_Chilan[] = INCBIN_U32("graphics/berries/chilan.4bpp.lz"); -const u32 gBerryPic_Occa[] = INCBIN_U32("graphics/berries/occa.4bpp.lz"); -const u32 gBerryPic_Passho[] = INCBIN_U32("graphics/berries/passho.4bpp.lz"); -const u32 gBerryPic_Wacan[] = INCBIN_U32("graphics/berries/wacan.4bpp.lz"); -const u32 gBerryPic_Rindo[] = INCBIN_U32("graphics/berries/rindo.4bpp.lz"); -const u32 gBerryPic_Yache[] = INCBIN_U32("graphics/berries/yache.4bpp.lz"); -const u32 gBerryPic_Chople[] = INCBIN_U32("graphics/berries/chople.4bpp.lz"); -const u32 gBerryPic_Kebia[] = INCBIN_U32("graphics/berries/kebia.4bpp.lz"); -const u32 gBerryPic_Shuca[] = INCBIN_U32("graphics/berries/shuca.4bpp.lz"); -const u32 gBerryPic_Coba[] = INCBIN_U32("graphics/berries/coba.4bpp.lz"); -const u32 gBerryPic_Payapa[] = INCBIN_U32("graphics/berries/payapa.4bpp.lz"); -const u32 gBerryPic_Tanga[] = INCBIN_U32("graphics/berries/tanga.4bpp.lz"); -const u32 gBerryPic_Charti[] = INCBIN_U32("graphics/berries/charti.4bpp.lz"); -const u32 gBerryPic_Kasib[] = INCBIN_U32("graphics/berries/kasib.4bpp.lz"); -const u32 gBerryPic_Haban[] = INCBIN_U32("graphics/berries/haban.4bpp.lz"); -const u32 gBerryPic_Colbur[] = INCBIN_U32("graphics/berries/colbur.4bpp.lz"); -const u32 gBerryPic_Babiri[] = INCBIN_U32("graphics/berries/babiri.4bpp.lz"); -const u32 gBerryPic_Roseli[] = INCBIN_U32("graphics/berries/roseli.4bpp.lz"); -const u32 gBerryPic_Liechi[] = INCBIN_U32("graphics/berries/liechi.4bpp.lz"); -const u32 gBerryPic_Ganlon[] = INCBIN_U32("graphics/berries/ganlon.4bpp.lz"); -const u32 gBerryPic_Salac[] = INCBIN_U32("graphics/berries/salac.4bpp.lz"); -const u32 gBerryPic_Petaya[] = INCBIN_U32("graphics/berries/petaya.4bpp.lz"); -const u32 gBerryPic_Apicot[] = INCBIN_U32("graphics/berries/apicot.4bpp.lz"); -const u32 gBerryPic_Lansat[] = INCBIN_U32("graphics/berries/lansat.4bpp.lz"); -const u32 gBerryPic_Starf[] = INCBIN_U32("graphics/berries/starf.4bpp.lz"); -const u32 gBerryPic_Enigma[] = INCBIN_U32("graphics/berries/enigma.4bpp.lz"); -const u32 gBerryPic_Micle[] = INCBIN_U32("graphics/berries/micle.4bpp.lz"); -const u32 gBerryPic_Custap[] = INCBIN_U32("graphics/berries/custap.4bpp.lz"); -const u32 gBerryPic_Jaboca[] = INCBIN_U32("graphics/berries/jaboca.4bpp.lz"); -const u32 gBerryPic_Rowap[] = INCBIN_U32("graphics/berries/rowap.4bpp.lz"); -const u32 gBerryPic_Kee[] = INCBIN_U32("graphics/berries/kee.4bpp.lz"); -const u32 gBerryPic_Maranga[] = INCBIN_U32("graphics/berries/maranga.4bpp.lz"); +const u32 gBerryPic_Cheri[] = INCBIN_U32("graphics/berries/cheri.4bpp.smol"); +const u32 gBerryPic_Chesto[] = INCBIN_U32("graphics/berries/chesto.4bpp.smol"); +const u32 gBerryPic_Pecha[] = INCBIN_U32("graphics/berries/pecha.4bpp.smol"); +const u32 gBerryPic_Rawst[] = INCBIN_U32("graphics/berries/rawst.4bpp.smol"); +const u32 gBerryPic_Aspear[] = INCBIN_U32("graphics/berries/aspear.4bpp.smol"); +const u32 gBerryPic_Leppa[] = INCBIN_U32("graphics/berries/leppa.4bpp.smol"); +const u32 gBerryPic_Oran[] = INCBIN_U32("graphics/berries/oran.4bpp.smol"); +const u32 gBerryPic_Persim[] = INCBIN_U32("graphics/berries/persim.4bpp.smol"); +const u32 gBerryPic_Lum[] = INCBIN_U32("graphics/berries/lum.4bpp.smol"); +const u32 gBerryPic_Sitrus[] = INCBIN_U32("graphics/berries/sitrus.4bpp.smol"); +const u32 gBerryPic_Figy[] = INCBIN_U32("graphics/berries/figy.4bpp.smol"); +const u32 gBerryPic_Wiki[] = INCBIN_U32("graphics/berries/wiki.4bpp.smol"); +const u32 gBerryPic_Mago[] = INCBIN_U32("graphics/berries/mago.4bpp.smol"); +const u32 gBerryPic_Aguav[] = INCBIN_U32("graphics/berries/aguav.4bpp.smol"); +const u32 gBerryPic_Iapapa[] = INCBIN_U32("graphics/berries/iapapa.4bpp.smol"); +const u32 gBerryPic_Razz[] = INCBIN_U32("graphics/berries/razz.4bpp.smol"); +const u32 gBerryPic_Bluk[] = INCBIN_U32("graphics/berries/bluk.4bpp.smol"); +const u32 gBerryPic_Nanab[] = INCBIN_U32("graphics/berries/nanab.4bpp.smol"); +const u32 gBerryPic_Wepear[] = INCBIN_U32("graphics/berries/wepear.4bpp.smol"); +const u32 gBerryPic_Pinap[] = INCBIN_U32("graphics/berries/pinap.4bpp.smol"); +const u32 gBerryPic_Pomeg[] = INCBIN_U32("graphics/berries/pomeg.4bpp.smol"); +const u32 gBerryPic_Kelpsy[] = INCBIN_U32("graphics/berries/kelpsy.4bpp.smol"); +const u32 gBerryPic_Qualot[] = INCBIN_U32("graphics/berries/qualot.4bpp.smol"); +const u32 gBerryPic_Hondew[] = INCBIN_U32("graphics/berries/hondew.4bpp.smol"); +const u32 gBerryPic_Grepa[] = INCBIN_U32("graphics/berries/grepa.4bpp.smol"); +const u32 gBerryPic_Tamato[] = INCBIN_U32("graphics/berries/tamato.4bpp.smol"); +const u32 gBerryPic_Cornn[] = INCBIN_U32("graphics/berries/cornn.4bpp.smol"); +const u32 gBerryPic_Magost[] = INCBIN_U32("graphics/berries/magost.4bpp.smol"); +const u32 gBerryPic_Rabuta[] = INCBIN_U32("graphics/berries/rabuta.4bpp.smol"); +const u32 gBerryPic_Nomel[] = INCBIN_U32("graphics/berries/nomel.4bpp.smol"); +const u32 gBerryPic_Spelon[] = INCBIN_U32("graphics/berries/spelon.4bpp.smol"); +const u32 gBerryPic_Pamtre[] = INCBIN_U32("graphics/berries/pamtre.4bpp.smol"); +const u32 gBerryPic_Watmel[] = INCBIN_U32("graphics/berries/watmel.4bpp.smol"); +const u32 gBerryPic_Durin[] = INCBIN_U32("graphics/berries/durin.4bpp.smol"); +const u32 gBerryPic_Belue[] = INCBIN_U32("graphics/berries/belue.4bpp.smol"); +const u32 gBerryPic_Chilan[] = INCBIN_U32("graphics/berries/chilan.4bpp.smol"); +const u32 gBerryPic_Occa[] = INCBIN_U32("graphics/berries/occa.4bpp.smol"); +const u32 gBerryPic_Passho[] = INCBIN_U32("graphics/berries/passho.4bpp.smol"); +const u32 gBerryPic_Wacan[] = INCBIN_U32("graphics/berries/wacan.4bpp.smol"); +const u32 gBerryPic_Rindo[] = INCBIN_U32("graphics/berries/rindo.4bpp.smol"); +const u32 gBerryPic_Yache[] = INCBIN_U32("graphics/berries/yache.4bpp.smol"); +const u32 gBerryPic_Chople[] = INCBIN_U32("graphics/berries/chople.4bpp.smol"); +const u32 gBerryPic_Kebia[] = INCBIN_U32("graphics/berries/kebia.4bpp.smol"); +const u32 gBerryPic_Shuca[] = INCBIN_U32("graphics/berries/shuca.4bpp.smol"); +const u32 gBerryPic_Coba[] = INCBIN_U32("graphics/berries/coba.4bpp.smol"); +const u32 gBerryPic_Payapa[] = INCBIN_U32("graphics/berries/payapa.4bpp.smol"); +const u32 gBerryPic_Tanga[] = INCBIN_U32("graphics/berries/tanga.4bpp.smol"); +const u32 gBerryPic_Charti[] = INCBIN_U32("graphics/berries/charti.4bpp.smol"); +const u32 gBerryPic_Kasib[] = INCBIN_U32("graphics/berries/kasib.4bpp.smol"); +const u32 gBerryPic_Haban[] = INCBIN_U32("graphics/berries/haban.4bpp.smol"); +const u32 gBerryPic_Colbur[] = INCBIN_U32("graphics/berries/colbur.4bpp.smol"); +const u32 gBerryPic_Babiri[] = INCBIN_U32("graphics/berries/babiri.4bpp.smol"); +const u32 gBerryPic_Roseli[] = INCBIN_U32("graphics/berries/roseli.4bpp.smol"); +const u32 gBerryPic_Liechi[] = INCBIN_U32("graphics/berries/liechi.4bpp.smol"); +const u32 gBerryPic_Ganlon[] = INCBIN_U32("graphics/berries/ganlon.4bpp.smol"); +const u32 gBerryPic_Salac[] = INCBIN_U32("graphics/berries/salac.4bpp.smol"); +const u32 gBerryPic_Petaya[] = INCBIN_U32("graphics/berries/petaya.4bpp.smol"); +const u32 gBerryPic_Apicot[] = INCBIN_U32("graphics/berries/apicot.4bpp.smol"); +const u32 gBerryPic_Lansat[] = INCBIN_U32("graphics/berries/lansat.4bpp.smol"); +const u32 gBerryPic_Starf[] = INCBIN_U32("graphics/berries/starf.4bpp.smol"); +const u32 gBerryPic_Enigma[] = INCBIN_U32("graphics/berries/enigma.4bpp.smol"); +const u32 gBerryPic_Micle[] = INCBIN_U32("graphics/berries/micle.4bpp.smol"); +const u32 gBerryPic_Custap[] = INCBIN_U32("graphics/berries/custap.4bpp.smol"); +const u32 gBerryPic_Jaboca[] = INCBIN_U32("graphics/berries/jaboca.4bpp.smol"); +const u32 gBerryPic_Rowap[] = INCBIN_U32("graphics/berries/rowap.4bpp.smol"); +const u32 gBerryPic_Kee[] = INCBIN_U32("graphics/berries/kee.4bpp.smol"); +const u32 gBerryPic_Maranga[] = INCBIN_U32("graphics/berries/maranga.4bpp.smol"); const u16 gBerryPalette_Cheri[] = INCBIN_U16("graphics/berries/cheri.gbapal"); const u16 gBerryPalette_Chesto[] = INCBIN_U16("graphics/berries/chesto.gbapal"); diff --git a/src/data/graphics/berry_fix.h b/src/data/graphics/berry_fix.h index 0c26f7e92be4..3fbedb5f2c7c 100644 --- a/src/data/graphics/berry_fix.h +++ b/src/data/graphics/berry_fix.h @@ -1,23 +1,23 @@ const u16 gBerryFixGbaConnect_Pal[] = INCBIN_U16("graphics/berry_fix/gba_connect.gbapal"); -const u32 gBerryFixGbaConnect_Gfx[] = INCBIN_U32("graphics/berry_fix/gba_connect.4bpp.lz"); -const u32 gBerryFixGbaConnect_Tilemap[] = INCBIN_U32("graphics/berry_fix/gba_connect.bin.lz"); +const u32 gBerryFixGbaConnect_Gfx[] = INCBIN_U32("graphics/berry_fix/gba_connect.4bpp.smol"); +const u32 gBerryFixGbaConnect_Tilemap[] = INCBIN_U32("graphics/berry_fix/gba_connect.bin.smolTM"); const u16 gBerryFixGameboyLogo_Pal[] = INCBIN_U16("graphics/berry_fix/logo.gbapal"); -const u32 gBerryFixGameboyLogo_Gfx[] = INCBIN_U32("graphics/berry_fix/logo.4bpp.lz"); -const u32 gBerryFixGameboyLogo_Tilemap[] = INCBIN_U32("graphics/berry_fix/logo.bin.lz"); +const u32 gBerryFixGameboyLogo_Gfx[] = INCBIN_U32("graphics/berry_fix/logo.4bpp.smol"); +const u32 gBerryFixGameboyLogo_Tilemap[] = INCBIN_U32("graphics/berry_fix/logo.bin.smolTM"); const u16 gBerryFixGbaTransfer_Pal[] = INCBIN_U16("graphics/berry_fix/gba_transfer.gbapal"); -const u32 gBerryFixGbaTransfer_Gfx[] = INCBIN_U32("graphics/berry_fix/gba_transfer.4bpp.lz"); -const u32 gBerryFixGbaTransfer_Tilemap[] = INCBIN_U32("graphics/berry_fix/gba_transfer.bin.lz"); +const u32 gBerryFixGbaTransfer_Gfx[] = INCBIN_U32("graphics/berry_fix/gba_transfer.4bpp.smol"); +const u32 gBerryFixGbaTransfer_Tilemap[] = INCBIN_U32("graphics/berry_fix/gba_transfer.bin.smolTM"); const u16 gBerryFixGbaTransferHighlight_Pal[] = INCBIN_U16("graphics/berry_fix/gba_transfer_highlight.gbapal"); -const u32 gBerryFixGbaTransferHighlight_Gfx[] = INCBIN_U32("graphics/berry_fix/gba_transfer_highlight.4bpp.lz"); -const u32 gBerryFixGbaTransferHighlight_Tilemap[] = INCBIN_U32("graphics/berry_fix/gba_transfer_highlight.bin.lz"); +const u32 gBerryFixGbaTransferHighlight_Gfx[] = INCBIN_U32("graphics/berry_fix/gba_transfer_highlight.4bpp.smol"); +const u32 gBerryFixGbaTransferHighlight_Tilemap[] = INCBIN_U32("graphics/berry_fix/gba_transfer_highlight.bin.smolTM"); const u16 gBerryFixGbaTransferError_Pal[] = INCBIN_U16("graphics/berry_fix/gba_transfer_error.gbapal"); -const u32 gBerryFixGbaTransferError_Gfx[] = INCBIN_U32("graphics/berry_fix/gba_transfer_error.4bpp.lz"); -const u32 gBerryFixGbaTransferError_Tilemap[] = INCBIN_U32("graphics/berry_fix/gba_transfer_error.bin.lz"); +const u32 gBerryFixGbaTransferError_Gfx[] = INCBIN_U32("graphics/berry_fix/gba_transfer_error.4bpp.smol"); +const u32 gBerryFixGbaTransferError_Tilemap[] = INCBIN_U32("graphics/berry_fix/gba_transfer_error.bin.smolTM"); const u16 gBerryFixWindow_Pal[] = INCBIN_U16("graphics/berry_fix/window.gbapal"); -const u32 gBerryFixWindow_Gfx[] = INCBIN_U32("graphics/berry_fix/window.4bpp.lz"); -const u32 gBerryFixWindow_Tilemap[] = INCBIN_U32("graphics/berry_fix/window.bin.lz"); +const u32 gBerryFixWindow_Gfx[] = INCBIN_U32("graphics/berry_fix/window.4bpp.smol"); +const u32 gBerryFixWindow_Tilemap[] = INCBIN_U32("graphics/berry_fix/window.bin.smolTM"); diff --git a/src/data/graphics/decorations.h b/src/data/graphics/decorations.h index b8e1343ee5d4..e581d6816dab 100644 --- a/src/data/graphics/decorations.h +++ b/src/data/graphics/decorations.h @@ -1,125 +1,125 @@ -const u32 gDecorIcon_HeavyDesk[] = INCBIN_U32("graphics/decorations/heavy_desk.4bpp.lz"); +const u32 gDecorIcon_HeavyDesk[] = INCBIN_U32("graphics/decorations/heavy_desk.4bpp.smol"); const u16 gDecorIconPalette_HeavyDesk[] = INCBIN_U16("graphics/decorations/heavy_desk.gbapal"); -const u32 gDecorIcon_RaggedDesk[] = INCBIN_U32("graphics/decorations/ragged_desk.4bpp.lz"); +const u32 gDecorIcon_RaggedDesk[] = INCBIN_U32("graphics/decorations/ragged_desk.4bpp.smol"); const u16 gDecorIconPalette_RaggedDesk[] = INCBIN_U16("graphics/decorations/ragged_desk.gbapal"); -const u32 gDecorIcon_ComfortDesk[] = INCBIN_U32("graphics/decorations/comfort_desk.4bpp.lz"); +const u32 gDecorIcon_ComfortDesk[] = INCBIN_U32("graphics/decorations/comfort_desk.4bpp.smol"); const u16 gDecorIconPalette_ComfortDesk[] = INCBIN_U16("graphics/decorations/comfort_desk.gbapal"); -const u32 gDecorIcon_PrettyDesk[] = INCBIN_U32("graphics/decorations/pretty_desk.4bpp.lz"); +const u32 gDecorIcon_PrettyDesk[] = INCBIN_U32("graphics/decorations/pretty_desk.4bpp.smol"); const u16 gDecorIconPalette_PrettyDesk[] = INCBIN_U16("graphics/decorations/pretty_desk.gbapal"); -const u32 gDecorIcon_BrickDesk[] = INCBIN_U32("graphics/decorations/brick_desk.4bpp.lz"); +const u32 gDecorIcon_BrickDesk[] = INCBIN_U32("graphics/decorations/brick_desk.4bpp.smol"); const u16 gDecorIconPalette_BrickDesk[] = INCBIN_U16("graphics/decorations/brick_desk.gbapal"); -const u32 gDecorIcon_CampDesk[] = INCBIN_U32("graphics/decorations/camp_desk.4bpp.lz"); +const u32 gDecorIcon_CampDesk[] = INCBIN_U32("graphics/decorations/camp_desk.4bpp.smol"); const u16 gDecorIconPalette_CampDesk[] = INCBIN_U16("graphics/decorations/camp_desk.gbapal"); -const u32 gDecorIcon_HardDesk[] = INCBIN_U32("graphics/decorations/hard_desk.4bpp.lz"); +const u32 gDecorIcon_HardDesk[] = INCBIN_U32("graphics/decorations/hard_desk.4bpp.smol"); const u16 gDecorIconPalette_HardDesk[] = INCBIN_U16("graphics/decorations/hard_desk.gbapal"); -const u32 gDecorIcon_RedPlant[] = INCBIN_U32("graphics/decorations/red_plant.4bpp.lz"); +const u32 gDecorIcon_RedPlant[] = INCBIN_U32("graphics/decorations/red_plant.4bpp.smol"); const u16 gDecorIconPalette_RedPlant[] = INCBIN_U16("graphics/decorations/red_plant.gbapal"); -const u32 gDecorIcon_TropicalPlant[] = INCBIN_U32("graphics/decorations/tropical_plant.4bpp.lz"); +const u32 gDecorIcon_TropicalPlant[] = INCBIN_U32("graphics/decorations/tropical_plant.4bpp.smol"); const u16 gDecorIconPalette_TropicalPlant[] = INCBIN_U16("graphics/decorations/tropical_plant.gbapal"); -const u32 gDecorIcon_PrettyFlowers[] = INCBIN_U32("graphics/decorations/pretty_flowers.4bpp.lz"); +const u32 gDecorIcon_PrettyFlowers[] = INCBIN_U32("graphics/decorations/pretty_flowers.4bpp.smol"); const u16 gDecorIconPalette_PrettyFlowers[] = INCBIN_U16("graphics/decorations/pretty_flowers.gbapal"); -const u32 gDecorIcon_ColorfulPlant[] = INCBIN_U32("graphics/decorations/colorful_plant.4bpp.lz"); +const u32 gDecorIcon_ColorfulPlant[] = INCBIN_U32("graphics/decorations/colorful_plant.4bpp.smol"); const u16 gDecorIconPalette_ColorfulPlant[] = INCBIN_U16("graphics/decorations/colorful_plant.gbapal"); -const u32 gDecorIcon_BigPlant[] = INCBIN_U32("graphics/decorations/big_plant.4bpp.lz"); +const u32 gDecorIcon_BigPlant[] = INCBIN_U32("graphics/decorations/big_plant.4bpp.smol"); const u16 gDecorIconPalette_BigPlant[] = INCBIN_U16("graphics/decorations/big_plant.gbapal"); -const u32 gDecorIcon_GorgeousPlant[] = INCBIN_U32("graphics/decorations/gorgeous_plant.4bpp.lz"); +const u32 gDecorIcon_GorgeousPlant[] = INCBIN_U32("graphics/decorations/gorgeous_plant.4bpp.smol"); const u16 gDecorIconPalette_GorgeousPlant[] = INCBIN_U16("graphics/decorations/gorgeous_plant.gbapal"); -const u32 gDecorIcon_RedBrick[] = INCBIN_U32("graphics/decorations/red_brick.4bpp.lz"); +const u32 gDecorIcon_RedBrick[] = INCBIN_U32("graphics/decorations/red_brick.4bpp.smol"); const u16 gDecorIconPalette_RedBrick[] = INCBIN_U16("graphics/decorations/red_brick.gbapal"); -const u32 gDecorIcon_YellowBrick[] = INCBIN_U32("graphics/decorations/yellow_brick.4bpp.lz"); +const u32 gDecorIcon_YellowBrick[] = INCBIN_U32("graphics/decorations/yellow_brick.4bpp.smol"); const u16 gDecorIconPalette_YellowBrick[] = INCBIN_U16("graphics/decorations/yellow_brick.gbapal"); -const u32 gDecorIcon_BlueBrick[] = INCBIN_U32("graphics/decorations/blue_brick.4bpp.lz"); +const u32 gDecorIcon_BlueBrick[] = INCBIN_U32("graphics/decorations/blue_brick.4bpp.smol"); const u16 gDecorIconPalette_BlueBrick[] = INCBIN_U16("graphics/decorations/blue_brick.gbapal"); -const u32 gDecorIcon_RedTent[] = INCBIN_U32("graphics/decorations/red_tent.4bpp.lz"); +const u32 gDecorIcon_RedTent[] = INCBIN_U32("graphics/decorations/red_tent.4bpp.smol"); const u16 gDecorIconPalette_RedTent[] = INCBIN_U16("graphics/decorations/red_tent.gbapal"); -const u32 gDecorIcon_BlueTent[] = INCBIN_U32("graphics/decorations/blue_tent.4bpp.lz"); +const u32 gDecorIcon_BlueTent[] = INCBIN_U32("graphics/decorations/blue_tent.4bpp.smol"); const u16 gDecorIconPalette_BlueTent[] = INCBIN_U16("graphics/decorations/blue_tent.gbapal"); -const u32 gDecorIcon_SolidBoard[] = INCBIN_U32("graphics/decorations/solid_board.4bpp.lz"); +const u32 gDecorIcon_SolidBoard[] = INCBIN_U32("graphics/decorations/solid_board.4bpp.smol"); const u16 gDecorIconPalette_SolidBoard[] = INCBIN_U16("graphics/decorations/solid_board.gbapal"); -const u32 gDecorIcon_Slide[] = INCBIN_U32("graphics/decorations/slide.4bpp.lz"); +const u32 gDecorIcon_Slide[] = INCBIN_U32("graphics/decorations/slide.4bpp.smol"); const u16 gDecorIconPalette_Slide[] = INCBIN_U16("graphics/decorations/slide.gbapal"); -const u32 gDecorIcon_Tire[] = INCBIN_U32("graphics/decorations/tire.4bpp.lz"); +const u32 gDecorIcon_Tire[] = INCBIN_U32("graphics/decorations/tire.4bpp.smol"); const u16 gDecorIconPalette_Tire[] = INCBIN_U16("graphics/decorations/tire.gbapal"); -const u32 gDecorIcon_Stand[] = INCBIN_U32("graphics/decorations/stand.4bpp.lz"); +const u32 gDecorIcon_Stand[] = INCBIN_U32("graphics/decorations/stand.4bpp.smol"); const u16 gDecorIconPalette_Stand[] = INCBIN_U16("graphics/decorations/stand.gbapal"); -const u32 gDecorIcon_BreakableDoor[] = INCBIN_U32("graphics/decorations/breakable_door.4bpp.lz"); +const u32 gDecorIcon_BreakableDoor[] = INCBIN_U32("graphics/decorations/breakable_door.4bpp.smol"); const u16 gDecorIconPalette_BreakableDoor[] = INCBIN_U16("graphics/decorations/breakable_door.gbapal"); -const u32 gDecorIcon_SandOrnament[] = INCBIN_U32("graphics/decorations/sand_ornament.4bpp.lz"); +const u32 gDecorIcon_SandOrnament[] = INCBIN_U32("graphics/decorations/sand_ornament.4bpp.smol"); const u16 gDecorIconPalette_SandOrnament[] = INCBIN_U16("graphics/decorations/sand_ornament.gbapal"); -const u32 gDecorIcon_GlassOrnament[] = INCBIN_U32("graphics/decorations/glass_ornament.4bpp.lz"); +const u32 gDecorIcon_GlassOrnament[] = INCBIN_U32("graphics/decorations/glass_ornament.4bpp.smol"); const u16 gDecorIconPalette_GlassOrnament[] = INCBIN_U16("graphics/decorations/glass_ornament.gbapal"); -const u32 gDecorIcon_SurfMat[] = INCBIN_U32("graphics/decorations/surf_mat.4bpp.lz"); +const u32 gDecorIcon_SurfMat[] = INCBIN_U32("graphics/decorations/surf_mat.4bpp.smol"); const u16 gDecorIconPalette_SurfMat[] = INCBIN_U16("graphics/decorations/surf_mat.gbapal"); -const u32 gDecorIcon_ThunderMat[] = INCBIN_U32("graphics/decorations/thunder_mat.4bpp.lz"); +const u32 gDecorIcon_ThunderMat[] = INCBIN_U32("graphics/decorations/thunder_mat.4bpp.smol"); const u16 gDecorIconPalette_ThunderMat[] = INCBIN_U16("graphics/decorations/thunder_mat.gbapal"); -const u32 gDecorIcon_FireBlastMat[] = INCBIN_U32("graphics/decorations/fire_blast_mat.4bpp.lz"); +const u32 gDecorIcon_FireBlastMat[] = INCBIN_U32("graphics/decorations/fire_blast_mat.4bpp.smol"); const u16 gDecorIconPalette_FireBlastMat[] = INCBIN_U16("graphics/decorations/fire_blast_mat.gbapal"); -const u32 gDecorIcon_PowderSnowMat[] = INCBIN_U32("graphics/decorations/powder_snow_mat.4bpp.lz"); +const u32 gDecorIcon_PowderSnowMat[] = INCBIN_U32("graphics/decorations/powder_snow_mat.4bpp.smol"); const u16 gDecorIconPalette_PowderSnowMat[] = INCBIN_U16("graphics/decorations/powder_snow_mat.gbapal"); -const u32 gDecorIcon_AttractMat[] = INCBIN_U32("graphics/decorations/attract_mat.4bpp.lz"); +const u32 gDecorIcon_AttractMat[] = INCBIN_U32("graphics/decorations/attract_mat.4bpp.smol"); const u16 gDecorIconPalette_AttractMat[] = INCBIN_U16("graphics/decorations/attract_mat.gbapal"); -const u32 gDecorIcon_FissureMat[] = INCBIN_U32("graphics/decorations/fissure_mat.4bpp.lz"); +const u32 gDecorIcon_FissureMat[] = INCBIN_U32("graphics/decorations/fissure_mat.4bpp.smol"); const u16 gDecorIconPalette_FissureMat[] = INCBIN_U16("graphics/decorations/fissure_mat.gbapal"); -const u32 gDecorIcon_SpikesMat[] = INCBIN_U32("graphics/decorations/spikes_mat.4bpp.lz"); +const u32 gDecorIcon_SpikesMat[] = INCBIN_U32("graphics/decorations/spikes_mat.4bpp.smol"); const u16 gDecorIconPalette_SpikesMat[] = INCBIN_U16("graphics/decorations/spikes_mat.gbapal"); -const u32 gDecorIcon_SnorlaxDoll[] = INCBIN_U32("graphics/decorations/snorlax_doll.4bpp.lz"); +const u32 gDecorIcon_SnorlaxDoll[] = INCBIN_U32("graphics/decorations/snorlax_doll.4bpp.smol"); const u16 gDecorIconPalette_SnorlaxDoll[] = INCBIN_U16("graphics/decorations/snorlax_doll.gbapal"); -const u32 gDecorIcon_RhydonDoll[] = INCBIN_U32("graphics/decorations/rhydon_doll.4bpp.lz"); +const u32 gDecorIcon_RhydonDoll[] = INCBIN_U32("graphics/decorations/rhydon_doll.4bpp.smol"); const u16 gDecorIconPalette_RhydonDoll[] = INCBIN_U16("graphics/decorations/rhydon_doll.gbapal"); -const u32 gDecorIcon_LaprasDoll[] = INCBIN_U32("graphics/decorations/lapras_doll.4bpp.lz"); +const u32 gDecorIcon_LaprasDoll[] = INCBIN_U32("graphics/decorations/lapras_doll.4bpp.smol"); const u16 gDecorIconPalette_LaprasDoll[] = INCBIN_U16("graphics/decorations/lapras_doll.gbapal"); -const u32 gDecorIcon_VenusaurDoll[] = INCBIN_U32("graphics/decorations/venusaur_doll.4bpp.lz"); +const u32 gDecorIcon_VenusaurDoll[] = INCBIN_U32("graphics/decorations/venusaur_doll.4bpp.smol"); const u16 gDecorIconPalette_VenusaurDoll[] = INCBIN_U16("graphics/decorations/venusaur_doll.gbapal"); -const u32 gDecorIcon_CharizardDoll[] = INCBIN_U32("graphics/decorations/charizard_doll.4bpp.lz"); +const u32 gDecorIcon_CharizardDoll[] = INCBIN_U32("graphics/decorations/charizard_doll.4bpp.smol"); const u16 gDecorIconPalette_CharizardDoll[] = INCBIN_U16("graphics/decorations/charizard_doll.gbapal"); -const u32 gDecorIcon_BlastoiseDoll[] = INCBIN_U32("graphics/decorations/blastoise_doll.4bpp.lz"); +const u32 gDecorIcon_BlastoiseDoll[] = INCBIN_U32("graphics/decorations/blastoise_doll.4bpp.smol"); const u16 gDecorIconPalette_BlastoiseDoll[] = INCBIN_U16("graphics/decorations/blastoise_doll.gbapal"); -const u32 gDecorIcon_WailmerDoll[] = INCBIN_U32("graphics/decorations/wailmer_doll.4bpp.lz"); +const u32 gDecorIcon_WailmerDoll[] = INCBIN_U32("graphics/decorations/wailmer_doll.4bpp.smol"); const u16 gDecorIconPalette_WailmerDoll[] = INCBIN_U16("graphics/decorations/wailmer_doll.gbapal"); -const u32 gDecorIcon_RegiceDoll[] = INCBIN_U32("graphics/decorations/regice_doll.4bpp.lz"); +const u32 gDecorIcon_RegiceDoll[] = INCBIN_U32("graphics/decorations/regice_doll.4bpp.smol"); const u16 gDecorIconPalette_RegiceDoll[] = INCBIN_U16("graphics/decorations/regice_doll.gbapal"); -const u32 gDecorIcon_RegirockDoll[] = INCBIN_U32("graphics/decorations/regirock_doll.4bpp.lz"); +const u32 gDecorIcon_RegirockDoll[] = INCBIN_U32("graphics/decorations/regirock_doll.4bpp.smol"); const u16 gDecorIconPalette_RegirockDoll[] = INCBIN_U16("graphics/decorations/regirock_doll.gbapal"); -const u32 gDecorIcon_RegisteelDoll[] = INCBIN_U32("graphics/decorations/registeel_doll.4bpp.lz"); +const u32 gDecorIcon_RegisteelDoll[] = INCBIN_U32("graphics/decorations/registeel_doll.4bpp.smol"); const u16 gDecorIconPalette_RegisteelDoll[] = INCBIN_U16("graphics/decorations/registeel_doll.gbapal"); diff --git a/src/data/graphics/intro_scene.h b/src/data/graphics/intro_scene.h index 8b17b0034637..2ee5a86a0f4b 100644 --- a/src/data/graphics/intro_scene.h +++ b/src/data/graphics/intro_scene.h @@ -6,42 +6,42 @@ const u16 gIntroTorchic_Pal[] = INCBIN_U16("graphics/intro/scene_2/torchic.gbapa const u16 gIntroManectric_Pal[] = INCBIN_U16("graphics/intro/scene_2/manectric.gbapal"); const u16 gIntroFlygon_Pal[] = INCBIN_U16("graphics/intro/scene_2/flygon.gbapal"); -const u32 gIntroVolbeat_Gfx[] = INCBIN_U32("graphics/intro/scene_2/volbeat.4bpp.lz"); -const u32 gIntroTorchic_Gfx[] = INCBIN_U32("graphics/intro/scene_2/torchic.4bpp.lz"); -const u32 gIntroManectric_Gfx[] = INCBIN_U32("graphics/intro/scene_2/manectric.4bpp.lz"); -const u32 gIntroFlygon_Gfx[] = INCBIN_U32("graphics/intro/scene_2/flygon.4bpp.lz"); -const u32 gIntroBrendan_Gfx[] = INCBIN_U32("graphics/intro/scene_2/brendan.4bpp.lz"); -const u32 gIntroMay_Gfx[] = INCBIN_U32("graphics/intro/scene_2/may.4bpp.lz"); +const u32 gIntroVolbeat_Gfx[] = INCBIN_U32("graphics/intro/scene_2/volbeat.4bpp.smol"); +const u32 gIntroTorchic_Gfx[] = INCBIN_U32("graphics/intro/scene_2/torchic.4bpp.smol"); +const u32 gIntroManectric_Gfx[] = INCBIN_U32("graphics/intro/scene_2/manectric.4bpp.smol"); +const u32 gIntroFlygon_Gfx[] = INCBIN_U32("graphics/intro/scene_2/flygon.4bpp.smol"); +const u32 gIntroBrendan_Gfx[] = INCBIN_U32("graphics/intro/scene_2/brendan.4bpp.smol"); +const u32 gIntroMay_Gfx[] = INCBIN_U32("graphics/intro/scene_2/may.4bpp.smol"); -const u32 gIntroGroudon_Gfx[] = INCBIN_U32("graphics/intro/scene_3/groudon.8bpp.lz"); -const u32 gIntroGroudon_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/groudon.bin.lz"); +const u32 gIntroGroudon_Gfx[] = INCBIN_U32("graphics/intro/scene_3/groudon.8bpp.smol"); +const u32 gIntroGroudon_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/groudon.bin.smolTM"); -const u32 gIntroKyogre_Gfx[] = INCBIN_U32("graphics/intro/scene_3/kyogre.8bpp.lz"); -const u32 gIntroKyogre_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/kyogre.bin.lz"); +const u32 gIntroKyogre_Gfx[] = INCBIN_U32("graphics/intro/scene_3/kyogre.8bpp.smol"); +const u32 gIntroKyogre_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/kyogre.bin.smolTM"); -const u32 gIntroLegendBg_Gfx[] = INCBIN_U32("graphics/intro/scene_3/legend_bg.4bpp.lz"); // groudon/kyogre bg -const u32 gIntroGroudonBg_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/groudon_bg.bin.lz"); -const u32 gIntroKyogreBg_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/kyogre_bg.bin.lz"); +const u32 gIntroLegendBg_Gfx[] = INCBIN_U32("graphics/intro/scene_3/legend_bg.4bpp.smol"); // groudon/kyogre bg +const u32 gIntroGroudonBg_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/groudon_bg.bin.smolTM"); +const u32 gIntroKyogreBg_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/kyogre_bg.bin.smolTM"); -const u32 gIntroClouds_Gfx[] = INCBIN_U32("graphics/intro/scene_3/clouds.4bpp.lz"); -const u32 gIntroCloudsLeft_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/clouds_left.bin.lz"); -const u32 gIntroCloudsRight_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/clouds_right.bin.lz"); -const u32 gIntroCloudsSun_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/clouds_sun.bin.lz"); +const u32 gIntroClouds_Gfx[] = INCBIN_U32("graphics/intro/scene_3/clouds.4bpp.smol"); +const u32 gIntroCloudsLeft_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/clouds_left.bin.smolTM"); +const u32 gIntroCloudsRight_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/clouds_right.bin.smolTM"); +const u32 gIntroCloudsSun_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/clouds_sun.bin.smolTM"); -const u32 gIntroLightning_Gfx[] = INCBIN_U32("graphics/intro/scene_3/lightning.4bpp.lz"); +const u32 gIntroLightning_Gfx[] = INCBIN_U32("graphics/intro/scene_3/lightning.4bpp.smol"); const u16 gIntroLightning_Pal[] = INCBIN_U16("graphics/intro/scene_3/lightning.gbapal"); -const u32 gIntroRayquaza_Gfx[] = INCBIN_U32("graphics/intro/scene_3/rayquaza.4bpp.lz"); -const u32 gIntroRayquaza_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/rayquaza.bin.lz"); +const u32 gIntroRayquaza_Gfx[] = INCBIN_U32("graphics/intro/scene_3/rayquaza.4bpp.smol"); +const u32 gIntroRayquaza_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/rayquaza.bin.smolTM"); -const u32 gIntroUnused1_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/unused_1.bin.lz"); -const u32 gIntroUnused2_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/unused_2.bin.lz"); +const u32 gIntroUnused1_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/unused_1.bin.smolTM"); +const u32 gIntroUnused2_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/unused_2.bin.smolTM"); -const u32 gIntroRayquazaClouds_Gfx[] = INCBIN_U32("graphics/intro/scene_3/rayquaza_clouds.4bpp.lz"); -const u32 gIntroRayquazaClouds_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/rayquaza_clouds.bin.lz"); +const u32 gIntroRayquazaClouds_Gfx[] = INCBIN_U32("graphics/intro/scene_3/rayquaza_clouds.4bpp.smol"); +const u32 gIntroRayquazaClouds_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/rayquaza_clouds.bin.smolTM"); -const u32 gIntroBubbles_Gfx[] = INCBIN_U32("graphics/intro/scene_3/bubbles.4bpp.lz"); +const u32 gIntroBubbles_Gfx[] = INCBIN_U32("graphics/intro/scene_3/bubbles.4bpp.smol"); const u16 gIntroBubbles_Pal[] = INCBIN_U16("graphics/intro/scene_3/bubbles.gbapal"); -const u32 gIntroFlygonSilhouette_Gfx[] = INCBIN_U32("graphics/intro/scene_1/flygon.4bpp.lz"); -const u32 gIntroSparkle_Gfx[] = INCBIN_U32("graphics/intro/scene_1/sparkle.4bpp.lz"); +const u32 gIntroFlygonSilhouette_Gfx[] = INCBIN_U32("graphics/intro/scene_1/flygon.4bpp.smol"); +const u32 gIntroSparkle_Gfx[] = INCBIN_U32("graphics/intro/scene_1/sparkle.4bpp.smol"); diff --git a/src/data/graphics/items.h b/src/data/graphics/items.h index 403530effc90..31a78d8c6b8d 100644 --- a/src/data/graphics/items.h +++ b/src/data/graphics/items.h @@ -1,139 +1,139 @@ -const u32 gItemIcon_QuestionMark[] = INCBIN_U32("graphics/items/icons/question_mark.4bpp.lz"); +const u32 gItemIcon_QuestionMark[] = INCBIN_U32("graphics/items/icons/question_mark.4bpp.smol"); const u16 gItemIconPalette_QuestionMark[] = INCBIN_U16("graphics/items/icon_palettes/question_mark.gbapal"); -const u32 gItemIcon_ReturnToFieldArrow[] = INCBIN_U32("graphics/items/icons/return_to_field_arrow.4bpp.lz"); +const u32 gItemIcon_ReturnToFieldArrow[] = INCBIN_U32("graphics/items/icons/return_to_field_arrow.4bpp.smol"); const u16 gItemIconPalette_ReturnToFieldArrow[] = INCBIN_U16("graphics/items/icon_palettes/return_to_field_arrow.gbapal"); // PokΓ© Balls -const u32 gItemIcon_StrangeBall[] = INCBIN_U32("graphics/items/icons/strange_ball.4bpp.lz"); +const u32 gItemIcon_StrangeBall[] = INCBIN_U32("graphics/items/icons/strange_ball.4bpp.smol"); const u16 gItemIconPalette_StrangeBall[] = INCBIN_U16("graphics/items/icon_palettes/strange_ball.gbapal"); -const u32 gItemIcon_PokeBall[] = INCBIN_U32("graphics/items/icons/poke_ball.4bpp.lz"); +const u32 gItemIcon_PokeBall[] = INCBIN_U32("graphics/items/icons/poke_ball.4bpp.smol"); const u16 gItemIconPalette_PokeBall[] = INCBIN_U16("graphics/items/icon_palettes/poke_ball.gbapal"); -const u32 gItemIcon_GreatBall[] = INCBIN_U32("graphics/items/icons/great_ball.4bpp.lz"); +const u32 gItemIcon_GreatBall[] = INCBIN_U32("graphics/items/icons/great_ball.4bpp.smol"); const u16 gItemIconPalette_GreatBall[] = INCBIN_U16("graphics/items/icon_palettes/great_ball.gbapal"); -const u32 gItemIcon_UltraBall[] = INCBIN_U32("graphics/items/icons/ultra_ball.4bpp.lz"); +const u32 gItemIcon_UltraBall[] = INCBIN_U32("graphics/items/icons/ultra_ball.4bpp.smol"); const u16 gItemIconPalette_UltraBall[] = INCBIN_U16("graphics/items/icon_palettes/ultra_ball.gbapal"); -const u32 gItemIcon_MasterBall[] = INCBIN_U32("graphics/items/icons/master_ball.4bpp.lz"); +const u32 gItemIcon_MasterBall[] = INCBIN_U32("graphics/items/icons/master_ball.4bpp.smol"); const u16 gItemIconPalette_MasterBall[] = INCBIN_U16("graphics/items/icon_palettes/master_ball.gbapal"); -const u32 gItemIcon_PremierBall[] = INCBIN_U32("graphics/items/icons/premier_ball.4bpp.lz"); +const u32 gItemIcon_PremierBall[] = INCBIN_U32("graphics/items/icons/premier_ball.4bpp.smol"); -const u32 gItemIcon_HealBall[] = INCBIN_U32("graphics/items/icons/heal_ball.4bpp.lz"); +const u32 gItemIcon_HealBall[] = INCBIN_U32("graphics/items/icons/heal_ball.4bpp.smol"); const u16 gItemIconPalette_HealBall[] = INCBIN_U16("graphics/items/icon_palettes/heal_ball.gbapal"); -const u32 gItemIcon_NetBall[] = INCBIN_U32("graphics/items/icons/net_ball.4bpp.lz"); +const u32 gItemIcon_NetBall[] = INCBIN_U32("graphics/items/icons/net_ball.4bpp.smol"); const u16 gItemIconPalette_NetBall[] = INCBIN_U16("graphics/items/icon_palettes/net_ball.gbapal"); -const u32 gItemIcon_NestBall[] = INCBIN_U32("graphics/items/icons/nest_ball.4bpp.lz"); +const u32 gItemIcon_NestBall[] = INCBIN_U32("graphics/items/icons/nest_ball.4bpp.smol"); const u16 gItemIconPalette_NestBall[] = INCBIN_U16("graphics/items/icon_palettes/nest_ball.gbapal"); -const u32 gItemIcon_DiveBall[] = INCBIN_U32("graphics/items/icons/dive_ball.4bpp.lz"); +const u32 gItemIcon_DiveBall[] = INCBIN_U32("graphics/items/icons/dive_ball.4bpp.smol"); const u16 gItemIconPalette_DiveBall[] = INCBIN_U16("graphics/items/icon_palettes/dive_ball.gbapal"); -const u32 gItemIcon_DuskBall[] = INCBIN_U32("graphics/items/icons/dusk_ball.4bpp.lz"); +const u32 gItemIcon_DuskBall[] = INCBIN_U32("graphics/items/icons/dusk_ball.4bpp.smol"); const u16 gItemIconPalette_DuskBall[] = INCBIN_U16("graphics/items/icon_palettes/dusk_ball.gbapal"); -const u32 gItemIcon_TimerBall[] = INCBIN_U32("graphics/items/icons/timer_ball.4bpp.lz"); +const u32 gItemIcon_TimerBall[] = INCBIN_U32("graphics/items/icons/timer_ball.4bpp.smol"); -const u32 gItemIcon_QuickBall[] = INCBIN_U32("graphics/items/icons/quick_ball.4bpp.lz"); +const u32 gItemIcon_QuickBall[] = INCBIN_U32("graphics/items/icons/quick_ball.4bpp.smol"); const u16 gItemIconPalette_QuickBall[] = INCBIN_U16("graphics/items/icon_palettes/quick_ball.gbapal"); -const u32 gItemIcon_RepeatBall[] = INCBIN_U32("graphics/items/icons/repeat_ball.4bpp.lz"); +const u32 gItemIcon_RepeatBall[] = INCBIN_U32("graphics/items/icons/repeat_ball.4bpp.smol"); const u16 gItemIconPalette_RepeatBall[] = INCBIN_U16("graphics/items/icon_palettes/repeat_ball.gbapal"); -const u32 gItemIcon_LuxuryBall[] = INCBIN_U32("graphics/items/icons/luxury_ball.4bpp.lz"); +const u32 gItemIcon_LuxuryBall[] = INCBIN_U32("graphics/items/icons/luxury_ball.4bpp.smol"); const u16 gItemIconPalette_LuxuryBall[] = INCBIN_U16("graphics/items/icon_palettes/luxury_ball.gbapal"); -const u32 gItemIcon_LevelBall[] = INCBIN_U32("graphics/items/icons/level_ball.4bpp.lz"); +const u32 gItemIcon_LevelBall[] = INCBIN_U32("graphics/items/icons/level_ball.4bpp.smol"); const u16 gItemIconPalette_LevelBall[] = INCBIN_U16("graphics/items/icon_palettes/level_ball.gbapal"); -const u32 gItemIcon_LureBall[] = INCBIN_U32("graphics/items/icons/lure_ball.4bpp.lz"); +const u32 gItemIcon_LureBall[] = INCBIN_U32("graphics/items/icons/lure_ball.4bpp.smol"); const u16 gItemIconPalette_LureBall[] = INCBIN_U16("graphics/items/icon_palettes/lure_ball.gbapal"); -const u32 gItemIcon_MoonBall[] = INCBIN_U32("graphics/items/icons/moon_ball.4bpp.lz"); +const u32 gItemIcon_MoonBall[] = INCBIN_U32("graphics/items/icons/moon_ball.4bpp.smol"); const u16 gItemIconPalette_MoonBall[] = INCBIN_U16("graphics/items/icon_palettes/moon_ball.gbapal"); -const u32 gItemIcon_FriendBall[] = INCBIN_U32("graphics/items/icons/friend_ball.4bpp.lz"); +const u32 gItemIcon_FriendBall[] = INCBIN_U32("graphics/items/icons/friend_ball.4bpp.smol"); const u16 gItemIconPalette_FriendBall[] = INCBIN_U16("graphics/items/icon_palettes/friend_ball.gbapal"); -const u32 gItemIcon_LoveBall[] = INCBIN_U32("graphics/items/icons/love_ball.4bpp.lz"); +const u32 gItemIcon_LoveBall[] = INCBIN_U32("graphics/items/icons/love_ball.4bpp.smol"); const u16 gItemIconPalette_LoveBall[] = INCBIN_U16("graphics/items/icon_palettes/love_ball.gbapal"); -const u32 gItemIcon_FastBall[] = INCBIN_U32("graphics/items/icons/fast_ball.4bpp.lz"); +const u32 gItemIcon_FastBall[] = INCBIN_U32("graphics/items/icons/fast_ball.4bpp.smol"); const u16 gItemIconPalette_FastBall[] = INCBIN_U16("graphics/items/icon_palettes/fast_ball.gbapal"); -const u32 gItemIcon_HeavyBall[] = INCBIN_U32("graphics/items/icons/heavy_ball.4bpp.lz"); +const u32 gItemIcon_HeavyBall[] = INCBIN_U32("graphics/items/icons/heavy_ball.4bpp.smol"); const u16 gItemIconPalette_HeavyBall[] = INCBIN_U16("graphics/items/icon_palettes/heavy_ball.gbapal"); -const u32 gItemIcon_DreamBall[] = INCBIN_U32("graphics/items/icons/dream_ball.4bpp.lz"); +const u32 gItemIcon_DreamBall[] = INCBIN_U32("graphics/items/icons/dream_ball.4bpp.smol"); const u16 gItemIconPalette_DreamBall[] = INCBIN_U16("graphics/items/icon_palettes/dream_ball.gbapal"); -const u32 gItemIcon_SafariBall[] = INCBIN_U32("graphics/items/icons/safari_ball.4bpp.lz"); +const u32 gItemIcon_SafariBall[] = INCBIN_U32("graphics/items/icons/safari_ball.4bpp.smol"); const u16 gItemIconPalette_SafariBall[] = INCBIN_U16("graphics/items/icon_palettes/safari_ball.gbapal"); -const u32 gItemIcon_SportBall[] = INCBIN_U32("graphics/items/icons/sport_ball.4bpp.lz"); +const u32 gItemIcon_SportBall[] = INCBIN_U32("graphics/items/icons/sport_ball.4bpp.smol"); const u16 gItemIconPalette_SportBall[] = INCBIN_U16("graphics/items/icon_palettes/sport_ball.gbapal"); -const u32 gItemIcon_ParkBall[] = INCBIN_U32("graphics/items/icons/park_ball.4bpp.lz"); +const u32 gItemIcon_ParkBall[] = INCBIN_U32("graphics/items/icons/park_ball.4bpp.smol"); const u16 gItemIconPalette_ParkBall[] = INCBIN_U16("graphics/items/icon_palettes/park_ball.gbapal"); -const u32 gItemIcon_BeastBall[] = INCBIN_U32("graphics/items/icons/beast_ball.4bpp.lz"); +const u32 gItemIcon_BeastBall[] = INCBIN_U32("graphics/items/icons/beast_ball.4bpp.smol"); const u16 gItemIconPalette_BeastBall[] = INCBIN_U16("graphics/items/icon_palettes/beast_ball.gbapal"); -const u32 gItemIcon_CherishBall[] = INCBIN_U32("graphics/items/icons/cherish_ball.4bpp.lz"); +const u32 gItemIcon_CherishBall[] = INCBIN_U32("graphics/items/icons/cherish_ball.4bpp.smol"); const u16 gItemIconPalette_CherishBall[] = INCBIN_U16("graphics/items/icon_palettes/cherish_ball.gbapal"); // Medicine -const u32 gItemIcon_Potion[] = INCBIN_U32("graphics/items/icons/potion.4bpp.lz"); +const u32 gItemIcon_Potion[] = INCBIN_U32("graphics/items/icons/potion.4bpp.smol"); const u16 gItemIconPalette_Potion[] = INCBIN_U16("graphics/items/icon_palettes/potion.gbapal"); const u16 gItemIconPalette_SuperPotion[] = INCBIN_U16("graphics/items/icon_palettes/super_potion.gbapal"); const u16 gItemIconPalette_HyperPotion[] = INCBIN_U16("graphics/items/icon_palettes/hyper_potion.gbapal"); -const u32 gItemIcon_LargePotion[] = INCBIN_U32("graphics/items/icons/large_potion.4bpp.lz"); +const u32 gItemIcon_LargePotion[] = INCBIN_U32("graphics/items/icons/large_potion.4bpp.smol"); const u16 gItemIconPalette_MaxPotion[] = INCBIN_U16("graphics/items/icon_palettes/max_potion.gbapal"); const u16 gItemIconPalette_FullRestore[] = INCBIN_U16("graphics/items/icon_palettes/full_restore.gbapal"); -const u32 gItemIcon_Revive[] = INCBIN_U32("graphics/items/icons/revive.4bpp.lz"); +const u32 gItemIcon_Revive[] = INCBIN_U32("graphics/items/icons/revive.4bpp.smol"); const u16 gItemIconPalette_Revive[] = INCBIN_U16("graphics/items/icon_palettes/revive.gbapal"); -const u32 gItemIcon_MaxRevive[] = INCBIN_U32("graphics/items/icons/max_revive.4bpp.lz"); +const u32 gItemIcon_MaxRevive[] = INCBIN_U32("graphics/items/icons/max_revive.4bpp.smol"); -const u32 gItemIcon_FreshWater[] = INCBIN_U32("graphics/items/icons/fresh_water.4bpp.lz"); +const u32 gItemIcon_FreshWater[] = INCBIN_U32("graphics/items/icons/fresh_water.4bpp.smol"); const u16 gItemIconPalette_FreshWater[] = INCBIN_U16("graphics/items/icon_palettes/fresh_water.gbapal"); -const u32 gItemIcon_SodaPop[] = INCBIN_U32("graphics/items/icons/soda_pop.4bpp.lz"); +const u32 gItemIcon_SodaPop[] = INCBIN_U32("graphics/items/icons/soda_pop.4bpp.smol"); const u16 gItemIconPalette_SodaPop[] = INCBIN_U16("graphics/items/icon_palettes/soda_pop.gbapal"); -const u32 gItemIcon_Lemonade[] = INCBIN_U32("graphics/items/icons/lemonade.4bpp.lz"); +const u32 gItemIcon_Lemonade[] = INCBIN_U32("graphics/items/icons/lemonade.4bpp.smol"); const u16 gItemIconPalette_Lemonade[] = INCBIN_U16("graphics/items/icon_palettes/lemonade.gbapal"); -const u32 gItemIcon_MoomooMilk[] = INCBIN_U32("graphics/items/icons/moomoo_milk.4bpp.lz"); +const u32 gItemIcon_MoomooMilk[] = INCBIN_U32("graphics/items/icons/moomoo_milk.4bpp.smol"); const u16 gItemIconPalette_MoomooMilk[] = INCBIN_U16("graphics/items/icon_palettes/moomoo_milk.gbapal"); -const u32 gItemIcon_Powder[] = INCBIN_U32("graphics/items/icons/powder.4bpp.lz"); +const u32 gItemIcon_Powder[] = INCBIN_U32("graphics/items/icons/powder.4bpp.smol"); const u16 gItemIconPalette_EnergyPowder[] = INCBIN_U16("graphics/items/icon_palettes/energy_powder.gbapal"); -const u32 gItemIcon_EnergyRoot[] = INCBIN_U32("graphics/items/icons/energy_root.4bpp.lz"); +const u32 gItemIcon_EnergyRoot[] = INCBIN_U32("graphics/items/icons/energy_root.4bpp.smol"); const u16 gItemIconPalette_EnergyRoot[] = INCBIN_U16("graphics/items/icon_palettes/energy_root.gbapal"); const u16 gItemIconPalette_HealPowder[] = INCBIN_U16("graphics/items/icon_palettes/heal_powder.gbapal"); -const u32 gItemIcon_RevivalHerb[] = INCBIN_U32("graphics/items/icons/revival_herb.4bpp.lz"); +const u32 gItemIcon_RevivalHerb[] = INCBIN_U32("graphics/items/icons/revival_herb.4bpp.smol"); const u16 gItemIconPalette_RevivalHerb[] = INCBIN_U16("graphics/items/icon_palettes/revival_herb.gbapal"); -const u32 gItemIcon_Antidote[] = INCBIN_U32("graphics/items/icons/antidote.4bpp.lz"); +const u32 gItemIcon_Antidote[] = INCBIN_U32("graphics/items/icons/antidote.4bpp.smol"); const u16 gItemIconPalette_Antidote[] = INCBIN_U16("graphics/items/icon_palettes/antidote.gbapal"); -const u32 gItemIcon_StatusHeal[] = INCBIN_U32("graphics/items/icons/status_heal.4bpp.lz"); +const u32 gItemIcon_StatusHeal[] = INCBIN_U32("graphics/items/icons/status_heal.4bpp.smol"); const u16 gItemIconPalette_ParalyzeHeal[] = INCBIN_U16("graphics/items/icon_palettes/paralyze_heal.gbapal"); const u16 gItemIconPalette_BurnHeal[] = INCBIN_U16("graphics/items/icon_palettes/burn_heal.gbapal"); @@ -142,10 +142,10 @@ const u16 gItemIconPalette_IceHeal[] = INCBIN_U16("graphics/items/icon_palettes/ const u16 gItemIconPalette_Awakening[] = INCBIN_U16("graphics/items/icon_palettes/awakening.gbapal"); -const u32 gItemIcon_FullHeal[] = INCBIN_U32("graphics/items/icons/full_heal.4bpp.lz"); +const u32 gItemIcon_FullHeal[] = INCBIN_U32("graphics/items/icons/full_heal.4bpp.smol"); const u16 gItemIconPalette_FullHeal[] = INCBIN_U16("graphics/items/icon_palettes/full_heal.gbapal"); -const u32 gItemIcon_Ether[] = INCBIN_U32("graphics/items/icons/ether.4bpp.lz"); +const u32 gItemIcon_Ether[] = INCBIN_U32("graphics/items/icons/ether.4bpp.smol"); const u16 gItemIconPalette_Ether[] = INCBIN_U16("graphics/items/icon_palettes/ether.gbapal"); const u16 gItemIconPalette_MaxEther[] = INCBIN_U16("graphics/items/icon_palettes/max_ether.gbapal"); @@ -154,50 +154,50 @@ const u16 gItemIconPalette_Elixir[] = INCBIN_U16("graphics/items/icon_palettes/e const u16 gItemIconPalette_MaxElixir[] = INCBIN_U16("graphics/items/icon_palettes/max_elixir.gbapal"); -const u32 gItemIcon_BerryJuice[] = INCBIN_U32("graphics/items/icons/berry_juice.4bpp.lz"); +const u32 gItemIcon_BerryJuice[] = INCBIN_U32("graphics/items/icons/berry_juice.4bpp.smol"); const u16 gItemIconPalette_BerryJuice[] = INCBIN_U16("graphics/items/icon_palettes/berry_juice.gbapal"); -const u32 gItemIcon_SacredAsh[] = INCBIN_U32("graphics/items/icons/sacred_ash.4bpp.lz"); +const u32 gItemIcon_SacredAsh[] = INCBIN_U32("graphics/items/icons/sacred_ash.4bpp.smol"); const u16 gItemIconPalette_SacredAsh[] = INCBIN_U16("graphics/items/icon_palettes/sacred_ash.gbapal"); -const u32 gItemIcon_SweetHeart[] = INCBIN_U32("graphics/items/icons/sweet_heart.4bpp.lz"); +const u32 gItemIcon_SweetHeart[] = INCBIN_U32("graphics/items/icons/sweet_heart.4bpp.smol"); const u16 gItemIconPalette_SweetHeart[] = INCBIN_U16("graphics/items/icon_palettes/sweet_heart.gbapal"); -const u32 gItemIcon_MaxHoney[] = INCBIN_U32("graphics/items/icons/max_honey.4bpp.lz"); +const u32 gItemIcon_MaxHoney[] = INCBIN_U32("graphics/items/icons/max_honey.4bpp.smol"); const u16 gItemIconPalette_MaxHoney[] = INCBIN_U16("graphics/items/icon_palettes/max_honey.gbapal"); // Regional Specialties -const u32 gItemIcon_PewterCrunchies[] = INCBIN_U32("graphics/items/icons/pewter_crunchies.4bpp.lz"); +const u32 gItemIcon_PewterCrunchies[] = INCBIN_U32("graphics/items/icons/pewter_crunchies.4bpp.smol"); const u16 gItemIconPalette_PewterCrunchies[] = INCBIN_U16("graphics/items/icon_palettes/pewter_crunchies.gbapal"); -const u32 gItemIcon_RageCandyBar[] = INCBIN_U32("graphics/items/icons/rage_candy_bar.4bpp.lz"); +const u32 gItemIcon_RageCandyBar[] = INCBIN_U32("graphics/items/icons/rage_candy_bar.4bpp.smol"); const u16 gItemIconPalette_RageCandyBar[] = INCBIN_U16("graphics/items/icon_palettes/rage_candy_bar.gbapal"); -const u32 gItemIcon_LavaCookie[] = INCBIN_U32("graphics/items/icons/lava_cookie.4bpp.lz"); +const u32 gItemIcon_LavaCookie[] = INCBIN_U32("graphics/items/icons/lava_cookie.4bpp.smol"); const u16 gItemIconPalette_LavaCookieAndLetter[] = INCBIN_U16("graphics/items/icon_palettes/lava_cookie_and_letter.gbapal"); -const u32 gItemIcon_OldGateau[] = INCBIN_U32("graphics/items/icons/old_gateau.4bpp.lz"); +const u32 gItemIcon_OldGateau[] = INCBIN_U32("graphics/items/icons/old_gateau.4bpp.smol"); const u16 gItemIconPalette_OldGateau[] = INCBIN_U16("graphics/items/icon_palettes/old_gateau.gbapal"); -const u32 gItemIcon_Casteliacone[] = INCBIN_U32("graphics/items/icons/casteliacone.4bpp.lz"); +const u32 gItemIcon_Casteliacone[] = INCBIN_U32("graphics/items/icons/casteliacone.4bpp.smol"); const u16 gItemIconPalette_Casteliacone[] = INCBIN_U16("graphics/items/icon_palettes/casteliacone.gbapal"); -const u32 gItemIcon_LumioseGalette[] = INCBIN_U32("graphics/items/icons/lumiose_galette.4bpp.lz"); +const u32 gItemIcon_LumioseGalette[] = INCBIN_U32("graphics/items/icons/lumiose_galette.4bpp.smol"); const u16 gItemIconPalette_LumioseGalette[] = INCBIN_U16("graphics/items/icon_palettes/lumiose_galette.gbapal"); -const u32 gItemIcon_ShalourSable[] = INCBIN_U32("graphics/items/icons/shalour_sable.4bpp.lz"); +const u32 gItemIcon_ShalourSable[] = INCBIN_U32("graphics/items/icons/shalour_sable.4bpp.smol"); const u16 gItemIconPalette_ShalourSable[] = INCBIN_U16("graphics/items/icon_palettes/shalour_sable.gbapal"); -const u32 gItemIcon_BigMalasada[] = INCBIN_U32("graphics/items/icons/big_malasada.4bpp.lz"); +const u32 gItemIcon_BigMalasada[] = INCBIN_U32("graphics/items/icons/big_malasada.4bpp.smol"); const u16 gItemIconPalette_BigMalasada[] = INCBIN_U16("graphics/items/icon_palettes/big_malasada.gbapal"); // Vitamins -const u32 gItemIcon_HPUp[] = INCBIN_U32("graphics/items/icons/hp_up.4bpp.lz"); +const u32 gItemIcon_HPUp[] = INCBIN_U32("graphics/items/icons/hp_up.4bpp.smol"); const u16 gItemIconPalette_HPUp[] = INCBIN_U16("graphics/items/icon_palettes/hp_up.gbapal"); -const u32 gItemIcon_Vitamin[] = INCBIN_U32("graphics/items/icons/vitamin.4bpp.lz"); +const u32 gItemIcon_Vitamin[] = INCBIN_U32("graphics/items/icons/vitamin.4bpp.smol"); const u16 gItemIconPalette_Protein[] = INCBIN_U16("graphics/items/icon_palettes/protein.gbapal"); const u16 gItemIconPalette_Iron[] = INCBIN_U16("graphics/items/icon_palettes/iron.gbapal"); @@ -208,43 +208,43 @@ const u16 gItemIconPalette_Zinc[] = INCBIN_U16("graphics/items/icon_palettes/zin const u16 gItemIconPalette_Carbos[] = INCBIN_U16("graphics/items/icon_palettes/carbos.gbapal"); -const u32 gItemIcon_PPUp[] = INCBIN_U32("graphics/items/icons/pp_up.4bpp.lz"); +const u32 gItemIcon_PPUp[] = INCBIN_U32("graphics/items/icons/pp_up.4bpp.smol"); const u16 gItemIconPalette_PPUp[] = INCBIN_U16("graphics/items/icon_palettes/pp_up.gbapal"); -const u32 gItemIcon_PPMax[] = INCBIN_U32("graphics/items/icons/pp_max.4bpp.lz"); +const u32 gItemIcon_PPMax[] = INCBIN_U32("graphics/items/icons/pp_max.4bpp.smol"); const u16 gItemIconPalette_PPMax[] = INCBIN_U16("graphics/items/icon_palettes/pp_max.gbapal"); // EV Feathers -const u32 gItemIcon_HealthFeather[] = INCBIN_U32("graphics/items/icons/health_feather.4bpp.lz"); +const u32 gItemIcon_HealthFeather[] = INCBIN_U32("graphics/items/icons/health_feather.4bpp.smol"); const u16 gItemIconPalette_HealthFeather[] = INCBIN_U16("graphics/items/icon_palettes/health_feather.gbapal"); -const u32 gItemIcon_MuscleFeather[] = INCBIN_U32("graphics/items/icons/muscle_feather.4bpp.lz"); +const u32 gItemIcon_MuscleFeather[] = INCBIN_U32("graphics/items/icons/muscle_feather.4bpp.smol"); const u16 gItemIconPalette_MuscleFeather[] = INCBIN_U16("graphics/items/icon_palettes/muscle_feather.gbapal"); -const u32 gItemIcon_ResistFeather[] = INCBIN_U32("graphics/items/icons/resist_feather.4bpp.lz"); +const u32 gItemIcon_ResistFeather[] = INCBIN_U32("graphics/items/icons/resist_feather.4bpp.smol"); const u16 gItemIconPalette_ResistFeather[] = INCBIN_U16("graphics/items/icon_palettes/resist_feather.gbapal"); -const u32 gItemIcon_GeniusFeather[] = INCBIN_U32("graphics/items/icons/genius_feather.4bpp.lz"); +const u32 gItemIcon_GeniusFeather[] = INCBIN_U32("graphics/items/icons/genius_feather.4bpp.smol"); const u16 gItemIconPalette_GeniusFeather[] = INCBIN_U16("graphics/items/icon_palettes/genius_feather.gbapal"); -const u32 gItemIcon_CleverFeather[] = INCBIN_U32("graphics/items/icons/clever_feather.4bpp.lz"); +const u32 gItemIcon_CleverFeather[] = INCBIN_U32("graphics/items/icons/clever_feather.4bpp.smol"); const u16 gItemIconPalette_CleverFeather[] = INCBIN_U16("graphics/items/icon_palettes/clever_feather.gbapal"); -const u32 gItemIcon_SwiftFeather[] = INCBIN_U32("graphics/items/icons/swift_feather.4bpp.lz"); +const u32 gItemIcon_SwiftFeather[] = INCBIN_U32("graphics/items/icons/swift_feather.4bpp.smol"); const u16 gItemIconPalette_SwiftFeather[] = INCBIN_U16("graphics/items/icon_palettes/swift_feather.gbapal"); // Ability Modifiers -const u32 gItemIcon_AbilityCapsule[] = INCBIN_U32("graphics/items/icons/ability_capsule.4bpp.lz"); +const u32 gItemIcon_AbilityCapsule[] = INCBIN_U32("graphics/items/icons/ability_capsule.4bpp.smol"); const u16 gItemIconPalette_AbilityCapsule[] = INCBIN_U16("graphics/items/icon_palettes/ability_capsule.gbapal"); -const u32 gItemIcon_AbilityPatch[] = INCBIN_U32("graphics/items/icons/ability_patch.4bpp.lz"); +const u32 gItemIcon_AbilityPatch[] = INCBIN_U32("graphics/items/icons/ability_patch.4bpp.smol"); const u16 gItemIconPalette_AbilityPatch[] = INCBIN_U16("graphics/items/icon_palettes/ability_patch.gbapal"); // Mints -const u32 gItemIcon_Mint[] = INCBIN_U32("graphics/items/icons/mint.4bpp.lz"); +const u32 gItemIcon_Mint[] = INCBIN_U32("graphics/items/icons/mint.4bpp.smol"); const u16 gItemIconPalette_RedMint[] = INCBIN_U16("graphics/items/icon_palettes/red_mint.gbapal"); const u16 gItemIconPalette_BlueMint[] = INCBIN_U16("graphics/items/icon_palettes/blue_mint.gbapal"); const u16 gItemIconPalette_LightBlueMint[] = INCBIN_U16("graphics/items/icon_palettes/light_blue_mint.gbapal"); @@ -254,22 +254,22 @@ const u16 gItemIconPalette_YellowMint[] = INCBIN_U16("graphics/items/icon_palett // Candy -const u32 gItemIcon_RareCandy[] = INCBIN_U32("graphics/items/icons/rare_candy.4bpp.lz"); +const u32 gItemIcon_RareCandy[] = INCBIN_U32("graphics/items/icons/rare_candy.4bpp.smol"); const u16 gItemIconPalette_RareCandy[] = INCBIN_U16("graphics/items/icon_palettes/rare_candy.gbapal"); -const u32 gItemIcon_ExpCandyXS[] = INCBIN_U32("graphics/items/icons/exp_candy_xs.4bpp.lz"); -const u32 gItemIcon_ExpCandyS[] = INCBIN_U32("graphics/items/icons/exp_candy_s.4bpp.lz"); -const u32 gItemIcon_ExpCandyM[] = INCBIN_U32("graphics/items/icons/exp_candy_m.4bpp.lz"); -const u32 gItemIcon_ExpCandyL[] = INCBIN_U32("graphics/items/icons/exp_candy_l.4bpp.lz"); -const u32 gItemIcon_ExpCandyXL[] = INCBIN_U32("graphics/items/icons/exp_candy_xl.4bpp.lz"); +const u32 gItemIcon_ExpCandyXS[] = INCBIN_U32("graphics/items/icons/exp_candy_xs.4bpp.smol"); +const u32 gItemIcon_ExpCandyS[] = INCBIN_U32("graphics/items/icons/exp_candy_s.4bpp.smol"); +const u32 gItemIcon_ExpCandyM[] = INCBIN_U32("graphics/items/icons/exp_candy_m.4bpp.smol"); +const u32 gItemIcon_ExpCandyL[] = INCBIN_U32("graphics/items/icons/exp_candy_l.4bpp.smol"); +const u32 gItemIcon_ExpCandyXL[] = INCBIN_U32("graphics/items/icons/exp_candy_xl.4bpp.smol"); const u16 gItemIconPalette_ExpCandies[] = INCBIN_U16("graphics/items/icon_palettes/exp_candies.gbapal"); -const u32 gItemIcon_DynamaxCandy[] = INCBIN_U32("graphics/items/icons/dynamax_candy.4bpp.lz"); +const u32 gItemIcon_DynamaxCandy[] = INCBIN_U32("graphics/items/icons/dynamax_candy.4bpp.smol"); const u16 gItemIconPalette_DynamaxCandy[] = INCBIN_U16("graphics/items/icon_palettes/dynamax_candy.gbapal"); // Medicinal Flutes -const u32 gItemIcon_Flute[] = INCBIN_U32("graphics/items/icons/flute.4bpp.lz"); +const u32 gItemIcon_Flute[] = INCBIN_U32("graphics/items/icons/flute.4bpp.smol"); const u16 gItemIconPalette_BlueFlute[] = INCBIN_U16("graphics/items/icon_palettes/blue_flute.gbapal"); const u16 gItemIconPalette_YellowFlute[] = INCBIN_U16("graphics/items/icon_palettes/yellow_flute.gbapal"); @@ -284,31 +284,31 @@ const u16 gItemIconPalette_WhiteFlute[] = INCBIN_U16("graphics/items/icon_palett // Encounter Modifiers -const u32 gItemIcon_Repel[] = INCBIN_U32("graphics/items/icons/repel.4bpp.lz"); +const u32 gItemIcon_Repel[] = INCBIN_U32("graphics/items/icons/repel.4bpp.smol"); const u16 gItemIconPalette_Repel[] = INCBIN_U16("graphics/items/icon_palettes/repel.gbapal"); const u16 gItemIconPalette_SuperRepel[] = INCBIN_U16("graphics/items/icon_palettes/super_repel.gbapal"); const u16 gItemIconPalette_MaxRepel[] = INCBIN_U16("graphics/items/icon_palettes/max_repel.gbapal"); -const u32 gItemIcon_Lure[] = INCBIN_U32("graphics/items/icons/lure.4bpp.lz"); +const u32 gItemIcon_Lure[] = INCBIN_U32("graphics/items/icons/lure.4bpp.smol"); const u16 gItemIconPalette_Lure[] = INCBIN_U16("graphics/items/icon_palettes/lure.gbapal"); const u16 gItemIconPalette_SuperLure[] = INCBIN_U16("graphics/items/icon_palettes/super_lure.gbapal"); const u16 gItemIconPalette_MaxLure[] = INCBIN_U16("graphics/items/icon_palettes/max_lure.gbapal"); -const u32 gItemIcon_EscapeRope[] = INCBIN_U32("graphics/items/icons/escape_rope.4bpp.lz"); +const u32 gItemIcon_EscapeRope[] = INCBIN_U32("graphics/items/icons/escape_rope.4bpp.smol"); const u16 gItemIconPalette_EscapeRope[] = INCBIN_U16("graphics/items/icon_palettes/escape_rope.gbapal"); // X Items -const u32 gItemIcon_BattleStatItem[] = INCBIN_U32("graphics/items/icons/battle_stat_item.4bpp.lz"); +const u32 gItemIcon_BattleStatItem[] = INCBIN_U32("graphics/items/icons/battle_stat_item.4bpp.smol"); const u16 gItemIconPalette_XAttack[] = INCBIN_U16("graphics/items/icon_palettes/x_attack.gbapal"); const u16 gItemIconPalette_XDefend[] = INCBIN_U16("graphics/items/icon_palettes/x_defend.gbapal"); const u16 gItemIconPalette_XSpecial[] = INCBIN_U16("graphics/items/icon_palettes/x_special.gbapal"); -const u32 gItemIcon_XSpecialDefense[] = INCBIN_U32("graphics/items/icons/x_special_defense.4bpp.lz"); +const u32 gItemIcon_XSpecialDefense[] = INCBIN_U32("graphics/items/icons/x_special_defense.4bpp.smol"); const u16 gItemIconPalette_XSpecialDefense[] = INCBIN_U16("graphics/items/icon_palettes/x_special_defense.gbapal"); const u16 gItemIconPalette_XSpeed[] = INCBIN_U16("graphics/items/icon_palettes/x_speed.gbapal"); @@ -321,60 +321,60 @@ const u16 gItemIconPalette_GuardSpec[] = INCBIN_U16("graphics/items/icon_palette // Escape Items -const u32 gItemIcon_PokeDoll[] = INCBIN_U32("graphics/items/icons/poke_doll.4bpp.lz"); +const u32 gItemIcon_PokeDoll[] = INCBIN_U32("graphics/items/icons/poke_doll.4bpp.smol"); const u16 gItemIconPalette_PokeDoll[] = INCBIN_U16("graphics/items/icon_palettes/poke_doll.gbapal"); -const u32 gItemIcon_FluffyTail[] = INCBIN_U32("graphics/items/icons/fluffy_tail.4bpp.lz"); +const u32 gItemIcon_FluffyTail[] = INCBIN_U32("graphics/items/icons/fluffy_tail.4bpp.smol"); const u16 gItemIconPalette_FluffyTail[] = INCBIN_U16("graphics/items/icon_palettes/fluffy_tail.gbapal"); -const u32 gItemIcon_PokeToy[] = INCBIN_U32("graphics/items/icons/poke_toy.4bpp.lz"); +const u32 gItemIcon_PokeToy[] = INCBIN_U32("graphics/items/icons/poke_toy.4bpp.smol"); const u16 gItemIconPalette_PokeToy[] = INCBIN_U16("graphics/items/icon_palettes/poke_toy.gbapal"); -const u32 gItemIcon_MaxMushrooms[] = INCBIN_U32("graphics/items/icons/max_mushrooms.4bpp.lz"); +const u32 gItemIcon_MaxMushrooms[] = INCBIN_U32("graphics/items/icons/max_mushrooms.4bpp.smol"); const u16 gItemIconPalette_MaxMushrooms[] = INCBIN_U16("graphics/items/icon_palettes/max_mushrooms.gbapal"); // Treasures -const u32 gItemIcon_BottleCap[] = INCBIN_U32("graphics/items/icons/bottle_cap.4bpp.lz"); +const u32 gItemIcon_BottleCap[] = INCBIN_U32("graphics/items/icons/bottle_cap.4bpp.smol"); const u16 gItemIconPalette_BottleCap[] = INCBIN_U16("graphics/items/icon_palettes/bottle_cap.gbapal"); const u16 gItemIconPalette_GoldBottleCap[] = INCBIN_U16("graphics/items/icon_palettes/gold_bottle_cap.gbapal"); -const u32 gItemIcon_Nugget[] = INCBIN_U32("graphics/items/icons/nugget.4bpp.lz"); +const u32 gItemIcon_Nugget[] = INCBIN_U32("graphics/items/icons/nugget.4bpp.smol"); const u16 gItemIconPalette_Nugget[] = INCBIN_U16("graphics/items/icon_palettes/nugget.gbapal"); -const u32 gItemIcon_BigNugget[] = INCBIN_U32("graphics/items/icons/big_nugget.4bpp.lz"); +const u32 gItemIcon_BigNugget[] = INCBIN_U32("graphics/items/icons/big_nugget.4bpp.smol"); const u16 gItemIconPalette_BigNugget[] = INCBIN_U16("graphics/items/icon_palettes/big_nugget.gbapal"); -const u32 gItemIcon_TinyMushroom[] = INCBIN_U32("graphics/items/icons/tiny_mushroom.4bpp.lz"); +const u32 gItemIcon_TinyMushroom[] = INCBIN_U32("graphics/items/icons/tiny_mushroom.4bpp.smol"); const u16 gItemIconPalette_Mushroom[] = INCBIN_U16("graphics/items/icon_palettes/mushroom.gbapal"); -const u32 gItemIcon_BigMushroom[] = INCBIN_U32("graphics/items/icons/big_mushroom.4bpp.lz"); +const u32 gItemIcon_BigMushroom[] = INCBIN_U32("graphics/items/icons/big_mushroom.4bpp.smol"); -const u32 gItemIcon_BalmMushroom[] = INCBIN_U32("graphics/items/icons/balm_mushroom.4bpp.lz"); +const u32 gItemIcon_BalmMushroom[] = INCBIN_U32("graphics/items/icons/balm_mushroom.4bpp.smol"); const u16 gItemIconPalette_BalmMushroom[] = INCBIN_U16("graphics/items/icon_palettes/balm_mushroom.gbapal"); -const u32 gItemIcon_Pearl[] = INCBIN_U32("graphics/items/icons/pearl.4bpp.lz"); +const u32 gItemIcon_Pearl[] = INCBIN_U32("graphics/items/icons/pearl.4bpp.smol"); const u16 gItemIconPalette_Pearl[] = INCBIN_U16("graphics/items/icon_palettes/pearl.gbapal"); -const u32 gItemIcon_BigPearl[] = INCBIN_U32("graphics/items/icons/big_pearl.4bpp.lz"); +const u32 gItemIcon_BigPearl[] = INCBIN_U32("graphics/items/icons/big_pearl.4bpp.smol"); -const u32 gItemIcon_PearlString[] = INCBIN_U32("graphics/items/icons/pearl_string.4bpp.lz"); +const u32 gItemIcon_PearlString[] = INCBIN_U32("graphics/items/icons/pearl_string.4bpp.smol"); const u16 gItemIconPalette_PearlString[] = INCBIN_U16("graphics/items/icon_palettes/pearl_string.gbapal"); -const u32 gItemIcon_Stardust[] = INCBIN_U32("graphics/items/icons/stardust.4bpp.lz"); +const u32 gItemIcon_Stardust[] = INCBIN_U32("graphics/items/icons/stardust.4bpp.smol"); const u16 gItemIconPalette_Star[] = INCBIN_U16("graphics/items/icon_palettes/star.gbapal"); -const u32 gItemIcon_StarPiece[] = INCBIN_U32("graphics/items/icons/star_piece.4bpp.lz"); +const u32 gItemIcon_StarPiece[] = INCBIN_U32("graphics/items/icons/star_piece.4bpp.smol"); -const u32 gItemIcon_CometShard[] = INCBIN_U32("graphics/items/icons/comet_shard.4bpp.lz"); +const u32 gItemIcon_CometShard[] = INCBIN_U32("graphics/items/icons/comet_shard.4bpp.smol"); const u16 gItemIconPalette_CometShard[] = INCBIN_U16("graphics/items/icon_palettes/comet_shard.gbapal"); const u16 gItemIconPalette_ShoalSalt[] = INCBIN_U16("graphics/items/icon_palettes/shoal_salt.gbapal"); -const u32 gItemIcon_ShoalShell[] = INCBIN_U32("graphics/items/icons/shoal_shell.4bpp.lz"); +const u32 gItemIcon_ShoalShell[] = INCBIN_U32("graphics/items/icons/shoal_shell.4bpp.smol"); const u16 gItemIconPalette_Shell[] = INCBIN_U16("graphics/items/icon_palettes/shell.gbapal"); -const u32 gItemIcon_Shard[] = INCBIN_U32("graphics/items/icons/shard.4bpp.lz"); +const u32 gItemIcon_Shard[] = INCBIN_U32("graphics/items/icons/shard.4bpp.smol"); const u16 gItemIconPalette_RedShard[] = INCBIN_U16("graphics/items/icon_palettes/red_shard.gbapal"); const u16 gItemIconPalette_BlueShard[] = INCBIN_U16("graphics/items/icon_palettes/blue_shard.gbapal"); @@ -383,87 +383,87 @@ const u16 gItemIconPalette_YellowShard[] = INCBIN_U16("graphics/items/icon_palet const u16 gItemIconPalette_GreenShard[] = INCBIN_U16("graphics/items/icon_palettes/green_shard.gbapal"); -const u32 gItemIcon_HeartScale[] = INCBIN_U32("graphics/items/icons/heart_scale.4bpp.lz"); +const u32 gItemIcon_HeartScale[] = INCBIN_U32("graphics/items/icons/heart_scale.4bpp.smol"); const u16 gItemIconPalette_HeartScale[] = INCBIN_U16("graphics/items/icon_palettes/heart_scale.gbapal"); -const u32 gItemIcon_Honey[] = INCBIN_U32("graphics/items/icons/honey.4bpp.lz"); +const u32 gItemIcon_Honey[] = INCBIN_U32("graphics/items/icons/honey.4bpp.smol"); const u16 gItemIconPalette_Honey[] = INCBIN_U16("graphics/items/icon_palettes/honey.gbapal"); -const u32 gItemIcon_RareBone[] = INCBIN_U32("graphics/items/icons/rare_bone.4bpp.lz"); +const u32 gItemIcon_RareBone[] = INCBIN_U32("graphics/items/icons/rare_bone.4bpp.smol"); const u16 gItemIconPalette_RareBone[] = INCBIN_U16("graphics/items/icon_palettes/rare_bone.gbapal"); -const u32 gItemIcon_OddKeystone[] = INCBIN_U32("graphics/items/icons/odd_keystone.4bpp.lz"); +const u32 gItemIcon_OddKeystone[] = INCBIN_U32("graphics/items/icons/odd_keystone.4bpp.smol"); const u16 gItemIconPalette_OddKeystone[] = INCBIN_U16("graphics/items/icon_palettes/odd_keystone.gbapal"); -const u32 gItemIcon_PrettyFeather[] = INCBIN_U32("graphics/items/icons/pretty_feather.4bpp.lz"); +const u32 gItemIcon_PrettyFeather[] = INCBIN_U32("graphics/items/icons/pretty_feather.4bpp.smol"); const u16 gItemIconPalette_PrettyFeather[] = INCBIN_U16("graphics/items/icon_palettes/pretty_feather.gbapal"); -const u32 gItemIcon_RelicCoin[] = INCBIN_U32("graphics/items/icons/relic_coin.4bpp.lz"); +const u32 gItemIcon_RelicCoin[] = INCBIN_U32("graphics/items/icons/relic_coin.4bpp.smol"); const u16 gItemIconPalette_RelicCopper[] = INCBIN_U16("graphics/items/icon_palettes/relic_copper.gbapal"); const u16 gItemIconPalette_RelicSilver[] = INCBIN_U16("graphics/items/icon_palettes/relic_silver.gbapal"); const u16 gItemIconPalette_RelicGold[] = INCBIN_U16("graphics/items/icon_palettes/relic_gold.gbapal"); -const u32 gItemIcon_RelicVase[] = INCBIN_U32("graphics/items/icons/relic_vase.4bpp.lz"); +const u32 gItemIcon_RelicVase[] = INCBIN_U32("graphics/items/icons/relic_vase.4bpp.smol"); const u16 gItemIconPalette_Relics[] = INCBIN_U16("graphics/items/icon_palettes/relics.gbapal"); -const u32 gItemIcon_RelicBand[] = INCBIN_U32("graphics/items/icons/relic_band.4bpp.lz"); -const u32 gItemIcon_RelicStatue[] = INCBIN_U32("graphics/items/icons/relic_statue.4bpp.lz"); -const u32 gItemIcon_RelicCrown[] = INCBIN_U32("graphics/items/icons/relic_crown.4bpp.lz"); +const u32 gItemIcon_RelicBand[] = INCBIN_U32("graphics/items/icons/relic_band.4bpp.smol"); +const u32 gItemIcon_RelicStatue[] = INCBIN_U32("graphics/items/icons/relic_statue.4bpp.smol"); +const u32 gItemIcon_RelicCrown[] = INCBIN_U32("graphics/items/icons/relic_crown.4bpp.smol"); -const u32 gItemIcon_StrangeSouvenir[] = INCBIN_U32("graphics/items/icons/strange_souvenir.4bpp.lz"); +const u32 gItemIcon_StrangeSouvenir[] = INCBIN_U32("graphics/items/icons/strange_souvenir.4bpp.smol"); const u16 gItemIconPalette_StrangeSouvenir[] = INCBIN_U16("graphics/items/icon_palettes/strange_souvenir.gbapal"); // Fossils -const u32 gItemIcon_HelixFossil[] = INCBIN_U32("graphics/items/icons/helix_fossil.4bpp.lz"); +const u32 gItemIcon_HelixFossil[] = INCBIN_U32("graphics/items/icons/helix_fossil.4bpp.smol"); const u16 gItemIconPalette_KantoFossil[] = INCBIN_U16("graphics/items/icon_palettes/kanto_fossil.gbapal"); -const u32 gItemIcon_DomeFossil[] = INCBIN_U32("graphics/items/icons/dome_fossil.4bpp.lz"); +const u32 gItemIcon_DomeFossil[] = INCBIN_U32("graphics/items/icons/dome_fossil.4bpp.smol"); -const u32 gItemIcon_OldAmber[] = INCBIN_U32("graphics/items/icons/old_amber.4bpp.lz"); +const u32 gItemIcon_OldAmber[] = INCBIN_U32("graphics/items/icons/old_amber.4bpp.smol"); const u16 gItemIconPalette_OldAmber[] = INCBIN_U16("graphics/items/icon_palettes/old_amber.gbapal"); -const u32 gItemIcon_RootFossil[] = INCBIN_U32("graphics/items/icons/root_fossil.4bpp.lz"); +const u32 gItemIcon_RootFossil[] = INCBIN_U32("graphics/items/icons/root_fossil.4bpp.smol"); const u16 gItemIconPalette_HoennFossil[] = INCBIN_U16("graphics/items/icon_palettes/hoenn_fossil.gbapal"); -const u32 gItemIcon_ClawFossil[] = INCBIN_U32("graphics/items/icons/claw_fossil.4bpp.lz"); +const u32 gItemIcon_ClawFossil[] = INCBIN_U32("graphics/items/icons/claw_fossil.4bpp.smol"); -const u32 gItemIcon_ArmorFossil[] = INCBIN_U32("graphics/items/icons/armor_fossil.4bpp.lz"); +const u32 gItemIcon_ArmorFossil[] = INCBIN_U32("graphics/items/icons/armor_fossil.4bpp.smol"); const u16 gItemIconPalette_ArmorFossil[] = INCBIN_U16("graphics/items/icon_palettes/armor_fossil.gbapal"); -const u32 gItemIcon_SkullFossil[] = INCBIN_U32("graphics/items/icons/skull_fossil.4bpp.lz"); +const u32 gItemIcon_SkullFossil[] = INCBIN_U32("graphics/items/icons/skull_fossil.4bpp.smol"); const u16 gItemIconPalette_SkullFossil[] = INCBIN_U16("graphics/items/icon_palettes/skull_fossil.gbapal"); -const u32 gItemIcon_CoverFossil[] = INCBIN_U32("graphics/items/icons/cover_fossil.4bpp.lz"); +const u32 gItemIcon_CoverFossil[] = INCBIN_U32("graphics/items/icons/cover_fossil.4bpp.smol"); const u16 gItemIconPalette_CoverFossil[] = INCBIN_U16("graphics/items/icon_palettes/cover_fossil.gbapal"); -const u32 gItemIcon_PlumeFossil[] = INCBIN_U32("graphics/items/icons/plume_fossil.4bpp.lz"); +const u32 gItemIcon_PlumeFossil[] = INCBIN_U32("graphics/items/icons/plume_fossil.4bpp.smol"); const u16 gItemIconPalette_PlumeFossil[] = INCBIN_U16("graphics/items/icon_palettes/plume_fossil.gbapal"); -const u32 gItemIcon_JawFossil[] = INCBIN_U32("graphics/items/icons/jaw_fossil.4bpp.lz"); +const u32 gItemIcon_JawFossil[] = INCBIN_U32("graphics/items/icons/jaw_fossil.4bpp.smol"); const u16 gItemIconPalette_JawFossil[] = INCBIN_U16("graphics/items/icon_palettes/jaw_fossil.gbapal"); -const u32 gItemIcon_SailFossil[] = INCBIN_U32("graphics/items/icons/sail_fossil.4bpp.lz"); +const u32 gItemIcon_SailFossil[] = INCBIN_U32("graphics/items/icons/sail_fossil.4bpp.smol"); const u16 gItemIconPalette_SailFossil[] = INCBIN_U16("graphics/items/icon_palettes/sail_fossil.gbapal"); -const u32 gItemIcon_FossilizedBird[] = INCBIN_U32("graphics/items/icons/fossilized_bird.4bpp.lz"); +const u32 gItemIcon_FossilizedBird[] = INCBIN_U32("graphics/items/icons/fossilized_bird.4bpp.smol"); const u16 gItemIconPalette_FossilizedBird[] = INCBIN_U16("graphics/items/icon_palettes/fossilized_bird.gbapal"); -const u32 gItemIcon_FossilizedFish[] = INCBIN_U32("graphics/items/icons/fossilized_fish.4bpp.lz"); +const u32 gItemIcon_FossilizedFish[] = INCBIN_U32("graphics/items/icons/fossilized_fish.4bpp.smol"); const u16 gItemIconPalette_FossilizedFish[] = INCBIN_U16("graphics/items/icon_palettes/fossilized_fish.gbapal"); -const u32 gItemIcon_FossilizedDrake[] = INCBIN_U32("graphics/items/icons/fossilized_drake.4bpp.lz"); +const u32 gItemIcon_FossilizedDrake[] = INCBIN_U32("graphics/items/icons/fossilized_drake.4bpp.smol"); const u16 gItemIconPalette_FossilizedDrake[] = INCBIN_U16("graphics/items/icon_palettes/fossilized_drake.gbapal"); -const u32 gItemIcon_FossilizedDino[] = INCBIN_U32("graphics/items/icons/fossilized_dino.4bpp.lz"); +const u32 gItemIcon_FossilizedDino[] = INCBIN_U32("graphics/items/icons/fossilized_dino.4bpp.smol"); const u16 gItemIconPalette_FossilizedDino[] = INCBIN_U16("graphics/items/icon_palettes/fossilized_dino.gbapal"); // Mulch -const u32 gItemIcon_Mulch[] = INCBIN_U32("graphics/items/icons/mulch.4bpp.lz"); +const u32 gItemIcon_Mulch[] = INCBIN_U32("graphics/items/icons/mulch.4bpp.smol"); const u16 gItemIconPalette_GrowthMulch[] = INCBIN_U16("graphics/items/icon_palettes/growth_mulch.gbapal"); const u16 gItemIconPalette_DampMulch[] = INCBIN_U16("graphics/items/icon_palettes/damp_mulch.gbapal"); -const u32 gItemIcon_StableMulch[] = INCBIN_U32("graphics/items/icons/stable_mulch.4bpp.lz"); +const u32 gItemIcon_StableMulch[] = INCBIN_U32("graphics/items/icons/stable_mulch.4bpp.smol"); const u16 gItemIconPalette_StableMulch[] = INCBIN_U16("graphics/items/icon_palettes/stable_mulch.gbapal"); const u16 gItemIconPalette_GooeyMulch[] = INCBIN_U16("graphics/items/icon_palettes/gooey_mulch.gbapal"); @@ -474,723 +474,723 @@ const u16 gItemIconPalette_AmazeMulch[] = INCBIN_U16("graphics/items/icon_palett // Apricorns -const u32 gItemIcon_RedApricorn[] = INCBIN_U32("graphics/items/icons/red_apricorn.4bpp.lz"); +const u32 gItemIcon_RedApricorn[] = INCBIN_U32("graphics/items/icons/red_apricorn.4bpp.smol"); const u16 gItemIconPalette_RedApricorn[] = INCBIN_U16("graphics/items/icon_palettes/red_apricorn.gbapal"); -const u32 gItemIcon_BlueApricorn[] = INCBIN_U32("graphics/items/icons/blue_apricorn.4bpp.lz"); +const u32 gItemIcon_BlueApricorn[] = INCBIN_U32("graphics/items/icons/blue_apricorn.4bpp.smol"); const u16 gItemIconPalette_BlueApricorn[] = INCBIN_U16("graphics/items/icon_palettes/blue_apricorn.gbapal"); -const u32 gItemIcon_YellowApricorn[] = INCBIN_U32("graphics/items/icons/yellow_apricorn.4bpp.lz"); +const u32 gItemIcon_YellowApricorn[] = INCBIN_U32("graphics/items/icons/yellow_apricorn.4bpp.smol"); const u16 gItemIconPalette_YellowApricorn[] = INCBIN_U16("graphics/items/icon_palettes/yellow_apricorn.gbapal"); -const u32 gItemIcon_GreenApricorn[] = INCBIN_U32("graphics/items/icons/green_apricorn.4bpp.lz"); +const u32 gItemIcon_GreenApricorn[] = INCBIN_U32("graphics/items/icons/green_apricorn.4bpp.smol"); const u16 gItemIconPalette_GreenApricorn[] = INCBIN_U16("graphics/items/icon_palettes/green_apricorn.gbapal"); -const u32 gItemIcon_PinkApricorn[] = INCBIN_U32("graphics/items/icons/pink_apricorn.4bpp.lz"); +const u32 gItemIcon_PinkApricorn[] = INCBIN_U32("graphics/items/icons/pink_apricorn.4bpp.smol"); const u16 gItemIconPalette_PinkApricorn[] = INCBIN_U16("graphics/items/icon_palettes/pink_apricorn.gbapal"); -const u32 gItemIcon_WhiteApricorn[] = INCBIN_U32("graphics/items/icons/white_apricorn.4bpp.lz"); +const u32 gItemIcon_WhiteApricorn[] = INCBIN_U32("graphics/items/icons/white_apricorn.4bpp.smol"); const u16 gItemIconPalette_WhiteApricorn[] = INCBIN_U16("graphics/items/icon_palettes/white_apricorn.gbapal"); -const u32 gItemIcon_BlackApricorn[] = INCBIN_U32("graphics/items/icons/black_apricorn.4bpp.lz"); +const u32 gItemIcon_BlackApricorn[] = INCBIN_U32("graphics/items/icons/black_apricorn.4bpp.smol"); const u16 gItemIconPalette_BlackApricorn[] = INCBIN_U16("graphics/items/icon_palettes/black_apricorn.gbapal"); -const u32 gItemIcon_WishingPiece[] = INCBIN_U32("graphics/items/icons/wishing_piece.4bpp.lz"); +const u32 gItemIcon_WishingPiece[] = INCBIN_U32("graphics/items/icons/wishing_piece.4bpp.smol"); const u16 gItemIconPalette_WishingPiece[] = INCBIN_U16("graphics/items/icon_palettes/wishing_piece.gbapal"); -const u32 gItemIcon_GalaricaTwig[] = INCBIN_U32("graphics/items/icons/galarica_twig.4bpp.lz"); +const u32 gItemIcon_GalaricaTwig[] = INCBIN_U32("graphics/items/icons/galarica_twig.4bpp.smol"); const u16 gItemIconPalette_GalaricaItem[] = INCBIN_U16("graphics/items/icon_palettes/galarica_item.gbapal"); -const u32 gItemIcon_ArmoriteOre[] = INCBIN_U32("graphics/items/icons/armorite_ore.4bpp.lz"); +const u32 gItemIcon_ArmoriteOre[] = INCBIN_U32("graphics/items/icons/armorite_ore.4bpp.smol"); const u16 gItemIconPalette_ArmoriteOre[] = INCBIN_U16("graphics/items/icon_palettes/armorite_ore.gbapal"); -const u32 gItemIcon_DyniteOre[] = INCBIN_U32("graphics/items/icons/dynite_ore.4bpp.lz"); +const u32 gItemIcon_DyniteOre[] = INCBIN_U32("graphics/items/icons/dynite_ore.4bpp.smol"); const u16 gItemIconPalette_DyniteOre[] = INCBIN_U16("graphics/items/icon_palettes/dynite_ore.gbapal"); // Mail -const u32 gItemIcon_OrangeMail[] = INCBIN_U32("graphics/items/icons/orange_mail.4bpp.lz"); +const u32 gItemIcon_OrangeMail[] = INCBIN_U32("graphics/items/icons/orange_mail.4bpp.smol"); const u16 gItemIconPalette_OrangeMail[] = INCBIN_U16("graphics/items/icon_palettes/orange_mail.gbapal"); -const u32 gItemIcon_HarborMail[] = INCBIN_U32("graphics/items/icons/harbor_mail.4bpp.lz"); +const u32 gItemIcon_HarborMail[] = INCBIN_U32("graphics/items/icons/harbor_mail.4bpp.smol"); const u16 gItemIconPalette_HarborMail[] = INCBIN_U16("graphics/items/icon_palettes/harbor_mail.gbapal"); -const u32 gItemIcon_GlitterMail[] = INCBIN_U32("graphics/items/icons/glitter_mail.4bpp.lz"); +const u32 gItemIcon_GlitterMail[] = INCBIN_U32("graphics/items/icons/glitter_mail.4bpp.smol"); const u16 gItemIconPalette_GlitterMail[] = INCBIN_U16("graphics/items/icon_palettes/glitter_mail.gbapal"); -const u32 gItemIcon_MechMail[] = INCBIN_U32("graphics/items/icons/mech_mail.4bpp.lz"); +const u32 gItemIcon_MechMail[] = INCBIN_U32("graphics/items/icons/mech_mail.4bpp.smol"); const u16 gItemIconPalette_MechMail[] = INCBIN_U16("graphics/items/icon_palettes/mech_mail.gbapal"); -const u32 gItemIcon_WoodMail[] = INCBIN_U32("graphics/items/icons/wood_mail.4bpp.lz"); +const u32 gItemIcon_WoodMail[] = INCBIN_U32("graphics/items/icons/wood_mail.4bpp.smol"); const u16 gItemIconPalette_WoodMail[] = INCBIN_U16("graphics/items/icon_palettes/wood_mail.gbapal"); -const u32 gItemIcon_WaveMail[] = INCBIN_U32("graphics/items/icons/wave_mail.4bpp.lz"); +const u32 gItemIcon_WaveMail[] = INCBIN_U32("graphics/items/icons/wave_mail.4bpp.smol"); const u16 gItemIconPalette_WaveMail[] = INCBIN_U16("graphics/items/icon_palettes/wave_mail.gbapal"); -const u32 gItemIcon_BeadMail[] = INCBIN_U32("graphics/items/icons/bead_mail.4bpp.lz"); +const u32 gItemIcon_BeadMail[] = INCBIN_U32("graphics/items/icons/bead_mail.4bpp.smol"); const u16 gItemIconPalette_BeadMail[] = INCBIN_U16("graphics/items/icon_palettes/bead_mail.gbapal"); -const u32 gItemIcon_ShadowMail[] = INCBIN_U32("graphics/items/icons/shadow_mail.4bpp.lz"); +const u32 gItemIcon_ShadowMail[] = INCBIN_U32("graphics/items/icons/shadow_mail.4bpp.smol"); const u16 gItemIconPalette_ShadowMail[] = INCBIN_U16("graphics/items/icon_palettes/shadow_mail.gbapal"); -const u32 gItemIcon_TropicMail[] = INCBIN_U32("graphics/items/icons/tropic_mail.4bpp.lz"); +const u32 gItemIcon_TropicMail[] = INCBIN_U32("graphics/items/icons/tropic_mail.4bpp.smol"); const u16 gItemIconPalette_TropicMail[] = INCBIN_U16("graphics/items/icon_palettes/tropic_mail.gbapal"); -const u32 gItemIcon_DreamMail[] = INCBIN_U32("graphics/items/icons/dream_mail.4bpp.lz"); +const u32 gItemIcon_DreamMail[] = INCBIN_U32("graphics/items/icons/dream_mail.4bpp.smol"); const u16 gItemIconPalette_DreamMail[] = INCBIN_U16("graphics/items/icon_palettes/dream_mail.gbapal"); -const u32 gItemIcon_FabMail[] = INCBIN_U32("graphics/items/icons/fab_mail.4bpp.lz"); +const u32 gItemIcon_FabMail[] = INCBIN_U32("graphics/items/icons/fab_mail.4bpp.smol"); const u16 gItemIconPalette_FabMail[] = INCBIN_U16("graphics/items/icon_palettes/fab_mail.gbapal"); -const u32 gItemIcon_RetroMail[] = INCBIN_U32("graphics/items/icons/retro_mail.4bpp.lz"); +const u32 gItemIcon_RetroMail[] = INCBIN_U32("graphics/items/icons/retro_mail.4bpp.smol"); const u16 gItemIconPalette_RetroMail[] = INCBIN_U16("graphics/items/icon_palettes/retro_mail.gbapal"); // Evolution Items -const u32 gItemIcon_FireStone[] = INCBIN_U32("graphics/items/icons/fire_stone.4bpp.lz"); +const u32 gItemIcon_FireStone[] = INCBIN_U32("graphics/items/icons/fire_stone.4bpp.smol"); const u16 gItemIconPalette_FireStone[] = INCBIN_U16("graphics/items/icon_palettes/fire_stone.gbapal"); -const u32 gItemIcon_WaterStone[] = INCBIN_U32("graphics/items/icons/water_stone.4bpp.lz"); +const u32 gItemIcon_WaterStone[] = INCBIN_U32("graphics/items/icons/water_stone.4bpp.smol"); const u16 gItemIconPalette_WaterStone[] = INCBIN_U16("graphics/items/icon_palettes/water_stone.gbapal"); -const u32 gItemIcon_ThunderStone[] = INCBIN_U32("graphics/items/icons/thunder_stone.4bpp.lz"); +const u32 gItemIcon_ThunderStone[] = INCBIN_U32("graphics/items/icons/thunder_stone.4bpp.smol"); const u16 gItemIconPalette_ThunderStone[] = INCBIN_U16("graphics/items/icon_palettes/thunder_stone.gbapal"); -const u32 gItemIcon_LeafStone[] = INCBIN_U32("graphics/items/icons/leaf_stone.4bpp.lz"); +const u32 gItemIcon_LeafStone[] = INCBIN_U32("graphics/items/icons/leaf_stone.4bpp.smol"); const u16 gItemIconPalette_LeafStone[] = INCBIN_U16("graphics/items/icon_palettes/leaf_stone.gbapal"); -const u32 gItemIcon_IceStone[] = INCBIN_U32("graphics/items/icons/ice_stone.4bpp.lz"); +const u32 gItemIcon_IceStone[] = INCBIN_U32("graphics/items/icons/ice_stone.4bpp.smol"); const u16 gItemIconPalette_IceStone[] = INCBIN_U16("graphics/items/icon_palettes/ice_stone.gbapal"); -const u32 gItemIcon_SunStone[] = INCBIN_U32("graphics/items/icons/sun_stone.4bpp.lz"); +const u32 gItemIcon_SunStone[] = INCBIN_U32("graphics/items/icons/sun_stone.4bpp.smol"); const u16 gItemIconPalette_SunStone[] = INCBIN_U16("graphics/items/icon_palettes/sun_stone.gbapal"); -const u32 gItemIcon_MoonStone[] = INCBIN_U32("graphics/items/icons/moon_stone.4bpp.lz"); +const u32 gItemIcon_MoonStone[] = INCBIN_U32("graphics/items/icons/moon_stone.4bpp.smol"); const u16 gItemIconPalette_MoonStone[] = INCBIN_U16("graphics/items/icon_palettes/moon_stone.gbapal"); -const u32 gItemIcon_ShinyStone[] = INCBIN_U32("graphics/items/icons/shiny_stone.4bpp.lz"); +const u32 gItemIcon_ShinyStone[] = INCBIN_U32("graphics/items/icons/shiny_stone.4bpp.smol"); const u16 gItemIconPalette_ShinyStone[] = INCBIN_U16("graphics/items/icon_palettes/shiny_stone.gbapal"); -const u32 gItemIcon_DuskStone[] = INCBIN_U32("graphics/items/icons/dusk_stone.4bpp.lz"); +const u32 gItemIcon_DuskStone[] = INCBIN_U32("graphics/items/icons/dusk_stone.4bpp.smol"); const u16 gItemIconPalette_DuskStone[] = INCBIN_U16("graphics/items/icon_palettes/dusk_stone.gbapal"); -const u32 gItemIcon_DawnStone[] = INCBIN_U32("graphics/items/icons/dawn_stone.4bpp.lz"); +const u32 gItemIcon_DawnStone[] = INCBIN_U32("graphics/items/icons/dawn_stone.4bpp.smol"); const u16 gItemIconPalette_DawnStone[] = INCBIN_U16("graphics/items/icon_palettes/dawn_stone.gbapal"); -const u32 gItemIcon_SweetApple[] = INCBIN_U32("graphics/items/icons/sweet_apple.4bpp.lz"); +const u32 gItemIcon_SweetApple[] = INCBIN_U32("graphics/items/icons/sweet_apple.4bpp.smol"); const u16 gItemIconPalette_SweetApple[] = INCBIN_U16("graphics/items/icon_palettes/sweet_apple.gbapal"); -const u32 gItemIcon_TartApple[] = INCBIN_U32("graphics/items/icons/tart_apple.4bpp.lz"); +const u32 gItemIcon_TartApple[] = INCBIN_U32("graphics/items/icons/tart_apple.4bpp.smol"); const u16 gItemIconPalette_TartApple[] = INCBIN_U16("graphics/items/icon_palettes/tart_apple.gbapal"); -const u32 gItemIcon_CrackedPot[] = INCBIN_U32("graphics/items/icons/cracked_pot.4bpp.lz"); -const u32 gItemIcon_ChippedPot[] = INCBIN_U32("graphics/items/icons/chipped_pot.4bpp.lz"); +const u32 gItemIcon_CrackedPot[] = INCBIN_U32("graphics/items/icons/cracked_pot.4bpp.smol"); +const u32 gItemIcon_ChippedPot[] = INCBIN_U32("graphics/items/icons/chipped_pot.4bpp.smol"); const u16 gItemIconPalette_Pot[] = INCBIN_U16("graphics/items/icon_palettes/pot.gbapal"); -const u32 gItemIcon_GalaricaCuff[] = INCBIN_U32("graphics/items/icons/galarica_cuff.4bpp.lz"); +const u32 gItemIcon_GalaricaCuff[] = INCBIN_U32("graphics/items/icons/galarica_cuff.4bpp.smol"); -const u32 gItemIcon_GalaricaWreath[] = INCBIN_U32("graphics/items/icons/galarica_wreath.4bpp.lz"); +const u32 gItemIcon_GalaricaWreath[] = INCBIN_U32("graphics/items/icons/galarica_wreath.4bpp.smol"); -const u32 gItemIcon_DragonScale[] = INCBIN_U32("graphics/items/icons/dragon_scale.4bpp.lz"); +const u32 gItemIcon_DragonScale[] = INCBIN_U32("graphics/items/icons/dragon_scale.4bpp.smol"); const u16 gItemIconPalette_DragonScale[] = INCBIN_U16("graphics/items/icon_palettes/dragon_scale.gbapal"); -const u32 gItemIcon_Upgrade[] = INCBIN_U32("graphics/items/icons/upgrade.4bpp.lz"); +const u32 gItemIcon_Upgrade[] = INCBIN_U32("graphics/items/icons/upgrade.4bpp.smol"); const u16 gItemIconPalette_Upgrade[] = INCBIN_U16("graphics/items/icon_palettes/upgrade.gbapal"); -const u32 gItemIcon_Protector[] = INCBIN_U32("graphics/items/icons/protector.4bpp.lz"); +const u32 gItemIcon_Protector[] = INCBIN_U32("graphics/items/icons/protector.4bpp.smol"); const u16 gItemIconPalette_Protector[] = INCBIN_U16("graphics/items/icon_palettes/protector.gbapal"); -const u32 gItemIcon_Electirizer[] = INCBIN_U32("graphics/items/icons/electirizer.4bpp.lz"); +const u32 gItemIcon_Electirizer[] = INCBIN_U32("graphics/items/icons/electirizer.4bpp.smol"); const u16 gItemIconPalette_Electirizer[] = INCBIN_U16("graphics/items/icon_palettes/electirizer.gbapal"); -const u32 gItemIcon_Magmarizer[] = INCBIN_U32("graphics/items/icons/magmarizer.4bpp.lz"); +const u32 gItemIcon_Magmarizer[] = INCBIN_U32("graphics/items/icons/magmarizer.4bpp.smol"); const u16 gItemIconPalette_Magmarizer[] = INCBIN_U16("graphics/items/icon_palettes/magmarizer.gbapal"); -const u32 gItemIcon_DubiousDisc[] = INCBIN_U32("graphics/items/icons/dubious_disc.4bpp.lz"); +const u32 gItemIcon_DubiousDisc[] = INCBIN_U32("graphics/items/icons/dubious_disc.4bpp.smol"); const u16 gItemIconPalette_DubiousDisc[] = INCBIN_U16("graphics/items/icon_palettes/dubious_disc.gbapal"); -const u32 gItemIcon_ReaperCloth[] = INCBIN_U32("graphics/items/icons/reaper_cloth.4bpp.lz"); +const u32 gItemIcon_ReaperCloth[] = INCBIN_U32("graphics/items/icons/reaper_cloth.4bpp.smol"); const u16 gItemIconPalette_ReaperCloth[] = INCBIN_U16("graphics/items/icon_palettes/reaper_cloth.gbapal"); -const u32 gItemIcon_PrismScale[] = INCBIN_U32("graphics/items/icons/prism_scale.4bpp.lz"); +const u32 gItemIcon_PrismScale[] = INCBIN_U32("graphics/items/icons/prism_scale.4bpp.smol"); const u16 gItemIconPalette_PrismScale[] = INCBIN_U16("graphics/items/icon_palettes/prism_scale.gbapal"); -const u32 gItemIcon_WhippedDream[] = INCBIN_U32("graphics/items/icons/whipped_dream.4bpp.lz"); +const u32 gItemIcon_WhippedDream[] = INCBIN_U32("graphics/items/icons/whipped_dream.4bpp.smol"); const u16 gItemIconPalette_WhippedDream[] = INCBIN_U16("graphics/items/icon_palettes/whipped_dream.gbapal"); -const u32 gItemIcon_Sachet[] = INCBIN_U32("graphics/items/icons/sachet.4bpp.lz"); +const u32 gItemIcon_Sachet[] = INCBIN_U32("graphics/items/icons/sachet.4bpp.smol"); const u16 gItemIconPalette_Sachet[] = INCBIN_U16("graphics/items/icon_palettes/sachet.gbapal"); -const u32 gItemIcon_OvalStone[] = INCBIN_U32("graphics/items/icons/oval_stone.4bpp.lz"); +const u32 gItemIcon_OvalStone[] = INCBIN_U32("graphics/items/icons/oval_stone.4bpp.smol"); const u16 gItemIconPalette_OvalStone[] = INCBIN_U16("graphics/items/icon_palettes/oval_stone.gbapal"); -const u32 gItemIcon_StrawberrySweet[] = INCBIN_U32("graphics/items/icons/strawberry_sweet.4bpp.lz"); +const u32 gItemIcon_StrawberrySweet[] = INCBIN_U32("graphics/items/icons/strawberry_sweet.4bpp.smol"); const u16 gItemIconPalette_StrawberrySweet[] = INCBIN_U16("graphics/items/icon_palettes/strawberry_sweet.gbapal"); -const u32 gItemIcon_LoveSweet[] = INCBIN_U32("graphics/items/icons/love_sweet.4bpp.lz"); +const u32 gItemIcon_LoveSweet[] = INCBIN_U32("graphics/items/icons/love_sweet.4bpp.smol"); const u16 gItemIconPalette_LoveSweet[] = INCBIN_U16("graphics/items/icon_palettes/love_sweet.gbapal"); -const u32 gItemIcon_BerrySweet[] = INCBIN_U32("graphics/items/icons/berry_sweet.4bpp.lz"); +const u32 gItemIcon_BerrySweet[] = INCBIN_U32("graphics/items/icons/berry_sweet.4bpp.smol"); const u16 gItemIconPalette_BerrySweet[] = INCBIN_U16("graphics/items/icon_palettes/berry_sweet.gbapal"); -const u32 gItemIcon_CloverSweet[] = INCBIN_U32("graphics/items/icons/clover_sweet.4bpp.lz"); +const u32 gItemIcon_CloverSweet[] = INCBIN_U32("graphics/items/icons/clover_sweet.4bpp.smol"); const u16 gItemIconPalette_CloverSweet[] = INCBIN_U16("graphics/items/icon_palettes/clover_sweet.gbapal"); -const u32 gItemIcon_FlowerSweet[] = INCBIN_U32("graphics/items/icons/flower_sweet.4bpp.lz"); +const u32 gItemIcon_FlowerSweet[] = INCBIN_U32("graphics/items/icons/flower_sweet.4bpp.smol"); const u16 gItemIconPalette_FlowerSweet[] = INCBIN_U16("graphics/items/icon_palettes/flower_sweet.gbapal"); -const u32 gItemIcon_StarSweet[] = INCBIN_U32("graphics/items/icons/star_sweet.4bpp.lz"); +const u32 gItemIcon_StarSweet[] = INCBIN_U32("graphics/items/icons/star_sweet.4bpp.smol"); const u16 gItemIconPalette_StarSweet[] = INCBIN_U16("graphics/items/icon_palettes/star_sweet.gbapal"); -const u32 gItemIcon_RibbonSweet[] = INCBIN_U32("graphics/items/icons/ribbon_sweet.4bpp.lz"); +const u32 gItemIcon_RibbonSweet[] = INCBIN_U32("graphics/items/icons/ribbon_sweet.4bpp.smol"); const u16 gItemIconPalette_RibbonSweet[] = INCBIN_U16("graphics/items/icon_palettes/ribbon_sweet.gbapal"); -const u32 gItemIcon_Everstone[] = INCBIN_U32("graphics/items/icons/everstone.4bpp.lz"); +const u32 gItemIcon_Everstone[] = INCBIN_U32("graphics/items/icons/everstone.4bpp.smol"); const u16 gItemIconPalette_Everstone[] = INCBIN_U16("graphics/items/icon_palettes/everstone.gbapal"); -const u32 gItemIcon_BlackAugurite[] = INCBIN_U32("graphics/items/icons/black_augurite.4bpp.lz"); +const u32 gItemIcon_BlackAugurite[] = INCBIN_U32("graphics/items/icons/black_augurite.4bpp.smol"); const u16 gItemIconPalette_BlackAugurite[] = INCBIN_U16("graphics/items/icon_palettes/black_augurite.gbapal"); -const u32 gItemIcon_LinkingCord[] = INCBIN_U32("graphics/items/icons/linking_cord.4bpp.lz"); +const u32 gItemIcon_LinkingCord[] = INCBIN_U32("graphics/items/icons/linking_cord.4bpp.smol"); const u16 gItemIconPalette_LinkingCord[] = INCBIN_U16("graphics/items/icon_palettes/linking_cord.gbapal"); -const u32 gItemIcon_PeatBlock[] = INCBIN_U32("graphics/items/icons/peat_block.4bpp.lz"); +const u32 gItemIcon_PeatBlock[] = INCBIN_U32("graphics/items/icons/peat_block.4bpp.smol"); const u16 gItemIconPalette_PeatBlock[] = INCBIN_U16("graphics/items/icon_palettes/peat_block.gbapal"); -const u32 gItemIcon_SyrupyApple[] = INCBIN_U32("graphics/items/icons/syrupy_apple.4bpp.lz"); +const u32 gItemIcon_SyrupyApple[] = INCBIN_U32("graphics/items/icons/syrupy_apple.4bpp.smol"); const u16 gItemIconPalette_SyrupyApple[] = INCBIN_U16("graphics/items/icon_palettes/syrupy_apple.gbapal"); -const u32 gItemIcon_UnremarkableTeacup[] = INCBIN_U32("graphics/items/icons/unremarkable_teacup.4bpp.lz"); +const u32 gItemIcon_UnremarkableTeacup[] = INCBIN_U32("graphics/items/icons/unremarkable_teacup.4bpp.smol"); const u16 gItemIconPalette_UnremarkableTeacup[] = INCBIN_U16("graphics/items/icon_palettes/unremarkable_teacup.gbapal"); -const u32 gItemIcon_MasterpieceTeacup[] = INCBIN_U32("graphics/items/icons/masterpiece_teacup.4bpp.lz"); +const u32 gItemIcon_MasterpieceTeacup[] = INCBIN_U32("graphics/items/icons/masterpiece_teacup.4bpp.smol"); const u16 gItemIconPalette_MasterpieceTeacup[] = INCBIN_U16("graphics/items/icon_palettes/masterpiece_teacup.gbapal"); -const u32 gItemIcon_MetalAlloy[] = INCBIN_U32("graphics/items/icons/metal_alloy.4bpp.lz"); +const u32 gItemIcon_MetalAlloy[] = INCBIN_U32("graphics/items/icons/metal_alloy.4bpp.smol"); const u16 gItemIconPalette_MetalAlloy[] = INCBIN_U16("graphics/items/icon_palettes/metal_alloy.gbapal"); // Nectars -const u32 gItemIcon_RedNectar[] = INCBIN_U32("graphics/items/icons/red_nectar.4bpp.lz"); +const u32 gItemIcon_RedNectar[] = INCBIN_U32("graphics/items/icons/red_nectar.4bpp.smol"); const u16 gItemIconPalette_RedNectar[] = INCBIN_U16("graphics/items/icon_palettes/red_nectar.gbapal"); -const u32 gItemIcon_YellowNectar[] = INCBIN_U32("graphics/items/icons/yellow_nectar.4bpp.lz"); +const u32 gItemIcon_YellowNectar[] = INCBIN_U32("graphics/items/icons/yellow_nectar.4bpp.smol"); const u16 gItemIconPalette_YellowNectar[] = INCBIN_U16("graphics/items/icon_palettes/yellow_nectar.gbapal"); -const u32 gItemIcon_PinkNectar[] = INCBIN_U32("graphics/items/icons/pink_nectar.4bpp.lz"); +const u32 gItemIcon_PinkNectar[] = INCBIN_U32("graphics/items/icons/pink_nectar.4bpp.smol"); const u16 gItemIconPalette_PinkNectar[] = INCBIN_U16("graphics/items/icon_palettes/pink_nectar.gbapal"); -const u32 gItemIcon_PurpleNectar[] = INCBIN_U32("graphics/items/icons/purple_nectar.4bpp.lz"); +const u32 gItemIcon_PurpleNectar[] = INCBIN_U32("graphics/items/icons/purple_nectar.4bpp.smol"); const u16 gItemIconPalette_PurpleNectar[] = INCBIN_U16("graphics/items/icon_palettes/purple_nectar.gbapal"); // Plates -const u32 gItemIcon_FlamePlate[] = INCBIN_U32("graphics/items/icons/flame_plate.4bpp.lz"); +const u32 gItemIcon_FlamePlate[] = INCBIN_U32("graphics/items/icons/flame_plate.4bpp.smol"); const u16 gItemIconPalette_FlamePlate[] = INCBIN_U16("graphics/items/icon_palettes/flame_plate.gbapal"); -const u32 gItemIcon_SplashPlate[] = INCBIN_U32("graphics/items/icons/splash_plate.4bpp.lz"); +const u32 gItemIcon_SplashPlate[] = INCBIN_U32("graphics/items/icons/splash_plate.4bpp.smol"); const u16 gItemIconPalette_SplashPlate[] = INCBIN_U16("graphics/items/icon_palettes/splash_plate.gbapal"); -const u32 gItemIcon_ZapPlate[] = INCBIN_U32("graphics/items/icons/zap_plate.4bpp.lz"); +const u32 gItemIcon_ZapPlate[] = INCBIN_U32("graphics/items/icons/zap_plate.4bpp.smol"); const u16 gItemIconPalette_ZapPlate[] = INCBIN_U16("graphics/items/icon_palettes/zap_plate.gbapal"); -const u32 gItemIcon_MeadowPlate[] = INCBIN_U32("graphics/items/icons/meadow_plate.4bpp.lz"); +const u32 gItemIcon_MeadowPlate[] = INCBIN_U32("graphics/items/icons/meadow_plate.4bpp.smol"); const u16 gItemIconPalette_MeadowPlate[] = INCBIN_U16("graphics/items/icon_palettes/meadow_plate.gbapal"); -const u32 gItemIcon_IciclePlate[] = INCBIN_U32("graphics/items/icons/icicle_plate.4bpp.lz"); +const u32 gItemIcon_IciclePlate[] = INCBIN_U32("graphics/items/icons/icicle_plate.4bpp.smol"); const u16 gItemIconPalette_IciclePlate[] = INCBIN_U16("graphics/items/icon_palettes/icicle_plate.gbapal"); -const u32 gItemIcon_FistPlate[] = INCBIN_U32("graphics/items/icons/fist_plate.4bpp.lz"); +const u32 gItemIcon_FistPlate[] = INCBIN_U32("graphics/items/icons/fist_plate.4bpp.smol"); const u16 gItemIconPalette_FistPlate[] = INCBIN_U16("graphics/items/icon_palettes/fist_plate.gbapal"); -const u32 gItemIcon_ToxicPlate[] = INCBIN_U32("graphics/items/icons/toxic_plate.4bpp.lz"); +const u32 gItemIcon_ToxicPlate[] = INCBIN_U32("graphics/items/icons/toxic_plate.4bpp.smol"); const u16 gItemIconPalette_ToxicPlate[] = INCBIN_U16("graphics/items/icon_palettes/toxic_plate.gbapal"); -const u32 gItemIcon_EarthPlate[] = INCBIN_U32("graphics/items/icons/earth_plate.4bpp.lz"); +const u32 gItemIcon_EarthPlate[] = INCBIN_U32("graphics/items/icons/earth_plate.4bpp.smol"); const u16 gItemIconPalette_EarthPlate[] = INCBIN_U16("graphics/items/icon_palettes/earth_plate.gbapal"); -const u32 gItemIcon_SkyPlate[] = INCBIN_U32("graphics/items/icons/sky_plate.4bpp.lz"); +const u32 gItemIcon_SkyPlate[] = INCBIN_U32("graphics/items/icons/sky_plate.4bpp.smol"); const u16 gItemIconPalette_SkyPlate[] = INCBIN_U16("graphics/items/icon_palettes/sky_plate.gbapal"); -const u32 gItemIcon_MindPlate[] = INCBIN_U32("graphics/items/icons/mind_plate.4bpp.lz"); +const u32 gItemIcon_MindPlate[] = INCBIN_U32("graphics/items/icons/mind_plate.4bpp.smol"); const u16 gItemIconPalette_MindPlate[] = INCBIN_U16("graphics/items/icon_palettes/mind_plate.gbapal"); -const u32 gItemIcon_InsectPlate[] = INCBIN_U32("graphics/items/icons/insect_plate.4bpp.lz"); +const u32 gItemIcon_InsectPlate[] = INCBIN_U32("graphics/items/icons/insect_plate.4bpp.smol"); const u16 gItemIconPalette_InsectPlate[] = INCBIN_U16("graphics/items/icon_palettes/insect_plate.gbapal"); -const u32 gItemIcon_StonePlate[] = INCBIN_U32("graphics/items/icons/stone_plate.4bpp.lz"); +const u32 gItemIcon_StonePlate[] = INCBIN_U32("graphics/items/icons/stone_plate.4bpp.smol"); const u16 gItemIconPalette_StonePlate[] = INCBIN_U16("graphics/items/icon_palettes/stone_plate.gbapal"); -const u32 gItemIcon_SpookyPlate[] = INCBIN_U32("graphics/items/icons/spooky_plate.4bpp.lz"); +const u32 gItemIcon_SpookyPlate[] = INCBIN_U32("graphics/items/icons/spooky_plate.4bpp.smol"); const u16 gItemIconPalette_SpookyPlate[] = INCBIN_U16("graphics/items/icon_palettes/spooky_plate.gbapal"); -const u32 gItemIcon_DracoPlate[] = INCBIN_U32("graphics/items/icons/draco_plate.4bpp.lz"); +const u32 gItemIcon_DracoPlate[] = INCBIN_U32("graphics/items/icons/draco_plate.4bpp.smol"); const u16 gItemIconPalette_DracoPlate[] = INCBIN_U16("graphics/items/icon_palettes/draco_plate.gbapal"); -const u32 gItemIcon_DreadPlate[] = INCBIN_U32("graphics/items/icons/dread_plate.4bpp.lz"); +const u32 gItemIcon_DreadPlate[] = INCBIN_U32("graphics/items/icons/dread_plate.4bpp.smol"); const u16 gItemIconPalette_DreadPlate[] = INCBIN_U16("graphics/items/icon_palettes/dread_plate.gbapal"); -const u32 gItemIcon_IronPlate[] = INCBIN_U32("graphics/items/icons/iron_plate.4bpp.lz"); +const u32 gItemIcon_IronPlate[] = INCBIN_U32("graphics/items/icons/iron_plate.4bpp.smol"); const u16 gItemIconPalette_IronPlate[] = INCBIN_U16("graphics/items/icon_palettes/iron_plate.gbapal"); -const u32 gItemIcon_PixiePlate[] = INCBIN_U32("graphics/items/icons/pixie_plate.4bpp.lz"); +const u32 gItemIcon_PixiePlate[] = INCBIN_U32("graphics/items/icons/pixie_plate.4bpp.smol"); const u16 gItemIconPalette_PixiePlate[] = INCBIN_U16("graphics/items/icon_palettes/pixie_plate.gbapal"); // Drives -const u32 gItemIcon_DouseDrive[] = INCBIN_U32("graphics/items/icons/douse_drive.4bpp.lz"); +const u32 gItemIcon_DouseDrive[] = INCBIN_U32("graphics/items/icons/douse_drive.4bpp.smol"); const u16 gItemIconPalette_DouseDrive[] = INCBIN_U16("graphics/items/icon_palettes/douse_drive.gbapal"); -const u32 gItemIcon_ShockDrive[] = INCBIN_U32("graphics/items/icons/shock_drive.4bpp.lz"); +const u32 gItemIcon_ShockDrive[] = INCBIN_U32("graphics/items/icons/shock_drive.4bpp.smol"); const u16 gItemIconPalette_ShockDrive[] = INCBIN_U16("graphics/items/icon_palettes/shock_drive.gbapal"); -const u32 gItemIcon_BurnDrive[] = INCBIN_U32("graphics/items/icons/burn_drive.4bpp.lz"); +const u32 gItemIcon_BurnDrive[] = INCBIN_U32("graphics/items/icons/burn_drive.4bpp.smol"); const u16 gItemIconPalette_BurnDrive[] = INCBIN_U16("graphics/items/icon_palettes/burn_drive.gbapal"); -const u32 gItemIcon_ChillDrive[] = INCBIN_U32("graphics/items/icons/chill_drive.4bpp.lz"); +const u32 gItemIcon_ChillDrive[] = INCBIN_U32("graphics/items/icons/chill_drive.4bpp.smol"); const u16 gItemIconPalette_ChillDrive[] = INCBIN_U16("graphics/items/icon_palettes/chill_drive.gbapal"); // Memories -const u32 gItemIcon_FireMemory[] = INCBIN_U32("graphics/items/icons/fire_memory.4bpp.lz"); +const u32 gItemIcon_FireMemory[] = INCBIN_U32("graphics/items/icons/fire_memory.4bpp.smol"); const u16 gItemIconPalette_FireMemory[] = INCBIN_U16("graphics/items/icon_palettes/fire_memory.gbapal"); -const u32 gItemIcon_WaterMemory[] = INCBIN_U32("graphics/items/icons/water_memory.4bpp.lz"); +const u32 gItemIcon_WaterMemory[] = INCBIN_U32("graphics/items/icons/water_memory.4bpp.smol"); const u16 gItemIconPalette_WaterMemory[] = INCBIN_U16("graphics/items/icon_palettes/water_memory.gbapal"); -const u32 gItemIcon_ElectricMemory[] = INCBIN_U32("graphics/items/icons/electric_memory.4bpp.lz"); +const u32 gItemIcon_ElectricMemory[] = INCBIN_U32("graphics/items/icons/electric_memory.4bpp.smol"); const u16 gItemIconPalette_ElectricMemory[] = INCBIN_U16("graphics/items/icon_palettes/electric_memory.gbapal"); -const u32 gItemIcon_GrassMemory[] = INCBIN_U32("graphics/items/icons/grass_memory.4bpp.lz"); +const u32 gItemIcon_GrassMemory[] = INCBIN_U32("graphics/items/icons/grass_memory.4bpp.smol"); const u16 gItemIconPalette_GrassMemory[] = INCBIN_U16("graphics/items/icon_palettes/grass_memory.gbapal"); -const u32 gItemIcon_IceMemory[] = INCBIN_U32("graphics/items/icons/ice_memory.4bpp.lz"); +const u32 gItemIcon_IceMemory[] = INCBIN_U32("graphics/items/icons/ice_memory.4bpp.smol"); const u16 gItemIconPalette_IceMemory[] = INCBIN_U16("graphics/items/icon_palettes/ice_memory.gbapal"); -const u32 gItemIcon_FightingMemory[] = INCBIN_U32("graphics/items/icons/fighting_memory.4bpp.lz"); +const u32 gItemIcon_FightingMemory[] = INCBIN_U32("graphics/items/icons/fighting_memory.4bpp.smol"); const u16 gItemIconPalette_FightingMemory[] = INCBIN_U16("graphics/items/icon_palettes/fighting_memory.gbapal"); -const u32 gItemIcon_PoisonMemory[] = INCBIN_U32("graphics/items/icons/poison_memory.4bpp.lz"); +const u32 gItemIcon_PoisonMemory[] = INCBIN_U32("graphics/items/icons/poison_memory.4bpp.smol"); const u16 gItemIconPalette_PoisonMemory[] = INCBIN_U16("graphics/items/icon_palettes/poison_memory.gbapal"); -const u32 gItemIcon_GroundMemory[] = INCBIN_U32("graphics/items/icons/ground_memory.4bpp.lz"); +const u32 gItemIcon_GroundMemory[] = INCBIN_U32("graphics/items/icons/ground_memory.4bpp.smol"); const u16 gItemIconPalette_GroundMemory[] = INCBIN_U16("graphics/items/icon_palettes/ground_memory.gbapal"); -const u32 gItemIcon_FlyingMemory[] = INCBIN_U32("graphics/items/icons/flying_memory.4bpp.lz"); +const u32 gItemIcon_FlyingMemory[] = INCBIN_U32("graphics/items/icons/flying_memory.4bpp.smol"); const u16 gItemIconPalette_FlyingMemory[] = INCBIN_U16("graphics/items/icon_palettes/flying_memory.gbapal"); -const u32 gItemIcon_PsychicMemory[] = INCBIN_U32("graphics/items/icons/psychic_memory.4bpp.lz"); +const u32 gItemIcon_PsychicMemory[] = INCBIN_U32("graphics/items/icons/psychic_memory.4bpp.smol"); const u16 gItemIconPalette_PsychicMemory[] = INCBIN_U16("graphics/items/icon_palettes/psychic_memory.gbapal"); -const u32 gItemIcon_BugMemory[] = INCBIN_U32("graphics/items/icons/bug_memory.4bpp.lz"); +const u32 gItemIcon_BugMemory[] = INCBIN_U32("graphics/items/icons/bug_memory.4bpp.smol"); const u16 gItemIconPalette_BugMemory[] = INCBIN_U16("graphics/items/icon_palettes/bug_memory.gbapal"); -const u32 gItemIcon_RockMemory[] = INCBIN_U32("graphics/items/icons/rock_memory.4bpp.lz"); +const u32 gItemIcon_RockMemory[] = INCBIN_U32("graphics/items/icons/rock_memory.4bpp.smol"); const u16 gItemIconPalette_RockMemory[] = INCBIN_U16("graphics/items/icon_palettes/rock_memory.gbapal"); -const u32 gItemIcon_GhostMemory[] = INCBIN_U32("graphics/items/icons/ghost_memory.4bpp.lz"); +const u32 gItemIcon_GhostMemory[] = INCBIN_U32("graphics/items/icons/ghost_memory.4bpp.smol"); const u16 gItemIconPalette_GhostMemory[] = INCBIN_U16("graphics/items/icon_palettes/ghost_memory.gbapal"); -const u32 gItemIcon_DragonMemory[] = INCBIN_U32("graphics/items/icons/dragon_memory.4bpp.lz"); +const u32 gItemIcon_DragonMemory[] = INCBIN_U32("graphics/items/icons/dragon_memory.4bpp.smol"); const u16 gItemIconPalette_DragonMemory[] = INCBIN_U16("graphics/items/icon_palettes/dragon_memory.gbapal"); -const u32 gItemIcon_DarkMemory[] = INCBIN_U32("graphics/items/icons/dark_memory.4bpp.lz"); +const u32 gItemIcon_DarkMemory[] = INCBIN_U32("graphics/items/icons/dark_memory.4bpp.smol"); const u16 gItemIconPalette_DarkMemory[] = INCBIN_U16("graphics/items/icon_palettes/dark_memory.gbapal"); -const u32 gItemIcon_SteelMemory[] = INCBIN_U32("graphics/items/icons/steel_memory.4bpp.lz"); +const u32 gItemIcon_SteelMemory[] = INCBIN_U32("graphics/items/icons/steel_memory.4bpp.smol"); const u16 gItemIconPalette_SteelMemory[] = INCBIN_U16("graphics/items/icon_palettes/steel_memory.gbapal"); -const u32 gItemIcon_FairyMemory[] = INCBIN_U32("graphics/items/icons/fairy_memory.4bpp.lz"); +const u32 gItemIcon_FairyMemory[] = INCBIN_U32("graphics/items/icons/fairy_memory.4bpp.smol"); const u16 gItemIconPalette_FairyMemory[] = INCBIN_U16("graphics/items/icon_palettes/fairy_memory.gbapal"); -const u32 gItemIcon_RustedSword[] = INCBIN_U32("graphics/items/icons/rusted_sword.4bpp.lz"); -const u32 gItemIcon_RustedShield[] = INCBIN_U32("graphics/items/icons/rusted_shield.4bpp.lz"); +const u32 gItemIcon_RustedSword[] = INCBIN_U32("graphics/items/icons/rusted_sword.4bpp.smol"); +const u32 gItemIcon_RustedShield[] = INCBIN_U32("graphics/items/icons/rusted_shield.4bpp.smol"); const u16 gItemIconPalette_RustedWeapons[] = INCBIN_U16("graphics/items/icon_palettes/rusted_weapons.gbapal"); // Colored Orbs -const u32 gItemIcon_RedOrb[] = INCBIN_U32("graphics/items/icons/red_orb.4bpp.lz"); +const u32 gItemIcon_RedOrb[] = INCBIN_U32("graphics/items/icons/red_orb.4bpp.smol"); const u16 gItemIconPalette_RedOrb[] = INCBIN_U16("graphics/items/icon_palettes/red_orb.gbapal"); -const u32 gItemIcon_BlueOrb[] = INCBIN_U32("graphics/items/icons/blue_orb.4bpp.lz"); +const u32 gItemIcon_BlueOrb[] = INCBIN_U32("graphics/items/icons/blue_orb.4bpp.smol"); const u16 gItemIconPalette_BlueOrb[] = INCBIN_U16("graphics/items/icon_palettes/blue_orb.gbapal"); // Mega Stones -const u32 gItemIcon_Venusaurite[] = INCBIN_U32("graphics/items/icons/venusaurite.4bpp.lz"); +const u32 gItemIcon_Venusaurite[] = INCBIN_U32("graphics/items/icons/venusaurite.4bpp.smol"); const u16 gItemIconPalette_Venusaurite[] = INCBIN_U16("graphics/items/icon_palettes/venusaurite.gbapal"); -const u32 gItemIcon_CharizarditeX[] = INCBIN_U32("graphics/items/icons/charizardite_x.4bpp.lz"); +const u32 gItemIcon_CharizarditeX[] = INCBIN_U32("graphics/items/icons/charizardite_x.4bpp.smol"); const u16 gItemIconPalette_CharizarditeX[] = INCBIN_U16("graphics/items/icon_palettes/charizardite_x.gbapal"); -const u32 gItemIcon_CharizarditeY[] = INCBIN_U32("graphics/items/icons/charizardite_y.4bpp.lz"); +const u32 gItemIcon_CharizarditeY[] = INCBIN_U32("graphics/items/icons/charizardite_y.4bpp.smol"); const u16 gItemIconPalette_CharizarditeY[] = INCBIN_U16("graphics/items/icon_palettes/charizardite_y.gbapal"); -const u32 gItemIcon_Blastoisinite[] = INCBIN_U32("graphics/items/icons/blastoisinite.4bpp.lz"); +const u32 gItemIcon_Blastoisinite[] = INCBIN_U32("graphics/items/icons/blastoisinite.4bpp.smol"); const u16 gItemIconPalette_Blastoisinite[] = INCBIN_U16("graphics/items/icon_palettes/blastoisinite.gbapal"); -const u32 gItemIcon_Beedrillite[] = INCBIN_U32("graphics/items/icons/beedrillite.4bpp.lz"); +const u32 gItemIcon_Beedrillite[] = INCBIN_U32("graphics/items/icons/beedrillite.4bpp.smol"); const u16 gItemIconPalette_Beedrillite[] = INCBIN_U16("graphics/items/icon_palettes/beedrillite.gbapal"); -const u32 gItemIcon_Pidgeotite[] = INCBIN_U32("graphics/items/icons/pidgeotite.4bpp.lz"); +const u32 gItemIcon_Pidgeotite[] = INCBIN_U32("graphics/items/icons/pidgeotite.4bpp.smol"); const u16 gItemIconPalette_Pidgeotite[] = INCBIN_U16("graphics/items/icon_palettes/pidgeotite.gbapal"); -const u32 gItemIcon_Alakazite[] = INCBIN_U32("graphics/items/icons/alakazite.4bpp.lz"); +const u32 gItemIcon_Alakazite[] = INCBIN_U32("graphics/items/icons/alakazite.4bpp.smol"); const u16 gItemIconPalette_Alakazite[] = INCBIN_U16("graphics/items/icon_palettes/alakazite.gbapal"); -const u32 gItemIcon_Slowbronite[] = INCBIN_U32("graphics/items/icons/slowbronite.4bpp.lz"); +const u32 gItemIcon_Slowbronite[] = INCBIN_U32("graphics/items/icons/slowbronite.4bpp.smol"); const u16 gItemIconPalette_Slowbronite[] = INCBIN_U16("graphics/items/icon_palettes/slowbronite.gbapal"); -const u32 gItemIcon_Gengarite[] = INCBIN_U32("graphics/items/icons/gengarite.4bpp.lz"); +const u32 gItemIcon_Gengarite[] = INCBIN_U32("graphics/items/icons/gengarite.4bpp.smol"); const u16 gItemIconPalette_Gengarite[] = INCBIN_U16("graphics/items/icon_palettes/gengarite.gbapal"); -const u32 gItemIcon_Kangaskhanite[] = INCBIN_U32("graphics/items/icons/kangaskhanite.4bpp.lz"); +const u32 gItemIcon_Kangaskhanite[] = INCBIN_U32("graphics/items/icons/kangaskhanite.4bpp.smol"); const u16 gItemIconPalette_Kangaskhanite[] = INCBIN_U16("graphics/items/icon_palettes/kangaskhanite.gbapal"); -const u32 gItemIcon_Pinsirite[] = INCBIN_U32("graphics/items/icons/pinsirite.4bpp.lz"); +const u32 gItemIcon_Pinsirite[] = INCBIN_U32("graphics/items/icons/pinsirite.4bpp.smol"); const u16 gItemIconPalette_Pinsirite[] = INCBIN_U16("graphics/items/icon_palettes/pinsirite.gbapal"); -const u32 gItemIcon_Gyaradosite[] = INCBIN_U32("graphics/items/icons/gyaradosite.4bpp.lz"); +const u32 gItemIcon_Gyaradosite[] = INCBIN_U32("graphics/items/icons/gyaradosite.4bpp.smol"); const u16 gItemIconPalette_Gyaradosite[] = INCBIN_U16("graphics/items/icon_palettes/gyaradosite.gbapal"); -const u32 gItemIcon_Aerodactylite[] = INCBIN_U32("graphics/items/icons/aerodactylite.4bpp.lz"); +const u32 gItemIcon_Aerodactylite[] = INCBIN_U32("graphics/items/icons/aerodactylite.4bpp.smol"); const u16 gItemIconPalette_Aerodactylite[] = INCBIN_U16("graphics/items/icon_palettes/aerodactylite.gbapal"); -const u32 gItemIcon_MewtwoniteX[] = INCBIN_U32("graphics/items/icons/mewtwonite_x.4bpp.lz"); +const u32 gItemIcon_MewtwoniteX[] = INCBIN_U32("graphics/items/icons/mewtwonite_x.4bpp.smol"); const u16 gItemIconPalette_MewtwoniteX[] = INCBIN_U16("graphics/items/icon_palettes/mewtwonite_x.gbapal"); -const u32 gItemIcon_MewtwoniteY[] = INCBIN_U32("graphics/items/icons/mewtwonite_y.4bpp.lz"); +const u32 gItemIcon_MewtwoniteY[] = INCBIN_U32("graphics/items/icons/mewtwonite_y.4bpp.smol"); const u16 gItemIconPalette_MewtwoniteY[] = INCBIN_U16("graphics/items/icon_palettes/mewtwonite_y.gbapal"); -const u32 gItemIcon_Ampharosite[] = INCBIN_U32("graphics/items/icons/ampharosite.4bpp.lz"); +const u32 gItemIcon_Ampharosite[] = INCBIN_U32("graphics/items/icons/ampharosite.4bpp.smol"); const u16 gItemIconPalette_Ampharosite[] = INCBIN_U16("graphics/items/icon_palettes/ampharosite.gbapal"); -const u32 gItemIcon_Steelixite[] = INCBIN_U32("graphics/items/icons/steelixite.4bpp.lz"); +const u32 gItemIcon_Steelixite[] = INCBIN_U32("graphics/items/icons/steelixite.4bpp.smol"); const u16 gItemIconPalette_Steelixite[] = INCBIN_U16("graphics/items/icon_palettes/steelixite.gbapal"); -const u32 gItemIcon_Scizorite[] = INCBIN_U32("graphics/items/icons/scizorite.4bpp.lz"); +const u32 gItemIcon_Scizorite[] = INCBIN_U32("graphics/items/icons/scizorite.4bpp.smol"); const u16 gItemIconPalette_Scizorite[] = INCBIN_U16("graphics/items/icon_palettes/scizorite.gbapal"); -const u32 gItemIcon_Heracronite[] = INCBIN_U32("graphics/items/icons/heracronite.4bpp.lz"); +const u32 gItemIcon_Heracronite[] = INCBIN_U32("graphics/items/icons/heracronite.4bpp.smol"); const u16 gItemIconPalette_Heracronite[] = INCBIN_U16("graphics/items/icon_palettes/heracronite.gbapal"); -const u32 gItemIcon_Houndoominite[] = INCBIN_U32("graphics/items/icons/houndoominite.4bpp.lz"); +const u32 gItemIcon_Houndoominite[] = INCBIN_U32("graphics/items/icons/houndoominite.4bpp.smol"); const u16 gItemIconPalette_Houndoominite[] = INCBIN_U16("graphics/items/icon_palettes/houndoominite.gbapal"); -const u32 gItemIcon_Tyranitarite[] = INCBIN_U32("graphics/items/icons/tyranitarite.4bpp.lz"); +const u32 gItemIcon_Tyranitarite[] = INCBIN_U32("graphics/items/icons/tyranitarite.4bpp.smol"); const u16 gItemIconPalette_Tyranitarite[] = INCBIN_U16("graphics/items/icon_palettes/tyranitarite.gbapal"); -const u32 gItemIcon_Sceptilite[] = INCBIN_U32("graphics/items/icons/sceptilite.4bpp.lz"); +const u32 gItemIcon_Sceptilite[] = INCBIN_U32("graphics/items/icons/sceptilite.4bpp.smol"); const u16 gItemIconPalette_Sceptilite[] = INCBIN_U16("graphics/items/icon_palettes/sceptilite.gbapal"); -const u32 gItemIcon_Blazikenite[] = INCBIN_U32("graphics/items/icons/blazikenite.4bpp.lz"); +const u32 gItemIcon_Blazikenite[] = INCBIN_U32("graphics/items/icons/blazikenite.4bpp.smol"); const u16 gItemIconPalette_Blazikenite[] = INCBIN_U16("graphics/items/icon_palettes/blazikenite.gbapal"); -const u32 gItemIcon_Swampertite[] = INCBIN_U32("graphics/items/icons/swampertite.4bpp.lz"); +const u32 gItemIcon_Swampertite[] = INCBIN_U32("graphics/items/icons/swampertite.4bpp.smol"); const u16 gItemIconPalette_Swampertite[] = INCBIN_U16("graphics/items/icon_palettes/swampertite.gbapal"); -const u32 gItemIcon_Gardevoirite[] = INCBIN_U32("graphics/items/icons/gardevoirite.4bpp.lz"); +const u32 gItemIcon_Gardevoirite[] = INCBIN_U32("graphics/items/icons/gardevoirite.4bpp.smol"); const u16 gItemIconPalette_Gardevoirite[] = INCBIN_U16("graphics/items/icon_palettes/gardevoirite.gbapal"); -const u32 gItemIcon_Sablenite[] = INCBIN_U32("graphics/items/icons/sablenite.4bpp.lz"); +const u32 gItemIcon_Sablenite[] = INCBIN_U32("graphics/items/icons/sablenite.4bpp.smol"); const u16 gItemIconPalette_Sablenite[] = INCBIN_U16("graphics/items/icon_palettes/sablenite.gbapal"); -const u32 gItemIcon_Mawilite[] = INCBIN_U32("graphics/items/icons/mawilite.4bpp.lz"); +const u32 gItemIcon_Mawilite[] = INCBIN_U32("graphics/items/icons/mawilite.4bpp.smol"); const u16 gItemIconPalette_Mawilite[] = INCBIN_U16("graphics/items/icon_palettes/mawilite.gbapal"); -const u32 gItemIcon_Aggronite[] = INCBIN_U32("graphics/items/icons/aggronite.4bpp.lz"); +const u32 gItemIcon_Aggronite[] = INCBIN_U32("graphics/items/icons/aggronite.4bpp.smol"); const u16 gItemIconPalette_Aggronite[] = INCBIN_U16("graphics/items/icon_palettes/aggronite.gbapal"); -const u32 gItemIcon_Medichamite[] = INCBIN_U32("graphics/items/icons/medichamite.4bpp.lz"); +const u32 gItemIcon_Medichamite[] = INCBIN_U32("graphics/items/icons/medichamite.4bpp.smol"); const u16 gItemIconPalette_Medichamite[] = INCBIN_U16("graphics/items/icon_palettes/medichamite.gbapal"); -const u32 gItemIcon_Manectite[] = INCBIN_U32("graphics/items/icons/manectite.4bpp.lz"); +const u32 gItemIcon_Manectite[] = INCBIN_U32("graphics/items/icons/manectite.4bpp.smol"); const u16 gItemIconPalette_Manectite[] = INCBIN_U16("graphics/items/icon_palettes/manectite.gbapal"); -const u32 gItemIcon_Sharpedonite[] = INCBIN_U32("graphics/items/icons/sharpedonite.4bpp.lz"); +const u32 gItemIcon_Sharpedonite[] = INCBIN_U32("graphics/items/icons/sharpedonite.4bpp.smol"); const u16 gItemIconPalette_Sharpedonite[] = INCBIN_U16("graphics/items/icon_palettes/sharpedonite.gbapal"); -const u32 gItemIcon_Cameruptite[] = INCBIN_U32("graphics/items/icons/cameruptite.4bpp.lz"); +const u32 gItemIcon_Cameruptite[] = INCBIN_U32("graphics/items/icons/cameruptite.4bpp.smol"); const u16 gItemIconPalette_Cameruptite[] = INCBIN_U16("graphics/items/icon_palettes/cameruptite.gbapal"); -const u32 gItemIcon_Altarianite[] = INCBIN_U32("graphics/items/icons/altarianite.4bpp.lz"); +const u32 gItemIcon_Altarianite[] = INCBIN_U32("graphics/items/icons/altarianite.4bpp.smol"); const u16 gItemIconPalette_Altarianite[] = INCBIN_U16("graphics/items/icon_palettes/altarianite.gbapal"); -const u32 gItemIcon_Banettite[] = INCBIN_U32("graphics/items/icons/banettite.4bpp.lz"); +const u32 gItemIcon_Banettite[] = INCBIN_U32("graphics/items/icons/banettite.4bpp.smol"); const u16 gItemIconPalette_Banettite[] = INCBIN_U16("graphics/items/icon_palettes/banettite.gbapal"); -const u32 gItemIcon_Absolite[] = INCBIN_U32("graphics/items/icons/absolite.4bpp.lz"); +const u32 gItemIcon_Absolite[] = INCBIN_U32("graphics/items/icons/absolite.4bpp.smol"); const u16 gItemIconPalette_Absolite[] = INCBIN_U16("graphics/items/icon_palettes/absolite.gbapal"); -const u32 gItemIcon_Glalitite[] = INCBIN_U32("graphics/items/icons/glalitite.4bpp.lz"); +const u32 gItemIcon_Glalitite[] = INCBIN_U32("graphics/items/icons/glalitite.4bpp.smol"); const u16 gItemIconPalette_Glalitite[] = INCBIN_U16("graphics/items/icon_palettes/glalitite.gbapal"); -const u32 gItemIcon_Salamencite[] = INCBIN_U32("graphics/items/icons/salamencite.4bpp.lz"); +const u32 gItemIcon_Salamencite[] = INCBIN_U32("graphics/items/icons/salamencite.4bpp.smol"); const u16 gItemIconPalette_Salamencite[] = INCBIN_U16("graphics/items/icon_palettes/salamencite.gbapal"); -const u32 gItemIcon_Metagrossite[] = INCBIN_U32("graphics/items/icons/metagrossite.4bpp.lz"); +const u32 gItemIcon_Metagrossite[] = INCBIN_U32("graphics/items/icons/metagrossite.4bpp.smol"); const u16 gItemIconPalette_Metagrossite[] = INCBIN_U16("graphics/items/icon_palettes/metagrossite.gbapal"); -const u32 gItemIcon_Latiasite[] = INCBIN_U32("graphics/items/icons/latiasite.4bpp.lz"); +const u32 gItemIcon_Latiasite[] = INCBIN_U32("graphics/items/icons/latiasite.4bpp.smol"); const u16 gItemIconPalette_Latiasite[] = INCBIN_U16("graphics/items/icon_palettes/latiasite.gbapal"); -const u32 gItemIcon_Latiosite[] = INCBIN_U32("graphics/items/icons/latiosite.4bpp.lz"); +const u32 gItemIcon_Latiosite[] = INCBIN_U32("graphics/items/icons/latiosite.4bpp.smol"); const u16 gItemIconPalette_Latiosite[] = INCBIN_U16("graphics/items/icon_palettes/latiosite.gbapal"); -const u32 gItemIcon_Lopunnite[] = INCBIN_U32("graphics/items/icons/lopunnite.4bpp.lz"); +const u32 gItemIcon_Lopunnite[] = INCBIN_U32("graphics/items/icons/lopunnite.4bpp.smol"); const u16 gItemIconPalette_Lopunnite[] = INCBIN_U16("graphics/items/icon_palettes/lopunnite.gbapal"); -const u32 gItemIcon_Garchompite[] = INCBIN_U32("graphics/items/icons/garchompite.4bpp.lz"); +const u32 gItemIcon_Garchompite[] = INCBIN_U32("graphics/items/icons/garchompite.4bpp.smol"); const u16 gItemIconPalette_Garchompite[] = INCBIN_U16("graphics/items/icon_palettes/garchompite.gbapal"); -const u32 gItemIcon_Lucarionite[] = INCBIN_U32("graphics/items/icons/lucarionite.4bpp.lz"); +const u32 gItemIcon_Lucarionite[] = INCBIN_U32("graphics/items/icons/lucarionite.4bpp.smol"); const u16 gItemIconPalette_Lucarionite[] = INCBIN_U16("graphics/items/icon_palettes/lucarionite.gbapal"); -const u32 gItemIcon_Abomasite[] = INCBIN_U32("graphics/items/icons/abomasite.4bpp.lz"); +const u32 gItemIcon_Abomasite[] = INCBIN_U32("graphics/items/icons/abomasite.4bpp.smol"); const u16 gItemIconPalette_Abomasite[] = INCBIN_U16("graphics/items/icon_palettes/abomasite.gbapal"); -const u32 gItemIcon_Galladite[] = INCBIN_U32("graphics/items/icons/galladite.4bpp.lz"); +const u32 gItemIcon_Galladite[] = INCBIN_U32("graphics/items/icons/galladite.4bpp.smol"); const u16 gItemIconPalette_Galladite[] = INCBIN_U16("graphics/items/icon_palettes/galladite.gbapal"); -const u32 gItemIcon_Audinite[] = INCBIN_U32("graphics/items/icons/audinite.4bpp.lz"); +const u32 gItemIcon_Audinite[] = INCBIN_U32("graphics/items/icons/audinite.4bpp.smol"); const u16 gItemIconPalette_Audinite[] = INCBIN_U16("graphics/items/icon_palettes/audinite.gbapal"); -const u32 gItemIcon_Diancite[] = INCBIN_U32("graphics/items/icons/diancite.4bpp.lz"); +const u32 gItemIcon_Diancite[] = INCBIN_U32("graphics/items/icons/diancite.4bpp.smol"); const u16 gItemIconPalette_Diancite[] = INCBIN_U16("graphics/items/icon_palettes/diancite.gbapal"); // Gems -const u32 gItemIcon_NormalGem[] = INCBIN_U32("graphics/items/icons/normal_gem.4bpp.lz"); +const u32 gItemIcon_NormalGem[] = INCBIN_U32("graphics/items/icons/normal_gem.4bpp.smol"); const u16 gItemIconPalette_NormalGem[] = INCBIN_U16("graphics/items/icon_palettes/normal_gem.gbapal"); -const u32 gItemIcon_FireGem[] = INCBIN_U32("graphics/items/icons/fire_gem.4bpp.lz"); +const u32 gItemIcon_FireGem[] = INCBIN_U32("graphics/items/icons/fire_gem.4bpp.smol"); const u16 gItemIconPalette_FireGem[] = INCBIN_U16("graphics/items/icon_palettes/fire_gem.gbapal"); -const u32 gItemIcon_WaterGem[] = INCBIN_U32("graphics/items/icons/water_gem.4bpp.lz"); +const u32 gItemIcon_WaterGem[] = INCBIN_U32("graphics/items/icons/water_gem.4bpp.smol"); const u16 gItemIconPalette_WaterGem[] = INCBIN_U16("graphics/items/icon_palettes/water_gem.gbapal"); -const u32 gItemIcon_ElectricGem[] = INCBIN_U32("graphics/items/icons/electric_gem.4bpp.lz"); +const u32 gItemIcon_ElectricGem[] = INCBIN_U32("graphics/items/icons/electric_gem.4bpp.smol"); const u16 gItemIconPalette_ElectricGem[] = INCBIN_U16("graphics/items/icon_palettes/electric_gem.gbapal"); -const u32 gItemIcon_GrassGem[] = INCBIN_U32("graphics/items/icons/grass_gem.4bpp.lz"); +const u32 gItemIcon_GrassGem[] = INCBIN_U32("graphics/items/icons/grass_gem.4bpp.smol"); const u16 gItemIconPalette_GrassGem[] = INCBIN_U16("graphics/items/icon_palettes/grass_gem.gbapal"); -const u32 gItemIcon_IceGem[] = INCBIN_U32("graphics/items/icons/ice_gem.4bpp.lz"); +const u32 gItemIcon_IceGem[] = INCBIN_U32("graphics/items/icons/ice_gem.4bpp.smol"); const u16 gItemIconPalette_IceGem[] = INCBIN_U16("graphics/items/icon_palettes/ice_gem.gbapal"); -const u32 gItemIcon_FightingGem[] = INCBIN_U32("graphics/items/icons/fighting_gem.4bpp.lz"); +const u32 gItemIcon_FightingGem[] = INCBIN_U32("graphics/items/icons/fighting_gem.4bpp.smol"); const u16 gItemIconPalette_FightingGem[] = INCBIN_U16("graphics/items/icon_palettes/fighting_gem.gbapal"); -const u32 gItemIcon_PoisonGem[] = INCBIN_U32("graphics/items/icons/poison_gem.4bpp.lz"); +const u32 gItemIcon_PoisonGem[] = INCBIN_U32("graphics/items/icons/poison_gem.4bpp.smol"); const u16 gItemIconPalette_PoisonGem[] = INCBIN_U16("graphics/items/icon_palettes/poison_gem.gbapal"); -const u32 gItemIcon_GroundGem[] = INCBIN_U32("graphics/items/icons/ground_gem.4bpp.lz"); +const u32 gItemIcon_GroundGem[] = INCBIN_U32("graphics/items/icons/ground_gem.4bpp.smol"); const u16 gItemIconPalette_GroundGem[] = INCBIN_U16("graphics/items/icon_palettes/ground_gem.gbapal"); -const u32 gItemIcon_FlyingGem[] = INCBIN_U32("graphics/items/icons/flying_gem.4bpp.lz"); +const u32 gItemIcon_FlyingGem[] = INCBIN_U32("graphics/items/icons/flying_gem.4bpp.smol"); const u16 gItemIconPalette_FlyingGem[] = INCBIN_U16("graphics/items/icon_palettes/flying_gem.gbapal"); -const u32 gItemIcon_PsychicGem[] = INCBIN_U32("graphics/items/icons/psychic_gem.4bpp.lz"); +const u32 gItemIcon_PsychicGem[] = INCBIN_U32("graphics/items/icons/psychic_gem.4bpp.smol"); const u16 gItemIconPalette_PsychicGem[] = INCBIN_U16("graphics/items/icon_palettes/psychic_gem.gbapal"); -const u32 gItemIcon_BugGem[] = INCBIN_U32("graphics/items/icons/bug_gem.4bpp.lz"); +const u32 gItemIcon_BugGem[] = INCBIN_U32("graphics/items/icons/bug_gem.4bpp.smol"); const u16 gItemIconPalette_BugGem[] = INCBIN_U16("graphics/items/icon_palettes/bug_gem.gbapal"); -const u32 gItemIcon_RockGem[] = INCBIN_U32("graphics/items/icons/rock_gem.4bpp.lz"); +const u32 gItemIcon_RockGem[] = INCBIN_U32("graphics/items/icons/rock_gem.4bpp.smol"); const u16 gItemIconPalette_RockGem[] = INCBIN_U16("graphics/items/icon_palettes/rock_gem.gbapal"); -const u32 gItemIcon_GhostGem[] = INCBIN_U32("graphics/items/icons/ghost_gem.4bpp.lz"); +const u32 gItemIcon_GhostGem[] = INCBIN_U32("graphics/items/icons/ghost_gem.4bpp.smol"); const u16 gItemIconPalette_GhostGem[] = INCBIN_U16("graphics/items/icon_palettes/ghost_gem.gbapal"); -const u32 gItemIcon_DragonGem[] = INCBIN_U32("graphics/items/icons/dragon_gem.4bpp.lz"); +const u32 gItemIcon_DragonGem[] = INCBIN_U32("graphics/items/icons/dragon_gem.4bpp.smol"); const u16 gItemIconPalette_DragonGem[] = INCBIN_U16("graphics/items/icon_palettes/dragon_gem.gbapal"); -const u32 gItemIcon_DarkGem[] = INCBIN_U32("graphics/items/icons/dark_gem.4bpp.lz"); +const u32 gItemIcon_DarkGem[] = INCBIN_U32("graphics/items/icons/dark_gem.4bpp.smol"); const u16 gItemIconPalette_DarkGem[] = INCBIN_U16("graphics/items/icon_palettes/dark_gem.gbapal"); -const u32 gItemIcon_SteelGem[] = INCBIN_U32("graphics/items/icons/steel_gem.4bpp.lz"); +const u32 gItemIcon_SteelGem[] = INCBIN_U32("graphics/items/icons/steel_gem.4bpp.smol"); const u16 gItemIconPalette_SteelGem[] = INCBIN_U16("graphics/items/icon_palettes/steel_gem.gbapal"); -const u32 gItemIcon_FairyGem[] = INCBIN_U32("graphics/items/icons/fairy_gem.4bpp.lz"); +const u32 gItemIcon_FairyGem[] = INCBIN_U32("graphics/items/icons/fairy_gem.4bpp.smol"); const u16 gItemIconPalette_FairyGem[] = INCBIN_U16("graphics/items/icon_palettes/fairy_gem.gbapal"); // Z-Crystals -const u32 gItemIcon_NormaliumZ[] = INCBIN_U32("graphics/items/icons/normalium_z.4bpp.lz"); +const u32 gItemIcon_NormaliumZ[] = INCBIN_U32("graphics/items/icons/normalium_z.4bpp.smol"); const u16 gItemIconPalette_NormaliumZ[] = INCBIN_U16("graphics/items/icon_palettes/normalium_z.gbapal"); -const u32 gItemIcon_FiriumZ[] = INCBIN_U32("graphics/items/icons/firium_z.4bpp.lz"); +const u32 gItemIcon_FiriumZ[] = INCBIN_U32("graphics/items/icons/firium_z.4bpp.smol"); const u16 gItemIconPalette_FiriumZ[] = INCBIN_U16("graphics/items/icon_palettes/firium_z.gbapal"); -const u32 gItemIcon_WateriumZ[] = INCBIN_U32("graphics/items/icons/waterium_z.4bpp.lz"); +const u32 gItemIcon_WateriumZ[] = INCBIN_U32("graphics/items/icons/waterium_z.4bpp.smol"); const u16 gItemIconPalette_WateriumZ[] = INCBIN_U16("graphics/items/icon_palettes/waterium_z.gbapal"); -const u32 gItemIcon_ElectriumZ[] = INCBIN_U32("graphics/items/icons/electrium_z.4bpp.lz"); +const u32 gItemIcon_ElectriumZ[] = INCBIN_U32("graphics/items/icons/electrium_z.4bpp.smol"); const u16 gItemIconPalette_ElectriumZ[] = INCBIN_U16("graphics/items/icon_palettes/electrium_z.gbapal"); -const u32 gItemIcon_GrassiumZ[] = INCBIN_U32("graphics/items/icons/grassium_z.4bpp.lz"); +const u32 gItemIcon_GrassiumZ[] = INCBIN_U32("graphics/items/icons/grassium_z.4bpp.smol"); const u16 gItemIconPalette_GrassiumZ[] = INCBIN_U16("graphics/items/icon_palettes/grassium_z.gbapal"); -const u32 gItemIcon_IciumZ[] = INCBIN_U32("graphics/items/icons/icium_z.4bpp.lz"); +const u32 gItemIcon_IciumZ[] = INCBIN_U32("graphics/items/icons/icium_z.4bpp.smol"); const u16 gItemIconPalette_IciumZ[] = INCBIN_U16("graphics/items/icon_palettes/icium_z.gbapal"); -const u32 gItemIcon_FightiniumZ[] = INCBIN_U32("graphics/items/icons/fightinium_z.4bpp.lz"); +const u32 gItemIcon_FightiniumZ[] = INCBIN_U32("graphics/items/icons/fightinium_z.4bpp.smol"); const u16 gItemIconPalette_FightiniumZ[] = INCBIN_U16("graphics/items/icon_palettes/fightinium_z.gbapal"); -const u32 gItemIcon_PoisoniumZ[] = INCBIN_U32("graphics/items/icons/poisonium_z.4bpp.lz"); +const u32 gItemIcon_PoisoniumZ[] = INCBIN_U32("graphics/items/icons/poisonium_z.4bpp.smol"); const u16 gItemIconPalette_PoisoniumZ[] = INCBIN_U16("graphics/items/icon_palettes/poisonium_z.gbapal"); -const u32 gItemIcon_GroundiumZ[] = INCBIN_U32("graphics/items/icons/groundium_z.4bpp.lz"); +const u32 gItemIcon_GroundiumZ[] = INCBIN_U32("graphics/items/icons/groundium_z.4bpp.smol"); const u16 gItemIconPalette_GroundiumZ[] = INCBIN_U16("graphics/items/icon_palettes/groundium_z.gbapal"); -const u32 gItemIcon_FlyiniumZ[] = INCBIN_U32("graphics/items/icons/flyinium_z.4bpp.lz"); +const u32 gItemIcon_FlyiniumZ[] = INCBIN_U32("graphics/items/icons/flyinium_z.4bpp.smol"); const u16 gItemIconPalette_FlyiniumZ[] = INCBIN_U16("graphics/items/icon_palettes/flyinium_z.gbapal"); -const u32 gItemIcon_PsychiumZ[] = INCBIN_U32("graphics/items/icons/psychium_z.4bpp.lz"); +const u32 gItemIcon_PsychiumZ[] = INCBIN_U32("graphics/items/icons/psychium_z.4bpp.smol"); const u16 gItemIconPalette_PsychiumZ[] = INCBIN_U16("graphics/items/icon_palettes/psychium_z.gbapal"); -const u32 gItemIcon_BuginiumZ[] = INCBIN_U32("graphics/items/icons/buginium_z.4bpp.lz"); +const u32 gItemIcon_BuginiumZ[] = INCBIN_U32("graphics/items/icons/buginium_z.4bpp.smol"); const u16 gItemIconPalette_BuginiumZ[] = INCBIN_U16("graphics/items/icon_palettes/buginium_z.gbapal"); -const u32 gItemIcon_RockiumZ[] = INCBIN_U32("graphics/items/icons/rockium_z.4bpp.lz"); +const u32 gItemIcon_RockiumZ[] = INCBIN_U32("graphics/items/icons/rockium_z.4bpp.smol"); const u16 gItemIconPalette_RockiumZ[] = INCBIN_U16("graphics/items/icon_palettes/rockium_z.gbapal"); -const u32 gItemIcon_GhostiumZ[] = INCBIN_U32("graphics/items/icons/ghostium_z.4bpp.lz"); +const u32 gItemIcon_GhostiumZ[] = INCBIN_U32("graphics/items/icons/ghostium_z.4bpp.smol"); const u16 gItemIconPalette_GhostiumZ[] = INCBIN_U16("graphics/items/icon_palettes/ghostium_z.gbapal"); -const u32 gItemIcon_DragoniumZ[] = INCBIN_U32("graphics/items/icons/dragonium_z.4bpp.lz"); +const u32 gItemIcon_DragoniumZ[] = INCBIN_U32("graphics/items/icons/dragonium_z.4bpp.smol"); const u16 gItemIconPalette_DragoniumZ[] = INCBIN_U16("graphics/items/icon_palettes/dragonium_z.gbapal"); -const u32 gItemIcon_DarkiniumZ[] = INCBIN_U32("graphics/items/icons/darkinium_z.4bpp.lz"); +const u32 gItemIcon_DarkiniumZ[] = INCBIN_U32("graphics/items/icons/darkinium_z.4bpp.smol"); const u16 gItemIconPalette_DarkiniumZ[] = INCBIN_U16("graphics/items/icon_palettes/darkinium_z.gbapal"); -const u32 gItemIcon_SteeliumZ[] = INCBIN_U32("graphics/items/icons/steelium_z.4bpp.lz"); +const u32 gItemIcon_SteeliumZ[] = INCBIN_U32("graphics/items/icons/steelium_z.4bpp.smol"); const u16 gItemIconPalette_SteeliumZ[] = INCBIN_U16("graphics/items/icon_palettes/steelium_z.gbapal"); -const u32 gItemIcon_FairiumZ[] = INCBIN_U32("graphics/items/icons/fairium_z.4bpp.lz"); +const u32 gItemIcon_FairiumZ[] = INCBIN_U32("graphics/items/icons/fairium_z.4bpp.smol"); const u16 gItemIconPalette_FairiumZ[] = INCBIN_U16("graphics/items/icon_palettes/fairium_z.gbapal"); -const u32 gItemIcon_PikaniumZ[] = INCBIN_U32("graphics/items/icons/pikanium_z.4bpp.lz"); +const u32 gItemIcon_PikaniumZ[] = INCBIN_U32("graphics/items/icons/pikanium_z.4bpp.smol"); const u16 gItemIconPalette_PikaniumZ[] = INCBIN_U16("graphics/items/icon_palettes/pikanium_z.gbapal"); -const u32 gItemIcon_EeviumZ[] = INCBIN_U32("graphics/items/icons/eevium_z.4bpp.lz"); +const u32 gItemIcon_EeviumZ[] = INCBIN_U32("graphics/items/icons/eevium_z.4bpp.smol"); const u16 gItemIconPalette_EeviumZ[] = INCBIN_U16("graphics/items/icon_palettes/eevium_z.gbapal"); -const u32 gItemIcon_SnorliumZ[] = INCBIN_U32("graphics/items/icons/snorlium_z.4bpp.lz"); +const u32 gItemIcon_SnorliumZ[] = INCBIN_U32("graphics/items/icons/snorlium_z.4bpp.smol"); const u16 gItemIconPalette_SnorliumZ[] = INCBIN_U16("graphics/items/icon_palettes/snorlium_z.gbapal"); -const u32 gItemIcon_MewniumZ[] = INCBIN_U32("graphics/items/icons/mewnium_z.4bpp.lz"); +const u32 gItemIcon_MewniumZ[] = INCBIN_U32("graphics/items/icons/mewnium_z.4bpp.smol"); const u16 gItemIconPalette_MewniumZ[] = INCBIN_U16("graphics/items/icon_palettes/mewnium_z.gbapal"); -const u32 gItemIcon_DecidiumZ[] = INCBIN_U32("graphics/items/icons/decidium_z.4bpp.lz"); +const u32 gItemIcon_DecidiumZ[] = INCBIN_U32("graphics/items/icons/decidium_z.4bpp.smol"); const u16 gItemIconPalette_DecidiumZ[] = INCBIN_U16("graphics/items/icon_palettes/decidium_z.gbapal"); -const u32 gItemIcon_InciniumZ[] = INCBIN_U32("graphics/items/icons/incinium_z.4bpp.lz"); +const u32 gItemIcon_InciniumZ[] = INCBIN_U32("graphics/items/icons/incinium_z.4bpp.smol"); const u16 gItemIconPalette_InciniumZ[] = INCBIN_U16("graphics/items/icon_palettes/incinium_z.gbapal"); -const u32 gItemIcon_PrimariumZ[] = INCBIN_U32("graphics/items/icons/primarium_z.4bpp.lz"); +const u32 gItemIcon_PrimariumZ[] = INCBIN_U32("graphics/items/icons/primarium_z.4bpp.smol"); const u16 gItemIconPalette_PrimariumZ[] = INCBIN_U16("graphics/items/icon_palettes/primarium_z.gbapal"); -const u32 gItemIcon_LycaniumZ[] = INCBIN_U32("graphics/items/icons/lycanium_z.4bpp.lz"); +const u32 gItemIcon_LycaniumZ[] = INCBIN_U32("graphics/items/icons/lycanium_z.4bpp.smol"); const u16 gItemIconPalette_LycaniumZ[] = INCBIN_U16("graphics/items/icon_palettes/lycanium_z.gbapal"); -const u32 gItemIcon_MimikiumZ[] = INCBIN_U32("graphics/items/icons/mimikium_z.4bpp.lz"); +const u32 gItemIcon_MimikiumZ[] = INCBIN_U32("graphics/items/icons/mimikium_z.4bpp.smol"); const u16 gItemIconPalette_MimikiumZ[] = INCBIN_U16("graphics/items/icon_palettes/mimikium_z.gbapal"); -const u32 gItemIcon_KommoniumZ[] = INCBIN_U32("graphics/items/icons/kommonium_z.4bpp.lz"); +const u32 gItemIcon_KommoniumZ[] = INCBIN_U32("graphics/items/icons/kommonium_z.4bpp.smol"); const u16 gItemIconPalette_KommoniumZ[] = INCBIN_U16("graphics/items/icon_palettes/kommonium_z.gbapal"); -const u32 gItemIcon_TapuniumZ[] = INCBIN_U32("graphics/items/icons/tapunium_z.4bpp.lz"); +const u32 gItemIcon_TapuniumZ[] = INCBIN_U32("graphics/items/icons/tapunium_z.4bpp.smol"); const u16 gItemIconPalette_TapuniumZ[] = INCBIN_U16("graphics/items/icon_palettes/tapunium_z.gbapal"); -const u32 gItemIcon_SolganiumZ[] = INCBIN_U32("graphics/items/icons/solganium_z.4bpp.lz"); +const u32 gItemIcon_SolganiumZ[] = INCBIN_U32("graphics/items/icons/solganium_z.4bpp.smol"); const u16 gItemIconPalette_SolganiumZ[] = INCBIN_U16("graphics/items/icon_palettes/solganium_z.gbapal"); -const u32 gItemIcon_LunaliumZ[] = INCBIN_U32("graphics/items/icons/lunalium_z.4bpp.lz"); +const u32 gItemIcon_LunaliumZ[] = INCBIN_U32("graphics/items/icons/lunalium_z.4bpp.smol"); const u16 gItemIconPalette_LunaliumZ[] = INCBIN_U16("graphics/items/icon_palettes/lunalium_z.gbapal"); -const u32 gItemIcon_MarshadiumZ[] = INCBIN_U32("graphics/items/icons/marshadium_z.4bpp.lz"); +const u32 gItemIcon_MarshadiumZ[] = INCBIN_U32("graphics/items/icons/marshadium_z.4bpp.smol"); const u16 gItemIconPalette_MarshadiumZ[] = INCBIN_U16("graphics/items/icon_palettes/marshadium_z.gbapal"); -const u32 gItemIcon_AloraichiumZ[] = INCBIN_U32("graphics/items/icons/aloraichium_z.4bpp.lz"); +const u32 gItemIcon_AloraichiumZ[] = INCBIN_U32("graphics/items/icons/aloraichium_z.4bpp.smol"); const u16 gItemIconPalette_AloraichiumZ[] = INCBIN_U16("graphics/items/icon_palettes/aloraichium_z.gbapal"); -const u32 gItemIcon_PikashuniumZ[] = INCBIN_U32("graphics/items/icons/pikashunium_z.4bpp.lz"); +const u32 gItemIcon_PikashuniumZ[] = INCBIN_U32("graphics/items/icons/pikashunium_z.4bpp.smol"); const u16 gItemIconPalette_PikashuniumZ[] = INCBIN_U16("graphics/items/icon_palettes/pikashunium_z.gbapal"); -const u32 gItemIcon_UltranecroziumZ[] = INCBIN_U32("graphics/items/icons/ultranecrozium_z.4bpp.lz"); +const u32 gItemIcon_UltranecroziumZ[] = INCBIN_U32("graphics/items/icons/ultranecrozium_z.4bpp.smol"); const u16 gItemIconPalette_UltranecroziumZ[] = INCBIN_U16("graphics/items/icon_palettes/ultranecrozium_z.gbapal"); // Species-specific Held Items -const u32 gItemIcon_LightBall[] = INCBIN_U32("graphics/items/icons/light_ball.4bpp.lz"); +const u32 gItemIcon_LightBall[] = INCBIN_U32("graphics/items/icons/light_ball.4bpp.smol"); const u16 gItemIconPalette_LightBall[] = INCBIN_U16("graphics/items/icon_palettes/light_ball.gbapal"); -const u32 gItemIcon_Leek[] = INCBIN_U32("graphics/items/icons/leek.4bpp.lz"); +const u32 gItemIcon_Leek[] = INCBIN_U32("graphics/items/icons/leek.4bpp.smol"); const u16 gItemIconPalette_Leek[] = INCBIN_U16("graphics/items/icon_palettes/leek.gbapal"); -const u32 gItemIcon_ThickClub[] = INCBIN_U32("graphics/items/icons/thick_club.4bpp.lz"); +const u32 gItemIcon_ThickClub[] = INCBIN_U32("graphics/items/icons/thick_club.4bpp.smol"); const u16 gItemIconPalette_ThickClub[] = INCBIN_U16("graphics/items/icon_palettes/thick_club.gbapal"); -const u32 gItemIcon_LuckyPunch[] = INCBIN_U32("graphics/items/icons/lucky_punch.4bpp.lz"); +const u32 gItemIcon_LuckyPunch[] = INCBIN_U32("graphics/items/icons/lucky_punch.4bpp.smol"); const u16 gItemIconPalette_LuckyPunch[] = INCBIN_U16("graphics/items/icon_palettes/lucky_punch.gbapal"); -const u32 gItemIcon_MetalPowder[] = INCBIN_U32("graphics/items/icons/metal_powder.4bpp.lz"); +const u32 gItemIcon_MetalPowder[] = INCBIN_U32("graphics/items/icons/metal_powder.4bpp.smol"); const u16 gItemIconPalette_MetalPowder[] = INCBIN_U16("graphics/items/icon_palettes/metal_powder.gbapal"); -const u32 gItemIcon_QuickPowder[] = INCBIN_U32("graphics/items/icons/quick_powder.4bpp.lz"); +const u32 gItemIcon_QuickPowder[] = INCBIN_U32("graphics/items/icons/quick_powder.4bpp.smol"); const u16 gItemIconPalette_QuickPowder[] = INCBIN_U16("graphics/items/icon_palettes/quick_powder.gbapal"); -const u32 gItemIcon_DeepSeaScale[] = INCBIN_U32("graphics/items/icons/deep_sea_scale.4bpp.lz"); +const u32 gItemIcon_DeepSeaScale[] = INCBIN_U32("graphics/items/icons/deep_sea_scale.4bpp.smol"); const u16 gItemIconPalette_DeepSeaScale[] = INCBIN_U16("graphics/items/icon_palettes/deep_sea_scale.gbapal"); -const u32 gItemIcon_DeepSeaTooth[] = INCBIN_U32("graphics/items/icons/deep_sea_tooth.4bpp.lz"); +const u32 gItemIcon_DeepSeaTooth[] = INCBIN_U32("graphics/items/icons/deep_sea_tooth.4bpp.smol"); const u16 gItemIconPalette_DeepSeaTooth[] = INCBIN_U16("graphics/items/icon_palettes/deep_sea_tooth.gbapal"); -const u32 gItemIcon_SoulDew[] = INCBIN_U32("graphics/items/icons/soul_dew.4bpp.lz"); +const u32 gItemIcon_SoulDew[] = INCBIN_U32("graphics/items/icons/soul_dew.4bpp.smol"); const u16 gItemIconPalette_SoulDew[] = INCBIN_U16("graphics/items/icon_palettes/soul_dew.gbapal"); -const u32 gItemIcon_AdamantOrb[] = INCBIN_U32("graphics/items/icons/adamant_orb.4bpp.lz"); +const u32 gItemIcon_AdamantOrb[] = INCBIN_U32("graphics/items/icons/adamant_orb.4bpp.smol"); const u16 gItemIconPalette_AdamantOrb[] = INCBIN_U16("graphics/items/icon_palettes/adamant_orb.gbapal"); -const u32 gItemIcon_LustrousOrb[] = INCBIN_U32("graphics/items/icons/lustrous_orb.4bpp.lz"); +const u32 gItemIcon_LustrousOrb[] = INCBIN_U32("graphics/items/icons/lustrous_orb.4bpp.smol"); const u16 gItemIconPalette_LustrousOrb[] = INCBIN_U16("graphics/items/icon_palettes/lustrous_orb.gbapal"); -const u32 gItemIcon_GriseousOrb[] = INCBIN_U32("graphics/items/icons/griseous_orb.4bpp.lz"); +const u32 gItemIcon_GriseousOrb[] = INCBIN_U32("graphics/items/icons/griseous_orb.4bpp.smol"); const u16 gItemIconPalette_GriseousOrb[] = INCBIN_U16("graphics/items/icon_palettes/griseous_orb.gbapal"); // Incenses -const u32 gItemIcon_SeaIncense[] = INCBIN_U32("graphics/items/icons/sea_incense.4bpp.lz"); +const u32 gItemIcon_SeaIncense[] = INCBIN_U32("graphics/items/icons/sea_incense.4bpp.smol"); const u16 gItemIconPalette_SeaIncense[] = INCBIN_U16("graphics/items/icon_palettes/sea_incense.gbapal"); -const u32 gItemIcon_LaxIncense[] = INCBIN_U32("graphics/items/icons/lax_incense.4bpp.lz"); +const u32 gItemIcon_LaxIncense[] = INCBIN_U32("graphics/items/icons/lax_incense.4bpp.smol"); const u16 gItemIconPalette_LaxIncense[] = INCBIN_U16("graphics/items/icon_palettes/lax_incense.gbapal"); -const u32 gItemIcon_OddIncense[] = INCBIN_U32("graphics/items/icons/odd_incense.4bpp.lz"); +const u32 gItemIcon_OddIncense[] = INCBIN_U32("graphics/items/icons/odd_incense.4bpp.smol"); const u16 gItemIconPalette_OddIncense[] = INCBIN_U16("graphics/items/icon_palettes/odd_incense.gbapal"); -const u32 gItemIcon_RockIncense[] = INCBIN_U32("graphics/items/icons/rock_incense.4bpp.lz"); +const u32 gItemIcon_RockIncense[] = INCBIN_U32("graphics/items/icons/rock_incense.4bpp.smol"); const u16 gItemIconPalette_RockIncense[] = INCBIN_U16("graphics/items/icon_palettes/rock_incense.gbapal"); -const u32 gItemIcon_FullIncense[] = INCBIN_U32("graphics/items/icons/full_incense.4bpp.lz"); +const u32 gItemIcon_FullIncense[] = INCBIN_U32("graphics/items/icons/full_incense.4bpp.smol"); const u16 gItemIconPalette_FullIncense[] = INCBIN_U16("graphics/items/icon_palettes/full_incense.gbapal"); -const u32 gItemIcon_WaveIncense[] = INCBIN_U32("graphics/items/icons/wave_incense.4bpp.lz"); +const u32 gItemIcon_WaveIncense[] = INCBIN_U32("graphics/items/icons/wave_incense.4bpp.smol"); const u16 gItemIconPalette_WaveIncense[] = INCBIN_U16("graphics/items/icon_palettes/wave_incense.gbapal"); -const u32 gItemIcon_RoseIncense[] = INCBIN_U32("graphics/items/icons/rose_incense.4bpp.lz"); +const u32 gItemIcon_RoseIncense[] = INCBIN_U32("graphics/items/icons/rose_incense.4bpp.smol"); const u16 gItemIconPalette_RoseIncense[] = INCBIN_U16("graphics/items/icon_palettes/rose_incense.gbapal"); -const u32 gItemIcon_LuckIncense[] = INCBIN_U32("graphics/items/icons/luck_incense.4bpp.lz"); +const u32 gItemIcon_LuckIncense[] = INCBIN_U32("graphics/items/icons/luck_incense.4bpp.smol"); const u16 gItemIconPalette_LuckIncense[] = INCBIN_U16("graphics/items/icon_palettes/luck_incense.gbapal"); -const u32 gItemIcon_PureIncense[] = INCBIN_U32("graphics/items/icons/pure_incense.4bpp.lz"); +const u32 gItemIcon_PureIncense[] = INCBIN_U32("graphics/items/icons/pure_incense.4bpp.smol"); const u16 gItemIconPalette_PureIncense[] = INCBIN_U16("graphics/items/icon_palettes/pure_incense.gbapal"); // Contest Scarves -const u32 gItemIcon_Scarf[] = INCBIN_U32("graphics/items/icons/scarf.4bpp.lz"); +const u32 gItemIcon_Scarf[] = INCBIN_U32("graphics/items/icons/scarf.4bpp.smol"); const u16 gItemIconPalette_RedScarf[] = INCBIN_U16("graphics/items/icon_palettes/red_scarf.gbapal"); const u16 gItemIconPalette_BlueScarf[] = INCBIN_U16("graphics/items/icon_palettes/blue_scarf.gbapal"); @@ -1203,513 +1203,513 @@ const u16 gItemIconPalette_YellowScarf[] = INCBIN_U16("graphics/items/icon_palet // EV Gain Modifiers -const u32 gItemIcon_MachoBrace[] = INCBIN_U32("graphics/items/icons/macho_brace.4bpp.lz"); +const u32 gItemIcon_MachoBrace[] = INCBIN_U32("graphics/items/icons/macho_brace.4bpp.smol"); const u16 gItemIconPalette_MachoBrace[] = INCBIN_U16("graphics/items/icon_palettes/macho_brace.gbapal"); -const u32 gItemIcon_PowerWeight[] = INCBIN_U32("graphics/items/icons/power_weight.4bpp.lz"); +const u32 gItemIcon_PowerWeight[] = INCBIN_U32("graphics/items/icons/power_weight.4bpp.smol"); const u16 gItemIconPalette_PowerWeight[] = INCBIN_U16("graphics/items/icon_palettes/power_weight.gbapal"); -const u32 gItemIcon_PowerBracer[] = INCBIN_U32("graphics/items/icons/power_bracer.4bpp.lz"); +const u32 gItemIcon_PowerBracer[] = INCBIN_U32("graphics/items/icons/power_bracer.4bpp.smol"); const u16 gItemIconPalette_PowerBracer[] = INCBIN_U16("graphics/items/icon_palettes/power_bracer.gbapal"); -const u32 gItemIcon_PowerBelt[] = INCBIN_U32("graphics/items/icons/power_belt.4bpp.lz"); +const u32 gItemIcon_PowerBelt[] = INCBIN_U32("graphics/items/icons/power_belt.4bpp.smol"); const u16 gItemIconPalette_PowerBelt[] = INCBIN_U16("graphics/items/icon_palettes/power_belt.gbapal"); -const u32 gItemIcon_PowerLens[] = INCBIN_U32("graphics/items/icons/power_lens.4bpp.lz"); +const u32 gItemIcon_PowerLens[] = INCBIN_U32("graphics/items/icons/power_lens.4bpp.smol"); const u16 gItemIconPalette_PowerLens[] = INCBIN_U16("graphics/items/icon_palettes/power_lens.gbapal"); -const u32 gItemIcon_PowerBand[] = INCBIN_U32("graphics/items/icons/power_band.4bpp.lz"); +const u32 gItemIcon_PowerBand[] = INCBIN_U32("graphics/items/icons/power_band.4bpp.smol"); const u16 gItemIconPalette_PowerBand[] = INCBIN_U16("graphics/items/icon_palettes/power_band.gbapal"); -const u32 gItemIcon_PowerAnklet[] = INCBIN_U32("graphics/items/icons/power_anklet.4bpp.lz"); +const u32 gItemIcon_PowerAnklet[] = INCBIN_U32("graphics/items/icons/power_anklet.4bpp.smol"); const u16 gItemIconPalette_PowerAnklet[] = INCBIN_U16("graphics/items/icon_palettes/power_anklet.gbapal"); // Type-boosting Held Items -const u32 gItemIcon_SilkScarf[] = INCBIN_U32("graphics/items/icons/silk_scarf.4bpp.lz"); +const u32 gItemIcon_SilkScarf[] = INCBIN_U32("graphics/items/icons/silk_scarf.4bpp.smol"); const u16 gItemIconPalette_SilkScarf[] = INCBIN_U16("graphics/items/icon_palettes/silk_scarf.gbapal"); -const u32 gItemIcon_Charcoal[] = INCBIN_U32("graphics/items/icons/charcoal.4bpp.lz"); +const u32 gItemIcon_Charcoal[] = INCBIN_U32("graphics/items/icons/charcoal.4bpp.smol"); const u16 gItemIconPalette_Charcoal[] = INCBIN_U16("graphics/items/icon_palettes/charcoal.gbapal"); -const u32 gItemIcon_MysticWater[] = INCBIN_U32("graphics/items/icons/mystic_water.4bpp.lz"); +const u32 gItemIcon_MysticWater[] = INCBIN_U32("graphics/items/icons/mystic_water.4bpp.smol"); const u16 gItemIconPalette_MysticWater[] = INCBIN_U16("graphics/items/icon_palettes/mystic_water.gbapal"); -const u32 gItemIcon_Magnet[] = INCBIN_U32("graphics/items/icons/magnet.4bpp.lz"); +const u32 gItemIcon_Magnet[] = INCBIN_U32("graphics/items/icons/magnet.4bpp.smol"); const u16 gItemIconPalette_Magnet[] = INCBIN_U16("graphics/items/icon_palettes/magnet.gbapal"); -const u32 gItemIcon_MiracleSeed[] = INCBIN_U32("graphics/items/icons/miracle_seed.4bpp.lz"); +const u32 gItemIcon_MiracleSeed[] = INCBIN_U32("graphics/items/icons/miracle_seed.4bpp.smol"); const u16 gItemIconPalette_MiracleSeed[] = INCBIN_U16("graphics/items/icon_palettes/miracle_seed.gbapal"); -const u32 gItemIcon_NeverMeltIce[] = INCBIN_U32("graphics/items/icons/never_melt_ice.4bpp.lz"); +const u32 gItemIcon_NeverMeltIce[] = INCBIN_U32("graphics/items/icons/never_melt_ice.4bpp.smol"); const u16 gItemIconPalette_NeverMeltIce[] = INCBIN_U16("graphics/items/icon_palettes/never_melt_ice.gbapal"); -const u32 gItemIcon_BlackBelt[] = INCBIN_U32("graphics/items/icons/black_belt.4bpp.lz"); +const u32 gItemIcon_BlackBelt[] = INCBIN_U32("graphics/items/icons/black_belt.4bpp.smol"); const u16 gItemIconPalette_BlackTypeEnhancingItem[] = INCBIN_U16("graphics/items/icon_palettes/black_type_enhancing_item.gbapal"); -const u32 gItemIcon_PoisonBarb[] = INCBIN_U32("graphics/items/icons/poison_barb.4bpp.lz"); +const u32 gItemIcon_PoisonBarb[] = INCBIN_U32("graphics/items/icons/poison_barb.4bpp.smol"); const u16 gItemIconPalette_PoisonBarb[] = INCBIN_U16("graphics/items/icon_palettes/poison_barb.gbapal"); -const u32 gItemIcon_SoftSand[] = INCBIN_U32("graphics/items/icons/soft_sand.4bpp.lz"); +const u32 gItemIcon_SoftSand[] = INCBIN_U32("graphics/items/icons/soft_sand.4bpp.smol"); const u16 gItemIconPalette_SoftSand[] = INCBIN_U16("graphics/items/icon_palettes/soft_sand.gbapal"); -const u32 gItemIcon_SharpBeak[] = INCBIN_U32("graphics/items/icons/sharp_beak.4bpp.lz"); +const u32 gItemIcon_SharpBeak[] = INCBIN_U32("graphics/items/icons/sharp_beak.4bpp.smol"); const u16 gItemIconPalette_SharpBeak[] = INCBIN_U16("graphics/items/icon_palettes/sharp_beak.gbapal"); -const u32 gItemIcon_TwistedSpoon[] = INCBIN_U32("graphics/items/icons/twisted_spoon.4bpp.lz"); +const u32 gItemIcon_TwistedSpoon[] = INCBIN_U32("graphics/items/icons/twisted_spoon.4bpp.smol"); const u16 gItemIconPalette_TwistedSpoon[] = INCBIN_U16("graphics/items/icon_palettes/twisted_spoon.gbapal"); -const u32 gItemIcon_SilverPowder[] = INCBIN_U32("graphics/items/icons/silver_powder.4bpp.lz"); +const u32 gItemIcon_SilverPowder[] = INCBIN_U32("graphics/items/icons/silver_powder.4bpp.smol"); const u16 gItemIconPalette_SilverPowder[] = INCBIN_U16("graphics/items/icon_palettes/silver_powder.gbapal"); -const u32 gItemIcon_HardStone[] = INCBIN_U32("graphics/items/icons/hard_stone.4bpp.lz"); +const u32 gItemIcon_HardStone[] = INCBIN_U32("graphics/items/icons/hard_stone.4bpp.smol"); const u16 gItemIconPalette_HardStone[] = INCBIN_U16("graphics/items/icon_palettes/hard_stone.gbapal"); -const u32 gItemIcon_SpellTag[] = INCBIN_U32("graphics/items/icons/spell_tag.4bpp.lz"); +const u32 gItemIcon_SpellTag[] = INCBIN_U32("graphics/items/icons/spell_tag.4bpp.smol"); const u16 gItemIconPalette_SpellTag[] = INCBIN_U16("graphics/items/icon_palettes/spell_tag.gbapal"); -const u32 gItemIcon_DragonFang[] = INCBIN_U32("graphics/items/icons/dragon_fang.4bpp.lz"); +const u32 gItemIcon_DragonFang[] = INCBIN_U32("graphics/items/icons/dragon_fang.4bpp.smol"); const u16 gItemIconPalette_DragonFang[] = INCBIN_U16("graphics/items/icon_palettes/dragon_fang.gbapal"); -const u32 gItemIcon_BlackGlasses[] = INCBIN_U32("graphics/items/icons/black_glasses.4bpp.lz"); +const u32 gItemIcon_BlackGlasses[] = INCBIN_U32("graphics/items/icons/black_glasses.4bpp.smol"); -const u32 gItemIcon_MetalCoat[] = INCBIN_U32("graphics/items/icons/metal_coat.4bpp.lz"); +const u32 gItemIcon_MetalCoat[] = INCBIN_U32("graphics/items/icons/metal_coat.4bpp.smol"); const u16 gItemIconPalette_MetalCoat[] = INCBIN_U16("graphics/items/icon_palettes/metal_coat.gbapal"); // Choice Items -const u32 gItemIcon_ChoiceBand[] = INCBIN_U32("graphics/items/icons/choice_band.4bpp.lz"); +const u32 gItemIcon_ChoiceBand[] = INCBIN_U32("graphics/items/icons/choice_band.4bpp.smol"); const u16 gItemIconPalette_ChoiceBand[] = INCBIN_U16("graphics/items/icon_palettes/choice_band.gbapal"); -const u32 gItemIcon_ChoiceSpecs[] = INCBIN_U32("graphics/items/icons/choice_specs.4bpp.lz"); +const u32 gItemIcon_ChoiceSpecs[] = INCBIN_U32("graphics/items/icons/choice_specs.4bpp.smol"); const u16 gItemIconPalette_ChoiceSpecs[] = INCBIN_U16("graphics/items/icon_palettes/choice_specs.gbapal"); -const u32 gItemIcon_ChoiceScarf[] = INCBIN_U32("graphics/items/icons/choice_scarf.4bpp.lz"); +const u32 gItemIcon_ChoiceScarf[] = INCBIN_U32("graphics/items/icons/choice_scarf.4bpp.smol"); const u16 gItemIconPalette_ChoiceScarf[] = INCBIN_U16("graphics/items/icon_palettes/choice_scarf.gbapal"); // Status Orbs -const u32 gItemIcon_FlameOrb[] = INCBIN_U32("graphics/items/icons/flame_orb.4bpp.lz"); +const u32 gItemIcon_FlameOrb[] = INCBIN_U32("graphics/items/icons/flame_orb.4bpp.smol"); const u16 gItemIconPalette_FlameOrb[] = INCBIN_U16("graphics/items/icon_palettes/flame_orb.gbapal"); -const u32 gItemIcon_ToxicOrb[] = INCBIN_U32("graphics/items/icons/toxic_orb.4bpp.lz"); +const u32 gItemIcon_ToxicOrb[] = INCBIN_U32("graphics/items/icons/toxic_orb.4bpp.smol"); const u16 gItemIconPalette_ToxicOrb[] = INCBIN_U16("graphics/items/icon_palettes/toxic_orb.gbapal"); // Weather Rocks -const u32 gItemIcon_DampRock[] = INCBIN_U32("graphics/items/icons/damp_rock.4bpp.lz"); +const u32 gItemIcon_DampRock[] = INCBIN_U32("graphics/items/icons/damp_rock.4bpp.smol"); const u16 gItemIconPalette_DampRock[] = INCBIN_U16("graphics/items/icon_palettes/damp_rock.gbapal"); -const u32 gItemIcon_HeatRock[] = INCBIN_U32("graphics/items/icons/heat_rock.4bpp.lz"); +const u32 gItemIcon_HeatRock[] = INCBIN_U32("graphics/items/icons/heat_rock.4bpp.smol"); const u16 gItemIconPalette_HeatRock[] = INCBIN_U16("graphics/items/icon_palettes/heat_rock.gbapal"); -const u32 gItemIcon_SmoothRock[] = INCBIN_U32("graphics/items/icons/smooth_rock.4bpp.lz"); +const u32 gItemIcon_SmoothRock[] = INCBIN_U32("graphics/items/icons/smooth_rock.4bpp.smol"); const u16 gItemIconPalette_SmoothRock[] = INCBIN_U16("graphics/items/icon_palettes/smooth_rock.gbapal"); -const u32 gItemIcon_IcyRock[] = INCBIN_U32("graphics/items/icons/icy_rock.4bpp.lz"); +const u32 gItemIcon_IcyRock[] = INCBIN_U32("graphics/items/icons/icy_rock.4bpp.smol"); const u16 gItemIconPalette_IcyRock[] = INCBIN_U16("graphics/items/icon_palettes/icy_rock.gbapal"); // Terrain Seeds -const u32 gItemIcon_ElectricSeed[] = INCBIN_U32("graphics/items/icons/electric_seed.4bpp.lz"); +const u32 gItemIcon_ElectricSeed[] = INCBIN_U32("graphics/items/icons/electric_seed.4bpp.smol"); const u16 gItemIconPalette_ElectricSeed[] = INCBIN_U16("graphics/items/icon_palettes/electric_seed.gbapal"); -const u32 gItemIcon_PsychicSeed[] = INCBIN_U32("graphics/items/icons/psychic_seed.4bpp.lz"); +const u32 gItemIcon_PsychicSeed[] = INCBIN_U32("graphics/items/icons/psychic_seed.4bpp.smol"); const u16 gItemIconPalette_PsychicSeed[] = INCBIN_U16("graphics/items/icon_palettes/psychic_seed.gbapal"); -const u32 gItemIcon_MistySeed[] = INCBIN_U32("graphics/items/icons/misty_seed.4bpp.lz"); +const u32 gItemIcon_MistySeed[] = INCBIN_U32("graphics/items/icons/misty_seed.4bpp.smol"); const u16 gItemIconPalette_MistySeed[] = INCBIN_U16("graphics/items/icon_palettes/misty_seed.gbapal"); -const u32 gItemIcon_GrassySeed[] = INCBIN_U32("graphics/items/icons/grassy_seed.4bpp.lz"); +const u32 gItemIcon_GrassySeed[] = INCBIN_U32("graphics/items/icons/grassy_seed.4bpp.smol"); const u16 gItemIconPalette_GrassySeed[] = INCBIN_U16("graphics/items/icon_palettes/grassy_seed.gbapal"); // Type-activated Stat Modifiers -const u32 gItemIcon_AbsorbBulb[] = INCBIN_U32("graphics/items/icons/absorb_bulb.4bpp.lz"); +const u32 gItemIcon_AbsorbBulb[] = INCBIN_U32("graphics/items/icons/absorb_bulb.4bpp.smol"); const u16 gItemIconPalette_AbsorbBulb[] = INCBIN_U16("graphics/items/icon_palettes/absorb_bulb.gbapal"); -const u32 gItemIcon_CellBattery[] = INCBIN_U32("graphics/items/icons/cell_battery.4bpp.lz"); +const u32 gItemIcon_CellBattery[] = INCBIN_U32("graphics/items/icons/cell_battery.4bpp.smol"); const u16 gItemIconPalette_CellBattery[] = INCBIN_U16("graphics/items/icon_palettes/cell_battery.gbapal"); -const u32 gItemIcon_LuminousMoss[] = INCBIN_U32("graphics/items/icons/luminous_moss.4bpp.lz"); +const u32 gItemIcon_LuminousMoss[] = INCBIN_U32("graphics/items/icons/luminous_moss.4bpp.smol"); const u16 gItemIconPalette_LuminousMoss[] = INCBIN_U16("graphics/items/icon_palettes/luminous_moss.gbapal"); -const u32 gItemIcon_Snowball[] = INCBIN_U32("graphics/items/icons/snowball.4bpp.lz"); +const u32 gItemIcon_Snowball[] = INCBIN_U32("graphics/items/icons/snowball.4bpp.smol"); const u16 gItemIconPalette_Snowball[] = INCBIN_U16("graphics/items/icon_palettes/snowball.gbapal"); // Misc. Held Items -const u32 gItemIcon_BrightPowder[] = INCBIN_U32("graphics/items/icons/bright_powder.4bpp.lz"); +const u32 gItemIcon_BrightPowder[] = INCBIN_U32("graphics/items/icons/bright_powder.4bpp.smol"); const u16 gItemIconPalette_BrightPowder[] = INCBIN_U16("graphics/items/icon_palettes/bright_powder.gbapal"); -const u32 gItemIcon_InBattleHerb[] = INCBIN_U32("graphics/items/icons/in_battle_herb.4bpp.lz"); +const u32 gItemIcon_InBattleHerb[] = INCBIN_U32("graphics/items/icons/in_battle_herb.4bpp.smol"); const u16 gItemIconPalette_WhiteHerb[] = INCBIN_U16("graphics/items/icon_palettes/white_herb.gbapal"); -const u32 gItemIcon_ExpShare[] = INCBIN_U32("graphics/items/icons/exp_share.4bpp.lz"); +const u32 gItemIcon_ExpShare[] = INCBIN_U32("graphics/items/icons/exp_share.4bpp.smol"); const u16 gItemIconPalette_ExpShare[] = INCBIN_U16("graphics/items/icon_palettes/exp_share.gbapal"); -const u32 gItemIcon_QuickClaw[] = INCBIN_U32("graphics/items/icons/quick_claw.4bpp.lz"); +const u32 gItemIcon_QuickClaw[] = INCBIN_U32("graphics/items/icons/quick_claw.4bpp.smol"); const u16 gItemIconPalette_QuickClaw[] = INCBIN_U16("graphics/items/icon_palettes/quick_claw.gbapal"); -const u32 gItemIcon_SootheBell[] = INCBIN_U32("graphics/items/icons/soothe_bell.4bpp.lz"); +const u32 gItemIcon_SootheBell[] = INCBIN_U32("graphics/items/icons/soothe_bell.4bpp.smol"); const u16 gItemIconPalette_SootheBell[] = INCBIN_U16("graphics/items/icon_palettes/soothe_bell.gbapal"); const u16 gItemIconPalette_MentalHerb[] = INCBIN_U16("graphics/items/icon_palettes/mental_herb.gbapal"); -const u32 gItemIcon_KingsRock[] = INCBIN_U32("graphics/items/icons/kings_rock.4bpp.lz"); +const u32 gItemIcon_KingsRock[] = INCBIN_U32("graphics/items/icons/kings_rock.4bpp.smol"); const u16 gItemIconPalette_KingsRock[] = INCBIN_U16("graphics/items/icon_palettes/kings_rock.gbapal"); -const u32 gItemIcon_AmuletCoin[] = INCBIN_U32("graphics/items/icons/amulet_coin.4bpp.lz"); +const u32 gItemIcon_AmuletCoin[] = INCBIN_U32("graphics/items/icons/amulet_coin.4bpp.smol"); const u16 gItemIconPalette_AmuletCoin[] = INCBIN_U16("graphics/items/icon_palettes/amulet_coin.gbapal"); -const u32 gItemIcon_CleanseTag[] = INCBIN_U32("graphics/items/icons/cleanse_tag.4bpp.lz"); +const u32 gItemIcon_CleanseTag[] = INCBIN_U32("graphics/items/icons/cleanse_tag.4bpp.smol"); const u16 gItemIconPalette_CleanseTag[] = INCBIN_U16("graphics/items/icon_palettes/cleanse_tag.gbapal"); -const u32 gItemIcon_SmokeBall[] = INCBIN_U32("graphics/items/icons/smoke_ball.4bpp.lz"); +const u32 gItemIcon_SmokeBall[] = INCBIN_U32("graphics/items/icons/smoke_ball.4bpp.smol"); const u16 gItemIconPalette_SmokeBall[] = INCBIN_U16("graphics/items/icon_palettes/smoke_ball.gbapal"); -const u32 gItemIcon_FocusBand[] = INCBIN_U32("graphics/items/icons/focus_band.4bpp.lz"); +const u32 gItemIcon_FocusBand[] = INCBIN_U32("graphics/items/icons/focus_band.4bpp.smol"); const u16 gItemIconPalette_FocusBand[] = INCBIN_U16("graphics/items/icon_palettes/focus_band.gbapal"); -const u32 gItemIcon_LuckyEgg[] = INCBIN_U32("graphics/items/icons/lucky_egg.4bpp.lz"); +const u32 gItemIcon_LuckyEgg[] = INCBIN_U32("graphics/items/icons/lucky_egg.4bpp.smol"); const u16 gItemIconPalette_LuckyEgg[] = INCBIN_U16("graphics/items/icon_palettes/lucky_egg.gbapal"); -const u32 gItemIcon_ScopeLens[] = INCBIN_U32("graphics/items/icons/scope_lens.4bpp.lz"); +const u32 gItemIcon_ScopeLens[] = INCBIN_U32("graphics/items/icons/scope_lens.4bpp.smol"); const u16 gItemIconPalette_ScopeLens[] = INCBIN_U16("graphics/items/icon_palettes/scope_lens.gbapal"); -const u32 gItemIcon_Leftovers[] = INCBIN_U32("graphics/items/icons/leftovers.4bpp.lz"); +const u32 gItemIcon_Leftovers[] = INCBIN_U32("graphics/items/icons/leftovers.4bpp.smol"); const u16 gItemIconPalette_Leftovers[] = INCBIN_U16("graphics/items/icon_palettes/leftovers.gbapal"); -const u32 gItemIcon_ShellBell[] = INCBIN_U32("graphics/items/icons/shell_bell.4bpp.lz"); +const u32 gItemIcon_ShellBell[] = INCBIN_U32("graphics/items/icons/shell_bell.4bpp.smol"); -const u32 gItemIcon_WideLens[] = INCBIN_U32("graphics/items/icons/wide_lens.4bpp.lz"); +const u32 gItemIcon_WideLens[] = INCBIN_U32("graphics/items/icons/wide_lens.4bpp.smol"); const u16 gItemIconPalette_WideLens[] = INCBIN_U16("graphics/items/icon_palettes/wide_lens.gbapal"); -const u32 gItemIcon_MuscleBand[] = INCBIN_U32("graphics/items/icons/muscle_band.4bpp.lz"); +const u32 gItemIcon_MuscleBand[] = INCBIN_U32("graphics/items/icons/muscle_band.4bpp.smol"); const u16 gItemIconPalette_MuscleBand[] = INCBIN_U16("graphics/items/icon_palettes/muscle_band.gbapal"); -const u32 gItemIcon_WiseGlasses[] = INCBIN_U32("graphics/items/icons/wise_glasses.4bpp.lz"); +const u32 gItemIcon_WiseGlasses[] = INCBIN_U32("graphics/items/icons/wise_glasses.4bpp.smol"); const u16 gItemIconPalette_WiseGlasses[] = INCBIN_U16("graphics/items/icon_palettes/wise_glasses.gbapal"); -const u32 gItemIcon_ExpertBelt[] = INCBIN_U32("graphics/items/icons/expert_belt.4bpp.lz"); +const u32 gItemIcon_ExpertBelt[] = INCBIN_U32("graphics/items/icons/expert_belt.4bpp.smol"); const u16 gItemIconPalette_ExpertBelt[] = INCBIN_U16("graphics/items/icon_palettes/expert_belt.gbapal"); -const u32 gItemIcon_LightClay[] = INCBIN_U32("graphics/items/icons/light_clay.4bpp.lz"); +const u32 gItemIcon_LightClay[] = INCBIN_U32("graphics/items/icons/light_clay.4bpp.smol"); const u16 gItemIconPalette_LightClay[] = INCBIN_U16("graphics/items/icon_palettes/light_clay.gbapal"); -const u32 gItemIcon_LifeOrb[] = INCBIN_U32("graphics/items/icons/life_orb.4bpp.lz"); +const u32 gItemIcon_LifeOrb[] = INCBIN_U32("graphics/items/icons/life_orb.4bpp.smol"); const u16 gItemIconPalette_LifeOrb[] = INCBIN_U16("graphics/items/icon_palettes/life_orb.gbapal"); -const u32 gItemIcon_PowerHerb[] = INCBIN_U32("graphics/items/icons/power_herb.4bpp.lz"); +const u32 gItemIcon_PowerHerb[] = INCBIN_U32("graphics/items/icons/power_herb.4bpp.smol"); const u16 gItemIconPalette_PowerHerb[] = INCBIN_U16("graphics/items/icon_palettes/power_herb.gbapal"); -const u32 gItemIcon_FocusSash[] = INCBIN_U32("graphics/items/icons/focus_sash.4bpp.lz"); +const u32 gItemIcon_FocusSash[] = INCBIN_U32("graphics/items/icons/focus_sash.4bpp.smol"); const u16 gItemIconPalette_FocusSash[] = INCBIN_U16("graphics/items/icon_palettes/focus_sash.gbapal"); -const u32 gItemIcon_ZoomLens[] = INCBIN_U32("graphics/items/icons/zoom_lens.4bpp.lz"); +const u32 gItemIcon_ZoomLens[] = INCBIN_U32("graphics/items/icons/zoom_lens.4bpp.smol"); const u16 gItemIconPalette_ZoomLens[] = INCBIN_U16("graphics/items/icon_palettes/zoom_lens.gbapal"); -const u32 gItemIcon_Metronome[] = INCBIN_U32("graphics/items/icons/metronome.4bpp.lz"); +const u32 gItemIcon_Metronome[] = INCBIN_U32("graphics/items/icons/metronome.4bpp.smol"); const u16 gItemIconPalette_Metronome[] = INCBIN_U16("graphics/items/icon_palettes/metronome.gbapal"); -const u32 gItemIcon_IronBall[] = INCBIN_U32("graphics/items/icons/iron_ball.4bpp.lz"); +const u32 gItemIcon_IronBall[] = INCBIN_U32("graphics/items/icons/iron_ball.4bpp.smol"); const u16 gItemIconPalette_IronBall[] = INCBIN_U16("graphics/items/icon_palettes/iron_ball.gbapal"); -const u32 gItemIcon_LaggingTail[] = INCBIN_U32("graphics/items/icons/lagging_tail.4bpp.lz"); +const u32 gItemIcon_LaggingTail[] = INCBIN_U32("graphics/items/icons/lagging_tail.4bpp.smol"); const u16 gItemIconPalette_LaggingTail[] = INCBIN_U16("graphics/items/icon_palettes/lagging_tail.gbapal"); -const u32 gItemIcon_DestinyKnot[] = INCBIN_U32("graphics/items/icons/destiny_knot.4bpp.lz"); +const u32 gItemIcon_DestinyKnot[] = INCBIN_U32("graphics/items/icons/destiny_knot.4bpp.smol"); const u16 gItemIconPalette_DestinyKnot[] = INCBIN_U16("graphics/items/icon_palettes/destiny_knot.gbapal"); -const u32 gItemIcon_BlackSludge[] = INCBIN_U32("graphics/items/icons/black_sludge.4bpp.lz"); +const u32 gItemIcon_BlackSludge[] = INCBIN_U32("graphics/items/icons/black_sludge.4bpp.smol"); const u16 gItemIconPalette_BlackSludge[] = INCBIN_U16("graphics/items/icon_palettes/black_sludge.gbapal"); -const u32 gItemIcon_GripClaw[] = INCBIN_U32("graphics/items/icons/grip_claw.4bpp.lz"); +const u32 gItemIcon_GripClaw[] = INCBIN_U32("graphics/items/icons/grip_claw.4bpp.smol"); const u16 gItemIconPalette_GripClaw[] = INCBIN_U16("graphics/items/icon_palettes/grip_claw.gbapal"); -const u32 gItemIcon_StickyBarb[] = INCBIN_U32("graphics/items/icons/sticky_barb.4bpp.lz"); +const u32 gItemIcon_StickyBarb[] = INCBIN_U32("graphics/items/icons/sticky_barb.4bpp.smol"); const u16 gItemIconPalette_StickyBarb[] = INCBIN_U16("graphics/items/icon_palettes/sticky_barb.gbapal"); -const u32 gItemIcon_ShedShell[] = INCBIN_U32("graphics/items/icons/shed_shell.4bpp.lz"); +const u32 gItemIcon_ShedShell[] = INCBIN_U32("graphics/items/icons/shed_shell.4bpp.smol"); const u16 gItemIconPalette_ShedShell[] = INCBIN_U16("graphics/items/icon_palettes/shed_shell.gbapal"); -const u32 gItemIcon_BigRoot[] = INCBIN_U32("graphics/items/icons/big_root.4bpp.lz"); +const u32 gItemIcon_BigRoot[] = INCBIN_U32("graphics/items/icons/big_root.4bpp.smol"); const u16 gItemIconPalette_BigRoot[] = INCBIN_U16("graphics/items/icon_palettes/big_root.gbapal"); -const u32 gItemIcon_RazorClaw[] = INCBIN_U32("graphics/items/icons/razor_claw.4bpp.lz"); +const u32 gItemIcon_RazorClaw[] = INCBIN_U32("graphics/items/icons/razor_claw.4bpp.smol"); const u16 gItemIconPalette_RazorClaw[] = INCBIN_U16("graphics/items/icon_palettes/razor_claw.gbapal"); -const u32 gItemIcon_RazorFang[] = INCBIN_U32("graphics/items/icons/razor_fang.4bpp.lz"); +const u32 gItemIcon_RazorFang[] = INCBIN_U32("graphics/items/icons/razor_fang.4bpp.smol"); const u16 gItemIconPalette_RazorFang[] = INCBIN_U16("graphics/items/icon_palettes/razor_fang.gbapal"); -const u32 gItemIcon_Eviolite[] = INCBIN_U32("graphics/items/icons/eviolite.4bpp.lz"); +const u32 gItemIcon_Eviolite[] = INCBIN_U32("graphics/items/icons/eviolite.4bpp.smol"); const u16 gItemIconPalette_Eviolite[] = INCBIN_U16("graphics/items/icon_palettes/eviolite.gbapal"); -const u32 gItemIcon_FloatStone[] = INCBIN_U32("graphics/items/icons/float_stone.4bpp.lz"); +const u32 gItemIcon_FloatStone[] = INCBIN_U32("graphics/items/icons/float_stone.4bpp.smol"); const u16 gItemIconPalette_FloatStone[] = INCBIN_U16("graphics/items/icon_palettes/float_stone.gbapal"); -const u32 gItemIcon_RockyHelmet[] = INCBIN_U32("graphics/items/icons/rocky_helmet.4bpp.lz"); +const u32 gItemIcon_RockyHelmet[] = INCBIN_U32("graphics/items/icons/rocky_helmet.4bpp.smol"); const u16 gItemIconPalette_RockyHelmet[] = INCBIN_U16("graphics/items/icon_palettes/rocky_helmet.gbapal"); -const u32 gItemIcon_AirBalloon[] = INCBIN_U32("graphics/items/icons/air_balloon.4bpp.lz"); +const u32 gItemIcon_AirBalloon[] = INCBIN_U32("graphics/items/icons/air_balloon.4bpp.smol"); const u16 gItemIconPalette_AirBalloon[] = INCBIN_U16("graphics/items/icon_palettes/air_balloon.gbapal"); -const u32 gItemIcon_RedCard[] = INCBIN_U32("graphics/items/icons/red_card.4bpp.lz"); +const u32 gItemIcon_RedCard[] = INCBIN_U32("graphics/items/icons/red_card.4bpp.smol"); const u16 gItemIconPalette_RedCard[] = INCBIN_U16("graphics/items/icon_palettes/red_card.gbapal"); -const u32 gItemIcon_RingTarget[] = INCBIN_U32("graphics/items/icons/ring_target.4bpp.lz"); +const u32 gItemIcon_RingTarget[] = INCBIN_U32("graphics/items/icons/ring_target.4bpp.smol"); const u16 gItemIconPalette_RingTarget[] = INCBIN_U16("graphics/items/icon_palettes/ring_target.gbapal"); -const u32 gItemIcon_BindingBand[] = INCBIN_U32("graphics/items/icons/binding_band.4bpp.lz"); +const u32 gItemIcon_BindingBand[] = INCBIN_U32("graphics/items/icons/binding_band.4bpp.smol"); const u16 gItemIconPalette_BindingBand[] = INCBIN_U16("graphics/items/icon_palettes/binding_band.gbapal"); -const u32 gItemIcon_EjectButton[] = INCBIN_U32("graphics/items/icons/eject_button.4bpp.lz"); +const u32 gItemIcon_EjectButton[] = INCBIN_U32("graphics/items/icons/eject_button.4bpp.smol"); const u16 gItemIconPalette_EjectButton[] = INCBIN_U16("graphics/items/icon_palettes/eject_button.gbapal"); -const u32 gItemIcon_WeaknessPolicy[] = INCBIN_U32("graphics/items/icons/weakness_policy.4bpp.lz"); +const u32 gItemIcon_WeaknessPolicy[] = INCBIN_U32("graphics/items/icons/weakness_policy.4bpp.smol"); const u16 gItemIconPalette_WeaknessPolicy[] = INCBIN_U16("graphics/items/icon_palettes/weakness_policy.gbapal"); -const u32 gItemIcon_AssaultVest[] = INCBIN_U32("graphics/items/icons/assault_vest.4bpp.lz"); +const u32 gItemIcon_AssaultVest[] = INCBIN_U32("graphics/items/icons/assault_vest.4bpp.smol"); const u16 gItemIconPalette_AssaultVest[] = INCBIN_U16("graphics/items/icon_palettes/assault_vest.gbapal"); -const u32 gItemIcon_SafetyGoggles[] = INCBIN_U32("graphics/items/icons/safety_goggles.4bpp.lz"); +const u32 gItemIcon_SafetyGoggles[] = INCBIN_U32("graphics/items/icons/safety_goggles.4bpp.smol"); const u16 gItemIconPalette_SafetyGoggles[] = INCBIN_U16("graphics/items/icon_palettes/safety_goggles.gbapal"); -const u32 gItemIcon_AdrenalineOrb[] = INCBIN_U32("graphics/items/icons/adrenaline_orb.4bpp.lz"); +const u32 gItemIcon_AdrenalineOrb[] = INCBIN_U32("graphics/items/icons/adrenaline_orb.4bpp.smol"); const u16 gItemIconPalette_AdrenalineOrb[] = INCBIN_U16("graphics/items/icon_palettes/adrenaline_orb.gbapal"); -const u32 gItemIcon_TerrainExtender[] = INCBIN_U32("graphics/items/icons/terrain_extender.4bpp.lz"); +const u32 gItemIcon_TerrainExtender[] = INCBIN_U32("graphics/items/icons/terrain_extender.4bpp.smol"); const u16 gItemIconPalette_TerrainExtender[] = INCBIN_U16("graphics/items/icon_palettes/terrain_extender.gbapal"); -const u32 gItemIcon_ProtectivePads[] = INCBIN_U32("graphics/items/icons/protective_pads.4bpp.lz"); +const u32 gItemIcon_ProtectivePads[] = INCBIN_U32("graphics/items/icons/protective_pads.4bpp.smol"); const u16 gItemIconPalette_ProtectivePads[] = INCBIN_U16("graphics/items/icon_palettes/protective_pads.gbapal"); -const u32 gItemIcon_ThroatSpray[] = INCBIN_U32("graphics/items/icons/throat_spray.4bpp.lz"); +const u32 gItemIcon_ThroatSpray[] = INCBIN_U32("graphics/items/icons/throat_spray.4bpp.smol"); const u16 gItemIconPalette_ThroatSpray[] = INCBIN_U16("graphics/items/icon_palettes/throat_spray.gbapal"); -const u32 gItemIcon_EjectPack[] = INCBIN_U32("graphics/items/icons/eject_pack.4bpp.lz"); +const u32 gItemIcon_EjectPack[] = INCBIN_U32("graphics/items/icons/eject_pack.4bpp.smol"); const u16 gItemIconPalette_EjectPack[] = INCBIN_U16("graphics/items/icon_palettes/eject_pack.gbapal"); -const u32 gItemIcon_HeavyDutyBoots[] = INCBIN_U32("graphics/items/icons/heavy_duty_boots.4bpp.lz"); +const u32 gItemIcon_HeavyDutyBoots[] = INCBIN_U32("graphics/items/icons/heavy_duty_boots.4bpp.smol"); const u16 gItemIconPalette_HeavyDutyBoots[] = INCBIN_U16("graphics/items/icon_palettes/heavy_duty_boots.gbapal"); -const u32 gItemIcon_BlunderPolicy[] = INCBIN_U32("graphics/items/icons/blunder_policy.4bpp.lz"); +const u32 gItemIcon_BlunderPolicy[] = INCBIN_U32("graphics/items/icons/blunder_policy.4bpp.smol"); const u16 gItemIconPalette_BlunderPolicy[] = INCBIN_U16("graphics/items/icon_palettes/blunder_policy.gbapal"); -const u32 gItemIcon_RoomService[] = INCBIN_U32("graphics/items/icons/room_service.4bpp.lz"); +const u32 gItemIcon_RoomService[] = INCBIN_U32("graphics/items/icons/room_service.4bpp.smol"); const u16 gItemIconPalette_RoomService[] = INCBIN_U16("graphics/items/icon_palettes/room_service.gbapal"); -const u32 gItemIcon_UtilityUmbrella[] = INCBIN_U32("graphics/items/icons/utility_umbrella.4bpp.lz"); +const u32 gItemIcon_UtilityUmbrella[] = INCBIN_U32("graphics/items/icons/utility_umbrella.4bpp.smol"); const u16 gItemIconPalette_UtilityUmbrella[] = INCBIN_U16("graphics/items/icon_palettes/utility_umbrella.gbapal"); // Berries -const u32 gItemIcon_CheriBerry[] = INCBIN_U32("graphics/items/icons/cheri_berry.4bpp.lz"); +const u32 gItemIcon_CheriBerry[] = INCBIN_U32("graphics/items/icons/cheri_berry.4bpp.smol"); const u16 gItemIconPalette_CheriBerry[] = INCBIN_U16("graphics/items/icon_palettes/cheri_berry.gbapal"); -const u32 gItemIcon_ChestoBerry[] = INCBIN_U32("graphics/items/icons/chesto_berry.4bpp.lz"); +const u32 gItemIcon_ChestoBerry[] = INCBIN_U32("graphics/items/icons/chesto_berry.4bpp.smol"); const u16 gItemIconPalette_ChestoBerry[] = INCBIN_U16("graphics/items/icon_palettes/chesto_berry.gbapal"); -const u32 gItemIcon_PechaBerry[] = INCBIN_U32("graphics/items/icons/pecha_berry.4bpp.lz"); +const u32 gItemIcon_PechaBerry[] = INCBIN_U32("graphics/items/icons/pecha_berry.4bpp.smol"); const u16 gItemIconPalette_PechaBerry[] = INCBIN_U16("graphics/items/icon_palettes/pecha_berry.gbapal"); -const u32 gItemIcon_RawstBerry[] = INCBIN_U32("graphics/items/icons/rawst_berry.4bpp.lz"); +const u32 gItemIcon_RawstBerry[] = INCBIN_U32("graphics/items/icons/rawst_berry.4bpp.smol"); const u16 gItemIconPalette_RawstBerry[] = INCBIN_U16("graphics/items/icon_palettes/rawst_berry.gbapal"); -const u32 gItemIcon_AspearBerry[] = INCBIN_U32("graphics/items/icons/aspear_berry.4bpp.lz"); +const u32 gItemIcon_AspearBerry[] = INCBIN_U32("graphics/items/icons/aspear_berry.4bpp.smol"); const u16 gItemIconPalette_AspearBerry[] = INCBIN_U16("graphics/items/icon_palettes/aspear_berry.gbapal"); -const u32 gItemIcon_LeppaBerry[] = INCBIN_U32("graphics/items/icons/leppa_berry.4bpp.lz"); +const u32 gItemIcon_LeppaBerry[] = INCBIN_U32("graphics/items/icons/leppa_berry.4bpp.smol"); const u16 gItemIconPalette_LeppaBerry[] = INCBIN_U16("graphics/items/icon_palettes/leppa_berry.gbapal"); -const u32 gItemIcon_OranBerry[] = INCBIN_U32("graphics/items/icons/oran_berry.4bpp.lz"); +const u32 gItemIcon_OranBerry[] = INCBIN_U32("graphics/items/icons/oran_berry.4bpp.smol"); const u16 gItemIconPalette_OranBerry[] = INCBIN_U16("graphics/items/icon_palettes/oran_berry.gbapal"); -const u32 gItemIcon_PersimBerry[] = INCBIN_U32("graphics/items/icons/persim_berry.4bpp.lz"); +const u32 gItemIcon_PersimBerry[] = INCBIN_U32("graphics/items/icons/persim_berry.4bpp.smol"); const u16 gItemIconPalette_PersimBerry[] = INCBIN_U16("graphics/items/icon_palettes/persim_berry.gbapal"); -const u32 gItemIcon_LumBerry[] = INCBIN_U32("graphics/items/icons/lum_berry.4bpp.lz"); +const u32 gItemIcon_LumBerry[] = INCBIN_U32("graphics/items/icons/lum_berry.4bpp.smol"); const u16 gItemIconPalette_LumBerry[] = INCBIN_U16("graphics/items/icon_palettes/lum_berry.gbapal"); -const u32 gItemIcon_SitrusBerry[] = INCBIN_U32("graphics/items/icons/sitrus_berry.4bpp.lz"); +const u32 gItemIcon_SitrusBerry[] = INCBIN_U32("graphics/items/icons/sitrus_berry.4bpp.smol"); const u16 gItemIconPalette_SitrusBerry[] = INCBIN_U16("graphics/items/icon_palettes/sitrus_berry.gbapal"); -const u32 gItemIcon_FigyBerry[] = INCBIN_U32("graphics/items/icons/figy_berry.4bpp.lz"); +const u32 gItemIcon_FigyBerry[] = INCBIN_U32("graphics/items/icons/figy_berry.4bpp.smol"); const u16 gItemIconPalette_FigyBerry[] = INCBIN_U16("graphics/items/icon_palettes/figy_berry.gbapal"); -const u32 gItemIcon_WikiBerry[] = INCBIN_U32("graphics/items/icons/wiki_berry.4bpp.lz"); +const u32 gItemIcon_WikiBerry[] = INCBIN_U32("graphics/items/icons/wiki_berry.4bpp.smol"); const u16 gItemIconPalette_WikiBerry[] = INCBIN_U16("graphics/items/icon_palettes/wiki_berry.gbapal"); -const u32 gItemIcon_MagoBerry[] = INCBIN_U32("graphics/items/icons/mago_berry.4bpp.lz"); +const u32 gItemIcon_MagoBerry[] = INCBIN_U32("graphics/items/icons/mago_berry.4bpp.smol"); const u16 gItemIconPalette_MagoBerry[] = INCBIN_U16("graphics/items/icon_palettes/mago_berry.gbapal"); -const u32 gItemIcon_AguavBerry[] = INCBIN_U32("graphics/items/icons/aguav_berry.4bpp.lz"); +const u32 gItemIcon_AguavBerry[] = INCBIN_U32("graphics/items/icons/aguav_berry.4bpp.smol"); const u16 gItemIconPalette_AguavBerry[] = INCBIN_U16("graphics/items/icon_palettes/aguav_berry.gbapal"); -const u32 gItemIcon_IapapaBerry[] = INCBIN_U32("graphics/items/icons/iapapa_berry.4bpp.lz"); +const u32 gItemIcon_IapapaBerry[] = INCBIN_U32("graphics/items/icons/iapapa_berry.4bpp.smol"); const u16 gItemIconPalette_IapapaBerry[] = INCBIN_U16("graphics/items/icon_palettes/iapapa_berry.gbapal"); -const u32 gItemIcon_RazzBerry[] = INCBIN_U32("graphics/items/icons/razz_berry.4bpp.lz"); +const u32 gItemIcon_RazzBerry[] = INCBIN_U32("graphics/items/icons/razz_berry.4bpp.smol"); const u16 gItemIconPalette_RazzBerry[] = INCBIN_U16("graphics/items/icon_palettes/razz_berry.gbapal"); -const u32 gItemIcon_BlukBerry[] = INCBIN_U32("graphics/items/icons/bluk_berry.4bpp.lz"); +const u32 gItemIcon_BlukBerry[] = INCBIN_U32("graphics/items/icons/bluk_berry.4bpp.smol"); const u16 gItemIconPalette_BlukBerry[] = INCBIN_U16("graphics/items/icon_palettes/bluk_berry.gbapal"); -const u32 gItemIcon_NanabBerry[] = INCBIN_U32("graphics/items/icons/nanab_berry.4bpp.lz"); +const u32 gItemIcon_NanabBerry[] = INCBIN_U32("graphics/items/icons/nanab_berry.4bpp.smol"); const u16 gItemIconPalette_NanabBerry[] = INCBIN_U16("graphics/items/icon_palettes/nanab_berry.gbapal"); -const u32 gItemIcon_WepearBerry[] = INCBIN_U32("graphics/items/icons/wepear_berry.4bpp.lz"); +const u32 gItemIcon_WepearBerry[] = INCBIN_U32("graphics/items/icons/wepear_berry.4bpp.smol"); const u16 gItemIconPalette_WepearBerry[] = INCBIN_U16("graphics/items/icon_palettes/wepear_berry.gbapal"); -const u32 gItemIcon_PinapBerry[] = INCBIN_U32("graphics/items/icons/pinap_berry.4bpp.lz"); +const u32 gItemIcon_PinapBerry[] = INCBIN_U32("graphics/items/icons/pinap_berry.4bpp.smol"); const u16 gItemIconPalette_PinapBerry[] = INCBIN_U16("graphics/items/icon_palettes/pinap_berry.gbapal"); -const u32 gItemIcon_PomegBerry[] = INCBIN_U32("graphics/items/icons/pomeg_berry.4bpp.lz"); +const u32 gItemIcon_PomegBerry[] = INCBIN_U32("graphics/items/icons/pomeg_berry.4bpp.smol"); const u16 gItemIconPalette_PomegBerry[] = INCBIN_U16("graphics/items/icon_palettes/pomeg_berry.gbapal"); -const u32 gItemIcon_KelpsyBerry[] = INCBIN_U32("graphics/items/icons/kelpsy_berry.4bpp.lz"); +const u32 gItemIcon_KelpsyBerry[] = INCBIN_U32("graphics/items/icons/kelpsy_berry.4bpp.smol"); const u16 gItemIconPalette_KelpsyBerry[] = INCBIN_U16("graphics/items/icon_palettes/kelpsy_berry.gbapal"); -const u32 gItemIcon_QualotBerry[] = INCBIN_U32("graphics/items/icons/qualot_berry.4bpp.lz"); +const u32 gItemIcon_QualotBerry[] = INCBIN_U32("graphics/items/icons/qualot_berry.4bpp.smol"); const u16 gItemIconPalette_QualotBerry[] = INCBIN_U16("graphics/items/icon_palettes/qualot_berry.gbapal"); -const u32 gItemIcon_HondewBerry[] = INCBIN_U32("graphics/items/icons/hondew_berry.4bpp.lz"); +const u32 gItemIcon_HondewBerry[] = INCBIN_U32("graphics/items/icons/hondew_berry.4bpp.smol"); const u16 gItemIconPalette_HondewBerry[] = INCBIN_U16("graphics/items/icon_palettes/hondew_berry.gbapal"); -const u32 gItemIcon_GrepaBerry[] = INCBIN_U32("graphics/items/icons/grepa_berry.4bpp.lz"); +const u32 gItemIcon_GrepaBerry[] = INCBIN_U32("graphics/items/icons/grepa_berry.4bpp.smol"); const u16 gItemIconPalette_GrepaBerry[] = INCBIN_U16("graphics/items/icon_palettes/grepa_berry.gbapal"); -const u32 gItemIcon_TamatoBerry[] = INCBIN_U32("graphics/items/icons/tamato_berry.4bpp.lz"); +const u32 gItemIcon_TamatoBerry[] = INCBIN_U32("graphics/items/icons/tamato_berry.4bpp.smol"); const u16 gItemIconPalette_TamatoBerry[] = INCBIN_U16("graphics/items/icon_palettes/tamato_berry.gbapal"); -const u32 gItemIcon_CornnBerry[] = INCBIN_U32("graphics/items/icons/cornn_berry.4bpp.lz"); +const u32 gItemIcon_CornnBerry[] = INCBIN_U32("graphics/items/icons/cornn_berry.4bpp.smol"); const u16 gItemIconPalette_CornnBerry[] = INCBIN_U16("graphics/items/icon_palettes/cornn_berry.gbapal"); -const u32 gItemIcon_MagostBerry[] = INCBIN_U32("graphics/items/icons/magost_berry.4bpp.lz"); +const u32 gItemIcon_MagostBerry[] = INCBIN_U32("graphics/items/icons/magost_berry.4bpp.smol"); const u16 gItemIconPalette_MagostBerry[] = INCBIN_U16("graphics/items/icon_palettes/magost_berry.gbapal"); -const u32 gItemIcon_RabutaBerry[] = INCBIN_U32("graphics/items/icons/rabuta_berry.4bpp.lz"); +const u32 gItemIcon_RabutaBerry[] = INCBIN_U32("graphics/items/icons/rabuta_berry.4bpp.smol"); const u16 gItemIconPalette_RabutaBerry[] = INCBIN_U16("graphics/items/icon_palettes/rabuta_berry.gbapal"); -const u32 gItemIcon_NomelBerry[] = INCBIN_U32("graphics/items/icons/nomel_berry.4bpp.lz"); +const u32 gItemIcon_NomelBerry[] = INCBIN_U32("graphics/items/icons/nomel_berry.4bpp.smol"); const u16 gItemIconPalette_NomelBerry[] = INCBIN_U16("graphics/items/icon_palettes/nomel_berry.gbapal"); -const u32 gItemIcon_SpelonBerry[] = INCBIN_U32("graphics/items/icons/spelon_berry.4bpp.lz"); +const u32 gItemIcon_SpelonBerry[] = INCBIN_U32("graphics/items/icons/spelon_berry.4bpp.smol"); const u16 gItemIconPalette_SpelonBerry[] = INCBIN_U16("graphics/items/icon_palettes/spelon_berry.gbapal"); -const u32 gItemIcon_PamtreBerry[] = INCBIN_U32("graphics/items/icons/pamtre_berry.4bpp.lz"); +const u32 gItemIcon_PamtreBerry[] = INCBIN_U32("graphics/items/icons/pamtre_berry.4bpp.smol"); const u16 gItemIconPalette_PamtreBerry[] = INCBIN_U16("graphics/items/icon_palettes/pamtre_berry.gbapal"); -const u32 gItemIcon_WatmelBerry[] = INCBIN_U32("graphics/items/icons/watmel_berry.4bpp.lz"); +const u32 gItemIcon_WatmelBerry[] = INCBIN_U32("graphics/items/icons/watmel_berry.4bpp.smol"); const u16 gItemIconPalette_WatmelBerry[] = INCBIN_U16("graphics/items/icon_palettes/watmel_berry.gbapal"); -const u32 gItemIcon_DurinBerry[] = INCBIN_U32("graphics/items/icons/durin_berry.4bpp.lz"); +const u32 gItemIcon_DurinBerry[] = INCBIN_U32("graphics/items/icons/durin_berry.4bpp.smol"); const u16 gItemIconPalette_DurinBerry[] = INCBIN_U16("graphics/items/icon_palettes/durin_berry.gbapal"); -const u32 gItemIcon_BelueBerry[] = INCBIN_U32("graphics/items/icons/belue_berry.4bpp.lz"); +const u32 gItemIcon_BelueBerry[] = INCBIN_U32("graphics/items/icons/belue_berry.4bpp.smol"); const u16 gItemIconPalette_BelueBerry[] = INCBIN_U16("graphics/items/icon_palettes/belue_berry.gbapal"); -const u32 gItemIcon_ChilanBerry[] = INCBIN_U32("graphics/items/icons/chilan_berry.4bpp.lz"); +const u32 gItemIcon_ChilanBerry[] = INCBIN_U32("graphics/items/icons/chilan_berry.4bpp.smol"); const u16 gItemIconPalette_ChilanBerry[] = INCBIN_U16("graphics/items/icon_palettes/chilan_berry.gbapal"); -const u32 gItemIcon_OccaBerry[] = INCBIN_U32("graphics/items/icons/occa_berry.4bpp.lz"); +const u32 gItemIcon_OccaBerry[] = INCBIN_U32("graphics/items/icons/occa_berry.4bpp.smol"); const u16 gItemIconPalette_OccaBerry[] = INCBIN_U16("graphics/items/icon_palettes/occa_berry.gbapal"); -const u32 gItemIcon_PasshoBerry[] = INCBIN_U32("graphics/items/icons/passho_berry.4bpp.lz"); +const u32 gItemIcon_PasshoBerry[] = INCBIN_U32("graphics/items/icons/passho_berry.4bpp.smol"); const u16 gItemIconPalette_PasshoBerry[] = INCBIN_U16("graphics/items/icon_palettes/passho_berry.gbapal"); -const u32 gItemIcon_WacanBerry[] = INCBIN_U32("graphics/items/icons/wacan_berry.4bpp.lz"); +const u32 gItemIcon_WacanBerry[] = INCBIN_U32("graphics/items/icons/wacan_berry.4bpp.smol"); const u16 gItemIconPalette_WacanBerry[] = INCBIN_U16("graphics/items/icon_palettes/wacan_berry.gbapal"); -const u32 gItemIcon_RindoBerry[] = INCBIN_U32("graphics/items/icons/rindo_berry.4bpp.lz"); +const u32 gItemIcon_RindoBerry[] = INCBIN_U32("graphics/items/icons/rindo_berry.4bpp.smol"); const u16 gItemIconPalette_RindoBerry[] = INCBIN_U16("graphics/items/icon_palettes/rindo_berry.gbapal"); -const u32 gItemIcon_YacheBerry[] = INCBIN_U32("graphics/items/icons/yache_berry.4bpp.lz"); +const u32 gItemIcon_YacheBerry[] = INCBIN_U32("graphics/items/icons/yache_berry.4bpp.smol"); const u16 gItemIconPalette_YacheBerry[] = INCBIN_U16("graphics/items/icon_palettes/yache_berry.gbapal"); -const u32 gItemIcon_ChopleBerry[] = INCBIN_U32("graphics/items/icons/chople_berry.4bpp.lz"); +const u32 gItemIcon_ChopleBerry[] = INCBIN_U32("graphics/items/icons/chople_berry.4bpp.smol"); const u16 gItemIconPalette_ChopleBerry[] = INCBIN_U16("graphics/items/icon_palettes/chople_berry.gbapal"); -const u32 gItemIcon_KebiaBerry[] = INCBIN_U32("graphics/items/icons/kebia_berry.4bpp.lz"); +const u32 gItemIcon_KebiaBerry[] = INCBIN_U32("graphics/items/icons/kebia_berry.4bpp.smol"); const u16 gItemIconPalette_KebiaBerry[] = INCBIN_U16("graphics/items/icon_palettes/kebia_berry.gbapal"); -const u32 gItemIcon_ShucaBerry[] = INCBIN_U32("graphics/items/icons/shuca_berry.4bpp.lz"); +const u32 gItemIcon_ShucaBerry[] = INCBIN_U32("graphics/items/icons/shuca_berry.4bpp.smol"); const u16 gItemIconPalette_ShucaBerry[] = INCBIN_U16("graphics/items/icon_palettes/shuca_berry.gbapal"); -const u32 gItemIcon_CobaBerry[] = INCBIN_U32("graphics/items/icons/coba_berry.4bpp.lz"); +const u32 gItemIcon_CobaBerry[] = INCBIN_U32("graphics/items/icons/coba_berry.4bpp.smol"); const u16 gItemIconPalette_CobaBerry[] = INCBIN_U16("graphics/items/icon_palettes/coba_berry.gbapal"); -const u32 gItemIcon_PayapaBerry[] = INCBIN_U32("graphics/items/icons/payapa_berry.4bpp.lz"); +const u32 gItemIcon_PayapaBerry[] = INCBIN_U32("graphics/items/icons/payapa_berry.4bpp.smol"); const u16 gItemIconPalette_PayapaBerry[] = INCBIN_U16("graphics/items/icon_palettes/payapa_berry.gbapal"); -const u32 gItemIcon_TangaBerry[] = INCBIN_U32("graphics/items/icons/tanga_berry.4bpp.lz"); +const u32 gItemIcon_TangaBerry[] = INCBIN_U32("graphics/items/icons/tanga_berry.4bpp.smol"); const u16 gItemIconPalette_TangaBerry[] = INCBIN_U16("graphics/items/icon_palettes/tanga_berry.gbapal"); -const u32 gItemIcon_ChartiBerry[] = INCBIN_U32("graphics/items/icons/charti_berry.4bpp.lz"); +const u32 gItemIcon_ChartiBerry[] = INCBIN_U32("graphics/items/icons/charti_berry.4bpp.smol"); const u16 gItemIconPalette_ChartiBerry[] = INCBIN_U16("graphics/items/icon_palettes/charti_berry.gbapal"); -const u32 gItemIcon_KasibBerry[] = INCBIN_U32("graphics/items/icons/kasib_berry.4bpp.lz"); +const u32 gItemIcon_KasibBerry[] = INCBIN_U32("graphics/items/icons/kasib_berry.4bpp.smol"); const u16 gItemIconPalette_KasibBerry[] = INCBIN_U16("graphics/items/icon_palettes/kasib_berry.gbapal"); -const u32 gItemIcon_HabanBerry[] = INCBIN_U32("graphics/items/icons/haban_berry.4bpp.lz"); +const u32 gItemIcon_HabanBerry[] = INCBIN_U32("graphics/items/icons/haban_berry.4bpp.smol"); const u16 gItemIconPalette_HabanBerry[] = INCBIN_U16("graphics/items/icon_palettes/haban_berry.gbapal"); -const u32 gItemIcon_ColburBerry[] = INCBIN_U32("graphics/items/icons/colbur_berry.4bpp.lz"); +const u32 gItemIcon_ColburBerry[] = INCBIN_U32("graphics/items/icons/colbur_berry.4bpp.smol"); const u16 gItemIconPalette_ColburBerry[] = INCBIN_U16("graphics/items/icon_palettes/colbur_berry.gbapal"); -const u32 gItemIcon_BabiriBerry[] = INCBIN_U32("graphics/items/icons/babiri_berry.4bpp.lz"); +const u32 gItemIcon_BabiriBerry[] = INCBIN_U32("graphics/items/icons/babiri_berry.4bpp.smol"); const u16 gItemIconPalette_BabiriBerry[] = INCBIN_U16("graphics/items/icon_palettes/babiri_berry.gbapal"); -const u32 gItemIcon_RoseliBerry[] = INCBIN_U32("graphics/items/icons/roseli_berry.4bpp.lz"); +const u32 gItemIcon_RoseliBerry[] = INCBIN_U32("graphics/items/icons/roseli_berry.4bpp.smol"); const u16 gItemIconPalette_RoseliBerry[] = INCBIN_U16("graphics/items/icon_palettes/roseli_berry.gbapal"); -const u32 gItemIcon_LiechiBerry[] = INCBIN_U32("graphics/items/icons/liechi_berry.4bpp.lz"); +const u32 gItemIcon_LiechiBerry[] = INCBIN_U32("graphics/items/icons/liechi_berry.4bpp.smol"); const u16 gItemIconPalette_LiechiBerry[] = INCBIN_U16("graphics/items/icon_palettes/liechi_berry.gbapal"); -const u32 gItemIcon_GanlonBerry[] = INCBIN_U32("graphics/items/icons/ganlon_berry.4bpp.lz"); +const u32 gItemIcon_GanlonBerry[] = INCBIN_U32("graphics/items/icons/ganlon_berry.4bpp.smol"); const u16 gItemIconPalette_GanlonBerry[] = INCBIN_U16("graphics/items/icon_palettes/ganlon_berry.gbapal"); -const u32 gItemIcon_SalacBerry[] = INCBIN_U32("graphics/items/icons/salac_berry.4bpp.lz"); +const u32 gItemIcon_SalacBerry[] = INCBIN_U32("graphics/items/icons/salac_berry.4bpp.smol"); const u16 gItemIconPalette_SalacBerry[] = INCBIN_U16("graphics/items/icon_palettes/salac_berry.gbapal"); -const u32 gItemIcon_PetayaBerry[] = INCBIN_U32("graphics/items/icons/petaya_berry.4bpp.lz"); +const u32 gItemIcon_PetayaBerry[] = INCBIN_U32("graphics/items/icons/petaya_berry.4bpp.smol"); const u16 gItemIconPalette_PetayaBerry[] = INCBIN_U16("graphics/items/icon_palettes/petaya_berry.gbapal"); -const u32 gItemIcon_ApicotBerry[] = INCBIN_U32("graphics/items/icons/apicot_berry.4bpp.lz"); +const u32 gItemIcon_ApicotBerry[] = INCBIN_U32("graphics/items/icons/apicot_berry.4bpp.smol"); const u16 gItemIconPalette_ApicotBerry[] = INCBIN_U16("graphics/items/icon_palettes/apicot_berry.gbapal"); -const u32 gItemIcon_LansatBerry[] = INCBIN_U32("graphics/items/icons/lansat_berry.4bpp.lz"); +const u32 gItemIcon_LansatBerry[] = INCBIN_U32("graphics/items/icons/lansat_berry.4bpp.smol"); const u16 gItemIconPalette_LansatBerry[] = INCBIN_U16("graphics/items/icon_palettes/lansat_berry.gbapal"); -const u32 gItemIcon_StarfBerry[] = INCBIN_U32("graphics/items/icons/starf_berry.4bpp.lz"); +const u32 gItemIcon_StarfBerry[] = INCBIN_U32("graphics/items/icons/starf_berry.4bpp.smol"); const u16 gItemIconPalette_StarfBerry[] = INCBIN_U16("graphics/items/icon_palettes/starf_berry.gbapal"); -const u32 gItemIcon_EnigmaBerry[] = INCBIN_U32("graphics/items/icons/enigma_berry.4bpp.lz"); +const u32 gItemIcon_EnigmaBerry[] = INCBIN_U32("graphics/items/icons/enigma_berry.4bpp.smol"); const u16 gItemIconPalette_EnigmaBerry[] = INCBIN_U16("graphics/items/icon_palettes/enigma_berry.gbapal"); -const u32 gItemIcon_MicleBerry[] = INCBIN_U32("graphics/items/icons/micle_berry.4bpp.lz"); +const u32 gItemIcon_MicleBerry[] = INCBIN_U32("graphics/items/icons/micle_berry.4bpp.smol"); const u16 gItemIconPalette_MicleBerry[] = INCBIN_U16("graphics/items/icon_palettes/micle_berry.gbapal"); -const u32 gItemIcon_CustapBerry[] = INCBIN_U32("graphics/items/icons/custap_berry.4bpp.lz"); +const u32 gItemIcon_CustapBerry[] = INCBIN_U32("graphics/items/icons/custap_berry.4bpp.smol"); const u16 gItemIconPalette_CustapBerry[] = INCBIN_U16("graphics/items/icon_palettes/custap_berry.gbapal"); -const u32 gItemIcon_JabocaBerry[] = INCBIN_U32("graphics/items/icons/jaboca_berry.4bpp.lz"); +const u32 gItemIcon_JabocaBerry[] = INCBIN_U32("graphics/items/icons/jaboca_berry.4bpp.smol"); const u16 gItemIconPalette_JabocaBerry[] = INCBIN_U16("graphics/items/icon_palettes/jaboca_berry.gbapal"); -const u32 gItemIcon_RowapBerry[] = INCBIN_U32("graphics/items/icons/rowap_berry.4bpp.lz"); +const u32 gItemIcon_RowapBerry[] = INCBIN_U32("graphics/items/icons/rowap_berry.4bpp.smol"); const u16 gItemIconPalette_RowapBerry[] = INCBIN_U16("graphics/items/icon_palettes/rowap_berry.gbapal"); -const u32 gItemIcon_KeeBerry[] = INCBIN_U32("graphics/items/icons/kee_berry.4bpp.lz"); +const u32 gItemIcon_KeeBerry[] = INCBIN_U32("graphics/items/icons/kee_berry.4bpp.smol"); const u16 gItemIconPalette_KeeBerry[] = INCBIN_U16("graphics/items/icon_palettes/kee_berry.gbapal"); -const u32 gItemIcon_MarangaBerry[] = INCBIN_U32("graphics/items/icons/maranga_berry.4bpp.lz"); +const u32 gItemIcon_MarangaBerry[] = INCBIN_U32("graphics/items/icons/maranga_berry.4bpp.smol"); const u16 gItemIconPalette_MarangaBerry[] = INCBIN_U16("graphics/items/icon_palettes/maranga_berry.gbapal"); // TMs/HMs -const u32 gItemIcon_TM[] = INCBIN_U32("graphics/items/icons/tm.4bpp.lz"); +const u32 gItemIcon_TM[] = INCBIN_U32("graphics/items/icons/tm.4bpp.smol"); -const u32 gItemIcon_HM[] = INCBIN_U32("graphics/items/icons/hm.4bpp.lz"); +const u32 gItemIcon_HM[] = INCBIN_U32("graphics/items/icons/hm.4bpp.smol"); const u16 gItemIconPalette_NormalTMHM[] = INCBIN_U16("graphics/items/icon_palettes/normal_tm_hm.gbapal"); @@ -1749,266 +1749,266 @@ const u16 gItemIconPalette_FairyTMHM[] = INCBIN_U16("graphics/items/icon_palette // Charms -const u32 gItemIcon_OvalCharm[] = INCBIN_U32("graphics/items/icons/oval_charm.4bpp.lz"); +const u32 gItemIcon_OvalCharm[] = INCBIN_U32("graphics/items/icons/oval_charm.4bpp.smol"); const u16 gItemIconPalette_OvalCharm[] = INCBIN_U16("graphics/items/icon_palettes/oval_charm.gbapal"); -const u32 gItemIcon_ShinyCharm[] = INCBIN_U32("graphics/items/icons/shiny_charm.4bpp.lz"); +const u32 gItemIcon_ShinyCharm[] = INCBIN_U32("graphics/items/icons/shiny_charm.4bpp.smol"); const u16 gItemIconPalette_ShinyCharm[] = INCBIN_U16("graphics/items/icon_palettes/shiny_charm.gbapal"); -const u32 gItemIcon_CatchingCharm[] = INCBIN_U32("graphics/items/icons/catching_charm.4bpp.lz"); +const u32 gItemIcon_CatchingCharm[] = INCBIN_U32("graphics/items/icons/catching_charm.4bpp.smol"); const u16 gItemIconPalette_CatchingCharm[] = INCBIN_U16("graphics/items/icon_palettes/catching_charm.gbapal"); -const u32 gItemIcon_ExpCharm[] = INCBIN_U32("graphics/items/icons/exp_charm.4bpp.lz"); +const u32 gItemIcon_ExpCharm[] = INCBIN_U32("graphics/items/icons/exp_charm.4bpp.smol"); const u16 gItemIconPalette_ExpCharm[] = INCBIN_U16("graphics/items/icon_palettes/exp_charm.gbapal"); -const u32 gItemIcon_GlimmeringCharm[] = INCBIN_U32("graphics/items/icons/glimmering_charm.4bpp.lz"); +const u32 gItemIcon_GlimmeringCharm[] = INCBIN_U32("graphics/items/icons/glimmering_charm.4bpp.smol"); const u16 gItemIconPalette_GlimmeringCharm[] = INCBIN_U16("graphics/items/icon_palettes/glimmering_charm.gbapal"); // Form-changing Key Items -const u32 gItemIcon_RotomCatalog[] = INCBIN_U32("graphics/items/icons/rotom_catalog.4bpp.lz"); +const u32 gItemIcon_RotomCatalog[] = INCBIN_U32("graphics/items/icons/rotom_catalog.4bpp.smol"); const u16 gItemIconPalette_RotomCatalog[] = INCBIN_U16("graphics/items/icon_palettes/rotom_catalog.gbapal"); -const u32 gItemIcon_Gracidea[] = INCBIN_U32("graphics/items/icons/gracidea.4bpp.lz"); +const u32 gItemIcon_Gracidea[] = INCBIN_U32("graphics/items/icons/gracidea.4bpp.smol"); const u16 gItemIconPalette_Gracidea[] = INCBIN_U16("graphics/items/icon_palettes/gracidea.gbapal"); -const u32 gItemIcon_RevealGlass[] = INCBIN_U32("graphics/items/icons/reveal_glass.4bpp.lz"); +const u32 gItemIcon_RevealGlass[] = INCBIN_U32("graphics/items/icons/reveal_glass.4bpp.smol"); const u16 gItemIconPalette_RevealGlass[] = INCBIN_U16("graphics/items/icon_palettes/reveal_glass.gbapal"); -const u32 gItemIcon_DNASplicers[] = INCBIN_U32("graphics/items/icons/dna_splicers.4bpp.lz"); +const u32 gItemIcon_DNASplicers[] = INCBIN_U32("graphics/items/icons/dna_splicers.4bpp.smol"); const u16 gItemIconPalette_DNASplicers[] = INCBIN_U16("graphics/items/icon_palettes/dna_splicers.gbapal"); -const u32 gItemIcon_ZygardeCube[] = INCBIN_U32("graphics/items/icons/zygarde_cube.4bpp.lz"); +const u32 gItemIcon_ZygardeCube[] = INCBIN_U32("graphics/items/icons/zygarde_cube.4bpp.smol"); const u16 gItemIconPalette_ZygardeCube[] = INCBIN_U16("graphics/items/icon_palettes/zygarde_cube.gbapal"); -const u32 gItemIcon_PrisonBottle[] = INCBIN_U32("graphics/items/icons/prison_bottle.4bpp.lz"); +const u32 gItemIcon_PrisonBottle[] = INCBIN_U32("graphics/items/icons/prison_bottle.4bpp.smol"); const u16 gItemIconPalette_PrisonBottle[] = INCBIN_U16("graphics/items/icon_palettes/prison_bottle.gbapal"); -const u32 gItemIcon_NecrozmaFuser[] = INCBIN_U32("graphics/items/icons/necrozma_fuser.4bpp.lz"); +const u32 gItemIcon_NecrozmaFuser[] = INCBIN_U32("graphics/items/icons/necrozma_fuser.4bpp.smol"); const u16 gItemIconPalette_NSolarizer[] = INCBIN_U16("graphics/items/icon_palettes/n_solarizer.gbapal"); const u16 gItemIconPalette_NLunarizer[] = INCBIN_U16("graphics/items/icon_palettes/n_lunarizer.gbapal"); -const u32 gItemIcon_ReinsOfUnity[] = INCBIN_U32("graphics/items/icons/reins_of_unity.4bpp.lz"); +const u32 gItemIcon_ReinsOfUnity[] = INCBIN_U32("graphics/items/icons/reins_of_unity.4bpp.smol"); const u16 gItemIconPalette_ReinsOfUnity[] = INCBIN_U16("graphics/items/icon_palettes/reins_of_unity.gbapal"); // Battle Mechanic Key Items -const u32 gItemIcon_MegaRing[] = INCBIN_U32("graphics/items/icons/mega_ring.4bpp.lz"); +const u32 gItemIcon_MegaRing[] = INCBIN_U32("graphics/items/icons/mega_ring.4bpp.smol"); const u16 gItemIconPalette_MegaRing[] = INCBIN_U16("graphics/items/icon_palettes/mega_ring.gbapal"); -const u32 gItemIcon_ZPowerRing[] = INCBIN_U32("graphics/items/icons/z_power_ring.4bpp.lz"); +const u32 gItemIcon_ZPowerRing[] = INCBIN_U32("graphics/items/icons/z_power_ring.4bpp.smol"); const u16 gItemIconPalette_ZPowerRing[] = INCBIN_U16("graphics/items/icon_palettes/z_power_ring.gbapal"); -const u32 gItemIcon_ZRing[] = INCBIN_U32("graphics/items/icons/z_ring.4bpp.lz"); // Remove +const u32 gItemIcon_ZRing[] = INCBIN_U32("graphics/items/icons/z_ring.4bpp.smol"); // Remove const u16 gItemIconPalette_ZRing[] = INCBIN_U16("graphics/items/icon_palettes/z_ring.gbapal"); // Remove -const u32 gItemIcon_DynamaxBand[] = INCBIN_U32("graphics/items/icons/dynamax_band.4bpp.lz"); +const u32 gItemIcon_DynamaxBand[] = INCBIN_U32("graphics/items/icons/dynamax_band.4bpp.smol"); const u16 gItemIconPalette_DynamaxBand[] = INCBIN_U16("graphics/items/icon_palettes/dynamax_band.gbapal"); // Misc. Key Items -const u32 gItemIcon_Bicycle[] = INCBIN_U32("graphics/items/icons/bicycle.4bpp.lz"); +const u32 gItemIcon_Bicycle[] = INCBIN_U32("graphics/items/icons/bicycle.4bpp.smol"); const u16 gItemIconPalette_Bicycle[] = INCBIN_U16("graphics/items/icon_palettes/bicycle.gbapal"); -const u32 gItemIcon_MachBike[] = INCBIN_U32("graphics/items/icons/mach_bike.4bpp.lz"); +const u32 gItemIcon_MachBike[] = INCBIN_U32("graphics/items/icons/mach_bike.4bpp.smol"); const u16 gItemIconPalette_MachBike[] = INCBIN_U16("graphics/items/icon_palettes/mach_bike.gbapal"); -const u32 gItemIcon_AcroBike[] = INCBIN_U32("graphics/items/icons/acro_bike.4bpp.lz"); +const u32 gItemIcon_AcroBike[] = INCBIN_U32("graphics/items/icons/acro_bike.4bpp.smol"); const u16 gItemIconPalette_AcroBike[] = INCBIN_U16("graphics/items/icon_palettes/acro_bike.gbapal"); -const u32 gItemIcon_OldRod[] = INCBIN_U32("graphics/items/icons/old_rod.4bpp.lz"); +const u32 gItemIcon_OldRod[] = INCBIN_U32("graphics/items/icons/old_rod.4bpp.smol"); const u16 gItemIconPalette_OldRod[] = INCBIN_U16("graphics/items/icon_palettes/old_rod.gbapal"); -const u32 gItemIcon_GoodRod[] = INCBIN_U32("graphics/items/icons/good_rod.4bpp.lz"); +const u32 gItemIcon_GoodRod[] = INCBIN_U32("graphics/items/icons/good_rod.4bpp.smol"); const u16 gItemIconPalette_GoodRod[] = INCBIN_U16("graphics/items/icon_palettes/good_rod.gbapal"); -const u32 gItemIcon_SuperRod[] = INCBIN_U32("graphics/items/icons/super_rod.4bpp.lz"); +const u32 gItemIcon_SuperRod[] = INCBIN_U32("graphics/items/icons/super_rod.4bpp.smol"); const u16 gItemIconPalette_SuperRod[] = INCBIN_U16("graphics/items/icon_palettes/super_rod.gbapal"); -const u32 gItemIcon_DowsingMachine[] = INCBIN_U32("graphics/items/icons/dowsing_machine.4bpp.lz"); +const u32 gItemIcon_DowsingMachine[] = INCBIN_U32("graphics/items/icons/dowsing_machine.4bpp.smol"); const u16 gItemIconPalette_DowsingMachine[] = INCBIN_U16("graphics/items/icon_palettes/dowsing_machine.gbapal"); -const u32 gItemIcon_TownMap[] = INCBIN_U32("graphics/items/icons/town_map.4bpp.lz"); +const u32 gItemIcon_TownMap[] = INCBIN_U32("graphics/items/icons/town_map.4bpp.smol"); const u16 gItemIconPalette_TownMap[] = INCBIN_U16("graphics/items/icon_palettes/town_map.gbapal"); -const u32 gItemIcon_VsSeeker[] = INCBIN_U32("graphics/items/icons/vs_seeker.4bpp.lz"); +const u32 gItemIcon_VsSeeker[] = INCBIN_U32("graphics/items/icons/vs_seeker.4bpp.smol"); const u16 gItemIconPalette_VsSeeker[] = INCBIN_U16("graphics/items/icon_palettes/vs_seeker.gbapal"); -const u32 gItemIcon_TMCase[] = INCBIN_U32("graphics/items/icons/tm_case.4bpp.lz"); +const u32 gItemIcon_TMCase[] = INCBIN_U32("graphics/items/icons/tm_case.4bpp.smol"); const u16 gItemIconPalette_TMCase[] = INCBIN_U16("graphics/items/icon_palettes/tm_case.gbapal"); -const u32 gItemIcon_BerryPouch[] = INCBIN_U32("graphics/items/icons/berry_pouch.4bpp.lz"); +const u32 gItemIcon_BerryPouch[] = INCBIN_U32("graphics/items/icons/berry_pouch.4bpp.smol"); const u16 gItemIconPalette_BerryPouch[] = INCBIN_U16("graphics/items/icon_palettes/berry_pouch.gbapal"); -const u32 gItemIcon_PokemonBoxLink[] = INCBIN_U32("graphics/items/icons/pokemon_box_link.4bpp.lz"); +const u32 gItemIcon_PokemonBoxLink[] = INCBIN_U32("graphics/items/icons/pokemon_box_link.4bpp.smol"); const u16 gItemIconPalette_PokemonBoxLink[] = INCBIN_U16("graphics/items/icon_palettes/pokemon_box_link.gbapal"); -const u32 gItemIcon_CoinCase[] = INCBIN_U32("graphics/items/icons/coin_case.4bpp.lz"); +const u32 gItemIcon_CoinCase[] = INCBIN_U32("graphics/items/icons/coin_case.4bpp.smol"); const u16 gItemIconPalette_CoinCase[] = INCBIN_U16("graphics/items/icon_palettes/coin_case.gbapal"); -const u32 gItemIcon_PowderJar[] = INCBIN_U32("graphics/items/icons/powder_jar.4bpp.lz"); +const u32 gItemIcon_PowderJar[] = INCBIN_U32("graphics/items/icons/powder_jar.4bpp.smol"); const u16 gItemIconPalette_PowderJar[] = INCBIN_U16("graphics/items/icon_palettes/powder_jar.gbapal"); -const u32 gItemIcon_WailmerPail[] = INCBIN_U32("graphics/items/icons/wailmer_pail.4bpp.lz"); +const u32 gItemIcon_WailmerPail[] = INCBIN_U32("graphics/items/icons/wailmer_pail.4bpp.smol"); const u16 gItemIconPalette_WailmerPail[] = INCBIN_U16("graphics/items/icon_palettes/wailmer_pail.gbapal"); -const u32 gItemIcon_PokeRadar[] = INCBIN_U32("graphics/items/icons/poke_radar.4bpp.lz"); +const u32 gItemIcon_PokeRadar[] = INCBIN_U32("graphics/items/icons/poke_radar.4bpp.smol"); const u16 gItemIconPalette_PokeRadar[] = INCBIN_U16("graphics/items/icon_palettes/poke_radar.gbapal"); -const u32 gItemIcon_PokeblockCase[] = INCBIN_U32("graphics/items/icons/pokeblock_case.4bpp.lz"); +const u32 gItemIcon_PokeblockCase[] = INCBIN_U32("graphics/items/icons/pokeblock_case.4bpp.smol"); const u16 gItemIconPalette_PokeblockCase[] = INCBIN_U16("graphics/items/icon_palettes/pokeblock_case.gbapal"); -const u32 gItemIcon_SootSack[] = INCBIN_U32("graphics/items/icons/soot_sack.4bpp.lz"); +const u32 gItemIcon_SootSack[] = INCBIN_U32("graphics/items/icons/soot_sack.4bpp.smol"); const u16 gItemIconPalette_SootSack[] = INCBIN_U16("graphics/items/icon_palettes/soot_sack.gbapal"); -const u32 gItemIcon_PokeFlute[] = INCBIN_U32("graphics/items/icons/poke_flute.4bpp.lz"); +const u32 gItemIcon_PokeFlute[] = INCBIN_U32("graphics/items/icons/poke_flute.4bpp.smol"); const u16 gItemIconPalette_PokeFlute[] = INCBIN_U16("graphics/items/icon_palettes/poke_flute.gbapal"); -const u32 gItemIcon_FameChecker[] = INCBIN_U32("graphics/items/icons/fame_checker.4bpp.lz"); +const u32 gItemIcon_FameChecker[] = INCBIN_U32("graphics/items/icons/fame_checker.4bpp.smol"); const u16 gItemIconPalette_FameChecker[] = INCBIN_U16("graphics/items/icon_palettes/fame_checker.gbapal"); -const u32 gItemIcon_TeachyTV[] = INCBIN_U32("graphics/items/icons/teachy_tv.4bpp.lz"); +const u32 gItemIcon_TeachyTV[] = INCBIN_U32("graphics/items/icons/teachy_tv.4bpp.smol"); const u16 gItemIconPalette_TeachyTV[] = INCBIN_U16("graphics/items/icon_palettes/teachy_tv.gbapal"); // Story Key Items -const u32 gItemIcon_SSTicket[] = INCBIN_U32("graphics/items/icons/ss_ticket.4bpp.lz"); +const u32 gItemIcon_SSTicket[] = INCBIN_U32("graphics/items/icons/ss_ticket.4bpp.smol"); const u16 gItemIconPalette_SSTicket[] = INCBIN_U16("graphics/items/icon_palettes/ss_ticket.gbapal"); -const u32 gItemIcon_EonTicket[] = INCBIN_U32("graphics/items/icons/eon_ticket.4bpp.lz"); +const u32 gItemIcon_EonTicket[] = INCBIN_U32("graphics/items/icons/eon_ticket.4bpp.smol"); const u16 gItemIconPalette_EonTicket[] = INCBIN_U16("graphics/items/icon_palettes/eon_ticket.gbapal"); -const u32 gItemIcon_MysticTicket[] = INCBIN_U32("graphics/items/icons/mystic_ticket.4bpp.lz"); +const u32 gItemIcon_MysticTicket[] = INCBIN_U32("graphics/items/icons/mystic_ticket.4bpp.smol"); const u16 gItemIconPalette_MysticTicket[] = INCBIN_U16("graphics/items/icon_palettes/mystic_ticket.gbapal"); -const u32 gItemIcon_AuroraTicket[] = INCBIN_U32("graphics/items/icons/aurora_ticket.4bpp.lz"); +const u32 gItemIcon_AuroraTicket[] = INCBIN_U32("graphics/items/icons/aurora_ticket.4bpp.smol"); const u16 gItemIconPalette_AuroraTicket[] = INCBIN_U16("graphics/items/icon_palettes/aurora_ticket.gbapal"); -const u32 gItemIcon_OldSeaMap[] = INCBIN_U32("graphics/items/icons/old_sea_map.4bpp.lz"); +const u32 gItemIcon_OldSeaMap[] = INCBIN_U32("graphics/items/icons/old_sea_map.4bpp.smol"); const u16 gItemIconPalette_OldSeaMap[] = INCBIN_U16("graphics/items/icon_palettes/old_sea_map.gbapal"); -const u32 gItemIcon_Letter[] = INCBIN_U32("graphics/items/icons/letter.4bpp.lz"); +const u32 gItemIcon_Letter[] = INCBIN_U32("graphics/items/icons/letter.4bpp.smol"); -const u32 gItemIcon_DevonParts[] = INCBIN_U32("graphics/items/icons/devon_parts.4bpp.lz"); +const u32 gItemIcon_DevonParts[] = INCBIN_U32("graphics/items/icons/devon_parts.4bpp.smol"); const u16 gItemIconPalette_DevonParts[] = INCBIN_U16("graphics/items/icon_palettes/devon_parts.gbapal"); -const u32 gItemIcon_GoGoggles[] = INCBIN_U32("graphics/items/icons/go_goggles.4bpp.lz"); +const u32 gItemIcon_GoGoggles[] = INCBIN_U32("graphics/items/icons/go_goggles.4bpp.smol"); const u16 gItemIconPalette_GoGoggles[] = INCBIN_U16("graphics/items/icon_palettes/go_goggles.gbapal"); -const u32 gItemIcon_DevonScope[] = INCBIN_U32("graphics/items/icons/devon_scope.4bpp.lz"); +const u32 gItemIcon_DevonScope[] = INCBIN_U32("graphics/items/icons/devon_scope.4bpp.smol"); const u16 gItemIconPalette_DevonScope[] = INCBIN_U16("graphics/items/icon_palettes/devon_scope.gbapal"); -const u32 gItemIcon_BasementKey[] = INCBIN_U32("graphics/items/icons/basement_key.4bpp.lz"); +const u32 gItemIcon_BasementKey[] = INCBIN_U32("graphics/items/icons/basement_key.4bpp.smol"); const u16 gItemIconPalette_OldKey[] = INCBIN_U16("graphics/items/icon_palettes/old_key.gbapal"); -const u32 gItemIcon_Scanner[] = INCBIN_U32("graphics/items/icons/scanner.4bpp.lz"); +const u32 gItemIcon_Scanner[] = INCBIN_U32("graphics/items/icons/scanner.4bpp.smol"); const u16 gItemIconPalette_Scanner[] = INCBIN_U16("graphics/items/icon_palettes/scanner.gbapal"); -const u32 gItemIcon_StorageKey[] = INCBIN_U32("graphics/items/icons/storage_key.4bpp.lz"); +const u32 gItemIcon_StorageKey[] = INCBIN_U32("graphics/items/icons/storage_key.4bpp.smol"); -const u32 gItemIcon_KeyToRoom1[] = INCBIN_U32("graphics/items/icons/key_to_room_1.4bpp.lz"); +const u32 gItemIcon_KeyToRoom1[] = INCBIN_U32("graphics/items/icons/key_to_room_1.4bpp.smol"); const u16 gItemIconPalette_Key[] = INCBIN_U16("graphics/items/icon_palettes/key.gbapal"); -const u32 gItemIcon_KeyToRoom2[] = INCBIN_U32("graphics/items/icons/key_to_room_2.4bpp.lz"); +const u32 gItemIcon_KeyToRoom2[] = INCBIN_U32("graphics/items/icons/key_to_room_2.4bpp.smol"); -const u32 gItemIcon_KeyToRoom4[] = INCBIN_U32("graphics/items/icons/key_to_room_4.4bpp.lz"); +const u32 gItemIcon_KeyToRoom4[] = INCBIN_U32("graphics/items/icons/key_to_room_4.4bpp.smol"); -const u32 gItemIcon_KeyToRoom6[] = INCBIN_U32("graphics/items/icons/key_to_room_6.4bpp.lz"); +const u32 gItemIcon_KeyToRoom6[] = INCBIN_U32("graphics/items/icons/key_to_room_6.4bpp.smol"); -const u32 gItemIcon_Meteorite[] = INCBIN_U32("graphics/items/icons/meteorite.4bpp.lz"); +const u32 gItemIcon_Meteorite[] = INCBIN_U32("graphics/items/icons/meteorite.4bpp.smol"); const u16 gItemIconPalette_Meteorite[] = INCBIN_U16("graphics/items/icon_palettes/meteorite.gbapal"); -const u32 gItemIcon_MagmaEmblem[] = INCBIN_U32("graphics/items/icons/magma_emblem.4bpp.lz"); +const u32 gItemIcon_MagmaEmblem[] = INCBIN_U32("graphics/items/icons/magma_emblem.4bpp.smol"); const u16 gItemIconPalette_MagmaEmblem[] = INCBIN_U16("graphics/items/icon_palettes/magma_emblem.gbapal"); -const u32 gItemIcon_ContestPass[] = INCBIN_U32("graphics/items/icons/contest_pass.4bpp.lz"); +const u32 gItemIcon_ContestPass[] = INCBIN_U32("graphics/items/icons/contest_pass.4bpp.smol"); const u16 gItemIconPalette_ContestPass[] = INCBIN_U16("graphics/items/icon_palettes/contest_pass.gbapal"); -const u32 gItemIcon_Parcel[] = INCBIN_U32("graphics/items/icons/parcel.4bpp.lz"); +const u32 gItemIcon_Parcel[] = INCBIN_U32("graphics/items/icons/parcel.4bpp.smol"); const u16 gItemIconPalette_Parcel[] = INCBIN_U16("graphics/items/icon_palettes/parcel.gbapal"); -const u32 gItemIcon_SecretKey[] = INCBIN_U32("graphics/items/icons/secret_key.4bpp.lz"); +const u32 gItemIcon_SecretKey[] = INCBIN_U32("graphics/items/icons/secret_key.4bpp.smol"); const u16 gItemIconPalette_SecretKey[] = INCBIN_U16("graphics/items/icon_palettes/secret_key.gbapal"); -const u32 gItemIcon_BikeVoucher[] = INCBIN_U32("graphics/items/icons/bike_voucher.4bpp.lz"); +const u32 gItemIcon_BikeVoucher[] = INCBIN_U32("graphics/items/icons/bike_voucher.4bpp.smol"); const u16 gItemIconPalette_BikeVoucher[] = INCBIN_U16("graphics/items/icon_palettes/bike_voucher.gbapal"); -const u32 gItemIcon_GoldTeeth[] = INCBIN_U32("graphics/items/icons/gold_teeth.4bpp.lz"); +const u32 gItemIcon_GoldTeeth[] = INCBIN_U32("graphics/items/icons/gold_teeth.4bpp.smol"); const u16 gItemIconPalette_GoldTeeth[] = INCBIN_U16("graphics/items/icon_palettes/gold_teeth.gbapal"); -const u32 gItemIcon_CardKey[] = INCBIN_U32("graphics/items/icons/card_key.4bpp.lz"); +const u32 gItemIcon_CardKey[] = INCBIN_U32("graphics/items/icons/card_key.4bpp.smol"); const u16 gItemIconPalette_CardKey[] = INCBIN_U16("graphics/items/icon_palettes/card_key.gbapal"); -const u32 gItemIcon_LiftKey[] = INCBIN_U32("graphics/items/icons/lift_key.4bpp.lz"); +const u32 gItemIcon_LiftKey[] = INCBIN_U32("graphics/items/icons/lift_key.4bpp.smol"); -const u32 gItemIcon_SilphScope[] = INCBIN_U32("graphics/items/icons/silph_scope.4bpp.lz"); +const u32 gItemIcon_SilphScope[] = INCBIN_U32("graphics/items/icons/silph_scope.4bpp.smol"); const u16 gItemIconPalette_SilphScope[] = INCBIN_U16("graphics/items/icon_palettes/silph_scope.gbapal"); -const u32 gItemIcon_TriPass[] = INCBIN_U32("graphics/items/icons/tri_pass.4bpp.lz"); +const u32 gItemIcon_TriPass[] = INCBIN_U32("graphics/items/icons/tri_pass.4bpp.smol"); const u16 gItemIconPalette_TriPass[] = INCBIN_U16("graphics/items/icon_palettes/tri_pass.gbapal"); -const u32 gItemIcon_RainbowPass[] = INCBIN_U32("graphics/items/icons/rainbow_pass.4bpp.lz"); +const u32 gItemIcon_RainbowPass[] = INCBIN_U32("graphics/items/icons/rainbow_pass.4bpp.smol"); const u16 gItemIconPalette_RainbowPass[] = INCBIN_U16("graphics/items/icon_palettes/rainbow_pass.gbapal"); -const u32 gItemIcon_Tea[] = INCBIN_U32("graphics/items/icons/tea.4bpp.lz"); +const u32 gItemIcon_Tea[] = INCBIN_U32("graphics/items/icons/tea.4bpp.smol"); const u16 gItemIconPalette_Tea[] = INCBIN_U16("graphics/items/icon_palettes/tea.gbapal"); -const u32 gItemIcon_Gem[] = INCBIN_U32("graphics/items/icons/gem.4bpp.lz"); +const u32 gItemIcon_Gem[] = INCBIN_U32("graphics/items/icons/gem.4bpp.smol"); const u16 gItemIconPalette_Ruby[] = INCBIN_U16("graphics/items/icon_palettes/ruby.gbapal"); const u16 gItemIconPalette_Sapphire[] = INCBIN_U16("graphics/items/icon_palettes/sapphire.gbapal"); -const u32 gItemIcon_AbilityShield[] = INCBIN_U32("graphics/items/icons/ability_shield.4bpp.lz"); +const u32 gItemIcon_AbilityShield[] = INCBIN_U32("graphics/items/icons/ability_shield.4bpp.smol"); const u16 gItemIconPalette_AbilityShield[] = INCBIN_U16("graphics/items/icon_palettes/ability_shield.gbapal"); -const u32 gItemIcon_ClearAmulet[] = INCBIN_U32("graphics/items/icons/clear_amulet.4bpp.lz"); +const u32 gItemIcon_ClearAmulet[] = INCBIN_U32("graphics/items/icons/clear_amulet.4bpp.smol"); const u16 gItemIconPalette_ClearAmulet[] = INCBIN_U16("graphics/items/icon_palettes/clear_amulet.gbapal"); -const u32 gItemIcon_PunchingGlove[] = INCBIN_U32("graphics/items/icons/punching_glove.4bpp.lz"); +const u32 gItemIcon_PunchingGlove[] = INCBIN_U32("graphics/items/icons/punching_glove.4bpp.smol"); const u16 gItemIconPalette_PunchingGlove[] = INCBIN_U16("graphics/items/icon_palettes/punching_glove.gbapal"); -const u32 gItemIcon_CovertCloak[] = INCBIN_U32("graphics/items/icons/covert_cloak.4bpp.lz"); +const u32 gItemIcon_CovertCloak[] = INCBIN_U32("graphics/items/icons/covert_cloak.4bpp.smol"); const u16 gItemIconPalette_CovertCloak[] = INCBIN_U16("graphics/items/icon_palettes/covert_cloak.gbapal"); -const u32 gItemIcon_LoadedDice[] = INCBIN_U32("graphics/items/icons/loaded_dice.4bpp.lz"); +const u32 gItemIcon_LoadedDice[] = INCBIN_U32("graphics/items/icons/loaded_dice.4bpp.smol"); const u16 gItemIconPalette_LoadedDice[] = INCBIN_U16("graphics/items/icon_palettes/loaded_dice.gbapal"); -const u32 gItemIcon_AuspiciousArmor[] = INCBIN_U32("graphics/items/icons/auspicious_armor.4bpp.lz"); +const u32 gItemIcon_AuspiciousArmor[] = INCBIN_U32("graphics/items/icons/auspicious_armor.4bpp.smol"); const u16 gItemIconPalette_AuspiciousArmor[] = INCBIN_U16("graphics/items/icon_palettes/auspicious_armor.gbapal"); -const u32 gItemIcon_BigBambooShoot[] = INCBIN_U32("graphics/items/icons/big_bamboo_shoot.4bpp.lz"); +const u32 gItemIcon_BigBambooShoot[] = INCBIN_U32("graphics/items/icons/big_bamboo_shoot.4bpp.smol"); const u16 gItemIconPalette_BigBambooShoot[] = INCBIN_U16("graphics/items/icon_palettes/big_bamboo_shoot.gbapal"); -const u32 gItemIcon_BoosterEnergy[] = INCBIN_U32("graphics/items/icons/booster_energy.4bpp.lz"); +const u32 gItemIcon_BoosterEnergy[] = INCBIN_U32("graphics/items/icons/booster_energy.4bpp.smol"); const u16 gItemIconPalette_BoosterEnergy[] = INCBIN_U16("graphics/items/icon_palettes/booster_energy.gbapal"); -const u32 gItemIcon_GimmighoulCoin[] = INCBIN_U32("graphics/items/icons/gimmighoul_coin.4bpp.lz"); +const u32 gItemIcon_GimmighoulCoin[] = INCBIN_U32("graphics/items/icons/gimmighoul_coin.4bpp.smol"); const u16 gItemIconPalette_GimmighoulCoin[] = INCBIN_U16("graphics/items/icon_palettes/gimmighoul_coin.gbapal"); -const u32 gItemIcon_LeadersCrest[] = INCBIN_U32("graphics/items/icons/leaders_crest.4bpp.lz"); +const u32 gItemIcon_LeadersCrest[] = INCBIN_U32("graphics/items/icons/leaders_crest.4bpp.smol"); const u16 gItemIconPalette_LeadersCrest[] = INCBIN_U16("graphics/items/icon_palettes/leaders_crest.gbapal"); -const u32 gItemIcon_MaliciousArmor[] = INCBIN_U32("graphics/items/icons/malicious_armor.4bpp.lz"); +const u32 gItemIcon_MaliciousArmor[] = INCBIN_U32("graphics/items/icons/malicious_armor.4bpp.smol"); const u16 gItemIconPalette_MaliciousArmor[] = INCBIN_U16("graphics/items/icon_palettes/malicious_armor.gbapal"); -const u32 gItemIcon_MirrorHerb[] = INCBIN_U32("graphics/items/icons/mirror_herb.4bpp.lz"); +const u32 gItemIcon_MirrorHerb[] = INCBIN_U32("graphics/items/icons/mirror_herb.4bpp.smol"); const u16 gItemIconPalette_MirrorHerb[] = INCBIN_U16("graphics/items/icon_palettes/mirror_herb.gbapal"); -const u32 gItemIcon_ScrollOfDarkness[] = INCBIN_U32("graphics/items/icons/scroll_of_darkness.4bpp.lz"); +const u32 gItemIcon_ScrollOfDarkness[] = INCBIN_U32("graphics/items/icons/scroll_of_darkness.4bpp.smol"); const u16 gItemIconPalette_ScrollOfDarkness[] = INCBIN_U16("graphics/items/icon_palettes/scroll_of_darkness.gbapal"); -const u32 gItemIcon_ScrollOfWaters[] = INCBIN_U32("graphics/items/icons/scroll_of_waters.4bpp.lz"); +const u32 gItemIcon_ScrollOfWaters[] = INCBIN_U32("graphics/items/icons/scroll_of_waters.4bpp.smol"); const u16 gItemIconPalette_ScrollOfWaters[] = INCBIN_U16("graphics/items/icon_palettes/scroll_of_waters.gbapal"); -const u32 gItemIcon_TeraOrb[] = INCBIN_U32("graphics/items/icons/tera_orb.4bpp.lz"); +const u32 gItemIcon_TeraOrb[] = INCBIN_U32("graphics/items/icons/tera_orb.4bpp.smol"); const u16 gItemIconPalette_TeraOrb[] = INCBIN_U16("graphics/items/icon_palettes/tera_orb.gbapal"); -const u32 gItemIcon_TinyBambooShoot[] = INCBIN_U32("graphics/items/icons/tiny_bamboo_shoot.4bpp.lz"); +const u32 gItemIcon_TinyBambooShoot[] = INCBIN_U32("graphics/items/icons/tiny_bamboo_shoot.4bpp.smol"); const u16 gItemIconPalette_TinyBambooShoot[] = INCBIN_U16("graphics/items/icon_palettes/tiny_bamboo_shoot.gbapal"); // Tera Shards -const u32 gItemIcon_TeraShard[] = INCBIN_U32("graphics/items/icons/tera_shard.4bpp.lz"); +const u32 gItemIcon_TeraShard[] = INCBIN_U32("graphics/items/icons/tera_shard.4bpp.smol"); const u16 gItemIconPalette_NormalTeraShard[] = INCBIN_U16("graphics/items/icon_palettes/normal_tera_shard.gbapal"); const u16 gItemIconPalette_FireTeraShard[] = INCBIN_U16("graphics/items/icon_palettes/fire_tera_shard.gbapal"); const u16 gItemIconPalette_WaterTeraShard[] = INCBIN_U16("graphics/items/icon_palettes/water_tera_shard.gbapal"); @@ -2028,12 +2028,12 @@ const u16 gItemIconPalette_DragonTeraShard[] = INCBIN_U16("graphics/items/icon_p const u16 gItemIconPalette_SteelTeraShard[] = INCBIN_U16("graphics/items/icon_palettes/steel_tera_shard.gbapal"); const u16 gItemIconPalette_FairyTeraShard[] = INCBIN_U16("graphics/items/icon_palettes/fairy_tera_shard.gbapal"); -const u32 gItemIcon_StellarTeraShard[] = INCBIN_U32("graphics/items/icons/stellar_tera_shard.4bpp.lz"); +const u32 gItemIcon_StellarTeraShard[] = INCBIN_U32("graphics/items/icons/stellar_tera_shard.4bpp.smol"); const u16 gItemIconPalette_StellarTeraShard[] = INCBIN_U16("graphics/items/icon_palettes/stellar_tera_shard.gbapal"); // Mochi -const u32 gItemIcon_Mochi[] = INCBIN_U32("graphics/items/icons/mochi.4bpp.lz"); +const u32 gItemIcon_Mochi[] = INCBIN_U32("graphics/items/icons/mochi.4bpp.smol"); const u16 gItemIconPalette_HealthMochi[] = INCBIN_U16("graphics/items/icon_palettes/health_mochi.gbapal"); const u16 gItemIconPalette_MuscleMochi[] = INCBIN_U16("graphics/items/icon_palettes/muscle_mochi.gbapal"); const u16 gItemIconPalette_ResistMochi[] = INCBIN_U16("graphics/items/icon_palettes/resist_mochi.gbapal"); @@ -2044,58 +2044,58 @@ const u16 gItemIconPalette_FreshStartMochi[] = INCBIN_U16("graphics/items/icon_p // Ogerpon masks -const u32 gItemIcon_WellspringMask[] = INCBIN_U32("graphics/items/icons/wellspring_mask.4bpp.lz"); +const u32 gItemIcon_WellspringMask[] = INCBIN_U32("graphics/items/icons/wellspring_mask.4bpp.smol"); const u16 gItemIconPalette_WellspringMask[] = INCBIN_U16("graphics/items/icon_palettes/wellspring_mask.gbapal"); -const u32 gItemIcon_HearthflameMask[] = INCBIN_U32("graphics/items/icons/hearthflame_mask.4bpp.lz"); +const u32 gItemIcon_HearthflameMask[] = INCBIN_U32("graphics/items/icons/hearthflame_mask.4bpp.smol"); const u16 gItemIconPalette_HearthflameMask[] = INCBIN_U16("graphics/items/icon_palettes/hearthflame_mask.gbapal"); -const u32 gItemIcon_CornerstoneMask[] = INCBIN_U32("graphics/items/icons/cornerstone_mask.4bpp.lz"); +const u32 gItemIcon_CornerstoneMask[] = INCBIN_U32("graphics/items/icons/cornerstone_mask.4bpp.smol"); const u16 gItemIconPalette_CornerstoneMask[] = INCBIN_U16("graphics/items/icon_palettes/cornerstone_mask.gbapal"); // Misc. Items -const u32 gItemIcon_AdamantCrystal[] = INCBIN_U32("graphics/items/icons/adamant_crystal.4bpp.lz"); +const u32 gItemIcon_AdamantCrystal[] = INCBIN_U32("graphics/items/icons/adamant_crystal.4bpp.smol"); const u16 gItemIconPalette_AdamantCrystal[] = INCBIN_U16("graphics/items/icon_palettes/adamant_crystal.gbapal"); -const u32 gItemIcon_GriseousCore[] = INCBIN_U32("graphics/items/icons/griseous_core.4bpp.lz"); +const u32 gItemIcon_GriseousCore[] = INCBIN_U32("graphics/items/icons/griseous_core.4bpp.smol"); const u16 gItemIconPalette_GriseousCore[] = INCBIN_U16("graphics/items/icon_palettes/griseous_core.gbapal"); -const u32 gItemIcon_LustrousGlobe[] = INCBIN_U32("graphics/items/icons/lustrous_globe.4bpp.lz"); +const u32 gItemIcon_LustrousGlobe[] = INCBIN_U32("graphics/items/icons/lustrous_globe.4bpp.smol"); const u16 gItemIconPalette_LustrousGlobe[] = INCBIN_U16("graphics/items/icon_palettes/lustrous_globe.gbapal"); -const u32 gItemIcon_BerserkGene[] = INCBIN_U32("graphics/items/icons/berserk_gene.4bpp.lz"); +const u32 gItemIcon_BerserkGene[] = INCBIN_U32("graphics/items/icons/berserk_gene.4bpp.smol"); const u16 gItemIconPalette_BerserkGene[] = INCBIN_U16("graphics/items/icon_palettes/berserk_gene.gbapal"); -const u32 gItemIcon_FairyFeather[] = INCBIN_U32("graphics/items/icons/fairy_feather.4bpp.lz"); +const u32 gItemIcon_FairyFeather[] = INCBIN_U32("graphics/items/icons/fairy_feather.4bpp.smol"); const u16 gItemIconPalette_FairyFeather[] = INCBIN_U16("graphics/items/icon_palettes/fairy_feather.gbapal"); -const u32 gItemIcon_Remedy[] = INCBIN_U32("graphics/items/icons/remedy.4bpp.lz"); +const u32 gItemIcon_Remedy[] = INCBIN_U32("graphics/items/icons/remedy.4bpp.smol"); const u16 gItemIconPalette_Remedy[] = INCBIN_U16("graphics/items/icon_palettes/remedy.gbapal"); -const u32 gItemIcon_FineRemedy[] = INCBIN_U32("graphics/items/icons/fine_remedy.4bpp.lz"); +const u32 gItemIcon_FineRemedy[] = INCBIN_U32("graphics/items/icons/fine_remedy.4bpp.smol"); const u16 gItemIconPalette_FineRemedy[] = INCBIN_U16("graphics/items/icon_palettes/fine_remedy.gbapal"); -const u32 gItemIcon_SuperbRemedy[] = INCBIN_U32("graphics/items/icons/superb_remedy.4bpp.lz"); +const u32 gItemIcon_SuperbRemedy[] = INCBIN_U32("graphics/items/icons/superb_remedy.4bpp.smol"); const u16 gItemIconPalette_SuperbRemedy[] = INCBIN_U16("graphics/items/icon_palettes/superb_remedy.gbapal"); -const u32 gItemIcon_AuxBottle[] = INCBIN_U32("graphics/items/icons/aux_bottle.4bpp.lz"); +const u32 gItemIcon_AuxBottle[] = INCBIN_U32("graphics/items/icons/aux_bottle.4bpp.smol"); const u16 gItemIconPalette_AuxEvasion[] = INCBIN_U16("graphics/items/icon_palettes/aux_evasion.gbapal"); const u16 gItemIconPalette_AuxGuard[] = INCBIN_U16("graphics/items/icon_palettes/aux_guard.gbapal"); const u16 gItemIconPalette_AuxPower[] = INCBIN_U16("graphics/items/icon_palettes/aux_power.gbapal"); -const u32 gItemIcon_AuxPowerguard[] = INCBIN_U32("graphics/items/icons/aux_powerguard.4bpp.lz"); +const u32 gItemIcon_AuxPowerguard[] = INCBIN_U32("graphics/items/icons/aux_powerguard.4bpp.smol"); const u16 gItemIconPalette_AuxPowerguard[] = INCBIN_U16("graphics/items/icon_palettes/aux_powerguard.gbapal"); -const u32 gItemIcon_ChoiceDumpling[] = INCBIN_U32("graphics/items/icons/choice_dumpling.4bpp.lz"); +const u32 gItemIcon_ChoiceDumpling[] = INCBIN_U32("graphics/items/icons/choice_dumpling.4bpp.smol"); const u16 gItemIconPalette_ChoiceDumpling[] = INCBIN_U16("graphics/items/icon_palettes/choice_dumpling.gbapal"); -const u32 gItemIcon_JubilifeMuffin[] = INCBIN_U32("graphics/items/icons/jubilife_muffin.4bpp.lz"); +const u32 gItemIcon_JubilifeMuffin[] = INCBIN_U32("graphics/items/icons/jubilife_muffin.4bpp.smol"); const u16 gItemIconPalette_JubilifeMuffin[] = INCBIN_U16("graphics/items/icon_palettes/jubilife_muffin.gbapal"); -const u32 gItemIcon_PokeshiDoll[] = INCBIN_U32("graphics/items/icons/pokeshi_doll.4bpp.lz"); +const u32 gItemIcon_PokeshiDoll[] = INCBIN_U32("graphics/items/icons/pokeshi_doll.4bpp.smol"); const u16 gItemIconPalette_PokeshiDoll[] = INCBIN_U16("graphics/items/icon_palettes/pokeshi_doll.gbapal"); -const u32 gItemIcon_SwapSnack[] = INCBIN_U32("graphics/items/icons/swap_snack.4bpp.lz"); +const u32 gItemIcon_SwapSnack[] = INCBIN_U32("graphics/items/icons/swap_snack.4bpp.smol"); const u16 gItemIconPalette_SwapSnack[] = INCBIN_U16("graphics/items/icon_palettes/swap_snack.gbapal"); -const u32 gItemIcon_TwiceSpicedRadish[] = INCBIN_U32("graphics/items/icons/twice_spiced_radish.4bpp.lz"); +const u32 gItemIcon_TwiceSpicedRadish[] = INCBIN_U32("graphics/items/icons/twice_spiced_radish.4bpp.smol"); const u16 gItemIconPalette_TwiceSpicedRadish[] = INCBIN_U16("graphics/items/icon_palettes/twice_spiced_radish.gbapal"); diff --git a/src/data/graphics/mail.h b/src/data/graphics/mail.h index 05e65be1c1da..21e5af4fa245 100644 --- a/src/data/graphics/mail.h +++ b/src/data/graphics/mail.h @@ -11,28 +11,28 @@ const u16 gMailPalette_Dream[] = INCBIN_U16("graphics/mail/dream/palette.gbapal" const u16 gMailPalette_Fab[] = INCBIN_U16("graphics/mail/fab/palette.gbapal"); const u16 gMailPalette_Retro[] = INCBIN_U16("graphics/mail/retro/palette.gbapal"); -const u32 gMailTiles_Orange[] = INCBIN_U32("graphics/mail/orange/tiles.4bpp.lz"); -const u32 gMailTiles_Harbor[] = INCBIN_U32("graphics/mail/harbor/tiles.4bpp.lz"); -const u32 gMailTiles_Glitter[] = INCBIN_U32("graphics/mail/glitter/tiles.4bpp.lz"); -const u32 gMailTiles_Mech[] = INCBIN_U32("graphics/mail/mech/tiles.4bpp.lz"); -const u32 gMailTiles_Wood[] = INCBIN_U32("graphics/mail/wood/tiles.4bpp.lz"); -const u32 gMailTiles_Wave[] = INCBIN_U32("graphics/mail/wave/tiles.4bpp.lz"); -const u32 gMailTiles_Bead[] = INCBIN_U32("graphics/mail/bead/tiles.4bpp.lz"); -const u32 gMailTiles_Shadow[] = INCBIN_U32("graphics/mail/shadow/tiles.4bpp.lz"); -const u32 gMailTiles_Tropic[] = INCBIN_U32("graphics/mail/tropic/tiles.4bpp.lz"); -const u32 gMailTiles_Dream[] = INCBIN_U32("graphics/mail/dream/tiles.4bpp.lz"); -const u32 gMailTiles_Fab[] = INCBIN_U32("graphics/mail/fab/tiles.4bpp.lz"); -const u32 gMailTiles_Retro[] = INCBIN_U32("graphics/mail/retro/tiles.4bpp.lz"); +const u32 gMailTiles_Orange[] = INCBIN_U32("graphics/mail/orange/tiles.4bpp.smol"); +const u32 gMailTiles_Harbor[] = INCBIN_U32("graphics/mail/harbor/tiles.4bpp.smol"); +const u32 gMailTiles_Glitter[] = INCBIN_U32("graphics/mail/glitter/tiles.4bpp.smol"); +const u32 gMailTiles_Mech[] = INCBIN_U32("graphics/mail/mech/tiles.4bpp.smol"); +const u32 gMailTiles_Wood[] = INCBIN_U32("graphics/mail/wood/tiles.4bpp.smol"); +const u32 gMailTiles_Wave[] = INCBIN_U32("graphics/mail/wave/tiles.4bpp.smol"); +const u32 gMailTiles_Bead[] = INCBIN_U32("graphics/mail/bead/tiles.4bpp.smol"); +const u32 gMailTiles_Shadow[] = INCBIN_U32("graphics/mail/shadow/tiles.4bpp.smol"); +const u32 gMailTiles_Tropic[] = INCBIN_U32("graphics/mail/tropic/tiles.4bpp.smol"); +const u32 gMailTiles_Dream[] = INCBIN_U32("graphics/mail/dream/tiles.4bpp.smol"); +const u32 gMailTiles_Fab[] = INCBIN_U32("graphics/mail/fab/tiles.4bpp.smol"); +const u32 gMailTiles_Retro[] = INCBIN_U32("graphics/mail/retro/tiles.4bpp.smol"); -const u32 gMailTilemap_Orange[] = INCBIN_U32("graphics/mail/orange/map.bin.lz"); -const u32 gMailTilemap_Harbor[] = INCBIN_U32("graphics/mail/harbor/map.bin.lz"); -const u32 gMailTilemap_Glitter[] = INCBIN_U32("graphics/mail/glitter/map.bin.lz"); -const u32 gMailTilemap_Mech[] = INCBIN_U32("graphics/mail/mech/map.bin.lz"); -const u32 gMailTilemap_Wood[] = INCBIN_U32("graphics/mail/wood/map.bin.lz"); -const u32 gMailTilemap_Wave[] = INCBIN_U32("graphics/mail/wave/map.bin.lz"); -const u32 gMailTilemap_Bead[] = INCBIN_U32("graphics/mail/bead/map.bin.lz"); -const u32 gMailTilemap_Shadow[] = INCBIN_U32("graphics/mail/shadow/map.bin.lz"); -const u32 gMailTilemap_Tropic[] = INCBIN_U32("graphics/mail/tropic/map.bin.lz"); -const u32 gMailTilemap_Dream[] = INCBIN_U32("graphics/mail/dream/map.bin.lz"); -const u32 gMailTilemap_Fab[] = INCBIN_U32("graphics/mail/fab/map.bin.lz"); -const u32 gMailTilemap_Retro[] = INCBIN_U32("graphics/mail/retro/map.bin.lz"); +const u32 gMailTilemap_Orange[] = INCBIN_U32("graphics/mail/orange/map.bin.smolTM"); +const u32 gMailTilemap_Harbor[] = INCBIN_U32("graphics/mail/harbor/map.bin.smolTM"); +const u32 gMailTilemap_Glitter[] = INCBIN_U32("graphics/mail/glitter/map.bin.smolTM"); +const u32 gMailTilemap_Mech[] = INCBIN_U32("graphics/mail/mech/map.bin.smolTM"); +const u32 gMailTilemap_Wood[] = INCBIN_U32("graphics/mail/wood/map.bin.smolTM"); +const u32 gMailTilemap_Wave[] = INCBIN_U32("graphics/mail/wave/map.bin.smolTM"); +const u32 gMailTilemap_Bead[] = INCBIN_U32("graphics/mail/bead/map.bin.smolTM"); +const u32 gMailTilemap_Shadow[] = INCBIN_U32("graphics/mail/shadow/map.bin.smolTM"); +const u32 gMailTilemap_Tropic[] = INCBIN_U32("graphics/mail/tropic/map.bin.smolTM"); +const u32 gMailTilemap_Dream[] = INCBIN_U32("graphics/mail/dream/map.bin.smolTM"); +const u32 gMailTilemap_Fab[] = INCBIN_U32("graphics/mail/fab/map.bin.smolTM"); +const u32 gMailTilemap_Retro[] = INCBIN_U32("graphics/mail/retro/map.bin.smolTM"); diff --git a/src/data/graphics/pokeballs.h b/src/data/graphics/pokeballs.h index 8ea57defe5b5..07b04131bcef 100644 --- a/src/data/graphics/pokeballs.h +++ b/src/data/graphics/pokeballs.h @@ -1,85 +1,85 @@ -const u32 gBallGfx_Strange[] = INCBIN_U32("graphics/balls/strange.4bpp.lz"); +const u32 gBallGfx_Strange[] = INCBIN_U32("graphics/balls/strange.4bpp.smol"); const u16 gBallPal_Strange[] = INCBIN_U16("graphics/balls/strange.gbapal"); -const u32 gBallGfx_Poke[] = INCBIN_U32("graphics/balls/poke.4bpp.lz"); +const u32 gBallGfx_Poke[] = INCBIN_U32("graphics/balls/poke.4bpp.smol"); const u16 gBallPal_Poke[] = INCBIN_U16("graphics/balls/poke.gbapal"); -const u32 gBallGfx_Great[] = INCBIN_U32("graphics/balls/great.4bpp.lz"); +const u32 gBallGfx_Great[] = INCBIN_U32("graphics/balls/great.4bpp.smol"); const u16 gBallPal_Great[] = INCBIN_U16("graphics/balls/great.gbapal"); -const u32 gBallGfx_Ultra[] = INCBIN_U32("graphics/balls/ultra.4bpp.lz"); +const u32 gBallGfx_Ultra[] = INCBIN_U32("graphics/balls/ultra.4bpp.smol"); const u16 gBallPal_Ultra[] = INCBIN_U16("graphics/balls/ultra.gbapal"); -const u32 gBallGfx_Master[] = INCBIN_U32("graphics/balls/master.4bpp.lz"); +const u32 gBallGfx_Master[] = INCBIN_U32("graphics/balls/master.4bpp.smol"); const u16 gBallPal_Master[] = INCBIN_U16("graphics/balls/master.gbapal"); -const u32 gBallGfx_Premier[] = INCBIN_U32("graphics/balls/premier.4bpp.lz"); +const u32 gBallGfx_Premier[] = INCBIN_U32("graphics/balls/premier.4bpp.smol"); const u16 gBallPal_Premier[] = INCBIN_U16("graphics/balls/premier.gbapal"); -const u32 gBallGfx_Heal[] = INCBIN_U32("graphics/balls/heal.4bpp.lz"); +const u32 gBallGfx_Heal[] = INCBIN_U32("graphics/balls/heal.4bpp.smol"); const u16 gBallPal_Heal[] = INCBIN_U16("graphics/balls/heal.gbapal"); -const u32 gBallGfx_Net[] = INCBIN_U32("graphics/balls/net.4bpp.lz"); +const u32 gBallGfx_Net[] = INCBIN_U32("graphics/balls/net.4bpp.smol"); const u16 gBallPal_Net[] = INCBIN_U16("graphics/balls/net.gbapal"); -const u32 gBallGfx_Nest[] = INCBIN_U32("graphics/balls/nest.4bpp.lz"); +const u32 gBallGfx_Nest[] = INCBIN_U32("graphics/balls/nest.4bpp.smol"); const u16 gBallPal_Nest[] = INCBIN_U16("graphics/balls/nest.gbapal"); -const u32 gBallGfx_Dive[] = INCBIN_U32("graphics/balls/dive.4bpp.lz"); +const u32 gBallGfx_Dive[] = INCBIN_U32("graphics/balls/dive.4bpp.smol"); const u16 gBallPal_Dive[] = INCBIN_U16("graphics/balls/dive.gbapal"); -const u32 gBallGfx_Dusk[] = INCBIN_U32("graphics/balls/dusk.4bpp.lz"); +const u32 gBallGfx_Dusk[] = INCBIN_U32("graphics/balls/dusk.4bpp.smol"); const u16 gBallPal_Dusk[] = INCBIN_U16("graphics/balls/dusk.gbapal"); -const u32 gBallGfx_Timer[] = INCBIN_U32("graphics/balls/timer.4bpp.lz"); +const u32 gBallGfx_Timer[] = INCBIN_U32("graphics/balls/timer.4bpp.smol"); const u16 gBallPal_Timer[] = INCBIN_U16("graphics/balls/timer.gbapal"); -const u32 gBallGfx_Quick[] = INCBIN_U32("graphics/balls/quick.4bpp.lz"); +const u32 gBallGfx_Quick[] = INCBIN_U32("graphics/balls/quick.4bpp.smol"); const u16 gBallPal_Quick[] = INCBIN_U16("graphics/balls/quick.gbapal"); -const u32 gBallGfx_Repeat[] = INCBIN_U32("graphics/balls/repeat.4bpp.lz"); +const u32 gBallGfx_Repeat[] = INCBIN_U32("graphics/balls/repeat.4bpp.smol"); const u16 gBallPal_Repeat[] = INCBIN_U16("graphics/balls/repeat.gbapal"); -const u32 gBallGfx_Luxury[] = INCBIN_U32("graphics/balls/luxury.4bpp.lz"); +const u32 gBallGfx_Luxury[] = INCBIN_U32("graphics/balls/luxury.4bpp.smol"); const u16 gBallPal_Luxury[] = INCBIN_U16("graphics/balls/luxury.gbapal"); -const u32 gBallGfx_Level[] = INCBIN_U32("graphics/balls/level.4bpp.lz"); +const u32 gBallGfx_Level[] = INCBIN_U32("graphics/balls/level.4bpp.smol"); const u16 gBallPal_Level[] = INCBIN_U16("graphics/balls/level.gbapal"); -const u32 gBallGfx_Lure[] = INCBIN_U32("graphics/balls/lure.4bpp.lz"); +const u32 gBallGfx_Lure[] = INCBIN_U32("graphics/balls/lure.4bpp.smol"); const u16 gBallPal_Lure[] = INCBIN_U16("graphics/balls/lure.gbapal"); -const u32 gBallGfx_Moon[] = INCBIN_U32("graphics/balls/moon.4bpp.lz"); +const u32 gBallGfx_Moon[] = INCBIN_U32("graphics/balls/moon.4bpp.smol"); const u16 gBallPal_Moon[] = INCBIN_U16("graphics/balls/moon.gbapal"); -const u32 gBallGfx_Friend[] = INCBIN_U32("graphics/balls/friend.4bpp.lz"); +const u32 gBallGfx_Friend[] = INCBIN_U32("graphics/balls/friend.4bpp.smol"); const u16 gBallPal_Friend[] = INCBIN_U16("graphics/balls/friend.gbapal"); -const u32 gBallGfx_Love[] = INCBIN_U32("graphics/balls/love.4bpp.lz"); +const u32 gBallGfx_Love[] = INCBIN_U32("graphics/balls/love.4bpp.smol"); const u16 gBallPal_Love[] = INCBIN_U16("graphics/balls/love.gbapal"); -const u32 gBallGfx_Fast[] = INCBIN_U32("graphics/balls/fast.4bpp.lz"); +const u32 gBallGfx_Fast[] = INCBIN_U32("graphics/balls/fast.4bpp.smol"); const u16 gBallPal_Fast[] = INCBIN_U16("graphics/balls/fast.gbapal"); -const u32 gBallGfx_Heavy[] = INCBIN_U32("graphics/balls/heavy.4bpp.lz"); +const u32 gBallGfx_Heavy[] = INCBIN_U32("graphics/balls/heavy.4bpp.smol"); const u16 gBallPal_Heavy[] = INCBIN_U16("graphics/balls/heavy.gbapal"); -const u32 gBallGfx_Dream[] = INCBIN_U32("graphics/balls/dream.4bpp.lz"); +const u32 gBallGfx_Dream[] = INCBIN_U32("graphics/balls/dream.4bpp.smol"); const u16 gBallPal_Dream[] = INCBIN_U16("graphics/balls/dream.gbapal"); -const u32 gBallGfx_Safari[] = INCBIN_U32("graphics/balls/safari.4bpp.lz"); +const u32 gBallGfx_Safari[] = INCBIN_U32("graphics/balls/safari.4bpp.smol"); const u16 gBallPal_Safari[] = INCBIN_U16("graphics/balls/safari.gbapal"); -const u32 gBallGfx_Sport[] = INCBIN_U32("graphics/balls/sport.4bpp.lz"); +const u32 gBallGfx_Sport[] = INCBIN_U32("graphics/balls/sport.4bpp.smol"); const u16 gBallPal_Sport[] = INCBIN_U16("graphics/balls/sport.gbapal"); -const u32 gBallGfx_Park[] = INCBIN_U32("graphics/balls/park.4bpp.lz"); +const u32 gBallGfx_Park[] = INCBIN_U32("graphics/balls/park.4bpp.smol"); const u16 gBallPal_Park[] = INCBIN_U16("graphics/balls/park.gbapal"); -const u32 gBallGfx_Beast[] = INCBIN_U32("graphics/balls/beast.4bpp.lz"); +const u32 gBallGfx_Beast[] = INCBIN_U32("graphics/balls/beast.4bpp.smol"); const u16 gBallPal_Beast[] = INCBIN_U16("graphics/balls/beast.gbapal"); -const u32 gBallGfx_Cherish[] = INCBIN_U32("graphics/balls/cherish.4bpp.lz"); +const u32 gBallGfx_Cherish[] = INCBIN_U32("graphics/balls/cherish.4bpp.smol"); const u16 gBallPal_Cherish[] = INCBIN_U16("graphics/balls/cherish.gbapal"); -const u32 gOpenPokeballGfx[] = INCBIN_U32("graphics/balls/open.4bpp.lz"); +const u32 gOpenPokeballGfx[] = INCBIN_U32("graphics/balls/open.4bpp.smol"); diff --git a/src/data/graphics/pokemon.h b/src/data/graphics/pokemon.h index c04b9147363d..5ac450114fbf 100644 --- a/src/data/graphics/pokemon.h +++ b/src/data/graphics/pokemon.h @@ -4,8 +4,8 @@ #define INCBIN_COMP INCBIN_U32 #endif -const u32 gMonFrontPic_CircledQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/circled/anim_front.4bpp.lz"); -const u32 gMonBackPic_CircledQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/circled/back.4bpp.lz"); +const u32 gMonFrontPic_CircledQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/circled/anim_front.4bpp.smol"); +const u32 gMonBackPic_CircledQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/circled/back.4bpp.smol"); const u16 gMonPalette_CircledQuestionMark[] = INCBIN_U16("graphics/pokemon/question_mark/circled/normal.gbapal"); const u16 gMonShinyPalette_CircledQuestionMark[] = INCBIN_U16("graphics/pokemon/question_mark/circled/shiny.gbapal"); const u8 gMonIcon_QuestionMark[] = INCBIN_U8("graphics/pokemon/question_mark/icon.4bpp"); @@ -20,14 +20,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_BULBASAUR #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/anim_front.4bpp.smol"); const u16 gMonPalette_Bulbasaur[] = INCBIN_U16("graphics/pokemon/bulbasaur/normal.gbapal"); - const u32 gMonBackPic_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/back.4bpp.lz"); + const u32 gMonBackPic_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/back.4bpp.smol"); const u16 gMonShinyPalette_Bulbasaur[] = INCBIN_U16("graphics/pokemon/bulbasaur/shiny.gbapal"); #else - const u32 gMonFrontPic_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Bulbasaur[] = INCBIN_U16("graphics/pokemon/bulbasaur/normal_gba.gbapal"); - const u32 gMonBackPic_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/back_gba.4bpp.lz"); + const u32 gMonBackPic_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Bulbasaur[] = INCBIN_U16("graphics/pokemon/bulbasaur/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -47,14 +47,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/anim_front.4bpp.smol"); const u16 gMonPalette_Ivysaur[] = INCBIN_U16("graphics/pokemon/ivysaur/normal.gbapal"); - const u32 gMonBackPic_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/back.4bpp.lz"); + const u32 gMonBackPic_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/back.4bpp.smol"); const u16 gMonShinyPalette_Ivysaur[] = INCBIN_U16("graphics/pokemon/ivysaur/shiny.gbapal"); #else - const u32 gMonFrontPic_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ivysaur[] = INCBIN_U16("graphics/pokemon/ivysaur/normal_gba.gbapal"); - const u32 gMonBackPic_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ivysaur[] = INCBIN_U16("graphics/pokemon/ivysaur/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -74,14 +74,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/anim_front.4bpp.smol"); const u16 gMonPalette_Venusaur[] = INCBIN_U16("graphics/pokemon/venusaur/normal.gbapal"); - const u32 gMonBackPic_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/back.4bpp.lz"); + const u32 gMonBackPic_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/back.4bpp.smol"); const u16 gMonShinyPalette_Venusaur[] = INCBIN_U16("graphics/pokemon/venusaur/shiny.gbapal"); #else - const u32 gMonFrontPic_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Venusaur[] = INCBIN_U16("graphics/pokemon/venusaur/normal_gba.gbapal"); - const u32 gMonBackPic_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/back_gba.4bpp.lz"); + const u32 gMonBackPic_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Venusaur[] = INCBIN_U16("graphics/pokemon/venusaur/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -101,17 +101,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_VenusaurF[] = INCBIN_U32("graphics/pokemon/venusaur/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_VenusaurF[] = INCBIN_U32("graphics/pokemon/venusaur/backf.4bpp.lz"); + const u32 gMonFrontPic_VenusaurF[] = INCBIN_U32("graphics/pokemon/venusaur/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_VenusaurF[] = INCBIN_U32("graphics/pokemon/venusaur/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_VenusaurF[] = INCBIN_COMP("graphics/pokemon/venusaur/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_VenusaurMega[] = INCBIN_U32("graphics/pokemon/venusaur/mega/front.4bpp.lz"); + const u32 gMonFrontPic_VenusaurMega[] = INCBIN_U32("graphics/pokemon/venusaur/mega/front.4bpp.smol"); const u16 gMonPalette_VenusaurMega[] = INCBIN_U16("graphics/pokemon/venusaur/mega/normal.gbapal"); - const u32 gMonBackPic_VenusaurMega[] = INCBIN_U32("graphics/pokemon/venusaur/mega/back.4bpp.lz"); + const u32 gMonBackPic_VenusaurMega[] = INCBIN_U32("graphics/pokemon/venusaur/mega/back.4bpp.smol"); const u16 gMonShinyPalette_VenusaurMega[] = INCBIN_U16("graphics/pokemon/venusaur/mega/shiny.gbapal"); const u8 gMonIcon_VenusaurMega[] = INCBIN_U8("graphics/pokemon/venusaur/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -124,8 +124,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_MEGA_EVOLUTIONS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_VenusaurGmax[] = INCBIN_U32("graphics/pokemon/venusaur/gmax/front.4bpp.lz"); - const u32 gMonBackPic_VenusaurGmax[] = INCBIN_U32("graphics/pokemon/venusaur/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_VenusaurGmax[] = INCBIN_U32("graphics/pokemon/venusaur/gmax/front.4bpp.smol"); + const u32 gMonBackPic_VenusaurGmax[] = INCBIN_U32("graphics/pokemon/venusaur/gmax/back.4bpp.smol"); const u16 gMonPalette_VenusaurGmax[] = INCBIN_U16("graphics/pokemon/venusaur/gmax/normal.gbapal"); const u16 gMonShinyPalette_VenusaurGmax[] = INCBIN_U16("graphics/pokemon/venusaur/gmax/shiny.gbapal"); const u8 gMonIcon_VenusaurGmax[] = INCBIN_U8("graphics/pokemon/venusaur/gmax/icon.4bpp"); @@ -141,14 +141,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CHARMANDER #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/anim_front.4bpp.smol"); const u16 gMonPalette_Charmander[] = INCBIN_U16("graphics/pokemon/charmander/normal.gbapal"); - const u32 gMonBackPic_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/back.4bpp.lz"); + const u32 gMonBackPic_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/back.4bpp.smol"); const u16 gMonShinyPalette_Charmander[] = INCBIN_U16("graphics/pokemon/charmander/shiny.gbapal"); #else - const u32 gMonFrontPic_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Charmander[] = INCBIN_U16("graphics/pokemon/charmander/normal_gba.gbapal"); - const u32 gMonBackPic_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/back_gba.4bpp.lz"); + const u32 gMonBackPic_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Charmander[] = INCBIN_U16("graphics/pokemon/charmander/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -168,14 +168,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/anim_front.4bpp.smol"); const u16 gMonPalette_Charmeleon[] = INCBIN_U16("graphics/pokemon/charmeleon/normal.gbapal"); - const u32 gMonBackPic_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/back.4bpp.lz"); + const u32 gMonBackPic_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/back.4bpp.smol"); const u16 gMonShinyPalette_Charmeleon[] = INCBIN_U16("graphics/pokemon/charmeleon/shiny.gbapal"); #else - const u32 gMonFrontPic_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Charmeleon[] = INCBIN_U16("graphics/pokemon/charmeleon/normal_gba.gbapal"); - const u32 gMonBackPic_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Charmeleon[] = INCBIN_U16("graphics/pokemon/charmeleon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -195,14 +195,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/anim_front.4bpp.smol"); const u16 gMonPalette_Charizard[] = INCBIN_U16("graphics/pokemon/charizard/normal.gbapal"); - const u32 gMonBackPic_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/back.4bpp.lz"); + const u32 gMonBackPic_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/back.4bpp.smol"); const u16 gMonShinyPalette_Charizard[] = INCBIN_U16("graphics/pokemon/charizard/shiny.gbapal"); #else - const u32 gMonFrontPic_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Charizard[] = INCBIN_U16("graphics/pokemon/charizard/normal_gba.gbapal"); - const u32 gMonBackPic_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/back_gba.4bpp.lz"); + const u32 gMonBackPic_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Charizard[] = INCBIN_U16("graphics/pokemon/charizard/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -222,9 +222,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_CharizardMegaX[] = INCBIN_U32("graphics/pokemon/charizard/mega_x/front.4bpp.lz"); + const u32 gMonFrontPic_CharizardMegaX[] = INCBIN_U32("graphics/pokemon/charizard/mega_x/front.4bpp.smol"); const u16 gMonPalette_CharizardMegaX[] = INCBIN_U16("graphics/pokemon/charizard/mega_x/normal.gbapal"); - const u32 gMonBackPic_CharizardMegaX[] = INCBIN_U32("graphics/pokemon/charizard/mega_x/back.4bpp.lz"); + const u32 gMonBackPic_CharizardMegaX[] = INCBIN_U32("graphics/pokemon/charizard/mega_x/back.4bpp.smol"); const u16 gMonShinyPalette_CharizardMegaX[] = INCBIN_U16("graphics/pokemon/charizard/mega_x/shiny.gbapal"); const u8 gMonIcon_CharizardMegaX[] = INCBIN_U8("graphics/pokemon/charizard/mega_x/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -235,9 +235,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS - const u32 gMonFrontPic_CharizardMegaY[] = INCBIN_U32("graphics/pokemon/charizard/mega_y/front.4bpp.lz"); + const u32 gMonFrontPic_CharizardMegaY[] = INCBIN_U32("graphics/pokemon/charizard/mega_y/front.4bpp.smol"); const u16 gMonPalette_CharizardMegaY[] = INCBIN_U16("graphics/pokemon/charizard/mega_y/normal.gbapal"); - const u32 gMonBackPic_CharizardMegaY[] = INCBIN_U32("graphics/pokemon/charizard/mega_y/back.4bpp.lz"); + const u32 gMonBackPic_CharizardMegaY[] = INCBIN_U32("graphics/pokemon/charizard/mega_y/back.4bpp.smol"); const u16 gMonShinyPalette_CharizardMegaY[] = INCBIN_U16("graphics/pokemon/charizard/mega_y/shiny.gbapal"); const u8 gMonIcon_CharizardMegaY[] = INCBIN_U8("graphics/pokemon/charizard/mega_y/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -250,8 +250,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_MEGA_EVOLUTIONS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_CharizardGmax[] = INCBIN_U32("graphics/pokemon/charizard/gmax/front.4bpp.lz"); - const u32 gMonBackPic_CharizardGmax[] = INCBIN_U32("graphics/pokemon/charizard/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_CharizardGmax[] = INCBIN_U32("graphics/pokemon/charizard/gmax/front.4bpp.smol"); + const u32 gMonBackPic_CharizardGmax[] = INCBIN_U32("graphics/pokemon/charizard/gmax/back.4bpp.smol"); const u16 gMonPalette_CharizardGmax[] = INCBIN_U16("graphics/pokemon/charizard/gmax/normal.gbapal"); const u16 gMonShinyPalette_CharizardGmax[] = INCBIN_U16("graphics/pokemon/charizard/gmax/shiny.gbapal"); const u8 gMonIcon_CharizardGmax[] = INCBIN_U8("graphics/pokemon/charizard/gmax/icon.4bpp"); @@ -267,14 +267,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SQUIRTLE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/anim_front.4bpp.smol"); const u16 gMonPalette_Squirtle[] = INCBIN_U16("graphics/pokemon/squirtle/normal.gbapal"); - const u32 gMonBackPic_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/back.4bpp.lz"); + const u32 gMonBackPic_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/back.4bpp.smol"); const u16 gMonShinyPalette_Squirtle[] = INCBIN_U16("graphics/pokemon/squirtle/shiny.gbapal"); #else - const u32 gMonFrontPic_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Squirtle[] = INCBIN_U16("graphics/pokemon/squirtle/normal_gba.gbapal"); - const u32 gMonBackPic_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/back_gba.4bpp.lz"); + const u32 gMonBackPic_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Squirtle[] = INCBIN_U16("graphics/pokemon/squirtle/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -294,14 +294,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/anim_front.4bpp.smol"); const u16 gMonPalette_Wartortle[] = INCBIN_U16("graphics/pokemon/wartortle/normal.gbapal"); - const u32 gMonBackPic_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/back.4bpp.lz"); + const u32 gMonBackPic_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/back.4bpp.smol"); const u16 gMonShinyPalette_Wartortle[] = INCBIN_U16("graphics/pokemon/wartortle/shiny.gbapal"); #else - const u32 gMonFrontPic_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Wartortle[] = INCBIN_U16("graphics/pokemon/wartortle/normal_gba.gbapal"); - const u32 gMonBackPic_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/back_gba.4bpp.lz"); + const u32 gMonBackPic_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Wartortle[] = INCBIN_U16("graphics/pokemon/wartortle/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -321,14 +321,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/anim_front.4bpp.smol"); const u16 gMonPalette_Blastoise[] = INCBIN_U16("graphics/pokemon/blastoise/normal.gbapal"); - const u32 gMonBackPic_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/back.4bpp.lz"); + const u32 gMonBackPic_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/back.4bpp.smol"); const u16 gMonShinyPalette_Blastoise[] = INCBIN_U16("graphics/pokemon/blastoise/shiny.gbapal"); #else - const u32 gMonFrontPic_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Blastoise[] = INCBIN_U16("graphics/pokemon/blastoise/normal_gba.gbapal"); - const u32 gMonBackPic_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/back_gba.4bpp.lz"); + const u32 gMonBackPic_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Blastoise[] = INCBIN_U16("graphics/pokemon/blastoise/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -348,9 +348,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_BlastoiseMega[] = INCBIN_U32("graphics/pokemon/blastoise/mega/front.4bpp.lz"); + const u32 gMonFrontPic_BlastoiseMega[] = INCBIN_U32("graphics/pokemon/blastoise/mega/front.4bpp.smol"); const u16 gMonPalette_BlastoiseMega[] = INCBIN_U16("graphics/pokemon/blastoise/mega/normal.gbapal"); - const u32 gMonBackPic_BlastoiseMega[] = INCBIN_U32("graphics/pokemon/blastoise/mega/back.4bpp.lz"); + const u32 gMonBackPic_BlastoiseMega[] = INCBIN_U32("graphics/pokemon/blastoise/mega/back.4bpp.smol"); const u16 gMonShinyPalette_BlastoiseMega[] = INCBIN_U16("graphics/pokemon/blastoise/mega/shiny.gbapal"); const u8 gMonIcon_BlastoiseMega[] = INCBIN_U8("graphics/pokemon/blastoise/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -363,8 +363,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_MEGA_EVOLUTIONS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_BlastoiseGmax[] = INCBIN_U32("graphics/pokemon/blastoise/gmax/front.4bpp.lz"); - const u32 gMonBackPic_BlastoiseGmax[] = INCBIN_U32("graphics/pokemon/blastoise/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_BlastoiseGmax[] = INCBIN_U32("graphics/pokemon/blastoise/gmax/front.4bpp.smol"); + const u32 gMonBackPic_BlastoiseGmax[] = INCBIN_U32("graphics/pokemon/blastoise/gmax/back.4bpp.smol"); const u16 gMonPalette_BlastoiseGmax[] = INCBIN_U16("graphics/pokemon/blastoise/gmax/normal.gbapal"); const u16 gMonShinyPalette_BlastoiseGmax[] = INCBIN_U16("graphics/pokemon/blastoise/gmax/shiny.gbapal"); const u8 gMonIcon_BlastoiseGmax[] = INCBIN_U8("graphics/pokemon/blastoise/gmax/icon.4bpp"); @@ -380,14 +380,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CATERPIE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/anim_front.4bpp.smol"); const u16 gMonPalette_Caterpie[] = INCBIN_U16("graphics/pokemon/caterpie/normal.gbapal"); - const u32 gMonBackPic_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/back.4bpp.lz"); + const u32 gMonBackPic_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/back.4bpp.smol"); const u16 gMonShinyPalette_Caterpie[] = INCBIN_U16("graphics/pokemon/caterpie/shiny.gbapal"); #else - const u32 gMonFrontPic_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Caterpie[] = INCBIN_U16("graphics/pokemon/caterpie/normal_gba.gbapal"); - const u32 gMonBackPic_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/back_gba.4bpp.lz"); + const u32 gMonBackPic_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Caterpie[] = INCBIN_U16("graphics/pokemon/caterpie/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -407,14 +407,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/anim_front.4bpp.smol"); const u16 gMonPalette_Metapod[] = INCBIN_U16("graphics/pokemon/metapod/normal.gbapal"); - const u32 gMonBackPic_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/back.4bpp.lz"); + const u32 gMonBackPic_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/back.4bpp.smol"); const u16 gMonShinyPalette_Metapod[] = INCBIN_U16("graphics/pokemon/metapod/shiny.gbapal"); #else - const u32 gMonFrontPic_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Metapod[] = INCBIN_U16("graphics/pokemon/metapod/normal_gba.gbapal"); - const u32 gMonBackPic_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/back_gba.4bpp.lz"); + const u32 gMonBackPic_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Metapod[] = INCBIN_U16("graphics/pokemon/metapod/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX const u8 gMonIcon_Metapod[] = INCBIN_U8( "graphics/pokemon/metapod/icon.4bpp"); @@ -430,14 +430,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/anim_front.4bpp.smol"); const u16 gMonPalette_Butterfree[] = INCBIN_U16("graphics/pokemon/butterfree/normal.gbapal"); - const u32 gMonBackPic_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/back.4bpp.lz"); + const u32 gMonBackPic_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/back.4bpp.smol"); const u16 gMonShinyPalette_Butterfree[] = INCBIN_U16("graphics/pokemon/butterfree/shiny.gbapal"); #else - const u32 gMonFrontPic_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Butterfree[] = INCBIN_U16("graphics/pokemon/butterfree/normal_gba.gbapal"); - const u32 gMonBackPic_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/back_gba.4bpp.lz"); + const u32 gMonBackPic_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Butterfree[] = INCBIN_U16("graphics/pokemon/butterfree/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -457,16 +457,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_ButterfreeF[] = INCBIN_U32("graphics/pokemon/butterfree/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_ButterfreeF[] = INCBIN_U32("graphics/pokemon/butterfree/backf.4bpp.lz"); + const u32 gMonFrontPic_ButterfreeF[] = INCBIN_U32("graphics/pokemon/butterfree/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_ButterfreeF[] = INCBIN_U32("graphics/pokemon/butterfree/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_ButterfreeF[] = INCBIN_COMP("graphics/pokemon/butterfree/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_ButterfreeGmax[] = INCBIN_U32("graphics/pokemon/butterfree/gmax/front.4bpp.lz"); - const u32 gMonBackPic_ButterfreeGmax[] = INCBIN_U32("graphics/pokemon/butterfree/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_ButterfreeGmax[] = INCBIN_U32("graphics/pokemon/butterfree/gmax/front.4bpp.smol"); + const u32 gMonBackPic_ButterfreeGmax[] = INCBIN_U32("graphics/pokemon/butterfree/gmax/back.4bpp.smol"); const u16 gMonPalette_ButterfreeGmax[] = INCBIN_U16("graphics/pokemon/butterfree/gmax/normal.gbapal"); const u16 gMonShinyPalette_ButterfreeGmax[] = INCBIN_U16("graphics/pokemon/butterfree/gmax/shiny.gbapal"); const u8 gMonIcon_ButterfreeGmax[] = INCBIN_U8("graphics/pokemon/butterfree/gmax/icon.4bpp"); @@ -482,14 +482,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_WEEDLE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/anim_front.4bpp.smol"); const u16 gMonPalette_Weedle[] = INCBIN_U16("graphics/pokemon/weedle/normal.gbapal"); - const u32 gMonBackPic_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/back.4bpp.lz"); + const u32 gMonBackPic_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/back.4bpp.smol"); const u16 gMonShinyPalette_Weedle[] = INCBIN_U16("graphics/pokemon/weedle/shiny.gbapal"); #else - const u32 gMonFrontPic_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Weedle[] = INCBIN_U16("graphics/pokemon/weedle/normal_gba.gbapal"); - const u32 gMonBackPic_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/back_gba.4bpp.lz"); + const u32 gMonBackPic_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Weedle[] = INCBIN_U16("graphics/pokemon/weedle/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -509,14 +509,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/anim_front.4bpp.smol"); const u16 gMonPalette_Kakuna[] = INCBIN_U16("graphics/pokemon/kakuna/normal.gbapal"); - const u32 gMonBackPic_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/back.4bpp.lz"); + const u32 gMonBackPic_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/back.4bpp.smol"); const u16 gMonShinyPalette_Kakuna[] = INCBIN_U16("graphics/pokemon/kakuna/shiny.gbapal"); #else - const u32 gMonFrontPic_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Kakuna[] = INCBIN_U16("graphics/pokemon/kakuna/normal_gba.gbapal"); - const u32 gMonBackPic_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/back_gba.4bpp.lz"); + const u32 gMonBackPic_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Kakuna[] = INCBIN_U16("graphics/pokemon/kakuna/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -536,14 +536,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/anim_front.4bpp.smol"); const u16 gMonPalette_Beedrill[] = INCBIN_U16("graphics/pokemon/beedrill/normal.gbapal"); - const u32 gMonBackPic_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/back.4bpp.lz"); + const u32 gMonBackPic_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/back.4bpp.smol"); const u16 gMonShinyPalette_Beedrill[] = INCBIN_U16("graphics/pokemon/beedrill/shiny.gbapal"); #else - const u32 gMonFrontPic_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Beedrill[] = INCBIN_U16("graphics/pokemon/beedrill/normal_gba.gbapal"); - const u32 gMonBackPic_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/back_gba.4bpp.lz"); + const u32 gMonBackPic_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Beedrill[] = INCBIN_U16("graphics/pokemon/beedrill/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -563,9 +563,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_BeedrillMega[] = INCBIN_U32("graphics/pokemon/beedrill/mega/front.4bpp.lz"); + const u32 gMonFrontPic_BeedrillMega[] = INCBIN_U32("graphics/pokemon/beedrill/mega/front.4bpp.smol"); const u16 gMonPalette_BeedrillMega[] = INCBIN_U16("graphics/pokemon/beedrill/mega/normal.gbapal"); - const u32 gMonBackPic_BeedrillMega[] = INCBIN_U32("graphics/pokemon/beedrill/mega/back.4bpp.lz"); + const u32 gMonBackPic_BeedrillMega[] = INCBIN_U32("graphics/pokemon/beedrill/mega/back.4bpp.smol"); const u16 gMonShinyPalette_BeedrillMega[] = INCBIN_U16("graphics/pokemon/beedrill/mega/shiny.gbapal"); const u8 gMonIcon_BeedrillMega[] = INCBIN_U8("graphics/pokemon/beedrill/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -580,14 +580,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_PIDGEY #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/anim_front.4bpp.smol"); const u16 gMonPalette_Pidgey[] = INCBIN_U16("graphics/pokemon/pidgey/normal.gbapal"); - const u32 gMonBackPic_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/back.4bpp.lz"); + const u32 gMonBackPic_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/back.4bpp.smol"); const u16 gMonShinyPalette_Pidgey[] = INCBIN_U16("graphics/pokemon/pidgey/shiny.gbapal"); #else - const u32 gMonFrontPic_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Pidgey[] = INCBIN_U16("graphics/pokemon/pidgey/normal_gba.gbapal"); - const u32 gMonBackPic_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/back_gba.4bpp.lz"); + const u32 gMonBackPic_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Pidgey[] = INCBIN_U16("graphics/pokemon/pidgey/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -607,14 +607,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/anim_front.4bpp.smol"); const u16 gMonPalette_Pidgeotto[] = INCBIN_U16("graphics/pokemon/pidgeotto/normal.gbapal"); - const u32 gMonBackPic_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/back.4bpp.lz"); + const u32 gMonBackPic_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/back.4bpp.smol"); const u16 gMonShinyPalette_Pidgeotto[] = INCBIN_U16("graphics/pokemon/pidgeotto/shiny.gbapal"); #else - const u32 gMonFrontPic_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Pidgeotto[] = INCBIN_U16("graphics/pokemon/pidgeotto/normal_gba.gbapal"); - const u32 gMonBackPic_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/back_gba.4bpp.lz"); + const u32 gMonBackPic_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Pidgeotto[] = INCBIN_U16("graphics/pokemon/pidgeotto/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -634,14 +634,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/anim_front.4bpp.smol"); const u16 gMonPalette_Pidgeot[] = INCBIN_U16("graphics/pokemon/pidgeot/normal.gbapal"); - const u32 gMonBackPic_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/back.4bpp.lz"); + const u32 gMonBackPic_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/back.4bpp.smol"); const u16 gMonShinyPalette_Pidgeot[] = INCBIN_U16("graphics/pokemon/pidgeot/shiny.gbapal"); #else - const u32 gMonFrontPic_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Pidgeot[] = INCBIN_U16("graphics/pokemon/pidgeot/normal_gba.gbapal"); - const u32 gMonBackPic_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/back_gba.4bpp.lz"); + const u32 gMonBackPic_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Pidgeot[] = INCBIN_U16("graphics/pokemon/pidgeot/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -661,9 +661,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_PidgeotMega[] = INCBIN_U32("graphics/pokemon/pidgeot/mega/front.4bpp.lz"); + const u32 gMonFrontPic_PidgeotMega[] = INCBIN_U32("graphics/pokemon/pidgeot/mega/front.4bpp.smol"); const u16 gMonPalette_PidgeotMega[] = INCBIN_U16("graphics/pokemon/pidgeot/mega/normal.gbapal"); - const u32 gMonBackPic_PidgeotMega[] = INCBIN_U32("graphics/pokemon/pidgeot/mega/back.4bpp.lz"); + const u32 gMonBackPic_PidgeotMega[] = INCBIN_U32("graphics/pokemon/pidgeot/mega/back.4bpp.smol"); const u16 gMonShinyPalette_PidgeotMega[] = INCBIN_U16("graphics/pokemon/pidgeot/mega/shiny.gbapal"); const u8 gMonIcon_PidgeotMega[] = INCBIN_U8("graphics/pokemon/pidgeot/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -678,14 +678,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_RATTATA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/anim_front.4bpp.smol"); const u16 gMonPalette_Rattata[] = INCBIN_U16("graphics/pokemon/rattata/normal.gbapal"); - const u32 gMonBackPic_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/back.4bpp.lz"); + const u32 gMonBackPic_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/back.4bpp.smol"); const u16 gMonShinyPalette_Rattata[] = INCBIN_U16("graphics/pokemon/rattata/shiny.gbapal"); #else - const u32 gMonFrontPic_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Rattata[] = INCBIN_U16("graphics/pokemon/rattata/normal_gba.gbapal"); - const u32 gMonBackPic_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/back_gba.4bpp.lz"); + const u32 gMonBackPic_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Rattata[] = INCBIN_U16("graphics/pokemon/rattata/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -705,22 +705,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_RattataF[] = INCBIN_U32("graphics/pokemon/rattata/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_RattataF[] = INCBIN_U32("graphics/pokemon/rattata/backf.4bpp.lz"); + const u32 gMonFrontPic_RattataF[] = INCBIN_U32("graphics/pokemon/rattata/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_RattataF[] = INCBIN_U32("graphics/pokemon/rattata/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_RattataF[] = INCBIN_COMP("graphics/pokemon/rattata/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/anim_front.4bpp.smol"); const u16 gMonPalette_Raticate[] = INCBIN_U16("graphics/pokemon/raticate/normal.gbapal"); - const u32 gMonBackPic_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/back.4bpp.lz"); + const u32 gMonBackPic_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/back.4bpp.smol"); const u16 gMonShinyPalette_Raticate[] = INCBIN_U16("graphics/pokemon/raticate/shiny.gbapal"); #else - const u32 gMonFrontPic_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Raticate[] = INCBIN_U16("graphics/pokemon/raticate/normal_gba.gbapal"); - const u32 gMonBackPic_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/back_gba.4bpp.lz"); + const u32 gMonBackPic_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Raticate[] = INCBIN_U16("graphics/pokemon/raticate/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -740,17 +740,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_RaticateF[] = INCBIN_U32("graphics/pokemon/raticate/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_RaticateF[] = INCBIN_U32("graphics/pokemon/raticate/backf.4bpp.lz"); + const u32 gMonFrontPic_RaticateF[] = INCBIN_U32("graphics/pokemon/raticate/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_RaticateF[] = INCBIN_U32("graphics/pokemon/raticate/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_RaticateF[] = INCBIN_COMP("graphics/pokemon/raticate/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_ALOLAN_FORMS - const u32 gMonFrontPic_RattataAlola[] = INCBIN_U32("graphics/pokemon/rattata/alola/front.4bpp.lz"); + const u32 gMonFrontPic_RattataAlola[] = INCBIN_U32("graphics/pokemon/rattata/alola/front.4bpp.smol"); const u16 gMonPalette_RattataAlola[] = INCBIN_U16("graphics/pokemon/rattata/alola/normal.gbapal"); - const u32 gMonBackPic_RattataAlola[] = INCBIN_U32("graphics/pokemon/rattata/alola/back.4bpp.lz"); + const u32 gMonBackPic_RattataAlola[] = INCBIN_U32("graphics/pokemon/rattata/alola/back.4bpp.smol"); const u16 gMonShinyPalette_RattataAlola[] = INCBIN_U16("graphics/pokemon/rattata/alola/shiny.gbapal"); const u8 gMonIcon_RattataAlola[] = INCBIN_U8("graphics/pokemon/rattata/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -761,9 +761,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_RaticateAlola[] = INCBIN_U32("graphics/pokemon/raticate/alola/front.4bpp.lz"); + const u32 gMonFrontPic_RaticateAlola[] = INCBIN_U32("graphics/pokemon/raticate/alola/front.4bpp.smol"); const u16 gMonPalette_RaticateAlola[] = INCBIN_U16("graphics/pokemon/raticate/alola/normal.gbapal"); - const u32 gMonBackPic_RaticateAlola[] = INCBIN_U32("graphics/pokemon/raticate/alola/back.4bpp.lz"); + const u32 gMonBackPic_RaticateAlola[] = INCBIN_U32("graphics/pokemon/raticate/alola/back.4bpp.smol"); const u16 gMonShinyPalette_RaticateAlola[] = INCBIN_U16("graphics/pokemon/raticate/alola/shiny.gbapal"); const u8 gMonIcon_RaticateAlola[] = INCBIN_U8("graphics/pokemon/raticate/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -778,14 +778,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SPEAROW #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/anim_front.4bpp.smol"); const u16 gMonPalette_Spearow[] = INCBIN_U16("graphics/pokemon/spearow/normal.gbapal"); - const u32 gMonBackPic_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/back.4bpp.lz"); + const u32 gMonBackPic_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/back.4bpp.smol"); const u16 gMonShinyPalette_Spearow[] = INCBIN_U16("graphics/pokemon/spearow/shiny.gbapal"); #else - const u32 gMonFrontPic_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Spearow[] = INCBIN_U16("graphics/pokemon/spearow/normal_gba.gbapal"); - const u32 gMonBackPic_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/back_gba.4bpp.lz"); + const u32 gMonBackPic_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Spearow[] = INCBIN_U16("graphics/pokemon/spearow/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -805,14 +805,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/anim_front.4bpp.smol"); const u16 gMonPalette_Fearow[] = INCBIN_U16("graphics/pokemon/fearow/normal.gbapal"); - const u32 gMonBackPic_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/back.4bpp.lz"); + const u32 gMonBackPic_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/back.4bpp.smol"); const u16 gMonShinyPalette_Fearow[] = INCBIN_U16("graphics/pokemon/fearow/shiny.gbapal"); #else - const u32 gMonFrontPic_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Fearow[] = INCBIN_U16("graphics/pokemon/fearow/normal_gba.gbapal"); - const u32 gMonBackPic_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/back_gba.4bpp.lz"); + const u32 gMonBackPic_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Fearow[] = INCBIN_U16("graphics/pokemon/fearow/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -834,14 +834,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_EKANS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/anim_front.4bpp.smol"); const u16 gMonPalette_Ekans[] = INCBIN_U16("graphics/pokemon/ekans/normal.gbapal"); - const u32 gMonBackPic_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/back.4bpp.lz"); + const u32 gMonBackPic_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/back.4bpp.smol"); const u16 gMonShinyPalette_Ekans[] = INCBIN_U16("graphics/pokemon/ekans/shiny.gbapal"); #else - const u32 gMonFrontPic_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ekans[] = INCBIN_U16("graphics/pokemon/ekans/normal_gba.gbapal"); - const u32 gMonBackPic_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ekans[] = INCBIN_U16("graphics/pokemon/ekans/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -861,14 +861,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/anim_front.4bpp.smol"); const u16 gMonPalette_Arbok[] = INCBIN_U16("graphics/pokemon/arbok/normal.gbapal"); - const u32 gMonBackPic_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/back.4bpp.lz"); + const u32 gMonBackPic_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/back.4bpp.smol"); const u16 gMonShinyPalette_Arbok[] = INCBIN_U16("graphics/pokemon/arbok/shiny.gbapal"); #else - const u32 gMonFrontPic_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Arbok[] = INCBIN_U16("graphics/pokemon/arbok/normal_gba.gbapal"); - const u32 gMonBackPic_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/back_gba.4bpp.lz"); + const u32 gMonBackPic_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Arbok[] = INCBIN_U16("graphics/pokemon/arbok/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -891,14 +891,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_PIKACHU #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/anim_front.4bpp.smol"); const u16 gMonPalette_Pichu[] = INCBIN_U16("graphics/pokemon/pichu/normal.gbapal"); - const u32 gMonBackPic_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/back.4bpp.lz"); + const u32 gMonBackPic_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/back.4bpp.smol"); const u16 gMonShinyPalette_Pichu[] = INCBIN_U16("graphics/pokemon/pichu/shiny.gbapal"); #else - const u32 gMonFrontPic_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Pichu[] = INCBIN_U16("graphics/pokemon/pichu/normal_gba.gbapal"); - const u32 gMonBackPic_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/back_gba.4bpp.lz"); + const u32 gMonBackPic_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Pichu[] = INCBIN_U16("graphics/pokemon/pichu/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -917,9 +917,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_PichuSpikyEared[] = INCBIN_U32("graphics/pokemon/pichu/spiky_eared/anim_front.4bpp.lz"); + const u32 gMonFrontPic_PichuSpikyEared[] = INCBIN_U32("graphics/pokemon/pichu/spiky_eared/anim_front.4bpp.smol"); const u16 gMonPalette_PichuSpikyEared[] = INCBIN_U16("graphics/pokemon/pichu/spiky_eared/normal.gbapal"); - const u32 gMonBackPic_PichuSpikyEared[] = INCBIN_U32("graphics/pokemon/pichu/spiky_eared/back.4bpp.lz"); + const u32 gMonBackPic_PichuSpikyEared[] = INCBIN_U32("graphics/pokemon/pichu/spiky_eared/back.4bpp.smol"); const u16 gMonShinyPalette_PichuSpikyEared[] = INCBIN_U16("graphics/pokemon/pichu/spiky_eared/shiny.gbapal"); const u8 gMonIcon_PichuSpikyEared[] = INCBIN_U8("graphics/pokemon/pichu/spiky_eared/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -932,14 +932,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/anim_front.4bpp.smol"); const u16 gMonPalette_Pikachu[] = INCBIN_U16("graphics/pokemon/pikachu/normal.gbapal"); - const u32 gMonBackPic_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/back.4bpp.lz"); + const u32 gMonBackPic_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/back.4bpp.smol"); const u16 gMonShinyPalette_Pikachu[] = INCBIN_U16("graphics/pokemon/pikachu/shiny.gbapal"); #else - const u32 gMonFrontPic_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Pikachu[] = INCBIN_U16("graphics/pokemon/pikachu/normal_gba.gbapal"); - const u32 gMonBackPic_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/back_gba.4bpp.lz"); + const u32 gMonBackPic_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Pikachu[] = INCBIN_U16("graphics/pokemon/pikachu/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -959,8 +959,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_PikachuF[] = INCBIN_U32("graphics/pokemon/pikachu/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_PikachuF[] = INCBIN_U32("graphics/pokemon/pikachu/backf.4bpp.lz"); + const u32 gMonFrontPic_PikachuF[] = INCBIN_U32("graphics/pokemon/pikachu/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_PikachuF[] = INCBIN_U32("graphics/pokemon/pikachu/backf.4bpp.smol"); #if P_CUSTOM_GENDER_DIFF_ICONS const u8 gMonIcon_PikachuF[] = INCBIN_U8("graphics/pokemon/pikachu/iconf.4bpp"); #endif @@ -970,39 +970,39 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GENDER_DIFFERENCES #if P_COSPLAY_PIKACHU_FORMS - const u32 gMonFrontPic_PikachuCosplay[] = INCBIN_U32("graphics/pokemon/pikachu/cosplay/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuCosplay[] = INCBIN_U32("graphics/pokemon/pikachu/cosplay/front.4bpp.smol"); const u16 gMonPalette_PikachuCosplay[] = INCBIN_U16("graphics/pokemon/pikachu/cosplay/normal.gbapal"); - const u32 gMonBackPic_PikachuCosplay[] = INCBIN_U32("graphics/pokemon/pikachu/cosplay/back.4bpp.lz"); + const u32 gMonBackPic_PikachuCosplay[] = INCBIN_U32("graphics/pokemon/pikachu/cosplay/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuCosplay[] = INCBIN_U16("graphics/pokemon/pikachu/cosplay/shiny.gbapal"); const u8 gMonIcon_PikachuCosplay[] = INCBIN_U8("graphics/pokemon/pikachu/cosplay/icon.4bpp"); - const u32 gMonFrontPic_PikachuRockStar[] = INCBIN_U32("graphics/pokemon/pikachu/rock_star/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuRockStar[] = INCBIN_U32("graphics/pokemon/pikachu/rock_star/front.4bpp.smol"); const u16 gMonPalette_PikachuRockStar[] = INCBIN_U16("graphics/pokemon/pikachu/rock_star/normal.gbapal"); - const u32 gMonBackPic_PikachuRockStar[] = INCBIN_U32("graphics/pokemon/pikachu/rock_star/back.4bpp.lz"); + const u32 gMonBackPic_PikachuRockStar[] = INCBIN_U32("graphics/pokemon/pikachu/rock_star/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuRockStar[] = INCBIN_U16("graphics/pokemon/pikachu/rock_star/shiny.gbapal"); const u8 gMonIcon_PikachuRockStar[] = INCBIN_U8("graphics/pokemon/pikachu/rock_star/icon.4bpp"); - const u32 gMonFrontPic_PikachuBelle[] = INCBIN_U32("graphics/pokemon/pikachu/belle/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuBelle[] = INCBIN_U32("graphics/pokemon/pikachu/belle/front.4bpp.smol"); const u16 gMonPalette_PikachuBelle[] = INCBIN_U16("graphics/pokemon/pikachu/belle/normal.gbapal"); - const u32 gMonBackPic_PikachuBelle[] = INCBIN_U32("graphics/pokemon/pikachu/belle/back.4bpp.lz"); + const u32 gMonBackPic_PikachuBelle[] = INCBIN_U32("graphics/pokemon/pikachu/belle/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuBelle[] = INCBIN_U16("graphics/pokemon/pikachu/belle/shiny.gbapal"); const u8 gMonIcon_PikachuBelle[] = INCBIN_U8("graphics/pokemon/pikachu/belle/icon.4bpp"); - const u32 gMonFrontPic_PikachuPopStar[] = INCBIN_U32("graphics/pokemon/pikachu/pop_star/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuPopStar[] = INCBIN_U32("graphics/pokemon/pikachu/pop_star/front.4bpp.smol"); const u16 gMonPalette_PikachuPopStar[] = INCBIN_U16("graphics/pokemon/pikachu/pop_star/normal.gbapal"); - const u32 gMonBackPic_PikachuPopStar[] = INCBIN_U32("graphics/pokemon/pikachu/pop_star/back.4bpp.lz"); + const u32 gMonBackPic_PikachuPopStar[] = INCBIN_U32("graphics/pokemon/pikachu/pop_star/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuPopStar[] = INCBIN_U16("graphics/pokemon/pikachu/pop_star/shiny.gbapal"); const u8 gMonIcon_PikachuPopStar[] = INCBIN_U8("graphics/pokemon/pikachu/pop_star/icon.4bpp"); - const u32 gMonFrontPic_PikachuPhD[] = INCBIN_U32("graphics/pokemon/pikachu/phd/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuPhD[] = INCBIN_U32("graphics/pokemon/pikachu/phd/front.4bpp.smol"); const u16 gMonPalette_PikachuPhD[] = INCBIN_U16("graphics/pokemon/pikachu/phd/normal.gbapal"); - const u32 gMonBackPic_PikachuPhD[] = INCBIN_U32("graphics/pokemon/pikachu/phd/back.4bpp.lz"); + const u32 gMonBackPic_PikachuPhD[] = INCBIN_U32("graphics/pokemon/pikachu/phd/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuPhD[] = INCBIN_U16("graphics/pokemon/pikachu/phd/shiny.gbapal"); const u8 gMonIcon_PikachuPhD[] = INCBIN_U8("graphics/pokemon/pikachu/phd/icon.4bpp"); - const u32 gMonFrontPic_PikachuLibre[] = INCBIN_U32("graphics/pokemon/pikachu/libre/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuLibre[] = INCBIN_U32("graphics/pokemon/pikachu/libre/front.4bpp.smol"); const u16 gMonPalette_PikachuLibre[] = INCBIN_U16("graphics/pokemon/pikachu/libre/normal.gbapal"); - const u32 gMonBackPic_PikachuLibre[] = INCBIN_U32("graphics/pokemon/pikachu/libre/back.4bpp.lz"); + const u32 gMonBackPic_PikachuLibre[] = INCBIN_U32("graphics/pokemon/pikachu/libre/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuLibre[] = INCBIN_U16("graphics/pokemon/pikachu/libre/shiny.gbapal"); const u8 gMonIcon_PikachuLibre[] = INCBIN_U8("graphics/pokemon/pikachu/libre/icon.4bpp"); @@ -1017,51 +1017,51 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_COSPLAY_PIKACHU_FORMS #if P_CAP_PIKACHU_FORMS - const u32 gMonFrontPic_PikachuOriginal[] = INCBIN_U32("graphics/pokemon/pikachu/original/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuOriginal[] = INCBIN_U32("graphics/pokemon/pikachu/original/front.4bpp.smol"); const u16 gMonPalette_PikachuOriginal[] = INCBIN_U16("graphics/pokemon/pikachu/original/normal.gbapal"); - const u32 gMonBackPic_PikachuOriginal[] = INCBIN_U32("graphics/pokemon/pikachu/original/back.4bpp.lz"); + const u32 gMonBackPic_PikachuOriginal[] = INCBIN_U32("graphics/pokemon/pikachu/original/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuOriginal[] = INCBIN_U16("graphics/pokemon/pikachu/original/shiny.gbapal"); const u8 gMonIcon_PikachuOriginal[] = INCBIN_U8("graphics/pokemon/pikachu/original/icon.4bpp"); - const u32 gMonFrontPic_PikachuHoenn[] = INCBIN_U32("graphics/pokemon/pikachu/hoenn/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuHoenn[] = INCBIN_U32("graphics/pokemon/pikachu/hoenn/front.4bpp.smol"); const u16 gMonPalette_PikachuHoenn[] = INCBIN_U16("graphics/pokemon/pikachu/hoenn/normal.gbapal"); - const u32 gMonBackPic_PikachuHoenn[] = INCBIN_U32("graphics/pokemon/pikachu/hoenn/back.4bpp.lz"); + const u32 gMonBackPic_PikachuHoenn[] = INCBIN_U32("graphics/pokemon/pikachu/hoenn/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuHoenn[] = INCBIN_U16("graphics/pokemon/pikachu/hoenn/shiny.gbapal"); const u8 gMonIcon_PikachuHoenn[] = INCBIN_U8("graphics/pokemon/pikachu/hoenn/icon.4bpp"); - const u32 gMonFrontPic_PikachuSinnoh[] = INCBIN_U32("graphics/pokemon/pikachu/sinnoh/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuSinnoh[] = INCBIN_U32("graphics/pokemon/pikachu/sinnoh/front.4bpp.smol"); const u16 gMonPalette_PikachuSinnoh[] = INCBIN_U16("graphics/pokemon/pikachu/sinnoh/normal.gbapal"); - const u32 gMonBackPic_PikachuSinnoh[] = INCBIN_U32("graphics/pokemon/pikachu/sinnoh/back.4bpp.lz"); + const u32 gMonBackPic_PikachuSinnoh[] = INCBIN_U32("graphics/pokemon/pikachu/sinnoh/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuSinnoh[] = INCBIN_U16("graphics/pokemon/pikachu/sinnoh/shiny.gbapal"); const u8 gMonIcon_PikachuSinnoh[] = INCBIN_U8("graphics/pokemon/pikachu/sinnoh/icon.4bpp"); - const u32 gMonFrontPic_PikachuUnova[] = INCBIN_U32("graphics/pokemon/pikachu/unova/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuUnova[] = INCBIN_U32("graphics/pokemon/pikachu/unova/front.4bpp.smol"); const u16 gMonPalette_PikachuUnova[] = INCBIN_U16("graphics/pokemon/pikachu/unova/normal.gbapal"); - const u32 gMonBackPic_PikachuUnova[] = INCBIN_U32("graphics/pokemon/pikachu/unova/back.4bpp.lz"); + const u32 gMonBackPic_PikachuUnova[] = INCBIN_U32("graphics/pokemon/pikachu/unova/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuUnova[] = INCBIN_U16("graphics/pokemon/pikachu/unova/shiny.gbapal"); const u8 gMonIcon_PikachuUnova[] = INCBIN_U8("graphics/pokemon/pikachu/unova/icon.4bpp"); - const u32 gMonFrontPic_PikachuKalos[] = INCBIN_U32("graphics/pokemon/pikachu/kalos/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuKalos[] = INCBIN_U32("graphics/pokemon/pikachu/kalos/front.4bpp.smol"); const u16 gMonPalette_PikachuKalos[] = INCBIN_U16("graphics/pokemon/pikachu/kalos/normal.gbapal"); - const u32 gMonBackPic_PikachuKalos[] = INCBIN_U32("graphics/pokemon/pikachu/kalos/back.4bpp.lz"); + const u32 gMonBackPic_PikachuKalos[] = INCBIN_U32("graphics/pokemon/pikachu/kalos/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuKalos[] = INCBIN_U16("graphics/pokemon/pikachu/kalos/shiny.gbapal"); const u8 gMonIcon_PikachuKalos[] = INCBIN_U8("graphics/pokemon/pikachu/kalos/icon.4bpp"); - const u32 gMonFrontPic_PikachuAlola[] = INCBIN_U32("graphics/pokemon/pikachu/alola/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuAlola[] = INCBIN_U32("graphics/pokemon/pikachu/alola/front.4bpp.smol"); const u16 gMonPalette_PikachuAlola[] = INCBIN_U16("graphics/pokemon/pikachu/alola/normal.gbapal"); - const u32 gMonBackPic_PikachuAlola[] = INCBIN_U32("graphics/pokemon/pikachu/alola/back.4bpp.lz"); + const u32 gMonBackPic_PikachuAlola[] = INCBIN_U32("graphics/pokemon/pikachu/alola/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuAlola[] = INCBIN_U16("graphics/pokemon/pikachu/alola/shiny.gbapal"); const u8 gMonIcon_PikachuAlola[] = INCBIN_U8("graphics/pokemon/pikachu/alola/icon.4bpp"); - const u32 gMonFrontPic_PikachuPartner[] = INCBIN_U32("graphics/pokemon/pikachu/partner/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuPartner[] = INCBIN_U32("graphics/pokemon/pikachu/partner/front.4bpp.smol"); const u16 gMonPalette_PikachuPartner[] = INCBIN_U16("graphics/pokemon/pikachu/partner/normal.gbapal"); - const u32 gMonBackPic_PikachuPartner[] = INCBIN_U32("graphics/pokemon/pikachu/partner/back.4bpp.lz"); + const u32 gMonBackPic_PikachuPartner[] = INCBIN_U32("graphics/pokemon/pikachu/partner/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuPartner[] = INCBIN_U16("graphics/pokemon/pikachu/partner/shiny.gbapal"); const u8 gMonIcon_PikachuPartner[] = INCBIN_U8("graphics/pokemon/pikachu/partner/icon.4bpp"); - const u32 gMonFrontPic_PikachuWorld[] = INCBIN_U32("graphics/pokemon/pikachu/world/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuWorld[] = INCBIN_U32("graphics/pokemon/pikachu/world/front.4bpp.smol"); const u16 gMonPalette_PikachuWorld[] = INCBIN_U16("graphics/pokemon/pikachu/world/normal.gbapal"); - const u32 gMonBackPic_PikachuWorld[] = INCBIN_U32("graphics/pokemon/pikachu/world/back.4bpp.lz"); + const u32 gMonBackPic_PikachuWorld[] = INCBIN_U32("graphics/pokemon/pikachu/world/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuWorld[] = INCBIN_U16("graphics/pokemon/pikachu/world/shiny.gbapal"); const u8 gMonIcon_PikachuWorld[] = INCBIN_U8("graphics/pokemon/pikachu/world/icon.4bpp"); @@ -1078,8 +1078,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_CAP_PIKACHU_FORMS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_PikachuGmax[] = INCBIN_U32("graphics/pokemon/pikachu/gmax/front.4bpp.lz"); - const u32 gMonBackPic_PikachuGmax[] = INCBIN_U32("graphics/pokemon/pikachu/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_PikachuGmax[] = INCBIN_U32("graphics/pokemon/pikachu/gmax/front.4bpp.smol"); + const u32 gMonBackPic_PikachuGmax[] = INCBIN_U32("graphics/pokemon/pikachu/gmax/back.4bpp.smol"); const u16 gMonPalette_PikachuGmax[] = INCBIN_U16("graphics/pokemon/pikachu/gmax/normal.gbapal"); const u16 gMonShinyPalette_PikachuGmax[] = INCBIN_U16("graphics/pokemon/pikachu/gmax/shiny.gbapal"); const u8 gMonIcon_PikachuGmax[] = INCBIN_U8("graphics/pokemon/pikachu/gmax/icon.4bpp"); @@ -1098,14 +1098,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GENDER_DIFFERENCES && P_CUSTOM_GENDER_DIFF_ICONS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/anim_front.4bpp.smol"); const u16 gMonPalette_Raichu[] = INCBIN_U16("graphics/pokemon/raichu/normal.gbapal"); - const u32 gMonBackPic_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/back.4bpp.lz"); + const u32 gMonBackPic_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/back.4bpp.smol"); const u16 gMonShinyPalette_Raichu[] = INCBIN_U16("graphics/pokemon/raichu/shiny.gbapal"); #else - const u32 gMonFrontPic_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Raichu[] = INCBIN_U16("graphics/pokemon/raichu/normal_gba.gbapal"); - const u32 gMonBackPic_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/back_gba.4bpp.lz"); + const u32 gMonBackPic_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Raichu[] = INCBIN_U16("graphics/pokemon/raichu/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1125,16 +1125,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_RaichuF[] = INCBIN_U32("graphics/pokemon/raichu/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_RaichuF[] = INCBIN_U32("graphics/pokemon/raichu/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_RaichuF[] = INCBIN_COMP("graphics/pokemon/raichu/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_ALOLAN_FORMS - const u32 gMonFrontPic_RaichuAlola[] = INCBIN_U32("graphics/pokemon/raichu/alola/front.4bpp.lz"); + const u32 gMonFrontPic_RaichuAlola[] = INCBIN_U32("graphics/pokemon/raichu/alola/front.4bpp.smol"); const u16 gMonPalette_RaichuAlola[] = INCBIN_U16("graphics/pokemon/raichu/alola/normal.gbapal"); - const u32 gMonBackPic_RaichuAlola[] = INCBIN_U32("graphics/pokemon/raichu/alola/back.4bpp.lz"); + const u32 gMonBackPic_RaichuAlola[] = INCBIN_U32("graphics/pokemon/raichu/alola/back.4bpp.smol"); const u16 gMonShinyPalette_RaichuAlola[] = INCBIN_U16("graphics/pokemon/raichu/alola/shiny.gbapal"); const u8 gMonIcon_RaichuAlola[] = INCBIN_U8("graphics/pokemon/raichu/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -1149,14 +1149,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SANDSHREW #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/anim_front.4bpp.smol"); const u16 gMonPalette_Sandshrew[] = INCBIN_U16("graphics/pokemon/sandshrew/normal.gbapal"); - const u32 gMonBackPic_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/back.4bpp.lz"); + const u32 gMonBackPic_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/back.4bpp.smol"); const u16 gMonShinyPalette_Sandshrew[] = INCBIN_U16("graphics/pokemon/sandshrew/shiny.gbapal"); #else - const u32 gMonFrontPic_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Sandshrew[] = INCBIN_U16("graphics/pokemon/sandshrew/normal_gba.gbapal"); - const u32 gMonBackPic_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/back_gba.4bpp.lz"); + const u32 gMonBackPic_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Sandshrew[] = INCBIN_U16("graphics/pokemon/sandshrew/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1176,14 +1176,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/anim_front.4bpp.smol"); const u16 gMonPalette_Sandslash[] = INCBIN_U16("graphics/pokemon/sandslash/normal.gbapal"); - const u32 gMonBackPic_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/back.4bpp.lz"); + const u32 gMonBackPic_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/back.4bpp.smol"); const u16 gMonShinyPalette_Sandslash[] = INCBIN_U16("graphics/pokemon/sandslash/shiny.gbapal"); #else - const u32 gMonFrontPic_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Sandslash[] = INCBIN_U16("graphics/pokemon/sandslash/normal_gba.gbapal"); - const u32 gMonBackPic_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/back_gba.4bpp.lz"); + const u32 gMonBackPic_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Sandslash[] = INCBIN_U16("graphics/pokemon/sandslash/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1203,9 +1203,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_ALOLAN_FORMS - const u32 gMonFrontPic_SandshrewAlola[] = INCBIN_U32("graphics/pokemon/sandshrew/alola/front.4bpp.lz"); + const u32 gMonFrontPic_SandshrewAlola[] = INCBIN_U32("graphics/pokemon/sandshrew/alola/front.4bpp.smol"); const u16 gMonPalette_SandshrewAlola[] = INCBIN_U16("graphics/pokemon/sandshrew/alola/normal.gbapal"); - const u32 gMonBackPic_SandshrewAlola[] = INCBIN_U32("graphics/pokemon/sandshrew/alola/back.4bpp.lz"); + const u32 gMonBackPic_SandshrewAlola[] = INCBIN_U32("graphics/pokemon/sandshrew/alola/back.4bpp.smol"); const u16 gMonShinyPalette_SandshrewAlola[] = INCBIN_U16("graphics/pokemon/sandshrew/alola/shiny.gbapal"); const u8 gMonIcon_SandshrewAlola[] = INCBIN_U8("graphics/pokemon/sandshrew/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -1216,9 +1216,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_SandslashAlola[] = INCBIN_U32("graphics/pokemon/sandslash/alola/front.4bpp.lz"); + const u32 gMonFrontPic_SandslashAlola[] = INCBIN_U32("graphics/pokemon/sandslash/alola/front.4bpp.smol"); const u16 gMonPalette_SandslashAlola[] = INCBIN_U16("graphics/pokemon/sandslash/alola/normal.gbapal"); - const u32 gMonBackPic_SandslashAlola[] = INCBIN_U32("graphics/pokemon/sandslash/alola/back.4bpp.lz"); + const u32 gMonBackPic_SandslashAlola[] = INCBIN_U32("graphics/pokemon/sandslash/alola/back.4bpp.smol"); const u16 gMonShinyPalette_SandslashAlola[] = INCBIN_U16("graphics/pokemon/sandslash/alola/shiny.gbapal"); const u8 gMonIcon_SandslashAlola[] = INCBIN_U8("graphics/pokemon/sandslash/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -1233,14 +1233,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_NIDORAN #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/anim_front.4bpp.lz"); + const u32 gMonFrontPic_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/anim_front.4bpp.smol"); const u16 gMonPalette_NidoranF[] = INCBIN_U16("graphics/pokemon/nidoran_f/normal.gbapal"); - const u32 gMonBackPic_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/back.4bpp.lz"); + const u32 gMonBackPic_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/back.4bpp.smol"); const u16 gMonShinyPalette_NidoranF[] = INCBIN_U16("graphics/pokemon/nidoran_f/shiny.gbapal"); #else - const u32 gMonFrontPic_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/anim_front_gba.4bpp.smol"); const u16 gMonPalette_NidoranF[] = INCBIN_U16("graphics/pokemon/nidoran_f/normal_gba.gbapal"); - const u32 gMonBackPic_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/back_gba.4bpp.lz"); + const u32 gMonBackPic_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/back_gba.4bpp.smol"); const u16 gMonShinyPalette_NidoranF[] = INCBIN_U16("graphics/pokemon/nidoran_f/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1260,14 +1260,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/anim_front.4bpp.smol"); const u16 gMonPalette_Nidorina[] = INCBIN_U16("graphics/pokemon/nidorina/normal.gbapal"); - const u32 gMonBackPic_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/back.4bpp.lz"); + const u32 gMonBackPic_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/back.4bpp.smol"); const u16 gMonShinyPalette_Nidorina[] = INCBIN_U16("graphics/pokemon/nidorina/shiny.gbapal"); #else - const u32 gMonFrontPic_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Nidorina[] = INCBIN_U16("graphics/pokemon/nidorina/normal_gba.gbapal"); - const u32 gMonBackPic_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/back_gba.4bpp.lz"); + const u32 gMonBackPic_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Nidorina[] = INCBIN_U16("graphics/pokemon/nidorina/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1287,14 +1287,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/anim_front.4bpp.smol"); const u16 gMonPalette_Nidoqueen[] = INCBIN_U16("graphics/pokemon/nidoqueen/normal.gbapal"); - const u32 gMonBackPic_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/back.4bpp.lz"); + const u32 gMonBackPic_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/back.4bpp.smol"); const u16 gMonShinyPalette_Nidoqueen[] = INCBIN_U16("graphics/pokemon/nidoqueen/shiny.gbapal"); #else - const u32 gMonFrontPic_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Nidoqueen[] = INCBIN_U16("graphics/pokemon/nidoqueen/normal_gba.gbapal"); - const u32 gMonBackPic_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/back_gba.4bpp.lz"); + const u32 gMonBackPic_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Nidoqueen[] = INCBIN_U16("graphics/pokemon/nidoqueen/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1314,14 +1314,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/anim_front.4bpp.lz"); + const u32 gMonFrontPic_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/anim_front.4bpp.smol"); const u16 gMonPalette_NidoranM[] = INCBIN_U16("graphics/pokemon/nidoran_m/normal.gbapal"); - const u32 gMonBackPic_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/back.4bpp.lz"); + const u32 gMonBackPic_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/back.4bpp.smol"); const u16 gMonShinyPalette_NidoranM[] = INCBIN_U16("graphics/pokemon/nidoran_m/shiny.gbapal"); #else - const u32 gMonFrontPic_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/anim_front_gba.4bpp.smol"); const u16 gMonPalette_NidoranM[] = INCBIN_U16("graphics/pokemon/nidoran_m/normal_gba.gbapal"); - const u32 gMonBackPic_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/back_gba.4bpp.lz"); + const u32 gMonBackPic_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/back_gba.4bpp.smol"); const u16 gMonShinyPalette_NidoranM[] = INCBIN_U16("graphics/pokemon/nidoran_m/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1341,14 +1341,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/anim_front.4bpp.smol"); const u16 gMonPalette_Nidorino[] = INCBIN_U16("graphics/pokemon/nidorino/normal.gbapal"); - const u32 gMonBackPic_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/back.4bpp.lz"); + const u32 gMonBackPic_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/back.4bpp.smol"); const u16 gMonShinyPalette_Nidorino[] = INCBIN_U16("graphics/pokemon/nidorino/shiny.gbapal"); #else - const u32 gMonFrontPic_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Nidorino[] = INCBIN_U16("graphics/pokemon/nidorino/normal_gba.gbapal"); - const u32 gMonBackPic_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/back_gba.4bpp.lz"); + const u32 gMonBackPic_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Nidorino[] = INCBIN_U16("graphics/pokemon/nidorino/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1368,14 +1368,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/anim_front.4bpp.smol"); const u16 gMonPalette_Nidoking[] = INCBIN_U16("graphics/pokemon/nidoking/normal.gbapal"); - const u32 gMonBackPic_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/back.4bpp.lz"); + const u32 gMonBackPic_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/back.4bpp.smol"); const u16 gMonShinyPalette_Nidoking[] = INCBIN_U16("graphics/pokemon/nidoking/shiny.gbapal"); #else - const u32 gMonFrontPic_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Nidoking[] = INCBIN_U16("graphics/pokemon/nidoking/normal_gba.gbapal"); - const u32 gMonBackPic_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/back_gba.4bpp.lz"); + const u32 gMonBackPic_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Nidoking[] = INCBIN_U16("graphics/pokemon/nidoking/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1398,14 +1398,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CLEFAIRY #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/anim_front.4bpp.smol"); const u16 gMonPalette_Cleffa[] = INCBIN_U16("graphics/pokemon/cleffa/normal.gbapal"); - const u32 gMonBackPic_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/back.4bpp.lz"); + const u32 gMonBackPic_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/back.4bpp.smol"); const u16 gMonShinyPalette_Cleffa[] = INCBIN_U16("graphics/pokemon/cleffa/shiny.gbapal"); #else - const u32 gMonFrontPic_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Cleffa[] = INCBIN_U16("graphics/pokemon/cleffa/normal_gba.gbapal"); - const u32 gMonBackPic_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/back_gba.4bpp.lz"); + const u32 gMonBackPic_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Cleffa[] = INCBIN_U16("graphics/pokemon/cleffa/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1426,14 +1426,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/anim_front.4bpp.smol"); const u16 gMonPalette_Clefairy[] = INCBIN_U16("graphics/pokemon/clefairy/normal.gbapal"); - const u32 gMonBackPic_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/back.4bpp.lz"); + const u32 gMonBackPic_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/back.4bpp.smol"); const u16 gMonShinyPalette_Clefairy[] = INCBIN_U16("graphics/pokemon/clefairy/shiny.gbapal"); #else - const u32 gMonFrontPic_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Clefairy[] = INCBIN_U16("graphics/pokemon/clefairy/normal_gba.gbapal"); - const u32 gMonBackPic_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/back_gba.4bpp.lz"); + const u32 gMonBackPic_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Clefairy[] = INCBIN_U16("graphics/pokemon/clefairy/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1453,14 +1453,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/anim_front.4bpp.smol"); const u16 gMonPalette_Clefable[] = INCBIN_U16("graphics/pokemon/clefable/normal.gbapal"); - const u32 gMonBackPic_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/back.4bpp.lz"); + const u32 gMonBackPic_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/back.4bpp.smol"); const u16 gMonShinyPalette_Clefable[] = INCBIN_U16("graphics/pokemon/clefable/shiny.gbapal"); #else - const u32 gMonFrontPic_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Clefable[] = INCBIN_U16("graphics/pokemon/clefable/normal_gba.gbapal"); - const u32 gMonBackPic_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/back_gba.4bpp.lz"); + const u32 gMonBackPic_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Clefable[] = INCBIN_U16("graphics/pokemon/clefable/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1482,14 +1482,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_VULPIX #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/anim_front.4bpp.smol"); const u16 gMonPalette_Vulpix[] = INCBIN_U16("graphics/pokemon/vulpix/normal.gbapal"); - const u32 gMonBackPic_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/back.4bpp.lz"); + const u32 gMonBackPic_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/back.4bpp.smol"); const u16 gMonShinyPalette_Vulpix[] = INCBIN_U16("graphics/pokemon/vulpix/shiny.gbapal"); #else - const u32 gMonFrontPic_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Vulpix[] = INCBIN_U16("graphics/pokemon/vulpix/normal_gba.gbapal"); - const u32 gMonBackPic_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/back_gba.4bpp.lz"); + const u32 gMonBackPic_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Vulpix[] = INCBIN_U16("graphics/pokemon/vulpix/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1509,14 +1509,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/anim_front.4bpp.smol"); const u16 gMonPalette_Ninetales[] = INCBIN_U16("graphics/pokemon/ninetales/normal.gbapal"); - const u32 gMonBackPic_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/back.4bpp.lz"); + const u32 gMonBackPic_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/back.4bpp.smol"); const u16 gMonShinyPalette_Ninetales[] = INCBIN_U16("graphics/pokemon/ninetales/shiny.gbapal"); #else - const u32 gMonFrontPic_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ninetales[] = INCBIN_U16("graphics/pokemon/ninetales/normal_gba.gbapal"); - const u32 gMonBackPic_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ninetales[] = INCBIN_U16("graphics/pokemon/ninetales/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1536,9 +1536,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_ALOLAN_FORMS - const u32 gMonFrontPic_VulpixAlola[] = INCBIN_U32("graphics/pokemon/vulpix/alola/front.4bpp.lz"); + const u32 gMonFrontPic_VulpixAlola[] = INCBIN_U32("graphics/pokemon/vulpix/alola/front.4bpp.smol"); const u16 gMonPalette_VulpixAlola[] = INCBIN_U16("graphics/pokemon/vulpix/alola/normal.gbapal"); - const u32 gMonBackPic_VulpixAlola[] = INCBIN_U32("graphics/pokemon/vulpix/alola/back.4bpp.lz"); + const u32 gMonBackPic_VulpixAlola[] = INCBIN_U32("graphics/pokemon/vulpix/alola/back.4bpp.smol"); const u16 gMonShinyPalette_VulpixAlola[] = INCBIN_U16("graphics/pokemon/vulpix/alola/shiny.gbapal"); const u8 gMonIcon_VulpixAlola[] = INCBIN_U8("graphics/pokemon/vulpix/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -1549,9 +1549,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_NinetalesAlola[] = INCBIN_U32("graphics/pokemon/ninetales/alola/front.4bpp.lz"); + const u32 gMonFrontPic_NinetalesAlola[] = INCBIN_U32("graphics/pokemon/ninetales/alola/front.4bpp.smol"); const u16 gMonPalette_NinetalesAlola[] = INCBIN_U16("graphics/pokemon/ninetales/alola/normal.gbapal"); - const u32 gMonBackPic_NinetalesAlola[] = INCBIN_U32("graphics/pokemon/ninetales/alola/back.4bpp.lz"); + const u32 gMonBackPic_NinetalesAlola[] = INCBIN_U32("graphics/pokemon/ninetales/alola/back.4bpp.smol"); const u16 gMonShinyPalette_NinetalesAlola[] = INCBIN_U16("graphics/pokemon/ninetales/alola/shiny.gbapal"); const u8 gMonIcon_NinetalesAlola[] = INCBIN_U8("graphics/pokemon/ninetales/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -1567,14 +1567,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_JIGGLYPUFF #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/anim_front.4bpp.smol"); const u16 gMonPalette_Igglybuff[] = INCBIN_U16("graphics/pokemon/igglybuff/normal.gbapal"); - const u32 gMonBackPic_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/back.4bpp.lz"); + const u32 gMonBackPic_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/back.4bpp.smol"); const u16 gMonShinyPalette_Igglybuff[] = INCBIN_U16("graphics/pokemon/igglybuff/shiny.gbapal"); #else - const u32 gMonFrontPic_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Igglybuff[] = INCBIN_U16("graphics/pokemon/igglybuff/normal_gba.gbapal"); - const u32 gMonBackPic_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/back_gba.4bpp.lz"); + const u32 gMonBackPic_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Igglybuff[] = INCBIN_U16("graphics/pokemon/igglybuff/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1595,14 +1595,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/anim_front.4bpp.smol"); const u16 gMonPalette_Jigglypuff[] = INCBIN_U16("graphics/pokemon/jigglypuff/normal.gbapal"); - const u32 gMonBackPic_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/back.4bpp.lz"); + const u32 gMonBackPic_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/back.4bpp.smol"); const u16 gMonShinyPalette_Jigglypuff[] = INCBIN_U16("graphics/pokemon/jigglypuff/shiny.gbapal"); #else - const u32 gMonFrontPic_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Jigglypuff[] = INCBIN_U16("graphics/pokemon/jigglypuff/normal_gba.gbapal"); - const u32 gMonBackPic_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/back_gba.4bpp.lz"); + const u32 gMonBackPic_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Jigglypuff[] = INCBIN_U16("graphics/pokemon/jigglypuff/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1622,14 +1622,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/anim_front.4bpp.smol"); const u16 gMonPalette_Wigglytuff[] = INCBIN_U16("graphics/pokemon/wigglytuff/normal.gbapal"); - const u32 gMonBackPic_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/back.4bpp.lz"); + const u32 gMonBackPic_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/back.4bpp.smol"); const u16 gMonShinyPalette_Wigglytuff[] = INCBIN_U16("graphics/pokemon/wigglytuff/shiny.gbapal"); #else - const u32 gMonFrontPic_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Wigglytuff[] = INCBIN_U16("graphics/pokemon/wigglytuff/normal_gba.gbapal"); - const u32 gMonBackPic_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/back_gba.4bpp.lz"); + const u32 gMonBackPic_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Wigglytuff[] = INCBIN_U16("graphics/pokemon/wigglytuff/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1651,14 +1651,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ZUBAT #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/anim_front.4bpp.smol"); const u16 gMonPalette_Zubat[] = INCBIN_U16("graphics/pokemon/zubat/normal.gbapal"); - const u32 gMonBackPic_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/back.4bpp.lz"); + const u32 gMonBackPic_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/back.4bpp.smol"); const u16 gMonShinyPalette_Zubat[] = INCBIN_U16("graphics/pokemon/zubat/shiny.gbapal"); #else - const u32 gMonFrontPic_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Zubat[] = INCBIN_U16("graphics/pokemon/zubat/normal_gba.gbapal"); - const u32 gMonBackPic_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/back_gba.4bpp.lz"); + const u32 gMonBackPic_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Zubat[] = INCBIN_U16("graphics/pokemon/zubat/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1678,22 +1678,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_ZubatF[] = INCBIN_U32("graphics/pokemon/zubat/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_ZubatF[] = INCBIN_U32("graphics/pokemon/zubat/backf.4bpp.lz"); + const u32 gMonFrontPic_ZubatF[] = INCBIN_U32("graphics/pokemon/zubat/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_ZubatF[] = INCBIN_U32("graphics/pokemon/zubat/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_ZubatF[] = INCBIN_COMP("graphics/pokemon/zubat/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/anim_front.4bpp.smol"); const u16 gMonPalette_Golbat[] = INCBIN_U16("graphics/pokemon/golbat/normal.gbapal"); - const u32 gMonBackPic_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/back.4bpp.lz"); + const u32 gMonBackPic_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/back.4bpp.smol"); const u16 gMonShinyPalette_Golbat[] = INCBIN_U16("graphics/pokemon/golbat/shiny.gbapal"); #else - const u32 gMonFrontPic_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Golbat[] = INCBIN_U16("graphics/pokemon/golbat/normal_gba.gbapal"); - const u32 gMonBackPic_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/back_gba.4bpp.lz"); + const u32 gMonBackPic_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Golbat[] = INCBIN_U16("graphics/pokemon/golbat/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1713,8 +1713,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_GolbatF[] = INCBIN_U32("graphics/pokemon/golbat/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_GolbatF[] = INCBIN_U32("graphics/pokemon/golbat/backf.4bpp.lz"); + const u32 gMonFrontPic_GolbatF[] = INCBIN_U32("graphics/pokemon/golbat/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_GolbatF[] = INCBIN_U32("graphics/pokemon/golbat/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_GolbatF[] = INCBIN_COMP("graphics/pokemon/golbat/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -1722,14 +1722,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/anim_front.4bpp.smol"); const u16 gMonPalette_Crobat[] = INCBIN_U16("graphics/pokemon/crobat/normal.gbapal"); - const u32 gMonBackPic_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/back.4bpp.lz"); + const u32 gMonBackPic_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/back.4bpp.smol"); const u16 gMonShinyPalette_Crobat[] = INCBIN_U16("graphics/pokemon/crobat/shiny.gbapal"); #else - const u32 gMonFrontPic_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Crobat[] = INCBIN_U16("graphics/pokemon/crobat/normal_gba.gbapal"); - const u32 gMonBackPic_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/back_gba.4bpp.lz"); + const u32 gMonBackPic_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Crobat[] = INCBIN_U16("graphics/pokemon/crobat/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1752,14 +1752,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ODDISH #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/anim_front.4bpp.smol"); const u16 gMonPalette_Oddish[] = INCBIN_U16("graphics/pokemon/oddish/normal.gbapal"); - const u32 gMonBackPic_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/back.4bpp.lz"); + const u32 gMonBackPic_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/back.4bpp.smol"); const u16 gMonShinyPalette_Oddish[] = INCBIN_U16("graphics/pokemon/oddish/shiny.gbapal"); #else - const u32 gMonFrontPic_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Oddish[] = INCBIN_U16("graphics/pokemon/oddish/normal_gba.gbapal"); - const u32 gMonBackPic_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/back_gba.4bpp.lz"); + const u32 gMonBackPic_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Oddish[] = INCBIN_U16("graphics/pokemon/oddish/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1779,14 +1779,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/anim_front.4bpp.smol"); const u16 gMonPalette_Gloom[] = INCBIN_U16("graphics/pokemon/gloom/normal.gbapal"); - const u32 gMonBackPic_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/back.4bpp.lz"); + const u32 gMonBackPic_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/back.4bpp.smol"); const u16 gMonShinyPalette_Gloom[] = INCBIN_U16("graphics/pokemon/gloom/shiny.gbapal"); #else - const u32 gMonFrontPic_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Gloom[] = INCBIN_U16("graphics/pokemon/gloom/normal_gba.gbapal"); - const u32 gMonBackPic_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/back_gba.4bpp.lz"); + const u32 gMonBackPic_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Gloom[] = INCBIN_U16("graphics/pokemon/gloom/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1806,22 +1806,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_GloomF[] = INCBIN_U32("graphics/pokemon/gloom/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_GloomF[] = INCBIN_U32("graphics/pokemon/gloom/backf.4bpp.lz"); + const u32 gMonFrontPic_GloomF[] = INCBIN_U32("graphics/pokemon/gloom/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_GloomF[] = INCBIN_U32("graphics/pokemon/gloom/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_GloomF[] = INCBIN_COMP("graphics/pokemon/gloom/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/anim_front.4bpp.smol"); const u16 gMonPalette_Vileplume[] = INCBIN_U16("graphics/pokemon/vileplume/normal.gbapal"); - const u32 gMonBackPic_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/back.4bpp.lz"); + const u32 gMonBackPic_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/back.4bpp.smol"); const u16 gMonShinyPalette_Vileplume[] = INCBIN_U16("graphics/pokemon/vileplume/shiny.gbapal"); #else - const u32 gMonFrontPic_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Vileplume[] = INCBIN_U16("graphics/pokemon/vileplume/normal_gba.gbapal"); - const u32 gMonBackPic_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/back_gba.4bpp.lz"); + const u32 gMonBackPic_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Vileplume[] = INCBIN_U16("graphics/pokemon/vileplume/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1841,8 +1841,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_VileplumeF[] = INCBIN_U32("graphics/pokemon/vileplume/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_VileplumeF[] = INCBIN_U32("graphics/pokemon/vileplume/backf.4bpp.lz"); + const u32 gMonFrontPic_VileplumeF[] = INCBIN_U32("graphics/pokemon/vileplume/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_VileplumeF[] = INCBIN_U32("graphics/pokemon/vileplume/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_VileplumeF[] = INCBIN_COMP("graphics/pokemon/vileplume/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -1850,14 +1850,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/anim_front.4bpp.smol"); const u16 gMonPalette_Bellossom[] = INCBIN_U16("graphics/pokemon/bellossom/normal.gbapal"); - const u32 gMonBackPic_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/back.4bpp.lz"); + const u32 gMonBackPic_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/back.4bpp.smol"); const u16 gMonShinyPalette_Bellossom[] = INCBIN_U16("graphics/pokemon/bellossom/shiny.gbapal"); #else - const u32 gMonFrontPic_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Bellossom[] = INCBIN_U16("graphics/pokemon/bellossom/normal_gba.gbapal"); - const u32 gMonBackPic_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/back_gba.4bpp.lz"); + const u32 gMonBackPic_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Bellossom[] = INCBIN_U16("graphics/pokemon/bellossom/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1880,14 +1880,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_PARAS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Paras[] = INCBIN_U32("graphics/pokemon/paras/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Paras[] = INCBIN_U32("graphics/pokemon/paras/anim_front.4bpp.smol"); const u16 gMonPalette_Paras[] = INCBIN_U16("graphics/pokemon/paras/normal.gbapal"); - const u32 gMonBackPic_Paras[] = INCBIN_U32("graphics/pokemon/paras/back.4bpp.lz"); + const u32 gMonBackPic_Paras[] = INCBIN_U32("graphics/pokemon/paras/back.4bpp.smol"); const u16 gMonShinyPalette_Paras[] = INCBIN_U16("graphics/pokemon/paras/shiny.gbapal"); #else - const u32 gMonFrontPic_Paras[] = INCBIN_U32("graphics/pokemon/paras/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Paras[] = INCBIN_U32("graphics/pokemon/paras/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Paras[] = INCBIN_U16("graphics/pokemon/paras/normal_gba.gbapal"); - const u32 gMonBackPic_Paras[] = INCBIN_U32("graphics/pokemon/paras/back_gba.4bpp.lz"); + const u32 gMonBackPic_Paras[] = INCBIN_U32("graphics/pokemon/paras/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Paras[] = INCBIN_U16("graphics/pokemon/paras/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1907,14 +1907,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/anim_front.4bpp.smol"); const u16 gMonPalette_Parasect[] = INCBIN_U16("graphics/pokemon/parasect/normal.gbapal"); - const u32 gMonBackPic_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/back.4bpp.lz"); + const u32 gMonBackPic_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/back.4bpp.smol"); const u16 gMonShinyPalette_Parasect[] = INCBIN_U16("graphics/pokemon/parasect/shiny.gbapal"); #else - const u32 gMonFrontPic_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Parasect[] = INCBIN_U16("graphics/pokemon/parasect/normal_gba.gbapal"); - const u32 gMonBackPic_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/back_gba.4bpp.lz"); + const u32 gMonBackPic_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Parasect[] = INCBIN_U16("graphics/pokemon/parasect/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1936,14 +1936,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_VENONAT #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/anim_front.4bpp.smol"); const u16 gMonPalette_Venonat[] = INCBIN_U16("graphics/pokemon/venonat/normal.gbapal"); - const u32 gMonBackPic_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/back.4bpp.lz"); + const u32 gMonBackPic_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/back.4bpp.smol"); const u16 gMonShinyPalette_Venonat[] = INCBIN_U16("graphics/pokemon/venonat/shiny.gbapal"); #else - const u32 gMonFrontPic_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Venonat[] = INCBIN_U16("graphics/pokemon/venonat/normal_gba.gbapal"); - const u32 gMonBackPic_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/back_gba.4bpp.lz"); + const u32 gMonBackPic_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Venonat[] = INCBIN_U16("graphics/pokemon/venonat/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1963,14 +1963,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/anim_front.4bpp.smol"); const u16 gMonPalette_Venomoth[] = INCBIN_U16("graphics/pokemon/venomoth/normal.gbapal"); - const u32 gMonBackPic_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/back.4bpp.lz"); + const u32 gMonBackPic_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/back.4bpp.smol"); const u16 gMonShinyPalette_Venomoth[] = INCBIN_U16("graphics/pokemon/venomoth/shiny.gbapal"); #else - const u32 gMonFrontPic_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Venomoth[] = INCBIN_U16("graphics/pokemon/venomoth/normal_gba.gbapal"); - const u32 gMonBackPic_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/back_gba.4bpp.lz"); + const u32 gMonBackPic_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Venomoth[] = INCBIN_U16("graphics/pokemon/venomoth/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1992,14 +1992,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_DIGLETT #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/anim_front.4bpp.smol"); const u16 gMonPalette_Diglett[] = INCBIN_U16("graphics/pokemon/diglett/normal.gbapal"); - const u32 gMonBackPic_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/back.4bpp.lz"); + const u32 gMonBackPic_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/back.4bpp.smol"); const u16 gMonShinyPalette_Diglett[] = INCBIN_U16("graphics/pokemon/diglett/shiny.gbapal"); #else - const u32 gMonFrontPic_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Diglett[] = INCBIN_U16("graphics/pokemon/diglett/normal_gba.gbapal"); - const u32 gMonBackPic_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/back_gba.4bpp.lz"); + const u32 gMonBackPic_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Diglett[] = INCBIN_U16("graphics/pokemon/diglett/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2019,14 +2019,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/anim_front.4bpp.smol"); const u16 gMonPalette_Dugtrio[] = INCBIN_U16("graphics/pokemon/dugtrio/normal.gbapal"); - const u32 gMonBackPic_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/back.4bpp.lz"); + const u32 gMonBackPic_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/back.4bpp.smol"); const u16 gMonShinyPalette_Dugtrio[] = INCBIN_U16("graphics/pokemon/dugtrio/shiny.gbapal"); #else - const u32 gMonFrontPic_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Dugtrio[] = INCBIN_U16("graphics/pokemon/dugtrio/normal_gba.gbapal"); - const u32 gMonBackPic_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/back_gba.4bpp.lz"); + const u32 gMonBackPic_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Dugtrio[] = INCBIN_U16("graphics/pokemon/dugtrio/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2046,9 +2046,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_ALOLAN_FORMS - const u32 gMonFrontPic_DiglettAlola[] = INCBIN_U32("graphics/pokemon/diglett/alola/front.4bpp.lz"); + const u32 gMonFrontPic_DiglettAlola[] = INCBIN_U32("graphics/pokemon/diglett/alola/front.4bpp.smol"); const u16 gMonPalette_DiglettAlola[] = INCBIN_U16("graphics/pokemon/diglett/alola/normal.gbapal"); - const u32 gMonBackPic_DiglettAlola[] = INCBIN_U32("graphics/pokemon/diglett/alola/back.4bpp.lz"); + const u32 gMonBackPic_DiglettAlola[] = INCBIN_U32("graphics/pokemon/diglett/alola/back.4bpp.smol"); const u16 gMonShinyPalette_DiglettAlola[] = INCBIN_U16("graphics/pokemon/diglett/alola/shiny.gbapal"); const u8 gMonIcon_DiglettAlola[] = INCBIN_U8("graphics/pokemon/diglett/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -2059,9 +2059,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_DugtrioAlola[] = INCBIN_U32("graphics/pokemon/dugtrio/alola/front.4bpp.lz"); + const u32 gMonFrontPic_DugtrioAlola[] = INCBIN_U32("graphics/pokemon/dugtrio/alola/front.4bpp.smol"); const u16 gMonPalette_DugtrioAlola[] = INCBIN_U16("graphics/pokemon/dugtrio/alola/normal.gbapal"); - const u32 gMonBackPic_DugtrioAlola[] = INCBIN_U32("graphics/pokemon/dugtrio/alola/back.4bpp.lz"); + const u32 gMonBackPic_DugtrioAlola[] = INCBIN_U32("graphics/pokemon/dugtrio/alola/back.4bpp.smol"); const u16 gMonShinyPalette_DugtrioAlola[] = INCBIN_U16("graphics/pokemon/dugtrio/alola/shiny.gbapal"); const u8 gMonIcon_DugtrioAlola[] = INCBIN_U8("graphics/pokemon/dugtrio/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -2076,14 +2076,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MEOWTH #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/anim_front.4bpp.smol"); const u16 gMonPalette_Meowth[] = INCBIN_U16("graphics/pokemon/meowth/normal.gbapal"); - const u32 gMonBackPic_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/back.4bpp.lz"); + const u32 gMonBackPic_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/back.4bpp.smol"); const u16 gMonShinyPalette_Meowth[] = INCBIN_U16("graphics/pokemon/meowth/shiny.gbapal"); #else - const u32 gMonFrontPic_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Meowth[] = INCBIN_U16("graphics/pokemon/meowth/normal_gba.gbapal"); - const u32 gMonBackPic_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/back_gba.4bpp.lz"); + const u32 gMonBackPic_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Meowth[] = INCBIN_U16("graphics/pokemon/meowth/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2103,14 +2103,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Persian[] = INCBIN_U32("graphics/pokemon/persian/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Persian[] = INCBIN_U32("graphics/pokemon/persian/anim_front.4bpp.smol"); const u16 gMonPalette_Persian[] = INCBIN_U16("graphics/pokemon/persian/normal.gbapal"); - const u32 gMonBackPic_Persian[] = INCBIN_U32("graphics/pokemon/persian/back.4bpp.lz"); + const u32 gMonBackPic_Persian[] = INCBIN_U32("graphics/pokemon/persian/back.4bpp.smol"); const u16 gMonShinyPalette_Persian[] = INCBIN_U16("graphics/pokemon/persian/shiny.gbapal"); #else - const u32 gMonFrontPic_Persian[] = INCBIN_U32("graphics/pokemon/persian/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Persian[] = INCBIN_U32("graphics/pokemon/persian/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Persian[] = INCBIN_U16("graphics/pokemon/persian/normal_gba.gbapal"); - const u32 gMonBackPic_Persian[] = INCBIN_U32("graphics/pokemon/persian/back_gba.4bpp.lz"); + const u32 gMonBackPic_Persian[] = INCBIN_U32("graphics/pokemon/persian/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Persian[] = INCBIN_U16("graphics/pokemon/persian/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2130,9 +2130,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_ALOLAN_FORMS - const u32 gMonFrontPic_MeowthAlola[] = INCBIN_U32("graphics/pokemon/meowth/alola/front.4bpp.lz"); + const u32 gMonFrontPic_MeowthAlola[] = INCBIN_U32("graphics/pokemon/meowth/alola/front.4bpp.smol"); const u16 gMonPalette_MeowthAlola[] = INCBIN_U16("graphics/pokemon/meowth/alola/normal.gbapal"); - const u32 gMonBackPic_MeowthAlola[] = INCBIN_U32("graphics/pokemon/meowth/alola/back.4bpp.lz"); + const u32 gMonBackPic_MeowthAlola[] = INCBIN_U32("graphics/pokemon/meowth/alola/back.4bpp.smol"); const u16 gMonShinyPalette_MeowthAlola[] = INCBIN_U16("graphics/pokemon/meowth/alola/shiny.gbapal"); const u8 gMonIcon_MeowthAlola[] = INCBIN_U8("graphics/pokemon/meowth/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -2143,9 +2143,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_PersianAlola[] = INCBIN_U32("graphics/pokemon/persian/alola/front.4bpp.lz"); + const u32 gMonFrontPic_PersianAlola[] = INCBIN_U32("graphics/pokemon/persian/alola/front.4bpp.smol"); const u16 gMonPalette_PersianAlola[] = INCBIN_U16("graphics/pokemon/persian/alola/normal.gbapal"); - const u32 gMonBackPic_PersianAlola[] = INCBIN_U32("graphics/pokemon/persian/alola/back.4bpp.lz"); + const u32 gMonBackPic_PersianAlola[] = INCBIN_U32("graphics/pokemon/persian/alola/back.4bpp.smol"); const u16 gMonShinyPalette_PersianAlola[] = INCBIN_U16("graphics/pokemon/persian/alola/shiny.gbapal"); const u8 gMonIcon_PersianAlola[] = INCBIN_U8("graphics/pokemon/persian/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -2158,9 +2158,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_ALOLAN_FORMS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_MeowthGalar[] = INCBIN_U32("graphics/pokemon/meowth/galar/front.4bpp.lz"); + const u32 gMonFrontPic_MeowthGalar[] = INCBIN_U32("graphics/pokemon/meowth/galar/front.4bpp.smol"); const u16 gMonPalette_MeowthGalar[] = INCBIN_U16("graphics/pokemon/meowth/galar/normal.gbapal"); - const u32 gMonBackPic_MeowthGalar[] = INCBIN_U32("graphics/pokemon/meowth/galar/back.4bpp.lz"); + const u32 gMonBackPic_MeowthGalar[] = INCBIN_U32("graphics/pokemon/meowth/galar/back.4bpp.smol"); const u16 gMonShinyPalette_MeowthGalar[] = INCBIN_U16("graphics/pokemon/meowth/galar/shiny.gbapal"); const u8 gMonIcon_MeowthGalar[] = INCBIN_U8("graphics/pokemon/meowth/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -2171,9 +2171,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Perrserker[] = INCBIN_U32("graphics/pokemon/perrserker/front.4bpp.lz"); + const u32 gMonFrontPic_Perrserker[] = INCBIN_U32("graphics/pokemon/perrserker/front.4bpp.smol"); const u16 gMonPalette_Perrserker[] = INCBIN_U16("graphics/pokemon/perrserker/normal.gbapal"); - const u32 gMonBackPic_Perrserker[] = INCBIN_U32("graphics/pokemon/perrserker/back.4bpp.lz"); + const u32 gMonBackPic_Perrserker[] = INCBIN_U32("graphics/pokemon/perrserker/back.4bpp.smol"); const u16 gMonShinyPalette_Perrserker[] = INCBIN_U16("graphics/pokemon/perrserker/shiny.gbapal"); const u8 gMonIcon_Perrserker[] = INCBIN_U8("graphics/pokemon/perrserker/icon.4bpp"); #if P_FOOTPRINTS @@ -2189,8 +2189,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GALARIAN_FORMS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_MeowthGmax[] = INCBIN_U32("graphics/pokemon/meowth/gmax/front.4bpp.lz"); - const u32 gMonBackPic_MeowthGmax[] = INCBIN_U32("graphics/pokemon/meowth/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_MeowthGmax[] = INCBIN_U32("graphics/pokemon/meowth/gmax/front.4bpp.smol"); + const u32 gMonBackPic_MeowthGmax[] = INCBIN_U32("graphics/pokemon/meowth/gmax/back.4bpp.smol"); const u16 gMonPalette_MeowthGmax[] = INCBIN_U16("graphics/pokemon/meowth/gmax/normal.gbapal"); const u16 gMonShinyPalette_MeowthGmax[] = INCBIN_U16("graphics/pokemon/meowth/gmax/shiny.gbapal"); const u8 gMonIcon_MeowthGmax[] = INCBIN_U8("graphics/pokemon/meowth/gmax/icon.4bpp"); @@ -2206,14 +2206,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_PSYDUCK #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/anim_front.4bpp.smol"); const u16 gMonPalette_Psyduck[] = INCBIN_U16("graphics/pokemon/psyduck/normal.gbapal"); - const u32 gMonBackPic_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/back.4bpp.lz"); + const u32 gMonBackPic_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/back.4bpp.smol"); const u16 gMonShinyPalette_Psyduck[] = INCBIN_U16("graphics/pokemon/psyduck/shiny.gbapal"); #else - const u32 gMonFrontPic_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Psyduck[] = INCBIN_U16("graphics/pokemon/psyduck/normal_gba.gbapal"); - const u32 gMonBackPic_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/back_gba.4bpp.lz"); + const u32 gMonBackPic_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Psyduck[] = INCBIN_U16("graphics/pokemon/psyduck/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2233,14 +2233,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/anim_front.4bpp.smol"); const u16 gMonPalette_Golduck[] = INCBIN_U16("graphics/pokemon/golduck/normal.gbapal"); - const u32 gMonBackPic_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/back.4bpp.lz"); + const u32 gMonBackPic_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/back.4bpp.smol"); const u16 gMonShinyPalette_Golduck[] = INCBIN_U16("graphics/pokemon/golduck/shiny.gbapal"); #else - const u32 gMonFrontPic_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Golduck[] = INCBIN_U16("graphics/pokemon/golduck/normal_gba.gbapal"); - const u32 gMonBackPic_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/back_gba.4bpp.lz"); + const u32 gMonBackPic_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Golduck[] = INCBIN_U16("graphics/pokemon/golduck/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2262,14 +2262,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MANKEY #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/anim_front.4bpp.smol"); const u16 gMonPalette_Mankey[] = INCBIN_U16("graphics/pokemon/mankey/normal.gbapal"); - const u32 gMonBackPic_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/back.4bpp.lz"); + const u32 gMonBackPic_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/back.4bpp.smol"); const u16 gMonShinyPalette_Mankey[] = INCBIN_U16("graphics/pokemon/mankey/shiny.gbapal"); #else - const u32 gMonFrontPic_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Mankey[] = INCBIN_U16("graphics/pokemon/mankey/normal_gba.gbapal"); - const u32 gMonBackPic_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/back_gba.4bpp.lz"); + const u32 gMonBackPic_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Mankey[] = INCBIN_U16("graphics/pokemon/mankey/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2289,14 +2289,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/anim_front.4bpp.smol"); const u16 gMonPalette_Primeape[] = INCBIN_U16("graphics/pokemon/primeape/normal.gbapal"); - const u32 gMonBackPic_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/back.4bpp.lz"); + const u32 gMonBackPic_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/back.4bpp.smol"); const u16 gMonShinyPalette_Primeape[] = INCBIN_U16("graphics/pokemon/primeape/shiny.gbapal"); #else - const u32 gMonFrontPic_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Primeape[] = INCBIN_U16("graphics/pokemon/primeape/normal_gba.gbapal"); - const u32 gMonBackPic_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/back_gba.4bpp.lz"); + const u32 gMonBackPic_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Primeape[] = INCBIN_U16("graphics/pokemon/primeape/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2316,9 +2316,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_9_CROSS_EVOS - const u32 gMonFrontPic_Annihilape[] = INCBIN_U32("graphics/pokemon/annihilape/front.4bpp.lz"); + const u32 gMonFrontPic_Annihilape[] = INCBIN_U32("graphics/pokemon/annihilape/front.4bpp.smol"); const u16 gMonPalette_Annihilape[] = INCBIN_U16("graphics/pokemon/annihilape/normal.gbapal"); - const u32 gMonBackPic_Annihilape[] = INCBIN_U32("graphics/pokemon/annihilape/back.4bpp.lz"); + const u32 gMonBackPic_Annihilape[] = INCBIN_U32("graphics/pokemon/annihilape/back.4bpp.smol"); const u16 gMonShinyPalette_Annihilape[] = INCBIN_U16("graphics/pokemon/annihilape/shiny.gbapal"); const u8 gMonIcon_Annihilape[] = INCBIN_U8("graphics/pokemon/annihilape/icon.4bpp"); #if P_FOOTPRINTS @@ -2336,14 +2336,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_GROWLITHE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/anim_front.4bpp.smol"); const u16 gMonPalette_Growlithe[] = INCBIN_U16("graphics/pokemon/growlithe/normal.gbapal"); - const u32 gMonBackPic_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/back.4bpp.lz"); + const u32 gMonBackPic_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/back.4bpp.smol"); const u16 gMonShinyPalette_Growlithe[] = INCBIN_U16("graphics/pokemon/growlithe/shiny.gbapal"); #else - const u32 gMonFrontPic_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Growlithe[] = INCBIN_U16("graphics/pokemon/growlithe/normal_gba.gbapal"); - const u32 gMonBackPic_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/back_gba.4bpp.lz"); + const u32 gMonBackPic_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Growlithe[] = INCBIN_U16("graphics/pokemon/growlithe/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2363,14 +2363,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/anim_front.4bpp.smol"); const u16 gMonPalette_Arcanine[] = INCBIN_U16("graphics/pokemon/arcanine/normal.gbapal"); - const u32 gMonBackPic_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/back.4bpp.lz"); + const u32 gMonBackPic_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/back.4bpp.smol"); const u16 gMonShinyPalette_Arcanine[] = INCBIN_U16("graphics/pokemon/arcanine/shiny.gbapal"); #else - const u32 gMonFrontPic_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Arcanine[] = INCBIN_U16("graphics/pokemon/arcanine/normal_gba.gbapal"); - const u32 gMonBackPic_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/back_gba.4bpp.lz"); + const u32 gMonBackPic_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Arcanine[] = INCBIN_U16("graphics/pokemon/arcanine/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2390,9 +2390,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_GrowlitheHisui[] = INCBIN_U32("graphics/pokemon/growlithe/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_GrowlitheHisui[] = INCBIN_U32("graphics/pokemon/growlithe/hisui/front.4bpp.smol"); const u16 gMonPalette_GrowlitheHisui[] = INCBIN_U16("graphics/pokemon/growlithe/hisui/normal.gbapal"); - const u32 gMonBackPic_GrowlitheHisui[] = INCBIN_U32("graphics/pokemon/growlithe/hisui/back.4bpp.lz"); + const u32 gMonBackPic_GrowlitheHisui[] = INCBIN_U32("graphics/pokemon/growlithe/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_GrowlitheHisui[] = INCBIN_U16("graphics/pokemon/growlithe/hisui/shiny.gbapal"); const u8 gMonIcon_GrowlitheHisui[] = INCBIN_U8("graphics/pokemon/growlithe/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -2403,9 +2403,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_ArcanineHisui[] = INCBIN_U32("graphics/pokemon/arcanine/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_ArcanineHisui[] = INCBIN_U32("graphics/pokemon/arcanine/hisui/front.4bpp.smol"); const u16 gMonPalette_ArcanineHisui[] = INCBIN_U16("graphics/pokemon/arcanine/hisui/normal.gbapal"); - const u32 gMonBackPic_ArcanineHisui[] = INCBIN_U32("graphics/pokemon/arcanine/hisui/back.4bpp.lz"); + const u32 gMonBackPic_ArcanineHisui[] = INCBIN_U32("graphics/pokemon/arcanine/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_ArcanineHisui[] = INCBIN_U16("graphics/pokemon/arcanine/hisui/shiny.gbapal"); const u8 gMonIcon_ArcanineHisui[] = INCBIN_U8("graphics/pokemon/arcanine/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -2420,14 +2420,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_POLIWAG #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/anim_front.4bpp.smol"); const u16 gMonPalette_Poliwag[] = INCBIN_U16("graphics/pokemon/poliwag/normal.gbapal"); - const u32 gMonBackPic_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/back.4bpp.lz"); + const u32 gMonBackPic_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/back.4bpp.smol"); const u16 gMonShinyPalette_Poliwag[] = INCBIN_U16("graphics/pokemon/poliwag/shiny.gbapal"); #else - const u32 gMonFrontPic_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Poliwag[] = INCBIN_U16("graphics/pokemon/poliwag/normal_gba.gbapal"); - const u32 gMonBackPic_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/back_gba.4bpp.lz"); + const u32 gMonBackPic_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Poliwag[] = INCBIN_U16("graphics/pokemon/poliwag/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2447,14 +2447,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/anim_front.4bpp.smol"); const u16 gMonPalette_Poliwhirl[] = INCBIN_U16("graphics/pokemon/poliwhirl/normal.gbapal"); - const u32 gMonBackPic_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/back.4bpp.lz"); + const u32 gMonBackPic_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/back.4bpp.smol"); const u16 gMonShinyPalette_Poliwhirl[] = INCBIN_U16("graphics/pokemon/poliwhirl/shiny.gbapal"); #else - const u32 gMonFrontPic_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Poliwhirl[] = INCBIN_U16("graphics/pokemon/poliwhirl/normal_gba.gbapal"); - const u32 gMonBackPic_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/back_gba.4bpp.lz"); + const u32 gMonBackPic_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Poliwhirl[] = INCBIN_U16("graphics/pokemon/poliwhirl/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2474,14 +2474,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/anim_front.4bpp.smol"); const u16 gMonPalette_Poliwrath[] = INCBIN_U16("graphics/pokemon/poliwrath/normal.gbapal"); - const u32 gMonBackPic_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/back.4bpp.lz"); + const u32 gMonBackPic_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/back.4bpp.smol"); const u16 gMonShinyPalette_Poliwrath[] = INCBIN_U16("graphics/pokemon/poliwrath/shiny.gbapal"); #else - const u32 gMonFrontPic_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Poliwrath[] = INCBIN_U16("graphics/pokemon/poliwrath/normal_gba.gbapal"); - const u32 gMonBackPic_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/back_gba.4bpp.lz"); + const u32 gMonBackPic_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Poliwrath[] = INCBIN_U16("graphics/pokemon/poliwrath/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2502,14 +2502,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/anim_front.4bpp.smol"); const u16 gMonPalette_Politoed[] = INCBIN_U16("graphics/pokemon/politoed/normal.gbapal"); - const u32 gMonBackPic_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/back.4bpp.lz"); + const u32 gMonBackPic_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/back.4bpp.smol"); const u16 gMonShinyPalette_Politoed[] = INCBIN_U16("graphics/pokemon/politoed/shiny.gbapal"); #else - const u32 gMonFrontPic_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Politoed[] = INCBIN_U16("graphics/pokemon/politoed/normal_gba.gbapal"); - const u32 gMonBackPic_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/back_gba.4bpp.lz"); + const u32 gMonBackPic_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Politoed[] = INCBIN_U16("graphics/pokemon/politoed/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2529,8 +2529,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_PolitoedF[] = INCBIN_U32("graphics/pokemon/politoed/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_PolitoedF[] = INCBIN_U32("graphics/pokemon/politoed/backf.4bpp.lz"); + const u32 gMonFrontPic_PolitoedF[] = INCBIN_U32("graphics/pokemon/politoed/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_PolitoedF[] = INCBIN_U32("graphics/pokemon/politoed/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_PolitoedF[] = INCBIN_COMP("graphics/pokemon/politoed/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -2540,14 +2540,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ABRA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Abra[] = INCBIN_U32("graphics/pokemon/abra/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Abra[] = INCBIN_U32("graphics/pokemon/abra/anim_front.4bpp.smol"); const u16 gMonPalette_Abra[] = INCBIN_U16("graphics/pokemon/abra/normal.gbapal"); - const u32 gMonBackPic_Abra[] = INCBIN_U32("graphics/pokemon/abra/back.4bpp.lz"); + const u32 gMonBackPic_Abra[] = INCBIN_U32("graphics/pokemon/abra/back.4bpp.smol"); const u16 gMonShinyPalette_Abra[] = INCBIN_U16("graphics/pokemon/abra/shiny.gbapal"); #else - const u32 gMonFrontPic_Abra[] = INCBIN_U32("graphics/pokemon/abra/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Abra[] = INCBIN_U32("graphics/pokemon/abra/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Abra[] = INCBIN_U16("graphics/pokemon/abra/normal_gba.gbapal"); - const u32 gMonBackPic_Abra[] = INCBIN_U32("graphics/pokemon/abra/back_gba.4bpp.lz"); + const u32 gMonBackPic_Abra[] = INCBIN_U32("graphics/pokemon/abra/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Abra[] = INCBIN_U16("graphics/pokemon/abra/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2567,14 +2567,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/anim_front.4bpp.smol"); const u16 gMonPalette_Kadabra[] = INCBIN_U16("graphics/pokemon/kadabra/normal.gbapal"); - const u32 gMonBackPic_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/back.4bpp.lz"); + const u32 gMonBackPic_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/back.4bpp.smol"); const u16 gMonShinyPalette_Kadabra[] = INCBIN_U16("graphics/pokemon/kadabra/shiny.gbapal"); #else - const u32 gMonFrontPic_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Kadabra[] = INCBIN_U16("graphics/pokemon/kadabra/normal_gba.gbapal"); - const u32 gMonBackPic_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/back_gba.4bpp.lz"); + const u32 gMonBackPic_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Kadabra[] = INCBIN_U16("graphics/pokemon/kadabra/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2594,22 +2594,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_KadabraF[] = INCBIN_U32("graphics/pokemon/kadabra/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_KadabraF[] = INCBIN_U32("graphics/pokemon/kadabra/backf.4bpp.lz"); + const u32 gMonFrontPic_KadabraF[] = INCBIN_U32("graphics/pokemon/kadabra/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_KadabraF[] = INCBIN_U32("graphics/pokemon/kadabra/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_KadabraF[] = INCBIN_COMP("graphics/pokemon/kadabra/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/anim_front.4bpp.smol"); const u16 gMonPalette_Alakazam[] = INCBIN_U16("graphics/pokemon/alakazam/normal.gbapal"); - const u32 gMonBackPic_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/back.4bpp.lz"); + const u32 gMonBackPic_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/back.4bpp.smol"); const u16 gMonShinyPalette_Alakazam[] = INCBIN_U16("graphics/pokemon/alakazam/shiny.gbapal"); #else - const u32 gMonFrontPic_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Alakazam[] = INCBIN_U16("graphics/pokemon/alakazam/normal_gba.gbapal"); - const u32 gMonBackPic_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/back_gba.4bpp.lz"); + const u32 gMonBackPic_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Alakazam[] = INCBIN_U16("graphics/pokemon/alakazam/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2629,17 +2629,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_AlakazamF[] = INCBIN_U32("graphics/pokemon/alakazam/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_AlakazamF[] = INCBIN_U32("graphics/pokemon/alakazam/backf.4bpp.lz"); + const u32 gMonFrontPic_AlakazamF[] = INCBIN_U32("graphics/pokemon/alakazam/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_AlakazamF[] = INCBIN_U32("graphics/pokemon/alakazam/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_AlakazamF[] = INCBIN_COMP("graphics/pokemon/alakazam/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_AlakazamMega[] = INCBIN_U32("graphics/pokemon/alakazam/mega/front.4bpp.lz"); + const u32 gMonFrontPic_AlakazamMega[] = INCBIN_U32("graphics/pokemon/alakazam/mega/front.4bpp.smol"); const u16 gMonPalette_AlakazamMega[] = INCBIN_U16("graphics/pokemon/alakazam/mega/normal.gbapal"); - const u32 gMonBackPic_AlakazamMega[] = INCBIN_U32("graphics/pokemon/alakazam/mega/back.4bpp.lz"); + const u32 gMonBackPic_AlakazamMega[] = INCBIN_U32("graphics/pokemon/alakazam/mega/back.4bpp.smol"); const u16 gMonShinyPalette_AlakazamMega[] = INCBIN_U16("graphics/pokemon/alakazam/mega/shiny.gbapal"); const u8 gMonIcon_AlakazamMega[] = INCBIN_U8("graphics/pokemon/alakazam/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -2654,14 +2654,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MACHOP #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Machop[] = INCBIN_U32("graphics/pokemon/machop/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Machop[] = INCBIN_U32("graphics/pokemon/machop/anim_front.4bpp.smol"); const u16 gMonPalette_Machop[] = INCBIN_U16("graphics/pokemon/machop/normal.gbapal"); - const u32 gMonBackPic_Machop[] = INCBIN_U32("graphics/pokemon/machop/back.4bpp.lz"); + const u32 gMonBackPic_Machop[] = INCBIN_U32("graphics/pokemon/machop/back.4bpp.smol"); const u16 gMonShinyPalette_Machop[] = INCBIN_U16("graphics/pokemon/machop/shiny.gbapal"); #else - const u32 gMonFrontPic_Machop[] = INCBIN_U32("graphics/pokemon/machop/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Machop[] = INCBIN_U32("graphics/pokemon/machop/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Machop[] = INCBIN_U16("graphics/pokemon/machop/normal_gba.gbapal"); - const u32 gMonBackPic_Machop[] = INCBIN_U32("graphics/pokemon/machop/back_gba.4bpp.lz"); + const u32 gMonBackPic_Machop[] = INCBIN_U32("graphics/pokemon/machop/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Machop[] = INCBIN_U16("graphics/pokemon/machop/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2681,14 +2681,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/anim_front.4bpp.smol"); const u16 gMonPalette_Machoke[] = INCBIN_U16("graphics/pokemon/machoke/normal.gbapal"); - const u32 gMonBackPic_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/back.4bpp.lz"); + const u32 gMonBackPic_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/back.4bpp.smol"); const u16 gMonShinyPalette_Machoke[] = INCBIN_U16("graphics/pokemon/machoke/shiny.gbapal"); #else - const u32 gMonFrontPic_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Machoke[] = INCBIN_U16("graphics/pokemon/machoke/normal_gba.gbapal"); - const u32 gMonBackPic_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/back_gba.4bpp.lz"); + const u32 gMonBackPic_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Machoke[] = INCBIN_U16("graphics/pokemon/machoke/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2708,14 +2708,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/anim_front.4bpp.smol"); const u16 gMonPalette_Machamp[] = INCBIN_U16("graphics/pokemon/machamp/normal.gbapal"); - const u32 gMonBackPic_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/back.4bpp.lz"); + const u32 gMonBackPic_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/back.4bpp.smol"); const u16 gMonShinyPalette_Machamp[] = INCBIN_U16("graphics/pokemon/machamp/shiny.gbapal"); #else - const u32 gMonFrontPic_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Machamp[] = INCBIN_U16("graphics/pokemon/machamp/normal_gba.gbapal"); - const u32 gMonBackPic_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/back_gba.4bpp.lz"); + const u32 gMonBackPic_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Machamp[] = INCBIN_U16("graphics/pokemon/machamp/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2735,8 +2735,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_MachampGmax[] = INCBIN_U32("graphics/pokemon/machamp/gmax/front.4bpp.lz"); - const u32 gMonBackPic_MachampGmax[] = INCBIN_U32("graphics/pokemon/machamp/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_MachampGmax[] = INCBIN_U32("graphics/pokemon/machamp/gmax/front.4bpp.smol"); + const u32 gMonBackPic_MachampGmax[] = INCBIN_U32("graphics/pokemon/machamp/gmax/back.4bpp.smol"); const u16 gMonPalette_MachampGmax[] = INCBIN_U16("graphics/pokemon/machamp/gmax/normal.gbapal"); const u16 gMonShinyPalette_MachampGmax[] = INCBIN_U16("graphics/pokemon/machamp/gmax/shiny.gbapal"); const u8 gMonIcon_MachampGmax[] = INCBIN_U8("graphics/pokemon/machamp/gmax/icon.4bpp"); @@ -2752,14 +2752,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_BELLSPROUT #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/anim_front.4bpp.smol"); const u16 gMonPalette_Bellsprout[] = INCBIN_U16("graphics/pokemon/bellsprout/normal.gbapal"); - const u32 gMonBackPic_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/back.4bpp.lz"); + const u32 gMonBackPic_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/back.4bpp.smol"); const u16 gMonShinyPalette_Bellsprout[] = INCBIN_U16("graphics/pokemon/bellsprout/shiny.gbapal"); #else - const u32 gMonFrontPic_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Bellsprout[] = INCBIN_U16("graphics/pokemon/bellsprout/normal_gba.gbapal"); - const u32 gMonBackPic_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/back_gba.4bpp.lz"); + const u32 gMonBackPic_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Bellsprout[] = INCBIN_U16("graphics/pokemon/bellsprout/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2779,14 +2779,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/anim_front.4bpp.smol"); const u16 gMonPalette_Weepinbell[] = INCBIN_U16("graphics/pokemon/weepinbell/normal.gbapal"); - const u32 gMonBackPic_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/back.4bpp.lz"); + const u32 gMonBackPic_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/back.4bpp.smol"); const u16 gMonShinyPalette_Weepinbell[] = INCBIN_U16("graphics/pokemon/weepinbell/shiny.gbapal"); #else - const u32 gMonFrontPic_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Weepinbell[] = INCBIN_U16("graphics/pokemon/weepinbell/normal_gba.gbapal"); - const u32 gMonBackPic_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/back_gba.4bpp.lz"); + const u32 gMonBackPic_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Weepinbell[] = INCBIN_U16("graphics/pokemon/weepinbell/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2806,14 +2806,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/anim_front.4bpp.smol"); const u16 gMonPalette_Victreebel[] = INCBIN_U16("graphics/pokemon/victreebel/normal.gbapal"); - const u32 gMonBackPic_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/back.4bpp.lz"); + const u32 gMonBackPic_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/back.4bpp.smol"); const u16 gMonShinyPalette_Victreebel[] = INCBIN_U16("graphics/pokemon/victreebel/shiny.gbapal"); #else - const u32 gMonFrontPic_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Victreebel[] = INCBIN_U16("graphics/pokemon/victreebel/normal_gba.gbapal"); - const u32 gMonBackPic_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/back_gba.4bpp.lz"); + const u32 gMonBackPic_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Victreebel[] = INCBIN_U16("graphics/pokemon/victreebel/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2835,14 +2835,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TENTACOOL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/anim_front.4bpp.smol"); const u16 gMonPalette_Tentacool[] = INCBIN_U16("graphics/pokemon/tentacool/normal.gbapal"); - const u32 gMonBackPic_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/back.4bpp.lz"); + const u32 gMonBackPic_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/back.4bpp.smol"); const u16 gMonShinyPalette_Tentacool[] = INCBIN_U16("graphics/pokemon/tentacool/shiny.gbapal"); #else - const u32 gMonFrontPic_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Tentacool[] = INCBIN_U16("graphics/pokemon/tentacool/normal_gba.gbapal"); - const u32 gMonBackPic_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/back_gba.4bpp.lz"); + const u32 gMonBackPic_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Tentacool[] = INCBIN_U16("graphics/pokemon/tentacool/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2862,14 +2862,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/anim_front.4bpp.smol"); const u16 gMonPalette_Tentacruel[] = INCBIN_U16("graphics/pokemon/tentacruel/normal.gbapal"); - const u32 gMonBackPic_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/back.4bpp.lz"); + const u32 gMonBackPic_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/back.4bpp.smol"); const u16 gMonShinyPalette_Tentacruel[] = INCBIN_U16("graphics/pokemon/tentacruel/shiny.gbapal"); #else - const u32 gMonFrontPic_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Tentacruel[] = INCBIN_U16("graphics/pokemon/tentacruel/normal_gba.gbapal"); - const u32 gMonBackPic_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/back_gba.4bpp.lz"); + const u32 gMonBackPic_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Tentacruel[] = INCBIN_U16("graphics/pokemon/tentacruel/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2891,14 +2891,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_GEODUDE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/anim_front.4bpp.smol"); const u16 gMonPalette_Geodude[] = INCBIN_U16("graphics/pokemon/geodude/normal.gbapal"); - const u32 gMonBackPic_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/back.4bpp.lz"); + const u32 gMonBackPic_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/back.4bpp.smol"); const u16 gMonShinyPalette_Geodude[] = INCBIN_U16("graphics/pokemon/geodude/shiny.gbapal"); #else - const u32 gMonFrontPic_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Geodude[] = INCBIN_U16("graphics/pokemon/geodude/normal_gba.gbapal"); - const u32 gMonBackPic_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/back_gba.4bpp.lz"); + const u32 gMonBackPic_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Geodude[] = INCBIN_U16("graphics/pokemon/geodude/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2918,14 +2918,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/anim_front.4bpp.smol"); const u16 gMonPalette_Graveler[] = INCBIN_U16("graphics/pokemon/graveler/normal.gbapal"); - const u32 gMonBackPic_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/back.4bpp.lz"); + const u32 gMonBackPic_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/back.4bpp.smol"); const u16 gMonShinyPalette_Graveler[] = INCBIN_U16("graphics/pokemon/graveler/shiny.gbapal"); #else - const u32 gMonFrontPic_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Graveler[] = INCBIN_U16("graphics/pokemon/graveler/normal_gba.gbapal"); - const u32 gMonBackPic_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/back_gba.4bpp.lz"); + const u32 gMonBackPic_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Graveler[] = INCBIN_U16("graphics/pokemon/graveler/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2945,14 +2945,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Golem[] = INCBIN_U32("graphics/pokemon/golem/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Golem[] = INCBIN_U32("graphics/pokemon/golem/anim_front.4bpp.smol"); const u16 gMonPalette_Golem[] = INCBIN_U16("graphics/pokemon/golem/normal.gbapal"); - const u32 gMonBackPic_Golem[] = INCBIN_U32("graphics/pokemon/golem/back.4bpp.lz"); + const u32 gMonBackPic_Golem[] = INCBIN_U32("graphics/pokemon/golem/back.4bpp.smol"); const u16 gMonShinyPalette_Golem[] = INCBIN_U16("graphics/pokemon/golem/shiny.gbapal"); #else - const u32 gMonFrontPic_Golem[] = INCBIN_U32("graphics/pokemon/golem/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Golem[] = INCBIN_U32("graphics/pokemon/golem/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Golem[] = INCBIN_U16("graphics/pokemon/golem/normal_gba.gbapal"); - const u32 gMonBackPic_Golem[] = INCBIN_U32("graphics/pokemon/golem/back_gba.4bpp.lz"); + const u32 gMonBackPic_Golem[] = INCBIN_U32("graphics/pokemon/golem/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Golem[] = INCBIN_U16("graphics/pokemon/golem/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2976,9 +2976,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_ALOLAN_FORMS - const u32 gMonFrontPic_GeodudeAlola[] = INCBIN_U32("graphics/pokemon/geodude/alola/front.4bpp.lz"); + const u32 gMonFrontPic_GeodudeAlola[] = INCBIN_U32("graphics/pokemon/geodude/alola/front.4bpp.smol"); const u16 gMonPalette_GeodudeAlola[] = INCBIN_U16("graphics/pokemon/geodude/alola/normal.gbapal"); - const u32 gMonBackPic_GeodudeAlola[] = INCBIN_U32("graphics/pokemon/geodude/alola/back.4bpp.lz"); + const u32 gMonBackPic_GeodudeAlola[] = INCBIN_U32("graphics/pokemon/geodude/alola/back.4bpp.smol"); const u16 gMonShinyPalette_GeodudeAlola[] = INCBIN_U16("graphics/pokemon/geodude/alola/shiny.gbapal"); const u8 gMonIcon_GeodudeAlola[] = INCBIN_U8("graphics/pokemon/geodude/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -2989,9 +2989,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_GravelerAlola[] = INCBIN_U32("graphics/pokemon/graveler/alola/front.4bpp.lz"); + const u32 gMonFrontPic_GravelerAlola[] = INCBIN_U32("graphics/pokemon/graveler/alola/front.4bpp.smol"); const u16 gMonPalette_GravelerAlola[] = INCBIN_U16("graphics/pokemon/graveler/alola/normal.gbapal"); - const u32 gMonBackPic_GravelerAlola[] = INCBIN_U32("graphics/pokemon/graveler/alola/back.4bpp.lz"); + const u32 gMonBackPic_GravelerAlola[] = INCBIN_U32("graphics/pokemon/graveler/alola/back.4bpp.smol"); const u16 gMonShinyPalette_GravelerAlola[] = INCBIN_U16("graphics/pokemon/graveler/alola/shiny.gbapal"); const u8 gMonIcon_GravelerAlola[] = INCBIN_U8("graphics/pokemon/graveler/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -3002,9 +3002,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_GolemAlola[] = INCBIN_U32("graphics/pokemon/golem/alola/front.4bpp.lz"); + const u32 gMonFrontPic_GolemAlola[] = INCBIN_U32("graphics/pokemon/golem/alola/front.4bpp.smol"); const u16 gMonPalette_GolemAlola[] = INCBIN_U16("graphics/pokemon/golem/alola/normal.gbapal"); - const u32 gMonBackPic_GolemAlola[] = INCBIN_U32("graphics/pokemon/golem/alola/back.4bpp.lz"); + const u32 gMonBackPic_GolemAlola[] = INCBIN_U32("graphics/pokemon/golem/alola/back.4bpp.smol"); const u16 gMonShinyPalette_GolemAlola[] = INCBIN_U16("graphics/pokemon/golem/alola/shiny.gbapal"); const u8 gMonIcon_GolemAlola[] = INCBIN_U8("graphics/pokemon/golem/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -3019,14 +3019,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_PONYTA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/anim_front.4bpp.smol"); const u16 gMonPalette_Ponyta[] = INCBIN_U16("graphics/pokemon/ponyta/normal.gbapal"); - const u32 gMonBackPic_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/back.4bpp.lz"); + const u32 gMonBackPic_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/back.4bpp.smol"); const u16 gMonShinyPalette_Ponyta[] = INCBIN_U16("graphics/pokemon/ponyta/shiny.gbapal"); #else - const u32 gMonFrontPic_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ponyta[] = INCBIN_U16("graphics/pokemon/ponyta/normal_gba.gbapal"); - const u32 gMonBackPic_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ponyta[] = INCBIN_U16("graphics/pokemon/ponyta/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3046,14 +3046,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/anim_front.4bpp.smol"); const u16 gMonPalette_Rapidash[] = INCBIN_U16("graphics/pokemon/rapidash/normal.gbapal"); - const u32 gMonBackPic_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/back.4bpp.lz"); + const u32 gMonBackPic_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/back.4bpp.smol"); const u16 gMonShinyPalette_Rapidash[] = INCBIN_U16("graphics/pokemon/rapidash/shiny.gbapal"); #else - const u32 gMonFrontPic_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Rapidash[] = INCBIN_U16("graphics/pokemon/rapidash/normal_gba.gbapal"); - const u32 gMonBackPic_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/back_gba.4bpp.lz"); + const u32 gMonBackPic_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Rapidash[] = INCBIN_U16("graphics/pokemon/rapidash/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3073,9 +3073,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_PonytaGalar[] = INCBIN_U32("graphics/pokemon/ponyta/galar/front.4bpp.lz"); + const u32 gMonFrontPic_PonytaGalar[] = INCBIN_U32("graphics/pokemon/ponyta/galar/front.4bpp.smol"); const u16 gMonPalette_PonytaGalar[] = INCBIN_U16("graphics/pokemon/ponyta/galar/normal.gbapal"); - const u32 gMonBackPic_PonytaGalar[] = INCBIN_U32("graphics/pokemon/ponyta/galar/back.4bpp.lz"); + const u32 gMonBackPic_PonytaGalar[] = INCBIN_U32("graphics/pokemon/ponyta/galar/back.4bpp.smol"); const u16 gMonShinyPalette_PonytaGalar[] = INCBIN_U16("graphics/pokemon/ponyta/galar/shiny.gbapal"); const u8 gMonIcon_PonytaGalar[] = INCBIN_U8("graphics/pokemon/ponyta/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -3086,9 +3086,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_RapidashGalar[] = INCBIN_U32("graphics/pokemon/rapidash/galar/front.4bpp.lz"); + const u32 gMonFrontPic_RapidashGalar[] = INCBIN_U32("graphics/pokemon/rapidash/galar/front.4bpp.smol"); const u16 gMonPalette_RapidashGalar[] = INCBIN_U16("graphics/pokemon/rapidash/galar/normal.gbapal"); - const u32 gMonBackPic_RapidashGalar[] = INCBIN_U32("graphics/pokemon/rapidash/galar/back.4bpp.lz"); + const u32 gMonBackPic_RapidashGalar[] = INCBIN_U32("graphics/pokemon/rapidash/galar/back.4bpp.smol"); const u16 gMonShinyPalette_RapidashGalar[] = INCBIN_U16("graphics/pokemon/rapidash/galar/shiny.gbapal"); const u8 gMonIcon_RapidashGalar[] = INCBIN_U8("graphics/pokemon/rapidash/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -3103,14 +3103,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SLOWPOKE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/anim_front.4bpp.smol"); const u16 gMonPalette_Slowpoke[] = INCBIN_U16("graphics/pokemon/slowpoke/normal.gbapal"); - const u32 gMonBackPic_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/back.4bpp.lz"); + const u32 gMonBackPic_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/back.4bpp.smol"); const u16 gMonShinyPalette_Slowpoke[] = INCBIN_U16("graphics/pokemon/slowpoke/shiny.gbapal"); #else - const u32 gMonFrontPic_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Slowpoke[] = INCBIN_U16("graphics/pokemon/slowpoke/normal_gba.gbapal"); - const u32 gMonBackPic_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/back_gba.4bpp.lz"); + const u32 gMonBackPic_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Slowpoke[] = INCBIN_U16("graphics/pokemon/slowpoke/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3130,14 +3130,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/anim_front.4bpp.smol"); const u16 gMonPalette_Slowbro[] = INCBIN_U16("graphics/pokemon/slowbro/normal.gbapal"); - const u32 gMonBackPic_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/back.4bpp.lz"); + const u32 gMonBackPic_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/back.4bpp.smol"); const u16 gMonShinyPalette_Slowbro[] = INCBIN_U16("graphics/pokemon/slowbro/shiny.gbapal"); #else - const u32 gMonFrontPic_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Slowbro[] = INCBIN_U16("graphics/pokemon/slowbro/normal_gba.gbapal"); - const u32 gMonBackPic_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/back_gba.4bpp.lz"); + const u32 gMonBackPic_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Slowbro[] = INCBIN_U16("graphics/pokemon/slowbro/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3158,14 +3158,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/anim_front.4bpp.smol"); const u16 gMonPalette_Slowking[] = INCBIN_U16("graphics/pokemon/slowking/normal.gbapal"); - const u32 gMonBackPic_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/back.4bpp.lz"); + const u32 gMonBackPic_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/back.4bpp.smol"); const u16 gMonShinyPalette_Slowking[] = INCBIN_U16("graphics/pokemon/slowking/shiny.gbapal"); #else - const u32 gMonFrontPic_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Slowking[] = INCBIN_U16("graphics/pokemon/slowking/normal_gba.gbapal"); - const u32 gMonBackPic_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/back_gba.4bpp.lz"); + const u32 gMonBackPic_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Slowking[] = INCBIN_U16("graphics/pokemon/slowking/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3186,9 +3186,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_2_CROSS_EVOS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_SlowbroMega[] = INCBIN_U32("graphics/pokemon/slowbro/mega/front.4bpp.lz"); + const u32 gMonFrontPic_SlowbroMega[] = INCBIN_U32("graphics/pokemon/slowbro/mega/front.4bpp.smol"); const u16 gMonPalette_SlowbroMega[] = INCBIN_U16("graphics/pokemon/slowbro/mega/normal.gbapal"); - const u32 gMonBackPic_SlowbroMega[] = INCBIN_U32("graphics/pokemon/slowbro/mega/back.4bpp.lz"); + const u32 gMonBackPic_SlowbroMega[] = INCBIN_U32("graphics/pokemon/slowbro/mega/back.4bpp.smol"); const u16 gMonShinyPalette_SlowbroMega[] = INCBIN_U16("graphics/pokemon/slowbro/mega/shiny.gbapal"); const u8 gMonIcon_SlowbroMega[] = INCBIN_U8("graphics/pokemon/slowbro/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -3201,9 +3201,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_MEGA_EVOLUTIONS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_SlowpokeGalar[] = INCBIN_U32("graphics/pokemon/slowpoke/galar/front.4bpp.lz"); + const u32 gMonFrontPic_SlowpokeGalar[] = INCBIN_U32("graphics/pokemon/slowpoke/galar/front.4bpp.smol"); const u16 gMonPalette_SlowpokeGalar[] = INCBIN_U16("graphics/pokemon/slowpoke/galar/normal.gbapal"); - const u32 gMonBackPic_SlowpokeGalar[] = INCBIN_U32("graphics/pokemon/slowpoke/galar/back.4bpp.lz"); + const u32 gMonBackPic_SlowpokeGalar[] = INCBIN_U32("graphics/pokemon/slowpoke/galar/back.4bpp.smol"); const u16 gMonShinyPalette_SlowpokeGalar[] = INCBIN_U16("graphics/pokemon/slowpoke/galar/shiny.gbapal"); const u8 gMonIcon_SlowpokeGalar[] = INCBIN_U8("graphics/pokemon/slowpoke/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -3214,9 +3214,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_SlowbroGalar[] = INCBIN_U32("graphics/pokemon/slowbro/galar/front.4bpp.lz"); + const u32 gMonFrontPic_SlowbroGalar[] = INCBIN_U32("graphics/pokemon/slowbro/galar/front.4bpp.smol"); const u16 gMonPalette_SlowbroGalar[] = INCBIN_U16("graphics/pokemon/slowbro/galar/normal.gbapal"); - const u32 gMonBackPic_SlowbroGalar[] = INCBIN_U32("graphics/pokemon/slowbro/galar/back.4bpp.lz"); + const u32 gMonBackPic_SlowbroGalar[] = INCBIN_U32("graphics/pokemon/slowbro/galar/back.4bpp.smol"); const u16 gMonShinyPalette_SlowbroGalar[] = INCBIN_U16("graphics/pokemon/slowbro/galar/shiny.gbapal"); const u8 gMonIcon_SlowbroGalar[] = INCBIN_U8("graphics/pokemon/slowbro/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -3228,9 +3228,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_2_CROSS_EVOS - const u32 gMonFrontPic_SlowkingGalar[] = INCBIN_U32("graphics/pokemon/slowking/galar/front.4bpp.lz"); + const u32 gMonFrontPic_SlowkingGalar[] = INCBIN_U32("graphics/pokemon/slowking/galar/front.4bpp.smol"); const u16 gMonPalette_SlowkingGalar[] = INCBIN_U16("graphics/pokemon/slowking/galar/normal.gbapal"); - const u32 gMonBackPic_SlowkingGalar[] = INCBIN_U32("graphics/pokemon/slowking/galar/back.4bpp.lz"); + const u32 gMonBackPic_SlowkingGalar[] = INCBIN_U32("graphics/pokemon/slowking/galar/back.4bpp.smol"); const u16 gMonShinyPalette_SlowkingGalar[] = INCBIN_U16("graphics/pokemon/slowking/galar/shiny.gbapal"); const u8 gMonIcon_SlowkingGalar[] = INCBIN_U8("graphics/pokemon/slowking/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -3246,14 +3246,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MAGNEMITE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/anim_front.4bpp.smol"); const u16 gMonPalette_Magnemite[] = INCBIN_U16("graphics/pokemon/magnemite/normal.gbapal"); - const u32 gMonBackPic_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/back.4bpp.lz"); + const u32 gMonBackPic_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/back.4bpp.smol"); const u16 gMonShinyPalette_Magnemite[] = INCBIN_U16("graphics/pokemon/magnemite/shiny.gbapal"); #else - const u32 gMonFrontPic_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Magnemite[] = INCBIN_U16("graphics/pokemon/magnemite/normal_gba.gbapal"); - const u32 gMonBackPic_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/back_gba.4bpp.lz"); + const u32 gMonBackPic_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Magnemite[] = INCBIN_U16("graphics/pokemon/magnemite/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3273,14 +3273,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/anim_front.4bpp.smol"); const u16 gMonPalette_Magneton[] = INCBIN_U16("graphics/pokemon/magneton/normal.gbapal"); - const u32 gMonBackPic_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/back.4bpp.lz"); + const u32 gMonBackPic_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/back.4bpp.smol"); const u16 gMonShinyPalette_Magneton[] = INCBIN_U16("graphics/pokemon/magneton/shiny.gbapal"); #else - const u32 gMonFrontPic_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Magneton[] = INCBIN_U16("graphics/pokemon/magneton/normal_gba.gbapal"); - const u32 gMonBackPic_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/back_gba.4bpp.lz"); + const u32 gMonBackPic_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Magneton[] = INCBIN_U16("graphics/pokemon/magneton/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3300,9 +3300,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Magnezone[] = INCBIN_U32("graphics/pokemon/magnezone/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Magnezone[] = INCBIN_U32("graphics/pokemon/magnezone/anim_front.4bpp.smol"); const u16 gMonPalette_Magnezone[] = INCBIN_U16("graphics/pokemon/magnezone/normal.gbapal"); - const u32 gMonBackPic_Magnezone[] = INCBIN_U32("graphics/pokemon/magnezone/back.4bpp.lz"); + const u32 gMonBackPic_Magnezone[] = INCBIN_U32("graphics/pokemon/magnezone/back.4bpp.smol"); const u16 gMonShinyPalette_Magnezone[] = INCBIN_U16("graphics/pokemon/magnezone/shiny.gbapal"); const u8 gMonIcon_Magnezone[] = INCBIN_U8("graphics/pokemon/magnezone/icon.4bpp"); #if P_FOOTPRINTS @@ -3320,14 +3320,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_FARFETCHD #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetchd/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetchd/anim_front.4bpp.smol"); const u16 gMonPalette_Farfetchd[] = INCBIN_U16("graphics/pokemon/farfetchd/normal.gbapal"); - const u32 gMonBackPic_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetchd/back.4bpp.lz"); + const u32 gMonBackPic_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetchd/back.4bpp.smol"); const u16 gMonShinyPalette_Farfetchd[] = INCBIN_U16("graphics/pokemon/farfetchd/shiny.gbapal"); #else - const u32 gMonFrontPic_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetchd/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetchd/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Farfetchd[] = INCBIN_U16("graphics/pokemon/farfetchd/normal_gba.gbapal"); - const u32 gMonBackPic_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetchd/back_gba.4bpp.lz"); + const u32 gMonBackPic_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetchd/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Farfetchd[] = INCBIN_U16("graphics/pokemon/farfetchd/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3347,9 +3347,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_FarfetchdGalar[] = INCBIN_U32("graphics/pokemon/farfetchd/galar/front.4bpp.lz"); + const u32 gMonFrontPic_FarfetchdGalar[] = INCBIN_U32("graphics/pokemon/farfetchd/galar/front.4bpp.smol"); const u16 gMonPalette_FarfetchdGalar[] = INCBIN_U16("graphics/pokemon/farfetchd/galar/normal.gbapal"); - const u32 gMonBackPic_FarfetchdGalar[] = INCBIN_U32("graphics/pokemon/farfetchd/galar/back.4bpp.lz"); + const u32 gMonBackPic_FarfetchdGalar[] = INCBIN_U32("graphics/pokemon/farfetchd/galar/back.4bpp.smol"); const u16 gMonShinyPalette_FarfetchdGalar[] = INCBIN_U16("graphics/pokemon/farfetchd/galar/shiny.gbapal"); const u8 gMonIcon_FarfetchdGalar[] = INCBIN_U8("graphics/pokemon/farfetchd/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -3360,9 +3360,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Sirfetchd[] = INCBIN_U32("graphics/pokemon/sirfetchd/front.4bpp.lz"); + const u32 gMonFrontPic_Sirfetchd[] = INCBIN_U32("graphics/pokemon/sirfetchd/front.4bpp.smol"); const u16 gMonPalette_Sirfetchd[] = INCBIN_U16("graphics/pokemon/sirfetchd/normal.gbapal"); - const u32 gMonBackPic_Sirfetchd[] = INCBIN_U32("graphics/pokemon/sirfetchd/back.4bpp.lz"); + const u32 gMonBackPic_Sirfetchd[] = INCBIN_U32("graphics/pokemon/sirfetchd/back.4bpp.smol"); const u16 gMonShinyPalette_Sirfetchd[] = INCBIN_U16("graphics/pokemon/sirfetchd/shiny.gbapal"); const u8 gMonIcon_Sirfetchd[] = INCBIN_U8("graphics/pokemon/sirfetchd/icon.4bpp"); #if P_FOOTPRINTS @@ -3380,14 +3380,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_DODUO #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/anim_front.4bpp.smol"); const u16 gMonPalette_Doduo[] = INCBIN_U16("graphics/pokemon/doduo/normal.gbapal"); - const u32 gMonBackPic_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/back.4bpp.lz"); + const u32 gMonBackPic_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/back.4bpp.smol"); const u16 gMonShinyPalette_Doduo[] = INCBIN_U16("graphics/pokemon/doduo/shiny.gbapal"); #else - const u32 gMonFrontPic_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Doduo[] = INCBIN_U16("graphics/pokemon/doduo/normal_gba.gbapal"); - const u32 gMonBackPic_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/back_gba.4bpp.lz"); + const u32 gMonBackPic_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Doduo[] = INCBIN_U16("graphics/pokemon/doduo/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3407,22 +3407,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_DoduoF[] = INCBIN_U32("graphics/pokemon/doduo/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_DoduoF[] = INCBIN_U32("graphics/pokemon/doduo/backf.4bpp.lz"); + const u32 gMonFrontPic_DoduoF[] = INCBIN_U32("graphics/pokemon/doduo/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_DoduoF[] = INCBIN_U32("graphics/pokemon/doduo/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_DoduoF[] = INCBIN_COMP("graphics/pokemon/doduo/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/anim_front.4bpp.smol"); const u16 gMonPalette_Dodrio[] = INCBIN_U16("graphics/pokemon/dodrio/normal.gbapal"); - const u32 gMonBackPic_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/back.4bpp.lz"); + const u32 gMonBackPic_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/back.4bpp.smol"); const u16 gMonShinyPalette_Dodrio[] = INCBIN_U16("graphics/pokemon/dodrio/shiny.gbapal"); #else - const u32 gMonFrontPic_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Dodrio[] = INCBIN_U16("graphics/pokemon/dodrio/normal_gba.gbapal"); - const u32 gMonBackPic_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/back_gba.4bpp.lz"); + const u32 gMonBackPic_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Dodrio[] = INCBIN_U16("graphics/pokemon/dodrio/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3442,8 +3442,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_DodrioF[] = INCBIN_U32("graphics/pokemon/dodrio/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_DodrioF[] = INCBIN_U32("graphics/pokemon/dodrio/backf.4bpp.lz"); + const u32 gMonFrontPic_DodrioF[] = INCBIN_U32("graphics/pokemon/dodrio/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_DodrioF[] = INCBIN_U32("graphics/pokemon/dodrio/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_DodrioF[] = INCBIN_COMP("graphics/pokemon/dodrio/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -3452,14 +3452,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SEEL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Seel[] = INCBIN_U32("graphics/pokemon/seel/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Seel[] = INCBIN_U32("graphics/pokemon/seel/anim_front.4bpp.smol"); const u16 gMonPalette_Seel[] = INCBIN_U16("graphics/pokemon/seel/normal.gbapal"); - const u32 gMonBackPic_Seel[] = INCBIN_U32("graphics/pokemon/seel/back.4bpp.lz"); + const u32 gMonBackPic_Seel[] = INCBIN_U32("graphics/pokemon/seel/back.4bpp.smol"); const u16 gMonShinyPalette_Seel[] = INCBIN_U16("graphics/pokemon/seel/shiny.gbapal"); #else - const u32 gMonFrontPic_Seel[] = INCBIN_U32("graphics/pokemon/seel/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Seel[] = INCBIN_U32("graphics/pokemon/seel/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Seel[] = INCBIN_U16("graphics/pokemon/seel/normal_gba.gbapal"); - const u32 gMonBackPic_Seel[] = INCBIN_U32("graphics/pokemon/seel/back_gba.4bpp.lz"); + const u32 gMonBackPic_Seel[] = INCBIN_U32("graphics/pokemon/seel/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Seel[] = INCBIN_U16("graphics/pokemon/seel/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3479,14 +3479,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/anim_front.4bpp.smol"); const u16 gMonPalette_Dewgong[] = INCBIN_U16("graphics/pokemon/dewgong/normal.gbapal"); - const u32 gMonBackPic_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/back.4bpp.lz"); + const u32 gMonBackPic_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/back.4bpp.smol"); const u16 gMonShinyPalette_Dewgong[] = INCBIN_U16("graphics/pokemon/dewgong/shiny.gbapal"); #else - const u32 gMonFrontPic_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Dewgong[] = INCBIN_U16("graphics/pokemon/dewgong/normal_gba.gbapal"); - const u32 gMonBackPic_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/back_gba.4bpp.lz"); + const u32 gMonBackPic_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Dewgong[] = INCBIN_U16("graphics/pokemon/dewgong/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3508,14 +3508,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_GRIMER #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/anim_front.4bpp.smol"); const u16 gMonPalette_Grimer[] = INCBIN_U16("graphics/pokemon/grimer/normal.gbapal"); - const u32 gMonBackPic_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/back.4bpp.lz"); + const u32 gMonBackPic_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/back.4bpp.smol"); const u16 gMonShinyPalette_Grimer[] = INCBIN_U16("graphics/pokemon/grimer/shiny.gbapal"); #else - const u32 gMonFrontPic_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Grimer[] = INCBIN_U16("graphics/pokemon/grimer/normal_gba.gbapal"); - const u32 gMonBackPic_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/back_gba.4bpp.lz"); + const u32 gMonBackPic_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Grimer[] = INCBIN_U16("graphics/pokemon/grimer/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3535,14 +3535,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Muk[] = INCBIN_U32("graphics/pokemon/muk/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Muk[] = INCBIN_U32("graphics/pokemon/muk/anim_front.4bpp.smol"); const u16 gMonPalette_Muk[] = INCBIN_U16("graphics/pokemon/muk/normal.gbapal"); - const u32 gMonBackPic_Muk[] = INCBIN_U32("graphics/pokemon/muk/back.4bpp.lz"); + const u32 gMonBackPic_Muk[] = INCBIN_U32("graphics/pokemon/muk/back.4bpp.smol"); const u16 gMonShinyPalette_Muk[] = INCBIN_U16("graphics/pokemon/muk/shiny.gbapal"); #else - const u32 gMonFrontPic_Muk[] = INCBIN_U32("graphics/pokemon/muk/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Muk[] = INCBIN_U32("graphics/pokemon/muk/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Muk[] = INCBIN_U16("graphics/pokemon/muk/normal_gba.gbapal"); - const u32 gMonBackPic_Muk[] = INCBIN_U32("graphics/pokemon/muk/back_gba.4bpp.lz"); + const u32 gMonBackPic_Muk[] = INCBIN_U32("graphics/pokemon/muk/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Muk[] = INCBIN_U16("graphics/pokemon/muk/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3562,9 +3562,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_ALOLAN_FORMS - const u32 gMonFrontPic_GrimerAlola[] = INCBIN_U32("graphics/pokemon/grimer/alola/front.4bpp.lz"); + const u32 gMonFrontPic_GrimerAlola[] = INCBIN_U32("graphics/pokemon/grimer/alola/front.4bpp.smol"); const u16 gMonPalette_GrimerAlola[] = INCBIN_U16("graphics/pokemon/grimer/alola/normal.gbapal"); - const u32 gMonBackPic_GrimerAlola[] = INCBIN_U32("graphics/pokemon/grimer/alola/back.4bpp.lz"); + const u32 gMonBackPic_GrimerAlola[] = INCBIN_U32("graphics/pokemon/grimer/alola/back.4bpp.smol"); const u16 gMonShinyPalette_GrimerAlola[] = INCBIN_U16("graphics/pokemon/grimer/alola/shiny.gbapal"); const u8 gMonIcon_GrimerAlola[] = INCBIN_U8("graphics/pokemon/grimer/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -3575,9 +3575,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_MukAlola[] = INCBIN_U32("graphics/pokemon/muk/alola/front.4bpp.lz"); + const u32 gMonFrontPic_MukAlola[] = INCBIN_U32("graphics/pokemon/muk/alola/front.4bpp.smol"); const u16 gMonPalette_MukAlola[] = INCBIN_U16("graphics/pokemon/muk/alola/normal.gbapal"); - const u32 gMonBackPic_MukAlola[] = INCBIN_U32("graphics/pokemon/muk/alola/back.4bpp.lz"); + const u32 gMonBackPic_MukAlola[] = INCBIN_U32("graphics/pokemon/muk/alola/back.4bpp.smol"); const u16 gMonShinyPalette_MukAlola[] = INCBIN_U16("graphics/pokemon/muk/alola/shiny.gbapal"); const u8 gMonIcon_MukAlola[] = INCBIN_U8("graphics/pokemon/muk/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -3592,14 +3592,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SHELLDER #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/anim_front.4bpp.smol"); const u16 gMonPalette_Shellder[] = INCBIN_U16("graphics/pokemon/shellder/normal.gbapal"); - const u32 gMonBackPic_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/back.4bpp.lz"); + const u32 gMonBackPic_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/back.4bpp.smol"); const u16 gMonShinyPalette_Shellder[] = INCBIN_U16("graphics/pokemon/shellder/shiny.gbapal"); #else - const u32 gMonFrontPic_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Shellder[] = INCBIN_U16("graphics/pokemon/shellder/normal_gba.gbapal"); - const u32 gMonBackPic_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/back_gba.4bpp.lz"); + const u32 gMonBackPic_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Shellder[] = INCBIN_U16("graphics/pokemon/shellder/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3619,14 +3619,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/anim_front.4bpp.smol"); const u16 gMonPalette_Cloyster[] = INCBIN_U16("graphics/pokemon/cloyster/normal.gbapal"); - const u32 gMonBackPic_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/back.4bpp.lz"); + const u32 gMonBackPic_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/back.4bpp.smol"); const u16 gMonShinyPalette_Cloyster[] = INCBIN_U16("graphics/pokemon/cloyster/shiny.gbapal"); #else - const u32 gMonFrontPic_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Cloyster[] = INCBIN_U16("graphics/pokemon/cloyster/normal_gba.gbapal"); - const u32 gMonBackPic_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/back_gba.4bpp.lz"); + const u32 gMonBackPic_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Cloyster[] = INCBIN_U16("graphics/pokemon/cloyster/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3648,14 +3648,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_GASTLY #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/anim_front.4bpp.smol"); const u16 gMonPalette_Gastly[] = INCBIN_U16("graphics/pokemon/gastly/normal.gbapal"); - const u32 gMonBackPic_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/back.4bpp.lz"); + const u32 gMonBackPic_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/back.4bpp.smol"); const u16 gMonShinyPalette_Gastly[] = INCBIN_U16("graphics/pokemon/gastly/shiny.gbapal"); #else - const u32 gMonFrontPic_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Gastly[] = INCBIN_U16("graphics/pokemon/gastly/normal_gba.gbapal"); - const u32 gMonBackPic_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/back_gba.4bpp.lz"); + const u32 gMonBackPic_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Gastly[] = INCBIN_U16("graphics/pokemon/gastly/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3675,14 +3675,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/anim_front.4bpp.smol"); const u16 gMonPalette_Haunter[] = INCBIN_U16("graphics/pokemon/haunter/normal.gbapal"); - const u32 gMonBackPic_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/back.4bpp.lz"); + const u32 gMonBackPic_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/back.4bpp.smol"); const u16 gMonShinyPalette_Haunter[] = INCBIN_U16("graphics/pokemon/haunter/shiny.gbapal"); #else - const u32 gMonFrontPic_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Haunter[] = INCBIN_U16("graphics/pokemon/haunter/normal_gba.gbapal"); - const u32 gMonBackPic_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/back_gba.4bpp.lz"); + const u32 gMonBackPic_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Haunter[] = INCBIN_U16("graphics/pokemon/haunter/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3702,14 +3702,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/anim_front.4bpp.smol"); const u16 gMonPalette_Gengar[] = INCBIN_U16("graphics/pokemon/gengar/normal.gbapal"); - const u32 gMonBackPic_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/back.4bpp.lz"); + const u32 gMonBackPic_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/back.4bpp.smol"); const u16 gMonShinyPalette_Gengar[] = INCBIN_U16("graphics/pokemon/gengar/shiny.gbapal"); #else - const u32 gMonFrontPic_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Gengar[] = INCBIN_U16("graphics/pokemon/gengar/normal_gba.gbapal"); - const u32 gMonBackPic_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/back_gba.4bpp.lz"); + const u32 gMonBackPic_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Gengar[] = INCBIN_U16("graphics/pokemon/gengar/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3729,9 +3729,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_GengarMega[] = INCBIN_U32("graphics/pokemon/gengar/mega/front.4bpp.lz"); + const u32 gMonFrontPic_GengarMega[] = INCBIN_U32("graphics/pokemon/gengar/mega/front.4bpp.smol"); const u16 gMonPalette_GengarMega[] = INCBIN_U16("graphics/pokemon/gengar/mega/normal.gbapal"); - const u32 gMonBackPic_GengarMega[] = INCBIN_U32("graphics/pokemon/gengar/mega/back.4bpp.lz"); + const u32 gMonBackPic_GengarMega[] = INCBIN_U32("graphics/pokemon/gengar/mega/back.4bpp.smol"); const u16 gMonShinyPalette_GengarMega[] = INCBIN_U16("graphics/pokemon/gengar/mega/shiny.gbapal"); const u8 gMonIcon_GengarMega[] = INCBIN_U8("graphics/pokemon/gengar/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -3744,8 +3744,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_MEGA_EVOLUTIONS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_GengarGmax[] = INCBIN_U32("graphics/pokemon/gengar/gmax/front.4bpp.lz"); - const u32 gMonBackPic_GengarGmax[] = INCBIN_U32("graphics/pokemon/gengar/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_GengarGmax[] = INCBIN_U32("graphics/pokemon/gengar/gmax/front.4bpp.smol"); + const u32 gMonBackPic_GengarGmax[] = INCBIN_U32("graphics/pokemon/gengar/gmax/back.4bpp.smol"); const u16 gMonPalette_GengarGmax[] = INCBIN_U16("graphics/pokemon/gengar/gmax/normal.gbapal"); const u16 gMonShinyPalette_GengarGmax[] = INCBIN_U16("graphics/pokemon/gengar/gmax/shiny.gbapal"); const u8 gMonIcon_GengarGmax[] = INCBIN_U8("graphics/pokemon/gengar/gmax/icon.4bpp"); @@ -3761,14 +3761,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ONIX #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Onix[] = INCBIN_U32("graphics/pokemon/onix/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Onix[] = INCBIN_U32("graphics/pokemon/onix/anim_front.4bpp.smol"); const u16 gMonPalette_Onix[] = INCBIN_U16("graphics/pokemon/onix/normal.gbapal"); - const u32 gMonBackPic_Onix[] = INCBIN_U32("graphics/pokemon/onix/back.4bpp.lz"); + const u32 gMonBackPic_Onix[] = INCBIN_U32("graphics/pokemon/onix/back.4bpp.smol"); const u16 gMonShinyPalette_Onix[] = INCBIN_U16("graphics/pokemon/onix/shiny.gbapal"); #else - const u32 gMonFrontPic_Onix[] = INCBIN_U32("graphics/pokemon/onix/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Onix[] = INCBIN_U32("graphics/pokemon/onix/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Onix[] = INCBIN_U16("graphics/pokemon/onix/normal_gba.gbapal"); - const u32 gMonBackPic_Onix[] = INCBIN_U32("graphics/pokemon/onix/back_gba.4bpp.lz"); + const u32 gMonBackPic_Onix[] = INCBIN_U32("graphics/pokemon/onix/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Onix[] = INCBIN_U16("graphics/pokemon/onix/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3789,14 +3789,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/anim_front.4bpp.smol"); const u16 gMonPalette_Steelix[] = INCBIN_U16("graphics/pokemon/steelix/normal.gbapal"); - const u32 gMonBackPic_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/back.4bpp.lz"); + const u32 gMonBackPic_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/back.4bpp.smol"); const u16 gMonShinyPalette_Steelix[] = INCBIN_U16("graphics/pokemon/steelix/shiny.gbapal"); #else - const u32 gMonFrontPic_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Steelix[] = INCBIN_U16("graphics/pokemon/steelix/normal_gba.gbapal"); - const u32 gMonBackPic_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/back_gba.4bpp.lz"); + const u32 gMonBackPic_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Steelix[] = INCBIN_U16("graphics/pokemon/steelix/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3816,17 +3816,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_SteelixF[] = INCBIN_U32("graphics/pokemon/steelix/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_SteelixF[] = INCBIN_U32("graphics/pokemon/steelix/backf.4bpp.lz"); + const u32 gMonFrontPic_SteelixF[] = INCBIN_U32("graphics/pokemon/steelix/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_SteelixF[] = INCBIN_U32("graphics/pokemon/steelix/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_SteelixF[] = INCBIN_COMP("graphics/pokemon/steelix/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_SteelixMega[] = INCBIN_U32("graphics/pokemon/steelix/mega/front.4bpp.lz"); + const u32 gMonFrontPic_SteelixMega[] = INCBIN_U32("graphics/pokemon/steelix/mega/front.4bpp.smol"); const u16 gMonPalette_SteelixMega[] = INCBIN_U16("graphics/pokemon/steelix/mega/normal.gbapal"); - const u32 gMonBackPic_SteelixMega[] = INCBIN_U32("graphics/pokemon/steelix/mega/back.4bpp.lz"); + const u32 gMonBackPic_SteelixMega[] = INCBIN_U32("graphics/pokemon/steelix/mega/back.4bpp.smol"); const u16 gMonShinyPalette_SteelixMega[] = INCBIN_U16("graphics/pokemon/steelix/mega/shiny.gbapal"); const u8 gMonIcon_SteelixMega[] = INCBIN_U8("graphics/pokemon/steelix/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -3842,14 +3842,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_DROWZEE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/anim_front.4bpp.smol"); const u16 gMonPalette_Drowzee[] = INCBIN_U16("graphics/pokemon/drowzee/normal.gbapal"); - const u32 gMonBackPic_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/back.4bpp.lz"); + const u32 gMonBackPic_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/back.4bpp.smol"); const u16 gMonShinyPalette_Drowzee[] = INCBIN_U16("graphics/pokemon/drowzee/shiny.gbapal"); #else - const u32 gMonFrontPic_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Drowzee[] = INCBIN_U16("graphics/pokemon/drowzee/normal_gba.gbapal"); - const u32 gMonBackPic_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/back_gba.4bpp.lz"); + const u32 gMonBackPic_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Drowzee[] = INCBIN_U16("graphics/pokemon/drowzee/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3869,14 +3869,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/anim_front.4bpp.smol"); const u16 gMonPalette_Hypno[] = INCBIN_U16("graphics/pokemon/hypno/normal.gbapal"); - const u32 gMonBackPic_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/back.4bpp.lz"); + const u32 gMonBackPic_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/back.4bpp.smol"); const u16 gMonShinyPalette_Hypno[] = INCBIN_U16("graphics/pokemon/hypno/shiny.gbapal"); #else - const u32 gMonFrontPic_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Hypno[] = INCBIN_U16("graphics/pokemon/hypno/normal_gba.gbapal"); - const u32 gMonBackPic_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/back_gba.4bpp.lz"); + const u32 gMonBackPic_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Hypno[] = INCBIN_U16("graphics/pokemon/hypno/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3896,8 +3896,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_HypnoF[] = INCBIN_U32("graphics/pokemon/hypno/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_HypnoF[] = INCBIN_U32("graphics/pokemon/hypno/backf.4bpp.lz"); + const u32 gMonFrontPic_HypnoF[] = INCBIN_U32("graphics/pokemon/hypno/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_HypnoF[] = INCBIN_U32("graphics/pokemon/hypno/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_HypnoF[] = INCBIN_COMP("graphics/pokemon/hypno/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -3906,14 +3906,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_KRABBY #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/anim_front.4bpp.smol"); const u16 gMonPalette_Krabby[] = INCBIN_U16("graphics/pokemon/krabby/normal.gbapal"); - const u32 gMonBackPic_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/back.4bpp.lz"); + const u32 gMonBackPic_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/back.4bpp.smol"); const u16 gMonShinyPalette_Krabby[] = INCBIN_U16("graphics/pokemon/krabby/shiny.gbapal"); #else - const u32 gMonFrontPic_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Krabby[] = INCBIN_U16("graphics/pokemon/krabby/normal_gba.gbapal"); - const u32 gMonBackPic_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/back_gba.4bpp.lz"); + const u32 gMonBackPic_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Krabby[] = INCBIN_U16("graphics/pokemon/krabby/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3933,14 +3933,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/anim_front.4bpp.smol"); const u16 gMonPalette_Kingler[] = INCBIN_U16("graphics/pokemon/kingler/normal.gbapal"); - const u32 gMonBackPic_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/back.4bpp.lz"); + const u32 gMonBackPic_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/back.4bpp.smol"); const u16 gMonShinyPalette_Kingler[] = INCBIN_U16("graphics/pokemon/kingler/shiny.gbapal"); #else - const u32 gMonFrontPic_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Kingler[] = INCBIN_U16("graphics/pokemon/kingler/normal_gba.gbapal"); - const u32 gMonBackPic_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/back_gba.4bpp.lz"); + const u32 gMonBackPic_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Kingler[] = INCBIN_U16("graphics/pokemon/kingler/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3960,8 +3960,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_KinglerGmax[] = INCBIN_U32("graphics/pokemon/kingler/gmax/front.4bpp.lz"); - const u32 gMonBackPic_KinglerGmax[] = INCBIN_U32("graphics/pokemon/kingler/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_KinglerGmax[] = INCBIN_U32("graphics/pokemon/kingler/gmax/front.4bpp.smol"); + const u32 gMonBackPic_KinglerGmax[] = INCBIN_U32("graphics/pokemon/kingler/gmax/back.4bpp.smol"); const u16 gMonPalette_KinglerGmax[] = INCBIN_U16("graphics/pokemon/kingler/gmax/normal.gbapal"); const u16 gMonShinyPalette_KinglerGmax[] = INCBIN_U16("graphics/pokemon/kingler/gmax/shiny.gbapal"); const u8 gMonIcon_KinglerGmax[] = INCBIN_U8("graphics/pokemon/kingler/gmax/icon.4bpp"); @@ -3977,14 +3977,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_VOLTORB #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/anim_front.4bpp.smol"); const u16 gMonPalette_Voltorb[] = INCBIN_U16("graphics/pokemon/voltorb/normal.gbapal"); - const u32 gMonBackPic_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/back.4bpp.lz"); + const u32 gMonBackPic_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/back.4bpp.smol"); const u16 gMonShinyPalette_Voltorb[] = INCBIN_U16("graphics/pokemon/voltorb/shiny.gbapal"); #else - const u32 gMonFrontPic_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Voltorb[] = INCBIN_U16("graphics/pokemon/voltorb/normal_gba.gbapal"); - const u32 gMonBackPic_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/back_gba.4bpp.lz"); + const u32 gMonBackPic_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Voltorb[] = INCBIN_U16("graphics/pokemon/voltorb/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4004,14 +4004,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/anim_front.4bpp.smol"); const u16 gMonPalette_Electrode[] = INCBIN_U16("graphics/pokemon/electrode/normal.gbapal"); - const u32 gMonBackPic_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/back.4bpp.lz"); + const u32 gMonBackPic_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/back.4bpp.smol"); const u16 gMonShinyPalette_Electrode[] = INCBIN_U16("graphics/pokemon/electrode/shiny.gbapal"); #else - const u32 gMonFrontPic_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Electrode[] = INCBIN_U16("graphics/pokemon/electrode/normal_gba.gbapal"); - const u32 gMonBackPic_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/back_gba.4bpp.lz"); + const u32 gMonBackPic_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Electrode[] = INCBIN_U16("graphics/pokemon/electrode/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4031,9 +4031,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_VoltorbHisui[] = INCBIN_U32("graphics/pokemon/voltorb/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_VoltorbHisui[] = INCBIN_U32("graphics/pokemon/voltorb/hisui/front.4bpp.smol"); const u16 gMonPalette_VoltorbHisui[] = INCBIN_U16("graphics/pokemon/voltorb/hisui/normal.gbapal"); - const u32 gMonBackPic_VoltorbHisui[] = INCBIN_U32("graphics/pokemon/voltorb/hisui/back.4bpp.lz"); + const u32 gMonBackPic_VoltorbHisui[] = INCBIN_U32("graphics/pokemon/voltorb/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_VoltorbHisui[] = INCBIN_U16("graphics/pokemon/voltorb/hisui/shiny.gbapal"); const u8 gMonIcon_VoltorbHisui[] = INCBIN_U8("graphics/pokemon/voltorb/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -4044,9 +4044,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_ElectrodeHisui[] = INCBIN_U32("graphics/pokemon/electrode/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_ElectrodeHisui[] = INCBIN_U32("graphics/pokemon/electrode/hisui/front.4bpp.smol"); const u16 gMonPalette_ElectrodeHisui[] = INCBIN_U16("graphics/pokemon/electrode/hisui/normal.gbapal"); - const u32 gMonBackPic_ElectrodeHisui[] = INCBIN_U32("graphics/pokemon/electrode/hisui/back.4bpp.lz"); + const u32 gMonBackPic_ElectrodeHisui[] = INCBIN_U32("graphics/pokemon/electrode/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_ElectrodeHisui[] = INCBIN_U16("graphics/pokemon/electrode/hisui/shiny.gbapal"); const u8 gMonIcon_ElectrodeHisui[] = INCBIN_U8("graphics/pokemon/electrode/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -4061,14 +4061,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_EXEGGCUTE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/anim_front.4bpp.smol"); const u16 gMonPalette_Exeggcute[] = INCBIN_U16("graphics/pokemon/exeggcute/normal.gbapal"); - const u32 gMonBackPic_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/back.4bpp.lz"); + const u32 gMonBackPic_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/back.4bpp.smol"); const u16 gMonShinyPalette_Exeggcute[] = INCBIN_U16("graphics/pokemon/exeggcute/shiny.gbapal"); #else - const u32 gMonFrontPic_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Exeggcute[] = INCBIN_U16("graphics/pokemon/exeggcute/normal_gba.gbapal"); - const u32 gMonBackPic_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/back_gba.4bpp.lz"); + const u32 gMonBackPic_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Exeggcute[] = INCBIN_U16("graphics/pokemon/exeggcute/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4088,14 +4088,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/anim_front.4bpp.smol"); const u16 gMonPalette_Exeggutor[] = INCBIN_U16("graphics/pokemon/exeggutor/normal.gbapal"); - const u32 gMonBackPic_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/back.4bpp.lz"); + const u32 gMonBackPic_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/back.4bpp.smol"); const u16 gMonShinyPalette_Exeggutor[] = INCBIN_U16("graphics/pokemon/exeggutor/shiny.gbapal"); #else - const u32 gMonFrontPic_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Exeggutor[] = INCBIN_U16("graphics/pokemon/exeggutor/normal_gba.gbapal"); - const u32 gMonBackPic_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/back_gba.4bpp.lz"); + const u32 gMonBackPic_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Exeggutor[] = INCBIN_U16("graphics/pokemon/exeggutor/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4115,9 +4115,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_ALOLAN_FORMS - const u32 gMonFrontPic_ExeggutorAlola[] = INCBIN_U32("graphics/pokemon/exeggutor/alola/anim_front.4bpp.lz"); + const u32 gMonFrontPic_ExeggutorAlola[] = INCBIN_U32("graphics/pokemon/exeggutor/alola/anim_front.4bpp.smol"); const u16 gMonPalette_ExeggutorAlola[] = INCBIN_U16("graphics/pokemon/exeggutor/alola/normal.gbapal"); - const u32 gMonBackPic_ExeggutorAlola[] = INCBIN_U32("graphics/pokemon/exeggutor/alola/back.4bpp.lz"); + const u32 gMonBackPic_ExeggutorAlola[] = INCBIN_U32("graphics/pokemon/exeggutor/alola/back.4bpp.smol"); const u16 gMonShinyPalette_ExeggutorAlola[] = INCBIN_U16("graphics/pokemon/exeggutor/alola/shiny.gbapal"); const u8 gMonIcon_ExeggutorAlola[] = INCBIN_U8("graphics/pokemon/exeggutor/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -4132,14 +4132,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CUBONE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/anim_front.4bpp.smol"); const u16 gMonPalette_Cubone[] = INCBIN_U16("graphics/pokemon/cubone/normal.gbapal"); - const u32 gMonBackPic_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/back.4bpp.lz"); + const u32 gMonBackPic_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/back.4bpp.smol"); const u16 gMonShinyPalette_Cubone[] = INCBIN_U16("graphics/pokemon/cubone/shiny.gbapal"); #else - const u32 gMonFrontPic_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Cubone[] = INCBIN_U16("graphics/pokemon/cubone/normal_gba.gbapal"); - const u32 gMonBackPic_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/back_gba.4bpp.lz"); + const u32 gMonBackPic_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Cubone[] = INCBIN_U16("graphics/pokemon/cubone/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4159,14 +4159,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/anim_front.4bpp.smol"); const u16 gMonPalette_Marowak[] = INCBIN_U16("graphics/pokemon/marowak/normal.gbapal"); - const u32 gMonBackPic_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/back.4bpp.lz"); + const u32 gMonBackPic_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/back.4bpp.smol"); const u16 gMonShinyPalette_Marowak[] = INCBIN_U16("graphics/pokemon/marowak/shiny.gbapal"); #else - const u32 gMonFrontPic_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Marowak[] = INCBIN_U16("graphics/pokemon/marowak/normal_gba.gbapal"); - const u32 gMonBackPic_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/back_gba.4bpp.lz"); + const u32 gMonBackPic_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Marowak[] = INCBIN_U16("graphics/pokemon/marowak/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4186,9 +4186,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_ALOLAN_FORMS - const u32 gMonFrontPic_MarowakAlola[] = INCBIN_U32("graphics/pokemon/marowak/alola/front.4bpp.lz"); + const u32 gMonFrontPic_MarowakAlola[] = INCBIN_U32("graphics/pokemon/marowak/alola/front.4bpp.smol"); const u16 gMonPalette_MarowakAlola[] = INCBIN_U16("graphics/pokemon/marowak/alola/normal.gbapal"); - const u32 gMonBackPic_MarowakAlola[] = INCBIN_U32("graphics/pokemon/marowak/alola/back.4bpp.lz"); + const u32 gMonBackPic_MarowakAlola[] = INCBIN_U32("graphics/pokemon/marowak/alola/back.4bpp.smol"); const u16 gMonShinyPalette_MarowakAlola[] = INCBIN_U16("graphics/pokemon/marowak/alola/shiny.gbapal"); const u8 gMonIcon_MarowakAlola[] = INCBIN_U8("graphics/pokemon/marowak/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -4204,14 +4204,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_HITMONS #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/anim_front.4bpp.smol"); const u16 gMonPalette_Tyrogue[] = INCBIN_U16("graphics/pokemon/tyrogue/normal.gbapal"); - const u32 gMonBackPic_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/back.4bpp.lz"); + const u32 gMonBackPic_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/back.4bpp.smol"); const u16 gMonShinyPalette_Tyrogue[] = INCBIN_U16("graphics/pokemon/tyrogue/shiny.gbapal"); #else - const u32 gMonFrontPic_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Tyrogue[] = INCBIN_U16("graphics/pokemon/tyrogue/normal_gba.gbapal"); - const u32 gMonBackPic_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/back_gba.4bpp.lz"); + const u32 gMonBackPic_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Tyrogue[] = INCBIN_U16("graphics/pokemon/tyrogue/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4232,14 +4232,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/anim_front.4bpp.smol"); const u16 gMonPalette_Hitmonlee[] = INCBIN_U16("graphics/pokemon/hitmonlee/normal.gbapal"); - const u32 gMonBackPic_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/back.4bpp.lz"); + const u32 gMonBackPic_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/back.4bpp.smol"); const u16 gMonShinyPalette_Hitmonlee[] = INCBIN_U16("graphics/pokemon/hitmonlee/shiny.gbapal"); #else - const u32 gMonFrontPic_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Hitmonlee[] = INCBIN_U16("graphics/pokemon/hitmonlee/normal_gba.gbapal"); - const u32 gMonBackPic_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/back_gba.4bpp.lz"); + const u32 gMonBackPic_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Hitmonlee[] = INCBIN_U16("graphics/pokemon/hitmonlee/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4259,14 +4259,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/anim_front.4bpp.smol"); const u16 gMonPalette_Hitmonchan[] = INCBIN_U16("graphics/pokemon/hitmonchan/normal.gbapal"); - const u32 gMonBackPic_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/back.4bpp.lz"); + const u32 gMonBackPic_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/back.4bpp.smol"); const u16 gMonShinyPalette_Hitmonchan[] = INCBIN_U16("graphics/pokemon/hitmonchan/shiny.gbapal"); #else - const u32 gMonFrontPic_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Hitmonchan[] = INCBIN_U16("graphics/pokemon/hitmonchan/normal_gba.gbapal"); - const u32 gMonBackPic_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/back_gba.4bpp.lz"); + const u32 gMonBackPic_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Hitmonchan[] = INCBIN_U16("graphics/pokemon/hitmonchan/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4287,14 +4287,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/anim_front.4bpp.smol"); const u16 gMonPalette_Hitmontop[] = INCBIN_U16("graphics/pokemon/hitmontop/normal.gbapal"); - const u32 gMonBackPic_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/back.4bpp.lz"); + const u32 gMonBackPic_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/back.4bpp.smol"); const u16 gMonShinyPalette_Hitmontop[] = INCBIN_U16("graphics/pokemon/hitmontop/shiny.gbapal"); #else - const u32 gMonFrontPic_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Hitmontop[] = INCBIN_U16("graphics/pokemon/hitmontop/normal_gba.gbapal"); - const u32 gMonBackPic_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/back_gba.4bpp.lz"); + const u32 gMonBackPic_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Hitmontop[] = INCBIN_U16("graphics/pokemon/hitmontop/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4317,14 +4317,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_LICKITUNG #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/anim_front.4bpp.smol"); const u16 gMonPalette_Lickitung[] = INCBIN_U16("graphics/pokemon/lickitung/normal.gbapal"); - const u32 gMonBackPic_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/back.4bpp.lz"); + const u32 gMonBackPic_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/back.4bpp.smol"); const u16 gMonShinyPalette_Lickitung[] = INCBIN_U16("graphics/pokemon/lickitung/shiny.gbapal"); #else - const u32 gMonFrontPic_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Lickitung[] = INCBIN_U16("graphics/pokemon/lickitung/normal_gba.gbapal"); - const u32 gMonBackPic_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/back_gba.4bpp.lz"); + const u32 gMonBackPic_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Lickitung[] = INCBIN_U16("graphics/pokemon/lickitung/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4344,9 +4344,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Lickilicky[] = INCBIN_U32("graphics/pokemon/lickilicky/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lickilicky[] = INCBIN_U32("graphics/pokemon/lickilicky/anim_front.4bpp.smol"); const u16 gMonPalette_Lickilicky[] = INCBIN_U16("graphics/pokemon/lickilicky/normal.gbapal"); - const u32 gMonBackPic_Lickilicky[] = INCBIN_U32("graphics/pokemon/lickilicky/back.4bpp.lz"); + const u32 gMonBackPic_Lickilicky[] = INCBIN_U32("graphics/pokemon/lickilicky/back.4bpp.smol"); const u16 gMonShinyPalette_Lickilicky[] = INCBIN_U16("graphics/pokemon/lickilicky/shiny.gbapal"); const u8 gMonIcon_Lickilicky[] = INCBIN_U8("graphics/pokemon/lickilicky/icon.4bpp"); #if P_FOOTPRINTS @@ -4364,14 +4364,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_KOFFING #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/anim_front.4bpp.smol"); const u16 gMonPalette_Koffing[] = INCBIN_U16("graphics/pokemon/koffing/normal.gbapal"); - const u32 gMonBackPic_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/back.4bpp.lz"); + const u32 gMonBackPic_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/back.4bpp.smol"); const u16 gMonShinyPalette_Koffing[] = INCBIN_U16("graphics/pokemon/koffing/shiny.gbapal"); #else - const u32 gMonFrontPic_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Koffing[] = INCBIN_U16("graphics/pokemon/koffing/normal_gba.gbapal"); - const u32 gMonBackPic_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/back_gba.4bpp.lz"); + const u32 gMonBackPic_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Koffing[] = INCBIN_U16("graphics/pokemon/koffing/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4391,14 +4391,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/anim_front.4bpp.smol"); const u16 gMonPalette_Weezing[] = INCBIN_U16("graphics/pokemon/weezing/normal.gbapal"); - const u32 gMonBackPic_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/back.4bpp.lz"); + const u32 gMonBackPic_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/back.4bpp.smol"); const u16 gMonShinyPalette_Weezing[] = INCBIN_U16("graphics/pokemon/weezing/shiny.gbapal"); #else - const u32 gMonFrontPic_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Weezing[] = INCBIN_U16("graphics/pokemon/weezing/normal_gba.gbapal"); - const u32 gMonBackPic_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/back_gba.4bpp.lz"); + const u32 gMonBackPic_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Weezing[] = INCBIN_U16("graphics/pokemon/weezing/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4418,9 +4418,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_WeezingGalar[] = INCBIN_U32("graphics/pokemon/weezing/galar/front.4bpp.lz"); + const u32 gMonFrontPic_WeezingGalar[] = INCBIN_U32("graphics/pokemon/weezing/galar/front.4bpp.smol"); const u16 gMonPalette_WeezingGalar[] = INCBIN_U16("graphics/pokemon/weezing/galar/normal.gbapal"); - const u32 gMonBackPic_WeezingGalar[] = INCBIN_U32("graphics/pokemon/weezing/galar/back.4bpp.lz"); + const u32 gMonBackPic_WeezingGalar[] = INCBIN_U32("graphics/pokemon/weezing/galar/back.4bpp.smol"); const u16 gMonShinyPalette_WeezingGalar[] = INCBIN_U16("graphics/pokemon/weezing/galar/shiny.gbapal"); const u8 gMonIcon_WeezingGalar[] = INCBIN_U8("graphics/pokemon/weezing/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -4435,14 +4435,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_RHYHORN #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/anim_front.4bpp.smol"); const u16 gMonPalette_Rhyhorn[] = INCBIN_U16("graphics/pokemon/rhyhorn/normal.gbapal"); - const u32 gMonBackPic_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/back.4bpp.lz"); + const u32 gMonBackPic_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/back.4bpp.smol"); const u16 gMonShinyPalette_Rhyhorn[] = INCBIN_U16("graphics/pokemon/rhyhorn/shiny.gbapal"); #else - const u32 gMonFrontPic_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Rhyhorn[] = INCBIN_U16("graphics/pokemon/rhyhorn/normal_gba.gbapal"); - const u32 gMonBackPic_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/back_gba.4bpp.lz"); + const u32 gMonBackPic_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Rhyhorn[] = INCBIN_U16("graphics/pokemon/rhyhorn/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4462,22 +4462,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_RhyhornF[] = INCBIN_U32("graphics/pokemon/rhyhorn/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_RhyhornF[] = INCBIN_U32("graphics/pokemon/rhyhorn/backf.4bpp.lz"); + const u32 gMonFrontPic_RhyhornF[] = INCBIN_U32("graphics/pokemon/rhyhorn/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_RhyhornF[] = INCBIN_U32("graphics/pokemon/rhyhorn/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_RhyhornF[] = INCBIN_COMP("graphics/pokemon/rhyhorn/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/anim_front.4bpp.smol"); const u16 gMonPalette_Rhydon[] = INCBIN_U16("graphics/pokemon/rhydon/normal.gbapal"); - const u32 gMonBackPic_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/back.4bpp.lz"); + const u32 gMonBackPic_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/back.4bpp.smol"); const u16 gMonShinyPalette_Rhydon[] = INCBIN_U16("graphics/pokemon/rhydon/shiny.gbapal"); #else - const u32 gMonFrontPic_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Rhydon[] = INCBIN_U16("graphics/pokemon/rhydon/normal_gba.gbapal"); - const u32 gMonBackPic_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Rhydon[] = INCBIN_U16("graphics/pokemon/rhydon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4497,17 +4497,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_RhydonF[] = INCBIN_U32("graphics/pokemon/rhydon/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_RhydonF[] = INCBIN_U32("graphics/pokemon/rhydon/backf.4bpp.lz"); + const u32 gMonFrontPic_RhydonF[] = INCBIN_U32("graphics/pokemon/rhydon/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_RhydonF[] = INCBIN_U32("graphics/pokemon/rhydon/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_RhydonF[] = INCBIN_COMP("graphics/pokemon/rhydon/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Rhyperior[] = INCBIN_U32("graphics/pokemon/rhyperior/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rhyperior[] = INCBIN_U32("graphics/pokemon/rhyperior/anim_front.4bpp.smol"); const u16 gMonPalette_Rhyperior[] = INCBIN_U16("graphics/pokemon/rhyperior/normal.gbapal"); - const u32 gMonBackPic_Rhyperior[] = INCBIN_U32("graphics/pokemon/rhyperior/back.4bpp.lz"); + const u32 gMonBackPic_Rhyperior[] = INCBIN_U32("graphics/pokemon/rhyperior/back.4bpp.smol"); const u16 gMonShinyPalette_Rhyperior[] = INCBIN_U16("graphics/pokemon/rhyperior/shiny.gbapal"); const u8 gMonIcon_Rhyperior[] = INCBIN_U8("graphics/pokemon/rhyperior/icon.4bpp"); #if P_FOOTPRINTS @@ -4522,8 +4522,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_RhyperiorF[] = INCBIN_U32("graphics/pokemon/rhyperior/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_RhyperiorF[] = INCBIN_U32("graphics/pokemon/rhyperior/backf.4bpp.lz"); + const u32 gMonFrontPic_RhyperiorF[] = INCBIN_U32("graphics/pokemon/rhyperior/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_RhyperiorF[] = INCBIN_U32("graphics/pokemon/rhyperior/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_RhyperiorF[] = INCBIN_COMP("graphics/pokemon/rhyperior/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -4533,9 +4533,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CHANSEY #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Happiny[] = INCBIN_U32("graphics/pokemon/happiny/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Happiny[] = INCBIN_U32("graphics/pokemon/happiny/anim_front.4bpp.smol"); const u16 gMonPalette_Happiny[] = INCBIN_U16("graphics/pokemon/happiny/normal.gbapal"); - const u32 gMonBackPic_Happiny[] = INCBIN_U32("graphics/pokemon/happiny/back.4bpp.lz"); + const u32 gMonBackPic_Happiny[] = INCBIN_U32("graphics/pokemon/happiny/back.4bpp.smol"); const u16 gMonShinyPalette_Happiny[] = INCBIN_U16("graphics/pokemon/happiny/shiny.gbapal"); const u8 gMonIcon_Happiny[] = INCBIN_U8("graphics/pokemon/happiny/icon.4bpp"); #if P_FOOTPRINTS @@ -4551,14 +4551,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_4_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/anim_front.4bpp.smol"); const u16 gMonPalette_Chansey[] = INCBIN_U16("graphics/pokemon/chansey/normal.gbapal"); - const u32 gMonBackPic_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/back.4bpp.lz"); + const u32 gMonBackPic_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/back.4bpp.smol"); const u16 gMonShinyPalette_Chansey[] = INCBIN_U16("graphics/pokemon/chansey/shiny.gbapal"); #else - const u32 gMonFrontPic_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Chansey[] = INCBIN_U16("graphics/pokemon/chansey/normal_gba.gbapal"); - const u32 gMonBackPic_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/back_gba.4bpp.lz"); + const u32 gMonBackPic_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Chansey[] = INCBIN_U16("graphics/pokemon/chansey/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4579,14 +4579,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/anim_front.4bpp.smol"); const u16 gMonPalette_Blissey[] = INCBIN_U16("graphics/pokemon/blissey/normal.gbapal"); - const u32 gMonBackPic_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/back.4bpp.lz"); + const u32 gMonBackPic_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/back.4bpp.smol"); const u16 gMonShinyPalette_Blissey[] = INCBIN_U16("graphics/pokemon/blissey/shiny.gbapal"); #else - const u32 gMonFrontPic_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Blissey[] = INCBIN_U16("graphics/pokemon/blissey/normal_gba.gbapal"); - const u32 gMonBackPic_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/back_gba.4bpp.lz"); + const u32 gMonBackPic_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Blissey[] = INCBIN_U16("graphics/pokemon/blissey/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4609,14 +4609,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TANGELA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/anim_front.4bpp.smol"); const u16 gMonPalette_Tangela[] = INCBIN_U16("graphics/pokemon/tangela/normal.gbapal"); - const u32 gMonBackPic_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/back.4bpp.lz"); + const u32 gMonBackPic_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/back.4bpp.smol"); const u16 gMonShinyPalette_Tangela[] = INCBIN_U16("graphics/pokemon/tangela/shiny.gbapal"); #else - const u32 gMonFrontPic_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Tangela[] = INCBIN_U16("graphics/pokemon/tangela/normal_gba.gbapal"); - const u32 gMonBackPic_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/back_gba.4bpp.lz"); + const u32 gMonBackPic_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Tangela[] = INCBIN_U16("graphics/pokemon/tangela/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4636,9 +4636,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Tangrowth[] = INCBIN_U32("graphics/pokemon/tangrowth/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tangrowth[] = INCBIN_U32("graphics/pokemon/tangrowth/anim_front.4bpp.smol"); const u16 gMonPalette_Tangrowth[] = INCBIN_U16("graphics/pokemon/tangrowth/normal.gbapal"); - const u32 gMonBackPic_Tangrowth[] = INCBIN_U32("graphics/pokemon/tangrowth/back.4bpp.lz"); + const u32 gMonBackPic_Tangrowth[] = INCBIN_U32("graphics/pokemon/tangrowth/back.4bpp.smol"); const u16 gMonShinyPalette_Tangrowth[] = INCBIN_U16("graphics/pokemon/tangrowth/shiny.gbapal"); const u8 gMonIcon_Tangrowth[] = INCBIN_U8("graphics/pokemon/tangrowth/icon.4bpp"); #if P_FOOTPRINTS @@ -4653,7 +4653,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_TangrowthF[] = INCBIN_U32("graphics/pokemon/tangrowth/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_TangrowthF[] = INCBIN_U32("graphics/pokemon/tangrowth/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_TangrowthF[] = INCBIN_COMP("graphics/pokemon/tangrowth/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -4663,14 +4663,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_KANGASKHAN #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/anim_front.4bpp.smol"); const u16 gMonPalette_Kangaskhan[] = INCBIN_U16("graphics/pokemon/kangaskhan/normal.gbapal"); - const u32 gMonBackPic_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/back.4bpp.lz"); + const u32 gMonBackPic_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/back.4bpp.smol"); const u16 gMonShinyPalette_Kangaskhan[] = INCBIN_U16("graphics/pokemon/kangaskhan/shiny.gbapal"); #else - const u32 gMonFrontPic_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Kangaskhan[] = INCBIN_U16("graphics/pokemon/kangaskhan/normal_gba.gbapal"); - const u32 gMonBackPic_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/back_gba.4bpp.lz"); + const u32 gMonBackPic_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Kangaskhan[] = INCBIN_U16("graphics/pokemon/kangaskhan/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4690,9 +4690,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_KangaskhanMega[] = INCBIN_U32("graphics/pokemon/kangaskhan/mega/front.4bpp.lz"); + const u32 gMonFrontPic_KangaskhanMega[] = INCBIN_U32("graphics/pokemon/kangaskhan/mega/front.4bpp.smol"); const u16 gMonPalette_KangaskhanMega[] = INCBIN_U16("graphics/pokemon/kangaskhan/mega/normal.gbapal"); - const u32 gMonBackPic_KangaskhanMega[] = INCBIN_U32("graphics/pokemon/kangaskhan/mega/back.4bpp.lz"); + const u32 gMonBackPic_KangaskhanMega[] = INCBIN_U32("graphics/pokemon/kangaskhan/mega/back.4bpp.smol"); const u16 gMonShinyPalette_KangaskhanMega[] = INCBIN_U16("graphics/pokemon/kangaskhan/mega/shiny.gbapal"); const u8 gMonIcon_KangaskhanMega[] = INCBIN_U8("graphics/pokemon/kangaskhan/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -4707,14 +4707,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_HORSEA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/anim_front.4bpp.smol"); const u16 gMonPalette_Horsea[] = INCBIN_U16("graphics/pokemon/horsea/normal.gbapal"); - const u32 gMonBackPic_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/back.4bpp.lz"); + const u32 gMonBackPic_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/back.4bpp.smol"); const u16 gMonShinyPalette_Horsea[] = INCBIN_U16("graphics/pokemon/horsea/shiny.gbapal"); #else - const u32 gMonFrontPic_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Horsea[] = INCBIN_U16("graphics/pokemon/horsea/normal_gba.gbapal"); - const u32 gMonBackPic_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/back_gba.4bpp.lz"); + const u32 gMonBackPic_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Horsea[] = INCBIN_U16("graphics/pokemon/horsea/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4734,14 +4734,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/anim_front.4bpp.smol"); const u16 gMonPalette_Seadra[] = INCBIN_U16("graphics/pokemon/seadra/normal.gbapal"); - const u32 gMonBackPic_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/back.4bpp.lz"); + const u32 gMonBackPic_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/back.4bpp.smol"); const u16 gMonShinyPalette_Seadra[] = INCBIN_U16("graphics/pokemon/seadra/shiny.gbapal"); #else - const u32 gMonFrontPic_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Seadra[] = INCBIN_U16("graphics/pokemon/seadra/normal_gba.gbapal"); - const u32 gMonBackPic_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/back_gba.4bpp.lz"); + const u32 gMonBackPic_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Seadra[] = INCBIN_U16("graphics/pokemon/seadra/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4762,14 +4762,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/anim_front.4bpp.smol"); const u16 gMonPalette_Kingdra[] = INCBIN_U16("graphics/pokemon/kingdra/normal.gbapal"); - const u32 gMonBackPic_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/back.4bpp.lz"); + const u32 gMonBackPic_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/back.4bpp.smol"); const u16 gMonShinyPalette_Kingdra[] = INCBIN_U16("graphics/pokemon/kingdra/shiny.gbapal"); #else - const u32 gMonFrontPic_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Kingdra[] = INCBIN_U16("graphics/pokemon/kingdra/normal_gba.gbapal"); - const u32 gMonBackPic_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/back_gba.4bpp.lz"); + const u32 gMonBackPic_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Kingdra[] = INCBIN_U16("graphics/pokemon/kingdra/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4792,14 +4792,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_GOLDEEN #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/anim_front.4bpp.smol"); const u16 gMonPalette_Goldeen[] = INCBIN_U16("graphics/pokemon/goldeen/normal.gbapal"); - const u32 gMonBackPic_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/back.4bpp.lz"); + const u32 gMonBackPic_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/back.4bpp.smol"); const u16 gMonShinyPalette_Goldeen[] = INCBIN_U16("graphics/pokemon/goldeen/shiny.gbapal"); #else - const u32 gMonFrontPic_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Goldeen[] = INCBIN_U16("graphics/pokemon/goldeen/normal_gba.gbapal"); - const u32 gMonBackPic_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/back_gba.4bpp.lz"); + const u32 gMonBackPic_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Goldeen[] = INCBIN_U16("graphics/pokemon/goldeen/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4819,22 +4819,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_GoldeenF[] = INCBIN_U32("graphics/pokemon/goldeen/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_GoldeenF[] = INCBIN_U32("graphics/pokemon/goldeen/backf.4bpp.lz"); + const u32 gMonFrontPic_GoldeenF[] = INCBIN_U32("graphics/pokemon/goldeen/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_GoldeenF[] = INCBIN_U32("graphics/pokemon/goldeen/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_GoldeenF[] = INCBIN_COMP("graphics/pokemon/goldeen/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/anim_front.4bpp.smol"); const u16 gMonPalette_Seaking[] = INCBIN_U16("graphics/pokemon/seaking/normal.gbapal"); - const u32 gMonBackPic_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/back.4bpp.lz"); + const u32 gMonBackPic_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/back.4bpp.smol"); const u16 gMonShinyPalette_Seaking[] = INCBIN_U16("graphics/pokemon/seaking/shiny.gbapal"); #else - const u32 gMonFrontPic_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Seaking[] = INCBIN_U16("graphics/pokemon/seaking/normal_gba.gbapal"); - const u32 gMonBackPic_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/back_gba.4bpp.lz"); + const u32 gMonBackPic_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Seaking[] = INCBIN_U16("graphics/pokemon/seaking/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4854,8 +4854,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_SeakingF[] = INCBIN_U32("graphics/pokemon/seaking/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_SeakingF[] = INCBIN_U32("graphics/pokemon/seaking/backf.4bpp.lz"); + const u32 gMonFrontPic_SeakingF[] = INCBIN_U32("graphics/pokemon/seaking/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_SeakingF[] = INCBIN_U32("graphics/pokemon/seaking/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_SeakingF[] = INCBIN_COMP("graphics/pokemon/seaking/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -4864,14 +4864,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_STARYU #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/anim_front.4bpp.smol"); const u16 gMonPalette_Staryu[] = INCBIN_U16("graphics/pokemon/staryu/normal.gbapal"); - const u32 gMonBackPic_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/back.4bpp.lz"); + const u32 gMonBackPic_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/back.4bpp.smol"); const u16 gMonShinyPalette_Staryu[] = INCBIN_U16("graphics/pokemon/staryu/shiny.gbapal"); #else - const u32 gMonFrontPic_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Staryu[] = INCBIN_U16("graphics/pokemon/staryu/normal_gba.gbapal"); - const u32 gMonBackPic_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/back_gba.4bpp.lz"); + const u32 gMonBackPic_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Staryu[] = INCBIN_U16("graphics/pokemon/staryu/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4891,14 +4891,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/anim_front.4bpp.smol"); const u16 gMonPalette_Starmie[] = INCBIN_U16("graphics/pokemon/starmie/normal.gbapal"); - const u32 gMonBackPic_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/back.4bpp.lz"); + const u32 gMonBackPic_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/back.4bpp.smol"); const u16 gMonShinyPalette_Starmie[] = INCBIN_U16("graphics/pokemon/starmie/shiny.gbapal"); #else - const u32 gMonFrontPic_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Starmie[] = INCBIN_U16("graphics/pokemon/starmie/normal_gba.gbapal"); - const u32 gMonBackPic_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/back_gba.4bpp.lz"); + const u32 gMonBackPic_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Starmie[] = INCBIN_U16("graphics/pokemon/starmie/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4920,9 +4920,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MR_MIME #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_MimeJr[] = INCBIN_U32("graphics/pokemon/mime_jr/anim_front.4bpp.lz"); + const u32 gMonFrontPic_MimeJr[] = INCBIN_U32("graphics/pokemon/mime_jr/anim_front.4bpp.smol"); const u16 gMonPalette_MimeJr[] = INCBIN_U16("graphics/pokemon/mime_jr/normal.gbapal"); - const u32 gMonBackPic_MimeJr[] = INCBIN_U32("graphics/pokemon/mime_jr/back.4bpp.lz"); + const u32 gMonBackPic_MimeJr[] = INCBIN_U32("graphics/pokemon/mime_jr/back.4bpp.smol"); const u16 gMonShinyPalette_MimeJr[] = INCBIN_U16("graphics/pokemon/mime_jr/shiny.gbapal"); const u8 gMonIcon_MimeJr[] = INCBIN_U8("graphics/pokemon/mime_jr/icon.4bpp"); #if P_FOOTPRINTS @@ -4938,14 +4938,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_4_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_MrMime[] = INCBIN_U32("graphics/pokemon/mr_mime/anim_front.4bpp.lz"); + const u32 gMonFrontPic_MrMime[] = INCBIN_U32("graphics/pokemon/mr_mime/anim_front.4bpp.smol"); const u16 gMonPalette_MrMime[] = INCBIN_U16("graphics/pokemon/mr_mime/normal.gbapal"); - const u32 gMonBackPic_MrMime[] = INCBIN_U32("graphics/pokemon/mr_mime/back.4bpp.lz"); + const u32 gMonBackPic_MrMime[] = INCBIN_U32("graphics/pokemon/mr_mime/back.4bpp.smol"); const u16 gMonShinyPalette_MrMime[] = INCBIN_U16("graphics/pokemon/mr_mime/shiny.gbapal"); #else - const u32 gMonFrontPic_MrMime[] = INCBIN_U32("graphics/pokemon/mr_mime/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_MrMime[] = INCBIN_U32("graphics/pokemon/mr_mime/anim_front_gba.4bpp.smol"); const u16 gMonPalette_MrMime[] = INCBIN_U16("graphics/pokemon/mr_mime/normal_gba.gbapal"); - const u32 gMonBackPic_MrMime[] = INCBIN_U32("graphics/pokemon/mr_mime/back_gba.4bpp.lz"); + const u32 gMonBackPic_MrMime[] = INCBIN_U32("graphics/pokemon/mr_mime/back_gba.4bpp.smol"); const u16 gMonShinyPalette_MrMime[] = INCBIN_U16("graphics/pokemon/mr_mime/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4965,9 +4965,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_MrMimeGalar[] = INCBIN_U32("graphics/pokemon/mr_mime/galar/front.4bpp.lz"); + const u32 gMonFrontPic_MrMimeGalar[] = INCBIN_U32("graphics/pokemon/mr_mime/galar/front.4bpp.smol"); const u16 gMonPalette_MrMimeGalar[] = INCBIN_U16("graphics/pokemon/mr_mime/galar/normal.gbapal"); - const u32 gMonBackPic_MrMimeGalar[] = INCBIN_U32("graphics/pokemon/mr_mime/galar/back.4bpp.lz"); + const u32 gMonBackPic_MrMimeGalar[] = INCBIN_U32("graphics/pokemon/mr_mime/galar/back.4bpp.smol"); const u16 gMonShinyPalette_MrMimeGalar[] = INCBIN_U16("graphics/pokemon/mr_mime/galar/shiny.gbapal"); const u8 gMonIcon_MrMimeGalar[] = INCBIN_U8("graphics/pokemon/mr_mime/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -4978,9 +4978,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_MrRime[] = INCBIN_U32("graphics/pokemon/mr_rime/front.4bpp.lz"); + const u32 gMonFrontPic_MrRime[] = INCBIN_U32("graphics/pokemon/mr_rime/front.4bpp.smol"); const u16 gMonPalette_MrRime[] = INCBIN_U16("graphics/pokemon/mr_rime/normal.gbapal"); - const u32 gMonBackPic_MrRime[] = INCBIN_U32("graphics/pokemon/mr_rime/back.4bpp.lz"); + const u32 gMonBackPic_MrRime[] = INCBIN_U32("graphics/pokemon/mr_rime/back.4bpp.smol"); const u16 gMonShinyPalette_MrRime[] = INCBIN_U16("graphics/pokemon/mr_rime/shiny.gbapal"); const u8 gMonIcon_MrRime[] = INCBIN_U8("graphics/pokemon/mr_rime/icon.4bpp"); #if P_FOOTPRINTS @@ -4998,14 +4998,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SCYTHER #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/anim_front.4bpp.smol"); const u16 gMonPalette_Scyther[] = INCBIN_U16("graphics/pokemon/scyther/normal.gbapal"); - const u32 gMonBackPic_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/back.4bpp.lz"); + const u32 gMonBackPic_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/back.4bpp.smol"); const u16 gMonShinyPalette_Scyther[] = INCBIN_U16("graphics/pokemon/scyther/shiny.gbapal"); #else - const u32 gMonFrontPic_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Scyther[] = INCBIN_U16("graphics/pokemon/scyther/normal_gba.gbapal"); - const u32 gMonBackPic_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/back_gba.4bpp.lz"); + const u32 gMonBackPic_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Scyther[] = INCBIN_U16("graphics/pokemon/scyther/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5025,7 +5025,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_ScytherF[] = INCBIN_U32("graphics/pokemon/scyther/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_ScytherF[] = INCBIN_U32("graphics/pokemon/scyther/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_ScytherF[] = INCBIN_COMP("graphics/pokemon/scyther/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -5033,14 +5033,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/anim_front.4bpp.smol"); const u16 gMonPalette_Scizor[] = INCBIN_U16("graphics/pokemon/scizor/normal.gbapal"); - const u32 gMonBackPic_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/back.4bpp.lz"); + const u32 gMonBackPic_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/back.4bpp.smol"); const u16 gMonShinyPalette_Scizor[] = INCBIN_U16("graphics/pokemon/scizor/shiny.gbapal"); #else - const u32 gMonFrontPic_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Scizor[] = INCBIN_U16("graphics/pokemon/scizor/normal_gba.gbapal"); - const u32 gMonBackPic_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/back_gba.4bpp.lz"); + const u32 gMonBackPic_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Scizor[] = INCBIN_U16("graphics/pokemon/scizor/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5060,16 +5060,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_ScizorF[] = INCBIN_U32("graphics/pokemon/scizor/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_ScizorF[] = INCBIN_U32("graphics/pokemon/scizor/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_ScizorF[] = INCBIN_COMP("graphics/pokemon/scizor/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_ScizorMega[] = INCBIN_U32("graphics/pokemon/scizor/mega/front.4bpp.lz"); + const u32 gMonFrontPic_ScizorMega[] = INCBIN_U32("graphics/pokemon/scizor/mega/front.4bpp.smol"); const u16 gMonPalette_ScizorMega[] = INCBIN_U16("graphics/pokemon/scizor/mega/normal.gbapal"); - const u32 gMonBackPic_ScizorMega[] = INCBIN_U32("graphics/pokemon/scizor/mega/back.4bpp.lz"); + const u32 gMonBackPic_ScizorMega[] = INCBIN_U32("graphics/pokemon/scizor/mega/back.4bpp.smol"); const u16 gMonShinyPalette_ScizorMega[] = INCBIN_U16("graphics/pokemon/scizor/mega/shiny.gbapal"); const u8 gMonIcon_ScizorMega[] = INCBIN_U8("graphics/pokemon/scizor/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -5083,9 +5083,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_2_CROSS_EVOS #if P_GEN_8_CROSS_EVOS - const u32 gMonFrontPic_Kleavor[] = INCBIN_U32("graphics/pokemon/kleavor/front.4bpp.lz"); + const u32 gMonFrontPic_Kleavor[] = INCBIN_U32("graphics/pokemon/kleavor/front.4bpp.smol"); const u16 gMonPalette_Kleavor[] = INCBIN_U16("graphics/pokemon/kleavor/normal.gbapal"); - const u32 gMonBackPic_Kleavor[] = INCBIN_U32("graphics/pokemon/kleavor/back.4bpp.lz"); + const u32 gMonBackPic_Kleavor[] = INCBIN_U32("graphics/pokemon/kleavor/back.4bpp.smol"); const u16 gMonShinyPalette_Kleavor[] = INCBIN_U16("graphics/pokemon/kleavor/shiny.gbapal"); const u8 gMonIcon_Kleavor[] = INCBIN_U8("graphics/pokemon/kleavor/icon.4bpp"); #if P_FOOTPRINTS @@ -5104,14 +5104,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_JYNX #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/anim_front.4bpp.smol"); const u16 gMonPalette_Smoochum[] = INCBIN_U16("graphics/pokemon/smoochum/normal.gbapal"); - const u32 gMonBackPic_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/back.4bpp.lz"); + const u32 gMonBackPic_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/back.4bpp.smol"); const u16 gMonShinyPalette_Smoochum[] = INCBIN_U16("graphics/pokemon/smoochum/shiny.gbapal"); #else - const u32 gMonFrontPic_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Smoochum[] = INCBIN_U16("graphics/pokemon/smoochum/normal_gba.gbapal"); - const u32 gMonBackPic_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/back_gba.4bpp.lz"); + const u32 gMonBackPic_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Smoochum[] = INCBIN_U16("graphics/pokemon/smoochum/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5132,14 +5132,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/anim_front.4bpp.smol"); const u16 gMonPalette_Jynx[] = INCBIN_U16("graphics/pokemon/jynx/normal.gbapal"); - const u32 gMonBackPic_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/back.4bpp.lz"); + const u32 gMonBackPic_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/back.4bpp.smol"); const u16 gMonShinyPalette_Jynx[] = INCBIN_U16("graphics/pokemon/jynx/shiny.gbapal"); #else - const u32 gMonFrontPic_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Jynx[] = INCBIN_U16("graphics/pokemon/jynx/normal_gba.gbapal"); - const u32 gMonBackPic_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/back_gba.4bpp.lz"); + const u32 gMonBackPic_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Jynx[] = INCBIN_U16("graphics/pokemon/jynx/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5162,14 +5162,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ELECTABUZZ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/anim_front.4bpp.smol"); const u16 gMonPalette_Elekid[] = INCBIN_U16("graphics/pokemon/elekid/normal.gbapal"); - const u32 gMonBackPic_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/back.4bpp.lz"); + const u32 gMonBackPic_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/back.4bpp.smol"); const u16 gMonShinyPalette_Elekid[] = INCBIN_U16("graphics/pokemon/elekid/shiny.gbapal"); #else - const u32 gMonFrontPic_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Elekid[] = INCBIN_U16("graphics/pokemon/elekid/normal_gba.gbapal"); - const u32 gMonBackPic_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/back_gba.4bpp.lz"); + const u32 gMonBackPic_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Elekid[] = INCBIN_U16("graphics/pokemon/elekid/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5190,14 +5190,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/anim_front.4bpp.smol"); const u16 gMonPalette_Electabuzz[] = INCBIN_U16("graphics/pokemon/electabuzz/normal.gbapal"); - const u32 gMonBackPic_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/back.4bpp.lz"); + const u32 gMonBackPic_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/back.4bpp.smol"); const u16 gMonShinyPalette_Electabuzz[] = INCBIN_U16("graphics/pokemon/electabuzz/shiny.gbapal"); #else - const u32 gMonFrontPic_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Electabuzz[] = INCBIN_U16("graphics/pokemon/electabuzz/normal_gba.gbapal"); - const u32 gMonBackPic_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/back_gba.4bpp.lz"); + const u32 gMonBackPic_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Electabuzz[] = INCBIN_U16("graphics/pokemon/electabuzz/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5217,9 +5217,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Electivire[] = INCBIN_U32("graphics/pokemon/electivire/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Electivire[] = INCBIN_U32("graphics/pokemon/electivire/anim_front.4bpp.smol"); const u16 gMonPalette_Electivire[] = INCBIN_U16("graphics/pokemon/electivire/normal.gbapal"); - const u32 gMonBackPic_Electivire[] = INCBIN_U32("graphics/pokemon/electivire/back.4bpp.lz"); + const u32 gMonBackPic_Electivire[] = INCBIN_U32("graphics/pokemon/electivire/back.4bpp.smol"); const u16 gMonShinyPalette_Electivire[] = INCBIN_U16("graphics/pokemon/electivire/shiny.gbapal"); const u8 gMonIcon_Electivire[] = INCBIN_U8("graphics/pokemon/electivire/icon.4bpp"); #if P_FOOTPRINTS @@ -5238,14 +5238,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MAGMAR #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Magby[] = INCBIN_U32("graphics/pokemon/magby/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Magby[] = INCBIN_U32("graphics/pokemon/magby/anim_front.4bpp.smol"); const u16 gMonPalette_Magby[] = INCBIN_U16("graphics/pokemon/magby/normal.gbapal"); - const u32 gMonBackPic_Magby[] = INCBIN_U32("graphics/pokemon/magby/back.4bpp.lz"); + const u32 gMonBackPic_Magby[] = INCBIN_U32("graphics/pokemon/magby/back.4bpp.smol"); const u16 gMonShinyPalette_Magby[] = INCBIN_U16("graphics/pokemon/magby/shiny.gbapal"); #else - const u32 gMonFrontPic_Magby[] = INCBIN_U32("graphics/pokemon/magby/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Magby[] = INCBIN_U32("graphics/pokemon/magby/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Magby[] = INCBIN_U16("graphics/pokemon/magby/normal_gba.gbapal"); - const u32 gMonBackPic_Magby[] = INCBIN_U32("graphics/pokemon/magby/back_gba.4bpp.lz"); + const u32 gMonBackPic_Magby[] = INCBIN_U32("graphics/pokemon/magby/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Magby[] = INCBIN_U16("graphics/pokemon/magby/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5266,14 +5266,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/anim_front.4bpp.smol"); const u16 gMonPalette_Magmar[] = INCBIN_U16("graphics/pokemon/magmar/normal.gbapal"); - const u32 gMonBackPic_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/back.4bpp.lz"); + const u32 gMonBackPic_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/back.4bpp.smol"); const u16 gMonShinyPalette_Magmar[] = INCBIN_U16("graphics/pokemon/magmar/shiny.gbapal"); #else - const u32 gMonFrontPic_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Magmar[] = INCBIN_U16("graphics/pokemon/magmar/normal_gba.gbapal"); - const u32 gMonBackPic_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/back_gba.4bpp.lz"); + const u32 gMonBackPic_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Magmar[] = INCBIN_U16("graphics/pokemon/magmar/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5293,9 +5293,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Magmortar[] = INCBIN_U32("graphics/pokemon/magmortar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Magmortar[] = INCBIN_U32("graphics/pokemon/magmortar/anim_front.4bpp.smol"); const u16 gMonPalette_Magmortar[] = INCBIN_U16("graphics/pokemon/magmortar/normal.gbapal"); - const u32 gMonBackPic_Magmortar[] = INCBIN_U32("graphics/pokemon/magmortar/back.4bpp.lz"); + const u32 gMonBackPic_Magmortar[] = INCBIN_U32("graphics/pokemon/magmortar/back.4bpp.smol"); const u16 gMonShinyPalette_Magmortar[] = INCBIN_U16("graphics/pokemon/magmortar/shiny.gbapal"); const u8 gMonIcon_Magmortar[] = INCBIN_U8("graphics/pokemon/magmortar/icon.4bpp"); #if P_FOOTPRINTS @@ -5313,14 +5313,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_PINSIR #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/anim_front.4bpp.smol"); const u16 gMonPalette_Pinsir[] = INCBIN_U16("graphics/pokemon/pinsir/normal.gbapal"); - const u32 gMonBackPic_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/back.4bpp.lz"); + const u32 gMonBackPic_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/back.4bpp.smol"); const u16 gMonShinyPalette_Pinsir[] = INCBIN_U16("graphics/pokemon/pinsir/shiny.gbapal"); #else - const u32 gMonFrontPic_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Pinsir[] = INCBIN_U16("graphics/pokemon/pinsir/normal_gba.gbapal"); - const u32 gMonBackPic_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/back_gba.4bpp.lz"); + const u32 gMonBackPic_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Pinsir[] = INCBIN_U16("graphics/pokemon/pinsir/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5340,9 +5340,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_PinsirMega[] = INCBIN_U32("graphics/pokemon/pinsir/mega/front.4bpp.lz"); + const u32 gMonFrontPic_PinsirMega[] = INCBIN_U32("graphics/pokemon/pinsir/mega/front.4bpp.smol"); const u16 gMonPalette_PinsirMega[] = INCBIN_U16("graphics/pokemon/pinsir/mega/normal.gbapal"); - const u32 gMonBackPic_PinsirMega[] = INCBIN_U32("graphics/pokemon/pinsir/mega/back.4bpp.lz"); + const u32 gMonBackPic_PinsirMega[] = INCBIN_U32("graphics/pokemon/pinsir/mega/back.4bpp.smol"); const u16 gMonShinyPalette_PinsirMega[] = INCBIN_U16("graphics/pokemon/pinsir/mega/shiny.gbapal"); const u8 gMonIcon_PinsirMega[] = INCBIN_U8("graphics/pokemon/pinsir/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -5357,14 +5357,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TAUROS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/anim_front.4bpp.smol"); const u16 gMonPalette_Tauros[] = INCBIN_U16("graphics/pokemon/tauros/normal.gbapal"); - const u32 gMonBackPic_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/back.4bpp.lz"); + const u32 gMonBackPic_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/back.4bpp.smol"); const u16 gMonShinyPalette_Tauros[] = INCBIN_U16("graphics/pokemon/tauros/shiny.gbapal"); #else - const u32 gMonFrontPic_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Tauros[] = INCBIN_U16("graphics/pokemon/tauros/normal_gba.gbapal"); - const u32 gMonBackPic_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/back_gba.4bpp.lz"); + const u32 gMonBackPic_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Tauros[] = INCBIN_U16("graphics/pokemon/tauros/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5384,21 +5384,21 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_PALDEAN_FORMS - const u32 gMonFrontPic_TaurosPaldeaCombat[] = INCBIN_U32("graphics/pokemon/tauros/paldea_combat/front.4bpp.lz"); + const u32 gMonFrontPic_TaurosPaldeaCombat[] = INCBIN_U32("graphics/pokemon/tauros/paldea_combat/front.4bpp.smol"); const u16 gMonPalette_TaurosPaldeaCombat[] = INCBIN_U16("graphics/pokemon/tauros/paldea_combat/normal.gbapal"); - const u32 gMonBackPic_TaurosPaldeaCombat[] = INCBIN_U32("graphics/pokemon/tauros/paldea_combat/back.4bpp.lz"); + const u32 gMonBackPic_TaurosPaldeaCombat[] = INCBIN_U32("graphics/pokemon/tauros/paldea_combat/back.4bpp.smol"); const u16 gMonShinyPalette_TaurosPaldeaCombat[] = INCBIN_U16("graphics/pokemon/tauros/paldea_combat/shiny.gbapal"); const u8 gMonIcon_TaurosPaldeaCombat[] = INCBIN_U8("graphics/pokemon/tauros/paldea_combat/icon.4bpp"); - const u32 gMonFrontPic_TaurosPaldeaBlaze[] = INCBIN_U32("graphics/pokemon/tauros/paldea_blaze/front.4bpp.lz"); + const u32 gMonFrontPic_TaurosPaldeaBlaze[] = INCBIN_U32("graphics/pokemon/tauros/paldea_blaze/front.4bpp.smol"); const u16 gMonPalette_TaurosPaldeaBlaze[] = INCBIN_U16("graphics/pokemon/tauros/paldea_blaze/normal.gbapal"); - const u32 gMonBackPic_TaurosPaldeaBlaze[] = INCBIN_U32("graphics/pokemon/tauros/paldea_blaze/back.4bpp.lz"); + const u32 gMonBackPic_TaurosPaldeaBlaze[] = INCBIN_U32("graphics/pokemon/tauros/paldea_blaze/back.4bpp.smol"); const u16 gMonShinyPalette_TaurosPaldeaBlaze[] = INCBIN_U16("graphics/pokemon/tauros/paldea_blaze/shiny.gbapal"); const u8 gMonIcon_TaurosPaldeaBlaze[] = INCBIN_U8("graphics/pokemon/tauros/paldea_blaze/icon.4bpp"); - const u32 gMonFrontPic_TaurosPaldeaAqua[] = INCBIN_U32("graphics/pokemon/tauros/paldea_aqua/front.4bpp.lz"); + const u32 gMonFrontPic_TaurosPaldeaAqua[] = INCBIN_U32("graphics/pokemon/tauros/paldea_aqua/front.4bpp.smol"); const u16 gMonPalette_TaurosPaldeaAqua[] = INCBIN_U16("graphics/pokemon/tauros/paldea_aqua/normal.gbapal"); - const u32 gMonBackPic_TaurosPaldeaAqua[] = INCBIN_U32("graphics/pokemon/tauros/paldea_aqua/back.4bpp.lz"); + const u32 gMonBackPic_TaurosPaldeaAqua[] = INCBIN_U32("graphics/pokemon/tauros/paldea_aqua/back.4bpp.smol"); const u16 gMonShinyPalette_TaurosPaldeaAqua[] = INCBIN_U16("graphics/pokemon/tauros/paldea_aqua/shiny.gbapal"); const u8 gMonIcon_TaurosPaldeaAqua[] = INCBIN_U8("graphics/pokemon/tauros/paldea_aqua/icon.4bpp"); @@ -5420,14 +5420,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MAGIKARP #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/anim_front.4bpp.smol"); const u16 gMonPalette_Magikarp[] = INCBIN_U16("graphics/pokemon/magikarp/normal.gbapal"); - const u32 gMonBackPic_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/back.4bpp.lz"); + const u32 gMonBackPic_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/back.4bpp.smol"); const u16 gMonShinyPalette_Magikarp[] = INCBIN_U16("graphics/pokemon/magikarp/shiny.gbapal"); #else - const u32 gMonFrontPic_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Magikarp[] = INCBIN_U16("graphics/pokemon/magikarp/normal_gba.gbapal"); - const u32 gMonBackPic_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/back_gba.4bpp.lz"); + const u32 gMonBackPic_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Magikarp[] = INCBIN_U16("graphics/pokemon/magikarp/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5447,22 +5447,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_MagikarpF[] = INCBIN_U32("graphics/pokemon/magikarp/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_MagikarpF[] = INCBIN_U32("graphics/pokemon/magikarp/backf.4bpp.lz"); + const u32 gMonFrontPic_MagikarpF[] = INCBIN_U32("graphics/pokemon/magikarp/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_MagikarpF[] = INCBIN_U32("graphics/pokemon/magikarp/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_MagikarpF[] = INCBIN_COMP("graphics/pokemon/magikarp/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/anim_front.4bpp.smol"); const u16 gMonPalette_Gyarados[] = INCBIN_U16("graphics/pokemon/gyarados/normal.gbapal"); - const u32 gMonBackPic_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/back.4bpp.lz"); + const u32 gMonBackPic_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/back.4bpp.smol"); const u16 gMonShinyPalette_Gyarados[] = INCBIN_U16("graphics/pokemon/gyarados/shiny.gbapal"); #else - const u32 gMonFrontPic_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Gyarados[] = INCBIN_U16("graphics/pokemon/gyarados/normal_gba.gbapal"); - const u32 gMonBackPic_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/back_gba.4bpp.lz"); + const u32 gMonBackPic_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Gyarados[] = INCBIN_U16("graphics/pokemon/gyarados/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5482,17 +5482,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_GyaradosF[] = INCBIN_U32("graphics/pokemon/gyarados/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_GyaradosF[] = INCBIN_U32("graphics/pokemon/gyarados/backf.4bpp.lz"); + const u32 gMonFrontPic_GyaradosF[] = INCBIN_U32("graphics/pokemon/gyarados/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_GyaradosF[] = INCBIN_U32("graphics/pokemon/gyarados/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_GyaradosF[] = INCBIN_COMP("graphics/pokemon/gyarados/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_GyaradosMega[] = INCBIN_U32("graphics/pokemon/gyarados/mega/front.4bpp.lz"); + const u32 gMonFrontPic_GyaradosMega[] = INCBIN_U32("graphics/pokemon/gyarados/mega/front.4bpp.smol"); const u16 gMonPalette_GyaradosMega[] = INCBIN_U16("graphics/pokemon/gyarados/mega/normal.gbapal"); - const u32 gMonBackPic_GyaradosMega[] = INCBIN_U32("graphics/pokemon/gyarados/mega/back.4bpp.lz"); + const u32 gMonBackPic_GyaradosMega[] = INCBIN_U32("graphics/pokemon/gyarados/mega/back.4bpp.smol"); const u16 gMonShinyPalette_GyaradosMega[] = INCBIN_U16("graphics/pokemon/gyarados/mega/shiny.gbapal"); const u8 gMonIcon_GyaradosMega[] = INCBIN_U8("graphics/pokemon/gyarados/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -5507,14 +5507,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_LAPRAS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/anim_front.4bpp.smol"); const u16 gMonPalette_Lapras[] = INCBIN_U16("graphics/pokemon/lapras/normal.gbapal"); - const u32 gMonBackPic_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/back.4bpp.lz"); + const u32 gMonBackPic_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/back.4bpp.smol"); const u16 gMonShinyPalette_Lapras[] = INCBIN_U16("graphics/pokemon/lapras/shiny.gbapal"); #else - const u32 gMonFrontPic_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Lapras[] = INCBIN_U16("graphics/pokemon/lapras/normal_gba.gbapal"); - const u32 gMonBackPic_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/back_gba.4bpp.lz"); + const u32 gMonBackPic_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Lapras[] = INCBIN_U16("graphics/pokemon/lapras/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5534,8 +5534,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_LaprasGmax[] = INCBIN_U32("graphics/pokemon/lapras/gmax/front.4bpp.lz"); - const u32 gMonBackPic_LaprasGmax[] = INCBIN_U32("graphics/pokemon/lapras/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_LaprasGmax[] = INCBIN_U32("graphics/pokemon/lapras/gmax/front.4bpp.smol"); + const u32 gMonBackPic_LaprasGmax[] = INCBIN_U32("graphics/pokemon/lapras/gmax/back.4bpp.smol"); const u16 gMonPalette_LaprasGmax[] = INCBIN_U16("graphics/pokemon/lapras/gmax/normal.gbapal"); const u16 gMonShinyPalette_LaprasGmax[] = INCBIN_U16("graphics/pokemon/lapras/gmax/shiny.gbapal"); const u8 gMonIcon_LaprasGmax[] = INCBIN_U8("graphics/pokemon/lapras/gmax/icon.4bpp"); @@ -5551,14 +5551,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_DITTO #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/anim_front.4bpp.smol"); const u16 gMonPalette_Ditto[] = INCBIN_U16("graphics/pokemon/ditto/normal.gbapal"); - const u32 gMonBackPic_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/back.4bpp.lz"); + const u32 gMonBackPic_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/back.4bpp.smol"); const u16 gMonShinyPalette_Ditto[] = INCBIN_U16("graphics/pokemon/ditto/shiny.gbapal"); #else - const u32 gMonFrontPic_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ditto[] = INCBIN_U16("graphics/pokemon/ditto/normal_gba.gbapal"); - const u32 gMonBackPic_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ditto[] = INCBIN_U16("graphics/pokemon/ditto/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5580,14 +5580,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_EEVEE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/anim_front.4bpp.smol"); const u16 gMonPalette_Eevee[] = INCBIN_U16("graphics/pokemon/eevee/normal.gbapal"); - const u32 gMonBackPic_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/back.4bpp.lz"); + const u32 gMonBackPic_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/back.4bpp.smol"); const u16 gMonShinyPalette_Eevee[] = INCBIN_U16("graphics/pokemon/eevee/shiny.gbapal"); #else - const u32 gMonFrontPic_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Eevee[] = INCBIN_U16("graphics/pokemon/eevee/normal_gba.gbapal"); - const u32 gMonBackPic_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/back_gba.4bpp.lz"); + const u32 gMonBackPic_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Eevee[] = INCBIN_U16("graphics/pokemon/eevee/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5607,16 +5607,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_EeveeF[] = INCBIN_U32("graphics/pokemon/eevee/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_EeveeF[] = INCBIN_U32("graphics/pokemon/eevee/backf.4bpp.lz"); + const u32 gMonFrontPic_EeveeF[] = INCBIN_U32("graphics/pokemon/eevee/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_EeveeF[] = INCBIN_U32("graphics/pokemon/eevee/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_EeveeF[] = INCBIN_COMP("graphics/pokemon/eevee/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_EeveeGmax[] = INCBIN_U32("graphics/pokemon/eevee/gmax/front.4bpp.lz"); - const u32 gMonBackPic_EeveeGmax[] = INCBIN_U32("graphics/pokemon/eevee/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_EeveeGmax[] = INCBIN_U32("graphics/pokemon/eevee/gmax/front.4bpp.smol"); + const u32 gMonBackPic_EeveeGmax[] = INCBIN_U32("graphics/pokemon/eevee/gmax/back.4bpp.smol"); const u16 gMonPalette_EeveeGmax[] = INCBIN_U16("graphics/pokemon/eevee/gmax/normal.gbapal"); const u16 gMonShinyPalette_EeveeGmax[] = INCBIN_U16("graphics/pokemon/eevee/gmax/shiny.gbapal"); const u8 gMonIcon_EeveeGmax[] = INCBIN_U8("graphics/pokemon/eevee/gmax/icon.4bpp"); @@ -5635,14 +5635,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GENDER_DIFFERENCES && P_CUSTOM_GENDER_DIFF_ICONS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/anim_front.4bpp.smol"); const u16 gMonPalette_Vaporeon[] = INCBIN_U16("graphics/pokemon/vaporeon/normal.gbapal"); - const u32 gMonBackPic_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/back.4bpp.lz"); + const u32 gMonBackPic_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/back.4bpp.smol"); const u16 gMonShinyPalette_Vaporeon[] = INCBIN_U16("graphics/pokemon/vaporeon/shiny.gbapal"); #else - const u32 gMonFrontPic_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Vaporeon[] = INCBIN_U16("graphics/pokemon/vaporeon/normal_gba.gbapal"); - const u32 gMonBackPic_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Vaporeon[] = INCBIN_U16("graphics/pokemon/vaporeon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5662,14 +5662,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/anim_front.4bpp.smol"); const u16 gMonPalette_Jolteon[] = INCBIN_U16("graphics/pokemon/jolteon/normal.gbapal"); - const u32 gMonBackPic_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/back.4bpp.lz"); + const u32 gMonBackPic_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/back.4bpp.smol"); const u16 gMonShinyPalette_Jolteon[] = INCBIN_U16("graphics/pokemon/jolteon/shiny.gbapal"); #else - const u32 gMonFrontPic_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Jolteon[] = INCBIN_U16("graphics/pokemon/jolteon/normal_gba.gbapal"); - const u32 gMonBackPic_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Jolteon[] = INCBIN_U16("graphics/pokemon/jolteon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5689,14 +5689,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/anim_front.4bpp.smol"); const u16 gMonPalette_Flareon[] = INCBIN_U16("graphics/pokemon/flareon/normal.gbapal"); - const u32 gMonBackPic_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/back.4bpp.lz"); + const u32 gMonBackPic_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/back.4bpp.smol"); const u16 gMonShinyPalette_Flareon[] = INCBIN_U16("graphics/pokemon/flareon/shiny.gbapal"); #else - const u32 gMonFrontPic_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Flareon[] = INCBIN_U16("graphics/pokemon/flareon/normal_gba.gbapal"); - const u32 gMonBackPic_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Flareon[] = INCBIN_U16("graphics/pokemon/flareon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5717,14 +5717,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/anim_front.4bpp.smol"); const u16 gMonPalette_Espeon[] = INCBIN_U16("graphics/pokemon/espeon/normal.gbapal"); - const u32 gMonBackPic_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/back.4bpp.lz"); + const u32 gMonBackPic_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/back.4bpp.smol"); const u16 gMonShinyPalette_Espeon[] = INCBIN_U16("graphics/pokemon/espeon/shiny.gbapal"); #else - const u32 gMonFrontPic_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Espeon[] = INCBIN_U16("graphics/pokemon/espeon/normal_gba.gbapal"); - const u32 gMonBackPic_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Espeon[] = INCBIN_U16("graphics/pokemon/espeon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5744,14 +5744,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/anim_front.4bpp.smol"); const u16 gMonPalette_Umbreon[] = INCBIN_U16("graphics/pokemon/umbreon/normal.gbapal"); - const u32 gMonBackPic_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/back.4bpp.lz"); + const u32 gMonBackPic_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/back.4bpp.smol"); const u16 gMonShinyPalette_Umbreon[] = INCBIN_U16("graphics/pokemon/umbreon/shiny.gbapal"); #else - const u32 gMonFrontPic_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Umbreon[] = INCBIN_U16("graphics/pokemon/umbreon/normal_gba.gbapal"); - const u32 gMonBackPic_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Umbreon[] = INCBIN_U16("graphics/pokemon/umbreon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5772,9 +5772,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_2_CROSS_EVOS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Leafeon[] = INCBIN_U32("graphics/pokemon/leafeon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Leafeon[] = INCBIN_U32("graphics/pokemon/leafeon/anim_front.4bpp.smol"); const u16 gMonPalette_Leafeon[] = INCBIN_U16("graphics/pokemon/leafeon/normal.gbapal"); - const u32 gMonBackPic_Leafeon[] = INCBIN_U32("graphics/pokemon/leafeon/back.4bpp.lz"); + const u32 gMonBackPic_Leafeon[] = INCBIN_U32("graphics/pokemon/leafeon/back.4bpp.smol"); const u16 gMonShinyPalette_Leafeon[] = INCBIN_U16("graphics/pokemon/leafeon/shiny.gbapal"); const u8 gMonIcon_Leafeon[] = INCBIN_U8("graphics/pokemon/leafeon/icon.4bpp"); #if P_FOOTPRINTS @@ -5788,9 +5788,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Glaceon[] = INCBIN_U32("graphics/pokemon/glaceon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Glaceon[] = INCBIN_U32("graphics/pokemon/glaceon/anim_front.4bpp.smol"); const u16 gMonPalette_Glaceon[] = INCBIN_U16("graphics/pokemon/glaceon/normal.gbapal"); - const u32 gMonBackPic_Glaceon[] = INCBIN_U32("graphics/pokemon/glaceon/back.4bpp.lz"); + const u32 gMonBackPic_Glaceon[] = INCBIN_U32("graphics/pokemon/glaceon/back.4bpp.smol"); const u16 gMonShinyPalette_Glaceon[] = INCBIN_U16("graphics/pokemon/glaceon/shiny.gbapal"); const u8 gMonIcon_Glaceon[] = INCBIN_U8("graphics/pokemon/glaceon/icon.4bpp"); #if P_FOOTPRINTS @@ -5806,9 +5806,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_4_CROSS_EVOS #if P_GEN_6_CROSS_EVOS - const u32 gMonFrontPic_Sylveon[] = INCBIN_U32("graphics/pokemon/sylveon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sylveon[] = INCBIN_U32("graphics/pokemon/sylveon/anim_front.4bpp.smol"); const u16 gMonPalette_Sylveon[] = INCBIN_U16("graphics/pokemon/sylveon/normal.gbapal"); - const u32 gMonBackPic_Sylveon[] = INCBIN_U32("graphics/pokemon/sylveon/back.4bpp.lz"); + const u32 gMonBackPic_Sylveon[] = INCBIN_U32("graphics/pokemon/sylveon/back.4bpp.smol"); const u16 gMonShinyPalette_Sylveon[] = INCBIN_U16("graphics/pokemon/sylveon/shiny.gbapal"); const u8 gMonIcon_Sylveon[] = INCBIN_U8("graphics/pokemon/sylveon/icon.4bpp"); #if P_FOOTPRINTS @@ -5826,14 +5826,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_PORYGON #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/anim_front.4bpp.smol"); const u16 gMonPalette_Porygon[] = INCBIN_U16("graphics/pokemon/porygon/normal.gbapal"); - const u32 gMonBackPic_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/back.4bpp.lz"); + const u32 gMonBackPic_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/back.4bpp.smol"); const u16 gMonShinyPalette_Porygon[] = INCBIN_U16("graphics/pokemon/porygon/shiny.gbapal"); #else - const u32 gMonFrontPic_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Porygon[] = INCBIN_U16("graphics/pokemon/porygon/normal_gba.gbapal"); - const u32 gMonBackPic_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Porygon[] = INCBIN_U16("graphics/pokemon/porygon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5854,14 +5854,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/anim_front.4bpp.smol"); const u16 gMonPalette_Porygon2[] = INCBIN_U16("graphics/pokemon/porygon2/normal.gbapal"); - const u32 gMonBackPic_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/back.4bpp.lz"); + const u32 gMonBackPic_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/back.4bpp.smol"); const u16 gMonShinyPalette_Porygon2[] = INCBIN_U16("graphics/pokemon/porygon2/shiny.gbapal"); #else - const u32 gMonFrontPic_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Porygon2[] = INCBIN_U16("graphics/pokemon/porygon2/normal_gba.gbapal"); - const u32 gMonBackPic_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/back_gba.4bpp.lz"); + const u32 gMonBackPic_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Porygon2[] = INCBIN_U16("graphics/pokemon/porygon2/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5881,9 +5881,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_PorygonZ[] = INCBIN_U32("graphics/pokemon/porygon_z/anim_front.4bpp.lz"); + const u32 gMonFrontPic_PorygonZ[] = INCBIN_U32("graphics/pokemon/porygon_z/anim_front.4bpp.smol"); const u16 gMonPalette_PorygonZ[] = INCBIN_U16("graphics/pokemon/porygon_z/normal.gbapal"); - const u32 gMonBackPic_PorygonZ[] = INCBIN_U32("graphics/pokemon/porygon_z/back.4bpp.lz"); + const u32 gMonBackPic_PorygonZ[] = INCBIN_U32("graphics/pokemon/porygon_z/back.4bpp.smol"); const u16 gMonShinyPalette_PorygonZ[] = INCBIN_U16("graphics/pokemon/porygon_z/shiny.gbapal"); const u8 gMonIcon_PorygonZ[] = INCBIN_U8("graphics/pokemon/porygon_z/icon.4bpp"); #if P_FOOTPRINTS @@ -5902,14 +5902,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_OMANYTE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/anim_front.4bpp.smol"); const u16 gMonPalette_Omanyte[] = INCBIN_U16("graphics/pokemon/omanyte/normal.gbapal"); - const u32 gMonBackPic_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/back.4bpp.lz"); + const u32 gMonBackPic_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/back.4bpp.smol"); const u16 gMonShinyPalette_Omanyte[] = INCBIN_U16("graphics/pokemon/omanyte/shiny.gbapal"); #else - const u32 gMonFrontPic_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Omanyte[] = INCBIN_U16("graphics/pokemon/omanyte/normal_gba.gbapal"); - const u32 gMonBackPic_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/back_gba.4bpp.lz"); + const u32 gMonBackPic_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Omanyte[] = INCBIN_U16("graphics/pokemon/omanyte/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5929,14 +5929,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/anim_front.4bpp.smol"); const u16 gMonPalette_Omastar[] = INCBIN_U16("graphics/pokemon/omastar/normal.gbapal"); - const u32 gMonBackPic_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/back.4bpp.lz"); + const u32 gMonBackPic_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/back.4bpp.smol"); const u16 gMonShinyPalette_Omastar[] = INCBIN_U16("graphics/pokemon/omastar/shiny.gbapal"); #else - const u32 gMonFrontPic_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Omastar[] = INCBIN_U16("graphics/pokemon/omastar/normal_gba.gbapal"); - const u32 gMonBackPic_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/back_gba.4bpp.lz"); + const u32 gMonBackPic_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Omastar[] = INCBIN_U16("graphics/pokemon/omastar/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5958,14 +5958,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_KABUTO #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/anim_front.4bpp.smol"); const u16 gMonPalette_Kabuto[] = INCBIN_U16("graphics/pokemon/kabuto/normal.gbapal"); - const u32 gMonBackPic_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/back.4bpp.lz"); + const u32 gMonBackPic_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/back.4bpp.smol"); const u16 gMonShinyPalette_Kabuto[] = INCBIN_U16("graphics/pokemon/kabuto/shiny.gbapal"); #else - const u32 gMonFrontPic_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Kabuto[] = INCBIN_U16("graphics/pokemon/kabuto/normal_gba.gbapal"); - const u32 gMonBackPic_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/back_gba.4bpp.lz"); + const u32 gMonBackPic_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Kabuto[] = INCBIN_U16("graphics/pokemon/kabuto/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5985,14 +5985,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/anim_front.4bpp.smol"); const u16 gMonPalette_Kabutops[] = INCBIN_U16("graphics/pokemon/kabutops/normal.gbapal"); - const u32 gMonBackPic_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/back.4bpp.lz"); + const u32 gMonBackPic_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/back.4bpp.smol"); const u16 gMonShinyPalette_Kabutops[] = INCBIN_U16("graphics/pokemon/kabutops/shiny.gbapal"); #else - const u32 gMonFrontPic_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Kabutops[] = INCBIN_U16("graphics/pokemon/kabutops/normal_gba.gbapal"); - const u32 gMonBackPic_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/back_gba.4bpp.lz"); + const u32 gMonBackPic_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Kabutops[] = INCBIN_U16("graphics/pokemon/kabutops/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6014,14 +6014,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_AERODACTYL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/anim_front.4bpp.smol"); const u16 gMonPalette_Aerodactyl[] = INCBIN_U16("graphics/pokemon/aerodactyl/normal.gbapal"); - const u32 gMonBackPic_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/back.4bpp.lz"); + const u32 gMonBackPic_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/back.4bpp.smol"); const u16 gMonShinyPalette_Aerodactyl[] = INCBIN_U16("graphics/pokemon/aerodactyl/shiny.gbapal"); #else - const u32 gMonFrontPic_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Aerodactyl[] = INCBIN_U16("graphics/pokemon/aerodactyl/normal_gba.gbapal"); - const u32 gMonBackPic_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/back_gba.4bpp.lz"); + const u32 gMonBackPic_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Aerodactyl[] = INCBIN_U16("graphics/pokemon/aerodactyl/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6041,9 +6041,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_AerodactylMega[] = INCBIN_U32("graphics/pokemon/aerodactyl/mega/front.4bpp.lz"); + const u32 gMonFrontPic_AerodactylMega[] = INCBIN_U32("graphics/pokemon/aerodactyl/mega/front.4bpp.smol"); const u16 gMonPalette_AerodactylMega[] = INCBIN_U16("graphics/pokemon/aerodactyl/mega/normal.gbapal"); - const u32 gMonBackPic_AerodactylMega[] = INCBIN_U32("graphics/pokemon/aerodactyl/mega/back.4bpp.lz"); + const u32 gMonBackPic_AerodactylMega[] = INCBIN_U32("graphics/pokemon/aerodactyl/mega/back.4bpp.smol"); const u16 gMonShinyPalette_AerodactylMega[] = INCBIN_U16("graphics/pokemon/aerodactyl/mega/shiny.gbapal"); const u8 gMonIcon_AerodactylMega[] = INCBIN_U8("graphics/pokemon/aerodactyl/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -6058,9 +6058,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SNORLAX #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Munchlax[] = INCBIN_U32("graphics/pokemon/munchlax/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Munchlax[] = INCBIN_U32("graphics/pokemon/munchlax/anim_front.4bpp.smol"); const u16 gMonPalette_Munchlax[] = INCBIN_U16("graphics/pokemon/munchlax/normal.gbapal"); - const u32 gMonBackPic_Munchlax[] = INCBIN_U32("graphics/pokemon/munchlax/back.4bpp.lz"); + const u32 gMonBackPic_Munchlax[] = INCBIN_U32("graphics/pokemon/munchlax/back.4bpp.smol"); const u16 gMonShinyPalette_Munchlax[] = INCBIN_U16("graphics/pokemon/munchlax/shiny.gbapal"); const u8 gMonIcon_Munchlax[] = INCBIN_U8("graphics/pokemon/munchlax/icon.4bpp"); #if P_FOOTPRINTS @@ -6076,14 +6076,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_4_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/anim_front.4bpp.smol"); const u16 gMonPalette_Snorlax[] = INCBIN_U16("graphics/pokemon/snorlax/normal.gbapal"); - const u32 gMonBackPic_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/back.4bpp.lz"); + const u32 gMonBackPic_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/back.4bpp.smol"); const u16 gMonShinyPalette_Snorlax[] = INCBIN_U16("graphics/pokemon/snorlax/shiny.gbapal"); #else - const u32 gMonFrontPic_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Snorlax[] = INCBIN_U16("graphics/pokemon/snorlax/normal_gba.gbapal"); - const u32 gMonBackPic_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/back_gba.4bpp.lz"); + const u32 gMonBackPic_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Snorlax[] = INCBIN_U16("graphics/pokemon/snorlax/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6103,8 +6103,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_SnorlaxGmax[] = INCBIN_U32("graphics/pokemon/snorlax/gmax/front.4bpp.lz"); - const u32 gMonBackPic_SnorlaxGmax[] = INCBIN_U32("graphics/pokemon/snorlax/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_SnorlaxGmax[] = INCBIN_U32("graphics/pokemon/snorlax/gmax/front.4bpp.smol"); + const u32 gMonBackPic_SnorlaxGmax[] = INCBIN_U32("graphics/pokemon/snorlax/gmax/back.4bpp.smol"); const u16 gMonPalette_SnorlaxGmax[] = INCBIN_U16("graphics/pokemon/snorlax/gmax/normal.gbapal"); const u16 gMonShinyPalette_SnorlaxGmax[] = INCBIN_U16("graphics/pokemon/snorlax/gmax/shiny.gbapal"); const u8 gMonIcon_SnorlaxGmax[] = INCBIN_U8("graphics/pokemon/snorlax/gmax/icon.4bpp"); @@ -6120,14 +6120,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ARTICUNO #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/anim_front.4bpp.smol"); const u16 gMonPalette_Articuno[] = INCBIN_U16("graphics/pokemon/articuno/normal.gbapal"); - const u32 gMonBackPic_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/back.4bpp.lz"); + const u32 gMonBackPic_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/back.4bpp.smol"); const u16 gMonShinyPalette_Articuno[] = INCBIN_U16("graphics/pokemon/articuno/shiny.gbapal"); #else - const u32 gMonFrontPic_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Articuno[] = INCBIN_U16("graphics/pokemon/articuno/normal_gba.gbapal"); - const u32 gMonBackPic_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/back_gba.4bpp.lz"); + const u32 gMonBackPic_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Articuno[] = INCBIN_U16("graphics/pokemon/articuno/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6147,9 +6147,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_ArticunoGalar[] = INCBIN_U32("graphics/pokemon/articuno/galar/front.4bpp.lz"); + const u32 gMonFrontPic_ArticunoGalar[] = INCBIN_U32("graphics/pokemon/articuno/galar/front.4bpp.smol"); const u16 gMonPalette_ArticunoGalar[] = INCBIN_U16("graphics/pokemon/articuno/galar/normal.gbapal"); - const u32 gMonBackPic_ArticunoGalar[] = INCBIN_U32("graphics/pokemon/articuno/galar/back.4bpp.lz"); + const u32 gMonBackPic_ArticunoGalar[] = INCBIN_U32("graphics/pokemon/articuno/galar/back.4bpp.smol"); const u16 gMonShinyPalette_ArticunoGalar[] = INCBIN_U16("graphics/pokemon/articuno/galar/shiny.gbapal"); const u8 gMonIcon_ArticunoGalar[] = INCBIN_U8("graphics/pokemon/articuno/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -6164,14 +6164,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ZAPDOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/anim_front.4bpp.smol"); const u16 gMonPalette_Zapdos[] = INCBIN_U16("graphics/pokemon/zapdos/normal.gbapal"); - const u32 gMonBackPic_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/back.4bpp.lz"); + const u32 gMonBackPic_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/back.4bpp.smol"); const u16 gMonShinyPalette_Zapdos[] = INCBIN_U16("graphics/pokemon/zapdos/shiny.gbapal"); #else - const u32 gMonFrontPic_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Zapdos[] = INCBIN_U16("graphics/pokemon/zapdos/normal_gba.gbapal"); - const u32 gMonBackPic_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/back_gba.4bpp.lz"); + const u32 gMonBackPic_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Zapdos[] = INCBIN_U16("graphics/pokemon/zapdos/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6191,9 +6191,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_ZapdosGalar[] = INCBIN_U32("graphics/pokemon/zapdos/galar/front.4bpp.lz"); + const u32 gMonFrontPic_ZapdosGalar[] = INCBIN_U32("graphics/pokemon/zapdos/galar/front.4bpp.smol"); const u16 gMonPalette_ZapdosGalar[] = INCBIN_U16("graphics/pokemon/zapdos/galar/normal.gbapal"); - const u32 gMonBackPic_ZapdosGalar[] = INCBIN_U32("graphics/pokemon/zapdos/galar/back.4bpp.lz"); + const u32 gMonBackPic_ZapdosGalar[] = INCBIN_U32("graphics/pokemon/zapdos/galar/back.4bpp.smol"); const u16 gMonShinyPalette_ZapdosGalar[] = INCBIN_U16("graphics/pokemon/zapdos/galar/shiny.gbapal"); const u8 gMonIcon_ZapdosGalar[] = INCBIN_U8("graphics/pokemon/zapdos/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -6208,14 +6208,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MOLTRES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/anim_front.4bpp.smol"); const u16 gMonPalette_Moltres[] = INCBIN_U16("graphics/pokemon/moltres/normal.gbapal"); - const u32 gMonBackPic_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/back.4bpp.lz"); + const u32 gMonBackPic_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/back.4bpp.smol"); const u16 gMonShinyPalette_Moltres[] = INCBIN_U16("graphics/pokemon/moltres/shiny.gbapal"); #else - const u32 gMonFrontPic_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Moltres[] = INCBIN_U16("graphics/pokemon/moltres/normal_gba.gbapal"); - const u32 gMonBackPic_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/back_gba.4bpp.lz"); + const u32 gMonBackPic_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Moltres[] = INCBIN_U16("graphics/pokemon/moltres/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6235,9 +6235,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_MoltresGalar[] = INCBIN_U32("graphics/pokemon/moltres/galar/front.4bpp.lz"); + const u32 gMonFrontPic_MoltresGalar[] = INCBIN_U32("graphics/pokemon/moltres/galar/front.4bpp.smol"); const u16 gMonPalette_MoltresGalar[] = INCBIN_U16("graphics/pokemon/moltres/galar/normal.gbapal"); - const u32 gMonBackPic_MoltresGalar[] = INCBIN_U32("graphics/pokemon/moltres/galar/back.4bpp.lz"); + const u32 gMonBackPic_MoltresGalar[] = INCBIN_U32("graphics/pokemon/moltres/galar/back.4bpp.smol"); const u16 gMonShinyPalette_MoltresGalar[] = INCBIN_U16("graphics/pokemon/moltres/galar/shiny.gbapal"); const u8 gMonIcon_MoltresGalar[] = INCBIN_U8("graphics/pokemon/moltres/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -6252,14 +6252,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_DRATINI #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/anim_front.4bpp.smol"); const u16 gMonPalette_Dratini[] = INCBIN_U16("graphics/pokemon/dratini/normal.gbapal"); - const u32 gMonBackPic_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/back.4bpp.lz"); + const u32 gMonBackPic_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/back.4bpp.smol"); const u16 gMonShinyPalette_Dratini[] = INCBIN_U16("graphics/pokemon/dratini/shiny.gbapal"); #else - const u32 gMonFrontPic_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Dratini[] = INCBIN_U16("graphics/pokemon/dratini/normal_gba.gbapal"); - const u32 gMonBackPic_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/back_gba.4bpp.lz"); + const u32 gMonBackPic_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Dratini[] = INCBIN_U16("graphics/pokemon/dratini/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6279,14 +6279,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/anim_front.4bpp.smol"); const u16 gMonPalette_Dragonair[] = INCBIN_U16("graphics/pokemon/dragonair/normal.gbapal"); - const u32 gMonBackPic_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/back.4bpp.lz"); + const u32 gMonBackPic_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/back.4bpp.smol"); const u16 gMonShinyPalette_Dragonair[] = INCBIN_U16("graphics/pokemon/dragonair/shiny.gbapal"); #else - const u32 gMonFrontPic_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Dragonair[] = INCBIN_U16("graphics/pokemon/dragonair/normal_gba.gbapal"); - const u32 gMonBackPic_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/back_gba.4bpp.lz"); + const u32 gMonBackPic_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Dragonair[] = INCBIN_U16("graphics/pokemon/dragonair/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6306,14 +6306,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/anim_front.4bpp.smol"); const u16 gMonPalette_Dragonite[] = INCBIN_U16("graphics/pokemon/dragonite/normal.gbapal"); - const u32 gMonBackPic_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/back.4bpp.lz"); + const u32 gMonBackPic_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/back.4bpp.smol"); const u16 gMonShinyPalette_Dragonite[] = INCBIN_U16("graphics/pokemon/dragonite/shiny.gbapal"); #else - const u32 gMonFrontPic_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Dragonite[] = INCBIN_U16("graphics/pokemon/dragonite/normal_gba.gbapal"); - const u32 gMonBackPic_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/back_gba.4bpp.lz"); + const u32 gMonBackPic_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Dragonite[] = INCBIN_U16("graphics/pokemon/dragonite/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6335,14 +6335,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MEWTWO #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/anim_front.4bpp.smol"); const u16 gMonPalette_Mewtwo[] = INCBIN_U16("graphics/pokemon/mewtwo/normal.gbapal"); - const u32 gMonBackPic_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/back.4bpp.lz"); + const u32 gMonBackPic_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/back.4bpp.smol"); const u16 gMonShinyPalette_Mewtwo[] = INCBIN_U16("graphics/pokemon/mewtwo/shiny.gbapal"); #else - const u32 gMonFrontPic_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Mewtwo[] = INCBIN_U16("graphics/pokemon/mewtwo/normal_gba.gbapal"); - const u32 gMonBackPic_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/back_gba.4bpp.lz"); + const u32 gMonBackPic_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Mewtwo[] = INCBIN_U16("graphics/pokemon/mewtwo/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6362,9 +6362,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_MewtwoMegaX[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_x/front.4bpp.lz"); + const u32 gMonFrontPic_MewtwoMegaX[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_x/front.4bpp.smol"); const u16 gMonPalette_MewtwoMegaX[] = INCBIN_U16("graphics/pokemon/mewtwo/mega_x/normal.gbapal"); - const u32 gMonBackPic_MewtwoMegaX[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_x/back.4bpp.lz"); + const u32 gMonBackPic_MewtwoMegaX[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_x/back.4bpp.smol"); const u16 gMonShinyPalette_MewtwoMegaX[] = INCBIN_U16("graphics/pokemon/mewtwo/mega_x/shiny.gbapal"); const u8 gMonIcon_MewtwoMegaX[] = INCBIN_U8("graphics/pokemon/mewtwo/mega_x/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -6375,9 +6375,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS - const u32 gMonFrontPic_MewtwoMegaY[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_y/front.4bpp.lz"); + const u32 gMonFrontPic_MewtwoMegaY[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_y/front.4bpp.smol"); const u16 gMonPalette_MewtwoMegaY[] = INCBIN_U16("graphics/pokemon/mewtwo/mega_y/normal.gbapal"); - const u32 gMonBackPic_MewtwoMegaY[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_y/back.4bpp.lz"); + const u32 gMonBackPic_MewtwoMegaY[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_y/back.4bpp.smol"); const u16 gMonShinyPalette_MewtwoMegaY[] = INCBIN_U16("graphics/pokemon/mewtwo/mega_y/shiny.gbapal"); const u8 gMonIcon_MewtwoMegaY[] = INCBIN_U8("graphics/pokemon/mewtwo/mega_y/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -6392,14 +6392,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MEW #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Mew[] = INCBIN_U32("graphics/pokemon/mew/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mew[] = INCBIN_U32("graphics/pokemon/mew/anim_front.4bpp.smol"); const u16 gMonPalette_Mew[] = INCBIN_U16("graphics/pokemon/mew/normal.gbapal"); - const u32 gMonBackPic_Mew[] = INCBIN_U32("graphics/pokemon/mew/back.4bpp.lz"); + const u32 gMonBackPic_Mew[] = INCBIN_U32("graphics/pokemon/mew/back.4bpp.smol"); const u16 gMonShinyPalette_Mew[] = INCBIN_U16("graphics/pokemon/mew/shiny.gbapal"); #else - const u32 gMonFrontPic_Mew[] = INCBIN_U32("graphics/pokemon/mew/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Mew[] = INCBIN_U32("graphics/pokemon/mew/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Mew[] = INCBIN_U16("graphics/pokemon/mew/normal_gba.gbapal"); - const u32 gMonBackPic_Mew[] = INCBIN_U32("graphics/pokemon/mew/back_gba.4bpp.lz"); + const u32 gMonBackPic_Mew[] = INCBIN_U32("graphics/pokemon/mew/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Mew[] = INCBIN_U16("graphics/pokemon/mew/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6421,14 +6421,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CHIKORITA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/anim_front.4bpp.smol"); const u16 gMonPalette_Chikorita[] = INCBIN_U16("graphics/pokemon/chikorita/normal.gbapal"); - const u32 gMonBackPic_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/back.4bpp.lz"); + const u32 gMonBackPic_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/back.4bpp.smol"); const u16 gMonShinyPalette_Chikorita[] = INCBIN_U16("graphics/pokemon/chikorita/shiny.gbapal"); #else - const u32 gMonFrontPic_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Chikorita[] = INCBIN_U16("graphics/pokemon/chikorita/normal_gba.gbapal"); - const u32 gMonBackPic_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/back_gba.4bpp.lz"); + const u32 gMonBackPic_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Chikorita[] = INCBIN_U16("graphics/pokemon/chikorita/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6448,14 +6448,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/anim_front.4bpp.smol"); const u16 gMonPalette_Bayleef[] = INCBIN_U16("graphics/pokemon/bayleef/normal.gbapal"); - const u32 gMonBackPic_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/back.4bpp.lz"); + const u32 gMonBackPic_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/back.4bpp.smol"); const u16 gMonShinyPalette_Bayleef[] = INCBIN_U16("graphics/pokemon/bayleef/shiny.gbapal"); #else - const u32 gMonFrontPic_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Bayleef[] = INCBIN_U16("graphics/pokemon/bayleef/normal_gba.gbapal"); - const u32 gMonBackPic_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/back_gba.4bpp.lz"); + const u32 gMonBackPic_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Bayleef[] = INCBIN_U16("graphics/pokemon/bayleef/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6475,14 +6475,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/anim_front.4bpp.smol"); const u16 gMonPalette_Meganium[] = INCBIN_U16("graphics/pokemon/meganium/normal.gbapal"); - const u32 gMonBackPic_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/back.4bpp.lz"); + const u32 gMonBackPic_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/back.4bpp.smol"); const u16 gMonShinyPalette_Meganium[] = INCBIN_U16("graphics/pokemon/meganium/shiny.gbapal"); #else - const u32 gMonFrontPic_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Meganium[] = INCBIN_U16("graphics/pokemon/meganium/normal_gba.gbapal"); - const u32 gMonBackPic_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/back_gba.4bpp.lz"); + const u32 gMonBackPic_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Meganium[] = INCBIN_U16("graphics/pokemon/meganium/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6502,8 +6502,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_MeganiumF[] = INCBIN_U32("graphics/pokemon/meganium/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_MeganiumF[] = INCBIN_U32("graphics/pokemon/meganium/backf.4bpp.lz"); + const u32 gMonFrontPic_MeganiumF[] = INCBIN_U32("graphics/pokemon/meganium/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_MeganiumF[] = INCBIN_U32("graphics/pokemon/meganium/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_MeganiumF[] = INCBIN_COMP("graphics/pokemon/meganium/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -6512,14 +6512,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CYNDAQUIL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/anim_front.4bpp.smol"); const u16 gMonPalette_Cyndaquil[] = INCBIN_U16("graphics/pokemon/cyndaquil/normal.gbapal"); - const u32 gMonBackPic_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/back.4bpp.lz"); + const u32 gMonBackPic_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/back.4bpp.smol"); const u16 gMonShinyPalette_Cyndaquil[] = INCBIN_U16("graphics/pokemon/cyndaquil/shiny.gbapal"); #else - const u32 gMonFrontPic_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Cyndaquil[] = INCBIN_U16("graphics/pokemon/cyndaquil/normal_gba.gbapal"); - const u32 gMonBackPic_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/back_gba.4bpp.lz"); + const u32 gMonBackPic_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Cyndaquil[] = INCBIN_U16("graphics/pokemon/cyndaquil/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6539,14 +6539,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/anim_front.4bpp.smol"); const u16 gMonPalette_Quilava[] = INCBIN_U16("graphics/pokemon/quilava/normal.gbapal"); - const u32 gMonBackPic_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/back.4bpp.lz"); + const u32 gMonBackPic_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/back.4bpp.smol"); const u16 gMonShinyPalette_Quilava[] = INCBIN_U16("graphics/pokemon/quilava/shiny.gbapal"); #else - const u32 gMonFrontPic_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Quilava[] = INCBIN_U16("graphics/pokemon/quilava/normal_gba.gbapal"); - const u32 gMonBackPic_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/back_gba.4bpp.lz"); + const u32 gMonBackPic_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Quilava[] = INCBIN_U16("graphics/pokemon/quilava/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6566,14 +6566,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/anim_front.4bpp.smol"); const u16 gMonPalette_Typhlosion[] = INCBIN_U16("graphics/pokemon/typhlosion/normal.gbapal"); - const u32 gMonBackPic_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/back.4bpp.lz"); + const u32 gMonBackPic_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/back.4bpp.smol"); const u16 gMonShinyPalette_Typhlosion[] = INCBIN_U16("graphics/pokemon/typhlosion/shiny.gbapal"); #else - const u32 gMonFrontPic_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Typhlosion[] = INCBIN_U16("graphics/pokemon/typhlosion/normal_gba.gbapal"); - const u32 gMonBackPic_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/back_gba.4bpp.lz"); + const u32 gMonBackPic_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Typhlosion[] = INCBIN_U16("graphics/pokemon/typhlosion/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6593,9 +6593,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_TyphlosionHisui[] = INCBIN_U32("graphics/pokemon/typhlosion/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_TyphlosionHisui[] = INCBIN_U32("graphics/pokemon/typhlosion/hisui/front.4bpp.smol"); const u16 gMonPalette_TyphlosionHisui[] = INCBIN_U16("graphics/pokemon/typhlosion/hisui/normal.gbapal"); - const u32 gMonBackPic_TyphlosionHisui[] = INCBIN_U32("graphics/pokemon/typhlosion/hisui/back.4bpp.lz"); + const u32 gMonBackPic_TyphlosionHisui[] = INCBIN_U32("graphics/pokemon/typhlosion/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_TyphlosionHisui[] = INCBIN_U16("graphics/pokemon/typhlosion/hisui/shiny.gbapal"); const u8 gMonIcon_TyphlosionHisui[] = INCBIN_U8("graphics/pokemon/typhlosion/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -6610,14 +6610,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TOTODILE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/anim_front.4bpp.smol"); const u16 gMonPalette_Totodile[] = INCBIN_U16("graphics/pokemon/totodile/normal.gbapal"); - const u32 gMonBackPic_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/back.4bpp.lz"); + const u32 gMonBackPic_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/back.4bpp.smol"); const u16 gMonShinyPalette_Totodile[] = INCBIN_U16("graphics/pokemon/totodile/shiny.gbapal"); #else - const u32 gMonFrontPic_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Totodile[] = INCBIN_U16("graphics/pokemon/totodile/normal_gba.gbapal"); - const u32 gMonBackPic_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/back_gba.4bpp.lz"); + const u32 gMonBackPic_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Totodile[] = INCBIN_U16("graphics/pokemon/totodile/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6637,14 +6637,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/anim_front.4bpp.smol"); const u16 gMonPalette_Croconaw[] = INCBIN_U16("graphics/pokemon/croconaw/normal.gbapal"); - const u32 gMonBackPic_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/back.4bpp.lz"); + const u32 gMonBackPic_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/back.4bpp.smol"); const u16 gMonShinyPalette_Croconaw[] = INCBIN_U16("graphics/pokemon/croconaw/shiny.gbapal"); #else - const u32 gMonFrontPic_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Croconaw[] = INCBIN_U16("graphics/pokemon/croconaw/normal_gba.gbapal"); - const u32 gMonBackPic_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/back_gba.4bpp.lz"); + const u32 gMonBackPic_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Croconaw[] = INCBIN_U16("graphics/pokemon/croconaw/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6664,14 +6664,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/anim_front.4bpp.smol"); const u16 gMonPalette_Feraligatr[] = INCBIN_U16("graphics/pokemon/feraligatr/normal.gbapal"); - const u32 gMonBackPic_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/back.4bpp.lz"); + const u32 gMonBackPic_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/back.4bpp.smol"); const u16 gMonShinyPalette_Feraligatr[] = INCBIN_U16("graphics/pokemon/feraligatr/shiny.gbapal"); #else - const u32 gMonFrontPic_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Feraligatr[] = INCBIN_U16("graphics/pokemon/feraligatr/normal_gba.gbapal"); - const u32 gMonBackPic_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/back_gba.4bpp.lz"); + const u32 gMonBackPic_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Feraligatr[] = INCBIN_U16("graphics/pokemon/feraligatr/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6693,14 +6693,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SENTRET #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/anim_front.4bpp.smol"); const u16 gMonPalette_Sentret[] = INCBIN_U16("graphics/pokemon/sentret/normal.gbapal"); - const u32 gMonBackPic_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/back.4bpp.lz"); + const u32 gMonBackPic_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/back.4bpp.smol"); const u16 gMonShinyPalette_Sentret[] = INCBIN_U16("graphics/pokemon/sentret/shiny.gbapal"); #else - const u32 gMonFrontPic_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Sentret[] = INCBIN_U16("graphics/pokemon/sentret/normal_gba.gbapal"); - const u32 gMonBackPic_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/back_gba.4bpp.lz"); + const u32 gMonBackPic_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Sentret[] = INCBIN_U16("graphics/pokemon/sentret/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6720,14 +6720,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Furret[] = INCBIN_U32("graphics/pokemon/furret/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Furret[] = INCBIN_U32("graphics/pokemon/furret/anim_front.4bpp.smol"); const u16 gMonPalette_Furret[] = INCBIN_U16("graphics/pokemon/furret/normal.gbapal"); - const u32 gMonBackPic_Furret[] = INCBIN_U32("graphics/pokemon/furret/back.4bpp.lz"); + const u32 gMonBackPic_Furret[] = INCBIN_U32("graphics/pokemon/furret/back.4bpp.smol"); const u16 gMonShinyPalette_Furret[] = INCBIN_U16("graphics/pokemon/furret/shiny.gbapal"); #else - const u32 gMonFrontPic_Furret[] = INCBIN_U32("graphics/pokemon/furret/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Furret[] = INCBIN_U32("graphics/pokemon/furret/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Furret[] = INCBIN_U16("graphics/pokemon/furret/normal_gba.gbapal"); - const u32 gMonBackPic_Furret[] = INCBIN_U32("graphics/pokemon/furret/back_gba.4bpp.lz"); + const u32 gMonBackPic_Furret[] = INCBIN_U32("graphics/pokemon/furret/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Furret[] = INCBIN_U16("graphics/pokemon/furret/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6749,14 +6749,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_HOOTHOOT #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/anim_front.4bpp.smol"); const u16 gMonPalette_Hoothoot[] = INCBIN_U16("graphics/pokemon/hoothoot/normal.gbapal"); - const u32 gMonBackPic_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/back.4bpp.lz"); + const u32 gMonBackPic_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/back.4bpp.smol"); const u16 gMonShinyPalette_Hoothoot[] = INCBIN_U16("graphics/pokemon/hoothoot/shiny.gbapal"); #else - const u32 gMonFrontPic_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Hoothoot[] = INCBIN_U16("graphics/pokemon/hoothoot/normal_gba.gbapal"); - const u32 gMonBackPic_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/back_gba.4bpp.lz"); + const u32 gMonBackPic_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Hoothoot[] = INCBIN_U16("graphics/pokemon/hoothoot/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6776,14 +6776,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/anim_front.4bpp.smol"); const u16 gMonPalette_Noctowl[] = INCBIN_U16("graphics/pokemon/noctowl/normal.gbapal"); - const u32 gMonBackPic_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/back.4bpp.lz"); + const u32 gMonBackPic_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/back.4bpp.smol"); const u16 gMonShinyPalette_Noctowl[] = INCBIN_U16("graphics/pokemon/noctowl/shiny.gbapal"); #else - const u32 gMonFrontPic_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Noctowl[] = INCBIN_U16("graphics/pokemon/noctowl/normal_gba.gbapal"); - const u32 gMonBackPic_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/back_gba.4bpp.lz"); + const u32 gMonBackPic_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Noctowl[] = INCBIN_U16("graphics/pokemon/noctowl/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6805,14 +6805,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_LEDYBA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/anim_front.4bpp.smol"); const u16 gMonPalette_Ledyba[] = INCBIN_U16("graphics/pokemon/ledyba/normal.gbapal"); - const u32 gMonBackPic_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/back.4bpp.lz"); + const u32 gMonBackPic_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/back.4bpp.smol"); const u16 gMonShinyPalette_Ledyba[] = INCBIN_U16("graphics/pokemon/ledyba/shiny.gbapal"); #else - const u32 gMonFrontPic_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ledyba[] = INCBIN_U16("graphics/pokemon/ledyba/normal_gba.gbapal"); - const u32 gMonBackPic_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ledyba[] = INCBIN_U16("graphics/pokemon/ledyba/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6832,22 +6832,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_LedybaF[] = INCBIN_U32("graphics/pokemon/ledyba/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_LedybaF[] = INCBIN_U32("graphics/pokemon/ledyba/backf.4bpp.lz"); + const u32 gMonFrontPic_LedybaF[] = INCBIN_U32("graphics/pokemon/ledyba/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_LedybaF[] = INCBIN_U32("graphics/pokemon/ledyba/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_LedybaF[] = INCBIN_COMP("graphics/pokemon/ledyba/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/anim_front.4bpp.smol"); const u16 gMonPalette_Ledian[] = INCBIN_U16("graphics/pokemon/ledian/normal.gbapal"); - const u32 gMonBackPic_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/back.4bpp.lz"); + const u32 gMonBackPic_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/back.4bpp.smol"); const u16 gMonShinyPalette_Ledian[] = INCBIN_U16("graphics/pokemon/ledian/shiny.gbapal"); #else - const u32 gMonFrontPic_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ledian[] = INCBIN_U16("graphics/pokemon/ledian/normal_gba.gbapal"); - const u32 gMonBackPic_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ledian[] = INCBIN_U16("graphics/pokemon/ledian/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6867,8 +6867,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_LedianF[] = INCBIN_U32("graphics/pokemon/ledian/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_LedianF[] = INCBIN_U32("graphics/pokemon/ledian/backf.4bpp.lz"); + const u32 gMonFrontPic_LedianF[] = INCBIN_U32("graphics/pokemon/ledian/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_LedianF[] = INCBIN_U32("graphics/pokemon/ledian/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_LedianF[] = INCBIN_COMP("graphics/pokemon/ledian/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -6877,14 +6877,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SPINARAK #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/anim_front.4bpp.smol"); const u16 gMonPalette_Spinarak[] = INCBIN_U16("graphics/pokemon/spinarak/normal.gbapal"); - const u32 gMonBackPic_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/back.4bpp.lz"); + const u32 gMonBackPic_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/back.4bpp.smol"); const u16 gMonShinyPalette_Spinarak[] = INCBIN_U16("graphics/pokemon/spinarak/shiny.gbapal"); #else - const u32 gMonFrontPic_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Spinarak[] = INCBIN_U16("graphics/pokemon/spinarak/normal_gba.gbapal"); - const u32 gMonBackPic_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/back_gba.4bpp.lz"); + const u32 gMonBackPic_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Spinarak[] = INCBIN_U16("graphics/pokemon/spinarak/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6904,14 +6904,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/anim_front.4bpp.smol"); const u16 gMonPalette_Ariados[] = INCBIN_U16("graphics/pokemon/ariados/normal.gbapal"); - const u32 gMonBackPic_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/back.4bpp.lz"); + const u32 gMonBackPic_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/back.4bpp.smol"); const u16 gMonShinyPalette_Ariados[] = INCBIN_U16("graphics/pokemon/ariados/shiny.gbapal"); #else - const u32 gMonFrontPic_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ariados[] = INCBIN_U16("graphics/pokemon/ariados/normal_gba.gbapal"); - const u32 gMonBackPic_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ariados[] = INCBIN_U16("graphics/pokemon/ariados/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6933,14 +6933,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CHINCHOU #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/anim_front.4bpp.smol"); const u16 gMonPalette_Chinchou[] = INCBIN_U16("graphics/pokemon/chinchou/normal.gbapal"); - const u32 gMonBackPic_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/back.4bpp.lz"); + const u32 gMonBackPic_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/back.4bpp.smol"); const u16 gMonShinyPalette_Chinchou[] = INCBIN_U16("graphics/pokemon/chinchou/shiny.gbapal"); #else - const u32 gMonFrontPic_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Chinchou[] = INCBIN_U16("graphics/pokemon/chinchou/normal_gba.gbapal"); - const u32 gMonBackPic_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/back_gba.4bpp.lz"); + const u32 gMonBackPic_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Chinchou[] = INCBIN_U16("graphics/pokemon/chinchou/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6960,14 +6960,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/anim_front.4bpp.smol"); const u16 gMonPalette_Lanturn[] = INCBIN_U16("graphics/pokemon/lanturn/normal.gbapal"); - const u32 gMonBackPic_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/back.4bpp.lz"); + const u32 gMonBackPic_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/back.4bpp.smol"); const u16 gMonShinyPalette_Lanturn[] = INCBIN_U16("graphics/pokemon/lanturn/shiny.gbapal"); #else - const u32 gMonFrontPic_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Lanturn[] = INCBIN_U16("graphics/pokemon/lanturn/normal_gba.gbapal"); - const u32 gMonBackPic_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/back_gba.4bpp.lz"); + const u32 gMonBackPic_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Lanturn[] = INCBIN_U16("graphics/pokemon/lanturn/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6989,14 +6989,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TOGEPI #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/anim_front.4bpp.smol"); const u16 gMonPalette_Togepi[] = INCBIN_U16("graphics/pokemon/togepi/normal.gbapal"); - const u32 gMonBackPic_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/back.4bpp.lz"); + const u32 gMonBackPic_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/back.4bpp.smol"); const u16 gMonShinyPalette_Togepi[] = INCBIN_U16("graphics/pokemon/togepi/shiny.gbapal"); #else - const u32 gMonFrontPic_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Togepi[] = INCBIN_U16("graphics/pokemon/togepi/normal_gba.gbapal"); - const u32 gMonBackPic_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/back_gba.4bpp.lz"); + const u32 gMonBackPic_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Togepi[] = INCBIN_U16("graphics/pokemon/togepi/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7016,14 +7016,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/anim_front.4bpp.smol"); const u16 gMonPalette_Togetic[] = INCBIN_U16("graphics/pokemon/togetic/normal.gbapal"); - const u32 gMonBackPic_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/back.4bpp.lz"); + const u32 gMonBackPic_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/back.4bpp.smol"); const u16 gMonShinyPalette_Togetic[] = INCBIN_U16("graphics/pokemon/togetic/shiny.gbapal"); #else - const u32 gMonFrontPic_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Togetic[] = INCBIN_U16("graphics/pokemon/togetic/normal_gba.gbapal"); - const u32 gMonBackPic_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/back_gba.4bpp.lz"); + const u32 gMonBackPic_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Togetic[] = INCBIN_U16("graphics/pokemon/togetic/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7043,9 +7043,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Togekiss[] = INCBIN_U32("graphics/pokemon/togekiss/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Togekiss[] = INCBIN_U32("graphics/pokemon/togekiss/anim_front.4bpp.smol"); const u16 gMonPalette_Togekiss[] = INCBIN_U16("graphics/pokemon/togekiss/normal.gbapal"); - const u32 gMonBackPic_Togekiss[] = INCBIN_U32("graphics/pokemon/togekiss/back.4bpp.lz"); + const u32 gMonBackPic_Togekiss[] = INCBIN_U32("graphics/pokemon/togekiss/back.4bpp.smol"); const u16 gMonShinyPalette_Togekiss[] = INCBIN_U16("graphics/pokemon/togekiss/shiny.gbapal"); const u8 gMonIcon_Togekiss[] = INCBIN_U8("graphics/pokemon/togekiss/icon.4bpp"); #if P_FOOTPRINTS @@ -7063,14 +7063,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_NATU #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Natu[] = INCBIN_U32("graphics/pokemon/natu/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Natu[] = INCBIN_U32("graphics/pokemon/natu/anim_front.4bpp.smol"); const u16 gMonPalette_Natu[] = INCBIN_U16("graphics/pokemon/natu/normal.gbapal"); - const u32 gMonBackPic_Natu[] = INCBIN_U32("graphics/pokemon/natu/back.4bpp.lz"); + const u32 gMonBackPic_Natu[] = INCBIN_U32("graphics/pokemon/natu/back.4bpp.smol"); const u16 gMonShinyPalette_Natu[] = INCBIN_U16("graphics/pokemon/natu/shiny.gbapal"); #else - const u32 gMonFrontPic_Natu[] = INCBIN_U32("graphics/pokemon/natu/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Natu[] = INCBIN_U32("graphics/pokemon/natu/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Natu[] = INCBIN_U16("graphics/pokemon/natu/normal_gba.gbapal"); - const u32 gMonBackPic_Natu[] = INCBIN_U32("graphics/pokemon/natu/back_gba.4bpp.lz"); + const u32 gMonBackPic_Natu[] = INCBIN_U32("graphics/pokemon/natu/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Natu[] = INCBIN_U16("graphics/pokemon/natu/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7090,14 +7090,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/anim_front.4bpp.smol"); const u16 gMonPalette_Xatu[] = INCBIN_U16("graphics/pokemon/xatu/normal.gbapal"); - const u32 gMonBackPic_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/back.4bpp.lz"); + const u32 gMonBackPic_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/back.4bpp.smol"); const u16 gMonShinyPalette_Xatu[] = INCBIN_U16("graphics/pokemon/xatu/shiny.gbapal"); #else - const u32 gMonFrontPic_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Xatu[] = INCBIN_U16("graphics/pokemon/xatu/normal_gba.gbapal"); - const u32 gMonBackPic_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/back_gba.4bpp.lz"); + const u32 gMonBackPic_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Xatu[] = INCBIN_U16("graphics/pokemon/xatu/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7117,7 +7117,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_XatuF[] = INCBIN_U32("graphics/pokemon/xatu/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_XatuF[] = INCBIN_U32("graphics/pokemon/xatu/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_XatuF[] = INCBIN_COMP("graphics/pokemon/xatu/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -7126,14 +7126,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MAREEP #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/anim_front.4bpp.smol"); const u16 gMonPalette_Mareep[] = INCBIN_U16("graphics/pokemon/mareep/normal.gbapal"); - const u32 gMonBackPic_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/back.4bpp.lz"); + const u32 gMonBackPic_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/back.4bpp.smol"); const u16 gMonShinyPalette_Mareep[] = INCBIN_U16("graphics/pokemon/mareep/shiny.gbapal"); #else - const u32 gMonFrontPic_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Mareep[] = INCBIN_U16("graphics/pokemon/mareep/normal_gba.gbapal"); - const u32 gMonBackPic_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/back_gba.4bpp.lz"); + const u32 gMonBackPic_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Mareep[] = INCBIN_U16("graphics/pokemon/mareep/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7153,14 +7153,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/anim_front.4bpp.smol"); const u16 gMonPalette_Flaaffy[] = INCBIN_U16("graphics/pokemon/flaaffy/normal.gbapal"); - const u32 gMonBackPic_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/back.4bpp.lz"); + const u32 gMonBackPic_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/back.4bpp.smol"); const u16 gMonShinyPalette_Flaaffy[] = INCBIN_U16("graphics/pokemon/flaaffy/shiny.gbapal"); #else - const u32 gMonFrontPic_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Flaaffy[] = INCBIN_U16("graphics/pokemon/flaaffy/normal_gba.gbapal"); - const u32 gMonBackPic_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/back_gba.4bpp.lz"); + const u32 gMonBackPic_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Flaaffy[] = INCBIN_U16("graphics/pokemon/flaaffy/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7180,14 +7180,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/anim_front.4bpp.smol"); const u16 gMonPalette_Ampharos[] = INCBIN_U16("graphics/pokemon/ampharos/normal.gbapal"); - const u32 gMonBackPic_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/back.4bpp.lz"); + const u32 gMonBackPic_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/back.4bpp.smol"); const u16 gMonShinyPalette_Ampharos[] = INCBIN_U16("graphics/pokemon/ampharos/shiny.gbapal"); #else - const u32 gMonFrontPic_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ampharos[] = INCBIN_U16("graphics/pokemon/ampharos/normal_gba.gbapal"); - const u32 gMonBackPic_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ampharos[] = INCBIN_U16("graphics/pokemon/ampharos/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7207,9 +7207,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_AmpharosMega[] = INCBIN_U32("graphics/pokemon/ampharos/mega/front.4bpp.lz"); + const u32 gMonFrontPic_AmpharosMega[] = INCBIN_U32("graphics/pokemon/ampharos/mega/front.4bpp.smol"); const u16 gMonPalette_AmpharosMega[] = INCBIN_U16("graphics/pokemon/ampharos/mega/normal.gbapal"); - const u32 gMonBackPic_AmpharosMega[] = INCBIN_U32("graphics/pokemon/ampharos/mega/back.4bpp.lz"); + const u32 gMonBackPic_AmpharosMega[] = INCBIN_U32("graphics/pokemon/ampharos/mega/back.4bpp.smol"); const u16 gMonShinyPalette_AmpharosMega[] = INCBIN_U16("graphics/pokemon/ampharos/mega/shiny.gbapal"); const u8 gMonIcon_AmpharosMega[] = INCBIN_U8("graphics/pokemon/ampharos/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -7225,14 +7225,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MARILL #if P_GEN_3_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/anim_front.4bpp.smol"); const u16 gMonPalette_Azurill[] = INCBIN_U16("graphics/pokemon/azurill/normal.gbapal"); - const u32 gMonBackPic_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/back.4bpp.lz"); + const u32 gMonBackPic_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/back.4bpp.smol"); const u16 gMonShinyPalette_Azurill[] = INCBIN_U16("graphics/pokemon/azurill/shiny.gbapal"); #else - const u32 gMonFrontPic_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Azurill[] = INCBIN_U16("graphics/pokemon/azurill/normal_gba.gbapal"); - const u32 gMonBackPic_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/back_gba.4bpp.lz"); + const u32 gMonBackPic_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Azurill[] = INCBIN_U16("graphics/pokemon/azurill/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7253,14 +7253,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_3_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Marill[] = INCBIN_U32("graphics/pokemon/marill/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Marill[] = INCBIN_U32("graphics/pokemon/marill/anim_front.4bpp.smol"); const u16 gMonPalette_Marill[] = INCBIN_U16("graphics/pokemon/marill/normal.gbapal"); - const u32 gMonBackPic_Marill[] = INCBIN_U32("graphics/pokemon/marill/back.4bpp.lz"); + const u32 gMonBackPic_Marill[] = INCBIN_U32("graphics/pokemon/marill/back.4bpp.smol"); const u16 gMonShinyPalette_Marill[] = INCBIN_U16("graphics/pokemon/marill/shiny.gbapal"); #else - const u32 gMonFrontPic_Marill[] = INCBIN_U32("graphics/pokemon/marill/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Marill[] = INCBIN_U32("graphics/pokemon/marill/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Marill[] = INCBIN_U16("graphics/pokemon/marill/normal_gba.gbapal"); - const u32 gMonBackPic_Marill[] = INCBIN_U32("graphics/pokemon/marill/back_gba.4bpp.lz"); + const u32 gMonBackPic_Marill[] = INCBIN_U32("graphics/pokemon/marill/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Marill[] = INCBIN_U16("graphics/pokemon/marill/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7280,14 +7280,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/anim_front.4bpp.smol"); const u16 gMonPalette_Azumarill[] = INCBIN_U16("graphics/pokemon/azumarill/normal.gbapal"); - const u32 gMonBackPic_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/back.4bpp.lz"); + const u32 gMonBackPic_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/back.4bpp.smol"); const u16 gMonShinyPalette_Azumarill[] = INCBIN_U16("graphics/pokemon/azumarill/shiny.gbapal"); #else - const u32 gMonFrontPic_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Azumarill[] = INCBIN_U16("graphics/pokemon/azumarill/normal_gba.gbapal"); - const u32 gMonBackPic_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/back_gba.4bpp.lz"); + const u32 gMonBackPic_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Azumarill[] = INCBIN_U16("graphics/pokemon/azumarill/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7309,9 +7309,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SUDOWOODO #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Bonsly[] = INCBIN_U32("graphics/pokemon/bonsly/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bonsly[] = INCBIN_U32("graphics/pokemon/bonsly/anim_front.4bpp.smol"); const u16 gMonPalette_Bonsly[] = INCBIN_U16("graphics/pokemon/bonsly/normal.gbapal"); - const u32 gMonBackPic_Bonsly[] = INCBIN_U32("graphics/pokemon/bonsly/back.4bpp.lz"); + const u32 gMonBackPic_Bonsly[] = INCBIN_U32("graphics/pokemon/bonsly/back.4bpp.smol"); const u16 gMonShinyPalette_Bonsly[] = INCBIN_U16("graphics/pokemon/bonsly/shiny.gbapal"); const u8 gMonIcon_Bonsly[] = INCBIN_U8("graphics/pokemon/bonsly/icon.4bpp"); #if P_FOOTPRINTS @@ -7327,14 +7327,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_4_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/anim_front.4bpp.smol"); const u16 gMonPalette_Sudowoodo[] = INCBIN_U16("graphics/pokemon/sudowoodo/normal.gbapal"); - const u32 gMonBackPic_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/back.4bpp.lz"); + const u32 gMonBackPic_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/back.4bpp.smol"); const u16 gMonShinyPalette_Sudowoodo[] = INCBIN_U16("graphics/pokemon/sudowoodo/shiny.gbapal"); #else - const u32 gMonFrontPic_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Sudowoodo[] = INCBIN_U16("graphics/pokemon/sudowoodo/normal_gba.gbapal"); - const u32 gMonBackPic_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/back_gba.4bpp.lz"); + const u32 gMonBackPic_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Sudowoodo[] = INCBIN_U16("graphics/pokemon/sudowoodo/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7354,8 +7354,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_SudowoodoF[] = INCBIN_U32("graphics/pokemon/sudowoodo/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_SudowoodoF[] = INCBIN_U32("graphics/pokemon/sudowoodo/backf.4bpp.lz"); + const u32 gMonFrontPic_SudowoodoF[] = INCBIN_U32("graphics/pokemon/sudowoodo/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_SudowoodoF[] = INCBIN_U32("graphics/pokemon/sudowoodo/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_SudowoodoF[] = INCBIN_COMP("graphics/pokemon/sudowoodo/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -7364,14 +7364,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_HOPPIP #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/anim_front.4bpp.smol"); const u16 gMonPalette_Hoppip[] = INCBIN_U16("graphics/pokemon/hoppip/normal.gbapal"); - const u32 gMonBackPic_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/back.4bpp.lz"); + const u32 gMonBackPic_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/back.4bpp.smol"); const u16 gMonShinyPalette_Hoppip[] = INCBIN_U16("graphics/pokemon/hoppip/shiny.gbapal"); #else - const u32 gMonFrontPic_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Hoppip[] = INCBIN_U16("graphics/pokemon/hoppip/normal_gba.gbapal"); - const u32 gMonBackPic_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/back_gba.4bpp.lz"); + const u32 gMonBackPic_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Hoppip[] = INCBIN_U16("graphics/pokemon/hoppip/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7391,14 +7391,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/anim_front.4bpp.smol"); const u16 gMonPalette_Skiploom[] = INCBIN_U16("graphics/pokemon/skiploom/normal.gbapal"); - const u32 gMonBackPic_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/back.4bpp.lz"); + const u32 gMonBackPic_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/back.4bpp.smol"); const u16 gMonShinyPalette_Skiploom[] = INCBIN_U16("graphics/pokemon/skiploom/shiny.gbapal"); #else - const u32 gMonFrontPic_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Skiploom[] = INCBIN_U16("graphics/pokemon/skiploom/normal_gba.gbapal"); - const u32 gMonBackPic_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/back_gba.4bpp.lz"); + const u32 gMonBackPic_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Skiploom[] = INCBIN_U16("graphics/pokemon/skiploom/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7418,14 +7418,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/anim_front.4bpp.smol"); const u16 gMonPalette_Jumpluff[] = INCBIN_U16("graphics/pokemon/jumpluff/normal.gbapal"); - const u32 gMonBackPic_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/back.4bpp.lz"); + const u32 gMonBackPic_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/back.4bpp.smol"); const u16 gMonShinyPalette_Jumpluff[] = INCBIN_U16("graphics/pokemon/jumpluff/shiny.gbapal"); #else - const u32 gMonFrontPic_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Jumpluff[] = INCBIN_U16("graphics/pokemon/jumpluff/normal_gba.gbapal"); - const u32 gMonBackPic_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/back_gba.4bpp.lz"); + const u32 gMonBackPic_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Jumpluff[] = INCBIN_U16("graphics/pokemon/jumpluff/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7447,14 +7447,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_AIPOM #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/anim_front.4bpp.smol"); const u16 gMonPalette_Aipom[] = INCBIN_U16("graphics/pokemon/aipom/normal.gbapal"); - const u32 gMonBackPic_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/back.4bpp.lz"); + const u32 gMonBackPic_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/back.4bpp.smol"); const u16 gMonShinyPalette_Aipom[] = INCBIN_U16("graphics/pokemon/aipom/shiny.gbapal"); #else - const u32 gMonFrontPic_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Aipom[] = INCBIN_U16("graphics/pokemon/aipom/normal_gba.gbapal"); - const u32 gMonBackPic_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/back_gba.4bpp.lz"); + const u32 gMonBackPic_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Aipom[] = INCBIN_U16("graphics/pokemon/aipom/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7474,17 +7474,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_AipomF[] = INCBIN_U32("graphics/pokemon/aipom/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_AipomF[] = INCBIN_U32("graphics/pokemon/aipom/backf.4bpp.lz"); + const u32 gMonFrontPic_AipomF[] = INCBIN_U32("graphics/pokemon/aipom/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_AipomF[] = INCBIN_U32("graphics/pokemon/aipom/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_AipomF[] = INCBIN_COMP("graphics/pokemon/aipom/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Ambipom[] = INCBIN_U32("graphics/pokemon/ambipom/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ambipom[] = INCBIN_U32("graphics/pokemon/ambipom/anim_front.4bpp.smol"); const u16 gMonPalette_Ambipom[] = INCBIN_U16("graphics/pokemon/ambipom/normal.gbapal"); - const u32 gMonBackPic_Ambipom[] = INCBIN_U32("graphics/pokemon/ambipom/back.4bpp.lz"); + const u32 gMonBackPic_Ambipom[] = INCBIN_U32("graphics/pokemon/ambipom/back.4bpp.smol"); const u16 gMonShinyPalette_Ambipom[] = INCBIN_U16("graphics/pokemon/ambipom/shiny.gbapal"); const u8 gMonIcon_Ambipom[] = INCBIN_U8("graphics/pokemon/ambipom/icon.4bpp"); #if P_FOOTPRINTS @@ -7499,8 +7499,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_AmbipomF[] = INCBIN_U32("graphics/pokemon/ambipom/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_AmbipomF[] = INCBIN_U32("graphics/pokemon/ambipom/backf.4bpp.lz"); + const u32 gMonFrontPic_AmbipomF[] = INCBIN_U32("graphics/pokemon/ambipom/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_AmbipomF[] = INCBIN_U32("graphics/pokemon/ambipom/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_AmbipomF[] = INCBIN_COMP("graphics/pokemon/ambipom/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -7510,14 +7510,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SUNKERN #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/anim_front.4bpp.smol"); const u16 gMonPalette_Sunkern[] = INCBIN_U16("graphics/pokemon/sunkern/normal.gbapal"); - const u32 gMonBackPic_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/back.4bpp.lz"); + const u32 gMonBackPic_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/back.4bpp.smol"); const u16 gMonShinyPalette_Sunkern[] = INCBIN_U16("graphics/pokemon/sunkern/shiny.gbapal"); #else - const u32 gMonFrontPic_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Sunkern[] = INCBIN_U16("graphics/pokemon/sunkern/normal_gba.gbapal"); - const u32 gMonBackPic_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/back_gba.4bpp.lz"); + const u32 gMonBackPic_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Sunkern[] = INCBIN_U16("graphics/pokemon/sunkern/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7537,14 +7537,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/anim_front.4bpp.smol"); const u16 gMonPalette_Sunflora[] = INCBIN_U16("graphics/pokemon/sunflora/normal.gbapal"); - const u32 gMonBackPic_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/back.4bpp.lz"); + const u32 gMonBackPic_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/back.4bpp.smol"); const u16 gMonShinyPalette_Sunflora[] = INCBIN_U16("graphics/pokemon/sunflora/shiny.gbapal"); #else - const u32 gMonFrontPic_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Sunflora[] = INCBIN_U16("graphics/pokemon/sunflora/normal_gba.gbapal"); - const u32 gMonBackPic_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/back_gba.4bpp.lz"); + const u32 gMonBackPic_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Sunflora[] = INCBIN_U16("graphics/pokemon/sunflora/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7566,14 +7566,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_YANMA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/anim_front.4bpp.smol"); const u16 gMonPalette_Yanma[] = INCBIN_U16("graphics/pokemon/yanma/normal.gbapal"); - const u32 gMonBackPic_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/back.4bpp.lz"); + const u32 gMonBackPic_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/back.4bpp.smol"); const u16 gMonShinyPalette_Yanma[] = INCBIN_U16("graphics/pokemon/yanma/shiny.gbapal"); #else - const u32 gMonFrontPic_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Yanma[] = INCBIN_U16("graphics/pokemon/yanma/normal_gba.gbapal"); - const u32 gMonBackPic_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/back_gba.4bpp.lz"); + const u32 gMonBackPic_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Yanma[] = INCBIN_U16("graphics/pokemon/yanma/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7593,9 +7593,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Yanmega[] = INCBIN_U32("graphics/pokemon/yanmega/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Yanmega[] = INCBIN_U32("graphics/pokemon/yanmega/anim_front.4bpp.smol"); const u16 gMonPalette_Yanmega[] = INCBIN_U16("graphics/pokemon/yanmega/normal.gbapal"); - const u32 gMonBackPic_Yanmega[] = INCBIN_U32("graphics/pokemon/yanmega/back.4bpp.lz"); + const u32 gMonBackPic_Yanmega[] = INCBIN_U32("graphics/pokemon/yanmega/back.4bpp.smol"); const u16 gMonShinyPalette_Yanmega[] = INCBIN_U16("graphics/pokemon/yanmega/shiny.gbapal"); const u8 gMonIcon_Yanmega[] = INCBIN_U8("graphics/pokemon/yanmega/icon.4bpp"); #if P_FOOTPRINTS @@ -7613,14 +7613,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_WOOPER #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/anim_front.4bpp.smol"); const u16 gMonPalette_Wooper[] = INCBIN_U16("graphics/pokemon/wooper/normal.gbapal"); - const u32 gMonBackPic_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/back.4bpp.lz"); + const u32 gMonBackPic_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/back.4bpp.smol"); const u16 gMonShinyPalette_Wooper[] = INCBIN_U16("graphics/pokemon/wooper/shiny.gbapal"); #else - const u32 gMonFrontPic_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Wooper[] = INCBIN_U16("graphics/pokemon/wooper/normal_gba.gbapal"); - const u32 gMonBackPic_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/back_gba.4bpp.lz"); + const u32 gMonBackPic_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Wooper[] = INCBIN_U16("graphics/pokemon/wooper/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7640,22 +7640,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_WooperF[] = INCBIN_U32("graphics/pokemon/wooper/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_WooperF[] = INCBIN_U32("graphics/pokemon/wooper/backf.4bpp.lz"); + const u32 gMonFrontPic_WooperF[] = INCBIN_U32("graphics/pokemon/wooper/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_WooperF[] = INCBIN_U32("graphics/pokemon/wooper/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_WooperF[] = INCBIN_COMP("graphics/pokemon/wooper/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/anim_front.4bpp.smol"); const u16 gMonPalette_Quagsire[] = INCBIN_U16("graphics/pokemon/quagsire/normal.gbapal"); - const u32 gMonBackPic_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/back.4bpp.lz"); + const u32 gMonBackPic_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/back.4bpp.smol"); const u16 gMonShinyPalette_Quagsire[] = INCBIN_U16("graphics/pokemon/quagsire/shiny.gbapal"); #else - const u32 gMonFrontPic_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Quagsire[] = INCBIN_U16("graphics/pokemon/quagsire/normal_gba.gbapal"); - const u32 gMonBackPic_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/back_gba.4bpp.lz"); + const u32 gMonBackPic_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Quagsire[] = INCBIN_U16("graphics/pokemon/quagsire/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7675,17 +7675,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_QuagsireF[] = INCBIN_U32("graphics/pokemon/quagsire/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_QuagsireF[] = INCBIN_U32("graphics/pokemon/quagsire/backf.4bpp.lz"); + const u32 gMonFrontPic_QuagsireF[] = INCBIN_U32("graphics/pokemon/quagsire/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_QuagsireF[] = INCBIN_U32("graphics/pokemon/quagsire/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_QuagsireF[] = INCBIN_COMP("graphics/pokemon/quagsire/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_PALDEAN_FORMS - const u32 gMonFrontPic_WooperPaldea[] = INCBIN_U32("graphics/pokemon/wooper/paldea/front.4bpp.lz"); + const u32 gMonFrontPic_WooperPaldea[] = INCBIN_U32("graphics/pokemon/wooper/paldea/front.4bpp.smol"); const u16 gMonPalette_WooperPaldea[] = INCBIN_U16("graphics/pokemon/wooper/paldea/normal.gbapal"); - const u32 gMonBackPic_WooperPaldea[] = INCBIN_U32("graphics/pokemon/wooper/paldea/back.4bpp.lz"); + const u32 gMonBackPic_WooperPaldea[] = INCBIN_U32("graphics/pokemon/wooper/paldea/back.4bpp.smol"); const u16 gMonShinyPalette_WooperPaldea[] = INCBIN_U16("graphics/pokemon/wooper/paldea/shiny.gbapal"); const u8 gMonIcon_WooperPaldea[] = INCBIN_U8("graphics/pokemon/wooper/paldea/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -7696,9 +7696,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Clodsire[] = INCBIN_U32("graphics/pokemon/clodsire/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Clodsire[] = INCBIN_U32("graphics/pokemon/clodsire/anim_front.4bpp.smol"); const u16 gMonPalette_Clodsire[] = INCBIN_U16("graphics/pokemon/clodsire/normal.gbapal"); - const u32 gMonBackPic_Clodsire[] = INCBIN_U32("graphics/pokemon/clodsire/back.4bpp.lz"); + const u32 gMonBackPic_Clodsire[] = INCBIN_U32("graphics/pokemon/clodsire/back.4bpp.smol"); const u16 gMonShinyPalette_Clodsire[] = INCBIN_U16("graphics/pokemon/clodsire/shiny.gbapal"); const u8 gMonIcon_Clodsire[] = INCBIN_U8("graphics/pokemon/clodsire/icon.4bpp"); #if P_FOOTPRINTS @@ -7716,14 +7716,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MURKROW #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/anim_front.4bpp.smol"); const u16 gMonPalette_Murkrow[] = INCBIN_U16("graphics/pokemon/murkrow/normal.gbapal"); - const u32 gMonBackPic_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/back.4bpp.lz"); + const u32 gMonBackPic_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/back.4bpp.smol"); const u16 gMonShinyPalette_Murkrow[] = INCBIN_U16("graphics/pokemon/murkrow/shiny.gbapal"); #else - const u32 gMonFrontPic_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Murkrow[] = INCBIN_U16("graphics/pokemon/murkrow/normal_gba.gbapal"); - const u32 gMonBackPic_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/back_gba.4bpp.lz"); + const u32 gMonBackPic_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Murkrow[] = INCBIN_U16("graphics/pokemon/murkrow/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7743,17 +7743,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_MurkrowF[] = INCBIN_U32("graphics/pokemon/murkrow/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_MurkrowF[] = INCBIN_U32("graphics/pokemon/murkrow/backf.4bpp.lz"); + const u32 gMonFrontPic_MurkrowF[] = INCBIN_U32("graphics/pokemon/murkrow/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_MurkrowF[] = INCBIN_U32("graphics/pokemon/murkrow/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_MurkrowF[] = INCBIN_COMP("graphics/pokemon/murkrow/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Honchkrow[] = INCBIN_U32("graphics/pokemon/honchkrow/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Honchkrow[] = INCBIN_U32("graphics/pokemon/honchkrow/anim_front.4bpp.smol"); const u16 gMonPalette_Honchkrow[] = INCBIN_U16("graphics/pokemon/honchkrow/normal.gbapal"); - const u32 gMonBackPic_Honchkrow[] = INCBIN_U32("graphics/pokemon/honchkrow/back.4bpp.lz"); + const u32 gMonBackPic_Honchkrow[] = INCBIN_U32("graphics/pokemon/honchkrow/back.4bpp.smol"); const u16 gMonShinyPalette_Honchkrow[] = INCBIN_U16("graphics/pokemon/honchkrow/shiny.gbapal"); const u8 gMonIcon_Honchkrow[] = INCBIN_U8("graphics/pokemon/honchkrow/icon.4bpp"); #if P_FOOTPRINTS @@ -7771,14 +7771,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MISDREAVUS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/anim_front.4bpp.smol"); const u16 gMonPalette_Misdreavus[] = INCBIN_U16("graphics/pokemon/misdreavus/normal.gbapal"); - const u32 gMonBackPic_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/back.4bpp.lz"); + const u32 gMonBackPic_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/back.4bpp.smol"); const u16 gMonShinyPalette_Misdreavus[] = INCBIN_U16("graphics/pokemon/misdreavus/shiny.gbapal"); #else - const u32 gMonFrontPic_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Misdreavus[] = INCBIN_U16("graphics/pokemon/misdreavus/normal_gba.gbapal"); - const u32 gMonBackPic_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/back_gba.4bpp.lz"); + const u32 gMonBackPic_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Misdreavus[] = INCBIN_U16("graphics/pokemon/misdreavus/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7798,9 +7798,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Mismagius[] = INCBIN_U32("graphics/pokemon/mismagius/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mismagius[] = INCBIN_U32("graphics/pokemon/mismagius/anim_front.4bpp.smol"); const u16 gMonPalette_Mismagius[] = INCBIN_U16("graphics/pokemon/mismagius/normal.gbapal"); - const u32 gMonBackPic_Mismagius[] = INCBIN_U32("graphics/pokemon/mismagius/back.4bpp.lz"); + const u32 gMonBackPic_Mismagius[] = INCBIN_U32("graphics/pokemon/mismagius/back.4bpp.smol"); const u16 gMonShinyPalette_Mismagius[] = INCBIN_U16("graphics/pokemon/mismagius/shiny.gbapal"); const u8 gMonIcon_Mismagius[] = INCBIN_U8("graphics/pokemon/mismagius/icon.4bpp"); #if P_FOOTPRINTS @@ -7823,116 +7823,116 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u8 gMonFootprint_Unown[] = INCBIN_U8("graphics/pokemon/unown/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_UnownA[] = INCBIN_U32("graphics/pokemon/unown/front.4bpp.lz"); - const u32 gMonBackPic_UnownA[] = INCBIN_U32("graphics/pokemon/unown/back.4bpp.lz"); + const u32 gMonFrontPic_UnownA[] = INCBIN_U32("graphics/pokemon/unown/front.4bpp.smol"); + const u32 gMonBackPic_UnownA[] = INCBIN_U32("graphics/pokemon/unown/back.4bpp.smol"); const u8 gMonIcon_UnownA[] = INCBIN_U8("graphics/pokemon/unown/icon.4bpp"); - const u32 gMonFrontPic_UnownB[] = INCBIN_U32("graphics/pokemon/unown/b/front.4bpp.lz"); - const u32 gMonBackPic_UnownB[] = INCBIN_U32("graphics/pokemon/unown/b/back.4bpp.lz"); + const u32 gMonFrontPic_UnownB[] = INCBIN_U32("graphics/pokemon/unown/b/front.4bpp.smol"); + const u32 gMonBackPic_UnownB[] = INCBIN_U32("graphics/pokemon/unown/b/back.4bpp.smol"); const u8 gMonIcon_UnownB[] = INCBIN_U8("graphics/pokemon/unown/b/icon.4bpp"); - const u32 gMonFrontPic_UnownC[] = INCBIN_U32("graphics/pokemon/unown/c/front.4bpp.lz"); - const u32 gMonBackPic_UnownC[] = INCBIN_U32("graphics/pokemon/unown/c/back.4bpp.lz"); + const u32 gMonFrontPic_UnownC[] = INCBIN_U32("graphics/pokemon/unown/c/front.4bpp.smol"); + const u32 gMonBackPic_UnownC[] = INCBIN_U32("graphics/pokemon/unown/c/back.4bpp.smol"); const u8 gMonIcon_UnownC[] = INCBIN_U8("graphics/pokemon/unown/c/icon.4bpp"); - const u32 gMonFrontPic_UnownD[] = INCBIN_U32("graphics/pokemon/unown/d/front.4bpp.lz"); - const u32 gMonBackPic_UnownD[] = INCBIN_U32("graphics/pokemon/unown/d/back.4bpp.lz"); + const u32 gMonFrontPic_UnownD[] = INCBIN_U32("graphics/pokemon/unown/d/front.4bpp.smol"); + const u32 gMonBackPic_UnownD[] = INCBIN_U32("graphics/pokemon/unown/d/back.4bpp.smol"); const u8 gMonIcon_UnownD[] = INCBIN_U8("graphics/pokemon/unown/d/icon.4bpp"); - const u32 gMonFrontPic_UnownE[] = INCBIN_U32("graphics/pokemon/unown/e/front.4bpp.lz"); - const u32 gMonBackPic_UnownE[] = INCBIN_U32("graphics/pokemon/unown/e/back.4bpp.lz"); + const u32 gMonFrontPic_UnownE[] = INCBIN_U32("graphics/pokemon/unown/e/front.4bpp.smol"); + const u32 gMonBackPic_UnownE[] = INCBIN_U32("graphics/pokemon/unown/e/back.4bpp.smol"); const u8 gMonIcon_UnownE[] = INCBIN_U8("graphics/pokemon/unown/e/icon.4bpp"); - const u32 gMonFrontPic_UnownF[] = INCBIN_U32("graphics/pokemon/unown/f/front.4bpp.lz"); - const u32 gMonBackPic_UnownF[] = INCBIN_U32("graphics/pokemon/unown/f/back.4bpp.lz"); + const u32 gMonFrontPic_UnownF[] = INCBIN_U32("graphics/pokemon/unown/f/front.4bpp.smol"); + const u32 gMonBackPic_UnownF[] = INCBIN_U32("graphics/pokemon/unown/f/back.4bpp.smol"); const u8 gMonIcon_UnownF[] = INCBIN_U8("graphics/pokemon/unown/f/icon.4bpp"); - const u32 gMonFrontPic_UnownG[] = INCBIN_U32("graphics/pokemon/unown/g/front.4bpp.lz"); - const u32 gMonBackPic_UnownG[] = INCBIN_U32("graphics/pokemon/unown/g/back.4bpp.lz"); + const u32 gMonFrontPic_UnownG[] = INCBIN_U32("graphics/pokemon/unown/g/front.4bpp.smol"); + const u32 gMonBackPic_UnownG[] = INCBIN_U32("graphics/pokemon/unown/g/back.4bpp.smol"); const u8 gMonIcon_UnownG[] = INCBIN_U8("graphics/pokemon/unown/g/icon.4bpp"); - const u32 gMonFrontPic_UnownH[] = INCBIN_U32("graphics/pokemon/unown/h/front.4bpp.lz"); - const u32 gMonBackPic_UnownH[] = INCBIN_U32("graphics/pokemon/unown/h/back.4bpp.lz"); + const u32 gMonFrontPic_UnownH[] = INCBIN_U32("graphics/pokemon/unown/h/front.4bpp.smol"); + const u32 gMonBackPic_UnownH[] = INCBIN_U32("graphics/pokemon/unown/h/back.4bpp.smol"); const u8 gMonIcon_UnownH[] = INCBIN_U8("graphics/pokemon/unown/h/icon.4bpp"); - const u32 gMonFrontPic_UnownI[] = INCBIN_U32("graphics/pokemon/unown/i/front.4bpp.lz"); - const u32 gMonBackPic_UnownI[] = INCBIN_U32("graphics/pokemon/unown/i/back.4bpp.lz"); + const u32 gMonFrontPic_UnownI[] = INCBIN_U32("graphics/pokemon/unown/i/front.4bpp.smol"); + const u32 gMonBackPic_UnownI[] = INCBIN_U32("graphics/pokemon/unown/i/back.4bpp.smol"); const u8 gMonIcon_UnownI[] = INCBIN_U8("graphics/pokemon/unown/i/icon.4bpp"); - const u32 gMonFrontPic_UnownJ[] = INCBIN_U32("graphics/pokemon/unown/j/front.4bpp.lz"); - const u32 gMonBackPic_UnownJ[] = INCBIN_U32("graphics/pokemon/unown/j/back.4bpp.lz"); + const u32 gMonFrontPic_UnownJ[] = INCBIN_U32("graphics/pokemon/unown/j/front.4bpp.smol"); + const u32 gMonBackPic_UnownJ[] = INCBIN_U32("graphics/pokemon/unown/j/back.4bpp.smol"); const u8 gMonIcon_UnownJ[] = INCBIN_U8("graphics/pokemon/unown/j/icon.4bpp"); - const u32 gMonFrontPic_UnownK[] = INCBIN_U32("graphics/pokemon/unown/k/front.4bpp.lz"); - const u32 gMonBackPic_UnownK[] = INCBIN_U32("graphics/pokemon/unown/k/back.4bpp.lz"); + const u32 gMonFrontPic_UnownK[] = INCBIN_U32("graphics/pokemon/unown/k/front.4bpp.smol"); + const u32 gMonBackPic_UnownK[] = INCBIN_U32("graphics/pokemon/unown/k/back.4bpp.smol"); const u8 gMonIcon_UnownK[] = INCBIN_U8("graphics/pokemon/unown/k/icon.4bpp"); - const u32 gMonFrontPic_UnownL[] = INCBIN_U32("graphics/pokemon/unown/l/front.4bpp.lz"); - const u32 gMonBackPic_UnownL[] = INCBIN_U32("graphics/pokemon/unown/l/back.4bpp.lz"); + const u32 gMonFrontPic_UnownL[] = INCBIN_U32("graphics/pokemon/unown/l/front.4bpp.smol"); + const u32 gMonBackPic_UnownL[] = INCBIN_U32("graphics/pokemon/unown/l/back.4bpp.smol"); const u8 gMonIcon_UnownL[] = INCBIN_U8("graphics/pokemon/unown/l/icon.4bpp"); - const u32 gMonFrontPic_UnownM[] = INCBIN_U32("graphics/pokemon/unown/m/front.4bpp.lz"); - const u32 gMonBackPic_UnownM[] = INCBIN_U32("graphics/pokemon/unown/m/back.4bpp.lz"); + const u32 gMonFrontPic_UnownM[] = INCBIN_U32("graphics/pokemon/unown/m/front.4bpp.smol"); + const u32 gMonBackPic_UnownM[] = INCBIN_U32("graphics/pokemon/unown/m/back.4bpp.smol"); const u8 gMonIcon_UnownM[] = INCBIN_U8("graphics/pokemon/unown/m/icon.4bpp"); - const u32 gMonFrontPic_UnownN[] = INCBIN_U32("graphics/pokemon/unown/n/front.4bpp.lz"); - const u32 gMonBackPic_UnownN[] = INCBIN_U32("graphics/pokemon/unown/n/back.4bpp.lz"); + const u32 gMonFrontPic_UnownN[] = INCBIN_U32("graphics/pokemon/unown/n/front.4bpp.smol"); + const u32 gMonBackPic_UnownN[] = INCBIN_U32("graphics/pokemon/unown/n/back.4bpp.smol"); const u8 gMonIcon_UnownN[] = INCBIN_U8("graphics/pokemon/unown/n/icon.4bpp"); - const u32 gMonFrontPic_UnownO[] = INCBIN_U32("graphics/pokemon/unown/o/front.4bpp.lz"); - const u32 gMonBackPic_UnownO[] = INCBIN_U32("graphics/pokemon/unown/o/back.4bpp.lz"); + const u32 gMonFrontPic_UnownO[] = INCBIN_U32("graphics/pokemon/unown/o/front.4bpp.smol"); + const u32 gMonBackPic_UnownO[] = INCBIN_U32("graphics/pokemon/unown/o/back.4bpp.smol"); const u8 gMonIcon_UnownO[] = INCBIN_U8("graphics/pokemon/unown/o/icon.4bpp"); - const u32 gMonFrontPic_UnownP[] = INCBIN_U32("graphics/pokemon/unown/p/front.4bpp.lz"); - const u32 gMonBackPic_UnownP[] = INCBIN_U32("graphics/pokemon/unown/p/back.4bpp.lz"); + const u32 gMonFrontPic_UnownP[] = INCBIN_U32("graphics/pokemon/unown/p/front.4bpp.smol"); + const u32 gMonBackPic_UnownP[] = INCBIN_U32("graphics/pokemon/unown/p/back.4bpp.smol"); const u8 gMonIcon_UnownP[] = INCBIN_U8("graphics/pokemon/unown/p/icon.4bpp"); - const u32 gMonFrontPic_UnownQ[] = INCBIN_U32("graphics/pokemon/unown/q/front.4bpp.lz"); - const u32 gMonBackPic_UnownQ[] = INCBIN_U32("graphics/pokemon/unown/q/back.4bpp.lz"); + const u32 gMonFrontPic_UnownQ[] = INCBIN_U32("graphics/pokemon/unown/q/front.4bpp.smol"); + const u32 gMonBackPic_UnownQ[] = INCBIN_U32("graphics/pokemon/unown/q/back.4bpp.smol"); const u8 gMonIcon_UnownQ[] = INCBIN_U8("graphics/pokemon/unown/q/icon.4bpp"); - const u32 gMonFrontPic_UnownR[] = INCBIN_U32("graphics/pokemon/unown/r/front.4bpp.lz"); - const u32 gMonBackPic_UnownR[] = INCBIN_U32("graphics/pokemon/unown/r/back.4bpp.lz"); + const u32 gMonFrontPic_UnownR[] = INCBIN_U32("graphics/pokemon/unown/r/front.4bpp.smol"); + const u32 gMonBackPic_UnownR[] = INCBIN_U32("graphics/pokemon/unown/r/back.4bpp.smol"); const u8 gMonIcon_UnownR[] = INCBIN_U8("graphics/pokemon/unown/r/icon.4bpp"); - const u32 gMonFrontPic_UnownS[] = INCBIN_U32("graphics/pokemon/unown/s/front.4bpp.lz"); - const u32 gMonBackPic_UnownS[] = INCBIN_U32("graphics/pokemon/unown/s/back.4bpp.lz"); + const u32 gMonFrontPic_UnownS[] = INCBIN_U32("graphics/pokemon/unown/s/front.4bpp.smol"); + const u32 gMonBackPic_UnownS[] = INCBIN_U32("graphics/pokemon/unown/s/back.4bpp.smol"); const u8 gMonIcon_UnownS[] = INCBIN_U8("graphics/pokemon/unown/s/icon.4bpp"); - const u32 gMonFrontPic_UnownT[] = INCBIN_U32("graphics/pokemon/unown/t/front.4bpp.lz"); - const u32 gMonBackPic_UnownT[] = INCBIN_U32("graphics/pokemon/unown/t/back.4bpp.lz"); + const u32 gMonFrontPic_UnownT[] = INCBIN_U32("graphics/pokemon/unown/t/front.4bpp.smol"); + const u32 gMonBackPic_UnownT[] = INCBIN_U32("graphics/pokemon/unown/t/back.4bpp.smol"); const u8 gMonIcon_UnownT[] = INCBIN_U8("graphics/pokemon/unown/t/icon.4bpp"); - const u32 gMonFrontPic_UnownU[] = INCBIN_U32("graphics/pokemon/unown/u/front.4bpp.lz"); - const u32 gMonBackPic_UnownU[] = INCBIN_U32("graphics/pokemon/unown/u/back.4bpp.lz"); + const u32 gMonFrontPic_UnownU[] = INCBIN_U32("graphics/pokemon/unown/u/front.4bpp.smol"); + const u32 gMonBackPic_UnownU[] = INCBIN_U32("graphics/pokemon/unown/u/back.4bpp.smol"); const u8 gMonIcon_UnownU[] = INCBIN_U8("graphics/pokemon/unown/u/icon.4bpp"); - const u32 gMonFrontPic_UnownV[] = INCBIN_U32("graphics/pokemon/unown/v/front.4bpp.lz"); - const u32 gMonBackPic_UnownV[] = INCBIN_U32("graphics/pokemon/unown/v/back.4bpp.lz"); + const u32 gMonFrontPic_UnownV[] = INCBIN_U32("graphics/pokemon/unown/v/front.4bpp.smol"); + const u32 gMonBackPic_UnownV[] = INCBIN_U32("graphics/pokemon/unown/v/back.4bpp.smol"); const u8 gMonIcon_UnownV[] = INCBIN_U8("graphics/pokemon/unown/v/icon.4bpp"); - const u32 gMonFrontPic_UnownW[] = INCBIN_U32("graphics/pokemon/unown/w/front.4bpp.lz"); - const u32 gMonBackPic_UnownW[] = INCBIN_U32("graphics/pokemon/unown/w/back.4bpp.lz"); + const u32 gMonFrontPic_UnownW[] = INCBIN_U32("graphics/pokemon/unown/w/front.4bpp.smol"); + const u32 gMonBackPic_UnownW[] = INCBIN_U32("graphics/pokemon/unown/w/back.4bpp.smol"); const u8 gMonIcon_UnownW[] = INCBIN_U8("graphics/pokemon/unown/w/icon.4bpp"); - const u32 gMonFrontPic_UnownX[] = INCBIN_U32("graphics/pokemon/unown/x/front.4bpp.lz"); - const u32 gMonBackPic_UnownX[] = INCBIN_U32("graphics/pokemon/unown/x/back.4bpp.lz"); + const u32 gMonFrontPic_UnownX[] = INCBIN_U32("graphics/pokemon/unown/x/front.4bpp.smol"); + const u32 gMonBackPic_UnownX[] = INCBIN_U32("graphics/pokemon/unown/x/back.4bpp.smol"); const u8 gMonIcon_UnownX[] = INCBIN_U8("graphics/pokemon/unown/x/icon.4bpp"); - const u32 gMonFrontPic_UnownY[] = INCBIN_U32("graphics/pokemon/unown/y/front.4bpp.lz"); - const u32 gMonBackPic_UnownY[] = INCBIN_U32("graphics/pokemon/unown/y/back.4bpp.lz"); + const u32 gMonFrontPic_UnownY[] = INCBIN_U32("graphics/pokemon/unown/y/front.4bpp.smol"); + const u32 gMonBackPic_UnownY[] = INCBIN_U32("graphics/pokemon/unown/y/back.4bpp.smol"); const u8 gMonIcon_UnownY[] = INCBIN_U8("graphics/pokemon/unown/y/icon.4bpp"); - const u32 gMonFrontPic_UnownZ[] = INCBIN_U32("graphics/pokemon/unown/z/front.4bpp.lz"); - const u32 gMonBackPic_UnownZ[] = INCBIN_U32("graphics/pokemon/unown/z/back.4bpp.lz"); + const u32 gMonFrontPic_UnownZ[] = INCBIN_U32("graphics/pokemon/unown/z/front.4bpp.smol"); + const u32 gMonBackPic_UnownZ[] = INCBIN_U32("graphics/pokemon/unown/z/back.4bpp.smol"); const u8 gMonIcon_UnownZ[] = INCBIN_U8("graphics/pokemon/unown/z/icon.4bpp"); - const u32 gMonFrontPic_UnownExclamation[] = INCBIN_U32("graphics/pokemon/unown/exclamation/front.4bpp.lz"); - const u32 gMonBackPic_UnownExclamation[] = INCBIN_U32("graphics/pokemon/unown/exclamation/back.4bpp.lz"); + const u32 gMonFrontPic_UnownExclamation[] = INCBIN_U32("graphics/pokemon/unown/exclamation/front.4bpp.smol"); + const u32 gMonBackPic_UnownExclamation[] = INCBIN_U32("graphics/pokemon/unown/exclamation/back.4bpp.smol"); const u8 gMonIcon_UnownExclamation[] = INCBIN_U8("graphics/pokemon/unown/exclamation/icon.4bpp"); - const u32 gMonFrontPic_UnownQuestion[] = INCBIN_U32("graphics/pokemon/unown/question/front.4bpp.lz"); - const u32 gMonBackPic_UnownQuestion[] = INCBIN_U32("graphics/pokemon/unown/question/back.4bpp.lz"); + const u32 gMonFrontPic_UnownQuestion[] = INCBIN_U32("graphics/pokemon/unown/question/front.4bpp.smol"); + const u32 gMonBackPic_UnownQuestion[] = INCBIN_U32("graphics/pokemon/unown/question/back.4bpp.smol"); const u8 gMonIcon_UnownQuestion[] = INCBIN_U8("graphics/pokemon/unown/question/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -7974,14 +7974,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_WOBBUFFET #if P_GEN_3_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/anim_front.4bpp.smol"); const u16 gMonPalette_Wynaut[] = INCBIN_U16("graphics/pokemon/wynaut/normal.gbapal"); - const u32 gMonBackPic_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/back.4bpp.lz"); + const u32 gMonBackPic_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/back.4bpp.smol"); const u16 gMonShinyPalette_Wynaut[] = INCBIN_U16("graphics/pokemon/wynaut/shiny.gbapal"); #else - const u32 gMonFrontPic_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Wynaut[] = INCBIN_U16("graphics/pokemon/wynaut/normal_gba.gbapal"); - const u32 gMonBackPic_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/back_gba.4bpp.lz"); + const u32 gMonBackPic_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Wynaut[] = INCBIN_U16("graphics/pokemon/wynaut/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8002,14 +8002,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_3_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/anim_front.4bpp.smol"); const u16 gMonPalette_Wobbuffet[] = INCBIN_U16("graphics/pokemon/wobbuffet/normal.gbapal"); - const u32 gMonBackPic_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/back.4bpp.lz"); + const u32 gMonBackPic_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/back.4bpp.smol"); const u16 gMonShinyPalette_Wobbuffet[] = INCBIN_U16("graphics/pokemon/wobbuffet/shiny.gbapal"); #else - const u32 gMonFrontPic_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Wobbuffet[] = INCBIN_U16("graphics/pokemon/wobbuffet/normal_gba.gbapal"); - const u32 gMonBackPic_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/back_gba.4bpp.lz"); + const u32 gMonBackPic_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Wobbuffet[] = INCBIN_U16("graphics/pokemon/wobbuffet/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8029,8 +8029,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_WobbuffetF[] = INCBIN_U32("graphics/pokemon/wobbuffet/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_WobbuffetF[] = INCBIN_U32("graphics/pokemon/wobbuffet/backf.4bpp.lz"); + const u32 gMonFrontPic_WobbuffetF[] = INCBIN_U32("graphics/pokemon/wobbuffet/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_WobbuffetF[] = INCBIN_U32("graphics/pokemon/wobbuffet/backf.4bpp.smol"); #if P_CUSTOM_GENDER_DIFF_ICONS const u8 gMonIcon_WobbuffetF[] = INCBIN_U8("graphics/pokemon/wobbuffet/iconf.4bpp"); #endif @@ -8042,14 +8042,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_GIRAFARIG #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/anim_front.4bpp.smol"); const u16 gMonPalette_Girafarig[] = INCBIN_U16("graphics/pokemon/girafarig/normal.gbapal"); - const u32 gMonBackPic_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/back.4bpp.lz"); + const u32 gMonBackPic_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/back.4bpp.smol"); const u16 gMonShinyPalette_Girafarig[] = INCBIN_U16("graphics/pokemon/girafarig/shiny.gbapal"); #else - const u32 gMonFrontPic_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Girafarig[] = INCBIN_U16("graphics/pokemon/girafarig/normal_gba.gbapal"); - const u32 gMonBackPic_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/back_gba.4bpp.lz"); + const u32 gMonBackPic_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Girafarig[] = INCBIN_U16("graphics/pokemon/girafarig/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8069,17 +8069,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_GirafarigF[] = INCBIN_U32("graphics/pokemon/girafarig/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_GirafarigF[] = INCBIN_U32("graphics/pokemon/girafarig/backf.4bpp.lz"); + const u32 gMonFrontPic_GirafarigF[] = INCBIN_U32("graphics/pokemon/girafarig/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_GirafarigF[] = INCBIN_U32("graphics/pokemon/girafarig/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_GirafarigF[] = INCBIN_COMP("graphics/pokemon/girafarig/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_GEN_9_CROSS_EVOS - const u32 gMonFrontPic_Farigiraf[] = INCBIN_U32("graphics/pokemon/farigiraf/front.4bpp.lz"); + const u32 gMonFrontPic_Farigiraf[] = INCBIN_U32("graphics/pokemon/farigiraf/front.4bpp.smol"); const u16 gMonPalette_Farigiraf[] = INCBIN_U16("graphics/pokemon/farigiraf/normal.gbapal"); - const u32 gMonBackPic_Farigiraf[] = INCBIN_U32("graphics/pokemon/farigiraf/back.4bpp.lz"); + const u32 gMonBackPic_Farigiraf[] = INCBIN_U32("graphics/pokemon/farigiraf/back.4bpp.smol"); const u16 gMonShinyPalette_Farigiraf[] = INCBIN_U16("graphics/pokemon/farigiraf/shiny.gbapal"); const u8 gMonIcon_Farigiraf[] = INCBIN_U8("graphics/pokemon/farigiraf/icon.4bpp"); #if P_FOOTPRINTS @@ -8097,14 +8097,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_PINECO #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/anim_front.4bpp.smol"); const u16 gMonPalette_Pineco[] = INCBIN_U16("graphics/pokemon/pineco/normal.gbapal"); - const u32 gMonBackPic_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/back.4bpp.lz"); + const u32 gMonBackPic_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/back.4bpp.smol"); const u16 gMonShinyPalette_Pineco[] = INCBIN_U16("graphics/pokemon/pineco/shiny.gbapal"); #else - const u32 gMonFrontPic_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Pineco[] = INCBIN_U16("graphics/pokemon/pineco/normal_gba.gbapal"); - const u32 gMonBackPic_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/back_gba.4bpp.lz"); + const u32 gMonBackPic_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Pineco[] = INCBIN_U16("graphics/pokemon/pineco/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8124,14 +8124,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/anim_front.4bpp.smol"); const u16 gMonPalette_Forretress[] = INCBIN_U16("graphics/pokemon/forretress/normal.gbapal"); - const u32 gMonBackPic_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/back.4bpp.lz"); + const u32 gMonBackPic_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/back.4bpp.smol"); const u16 gMonShinyPalette_Forretress[] = INCBIN_U16("graphics/pokemon/forretress/shiny.gbapal"); #else - const u32 gMonFrontPic_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Forretress[] = INCBIN_U16("graphics/pokemon/forretress/normal_gba.gbapal"); - const u32 gMonBackPic_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/back_gba.4bpp.lz"); + const u32 gMonBackPic_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Forretress[] = INCBIN_U16("graphics/pokemon/forretress/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8153,14 +8153,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_DUNSPARCE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/anim_front.4bpp.smol"); const u16 gMonPalette_Dunsparce[] = INCBIN_U16("graphics/pokemon/dunsparce/normal.gbapal"); - const u32 gMonBackPic_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/back.4bpp.lz"); + const u32 gMonBackPic_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/back.4bpp.smol"); const u16 gMonShinyPalette_Dunsparce[] = INCBIN_U16("graphics/pokemon/dunsparce/shiny.gbapal"); #else - const u32 gMonFrontPic_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Dunsparce[] = INCBIN_U16("graphics/pokemon/dunsparce/normal_gba.gbapal"); - const u32 gMonBackPic_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/back_gba.4bpp.lz"); + const u32 gMonBackPic_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Dunsparce[] = INCBIN_U16("graphics/pokemon/dunsparce/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8197,24 +8197,24 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_DudunsparceTwoSegment[] = INCBIN_U32("graphics/pokemon/dudunsparce/front.4bpp.lz"); - const u32 gMonBackPic_DudunsparceTwoSegment[] = INCBIN_U32("graphics/pokemon/dudunsparce/back.4bpp.lz"); + const u32 gMonFrontPic_DudunsparceTwoSegment[] = INCBIN_U32("graphics/pokemon/dudunsparce/front.4bpp.smol"); + const u32 gMonBackPic_DudunsparceTwoSegment[] = INCBIN_U32("graphics/pokemon/dudunsparce/back.4bpp.smol"); - const u32 gMonFrontPic_DudunsparceThreeSegment[] = INCBIN_U32("graphics/pokemon/dudunsparce/three_segment/front.4bpp.lz"); - const u32 gMonBackPic_DudunsparceThreeSegment[] = INCBIN_U32("graphics/pokemon/dudunsparce/three_segment/back.4bpp.lz"); + const u32 gMonFrontPic_DudunsparceThreeSegment[] = INCBIN_U32("graphics/pokemon/dudunsparce/three_segment/front.4bpp.smol"); + const u32 gMonBackPic_DudunsparceThreeSegment[] = INCBIN_U32("graphics/pokemon/dudunsparce/three_segment/back.4bpp.smol"); #endif //P_GEN_9_CROSS_EVOS #endif //P_FAMILY_DUNSPARCE #if P_FAMILY_GLIGAR #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/anim_front.4bpp.smol"); const u16 gMonPalette_Gligar[] = INCBIN_U16("graphics/pokemon/gligar/normal.gbapal"); - const u32 gMonBackPic_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/back.4bpp.lz"); + const u32 gMonBackPic_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/back.4bpp.smol"); const u16 gMonShinyPalette_Gligar[] = INCBIN_U16("graphics/pokemon/gligar/shiny.gbapal"); #else - const u32 gMonFrontPic_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Gligar[] = INCBIN_U16("graphics/pokemon/gligar/normal_gba.gbapal"); - const u32 gMonBackPic_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/back_gba.4bpp.lz"); + const u32 gMonBackPic_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Gligar[] = INCBIN_U16("graphics/pokemon/gligar/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8234,17 +8234,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_GligarF[] = INCBIN_U32("graphics/pokemon/gligar/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_GligarF[] = INCBIN_U32("graphics/pokemon/gligar/backf.4bpp.lz"); + const u32 gMonFrontPic_GligarF[] = INCBIN_U32("graphics/pokemon/gligar/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_GligarF[] = INCBIN_U32("graphics/pokemon/gligar/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_GligarF[] = INCBIN_COMP("graphics/pokemon/gligar/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Gliscor[] = INCBIN_U32("graphics/pokemon/gliscor/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gliscor[] = INCBIN_U32("graphics/pokemon/gliscor/anim_front.4bpp.smol"); const u16 gMonPalette_Gliscor[] = INCBIN_U16("graphics/pokemon/gliscor/normal.gbapal"); - const u32 gMonBackPic_Gliscor[] = INCBIN_U32("graphics/pokemon/gliscor/back.4bpp.lz"); + const u32 gMonBackPic_Gliscor[] = INCBIN_U32("graphics/pokemon/gliscor/back.4bpp.smol"); const u16 gMonShinyPalette_Gliscor[] = INCBIN_U16("graphics/pokemon/gliscor/shiny.gbapal"); const u8 gMonIcon_Gliscor[] = INCBIN_U8("graphics/pokemon/gliscor/icon.4bpp"); #if P_FOOTPRINTS @@ -8262,14 +8262,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SNUBBULL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/anim_front.4bpp.smol"); const u16 gMonPalette_Snubbull[] = INCBIN_U16("graphics/pokemon/snubbull/normal.gbapal"); - const u32 gMonBackPic_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/back.4bpp.lz"); + const u32 gMonBackPic_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/back.4bpp.smol"); const u16 gMonShinyPalette_Snubbull[] = INCBIN_U16("graphics/pokemon/snubbull/shiny.gbapal"); #else - const u32 gMonFrontPic_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Snubbull[] = INCBIN_U16("graphics/pokemon/snubbull/normal_gba.gbapal"); - const u32 gMonBackPic_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/back_gba.4bpp.lz"); + const u32 gMonBackPic_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Snubbull[] = INCBIN_U16("graphics/pokemon/snubbull/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8289,14 +8289,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/anim_front.4bpp.smol"); const u16 gMonPalette_Granbull[] = INCBIN_U16("graphics/pokemon/granbull/normal.gbapal"); - const u32 gMonBackPic_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/back.4bpp.lz"); + const u32 gMonBackPic_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/back.4bpp.smol"); const u16 gMonShinyPalette_Granbull[] = INCBIN_U16("graphics/pokemon/granbull/shiny.gbapal"); #else - const u32 gMonFrontPic_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Granbull[] = INCBIN_U16("graphics/pokemon/granbull/normal_gba.gbapal"); - const u32 gMonBackPic_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/back_gba.4bpp.lz"); + const u32 gMonBackPic_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Granbull[] = INCBIN_U16("graphics/pokemon/granbull/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8318,14 +8318,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_QWILFISH #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/anim_front.4bpp.smol"); const u16 gMonPalette_Qwilfish[] = INCBIN_U16("graphics/pokemon/qwilfish/normal.gbapal"); - const u32 gMonBackPic_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/back.4bpp.lz"); + const u32 gMonBackPic_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/back.4bpp.smol"); const u16 gMonShinyPalette_Qwilfish[] = INCBIN_U16("graphics/pokemon/qwilfish/shiny.gbapal"); #else - const u32 gMonFrontPic_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Qwilfish[] = INCBIN_U16("graphics/pokemon/qwilfish/normal_gba.gbapal"); - const u32 gMonBackPic_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/back_gba.4bpp.lz"); + const u32 gMonBackPic_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Qwilfish[] = INCBIN_U16("graphics/pokemon/qwilfish/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8345,9 +8345,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_QwilfishHisui[] = INCBIN_U32("graphics/pokemon/qwilfish/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_QwilfishHisui[] = INCBIN_U32("graphics/pokemon/qwilfish/hisui/front.4bpp.smol"); const u16 gMonPalette_QwilfishHisui[] = INCBIN_U16("graphics/pokemon/qwilfish/hisui/normal.gbapal"); - const u32 gMonBackPic_QwilfishHisui[] = INCBIN_U32("graphics/pokemon/qwilfish/hisui/back.4bpp.lz"); + const u32 gMonBackPic_QwilfishHisui[] = INCBIN_U32("graphics/pokemon/qwilfish/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_QwilfishHisui[] = INCBIN_U16("graphics/pokemon/qwilfish/hisui/shiny.gbapal"); const u8 gMonIcon_QwilfishHisui[] = INCBIN_U8("graphics/pokemon/qwilfish/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -8358,9 +8358,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Overqwil[] = INCBIN_U32("graphics/pokemon/overqwil/front.4bpp.lz"); + const u32 gMonFrontPic_Overqwil[] = INCBIN_U32("graphics/pokemon/overqwil/front.4bpp.smol"); const u16 gMonPalette_Overqwil[] = INCBIN_U16("graphics/pokemon/overqwil/normal.gbapal"); - const u32 gMonBackPic_Overqwil[] = INCBIN_U32("graphics/pokemon/overqwil/back.4bpp.lz"); + const u32 gMonBackPic_Overqwil[] = INCBIN_U32("graphics/pokemon/overqwil/back.4bpp.smol"); const u16 gMonShinyPalette_Overqwil[] = INCBIN_U16("graphics/pokemon/overqwil/shiny.gbapal"); const u8 gMonIcon_Overqwil[] = INCBIN_U8("graphics/pokemon/overqwil/icon.4bpp"); #if P_FOOTPRINTS @@ -8378,14 +8378,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SHUCKLE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/anim_front.4bpp.smol"); const u16 gMonPalette_Shuckle[] = INCBIN_U16("graphics/pokemon/shuckle/normal.gbapal"); - const u32 gMonBackPic_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/back.4bpp.lz"); + const u32 gMonBackPic_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/back.4bpp.smol"); const u16 gMonShinyPalette_Shuckle[] = INCBIN_U16("graphics/pokemon/shuckle/shiny.gbapal"); #else - const u32 gMonFrontPic_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Shuckle[] = INCBIN_U16("graphics/pokemon/shuckle/normal_gba.gbapal"); - const u32 gMonBackPic_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/back_gba.4bpp.lz"); + const u32 gMonBackPic_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Shuckle[] = INCBIN_U16("graphics/pokemon/shuckle/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8407,14 +8407,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_HERACROSS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/anim_front.4bpp.smol"); const u16 gMonPalette_Heracross[] = INCBIN_U16("graphics/pokemon/heracross/normal.gbapal"); - const u32 gMonBackPic_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/back.4bpp.lz"); + const u32 gMonBackPic_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/back.4bpp.smol"); const u16 gMonShinyPalette_Heracross[] = INCBIN_U16("graphics/pokemon/heracross/shiny.gbapal"); #else - const u32 gMonFrontPic_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Heracross[] = INCBIN_U16("graphics/pokemon/heracross/normal_gba.gbapal"); - const u32 gMonBackPic_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/back_gba.4bpp.lz"); + const u32 gMonBackPic_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Heracross[] = INCBIN_U16("graphics/pokemon/heracross/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8434,17 +8434,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_HeracrossF[] = INCBIN_U32("graphics/pokemon/heracross/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_HeracrossF[] = INCBIN_U32("graphics/pokemon/heracross/backf.4bpp.lz"); + const u32 gMonFrontPic_HeracrossF[] = INCBIN_U32("graphics/pokemon/heracross/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_HeracrossF[] = INCBIN_U32("graphics/pokemon/heracross/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_HeracrossF[] = INCBIN_COMP("graphics/pokemon/heracross/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_HeracrossMega[] = INCBIN_U32("graphics/pokemon/heracross/mega/front.4bpp.lz"); + const u32 gMonFrontPic_HeracrossMega[] = INCBIN_U32("graphics/pokemon/heracross/mega/front.4bpp.smol"); const u16 gMonPalette_HeracrossMega[] = INCBIN_U16("graphics/pokemon/heracross/mega/normal.gbapal"); - const u32 gMonBackPic_HeracrossMega[] = INCBIN_U32("graphics/pokemon/heracross/mega/back.4bpp.lz"); + const u32 gMonBackPic_HeracrossMega[] = INCBIN_U32("graphics/pokemon/heracross/mega/back.4bpp.smol"); const u16 gMonShinyPalette_HeracrossMega[] = INCBIN_U16("graphics/pokemon/heracross/mega/shiny.gbapal"); const u8 gMonIcon_HeracrossMega[] = INCBIN_U8("graphics/pokemon/heracross/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -8459,14 +8459,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SNEASEL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/anim_front.4bpp.smol"); const u16 gMonPalette_Sneasel[] = INCBIN_U16("graphics/pokemon/sneasel/normal.gbapal"); - const u32 gMonBackPic_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/back.4bpp.lz"); + const u32 gMonBackPic_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/back.4bpp.smol"); const u16 gMonShinyPalette_Sneasel[] = INCBIN_U16("graphics/pokemon/sneasel/shiny.gbapal"); #else - const u32 gMonFrontPic_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Sneasel[] = INCBIN_U16("graphics/pokemon/sneasel/normal_gba.gbapal"); - const u32 gMonBackPic_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/back_gba.4bpp.lz"); + const u32 gMonBackPic_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Sneasel[] = INCBIN_U16("graphics/pokemon/sneasel/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8486,17 +8486,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_SneaselF[] = INCBIN_U32("graphics/pokemon/sneasel/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_SneaselF[] = INCBIN_U32("graphics/pokemon/sneasel/backf.4bpp.lz"); + const u32 gMonFrontPic_SneaselF[] = INCBIN_U32("graphics/pokemon/sneasel/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_SneaselF[] = INCBIN_U32("graphics/pokemon/sneasel/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_SneaselF[] = INCBIN_COMP("graphics/pokemon/sneasel/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Weavile[] = INCBIN_U32("graphics/pokemon/weavile/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Weavile[] = INCBIN_U32("graphics/pokemon/weavile/anim_front.4bpp.smol"); const u16 gMonPalette_Weavile[] = INCBIN_U16("graphics/pokemon/weavile/normal.gbapal"); - const u32 gMonBackPic_Weavile[] = INCBIN_U32("graphics/pokemon/weavile/back.4bpp.lz"); + const u32 gMonBackPic_Weavile[] = INCBIN_U32("graphics/pokemon/weavile/back.4bpp.smol"); const u16 gMonShinyPalette_Weavile[] = INCBIN_U16("graphics/pokemon/weavile/shiny.gbapal"); const u8 gMonIcon_Weavile[] = INCBIN_U8("graphics/pokemon/weavile/icon.4bpp"); #if P_FOOTPRINTS @@ -8511,8 +8511,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_WeavileF[] = INCBIN_U32("graphics/pokemon/weavile/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_WeavileF[] = INCBIN_U32("graphics/pokemon/weavile/backf.4bpp.lz"); + const u32 gMonFrontPic_WeavileF[] = INCBIN_U32("graphics/pokemon/weavile/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_WeavileF[] = INCBIN_U32("graphics/pokemon/weavile/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_WeavileF[] = INCBIN_COMP("graphics/pokemon/weavile/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -8520,9 +8520,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_4_CROSS_EVOS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_SneaselHisui[] = INCBIN_U32("graphics/pokemon/sneasel/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_SneaselHisui[] = INCBIN_U32("graphics/pokemon/sneasel/hisui/front.4bpp.smol"); const u16 gMonPalette_SneaselHisui[] = INCBIN_U16("graphics/pokemon/sneasel/hisui/normal.gbapal"); - const u32 gMonBackPic_SneaselHisui[] = INCBIN_U32("graphics/pokemon/sneasel/hisui/back.4bpp.lz"); + const u32 gMonBackPic_SneaselHisui[] = INCBIN_U32("graphics/pokemon/sneasel/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_SneaselHisui[] = INCBIN_U16("graphics/pokemon/sneasel/hisui/shiny.gbapal"); const u8 gMonIcon_SneaselHisui[] = INCBIN_U8("graphics/pokemon/sneasel/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -8534,16 +8534,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_SneaselHisuiF[] = INCBIN_U32("graphics/pokemon/sneasel/hisui/frontf.4bpp.lz"); - const u32 gMonBackPic_SneaselHisuiF[] = INCBIN_U32("graphics/pokemon/sneasel/hisui/backf.4bpp.lz"); + const u32 gMonFrontPic_SneaselHisuiF[] = INCBIN_U32("graphics/pokemon/sneasel/hisui/frontf.4bpp.smol"); + const u32 gMonBackPic_SneaselHisuiF[] = INCBIN_U32("graphics/pokemon/sneasel/hisui/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_SneaselHisuiF[] = INCBIN_COMP("graphics/pokemon/sneasel/hisui/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Sneasler[] = INCBIN_U32("graphics/pokemon/sneasler/front.4bpp.lz"); + const u32 gMonFrontPic_Sneasler[] = INCBIN_U32("graphics/pokemon/sneasler/front.4bpp.smol"); const u16 gMonPalette_Sneasler[] = INCBIN_U16("graphics/pokemon/sneasler/normal.gbapal"); - const u32 gMonBackPic_Sneasler[] = INCBIN_U32("graphics/pokemon/sneasler/back.4bpp.lz"); + const u32 gMonBackPic_Sneasler[] = INCBIN_U32("graphics/pokemon/sneasler/back.4bpp.smol"); const u16 gMonShinyPalette_Sneasler[] = INCBIN_U16("graphics/pokemon/sneasler/shiny.gbapal"); const u8 gMonIcon_Sneasler[] = INCBIN_U8("graphics/pokemon/sneasler/icon.4bpp"); #if P_FOOTPRINTS @@ -8561,14 +8561,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TEDDIURSA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/anim_front.4bpp.smol"); const u16 gMonPalette_Teddiursa[] = INCBIN_U16("graphics/pokemon/teddiursa/normal.gbapal"); - const u32 gMonBackPic_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/back.4bpp.lz"); + const u32 gMonBackPic_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/back.4bpp.smol"); const u16 gMonShinyPalette_Teddiursa[] = INCBIN_U16("graphics/pokemon/teddiursa/shiny.gbapal"); #else - const u32 gMonFrontPic_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Teddiursa[] = INCBIN_U16("graphics/pokemon/teddiursa/normal_gba.gbapal"); - const u32 gMonBackPic_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/back_gba.4bpp.lz"); + const u32 gMonBackPic_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Teddiursa[] = INCBIN_U16("graphics/pokemon/teddiursa/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8588,14 +8588,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/anim_front.4bpp.smol"); const u16 gMonPalette_Ursaring[] = INCBIN_U16("graphics/pokemon/ursaring/normal.gbapal"); - const u32 gMonBackPic_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/back.4bpp.lz"); + const u32 gMonBackPic_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/back.4bpp.smol"); const u16 gMonShinyPalette_Ursaring[] = INCBIN_U16("graphics/pokemon/ursaring/shiny.gbapal"); #else - const u32 gMonFrontPic_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ursaring[] = INCBIN_U16("graphics/pokemon/ursaring/normal_gba.gbapal"); - const u32 gMonBackPic_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ursaring[] = INCBIN_U16("graphics/pokemon/ursaring/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8615,17 +8615,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_UrsaringF[] = INCBIN_U32("graphics/pokemon/ursaring/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_UrsaringF[] = INCBIN_U32("graphics/pokemon/ursaring/backf.4bpp.lz"); + const u32 gMonFrontPic_UrsaringF[] = INCBIN_U32("graphics/pokemon/ursaring/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_UrsaringF[] = INCBIN_U32("graphics/pokemon/ursaring/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_UrsaringF[] = INCBIN_COMP("graphics/pokemon/ursaring/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_GEN_8_CROSS_EVOS - const u32 gMonFrontPic_Ursaluna[] = INCBIN_U32("graphics/pokemon/ursaluna/front.4bpp.lz"); + const u32 gMonFrontPic_Ursaluna[] = INCBIN_U32("graphics/pokemon/ursaluna/front.4bpp.smol"); const u16 gMonPalette_Ursaluna[] = INCBIN_U16("graphics/pokemon/ursaluna/normal.gbapal"); - const u32 gMonBackPic_Ursaluna[] = INCBIN_U32("graphics/pokemon/ursaluna/back.4bpp.lz"); + const u32 gMonBackPic_Ursaluna[] = INCBIN_U32("graphics/pokemon/ursaluna/back.4bpp.smol"); const u16 gMonShinyPalette_Ursaluna[] = INCBIN_U16("graphics/pokemon/ursaluna/shiny.gbapal"); const u8 gMonIcon_Ursaluna[] = INCBIN_U8("graphics/pokemon/ursaluna/icon.4bpp"); #if P_FOOTPRINTS @@ -8639,9 +8639,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_UrsalunaBloodmoon[] = INCBIN_U32("graphics/pokemon/ursaluna/bloodmoon/front.4bpp.lz"); + const u32 gMonFrontPic_UrsalunaBloodmoon[] = INCBIN_U32("graphics/pokemon/ursaluna/bloodmoon/front.4bpp.smol"); const u16 gMonPalette_UrsalunaBloodmoon[] = INCBIN_U16("graphics/pokemon/ursaluna/bloodmoon/normal.gbapal"); - const u32 gMonBackPic_UrsalunaBloodmoon[] = INCBIN_U32("graphics/pokemon/ursaluna/bloodmoon/back.4bpp.lz"); + const u32 gMonBackPic_UrsalunaBloodmoon[] = INCBIN_U32("graphics/pokemon/ursaluna/bloodmoon/back.4bpp.smol"); const u16 gMonShinyPalette_UrsalunaBloodmoon[] = INCBIN_U16("graphics/pokemon/ursaluna/bloodmoon/shiny.gbapal"); const u8 gMonIcon_UrsalunaBloodmoon[] = INCBIN_U8("graphics/pokemon/ursaluna/bloodmoon/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -8656,14 +8656,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SLUGMA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/anim_front.4bpp.smol"); const u16 gMonPalette_Slugma[] = INCBIN_U16("graphics/pokemon/slugma/normal.gbapal"); - const u32 gMonBackPic_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/back.4bpp.lz"); + const u32 gMonBackPic_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/back.4bpp.smol"); const u16 gMonShinyPalette_Slugma[] = INCBIN_U16("graphics/pokemon/slugma/shiny.gbapal"); #else - const u32 gMonFrontPic_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Slugma[] = INCBIN_U16("graphics/pokemon/slugma/normal_gba.gbapal"); - const u32 gMonBackPic_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/back_gba.4bpp.lz"); + const u32 gMonBackPic_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Slugma[] = INCBIN_U16("graphics/pokemon/slugma/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8683,14 +8683,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/anim_front.4bpp.smol"); const u16 gMonPalette_Magcargo[] = INCBIN_U16("graphics/pokemon/magcargo/normal.gbapal"); - const u32 gMonBackPic_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/back.4bpp.lz"); + const u32 gMonBackPic_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/back.4bpp.smol"); const u16 gMonShinyPalette_Magcargo[] = INCBIN_U16("graphics/pokemon/magcargo/shiny.gbapal"); #else - const u32 gMonFrontPic_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Magcargo[] = INCBIN_U16("graphics/pokemon/magcargo/normal_gba.gbapal"); - const u32 gMonBackPic_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/back_gba.4bpp.lz"); + const u32 gMonBackPic_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Magcargo[] = INCBIN_U16("graphics/pokemon/magcargo/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8712,14 +8712,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SWINUB #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/anim_front.4bpp.smol"); const u16 gMonPalette_Swinub[] = INCBIN_U16("graphics/pokemon/swinub/normal.gbapal"); - const u32 gMonBackPic_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/back.4bpp.lz"); + const u32 gMonBackPic_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/back.4bpp.smol"); const u16 gMonShinyPalette_Swinub[] = INCBIN_U16("graphics/pokemon/swinub/shiny.gbapal"); #else - const u32 gMonFrontPic_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Swinub[] = INCBIN_U16("graphics/pokemon/swinub/normal_gba.gbapal"); - const u32 gMonBackPic_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/back_gba.4bpp.lz"); + const u32 gMonBackPic_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Swinub[] = INCBIN_U16("graphics/pokemon/swinub/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8739,14 +8739,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/anim_front.4bpp.smol"); const u16 gMonPalette_Piloswine[] = INCBIN_U16("graphics/pokemon/piloswine/normal.gbapal"); - const u32 gMonBackPic_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/back.4bpp.lz"); + const u32 gMonBackPic_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/back.4bpp.smol"); const u16 gMonShinyPalette_Piloswine[] = INCBIN_U16("graphics/pokemon/piloswine/shiny.gbapal"); #else - const u32 gMonFrontPic_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Piloswine[] = INCBIN_U16("graphics/pokemon/piloswine/normal_gba.gbapal"); - const u32 gMonBackPic_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/back_gba.4bpp.lz"); + const u32 gMonBackPic_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Piloswine[] = INCBIN_U16("graphics/pokemon/piloswine/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8766,17 +8766,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_PiloswineF[] = INCBIN_U32("graphics/pokemon/piloswine/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_PiloswineF[] = INCBIN_U32("graphics/pokemon/piloswine/backf.4bpp.lz"); + const u32 gMonFrontPic_PiloswineF[] = INCBIN_U32("graphics/pokemon/piloswine/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_PiloswineF[] = INCBIN_U32("graphics/pokemon/piloswine/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_PiloswineF[] = INCBIN_COMP("graphics/pokemon/piloswine/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Mamoswine[] = INCBIN_U32("graphics/pokemon/mamoswine/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mamoswine[] = INCBIN_U32("graphics/pokemon/mamoswine/anim_front.4bpp.smol"); const u16 gMonPalette_Mamoswine[] = INCBIN_U16("graphics/pokemon/mamoswine/normal.gbapal"); - const u32 gMonBackPic_Mamoswine[] = INCBIN_U32("graphics/pokemon/mamoswine/back.4bpp.lz"); + const u32 gMonBackPic_Mamoswine[] = INCBIN_U32("graphics/pokemon/mamoswine/back.4bpp.smol"); const u16 gMonShinyPalette_Mamoswine[] = INCBIN_U16("graphics/pokemon/mamoswine/shiny.gbapal"); const u8 gMonIcon_Mamoswine[] = INCBIN_U8("graphics/pokemon/mamoswine/icon.4bpp"); #if P_FOOTPRINTS @@ -8791,7 +8791,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_MamoswineF[] = INCBIN_U32("graphics/pokemon/mamoswine/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_MamoswineF[] = INCBIN_U32("graphics/pokemon/mamoswine/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_MamoswineF[] = INCBIN_COMP("graphics/pokemon/mamoswine/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -8801,14 +8801,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CORSOLA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/anim_front.4bpp.smol"); const u16 gMonPalette_Corsola[] = INCBIN_U16("graphics/pokemon/corsola/normal.gbapal"); - const u32 gMonBackPic_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/back.4bpp.lz"); + const u32 gMonBackPic_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/back.4bpp.smol"); const u16 gMonShinyPalette_Corsola[] = INCBIN_U16("graphics/pokemon/corsola/shiny.gbapal"); #else - const u32 gMonFrontPic_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Corsola[] = INCBIN_U16("graphics/pokemon/corsola/normal_gba.gbapal"); - const u32 gMonBackPic_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/back_gba.4bpp.lz"); + const u32 gMonBackPic_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Corsola[] = INCBIN_U16("graphics/pokemon/corsola/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8828,9 +8828,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_CorsolaGalar[] = INCBIN_U32("graphics/pokemon/corsola/galar/front.4bpp.lz"); + const u32 gMonFrontPic_CorsolaGalar[] = INCBIN_U32("graphics/pokemon/corsola/galar/front.4bpp.smol"); const u16 gMonPalette_CorsolaGalar[] = INCBIN_U16("graphics/pokemon/corsola/galar/normal.gbapal"); - const u32 gMonBackPic_CorsolaGalar[] = INCBIN_U32("graphics/pokemon/corsola/galar/back.4bpp.lz"); + const u32 gMonBackPic_CorsolaGalar[] = INCBIN_U32("graphics/pokemon/corsola/galar/back.4bpp.smol"); const u16 gMonShinyPalette_CorsolaGalar[] = INCBIN_U16("graphics/pokemon/corsola/galar/shiny.gbapal"); const u8 gMonIcon_CorsolaGalar[] = INCBIN_U8("graphics/pokemon/corsola/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -8841,9 +8841,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Cursola[] = INCBIN_U32("graphics/pokemon/cursola/front.4bpp.lz"); + const u32 gMonFrontPic_Cursola[] = INCBIN_U32("graphics/pokemon/cursola/front.4bpp.smol"); const u16 gMonPalette_Cursola[] = INCBIN_U16("graphics/pokemon/cursola/normal.gbapal"); - const u32 gMonBackPic_Cursola[] = INCBIN_U32("graphics/pokemon/cursola/back.4bpp.lz"); + const u32 gMonBackPic_Cursola[] = INCBIN_U32("graphics/pokemon/cursola/back.4bpp.smol"); const u16 gMonShinyPalette_Cursola[] = INCBIN_U16("graphics/pokemon/cursola/shiny.gbapal"); const u8 gMonIcon_Cursola[] = INCBIN_U8("graphics/pokemon/cursola/icon.4bpp"); #if P_FOOTPRINTS @@ -8861,14 +8861,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_REMORAID #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/anim_front.4bpp.smol"); const u16 gMonPalette_Remoraid[] = INCBIN_U16("graphics/pokemon/remoraid/normal.gbapal"); - const u32 gMonBackPic_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/back.4bpp.lz"); + const u32 gMonBackPic_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/back.4bpp.smol"); const u16 gMonShinyPalette_Remoraid[] = INCBIN_U16("graphics/pokemon/remoraid/shiny.gbapal"); #else - const u32 gMonFrontPic_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Remoraid[] = INCBIN_U16("graphics/pokemon/remoraid/normal_gba.gbapal"); - const u32 gMonBackPic_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/back_gba.4bpp.lz"); + const u32 gMonBackPic_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Remoraid[] = INCBIN_U16("graphics/pokemon/remoraid/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8888,14 +8888,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/anim_front.4bpp.smol"); const u16 gMonPalette_Octillery[] = INCBIN_U16("graphics/pokemon/octillery/normal.gbapal"); - const u32 gMonBackPic_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/back.4bpp.lz"); + const u32 gMonBackPic_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/back.4bpp.smol"); const u16 gMonShinyPalette_Octillery[] = INCBIN_U16("graphics/pokemon/octillery/shiny.gbapal"); #else - const u32 gMonFrontPic_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Octillery[] = INCBIN_U16("graphics/pokemon/octillery/normal_gba.gbapal"); - const u32 gMonBackPic_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/back_gba.4bpp.lz"); + const u32 gMonBackPic_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Octillery[] = INCBIN_U16("graphics/pokemon/octillery/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8915,8 +8915,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_OctilleryF[] = INCBIN_U32("graphics/pokemon/octillery/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_OctilleryF[] = INCBIN_U32("graphics/pokemon/octillery/backf.4bpp.lz"); + const u32 gMonFrontPic_OctilleryF[] = INCBIN_U32("graphics/pokemon/octillery/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_OctilleryF[] = INCBIN_U32("graphics/pokemon/octillery/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_OctilleryF[] = INCBIN_COMP("graphics/pokemon/octillery/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -8925,14 +8925,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_DELIBIRD #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/anim_front.4bpp.smol"); const u16 gMonPalette_Delibird[] = INCBIN_U16("graphics/pokemon/delibird/normal.gbapal"); - const u32 gMonBackPic_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/back.4bpp.lz"); + const u32 gMonBackPic_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/back.4bpp.smol"); const u16 gMonShinyPalette_Delibird[] = INCBIN_U16("graphics/pokemon/delibird/shiny.gbapal"); #else - const u32 gMonFrontPic_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Delibird[] = INCBIN_U16("graphics/pokemon/delibird/normal_gba.gbapal"); - const u32 gMonBackPic_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/back_gba.4bpp.lz"); + const u32 gMonBackPic_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Delibird[] = INCBIN_U16("graphics/pokemon/delibird/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8954,9 +8954,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MANTINE #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Mantyke[] = INCBIN_U32("graphics/pokemon/mantyke/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mantyke[] = INCBIN_U32("graphics/pokemon/mantyke/anim_front.4bpp.smol"); const u16 gMonPalette_Mantyke[] = INCBIN_U16("graphics/pokemon/mantyke/normal.gbapal"); - const u32 gMonBackPic_Mantyke[] = INCBIN_U32("graphics/pokemon/mantyke/back.4bpp.lz"); + const u32 gMonBackPic_Mantyke[] = INCBIN_U32("graphics/pokemon/mantyke/back.4bpp.smol"); const u16 gMonShinyPalette_Mantyke[] = INCBIN_U16("graphics/pokemon/mantyke/shiny.gbapal"); const u8 gMonIcon_Mantyke[] = INCBIN_U8("graphics/pokemon/mantyke/icon.4bpp"); #if P_FOOTPRINTS @@ -8972,14 +8972,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_4_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/anim_front.4bpp.smol"); const u16 gMonPalette_Mantine[] = INCBIN_U16("graphics/pokemon/mantine/normal.gbapal"); - const u32 gMonBackPic_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/back.4bpp.lz"); + const u32 gMonBackPic_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/back.4bpp.smol"); const u16 gMonShinyPalette_Mantine[] = INCBIN_U16("graphics/pokemon/mantine/shiny.gbapal"); #else - const u32 gMonFrontPic_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Mantine[] = INCBIN_U16("graphics/pokemon/mantine/normal_gba.gbapal"); - const u32 gMonBackPic_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/back_gba.4bpp.lz"); + const u32 gMonBackPic_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Mantine[] = INCBIN_U16("graphics/pokemon/mantine/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9001,14 +9001,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SKARMORY #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/anim_front.4bpp.smol"); const u16 gMonPalette_Skarmory[] = INCBIN_U16("graphics/pokemon/skarmory/normal.gbapal"); - const u32 gMonBackPic_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/back.4bpp.lz"); + const u32 gMonBackPic_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/back.4bpp.smol"); const u16 gMonShinyPalette_Skarmory[] = INCBIN_U16("graphics/pokemon/skarmory/shiny.gbapal"); #else - const u32 gMonFrontPic_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Skarmory[] = INCBIN_U16("graphics/pokemon/skarmory/normal_gba.gbapal"); - const u32 gMonBackPic_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/back_gba.4bpp.lz"); + const u32 gMonBackPic_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Skarmory[] = INCBIN_U16("graphics/pokemon/skarmory/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9030,14 +9030,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_HOUNDOUR #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/anim_front.4bpp.smol"); const u16 gMonPalette_Houndour[] = INCBIN_U16("graphics/pokemon/houndour/normal.gbapal"); - const u32 gMonBackPic_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/back.4bpp.lz"); + const u32 gMonBackPic_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/back.4bpp.smol"); const u16 gMonShinyPalette_Houndour[] = INCBIN_U16("graphics/pokemon/houndour/shiny.gbapal"); #else - const u32 gMonFrontPic_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Houndour[] = INCBIN_U16("graphics/pokemon/houndour/normal_gba.gbapal"); - const u32 gMonBackPic_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/back_gba.4bpp.lz"); + const u32 gMonBackPic_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Houndour[] = INCBIN_U16("graphics/pokemon/houndour/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9057,14 +9057,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/anim_front.4bpp.smol"); const u16 gMonPalette_Houndoom[] = INCBIN_U16("graphics/pokemon/houndoom/normal.gbapal"); - const u32 gMonBackPic_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/back.4bpp.lz"); + const u32 gMonBackPic_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/back.4bpp.smol"); const u16 gMonShinyPalette_Houndoom[] = INCBIN_U16("graphics/pokemon/houndoom/shiny.gbapal"); #else - const u32 gMonFrontPic_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Houndoom[] = INCBIN_U16("graphics/pokemon/houndoom/normal_gba.gbapal"); - const u32 gMonBackPic_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/back_gba.4bpp.lz"); + const u32 gMonBackPic_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Houndoom[] = INCBIN_U16("graphics/pokemon/houndoom/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9084,17 +9084,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_HoundoomF[] = INCBIN_U32("graphics/pokemon/houndoom/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_HoundoomF[] = INCBIN_U32("graphics/pokemon/houndoom/backf.4bpp.lz"); + const u32 gMonFrontPic_HoundoomF[] = INCBIN_U32("graphics/pokemon/houndoom/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_HoundoomF[] = INCBIN_U32("graphics/pokemon/houndoom/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_HoundoomF[] = INCBIN_COMP("graphics/pokemon/houndoom/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_HoundoomMega[] = INCBIN_U32("graphics/pokemon/houndoom/mega/front.4bpp.lz"); + const u32 gMonFrontPic_HoundoomMega[] = INCBIN_U32("graphics/pokemon/houndoom/mega/front.4bpp.smol"); const u16 gMonPalette_HoundoomMega[] = INCBIN_U16("graphics/pokemon/houndoom/mega/normal.gbapal"); - const u32 gMonBackPic_HoundoomMega[] = INCBIN_U32("graphics/pokemon/houndoom/mega/back.4bpp.lz"); + const u32 gMonBackPic_HoundoomMega[] = INCBIN_U32("graphics/pokemon/houndoom/mega/back.4bpp.smol"); const u16 gMonShinyPalette_HoundoomMega[] = INCBIN_U16("graphics/pokemon/houndoom/mega/shiny.gbapal"); const u8 gMonIcon_HoundoomMega[] = INCBIN_U8("graphics/pokemon/houndoom/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -9109,14 +9109,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_PHANPY #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/anim_front.4bpp.smol"); const u16 gMonPalette_Phanpy[] = INCBIN_U16("graphics/pokemon/phanpy/normal.gbapal"); - const u32 gMonBackPic_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/back.4bpp.lz"); + const u32 gMonBackPic_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/back.4bpp.smol"); const u16 gMonShinyPalette_Phanpy[] = INCBIN_U16("graphics/pokemon/phanpy/shiny.gbapal"); #else - const u32 gMonFrontPic_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Phanpy[] = INCBIN_U16("graphics/pokemon/phanpy/normal_gba.gbapal"); - const u32 gMonBackPic_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/back_gba.4bpp.lz"); + const u32 gMonBackPic_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Phanpy[] = INCBIN_U16("graphics/pokemon/phanpy/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9136,14 +9136,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/anim_front.4bpp.smol"); const u16 gMonPalette_Donphan[] = INCBIN_U16("graphics/pokemon/donphan/normal.gbapal"); - const u32 gMonBackPic_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/back.4bpp.lz"); + const u32 gMonBackPic_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/back.4bpp.smol"); const u16 gMonShinyPalette_Donphan[] = INCBIN_U16("graphics/pokemon/donphan/shiny.gbapal"); #else - const u32 gMonFrontPic_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Donphan[] = INCBIN_U16("graphics/pokemon/donphan/normal_gba.gbapal"); - const u32 gMonBackPic_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/back_gba.4bpp.lz"); + const u32 gMonBackPic_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Donphan[] = INCBIN_U16("graphics/pokemon/donphan/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9163,8 +9163,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_DonphanF[] = INCBIN_U32("graphics/pokemon/donphan/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_DonphanF[] = INCBIN_U32("graphics/pokemon/donphan/backf.4bpp.lz"); + const u32 gMonFrontPic_DonphanF[] = INCBIN_U32("graphics/pokemon/donphan/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_DonphanF[] = INCBIN_U32("graphics/pokemon/donphan/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_DonphanF[] = INCBIN_COMP("graphics/pokemon/donphan/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -9173,14 +9173,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_STANTLER #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/anim_front.4bpp.smol"); const u16 gMonPalette_Stantler[] = INCBIN_U16("graphics/pokemon/stantler/normal.gbapal"); - const u32 gMonBackPic_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/back.4bpp.lz"); + const u32 gMonBackPic_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/back.4bpp.smol"); const u16 gMonShinyPalette_Stantler[] = INCBIN_U16("graphics/pokemon/stantler/shiny.gbapal"); #else - const u32 gMonFrontPic_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Stantler[] = INCBIN_U16("graphics/pokemon/stantler/normal_gba.gbapal"); - const u32 gMonBackPic_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/back_gba.4bpp.lz"); + const u32 gMonBackPic_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Stantler[] = INCBIN_U16("graphics/pokemon/stantler/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9200,9 +9200,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_8_CROSS_EVOS - const u32 gMonFrontPic_Wyrdeer[] = INCBIN_U32("graphics/pokemon/wyrdeer/front.4bpp.lz"); + const u32 gMonFrontPic_Wyrdeer[] = INCBIN_U32("graphics/pokemon/wyrdeer/front.4bpp.smol"); const u16 gMonPalette_Wyrdeer[] = INCBIN_U16("graphics/pokemon/wyrdeer/normal.gbapal"); - const u32 gMonBackPic_Wyrdeer[] = INCBIN_U32("graphics/pokemon/wyrdeer/back.4bpp.lz"); + const u32 gMonBackPic_Wyrdeer[] = INCBIN_U32("graphics/pokemon/wyrdeer/back.4bpp.smol"); const u16 gMonShinyPalette_Wyrdeer[] = INCBIN_U16("graphics/pokemon/wyrdeer/shiny.gbapal"); const u8 gMonIcon_Wyrdeer[] = INCBIN_U8("graphics/pokemon/wyrdeer/icon.4bpp"); #if P_FOOTPRINTS @@ -9220,14 +9220,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SMEARGLE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/anim_front.4bpp.smol"); const u16 gMonPalette_Smeargle[] = INCBIN_U16("graphics/pokemon/smeargle/normal.gbapal"); - const u32 gMonBackPic_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/back.4bpp.lz"); + const u32 gMonBackPic_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/back.4bpp.smol"); const u16 gMonShinyPalette_Smeargle[] = INCBIN_U16("graphics/pokemon/smeargle/shiny.gbapal"); #else - const u32 gMonFrontPic_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Smeargle[] = INCBIN_U16("graphics/pokemon/smeargle/normal_gba.gbapal"); - const u32 gMonBackPic_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/back_gba.4bpp.lz"); + const u32 gMonBackPic_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Smeargle[] = INCBIN_U16("graphics/pokemon/smeargle/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9249,14 +9249,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MILTANK #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/anim_front.4bpp.smol"); const u16 gMonPalette_Miltank[] = INCBIN_U16("graphics/pokemon/miltank/normal.gbapal"); - const u32 gMonBackPic_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/back.4bpp.lz"); + const u32 gMonBackPic_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/back.4bpp.smol"); const u16 gMonShinyPalette_Miltank[] = INCBIN_U16("graphics/pokemon/miltank/shiny.gbapal"); #else - const u32 gMonFrontPic_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Miltank[] = INCBIN_U16("graphics/pokemon/miltank/normal_gba.gbapal"); - const u32 gMonBackPic_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/back_gba.4bpp.lz"); + const u32 gMonBackPic_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Miltank[] = INCBIN_U16("graphics/pokemon/miltank/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9278,14 +9278,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_RAIKOU #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/anim_front.4bpp.smol"); const u16 gMonPalette_Raikou[] = INCBIN_U16("graphics/pokemon/raikou/normal.gbapal"); - const u32 gMonBackPic_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/back.4bpp.lz"); + const u32 gMonBackPic_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/back.4bpp.smol"); const u16 gMonShinyPalette_Raikou[] = INCBIN_U16("graphics/pokemon/raikou/shiny.gbapal"); #else - const u32 gMonFrontPic_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Raikou[] = INCBIN_U16("graphics/pokemon/raikou/normal_gba.gbapal"); - const u32 gMonBackPic_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/back_gba.4bpp.lz"); + const u32 gMonBackPic_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Raikou[] = INCBIN_U16("graphics/pokemon/raikou/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9307,14 +9307,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ENTEI #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Entei[] = INCBIN_U32("graphics/pokemon/entei/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Entei[] = INCBIN_U32("graphics/pokemon/entei/anim_front.4bpp.smol"); const u16 gMonPalette_Entei[] = INCBIN_U16("graphics/pokemon/entei/normal.gbapal"); - const u32 gMonBackPic_Entei[] = INCBIN_U32("graphics/pokemon/entei/back.4bpp.lz"); + const u32 gMonBackPic_Entei[] = INCBIN_U32("graphics/pokemon/entei/back.4bpp.smol"); const u16 gMonShinyPalette_Entei[] = INCBIN_U16("graphics/pokemon/entei/shiny.gbapal"); #else - const u32 gMonFrontPic_Entei[] = INCBIN_U32("graphics/pokemon/entei/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Entei[] = INCBIN_U32("graphics/pokemon/entei/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Entei[] = INCBIN_U16("graphics/pokemon/entei/normal_gba.gbapal"); - const u32 gMonBackPic_Entei[] = INCBIN_U32("graphics/pokemon/entei/back_gba.4bpp.lz"); + const u32 gMonBackPic_Entei[] = INCBIN_U32("graphics/pokemon/entei/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Entei[] = INCBIN_U16("graphics/pokemon/entei/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9336,14 +9336,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SUICUNE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/anim_front.4bpp.smol"); const u16 gMonPalette_Suicune[] = INCBIN_U16("graphics/pokemon/suicune/normal.gbapal"); - const u32 gMonBackPic_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/back.4bpp.lz"); + const u32 gMonBackPic_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/back.4bpp.smol"); const u16 gMonShinyPalette_Suicune[] = INCBIN_U16("graphics/pokemon/suicune/shiny.gbapal"); #else - const u32 gMonFrontPic_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Suicune[] = INCBIN_U16("graphics/pokemon/suicune/normal_gba.gbapal"); - const u32 gMonBackPic_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/back_gba.4bpp.lz"); + const u32 gMonBackPic_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Suicune[] = INCBIN_U16("graphics/pokemon/suicune/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9365,14 +9365,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_LARVITAR #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/anim_front.4bpp.smol"); const u16 gMonPalette_Larvitar[] = INCBIN_U16("graphics/pokemon/larvitar/normal.gbapal"); - const u32 gMonBackPic_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/back.4bpp.lz"); + const u32 gMonBackPic_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/back.4bpp.smol"); const u16 gMonShinyPalette_Larvitar[] = INCBIN_U16("graphics/pokemon/larvitar/shiny.gbapal"); #else - const u32 gMonFrontPic_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Larvitar[] = INCBIN_U16("graphics/pokemon/larvitar/normal_gba.gbapal"); - const u32 gMonBackPic_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/back_gba.4bpp.lz"); + const u32 gMonBackPic_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Larvitar[] = INCBIN_U16("graphics/pokemon/larvitar/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9392,14 +9392,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/anim_front.4bpp.smol"); const u16 gMonPalette_Pupitar[] = INCBIN_U16("graphics/pokemon/pupitar/normal.gbapal"); - const u32 gMonBackPic_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/back.4bpp.lz"); + const u32 gMonBackPic_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/back.4bpp.smol"); const u16 gMonShinyPalette_Pupitar[] = INCBIN_U16("graphics/pokemon/pupitar/shiny.gbapal"); #else - const u32 gMonFrontPic_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Pupitar[] = INCBIN_U16("graphics/pokemon/pupitar/normal_gba.gbapal"); - const u32 gMonBackPic_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/back_gba.4bpp.lz"); + const u32 gMonBackPic_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Pupitar[] = INCBIN_U16("graphics/pokemon/pupitar/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9419,14 +9419,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/anim_front.4bpp.smol"); const u16 gMonPalette_Tyranitar[] = INCBIN_U16("graphics/pokemon/tyranitar/normal.gbapal"); - const u32 gMonBackPic_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/back.4bpp.lz"); + const u32 gMonBackPic_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/back.4bpp.smol"); const u16 gMonShinyPalette_Tyranitar[] = INCBIN_U16("graphics/pokemon/tyranitar/shiny.gbapal"); #else - const u32 gMonFrontPic_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Tyranitar[] = INCBIN_U16("graphics/pokemon/tyranitar/normal_gba.gbapal"); - const u32 gMonBackPic_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/back_gba.4bpp.lz"); + const u32 gMonBackPic_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Tyranitar[] = INCBIN_U16("graphics/pokemon/tyranitar/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9446,9 +9446,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_TyranitarMega[] = INCBIN_U32("graphics/pokemon/tyranitar/mega/front.4bpp.lz"); + const u32 gMonFrontPic_TyranitarMega[] = INCBIN_U32("graphics/pokemon/tyranitar/mega/front.4bpp.smol"); const u16 gMonPalette_TyranitarMega[] = INCBIN_U16("graphics/pokemon/tyranitar/mega/normal.gbapal"); - const u32 gMonBackPic_TyranitarMega[] = INCBIN_U32("graphics/pokemon/tyranitar/mega/back.4bpp.lz"); + const u32 gMonBackPic_TyranitarMega[] = INCBIN_U32("graphics/pokemon/tyranitar/mega/back.4bpp.smol"); const u16 gMonShinyPalette_TyranitarMega[] = INCBIN_U16("graphics/pokemon/tyranitar/mega/shiny.gbapal"); const u8 gMonIcon_TyranitarMega[] = INCBIN_U8("graphics/pokemon/tyranitar/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -9463,14 +9463,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_LUGIA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/anim_front.4bpp.smol"); const u16 gMonPalette_Lugia[] = INCBIN_U16("graphics/pokemon/lugia/normal.gbapal"); - const u32 gMonBackPic_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/back.4bpp.lz"); + const u32 gMonBackPic_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/back.4bpp.smol"); const u16 gMonShinyPalette_Lugia[] = INCBIN_U16("graphics/pokemon/lugia/shiny.gbapal"); #else - const u32 gMonFrontPic_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Lugia[] = INCBIN_U16("graphics/pokemon/lugia/normal_gba.gbapal"); - const u32 gMonBackPic_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/back_gba.4bpp.lz"); + const u32 gMonBackPic_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Lugia[] = INCBIN_U16("graphics/pokemon/lugia/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9492,14 +9492,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_HO_OH #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/anim_front.4bpp.lz"); + const u32 gMonFrontPic_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/anim_front.4bpp.smol"); const u16 gMonPalette_HoOh[] = INCBIN_U16("graphics/pokemon/ho_oh/normal.gbapal"); - const u32 gMonBackPic_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/back.4bpp.lz"); + const u32 gMonBackPic_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/back.4bpp.smol"); const u16 gMonShinyPalette_HoOh[] = INCBIN_U16("graphics/pokemon/ho_oh/shiny.gbapal"); #else - const u32 gMonFrontPic_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/anim_front_gba.4bpp.smol"); const u16 gMonPalette_HoOh[] = INCBIN_U16("graphics/pokemon/ho_oh/normal_gba.gbapal"); - const u32 gMonBackPic_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/back_gba.4bpp.lz"); + const u32 gMonBackPic_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/back_gba.4bpp.smol"); const u16 gMonShinyPalette_HoOh[] = INCBIN_U16("graphics/pokemon/ho_oh/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9521,14 +9521,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CELEBI #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/anim_front.4bpp.smol"); const u16 gMonPalette_Celebi[] = INCBIN_U16("graphics/pokemon/celebi/normal.gbapal"); - const u32 gMonBackPic_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/back.4bpp.lz"); + const u32 gMonBackPic_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/back.4bpp.smol"); const u16 gMonShinyPalette_Celebi[] = INCBIN_U16("graphics/pokemon/celebi/shiny.gbapal"); #else - const u32 gMonFrontPic_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Celebi[] = INCBIN_U16("graphics/pokemon/celebi/normal_gba.gbapal"); - const u32 gMonBackPic_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/back_gba.4bpp.lz"); + const u32 gMonBackPic_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Celebi[] = INCBIN_U16("graphics/pokemon/celebi/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9550,14 +9550,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TREECKO #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/anim_front.4bpp.smol"); const u16 gMonPalette_Treecko[] = INCBIN_U16("graphics/pokemon/treecko/normal.gbapal"); - const u32 gMonBackPic_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/back.4bpp.lz"); + const u32 gMonBackPic_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/back.4bpp.smol"); const u16 gMonShinyPalette_Treecko[] = INCBIN_U16("graphics/pokemon/treecko/shiny.gbapal"); #else - const u32 gMonFrontPic_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Treecko[] = INCBIN_U16("graphics/pokemon/treecko/normal_gba.gbapal"); - const u32 gMonBackPic_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/back_gba.4bpp.lz"); + const u32 gMonBackPic_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Treecko[] = INCBIN_U16("graphics/pokemon/treecko/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9577,14 +9577,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/anim_front.4bpp.smol"); const u16 gMonPalette_Grovyle[] = INCBIN_U16("graphics/pokemon/grovyle/normal.gbapal"); - const u32 gMonBackPic_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/back.4bpp.lz"); + const u32 gMonBackPic_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/back.4bpp.smol"); const u16 gMonShinyPalette_Grovyle[] = INCBIN_U16("graphics/pokemon/grovyle/shiny.gbapal"); #else - const u32 gMonFrontPic_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Grovyle[] = INCBIN_U16("graphics/pokemon/grovyle/normal_gba.gbapal"); - const u32 gMonBackPic_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/back_gba.4bpp.lz"); + const u32 gMonBackPic_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Grovyle[] = INCBIN_U16("graphics/pokemon/grovyle/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9604,14 +9604,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/anim_front.4bpp.smol"); const u16 gMonPalette_Sceptile[] = INCBIN_U16("graphics/pokemon/sceptile/normal.gbapal"); - const u32 gMonBackPic_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/back.4bpp.lz"); + const u32 gMonBackPic_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/back.4bpp.smol"); const u16 gMonShinyPalette_Sceptile[] = INCBIN_U16("graphics/pokemon/sceptile/shiny.gbapal"); #else - const u32 gMonFrontPic_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Sceptile[] = INCBIN_U16("graphics/pokemon/sceptile/normal_gba.gbapal"); - const u32 gMonBackPic_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/back_gba.4bpp.lz"); + const u32 gMonBackPic_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Sceptile[] = INCBIN_U16("graphics/pokemon/sceptile/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9631,9 +9631,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_SceptileMega[] = INCBIN_U32("graphics/pokemon/sceptile/mega/front.4bpp.lz"); + const u32 gMonFrontPic_SceptileMega[] = INCBIN_U32("graphics/pokemon/sceptile/mega/front.4bpp.smol"); const u16 gMonPalette_SceptileMega[] = INCBIN_U16("graphics/pokemon/sceptile/mega/normal.gbapal"); - const u32 gMonBackPic_SceptileMega[] = INCBIN_U32("graphics/pokemon/sceptile/mega/back.4bpp.lz"); + const u32 gMonBackPic_SceptileMega[] = INCBIN_U32("graphics/pokemon/sceptile/mega/back.4bpp.smol"); const u16 gMonShinyPalette_SceptileMega[] = INCBIN_U16("graphics/pokemon/sceptile/mega/shiny.gbapal"); const u8 gMonIcon_SceptileMega[] = INCBIN_U8("graphics/pokemon/sceptile/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -9648,14 +9648,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TORCHIC #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/anim_front.4bpp.smol"); const u16 gMonPalette_Torchic[] = INCBIN_U16("graphics/pokemon/torchic/normal.gbapal"); - const u32 gMonBackPic_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/back.4bpp.lz"); + const u32 gMonBackPic_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/back.4bpp.smol"); const u16 gMonShinyPalette_Torchic[] = INCBIN_U16("graphics/pokemon/torchic/shiny.gbapal"); #else - const u32 gMonFrontPic_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Torchic[] = INCBIN_U16("graphics/pokemon/torchic/normal_gba.gbapal"); - const u32 gMonBackPic_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/back_gba.4bpp.lz"); + const u32 gMonBackPic_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Torchic[] = INCBIN_U16("graphics/pokemon/torchic/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9675,21 +9675,21 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonBackPic_TorchicF[] = INCBIN_U32("graphics/pokemon/torchic/backf.4bpp.lz"); + const u32 gMonBackPic_TorchicF[] = INCBIN_U32("graphics/pokemon/torchic/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_TorchicF[] = INCBIN_COMP("graphics/pokemon/torchic/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/anim_front.4bpp.smol"); const u16 gMonPalette_Combusken[] = INCBIN_U16("graphics/pokemon/combusken/normal.gbapal"); - const u32 gMonBackPic_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/back.4bpp.lz"); + const u32 gMonBackPic_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/back.4bpp.smol"); const u16 gMonShinyPalette_Combusken[] = INCBIN_U16("graphics/pokemon/combusken/shiny.gbapal"); #else - const u32 gMonFrontPic_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Combusken[] = INCBIN_U16("graphics/pokemon/combusken/normal_gba.gbapal"); - const u32 gMonBackPic_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/back_gba.4bpp.lz"); + const u32 gMonBackPic_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Combusken[] = INCBIN_U16("graphics/pokemon/combusken/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9709,22 +9709,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_CombuskenF[] = INCBIN_U32("graphics/pokemon/combusken/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_CombuskenF[] = INCBIN_U32("graphics/pokemon/combusken/backf.4bpp.lz"); + const u32 gMonFrontPic_CombuskenF[] = INCBIN_U32("graphics/pokemon/combusken/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_CombuskenF[] = INCBIN_U32("graphics/pokemon/combusken/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_CombuskenF[] = INCBIN_COMP("graphics/pokemon/combusken/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/anim_front.4bpp.smol"); const u16 gMonPalette_Blaziken[] = INCBIN_U16("graphics/pokemon/blaziken/normal.gbapal"); - const u32 gMonBackPic_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/back.4bpp.lz"); + const u32 gMonBackPic_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/back.4bpp.smol"); const u16 gMonShinyPalette_Blaziken[] = INCBIN_U16("graphics/pokemon/blaziken/shiny.gbapal"); #else - const u32 gMonFrontPic_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Blaziken[] = INCBIN_U16("graphics/pokemon/blaziken/normal_gba.gbapal"); - const u32 gMonBackPic_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/back_gba.4bpp.lz"); + const u32 gMonBackPic_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Blaziken[] = INCBIN_U16("graphics/pokemon/blaziken/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9744,17 +9744,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_BlazikenF[] = INCBIN_U32("graphics/pokemon/blaziken/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_BlazikenF[] = INCBIN_U32("graphics/pokemon/blaziken/backf.4bpp.lz"); + const u32 gMonFrontPic_BlazikenF[] = INCBIN_U32("graphics/pokemon/blaziken/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_BlazikenF[] = INCBIN_U32("graphics/pokemon/blaziken/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_BlazikenF[] = INCBIN_COMP("graphics/pokemon/blaziken/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_BlazikenMega[] = INCBIN_U32("graphics/pokemon/blaziken/mega/front.4bpp.lz"); + const u32 gMonFrontPic_BlazikenMega[] = INCBIN_U32("graphics/pokemon/blaziken/mega/front.4bpp.smol"); const u16 gMonPalette_BlazikenMega[] = INCBIN_U16("graphics/pokemon/blaziken/mega/normal.gbapal"); - const u32 gMonBackPic_BlazikenMega[] = INCBIN_U32("graphics/pokemon/blaziken/mega/back.4bpp.lz"); + const u32 gMonBackPic_BlazikenMega[] = INCBIN_U32("graphics/pokemon/blaziken/mega/back.4bpp.smol"); const u16 gMonShinyPalette_BlazikenMega[] = INCBIN_U16("graphics/pokemon/blaziken/mega/shiny.gbapal"); const u8 gMonIcon_BlazikenMega[] = INCBIN_U8("graphics/pokemon/blaziken/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -9769,14 +9769,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MUDKIP #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/anim_front.4bpp.smol"); const u16 gMonPalette_Mudkip[] = INCBIN_U16("graphics/pokemon/mudkip/normal.gbapal"); - const u32 gMonBackPic_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/back.4bpp.lz"); + const u32 gMonBackPic_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/back.4bpp.smol"); const u16 gMonShinyPalette_Mudkip[] = INCBIN_U16("graphics/pokemon/mudkip/shiny.gbapal"); #else - const u32 gMonFrontPic_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Mudkip[] = INCBIN_U16("graphics/pokemon/mudkip/normal_gba.gbapal"); - const u32 gMonBackPic_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/back_gba.4bpp.lz"); + const u32 gMonBackPic_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Mudkip[] = INCBIN_U16("graphics/pokemon/mudkip/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9796,14 +9796,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/anim_front.4bpp.smol"); const u16 gMonPalette_Marshtomp[] = INCBIN_U16("graphics/pokemon/marshtomp/normal.gbapal"); - const u32 gMonBackPic_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/back.4bpp.lz"); + const u32 gMonBackPic_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/back.4bpp.smol"); const u16 gMonShinyPalette_Marshtomp[] = INCBIN_U16("graphics/pokemon/marshtomp/shiny.gbapal"); #else - const u32 gMonFrontPic_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Marshtomp[] = INCBIN_U16("graphics/pokemon/marshtomp/normal_gba.gbapal"); - const u32 gMonBackPic_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/back_gba.4bpp.lz"); + const u32 gMonBackPic_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Marshtomp[] = INCBIN_U16("graphics/pokemon/marshtomp/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9823,14 +9823,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/anim_front.4bpp.smol"); const u16 gMonPalette_Swampert[] = INCBIN_U16("graphics/pokemon/swampert/normal.gbapal"); - const u32 gMonBackPic_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/back.4bpp.lz"); + const u32 gMonBackPic_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/back.4bpp.smol"); const u16 gMonShinyPalette_Swampert[] = INCBIN_U16("graphics/pokemon/swampert/shiny.gbapal"); #else - const u32 gMonFrontPic_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Swampert[] = INCBIN_U16("graphics/pokemon/swampert/normal_gba.gbapal"); - const u32 gMonBackPic_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/back_gba.4bpp.lz"); + const u32 gMonBackPic_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Swampert[] = INCBIN_U16("graphics/pokemon/swampert/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9850,9 +9850,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_SwampertMega[] = INCBIN_U32("graphics/pokemon/swampert/mega/front.4bpp.lz"); + const u32 gMonFrontPic_SwampertMega[] = INCBIN_U32("graphics/pokemon/swampert/mega/front.4bpp.smol"); const u16 gMonPalette_SwampertMega[] = INCBIN_U16("graphics/pokemon/swampert/mega/normal.gbapal"); - const u32 gMonBackPic_SwampertMega[] = INCBIN_U32("graphics/pokemon/swampert/mega/back.4bpp.lz"); + const u32 gMonBackPic_SwampertMega[] = INCBIN_U32("graphics/pokemon/swampert/mega/back.4bpp.smol"); const u16 gMonShinyPalette_SwampertMega[] = INCBIN_U16("graphics/pokemon/swampert/mega/shiny.gbapal"); const u8 gMonIcon_SwampertMega[] = INCBIN_U8("graphics/pokemon/swampert/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -9867,14 +9867,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_POOCHYENA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/anim_front.4bpp.smol"); const u16 gMonPalette_Poochyena[] = INCBIN_U16("graphics/pokemon/poochyena/normal.gbapal"); - const u32 gMonBackPic_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/back.4bpp.lz"); + const u32 gMonBackPic_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/back.4bpp.smol"); const u16 gMonShinyPalette_Poochyena[] = INCBIN_U16("graphics/pokemon/poochyena/shiny.gbapal"); #else - const u32 gMonFrontPic_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Poochyena[] = INCBIN_U16("graphics/pokemon/poochyena/normal_gba.gbapal"); - const u32 gMonBackPic_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/back_gba.4bpp.lz"); + const u32 gMonBackPic_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Poochyena[] = INCBIN_U16("graphics/pokemon/poochyena/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9894,14 +9894,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/anim_front.4bpp.smol"); const u16 gMonPalette_Mightyena[] = INCBIN_U16("graphics/pokemon/mightyena/normal.gbapal"); - const u32 gMonBackPic_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/back.4bpp.lz"); + const u32 gMonBackPic_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/back.4bpp.smol"); const u16 gMonShinyPalette_Mightyena[] = INCBIN_U16("graphics/pokemon/mightyena/shiny.gbapal"); #else - const u32 gMonFrontPic_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Mightyena[] = INCBIN_U16("graphics/pokemon/mightyena/normal_gba.gbapal"); - const u32 gMonBackPic_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/back_gba.4bpp.lz"); + const u32 gMonBackPic_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Mightyena[] = INCBIN_U16("graphics/pokemon/mightyena/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9923,14 +9923,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ZIGZAGOON #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/anim_front.4bpp.smol"); const u16 gMonPalette_Zigzagoon[] = INCBIN_U16("graphics/pokemon/zigzagoon/normal.gbapal"); - const u32 gMonBackPic_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/back.4bpp.lz"); + const u32 gMonBackPic_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/back.4bpp.smol"); const u16 gMonShinyPalette_Zigzagoon[] = INCBIN_U16("graphics/pokemon/zigzagoon/shiny.gbapal"); #else - const u32 gMonFrontPic_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Zigzagoon[] = INCBIN_U16("graphics/pokemon/zigzagoon/normal_gba.gbapal"); - const u32 gMonBackPic_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Zigzagoon[] = INCBIN_U16("graphics/pokemon/zigzagoon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9950,14 +9950,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/anim_front.4bpp.smol"); const u16 gMonPalette_Linoone[] = INCBIN_U16("graphics/pokemon/linoone/normal.gbapal"); - const u32 gMonBackPic_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/back.4bpp.lz"); + const u32 gMonBackPic_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/back.4bpp.smol"); const u16 gMonShinyPalette_Linoone[] = INCBIN_U16("graphics/pokemon/linoone/shiny.gbapal"); #else - const u32 gMonFrontPic_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Linoone[] = INCBIN_U16("graphics/pokemon/linoone/normal_gba.gbapal"); - const u32 gMonBackPic_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/back_gba.4bpp.lz"); + const u32 gMonBackPic_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Linoone[] = INCBIN_U16("graphics/pokemon/linoone/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9977,9 +9977,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_ZigzagoonGalar[] = INCBIN_U32("graphics/pokemon/zigzagoon/galar/front.4bpp.lz"); + const u32 gMonFrontPic_ZigzagoonGalar[] = INCBIN_U32("graphics/pokemon/zigzagoon/galar/front.4bpp.smol"); const u16 gMonPalette_ZigzagoonGalar[] = INCBIN_U16("graphics/pokemon/zigzagoon/galar/normal.gbapal"); - const u32 gMonBackPic_ZigzagoonGalar[] = INCBIN_U32("graphics/pokemon/zigzagoon/galar/back.4bpp.lz"); + const u32 gMonBackPic_ZigzagoonGalar[] = INCBIN_U32("graphics/pokemon/zigzagoon/galar/back.4bpp.smol"); const u16 gMonShinyPalette_ZigzagoonGalar[] = INCBIN_U16("graphics/pokemon/zigzagoon/galar/shiny.gbapal"); const u8 gMonIcon_ZigzagoonGalar[] = INCBIN_U8("graphics/pokemon/zigzagoon/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -9990,9 +9990,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_LinooneGalar[] = INCBIN_U32("graphics/pokemon/linoone/galar/front.4bpp.lz"); + const u32 gMonFrontPic_LinooneGalar[] = INCBIN_U32("graphics/pokemon/linoone/galar/front.4bpp.smol"); const u16 gMonPalette_LinooneGalar[] = INCBIN_U16("graphics/pokemon/linoone/galar/normal.gbapal"); - const u32 gMonBackPic_LinooneGalar[] = INCBIN_U32("graphics/pokemon/linoone/galar/back.4bpp.lz"); + const u32 gMonBackPic_LinooneGalar[] = INCBIN_U32("graphics/pokemon/linoone/galar/back.4bpp.smol"); const u16 gMonShinyPalette_LinooneGalar[] = INCBIN_U16("graphics/pokemon/linoone/galar/shiny.gbapal"); const u8 gMonIcon_LinooneGalar[] = INCBIN_U8("graphics/pokemon/linoone/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -10003,9 +10003,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Obstagoon[] = INCBIN_U32("graphics/pokemon/obstagoon/front.4bpp.lz"); + const u32 gMonFrontPic_Obstagoon[] = INCBIN_U32("graphics/pokemon/obstagoon/front.4bpp.smol"); const u16 gMonPalette_Obstagoon[] = INCBIN_U16("graphics/pokemon/obstagoon/normal.gbapal"); - const u32 gMonBackPic_Obstagoon[] = INCBIN_U32("graphics/pokemon/obstagoon/back.4bpp.lz"); + const u32 gMonBackPic_Obstagoon[] = INCBIN_U32("graphics/pokemon/obstagoon/back.4bpp.smol"); const u16 gMonShinyPalette_Obstagoon[] = INCBIN_U16("graphics/pokemon/obstagoon/shiny.gbapal"); const u8 gMonIcon_Obstagoon[] = INCBIN_U8("graphics/pokemon/obstagoon/icon.4bpp"); #if P_FOOTPRINTS @@ -10023,14 +10023,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_WURMPLE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/anim_front.4bpp.smol"); const u16 gMonPalette_Wurmple[] = INCBIN_U16("graphics/pokemon/wurmple/normal.gbapal"); - const u32 gMonBackPic_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/back.4bpp.lz"); + const u32 gMonBackPic_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/back.4bpp.smol"); const u16 gMonShinyPalette_Wurmple[] = INCBIN_U16("graphics/pokemon/wurmple/shiny.gbapal"); #else - const u32 gMonFrontPic_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Wurmple[] = INCBIN_U16("graphics/pokemon/wurmple/normal_gba.gbapal"); - const u32 gMonBackPic_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/back_gba.4bpp.lz"); + const u32 gMonBackPic_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Wurmple[] = INCBIN_U16("graphics/pokemon/wurmple/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10050,14 +10050,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/anim_front.4bpp.smol"); const u16 gMonPalette_Silcoon[] = INCBIN_U16("graphics/pokemon/silcoon/normal.gbapal"); - const u32 gMonBackPic_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/back.4bpp.lz"); + const u32 gMonBackPic_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/back.4bpp.smol"); const u16 gMonShinyPalette_Silcoon[] = INCBIN_U16("graphics/pokemon/silcoon/shiny.gbapal"); #else - const u32 gMonFrontPic_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Silcoon[] = INCBIN_U16("graphics/pokemon/silcoon/normal_gba.gbapal"); - const u32 gMonBackPic_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Silcoon[] = INCBIN_U16("graphics/pokemon/silcoon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10077,14 +10077,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/anim_front.4bpp.smol"); const u16 gMonPalette_Beautifly[] = INCBIN_U16("graphics/pokemon/beautifly/normal.gbapal"); - const u32 gMonBackPic_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/back.4bpp.lz"); + const u32 gMonBackPic_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/back.4bpp.smol"); const u16 gMonShinyPalette_Beautifly[] = INCBIN_U16("graphics/pokemon/beautifly/shiny.gbapal"); #else - const u32 gMonFrontPic_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Beautifly[] = INCBIN_U16("graphics/pokemon/beautifly/normal_gba.gbapal"); - const u32 gMonBackPic_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/back_gba.4bpp.lz"); + const u32 gMonBackPic_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Beautifly[] = INCBIN_U16("graphics/pokemon/beautifly/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10104,22 +10104,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_BeautiflyF[] = INCBIN_U32("graphics/pokemon/beautifly/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_BeautiflyF[] = INCBIN_U32("graphics/pokemon/beautifly/backf.4bpp.lz"); + const u32 gMonFrontPic_BeautiflyF[] = INCBIN_U32("graphics/pokemon/beautifly/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_BeautiflyF[] = INCBIN_U32("graphics/pokemon/beautifly/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_BeautiflyF[] = INCBIN_COMP("graphics/pokemon/beautifly/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/anim_front.4bpp.smol"); const u16 gMonPalette_Cascoon[] = INCBIN_U16("graphics/pokemon/cascoon/normal.gbapal"); - const u32 gMonBackPic_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/back.4bpp.lz"); + const u32 gMonBackPic_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/back.4bpp.smol"); const u16 gMonShinyPalette_Cascoon[] = INCBIN_U16("graphics/pokemon/cascoon/shiny.gbapal"); #else - const u32 gMonFrontPic_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Cascoon[] = INCBIN_U16("graphics/pokemon/cascoon/normal_gba.gbapal"); - const u32 gMonBackPic_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Cascoon[] = INCBIN_U16("graphics/pokemon/cascoon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10139,14 +10139,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/anim_front.4bpp.smol"); const u16 gMonPalette_Dustox[] = INCBIN_U16("graphics/pokemon/dustox/normal.gbapal"); - const u32 gMonBackPic_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/back.4bpp.lz"); + const u32 gMonBackPic_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/back.4bpp.smol"); const u16 gMonShinyPalette_Dustox[] = INCBIN_U16("graphics/pokemon/dustox/shiny.gbapal"); #else - const u32 gMonFrontPic_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Dustox[] = INCBIN_U16("graphics/pokemon/dustox/normal_gba.gbapal"); - const u32 gMonBackPic_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/back_gba.4bpp.lz"); + const u32 gMonBackPic_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Dustox[] = INCBIN_U16("graphics/pokemon/dustox/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10166,8 +10166,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_DustoxF[] = INCBIN_U32("graphics/pokemon/dustox/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_DustoxF[] = INCBIN_U32("graphics/pokemon/dustox/backf.4bpp.lz"); + const u32 gMonFrontPic_DustoxF[] = INCBIN_U32("graphics/pokemon/dustox/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_DustoxF[] = INCBIN_U32("graphics/pokemon/dustox/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_DustoxF[] = INCBIN_COMP("graphics/pokemon/dustox/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -10176,14 +10176,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_LOTAD #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/anim_front.4bpp.smol"); const u16 gMonPalette_Lotad[] = INCBIN_U16("graphics/pokemon/lotad/normal.gbapal"); - const u32 gMonBackPic_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/back.4bpp.lz"); + const u32 gMonBackPic_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/back.4bpp.smol"); const u16 gMonShinyPalette_Lotad[] = INCBIN_U16("graphics/pokemon/lotad/shiny.gbapal"); #else - const u32 gMonFrontPic_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Lotad[] = INCBIN_U16("graphics/pokemon/lotad/normal_gba.gbapal"); - const u32 gMonBackPic_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/back_gba.4bpp.lz"); + const u32 gMonBackPic_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Lotad[] = INCBIN_U16("graphics/pokemon/lotad/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10203,14 +10203,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/anim_front.4bpp.smol"); const u16 gMonPalette_Lombre[] = INCBIN_U16("graphics/pokemon/lombre/normal.gbapal"); - const u32 gMonBackPic_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/back.4bpp.lz"); + const u32 gMonBackPic_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/back.4bpp.smol"); const u16 gMonShinyPalette_Lombre[] = INCBIN_U16("graphics/pokemon/lombre/shiny.gbapal"); #else - const u32 gMonFrontPic_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Lombre[] = INCBIN_U16("graphics/pokemon/lombre/normal_gba.gbapal"); - const u32 gMonBackPic_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/back_gba.4bpp.lz"); + const u32 gMonBackPic_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Lombre[] = INCBIN_U16("graphics/pokemon/lombre/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10230,14 +10230,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/anim_front.4bpp.smol"); const u16 gMonPalette_Ludicolo[] = INCBIN_U16("graphics/pokemon/ludicolo/normal.gbapal"); - const u32 gMonBackPic_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/back.4bpp.lz"); + const u32 gMonBackPic_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/back.4bpp.smol"); const u16 gMonShinyPalette_Ludicolo[] = INCBIN_U16("graphics/pokemon/ludicolo/shiny.gbapal"); #else - const u32 gMonFrontPic_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ludicolo[] = INCBIN_U16("graphics/pokemon/ludicolo/normal_gba.gbapal"); - const u32 gMonBackPic_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ludicolo[] = INCBIN_U16("graphics/pokemon/ludicolo/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10261,8 +10261,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_LudicoloF[] = INCBIN_U32("graphics/pokemon/ludicolo/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_LudicoloF[] = INCBIN_U32("graphics/pokemon/ludicolo/backf.4bpp.lz"); + const u32 gMonFrontPic_LudicoloF[] = INCBIN_U32("graphics/pokemon/ludicolo/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_LudicoloF[] = INCBIN_U32("graphics/pokemon/ludicolo/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_LudicoloF[] = INCBIN_COMP("graphics/pokemon/ludicolo/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -10271,14 +10271,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SEEDOT #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/anim_front.4bpp.smol"); const u16 gMonPalette_Seedot[] = INCBIN_U16("graphics/pokemon/seedot/normal.gbapal"); - const u32 gMonBackPic_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/back.4bpp.lz"); + const u32 gMonBackPic_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/back.4bpp.smol"); const u16 gMonShinyPalette_Seedot[] = INCBIN_U16("graphics/pokemon/seedot/shiny.gbapal"); #else - const u32 gMonFrontPic_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Seedot[] = INCBIN_U16("graphics/pokemon/seedot/normal_gba.gbapal"); - const u32 gMonBackPic_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/back_gba.4bpp.lz"); + const u32 gMonBackPic_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Seedot[] = INCBIN_U16("graphics/pokemon/seedot/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10298,14 +10298,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/anim_front.4bpp.smol"); const u16 gMonPalette_Nuzleaf[] = INCBIN_U16("graphics/pokemon/nuzleaf/normal.gbapal"); - const u32 gMonBackPic_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/back.4bpp.lz"); + const u32 gMonBackPic_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/back.4bpp.smol"); const u16 gMonShinyPalette_Nuzleaf[] = INCBIN_U16("graphics/pokemon/nuzleaf/shiny.gbapal"); #else - const u32 gMonFrontPic_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Nuzleaf[] = INCBIN_U16("graphics/pokemon/nuzleaf/normal_gba.gbapal"); - const u32 gMonBackPic_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/back_gba.4bpp.lz"); + const u32 gMonBackPic_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Nuzleaf[] = INCBIN_U16("graphics/pokemon/nuzleaf/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10325,22 +10325,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_NuzleafF[] = INCBIN_U32("graphics/pokemon/nuzleaf/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_NuzleafF[] = INCBIN_U32("graphics/pokemon/nuzleaf/backf.4bpp.lz"); + const u32 gMonFrontPic_NuzleafF[] = INCBIN_U32("graphics/pokemon/nuzleaf/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_NuzleafF[] = INCBIN_U32("graphics/pokemon/nuzleaf/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_NuzleafF[] = INCBIN_COMP("graphics/pokemon/nuzleaf/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/anim_front.4bpp.smol"); const u16 gMonPalette_Shiftry[] = INCBIN_U16("graphics/pokemon/shiftry/normal.gbapal"); - const u32 gMonBackPic_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/back.4bpp.lz"); + const u32 gMonBackPic_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/back.4bpp.smol"); const u16 gMonShinyPalette_Shiftry[] = INCBIN_U16("graphics/pokemon/shiftry/shiny.gbapal"); #else - const u32 gMonFrontPic_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Shiftry[] = INCBIN_U16("graphics/pokemon/shiftry/normal_gba.gbapal"); - const u32 gMonBackPic_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/back_gba.4bpp.lz"); + const u32 gMonBackPic_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Shiftry[] = INCBIN_U16("graphics/pokemon/shiftry/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10360,8 +10360,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_ShiftryF[] = INCBIN_U32("graphics/pokemon/shiftry/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_ShiftryF[] = INCBIN_U32("graphics/pokemon/shiftry/backf.4bpp.lz"); + const u32 gMonFrontPic_ShiftryF[] = INCBIN_U32("graphics/pokemon/shiftry/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_ShiftryF[] = INCBIN_U32("graphics/pokemon/shiftry/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_ShiftryF[] = INCBIN_COMP("graphics/pokemon/shiftry/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -10370,14 +10370,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TAILLOW #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/anim_front.4bpp.smol"); const u16 gMonPalette_Taillow[] = INCBIN_U16("graphics/pokemon/taillow/normal.gbapal"); - const u32 gMonBackPic_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/back.4bpp.lz"); + const u32 gMonBackPic_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/back.4bpp.smol"); const u16 gMonShinyPalette_Taillow[] = INCBIN_U16("graphics/pokemon/taillow/shiny.gbapal"); #else - const u32 gMonFrontPic_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Taillow[] = INCBIN_U16("graphics/pokemon/taillow/normal_gba.gbapal"); - const u32 gMonBackPic_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/back_gba.4bpp.lz"); + const u32 gMonBackPic_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Taillow[] = INCBIN_U16("graphics/pokemon/taillow/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10397,14 +10397,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/anim_front.4bpp.smol"); const u16 gMonPalette_Swellow[] = INCBIN_U16("graphics/pokemon/swellow/normal.gbapal"); - const u32 gMonBackPic_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/back.4bpp.lz"); + const u32 gMonBackPic_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/back.4bpp.smol"); const u16 gMonShinyPalette_Swellow[] = INCBIN_U16("graphics/pokemon/swellow/shiny.gbapal"); #else - const u32 gMonFrontPic_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Swellow[] = INCBIN_U16("graphics/pokemon/swellow/normal_gba.gbapal"); - const u32 gMonBackPic_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/back_gba.4bpp.lz"); + const u32 gMonBackPic_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Swellow[] = INCBIN_U16("graphics/pokemon/swellow/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10426,14 +10426,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_WINGULL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/anim_front.4bpp.smol"); const u16 gMonPalette_Wingull[] = INCBIN_U16("graphics/pokemon/wingull/normal.gbapal"); - const u32 gMonBackPic_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/back.4bpp.lz"); + const u32 gMonBackPic_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/back.4bpp.smol"); const u16 gMonShinyPalette_Wingull[] = INCBIN_U16("graphics/pokemon/wingull/shiny.gbapal"); #else - const u32 gMonFrontPic_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Wingull[] = INCBIN_U16("graphics/pokemon/wingull/normal_gba.gbapal"); - const u32 gMonBackPic_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/back_gba.4bpp.lz"); + const u32 gMonBackPic_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Wingull[] = INCBIN_U16("graphics/pokemon/wingull/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10453,14 +10453,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/anim_front.4bpp.smol"); const u16 gMonPalette_Pelipper[] = INCBIN_U16("graphics/pokemon/pelipper/normal.gbapal"); - const u32 gMonBackPic_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/back.4bpp.lz"); + const u32 gMonBackPic_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/back.4bpp.smol"); const u16 gMonShinyPalette_Pelipper[] = INCBIN_U16("graphics/pokemon/pelipper/shiny.gbapal"); #else - const u32 gMonFrontPic_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Pelipper[] = INCBIN_U16("graphics/pokemon/pelipper/normal_gba.gbapal"); - const u32 gMonBackPic_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/back_gba.4bpp.lz"); + const u32 gMonBackPic_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Pelipper[] = INCBIN_U16("graphics/pokemon/pelipper/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10482,14 +10482,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_RALTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/anim_front.4bpp.smol"); const u16 gMonPalette_Ralts[] = INCBIN_U16("graphics/pokemon/ralts/normal.gbapal"); - const u32 gMonBackPic_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/back.4bpp.lz"); + const u32 gMonBackPic_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/back.4bpp.smol"); const u16 gMonShinyPalette_Ralts[] = INCBIN_U16("graphics/pokemon/ralts/shiny.gbapal"); #else - const u32 gMonFrontPic_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ralts[] = INCBIN_U16("graphics/pokemon/ralts/normal_gba.gbapal"); - const u32 gMonBackPic_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ralts[] = INCBIN_U16("graphics/pokemon/ralts/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10509,14 +10509,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/anim_front.4bpp.smol"); const u16 gMonPalette_Kirlia[] = INCBIN_U16("graphics/pokemon/kirlia/normal.gbapal"); - const u32 gMonBackPic_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/back.4bpp.lz"); + const u32 gMonBackPic_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/back.4bpp.smol"); const u16 gMonShinyPalette_Kirlia[] = INCBIN_U16("graphics/pokemon/kirlia/shiny.gbapal"); #else - const u32 gMonFrontPic_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Kirlia[] = INCBIN_U16("graphics/pokemon/kirlia/normal_gba.gbapal"); - const u32 gMonBackPic_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/back_gba.4bpp.lz"); + const u32 gMonBackPic_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Kirlia[] = INCBIN_U16("graphics/pokemon/kirlia/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10536,14 +10536,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/anim_front.4bpp.smol"); const u16 gMonPalette_Gardevoir[] = INCBIN_U16("graphics/pokemon/gardevoir/normal.gbapal"); - const u32 gMonBackPic_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/back.4bpp.lz"); + const u32 gMonBackPic_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/back.4bpp.smol"); const u16 gMonShinyPalette_Gardevoir[] = INCBIN_U16("graphics/pokemon/gardevoir/shiny.gbapal"); #else - const u32 gMonFrontPic_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Gardevoir[] = INCBIN_U16("graphics/pokemon/gardevoir/normal_gba.gbapal"); - const u32 gMonBackPic_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/back_gba.4bpp.lz"); + const u32 gMonBackPic_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Gardevoir[] = INCBIN_U16("graphics/pokemon/gardevoir/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10563,9 +10563,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_GardevoirMega[] = INCBIN_U32("graphics/pokemon/gardevoir/mega/front.4bpp.lz"); + const u32 gMonFrontPic_GardevoirMega[] = INCBIN_U32("graphics/pokemon/gardevoir/mega/front.4bpp.smol"); const u16 gMonPalette_GardevoirMega[] = INCBIN_U16("graphics/pokemon/gardevoir/mega/normal.gbapal"); - const u32 gMonBackPic_GardevoirMega[] = INCBIN_U32("graphics/pokemon/gardevoir/mega/back.4bpp.lz"); + const u32 gMonBackPic_GardevoirMega[] = INCBIN_U32("graphics/pokemon/gardevoir/mega/back.4bpp.smol"); const u16 gMonShinyPalette_GardevoirMega[] = INCBIN_U16("graphics/pokemon/gardevoir/mega/shiny.gbapal"); const u8 gMonIcon_GardevoirMega[] = INCBIN_U8("graphics/pokemon/gardevoir/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -10578,9 +10578,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_MEGA_EVOLUTIONS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Gallade[] = INCBIN_U32("graphics/pokemon/gallade/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gallade[] = INCBIN_U32("graphics/pokemon/gallade/anim_front.4bpp.smol"); const u16 gMonPalette_Gallade[] = INCBIN_U16("graphics/pokemon/gallade/normal.gbapal"); - const u32 gMonBackPic_Gallade[] = INCBIN_U32("graphics/pokemon/gallade/back.4bpp.lz"); + const u32 gMonBackPic_Gallade[] = INCBIN_U32("graphics/pokemon/gallade/back.4bpp.smol"); const u16 gMonShinyPalette_Gallade[] = INCBIN_U16("graphics/pokemon/gallade/shiny.gbapal"); const u8 gMonIcon_Gallade[] = INCBIN_U8("graphics/pokemon/gallade/icon.4bpp"); #if P_FOOTPRINTS @@ -10595,9 +10595,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_GalladeMega[] = INCBIN_U32("graphics/pokemon/gallade/mega/front.4bpp.lz"); + const u32 gMonFrontPic_GalladeMega[] = INCBIN_U32("graphics/pokemon/gallade/mega/front.4bpp.smol"); const u16 gMonPalette_GalladeMega[] = INCBIN_U16("graphics/pokemon/gallade/mega/normal.gbapal"); - const u32 gMonBackPic_GalladeMega[] = INCBIN_U32("graphics/pokemon/gallade/mega/back.4bpp.lz"); + const u32 gMonBackPic_GalladeMega[] = INCBIN_U32("graphics/pokemon/gallade/mega/back.4bpp.smol"); const u16 gMonShinyPalette_GalladeMega[] = INCBIN_U16("graphics/pokemon/gallade/mega/shiny.gbapal"); const u8 gMonIcon_GalladeMega[] = INCBIN_U8("graphics/pokemon/gallade/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -10613,14 +10613,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SURSKIT #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/anim_front.4bpp.smol"); const u16 gMonPalette_Surskit[] = INCBIN_U16("graphics/pokemon/surskit/normal.gbapal"); - const u32 gMonBackPic_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/back.4bpp.lz"); + const u32 gMonBackPic_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/back.4bpp.smol"); const u16 gMonShinyPalette_Surskit[] = INCBIN_U16("graphics/pokemon/surskit/shiny.gbapal"); #else - const u32 gMonFrontPic_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Surskit[] = INCBIN_U16("graphics/pokemon/surskit/normal_gba.gbapal"); - const u32 gMonBackPic_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/back_gba.4bpp.lz"); + const u32 gMonBackPic_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Surskit[] = INCBIN_U16("graphics/pokemon/surskit/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10640,14 +10640,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/anim_front.4bpp.smol"); const u16 gMonPalette_Masquerain[] = INCBIN_U16("graphics/pokemon/masquerain/normal.gbapal"); - const u32 gMonBackPic_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/back.4bpp.lz"); + const u32 gMonBackPic_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/back.4bpp.smol"); const u16 gMonShinyPalette_Masquerain[] = INCBIN_U16("graphics/pokemon/masquerain/shiny.gbapal"); #else - const u32 gMonFrontPic_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Masquerain[] = INCBIN_U16("graphics/pokemon/masquerain/normal_gba.gbapal"); - const u32 gMonBackPic_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/back_gba.4bpp.lz"); + const u32 gMonBackPic_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Masquerain[] = INCBIN_U16("graphics/pokemon/masquerain/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10669,14 +10669,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SHROOMISH #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/anim_front.4bpp.smol"); const u16 gMonPalette_Shroomish[] = INCBIN_U16("graphics/pokemon/shroomish/normal.gbapal"); - const u32 gMonBackPic_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/back.4bpp.lz"); + const u32 gMonBackPic_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/back.4bpp.smol"); const u16 gMonShinyPalette_Shroomish[] = INCBIN_U16("graphics/pokemon/shroomish/shiny.gbapal"); #else - const u32 gMonFrontPic_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Shroomish[] = INCBIN_U16("graphics/pokemon/shroomish/normal_gba.gbapal"); - const u32 gMonBackPic_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/back_gba.4bpp.lz"); + const u32 gMonBackPic_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Shroomish[] = INCBIN_U16("graphics/pokemon/shroomish/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10700,14 +10700,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/anim_front.4bpp.smol"); const u16 gMonPalette_Breloom[] = INCBIN_U16("graphics/pokemon/breloom/normal.gbapal"); - const u32 gMonBackPic_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/back.4bpp.lz"); + const u32 gMonBackPic_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/back.4bpp.smol"); const u16 gMonShinyPalette_Breloom[] = INCBIN_U16("graphics/pokemon/breloom/shiny.gbapal"); #else - const u32 gMonFrontPic_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Breloom[] = INCBIN_U16("graphics/pokemon/breloom/normal_gba.gbapal"); - const u32 gMonBackPic_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/back_gba.4bpp.lz"); + const u32 gMonBackPic_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Breloom[] = INCBIN_U16("graphics/pokemon/breloom/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10729,14 +10729,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SLAKOTH #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/anim_front.4bpp.smol"); const u16 gMonPalette_Slakoth[] = INCBIN_U16("graphics/pokemon/slakoth/normal.gbapal"); - const u32 gMonBackPic_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/back.4bpp.lz"); + const u32 gMonBackPic_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/back.4bpp.smol"); const u16 gMonShinyPalette_Slakoth[] = INCBIN_U16("graphics/pokemon/slakoth/shiny.gbapal"); #else - const u32 gMonFrontPic_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Slakoth[] = INCBIN_U16("graphics/pokemon/slakoth/normal_gba.gbapal"); - const u32 gMonBackPic_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/back_gba.4bpp.lz"); + const u32 gMonBackPic_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Slakoth[] = INCBIN_U16("graphics/pokemon/slakoth/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10756,14 +10756,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/anim_front.4bpp.smol"); const u16 gMonPalette_Vigoroth[] = INCBIN_U16("graphics/pokemon/vigoroth/normal.gbapal"); - const u32 gMonBackPic_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/back.4bpp.lz"); + const u32 gMonBackPic_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/back.4bpp.smol"); const u16 gMonShinyPalette_Vigoroth[] = INCBIN_U16("graphics/pokemon/vigoroth/shiny.gbapal"); #else - const u32 gMonFrontPic_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Vigoroth[] = INCBIN_U16("graphics/pokemon/vigoroth/normal_gba.gbapal"); - const u32 gMonBackPic_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/back_gba.4bpp.lz"); + const u32 gMonBackPic_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Vigoroth[] = INCBIN_U16("graphics/pokemon/vigoroth/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10783,14 +10783,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/anim_front.4bpp.smol"); const u16 gMonPalette_Slaking[] = INCBIN_U16("graphics/pokemon/slaking/normal.gbapal"); - const u32 gMonBackPic_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/back.4bpp.lz"); + const u32 gMonBackPic_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/back.4bpp.smol"); const u16 gMonShinyPalette_Slaking[] = INCBIN_U16("graphics/pokemon/slaking/shiny.gbapal"); #else - const u32 gMonFrontPic_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Slaking[] = INCBIN_U16("graphics/pokemon/slaking/normal_gba.gbapal"); - const u32 gMonBackPic_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/back_gba.4bpp.lz"); + const u32 gMonBackPic_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Slaking[] = INCBIN_U16("graphics/pokemon/slaking/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10812,14 +10812,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_NINCADA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/anim_front.4bpp.smol"); const u16 gMonPalette_Nincada[] = INCBIN_U16("graphics/pokemon/nincada/normal.gbapal"); - const u32 gMonBackPic_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/back.4bpp.lz"); + const u32 gMonBackPic_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/back.4bpp.smol"); const u16 gMonShinyPalette_Nincada[] = INCBIN_U16("graphics/pokemon/nincada/shiny.gbapal"); #else - const u32 gMonFrontPic_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Nincada[] = INCBIN_U16("graphics/pokemon/nincada/normal_gba.gbapal"); - const u32 gMonBackPic_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/back_gba.4bpp.lz"); + const u32 gMonBackPic_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Nincada[] = INCBIN_U16("graphics/pokemon/nincada/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10839,14 +10839,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/anim_front.4bpp.smol"); const u16 gMonPalette_Ninjask[] = INCBIN_U16("graphics/pokemon/ninjask/normal.gbapal"); - const u32 gMonBackPic_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/back.4bpp.lz"); + const u32 gMonBackPic_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/back.4bpp.smol"); const u16 gMonShinyPalette_Ninjask[] = INCBIN_U16("graphics/pokemon/ninjask/shiny.gbapal"); #else - const u32 gMonFrontPic_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ninjask[] = INCBIN_U16("graphics/pokemon/ninjask/normal_gba.gbapal"); - const u32 gMonBackPic_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ninjask[] = INCBIN_U16("graphics/pokemon/ninjask/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10866,14 +10866,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/anim_front.4bpp.smol"); const u16 gMonPalette_Shedinja[] = INCBIN_U16("graphics/pokemon/shedinja/normal.gbapal"); - const u32 gMonBackPic_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/back.4bpp.lz"); + const u32 gMonBackPic_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/back.4bpp.smol"); const u16 gMonShinyPalette_Shedinja[] = INCBIN_U16("graphics/pokemon/shedinja/shiny.gbapal"); #else - const u32 gMonFrontPic_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Shedinja[] = INCBIN_U16("graphics/pokemon/shedinja/normal_gba.gbapal"); - const u32 gMonBackPic_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/back_gba.4bpp.lz"); + const u32 gMonBackPic_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Shedinja[] = INCBIN_U16("graphics/pokemon/shedinja/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10895,14 +10895,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_WHISMUR #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/anim_front.4bpp.smol"); const u16 gMonPalette_Whismur[] = INCBIN_U16("graphics/pokemon/whismur/normal.gbapal"); - const u32 gMonBackPic_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/back.4bpp.lz"); + const u32 gMonBackPic_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/back.4bpp.smol"); const u16 gMonShinyPalette_Whismur[] = INCBIN_U16("graphics/pokemon/whismur/shiny.gbapal"); #else - const u32 gMonFrontPic_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Whismur[] = INCBIN_U16("graphics/pokemon/whismur/normal_gba.gbapal"); - const u32 gMonBackPic_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/back_gba.4bpp.lz"); + const u32 gMonBackPic_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Whismur[] = INCBIN_U16("graphics/pokemon/whismur/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10922,14 +10922,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/anim_front.4bpp.smol"); const u16 gMonPalette_Loudred[] = INCBIN_U16("graphics/pokemon/loudred/normal.gbapal"); - const u32 gMonBackPic_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/back.4bpp.lz"); + const u32 gMonBackPic_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/back.4bpp.smol"); const u16 gMonShinyPalette_Loudred[] = INCBIN_U16("graphics/pokemon/loudred/shiny.gbapal"); #else - const u32 gMonFrontPic_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Loudred[] = INCBIN_U16("graphics/pokemon/loudred/normal_gba.gbapal"); - const u32 gMonBackPic_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/back_gba.4bpp.lz"); + const u32 gMonBackPic_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Loudred[] = INCBIN_U16("graphics/pokemon/loudred/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10949,14 +10949,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/anim_front.4bpp.smol"); const u16 gMonPalette_Exploud[] = INCBIN_U16("graphics/pokemon/exploud/normal.gbapal"); - const u32 gMonBackPic_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/back.4bpp.lz"); + const u32 gMonBackPic_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/back.4bpp.smol"); const u16 gMonShinyPalette_Exploud[] = INCBIN_U16("graphics/pokemon/exploud/shiny.gbapal"); #else - const u32 gMonFrontPic_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Exploud[] = INCBIN_U16("graphics/pokemon/exploud/normal_gba.gbapal"); - const u32 gMonBackPic_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/back_gba.4bpp.lz"); + const u32 gMonBackPic_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Exploud[] = INCBIN_U16("graphics/pokemon/exploud/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10978,14 +10978,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MAKUHITA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/anim_front.4bpp.smol"); const u16 gMonPalette_Makuhita[] = INCBIN_U16("graphics/pokemon/makuhita/normal.gbapal"); - const u32 gMonBackPic_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/back.4bpp.lz"); + const u32 gMonBackPic_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/back.4bpp.smol"); const u16 gMonShinyPalette_Makuhita[] = INCBIN_U16("graphics/pokemon/makuhita/shiny.gbapal"); #else - const u32 gMonFrontPic_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Makuhita[] = INCBIN_U16("graphics/pokemon/makuhita/normal_gba.gbapal"); - const u32 gMonBackPic_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/back_gba.4bpp.lz"); + const u32 gMonBackPic_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Makuhita[] = INCBIN_U16("graphics/pokemon/makuhita/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11005,14 +11005,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/anim_front.4bpp.smol"); const u16 gMonPalette_Hariyama[] = INCBIN_U16("graphics/pokemon/hariyama/normal.gbapal"); - const u32 gMonBackPic_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/back.4bpp.lz"); + const u32 gMonBackPic_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/back.4bpp.smol"); const u16 gMonShinyPalette_Hariyama[] = INCBIN_U16("graphics/pokemon/hariyama/shiny.gbapal"); #else - const u32 gMonFrontPic_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Hariyama[] = INCBIN_U16("graphics/pokemon/hariyama/normal_gba.gbapal"); - const u32 gMonBackPic_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/back_gba.4bpp.lz"); + const u32 gMonBackPic_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Hariyama[] = INCBIN_U16("graphics/pokemon/hariyama/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11034,14 +11034,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_NOSEPASS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/anim_front.4bpp.smol"); const u16 gMonPalette_Nosepass[] = INCBIN_U16("graphics/pokemon/nosepass/normal.gbapal"); - const u32 gMonBackPic_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/back.4bpp.lz"); + const u32 gMonBackPic_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/back.4bpp.smol"); const u16 gMonShinyPalette_Nosepass[] = INCBIN_U16("graphics/pokemon/nosepass/shiny.gbapal"); #else - const u32 gMonFrontPic_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Nosepass[] = INCBIN_U16("graphics/pokemon/nosepass/normal_gba.gbapal"); - const u32 gMonBackPic_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/back_gba.4bpp.lz"); + const u32 gMonBackPic_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Nosepass[] = INCBIN_U16("graphics/pokemon/nosepass/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11061,9 +11061,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Probopass[] = INCBIN_U32("graphics/pokemon/probopass/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Probopass[] = INCBIN_U32("graphics/pokemon/probopass/anim_front.4bpp.smol"); const u16 gMonPalette_Probopass[] = INCBIN_U16("graphics/pokemon/probopass/normal.gbapal"); - const u32 gMonBackPic_Probopass[] = INCBIN_U32("graphics/pokemon/probopass/back.4bpp.lz"); + const u32 gMonBackPic_Probopass[] = INCBIN_U32("graphics/pokemon/probopass/back.4bpp.smol"); const u16 gMonShinyPalette_Probopass[] = INCBIN_U16("graphics/pokemon/probopass/shiny.gbapal"); const u8 gMonIcon_Probopass[] = INCBIN_U8("graphics/pokemon/probopass/icon.4bpp"); #if P_FOOTPRINTS @@ -11081,14 +11081,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SKITTY #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/anim_front.4bpp.smol"); const u16 gMonPalette_Skitty[] = INCBIN_U16("graphics/pokemon/skitty/normal.gbapal"); - const u32 gMonBackPic_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/back.4bpp.lz"); + const u32 gMonBackPic_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/back.4bpp.smol"); const u16 gMonShinyPalette_Skitty[] = INCBIN_U16("graphics/pokemon/skitty/shiny.gbapal"); #else - const u32 gMonFrontPic_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Skitty[] = INCBIN_U16("graphics/pokemon/skitty/normal_gba.gbapal"); - const u32 gMonBackPic_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/back_gba.4bpp.lz"); + const u32 gMonBackPic_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Skitty[] = INCBIN_U16("graphics/pokemon/skitty/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11108,14 +11108,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/anim_front.4bpp.smol"); const u16 gMonPalette_Delcatty[] = INCBIN_U16("graphics/pokemon/delcatty/normal.gbapal"); - const u32 gMonBackPic_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/back.4bpp.lz"); + const u32 gMonBackPic_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/back.4bpp.smol"); const u16 gMonShinyPalette_Delcatty[] = INCBIN_U16("graphics/pokemon/delcatty/shiny.gbapal"); #else - const u32 gMonFrontPic_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Delcatty[] = INCBIN_U16("graphics/pokemon/delcatty/normal_gba.gbapal"); - const u32 gMonBackPic_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/back_gba.4bpp.lz"); + const u32 gMonBackPic_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Delcatty[] = INCBIN_U16("graphics/pokemon/delcatty/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11137,14 +11137,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SABLEYE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/anim_front.4bpp.smol"); const u16 gMonPalette_Sableye[] = INCBIN_U16("graphics/pokemon/sableye/normal.gbapal"); - const u32 gMonBackPic_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/back.4bpp.lz"); + const u32 gMonBackPic_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/back.4bpp.smol"); const u16 gMonShinyPalette_Sableye[] = INCBIN_U16("graphics/pokemon/sableye/shiny.gbapal"); #else - const u32 gMonFrontPic_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Sableye[] = INCBIN_U16("graphics/pokemon/sableye/normal_gba.gbapal"); - const u32 gMonBackPic_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/back_gba.4bpp.lz"); + const u32 gMonBackPic_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Sableye[] = INCBIN_U16("graphics/pokemon/sableye/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11164,9 +11164,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_SableyeMega[] = INCBIN_U32("graphics/pokemon/sableye/mega/front.4bpp.lz"); + const u32 gMonFrontPic_SableyeMega[] = INCBIN_U32("graphics/pokemon/sableye/mega/front.4bpp.smol"); const u16 gMonPalette_SableyeMega[] = INCBIN_U16("graphics/pokemon/sableye/mega/normal.gbapal"); - const u32 gMonBackPic_SableyeMega[] = INCBIN_U32("graphics/pokemon/sableye/mega/back.4bpp.lz"); + const u32 gMonBackPic_SableyeMega[] = INCBIN_U32("graphics/pokemon/sableye/mega/back.4bpp.smol"); const u16 gMonShinyPalette_SableyeMega[] = INCBIN_U16("graphics/pokemon/sableye/mega/shiny.gbapal"); const u8 gMonIcon_SableyeMega[] = INCBIN_U8("graphics/pokemon/sableye/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -11181,14 +11181,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MAWILE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/anim_front.4bpp.smol"); const u16 gMonPalette_Mawile[] = INCBIN_U16("graphics/pokemon/mawile/normal.gbapal"); - const u32 gMonBackPic_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/back.4bpp.lz"); + const u32 gMonBackPic_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/back.4bpp.smol"); const u16 gMonShinyPalette_Mawile[] = INCBIN_U16("graphics/pokemon/mawile/shiny.gbapal"); #else - const u32 gMonFrontPic_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Mawile[] = INCBIN_U16("graphics/pokemon/mawile/normal_gba.gbapal"); - const u32 gMonBackPic_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/back_gba.4bpp.lz"); + const u32 gMonBackPic_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Mawile[] = INCBIN_U16("graphics/pokemon/mawile/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11212,9 +11212,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_MawileMega[] = INCBIN_U32("graphics/pokemon/mawile/mega/front.4bpp.lz"); + const u32 gMonFrontPic_MawileMega[] = INCBIN_U32("graphics/pokemon/mawile/mega/front.4bpp.smol"); const u16 gMonPalette_MawileMega[] = INCBIN_U16("graphics/pokemon/mawile/mega/normal.gbapal"); - const u32 gMonBackPic_MawileMega[] = INCBIN_U32("graphics/pokemon/mawile/mega/back.4bpp.lz"); + const u32 gMonBackPic_MawileMega[] = INCBIN_U32("graphics/pokemon/mawile/mega/back.4bpp.smol"); const u16 gMonShinyPalette_MawileMega[] = INCBIN_U16("graphics/pokemon/mawile/mega/shiny.gbapal"); const u8 gMonIcon_MawileMega[] = INCBIN_U8("graphics/pokemon/mawile/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -11229,14 +11229,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ARON #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Aron[] = INCBIN_U32("graphics/pokemon/aron/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Aron[] = INCBIN_U32("graphics/pokemon/aron/anim_front.4bpp.smol"); const u16 gMonPalette_Aron[] = INCBIN_U16("graphics/pokemon/aron/normal.gbapal"); - const u32 gMonBackPic_Aron[] = INCBIN_U32("graphics/pokemon/aron/back.4bpp.lz"); + const u32 gMonBackPic_Aron[] = INCBIN_U32("graphics/pokemon/aron/back.4bpp.smol"); const u16 gMonShinyPalette_Aron[] = INCBIN_U16("graphics/pokemon/aron/shiny.gbapal"); #else - const u32 gMonFrontPic_Aron[] = INCBIN_U32("graphics/pokemon/aron/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Aron[] = INCBIN_U32("graphics/pokemon/aron/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Aron[] = INCBIN_U16("graphics/pokemon/aron/normal_gba.gbapal"); - const u32 gMonBackPic_Aron[] = INCBIN_U32("graphics/pokemon/aron/back_gba.4bpp.lz"); + const u32 gMonBackPic_Aron[] = INCBIN_U32("graphics/pokemon/aron/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Aron[] = INCBIN_U16("graphics/pokemon/aron/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11256,14 +11256,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/anim_front.4bpp.smol"); const u16 gMonPalette_Lairon[] = INCBIN_U16("graphics/pokemon/lairon/normal.gbapal"); - const u32 gMonBackPic_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/back.4bpp.lz"); + const u32 gMonBackPic_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/back.4bpp.smol"); const u16 gMonShinyPalette_Lairon[] = INCBIN_U16("graphics/pokemon/lairon/shiny.gbapal"); #else - const u32 gMonFrontPic_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Lairon[] = INCBIN_U16("graphics/pokemon/lairon/normal_gba.gbapal"); - const u32 gMonBackPic_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Lairon[] = INCBIN_U16("graphics/pokemon/lairon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11283,14 +11283,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/anim_front.4bpp.smol"); const u16 gMonPalette_Aggron[] = INCBIN_U16("graphics/pokemon/aggron/normal.gbapal"); - const u32 gMonBackPic_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/back.4bpp.lz"); + const u32 gMonBackPic_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/back.4bpp.smol"); const u16 gMonShinyPalette_Aggron[] = INCBIN_U16("graphics/pokemon/aggron/shiny.gbapal"); #else - const u32 gMonFrontPic_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Aggron[] = INCBIN_U16("graphics/pokemon/aggron/normal_gba.gbapal"); - const u32 gMonBackPic_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/back_gba.4bpp.lz"); + const u32 gMonBackPic_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Aggron[] = INCBIN_U16("graphics/pokemon/aggron/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11310,9 +11310,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_AggronMega[] = INCBIN_U32("graphics/pokemon/aggron/mega/front.4bpp.lz"); + const u32 gMonFrontPic_AggronMega[] = INCBIN_U32("graphics/pokemon/aggron/mega/front.4bpp.smol"); const u16 gMonPalette_AggronMega[] = INCBIN_U16("graphics/pokemon/aggron/mega/normal.gbapal"); - const u32 gMonBackPic_AggronMega[] = INCBIN_U32("graphics/pokemon/aggron/mega/back.4bpp.lz"); + const u32 gMonBackPic_AggronMega[] = INCBIN_U32("graphics/pokemon/aggron/mega/back.4bpp.smol"); const u16 gMonShinyPalette_AggronMega[] = INCBIN_U16("graphics/pokemon/aggron/mega/shiny.gbapal"); const u8 gMonIcon_AggronMega[] = INCBIN_U8("graphics/pokemon/aggron/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -11327,14 +11327,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MEDITITE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/anim_front.4bpp.smol"); const u16 gMonPalette_Meditite[] = INCBIN_U16("graphics/pokemon/meditite/normal.gbapal"); - const u32 gMonBackPic_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/back.4bpp.lz"); + const u32 gMonBackPic_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/back.4bpp.smol"); const u16 gMonShinyPalette_Meditite[] = INCBIN_U16("graphics/pokemon/meditite/shiny.gbapal"); #else - const u32 gMonFrontPic_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Meditite[] = INCBIN_U16("graphics/pokemon/meditite/normal_gba.gbapal"); - const u32 gMonBackPic_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/back_gba.4bpp.lz"); + const u32 gMonBackPic_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Meditite[] = INCBIN_U16("graphics/pokemon/meditite/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11354,22 +11354,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_MedititeF[] = INCBIN_U32("graphics/pokemon/meditite/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_MedititeF[] = INCBIN_U32("graphics/pokemon/meditite/backf.4bpp.lz"); + const u32 gMonFrontPic_MedititeF[] = INCBIN_U32("graphics/pokemon/meditite/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_MedititeF[] = INCBIN_U32("graphics/pokemon/meditite/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_MedititeF[] = INCBIN_COMP("graphics/pokemon/meditite/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/anim_front.4bpp.smol"); const u16 gMonPalette_Medicham[] = INCBIN_U16("graphics/pokemon/medicham/normal.gbapal"); - const u32 gMonBackPic_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/back.4bpp.lz"); + const u32 gMonBackPic_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/back.4bpp.smol"); const u16 gMonShinyPalette_Medicham[] = INCBIN_U16("graphics/pokemon/medicham/shiny.gbapal"); #else - const u32 gMonFrontPic_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Medicham[] = INCBIN_U16("graphics/pokemon/medicham/normal_gba.gbapal"); - const u32 gMonBackPic_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/back_gba.4bpp.lz"); + const u32 gMonBackPic_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Medicham[] = INCBIN_U16("graphics/pokemon/medicham/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11389,17 +11389,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_MedichamF[] = INCBIN_U32("graphics/pokemon/medicham/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_MedichamF[] = INCBIN_U32("graphics/pokemon/medicham/backf.4bpp.lz"); + const u32 gMonFrontPic_MedichamF[] = INCBIN_U32("graphics/pokemon/medicham/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_MedichamF[] = INCBIN_U32("graphics/pokemon/medicham/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_MedichamF[] = INCBIN_COMP("graphics/pokemon/medicham/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_MedichamMega[] = INCBIN_U32("graphics/pokemon/medicham/mega/front.4bpp.lz"); + const u32 gMonFrontPic_MedichamMega[] = INCBIN_U32("graphics/pokemon/medicham/mega/front.4bpp.smol"); const u16 gMonPalette_MedichamMega[] = INCBIN_U16("graphics/pokemon/medicham/mega/normal.gbapal"); - const u32 gMonBackPic_MedichamMega[] = INCBIN_U32("graphics/pokemon/medicham/mega/back.4bpp.lz"); + const u32 gMonBackPic_MedichamMega[] = INCBIN_U32("graphics/pokemon/medicham/mega/back.4bpp.smol"); const u16 gMonShinyPalette_MedichamMega[] = INCBIN_U16("graphics/pokemon/medicham/mega/shiny.gbapal"); const u8 gMonIcon_MedichamMega[] = INCBIN_U8("graphics/pokemon/medicham/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -11414,14 +11414,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ELECTRIKE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/anim_front.4bpp.smol"); const u16 gMonPalette_Electrike[] = INCBIN_U16("graphics/pokemon/electrike/normal.gbapal"); - const u32 gMonBackPic_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/back.4bpp.lz"); + const u32 gMonBackPic_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/back.4bpp.smol"); const u16 gMonShinyPalette_Electrike[] = INCBIN_U16("graphics/pokemon/electrike/shiny.gbapal"); #else - const u32 gMonFrontPic_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Electrike[] = INCBIN_U16("graphics/pokemon/electrike/normal_gba.gbapal"); - const u32 gMonBackPic_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/back_gba.4bpp.lz"); + const u32 gMonBackPic_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Electrike[] = INCBIN_U16("graphics/pokemon/electrike/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11441,14 +11441,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/anim_front.4bpp.smol"); const u16 gMonPalette_Manectric[] = INCBIN_U16("graphics/pokemon/manectric/normal.gbapal"); - const u32 gMonBackPic_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/back.4bpp.lz"); + const u32 gMonBackPic_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/back.4bpp.smol"); const u16 gMonShinyPalette_Manectric[] = INCBIN_U16("graphics/pokemon/manectric/shiny.gbapal"); #else - const u32 gMonFrontPic_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Manectric[] = INCBIN_U16("graphics/pokemon/manectric/normal_gba.gbapal"); - const u32 gMonBackPic_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/back_gba.4bpp.lz"); + const u32 gMonBackPic_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Manectric[] = INCBIN_U16("graphics/pokemon/manectric/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11468,9 +11468,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_ManectricMega[] = INCBIN_U32("graphics/pokemon/manectric/mega/front.4bpp.lz"); + const u32 gMonFrontPic_ManectricMega[] = INCBIN_U32("graphics/pokemon/manectric/mega/front.4bpp.smol"); const u16 gMonPalette_ManectricMega[] = INCBIN_U16("graphics/pokemon/manectric/mega/normal.gbapal"); - const u32 gMonBackPic_ManectricMega[] = INCBIN_U32("graphics/pokemon/manectric/mega/back.4bpp.lz"); + const u32 gMonBackPic_ManectricMega[] = INCBIN_U32("graphics/pokemon/manectric/mega/back.4bpp.smol"); const u16 gMonShinyPalette_ManectricMega[] = INCBIN_U16("graphics/pokemon/manectric/mega/shiny.gbapal"); const u8 gMonIcon_ManectricMega[] = INCBIN_U8("graphics/pokemon/manectric/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -11485,14 +11485,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_PLUSLE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/anim_front.4bpp.smol"); const u16 gMonPalette_Plusle[] = INCBIN_U16("graphics/pokemon/plusle/normal.gbapal"); - const u32 gMonBackPic_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/back.4bpp.lz"); + const u32 gMonBackPic_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/back.4bpp.smol"); const u16 gMonShinyPalette_Plusle[] = INCBIN_U16("graphics/pokemon/plusle/shiny.gbapal"); #else - const u32 gMonFrontPic_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Plusle[] = INCBIN_U16("graphics/pokemon/plusle/normal_gba.gbapal"); - const u32 gMonBackPic_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/back_gba.4bpp.lz"); + const u32 gMonBackPic_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Plusle[] = INCBIN_U16("graphics/pokemon/plusle/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11514,14 +11514,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MINUN #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Minun[] = INCBIN_U32("graphics/pokemon/minun/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Minun[] = INCBIN_U32("graphics/pokemon/minun/anim_front.4bpp.smol"); const u16 gMonPalette_Minun[] = INCBIN_U16("graphics/pokemon/minun/normal.gbapal"); - const u32 gMonBackPic_Minun[] = INCBIN_U32("graphics/pokemon/minun/back.4bpp.lz"); + const u32 gMonBackPic_Minun[] = INCBIN_U32("graphics/pokemon/minun/back.4bpp.smol"); const u16 gMonShinyPalette_Minun[] = INCBIN_U16("graphics/pokemon/minun/shiny.gbapal"); #else - const u32 gMonFrontPic_Minun[] = INCBIN_U32("graphics/pokemon/minun/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Minun[] = INCBIN_U32("graphics/pokemon/minun/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Minun[] = INCBIN_U16("graphics/pokemon/minun/normal_gba.gbapal"); - const u32 gMonBackPic_Minun[] = INCBIN_U32("graphics/pokemon/minun/back_gba.4bpp.lz"); + const u32 gMonBackPic_Minun[] = INCBIN_U32("graphics/pokemon/minun/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Minun[] = INCBIN_U16("graphics/pokemon/minun/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11543,14 +11543,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_VOLBEAT_ILLUMISE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/anim_front.4bpp.smol"); const u16 gMonPalette_Volbeat[] = INCBIN_U16("graphics/pokemon/volbeat/normal.gbapal"); - const u32 gMonBackPic_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/back.4bpp.lz"); + const u32 gMonBackPic_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/back.4bpp.smol"); const u16 gMonShinyPalette_Volbeat[] = INCBIN_U16("graphics/pokemon/volbeat/shiny.gbapal"); #else - const u32 gMonFrontPic_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Volbeat[] = INCBIN_U16("graphics/pokemon/volbeat/normal_gba.gbapal"); - const u32 gMonBackPic_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/back_gba.4bpp.lz"); + const u32 gMonBackPic_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Volbeat[] = INCBIN_U16("graphics/pokemon/volbeat/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11570,14 +11570,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/anim_front.4bpp.smol"); const u16 gMonPalette_Illumise[] = INCBIN_U16("graphics/pokemon/illumise/normal.gbapal"); - const u32 gMonBackPic_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/back.4bpp.lz"); + const u32 gMonBackPic_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/back.4bpp.smol"); const u16 gMonShinyPalette_Illumise[] = INCBIN_U16("graphics/pokemon/illumise/shiny.gbapal"); #else - const u32 gMonFrontPic_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Illumise[] = INCBIN_U16("graphics/pokemon/illumise/normal_gba.gbapal"); - const u32 gMonBackPic_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/back_gba.4bpp.lz"); + const u32 gMonBackPic_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Illumise[] = INCBIN_U16("graphics/pokemon/illumise/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11599,9 +11599,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ROSELIA #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Budew[] = INCBIN_U32("graphics/pokemon/budew/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Budew[] = INCBIN_U32("graphics/pokemon/budew/anim_front.4bpp.smol"); const u16 gMonPalette_Budew[] = INCBIN_U16("graphics/pokemon/budew/normal.gbapal"); - const u32 gMonBackPic_Budew[] = INCBIN_U32("graphics/pokemon/budew/back.4bpp.lz"); + const u32 gMonBackPic_Budew[] = INCBIN_U32("graphics/pokemon/budew/back.4bpp.smol"); const u16 gMonShinyPalette_Budew[] = INCBIN_U16("graphics/pokemon/budew/shiny.gbapal"); const u8 gMonIcon_Budew[] = INCBIN_U8("graphics/pokemon/budew/icon.4bpp"); #if P_FOOTPRINTS @@ -11617,14 +11617,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_4_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/anim_front.4bpp.smol"); const u16 gMonPalette_Roselia[] = INCBIN_U16("graphics/pokemon/roselia/normal.gbapal"); - const u32 gMonBackPic_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/back.4bpp.lz"); + const u32 gMonBackPic_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/back.4bpp.smol"); const u16 gMonShinyPalette_Roselia[] = INCBIN_U16("graphics/pokemon/roselia/shiny.gbapal"); #else - const u32 gMonFrontPic_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Roselia[] = INCBIN_U16("graphics/pokemon/roselia/normal_gba.gbapal"); - const u32 gMonBackPic_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/back_gba.4bpp.lz"); + const u32 gMonBackPic_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Roselia[] = INCBIN_U16("graphics/pokemon/roselia/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11644,17 +11644,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_RoseliaF[] = INCBIN_U32("graphics/pokemon/roselia/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_RoseliaF[] = INCBIN_U32("graphics/pokemon/roselia/backf.4bpp.lz"); + const u32 gMonFrontPic_RoseliaF[] = INCBIN_U32("graphics/pokemon/roselia/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_RoseliaF[] = INCBIN_U32("graphics/pokemon/roselia/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_RoseliaF[] = INCBIN_COMP("graphics/pokemon/roselia/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Roserade[] = INCBIN_U32("graphics/pokemon/roserade/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Roserade[] = INCBIN_U32("graphics/pokemon/roserade/anim_front.4bpp.smol"); const u16 gMonPalette_Roserade[] = INCBIN_U16("graphics/pokemon/roserade/normal.gbapal"); - const u32 gMonBackPic_Roserade[] = INCBIN_U32("graphics/pokemon/roserade/back.4bpp.lz"); + const u32 gMonBackPic_Roserade[] = INCBIN_U32("graphics/pokemon/roserade/back.4bpp.smol"); const u16 gMonShinyPalette_Roserade[] = INCBIN_U16("graphics/pokemon/roserade/shiny.gbapal"); const u8 gMonIcon_Roserade[] = INCBIN_U8("graphics/pokemon/roserade/icon.4bpp"); #if P_FOOTPRINTS @@ -11669,8 +11669,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_RoseradeF[] = INCBIN_U32("graphics/pokemon/roserade/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_RoseradeF[] = INCBIN_U32("graphics/pokemon/roserade/backf.4bpp.lz"); + const u32 gMonFrontPic_RoseradeF[] = INCBIN_U32("graphics/pokemon/roserade/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_RoseradeF[] = INCBIN_U32("graphics/pokemon/roserade/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_RoseradeF[] = INCBIN_COMP("graphics/pokemon/roserade/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -11680,14 +11680,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_GULPIN #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/anim_front.4bpp.smol"); const u16 gMonPalette_Gulpin[] = INCBIN_U16("graphics/pokemon/gulpin/normal.gbapal"); - const u32 gMonBackPic_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/back.4bpp.lz"); + const u32 gMonBackPic_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/back.4bpp.smol"); const u16 gMonShinyPalette_Gulpin[] = INCBIN_U16("graphics/pokemon/gulpin/shiny.gbapal"); #else - const u32 gMonFrontPic_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Gulpin[] = INCBIN_U16("graphics/pokemon/gulpin/normal_gba.gbapal"); - const u32 gMonBackPic_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/back_gba.4bpp.lz"); + const u32 gMonBackPic_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Gulpin[] = INCBIN_U16("graphics/pokemon/gulpin/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11707,22 +11707,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_GulpinF[] = INCBIN_U32("graphics/pokemon/gulpin/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_GulpinF[] = INCBIN_U32("graphics/pokemon/gulpin/backf.4bpp.lz"); + const u32 gMonFrontPic_GulpinF[] = INCBIN_U32("graphics/pokemon/gulpin/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_GulpinF[] = INCBIN_U32("graphics/pokemon/gulpin/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_GulpinF[] = INCBIN_COMP("graphics/pokemon/gulpin/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/anim_front.4bpp.smol"); const u16 gMonPalette_Swalot[] = INCBIN_U16("graphics/pokemon/swalot/normal.gbapal"); - const u32 gMonBackPic_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/back.4bpp.lz"); + const u32 gMonBackPic_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/back.4bpp.smol"); const u16 gMonShinyPalette_Swalot[] = INCBIN_U16("graphics/pokemon/swalot/shiny.gbapal"); #else - const u32 gMonFrontPic_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Swalot[] = INCBIN_U16("graphics/pokemon/swalot/normal_gba.gbapal"); - const u32 gMonBackPic_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/back_gba.4bpp.lz"); + const u32 gMonBackPic_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Swalot[] = INCBIN_U16("graphics/pokemon/swalot/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11742,8 +11742,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_SwalotF[] = INCBIN_U32("graphics/pokemon/swalot/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_SwalotF[] = INCBIN_U32("graphics/pokemon/swalot/backf.4bpp.lz"); + const u32 gMonFrontPic_SwalotF[] = INCBIN_U32("graphics/pokemon/swalot/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_SwalotF[] = INCBIN_U32("graphics/pokemon/swalot/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_SwalotF[] = INCBIN_COMP("graphics/pokemon/swalot/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -11752,14 +11752,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CARVANHA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/anim_front.4bpp.smol"); const u16 gMonPalette_Carvanha[] = INCBIN_U16("graphics/pokemon/carvanha/normal.gbapal"); - const u32 gMonBackPic_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/back.4bpp.lz"); + const u32 gMonBackPic_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/back.4bpp.smol"); const u16 gMonShinyPalette_Carvanha[] = INCBIN_U16("graphics/pokemon/carvanha/shiny.gbapal"); #else - const u32 gMonFrontPic_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Carvanha[] = INCBIN_U16("graphics/pokemon/carvanha/normal_gba.gbapal"); - const u32 gMonBackPic_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/back_gba.4bpp.lz"); + const u32 gMonBackPic_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Carvanha[] = INCBIN_U16("graphics/pokemon/carvanha/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11779,14 +11779,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/anim_front.4bpp.smol"); const u16 gMonPalette_Sharpedo[] = INCBIN_U16("graphics/pokemon/sharpedo/normal.gbapal"); - const u32 gMonBackPic_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/back.4bpp.lz"); + const u32 gMonBackPic_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/back.4bpp.smol"); const u16 gMonShinyPalette_Sharpedo[] = INCBIN_U16("graphics/pokemon/sharpedo/shiny.gbapal"); #else - const u32 gMonFrontPic_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Sharpedo[] = INCBIN_U16("graphics/pokemon/sharpedo/normal_gba.gbapal"); - const u32 gMonBackPic_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/back_gba.4bpp.lz"); + const u32 gMonBackPic_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Sharpedo[] = INCBIN_U16("graphics/pokemon/sharpedo/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11806,9 +11806,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_SharpedoMega[] = INCBIN_U32("graphics/pokemon/sharpedo/mega/front.4bpp.lz"); + const u32 gMonFrontPic_SharpedoMega[] = INCBIN_U32("graphics/pokemon/sharpedo/mega/front.4bpp.smol"); const u16 gMonPalette_SharpedoMega[] = INCBIN_U16("graphics/pokemon/sharpedo/mega/normal.gbapal"); - const u32 gMonBackPic_SharpedoMega[] = INCBIN_U32("graphics/pokemon/sharpedo/mega/back.4bpp.lz"); + const u32 gMonBackPic_SharpedoMega[] = INCBIN_U32("graphics/pokemon/sharpedo/mega/back.4bpp.smol"); const u16 gMonShinyPalette_SharpedoMega[] = INCBIN_U16("graphics/pokemon/sharpedo/mega/shiny.gbapal"); const u8 gMonIcon_SharpedoMega[] = INCBIN_U8("graphics/pokemon/sharpedo/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -11823,14 +11823,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_WAILMER #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/anim_front.4bpp.smol"); const u16 gMonPalette_Wailmer[] = INCBIN_U16("graphics/pokemon/wailmer/normal.gbapal"); - const u32 gMonBackPic_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/back.4bpp.lz"); + const u32 gMonBackPic_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/back.4bpp.smol"); const u16 gMonShinyPalette_Wailmer[] = INCBIN_U16("graphics/pokemon/wailmer/shiny.gbapal"); #else - const u32 gMonFrontPic_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Wailmer[] = INCBIN_U16("graphics/pokemon/wailmer/normal_gba.gbapal"); - const u32 gMonBackPic_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/back_gba.4bpp.lz"); + const u32 gMonBackPic_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Wailmer[] = INCBIN_U16("graphics/pokemon/wailmer/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11850,14 +11850,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/anim_front.4bpp.smol"); const u16 gMonPalette_Wailord[] = INCBIN_U16("graphics/pokemon/wailord/normal.gbapal"); - const u32 gMonBackPic_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/back.4bpp.lz"); + const u32 gMonBackPic_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/back.4bpp.smol"); const u16 gMonShinyPalette_Wailord[] = INCBIN_U16("graphics/pokemon/wailord/shiny.gbapal"); #else - const u32 gMonFrontPic_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Wailord[] = INCBIN_U16("graphics/pokemon/wailord/normal_gba.gbapal"); - const u32 gMonBackPic_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/back_gba.4bpp.lz"); + const u32 gMonBackPic_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Wailord[] = INCBIN_U16("graphics/pokemon/wailord/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11879,14 +11879,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_NUMEL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Numel[] = INCBIN_U32("graphics/pokemon/numel/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Numel[] = INCBIN_U32("graphics/pokemon/numel/anim_front.4bpp.smol"); const u16 gMonPalette_Numel[] = INCBIN_U16("graphics/pokemon/numel/normal.gbapal"); - const u32 gMonBackPic_Numel[] = INCBIN_U32("graphics/pokemon/numel/back.4bpp.lz"); + const u32 gMonBackPic_Numel[] = INCBIN_U32("graphics/pokemon/numel/back.4bpp.smol"); const u16 gMonShinyPalette_Numel[] = INCBIN_U16("graphics/pokemon/numel/shiny.gbapal"); #else - const u32 gMonFrontPic_Numel[] = INCBIN_U32("graphics/pokemon/numel/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Numel[] = INCBIN_U32("graphics/pokemon/numel/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Numel[] = INCBIN_U16("graphics/pokemon/numel/normal_gba.gbapal"); - const u32 gMonBackPic_Numel[] = INCBIN_U32("graphics/pokemon/numel/back_gba.4bpp.lz"); + const u32 gMonBackPic_Numel[] = INCBIN_U32("graphics/pokemon/numel/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Numel[] = INCBIN_U16("graphics/pokemon/numel/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11906,22 +11906,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_NumelF[] = INCBIN_U32("graphics/pokemon/numel/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_NumelF[] = INCBIN_U32("graphics/pokemon/numel/backf.4bpp.lz"); + const u32 gMonFrontPic_NumelF[] = INCBIN_U32("graphics/pokemon/numel/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_NumelF[] = INCBIN_U32("graphics/pokemon/numel/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_NumelF[] = INCBIN_COMP("graphics/pokemon/numel/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/anim_front.4bpp.smol"); const u16 gMonPalette_Camerupt[] = INCBIN_U16("graphics/pokemon/camerupt/normal.gbapal"); - const u32 gMonBackPic_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/back.4bpp.lz"); + const u32 gMonBackPic_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/back.4bpp.smol"); const u16 gMonShinyPalette_Camerupt[] = INCBIN_U16("graphics/pokemon/camerupt/shiny.gbapal"); #else - const u32 gMonFrontPic_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Camerupt[] = INCBIN_U16("graphics/pokemon/camerupt/normal_gba.gbapal"); - const u32 gMonBackPic_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/back_gba.4bpp.lz"); + const u32 gMonBackPic_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Camerupt[] = INCBIN_U16("graphics/pokemon/camerupt/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11941,17 +11941,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_CameruptF[] = INCBIN_U32("graphics/pokemon/camerupt/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_CameruptF[] = INCBIN_U32("graphics/pokemon/camerupt/backf.4bpp.lz"); + const u32 gMonFrontPic_CameruptF[] = INCBIN_U32("graphics/pokemon/camerupt/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_CameruptF[] = INCBIN_U32("graphics/pokemon/camerupt/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_CameruptF[] = INCBIN_COMP("graphics/pokemon/camerupt/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_CameruptMega[] = INCBIN_U32("graphics/pokemon/camerupt/mega/front.4bpp.lz"); + const u32 gMonFrontPic_CameruptMega[] = INCBIN_U32("graphics/pokemon/camerupt/mega/front.4bpp.smol"); const u16 gMonPalette_CameruptMega[] = INCBIN_U16("graphics/pokemon/camerupt/mega/normal.gbapal"); - const u32 gMonBackPic_CameruptMega[] = INCBIN_U32("graphics/pokemon/camerupt/mega/back.4bpp.lz"); + const u32 gMonBackPic_CameruptMega[] = INCBIN_U32("graphics/pokemon/camerupt/mega/back.4bpp.smol"); const u16 gMonShinyPalette_CameruptMega[] = INCBIN_U16("graphics/pokemon/camerupt/mega/shiny.gbapal"); const u8 gMonIcon_CameruptMega[] = INCBIN_U8("graphics/pokemon/camerupt/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -11966,14 +11966,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TORKOAL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/anim_front.4bpp.smol"); const u16 gMonPalette_Torkoal[] = INCBIN_U16("graphics/pokemon/torkoal/normal.gbapal"); - const u32 gMonBackPic_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/back.4bpp.lz"); + const u32 gMonBackPic_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/back.4bpp.smol"); const u16 gMonShinyPalette_Torkoal[] = INCBIN_U16("graphics/pokemon/torkoal/shiny.gbapal"); #else - const u32 gMonFrontPic_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Torkoal[] = INCBIN_U16("graphics/pokemon/torkoal/normal_gba.gbapal"); - const u32 gMonBackPic_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/back_gba.4bpp.lz"); + const u32 gMonBackPic_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Torkoal[] = INCBIN_U16("graphics/pokemon/torkoal/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11995,14 +11995,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SPOINK #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/anim_front.4bpp.smol"); const u16 gMonPalette_Spoink[] = INCBIN_U16("graphics/pokemon/spoink/normal.gbapal"); - const u32 gMonBackPic_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/back.4bpp.lz"); + const u32 gMonBackPic_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/back.4bpp.smol"); const u16 gMonShinyPalette_Spoink[] = INCBIN_U16("graphics/pokemon/spoink/shiny.gbapal"); #else - const u32 gMonFrontPic_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Spoink[] = INCBIN_U16("graphics/pokemon/spoink/normal_gba.gbapal"); - const u32 gMonBackPic_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/back_gba.4bpp.lz"); + const u32 gMonBackPic_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Spoink[] = INCBIN_U16("graphics/pokemon/spoink/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12022,14 +12022,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/anim_front.4bpp.smol"); const u16 gMonPalette_Grumpig[] = INCBIN_U16("graphics/pokemon/grumpig/normal.gbapal"); - const u32 gMonBackPic_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/back.4bpp.lz"); + const u32 gMonBackPic_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/back.4bpp.smol"); const u16 gMonShinyPalette_Grumpig[] = INCBIN_U16("graphics/pokemon/grumpig/shiny.gbapal"); #else - const u32 gMonFrontPic_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Grumpig[] = INCBIN_U16("graphics/pokemon/grumpig/normal_gba.gbapal"); - const u32 gMonBackPic_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/back_gba.4bpp.lz"); + const u32 gMonBackPic_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Grumpig[] = INCBIN_U16("graphics/pokemon/grumpig/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12050,11 +12050,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SPOINK #if P_FAMILY_SPINDA - const u32 gMonFrontPic_Spinda[] = INCBIN_U32("graphics/pokemon/spinda/anim_front.4bpp.lz"); +#if !P_GBA_STYLE_SPECIES_GFX + const u32 gMonFrontPic_Spinda[] = INCBIN_U32("graphics/pokemon/spinda/anim_front.4bpp.smol"); const u16 gMonPalette_Spinda[] = INCBIN_U16("graphics/pokemon/spinda/normal.gbapal"); - const u32 gMonBackPic_Spinda[] = INCBIN_U32("graphics/pokemon/spinda/back.4bpp.lz"); + const u32 gMonBackPic_Spinda[] = INCBIN_U32("graphics/pokemon/spinda/back.4bpp.smol"); const u16 gMonShinyPalette_Spinda[] = INCBIN_U16("graphics/pokemon/spinda/shiny.gbapal"); +#else + const u32 gMonFrontPic_Spinda[] = INCBIN_U32("graphics/pokemon/spinda/anim_front_gba.4bpp.smol"); + const u16 gMonPalette_Spinda[] = INCBIN_U16("graphics/pokemon/spinda/normal_gba.gbapal"); + const u32 gMonBackPic_Spinda[] = INCBIN_U32("graphics/pokemon/spinda/back_gba.4bpp.smol"); + const u16 gMonShinyPalette_Spinda[] = INCBIN_U16("graphics/pokemon/spinda/shiny_gba.gbapal"); +#endif //P_GBA_STYLE_SPECIES_GFX +#if !P_GBA_STYLE_SPECIES_ICONS const u8 gMonIcon_Spinda[] = INCBIN_U8("graphics/pokemon/spinda/icon.4bpp"); +#else + const u8 gMonIcon_Spinda[] = INCBIN_U8("graphics/pokemon/spinda/icon_gba.4bpp"); +#endif //P_GBA_STYLE_SPECIES_ICONS #if P_FOOTPRINTS const u8 gMonFootprint_Spinda[] = INCBIN_U8("graphics/pokemon/spinda/footprint.1bpp"); #endif //P_FOOTPRINTS @@ -12069,14 +12080,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TRAPINCH #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/anim_front.4bpp.smol"); const u16 gMonPalette_Trapinch[] = INCBIN_U16("graphics/pokemon/trapinch/normal.gbapal"); - const u32 gMonBackPic_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/back.4bpp.lz"); + const u32 gMonBackPic_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/back.4bpp.smol"); const u16 gMonShinyPalette_Trapinch[] = INCBIN_U16("graphics/pokemon/trapinch/shiny.gbapal"); #else - const u32 gMonFrontPic_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Trapinch[] = INCBIN_U16("graphics/pokemon/trapinch/normal_gba.gbapal"); - const u32 gMonBackPic_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/back_gba.4bpp.lz"); + const u32 gMonBackPic_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Trapinch[] = INCBIN_U16("graphics/pokemon/trapinch/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12096,14 +12107,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/anim_front.4bpp.smol"); const u16 gMonPalette_Vibrava[] = INCBIN_U16("graphics/pokemon/vibrava/normal.gbapal"); - const u32 gMonBackPic_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/back.4bpp.lz"); + const u32 gMonBackPic_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/back.4bpp.smol"); const u16 gMonShinyPalette_Vibrava[] = INCBIN_U16("graphics/pokemon/vibrava/shiny.gbapal"); #else - const u32 gMonFrontPic_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Vibrava[] = INCBIN_U16("graphics/pokemon/vibrava/normal_gba.gbapal"); - const u32 gMonBackPic_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/back_gba.4bpp.lz"); + const u32 gMonBackPic_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Vibrava[] = INCBIN_U16("graphics/pokemon/vibrava/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12123,14 +12134,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/anim_front.4bpp.smol"); const u16 gMonPalette_Flygon[] = INCBIN_U16("graphics/pokemon/flygon/normal.gbapal"); - const u32 gMonBackPic_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/back.4bpp.lz"); + const u32 gMonBackPic_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/back.4bpp.smol"); const u16 gMonShinyPalette_Flygon[] = INCBIN_U16("graphics/pokemon/flygon/shiny.gbapal"); #else - const u32 gMonFrontPic_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Flygon[] = INCBIN_U16("graphics/pokemon/flygon/normal_gba.gbapal"); - const u32 gMonBackPic_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Flygon[] = INCBIN_U16("graphics/pokemon/flygon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12152,14 +12163,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CACNEA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/anim_front.4bpp.smol"); const u16 gMonPalette_Cacnea[] = INCBIN_U16("graphics/pokemon/cacnea/normal.gbapal"); - const u32 gMonBackPic_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/back.4bpp.lz"); + const u32 gMonBackPic_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/back.4bpp.smol"); const u16 gMonShinyPalette_Cacnea[] = INCBIN_U16("graphics/pokemon/cacnea/shiny.gbapal"); #else - const u32 gMonFrontPic_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Cacnea[] = INCBIN_U16("graphics/pokemon/cacnea/normal_gba.gbapal"); - const u32 gMonBackPic_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/back_gba.4bpp.lz"); + const u32 gMonBackPic_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Cacnea[] = INCBIN_U16("graphics/pokemon/cacnea/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12179,14 +12190,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/anim_front.4bpp.smol"); const u16 gMonPalette_Cacturne[] = INCBIN_U16("graphics/pokemon/cacturne/normal.gbapal"); - const u32 gMonBackPic_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/back.4bpp.lz"); + const u32 gMonBackPic_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/back.4bpp.smol"); const u16 gMonShinyPalette_Cacturne[] = INCBIN_U16("graphics/pokemon/cacturne/shiny.gbapal"); #else - const u32 gMonFrontPic_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Cacturne[] = INCBIN_U16("graphics/pokemon/cacturne/normal_gba.gbapal"); - const u32 gMonBackPic_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/back_gba.4bpp.lz"); + const u32 gMonBackPic_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Cacturne[] = INCBIN_U16("graphics/pokemon/cacturne/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12206,7 +12217,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_CacturneF[] = INCBIN_U32("graphics/pokemon/cacturne/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_CacturneF[] = INCBIN_U32("graphics/pokemon/cacturne/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_CacturneF[] = INCBIN_COMP("graphics/pokemon/cacturne/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -12215,14 +12226,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SWABLU #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/anim_front.4bpp.smol"); const u16 gMonPalette_Swablu[] = INCBIN_U16("graphics/pokemon/swablu/normal.gbapal"); - const u32 gMonBackPic_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/back.4bpp.lz"); + const u32 gMonBackPic_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/back.4bpp.smol"); const u16 gMonShinyPalette_Swablu[] = INCBIN_U16("graphics/pokemon/swablu/shiny.gbapal"); #else - const u32 gMonFrontPic_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Swablu[] = INCBIN_U16("graphics/pokemon/swablu/normal_gba.gbapal"); - const u32 gMonBackPic_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/back_gba.4bpp.lz"); + const u32 gMonBackPic_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Swablu[] = INCBIN_U16("graphics/pokemon/swablu/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12242,14 +12253,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/anim_front.4bpp.smol"); const u16 gMonPalette_Altaria[] = INCBIN_U16("graphics/pokemon/altaria/normal.gbapal"); - const u32 gMonBackPic_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/back.4bpp.lz"); + const u32 gMonBackPic_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/back.4bpp.smol"); const u16 gMonShinyPalette_Altaria[] = INCBIN_U16("graphics/pokemon/altaria/shiny.gbapal"); #else - const u32 gMonFrontPic_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Altaria[] = INCBIN_U16("graphics/pokemon/altaria/normal_gba.gbapal"); - const u32 gMonBackPic_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/back_gba.4bpp.lz"); + const u32 gMonBackPic_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Altaria[] = INCBIN_U16("graphics/pokemon/altaria/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12269,9 +12280,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_AltariaMega[] = INCBIN_U32("graphics/pokemon/altaria/mega/front.4bpp.lz"); + const u32 gMonFrontPic_AltariaMega[] = INCBIN_U32("graphics/pokemon/altaria/mega/front.4bpp.smol"); const u16 gMonPalette_AltariaMega[] = INCBIN_U16("graphics/pokemon/altaria/mega/normal.gbapal"); - const u32 gMonBackPic_AltariaMega[] = INCBIN_U32("graphics/pokemon/altaria/mega/back.4bpp.lz"); + const u32 gMonBackPic_AltariaMega[] = INCBIN_U32("graphics/pokemon/altaria/mega/back.4bpp.smol"); const u16 gMonShinyPalette_AltariaMega[] = INCBIN_U16("graphics/pokemon/altaria/mega/shiny.gbapal"); const u8 gMonIcon_AltariaMega[] = INCBIN_U8("graphics/pokemon/altaria/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -12286,14 +12297,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ZANGOOSE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/anim_front.4bpp.smol"); const u16 gMonPalette_Zangoose[] = INCBIN_U16("graphics/pokemon/zangoose/normal.gbapal"); - const u32 gMonBackPic_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/back.4bpp.lz"); + const u32 gMonBackPic_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/back.4bpp.smol"); const u16 gMonShinyPalette_Zangoose[] = INCBIN_U16("graphics/pokemon/zangoose/shiny.gbapal"); #else - const u32 gMonFrontPic_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Zangoose[] = INCBIN_U16("graphics/pokemon/zangoose/normal_gba.gbapal"); - const u32 gMonBackPic_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/back_gba.4bpp.lz"); + const u32 gMonBackPic_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Zangoose[] = INCBIN_U16("graphics/pokemon/zangoose/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12315,14 +12326,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SEVIPER #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/anim_front.4bpp.smol"); const u16 gMonPalette_Seviper[] = INCBIN_U16("graphics/pokemon/seviper/normal.gbapal"); - const u32 gMonBackPic_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/back.4bpp.lz"); + const u32 gMonBackPic_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/back.4bpp.smol"); const u16 gMonShinyPalette_Seviper[] = INCBIN_U16("graphics/pokemon/seviper/shiny.gbapal"); #else - const u32 gMonFrontPic_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Seviper[] = INCBIN_U16("graphics/pokemon/seviper/normal_gba.gbapal"); - const u32 gMonBackPic_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/back_gba.4bpp.lz"); + const u32 gMonBackPic_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Seviper[] = INCBIN_U16("graphics/pokemon/seviper/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12344,14 +12355,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_LUNATONE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/anim_front.4bpp.smol"); const u16 gMonPalette_Lunatone[] = INCBIN_U16("graphics/pokemon/lunatone/normal.gbapal"); - const u32 gMonBackPic_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/back.4bpp.lz"); + const u32 gMonBackPic_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/back.4bpp.smol"); const u16 gMonShinyPalette_Lunatone[] = INCBIN_U16("graphics/pokemon/lunatone/shiny.gbapal"); #else - const u32 gMonFrontPic_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Lunatone[] = INCBIN_U16("graphics/pokemon/lunatone/normal_gba.gbapal"); - const u32 gMonBackPic_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/back_gba.4bpp.lz"); + const u32 gMonBackPic_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Lunatone[] = INCBIN_U16("graphics/pokemon/lunatone/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12373,14 +12384,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SOLROCK #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/anim_front.4bpp.smol"); const u16 gMonPalette_Solrock[] = INCBIN_U16("graphics/pokemon/solrock/normal.gbapal"); - const u32 gMonBackPic_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/back.4bpp.lz"); + const u32 gMonBackPic_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/back.4bpp.smol"); const u16 gMonShinyPalette_Solrock[] = INCBIN_U16("graphics/pokemon/solrock/shiny.gbapal"); #else - const u32 gMonFrontPic_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Solrock[] = INCBIN_U16("graphics/pokemon/solrock/normal_gba.gbapal"); - const u32 gMonBackPic_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/back_gba.4bpp.lz"); + const u32 gMonBackPic_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Solrock[] = INCBIN_U16("graphics/pokemon/solrock/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12402,14 +12413,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_BARBOACH #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/anim_front.4bpp.smol"); const u16 gMonPalette_Barboach[] = INCBIN_U16("graphics/pokemon/barboach/normal.gbapal"); - const u32 gMonBackPic_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/back.4bpp.lz"); + const u32 gMonBackPic_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/back.4bpp.smol"); const u16 gMonShinyPalette_Barboach[] = INCBIN_U16("graphics/pokemon/barboach/shiny.gbapal"); #else - const u32 gMonFrontPic_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Barboach[] = INCBIN_U16("graphics/pokemon/barboach/normal_gba.gbapal"); - const u32 gMonBackPic_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/back_gba.4bpp.lz"); + const u32 gMonBackPic_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Barboach[] = INCBIN_U16("graphics/pokemon/barboach/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12429,14 +12440,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/anim_front.4bpp.smol"); const u16 gMonPalette_Whiscash[] = INCBIN_U16("graphics/pokemon/whiscash/normal.gbapal"); - const u32 gMonBackPic_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/back.4bpp.lz"); + const u32 gMonBackPic_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/back.4bpp.smol"); const u16 gMonShinyPalette_Whiscash[] = INCBIN_U16("graphics/pokemon/whiscash/shiny.gbapal"); #else - const u32 gMonFrontPic_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Whiscash[] = INCBIN_U16("graphics/pokemon/whiscash/normal_gba.gbapal"); - const u32 gMonBackPic_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/back_gba.4bpp.lz"); + const u32 gMonBackPic_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Whiscash[] = INCBIN_U16("graphics/pokemon/whiscash/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12458,14 +12469,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CORPHISH #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/anim_front.4bpp.smol"); const u16 gMonPalette_Corphish[] = INCBIN_U16("graphics/pokemon/corphish/normal.gbapal"); - const u32 gMonBackPic_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/back.4bpp.lz"); + const u32 gMonBackPic_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/back.4bpp.smol"); const u16 gMonShinyPalette_Corphish[] = INCBIN_U16("graphics/pokemon/corphish/shiny.gbapal"); #else - const u32 gMonFrontPic_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Corphish[] = INCBIN_U16("graphics/pokemon/corphish/normal_gba.gbapal"); - const u32 gMonBackPic_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/back_gba.4bpp.lz"); + const u32 gMonBackPic_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Corphish[] = INCBIN_U16("graphics/pokemon/corphish/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12485,14 +12496,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/anim_front.4bpp.smol"); const u16 gMonPalette_Crawdaunt[] = INCBIN_U16("graphics/pokemon/crawdaunt/normal.gbapal"); - const u32 gMonBackPic_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/back.4bpp.lz"); + const u32 gMonBackPic_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/back.4bpp.smol"); const u16 gMonShinyPalette_Crawdaunt[] = INCBIN_U16("graphics/pokemon/crawdaunt/shiny.gbapal"); #else - const u32 gMonFrontPic_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Crawdaunt[] = INCBIN_U16("graphics/pokemon/crawdaunt/normal_gba.gbapal"); - const u32 gMonBackPic_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/back_gba.4bpp.lz"); + const u32 gMonBackPic_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Crawdaunt[] = INCBIN_U16("graphics/pokemon/crawdaunt/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12514,14 +12525,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_BALTOY #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/anim_front.4bpp.smol"); const u16 gMonPalette_Baltoy[] = INCBIN_U16("graphics/pokemon/baltoy/normal.gbapal"); - const u32 gMonBackPic_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/back.4bpp.lz"); + const u32 gMonBackPic_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/back.4bpp.smol"); const u16 gMonShinyPalette_Baltoy[] = INCBIN_U16("graphics/pokemon/baltoy/shiny.gbapal"); #else - const u32 gMonFrontPic_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Baltoy[] = INCBIN_U16("graphics/pokemon/baltoy/normal_gba.gbapal"); - const u32 gMonBackPic_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/back_gba.4bpp.lz"); + const u32 gMonBackPic_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Baltoy[] = INCBIN_U16("graphics/pokemon/baltoy/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12541,14 +12552,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/anim_front.4bpp.smol"); const u16 gMonPalette_Claydol[] = INCBIN_U16("graphics/pokemon/claydol/normal.gbapal"); - const u32 gMonBackPic_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/back.4bpp.lz"); + const u32 gMonBackPic_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/back.4bpp.smol"); const u16 gMonShinyPalette_Claydol[] = INCBIN_U16("graphics/pokemon/claydol/shiny.gbapal"); #else - const u32 gMonFrontPic_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Claydol[] = INCBIN_U16("graphics/pokemon/claydol/normal_gba.gbapal"); - const u32 gMonBackPic_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/back_gba.4bpp.lz"); + const u32 gMonBackPic_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Claydol[] = INCBIN_U16("graphics/pokemon/claydol/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12570,14 +12581,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_LILEEP #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/anim_front.4bpp.smol"); const u16 gMonPalette_Lileep[] = INCBIN_U16("graphics/pokemon/lileep/normal.gbapal"); - const u32 gMonBackPic_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/back.4bpp.lz"); + const u32 gMonBackPic_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/back.4bpp.smol"); const u16 gMonShinyPalette_Lileep[] = INCBIN_U16("graphics/pokemon/lileep/shiny.gbapal"); #else - const u32 gMonFrontPic_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Lileep[] = INCBIN_U16("graphics/pokemon/lileep/normal_gba.gbapal"); - const u32 gMonBackPic_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/back_gba.4bpp.lz"); + const u32 gMonBackPic_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Lileep[] = INCBIN_U16("graphics/pokemon/lileep/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12597,14 +12608,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/anim_front.4bpp.smol"); const u16 gMonPalette_Cradily[] = INCBIN_U16("graphics/pokemon/cradily/normal.gbapal"); - const u32 gMonBackPic_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/back.4bpp.lz"); + const u32 gMonBackPic_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/back.4bpp.smol"); const u16 gMonShinyPalette_Cradily[] = INCBIN_U16("graphics/pokemon/cradily/shiny.gbapal"); #else - const u32 gMonFrontPic_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Cradily[] = INCBIN_U16("graphics/pokemon/cradily/normal_gba.gbapal"); - const u32 gMonBackPic_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/back_gba.4bpp.lz"); + const u32 gMonBackPic_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Cradily[] = INCBIN_U16("graphics/pokemon/cradily/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12626,14 +12637,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ANORITH #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/anim_front.4bpp.smol"); const u16 gMonPalette_Anorith[] = INCBIN_U16("graphics/pokemon/anorith/normal.gbapal"); - const u32 gMonBackPic_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/back.4bpp.lz"); + const u32 gMonBackPic_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/back.4bpp.smol"); const u16 gMonShinyPalette_Anorith[] = INCBIN_U16("graphics/pokemon/anorith/shiny.gbapal"); #else - const u32 gMonFrontPic_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Anorith[] = INCBIN_U16("graphics/pokemon/anorith/normal_gba.gbapal"); - const u32 gMonBackPic_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/back_gba.4bpp.lz"); + const u32 gMonBackPic_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Anorith[] = INCBIN_U16("graphics/pokemon/anorith/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12653,14 +12664,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/anim_front.4bpp.smol"); const u16 gMonPalette_Armaldo[] = INCBIN_U16("graphics/pokemon/armaldo/normal.gbapal"); - const u32 gMonBackPic_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/back.4bpp.lz"); + const u32 gMonBackPic_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/back.4bpp.smol"); const u16 gMonShinyPalette_Armaldo[] = INCBIN_U16("graphics/pokemon/armaldo/shiny.gbapal"); #else - const u32 gMonFrontPic_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Armaldo[] = INCBIN_U16("graphics/pokemon/armaldo/normal_gba.gbapal"); - const u32 gMonBackPic_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/back_gba.4bpp.lz"); + const u32 gMonBackPic_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Armaldo[] = INCBIN_U16("graphics/pokemon/armaldo/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12682,14 +12693,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_FEEBAS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/anim_front.4bpp.smol"); const u16 gMonPalette_Feebas[] = INCBIN_U16("graphics/pokemon/feebas/normal.gbapal"); - const u32 gMonBackPic_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/back.4bpp.lz"); + const u32 gMonBackPic_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/back.4bpp.smol"); const u16 gMonShinyPalette_Feebas[] = INCBIN_U16("graphics/pokemon/feebas/shiny.gbapal"); #else - const u32 gMonFrontPic_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Feebas[] = INCBIN_U16("graphics/pokemon/feebas/normal_gba.gbapal"); - const u32 gMonBackPic_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/back_gba.4bpp.lz"); + const u32 gMonBackPic_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Feebas[] = INCBIN_U16("graphics/pokemon/feebas/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12709,14 +12720,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/anim_front.4bpp.smol"); const u16 gMonPalette_Milotic[] = INCBIN_U16("graphics/pokemon/milotic/normal.gbapal"); - const u32 gMonBackPic_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/back.4bpp.lz"); + const u32 gMonBackPic_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/back.4bpp.smol"); const u16 gMonShinyPalette_Milotic[] = INCBIN_U16("graphics/pokemon/milotic/shiny.gbapal"); #else - const u32 gMonFrontPic_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Milotic[] = INCBIN_U16("graphics/pokemon/milotic/normal_gba.gbapal"); - const u32 gMonBackPic_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/back_gba.4bpp.lz"); + const u32 gMonBackPic_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Milotic[] = INCBIN_U16("graphics/pokemon/milotic/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12736,8 +12747,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_MiloticF[] = INCBIN_U32("graphics/pokemon/milotic/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_MiloticF[] = INCBIN_U32("graphics/pokemon/milotic/backf.4bpp.lz"); + const u32 gMonFrontPic_MiloticF[] = INCBIN_U32("graphics/pokemon/milotic/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_MiloticF[] = INCBIN_U32("graphics/pokemon/milotic/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_MiloticF[] = INCBIN_COMP("graphics/pokemon/milotic/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -12745,31 +12756,58 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FEEBAS #if P_FAMILY_CASTFORM - const u32 gMonFrontPic_CastformNormal[] = INCBIN_U32("graphics/pokemon/castform/anim_front.4bpp.lz"); +#if !P_GBA_STYLE_SPECIES_GFX + const u32 gMonFrontPic_CastformNormal[] = INCBIN_U32("graphics/pokemon/castform/anim_front.4bpp.smol"); const u16 gMonPalette_CastformNormal[] = INCBIN_U16("graphics/pokemon/castform/normal.gbapal"); - const u32 gMonBackPic_CastformNormal[] = INCBIN_U32("graphics/pokemon/castform/back.4bpp.lz"); + const u32 gMonBackPic_CastformNormal[] = INCBIN_U32("graphics/pokemon/castform/back.4bpp.smol"); const u16 gMonShinyPalette_CastformNormal[] = INCBIN_U16("graphics/pokemon/castform/shiny.gbapal"); - const u8 gMonIcon_CastformNormal[] = INCBIN_U8("graphics/pokemon/castform/icon.4bpp"); -#if P_FOOTPRINTS - const u8 gMonFootprint_Castform[] = INCBIN_U8("graphics/pokemon/castform/footprint.1bpp"); -#endif //P_FOOTPRINTS - const u32 gMonFrontPic_CastformSunny[] = INCBIN_U32("graphics/pokemon/castform/sunny/anim_front.4bpp.lz"); + const u32 gMonFrontPic_CastformSunny[] = INCBIN_U32("graphics/pokemon/castform/sunny/anim_front.4bpp.smol"); const u16 gMonPalette_CastformSunny[] = INCBIN_U16("graphics/pokemon/castform/sunny/normal.gbapal"); - const u32 gMonBackPic_CastformSunny[] = INCBIN_U32("graphics/pokemon/castform/sunny/back.4bpp.lz"); + const u32 gMonBackPic_CastformSunny[] = INCBIN_U32("graphics/pokemon/castform/sunny/back.4bpp.smol"); const u16 gMonShinyPalette_CastformSunny[] = INCBIN_U16("graphics/pokemon/castform/sunny/shiny.gbapal"); - const u8 gMonIcon_CastformSunny[] = INCBIN_U8("graphics/pokemon/castform/sunny/icon.4bpp"); - const u32 gMonFrontPic_CastformRainy[] = INCBIN_U32("graphics/pokemon/castform/rainy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_CastformRainy[] = INCBIN_U32("graphics/pokemon/castform/rainy/anim_front.4bpp.smol"); const u16 gMonPalette_CastformRainy[] = INCBIN_U16("graphics/pokemon/castform/rainy/normal.gbapal"); - const u32 gMonBackPic_CastformRainy[] = INCBIN_U32("graphics/pokemon/castform/rainy/back.4bpp.lz"); + const u32 gMonBackPic_CastformRainy[] = INCBIN_U32("graphics/pokemon/castform/rainy/back.4bpp.smol"); const u16 gMonShinyPalette_CastformRainy[] = INCBIN_U16("graphics/pokemon/castform/rainy/shiny.gbapal"); - const u8 gMonIcon_CastformRainy[] = INCBIN_U8("graphics/pokemon/castform/rainy/icon.4bpp"); - const u32 gMonFrontPic_CastformSnowy[] = INCBIN_U32("graphics/pokemon/castform/snowy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_CastformSnowy[] = INCBIN_U32("graphics/pokemon/castform/snowy/anim_front.4bpp.smol"); const u16 gMonPalette_CastformSnowy[] = INCBIN_U16("graphics/pokemon/castform/snowy/normal.gbapal"); - const u32 gMonBackPic_CastformSnowy[] = INCBIN_U32("graphics/pokemon/castform/snowy/back.4bpp.lz"); + const u32 gMonBackPic_CastformSnowy[] = INCBIN_U32("graphics/pokemon/castform/snowy/back.4bpp.smol"); const u16 gMonShinyPalette_CastformSnowy[] = INCBIN_U16("graphics/pokemon/castform/snowy/shiny.gbapal"); +#else + const u32 gMonFrontPic_CastformNormal[] = INCBIN_U32("graphics/pokemon/castform/front_gba.4bpp.smol"); + const u16 gMonPalette_CastformNormal[] = INCBIN_U16("graphics/pokemon/castform/normal_gba.gbapal"); + const u32 gMonBackPic_CastformNormal[] = INCBIN_U32("graphics/pokemon/castform/back_gba.4bpp.smol"); + const u16 gMonShinyPalette_CastformNormal[] = INCBIN_U16("graphics/pokemon/castform/shiny_gba.gbapal"); + + const u32 gMonFrontPic_CastformSunny[] = INCBIN_U32("graphics/pokemon/castform/sunny/front_gba.4bpp.smol"); + const u16 gMonPalette_CastformSunny[] = INCBIN_U16("graphics/pokemon/castform/sunny/normal_gba.gbapal"); + const u32 gMonBackPic_CastformSunny[] = INCBIN_U32("graphics/pokemon/castform/sunny/back_gba.4bpp.smol"); + const u16 gMonShinyPalette_CastformSunny[] = INCBIN_U16("graphics/pokemon/castform/sunny/shiny_gba.gbapal"); + + const u32 gMonFrontPic_CastformRainy[] = INCBIN_U32("graphics/pokemon/castform/rainy/front_gba.4bpp.smol"); + const u16 gMonPalette_CastformRainy[] = INCBIN_U16("graphics/pokemon/castform/rainy/normal_gba.gbapal"); + const u32 gMonBackPic_CastformRainy[] = INCBIN_U32("graphics/pokemon/castform/rainy/back_gba.4bpp.smol"); + const u16 gMonShinyPalette_CastformRainy[] = INCBIN_U16("graphics/pokemon/castform/rainy/shiny_gba.gbapal"); + + const u32 gMonFrontPic_CastformSnowy[] = INCBIN_U32("graphics/pokemon/castform/snowy/front_gba.4bpp.smol"); + const u16 gMonPalette_CastformSnowy[] = INCBIN_U16("graphics/pokemon/castform/snowy/normal_gba.gbapal"); + const u32 gMonBackPic_CastformSnowy[] = INCBIN_U32("graphics/pokemon/castform/snowy/back_gba.4bpp.smol"); + const u16 gMonShinyPalette_CastformSnowy[] = INCBIN_U16("graphics/pokemon/castform/snowy/shiny_gba.gbapal"); +#endif //P_GBA_STYLE_SPECIES_GFX +#if !P_GBA_STYLE_SPECIES_ICONS + const u8 gMonIcon_CastformNormal[] = INCBIN_U8("graphics/pokemon/castform/icon.4bpp"); +#else + const u8 gMonIcon_CastformNormal[] = INCBIN_U8("graphics/pokemon/castform/icon_gba.4bpp"); +#endif //P_GBA_STYLE_SPECIES_ICONS +#if P_FOOTPRINTS + const u8 gMonFootprint_Castform[] = INCBIN_U8("graphics/pokemon/castform/footprint.1bpp"); +#endif //P_FOOTPRINTS + + const u8 gMonIcon_CastformSunny[] = INCBIN_U8("graphics/pokemon/castform/sunny/icon.4bpp"); + const u8 gMonIcon_CastformRainy[] = INCBIN_U8("graphics/pokemon/castform/rainy/icon.4bpp"); const u8 gMonIcon_CastformSnowy[] = INCBIN_U8("graphics/pokemon/castform/snowy/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -12792,14 +12830,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_KECLEON #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/anim_front.4bpp.smol"); const u16 gMonPalette_Kecleon[] = INCBIN_U16("graphics/pokemon/kecleon/normal.gbapal"); - const u32 gMonBackPic_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/back.4bpp.lz"); + const u32 gMonBackPic_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/back.4bpp.smol"); const u16 gMonShinyPalette_Kecleon[] = INCBIN_U16("graphics/pokemon/kecleon/shiny.gbapal"); #else - const u32 gMonFrontPic_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Kecleon[] = INCBIN_U16("graphics/pokemon/kecleon/normal_gba.gbapal"); - const u32 gMonBackPic_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Kecleon[] = INCBIN_U16("graphics/pokemon/kecleon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12821,14 +12859,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SHUPPET #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/anim_front.4bpp.smol"); const u16 gMonPalette_Shuppet[] = INCBIN_U16("graphics/pokemon/shuppet/normal.gbapal"); - const u32 gMonBackPic_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/back.4bpp.lz"); + const u32 gMonBackPic_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/back.4bpp.smol"); const u16 gMonShinyPalette_Shuppet[] = INCBIN_U16("graphics/pokemon/shuppet/shiny.gbapal"); #else - const u32 gMonFrontPic_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Shuppet[] = INCBIN_U16("graphics/pokemon/shuppet/normal_gba.gbapal"); - const u32 gMonBackPic_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/back_gba.4bpp.lz"); + const u32 gMonBackPic_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Shuppet[] = INCBIN_U16("graphics/pokemon/shuppet/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12848,14 +12886,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Banette[] = INCBIN_U32("graphics/pokemon/banette/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Banette[] = INCBIN_U32("graphics/pokemon/banette/anim_front.4bpp.smol"); const u16 gMonPalette_Banette[] = INCBIN_U16("graphics/pokemon/banette/normal.gbapal"); - const u32 gMonBackPic_Banette[] = INCBIN_U32("graphics/pokemon/banette/back.4bpp.lz"); + const u32 gMonBackPic_Banette[] = INCBIN_U32("graphics/pokemon/banette/back.4bpp.smol"); const u16 gMonShinyPalette_Banette[] = INCBIN_U16("graphics/pokemon/banette/shiny.gbapal"); #else - const u32 gMonFrontPic_Banette[] = INCBIN_U32("graphics/pokemon/banette/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Banette[] = INCBIN_U32("graphics/pokemon/banette/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Banette[] = INCBIN_U16("graphics/pokemon/banette/normal_gba.gbapal"); - const u32 gMonBackPic_Banette[] = INCBIN_U32("graphics/pokemon/banette/back_gba.4bpp.lz"); + const u32 gMonBackPic_Banette[] = INCBIN_U32("graphics/pokemon/banette/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Banette[] = INCBIN_U16("graphics/pokemon/banette/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12875,9 +12913,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_BanetteMega[] = INCBIN_U32("graphics/pokemon/banette/mega/front.4bpp.lz"); + const u32 gMonFrontPic_BanetteMega[] = INCBIN_U32("graphics/pokemon/banette/mega/front.4bpp.smol"); const u16 gMonPalette_BanetteMega[] = INCBIN_U16("graphics/pokemon/banette/mega/normal.gbapal"); - const u32 gMonBackPic_BanetteMega[] = INCBIN_U32("graphics/pokemon/banette/mega/back.4bpp.lz"); + const u32 gMonBackPic_BanetteMega[] = INCBIN_U32("graphics/pokemon/banette/mega/back.4bpp.smol"); const u16 gMonShinyPalette_BanetteMega[] = INCBIN_U16("graphics/pokemon/banette/mega/shiny.gbapal"); const u8 gMonIcon_BanetteMega[] = INCBIN_U8("graphics/pokemon/banette/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -12892,14 +12930,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_DUSKULL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/anim_front.4bpp.smol"); const u16 gMonPalette_Duskull[] = INCBIN_U16("graphics/pokemon/duskull/normal.gbapal"); - const u32 gMonBackPic_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/back.4bpp.lz"); + const u32 gMonBackPic_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/back.4bpp.smol"); const u16 gMonShinyPalette_Duskull[] = INCBIN_U16("graphics/pokemon/duskull/shiny.gbapal"); #else - const u32 gMonFrontPic_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Duskull[] = INCBIN_U16("graphics/pokemon/duskull/normal_gba.gbapal"); - const u32 gMonBackPic_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/back_gba.4bpp.lz"); + const u32 gMonBackPic_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Duskull[] = INCBIN_U16("graphics/pokemon/duskull/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12919,14 +12957,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/anim_front.4bpp.smol"); const u16 gMonPalette_Dusclops[] = INCBIN_U16("graphics/pokemon/dusclops/normal.gbapal"); - const u32 gMonBackPic_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/back.4bpp.lz"); + const u32 gMonBackPic_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/back.4bpp.smol"); const u16 gMonShinyPalette_Dusclops[] = INCBIN_U16("graphics/pokemon/dusclops/shiny.gbapal"); #else - const u32 gMonFrontPic_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Dusclops[] = INCBIN_U16("graphics/pokemon/dusclops/normal_gba.gbapal"); - const u32 gMonBackPic_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/back_gba.4bpp.lz"); + const u32 gMonBackPic_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Dusclops[] = INCBIN_U16("graphics/pokemon/dusclops/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12946,9 +12984,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Dusknoir[] = INCBIN_U32("graphics/pokemon/dusknoir/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dusknoir[] = INCBIN_U32("graphics/pokemon/dusknoir/anim_front.4bpp.smol"); const u16 gMonPalette_Dusknoir[] = INCBIN_U16("graphics/pokemon/dusknoir/normal.gbapal"); - const u32 gMonBackPic_Dusknoir[] = INCBIN_U32("graphics/pokemon/dusknoir/back.4bpp.lz"); + const u32 gMonBackPic_Dusknoir[] = INCBIN_U32("graphics/pokemon/dusknoir/back.4bpp.smol"); const u16 gMonShinyPalette_Dusknoir[] = INCBIN_U16("graphics/pokemon/dusknoir/shiny.gbapal"); const u8 gMonIcon_Dusknoir[] = INCBIN_U8("graphics/pokemon/dusknoir/icon.4bpp"); #if P_FOOTPRINTS @@ -12966,14 +13004,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TROPIUS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/anim_front.4bpp.smol"); const u16 gMonPalette_Tropius[] = INCBIN_U16("graphics/pokemon/tropius/normal.gbapal"); - const u32 gMonBackPic_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/back.4bpp.lz"); + const u32 gMonBackPic_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/back.4bpp.smol"); const u16 gMonShinyPalette_Tropius[] = INCBIN_U16("graphics/pokemon/tropius/shiny.gbapal"); #else - const u32 gMonFrontPic_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Tropius[] = INCBIN_U16("graphics/pokemon/tropius/normal_gba.gbapal"); - const u32 gMonBackPic_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/back_gba.4bpp.lz"); + const u32 gMonBackPic_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Tropius[] = INCBIN_U16("graphics/pokemon/tropius/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12995,9 +13033,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CHIMECHO #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Chingling[] = INCBIN_U32("graphics/pokemon/chingling/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Chingling[] = INCBIN_U32("graphics/pokemon/chingling/anim_front.4bpp.smol"); const u16 gMonPalette_Chingling[] = INCBIN_U16("graphics/pokemon/chingling/normal.gbapal"); - const u32 gMonBackPic_Chingling[] = INCBIN_U32("graphics/pokemon/chingling/back.4bpp.lz"); + const u32 gMonBackPic_Chingling[] = INCBIN_U32("graphics/pokemon/chingling/back.4bpp.smol"); const u16 gMonShinyPalette_Chingling[] = INCBIN_U16("graphics/pokemon/chingling/shiny.gbapal"); const u8 gMonIcon_Chingling[] = INCBIN_U8("graphics/pokemon/chingling/icon.4bpp"); #if P_FOOTPRINTS @@ -13013,14 +13051,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_4_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/anim_front.4bpp.smol"); const u16 gMonPalette_Chimecho[] = INCBIN_U16("graphics/pokemon/chimecho/normal.gbapal"); - const u32 gMonBackPic_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/back.4bpp.lz"); + const u32 gMonBackPic_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/back.4bpp.smol"); const u16 gMonShinyPalette_Chimecho[] = INCBIN_U16("graphics/pokemon/chimecho/shiny.gbapal"); #else - const u32 gMonFrontPic_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Chimecho[] = INCBIN_U16("graphics/pokemon/chimecho/normal_gba.gbapal"); - const u32 gMonBackPic_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/back_gba.4bpp.lz"); + const u32 gMonBackPic_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Chimecho[] = INCBIN_U16("graphics/pokemon/chimecho/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13042,14 +13080,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ABSOL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Absol[] = INCBIN_U32("graphics/pokemon/absol/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Absol[] = INCBIN_U32("graphics/pokemon/absol/anim_front.4bpp.smol"); const u16 gMonPalette_Absol[] = INCBIN_U16("graphics/pokemon/absol/normal.gbapal"); - const u32 gMonBackPic_Absol[] = INCBIN_U32("graphics/pokemon/absol/back.4bpp.lz"); + const u32 gMonBackPic_Absol[] = INCBIN_U32("graphics/pokemon/absol/back.4bpp.smol"); const u16 gMonShinyPalette_Absol[] = INCBIN_U16("graphics/pokemon/absol/shiny.gbapal"); #else - const u32 gMonFrontPic_Absol[] = INCBIN_U32("graphics/pokemon/absol/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Absol[] = INCBIN_U32("graphics/pokemon/absol/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Absol[] = INCBIN_U16("graphics/pokemon/absol/normal_gba.gbapal"); - const u32 gMonBackPic_Absol[] = INCBIN_U32("graphics/pokemon/absol/back_gba.4bpp.lz"); + const u32 gMonBackPic_Absol[] = INCBIN_U32("graphics/pokemon/absol/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Absol[] = INCBIN_U16("graphics/pokemon/absol/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13069,9 +13107,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_AbsolMega[] = INCBIN_U32("graphics/pokemon/absol/mega/front.4bpp.lz"); + const u32 gMonFrontPic_AbsolMega[] = INCBIN_U32("graphics/pokemon/absol/mega/front.4bpp.smol"); const u16 gMonPalette_AbsolMega[] = INCBIN_U16("graphics/pokemon/absol/mega/normal.gbapal"); - const u32 gMonBackPic_AbsolMega[] = INCBIN_U32("graphics/pokemon/absol/mega/back.4bpp.lz"); + const u32 gMonBackPic_AbsolMega[] = INCBIN_U32("graphics/pokemon/absol/mega/back.4bpp.smol"); const u16 gMonShinyPalette_AbsolMega[] = INCBIN_U16("graphics/pokemon/absol/mega/shiny.gbapal"); const u8 gMonIcon_AbsolMega[] = INCBIN_U8("graphics/pokemon/absol/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -13086,14 +13124,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SNORUNT #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/anim_front.4bpp.smol"); const u16 gMonPalette_Snorunt[] = INCBIN_U16("graphics/pokemon/snorunt/normal.gbapal"); - const u32 gMonBackPic_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/back.4bpp.lz"); + const u32 gMonBackPic_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/back.4bpp.smol"); const u16 gMonShinyPalette_Snorunt[] = INCBIN_U16("graphics/pokemon/snorunt/shiny.gbapal"); #else - const u32 gMonFrontPic_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Snorunt[] = INCBIN_U16("graphics/pokemon/snorunt/normal_gba.gbapal"); - const u32 gMonBackPic_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/back_gba.4bpp.lz"); + const u32 gMonBackPic_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Snorunt[] = INCBIN_U16("graphics/pokemon/snorunt/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13113,14 +13151,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/anim_front.4bpp.smol"); const u16 gMonPalette_Glalie[] = INCBIN_U16("graphics/pokemon/glalie/normal.gbapal"); - const u32 gMonBackPic_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/back.4bpp.lz"); + const u32 gMonBackPic_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/back.4bpp.smol"); const u16 gMonShinyPalette_Glalie[] = INCBIN_U16("graphics/pokemon/glalie/shiny.gbapal"); #else - const u32 gMonFrontPic_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Glalie[] = INCBIN_U16("graphics/pokemon/glalie/normal_gba.gbapal"); - const u32 gMonBackPic_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/back_gba.4bpp.lz"); + const u32 gMonBackPic_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Glalie[] = INCBIN_U16("graphics/pokemon/glalie/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13140,9 +13178,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_GlalieMega[] = INCBIN_U32("graphics/pokemon/glalie/mega/front.4bpp.lz"); + const u32 gMonFrontPic_GlalieMega[] = INCBIN_U32("graphics/pokemon/glalie/mega/front.4bpp.smol"); const u16 gMonPalette_GlalieMega[] = INCBIN_U16("graphics/pokemon/glalie/mega/normal.gbapal"); - const u32 gMonBackPic_GlalieMega[] = INCBIN_U32("graphics/pokemon/glalie/mega/back.4bpp.lz"); + const u32 gMonBackPic_GlalieMega[] = INCBIN_U32("graphics/pokemon/glalie/mega/back.4bpp.smol"); const u16 gMonShinyPalette_GlalieMega[] = INCBIN_U16("graphics/pokemon/glalie/mega/shiny.gbapal"); const u8 gMonIcon_GlalieMega[] = INCBIN_U8("graphics/pokemon/glalie/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -13155,9 +13193,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_MEGA_EVOLUTIONS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Froslass[] = INCBIN_U32("graphics/pokemon/froslass/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Froslass[] = INCBIN_U32("graphics/pokemon/froslass/anim_front.4bpp.smol"); const u16 gMonPalette_Froslass[] = INCBIN_U16("graphics/pokemon/froslass/normal.gbapal"); - const u32 gMonBackPic_Froslass[] = INCBIN_U32("graphics/pokemon/froslass/back.4bpp.lz"); + const u32 gMonBackPic_Froslass[] = INCBIN_U32("graphics/pokemon/froslass/back.4bpp.smol"); const u16 gMonShinyPalette_Froslass[] = INCBIN_U16("graphics/pokemon/froslass/shiny.gbapal"); const u8 gMonIcon_Froslass[] = INCBIN_U8("graphics/pokemon/froslass/icon.4bpp"); #if P_FOOTPRINTS @@ -13175,14 +13213,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SPHEAL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/anim_front.4bpp.smol"); const u16 gMonPalette_Spheal[] = INCBIN_U16("graphics/pokemon/spheal/normal.gbapal"); - const u32 gMonBackPic_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/back.4bpp.lz"); + const u32 gMonBackPic_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/back.4bpp.smol"); const u16 gMonShinyPalette_Spheal[] = INCBIN_U16("graphics/pokemon/spheal/shiny.gbapal"); #else - const u32 gMonFrontPic_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Spheal[] = INCBIN_U16("graphics/pokemon/spheal/normal_gba.gbapal"); - const u32 gMonBackPic_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/back_gba.4bpp.lz"); + const u32 gMonBackPic_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Spheal[] = INCBIN_U16("graphics/pokemon/spheal/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13202,14 +13240,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/anim_front.4bpp.smol"); const u16 gMonPalette_Sealeo[] = INCBIN_U16("graphics/pokemon/sealeo/normal.gbapal"); - const u32 gMonBackPic_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/back.4bpp.lz"); + const u32 gMonBackPic_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/back.4bpp.smol"); const u16 gMonShinyPalette_Sealeo[] = INCBIN_U16("graphics/pokemon/sealeo/shiny.gbapal"); #else - const u32 gMonFrontPic_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Sealeo[] = INCBIN_U16("graphics/pokemon/sealeo/normal_gba.gbapal"); - const u32 gMonBackPic_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/back_gba.4bpp.lz"); + const u32 gMonBackPic_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Sealeo[] = INCBIN_U16("graphics/pokemon/sealeo/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13229,14 +13267,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/anim_front.4bpp.smol"); const u16 gMonPalette_Walrein[] = INCBIN_U16("graphics/pokemon/walrein/normal.gbapal"); - const u32 gMonBackPic_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/back.4bpp.lz"); + const u32 gMonBackPic_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/back.4bpp.smol"); const u16 gMonShinyPalette_Walrein[] = INCBIN_U16("graphics/pokemon/walrein/shiny.gbapal"); #else - const u32 gMonFrontPic_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Walrein[] = INCBIN_U16("graphics/pokemon/walrein/normal_gba.gbapal"); - const u32 gMonBackPic_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/back_gba.4bpp.lz"); + const u32 gMonBackPic_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Walrein[] = INCBIN_U16("graphics/pokemon/walrein/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13258,14 +13296,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CLAMPERL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/anim_front.4bpp.smol"); const u16 gMonPalette_Clamperl[] = INCBIN_U16("graphics/pokemon/clamperl/normal.gbapal"); - const u32 gMonBackPic_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/back.4bpp.lz"); + const u32 gMonBackPic_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/back.4bpp.smol"); const u16 gMonShinyPalette_Clamperl[] = INCBIN_U16("graphics/pokemon/clamperl/shiny.gbapal"); #else - const u32 gMonFrontPic_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Clamperl[] = INCBIN_U16("graphics/pokemon/clamperl/normal_gba.gbapal"); - const u32 gMonBackPic_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/back_gba.4bpp.lz"); + const u32 gMonBackPic_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Clamperl[] = INCBIN_U16("graphics/pokemon/clamperl/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13285,14 +13323,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/anim_front.4bpp.smol"); const u16 gMonPalette_Huntail[] = INCBIN_U16("graphics/pokemon/huntail/normal.gbapal"); - const u32 gMonBackPic_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/back.4bpp.lz"); + const u32 gMonBackPic_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/back.4bpp.smol"); const u16 gMonShinyPalette_Huntail[] = INCBIN_U16("graphics/pokemon/huntail/shiny.gbapal"); #else - const u32 gMonFrontPic_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Huntail[] = INCBIN_U16("graphics/pokemon/huntail/normal_gba.gbapal"); - const u32 gMonBackPic_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/back_gba.4bpp.lz"); + const u32 gMonBackPic_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Huntail[] = INCBIN_U16("graphics/pokemon/huntail/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13312,14 +13350,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/anim_front.4bpp.smol"); const u16 gMonPalette_Gorebyss[] = INCBIN_U16("graphics/pokemon/gorebyss/normal.gbapal"); - const u32 gMonBackPic_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/back.4bpp.lz"); + const u32 gMonBackPic_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/back.4bpp.smol"); const u16 gMonShinyPalette_Gorebyss[] = INCBIN_U16("graphics/pokemon/gorebyss/shiny.gbapal"); #else - const u32 gMonFrontPic_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Gorebyss[] = INCBIN_U16("graphics/pokemon/gorebyss/normal_gba.gbapal"); - const u32 gMonBackPic_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/back_gba.4bpp.lz"); + const u32 gMonBackPic_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Gorebyss[] = INCBIN_U16("graphics/pokemon/gorebyss/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13341,14 +13379,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_RELICANTH #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/anim_front.4bpp.smol"); const u16 gMonPalette_Relicanth[] = INCBIN_U16("graphics/pokemon/relicanth/normal.gbapal"); - const u32 gMonBackPic_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/back.4bpp.lz"); + const u32 gMonBackPic_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/back.4bpp.smol"); const u16 gMonShinyPalette_Relicanth[] = INCBIN_U16("graphics/pokemon/relicanth/shiny.gbapal"); #else - const u32 gMonFrontPic_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Relicanth[] = INCBIN_U16("graphics/pokemon/relicanth/normal_gba.gbapal"); - const u32 gMonBackPic_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/back_gba.4bpp.lz"); + const u32 gMonBackPic_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Relicanth[] = INCBIN_U16("graphics/pokemon/relicanth/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13368,8 +13406,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_RelicanthF[] = INCBIN_U32("graphics/pokemon/relicanth/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_RelicanthF[] = INCBIN_U32("graphics/pokemon/relicanth/backf.4bpp.lz"); + const u32 gMonFrontPic_RelicanthF[] = INCBIN_U32("graphics/pokemon/relicanth/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_RelicanthF[] = INCBIN_U32("graphics/pokemon/relicanth/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_RelicanthF[] = INCBIN_COMP("graphics/pokemon/relicanth/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -13378,14 +13416,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_LUVDISC #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/anim_front.4bpp.smol"); const u16 gMonPalette_Luvdisc[] = INCBIN_U16("graphics/pokemon/luvdisc/normal.gbapal"); - const u32 gMonBackPic_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/back.4bpp.lz"); + const u32 gMonBackPic_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/back.4bpp.smol"); const u16 gMonShinyPalette_Luvdisc[] = INCBIN_U16("graphics/pokemon/luvdisc/shiny.gbapal"); #else - const u32 gMonFrontPic_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Luvdisc[] = INCBIN_U16("graphics/pokemon/luvdisc/normal_gba.gbapal"); - const u32 gMonBackPic_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/back_gba.4bpp.lz"); + const u32 gMonBackPic_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Luvdisc[] = INCBIN_U16("graphics/pokemon/luvdisc/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13407,14 +13445,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_BAGON #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/anim_front.4bpp.smol"); const u16 gMonPalette_Bagon[] = INCBIN_U16("graphics/pokemon/bagon/normal.gbapal"); - const u32 gMonBackPic_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/back.4bpp.lz"); + const u32 gMonBackPic_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/back.4bpp.smol"); const u16 gMonShinyPalette_Bagon[] = INCBIN_U16("graphics/pokemon/bagon/shiny.gbapal"); #else - const u32 gMonFrontPic_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Bagon[] = INCBIN_U16("graphics/pokemon/bagon/normal_gba.gbapal"); - const u32 gMonBackPic_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Bagon[] = INCBIN_U16("graphics/pokemon/bagon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13434,14 +13472,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/anim_front.4bpp.smol"); const u16 gMonPalette_Shelgon[] = INCBIN_U16("graphics/pokemon/shelgon/normal.gbapal"); - const u32 gMonBackPic_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/back.4bpp.lz"); + const u32 gMonBackPic_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/back.4bpp.smol"); const u16 gMonShinyPalette_Shelgon[] = INCBIN_U16("graphics/pokemon/shelgon/shiny.gbapal"); #else - const u32 gMonFrontPic_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Shelgon[] = INCBIN_U16("graphics/pokemon/shelgon/normal_gba.gbapal"); - const u32 gMonBackPic_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Shelgon[] = INCBIN_U16("graphics/pokemon/shelgon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13461,14 +13499,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/anim_front.4bpp.smol"); const u16 gMonPalette_Salamence[] = INCBIN_U16("graphics/pokemon/salamence/normal.gbapal"); - const u32 gMonBackPic_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/back.4bpp.lz"); + const u32 gMonBackPic_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/back.4bpp.smol"); const u16 gMonShinyPalette_Salamence[] = INCBIN_U16("graphics/pokemon/salamence/shiny.gbapal"); #else - const u32 gMonFrontPic_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Salamence[] = INCBIN_U16("graphics/pokemon/salamence/normal_gba.gbapal"); - const u32 gMonBackPic_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/back_gba.4bpp.lz"); + const u32 gMonBackPic_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Salamence[] = INCBIN_U16("graphics/pokemon/salamence/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13488,9 +13526,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_SalamenceMega[] = INCBIN_U32("graphics/pokemon/salamence/mega/front.4bpp.lz"); + const u32 gMonFrontPic_SalamenceMega[] = INCBIN_U32("graphics/pokemon/salamence/mega/front.4bpp.smol"); const u16 gMonPalette_SalamenceMega[] = INCBIN_U16("graphics/pokemon/salamence/mega/normal.gbapal"); - const u32 gMonBackPic_SalamenceMega[] = INCBIN_U32("graphics/pokemon/salamence/mega/back.4bpp.lz"); + const u32 gMonBackPic_SalamenceMega[] = INCBIN_U32("graphics/pokemon/salamence/mega/back.4bpp.smol"); const u16 gMonShinyPalette_SalamenceMega[] = INCBIN_U16("graphics/pokemon/salamence/mega/shiny.gbapal"); const u8 gMonIcon_SalamenceMega[] = INCBIN_U8("graphics/pokemon/salamence/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -13505,14 +13543,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_BELDUM #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/anim_front.4bpp.smol"); const u16 gMonPalette_Beldum[] = INCBIN_U16("graphics/pokemon/beldum/normal.gbapal"); - const u32 gMonBackPic_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/back.4bpp.lz"); + const u32 gMonBackPic_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/back.4bpp.smol"); const u16 gMonShinyPalette_Beldum[] = INCBIN_U16("graphics/pokemon/beldum/shiny.gbapal"); #else - const u32 gMonFrontPic_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Beldum[] = INCBIN_U16("graphics/pokemon/beldum/normal_gba.gbapal"); - const u32 gMonBackPic_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/back_gba.4bpp.lz"); + const u32 gMonBackPic_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Beldum[] = INCBIN_U16("graphics/pokemon/beldum/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13532,14 +13570,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Metang[] = INCBIN_U32("graphics/pokemon/metang/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Metang[] = INCBIN_U32("graphics/pokemon/metang/anim_front.4bpp.smol"); const u16 gMonPalette_Metang[] = INCBIN_U16("graphics/pokemon/metang/normal.gbapal"); - const u32 gMonBackPic_Metang[] = INCBIN_U32("graphics/pokemon/metang/back.4bpp.lz"); + const u32 gMonBackPic_Metang[] = INCBIN_U32("graphics/pokemon/metang/back.4bpp.smol"); const u16 gMonShinyPalette_Metang[] = INCBIN_U16("graphics/pokemon/metang/shiny.gbapal"); #else - const u32 gMonFrontPic_Metang[] = INCBIN_U32("graphics/pokemon/metang/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Metang[] = INCBIN_U32("graphics/pokemon/metang/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Metang[] = INCBIN_U16("graphics/pokemon/metang/normal_gba.gbapal"); - const u32 gMonBackPic_Metang[] = INCBIN_U32("graphics/pokemon/metang/back_gba.4bpp.lz"); + const u32 gMonBackPic_Metang[] = INCBIN_U32("graphics/pokemon/metang/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Metang[] = INCBIN_U16("graphics/pokemon/metang/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13559,14 +13597,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/anim_front.4bpp.smol"); const u16 gMonPalette_Metagross[] = INCBIN_U16("graphics/pokemon/metagross/normal.gbapal"); - const u32 gMonBackPic_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/back.4bpp.lz"); + const u32 gMonBackPic_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/back.4bpp.smol"); const u16 gMonShinyPalette_Metagross[] = INCBIN_U16("graphics/pokemon/metagross/shiny.gbapal"); #else - const u32 gMonFrontPic_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Metagross[] = INCBIN_U16("graphics/pokemon/metagross/normal_gba.gbapal"); - const u32 gMonBackPic_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/back_gba.4bpp.lz"); + const u32 gMonBackPic_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Metagross[] = INCBIN_U16("graphics/pokemon/metagross/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13586,9 +13624,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_MetagrossMega[] = INCBIN_U32("graphics/pokemon/metagross/mega/front.4bpp.lz"); + const u32 gMonFrontPic_MetagrossMega[] = INCBIN_U32("graphics/pokemon/metagross/mega/front.4bpp.smol"); const u16 gMonPalette_MetagrossMega[] = INCBIN_U16("graphics/pokemon/metagross/mega/normal.gbapal"); - const u32 gMonBackPic_MetagrossMega[] = INCBIN_U32("graphics/pokemon/metagross/mega/back.4bpp.lz"); + const u32 gMonBackPic_MetagrossMega[] = INCBIN_U32("graphics/pokemon/metagross/mega/back.4bpp.smol"); const u16 gMonShinyPalette_MetagrossMega[] = INCBIN_U16("graphics/pokemon/metagross/mega/shiny.gbapal"); const u8 gMonIcon_MetagrossMega[] = INCBIN_U8("graphics/pokemon/metagross/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -13603,14 +13641,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_REGIROCK #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/anim_front.4bpp.smol"); const u16 gMonPalette_Regirock[] = INCBIN_U16("graphics/pokemon/regirock/normal.gbapal"); - const u32 gMonBackPic_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/back.4bpp.lz"); + const u32 gMonBackPic_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/back.4bpp.smol"); const u16 gMonShinyPalette_Regirock[] = INCBIN_U16("graphics/pokemon/regirock/shiny.gbapal"); #else - const u32 gMonFrontPic_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Regirock[] = INCBIN_U16("graphics/pokemon/regirock/normal_gba.gbapal"); - const u32 gMonBackPic_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/back_gba.4bpp.lz"); + const u32 gMonBackPic_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Regirock[] = INCBIN_U16("graphics/pokemon/regirock/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13632,14 +13670,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_REGICE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Regice[] = INCBIN_U32("graphics/pokemon/regice/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Regice[] = INCBIN_U32("graphics/pokemon/regice/anim_front.4bpp.smol"); const u16 gMonPalette_Regice[] = INCBIN_U16("graphics/pokemon/regice/normal.gbapal"); - const u32 gMonBackPic_Regice[] = INCBIN_U32("graphics/pokemon/regice/back.4bpp.lz"); + const u32 gMonBackPic_Regice[] = INCBIN_U32("graphics/pokemon/regice/back.4bpp.smol"); const u16 gMonShinyPalette_Regice[] = INCBIN_U16("graphics/pokemon/regice/shiny.gbapal"); #else - const u32 gMonFrontPic_Regice[] = INCBIN_U32("graphics/pokemon/regice/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Regice[] = INCBIN_U32("graphics/pokemon/regice/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Regice[] = INCBIN_U16("graphics/pokemon/regice/normal_gba.gbapal"); - const u32 gMonBackPic_Regice[] = INCBIN_U32("graphics/pokemon/regice/back_gba.4bpp.lz"); + const u32 gMonBackPic_Regice[] = INCBIN_U32("graphics/pokemon/regice/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Regice[] = INCBIN_U16("graphics/pokemon/regice/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13661,14 +13699,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_REGISTEEL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/anim_front.4bpp.smol"); const u16 gMonPalette_Registeel[] = INCBIN_U16("graphics/pokemon/registeel/normal.gbapal"); - const u32 gMonBackPic_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/back.4bpp.lz"); + const u32 gMonBackPic_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/back.4bpp.smol"); const u16 gMonShinyPalette_Registeel[] = INCBIN_U16("graphics/pokemon/registeel/shiny.gbapal"); #else - const u32 gMonFrontPic_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Registeel[] = INCBIN_U16("graphics/pokemon/registeel/normal_gba.gbapal"); - const u32 gMonBackPic_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/back_gba.4bpp.lz"); + const u32 gMonBackPic_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Registeel[] = INCBIN_U16("graphics/pokemon/registeel/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13690,14 +13728,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_LATIAS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Latias[] = INCBIN_U32("graphics/pokemon/latias/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Latias[] = INCBIN_U32("graphics/pokemon/latias/anim_front.4bpp.smol"); const u16 gMonPalette_Latias[] = INCBIN_U16("graphics/pokemon/latias/normal.gbapal"); - const u32 gMonBackPic_Latias[] = INCBIN_U32("graphics/pokemon/latias/back.4bpp.lz"); + const u32 gMonBackPic_Latias[] = INCBIN_U32("graphics/pokemon/latias/back.4bpp.smol"); const u16 gMonShinyPalette_Latias[] = INCBIN_U16("graphics/pokemon/latias/shiny.gbapal"); #else - const u32 gMonFrontPic_Latias[] = INCBIN_U32("graphics/pokemon/latias/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Latias[] = INCBIN_U32("graphics/pokemon/latias/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Latias[] = INCBIN_U16("graphics/pokemon/latias/normal_gba.gbapal"); - const u32 gMonBackPic_Latias[] = INCBIN_U32("graphics/pokemon/latias/back_gba.4bpp.lz"); + const u32 gMonBackPic_Latias[] = INCBIN_U32("graphics/pokemon/latias/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Latias[] = INCBIN_U16("graphics/pokemon/latias/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13717,9 +13755,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_LatiasMega[] = INCBIN_U32("graphics/pokemon/latias/mega/front.4bpp.lz"); + const u32 gMonFrontPic_LatiasMega[] = INCBIN_U32("graphics/pokemon/latias/mega/front.4bpp.smol"); const u16 gMonPalette_LatiasMega[] = INCBIN_U16("graphics/pokemon/latias/mega/normal.gbapal"); - const u32 gMonBackPic_LatiasMega[] = INCBIN_U32("graphics/pokemon/latias/mega/back.4bpp.lz"); + const u32 gMonBackPic_LatiasMega[] = INCBIN_U32("graphics/pokemon/latias/mega/back.4bpp.smol"); const u16 gMonShinyPalette_LatiasMega[] = INCBIN_U16("graphics/pokemon/latias/mega/shiny.gbapal"); const u8 gMonIcon_LatiasMega[] = INCBIN_U8("graphics/pokemon/latias/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -13734,14 +13772,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_LATIOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Latios[] = INCBIN_U32("graphics/pokemon/latios/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Latios[] = INCBIN_U32("graphics/pokemon/latios/anim_front.4bpp.smol"); const u16 gMonPalette_Latios[] = INCBIN_U16("graphics/pokemon/latios/normal.gbapal"); - const u32 gMonBackPic_Latios[] = INCBIN_U32("graphics/pokemon/latios/back.4bpp.lz"); + const u32 gMonBackPic_Latios[] = INCBIN_U32("graphics/pokemon/latios/back.4bpp.smol"); const u16 gMonShinyPalette_Latios[] = INCBIN_U16("graphics/pokemon/latios/shiny.gbapal"); #else - const u32 gMonFrontPic_Latios[] = INCBIN_U32("graphics/pokemon/latios/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Latios[] = INCBIN_U32("graphics/pokemon/latios/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Latios[] = INCBIN_U16("graphics/pokemon/latios/normal_gba.gbapal"); - const u32 gMonBackPic_Latios[] = INCBIN_U32("graphics/pokemon/latios/back_gba.4bpp.lz"); + const u32 gMonBackPic_Latios[] = INCBIN_U32("graphics/pokemon/latios/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Latios[] = INCBIN_U16("graphics/pokemon/latios/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13761,9 +13799,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_LatiosMega[] = INCBIN_U32("graphics/pokemon/latios/mega/front.4bpp.lz"); + const u32 gMonFrontPic_LatiosMega[] = INCBIN_U32("graphics/pokemon/latios/mega/front.4bpp.smol"); const u16 gMonPalette_LatiosMega[] = INCBIN_U16("graphics/pokemon/latios/mega/normal.gbapal"); - const u32 gMonBackPic_LatiosMega[] = INCBIN_U32("graphics/pokemon/latios/mega/back.4bpp.lz"); + const u32 gMonBackPic_LatiosMega[] = INCBIN_U32("graphics/pokemon/latios/mega/back.4bpp.smol"); const u16 gMonShinyPalette_LatiosMega[] = INCBIN_U16("graphics/pokemon/latios/mega/shiny.gbapal"); const u8 gMonIcon_LatiosMega[] = INCBIN_U8("graphics/pokemon/latios/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -13778,14 +13816,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_KYOGRE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/anim_front.4bpp.smol"); const u16 gMonPalette_Kyogre[] = INCBIN_U16("graphics/pokemon/kyogre/normal.gbapal"); - const u32 gMonBackPic_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/back.4bpp.lz"); + const u32 gMonBackPic_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/back.4bpp.smol"); const u16 gMonShinyPalette_Kyogre[] = INCBIN_U16("graphics/pokemon/kyogre/shiny.gbapal"); #else - const u32 gMonFrontPic_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Kyogre[] = INCBIN_U16("graphics/pokemon/kyogre/normal_gba.gbapal"); - const u32 gMonBackPic_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/back_gba.4bpp.lz"); + const u32 gMonBackPic_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Kyogre[] = INCBIN_U16("graphics/pokemon/kyogre/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13805,9 +13843,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_PRIMAL_REVERSIONS - const u32 gMonFrontPic_KyogrePrimal[] = INCBIN_U32("graphics/pokemon/kyogre/primal/front.4bpp.lz"); + const u32 gMonFrontPic_KyogrePrimal[] = INCBIN_U32("graphics/pokemon/kyogre/primal/front.4bpp.smol"); const u16 gMonPalette_KyogrePrimal[] = INCBIN_U16("graphics/pokemon/kyogre/primal/normal.gbapal"); - const u32 gMonBackPic_KyogrePrimal[] = INCBIN_U32("graphics/pokemon/kyogre/primal/back.4bpp.lz"); + const u32 gMonBackPic_KyogrePrimal[] = INCBIN_U32("graphics/pokemon/kyogre/primal/back.4bpp.smol"); const u16 gMonShinyPalette_KyogrePrimal[] = INCBIN_U16("graphics/pokemon/kyogre/primal/shiny.gbapal"); const u8 gMonIcon_KyogrePrimal[] = INCBIN_U8("graphics/pokemon/kyogre/primal/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -13822,14 +13860,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_GROUDON #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/anim_front.4bpp.smol"); const u16 gMonPalette_Groudon[] = INCBIN_U16("graphics/pokemon/groudon/normal.gbapal"); - const u32 gMonBackPic_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/back.4bpp.lz"); + const u32 gMonBackPic_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/back.4bpp.smol"); const u16 gMonShinyPalette_Groudon[] = INCBIN_U16("graphics/pokemon/groudon/shiny.gbapal"); #else - const u32 gMonFrontPic_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Groudon[] = INCBIN_U16("graphics/pokemon/groudon/normal_gba.gbapal"); - const u32 gMonBackPic_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Groudon[] = INCBIN_U16("graphics/pokemon/groudon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13849,9 +13887,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_PRIMAL_REVERSIONS - const u32 gMonFrontPic_GroudonPrimal[] = INCBIN_U32("graphics/pokemon/groudon/primal/front.4bpp.lz"); + const u32 gMonFrontPic_GroudonPrimal[] = INCBIN_U32("graphics/pokemon/groudon/primal/front.4bpp.smol"); const u16 gMonPalette_GroudonPrimal[] = INCBIN_U16("graphics/pokemon/groudon/primal/normal.gbapal"); - const u32 gMonBackPic_GroudonPrimal[] = INCBIN_U32("graphics/pokemon/groudon/primal/back.4bpp.lz"); + const u32 gMonBackPic_GroudonPrimal[] = INCBIN_U32("graphics/pokemon/groudon/primal/back.4bpp.smol"); const u16 gMonShinyPalette_GroudonPrimal[] = INCBIN_U16("graphics/pokemon/groudon/primal/shiny.gbapal"); const u8 gMonIcon_GroudonPrimal[] = INCBIN_U8("graphics/pokemon/groudon/primal/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -13866,14 +13904,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_RAYQUAZA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/anim_front.4bpp.smol"); const u16 gMonPalette_Rayquaza[] = INCBIN_U16("graphics/pokemon/rayquaza/normal.gbapal"); - const u32 gMonBackPic_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/back.4bpp.lz"); + const u32 gMonBackPic_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/back.4bpp.smol"); const u16 gMonShinyPalette_Rayquaza[] = INCBIN_U16("graphics/pokemon/rayquaza/shiny.gbapal"); #else - const u32 gMonFrontPic_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Rayquaza[] = INCBIN_U16("graphics/pokemon/rayquaza/normal_gba.gbapal"); - const u32 gMonBackPic_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/back_gba.4bpp.lz"); + const u32 gMonBackPic_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Rayquaza[] = INCBIN_U16("graphics/pokemon/rayquaza/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13893,9 +13931,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_RayquazaMega[] = INCBIN_U32("graphics/pokemon/rayquaza/mega/front.4bpp.lz"); + const u32 gMonFrontPic_RayquazaMega[] = INCBIN_U32("graphics/pokemon/rayquaza/mega/front.4bpp.smol"); const u16 gMonPalette_RayquazaMega[] = INCBIN_U16("graphics/pokemon/rayquaza/mega/normal.gbapal"); - const u32 gMonBackPic_RayquazaMega[] = INCBIN_U32("graphics/pokemon/rayquaza/mega/back.4bpp.lz"); + const u32 gMonBackPic_RayquazaMega[] = INCBIN_U32("graphics/pokemon/rayquaza/mega/back.4bpp.smol"); const u16 gMonShinyPalette_RayquazaMega[] = INCBIN_U16("graphics/pokemon/rayquaza/mega/shiny.gbapal"); const u8 gMonIcon_RayquazaMega[] = INCBIN_U8("graphics/pokemon/rayquaza/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -13910,14 +13948,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_JIRACHI #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/anim_front.4bpp.smol"); const u16 gMonPalette_Jirachi[] = INCBIN_U16("graphics/pokemon/jirachi/normal.gbapal"); - const u32 gMonBackPic_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/back.4bpp.lz"); + const u32 gMonBackPic_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/back.4bpp.smol"); const u16 gMonShinyPalette_Jirachi[] = INCBIN_U16("graphics/pokemon/jirachi/shiny.gbapal"); #else - const u32 gMonFrontPic_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Jirachi[] = INCBIN_U16("graphics/pokemon/jirachi/normal_gba.gbapal"); - const u32 gMonBackPic_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/back_gba.4bpp.lz"); + const u32 gMonBackPic_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Jirachi[] = INCBIN_U16("graphics/pokemon/jirachi/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13939,15 +13977,45 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_DEOXYS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_DeoxysNormal[] = INCBIN_U32("graphics/pokemon/deoxys/anim_front.4bpp.lz"); + const u32 gMonFrontPic_DeoxysNormal[] = INCBIN_U32("graphics/pokemon/deoxys/anim_front.4bpp.smol"); const u16 gMonPalette_DeoxysNormal[] = INCBIN_U16("graphics/pokemon/deoxys/normal.gbapal"); - const u32 gMonBackPic_DeoxysNormal[] = INCBIN_U32("graphics/pokemon/deoxys/back.4bpp.lz"); + const u32 gMonBackPic_DeoxysNormal[] = INCBIN_U32("graphics/pokemon/deoxys/back.4bpp.smol"); const u16 gMonShinyPalette_DeoxysNormal[] = INCBIN_U16("graphics/pokemon/deoxys/shiny.gbapal"); + + const u32 gMonFrontPic_DeoxysAttack[] = INCBIN_U32("graphics/pokemon/deoxys/attack/anim_front.4bpp.smol"); + const u16 gMonPalette_DeoxysAttack[] = INCBIN_U16("graphics/pokemon/deoxys/attack/normal.gbapal"); + const u32 gMonBackPic_DeoxysAttack[] = INCBIN_U32("graphics/pokemon/deoxys/attack/back.4bpp.smol"); + const u16 gMonShinyPalette_DeoxysAttack[] = INCBIN_U16("graphics/pokemon/deoxys/attack/shiny.gbapal"); + + const u32 gMonFrontPic_DeoxysDefense[] = INCBIN_U32("graphics/pokemon/deoxys/defense/anim_front.4bpp.smol"); + const u16 gMonPalette_DeoxysDefense[] = INCBIN_U16("graphics/pokemon/deoxys/defense/normal.gbapal"); + const u32 gMonBackPic_DeoxysDefense[] = INCBIN_U32("graphics/pokemon/deoxys/defense/back.4bpp.smol"); + const u16 gMonShinyPalette_DeoxysDefense[] = INCBIN_U16("graphics/pokemon/deoxys/defense/shiny.gbapal"); + + const u32 gMonFrontPic_DeoxysSpeed[] = INCBIN_U32("graphics/pokemon/deoxys/speed/anim_front.4bpp.smol"); + const u16 gMonPalette_DeoxysSpeed[] = INCBIN_U16("graphics/pokemon/deoxys/speed/normal.gbapal"); + const u32 gMonBackPic_DeoxysSpeed[] = INCBIN_U32("graphics/pokemon/deoxys/speed/back.4bpp.smol"); + const u16 gMonShinyPalette_DeoxysSpeed[] = INCBIN_U16("graphics/pokemon/deoxys/speed/shiny.gbapal"); #else - const u32 gMonFrontPic_DeoxysNormal[] = INCBIN_U32("graphics/pokemon/deoxys/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_DeoxysNormal[] = INCBIN_U32("graphics/pokemon/deoxys/anim_front_gba.4bpp.smol"); const u16 gMonPalette_DeoxysNormal[] = INCBIN_U16("graphics/pokemon/deoxys/normal_gba.gbapal"); - const u32 gMonBackPic_DeoxysNormal[] = INCBIN_U32("graphics/pokemon/deoxys/back_gba.4bpp.lz"); + const u32 gMonBackPic_DeoxysNormal[] = INCBIN_U32("graphics/pokemon/deoxys/back_gba.4bpp.smol"); const u16 gMonShinyPalette_DeoxysNormal[] = INCBIN_U16("graphics/pokemon/deoxys/shiny_gba.gbapal"); + + const u32 gMonFrontPic_DeoxysAttack[] = INCBIN_U32("graphics/pokemon/deoxys/attack/front_gba.4bpp.smol"); + const u16 gMonPalette_DeoxysAttack[] = INCBIN_U16("graphics/pokemon/deoxys/attack/normal_gba.gbapal"); + const u32 gMonBackPic_DeoxysAttack[] = INCBIN_U32("graphics/pokemon/deoxys/attack/back_gba.4bpp.smol"); + const u16 gMonShinyPalette_DeoxysAttack[] = INCBIN_U16("graphics/pokemon/deoxys/attack/shiny_gba.gbapal"); + + const u32 gMonFrontPic_DeoxysDefense[] = INCBIN_U32("graphics/pokemon/deoxys/defense/front_gba.4bpp.smol"); + const u16 gMonPalette_DeoxysDefense[] = INCBIN_U16("graphics/pokemon/deoxys/defense/normal_gba.gbapal"); + const u32 gMonBackPic_DeoxysDefense[] = INCBIN_U32("graphics/pokemon/deoxys/defense/back_gba.4bpp.smol"); + const u16 gMonShinyPalette_DeoxysDefense[] = INCBIN_U16("graphics/pokemon/deoxys/defense/shiny_gba.gbapal"); + + const u32 gMonFrontPic_DeoxysSpeed[] = INCBIN_U32("graphics/pokemon/deoxys/speed/front_gba.4bpp.smol"); + const u16 gMonPalette_DeoxysSpeed[] = INCBIN_U16("graphics/pokemon/deoxys/speed/normal_gba.gbapal"); + const u32 gMonBackPic_DeoxysSpeed[] = INCBIN_U32("graphics/pokemon/deoxys/speed/back_gba.4bpp.smol"); + const u16 gMonShinyPalette_DeoxysSpeed[] = INCBIN_U16("graphics/pokemon/deoxys/speed/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS const u8 gMonIcon_DeoxysNormal[] = INCBIN_U8("graphics/pokemon/deoxys/icon.4bpp"); @@ -13958,22 +14026,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u8 gMonFootprint_Deoxys[] = INCBIN_U8("graphics/pokemon/deoxys/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_DeoxysAttack[] = INCBIN_U32("graphics/pokemon/deoxys/attack/anim_front.4bpp.lz"); - const u16 gMonPalette_DeoxysAttack[] = INCBIN_U16("graphics/pokemon/deoxys/attack/normal.gbapal"); - const u32 gMonBackPic_DeoxysAttack[] = INCBIN_U32("graphics/pokemon/deoxys/attack/back.4bpp.lz"); - const u16 gMonShinyPalette_DeoxysAttack[] = INCBIN_U16("graphics/pokemon/deoxys/attack/shiny.gbapal"); const u8 gMonIcon_DeoxysAttack[] = INCBIN_U8("graphics/pokemon/deoxys/attack/icon.4bpp"); - - const u32 gMonFrontPic_DeoxysDefense[] = INCBIN_U32("graphics/pokemon/deoxys/defense/anim_front.4bpp.lz"); - const u16 gMonPalette_DeoxysDefense[] = INCBIN_U16("graphics/pokemon/deoxys/defense/normal.gbapal"); - const u32 gMonBackPic_DeoxysDefense[] = INCBIN_U32("graphics/pokemon/deoxys/defense/back.4bpp.lz"); - const u16 gMonShinyPalette_DeoxysDefense[] = INCBIN_U16("graphics/pokemon/deoxys/defense/shiny.gbapal"); const u8 gMonIcon_DeoxysDefense[] = INCBIN_U8("graphics/pokemon/deoxys/defense/icon.4bpp"); - - const u32 gMonFrontPic_DeoxysSpeed[] = INCBIN_U32("graphics/pokemon/deoxys/speed/anim_front.4bpp.lz"); - const u16 gMonPalette_DeoxysSpeed[] = INCBIN_U16("graphics/pokemon/deoxys/speed/normal.gbapal"); - const u32 gMonBackPic_DeoxysSpeed[] = INCBIN_U32("graphics/pokemon/deoxys/speed/back.4bpp.lz"); - const u16 gMonShinyPalette_DeoxysSpeed[] = INCBIN_U16("graphics/pokemon/deoxys/speed/shiny.gbapal"); const u8 gMonIcon_DeoxysSpeed[] = INCBIN_U8("graphics/pokemon/deoxys/speed/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -13995,9 +14049,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DEOXYS #if P_FAMILY_TURTWIG - const u32 gMonFrontPic_Turtwig[] = INCBIN_U32("graphics/pokemon/turtwig/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Turtwig[] = INCBIN_U32("graphics/pokemon/turtwig/anim_front.4bpp.smol"); const u16 gMonPalette_Turtwig[] = INCBIN_U16("graphics/pokemon/turtwig/normal.gbapal"); - const u32 gMonBackPic_Turtwig[] = INCBIN_U32("graphics/pokemon/turtwig/back.4bpp.lz"); + const u32 gMonBackPic_Turtwig[] = INCBIN_U32("graphics/pokemon/turtwig/back.4bpp.smol"); const u16 gMonShinyPalette_Turtwig[] = INCBIN_U16("graphics/pokemon/turtwig/shiny.gbapal"); const u8 gMonIcon_Turtwig[] = INCBIN_U8("graphics/pokemon/turtwig/icon.4bpp"); #if P_FOOTPRINTS @@ -14011,9 +14065,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Grotle[] = INCBIN_U32("graphics/pokemon/grotle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Grotle[] = INCBIN_U32("graphics/pokemon/grotle/anim_front.4bpp.smol"); const u16 gMonPalette_Grotle[] = INCBIN_U16("graphics/pokemon/grotle/normal.gbapal"); - const u32 gMonBackPic_Grotle[] = INCBIN_U32("graphics/pokemon/grotle/back.4bpp.lz"); + const u32 gMonBackPic_Grotle[] = INCBIN_U32("graphics/pokemon/grotle/back.4bpp.smol"); const u16 gMonShinyPalette_Grotle[] = INCBIN_U16("graphics/pokemon/grotle/shiny.gbapal"); const u8 gMonIcon_Grotle[] = INCBIN_U8("graphics/pokemon/grotle/icon.4bpp"); #if P_FOOTPRINTS @@ -14027,9 +14081,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Torterra[] = INCBIN_U32("graphics/pokemon/torterra/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Torterra[] = INCBIN_U32("graphics/pokemon/torterra/anim_front.4bpp.smol"); const u16 gMonPalette_Torterra[] = INCBIN_U16("graphics/pokemon/torterra/normal.gbapal"); - const u32 gMonBackPic_Torterra[] = INCBIN_U32("graphics/pokemon/torterra/back.4bpp.lz"); + const u32 gMonBackPic_Torterra[] = INCBIN_U32("graphics/pokemon/torterra/back.4bpp.smol"); const u16 gMonShinyPalette_Torterra[] = INCBIN_U16("graphics/pokemon/torterra/shiny.gbapal"); const u8 gMonIcon_Torterra[] = INCBIN_U8("graphics/pokemon/torterra/icon.4bpp"); #if P_FOOTPRINTS @@ -14045,9 +14099,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TURTWIG #if P_FAMILY_CHIMCHAR - const u32 gMonFrontPic_Chimchar[] = INCBIN_U32("graphics/pokemon/chimchar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Chimchar[] = INCBIN_U32("graphics/pokemon/chimchar/anim_front.4bpp.smol"); const u16 gMonPalette_Chimchar[] = INCBIN_U16("graphics/pokemon/chimchar/normal.gbapal"); - const u32 gMonBackPic_Chimchar[] = INCBIN_U32("graphics/pokemon/chimchar/back.4bpp.lz"); + const u32 gMonBackPic_Chimchar[] = INCBIN_U32("graphics/pokemon/chimchar/back.4bpp.smol"); const u16 gMonShinyPalette_Chimchar[] = INCBIN_U16("graphics/pokemon/chimchar/shiny.gbapal"); const u8 gMonIcon_Chimchar[] = INCBIN_U8("graphics/pokemon/chimchar/icon.4bpp"); #if P_FOOTPRINTS @@ -14061,9 +14115,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Monferno[] = INCBIN_U32("graphics/pokemon/monferno/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Monferno[] = INCBIN_U32("graphics/pokemon/monferno/anim_front.4bpp.smol"); const u16 gMonPalette_Monferno[] = INCBIN_U16("graphics/pokemon/monferno/normal.gbapal"); - const u32 gMonBackPic_Monferno[] = INCBIN_U32("graphics/pokemon/monferno/back.4bpp.lz"); + const u32 gMonBackPic_Monferno[] = INCBIN_U32("graphics/pokemon/monferno/back.4bpp.smol"); const u16 gMonShinyPalette_Monferno[] = INCBIN_U16("graphics/pokemon/monferno/shiny.gbapal"); const u8 gMonIcon_Monferno[] = INCBIN_U8("graphics/pokemon/monferno/icon.4bpp"); #if P_FOOTPRINTS @@ -14077,9 +14131,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Infernape[] = INCBIN_U32("graphics/pokemon/infernape/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Infernape[] = INCBIN_U32("graphics/pokemon/infernape/anim_front.4bpp.smol"); const u16 gMonPalette_Infernape[] = INCBIN_U16("graphics/pokemon/infernape/normal.gbapal"); - const u32 gMonBackPic_Infernape[] = INCBIN_U32("graphics/pokemon/infernape/back.4bpp.lz"); + const u32 gMonBackPic_Infernape[] = INCBIN_U32("graphics/pokemon/infernape/back.4bpp.smol"); const u16 gMonShinyPalette_Infernape[] = INCBIN_U16("graphics/pokemon/infernape/shiny.gbapal"); const u8 gMonIcon_Infernape[] = INCBIN_U8("graphics/pokemon/infernape/icon.4bpp"); #if P_FOOTPRINTS @@ -14095,9 +14149,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CHIMCHAR #if P_FAMILY_PIPLUP - const u32 gMonFrontPic_Piplup[] = INCBIN_U32("graphics/pokemon/piplup/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Piplup[] = INCBIN_U32("graphics/pokemon/piplup/anim_front.4bpp.smol"); const u16 gMonPalette_Piplup[] = INCBIN_U16("graphics/pokemon/piplup/normal.gbapal"); - const u32 gMonBackPic_Piplup[] = INCBIN_U32("graphics/pokemon/piplup/back.4bpp.lz"); + const u32 gMonBackPic_Piplup[] = INCBIN_U32("graphics/pokemon/piplup/back.4bpp.smol"); const u16 gMonShinyPalette_Piplup[] = INCBIN_U16("graphics/pokemon/piplup/shiny.gbapal"); const u8 gMonIcon_Piplup[] = INCBIN_U8("graphics/pokemon/piplup/icon.4bpp"); #if P_FOOTPRINTS @@ -14111,9 +14165,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Prinplup[] = INCBIN_U32("graphics/pokemon/prinplup/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Prinplup[] = INCBIN_U32("graphics/pokemon/prinplup/anim_front.4bpp.smol"); const u16 gMonPalette_Prinplup[] = INCBIN_U16("graphics/pokemon/prinplup/normal.gbapal"); - const u32 gMonBackPic_Prinplup[] = INCBIN_U32("graphics/pokemon/prinplup/back.4bpp.lz"); + const u32 gMonBackPic_Prinplup[] = INCBIN_U32("graphics/pokemon/prinplup/back.4bpp.smol"); const u16 gMonShinyPalette_Prinplup[] = INCBIN_U16("graphics/pokemon/prinplup/shiny.gbapal"); const u8 gMonIcon_Prinplup[] = INCBIN_U8("graphics/pokemon/prinplup/icon.4bpp"); #if P_FOOTPRINTS @@ -14127,9 +14181,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Empoleon[] = INCBIN_U32("graphics/pokemon/empoleon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Empoleon[] = INCBIN_U32("graphics/pokemon/empoleon/anim_front.4bpp.smol"); const u16 gMonPalette_Empoleon[] = INCBIN_U16("graphics/pokemon/empoleon/normal.gbapal"); - const u32 gMonBackPic_Empoleon[] = INCBIN_U32("graphics/pokemon/empoleon/back.4bpp.lz"); + const u32 gMonBackPic_Empoleon[] = INCBIN_U32("graphics/pokemon/empoleon/back.4bpp.smol"); const u16 gMonShinyPalette_Empoleon[] = INCBIN_U16("graphics/pokemon/empoleon/shiny.gbapal"); const u8 gMonIcon_Empoleon[] = INCBIN_U8("graphics/pokemon/empoleon/icon.4bpp"); #if P_FOOTPRINTS @@ -14145,9 +14199,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PIPLUP #if P_FAMILY_STARLY - const u32 gMonFrontPic_Starly[] = INCBIN_U32("graphics/pokemon/starly/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Starly[] = INCBIN_U32("graphics/pokemon/starly/anim_front.4bpp.smol"); const u16 gMonPalette_Starly[] = INCBIN_U16("graphics/pokemon/starly/normal.gbapal"); - const u32 gMonBackPic_Starly[] = INCBIN_U32("graphics/pokemon/starly/back.4bpp.lz"); + const u32 gMonBackPic_Starly[] = INCBIN_U32("graphics/pokemon/starly/back.4bpp.smol"); const u16 gMonShinyPalette_Starly[] = INCBIN_U16("graphics/pokemon/starly/shiny.gbapal"); const u8 gMonIcon_Starly[] = INCBIN_U8("graphics/pokemon/starly/icon.4bpp"); #if P_FOOTPRINTS @@ -14162,16 +14216,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_StarlyF[] = INCBIN_U32("graphics/pokemon/starly/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_StarlyF[] = INCBIN_U32("graphics/pokemon/starly/backf.4bpp.lz"); + const u32 gMonFrontPic_StarlyF[] = INCBIN_U32("graphics/pokemon/starly/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_StarlyF[] = INCBIN_U32("graphics/pokemon/starly/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_StarlyF[] = INCBIN_COMP("graphics/pokemon/starly/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Staravia[] = INCBIN_U32("graphics/pokemon/staravia/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Staravia[] = INCBIN_U32("graphics/pokemon/staravia/anim_front.4bpp.smol"); const u16 gMonPalette_Staravia[] = INCBIN_U16("graphics/pokemon/staravia/normal.gbapal"); - const u32 gMonBackPic_Staravia[] = INCBIN_U32("graphics/pokemon/staravia/back.4bpp.lz"); + const u32 gMonBackPic_Staravia[] = INCBIN_U32("graphics/pokemon/staravia/back.4bpp.smol"); const u16 gMonShinyPalette_Staravia[] = INCBIN_U16("graphics/pokemon/staravia/shiny.gbapal"); const u8 gMonIcon_Staravia[] = INCBIN_U8("graphics/pokemon/staravia/icon.4bpp"); #if P_FOOTPRINTS @@ -14186,16 +14240,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_StaraviaF[] = INCBIN_U32("graphics/pokemon/staravia/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_StaraviaF[] = INCBIN_U32("graphics/pokemon/staravia/back.4bpp.lz"); + const u32 gMonFrontPic_StaraviaF[] = INCBIN_U32("graphics/pokemon/staravia/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_StaraviaF[] = INCBIN_U32("graphics/pokemon/staravia/back.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_StaraviaF[] = INCBIN_COMP("graphics/pokemon/staravia/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Staraptor[] = INCBIN_U32("graphics/pokemon/staraptor/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Staraptor[] = INCBIN_U32("graphics/pokemon/staraptor/anim_front.4bpp.smol"); const u16 gMonPalette_Staraptor[] = INCBIN_U16("graphics/pokemon/staraptor/normal.gbapal"); - const u32 gMonBackPic_Staraptor[] = INCBIN_U32("graphics/pokemon/staraptor/back.4bpp.lz"); + const u32 gMonBackPic_Staraptor[] = INCBIN_U32("graphics/pokemon/staraptor/back.4bpp.smol"); const u16 gMonShinyPalette_Staraptor[] = INCBIN_U16("graphics/pokemon/staraptor/shiny.gbapal"); const u8 gMonIcon_Staraptor[] = INCBIN_U8("graphics/pokemon/staraptor/icon.4bpp"); #if P_FOOTPRINTS @@ -14210,7 +14264,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_StaraptorF[] = INCBIN_U32("graphics/pokemon/staraptor/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_StaraptorF[] = INCBIN_U32("graphics/pokemon/staraptor/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_StaraptorF[] = INCBIN_COMP("graphics/pokemon/staraptor/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -14218,9 +14272,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_STARLY #if P_FAMILY_BIDOOF - const u32 gMonFrontPic_Bidoof[] = INCBIN_U32("graphics/pokemon/bidoof/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bidoof[] = INCBIN_U32("graphics/pokemon/bidoof/anim_front.4bpp.smol"); const u16 gMonPalette_Bidoof[] = INCBIN_U16("graphics/pokemon/bidoof/normal.gbapal"); - const u32 gMonBackPic_Bidoof[] = INCBIN_U32("graphics/pokemon/bidoof/back.4bpp.lz"); + const u32 gMonBackPic_Bidoof[] = INCBIN_U32("graphics/pokemon/bidoof/back.4bpp.smol"); const u16 gMonShinyPalette_Bidoof[] = INCBIN_U16("graphics/pokemon/bidoof/shiny.gbapal"); const u8 gMonIcon_Bidoof[] = INCBIN_U8("graphics/pokemon/bidoof/icon.4bpp"); #if P_FOOTPRINTS @@ -14235,16 +14289,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_BidoofF[] = INCBIN_U32("graphics/pokemon/bidoof/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_BidoofF[] = INCBIN_U32("graphics/pokemon/bidoof/backf.4bpp.lz"); + const u32 gMonFrontPic_BidoofF[] = INCBIN_U32("graphics/pokemon/bidoof/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_BidoofF[] = INCBIN_U32("graphics/pokemon/bidoof/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_BidoofF[] = INCBIN_COMP("graphics/pokemon/bidoof/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Bibarel[] = INCBIN_U32("graphics/pokemon/bibarel/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bibarel[] = INCBIN_U32("graphics/pokemon/bibarel/anim_front.4bpp.smol"); const u16 gMonPalette_Bibarel[] = INCBIN_U16("graphics/pokemon/bibarel/normal.gbapal"); - const u32 gMonBackPic_Bibarel[] = INCBIN_U32("graphics/pokemon/bibarel/back.4bpp.lz"); + const u32 gMonBackPic_Bibarel[] = INCBIN_U32("graphics/pokemon/bibarel/back.4bpp.smol"); const u16 gMonShinyPalette_Bibarel[] = INCBIN_U16("graphics/pokemon/bibarel/shiny.gbapal"); const u8 gMonIcon_Bibarel[] = INCBIN_U8("graphics/pokemon/bibarel/icon.4bpp"); #if P_FOOTPRINTS @@ -14259,7 +14313,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_BibarelF[] = INCBIN_U32("graphics/pokemon/bibarel/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_BibarelF[] = INCBIN_U32("graphics/pokemon/bibarel/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_BibarelF[] = INCBIN_COMP("graphics/pokemon/bibarel/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -14267,9 +14321,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BIDOOF #if P_FAMILY_KRICKETOT - const u32 gMonFrontPic_Kricketot[] = INCBIN_U32("graphics/pokemon/kricketot/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kricketot[] = INCBIN_U32("graphics/pokemon/kricketot/anim_front.4bpp.smol"); const u16 gMonPalette_Kricketot[] = INCBIN_U16("graphics/pokemon/kricketot/normal.gbapal"); - const u32 gMonBackPic_Kricketot[] = INCBIN_U32("graphics/pokemon/kricketot/back.4bpp.lz"); + const u32 gMonBackPic_Kricketot[] = INCBIN_U32("graphics/pokemon/kricketot/back.4bpp.smol"); const u16 gMonShinyPalette_Kricketot[] = INCBIN_U16("graphics/pokemon/kricketot/shiny.gbapal"); const u8 gMonIcon_Kricketot[] = INCBIN_U8("graphics/pokemon/kricketot/icon.4bpp"); #if P_FOOTPRINTS @@ -14284,16 +14338,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_KricketotF[] = INCBIN_U32("graphics/pokemon/kricketot/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_KricketotF[] = INCBIN_U32("graphics/pokemon/kricketot/backf.4bpp.lz"); + const u32 gMonFrontPic_KricketotF[] = INCBIN_U32("graphics/pokemon/kricketot/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_KricketotF[] = INCBIN_U32("graphics/pokemon/kricketot/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_KricketotF[] = INCBIN_COMP("graphics/pokemon/kricketot/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Kricketune[] = INCBIN_U32("graphics/pokemon/kricketune/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kricketune[] = INCBIN_U32("graphics/pokemon/kricketune/anim_front.4bpp.smol"); const u16 gMonPalette_Kricketune[] = INCBIN_U16("graphics/pokemon/kricketune/normal.gbapal"); - const u32 gMonBackPic_Kricketune[] = INCBIN_U32("graphics/pokemon/kricketune/back.4bpp.lz"); + const u32 gMonBackPic_Kricketune[] = INCBIN_U32("graphics/pokemon/kricketune/back.4bpp.smol"); const u16 gMonShinyPalette_Kricketune[] = INCBIN_U16("graphics/pokemon/kricketune/shiny.gbapal"); const u8 gMonIcon_Kricketune[] = INCBIN_U8("graphics/pokemon/kricketune/icon.4bpp"); #if P_FOOTPRINTS @@ -14308,8 +14362,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_KricketuneF[] = INCBIN_U32("graphics/pokemon/kricketune/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_KricketuneF[] = INCBIN_U32("graphics/pokemon/kricketune/backf.4bpp.lz"); + const u32 gMonFrontPic_KricketuneF[] = INCBIN_U32("graphics/pokemon/kricketune/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_KricketuneF[] = INCBIN_U32("graphics/pokemon/kricketune/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_KricketuneF[] = INCBIN_COMP("graphics/pokemon/kricketune/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -14317,9 +14371,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_KRICKETOT #if P_FAMILY_SHINX - const u32 gMonFrontPic_Shinx[] = INCBIN_U32("graphics/pokemon/shinx/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Shinx[] = INCBIN_U32("graphics/pokemon/shinx/anim_front.4bpp.smol"); const u16 gMonPalette_Shinx[] = INCBIN_U16("graphics/pokemon/shinx/normal.gbapal"); - const u32 gMonBackPic_Shinx[] = INCBIN_U32("graphics/pokemon/shinx/back.4bpp.lz"); + const u32 gMonBackPic_Shinx[] = INCBIN_U32("graphics/pokemon/shinx/back.4bpp.smol"); const u16 gMonShinyPalette_Shinx[] = INCBIN_U16("graphics/pokemon/shinx/shiny.gbapal"); const u8 gMonIcon_Shinx[] = INCBIN_U8("graphics/pokemon/shinx/icon.4bpp"); #if P_FOOTPRINTS @@ -14334,16 +14388,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_ShinxF[] = INCBIN_U32("graphics/pokemon/shinx/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_ShinxF[] = INCBIN_U32("graphics/pokemon/shinx/backf.4bpp.lz"); + const u32 gMonFrontPic_ShinxF[] = INCBIN_U32("graphics/pokemon/shinx/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_ShinxF[] = INCBIN_U32("graphics/pokemon/shinx/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_ShinxF[] = INCBIN_COMP("graphics/pokemon/shinx/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Luxio[] = INCBIN_U32("graphics/pokemon/luxio/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Luxio[] = INCBIN_U32("graphics/pokemon/luxio/anim_front.4bpp.smol"); const u16 gMonPalette_Luxio[] = INCBIN_U16("graphics/pokemon/luxio/normal.gbapal"); - const u32 gMonBackPic_Luxio[] = INCBIN_U32("graphics/pokemon/luxio/back.4bpp.lz"); + const u32 gMonBackPic_Luxio[] = INCBIN_U32("graphics/pokemon/luxio/back.4bpp.smol"); const u16 gMonShinyPalette_Luxio[] = INCBIN_U16("graphics/pokemon/luxio/shiny.gbapal"); const u8 gMonIcon_Luxio[] = INCBIN_U8("graphics/pokemon/luxio/icon.4bpp"); #if P_FOOTPRINTS @@ -14358,16 +14412,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_LuxioF[] = INCBIN_U32("graphics/pokemon/luxio/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_LuxioF[] = INCBIN_U32("graphics/pokemon/luxio/backf.4bpp.lz"); + const u32 gMonFrontPic_LuxioF[] = INCBIN_U32("graphics/pokemon/luxio/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_LuxioF[] = INCBIN_U32("graphics/pokemon/luxio/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_LuxioF[] = INCBIN_COMP("graphics/pokemon/luxio/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Luxray[] = INCBIN_U32("graphics/pokemon/luxray/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Luxray[] = INCBIN_U32("graphics/pokemon/luxray/anim_front.4bpp.smol"); const u16 gMonPalette_Luxray[] = INCBIN_U16("graphics/pokemon/luxray/normal.gbapal"); - const u32 gMonBackPic_Luxray[] = INCBIN_U32("graphics/pokemon/luxray/back.4bpp.lz"); + const u32 gMonBackPic_Luxray[] = INCBIN_U32("graphics/pokemon/luxray/back.4bpp.smol"); const u16 gMonShinyPalette_Luxray[] = INCBIN_U16("graphics/pokemon/luxray/shiny.gbapal"); const u8 gMonIcon_Luxray[] = INCBIN_U8("graphics/pokemon/luxray/icon.4bpp"); #if P_FOOTPRINTS @@ -14382,8 +14436,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_LuxrayF[] = INCBIN_U32("graphics/pokemon/luxray/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_LuxrayF[] = INCBIN_U32("graphics/pokemon/luxray/backf.4bpp.lz"); + const u32 gMonFrontPic_LuxrayF[] = INCBIN_U32("graphics/pokemon/luxray/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_LuxrayF[] = INCBIN_U32("graphics/pokemon/luxray/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_LuxrayF[] = INCBIN_COMP("graphics/pokemon/luxray/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -14391,9 +14445,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SHINX #if P_FAMILY_CRANIDOS - const u32 gMonFrontPic_Cranidos[] = INCBIN_U32("graphics/pokemon/cranidos/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cranidos[] = INCBIN_U32("graphics/pokemon/cranidos/anim_front.4bpp.smol"); const u16 gMonPalette_Cranidos[] = INCBIN_U16("graphics/pokemon/cranidos/normal.gbapal"); - const u32 gMonBackPic_Cranidos[] = INCBIN_U32("graphics/pokemon/cranidos/back.4bpp.lz"); + const u32 gMonBackPic_Cranidos[] = INCBIN_U32("graphics/pokemon/cranidos/back.4bpp.smol"); const u16 gMonShinyPalette_Cranidos[] = INCBIN_U16("graphics/pokemon/cranidos/shiny.gbapal"); const u8 gMonIcon_Cranidos[] = INCBIN_U8("graphics/pokemon/cranidos/icon.4bpp"); #if P_FOOTPRINTS @@ -14407,9 +14461,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Rampardos[] = INCBIN_U32("graphics/pokemon/rampardos/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rampardos[] = INCBIN_U32("graphics/pokemon/rampardos/anim_front.4bpp.smol"); const u16 gMonPalette_Rampardos[] = INCBIN_U16("graphics/pokemon/rampardos/normal.gbapal"); - const u32 gMonBackPic_Rampardos[] = INCBIN_U32("graphics/pokemon/rampardos/back.4bpp.lz"); + const u32 gMonBackPic_Rampardos[] = INCBIN_U32("graphics/pokemon/rampardos/back.4bpp.smol"); const u16 gMonShinyPalette_Rampardos[] = INCBIN_U16("graphics/pokemon/rampardos/shiny.gbapal"); const u8 gMonIcon_Rampardos[] = INCBIN_U8("graphics/pokemon/rampardos/icon.4bpp"); #if P_FOOTPRINTS @@ -14425,9 +14479,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CRANIDOS #if P_FAMILY_SHIELDON - const u32 gMonFrontPic_Shieldon[] = INCBIN_U32("graphics/pokemon/shieldon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Shieldon[] = INCBIN_U32("graphics/pokemon/shieldon/anim_front.4bpp.smol"); const u16 gMonPalette_Shieldon[] = INCBIN_U16("graphics/pokemon/shieldon/normal.gbapal"); - const u32 gMonBackPic_Shieldon[] = INCBIN_U32("graphics/pokemon/shieldon/back.4bpp.lz"); + const u32 gMonBackPic_Shieldon[] = INCBIN_U32("graphics/pokemon/shieldon/back.4bpp.smol"); const u16 gMonShinyPalette_Shieldon[] = INCBIN_U16("graphics/pokemon/shieldon/shiny.gbapal"); const u8 gMonIcon_Shieldon[] = INCBIN_U8("graphics/pokemon/shieldon/icon.4bpp"); #if P_FOOTPRINTS @@ -14441,9 +14495,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Bastiodon[] = INCBIN_U32("graphics/pokemon/bastiodon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bastiodon[] = INCBIN_U32("graphics/pokemon/bastiodon/anim_front.4bpp.smol"); const u16 gMonPalette_Bastiodon[] = INCBIN_U16("graphics/pokemon/bastiodon/normal.gbapal"); - const u32 gMonBackPic_Bastiodon[] = INCBIN_U32("graphics/pokemon/bastiodon/back.4bpp.lz"); + const u32 gMonBackPic_Bastiodon[] = INCBIN_U32("graphics/pokemon/bastiodon/back.4bpp.smol"); const u16 gMonShinyPalette_Bastiodon[] = INCBIN_U16("graphics/pokemon/bastiodon/shiny.gbapal"); const u8 gMonIcon_Bastiodon[] = INCBIN_U8("graphics/pokemon/bastiodon/icon.4bpp"); #if P_FOOTPRINTS @@ -14459,24 +14513,24 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SHIELDON #if P_FAMILY_BURMY - const u32 gMonFrontPic_BurmyPlant[] = INCBIN_U32("graphics/pokemon/burmy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_BurmyPlant[] = INCBIN_U32("graphics/pokemon/burmy/anim_front.4bpp.smol"); const u16 gMonPalette_BurmyPlant[] = INCBIN_U16("graphics/pokemon/burmy/normal.gbapal"); - const u32 gMonBackPic_BurmyPlant[] = INCBIN_U32("graphics/pokemon/burmy/back.4bpp.lz"); + const u32 gMonBackPic_BurmyPlant[] = INCBIN_U32("graphics/pokemon/burmy/back.4bpp.smol"); const u16 gMonShinyPalette_BurmyPlant[] = INCBIN_U16("graphics/pokemon/burmy/shiny.gbapal"); const u8 gMonIcon_BurmyPlant[] = INCBIN_U8("graphics/pokemon/burmy/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Burmy[] = INCBIN_U8("graphics/pokemon/burmy/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_BurmySandy[] = INCBIN_U32("graphics/pokemon/burmy/sandy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_BurmySandy[] = INCBIN_U32("graphics/pokemon/burmy/sandy/anim_front.4bpp.smol"); const u16 gMonPalette_BurmySandy[] = INCBIN_U16("graphics/pokemon/burmy/sandy/normal.gbapal"); - const u32 gMonBackPic_BurmySandy[] = INCBIN_U32("graphics/pokemon/burmy/sandy/back.4bpp.lz"); + const u32 gMonBackPic_BurmySandy[] = INCBIN_U32("graphics/pokemon/burmy/sandy/back.4bpp.smol"); const u16 gMonShinyPalette_BurmySandy[] = INCBIN_U16("graphics/pokemon/burmy/sandy/shiny.gbapal"); const u8 gMonIcon_BurmySandy[] = INCBIN_U8("graphics/pokemon/burmy/sandy/icon.4bpp"); - const u32 gMonFrontPic_BurmyTrash[] = INCBIN_U32("graphics/pokemon/burmy/trash/anim_front.4bpp.lz"); + const u32 gMonFrontPic_BurmyTrash[] = INCBIN_U32("graphics/pokemon/burmy/trash/anim_front.4bpp.smol"); const u16 gMonPalette_BurmyTrash[] = INCBIN_U16("graphics/pokemon/burmy/trash/normal.gbapal"); - const u32 gMonBackPic_BurmyTrash[] = INCBIN_U32("graphics/pokemon/burmy/trash/back.4bpp.lz"); + const u32 gMonBackPic_BurmyTrash[] = INCBIN_U32("graphics/pokemon/burmy/trash/back.4bpp.smol"); const u16 gMonShinyPalette_BurmyTrash[] = INCBIN_U16("graphics/pokemon/burmy/trash/shiny.gbapal"); const u8 gMonIcon_BurmyTrash[] = INCBIN_U8("graphics/pokemon/burmy/trash/icon.4bpp"); @@ -14494,24 +14548,24 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_WormadamPlant[] = INCBIN_U32("graphics/pokemon/wormadam/anim_front.4bpp.lz"); + const u32 gMonFrontPic_WormadamPlant[] = INCBIN_U32("graphics/pokemon/wormadam/anim_front.4bpp.smol"); const u16 gMonPalette_WormadamPlant[] = INCBIN_U16("graphics/pokemon/wormadam/normal.gbapal"); - const u32 gMonBackPic_WormadamPlant[] = INCBIN_U32("graphics/pokemon/wormadam/back.4bpp.lz"); + const u32 gMonBackPic_WormadamPlant[] = INCBIN_U32("graphics/pokemon/wormadam/back.4bpp.smol"); const u16 gMonShinyPalette_WormadamPlant[] = INCBIN_U16("graphics/pokemon/wormadam/shiny.gbapal"); const u8 gMonIcon_WormadamPlant[] = INCBIN_U8("graphics/pokemon/wormadam/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Wormadam[] = INCBIN_U8("graphics/pokemon/wormadam/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_WormadamSandy[] = INCBIN_U32("graphics/pokemon/wormadam/sandy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_WormadamSandy[] = INCBIN_U32("graphics/pokemon/wormadam/sandy/anim_front.4bpp.smol"); const u16 gMonPalette_WormadamSandy[] = INCBIN_U16("graphics/pokemon/wormadam/sandy/normal.gbapal"); - const u32 gMonBackPic_WormadamSandy[] = INCBIN_U32("graphics/pokemon/wormadam/sandy/back.4bpp.lz"); + const u32 gMonBackPic_WormadamSandy[] = INCBIN_U32("graphics/pokemon/wormadam/sandy/back.4bpp.smol"); const u16 gMonShinyPalette_WormadamSandy[] = INCBIN_U16("graphics/pokemon/wormadam/sandy/shiny.gbapal"); const u8 gMonIcon_WormadamSandy[] = INCBIN_U8("graphics/pokemon/wormadam/sandy/icon.4bpp"); - const u32 gMonFrontPic_WormadamTrash[] = INCBIN_U32("graphics/pokemon/wormadam/trash/anim_front.4bpp.lz"); + const u32 gMonFrontPic_WormadamTrash[] = INCBIN_U32("graphics/pokemon/wormadam/trash/anim_front.4bpp.smol"); const u16 gMonPalette_WormadamTrash[] = INCBIN_U16("graphics/pokemon/wormadam/trash/normal.gbapal"); - const u32 gMonBackPic_WormadamTrash[] = INCBIN_U32("graphics/pokemon/wormadam/trash/back.4bpp.lz"); + const u32 gMonBackPic_WormadamTrash[] = INCBIN_U32("graphics/pokemon/wormadam/trash/back.4bpp.smol"); const u16 gMonShinyPalette_WormadamTrash[] = INCBIN_U16("graphics/pokemon/wormadam/trash/shiny.gbapal"); const u8 gMonIcon_WormadamTrash[] = INCBIN_U8("graphics/pokemon/wormadam/trash/icon.4bpp"); @@ -14529,9 +14583,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Mothim[] = INCBIN_U32("graphics/pokemon/mothim/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mothim[] = INCBIN_U32("graphics/pokemon/mothim/anim_front.4bpp.smol"); const u16 gMonPalette_Mothim[] = INCBIN_U16("graphics/pokemon/mothim/normal.gbapal"); - const u32 gMonBackPic_Mothim[] = INCBIN_U32("graphics/pokemon/mothim/back.4bpp.lz"); + const u32 gMonBackPic_Mothim[] = INCBIN_U32("graphics/pokemon/mothim/back.4bpp.smol"); const u16 gMonShinyPalette_Mothim[] = INCBIN_U16("graphics/pokemon/mothim/shiny.gbapal"); const u8 gMonIcon_Mothim[] = INCBIN_U8("graphics/pokemon/mothim/icon.4bpp"); #if P_FOOTPRINTS @@ -14547,9 +14601,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BURMY #if P_FAMILY_COMBEE - const u32 gMonFrontPic_Combee[] = INCBIN_U32("graphics/pokemon/combee/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Combee[] = INCBIN_U32("graphics/pokemon/combee/anim_front.4bpp.smol"); const u16 gMonPalette_Combee[] = INCBIN_U16("graphics/pokemon/combee/normal.gbapal"); - const u32 gMonBackPic_Combee[] = INCBIN_U32("graphics/pokemon/combee/back.4bpp.lz"); + const u32 gMonBackPic_Combee[] = INCBIN_U32("graphics/pokemon/combee/back.4bpp.smol"); const u16 gMonShinyPalette_Combee[] = INCBIN_U16("graphics/pokemon/combee/shiny.gbapal"); const u8 gMonIcon_Combee[] = INCBIN_U8("graphics/pokemon/combee/icon.4bpp"); #if P_FOOTPRINTS @@ -14571,9 +14625,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Vespiquen[] = INCBIN_U32("graphics/pokemon/vespiquen/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Vespiquen[] = INCBIN_U32("graphics/pokemon/vespiquen/anim_front.4bpp.smol"); const u16 gMonPalette_Vespiquen[] = INCBIN_U16("graphics/pokemon/vespiquen/normal.gbapal"); - const u32 gMonBackPic_Vespiquen[] = INCBIN_U32("graphics/pokemon/vespiquen/back.4bpp.lz"); + const u32 gMonBackPic_Vespiquen[] = INCBIN_U32("graphics/pokemon/vespiquen/back.4bpp.smol"); const u16 gMonShinyPalette_Vespiquen[] = INCBIN_U16("graphics/pokemon/vespiquen/shiny.gbapal"); const u8 gMonIcon_Vespiquen[] = INCBIN_U8("graphics/pokemon/vespiquen/icon.4bpp"); #if P_FOOTPRINTS @@ -14589,9 +14643,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_COMBEE #if P_FAMILY_PACHIRISU - const u32 gMonFrontPic_Pachirisu[] = INCBIN_U32("graphics/pokemon/pachirisu/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pachirisu[] = INCBIN_U32("graphics/pokemon/pachirisu/anim_front.4bpp.smol"); const u16 gMonPalette_Pachirisu[] = INCBIN_U16("graphics/pokemon/pachirisu/normal.gbapal"); - const u32 gMonBackPic_Pachirisu[] = INCBIN_U32("graphics/pokemon/pachirisu/back.4bpp.lz"); + const u32 gMonBackPic_Pachirisu[] = INCBIN_U32("graphics/pokemon/pachirisu/back.4bpp.smol"); const u16 gMonShinyPalette_Pachirisu[] = INCBIN_U16("graphics/pokemon/pachirisu/shiny.gbapal"); const u8 gMonIcon_Pachirisu[] = INCBIN_U8("graphics/pokemon/pachirisu/icon.4bpp"); #if P_FOOTPRINTS @@ -14606,7 +14660,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_PachirisuF[] = INCBIN_U32("graphics/pokemon/pachirisu/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_PachirisuF[] = INCBIN_U32("graphics/pokemon/pachirisu/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_PachirisuF[] = INCBIN_COMP("graphics/pokemon/pachirisu/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -14614,9 +14668,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PACHIRISU #if P_FAMILY_BUIZEL - const u32 gMonFrontPic_Buizel[] = INCBIN_U32("graphics/pokemon/buizel/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Buizel[] = INCBIN_U32("graphics/pokemon/buizel/anim_front.4bpp.smol"); const u16 gMonPalette_Buizel[] = INCBIN_U16("graphics/pokemon/buizel/normal.gbapal"); - const u32 gMonBackPic_Buizel[] = INCBIN_U32("graphics/pokemon/buizel/back.4bpp.lz"); + const u32 gMonBackPic_Buizel[] = INCBIN_U32("graphics/pokemon/buizel/back.4bpp.smol"); const u16 gMonShinyPalette_Buizel[] = INCBIN_U16("graphics/pokemon/buizel/shiny.gbapal"); const u8 gMonIcon_Buizel[] = INCBIN_U8("graphics/pokemon/buizel/icon.4bpp"); #if P_FOOTPRINTS @@ -14631,15 +14685,15 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonBackPic_BuizelF[] = INCBIN_U32("graphics/pokemon/buizel/backf.4bpp.lz"); + const u32 gMonBackPic_BuizelF[] = INCBIN_U32("graphics/pokemon/buizel/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_BuizelF[] = INCBIN_COMP("graphics/pokemon/buizel/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Floatzel[] = INCBIN_U32("graphics/pokemon/floatzel/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Floatzel[] = INCBIN_U32("graphics/pokemon/floatzel/anim_front.4bpp.smol"); const u16 gMonPalette_Floatzel[] = INCBIN_U16("graphics/pokemon/floatzel/normal.gbapal"); - const u32 gMonBackPic_Floatzel[] = INCBIN_U32("graphics/pokemon/floatzel/back.4bpp.lz"); + const u32 gMonBackPic_Floatzel[] = INCBIN_U32("graphics/pokemon/floatzel/back.4bpp.smol"); const u16 gMonShinyPalette_Floatzel[] = INCBIN_U16("graphics/pokemon/floatzel/shiny.gbapal"); const u8 gMonIcon_Floatzel[] = INCBIN_U8("graphics/pokemon/floatzel/icon.4bpp"); #if P_FOOTPRINTS @@ -14654,7 +14708,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonBackPic_FloatzelF[] = INCBIN_U32("graphics/pokemon/floatzel/backf.4bpp.lz"); + const u32 gMonBackPic_FloatzelF[] = INCBIN_U32("graphics/pokemon/floatzel/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_FloatzelF[] = INCBIN_COMP("graphics/pokemon/floatzel/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -14662,9 +14716,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BUIZEL #if P_FAMILY_CHERUBI - const u32 gMonFrontPic_Cherubi[] = INCBIN_U32("graphics/pokemon/cherubi/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cherubi[] = INCBIN_U32("graphics/pokemon/cherubi/anim_front.4bpp.smol"); const u16 gMonPalette_Cherubi[] = INCBIN_U16("graphics/pokemon/cherubi/normal.gbapal"); - const u32 gMonBackPic_Cherubi[] = INCBIN_U32("graphics/pokemon/cherubi/back.4bpp.lz"); + const u32 gMonBackPic_Cherubi[] = INCBIN_U32("graphics/pokemon/cherubi/back.4bpp.smol"); const u16 gMonShinyPalette_Cherubi[] = INCBIN_U16("graphics/pokemon/cherubi/shiny.gbapal"); const u8 gMonIcon_Cherubi[] = INCBIN_U8("graphics/pokemon/cherubi/icon.4bpp"); #if P_FOOTPRINTS @@ -14678,18 +14732,18 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_CherrimOvercast[] = INCBIN_U32("graphics/pokemon/cherrim/anim_front.4bpp.lz"); + const u32 gMonFrontPic_CherrimOvercast[] = INCBIN_U32("graphics/pokemon/cherrim/anim_front.4bpp.smol"); const u16 gMonPalette_CherrimOvercast[] = INCBIN_U16("graphics/pokemon/cherrim/normal.gbapal"); - const u32 gMonBackPic_CherrimOvercast[] = INCBIN_U32("graphics/pokemon/cherrim/back.4bpp.lz"); + const u32 gMonBackPic_CherrimOvercast[] = INCBIN_U32("graphics/pokemon/cherrim/back.4bpp.smol"); const u16 gMonShinyPalette_CherrimOvercast[] = INCBIN_U16("graphics/pokemon/cherrim/shiny.gbapal"); const u8 gMonIcon_CherrimOvercast[] = INCBIN_U8("graphics/pokemon/cherrim/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Cherrim[] = INCBIN_U8("graphics/pokemon/cherrim/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_CherrimSunshine[] = INCBIN_U32("graphics/pokemon/cherrim/sunshine/anim_front.4bpp.lz"); + const u32 gMonFrontPic_CherrimSunshine[] = INCBIN_U32("graphics/pokemon/cherrim/sunshine/anim_front.4bpp.smol"); const u16 gMonPalette_CherrimSunshine[] = INCBIN_U16("graphics/pokemon/cherrim/sunshine/normal.gbapal"); - const u32 gMonBackPic_CherrimSunshine[] = INCBIN_U32("graphics/pokemon/cherrim/sunshine/back.4bpp.lz"); + const u32 gMonBackPic_CherrimSunshine[] = INCBIN_U32("graphics/pokemon/cherrim/sunshine/back.4bpp.smol"); const u16 gMonShinyPalette_CherrimSunshine[] = INCBIN_U16("graphics/pokemon/cherrim/sunshine/shiny.gbapal"); const u8 gMonIcon_CherrimSunshine[] = INCBIN_U8("graphics/pokemon/cherrim/sunshine/icon.4bpp"); @@ -14706,18 +14760,18 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CHERUBI #if P_FAMILY_SHELLOS - const u32 gMonFrontPic_ShellosWestSea[] = INCBIN_U32("graphics/pokemon/shellos/anim_front.4bpp.lz"); + const u32 gMonFrontPic_ShellosWestSea[] = INCBIN_U32("graphics/pokemon/shellos/anim_front.4bpp.smol"); const u16 gMonPalette_ShellosWestSea[] = INCBIN_U16("graphics/pokemon/shellos/normal.gbapal"); - const u32 gMonBackPic_ShellosWestSea[] = INCBIN_U32("graphics/pokemon/shellos/back.4bpp.lz"); + const u32 gMonBackPic_ShellosWestSea[] = INCBIN_U32("graphics/pokemon/shellos/back.4bpp.smol"); const u16 gMonShinyPalette_ShellosWestSea[] = INCBIN_U16("graphics/pokemon/shellos/shiny.gbapal"); const u8 gMonIcon_ShellosWestSea[] = INCBIN_U8("graphics/pokemon/shellos/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Shellos[] = INCBIN_U8("graphics/pokemon/shellos/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_ShellosEast[] = INCBIN_U32("graphics/pokemon/shellos/east/anim_front.4bpp.lz"); + const u32 gMonFrontPic_ShellosEast[] = INCBIN_U32("graphics/pokemon/shellos/east/anim_front.4bpp.smol"); const u16 gMonPalette_ShellosEast[] = INCBIN_U16("graphics/pokemon/shellos/east/normal.gbapal"); - const u32 gMonBackPic_ShellosEast[] = INCBIN_U32("graphics/pokemon/shellos/east/back.4bpp.lz"); + const u32 gMonBackPic_ShellosEast[] = INCBIN_U32("graphics/pokemon/shellos/east/back.4bpp.smol"); const u16 gMonShinyPalette_ShellosEast[] = INCBIN_U16("graphics/pokemon/shellos/east/shiny.gbapal"); const u8 gMonIcon_ShellosEast[] = INCBIN_U8("graphics/pokemon/shellos/east/icon.4bpp"); @@ -14732,18 +14786,18 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_GastrodonWestSea[] = INCBIN_U32("graphics/pokemon/gastrodon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_GastrodonWestSea[] = INCBIN_U32("graphics/pokemon/gastrodon/anim_front.4bpp.smol"); const u16 gMonPalette_GastrodonWestSea[] = INCBIN_U16("graphics/pokemon/gastrodon/normal.gbapal"); - const u32 gMonBackPic_GastrodonWestSea[] = INCBIN_U32("graphics/pokemon/gastrodon/back.4bpp.lz"); + const u32 gMonBackPic_GastrodonWestSea[] = INCBIN_U32("graphics/pokemon/gastrodon/back.4bpp.smol"); const u16 gMonShinyPalette_GastrodonWestSea[] = INCBIN_U16("graphics/pokemon/gastrodon/shiny.gbapal"); const u8 gMonIcon_GastrodonWestSea[] = INCBIN_U8("graphics/pokemon/gastrodon/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Gastrodon[] = INCBIN_U8("graphics/pokemon/gastrodon/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_GastrodonEast[] = INCBIN_U32("graphics/pokemon/gastrodon/east/anim_front.4bpp.lz"); + const u32 gMonFrontPic_GastrodonEast[] = INCBIN_U32("graphics/pokemon/gastrodon/east/anim_front.4bpp.smol"); const u16 gMonPalette_GastrodonEast[] = INCBIN_U16("graphics/pokemon/gastrodon/east/normal.gbapal"); - const u32 gMonBackPic_GastrodonEast[] = INCBIN_U32("graphics/pokemon/gastrodon/east/back.4bpp.lz"); + const u32 gMonBackPic_GastrodonEast[] = INCBIN_U32("graphics/pokemon/gastrodon/east/back.4bpp.smol"); const u16 gMonShinyPalette_GastrodonEast[] = INCBIN_U16("graphics/pokemon/gastrodon/east/shiny.gbapal"); const u8 gMonIcon_GastrodonEast[] = INCBIN_U8("graphics/pokemon/gastrodon/east/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -14759,9 +14813,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SHELLOS #if P_FAMILY_DRIFLOON - const u32 gMonFrontPic_Drifloon[] = INCBIN_U32("graphics/pokemon/drifloon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Drifloon[] = INCBIN_U32("graphics/pokemon/drifloon/anim_front.4bpp.smol"); const u16 gMonPalette_Drifloon[] = INCBIN_U16("graphics/pokemon/drifloon/normal.gbapal"); - const u32 gMonBackPic_Drifloon[] = INCBIN_U32("graphics/pokemon/drifloon/back.4bpp.lz"); + const u32 gMonBackPic_Drifloon[] = INCBIN_U32("graphics/pokemon/drifloon/back.4bpp.smol"); const u16 gMonShinyPalette_Drifloon[] = INCBIN_U16("graphics/pokemon/drifloon/shiny.gbapal"); const u8 gMonIcon_Drifloon[] = INCBIN_U8("graphics/pokemon/drifloon/icon.4bpp"); #if P_FOOTPRINTS @@ -14775,9 +14829,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Drifblim[] = INCBIN_U32("graphics/pokemon/drifblim/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Drifblim[] = INCBIN_U32("graphics/pokemon/drifblim/anim_front.4bpp.smol"); const u16 gMonPalette_Drifblim[] = INCBIN_U16("graphics/pokemon/drifblim/normal.gbapal"); - const u32 gMonBackPic_Drifblim[] = INCBIN_U32("graphics/pokemon/drifblim/back.4bpp.lz"); + const u32 gMonBackPic_Drifblim[] = INCBIN_U32("graphics/pokemon/drifblim/back.4bpp.smol"); const u16 gMonShinyPalette_Drifblim[] = INCBIN_U16("graphics/pokemon/drifblim/shiny.gbapal"); const u8 gMonIcon_Drifblim[] = INCBIN_U8("graphics/pokemon/drifblim/icon.4bpp"); #if P_FOOTPRINTS @@ -14793,9 +14847,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DRIFLOON #if P_FAMILY_BUNEARY - const u32 gMonFrontPic_Buneary[] = INCBIN_U32("graphics/pokemon/buneary/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Buneary[] = INCBIN_U32("graphics/pokemon/buneary/anim_front.4bpp.smol"); const u16 gMonPalette_Buneary[] = INCBIN_U16("graphics/pokemon/buneary/normal.gbapal"); - const u32 gMonBackPic_Buneary[] = INCBIN_U32("graphics/pokemon/buneary/back.4bpp.lz"); + const u32 gMonBackPic_Buneary[] = INCBIN_U32("graphics/pokemon/buneary/back.4bpp.smol"); const u16 gMonShinyPalette_Buneary[] = INCBIN_U16("graphics/pokemon/buneary/shiny.gbapal"); const u8 gMonIcon_Buneary[] = INCBIN_U8("graphics/pokemon/buneary/icon.4bpp"); #if P_FOOTPRINTS @@ -14809,9 +14863,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Lopunny[] = INCBIN_U32("graphics/pokemon/lopunny/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lopunny[] = INCBIN_U32("graphics/pokemon/lopunny/anim_front.4bpp.smol"); const u16 gMonPalette_Lopunny[] = INCBIN_U16("graphics/pokemon/lopunny/normal.gbapal"); - const u32 gMonBackPic_Lopunny[] = INCBIN_U32("graphics/pokemon/lopunny/back.4bpp.lz"); + const u32 gMonBackPic_Lopunny[] = INCBIN_U32("graphics/pokemon/lopunny/back.4bpp.smol"); const u16 gMonShinyPalette_Lopunny[] = INCBIN_U16("graphics/pokemon/lopunny/shiny.gbapal"); const u8 gMonIcon_Lopunny[] = INCBIN_U8("graphics/pokemon/lopunny/icon.4bpp"); #if P_FOOTPRINTS @@ -14826,9 +14880,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_LopunnyMega[] = INCBIN_U32("graphics/pokemon/lopunny/mega/front.4bpp.lz"); + const u32 gMonFrontPic_LopunnyMega[] = INCBIN_U32("graphics/pokemon/lopunny/mega/front.4bpp.smol"); const u16 gMonPalette_LopunnyMega[] = INCBIN_U16("graphics/pokemon/lopunny/mega/normal.gbapal"); - const u32 gMonBackPic_LopunnyMega[] = INCBIN_U32("graphics/pokemon/lopunny/mega/back.4bpp.lz"); + const u32 gMonBackPic_LopunnyMega[] = INCBIN_U32("graphics/pokemon/lopunny/mega/back.4bpp.smol"); const u16 gMonShinyPalette_LopunnyMega[] = INCBIN_U16("graphics/pokemon/lopunny/mega/shiny.gbapal"); const u8 gMonIcon_LopunnyMega[] = INCBIN_U8("graphics/pokemon/lopunny/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -14842,9 +14896,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BUNEARY #if P_FAMILY_GLAMEOW - const u32 gMonFrontPic_Glameow[] = INCBIN_U32("graphics/pokemon/glameow/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Glameow[] = INCBIN_U32("graphics/pokemon/glameow/anim_front.4bpp.smol"); const u16 gMonPalette_Glameow[] = INCBIN_U16("graphics/pokemon/glameow/normal.gbapal"); - const u32 gMonBackPic_Glameow[] = INCBIN_U32("graphics/pokemon/glameow/back.4bpp.lz"); + const u32 gMonBackPic_Glameow[] = INCBIN_U32("graphics/pokemon/glameow/back.4bpp.smol"); const u16 gMonShinyPalette_Glameow[] = INCBIN_U16("graphics/pokemon/glameow/shiny.gbapal"); const u8 gMonIcon_Glameow[] = INCBIN_U8("graphics/pokemon/glameow/icon.4bpp"); #if P_FOOTPRINTS @@ -14858,9 +14912,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Purugly[] = INCBIN_U32("graphics/pokemon/purugly/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Purugly[] = INCBIN_U32("graphics/pokemon/purugly/anim_front.4bpp.smol"); const u16 gMonPalette_Purugly[] = INCBIN_U16("graphics/pokemon/purugly/normal.gbapal"); - const u32 gMonBackPic_Purugly[] = INCBIN_U32("graphics/pokemon/purugly/back.4bpp.lz"); + const u32 gMonBackPic_Purugly[] = INCBIN_U32("graphics/pokemon/purugly/back.4bpp.smol"); const u16 gMonShinyPalette_Purugly[] = INCBIN_U16("graphics/pokemon/purugly/shiny.gbapal"); const u8 gMonIcon_Purugly[] = INCBIN_U8("graphics/pokemon/purugly/icon.4bpp"); #if P_FOOTPRINTS @@ -14876,9 +14930,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GLAMEOW #if P_FAMILY_STUNKY - const u32 gMonFrontPic_Stunky[] = INCBIN_U32("graphics/pokemon/stunky/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Stunky[] = INCBIN_U32("graphics/pokemon/stunky/anim_front.4bpp.smol"); const u16 gMonPalette_Stunky[] = INCBIN_U16("graphics/pokemon/stunky/normal.gbapal"); - const u32 gMonBackPic_Stunky[] = INCBIN_U32("graphics/pokemon/stunky/back.4bpp.lz"); + const u32 gMonBackPic_Stunky[] = INCBIN_U32("graphics/pokemon/stunky/back.4bpp.smol"); const u16 gMonShinyPalette_Stunky[] = INCBIN_U16("graphics/pokemon/stunky/shiny.gbapal"); const u8 gMonIcon_Stunky[] = INCBIN_U8("graphics/pokemon/stunky/icon.4bpp"); #if P_FOOTPRINTS @@ -14892,9 +14946,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Skuntank[] = INCBIN_U32("graphics/pokemon/skuntank/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Skuntank[] = INCBIN_U32("graphics/pokemon/skuntank/anim_front.4bpp.smol"); const u16 gMonPalette_Skuntank[] = INCBIN_U16("graphics/pokemon/skuntank/normal.gbapal"); - const u32 gMonBackPic_Skuntank[] = INCBIN_U32("graphics/pokemon/skuntank/back.4bpp.lz"); + const u32 gMonBackPic_Skuntank[] = INCBIN_U32("graphics/pokemon/skuntank/back.4bpp.smol"); const u16 gMonShinyPalette_Skuntank[] = INCBIN_U16("graphics/pokemon/skuntank/shiny.gbapal"); const u8 gMonIcon_Skuntank[] = INCBIN_U8("graphics/pokemon/skuntank/icon.4bpp"); #if P_FOOTPRINTS @@ -14910,9 +14964,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_STUNKY #if P_FAMILY_BRONZOR - const u32 gMonFrontPic_Bronzor[] = INCBIN_U32("graphics/pokemon/bronzor/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bronzor[] = INCBIN_U32("graphics/pokemon/bronzor/anim_front.4bpp.smol"); const u16 gMonPalette_Bronzor[] = INCBIN_U16("graphics/pokemon/bronzor/normal.gbapal"); - const u32 gMonBackPic_Bronzor[] = INCBIN_U32("graphics/pokemon/bronzor/back.4bpp.lz"); + const u32 gMonBackPic_Bronzor[] = INCBIN_U32("graphics/pokemon/bronzor/back.4bpp.smol"); const u16 gMonShinyPalette_Bronzor[] = INCBIN_U16("graphics/pokemon/bronzor/shiny.gbapal"); const u8 gMonIcon_Bronzor[] = INCBIN_U8("graphics/pokemon/bronzor/icon.4bpp"); #if P_FOOTPRINTS @@ -14926,9 +14980,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Bronzong[] = INCBIN_U32("graphics/pokemon/bronzong/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bronzong[] = INCBIN_U32("graphics/pokemon/bronzong/anim_front.4bpp.smol"); const u16 gMonPalette_Bronzong[] = INCBIN_U16("graphics/pokemon/bronzong/normal.gbapal"); - const u32 gMonBackPic_Bronzong[] = INCBIN_U32("graphics/pokemon/bronzong/back.4bpp.lz"); + const u32 gMonBackPic_Bronzong[] = INCBIN_U32("graphics/pokemon/bronzong/back.4bpp.smol"); const u16 gMonShinyPalette_Bronzong[] = INCBIN_U16("graphics/pokemon/bronzong/shiny.gbapal"); const u8 gMonIcon_Bronzong[] = INCBIN_U8("graphics/pokemon/bronzong/icon.4bpp"); #if P_FOOTPRINTS @@ -14944,9 +14998,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BRONZOR #if P_FAMILY_CHATOT - const u32 gMonFrontPic_Chatot[] = INCBIN_U32("graphics/pokemon/chatot/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Chatot[] = INCBIN_U32("graphics/pokemon/chatot/anim_front.4bpp.smol"); const u16 gMonPalette_Chatot[] = INCBIN_U16("graphics/pokemon/chatot/normal.gbapal"); - const u32 gMonBackPic_Chatot[] = INCBIN_U32("graphics/pokemon/chatot/back.4bpp.lz"); + const u32 gMonBackPic_Chatot[] = INCBIN_U32("graphics/pokemon/chatot/back.4bpp.smol"); const u16 gMonShinyPalette_Chatot[] = INCBIN_U16("graphics/pokemon/chatot/shiny.gbapal"); const u8 gMonIcon_Chatot[] = INCBIN_U8("graphics/pokemon/chatot/icon.4bpp"); #if P_FOOTPRINTS @@ -14962,9 +15016,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CHATOT #if P_FAMILY_SPIRITOMB - const u32 gMonFrontPic_Spiritomb[] = INCBIN_U32("graphics/pokemon/spiritomb/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Spiritomb[] = INCBIN_U32("graphics/pokemon/spiritomb/anim_front.4bpp.smol"); const u16 gMonPalette_Spiritomb[] = INCBIN_U16("graphics/pokemon/spiritomb/normal.gbapal"); - const u32 gMonBackPic_Spiritomb[] = INCBIN_U32("graphics/pokemon/spiritomb/back.4bpp.lz"); + const u32 gMonBackPic_Spiritomb[] = INCBIN_U32("graphics/pokemon/spiritomb/back.4bpp.smol"); const u16 gMonShinyPalette_Spiritomb[] = INCBIN_U16("graphics/pokemon/spiritomb/shiny.gbapal"); const u8 gMonIcon_Spiritomb[] = INCBIN_U8("graphics/pokemon/spiritomb/icon.4bpp"); #if P_FOOTPRINTS @@ -14980,9 +15034,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SPIRITOMB #if P_FAMILY_GIBLE - const u32 gMonFrontPic_Gible[] = INCBIN_U32("graphics/pokemon/gible/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gible[] = INCBIN_U32("graphics/pokemon/gible/anim_front.4bpp.smol"); const u16 gMonPalette_Gible[] = INCBIN_U16("graphics/pokemon/gible/normal.gbapal"); - const u32 gMonBackPic_Gible[] = INCBIN_U32("graphics/pokemon/gible/back.4bpp.lz"); + const u32 gMonBackPic_Gible[] = INCBIN_U32("graphics/pokemon/gible/back.4bpp.smol"); const u16 gMonShinyPalette_Gible[] = INCBIN_U16("graphics/pokemon/gible/shiny.gbapal"); const u8 gMonIcon_Gible[] = INCBIN_U8("graphics/pokemon/gible/icon.4bpp"); #if P_FOOTPRINTS @@ -14997,16 +15051,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_GibleF[] = INCBIN_U32("graphics/pokemon/gible/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_GibleF[] = INCBIN_U32("graphics/pokemon/gible/backf.4bpp.lz"); + const u32 gMonFrontPic_GibleF[] = INCBIN_U32("graphics/pokemon/gible/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_GibleF[] = INCBIN_U32("graphics/pokemon/gible/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_GibleF[] = INCBIN_COMP("graphics/pokemon/gible/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Gabite[] = INCBIN_U32("graphics/pokemon/gabite/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gabite[] = INCBIN_U32("graphics/pokemon/gabite/anim_front.4bpp.smol"); const u16 gMonPalette_Gabite[] = INCBIN_U16("graphics/pokemon/gabite/normal.gbapal"); - const u32 gMonBackPic_Gabite[] = INCBIN_U32("graphics/pokemon/gabite/back.4bpp.lz"); + const u32 gMonBackPic_Gabite[] = INCBIN_U32("graphics/pokemon/gabite/back.4bpp.smol"); const u16 gMonShinyPalette_Gabite[] = INCBIN_U16("graphics/pokemon/gabite/shiny.gbapal"); const u8 gMonIcon_Gabite[] = INCBIN_U8("graphics/pokemon/gabite/icon.4bpp"); #if P_FOOTPRINTS @@ -15021,16 +15075,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_GabiteF[] = INCBIN_U32("graphics/pokemon/gabite/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_GabiteF[] = INCBIN_U32("graphics/pokemon/gabite/backf.4bpp.lz"); + const u32 gMonFrontPic_GabiteF[] = INCBIN_U32("graphics/pokemon/gabite/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_GabiteF[] = INCBIN_U32("graphics/pokemon/gabite/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_GabiteF[] = INCBIN_COMP("graphics/pokemon/gabite/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Garchomp[] = INCBIN_U32("graphics/pokemon/garchomp/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Garchomp[] = INCBIN_U32("graphics/pokemon/garchomp/anim_front.4bpp.smol"); const u16 gMonPalette_Garchomp[] = INCBIN_U16("graphics/pokemon/garchomp/normal.gbapal"); - const u32 gMonBackPic_Garchomp[] = INCBIN_U32("graphics/pokemon/garchomp/back.4bpp.lz"); + const u32 gMonBackPic_Garchomp[] = INCBIN_U32("graphics/pokemon/garchomp/back.4bpp.smol"); const u16 gMonShinyPalette_Garchomp[] = INCBIN_U16("graphics/pokemon/garchomp/shiny.gbapal"); const u8 gMonIcon_Garchomp[] = INCBIN_U8("graphics/pokemon/garchomp/icon.4bpp"); #if P_FOOTPRINTS @@ -15045,16 +15099,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_GarchompF[] = INCBIN_U32("graphics/pokemon/garchomp/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_GarchompF[] = INCBIN_U32("graphics/pokemon/garchomp/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_GarchompF[] = INCBIN_COMP("graphics/pokemon/garchomp/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_GarchompMega[] = INCBIN_U32("graphics/pokemon/garchomp/mega/front.4bpp.lz"); + const u32 gMonFrontPic_GarchompMega[] = INCBIN_U32("graphics/pokemon/garchomp/mega/front.4bpp.smol"); const u16 gMonPalette_GarchompMega[] = INCBIN_U16("graphics/pokemon/garchomp/mega/normal.gbapal"); - const u32 gMonBackPic_GarchompMega[] = INCBIN_U32("graphics/pokemon/garchomp/mega/back.4bpp.lz"); + const u32 gMonBackPic_GarchompMega[] = INCBIN_U32("graphics/pokemon/garchomp/mega/back.4bpp.smol"); const u16 gMonShinyPalette_GarchompMega[] = INCBIN_U16("graphics/pokemon/garchomp/mega/shiny.gbapal"); const u8 gMonIcon_GarchompMega[] = INCBIN_U8("graphics/pokemon/garchomp/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -15068,9 +15122,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GIBLE #if P_FAMILY_RIOLU - const u32 gMonFrontPic_Riolu[] = INCBIN_U32("graphics/pokemon/riolu/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Riolu[] = INCBIN_U32("graphics/pokemon/riolu/anim_front.4bpp.smol"); const u16 gMonPalette_Riolu[] = INCBIN_U16("graphics/pokemon/riolu/normal.gbapal"); - const u32 gMonBackPic_Riolu[] = INCBIN_U32("graphics/pokemon/riolu/back.4bpp.lz"); + const u32 gMonBackPic_Riolu[] = INCBIN_U32("graphics/pokemon/riolu/back.4bpp.smol"); const u16 gMonShinyPalette_Riolu[] = INCBIN_U16("graphics/pokemon/riolu/shiny.gbapal"); const u8 gMonIcon_Riolu[] = INCBIN_U8("graphics/pokemon/riolu/icon.4bpp"); #if P_FOOTPRINTS @@ -15084,9 +15138,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Lucario[] = INCBIN_U32("graphics/pokemon/lucario/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lucario[] = INCBIN_U32("graphics/pokemon/lucario/anim_front.4bpp.smol"); const u16 gMonPalette_Lucario[] = INCBIN_U16("graphics/pokemon/lucario/normal.gbapal"); - const u32 gMonBackPic_Lucario[] = INCBIN_U32("graphics/pokemon/lucario/back.4bpp.lz"); + const u32 gMonBackPic_Lucario[] = INCBIN_U32("graphics/pokemon/lucario/back.4bpp.smol"); const u16 gMonShinyPalette_Lucario[] = INCBIN_U16("graphics/pokemon/lucario/shiny.gbapal"); const u8 gMonIcon_Lucario[] = INCBIN_U8("graphics/pokemon/lucario/icon.4bpp"); #if P_FOOTPRINTS @@ -15101,9 +15155,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_LucarioMega[] = INCBIN_U32("graphics/pokemon/lucario/mega/front.4bpp.lz"); + const u32 gMonFrontPic_LucarioMega[] = INCBIN_U32("graphics/pokemon/lucario/mega/front.4bpp.smol"); const u16 gMonPalette_LucarioMega[] = INCBIN_U16("graphics/pokemon/lucario/mega/normal.gbapal"); - const u32 gMonBackPic_LucarioMega[] = INCBIN_U32("graphics/pokemon/lucario/mega/back.4bpp.lz"); + const u32 gMonBackPic_LucarioMega[] = INCBIN_U32("graphics/pokemon/lucario/mega/back.4bpp.smol"); const u16 gMonShinyPalette_LucarioMega[] = INCBIN_U16("graphics/pokemon/lucario/mega/shiny.gbapal"); const u8 gMonIcon_LucarioMega[] = INCBIN_U8("graphics/pokemon/lucario/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -15117,9 +15171,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_RIOLU #if P_FAMILY_HIPPOPOTAS - const u32 gMonFrontPic_Hippopotas[] = INCBIN_U32("graphics/pokemon/hippopotas/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Hippopotas[] = INCBIN_U32("graphics/pokemon/hippopotas/anim_front.4bpp.smol"); const u16 gMonPalette_Hippopotas[] = INCBIN_U16("graphics/pokemon/hippopotas/normal.gbapal"); - const u32 gMonBackPic_Hippopotas[] = INCBIN_U32("graphics/pokemon/hippopotas/back.4bpp.lz"); + const u32 gMonBackPic_Hippopotas[] = INCBIN_U32("graphics/pokemon/hippopotas/back.4bpp.smol"); const u16 gMonShinyPalette_Hippopotas[] = INCBIN_U16("graphics/pokemon/hippopotas/shiny.gbapal"); const u8 gMonIcon_Hippopotas[] = INCBIN_U8("graphics/pokemon/hippopotas/icon.4bpp"); #if P_FOOTPRINTS @@ -15144,9 +15198,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Hippowdon[] = INCBIN_U32("graphics/pokemon/hippowdon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Hippowdon[] = INCBIN_U32("graphics/pokemon/hippowdon/anim_front.4bpp.smol"); const u16 gMonPalette_Hippowdon[] = INCBIN_U16("graphics/pokemon/hippowdon/normal.gbapal"); - const u32 gMonBackPic_Hippowdon[] = INCBIN_U32("graphics/pokemon/hippowdon/back.4bpp.lz"); + const u32 gMonBackPic_Hippowdon[] = INCBIN_U32("graphics/pokemon/hippowdon/back.4bpp.smol"); const u16 gMonShinyPalette_Hippowdon[] = INCBIN_U16("graphics/pokemon/hippowdon/shiny.gbapal"); const u8 gMonIcon_Hippowdon[] = INCBIN_U8("graphics/pokemon/hippowdon/icon.4bpp"); #if P_FOOTPRINTS @@ -15176,9 +15230,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_HIPPOPOTAS #if P_FAMILY_SKORUPI - const u32 gMonFrontPic_Skorupi[] = INCBIN_U32("graphics/pokemon/skorupi/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Skorupi[] = INCBIN_U32("graphics/pokemon/skorupi/anim_front.4bpp.smol"); const u16 gMonPalette_Skorupi[] = INCBIN_U16("graphics/pokemon/skorupi/normal.gbapal"); - const u32 gMonBackPic_Skorupi[] = INCBIN_U32("graphics/pokemon/skorupi/back.4bpp.lz"); + const u32 gMonBackPic_Skorupi[] = INCBIN_U32("graphics/pokemon/skorupi/back.4bpp.smol"); const u16 gMonShinyPalette_Skorupi[] = INCBIN_U16("graphics/pokemon/skorupi/shiny.gbapal"); const u8 gMonIcon_Skorupi[] = INCBIN_U8("graphics/pokemon/skorupi/icon.4bpp"); #if P_FOOTPRINTS @@ -15192,9 +15246,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Drapion[] = INCBIN_U32("graphics/pokemon/drapion/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Drapion[] = INCBIN_U32("graphics/pokemon/drapion/anim_front.4bpp.smol"); const u16 gMonPalette_Drapion[] = INCBIN_U16("graphics/pokemon/drapion/normal.gbapal"); - const u32 gMonBackPic_Drapion[] = INCBIN_U32("graphics/pokemon/drapion/back.4bpp.lz"); + const u32 gMonBackPic_Drapion[] = INCBIN_U32("graphics/pokemon/drapion/back.4bpp.smol"); const u16 gMonShinyPalette_Drapion[] = INCBIN_U16("graphics/pokemon/drapion/shiny.gbapal"); const u8 gMonIcon_Drapion[] = INCBIN_U8("graphics/pokemon/drapion/icon.4bpp"); #if P_FOOTPRINTS @@ -15210,9 +15264,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SKORUPI #if P_FAMILY_CROAGUNK - const u32 gMonFrontPic_Croagunk[] = INCBIN_U32("graphics/pokemon/croagunk/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Croagunk[] = INCBIN_U32("graphics/pokemon/croagunk/anim_front.4bpp.smol"); const u16 gMonPalette_Croagunk[] = INCBIN_U16("graphics/pokemon/croagunk/normal.gbapal"); - const u32 gMonBackPic_Croagunk[] = INCBIN_U32("graphics/pokemon/croagunk/back.4bpp.lz"); + const u32 gMonBackPic_Croagunk[] = INCBIN_U32("graphics/pokemon/croagunk/back.4bpp.smol"); const u16 gMonShinyPalette_Croagunk[] = INCBIN_U16("graphics/pokemon/croagunk/shiny.gbapal"); const u8 gMonIcon_Croagunk[] = INCBIN_U8("graphics/pokemon/croagunk/icon.4bpp"); #if P_FOOTPRINTS @@ -15227,16 +15281,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_CroagunkF[] = INCBIN_U32("graphics/pokemon/croagunk/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_CroagunkF[] = INCBIN_U32("graphics/pokemon/croagunk/backf.4bpp.lz"); + const u32 gMonFrontPic_CroagunkF[] = INCBIN_U32("graphics/pokemon/croagunk/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_CroagunkF[] = INCBIN_U32("graphics/pokemon/croagunk/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_CroagunkF[] = INCBIN_COMP("graphics/pokemon/croagunk/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Toxicroak[] = INCBIN_U32("graphics/pokemon/toxicroak/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Toxicroak[] = INCBIN_U32("graphics/pokemon/toxicroak/anim_front.4bpp.smol"); const u16 gMonPalette_Toxicroak[] = INCBIN_U16("graphics/pokemon/toxicroak/normal.gbapal"); - const u32 gMonBackPic_Toxicroak[] = INCBIN_U32("graphics/pokemon/toxicroak/back.4bpp.lz"); + const u32 gMonBackPic_Toxicroak[] = INCBIN_U32("graphics/pokemon/toxicroak/back.4bpp.smol"); const u16 gMonShinyPalette_Toxicroak[] = INCBIN_U16("graphics/pokemon/toxicroak/shiny.gbapal"); const u8 gMonIcon_Toxicroak[] = INCBIN_U8("graphics/pokemon/toxicroak/icon.4bpp"); #if P_FOOTPRINTS @@ -15251,8 +15305,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_ToxicroakF[] = INCBIN_U32("graphics/pokemon/toxicroak/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_ToxicroakF[] = INCBIN_U32("graphics/pokemon/toxicroak/backf.4bpp.lz"); + const u32 gMonFrontPic_ToxicroakF[] = INCBIN_U32("graphics/pokemon/toxicroak/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_ToxicroakF[] = INCBIN_U32("graphics/pokemon/toxicroak/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_ToxicroakF[] = INCBIN_COMP("graphics/pokemon/toxicroak/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -15260,9 +15314,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CROAGUNK #if P_FAMILY_CARNIVINE - const u32 gMonFrontPic_Carnivine[] = INCBIN_U32("graphics/pokemon/carnivine/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Carnivine[] = INCBIN_U32("graphics/pokemon/carnivine/anim_front.4bpp.smol"); const u16 gMonPalette_Carnivine[] = INCBIN_U16("graphics/pokemon/carnivine/normal.gbapal"); - const u32 gMonBackPic_Carnivine[] = INCBIN_U32("graphics/pokemon/carnivine/back.4bpp.lz"); + const u32 gMonBackPic_Carnivine[] = INCBIN_U32("graphics/pokemon/carnivine/back.4bpp.smol"); const u16 gMonShinyPalette_Carnivine[] = INCBIN_U16("graphics/pokemon/carnivine/shiny.gbapal"); const u8 gMonIcon_Carnivine[] = INCBIN_U8("graphics/pokemon/carnivine/icon.4bpp"); #if P_FOOTPRINTS @@ -15278,9 +15332,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CARNIVINE #if P_FAMILY_FINNEON - const u32 gMonFrontPic_Finneon[] = INCBIN_U32("graphics/pokemon/finneon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Finneon[] = INCBIN_U32("graphics/pokemon/finneon/anim_front.4bpp.smol"); const u16 gMonPalette_Finneon[] = INCBIN_U16("graphics/pokemon/finneon/normal.gbapal"); - const u32 gMonBackPic_Finneon[] = INCBIN_U32("graphics/pokemon/finneon/back.4bpp.lz"); + const u32 gMonBackPic_Finneon[] = INCBIN_U32("graphics/pokemon/finneon/back.4bpp.smol"); const u16 gMonShinyPalette_Finneon[] = INCBIN_U16("graphics/pokemon/finneon/shiny.gbapal"); const u8 gMonIcon_Finneon[] = INCBIN_U8("graphics/pokemon/finneon/icon.4bpp"); #if P_FOOTPRINTS @@ -15295,16 +15349,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_FinneonF[] = INCBIN_U32("graphics/pokemon/finneon/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_FinneonF[] = INCBIN_U32("graphics/pokemon/finneon/backf.4bpp.lz"); + const u32 gMonFrontPic_FinneonF[] = INCBIN_U32("graphics/pokemon/finneon/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_FinneonF[] = INCBIN_U32("graphics/pokemon/finneon/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_FinneonF[] = INCBIN_COMP("graphics/pokemon/finneon/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Lumineon[] = INCBIN_U32("graphics/pokemon/lumineon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lumineon[] = INCBIN_U32("graphics/pokemon/lumineon/anim_front.4bpp.smol"); const u16 gMonPalette_Lumineon[] = INCBIN_U16("graphics/pokemon/lumineon/normal.gbapal"); - const u32 gMonBackPic_Lumineon[] = INCBIN_U32("graphics/pokemon/lumineon/back.4bpp.lz"); + const u32 gMonBackPic_Lumineon[] = INCBIN_U32("graphics/pokemon/lumineon/back.4bpp.smol"); const u16 gMonShinyPalette_Lumineon[] = INCBIN_U16("graphics/pokemon/lumineon/shiny.gbapal"); const u8 gMonIcon_Lumineon[] = INCBIN_U8("graphics/pokemon/lumineon/icon.4bpp"); #if P_FOOTPRINTS @@ -15319,8 +15373,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_LumineonF[] = INCBIN_U32("graphics/pokemon/lumineon/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_LumineonF[] = INCBIN_U32("graphics/pokemon/lumineon/backf.4bpp.lz"); + const u32 gMonFrontPic_LumineonF[] = INCBIN_U32("graphics/pokemon/lumineon/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_LumineonF[] = INCBIN_U32("graphics/pokemon/lumineon/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_LumineonF[] = INCBIN_COMP("graphics/pokemon/lumineon/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -15328,9 +15382,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FINNEON #if P_FAMILY_SNOVER - const u32 gMonFrontPic_Snover[] = INCBIN_U32("graphics/pokemon/snover/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Snover[] = INCBIN_U32("graphics/pokemon/snover/anim_front.4bpp.smol"); const u16 gMonPalette_Snover[] = INCBIN_U16("graphics/pokemon/snover/normal.gbapal"); - const u32 gMonBackPic_Snover[] = INCBIN_U32("graphics/pokemon/snover/back.4bpp.lz"); + const u32 gMonBackPic_Snover[] = INCBIN_U32("graphics/pokemon/snover/back.4bpp.smol"); const u16 gMonShinyPalette_Snover[] = INCBIN_U16("graphics/pokemon/snover/shiny.gbapal"); const u8 gMonIcon_Snover[] = INCBIN_U8("graphics/pokemon/snover/icon.4bpp"); #if P_FOOTPRINTS @@ -15345,16 +15399,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_SnoverF[] = INCBIN_U32("graphics/pokemon/snover/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_SnoverF[] = INCBIN_U32("graphics/pokemon/snover/backf.4bpp.lz"); + const u32 gMonFrontPic_SnoverF[] = INCBIN_U32("graphics/pokemon/snover/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_SnoverF[] = INCBIN_U32("graphics/pokemon/snover/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_SnoverF[] = INCBIN_COMP("graphics/pokemon/snover/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Abomasnow[] = INCBIN_U32("graphics/pokemon/abomasnow/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Abomasnow[] = INCBIN_U32("graphics/pokemon/abomasnow/anim_front.4bpp.smol"); const u16 gMonPalette_Abomasnow[] = INCBIN_U16("graphics/pokemon/abomasnow/normal.gbapal"); - const u32 gMonBackPic_Abomasnow[] = INCBIN_U32("graphics/pokemon/abomasnow/back.4bpp.lz"); + const u32 gMonBackPic_Abomasnow[] = INCBIN_U32("graphics/pokemon/abomasnow/back.4bpp.smol"); const u16 gMonShinyPalette_Abomasnow[] = INCBIN_U16("graphics/pokemon/abomasnow/shiny.gbapal"); const u8 gMonIcon_Abomasnow[] = INCBIN_U8("graphics/pokemon/abomasnow/icon.4bpp"); #if P_FOOTPRINTS @@ -15369,16 +15423,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_AbomasnowF[] = INCBIN_U32("graphics/pokemon/abomasnow/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_AbomasnowF[] = INCBIN_U32("graphics/pokemon/abomasnow/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_AbomasnowF[] = INCBIN_COMP("graphics/pokemon/abomasnow/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_AbomasnowMega[] = INCBIN_U32("graphics/pokemon/abomasnow/mega/front.4bpp.lz"); + const u32 gMonFrontPic_AbomasnowMega[] = INCBIN_U32("graphics/pokemon/abomasnow/mega/front.4bpp.smol"); const u16 gMonPalette_AbomasnowMega[] = INCBIN_U16("graphics/pokemon/abomasnow/mega/normal.gbapal"); - const u32 gMonBackPic_AbomasnowMega[] = INCBIN_U32("graphics/pokemon/abomasnow/mega/back.4bpp.lz"); + const u32 gMonBackPic_AbomasnowMega[] = INCBIN_U32("graphics/pokemon/abomasnow/mega/back.4bpp.smol"); const u16 gMonShinyPalette_AbomasnowMega[] = INCBIN_U16("graphics/pokemon/abomasnow/mega/shiny.gbapal"); const u8 gMonIcon_AbomasnowMega[] = INCBIN_U8("graphics/pokemon/abomasnow/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -15392,42 +15446,42 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SNOVER #if P_FAMILY_ROTOM - const u32 gMonFrontPic_Rotom[] = INCBIN_U32("graphics/pokemon/rotom/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rotom[] = INCBIN_U32("graphics/pokemon/rotom/anim_front.4bpp.smol"); const u16 gMonPalette_Rotom[] = INCBIN_U16("graphics/pokemon/rotom/normal.gbapal"); - const u32 gMonBackPic_Rotom[] = INCBIN_U32("graphics/pokemon/rotom/back.4bpp.lz"); + const u32 gMonBackPic_Rotom[] = INCBIN_U32("graphics/pokemon/rotom/back.4bpp.smol"); const u16 gMonShinyPalette_Rotom[] = INCBIN_U16("graphics/pokemon/rotom/shiny.gbapal"); const u8 gMonIcon_Rotom[] = INCBIN_U8("graphics/pokemon/rotom/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Rotom[] = INCBIN_U8("graphics/pokemon/rotom/normal/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_RotomHeat[] = INCBIN_U32("graphics/pokemon/rotom/heat/anim_front.4bpp.lz"); + const u32 gMonFrontPic_RotomHeat[] = INCBIN_U32("graphics/pokemon/rotom/heat/anim_front.4bpp.smol"); const u16 gMonPalette_RotomHeat[] = INCBIN_U16("graphics/pokemon/rotom/heat/normal.gbapal"); - const u32 gMonBackPic_RotomHeat[] = INCBIN_U32("graphics/pokemon/rotom/heat/back.4bpp.lz"); + const u32 gMonBackPic_RotomHeat[] = INCBIN_U32("graphics/pokemon/rotom/heat/back.4bpp.smol"); const u16 gMonShinyPalette_RotomHeat[] = INCBIN_U16("graphics/pokemon/rotom/heat/shiny.gbapal"); const u8 gMonIcon_RotomHeat[] = INCBIN_U8("graphics/pokemon/rotom/heat/icon.4bpp"); - const u32 gMonFrontPic_RotomWash[] = INCBIN_U32("graphics/pokemon/rotom/wash/anim_front.4bpp.lz"); + const u32 gMonFrontPic_RotomWash[] = INCBIN_U32("graphics/pokemon/rotom/wash/anim_front.4bpp.smol"); const u16 gMonPalette_RotomWash[] = INCBIN_U16("graphics/pokemon/rotom/wash/normal.gbapal"); - const u32 gMonBackPic_RotomWash[] = INCBIN_U32("graphics/pokemon/rotom/wash/back.4bpp.lz"); + const u32 gMonBackPic_RotomWash[] = INCBIN_U32("graphics/pokemon/rotom/wash/back.4bpp.smol"); const u16 gMonShinyPalette_RotomWash[] = INCBIN_U16("graphics/pokemon/rotom/wash/shiny.gbapal"); const u8 gMonIcon_RotomWash[] = INCBIN_U8("graphics/pokemon/rotom/wash/icon.4bpp"); - const u32 gMonFrontPic_RotomFrost[] = INCBIN_U32("graphics/pokemon/rotom/frost/anim_front.4bpp.lz"); + const u32 gMonFrontPic_RotomFrost[] = INCBIN_U32("graphics/pokemon/rotom/frost/anim_front.4bpp.smol"); const u16 gMonPalette_RotomFrost[] = INCBIN_U16("graphics/pokemon/rotom/frost/normal.gbapal"); - const u32 gMonBackPic_RotomFrost[] = INCBIN_U32("graphics/pokemon/rotom/frost/back.4bpp.lz"); + const u32 gMonBackPic_RotomFrost[] = INCBIN_U32("graphics/pokemon/rotom/frost/back.4bpp.smol"); const u16 gMonShinyPalette_RotomFrost[] = INCBIN_U16("graphics/pokemon/rotom/frost/shiny.gbapal"); const u8 gMonIcon_RotomFrost[] = INCBIN_U8("graphics/pokemon/rotom/frost/icon.4bpp"); - const u32 gMonFrontPic_RotomFan[] = INCBIN_U32("graphics/pokemon/rotom/fan/anim_front.4bpp.lz"); + const u32 gMonFrontPic_RotomFan[] = INCBIN_U32("graphics/pokemon/rotom/fan/anim_front.4bpp.smol"); const u16 gMonPalette_RotomFan[] = INCBIN_U16("graphics/pokemon/rotom/fan/normal.gbapal"); - const u32 gMonBackPic_RotomFan[] = INCBIN_U32("graphics/pokemon/rotom/fan/back.4bpp.lz"); + const u32 gMonBackPic_RotomFan[] = INCBIN_U32("graphics/pokemon/rotom/fan/back.4bpp.smol"); const u16 gMonShinyPalette_RotomFan[] = INCBIN_U16("graphics/pokemon/rotom/fan/shiny.gbapal"); const u8 gMonIcon_RotomFan[] = INCBIN_U8("graphics/pokemon/rotom/fan/icon.4bpp"); - const u32 gMonFrontPic_RotomMow[] = INCBIN_U32("graphics/pokemon/rotom/mow/anim_front.4bpp.lz"); + const u32 gMonFrontPic_RotomMow[] = INCBIN_U32("graphics/pokemon/rotom/mow/anim_front.4bpp.smol"); const u16 gMonPalette_RotomMow[] = INCBIN_U16("graphics/pokemon/rotom/mow/normal.gbapal"); - const u32 gMonBackPic_RotomMow[] = INCBIN_U32("graphics/pokemon/rotom/mow/back.4bpp.lz"); + const u32 gMonBackPic_RotomMow[] = INCBIN_U32("graphics/pokemon/rotom/mow/back.4bpp.smol"); const u16 gMonShinyPalette_RotomMow[] = INCBIN_U16("graphics/pokemon/rotom/mow/shiny.gbapal"); const u8 gMonIcon_RotomMow[] = INCBIN_U8("graphics/pokemon/rotom/mow/icon.4bpp"); @@ -15456,9 +15510,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ROTOM #if P_FAMILY_UXIE - const u32 gMonFrontPic_Uxie[] = INCBIN_U32("graphics/pokemon/uxie/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Uxie[] = INCBIN_U32("graphics/pokemon/uxie/anim_front.4bpp.smol"); const u16 gMonPalette_Uxie[] = INCBIN_U16("graphics/pokemon/uxie/normal.gbapal"); - const u32 gMonBackPic_Uxie[] = INCBIN_U32("graphics/pokemon/uxie/back.4bpp.lz"); + const u32 gMonBackPic_Uxie[] = INCBIN_U32("graphics/pokemon/uxie/back.4bpp.smol"); const u16 gMonShinyPalette_Uxie[] = INCBIN_U16("graphics/pokemon/uxie/shiny.gbapal"); const u8 gMonIcon_Uxie[] = INCBIN_U8("graphics/pokemon/uxie/icon.4bpp"); #if P_FOOTPRINTS @@ -15474,9 +15528,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_UXIE #if P_FAMILY_MESPRIT - const u32 gMonFrontPic_Mesprit[] = INCBIN_U32("graphics/pokemon/mesprit/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mesprit[] = INCBIN_U32("graphics/pokemon/mesprit/anim_front.4bpp.smol"); const u16 gMonPalette_Mesprit[] = INCBIN_U16("graphics/pokemon/mesprit/normal.gbapal"); - const u32 gMonBackPic_Mesprit[] = INCBIN_U32("graphics/pokemon/mesprit/back.4bpp.lz"); + const u32 gMonBackPic_Mesprit[] = INCBIN_U32("graphics/pokemon/mesprit/back.4bpp.smol"); const u16 gMonShinyPalette_Mesprit[] = INCBIN_U16("graphics/pokemon/mesprit/shiny.gbapal"); const u8 gMonIcon_Mesprit[] = INCBIN_U8("graphics/pokemon/mesprit/icon.4bpp"); #if P_FOOTPRINTS @@ -15492,9 +15546,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MESPRIT #if P_FAMILY_AZELF - const u32 gMonFrontPic_Azelf[] = INCBIN_U32("graphics/pokemon/azelf/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Azelf[] = INCBIN_U32("graphics/pokemon/azelf/anim_front.4bpp.smol"); const u16 gMonPalette_Azelf[] = INCBIN_U16("graphics/pokemon/azelf/normal.gbapal"); - const u32 gMonBackPic_Azelf[] = INCBIN_U32("graphics/pokemon/azelf/back.4bpp.lz"); + const u32 gMonBackPic_Azelf[] = INCBIN_U32("graphics/pokemon/azelf/back.4bpp.smol"); const u16 gMonShinyPalette_Azelf[] = INCBIN_U16("graphics/pokemon/azelf/shiny.gbapal"); const u8 gMonIcon_Azelf[] = INCBIN_U8("graphics/pokemon/azelf/icon.4bpp"); #if P_FOOTPRINTS @@ -15510,9 +15564,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_AZELF #if P_FAMILY_DIALGA - const u32 gMonFrontPic_Dialga[] = INCBIN_U32("graphics/pokemon/dialga/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dialga[] = INCBIN_U32("graphics/pokemon/dialga/anim_front.4bpp.smol"); const u16 gMonPalette_Dialga[] = INCBIN_U16("graphics/pokemon/dialga/normal.gbapal"); - const u32 gMonBackPic_Dialga[] = INCBIN_U32("graphics/pokemon/dialga/back.4bpp.lz"); + const u32 gMonBackPic_Dialga[] = INCBIN_U32("graphics/pokemon/dialga/back.4bpp.smol"); const u16 gMonShinyPalette_Dialga[] = INCBIN_U16("graphics/pokemon/dialga/shiny.gbapal"); const u8 gMonIcon_Dialga[] = INCBIN_U8("graphics/pokemon/dialga/icon.4bpp"); #if P_FOOTPRINTS @@ -15526,9 +15580,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_DialgaOrigin[] = INCBIN_U32("graphics/pokemon/dialga/origin/front.4bpp.lz"); + const u32 gMonFrontPic_DialgaOrigin[] = INCBIN_U32("graphics/pokemon/dialga/origin/front.4bpp.smol"); const u16 gMonPalette_DialgaOrigin[] = INCBIN_U16("graphics/pokemon/dialga/origin/normal.gbapal"); - const u32 gMonBackPic_DialgaOrigin[] = INCBIN_U32("graphics/pokemon/dialga/origin/back.4bpp.lz"); + const u32 gMonBackPic_DialgaOrigin[] = INCBIN_U32("graphics/pokemon/dialga/origin/back.4bpp.smol"); const u16 gMonShinyPalette_DialgaOrigin[] = INCBIN_U16("graphics/pokemon/dialga/origin/shiny.gbapal"); const u8 gMonIcon_DialgaOrigin[] = INCBIN_U8("graphics/pokemon/dialga/origin/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -15541,9 +15595,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DIALGA #if P_FAMILY_PALKIA - const u32 gMonFrontPic_Palkia[] = INCBIN_U32("graphics/pokemon/palkia/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Palkia[] = INCBIN_U32("graphics/pokemon/palkia/anim_front.4bpp.smol"); const u16 gMonPalette_Palkia[] = INCBIN_U16("graphics/pokemon/palkia/normal.gbapal"); - const u32 gMonBackPic_Palkia[] = INCBIN_U32("graphics/pokemon/palkia/back.4bpp.lz"); + const u32 gMonBackPic_Palkia[] = INCBIN_U32("graphics/pokemon/palkia/back.4bpp.smol"); const u16 gMonShinyPalette_Palkia[] = INCBIN_U16("graphics/pokemon/palkia/shiny.gbapal"); const u8 gMonIcon_Palkia[] = INCBIN_U8("graphics/pokemon/palkia/icon.4bpp"); #if P_FOOTPRINTS @@ -15557,9 +15611,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_PalkiaOrigin[] = INCBIN_U32("graphics/pokemon/palkia/origin/front.4bpp.lz"); + const u32 gMonFrontPic_PalkiaOrigin[] = INCBIN_U32("graphics/pokemon/palkia/origin/front.4bpp.smol"); const u16 gMonPalette_PalkiaOrigin[] = INCBIN_U16("graphics/pokemon/palkia/origin/normal.gbapal"); - const u32 gMonBackPic_PalkiaOrigin[] = INCBIN_U32("graphics/pokemon/palkia/origin/back.4bpp.lz"); + const u32 gMonBackPic_PalkiaOrigin[] = INCBIN_U32("graphics/pokemon/palkia/origin/back.4bpp.smol"); const u16 gMonShinyPalette_PalkiaOrigin[] = INCBIN_U16("graphics/pokemon/palkia/origin/shiny.gbapal"); const u8 gMonIcon_PalkiaOrigin[] = INCBIN_U8("graphics/pokemon/palkia/origin/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -15572,9 +15626,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PALKIA #if P_FAMILY_HEATRAN - const u32 gMonFrontPic_Heatran[] = INCBIN_U32("graphics/pokemon/heatran/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Heatran[] = INCBIN_U32("graphics/pokemon/heatran/anim_front.4bpp.smol"); const u16 gMonPalette_Heatran[] = INCBIN_U16("graphics/pokemon/heatran/normal.gbapal"); - const u32 gMonBackPic_Heatran[] = INCBIN_U32("graphics/pokemon/heatran/back.4bpp.lz"); + const u32 gMonBackPic_Heatran[] = INCBIN_U32("graphics/pokemon/heatran/back.4bpp.smol"); const u16 gMonShinyPalette_Heatran[] = INCBIN_U16("graphics/pokemon/heatran/shiny.gbapal"); const u8 gMonIcon_Heatran[] = INCBIN_U8("graphics/pokemon/heatran/icon.4bpp"); #if P_FOOTPRINTS @@ -15590,9 +15644,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_HEATRAN #if P_FAMILY_REGIGIGAS - const u32 gMonFrontPic_Regigigas[] = INCBIN_U32("graphics/pokemon/regigigas/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Regigigas[] = INCBIN_U32("graphics/pokemon/regigigas/anim_front.4bpp.smol"); const u16 gMonPalette_Regigigas[] = INCBIN_U16("graphics/pokemon/regigigas/normal.gbapal"); - const u32 gMonBackPic_Regigigas[] = INCBIN_U32("graphics/pokemon/regigigas/back.4bpp.lz"); + const u32 gMonBackPic_Regigigas[] = INCBIN_U32("graphics/pokemon/regigigas/back.4bpp.smol"); const u16 gMonShinyPalette_Regigigas[] = INCBIN_U16("graphics/pokemon/regigigas/shiny.gbapal"); const u8 gMonIcon_Regigigas[] = INCBIN_U8("graphics/pokemon/regigigas/icon.4bpp"); #if P_FOOTPRINTS @@ -15608,9 +15662,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_REGIGIGAS #if P_FAMILY_GIRATINA - const u32 gMonFrontPic_GiratinaAltered[] = INCBIN_U32("graphics/pokemon/giratina/anim_front.4bpp.lz"); + const u32 gMonFrontPic_GiratinaAltered[] = INCBIN_U32("graphics/pokemon/giratina/anim_front.4bpp.smol"); const u16 gMonPalette_GiratinaAltered[] = INCBIN_U16("graphics/pokemon/giratina/normal.gbapal"); - const u32 gMonBackPic_GiratinaAltered[] = INCBIN_U32("graphics/pokemon/giratina/back.4bpp.lz"); + const u32 gMonBackPic_GiratinaAltered[] = INCBIN_U32("graphics/pokemon/giratina/back.4bpp.smol"); const u16 gMonShinyPalette_GiratinaAltered[] = INCBIN_U16("graphics/pokemon/giratina/shiny.gbapal"); const u8 gMonIcon_GiratinaAltered[] = INCBIN_U8("graphics/pokemon/giratina/icon.4bpp"); #if P_FOOTPRINTS @@ -15624,9 +15678,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_GiratinaOrigin[] = INCBIN_U32("graphics/pokemon/giratina/origin/anim_front.4bpp.lz"); + const u32 gMonFrontPic_GiratinaOrigin[] = INCBIN_U32("graphics/pokemon/giratina/origin/anim_front.4bpp.smol"); const u16 gMonPalette_GiratinaOrigin[] = INCBIN_U16("graphics/pokemon/giratina/origin/normal.gbapal"); - const u32 gMonBackPic_GiratinaOrigin[] = INCBIN_U32("graphics/pokemon/giratina/origin/back.4bpp.lz"); + const u32 gMonBackPic_GiratinaOrigin[] = INCBIN_U32("graphics/pokemon/giratina/origin/back.4bpp.smol"); const u16 gMonShinyPalette_GiratinaOrigin[] = INCBIN_U16("graphics/pokemon/giratina/origin/shiny.gbapal"); const u8 gMonIcon_GiratinaOrigin[] = INCBIN_U8("graphics/pokemon/giratina/origin/icon.4bpp"); #if P_FOOTPRINTS @@ -15642,9 +15696,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GIRATINA #if P_FAMILY_CRESSELIA - const u32 gMonFrontPic_Cresselia[] = INCBIN_U32("graphics/pokemon/cresselia/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cresselia[] = INCBIN_U32("graphics/pokemon/cresselia/anim_front.4bpp.smol"); const u16 gMonPalette_Cresselia[] = INCBIN_U16("graphics/pokemon/cresselia/normal.gbapal"); - const u32 gMonBackPic_Cresselia[] = INCBIN_U32("graphics/pokemon/cresselia/back.4bpp.lz"); + const u32 gMonBackPic_Cresselia[] = INCBIN_U32("graphics/pokemon/cresselia/back.4bpp.smol"); const u16 gMonShinyPalette_Cresselia[] = INCBIN_U16("graphics/pokemon/cresselia/shiny.gbapal"); const u8 gMonIcon_Cresselia[] = INCBIN_U8("graphics/pokemon/cresselia/icon.4bpp"); #if P_FOOTPRINTS @@ -15660,9 +15714,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CRESSELIA #if P_FAMILY_MANAPHY - const u32 gMonFrontPic_Phione[] = INCBIN_U32("graphics/pokemon/phione/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Phione[] = INCBIN_U32("graphics/pokemon/phione/anim_front.4bpp.smol"); const u16 gMonPalette_Phione[] = INCBIN_U16("graphics/pokemon/phione/normal.gbapal"); - const u32 gMonBackPic_Phione[] = INCBIN_U32("graphics/pokemon/phione/back.4bpp.lz"); + const u32 gMonBackPic_Phione[] = INCBIN_U32("graphics/pokemon/phione/back.4bpp.smol"); const u16 gMonShinyPalette_Phione[] = INCBIN_U16("graphics/pokemon/phione/shiny.gbapal"); const u8 gMonIcon_Phione[] = INCBIN_U8("graphics/pokemon/phione/icon.4bpp"); #if P_FOOTPRINTS @@ -15676,9 +15730,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Manaphy[] = INCBIN_U32("graphics/pokemon/manaphy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Manaphy[] = INCBIN_U32("graphics/pokemon/manaphy/anim_front.4bpp.smol"); const u16 gMonPalette_Manaphy[] = INCBIN_U16("graphics/pokemon/manaphy/normal.gbapal"); - const u32 gMonBackPic_Manaphy[] = INCBIN_U32("graphics/pokemon/manaphy/back.4bpp.lz"); + const u32 gMonBackPic_Manaphy[] = INCBIN_U32("graphics/pokemon/manaphy/back.4bpp.smol"); const u16 gMonShinyPalette_Manaphy[] = INCBIN_U16("graphics/pokemon/manaphy/shiny.gbapal"); const u8 gMonIcon_Manaphy[] = INCBIN_U8("graphics/pokemon/manaphy/icon.4bpp"); #if P_FOOTPRINTS @@ -15694,9 +15748,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MANAPHY #if P_FAMILY_DARKRAI - const u32 gMonFrontPic_Darkrai[] = INCBIN_U32("graphics/pokemon/darkrai/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Darkrai[] = INCBIN_U32("graphics/pokemon/darkrai/anim_front.4bpp.smol"); const u16 gMonPalette_Darkrai[] = INCBIN_U16("graphics/pokemon/darkrai/normal.gbapal"); - const u32 gMonBackPic_Darkrai[] = INCBIN_U32("graphics/pokemon/darkrai/back.4bpp.lz"); + const u32 gMonBackPic_Darkrai[] = INCBIN_U32("graphics/pokemon/darkrai/back.4bpp.smol"); const u16 gMonShinyPalette_Darkrai[] = INCBIN_U16("graphics/pokemon/darkrai/shiny.gbapal"); const u8 gMonIcon_Darkrai[] = INCBIN_U8("graphics/pokemon/darkrai/icon.4bpp"); #if P_FOOTPRINTS @@ -15712,9 +15766,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DARKRAI #if P_FAMILY_SHAYMIN - const u32 gMonFrontPic_ShayminLand[] = INCBIN_U32("graphics/pokemon/shaymin/anim_front.4bpp.lz"); + const u32 gMonFrontPic_ShayminLand[] = INCBIN_U32("graphics/pokemon/shaymin/anim_front.4bpp.smol"); const u16 gMonPalette_ShayminLand[] = INCBIN_U16("graphics/pokemon/shaymin/normal.gbapal"); - const u32 gMonBackPic_ShayminLand[] = INCBIN_U32("graphics/pokemon/shaymin/back.4bpp.lz"); + const u32 gMonBackPic_ShayminLand[] = INCBIN_U32("graphics/pokemon/shaymin/back.4bpp.smol"); const u16 gMonShinyPalette_ShayminLand[] = INCBIN_U16("graphics/pokemon/shaymin/shiny.gbapal"); const u8 gMonIcon_ShayminLand[] = INCBIN_U8("graphics/pokemon/shaymin/icon.4bpp"); #if P_FOOTPRINTS @@ -15728,9 +15782,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_ShayminSky[] = INCBIN_U32("graphics/pokemon/shaymin/sky/anim_front.4bpp.lz"); + const u32 gMonFrontPic_ShayminSky[] = INCBIN_U32("graphics/pokemon/shaymin/sky/anim_front.4bpp.smol"); const u16 gMonPalette_ShayminSky[] = INCBIN_U16("graphics/pokemon/shaymin/sky/normal.gbapal"); - const u32 gMonBackPic_ShayminSky[] = INCBIN_U32("graphics/pokemon/shaymin/sky/back.4bpp.lz"); + const u32 gMonBackPic_ShayminSky[] = INCBIN_U32("graphics/pokemon/shaymin/sky/back.4bpp.smol"); const u16 gMonShinyPalette_ShayminSky[] = INCBIN_U16("graphics/pokemon/shaymin/sky/shiny.gbapal"); const u8 gMonIcon_ShayminSky[] = INCBIN_U8("graphics/pokemon/shaymin/sky/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -15743,8 +15797,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SHAYMIN #if P_FAMILY_ARCEUS - const u32 gMonFrontPic_Arceus[] = INCBIN_U32("graphics/pokemon/arceus/anim_front.4bpp.lz"); - const u32 gMonBackPic_Arceus[] = INCBIN_U32("graphics/pokemon/arceus/back.4bpp.lz"); + const u32 gMonFrontPic_Arceus[] = INCBIN_U32("graphics/pokemon/arceus/anim_front.4bpp.smol"); + const u32 gMonBackPic_Arceus[] = INCBIN_U32("graphics/pokemon/arceus/back.4bpp.smol"); #if P_FOOTPRINTS const u8 gMonFootprint_Arceus[] = INCBIN_U8("graphics/pokemon/arceus/footprint.1bpp"); #endif //P_FOOTPRINTS @@ -15884,9 +15938,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ARCEUS #if P_FAMILY_VICTINI - const u32 gMonFrontPic_Victini[] = INCBIN_U32("graphics/pokemon/victini/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Victini[] = INCBIN_U32("graphics/pokemon/victini/anim_front.4bpp.smol"); const u16 gMonPalette_Victini[] = INCBIN_U16("graphics/pokemon/victini/normal.gbapal"); - const u32 gMonBackPic_Victini[] = INCBIN_U32("graphics/pokemon/victini/back.4bpp.lz"); + const u32 gMonBackPic_Victini[] = INCBIN_U32("graphics/pokemon/victini/back.4bpp.smol"); const u16 gMonShinyPalette_Victini[] = INCBIN_U16("graphics/pokemon/victini/shiny.gbapal"); const u8 gMonIcon_Victini[] = INCBIN_U8("graphics/pokemon/victini/icon.4bpp"); #if P_FOOTPRINTS @@ -15902,9 +15956,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_VICTINI #if P_FAMILY_SNIVY - const u32 gMonFrontPic_Snivy[] = INCBIN_U32("graphics/pokemon/snivy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Snivy[] = INCBIN_U32("graphics/pokemon/snivy/anim_front.4bpp.smol"); const u16 gMonPalette_Snivy[] = INCBIN_U16("graphics/pokemon/snivy/normal.gbapal"); - const u32 gMonBackPic_Snivy[] = INCBIN_U32("graphics/pokemon/snivy/back.4bpp.lz"); + const u32 gMonBackPic_Snivy[] = INCBIN_U32("graphics/pokemon/snivy/back.4bpp.smol"); const u16 gMonShinyPalette_Snivy[] = INCBIN_U16("graphics/pokemon/snivy/shiny.gbapal"); const u8 gMonIcon_Snivy[] = INCBIN_U8("graphics/pokemon/snivy/icon.4bpp"); #if P_FOOTPRINTS @@ -15918,9 +15972,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Servine[] = INCBIN_U32("graphics/pokemon/servine/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Servine[] = INCBIN_U32("graphics/pokemon/servine/anim_front.4bpp.smol"); const u16 gMonPalette_Servine[] = INCBIN_U16("graphics/pokemon/servine/normal.gbapal"); - const u32 gMonBackPic_Servine[] = INCBIN_U32("graphics/pokemon/servine/back.4bpp.lz"); + const u32 gMonBackPic_Servine[] = INCBIN_U32("graphics/pokemon/servine/back.4bpp.smol"); const u16 gMonShinyPalette_Servine[] = INCBIN_U16("graphics/pokemon/servine/shiny.gbapal"); const u8 gMonIcon_Servine[] = INCBIN_U8("graphics/pokemon/servine/icon.4bpp"); #if P_FOOTPRINTS @@ -15934,9 +15988,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Serperior[] = INCBIN_U32("graphics/pokemon/serperior/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Serperior[] = INCBIN_U32("graphics/pokemon/serperior/anim_front.4bpp.smol"); const u16 gMonPalette_Serperior[] = INCBIN_U16("graphics/pokemon/serperior/normal.gbapal"); - const u32 gMonBackPic_Serperior[] = INCBIN_U32("graphics/pokemon/serperior/back.4bpp.lz"); + const u32 gMonBackPic_Serperior[] = INCBIN_U32("graphics/pokemon/serperior/back.4bpp.smol"); const u16 gMonShinyPalette_Serperior[] = INCBIN_U16("graphics/pokemon/serperior/shiny.gbapal"); const u8 gMonIcon_Serperior[] = INCBIN_U8("graphics/pokemon/serperior/icon.4bpp"); #if P_FOOTPRINTS @@ -15952,9 +16006,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SNIVY #if P_FAMILY_TEPIG - const u32 gMonFrontPic_Tepig[] = INCBIN_U32("graphics/pokemon/tepig/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tepig[] = INCBIN_U32("graphics/pokemon/tepig/anim_front.4bpp.smol"); const u16 gMonPalette_Tepig[] = INCBIN_U16("graphics/pokemon/tepig/normal.gbapal"); - const u32 gMonBackPic_Tepig[] = INCBIN_U32("graphics/pokemon/tepig/back.4bpp.lz"); + const u32 gMonBackPic_Tepig[] = INCBIN_U32("graphics/pokemon/tepig/back.4bpp.smol"); const u16 gMonShinyPalette_Tepig[] = INCBIN_U16("graphics/pokemon/tepig/shiny.gbapal"); const u8 gMonIcon_Tepig[] = INCBIN_U8("graphics/pokemon/tepig/icon.4bpp"); #if P_FOOTPRINTS @@ -15968,9 +16022,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Pignite[] = INCBIN_U32("graphics/pokemon/pignite/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pignite[] = INCBIN_U32("graphics/pokemon/pignite/anim_front.4bpp.smol"); const u16 gMonPalette_Pignite[] = INCBIN_U16("graphics/pokemon/pignite/normal.gbapal"); - const u32 gMonBackPic_Pignite[] = INCBIN_U32("graphics/pokemon/pignite/back.4bpp.lz"); + const u32 gMonBackPic_Pignite[] = INCBIN_U32("graphics/pokemon/pignite/back.4bpp.smol"); const u16 gMonShinyPalette_Pignite[] = INCBIN_U16("graphics/pokemon/pignite/shiny.gbapal"); const u8 gMonIcon_Pignite[] = INCBIN_U8("graphics/pokemon/pignite/icon.4bpp"); #if P_FOOTPRINTS @@ -15984,9 +16038,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Emboar[] = INCBIN_U32("graphics/pokemon/emboar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Emboar[] = INCBIN_U32("graphics/pokemon/emboar/anim_front.4bpp.smol"); const u16 gMonPalette_Emboar[] = INCBIN_U16("graphics/pokemon/emboar/normal.gbapal"); - const u32 gMonBackPic_Emboar[] = INCBIN_U32("graphics/pokemon/emboar/back.4bpp.lz"); + const u32 gMonBackPic_Emboar[] = INCBIN_U32("graphics/pokemon/emboar/back.4bpp.smol"); const u16 gMonShinyPalette_Emboar[] = INCBIN_U16("graphics/pokemon/emboar/shiny.gbapal"); const u8 gMonIcon_Emboar[] = INCBIN_U8("graphics/pokemon/emboar/icon.4bpp"); #if P_FOOTPRINTS @@ -16002,9 +16056,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TEPIG #if P_FAMILY_OSHAWOTT - const u32 gMonFrontPic_Oshawott[] = INCBIN_U32("graphics/pokemon/oshawott/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Oshawott[] = INCBIN_U32("graphics/pokemon/oshawott/anim_front.4bpp.smol"); const u16 gMonPalette_Oshawott[] = INCBIN_U16("graphics/pokemon/oshawott/normal.gbapal"); - const u32 gMonBackPic_Oshawott[] = INCBIN_U32("graphics/pokemon/oshawott/back.4bpp.lz"); + const u32 gMonBackPic_Oshawott[] = INCBIN_U32("graphics/pokemon/oshawott/back.4bpp.smol"); const u16 gMonShinyPalette_Oshawott[] = INCBIN_U16("graphics/pokemon/oshawott/shiny.gbapal"); const u8 gMonIcon_Oshawott[] = INCBIN_U8("graphics/pokemon/oshawott/icon.4bpp"); #if P_FOOTPRINTS @@ -16018,9 +16072,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Dewott[] = INCBIN_U32("graphics/pokemon/dewott/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dewott[] = INCBIN_U32("graphics/pokemon/dewott/anim_front.4bpp.smol"); const u16 gMonPalette_Dewott[] = INCBIN_U16("graphics/pokemon/dewott/normal.gbapal"); - const u32 gMonBackPic_Dewott[] = INCBIN_U32("graphics/pokemon/dewott/back.4bpp.lz"); + const u32 gMonBackPic_Dewott[] = INCBIN_U32("graphics/pokemon/dewott/back.4bpp.smol"); const u16 gMonShinyPalette_Dewott[] = INCBIN_U16("graphics/pokemon/dewott/shiny.gbapal"); const u8 gMonIcon_Dewott[] = INCBIN_U8("graphics/pokemon/dewott/icon.4bpp"); #if P_FOOTPRINTS @@ -16034,9 +16088,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Samurott[] = INCBIN_U32("graphics/pokemon/samurott/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Samurott[] = INCBIN_U32("graphics/pokemon/samurott/anim_front.4bpp.smol"); const u16 gMonPalette_Samurott[] = INCBIN_U16("graphics/pokemon/samurott/normal.gbapal"); - const u32 gMonBackPic_Samurott[] = INCBIN_U32("graphics/pokemon/samurott/back.4bpp.lz"); + const u32 gMonBackPic_Samurott[] = INCBIN_U32("graphics/pokemon/samurott/back.4bpp.smol"); const u16 gMonShinyPalette_Samurott[] = INCBIN_U16("graphics/pokemon/samurott/shiny.gbapal"); const u8 gMonIcon_Samurott[] = INCBIN_U8("graphics/pokemon/samurott/icon.4bpp"); #if P_FOOTPRINTS @@ -16051,9 +16105,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_SamurottHisui[] = INCBIN_U32("graphics/pokemon/samurott/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_SamurottHisui[] = INCBIN_U32("graphics/pokemon/samurott/hisui/front.4bpp.smol"); const u16 gMonPalette_SamurottHisui[] = INCBIN_U16("graphics/pokemon/samurott/hisui/normal.gbapal"); - const u32 gMonBackPic_SamurottHisui[] = INCBIN_U32("graphics/pokemon/samurott/hisui/back.4bpp.lz"); + const u32 gMonBackPic_SamurottHisui[] = INCBIN_U32("graphics/pokemon/samurott/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_SamurottHisui[] = INCBIN_U16("graphics/pokemon/samurott/hisui/shiny.gbapal"); const u8 gMonIcon_SamurottHisui[] = INCBIN_U8("graphics/pokemon/samurott/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -16067,9 +16121,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_OSHAWOTT #if P_FAMILY_PATRAT - const u32 gMonFrontPic_Patrat[] = INCBIN_U32("graphics/pokemon/patrat/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Patrat[] = INCBIN_U32("graphics/pokemon/patrat/anim_front.4bpp.smol"); const u16 gMonPalette_Patrat[] = INCBIN_U16("graphics/pokemon/patrat/normal.gbapal"); - const u32 gMonBackPic_Patrat[] = INCBIN_U32("graphics/pokemon/patrat/back.4bpp.lz"); + const u32 gMonBackPic_Patrat[] = INCBIN_U32("graphics/pokemon/patrat/back.4bpp.smol"); const u16 gMonShinyPalette_Patrat[] = INCBIN_U16("graphics/pokemon/patrat/shiny.gbapal"); const u8 gMonIcon_Patrat[] = INCBIN_U8("graphics/pokemon/patrat/icon.4bpp"); #if P_FOOTPRINTS @@ -16083,9 +16137,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Watchog[] = INCBIN_U32("graphics/pokemon/watchog/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Watchog[] = INCBIN_U32("graphics/pokemon/watchog/anim_front.4bpp.smol"); const u16 gMonPalette_Watchog[] = INCBIN_U16("graphics/pokemon/watchog/normal.gbapal"); - const u32 gMonBackPic_Watchog[] = INCBIN_U32("graphics/pokemon/watchog/back.4bpp.lz"); + const u32 gMonBackPic_Watchog[] = INCBIN_U32("graphics/pokemon/watchog/back.4bpp.smol"); const u16 gMonShinyPalette_Watchog[] = INCBIN_U16("graphics/pokemon/watchog/shiny.gbapal"); const u8 gMonIcon_Watchog[] = INCBIN_U8("graphics/pokemon/watchog/icon.4bpp"); #if P_FOOTPRINTS @@ -16101,9 +16155,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PATRAT #if P_FAMILY_LILLIPUP - const u32 gMonFrontPic_Lillipup[] = INCBIN_U32("graphics/pokemon/lillipup/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lillipup[] = INCBIN_U32("graphics/pokemon/lillipup/anim_front.4bpp.smol"); const u16 gMonPalette_Lillipup[] = INCBIN_U16("graphics/pokemon/lillipup/normal.gbapal"); - const u32 gMonBackPic_Lillipup[] = INCBIN_U32("graphics/pokemon/lillipup/back.4bpp.lz"); + const u32 gMonBackPic_Lillipup[] = INCBIN_U32("graphics/pokemon/lillipup/back.4bpp.smol"); const u16 gMonShinyPalette_Lillipup[] = INCBIN_U16("graphics/pokemon/lillipup/shiny.gbapal"); const u8 gMonIcon_Lillipup[] = INCBIN_U8("graphics/pokemon/lillipup/icon.4bpp"); #if P_FOOTPRINTS @@ -16117,9 +16171,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Herdier[] = INCBIN_U32("graphics/pokemon/herdier/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Herdier[] = INCBIN_U32("graphics/pokemon/herdier/anim_front.4bpp.smol"); const u16 gMonPalette_Herdier[] = INCBIN_U16("graphics/pokemon/herdier/normal.gbapal"); - const u32 gMonBackPic_Herdier[] = INCBIN_U32("graphics/pokemon/herdier/back.4bpp.lz"); + const u32 gMonBackPic_Herdier[] = INCBIN_U32("graphics/pokemon/herdier/back.4bpp.smol"); const u16 gMonShinyPalette_Herdier[] = INCBIN_U16("graphics/pokemon/herdier/shiny.gbapal"); const u8 gMonIcon_Herdier[] = INCBIN_U8("graphics/pokemon/herdier/icon.4bpp"); #if P_FOOTPRINTS @@ -16133,9 +16187,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Stoutland[] = INCBIN_U32("graphics/pokemon/stoutland/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Stoutland[] = INCBIN_U32("graphics/pokemon/stoutland/anim_front.4bpp.smol"); const u16 gMonPalette_Stoutland[] = INCBIN_U16("graphics/pokemon/stoutland/normal.gbapal"); - const u32 gMonBackPic_Stoutland[] = INCBIN_U32("graphics/pokemon/stoutland/back.4bpp.lz"); + const u32 gMonBackPic_Stoutland[] = INCBIN_U32("graphics/pokemon/stoutland/back.4bpp.smol"); const u16 gMonShinyPalette_Stoutland[] = INCBIN_U16("graphics/pokemon/stoutland/shiny.gbapal"); const u8 gMonIcon_Stoutland[] = INCBIN_U8("graphics/pokemon/stoutland/icon.4bpp"); #if P_FOOTPRINTS @@ -16151,9 +16205,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_LILLIPUP #if P_FAMILY_PURRLOIN - const u32 gMonFrontPic_Purrloin[] = INCBIN_U32("graphics/pokemon/purrloin/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Purrloin[] = INCBIN_U32("graphics/pokemon/purrloin/anim_front.4bpp.smol"); const u16 gMonPalette_Purrloin[] = INCBIN_U16("graphics/pokemon/purrloin/normal.gbapal"); - const u32 gMonBackPic_Purrloin[] = INCBIN_U32("graphics/pokemon/purrloin/back.4bpp.lz"); + const u32 gMonBackPic_Purrloin[] = INCBIN_U32("graphics/pokemon/purrloin/back.4bpp.smol"); const u16 gMonShinyPalette_Purrloin[] = INCBIN_U16("graphics/pokemon/purrloin/shiny.gbapal"); const u8 gMonIcon_Purrloin[] = INCBIN_U8("graphics/pokemon/purrloin/icon.4bpp"); #if P_FOOTPRINTS @@ -16167,9 +16221,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Liepard[] = INCBIN_U32("graphics/pokemon/liepard/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Liepard[] = INCBIN_U32("graphics/pokemon/liepard/anim_front.4bpp.smol"); const u16 gMonPalette_Liepard[] = INCBIN_U16("graphics/pokemon/liepard/normal.gbapal"); - const u32 gMonBackPic_Liepard[] = INCBIN_U32("graphics/pokemon/liepard/back.4bpp.lz"); + const u32 gMonBackPic_Liepard[] = INCBIN_U32("graphics/pokemon/liepard/back.4bpp.smol"); const u16 gMonShinyPalette_Liepard[] = INCBIN_U16("graphics/pokemon/liepard/shiny.gbapal"); const u8 gMonIcon_Liepard[] = INCBIN_U8("graphics/pokemon/liepard/icon.4bpp"); #if P_FOOTPRINTS @@ -16185,9 +16239,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PURRLOIN #if P_FAMILY_PANSAGE - const u32 gMonFrontPic_Pansage[] = INCBIN_U32("graphics/pokemon/pansage/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pansage[] = INCBIN_U32("graphics/pokemon/pansage/anim_front.4bpp.smol"); const u16 gMonPalette_Pansage[] = INCBIN_U16("graphics/pokemon/pansage/normal.gbapal"); - const u32 gMonBackPic_Pansage[] = INCBIN_U32("graphics/pokemon/pansage/back.4bpp.lz"); + const u32 gMonBackPic_Pansage[] = INCBIN_U32("graphics/pokemon/pansage/back.4bpp.smol"); const u16 gMonShinyPalette_Pansage[] = INCBIN_U16("graphics/pokemon/pansage/shiny.gbapal"); const u8 gMonIcon_Pansage[] = INCBIN_U8("graphics/pokemon/pansage/icon.4bpp"); #if P_FOOTPRINTS @@ -16201,9 +16255,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Simisage[] = INCBIN_U32("graphics/pokemon/simisage/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Simisage[] = INCBIN_U32("graphics/pokemon/simisage/anim_front.4bpp.smol"); const u16 gMonPalette_Simisage[] = INCBIN_U16("graphics/pokemon/simisage/normal.gbapal"); - const u32 gMonBackPic_Simisage[] = INCBIN_U32("graphics/pokemon/simisage/back.4bpp.lz"); + const u32 gMonBackPic_Simisage[] = INCBIN_U32("graphics/pokemon/simisage/back.4bpp.smol"); const u16 gMonShinyPalette_Simisage[] = INCBIN_U16("graphics/pokemon/simisage/shiny.gbapal"); const u8 gMonIcon_Simisage[] = INCBIN_U8("graphics/pokemon/simisage/icon.4bpp"); #if P_FOOTPRINTS @@ -16219,9 +16273,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PANSAGE #if P_FAMILY_PANSEAR - const u32 gMonFrontPic_Pansear[] = INCBIN_U32("graphics/pokemon/pansear/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pansear[] = INCBIN_U32("graphics/pokemon/pansear/anim_front.4bpp.smol"); const u16 gMonPalette_Pansear[] = INCBIN_U16("graphics/pokemon/pansear/normal.gbapal"); - const u32 gMonBackPic_Pansear[] = INCBIN_U32("graphics/pokemon/pansear/back.4bpp.lz"); + const u32 gMonBackPic_Pansear[] = INCBIN_U32("graphics/pokemon/pansear/back.4bpp.smol"); const u16 gMonShinyPalette_Pansear[] = INCBIN_U16("graphics/pokemon/pansear/shiny.gbapal"); const u8 gMonIcon_Pansear[] = INCBIN_U8("graphics/pokemon/pansear/icon.4bpp"); #if P_FOOTPRINTS @@ -16235,9 +16289,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Simisear[] = INCBIN_U32("graphics/pokemon/simisear/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Simisear[] = INCBIN_U32("graphics/pokemon/simisear/anim_front.4bpp.smol"); const u16 gMonPalette_Simisear[] = INCBIN_U16("graphics/pokemon/simisear/normal.gbapal"); - const u32 gMonBackPic_Simisear[] = INCBIN_U32("graphics/pokemon/simisear/back.4bpp.lz"); + const u32 gMonBackPic_Simisear[] = INCBIN_U32("graphics/pokemon/simisear/back.4bpp.smol"); const u16 gMonShinyPalette_Simisear[] = INCBIN_U16("graphics/pokemon/simisear/shiny.gbapal"); const u8 gMonIcon_Simisear[] = INCBIN_U8("graphics/pokemon/simisear/icon.4bpp"); #if P_FOOTPRINTS @@ -16253,9 +16307,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PANSEAR #if P_FAMILY_PANPOUR - const u32 gMonFrontPic_Panpour[] = INCBIN_U32("graphics/pokemon/panpour/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Panpour[] = INCBIN_U32("graphics/pokemon/panpour/anim_front.4bpp.smol"); const u16 gMonPalette_Panpour[] = INCBIN_U16("graphics/pokemon/panpour/normal.gbapal"); - const u32 gMonBackPic_Panpour[] = INCBIN_U32("graphics/pokemon/panpour/back.4bpp.lz"); + const u32 gMonBackPic_Panpour[] = INCBIN_U32("graphics/pokemon/panpour/back.4bpp.smol"); const u16 gMonShinyPalette_Panpour[] = INCBIN_U16("graphics/pokemon/panpour/shiny.gbapal"); const u8 gMonIcon_Panpour[] = INCBIN_U8("graphics/pokemon/panpour/icon.4bpp"); #if P_FOOTPRINTS @@ -16269,9 +16323,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Simipour[] = INCBIN_U32("graphics/pokemon/simipour/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Simipour[] = INCBIN_U32("graphics/pokemon/simipour/anim_front.4bpp.smol"); const u16 gMonPalette_Simipour[] = INCBIN_U16("graphics/pokemon/simipour/normal.gbapal"); - const u32 gMonBackPic_Simipour[] = INCBIN_U32("graphics/pokemon/simipour/back.4bpp.lz"); + const u32 gMonBackPic_Simipour[] = INCBIN_U32("graphics/pokemon/simipour/back.4bpp.smol"); const u16 gMonShinyPalette_Simipour[] = INCBIN_U16("graphics/pokemon/simipour/shiny.gbapal"); const u8 gMonIcon_Simipour[] = INCBIN_U8("graphics/pokemon/simipour/icon.4bpp"); #if P_FOOTPRINTS @@ -16287,9 +16341,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PANPOUR #if P_FAMILY_MUNNA - const u32 gMonFrontPic_Munna[] = INCBIN_U32("graphics/pokemon/munna/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Munna[] = INCBIN_U32("graphics/pokemon/munna/anim_front.4bpp.smol"); const u16 gMonPalette_Munna[] = INCBIN_U16("graphics/pokemon/munna/normal.gbapal"); - const u32 gMonBackPic_Munna[] = INCBIN_U32("graphics/pokemon/munna/back.4bpp.lz"); + const u32 gMonBackPic_Munna[] = INCBIN_U32("graphics/pokemon/munna/back.4bpp.smol"); const u16 gMonShinyPalette_Munna[] = INCBIN_U16("graphics/pokemon/munna/shiny.gbapal"); const u8 gMonIcon_Munna[] = INCBIN_U8("graphics/pokemon/munna/icon.4bpp"); #if P_FOOTPRINTS @@ -16303,9 +16357,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Musharna[] = INCBIN_U32("graphics/pokemon/musharna/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Musharna[] = INCBIN_U32("graphics/pokemon/musharna/anim_front.4bpp.smol"); const u16 gMonPalette_Musharna[] = INCBIN_U16("graphics/pokemon/musharna/normal.gbapal"); - const u32 gMonBackPic_Musharna[] = INCBIN_U32("graphics/pokemon/musharna/back.4bpp.lz"); + const u32 gMonBackPic_Musharna[] = INCBIN_U32("graphics/pokemon/musharna/back.4bpp.smol"); const u16 gMonShinyPalette_Musharna[] = INCBIN_U16("graphics/pokemon/musharna/shiny.gbapal"); const u8 gMonIcon_Musharna[] = INCBIN_U8("graphics/pokemon/musharna/icon.4bpp"); #if P_FOOTPRINTS @@ -16321,9 +16375,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MUNNA #if P_FAMILY_PIDOVE - const u32 gMonFrontPic_Pidove[] = INCBIN_U32("graphics/pokemon/pidove/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pidove[] = INCBIN_U32("graphics/pokemon/pidove/anim_front.4bpp.smol"); const u16 gMonPalette_Pidove[] = INCBIN_U16("graphics/pokemon/pidove/normal.gbapal"); - const u32 gMonBackPic_Pidove[] = INCBIN_U32("graphics/pokemon/pidove/back.4bpp.lz"); + const u32 gMonBackPic_Pidove[] = INCBIN_U32("graphics/pokemon/pidove/back.4bpp.smol"); const u16 gMonShinyPalette_Pidove[] = INCBIN_U16("graphics/pokemon/pidove/shiny.gbapal"); const u8 gMonIcon_Pidove[] = INCBIN_U8("graphics/pokemon/pidove/icon.4bpp"); #if P_FOOTPRINTS @@ -16337,9 +16391,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Tranquill[] = INCBIN_U32("graphics/pokemon/tranquill/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tranquill[] = INCBIN_U32("graphics/pokemon/tranquill/anim_front.4bpp.smol"); const u16 gMonPalette_Tranquill[] = INCBIN_U16("graphics/pokemon/tranquill/normal.gbapal"); - const u32 gMonBackPic_Tranquill[] = INCBIN_U32("graphics/pokemon/tranquill/back.4bpp.lz"); + const u32 gMonBackPic_Tranquill[] = INCBIN_U32("graphics/pokemon/tranquill/back.4bpp.smol"); const u16 gMonShinyPalette_Tranquill[] = INCBIN_U16("graphics/pokemon/tranquill/shiny.gbapal"); const u8 gMonIcon_Tranquill[] = INCBIN_U8("graphics/pokemon/tranquill/icon.4bpp"); #if P_FOOTPRINTS @@ -16353,9 +16407,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Unfezant[] = INCBIN_U32("graphics/pokemon/unfezant/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Unfezant[] = INCBIN_U32("graphics/pokemon/unfezant/anim_front.4bpp.smol"); const u16 gMonPalette_Unfezant[] = INCBIN_U16("graphics/pokemon/unfezant/normal.gbapal"); - const u32 gMonBackPic_Unfezant[] = INCBIN_U32("graphics/pokemon/unfezant/back.4bpp.lz"); + const u32 gMonBackPic_Unfezant[] = INCBIN_U32("graphics/pokemon/unfezant/back.4bpp.smol"); const u16 gMonShinyPalette_Unfezant[] = INCBIN_U16("graphics/pokemon/unfezant/shiny.gbapal"); const u8 gMonIcon_Unfezant[] = INCBIN_U8("graphics/pokemon/unfezant/icon.4bpp"); #if P_FOOTPRINTS @@ -16370,9 +16424,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_UnfezantF[] = INCBIN_U32("graphics/pokemon/unfezant/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_UnfezantF[] = INCBIN_U32("graphics/pokemon/unfezant/anim_frontf.4bpp.smol"); const u16 gMonPalette_UnfezantF[] = INCBIN_U16("graphics/pokemon/unfezant/normalf.gbapal"); - const u32 gMonBackPic_UnfezantF[] = INCBIN_U32("graphics/pokemon/unfezant/backf.4bpp.lz"); + const u32 gMonBackPic_UnfezantF[] = INCBIN_U32("graphics/pokemon/unfezant/backf.4bpp.smol"); const u16 gMonShinyPalette_UnfezantF[] = INCBIN_U16("graphics/pokemon/unfezant/shinyf.gbapal"); const u8 gMonIcon_UnfezantF[] = INCBIN_U8("graphics/pokemon/unfezant/iconf.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -16386,9 +16440,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PIDOVE #if P_FAMILY_BLITZLE - const u32 gMonFrontPic_Blitzle[] = INCBIN_U32("graphics/pokemon/blitzle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Blitzle[] = INCBIN_U32("graphics/pokemon/blitzle/anim_front.4bpp.smol"); const u16 gMonPalette_Blitzle[] = INCBIN_U16("graphics/pokemon/blitzle/normal.gbapal"); - const u32 gMonBackPic_Blitzle[] = INCBIN_U32("graphics/pokemon/blitzle/back.4bpp.lz"); + const u32 gMonBackPic_Blitzle[] = INCBIN_U32("graphics/pokemon/blitzle/back.4bpp.smol"); const u16 gMonShinyPalette_Blitzle[] = INCBIN_U16("graphics/pokemon/blitzle/shiny.gbapal"); const u8 gMonIcon_Blitzle[] = INCBIN_U8("graphics/pokemon/blitzle/icon.4bpp"); #if P_FOOTPRINTS @@ -16402,9 +16456,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Zebstrika[] = INCBIN_U32("graphics/pokemon/zebstrika/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Zebstrika[] = INCBIN_U32("graphics/pokemon/zebstrika/anim_front.4bpp.smol"); const u16 gMonPalette_Zebstrika[] = INCBIN_U16("graphics/pokemon/zebstrika/normal.gbapal"); - const u32 gMonBackPic_Zebstrika[] = INCBIN_U32("graphics/pokemon/zebstrika/back.4bpp.lz"); + const u32 gMonBackPic_Zebstrika[] = INCBIN_U32("graphics/pokemon/zebstrika/back.4bpp.smol"); const u16 gMonShinyPalette_Zebstrika[] = INCBIN_U16("graphics/pokemon/zebstrika/shiny.gbapal"); const u8 gMonIcon_Zebstrika[] = INCBIN_U8("graphics/pokemon/zebstrika/icon.4bpp"); #if P_FOOTPRINTS @@ -16420,9 +16474,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BLITZLE #if P_FAMILY_ROGGENROLA - const u32 gMonFrontPic_Roggenrola[] = INCBIN_U32("graphics/pokemon/roggenrola/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Roggenrola[] = INCBIN_U32("graphics/pokemon/roggenrola/anim_front.4bpp.smol"); const u16 gMonPalette_Roggenrola[] = INCBIN_U16("graphics/pokemon/roggenrola/normal.gbapal"); - const u32 gMonBackPic_Roggenrola[] = INCBIN_U32("graphics/pokemon/roggenrola/back.4bpp.lz"); + const u32 gMonBackPic_Roggenrola[] = INCBIN_U32("graphics/pokemon/roggenrola/back.4bpp.smol"); const u16 gMonShinyPalette_Roggenrola[] = INCBIN_U16("graphics/pokemon/roggenrola/shiny.gbapal"); const u8 gMonIcon_Roggenrola[] = INCBIN_U8("graphics/pokemon/roggenrola/icon.4bpp"); #if P_FOOTPRINTS @@ -16436,9 +16490,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Boldore[] = INCBIN_U32("graphics/pokemon/boldore/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Boldore[] = INCBIN_U32("graphics/pokemon/boldore/anim_front.4bpp.smol"); const u16 gMonPalette_Boldore[] = INCBIN_U16("graphics/pokemon/boldore/normal.gbapal"); - const u32 gMonBackPic_Boldore[] = INCBIN_U32("graphics/pokemon/boldore/back.4bpp.lz"); + const u32 gMonBackPic_Boldore[] = INCBIN_U32("graphics/pokemon/boldore/back.4bpp.smol"); const u16 gMonShinyPalette_Boldore[] = INCBIN_U16("graphics/pokemon/boldore/shiny.gbapal"); const u8 gMonIcon_Boldore[] = INCBIN_U8("graphics/pokemon/boldore/icon.4bpp"); #if P_FOOTPRINTS @@ -16452,9 +16506,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Gigalith[] = INCBIN_U32("graphics/pokemon/gigalith/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gigalith[] = INCBIN_U32("graphics/pokemon/gigalith/anim_front.4bpp.smol"); const u16 gMonPalette_Gigalith[] = INCBIN_U16("graphics/pokemon/gigalith/normal.gbapal"); - const u32 gMonBackPic_Gigalith[] = INCBIN_U32("graphics/pokemon/gigalith/back.4bpp.lz"); + const u32 gMonBackPic_Gigalith[] = INCBIN_U32("graphics/pokemon/gigalith/back.4bpp.smol"); const u16 gMonShinyPalette_Gigalith[] = INCBIN_U16("graphics/pokemon/gigalith/shiny.gbapal"); const u8 gMonIcon_Gigalith[] = INCBIN_U8("graphics/pokemon/gigalith/icon.4bpp"); #if P_FOOTPRINTS @@ -16470,9 +16524,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ROGGENROLA #if P_FAMILY_WOOBAT - const u32 gMonFrontPic_Woobat[] = INCBIN_U32("graphics/pokemon/woobat/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Woobat[] = INCBIN_U32("graphics/pokemon/woobat/anim_front.4bpp.smol"); const u16 gMonPalette_Woobat[] = INCBIN_U16("graphics/pokemon/woobat/normal.gbapal"); - const u32 gMonBackPic_Woobat[] = INCBIN_U32("graphics/pokemon/woobat/back.4bpp.lz"); + const u32 gMonBackPic_Woobat[] = INCBIN_U32("graphics/pokemon/woobat/back.4bpp.smol"); const u16 gMonShinyPalette_Woobat[] = INCBIN_U16("graphics/pokemon/woobat/shiny.gbapal"); const u8 gMonIcon_Woobat[] = INCBIN_U8("graphics/pokemon/woobat/icon.4bpp"); #if P_FOOTPRINTS @@ -16486,9 +16540,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Swoobat[] = INCBIN_U32("graphics/pokemon/swoobat/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Swoobat[] = INCBIN_U32("graphics/pokemon/swoobat/anim_front.4bpp.smol"); const u16 gMonPalette_Swoobat[] = INCBIN_U16("graphics/pokemon/swoobat/normal.gbapal"); - const u32 gMonBackPic_Swoobat[] = INCBIN_U32("graphics/pokemon/swoobat/back.4bpp.lz"); + const u32 gMonBackPic_Swoobat[] = INCBIN_U32("graphics/pokemon/swoobat/back.4bpp.smol"); const u16 gMonShinyPalette_Swoobat[] = INCBIN_U16("graphics/pokemon/swoobat/shiny.gbapal"); const u8 gMonIcon_Swoobat[] = INCBIN_U8("graphics/pokemon/swoobat/icon.4bpp"); #if P_FOOTPRINTS @@ -16504,9 +16558,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_WOOBAT #if P_FAMILY_DRILBUR - const u32 gMonFrontPic_Drilbur[] = INCBIN_U32("graphics/pokemon/drilbur/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Drilbur[] = INCBIN_U32("graphics/pokemon/drilbur/anim_front.4bpp.smol"); const u16 gMonPalette_Drilbur[] = INCBIN_U16("graphics/pokemon/drilbur/normal.gbapal"); - const u32 gMonBackPic_Drilbur[] = INCBIN_U32("graphics/pokemon/drilbur/back.4bpp.lz"); + const u32 gMonBackPic_Drilbur[] = INCBIN_U32("graphics/pokemon/drilbur/back.4bpp.smol"); const u16 gMonShinyPalette_Drilbur[] = INCBIN_U16("graphics/pokemon/drilbur/shiny.gbapal"); const u8 gMonIcon_Drilbur[] = INCBIN_U8("graphics/pokemon/drilbur/icon.4bpp"); #if P_FOOTPRINTS @@ -16520,9 +16574,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Excadrill[] = INCBIN_U32("graphics/pokemon/excadrill/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Excadrill[] = INCBIN_U32("graphics/pokemon/excadrill/anim_front.4bpp.smol"); const u16 gMonPalette_Excadrill[] = INCBIN_U16("graphics/pokemon/excadrill/normal.gbapal"); - const u32 gMonBackPic_Excadrill[] = INCBIN_U32("graphics/pokemon/excadrill/back.4bpp.lz"); + const u32 gMonBackPic_Excadrill[] = INCBIN_U32("graphics/pokemon/excadrill/back.4bpp.smol"); const u16 gMonShinyPalette_Excadrill[] = INCBIN_U16("graphics/pokemon/excadrill/shiny.gbapal"); const u8 gMonIcon_Excadrill[] = INCBIN_U8("graphics/pokemon/excadrill/icon.4bpp"); #if P_FOOTPRINTS @@ -16538,9 +16592,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DRILBUR #if P_FAMILY_AUDINO - const u32 gMonFrontPic_Audino[] = INCBIN_U32("graphics/pokemon/audino/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Audino[] = INCBIN_U32("graphics/pokemon/audino/anim_front.4bpp.smol"); const u16 gMonPalette_Audino[] = INCBIN_U16("graphics/pokemon/audino/normal.gbapal"); - const u32 gMonBackPic_Audino[] = INCBIN_U32("graphics/pokemon/audino/back.4bpp.lz"); + const u32 gMonBackPic_Audino[] = INCBIN_U32("graphics/pokemon/audino/back.4bpp.smol"); const u16 gMonShinyPalette_Audino[] = INCBIN_U16("graphics/pokemon/audino/shiny.gbapal"); const u8 gMonIcon_Audino[] = INCBIN_U8("graphics/pokemon/audino/icon.4bpp"); #if P_FOOTPRINTS @@ -16555,9 +16609,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_AudinoMega[] = INCBIN_U32("graphics/pokemon/audino/mega/front.4bpp.lz"); + const u32 gMonFrontPic_AudinoMega[] = INCBIN_U32("graphics/pokemon/audino/mega/front.4bpp.smol"); const u16 gMonPalette_AudinoMega[] = INCBIN_U16("graphics/pokemon/audino/mega/normal.gbapal"); - const u32 gMonBackPic_AudinoMega[] = INCBIN_U32("graphics/pokemon/audino/mega/back.4bpp.lz"); + const u32 gMonBackPic_AudinoMega[] = INCBIN_U32("graphics/pokemon/audino/mega/back.4bpp.smol"); const u16 gMonShinyPalette_AudinoMega[] = INCBIN_U16("graphics/pokemon/audino/mega/shiny.gbapal"); const u8 gMonIcon_AudinoMega[] = INCBIN_U8("graphics/pokemon/audino/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -16571,9 +16625,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_AUDINO #if P_FAMILY_TIMBURR - const u32 gMonFrontPic_Timburr[] = INCBIN_U32("graphics/pokemon/timburr/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Timburr[] = INCBIN_U32("graphics/pokemon/timburr/anim_front.4bpp.smol"); const u16 gMonPalette_Timburr[] = INCBIN_U16("graphics/pokemon/timburr/normal.gbapal"); - const u32 gMonBackPic_Timburr[] = INCBIN_U32("graphics/pokemon/timburr/back.4bpp.lz"); + const u32 gMonBackPic_Timburr[] = INCBIN_U32("graphics/pokemon/timburr/back.4bpp.smol"); const u16 gMonShinyPalette_Timburr[] = INCBIN_U16("graphics/pokemon/timburr/shiny.gbapal"); const u8 gMonIcon_Timburr[] = INCBIN_U8("graphics/pokemon/timburr/icon.4bpp"); #if P_FOOTPRINTS @@ -16587,9 +16641,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Gurdurr[] = INCBIN_U32("graphics/pokemon/gurdurr/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gurdurr[] = INCBIN_U32("graphics/pokemon/gurdurr/anim_front.4bpp.smol"); const u16 gMonPalette_Gurdurr[] = INCBIN_U16("graphics/pokemon/gurdurr/normal.gbapal"); - const u32 gMonBackPic_Gurdurr[] = INCBIN_U32("graphics/pokemon/gurdurr/back.4bpp.lz"); + const u32 gMonBackPic_Gurdurr[] = INCBIN_U32("graphics/pokemon/gurdurr/back.4bpp.smol"); const u16 gMonShinyPalette_Gurdurr[] = INCBIN_U16("graphics/pokemon/gurdurr/shiny.gbapal"); const u8 gMonIcon_Gurdurr[] = INCBIN_U8("graphics/pokemon/gurdurr/icon.4bpp"); #if P_FOOTPRINTS @@ -16603,9 +16657,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Conkeldurr[] = INCBIN_U32("graphics/pokemon/conkeldurr/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Conkeldurr[] = INCBIN_U32("graphics/pokemon/conkeldurr/anim_front.4bpp.smol"); const u16 gMonPalette_Conkeldurr[] = INCBIN_U16("graphics/pokemon/conkeldurr/normal.gbapal"); - const u32 gMonBackPic_Conkeldurr[] = INCBIN_U32("graphics/pokemon/conkeldurr/back.4bpp.lz"); + const u32 gMonBackPic_Conkeldurr[] = INCBIN_U32("graphics/pokemon/conkeldurr/back.4bpp.smol"); const u16 gMonShinyPalette_Conkeldurr[] = INCBIN_U16("graphics/pokemon/conkeldurr/shiny.gbapal"); const u8 gMonIcon_Conkeldurr[] = INCBIN_U8("graphics/pokemon/conkeldurr/icon.4bpp"); #if P_FOOTPRINTS @@ -16621,9 +16675,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TIMBURR #if P_FAMILY_TYMPOLE - const u32 gMonFrontPic_Tympole[] = INCBIN_U32("graphics/pokemon/tympole/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tympole[] = INCBIN_U32("graphics/pokemon/tympole/anim_front.4bpp.smol"); const u16 gMonPalette_Tympole[] = INCBIN_U16("graphics/pokemon/tympole/normal.gbapal"); - const u32 gMonBackPic_Tympole[] = INCBIN_U32("graphics/pokemon/tympole/back.4bpp.lz"); + const u32 gMonBackPic_Tympole[] = INCBIN_U32("graphics/pokemon/tympole/back.4bpp.smol"); const u16 gMonShinyPalette_Tympole[] = INCBIN_U16("graphics/pokemon/tympole/shiny.gbapal"); const u8 gMonIcon_Tympole[] = INCBIN_U8("graphics/pokemon/tympole/icon.4bpp"); #if P_FOOTPRINTS @@ -16637,9 +16691,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Palpitoad[] = INCBIN_U32("graphics/pokemon/palpitoad/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Palpitoad[] = INCBIN_U32("graphics/pokemon/palpitoad/anim_front.4bpp.smol"); const u16 gMonPalette_Palpitoad[] = INCBIN_U16("graphics/pokemon/palpitoad/normal.gbapal"); - const u32 gMonBackPic_Palpitoad[] = INCBIN_U32("graphics/pokemon/palpitoad/back.4bpp.lz"); + const u32 gMonBackPic_Palpitoad[] = INCBIN_U32("graphics/pokemon/palpitoad/back.4bpp.smol"); const u16 gMonShinyPalette_Palpitoad[] = INCBIN_U16("graphics/pokemon/palpitoad/shiny.gbapal"); const u8 gMonIcon_Palpitoad[] = INCBIN_U8("graphics/pokemon/palpitoad/icon.4bpp"); #if P_FOOTPRINTS @@ -16653,9 +16707,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Seismitoad[] = INCBIN_U32("graphics/pokemon/seismitoad/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Seismitoad[] = INCBIN_U32("graphics/pokemon/seismitoad/anim_front.4bpp.smol"); const u16 gMonPalette_Seismitoad[] = INCBIN_U16("graphics/pokemon/seismitoad/normal.gbapal"); - const u32 gMonBackPic_Seismitoad[] = INCBIN_U32("graphics/pokemon/seismitoad/back.4bpp.lz"); + const u32 gMonBackPic_Seismitoad[] = INCBIN_U32("graphics/pokemon/seismitoad/back.4bpp.smol"); const u16 gMonShinyPalette_Seismitoad[] = INCBIN_U16("graphics/pokemon/seismitoad/shiny.gbapal"); const u8 gMonIcon_Seismitoad[] = INCBIN_U8("graphics/pokemon/seismitoad/icon.4bpp"); #if P_FOOTPRINTS @@ -16671,9 +16725,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TYMPOLE #if P_FAMILY_THROH - const u32 gMonFrontPic_Throh[] = INCBIN_U32("graphics/pokemon/throh/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Throh[] = INCBIN_U32("graphics/pokemon/throh/anim_front.4bpp.smol"); const u16 gMonPalette_Throh[] = INCBIN_U16("graphics/pokemon/throh/normal.gbapal"); - const u32 gMonBackPic_Throh[] = INCBIN_U32("graphics/pokemon/throh/back.4bpp.lz"); + const u32 gMonBackPic_Throh[] = INCBIN_U32("graphics/pokemon/throh/back.4bpp.smol"); const u16 gMonShinyPalette_Throh[] = INCBIN_U16("graphics/pokemon/throh/shiny.gbapal"); const u8 gMonIcon_Throh[] = INCBIN_U8("graphics/pokemon/throh/icon.4bpp"); #if P_FOOTPRINTS @@ -16689,9 +16743,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_THROH #if P_FAMILY_SAWK - const u32 gMonFrontPic_Sawk[] = INCBIN_U32("graphics/pokemon/sawk/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sawk[] = INCBIN_U32("graphics/pokemon/sawk/anim_front.4bpp.smol"); const u16 gMonPalette_Sawk[] = INCBIN_U16("graphics/pokemon/sawk/normal.gbapal"); - const u32 gMonBackPic_Sawk[] = INCBIN_U32("graphics/pokemon/sawk/back.4bpp.lz"); + const u32 gMonBackPic_Sawk[] = INCBIN_U32("graphics/pokemon/sawk/back.4bpp.smol"); const u16 gMonShinyPalette_Sawk[] = INCBIN_U16("graphics/pokemon/sawk/shiny.gbapal"); const u8 gMonIcon_Sawk[] = INCBIN_U8("graphics/pokemon/sawk/icon.4bpp"); #if P_FOOTPRINTS @@ -16707,9 +16761,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SAWK #if P_FAMILY_SEWADDLE - const u32 gMonFrontPic_Sewaddle[] = INCBIN_U32("graphics/pokemon/sewaddle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sewaddle[] = INCBIN_U32("graphics/pokemon/sewaddle/anim_front.4bpp.smol"); const u16 gMonPalette_Sewaddle[] = INCBIN_U16("graphics/pokemon/sewaddle/normal.gbapal"); - const u32 gMonBackPic_Sewaddle[] = INCBIN_U32("graphics/pokemon/sewaddle/back.4bpp.lz"); + const u32 gMonBackPic_Sewaddle[] = INCBIN_U32("graphics/pokemon/sewaddle/back.4bpp.smol"); const u16 gMonShinyPalette_Sewaddle[] = INCBIN_U16("graphics/pokemon/sewaddle/shiny.gbapal"); const u8 gMonIcon_Sewaddle[] = INCBIN_U8("graphics/pokemon/sewaddle/icon.4bpp"); #if P_FOOTPRINTS @@ -16723,9 +16777,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Swadloon[] = INCBIN_U32("graphics/pokemon/swadloon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Swadloon[] = INCBIN_U32("graphics/pokemon/swadloon/anim_front.4bpp.smol"); const u16 gMonPalette_Swadloon[] = INCBIN_U16("graphics/pokemon/swadloon/normal.gbapal"); - const u32 gMonBackPic_Swadloon[] = INCBIN_U32("graphics/pokemon/swadloon/back.4bpp.lz"); + const u32 gMonBackPic_Swadloon[] = INCBIN_U32("graphics/pokemon/swadloon/back.4bpp.smol"); const u16 gMonShinyPalette_Swadloon[] = INCBIN_U16("graphics/pokemon/swadloon/shiny.gbapal"); const u8 gMonIcon_Swadloon[] = INCBIN_U8("graphics/pokemon/swadloon/icon.4bpp"); #if P_FOOTPRINTS @@ -16739,9 +16793,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Leavanny[] = INCBIN_U32("graphics/pokemon/leavanny/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Leavanny[] = INCBIN_U32("graphics/pokemon/leavanny/anim_front.4bpp.smol"); const u16 gMonPalette_Leavanny[] = INCBIN_U16("graphics/pokemon/leavanny/normal.gbapal"); - const u32 gMonBackPic_Leavanny[] = INCBIN_U32("graphics/pokemon/leavanny/back.4bpp.lz"); + const u32 gMonBackPic_Leavanny[] = INCBIN_U32("graphics/pokemon/leavanny/back.4bpp.smol"); const u16 gMonShinyPalette_Leavanny[] = INCBIN_U16("graphics/pokemon/leavanny/shiny.gbapal"); const u8 gMonIcon_Leavanny[] = INCBIN_U8("graphics/pokemon/leavanny/icon.4bpp"); #if P_FOOTPRINTS @@ -16757,9 +16811,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SEWADDLE #if P_FAMILY_VENIPEDE - const u32 gMonFrontPic_Venipede[] = INCBIN_U32("graphics/pokemon/venipede/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Venipede[] = INCBIN_U32("graphics/pokemon/venipede/anim_front.4bpp.smol"); const u16 gMonPalette_Venipede[] = INCBIN_U16("graphics/pokemon/venipede/normal.gbapal"); - const u32 gMonBackPic_Venipede[] = INCBIN_U32("graphics/pokemon/venipede/back.4bpp.lz"); + const u32 gMonBackPic_Venipede[] = INCBIN_U32("graphics/pokemon/venipede/back.4bpp.smol"); const u16 gMonShinyPalette_Venipede[] = INCBIN_U16("graphics/pokemon/venipede/shiny.gbapal"); const u8 gMonIcon_Venipede[] = INCBIN_U8("graphics/pokemon/venipede/icon.4bpp"); #if P_FOOTPRINTS @@ -16773,9 +16827,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Whirlipede[] = INCBIN_U32("graphics/pokemon/whirlipede/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Whirlipede[] = INCBIN_U32("graphics/pokemon/whirlipede/anim_front.4bpp.smol"); const u16 gMonPalette_Whirlipede[] = INCBIN_U16("graphics/pokemon/whirlipede/normal.gbapal"); - const u32 gMonBackPic_Whirlipede[] = INCBIN_U32("graphics/pokemon/whirlipede/back.4bpp.lz"); + const u32 gMonBackPic_Whirlipede[] = INCBIN_U32("graphics/pokemon/whirlipede/back.4bpp.smol"); const u16 gMonShinyPalette_Whirlipede[] = INCBIN_U16("graphics/pokemon/whirlipede/shiny.gbapal"); const u8 gMonIcon_Whirlipede[] = INCBIN_U8("graphics/pokemon/whirlipede/icon.4bpp"); #if P_FOOTPRINTS @@ -16789,9 +16843,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Scolipede[] = INCBIN_U32("graphics/pokemon/scolipede/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Scolipede[] = INCBIN_U32("graphics/pokemon/scolipede/anim_front.4bpp.smol"); const u16 gMonPalette_Scolipede[] = INCBIN_U16("graphics/pokemon/scolipede/normal.gbapal"); - const u32 gMonBackPic_Scolipede[] = INCBIN_U32("graphics/pokemon/scolipede/back.4bpp.lz"); + const u32 gMonBackPic_Scolipede[] = INCBIN_U32("graphics/pokemon/scolipede/back.4bpp.smol"); const u16 gMonShinyPalette_Scolipede[] = INCBIN_U16("graphics/pokemon/scolipede/shiny.gbapal"); const u8 gMonIcon_Scolipede[] = INCBIN_U8("graphics/pokemon/scolipede/icon.4bpp"); #if P_FOOTPRINTS @@ -16807,9 +16861,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_VENIPEDE #if P_FAMILY_COTTONEE - const u32 gMonFrontPic_Cottonee[] = INCBIN_U32("graphics/pokemon/cottonee/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cottonee[] = INCBIN_U32("graphics/pokemon/cottonee/anim_front.4bpp.smol"); const u16 gMonPalette_Cottonee[] = INCBIN_U16("graphics/pokemon/cottonee/normal.gbapal"); - const u32 gMonBackPic_Cottonee[] = INCBIN_U32("graphics/pokemon/cottonee/back.4bpp.lz"); + const u32 gMonBackPic_Cottonee[] = INCBIN_U32("graphics/pokemon/cottonee/back.4bpp.smol"); const u16 gMonShinyPalette_Cottonee[] = INCBIN_U16("graphics/pokemon/cottonee/shiny.gbapal"); const u8 gMonIcon_Cottonee[] = INCBIN_U8("graphics/pokemon/cottonee/icon.4bpp"); #if P_FOOTPRINTS @@ -16823,9 +16877,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Whimsicott[] = INCBIN_U32("graphics/pokemon/whimsicott/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Whimsicott[] = INCBIN_U32("graphics/pokemon/whimsicott/anim_front.4bpp.smol"); const u16 gMonPalette_Whimsicott[] = INCBIN_U16("graphics/pokemon/whimsicott/normal.gbapal"); - const u32 gMonBackPic_Whimsicott[] = INCBIN_U32("graphics/pokemon/whimsicott/back.4bpp.lz"); + const u32 gMonBackPic_Whimsicott[] = INCBIN_U32("graphics/pokemon/whimsicott/back.4bpp.smol"); const u16 gMonShinyPalette_Whimsicott[] = INCBIN_U16("graphics/pokemon/whimsicott/shiny.gbapal"); const u8 gMonIcon_Whimsicott[] = INCBIN_U8("graphics/pokemon/whimsicott/icon.4bpp"); #if P_FOOTPRINTS @@ -16841,9 +16895,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_COTTONEE #if P_FAMILY_PETILIL - const u32 gMonFrontPic_Petilil[] = INCBIN_U32("graphics/pokemon/petilil/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Petilil[] = INCBIN_U32("graphics/pokemon/petilil/anim_front.4bpp.smol"); const u16 gMonPalette_Petilil[] = INCBIN_U16("graphics/pokemon/petilil/normal.gbapal"); - const u32 gMonBackPic_Petilil[] = INCBIN_U32("graphics/pokemon/petilil/back.4bpp.lz"); + const u32 gMonBackPic_Petilil[] = INCBIN_U32("graphics/pokemon/petilil/back.4bpp.smol"); const u16 gMonShinyPalette_Petilil[] = INCBIN_U16("graphics/pokemon/petilil/shiny.gbapal"); const u8 gMonIcon_Petilil[] = INCBIN_U8("graphics/pokemon/petilil/icon.4bpp"); #if P_FOOTPRINTS @@ -16857,9 +16911,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Lilligant[] = INCBIN_U32("graphics/pokemon/lilligant/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lilligant[] = INCBIN_U32("graphics/pokemon/lilligant/anim_front.4bpp.smol"); const u16 gMonPalette_Lilligant[] = INCBIN_U16("graphics/pokemon/lilligant/normal.gbapal"); - const u32 gMonBackPic_Lilligant[] = INCBIN_U32("graphics/pokemon/lilligant/back.4bpp.lz"); + const u32 gMonBackPic_Lilligant[] = INCBIN_U32("graphics/pokemon/lilligant/back.4bpp.smol"); const u16 gMonShinyPalette_Lilligant[] = INCBIN_U16("graphics/pokemon/lilligant/shiny.gbapal"); const u8 gMonIcon_Lilligant[] = INCBIN_U8("graphics/pokemon/lilligant/icon.4bpp"); #if P_FOOTPRINTS @@ -16874,9 +16928,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_LilligantHisui[] = INCBIN_U32("graphics/pokemon/lilligant/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_LilligantHisui[] = INCBIN_U32("graphics/pokemon/lilligant/hisui/front.4bpp.smol"); const u16 gMonPalette_LilligantHisui[] = INCBIN_U16("graphics/pokemon/lilligant/hisui/normal.gbapal"); - const u32 gMonBackPic_LilligantHisui[] = INCBIN_U32("graphics/pokemon/lilligant/hisui/back.4bpp.lz"); + const u32 gMonBackPic_LilligantHisui[] = INCBIN_U32("graphics/pokemon/lilligant/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_LilligantHisui[] = INCBIN_U16("graphics/pokemon/lilligant/hisui/shiny.gbapal"); const u8 gMonIcon_LilligantHisui[] = INCBIN_U8("graphics/pokemon/lilligant/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -16890,18 +16944,18 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PETILIL #if P_FAMILY_BASCULIN - const u32 gMonFrontPic_BasculinRedStriped[] = INCBIN_U32("graphics/pokemon/basculin/anim_front.4bpp.lz"); + const u32 gMonFrontPic_BasculinRedStriped[] = INCBIN_U32("graphics/pokemon/basculin/anim_front.4bpp.smol"); const u16 gMonPalette_BasculinRedStriped[] = INCBIN_U16("graphics/pokemon/basculin/normal.gbapal"); - const u32 gMonBackPic_BasculinRedStriped[] = INCBIN_U32("graphics/pokemon/basculin/back.4bpp.lz"); + const u32 gMonBackPic_BasculinRedStriped[] = INCBIN_U32("graphics/pokemon/basculin/back.4bpp.smol"); const u16 gMonShinyPalette_BasculinRedStriped[] = INCBIN_U16("graphics/pokemon/basculin/shiny.gbapal"); const u8 gMonIcon_BasculinRedStriped[] = INCBIN_U8("graphics/pokemon/basculin/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Basculin[] = INCBIN_U8("graphics/pokemon/basculin/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_BasculinBlueStriped[] = INCBIN_U32("graphics/pokemon/basculin/blue_striped/anim_front.4bpp.lz"); + const u32 gMonFrontPic_BasculinBlueStriped[] = INCBIN_U32("graphics/pokemon/basculin/blue_striped/anim_front.4bpp.smol"); const u16 gMonPalette_BasculinBlueStriped[] = INCBIN_U16("graphics/pokemon/basculin/blue_striped/normal.gbapal"); - const u32 gMonBackPic_BasculinBlueStriped[] = INCBIN_U32("graphics/pokemon/basculin/blue_striped/back.4bpp.lz"); + const u32 gMonBackPic_BasculinBlueStriped[] = INCBIN_U32("graphics/pokemon/basculin/blue_striped/back.4bpp.smol"); const u16 gMonShinyPalette_BasculinBlueStriped[] = INCBIN_U16("graphics/pokemon/basculin/blue_striped/shiny.gbapal"); const u8 gMonIcon_BasculinBlueStriped[] = INCBIN_U8("graphics/pokemon/basculin/blue_striped/icon.4bpp"); @@ -16917,9 +16971,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_BasculinWhiteStriped[] = INCBIN_U32("graphics/pokemon/basculin/white_striped/anim_front.4bpp.lz"); + const u32 gMonFrontPic_BasculinWhiteStriped[] = INCBIN_U32("graphics/pokemon/basculin/white_striped/anim_front.4bpp.smol"); const u16 gMonPalette_BasculinWhiteStriped[] = INCBIN_U16("graphics/pokemon/basculin/white_striped/normal.gbapal"); - const u32 gMonBackPic_BasculinWhiteStriped[] = INCBIN_U32("graphics/pokemon/basculin/white_striped/back.4bpp.lz"); + const u32 gMonBackPic_BasculinWhiteStriped[] = INCBIN_U32("graphics/pokemon/basculin/white_striped/back.4bpp.smol"); const u16 gMonShinyPalette_BasculinWhiteStriped[] = INCBIN_U16("graphics/pokemon/basculin/white_striped/shiny.gbapal"); const u8 gMonIcon_BasculinWhiteStriped[] = INCBIN_U8("graphics/pokemon/basculin/white_striped/icon.4bpp"); @@ -16931,18 +16985,18 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_BasculegionM[] = INCBIN_U32("graphics/pokemon/basculegion/front.4bpp.lz"); + const u32 gMonFrontPic_BasculegionM[] = INCBIN_U32("graphics/pokemon/basculegion/front.4bpp.smol"); const u16 gMonPalette_BasculegionM[] = INCBIN_U16("graphics/pokemon/basculegion/normal.gbapal"); - const u32 gMonBackPic_BasculegionM[] = INCBIN_U32("graphics/pokemon/basculegion/back.4bpp.lz"); + const u32 gMonBackPic_BasculegionM[] = INCBIN_U32("graphics/pokemon/basculegion/back.4bpp.smol"); const u16 gMonShinyPalette_BasculegionM[] = INCBIN_U16("graphics/pokemon/basculegion/shiny.gbapal"); const u8 gMonIcon_BasculegionM[] = INCBIN_U8("graphics/pokemon/basculegion/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Basculegion[] = INCBIN_U8("graphics/pokemon/basculegion/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_BasculegionF[] = INCBIN_U32("graphics/pokemon/basculegion/f/front.4bpp.lz"); + const u32 gMonFrontPic_BasculegionF[] = INCBIN_U32("graphics/pokemon/basculegion/f/front.4bpp.smol"); const u16 gMonPalette_BasculegionF[] = INCBIN_U16("graphics/pokemon/basculegion/f/normal.gbapal"); - const u32 gMonBackPic_BasculegionF[] = INCBIN_U32("graphics/pokemon/basculegion/f/back.4bpp.lz"); + const u32 gMonBackPic_BasculegionF[] = INCBIN_U32("graphics/pokemon/basculegion/f/back.4bpp.smol"); const u16 gMonShinyPalette_BasculegionF[] = INCBIN_U16("graphics/pokemon/basculegion/f/shiny.gbapal"); const u8 gMonIcon_BasculegionF[] = INCBIN_U8("graphics/pokemon/basculegion/f/icon.4bpp"); @@ -16960,9 +17014,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BASCULIN #if P_FAMILY_SANDILE - const u32 gMonFrontPic_Sandile[] = INCBIN_U32("graphics/pokemon/sandile/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sandile[] = INCBIN_U32("graphics/pokemon/sandile/anim_front.4bpp.smol"); const u16 gMonPalette_Sandile[] = INCBIN_U16("graphics/pokemon/sandile/normal.gbapal"); - const u32 gMonBackPic_Sandile[] = INCBIN_U32("graphics/pokemon/sandile/back.4bpp.lz"); + const u32 gMonBackPic_Sandile[] = INCBIN_U32("graphics/pokemon/sandile/back.4bpp.smol"); const u16 gMonShinyPalette_Sandile[] = INCBIN_U16("graphics/pokemon/sandile/shiny.gbapal"); const u8 gMonIcon_Sandile[] = INCBIN_U8("graphics/pokemon/sandile/icon.4bpp"); #if P_FOOTPRINTS @@ -16976,9 +17030,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Krokorok[] = INCBIN_U32("graphics/pokemon/krokorok/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Krokorok[] = INCBIN_U32("graphics/pokemon/krokorok/anim_front.4bpp.smol"); const u16 gMonPalette_Krokorok[] = INCBIN_U16("graphics/pokemon/krokorok/normal.gbapal"); - const u32 gMonBackPic_Krokorok[] = INCBIN_U32("graphics/pokemon/krokorok/back.4bpp.lz"); + const u32 gMonBackPic_Krokorok[] = INCBIN_U32("graphics/pokemon/krokorok/back.4bpp.smol"); const u16 gMonShinyPalette_Krokorok[] = INCBIN_U16("graphics/pokemon/krokorok/shiny.gbapal"); const u8 gMonIcon_Krokorok[] = INCBIN_U8("graphics/pokemon/krokorok/icon.4bpp"); #if P_FOOTPRINTS @@ -16992,9 +17046,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Krookodile[] = INCBIN_U32("graphics/pokemon/krookodile/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Krookodile[] = INCBIN_U32("graphics/pokemon/krookodile/anim_front.4bpp.smol"); const u16 gMonPalette_Krookodile[] = INCBIN_U16("graphics/pokemon/krookodile/normal.gbapal"); - const u32 gMonBackPic_Krookodile[] = INCBIN_U32("graphics/pokemon/krookodile/back.4bpp.lz"); + const u32 gMonBackPic_Krookodile[] = INCBIN_U32("graphics/pokemon/krookodile/back.4bpp.smol"); const u16 gMonShinyPalette_Krookodile[] = INCBIN_U16("graphics/pokemon/krookodile/shiny.gbapal"); const u8 gMonIcon_Krookodile[] = INCBIN_U8("graphics/pokemon/krookodile/icon.4bpp"); #if P_FOOTPRINTS @@ -17010,9 +17064,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SANDILE #if P_FAMILY_DARUMAKA - const u32 gMonFrontPic_Darumaka[] = INCBIN_U32("graphics/pokemon/darumaka/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Darumaka[] = INCBIN_U32("graphics/pokemon/darumaka/anim_front.4bpp.smol"); const u16 gMonPalette_Darumaka[] = INCBIN_U16("graphics/pokemon/darumaka/normal.gbapal"); - const u32 gMonBackPic_Darumaka[] = INCBIN_U32("graphics/pokemon/darumaka/back.4bpp.lz"); + const u32 gMonBackPic_Darumaka[] = INCBIN_U32("graphics/pokemon/darumaka/back.4bpp.smol"); const u16 gMonShinyPalette_Darumaka[] = INCBIN_U16("graphics/pokemon/darumaka/shiny.gbapal"); const u8 gMonIcon_Darumaka[] = INCBIN_U8("graphics/pokemon/darumaka/icon.4bpp"); #if P_FOOTPRINTS @@ -17026,9 +17080,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_DarmanitanStandard[] = INCBIN_U32("graphics/pokemon/darmanitan/anim_front.4bpp.lz"); + const u32 gMonFrontPic_DarmanitanStandard[] = INCBIN_U32("graphics/pokemon/darmanitan/anim_front.4bpp.smol"); const u16 gMonPalette_DarmanitanStandard[] = INCBIN_U16("graphics/pokemon/darmanitan/normal.gbapal"); - const u32 gMonBackPic_DarmanitanStandard[] = INCBIN_U32("graphics/pokemon/darmanitan/back.4bpp.lz"); + const u32 gMonBackPic_DarmanitanStandard[] = INCBIN_U32("graphics/pokemon/darmanitan/back.4bpp.smol"); const u16 gMonShinyPalette_DarmanitanStandard[] = INCBIN_U16("graphics/pokemon/darmanitan/shiny.gbapal"); const u8 gMonIcon_DarmanitanStandard[] = INCBIN_U8("graphics/pokemon/darmanitan/icon.4bpp"); #if P_FOOTPRINTS @@ -17042,9 +17096,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_DarmanitanZen[] = INCBIN_U32("graphics/pokemon/darmanitan/zen/anim_front.4bpp.lz"); + const u32 gMonFrontPic_DarmanitanZen[] = INCBIN_U32("graphics/pokemon/darmanitan/zen/anim_front.4bpp.smol"); const u16 gMonPalette_DarmanitanZen[] = INCBIN_U16("graphics/pokemon/darmanitan/zen/normal.gbapal"); - const u32 gMonBackPic_DarmanitanZen[] = INCBIN_U32("graphics/pokemon/darmanitan/zen/back.4bpp.lz"); + const u32 gMonBackPic_DarmanitanZen[] = INCBIN_U32("graphics/pokemon/darmanitan/zen/back.4bpp.smol"); const u16 gMonShinyPalette_DarmanitanZen[] = INCBIN_U16("graphics/pokemon/darmanitan/zen/shiny.gbapal"); const u8 gMonIcon_DarmanitanZen[] = INCBIN_U8("graphics/pokemon/darmanitan/zen/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -17056,9 +17110,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_DarumakaGalar[] = INCBIN_U32("graphics/pokemon/darumaka/galar/front.4bpp.lz"); + const u32 gMonFrontPic_DarumakaGalar[] = INCBIN_U32("graphics/pokemon/darumaka/galar/front.4bpp.smol"); const u16 gMonPalette_DarumakaGalar[] = INCBIN_U16("graphics/pokemon/darumaka/galar/normal.gbapal"); - const u32 gMonBackPic_DarumakaGalar[] = INCBIN_U32("graphics/pokemon/darumaka/galar/back.4bpp.lz"); + const u32 gMonBackPic_DarumakaGalar[] = INCBIN_U32("graphics/pokemon/darumaka/galar/back.4bpp.smol"); const u16 gMonShinyPalette_DarumakaGalar[] = INCBIN_U16("graphics/pokemon/darumaka/galar/shiny.gbapal"); const u8 gMonIcon_DarumakaGalar[] = INCBIN_U8("graphics/pokemon/darumaka/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -17069,9 +17123,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_DarmanitanGalarStandard[] = INCBIN_U32("graphics/pokemon/darmanitan/galar_standard/front.4bpp.lz"); + const u32 gMonFrontPic_DarmanitanGalarStandard[] = INCBIN_U32("graphics/pokemon/darmanitan/galar_standard/front.4bpp.smol"); const u16 gMonPalette_DarmanitanGalarStandard[] = INCBIN_U16("graphics/pokemon/darmanitan/galar_standard/normal.gbapal"); - const u32 gMonBackPic_DarmanitanGalarStandard[] = INCBIN_U32("graphics/pokemon/darmanitan/galar_standard/back.4bpp.lz"); + const u32 gMonBackPic_DarmanitanGalarStandard[] = INCBIN_U32("graphics/pokemon/darmanitan/galar_standard/back.4bpp.smol"); const u16 gMonShinyPalette_DarmanitanGalarStandard[] = INCBIN_U16("graphics/pokemon/darmanitan/galar_standard/shiny.gbapal"); const u8 gMonIcon_DarmanitanGalarStandard[] = INCBIN_U8("graphics/pokemon/darmanitan/galar_standard/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -17082,9 +17136,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_DarmanitanGalarZen[] = INCBIN_U32("graphics/pokemon/darmanitan/galar_zen/front.4bpp.lz"); + const u32 gMonFrontPic_DarmanitanGalarZen[] = INCBIN_U32("graphics/pokemon/darmanitan/galar_zen/front.4bpp.smol"); const u16 gMonPalette_DarmanitanGalarZen[] = INCBIN_U16("graphics/pokemon/darmanitan/galar_zen/normal.gbapal"); - const u32 gMonBackPic_DarmanitanGalarZen[] = INCBIN_U32("graphics/pokemon/darmanitan/galar_zen/back.4bpp.lz"); + const u32 gMonBackPic_DarmanitanGalarZen[] = INCBIN_U32("graphics/pokemon/darmanitan/galar_zen/back.4bpp.smol"); const u16 gMonShinyPalette_DarmanitanGalarZen[] = INCBIN_U16("graphics/pokemon/darmanitan/galar_zen/shiny.gbapal"); const u8 gMonIcon_DarmanitanGalarZen[] = INCBIN_U8("graphics/pokemon/darmanitan/galar_zen/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -17098,9 +17152,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DARUMAKA #if P_FAMILY_MARACTUS - const u32 gMonFrontPic_Maractus[] = INCBIN_U32("graphics/pokemon/maractus/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Maractus[] = INCBIN_U32("graphics/pokemon/maractus/anim_front.4bpp.smol"); const u16 gMonPalette_Maractus[] = INCBIN_U16("graphics/pokemon/maractus/normal.gbapal"); - const u32 gMonBackPic_Maractus[] = INCBIN_U32("graphics/pokemon/maractus/back.4bpp.lz"); + const u32 gMonBackPic_Maractus[] = INCBIN_U32("graphics/pokemon/maractus/back.4bpp.smol"); const u16 gMonShinyPalette_Maractus[] = INCBIN_U16("graphics/pokemon/maractus/shiny.gbapal"); const u8 gMonIcon_Maractus[] = INCBIN_U8("graphics/pokemon/maractus/icon.4bpp"); #if P_FOOTPRINTS @@ -17116,9 +17170,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MARACTUS #if P_FAMILY_DWEBBLE - const u32 gMonFrontPic_Dwebble[] = INCBIN_U32("graphics/pokemon/dwebble/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dwebble[] = INCBIN_U32("graphics/pokemon/dwebble/anim_front.4bpp.smol"); const u16 gMonPalette_Dwebble[] = INCBIN_U16("graphics/pokemon/dwebble/normal.gbapal"); - const u32 gMonBackPic_Dwebble[] = INCBIN_U32("graphics/pokemon/dwebble/back.4bpp.lz"); + const u32 gMonBackPic_Dwebble[] = INCBIN_U32("graphics/pokemon/dwebble/back.4bpp.smol"); const u16 gMonShinyPalette_Dwebble[] = INCBIN_U16("graphics/pokemon/dwebble/shiny.gbapal"); const u8 gMonIcon_Dwebble[] = INCBIN_U8("graphics/pokemon/dwebble/icon.4bpp"); #if P_FOOTPRINTS @@ -17132,9 +17186,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Crustle[] = INCBIN_U32("graphics/pokemon/crustle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Crustle[] = INCBIN_U32("graphics/pokemon/crustle/anim_front.4bpp.smol"); const u16 gMonPalette_Crustle[] = INCBIN_U16("graphics/pokemon/crustle/normal.gbapal"); - const u32 gMonBackPic_Crustle[] = INCBIN_U32("graphics/pokemon/crustle/back.4bpp.lz"); + const u32 gMonBackPic_Crustle[] = INCBIN_U32("graphics/pokemon/crustle/back.4bpp.smol"); const u16 gMonShinyPalette_Crustle[] = INCBIN_U16("graphics/pokemon/crustle/shiny.gbapal"); const u8 gMonIcon_Crustle[] = INCBIN_U8("graphics/pokemon/crustle/icon.4bpp"); #if P_FOOTPRINTS @@ -17150,9 +17204,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DWEBBLE #if P_FAMILY_SCRAGGY - const u32 gMonFrontPic_Scraggy[] = INCBIN_U32("graphics/pokemon/scraggy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Scraggy[] = INCBIN_U32("graphics/pokemon/scraggy/anim_front.4bpp.smol"); const u16 gMonPalette_Scraggy[] = INCBIN_U16("graphics/pokemon/scraggy/normal.gbapal"); - const u32 gMonBackPic_Scraggy[] = INCBIN_U32("graphics/pokemon/scraggy/back.4bpp.lz"); + const u32 gMonBackPic_Scraggy[] = INCBIN_U32("graphics/pokemon/scraggy/back.4bpp.smol"); const u16 gMonShinyPalette_Scraggy[] = INCBIN_U16("graphics/pokemon/scraggy/shiny.gbapal"); const u8 gMonIcon_Scraggy[] = INCBIN_U8("graphics/pokemon/scraggy/icon.4bpp"); #if P_FOOTPRINTS @@ -17166,9 +17220,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Scrafty[] = INCBIN_U32("graphics/pokemon/scrafty/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Scrafty[] = INCBIN_U32("graphics/pokemon/scrafty/anim_front.4bpp.smol"); const u16 gMonPalette_Scrafty[] = INCBIN_U16("graphics/pokemon/scrafty/normal.gbapal"); - const u32 gMonBackPic_Scrafty[] = INCBIN_U32("graphics/pokemon/scrafty/back.4bpp.lz"); + const u32 gMonBackPic_Scrafty[] = INCBIN_U32("graphics/pokemon/scrafty/back.4bpp.smol"); const u16 gMonShinyPalette_Scrafty[] = INCBIN_U16("graphics/pokemon/scrafty/shiny.gbapal"); const u8 gMonIcon_Scrafty[] = INCBIN_U8("graphics/pokemon/scrafty/icon.4bpp"); #if P_FOOTPRINTS @@ -17184,9 +17238,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SCRAGGY #if P_FAMILY_SIGILYPH - const u32 gMonFrontPic_Sigilyph[] = INCBIN_U32("graphics/pokemon/sigilyph/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sigilyph[] = INCBIN_U32("graphics/pokemon/sigilyph/anim_front.4bpp.smol"); const u16 gMonPalette_Sigilyph[] = INCBIN_U16("graphics/pokemon/sigilyph/normal.gbapal"); - const u32 gMonBackPic_Sigilyph[] = INCBIN_U32("graphics/pokemon/sigilyph/back.4bpp.lz"); + const u32 gMonBackPic_Sigilyph[] = INCBIN_U32("graphics/pokemon/sigilyph/back.4bpp.smol"); const u16 gMonShinyPalette_Sigilyph[] = INCBIN_U16("graphics/pokemon/sigilyph/shiny.gbapal"); const u8 gMonIcon_Sigilyph[] = INCBIN_U8("graphics/pokemon/sigilyph/icon.4bpp"); #if P_FOOTPRINTS @@ -17202,9 +17256,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SIGILYPH #if P_FAMILY_YAMASK - const u32 gMonFrontPic_Yamask[] = INCBIN_U32("graphics/pokemon/yamask/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Yamask[] = INCBIN_U32("graphics/pokemon/yamask/anim_front.4bpp.smol"); const u16 gMonPalette_Yamask[] = INCBIN_U16("graphics/pokemon/yamask/normal.gbapal"); - const u32 gMonBackPic_Yamask[] = INCBIN_U32("graphics/pokemon/yamask/back.4bpp.lz"); + const u32 gMonBackPic_Yamask[] = INCBIN_U32("graphics/pokemon/yamask/back.4bpp.smol"); const u16 gMonShinyPalette_Yamask[] = INCBIN_U16("graphics/pokemon/yamask/shiny.gbapal"); const u8 gMonIcon_Yamask[] = INCBIN_U8("graphics/pokemon/yamask/icon.4bpp"); #if P_FOOTPRINTS @@ -17218,9 +17272,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Cofagrigus[] = INCBIN_U32("graphics/pokemon/cofagrigus/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cofagrigus[] = INCBIN_U32("graphics/pokemon/cofagrigus/anim_front.4bpp.smol"); const u16 gMonPalette_Cofagrigus[] = INCBIN_U16("graphics/pokemon/cofagrigus/normal.gbapal"); - const u32 gMonBackPic_Cofagrigus[] = INCBIN_U32("graphics/pokemon/cofagrigus/back.4bpp.lz"); + const u32 gMonBackPic_Cofagrigus[] = INCBIN_U32("graphics/pokemon/cofagrigus/back.4bpp.smol"); const u16 gMonShinyPalette_Cofagrigus[] = INCBIN_U16("graphics/pokemon/cofagrigus/shiny.gbapal"); const u8 gMonIcon_Cofagrigus[] = INCBIN_U8("graphics/pokemon/cofagrigus/icon.4bpp"); #if P_FOOTPRINTS @@ -17235,9 +17289,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_YamaskGalar[] = INCBIN_U32("graphics/pokemon/yamask/galar/front.4bpp.lz"); + const u32 gMonFrontPic_YamaskGalar[] = INCBIN_U32("graphics/pokemon/yamask/galar/front.4bpp.smol"); const u16 gMonPalette_YamaskGalar[] = INCBIN_U16("graphics/pokemon/yamask/galar/normal.gbapal"); - const u32 gMonBackPic_YamaskGalar[] = INCBIN_U32("graphics/pokemon/yamask/galar/back.4bpp.lz"); + const u32 gMonBackPic_YamaskGalar[] = INCBIN_U32("graphics/pokemon/yamask/galar/back.4bpp.smol"); const u16 gMonShinyPalette_YamaskGalar[] = INCBIN_U16("graphics/pokemon/yamask/galar/shiny.gbapal"); const u8 gMonIcon_YamaskGalar[] = INCBIN_U8("graphics/pokemon/yamask/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -17248,9 +17302,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Runerigus[] = INCBIN_U32("graphics/pokemon/runerigus/front.4bpp.lz"); + const u32 gMonFrontPic_Runerigus[] = INCBIN_U32("graphics/pokemon/runerigus/front.4bpp.smol"); const u16 gMonPalette_Runerigus[] = INCBIN_U16("graphics/pokemon/runerigus/normal.gbapal"); - const u32 gMonBackPic_Runerigus[] = INCBIN_U32("graphics/pokemon/runerigus/back.4bpp.lz"); + const u32 gMonBackPic_Runerigus[] = INCBIN_U32("graphics/pokemon/runerigus/back.4bpp.smol"); const u16 gMonShinyPalette_Runerigus[] = INCBIN_U16("graphics/pokemon/runerigus/shiny.gbapal"); const u8 gMonIcon_Runerigus[] = INCBIN_U8("graphics/pokemon/runerigus/icon.4bpp"); #if P_FOOTPRINTS @@ -17267,9 +17321,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_YAMASK #if P_FAMILY_TIRTOUGA - const u32 gMonFrontPic_Tirtouga[] = INCBIN_U32("graphics/pokemon/tirtouga/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tirtouga[] = INCBIN_U32("graphics/pokemon/tirtouga/anim_front.4bpp.smol"); const u16 gMonPalette_Tirtouga[] = INCBIN_U16("graphics/pokemon/tirtouga/normal.gbapal"); - const u32 gMonBackPic_Tirtouga[] = INCBIN_U32("graphics/pokemon/tirtouga/back.4bpp.lz"); + const u32 gMonBackPic_Tirtouga[] = INCBIN_U32("graphics/pokemon/tirtouga/back.4bpp.smol"); const u16 gMonShinyPalette_Tirtouga[] = INCBIN_U16("graphics/pokemon/tirtouga/shiny.gbapal"); const u8 gMonIcon_Tirtouga[] = INCBIN_U8("graphics/pokemon/tirtouga/icon.4bpp"); #if P_FOOTPRINTS @@ -17283,9 +17337,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Carracosta[] = INCBIN_U32("graphics/pokemon/carracosta/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Carracosta[] = INCBIN_U32("graphics/pokemon/carracosta/anim_front.4bpp.smol"); const u16 gMonPalette_Carracosta[] = INCBIN_U16("graphics/pokemon/carracosta/normal.gbapal"); - const u32 gMonBackPic_Carracosta[] = INCBIN_U32("graphics/pokemon/carracosta/back.4bpp.lz"); + const u32 gMonBackPic_Carracosta[] = INCBIN_U32("graphics/pokemon/carracosta/back.4bpp.smol"); const u16 gMonShinyPalette_Carracosta[] = INCBIN_U16("graphics/pokemon/carracosta/shiny.gbapal"); const u8 gMonIcon_Carracosta[] = INCBIN_U8("graphics/pokemon/carracosta/icon.4bpp"); #if P_FOOTPRINTS @@ -17301,9 +17355,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TIRTOUGA #if P_FAMILY_ARCHEN - const u32 gMonFrontPic_Archen[] = INCBIN_U32("graphics/pokemon/archen/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Archen[] = INCBIN_U32("graphics/pokemon/archen/anim_front.4bpp.smol"); const u16 gMonPalette_Archen[] = INCBIN_U16("graphics/pokemon/archen/normal.gbapal"); - const u32 gMonBackPic_Archen[] = INCBIN_U32("graphics/pokemon/archen/back.4bpp.lz"); + const u32 gMonBackPic_Archen[] = INCBIN_U32("graphics/pokemon/archen/back.4bpp.smol"); const u16 gMonShinyPalette_Archen[] = INCBIN_U16("graphics/pokemon/archen/shiny.gbapal"); const u8 gMonIcon_Archen[] = INCBIN_U8("graphics/pokemon/archen/icon.4bpp"); #if P_FOOTPRINTS @@ -17317,9 +17371,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Archeops[] = INCBIN_U32("graphics/pokemon/archeops/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Archeops[] = INCBIN_U32("graphics/pokemon/archeops/anim_front.4bpp.smol"); const u16 gMonPalette_Archeops[] = INCBIN_U16("graphics/pokemon/archeops/normal.gbapal"); - const u32 gMonBackPic_Archeops[] = INCBIN_U32("graphics/pokemon/archeops/back.4bpp.lz"); + const u32 gMonBackPic_Archeops[] = INCBIN_U32("graphics/pokemon/archeops/back.4bpp.smol"); const u16 gMonShinyPalette_Archeops[] = INCBIN_U16("graphics/pokemon/archeops/shiny.gbapal"); const u8 gMonIcon_Archeops[] = INCBIN_U8("graphics/pokemon/archeops/icon.4bpp"); #if P_FOOTPRINTS @@ -17335,9 +17389,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ARCHEN #if P_FAMILY_TRUBBISH - const u32 gMonFrontPic_Trubbish[] = INCBIN_U32("graphics/pokemon/trubbish/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Trubbish[] = INCBIN_U32("graphics/pokemon/trubbish/anim_front.4bpp.smol"); const u16 gMonPalette_Trubbish[] = INCBIN_U16("graphics/pokemon/trubbish/normal.gbapal"); - const u32 gMonBackPic_Trubbish[] = INCBIN_U32("graphics/pokemon/trubbish/back.4bpp.lz"); + const u32 gMonBackPic_Trubbish[] = INCBIN_U32("graphics/pokemon/trubbish/back.4bpp.smol"); const u16 gMonShinyPalette_Trubbish[] = INCBIN_U16("graphics/pokemon/trubbish/shiny.gbapal"); const u8 gMonIcon_Trubbish[] = INCBIN_U8("graphics/pokemon/trubbish/icon.4bpp"); #if P_FOOTPRINTS @@ -17351,9 +17405,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Garbodor[] = INCBIN_U32("graphics/pokemon/garbodor/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Garbodor[] = INCBIN_U32("graphics/pokemon/garbodor/anim_front.4bpp.smol"); const u16 gMonPalette_Garbodor[] = INCBIN_U16("graphics/pokemon/garbodor/normal.gbapal"); - const u32 gMonBackPic_Garbodor[] = INCBIN_U32("graphics/pokemon/garbodor/back.4bpp.lz"); + const u32 gMonBackPic_Garbodor[] = INCBIN_U32("graphics/pokemon/garbodor/back.4bpp.smol"); const u16 gMonShinyPalette_Garbodor[] = INCBIN_U16("graphics/pokemon/garbodor/shiny.gbapal"); const u8 gMonIcon_Garbodor[] = INCBIN_U8("graphics/pokemon/garbodor/icon.4bpp"); #if P_FOOTPRINTS @@ -17368,8 +17422,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_GarbodorGmax[] = INCBIN_U32("graphics/pokemon/garbodor/gmax/front.4bpp.lz"); - const u32 gMonBackPic_GarbodorGmax[] = INCBIN_U32("graphics/pokemon/garbodor/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_GarbodorGmax[] = INCBIN_U32("graphics/pokemon/garbodor/gmax/front.4bpp.smol"); + const u32 gMonBackPic_GarbodorGmax[] = INCBIN_U32("graphics/pokemon/garbodor/gmax/back.4bpp.smol"); const u16 gMonPalette_GarbodorGmax[] = INCBIN_U16("graphics/pokemon/garbodor/gmax/normal.gbapal"); const u16 gMonShinyPalette_GarbodorGmax[] = INCBIN_U16("graphics/pokemon/garbodor/gmax/shiny.gbapal"); const u8 gMonIcon_GarbodorGmax[] = INCBIN_U8("graphics/pokemon/garbodor/gmax/icon.4bpp"); @@ -17384,9 +17438,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TRUBBISH #if P_FAMILY_ZORUA - const u32 gMonFrontPic_Zorua[] = INCBIN_U32("graphics/pokemon/zorua/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Zorua[] = INCBIN_U32("graphics/pokemon/zorua/anim_front.4bpp.smol"); const u16 gMonPalette_Zorua[] = INCBIN_U16("graphics/pokemon/zorua/normal.gbapal"); - const u32 gMonBackPic_Zorua[] = INCBIN_U32("graphics/pokemon/zorua/back.4bpp.lz"); + const u32 gMonBackPic_Zorua[] = INCBIN_U32("graphics/pokemon/zorua/back.4bpp.smol"); const u16 gMonShinyPalette_Zorua[] = INCBIN_U16("graphics/pokemon/zorua/shiny.gbapal"); const u8 gMonIcon_Zorua[] = INCBIN_U8("graphics/pokemon/zorua/icon.4bpp"); #if P_FOOTPRINTS @@ -17400,9 +17454,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Zoroark[] = INCBIN_U32("graphics/pokemon/zoroark/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Zoroark[] = INCBIN_U32("graphics/pokemon/zoroark/anim_front.4bpp.smol"); const u16 gMonPalette_Zoroark[] = INCBIN_U16("graphics/pokemon/zoroark/normal.gbapal"); - const u32 gMonBackPic_Zoroark[] = INCBIN_U32("graphics/pokemon/zoroark/back.4bpp.lz"); + const u32 gMonBackPic_Zoroark[] = INCBIN_U32("graphics/pokemon/zoroark/back.4bpp.smol"); const u16 gMonShinyPalette_Zoroark[] = INCBIN_U16("graphics/pokemon/zoroark/shiny.gbapal"); const u8 gMonIcon_Zoroark[] = INCBIN_U8("graphics/pokemon/zoroark/icon.4bpp"); #if P_FOOTPRINTS @@ -17417,9 +17471,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_ZoruaHisui[] = INCBIN_U32("graphics/pokemon/zorua/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_ZoruaHisui[] = INCBIN_U32("graphics/pokemon/zorua/hisui/front.4bpp.smol"); const u16 gMonPalette_ZoruaHisui[] = INCBIN_U16("graphics/pokemon/zorua/hisui/normal.gbapal"); - const u32 gMonBackPic_ZoruaHisui[] = INCBIN_U32("graphics/pokemon/zorua/hisui/back.4bpp.lz"); + const u32 gMonBackPic_ZoruaHisui[] = INCBIN_U32("graphics/pokemon/zorua/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_ZoruaHisui[] = INCBIN_U16("graphics/pokemon/zorua/hisui/shiny.gbapal"); const u8 gMonIcon_ZoruaHisui[] = INCBIN_U8("graphics/pokemon/zorua/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -17430,9 +17484,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_ZoroarkHisui[] = INCBIN_U32("graphics/pokemon/zoroark/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_ZoroarkHisui[] = INCBIN_U32("graphics/pokemon/zoroark/hisui/front.4bpp.smol"); const u16 gMonPalette_ZoroarkHisui[] = INCBIN_U16("graphics/pokemon/zoroark/hisui/normal.gbapal"); - const u32 gMonBackPic_ZoroarkHisui[] = INCBIN_U32("graphics/pokemon/zoroark/hisui/back.4bpp.lz"); + const u32 gMonBackPic_ZoroarkHisui[] = INCBIN_U32("graphics/pokemon/zoroark/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_ZoroarkHisui[] = INCBIN_U16("graphics/pokemon/zoroark/hisui/shiny.gbapal"); const u8 gMonIcon_ZoroarkHisui[] = INCBIN_U8("graphics/pokemon/zoroark/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -17446,9 +17500,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ZORUA #if P_FAMILY_MINCCINO - const u32 gMonFrontPic_Minccino[] = INCBIN_U32("graphics/pokemon/minccino/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Minccino[] = INCBIN_U32("graphics/pokemon/minccino/anim_front.4bpp.smol"); const u16 gMonPalette_Minccino[] = INCBIN_U16("graphics/pokemon/minccino/normal.gbapal"); - const u32 gMonBackPic_Minccino[] = INCBIN_U32("graphics/pokemon/minccino/back.4bpp.lz"); + const u32 gMonBackPic_Minccino[] = INCBIN_U32("graphics/pokemon/minccino/back.4bpp.smol"); const u16 gMonShinyPalette_Minccino[] = INCBIN_U16("graphics/pokemon/minccino/shiny.gbapal"); const u8 gMonIcon_Minccino[] = INCBIN_U8("graphics/pokemon/minccino/icon.4bpp"); #if P_FOOTPRINTS @@ -17462,9 +17516,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Cinccino[] = INCBIN_U32("graphics/pokemon/cinccino/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cinccino[] = INCBIN_U32("graphics/pokemon/cinccino/anim_front.4bpp.smol"); const u16 gMonPalette_Cinccino[] = INCBIN_U16("graphics/pokemon/cinccino/normal.gbapal"); - const u32 gMonBackPic_Cinccino[] = INCBIN_U32("graphics/pokemon/cinccino/back.4bpp.lz"); + const u32 gMonBackPic_Cinccino[] = INCBIN_U32("graphics/pokemon/cinccino/back.4bpp.smol"); const u16 gMonShinyPalette_Cinccino[] = INCBIN_U16("graphics/pokemon/cinccino/shiny.gbapal"); const u8 gMonIcon_Cinccino[] = INCBIN_U8("graphics/pokemon/cinccino/icon.4bpp"); #if P_FOOTPRINTS @@ -17480,9 +17534,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MINCCINO #if P_FAMILY_GOTHITA - const u32 gMonFrontPic_Gothita[] = INCBIN_U32("graphics/pokemon/gothita/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gothita[] = INCBIN_U32("graphics/pokemon/gothita/anim_front.4bpp.smol"); const u16 gMonPalette_Gothita[] = INCBIN_U16("graphics/pokemon/gothita/normal.gbapal"); - const u32 gMonBackPic_Gothita[] = INCBIN_U32("graphics/pokemon/gothita/back.4bpp.lz"); + const u32 gMonBackPic_Gothita[] = INCBIN_U32("graphics/pokemon/gothita/back.4bpp.smol"); const u16 gMonShinyPalette_Gothita[] = INCBIN_U16("graphics/pokemon/gothita/shiny.gbapal"); const u8 gMonIcon_Gothita[] = INCBIN_U8("graphics/pokemon/gothita/icon.4bpp"); #if P_FOOTPRINTS @@ -17496,9 +17550,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Gothorita[] = INCBIN_U32("graphics/pokemon/gothorita/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gothorita[] = INCBIN_U32("graphics/pokemon/gothorita/anim_front.4bpp.smol"); const u16 gMonPalette_Gothorita[] = INCBIN_U16("graphics/pokemon/gothorita/normal.gbapal"); - const u32 gMonBackPic_Gothorita[] = INCBIN_U32("graphics/pokemon/gothorita/back.4bpp.lz"); + const u32 gMonBackPic_Gothorita[] = INCBIN_U32("graphics/pokemon/gothorita/back.4bpp.smol"); const u16 gMonShinyPalette_Gothorita[] = INCBIN_U16("graphics/pokemon/gothorita/shiny.gbapal"); const u8 gMonIcon_Gothorita[] = INCBIN_U8("graphics/pokemon/gothorita/icon.4bpp"); #if P_FOOTPRINTS @@ -17512,9 +17566,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Gothitelle[] = INCBIN_U32("graphics/pokemon/gothitelle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gothitelle[] = INCBIN_U32("graphics/pokemon/gothitelle/anim_front.4bpp.smol"); const u16 gMonPalette_Gothitelle[] = INCBIN_U16("graphics/pokemon/gothitelle/normal.gbapal"); - const u32 gMonBackPic_Gothitelle[] = INCBIN_U32("graphics/pokemon/gothitelle/back.4bpp.lz"); + const u32 gMonBackPic_Gothitelle[] = INCBIN_U32("graphics/pokemon/gothitelle/back.4bpp.smol"); const u16 gMonShinyPalette_Gothitelle[] = INCBIN_U16("graphics/pokemon/gothitelle/shiny.gbapal"); const u8 gMonIcon_Gothitelle[] = INCBIN_U8("graphics/pokemon/gothitelle/icon.4bpp"); #if P_FOOTPRINTS @@ -17530,9 +17584,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GOTHITA #if P_FAMILY_SOLOSIS - const u32 gMonFrontPic_Solosis[] = INCBIN_U32("graphics/pokemon/solosis/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Solosis[] = INCBIN_U32("graphics/pokemon/solosis/anim_front.4bpp.smol"); const u16 gMonPalette_Solosis[] = INCBIN_U16("graphics/pokemon/solosis/normal.gbapal"); - const u32 gMonBackPic_Solosis[] = INCBIN_U32("graphics/pokemon/solosis/back.4bpp.lz"); + const u32 gMonBackPic_Solosis[] = INCBIN_U32("graphics/pokemon/solosis/back.4bpp.smol"); const u16 gMonShinyPalette_Solosis[] = INCBIN_U16("graphics/pokemon/solosis/shiny.gbapal"); const u8 gMonIcon_Solosis[] = INCBIN_U8("graphics/pokemon/solosis/icon.4bpp"); #if P_FOOTPRINTS @@ -17546,9 +17600,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Duosion[] = INCBIN_U32("graphics/pokemon/duosion/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Duosion[] = INCBIN_U32("graphics/pokemon/duosion/anim_front.4bpp.smol"); const u16 gMonPalette_Duosion[] = INCBIN_U16("graphics/pokemon/duosion/normal.gbapal"); - const u32 gMonBackPic_Duosion[] = INCBIN_U32("graphics/pokemon/duosion/back.4bpp.lz"); + const u32 gMonBackPic_Duosion[] = INCBIN_U32("graphics/pokemon/duosion/back.4bpp.smol"); const u16 gMonShinyPalette_Duosion[] = INCBIN_U16("graphics/pokemon/duosion/shiny.gbapal"); const u8 gMonIcon_Duosion[] = INCBIN_U8("graphics/pokemon/duosion/icon.4bpp"); #if P_FOOTPRINTS @@ -17562,9 +17616,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Reuniclus[] = INCBIN_U32("graphics/pokemon/reuniclus/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Reuniclus[] = INCBIN_U32("graphics/pokemon/reuniclus/anim_front.4bpp.smol"); const u16 gMonPalette_Reuniclus[] = INCBIN_U16("graphics/pokemon/reuniclus/normal.gbapal"); - const u32 gMonBackPic_Reuniclus[] = INCBIN_U32("graphics/pokemon/reuniclus/back.4bpp.lz"); + const u32 gMonBackPic_Reuniclus[] = INCBIN_U32("graphics/pokemon/reuniclus/back.4bpp.smol"); const u16 gMonShinyPalette_Reuniclus[] = INCBIN_U16("graphics/pokemon/reuniclus/shiny.gbapal"); const u8 gMonIcon_Reuniclus[] = INCBIN_U8("graphics/pokemon/reuniclus/icon.4bpp"); #if P_FOOTPRINTS @@ -17580,9 +17634,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SOLOSIS #if P_FAMILY_DUCKLETT - const u32 gMonFrontPic_Ducklett[] = INCBIN_U32("graphics/pokemon/ducklett/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ducklett[] = INCBIN_U32("graphics/pokemon/ducklett/anim_front.4bpp.smol"); const u16 gMonPalette_Ducklett[] = INCBIN_U16("graphics/pokemon/ducklett/normal.gbapal"); - const u32 gMonBackPic_Ducklett[] = INCBIN_U32("graphics/pokemon/ducklett/back.4bpp.lz"); + const u32 gMonBackPic_Ducklett[] = INCBIN_U32("graphics/pokemon/ducklett/back.4bpp.smol"); const u16 gMonShinyPalette_Ducklett[] = INCBIN_U16("graphics/pokemon/ducklett/shiny.gbapal"); const u8 gMonIcon_Ducklett[] = INCBIN_U8("graphics/pokemon/ducklett/icon.4bpp"); #if P_FOOTPRINTS @@ -17596,9 +17650,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Swanna[] = INCBIN_U32("graphics/pokemon/swanna/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Swanna[] = INCBIN_U32("graphics/pokemon/swanna/anim_front.4bpp.smol"); const u16 gMonPalette_Swanna[] = INCBIN_U16("graphics/pokemon/swanna/normal.gbapal"); - const u32 gMonBackPic_Swanna[] = INCBIN_U32("graphics/pokemon/swanna/back.4bpp.lz"); + const u32 gMonBackPic_Swanna[] = INCBIN_U32("graphics/pokemon/swanna/back.4bpp.smol"); const u16 gMonShinyPalette_Swanna[] = INCBIN_U16("graphics/pokemon/swanna/shiny.gbapal"); const u8 gMonIcon_Swanna[] = INCBIN_U8("graphics/pokemon/swanna/icon.4bpp"); #if P_FOOTPRINTS @@ -17614,9 +17668,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DUCKLETT #if P_FAMILY_VANILLITE - const u32 gMonFrontPic_Vanillite[] = INCBIN_U32("graphics/pokemon/vanillite/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Vanillite[] = INCBIN_U32("graphics/pokemon/vanillite/anim_front.4bpp.smol"); const u16 gMonPalette_Vanillite[] = INCBIN_U16("graphics/pokemon/vanillite/normal.gbapal"); - const u32 gMonBackPic_Vanillite[] = INCBIN_U32("graphics/pokemon/vanillite/back.4bpp.lz"); + const u32 gMonBackPic_Vanillite[] = INCBIN_U32("graphics/pokemon/vanillite/back.4bpp.smol"); const u16 gMonShinyPalette_Vanillite[] = INCBIN_U16("graphics/pokemon/vanillite/shiny.gbapal"); const u8 gMonIcon_Vanillite[] = INCBIN_U8("graphics/pokemon/vanillite/icon.4bpp"); #if P_FOOTPRINTS @@ -17630,9 +17684,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Vanillish[] = INCBIN_U32("graphics/pokemon/vanillish/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Vanillish[] = INCBIN_U32("graphics/pokemon/vanillish/anim_front.4bpp.smol"); const u16 gMonPalette_Vanillish[] = INCBIN_U16("graphics/pokemon/vanillish/normal.gbapal"); - const u32 gMonBackPic_Vanillish[] = INCBIN_U32("graphics/pokemon/vanillish/back.4bpp.lz"); + const u32 gMonBackPic_Vanillish[] = INCBIN_U32("graphics/pokemon/vanillish/back.4bpp.smol"); const u16 gMonShinyPalette_Vanillish[] = INCBIN_U16("graphics/pokemon/vanillish/shiny.gbapal"); const u8 gMonIcon_Vanillish[] = INCBIN_U8("graphics/pokemon/vanillish/icon.4bpp"); #if P_FOOTPRINTS @@ -17646,9 +17700,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Vanilluxe[] = INCBIN_U32("graphics/pokemon/vanilluxe/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Vanilluxe[] = INCBIN_U32("graphics/pokemon/vanilluxe/anim_front.4bpp.smol"); const u16 gMonPalette_Vanilluxe[] = INCBIN_U16("graphics/pokemon/vanilluxe/normal.gbapal"); - const u32 gMonBackPic_Vanilluxe[] = INCBIN_U32("graphics/pokemon/vanilluxe/back.4bpp.lz"); + const u32 gMonBackPic_Vanilluxe[] = INCBIN_U32("graphics/pokemon/vanilluxe/back.4bpp.smol"); const u16 gMonShinyPalette_Vanilluxe[] = INCBIN_U16("graphics/pokemon/vanilluxe/shiny.gbapal"); const u8 gMonIcon_Vanilluxe[] = INCBIN_U8("graphics/pokemon/vanilluxe/icon.4bpp"); #if P_FOOTPRINTS @@ -17664,8 +17718,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_VANILLITE #if P_FAMILY_DEERLING - const u32 gMonFrontPic_Deerling[] = INCBIN_U32("graphics/pokemon/deerling/anim_front.4bpp.lz"); - const u32 gMonBackPic_Deerling[] = INCBIN_U32("graphics/pokemon/deerling/back.4bpp.lz"); + const u32 gMonFrontPic_Deerling[] = INCBIN_U32("graphics/pokemon/deerling/anim_front.4bpp.smol"); + const u32 gMonBackPic_Deerling[] = INCBIN_U32("graphics/pokemon/deerling/back.4bpp.smol"); #if P_FOOTPRINTS const u8 gMonFootprint_Deerling[] = INCBIN_U8("graphics/pokemon/deerling/footprint.1bpp"); #endif //P_FOOTPRINTS @@ -17703,30 +17757,30 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_SawsbuckSpring[] = INCBIN_U32("graphics/pokemon/sawsbuck/anim_front.4bpp.lz"); + const u32 gMonFrontPic_SawsbuckSpring[] = INCBIN_U32("graphics/pokemon/sawsbuck/anim_front.4bpp.smol"); const u16 gMonPalette_SawsbuckSpring[] = INCBIN_U16("graphics/pokemon/sawsbuck/normal.gbapal"); - const u32 gMonBackPic_SawsbuckSpring[] = INCBIN_U32("graphics/pokemon/sawsbuck/back.4bpp.lz"); + const u32 gMonBackPic_SawsbuckSpring[] = INCBIN_U32("graphics/pokemon/sawsbuck/back.4bpp.smol"); const u16 gMonShinyPalette_SawsbuckSpring[] = INCBIN_U16("graphics/pokemon/sawsbuck/shiny.gbapal"); const u8 gMonIcon_SawsbuckSpring[] = INCBIN_U8("graphics/pokemon/sawsbuck/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Sawsbuck[] = INCBIN_U8("graphics/pokemon/sawsbuck/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_SawsbuckSummer[] = INCBIN_U32("graphics/pokemon/sawsbuck/summer/anim_front.4bpp.lz"); + const u32 gMonFrontPic_SawsbuckSummer[] = INCBIN_U32("graphics/pokemon/sawsbuck/summer/anim_front.4bpp.smol"); const u16 gMonPalette_SawsbuckSummer[] = INCBIN_U16("graphics/pokemon/sawsbuck/summer/normal.gbapal"); - const u32 gMonBackPic_SawsbuckSummer[] = INCBIN_U32("graphics/pokemon/sawsbuck/summer/back.4bpp.lz"); + const u32 gMonBackPic_SawsbuckSummer[] = INCBIN_U32("graphics/pokemon/sawsbuck/summer/back.4bpp.smol"); const u16 gMonShinyPalette_SawsbuckSummer[] = INCBIN_U16("graphics/pokemon/sawsbuck/summer/shiny.gbapal"); const u8 gMonIcon_SawsbuckSummer[] = INCBIN_U8("graphics/pokemon/sawsbuck/summer/icon.4bpp"); - const u32 gMonFrontPic_SawsbuckAutumn[] = INCBIN_U32("graphics/pokemon/sawsbuck/autumn/anim_front.4bpp.lz"); + const u32 gMonFrontPic_SawsbuckAutumn[] = INCBIN_U32("graphics/pokemon/sawsbuck/autumn/anim_front.4bpp.smol"); const u16 gMonPalette_SawsbuckAutumn[] = INCBIN_U16("graphics/pokemon/sawsbuck/autumn/normal.gbapal"); - const u32 gMonBackPic_SawsbuckAutumn[] = INCBIN_U32("graphics/pokemon/sawsbuck/autumn/back.4bpp.lz"); + const u32 gMonBackPic_SawsbuckAutumn[] = INCBIN_U32("graphics/pokemon/sawsbuck/autumn/back.4bpp.smol"); const u16 gMonShinyPalette_SawsbuckAutumn[] = INCBIN_U16("graphics/pokemon/sawsbuck/autumn/shiny.gbapal"); const u8 gMonIcon_SawsbuckAutumn[] = INCBIN_U8("graphics/pokemon/sawsbuck/autumn/icon.4bpp"); - const u32 gMonFrontPic_SawsbuckWinter[] = INCBIN_U32("graphics/pokemon/sawsbuck/winter/anim_front.4bpp.lz"); + const u32 gMonFrontPic_SawsbuckWinter[] = INCBIN_U32("graphics/pokemon/sawsbuck/winter/anim_front.4bpp.smol"); const u16 gMonPalette_SawsbuckWinter[] = INCBIN_U16("graphics/pokemon/sawsbuck/winter/normal.gbapal"); - const u32 gMonBackPic_SawsbuckWinter[] = INCBIN_U32("graphics/pokemon/sawsbuck/winter/back.4bpp.lz"); + const u32 gMonBackPic_SawsbuckWinter[] = INCBIN_U32("graphics/pokemon/sawsbuck/winter/back.4bpp.smol"); const u16 gMonShinyPalette_SawsbuckWinter[] = INCBIN_U16("graphics/pokemon/sawsbuck/winter/shiny.gbapal"); const u8 gMonIcon_SawsbuckWinter[] = INCBIN_U8("graphics/pokemon/sawsbuck/winter/icon.4bpp"); @@ -17749,9 +17803,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DEERLING #if P_FAMILY_EMOLGA - const u32 gMonFrontPic_Emolga[] = INCBIN_U32("graphics/pokemon/emolga/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Emolga[] = INCBIN_U32("graphics/pokemon/emolga/anim_front.4bpp.smol"); const u16 gMonPalette_Emolga[] = INCBIN_U16("graphics/pokemon/emolga/normal.gbapal"); - const u32 gMonBackPic_Emolga[] = INCBIN_U32("graphics/pokemon/emolga/back.4bpp.lz"); + const u32 gMonBackPic_Emolga[] = INCBIN_U32("graphics/pokemon/emolga/back.4bpp.smol"); const u16 gMonShinyPalette_Emolga[] = INCBIN_U16("graphics/pokemon/emolga/shiny.gbapal"); const u8 gMonIcon_Emolga[] = INCBIN_U8("graphics/pokemon/emolga/icon.4bpp"); #if P_FOOTPRINTS @@ -17767,9 +17821,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_EMOLGA #if P_FAMILY_KARRABLAST - const u32 gMonFrontPic_Karrablast[] = INCBIN_U32("graphics/pokemon/karrablast/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Karrablast[] = INCBIN_U32("graphics/pokemon/karrablast/anim_front.4bpp.smol"); const u16 gMonPalette_Karrablast[] = INCBIN_U16("graphics/pokemon/karrablast/normal.gbapal"); - const u32 gMonBackPic_Karrablast[] = INCBIN_U32("graphics/pokemon/karrablast/back.4bpp.lz"); + const u32 gMonBackPic_Karrablast[] = INCBIN_U32("graphics/pokemon/karrablast/back.4bpp.smol"); const u16 gMonShinyPalette_Karrablast[] = INCBIN_U16("graphics/pokemon/karrablast/shiny.gbapal"); const u8 gMonIcon_Karrablast[] = INCBIN_U8("graphics/pokemon/karrablast/icon.4bpp"); #if P_FOOTPRINTS @@ -17783,9 +17837,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Escavalier[] = INCBIN_U32("graphics/pokemon/escavalier/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Escavalier[] = INCBIN_U32("graphics/pokemon/escavalier/anim_front.4bpp.smol"); const u16 gMonPalette_Escavalier[] = INCBIN_U16("graphics/pokemon/escavalier/normal.gbapal"); - const u32 gMonBackPic_Escavalier[] = INCBIN_U32("graphics/pokemon/escavalier/back.4bpp.lz"); + const u32 gMonBackPic_Escavalier[] = INCBIN_U32("graphics/pokemon/escavalier/back.4bpp.smol"); const u16 gMonShinyPalette_Escavalier[] = INCBIN_U16("graphics/pokemon/escavalier/shiny.gbapal"); const u8 gMonIcon_Escavalier[] = INCBIN_U8("graphics/pokemon/escavalier/icon.4bpp"); #if P_FOOTPRINTS @@ -17801,9 +17855,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_KARRABLAST #if P_FAMILY_FOONGUS - const u32 gMonFrontPic_Foongus[] = INCBIN_U32("graphics/pokemon/foongus/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Foongus[] = INCBIN_U32("graphics/pokemon/foongus/anim_front.4bpp.smol"); const u16 gMonPalette_Foongus[] = INCBIN_U16("graphics/pokemon/foongus/normal.gbapal"); - const u32 gMonBackPic_Foongus[] = INCBIN_U32("graphics/pokemon/foongus/back.4bpp.lz"); + const u32 gMonBackPic_Foongus[] = INCBIN_U32("graphics/pokemon/foongus/back.4bpp.smol"); const u16 gMonShinyPalette_Foongus[] = INCBIN_U16("graphics/pokemon/foongus/shiny.gbapal"); const u8 gMonIcon_Foongus[] = INCBIN_U8("graphics/pokemon/foongus/icon.4bpp"); #if P_FOOTPRINTS @@ -17817,9 +17871,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Amoonguss[] = INCBIN_U32("graphics/pokemon/amoonguss/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Amoonguss[] = INCBIN_U32("graphics/pokemon/amoonguss/anim_front.4bpp.smol"); const u16 gMonPalette_Amoonguss[] = INCBIN_U16("graphics/pokemon/amoonguss/normal.gbapal"); - const u32 gMonBackPic_Amoonguss[] = INCBIN_U32("graphics/pokemon/amoonguss/back.4bpp.lz"); + const u32 gMonBackPic_Amoonguss[] = INCBIN_U32("graphics/pokemon/amoonguss/back.4bpp.smol"); const u16 gMonShinyPalette_Amoonguss[] = INCBIN_U16("graphics/pokemon/amoonguss/shiny.gbapal"); const u8 gMonIcon_Amoonguss[] = INCBIN_U8("graphics/pokemon/amoonguss/icon.4bpp"); #if P_FOOTPRINTS @@ -17835,9 +17889,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FOONGUS #if P_FAMILY_FRILLISH - const u32 gMonFrontPic_Frillish[] = INCBIN_U32("graphics/pokemon/frillish/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Frillish[] = INCBIN_U32("graphics/pokemon/frillish/anim_front.4bpp.smol"); const u16 gMonPalette_Frillish[] = INCBIN_U16("graphics/pokemon/frillish/normal.gbapal"); - const u32 gMonBackPic_Frillish[] = INCBIN_U32("graphics/pokemon/frillish/back.4bpp.lz"); + const u32 gMonBackPic_Frillish[] = INCBIN_U32("graphics/pokemon/frillish/back.4bpp.smol"); const u16 gMonShinyPalette_Frillish[] = INCBIN_U16("graphics/pokemon/frillish/shiny.gbapal"); const u8 gMonIcon_Frillish[] = INCBIN_U8("graphics/pokemon/frillish/icon.4bpp"); #if P_FOOTPRINTS @@ -17852,9 +17906,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_FrillishF[] = INCBIN_U32("graphics/pokemon/frillish/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_FrillishF[] = INCBIN_U32("graphics/pokemon/frillish/anim_frontf.4bpp.smol"); const u16 gMonPalette_FrillishF[] = INCBIN_U16("graphics/pokemon/frillish/normalf.gbapal"); - const u32 gMonBackPic_FrillishF[] = INCBIN_U32("graphics/pokemon/frillish/backf.4bpp.lz"); + const u32 gMonBackPic_FrillishF[] = INCBIN_U32("graphics/pokemon/frillish/backf.4bpp.smol"); const u16 gMonShinyPalette_FrillishF[] = INCBIN_U16("graphics/pokemon/frillish/shinyf.gbapal"); const u8 gMonIcon_FrillishF[] = INCBIN_U8("graphics/pokemon/frillish/iconf.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -17866,9 +17920,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Jellicent[] = INCBIN_U32("graphics/pokemon/jellicent/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Jellicent[] = INCBIN_U32("graphics/pokemon/jellicent/anim_front.4bpp.smol"); const u16 gMonPalette_Jellicent[] = INCBIN_U16("graphics/pokemon/jellicent/normal.gbapal"); - const u32 gMonBackPic_Jellicent[] = INCBIN_U32("graphics/pokemon/jellicent/back.4bpp.lz"); + const u32 gMonBackPic_Jellicent[] = INCBIN_U32("graphics/pokemon/jellicent/back.4bpp.smol"); const u16 gMonShinyPalette_Jellicent[] = INCBIN_U16("graphics/pokemon/jellicent/shiny.gbapal"); const u8 gMonIcon_Jellicent[] = INCBIN_U8("graphics/pokemon/jellicent/icon.4bpp"); #if P_FOOTPRINTS @@ -17883,9 +17937,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_JellicentF[] = INCBIN_U32("graphics/pokemon/jellicent/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_JellicentF[] = INCBIN_U32("graphics/pokemon/jellicent/anim_frontf.4bpp.smol"); const u16 gMonPalette_JellicentF[] = INCBIN_U16("graphics/pokemon/jellicent/normalf.gbapal"); - const u32 gMonBackPic_JellicentF[] = INCBIN_U32("graphics/pokemon/jellicent/backf.4bpp.lz"); + const u32 gMonBackPic_JellicentF[] = INCBIN_U32("graphics/pokemon/jellicent/backf.4bpp.smol"); const u16 gMonShinyPalette_JellicentF[] = INCBIN_U16("graphics/pokemon/jellicent/shinyf.gbapal"); const u8 gMonIcon_JellicentF[] = INCBIN_U8("graphics/pokemon/jellicent/iconf.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -17899,9 +17953,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FRILLISH #if P_FAMILY_ALOMOMOLA - const u32 gMonFrontPic_Alomomola[] = INCBIN_U32("graphics/pokemon/alomomola/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Alomomola[] = INCBIN_U32("graphics/pokemon/alomomola/anim_front.4bpp.smol"); const u16 gMonPalette_Alomomola[] = INCBIN_U16("graphics/pokemon/alomomola/normal.gbapal"); - const u32 gMonBackPic_Alomomola[] = INCBIN_U32("graphics/pokemon/alomomola/back.4bpp.lz"); + const u32 gMonBackPic_Alomomola[] = INCBIN_U32("graphics/pokemon/alomomola/back.4bpp.smol"); const u16 gMonShinyPalette_Alomomola[] = INCBIN_U16("graphics/pokemon/alomomola/shiny.gbapal"); const u8 gMonIcon_Alomomola[] = INCBIN_U8("graphics/pokemon/alomomola/icon.4bpp"); #if P_FOOTPRINTS @@ -17917,9 +17971,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ALOMOMOLA #if P_FAMILY_JOLTIK - const u32 gMonFrontPic_Joltik[] = INCBIN_U32("graphics/pokemon/joltik/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Joltik[] = INCBIN_U32("graphics/pokemon/joltik/anim_front.4bpp.smol"); const u16 gMonPalette_Joltik[] = INCBIN_U16("graphics/pokemon/joltik/normal.gbapal"); - const u32 gMonBackPic_Joltik[] = INCBIN_U32("graphics/pokemon/joltik/back.4bpp.lz"); + const u32 gMonBackPic_Joltik[] = INCBIN_U32("graphics/pokemon/joltik/back.4bpp.smol"); const u16 gMonShinyPalette_Joltik[] = INCBIN_U16("graphics/pokemon/joltik/shiny.gbapal"); const u8 gMonIcon_Joltik[] = INCBIN_U8("graphics/pokemon/joltik/icon.4bpp"); #if P_FOOTPRINTS @@ -17933,9 +17987,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Galvantula[] = INCBIN_U32("graphics/pokemon/galvantula/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Galvantula[] = INCBIN_U32("graphics/pokemon/galvantula/anim_front.4bpp.smol"); const u16 gMonPalette_Galvantula[] = INCBIN_U16("graphics/pokemon/galvantula/normal.gbapal"); - const u32 gMonBackPic_Galvantula[] = INCBIN_U32("graphics/pokemon/galvantula/back.4bpp.lz"); + const u32 gMonBackPic_Galvantula[] = INCBIN_U32("graphics/pokemon/galvantula/back.4bpp.smol"); const u16 gMonShinyPalette_Galvantula[] = INCBIN_U16("graphics/pokemon/galvantula/shiny.gbapal"); const u8 gMonIcon_Galvantula[] = INCBIN_U8("graphics/pokemon/galvantula/icon.4bpp"); #if P_FOOTPRINTS @@ -17951,9 +18005,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_JOLTIK #if P_FAMILY_FERROSEED - const u32 gMonFrontPic_Ferroseed[] = INCBIN_U32("graphics/pokemon/ferroseed/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ferroseed[] = INCBIN_U32("graphics/pokemon/ferroseed/anim_front.4bpp.smol"); const u16 gMonPalette_Ferroseed[] = INCBIN_U16("graphics/pokemon/ferroseed/normal.gbapal"); - const u32 gMonBackPic_Ferroseed[] = INCBIN_U32("graphics/pokemon/ferroseed/back.4bpp.lz"); + const u32 gMonBackPic_Ferroseed[] = INCBIN_U32("graphics/pokemon/ferroseed/back.4bpp.smol"); const u16 gMonShinyPalette_Ferroseed[] = INCBIN_U16("graphics/pokemon/ferroseed/shiny.gbapal"); const u8 gMonIcon_Ferroseed[] = INCBIN_U8("graphics/pokemon/ferroseed/icon.4bpp"); #if P_FOOTPRINTS @@ -17967,9 +18021,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Ferrothorn[] = INCBIN_U32("graphics/pokemon/ferrothorn/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ferrothorn[] = INCBIN_U32("graphics/pokemon/ferrothorn/anim_front.4bpp.smol"); const u16 gMonPalette_Ferrothorn[] = INCBIN_U16("graphics/pokemon/ferrothorn/normal.gbapal"); - const u32 gMonBackPic_Ferrothorn[] = INCBIN_U32("graphics/pokemon/ferrothorn/back.4bpp.lz"); + const u32 gMonBackPic_Ferrothorn[] = INCBIN_U32("graphics/pokemon/ferrothorn/back.4bpp.smol"); const u16 gMonShinyPalette_Ferrothorn[] = INCBIN_U16("graphics/pokemon/ferrothorn/shiny.gbapal"); const u8 gMonIcon_Ferrothorn[] = INCBIN_U8("graphics/pokemon/ferrothorn/icon.4bpp"); #if P_FOOTPRINTS @@ -17985,9 +18039,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FERROSEED #if P_FAMILY_KLINK - const u32 gMonFrontPic_Klink[] = INCBIN_U32("graphics/pokemon/klink/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Klink[] = INCBIN_U32("graphics/pokemon/klink/anim_front.4bpp.smol"); const u16 gMonPalette_Klink[] = INCBIN_U16("graphics/pokemon/klink/normal.gbapal"); - const u32 gMonBackPic_Klink[] = INCBIN_U32("graphics/pokemon/klink/back.4bpp.lz"); + const u32 gMonBackPic_Klink[] = INCBIN_U32("graphics/pokemon/klink/back.4bpp.smol"); const u16 gMonShinyPalette_Klink[] = INCBIN_U16("graphics/pokemon/klink/shiny.gbapal"); const u8 gMonIcon_Klink[] = INCBIN_U8("graphics/pokemon/klink/icon.4bpp"); #if P_FOOTPRINTS @@ -18001,9 +18055,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Klang[] = INCBIN_U32("graphics/pokemon/klang/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Klang[] = INCBIN_U32("graphics/pokemon/klang/anim_front.4bpp.smol"); const u16 gMonPalette_Klang[] = INCBIN_U16("graphics/pokemon/klang/normal.gbapal"); - const u32 gMonBackPic_Klang[] = INCBIN_U32("graphics/pokemon/klang/back.4bpp.lz"); + const u32 gMonBackPic_Klang[] = INCBIN_U32("graphics/pokemon/klang/back.4bpp.smol"); const u16 gMonShinyPalette_Klang[] = INCBIN_U16("graphics/pokemon/klang/shiny.gbapal"); const u8 gMonIcon_Klang[] = INCBIN_U8("graphics/pokemon/klang/icon.4bpp"); #if P_FOOTPRINTS @@ -18017,9 +18071,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Klinklang[] = INCBIN_U32("graphics/pokemon/klinklang/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Klinklang[] = INCBIN_U32("graphics/pokemon/klinklang/anim_front.4bpp.smol"); const u16 gMonPalette_Klinklang[] = INCBIN_U16("graphics/pokemon/klinklang/normal.gbapal"); - const u32 gMonBackPic_Klinklang[] = INCBIN_U32("graphics/pokemon/klinklang/back.4bpp.lz"); + const u32 gMonBackPic_Klinklang[] = INCBIN_U32("graphics/pokemon/klinklang/back.4bpp.smol"); const u16 gMonShinyPalette_Klinklang[] = INCBIN_U16("graphics/pokemon/klinklang/shiny.gbapal"); const u8 gMonIcon_Klinklang[] = INCBIN_U8("graphics/pokemon/klinklang/icon.4bpp"); #if P_FOOTPRINTS @@ -18035,9 +18089,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_KLINK #if P_FAMILY_TYNAMO - const u32 gMonFrontPic_Tynamo[] = INCBIN_U32("graphics/pokemon/tynamo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tynamo[] = INCBIN_U32("graphics/pokemon/tynamo/anim_front.4bpp.smol"); const u16 gMonPalette_Tynamo[] = INCBIN_U16("graphics/pokemon/tynamo/normal.gbapal"); - const u32 gMonBackPic_Tynamo[] = INCBIN_U32("graphics/pokemon/tynamo/back.4bpp.lz"); + const u32 gMonBackPic_Tynamo[] = INCBIN_U32("graphics/pokemon/tynamo/back.4bpp.smol"); const u16 gMonShinyPalette_Tynamo[] = INCBIN_U16("graphics/pokemon/tynamo/shiny.gbapal"); const u8 gMonIcon_Tynamo[] = INCBIN_U8("graphics/pokemon/tynamo/icon.4bpp"); #if P_FOOTPRINTS @@ -18051,9 +18105,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Eelektrik[] = INCBIN_U32("graphics/pokemon/eelektrik/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Eelektrik[] = INCBIN_U32("graphics/pokemon/eelektrik/anim_front.4bpp.smol"); const u16 gMonPalette_Eelektrik[] = INCBIN_U16("graphics/pokemon/eelektrik/normal.gbapal"); - const u32 gMonBackPic_Eelektrik[] = INCBIN_U32("graphics/pokemon/eelektrik/back.4bpp.lz"); + const u32 gMonBackPic_Eelektrik[] = INCBIN_U32("graphics/pokemon/eelektrik/back.4bpp.smol"); const u16 gMonShinyPalette_Eelektrik[] = INCBIN_U16("graphics/pokemon/eelektrik/shiny.gbapal"); const u8 gMonIcon_Eelektrik[] = INCBIN_U8("graphics/pokemon/eelektrik/icon.4bpp"); #if P_FOOTPRINTS @@ -18067,9 +18121,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Eelektross[] = INCBIN_U32("graphics/pokemon/eelektross/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Eelektross[] = INCBIN_U32("graphics/pokemon/eelektross/anim_front.4bpp.smol"); const u16 gMonPalette_Eelektross[] = INCBIN_U16("graphics/pokemon/eelektross/normal.gbapal"); - const u32 gMonBackPic_Eelektross[] = INCBIN_U32("graphics/pokemon/eelektross/back.4bpp.lz"); + const u32 gMonBackPic_Eelektross[] = INCBIN_U32("graphics/pokemon/eelektross/back.4bpp.smol"); const u16 gMonShinyPalette_Eelektross[] = INCBIN_U16("graphics/pokemon/eelektross/shiny.gbapal"); const u8 gMonIcon_Eelektross[] = INCBIN_U8("graphics/pokemon/eelektross/icon.4bpp"); #if P_FOOTPRINTS @@ -18085,9 +18139,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TYNAMO #if P_FAMILY_ELGYEM - const u32 gMonFrontPic_Elgyem[] = INCBIN_U32("graphics/pokemon/elgyem/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Elgyem[] = INCBIN_U32("graphics/pokemon/elgyem/anim_front.4bpp.smol"); const u16 gMonPalette_Elgyem[] = INCBIN_U16("graphics/pokemon/elgyem/normal.gbapal"); - const u32 gMonBackPic_Elgyem[] = INCBIN_U32("graphics/pokemon/elgyem/back.4bpp.lz"); + const u32 gMonBackPic_Elgyem[] = INCBIN_U32("graphics/pokemon/elgyem/back.4bpp.smol"); const u16 gMonShinyPalette_Elgyem[] = INCBIN_U16("graphics/pokemon/elgyem/shiny.gbapal"); const u8 gMonIcon_Elgyem[] = INCBIN_U8("graphics/pokemon/elgyem/icon.4bpp"); #if P_FOOTPRINTS @@ -18101,9 +18155,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Beheeyem[] = INCBIN_U32("graphics/pokemon/beheeyem/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Beheeyem[] = INCBIN_U32("graphics/pokemon/beheeyem/anim_front.4bpp.smol"); const u16 gMonPalette_Beheeyem[] = INCBIN_U16("graphics/pokemon/beheeyem/normal.gbapal"); - const u32 gMonBackPic_Beheeyem[] = INCBIN_U32("graphics/pokemon/beheeyem/back.4bpp.lz"); + const u32 gMonBackPic_Beheeyem[] = INCBIN_U32("graphics/pokemon/beheeyem/back.4bpp.smol"); const u16 gMonShinyPalette_Beheeyem[] = INCBIN_U16("graphics/pokemon/beheeyem/shiny.gbapal"); const u8 gMonIcon_Beheeyem[] = INCBIN_U8("graphics/pokemon/beheeyem/icon.4bpp"); #if P_FOOTPRINTS @@ -18119,9 +18173,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ELGYEM #if P_FAMILY_LITWICK - const u32 gMonFrontPic_Litwick[] = INCBIN_U32("graphics/pokemon/litwick/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Litwick[] = INCBIN_U32("graphics/pokemon/litwick/anim_front.4bpp.smol"); const u16 gMonPalette_Litwick[] = INCBIN_U16("graphics/pokemon/litwick/normal.gbapal"); - const u32 gMonBackPic_Litwick[] = INCBIN_U32("graphics/pokemon/litwick/back.4bpp.lz"); + const u32 gMonBackPic_Litwick[] = INCBIN_U32("graphics/pokemon/litwick/back.4bpp.smol"); const u16 gMonShinyPalette_Litwick[] = INCBIN_U16("graphics/pokemon/litwick/shiny.gbapal"); const u8 gMonIcon_Litwick[] = INCBIN_U8("graphics/pokemon/litwick/icon.4bpp"); #if P_FOOTPRINTS @@ -18135,9 +18189,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Lampent[] = INCBIN_U32("graphics/pokemon/lampent/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lampent[] = INCBIN_U32("graphics/pokemon/lampent/anim_front.4bpp.smol"); const u16 gMonPalette_Lampent[] = INCBIN_U16("graphics/pokemon/lampent/normal.gbapal"); - const u32 gMonBackPic_Lampent[] = INCBIN_U32("graphics/pokemon/lampent/back.4bpp.lz"); + const u32 gMonBackPic_Lampent[] = INCBIN_U32("graphics/pokemon/lampent/back.4bpp.smol"); const u16 gMonShinyPalette_Lampent[] = INCBIN_U16("graphics/pokemon/lampent/shiny.gbapal"); const u8 gMonIcon_Lampent[] = INCBIN_U8("graphics/pokemon/lampent/icon.4bpp"); #if P_FOOTPRINTS @@ -18151,9 +18205,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Chandelure[] = INCBIN_U32("graphics/pokemon/chandelure/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Chandelure[] = INCBIN_U32("graphics/pokemon/chandelure/anim_front.4bpp.smol"); const u16 gMonPalette_Chandelure[] = INCBIN_U16("graphics/pokemon/chandelure/normal.gbapal"); - const u32 gMonBackPic_Chandelure[] = INCBIN_U32("graphics/pokemon/chandelure/back.4bpp.lz"); + const u32 gMonBackPic_Chandelure[] = INCBIN_U32("graphics/pokemon/chandelure/back.4bpp.smol"); const u16 gMonShinyPalette_Chandelure[] = INCBIN_U16("graphics/pokemon/chandelure/shiny.gbapal"); const u8 gMonIcon_Chandelure[] = INCBIN_U8("graphics/pokemon/chandelure/icon.4bpp"); #if P_FOOTPRINTS @@ -18169,9 +18223,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_LITWICK #if P_FAMILY_AXEW - const u32 gMonFrontPic_Axew[] = INCBIN_U32("graphics/pokemon/axew/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Axew[] = INCBIN_U32("graphics/pokemon/axew/anim_front.4bpp.smol"); const u16 gMonPalette_Axew[] = INCBIN_U16("graphics/pokemon/axew/normal.gbapal"); - const u32 gMonBackPic_Axew[] = INCBIN_U32("graphics/pokemon/axew/back.4bpp.lz"); + const u32 gMonBackPic_Axew[] = INCBIN_U32("graphics/pokemon/axew/back.4bpp.smol"); const u16 gMonShinyPalette_Axew[] = INCBIN_U16("graphics/pokemon/axew/shiny.gbapal"); const u8 gMonIcon_Axew[] = INCBIN_U8("graphics/pokemon/axew/icon.4bpp"); #if P_FOOTPRINTS @@ -18185,9 +18239,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Fraxure[] = INCBIN_U32("graphics/pokemon/fraxure/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Fraxure[] = INCBIN_U32("graphics/pokemon/fraxure/anim_front.4bpp.smol"); const u16 gMonPalette_Fraxure[] = INCBIN_U16("graphics/pokemon/fraxure/normal.gbapal"); - const u32 gMonBackPic_Fraxure[] = INCBIN_U32("graphics/pokemon/fraxure/back.4bpp.lz"); + const u32 gMonBackPic_Fraxure[] = INCBIN_U32("graphics/pokemon/fraxure/back.4bpp.smol"); const u16 gMonShinyPalette_Fraxure[] = INCBIN_U16("graphics/pokemon/fraxure/shiny.gbapal"); const u8 gMonIcon_Fraxure[] = INCBIN_U8("graphics/pokemon/fraxure/icon.4bpp"); #if P_FOOTPRINTS @@ -18201,9 +18255,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Haxorus[] = INCBIN_U32("graphics/pokemon/haxorus/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Haxorus[] = INCBIN_U32("graphics/pokemon/haxorus/anim_front.4bpp.smol"); const u16 gMonPalette_Haxorus[] = INCBIN_U16("graphics/pokemon/haxorus/normal.gbapal"); - const u32 gMonBackPic_Haxorus[] = INCBIN_U32("graphics/pokemon/haxorus/back.4bpp.lz"); + const u32 gMonBackPic_Haxorus[] = INCBIN_U32("graphics/pokemon/haxorus/back.4bpp.smol"); const u16 gMonShinyPalette_Haxorus[] = INCBIN_U16("graphics/pokemon/haxorus/shiny.gbapal"); const u8 gMonIcon_Haxorus[] = INCBIN_U8("graphics/pokemon/haxorus/icon.4bpp"); #if P_FOOTPRINTS @@ -18219,9 +18273,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_AXEW #if P_FAMILY_CUBCHOO - const u32 gMonFrontPic_Cubchoo[] = INCBIN_U32("graphics/pokemon/cubchoo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cubchoo[] = INCBIN_U32("graphics/pokemon/cubchoo/anim_front.4bpp.smol"); const u16 gMonPalette_Cubchoo[] = INCBIN_U16("graphics/pokemon/cubchoo/normal.gbapal"); - const u32 gMonBackPic_Cubchoo[] = INCBIN_U32("graphics/pokemon/cubchoo/back.4bpp.lz"); + const u32 gMonBackPic_Cubchoo[] = INCBIN_U32("graphics/pokemon/cubchoo/back.4bpp.smol"); const u16 gMonShinyPalette_Cubchoo[] = INCBIN_U16("graphics/pokemon/cubchoo/shiny.gbapal"); const u8 gMonIcon_Cubchoo[] = INCBIN_U8("graphics/pokemon/cubchoo/icon.4bpp"); #if P_FOOTPRINTS @@ -18235,9 +18289,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Beartic[] = INCBIN_U32("graphics/pokemon/beartic/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Beartic[] = INCBIN_U32("graphics/pokemon/beartic/anim_front.4bpp.smol"); const u16 gMonPalette_Beartic[] = INCBIN_U16("graphics/pokemon/beartic/normal.gbapal"); - const u32 gMonBackPic_Beartic[] = INCBIN_U32("graphics/pokemon/beartic/back.4bpp.lz"); + const u32 gMonBackPic_Beartic[] = INCBIN_U32("graphics/pokemon/beartic/back.4bpp.smol"); const u16 gMonShinyPalette_Beartic[] = INCBIN_U16("graphics/pokemon/beartic/shiny.gbapal"); const u8 gMonIcon_Beartic[] = INCBIN_U8("graphics/pokemon/beartic/icon.4bpp"); #if P_FOOTPRINTS @@ -18253,9 +18307,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CUBCHOO #if P_FAMILY_CRYOGONAL - const u32 gMonFrontPic_Cryogonal[] = INCBIN_U32("graphics/pokemon/cryogonal/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cryogonal[] = INCBIN_U32("graphics/pokemon/cryogonal/anim_front.4bpp.smol"); const u16 gMonPalette_Cryogonal[] = INCBIN_U16("graphics/pokemon/cryogonal/normal.gbapal"); - const u32 gMonBackPic_Cryogonal[] = INCBIN_U32("graphics/pokemon/cryogonal/back.4bpp.lz"); + const u32 gMonBackPic_Cryogonal[] = INCBIN_U32("graphics/pokemon/cryogonal/back.4bpp.smol"); const u16 gMonShinyPalette_Cryogonal[] = INCBIN_U16("graphics/pokemon/cryogonal/shiny.gbapal"); const u8 gMonIcon_Cryogonal[] = INCBIN_U8("graphics/pokemon/cryogonal/icon.4bpp"); #if P_FOOTPRINTS @@ -18271,9 +18325,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CRYOGONAL #if P_FAMILY_SHELMET - const u32 gMonFrontPic_Shelmet[] = INCBIN_U32("graphics/pokemon/shelmet/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Shelmet[] = INCBIN_U32("graphics/pokemon/shelmet/anim_front.4bpp.smol"); const u16 gMonPalette_Shelmet[] = INCBIN_U16("graphics/pokemon/shelmet/normal.gbapal"); - const u32 gMonBackPic_Shelmet[] = INCBIN_U32("graphics/pokemon/shelmet/back.4bpp.lz"); + const u32 gMonBackPic_Shelmet[] = INCBIN_U32("graphics/pokemon/shelmet/back.4bpp.smol"); const u16 gMonShinyPalette_Shelmet[] = INCBIN_U16("graphics/pokemon/shelmet/shiny.gbapal"); const u8 gMonIcon_Shelmet[] = INCBIN_U8("graphics/pokemon/shelmet/icon.4bpp"); #if P_FOOTPRINTS @@ -18287,9 +18341,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Accelgor[] = INCBIN_U32("graphics/pokemon/accelgor/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Accelgor[] = INCBIN_U32("graphics/pokemon/accelgor/anim_front.4bpp.smol"); const u16 gMonPalette_Accelgor[] = INCBIN_U16("graphics/pokemon/accelgor/normal.gbapal"); - const u32 gMonBackPic_Accelgor[] = INCBIN_U32("graphics/pokemon/accelgor/back.4bpp.lz"); + const u32 gMonBackPic_Accelgor[] = INCBIN_U32("graphics/pokemon/accelgor/back.4bpp.smol"); const u16 gMonShinyPalette_Accelgor[] = INCBIN_U16("graphics/pokemon/accelgor/shiny.gbapal"); const u8 gMonIcon_Accelgor[] = INCBIN_U8("graphics/pokemon/accelgor/icon.4bpp"); #if P_FOOTPRINTS @@ -18305,9 +18359,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SHELMET #if P_FAMILY_STUNFISK - const u32 gMonFrontPic_Stunfisk[] = INCBIN_U32("graphics/pokemon/stunfisk/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Stunfisk[] = INCBIN_U32("graphics/pokemon/stunfisk/anim_front.4bpp.smol"); const u16 gMonPalette_Stunfisk[] = INCBIN_U16("graphics/pokemon/stunfisk/normal.gbapal"); - const u32 gMonBackPic_Stunfisk[] = INCBIN_U32("graphics/pokemon/stunfisk/back.4bpp.lz"); + const u32 gMonBackPic_Stunfisk[] = INCBIN_U32("graphics/pokemon/stunfisk/back.4bpp.smol"); const u16 gMonShinyPalette_Stunfisk[] = INCBIN_U16("graphics/pokemon/stunfisk/shiny.gbapal"); const u8 gMonIcon_Stunfisk[] = INCBIN_U8("graphics/pokemon/stunfisk/icon.4bpp"); #if P_FOOTPRINTS @@ -18322,9 +18376,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_StunfiskGalar[] = INCBIN_U32("graphics/pokemon/stunfisk/galar/front.4bpp.lz"); + const u32 gMonFrontPic_StunfiskGalar[] = INCBIN_U32("graphics/pokemon/stunfisk/galar/front.4bpp.smol"); const u16 gMonPalette_StunfiskGalar[] = INCBIN_U16("graphics/pokemon/stunfisk/galar/normal.gbapal"); - const u32 gMonBackPic_StunfiskGalar[] = INCBIN_U32("graphics/pokemon/stunfisk/galar/back.4bpp.lz"); + const u32 gMonBackPic_StunfiskGalar[] = INCBIN_U32("graphics/pokemon/stunfisk/galar/back.4bpp.smol"); const u16 gMonShinyPalette_StunfiskGalar[] = INCBIN_U16("graphics/pokemon/stunfisk/galar/shiny.gbapal"); const u8 gMonIcon_StunfiskGalar[] = INCBIN_U8("graphics/pokemon/stunfisk/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -18338,9 +18392,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_STUNFISK #if P_FAMILY_MIENFOO - const u32 gMonFrontPic_Mienfoo[] = INCBIN_U32("graphics/pokemon/mienfoo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mienfoo[] = INCBIN_U32("graphics/pokemon/mienfoo/anim_front.4bpp.smol"); const u16 gMonPalette_Mienfoo[] = INCBIN_U16("graphics/pokemon/mienfoo/normal.gbapal"); - const u32 gMonBackPic_Mienfoo[] = INCBIN_U32("graphics/pokemon/mienfoo/back.4bpp.lz"); + const u32 gMonBackPic_Mienfoo[] = INCBIN_U32("graphics/pokemon/mienfoo/back.4bpp.smol"); const u16 gMonShinyPalette_Mienfoo[] = INCBIN_U16("graphics/pokemon/mienfoo/shiny.gbapal"); const u8 gMonIcon_Mienfoo[] = INCBIN_U8("graphics/pokemon/mienfoo/icon.4bpp"); #if P_FOOTPRINTS @@ -18354,9 +18408,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Mienshao[] = INCBIN_U32("graphics/pokemon/mienshao/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mienshao[] = INCBIN_U32("graphics/pokemon/mienshao/anim_front.4bpp.smol"); const u16 gMonPalette_Mienshao[] = INCBIN_U16("graphics/pokemon/mienshao/normal.gbapal"); - const u32 gMonBackPic_Mienshao[] = INCBIN_U32("graphics/pokemon/mienshao/back.4bpp.lz"); + const u32 gMonBackPic_Mienshao[] = INCBIN_U32("graphics/pokemon/mienshao/back.4bpp.smol"); const u16 gMonShinyPalette_Mienshao[] = INCBIN_U16("graphics/pokemon/mienshao/shiny.gbapal"); const u8 gMonIcon_Mienshao[] = INCBIN_U8("graphics/pokemon/mienshao/icon.4bpp"); #if P_FOOTPRINTS @@ -18372,9 +18426,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MIENFOO #if P_FAMILY_DRUDDIGON - const u32 gMonFrontPic_Druddigon[] = INCBIN_U32("graphics/pokemon/druddigon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Druddigon[] = INCBIN_U32("graphics/pokemon/druddigon/anim_front.4bpp.smol"); const u16 gMonPalette_Druddigon[] = INCBIN_U16("graphics/pokemon/druddigon/normal.gbapal"); - const u32 gMonBackPic_Druddigon[] = INCBIN_U32("graphics/pokemon/druddigon/back.4bpp.lz"); + const u32 gMonBackPic_Druddigon[] = INCBIN_U32("graphics/pokemon/druddigon/back.4bpp.smol"); const u16 gMonShinyPalette_Druddigon[] = INCBIN_U16("graphics/pokemon/druddigon/shiny.gbapal"); const u8 gMonIcon_Druddigon[] = INCBIN_U8("graphics/pokemon/druddigon/icon.4bpp"); #if P_FOOTPRINTS @@ -18390,9 +18444,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DRUDDIGON #if P_FAMILY_GOLETT - const u32 gMonFrontPic_Golett[] = INCBIN_U32("graphics/pokemon/golett/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Golett[] = INCBIN_U32("graphics/pokemon/golett/anim_front.4bpp.smol"); const u16 gMonPalette_Golett[] = INCBIN_U16("graphics/pokemon/golett/normal.gbapal"); - const u32 gMonBackPic_Golett[] = INCBIN_U32("graphics/pokemon/golett/back.4bpp.lz"); + const u32 gMonBackPic_Golett[] = INCBIN_U32("graphics/pokemon/golett/back.4bpp.smol"); const u16 gMonShinyPalette_Golett[] = INCBIN_U16("graphics/pokemon/golett/shiny.gbapal"); const u8 gMonIcon_Golett[] = INCBIN_U8("graphics/pokemon/golett/icon.4bpp"); #if P_FOOTPRINTS @@ -18406,9 +18460,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Golurk[] = INCBIN_U32("graphics/pokemon/golurk/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Golurk[] = INCBIN_U32("graphics/pokemon/golurk/anim_front.4bpp.smol"); const u16 gMonPalette_Golurk[] = INCBIN_U16("graphics/pokemon/golurk/normal.gbapal"); - const u32 gMonBackPic_Golurk[] = INCBIN_U32("graphics/pokemon/golurk/back.4bpp.lz"); + const u32 gMonBackPic_Golurk[] = INCBIN_U32("graphics/pokemon/golurk/back.4bpp.smol"); const u16 gMonShinyPalette_Golurk[] = INCBIN_U16("graphics/pokemon/golurk/shiny.gbapal"); const u8 gMonIcon_Golurk[] = INCBIN_U8("graphics/pokemon/golurk/icon.4bpp"); #if P_FOOTPRINTS @@ -18424,9 +18478,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GOLETT #if P_FAMILY_PAWNIARD - const u32 gMonFrontPic_Pawniard[] = INCBIN_U32("graphics/pokemon/pawniard/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pawniard[] = INCBIN_U32("graphics/pokemon/pawniard/anim_front.4bpp.smol"); const u16 gMonPalette_Pawniard[] = INCBIN_U16("graphics/pokemon/pawniard/normal.gbapal"); - const u32 gMonBackPic_Pawniard[] = INCBIN_U32("graphics/pokemon/pawniard/back.4bpp.lz"); + const u32 gMonBackPic_Pawniard[] = INCBIN_U32("graphics/pokemon/pawniard/back.4bpp.smol"); const u16 gMonShinyPalette_Pawniard[] = INCBIN_U16("graphics/pokemon/pawniard/shiny.gbapal"); const u8 gMonIcon_Pawniard[] = INCBIN_U8("graphics/pokemon/pawniard/icon.4bpp"); #if P_FOOTPRINTS @@ -18440,9 +18494,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Bisharp[] = INCBIN_U32("graphics/pokemon/bisharp/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bisharp[] = INCBIN_U32("graphics/pokemon/bisharp/anim_front.4bpp.smol"); const u16 gMonPalette_Bisharp[] = INCBIN_U16("graphics/pokemon/bisharp/normal.gbapal"); - const u32 gMonBackPic_Bisharp[] = INCBIN_U32("graphics/pokemon/bisharp/back.4bpp.lz"); + const u32 gMonBackPic_Bisharp[] = INCBIN_U32("graphics/pokemon/bisharp/back.4bpp.smol"); const u16 gMonShinyPalette_Bisharp[] = INCBIN_U16("graphics/pokemon/bisharp/shiny.gbapal"); const u8 gMonIcon_Bisharp[] = INCBIN_U8("graphics/pokemon/bisharp/icon.4bpp"); #if P_FOOTPRINTS @@ -18457,9 +18511,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_9_CROSS_EVOS - const u32 gMonFrontPic_Kingambit[] = INCBIN_U32("graphics/pokemon/kingambit/front.4bpp.lz"); + const u32 gMonFrontPic_Kingambit[] = INCBIN_U32("graphics/pokemon/kingambit/front.4bpp.smol"); const u16 gMonPalette_Kingambit[] = INCBIN_U16("graphics/pokemon/kingambit/normal.gbapal"); - const u32 gMonBackPic_Kingambit[] = INCBIN_U32("graphics/pokemon/kingambit/back.4bpp.lz"); + const u32 gMonBackPic_Kingambit[] = INCBIN_U32("graphics/pokemon/kingambit/back.4bpp.smol"); const u16 gMonShinyPalette_Kingambit[] = INCBIN_U16("graphics/pokemon/kingambit/shiny.gbapal"); const u8 gMonIcon_Kingambit[] = INCBIN_U8("graphics/pokemon/kingambit/icon.4bpp"); #if P_FOOTPRINTS @@ -18476,9 +18530,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PAWNIARD #if P_FAMILY_BOUFFALANT - const u32 gMonFrontPic_Bouffalant[] = INCBIN_U32("graphics/pokemon/bouffalant/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bouffalant[] = INCBIN_U32("graphics/pokemon/bouffalant/anim_front.4bpp.smol"); const u16 gMonPalette_Bouffalant[] = INCBIN_U16("graphics/pokemon/bouffalant/normal.gbapal"); - const u32 gMonBackPic_Bouffalant[] = INCBIN_U32("graphics/pokemon/bouffalant/back.4bpp.lz"); + const u32 gMonBackPic_Bouffalant[] = INCBIN_U32("graphics/pokemon/bouffalant/back.4bpp.smol"); const u16 gMonShinyPalette_Bouffalant[] = INCBIN_U16("graphics/pokemon/bouffalant/shiny.gbapal"); const u8 gMonIcon_Bouffalant[] = INCBIN_U8("graphics/pokemon/bouffalant/icon.4bpp"); #if P_FOOTPRINTS @@ -18494,9 +18548,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BOUFFALANT #if P_FAMILY_RUFFLET - const u32 gMonFrontPic_Rufflet[] = INCBIN_U32("graphics/pokemon/rufflet/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rufflet[] = INCBIN_U32("graphics/pokemon/rufflet/anim_front.4bpp.smol"); const u16 gMonPalette_Rufflet[] = INCBIN_U16("graphics/pokemon/rufflet/normal.gbapal"); - const u32 gMonBackPic_Rufflet[] = INCBIN_U32("graphics/pokemon/rufflet/back.4bpp.lz"); + const u32 gMonBackPic_Rufflet[] = INCBIN_U32("graphics/pokemon/rufflet/back.4bpp.smol"); const u16 gMonShinyPalette_Rufflet[] = INCBIN_U16("graphics/pokemon/rufflet/shiny.gbapal"); const u8 gMonIcon_Rufflet[] = INCBIN_U8("graphics/pokemon/rufflet/icon.4bpp"); #if P_FOOTPRINTS @@ -18510,9 +18564,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Braviary[] = INCBIN_U32("graphics/pokemon/braviary/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Braviary[] = INCBIN_U32("graphics/pokemon/braviary/anim_front.4bpp.smol"); const u16 gMonPalette_Braviary[] = INCBIN_U16("graphics/pokemon/braviary/normal.gbapal"); - const u32 gMonBackPic_Braviary[] = INCBIN_U32("graphics/pokemon/braviary/back.4bpp.lz"); + const u32 gMonBackPic_Braviary[] = INCBIN_U32("graphics/pokemon/braviary/back.4bpp.smol"); const u16 gMonShinyPalette_Braviary[] = INCBIN_U16("graphics/pokemon/braviary/shiny.gbapal"); const u8 gMonIcon_Braviary[] = INCBIN_U8("graphics/pokemon/braviary/icon.4bpp"); #if P_FOOTPRINTS @@ -18527,9 +18581,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_BraviaryHisui[] = INCBIN_U32("graphics/pokemon/braviary/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_BraviaryHisui[] = INCBIN_U32("graphics/pokemon/braviary/hisui/front.4bpp.smol"); const u16 gMonPalette_BraviaryHisui[] = INCBIN_U16("graphics/pokemon/braviary/hisui/normal.gbapal"); - const u32 gMonBackPic_BraviaryHisui[] = INCBIN_U32("graphics/pokemon/braviary/hisui/back.4bpp.lz"); + const u32 gMonBackPic_BraviaryHisui[] = INCBIN_U32("graphics/pokemon/braviary/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_BraviaryHisui[] = INCBIN_U16("graphics/pokemon/braviary/hisui/shiny.gbapal"); const u8 gMonIcon_BraviaryHisui[] = INCBIN_U8("graphics/pokemon/braviary/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -18543,9 +18597,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_RUFFLET #if P_FAMILY_VULLABY - const u32 gMonFrontPic_Vullaby[] = INCBIN_U32("graphics/pokemon/vullaby/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Vullaby[] = INCBIN_U32("graphics/pokemon/vullaby/anim_front.4bpp.smol"); const u16 gMonPalette_Vullaby[] = INCBIN_U16("graphics/pokemon/vullaby/normal.gbapal"); - const u32 gMonBackPic_Vullaby[] = INCBIN_U32("graphics/pokemon/vullaby/back.4bpp.lz"); + const u32 gMonBackPic_Vullaby[] = INCBIN_U32("graphics/pokemon/vullaby/back.4bpp.smol"); const u16 gMonShinyPalette_Vullaby[] = INCBIN_U16("graphics/pokemon/vullaby/shiny.gbapal"); const u8 gMonIcon_Vullaby[] = INCBIN_U8("graphics/pokemon/vullaby/icon.4bpp"); #if P_FOOTPRINTS @@ -18559,9 +18613,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Mandibuzz[] = INCBIN_U32("graphics/pokemon/mandibuzz/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mandibuzz[] = INCBIN_U32("graphics/pokemon/mandibuzz/anim_front.4bpp.smol"); const u16 gMonPalette_Mandibuzz[] = INCBIN_U16("graphics/pokemon/mandibuzz/normal.gbapal"); - const u32 gMonBackPic_Mandibuzz[] = INCBIN_U32("graphics/pokemon/mandibuzz/back.4bpp.lz"); + const u32 gMonBackPic_Mandibuzz[] = INCBIN_U32("graphics/pokemon/mandibuzz/back.4bpp.smol"); const u16 gMonShinyPalette_Mandibuzz[] = INCBIN_U16("graphics/pokemon/mandibuzz/shiny.gbapal"); const u8 gMonIcon_Mandibuzz[] = INCBIN_U8("graphics/pokemon/mandibuzz/icon.4bpp"); #if P_FOOTPRINTS @@ -18577,9 +18631,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_VULLABY #if P_FAMILY_HEATMOR - const u32 gMonFrontPic_Heatmor[] = INCBIN_U32("graphics/pokemon/heatmor/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Heatmor[] = INCBIN_U32("graphics/pokemon/heatmor/anim_front.4bpp.smol"); const u16 gMonPalette_Heatmor[] = INCBIN_U16("graphics/pokemon/heatmor/normal.gbapal"); - const u32 gMonBackPic_Heatmor[] = INCBIN_U32("graphics/pokemon/heatmor/back.4bpp.lz"); + const u32 gMonBackPic_Heatmor[] = INCBIN_U32("graphics/pokemon/heatmor/back.4bpp.smol"); const u16 gMonShinyPalette_Heatmor[] = INCBIN_U16("graphics/pokemon/heatmor/shiny.gbapal"); const u8 gMonIcon_Heatmor[] = INCBIN_U8("graphics/pokemon/heatmor/icon.4bpp"); #if P_FOOTPRINTS @@ -18595,9 +18649,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_HEATMOR #if P_FAMILY_DURANT - const u32 gMonFrontPic_Durant[] = INCBIN_U32("graphics/pokemon/durant/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Durant[] = INCBIN_U32("graphics/pokemon/durant/anim_front.4bpp.smol"); const u16 gMonPalette_Durant[] = INCBIN_U16("graphics/pokemon/durant/normal.gbapal"); - const u32 gMonBackPic_Durant[] = INCBIN_U32("graphics/pokemon/durant/back.4bpp.lz"); + const u32 gMonBackPic_Durant[] = INCBIN_U32("graphics/pokemon/durant/back.4bpp.smol"); const u16 gMonShinyPalette_Durant[] = INCBIN_U16("graphics/pokemon/durant/shiny.gbapal"); const u8 gMonIcon_Durant[] = INCBIN_U8("graphics/pokemon/durant/icon.4bpp"); #if P_FOOTPRINTS @@ -18613,9 +18667,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DURANT #if P_FAMILY_DEINO - const u32 gMonFrontPic_Deino[] = INCBIN_U32("graphics/pokemon/deino/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Deino[] = INCBIN_U32("graphics/pokemon/deino/anim_front.4bpp.smol"); const u16 gMonPalette_Deino[] = INCBIN_U16("graphics/pokemon/deino/normal.gbapal"); - const u32 gMonBackPic_Deino[] = INCBIN_U32("graphics/pokemon/deino/back.4bpp.lz"); + const u32 gMonBackPic_Deino[] = INCBIN_U32("graphics/pokemon/deino/back.4bpp.smol"); const u16 gMonShinyPalette_Deino[] = INCBIN_U16("graphics/pokemon/deino/shiny.gbapal"); const u8 gMonIcon_Deino[] = INCBIN_U8("graphics/pokemon/deino/icon.4bpp"); #if P_FOOTPRINTS @@ -18629,9 +18683,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Zweilous[] = INCBIN_U32("graphics/pokemon/zweilous/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Zweilous[] = INCBIN_U32("graphics/pokemon/zweilous/anim_front.4bpp.smol"); const u16 gMonPalette_Zweilous[] = INCBIN_U16("graphics/pokemon/zweilous/normal.gbapal"); - const u32 gMonBackPic_Zweilous[] = INCBIN_U32("graphics/pokemon/zweilous/back.4bpp.lz"); + const u32 gMonBackPic_Zweilous[] = INCBIN_U32("graphics/pokemon/zweilous/back.4bpp.smol"); const u16 gMonShinyPalette_Zweilous[] = INCBIN_U16("graphics/pokemon/zweilous/shiny.gbapal"); const u8 gMonIcon_Zweilous[] = INCBIN_U8("graphics/pokemon/zweilous/icon.4bpp"); #if P_FOOTPRINTS @@ -18645,9 +18699,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Hydreigon[] = INCBIN_U32("graphics/pokemon/hydreigon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Hydreigon[] = INCBIN_U32("graphics/pokemon/hydreigon/anim_front.4bpp.smol"); const u16 gMonPalette_Hydreigon[] = INCBIN_U16("graphics/pokemon/hydreigon/normal.gbapal"); - const u32 gMonBackPic_Hydreigon[] = INCBIN_U32("graphics/pokemon/hydreigon/back.4bpp.lz"); + const u32 gMonBackPic_Hydreigon[] = INCBIN_U32("graphics/pokemon/hydreigon/back.4bpp.smol"); const u16 gMonShinyPalette_Hydreigon[] = INCBIN_U16("graphics/pokemon/hydreigon/shiny.gbapal"); const u8 gMonIcon_Hydreigon[] = INCBIN_U8("graphics/pokemon/hydreigon/icon.4bpp"); #if P_FOOTPRINTS @@ -18663,9 +18717,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DEINO #if P_FAMILY_LARVESTA - const u32 gMonFrontPic_Larvesta[] = INCBIN_U32("graphics/pokemon/larvesta/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Larvesta[] = INCBIN_U32("graphics/pokemon/larvesta/anim_front.4bpp.smol"); const u16 gMonPalette_Larvesta[] = INCBIN_U16("graphics/pokemon/larvesta/normal.gbapal"); - const u32 gMonBackPic_Larvesta[] = INCBIN_U32("graphics/pokemon/larvesta/back.4bpp.lz"); + const u32 gMonBackPic_Larvesta[] = INCBIN_U32("graphics/pokemon/larvesta/back.4bpp.smol"); const u16 gMonShinyPalette_Larvesta[] = INCBIN_U16("graphics/pokemon/larvesta/shiny.gbapal"); const u8 gMonIcon_Larvesta[] = INCBIN_U8("graphics/pokemon/larvesta/icon.4bpp"); #if P_FOOTPRINTS @@ -18679,9 +18733,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Volcarona[] = INCBIN_U32("graphics/pokemon/volcarona/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Volcarona[] = INCBIN_U32("graphics/pokemon/volcarona/anim_front.4bpp.smol"); const u16 gMonPalette_Volcarona[] = INCBIN_U16("graphics/pokemon/volcarona/normal.gbapal"); - const u32 gMonBackPic_Volcarona[] = INCBIN_U32("graphics/pokemon/volcarona/back.4bpp.lz"); + const u32 gMonBackPic_Volcarona[] = INCBIN_U32("graphics/pokemon/volcarona/back.4bpp.smol"); const u16 gMonShinyPalette_Volcarona[] = INCBIN_U16("graphics/pokemon/volcarona/shiny.gbapal"); const u8 gMonIcon_Volcarona[] = INCBIN_U8("graphics/pokemon/volcarona/icon.4bpp"); #if P_FOOTPRINTS @@ -18697,9 +18751,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_LARVESTA #if P_FAMILY_COBALION - const u32 gMonFrontPic_Cobalion[] = INCBIN_U32("graphics/pokemon/cobalion/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cobalion[] = INCBIN_U32("graphics/pokemon/cobalion/anim_front.4bpp.smol"); const u16 gMonPalette_Cobalion[] = INCBIN_U16("graphics/pokemon/cobalion/normal.gbapal"); - const u32 gMonBackPic_Cobalion[] = INCBIN_U32("graphics/pokemon/cobalion/back.4bpp.lz"); + const u32 gMonBackPic_Cobalion[] = INCBIN_U32("graphics/pokemon/cobalion/back.4bpp.smol"); const u16 gMonShinyPalette_Cobalion[] = INCBIN_U16("graphics/pokemon/cobalion/shiny.gbapal"); const u8 gMonIcon_Cobalion[] = INCBIN_U8("graphics/pokemon/cobalion/icon.4bpp"); #if P_FOOTPRINTS @@ -18715,9 +18769,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_COBALION #if P_FAMILY_TERRAKION - const u32 gMonFrontPic_Terrakion[] = INCBIN_U32("graphics/pokemon/terrakion/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Terrakion[] = INCBIN_U32("graphics/pokemon/terrakion/anim_front.4bpp.smol"); const u16 gMonPalette_Terrakion[] = INCBIN_U16("graphics/pokemon/terrakion/normal.gbapal"); - const u32 gMonBackPic_Terrakion[] = INCBIN_U32("graphics/pokemon/terrakion/back.4bpp.lz"); + const u32 gMonBackPic_Terrakion[] = INCBIN_U32("graphics/pokemon/terrakion/back.4bpp.smol"); const u16 gMonShinyPalette_Terrakion[] = INCBIN_U16("graphics/pokemon/terrakion/shiny.gbapal"); const u8 gMonIcon_Terrakion[] = INCBIN_U8("graphics/pokemon/terrakion/icon.4bpp"); #if P_FOOTPRINTS @@ -18733,9 +18787,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TERRAKION #if P_FAMILY_VIRIZION - const u32 gMonFrontPic_Virizion[] = INCBIN_U32("graphics/pokemon/virizion/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Virizion[] = INCBIN_U32("graphics/pokemon/virizion/anim_front.4bpp.smol"); const u16 gMonPalette_Virizion[] = INCBIN_U16("graphics/pokemon/virizion/normal.gbapal"); - const u32 gMonBackPic_Virizion[] = INCBIN_U32("graphics/pokemon/virizion/back.4bpp.lz"); + const u32 gMonBackPic_Virizion[] = INCBIN_U32("graphics/pokemon/virizion/back.4bpp.smol"); const u16 gMonShinyPalette_Virizion[] = INCBIN_U16("graphics/pokemon/virizion/shiny.gbapal"); const u8 gMonIcon_Virizion[] = INCBIN_U8("graphics/pokemon/virizion/icon.4bpp"); #if P_FOOTPRINTS @@ -18751,9 +18805,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_VIRIZION #if P_FAMILY_TORNADUS - const u32 gMonFrontPic_TornadusIncarnate[] = INCBIN_U32("graphics/pokemon/tornadus/anim_front.4bpp.lz"); + const u32 gMonFrontPic_TornadusIncarnate[] = INCBIN_U32("graphics/pokemon/tornadus/anim_front.4bpp.smol"); const u16 gMonPalette_TornadusIncarnate[] = INCBIN_U16("graphics/pokemon/tornadus/normal.gbapal"); - const u32 gMonBackPic_TornadusIncarnate[] = INCBIN_U32("graphics/pokemon/tornadus/back.4bpp.lz"); + const u32 gMonBackPic_TornadusIncarnate[] = INCBIN_U32("graphics/pokemon/tornadus/back.4bpp.smol"); const u16 gMonShinyPalette_TornadusIncarnate[] = INCBIN_U16("graphics/pokemon/tornadus/shiny.gbapal"); const u8 gMonIcon_TornadusIncarnate[] = INCBIN_U8("graphics/pokemon/tornadus/icon.4bpp"); #if P_FOOTPRINTS @@ -18767,9 +18821,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_TornadusTherian[] = INCBIN_U32("graphics/pokemon/tornadus/therian/anim_front.4bpp.lz"); + const u32 gMonFrontPic_TornadusTherian[] = INCBIN_U32("graphics/pokemon/tornadus/therian/anim_front.4bpp.smol"); const u16 gMonPalette_TornadusTherian[] = INCBIN_U16("graphics/pokemon/tornadus/therian/normal.gbapal"); - const u32 gMonBackPic_TornadusTherian[] = INCBIN_U32("graphics/pokemon/tornadus/therian/back.4bpp.lz"); + const u32 gMonBackPic_TornadusTherian[] = INCBIN_U32("graphics/pokemon/tornadus/therian/back.4bpp.smol"); const u16 gMonShinyPalette_TornadusTherian[] = INCBIN_U16("graphics/pokemon/tornadus/therian/shiny.gbapal"); const u8 gMonIcon_TornadusTherian[] = INCBIN_U8("graphics/pokemon/tornadus/therian/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -18782,9 +18836,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TORNADUS #if P_FAMILY_THUNDURUS - const u32 gMonFrontPic_ThundurusIncarnate[] = INCBIN_U32("graphics/pokemon/thundurus/anim_front.4bpp.lz"); + const u32 gMonFrontPic_ThundurusIncarnate[] = INCBIN_U32("graphics/pokemon/thundurus/anim_front.4bpp.smol"); const u16 gMonPalette_ThundurusIncarnate[] = INCBIN_U16("graphics/pokemon/thundurus/normal.gbapal"); - const u32 gMonBackPic_ThundurusIncarnate[] = INCBIN_U32("graphics/pokemon/thundurus/back.4bpp.lz"); + const u32 gMonBackPic_ThundurusIncarnate[] = INCBIN_U32("graphics/pokemon/thundurus/back.4bpp.smol"); const u16 gMonShinyPalette_ThundurusIncarnate[] = INCBIN_U16("graphics/pokemon/thundurus/shiny.gbapal"); const u8 gMonIcon_ThundurusIncarnate[] = INCBIN_U8("graphics/pokemon/thundurus/icon.4bpp"); #if P_FOOTPRINTS @@ -18798,9 +18852,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_ThundurusTherian[] = INCBIN_U32("graphics/pokemon/thundurus/therian/anim_front.4bpp.lz"); + const u32 gMonFrontPic_ThundurusTherian[] = INCBIN_U32("graphics/pokemon/thundurus/therian/anim_front.4bpp.smol"); const u16 gMonPalette_ThundurusTherian[] = INCBIN_U16("graphics/pokemon/thundurus/therian/normal.gbapal"); - const u32 gMonBackPic_ThundurusTherian[] = INCBIN_U32("graphics/pokemon/thundurus/therian/back.4bpp.lz"); + const u32 gMonBackPic_ThundurusTherian[] = INCBIN_U32("graphics/pokemon/thundurus/therian/back.4bpp.smol"); const u16 gMonShinyPalette_ThundurusTherian[] = INCBIN_U16("graphics/pokemon/thundurus/therian/shiny.gbapal"); const u8 gMonIcon_ThundurusTherian[] = INCBIN_U8("graphics/pokemon/thundurus/therian/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -18813,9 +18867,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_THUNDURUS #if P_FAMILY_RESHIRAM - const u32 gMonFrontPic_Reshiram[] = INCBIN_U32("graphics/pokemon/reshiram/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Reshiram[] = INCBIN_U32("graphics/pokemon/reshiram/anim_front.4bpp.smol"); const u16 gMonPalette_Reshiram[] = INCBIN_U16("graphics/pokemon/reshiram/normal.gbapal"); - const u32 gMonBackPic_Reshiram[] = INCBIN_U32("graphics/pokemon/reshiram/back.4bpp.lz"); + const u32 gMonBackPic_Reshiram[] = INCBIN_U32("graphics/pokemon/reshiram/back.4bpp.smol"); const u16 gMonShinyPalette_Reshiram[] = INCBIN_U16("graphics/pokemon/reshiram/shiny.gbapal"); const u8 gMonIcon_Reshiram[] = INCBIN_U8("graphics/pokemon/reshiram/icon.4bpp"); #if P_FOOTPRINTS @@ -18831,9 +18885,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_RESHIRAM #if P_FAMILY_ZEKROM - const u32 gMonFrontPic_Zekrom[] = INCBIN_U32("graphics/pokemon/zekrom/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Zekrom[] = INCBIN_U32("graphics/pokemon/zekrom/anim_front.4bpp.smol"); const u16 gMonPalette_Zekrom[] = INCBIN_U16("graphics/pokemon/zekrom/normal.gbapal"); - const u32 gMonBackPic_Zekrom[] = INCBIN_U32("graphics/pokemon/zekrom/back.4bpp.lz"); + const u32 gMonBackPic_Zekrom[] = INCBIN_U32("graphics/pokemon/zekrom/back.4bpp.smol"); const u16 gMonShinyPalette_Zekrom[] = INCBIN_U16("graphics/pokemon/zekrom/shiny.gbapal"); const u8 gMonIcon_Zekrom[] = INCBIN_U8("graphics/pokemon/zekrom/icon.4bpp"); #if P_FOOTPRINTS @@ -18849,9 +18903,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ZEKROM #if P_FAMILY_LANDORUS - const u32 gMonFrontPic_LandorusIncarnate[] = INCBIN_U32("graphics/pokemon/landorus/anim_front.4bpp.lz"); + const u32 gMonFrontPic_LandorusIncarnate[] = INCBIN_U32("graphics/pokemon/landorus/anim_front.4bpp.smol"); const u16 gMonPalette_LandorusIncarnate[] = INCBIN_U16("graphics/pokemon/landorus/normal.gbapal"); - const u32 gMonBackPic_LandorusIncarnate[] = INCBIN_U32("graphics/pokemon/landorus/back.4bpp.lz"); + const u32 gMonBackPic_LandorusIncarnate[] = INCBIN_U32("graphics/pokemon/landorus/back.4bpp.smol"); const u16 gMonShinyPalette_LandorusIncarnate[] = INCBIN_U16("graphics/pokemon/landorus/shiny.gbapal"); const u8 gMonIcon_LandorusIncarnate[] = INCBIN_U8("graphics/pokemon/landorus/icon.4bpp"); #if P_FOOTPRINTS @@ -18865,9 +18919,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_LandorusTherian[] = INCBIN_U32("graphics/pokemon/landorus/therian/anim_front.4bpp.lz"); + const u32 gMonFrontPic_LandorusTherian[] = INCBIN_U32("graphics/pokemon/landorus/therian/anim_front.4bpp.smol"); const u16 gMonPalette_LandorusTherian[] = INCBIN_U16("graphics/pokemon/landorus/therian/normal.gbapal"); - const u32 gMonBackPic_LandorusTherian[] = INCBIN_U32("graphics/pokemon/landorus/therian/back.4bpp.lz"); + const u32 gMonBackPic_LandorusTherian[] = INCBIN_U32("graphics/pokemon/landorus/therian/back.4bpp.smol"); const u16 gMonShinyPalette_LandorusTherian[] = INCBIN_U16("graphics/pokemon/landorus/therian/shiny.gbapal"); const u8 gMonIcon_LandorusTherian[] = INCBIN_U8("graphics/pokemon/landorus/therian/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -18880,9 +18934,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_LANDORUS #if P_FAMILY_ENAMORUS - const u32 gMonFrontPic_EnamorusIncarnate[] = INCBIN_U32("graphics/pokemon/enamorus/anim_front.4bpp.lz"); + const u32 gMonFrontPic_EnamorusIncarnate[] = INCBIN_U32("graphics/pokemon/enamorus/anim_front.4bpp.smol"); const u16 gMonPalette_EnamorusIncarnate[] = INCBIN_U16("graphics/pokemon/enamorus/normal.gbapal"); - const u32 gMonBackPic_EnamorusIncarnate[] = INCBIN_U32("graphics/pokemon/enamorus/back.4bpp.lz"); + const u32 gMonBackPic_EnamorusIncarnate[] = INCBIN_U32("graphics/pokemon/enamorus/back.4bpp.smol"); const u16 gMonShinyPalette_EnamorusIncarnate[] = INCBIN_U16("graphics/pokemon/enamorus/shiny.gbapal"); const u8 gMonIcon_EnamorusIncarnate[] = INCBIN_U8("graphics/pokemon/enamorus/icon.4bpp"); #if P_FOOTPRINTS @@ -18896,9 +18950,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_EnamorusTherian[] = INCBIN_U32("graphics/pokemon/enamorus/therian/front.4bpp.lz"); + const u32 gMonFrontPic_EnamorusTherian[] = INCBIN_U32("graphics/pokemon/enamorus/therian/front.4bpp.smol"); const u16 gMonPalette_EnamorusTherian[] = INCBIN_U16("graphics/pokemon/enamorus/therian/normal.gbapal"); - const u32 gMonBackPic_EnamorusTherian[] = INCBIN_U32("graphics/pokemon/enamorus/therian/back.4bpp.lz"); + const u32 gMonBackPic_EnamorusTherian[] = INCBIN_U32("graphics/pokemon/enamorus/therian/back.4bpp.smol"); const u16 gMonShinyPalette_EnamorusTherian[] = INCBIN_U16("graphics/pokemon/enamorus/therian/shiny.gbapal"); const u8 gMonIcon_EnamorusTherian[] = INCBIN_U8("graphics/pokemon/enamorus/therian/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -18911,9 +18965,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ENAMORUS #if P_FAMILY_KYUREM - const u32 gMonFrontPic_Kyurem[] = INCBIN_U32("graphics/pokemon/kyurem/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kyurem[] = INCBIN_U32("graphics/pokemon/kyurem/anim_front.4bpp.smol"); const u16 gMonPalette_Kyurem[] = INCBIN_U16("graphics/pokemon/kyurem/normal.gbapal"); - const u32 gMonBackPic_Kyurem[] = INCBIN_U32("graphics/pokemon/kyurem/back.4bpp.lz"); + const u32 gMonBackPic_Kyurem[] = INCBIN_U32("graphics/pokemon/kyurem/back.4bpp.smol"); const u16 gMonShinyPalette_Kyurem[] = INCBIN_U16("graphics/pokemon/kyurem/shiny.gbapal"); const u8 gMonIcon_Kyurem[] = INCBIN_U8("graphics/pokemon/kyurem/icon.4bpp"); #if P_FOOTPRINTS @@ -18928,9 +18982,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_FUSION_FORMS - const u32 gMonFrontPic_KyuremWhite[] = INCBIN_U32("graphics/pokemon/kyurem/white/anim_front.4bpp.lz"); + const u32 gMonFrontPic_KyuremWhite[] = INCBIN_U32("graphics/pokemon/kyurem/white/anim_front.4bpp.smol"); const u16 gMonPalette_KyuremWhite[] = INCBIN_U16("graphics/pokemon/kyurem/white/normal.gbapal"); - const u32 gMonBackPic_KyuremWhite[] = INCBIN_U32("graphics/pokemon/kyurem/white/back.4bpp.lz"); + const u32 gMonBackPic_KyuremWhite[] = INCBIN_U32("graphics/pokemon/kyurem/white/back.4bpp.smol"); const u16 gMonShinyPalette_KyuremWhite[] = INCBIN_U16("graphics/pokemon/kyurem/white/shiny.gbapal"); const u8 gMonIcon_KyuremWhite[] = INCBIN_U8("graphics/pokemon/kyurem/white/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -18941,9 +18995,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_KyuremBlack[] = INCBIN_U32("graphics/pokemon/kyurem/black/anim_front.4bpp.lz"); + const u32 gMonFrontPic_KyuremBlack[] = INCBIN_U32("graphics/pokemon/kyurem/black/anim_front.4bpp.smol"); const u16 gMonPalette_KyuremBlack[] = INCBIN_U16("graphics/pokemon/kyurem/black/normal.gbapal"); - const u32 gMonBackPic_KyuremBlack[] = INCBIN_U32("graphics/pokemon/kyurem/black/back.4bpp.lz"); + const u32 gMonBackPic_KyuremBlack[] = INCBIN_U32("graphics/pokemon/kyurem/black/back.4bpp.smol"); const u16 gMonShinyPalette_KyuremBlack[] = INCBIN_U16("graphics/pokemon/kyurem/black/shiny.gbapal"); const u8 gMonIcon_KyuremBlack[] = INCBIN_U8("graphics/pokemon/kyurem/black/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -18957,9 +19011,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_KYUREM #if P_FAMILY_KELDEO - const u32 gMonFrontPic_KeldeoOrdinary[] = INCBIN_U32("graphics/pokemon/keldeo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_KeldeoOrdinary[] = INCBIN_U32("graphics/pokemon/keldeo/anim_front.4bpp.smol"); const u16 gMonPalette_KeldeoOrdinary[] = INCBIN_U16("graphics/pokemon/keldeo/normal.gbapal"); - const u32 gMonBackPic_KeldeoOrdinary[] = INCBIN_U32("graphics/pokemon/keldeo/back.4bpp.lz"); + const u32 gMonBackPic_KeldeoOrdinary[] = INCBIN_U32("graphics/pokemon/keldeo/back.4bpp.smol"); const u16 gMonShinyPalette_KeldeoOrdinary[] = INCBIN_U16("graphics/pokemon/keldeo/shiny.gbapal"); const u8 gMonIcon_KeldeoOrdinary[] = INCBIN_U8("graphics/pokemon/keldeo/icon.4bpp"); #if P_FOOTPRINTS @@ -18973,9 +19027,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_KeldeoResolute[] = INCBIN_U32("graphics/pokemon/keldeo/resolute/anim_front.4bpp.lz"); + const u32 gMonFrontPic_KeldeoResolute[] = INCBIN_U32("graphics/pokemon/keldeo/resolute/anim_front.4bpp.smol"); const u16 gMonPalette_KeldeoResolute[] = INCBIN_U16("graphics/pokemon/keldeo/resolute/normal.gbapal"); - const u32 gMonBackPic_KeldeoResolute[] = INCBIN_U32("graphics/pokemon/keldeo/resolute/back.4bpp.lz"); + const u32 gMonBackPic_KeldeoResolute[] = INCBIN_U32("graphics/pokemon/keldeo/resolute/back.4bpp.smol"); const u16 gMonShinyPalette_KeldeoResolute[] = INCBIN_U16("graphics/pokemon/keldeo/resolute/shiny.gbapal"); const u8 gMonIcon_KeldeoResolute[] = INCBIN_U8("graphics/pokemon/keldeo/resolute/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -18988,9 +19042,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_KELDEO #if P_FAMILY_MELOETTA - const u32 gMonFrontPic_MeloettaAria[] = INCBIN_U32("graphics/pokemon/meloetta/anim_front.4bpp.lz"); + const u32 gMonFrontPic_MeloettaAria[] = INCBIN_U32("graphics/pokemon/meloetta/anim_front.4bpp.smol"); const u16 gMonPalette_MeloettaAria[] = INCBIN_U16("graphics/pokemon/meloetta/normal.gbapal"); - const u32 gMonBackPic_MeloettaAria[] = INCBIN_U32("graphics/pokemon/meloetta/back.4bpp.lz"); + const u32 gMonBackPic_MeloettaAria[] = INCBIN_U32("graphics/pokemon/meloetta/back.4bpp.smol"); const u16 gMonShinyPalette_MeloettaAria[] = INCBIN_U16("graphics/pokemon/meloetta/shiny.gbapal"); const u8 gMonIcon_MeloettaAria[] = INCBIN_U8("graphics/pokemon/meloetta/icon.4bpp"); #if P_FOOTPRINTS @@ -19004,9 +19058,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_MeloettaPirouette[] = INCBIN_U32("graphics/pokemon/meloetta/pirouette/anim_front.4bpp.lz"); + const u32 gMonFrontPic_MeloettaPirouette[] = INCBIN_U32("graphics/pokemon/meloetta/pirouette/anim_front.4bpp.smol"); const u16 gMonPalette_MeloettaPirouette[] = INCBIN_U16("graphics/pokemon/meloetta/pirouette/normal.gbapal"); - const u32 gMonBackPic_MeloettaPirouette[] = INCBIN_U32("graphics/pokemon/meloetta/pirouette/back.4bpp.lz"); + const u32 gMonBackPic_MeloettaPirouette[] = INCBIN_U32("graphics/pokemon/meloetta/pirouette/back.4bpp.smol"); const u16 gMonShinyPalette_MeloettaPirouette[] = INCBIN_U16("graphics/pokemon/meloetta/pirouette/shiny.gbapal"); const u8 gMonIcon_MeloettaPirouette[] = INCBIN_U8("graphics/pokemon/meloetta/pirouette/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -19019,9 +19073,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MELOETTA #if P_FAMILY_GENESECT - const u32 gMonFrontPic_Genesect[] = INCBIN_U32("graphics/pokemon/genesect/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Genesect[] = INCBIN_U32("graphics/pokemon/genesect/anim_front.4bpp.smol"); const u16 gMonPalette_Genesect[] = INCBIN_U16("graphics/pokemon/genesect/normal.gbapal"); - const u32 gMonBackPic_Genesect[] = INCBIN_U32("graphics/pokemon/genesect/back.4bpp.lz"); + const u32 gMonBackPic_Genesect[] = INCBIN_U32("graphics/pokemon/genesect/back.4bpp.smol"); const u16 gMonShinyPalette_Genesect[] = INCBIN_U16("graphics/pokemon/genesect/shiny.gbapal"); const u8 gMonIcon_Genesect[] = INCBIN_U8("graphics/pokemon/genesect/icon.4bpp"); #if P_FOOTPRINTS @@ -19049,9 +19103,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GENESECT #if P_FAMILY_CHESPIN - const u32 gMonFrontPic_Chespin[] = INCBIN_U32("graphics/pokemon/chespin/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Chespin[] = INCBIN_U32("graphics/pokemon/chespin/anim_front.4bpp.smol"); const u16 gMonPalette_Chespin[] = INCBIN_U16("graphics/pokemon/chespin/normal.gbapal"); - const u32 gMonBackPic_Chespin[] = INCBIN_U32("graphics/pokemon/chespin/back.4bpp.lz"); + const u32 gMonBackPic_Chespin[] = INCBIN_U32("graphics/pokemon/chespin/back.4bpp.smol"); const u16 gMonShinyPalette_Chespin[] = INCBIN_U16("graphics/pokemon/chespin/shiny.gbapal"); const u8 gMonIcon_Chespin[] = INCBIN_U8("graphics/pokemon/chespin/icon.4bpp"); #if P_FOOTPRINTS @@ -19065,9 +19119,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Quilladin[] = INCBIN_U32("graphics/pokemon/quilladin/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Quilladin[] = INCBIN_U32("graphics/pokemon/quilladin/anim_front.4bpp.smol"); const u16 gMonPalette_Quilladin[] = INCBIN_U16("graphics/pokemon/quilladin/normal.gbapal"); - const u32 gMonBackPic_Quilladin[] = INCBIN_U32("graphics/pokemon/quilladin/back.4bpp.lz"); + const u32 gMonBackPic_Quilladin[] = INCBIN_U32("graphics/pokemon/quilladin/back.4bpp.smol"); const u16 gMonShinyPalette_Quilladin[] = INCBIN_U16("graphics/pokemon/quilladin/shiny.gbapal"); const u8 gMonIcon_Quilladin[] = INCBIN_U8("graphics/pokemon/quilladin/icon.4bpp"); #if P_FOOTPRINTS @@ -19081,9 +19135,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Chesnaught[] = INCBIN_U32("graphics/pokemon/chesnaught/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Chesnaught[] = INCBIN_U32("graphics/pokemon/chesnaught/anim_front.4bpp.smol"); const u16 gMonPalette_Chesnaught[] = INCBIN_U16("graphics/pokemon/chesnaught/normal.gbapal"); - const u32 gMonBackPic_Chesnaught[] = INCBIN_U32("graphics/pokemon/chesnaught/back.4bpp.lz"); + const u32 gMonBackPic_Chesnaught[] = INCBIN_U32("graphics/pokemon/chesnaught/back.4bpp.smol"); const u16 gMonShinyPalette_Chesnaught[] = INCBIN_U16("graphics/pokemon/chesnaught/shiny.gbapal"); const u8 gMonIcon_Chesnaught[] = INCBIN_U8("graphics/pokemon/chesnaught/icon.4bpp"); #if P_FOOTPRINTS @@ -19099,9 +19153,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CHESPIN #if P_FAMILY_FENNEKIN - const u32 gMonFrontPic_Fennekin[] = INCBIN_U32("graphics/pokemon/fennekin/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Fennekin[] = INCBIN_U32("graphics/pokemon/fennekin/anim_front.4bpp.smol"); const u16 gMonPalette_Fennekin[] = INCBIN_U16("graphics/pokemon/fennekin/normal.gbapal"); - const u32 gMonBackPic_Fennekin[] = INCBIN_U32("graphics/pokemon/fennekin/back.4bpp.lz"); + const u32 gMonBackPic_Fennekin[] = INCBIN_U32("graphics/pokemon/fennekin/back.4bpp.smol"); const u16 gMonShinyPalette_Fennekin[] = INCBIN_U16("graphics/pokemon/fennekin/shiny.gbapal"); const u8 gMonIcon_Fennekin[] = INCBIN_U8("graphics/pokemon/fennekin/icon.4bpp"); #if P_FOOTPRINTS @@ -19115,9 +19169,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Braixen[] = INCBIN_U32("graphics/pokemon/braixen/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Braixen[] = INCBIN_U32("graphics/pokemon/braixen/anim_front.4bpp.smol"); const u16 gMonPalette_Braixen[] = INCBIN_U16("graphics/pokemon/braixen/normal.gbapal"); - const u32 gMonBackPic_Braixen[] = INCBIN_U32("graphics/pokemon/braixen/back.4bpp.lz"); + const u32 gMonBackPic_Braixen[] = INCBIN_U32("graphics/pokemon/braixen/back.4bpp.smol"); const u16 gMonShinyPalette_Braixen[] = INCBIN_U16("graphics/pokemon/braixen/shiny.gbapal"); const u8 gMonIcon_Braixen[] = INCBIN_U8("graphics/pokemon/braixen/icon.4bpp"); #if P_FOOTPRINTS @@ -19131,9 +19185,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Delphox[] = INCBIN_U32("graphics/pokemon/delphox/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Delphox[] = INCBIN_U32("graphics/pokemon/delphox/anim_front.4bpp.smol"); const u16 gMonPalette_Delphox[] = INCBIN_U16("graphics/pokemon/delphox/normal.gbapal"); - const u32 gMonBackPic_Delphox[] = INCBIN_U32("graphics/pokemon/delphox/back.4bpp.lz"); + const u32 gMonBackPic_Delphox[] = INCBIN_U32("graphics/pokemon/delphox/back.4bpp.smol"); const u16 gMonShinyPalette_Delphox[] = INCBIN_U16("graphics/pokemon/delphox/shiny.gbapal"); const u8 gMonIcon_Delphox[] = INCBIN_U8("graphics/pokemon/delphox/icon.4bpp"); #if P_FOOTPRINTS @@ -19149,9 +19203,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FENNEKIN #if P_FAMILY_FROAKIE - const u32 gMonFrontPic_Froakie[] = INCBIN_U32("graphics/pokemon/froakie/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Froakie[] = INCBIN_U32("graphics/pokemon/froakie/anim_front.4bpp.smol"); const u16 gMonPalette_Froakie[] = INCBIN_U16("graphics/pokemon/froakie/normal.gbapal"); - const u32 gMonBackPic_Froakie[] = INCBIN_U32("graphics/pokemon/froakie/back.4bpp.lz"); + const u32 gMonBackPic_Froakie[] = INCBIN_U32("graphics/pokemon/froakie/back.4bpp.smol"); const u16 gMonShinyPalette_Froakie[] = INCBIN_U16("graphics/pokemon/froakie/shiny.gbapal"); const u8 gMonIcon_Froakie[] = INCBIN_U8("graphics/pokemon/froakie/icon.4bpp"); #if P_FOOTPRINTS @@ -19165,9 +19219,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Frogadier[] = INCBIN_U32("graphics/pokemon/frogadier/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Frogadier[] = INCBIN_U32("graphics/pokemon/frogadier/anim_front.4bpp.smol"); const u16 gMonPalette_Frogadier[] = INCBIN_U16("graphics/pokemon/frogadier/normal.gbapal"); - const u32 gMonBackPic_Frogadier[] = INCBIN_U32("graphics/pokemon/frogadier/back.4bpp.lz"); + const u32 gMonBackPic_Frogadier[] = INCBIN_U32("graphics/pokemon/frogadier/back.4bpp.smol"); const u16 gMonShinyPalette_Frogadier[] = INCBIN_U16("graphics/pokemon/frogadier/shiny.gbapal"); const u8 gMonIcon_Frogadier[] = INCBIN_U8("graphics/pokemon/frogadier/icon.4bpp"); #if P_FOOTPRINTS @@ -19181,9 +19235,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Greninja[] = INCBIN_U32("graphics/pokemon/greninja/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Greninja[] = INCBIN_U32("graphics/pokemon/greninja/anim_front.4bpp.smol"); const u16 gMonPalette_Greninja[] = INCBIN_U16("graphics/pokemon/greninja/normal.gbapal"); - const u32 gMonBackPic_Greninja[] = INCBIN_U32("graphics/pokemon/greninja/back.4bpp.lz"); + const u32 gMonBackPic_Greninja[] = INCBIN_U32("graphics/pokemon/greninja/back.4bpp.smol"); const u16 gMonShinyPalette_Greninja[] = INCBIN_U16("graphics/pokemon/greninja/shiny.gbapal"); const u8 gMonIcon_Greninja[] = INCBIN_U8("graphics/pokemon/greninja/icon.4bpp"); #if P_FOOTPRINTS @@ -19197,24 +19251,24 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_GreninjaAsh[] = INCBIN_U32("graphics/pokemon/greninja/ash/anim_front.4bpp.lz"); + const u32 gMonFrontPic_GreninjaAsh[] = INCBIN_U32("graphics/pokemon/greninja/ash/anim_front.4bpp.smol"); const u16 gMonPalette_GreninjaAsh[] = INCBIN_U16("graphics/pokemon/greninja/ash/normal.gbapal"); - const u32 gMonBackPic_GreninjaAsh[] = INCBIN_U32("graphics/pokemon/greninja/ash/back.4bpp.lz"); + const u32 gMonBackPic_GreninjaAsh[] = INCBIN_U32("graphics/pokemon/greninja/ash/back.4bpp.smol"); const u16 gMonShinyPalette_GreninjaAsh[] = INCBIN_U16("graphics/pokemon/greninja/ash/shiny.gbapal"); const u8 gMonIcon_GreninjaAsh[] = INCBIN_U8("graphics/pokemon/greninja/ash/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_GreninjaAsh[] = INCBIN_COMP("graphics/pokemon/greninja/ash/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_GreninjaAsh[] = INCBIN_COMP("graphics/pokemon/greninja/ash/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u16 gOverworldPalette_GreninjaAsh[] = INCBIN_U16("graphics/pokemon/greninja/ash/overworld_normal.gbapal"); - // const u16 gShinyOverworldPalette_GreninjaAsh[] = INCBIN_U16("graphics/pokemon/greninja/ash/overworld_shiny.gbapal"); + const u16 gOverworldPalette_GreninjaAsh[] = INCBIN_U16("graphics/pokemon/greninja/ash/overworld_normal.gbapal"); + const u16 gShinyOverworldPalette_GreninjaAsh[] = INCBIN_U16("graphics/pokemon/greninja/ash/overworld_shiny.gbapal"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_FAMILY_FROAKIE #if P_FAMILY_BUNNELBY - const u32 gMonFrontPic_Bunnelby[] = INCBIN_U32("graphics/pokemon/bunnelby/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bunnelby[] = INCBIN_U32("graphics/pokemon/bunnelby/anim_front.4bpp.smol"); const u16 gMonPalette_Bunnelby[] = INCBIN_U16("graphics/pokemon/bunnelby/normal.gbapal"); - const u32 gMonBackPic_Bunnelby[] = INCBIN_U32("graphics/pokemon/bunnelby/back.4bpp.lz"); + const u32 gMonBackPic_Bunnelby[] = INCBIN_U32("graphics/pokemon/bunnelby/back.4bpp.smol"); const u16 gMonShinyPalette_Bunnelby[] = INCBIN_U16("graphics/pokemon/bunnelby/shiny.gbapal"); const u8 gMonIcon_Bunnelby[] = INCBIN_U8("graphics/pokemon/bunnelby/icon.4bpp"); #if P_FOOTPRINTS @@ -19228,9 +19282,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Diggersby[] = INCBIN_U32("graphics/pokemon/diggersby/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Diggersby[] = INCBIN_U32("graphics/pokemon/diggersby/anim_front.4bpp.smol"); const u16 gMonPalette_Diggersby[] = INCBIN_U16("graphics/pokemon/diggersby/normal.gbapal"); - const u32 gMonBackPic_Diggersby[] = INCBIN_U32("graphics/pokemon/diggersby/back.4bpp.lz"); + const u32 gMonBackPic_Diggersby[] = INCBIN_U32("graphics/pokemon/diggersby/back.4bpp.smol"); const u16 gMonShinyPalette_Diggersby[] = INCBIN_U16("graphics/pokemon/diggersby/shiny.gbapal"); const u8 gMonIcon_Diggersby[] = INCBIN_U8("graphics/pokemon/diggersby/icon.4bpp"); #if P_FOOTPRINTS @@ -19246,9 +19300,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BUNNELBY #if P_FAMILY_FLETCHLING - const u32 gMonFrontPic_Fletchling[] = INCBIN_U32("graphics/pokemon/fletchling/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Fletchling[] = INCBIN_U32("graphics/pokemon/fletchling/anim_front.4bpp.smol"); const u16 gMonPalette_Fletchling[] = INCBIN_U16("graphics/pokemon/fletchling/normal.gbapal"); - const u32 gMonBackPic_Fletchling[] = INCBIN_U32("graphics/pokemon/fletchling/back.4bpp.lz"); + const u32 gMonBackPic_Fletchling[] = INCBIN_U32("graphics/pokemon/fletchling/back.4bpp.smol"); const u16 gMonShinyPalette_Fletchling[] = INCBIN_U16("graphics/pokemon/fletchling/shiny.gbapal"); const u8 gMonIcon_Fletchling[] = INCBIN_U8("graphics/pokemon/fletchling/icon.4bpp"); #if P_FOOTPRINTS @@ -19262,9 +19316,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Fletchinder[] = INCBIN_U32("graphics/pokemon/fletchinder/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Fletchinder[] = INCBIN_U32("graphics/pokemon/fletchinder/anim_front.4bpp.smol"); const u16 gMonPalette_Fletchinder[] = INCBIN_U16("graphics/pokemon/fletchinder/normal.gbapal"); - const u32 gMonBackPic_Fletchinder[] = INCBIN_U32("graphics/pokemon/fletchinder/back.4bpp.lz"); + const u32 gMonBackPic_Fletchinder[] = INCBIN_U32("graphics/pokemon/fletchinder/back.4bpp.smol"); const u16 gMonShinyPalette_Fletchinder[] = INCBIN_U16("graphics/pokemon/fletchinder/shiny.gbapal"); const u8 gMonIcon_Fletchinder[] = INCBIN_U8("graphics/pokemon/fletchinder/icon.4bpp"); #if P_FOOTPRINTS @@ -19278,9 +19332,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Talonflame[] = INCBIN_U32("graphics/pokemon/talonflame/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Talonflame[] = INCBIN_U32("graphics/pokemon/talonflame/anim_front.4bpp.smol"); const u16 gMonPalette_Talonflame[] = INCBIN_U16("graphics/pokemon/talonflame/normal.gbapal"); - const u32 gMonBackPic_Talonflame[] = INCBIN_U32("graphics/pokemon/talonflame/back.4bpp.lz"); + const u32 gMonBackPic_Talonflame[] = INCBIN_U32("graphics/pokemon/talonflame/back.4bpp.smol"); const u16 gMonShinyPalette_Talonflame[] = INCBIN_U16("graphics/pokemon/talonflame/shiny.gbapal"); const u8 gMonIcon_Talonflame[] = INCBIN_U8("graphics/pokemon/talonflame/icon.4bpp"); #if P_FOOTPRINTS @@ -19296,9 +19350,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FLETCHLING #if P_FAMILY_SCATTERBUG - const u32 gMonFrontPic_Scatterbug[] = INCBIN_U32("graphics/pokemon/scatterbug/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Scatterbug[] = INCBIN_U32("graphics/pokemon/scatterbug/anim_front.4bpp.smol"); const u16 gMonPalette_Scatterbug[] = INCBIN_U16("graphics/pokemon/scatterbug/normal.gbapal"); - const u32 gMonBackPic_Scatterbug[] = INCBIN_U32("graphics/pokemon/scatterbug/back.4bpp.lz"); + const u32 gMonBackPic_Scatterbug[] = INCBIN_U32("graphics/pokemon/scatterbug/back.4bpp.smol"); const u16 gMonShinyPalette_Scatterbug[] = INCBIN_U16("graphics/pokemon/scatterbug/shiny.gbapal"); const u8 gMonIcon_Scatterbug[] = INCBIN_U8("graphics/pokemon/scatterbug/icon.4bpp"); #if P_FOOTPRINTS @@ -19312,9 +19366,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Spewpa[] = INCBIN_U32("graphics/pokemon/spewpa/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Spewpa[] = INCBIN_U32("graphics/pokemon/spewpa/anim_front.4bpp.smol"); const u16 gMonPalette_Spewpa[] = INCBIN_U16("graphics/pokemon/spewpa/normal.gbapal"); - const u32 gMonBackPic_Spewpa[] = INCBIN_U32("graphics/pokemon/spewpa/back.4bpp.lz"); + const u32 gMonBackPic_Spewpa[] = INCBIN_U32("graphics/pokemon/spewpa/back.4bpp.smol"); const u16 gMonShinyPalette_Spewpa[] = INCBIN_U16("graphics/pokemon/spewpa/shiny.gbapal"); const u8 gMonIcon_Spewpa[] = INCBIN_U8("graphics/pokemon/spewpa/icon.4bpp"); #if P_FOOTPRINTS @@ -19328,102 +19382,102 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_VivillonIcySnow[] = INCBIN_U32("graphics/pokemon/vivillon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonIcySnow[] = INCBIN_U32("graphics/pokemon/vivillon/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonIcySnow[] = INCBIN_U16("graphics/pokemon/vivillon/normal.gbapal"); - const u32 gMonBackPic_VivillonIcySnow[] = INCBIN_U32("graphics/pokemon/vivillon/back.4bpp.lz"); + const u32 gMonBackPic_VivillonIcySnow[] = INCBIN_U32("graphics/pokemon/vivillon/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonIcySnow[] = INCBIN_U16("graphics/pokemon/vivillon/shiny.gbapal"); const u8 gMonIcon_VivillonIcySnow[] = INCBIN_U8("graphics/pokemon/vivillon/meadow/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Vivillon[] = INCBIN_U8("graphics/pokemon/vivillon/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_VivillonPolar[] = INCBIN_U32("graphics/pokemon/vivillon/polar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonPolar[] = INCBIN_U32("graphics/pokemon/vivillon/polar/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonPolar[] = INCBIN_U16("graphics/pokemon/vivillon/polar/normal.gbapal"); - const u32 gMonBackPic_VivillonPolar[] = INCBIN_U32("graphics/pokemon/vivillon/polar/back.4bpp.lz"); + const u32 gMonBackPic_VivillonPolar[] = INCBIN_U32("graphics/pokemon/vivillon/polar/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonPolar[] = INCBIN_U16("graphics/pokemon/vivillon/polar/shiny.gbapal"); const u8 gMonIcon_VivillonPolar[] = INCBIN_U8("graphics/pokemon/vivillon/polar/icon.4bpp"); - const u32 gMonFrontPic_VivillonTundra[] = INCBIN_U32("graphics/pokemon/vivillon/tundra/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonTundra[] = INCBIN_U32("graphics/pokemon/vivillon/tundra/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonTundra[] = INCBIN_U16("graphics/pokemon/vivillon/tundra/normal.gbapal"); - const u32 gMonBackPic_VivillonTundra[] = INCBIN_U32("graphics/pokemon/vivillon/tundra/back.4bpp.lz"); + const u32 gMonBackPic_VivillonTundra[] = INCBIN_U32("graphics/pokemon/vivillon/tundra/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonTundra[] = INCBIN_U16("graphics/pokemon/vivillon/tundra/shiny.gbapal"); const u8 gMonIcon_VivillonTundra[] = INCBIN_U8("graphics/pokemon/vivillon/tundra/icon.4bpp"); - const u32 gMonFrontPic_VivillonContinental[] = INCBIN_U32("graphics/pokemon/vivillon/continental/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonContinental[] = INCBIN_U32("graphics/pokemon/vivillon/continental/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonContinental[] = INCBIN_U16("graphics/pokemon/vivillon/continental/normal.gbapal"); - const u32 gMonBackPic_VivillonContinental[] = INCBIN_U32("graphics/pokemon/vivillon/continental/back.4bpp.lz"); + const u32 gMonBackPic_VivillonContinental[] = INCBIN_U32("graphics/pokemon/vivillon/continental/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonContinental[] = INCBIN_U16("graphics/pokemon/vivillon/continental/shiny.gbapal"); const u8 gMonIcon_VivillonContinental[] = INCBIN_U8("graphics/pokemon/vivillon/continental/icon.4bpp"); - const u32 gMonFrontPic_VivillonGarden[] = INCBIN_U32("graphics/pokemon/vivillon/garden/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonGarden[] = INCBIN_U32("graphics/pokemon/vivillon/garden/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonGarden[] = INCBIN_U16("graphics/pokemon/vivillon/garden/normal.gbapal"); - const u32 gMonBackPic_VivillonGarden[] = INCBIN_U32("graphics/pokemon/vivillon/garden/back.4bpp.lz"); + const u32 gMonBackPic_VivillonGarden[] = INCBIN_U32("graphics/pokemon/vivillon/garden/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonGarden[] = INCBIN_U16("graphics/pokemon/vivillon/garden/shiny.gbapal"); const u8 gMonIcon_VivillonGarden[] = INCBIN_U8("graphics/pokemon/vivillon/garden/icon.4bpp"); - const u32 gMonFrontPic_VivillonElegant[] = INCBIN_U32("graphics/pokemon/vivillon/elegant/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonElegant[] = INCBIN_U32("graphics/pokemon/vivillon/elegant/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonElegant[] = INCBIN_U16("graphics/pokemon/vivillon/elegant/normal.gbapal"); - const u32 gMonBackPic_VivillonElegant[] = INCBIN_U32("graphics/pokemon/vivillon/elegant/back.4bpp.lz"); + const u32 gMonBackPic_VivillonElegant[] = INCBIN_U32("graphics/pokemon/vivillon/elegant/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonElegant[] = INCBIN_U16("graphics/pokemon/vivillon/elegant/shiny.gbapal"); const u8 gMonIcon_VivillonElegant[] = INCBIN_U8("graphics/pokemon/vivillon/elegant/icon.4bpp"); - const u32 gMonFrontPic_VivillonMeadow[] = INCBIN_U32("graphics/pokemon/vivillon/meadow/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonMeadow[] = INCBIN_U32("graphics/pokemon/vivillon/meadow/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonMeadow[] = INCBIN_U16("graphics/pokemon/vivillon/meadow/normal.gbapal"); - const u32 gMonBackPic_VivillonMeadow[] = INCBIN_U32("graphics/pokemon/vivillon/meadow/back.4bpp.lz"); + const u32 gMonBackPic_VivillonMeadow[] = INCBIN_U32("graphics/pokemon/vivillon/meadow/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonMeadow[] = INCBIN_U16("graphics/pokemon/vivillon/meadow/shiny.gbapal"); const u8 gMonIcon_VivillonMeadow[] = INCBIN_U8("graphics/pokemon/vivillon/meadow/icon.4bpp"); - const u32 gMonFrontPic_VivillonModern[] = INCBIN_U32("graphics/pokemon/vivillon/modern/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonModern[] = INCBIN_U32("graphics/pokemon/vivillon/modern/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonModern[] = INCBIN_U16("graphics/pokemon/vivillon/modern/normal.gbapal"); - const u32 gMonBackPic_VivillonModern[] = INCBIN_U32("graphics/pokemon/vivillon/modern/back.4bpp.lz"); + const u32 gMonBackPic_VivillonModern[] = INCBIN_U32("graphics/pokemon/vivillon/modern/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonModern[] = INCBIN_U16("graphics/pokemon/vivillon/modern/shiny.gbapal"); const u8 gMonIcon_VivillonModern[] = INCBIN_U8("graphics/pokemon/vivillon/modern/icon.4bpp"); - const u32 gMonFrontPic_VivillonMarine[] = INCBIN_U32("graphics/pokemon/vivillon/marine/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonMarine[] = INCBIN_U32("graphics/pokemon/vivillon/marine/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonMarine[] = INCBIN_U16("graphics/pokemon/vivillon/marine/normal.gbapal"); - const u32 gMonBackPic_VivillonMarine[] = INCBIN_U32("graphics/pokemon/vivillon/marine/back.4bpp.lz"); + const u32 gMonBackPic_VivillonMarine[] = INCBIN_U32("graphics/pokemon/vivillon/marine/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonMarine[] = INCBIN_U16("graphics/pokemon/vivillon/marine/shiny.gbapal"); const u8 gMonIcon_VivillonMarine[] = INCBIN_U8("graphics/pokemon/vivillon/marine/icon.4bpp"); - const u32 gMonFrontPic_VivillonArchipelago[] = INCBIN_U32("graphics/pokemon/vivillon/archipelago/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonArchipelago[] = INCBIN_U32("graphics/pokemon/vivillon/archipelago/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonArchipelago[] = INCBIN_U16("graphics/pokemon/vivillon/archipelago/normal.gbapal"); - const u32 gMonBackPic_VivillonArchipelago[] = INCBIN_U32("graphics/pokemon/vivillon/archipelago/back.4bpp.lz"); + const u32 gMonBackPic_VivillonArchipelago[] = INCBIN_U32("graphics/pokemon/vivillon/archipelago/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonArchipelago[] = INCBIN_U16("graphics/pokemon/vivillon/archipelago/shiny.gbapal"); const u8 gMonIcon_VivillonArchipelago[] = INCBIN_U8("graphics/pokemon/vivillon/archipelago/icon.4bpp"); - const u32 gMonFrontPic_VivillonHighPlains[] = INCBIN_U32("graphics/pokemon/vivillon/high_plains/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonHighPlains[] = INCBIN_U32("graphics/pokemon/vivillon/high_plains/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonHighPlains[] = INCBIN_U16("graphics/pokemon/vivillon/high_plains/normal.gbapal"); - const u32 gMonBackPic_VivillonHighPlains[] = INCBIN_U32("graphics/pokemon/vivillon/high_plains/back.4bpp.lz"); + const u32 gMonBackPic_VivillonHighPlains[] = INCBIN_U32("graphics/pokemon/vivillon/high_plains/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonHighPlains[] = INCBIN_U16("graphics/pokemon/vivillon/high_plains/shiny.gbapal"); const u8 gMonIcon_VivillonHighPlains[] = INCBIN_U8("graphics/pokemon/vivillon/high_plains/icon.4bpp"); - const u32 gMonFrontPic_VivillonSandstorm[] = INCBIN_U32("graphics/pokemon/vivillon/sandstorm/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonSandstorm[] = INCBIN_U32("graphics/pokemon/vivillon/sandstorm/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonSandstorm[] = INCBIN_U16("graphics/pokemon/vivillon/sandstorm/normal.gbapal"); - const u32 gMonBackPic_VivillonSandstorm[] = INCBIN_U32("graphics/pokemon/vivillon/sandstorm/back.4bpp.lz"); + const u32 gMonBackPic_VivillonSandstorm[] = INCBIN_U32("graphics/pokemon/vivillon/sandstorm/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonSandstorm[] = INCBIN_U16("graphics/pokemon/vivillon/sandstorm/shiny.gbapal"); const u8 gMonIcon_VivillonSandstorm[] = INCBIN_U8("graphics/pokemon/vivillon/sandstorm/icon.4bpp"); - const u32 gMonFrontPic_VivillonRiver[] = INCBIN_U32("graphics/pokemon/vivillon/river/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonRiver[] = INCBIN_U32("graphics/pokemon/vivillon/river/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonRiver[] = INCBIN_U16("graphics/pokemon/vivillon/river/normal.gbapal"); - const u32 gMonBackPic_VivillonRiver[] = INCBIN_U32("graphics/pokemon/vivillon/river/back.4bpp.lz"); + const u32 gMonBackPic_VivillonRiver[] = INCBIN_U32("graphics/pokemon/vivillon/river/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonRiver[] = INCBIN_U16("graphics/pokemon/vivillon/river/shiny.gbapal"); const u8 gMonIcon_VivillonRiver[] = INCBIN_U8("graphics/pokemon/vivillon/river/icon.4bpp"); - const u32 gMonFrontPic_VivillonMonsoon[] = INCBIN_U32("graphics/pokemon/vivillon/monsoon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonMonsoon[] = INCBIN_U32("graphics/pokemon/vivillon/monsoon/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonMonsoon[] = INCBIN_U16("graphics/pokemon/vivillon/monsoon/normal.gbapal"); - const u32 gMonBackPic_VivillonMonsoon[] = INCBIN_U32("graphics/pokemon/vivillon/monsoon/back.4bpp.lz"); + const u32 gMonBackPic_VivillonMonsoon[] = INCBIN_U32("graphics/pokemon/vivillon/monsoon/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonMonsoon[] = INCBIN_U16("graphics/pokemon/vivillon/monsoon/shiny.gbapal"); const u8 gMonIcon_VivillonMonsoon[] = INCBIN_U8("graphics/pokemon/vivillon/monsoon/icon.4bpp"); - const u32 gMonFrontPic_VivillonSavanna[] = INCBIN_U32("graphics/pokemon/vivillon/savanna/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonSavanna[] = INCBIN_U32("graphics/pokemon/vivillon/savanna/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonSavanna[] = INCBIN_U16("graphics/pokemon/vivillon/savanna/normal.gbapal"); - const u32 gMonBackPic_VivillonSavanna[] = INCBIN_U32("graphics/pokemon/vivillon/savanna/back.4bpp.lz"); + const u32 gMonBackPic_VivillonSavanna[] = INCBIN_U32("graphics/pokemon/vivillon/savanna/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonSavanna[] = INCBIN_U16("graphics/pokemon/vivillon/savanna/shiny.gbapal"); const u8 gMonIcon_VivillonSavanna[] = INCBIN_U8("graphics/pokemon/vivillon/savanna/icon.4bpp"); - const u32 gMonFrontPic_VivillonSun[] = INCBIN_U32("graphics/pokemon/vivillon/sun/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonSun[] = INCBIN_U32("graphics/pokemon/vivillon/sun/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonSun[] = INCBIN_U16("graphics/pokemon/vivillon/sun/normal.gbapal"); - const u32 gMonBackPic_VivillonSun[] = INCBIN_U32("graphics/pokemon/vivillon/sun/back.4bpp.lz"); + const u32 gMonBackPic_VivillonSun[] = INCBIN_U32("graphics/pokemon/vivillon/sun/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonSun[] = INCBIN_U16("graphics/pokemon/vivillon/sun/shiny.gbapal"); const u8 gMonIcon_VivillonSun[] = INCBIN_U8("graphics/pokemon/vivillon/sun/icon.4bpp"); @@ -19492,35 +19546,35 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_VivillonOcean[] = INCBIN_U32("graphics/pokemon/vivillon/ocean/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonOcean[] = INCBIN_U32("graphics/pokemon/vivillon/ocean/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonOcean[] = INCBIN_U16("graphics/pokemon/vivillon/ocean/normal.gbapal"); - const u32 gMonBackPic_VivillonOcean[] = INCBIN_U32("graphics/pokemon/vivillon/ocean/back.4bpp.lz"); + const u32 gMonBackPic_VivillonOcean[] = INCBIN_U32("graphics/pokemon/vivillon/ocean/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonOcean[] = INCBIN_U16("graphics/pokemon/vivillon/ocean/shiny.gbapal"); const u8 gMonIcon_VivillonOcean[] = INCBIN_U8("graphics/pokemon/vivillon/ocean/icon.4bpp"); - const u32 gMonFrontPic_VivillonJungle[] = INCBIN_U32("graphics/pokemon/vivillon/jungle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonJungle[] = INCBIN_U32("graphics/pokemon/vivillon/jungle/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonJungle[] = INCBIN_U16("graphics/pokemon/vivillon/jungle/normal.gbapal"); - const u32 gMonBackPic_VivillonJungle[] = INCBIN_U32("graphics/pokemon/vivillon/jungle/back.4bpp.lz"); + const u32 gMonBackPic_VivillonJungle[] = INCBIN_U32("graphics/pokemon/vivillon/jungle/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonJungle[] = INCBIN_U16("graphics/pokemon/vivillon/jungle/shiny.gbapal"); const u8 gMonIcon_VivillonJungle[] = INCBIN_U8("graphics/pokemon/vivillon/jungle/icon.4bpp"); - const u32 gMonFrontPic_VivillonFancy[] = INCBIN_U32("graphics/pokemon/vivillon/fancy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonFancy[] = INCBIN_U32("graphics/pokemon/vivillon/fancy/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonFancy[] = INCBIN_U16("graphics/pokemon/vivillon/fancy/normal.gbapal"); - const u32 gMonBackPic_VivillonFancy[] = INCBIN_U32("graphics/pokemon/vivillon/fancy/back.4bpp.lz"); + const u32 gMonBackPic_VivillonFancy[] = INCBIN_U32("graphics/pokemon/vivillon/fancy/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonFancy[] = INCBIN_U16("graphics/pokemon/vivillon/fancy/shiny.gbapal"); const u8 gMonIcon_VivillonFancy[] = INCBIN_U8("graphics/pokemon/vivillon/fancy/icon.4bpp"); - const u32 gMonFrontPic_VivillonPokeBall[] = INCBIN_U32("graphics/pokemon/vivillon/poke_ball/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonPokeBall[] = INCBIN_U32("graphics/pokemon/vivillon/poke_ball/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonPokeBall[] = INCBIN_U16("graphics/pokemon/vivillon/poke_ball/normal.gbapal"); - const u32 gMonBackPic_VivillonPokeBall[] = INCBIN_U32("graphics/pokemon/vivillon/poke_ball/back.4bpp.lz"); + const u32 gMonBackPic_VivillonPokeBall[] = INCBIN_U32("graphics/pokemon/vivillon/poke_ball/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonPokeBall[] = INCBIN_U16("graphics/pokemon/vivillon/poke_ball/shiny.gbapal"); const u8 gMonIcon_VivillonPokeBall[] = INCBIN_U8("graphics/pokemon/vivillon/poke_ball/icon.4bpp"); #endif //P_FAMILY_SCATTERBUG #if P_FAMILY_LITLEO - const u32 gMonFrontPic_Litleo[] = INCBIN_U32("graphics/pokemon/litleo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Litleo[] = INCBIN_U32("graphics/pokemon/litleo/anim_front.4bpp.smol"); const u16 gMonPalette_Litleo[] = INCBIN_U16("graphics/pokemon/litleo/normal.gbapal"); - const u32 gMonBackPic_Litleo[] = INCBIN_U32("graphics/pokemon/litleo/back.4bpp.lz"); + const u32 gMonBackPic_Litleo[] = INCBIN_U32("graphics/pokemon/litleo/back.4bpp.smol"); const u16 gMonShinyPalette_Litleo[] = INCBIN_U16("graphics/pokemon/litleo/shiny.gbapal"); const u8 gMonIcon_Litleo[] = INCBIN_U8("graphics/pokemon/litleo/icon.4bpp"); #if P_FOOTPRINTS @@ -19534,9 +19588,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Pyroar[] = INCBIN_U32("graphics/pokemon/pyroar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pyroar[] = INCBIN_U32("graphics/pokemon/pyroar/anim_front.4bpp.smol"); const u16 gMonPalette_Pyroar[] = INCBIN_U16("graphics/pokemon/pyroar/normal.gbapal"); - const u32 gMonBackPic_Pyroar[] = INCBIN_U32("graphics/pokemon/pyroar/back.4bpp.lz"); + const u32 gMonBackPic_Pyroar[] = INCBIN_U32("graphics/pokemon/pyroar/back.4bpp.smol"); const u16 gMonShinyPalette_Pyroar[] = INCBIN_U16("graphics/pokemon/pyroar/shiny.gbapal"); const u8 gMonIcon_Pyroar[] = INCBIN_U8("graphics/pokemon/pyroar/icon.4bpp"); #if P_FOOTPRINTS @@ -19551,8 +19605,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_PyroarF[] = INCBIN_U32("graphics/pokemon/pyroar/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_PyroarF[] = INCBIN_U32("graphics/pokemon/pyroar/backf.4bpp.lz"); + const u32 gMonFrontPic_PyroarF[] = INCBIN_U32("graphics/pokemon/pyroar/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_PyroarF[] = INCBIN_U32("graphics/pokemon/pyroar/backf.4bpp.smol"); const u8 gMonIcon_PyroarF[] = INCBIN_U8("graphics/pokemon/pyroar/iconf.4bpp"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_PyroarF[] = INCBIN_COMP("graphics/pokemon/pyroar/overworldf.4bpp"); @@ -19561,8 +19615,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_LITLEO #if P_FAMILY_FLABEBE - const u32 gMonFrontPic_Flabebe[] = INCBIN_U32("graphics/pokemon/flabebe/anim_front.4bpp.lz"); - const u32 gMonBackPic_Flabebe[] = INCBIN_U32("graphics/pokemon/flabebe/back.4bpp.lz"); + const u32 gMonFrontPic_Flabebe[] = INCBIN_U32("graphics/pokemon/flabebe/anim_front.4bpp.smol"); + const u32 gMonBackPic_Flabebe[] = INCBIN_U32("graphics/pokemon/flabebe/back.4bpp.smol"); #if P_FOOTPRINTS const u8 gMonFootprint_Flabebe[] = INCBIN_U8("graphics/pokemon/flabebe/footprint.1bpp"); #endif //P_FOOTPRINTS @@ -19607,8 +19661,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Floette[] = INCBIN_U32("graphics/pokemon/floette/anim_front.4bpp.lz"); - const u32 gMonBackPic_Floette[] = INCBIN_U32("graphics/pokemon/floette/back.4bpp.lz"); + const u32 gMonFrontPic_Floette[] = INCBIN_U32("graphics/pokemon/floette/anim_front.4bpp.smol"); + const u32 gMonBackPic_Floette[] = INCBIN_U32("graphics/pokemon/floette/back.4bpp.smol"); #if P_FOOTPRINTS const u8 gMonFootprint_Floette[] = INCBIN_U8("graphics/pokemon/floette/footprint.1bpp"); #endif //P_FOOTPRINTS @@ -19633,9 +19687,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u16 gMonShinyPalette_FloetteWhite[] = INCBIN_U16("graphics/pokemon/floette/white/shiny.gbapal"); const u8 gMonIcon_FloetteWhite[] = INCBIN_U8("graphics/pokemon/floette/white/icon.4bpp"); - const u32 gMonFrontPic_FloetteEternal[] = INCBIN_U32("graphics/pokemon/floette/eternal/anim_front.4bpp.lz"); + const u32 gMonFrontPic_FloetteEternal[] = INCBIN_U32("graphics/pokemon/floette/eternal/anim_front.4bpp.smol"); const u16 gMonPalette_FloetteEternal[] = INCBIN_U16("graphics/pokemon/floette/eternal/normal.gbapal"); - const u32 gMonBackPic_FloetteEternal[] = INCBIN_U32("graphics/pokemon/floette/eternal/back.4bpp.lz"); + const u32 gMonBackPic_FloetteEternal[] = INCBIN_U32("graphics/pokemon/floette/eternal/back.4bpp.smol"); const u16 gMonShinyPalette_FloetteEternal[] = INCBIN_U16("graphics/pokemon/floette/eternal/shiny.gbapal"); const u8 gMonIcon_FloetteEternal[] = INCBIN_U8("graphics/pokemon/floette/eternal/icon.4bpp"); @@ -19662,8 +19716,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Florges[] = INCBIN_U32("graphics/pokemon/florges/anim_front.4bpp.lz"); - const u32 gMonBackPic_Florges[] = INCBIN_U32("graphics/pokemon/florges/back.4bpp.lz"); + const u32 gMonFrontPic_Florges[] = INCBIN_U32("graphics/pokemon/florges/anim_front.4bpp.smol"); + const u32 gMonBackPic_Florges[] = INCBIN_U32("graphics/pokemon/florges/back.4bpp.smol"); #if P_FOOTPRINTS const u8 gMonFootprint_Florges[] = INCBIN_U8("graphics/pokemon/florges/footprint.1bpp"); #endif //P_FOOTPRINTS @@ -19710,9 +19764,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FLABEBE #if P_FAMILY_SKIDDO - const u32 gMonFrontPic_Skiddo[] = INCBIN_U32("graphics/pokemon/skiddo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Skiddo[] = INCBIN_U32("graphics/pokemon/skiddo/anim_front.4bpp.smol"); const u16 gMonPalette_Skiddo[] = INCBIN_U16("graphics/pokemon/skiddo/normal.gbapal"); - const u32 gMonBackPic_Skiddo[] = INCBIN_U32("graphics/pokemon/skiddo/back.4bpp.lz"); + const u32 gMonBackPic_Skiddo[] = INCBIN_U32("graphics/pokemon/skiddo/back.4bpp.smol"); const u16 gMonShinyPalette_Skiddo[] = INCBIN_U16("graphics/pokemon/skiddo/shiny.gbapal"); const u8 gMonIcon_Skiddo[] = INCBIN_U8("graphics/pokemon/skiddo/icon.4bpp"); #if P_FOOTPRINTS @@ -19726,9 +19780,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Gogoat[] = INCBIN_U32("graphics/pokemon/gogoat/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gogoat[] = INCBIN_U32("graphics/pokemon/gogoat/anim_front.4bpp.smol"); const u16 gMonPalette_Gogoat[] = INCBIN_U16("graphics/pokemon/gogoat/normal.gbapal"); - const u32 gMonBackPic_Gogoat[] = INCBIN_U32("graphics/pokemon/gogoat/back.4bpp.lz"); + const u32 gMonBackPic_Gogoat[] = INCBIN_U32("graphics/pokemon/gogoat/back.4bpp.smol"); const u16 gMonShinyPalette_Gogoat[] = INCBIN_U16("graphics/pokemon/gogoat/shiny.gbapal"); const u8 gMonIcon_Gogoat[] = INCBIN_U8("graphics/pokemon/gogoat/icon.4bpp"); #if P_FOOTPRINTS @@ -19744,9 +19798,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SKIDDO #if P_FAMILY_PANCHAM - const u32 gMonFrontPic_Pancham[] = INCBIN_U32("graphics/pokemon/pancham/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pancham[] = INCBIN_U32("graphics/pokemon/pancham/anim_front.4bpp.smol"); const u16 gMonPalette_Pancham[] = INCBIN_U16("graphics/pokemon/pancham/normal.gbapal"); - const u32 gMonBackPic_Pancham[] = INCBIN_U32("graphics/pokemon/pancham/back.4bpp.lz"); + const u32 gMonBackPic_Pancham[] = INCBIN_U32("graphics/pokemon/pancham/back.4bpp.smol"); const u16 gMonShinyPalette_Pancham[] = INCBIN_U16("graphics/pokemon/pancham/shiny.gbapal"); const u8 gMonIcon_Pancham[] = INCBIN_U8("graphics/pokemon/pancham/icon.4bpp"); #if P_FOOTPRINTS @@ -19760,9 +19814,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Pangoro[] = INCBIN_U32("graphics/pokemon/pangoro/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pangoro[] = INCBIN_U32("graphics/pokemon/pangoro/anim_front.4bpp.smol"); const u16 gMonPalette_Pangoro[] = INCBIN_U16("graphics/pokemon/pangoro/normal.gbapal"); - const u32 gMonBackPic_Pangoro[] = INCBIN_U32("graphics/pokemon/pangoro/back.4bpp.lz"); + const u32 gMonBackPic_Pangoro[] = INCBIN_U32("graphics/pokemon/pangoro/back.4bpp.smol"); const u16 gMonShinyPalette_Pangoro[] = INCBIN_U16("graphics/pokemon/pangoro/shiny.gbapal"); const u8 gMonIcon_Pangoro[] = INCBIN_U8("graphics/pokemon/pangoro/icon.4bpp"); #if P_FOOTPRINTS @@ -19778,66 +19832,66 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PANCHAM #if P_FAMILY_FURFROU - const u32 gMonFrontPic_FurfrouNatural[] = INCBIN_U32("graphics/pokemon/furfrou/anim_front.4bpp.lz"); + const u32 gMonFrontPic_FurfrouNatural[] = INCBIN_U32("graphics/pokemon/furfrou/anim_front.4bpp.smol"); const u16 gMonPalette_FurfrouNatural[] = INCBIN_U16("graphics/pokemon/furfrou/normal.gbapal"); - const u32 gMonBackPic_FurfrouNatural[] = INCBIN_U32("graphics/pokemon/furfrou/back.4bpp.lz"); + const u32 gMonBackPic_FurfrouNatural[] = INCBIN_U32("graphics/pokemon/furfrou/back.4bpp.smol"); const u16 gMonShinyPalette_FurfrouNatural[] = INCBIN_U16("graphics/pokemon/furfrou/shiny.gbapal"); const u8 gMonIcon_FurfrouNatural[] = INCBIN_U8("graphics/pokemon/furfrou/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Furfrou[] = INCBIN_U8("graphics/pokemon/furfrou/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_FurfrouHeart[] = INCBIN_U32("graphics/pokemon/furfrou/heart/anim_front.4bpp.lz"); + const u32 gMonFrontPic_FurfrouHeart[] = INCBIN_U32("graphics/pokemon/furfrou/heart/anim_front.4bpp.smol"); const u16 gMonPalette_FurfrouHeart[] = INCBIN_U16("graphics/pokemon/furfrou/heart/normal.gbapal"); - const u32 gMonBackPic_FurfrouHeart[] = INCBIN_U32("graphics/pokemon/furfrou/heart/back.4bpp.lz"); + const u32 gMonBackPic_FurfrouHeart[] = INCBIN_U32("graphics/pokemon/furfrou/heart/back.4bpp.smol"); const u16 gMonShinyPalette_FurfrouHeart[] = INCBIN_U16("graphics/pokemon/furfrou/heart/shiny.gbapal"); const u8 gMonIcon_FurfrouHeart[] = INCBIN_U8("graphics/pokemon/furfrou/heart/icon.4bpp"); - const u32 gMonFrontPic_FurfrouStar[] = INCBIN_U32("graphics/pokemon/furfrou/star/anim_front.4bpp.lz"); + const u32 gMonFrontPic_FurfrouStar[] = INCBIN_U32("graphics/pokemon/furfrou/star/anim_front.4bpp.smol"); const u16 gMonPalette_FurfrouStar[] = INCBIN_U16("graphics/pokemon/furfrou/star/normal.gbapal"); - const u32 gMonBackPic_FurfrouStar[] = INCBIN_U32("graphics/pokemon/furfrou/star/back.4bpp.lz"); + const u32 gMonBackPic_FurfrouStar[] = INCBIN_U32("graphics/pokemon/furfrou/star/back.4bpp.smol"); const u16 gMonShinyPalette_FurfrouStar[] = INCBIN_U16("graphics/pokemon/furfrou/star/shiny.gbapal"); const u8 gMonIcon_FurfrouStar[] = INCBIN_U8("graphics/pokemon/furfrou/star/icon.4bpp"); - const u32 gMonFrontPic_FurfrouDiamond[] = INCBIN_U32("graphics/pokemon/furfrou/diamond/anim_front.4bpp.lz"); + const u32 gMonFrontPic_FurfrouDiamond[] = INCBIN_U32("graphics/pokemon/furfrou/diamond/anim_front.4bpp.smol"); const u16 gMonPalette_FurfrouDiamond[] = INCBIN_U16("graphics/pokemon/furfrou/diamond/normal.gbapal"); - const u32 gMonBackPic_FurfrouDiamond[] = INCBIN_U32("graphics/pokemon/furfrou/diamond/back.4bpp.lz"); + const u32 gMonBackPic_FurfrouDiamond[] = INCBIN_U32("graphics/pokemon/furfrou/diamond/back.4bpp.smol"); const u16 gMonShinyPalette_FurfrouDiamond[] = INCBIN_U16("graphics/pokemon/furfrou/diamond/shiny.gbapal"); const u8 gMonIcon_FurfrouDiamond[] = INCBIN_U8("graphics/pokemon/furfrou/diamond/icon.4bpp"); - const u32 gMonFrontPic_FurfrouDebutante[] = INCBIN_U32("graphics/pokemon/furfrou/debutante/anim_front.4bpp.lz"); + const u32 gMonFrontPic_FurfrouDebutante[] = INCBIN_U32("graphics/pokemon/furfrou/debutante/anim_front.4bpp.smol"); const u16 gMonPalette_FurfrouDebutante[] = INCBIN_U16("graphics/pokemon/furfrou/debutante/normal.gbapal"); - const u32 gMonBackPic_FurfrouDebutante[] = INCBIN_U32("graphics/pokemon/furfrou/debutante/back.4bpp.lz"); + const u32 gMonBackPic_FurfrouDebutante[] = INCBIN_U32("graphics/pokemon/furfrou/debutante/back.4bpp.smol"); const u16 gMonShinyPalette_FurfrouDebutante[] = INCBIN_U16("graphics/pokemon/furfrou/debutante/shiny.gbapal"); const u8 gMonIcon_FurfrouDebutante[] = INCBIN_U8("graphics/pokemon/furfrou/debutante/icon.4bpp"); - const u32 gMonFrontPic_FurfrouMatron[] = INCBIN_U32("graphics/pokemon/furfrou/matron/anim_front.4bpp.lz"); + const u32 gMonFrontPic_FurfrouMatron[] = INCBIN_U32("graphics/pokemon/furfrou/matron/anim_front.4bpp.smol"); const u16 gMonPalette_FurfrouMatron[] = INCBIN_U16("graphics/pokemon/furfrou/matron/normal.gbapal"); - const u32 gMonBackPic_FurfrouMatron[] = INCBIN_U32("graphics/pokemon/furfrou/matron/back.4bpp.lz"); + const u32 gMonBackPic_FurfrouMatron[] = INCBIN_U32("graphics/pokemon/furfrou/matron/back.4bpp.smol"); const u16 gMonShinyPalette_FurfrouMatron[] = INCBIN_U16("graphics/pokemon/furfrou/matron/shiny.gbapal"); const u8 gMonIcon_FurfrouMatron[] = INCBIN_U8("graphics/pokemon/furfrou/matron/icon.4bpp"); - const u32 gMonFrontPic_FurfrouDandy[] = INCBIN_U32("graphics/pokemon/furfrou/dandy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_FurfrouDandy[] = INCBIN_U32("graphics/pokemon/furfrou/dandy/anim_front.4bpp.smol"); const u16 gMonPalette_FurfrouDandy[] = INCBIN_U16("graphics/pokemon/furfrou/dandy/normal.gbapal"); - const u32 gMonBackPic_FurfrouDandy[] = INCBIN_U32("graphics/pokemon/furfrou/dandy/back.4bpp.lz"); + const u32 gMonBackPic_FurfrouDandy[] = INCBIN_U32("graphics/pokemon/furfrou/dandy/back.4bpp.smol"); const u16 gMonShinyPalette_FurfrouDandy[] = INCBIN_U16("graphics/pokemon/furfrou/dandy/shiny.gbapal"); const u8 gMonIcon_FurfrouDandy[] = INCBIN_U8("graphics/pokemon/furfrou/dandy/icon.4bpp"); - const u32 gMonFrontPic_FurfrouLaReine[] = INCBIN_U32("graphics/pokemon/furfrou/la_reine/anim_front.4bpp.lz"); + const u32 gMonFrontPic_FurfrouLaReine[] = INCBIN_U32("graphics/pokemon/furfrou/la_reine/anim_front.4bpp.smol"); const u16 gMonPalette_FurfrouLaReine[] = INCBIN_U16("graphics/pokemon/furfrou/la_reine/normal.gbapal"); - const u32 gMonBackPic_FurfrouLaReine[] = INCBIN_U32("graphics/pokemon/furfrou/la_reine/back.4bpp.lz"); + const u32 gMonBackPic_FurfrouLaReine[] = INCBIN_U32("graphics/pokemon/furfrou/la_reine/back.4bpp.smol"); const u16 gMonShinyPalette_FurfrouLaReine[] = INCBIN_U16("graphics/pokemon/furfrou/la_reine/shiny.gbapal"); const u8 gMonIcon_FurfrouLaReine[] = INCBIN_U8("graphics/pokemon/furfrou/la_reine/icon.4bpp"); - const u32 gMonFrontPic_FurfrouKabuki[] = INCBIN_U32("graphics/pokemon/furfrou/kabuki/anim_front.4bpp.lz"); + const u32 gMonFrontPic_FurfrouKabuki[] = INCBIN_U32("graphics/pokemon/furfrou/kabuki/anim_front.4bpp.smol"); const u16 gMonPalette_FurfrouKabuki[] = INCBIN_U16("graphics/pokemon/furfrou/kabuki/normal.gbapal"); - const u32 gMonBackPic_FurfrouKabuki[] = INCBIN_U32("graphics/pokemon/furfrou/kabuki/back.4bpp.lz"); + const u32 gMonBackPic_FurfrouKabuki[] = INCBIN_U32("graphics/pokemon/furfrou/kabuki/back.4bpp.smol"); const u16 gMonShinyPalette_FurfrouKabuki[] = INCBIN_U16("graphics/pokemon/furfrou/kabuki/shiny.gbapal"); const u8 gMonIcon_FurfrouKabuki[] = INCBIN_U8("graphics/pokemon/furfrou/kabuki/icon.4bpp"); - const u32 gMonFrontPic_FurfrouPharaoh[] = INCBIN_U32("graphics/pokemon/furfrou/pharaoh/anim_front.4bpp.lz"); + const u32 gMonFrontPic_FurfrouPharaoh[] = INCBIN_U32("graphics/pokemon/furfrou/pharaoh/anim_front.4bpp.smol"); const u16 gMonPalette_FurfrouPharaoh[] = INCBIN_U16("graphics/pokemon/furfrou/pharaoh/normal.gbapal"); - const u32 gMonBackPic_FurfrouPharaoh[] = INCBIN_U32("graphics/pokemon/furfrou/pharaoh/back.4bpp.lz"); + const u32 gMonBackPic_FurfrouPharaoh[] = INCBIN_U32("graphics/pokemon/furfrou/pharaoh/back.4bpp.smol"); const u16 gMonShinyPalette_FurfrouPharaoh[] = INCBIN_U16("graphics/pokemon/furfrou/pharaoh/shiny.gbapal"); const u8 gMonIcon_FurfrouPharaoh[] = INCBIN_U8("graphics/pokemon/furfrou/pharaoh/icon.4bpp"); @@ -19878,9 +19932,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FURFROU #if P_FAMILY_ESPURR - const u32 gMonFrontPic_Espurr[] = INCBIN_U32("graphics/pokemon/espurr/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Espurr[] = INCBIN_U32("graphics/pokemon/espurr/anim_front.4bpp.smol"); const u16 gMonPalette_Espurr[] = INCBIN_U16("graphics/pokemon/espurr/normal.gbapal"); - const u32 gMonBackPic_Espurr[] = INCBIN_U32("graphics/pokemon/espurr/back.4bpp.lz"); + const u32 gMonBackPic_Espurr[] = INCBIN_U32("graphics/pokemon/espurr/back.4bpp.smol"); const u16 gMonShinyPalette_Espurr[] = INCBIN_U16("graphics/pokemon/espurr/shiny.gbapal"); const u8 gMonIcon_Espurr[] = INCBIN_U8("graphics/pokemon/espurr/icon.4bpp"); #if P_FOOTPRINTS @@ -19894,9 +19948,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_MeowsticM[] = INCBIN_U32("graphics/pokemon/meowstic/anim_front.4bpp.lz"); + const u32 gMonFrontPic_MeowsticM[] = INCBIN_U32("graphics/pokemon/meowstic/anim_front.4bpp.smol"); const u16 gMonPalette_MeowsticM[] = INCBIN_U16("graphics/pokemon/meowstic/normal.gbapal"); - const u32 gMonBackPic_MeowsticM[] = INCBIN_U32("graphics/pokemon/meowstic/back.4bpp.lz"); + const u32 gMonBackPic_MeowsticM[] = INCBIN_U32("graphics/pokemon/meowstic/back.4bpp.smol"); const u16 gMonShinyPalette_MeowsticM[] = INCBIN_U16("graphics/pokemon/meowstic/shiny.gbapal"); const u8 gMonIcon_MeowsticM[] = INCBIN_U8("graphics/pokemon/meowstic/icon.4bpp"); #if P_FOOTPRINTS @@ -19910,9 +19964,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_MeowsticF[] = INCBIN_U32("graphics/pokemon/meowstic/f/anim_front.4bpp.lz"); + const u32 gMonFrontPic_MeowsticF[] = INCBIN_U32("graphics/pokemon/meowstic/f/anim_front.4bpp.smol"); const u16 gMonPalette_MeowsticF[] = INCBIN_U16("graphics/pokemon/meowstic/f/normal.gbapal"); - const u32 gMonBackPic_MeowsticF[] = INCBIN_U32("graphics/pokemon/meowstic/f/back.4bpp.lz"); + const u32 gMonBackPic_MeowsticF[] = INCBIN_U32("graphics/pokemon/meowstic/f/back.4bpp.smol"); const u16 gMonShinyPalette_MeowsticF[] = INCBIN_U16("graphics/pokemon/meowstic/f/shiny.gbapal"); const u8 gMonIcon_MeowsticF[] = INCBIN_U8("graphics/pokemon/meowstic/f/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -19925,9 +19979,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ESPURR #if P_FAMILY_HONEDGE - const u32 gMonFrontPic_Honedge[] = INCBIN_U32("graphics/pokemon/honedge/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Honedge[] = INCBIN_U32("graphics/pokemon/honedge/anim_front.4bpp.smol"); const u16 gMonPalette_Honedge[] = INCBIN_U16("graphics/pokemon/honedge/normal.gbapal"); - const u32 gMonBackPic_Honedge[] = INCBIN_U32("graphics/pokemon/honedge/back.4bpp.lz"); + const u32 gMonBackPic_Honedge[] = INCBIN_U32("graphics/pokemon/honedge/back.4bpp.smol"); const u16 gMonShinyPalette_Honedge[] = INCBIN_U16("graphics/pokemon/honedge/shiny.gbapal"); const u8 gMonIcon_Honedge[] = INCBIN_U8("graphics/pokemon/honedge/icon.4bpp"); #if P_FOOTPRINTS @@ -19941,9 +19995,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Doublade[] = INCBIN_U32("graphics/pokemon/doublade/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Doublade[] = INCBIN_U32("graphics/pokemon/doublade/anim_front.4bpp.smol"); const u16 gMonPalette_Doublade[] = INCBIN_U16("graphics/pokemon/doublade/normal.gbapal"); - const u32 gMonBackPic_Doublade[] = INCBIN_U32("graphics/pokemon/doublade/back.4bpp.lz"); + const u32 gMonBackPic_Doublade[] = INCBIN_U32("graphics/pokemon/doublade/back.4bpp.smol"); const u16 gMonShinyPalette_Doublade[] = INCBIN_U16("graphics/pokemon/doublade/shiny.gbapal"); const u8 gMonIcon_Doublade[] = INCBIN_U8("graphics/pokemon/doublade/icon.4bpp"); #if P_FOOTPRINTS @@ -19957,9 +20011,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_AegislashShield[] = INCBIN_U32("graphics/pokemon/aegislash/anim_front.4bpp.lz"); + const u32 gMonFrontPic_AegislashShield[] = INCBIN_U32("graphics/pokemon/aegislash/anim_front.4bpp.smol"); const u16 gMonPalette_AegislashShield[] = INCBIN_U16("graphics/pokemon/aegislash/normal.gbapal"); - const u32 gMonBackPic_AegislashShield[] = INCBIN_U32("graphics/pokemon/aegislash/back.4bpp.lz"); + const u32 gMonBackPic_AegislashShield[] = INCBIN_U32("graphics/pokemon/aegislash/back.4bpp.smol"); const u16 gMonShinyPalette_AegislashShield[] = INCBIN_U16("graphics/pokemon/aegislash/shiny.gbapal"); const u8 gMonIcon_AegislashShield[] = INCBIN_U8("graphics/pokemon/aegislash/icon.4bpp"); #if P_FOOTPRINTS @@ -19973,9 +20027,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_AegislashBlade[] = INCBIN_U32("graphics/pokemon/aegislash/blade/anim_front.4bpp.lz"); + const u32 gMonFrontPic_AegislashBlade[] = INCBIN_U32("graphics/pokemon/aegislash/blade/anim_front.4bpp.smol"); const u16 gMonPalette_AegislashBlade[] = INCBIN_U16("graphics/pokemon/aegislash/blade/normal.gbapal"); - const u32 gMonBackPic_AegislashBlade[] = INCBIN_U32("graphics/pokemon/aegislash/blade/back.4bpp.lz"); + const u32 gMonBackPic_AegislashBlade[] = INCBIN_U32("graphics/pokemon/aegislash/blade/back.4bpp.smol"); const u16 gMonShinyPalette_AegislashBlade[] = INCBIN_U16("graphics/pokemon/aegislash/blade/shiny.gbapal"); const u8 gMonIcon_AegislashBlade[] = INCBIN_U8("graphics/pokemon/aegislash/blade/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -19988,9 +20042,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_HONEDGE #if P_FAMILY_SPRITZEE - const u32 gMonFrontPic_Spritzee[] = INCBIN_U32("graphics/pokemon/spritzee/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Spritzee[] = INCBIN_U32("graphics/pokemon/spritzee/anim_front.4bpp.smol"); const u16 gMonPalette_Spritzee[] = INCBIN_U16("graphics/pokemon/spritzee/normal.gbapal"); - const u32 gMonBackPic_Spritzee[] = INCBIN_U32("graphics/pokemon/spritzee/back.4bpp.lz"); + const u32 gMonBackPic_Spritzee[] = INCBIN_U32("graphics/pokemon/spritzee/back.4bpp.smol"); const u16 gMonShinyPalette_Spritzee[] = INCBIN_U16("graphics/pokemon/spritzee/shiny.gbapal"); const u8 gMonIcon_Spritzee[] = INCBIN_U8("graphics/pokemon/spritzee/icon.4bpp"); #if P_FOOTPRINTS @@ -20004,9 +20058,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Aromatisse[] = INCBIN_U32("graphics/pokemon/aromatisse/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Aromatisse[] = INCBIN_U32("graphics/pokemon/aromatisse/anim_front.4bpp.smol"); const u16 gMonPalette_Aromatisse[] = INCBIN_U16("graphics/pokemon/aromatisse/normal.gbapal"); - const u32 gMonBackPic_Aromatisse[] = INCBIN_U32("graphics/pokemon/aromatisse/back.4bpp.lz"); + const u32 gMonBackPic_Aromatisse[] = INCBIN_U32("graphics/pokemon/aromatisse/back.4bpp.smol"); const u16 gMonShinyPalette_Aromatisse[] = INCBIN_U16("graphics/pokemon/aromatisse/shiny.gbapal"); const u8 gMonIcon_Aromatisse[] = INCBIN_U8("graphics/pokemon/aromatisse/icon.4bpp"); #if P_FOOTPRINTS @@ -20022,9 +20076,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SPRITZEE #if P_FAMILY_SWIRLIX - const u32 gMonFrontPic_Swirlix[] = INCBIN_U32("graphics/pokemon/swirlix/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Swirlix[] = INCBIN_U32("graphics/pokemon/swirlix/anim_front.4bpp.smol"); const u16 gMonPalette_Swirlix[] = INCBIN_U16("graphics/pokemon/swirlix/normal.gbapal"); - const u32 gMonBackPic_Swirlix[] = INCBIN_U32("graphics/pokemon/swirlix/back.4bpp.lz"); + const u32 gMonBackPic_Swirlix[] = INCBIN_U32("graphics/pokemon/swirlix/back.4bpp.smol"); const u16 gMonShinyPalette_Swirlix[] = INCBIN_U16("graphics/pokemon/swirlix/shiny.gbapal"); const u8 gMonIcon_Swirlix[] = INCBIN_U8("graphics/pokemon/swirlix/icon.4bpp"); #if P_FOOTPRINTS @@ -20038,9 +20092,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Slurpuff[] = INCBIN_U32("graphics/pokemon/slurpuff/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Slurpuff[] = INCBIN_U32("graphics/pokemon/slurpuff/anim_front.4bpp.smol"); const u16 gMonPalette_Slurpuff[] = INCBIN_U16("graphics/pokemon/slurpuff/normal.gbapal"); - const u32 gMonBackPic_Slurpuff[] = INCBIN_U32("graphics/pokemon/slurpuff/back.4bpp.lz"); + const u32 gMonBackPic_Slurpuff[] = INCBIN_U32("graphics/pokemon/slurpuff/back.4bpp.smol"); const u16 gMonShinyPalette_Slurpuff[] = INCBIN_U16("graphics/pokemon/slurpuff/shiny.gbapal"); const u8 gMonIcon_Slurpuff[] = INCBIN_U8("graphics/pokemon/slurpuff/icon.4bpp"); #if P_FOOTPRINTS @@ -20056,9 +20110,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SWIRLIX #if P_FAMILY_INKAY - const u32 gMonFrontPic_Inkay[] = INCBIN_U32("graphics/pokemon/inkay/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Inkay[] = INCBIN_U32("graphics/pokemon/inkay/anim_front.4bpp.smol"); const u16 gMonPalette_Inkay[] = INCBIN_U16("graphics/pokemon/inkay/normal.gbapal"); - const u32 gMonBackPic_Inkay[] = INCBIN_U32("graphics/pokemon/inkay/back.4bpp.lz"); + const u32 gMonBackPic_Inkay[] = INCBIN_U32("graphics/pokemon/inkay/back.4bpp.smol"); const u16 gMonShinyPalette_Inkay[] = INCBIN_U16("graphics/pokemon/inkay/shiny.gbapal"); const u8 gMonIcon_Inkay[] = INCBIN_U8("graphics/pokemon/inkay/icon.4bpp"); #if P_FOOTPRINTS @@ -20072,9 +20126,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Malamar[] = INCBIN_U32("graphics/pokemon/malamar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Malamar[] = INCBIN_U32("graphics/pokemon/malamar/anim_front.4bpp.smol"); const u16 gMonPalette_Malamar[] = INCBIN_U16("graphics/pokemon/malamar/normal.gbapal"); - const u32 gMonBackPic_Malamar[] = INCBIN_U32("graphics/pokemon/malamar/back.4bpp.lz"); + const u32 gMonBackPic_Malamar[] = INCBIN_U32("graphics/pokemon/malamar/back.4bpp.smol"); const u16 gMonShinyPalette_Malamar[] = INCBIN_U16("graphics/pokemon/malamar/shiny.gbapal"); const u8 gMonIcon_Malamar[] = INCBIN_U8("graphics/pokemon/malamar/icon.4bpp"); #if P_FOOTPRINTS @@ -20090,9 +20144,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_INKAY #if P_FAMILY_BINACLE - const u32 gMonFrontPic_Binacle[] = INCBIN_U32("graphics/pokemon/binacle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Binacle[] = INCBIN_U32("graphics/pokemon/binacle/anim_front.4bpp.smol"); const u16 gMonPalette_Binacle[] = INCBIN_U16("graphics/pokemon/binacle/normal.gbapal"); - const u32 gMonBackPic_Binacle[] = INCBIN_U32("graphics/pokemon/binacle/back.4bpp.lz"); + const u32 gMonBackPic_Binacle[] = INCBIN_U32("graphics/pokemon/binacle/back.4bpp.smol"); const u16 gMonShinyPalette_Binacle[] = INCBIN_U16("graphics/pokemon/binacle/shiny.gbapal"); const u8 gMonIcon_Binacle[] = INCBIN_U8("graphics/pokemon/binacle/icon.4bpp"); #if P_FOOTPRINTS @@ -20106,9 +20160,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Barbaracle[] = INCBIN_U32("graphics/pokemon/barbaracle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Barbaracle[] = INCBIN_U32("graphics/pokemon/barbaracle/anim_front.4bpp.smol"); const u16 gMonPalette_Barbaracle[] = INCBIN_U16("graphics/pokemon/barbaracle/normal.gbapal"); - const u32 gMonBackPic_Barbaracle[] = INCBIN_U32("graphics/pokemon/barbaracle/back.4bpp.lz"); + const u32 gMonBackPic_Barbaracle[] = INCBIN_U32("graphics/pokemon/barbaracle/back.4bpp.smol"); const u16 gMonShinyPalette_Barbaracle[] = INCBIN_U16("graphics/pokemon/barbaracle/shiny.gbapal"); const u8 gMonIcon_Barbaracle[] = INCBIN_U8("graphics/pokemon/barbaracle/icon.4bpp"); #if P_FOOTPRINTS @@ -20124,9 +20178,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BINACLE #if P_FAMILY_SKRELP - const u32 gMonFrontPic_Skrelp[] = INCBIN_U32("graphics/pokemon/skrelp/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Skrelp[] = INCBIN_U32("graphics/pokemon/skrelp/anim_front.4bpp.smol"); const u16 gMonPalette_Skrelp[] = INCBIN_U16("graphics/pokemon/skrelp/normal.gbapal"); - const u32 gMonBackPic_Skrelp[] = INCBIN_U32("graphics/pokemon/skrelp/back.4bpp.lz"); + const u32 gMonBackPic_Skrelp[] = INCBIN_U32("graphics/pokemon/skrelp/back.4bpp.smol"); const u16 gMonShinyPalette_Skrelp[] = INCBIN_U16("graphics/pokemon/skrelp/shiny.gbapal"); const u8 gMonIcon_Skrelp[] = INCBIN_U8("graphics/pokemon/skrelp/icon.4bpp"); #if P_FOOTPRINTS @@ -20140,9 +20194,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Dragalge[] = INCBIN_U32("graphics/pokemon/dragalge/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dragalge[] = INCBIN_U32("graphics/pokemon/dragalge/anim_front.4bpp.smol"); const u16 gMonPalette_Dragalge[] = INCBIN_U16("graphics/pokemon/dragalge/normal.gbapal"); - const u32 gMonBackPic_Dragalge[] = INCBIN_U32("graphics/pokemon/dragalge/back.4bpp.lz"); + const u32 gMonBackPic_Dragalge[] = INCBIN_U32("graphics/pokemon/dragalge/back.4bpp.smol"); const u16 gMonShinyPalette_Dragalge[] = INCBIN_U16("graphics/pokemon/dragalge/shiny.gbapal"); const u8 gMonIcon_Dragalge[] = INCBIN_U8("graphics/pokemon/dragalge/icon.4bpp"); #if P_FOOTPRINTS @@ -20158,9 +20212,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SKRELP #if P_FAMILY_CLAUNCHER - const u32 gMonFrontPic_Clauncher[] = INCBIN_U32("graphics/pokemon/clauncher/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Clauncher[] = INCBIN_U32("graphics/pokemon/clauncher/anim_front.4bpp.smol"); const u16 gMonPalette_Clauncher[] = INCBIN_U16("graphics/pokemon/clauncher/normal.gbapal"); - const u32 gMonBackPic_Clauncher[] = INCBIN_U32("graphics/pokemon/clauncher/back.4bpp.lz"); + const u32 gMonBackPic_Clauncher[] = INCBIN_U32("graphics/pokemon/clauncher/back.4bpp.smol"); const u16 gMonShinyPalette_Clauncher[] = INCBIN_U16("graphics/pokemon/clauncher/shiny.gbapal"); const u8 gMonIcon_Clauncher[] = INCBIN_U8("graphics/pokemon/clauncher/icon.4bpp"); #if P_FOOTPRINTS @@ -20174,9 +20228,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Clawitzer[] = INCBIN_U32("graphics/pokemon/clawitzer/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Clawitzer[] = INCBIN_U32("graphics/pokemon/clawitzer/anim_front.4bpp.smol"); const u16 gMonPalette_Clawitzer[] = INCBIN_U16("graphics/pokemon/clawitzer/normal.gbapal"); - const u32 gMonBackPic_Clawitzer[] = INCBIN_U32("graphics/pokemon/clawitzer/back.4bpp.lz"); + const u32 gMonBackPic_Clawitzer[] = INCBIN_U32("graphics/pokemon/clawitzer/back.4bpp.smol"); const u16 gMonShinyPalette_Clawitzer[] = INCBIN_U16("graphics/pokemon/clawitzer/shiny.gbapal"); const u8 gMonIcon_Clawitzer[] = INCBIN_U8("graphics/pokemon/clawitzer/icon.4bpp"); #if P_FOOTPRINTS @@ -20192,9 +20246,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CLAUNCHER #if P_FAMILY_HELIOPTILE - const u32 gMonFrontPic_Helioptile[] = INCBIN_U32("graphics/pokemon/helioptile/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Helioptile[] = INCBIN_U32("graphics/pokemon/helioptile/anim_front.4bpp.smol"); const u16 gMonPalette_Helioptile[] = INCBIN_U16("graphics/pokemon/helioptile/normal.gbapal"); - const u32 gMonBackPic_Helioptile[] = INCBIN_U32("graphics/pokemon/helioptile/back.4bpp.lz"); + const u32 gMonBackPic_Helioptile[] = INCBIN_U32("graphics/pokemon/helioptile/back.4bpp.smol"); const u16 gMonShinyPalette_Helioptile[] = INCBIN_U16("graphics/pokemon/helioptile/shiny.gbapal"); const u8 gMonIcon_Helioptile[] = INCBIN_U8("graphics/pokemon/helioptile/icon.4bpp"); #if P_FOOTPRINTS @@ -20208,9 +20262,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Heliolisk[] = INCBIN_U32("graphics/pokemon/heliolisk/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Heliolisk[] = INCBIN_U32("graphics/pokemon/heliolisk/anim_front.4bpp.smol"); const u16 gMonPalette_Heliolisk[] = INCBIN_U16("graphics/pokemon/heliolisk/normal.gbapal"); - const u32 gMonBackPic_Heliolisk[] = INCBIN_U32("graphics/pokemon/heliolisk/back.4bpp.lz"); + const u32 gMonBackPic_Heliolisk[] = INCBIN_U32("graphics/pokemon/heliolisk/back.4bpp.smol"); const u16 gMonShinyPalette_Heliolisk[] = INCBIN_U16("graphics/pokemon/heliolisk/shiny.gbapal"); const u8 gMonIcon_Heliolisk[] = INCBIN_U8("graphics/pokemon/heliolisk/icon.4bpp"); #if P_FOOTPRINTS @@ -20226,9 +20280,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_HELIOPTILE #if P_FAMILY_TYRUNT - const u32 gMonFrontPic_Tyrunt[] = INCBIN_U32("graphics/pokemon/tyrunt/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tyrunt[] = INCBIN_U32("graphics/pokemon/tyrunt/anim_front.4bpp.smol"); const u16 gMonPalette_Tyrunt[] = INCBIN_U16("graphics/pokemon/tyrunt/normal.gbapal"); - const u32 gMonBackPic_Tyrunt[] = INCBIN_U32("graphics/pokemon/tyrunt/back.4bpp.lz"); + const u32 gMonBackPic_Tyrunt[] = INCBIN_U32("graphics/pokemon/tyrunt/back.4bpp.smol"); const u16 gMonShinyPalette_Tyrunt[] = INCBIN_U16("graphics/pokemon/tyrunt/shiny.gbapal"); const u8 gMonIcon_Tyrunt[] = INCBIN_U8("graphics/pokemon/tyrunt/icon.4bpp"); #if P_FOOTPRINTS @@ -20242,9 +20296,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Tyrantrum[] = INCBIN_U32("graphics/pokemon/tyrantrum/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tyrantrum[] = INCBIN_U32("graphics/pokemon/tyrantrum/anim_front.4bpp.smol"); const u16 gMonPalette_Tyrantrum[] = INCBIN_U16("graphics/pokemon/tyrantrum/normal.gbapal"); - const u32 gMonBackPic_Tyrantrum[] = INCBIN_U32("graphics/pokemon/tyrantrum/back.4bpp.lz"); + const u32 gMonBackPic_Tyrantrum[] = INCBIN_U32("graphics/pokemon/tyrantrum/back.4bpp.smol"); const u16 gMonShinyPalette_Tyrantrum[] = INCBIN_U16("graphics/pokemon/tyrantrum/shiny.gbapal"); const u8 gMonIcon_Tyrantrum[] = INCBIN_U8("graphics/pokemon/tyrantrum/icon.4bpp"); #if P_FOOTPRINTS @@ -20260,9 +20314,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TYRUNT #if P_FAMILY_AMAURA - const u32 gMonFrontPic_Amaura[] = INCBIN_U32("graphics/pokemon/amaura/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Amaura[] = INCBIN_U32("graphics/pokemon/amaura/anim_front.4bpp.smol"); const u16 gMonPalette_Amaura[] = INCBIN_U16("graphics/pokemon/amaura/normal.gbapal"); - const u32 gMonBackPic_Amaura[] = INCBIN_U32("graphics/pokemon/amaura/back.4bpp.lz"); + const u32 gMonBackPic_Amaura[] = INCBIN_U32("graphics/pokemon/amaura/back.4bpp.smol"); const u16 gMonShinyPalette_Amaura[] = INCBIN_U16("graphics/pokemon/amaura/shiny.gbapal"); const u8 gMonIcon_Amaura[] = INCBIN_U8("graphics/pokemon/amaura/icon.4bpp"); #if P_FOOTPRINTS @@ -20276,9 +20330,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Aurorus[] = INCBIN_U32("graphics/pokemon/aurorus/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Aurorus[] = INCBIN_U32("graphics/pokemon/aurorus/anim_front.4bpp.smol"); const u16 gMonPalette_Aurorus[] = INCBIN_U16("graphics/pokemon/aurorus/normal.gbapal"); - const u32 gMonBackPic_Aurorus[] = INCBIN_U32("graphics/pokemon/aurorus/back.4bpp.lz"); + const u32 gMonBackPic_Aurorus[] = INCBIN_U32("graphics/pokemon/aurorus/back.4bpp.smol"); const u16 gMonShinyPalette_Aurorus[] = INCBIN_U16("graphics/pokemon/aurorus/shiny.gbapal"); const u8 gMonIcon_Aurorus[] = INCBIN_U8("graphics/pokemon/aurorus/icon.4bpp"); #if P_FOOTPRINTS @@ -20294,9 +20348,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_AMAURA #if P_FAMILY_HAWLUCHA - const u32 gMonFrontPic_Hawlucha[] = INCBIN_U32("graphics/pokemon/hawlucha/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Hawlucha[] = INCBIN_U32("graphics/pokemon/hawlucha/anim_front.4bpp.smol"); const u16 gMonPalette_Hawlucha[] = INCBIN_U16("graphics/pokemon/hawlucha/normal.gbapal"); - const u32 gMonBackPic_Hawlucha[] = INCBIN_U32("graphics/pokemon/hawlucha/back.4bpp.lz"); + const u32 gMonBackPic_Hawlucha[] = INCBIN_U32("graphics/pokemon/hawlucha/back.4bpp.smol"); const u16 gMonShinyPalette_Hawlucha[] = INCBIN_U16("graphics/pokemon/hawlucha/shiny.gbapal"); const u8 gMonIcon_Hawlucha[] = INCBIN_U8("graphics/pokemon/hawlucha/icon.4bpp"); #if P_FOOTPRINTS @@ -20312,9 +20366,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_HAWLUCHA #if P_FAMILY_DEDENNE - const u32 gMonFrontPic_Dedenne[] = INCBIN_U32("graphics/pokemon/dedenne/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dedenne[] = INCBIN_U32("graphics/pokemon/dedenne/anim_front.4bpp.smol"); const u16 gMonPalette_Dedenne[] = INCBIN_U16("graphics/pokemon/dedenne/normal.gbapal"); - const u32 gMonBackPic_Dedenne[] = INCBIN_U32("graphics/pokemon/dedenne/back.4bpp.lz"); + const u32 gMonBackPic_Dedenne[] = INCBIN_U32("graphics/pokemon/dedenne/back.4bpp.smol"); const u16 gMonShinyPalette_Dedenne[] = INCBIN_U16("graphics/pokemon/dedenne/shiny.gbapal"); const u8 gMonIcon_Dedenne[] = INCBIN_U8("graphics/pokemon/dedenne/icon.4bpp"); #if P_FOOTPRINTS @@ -20330,9 +20384,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DEDENNE #if P_FAMILY_CARBINK - const u32 gMonFrontPic_Carbink[] = INCBIN_U32("graphics/pokemon/carbink/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Carbink[] = INCBIN_U32("graphics/pokemon/carbink/anim_front.4bpp.smol"); const u16 gMonPalette_Carbink[] = INCBIN_U16("graphics/pokemon/carbink/normal.gbapal"); - const u32 gMonBackPic_Carbink[] = INCBIN_U32("graphics/pokemon/carbink/back.4bpp.lz"); + const u32 gMonBackPic_Carbink[] = INCBIN_U32("graphics/pokemon/carbink/back.4bpp.smol"); const u16 gMonShinyPalette_Carbink[] = INCBIN_U16("graphics/pokemon/carbink/shiny.gbapal"); const u8 gMonIcon_Carbink[] = INCBIN_U8("graphics/pokemon/carbink/icon.4bpp"); #if P_FOOTPRINTS @@ -20348,9 +20402,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CARBINK #if P_FAMILY_GOOMY - const u32 gMonFrontPic_Goomy[] = INCBIN_U32("graphics/pokemon/goomy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Goomy[] = INCBIN_U32("graphics/pokemon/goomy/anim_front.4bpp.smol"); const u16 gMonPalette_Goomy[] = INCBIN_U16("graphics/pokemon/goomy/normal.gbapal"); - const u32 gMonBackPic_Goomy[] = INCBIN_U32("graphics/pokemon/goomy/back.4bpp.lz"); + const u32 gMonBackPic_Goomy[] = INCBIN_U32("graphics/pokemon/goomy/back.4bpp.smol"); const u16 gMonShinyPalette_Goomy[] = INCBIN_U16("graphics/pokemon/goomy/shiny.gbapal"); const u8 gMonIcon_Goomy[] = INCBIN_U8("graphics/pokemon/goomy/icon.4bpp"); #if P_FOOTPRINTS @@ -20364,9 +20418,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Sliggoo[] = INCBIN_U32("graphics/pokemon/sliggoo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sliggoo[] = INCBIN_U32("graphics/pokemon/sliggoo/anim_front.4bpp.smol"); const u16 gMonPalette_Sliggoo[] = INCBIN_U16("graphics/pokemon/sliggoo/normal.gbapal"); - const u32 gMonBackPic_Sliggoo[] = INCBIN_U32("graphics/pokemon/sliggoo/back.4bpp.lz"); + const u32 gMonBackPic_Sliggoo[] = INCBIN_U32("graphics/pokemon/sliggoo/back.4bpp.smol"); const u16 gMonShinyPalette_Sliggoo[] = INCBIN_U16("graphics/pokemon/sliggoo/shiny.gbapal"); const u8 gMonIcon_Sliggoo[] = INCBIN_U8("graphics/pokemon/sliggoo/icon.4bpp"); #if P_FOOTPRINTS @@ -20381,9 +20435,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_SliggooHisui[] = INCBIN_U32("graphics/pokemon/sliggoo/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_SliggooHisui[] = INCBIN_U32("graphics/pokemon/sliggoo/hisui/front.4bpp.smol"); const u16 gMonPalette_SliggooHisui[] = INCBIN_U16("graphics/pokemon/sliggoo/hisui/normal.gbapal"); - const u32 gMonBackPic_SliggooHisui[] = INCBIN_U32("graphics/pokemon/sliggoo/hisui/back.4bpp.lz"); + const u32 gMonBackPic_SliggooHisui[] = INCBIN_U32("graphics/pokemon/sliggoo/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_SliggooHisui[] = INCBIN_U16("graphics/pokemon/sliggoo/hisui/shiny.gbapal"); const u8 gMonIcon_SliggooHisui[] = INCBIN_U8("graphics/pokemon/sliggoo/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -20395,9 +20449,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_HISUIAN_FORMS - const u32 gMonFrontPic_Goodra[] = INCBIN_U32("graphics/pokemon/goodra/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Goodra[] = INCBIN_U32("graphics/pokemon/goodra/anim_front.4bpp.smol"); const u16 gMonPalette_Goodra[] = INCBIN_U16("graphics/pokemon/goodra/normal.gbapal"); - const u32 gMonBackPic_Goodra[] = INCBIN_U32("graphics/pokemon/goodra/back.4bpp.lz"); + const u32 gMonBackPic_Goodra[] = INCBIN_U32("graphics/pokemon/goodra/back.4bpp.smol"); const u16 gMonShinyPalette_Goodra[] = INCBIN_U16("graphics/pokemon/goodra/shiny.gbapal"); const u8 gMonIcon_Goodra[] = INCBIN_U8("graphics/pokemon/goodra/icon.4bpp"); #if P_FOOTPRINTS @@ -20412,9 +20466,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_GoodraHisui[] = INCBIN_U32("graphics/pokemon/goodra/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_GoodraHisui[] = INCBIN_U32("graphics/pokemon/goodra/hisui/front.4bpp.smol"); const u16 gMonPalette_GoodraHisui[] = INCBIN_U16("graphics/pokemon/goodra/hisui/normal.gbapal"); - const u32 gMonBackPic_GoodraHisui[] = INCBIN_U32("graphics/pokemon/goodra/hisui/back.4bpp.lz"); + const u32 gMonBackPic_GoodraHisui[] = INCBIN_U32("graphics/pokemon/goodra/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_GoodraHisui[] = INCBIN_U16("graphics/pokemon/goodra/hisui/shiny.gbapal"); const u8 gMonIcon_GoodraHisui[] = INCBIN_U8("graphics/pokemon/goodra/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -20428,9 +20482,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GOOMY #if P_FAMILY_KLEFKI - const u32 gMonFrontPic_Klefki[] = INCBIN_U32("graphics/pokemon/klefki/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Klefki[] = INCBIN_U32("graphics/pokemon/klefki/anim_front.4bpp.smol"); const u16 gMonPalette_Klefki[] = INCBIN_U16("graphics/pokemon/klefki/normal.gbapal"); - const u32 gMonBackPic_Klefki[] = INCBIN_U32("graphics/pokemon/klefki/back.4bpp.lz"); + const u32 gMonBackPic_Klefki[] = INCBIN_U32("graphics/pokemon/klefki/back.4bpp.smol"); const u16 gMonShinyPalette_Klefki[] = INCBIN_U16("graphics/pokemon/klefki/shiny.gbapal"); const u8 gMonIcon_Klefki[] = INCBIN_U8("graphics/pokemon/klefki/icon.4bpp"); #if P_FOOTPRINTS @@ -20446,9 +20500,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_KLEFKI #if P_FAMILY_PHANTUMP - const u32 gMonFrontPic_Phantump[] = INCBIN_U32("graphics/pokemon/phantump/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Phantump[] = INCBIN_U32("graphics/pokemon/phantump/anim_front.4bpp.smol"); const u16 gMonPalette_Phantump[] = INCBIN_U16("graphics/pokemon/phantump/normal.gbapal"); - const u32 gMonBackPic_Phantump[] = INCBIN_U32("graphics/pokemon/phantump/back.4bpp.lz"); + const u32 gMonBackPic_Phantump[] = INCBIN_U32("graphics/pokemon/phantump/back.4bpp.smol"); const u16 gMonShinyPalette_Phantump[] = INCBIN_U16("graphics/pokemon/phantump/shiny.gbapal"); const u8 gMonIcon_Phantump[] = INCBIN_U8("graphics/pokemon/phantump/icon.4bpp"); #if P_FOOTPRINTS @@ -20462,9 +20516,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Trevenant[] = INCBIN_U32("graphics/pokemon/trevenant/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Trevenant[] = INCBIN_U32("graphics/pokemon/trevenant/anim_front.4bpp.smol"); const u16 gMonPalette_Trevenant[] = INCBIN_U16("graphics/pokemon/trevenant/normal.gbapal"); - const u32 gMonBackPic_Trevenant[] = INCBIN_U32("graphics/pokemon/trevenant/back.4bpp.lz"); + const u32 gMonBackPic_Trevenant[] = INCBIN_U32("graphics/pokemon/trevenant/back.4bpp.smol"); const u16 gMonShinyPalette_Trevenant[] = INCBIN_U16("graphics/pokemon/trevenant/shiny.gbapal"); const u8 gMonIcon_Trevenant[] = INCBIN_U8("graphics/pokemon/trevenant/icon.4bpp"); #if P_FOOTPRINTS @@ -20487,17 +20541,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u8 gMonFootprint_Pumpkaboo[] = INCBIN_U8("graphics/pokemon/pumpkaboo/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_PumpkabooAverage[] = INCBIN_U32("graphics/pokemon/pumpkaboo/anim_front.4bpp.lz"); - const u32 gMonBackPic_PumpkabooAverage[] = INCBIN_U32("graphics/pokemon/pumpkaboo/back.4bpp.lz"); + const u32 gMonFrontPic_PumpkabooAverage[] = INCBIN_U32("graphics/pokemon/pumpkaboo/anim_front.4bpp.smol"); + const u32 gMonBackPic_PumpkabooAverage[] = INCBIN_U32("graphics/pokemon/pumpkaboo/back.4bpp.smol"); - const u32 gMonFrontPic_PumpkabooSmall[] = INCBIN_U32("graphics/pokemon/pumpkaboo/small/anim_front.4bpp.lz"); - const u32 gMonBackPic_PumpkabooSmall[] = INCBIN_U32("graphics/pokemon/pumpkaboo/small/back.4bpp.lz"); + const u32 gMonFrontPic_PumpkabooSmall[] = INCBIN_U32("graphics/pokemon/pumpkaboo/small/anim_front.4bpp.smol"); + const u32 gMonBackPic_PumpkabooSmall[] = INCBIN_U32("graphics/pokemon/pumpkaboo/small/back.4bpp.smol"); - const u32 gMonFrontPic_PumpkabooLarge[] = INCBIN_U32("graphics/pokemon/pumpkaboo/large/anim_front.4bpp.lz"); - const u32 gMonBackPic_PumpkabooLarge[] = INCBIN_U32("graphics/pokemon/pumpkaboo/large/back.4bpp.lz"); + const u32 gMonFrontPic_PumpkabooLarge[] = INCBIN_U32("graphics/pokemon/pumpkaboo/large/anim_front.4bpp.smol"); + const u32 gMonBackPic_PumpkabooLarge[] = INCBIN_U32("graphics/pokemon/pumpkaboo/large/back.4bpp.smol"); - const u32 gMonFrontPic_PumpkabooSuper[] = INCBIN_U32("graphics/pokemon/pumpkaboo/super/anim_front.4bpp.lz"); - const u32 gMonBackPic_PumpkabooSuper[] = INCBIN_U32("graphics/pokemon/pumpkaboo/super/back.4bpp.lz"); + const u32 gMonFrontPic_PumpkabooSuper[] = INCBIN_U32("graphics/pokemon/pumpkaboo/super/anim_front.4bpp.smol"); + const u32 gMonBackPic_PumpkabooSuper[] = INCBIN_U32("graphics/pokemon/pumpkaboo/super/back.4bpp.smol"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE const u16 gOverworldPalette_Pumpkaboo[] = INCBIN_U16("graphics/pokemon/pumpkaboo/overworld_normal.gbapal"); @@ -20518,17 +20572,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u8 gMonFootprint_Gourgeist[] = INCBIN_U8("graphics/pokemon/gourgeist/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_GourgeistAverage[] = INCBIN_U32("graphics/pokemon/gourgeist/anim_front.4bpp.lz"); - const u32 gMonBackPic_GourgeistAverage[] = INCBIN_U32("graphics/pokemon/gourgeist/back.4bpp.lz"); + const u32 gMonFrontPic_GourgeistAverage[] = INCBIN_U32("graphics/pokemon/gourgeist/anim_front.4bpp.smol"); + const u32 gMonBackPic_GourgeistAverage[] = INCBIN_U32("graphics/pokemon/gourgeist/back.4bpp.smol"); - const u32 gMonFrontPic_GourgeistSmall[] = INCBIN_U32("graphics/pokemon/gourgeist/small/anim_front.4bpp.lz"); - const u32 gMonBackPic_GourgeistSmall[] = INCBIN_U32("graphics/pokemon/gourgeist/small/back.4bpp.lz"); + const u32 gMonFrontPic_GourgeistSmall[] = INCBIN_U32("graphics/pokemon/gourgeist/small/anim_front.4bpp.smol"); + const u32 gMonBackPic_GourgeistSmall[] = INCBIN_U32("graphics/pokemon/gourgeist/small/back.4bpp.smol"); - const u32 gMonFrontPic_GourgeistLarge[] = INCBIN_U32("graphics/pokemon/gourgeist/large/anim_front.4bpp.lz"); - const u32 gMonBackPic_GourgeistLarge[] = INCBIN_U32("graphics/pokemon/gourgeist/large/back.4bpp.lz"); + const u32 gMonFrontPic_GourgeistLarge[] = INCBIN_U32("graphics/pokemon/gourgeist/large/anim_front.4bpp.smol"); + const u32 gMonBackPic_GourgeistLarge[] = INCBIN_U32("graphics/pokemon/gourgeist/large/back.4bpp.smol"); - const u32 gMonFrontPic_GourgeistSuper[] = INCBIN_U32("graphics/pokemon/gourgeist/super/anim_front.4bpp.lz"); - const u32 gMonBackPic_GourgeistSuper[] = INCBIN_U32("graphics/pokemon/gourgeist/super/back.4bpp.lz"); + const u32 gMonFrontPic_GourgeistSuper[] = INCBIN_U32("graphics/pokemon/gourgeist/super/anim_front.4bpp.smol"); + const u32 gMonBackPic_GourgeistSuper[] = INCBIN_U32("graphics/pokemon/gourgeist/super/back.4bpp.smol"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE const u16 gOverworldPalette_Gourgeist[] = INCBIN_U16("graphics/pokemon/gourgeist/overworld_normal.gbapal"); @@ -20544,9 +20598,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PUMPKABOO #if P_FAMILY_BERGMITE - const u32 gMonFrontPic_Bergmite[] = INCBIN_U32("graphics/pokemon/bergmite/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bergmite[] = INCBIN_U32("graphics/pokemon/bergmite/anim_front.4bpp.smol"); const u16 gMonPalette_Bergmite[] = INCBIN_U16("graphics/pokemon/bergmite/normal.gbapal"); - const u32 gMonBackPic_Bergmite[] = INCBIN_U32("graphics/pokemon/bergmite/back.4bpp.lz"); + const u32 gMonBackPic_Bergmite[] = INCBIN_U32("graphics/pokemon/bergmite/back.4bpp.smol"); const u16 gMonShinyPalette_Bergmite[] = INCBIN_U16("graphics/pokemon/bergmite/shiny.gbapal"); const u8 gMonIcon_Bergmite[] = INCBIN_U8("graphics/pokemon/bergmite/icon.4bpp"); #if P_FOOTPRINTS @@ -20560,9 +20614,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Avalugg[] = INCBIN_U32("graphics/pokemon/avalugg/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Avalugg[] = INCBIN_U32("graphics/pokemon/avalugg/anim_front.4bpp.smol"); const u16 gMonPalette_Avalugg[] = INCBIN_U16("graphics/pokemon/avalugg/normal.gbapal"); - const u32 gMonBackPic_Avalugg[] = INCBIN_U32("graphics/pokemon/avalugg/back.4bpp.lz"); + const u32 gMonBackPic_Avalugg[] = INCBIN_U32("graphics/pokemon/avalugg/back.4bpp.smol"); const u16 gMonShinyPalette_Avalugg[] = INCBIN_U16("graphics/pokemon/avalugg/shiny.gbapal"); const u8 gMonIcon_Avalugg[] = INCBIN_U8("graphics/pokemon/avalugg/icon.4bpp"); #if P_FOOTPRINTS @@ -20577,9 +20631,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_AvaluggHisui[] = INCBIN_U32("graphics/pokemon/avalugg/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_AvaluggHisui[] = INCBIN_U32("graphics/pokemon/avalugg/hisui/front.4bpp.smol"); const u16 gMonPalette_AvaluggHisui[] = INCBIN_U16("graphics/pokemon/avalugg/hisui/normal.gbapal"); - const u32 gMonBackPic_AvaluggHisui[] = INCBIN_U32("graphics/pokemon/avalugg/hisui/back.4bpp.lz"); + const u32 gMonBackPic_AvaluggHisui[] = INCBIN_U32("graphics/pokemon/avalugg/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_AvaluggHisui[] = INCBIN_U16("graphics/pokemon/avalugg/hisui/shiny.gbapal"); const u8 gMonIcon_AvaluggHisui[] = INCBIN_U8("graphics/pokemon/avalugg/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -20593,9 +20647,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BERGMITE #if P_FAMILY_NOIBAT - const u32 gMonFrontPic_Noibat[] = INCBIN_U32("graphics/pokemon/noibat/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Noibat[] = INCBIN_U32("graphics/pokemon/noibat/anim_front.4bpp.smol"); const u16 gMonPalette_Noibat[] = INCBIN_U16("graphics/pokemon/noibat/normal.gbapal"); - const u32 gMonBackPic_Noibat[] = INCBIN_U32("graphics/pokemon/noibat/back.4bpp.lz"); + const u32 gMonBackPic_Noibat[] = INCBIN_U32("graphics/pokemon/noibat/back.4bpp.smol"); const u16 gMonShinyPalette_Noibat[] = INCBIN_U16("graphics/pokemon/noibat/shiny.gbapal"); const u8 gMonIcon_Noibat[] = INCBIN_U8("graphics/pokemon/noibat/icon.4bpp"); #if P_FOOTPRINTS @@ -20609,9 +20663,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Noivern[] = INCBIN_U32("graphics/pokemon/noivern/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Noivern[] = INCBIN_U32("graphics/pokemon/noivern/anim_front.4bpp.smol"); const u16 gMonPalette_Noivern[] = INCBIN_U16("graphics/pokemon/noivern/normal.gbapal"); - const u32 gMonBackPic_Noivern[] = INCBIN_U32("graphics/pokemon/noivern/back.4bpp.lz"); + const u32 gMonBackPic_Noivern[] = INCBIN_U32("graphics/pokemon/noivern/back.4bpp.smol"); const u16 gMonShinyPalette_Noivern[] = INCBIN_U16("graphics/pokemon/noivern/shiny.gbapal"); const u8 gMonIcon_Noivern[] = INCBIN_U8("graphics/pokemon/noivern/icon.4bpp"); #if P_FOOTPRINTS @@ -20627,9 +20681,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_NOIBAT #if P_FAMILY_XERNEAS - const u32 gMonFrontPic_XerneasNeutral[] = INCBIN_U32("graphics/pokemon/xerneas/anim_front.4bpp.lz"); + const u32 gMonFrontPic_XerneasNeutral[] = INCBIN_U32("graphics/pokemon/xerneas/anim_front.4bpp.smol"); const u16 gMonPalette_XerneasNeutral[] = INCBIN_U16("graphics/pokemon/xerneas/normal.gbapal"); - const u32 gMonBackPic_XerneasNeutral[] = INCBIN_U32("graphics/pokemon/xerneas/back.4bpp.lz"); + const u32 gMonBackPic_XerneasNeutral[] = INCBIN_U32("graphics/pokemon/xerneas/back.4bpp.smol"); const u16 gMonShinyPalette_XerneasNeutral[] = INCBIN_U16("graphics/pokemon/xerneas/shiny.gbapal"); const u8 gMonIcon_XerneasNeutral[] = INCBIN_U8("graphics/pokemon/xerneas/icon.4bpp"); #if P_FOOTPRINTS @@ -20643,9 +20697,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_XerneasActive[] = INCBIN_U32("graphics/pokemon/xerneas/active/anim_front.4bpp.lz"); + const u32 gMonFrontPic_XerneasActive[] = INCBIN_U32("graphics/pokemon/xerneas/active/anim_front.4bpp.smol"); const u16 gMonPalette_XerneasActive[] = INCBIN_U16("graphics/pokemon/xerneas/active/normal.gbapal"); - const u32 gMonBackPic_XerneasActive[] = INCBIN_U32("graphics/pokemon/xerneas/active/back.4bpp.lz"); + const u32 gMonBackPic_XerneasActive[] = INCBIN_U32("graphics/pokemon/xerneas/active/back.4bpp.smol"); const u16 gMonShinyPalette_XerneasActive[] = INCBIN_U16("graphics/pokemon/xerneas/active/shiny.gbapal"); const u8 gMonIcon_XerneasActive[] = INCBIN_U8("graphics/pokemon/xerneas/active/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -20658,9 +20712,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_XERNEAS #if P_FAMILY_YVELTAL - const u32 gMonFrontPic_Yveltal[] = INCBIN_U32("graphics/pokemon/yveltal/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Yveltal[] = INCBIN_U32("graphics/pokemon/yveltal/anim_front.4bpp.smol"); const u16 gMonPalette_Yveltal[] = INCBIN_U16("graphics/pokemon/yveltal/normal.gbapal"); - const u32 gMonBackPic_Yveltal[] = INCBIN_U32("graphics/pokemon/yveltal/back.4bpp.lz"); + const u32 gMonBackPic_Yveltal[] = INCBIN_U32("graphics/pokemon/yveltal/back.4bpp.smol"); const u16 gMonShinyPalette_Yveltal[] = INCBIN_U16("graphics/pokemon/yveltal/shiny.gbapal"); const u8 gMonIcon_Yveltal[] = INCBIN_U8("graphics/pokemon/yveltal/icon.4bpp"); #if P_FOOTPRINTS @@ -20676,9 +20730,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_YVELTAL #if P_FAMILY_ZYGARDE - const u32 gMonFrontPic_Zygarde50[] = INCBIN_U32("graphics/pokemon/zygarde/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Zygarde50[] = INCBIN_U32("graphics/pokemon/zygarde/anim_front.4bpp.smol"); const u16 gMonPalette_Zygarde50[] = INCBIN_U16("graphics/pokemon/zygarde/normal.gbapal"); - const u32 gMonBackPic_Zygarde50[] = INCBIN_U32("graphics/pokemon/zygarde/back.4bpp.lz"); + const u32 gMonBackPic_Zygarde50[] = INCBIN_U32("graphics/pokemon/zygarde/back.4bpp.smol"); const u16 gMonShinyPalette_Zygarde50[] = INCBIN_U16("graphics/pokemon/zygarde/shiny.gbapal"); const u8 gMonIcon_Zygarde50[] = INCBIN_U8("graphics/pokemon/zygarde/icon.4bpp"); #if P_FOOTPRINTS @@ -20693,9 +20747,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Zygarde10[] = INCBIN_U32("graphics/pokemon/zygarde/10_percent/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Zygarde10[] = INCBIN_U32("graphics/pokemon/zygarde/10_percent/anim_front.4bpp.smol"); const u16 gMonPalette_Zygarde10[] = INCBIN_U16("graphics/pokemon/zygarde/10_percent/normal.gbapal"); - const u32 gMonBackPic_Zygarde10[] = INCBIN_U32("graphics/pokemon/zygarde/10_percent/back.4bpp.lz"); + const u32 gMonBackPic_Zygarde10[] = INCBIN_U32("graphics/pokemon/zygarde/10_percent/back.4bpp.smol"); const u16 gMonShinyPalette_Zygarde10[] = INCBIN_U16("graphics/pokemon/zygarde/10_percent/shiny.gbapal"); const u8 gMonIcon_Zygarde10[] = INCBIN_U8("graphics/pokemon/zygarde/10_percent/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -20706,9 +20760,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_ZygardeComplete[] = INCBIN_U32("graphics/pokemon/zygarde/complete/anim_front.4bpp.lz"); + const u32 gMonFrontPic_ZygardeComplete[] = INCBIN_U32("graphics/pokemon/zygarde/complete/anim_front.4bpp.smol"); const u16 gMonPalette_ZygardeComplete[] = INCBIN_U16("graphics/pokemon/zygarde/complete/normal.gbapal"); - const u32 gMonBackPic_ZygardeComplete[] = INCBIN_U32("graphics/pokemon/zygarde/complete/back.4bpp.lz"); + const u32 gMonBackPic_ZygardeComplete[] = INCBIN_U32("graphics/pokemon/zygarde/complete/back.4bpp.smol"); const u16 gMonShinyPalette_ZygardeComplete[] = INCBIN_U16("graphics/pokemon/zygarde/complete/shiny.gbapal"); const u8 gMonIcon_ZygardeComplete[] = INCBIN_U8("graphics/pokemon/zygarde/complete/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -20721,9 +20775,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ZYGARDE #if P_FAMILY_DIANCIE - const u32 gMonFrontPic_Diancie[] = INCBIN_U32("graphics/pokemon/diancie/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Diancie[] = INCBIN_U32("graphics/pokemon/diancie/anim_front.4bpp.smol"); const u16 gMonPalette_Diancie[] = INCBIN_U16("graphics/pokemon/diancie/normal.gbapal"); - const u32 gMonBackPic_Diancie[] = INCBIN_U32("graphics/pokemon/diancie/back.4bpp.lz"); + const u32 gMonBackPic_Diancie[] = INCBIN_U32("graphics/pokemon/diancie/back.4bpp.smol"); const u16 gMonShinyPalette_Diancie[] = INCBIN_U16("graphics/pokemon/diancie/shiny.gbapal"); const u8 gMonIcon_Diancie[] = INCBIN_U8("graphics/pokemon/diancie/icon.4bpp"); #if P_FOOTPRINTS @@ -20738,9 +20792,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_DiancieMega[] = INCBIN_U32("graphics/pokemon/diancie/mega/front.4bpp.lz"); + const u32 gMonFrontPic_DiancieMega[] = INCBIN_U32("graphics/pokemon/diancie/mega/front.4bpp.smol"); const u16 gMonPalette_DiancieMega[] = INCBIN_U16("graphics/pokemon/diancie/mega/normal.gbapal"); - const u32 gMonBackPic_DiancieMega[] = INCBIN_U32("graphics/pokemon/diancie/mega/back.4bpp.lz"); + const u32 gMonBackPic_DiancieMega[] = INCBIN_U32("graphics/pokemon/diancie/mega/back.4bpp.smol"); const u16 gMonShinyPalette_DiancieMega[] = INCBIN_U16("graphics/pokemon/diancie/mega/shiny.gbapal"); const u8 gMonIcon_DiancieMega[] = INCBIN_U8("graphics/pokemon/diancie/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -20754,9 +20808,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DIANCIE #if P_FAMILY_HOOPA - const u32 gMonFrontPic_HoopaConfined[] = INCBIN_U32("graphics/pokemon/hoopa/anim_front.4bpp.lz"); + const u32 gMonFrontPic_HoopaConfined[] = INCBIN_U32("graphics/pokemon/hoopa/anim_front.4bpp.smol"); const u16 gMonPalette_HoopaConfined[] = INCBIN_U16("graphics/pokemon/hoopa/normal.gbapal"); - const u32 gMonBackPic_HoopaConfined[] = INCBIN_U32("graphics/pokemon/hoopa/back.4bpp.lz"); + const u32 gMonBackPic_HoopaConfined[] = INCBIN_U32("graphics/pokemon/hoopa/back.4bpp.smol"); const u16 gMonShinyPalette_HoopaConfined[] = INCBIN_U16("graphics/pokemon/hoopa/shiny.gbapal"); const u8 gMonIcon_HoopaConfined[] = INCBIN_U8("graphics/pokemon/hoopa/icon.4bpp"); #if P_FOOTPRINTS @@ -20770,9 +20824,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_HoopaUnbound[] = INCBIN_U32("graphics/pokemon/hoopa/unbound/anim_front.4bpp.lz"); + const u32 gMonFrontPic_HoopaUnbound[] = INCBIN_U32("graphics/pokemon/hoopa/unbound/anim_front.4bpp.smol"); const u16 gMonPalette_HoopaUnbound[] = INCBIN_U16("graphics/pokemon/hoopa/unbound/normal.gbapal"); - const u32 gMonBackPic_HoopaUnbound[] = INCBIN_U32("graphics/pokemon/hoopa/unbound/back.4bpp.lz"); + const u32 gMonBackPic_HoopaUnbound[] = INCBIN_U32("graphics/pokemon/hoopa/unbound/back.4bpp.smol"); const u16 gMonShinyPalette_HoopaUnbound[] = INCBIN_U16("graphics/pokemon/hoopa/unbound/shiny.gbapal"); const u8 gMonIcon_HoopaUnbound[] = INCBIN_U8("graphics/pokemon/hoopa/unbound/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -20785,9 +20839,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_HOOPA #if P_FAMILY_VOLCANION - const u32 gMonFrontPic_Volcanion[] = INCBIN_U32("graphics/pokemon/volcanion/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Volcanion[] = INCBIN_U32("graphics/pokemon/volcanion/anim_front.4bpp.smol"); const u16 gMonPalette_Volcanion[] = INCBIN_U16("graphics/pokemon/volcanion/normal.gbapal"); - const u32 gMonBackPic_Volcanion[] = INCBIN_U32("graphics/pokemon/volcanion/back.4bpp.lz"); + const u32 gMonBackPic_Volcanion[] = INCBIN_U32("graphics/pokemon/volcanion/back.4bpp.smol"); const u16 gMonShinyPalette_Volcanion[] = INCBIN_U16("graphics/pokemon/volcanion/shiny.gbapal"); const u8 gMonIcon_Volcanion[] = INCBIN_U8("graphics/pokemon/volcanion/icon.4bpp"); #if P_FOOTPRINTS @@ -20803,9 +20857,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_VOLCANION #if P_FAMILY_ROWLET - const u32 gMonFrontPic_Rowlet[] = INCBIN_U32("graphics/pokemon/rowlet/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rowlet[] = INCBIN_U32("graphics/pokemon/rowlet/anim_front.4bpp.smol"); const u16 gMonPalette_Rowlet[] = INCBIN_U16("graphics/pokemon/rowlet/normal.gbapal"); - const u32 gMonBackPic_Rowlet[] = INCBIN_U32("graphics/pokemon/rowlet/back.4bpp.lz"); + const u32 gMonBackPic_Rowlet[] = INCBIN_U32("graphics/pokemon/rowlet/back.4bpp.smol"); const u16 gMonShinyPalette_Rowlet[] = INCBIN_U16("graphics/pokemon/rowlet/shiny.gbapal"); const u8 gMonIcon_Rowlet[] = INCBIN_U8("graphics/pokemon/rowlet/icon.4bpp"); #if P_FOOTPRINTS @@ -20819,9 +20873,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Dartrix[] = INCBIN_U32("graphics/pokemon/dartrix/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dartrix[] = INCBIN_U32("graphics/pokemon/dartrix/anim_front.4bpp.smol"); const u16 gMonPalette_Dartrix[] = INCBIN_U16("graphics/pokemon/dartrix/normal.gbapal"); - const u32 gMonBackPic_Dartrix[] = INCBIN_U32("graphics/pokemon/dartrix/back.4bpp.lz"); + const u32 gMonBackPic_Dartrix[] = INCBIN_U32("graphics/pokemon/dartrix/back.4bpp.smol"); const u16 gMonShinyPalette_Dartrix[] = INCBIN_U16("graphics/pokemon/dartrix/shiny.gbapal"); const u8 gMonIcon_Dartrix[] = INCBIN_U8("graphics/pokemon/dartrix/icon.4bpp"); #if P_FOOTPRINTS @@ -20835,9 +20889,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Decidueye[] = INCBIN_U32("graphics/pokemon/decidueye/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Decidueye[] = INCBIN_U32("graphics/pokemon/decidueye/anim_front.4bpp.smol"); const u16 gMonPalette_Decidueye[] = INCBIN_U16("graphics/pokemon/decidueye/normal.gbapal"); - const u32 gMonBackPic_Decidueye[] = INCBIN_U32("graphics/pokemon/decidueye/back.4bpp.lz"); + const u32 gMonBackPic_Decidueye[] = INCBIN_U32("graphics/pokemon/decidueye/back.4bpp.smol"); const u16 gMonShinyPalette_Decidueye[] = INCBIN_U16("graphics/pokemon/decidueye/shiny.gbapal"); const u8 gMonIcon_Decidueye[] = INCBIN_U8("graphics/pokemon/decidueye/icon.4bpp"); #if P_FOOTPRINTS @@ -20852,9 +20906,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_DecidueyeHisui[] = INCBIN_U32("graphics/pokemon/decidueye/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_DecidueyeHisui[] = INCBIN_U32("graphics/pokemon/decidueye/hisui/front.4bpp.smol"); const u16 gMonPalette_DecidueyeHisui[] = INCBIN_U16("graphics/pokemon/decidueye/hisui/normal.gbapal"); - const u32 gMonBackPic_DecidueyeHisui[] = INCBIN_U32("graphics/pokemon/decidueye/hisui/back.4bpp.lz"); + const u32 gMonBackPic_DecidueyeHisui[] = INCBIN_U32("graphics/pokemon/decidueye/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_DecidueyeHisui[] = INCBIN_U16("graphics/pokemon/decidueye/hisui/shiny.gbapal"); const u8 gMonIcon_DecidueyeHisui[] = INCBIN_U8("graphics/pokemon/decidueye/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -20868,9 +20922,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ROWLET #if P_FAMILY_LITTEN - const u32 gMonFrontPic_Litten[] = INCBIN_U32("graphics/pokemon/litten/front.4bpp.lz"); + const u32 gMonFrontPic_Litten[] = INCBIN_U32("graphics/pokemon/litten/front.4bpp.smol"); const u16 gMonPalette_Litten[] = INCBIN_U16("graphics/pokemon/litten/normal.gbapal"); - const u32 gMonBackPic_Litten[] = INCBIN_U32("graphics/pokemon/litten/back.4bpp.lz"); + const u32 gMonBackPic_Litten[] = INCBIN_U32("graphics/pokemon/litten/back.4bpp.smol"); const u16 gMonShinyPalette_Litten[] = INCBIN_U16("graphics/pokemon/litten/shiny.gbapal"); const u8 gMonIcon_Litten[] = INCBIN_U8("graphics/pokemon/litten/icon.4bpp"); #if P_FOOTPRINTS @@ -20884,9 +20938,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Torracat[] = INCBIN_U32("graphics/pokemon/torracat/front.4bpp.lz"); + const u32 gMonFrontPic_Torracat[] = INCBIN_U32("graphics/pokemon/torracat/front.4bpp.smol"); const u16 gMonPalette_Torracat[] = INCBIN_U16("graphics/pokemon/torracat/normal.gbapal"); - const u32 gMonBackPic_Torracat[] = INCBIN_U32("graphics/pokemon/torracat/back.4bpp.lz"); + const u32 gMonBackPic_Torracat[] = INCBIN_U32("graphics/pokemon/torracat/back.4bpp.smol"); const u16 gMonShinyPalette_Torracat[] = INCBIN_U16("graphics/pokemon/torracat/shiny.gbapal"); const u8 gMonIcon_Torracat[] = INCBIN_U8("graphics/pokemon/torracat/icon.4bpp"); #if P_FOOTPRINTS @@ -20900,9 +20954,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Incineroar[] = INCBIN_U32("graphics/pokemon/incineroar/front.4bpp.lz"); + const u32 gMonFrontPic_Incineroar[] = INCBIN_U32("graphics/pokemon/incineroar/front.4bpp.smol"); const u16 gMonPalette_Incineroar[] = INCBIN_U16("graphics/pokemon/incineroar/normal.gbapal"); - const u32 gMonBackPic_Incineroar[] = INCBIN_U32("graphics/pokemon/incineroar/back.4bpp.lz"); + const u32 gMonBackPic_Incineroar[] = INCBIN_U32("graphics/pokemon/incineroar/back.4bpp.smol"); const u16 gMonShinyPalette_Incineroar[] = INCBIN_U16("graphics/pokemon/incineroar/shiny.gbapal"); const u8 gMonIcon_Incineroar[] = INCBIN_U8("graphics/pokemon/incineroar/icon.4bpp"); #if P_FOOTPRINTS @@ -20918,9 +20972,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_LITTEN #if P_FAMILY_POPPLIO - const u32 gMonFrontPic_Popplio[] = INCBIN_U32("graphics/pokemon/popplio/front.4bpp.lz"); + const u32 gMonFrontPic_Popplio[] = INCBIN_U32("graphics/pokemon/popplio/front.4bpp.smol"); const u16 gMonPalette_Popplio[] = INCBIN_U16("graphics/pokemon/popplio/normal.gbapal"); - const u32 gMonBackPic_Popplio[] = INCBIN_U32("graphics/pokemon/popplio/back.4bpp.lz"); + const u32 gMonBackPic_Popplio[] = INCBIN_U32("graphics/pokemon/popplio/back.4bpp.smol"); const u16 gMonShinyPalette_Popplio[] = INCBIN_U16("graphics/pokemon/popplio/shiny.gbapal"); const u8 gMonIcon_Popplio[] = INCBIN_U8("graphics/pokemon/popplio/icon.4bpp"); #if P_FOOTPRINTS @@ -20934,9 +20988,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Brionne[] = INCBIN_U32("graphics/pokemon/brionne/front.4bpp.lz"); + const u32 gMonFrontPic_Brionne[] = INCBIN_U32("graphics/pokemon/brionne/front.4bpp.smol"); const u16 gMonPalette_Brionne[] = INCBIN_U16("graphics/pokemon/brionne/normal.gbapal"); - const u32 gMonBackPic_Brionne[] = INCBIN_U32("graphics/pokemon/brionne/back.4bpp.lz"); + const u32 gMonBackPic_Brionne[] = INCBIN_U32("graphics/pokemon/brionne/back.4bpp.smol"); const u16 gMonShinyPalette_Brionne[] = INCBIN_U16("graphics/pokemon/brionne/shiny.gbapal"); const u8 gMonIcon_Brionne[] = INCBIN_U8("graphics/pokemon/brionne/icon.4bpp"); #if P_FOOTPRINTS @@ -20950,9 +21004,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Primarina[] = INCBIN_U32("graphics/pokemon/primarina/front.4bpp.lz"); + const u32 gMonFrontPic_Primarina[] = INCBIN_U32("graphics/pokemon/primarina/front.4bpp.smol"); const u16 gMonPalette_Primarina[] = INCBIN_U16("graphics/pokemon/primarina/normal.gbapal"); - const u32 gMonBackPic_Primarina[] = INCBIN_U32("graphics/pokemon/primarina/back.4bpp.lz"); + const u32 gMonBackPic_Primarina[] = INCBIN_U32("graphics/pokemon/primarina/back.4bpp.smol"); const u16 gMonShinyPalette_Primarina[] = INCBIN_U16("graphics/pokemon/primarina/shiny.gbapal"); const u8 gMonIcon_Primarina[] = INCBIN_U8("graphics/pokemon/primarina/icon.4bpp"); #if P_FOOTPRINTS @@ -20968,9 +21022,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_POPPLIO #if P_FAMILY_PIKIPEK - const u32 gMonFrontPic_Pikipek[] = INCBIN_U32("graphics/pokemon/pikipek/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pikipek[] = INCBIN_U32("graphics/pokemon/pikipek/anim_front.4bpp.smol"); const u16 gMonPalette_Pikipek[] = INCBIN_U16("graphics/pokemon/pikipek/normal.gbapal"); - const u32 gMonBackPic_Pikipek[] = INCBIN_U32("graphics/pokemon/pikipek/back.4bpp.lz"); + const u32 gMonBackPic_Pikipek[] = INCBIN_U32("graphics/pokemon/pikipek/back.4bpp.smol"); const u16 gMonShinyPalette_Pikipek[] = INCBIN_U16("graphics/pokemon/pikipek/shiny.gbapal"); const u8 gMonIcon_Pikipek[] = INCBIN_U8("graphics/pokemon/pikipek/icon.4bpp"); #if P_FOOTPRINTS @@ -20984,9 +21038,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Trumbeak[] = INCBIN_U32("graphics/pokemon/trumbeak/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Trumbeak[] = INCBIN_U32("graphics/pokemon/trumbeak/anim_front.4bpp.smol"); const u16 gMonPalette_Trumbeak[] = INCBIN_U16("graphics/pokemon/trumbeak/normal.gbapal"); - const u32 gMonBackPic_Trumbeak[] = INCBIN_U32("graphics/pokemon/trumbeak/back.4bpp.lz"); + const u32 gMonBackPic_Trumbeak[] = INCBIN_U32("graphics/pokemon/trumbeak/back.4bpp.smol"); const u16 gMonShinyPalette_Trumbeak[] = INCBIN_U16("graphics/pokemon/trumbeak/shiny.gbapal"); const u8 gMonIcon_Trumbeak[] = INCBIN_U8("graphics/pokemon/trumbeak/icon.4bpp"); #if P_FOOTPRINTS @@ -21000,9 +21054,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Toucannon[] = INCBIN_U32("graphics/pokemon/toucannon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Toucannon[] = INCBIN_U32("graphics/pokemon/toucannon/anim_front.4bpp.smol"); const u16 gMonPalette_Toucannon[] = INCBIN_U16("graphics/pokemon/toucannon/normal.gbapal"); - const u32 gMonBackPic_Toucannon[] = INCBIN_U32("graphics/pokemon/toucannon/back.4bpp.lz"); + const u32 gMonBackPic_Toucannon[] = INCBIN_U32("graphics/pokemon/toucannon/back.4bpp.smol"); const u16 gMonShinyPalette_Toucannon[] = INCBIN_U16("graphics/pokemon/toucannon/shiny.gbapal"); const u8 gMonIcon_Toucannon[] = INCBIN_U8("graphics/pokemon/toucannon/icon.4bpp"); #if P_FOOTPRINTS @@ -21018,9 +21072,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PIKIPEK #if P_FAMILY_YUNGOOS - const u32 gMonFrontPic_Yungoos[] = INCBIN_U32("graphics/pokemon/yungoos/front.4bpp.lz"); + const u32 gMonFrontPic_Yungoos[] = INCBIN_U32("graphics/pokemon/yungoos/front.4bpp.smol"); const u16 gMonPalette_Yungoos[] = INCBIN_U16("graphics/pokemon/yungoos/normal.gbapal"); - const u32 gMonBackPic_Yungoos[] = INCBIN_U32("graphics/pokemon/yungoos/back.4bpp.lz"); + const u32 gMonBackPic_Yungoos[] = INCBIN_U32("graphics/pokemon/yungoos/back.4bpp.smol"); const u16 gMonShinyPalette_Yungoos[] = INCBIN_U16("graphics/pokemon/yungoos/shiny.gbapal"); const u8 gMonIcon_Yungoos[] = INCBIN_U8("graphics/pokemon/yungoos/icon.4bpp"); #if P_FOOTPRINTS @@ -21034,9 +21088,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Gumshoos[] = INCBIN_U32("graphics/pokemon/gumshoos/front.4bpp.lz"); + const u32 gMonFrontPic_Gumshoos[] = INCBIN_U32("graphics/pokemon/gumshoos/front.4bpp.smol"); const u16 gMonPalette_Gumshoos[] = INCBIN_U16("graphics/pokemon/gumshoos/normal.gbapal"); - const u32 gMonBackPic_Gumshoos[] = INCBIN_U32("graphics/pokemon/gumshoos/back.4bpp.lz"); + const u32 gMonBackPic_Gumshoos[] = INCBIN_U32("graphics/pokemon/gumshoos/back.4bpp.smol"); const u16 gMonShinyPalette_Gumshoos[] = INCBIN_U16("graphics/pokemon/gumshoos/shiny.gbapal"); const u8 gMonIcon_Gumshoos[] = INCBIN_U8("graphics/pokemon/gumshoos/icon.4bpp"); #if P_FOOTPRINTS @@ -21052,9 +21106,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_YUNGOOS #if P_FAMILY_GRUBBIN - const u32 gMonFrontPic_Grubbin[] = INCBIN_U32("graphics/pokemon/grubbin/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Grubbin[] = INCBIN_U32("graphics/pokemon/grubbin/anim_front.4bpp.smol"); const u16 gMonPalette_Grubbin[] = INCBIN_U16("graphics/pokemon/grubbin/normal.gbapal"); - const u32 gMonBackPic_Grubbin[] = INCBIN_U32("graphics/pokemon/grubbin/back.4bpp.lz"); + const u32 gMonBackPic_Grubbin[] = INCBIN_U32("graphics/pokemon/grubbin/back.4bpp.smol"); const u16 gMonShinyPalette_Grubbin[] = INCBIN_U16("graphics/pokemon/grubbin/shiny.gbapal"); const u8 gMonIcon_Grubbin[] = INCBIN_U8("graphics/pokemon/grubbin/icon.4bpp"); #if P_FOOTPRINTS @@ -21068,9 +21122,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Charjabug[] = INCBIN_U32("graphics/pokemon/charjabug/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Charjabug[] = INCBIN_U32("graphics/pokemon/charjabug/anim_front.4bpp.smol"); const u16 gMonPalette_Charjabug[] = INCBIN_U16("graphics/pokemon/charjabug/normal.gbapal"); - const u32 gMonBackPic_Charjabug[] = INCBIN_U32("graphics/pokemon/charjabug/back.4bpp.lz"); + const u32 gMonBackPic_Charjabug[] = INCBIN_U32("graphics/pokemon/charjabug/back.4bpp.smol"); const u16 gMonShinyPalette_Charjabug[] = INCBIN_U16("graphics/pokemon/charjabug/shiny.gbapal"); const u8 gMonIcon_Charjabug[] = INCBIN_U8("graphics/pokemon/charjabug/icon.4bpp"); #if P_FOOTPRINTS @@ -21084,9 +21138,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Vikavolt[] = INCBIN_U32("graphics/pokemon/vikavolt/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Vikavolt[] = INCBIN_U32("graphics/pokemon/vikavolt/anim_front.4bpp.smol"); const u16 gMonPalette_Vikavolt[] = INCBIN_U16("graphics/pokemon/vikavolt/normal.gbapal"); - const u32 gMonBackPic_Vikavolt[] = INCBIN_U32("graphics/pokemon/vikavolt/back.4bpp.lz"); + const u32 gMonBackPic_Vikavolt[] = INCBIN_U32("graphics/pokemon/vikavolt/back.4bpp.smol"); const u16 gMonShinyPalette_Vikavolt[] = INCBIN_U16("graphics/pokemon/vikavolt/shiny.gbapal"); const u8 gMonIcon_Vikavolt[] = INCBIN_U8("graphics/pokemon/vikavolt/icon.4bpp"); #if P_FOOTPRINTS @@ -21102,9 +21156,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GRUBBIN #if P_FAMILY_CRABRAWLER - const u32 gMonFrontPic_Crabrawler[] = INCBIN_U32("graphics/pokemon/crabrawler/front.4bpp.lz"); + const u32 gMonFrontPic_Crabrawler[] = INCBIN_U32("graphics/pokemon/crabrawler/front.4bpp.smol"); const u16 gMonPalette_Crabrawler[] = INCBIN_U16("graphics/pokemon/crabrawler/normal.gbapal"); - const u32 gMonBackPic_Crabrawler[] = INCBIN_U32("graphics/pokemon/crabrawler/back.4bpp.lz"); + const u32 gMonBackPic_Crabrawler[] = INCBIN_U32("graphics/pokemon/crabrawler/back.4bpp.smol"); const u16 gMonShinyPalette_Crabrawler[] = INCBIN_U16("graphics/pokemon/crabrawler/shiny.gbapal"); const u8 gMonIcon_Crabrawler[] = INCBIN_U8("graphics/pokemon/crabrawler/icon.4bpp"); #if P_FOOTPRINTS @@ -21118,9 +21172,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Crabominable[] = INCBIN_U32("graphics/pokemon/crabominable/front.4bpp.lz"); + const u32 gMonFrontPic_Crabominable[] = INCBIN_U32("graphics/pokemon/crabominable/front.4bpp.smol"); const u16 gMonPalette_Crabominable[] = INCBIN_U16("graphics/pokemon/crabominable/normal.gbapal"); - const u32 gMonBackPic_Crabominable[] = INCBIN_U32("graphics/pokemon/crabominable/back.4bpp.lz"); + const u32 gMonBackPic_Crabominable[] = INCBIN_U32("graphics/pokemon/crabominable/back.4bpp.smol"); const u16 gMonShinyPalette_Crabominable[] = INCBIN_U16("graphics/pokemon/crabominable/shiny.gbapal"); const u8 gMonIcon_Crabominable[] = INCBIN_U8("graphics/pokemon/crabominable/icon.4bpp"); #if P_FOOTPRINTS @@ -21136,9 +21190,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CRABRAWLER #if P_FAMILY_ORICORIO - const u32 gMonFrontPic_OricorioBaile[] = INCBIN_U32("graphics/pokemon/oricorio/front.4bpp.lz"); + const u32 gMonFrontPic_OricorioBaile[] = INCBIN_U32("graphics/pokemon/oricorio/front.4bpp.smol"); const u16 gMonPalette_OricorioBaile[] = INCBIN_U16("graphics/pokemon/oricorio/normal.gbapal"); - const u32 gMonBackPic_OricorioBaile[] = INCBIN_U32("graphics/pokemon/oricorio/back.4bpp.lz"); + const u32 gMonBackPic_OricorioBaile[] = INCBIN_U32("graphics/pokemon/oricorio/back.4bpp.smol"); const u16 gMonShinyPalette_OricorioBaile[] = INCBIN_U16("graphics/pokemon/oricorio/shiny.gbapal"); const u8 gMonIcon_OricorioBaile[] = INCBIN_U8("graphics/pokemon/oricorio/icon.4bpp"); #if P_FOOTPRINTS @@ -21152,9 +21206,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_OricorioPomPom[] = INCBIN_U32("graphics/pokemon/oricorio/pom_pom/front.4bpp.lz"); + const u32 gMonFrontPic_OricorioPomPom[] = INCBIN_U32("graphics/pokemon/oricorio/pom_pom/front.4bpp.smol"); const u16 gMonPalette_OricorioPomPom[] = INCBIN_U16("graphics/pokemon/oricorio/pom_pom/normal.gbapal"); - const u32 gMonBackPic_OricorioPomPom[] = INCBIN_U32("graphics/pokemon/oricorio/pom_pom/back.4bpp.lz"); + const u32 gMonBackPic_OricorioPomPom[] = INCBIN_U32("graphics/pokemon/oricorio/pom_pom/back.4bpp.smol"); const u16 gMonShinyPalette_OricorioPomPom[] = INCBIN_U16("graphics/pokemon/oricorio/pom_pom/shiny.gbapal"); const u8 gMonIcon_OricorioPomPom[] = INCBIN_U8("graphics/pokemon/oricorio/pom_pom/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -21165,9 +21219,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_OricorioPau[] = INCBIN_U32("graphics/pokemon/oricorio/pau/front.4bpp.lz"); + const u32 gMonFrontPic_OricorioPau[] = INCBIN_U32("graphics/pokemon/oricorio/pau/front.4bpp.smol"); const u16 gMonPalette_OricorioPau[] = INCBIN_U16("graphics/pokemon/oricorio/pau/normal.gbapal"); - const u32 gMonBackPic_OricorioPau[] = INCBIN_U32("graphics/pokemon/oricorio/pau/back.4bpp.lz"); + const u32 gMonBackPic_OricorioPau[] = INCBIN_U32("graphics/pokemon/oricorio/pau/back.4bpp.smol"); const u16 gMonShinyPalette_OricorioPau[] = INCBIN_U16("graphics/pokemon/oricorio/pau/shiny.gbapal"); const u8 gMonIcon_OricorioPau[] = INCBIN_U8("graphics/pokemon/oricorio/pau/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -21178,9 +21232,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_OricorioSensu[] = INCBIN_U32("graphics/pokemon/oricorio/sensu/front.4bpp.lz"); + const u32 gMonFrontPic_OricorioSensu[] = INCBIN_U32("graphics/pokemon/oricorio/sensu/front.4bpp.smol"); const u16 gMonPalette_OricorioSensu[] = INCBIN_U16("graphics/pokemon/oricorio/sensu/normal.gbapal"); - const u32 gMonBackPic_OricorioSensu[] = INCBIN_U32("graphics/pokemon/oricorio/sensu/back.4bpp.lz"); + const u32 gMonBackPic_OricorioSensu[] = INCBIN_U32("graphics/pokemon/oricorio/sensu/back.4bpp.smol"); const u16 gMonShinyPalette_OricorioSensu[] = INCBIN_U16("graphics/pokemon/oricorio/sensu/shiny.gbapal"); const u8 gMonIcon_OricorioSensu[] = INCBIN_U8("graphics/pokemon/oricorio/sensu/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -21193,9 +21247,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ORICORIO #if P_FAMILY_CUTIEFLY - const u32 gMonFrontPic_Cutiefly[] = INCBIN_U32("graphics/pokemon/cutiefly/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cutiefly[] = INCBIN_U32("graphics/pokemon/cutiefly/anim_front.4bpp.smol"); const u16 gMonPalette_Cutiefly[] = INCBIN_U16("graphics/pokemon/cutiefly/normal.gbapal"); - const u32 gMonBackPic_Cutiefly[] = INCBIN_U32("graphics/pokemon/cutiefly/back.4bpp.lz"); + const u32 gMonBackPic_Cutiefly[] = INCBIN_U32("graphics/pokemon/cutiefly/back.4bpp.smol"); const u16 gMonShinyPalette_Cutiefly[] = INCBIN_U16("graphics/pokemon/cutiefly/shiny.gbapal"); const u8 gMonIcon_Cutiefly[] = INCBIN_U8("graphics/pokemon/cutiefly/icon.4bpp"); #if P_FOOTPRINTS @@ -21209,9 +21263,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Ribombee[] = INCBIN_U32("graphics/pokemon/ribombee/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ribombee[] = INCBIN_U32("graphics/pokemon/ribombee/anim_front.4bpp.smol"); const u16 gMonPalette_Ribombee[] = INCBIN_U16("graphics/pokemon/ribombee/normal.gbapal"); - const u32 gMonBackPic_Ribombee[] = INCBIN_U32("graphics/pokemon/ribombee/back.4bpp.lz"); + const u32 gMonBackPic_Ribombee[] = INCBIN_U32("graphics/pokemon/ribombee/back.4bpp.smol"); const u16 gMonShinyPalette_Ribombee[] = INCBIN_U16("graphics/pokemon/ribombee/shiny.gbapal"); const u8 gMonIcon_Ribombee[] = INCBIN_U8("graphics/pokemon/ribombee/icon.4bpp"); #if P_FOOTPRINTS @@ -21227,9 +21281,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CUTIEFLY #if P_FAMILY_ROCKRUFF - const u32 gMonFrontPic_Rockruff[] = INCBIN_U32("graphics/pokemon/rockruff/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rockruff[] = INCBIN_U32("graphics/pokemon/rockruff/anim_front.4bpp.smol"); const u16 gMonPalette_Rockruff[] = INCBIN_U16("graphics/pokemon/rockruff/normal.gbapal"); - const u32 gMonBackPic_Rockruff[] = INCBIN_U32("graphics/pokemon/rockruff/back.4bpp.lz"); + const u32 gMonBackPic_Rockruff[] = INCBIN_U32("graphics/pokemon/rockruff/back.4bpp.smol"); const u16 gMonShinyPalette_Rockruff[] = INCBIN_U16("graphics/pokemon/rockruff/shiny.gbapal"); const u8 gMonIcon_Rockruff[] = INCBIN_U8("graphics/pokemon/rockruff/icon.4bpp"); #if P_FOOTPRINTS @@ -21243,9 +21297,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_LycanrocMidday[] = INCBIN_U32("graphics/pokemon/lycanroc/anim_front.4bpp.lz"); + const u32 gMonFrontPic_LycanrocMidday[] = INCBIN_U32("graphics/pokemon/lycanroc/anim_front.4bpp.smol"); const u16 gMonPalette_LycanrocMidday[] = INCBIN_U16("graphics/pokemon/lycanroc/normal.gbapal"); - const u32 gMonBackPic_LycanrocMidday[] = INCBIN_U32("graphics/pokemon/lycanroc/back.4bpp.lz"); + const u32 gMonBackPic_LycanrocMidday[] = INCBIN_U32("graphics/pokemon/lycanroc/back.4bpp.smol"); const u16 gMonShinyPalette_LycanrocMidday[] = INCBIN_U16("graphics/pokemon/lycanroc/shiny.gbapal"); const u8 gMonIcon_LycanrocMidday[] = INCBIN_U8("graphics/pokemon/lycanroc/icon.4bpp"); #if P_FOOTPRINTS @@ -21259,9 +21313,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_LycanrocMidnight[] = INCBIN_U32("graphics/pokemon/lycanroc/midnight/anim_front.4bpp.lz"); + const u32 gMonFrontPic_LycanrocMidnight[] = INCBIN_U32("graphics/pokemon/lycanroc/midnight/anim_front.4bpp.smol"); const u16 gMonPalette_LycanrocMidnight[] = INCBIN_U16("graphics/pokemon/lycanroc/midnight/normal.gbapal"); - const u32 gMonBackPic_LycanrocMidnight[] = INCBIN_U32("graphics/pokemon/lycanroc/midnight/back.4bpp.lz"); + const u32 gMonBackPic_LycanrocMidnight[] = INCBIN_U32("graphics/pokemon/lycanroc/midnight/back.4bpp.smol"); const u16 gMonShinyPalette_LycanrocMidnight[] = INCBIN_U16("graphics/pokemon/lycanroc/midnight/shiny.gbapal"); const u8 gMonIcon_LycanrocMidnight[] = INCBIN_U8("graphics/pokemon/lycanroc/midnight/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -21272,9 +21326,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_LycanrocDusk[] = INCBIN_U32("graphics/pokemon/lycanroc/dusk/anim_front.4bpp.lz"); + const u32 gMonFrontPic_LycanrocDusk[] = INCBIN_U32("graphics/pokemon/lycanroc/dusk/anim_front.4bpp.smol"); const u16 gMonPalette_LycanrocDusk[] = INCBIN_U16("graphics/pokemon/lycanroc/dusk/normal.gbapal"); - const u32 gMonBackPic_LycanrocDusk[] = INCBIN_U32("graphics/pokemon/lycanroc/dusk/back.4bpp.lz"); + const u32 gMonBackPic_LycanrocDusk[] = INCBIN_U32("graphics/pokemon/lycanroc/dusk/back.4bpp.smol"); const u16 gMonShinyPalette_LycanrocDusk[] = INCBIN_U16("graphics/pokemon/lycanroc/dusk/shiny.gbapal"); const u8 gMonIcon_LycanrocDusk[] = INCBIN_U8("graphics/pokemon/lycanroc/dusk/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -21287,9 +21341,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ROCKRUFF #if P_FAMILY_WISHIWASHI - const u32 gMonFrontPic_WishiwashiSolo[] = INCBIN_U32("graphics/pokemon/wishiwashi/front.4bpp.lz"); + const u32 gMonFrontPic_WishiwashiSolo[] = INCBIN_U32("graphics/pokemon/wishiwashi/front.4bpp.smol"); const u16 gMonPalette_WishiwashiSolo[] = INCBIN_U16("graphics/pokemon/wishiwashi/normal.gbapal"); - const u32 gMonBackPic_WishiwashiSolo[] = INCBIN_U32("graphics/pokemon/wishiwashi/back.4bpp.lz"); + const u32 gMonBackPic_WishiwashiSolo[] = INCBIN_U32("graphics/pokemon/wishiwashi/back.4bpp.smol"); const u16 gMonShinyPalette_WishiwashiSolo[] = INCBIN_U16("graphics/pokemon/wishiwashi/shiny.gbapal"); const u8 gMonIcon_WishiwashiSolo[] = INCBIN_U8("graphics/pokemon/wishiwashi/icon.4bpp"); #if P_FOOTPRINTS @@ -21303,9 +21357,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_WishiwashiSchool[] = INCBIN_U32("graphics/pokemon/wishiwashi/school/front.4bpp.lz"); + const u32 gMonFrontPic_WishiwashiSchool[] = INCBIN_U32("graphics/pokemon/wishiwashi/school/front.4bpp.smol"); const u16 gMonPalette_WishiwashiSchool[] = INCBIN_U16("graphics/pokemon/wishiwashi/school/normal.gbapal"); - const u32 gMonBackPic_WishiwashiSchool[] = INCBIN_U32("graphics/pokemon/wishiwashi/school/back.4bpp.lz"); + const u32 gMonBackPic_WishiwashiSchool[] = INCBIN_U32("graphics/pokemon/wishiwashi/school/back.4bpp.smol"); const u16 gMonShinyPalette_WishiwashiSchool[] = INCBIN_U16("graphics/pokemon/wishiwashi/school/shiny.gbapal"); const u8 gMonIcon_WishiwashiSchool[] = INCBIN_U8("graphics/pokemon/wishiwashi/school/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -21318,9 +21372,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_WISHIWASHI #if P_FAMILY_MAREANIE - const u32 gMonFrontPic_Mareanie[] = INCBIN_U32("graphics/pokemon/mareanie/front.4bpp.lz"); + const u32 gMonFrontPic_Mareanie[] = INCBIN_U32("graphics/pokemon/mareanie/front.4bpp.smol"); const u16 gMonPalette_Mareanie[] = INCBIN_U16("graphics/pokemon/mareanie/normal.gbapal"); - const u32 gMonBackPic_Mareanie[] = INCBIN_U32("graphics/pokemon/mareanie/back.4bpp.lz"); + const u32 gMonBackPic_Mareanie[] = INCBIN_U32("graphics/pokemon/mareanie/back.4bpp.smol"); const u16 gMonShinyPalette_Mareanie[] = INCBIN_U16("graphics/pokemon/mareanie/shiny.gbapal"); const u8 gMonIcon_Mareanie[] = INCBIN_U8("graphics/pokemon/mareanie/icon.4bpp"); #if P_FOOTPRINTS @@ -21334,9 +21388,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Toxapex[] = INCBIN_U32("graphics/pokemon/toxapex/front.4bpp.lz"); + const u32 gMonFrontPic_Toxapex[] = INCBIN_U32("graphics/pokemon/toxapex/front.4bpp.smol"); const u16 gMonPalette_Toxapex[] = INCBIN_U16("graphics/pokemon/toxapex/normal.gbapal"); - const u32 gMonBackPic_Toxapex[] = INCBIN_U32("graphics/pokemon/toxapex/back.4bpp.lz"); + const u32 gMonBackPic_Toxapex[] = INCBIN_U32("graphics/pokemon/toxapex/back.4bpp.smol"); const u16 gMonShinyPalette_Toxapex[] = INCBIN_U16("graphics/pokemon/toxapex/shiny.gbapal"); const u8 gMonIcon_Toxapex[] = INCBIN_U8("graphics/pokemon/toxapex/icon.4bpp"); #if P_FOOTPRINTS @@ -21352,9 +21406,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MAREANIE #if P_FAMILY_MUDBRAY - const u32 gMonFrontPic_Mudbray[] = INCBIN_U32("graphics/pokemon/mudbray/front.4bpp.lz"); + const u32 gMonFrontPic_Mudbray[] = INCBIN_U32("graphics/pokemon/mudbray/front.4bpp.smol"); const u16 gMonPalette_Mudbray[] = INCBIN_U16("graphics/pokemon/mudbray/normal.gbapal"); - const u32 gMonBackPic_Mudbray[] = INCBIN_U32("graphics/pokemon/mudbray/back.4bpp.lz"); + const u32 gMonBackPic_Mudbray[] = INCBIN_U32("graphics/pokemon/mudbray/back.4bpp.smol"); const u16 gMonShinyPalette_Mudbray[] = INCBIN_U16("graphics/pokemon/mudbray/shiny.gbapal"); const u8 gMonIcon_Mudbray[] = INCBIN_U8("graphics/pokemon/mudbray/icon.4bpp"); #if P_FOOTPRINTS @@ -21368,9 +21422,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Mudsdale[] = INCBIN_U32("graphics/pokemon/mudsdale/front.4bpp.lz"); + const u32 gMonFrontPic_Mudsdale[] = INCBIN_U32("graphics/pokemon/mudsdale/front.4bpp.smol"); const u16 gMonPalette_Mudsdale[] = INCBIN_U16("graphics/pokemon/mudsdale/normal.gbapal"); - const u32 gMonBackPic_Mudsdale[] = INCBIN_U32("graphics/pokemon/mudsdale/back.4bpp.lz"); + const u32 gMonBackPic_Mudsdale[] = INCBIN_U32("graphics/pokemon/mudsdale/back.4bpp.smol"); const u16 gMonShinyPalette_Mudsdale[] = INCBIN_U16("graphics/pokemon/mudsdale/shiny.gbapal"); const u8 gMonIcon_Mudsdale[] = INCBIN_U8("graphics/pokemon/mudsdale/icon.4bpp"); #if P_FOOTPRINTS @@ -21386,9 +21440,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MUDBRAY #if P_FAMILY_DEWPIDER - const u32 gMonFrontPic_Dewpider[] = INCBIN_U32("graphics/pokemon/dewpider/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dewpider[] = INCBIN_U32("graphics/pokemon/dewpider/anim_front.4bpp.smol"); const u16 gMonPalette_Dewpider[] = INCBIN_U16("graphics/pokemon/dewpider/normal.gbapal"); - const u32 gMonBackPic_Dewpider[] = INCBIN_U32("graphics/pokemon/dewpider/back.4bpp.lz"); + const u32 gMonBackPic_Dewpider[] = INCBIN_U32("graphics/pokemon/dewpider/back.4bpp.smol"); const u16 gMonShinyPalette_Dewpider[] = INCBIN_U16("graphics/pokemon/dewpider/shiny.gbapal"); const u8 gMonIcon_Dewpider[] = INCBIN_U8("graphics/pokemon/dewpider/icon.4bpp"); #if P_FOOTPRINTS @@ -21402,9 +21456,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Araquanid[] = INCBIN_U32("graphics/pokemon/araquanid/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Araquanid[] = INCBIN_U32("graphics/pokemon/araquanid/anim_front.4bpp.smol"); const u16 gMonPalette_Araquanid[] = INCBIN_U16("graphics/pokemon/araquanid/normal.gbapal"); - const u32 gMonBackPic_Araquanid[] = INCBIN_U32("graphics/pokemon/araquanid/back.4bpp.lz"); + const u32 gMonBackPic_Araquanid[] = INCBIN_U32("graphics/pokemon/araquanid/back.4bpp.smol"); const u16 gMonShinyPalette_Araquanid[] = INCBIN_U16("graphics/pokemon/araquanid/shiny.gbapal"); const u8 gMonIcon_Araquanid[] = INCBIN_U8("graphics/pokemon/araquanid/icon.4bpp"); #if P_FOOTPRINTS @@ -21420,9 +21474,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DEWPIDER #if P_FAMILY_FOMANTIS - const u32 gMonFrontPic_Fomantis[] = INCBIN_U32("graphics/pokemon/fomantis/front.4bpp.lz"); + const u32 gMonFrontPic_Fomantis[] = INCBIN_U32("graphics/pokemon/fomantis/front.4bpp.smol"); const u16 gMonPalette_Fomantis[] = INCBIN_U16("graphics/pokemon/fomantis/normal.gbapal"); - const u32 gMonBackPic_Fomantis[] = INCBIN_U32("graphics/pokemon/fomantis/back.4bpp.lz"); + const u32 gMonBackPic_Fomantis[] = INCBIN_U32("graphics/pokemon/fomantis/back.4bpp.smol"); const u16 gMonShinyPalette_Fomantis[] = INCBIN_U16("graphics/pokemon/fomantis/shiny.gbapal"); const u8 gMonIcon_Fomantis[] = INCBIN_U8("graphics/pokemon/fomantis/icon.4bpp"); #if P_FOOTPRINTS @@ -21436,9 +21490,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Lurantis[] = INCBIN_U32("graphics/pokemon/lurantis/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lurantis[] = INCBIN_U32("graphics/pokemon/lurantis/anim_front.4bpp.smol"); const u16 gMonPalette_Lurantis[] = INCBIN_U16("graphics/pokemon/lurantis/normal.gbapal"); - const u32 gMonBackPic_Lurantis[] = INCBIN_U32("graphics/pokemon/lurantis/back.4bpp.lz"); + const u32 gMonBackPic_Lurantis[] = INCBIN_U32("graphics/pokemon/lurantis/back.4bpp.smol"); const u16 gMonShinyPalette_Lurantis[] = INCBIN_U16("graphics/pokemon/lurantis/shiny.gbapal"); const u8 gMonIcon_Lurantis[] = INCBIN_U8("graphics/pokemon/lurantis/icon.4bpp"); #if P_FOOTPRINTS @@ -21454,9 +21508,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FOMANTIS #if P_FAMILY_MORELULL - const u32 gMonFrontPic_Morelull[] = INCBIN_U32("graphics/pokemon/morelull/front.4bpp.lz"); + const u32 gMonFrontPic_Morelull[] = INCBIN_U32("graphics/pokemon/morelull/front.4bpp.smol"); const u16 gMonPalette_Morelull[] = INCBIN_U16("graphics/pokemon/morelull/normal.gbapal"); - const u32 gMonBackPic_Morelull[] = INCBIN_U32("graphics/pokemon/morelull/back.4bpp.lz"); + const u32 gMonBackPic_Morelull[] = INCBIN_U32("graphics/pokemon/morelull/back.4bpp.smol"); const u16 gMonShinyPalette_Morelull[] = INCBIN_U16("graphics/pokemon/morelull/shiny.gbapal"); const u8 gMonIcon_Morelull[] = INCBIN_U8("graphics/pokemon/morelull/icon.4bpp"); #if P_FOOTPRINTS @@ -21470,9 +21524,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Shiinotic[] = INCBIN_U32("graphics/pokemon/shiinotic/front.4bpp.lz"); + const u32 gMonFrontPic_Shiinotic[] = INCBIN_U32("graphics/pokemon/shiinotic/front.4bpp.smol"); const u16 gMonPalette_Shiinotic[] = INCBIN_U16("graphics/pokemon/shiinotic/normal.gbapal"); - const u32 gMonBackPic_Shiinotic[] = INCBIN_U32("graphics/pokemon/shiinotic/back.4bpp.lz"); + const u32 gMonBackPic_Shiinotic[] = INCBIN_U32("graphics/pokemon/shiinotic/back.4bpp.smol"); const u16 gMonShinyPalette_Shiinotic[] = INCBIN_U16("graphics/pokemon/shiinotic/shiny.gbapal"); const u8 gMonIcon_Shiinotic[] = INCBIN_U8("graphics/pokemon/shiinotic/icon.4bpp"); #if P_FOOTPRINTS @@ -21488,9 +21542,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MORELULL #if P_FAMILY_SALANDIT - const u32 gMonFrontPic_Salandit[] = INCBIN_U32("graphics/pokemon/salandit/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Salandit[] = INCBIN_U32("graphics/pokemon/salandit/anim_front.4bpp.smol"); const u16 gMonPalette_Salandit[] = INCBIN_U16("graphics/pokemon/salandit/normal.gbapal"); - const u32 gMonBackPic_Salandit[] = INCBIN_U32("graphics/pokemon/salandit/back.4bpp.lz"); + const u32 gMonBackPic_Salandit[] = INCBIN_U32("graphics/pokemon/salandit/back.4bpp.smol"); const u16 gMonShinyPalette_Salandit[] = INCBIN_U16("graphics/pokemon/salandit/shiny.gbapal"); const u8 gMonIcon_Salandit[] = INCBIN_U8("graphics/pokemon/salandit/icon.4bpp"); #if P_FOOTPRINTS @@ -21504,9 +21558,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Salazzle[] = INCBIN_U32("graphics/pokemon/salazzle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Salazzle[] = INCBIN_U32("graphics/pokemon/salazzle/anim_front.4bpp.smol"); const u16 gMonPalette_Salazzle[] = INCBIN_U16("graphics/pokemon/salazzle/normal.gbapal"); - const u32 gMonBackPic_Salazzle[] = INCBIN_U32("graphics/pokemon/salazzle/back.4bpp.lz"); + const u32 gMonBackPic_Salazzle[] = INCBIN_U32("graphics/pokemon/salazzle/back.4bpp.smol"); const u16 gMonShinyPalette_Salazzle[] = INCBIN_U16("graphics/pokemon/salazzle/shiny.gbapal"); const u8 gMonIcon_Salazzle[] = INCBIN_U8("graphics/pokemon/salazzle/icon.4bpp"); #if P_FOOTPRINTS @@ -21522,9 +21576,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SALANDIT #if P_FAMILY_STUFFUL - const u32 gMonFrontPic_Stufful[] = INCBIN_U32("graphics/pokemon/stufful/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Stufful[] = INCBIN_U32("graphics/pokemon/stufful/anim_front.4bpp.smol"); const u16 gMonPalette_Stufful[] = INCBIN_U16("graphics/pokemon/stufful/normal.gbapal"); - const u32 gMonBackPic_Stufful[] = INCBIN_U32("graphics/pokemon/stufful/back.4bpp.lz"); + const u32 gMonBackPic_Stufful[] = INCBIN_U32("graphics/pokemon/stufful/back.4bpp.smol"); const u16 gMonShinyPalette_Stufful[] = INCBIN_U16("graphics/pokemon/stufful/shiny.gbapal"); const u8 gMonIcon_Stufful[] = INCBIN_U8("graphics/pokemon/stufful/icon.4bpp"); #if P_FOOTPRINTS @@ -21538,9 +21592,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Bewear[] = INCBIN_U32("graphics/pokemon/bewear/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bewear[] = INCBIN_U32("graphics/pokemon/bewear/anim_front.4bpp.smol"); const u16 gMonPalette_Bewear[] = INCBIN_U16("graphics/pokemon/bewear/normal.gbapal"); - const u32 gMonBackPic_Bewear[] = INCBIN_U32("graphics/pokemon/bewear/back.4bpp.lz"); + const u32 gMonBackPic_Bewear[] = INCBIN_U32("graphics/pokemon/bewear/back.4bpp.smol"); const u16 gMonShinyPalette_Bewear[] = INCBIN_U16("graphics/pokemon/bewear/shiny.gbapal"); const u8 gMonIcon_Bewear[] = INCBIN_U8("graphics/pokemon/bewear/icon.4bpp"); #if P_FOOTPRINTS @@ -21556,9 +21610,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_STUFFUL #if P_FAMILY_BOUNSWEET - const u32 gMonFrontPic_Bounsweet[] = INCBIN_U32("graphics/pokemon/bounsweet/front.4bpp.lz"); + const u32 gMonFrontPic_Bounsweet[] = INCBIN_U32("graphics/pokemon/bounsweet/front.4bpp.smol"); const u16 gMonPalette_Bounsweet[] = INCBIN_U16("graphics/pokemon/bounsweet/normal.gbapal"); - const u32 gMonBackPic_Bounsweet[] = INCBIN_U32("graphics/pokemon/bounsweet/back.4bpp.lz"); + const u32 gMonBackPic_Bounsweet[] = INCBIN_U32("graphics/pokemon/bounsweet/back.4bpp.smol"); const u16 gMonShinyPalette_Bounsweet[] = INCBIN_U16("graphics/pokemon/bounsweet/shiny.gbapal"); const u8 gMonIcon_Bounsweet[] = INCBIN_U8("graphics/pokemon/bounsweet/icon.4bpp"); #if P_FOOTPRINTS @@ -21572,9 +21626,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Steenee[] = INCBIN_U32("graphics/pokemon/steenee/front.4bpp.lz"); + const u32 gMonFrontPic_Steenee[] = INCBIN_U32("graphics/pokemon/steenee/front.4bpp.smol"); const u16 gMonPalette_Steenee[] = INCBIN_U16("graphics/pokemon/steenee/normal.gbapal"); - const u32 gMonBackPic_Steenee[] = INCBIN_U32("graphics/pokemon/steenee/back.4bpp.lz"); + const u32 gMonBackPic_Steenee[] = INCBIN_U32("graphics/pokemon/steenee/back.4bpp.smol"); const u16 gMonShinyPalette_Steenee[] = INCBIN_U16("graphics/pokemon/steenee/shiny.gbapal"); const u8 gMonIcon_Steenee[] = INCBIN_U8("graphics/pokemon/steenee/icon.4bpp"); #if P_FOOTPRINTS @@ -21588,9 +21642,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Tsareena[] = INCBIN_U32("graphics/pokemon/tsareena/front.4bpp.lz"); + const u32 gMonFrontPic_Tsareena[] = INCBIN_U32("graphics/pokemon/tsareena/front.4bpp.smol"); const u16 gMonPalette_Tsareena[] = INCBIN_U16("graphics/pokemon/tsareena/normal.gbapal"); - const u32 gMonBackPic_Tsareena[] = INCBIN_U32("graphics/pokemon/tsareena/back.4bpp.lz"); + const u32 gMonBackPic_Tsareena[] = INCBIN_U32("graphics/pokemon/tsareena/back.4bpp.smol"); const u16 gMonShinyPalette_Tsareena[] = INCBIN_U16("graphics/pokemon/tsareena/shiny.gbapal"); const u8 gMonIcon_Tsareena[] = INCBIN_U8("graphics/pokemon/tsareena/icon.4bpp"); #if P_FOOTPRINTS @@ -21606,9 +21660,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BOUNSWEET #if P_FAMILY_COMFEY - const u32 gMonFrontPic_Comfey[] = INCBIN_U32("graphics/pokemon/comfey/front.4bpp.lz"); + const u32 gMonFrontPic_Comfey[] = INCBIN_U32("graphics/pokemon/comfey/front.4bpp.smol"); const u16 gMonPalette_Comfey[] = INCBIN_U16("graphics/pokemon/comfey/normal.gbapal"); - const u32 gMonBackPic_Comfey[] = INCBIN_U32("graphics/pokemon/comfey/back.4bpp.lz"); + const u32 gMonBackPic_Comfey[] = INCBIN_U32("graphics/pokemon/comfey/back.4bpp.smol"); const u16 gMonShinyPalette_Comfey[] = INCBIN_U16("graphics/pokemon/comfey/shiny.gbapal"); const u8 gMonIcon_Comfey[] = INCBIN_U8("graphics/pokemon/comfey/icon.4bpp"); #if P_FOOTPRINTS @@ -21624,9 +21678,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_COMFEY #if P_FAMILY_ORANGURU - const u32 gMonFrontPic_Oranguru[] = INCBIN_U32("graphics/pokemon/oranguru/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Oranguru[] = INCBIN_U32("graphics/pokemon/oranguru/anim_front.4bpp.smol"); const u16 gMonPalette_Oranguru[] = INCBIN_U16("graphics/pokemon/oranguru/normal.gbapal"); - const u32 gMonBackPic_Oranguru[] = INCBIN_U32("graphics/pokemon/oranguru/back.4bpp.lz"); + const u32 gMonBackPic_Oranguru[] = INCBIN_U32("graphics/pokemon/oranguru/back.4bpp.smol"); const u16 gMonShinyPalette_Oranguru[] = INCBIN_U16("graphics/pokemon/oranguru/shiny.gbapal"); const u8 gMonIcon_Oranguru[] = INCBIN_U8("graphics/pokemon/oranguru/icon.4bpp"); #if P_FOOTPRINTS @@ -21642,9 +21696,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ORANGURU #if P_FAMILY_PASSIMIAN - const u32 gMonFrontPic_Passimian[] = INCBIN_U32("graphics/pokemon/passimian/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Passimian[] = INCBIN_U32("graphics/pokemon/passimian/anim_front.4bpp.smol"); const u16 gMonPalette_Passimian[] = INCBIN_U16("graphics/pokemon/passimian/normal.gbapal"); - const u32 gMonBackPic_Passimian[] = INCBIN_U32("graphics/pokemon/passimian/back.4bpp.lz"); + const u32 gMonBackPic_Passimian[] = INCBIN_U32("graphics/pokemon/passimian/back.4bpp.smol"); const u16 gMonShinyPalette_Passimian[] = INCBIN_U16("graphics/pokemon/passimian/shiny.gbapal"); const u8 gMonIcon_Passimian[] = INCBIN_U8("graphics/pokemon/passimian/icon.4bpp"); #if P_FOOTPRINTS @@ -21660,9 +21714,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PASSIMIAN #if P_FAMILY_WIMPOD - const u32 gMonFrontPic_Wimpod[] = INCBIN_U32("graphics/pokemon/wimpod/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Wimpod[] = INCBIN_U32("graphics/pokemon/wimpod/anim_front.4bpp.smol"); const u16 gMonPalette_Wimpod[] = INCBIN_U16("graphics/pokemon/wimpod/normal.gbapal"); - const u32 gMonBackPic_Wimpod[] = INCBIN_U32("graphics/pokemon/wimpod/back.4bpp.lz"); + const u32 gMonBackPic_Wimpod[] = INCBIN_U32("graphics/pokemon/wimpod/back.4bpp.smol"); const u16 gMonShinyPalette_Wimpod[] = INCBIN_U16("graphics/pokemon/wimpod/shiny.gbapal"); const u8 gMonIcon_Wimpod[] = INCBIN_U8("graphics/pokemon/wimpod/icon.4bpp"); #if P_FOOTPRINTS @@ -21676,9 +21730,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Golisopod[] = INCBIN_U32("graphics/pokemon/golisopod/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Golisopod[] = INCBIN_U32("graphics/pokemon/golisopod/anim_front.4bpp.smol"); const u16 gMonPalette_Golisopod[] = INCBIN_U16("graphics/pokemon/golisopod/normal.gbapal"); - const u32 gMonBackPic_Golisopod[] = INCBIN_U32("graphics/pokemon/golisopod/back.4bpp.lz"); + const u32 gMonBackPic_Golisopod[] = INCBIN_U32("graphics/pokemon/golisopod/back.4bpp.smol"); const u16 gMonShinyPalette_Golisopod[] = INCBIN_U16("graphics/pokemon/golisopod/shiny.gbapal"); const u8 gMonIcon_Golisopod[] = INCBIN_U8("graphics/pokemon/golisopod/icon.4bpp"); #if P_FOOTPRINTS @@ -21694,9 +21748,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_WIMPOD #if P_FAMILY_SANDYGAST - const u32 gMonFrontPic_Sandygast[] = INCBIN_U32("graphics/pokemon/sandygast/front.4bpp.lz"); + const u32 gMonFrontPic_Sandygast[] = INCBIN_U32("graphics/pokemon/sandygast/front.4bpp.smol"); const u16 gMonPalette_Sandygast[] = INCBIN_U16("graphics/pokemon/sandygast/normal.gbapal"); - const u32 gMonBackPic_Sandygast[] = INCBIN_U32("graphics/pokemon/sandygast/back.4bpp.lz"); + const u32 gMonBackPic_Sandygast[] = INCBIN_U32("graphics/pokemon/sandygast/back.4bpp.smol"); const u16 gMonShinyPalette_Sandygast[] = INCBIN_U16("graphics/pokemon/sandygast/shiny.gbapal"); const u8 gMonIcon_Sandygast[] = INCBIN_U8("graphics/pokemon/sandygast/icon.4bpp"); #if P_FOOTPRINTS @@ -21710,9 +21764,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Palossand[] = INCBIN_U32("graphics/pokemon/palossand/front.4bpp.lz"); + const u32 gMonFrontPic_Palossand[] = INCBIN_U32("graphics/pokemon/palossand/front.4bpp.smol"); const u16 gMonPalette_Palossand[] = INCBIN_U16("graphics/pokemon/palossand/normal.gbapal"); - const u32 gMonBackPic_Palossand[] = INCBIN_U32("graphics/pokemon/palossand/back.4bpp.lz"); + const u32 gMonBackPic_Palossand[] = INCBIN_U32("graphics/pokemon/palossand/back.4bpp.smol"); const u16 gMonShinyPalette_Palossand[] = INCBIN_U16("graphics/pokemon/palossand/shiny.gbapal"); const u8 gMonIcon_Palossand[] = INCBIN_U8("graphics/pokemon/palossand/icon.4bpp"); #if P_FOOTPRINTS @@ -21728,9 +21782,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SANDYGAST #if P_FAMILY_PYUKUMUKU - const u32 gMonFrontPic_Pyukumuku[] = INCBIN_U32("graphics/pokemon/pyukumuku/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pyukumuku[] = INCBIN_U32("graphics/pokemon/pyukumuku/anim_front.4bpp.smol"); const u16 gMonPalette_Pyukumuku[] = INCBIN_U16("graphics/pokemon/pyukumuku/normal.gbapal"); - const u32 gMonBackPic_Pyukumuku[] = INCBIN_U32("graphics/pokemon/pyukumuku/back.4bpp.lz"); + const u32 gMonBackPic_Pyukumuku[] = INCBIN_U32("graphics/pokemon/pyukumuku/back.4bpp.smol"); const u16 gMonShinyPalette_Pyukumuku[] = INCBIN_U16("graphics/pokemon/pyukumuku/shiny.gbapal"); const u8 gMonIcon_Pyukumuku[] = INCBIN_U8("graphics/pokemon/pyukumuku/icon.4bpp"); #if P_FOOTPRINTS @@ -21746,9 +21800,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PYUKUMUKU #if P_FAMILY_TYPE_NULL - const u32 gMonFrontPic_TypeNull[] = INCBIN_U32("graphics/pokemon/type_null/front.4bpp.lz"); + const u32 gMonFrontPic_TypeNull[] = INCBIN_U32("graphics/pokemon/type_null/front.4bpp.smol"); const u16 gMonPalette_TypeNull[] = INCBIN_U16("graphics/pokemon/type_null/normal.gbapal"); - const u32 gMonBackPic_TypeNull[] = INCBIN_U32("graphics/pokemon/type_null/back.4bpp.lz"); + const u32 gMonBackPic_TypeNull[] = INCBIN_U32("graphics/pokemon/type_null/back.4bpp.smol"); const u16 gMonShinyPalette_TypeNull[] = INCBIN_U16("graphics/pokemon/type_null/shiny.gbapal"); const u8 gMonIcon_TypeNull[] = INCBIN_U8("graphics/pokemon/type_null/icon.4bpp"); #if P_FOOTPRINTS @@ -21762,8 +21816,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Silvally[] = INCBIN_U32("graphics/pokemon/silvally/front.4bpp.lz"); - const u32 gMonBackPic_Silvally[] = INCBIN_U32("graphics/pokemon/silvally/back.4bpp.lz"); + const u32 gMonFrontPic_Silvally[] = INCBIN_U32("graphics/pokemon/silvally/front.4bpp.smol"); + const u32 gMonBackPic_Silvally[] = INCBIN_U32("graphics/pokemon/silvally/back.4bpp.smol"); const u8 gMonIcon_Silvally[] = INCBIN_U8("graphics/pokemon/silvally/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Silvally[] = INCBIN_U8("graphics/pokemon/silvally/footprint.1bpp"); @@ -21832,17 +21886,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TYPE_NULL #if P_FAMILY_MINIOR - const u32 gMonFrontPic_MiniorMeteor[] = INCBIN_U32("graphics/pokemon/minior/front.4bpp.lz"); + const u32 gMonFrontPic_MiniorMeteor[] = INCBIN_U32("graphics/pokemon/minior/front.4bpp.smol"); const u16 gMonPalette_MiniorMeteor[] = INCBIN_U16("graphics/pokemon/minior/normal.gbapal"); - const u32 gMonBackPic_MiniorMeteor[] = INCBIN_U32("graphics/pokemon/minior/back.4bpp.lz"); + const u32 gMonBackPic_MiniorMeteor[] = INCBIN_U32("graphics/pokemon/minior/back.4bpp.smol"); const u16 gMonShinyPalette_MiniorMeteor[] = INCBIN_U16("graphics/pokemon/minior/shiny.gbapal"); const u8 gMonIcon_MiniorMeteor[] = INCBIN_U8("graphics/pokemon/minior/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Minior[] = INCBIN_U8("graphics/pokemon/minior/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_MiniorCore[] = INCBIN_U32("graphics/pokemon/minior/core/front.4bpp.lz"); - const u32 gMonBackPic_MiniorCore[] = INCBIN_U32("graphics/pokemon/minior/core/back.4bpp.lz"); + const u32 gMonFrontPic_MiniorCore[] = INCBIN_U32("graphics/pokemon/minior/core/front.4bpp.smol"); + const u32 gMonBackPic_MiniorCore[] = INCBIN_U32("graphics/pokemon/minior/core/back.4bpp.smol"); const u16 gMonShinyPalette_MiniorCore[] = INCBIN_U16("graphics/pokemon/minior/core/shiny.gbapal"); const u16 gMonPalette_MiniorCoreRed[] = INCBIN_U16("graphics/pokemon/minior/core/red/normal.gbapal"); @@ -21876,9 +21930,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MINIOR #if P_FAMILY_KOMALA - const u32 gMonFrontPic_Komala[] = INCBIN_U32("graphics/pokemon/komala/front.4bpp.lz"); + const u32 gMonFrontPic_Komala[] = INCBIN_U32("graphics/pokemon/komala/front.4bpp.smol"); const u16 gMonPalette_Komala[] = INCBIN_U16("graphics/pokemon/komala/normal.gbapal"); - const u32 gMonBackPic_Komala[] = INCBIN_U32("graphics/pokemon/komala/back.4bpp.lz"); + const u32 gMonBackPic_Komala[] = INCBIN_U32("graphics/pokemon/komala/back.4bpp.smol"); const u16 gMonShinyPalette_Komala[] = INCBIN_U16("graphics/pokemon/komala/shiny.gbapal"); const u8 gMonIcon_Komala[] = INCBIN_U8("graphics/pokemon/komala/icon.4bpp"); #if P_FOOTPRINTS @@ -21894,9 +21948,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_KOMALA #if P_FAMILY_TURTONATOR - const u32 gMonFrontPic_Turtonator[] = INCBIN_U32("graphics/pokemon/turtonator/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Turtonator[] = INCBIN_U32("graphics/pokemon/turtonator/anim_front.4bpp.smol"); const u16 gMonPalette_Turtonator[] = INCBIN_U16("graphics/pokemon/turtonator/normal.gbapal"); - const u32 gMonBackPic_Turtonator[] = INCBIN_U32("graphics/pokemon/turtonator/back.4bpp.lz"); + const u32 gMonBackPic_Turtonator[] = INCBIN_U32("graphics/pokemon/turtonator/back.4bpp.smol"); const u16 gMonShinyPalette_Turtonator[] = INCBIN_U16("graphics/pokemon/turtonator/shiny.gbapal"); const u8 gMonIcon_Turtonator[] = INCBIN_U8("graphics/pokemon/turtonator/icon.4bpp"); #if P_FOOTPRINTS @@ -21912,9 +21966,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TURTONATOR #if P_FAMILY_TOGEDEMARU - const u32 gMonFrontPic_Togedemaru[] = INCBIN_U32("graphics/pokemon/togedemaru/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Togedemaru[] = INCBIN_U32("graphics/pokemon/togedemaru/anim_front.4bpp.smol"); const u16 gMonPalette_Togedemaru[] = INCBIN_U16("graphics/pokemon/togedemaru/normal.gbapal"); - const u32 gMonBackPic_Togedemaru[] = INCBIN_U32("graphics/pokemon/togedemaru/back.4bpp.lz"); + const u32 gMonBackPic_Togedemaru[] = INCBIN_U32("graphics/pokemon/togedemaru/back.4bpp.smol"); const u16 gMonShinyPalette_Togedemaru[] = INCBIN_U16("graphics/pokemon/togedemaru/shiny.gbapal"); const u8 gMonIcon_Togedemaru[] = INCBIN_U8("graphics/pokemon/togedemaru/icon.4bpp"); #if P_FOOTPRINTS @@ -21930,9 +21984,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TOGEDEMARU #if P_FAMILY_MIMIKYU - const u32 gMonFrontPic_MimikyuDisguised[] = INCBIN_U32("graphics/pokemon/mimikyu/front.4bpp.lz"); + const u32 gMonFrontPic_MimikyuDisguised[] = INCBIN_U32("graphics/pokemon/mimikyu/front.4bpp.smol"); const u16 gMonPalette_MimikyuDisguised[] = INCBIN_U16("graphics/pokemon/mimikyu/normal.gbapal"); - const u32 gMonBackPic_MimikyuDisguised[] = INCBIN_U32("graphics/pokemon/mimikyu/back.4bpp.lz"); + const u32 gMonBackPic_MimikyuDisguised[] = INCBIN_U32("graphics/pokemon/mimikyu/back.4bpp.smol"); const u16 gMonShinyPalette_MimikyuDisguised[] = INCBIN_U16("graphics/pokemon/mimikyu/shiny.gbapal"); const u8 gMonIcon_MimikyuDisguised[] = INCBIN_U8("graphics/pokemon/mimikyu/icon.4bpp"); #if P_FOOTPRINTS @@ -21946,9 +22000,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_MimikyuBusted[] = INCBIN_U32("graphics/pokemon/mimikyu/busted/front.4bpp.lz"); + const u32 gMonFrontPic_MimikyuBusted[] = INCBIN_U32("graphics/pokemon/mimikyu/busted/front.4bpp.smol"); const u16 gMonPalette_MimikyuBusted[] = INCBIN_U16("graphics/pokemon/mimikyu/busted/normal.gbapal"); - const u32 gMonBackPic_MimikyuBusted[] = INCBIN_U32("graphics/pokemon/mimikyu/busted/back.4bpp.lz"); + const u32 gMonBackPic_MimikyuBusted[] = INCBIN_U32("graphics/pokemon/mimikyu/busted/back.4bpp.smol"); const u16 gMonShinyPalette_MimikyuBusted[] = INCBIN_U16("graphics/pokemon/mimikyu/busted/shiny.gbapal"); const u8 gMonIcon_MimikyuBusted[] = INCBIN_U8("graphics/pokemon/mimikyu/busted/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -21961,9 +22015,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MIMIKYU #if P_FAMILY_BRUXISH - const u32 gMonFrontPic_Bruxish[] = INCBIN_U32("graphics/pokemon/bruxish/front.4bpp.lz"); + const u32 gMonFrontPic_Bruxish[] = INCBIN_U32("graphics/pokemon/bruxish/front.4bpp.smol"); const u16 gMonPalette_Bruxish[] = INCBIN_U16("graphics/pokemon/bruxish/normal.gbapal"); - const u32 gMonBackPic_Bruxish[] = INCBIN_U32("graphics/pokemon/bruxish/back.4bpp.lz"); + const u32 gMonBackPic_Bruxish[] = INCBIN_U32("graphics/pokemon/bruxish/back.4bpp.smol"); const u16 gMonShinyPalette_Bruxish[] = INCBIN_U16("graphics/pokemon/bruxish/shiny.gbapal"); const u8 gMonIcon_Bruxish[] = INCBIN_U8("graphics/pokemon/bruxish/icon.4bpp"); #if P_FOOTPRINTS @@ -21979,9 +22033,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BRUXISH #if P_FAMILY_DRAMPA - const u32 gMonFrontPic_Drampa[] = INCBIN_U32("graphics/pokemon/drampa/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Drampa[] = INCBIN_U32("graphics/pokemon/drampa/anim_front.4bpp.smol"); const u16 gMonPalette_Drampa[] = INCBIN_U16("graphics/pokemon/drampa/normal.gbapal"); - const u32 gMonBackPic_Drampa[] = INCBIN_U32("graphics/pokemon/drampa/back.4bpp.lz"); + const u32 gMonBackPic_Drampa[] = INCBIN_U32("graphics/pokemon/drampa/back.4bpp.smol"); const u16 gMonShinyPalette_Drampa[] = INCBIN_U16("graphics/pokemon/drampa/shiny.gbapal"); const u8 gMonIcon_Drampa[] = INCBIN_U8("graphics/pokemon/drampa/icon.4bpp"); #if P_FOOTPRINTS @@ -21997,9 +22051,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DRAMPA #if P_FAMILY_DHELMISE - const u32 gMonFrontPic_Dhelmise[] = INCBIN_U32("graphics/pokemon/dhelmise/front.4bpp.lz"); + const u32 gMonFrontPic_Dhelmise[] = INCBIN_U32("graphics/pokemon/dhelmise/front.4bpp.smol"); const u16 gMonPalette_Dhelmise[] = INCBIN_U16("graphics/pokemon/dhelmise/normal.gbapal"); - const u32 gMonBackPic_Dhelmise[] = INCBIN_U32("graphics/pokemon/dhelmise/back.4bpp.lz"); + const u32 gMonBackPic_Dhelmise[] = INCBIN_U32("graphics/pokemon/dhelmise/back.4bpp.smol"); const u16 gMonShinyPalette_Dhelmise[] = INCBIN_U16("graphics/pokemon/dhelmise/shiny.gbapal"); const u8 gMonIcon_Dhelmise[] = INCBIN_U8("graphics/pokemon/dhelmise/icon.4bpp"); #if P_FOOTPRINTS @@ -22015,9 +22069,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DHELMISE #if P_FAMILY_JANGMO_O - const u32 gMonFrontPic_JangmoO[] = INCBIN_U32("graphics/pokemon/jangmo_o/anim_front.4bpp.lz"); + const u32 gMonFrontPic_JangmoO[] = INCBIN_U32("graphics/pokemon/jangmo_o/anim_front.4bpp.smol"); const u16 gMonPalette_JangmoO[] = INCBIN_U16("graphics/pokemon/jangmo_o/normal.gbapal"); - const u32 gMonBackPic_JangmoO[] = INCBIN_U32("graphics/pokemon/jangmo_o/back.4bpp.lz"); + const u32 gMonBackPic_JangmoO[] = INCBIN_U32("graphics/pokemon/jangmo_o/back.4bpp.smol"); const u16 gMonShinyPalette_JangmoO[] = INCBIN_U16("graphics/pokemon/jangmo_o/shiny.gbapal"); const u8 gMonIcon_JangmoO[] = INCBIN_U8("graphics/pokemon/jangmo_o/icon.4bpp"); #if P_FOOTPRINTS @@ -22031,9 +22085,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_HakamoO[] = INCBIN_U32("graphics/pokemon/hakamo_o/anim_front.4bpp.lz"); + const u32 gMonFrontPic_HakamoO[] = INCBIN_U32("graphics/pokemon/hakamo_o/anim_front.4bpp.smol"); const u16 gMonPalette_HakamoO[] = INCBIN_U16("graphics/pokemon/hakamo_o/normal.gbapal"); - const u32 gMonBackPic_HakamoO[] = INCBIN_U32("graphics/pokemon/hakamo_o/back.4bpp.lz"); + const u32 gMonBackPic_HakamoO[] = INCBIN_U32("graphics/pokemon/hakamo_o/back.4bpp.smol"); const u16 gMonShinyPalette_HakamoO[] = INCBIN_U16("graphics/pokemon/hakamo_o/shiny.gbapal"); const u8 gMonIcon_HakamoO[] = INCBIN_U8("graphics/pokemon/hakamo_o/icon.4bpp"); #if P_FOOTPRINTS @@ -22047,9 +22101,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_KommoO[] = INCBIN_U32("graphics/pokemon/kommo_o/anim_front.4bpp.lz"); + const u32 gMonFrontPic_KommoO[] = INCBIN_U32("graphics/pokemon/kommo_o/anim_front.4bpp.smol"); const u16 gMonPalette_KommoO[] = INCBIN_U16("graphics/pokemon/kommo_o/normal.gbapal"); - const u32 gMonBackPic_KommoO[] = INCBIN_U32("graphics/pokemon/kommo_o/back.4bpp.lz"); + const u32 gMonBackPic_KommoO[] = INCBIN_U32("graphics/pokemon/kommo_o/back.4bpp.smol"); const u16 gMonShinyPalette_KommoO[] = INCBIN_U16("graphics/pokemon/kommo_o/shiny.gbapal"); const u8 gMonIcon_KommoO[] = INCBIN_U8("graphics/pokemon/kommo_o/icon.4bpp"); #if P_FOOTPRINTS @@ -22065,9 +22119,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_JANGMO_O #if P_FAMILY_TAPU_KOKO - const u32 gMonFrontPic_TapuKoko[] = INCBIN_U32("graphics/pokemon/tapu_koko/anim_front.4bpp.lz"); + const u32 gMonFrontPic_TapuKoko[] = INCBIN_U32("graphics/pokemon/tapu_koko/anim_front.4bpp.smol"); const u16 gMonPalette_TapuKoko[] = INCBIN_U16("graphics/pokemon/tapu_koko/normal.gbapal"); - const u32 gMonBackPic_TapuKoko[] = INCBIN_U32("graphics/pokemon/tapu_koko/back.4bpp.lz"); + const u32 gMonBackPic_TapuKoko[] = INCBIN_U32("graphics/pokemon/tapu_koko/back.4bpp.smol"); const u16 gMonShinyPalette_TapuKoko[] = INCBIN_U16("graphics/pokemon/tapu_koko/shiny.gbapal"); const u8 gMonIcon_TapuKoko[] = INCBIN_U8("graphics/pokemon/tapu_koko/icon.4bpp"); #if P_FOOTPRINTS @@ -22083,9 +22137,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TAPU_KOKO #if P_FAMILY_TAPU_LELE - const u32 gMonFrontPic_TapuLele[] = INCBIN_U32("graphics/pokemon/tapu_lele/anim_front.4bpp.lz"); + const u32 gMonFrontPic_TapuLele[] = INCBIN_U32("graphics/pokemon/tapu_lele/anim_front.4bpp.smol"); const u16 gMonPalette_TapuLele[] = INCBIN_U16("graphics/pokemon/tapu_lele/normal.gbapal"); - const u32 gMonBackPic_TapuLele[] = INCBIN_U32("graphics/pokemon/tapu_lele/back.4bpp.lz"); + const u32 gMonBackPic_TapuLele[] = INCBIN_U32("graphics/pokemon/tapu_lele/back.4bpp.smol"); const u16 gMonShinyPalette_TapuLele[] = INCBIN_U16("graphics/pokemon/tapu_lele/shiny.gbapal"); const u8 gMonIcon_TapuLele[] = INCBIN_U8("graphics/pokemon/tapu_lele/icon.4bpp"); #if P_FOOTPRINTS @@ -22101,9 +22155,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TAPU_LELE #if P_FAMILY_TAPU_BULU - const u32 gMonFrontPic_TapuBulu[] = INCBIN_U32("graphics/pokemon/tapu_bulu/anim_front.4bpp.lz"); + const u32 gMonFrontPic_TapuBulu[] = INCBIN_U32("graphics/pokemon/tapu_bulu/anim_front.4bpp.smol"); const u16 gMonPalette_TapuBulu[] = INCBIN_U16("graphics/pokemon/tapu_bulu/normal.gbapal"); - const u32 gMonBackPic_TapuBulu[] = INCBIN_U32("graphics/pokemon/tapu_bulu/back.4bpp.lz"); + const u32 gMonBackPic_TapuBulu[] = INCBIN_U32("graphics/pokemon/tapu_bulu/back.4bpp.smol"); const u16 gMonShinyPalette_TapuBulu[] = INCBIN_U16("graphics/pokemon/tapu_bulu/shiny.gbapal"); const u8 gMonIcon_TapuBulu[] = INCBIN_U8("graphics/pokemon/tapu_bulu/icon.4bpp"); #if P_FOOTPRINTS @@ -22119,9 +22173,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TAPU_BULU #if P_FAMILY_TAPU_FINI - const u32 gMonFrontPic_TapuFini[] = INCBIN_U32("graphics/pokemon/tapu_fini/anim_front.4bpp.lz"); + const u32 gMonFrontPic_TapuFini[] = INCBIN_U32("graphics/pokemon/tapu_fini/anim_front.4bpp.smol"); const u16 gMonPalette_TapuFini[] = INCBIN_U16("graphics/pokemon/tapu_fini/normal.gbapal"); - const u32 gMonBackPic_TapuFini[] = INCBIN_U32("graphics/pokemon/tapu_fini/back.4bpp.lz"); + const u32 gMonBackPic_TapuFini[] = INCBIN_U32("graphics/pokemon/tapu_fini/back.4bpp.smol"); const u16 gMonShinyPalette_TapuFini[] = INCBIN_U16("graphics/pokemon/tapu_fini/shiny.gbapal"); const u8 gMonIcon_TapuFini[] = INCBIN_U8("graphics/pokemon/tapu_fini/icon.4bpp"); #if P_FOOTPRINTS @@ -22137,9 +22191,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TAPU_FINI #if P_FAMILY_COSMOG - const u32 gMonFrontPic_Cosmog[] = INCBIN_U32("graphics/pokemon/cosmog/front.4bpp.lz"); + const u32 gMonFrontPic_Cosmog[] = INCBIN_U32("graphics/pokemon/cosmog/front.4bpp.smol"); const u16 gMonPalette_Cosmog[] = INCBIN_U16("graphics/pokemon/cosmog/normal.gbapal"); - const u32 gMonBackPic_Cosmog[] = INCBIN_U32("graphics/pokemon/cosmog/back.4bpp.lz"); + const u32 gMonBackPic_Cosmog[] = INCBIN_U32("graphics/pokemon/cosmog/back.4bpp.smol"); const u16 gMonShinyPalette_Cosmog[] = INCBIN_U16("graphics/pokemon/cosmog/shiny.gbapal"); const u8 gMonIcon_Cosmog[] = INCBIN_U8("graphics/pokemon/cosmog/icon.4bpp"); #if P_FOOTPRINTS @@ -22153,9 +22207,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Cosmoem[] = INCBIN_U32("graphics/pokemon/cosmoem/front.4bpp.lz"); + const u32 gMonFrontPic_Cosmoem[] = INCBIN_U32("graphics/pokemon/cosmoem/front.4bpp.smol"); const u16 gMonPalette_Cosmoem[] = INCBIN_U16("graphics/pokemon/cosmoem/normal.gbapal"); - const u32 gMonBackPic_Cosmoem[] = INCBIN_U32("graphics/pokemon/cosmoem/back.4bpp.lz"); + const u32 gMonBackPic_Cosmoem[] = INCBIN_U32("graphics/pokemon/cosmoem/back.4bpp.smol"); const u16 gMonShinyPalette_Cosmoem[] = INCBIN_U16("graphics/pokemon/cosmoem/shiny.gbapal"); const u8 gMonIcon_Cosmoem[] = INCBIN_U8("graphics/pokemon/cosmoem/icon.4bpp"); #if P_FOOTPRINTS @@ -22169,9 +22223,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Solgaleo[] = INCBIN_U32("graphics/pokemon/solgaleo/front.4bpp.lz"); + const u32 gMonFrontPic_Solgaleo[] = INCBIN_U32("graphics/pokemon/solgaleo/front.4bpp.smol"); const u16 gMonPalette_Solgaleo[] = INCBIN_U16("graphics/pokemon/solgaleo/normal.gbapal"); - const u32 gMonBackPic_Solgaleo[] = INCBIN_U32("graphics/pokemon/solgaleo/back.4bpp.lz"); + const u32 gMonBackPic_Solgaleo[] = INCBIN_U32("graphics/pokemon/solgaleo/back.4bpp.smol"); const u16 gMonShinyPalette_Solgaleo[] = INCBIN_U16("graphics/pokemon/solgaleo/shiny.gbapal"); const u8 gMonIcon_Solgaleo[] = INCBIN_U8("graphics/pokemon/solgaleo/icon.4bpp"); #if P_FOOTPRINTS @@ -22185,9 +22239,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Lunala[] = INCBIN_U32("graphics/pokemon/lunala/front.4bpp.lz"); + const u32 gMonFrontPic_Lunala[] = INCBIN_U32("graphics/pokemon/lunala/front.4bpp.smol"); const u16 gMonPalette_Lunala[] = INCBIN_U16("graphics/pokemon/lunala/normal.gbapal"); - const u32 gMonBackPic_Lunala[] = INCBIN_U32("graphics/pokemon/lunala/back.4bpp.lz"); + const u32 gMonBackPic_Lunala[] = INCBIN_U32("graphics/pokemon/lunala/back.4bpp.smol"); const u16 gMonShinyPalette_Lunala[] = INCBIN_U16("graphics/pokemon/lunala/shiny.gbapal"); const u8 gMonIcon_Lunala[] = INCBIN_U8("graphics/pokemon/lunala/icon.4bpp"); #if P_FOOTPRINTS @@ -22203,9 +22257,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_COSMOG #if P_FAMILY_NIHILEGO - const u32 gMonFrontPic_Nihilego[] = INCBIN_U32("graphics/pokemon/nihilego/front.4bpp.lz"); + const u32 gMonFrontPic_Nihilego[] = INCBIN_U32("graphics/pokemon/nihilego/front.4bpp.smol"); const u16 gMonPalette_Nihilego[] = INCBIN_U16("graphics/pokemon/nihilego/normal.gbapal"); - const u32 gMonBackPic_Nihilego[] = INCBIN_U32("graphics/pokemon/nihilego/back.4bpp.lz"); + const u32 gMonBackPic_Nihilego[] = INCBIN_U32("graphics/pokemon/nihilego/back.4bpp.smol"); const u16 gMonShinyPalette_Nihilego[] = INCBIN_U16("graphics/pokemon/nihilego/shiny.gbapal"); const u8 gMonIcon_Nihilego[] = INCBIN_U8("graphics/pokemon/nihilego/icon.4bpp"); #if P_FOOTPRINTS @@ -22221,9 +22275,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_NIHILEGO #if P_FAMILY_BUZZWOLE - const u32 gMonFrontPic_Buzzwole[] = INCBIN_U32("graphics/pokemon/buzzwole/front.4bpp.lz"); + const u32 gMonFrontPic_Buzzwole[] = INCBIN_U32("graphics/pokemon/buzzwole/front.4bpp.smol"); const u16 gMonPalette_Buzzwole[] = INCBIN_U16("graphics/pokemon/buzzwole/normal.gbapal"); - const u32 gMonBackPic_Buzzwole[] = INCBIN_U32("graphics/pokemon/buzzwole/back.4bpp.lz"); + const u32 gMonBackPic_Buzzwole[] = INCBIN_U32("graphics/pokemon/buzzwole/back.4bpp.smol"); const u16 gMonShinyPalette_Buzzwole[] = INCBIN_U16("graphics/pokemon/buzzwole/shiny.gbapal"); const u8 gMonIcon_Buzzwole[] = INCBIN_U8("graphics/pokemon/buzzwole/icon.4bpp"); #if P_FOOTPRINTS @@ -22239,9 +22293,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BUZZWOLE #if P_FAMILY_PHEROMOSA - const u32 gMonFrontPic_Pheromosa[] = INCBIN_U32("graphics/pokemon/pheromosa/front.4bpp.lz"); + const u32 gMonFrontPic_Pheromosa[] = INCBIN_U32("graphics/pokemon/pheromosa/front.4bpp.smol"); const u16 gMonPalette_Pheromosa[] = INCBIN_U16("graphics/pokemon/pheromosa/normal.gbapal"); - const u32 gMonBackPic_Pheromosa[] = INCBIN_U32("graphics/pokemon/pheromosa/back.4bpp.lz"); + const u32 gMonBackPic_Pheromosa[] = INCBIN_U32("graphics/pokemon/pheromosa/back.4bpp.smol"); const u16 gMonShinyPalette_Pheromosa[] = INCBIN_U16("graphics/pokemon/pheromosa/shiny.gbapal"); const u8 gMonIcon_Pheromosa[] = INCBIN_U8("graphics/pokemon/pheromosa/icon.4bpp"); #if P_FOOTPRINTS @@ -22257,9 +22311,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PHEROMOSA #if P_FAMILY_XURKITREE - const u32 gMonFrontPic_Xurkitree[] = INCBIN_U32("graphics/pokemon/xurkitree/front.4bpp.lz"); + const u32 gMonFrontPic_Xurkitree[] = INCBIN_U32("graphics/pokemon/xurkitree/front.4bpp.smol"); const u16 gMonPalette_Xurkitree[] = INCBIN_U16("graphics/pokemon/xurkitree/normal.gbapal"); - const u32 gMonBackPic_Xurkitree[] = INCBIN_U32("graphics/pokemon/xurkitree/back.4bpp.lz"); + const u32 gMonBackPic_Xurkitree[] = INCBIN_U32("graphics/pokemon/xurkitree/back.4bpp.smol"); const u16 gMonShinyPalette_Xurkitree[] = INCBIN_U16("graphics/pokemon/xurkitree/shiny.gbapal"); const u8 gMonIcon_Xurkitree[] = INCBIN_U8("graphics/pokemon/xurkitree/icon.4bpp"); #if P_FOOTPRINTS @@ -22275,9 +22329,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_XURKITREE #if P_FAMILY_CELESTEELA - const u32 gMonFrontPic_Celesteela[] = INCBIN_U32("graphics/pokemon/celesteela/front.4bpp.lz"); + const u32 gMonFrontPic_Celesteela[] = INCBIN_U32("graphics/pokemon/celesteela/front.4bpp.smol"); const u16 gMonPalette_Celesteela[] = INCBIN_U16("graphics/pokemon/celesteela/normal.gbapal"); - const u32 gMonBackPic_Celesteela[] = INCBIN_U32("graphics/pokemon/celesteela/back.4bpp.lz"); + const u32 gMonBackPic_Celesteela[] = INCBIN_U32("graphics/pokemon/celesteela/back.4bpp.smol"); const u16 gMonShinyPalette_Celesteela[] = INCBIN_U16("graphics/pokemon/celesteela/shiny.gbapal"); const u8 gMonIcon_Celesteela[] = INCBIN_U8("graphics/pokemon/celesteela/icon.4bpp"); #if P_FOOTPRINTS @@ -22293,9 +22347,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CELESTEELA #if P_FAMILY_KARTANA - const u32 gMonFrontPic_Kartana[] = INCBIN_U32("graphics/pokemon/kartana/front.4bpp.lz"); + const u32 gMonFrontPic_Kartana[] = INCBIN_U32("graphics/pokemon/kartana/front.4bpp.smol"); const u16 gMonPalette_Kartana[] = INCBIN_U16("graphics/pokemon/kartana/normal.gbapal"); - const u32 gMonBackPic_Kartana[] = INCBIN_U32("graphics/pokemon/kartana/back.4bpp.lz"); + const u32 gMonBackPic_Kartana[] = INCBIN_U32("graphics/pokemon/kartana/back.4bpp.smol"); const u16 gMonShinyPalette_Kartana[] = INCBIN_U16("graphics/pokemon/kartana/shiny.gbapal"); const u8 gMonIcon_Kartana[] = INCBIN_U8("graphics/pokemon/kartana/icon.4bpp"); #if P_FOOTPRINTS @@ -22311,9 +22365,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_KARTANA #if P_FAMILY_GUZZLORD - const u32 gMonFrontPic_Guzzlord[] = INCBIN_U32("graphics/pokemon/guzzlord/front.4bpp.lz"); + const u32 gMonFrontPic_Guzzlord[] = INCBIN_U32("graphics/pokemon/guzzlord/front.4bpp.smol"); const u16 gMonPalette_Guzzlord[] = INCBIN_U16("graphics/pokemon/guzzlord/normal.gbapal"); - const u32 gMonBackPic_Guzzlord[] = INCBIN_U32("graphics/pokemon/guzzlord/back.4bpp.lz"); + const u32 gMonBackPic_Guzzlord[] = INCBIN_U32("graphics/pokemon/guzzlord/back.4bpp.smol"); const u16 gMonShinyPalette_Guzzlord[] = INCBIN_U16("graphics/pokemon/guzzlord/shiny.gbapal"); const u8 gMonIcon_Guzzlord[] = INCBIN_U8("graphics/pokemon/guzzlord/icon.4bpp"); #if P_FOOTPRINTS @@ -22329,9 +22383,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GUZZLORD #if P_FAMILY_NECROZMA - const u32 gMonFrontPic_Necrozma[] = INCBIN_U32("graphics/pokemon/necrozma/front.4bpp.lz"); + const u32 gMonFrontPic_Necrozma[] = INCBIN_U32("graphics/pokemon/necrozma/front.4bpp.smol"); const u16 gMonPalette_Necrozma[] = INCBIN_U16("graphics/pokemon/necrozma/normal.gbapal"); - const u32 gMonBackPic_Necrozma[] = INCBIN_U32("graphics/pokemon/necrozma/back.4bpp.lz"); + const u32 gMonBackPic_Necrozma[] = INCBIN_U32("graphics/pokemon/necrozma/back.4bpp.smol"); const u16 gMonShinyPalette_Necrozma[] = INCBIN_U16("graphics/pokemon/necrozma/shiny.gbapal"); const u8 gMonIcon_Necrozma[] = INCBIN_U8("graphics/pokemon/necrozma/icon.4bpp"); #if P_FOOTPRINTS @@ -22346,9 +22400,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_FUSION_FORMS - const u32 gMonFrontPic_NecrozmaDuskMane[] = INCBIN_U32("graphics/pokemon/necrozma/dusk_mane/front.4bpp.lz"); + const u32 gMonFrontPic_NecrozmaDuskMane[] = INCBIN_U32("graphics/pokemon/necrozma/dusk_mane/front.4bpp.smol"); const u16 gMonPalette_NecrozmaDuskMane[] = INCBIN_U16("graphics/pokemon/necrozma/dusk_mane/normal.gbapal"); - const u32 gMonBackPic_NecrozmaDuskMane[] = INCBIN_U32("graphics/pokemon/necrozma/dusk_mane/back.4bpp.lz"); + const u32 gMonBackPic_NecrozmaDuskMane[] = INCBIN_U32("graphics/pokemon/necrozma/dusk_mane/back.4bpp.smol"); const u16 gMonShinyPalette_NecrozmaDuskMane[] = INCBIN_U16("graphics/pokemon/necrozma/dusk_mane/shiny.gbapal"); const u8 gMonIcon_NecrozmaDuskMane[] = INCBIN_U8("graphics/pokemon/necrozma/dusk_mane/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -22359,9 +22413,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_NecrozmaDawnWings[] = INCBIN_U32("graphics/pokemon/necrozma/dawn_wings/front.4bpp.lz"); + const u32 gMonFrontPic_NecrozmaDawnWings[] = INCBIN_U32("graphics/pokemon/necrozma/dawn_wings/front.4bpp.smol"); const u16 gMonPalette_NecrozmaDawnWings[] = INCBIN_U16("graphics/pokemon/necrozma/dawn_wings/normal.gbapal"); - const u32 gMonBackPic_NecrozmaDawnWings[] = INCBIN_U32("graphics/pokemon/necrozma/dawn_wings/back.4bpp.lz"); + const u32 gMonBackPic_NecrozmaDawnWings[] = INCBIN_U32("graphics/pokemon/necrozma/dawn_wings/back.4bpp.smol"); const u16 gMonShinyPalette_NecrozmaDawnWings[] = INCBIN_U16("graphics/pokemon/necrozma/dawn_wings/shiny.gbapal"); const u8 gMonIcon_NecrozmaDawnWings[] = INCBIN_U8("graphics/pokemon/necrozma/dawn_wings/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -22373,9 +22427,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_ULTRA_BURST_FORMS - const u32 gMonFrontPic_NecrozmaUltra[] = INCBIN_U32("graphics/pokemon/necrozma/ultra/front.4bpp.lz"); + const u32 gMonFrontPic_NecrozmaUltra[] = INCBIN_U32("graphics/pokemon/necrozma/ultra/front.4bpp.smol"); const u16 gMonPalette_NecrozmaUltra[] = INCBIN_U16("graphics/pokemon/necrozma/ultra/normal.gbapal"); - const u32 gMonBackPic_NecrozmaUltra[] = INCBIN_U32("graphics/pokemon/necrozma/ultra/back.4bpp.lz"); + const u32 gMonBackPic_NecrozmaUltra[] = INCBIN_U32("graphics/pokemon/necrozma/ultra/back.4bpp.smol"); const u16 gMonShinyPalette_NecrozmaUltra[] = INCBIN_U16("graphics/pokemon/necrozma/ultra/shiny.gbapal"); const u8 gMonIcon_NecrozmaUltra[] = INCBIN_U8("graphics/pokemon/necrozma/ultra/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -22390,9 +22444,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_NECROZMA #if P_FAMILY_MAGEARNA - const u32 gMonFrontPic_Magearna[] = INCBIN_U32("graphics/pokemon/magearna/front.4bpp.lz"); + const u32 gMonFrontPic_Magearna[] = INCBIN_U32("graphics/pokemon/magearna/front.4bpp.smol"); const u16 gMonPalette_Magearna[] = INCBIN_U16("graphics/pokemon/magearna/normal.gbapal"); - const u32 gMonBackPic_Magearna[] = INCBIN_U32("graphics/pokemon/magearna/back.4bpp.lz"); + const u32 gMonBackPic_Magearna[] = INCBIN_U32("graphics/pokemon/magearna/back.4bpp.smol"); const u16 gMonShinyPalette_Magearna[] = INCBIN_U16("graphics/pokemon/magearna/shiny.gbapal"); const u8 gMonIcon_Magearna[] = INCBIN_U8("graphics/pokemon/magearna/icon.4bpp"); #if P_FOOTPRINTS @@ -22406,9 +22460,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_MagearnaOriginal[] = INCBIN_U32("graphics/pokemon/magearna/original_color/front.4bpp.lz"); + const u32 gMonFrontPic_MagearnaOriginal[] = INCBIN_U32("graphics/pokemon/magearna/original_color/front.4bpp.smol"); const u16 gMonPalette_MagearnaOriginal[] = INCBIN_U16("graphics/pokemon/magearna/original_color/normal.gbapal"); - const u32 gMonBackPic_MagearnaOriginal[] = INCBIN_U32("graphics/pokemon/magearna/original_color/back.4bpp.lz"); + const u32 gMonBackPic_MagearnaOriginal[] = INCBIN_U32("graphics/pokemon/magearna/original_color/back.4bpp.smol"); const u16 gMonShinyPalette_MagearnaOriginal[] = INCBIN_U16("graphics/pokemon/magearna/original_color/shiny.gbapal"); const u8 gMonIcon_MagearnaOriginal[] = INCBIN_U8("graphics/pokemon/magearna/original_color/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -22421,9 +22475,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MAGEARNA #if P_FAMILY_MARSHADOW - const u32 gMonFrontPic_Marshadow[] = INCBIN_U32("graphics/pokemon/marshadow/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Marshadow[] = INCBIN_U32("graphics/pokemon/marshadow/anim_front.4bpp.smol"); const u16 gMonPalette_Marshadow[] = INCBIN_U16("graphics/pokemon/marshadow/normal.gbapal"); - const u32 gMonBackPic_Marshadow[] = INCBIN_U32("graphics/pokemon/marshadow/back.4bpp.lz"); + const u32 gMonBackPic_Marshadow[] = INCBIN_U32("graphics/pokemon/marshadow/back.4bpp.smol"); const u16 gMonShinyPalette_Marshadow[] = INCBIN_U16("graphics/pokemon/marshadow/shiny.gbapal"); const u8 gMonIcon_Marshadow[] = INCBIN_U8("graphics/pokemon/marshadow/icon.4bpp"); #if P_FOOTPRINTS @@ -22439,9 +22493,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MARSHADOW #if P_FAMILY_POIPOLE - const u32 gMonFrontPic_Poipole[] = INCBIN_U32("graphics/pokemon/poipole/front.4bpp.lz"); + const u32 gMonFrontPic_Poipole[] = INCBIN_U32("graphics/pokemon/poipole/front.4bpp.smol"); const u16 gMonPalette_Poipole[] = INCBIN_U16("graphics/pokemon/poipole/normal.gbapal"); - const u32 gMonBackPic_Poipole[] = INCBIN_U32("graphics/pokemon/poipole/back.4bpp.lz"); + const u32 gMonBackPic_Poipole[] = INCBIN_U32("graphics/pokemon/poipole/back.4bpp.smol"); const u16 gMonShinyPalette_Poipole[] = INCBIN_U16("graphics/pokemon/poipole/shiny.gbapal"); const u8 gMonIcon_Poipole[] = INCBIN_U8("graphics/pokemon/poipole/icon.4bpp"); #if P_FOOTPRINTS @@ -22455,9 +22509,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Naganadel[] = INCBIN_U32("graphics/pokemon/naganadel/front.4bpp.lz"); + const u32 gMonFrontPic_Naganadel[] = INCBIN_U32("graphics/pokemon/naganadel/front.4bpp.smol"); const u16 gMonPalette_Naganadel[] = INCBIN_U16("graphics/pokemon/naganadel/normal.gbapal"); - const u32 gMonBackPic_Naganadel[] = INCBIN_U32("graphics/pokemon/naganadel/back.4bpp.lz"); + const u32 gMonBackPic_Naganadel[] = INCBIN_U32("graphics/pokemon/naganadel/back.4bpp.smol"); const u16 gMonShinyPalette_Naganadel[] = INCBIN_U16("graphics/pokemon/naganadel/shiny.gbapal"); const u8 gMonIcon_Naganadel[] = INCBIN_U8("graphics/pokemon/naganadel/icon.4bpp"); #if P_FOOTPRINTS @@ -22473,9 +22527,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_POIPOLE #if P_FAMILY_STAKATAKA - const u32 gMonFrontPic_Stakataka[] = INCBIN_U32("graphics/pokemon/stakataka/front.4bpp.lz"); + const u32 gMonFrontPic_Stakataka[] = INCBIN_U32("graphics/pokemon/stakataka/front.4bpp.smol"); const u16 gMonPalette_Stakataka[] = INCBIN_U16("graphics/pokemon/stakataka/normal.gbapal"); - const u32 gMonBackPic_Stakataka[] = INCBIN_U32("graphics/pokemon/stakataka/back.4bpp.lz"); + const u32 gMonBackPic_Stakataka[] = INCBIN_U32("graphics/pokemon/stakataka/back.4bpp.smol"); const u16 gMonShinyPalette_Stakataka[] = INCBIN_U16("graphics/pokemon/stakataka/shiny.gbapal"); const u8 gMonIcon_Stakataka[] = INCBIN_U8("graphics/pokemon/stakataka/icon.4bpp"); #if P_FOOTPRINTS @@ -22491,9 +22545,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_STAKATAKA #if P_FAMILY_BLACEPHALON - const u32 gMonFrontPic_Blacephalon[] = INCBIN_U32("graphics/pokemon/blacephalon/front.4bpp.lz"); + const u32 gMonFrontPic_Blacephalon[] = INCBIN_U32("graphics/pokemon/blacephalon/front.4bpp.smol"); const u16 gMonPalette_Blacephalon[] = INCBIN_U16("graphics/pokemon/blacephalon/normal.gbapal"); - const u32 gMonBackPic_Blacephalon[] = INCBIN_U32("graphics/pokemon/blacephalon/back.4bpp.lz"); + const u32 gMonBackPic_Blacephalon[] = INCBIN_U32("graphics/pokemon/blacephalon/back.4bpp.smol"); const u16 gMonShinyPalette_Blacephalon[] = INCBIN_U16("graphics/pokemon/blacephalon/shiny.gbapal"); const u8 gMonIcon_Blacephalon[] = INCBIN_U8("graphics/pokemon/blacephalon/icon.4bpp"); #if P_FOOTPRINTS @@ -22509,9 +22563,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BLACEPHALON #if P_FAMILY_ZERAORA - const u32 gMonFrontPic_Zeraora[] = INCBIN_U32("graphics/pokemon/zeraora/front.4bpp.lz"); + const u32 gMonFrontPic_Zeraora[] = INCBIN_U32("graphics/pokemon/zeraora/front.4bpp.smol"); const u16 gMonPalette_Zeraora[] = INCBIN_U16("graphics/pokemon/zeraora/normal.gbapal"); - const u32 gMonBackPic_Zeraora[] = INCBIN_U32("graphics/pokemon/zeraora/back.4bpp.lz"); + const u32 gMonBackPic_Zeraora[] = INCBIN_U32("graphics/pokemon/zeraora/back.4bpp.smol"); const u16 gMonShinyPalette_Zeraora[] = INCBIN_U16("graphics/pokemon/zeraora/shiny.gbapal"); const u8 gMonIcon_Zeraora[] = INCBIN_U8("graphics/pokemon/zeraora/icon.4bpp"); #if P_FOOTPRINTS @@ -22527,9 +22581,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ZERAORA #if P_FAMILY_MELTAN - const u32 gMonFrontPic_Meltan[] = INCBIN_U32("graphics/pokemon/meltan/front.4bpp.lz"); + const u32 gMonFrontPic_Meltan[] = INCBIN_U32("graphics/pokemon/meltan/front.4bpp.smol"); const u16 gMonPalette_Meltan[] = INCBIN_U16("graphics/pokemon/meltan/normal.gbapal"); - const u32 gMonBackPic_Meltan[] = INCBIN_U32("graphics/pokemon/meltan/back.4bpp.lz"); + const u32 gMonBackPic_Meltan[] = INCBIN_U32("graphics/pokemon/meltan/back.4bpp.smol"); const u16 gMonShinyPalette_Meltan[] = INCBIN_U16("graphics/pokemon/meltan/shiny.gbapal"); const u8 gMonIcon_Meltan[] = INCBIN_U8("graphics/pokemon/meltan/icon.4bpp"); #if P_FOOTPRINTS @@ -22543,9 +22597,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Melmetal[] = INCBIN_U32("graphics/pokemon/melmetal/front.4bpp.lz"); + const u32 gMonFrontPic_Melmetal[] = INCBIN_U32("graphics/pokemon/melmetal/front.4bpp.smol"); const u16 gMonPalette_Melmetal[] = INCBIN_U16("graphics/pokemon/melmetal/normal.gbapal"); - const u32 gMonBackPic_Melmetal[] = INCBIN_U32("graphics/pokemon/melmetal/back.4bpp.lz"); + const u32 gMonBackPic_Melmetal[] = INCBIN_U32("graphics/pokemon/melmetal/back.4bpp.smol"); const u16 gMonShinyPalette_Melmetal[] = INCBIN_U16("graphics/pokemon/melmetal/shiny.gbapal"); const u8 gMonIcon_Melmetal[] = INCBIN_U8("graphics/pokemon/melmetal/icon.4bpp"); #if P_FOOTPRINTS @@ -22560,8 +22614,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_MelmetalGmax[] = INCBIN_U32("graphics/pokemon/melmetal/gmax/front.4bpp.lz"); - const u32 gMonBackPic_MelmetalGmax[] = INCBIN_U32("graphics/pokemon/melmetal/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_MelmetalGmax[] = INCBIN_U32("graphics/pokemon/melmetal/gmax/front.4bpp.smol"); + const u32 gMonBackPic_MelmetalGmax[] = INCBIN_U32("graphics/pokemon/melmetal/gmax/back.4bpp.smol"); const u16 gMonPalette_MelmetalGmax[] = INCBIN_U16("graphics/pokemon/melmetal/gmax/normal.gbapal"); const u16 gMonShinyPalette_MelmetalGmax[] = INCBIN_U16("graphics/pokemon/melmetal/gmax/shiny.gbapal"); const u8 gMonIcon_MelmetalGmax[] = INCBIN_U8("graphics/pokemon/melmetal/gmax/icon.4bpp"); @@ -22576,9 +22630,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MELTAN #if P_FAMILY_GROOKEY - const u32 gMonFrontPic_Grookey[] = INCBIN_U32("graphics/pokemon/grookey/front.4bpp.lz"); + const u32 gMonFrontPic_Grookey[] = INCBIN_U32("graphics/pokemon/grookey/front.4bpp.smol"); const u16 gMonPalette_Grookey[] = INCBIN_U16("graphics/pokemon/grookey/normal.gbapal"); - const u32 gMonBackPic_Grookey[] = INCBIN_U32("graphics/pokemon/grookey/back.4bpp.lz"); + const u32 gMonBackPic_Grookey[] = INCBIN_U32("graphics/pokemon/grookey/back.4bpp.smol"); const u16 gMonShinyPalette_Grookey[] = INCBIN_U16("graphics/pokemon/grookey/shiny.gbapal"); const u8 gMonIcon_Grookey[] = INCBIN_U8("graphics/pokemon/grookey/icon.4bpp"); #if P_FOOTPRINTS @@ -22592,9 +22646,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Thwackey[] = INCBIN_U32("graphics/pokemon/thwackey/front.4bpp.lz"); + const u32 gMonFrontPic_Thwackey[] = INCBIN_U32("graphics/pokemon/thwackey/front.4bpp.smol"); const u16 gMonPalette_Thwackey[] = INCBIN_U16("graphics/pokemon/thwackey/normal.gbapal"); - const u32 gMonBackPic_Thwackey[] = INCBIN_U32("graphics/pokemon/thwackey/back.4bpp.lz"); + const u32 gMonBackPic_Thwackey[] = INCBIN_U32("graphics/pokemon/thwackey/back.4bpp.smol"); const u16 gMonShinyPalette_Thwackey[] = INCBIN_U16("graphics/pokemon/thwackey/shiny.gbapal"); const u8 gMonIcon_Thwackey[] = INCBIN_U8("graphics/pokemon/thwackey/icon.4bpp"); #if P_FOOTPRINTS @@ -22608,9 +22662,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Rillaboom[] = INCBIN_U32("graphics/pokemon/rillaboom/front.4bpp.lz"); + const u32 gMonFrontPic_Rillaboom[] = INCBIN_U32("graphics/pokemon/rillaboom/front.4bpp.smol"); const u16 gMonPalette_Rillaboom[] = INCBIN_U16("graphics/pokemon/rillaboom/normal.gbapal"); - const u32 gMonBackPic_Rillaboom[] = INCBIN_U32("graphics/pokemon/rillaboom/back.4bpp.lz"); + const u32 gMonBackPic_Rillaboom[] = INCBIN_U32("graphics/pokemon/rillaboom/back.4bpp.smol"); const u16 gMonShinyPalette_Rillaboom[] = INCBIN_U16("graphics/pokemon/rillaboom/shiny.gbapal"); const u8 gMonIcon_Rillaboom[] = INCBIN_U8("graphics/pokemon/rillaboom/icon.4bpp"); #if P_FOOTPRINTS @@ -22625,8 +22679,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_RillaboomGmax[] = INCBIN_U32("graphics/pokemon/rillaboom/gmax/front.4bpp.lz"); - const u32 gMonBackPic_RillaboomGmax[] = INCBIN_U32("graphics/pokemon/rillaboom/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_RillaboomGmax[] = INCBIN_U32("graphics/pokemon/rillaboom/gmax/front.4bpp.smol"); + const u32 gMonBackPic_RillaboomGmax[] = INCBIN_U32("graphics/pokemon/rillaboom/gmax/back.4bpp.smol"); const u16 gMonPalette_RillaboomGmax[] = INCBIN_U16("graphics/pokemon/rillaboom/gmax/normal.gbapal"); const u16 gMonShinyPalette_RillaboomGmax[] = INCBIN_U16("graphics/pokemon/rillaboom/gmax/shiny.gbapal"); const u8 gMonIcon_RillaboomGmax[] = INCBIN_U8("graphics/pokemon/rillaboom/gmax/icon.4bpp"); @@ -22641,9 +22695,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GROOKEY #if P_FAMILY_SCORBUNNY - const u32 gMonFrontPic_Scorbunny[] = INCBIN_U32("graphics/pokemon/scorbunny/front.4bpp.lz"); + const u32 gMonFrontPic_Scorbunny[] = INCBIN_U32("graphics/pokemon/scorbunny/front.4bpp.smol"); const u16 gMonPalette_Scorbunny[] = INCBIN_U16("graphics/pokemon/scorbunny/normal.gbapal"); - const u32 gMonBackPic_Scorbunny[] = INCBIN_U32("graphics/pokemon/scorbunny/back.4bpp.lz"); + const u32 gMonBackPic_Scorbunny[] = INCBIN_U32("graphics/pokemon/scorbunny/back.4bpp.smol"); const u16 gMonShinyPalette_Scorbunny[] = INCBIN_U16("graphics/pokemon/scorbunny/shiny.gbapal"); const u8 gMonIcon_Scorbunny[] = INCBIN_U8("graphics/pokemon/scorbunny/icon.4bpp"); #if P_FOOTPRINTS @@ -22657,9 +22711,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Raboot[] = INCBIN_U32("graphics/pokemon/raboot/front.4bpp.lz"); + const u32 gMonFrontPic_Raboot[] = INCBIN_U32("graphics/pokemon/raboot/front.4bpp.smol"); const u16 gMonPalette_Raboot[] = INCBIN_U16("graphics/pokemon/raboot/normal.gbapal"); - const u32 gMonBackPic_Raboot[] = INCBIN_U32("graphics/pokemon/raboot/back.4bpp.lz"); + const u32 gMonBackPic_Raboot[] = INCBIN_U32("graphics/pokemon/raboot/back.4bpp.smol"); const u16 gMonShinyPalette_Raboot[] = INCBIN_U16("graphics/pokemon/raboot/shiny.gbapal"); const u8 gMonIcon_Raboot[] = INCBIN_U8("graphics/pokemon/raboot/icon.4bpp"); #if P_FOOTPRINTS @@ -22673,9 +22727,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Cinderace[] = INCBIN_U32("graphics/pokemon/cinderace/front.4bpp.lz"); + const u32 gMonFrontPic_Cinderace[] = INCBIN_U32("graphics/pokemon/cinderace/front.4bpp.smol"); const u16 gMonPalette_Cinderace[] = INCBIN_U16("graphics/pokemon/cinderace/normal.gbapal"); - const u32 gMonBackPic_Cinderace[] = INCBIN_U32("graphics/pokemon/cinderace/back.4bpp.lz"); + const u32 gMonBackPic_Cinderace[] = INCBIN_U32("graphics/pokemon/cinderace/back.4bpp.smol"); const u16 gMonShinyPalette_Cinderace[] = INCBIN_U16("graphics/pokemon/cinderace/shiny.gbapal"); const u8 gMonIcon_Cinderace[] = INCBIN_U8("graphics/pokemon/cinderace/icon.4bpp"); #if P_FOOTPRINTS @@ -22690,8 +22744,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_CinderaceGmax[] = INCBIN_U32("graphics/pokemon/cinderace/gmax/front.4bpp.lz"); - const u32 gMonBackPic_CinderaceGmax[] = INCBIN_U32("graphics/pokemon/cinderace/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_CinderaceGmax[] = INCBIN_U32("graphics/pokemon/cinderace/gmax/front.4bpp.smol"); + const u32 gMonBackPic_CinderaceGmax[] = INCBIN_U32("graphics/pokemon/cinderace/gmax/back.4bpp.smol"); const u16 gMonPalette_CinderaceGmax[] = INCBIN_U16("graphics/pokemon/cinderace/gmax/normal.gbapal"); const u16 gMonShinyPalette_CinderaceGmax[] = INCBIN_U16("graphics/pokemon/cinderace/gmax/shiny.gbapal"); const u8 gMonIcon_CinderaceGmax[] = INCBIN_U8("graphics/pokemon/cinderace/gmax/icon.4bpp"); @@ -22706,9 +22760,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SCORBUNNY #if P_FAMILY_SOBBLE - const u32 gMonFrontPic_Sobble[] = INCBIN_U32("graphics/pokemon/sobble/front.4bpp.lz"); + const u32 gMonFrontPic_Sobble[] = INCBIN_U32("graphics/pokemon/sobble/front.4bpp.smol"); const u16 gMonPalette_Sobble[] = INCBIN_U16("graphics/pokemon/sobble/normal.gbapal"); - const u32 gMonBackPic_Sobble[] = INCBIN_U32("graphics/pokemon/sobble/back.4bpp.lz"); + const u32 gMonBackPic_Sobble[] = INCBIN_U32("graphics/pokemon/sobble/back.4bpp.smol"); const u16 gMonShinyPalette_Sobble[] = INCBIN_U16("graphics/pokemon/sobble/shiny.gbapal"); const u8 gMonIcon_Sobble[] = INCBIN_U8("graphics/pokemon/sobble/icon.4bpp"); #if P_FOOTPRINTS @@ -22722,9 +22776,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Drizzile[] = INCBIN_U32("graphics/pokemon/drizzile/front.4bpp.lz"); + const u32 gMonFrontPic_Drizzile[] = INCBIN_U32("graphics/pokemon/drizzile/front.4bpp.smol"); const u16 gMonPalette_Drizzile[] = INCBIN_U16("graphics/pokemon/drizzile/normal.gbapal"); - const u32 gMonBackPic_Drizzile[] = INCBIN_U32("graphics/pokemon/drizzile/back.4bpp.lz"); + const u32 gMonBackPic_Drizzile[] = INCBIN_U32("graphics/pokemon/drizzile/back.4bpp.smol"); const u16 gMonShinyPalette_Drizzile[] = INCBIN_U16("graphics/pokemon/drizzile/shiny.gbapal"); const u8 gMonIcon_Drizzile[] = INCBIN_U8("graphics/pokemon/drizzile/icon.4bpp"); #if P_FOOTPRINTS @@ -22738,9 +22792,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Inteleon[] = INCBIN_U32("graphics/pokemon/inteleon/front.4bpp.lz"); + const u32 gMonFrontPic_Inteleon[] = INCBIN_U32("graphics/pokemon/inteleon/front.4bpp.smol"); const u16 gMonPalette_Inteleon[] = INCBIN_U16("graphics/pokemon/inteleon/normal.gbapal"); - const u32 gMonBackPic_Inteleon[] = INCBIN_U32("graphics/pokemon/inteleon/back.4bpp.lz"); + const u32 gMonBackPic_Inteleon[] = INCBIN_U32("graphics/pokemon/inteleon/back.4bpp.smol"); const u16 gMonShinyPalette_Inteleon[] = INCBIN_U16("graphics/pokemon/inteleon/shiny.gbapal"); const u8 gMonIcon_Inteleon[] = INCBIN_U8("graphics/pokemon/inteleon/icon.4bpp"); #if P_FOOTPRINTS @@ -22755,8 +22809,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_InteleonGmax[] = INCBIN_U32("graphics/pokemon/inteleon/gmax/front.4bpp.lz"); - const u32 gMonBackPic_InteleonGmax[] = INCBIN_U32("graphics/pokemon/inteleon/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_InteleonGmax[] = INCBIN_U32("graphics/pokemon/inteleon/gmax/front.4bpp.smol"); + const u32 gMonBackPic_InteleonGmax[] = INCBIN_U32("graphics/pokemon/inteleon/gmax/back.4bpp.smol"); const u16 gMonPalette_InteleonGmax[] = INCBIN_U16("graphics/pokemon/inteleon/gmax/normal.gbapal"); const u16 gMonShinyPalette_InteleonGmax[] = INCBIN_U16("graphics/pokemon/inteleon/gmax/shiny.gbapal"); const u8 gMonIcon_InteleonGmax[] = INCBIN_U8("graphics/pokemon/inteleon/gmax/icon.4bpp"); @@ -22771,9 +22825,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SOBBLE #if P_FAMILY_SKWOVET - const u32 gMonFrontPic_Skwovet[] = INCBIN_U32("graphics/pokemon/skwovet/front.4bpp.lz"); + const u32 gMonFrontPic_Skwovet[] = INCBIN_U32("graphics/pokemon/skwovet/front.4bpp.smol"); const u16 gMonPalette_Skwovet[] = INCBIN_U16("graphics/pokemon/skwovet/normal.gbapal"); - const u32 gMonBackPic_Skwovet[] = INCBIN_U32("graphics/pokemon/skwovet/back.4bpp.lz"); + const u32 gMonBackPic_Skwovet[] = INCBIN_U32("graphics/pokemon/skwovet/back.4bpp.smol"); const u16 gMonShinyPalette_Skwovet[] = INCBIN_U16("graphics/pokemon/skwovet/shiny.gbapal"); const u8 gMonIcon_Skwovet[] = INCBIN_U8("graphics/pokemon/skwovet/icon.4bpp"); #if P_FOOTPRINTS @@ -22787,9 +22841,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Greedent[] = INCBIN_U32("graphics/pokemon/greedent/front.4bpp.lz"); + const u32 gMonFrontPic_Greedent[] = INCBIN_U32("graphics/pokemon/greedent/front.4bpp.smol"); const u16 gMonPalette_Greedent[] = INCBIN_U16("graphics/pokemon/greedent/normal.gbapal"); - const u32 gMonBackPic_Greedent[] = INCBIN_U32("graphics/pokemon/greedent/back.4bpp.lz"); + const u32 gMonBackPic_Greedent[] = INCBIN_U32("graphics/pokemon/greedent/back.4bpp.smol"); const u16 gMonShinyPalette_Greedent[] = INCBIN_U16("graphics/pokemon/greedent/shiny.gbapal"); const u8 gMonIcon_Greedent[] = INCBIN_U8("graphics/pokemon/greedent/icon.4bpp"); #if P_FOOTPRINTS @@ -22805,9 +22859,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SKWOVET #if P_FAMILY_ROOKIDEE - const u32 gMonFrontPic_Rookidee[] = INCBIN_U32("graphics/pokemon/rookidee/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rookidee[] = INCBIN_U32("graphics/pokemon/rookidee/anim_front.4bpp.smol"); const u16 gMonPalette_Rookidee[] = INCBIN_U16("graphics/pokemon/rookidee/normal.gbapal"); - const u32 gMonBackPic_Rookidee[] = INCBIN_U32("graphics/pokemon/rookidee/back.4bpp.lz"); + const u32 gMonBackPic_Rookidee[] = INCBIN_U32("graphics/pokemon/rookidee/back.4bpp.smol"); const u16 gMonShinyPalette_Rookidee[] = INCBIN_U16("graphics/pokemon/rookidee/shiny.gbapal"); const u8 gMonIcon_Rookidee[] = INCBIN_U8("graphics/pokemon/rookidee/icon.4bpp"); #if P_FOOTPRINTS @@ -22821,9 +22875,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Corvisquire[] = INCBIN_U32("graphics/pokemon/corvisquire/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Corvisquire[] = INCBIN_U32("graphics/pokemon/corvisquire/anim_front.4bpp.smol"); const u16 gMonPalette_Corvisquire[] = INCBIN_U16("graphics/pokemon/corvisquire/normal.gbapal"); - const u32 gMonBackPic_Corvisquire[] = INCBIN_U32("graphics/pokemon/corvisquire/back.4bpp.lz"); + const u32 gMonBackPic_Corvisquire[] = INCBIN_U32("graphics/pokemon/corvisquire/back.4bpp.smol"); const u16 gMonShinyPalette_Corvisquire[] = INCBIN_U16("graphics/pokemon/corvisquire/shiny.gbapal"); const u8 gMonIcon_Corvisquire[] = INCBIN_U8("graphics/pokemon/corvisquire/icon.4bpp"); #if P_FOOTPRINTS @@ -22837,9 +22891,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Corviknight[] = INCBIN_U32("graphics/pokemon/corviknight/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Corviknight[] = INCBIN_U32("graphics/pokemon/corviknight/anim_front.4bpp.smol"); const u16 gMonPalette_Corviknight[] = INCBIN_U16("graphics/pokemon/corviknight/normal.gbapal"); - const u32 gMonBackPic_Corviknight[] = INCBIN_U32("graphics/pokemon/corviknight/back.4bpp.lz"); + const u32 gMonBackPic_Corviknight[] = INCBIN_U32("graphics/pokemon/corviknight/back.4bpp.smol"); const u16 gMonShinyPalette_Corviknight[] = INCBIN_U16("graphics/pokemon/corviknight/shiny.gbapal"); const u8 gMonIcon_Corviknight[] = INCBIN_U8("graphics/pokemon/corviknight/icon.4bpp"); #if P_FOOTPRINTS @@ -22854,8 +22908,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_CorviknightGmax[] = INCBIN_U32("graphics/pokemon/corviknight/gmax/front.4bpp.lz"); - const u32 gMonBackPic_CorviknightGmax[] = INCBIN_U32("graphics/pokemon/corviknight/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_CorviknightGmax[] = INCBIN_U32("graphics/pokemon/corviknight/gmax/front.4bpp.smol"); + const u32 gMonBackPic_CorviknightGmax[] = INCBIN_U32("graphics/pokemon/corviknight/gmax/back.4bpp.smol"); const u16 gMonPalette_CorviknightGmax[] = INCBIN_U16("graphics/pokemon/corviknight/gmax/normal.gbapal"); const u16 gMonShinyPalette_CorviknightGmax[] = INCBIN_U16("graphics/pokemon/corviknight/gmax/shiny.gbapal"); const u8 gMonIcon_CorviknightGmax[] = INCBIN_U8("graphics/pokemon/corviknight/gmax/icon.4bpp"); @@ -22870,9 +22924,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ROOKIDEE #if P_FAMILY_BLIPBUG - const u32 gMonFrontPic_Blipbug[] = INCBIN_U32("graphics/pokemon/blipbug/front.4bpp.lz"); + const u32 gMonFrontPic_Blipbug[] = INCBIN_U32("graphics/pokemon/blipbug/front.4bpp.smol"); const u16 gMonPalette_Blipbug[] = INCBIN_U16("graphics/pokemon/blipbug/normal.gbapal"); - const u32 gMonBackPic_Blipbug[] = INCBIN_U32("graphics/pokemon/blipbug/back.4bpp.lz"); + const u32 gMonBackPic_Blipbug[] = INCBIN_U32("graphics/pokemon/blipbug/back.4bpp.smol"); const u16 gMonShinyPalette_Blipbug[] = INCBIN_U16("graphics/pokemon/blipbug/shiny.gbapal"); const u8 gMonIcon_Blipbug[] = INCBIN_U8("graphics/pokemon/blipbug/icon.4bpp"); #if P_FOOTPRINTS @@ -22886,9 +22940,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Dottler[] = INCBIN_U32("graphics/pokemon/dottler/front.4bpp.lz"); + const u32 gMonFrontPic_Dottler[] = INCBIN_U32("graphics/pokemon/dottler/front.4bpp.smol"); const u16 gMonPalette_Dottler[] = INCBIN_U16("graphics/pokemon/dottler/normal.gbapal"); - const u32 gMonBackPic_Dottler[] = INCBIN_U32("graphics/pokemon/dottler/back.4bpp.lz"); + const u32 gMonBackPic_Dottler[] = INCBIN_U32("graphics/pokemon/dottler/back.4bpp.smol"); const u16 gMonShinyPalette_Dottler[] = INCBIN_U16("graphics/pokemon/dottler/shiny.gbapal"); const u8 gMonIcon_Dottler[] = INCBIN_U8("graphics/pokemon/dottler/icon.4bpp"); #if P_FOOTPRINTS @@ -22902,9 +22956,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Orbeetle[] = INCBIN_U32("graphics/pokemon/orbeetle/front.4bpp.lz"); + const u32 gMonFrontPic_Orbeetle[] = INCBIN_U32("graphics/pokemon/orbeetle/front.4bpp.smol"); const u16 gMonPalette_Orbeetle[] = INCBIN_U16("graphics/pokemon/orbeetle/normal.gbapal"); - const u32 gMonBackPic_Orbeetle[] = INCBIN_U32("graphics/pokemon/orbeetle/back.4bpp.lz"); + const u32 gMonBackPic_Orbeetle[] = INCBIN_U32("graphics/pokemon/orbeetle/back.4bpp.smol"); const u16 gMonShinyPalette_Orbeetle[] = INCBIN_U16("graphics/pokemon/orbeetle/shiny.gbapal"); const u8 gMonIcon_Orbeetle[] = INCBIN_U8("graphics/pokemon/orbeetle/icon.4bpp"); #if P_FOOTPRINTS @@ -22919,8 +22973,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_OrbeetleGmax[] = INCBIN_U32("graphics/pokemon/orbeetle/gmax/front.4bpp.lz"); - const u32 gMonBackPic_OrbeetleGmax[] = INCBIN_U32("graphics/pokemon/orbeetle/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_OrbeetleGmax[] = INCBIN_U32("graphics/pokemon/orbeetle/gmax/front.4bpp.smol"); + const u32 gMonBackPic_OrbeetleGmax[] = INCBIN_U32("graphics/pokemon/orbeetle/gmax/back.4bpp.smol"); const u16 gMonPalette_OrbeetleGmax[] = INCBIN_U16("graphics/pokemon/orbeetle/gmax/normal.gbapal"); const u16 gMonShinyPalette_OrbeetleGmax[] = INCBIN_U16("graphics/pokemon/orbeetle/gmax/shiny.gbapal"); const u8 gMonIcon_OrbeetleGmax[] = INCBIN_U8("graphics/pokemon/orbeetle/gmax/icon.4bpp"); @@ -22935,9 +22989,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BLIPBUG #if P_FAMILY_NICKIT - const u32 gMonFrontPic_Nickit[] = INCBIN_U32("graphics/pokemon/nickit/front.4bpp.lz"); + const u32 gMonFrontPic_Nickit[] = INCBIN_U32("graphics/pokemon/nickit/front.4bpp.smol"); const u16 gMonPalette_Nickit[] = INCBIN_U16("graphics/pokemon/nickit/normal.gbapal"); - const u32 gMonBackPic_Nickit[] = INCBIN_U32("graphics/pokemon/nickit/back.4bpp.lz"); + const u32 gMonBackPic_Nickit[] = INCBIN_U32("graphics/pokemon/nickit/back.4bpp.smol"); const u16 gMonShinyPalette_Nickit[] = INCBIN_U16("graphics/pokemon/nickit/shiny.gbapal"); const u8 gMonIcon_Nickit[] = INCBIN_U8("graphics/pokemon/nickit/icon.4bpp"); #if P_FOOTPRINTS @@ -22951,9 +23005,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Thievul[] = INCBIN_U32("graphics/pokemon/thievul/front.4bpp.lz"); + const u32 gMonFrontPic_Thievul[] = INCBIN_U32("graphics/pokemon/thievul/front.4bpp.smol"); const u16 gMonPalette_Thievul[] = INCBIN_U16("graphics/pokemon/thievul/normal.gbapal"); - const u32 gMonBackPic_Thievul[] = INCBIN_U32("graphics/pokemon/thievul/back.4bpp.lz"); + const u32 gMonBackPic_Thievul[] = INCBIN_U32("graphics/pokemon/thievul/back.4bpp.smol"); const u16 gMonShinyPalette_Thievul[] = INCBIN_U16("graphics/pokemon/thievul/shiny.gbapal"); const u8 gMonIcon_Thievul[] = INCBIN_U8("graphics/pokemon/thievul/icon.4bpp"); #if P_FOOTPRINTS @@ -22969,9 +23023,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_NICKIT #if P_FAMILY_GOSSIFLEUR - const u32 gMonFrontPic_Gossifleur[] = INCBIN_U32("graphics/pokemon/gossifleur/front.4bpp.lz"); + const u32 gMonFrontPic_Gossifleur[] = INCBIN_U32("graphics/pokemon/gossifleur/front.4bpp.smol"); const u16 gMonPalette_Gossifleur[] = INCBIN_U16("graphics/pokemon/gossifleur/normal.gbapal"); - const u32 gMonBackPic_Gossifleur[] = INCBIN_U32("graphics/pokemon/gossifleur/back.4bpp.lz"); + const u32 gMonBackPic_Gossifleur[] = INCBIN_U32("graphics/pokemon/gossifleur/back.4bpp.smol"); const u16 gMonShinyPalette_Gossifleur[] = INCBIN_U16("graphics/pokemon/gossifleur/shiny.gbapal"); const u8 gMonIcon_Gossifleur[] = INCBIN_U8("graphics/pokemon/gossifleur/icon.4bpp"); #if P_FOOTPRINTS @@ -22985,9 +23039,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Eldegoss[] = INCBIN_U32("graphics/pokemon/eldegoss/front.4bpp.lz"); + const u32 gMonFrontPic_Eldegoss[] = INCBIN_U32("graphics/pokemon/eldegoss/front.4bpp.smol"); const u16 gMonPalette_Eldegoss[] = INCBIN_U16("graphics/pokemon/eldegoss/normal.gbapal"); - const u32 gMonBackPic_Eldegoss[] = INCBIN_U32("graphics/pokemon/eldegoss/back.4bpp.lz"); + const u32 gMonBackPic_Eldegoss[] = INCBIN_U32("graphics/pokemon/eldegoss/back.4bpp.smol"); const u16 gMonShinyPalette_Eldegoss[] = INCBIN_U16("graphics/pokemon/eldegoss/shiny.gbapal"); const u8 gMonIcon_Eldegoss[] = INCBIN_U8("graphics/pokemon/eldegoss/icon.4bpp"); #if P_FOOTPRINTS @@ -23003,9 +23057,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GOSSIFLEUR #if P_FAMILY_WOOLOO - const u32 gMonFrontPic_Wooloo[] = INCBIN_U32("graphics/pokemon/wooloo/front.4bpp.lz"); + const u32 gMonFrontPic_Wooloo[] = INCBIN_U32("graphics/pokemon/wooloo/front.4bpp.smol"); const u16 gMonPalette_Wooloo[] = INCBIN_U16("graphics/pokemon/wooloo/normal.gbapal"); - const u32 gMonBackPic_Wooloo[] = INCBIN_U32("graphics/pokemon/wooloo/back.4bpp.lz"); + const u32 gMonBackPic_Wooloo[] = INCBIN_U32("graphics/pokemon/wooloo/back.4bpp.smol"); const u16 gMonShinyPalette_Wooloo[] = INCBIN_U16("graphics/pokemon/wooloo/shiny.gbapal"); const u8 gMonIcon_Wooloo[] = INCBIN_U8("graphics/pokemon/wooloo/icon.4bpp"); #if P_FOOTPRINTS @@ -23019,9 +23073,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Dubwool[] = INCBIN_U32("graphics/pokemon/dubwool/front.4bpp.lz"); + const u32 gMonFrontPic_Dubwool[] = INCBIN_U32("graphics/pokemon/dubwool/front.4bpp.smol"); const u16 gMonPalette_Dubwool[] = INCBIN_U16("graphics/pokemon/dubwool/normal.gbapal"); - const u32 gMonBackPic_Dubwool[] = INCBIN_U32("graphics/pokemon/dubwool/back.4bpp.lz"); + const u32 gMonBackPic_Dubwool[] = INCBIN_U32("graphics/pokemon/dubwool/back.4bpp.smol"); const u16 gMonShinyPalette_Dubwool[] = INCBIN_U16("graphics/pokemon/dubwool/shiny.gbapal"); const u8 gMonIcon_Dubwool[] = INCBIN_U8("graphics/pokemon/dubwool/icon.4bpp"); #if P_FOOTPRINTS @@ -23037,9 +23091,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_WOOLOO #if P_FAMILY_CHEWTLE - const u32 gMonFrontPic_Chewtle[] = INCBIN_U32("graphics/pokemon/chewtle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Chewtle[] = INCBIN_U32("graphics/pokemon/chewtle/anim_front.4bpp.smol"); const u16 gMonPalette_Chewtle[] = INCBIN_U16("graphics/pokemon/chewtle/normal.gbapal"); - const u32 gMonBackPic_Chewtle[] = INCBIN_U32("graphics/pokemon/chewtle/back.4bpp.lz"); + const u32 gMonBackPic_Chewtle[] = INCBIN_U32("graphics/pokemon/chewtle/back.4bpp.smol"); const u16 gMonShinyPalette_Chewtle[] = INCBIN_U16("graphics/pokemon/chewtle/shiny.gbapal"); const u8 gMonIcon_Chewtle[] = INCBIN_U8("graphics/pokemon/chewtle/icon.4bpp"); #if P_FOOTPRINTS @@ -23053,9 +23107,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Drednaw[] = INCBIN_U32("graphics/pokemon/drednaw/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Drednaw[] = INCBIN_U32("graphics/pokemon/drednaw/anim_front.4bpp.smol"); const u16 gMonPalette_Drednaw[] = INCBIN_U16("graphics/pokemon/drednaw/normal.gbapal"); - const u32 gMonBackPic_Drednaw[] = INCBIN_U32("graphics/pokemon/drednaw/back.4bpp.lz"); + const u32 gMonBackPic_Drednaw[] = INCBIN_U32("graphics/pokemon/drednaw/back.4bpp.smol"); const u16 gMonShinyPalette_Drednaw[] = INCBIN_U16("graphics/pokemon/drednaw/shiny.gbapal"); const u8 gMonIcon_Drednaw[] = INCBIN_U8("graphics/pokemon/drednaw/icon.4bpp"); #if P_FOOTPRINTS @@ -23070,8 +23124,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_DrednawGmax[] = INCBIN_U32("graphics/pokemon/drednaw/gmax/front.4bpp.lz"); - const u32 gMonBackPic_DrednawGmax[] = INCBIN_U32("graphics/pokemon/drednaw/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_DrednawGmax[] = INCBIN_U32("graphics/pokemon/drednaw/gmax/front.4bpp.smol"); + const u32 gMonBackPic_DrednawGmax[] = INCBIN_U32("graphics/pokemon/drednaw/gmax/back.4bpp.smol"); const u16 gMonPalette_DrednawGmax[] = INCBIN_U16("graphics/pokemon/drednaw/gmax/normal.gbapal"); const u16 gMonShinyPalette_DrednawGmax[] = INCBIN_U16("graphics/pokemon/drednaw/gmax/shiny.gbapal"); const u8 gMonIcon_DrednawGmax[] = INCBIN_U8("graphics/pokemon/drednaw/gmax/icon.4bpp"); @@ -23086,9 +23140,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CHEWTLE #if P_FAMILY_YAMPER - const u32 gMonFrontPic_Yamper[] = INCBIN_U32("graphics/pokemon/yamper/front.4bpp.lz"); + const u32 gMonFrontPic_Yamper[] = INCBIN_U32("graphics/pokemon/yamper/front.4bpp.smol"); const u16 gMonPalette_Yamper[] = INCBIN_U16("graphics/pokemon/yamper/normal.gbapal"); - const u32 gMonBackPic_Yamper[] = INCBIN_U32("graphics/pokemon/yamper/back.4bpp.lz"); + const u32 gMonBackPic_Yamper[] = INCBIN_U32("graphics/pokemon/yamper/back.4bpp.smol"); const u16 gMonShinyPalette_Yamper[] = INCBIN_U16("graphics/pokemon/yamper/shiny.gbapal"); const u8 gMonIcon_Yamper[] = INCBIN_U8("graphics/pokemon/yamper/icon.4bpp"); #if P_FOOTPRINTS @@ -23102,9 +23156,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Boltund[] = INCBIN_U32("graphics/pokemon/boltund/front.4bpp.lz"); + const u32 gMonFrontPic_Boltund[] = INCBIN_U32("graphics/pokemon/boltund/front.4bpp.smol"); const u16 gMonPalette_Boltund[] = INCBIN_U16("graphics/pokemon/boltund/normal.gbapal"); - const u32 gMonBackPic_Boltund[] = INCBIN_U32("graphics/pokemon/boltund/back.4bpp.lz"); + const u32 gMonBackPic_Boltund[] = INCBIN_U32("graphics/pokemon/boltund/back.4bpp.smol"); const u16 gMonShinyPalette_Boltund[] = INCBIN_U16("graphics/pokemon/boltund/shiny.gbapal"); const u8 gMonIcon_Boltund[] = INCBIN_U8("graphics/pokemon/boltund/icon.4bpp"); #if P_FOOTPRINTS @@ -23120,9 +23174,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_YAMPER #if P_FAMILY_ROLYCOLY - const u32 gMonFrontPic_Rolycoly[] = INCBIN_U32("graphics/pokemon/rolycoly/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rolycoly[] = INCBIN_U32("graphics/pokemon/rolycoly/anim_front.4bpp.smol"); const u16 gMonPalette_Rolycoly[] = INCBIN_U16("graphics/pokemon/rolycoly/normal.gbapal"); - const u32 gMonBackPic_Rolycoly[] = INCBIN_U32("graphics/pokemon/rolycoly/back.4bpp.lz"); + const u32 gMonBackPic_Rolycoly[] = INCBIN_U32("graphics/pokemon/rolycoly/back.4bpp.smol"); const u16 gMonShinyPalette_Rolycoly[] = INCBIN_U16("graphics/pokemon/rolycoly/shiny.gbapal"); const u8 gMonIcon_Rolycoly[] = INCBIN_U8("graphics/pokemon/rolycoly/icon.4bpp"); #if P_FOOTPRINTS @@ -23136,9 +23190,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Carkol[] = INCBIN_U32("graphics/pokemon/carkol/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Carkol[] = INCBIN_U32("graphics/pokemon/carkol/anim_front.4bpp.smol"); const u16 gMonPalette_Carkol[] = INCBIN_U16("graphics/pokemon/carkol/normal.gbapal"); - const u32 gMonBackPic_Carkol[] = INCBIN_U32("graphics/pokemon/carkol/back.4bpp.lz"); + const u32 gMonBackPic_Carkol[] = INCBIN_U32("graphics/pokemon/carkol/back.4bpp.smol"); const u16 gMonShinyPalette_Carkol[] = INCBIN_U16("graphics/pokemon/carkol/shiny.gbapal"); const u8 gMonIcon_Carkol[] = INCBIN_U8("graphics/pokemon/carkol/icon.4bpp"); #if P_FOOTPRINTS @@ -23152,9 +23206,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Coalossal[] = INCBIN_U32("graphics/pokemon/coalossal/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Coalossal[] = INCBIN_U32("graphics/pokemon/coalossal/anim_front.4bpp.smol"); const u16 gMonPalette_Coalossal[] = INCBIN_U16("graphics/pokemon/coalossal/normal.gbapal"); - const u32 gMonBackPic_Coalossal[] = INCBIN_U32("graphics/pokemon/coalossal/back.4bpp.lz"); + const u32 gMonBackPic_Coalossal[] = INCBIN_U32("graphics/pokemon/coalossal/back.4bpp.smol"); const u16 gMonShinyPalette_Coalossal[] = INCBIN_U16("graphics/pokemon/coalossal/shiny.gbapal"); const u8 gMonIcon_Coalossal[] = INCBIN_U8("graphics/pokemon/coalossal/icon.4bpp"); #if P_FOOTPRINTS @@ -23169,8 +23223,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_CoalossalGmax[] = INCBIN_U32("graphics/pokemon/coalossal/gmax/front.4bpp.lz"); - const u32 gMonBackPic_CoalossalGmax[] = INCBIN_U32("graphics/pokemon/coalossal/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_CoalossalGmax[] = INCBIN_U32("graphics/pokemon/coalossal/gmax/front.4bpp.smol"); + const u32 gMonBackPic_CoalossalGmax[] = INCBIN_U32("graphics/pokemon/coalossal/gmax/back.4bpp.smol"); const u16 gMonPalette_CoalossalGmax[] = INCBIN_U16("graphics/pokemon/coalossal/gmax/normal.gbapal"); const u16 gMonShinyPalette_CoalossalGmax[] = INCBIN_U16("graphics/pokemon/coalossal/gmax/shiny.gbapal"); const u8 gMonIcon_CoalossalGmax[] = INCBIN_U8("graphics/pokemon/coalossal/gmax/icon.4bpp"); @@ -23185,9 +23239,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ROLYCOLY #if P_FAMILY_APPLIN - const u32 gMonFrontPic_Applin[] = INCBIN_U32("graphics/pokemon/applin/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Applin[] = INCBIN_U32("graphics/pokemon/applin/anim_front.4bpp.smol"); const u16 gMonPalette_Applin[] = INCBIN_U16("graphics/pokemon/applin/normal.gbapal"); - const u32 gMonBackPic_Applin[] = INCBIN_U32("graphics/pokemon/applin/back.4bpp.lz"); + const u32 gMonBackPic_Applin[] = INCBIN_U32("graphics/pokemon/applin/back.4bpp.smol"); const u16 gMonShinyPalette_Applin[] = INCBIN_U16("graphics/pokemon/applin/shiny.gbapal"); const u8 gMonIcon_Applin[] = INCBIN_U8("graphics/pokemon/applin/icon.4bpp"); #if P_FOOTPRINTS @@ -23201,9 +23255,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Flapple[] = INCBIN_U32("graphics/pokemon/flapple/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Flapple[] = INCBIN_U32("graphics/pokemon/flapple/anim_front.4bpp.smol"); const u16 gMonPalette_Flapple[] = INCBIN_U16("graphics/pokemon/flapple/normal.gbapal"); - const u32 gMonBackPic_Flapple[] = INCBIN_U32("graphics/pokemon/flapple/back.4bpp.lz"); + const u32 gMonBackPic_Flapple[] = INCBIN_U32("graphics/pokemon/flapple/back.4bpp.smol"); const u16 gMonShinyPalette_Flapple[] = INCBIN_U16("graphics/pokemon/flapple/shiny.gbapal"); const u8 gMonIcon_Flapple[] = INCBIN_U8("graphics/pokemon/flapple/icon.4bpp"); #if P_FOOTPRINTS @@ -23218,8 +23272,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_FlappleGmax[] = INCBIN_U32("graphics/pokemon/flapple/gmax/front.4bpp.lz"); - const u32 gMonBackPic_FlappleGmax[] = INCBIN_U32("graphics/pokemon/flapple/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_FlappleGmax[] = INCBIN_U32("graphics/pokemon/flapple/gmax/front.4bpp.smol"); + const u32 gMonBackPic_FlappleGmax[] = INCBIN_U32("graphics/pokemon/flapple/gmax/back.4bpp.smol"); const u16 gMonPalette_FlappleGmax[] = INCBIN_U16("graphics/pokemon/flapple/gmax/normal.gbapal"); const u16 gMonShinyPalette_FlappleGmax[] = INCBIN_U16("graphics/pokemon/flapple/gmax/shiny.gbapal"); const u8 gMonIcon_FlappleGmax[] = INCBIN_U8("graphics/pokemon/flapple/gmax/icon.4bpp"); @@ -23232,9 +23286,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_Appletun[] = INCBIN_U32("graphics/pokemon/appletun/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Appletun[] = INCBIN_U32("graphics/pokemon/appletun/anim_front.4bpp.smol"); const u16 gMonPalette_Appletun[] = INCBIN_U16("graphics/pokemon/appletun/normal.gbapal"); - const u32 gMonBackPic_Appletun[] = INCBIN_U32("graphics/pokemon/appletun/back.4bpp.lz"); + const u32 gMonBackPic_Appletun[] = INCBIN_U32("graphics/pokemon/appletun/back.4bpp.smol"); const u16 gMonShinyPalette_Appletun[] = INCBIN_U16("graphics/pokemon/appletun/shiny.gbapal"); const u8 gMonIcon_Appletun[] = INCBIN_U8("graphics/pokemon/appletun/icon.4bpp"); #if P_FOOTPRINTS @@ -23249,8 +23303,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_AppletunGmax[] = INCBIN_U32("graphics/pokemon/appletun/gmax/front.4bpp.lz"); - const u32 gMonBackPic_AppletunGmax[] = INCBIN_U32("graphics/pokemon/appletun/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_AppletunGmax[] = INCBIN_U32("graphics/pokemon/appletun/gmax/front.4bpp.smol"); + const u32 gMonBackPic_AppletunGmax[] = INCBIN_U32("graphics/pokemon/appletun/gmax/back.4bpp.smol"); const u16 gMonPalette_AppletunGmax[] = INCBIN_U16("graphics/pokemon/appletun/gmax/normal.gbapal"); const u16 gMonShinyPalette_AppletunGmax[] = INCBIN_U16("graphics/pokemon/appletun/gmax/shiny.gbapal"); const u8 gMonIcon_AppletunGmax[] = INCBIN_U8("graphics/pokemon/appletun/gmax/icon.4bpp"); @@ -23264,9 +23318,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GIGANTAMAX_FORMS #if P_GEN_9_CROSS_EVOS - const u32 gMonFrontPic_Dipplin[] = INCBIN_U32("graphics/pokemon/dipplin/front.4bpp.lz"); + const u32 gMonFrontPic_Dipplin[] = INCBIN_U32("graphics/pokemon/dipplin/front.4bpp.smol"); const u16 gMonPalette_Dipplin[] = INCBIN_U16("graphics/pokemon/dipplin/normal.gbapal"); - const u32 gMonBackPic_Dipplin[] = INCBIN_U32("graphics/pokemon/dipplin/back.4bpp.lz"); + const u32 gMonBackPic_Dipplin[] = INCBIN_U32("graphics/pokemon/dipplin/back.4bpp.smol"); const u16 gMonShinyPalette_Dipplin[] = INCBIN_U16("graphics/pokemon/dipplin/shiny.gbapal"); const u8 gMonIcon_Dipplin[] = INCBIN_U8("graphics/pokemon/dipplin/icon.4bpp"); #if P_FOOTPRINTS @@ -23280,9 +23334,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Hydrapple[] = INCBIN_U32("graphics/pokemon/hydrapple/front.4bpp.lz"); + const u32 gMonFrontPic_Hydrapple[] = INCBIN_U32("graphics/pokemon/hydrapple/front.4bpp.smol"); const u16 gMonPalette_Hydrapple[] = INCBIN_U16("graphics/pokemon/hydrapple/normal.gbapal"); - const u32 gMonBackPic_Hydrapple[] = INCBIN_U32("graphics/pokemon/hydrapple/back.4bpp.lz"); + const u32 gMonBackPic_Hydrapple[] = INCBIN_U32("graphics/pokemon/hydrapple/back.4bpp.smol"); const u16 gMonShinyPalette_Hydrapple[] = INCBIN_U16("graphics/pokemon/hydrapple/shiny.gbapal"); const u8 gMonIcon_Hydrapple[] = INCBIN_U8("graphics/pokemon/hydrapple/icon.4bpp"); #if P_FOOTPRINTS @@ -23299,9 +23353,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_APPLIN #if P_FAMILY_SILICOBRA - const u32 gMonFrontPic_Silicobra[] = INCBIN_U32("graphics/pokemon/silicobra/front.4bpp.lz"); + const u32 gMonFrontPic_Silicobra[] = INCBIN_U32("graphics/pokemon/silicobra/front.4bpp.smol"); const u16 gMonPalette_Silicobra[] = INCBIN_U16("graphics/pokemon/silicobra/normal.gbapal"); - const u32 gMonBackPic_Silicobra[] = INCBIN_U32("graphics/pokemon/silicobra/back.4bpp.lz"); + const u32 gMonBackPic_Silicobra[] = INCBIN_U32("graphics/pokemon/silicobra/back.4bpp.smol"); const u16 gMonShinyPalette_Silicobra[] = INCBIN_U16("graphics/pokemon/silicobra/shiny.gbapal"); const u8 gMonIcon_Silicobra[] = INCBIN_U8("graphics/pokemon/silicobra/icon.4bpp"); #if P_FOOTPRINTS @@ -23315,9 +23369,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Sandaconda[] = INCBIN_U32("graphics/pokemon/sandaconda/front.4bpp.lz"); + const u32 gMonFrontPic_Sandaconda[] = INCBIN_U32("graphics/pokemon/sandaconda/front.4bpp.smol"); const u16 gMonPalette_Sandaconda[] = INCBIN_U16("graphics/pokemon/sandaconda/normal.gbapal"); - const u32 gMonBackPic_Sandaconda[] = INCBIN_U32("graphics/pokemon/sandaconda/back.4bpp.lz"); + const u32 gMonBackPic_Sandaconda[] = INCBIN_U32("graphics/pokemon/sandaconda/back.4bpp.smol"); const u16 gMonShinyPalette_Sandaconda[] = INCBIN_U16("graphics/pokemon/sandaconda/shiny.gbapal"); const u8 gMonIcon_Sandaconda[] = INCBIN_U8("graphics/pokemon/sandaconda/icon.4bpp"); #if P_FOOTPRINTS @@ -23332,8 +23386,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_SandacondaGmax[] = INCBIN_U32("graphics/pokemon/sandaconda/gmax/front.4bpp.lz"); - const u32 gMonBackPic_SandacondaGmax[] = INCBIN_U32("graphics/pokemon/sandaconda/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_SandacondaGmax[] = INCBIN_U32("graphics/pokemon/sandaconda/gmax/front.4bpp.smol"); + const u32 gMonBackPic_SandacondaGmax[] = INCBIN_U32("graphics/pokemon/sandaconda/gmax/back.4bpp.smol"); const u16 gMonPalette_SandacondaGmax[] = INCBIN_U16("graphics/pokemon/sandaconda/gmax/normal.gbapal"); const u16 gMonShinyPalette_SandacondaGmax[] = INCBIN_U16("graphics/pokemon/sandaconda/gmax/shiny.gbapal"); const u8 gMonIcon_SandacondaGmax[] = INCBIN_U8("graphics/pokemon/sandaconda/gmax/icon.4bpp"); @@ -23348,9 +23402,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SILICOBRA #if P_FAMILY_CRAMORANT - const u32 gMonFrontPic_Cramorant[] = INCBIN_U32("graphics/pokemon/cramorant/front.4bpp.lz"); + const u32 gMonFrontPic_Cramorant[] = INCBIN_U32("graphics/pokemon/cramorant/front.4bpp.smol"); const u16 gMonPalette_Cramorant[] = INCBIN_U16("graphics/pokemon/cramorant/normal.gbapal"); - const u32 gMonBackPic_Cramorant[] = INCBIN_U32("graphics/pokemon/cramorant/back.4bpp.lz"); + const u32 gMonBackPic_Cramorant[] = INCBIN_U32("graphics/pokemon/cramorant/back.4bpp.smol"); const u16 gMonShinyPalette_Cramorant[] = INCBIN_U16("graphics/pokemon/cramorant/shiny.gbapal"); const u8 gMonIcon_Cramorant[] = INCBIN_U8("graphics/pokemon/cramorant/icon.4bpp"); #if P_FOOTPRINTS @@ -23364,9 +23418,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_CramorantGulping[] = INCBIN_U32("graphics/pokemon/cramorant/gulping/front.4bpp.lz"); + const u32 gMonFrontPic_CramorantGulping[] = INCBIN_U32("graphics/pokemon/cramorant/gulping/front.4bpp.smol"); const u16 gMonPalette_CramorantGulping[] = INCBIN_U16("graphics/pokemon/cramorant/gulping/normal.gbapal"); - const u32 gMonBackPic_CramorantGulping[] = INCBIN_U32("graphics/pokemon/cramorant/gulping/back.4bpp.lz"); + const u32 gMonBackPic_CramorantGulping[] = INCBIN_U32("graphics/pokemon/cramorant/gulping/back.4bpp.smol"); const u16 gMonShinyPalette_CramorantGulping[] = INCBIN_U16("graphics/pokemon/cramorant/gulping/shiny.gbapal"); const u8 gMonIcon_CramorantGulping[] = INCBIN_U8("graphics/pokemon/cramorant/gulping/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -23377,9 +23431,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_CramorantGorging[] = INCBIN_U32("graphics/pokemon/cramorant/gorging/front.4bpp.lz"); + const u32 gMonFrontPic_CramorantGorging[] = INCBIN_U32("graphics/pokemon/cramorant/gorging/front.4bpp.smol"); const u16 gMonPalette_CramorantGorging[] = INCBIN_U16("graphics/pokemon/cramorant/gorging/normal.gbapal"); - const u32 gMonBackPic_CramorantGorging[] = INCBIN_U32("graphics/pokemon/cramorant/gorging/back.4bpp.lz"); + const u32 gMonBackPic_CramorantGorging[] = INCBIN_U32("graphics/pokemon/cramorant/gorging/back.4bpp.smol"); const u16 gMonShinyPalette_CramorantGorging[] = INCBIN_U16("graphics/pokemon/cramorant/gorging/shiny.gbapal"); const u8 gMonIcon_CramorantGorging[] = INCBIN_U8("graphics/pokemon/cramorant/gorging/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -23392,9 +23446,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CRAMORANT #if P_FAMILY_ARROKUDA - const u32 gMonFrontPic_Arrokuda[] = INCBIN_U32("graphics/pokemon/arrokuda/front.4bpp.lz"); + const u32 gMonFrontPic_Arrokuda[] = INCBIN_U32("graphics/pokemon/arrokuda/front.4bpp.smol"); const u16 gMonPalette_Arrokuda[] = INCBIN_U16("graphics/pokemon/arrokuda/normal.gbapal"); - const u32 gMonBackPic_Arrokuda[] = INCBIN_U32("graphics/pokemon/arrokuda/back.4bpp.lz"); + const u32 gMonBackPic_Arrokuda[] = INCBIN_U32("graphics/pokemon/arrokuda/back.4bpp.smol"); const u16 gMonShinyPalette_Arrokuda[] = INCBIN_U16("graphics/pokemon/arrokuda/shiny.gbapal"); const u8 gMonIcon_Arrokuda[] = INCBIN_U8("graphics/pokemon/arrokuda/icon.4bpp"); #if P_FOOTPRINTS @@ -23408,9 +23462,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Barraskewda[] = INCBIN_U32("graphics/pokemon/barraskewda/front.4bpp.lz"); + const u32 gMonFrontPic_Barraskewda[] = INCBIN_U32("graphics/pokemon/barraskewda/front.4bpp.smol"); const u16 gMonPalette_Barraskewda[] = INCBIN_U16("graphics/pokemon/barraskewda/normal.gbapal"); - const u32 gMonBackPic_Barraskewda[] = INCBIN_U32("graphics/pokemon/barraskewda/back.4bpp.lz"); + const u32 gMonBackPic_Barraskewda[] = INCBIN_U32("graphics/pokemon/barraskewda/back.4bpp.smol"); const u16 gMonShinyPalette_Barraskewda[] = INCBIN_U16("graphics/pokemon/barraskewda/shiny.gbapal"); const u8 gMonIcon_Barraskewda[] = INCBIN_U8("graphics/pokemon/barraskewda/icon.4bpp"); #if P_FOOTPRINTS @@ -23426,9 +23480,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ARROKUDA #if P_FAMILY_TOXEL - const u32 gMonFrontPic_Toxel[] = INCBIN_U32("graphics/pokemon/toxel/front.4bpp.lz"); + const u32 gMonFrontPic_Toxel[] = INCBIN_U32("graphics/pokemon/toxel/front.4bpp.smol"); const u16 gMonPalette_Toxel[] = INCBIN_U16("graphics/pokemon/toxel/normal.gbapal"); - const u32 gMonBackPic_Toxel[] = INCBIN_U32("graphics/pokemon/toxel/back.4bpp.lz"); + const u32 gMonBackPic_Toxel[] = INCBIN_U32("graphics/pokemon/toxel/back.4bpp.smol"); const u16 gMonShinyPalette_Toxel[] = INCBIN_U16("graphics/pokemon/toxel/shiny.gbapal"); const u8 gMonIcon_Toxel[] = INCBIN_U8("graphics/pokemon/toxel/icon.4bpp"); #if P_FOOTPRINTS @@ -23442,9 +23496,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_ToxtricityAmped[] = INCBIN_U32("graphics/pokemon/toxtricity/front.4bpp.lz"); + const u32 gMonFrontPic_ToxtricityAmped[] = INCBIN_U32("graphics/pokemon/toxtricity/front.4bpp.smol"); const u16 gMonPalette_ToxtricityAmped[] = INCBIN_U16("graphics/pokemon/toxtricity/normal.gbapal"); - const u32 gMonBackPic_ToxtricityAmped[] = INCBIN_U32("graphics/pokemon/toxtricity/back.4bpp.lz"); + const u32 gMonBackPic_ToxtricityAmped[] = INCBIN_U32("graphics/pokemon/toxtricity/back.4bpp.smol"); const u16 gMonShinyPalette_ToxtricityAmped[] = INCBIN_U16("graphics/pokemon/toxtricity/shiny.gbapal"); const u8 gMonIcon_ToxtricityAmped[] = INCBIN_U8("graphics/pokemon/toxtricity/icon.4bpp"); #if P_FOOTPRINTS @@ -23458,9 +23512,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_ToxtricityLowKey[] = INCBIN_U32("graphics/pokemon/toxtricity/low_key/front.4bpp.lz"); + const u32 gMonFrontPic_ToxtricityLowKey[] = INCBIN_U32("graphics/pokemon/toxtricity/low_key/front.4bpp.smol"); const u16 gMonPalette_ToxtricityLowKey[] = INCBIN_U16("graphics/pokemon/toxtricity/low_key/normal.gbapal"); - const u32 gMonBackPic_ToxtricityLowKey[] = INCBIN_U32("graphics/pokemon/toxtricity/low_key/back.4bpp.lz"); + const u32 gMonBackPic_ToxtricityLowKey[] = INCBIN_U32("graphics/pokemon/toxtricity/low_key/back.4bpp.smol"); const u16 gMonShinyPalette_ToxtricityLowKey[] = INCBIN_U16("graphics/pokemon/toxtricity/low_key/shiny.gbapal"); const u8 gMonIcon_ToxtricityLowKey[] = INCBIN_U8("graphics/pokemon/toxtricity/low_key/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -23472,8 +23526,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_ToxtricityGmax[] = INCBIN_U32("graphics/pokemon/toxtricity/gmax/front.4bpp.lz"); - const u32 gMonBackPic_ToxtricityGmax[] = INCBIN_U32("graphics/pokemon/toxtricity/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_ToxtricityGmax[] = INCBIN_U32("graphics/pokemon/toxtricity/gmax/front.4bpp.smol"); + const u32 gMonBackPic_ToxtricityGmax[] = INCBIN_U32("graphics/pokemon/toxtricity/gmax/back.4bpp.smol"); const u16 gMonPalette_ToxtricityGmax[] = INCBIN_U16("graphics/pokemon/toxtricity/gmax/normal.gbapal"); const u16 gMonShinyPalette_ToxtricityGmax[] = INCBIN_U16("graphics/pokemon/toxtricity/gmax/shiny.gbapal"); const u8 gMonIcon_ToxtricityGmax[] = INCBIN_U8("graphics/pokemon/toxtricity/gmax/icon.4bpp"); @@ -23488,9 +23542,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TOXEL #if P_FAMILY_SIZZLIPEDE - const u32 gMonFrontPic_Sizzlipede[] = INCBIN_U32("graphics/pokemon/sizzlipede/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sizzlipede[] = INCBIN_U32("graphics/pokemon/sizzlipede/anim_front.4bpp.smol"); const u16 gMonPalette_Sizzlipede[] = INCBIN_U16("graphics/pokemon/sizzlipede/normal.gbapal"); - const u32 gMonBackPic_Sizzlipede[] = INCBIN_U32("graphics/pokemon/sizzlipede/back.4bpp.lz"); + const u32 gMonBackPic_Sizzlipede[] = INCBIN_U32("graphics/pokemon/sizzlipede/back.4bpp.smol"); const u16 gMonShinyPalette_Sizzlipede[] = INCBIN_U16("graphics/pokemon/sizzlipede/shiny.gbapal"); const u8 gMonIcon_Sizzlipede[] = INCBIN_U8("graphics/pokemon/sizzlipede/icon.4bpp"); #if P_FOOTPRINTS @@ -23504,9 +23558,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Centiskorch[] = INCBIN_U32("graphics/pokemon/centiskorch/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Centiskorch[] = INCBIN_U32("graphics/pokemon/centiskorch/anim_front.4bpp.smol"); const u16 gMonPalette_Centiskorch[] = INCBIN_U16("graphics/pokemon/centiskorch/normal.gbapal"); - const u32 gMonBackPic_Centiskorch[] = INCBIN_U32("graphics/pokemon/centiskorch/back.4bpp.lz"); + const u32 gMonBackPic_Centiskorch[] = INCBIN_U32("graphics/pokemon/centiskorch/back.4bpp.smol"); const u16 gMonShinyPalette_Centiskorch[] = INCBIN_U16("graphics/pokemon/centiskorch/shiny.gbapal"); const u8 gMonIcon_Centiskorch[] = INCBIN_U8("graphics/pokemon/centiskorch/icon.4bpp"); #if P_FOOTPRINTS @@ -23521,8 +23575,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_CentiskorchGmax[] = INCBIN_U32("graphics/pokemon/centiskorch/gmax/front.4bpp.lz"); - const u32 gMonBackPic_CentiskorchGmax[] = INCBIN_U32("graphics/pokemon/centiskorch/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_CentiskorchGmax[] = INCBIN_U32("graphics/pokemon/centiskorch/gmax/front.4bpp.smol"); + const u32 gMonBackPic_CentiskorchGmax[] = INCBIN_U32("graphics/pokemon/centiskorch/gmax/back.4bpp.smol"); const u16 gMonPalette_CentiskorchGmax[] = INCBIN_U16("graphics/pokemon/centiskorch/gmax/normal.gbapal"); const u16 gMonShinyPalette_CentiskorchGmax[] = INCBIN_U16("graphics/pokemon/centiskorch/gmax/shiny.gbapal"); const u8 gMonIcon_CentiskorchGmax[] = INCBIN_U8("graphics/pokemon/centiskorch/gmax/icon.4bpp"); @@ -23537,9 +23591,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SIZZLIPEDE #if P_FAMILY_CLOBBOPUS - const u32 gMonFrontPic_Clobbopus[] = INCBIN_U32("graphics/pokemon/clobbopus/front.4bpp.lz"); + const u32 gMonFrontPic_Clobbopus[] = INCBIN_U32("graphics/pokemon/clobbopus/front.4bpp.smol"); const u16 gMonPalette_Clobbopus[] = INCBIN_U16("graphics/pokemon/clobbopus/normal.gbapal"); - const u32 gMonBackPic_Clobbopus[] = INCBIN_U32("graphics/pokemon/clobbopus/back.4bpp.lz"); + const u32 gMonBackPic_Clobbopus[] = INCBIN_U32("graphics/pokemon/clobbopus/back.4bpp.smol"); const u16 gMonShinyPalette_Clobbopus[] = INCBIN_U16("graphics/pokemon/clobbopus/shiny.gbapal"); const u8 gMonIcon_Clobbopus[] = INCBIN_U8("graphics/pokemon/clobbopus/icon.4bpp"); #if P_FOOTPRINTS @@ -23553,9 +23607,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Grapploct[] = INCBIN_U32("graphics/pokemon/grapploct/front.4bpp.lz"); + const u32 gMonFrontPic_Grapploct[] = INCBIN_U32("graphics/pokemon/grapploct/front.4bpp.smol"); const u16 gMonPalette_Grapploct[] = INCBIN_U16("graphics/pokemon/grapploct/normal.gbapal"); - const u32 gMonBackPic_Grapploct[] = INCBIN_U32("graphics/pokemon/grapploct/back.4bpp.lz"); + const u32 gMonBackPic_Grapploct[] = INCBIN_U32("graphics/pokemon/grapploct/back.4bpp.smol"); const u16 gMonShinyPalette_Grapploct[] = INCBIN_U16("graphics/pokemon/grapploct/shiny.gbapal"); const u8 gMonIcon_Grapploct[] = INCBIN_U8("graphics/pokemon/grapploct/icon.4bpp"); #if P_FOOTPRINTS @@ -23571,9 +23625,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CLOBBOPUS #if P_FAMILY_SINISTEA - const u32 gMonFrontPic_Sinistea[] = INCBIN_U32("graphics/pokemon/sinistea/front.4bpp.lz"); + const u32 gMonFrontPic_Sinistea[] = INCBIN_U32("graphics/pokemon/sinistea/front.4bpp.smol"); const u16 gMonPalette_Sinistea[] = INCBIN_U16("graphics/pokemon/sinistea/normal.gbapal"); - const u32 gMonBackPic_Sinistea[] = INCBIN_U32("graphics/pokemon/sinistea/back.4bpp.lz"); + const u32 gMonBackPic_Sinistea[] = INCBIN_U32("graphics/pokemon/sinistea/back.4bpp.smol"); const u16 gMonShinyPalette_Sinistea[] = INCBIN_U16("graphics/pokemon/sinistea/shiny.gbapal"); const u8 gMonIcon_Sinistea[] = INCBIN_U8("graphics/pokemon/sinistea/icon.4bpp"); #if P_FOOTPRINTS @@ -23587,9 +23641,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Polteageist[] = INCBIN_U32("graphics/pokemon/polteageist/front.4bpp.lz"); + const u32 gMonFrontPic_Polteageist[] = INCBIN_U32("graphics/pokemon/polteageist/front.4bpp.smol"); const u16 gMonPalette_Polteageist[] = INCBIN_U16("graphics/pokemon/polteageist/normal.gbapal"); - const u32 gMonBackPic_Polteageist[] = INCBIN_U32("graphics/pokemon/polteageist/back.4bpp.lz"); + const u32 gMonBackPic_Polteageist[] = INCBIN_U32("graphics/pokemon/polteageist/back.4bpp.smol"); const u16 gMonShinyPalette_Polteageist[] = INCBIN_U16("graphics/pokemon/polteageist/shiny.gbapal"); const u8 gMonIcon_Polteageist[] = INCBIN_U8("graphics/pokemon/polteageist/icon.4bpp"); #if P_FOOTPRINTS @@ -23605,9 +23659,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SINISTEA #if P_FAMILY_HATENNA - const u32 gMonFrontPic_Hatenna[] = INCBIN_U32("graphics/pokemon/hatenna/front.4bpp.lz"); + const u32 gMonFrontPic_Hatenna[] = INCBIN_U32("graphics/pokemon/hatenna/front.4bpp.smol"); const u16 gMonPalette_Hatenna[] = INCBIN_U16("graphics/pokemon/hatenna/normal.gbapal"); - const u32 gMonBackPic_Hatenna[] = INCBIN_U32("graphics/pokemon/hatenna/back.4bpp.lz"); + const u32 gMonBackPic_Hatenna[] = INCBIN_U32("graphics/pokemon/hatenna/back.4bpp.smol"); const u16 gMonShinyPalette_Hatenna[] = INCBIN_U16("graphics/pokemon/hatenna/shiny.gbapal"); const u8 gMonIcon_Hatenna[] = INCBIN_U8("graphics/pokemon/hatenna/icon.4bpp"); #if P_FOOTPRINTS @@ -23621,9 +23675,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Hattrem[] = INCBIN_U32("graphics/pokemon/hattrem/front.4bpp.lz"); + const u32 gMonFrontPic_Hattrem[] = INCBIN_U32("graphics/pokemon/hattrem/front.4bpp.smol"); const u16 gMonPalette_Hattrem[] = INCBIN_U16("graphics/pokemon/hattrem/normal.gbapal"); - const u32 gMonBackPic_Hattrem[] = INCBIN_U32("graphics/pokemon/hattrem/back.4bpp.lz"); + const u32 gMonBackPic_Hattrem[] = INCBIN_U32("graphics/pokemon/hattrem/back.4bpp.smol"); const u16 gMonShinyPalette_Hattrem[] = INCBIN_U16("graphics/pokemon/hattrem/shiny.gbapal"); const u8 gMonIcon_Hattrem[] = INCBIN_U8("graphics/pokemon/hattrem/icon.4bpp"); #if P_FOOTPRINTS @@ -23637,9 +23691,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Hatterene[] = INCBIN_U32("graphics/pokemon/hatterene/front.4bpp.lz"); + const u32 gMonFrontPic_Hatterene[] = INCBIN_U32("graphics/pokemon/hatterene/front.4bpp.smol"); const u16 gMonPalette_Hatterene[] = INCBIN_U16("graphics/pokemon/hatterene/normal.gbapal"); - const u32 gMonBackPic_Hatterene[] = INCBIN_U32("graphics/pokemon/hatterene/back.4bpp.lz"); + const u32 gMonBackPic_Hatterene[] = INCBIN_U32("graphics/pokemon/hatterene/back.4bpp.smol"); const u16 gMonShinyPalette_Hatterene[] = INCBIN_U16("graphics/pokemon/hatterene/shiny.gbapal"); const u8 gMonIcon_Hatterene[] = INCBIN_U8("graphics/pokemon/hatterene/icon.4bpp"); #if P_FOOTPRINTS @@ -23654,8 +23708,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_HattereneGmax[] = INCBIN_U32("graphics/pokemon/hatterene/gmax/front.4bpp.lz"); - const u32 gMonBackPic_HattereneGmax[] = INCBIN_U32("graphics/pokemon/hatterene/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_HattereneGmax[] = INCBIN_U32("graphics/pokemon/hatterene/gmax/front.4bpp.smol"); + const u32 gMonBackPic_HattereneGmax[] = INCBIN_U32("graphics/pokemon/hatterene/gmax/back.4bpp.smol"); const u16 gMonPalette_HattereneGmax[] = INCBIN_U16("graphics/pokemon/hatterene/gmax/normal.gbapal"); const u16 gMonShinyPalette_HattereneGmax[] = INCBIN_U16("graphics/pokemon/hatterene/gmax/shiny.gbapal"); const u8 gMonIcon_HattereneGmax[] = INCBIN_U8("graphics/pokemon/hatterene/gmax/icon.4bpp"); @@ -23670,9 +23724,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_HATENNA #if P_FAMILY_IMPIDIMP - const u32 gMonFrontPic_Impidimp[] = INCBIN_U32("graphics/pokemon/impidimp/front.4bpp.lz"); + const u32 gMonFrontPic_Impidimp[] = INCBIN_U32("graphics/pokemon/impidimp/front.4bpp.smol"); const u16 gMonPalette_Impidimp[] = INCBIN_U16("graphics/pokemon/impidimp/normal.gbapal"); - const u32 gMonBackPic_Impidimp[] = INCBIN_U32("graphics/pokemon/impidimp/back.4bpp.lz"); + const u32 gMonBackPic_Impidimp[] = INCBIN_U32("graphics/pokemon/impidimp/back.4bpp.smol"); const u16 gMonShinyPalette_Impidimp[] = INCBIN_U16("graphics/pokemon/impidimp/shiny.gbapal"); const u8 gMonIcon_Impidimp[] = INCBIN_U8("graphics/pokemon/impidimp/icon.4bpp"); #if P_FOOTPRINTS @@ -23686,9 +23740,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Morgrem[] = INCBIN_U32("graphics/pokemon/morgrem/front.4bpp.lz"); + const u32 gMonFrontPic_Morgrem[] = INCBIN_U32("graphics/pokemon/morgrem/front.4bpp.smol"); const u16 gMonPalette_Morgrem[] = INCBIN_U16("graphics/pokemon/morgrem/normal.gbapal"); - const u32 gMonBackPic_Morgrem[] = INCBIN_U32("graphics/pokemon/morgrem/back.4bpp.lz"); + const u32 gMonBackPic_Morgrem[] = INCBIN_U32("graphics/pokemon/morgrem/back.4bpp.smol"); const u16 gMonShinyPalette_Morgrem[] = INCBIN_U16("graphics/pokemon/morgrem/shiny.gbapal"); const u8 gMonIcon_Morgrem[] = INCBIN_U8("graphics/pokemon/morgrem/icon.4bpp"); #if P_FOOTPRINTS @@ -23702,9 +23756,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Grimmsnarl[] = INCBIN_U32("graphics/pokemon/grimmsnarl/front.4bpp.lz"); + const u32 gMonFrontPic_Grimmsnarl[] = INCBIN_U32("graphics/pokemon/grimmsnarl/front.4bpp.smol"); const u16 gMonPalette_Grimmsnarl[] = INCBIN_U16("graphics/pokemon/grimmsnarl/normal.gbapal"); - const u32 gMonBackPic_Grimmsnarl[] = INCBIN_U32("graphics/pokemon/grimmsnarl/back.4bpp.lz"); + const u32 gMonBackPic_Grimmsnarl[] = INCBIN_U32("graphics/pokemon/grimmsnarl/back.4bpp.smol"); const u16 gMonShinyPalette_Grimmsnarl[] = INCBIN_U16("graphics/pokemon/grimmsnarl/shiny.gbapal"); const u8 gMonIcon_Grimmsnarl[] = INCBIN_U8("graphics/pokemon/grimmsnarl/icon.4bpp"); #if P_FOOTPRINTS @@ -23719,8 +23773,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_GrimmsnarlGmax[] = INCBIN_U32("graphics/pokemon/grimmsnarl/gmax/front.4bpp.lz"); - const u32 gMonBackPic_GrimmsnarlGmax[] = INCBIN_U32("graphics/pokemon/grimmsnarl/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_GrimmsnarlGmax[] = INCBIN_U32("graphics/pokemon/grimmsnarl/gmax/front.4bpp.smol"); + const u32 gMonBackPic_GrimmsnarlGmax[] = INCBIN_U32("graphics/pokemon/grimmsnarl/gmax/back.4bpp.smol"); const u16 gMonPalette_GrimmsnarlGmax[] = INCBIN_U16("graphics/pokemon/grimmsnarl/gmax/normal.gbapal"); const u16 gMonShinyPalette_GrimmsnarlGmax[] = INCBIN_U16("graphics/pokemon/grimmsnarl/gmax/shiny.gbapal"); const u8 gMonIcon_GrimmsnarlGmax[] = INCBIN_U8("graphics/pokemon/grimmsnarl/gmax/icon.4bpp"); @@ -23735,9 +23789,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IMPIDIMP #if P_FAMILY_MILCERY - const u32 gMonFrontPic_Milcery[] = INCBIN_U32("graphics/pokemon/milcery/front.4bpp.lz"); + const u32 gMonFrontPic_Milcery[] = INCBIN_U32("graphics/pokemon/milcery/front.4bpp.smol"); const u16 gMonPalette_Milcery[] = INCBIN_U16("graphics/pokemon/milcery/normal.gbapal"); - const u32 gMonBackPic_Milcery[] = INCBIN_U32("graphics/pokemon/milcery/back.4bpp.lz"); + const u32 gMonBackPic_Milcery[] = INCBIN_U32("graphics/pokemon/milcery/back.4bpp.smol"); const u16 gMonShinyPalette_Milcery[] = INCBIN_U16("graphics/pokemon/milcery/shiny.gbapal"); const u8 gMonIcon_Milcery[] = INCBIN_U8("graphics/pokemon/milcery/icon.4bpp"); #if P_FOOTPRINTS @@ -23750,8 +23804,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u16 gShinyOverworldPalette_Milcery[] = INCBIN_U16("graphics/pokemon/milcery/overworld_shiny.gbapal"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Alcremie[] = INCBIN_U32("graphics/pokemon/alcremie/front.4bpp.lz"); - const u32 gMonBackPic_Alcremie[] = INCBIN_U32("graphics/pokemon/alcremie/back.4bpp.lz"); + const u32 gMonFrontPic_Alcremie[] = INCBIN_U32("graphics/pokemon/alcremie/front.4bpp.smol"); + const u32 gMonBackPic_Alcremie[] = INCBIN_U32("graphics/pokemon/alcremie/back.4bpp.smol"); const u16 gMonPalette_Alcremie[] = INCBIN_U16("graphics/pokemon/alcremie/normal.gbapal"); const u16 gMonShinyPalette_Alcremie[] = INCBIN_U16("graphics/pokemon/alcremie/shiny.gbapal"); @@ -23765,7 +23819,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ //const u8 gMonIcon_AlcremieStrawberryCaramelSwirl[] = INCBIN_U8("graphics/pokemon/alcremie/caramel_swirl/icon.4bpp"); //const u8 gMonIcon_AlcremieStrawberryRainbowSwirl[] = INCBIN_U8("graphics/pokemon/alcremie/rainbow_swirl/icon.4bpp"); - const u32 gMonFrontPic_AlcremieStrawberry[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/front.4bpp.lz"); + const u32 gMonFrontPic_AlcremieStrawberry[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/front.4bpp.smol"); const u16 gMonPalette_AlcremieStrawberryVanillaCream[] = INCBIN_U16("graphics/pokemon/alcremie/strawberry/strawberry_default.gbapal"); const u16 gMonPalette_AlcremieStrawberryRubyCream[] = INCBIN_U16("graphics/pokemon/alcremie/strawberry/strawberry_ruby_cream.gbapal"); const u16 gMonPalette_AlcremieStrawberryMatchaCream[] = INCBIN_U16("graphics/pokemon/alcremie/strawberry/strawberry_matcha_cream.gbapal"); @@ -23775,13 +23829,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u16 gMonPalette_AlcremieStrawberryRubySwirl[] = INCBIN_U16("graphics/pokemon/alcremie/strawberry/strawberry_ruby_swirl.gbapal"); const u16 gMonPalette_AlcremieStrawberryCaramelSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/strawberry/strawberry_caramel_swirl.gbapal"); const u16 gMonPalette_AlcremieStrawberryRainbowSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/strawberry/strawberry_rainbow_swirl.gbapal"); - const u32 gMonBackPic_AlcremieStrawberry[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/back.4bpp.lz"); + const u32 gMonBackPic_AlcremieStrawberry[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/back.4bpp.smol"); const u16 gMonShinyPalette_AlcremieStrawberry[] = INCBIN_U16("graphics/pokemon/alcremie/strawberry/strawberry_shiny.gbapal"); #if P_FOOTPRINTS const u8 gMonFootprint_Alcremie[] = INCBIN_U8("graphics/pokemon/alcremie/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_AlcremieBerry[] = INCBIN_U32("graphics/pokemon/alcremie/berry/front.4bpp.lz"); + const u32 gMonFrontPic_AlcremieBerry[] = INCBIN_U32("graphics/pokemon/alcremie/berry/front.4bpp.smol"); const u16 gMonPalette_AlcremieBerryVanillaCream[] = INCBIN_U16("graphics/pokemon/alcremie/berry/berry_default.gbapal"); const u16 gMonPalette_AlcremieBerryRubyCream[] = INCBIN_U16("graphics/pokemon/alcremie/berry/berry_ruby_cream.gbapal"); const u16 gMonPalette_AlcremieBerryMatchaCream[] = INCBIN_U16("graphics/pokemon/alcremie/berry/berry_matcha_cream.gbapal"); @@ -23791,10 +23845,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u16 gMonPalette_AlcremieBerryRubySwirl[] = INCBIN_U16("graphics/pokemon/alcremie/berry/berry_ruby_swirl.gbapal"); const u16 gMonPalette_AlcremieBerryCaramelSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/berry/berry_caramel_swirl.gbapal"); const u16 gMonPalette_AlcremieBerryRainbowSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/berry/berry_rainbow_swirl.gbapal"); - const u32 gMonBackPic_AlcremieBerry[] = INCBIN_U32("graphics/pokemon/alcremie/berry/back.4bpp.lz"); + const u32 gMonBackPic_AlcremieBerry[] = INCBIN_U32("graphics/pokemon/alcremie/berry/back.4bpp.smol"); const u16 gMonShinyPalette_AlcremieBerry[] = INCBIN_U16("graphics/pokemon/alcremie/berry/berry_shiny.gbapal"); - const u32 gMonFrontPic_AlcremieLove[] = INCBIN_U32("graphics/pokemon/alcremie/love/front.4bpp.lz"); + const u32 gMonFrontPic_AlcremieLove[] = INCBIN_U32("graphics/pokemon/alcremie/love/front.4bpp.smol"); const u16 gMonPalette_AlcremieLoveVanillaCream[] = INCBIN_U16("graphics/pokemon/alcremie/love/love_default.gbapal"); const u16 gMonPalette_AlcremieLoveRubyCream[] = INCBIN_U16("graphics/pokemon/alcremie/love/love_ruby_cream.gbapal"); const u16 gMonPalette_AlcremieLoveMatchaCream[] = INCBIN_U16("graphics/pokemon/alcremie/love/love_matcha_cream.gbapal"); @@ -23804,10 +23858,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u16 gMonPalette_AlcremieLoveRubySwirl[] = INCBIN_U16("graphics/pokemon/alcremie/love/love_ruby_swirl.gbapal"); const u16 gMonPalette_AlcremieLoveCaramelSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/love/love_caramel_swirl.gbapal"); const u16 gMonPalette_AlcremieLoveRainbowSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/love/love_rainbow_swirl.gbapal"); - const u32 gMonBackPic_AlcremieLove[] = INCBIN_U32("graphics/pokemon/alcremie/love/back.4bpp.lz"); + const u32 gMonBackPic_AlcremieLove[] = INCBIN_U32("graphics/pokemon/alcremie/love/back.4bpp.smol"); const u16 gMonShinyPalette_AlcremieLove[] = INCBIN_U16("graphics/pokemon/alcremie/love/love_shiny.gbapal"); - const u32 gMonFrontPic_AlcremieStar[] = INCBIN_U32("graphics/pokemon/alcremie/star/front.4bpp.lz"); + const u32 gMonFrontPic_AlcremieStar[] = INCBIN_U32("graphics/pokemon/alcremie/star/front.4bpp.smol"); const u16 gMonPalette_AlcremieStarVanillaCream[] = INCBIN_U16("graphics/pokemon/alcremie/star/star_default.gbapal"); const u16 gMonPalette_AlcremieStarRubyCream[] = INCBIN_U16("graphics/pokemon/alcremie/star/star_ruby_cream.gbapal"); const u16 gMonPalette_AlcremieStarMatchaCream[] = INCBIN_U16("graphics/pokemon/alcremie/star/star_matcha_cream.gbapal"); @@ -23817,10 +23871,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u16 gMonPalette_AlcremieStarRubySwirl[] = INCBIN_U16("graphics/pokemon/alcremie/star/star_ruby_swirl.gbapal"); const u16 gMonPalette_AlcremieStarCaramelSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/star/star_caramel_swirl.gbapal"); const u16 gMonPalette_AlcremieStarRainbowSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/star/star_rainbow_swirl.gbapal"); - const u32 gMonBackPic_AlcremieStar[] = INCBIN_U32("graphics/pokemon/alcremie/star/back.4bpp.lz"); + const u32 gMonBackPic_AlcremieStar[] = INCBIN_U32("graphics/pokemon/alcremie/star/back.4bpp.smol"); const u16 gMonShinyPalette_AlcremieStar[] = INCBIN_U16("graphics/pokemon/alcremie/star/star_shiny.gbapal"); - const u32 gMonFrontPic_AlcremieClover[] = INCBIN_U32("graphics/pokemon/alcremie/clover/front.4bpp.lz"); + const u32 gMonFrontPic_AlcremieClover[] = INCBIN_U32("graphics/pokemon/alcremie/clover/front.4bpp.smol"); const u16 gMonPalette_AlcremieCloverVanillaCream[] = INCBIN_U16("graphics/pokemon/alcremie/clover/clover_default.gbapal"); const u16 gMonPalette_AlcremieCloverRubyCream[] = INCBIN_U16("graphics/pokemon/alcremie/clover/clover_ruby_cream.gbapal"); const u16 gMonPalette_AlcremieCloverMatchaCream[] = INCBIN_U16("graphics/pokemon/alcremie/clover/clover_matcha_cream.gbapal"); @@ -23830,10 +23884,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u16 gMonPalette_AlcremieCloverRubySwirl[] = INCBIN_U16("graphics/pokemon/alcremie/clover/clover_ruby_swirl.gbapal"); const u16 gMonPalette_AlcremieCloverCaramelSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/clover/clover_caramel_swirl.gbapal"); const u16 gMonPalette_AlcremieCloverRainbowSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/clover/clover_rainbow_swirl.gbapal"); - const u32 gMonBackPic_AlcremieClover[] = INCBIN_U32("graphics/pokemon/alcremie/clover/back.4bpp.lz"); + const u32 gMonBackPic_AlcremieClover[] = INCBIN_U32("graphics/pokemon/alcremie/clover/back.4bpp.smol"); const u16 gMonShinyPalette_AlcremieClover[] = INCBIN_U16("graphics/pokemon/alcremie/clover/clover_shiny.gbapal"); - const u32 gMonFrontPic_AlcremieFlower[] = INCBIN_U32("graphics/pokemon/alcremie/flower/front.4bpp.lz"); + const u32 gMonFrontPic_AlcremieFlower[] = INCBIN_U32("graphics/pokemon/alcremie/flower/front.4bpp.smol"); const u16 gMonPalette_AlcremieFlowerVanillaCream[] = INCBIN_U16("graphics/pokemon/alcremie/flower/flower_default.gbapal"); const u16 gMonPalette_AlcremieFlowerRubyCream[] = INCBIN_U16("graphics/pokemon/alcremie/flower/flower_ruby_cream.gbapal"); const u16 gMonPalette_AlcremieFlowerMatchaCream[] = INCBIN_U16("graphics/pokemon/alcremie/flower/flower_matcha_cream.gbapal"); @@ -23843,10 +23897,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u16 gMonPalette_AlcremieFlowerRubySwirl[] = INCBIN_U16("graphics/pokemon/alcremie/flower/flower_ruby_swirl.gbapal"); const u16 gMonPalette_AlcremieFlowerCaramelSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/flower/flower_caramel_swirl.gbapal"); const u16 gMonPalette_AlcremieFlowerRainbowSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/flower/flower_rainbow_swirl.gbapal"); - const u32 gMonBackPic_AlcremieFlower[] = INCBIN_U32("graphics/pokemon/alcremie/flower/back.4bpp.lz"); + const u32 gMonBackPic_AlcremieFlower[] = INCBIN_U32("graphics/pokemon/alcremie/flower/back.4bpp.smol"); const u16 gMonShinyPalette_AlcremieFlower[] = INCBIN_U16("graphics/pokemon/alcremie/flower/flower_shiny.gbapal"); - const u32 gMonFrontPic_AlcremieRibbon[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/front.4bpp.lz"); + const u32 gMonFrontPic_AlcremieRibbon[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/front.4bpp.smol"); const u16 gMonPalette_AlcremieRibbonVanillaCream[] = INCBIN_U16("graphics/pokemon/alcremie/ribbon/ribbon_default.gbapal"); const u16 gMonPalette_AlcremieRibbonRubyCream[] = INCBIN_U16("graphics/pokemon/alcremie/ribbon/ribbon_ruby_cream.gbapal"); const u16 gMonPalette_AlcremieRibbonMatchaCream[] = INCBIN_U16("graphics/pokemon/alcremie/ribbon/ribbon_matcha_cream.gbapal"); @@ -23856,7 +23910,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u16 gMonPalette_AlcremieRibbonRubySwirl[] = INCBIN_U16("graphics/pokemon/alcremie/ribbon/ribbon_ruby_swirl.gbapal"); const u16 gMonPalette_AlcremieRibbonCaramelSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/ribbon/ribbon_caramel_swirl.gbapal"); const u16 gMonPalette_AlcremieRibbonRainbowSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/ribbon/ribbon_rainbow_swirl.gbapal"); - const u32 gMonBackPic_AlcremieRibbon[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/back.4bpp.lz"); + const u32 gMonBackPic_AlcremieRibbon[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/back.4bpp.smol"); const u16 gMonShinyPalette_AlcremieRibbon[] = INCBIN_U16("graphics/pokemon/alcremie/ribbon/ribbon_shiny.gbapal"); #if OW_POKEMON_OBJECT_EVENTS @@ -23868,8 +23922,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_AlcremieGmax[] = INCBIN_U32("graphics/pokemon/alcremie/gmax/front.4bpp.lz"); - const u32 gMonBackPic_AlcremieGmax[] = INCBIN_U32("graphics/pokemon/alcremie/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_AlcremieGmax[] = INCBIN_U32("graphics/pokemon/alcremie/gmax/front.4bpp.smol"); + const u32 gMonBackPic_AlcremieGmax[] = INCBIN_U32("graphics/pokemon/alcremie/gmax/back.4bpp.smol"); const u16 gMonPalette_AlcremieGmax[] = INCBIN_U16("graphics/pokemon/alcremie/gmax/normal.gbapal"); const u16 gMonShinyPalette_AlcremieGmax[] = INCBIN_U16("graphics/pokemon/alcremie/gmax/shiny.gbapal"); const u8 gMonIcon_AlcremieGmax[] = INCBIN_U8("graphics/pokemon/alcremie/gmax/icon.4bpp"); @@ -23884,9 +23938,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MILCERY #if P_FAMILY_FALINKS - const u32 gMonFrontPic_Falinks[] = INCBIN_U32("graphics/pokemon/falinks/front.4bpp.lz"); + const u32 gMonFrontPic_Falinks[] = INCBIN_U32("graphics/pokemon/falinks/front.4bpp.smol"); const u16 gMonPalette_Falinks[] = INCBIN_U16("graphics/pokemon/falinks/normal.gbapal"); - const u32 gMonBackPic_Falinks[] = INCBIN_U32("graphics/pokemon/falinks/back.4bpp.lz"); + const u32 gMonBackPic_Falinks[] = INCBIN_U32("graphics/pokemon/falinks/back.4bpp.smol"); const u16 gMonShinyPalette_Falinks[] = INCBIN_U16("graphics/pokemon/falinks/shiny.gbapal"); const u8 gMonIcon_Falinks[] = INCBIN_U8("graphics/pokemon/falinks/icon.4bpp"); #if P_FOOTPRINTS @@ -23902,9 +23956,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FALINKS #if P_FAMILY_PINCURCHIN - const u32 gMonFrontPic_Pincurchin[] = INCBIN_U32("graphics/pokemon/pincurchin/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pincurchin[] = INCBIN_U32("graphics/pokemon/pincurchin/anim_front.4bpp.smol"); const u16 gMonPalette_Pincurchin[] = INCBIN_U16("graphics/pokemon/pincurchin/normal.gbapal"); - const u32 gMonBackPic_Pincurchin[] = INCBIN_U32("graphics/pokemon/pincurchin/back.4bpp.lz"); + const u32 gMonBackPic_Pincurchin[] = INCBIN_U32("graphics/pokemon/pincurchin/back.4bpp.smol"); const u16 gMonShinyPalette_Pincurchin[] = INCBIN_U16("graphics/pokemon/pincurchin/shiny.gbapal"); const u8 gMonIcon_Pincurchin[] = INCBIN_U8("graphics/pokemon/pincurchin/icon.4bpp"); #if P_FOOTPRINTS @@ -23920,9 +23974,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PINCURCHIN #if P_FAMILY_SNOM - const u32 gMonFrontPic_Snom[] = INCBIN_U32("graphics/pokemon/snom/front.4bpp.lz"); + const u32 gMonFrontPic_Snom[] = INCBIN_U32("graphics/pokemon/snom/front.4bpp.smol"); const u16 gMonPalette_Snom[] = INCBIN_U16("graphics/pokemon/snom/normal.gbapal"); - const u32 gMonBackPic_Snom[] = INCBIN_U32("graphics/pokemon/snom/back.4bpp.lz"); + const u32 gMonBackPic_Snom[] = INCBIN_U32("graphics/pokemon/snom/back.4bpp.smol"); const u16 gMonShinyPalette_Snom[] = INCBIN_U16("graphics/pokemon/snom/shiny.gbapal"); const u8 gMonIcon_Snom[] = INCBIN_U8("graphics/pokemon/snom/icon.4bpp"); #if P_FOOTPRINTS @@ -23936,9 +23990,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Frosmoth[] = INCBIN_U32("graphics/pokemon/frosmoth/front.4bpp.lz"); + const u32 gMonFrontPic_Frosmoth[] = INCBIN_U32("graphics/pokemon/frosmoth/front.4bpp.smol"); const u16 gMonPalette_Frosmoth[] = INCBIN_U16("graphics/pokemon/frosmoth/normal.gbapal"); - const u32 gMonBackPic_Frosmoth[] = INCBIN_U32("graphics/pokemon/frosmoth/back.4bpp.lz"); + const u32 gMonBackPic_Frosmoth[] = INCBIN_U32("graphics/pokemon/frosmoth/back.4bpp.smol"); const u16 gMonShinyPalette_Frosmoth[] = INCBIN_U16("graphics/pokemon/frosmoth/shiny.gbapal"); const u8 gMonIcon_Frosmoth[] = INCBIN_U8("graphics/pokemon/frosmoth/icon.4bpp"); #if P_FOOTPRINTS @@ -23954,9 +24008,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SNOM #if P_FAMILY_STONJOURNER - const u32 gMonFrontPic_Stonjourner[] = INCBIN_U32("graphics/pokemon/stonjourner/front.4bpp.lz"); + const u32 gMonFrontPic_Stonjourner[] = INCBIN_U32("graphics/pokemon/stonjourner/front.4bpp.smol"); const u16 gMonPalette_Stonjourner[] = INCBIN_U16("graphics/pokemon/stonjourner/normal.gbapal"); - const u32 gMonBackPic_Stonjourner[] = INCBIN_U32("graphics/pokemon/stonjourner/back.4bpp.lz"); + const u32 gMonBackPic_Stonjourner[] = INCBIN_U32("graphics/pokemon/stonjourner/back.4bpp.smol"); const u16 gMonShinyPalette_Stonjourner[] = INCBIN_U16("graphics/pokemon/stonjourner/shiny.gbapal"); const u8 gMonIcon_Stonjourner[] = INCBIN_U8("graphics/pokemon/stonjourner/icon.4bpp"); #if P_FOOTPRINTS @@ -23972,9 +24026,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_STONJOURNER #if P_FAMILY_EISCUE - const u32 gMonFrontPic_EiscueIce[] = INCBIN_U32("graphics/pokemon/eiscue/front.4bpp.lz"); + const u32 gMonFrontPic_EiscueIce[] = INCBIN_U32("graphics/pokemon/eiscue/front.4bpp.smol"); const u16 gMonPalette_EiscueIce[] = INCBIN_U16("graphics/pokemon/eiscue/normal.gbapal"); - const u32 gMonBackPic_EiscueIce[] = INCBIN_U32("graphics/pokemon/eiscue/back.4bpp.lz"); + const u32 gMonBackPic_EiscueIce[] = INCBIN_U32("graphics/pokemon/eiscue/back.4bpp.smol"); const u16 gMonShinyPalette_EiscueIce[] = INCBIN_U16("graphics/pokemon/eiscue/shiny.gbapal"); const u8 gMonIcon_EiscueIce[] = INCBIN_U8("graphics/pokemon/eiscue/icon.4bpp"); #if P_FOOTPRINTS @@ -23988,9 +24042,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_EiscueNoice[] = INCBIN_U32("graphics/pokemon/eiscue/noice_face/front.4bpp.lz"); + const u32 gMonFrontPic_EiscueNoice[] = INCBIN_U32("graphics/pokemon/eiscue/noice_face/front.4bpp.smol"); const u16 gMonPalette_EiscueNoice[] = INCBIN_U16("graphics/pokemon/eiscue/noice_face/normal.gbapal"); - const u32 gMonBackPic_EiscueNoice[] = INCBIN_U32("graphics/pokemon/eiscue/noice_face/back.4bpp.lz"); + const u32 gMonBackPic_EiscueNoice[] = INCBIN_U32("graphics/pokemon/eiscue/noice_face/back.4bpp.smol"); const u16 gMonShinyPalette_EiscueNoice[] = INCBIN_U16("graphics/pokemon/eiscue/noice_face/shiny.gbapal"); const u8 gMonIcon_EiscueNoice[] = INCBIN_U8("graphics/pokemon/eiscue/noice_face/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -24003,9 +24057,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_EISCUE #if P_FAMILY_INDEEDEE - const u32 gMonFrontPic_IndeedeeM[] = INCBIN_U32("graphics/pokemon/indeedee/front.4bpp.lz"); + const u32 gMonFrontPic_IndeedeeM[] = INCBIN_U32("graphics/pokemon/indeedee/front.4bpp.smol"); const u16 gMonPalette_IndeedeeM[] = INCBIN_U16("graphics/pokemon/indeedee/normal.gbapal"); - const u32 gMonBackPic_IndeedeeM[] = INCBIN_U32("graphics/pokemon/indeedee/back.4bpp.lz"); + const u32 gMonBackPic_IndeedeeM[] = INCBIN_U32("graphics/pokemon/indeedee/back.4bpp.smol"); const u16 gMonShinyPalette_IndeedeeM[] = INCBIN_U16("graphics/pokemon/indeedee/shiny.gbapal"); const u8 gMonIcon_IndeedeeM[] = INCBIN_U8("graphics/pokemon/indeedee/icon.4bpp"); #if P_FOOTPRINTS @@ -24019,9 +24073,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_IndeedeeF[] = INCBIN_U32("graphics/pokemon/indeedee/f/front.4bpp.lz"); + const u32 gMonFrontPic_IndeedeeF[] = INCBIN_U32("graphics/pokemon/indeedee/f/front.4bpp.smol"); const u16 gMonPalette_IndeedeeF[] = INCBIN_U16("graphics/pokemon/indeedee/f/normal.gbapal"); - const u32 gMonBackPic_IndeedeeF[] = INCBIN_U32("graphics/pokemon/indeedee/f/back.4bpp.lz"); + const u32 gMonBackPic_IndeedeeF[] = INCBIN_U32("graphics/pokemon/indeedee/f/back.4bpp.smol"); const u16 gMonShinyPalette_IndeedeeF[] = INCBIN_U16("graphics/pokemon/indeedee/f/shiny.gbapal"); const u8 gMonIcon_IndeedeeF[] = INCBIN_U8("graphics/pokemon/indeedee/f/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -24034,9 +24088,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_INDEEDEE #if P_FAMILY_MORPEKO - const u32 gMonFrontPic_MorpekoFullBelly[] = INCBIN_U32("graphics/pokemon/morpeko/front.4bpp.lz"); + const u32 gMonFrontPic_MorpekoFullBelly[] = INCBIN_U32("graphics/pokemon/morpeko/front.4bpp.smol"); const u16 gMonPalette_MorpekoFullBelly[] = INCBIN_U16("graphics/pokemon/morpeko/normal.gbapal"); - const u32 gMonBackPic_MorpekoFullBelly[] = INCBIN_U32("graphics/pokemon/morpeko/back.4bpp.lz"); + const u32 gMonBackPic_MorpekoFullBelly[] = INCBIN_U32("graphics/pokemon/morpeko/back.4bpp.smol"); const u16 gMonShinyPalette_MorpekoFullBelly[] = INCBIN_U16("graphics/pokemon/morpeko/shiny.gbapal"); const u8 gMonIcon_MorpekoFullBelly[] = INCBIN_U8("graphics/pokemon/morpeko/icon.4bpp"); #if P_FOOTPRINTS @@ -24050,9 +24104,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_MorpekoHangry[] = INCBIN_U32("graphics/pokemon/morpeko/hangry/front.4bpp.lz"); + const u32 gMonFrontPic_MorpekoHangry[] = INCBIN_U32("graphics/pokemon/morpeko/hangry/front.4bpp.smol"); const u16 gMonPalette_MorpekoHangry[] = INCBIN_U16("graphics/pokemon/morpeko/hangry/normal.gbapal"); - const u32 gMonBackPic_MorpekoHangry[] = INCBIN_U32("graphics/pokemon/morpeko/hangry/back.4bpp.lz"); + const u32 gMonBackPic_MorpekoHangry[] = INCBIN_U32("graphics/pokemon/morpeko/hangry/back.4bpp.smol"); const u16 gMonShinyPalette_MorpekoHangry[] = INCBIN_U16("graphics/pokemon/morpeko/hangry/shiny.gbapal"); const u8 gMonIcon_MorpekoHangry[] = INCBIN_U8("graphics/pokemon/morpeko/hangry/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -24065,9 +24119,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MORPEKO #if P_FAMILY_CUFANT - const u32 gMonFrontPic_Cufant[] = INCBIN_U32("graphics/pokemon/cufant/front.4bpp.lz"); + const u32 gMonFrontPic_Cufant[] = INCBIN_U32("graphics/pokemon/cufant/front.4bpp.smol"); const u16 gMonPalette_Cufant[] = INCBIN_U16("graphics/pokemon/cufant/normal.gbapal"); - const u32 gMonBackPic_Cufant[] = INCBIN_U32("graphics/pokemon/cufant/back.4bpp.lz"); + const u32 gMonBackPic_Cufant[] = INCBIN_U32("graphics/pokemon/cufant/back.4bpp.smol"); const u16 gMonShinyPalette_Cufant[] = INCBIN_U16("graphics/pokemon/cufant/shiny.gbapal"); const u8 gMonIcon_Cufant[] = INCBIN_U8("graphics/pokemon/cufant/icon.4bpp"); #if P_FOOTPRINTS @@ -24081,9 +24135,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Copperajah[] = INCBIN_U32("graphics/pokemon/copperajah/front.4bpp.lz"); + const u32 gMonFrontPic_Copperajah[] = INCBIN_U32("graphics/pokemon/copperajah/front.4bpp.smol"); const u16 gMonPalette_Copperajah[] = INCBIN_U16("graphics/pokemon/copperajah/normal.gbapal"); - const u32 gMonBackPic_Copperajah[] = INCBIN_U32("graphics/pokemon/copperajah/back.4bpp.lz"); + const u32 gMonBackPic_Copperajah[] = INCBIN_U32("graphics/pokemon/copperajah/back.4bpp.smol"); const u16 gMonShinyPalette_Copperajah[] = INCBIN_U16("graphics/pokemon/copperajah/shiny.gbapal"); const u8 gMonIcon_Copperajah[] = INCBIN_U8("graphics/pokemon/copperajah/icon.4bpp"); #if P_FOOTPRINTS @@ -24098,8 +24152,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_CopperajahGmax[] = INCBIN_U32("graphics/pokemon/copperajah/gmax/front.4bpp.lz"); - const u32 gMonBackPic_CopperajahGmax[] = INCBIN_U32("graphics/pokemon/copperajah/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_CopperajahGmax[] = INCBIN_U32("graphics/pokemon/copperajah/gmax/front.4bpp.smol"); + const u32 gMonBackPic_CopperajahGmax[] = INCBIN_U32("graphics/pokemon/copperajah/gmax/back.4bpp.smol"); const u16 gMonPalette_CopperajahGmax[] = INCBIN_U16("graphics/pokemon/copperajah/gmax/normal.gbapal"); const u16 gMonShinyPalette_CopperajahGmax[] = INCBIN_U16("graphics/pokemon/copperajah/gmax/shiny.gbapal"); const u8 gMonIcon_CopperajahGmax[] = INCBIN_U8("graphics/pokemon/copperajah/gmax/icon.4bpp"); @@ -24114,9 +24168,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CUFANT #if P_FAMILY_DRACOZOLT - const u32 gMonFrontPic_Dracozolt[] = INCBIN_U32("graphics/pokemon/dracozolt/front.4bpp.lz"); + const u32 gMonFrontPic_Dracozolt[] = INCBIN_U32("graphics/pokemon/dracozolt/front.4bpp.smol"); const u16 gMonPalette_Dracozolt[] = INCBIN_U16("graphics/pokemon/dracozolt/normal.gbapal"); - const u32 gMonBackPic_Dracozolt[] = INCBIN_U32("graphics/pokemon/dracozolt/back.4bpp.lz"); + const u32 gMonBackPic_Dracozolt[] = INCBIN_U32("graphics/pokemon/dracozolt/back.4bpp.smol"); const u16 gMonShinyPalette_Dracozolt[] = INCBIN_U16("graphics/pokemon/dracozolt/shiny.gbapal"); const u8 gMonIcon_Dracozolt[] = INCBIN_U8("graphics/pokemon/dracozolt/icon.4bpp"); #if P_FOOTPRINTS @@ -24132,9 +24186,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DRACOZOLT #if P_FAMILY_ARCTOZOLT - const u32 gMonFrontPic_Arctozolt[] = INCBIN_U32("graphics/pokemon/arctozolt/front.4bpp.lz"); + const u32 gMonFrontPic_Arctozolt[] = INCBIN_U32("graphics/pokemon/arctozolt/front.4bpp.smol"); const u16 gMonPalette_Arctozolt[] = INCBIN_U16("graphics/pokemon/arctozolt/normal.gbapal"); - const u32 gMonBackPic_Arctozolt[] = INCBIN_U32("graphics/pokemon/arctozolt/back.4bpp.lz"); + const u32 gMonBackPic_Arctozolt[] = INCBIN_U32("graphics/pokemon/arctozolt/back.4bpp.smol"); const u16 gMonShinyPalette_Arctozolt[] = INCBIN_U16("graphics/pokemon/arctozolt/shiny.gbapal"); const u8 gMonIcon_Arctozolt[] = INCBIN_U8("graphics/pokemon/arctozolt/icon.4bpp"); #if P_FOOTPRINTS @@ -24150,9 +24204,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ARCTOZOLT #if P_FAMILY_DRACOVISH - const u32 gMonFrontPic_Dracovish[] = INCBIN_U32("graphics/pokemon/dracovish/front.4bpp.lz"); + const u32 gMonFrontPic_Dracovish[] = INCBIN_U32("graphics/pokemon/dracovish/front.4bpp.smol"); const u16 gMonPalette_Dracovish[] = INCBIN_U16("graphics/pokemon/dracovish/normal.gbapal"); - const u32 gMonBackPic_Dracovish[] = INCBIN_U32("graphics/pokemon/dracovish/back.4bpp.lz"); + const u32 gMonBackPic_Dracovish[] = INCBIN_U32("graphics/pokemon/dracovish/back.4bpp.smol"); const u16 gMonShinyPalette_Dracovish[] = INCBIN_U16("graphics/pokemon/dracovish/shiny.gbapal"); const u8 gMonIcon_Dracovish[] = INCBIN_U8("graphics/pokemon/dracovish/icon.4bpp"); #if P_FOOTPRINTS @@ -24168,9 +24222,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DRACOVISH #if P_FAMILY_ARCTOVISH - const u32 gMonFrontPic_Arctovish[] = INCBIN_U32("graphics/pokemon/arctovish/front.4bpp.lz"); + const u32 gMonFrontPic_Arctovish[] = INCBIN_U32("graphics/pokemon/arctovish/front.4bpp.smol"); const u16 gMonPalette_Arctovish[] = INCBIN_U16("graphics/pokemon/arctovish/normal.gbapal"); - const u32 gMonBackPic_Arctovish[] = INCBIN_U32("graphics/pokemon/arctovish/back.4bpp.lz"); + const u32 gMonBackPic_Arctovish[] = INCBIN_U32("graphics/pokemon/arctovish/back.4bpp.smol"); const u16 gMonShinyPalette_Arctovish[] = INCBIN_U16("graphics/pokemon/arctovish/shiny.gbapal"); const u8 gMonIcon_Arctovish[] = INCBIN_U8("graphics/pokemon/arctovish/icon.4bpp"); #if P_FOOTPRINTS @@ -24186,9 +24240,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ARCTOVISH #if P_FAMILY_DURALUDON - const u32 gMonFrontPic_Duraludon[] = INCBIN_U32("graphics/pokemon/duraludon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Duraludon[] = INCBIN_U32("graphics/pokemon/duraludon/anim_front.4bpp.smol"); const u16 gMonPalette_Duraludon[] = INCBIN_U16("graphics/pokemon/duraludon/normal.gbapal"); - const u32 gMonBackPic_Duraludon[] = INCBIN_U32("graphics/pokemon/duraludon/back.4bpp.lz"); + const u32 gMonBackPic_Duraludon[] = INCBIN_U32("graphics/pokemon/duraludon/back.4bpp.smol"); const u16 gMonShinyPalette_Duraludon[] = INCBIN_U16("graphics/pokemon/duraludon/shiny.gbapal"); const u8 gMonIcon_Duraludon[] = INCBIN_U8("graphics/pokemon/duraludon/icon.4bpp"); #if P_FOOTPRINTS @@ -24203,8 +24257,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_DuraludonGmax[] = INCBIN_U32("graphics/pokemon/duraludon/gmax/front.4bpp.lz"); - const u32 gMonBackPic_DuraludonGmax[] = INCBIN_U32("graphics/pokemon/duraludon/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_DuraludonGmax[] = INCBIN_U32("graphics/pokemon/duraludon/gmax/front.4bpp.smol"); + const u32 gMonBackPic_DuraludonGmax[] = INCBIN_U32("graphics/pokemon/duraludon/gmax/back.4bpp.smol"); const u16 gMonPalette_DuraludonGmax[] = INCBIN_U16("graphics/pokemon/duraludon/gmax/normal.gbapal"); const u16 gMonShinyPalette_DuraludonGmax[] = INCBIN_U16("graphics/pokemon/duraludon/gmax/shiny.gbapal"); const u8 gMonIcon_DuraludonGmax[] = INCBIN_U8("graphics/pokemon/duraludon/gmax/icon.4bpp"); @@ -24218,9 +24272,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GIGANTAMAX_FORMS #if P_GEN_9_CROSS_EVOS - const u32 gMonFrontPic_Archaludon[] = INCBIN_U32("graphics/pokemon/archaludon/front.4bpp.lz"); + const u32 gMonFrontPic_Archaludon[] = INCBIN_U32("graphics/pokemon/archaludon/front.4bpp.smol"); const u16 gMonPalette_Archaludon[] = INCBIN_U16("graphics/pokemon/archaludon/normal.gbapal"); - const u32 gMonBackPic_Archaludon[] = INCBIN_U32("graphics/pokemon/archaludon/back.4bpp.lz"); + const u32 gMonBackPic_Archaludon[] = INCBIN_U32("graphics/pokemon/archaludon/back.4bpp.smol"); const u16 gMonShinyPalette_Archaludon[] = INCBIN_U16("graphics/pokemon/archaludon/shiny.gbapal"); const u8 gMonIcon_Archaludon[] = INCBIN_U8("graphics/pokemon/archaludon/icon.4bpp"); #if P_FOOTPRINTS @@ -24237,9 +24291,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DURALUDON #if P_FAMILY_DREEPY - const u32 gMonFrontPic_Dreepy[] = INCBIN_U32("graphics/pokemon/dreepy/front.4bpp.lz"); + const u32 gMonFrontPic_Dreepy[] = INCBIN_U32("graphics/pokemon/dreepy/front.4bpp.smol"); const u16 gMonPalette_Dreepy[] = INCBIN_U16("graphics/pokemon/dreepy/normal.gbapal"); - const u32 gMonBackPic_Dreepy[] = INCBIN_U32("graphics/pokemon/dreepy/back.4bpp.lz"); + const u32 gMonBackPic_Dreepy[] = INCBIN_U32("graphics/pokemon/dreepy/back.4bpp.smol"); const u16 gMonShinyPalette_Dreepy[] = INCBIN_U16("graphics/pokemon/dreepy/shiny.gbapal"); const u8 gMonIcon_Dreepy[] = INCBIN_U8("graphics/pokemon/dreepy/icon.4bpp"); #if P_FOOTPRINTS @@ -24253,9 +24307,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Drakloak[] = INCBIN_U32("graphics/pokemon/drakloak/front.4bpp.lz"); + const u32 gMonFrontPic_Drakloak[] = INCBIN_U32("graphics/pokemon/drakloak/front.4bpp.smol"); const u16 gMonPalette_Drakloak[] = INCBIN_U16("graphics/pokemon/drakloak/normal.gbapal"); - const u32 gMonBackPic_Drakloak[] = INCBIN_U32("graphics/pokemon/drakloak/back.4bpp.lz"); + const u32 gMonBackPic_Drakloak[] = INCBIN_U32("graphics/pokemon/drakloak/back.4bpp.smol"); const u16 gMonShinyPalette_Drakloak[] = INCBIN_U16("graphics/pokemon/drakloak/shiny.gbapal"); const u8 gMonIcon_Drakloak[] = INCBIN_U8("graphics/pokemon/drakloak/icon.4bpp"); #if P_FOOTPRINTS @@ -24269,9 +24323,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Dragapult[] = INCBIN_U32("graphics/pokemon/dragapult/front.4bpp.lz"); + const u32 gMonFrontPic_Dragapult[] = INCBIN_U32("graphics/pokemon/dragapult/front.4bpp.smol"); const u16 gMonPalette_Dragapult[] = INCBIN_U16("graphics/pokemon/dragapult/normal.gbapal"); - const u32 gMonBackPic_Dragapult[] = INCBIN_U32("graphics/pokemon/dragapult/back.4bpp.lz"); + const u32 gMonBackPic_Dragapult[] = INCBIN_U32("graphics/pokemon/dragapult/back.4bpp.smol"); const u16 gMonShinyPalette_Dragapult[] = INCBIN_U16("graphics/pokemon/dragapult/shiny.gbapal"); const u8 gMonIcon_Dragapult[] = INCBIN_U8("graphics/pokemon/dragapult/icon.4bpp"); #if P_FOOTPRINTS @@ -24287,9 +24341,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DREEPY #if P_FAMILY_ZACIAN - const u32 gMonFrontPic_ZacianHero[] = INCBIN_U32("graphics/pokemon/zacian/front.4bpp.lz"); + const u32 gMonFrontPic_ZacianHero[] = INCBIN_U32("graphics/pokemon/zacian/front.4bpp.smol"); const u16 gMonPalette_ZacianHero[] = INCBIN_U16("graphics/pokemon/zacian/normal.gbapal"); - const u32 gMonBackPic_ZacianHero[] = INCBIN_U32("graphics/pokemon/zacian/back.4bpp.lz"); + const u32 gMonBackPic_ZacianHero[] = INCBIN_U32("graphics/pokemon/zacian/back.4bpp.smol"); const u16 gMonShinyPalette_ZacianHero[] = INCBIN_U16("graphics/pokemon/zacian/shiny.gbapal"); const u8 gMonIcon_ZacianHero[] = INCBIN_U8("graphics/pokemon/zacian/icon.4bpp"); #if P_FOOTPRINTS @@ -24303,9 +24357,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_ZacianCrowned[] = INCBIN_U32("graphics/pokemon/zacian/crowned_sword/front.4bpp.lz"); + const u32 gMonFrontPic_ZacianCrowned[] = INCBIN_U32("graphics/pokemon/zacian/crowned_sword/front.4bpp.smol"); const u16 gMonPalette_ZacianCrowned[] = INCBIN_U16("graphics/pokemon/zacian/crowned_sword/normal.gbapal"); - const u32 gMonBackPic_ZacianCrowned[] = INCBIN_U32("graphics/pokemon/zacian/crowned_sword/back.4bpp.lz"); + const u32 gMonBackPic_ZacianCrowned[] = INCBIN_U32("graphics/pokemon/zacian/crowned_sword/back.4bpp.smol"); const u16 gMonShinyPalette_ZacianCrowned[] = INCBIN_U16("graphics/pokemon/zacian/crowned_sword/shiny.gbapal"); const u8 gMonIcon_ZacianCrowned[] = INCBIN_U8("graphics/pokemon/zacian/crowned_sword/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -24318,9 +24372,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ZACIAN #if P_FAMILY_ZAMAZENTA - const u32 gMonFrontPic_ZamazentaHero[] = INCBIN_U32("graphics/pokemon/zamazenta/front.4bpp.lz"); + const u32 gMonFrontPic_ZamazentaHero[] = INCBIN_U32("graphics/pokemon/zamazenta/front.4bpp.smol"); const u16 gMonPalette_ZamazentaHero[] = INCBIN_U16("graphics/pokemon/zamazenta/normal.gbapal"); - const u32 gMonBackPic_ZamazentaHero[] = INCBIN_U32("graphics/pokemon/zamazenta/back.4bpp.lz"); + const u32 gMonBackPic_ZamazentaHero[] = INCBIN_U32("graphics/pokemon/zamazenta/back.4bpp.smol"); const u16 gMonShinyPalette_ZamazentaHero[] = INCBIN_U16("graphics/pokemon/zamazenta/shiny.gbapal"); const u8 gMonIcon_ZamazentaHero[] = INCBIN_U8("graphics/pokemon/zamazenta/icon.4bpp"); #if P_FOOTPRINTS @@ -24334,9 +24388,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_ZamazentaCrowned[] = INCBIN_U32("graphics/pokemon/zamazenta/crowned_shield/front.4bpp.lz"); + const u32 gMonFrontPic_ZamazentaCrowned[] = INCBIN_U32("graphics/pokemon/zamazenta/crowned_shield/front.4bpp.smol"); const u16 gMonPalette_ZamazentaCrowned[] = INCBIN_U16("graphics/pokemon/zamazenta/crowned_shield/normal.gbapal"); - const u32 gMonBackPic_ZamazentaCrowned[] = INCBIN_U32("graphics/pokemon/zamazenta/crowned_shield/back.4bpp.lz"); + const u32 gMonBackPic_ZamazentaCrowned[] = INCBIN_U32("graphics/pokemon/zamazenta/crowned_shield/back.4bpp.smol"); const u16 gMonShinyPalette_ZamazentaCrowned[] = INCBIN_U16("graphics/pokemon/zamazenta/crowned_shield/shiny.gbapal"); const u8 gMonIcon_ZamazentaCrowned[] = INCBIN_U8("graphics/pokemon/zamazenta/crowned_shield/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -24349,9 +24403,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ZAMAZENTA #if P_FAMILY_ETERNATUS - const u32 gMonFrontPic_Eternatus[] = INCBIN_U32("graphics/pokemon/eternatus/front.4bpp.lz"); + const u32 gMonFrontPic_Eternatus[] = INCBIN_U32("graphics/pokemon/eternatus/front.4bpp.smol"); const u16 gMonPalette_Eternatus[] = INCBIN_U16("graphics/pokemon/eternatus/normal.gbapal"); - const u32 gMonBackPic_Eternatus[] = INCBIN_U32("graphics/pokemon/eternatus/back.4bpp.lz"); + const u32 gMonBackPic_Eternatus[] = INCBIN_U32("graphics/pokemon/eternatus/back.4bpp.smol"); const u16 gMonShinyPalette_Eternatus[] = INCBIN_U16("graphics/pokemon/eternatus/shiny.gbapal"); const u8 gMonIcon_Eternatus[] = INCBIN_U8("graphics/pokemon/eternatus/icon.4bpp"); #if P_FOOTPRINTS @@ -24365,9 +24419,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_EternatusEternamax[] = INCBIN_U32("graphics/pokemon/eternatus/eternamax/front.4bpp.lz"); + const u32 gMonFrontPic_EternatusEternamax[] = INCBIN_U32("graphics/pokemon/eternatus/eternamax/front.4bpp.smol"); const u16 gMonPalette_EternatusEternamax[] = INCBIN_U16("graphics/pokemon/eternatus/eternamax/normal.gbapal"); - const u32 gMonBackPic_EternatusEternamax[] = INCBIN_U32("graphics/pokemon/eternatus/eternamax/back.4bpp.lz"); + const u32 gMonBackPic_EternatusEternamax[] = INCBIN_U32("graphics/pokemon/eternatus/eternamax/back.4bpp.smol"); const u16 gMonShinyPalette_EternatusEternamax[] = INCBIN_U16("graphics/pokemon/eternatus/eternamax/shiny.gbapal"); const u8 gMonIcon_EternatusEternamax[] = INCBIN_U8("graphics/pokemon/eternatus/eternamax/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -24380,9 +24434,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ETERNATUS #if P_FAMILY_KUBFU - const u32 gMonFrontPic_Kubfu[] = INCBIN_U32("graphics/pokemon/kubfu/front.4bpp.lz"); + const u32 gMonFrontPic_Kubfu[] = INCBIN_U32("graphics/pokemon/kubfu/front.4bpp.smol"); const u16 gMonPalette_Kubfu[] = INCBIN_U16("graphics/pokemon/kubfu/normal.gbapal"); - const u32 gMonBackPic_Kubfu[] = INCBIN_U32("graphics/pokemon/kubfu/back.4bpp.lz"); + const u32 gMonBackPic_Kubfu[] = INCBIN_U32("graphics/pokemon/kubfu/back.4bpp.smol"); const u16 gMonShinyPalette_Kubfu[] = INCBIN_U16("graphics/pokemon/kubfu/shiny.gbapal"); const u8 gMonIcon_Kubfu[] = INCBIN_U8("graphics/pokemon/kubfu/icon.4bpp"); #if P_FOOTPRINTS @@ -24396,9 +24450,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_UrshifuSingleStrike[] = INCBIN_U32("graphics/pokemon/urshifu/front.4bpp.lz"); + const u32 gMonFrontPic_UrshifuSingleStrike[] = INCBIN_U32("graphics/pokemon/urshifu/front.4bpp.smol"); const u16 gMonPalette_UrshifuSingleStrike[] = INCBIN_U16("graphics/pokemon/urshifu/normal.gbapal"); - const u32 gMonBackPic_UrshifuSingleStrike[] = INCBIN_U32("graphics/pokemon/urshifu/back.4bpp.lz"); + const u32 gMonBackPic_UrshifuSingleStrike[] = INCBIN_U32("graphics/pokemon/urshifu/back.4bpp.smol"); const u16 gMonShinyPalette_UrshifuSingleStrike[] = INCBIN_U16("graphics/pokemon/urshifu/shiny.gbapal"); const u8 gMonIcon_Urshifu[] = INCBIN_U8("graphics/pokemon/urshifu/icon.4bpp"); #if P_FOOTPRINTS @@ -24412,20 +24466,20 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_UrshifuRapidStrike[] = INCBIN_U32("graphics/pokemon/urshifu/rapid_strike/front.4bpp.lz"); + const u32 gMonFrontPic_UrshifuRapidStrike[] = INCBIN_U32("graphics/pokemon/urshifu/rapid_strike/front.4bpp.smol"); const u16 gMonPalette_UrshifuRapidStrike[] = INCBIN_U16("graphics/pokemon/urshifu/rapid_strike/normal.gbapal"); - const u32 gMonBackPic_UrshifuRapidStrike[] = INCBIN_U32("graphics/pokemon/urshifu/rapid_strike/back.4bpp.lz"); + const u32 gMonBackPic_UrshifuRapidStrike[] = INCBIN_U32("graphics/pokemon/urshifu/rapid_strike/back.4bpp.smol"); const u16 gMonShinyPalette_UrshifuRapidStrike[] = INCBIN_U16("graphics/pokemon/urshifu/rapid_strike/shiny.gbapal"); #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_UrshifuSingleStrikeGmax[] = INCBIN_U32("graphics/pokemon/urshifu/single_strike_gmax/front.4bpp.lz"); - const u32 gMonBackPic_UrshifuSingleStrikeGmax[] = INCBIN_U32("graphics/pokemon/urshifu/single_strike_gmax/back.4bpp.lz"); + const u32 gMonFrontPic_UrshifuSingleStrikeGmax[] = INCBIN_U32("graphics/pokemon/urshifu/single_strike_gmax/front.4bpp.smol"); + const u32 gMonBackPic_UrshifuSingleStrikeGmax[] = INCBIN_U32("graphics/pokemon/urshifu/single_strike_gmax/back.4bpp.smol"); const u16 gMonPalette_UrshifuSingleStrikeGmax[] = INCBIN_U16("graphics/pokemon/urshifu/single_strike_gmax/normal.gbapal"); const u16 gMonShinyPalette_UrshifuSingleStrikeGmax[] = INCBIN_U16("graphics/pokemon/urshifu/single_strike_gmax/shiny.gbapal"); const u8 gMonIcon_UrshifuSingleStrikeGmax[] = INCBIN_U8("graphics/pokemon/urshifu/single_strike_gmax/icon.4bpp"); - const u32 gMonFrontPic_UrshifuRapidStrikeGmax[] = INCBIN_U32("graphics/pokemon/urshifu/rapid_strike_gmax/front.4bpp.lz"); - const u32 gMonBackPic_UrshifuRapidStrikeGmax[] = INCBIN_U32("graphics/pokemon/urshifu/rapid_strike_gmax/back.4bpp.lz"); + const u32 gMonFrontPic_UrshifuRapidStrikeGmax[] = INCBIN_U32("graphics/pokemon/urshifu/rapid_strike_gmax/front.4bpp.smol"); + const u32 gMonBackPic_UrshifuRapidStrikeGmax[] = INCBIN_U32("graphics/pokemon/urshifu/rapid_strike_gmax/back.4bpp.smol"); const u16 gMonPalette_UrshifuRapidStrikeGmax[] = INCBIN_U16("graphics/pokemon/urshifu/rapid_strike_gmax/normal.gbapal"); const u16 gMonShinyPalette_UrshifuRapidStrikeGmax[] = INCBIN_U16("graphics/pokemon/urshifu/rapid_strike_gmax/shiny.gbapal"); const u8 gMonIcon_UrshifuRapidStrikeGmax[] = INCBIN_U8("graphics/pokemon/urshifu/rapid_strike_gmax/icon.4bpp"); @@ -24438,9 +24492,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_KUBFU #if P_FAMILY_ZARUDE - const u32 gMonFrontPic_Zarude[] = INCBIN_U32("graphics/pokemon/zarude/front.4bpp.lz"); + const u32 gMonFrontPic_Zarude[] = INCBIN_U32("graphics/pokemon/zarude/front.4bpp.smol"); const u16 gMonPalette_Zarude[] = INCBIN_U16("graphics/pokemon/zarude/normal.gbapal"); - const u32 gMonBackPic_Zarude[] = INCBIN_U32("graphics/pokemon/zarude/back.4bpp.lz"); + const u32 gMonBackPic_Zarude[] = INCBIN_U32("graphics/pokemon/zarude/back.4bpp.smol"); const u16 gMonShinyPalette_Zarude[] = INCBIN_U16("graphics/pokemon/zarude/shiny.gbapal"); const u8 gMonIcon_Zarude[] = INCBIN_U8("graphics/pokemon/zarude/icon.4bpp"); #if P_FOOTPRINTS @@ -24454,9 +24508,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_ZarudeDada[] = INCBIN_U32("graphics/pokemon/zarude/dada/front.4bpp.lz"); + const u32 gMonFrontPic_ZarudeDada[] = INCBIN_U32("graphics/pokemon/zarude/dada/front.4bpp.smol"); const u16 gMonPalette_ZarudeDada[] = INCBIN_U16("graphics/pokemon/zarude/dada/normal.gbapal"); - const u32 gMonBackPic_ZarudeDada[] = INCBIN_U32("graphics/pokemon/zarude/dada/back.4bpp.lz"); + const u32 gMonBackPic_ZarudeDada[] = INCBIN_U32("graphics/pokemon/zarude/dada/back.4bpp.smol"); const u16 gMonShinyPalette_ZarudeDada[] = INCBIN_U16("graphics/pokemon/zarude/dada/shiny.gbapal"); const u8 gMonIcon_ZarudeDada[] = INCBIN_U8("graphics/pokemon/zarude/dada/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -24469,9 +24523,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ZARUDE #if P_FAMILY_REGIELEKI - const u32 gMonFrontPic_Regieleki[] = INCBIN_U32("graphics/pokemon/regieleki/front.4bpp.lz"); + const u32 gMonFrontPic_Regieleki[] = INCBIN_U32("graphics/pokemon/regieleki/front.4bpp.smol"); const u16 gMonPalette_Regieleki[] = INCBIN_U16("graphics/pokemon/regieleki/normal.gbapal"); - const u32 gMonBackPic_Regieleki[] = INCBIN_U32("graphics/pokemon/regieleki/back.4bpp.lz"); + const u32 gMonBackPic_Regieleki[] = INCBIN_U32("graphics/pokemon/regieleki/back.4bpp.smol"); const u16 gMonShinyPalette_Regieleki[] = INCBIN_U16("graphics/pokemon/regieleki/shiny.gbapal"); const u8 gMonIcon_Regieleki[] = INCBIN_U8("graphics/pokemon/regieleki/icon.4bpp"); #if P_FOOTPRINTS @@ -24487,9 +24541,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_REGIELEKI #if P_FAMILY_REGIDRAGO - const u32 gMonFrontPic_Regidrago[] = INCBIN_U32("graphics/pokemon/regidrago/front.4bpp.lz"); + const u32 gMonFrontPic_Regidrago[] = INCBIN_U32("graphics/pokemon/regidrago/front.4bpp.smol"); const u16 gMonPalette_Regidrago[] = INCBIN_U16("graphics/pokemon/regidrago/normal.gbapal"); - const u32 gMonBackPic_Regidrago[] = INCBIN_U32("graphics/pokemon/regidrago/back.4bpp.lz"); + const u32 gMonBackPic_Regidrago[] = INCBIN_U32("graphics/pokemon/regidrago/back.4bpp.smol"); const u16 gMonShinyPalette_Regidrago[] = INCBIN_U16("graphics/pokemon/regidrago/shiny.gbapal"); const u8 gMonIcon_Regidrago[] = INCBIN_U8("graphics/pokemon/regidrago/icon.4bpp"); #if P_FOOTPRINTS @@ -24505,9 +24559,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_REGIDRAGO #if P_FAMILY_GLASTRIER - const u32 gMonFrontPic_Glastrier[] = INCBIN_U32("graphics/pokemon/glastrier/front.4bpp.lz"); + const u32 gMonFrontPic_Glastrier[] = INCBIN_U32("graphics/pokemon/glastrier/front.4bpp.smol"); const u16 gMonPalette_Glastrier[] = INCBIN_U16("graphics/pokemon/glastrier/normal.gbapal"); - const u32 gMonBackPic_Glastrier[] = INCBIN_U32("graphics/pokemon/glastrier/back.4bpp.lz"); + const u32 gMonBackPic_Glastrier[] = INCBIN_U32("graphics/pokemon/glastrier/back.4bpp.smol"); const u16 gMonShinyPalette_Glastrier[] = INCBIN_U16("graphics/pokemon/glastrier/shiny.gbapal"); const u8 gMonIcon_Glastrier[] = INCBIN_U8("graphics/pokemon/glastrier/icon.4bpp"); #if P_FOOTPRINTS @@ -24523,9 +24577,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GLASTRIER #if P_FAMILY_SPECTRIER - const u32 gMonFrontPic_Spectrier[] = INCBIN_U32("graphics/pokemon/spectrier/front.4bpp.lz"); + const u32 gMonFrontPic_Spectrier[] = INCBIN_U32("graphics/pokemon/spectrier/front.4bpp.smol"); const u16 gMonPalette_Spectrier[] = INCBIN_U16("graphics/pokemon/spectrier/normal.gbapal"); - const u32 gMonBackPic_Spectrier[] = INCBIN_U32("graphics/pokemon/spectrier/back.4bpp.lz"); + const u32 gMonBackPic_Spectrier[] = INCBIN_U32("graphics/pokemon/spectrier/back.4bpp.smol"); const u16 gMonShinyPalette_Spectrier[] = INCBIN_U16("graphics/pokemon/spectrier/shiny.gbapal"); const u8 gMonIcon_Spectrier[] = INCBIN_U8("graphics/pokemon/spectrier/icon.4bpp"); #if P_FOOTPRINTS @@ -24541,9 +24595,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SPECTRIER #if P_FAMILY_CALYREX - const u32 gMonFrontPic_Calyrex[] = INCBIN_U32("graphics/pokemon/calyrex/front.4bpp.lz"); + const u32 gMonFrontPic_Calyrex[] = INCBIN_U32("graphics/pokemon/calyrex/front.4bpp.smol"); const u16 gMonPalette_Calyrex[] = INCBIN_U16("graphics/pokemon/calyrex/normal.gbapal"); - const u32 gMonBackPic_Calyrex[] = INCBIN_U32("graphics/pokemon/calyrex/back.4bpp.lz"); + const u32 gMonBackPic_Calyrex[] = INCBIN_U32("graphics/pokemon/calyrex/back.4bpp.smol"); const u16 gMonShinyPalette_Calyrex[] = INCBIN_U16("graphics/pokemon/calyrex/shiny.gbapal"); const u8 gMonIcon_Calyrex[] = INCBIN_U8("graphics/pokemon/calyrex/icon.4bpp"); #if P_FOOTPRINTS @@ -24558,9 +24612,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_FUSION_FORMS - const u32 gMonFrontPic_CalyrexIce[] = INCBIN_U32("graphics/pokemon/calyrex/ice/front.4bpp.lz"); + const u32 gMonFrontPic_CalyrexIce[] = INCBIN_U32("graphics/pokemon/calyrex/ice/front.4bpp.smol"); const u16 gMonPalette_CalyrexIce[] = INCBIN_U16("graphics/pokemon/calyrex/ice/normal.gbapal"); - const u32 gMonBackPic_CalyrexIce[] = INCBIN_U32("graphics/pokemon/calyrex/ice/back.4bpp.lz"); + const u32 gMonBackPic_CalyrexIce[] = INCBIN_U32("graphics/pokemon/calyrex/ice/back.4bpp.smol"); const u16 gMonShinyPalette_CalyrexIce[] = INCBIN_U16("graphics/pokemon/calyrex/ice/shiny.gbapal"); const u8 gMonIcon_CalyrexIce[] = INCBIN_U8("graphics/pokemon/calyrex/ice/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -24573,9 +24627,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FUSION_FORMS #if P_FUSION_FORMS - const u32 gMonFrontPic_CalyrexShadow[] = INCBIN_U32("graphics/pokemon/calyrex/shadow/front.4bpp.lz"); + const u32 gMonFrontPic_CalyrexShadow[] = INCBIN_U32("graphics/pokemon/calyrex/shadow/front.4bpp.smol"); const u16 gMonPalette_CalyrexShadow[] = INCBIN_U16("graphics/pokemon/calyrex/shadow/normal.gbapal"); - const u32 gMonBackPic_CalyrexShadow[] = INCBIN_U32("graphics/pokemon/calyrex/shadow/back.4bpp.lz"); + const u32 gMonBackPic_CalyrexShadow[] = INCBIN_U32("graphics/pokemon/calyrex/shadow/back.4bpp.smol"); const u16 gMonShinyPalette_CalyrexShadow[] = INCBIN_U16("graphics/pokemon/calyrex/shadow/shiny.gbapal"); const u8 gMonIcon_CalyrexShadow[] = INCBIN_U8("graphics/pokemon/calyrex/shadow/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -24589,9 +24643,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CALYREX #if P_FAMILY_SPRIGATITO - const u32 gMonFrontPic_Sprigatito[] = INCBIN_U32("graphics/pokemon/sprigatito/front.4bpp.lz"); + const u32 gMonFrontPic_Sprigatito[] = INCBIN_U32("graphics/pokemon/sprigatito/front.4bpp.smol"); const u16 gMonPalette_Sprigatito[] = INCBIN_U16("graphics/pokemon/sprigatito/normal.gbapal"); - const u32 gMonBackPic_Sprigatito[] = INCBIN_U32("graphics/pokemon/sprigatito/back.4bpp.lz"); + const u32 gMonBackPic_Sprigatito[] = INCBIN_U32("graphics/pokemon/sprigatito/back.4bpp.smol"); const u16 gMonShinyPalette_Sprigatito[] = INCBIN_U16("graphics/pokemon/sprigatito/shiny.gbapal"); const u8 gMonIcon_Sprigatito[] = INCBIN_U8("graphics/pokemon/sprigatito/icon.4bpp"); #if P_FOOTPRINTS @@ -24605,9 +24659,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Floragato[] = INCBIN_U32("graphics/pokemon/floragato/front.4bpp.lz"); + const u32 gMonFrontPic_Floragato[] = INCBIN_U32("graphics/pokemon/floragato/front.4bpp.smol"); const u16 gMonPalette_Floragato[] = INCBIN_U16("graphics/pokemon/floragato/normal.gbapal"); - const u32 gMonBackPic_Floragato[] = INCBIN_U32("graphics/pokemon/floragato/back.4bpp.lz"); + const u32 gMonBackPic_Floragato[] = INCBIN_U32("graphics/pokemon/floragato/back.4bpp.smol"); const u16 gMonShinyPalette_Floragato[] = INCBIN_U16("graphics/pokemon/floragato/shiny.gbapal"); const u8 gMonIcon_Floragato[] = INCBIN_U8("graphics/pokemon/floragato/icon.4bpp"); #if P_FOOTPRINTS @@ -24621,9 +24675,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Meowscarada[] = INCBIN_U32("graphics/pokemon/meowscarada/front.4bpp.lz"); + const u32 gMonFrontPic_Meowscarada[] = INCBIN_U32("graphics/pokemon/meowscarada/front.4bpp.smol"); const u16 gMonPalette_Meowscarada[] = INCBIN_U16("graphics/pokemon/meowscarada/normal.gbapal"); - const u32 gMonBackPic_Meowscarada[] = INCBIN_U32("graphics/pokemon/meowscarada/back.4bpp.lz"); + const u32 gMonBackPic_Meowscarada[] = INCBIN_U32("graphics/pokemon/meowscarada/back.4bpp.smol"); const u16 gMonShinyPalette_Meowscarada[] = INCBIN_U16("graphics/pokemon/meowscarada/shiny.gbapal"); const u8 gMonIcon_Meowscarada[] = INCBIN_U8("graphics/pokemon/meowscarada/icon.4bpp"); #if P_FOOTPRINTS @@ -24639,9 +24693,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SPRIGATITO #if P_FAMILY_FUECOCO - const u32 gMonFrontPic_Fuecoco[] = INCBIN_U32("graphics/pokemon/fuecoco/front.4bpp.lz"); + const u32 gMonFrontPic_Fuecoco[] = INCBIN_U32("graphics/pokemon/fuecoco/front.4bpp.smol"); const u16 gMonPalette_Fuecoco[] = INCBIN_U16("graphics/pokemon/fuecoco/normal.gbapal"); - const u32 gMonBackPic_Fuecoco[] = INCBIN_U32("graphics/pokemon/fuecoco/back.4bpp.lz"); + const u32 gMonBackPic_Fuecoco[] = INCBIN_U32("graphics/pokemon/fuecoco/back.4bpp.smol"); const u16 gMonShinyPalette_Fuecoco[] = INCBIN_U16("graphics/pokemon/fuecoco/shiny.gbapal"); const u8 gMonIcon_Fuecoco[] = INCBIN_U8("graphics/pokemon/fuecoco/icon.4bpp"); #if P_FOOTPRINTS @@ -24655,9 +24709,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Crocalor[] = INCBIN_U32("graphics/pokemon/crocalor/front.4bpp.lz"); + const u32 gMonFrontPic_Crocalor[] = INCBIN_U32("graphics/pokemon/crocalor/front.4bpp.smol"); const u16 gMonPalette_Crocalor[] = INCBIN_U16("graphics/pokemon/crocalor/normal.gbapal"); - const u32 gMonBackPic_Crocalor[] = INCBIN_U32("graphics/pokemon/crocalor/back.4bpp.lz"); + const u32 gMonBackPic_Crocalor[] = INCBIN_U32("graphics/pokemon/crocalor/back.4bpp.smol"); const u16 gMonShinyPalette_Crocalor[] = INCBIN_U16("graphics/pokemon/crocalor/shiny.gbapal"); const u8 gMonIcon_Crocalor[] = INCBIN_U8("graphics/pokemon/crocalor/icon.4bpp"); #if P_FOOTPRINTS @@ -24671,9 +24725,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Skeledirge[] = INCBIN_U32("graphics/pokemon/skeledirge/front.4bpp.lz"); + const u32 gMonFrontPic_Skeledirge[] = INCBIN_U32("graphics/pokemon/skeledirge/front.4bpp.smol"); const u16 gMonPalette_Skeledirge[] = INCBIN_U16("graphics/pokemon/skeledirge/normal.gbapal"); - const u32 gMonBackPic_Skeledirge[] = INCBIN_U32("graphics/pokemon/skeledirge/back.4bpp.lz"); + const u32 gMonBackPic_Skeledirge[] = INCBIN_U32("graphics/pokemon/skeledirge/back.4bpp.smol"); const u16 gMonShinyPalette_Skeledirge[] = INCBIN_U16("graphics/pokemon/skeledirge/shiny.gbapal"); const u8 gMonIcon_Skeledirge[] = INCBIN_U8("graphics/pokemon/skeledirge/icon.4bpp"); #if P_FOOTPRINTS @@ -24689,9 +24743,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FUECOCO #if P_FAMILY_QUAXLY - const u32 gMonFrontPic_Quaxly[] = INCBIN_U32("graphics/pokemon/quaxly/front.4bpp.lz"); + const u32 gMonFrontPic_Quaxly[] = INCBIN_U32("graphics/pokemon/quaxly/front.4bpp.smol"); const u16 gMonPalette_Quaxly[] = INCBIN_U16("graphics/pokemon/quaxly/normal.gbapal"); - const u32 gMonBackPic_Quaxly[] = INCBIN_U32("graphics/pokemon/quaxly/back.4bpp.lz"); + const u32 gMonBackPic_Quaxly[] = INCBIN_U32("graphics/pokemon/quaxly/back.4bpp.smol"); const u16 gMonShinyPalette_Quaxly[] = INCBIN_U16("graphics/pokemon/quaxly/shiny.gbapal"); const u8 gMonIcon_Quaxly[] = INCBIN_U8("graphics/pokemon/quaxly/icon.4bpp"); #if P_FOOTPRINTS @@ -24705,9 +24759,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Quaxwell[] = INCBIN_U32("graphics/pokemon/quaxwell/front.4bpp.lz"); + const u32 gMonFrontPic_Quaxwell[] = INCBIN_U32("graphics/pokemon/quaxwell/front.4bpp.smol"); const u16 gMonPalette_Quaxwell[] = INCBIN_U16("graphics/pokemon/quaxwell/normal.gbapal"); - const u32 gMonBackPic_Quaxwell[] = INCBIN_U32("graphics/pokemon/quaxwell/back.4bpp.lz"); + const u32 gMonBackPic_Quaxwell[] = INCBIN_U32("graphics/pokemon/quaxwell/back.4bpp.smol"); const u16 gMonShinyPalette_Quaxwell[] = INCBIN_U16("graphics/pokemon/quaxwell/shiny.gbapal"); const u8 gMonIcon_Quaxwell[] = INCBIN_U8("graphics/pokemon/quaxwell/icon.4bpp"); #if P_FOOTPRINTS @@ -24721,9 +24775,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Quaquaval[] = INCBIN_U32("graphics/pokemon/quaquaval/front.4bpp.lz"); + const u32 gMonFrontPic_Quaquaval[] = INCBIN_U32("graphics/pokemon/quaquaval/front.4bpp.smol"); const u16 gMonPalette_Quaquaval[] = INCBIN_U16("graphics/pokemon/quaquaval/normal.gbapal"); - const u32 gMonBackPic_Quaquaval[] = INCBIN_U32("graphics/pokemon/quaquaval/back.4bpp.lz"); + const u32 gMonBackPic_Quaquaval[] = INCBIN_U32("graphics/pokemon/quaquaval/back.4bpp.smol"); const u16 gMonShinyPalette_Quaquaval[] = INCBIN_U16("graphics/pokemon/quaquaval/shiny.gbapal"); const u8 gMonIcon_Quaquaval[] = INCBIN_U8("graphics/pokemon/quaquaval/icon.4bpp"); #if P_FOOTPRINTS @@ -24739,9 +24793,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_QUAXLY #if P_FAMILY_LECHONK - const u32 gMonFrontPic_Lechonk[] = INCBIN_U32("graphics/pokemon/lechonk/front.4bpp.lz"); + const u32 gMonFrontPic_Lechonk[] = INCBIN_U32("graphics/pokemon/lechonk/front.4bpp.smol"); const u16 gMonPalette_Lechonk[] = INCBIN_U16("graphics/pokemon/lechonk/normal.gbapal"); - const u32 gMonBackPic_Lechonk[] = INCBIN_U32("graphics/pokemon/lechonk/back.4bpp.lz"); + const u32 gMonBackPic_Lechonk[] = INCBIN_U32("graphics/pokemon/lechonk/back.4bpp.smol"); const u16 gMonShinyPalette_Lechonk[] = INCBIN_U16("graphics/pokemon/lechonk/shiny.gbapal"); const u8 gMonIcon_Lechonk[] = INCBIN_U8("graphics/pokemon/lechonk/icon.4bpp"); #if P_FOOTPRINTS @@ -24755,9 +24809,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_OinkologneM[] = INCBIN_U32("graphics/pokemon/oinkologne/front.4bpp.lz"); + const u32 gMonFrontPic_OinkologneM[] = INCBIN_U32("graphics/pokemon/oinkologne/front.4bpp.smol"); const u16 gMonPalette_OinkologneM[] = INCBIN_U16("graphics/pokemon/oinkologne/normal.gbapal"); - const u32 gMonBackPic_OinkologneM[] = INCBIN_U32("graphics/pokemon/oinkologne/back.4bpp.lz"); + const u32 gMonBackPic_OinkologneM[] = INCBIN_U32("graphics/pokemon/oinkologne/back.4bpp.smol"); const u16 gMonShinyPalette_OinkologneM[] = INCBIN_U16("graphics/pokemon/oinkologne/shiny.gbapal"); const u8 gMonIcon_OinkologneM[] = INCBIN_U8("graphics/pokemon/oinkologne/icon.4bpp"); #if P_FOOTPRINTS @@ -24771,9 +24825,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_OinkologneF[] = INCBIN_U32("graphics/pokemon/oinkologne/f/front.4bpp.lz"); + const u32 gMonFrontPic_OinkologneF[] = INCBIN_U32("graphics/pokemon/oinkologne/f/front.4bpp.smol"); const u16 gMonPalette_OinkologneF[] = INCBIN_U16("graphics/pokemon/oinkologne/f/normal.gbapal"); - const u32 gMonBackPic_OinkologneF[] = INCBIN_U32("graphics/pokemon/oinkologne/f/back.4bpp.lz"); + const u32 gMonBackPic_OinkologneF[] = INCBIN_U32("graphics/pokemon/oinkologne/f/back.4bpp.smol"); const u16 gMonShinyPalette_OinkologneF[] = INCBIN_U16("graphics/pokemon/oinkologne/f/shiny.gbapal"); const u8 gMonIcon_OinkologneF[] = INCBIN_U8("graphics/pokemon/oinkologne/f/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -24786,9 +24840,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_LECHONK #if P_FAMILY_TAROUNTULA - const u32 gMonFrontPic_Tarountula[] = INCBIN_U32("graphics/pokemon/tarountula/front.4bpp.lz"); + const u32 gMonFrontPic_Tarountula[] = INCBIN_U32("graphics/pokemon/tarountula/front.4bpp.smol"); const u16 gMonPalette_Tarountula[] = INCBIN_U16("graphics/pokemon/tarountula/normal.gbapal"); - const u32 gMonBackPic_Tarountula[] = INCBIN_U32("graphics/pokemon/tarountula/back.4bpp.lz"); + const u32 gMonBackPic_Tarountula[] = INCBIN_U32("graphics/pokemon/tarountula/back.4bpp.smol"); const u16 gMonShinyPalette_Tarountula[] = INCBIN_U16("graphics/pokemon/tarountula/shiny.gbapal"); const u8 gMonIcon_Tarountula[] = INCBIN_U8("graphics/pokemon/tarountula/icon.4bpp"); #if P_FOOTPRINTS @@ -24802,9 +24856,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Spidops[] = INCBIN_U32("graphics/pokemon/spidops/front.4bpp.lz"); + const u32 gMonFrontPic_Spidops[] = INCBIN_U32("graphics/pokemon/spidops/front.4bpp.smol"); const u16 gMonPalette_Spidops[] = INCBIN_U16("graphics/pokemon/spidops/normal.gbapal"); - const u32 gMonBackPic_Spidops[] = INCBIN_U32("graphics/pokemon/spidops/back.4bpp.lz"); + const u32 gMonBackPic_Spidops[] = INCBIN_U32("graphics/pokemon/spidops/back.4bpp.smol"); const u16 gMonShinyPalette_Spidops[] = INCBIN_U16("graphics/pokemon/spidops/shiny.gbapal"); const u8 gMonIcon_Spidops[] = INCBIN_U8("graphics/pokemon/spidops/icon.4bpp"); #if P_FOOTPRINTS @@ -24820,9 +24874,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TAROUNTULA #if P_FAMILY_NYMBLE - const u32 gMonFrontPic_Nymble[] = INCBIN_U32("graphics/pokemon/nymble/front.4bpp.lz"); + const u32 gMonFrontPic_Nymble[] = INCBIN_U32("graphics/pokemon/nymble/front.4bpp.smol"); const u16 gMonPalette_Nymble[] = INCBIN_U16("graphics/pokemon/nymble/normal.gbapal"); - const u32 gMonBackPic_Nymble[] = INCBIN_U32("graphics/pokemon/nymble/back.4bpp.lz"); + const u32 gMonBackPic_Nymble[] = INCBIN_U32("graphics/pokemon/nymble/back.4bpp.smol"); const u16 gMonShinyPalette_Nymble[] = INCBIN_U16("graphics/pokemon/nymble/shiny.gbapal"); const u8 gMonIcon_Nymble[] = INCBIN_U8("graphics/pokemon/nymble/icon.4bpp"); #if P_FOOTPRINTS @@ -24836,9 +24890,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Lokix[] = INCBIN_U32("graphics/pokemon/lokix/front.4bpp.lz"); + const u32 gMonFrontPic_Lokix[] = INCBIN_U32("graphics/pokemon/lokix/front.4bpp.smol"); const u16 gMonPalette_Lokix[] = INCBIN_U16("graphics/pokemon/lokix/normal.gbapal"); - const u32 gMonBackPic_Lokix[] = INCBIN_U32("graphics/pokemon/lokix/back.4bpp.lz"); + const u32 gMonBackPic_Lokix[] = INCBIN_U32("graphics/pokemon/lokix/back.4bpp.smol"); const u16 gMonShinyPalette_Lokix[] = INCBIN_U16("graphics/pokemon/lokix/shiny.gbapal"); const u8 gMonIcon_Lokix[] = INCBIN_U8("graphics/pokemon/lokix/icon.4bpp"); #if P_FOOTPRINTS @@ -24854,9 +24908,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_NYMBLE #if P_FAMILY_PAWMI - const u32 gMonFrontPic_Pawmi[] = INCBIN_U32("graphics/pokemon/pawmi/front.4bpp.lz"); + const u32 gMonFrontPic_Pawmi[] = INCBIN_U32("graphics/pokemon/pawmi/front.4bpp.smol"); const u16 gMonPalette_Pawmi[] = INCBIN_U16("graphics/pokemon/pawmi/normal.gbapal"); - const u32 gMonBackPic_Pawmi[] = INCBIN_U32("graphics/pokemon/pawmi/back.4bpp.lz"); + const u32 gMonBackPic_Pawmi[] = INCBIN_U32("graphics/pokemon/pawmi/back.4bpp.smol"); const u16 gMonShinyPalette_Pawmi[] = INCBIN_U16("graphics/pokemon/pawmi/shiny.gbapal"); const u8 gMonIcon_Pawmi[] = INCBIN_U8("graphics/pokemon/pawmi/icon.4bpp"); #if P_FOOTPRINTS @@ -24870,9 +24924,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Pawmo[] = INCBIN_U32("graphics/pokemon/pawmo/front.4bpp.lz"); + const u32 gMonFrontPic_Pawmo[] = INCBIN_U32("graphics/pokemon/pawmo/front.4bpp.smol"); const u16 gMonPalette_Pawmo[] = INCBIN_U16("graphics/pokemon/pawmo/normal.gbapal"); - const u32 gMonBackPic_Pawmo[] = INCBIN_U32("graphics/pokemon/pawmo/back.4bpp.lz"); + const u32 gMonBackPic_Pawmo[] = INCBIN_U32("graphics/pokemon/pawmo/back.4bpp.smol"); const u16 gMonShinyPalette_Pawmo[] = INCBIN_U16("graphics/pokemon/pawmo/shiny.gbapal"); const u8 gMonIcon_Pawmo[] = INCBIN_U8("graphics/pokemon/pawmo/icon.4bpp"); #if P_FOOTPRINTS @@ -24886,9 +24940,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Pawmot[] = INCBIN_U32("graphics/pokemon/pawmot/front.4bpp.lz"); + const u32 gMonFrontPic_Pawmot[] = INCBIN_U32("graphics/pokemon/pawmot/front.4bpp.smol"); const u16 gMonPalette_Pawmot[] = INCBIN_U16("graphics/pokemon/pawmot/normal.gbapal"); - const u32 gMonBackPic_Pawmot[] = INCBIN_U32("graphics/pokemon/pawmot/back.4bpp.lz"); + const u32 gMonBackPic_Pawmot[] = INCBIN_U32("graphics/pokemon/pawmot/back.4bpp.smol"); const u16 gMonShinyPalette_Pawmot[] = INCBIN_U16("graphics/pokemon/pawmot/shiny.gbapal"); const u8 gMonIcon_Pawmot[] = INCBIN_U8("graphics/pokemon/pawmot/icon.4bpp"); #if P_FOOTPRINTS @@ -24904,9 +24958,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PAWMI #if P_FAMILY_TANDEMAUS - const u32 gMonFrontPic_Tandemaus[] = INCBIN_U32("graphics/pokemon/tandemaus/front.4bpp.lz"); + const u32 gMonFrontPic_Tandemaus[] = INCBIN_U32("graphics/pokemon/tandemaus/front.4bpp.smol"); const u16 gMonPalette_Tandemaus[] = INCBIN_U16("graphics/pokemon/tandemaus/normal.gbapal"); - const u32 gMonBackPic_Tandemaus[] = INCBIN_U32("graphics/pokemon/tandemaus/back.4bpp.lz"); + const u32 gMonBackPic_Tandemaus[] = INCBIN_U32("graphics/pokemon/tandemaus/back.4bpp.smol"); const u16 gMonShinyPalette_Tandemaus[] = INCBIN_U16("graphics/pokemon/tandemaus/shiny.gbapal"); const u8 gMonIcon_Tandemaus[] = INCBIN_U8("graphics/pokemon/tandemaus/icon.4bpp"); #if P_FOOTPRINTS @@ -24923,8 +24977,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u16 gMonPalette_Maushold[] = INCBIN_U16("graphics/pokemon/maushold/normal.gbapal"); const u16 gMonShinyPalette_Maushold[] = INCBIN_U16("graphics/pokemon/maushold/shiny.gbapal"); - const u32 gMonFrontPic_MausholdThree[] = INCBIN_U32("graphics/pokemon/maushold/front.4bpp.lz"); - const u32 gMonBackPic_MausholdThree[] = INCBIN_U32("graphics/pokemon/maushold/back.4bpp.lz"); + const u32 gMonFrontPic_MausholdThree[] = INCBIN_U32("graphics/pokemon/maushold/front.4bpp.smol"); + const u32 gMonBackPic_MausholdThree[] = INCBIN_U32("graphics/pokemon/maushold/back.4bpp.smol"); const u8 gMonIcon_MausholdThree[] = INCBIN_U8("graphics/pokemon/maushold/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_MausholdThree[] = INCBIN_U8("graphics/pokemon/maushold/footprint.1bpp"); @@ -24937,8 +24991,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_MausholdFour[] = INCBIN_U32("graphics/pokemon/maushold/four/front.4bpp.lz"); - const u32 gMonBackPic_MausholdFour[] = INCBIN_U32("graphics/pokemon/maushold/four/back.4bpp.lz"); + const u32 gMonFrontPic_MausholdFour[] = INCBIN_U32("graphics/pokemon/maushold/four/front.4bpp.smol"); + const u32 gMonBackPic_MausholdFour[] = INCBIN_U32("graphics/pokemon/maushold/four/back.4bpp.smol"); const u8 gMonIcon_MausholdFour[] = INCBIN_U8("graphics/pokemon/maushold/four/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_MausholdFour[] = INCBIN_U8("graphics/pokemon/maushold/four/footprint.1bpp"); @@ -24953,9 +25007,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TANDEMAUS #if P_FAMILY_FIDOUGH - const u32 gMonFrontPic_Fidough[] = INCBIN_U32("graphics/pokemon/fidough/front.4bpp.lz"); + const u32 gMonFrontPic_Fidough[] = INCBIN_U32("graphics/pokemon/fidough/front.4bpp.smol"); const u16 gMonPalette_Fidough[] = INCBIN_U16("graphics/pokemon/fidough/normal.gbapal"); - const u32 gMonBackPic_Fidough[] = INCBIN_U32("graphics/pokemon/fidough/back.4bpp.lz"); + const u32 gMonBackPic_Fidough[] = INCBIN_U32("graphics/pokemon/fidough/back.4bpp.smol"); const u16 gMonShinyPalette_Fidough[] = INCBIN_U16("graphics/pokemon/fidough/shiny.gbapal"); const u8 gMonIcon_Fidough[] = INCBIN_U8("graphics/pokemon/fidough/icon.4bpp"); #if P_FOOTPRINTS @@ -24969,9 +25023,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Dachsbun[] = INCBIN_U32("graphics/pokemon/dachsbun/front.4bpp.lz"); + const u32 gMonFrontPic_Dachsbun[] = INCBIN_U32("graphics/pokemon/dachsbun/front.4bpp.smol"); const u16 gMonPalette_Dachsbun[] = INCBIN_U16("graphics/pokemon/dachsbun/normal.gbapal"); - const u32 gMonBackPic_Dachsbun[] = INCBIN_U32("graphics/pokemon/dachsbun/back.4bpp.lz"); + const u32 gMonBackPic_Dachsbun[] = INCBIN_U32("graphics/pokemon/dachsbun/back.4bpp.smol"); const u16 gMonShinyPalette_Dachsbun[] = INCBIN_U16("graphics/pokemon/dachsbun/shiny.gbapal"); const u8 gMonIcon_Dachsbun[] = INCBIN_U8("graphics/pokemon/dachsbun/icon.4bpp"); #if P_FOOTPRINTS @@ -24987,9 +25041,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FIDOUGH #if P_FAMILY_SMOLIV - const u32 gMonFrontPic_Smoliv[] = INCBIN_U32("graphics/pokemon/smoliv/front.4bpp.lz"); + const u32 gMonFrontPic_Smoliv[] = INCBIN_U32("graphics/pokemon/smoliv/front.4bpp.smol"); const u16 gMonPalette_Smoliv[] = INCBIN_U16("graphics/pokemon/smoliv/normal.gbapal"); - const u32 gMonBackPic_Smoliv[] = INCBIN_U32("graphics/pokemon/smoliv/back.4bpp.lz"); + const u32 gMonBackPic_Smoliv[] = INCBIN_U32("graphics/pokemon/smoliv/back.4bpp.smol"); const u16 gMonShinyPalette_Smoliv[] = INCBIN_U16("graphics/pokemon/smoliv/shiny.gbapal"); const u8 gMonIcon_Smoliv[] = INCBIN_U8("graphics/pokemon/smoliv/icon.4bpp"); #if P_FOOTPRINTS @@ -25003,9 +25057,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Dolliv[] = INCBIN_U32("graphics/pokemon/dolliv/front.4bpp.lz"); + const u32 gMonFrontPic_Dolliv[] = INCBIN_U32("graphics/pokemon/dolliv/front.4bpp.smol"); const u16 gMonPalette_Dolliv[] = INCBIN_U16("graphics/pokemon/dolliv/normal.gbapal"); - const u32 gMonBackPic_Dolliv[] = INCBIN_U32("graphics/pokemon/dolliv/back.4bpp.lz"); + const u32 gMonBackPic_Dolliv[] = INCBIN_U32("graphics/pokemon/dolliv/back.4bpp.smol"); const u16 gMonShinyPalette_Dolliv[] = INCBIN_U16("graphics/pokemon/dolliv/shiny.gbapal"); const u8 gMonIcon_Dolliv[] = INCBIN_U8("graphics/pokemon/dolliv/icon.4bpp"); #if P_FOOTPRINTS @@ -25019,9 +25073,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Arboliva[] = INCBIN_U32("graphics/pokemon/arboliva/front.4bpp.lz"); + const u32 gMonFrontPic_Arboliva[] = INCBIN_U32("graphics/pokemon/arboliva/front.4bpp.smol"); const u16 gMonPalette_Arboliva[] = INCBIN_U16("graphics/pokemon/arboliva/normal.gbapal"); - const u32 gMonBackPic_Arboliva[] = INCBIN_U32("graphics/pokemon/arboliva/back.4bpp.lz"); + const u32 gMonBackPic_Arboliva[] = INCBIN_U32("graphics/pokemon/arboliva/back.4bpp.smol"); const u16 gMonShinyPalette_Arboliva[] = INCBIN_U16("graphics/pokemon/arboliva/shiny.gbapal"); const u8 gMonIcon_Arboliva[] = INCBIN_U8("graphics/pokemon/arboliva/icon.4bpp"); #if P_FOOTPRINTS @@ -25037,8 +25091,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SMOLIV #if P_FAMILY_SQUAWKABILLY - const u32 gMonFrontPic_Squawkabilly[] = INCBIN_U32("graphics/pokemon/squawkabilly/front.4bpp.lz"); - const u32 gMonBackPic_Squawkabilly[] = INCBIN_U32("graphics/pokemon/squawkabilly/back.4bpp.lz"); + const u32 gMonFrontPic_Squawkabilly[] = INCBIN_U32("graphics/pokemon/squawkabilly/front.4bpp.smol"); + const u32 gMonBackPic_Squawkabilly[] = INCBIN_U32("graphics/pokemon/squawkabilly/back.4bpp.smol"); #if P_FOOTPRINTS const u8 gMonFootprint_Squawkabilly[] = INCBIN_U8("graphics/pokemon/squawkabilly/footprint.1bpp"); #endif //P_FOOTPRINTS @@ -25089,9 +25143,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SQUAWKABILLY #if P_FAMILY_NACLI - const u32 gMonFrontPic_Nacli[] = INCBIN_U32("graphics/pokemon/nacli/front.4bpp.lz"); + const u32 gMonFrontPic_Nacli[] = INCBIN_U32("graphics/pokemon/nacli/front.4bpp.smol"); const u16 gMonPalette_Nacli[] = INCBIN_U16("graphics/pokemon/nacli/normal.gbapal"); - const u32 gMonBackPic_Nacli[] = INCBIN_U32("graphics/pokemon/nacli/back.4bpp.lz"); + const u32 gMonBackPic_Nacli[] = INCBIN_U32("graphics/pokemon/nacli/back.4bpp.smol"); const u16 gMonShinyPalette_Nacli[] = INCBIN_U16("graphics/pokemon/nacli/shiny.gbapal"); const u8 gMonIcon_Nacli[] = INCBIN_U8("graphics/pokemon/nacli/icon.4bpp"); #if P_FOOTPRINTS @@ -25105,9 +25159,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Naclstack[] = INCBIN_U32("graphics/pokemon/naclstack/front.4bpp.lz"); + const u32 gMonFrontPic_Naclstack[] = INCBIN_U32("graphics/pokemon/naclstack/front.4bpp.smol"); const u16 gMonPalette_Naclstack[] = INCBIN_U16("graphics/pokemon/naclstack/normal.gbapal"); - const u32 gMonBackPic_Naclstack[] = INCBIN_U32("graphics/pokemon/naclstack/back.4bpp.lz"); + const u32 gMonBackPic_Naclstack[] = INCBIN_U32("graphics/pokemon/naclstack/back.4bpp.smol"); const u16 gMonShinyPalette_Naclstack[] = INCBIN_U16("graphics/pokemon/naclstack/shiny.gbapal"); const u8 gMonIcon_Naclstack[] = INCBIN_U8("graphics/pokemon/naclstack/icon.4bpp"); #if P_FOOTPRINTS @@ -25121,9 +25175,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Garganacl[] = INCBIN_U32("graphics/pokemon/garganacl/front.4bpp.lz"); + const u32 gMonFrontPic_Garganacl[] = INCBIN_U32("graphics/pokemon/garganacl/front.4bpp.smol"); const u16 gMonPalette_Garganacl[] = INCBIN_U16("graphics/pokemon/garganacl/normal.gbapal"); - const u32 gMonBackPic_Garganacl[] = INCBIN_U32("graphics/pokemon/garganacl/back.4bpp.lz"); + const u32 gMonBackPic_Garganacl[] = INCBIN_U32("graphics/pokemon/garganacl/back.4bpp.smol"); const u16 gMonShinyPalette_Garganacl[] = INCBIN_U16("graphics/pokemon/garganacl/shiny.gbapal"); const u8 gMonIcon_Garganacl[] = INCBIN_U8("graphics/pokemon/garganacl/icon.4bpp"); #if P_FOOTPRINTS @@ -25139,9 +25193,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_NACLI #if P_FAMILY_CHARCADET - const u32 gMonFrontPic_Charcadet[] = INCBIN_U32("graphics/pokemon/charcadet/front.4bpp.lz"); + const u32 gMonFrontPic_Charcadet[] = INCBIN_U32("graphics/pokemon/charcadet/front.4bpp.smol"); const u16 gMonPalette_Charcadet[] = INCBIN_U16("graphics/pokemon/charcadet/normal.gbapal"); - const u32 gMonBackPic_Charcadet[] = INCBIN_U32("graphics/pokemon/charcadet/back.4bpp.lz"); + const u32 gMonBackPic_Charcadet[] = INCBIN_U32("graphics/pokemon/charcadet/back.4bpp.smol"); const u16 gMonShinyPalette_Charcadet[] = INCBIN_U16("graphics/pokemon/charcadet/shiny.gbapal"); const u8 gMonIcon_Charcadet[] = INCBIN_U8("graphics/pokemon/charcadet/icon.4bpp"); #if P_FOOTPRINTS @@ -25155,9 +25209,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Armarouge[] = INCBIN_U32("graphics/pokemon/armarouge/front.4bpp.lz"); + const u32 gMonFrontPic_Armarouge[] = INCBIN_U32("graphics/pokemon/armarouge/front.4bpp.smol"); const u16 gMonPalette_Armarouge[] = INCBIN_U16("graphics/pokemon/armarouge/normal.gbapal"); - const u32 gMonBackPic_Armarouge[] = INCBIN_U32("graphics/pokemon/armarouge/back.4bpp.lz"); + const u32 gMonBackPic_Armarouge[] = INCBIN_U32("graphics/pokemon/armarouge/back.4bpp.smol"); const u16 gMonShinyPalette_Armarouge[] = INCBIN_U16("graphics/pokemon/armarouge/shiny.gbapal"); const u8 gMonIcon_Armarouge[] = INCBIN_U8("graphics/pokemon/armarouge/icon.4bpp"); #if P_FOOTPRINTS @@ -25171,9 +25225,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Ceruledge[] = INCBIN_U32("graphics/pokemon/ceruledge/front.4bpp.lz"); + const u32 gMonFrontPic_Ceruledge[] = INCBIN_U32("graphics/pokemon/ceruledge/front.4bpp.smol"); const u16 gMonPalette_Ceruledge[] = INCBIN_U16("graphics/pokemon/ceruledge/normal.gbapal"); - const u32 gMonBackPic_Ceruledge[] = INCBIN_U32("graphics/pokemon/ceruledge/back.4bpp.lz"); + const u32 gMonBackPic_Ceruledge[] = INCBIN_U32("graphics/pokemon/ceruledge/back.4bpp.smol"); const u16 gMonShinyPalette_Ceruledge[] = INCBIN_U16("graphics/pokemon/ceruledge/shiny.gbapal"); const u8 gMonIcon_Ceruledge[] = INCBIN_U8("graphics/pokemon/ceruledge/icon.4bpp"); #if P_FOOTPRINTS @@ -25189,9 +25243,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CHARCADET #if P_FAMILY_TADBULB - const u32 gMonFrontPic_Tadbulb[] = INCBIN_U32("graphics/pokemon/tadbulb/front.4bpp.lz"); + const u32 gMonFrontPic_Tadbulb[] = INCBIN_U32("graphics/pokemon/tadbulb/front.4bpp.smol"); const u16 gMonPalette_Tadbulb[] = INCBIN_U16("graphics/pokemon/tadbulb/normal.gbapal"); - const u32 gMonBackPic_Tadbulb[] = INCBIN_U32("graphics/pokemon/tadbulb/back.4bpp.lz"); + const u32 gMonBackPic_Tadbulb[] = INCBIN_U32("graphics/pokemon/tadbulb/back.4bpp.smol"); const u16 gMonShinyPalette_Tadbulb[] = INCBIN_U16("graphics/pokemon/tadbulb/shiny.gbapal"); const u8 gMonIcon_Tadbulb[] = INCBIN_U8("graphics/pokemon/tadbulb/icon.4bpp"); #if P_FOOTPRINTS @@ -25205,9 +25259,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Bellibolt[] = INCBIN_U32("graphics/pokemon/bellibolt/front.4bpp.lz"); + const u32 gMonFrontPic_Bellibolt[] = INCBIN_U32("graphics/pokemon/bellibolt/front.4bpp.smol"); const u16 gMonPalette_Bellibolt[] = INCBIN_U16("graphics/pokemon/bellibolt/normal.gbapal"); - const u32 gMonBackPic_Bellibolt[] = INCBIN_U32("graphics/pokemon/bellibolt/back.4bpp.lz"); + const u32 gMonBackPic_Bellibolt[] = INCBIN_U32("graphics/pokemon/bellibolt/back.4bpp.smol"); const u16 gMonShinyPalette_Bellibolt[] = INCBIN_U16("graphics/pokemon/bellibolt/shiny.gbapal"); const u8 gMonIcon_Bellibolt[] = INCBIN_U8("graphics/pokemon/bellibolt/icon.4bpp"); #if P_FOOTPRINTS @@ -25223,9 +25277,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TADBULB #if P_FAMILY_WATTREL - const u32 gMonFrontPic_Wattrel[] = INCBIN_U32("graphics/pokemon/wattrel/front.4bpp.lz"); + const u32 gMonFrontPic_Wattrel[] = INCBIN_U32("graphics/pokemon/wattrel/front.4bpp.smol"); const u16 gMonPalette_Wattrel[] = INCBIN_U16("graphics/pokemon/wattrel/normal.gbapal"); - const u32 gMonBackPic_Wattrel[] = INCBIN_U32("graphics/pokemon/wattrel/back.4bpp.lz"); + const u32 gMonBackPic_Wattrel[] = INCBIN_U32("graphics/pokemon/wattrel/back.4bpp.smol"); const u16 gMonShinyPalette_Wattrel[] = INCBIN_U16("graphics/pokemon/wattrel/shiny.gbapal"); const u8 gMonIcon_Wattrel[] = INCBIN_U8("graphics/pokemon/wattrel/icon.4bpp"); #if P_FOOTPRINTS @@ -25239,9 +25293,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Kilowattrel[] = INCBIN_U32("graphics/pokemon/kilowattrel/front.4bpp.lz"); + const u32 gMonFrontPic_Kilowattrel[] = INCBIN_U32("graphics/pokemon/kilowattrel/front.4bpp.smol"); const u16 gMonPalette_Kilowattrel[] = INCBIN_U16("graphics/pokemon/kilowattrel/normal.gbapal"); - const u32 gMonBackPic_Kilowattrel[] = INCBIN_U32("graphics/pokemon/kilowattrel/back.4bpp.lz"); + const u32 gMonBackPic_Kilowattrel[] = INCBIN_U32("graphics/pokemon/kilowattrel/back.4bpp.smol"); const u16 gMonShinyPalette_Kilowattrel[] = INCBIN_U16("graphics/pokemon/kilowattrel/shiny.gbapal"); const u8 gMonIcon_Kilowattrel[] = INCBIN_U8("graphics/pokemon/kilowattrel/icon.4bpp"); #if P_FOOTPRINTS @@ -25257,9 +25311,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_WATTREL #if P_FAMILY_MASCHIFF - const u32 gMonFrontPic_Maschiff[] = INCBIN_U32("graphics/pokemon/maschiff/front.4bpp.lz"); + const u32 gMonFrontPic_Maschiff[] = INCBIN_U32("graphics/pokemon/maschiff/front.4bpp.smol"); const u16 gMonPalette_Maschiff[] = INCBIN_U16("graphics/pokemon/maschiff/normal.gbapal"); - const u32 gMonBackPic_Maschiff[] = INCBIN_U32("graphics/pokemon/maschiff/back.4bpp.lz"); + const u32 gMonBackPic_Maschiff[] = INCBIN_U32("graphics/pokemon/maschiff/back.4bpp.smol"); const u16 gMonShinyPalette_Maschiff[] = INCBIN_U16("graphics/pokemon/maschiff/shiny.gbapal"); const u8 gMonIcon_Maschiff[] = INCBIN_U8("graphics/pokemon/maschiff/icon.4bpp"); #if P_FOOTPRINTS @@ -25273,9 +25327,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Mabosstiff[] = INCBIN_U32("graphics/pokemon/mabosstiff/front.4bpp.lz"); + const u32 gMonFrontPic_Mabosstiff[] = INCBIN_U32("graphics/pokemon/mabosstiff/front.4bpp.smol"); const u16 gMonPalette_Mabosstiff[] = INCBIN_U16("graphics/pokemon/mabosstiff/normal.gbapal"); - const u32 gMonBackPic_Mabosstiff[] = INCBIN_U32("graphics/pokemon/mabosstiff/back.4bpp.lz"); + const u32 gMonBackPic_Mabosstiff[] = INCBIN_U32("graphics/pokemon/mabosstiff/back.4bpp.smol"); const u16 gMonShinyPalette_Mabosstiff[] = INCBIN_U16("graphics/pokemon/mabosstiff/shiny.gbapal"); const u8 gMonIcon_Mabosstiff[] = INCBIN_U8("graphics/pokemon/mabosstiff/icon.4bpp"); #if P_FOOTPRINTS @@ -25291,9 +25345,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MASCHIFF #if P_FAMILY_SHROODLE - const u32 gMonFrontPic_Shroodle[] = INCBIN_U32("graphics/pokemon/shroodle/front.4bpp.lz"); + const u32 gMonFrontPic_Shroodle[] = INCBIN_U32("graphics/pokemon/shroodle/front.4bpp.smol"); const u16 gMonPalette_Shroodle[] = INCBIN_U16("graphics/pokemon/shroodle/normal.gbapal"); - const u32 gMonBackPic_Shroodle[] = INCBIN_U32("graphics/pokemon/shroodle/back.4bpp.lz"); + const u32 gMonBackPic_Shroodle[] = INCBIN_U32("graphics/pokemon/shroodle/back.4bpp.smol"); const u16 gMonShinyPalette_Shroodle[] = INCBIN_U16("graphics/pokemon/shroodle/shiny.gbapal"); const u8 gMonIcon_Shroodle[] = INCBIN_U8("graphics/pokemon/shroodle/icon.4bpp"); #if P_FOOTPRINTS @@ -25307,9 +25361,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Grafaiai[] = INCBIN_U32("graphics/pokemon/grafaiai/front.4bpp.lz"); + const u32 gMonFrontPic_Grafaiai[] = INCBIN_U32("graphics/pokemon/grafaiai/front.4bpp.smol"); const u16 gMonPalette_Grafaiai[] = INCBIN_U16("graphics/pokemon/grafaiai/normal.gbapal"); - const u32 gMonBackPic_Grafaiai[] = INCBIN_U32("graphics/pokemon/grafaiai/back.4bpp.lz"); + const u32 gMonBackPic_Grafaiai[] = INCBIN_U32("graphics/pokemon/grafaiai/back.4bpp.smol"); const u16 gMonShinyPalette_Grafaiai[] = INCBIN_U16("graphics/pokemon/grafaiai/shiny.gbapal"); const u8 gMonIcon_Grafaiai[] = INCBIN_U8("graphics/pokemon/grafaiai/icon.4bpp"); #if P_FOOTPRINTS @@ -25325,9 +25379,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SHROODLE #if P_FAMILY_BRAMBLIN - const u32 gMonFrontPic_Bramblin[] = INCBIN_U32("graphics/pokemon/bramblin/front.4bpp.lz"); + const u32 gMonFrontPic_Bramblin[] = INCBIN_U32("graphics/pokemon/bramblin/front.4bpp.smol"); const u16 gMonPalette_Bramblin[] = INCBIN_U16("graphics/pokemon/bramblin/normal.gbapal"); - const u32 gMonBackPic_Bramblin[] = INCBIN_U32("graphics/pokemon/bramblin/back.4bpp.lz"); + const u32 gMonBackPic_Bramblin[] = INCBIN_U32("graphics/pokemon/bramblin/back.4bpp.smol"); const u16 gMonShinyPalette_Bramblin[] = INCBIN_U16("graphics/pokemon/bramblin/shiny.gbapal"); const u8 gMonIcon_Bramblin[] = INCBIN_U8("graphics/pokemon/bramblin/icon.4bpp"); #if P_FOOTPRINTS @@ -25341,9 +25395,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Brambleghast[] = INCBIN_U32("graphics/pokemon/brambleghast/front.4bpp.lz"); + const u32 gMonFrontPic_Brambleghast[] = INCBIN_U32("graphics/pokemon/brambleghast/front.4bpp.smol"); const u16 gMonPalette_Brambleghast[] = INCBIN_U16("graphics/pokemon/brambleghast/normal.gbapal"); - const u32 gMonBackPic_Brambleghast[] = INCBIN_U32("graphics/pokemon/brambleghast/back.4bpp.lz"); + const u32 gMonBackPic_Brambleghast[] = INCBIN_U32("graphics/pokemon/brambleghast/back.4bpp.smol"); const u16 gMonShinyPalette_Brambleghast[] = INCBIN_U16("graphics/pokemon/brambleghast/shiny.gbapal"); const u8 gMonIcon_Brambleghast[] = INCBIN_U8("graphics/pokemon/brambleghast/icon.4bpp"); #if P_FOOTPRINTS @@ -25359,9 +25413,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BRAMBLIN #if P_FAMILY_TOEDSCOOL - const u32 gMonFrontPic_Toedscool[] = INCBIN_U32("graphics/pokemon/toedscool/front.4bpp.lz"); + const u32 gMonFrontPic_Toedscool[] = INCBIN_U32("graphics/pokemon/toedscool/front.4bpp.smol"); const u16 gMonPalette_Toedscool[] = INCBIN_U16("graphics/pokemon/toedscool/normal.gbapal"); - const u32 gMonBackPic_Toedscool[] = INCBIN_U32("graphics/pokemon/toedscool/back.4bpp.lz"); + const u32 gMonBackPic_Toedscool[] = INCBIN_U32("graphics/pokemon/toedscool/back.4bpp.smol"); const u16 gMonShinyPalette_Toedscool[] = INCBIN_U16("graphics/pokemon/toedscool/shiny.gbapal"); const u8 gMonIcon_Toedscool[] = INCBIN_U8("graphics/pokemon/toedscool/icon.4bpp"); #if P_FOOTPRINTS @@ -25375,9 +25429,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Toedscruel[] = INCBIN_U32("graphics/pokemon/toedscruel/front.4bpp.lz"); + const u32 gMonFrontPic_Toedscruel[] = INCBIN_U32("graphics/pokemon/toedscruel/front.4bpp.smol"); const u16 gMonPalette_Toedscruel[] = INCBIN_U16("graphics/pokemon/toedscruel/normal.gbapal"); - const u32 gMonBackPic_Toedscruel[] = INCBIN_U32("graphics/pokemon/toedscruel/back.4bpp.lz"); + const u32 gMonBackPic_Toedscruel[] = INCBIN_U32("graphics/pokemon/toedscruel/back.4bpp.smol"); const u16 gMonShinyPalette_Toedscruel[] = INCBIN_U16("graphics/pokemon/toedscruel/shiny.gbapal"); const u8 gMonIcon_Toedscruel[] = INCBIN_U8("graphics/pokemon/toedscruel/icon.4bpp"); #if P_FOOTPRINTS @@ -25393,9 +25447,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TOEDSCOOL #if P_FAMILY_KLAWF - const u32 gMonFrontPic_Klawf[] = INCBIN_U32("graphics/pokemon/klawf/front.4bpp.lz"); + const u32 gMonFrontPic_Klawf[] = INCBIN_U32("graphics/pokemon/klawf/front.4bpp.smol"); const u16 gMonPalette_Klawf[] = INCBIN_U16("graphics/pokemon/klawf/normal.gbapal"); - const u32 gMonBackPic_Klawf[] = INCBIN_U32("graphics/pokemon/klawf/back.4bpp.lz"); + const u32 gMonBackPic_Klawf[] = INCBIN_U32("graphics/pokemon/klawf/back.4bpp.smol"); const u16 gMonShinyPalette_Klawf[] = INCBIN_U16("graphics/pokemon/klawf/shiny.gbapal"); const u8 gMonIcon_Klawf[] = INCBIN_U8("graphics/pokemon/klawf/icon.4bpp"); #if P_FOOTPRINTS @@ -25411,9 +25465,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_KLAWF #if P_FAMILY_CAPSAKID - const u32 gMonFrontPic_Capsakid[] = INCBIN_U32("graphics/pokemon/capsakid/front.4bpp.lz"); + const u32 gMonFrontPic_Capsakid[] = INCBIN_U32("graphics/pokemon/capsakid/front.4bpp.smol"); const u16 gMonPalette_Capsakid[] = INCBIN_U16("graphics/pokemon/capsakid/normal.gbapal"); - const u32 gMonBackPic_Capsakid[] = INCBIN_U32("graphics/pokemon/capsakid/back.4bpp.lz"); + const u32 gMonBackPic_Capsakid[] = INCBIN_U32("graphics/pokemon/capsakid/back.4bpp.smol"); const u16 gMonShinyPalette_Capsakid[] = INCBIN_U16("graphics/pokemon/capsakid/shiny.gbapal"); const u8 gMonIcon_Capsakid[] = INCBIN_U8("graphics/pokemon/capsakid/icon.4bpp"); #if P_FOOTPRINTS @@ -25427,9 +25481,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Scovillain[] = INCBIN_U32("graphics/pokemon/scovillain/front.4bpp.lz"); + const u32 gMonFrontPic_Scovillain[] = INCBIN_U32("graphics/pokemon/scovillain/front.4bpp.smol"); const u16 gMonPalette_Scovillain[] = INCBIN_U16("graphics/pokemon/scovillain/normal.gbapal"); - const u32 gMonBackPic_Scovillain[] = INCBIN_U32("graphics/pokemon/scovillain/back.4bpp.lz"); + const u32 gMonBackPic_Scovillain[] = INCBIN_U32("graphics/pokemon/scovillain/back.4bpp.smol"); const u16 gMonShinyPalette_Scovillain[] = INCBIN_U16("graphics/pokemon/scovillain/shiny.gbapal"); const u8 gMonIcon_Scovillain[] = INCBIN_U8("graphics/pokemon/scovillain/icon.4bpp"); #if P_FOOTPRINTS @@ -25445,9 +25499,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CAPSAKID #if P_FAMILY_RELLOR - const u32 gMonFrontPic_Rellor[] = INCBIN_U32("graphics/pokemon/rellor/front.4bpp.lz"); + const u32 gMonFrontPic_Rellor[] = INCBIN_U32("graphics/pokemon/rellor/front.4bpp.smol"); const u16 gMonPalette_Rellor[] = INCBIN_U16("graphics/pokemon/rellor/normal.gbapal"); - const u32 gMonBackPic_Rellor[] = INCBIN_U32("graphics/pokemon/rellor/back.4bpp.lz"); + const u32 gMonBackPic_Rellor[] = INCBIN_U32("graphics/pokemon/rellor/back.4bpp.smol"); const u16 gMonShinyPalette_Rellor[] = INCBIN_U16("graphics/pokemon/rellor/shiny.gbapal"); const u8 gMonIcon_Rellor[] = INCBIN_U8("graphics/pokemon/rellor/icon.4bpp"); #if P_FOOTPRINTS @@ -25461,9 +25515,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Rabsca[] = INCBIN_U32("graphics/pokemon/rabsca/front.4bpp.lz"); + const u32 gMonFrontPic_Rabsca[] = INCBIN_U32("graphics/pokemon/rabsca/front.4bpp.smol"); const u16 gMonPalette_Rabsca[] = INCBIN_U16("graphics/pokemon/rabsca/normal.gbapal"); - const u32 gMonBackPic_Rabsca[] = INCBIN_U32("graphics/pokemon/rabsca/back.4bpp.lz"); + const u32 gMonBackPic_Rabsca[] = INCBIN_U32("graphics/pokemon/rabsca/back.4bpp.smol"); const u16 gMonShinyPalette_Rabsca[] = INCBIN_U16("graphics/pokemon/rabsca/shiny.gbapal"); const u8 gMonIcon_Rabsca[] = INCBIN_U8("graphics/pokemon/rabsca/icon.4bpp"); #if P_FOOTPRINTS @@ -25479,9 +25533,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_RELLOR #if P_FAMILY_FLITTLE - const u32 gMonFrontPic_Flittle[] = INCBIN_U32("graphics/pokemon/flittle/front.4bpp.lz"); + const u32 gMonFrontPic_Flittle[] = INCBIN_U32("graphics/pokemon/flittle/front.4bpp.smol"); const u16 gMonPalette_Flittle[] = INCBIN_U16("graphics/pokemon/flittle/normal.gbapal"); - const u32 gMonBackPic_Flittle[] = INCBIN_U32("graphics/pokemon/flittle/back.4bpp.lz"); + const u32 gMonBackPic_Flittle[] = INCBIN_U32("graphics/pokemon/flittle/back.4bpp.smol"); const u16 gMonShinyPalette_Flittle[] = INCBIN_U16("graphics/pokemon/flittle/shiny.gbapal"); const u8 gMonIcon_Flittle[] = INCBIN_U8("graphics/pokemon/flittle/icon.4bpp"); #if P_FOOTPRINTS @@ -25495,9 +25549,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Espathra[] = INCBIN_U32("graphics/pokemon/espathra/front.4bpp.lz"); + const u32 gMonFrontPic_Espathra[] = INCBIN_U32("graphics/pokemon/espathra/front.4bpp.smol"); const u16 gMonPalette_Espathra[] = INCBIN_U16("graphics/pokemon/espathra/normal.gbapal"); - const u32 gMonBackPic_Espathra[] = INCBIN_U32("graphics/pokemon/espathra/back.4bpp.lz"); + const u32 gMonBackPic_Espathra[] = INCBIN_U32("graphics/pokemon/espathra/back.4bpp.smol"); const u16 gMonShinyPalette_Espathra[] = INCBIN_U16("graphics/pokemon/espathra/shiny.gbapal"); const u8 gMonIcon_Espathra[] = INCBIN_U8("graphics/pokemon/espathra/icon.4bpp"); #if P_FOOTPRINTS @@ -25513,9 +25567,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FLITTLE #if P_FAMILY_TINKATINK - const u32 gMonFrontPic_Tinkatink[] = INCBIN_U32("graphics/pokemon/tinkatink/front.4bpp.lz"); + const u32 gMonFrontPic_Tinkatink[] = INCBIN_U32("graphics/pokemon/tinkatink/front.4bpp.smol"); const u16 gMonPalette_Tinkatink[] = INCBIN_U16("graphics/pokemon/tinkatink/normal.gbapal"); - const u32 gMonBackPic_Tinkatink[] = INCBIN_U32("graphics/pokemon/tinkatink/back.4bpp.lz"); + const u32 gMonBackPic_Tinkatink[] = INCBIN_U32("graphics/pokemon/tinkatink/back.4bpp.smol"); const u16 gMonShinyPalette_Tinkatink[] = INCBIN_U16("graphics/pokemon/tinkatink/shiny.gbapal"); const u8 gMonIcon_Tinkatink[] = INCBIN_U8("graphics/pokemon/tinkatink/icon.4bpp"); #if P_FOOTPRINTS @@ -25529,9 +25583,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Tinkatuff[] = INCBIN_U32("graphics/pokemon/tinkatuff/front.4bpp.lz"); + const u32 gMonFrontPic_Tinkatuff[] = INCBIN_U32("graphics/pokemon/tinkatuff/front.4bpp.smol"); const u16 gMonPalette_Tinkatuff[] = INCBIN_U16("graphics/pokemon/tinkatuff/normal.gbapal"); - const u32 gMonBackPic_Tinkatuff[] = INCBIN_U32("graphics/pokemon/tinkatuff/back.4bpp.lz"); + const u32 gMonBackPic_Tinkatuff[] = INCBIN_U32("graphics/pokemon/tinkatuff/back.4bpp.smol"); const u16 gMonShinyPalette_Tinkatuff[] = INCBIN_U16("graphics/pokemon/tinkatuff/shiny.gbapal"); const u8 gMonIcon_Tinkatuff[] = INCBIN_U8("graphics/pokemon/tinkatuff/icon.4bpp"); #if P_FOOTPRINTS @@ -25545,9 +25599,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Tinkaton[] = INCBIN_U32("graphics/pokemon/tinkaton/front.4bpp.lz"); + const u32 gMonFrontPic_Tinkaton[] = INCBIN_U32("graphics/pokemon/tinkaton/front.4bpp.smol"); const u16 gMonPalette_Tinkaton[] = INCBIN_U16("graphics/pokemon/tinkaton/normal.gbapal"); - const u32 gMonBackPic_Tinkaton[] = INCBIN_U32("graphics/pokemon/tinkaton/back.4bpp.lz"); + const u32 gMonBackPic_Tinkaton[] = INCBIN_U32("graphics/pokemon/tinkaton/back.4bpp.smol"); const u16 gMonShinyPalette_Tinkaton[] = INCBIN_U16("graphics/pokemon/tinkaton/shiny.gbapal"); const u8 gMonIcon_Tinkaton[] = INCBIN_U8("graphics/pokemon/tinkaton/icon.4bpp"); #if P_FOOTPRINTS @@ -25563,9 +25617,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TINKATINK #if P_FAMILY_WIGLETT - const u32 gMonFrontPic_Wiglett[] = INCBIN_U32("graphics/pokemon/wiglett/front.4bpp.lz"); + const u32 gMonFrontPic_Wiglett[] = INCBIN_U32("graphics/pokemon/wiglett/front.4bpp.smol"); const u16 gMonPalette_Wiglett[] = INCBIN_U16("graphics/pokemon/wiglett/normal.gbapal"); - const u32 gMonBackPic_Wiglett[] = INCBIN_U32("graphics/pokemon/wiglett/back.4bpp.lz"); + const u32 gMonBackPic_Wiglett[] = INCBIN_U32("graphics/pokemon/wiglett/back.4bpp.smol"); const u16 gMonShinyPalette_Wiglett[] = INCBIN_U16("graphics/pokemon/wiglett/shiny.gbapal"); const u8 gMonIcon_Wiglett[] = INCBIN_U8("graphics/pokemon/wiglett/icon.4bpp"); #if P_FOOTPRINTS @@ -25579,9 +25633,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Wugtrio[] = INCBIN_U32("graphics/pokemon/wugtrio/front.4bpp.lz"); + const u32 gMonFrontPic_Wugtrio[] = INCBIN_U32("graphics/pokemon/wugtrio/front.4bpp.smol"); const u16 gMonPalette_Wugtrio[] = INCBIN_U16("graphics/pokemon/wugtrio/normal.gbapal"); - const u32 gMonBackPic_Wugtrio[] = INCBIN_U32("graphics/pokemon/wugtrio/back.4bpp.lz"); + const u32 gMonBackPic_Wugtrio[] = INCBIN_U32("graphics/pokemon/wugtrio/back.4bpp.smol"); const u16 gMonShinyPalette_Wugtrio[] = INCBIN_U16("graphics/pokemon/wugtrio/shiny.gbapal"); const u8 gMonIcon_Wugtrio[] = INCBIN_U8("graphics/pokemon/wugtrio/icon.4bpp"); #if P_FOOTPRINTS @@ -25597,9 +25651,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_WIGLETT #if P_FAMILY_BOMBIRDIER - const u32 gMonFrontPic_Bombirdier[] = INCBIN_U32("graphics/pokemon/bombirdier/front.4bpp.lz"); + const u32 gMonFrontPic_Bombirdier[] = INCBIN_U32("graphics/pokemon/bombirdier/front.4bpp.smol"); const u16 gMonPalette_Bombirdier[] = INCBIN_U16("graphics/pokemon/bombirdier/normal.gbapal"); - const u32 gMonBackPic_Bombirdier[] = INCBIN_U32("graphics/pokemon/bombirdier/back.4bpp.lz"); + const u32 gMonBackPic_Bombirdier[] = INCBIN_U32("graphics/pokemon/bombirdier/back.4bpp.smol"); const u16 gMonShinyPalette_Bombirdier[] = INCBIN_U16("graphics/pokemon/bombirdier/shiny.gbapal"); const u8 gMonIcon_Bombirdier[] = INCBIN_U8("graphics/pokemon/bombirdier/icon.4bpp"); #if P_FOOTPRINTS @@ -25615,9 +25669,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BOMBIRDIER #if P_FAMILY_FINIZEN - const u32 gMonFrontPic_Finizen[] = INCBIN_U32("graphics/pokemon/finizen/front.4bpp.lz"); + const u32 gMonFrontPic_Finizen[] = INCBIN_U32("graphics/pokemon/finizen/front.4bpp.smol"); const u16 gMonPalette_Finizen[] = INCBIN_U16("graphics/pokemon/finizen/normal.gbapal"); - const u32 gMonBackPic_Finizen[] = INCBIN_U32("graphics/pokemon/finizen/back.4bpp.lz"); + const u32 gMonBackPic_Finizen[] = INCBIN_U32("graphics/pokemon/finizen/back.4bpp.smol"); const u16 gMonShinyPalette_Finizen[] = INCBIN_U16("graphics/pokemon/finizen/shiny.gbapal"); const u8 gMonIcon_Finizen[] = INCBIN_U8("graphics/pokemon/finizen/icon.4bpp"); #if P_FOOTPRINTS @@ -25631,9 +25685,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_PalafinZero[] = INCBIN_U32("graphics/pokemon/palafin/front.4bpp.lz"); + const u32 gMonFrontPic_PalafinZero[] = INCBIN_U32("graphics/pokemon/palafin/front.4bpp.smol"); const u16 gMonPalette_PalafinZero[] = INCBIN_U16("graphics/pokemon/palafin/normal.gbapal"); - const u32 gMonBackPic_PalafinZero[] = INCBIN_U32("graphics/pokemon/palafin/back.4bpp.lz"); + const u32 gMonBackPic_PalafinZero[] = INCBIN_U32("graphics/pokemon/palafin/back.4bpp.smol"); const u16 gMonShinyPalette_PalafinZero[] = INCBIN_U16("graphics/pokemon/palafin/shiny.gbapal"); const u8 gMonIcon_PalafinZero[] = INCBIN_U8("graphics/pokemon/palafin/icon.4bpp"); #if P_FOOTPRINTS @@ -25647,9 +25701,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_PalafinHero[] = INCBIN_U32("graphics/pokemon/palafin/hero/front.4bpp.lz"); + const u32 gMonFrontPic_PalafinHero[] = INCBIN_U32("graphics/pokemon/palafin/hero/front.4bpp.smol"); const u16 gMonPalette_PalafinHero[] = INCBIN_U16("graphics/pokemon/palafin/hero/normal.gbapal"); - const u32 gMonBackPic_PalafinHero[] = INCBIN_U32("graphics/pokemon/palafin/hero/back.4bpp.lz"); + const u32 gMonBackPic_PalafinHero[] = INCBIN_U32("graphics/pokemon/palafin/hero/back.4bpp.smol"); const u16 gMonShinyPalette_PalafinHero[] = INCBIN_U16("graphics/pokemon/palafin/hero/shiny.gbapal"); const u8 gMonIcon_PalafinHero[] = INCBIN_U8("graphics/pokemon/palafin/hero/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -25662,9 +25716,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FINIZEN #if P_FAMILY_VAROOM - const u32 gMonFrontPic_Varoom[] = INCBIN_U32("graphics/pokemon/varoom/front.4bpp.lz"); + const u32 gMonFrontPic_Varoom[] = INCBIN_U32("graphics/pokemon/varoom/front.4bpp.smol"); const u16 gMonPalette_Varoom[] = INCBIN_U16("graphics/pokemon/varoom/normal.gbapal"); - const u32 gMonBackPic_Varoom[] = INCBIN_U32("graphics/pokemon/varoom/back.4bpp.lz"); + const u32 gMonBackPic_Varoom[] = INCBIN_U32("graphics/pokemon/varoom/back.4bpp.smol"); const u16 gMonShinyPalette_Varoom[] = INCBIN_U16("graphics/pokemon/varoom/shiny.gbapal"); const u8 gMonIcon_Varoom[] = INCBIN_U8("graphics/pokemon/varoom/icon.4bpp"); #if P_FOOTPRINTS @@ -25678,9 +25732,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Revavroom[] = INCBIN_U32("graphics/pokemon/revavroom/front.4bpp.lz"); + const u32 gMonFrontPic_Revavroom[] = INCBIN_U32("graphics/pokemon/revavroom/front.4bpp.smol"); const u16 gMonPalette_Revavroom[] = INCBIN_U16("graphics/pokemon/revavroom/normal.gbapal"); - const u32 gMonBackPic_Revavroom[] = INCBIN_U32("graphics/pokemon/revavroom/back.4bpp.lz"); + const u32 gMonBackPic_Revavroom[] = INCBIN_U32("graphics/pokemon/revavroom/back.4bpp.smol"); const u16 gMonShinyPalette_Revavroom[] = INCBIN_U16("graphics/pokemon/revavroom/shiny.gbapal"); const u8 gMonIcon_Revavroom[] = INCBIN_U8("graphics/pokemon/revavroom/icon.4bpp"); #if P_FOOTPRINTS @@ -25696,9 +25750,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_VAROOM #if P_FAMILY_CYCLIZAR - const u32 gMonFrontPic_Cyclizar[] = INCBIN_U32("graphics/pokemon/cyclizar/front.4bpp.lz"); + const u32 gMonFrontPic_Cyclizar[] = INCBIN_U32("graphics/pokemon/cyclizar/front.4bpp.smol"); const u16 gMonPalette_Cyclizar[] = INCBIN_U16("graphics/pokemon/cyclizar/normal.gbapal"); - const u32 gMonBackPic_Cyclizar[] = INCBIN_U32("graphics/pokemon/cyclizar/back.4bpp.lz"); + const u32 gMonBackPic_Cyclizar[] = INCBIN_U32("graphics/pokemon/cyclizar/back.4bpp.smol"); const u16 gMonShinyPalette_Cyclizar[] = INCBIN_U16("graphics/pokemon/cyclizar/shiny.gbapal"); const u8 gMonIcon_Cyclizar[] = INCBIN_U8("graphics/pokemon/cyclizar/icon.4bpp"); #if P_FOOTPRINTS @@ -25714,9 +25768,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CYCLIZAR #if P_FAMILY_ORTHWORM - const u32 gMonFrontPic_Orthworm[] = INCBIN_U32("graphics/pokemon/orthworm/front.4bpp.lz"); + const u32 gMonFrontPic_Orthworm[] = INCBIN_U32("graphics/pokemon/orthworm/front.4bpp.smol"); const u16 gMonPalette_Orthworm[] = INCBIN_U16("graphics/pokemon/orthworm/normal.gbapal"); - const u32 gMonBackPic_Orthworm[] = INCBIN_U32("graphics/pokemon/orthworm/back.4bpp.lz"); + const u32 gMonBackPic_Orthworm[] = INCBIN_U32("graphics/pokemon/orthworm/back.4bpp.smol"); const u16 gMonShinyPalette_Orthworm[] = INCBIN_U16("graphics/pokemon/orthworm/shiny.gbapal"); const u8 gMonIcon_Orthworm[] = INCBIN_U8("graphics/pokemon/orthworm/icon.4bpp"); #if P_FOOTPRINTS @@ -25732,9 +25786,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ORTHWORM #if P_FAMILY_GLIMMET - const u32 gMonFrontPic_Glimmet[] = INCBIN_U32("graphics/pokemon/glimmet/front.4bpp.lz"); + const u32 gMonFrontPic_Glimmet[] = INCBIN_U32("graphics/pokemon/glimmet/front.4bpp.smol"); const u16 gMonPalette_Glimmet[] = INCBIN_U16("graphics/pokemon/glimmet/normal.gbapal"); - const u32 gMonBackPic_Glimmet[] = INCBIN_U32("graphics/pokemon/glimmet/back.4bpp.lz"); + const u32 gMonBackPic_Glimmet[] = INCBIN_U32("graphics/pokemon/glimmet/back.4bpp.smol"); const u16 gMonShinyPalette_Glimmet[] = INCBIN_U16("graphics/pokemon/glimmet/shiny.gbapal"); const u8 gMonIcon_Glimmet[] = INCBIN_U8("graphics/pokemon/glimmet/icon.4bpp"); #if P_FOOTPRINTS @@ -25748,9 +25802,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Glimmora[] = INCBIN_U32("graphics/pokemon/glimmora/front.4bpp.lz"); + const u32 gMonFrontPic_Glimmora[] = INCBIN_U32("graphics/pokemon/glimmora/front.4bpp.smol"); const u16 gMonPalette_Glimmora[] = INCBIN_U16("graphics/pokemon/glimmora/normal.gbapal"); - const u32 gMonBackPic_Glimmora[] = INCBIN_U32("graphics/pokemon/glimmora/back.4bpp.lz"); + const u32 gMonBackPic_Glimmora[] = INCBIN_U32("graphics/pokemon/glimmora/back.4bpp.smol"); const u16 gMonShinyPalette_Glimmora[] = INCBIN_U16("graphics/pokemon/glimmora/shiny.gbapal"); const u8 gMonIcon_Glimmora[] = INCBIN_U8("graphics/pokemon/glimmora/icon.4bpp"); #if P_FOOTPRINTS @@ -25766,9 +25820,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GLIMMET #if P_FAMILY_GREAVARD - const u32 gMonFrontPic_Greavard[] = INCBIN_U32("graphics/pokemon/greavard/front.4bpp.lz"); + const u32 gMonFrontPic_Greavard[] = INCBIN_U32("graphics/pokemon/greavard/front.4bpp.smol"); const u16 gMonPalette_Greavard[] = INCBIN_U16("graphics/pokemon/greavard/normal.gbapal"); - const u32 gMonBackPic_Greavard[] = INCBIN_U32("graphics/pokemon/greavard/back.4bpp.lz"); + const u32 gMonBackPic_Greavard[] = INCBIN_U32("graphics/pokemon/greavard/back.4bpp.smol"); const u16 gMonShinyPalette_Greavard[] = INCBIN_U16("graphics/pokemon/greavard/shiny.gbapal"); const u8 gMonIcon_Greavard[] = INCBIN_U8("graphics/pokemon/greavard/icon.4bpp"); #if P_FOOTPRINTS @@ -25782,9 +25836,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Houndstone[] = INCBIN_U32("graphics/pokemon/houndstone/front.4bpp.lz"); + const u32 gMonFrontPic_Houndstone[] = INCBIN_U32("graphics/pokemon/houndstone/front.4bpp.smol"); const u16 gMonPalette_Houndstone[] = INCBIN_U16("graphics/pokemon/houndstone/normal.gbapal"); - const u32 gMonBackPic_Houndstone[] = INCBIN_U32("graphics/pokemon/houndstone/back.4bpp.lz"); + const u32 gMonBackPic_Houndstone[] = INCBIN_U32("graphics/pokemon/houndstone/back.4bpp.smol"); const u16 gMonShinyPalette_Houndstone[] = INCBIN_U16("graphics/pokemon/houndstone/shiny.gbapal"); const u8 gMonIcon_Houndstone[] = INCBIN_U8("graphics/pokemon/houndstone/icon.4bpp"); #if P_FOOTPRINTS @@ -25800,9 +25854,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GREAVARD #if P_FAMILY_FLAMIGO - const u32 gMonFrontPic_Flamigo[] = INCBIN_U32("graphics/pokemon/flamigo/front.4bpp.lz"); + const u32 gMonFrontPic_Flamigo[] = INCBIN_U32("graphics/pokemon/flamigo/front.4bpp.smol"); const u16 gMonPalette_Flamigo[] = INCBIN_U16("graphics/pokemon/flamigo/normal.gbapal"); - const u32 gMonBackPic_Flamigo[] = INCBIN_U32("graphics/pokemon/flamigo/back.4bpp.lz"); + const u32 gMonBackPic_Flamigo[] = INCBIN_U32("graphics/pokemon/flamigo/back.4bpp.smol"); const u16 gMonShinyPalette_Flamigo[] = INCBIN_U16("graphics/pokemon/flamigo/shiny.gbapal"); const u8 gMonIcon_Flamigo[] = INCBIN_U8("graphics/pokemon/flamigo/icon.4bpp"); #if P_FOOTPRINTS @@ -25818,9 +25872,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FLAMIGO #if P_FAMILY_CETODDLE - const u32 gMonFrontPic_Cetoddle[] = INCBIN_U32("graphics/pokemon/cetoddle/front.4bpp.lz"); + const u32 gMonFrontPic_Cetoddle[] = INCBIN_U32("graphics/pokemon/cetoddle/front.4bpp.smol"); const u16 gMonPalette_Cetoddle[] = INCBIN_U16("graphics/pokemon/cetoddle/normal.gbapal"); - const u32 gMonBackPic_Cetoddle[] = INCBIN_U32("graphics/pokemon/cetoddle/back.4bpp.lz"); + const u32 gMonBackPic_Cetoddle[] = INCBIN_U32("graphics/pokemon/cetoddle/back.4bpp.smol"); const u16 gMonShinyPalette_Cetoddle[] = INCBIN_U16("graphics/pokemon/cetoddle/shiny.gbapal"); const u8 gMonIcon_Cetoddle[] = INCBIN_U8("graphics/pokemon/cetoddle/icon.4bpp"); #if P_FOOTPRINTS @@ -25834,9 +25888,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Cetitan[] = INCBIN_U32("graphics/pokemon/cetitan/front.4bpp.lz"); + const u32 gMonFrontPic_Cetitan[] = INCBIN_U32("graphics/pokemon/cetitan/front.4bpp.smol"); const u16 gMonPalette_Cetitan[] = INCBIN_U16("graphics/pokemon/cetitan/normal.gbapal"); - const u32 gMonBackPic_Cetitan[] = INCBIN_U32("graphics/pokemon/cetitan/back.4bpp.lz"); + const u32 gMonBackPic_Cetitan[] = INCBIN_U32("graphics/pokemon/cetitan/back.4bpp.smol"); const u16 gMonShinyPalette_Cetitan[] = INCBIN_U16("graphics/pokemon/cetitan/shiny.gbapal"); const u8 gMonIcon_Cetitan[] = INCBIN_U8("graphics/pokemon/cetitan/icon.4bpp"); #if P_FOOTPRINTS @@ -25852,9 +25906,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CETODDLE #if P_FAMILY_VELUZA - const u32 gMonFrontPic_Veluza[] = INCBIN_U32("graphics/pokemon/veluza/front.4bpp.lz"); + const u32 gMonFrontPic_Veluza[] = INCBIN_U32("graphics/pokemon/veluza/front.4bpp.smol"); const u16 gMonPalette_Veluza[] = INCBIN_U16("graphics/pokemon/veluza/normal.gbapal"); - const u32 gMonBackPic_Veluza[] = INCBIN_U32("graphics/pokemon/veluza/back.4bpp.lz"); + const u32 gMonBackPic_Veluza[] = INCBIN_U32("graphics/pokemon/veluza/back.4bpp.smol"); const u16 gMonShinyPalette_Veluza[] = INCBIN_U16("graphics/pokemon/veluza/shiny.gbapal"); const u8 gMonIcon_Veluza[] = INCBIN_U8("graphics/pokemon/veluza/icon.4bpp"); #if P_FOOTPRINTS @@ -25870,9 +25924,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_VELUZA #if P_FAMILY_DONDOZO - const u32 gMonFrontPic_Dondozo[] = INCBIN_U32("graphics/pokemon/dondozo/front.4bpp.lz"); + const u32 gMonFrontPic_Dondozo[] = INCBIN_U32("graphics/pokemon/dondozo/front.4bpp.smol"); const u16 gMonPalette_Dondozo[] = INCBIN_U16("graphics/pokemon/dondozo/normal.gbapal"); - const u32 gMonBackPic_Dondozo[] = INCBIN_U32("graphics/pokemon/dondozo/back.4bpp.lz"); + const u32 gMonBackPic_Dondozo[] = INCBIN_U32("graphics/pokemon/dondozo/back.4bpp.smol"); const u16 gMonShinyPalette_Dondozo[] = INCBIN_U16("graphics/pokemon/dondozo/shiny.gbapal"); const u8 gMonIcon_Dondozo[] = INCBIN_U8("graphics/pokemon/dondozo/icon.4bpp"); #if P_FOOTPRINTS @@ -25888,9 +25942,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DONDOZO #if P_FAMILY_TATSUGIRI - const u32 gMonFrontPic_TatsugiriCurly[] = INCBIN_U32("graphics/pokemon/tatsugiri/front.4bpp.lz"); + const u32 gMonFrontPic_TatsugiriCurly[] = INCBIN_U32("graphics/pokemon/tatsugiri/front.4bpp.smol"); const u16 gMonPalette_TatsugiriCurly[] = INCBIN_U16("graphics/pokemon/tatsugiri/normal.gbapal"); - const u32 gMonBackPic_TatsugiriCurly[] = INCBIN_U32("graphics/pokemon/tatsugiri/back.4bpp.lz"); + const u32 gMonBackPic_TatsugiriCurly[] = INCBIN_U32("graphics/pokemon/tatsugiri/back.4bpp.smol"); const u16 gMonShinyPalette_TatsugiriCurly[] = INCBIN_U16("graphics/pokemon/tatsugiri/shiny.gbapal"); const u8 gMonIcon_TatsugiriCurly[] = INCBIN_U8("graphics/pokemon/tatsugiri/icon.4bpp"); #if P_FOOTPRINTS @@ -25904,9 +25958,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_TatsugiriDroopy[] = INCBIN_U32("graphics/pokemon/tatsugiri/droopy/front.4bpp.lz"); + const u32 gMonFrontPic_TatsugiriDroopy[] = INCBIN_U32("graphics/pokemon/tatsugiri/droopy/front.4bpp.smol"); const u16 gMonPalette_TatsugiriDroopy[] = INCBIN_U16("graphics/pokemon/tatsugiri/droopy/normal.gbapal"); - const u32 gMonBackPic_TatsugiriDroopy[] = INCBIN_U32("graphics/pokemon/tatsugiri/droopy/back.4bpp.lz"); + const u32 gMonBackPic_TatsugiriDroopy[] = INCBIN_U32("graphics/pokemon/tatsugiri/droopy/back.4bpp.smol"); const u16 gMonShinyPalette_TatsugiriDroopy[] = INCBIN_U16("graphics/pokemon/tatsugiri/droopy/shiny.gbapal"); const u8 gMonIcon_TatsugiriDroopy[] = INCBIN_U8("graphics/pokemon/tatsugiri/droopy/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -25917,9 +25971,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_TatsugiriStretchy[] = INCBIN_U32("graphics/pokemon/tatsugiri/stretchy/front.4bpp.lz"); + const u32 gMonFrontPic_TatsugiriStretchy[] = INCBIN_U32("graphics/pokemon/tatsugiri/stretchy/front.4bpp.smol"); const u16 gMonPalette_TatsugiriStretchy[] = INCBIN_U16("graphics/pokemon/tatsugiri/stretchy/normal.gbapal"); - const u32 gMonBackPic_TatsugiriStretchy[] = INCBIN_U32("graphics/pokemon/tatsugiri/stretchy/back.4bpp.lz"); + const u32 gMonBackPic_TatsugiriStretchy[] = INCBIN_U32("graphics/pokemon/tatsugiri/stretchy/back.4bpp.smol"); const u16 gMonShinyPalette_TatsugiriStretchy[] = INCBIN_U16("graphics/pokemon/tatsugiri/stretchy/shiny.gbapal"); const u8 gMonIcon_TatsugiriStretchy[] = INCBIN_U8("graphics/pokemon/tatsugiri/stretchy/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -25932,9 +25986,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DONDOZO #if P_FAMILY_GREAT_TUSK - const u32 gMonFrontPic_GreatTusk[] = INCBIN_U32("graphics/pokemon/great_tusk/front.4bpp.lz"); + const u32 gMonFrontPic_GreatTusk[] = INCBIN_U32("graphics/pokemon/great_tusk/front.4bpp.smol"); const u16 gMonPalette_GreatTusk[] = INCBIN_U16("graphics/pokemon/great_tusk/normal.gbapal"); - const u32 gMonBackPic_GreatTusk[] = INCBIN_U32("graphics/pokemon/great_tusk/back.4bpp.lz"); + const u32 gMonBackPic_GreatTusk[] = INCBIN_U32("graphics/pokemon/great_tusk/back.4bpp.smol"); const u16 gMonShinyPalette_GreatTusk[] = INCBIN_U16("graphics/pokemon/great_tusk/shiny.gbapal"); const u8 gMonIcon_GreatTusk[] = INCBIN_U8("graphics/pokemon/great_tusk/icon.4bpp"); #if P_FOOTPRINTS @@ -25950,9 +26004,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GREAT_TUSK #if P_FAMILY_SCREAM_TAIL - const u32 gMonFrontPic_ScreamTail[] = INCBIN_U32("graphics/pokemon/scream_tail/front.4bpp.lz"); + const u32 gMonFrontPic_ScreamTail[] = INCBIN_U32("graphics/pokemon/scream_tail/front.4bpp.smol"); const u16 gMonPalette_ScreamTail[] = INCBIN_U16("graphics/pokemon/scream_tail/normal.gbapal"); - const u32 gMonBackPic_ScreamTail[] = INCBIN_U32("graphics/pokemon/scream_tail/back.4bpp.lz"); + const u32 gMonBackPic_ScreamTail[] = INCBIN_U32("graphics/pokemon/scream_tail/back.4bpp.smol"); const u16 gMonShinyPalette_ScreamTail[] = INCBIN_U16("graphics/pokemon/scream_tail/shiny.gbapal"); const u8 gMonIcon_ScreamTail[] = INCBIN_U8("graphics/pokemon/scream_tail/icon.4bpp"); #if P_FOOTPRINTS @@ -25968,9 +26022,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SCREAM_TAIL #if P_FAMILY_BRUTE_BONNET - const u32 gMonFrontPic_BruteBonnet[] = INCBIN_U32("graphics/pokemon/brute_bonnet/front.4bpp.lz"); + const u32 gMonFrontPic_BruteBonnet[] = INCBIN_U32("graphics/pokemon/brute_bonnet/front.4bpp.smol"); const u16 gMonPalette_BruteBonnet[] = INCBIN_U16("graphics/pokemon/brute_bonnet/normal.gbapal"); - const u32 gMonBackPic_BruteBonnet[] = INCBIN_U32("graphics/pokemon/brute_bonnet/back.4bpp.lz"); + const u32 gMonBackPic_BruteBonnet[] = INCBIN_U32("graphics/pokemon/brute_bonnet/back.4bpp.smol"); const u16 gMonShinyPalette_BruteBonnet[] = INCBIN_U16("graphics/pokemon/brute_bonnet/shiny.gbapal"); const u8 gMonIcon_BruteBonnet[] = INCBIN_U8("graphics/pokemon/brute_bonnet/icon.4bpp"); #if P_FOOTPRINTS @@ -25986,9 +26040,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BRUTE_BONNET #if P_FAMILY_FLUTTER_MANE - const u32 gMonFrontPic_FlutterMane[] = INCBIN_U32("graphics/pokemon/flutter_mane/front.4bpp.lz"); + const u32 gMonFrontPic_FlutterMane[] = INCBIN_U32("graphics/pokemon/flutter_mane/front.4bpp.smol"); const u16 gMonPalette_FlutterMane[] = INCBIN_U16("graphics/pokemon/flutter_mane/normal.gbapal"); - const u32 gMonBackPic_FlutterMane[] = INCBIN_U32("graphics/pokemon/flutter_mane/back.4bpp.lz"); + const u32 gMonBackPic_FlutterMane[] = INCBIN_U32("graphics/pokemon/flutter_mane/back.4bpp.smol"); const u16 gMonShinyPalette_FlutterMane[] = INCBIN_U16("graphics/pokemon/flutter_mane/shiny.gbapal"); const u8 gMonIcon_FlutterMane[] = INCBIN_U8("graphics/pokemon/flutter_mane/icon.4bpp"); #if P_FOOTPRINTS @@ -26004,9 +26058,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FLUTTER_MANE #if P_FAMILY_SLITHER_WING - const u32 gMonFrontPic_SlitherWing[] = INCBIN_U32("graphics/pokemon/slither_wing/front.4bpp.lz"); + const u32 gMonFrontPic_SlitherWing[] = INCBIN_U32("graphics/pokemon/slither_wing/front.4bpp.smol"); const u16 gMonPalette_SlitherWing[] = INCBIN_U16("graphics/pokemon/slither_wing/normal.gbapal"); - const u32 gMonBackPic_SlitherWing[] = INCBIN_U32("graphics/pokemon/slither_wing/back.4bpp.lz"); + const u32 gMonBackPic_SlitherWing[] = INCBIN_U32("graphics/pokemon/slither_wing/back.4bpp.smol"); const u16 gMonShinyPalette_SlitherWing[] = INCBIN_U16("graphics/pokemon/slither_wing/shiny.gbapal"); const u8 gMonIcon_SlitherWing[] = INCBIN_U8("graphics/pokemon/slither_wing/icon.4bpp"); #if P_FOOTPRINTS @@ -26022,9 +26076,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SLITHER_WING #if P_FAMILY_SANDY_SHOCKS - const u32 gMonFrontPic_SandyShocks[] = INCBIN_U32("graphics/pokemon/sandy_shocks/front.4bpp.lz"); + const u32 gMonFrontPic_SandyShocks[] = INCBIN_U32("graphics/pokemon/sandy_shocks/front.4bpp.smol"); const u16 gMonPalette_SandyShocks[] = INCBIN_U16("graphics/pokemon/sandy_shocks/normal.gbapal"); - const u32 gMonBackPic_SandyShocks[] = INCBIN_U32("graphics/pokemon/sandy_shocks/back.4bpp.lz"); + const u32 gMonBackPic_SandyShocks[] = INCBIN_U32("graphics/pokemon/sandy_shocks/back.4bpp.smol"); const u16 gMonShinyPalette_SandyShocks[] = INCBIN_U16("graphics/pokemon/sandy_shocks/shiny.gbapal"); const u8 gMonIcon_SandyShocks[] = INCBIN_U8("graphics/pokemon/sandy_shocks/icon.4bpp"); #if P_FOOTPRINTS @@ -26040,9 +26094,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SANDY_SHOCKS #if P_FAMILY_IRON_TREADS - const u32 gMonFrontPic_IronTreads[] = INCBIN_U32("graphics/pokemon/iron_treads/front.4bpp.lz"); + const u32 gMonFrontPic_IronTreads[] = INCBIN_U32("graphics/pokemon/iron_treads/front.4bpp.smol"); const u16 gMonPalette_IronTreads[] = INCBIN_U16("graphics/pokemon/iron_treads/normal.gbapal"); - const u32 gMonBackPic_IronTreads[] = INCBIN_U32("graphics/pokemon/iron_treads/back.4bpp.lz"); + const u32 gMonBackPic_IronTreads[] = INCBIN_U32("graphics/pokemon/iron_treads/back.4bpp.smol"); const u16 gMonShinyPalette_IronTreads[] = INCBIN_U16("graphics/pokemon/iron_treads/shiny.gbapal"); const u8 gMonIcon_IronTreads[] = INCBIN_U8("graphics/pokemon/iron_treads/icon.4bpp"); #if P_FOOTPRINTS @@ -26058,9 +26112,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IRON_TREADS #if P_FAMILY_IRON_BUNDLE - const u32 gMonFrontPic_IronBundle[] = INCBIN_U32("graphics/pokemon/iron_bundle/front.4bpp.lz"); + const u32 gMonFrontPic_IronBundle[] = INCBIN_U32("graphics/pokemon/iron_bundle/front.4bpp.smol"); const u16 gMonPalette_IronBundle[] = INCBIN_U16("graphics/pokemon/iron_bundle/normal.gbapal"); - const u32 gMonBackPic_IronBundle[] = INCBIN_U32("graphics/pokemon/iron_bundle/back.4bpp.lz"); + const u32 gMonBackPic_IronBundle[] = INCBIN_U32("graphics/pokemon/iron_bundle/back.4bpp.smol"); const u16 gMonShinyPalette_IronBundle[] = INCBIN_U16("graphics/pokemon/iron_bundle/shiny.gbapal"); const u8 gMonIcon_IronBundle[] = INCBIN_U8("graphics/pokemon/iron_bundle/icon.4bpp"); #if P_FOOTPRINTS @@ -26076,9 +26130,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IRON_BUNDLE #if P_FAMILY_IRON_HANDS - const u32 gMonFrontPic_IronHands[] = INCBIN_U32("graphics/pokemon/iron_hands/front.4bpp.lz"); + const u32 gMonFrontPic_IronHands[] = INCBIN_U32("graphics/pokemon/iron_hands/front.4bpp.smol"); const u16 gMonPalette_IronHands[] = INCBIN_U16("graphics/pokemon/iron_hands/normal.gbapal"); - const u32 gMonBackPic_IronHands[] = INCBIN_U32("graphics/pokemon/iron_hands/back.4bpp.lz"); + const u32 gMonBackPic_IronHands[] = INCBIN_U32("graphics/pokemon/iron_hands/back.4bpp.smol"); const u16 gMonShinyPalette_IronHands[] = INCBIN_U16("graphics/pokemon/iron_hands/shiny.gbapal"); const u8 gMonIcon_IronHands[] = INCBIN_U8("graphics/pokemon/iron_hands/icon.4bpp"); #if P_FOOTPRINTS @@ -26094,9 +26148,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IRON_HANDS #if P_FAMILY_IRON_JUGULIS - const u32 gMonFrontPic_IronJugulis[] = INCBIN_U32("graphics/pokemon/iron_jugulis/front.4bpp.lz"); + const u32 gMonFrontPic_IronJugulis[] = INCBIN_U32("graphics/pokemon/iron_jugulis/front.4bpp.smol"); const u16 gMonPalette_IronJugulis[] = INCBIN_U16("graphics/pokemon/iron_jugulis/normal.gbapal"); - const u32 gMonBackPic_IronJugulis[] = INCBIN_U32("graphics/pokemon/iron_jugulis/back.4bpp.lz"); + const u32 gMonBackPic_IronJugulis[] = INCBIN_U32("graphics/pokemon/iron_jugulis/back.4bpp.smol"); const u16 gMonShinyPalette_IronJugulis[] = INCBIN_U16("graphics/pokemon/iron_jugulis/shiny.gbapal"); const u8 gMonIcon_IronJugulis[] = INCBIN_U8("graphics/pokemon/iron_jugulis/icon.4bpp"); #if P_FOOTPRINTS @@ -26112,9 +26166,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IRON_JUGULIS #if P_FAMILY_IRON_MOTH - const u32 gMonFrontPic_IronMoth[] = INCBIN_U32("graphics/pokemon/iron_moth/front.4bpp.lz"); + const u32 gMonFrontPic_IronMoth[] = INCBIN_U32("graphics/pokemon/iron_moth/front.4bpp.smol"); const u16 gMonPalette_IronMoth[] = INCBIN_U16("graphics/pokemon/iron_moth/normal.gbapal"); - const u32 gMonBackPic_IronMoth[] = INCBIN_U32("graphics/pokemon/iron_moth/back.4bpp.lz"); + const u32 gMonBackPic_IronMoth[] = INCBIN_U32("graphics/pokemon/iron_moth/back.4bpp.smol"); const u16 gMonShinyPalette_IronMoth[] = INCBIN_U16("graphics/pokemon/iron_moth/shiny.gbapal"); const u8 gMonIcon_IronMoth[] = INCBIN_U8("graphics/pokemon/iron_moth/icon.4bpp"); #if P_FOOTPRINTS @@ -26130,9 +26184,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IRON_MOTH #if P_FAMILY_IRON_THORNS - const u32 gMonFrontPic_IronThorns[] = INCBIN_U32("graphics/pokemon/iron_thorns/front.4bpp.lz"); + const u32 gMonFrontPic_IronThorns[] = INCBIN_U32("graphics/pokemon/iron_thorns/front.4bpp.smol"); const u16 gMonPalette_IronThorns[] = INCBIN_U16("graphics/pokemon/iron_thorns/normal.gbapal"); - const u32 gMonBackPic_IronThorns[] = INCBIN_U32("graphics/pokemon/iron_thorns/back.4bpp.lz"); + const u32 gMonBackPic_IronThorns[] = INCBIN_U32("graphics/pokemon/iron_thorns/back.4bpp.smol"); const u16 gMonShinyPalette_IronThorns[] = INCBIN_U16("graphics/pokemon/iron_thorns/shiny.gbapal"); const u8 gMonIcon_IronThorns[] = INCBIN_U8("graphics/pokemon/iron_thorns/icon.4bpp"); #if P_FOOTPRINTS @@ -26148,9 +26202,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IRON_THORNS #if P_FAMILY_FRIGIBAX - const u32 gMonFrontPic_Frigibax[] = INCBIN_U32("graphics/pokemon/frigibax/front.4bpp.lz"); + const u32 gMonFrontPic_Frigibax[] = INCBIN_U32("graphics/pokemon/frigibax/front.4bpp.smol"); const u16 gMonPalette_Frigibax[] = INCBIN_U16("graphics/pokemon/frigibax/normal.gbapal"); - const u32 gMonBackPic_Frigibax[] = INCBIN_U32("graphics/pokemon/frigibax/back.4bpp.lz"); + const u32 gMonBackPic_Frigibax[] = INCBIN_U32("graphics/pokemon/frigibax/back.4bpp.smol"); const u16 gMonShinyPalette_Frigibax[] = INCBIN_U16("graphics/pokemon/frigibax/shiny.gbapal"); const u8 gMonIcon_Frigibax[] = INCBIN_U8("graphics/pokemon/frigibax/icon.4bpp"); #if P_FOOTPRINTS @@ -26164,9 +26218,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Arctibax[] = INCBIN_U32("graphics/pokemon/arctibax/front.4bpp.lz"); + const u32 gMonFrontPic_Arctibax[] = INCBIN_U32("graphics/pokemon/arctibax/front.4bpp.smol"); const u16 gMonPalette_Arctibax[] = INCBIN_U16("graphics/pokemon/arctibax/normal.gbapal"); - const u32 gMonBackPic_Arctibax[] = INCBIN_U32("graphics/pokemon/arctibax/back.4bpp.lz"); + const u32 gMonBackPic_Arctibax[] = INCBIN_U32("graphics/pokemon/arctibax/back.4bpp.smol"); const u16 gMonShinyPalette_Arctibax[] = INCBIN_U16("graphics/pokemon/arctibax/shiny.gbapal"); const u8 gMonIcon_Arctibax[] = INCBIN_U8("graphics/pokemon/arctibax/icon.4bpp"); #if P_FOOTPRINTS @@ -26180,9 +26234,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Baxcalibur[] = INCBIN_U32("graphics/pokemon/baxcalibur/front.4bpp.lz"); + const u32 gMonFrontPic_Baxcalibur[] = INCBIN_U32("graphics/pokemon/baxcalibur/front.4bpp.smol"); const u16 gMonPalette_Baxcalibur[] = INCBIN_U16("graphics/pokemon/baxcalibur/normal.gbapal"); - const u32 gMonBackPic_Baxcalibur[] = INCBIN_U32("graphics/pokemon/baxcalibur/back.4bpp.lz"); + const u32 gMonBackPic_Baxcalibur[] = INCBIN_U32("graphics/pokemon/baxcalibur/back.4bpp.smol"); const u16 gMonShinyPalette_Baxcalibur[] = INCBIN_U16("graphics/pokemon/baxcalibur/shiny.gbapal"); const u8 gMonIcon_Baxcalibur[] = INCBIN_U8("graphics/pokemon/baxcalibur/icon.4bpp"); #if P_FOOTPRINTS @@ -26198,9 +26252,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FRIGIBAX #if P_FAMILY_GIMMIGHOUL - const u32 gMonFrontPic_GimmighoulChest[] = INCBIN_U32("graphics/pokemon/gimmighoul/front.4bpp.lz"); + const u32 gMonFrontPic_GimmighoulChest[] = INCBIN_U32("graphics/pokemon/gimmighoul/front.4bpp.smol"); const u16 gMonPalette_GimmighoulChest[] = INCBIN_U16("graphics/pokemon/gimmighoul/normal.gbapal"); - const u32 gMonBackPic_GimmighoulChest[] = INCBIN_U32("graphics/pokemon/gimmighoul/back.4bpp.lz"); + const u32 gMonBackPic_GimmighoulChest[] = INCBIN_U32("graphics/pokemon/gimmighoul/back.4bpp.smol"); const u16 gMonShinyPalette_GimmighoulChest[] = INCBIN_U16("graphics/pokemon/gimmighoul/shiny.gbapal"); const u8 gMonIcon_GimmighoulChest[] = INCBIN_U8("graphics/pokemon/gimmighoul/icon.4bpp"); #if P_FOOTPRINTS @@ -26214,9 +26268,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_GimmighoulRoaming[] = INCBIN_U32("graphics/pokemon/gimmighoul/roaming/front.4bpp.lz"); + const u32 gMonFrontPic_GimmighoulRoaming[] = INCBIN_U32("graphics/pokemon/gimmighoul/roaming/front.4bpp.smol"); const u16 gMonPalette_GimmighoulRoaming[] = INCBIN_U16("graphics/pokemon/gimmighoul/roaming/normal.gbapal"); - const u32 gMonBackPic_GimmighoulRoaming[] = INCBIN_U32("graphics/pokemon/gimmighoul/roaming/back.4bpp.lz"); + const u32 gMonBackPic_GimmighoulRoaming[] = INCBIN_U32("graphics/pokemon/gimmighoul/roaming/back.4bpp.smol"); const u16 gMonShinyPalette_GimmighoulRoaming[] = INCBIN_U16("graphics/pokemon/gimmighoul/roaming/shiny.gbapal"); const u8 gMonIcon_GimmighoulRoaming[] = INCBIN_U8("graphics/pokemon/gimmighoul/roaming/icon.4bpp"); #if P_FOOTPRINTS @@ -26230,9 +26284,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Gholdengo[] = INCBIN_U32("graphics/pokemon/gholdengo/front.4bpp.lz"); + const u32 gMonFrontPic_Gholdengo[] = INCBIN_U32("graphics/pokemon/gholdengo/front.4bpp.smol"); const u16 gMonPalette_Gholdengo[] = INCBIN_U16("graphics/pokemon/gholdengo/normal.gbapal"); - const u32 gMonBackPic_Gholdengo[] = INCBIN_U32("graphics/pokemon/gholdengo/back.4bpp.lz"); + const u32 gMonBackPic_Gholdengo[] = INCBIN_U32("graphics/pokemon/gholdengo/back.4bpp.smol"); const u16 gMonShinyPalette_Gholdengo[] = INCBIN_U16("graphics/pokemon/gholdengo/shiny.gbapal"); const u8 gMonIcon_Gholdengo[] = INCBIN_U8("graphics/pokemon/gholdengo/icon.4bpp"); #if P_FOOTPRINTS @@ -26248,9 +26302,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GIMMIGHOUL #if P_FAMILY_WO_CHIEN - const u32 gMonFrontPic_WoChien[] = INCBIN_U32("graphics/pokemon/wo_chien/front.4bpp.lz"); + const u32 gMonFrontPic_WoChien[] = INCBIN_U32("graphics/pokemon/wo_chien/front.4bpp.smol"); const u16 gMonPalette_WoChien[] = INCBIN_U16("graphics/pokemon/wo_chien/normal.gbapal"); - const u32 gMonBackPic_WoChien[] = INCBIN_U32("graphics/pokemon/wo_chien/back.4bpp.lz"); + const u32 gMonBackPic_WoChien[] = INCBIN_U32("graphics/pokemon/wo_chien/back.4bpp.smol"); const u16 gMonShinyPalette_WoChien[] = INCBIN_U16("graphics/pokemon/wo_chien/shiny.gbapal"); const u8 gMonIcon_WoChien[] = INCBIN_U8("graphics/pokemon/wo_chien/icon.4bpp"); #if P_FOOTPRINTS @@ -26266,9 +26320,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_WO_CHIEN #if P_FAMILY_CHIEN_PAO - const u32 gMonFrontPic_ChienPao[] = INCBIN_U32("graphics/pokemon/chien_pao/front.4bpp.lz"); + const u32 gMonFrontPic_ChienPao[] = INCBIN_U32("graphics/pokemon/chien_pao/front.4bpp.smol"); const u16 gMonPalette_ChienPao[] = INCBIN_U16("graphics/pokemon/chien_pao/normal.gbapal"); - const u32 gMonBackPic_ChienPao[] = INCBIN_U32("graphics/pokemon/chien_pao/back.4bpp.lz"); + const u32 gMonBackPic_ChienPao[] = INCBIN_U32("graphics/pokemon/chien_pao/back.4bpp.smol"); const u16 gMonShinyPalette_ChienPao[] = INCBIN_U16("graphics/pokemon/chien_pao/shiny.gbapal"); const u8 gMonIcon_ChienPao[] = INCBIN_U8("graphics/pokemon/chien_pao/icon.4bpp"); #if P_FOOTPRINTS @@ -26284,9 +26338,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CHIEN_PAO #if P_FAMILY_TING_LU - const u32 gMonFrontPic_TingLu[] = INCBIN_U32("graphics/pokemon/ting_lu/front.4bpp.lz"); + const u32 gMonFrontPic_TingLu[] = INCBIN_U32("graphics/pokemon/ting_lu/front.4bpp.smol"); const u16 gMonPalette_TingLu[] = INCBIN_U16("graphics/pokemon/ting_lu/normal.gbapal"); - const u32 gMonBackPic_TingLu[] = INCBIN_U32("graphics/pokemon/ting_lu/back.4bpp.lz"); + const u32 gMonBackPic_TingLu[] = INCBIN_U32("graphics/pokemon/ting_lu/back.4bpp.smol"); const u16 gMonShinyPalette_TingLu[] = INCBIN_U16("graphics/pokemon/ting_lu/shiny.gbapal"); const u8 gMonIcon_TingLu[] = INCBIN_U8("graphics/pokemon/ting_lu/icon.4bpp"); #if P_FOOTPRINTS @@ -26302,9 +26356,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TING_LU #if P_FAMILY_CHI_YU - const u32 gMonFrontPic_ChiYu[] = INCBIN_U32("graphics/pokemon/chi_yu/front.4bpp.lz"); + const u32 gMonFrontPic_ChiYu[] = INCBIN_U32("graphics/pokemon/chi_yu/front.4bpp.smol"); const u16 gMonPalette_ChiYu[] = INCBIN_U16("graphics/pokemon/chi_yu/normal.gbapal"); - const u32 gMonBackPic_ChiYu[] = INCBIN_U32("graphics/pokemon/chi_yu/back.4bpp.lz"); + const u32 gMonBackPic_ChiYu[] = INCBIN_U32("graphics/pokemon/chi_yu/back.4bpp.smol"); const u16 gMonShinyPalette_ChiYu[] = INCBIN_U16("graphics/pokemon/chi_yu/shiny.gbapal"); const u8 gMonIcon_ChiYu[] = INCBIN_U8("graphics/pokemon/chi_yu/icon.4bpp"); #if P_FOOTPRINTS @@ -26320,9 +26374,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CHI_YU #if P_FAMILY_ROARING_MOON - const u32 gMonFrontPic_RoaringMoon[] = INCBIN_U32("graphics/pokemon/roaring_moon/front.4bpp.lz"); + const u32 gMonFrontPic_RoaringMoon[] = INCBIN_U32("graphics/pokemon/roaring_moon/front.4bpp.smol"); const u16 gMonPalette_RoaringMoon[] = INCBIN_U16("graphics/pokemon/roaring_moon/normal.gbapal"); - const u32 gMonBackPic_RoaringMoon[] = INCBIN_U32("graphics/pokemon/roaring_moon/back.4bpp.lz"); + const u32 gMonBackPic_RoaringMoon[] = INCBIN_U32("graphics/pokemon/roaring_moon/back.4bpp.smol"); const u16 gMonShinyPalette_RoaringMoon[] = INCBIN_U16("graphics/pokemon/roaring_moon/shiny.gbapal"); const u8 gMonIcon_RoaringMoon[] = INCBIN_U8("graphics/pokemon/roaring_moon/icon.4bpp"); #if P_FOOTPRINTS @@ -26338,9 +26392,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ROARING_MOON #if P_FAMILY_IRON_VALIANT - const u32 gMonFrontPic_IronValiant[] = INCBIN_U32("graphics/pokemon/iron_valiant/front.4bpp.lz"); + const u32 gMonFrontPic_IronValiant[] = INCBIN_U32("graphics/pokemon/iron_valiant/front.4bpp.smol"); const u16 gMonPalette_IronValiant[] = INCBIN_U16("graphics/pokemon/iron_valiant/normal.gbapal"); - const u32 gMonBackPic_IronValiant[] = INCBIN_U32("graphics/pokemon/iron_valiant/back.4bpp.lz"); + const u32 gMonBackPic_IronValiant[] = INCBIN_U32("graphics/pokemon/iron_valiant/back.4bpp.smol"); const u16 gMonShinyPalette_IronValiant[] = INCBIN_U16("graphics/pokemon/iron_valiant/shiny.gbapal"); const u8 gMonIcon_IronValiant[] = INCBIN_U8("graphics/pokemon/iron_valiant/icon.4bpp"); #if P_FOOTPRINTS @@ -26356,9 +26410,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IRON_VALIANT #if P_FAMILY_KORAIDON - const u32 gMonFrontPic_Koraidon[] = INCBIN_U32("graphics/pokemon/koraidon/front.4bpp.lz"); + const u32 gMonFrontPic_Koraidon[] = INCBIN_U32("graphics/pokemon/koraidon/front.4bpp.smol"); const u16 gMonPalette_Koraidon[] = INCBIN_U16("graphics/pokemon/koraidon/normal.gbapal"); - const u32 gMonBackPic_Koraidon[] = INCBIN_U32("graphics/pokemon/koraidon/back.4bpp.lz"); + const u32 gMonBackPic_Koraidon[] = INCBIN_U32("graphics/pokemon/koraidon/back.4bpp.smol"); const u16 gMonShinyPalette_Koraidon[] = INCBIN_U16("graphics/pokemon/koraidon/shiny.gbapal"); const u8 gMonIcon_Koraidon[] = INCBIN_U8("graphics/pokemon/koraidon/icon.4bpp"); #if P_FOOTPRINTS @@ -26374,9 +26428,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_KORAIDON #if P_FAMILY_MIRAIDON - const u32 gMonFrontPic_Miraidon[] = INCBIN_U32("graphics/pokemon/miraidon/front.4bpp.lz"); + const u32 gMonFrontPic_Miraidon[] = INCBIN_U32("graphics/pokemon/miraidon/front.4bpp.smol"); const u16 gMonPalette_Miraidon[] = INCBIN_U16("graphics/pokemon/miraidon/normal.gbapal"); - const u32 gMonBackPic_Miraidon[] = INCBIN_U32("graphics/pokemon/miraidon/back.4bpp.lz"); + const u32 gMonBackPic_Miraidon[] = INCBIN_U32("graphics/pokemon/miraidon/back.4bpp.smol"); const u16 gMonShinyPalette_Miraidon[] = INCBIN_U16("graphics/pokemon/miraidon/shiny.gbapal"); const u8 gMonIcon_Miraidon[] = INCBIN_U8("graphics/pokemon/miraidon/icon.4bpp"); #if P_FOOTPRINTS @@ -26392,9 +26446,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MIRAIDON #if P_FAMILY_WALKING_WAKE - const u32 gMonFrontPic_WalkingWake[] = INCBIN_U32("graphics/pokemon/walking_wake/front.4bpp.lz"); + const u32 gMonFrontPic_WalkingWake[] = INCBIN_U32("graphics/pokemon/walking_wake/front.4bpp.smol"); const u16 gMonPalette_WalkingWake[] = INCBIN_U16("graphics/pokemon/walking_wake/normal.gbapal"); - const u32 gMonBackPic_WalkingWake[] = INCBIN_U32("graphics/pokemon/walking_wake/back.4bpp.lz"); + const u32 gMonBackPic_WalkingWake[] = INCBIN_U32("graphics/pokemon/walking_wake/back.4bpp.smol"); const u16 gMonShinyPalette_WalkingWake[] = INCBIN_U16("graphics/pokemon/walking_wake/shiny.gbapal"); const u8 gMonIcon_WalkingWake[] = INCBIN_U8("graphics/pokemon/walking_wake/icon.4bpp"); #if P_FOOTPRINTS @@ -26410,9 +26464,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_WALKING_WAKE #if P_FAMILY_IRON_LEAVES - const u32 gMonFrontPic_IronLeaves[] = INCBIN_U32("graphics/pokemon/iron_leaves/front.4bpp.lz"); + const u32 gMonFrontPic_IronLeaves[] = INCBIN_U32("graphics/pokemon/iron_leaves/front.4bpp.smol"); const u16 gMonPalette_IronLeaves[] = INCBIN_U16("graphics/pokemon/iron_leaves/normal.gbapal"); - const u32 gMonBackPic_IronLeaves[] = INCBIN_U32("graphics/pokemon/iron_leaves/back.4bpp.lz"); + const u32 gMonBackPic_IronLeaves[] = INCBIN_U32("graphics/pokemon/iron_leaves/back.4bpp.smol"); const u16 gMonShinyPalette_IronLeaves[] = INCBIN_U16("graphics/pokemon/iron_leaves/shiny.gbapal"); const u8 gMonIcon_IronLeaves[] = INCBIN_U8("graphics/pokemon/iron_leaves/icon.4bpp"); #if P_FOOTPRINTS @@ -26428,9 +26482,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IRON_LEAVES #if P_FAMILY_POLTCHAGEIST - const u32 gMonFrontPic_Poltchageist[] = INCBIN_U32("graphics/pokemon/poltchageist/front.4bpp.lz"); + const u32 gMonFrontPic_Poltchageist[] = INCBIN_U32("graphics/pokemon/poltchageist/front.4bpp.smol"); const u16 gMonPalette_Poltchageist[] = INCBIN_U16("graphics/pokemon/poltchageist/normal.gbapal"); - const u32 gMonBackPic_Poltchageist[] = INCBIN_U32("graphics/pokemon/poltchageist/back.4bpp.lz"); + const u32 gMonBackPic_Poltchageist[] = INCBIN_U32("graphics/pokemon/poltchageist/back.4bpp.smol"); const u16 gMonShinyPalette_Poltchageist[] = INCBIN_U16("graphics/pokemon/poltchageist/shiny.gbapal"); const u8 gMonIcon_Poltchageist[] = INCBIN_U8("graphics/pokemon/poltchageist/icon.4bpp"); #if P_FOOTPRINTS @@ -26444,9 +26498,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Sinistcha[] = INCBIN_U32("graphics/pokemon/sinistcha/front.4bpp.lz"); + const u32 gMonFrontPic_Sinistcha[] = INCBIN_U32("graphics/pokemon/sinistcha/front.4bpp.smol"); const u16 gMonPalette_Sinistcha[] = INCBIN_U16("graphics/pokemon/sinistcha/normal.gbapal"); - const u32 gMonBackPic_Sinistcha[] = INCBIN_U32("graphics/pokemon/sinistcha/back.4bpp.lz"); + const u32 gMonBackPic_Sinistcha[] = INCBIN_U32("graphics/pokemon/sinistcha/back.4bpp.smol"); const u16 gMonShinyPalette_Sinistcha[] = INCBIN_U16("graphics/pokemon/sinistcha/shiny.gbapal"); const u8 gMonIcon_Sinistcha[] = INCBIN_U8("graphics/pokemon/sinistcha/icon.4bpp"); #if P_FOOTPRINTS @@ -26462,9 +26516,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_POLTCHAGEIST #if P_FAMILY_OKIDOGI - const u32 gMonFrontPic_Okidogi[] = INCBIN_U32("graphics/pokemon/okidogi/front.4bpp.lz"); + const u32 gMonFrontPic_Okidogi[] = INCBIN_U32("graphics/pokemon/okidogi/front.4bpp.smol"); const u16 gMonPalette_Okidogi[] = INCBIN_U16("graphics/pokemon/okidogi/normal.gbapal"); - const u32 gMonBackPic_Okidogi[] = INCBIN_U32("graphics/pokemon/okidogi/back.4bpp.lz"); + const u32 gMonBackPic_Okidogi[] = INCBIN_U32("graphics/pokemon/okidogi/back.4bpp.smol"); const u16 gMonShinyPalette_Okidogi[] = INCBIN_U16("graphics/pokemon/okidogi/shiny.gbapal"); const u8 gMonIcon_Okidogi[] = INCBIN_U8("graphics/pokemon/okidogi/icon.4bpp"); #if P_FOOTPRINTS @@ -26480,9 +26534,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_OKIDOGI #if P_FAMILY_MUNKIDORI - const u32 gMonFrontPic_Munkidori[] = INCBIN_U32("graphics/pokemon/munkidori/front.4bpp.lz"); + const u32 gMonFrontPic_Munkidori[] = INCBIN_U32("graphics/pokemon/munkidori/front.4bpp.smol"); const u16 gMonPalette_Munkidori[] = INCBIN_U16("graphics/pokemon/munkidori/normal.gbapal"); - const u32 gMonBackPic_Munkidori[] = INCBIN_U32("graphics/pokemon/munkidori/back.4bpp.lz"); + const u32 gMonBackPic_Munkidori[] = INCBIN_U32("graphics/pokemon/munkidori/back.4bpp.smol"); const u16 gMonShinyPalette_Munkidori[] = INCBIN_U16("graphics/pokemon/munkidori/shiny.gbapal"); const u8 gMonIcon_Munkidori[] = INCBIN_U8("graphics/pokemon/munkidori/icon.4bpp"); #if P_FOOTPRINTS @@ -26498,9 +26552,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MUNKIDORI #if P_FAMILY_FEZANDIPITI - const u32 gMonFrontPic_Fezandipiti[] = INCBIN_U32("graphics/pokemon/fezandipiti/front.4bpp.lz"); + const u32 gMonFrontPic_Fezandipiti[] = INCBIN_U32("graphics/pokemon/fezandipiti/front.4bpp.smol"); const u16 gMonPalette_Fezandipiti[] = INCBIN_U16("graphics/pokemon/fezandipiti/normal.gbapal"); - const u32 gMonBackPic_Fezandipiti[] = INCBIN_U32("graphics/pokemon/fezandipiti/back.4bpp.lz"); + const u32 gMonBackPic_Fezandipiti[] = INCBIN_U32("graphics/pokemon/fezandipiti/back.4bpp.smol"); const u16 gMonShinyPalette_Fezandipiti[] = INCBIN_U16("graphics/pokemon/fezandipiti/shiny.gbapal"); const u8 gMonIcon_Fezandipiti[] = INCBIN_U8("graphics/pokemon/fezandipiti/icon.4bpp"); #if P_FOOTPRINTS @@ -26516,51 +26570,51 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FEZANDIPITI #if P_FAMILY_OGERPON - const u32 gMonFrontPic_OgerponTeal[] = INCBIN_U32("graphics/pokemon/ogerpon/front.4bpp.lz"); + const u32 gMonFrontPic_OgerponTeal[] = INCBIN_U32("graphics/pokemon/ogerpon/front.4bpp.smol"); const u16 gMonPalette_OgerponTeal[] = INCBIN_U16("graphics/pokemon/ogerpon/normal.gbapal"); - const u32 gMonBackPic_OgerponTeal[] = INCBIN_U32("graphics/pokemon/ogerpon/back.4bpp.lz"); + const u32 gMonBackPic_OgerponTeal[] = INCBIN_U32("graphics/pokemon/ogerpon/back.4bpp.smol"); const u16 gMonShinyPalette_OgerponTeal[] = INCBIN_U16("graphics/pokemon/ogerpon/shiny.gbapal"); const u8 gMonIcon_OgerponTeal[] = INCBIN_U8("graphics/pokemon/ogerpon/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Ogerpon[] = INCBIN_U8("graphics/pokemon/ogerpon/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_OgerponWellspring[] = INCBIN_U32("graphics/pokemon/ogerpon/wellspring/front.4bpp.lz"); + const u32 gMonFrontPic_OgerponWellspring[] = INCBIN_U32("graphics/pokemon/ogerpon/wellspring/front.4bpp.smol"); const u16 gMonPalette_OgerponWellspring[] = INCBIN_U16("graphics/pokemon/ogerpon/wellspring/normal.gbapal"); - const u32 gMonBackPic_OgerponWellspring[] = INCBIN_U32("graphics/pokemon/ogerpon/wellspring/back.4bpp.lz"); + const u32 gMonBackPic_OgerponWellspring[] = INCBIN_U32("graphics/pokemon/ogerpon/wellspring/back.4bpp.smol"); const u16 gMonShinyPalette_OgerponWellspring[] = INCBIN_U16("graphics/pokemon/ogerpon/wellspring/shiny.gbapal"); const u8 gMonIcon_OgerponWellspring[] = INCBIN_U8("graphics/pokemon/ogerpon/wellspring/icon.4bpp"); - const u32 gMonFrontPic_OgerponHearthflame[] = INCBIN_U32("graphics/pokemon/ogerpon/hearthflame/front.4bpp.lz"); + const u32 gMonFrontPic_OgerponHearthflame[] = INCBIN_U32("graphics/pokemon/ogerpon/hearthflame/front.4bpp.smol"); const u16 gMonPalette_OgerponHearthflame[] = INCBIN_U16("graphics/pokemon/ogerpon/hearthflame/normal.gbapal"); - const u32 gMonBackPic_OgerponHearthflame[] = INCBIN_U32("graphics/pokemon/ogerpon/hearthflame/back.4bpp.lz"); + const u32 gMonBackPic_OgerponHearthflame[] = INCBIN_U32("graphics/pokemon/ogerpon/hearthflame/back.4bpp.smol"); const u16 gMonShinyPalette_OgerponHearthflame[] = INCBIN_U16("graphics/pokemon/ogerpon/hearthflame/shiny.gbapal"); const u8 gMonIcon_OgerponHearthflame[] = INCBIN_U8("graphics/pokemon/ogerpon/hearthflame/icon.4bpp"); - const u32 gMonFrontPic_OgerponCornerstone[] = INCBIN_U32("graphics/pokemon/ogerpon/cornerstone/front.4bpp.lz"); + const u32 gMonFrontPic_OgerponCornerstone[] = INCBIN_U32("graphics/pokemon/ogerpon/cornerstone/front.4bpp.smol"); const u16 gMonPalette_OgerponCornerstone[] = INCBIN_U16("graphics/pokemon/ogerpon/cornerstone/normal.gbapal"); - const u32 gMonBackPic_OgerponCornerstone[] = INCBIN_U32("graphics/pokemon/ogerpon/cornerstone/back.4bpp.lz"); + const u32 gMonBackPic_OgerponCornerstone[] = INCBIN_U32("graphics/pokemon/ogerpon/cornerstone/back.4bpp.smol"); const u16 gMonShinyPalette_OgerponCornerstone[] = INCBIN_U16("graphics/pokemon/ogerpon/cornerstone/shiny.gbapal"); const u8 gMonIcon_OgerponCornerstone[] = INCBIN_U8("graphics/pokemon/ogerpon/cornerstone/icon.4bpp"); - const u32 gMonFrontPic_OgerponTealTera[] = INCBIN_U32("graphics/pokemon/ogerpon/teal_tera/front.4bpp.lz"); + const u32 gMonFrontPic_OgerponTealTera[] = INCBIN_U32("graphics/pokemon/ogerpon/teal_tera/front.4bpp.smol"); const u16 gMonPalette_OgerponTealTera[] = INCBIN_U16("graphics/pokemon/ogerpon/teal_tera/normal.gbapal"); - const u32 gMonBackPic_OgerponTealTera[] = INCBIN_U32("graphics/pokemon/ogerpon/teal_tera/back.4bpp.lz"); + const u32 gMonBackPic_OgerponTealTera[] = INCBIN_U32("graphics/pokemon/ogerpon/teal_tera/back.4bpp.smol"); const u16 gMonShinyPalette_OgerponTealTera[] = INCBIN_U16("graphics/pokemon/ogerpon/teal_tera/shiny.gbapal"); - const u32 gMonFrontPic_OgerponWellspringTera[] = INCBIN_U32("graphics/pokemon/ogerpon/wellspring_tera/front.4bpp.lz"); + const u32 gMonFrontPic_OgerponWellspringTera[] = INCBIN_U32("graphics/pokemon/ogerpon/wellspring_tera/front.4bpp.smol"); const u16 gMonPalette_OgerponWellspringTera[] = INCBIN_U16("graphics/pokemon/ogerpon/wellspring_tera/normal.gbapal"); - const u32 gMonBackPic_OgerponWellspringTera[] = INCBIN_U32("graphics/pokemon/ogerpon/wellspring_tera/back.4bpp.lz"); + const u32 gMonBackPic_OgerponWellspringTera[] = INCBIN_U32("graphics/pokemon/ogerpon/wellspring_tera/back.4bpp.smol"); const u16 gMonShinyPalette_OgerponWellspringTera[] = INCBIN_U16("graphics/pokemon/ogerpon/wellspring_tera/shiny.gbapal"); - const u32 gMonFrontPic_OgerponHearthflameTera[] = INCBIN_U32("graphics/pokemon/ogerpon/hearthflame_tera/front.4bpp.lz"); + const u32 gMonFrontPic_OgerponHearthflameTera[] = INCBIN_U32("graphics/pokemon/ogerpon/hearthflame_tera/front.4bpp.smol"); const u16 gMonPalette_OgerponHearthflameTera[] = INCBIN_U16("graphics/pokemon/ogerpon/hearthflame_tera/normal.gbapal"); - const u32 gMonBackPic_OgerponHearthflameTera[] = INCBIN_U32("graphics/pokemon/ogerpon/hearthflame_tera/back.4bpp.lz"); + const u32 gMonBackPic_OgerponHearthflameTera[] = INCBIN_U32("graphics/pokemon/ogerpon/hearthflame_tera/back.4bpp.smol"); const u16 gMonShinyPalette_OgerponHearthflameTera[] = INCBIN_U16("graphics/pokemon/ogerpon/hearthflame_tera/shiny.gbapal"); - const u32 gMonFrontPic_OgerponCornerstoneTera[] = INCBIN_U32("graphics/pokemon/ogerpon/cornerstone_tera/front.4bpp.lz"); + const u32 gMonFrontPic_OgerponCornerstoneTera[] = INCBIN_U32("graphics/pokemon/ogerpon/cornerstone_tera/front.4bpp.smol"); const u16 gMonPalette_OgerponCornerstoneTera[] = INCBIN_U16("graphics/pokemon/ogerpon/cornerstone_tera/normal.gbapal"); - const u32 gMonBackPic_OgerponCornerstoneTera[] = INCBIN_U32("graphics/pokemon/ogerpon/cornerstone_tera/back.4bpp.lz"); + const u32 gMonBackPic_OgerponCornerstoneTera[] = INCBIN_U32("graphics/pokemon/ogerpon/cornerstone_tera/back.4bpp.smol"); const u16 gMonShinyPalette_OgerponCornerstoneTera[] = INCBIN_U16("graphics/pokemon/ogerpon/cornerstone_tera/shiny.gbapal"); #if OW_POKEMON_OBJECT_EVENTS @@ -26593,9 +26647,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_OGERPON #if P_FAMILY_GOUGING_FIRE - const u32 gMonFrontPic_GougingFire[] = INCBIN_U32("graphics/pokemon/gouging_fire/front.4bpp.lz"); + const u32 gMonFrontPic_GougingFire[] = INCBIN_U32("graphics/pokemon/gouging_fire/front.4bpp.smol"); const u16 gMonPalette_GougingFire[] = INCBIN_U16("graphics/pokemon/gouging_fire/normal.gbapal"); - const u32 gMonBackPic_GougingFire[] = INCBIN_U32("graphics/pokemon/gouging_fire/back.4bpp.lz"); + const u32 gMonBackPic_GougingFire[] = INCBIN_U32("graphics/pokemon/gouging_fire/back.4bpp.smol"); const u16 gMonShinyPalette_GougingFire[] = INCBIN_U16("graphics/pokemon/gouging_fire/shiny.gbapal"); const u8 gMonIcon_GougingFire[] = INCBIN_U8("graphics/pokemon/gouging_fire/icon.4bpp"); #if P_FOOTPRINTS @@ -26611,9 +26665,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GOUGING_FIRE #if P_FAMILY_RAGING_BOLT - const u32 gMonFrontPic_RagingBolt[] = INCBIN_U32("graphics/pokemon/raging_bolt/front.4bpp.lz"); + const u32 gMonFrontPic_RagingBolt[] = INCBIN_U32("graphics/pokemon/raging_bolt/front.4bpp.smol"); const u16 gMonPalette_RagingBolt[] = INCBIN_U16("graphics/pokemon/raging_bolt/normal.gbapal"); - const u32 gMonBackPic_RagingBolt[] = INCBIN_U32("graphics/pokemon/raging_bolt/back.4bpp.lz"); + const u32 gMonBackPic_RagingBolt[] = INCBIN_U32("graphics/pokemon/raging_bolt/back.4bpp.smol"); const u16 gMonShinyPalette_RagingBolt[] = INCBIN_U16("graphics/pokemon/raging_bolt/shiny.gbapal"); const u8 gMonIcon_RagingBolt[] = INCBIN_U8("graphics/pokemon/raging_bolt/icon.4bpp"); #if P_FOOTPRINTS @@ -26629,9 +26683,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_RAGING_BOLT #if P_FAMILY_IRON_BOULDER - const u32 gMonFrontPic_IronBoulder[] = INCBIN_U32("graphics/pokemon/iron_boulder/front.4bpp.lz"); + const u32 gMonFrontPic_IronBoulder[] = INCBIN_U32("graphics/pokemon/iron_boulder/front.4bpp.smol"); const u16 gMonPalette_IronBoulder[] = INCBIN_U16("graphics/pokemon/iron_boulder/normal.gbapal"); - const u32 gMonBackPic_IronBoulder[] = INCBIN_U32("graphics/pokemon/iron_boulder/back.4bpp.lz"); + const u32 gMonBackPic_IronBoulder[] = INCBIN_U32("graphics/pokemon/iron_boulder/back.4bpp.smol"); const u16 gMonShinyPalette_IronBoulder[] = INCBIN_U16("graphics/pokemon/iron_boulder/shiny.gbapal"); const u8 gMonIcon_IronBoulder[] = INCBIN_U8("graphics/pokemon/iron_boulder/icon.4bpp"); #if P_FOOTPRINTS @@ -26647,9 +26701,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IRON_BOULDER #if P_FAMILY_IRON_CROWN - const u32 gMonFrontPic_IronCrown[] = INCBIN_U32("graphics/pokemon/iron_crown/front.4bpp.lz"); + const u32 gMonFrontPic_IronCrown[] = INCBIN_U32("graphics/pokemon/iron_crown/front.4bpp.smol"); const u16 gMonPalette_IronCrown[] = INCBIN_U16("graphics/pokemon/iron_crown/normal.gbapal"); - const u32 gMonBackPic_IronCrown[] = INCBIN_U32("graphics/pokemon/iron_crown/back.4bpp.lz"); + const u32 gMonBackPic_IronCrown[] = INCBIN_U32("graphics/pokemon/iron_crown/back.4bpp.smol"); const u16 gMonShinyPalette_IronCrown[] = INCBIN_U16("graphics/pokemon/iron_crown/shiny.gbapal"); const u8 gMonIcon_IronCrown[] = INCBIN_U8("graphics/pokemon/iron_crown/icon.4bpp"); #if P_FOOTPRINTS @@ -26665,9 +26719,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IRON_CROWN #if P_FAMILY_TERAPAGOS - const u32 gMonFrontPic_TerapagosNormal[] = INCBIN_U32("graphics/pokemon/terapagos/front.4bpp.lz"); + const u32 gMonFrontPic_TerapagosNormal[] = INCBIN_U32("graphics/pokemon/terapagos/front.4bpp.smol"); const u16 gMonPalette_TerapagosNormal[] = INCBIN_U16("graphics/pokemon/terapagos/normal.gbapal"); - const u32 gMonBackPic_TerapagosNormal[] = INCBIN_U32("graphics/pokemon/terapagos/back.4bpp.lz"); + const u32 gMonBackPic_TerapagosNormal[] = INCBIN_U32("graphics/pokemon/terapagos/back.4bpp.smol"); const u16 gMonShinyPalette_TerapagosNormal[] = INCBIN_U16("graphics/pokemon/terapagos/shiny.gbapal"); const u8 gMonIcon_TerapagosNormal[] = INCBIN_U8("graphics/pokemon/terapagos/icon.4bpp"); #if P_FOOTPRINTS @@ -26681,9 +26735,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_TerapagosTerastal[] = INCBIN_U32("graphics/pokemon/terapagos/terastal/front.4bpp.lz"); + const u32 gMonFrontPic_TerapagosTerastal[] = INCBIN_U32("graphics/pokemon/terapagos/terastal/front.4bpp.smol"); const u16 gMonPalette_TerapagosTerastal[] = INCBIN_U16("graphics/pokemon/terapagos/terastal/normal.gbapal"); - const u32 gMonBackPic_TerapagosTerastal[] = INCBIN_U32("graphics/pokemon/terapagos/terastal/back.4bpp.lz"); + const u32 gMonBackPic_TerapagosTerastal[] = INCBIN_U32("graphics/pokemon/terapagos/terastal/back.4bpp.smol"); const u16 gMonShinyPalette_TerapagosTerastal[] = INCBIN_U16("graphics/pokemon/terapagos/terastal/shiny.gbapal"); const u8 gMonIcon_TerapagosTerastal[] = INCBIN_U8("graphics/pokemon/terapagos/terastal/icon.4bpp"); #if P_FOOTPRINTS @@ -26697,9 +26751,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_TerapagosStellar[] = INCBIN_U32("graphics/pokemon/terapagos/stellar/front.4bpp.lz"); + const u32 gMonFrontPic_TerapagosStellar[] = INCBIN_U32("graphics/pokemon/terapagos/stellar/front.4bpp.smol"); const u16 gMonPalette_TerapagosStellar[] = INCBIN_U16("graphics/pokemon/terapagos/stellar/normal.gbapal"); - const u32 gMonBackPic_TerapagosStellar[] = INCBIN_U32("graphics/pokemon/terapagos/stellar/back.4bpp.lz"); + const u32 gMonBackPic_TerapagosStellar[] = INCBIN_U32("graphics/pokemon/terapagos/stellar/back.4bpp.smol"); const u16 gMonShinyPalette_TerapagosStellar[] = INCBIN_U16("graphics/pokemon/terapagos/stellar/shiny.gbapal"); const u8 gMonIcon_TerapagosStellar[] = INCBIN_U8("graphics/pokemon/terapagos/stellar/icon.4bpp"); #if P_FOOTPRINTS @@ -26715,9 +26769,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TERAPAGOS #if P_FAMILY_PECHARUNT - const u32 gMonFrontPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/front.4bpp.lz"); + const u32 gMonFrontPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/front.4bpp.smol"); const u16 gMonPalette_Pecharunt[] = INCBIN_U16("graphics/pokemon/pecharunt/normal.gbapal"); - const u32 gMonBackPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/back.4bpp.lz"); + const u32 gMonBackPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/back.4bpp.smol"); const u16 gMonShinyPalette_Pecharunt[] = INCBIN_U16("graphics/pokemon/pecharunt/shiny.gbapal"); const u8 gMonIcon_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/icon.4bpp"); #if P_FOOTPRINTS @@ -26732,6 +26786,6 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_PECHARUNT - const u32 gMonFrontPic_Egg[] = INCBIN_U32("graphics/pokemon/egg/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Egg[] = INCBIN_U32("graphics/pokemon/egg/anim_front.4bpp.smol"); const u16 gMonPalette_Egg[] = INCBIN_U16("graphics/pokemon/egg/normal.gbapal"); const u8 gMonIcon_Egg[] = INCBIN_U8("graphics/pokemon/egg/icon.4bpp"); diff --git a/src/data/graphics/rayquaza_scene.h b/src/data/graphics/rayquaza_scene.h index 6580c0bb57a1..305c1db7d086 100644 --- a/src/data/graphics/rayquaza_scene.h +++ b/src/data/graphics/rayquaza_scene.h @@ -1,60 +1,60 @@ // Scene 1 (RAY_ANIM_DUO_FIGHT / RAY_ANIM_DUO_FIGHT_PRE) -const u32 gRaySceneDuoFight_Groudon_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon.4bpp.lz"); -const u32 gRaySceneDuoFight_GroudonShoulder_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon_shoulder.4bpp.lz"); -const u32 gRaySceneDuoFight_GroudonClaw_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon_claw.4bpp.lz"); -const u32 gRaySceneDuoFight_Kyogre_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre.4bpp.lz"); -const u32 gRaySceneDuoFight_KyogrePectoralFin_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre_pectoral_fin.4bpp.lz"); -const u32 gRaySceneDuoFight_KyogreDorsalFin_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre_dorsal_fin.4bpp.lz"); +const u32 gRaySceneDuoFight_Groudon_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon.4bpp.smol"); +const u32 gRaySceneDuoFight_GroudonShoulder_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon_shoulder.4bpp.smol"); +const u32 gRaySceneDuoFight_GroudonClaw_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon_claw.4bpp.smol"); +const u32 gRaySceneDuoFight_Kyogre_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre.4bpp.smol"); +const u32 gRaySceneDuoFight_KyogrePectoralFin_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre_pectoral_fin.4bpp.smol"); +const u32 gRaySceneDuoFight_KyogreDorsalFin_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre_dorsal_fin.4bpp.smol"); const u16 gRaySceneDuoFight_Groudon_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_1/groudon.gbapal"); const u16 gRaySceneDuoFight_Kyogre_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_1/kyogre.gbapal"); -const u32 gRaySceneDuoFight_Clouds_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds.4bpp.lz"); +const u32 gRaySceneDuoFight_Clouds_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds.4bpp.smol"); const u16 gRaySceneDuoFight_Clouds_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_1/clouds.gbapal"); // pal 1 clouds, pal 2 rain -const u32 gRaySceneDuoFight_Clouds1_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds1.bin.lz"); -const u32 gRaySceneDuoFight_Clouds2_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds2.bin.lz"); -const u32 gRaySceneDuoFight_Clouds3_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds3.bin.lz"); +const u32 gRaySceneDuoFight_Clouds1_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds1.bin.smolTM"); +const u32 gRaySceneDuoFight_Clouds2_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds2.bin.smolTM"); +const u32 gRaySceneDuoFight_Clouds3_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds3.bin.smolTM"); // Scene 2 (RAY_ANIM_TAKES_FLIGHT) -const u32 gRaySceneTakesFlight_Smoke_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/smoke.4bpp.lz"); +const u32 gRaySceneTakesFlight_Smoke_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/smoke.4bpp.smol"); const u16 gRaySceneTakesFlight_Smoke_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_2/smoke.gbapal"); -const u32 gRaySceneTakesFlight_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/rayquaza.8bpp.lz"); +const u32 gRaySceneTakesFlight_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/rayquaza.8bpp.smol"); const u16 gRaySceneTakesFlight_Rayquaza_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_2/rayquaza.gbapal"); -const u32 gRaySceneTakesFlight_Rayquaza_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/rayquaza.bin.lz"); -const u32 gRaySceneTakesFlight_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/bg.4bpp.lz"); // uses pal 2 of gRaySceneTakesFlight_Rayquaza_Pal -const u32 gRaySceneTakesFlight_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/bg.bin.lz"); +const u32 gRaySceneTakesFlight_Rayquaza_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/rayquaza.bin.smolTM"); +const u32 gRaySceneTakesFlight_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/bg.4bpp.smol"); // uses pal 2 of gRaySceneTakesFlight_Rayquaza_Pal +const u32 gRaySceneTakesFlight_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/bg.bin.smolTM"); // Scene 3 (RAY_ANIM_DESCENDS) -const u32 gRaySceneDescends_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza.4bpp.lz"); -const u32 gRaySceneDescends_RayquazaTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza_tail.4bpp.lz"); -const u32 gRaySceneDescends_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.4bpp.lz"); -const u32 gRaySceneDescends_Light_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/light.4bpp.lz"); // uses pal 2 of gRaySceneDescends_Bg_Pal +const u32 gRaySceneDescends_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza.4bpp.smol"); +const u32 gRaySceneDescends_RayquazaTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza_tail.4bpp.smol"); +const u32 gRaySceneDescends_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.4bpp.smol"); +const u32 gRaySceneDescends_Light_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/light.4bpp.smol"); // uses pal 2 of gRaySceneDescends_Bg_Pal const u16 gRaySceneDescends_Bg_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_3/bg.gbapal"); -const u32 gRaySceneDescends_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.bin.lz"); -const u32 gRaySceneDescends_Light_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/light.bin.lz"); +const u32 gRaySceneDescends_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.bin.smolTM"); +const u32 gRaySceneDescends_Light_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/light.bin.smolTM"); // Scene 4 (RAY_ANIM_CHARGES) -const u32 gRaySceneCharges_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/bg.4bpp.lz"); -const u32 gRaySceneCharges_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/bg.bin.lz"); -const u32 gRaySceneCharges_Streaks_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/streaks.4bpp.lz"); -const u32 gRaySceneCharges_Streaks_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/streaks.bin.lz"); -const u32 gRaySceneCharges_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/rayquaza.4bpp.lz"); -const u32 gRaySceneCharges_Rayquaza_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/rayquaza.bin.lz"); -const u32 gRaySceneCharges_Orbs_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/orbs.bin.lz"); +const u32 gRaySceneCharges_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/bg.4bpp.smol"); +const u32 gRaySceneCharges_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/bg.bin.smolTM"); +const u32 gRaySceneCharges_Streaks_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/streaks.4bpp.smol"); +const u32 gRaySceneCharges_Streaks_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/streaks.bin.smolTM"); +const u32 gRaySceneCharges_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/rayquaza.4bpp.smol"); +const u32 gRaySceneCharges_Rayquaza_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/rayquaza.bin.smolTM"); +const u32 gRaySceneCharges_Orbs_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/orbs.bin.smolTM"); const u16 gRaySceneCharges_Bg_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_4/bg.gbapal"); // Scene 5 (RAY_ANIM_CHASES_AWAY) -const u32 gRaySceneChasesAway_Groudon_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/groudon.4bpp.lz"); -const u32 gRaySceneChasesAway_GroudonTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/groudon_tail.4bpp.lz"); -const u32 gRaySceneChasesAway_Kyogre_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre.4bpp.lz"); -const u32 gRaySceneChasesAway_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/rayquaza.4bpp.lz"); -const u32 gRaySceneChasesAway_RayquazaTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/rayquaza_tail.4bpp.lz"); -const u32 gRaySceneChasesAway_KyogreSplash_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre_splash.4bpp.lz"); +const u32 gRaySceneChasesAway_Groudon_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/groudon.4bpp.smol"); +const u32 gRaySceneChasesAway_GroudonTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/groudon_tail.4bpp.smol"); +const u32 gRaySceneChasesAway_Kyogre_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre.4bpp.smol"); +const u32 gRaySceneChasesAway_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/rayquaza.4bpp.smol"); +const u32 gRaySceneChasesAway_RayquazaTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/rayquaza_tail.4bpp.smol"); +const u32 gRaySceneChasesAway_KyogreSplash_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre_splash.4bpp.smol"); const u16 gRaySceneChasesAway_Groudon_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_5/groudon.gbapal"); const u16 gRaySceneChasesAway_Kyogre_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_5/kyogre.gbapal"); const u16 gRaySceneChasesAway_Rayquaza_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_5/rayquaza.gbapal"); const u16 gRaySceneChasesAway_KyogreSplash_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_5/kyogre_splash.gbapal"); -const u32 gRaySceneChasesAway_Light_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/light.4bpp.lz"); -const u32 gRaySceneChasesAway_Ring_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/ring.8bpp.lz"); -const u32 gRaySceneChasesAway_Light_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/light.bin.lz"); -const u32 gRaySceneChasesAway_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/bg.bin.lz"); -const u32 gRaySceneChasesAway_Ring_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/ring.bin.lz"); +const u32 gRaySceneChasesAway_Light_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/light.4bpp.smol"); +const u32 gRaySceneChasesAway_Ring_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/ring.8bpp.smol"); +const u32 gRaySceneChasesAway_Light_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/light.bin.smolTM"); +const u32 gRaySceneChasesAway_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/bg.bin.smolTM"); +const u32 gRaySceneChasesAway_Ring_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/ring.bin.smolTM"); const u16 gRaySceneChasesAway_Bg_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_5/bg.gbapal"); diff --git a/src/data/graphics/slot_machine.h b/src/data/graphics/slot_machine.h index 6500ad7f3b27..54799b14b553 100644 --- a/src/data/graphics/slot_machine.h +++ b/src/data/graphics/slot_machine.h @@ -1,5 +1,5 @@ const u16 gSlotMachineMenu_Pal[] = INCBIN_U16("graphics/slot_machine/menu.gbapal"); -const u32 gSlotMachineMenu_Gfx[] = INCBIN_U32("graphics/slot_machine/menu.4bpp.lz"); +const u32 gSlotMachineMenu_Gfx[] = INCBIN_U32("graphics/slot_machine/menu.4bpp.smol"); const u16 gSlotMachineMenu_Tilemap[] = INCBIN_U16("graphics/slot_machine/menu.bin"); const u16 gSlotMachineInfoBox_Tilemap[] = INCBIN_U16("graphics/slot_machine/info_box.bin"); @@ -20,7 +20,7 @@ const u8 gSlotMachineReelSymbol5Tiles[] = INCBIN_U8("graphics/slot_machine/reel_ const u8 gSlotMachineReelSymbol6Tiles[] = INCBIN_U8("graphics/slot_machine/reel_symbols/6.4bpp"); const u8 gSlotMachineReelSymbol7Tiles[] = INCBIN_U8("graphics/slot_machine/reel_symbols/7.4bpp"); -const u32 gSlotMachineDigitalDisplay_Gfx[] = INCBIN_U32("graphics/slot_machine/digital_display.4bpp.lz"); +const u32 gSlotMachineDigitalDisplay_Gfx[] = INCBIN_U32("graphics/slot_machine/digital_display.4bpp.smol"); const u8 gSlotMachineNumber0Tiles[] = INCBIN_U8("graphics/slot_machine/numbers/0.4bpp"); const u8 gSlotMachineNumber1Tiles[] = INCBIN_U8("graphics/slot_machine/numbers/1.4bpp"); diff --git a/src/data/graphics/trainers.h b/src/data/graphics/trainers.h index bfc3283ad346..d01e407d1268 100644 --- a/src/data/graphics/trainers.h +++ b/src/data/graphics/trainers.h @@ -1,283 +1,283 @@ #include "constants/trainers.h" #include "data.h" -const u32 gTrainerFrontPic_Hiker[] = INCBIN_U32("graphics/trainers/front_pics/hiker.4bpp.lz"); +const u32 gTrainerFrontPic_Hiker[] = INCBIN_U32("graphics/trainers/front_pics/hiker.4bpp.smol"); const u16 gTrainerPalette_Hiker[] = INCBIN_U16("graphics/trainers/front_pics/hiker.gbapal"); -const u32 gTrainerFrontPic_AquaGruntM[] = INCBIN_U32("graphics/trainers/front_pics/aqua_grunt_m.4bpp.lz"); +const u32 gTrainerFrontPic_AquaGruntM[] = INCBIN_U32("graphics/trainers/front_pics/aqua_grunt_m.4bpp.smol"); const u16 gTrainerPalette_AquaGruntM[] = INCBIN_U16("graphics/trainers/front_pics/aqua_grunt_m.gbapal"); -const u32 gTrainerFrontPic_PokemonBreederF[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_breeder_f.4bpp.lz"); +const u32 gTrainerFrontPic_PokemonBreederF[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_breeder_f.4bpp.smol"); const u16 gTrainerPalette_PokemonBreederF[] = INCBIN_U16("graphics/trainers/front_pics/pokemon_breeder_f.gbapal"); -const u32 gTrainerFrontPic_CoolTrainerM[] = INCBIN_U32("graphics/trainers/front_pics/cooltrainer_m.4bpp.lz"); +const u32 gTrainerFrontPic_CoolTrainerM[] = INCBIN_U32("graphics/trainers/front_pics/cooltrainer_m.4bpp.smol"); const u16 gTrainerPalette_CoolTrainerM[] = INCBIN_U16("graphics/trainers/front_pics/cooltrainer_m.gbapal"); -const u32 gTrainerFrontPic_BirdKeeper[] = INCBIN_U32("graphics/trainers/front_pics/bird_keeper.4bpp.lz"); +const u32 gTrainerFrontPic_BirdKeeper[] = INCBIN_U32("graphics/trainers/front_pics/bird_keeper.4bpp.smol"); const u16 gTrainerPalette_BirdKeeper[] = INCBIN_U16("graphics/trainers/front_pics/bird_keeper.gbapal"); -const u32 gTrainerFrontPic_Collector[] = INCBIN_U32("graphics/trainers/front_pics/collector.4bpp.lz"); +const u32 gTrainerFrontPic_Collector[] = INCBIN_U32("graphics/trainers/front_pics/collector.4bpp.smol"); const u16 gTrainerPalette_Collector[] = INCBIN_U16("graphics/trainers/front_pics/collector.gbapal"); -const u32 gTrainerFrontPic_AquaGruntF[] = INCBIN_U32("graphics/trainers/front_pics/aqua_grunt_f.4bpp.lz"); +const u32 gTrainerFrontPic_AquaGruntF[] = INCBIN_U32("graphics/trainers/front_pics/aqua_grunt_f.4bpp.smol"); const u16 gTrainerPalette_AquaGruntF[] = INCBIN_U16("graphics/trainers/front_pics/aqua_grunt_f.gbapal"); -const u32 gTrainerFrontPic_SwimmerM[] = INCBIN_U32("graphics/trainers/front_pics/swimmer_m.4bpp.lz"); +const u32 gTrainerFrontPic_SwimmerM[] = INCBIN_U32("graphics/trainers/front_pics/swimmer_m.4bpp.smol"); const u16 gTrainerPalette_SwimmerM[] = INCBIN_U16("graphics/trainers/front_pics/swimmer_m.gbapal"); -const u32 gTrainerFrontPic_MagmaGruntM[] = INCBIN_U32("graphics/trainers/front_pics/magma_grunt_m.4bpp.lz"); +const u32 gTrainerFrontPic_MagmaGruntM[] = INCBIN_U32("graphics/trainers/front_pics/magma_grunt_m.4bpp.smol"); const u16 gTrainerPalette_MagmaGruntM[] = INCBIN_U16("graphics/trainers/front_pics/magma_grunt_m.gbapal"); -const u32 gTrainerFrontPic_ExpertM[] = INCBIN_U32("graphics/trainers/front_pics/expert_m.4bpp.lz"); +const u32 gTrainerFrontPic_ExpertM[] = INCBIN_U32("graphics/trainers/front_pics/expert_m.4bpp.smol"); const u16 gTrainerPalette_ExpertM[] = INCBIN_U16("graphics/trainers/front_pics/expert_m.gbapal"); -const u32 gTrainerFrontPic_AquaAdminM[] = INCBIN_U32("graphics/trainers/front_pics/aqua_admin_m.4bpp.lz"); +const u32 gTrainerFrontPic_AquaAdminM[] = INCBIN_U32("graphics/trainers/front_pics/aqua_admin_m.4bpp.smol"); const u16 gTrainerPalette_AquaAdminM[] = INCBIN_U16("graphics/trainers/front_pics/aqua_admin_m.gbapal"); -const u32 gTrainerFrontPic_BlackBelt[] = INCBIN_U32("graphics/trainers/front_pics/black_belt.4bpp.lz"); +const u32 gTrainerFrontPic_BlackBelt[] = INCBIN_U32("graphics/trainers/front_pics/black_belt.4bpp.smol"); const u16 gTrainerPalette_BlackBelt[] = INCBIN_U16("graphics/trainers/front_pics/black_belt.gbapal"); -const u32 gTrainerFrontPic_AquaAdminF[] = INCBIN_U32("graphics/trainers/front_pics/aqua_admin_f.4bpp.lz"); +const u32 gTrainerFrontPic_AquaAdminF[] = INCBIN_U32("graphics/trainers/front_pics/aqua_admin_f.4bpp.smol"); const u16 gTrainerPalette_AquaAdminF[] = INCBIN_U16("graphics/trainers/front_pics/aqua_admin_f.gbapal"); -const u32 gTrainerFrontPic_AquaLeaderArchie[] = INCBIN_U32("graphics/trainers/front_pics/aqua_leader_archie.4bpp.lz"); +const u32 gTrainerFrontPic_AquaLeaderArchie[] = INCBIN_U32("graphics/trainers/front_pics/aqua_leader_archie.4bpp.smol"); const u16 gTrainerPalette_AquaLeaderArchie[] = INCBIN_U16("graphics/trainers/front_pics/aqua_leader_archie.gbapal"); -const u32 gTrainerFrontPic_HexManiac[] = INCBIN_U32("graphics/trainers/front_pics/hex_maniac.4bpp.lz"); +const u32 gTrainerFrontPic_HexManiac[] = INCBIN_U32("graphics/trainers/front_pics/hex_maniac.4bpp.smol"); const u16 gTrainerPalette_HexManiac[] = INCBIN_U16("graphics/trainers/front_pics/hex_maniac.gbapal"); -const u32 gTrainerFrontPic_AromaLady[] = INCBIN_U32("graphics/trainers/front_pics/aroma_lady.4bpp.lz"); +const u32 gTrainerFrontPic_AromaLady[] = INCBIN_U32("graphics/trainers/front_pics/aroma_lady.4bpp.smol"); const u16 gTrainerPalette_AromaLady[] = INCBIN_U16("graphics/trainers/front_pics/aroma_lady.gbapal"); -const u32 gTrainerFrontPic_RuinManiac[] = INCBIN_U32("graphics/trainers/front_pics/ruin_maniac.4bpp.lz"); +const u32 gTrainerFrontPic_RuinManiac[] = INCBIN_U32("graphics/trainers/front_pics/ruin_maniac.4bpp.smol"); const u16 gTrainerPalette_RuinManiac[] = INCBIN_U16("graphics/trainers/front_pics/ruin_maniac.gbapal"); -const u32 gTrainerFrontPic_Interviewer[] = INCBIN_U32("graphics/trainers/front_pics/interviewer.4bpp.lz"); +const u32 gTrainerFrontPic_Interviewer[] = INCBIN_U32("graphics/trainers/front_pics/interviewer.4bpp.smol"); const u16 gTrainerPalette_Interviewer[] = INCBIN_U16("graphics/trainers/front_pics/interviewer.gbapal"); -const u32 gTrainerFrontPic_TuberF[] = INCBIN_U32("graphics/trainers/front_pics/tuber_f.4bpp.lz"); +const u32 gTrainerFrontPic_TuberF[] = INCBIN_U32("graphics/trainers/front_pics/tuber_f.4bpp.smol"); const u16 gTrainerPalette_TuberF[] = INCBIN_U16("graphics/trainers/front_pics/tuber_f.gbapal"); -const u32 gTrainerFrontPic_TuberM[] = INCBIN_U32("graphics/trainers/front_pics/tuber_m.4bpp.lz"); +const u32 gTrainerFrontPic_TuberM[] = INCBIN_U32("graphics/trainers/front_pics/tuber_m.4bpp.smol"); const u16 gTrainerPalette_TuberM[] = INCBIN_U16("graphics/trainers/front_pics/tuber_m.gbapal"); -const u32 gTrainerFrontPic_CoolTrainerF[] = INCBIN_U32("graphics/trainers/front_pics/cooltrainer_f.4bpp.lz"); +const u32 gTrainerFrontPic_CoolTrainerF[] = INCBIN_U32("graphics/trainers/front_pics/cooltrainer_f.4bpp.smol"); const u16 gTrainerPalette_CoolTrainerF[] = INCBIN_U16("graphics/trainers/front_pics/cooltrainer_f.gbapal"); -const u32 gTrainerFrontPic_Lady[] = INCBIN_U32("graphics/trainers/front_pics/lady.4bpp.lz"); +const u32 gTrainerFrontPic_Lady[] = INCBIN_U32("graphics/trainers/front_pics/lady.4bpp.smol"); const u16 gTrainerPalette_Lady[] = INCBIN_U16("graphics/trainers/front_pics/lady.gbapal"); -const u32 gTrainerFrontPic_Beauty[] = INCBIN_U32("graphics/trainers/front_pics/beauty.4bpp.lz"); +const u32 gTrainerFrontPic_Beauty[] = INCBIN_U32("graphics/trainers/front_pics/beauty.4bpp.smol"); const u16 gTrainerPalette_Beauty[] = INCBIN_U16("graphics/trainers/front_pics/beauty.gbapal"); -const u32 gTrainerFrontPic_RichBoy[] = INCBIN_U32("graphics/trainers/front_pics/rich_boy.4bpp.lz"); +const u32 gTrainerFrontPic_RichBoy[] = INCBIN_U32("graphics/trainers/front_pics/rich_boy.4bpp.smol"); const u16 gTrainerPalette_RichBoy[] = INCBIN_U16("graphics/trainers/front_pics/rich_boy.gbapal"); -const u32 gTrainerFrontPic_ExpertF[] = INCBIN_U32("graphics/trainers/front_pics/expert_f.4bpp.lz"); +const u32 gTrainerFrontPic_ExpertF[] = INCBIN_U32("graphics/trainers/front_pics/expert_f.4bpp.smol"); const u16 gTrainerPalette_ExpertF[] = INCBIN_U16("graphics/trainers/front_pics/expert_f.gbapal"); -const u32 gTrainerFrontPic_Pokemaniac[] = INCBIN_U32("graphics/trainers/front_pics/pokemaniac.4bpp.lz"); +const u32 gTrainerFrontPic_Pokemaniac[] = INCBIN_U32("graphics/trainers/front_pics/pokemaniac.4bpp.smol"); const u16 gTrainerPalette_Pokemaniac[] = INCBIN_U16("graphics/trainers/front_pics/pokemaniac.gbapal"); -const u32 gTrainerFrontPic_MagmaGruntF[] = INCBIN_U32("graphics/trainers/front_pics/magma_grunt_f.4bpp.lz"); +const u32 gTrainerFrontPic_MagmaGruntF[] = INCBIN_U32("graphics/trainers/front_pics/magma_grunt_f.4bpp.smol"); const u16 gTrainerPalette_MagmaGruntF[] = INCBIN_U16("graphics/trainers/front_pics/magma_grunt_f.gbapal"); -const u32 gTrainerFrontPic_Guitarist[] = INCBIN_U32("graphics/trainers/front_pics/guitarist.4bpp.lz"); +const u32 gTrainerFrontPic_Guitarist[] = INCBIN_U32("graphics/trainers/front_pics/guitarist.4bpp.smol"); const u16 gTrainerPalette_Guitarist[] = INCBIN_U16("graphics/trainers/front_pics/guitarist.gbapal"); -const u32 gTrainerFrontPic_Kindler[] = INCBIN_U32("graphics/trainers/front_pics/kindler.4bpp.lz"); +const u32 gTrainerFrontPic_Kindler[] = INCBIN_U32("graphics/trainers/front_pics/kindler.4bpp.smol"); const u16 gTrainerPalette_Kindler[] = INCBIN_U16("graphics/trainers/front_pics/kindler.gbapal"); -const u32 gTrainerFrontPic_Camper[] = INCBIN_U32("graphics/trainers/front_pics/camper.4bpp.lz"); +const u32 gTrainerFrontPic_Camper[] = INCBIN_U32("graphics/trainers/front_pics/camper.4bpp.smol"); const u16 gTrainerPalette_Camper[] = INCBIN_U16("graphics/trainers/front_pics/camper.gbapal"); -const u32 gTrainerFrontPic_Picnicker[] = INCBIN_U32("graphics/trainers/front_pics/picnicker.4bpp.lz"); +const u32 gTrainerFrontPic_Picnicker[] = INCBIN_U32("graphics/trainers/front_pics/picnicker.4bpp.smol"); const u16 gTrainerPalette_Picnicker[] = INCBIN_U16("graphics/trainers/front_pics/picnicker.gbapal"); -const u32 gTrainerFrontPic_BugManiac[] = INCBIN_U32("graphics/trainers/front_pics/bug_maniac.4bpp.lz"); +const u32 gTrainerFrontPic_BugManiac[] = INCBIN_U32("graphics/trainers/front_pics/bug_maniac.4bpp.smol"); const u16 gTrainerPalette_BugManiac[] = INCBIN_U16("graphics/trainers/front_pics/bug_maniac.gbapal"); -const u32 gTrainerFrontPic_PokemonBreederM[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_breeder_m.4bpp.lz"); +const u32 gTrainerFrontPic_PokemonBreederM[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_breeder_m.4bpp.smol"); const u16 gTrainerPalette_PokemonBreederM[] = INCBIN_U16("graphics/trainers/front_pics/pokemon_breeder_m.gbapal"); -const u32 gTrainerFrontPic_PsychicM[] = INCBIN_U32("graphics/trainers/front_pics/psychic_m.4bpp.lz"); +const u32 gTrainerFrontPic_PsychicM[] = INCBIN_U32("graphics/trainers/front_pics/psychic_m.4bpp.smol"); const u16 gTrainerPalette_PsychicM[] = INCBIN_U16("graphics/trainers/front_pics/psychic_m.gbapal"); -const u32 gTrainerFrontPic_PsychicF[] = INCBIN_U32("graphics/trainers/front_pics/psychic_f.4bpp.lz"); +const u32 gTrainerFrontPic_PsychicF[] = INCBIN_U32("graphics/trainers/front_pics/psychic_f.4bpp.smol"); const u16 gTrainerPalette_PsychicF[] = INCBIN_U16("graphics/trainers/front_pics/psychic_f.gbapal"); -const u32 gTrainerFrontPic_Gentleman[] = INCBIN_U32("graphics/trainers/front_pics/gentleman.4bpp.lz"); +const u32 gTrainerFrontPic_Gentleman[] = INCBIN_U32("graphics/trainers/front_pics/gentleman.4bpp.smol"); const u16 gTrainerPalette_Gentleman[] = INCBIN_U16("graphics/trainers/front_pics/gentleman.gbapal"); -const u32 gTrainerFrontPic_EliteFourSidney[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_sidney.4bpp.lz"); +const u32 gTrainerFrontPic_EliteFourSidney[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_sidney.4bpp.smol"); const u16 gTrainerPalette_EliteFourSidney[] = INCBIN_U16("graphics/trainers/front_pics/elite_four_sidney.gbapal"); -const u32 gTrainerFrontPic_EliteFourPhoebe[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_phoebe.4bpp.lz"); +const u32 gTrainerFrontPic_EliteFourPhoebe[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_phoebe.4bpp.smol"); const u16 gTrainerPalette_EliteFourPhoebe[] = INCBIN_U16("graphics/trainers/front_pics/elite_four_phoebe.gbapal"); -const u32 gTrainerFrontPic_EliteFourGlacia[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_glacia.4bpp.lz"); +const u32 gTrainerFrontPic_EliteFourGlacia[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_glacia.4bpp.smol"); const u16 gTrainerPalette_EliteFourGlacia[] = INCBIN_U16("graphics/trainers/front_pics/elite_four_glacia.gbapal"); -const u32 gTrainerFrontPic_EliteFourDrake[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_drake.4bpp.lz"); +const u32 gTrainerFrontPic_EliteFourDrake[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_drake.4bpp.smol"); const u16 gTrainerPalette_EliteFourDrake[] = INCBIN_U16("graphics/trainers/front_pics/elite_four_drake.gbapal"); -const u32 gTrainerFrontPic_LeaderRoxanne[] = INCBIN_U32("graphics/trainers/front_pics/leader_roxanne.4bpp.lz"); +const u32 gTrainerFrontPic_LeaderRoxanne[] = INCBIN_U32("graphics/trainers/front_pics/leader_roxanne.4bpp.smol"); const u16 gTrainerPalette_LeaderRoxanne[] = INCBIN_U16("graphics/trainers/front_pics/leader_roxanne.gbapal"); -const u32 gTrainerFrontPic_LeaderBrawly[] = INCBIN_U32("graphics/trainers/front_pics/leader_brawly.4bpp.lz"); +const u32 gTrainerFrontPic_LeaderBrawly[] = INCBIN_U32("graphics/trainers/front_pics/leader_brawly.4bpp.smol"); const u16 gTrainerPalette_LeaderBrawly[] = INCBIN_U16("graphics/trainers/front_pics/leader_brawly.gbapal"); -const u32 gTrainerFrontPic_LeaderWattson[] = INCBIN_U32("graphics/trainers/front_pics/leader_wattson.4bpp.lz"); +const u32 gTrainerFrontPic_LeaderWattson[] = INCBIN_U32("graphics/trainers/front_pics/leader_wattson.4bpp.smol"); const u16 gTrainerPalette_LeaderWattson[] = INCBIN_U16("graphics/trainers/front_pics/leader_wattson.gbapal"); -const u32 gTrainerFrontPic_LeaderFlannery[] = INCBIN_U32("graphics/trainers/front_pics/leader_flannery.4bpp.lz"); +const u32 gTrainerFrontPic_LeaderFlannery[] = INCBIN_U32("graphics/trainers/front_pics/leader_flannery.4bpp.smol"); const u16 gTrainerPalette_LeaderFlannery[] = INCBIN_U16("graphics/trainers/front_pics/leader_flannery.gbapal"); -const u32 gTrainerFrontPic_LeaderNorman[] = INCBIN_U32("graphics/trainers/front_pics/leader_norman.4bpp.lz"); +const u32 gTrainerFrontPic_LeaderNorman[] = INCBIN_U32("graphics/trainers/front_pics/leader_norman.4bpp.smol"); const u16 gTrainerPalette_LeaderNorman[] = INCBIN_U16("graphics/trainers/front_pics/leader_norman.gbapal"); -const u32 gTrainerFrontPic_LeaderWinona[] = INCBIN_U32("graphics/trainers/front_pics/leader_winona.4bpp.lz"); +const u32 gTrainerFrontPic_LeaderWinona[] = INCBIN_U32("graphics/trainers/front_pics/leader_winona.4bpp.smol"); const u16 gTrainerPalette_LeaderWinona[] = INCBIN_U16("graphics/trainers/front_pics/leader_winona.gbapal"); -const u32 gTrainerFrontPic_LeaderTateAndLiza[] = INCBIN_U32("graphics/trainers/front_pics/leader_tate_and_liza.4bpp.lz"); +const u32 gTrainerFrontPic_LeaderTateAndLiza[] = INCBIN_U32("graphics/trainers/front_pics/leader_tate_and_liza.4bpp.smol"); const u16 gTrainerPalette_LeaderTateAndLiza[] = INCBIN_U16("graphics/trainers/front_pics/leader_tate_and_liza.gbapal"); -const u32 gTrainerFrontPic_LeaderJuan[] = INCBIN_U32("graphics/trainers/front_pics/leader_juan.4bpp.lz"); +const u32 gTrainerFrontPic_LeaderJuan[] = INCBIN_U32("graphics/trainers/front_pics/leader_juan.4bpp.smol"); const u16 gTrainerPalette_LeaderJuan[] = INCBIN_U16("graphics/trainers/front_pics/leader_juan.gbapal"); -const u32 gTrainerFrontPic_SchoolKidM[] = INCBIN_U32("graphics/trainers/front_pics/school_kid_m.4bpp.lz"); +const u32 gTrainerFrontPic_SchoolKidM[] = INCBIN_U32("graphics/trainers/front_pics/school_kid_m.4bpp.smol"); const u16 gTrainerPalette_SchoolKidM[] = INCBIN_U16("graphics/trainers/front_pics/school_kid_m.gbapal"); -const u32 gTrainerFrontPic_SchoolKidF[] = INCBIN_U32("graphics/trainers/front_pics/school_kid_f.4bpp.lz"); +const u32 gTrainerFrontPic_SchoolKidF[] = INCBIN_U32("graphics/trainers/front_pics/school_kid_f.4bpp.smol"); const u16 gTrainerPalette_SchoolKidF[] = INCBIN_U16("graphics/trainers/front_pics/school_kid_f.gbapal"); -const u32 gTrainerFrontPic_SrAndJr[] = INCBIN_U32("graphics/trainers/front_pics/sr_and_jr.4bpp.lz"); +const u32 gTrainerFrontPic_SrAndJr[] = INCBIN_U32("graphics/trainers/front_pics/sr_and_jr.4bpp.smol"); const u16 gTrainerPalette_SrAndJr[] = INCBIN_U16("graphics/trainers/front_pics/sr_and_jr.gbapal"); -const u32 gTrainerFrontPic_PokefanM[] = INCBIN_U32("graphics/trainers/front_pics/pokefan_m.4bpp.lz"); +const u32 gTrainerFrontPic_PokefanM[] = INCBIN_U32("graphics/trainers/front_pics/pokefan_m.4bpp.smol"); const u16 gTrainerPalette_PokefanM[] = INCBIN_U16("graphics/trainers/front_pics/pokefan_m.gbapal"); -const u32 gTrainerFrontPic_PokefanF[] = INCBIN_U32("graphics/trainers/front_pics/pokefan_f.4bpp.lz"); +const u32 gTrainerFrontPic_PokefanF[] = INCBIN_U32("graphics/trainers/front_pics/pokefan_f.4bpp.smol"); const u16 gTrainerPalette_PokefanF[] = INCBIN_U16("graphics/trainers/front_pics/pokefan_f.gbapal"); -const u32 gTrainerFrontPic_Youngster[] = INCBIN_U32("graphics/trainers/front_pics/youngster.4bpp.lz"); +const u32 gTrainerFrontPic_Youngster[] = INCBIN_U32("graphics/trainers/front_pics/youngster.4bpp.smol"); const u16 gTrainerPalette_Youngster[] = INCBIN_U16("graphics/trainers/front_pics/youngster.gbapal"); -const u32 gTrainerFrontPic_ChampionWallace[] = INCBIN_U32("graphics/trainers/front_pics/champion_wallace.4bpp.lz"); +const u32 gTrainerFrontPic_ChampionWallace[] = INCBIN_U32("graphics/trainers/front_pics/champion_wallace.4bpp.smol"); const u16 gTrainerPalette_ChampionWallace[] = INCBIN_U16("graphics/trainers/front_pics/champion_wallace.gbapal"); -const u32 gTrainerFrontPic_Fisherman[] = INCBIN_U32("graphics/trainers/front_pics/fisherman.4bpp.lz"); +const u32 gTrainerFrontPic_Fisherman[] = INCBIN_U32("graphics/trainers/front_pics/fisherman.4bpp.smol"); const u16 gTrainerPalette_Fisherman[] = INCBIN_U16("graphics/trainers/front_pics/fisherman.gbapal"); -const u32 gTrainerFrontPic_CyclingTriathleteM[] = INCBIN_U32("graphics/trainers/front_pics/cycling_triathlete_m.4bpp.lz"); +const u32 gTrainerFrontPic_CyclingTriathleteM[] = INCBIN_U32("graphics/trainers/front_pics/cycling_triathlete_m.4bpp.smol"); const u16 gTrainerPalette_CyclingTriathleteM[] = INCBIN_U16("graphics/trainers/front_pics/cycling_triathlete_m.gbapal"); -const u32 gTrainerFrontPic_CyclingTriathleteF[] = INCBIN_U32("graphics/trainers/front_pics/cycling_triathlete_f.4bpp.lz"); +const u32 gTrainerFrontPic_CyclingTriathleteF[] = INCBIN_U32("graphics/trainers/front_pics/cycling_triathlete_f.4bpp.smol"); const u16 gTrainerPalette_CyclingTriathleteF[] = INCBIN_U16("graphics/trainers/front_pics/cycling_triathlete_f.gbapal"); -const u32 gTrainerFrontPic_RunningTriathleteM[] = INCBIN_U32("graphics/trainers/front_pics/running_triathlete_m.4bpp.lz"); +const u32 gTrainerFrontPic_RunningTriathleteM[] = INCBIN_U32("graphics/trainers/front_pics/running_triathlete_m.4bpp.smol"); const u16 gTrainerPalette_RunningTriathleteM[] = INCBIN_U16("graphics/trainers/front_pics/running_triathlete_m.gbapal"); -const u32 gTrainerFrontPic_RunningTriathleteF[] = INCBIN_U32("graphics/trainers/front_pics/running_triathlete_f.4bpp.lz"); +const u32 gTrainerFrontPic_RunningTriathleteF[] = INCBIN_U32("graphics/trainers/front_pics/running_triathlete_f.4bpp.smol"); const u16 gTrainerPalette_RunningTriathleteF[] = INCBIN_U16("graphics/trainers/front_pics/running_triathlete_f.gbapal"); -const u32 gTrainerFrontPic_SwimmingTriathleteM[] = INCBIN_U32("graphics/trainers/front_pics/swimming_triathlete_m.4bpp.lz"); +const u32 gTrainerFrontPic_SwimmingTriathleteM[] = INCBIN_U32("graphics/trainers/front_pics/swimming_triathlete_m.4bpp.smol"); const u16 gTrainerPalette_SwimmingTriathleteM[] = INCBIN_U16("graphics/trainers/front_pics/swimming_triathlete_m.gbapal"); -const u32 gTrainerFrontPic_SwimmingTriathleteF[] = INCBIN_U32("graphics/trainers/front_pics/swimming_triathlete_f.4bpp.lz"); +const u32 gTrainerFrontPic_SwimmingTriathleteF[] = INCBIN_U32("graphics/trainers/front_pics/swimming_triathlete_f.4bpp.smol"); const u16 gTrainerPalette_SwimmingTriathleteF[] = INCBIN_U16("graphics/trainers/front_pics/swimming_triathlete_f.gbapal"); -const u32 gTrainerFrontPic_DragonTamer[] = INCBIN_U32("graphics/trainers/front_pics/dragon_tamer.4bpp.lz"); +const u32 gTrainerFrontPic_DragonTamer[] = INCBIN_U32("graphics/trainers/front_pics/dragon_tamer.4bpp.smol"); const u16 gTrainerPalette_DragonTamer[] = INCBIN_U16("graphics/trainers/front_pics/dragon_tamer.gbapal"); -const u32 gTrainerFrontPic_NinjaBoy[] = INCBIN_U32("graphics/trainers/front_pics/ninja_boy.4bpp.lz"); +const u32 gTrainerFrontPic_NinjaBoy[] = INCBIN_U32("graphics/trainers/front_pics/ninja_boy.4bpp.smol"); const u16 gTrainerPalette_NinjaBoy[] = INCBIN_U16("graphics/trainers/front_pics/ninja_boy.gbapal"); -const u32 gTrainerFrontPic_BattleGirl[] = INCBIN_U32("graphics/trainers/front_pics/battle_girl.4bpp.lz"); +const u32 gTrainerFrontPic_BattleGirl[] = INCBIN_U32("graphics/trainers/front_pics/battle_girl.4bpp.smol"); const u16 gTrainerPalette_BattleGirl[] = INCBIN_U16("graphics/trainers/front_pics/battle_girl.gbapal"); -const u32 gTrainerFrontPic_ParasolLady[] = INCBIN_U32("graphics/trainers/front_pics/parasol_lady.4bpp.lz"); +const u32 gTrainerFrontPic_ParasolLady[] = INCBIN_U32("graphics/trainers/front_pics/parasol_lady.4bpp.smol"); const u16 gTrainerPalette_ParasolLady[] = INCBIN_U16("graphics/trainers/front_pics/parasol_lady.gbapal"); -const u32 gTrainerFrontPic_SwimmerF[] = INCBIN_U32("graphics/trainers/front_pics/swimmer_f.4bpp.lz"); +const u32 gTrainerFrontPic_SwimmerF[] = INCBIN_U32("graphics/trainers/front_pics/swimmer_f.4bpp.smol"); const u16 gTrainerPalette_SwimmerF[] = INCBIN_U16("graphics/trainers/front_pics/swimmer_f.gbapal"); -const u32 gTrainerFrontPic_Twins[] = INCBIN_U32("graphics/trainers/front_pics/twins.4bpp.lz"); +const u32 gTrainerFrontPic_Twins[] = INCBIN_U32("graphics/trainers/front_pics/twins.4bpp.smol"); const u16 gTrainerPalette_Twins[] = INCBIN_U16("graphics/trainers/front_pics/twins.gbapal"); -const u32 gTrainerFrontPic_Sailor[] = INCBIN_U32("graphics/trainers/front_pics/sailor.4bpp.lz"); +const u32 gTrainerFrontPic_Sailor[] = INCBIN_U32("graphics/trainers/front_pics/sailor.4bpp.smol"); const u16 gTrainerPalette_Sailor[] = INCBIN_U16("graphics/trainers/front_pics/sailor.gbapal"); -const u32 gTrainerFrontPic_MagmaAdmin[] = INCBIN_U32("graphics/trainers/front_pics/magma_admin.4bpp.lz"); +const u32 gTrainerFrontPic_MagmaAdmin[] = INCBIN_U32("graphics/trainers/front_pics/magma_admin.4bpp.smol"); const u16 gTrainerPalette_MagmaAdmin[] = INCBIN_U16("graphics/trainers/front_pics/magma_admin.gbapal"); -const u32 gTrainerFrontPic_Wally[] = INCBIN_U32("graphics/trainers/front_pics/wally.4bpp.lz"); +const u32 gTrainerFrontPic_Wally[] = INCBIN_U32("graphics/trainers/front_pics/wally.4bpp.smol"); const u16 gTrainerPalette_Wally[] = INCBIN_U16("graphics/trainers/palettes/wally.gbapal"); -const u32 gTrainerFrontPic_Brendan[] = INCBIN_U32("graphics/trainers/front_pics/brendan.4bpp.lz"); +const u32 gTrainerFrontPic_Brendan[] = INCBIN_U32("graphics/trainers/front_pics/brendan.4bpp.smol"); const u16 gTrainerPalette_Brendan[] = INCBIN_U16("graphics/trainers/palettes/brendan.gbapal"); -const u32 gTrainerFrontPic_May[] = INCBIN_U32("graphics/trainers/front_pics/may.4bpp.lz"); +const u32 gTrainerFrontPic_May[] = INCBIN_U32("graphics/trainers/front_pics/may.4bpp.smol"); const u16 gTrainerPalette_May[] = INCBIN_U16("graphics/trainers/palettes/may.gbapal"); -const u32 gTrainerFrontPic_BugCatcher[] = INCBIN_U32("graphics/trainers/front_pics/bug_catcher.4bpp.lz"); +const u32 gTrainerFrontPic_BugCatcher[] = INCBIN_U32("graphics/trainers/front_pics/bug_catcher.4bpp.smol"); const u16 gTrainerPalette_BugCatcher[] = INCBIN_U16("graphics/trainers/front_pics/bug_catcher.gbapal"); -const u32 gTrainerFrontPic_PokemonRangerM[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_ranger_m.4bpp.lz"); +const u32 gTrainerFrontPic_PokemonRangerM[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_ranger_m.4bpp.smol"); const u16 gTrainerPalette_PokemonRangerM[] = INCBIN_U16("graphics/trainers/front_pics/pokemon_ranger_m.gbapal"); -const u32 gTrainerFrontPic_PokemonRangerF[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_ranger_f.4bpp.lz"); +const u32 gTrainerFrontPic_PokemonRangerF[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_ranger_f.4bpp.smol"); const u16 gTrainerPalette_PokemonRangerF[] = INCBIN_U16("graphics/trainers/front_pics/pokemon_ranger_f.gbapal"); -const u32 gTrainerFrontPic_MagmaLeaderMaxie[] = INCBIN_U32("graphics/trainers/front_pics/magma_leader_maxie.4bpp.lz"); +const u32 gTrainerFrontPic_MagmaLeaderMaxie[] = INCBIN_U32("graphics/trainers/front_pics/magma_leader_maxie.4bpp.smol"); const u16 gTrainerPalette_MagmaLeaderMaxie[] = INCBIN_U16("graphics/trainers/front_pics/magma_leader_maxie.gbapal"); -const u32 gTrainerFrontPic_Lass[] = INCBIN_U32("graphics/trainers/front_pics/lass.4bpp.lz"); +const u32 gTrainerFrontPic_Lass[] = INCBIN_U32("graphics/trainers/front_pics/lass.4bpp.smol"); const u16 gTrainerPalette_Lass[] = INCBIN_U16("graphics/trainers/front_pics/lass.gbapal"); -const u32 gTrainerFrontPic_YoungCouple[] = INCBIN_U32("graphics/trainers/front_pics/young_couple.4bpp.lz"); +const u32 gTrainerFrontPic_YoungCouple[] = INCBIN_U32("graphics/trainers/front_pics/young_couple.4bpp.smol"); const u16 gTrainerPalette_YoungCouple[] = INCBIN_U16("graphics/trainers/front_pics/young_couple.gbapal"); -const u32 gTrainerFrontPic_OldCouple[] = INCBIN_U32("graphics/trainers/front_pics/old_couple.4bpp.lz"); +const u32 gTrainerFrontPic_OldCouple[] = INCBIN_U32("graphics/trainers/front_pics/old_couple.4bpp.smol"); const u16 gTrainerPalette_OldCouple[] = INCBIN_U16("graphics/trainers/front_pics/old_couple.gbapal"); -const u32 gTrainerFrontPic_SisAndBro[] = INCBIN_U32("graphics/trainers/front_pics/sis_and_bro.4bpp.lz"); +const u32 gTrainerFrontPic_SisAndBro[] = INCBIN_U32("graphics/trainers/front_pics/sis_and_bro.4bpp.smol"); const u16 gTrainerPalette_SisAndBro[] = INCBIN_U16("graphics/trainers/front_pics/sis_and_bro.gbapal"); -const u32 gTrainerFrontPic_Steven[] = INCBIN_U32("graphics/trainers/front_pics/steven.4bpp.lz"); +const u32 gTrainerFrontPic_Steven[] = INCBIN_U32("graphics/trainers/front_pics/steven.4bpp.smol"); const u16 gTrainerPalette_Steven[] = INCBIN_U16("graphics/trainers/front_pics/steven.gbapal"); -const u32 gTrainerFrontPic_SalonMaidenAnabel[] = INCBIN_U32("graphics/trainers/front_pics/salon_maiden_anabel.4bpp.lz"); +const u32 gTrainerFrontPic_SalonMaidenAnabel[] = INCBIN_U32("graphics/trainers/front_pics/salon_maiden_anabel.4bpp.smol"); const u16 gTrainerPalette_SalonMaidenAnabel[] = INCBIN_U16("graphics/trainers/front_pics/salon_maiden_anabel.gbapal"); -const u32 gTrainerFrontPic_DomeAceTucker[] = INCBIN_U32("graphics/trainers/front_pics/dome_ace_tucker.4bpp.lz"); +const u32 gTrainerFrontPic_DomeAceTucker[] = INCBIN_U32("graphics/trainers/front_pics/dome_ace_tucker.4bpp.smol"); const u16 gTrainerPalette_DomeAceTucker[] = INCBIN_U16("graphics/trainers/front_pics/dome_ace_tucker.gbapal"); -const u32 gTrainerFrontPic_PalaceMavenSpenser[] = INCBIN_U32("graphics/trainers/front_pics/palace_maven_spenser.4bpp.lz"); +const u32 gTrainerFrontPic_PalaceMavenSpenser[] = INCBIN_U32("graphics/trainers/front_pics/palace_maven_spenser.4bpp.smol"); const u16 gTrainerPalette_PalaceMavenSpenser[] = INCBIN_U16("graphics/trainers/front_pics/palace_maven_spenser.gbapal"); -const u32 gTrainerFrontPic_ArenaTycoonGreta[] = INCBIN_U32("graphics/trainers/front_pics/arena_tycoon_greta.4bpp.lz"); +const u32 gTrainerFrontPic_ArenaTycoonGreta[] = INCBIN_U32("graphics/trainers/front_pics/arena_tycoon_greta.4bpp.smol"); const u16 gTrainerPalette_ArenaTycoonGreta[] = INCBIN_U16("graphics/trainers/front_pics/arena_tycoon_greta.gbapal"); -const u32 gTrainerFrontPic_FactoryHeadNoland[] = INCBIN_U32("graphics/trainers/front_pics/factory_head_noland.4bpp.lz"); +const u32 gTrainerFrontPic_FactoryHeadNoland[] = INCBIN_U32("graphics/trainers/front_pics/factory_head_noland.4bpp.smol"); const u16 gTrainerPalette_FactoryHeadNoland[] = INCBIN_U16("graphics/trainers/front_pics/factory_head_noland.gbapal"); -const u32 gTrainerFrontPic_PikeQueenLucy[] = INCBIN_U32("graphics/trainers/front_pics/pike_queen_lucy.4bpp.lz"); +const u32 gTrainerFrontPic_PikeQueenLucy[] = INCBIN_U32("graphics/trainers/front_pics/pike_queen_lucy.4bpp.smol"); const u16 gTrainerPalette_PikeQueenLucy[] = INCBIN_U16("graphics/trainers/front_pics/pike_queen_lucy.gbapal"); -const u32 gTrainerFrontPic_PyramidKingBrandon[] = INCBIN_U32("graphics/trainers/front_pics/pyramid_king_brandon.4bpp.lz"); +const u32 gTrainerFrontPic_PyramidKingBrandon[] = INCBIN_U32("graphics/trainers/front_pics/pyramid_king_brandon.4bpp.smol"); const u16 gTrainerPalette_PyramidKingBrandon[] = INCBIN_U16("graphics/trainers/front_pics/pyramid_king_brandon.gbapal"); -const u32 gTrainerFrontPic_Red[] = INCBIN_U32("graphics/trainers/front_pics/red.4bpp.lz"); +const u32 gTrainerFrontPic_Red[] = INCBIN_U32("graphics/trainers/front_pics/red.4bpp.smol"); const u16 gTrainerPalette_Red[] = INCBIN_U16("graphics/trainers/front_pics/red.gbapal"); -const u32 gTrainerFrontPic_Leaf[] = INCBIN_U32("graphics/trainers/front_pics/leaf.4bpp.lz"); +const u32 gTrainerFrontPic_Leaf[] = INCBIN_U32("graphics/trainers/front_pics/leaf.4bpp.smol"); const u16 gTrainerPalette_Leaf[] = INCBIN_U16("graphics/trainers/front_pics/leaf.gbapal"); -const u32 gTrainerFrontPic_RubySapphireBrendan[] = INCBIN_U32("graphics/trainers/front_pics/brendan_rs.4bpp.lz"); +const u32 gTrainerFrontPic_RubySapphireBrendan[] = INCBIN_U32("graphics/trainers/front_pics/brendan_rs.4bpp.smol"); const u16 gTrainerPalette_RubySapphireBrendan[] = INCBIN_U16("graphics/trainers/palettes/brendan_rs.gbapal"); -const u32 gTrainerFrontPic_RubySapphireMay[] = INCBIN_U32("graphics/trainers/front_pics/may_rs.4bpp.lz"); +const u32 gTrainerFrontPic_RubySapphireMay[] = INCBIN_U32("graphics/trainers/front_pics/may_rs.4bpp.smol"); const u16 gTrainerPalette_RubySapphireMay[] = INCBIN_U16("graphics/trainers/palettes/may_rs.gbapal"); const u8 gTrainerBackPic_Brendan[] = INCBIN_U8("graphics/trainers/back_pics/brendan.4bpp"); @@ -457,92 +457,23 @@ static const union AnimCmd *const sBackAnims_Kanto[] = sAnimCmd_Point_HGSS_Red_Leaf, }; -const struct SpriteFrameImage gTrainerBackPicTable_Brendan[] = -{ - {gTrainerBackPic_Brendan + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Brendan + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Brendan + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Brendan + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, -}; - -const struct SpriteFrameImage gTrainerBackPicTable_May[] = -{ - {gTrainerBackPic_May + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, - {gTrainerBackPic_May + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, - {gTrainerBackPic_May + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, - {gTrainerBackPic_May + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, -}; - -const struct SpriteFrameImage gTrainerBackPicTable_Red[] = -{ - {gTrainerBackPic_Red + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Red + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Red + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Red + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Red + TRAINER_PIC_SIZE * 4, TRAINER_PIC_SIZE}, -}; - -const struct SpriteFrameImage gTrainerBackPicTable_Leaf[] = -{ - {gTrainerBackPic_Leaf + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Leaf + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Leaf + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Leaf + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Leaf + TRAINER_PIC_SIZE * 4, TRAINER_PIC_SIZE}, -}; - -const struct SpriteFrameImage gTrainerBackPicTable_RubySapphireBrendan[] = -{ - {gTrainerBackPic_RubySapphireBrendan + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, - {gTrainerBackPic_RubySapphireBrendan + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, - {gTrainerBackPic_RubySapphireBrendan + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, - {gTrainerBackPic_RubySapphireBrendan + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, -}; - -const struct SpriteFrameImage gTrainerBackPicTable_RubySapphireMay[] = -{ - {gTrainerBackPic_RubySapphireMay + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, - {gTrainerBackPic_RubySapphireMay + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, - {gTrainerBackPic_RubySapphireMay + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, - {gTrainerBackPic_RubySapphireMay + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, -}; - -const struct SpriteFrameImage gTrainerBackPicTable_Wally[] = -{ - {gTrainerBackPic_Wally + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Wally + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Wally + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Wally + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, -}; - -const struct SpriteFrameImage gTrainerBackPicTable_Steven[] = -{ - {gTrainerBackPic_Steven + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Steven + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Steven + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Steven + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, -}; - -// .backPic goes functionally unused, since none of these pics are compressed -// and the place they would get extracted to gets overwritten later anyway -// the casts are so they'll play nice with the strict struct definition -#define TRAINER_BACK_SPRITE(trainerPic, yOffset, sprite, table, pal, anim) \ +#define TRAINER_BACK_SPRITE(trainerPic, yOffset, sprite, pal, anim) \ [trainerPic] = \ { \ .coordinates = {.size = 8, .y_offset = yOffset}, \ - .backPic = {(const u32 *)sprite, TRAINER_PIC_SIZE * ARRAY_COUNT(table), trainerPic}, \ - .palette = {pal, trainerPic}, \ + .backPic = {.data = sprite, .size = TRAINER_PIC_SIZE, .relativeFrames = TRUE}, \ + .palette = {.data = pal, .tag = trainerPic}, \ .animation = anim, \ } const struct TrainerBacksprite gTrainerBacksprites[] = { - TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_BRENDAN, 4, gTrainerBackPic_Brendan, gTrainerBackPicTable_Brendan, gTrainerPalette_Brendan, sBackAnims_Hoenn), - TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_MAY, 4, gTrainerBackPic_May, gTrainerBackPicTable_May, gTrainerPalette_May, sBackAnims_Hoenn), - TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_RED, 5, gTrainerBackPic_Red, gTrainerBackPicTable_Red, gTrainerBackPicPalette_Red, sBackAnims_Kanto), - TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_LEAF, 5, gTrainerBackPic_Leaf, gTrainerBackPicTable_Leaf, gTrainerBackPicPalette_Leaf, sBackAnims_Kanto), - TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN, 4, gTrainerBackPic_RubySapphireBrendan, gTrainerBackPicTable_RubySapphireBrendan, gTrainerPalette_RubySapphireBrendan, sBackAnims_Hoenn), - TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_RUBY_SAPPHIRE_MAY, 4, gTrainerBackPic_RubySapphireMay, gTrainerBackPicTable_RubySapphireMay, gTrainerPalette_RubySapphireMay, sBackAnims_Hoenn), - TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_WALLY, 4, gTrainerBackPic_Wally, gTrainerBackPicTable_Wally, gTrainerPalette_Wally, sBackAnims_Hoenn), - TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_STEVEN, 4, gTrainerBackPic_Steven, gTrainerBackPicTable_Steven, gTrainerPalette_Steven, sBackAnims_Hoenn), + TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_BRENDAN, 4, gTrainerBackPic_Brendan, gTrainerPalette_Brendan, sBackAnims_Hoenn), + TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_MAY, 4, gTrainerBackPic_May, gTrainerPalette_May, sBackAnims_Hoenn), + TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_RED, 5, gTrainerBackPic_Red, gTrainerBackPicPalette_Red, sBackAnims_Kanto), + TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_LEAF, 5, gTrainerBackPic_Leaf, gTrainerBackPicPalette_Leaf, sBackAnims_Kanto), + TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN, 4, gTrainerBackPic_RubySapphireBrendan, gTrainerPalette_RubySapphireBrendan, sBackAnims_Hoenn), + TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_RUBY_SAPPHIRE_MAY, 4, gTrainerBackPic_RubySapphireMay, gTrainerPalette_RubySapphireMay, sBackAnims_Hoenn), + TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_WALLY, 4, gTrainerBackPic_Wally, gTrainerPalette_Wally, sBackAnims_Hoenn), + TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_STEVEN, 4, gTrainerBackPic_Steven, gTrainerPalette_Steven, sBackAnims_Hoenn), }; diff --git a/src/data/heal_locations.json b/src/data/heal_locations.json index c465ff65c377..bd789dbdf579 100644 --- a/src/data/heal_locations.json +++ b/src/data/heal_locations.json @@ -4,133 +4,188 @@ "id": "HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F", "map": "MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F", "x": 4, - "y": 2 + "y": 2, + "respawn_map": "MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F", + "respawn_npc": "LOCALID_PLAYERS_HOUSE_1F_MOM", + "respawn_x": 2, + "respawn_y": 7 }, { "id": "HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F", "map": "MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F", "x": 4, - "y": 2 + "y": 2, + "respawn_map": "MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F", + "respawn_npc": "LOCALID_PLAYERS_HOUSE_1F_MOM", + "respawn_x": 8, + "respawn_y": 7 }, { "id": "HEAL_LOCATION_PETALBURG_CITY", "map": "MAP_PETALBURG_CITY", "x": 20, - "y": 17 + "y": 17, + "respawn_map": "MAP_PETALBURG_CITY_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_PETALBURG_NURSE" }, { "id": "HEAL_LOCATION_SLATEPORT_CITY", "map": "MAP_SLATEPORT_CITY", "x": 19, - "y": 20 + "y": 20, + "respawn_map": "MAP_SLATEPORT_CITY_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_SLATEPORT_NURSE" }, { "id": "HEAL_LOCATION_MAUVILLE_CITY", "map": "MAP_MAUVILLE_CITY", "x": 22, - "y": 6 + "y": 6, + "respawn_map": "MAP_MAUVILLE_CITY_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_MAUVILLE_NURSE" }, { "id": "HEAL_LOCATION_RUSTBORO_CITY", "map": "MAP_RUSTBORO_CITY", "x": 16, - "y": 39 + "y": 39, + "respawn_map": "MAP_RUSTBORO_CITY_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_RUSTBORO_NURSE" }, { "id": "HEAL_LOCATION_FORTREE_CITY", "map": "MAP_FORTREE_CITY", "x": 5, - "y": 7 + "y": 7, + "respawn_map": "MAP_FORTREE_CITY_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_FORTREE_NURSE" }, { "id": "HEAL_LOCATION_LILYCOVE_CITY", "map": "MAP_LILYCOVE_CITY", "x": 24, - "y": 15 + "y": 15, + "respawn_map": "MAP_LILYCOVE_CITY_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_LILYCOVE_NURSE" }, { "id": "HEAL_LOCATION_MOSSDEEP_CITY", "map": "MAP_MOSSDEEP_CITY", "x": 28, - "y": 17 + "y": 17, + "respawn_map": "MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_MOSSDEEP_NURSE" }, { "id": "HEAL_LOCATION_SOOTOPOLIS_CITY", "map": "MAP_SOOTOPOLIS_CITY", "x": 43, - "y": 32 + "y": 32, + "respawn_map": "MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_SOOTOPOLIS_NURSE" }, { "id": "HEAL_LOCATION_EVER_GRANDE_CITY", "map": "MAP_EVER_GRANDE_CITY", "x": 27, - "y": 49 + "y": 49, + "respawn_map": "MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_EVER_GRANDE_NURSE" }, { "id": "HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE", "map": "MAP_LITTLEROOT_TOWN", "x": 5, - "y": 9 + "y": 9, + "respawn_map": "MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F", + "respawn_npc": "LOCALID_PLAYERS_HOUSE_1F_MOM", + "respawn_x": 2, + "respawn_y": 7 }, { "id": "HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE", "map": "MAP_LITTLEROOT_TOWN", "x": 14, - "y": 9 + "y": 9, + "respawn_map": "MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F", + "respawn_npc": "LOCALID_PLAYERS_HOUSE_1F_MOM", + "respawn_x": 8, + "respawn_y": 7 }, { "id": "HEAL_LOCATION_OLDALE_TOWN", "map": "MAP_OLDALE_TOWN", "x": 6, - "y": 17 + "y": 17, + "respawn_map": "MAP_OLDALE_TOWN_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_OLDALE_NURSE" }, { "id": "HEAL_LOCATION_DEWFORD_TOWN", "map": "MAP_DEWFORD_TOWN", "x": 2, - "y": 11 + "y": 11, + "respawn_map": "MAP_DEWFORD_TOWN_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_DEWFORD_NURSE" }, { "id": "HEAL_LOCATION_LAVARIDGE_TOWN", "map": "MAP_LAVARIDGE_TOWN", "x": 9, - "y": 7 + "y": 7, + "respawn_map": "MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_LAVARIDGE_NURSE" }, { "id": "HEAL_LOCATION_FALLARBOR_TOWN", "map": "MAP_FALLARBOR_TOWN", "x": 14, - "y": 8 + "y": 8, + "respawn_map": "MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_FALLARBOR_NURSE" }, { "id": "HEAL_LOCATION_VERDANTURF_TOWN", "map": "MAP_VERDANTURF_TOWN", "x": 16, - "y": 4 + "y": 4, + "respawn_map": "MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_VERDANTURF_NURSE" }, { "id": "HEAL_LOCATION_PACIFIDLOG_TOWN", "map": "MAP_PACIFIDLOG_TOWN", "x": 8, - "y": 16 + "y": 16, + "respawn_map": "MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_PACIFIDLOG_NURSE" }, { "id": "HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE", "map": "MAP_EVER_GRANDE_CITY", "x": 18, - "y": 6 + "y": 6, + "respawn_map": "MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F", + "respawn_npc": "LOCALID_LEAGUE_NURSE", + "respawn_x": 3, + "respawn_y": 4 }, { "id": "HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR", "map": "MAP_SOUTHERN_ISLAND_EXTERIOR", "x": 15, - "y": 20 + "y": 20, + "respawn_map": "MAP_SOUTHERN_ISLAND_EXTERIOR", + "respawn_x": 15, + "respawn_y": 20 }, { "id": "HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST", "map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", "x": 3, - "y": 52 + "y": 52, + "respawn_map": "MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_FRONTIER_NURSE" } ] } diff --git a/src/data/heal_locations.json.txt b/src/data/heal_locations.json.txt index fd63228e335d..ca04a988850c 100644 --- a/src/data/heal_locations.json.txt +++ b/src/data/heal_locations.json.txt @@ -11,14 +11,20 @@ static const struct HealLocation sHealLocations[NUM_HEAL_LOCATIONS - 1] = { ## endfor }; -static const u16 sWhiteoutRespawnHealCenterMapIdxs[][2] = { +#define DEFAULT_POKEMON_CENTER_X 7 +#define DEFAULT_POKEMON_CENTER_Y 4 + +static const u16 sWhiteoutRespawnHealCenterMapIdxs[][4] = { ## for heal_location in heal_locations {% if existsIn(heal_location, "respawn_map") %} - [{{ heal_location.id }} - 1] = { MAP_GROUP({{ heal_location.respawn_map }}), MAP_NUM({{ heal_location.respawn_map }})}, + [{{ heal_location.id }} - 1] = { MAP_GROUP({{ heal_location.respawn_map }}), MAP_NUM({{ heal_location.respawn_map }}), {% if existsIn(heal_location, "respawn_x") %}{{ heal_location.respawn_x }}{% else %}DEFAULT_POKEMON_CENTER_X{% endif %}, {% if existsIn(heal_location, "respawn_y") %}{{ heal_location.respawn_y }}{% else %}DEFAULT_POKEMON_CENTER_Y{% endif %}}, {% endif %} ## endfor }; +#undef DEFAULT_POKEMON_CENTER_X +#undef DEFAULT_POKEMON_CENTER_Y + static const u8 sWhiteoutRespawnHealerNpcIds[] = { ## for heal_location in heal_locations {% if existsIn(heal_location, "respawn_npc") %} diff --git a/src/data/heal_locations_pkm_center.h b/src/data/heal_locations_pkm_center.h deleted file mode 100644 index 388f77d5ec0b..000000000000 --- a/src/data/heal_locations_pkm_center.h +++ /dev/null @@ -1,175 +0,0 @@ -#define DEFAULT_POKEMON_CENTER_COORDS .x = 7, .y = 4 - -static const struct HealLocation sHealLocationsPokemonCenter[NUM_HEAL_LOCATIONS - 1] = -{ - [HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F - 1] = - { - .mapGroup = MAP_GROUP(MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F), - .mapNum = MAP_NUM(MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F), - .x = 2, - .y = 7, - }, - [HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F - 1] = - { - .mapGroup = MAP_GROUP(MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F), - .mapNum = MAP_NUM(MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F), - .x = 8, - .y = 7, - }, - [HEAL_LOCATION_PETALBURG_CITY - 1] = - { - .mapGroup = MAP_GROUP(MAP_PETALBURG_CITY_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_PETALBURG_CITY_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_SLATEPORT_CITY - 1] = - { - .mapGroup = MAP_GROUP(MAP_SLATEPORT_CITY_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_SLATEPORT_CITY_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_MAUVILLE_CITY - 1] = - { - .mapGroup = MAP_GROUP(MAP_MAUVILLE_CITY_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_MAUVILLE_CITY_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_RUSTBORO_CITY - 1] = - { - .mapGroup = MAP_GROUP(MAP_RUSTBORO_CITY_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_RUSTBORO_CITY_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_FORTREE_CITY - 1] = - { - .mapGroup = MAP_GROUP(MAP_FORTREE_CITY_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_FORTREE_CITY_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_LILYCOVE_CITY - 1] = - { - .mapGroup = MAP_GROUP(MAP_LILYCOVE_CITY_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_LILYCOVE_CITY_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_MOSSDEEP_CITY - 1] = - { - .mapGroup = MAP_GROUP(MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_SOOTOPOLIS_CITY - 1] = - { - .mapGroup = MAP_GROUP(MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_EVER_GRANDE_CITY - 1] = - { - .mapGroup = MAP_GROUP(MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE - 1] = - { - .mapGroup = MAP_GROUP(MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F), - .mapNum = MAP_NUM(MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F), - .x = 2, - .y = 7, - }, - [HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE - 1] = - { - .mapGroup = MAP_GROUP(MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F), - .mapNum = MAP_NUM(MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F), - .x = 8, - .y = 7, - }, - [HEAL_LOCATION_OLDALE_TOWN - 1] = - { - .mapGroup = MAP_GROUP(MAP_OLDALE_TOWN_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_OLDALE_TOWN_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_DEWFORD_TOWN - 1] = - { - .mapGroup = MAP_GROUP(MAP_DEWFORD_TOWN_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_DEWFORD_TOWN_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_LAVARIDGE_TOWN - 1] = - { - .mapGroup = MAP_GROUP(MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_FALLARBOR_TOWN - 1] = - { - .mapGroup = MAP_GROUP(MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_VERDANTURF_TOWN - 1] = - { - .mapGroup = MAP_GROUP(MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_PACIFIDLOG_TOWN - 1] = - { - .mapGroup = MAP_GROUP(MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE - 1] = - { - .mapGroup = MAP_GROUP(MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), - .mapNum = MAP_NUM(MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), - .x = 3, - .y = 4, - }, - [HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR - 1] = - { - .mapGroup = MAP_GROUP(MAP_SOUTHERN_ISLAND_EXTERIOR), - .mapNum = MAP_NUM(MAP_SOUTHERN_ISLAND_EXTERIOR), - .x = 15, - .y = 20, - }, - [HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST - 1] = - { - .mapGroup = MAP_GROUP(MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, -}; - -#undef DEFAULT_POKEMON_CENTER_COORDS - -// localIds can be found in the generated events.inc file for the specific heal location map -// e.g. for OldaleTown_PokemonCenter1F/events.inc the following entry gets generated: -// object_event 1, OBJ_EVENT_GFX_NURSE, 7, 2, 3, MOVEMENT_TYPE_FACE_DOWN, 0, 0, TRAINER_TYPE_NONE, 0, OldaleTown_PokemonCenter_1F_EventScript_Nurse, 0 -// In this case the localId is 1. -static const u8 sHealNpcLocalId[NUM_HEAL_LOCATIONS - 1] = -{ - [HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F - 1] = 1, - [HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F - 1] = 1, - [HEAL_LOCATION_PETALBURG_CITY - 1] = 1, - [HEAL_LOCATION_SLATEPORT_CITY - 1] = 1, - [HEAL_LOCATION_MAUVILLE_CITY - 1] = 1, - [HEAL_LOCATION_RUSTBORO_CITY - 1] = 1, - [HEAL_LOCATION_FORTREE_CITY - 1] = 1, - [HEAL_LOCATION_LILYCOVE_CITY - 1] = 1, - [HEAL_LOCATION_MOSSDEEP_CITY - 1] = 1, - [HEAL_LOCATION_SOOTOPOLIS_CITY - 1] = 1, - [HEAL_LOCATION_EVER_GRANDE_CITY - 1] = 1, - [HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE - 1] = 1, - [HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE - 1] = 1, - [HEAL_LOCATION_OLDALE_TOWN - 1] = 1, - [HEAL_LOCATION_DEWFORD_TOWN - 1] = 1, - [HEAL_LOCATION_LAVARIDGE_TOWN - 1] = 1, - [HEAL_LOCATION_FALLARBOR_TOWN - 1] = 1, - [HEAL_LOCATION_VERDANTURF_TOWN - 1] = 1, - [HEAL_LOCATION_PACIFIDLOG_TOWN - 1] = 1, - [HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE - 1] = 1, - [HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR - 1] = 0, // no heal npc - [HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST - 1] = 1, -}; diff --git a/src/data/hold_effects.h b/src/data/hold_effects.h new file mode 100644 index 000000000000..221c9e166ffa --- /dev/null +++ b/src/data/hold_effects.h @@ -0,0 +1,649 @@ +const struct HoldEffectInfo gHoldEffectsInfo[HOLD_EFFECT_COUNT] = +{ + [HOLD_EFFECT_NONE] = + { + }, + + [HOLD_EFFECT_RESTORE_HP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_CURE_PAR] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onStatusChange = TRUE, + }, + + [HOLD_EFFECT_CURE_SLP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onStatusChange = TRUE, + }, + + [HOLD_EFFECT_CURE_PSN] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onStatusChange = TRUE, + }, + + [HOLD_EFFECT_CURE_BRN] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onStatusChange = TRUE, + }, + + [HOLD_EFFECT_CURE_FRZ] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onStatusChange = TRUE, + }, + + [HOLD_EFFECT_RESTORE_PP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onAttackerAfterHit = TRUE, + }, + + [HOLD_EFFECT_CURE_CONFUSION] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onStatusChange = TRUE, + }, + + [HOLD_EFFECT_CURE_STATUS] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onStatusChange = TRUE, + }, + + [HOLD_EFFECT_CONFUSE_SPICY] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_CONFUSE_DRY] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_CONFUSE_SWEET] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_CONFUSE_BITTER] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_CONFUSE_SOUR] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_ATTACK_UP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_DEFENSE_UP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_SPEED_UP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_SP_ATTACK_UP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_SP_DEFENSE_UP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_CRITICAL_UP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_RANDOM_STAT_UP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_EVASION_UP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_WHITE_HERB] = + { + .whiteHerb = TRUE, + .whiteHerbFirstTurn = TRUE, + .whiteHerbEndTurn = TRUE, + .onFling = TRUE, + }, + + [HOLD_EFFECT_MACHO_BRACE] = + { + }, + + [HOLD_EFFECT_EXP_SHARE] = + { + }, + + [HOLD_EFFECT_QUICK_CLAW] = + { + }, + + [HOLD_EFFECT_FRIENDSHIP_UP] = + { + }, + + [HOLD_EFFECT_MENTAL_HERB] = + { + .onTargetAfterHit = TRUE, + .onAttackerAfterHit = TRUE, + .onFling = TRUE, + }, + + [HOLD_EFFECT_CHOICE_BAND] = + { + }, + + [HOLD_EFFECT_FLINCH] = + { + .onAttackerAfterHit = TRUE, + }, + + [HOLD_EFFECT_DOUBLE_PRIZE] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + }, + + [HOLD_EFFECT_REPEL] = + { + }, + + [HOLD_EFFECT_SOUL_DEW] = + { + }, + + [HOLD_EFFECT_DEEP_SEA_TOOTH] = + { + }, + + [HOLD_EFFECT_DEEP_SEA_SCALE] = + { + }, + + [HOLD_EFFECT_CAN_ALWAYS_RUN] = + { + }, + + [HOLD_EFFECT_PREVENT_EVOLVE] = + { + }, + + [HOLD_EFFECT_FOCUS_BAND] = + { + }, + + [HOLD_EFFECT_LUCKY_EGG] = + { + }, + + [HOLD_EFFECT_SCOPE_LENS] = + { + }, + + [HOLD_EFFECT_LEFTOVERS] = + { + .leftovers = TRUE, + }, + + [HOLD_EFFECT_DRAGON_SCALE] = + { + }, + + [HOLD_EFFECT_LIGHT_BALL] = + { + }, + + [HOLD_EFFECT_TYPE_POWER] = + { + }, + + [HOLD_EFFECT_UPGRADE] = + { + }, + + [HOLD_EFFECT_SHELL_BELL] = + { + .lifeOrbShellBell = TRUE, + }, + + [HOLD_EFFECT_LUCKY_PUNCH] = + { + }, + + [HOLD_EFFECT_METAL_POWDER] = + { + }, + + [HOLD_EFFECT_THICK_CLUB] = + { + }, + + [HOLD_EFFECT_LEEK] = + { + }, + + [HOLD_EFFECT_CHOICE_SCARF] = + { + }, + + [HOLD_EFFECT_CHOICE_SPECS] = + { + }, + + [HOLD_EFFECT_DAMP_ROCK] = + { + }, + + [HOLD_EFFECT_GRIP_CLAW] = + { + }, + + [HOLD_EFFECT_HEAT_ROCK] = + { + }, + + [HOLD_EFFECT_ICY_ROCK] = + { + }, + + [HOLD_EFFECT_LIGHT_CLAY] = + { + }, + + [HOLD_EFFECT_SMOOTH_ROCK] = + { + }, + + [HOLD_EFFECT_POWER_HERB] = + { + }, + + [HOLD_EFFECT_BIG_ROOT] = + { + }, + + [HOLD_EFFECT_EXPERT_BELT] = + { + }, + + [HOLD_EFFECT_LIFE_ORB] = + { + .lifeOrbShellBell = TRUE, + }, + + [HOLD_EFFECT_METRONOME] = + { + }, + + [HOLD_EFFECT_MUSCLE_BAND] = + { + }, + + [HOLD_EFFECT_WIDE_LENS] = + { + }, + + [HOLD_EFFECT_WISE_GLASSES] = + { + }, + + [HOLD_EFFECT_ZOOM_LENS] = + { + }, + + [HOLD_EFFECT_LAGGING_TAIL] = + { + }, + + [HOLD_EFFECT_FOCUS_SASH] = + { + }, + + [HOLD_EFFECT_FLAME_ORB] = + { + .orbs = TRUE, + }, + + [HOLD_EFFECT_TOXIC_ORB] = + { + .orbs = TRUE, + }, + + [HOLD_EFFECT_STICKY_BARB] = + { + .onTargetAfterHit = TRUE, + .orbs = TRUE, + }, + + [HOLD_EFFECT_IRON_BALL] = + { + }, + + [HOLD_EFFECT_BLACK_SLUDGE] = + { + .leftovers = TRUE, + }, + + [HOLD_EFFECT_DESTINY_KNOT] = + { + }, + + [HOLD_EFFECT_SHED_SHELL] = + { + }, + + [HOLD_EFFECT_QUICK_POWDER] = + { + }, + + [HOLD_EFFECT_ADAMANT_ORB] = + { + }, + + [HOLD_EFFECT_LUSTROUS_ORB] = + { + }, + + [HOLD_EFFECT_GRISEOUS_ORB] = + { + }, + + [HOLD_EFFECT_ENIGMA_BERRY] = + { + .onTargetAfterHit = TRUE, + }, + + [HOLD_EFFECT_RESIST_BERRY] = + { + }, + + [HOLD_EFFECT_POWER_ITEM] = + { + }, + + [HOLD_EFFECT_RESTORE_PCT_HP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_MICLE_BERRY] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_CUSTAP_BERRY] = + { + }, + + [HOLD_EFFECT_JABOCA_BERRY] = + { + .onTargetAfterHit = TRUE, + }, + + [HOLD_EFFECT_ROWAP_BERRY] = + { + .onTargetAfterHit = TRUE, + }, + + [HOLD_EFFECT_KEE_BERRY] = + { + .keeMarangaBerry = TRUE, + }, + + [HOLD_EFFECT_MARANGA_BERRY] = + { + .keeMarangaBerry = TRUE, + }, + + [HOLD_EFFECT_PLATE] = + { + }, + + [HOLD_EFFECT_FLOAT_STONE] = + { + }, + + [HOLD_EFFECT_EVIOLITE] = + { + }, + + [HOLD_EFFECT_ASSAULT_VEST] = + { + }, + + [HOLD_EFFECT_DRIVE] = + { + }, + + [HOLD_EFFECT_GEMS] = + { + }, + + [HOLD_EFFECT_ROCKY_HELMET] = + { + .onTargetAfterHit = TRUE, + }, + + [HOLD_EFFECT_AIR_BALLOON] = + { + .onTargetAfterHit = TRUE, + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + }, + + [HOLD_EFFECT_RED_CARD] = + { + }, + + [HOLD_EFFECT_RING_TARGET] = + { + }, + + [HOLD_EFFECT_BINDING_BAND] = + { + }, + + [HOLD_EFFECT_EJECT_BUTTON] = + { + }, + + [HOLD_EFFECT_ABSORB_BULB] = + { + .onTargetAfterHit = TRUE, + }, + + [HOLD_EFFECT_CELL_BATTERY] = + { + .onTargetAfterHit = TRUE, + }, + + [HOLD_EFFECT_MEGA_STONE] = + { + }, + + [HOLD_EFFECT_SAFETY_GOGGLES] = + { + }, + + [HOLD_EFFECT_LUMINOUS_MOSS] = + { + .onTargetAfterHit = TRUE, + }, + + [HOLD_EFFECT_SNOWBALL] = + { + .onTargetAfterHit = TRUE, + }, + + [HOLD_EFFECT_WEAKNESS_POLICY] = + { + .onTargetAfterHit = TRUE, + }, + + [HOLD_EFFECT_PRIMAL_ORB] = + { + }, + + [HOLD_EFFECT_PROTECTIVE_PADS] = + { + }, + + [HOLD_EFFECT_TERRAIN_EXTENDER] = + { + }, + + [HOLD_EFFECT_TERRAIN_SEED] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onEffect = TRUE, + }, + + [HOLD_EFFECT_ADRENALINE_ORB] = + { + }, + + [HOLD_EFFECT_MEMORY] = + { + }, + + [HOLD_EFFECT_Z_CRYSTAL] = + { + }, + + [HOLD_EFFECT_UTILITY_UMBRELLA] = + { + }, + + [HOLD_EFFECT_EJECT_PACK] = + { + }, + + [HOLD_EFFECT_ROOM_SERVICE] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onEffect = TRUE, + }, + + [HOLD_EFFECT_BLUNDER_POLICY] = + { + .onAttackerAfterHit = TRUE, + }, + + [HOLD_EFFECT_HEAVY_DUTY_BOOTS] = + { + }, + + [HOLD_EFFECT_THROAT_SPRAY] = + { + .onAttackerAfterHit = TRUE, + }, + + [HOLD_EFFECT_ABILITY_SHIELD] = + { + }, + + [HOLD_EFFECT_CLEAR_AMULET] = + { + }, + + [HOLD_EFFECT_MIRROR_HERB] = + { + .mirrorHerb = TRUE, + .mirrorHerbFirstTurn = TRUE, + }, + + [HOLD_EFFECT_PUNCHING_GLOVE] = + { + }, + + [HOLD_EFFECT_COVERT_CLOAK] = + { + }, + + [HOLD_EFFECT_LOADED_DICE] = + { + }, + + [HOLD_EFFECT_BOOSTER_ENERGY] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onEffect = TRUE, + }, + + [HOLD_EFFECT_OGERPON_MASK] = + { + }, + + [HOLD_EFFECT_BERSERK_GENE] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + }, +}; diff --git a/src/data/items.h b/src/data/items.h index 187b4bc399d4..e39d84166db3 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -14,6 +14,9 @@ #define TREASURE_FACTOR ((I_SELL_VALUE_FRACTION >= GEN_9) ? 2 : 1) +#define ITEM_NAME(str) COMPOUND_STRING_SIZE_LIMIT(str, ITEM_NAME_LENGTH) +#define ITEM_PLURAL_NAME(str) COMPOUND_STRING_SIZE_LIMIT(str, ITEM_NAME_PLURAL_LENGTH) + // Shared Item Description entries static const u8 sFullHealDesc[] = _("Heals all the\n" @@ -124,6 +127,8 @@ static const u8 sFigyBerryDesc[] = _("A hold item that\n" "restores HP but\n" "may confuse."); +const u8 gQuestionMarksItemName[] = _("????????"); + static const u8 sQuestionMarksDesc[] = _("?????"); static const u8 sKeyToRoomDesc[] = _("A key that opens a\n" @@ -142,10 +147,11 @@ const struct Item gItemsInfo[] = { [ITEM_NONE] = { - .name = _("????????"), + .name = gQuestionMarksItemName, .price = 0, .description = sQuestionMarksDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_UNCATEGORIZED, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_QuestionMark, @@ -156,7 +162,7 @@ const struct Item gItemsInfo[] = [ITEM_STRANGE_BALL] = { - .name = _("Strange Ball"), + .name = ITEM_NAME("Strange Ball"), .price = 0, .description = COMPOUND_STRING( "An unusual Ball\n" @@ -172,7 +178,7 @@ const struct Item gItemsInfo[] = [ITEM_POKE_BALL] = { - .name = _("PokΓ© Ball"), + .name = ITEM_NAME("PokΓ© Ball"), .price = 200, .description = COMPOUND_STRING( "A tool used for\n" @@ -188,7 +194,7 @@ const struct Item gItemsInfo[] = [ITEM_GREAT_BALL] = { - .name = _("Great Ball"), + .name = ITEM_NAME("Great Ball"), .price = 600, .description = COMPOUND_STRING( "A good Ball with a\n" @@ -204,7 +210,7 @@ const struct Item gItemsInfo[] = [ITEM_ULTRA_BALL] = { - .name = _("Ultra Ball"), + .name = ITEM_NAME("Ultra Ball"), .price = (I_PRICE >= GEN_7) ? 800 : 1200, .description = COMPOUND_STRING( "A better Ball with\n" @@ -220,7 +226,7 @@ const struct Item gItemsInfo[] = [ITEM_MASTER_BALL] = { - .name = _("Master Ball"), + .name = ITEM_NAME("Master Ball"), .price = 0, .description = COMPOUND_STRING( "The best Ball that\n" @@ -236,7 +242,7 @@ const struct Item gItemsInfo[] = [ITEM_PREMIER_BALL] = { - .name = _("Premier Ball"), + .name = ITEM_NAME("Premier Ball"), .price = (I_PRICE >= GEN_7) ? 20 : 200, .description = COMPOUND_STRING( "A rare Ball made\n" @@ -252,7 +258,7 @@ const struct Item gItemsInfo[] = [ITEM_HEAL_BALL] = { - .name = _("Heal Ball"), + .name = ITEM_NAME("Heal Ball"), .price = 300, .description = COMPOUND_STRING( "A remedial Ball\n" @@ -268,7 +274,7 @@ const struct Item gItemsInfo[] = [ITEM_NET_BALL] = { - .name = _("Net Ball"), + .name = ITEM_NAME("Net Ball"), .price = 1000, .description = COMPOUND_STRING( "A Ball that works\n" @@ -284,7 +290,7 @@ const struct Item gItemsInfo[] = [ITEM_NEST_BALL] = { - .name = _("Nest Ball"), + .name = ITEM_NAME("Nest Ball"), .price = 1000, .description = COMPOUND_STRING( "A Ball that works\n" @@ -300,7 +306,7 @@ const struct Item gItemsInfo[] = [ITEM_DIVE_BALL] = { - .name = _("Dive Ball"), + .name = ITEM_NAME("Dive Ball"), .price = 1000, .description = COMPOUND_STRING( "A Ball that works\n" @@ -316,7 +322,7 @@ const struct Item gItemsInfo[] = [ITEM_DUSK_BALL] = { - .name = _("Dusk Ball"), + .name = ITEM_NAME("Dusk Ball"), .price = 1000, .description = COMPOUND_STRING( "Works well if\n" @@ -332,7 +338,7 @@ const struct Item gItemsInfo[] = [ITEM_TIMER_BALL] = { - .name = _("Timer Ball"), + .name = ITEM_NAME("Timer Ball"), .price = 1000, .description = COMPOUND_STRING( "A Ball that gains\n" @@ -348,7 +354,7 @@ const struct Item gItemsInfo[] = [ITEM_QUICK_BALL] = { - .name = _("Quick Ball"), + .name = ITEM_NAME("Quick Ball"), .price = 1000, .description = COMPOUND_STRING( "Works well if\n" @@ -364,7 +370,7 @@ const struct Item gItemsInfo[] = [ITEM_REPEAT_BALL] = { - .name = _("Repeat Ball"), + .name = ITEM_NAME("Repeat Ball"), .price = 1000, .description = COMPOUND_STRING( "A Ball that works\n" @@ -380,7 +386,7 @@ const struct Item gItemsInfo[] = [ITEM_LUXURY_BALL] = { - .name = _("Luxury Ball"), + .name = ITEM_NAME("Luxury Ball"), .price = (I_PRICE >= GEN_8) ? 3000 : 1000, .description = COMPOUND_STRING( "A cozy Ball that\n" @@ -396,7 +402,7 @@ const struct Item gItemsInfo[] = [ITEM_LEVEL_BALL] = { - .name = _("Level Ball"), + .name = ITEM_NAME("Level Ball"), .price = (I_PRICE >= GEN_7) ? 0 : 300, .description = COMPOUND_STRING( "A Ball that works\n" @@ -412,7 +418,7 @@ const struct Item gItemsInfo[] = [ITEM_LURE_BALL] = { - .name = _("Lure Ball"), + .name = ITEM_NAME("Lure Ball"), .price = (I_PRICE >= GEN_7) ? 0 : 300, .description = COMPOUND_STRING( "A Ball that works\n" @@ -428,7 +434,7 @@ const struct Item gItemsInfo[] = [ITEM_MOON_BALL] = { - .name = _("Moon Ball"), + .name = ITEM_NAME("Moon Ball"), .price = (I_PRICE >= GEN_7) ? 0 : 300, .description = COMPOUND_STRING( "A Ball that works\n" @@ -444,7 +450,7 @@ const struct Item gItemsInfo[] = [ITEM_FRIEND_BALL] = { - .name = _("Friend Ball"), + .name = ITEM_NAME("Friend Ball"), .price = (I_PRICE >= GEN_7) ? 0 : 300, .description = COMPOUND_STRING( "A Ball that makes\n" @@ -460,7 +466,7 @@ const struct Item gItemsInfo[] = [ITEM_LOVE_BALL] = { - .name = _("Love Ball"), + .name = ITEM_NAME("Love Ball"), .price = (I_PRICE >= GEN_7) ? 0 : 300, .description = COMPOUND_STRING( "Works well on\n" @@ -476,7 +482,7 @@ const struct Item gItemsInfo[] = [ITEM_FAST_BALL] = { - .name = _("Fast Ball"), + .name = ITEM_NAME("Fast Ball"), .price = (I_PRICE >= GEN_7) ? 0 : 300, .description = COMPOUND_STRING( "Works well on\n" @@ -492,7 +498,7 @@ const struct Item gItemsInfo[] = [ITEM_HEAVY_BALL] = { - .name = _("Heavy Ball"), + .name = ITEM_NAME("Heavy Ball"), .price = (I_PRICE >= GEN_7) ? 0 : 300, .description = COMPOUND_STRING( "Works well on\n" @@ -508,7 +514,7 @@ const struct Item gItemsInfo[] = [ITEM_DREAM_BALL] = { - .name = _("Dream Ball"), + .name = ITEM_NAME("Dream Ball"), .price = 0, .description = COMPOUND_STRING( #if B_DREAM_BALL_MODIFIER >= GEN_8 @@ -529,7 +535,7 @@ const struct Item gItemsInfo[] = [ITEM_SAFARI_BALL] = { - .name = _("Safari Ball"), + .name = ITEM_NAME("Safari Ball"), .price = 0, .description = COMPOUND_STRING( "A special Ball that\n" @@ -545,7 +551,7 @@ const struct Item gItemsInfo[] = [ITEM_SPORT_BALL] = { - .name = _("Sport Ball"), + .name = ITEM_NAME("Sport Ball"), .price = (I_PRICE < GEN_3 || I_PRICE >= GEN_9) ? 0 : 300, .description = COMPOUND_STRING( "A special Ball\n" @@ -561,7 +567,7 @@ const struct Item gItemsInfo[] = [ITEM_PARK_BALL] = { - .name = _("Park Ball"), + .name = ITEM_NAME("Park Ball"), .price = 0, .description = COMPOUND_STRING( "A special Ball for\n" @@ -576,7 +582,7 @@ const struct Item gItemsInfo[] = [ITEM_BEAST_BALL] = { - .name = _("Beast Ball"), + .name = ITEM_NAME("Beast Ball"), .price = 0, .description = COMPOUND_STRING( "A Ball designed to\n" @@ -591,7 +597,7 @@ const struct Item gItemsInfo[] = [ITEM_CHERISH_BALL] = { - .name = _("Cherish Ball"), + .name = ITEM_NAME("Cherish Ball"), .price = 0, .description = COMPOUND_STRING( "A rare Ball made\n" @@ -609,7 +615,7 @@ const struct Item gItemsInfo[] = [ITEM_POTION] = { - .name = _("Potion"), + .name = ITEM_NAME("Potion"), .price = (I_PRICE >= GEN_7) ? 200 : 300, .holdEffectParam = 20, .description = COMPOUND_STRING( @@ -617,6 +623,7 @@ const struct Item gItemsInfo[] = "a PokΓ©mon by\n" "20 points."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -628,7 +635,7 @@ const struct Item gItemsInfo[] = [ITEM_SUPER_POTION] = { - .name = _("Super Potion"), + .name = ITEM_NAME("Super Potion"), .price = 700, .holdEffectParam = 60, .description = COMPOUND_STRING( @@ -640,6 +647,7 @@ const struct Item gItemsInfo[] = "50 points."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -651,7 +659,7 @@ const struct Item gItemsInfo[] = [ITEM_HYPER_POTION] = { - .name = _("Hyper Potion"), + .name = ITEM_NAME("Hyper Potion"), .price = (I_PRICE >= GEN_2 && I_PRICE <= GEN_6) ? 1200 : 1500, .holdEffectParam = 120, .description = COMPOUND_STRING( @@ -663,6 +671,7 @@ const struct Item gItemsInfo[] = "200 points."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -674,13 +683,14 @@ const struct Item gItemsInfo[] = [ITEM_MAX_POTION] = { - .name = _("Max Potion"), + .name = ITEM_NAME("Max Potion"), .price = 2500, .holdEffectParam = 255, .description = COMPOUND_STRING( "Fully restores the\n" "HP of a PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -692,7 +702,7 @@ const struct Item gItemsInfo[] = [ITEM_FULL_RESTORE] = { - .name = _("Full Restore"), + .name = ITEM_NAME("Full Restore"), .price = 3000, .holdEffectParam = 255, .description = COMPOUND_STRING( @@ -700,6 +710,7 @@ const struct Item gItemsInfo[] = "HP and status of a\n" "PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_HEAL_AND_CURE_STATUS, @@ -711,13 +722,14 @@ const struct Item gItemsInfo[] = [ITEM_REVIVE] = { - .name = _("Revive"), + .name = ITEM_NAME("Revive"), .price = (I_PRICE >= GEN_7) ? 2000 : 1500, .description = COMPOUND_STRING( "Revives a fainted\n" "PokΓ©mon with half\n" "its HP."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_REVIVE, @@ -729,10 +741,11 @@ const struct Item gItemsInfo[] = [ITEM_MAX_REVIVE] = { - .name = _("Max Revive"), + .name = ITEM_NAME("Max Revive"), .price = 4000, .description = sMaxReviveDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_REVIVE, @@ -744,7 +757,7 @@ const struct Item gItemsInfo[] = [ITEM_FRESH_WATER] = { - .name = _("Fresh Water"), + .name = ITEM_NAME("Fresh Water"), .price = 200, .holdEffectParam = 30, .description = COMPOUND_STRING( @@ -756,6 +769,7 @@ const struct Item gItemsInfo[] = "by 50 points."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -767,7 +781,7 @@ const struct Item gItemsInfo[] = [ITEM_SODA_POP] = { - .name = _("Soda Pop"), + .name = ITEM_NAME("Soda Pop"), .price = 300, .holdEffectParam = 50, .description = COMPOUND_STRING( @@ -779,6 +793,7 @@ const struct Item gItemsInfo[] = "by 60 points."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -790,7 +805,7 @@ const struct Item gItemsInfo[] = [ITEM_LEMONADE] = { - .name = _("Lemonade"), + .name = ITEM_NAME("Lemonade"), .price = (I_PRICE >= GEN_7) ? 400 : 350, .holdEffectParam = 70, #if I_HEALTH_RECOVERY >= GEN_7 @@ -805,6 +820,7 @@ const struct Item gItemsInfo[] = "by 80 points."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -816,8 +832,8 @@ const struct Item gItemsInfo[] = [ITEM_MOOMOO_MILK] = { - .name = _("Moomoo Milk"), - .pluralName = _("Moomoo Milk"), + .name = ITEM_NAME("Moomoo Milk"), + .pluralName = ITEM_PLURAL_NAME("Moomoo Milk"), .price = (I_PRICE >= GEN_7) ? 600 : 500, .holdEffectParam = 100, .description = COMPOUND_STRING( @@ -825,6 +841,7 @@ const struct Item gItemsInfo[] = "that restores HP\n" "by 100 points."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -836,8 +853,8 @@ const struct Item gItemsInfo[] = [ITEM_ENERGY_POWDER] = { - .name = _("Energy Powder"), - .pluralName = _("Energy Powder"), + .name = ITEM_NAME("Energy Powder"), + .pluralName = ITEM_PLURAL_NAME("Energy Powder"), .price = 500, .description = COMPOUND_STRING( "A bitter powder\n" @@ -848,6 +865,7 @@ const struct Item gItemsInfo[] = "by 50 points."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -859,7 +877,7 @@ const struct Item gItemsInfo[] = [ITEM_ENERGY_ROOT] = { - .name = _("Energy Root"), + .name = ITEM_NAME("Energy Root"), .price = (I_PRICE >= GEN_7) ? 1200 : 800, .description = COMPOUND_STRING( "A bitter root\n" @@ -870,6 +888,7 @@ const struct Item gItemsInfo[] = "by 200 points."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -881,14 +900,15 @@ const struct Item gItemsInfo[] = [ITEM_HEAL_POWDER] = { - .name = _("Heal Powder"), - .pluralName = _("Heal Powder"), + .name = ITEM_NAME("Heal Powder"), + .pluralName = ITEM_PLURAL_NAME("Heal Powder"), .price = (I_PRICE >= GEN_7) ? 300 : 450, .description = COMPOUND_STRING( "A bitter powder\n" "that heals all\n" "status problems."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -900,13 +920,14 @@ const struct Item gItemsInfo[] = [ITEM_REVIVAL_HERB] = { - .name = _("Revival Herb"), + .name = ITEM_NAME("Revival Herb"), .price = 2800, .description = COMPOUND_STRING( "A very bitter herb\n" "that revives a\n" "fainted PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_REVIVE, @@ -918,12 +939,13 @@ const struct Item gItemsInfo[] = [ITEM_ANTIDOTE] = { - .name = _("Antidote"), + .name = ITEM_NAME("Antidote"), .price = (I_PRICE >= GEN_7) ? 200 : 100, .description = COMPOUND_STRING( "Heals a poisoned\n" "PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -935,12 +957,13 @@ const struct Item gItemsInfo[] = [ITEM_PARALYZE_HEAL] = { - .name = _("Paralyze Heal"), + .name = ITEM_NAME("Paralyze Heal"), .price = (I_PRICE == GEN_7) ? 300 : 200, .description = COMPOUND_STRING( "Heals a paralyzed\n" "PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -952,12 +975,13 @@ const struct Item gItemsInfo[] = [ITEM_BURN_HEAL] = { - .name = _("Burn Heal"), + .name = ITEM_NAME("Burn Heal"), .price = (I_PRICE == GEN_7) ? 300 : ((I_PRICE <= GEN_7) ? 250 : 200), .description = COMPOUND_STRING( "Heals PokΓ©mon\n" "of a burn."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -969,12 +993,13 @@ const struct Item gItemsInfo[] = [ITEM_ICE_HEAL] = { - .name = _("Ice Heal"), + .name = ITEM_NAME("Ice Heal"), .price = (I_PRICE == GEN_7) ? 100 : ((I_PRICE <= GEN_7) ? 250 : 200), .description = COMPOUND_STRING( "Defrosts a frozen\n" "PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -986,12 +1011,13 @@ const struct Item gItemsInfo[] = [ITEM_AWAKENING] = { - .name = _("Awakening"), + .name = ITEM_NAME("Awakening"), .price = (I_PRICE >= GEN_2 && I_PRICE <= GEN_6) ? 250 : ((I_PRICE == GEN_7) ? 100 : 200), .description = COMPOUND_STRING( "Awakens a sleeping\n" "PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -1003,10 +1029,11 @@ const struct Item gItemsInfo[] = [ITEM_FULL_HEAL] = { - .name = _("Full Heal"), + .name = ITEM_NAME("Full Heal"), .price = (I_PRICE >= GEN_7) ? 400 : 600, .description = sFullHealDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -1018,7 +1045,7 @@ const struct Item gItemsInfo[] = [ITEM_ETHER] = { - .name = _("Ether"), + .name = ITEM_NAME("Ether"), .price = (I_PRICE >= GEN_2) ? 1200 : 1, .holdEffectParam = 10, .description = COMPOUND_STRING( @@ -1026,6 +1053,7 @@ const struct Item gItemsInfo[] = "of a selected move\n" "by 10."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PP_RECOVERY, .type = ITEM_USE_PARTY_MENU_MOVES, .fieldUseFunc = ItemUseOutOfBattle_PPRecovery, .battleUsage = EFFECT_ITEM_RESTORE_PP, @@ -1037,7 +1065,7 @@ const struct Item gItemsInfo[] = [ITEM_MAX_ETHER] = { - .name = _("Max Ether"), + .name = ITEM_NAME("Max Ether"), .price = (I_PRICE >= GEN_2) ? 2000 : 1, .holdEffectParam = 255, .description = COMPOUND_STRING( @@ -1045,6 +1073,7 @@ const struct Item gItemsInfo[] = "PP of a selected\n" "move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PP_RECOVERY, .type = ITEM_USE_PARTY_MENU_MOVES, .fieldUseFunc = ItemUseOutOfBattle_PPRecovery, .battleUsage = EFFECT_ITEM_RESTORE_PP, @@ -1056,13 +1085,14 @@ const struct Item gItemsInfo[] = [ITEM_ELIXIR] = { - .name = _("Elixir"), + .name = ITEM_NAME("Elixir"), .price = (I_PRICE >= GEN_2) ? 3000 : 1, .holdEffectParam = 10, .description = COMPOUND_STRING( "Restores the PP\n" "of all moves by 10."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PP_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_PPRecovery, .battleUsage = EFFECT_ITEM_RESTORE_PP, @@ -1074,7 +1104,7 @@ const struct Item gItemsInfo[] = [ITEM_MAX_ELIXIR] = { - .name = _("Max Elixir"), + .name = ITEM_NAME("Max Elixir"), .price = (I_PRICE >= GEN_2) ? 4500 : 1, .holdEffectParam = 255, .description = COMPOUND_STRING( @@ -1082,6 +1112,7 @@ const struct Item gItemsInfo[] = "PP of a PokΓ©mon's\n" "moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PP_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_PPRecovery, .battleUsage = EFFECT_ITEM_RESTORE_PP, @@ -1093,8 +1124,8 @@ const struct Item gItemsInfo[] = [ITEM_BERRY_JUICE] = { - .name = _("Berry Juice"), - .pluralName = _("Berry Juice"), + .name = ITEM_NAME("Berry Juice"), + .pluralName = ITEM_PLURAL_NAME("Berry Juice"), .price = 100, .holdEffect = HOLD_EFFECT_RESTORE_HP, .holdEffectParam = 20, @@ -1103,6 +1134,7 @@ const struct Item gItemsInfo[] = "that restores HP\n" "by 20 points."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -1114,14 +1146,15 @@ const struct Item gItemsInfo[] = [ITEM_SACRED_ASH] = { - .name = _("Sacred Ash"), - .pluralName = _("Sacred Ashes"), + .name = ITEM_NAME("Sacred Ash"), + .pluralName = ITEM_PLURAL_NAME("Sacred Ashes"), .price = (I_PRICE >= GEN_7) ? 50000 : 200, .description = COMPOUND_STRING( "Fully revives and\n" "restores all\n" "fainted PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_SacredAsh, .effect = gItemEffect_SacredAsh, @@ -1132,7 +1165,7 @@ const struct Item gItemsInfo[] = [ITEM_SWEET_HEART] = { - .name = _("Sweet Heart"), + .name = ITEM_NAME("Sweet Heart"), .price = (I_PRICE >= GEN_7) ? 3000 : 100, .holdEffectParam = 20, .description = COMPOUND_STRING( @@ -1140,6 +1173,7 @@ const struct Item gItemsInfo[] = "that restores HP\n" "by 20 points."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -1151,11 +1185,12 @@ const struct Item gItemsInfo[] = [ITEM_MAX_HONEY] = { - .name = _("Max Honey"), - .pluralName = _("Max Honey"), + .name = ITEM_NAME("Max Honey"), + .pluralName = ITEM_PLURAL_NAME("Max Honey"), .price = 8000, .description = sMaxReviveDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_REVIVE, @@ -1169,11 +1204,12 @@ const struct Item gItemsInfo[] = [ITEM_PEWTER_CRUNCHIES] = { - .name = _("Pewter Crunchies"), - .pluralName = _("Pewter Crunchies"), + .name = ITEM_NAME("Pewter Crunchies"), + .pluralName = ITEM_PLURAL_NAME("Pewter Crunchies"), .price = 250, .description = sFullHealDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -1185,10 +1221,11 @@ const struct Item gItemsInfo[] = [ITEM_RAGE_CANDY_BAR] = { - .name = _("Rage Candy Bar"), + .name = ITEM_NAME("Rage Candy Bar"), .price = (I_PRICE >= GEN_7) ? 350 : 300, .description = sFullHealDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -1200,13 +1237,14 @@ const struct Item gItemsInfo[] = [ITEM_LAVA_COOKIE] = { - .name = _("Lava Cookie"), + .name = ITEM_NAME("Lava Cookie"), .price = (I_PRICE >= GEN_7) ? 350 : 200, .description = COMPOUND_STRING( "A local specialty\n" "that heals all\n" "status problems."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -1218,11 +1256,12 @@ const struct Item gItemsInfo[] = [ITEM_OLD_GATEAU] = { - .name = _("Old Gateau"), - .pluralName = _("Old Gateaux"), + .name = ITEM_NAME("Old Gateau"), + .pluralName = ITEM_PLURAL_NAME("Old Gateaux"), .price = (I_PRICE >= GEN_7) ? 350 : 200, .description = sFullHealDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -1234,10 +1273,11 @@ const struct Item gItemsInfo[] = [ITEM_CASTELIACONE] = { - .name = _("Casteliacone"), + .name = ITEM_NAME("Casteliacone"), .price = (I_PRICE >= GEN_7) ? 350 : 100, .description = sFullHealDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -1249,10 +1289,11 @@ const struct Item gItemsInfo[] = [ITEM_LUMIOSE_GALETTE] = { - .name = _("Lumiose Galette"), + .name = ITEM_NAME("Lumiose Galette"), .price = (I_PRICE >= GEN_7) ? 350 : 200, .description = sFullHealDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -1264,10 +1305,11 @@ const struct Item gItemsInfo[] = [ITEM_SHALOUR_SABLE] = { - .name = _("Shalour Sable"), + .name = ITEM_NAME("Shalour Sable"), .price = (I_PRICE >= GEN_7) ? 350 : 200, .description = sFullHealDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -1279,10 +1321,11 @@ const struct Item gItemsInfo[] = [ITEM_BIG_MALASADA] = { - .name = _("Big Malasada"), + .name = ITEM_NAME("Big Malasada"), .price = 350, .description = sFullHealDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -1296,12 +1339,13 @@ const struct Item gItemsInfo[] = [ITEM_HP_UP] = { - .name = _("HP Up"), + .name = ITEM_NAME("HP Up"), .price = (I_PRICE >= GEN_7) ? 10000 : 9800, .description = COMPOUND_STRING( "Raises the base HP\n" "of one PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_DRINK, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_HPUp, @@ -1312,13 +1356,14 @@ const struct Item gItemsInfo[] = [ITEM_PROTEIN] = { - .name = _("Protein"), + .name = ITEM_NAME("Protein"), .price = (I_PRICE >= GEN_7) ? 10000 : 9800, .description = COMPOUND_STRING( "Raises the base\n" "Attack stat of one\n" "PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_DRINK, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_Protein, @@ -1329,13 +1374,14 @@ const struct Item gItemsInfo[] = [ITEM_IRON] = { - .name = _("Iron"), + .name = ITEM_NAME("Iron"), .price = (I_PRICE >= GEN_7) ? 10000 : 9800, .description = COMPOUND_STRING( "Raises the base\n" "Defense stat of\n" "one PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_DRINK, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_Iron, @@ -1346,13 +1392,14 @@ const struct Item gItemsInfo[] = [ITEM_CALCIUM] = { - .name = _("Calcium"), + .name = ITEM_NAME("Calcium"), .price = (I_PRICE >= GEN_7) ? 10000 : 9800, .description = COMPOUND_STRING( "Raises the base\n" "Sp. Atk stat of one\n" "PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_DRINK, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_Calcium, @@ -1363,13 +1410,14 @@ const struct Item gItemsInfo[] = [ITEM_ZINC] = { - .name = _("Zinc"), + .name = ITEM_NAME("Zinc"), .price = (I_PRICE >= GEN_7) ? 10000 : 9800, .description = COMPOUND_STRING( "Raises the base\n" "Sp. Def stat of one\n" "PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_DRINK, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_Zinc, @@ -1380,14 +1428,15 @@ const struct Item gItemsInfo[] = [ITEM_CARBOS] = { - .name = _("Carbos"), - .pluralName = _("Carbos"), + .name = ITEM_NAME("Carbos"), + .pluralName = ITEM_PLURAL_NAME("Carbos"), .price = (I_PRICE >= GEN_7) ? 10000 : 9800, .description = COMPOUND_STRING( "Raises the base\n" "Speed stat of one\n" "PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_DRINK, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_Carbos, @@ -1398,13 +1447,14 @@ const struct Item gItemsInfo[] = [ITEM_PP_UP] = { - .name = _("PP Up"), + .name = ITEM_NAME("PP Up"), .price = (I_PRICE == GEN_1) ? 1 : ((I_PRICE >= GEN_7) ? 10000 : 9800), .description = COMPOUND_STRING( "Raises the maximum\n" "PP of a selected\n" "move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_DRINK, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_PPUp, .effect = gItemEffect_PPUp, @@ -1415,14 +1465,15 @@ const struct Item gItemsInfo[] = [ITEM_PP_MAX] = { - .name = _("PP Max"), - .pluralName = _("PP Maxes"), + .name = ITEM_NAME("PP Max"), + .pluralName = ITEM_PLURAL_NAME("PP Maxes"), .price = (I_PRICE >= GEN_7) ? 10000 : 9800, .description = COMPOUND_STRING( "Raises the PP of a\n" "move to its maximum\n" "points."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_DRINK, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_PPUp, .effect = gItemEffect_PPMax, @@ -1435,10 +1486,11 @@ const struct Item gItemsInfo[] = [ITEM_HEALTH_FEATHER] = { - .name = _("Health Feather"), + .name = ITEM_NAME("Health Feather"), .price = (I_PRICE >= GEN_7) ? 300 : 3000, .description = sHealthFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_FEATHER, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_HpFeather, @@ -1449,10 +1501,11 @@ const struct Item gItemsInfo[] = [ITEM_MUSCLE_FEATHER] = { - .name = _("Muscle Feather"), + .name = ITEM_NAME("Muscle Feather"), .price = (I_PRICE >= GEN_7) ? 300 : 3000, .description = sMuscleFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_FEATHER, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_AtkFeather, @@ -1463,10 +1516,11 @@ const struct Item gItemsInfo[] = [ITEM_RESIST_FEATHER] = { - .name = _("Resist Feather"), + .name = ITEM_NAME("Resist Feather"), .price = (I_PRICE >= GEN_7) ? 300 : 3000, .description = sResistFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_FEATHER, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_DefFeather, @@ -1477,10 +1531,11 @@ const struct Item gItemsInfo[] = [ITEM_GENIUS_FEATHER] = { - .name = _("Genius Feather"), + .name = ITEM_NAME("Genius Feather"), .price = (I_PRICE >= GEN_7) ? 300 : 3000, .description = sGeniusFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_FEATHER, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_SpatkFeather, @@ -1491,10 +1546,11 @@ const struct Item gItemsInfo[] = [ITEM_CLEVER_FEATHER] = { - .name = _("Clever Feather"), + .name = ITEM_NAME("Clever Feather"), .price = (I_PRICE >= GEN_7) ? 300 : 3000, .description = sCleverFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_FEATHER, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_SpdefFeather, @@ -1505,10 +1561,11 @@ const struct Item gItemsInfo[] = [ITEM_SWIFT_FEATHER] = { - .name = _("Swift Feather"), + .name = ITEM_NAME("Swift Feather"), .price = (I_PRICE >= GEN_7) ? 300 : 3000, .description = sSwiftFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_FEATHER, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_SpeedFeather, @@ -1521,13 +1578,14 @@ const struct Item gItemsInfo[] = [ITEM_ABILITY_CAPSULE] = { - .name = _("Ability Capsule"), + .name = ITEM_NAME("Ability Capsule"), .price = (I_PRICE < GEN_7) ? 1000 : ((I_PRICE < GEN_9) ? 10000 : 100000), .holdEffectParam = 0, .description = COMPOUND_STRING( "Switches a PokΓ©-\n" "mon's ability."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FIELD_USE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_AbilityCapsule, .iconPic = gItemIcon_AbilityCapsule, @@ -1536,8 +1594,8 @@ const struct Item gItemsInfo[] = [ITEM_ABILITY_PATCH] = { - .name = _("Ability Patch"), - .pluralName = _("Ability Patches"), + .name = ITEM_NAME("Ability Patch"), + .pluralName = ITEM_PLURAL_NAME("Ability Patches"), .price = (I_PRICE >= GEN_9) ? 250000 : 20, .holdEffectParam = 0, .description = COMPOUND_STRING( @@ -1545,6 +1603,7 @@ const struct Item gItemsInfo[] = "of a PokΓ©mon into\n" "a rare ability."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FIELD_USE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_AbilityPatch, .iconPic = gItemIcon_AbilityPatch, @@ -1555,13 +1614,14 @@ const struct Item gItemsInfo[] = [ITEM_LONELY_MINT] = { - .name = _("Lonely Mint"), + .name = ITEM_NAME("Lonely Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" "ups Attack, but\n" "reduces Defense."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_LONELY, @@ -1572,13 +1632,14 @@ const struct Item gItemsInfo[] = [ITEM_ADAMANT_MINT] = { - .name = _("Adamant Mint"), + .name = ITEM_NAME("Adamant Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" "ups Attack, but\n" "reduces Sp. Atk."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_ADAMANT, @@ -1589,13 +1650,14 @@ const struct Item gItemsInfo[] = [ITEM_NAUGHTY_MINT] = { - .name = _("Naughty Mint"), + .name = ITEM_NAME("Naughty Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" "ups Attack, but\n" "reduces Sp. Def."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_NAUGHTY, @@ -1606,13 +1668,14 @@ const struct Item gItemsInfo[] = [ITEM_BRAVE_MINT] = { - .name = _("Brave Mint"), + .name = ITEM_NAME("Brave Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" "ups Attack, but\n" "reduces Speed."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_BRAVE, @@ -1623,13 +1686,14 @@ const struct Item gItemsInfo[] = [ITEM_BOLD_MINT] = { - .name = _("Bold Mint"), + .name = ITEM_NAME("Bold Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" "ups Defense, but\n" "reduces Attack."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_BOLD, @@ -1640,13 +1704,14 @@ const struct Item gItemsInfo[] = [ITEM_IMPISH_MINT] = { - .name = _("Impish Mint"), + .name = ITEM_NAME("Impish Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" "ups Defense, but\n" "reduces Sp. Atk."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_IMPISH, @@ -1657,13 +1722,14 @@ const struct Item gItemsInfo[] = [ITEM_LAX_MINT] = { - .name = _("Lax Mint"), + .name = ITEM_NAME("Lax Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" "ups Defense, but\n" "reduces Sp. Def."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_LAX, @@ -1674,13 +1740,14 @@ const struct Item gItemsInfo[] = [ITEM_RELAXED_MINT] = { - .name = _("Relaxed Mint"), + .name = ITEM_NAME("Relaxed Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" "ups Defense, but\n" "reduces Speed."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_RELAXED, @@ -1691,13 +1758,14 @@ const struct Item gItemsInfo[] = [ITEM_MODEST_MINT] = { - .name = _("Modest Mint"), + .name = ITEM_NAME("Modest Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" "ups Sp. Atk, but\n" "reduces Attack."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_MODEST, @@ -1708,13 +1776,14 @@ const struct Item gItemsInfo[] = [ITEM_MILD_MINT] = { - .name = _("Mild Mint"), + .name = ITEM_NAME("Mild Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" "ups Sp. Atk, but\n" "reduces Defense."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_MILD, @@ -1725,13 +1794,14 @@ const struct Item gItemsInfo[] = [ITEM_RASH_MINT] = { - .name = _("Rash Mint"), + .name = ITEM_NAME("Rash Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" "ups Sp. Atk, but\n" "reduces Sp. Def."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_RASH, @@ -1742,13 +1812,14 @@ const struct Item gItemsInfo[] = [ITEM_QUIET_MINT] = { - .name = _("Quiet Mint"), + .name = ITEM_NAME("Quiet Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" "ups Sp. Atk, but\n" "reduces Speed."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_QUIET, @@ -1759,13 +1830,14 @@ const struct Item gItemsInfo[] = [ITEM_CALM_MINT] = { - .name = _("Calm Mint"), + .name = ITEM_NAME("Calm Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" "ups Sp. Def, but\n" "reduces Attack."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_CALM, @@ -1776,13 +1848,14 @@ const struct Item gItemsInfo[] = [ITEM_GENTLE_MINT] = { - .name = _("Gentle Mint"), + .name = ITEM_NAME("Gentle Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" "ups Sp. Def, but\n" "reduces Defense."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_GENTLE, @@ -1793,13 +1866,14 @@ const struct Item gItemsInfo[] = [ITEM_CAREFUL_MINT] = { - .name = _("Careful Mint"), + .name = ITEM_NAME("Careful Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" "ups Sp. Def, but\n" "reduces Sp. Atk."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_CAREFUL, @@ -1810,13 +1884,14 @@ const struct Item gItemsInfo[] = [ITEM_SASSY_MINT] = { - .name = _("Sassy Mint"), + .name = ITEM_NAME("Sassy Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" "ups Sp. Def, but\n" "reduces Speed."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_SASSY, @@ -1827,13 +1902,14 @@ const struct Item gItemsInfo[] = [ITEM_TIMID_MINT] = { - .name = _("Timid Mint"), + .name = ITEM_NAME("Timid Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" "ups Speed, but\n" "reduces Attack."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_TIMID, @@ -1844,13 +1920,14 @@ const struct Item gItemsInfo[] = [ITEM_HASTY_MINT] = { - .name = _("Hasty Mint"), + .name = ITEM_NAME("Hasty Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" "ups Speed, but\n" "reduces Defense."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_HASTY, @@ -1861,13 +1938,14 @@ const struct Item gItemsInfo[] = [ITEM_JOLLY_MINT] = { - .name = _("Jolly Mint"), + .name = ITEM_NAME("Jolly Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" "ups Speed, but\n" "reduces Sp. Atk."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_JOLLY, @@ -1878,13 +1956,14 @@ const struct Item gItemsInfo[] = [ITEM_NAIVE_MINT] = { - .name = _("Naive Mint"), + .name = ITEM_NAME("Naive Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" "ups Speed, but\n" "reduces Sp. Def."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_NAIVE, @@ -1895,13 +1974,14 @@ const struct Item gItemsInfo[] = [ITEM_SERIOUS_MINT] = { - .name = _("Serious Mint"), + .name = ITEM_NAME("Serious Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" "makes each stat\n" "grow equally."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_SERIOUS, @@ -1914,14 +1994,15 @@ const struct Item gItemsInfo[] = [ITEM_RARE_CANDY] = { - .name = _("Rare Candy"), - .pluralName = _("Rare Candies"), + .name = ITEM_NAME("Rare Candy"), + .pluralName = ITEM_PLURAL_NAME("Rare Candies"), .price = (I_PRICE >= GEN_7) ? 10000 : 4800, .description = COMPOUND_STRING( "Raises the level\n" "of a PokΓ©mon by\n" "one."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_LEVEL_UP_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_RareCandy, .effect = gItemEffect_RareCandy, @@ -1932,8 +2013,8 @@ const struct Item gItemsInfo[] = [ITEM_EXP_CANDY_XS] = { - .name = _("Exp. Candy XS"), - .pluralName = _("Exp. Candies XS"), + .name = ITEM_NAME("Exp. Candy XS"), + .pluralName = ITEM_PLURAL_NAME("Exp. Candies XS"), .price = 20, .holdEffectParam = EXP_100, .description = COMPOUND_STRING( @@ -1941,6 +2022,7 @@ const struct Item gItemsInfo[] = "amount of Exp. to\n" "a single PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_LEVEL_UP_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_RareCandy, .effect = gItemEffect_RareCandy, @@ -1951,8 +2033,8 @@ const struct Item gItemsInfo[] = [ITEM_EXP_CANDY_S] = { - .name = _("Exp. Candy S"), - .pluralName = _("Exp. Candies S"), + .name = ITEM_NAME("Exp. Candy S"), + .pluralName = ITEM_PLURAL_NAME("Exp. Candies S"), .price = 240, .holdEffectParam = EXP_800, .description = COMPOUND_STRING( @@ -1960,6 +2042,7 @@ const struct Item gItemsInfo[] = "amount of Exp. to\n" "a single PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_LEVEL_UP_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_RareCandy, .effect = gItemEffect_RareCandy, @@ -1970,8 +2053,8 @@ const struct Item gItemsInfo[] = [ITEM_EXP_CANDY_M] = { - .name = _("Exp. Candy M"), - .pluralName = _("Exp. Candies M"), + .name = ITEM_NAME("Exp. Candy M"), + .pluralName = ITEM_PLURAL_NAME("Exp. Candies M"), .price = 1000, .holdEffectParam = EXP_3000, .description = COMPOUND_STRING( @@ -1979,6 +2062,7 @@ const struct Item gItemsInfo[] = "amount of Exp. to\n" "a single PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_LEVEL_UP_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_RareCandy, .effect = gItemEffect_RareCandy, @@ -1989,8 +2073,8 @@ const struct Item gItemsInfo[] = [ITEM_EXP_CANDY_L] = { - .name = _("Exp. Candy L"), - .pluralName = _("Exp. Candies L"), + .name = ITEM_NAME("Exp. Candy L"), + .pluralName = ITEM_PLURAL_NAME("Exp. Candies L"), .price = 3000, .holdEffectParam = EXP_10000, .description = COMPOUND_STRING( @@ -1998,6 +2082,7 @@ const struct Item gItemsInfo[] = "amount of Exp. to\n" "a single PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_LEVEL_UP_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_RareCandy, .effect = gItemEffect_RareCandy, @@ -2008,8 +2093,8 @@ const struct Item gItemsInfo[] = [ITEM_EXP_CANDY_XL] = { - .name = _("Exp. Candy XL"), - .pluralName = _("Exp. Candies XL"), + .name = ITEM_NAME("Exp. Candy XL"), + .pluralName = ITEM_PLURAL_NAME("Exp. Candies XL"), .price = 10000, .holdEffectParam = EXP_30000, .description = COMPOUND_STRING( @@ -2017,6 +2102,7 @@ const struct Item gItemsInfo[] = "amount of Exp. to\n" "a single PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_LEVEL_UP_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_RareCandy, .effect = gItemEffect_RareCandy, @@ -2027,14 +2113,15 @@ const struct Item gItemsInfo[] = [ITEM_DYNAMAX_CANDY] = { - .name = _("Dynamax Candy"), - .pluralName = _("Dynamax Candies"), + .name = ITEM_NAME("Dynamax Candy"), + .pluralName = ITEM_PLURAL_NAME("Dynamax Candies"), .price = 0, .description = COMPOUND_STRING( "Raises the Dynamax\n" "Level of a single\n" "PokΓ©mon by one."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_LEVEL_UP_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_DynamaxCandy, .flingPower = 30, @@ -2046,7 +2133,7 @@ const struct Item gItemsInfo[] = [ITEM_BLUE_FLUTE] = { - .name = _("Blue Flute"), + .name = ITEM_NAME("Blue Flute"), .price = (I_PRICE >= GEN_7) ? 20 : 100, .description = COMPOUND_STRING( "A glass flute that\n" @@ -2054,6 +2141,7 @@ const struct Item gItemsInfo[] = "PokΓ©mon."), .notConsumed = TRUE, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FLUTE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -2065,7 +2153,7 @@ const struct Item gItemsInfo[] = [ITEM_YELLOW_FLUTE] = { - .name = _("Yellow Flute"), + .name = ITEM_NAME("Yellow Flute"), .price = (I_PRICE >= GEN_7) ? 20 : 300, .description = COMPOUND_STRING( "A glass flute that\n" @@ -2073,6 +2161,7 @@ const struct Item gItemsInfo[] = "out of confusion."), .notConsumed = TRUE, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FLUTE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -2084,7 +2173,7 @@ const struct Item gItemsInfo[] = [ITEM_RED_FLUTE] = { - .name = _("Red Flute"), + .name = ITEM_NAME("Red Flute"), .price = (I_PRICE >= GEN_7) ? 20 : 200, .description = COMPOUND_STRING( "A glass flute that\n" @@ -2092,6 +2181,7 @@ const struct Item gItemsInfo[] = "out of attraction."), .notConsumed = TRUE, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FLUTE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -2105,7 +2195,7 @@ const struct Item gItemsInfo[] = [ITEM_BLACK_FLUTE] = { - .name = _("Black Flute"), + .name = ITEM_NAME("Black Flute"), .price = (I_PRICE >= GEN_7) ? 20 : 400, .holdEffectParam = 50, .description = COMPOUND_STRING( @@ -2114,6 +2204,7 @@ const struct Item gItemsInfo[] = "PokΓ©mon."), .notConsumed = TRUE, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FLUTE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_BlackWhiteFlute, .flingPower = 30, @@ -2123,7 +2214,7 @@ const struct Item gItemsInfo[] = [ITEM_WHITE_FLUTE] = { - .name = _("White Flute"), + .name = ITEM_NAME("White Flute"), .price = (I_PRICE >= GEN_7) ? 20 : 500, .holdEffectParam = 150, .description = COMPOUND_STRING( @@ -2131,6 +2222,7 @@ const struct Item gItemsInfo[] = "lures wild PokΓ©mon."), .notConsumed = TRUE, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FLUTE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_BlackWhiteFlute, .flingPower = 30, @@ -2142,7 +2234,7 @@ const struct Item gItemsInfo[] = [ITEM_REPEL] = { - .name = _("Repel"), + .name = ITEM_NAME("Repel"), .price = (I_PRICE >= GEN_7) ? 400 : 350, .holdEffectParam = 100, .description = COMPOUND_STRING( @@ -2150,6 +2242,7 @@ const struct Item gItemsInfo[] = "PokΓ©mon for 100\n" "steps."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FIELD_USE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_Repel, .flingPower = 30, @@ -2159,7 +2252,7 @@ const struct Item gItemsInfo[] = [ITEM_SUPER_REPEL] = { - .name = _("Super Repel"), + .name = ITEM_NAME("Super Repel"), .price = (I_PRICE >= GEN_7) ? 700 : 500, .holdEffectParam = 200, .description = COMPOUND_STRING( @@ -2167,6 +2260,7 @@ const struct Item gItemsInfo[] = "PokΓ©mon for 200\n" "steps."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FIELD_USE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_Repel, .flingPower = 30, @@ -2176,7 +2270,7 @@ const struct Item gItemsInfo[] = [ITEM_MAX_REPEL] = { - .name = _("Max Repel"), + .name = ITEM_NAME("Max Repel"), .price = (I_PRICE >= GEN_7) ? 900 : 700, .holdEffectParam = 250, .description = COMPOUND_STRING( @@ -2184,6 +2278,7 @@ const struct Item gItemsInfo[] = "PokΓ©mon for 250\n" "steps."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FIELD_USE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_Repel, .flingPower = 30, @@ -2193,7 +2288,7 @@ const struct Item gItemsInfo[] = [ITEM_LURE] = { - .name = _("Lure"), + .name = ITEM_NAME("Lure"), .price = 400, .holdEffectParam = 100, .description = COMPOUND_STRING( @@ -2201,6 +2296,7 @@ const struct Item gItemsInfo[] = "likely to appear\n" "for 100 steps."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FIELD_USE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_Lure, .secondaryId = 0, @@ -2211,7 +2307,7 @@ const struct Item gItemsInfo[] = [ITEM_SUPER_LURE] = { - .name = _("Super Lure"), + .name = ITEM_NAME("Super Lure"), .price = 700, .holdEffectParam = 200, .description = COMPOUND_STRING( @@ -2219,6 +2315,7 @@ const struct Item gItemsInfo[] = "likely to appear\n" "for 200 steps."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FIELD_USE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_Lure, .secondaryId = 0, @@ -2229,7 +2326,7 @@ const struct Item gItemsInfo[] = [ITEM_MAX_LURE] = { - .name = _("Max Lure"), + .name = ITEM_NAME("Max Lure"), .price = 900, .holdEffectParam = 250, .description = COMPOUND_STRING( @@ -2237,6 +2334,7 @@ const struct Item gItemsInfo[] = "likely to appear\n" "for 250 steps."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FIELD_USE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_Lure, .secondaryId = 0, @@ -2247,7 +2345,7 @@ const struct Item gItemsInfo[] = [ITEM_ESCAPE_ROPE] = { - .name = _("Escape Rope"), + .name = ITEM_NAME("Escape Rope"), .description = COMPOUND_STRING( "Use to escape\n" "instantly from a\n" @@ -2259,6 +2357,7 @@ const struct Item gItemsInfo[] = #else .price = (I_PRICE >= GEN_7) ? 1000 : 550, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FIELD_USE, #endif .type = ITEM_USE_FIELD, .fieldUseFunc = ItemUseOutOfBattle_EscapeRope, @@ -2271,7 +2370,7 @@ const struct Item gItemsInfo[] = [ITEM_X_ATTACK] = { - .name = _("X Attack"), + .name = ITEM_NAME("X Attack"), .price = (I_PRICE >= GEN_7) ? 1000 : 500, .holdEffectParam = X_ITEM_STAGES, .description = COMPOUND_STRING( @@ -2285,6 +2384,7 @@ const struct Item gItemsInfo[] = "battle."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_X_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_INCREASE_STAT, @@ -2296,7 +2396,7 @@ const struct Item gItemsInfo[] = [ITEM_X_DEFENSE] = { - .name = _("X Defense"), + .name = ITEM_NAME("X Defense"), .price = (I_PRICE >= GEN_7) ? 2000 : 550, .holdEffectParam = X_ITEM_STAGES, .description = COMPOUND_STRING( @@ -2310,6 +2410,7 @@ const struct Item gItemsInfo[] = "battle."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_X_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_INCREASE_STAT, @@ -2321,7 +2422,7 @@ const struct Item gItemsInfo[] = [ITEM_X_SP_ATK] = { - .name = _("X Sp. Atk"), + .name = ITEM_NAME("X Sp. Atk"), .price = (I_PRICE >= GEN_7) ? 1000 : 350, .holdEffectParam = X_ITEM_STAGES, .description = COMPOUND_STRING( @@ -2335,6 +2436,7 @@ const struct Item gItemsInfo[] = "battle."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_X_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_INCREASE_STAT, @@ -2346,7 +2448,7 @@ const struct Item gItemsInfo[] = [ITEM_X_SP_DEF] = { - .name = _("X Sp. Def"), + .name = ITEM_NAME("X Sp. Def"), .price = (I_PRICE >= GEN_7) ? 2000 : 350, .holdEffectParam = X_ITEM_STAGES, .description = COMPOUND_STRING( @@ -2360,6 +2462,7 @@ const struct Item gItemsInfo[] = "battle."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_X_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_INCREASE_STAT, @@ -2371,7 +2474,7 @@ const struct Item gItemsInfo[] = [ITEM_X_SPEED] = { - .name = _("X Speed"), + .name = ITEM_NAME("X Speed"), .price = (I_PRICE >= GEN_7) ? 1000 : 350, .holdEffectParam = X_ITEM_STAGES, .description = COMPOUND_STRING( @@ -2385,6 +2488,7 @@ const struct Item gItemsInfo[] = "battle."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_X_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_INCREASE_STAT, @@ -2396,8 +2500,8 @@ const struct Item gItemsInfo[] = [ITEM_X_ACCURACY] = { - .name = _("X Accuracy"), - .pluralName = _("X Accuracies"), + .name = ITEM_NAME("X Accuracy"), + .pluralName = ITEM_PLURAL_NAME("X Accuracies"), .price = (I_PRICE >= GEN_7) ? 1000 : 950, .holdEffectParam = X_ITEM_STAGES, .description = COMPOUND_STRING( @@ -2411,6 +2515,7 @@ const struct Item gItemsInfo[] = "during one battle."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_X_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_INCREASE_STAT, @@ -2422,13 +2527,14 @@ const struct Item gItemsInfo[] = [ITEM_DIRE_HIT] = { - .name = _("Dire Hit"), + .name = ITEM_NAME("Dire Hit"), .price = (I_PRICE >= GEN_7) ? 1000 : 650, .description = COMPOUND_STRING( "Raises the\n" "critical-hit ratio\n" "during one battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_X_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_SET_FOCUS_ENERGY, @@ -2440,14 +2546,15 @@ const struct Item gItemsInfo[] = [ITEM_GUARD_SPEC] = { - .name = _("Guard Spec."), - .pluralName = _("Guard Specs."), + .name = ITEM_NAME("Guard Spec."), + .pluralName = ITEM_PLURAL_NAME("Guard Specs."), .price = (I_PRICE >= GEN_7) ? 1500 : 700, .description = COMPOUND_STRING( "Prevents stat\n" "reduction when\n" "used in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_X_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_SET_MIST, @@ -2459,10 +2566,11 @@ const struct Item gItemsInfo[] = [ITEM_POKE_DOLL] = { - .name = _("PokΓ© Doll"), + .name = ITEM_NAME("PokΓ© Doll"), .price = (I_PRICE < GEN_7) ? 1000 : ((I_PRICE == GEN_7) ? 100 : 300), .description = sPokeDollDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_BATTLE_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_ESCAPE, @@ -2473,10 +2581,11 @@ const struct Item gItemsInfo[] = [ITEM_FLUFFY_TAIL] = { - .name = _("Fluffy Tail"), + .name = ITEM_NAME("Fluffy Tail"), .price = (I_PRICE >= GEN_7) ? 100 : 1000, .description = sPokeDollDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_BATTLE_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_ESCAPE, @@ -2487,10 +2596,11 @@ const struct Item gItemsInfo[] = [ITEM_POKE_TOY] = { - .name = _("PokΓ© Toy"), + .name = ITEM_NAME("PokΓ© Toy"), .price = (I_PRICE >= GEN_7) ? 100 : 1000, .description = sPokeDollDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_BATTLE_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_ESCAPE, @@ -2501,14 +2611,15 @@ const struct Item gItemsInfo[] = [ITEM_MAX_MUSHROOMS] = { - .name = _("Max Mushrooms"), - .pluralName = _("Max Mushrooms"), + .name = ITEM_NAME("Max Mushrooms"), + .pluralName = ITEM_PLURAL_NAME("Max Mushrooms"), .price = 8000, .description = COMPOUND_STRING( "Raises every stat\n" "during one battle\n" "by one stage."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_BATTLE_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_INCREASE_ALL_STATS, @@ -2521,13 +2632,14 @@ const struct Item gItemsInfo[] = [ITEM_BOTTLE_CAP] = { - .name = _("Bottle Cap"), + .name = ITEM_NAME("Bottle Cap"), .price = (I_PRICE >= GEN_9) ? 20000 : 5000, .description = COMPOUND_STRING( "A beautiful bottle\n" "cap that gives off\n" "a silver gleam."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2537,13 +2649,14 @@ const struct Item gItemsInfo[] = [ITEM_GOLD_BOTTLE_CAP] = { - .name = _("Gold Bottle Cap"), + .name = ITEM_NAME("Gold Bottle Cap"), .price = (I_PRICE >= GEN_9) ? 60000 : 10000, .description = COMPOUND_STRING( "A beautiful bottle\n" "cap that gives off\n" "a golden gleam."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2553,13 +2666,14 @@ const struct Item gItemsInfo[] = [ITEM_NUGGET] = { - .name = _("Nugget"), + .name = ITEM_NAME("Nugget"), .price = 10000 * TREASURE_FACTOR, .description = COMPOUND_STRING( "A nugget of pure\n" "gold. Can be sold at\n" "a high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2569,13 +2683,14 @@ const struct Item gItemsInfo[] = [ITEM_BIG_NUGGET] = { - .name = _("Big Nugget"), + .name = ITEM_NAME("Big Nugget"), .price = (I_PRICE >= GEN_7) ? (40000 * TREASURE_FACTOR) : 20000, .description = COMPOUND_STRING( "A big nugget made\n" "of gold, sellable\n" "at a high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 130, @@ -2585,13 +2700,14 @@ const struct Item gItemsInfo[] = [ITEM_TINY_MUSHROOM] = { - .name = _("Tiny Mushroom"), + .name = ITEM_NAME("Tiny Mushroom"), .price = 500 * TREASURE_FACTOR, .description = COMPOUND_STRING( "A plain mushroom\n" "that would sell\n" "at a cheap price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2601,10 +2717,11 @@ const struct Item gItemsInfo[] = [ITEM_BIG_MUSHROOM] = { - .name = _("Big Mushroom"), + .name = ITEM_NAME("Big Mushroom"), .price = 5000 * TREASURE_FACTOR, .description = sBigMushroomDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2614,10 +2731,11 @@ const struct Item gItemsInfo[] = [ITEM_BALM_MUSHROOM] = { - .name = _("Balm Mushroom"), + .name = ITEM_NAME("Balm Mushroom"), .price = (I_PRICE >= GEN_7) ? 15000 * TREASURE_FACTOR: 12500, .description = sBigMushroomDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2627,13 +2745,14 @@ const struct Item gItemsInfo[] = [ITEM_PEARL] = { - .name = _("Pearl"), + .name = ITEM_NAME("Pearl"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR: 1400, .description = COMPOUND_STRING( "A pretty pearl\n" "that would sell at a\n" "cheap price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2643,13 +2762,14 @@ const struct Item gItemsInfo[] = [ITEM_BIG_PEARL] = { - .name = _("Big Pearl"), + .name = ITEM_NAME("Big Pearl"), .price = (I_PRICE >= GEN_7) ? 8000 * TREASURE_FACTOR: 7500, .description = COMPOUND_STRING( "A lovely large pearl\n" "that would sell at a\n" "high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2659,13 +2779,14 @@ const struct Item gItemsInfo[] = [ITEM_PEARL_STRING] = { - .name = _("Pearl String"), + .name = ITEM_NAME("Pearl String"), .price = (I_PRICE >= GEN_8) ? 15000 * TREASURE_FACTOR: ((I_PRICE == GEN_7) ? 30000 : 15000), .description = COMPOUND_STRING( "Very large pearls\n" "that would sell at a\n" "high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2675,14 +2796,15 @@ const struct Item gItemsInfo[] = [ITEM_STARDUST] = { - .name = _("Stardust"), - .pluralName = _("Stardust"), + .name = ITEM_NAME("Stardust"), + .pluralName = ITEM_PLURAL_NAME("Stardust"), .price = (I_PRICE >= GEN_7) ? 3000 * TREASURE_FACTOR: 2000, .description = COMPOUND_STRING( "Beautiful red sand.\n" "Can be sold at a\n" "high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2692,13 +2814,14 @@ const struct Item gItemsInfo[] = [ITEM_STAR_PIECE] = { - .name = _("Star Piece"), + .name = ITEM_NAME("Star Piece"), .price = (I_PRICE >= GEN_7) ? 12000 * TREASURE_FACTOR: 9800, .description = COMPOUND_STRING( "A red gem shard.\n" "It would sell for a\n" "very high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2708,13 +2831,14 @@ const struct Item gItemsInfo[] = [ITEM_COMET_SHARD] = { - .name = _("Comet Shard"), + .name = ITEM_NAME("Comet Shard"), .price = (I_PRICE <= GEN_5) ? 0 : ((I_PRICE == GEN_6) ? 30000 : ((I_PRICE == GEN_7) ? 60000 : 25000 * TREASURE_FACTOR)), .description = COMPOUND_STRING( "A comet's shard.\n" "It would sell for a\n" "high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2724,14 +2848,15 @@ const struct Item gItemsInfo[] = [ITEM_SHOAL_SALT] = { - .name = _("Shoal Salt"), - .pluralName = _("Shoal Salt"), + .name = ITEM_NAME("Shoal Salt"), + .pluralName = ITEM_PLURAL_NAME("Shoal Salt"), .price = 20, .description = COMPOUND_STRING( "Salt obtained from\n" "deep inside the\n" "Shoal Cave."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2741,13 +2866,14 @@ const struct Item gItemsInfo[] = [ITEM_SHOAL_SHELL] = { - .name = _("Shoal Shell"), + .name = ITEM_NAME("Shoal Shell"), .price = 20, .description = COMPOUND_STRING( "A seashell found\n" "deep inside the\n" "Shoal Cave."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2757,10 +2883,11 @@ const struct Item gItemsInfo[] = [ITEM_RED_SHARD] = { - .name = _("Red Shard"), + .name = ITEM_NAME("Red Shard"), .price = (I_PRICE >= GEN_7) ? 1000 : 200, .description = sShardsDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2770,10 +2897,11 @@ const struct Item gItemsInfo[] = [ITEM_BLUE_SHARD] = { - .name = _("Blue Shard"), + .name = ITEM_NAME("Blue Shard"), .price = (I_PRICE >= GEN_7) ? 1000 : 200, .description = sShardsDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2783,10 +2911,11 @@ const struct Item gItemsInfo[] = [ITEM_YELLOW_SHARD] = { - .name = _("Yellow Shard"), + .name = ITEM_NAME("Yellow Shard"), .price = (I_PRICE >= GEN_7) ? 1000 : 200, .description = sShardsDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2796,10 +2925,11 @@ const struct Item gItemsInfo[] = [ITEM_GREEN_SHARD] = { - .name = _("Green Shard"), + .name = ITEM_NAME("Green Shard"), .price = (I_PRICE >= GEN_7) ? 1000 : 200, .description = sShardsDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2809,13 +2939,14 @@ const struct Item gItemsInfo[] = [ITEM_HEART_SCALE] = { - .name = _("Heart Scale"), + .name = ITEM_NAME("Heart Scale"), .price = 100, .description = COMPOUND_STRING( "A lovely scale.\n" "It is coveted by\n" "collectors."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2825,14 +2956,15 @@ const struct Item gItemsInfo[] = [ITEM_HONEY] = { - .name = _("Honey"), - .pluralName = _("Honey"), + .name = ITEM_NAME("Honey"), + .pluralName = ITEM_PLURAL_NAME("Honey"), .price = (I_PRICE < GEN_5) ? 100 : ((I_PRICE < GEN_8) ? 300 : 900), .description = COMPOUND_STRING( "Sweet honey that\n" "attracts wild\n" "PokΓ©mon when used."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_FIELD, .fieldUseFunc = ItemUseOutOfBattle_Honey, .flingPower = 30, @@ -2842,13 +2974,14 @@ const struct Item gItemsInfo[] = [ITEM_RARE_BONE] = { - .name = _("Rare Bone"), + .name = ITEM_NAME("Rare Bone"), .price = (I_PRICE >= GEN_7) ? 5000 * TREASURE_FACTOR: 10000, .description = COMPOUND_STRING( "A very rare bone.\n" "It can be sold at\n" "a high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -2858,13 +2991,14 @@ const struct Item gItemsInfo[] = [ITEM_ODD_KEYSTONE] = { - .name = _("Odd Keystone"), + .name = ITEM_NAME("Odd Keystone"), .price = 2100, .description = COMPOUND_STRING( "Voices can be heard\n" "from this odd stone\n" "occasionally."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -2874,13 +3008,14 @@ const struct Item gItemsInfo[] = [ITEM_PRETTY_FEATHER] = { - .name = _("Pretty Feather"), + .name = ITEM_NAME("Pretty Feather"), .price = (I_PRICE >= GEN_7) ? 1000 * TREASURE_FACTOR: 200, .description = COMPOUND_STRING( "A beautiful yet\n" "plain feather that\n" "does nothing."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 20, @@ -2890,13 +3025,14 @@ const struct Item gItemsInfo[] = [ITEM_RELIC_COPPER] = { - .name = _("Relic Copper"), + .name = ITEM_NAME("Relic Copper"), .price = 0, .description = COMPOUND_STRING( "A copper coin used\n" "long ago. It sells\n" "at a high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_RELIC, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2906,13 +3042,14 @@ const struct Item gItemsInfo[] = [ITEM_RELIC_SILVER] = { - .name = _("Relic Silver"), + .name = ITEM_NAME("Relic Silver"), .price = 0, .description = COMPOUND_STRING( "A silver coin used\n" "long ago. It sells\n" "at a high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_RELIC, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2922,13 +3059,14 @@ const struct Item gItemsInfo[] = [ITEM_RELIC_GOLD] = { - .name = _("Relic Gold"), + .name = ITEM_NAME("Relic Gold"), .price = 0, .description = COMPOUND_STRING( "A gold coin used\n" "long ago. It sells\n" "at a high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_RELIC, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2938,13 +3076,14 @@ const struct Item gItemsInfo[] = [ITEM_RELIC_VASE] = { - .name = _("Relic Vase"), + .name = ITEM_NAME("Relic Vase"), .price = 0, .description = COMPOUND_STRING( "A vase made long\n" "ago. It sells at\n" "a high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_RELIC, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2954,13 +3093,14 @@ const struct Item gItemsInfo[] = [ITEM_RELIC_BAND] = { - .name = _("Relic Band"), + .name = ITEM_NAME("Relic Band"), .price = 0, .description = COMPOUND_STRING( "An old bracelet.\n" "It sells at a\n" "high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_RELIC, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2970,13 +3110,14 @@ const struct Item gItemsInfo[] = [ITEM_RELIC_STATUE] = { - .name = _("Relic Statue"), + .name = ITEM_NAME("Relic Statue"), .price = 0, .description = COMPOUND_STRING( "An old statue.\n" "It sells at a\n" "high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_RELIC, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2986,13 +3127,14 @@ const struct Item gItemsInfo[] = [ITEM_RELIC_CROWN] = { - .name = _("Relic Crown"), + .name = ITEM_NAME("Relic Crown"), .price = 0, .description = COMPOUND_STRING( "An old crown.\n" "It sells at a\n" "high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_RELIC, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -3002,13 +3144,14 @@ const struct Item gItemsInfo[] = [ITEM_STRANGE_SOUVENIR] = { - .name = _("Strange Souvenir"), + .name = ITEM_NAME("Strange Souvenir"), .price = (I_PRICE >= GEN_7) ? 3000 : 10, .description = COMPOUND_STRING( "An ornament that\n" "depicts a PokΓ©mon\n" "from Alola."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_RELIC, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -3020,7 +3163,7 @@ const struct Item gItemsInfo[] = [ITEM_HELIX_FOSSIL] = { - .name = _("Helix Fossil"), + .name = ITEM_NAME("Helix Fossil"), .description = COMPOUND_STRING( "A piece of an\n" "ancient marine\n" @@ -3028,6 +3171,7 @@ const struct Item gItemsInfo[] = #if I_KEY_FOSSILS >= GEN_4 .price = (I_PRICE >= GEN_7) ? 7000: 1000, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, #else .price = 0, .importance = 1, @@ -3042,7 +3186,7 @@ const struct Item gItemsInfo[] = [ITEM_DOME_FOSSIL] = { - .name = _("Dome Fossil"), + .name = ITEM_NAME("Dome Fossil"), .description = COMPOUND_STRING( "A piece of an\n" "ancient marine\n" @@ -3050,6 +3194,7 @@ const struct Item gItemsInfo[] = #if I_KEY_FOSSILS >= GEN_4 .price = (I_PRICE >= GEN_7) ? 7000: 1000, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, #else .price = 0, .importance = 1, @@ -3064,7 +3209,7 @@ const struct Item gItemsInfo[] = [ITEM_OLD_AMBER] = { - .name = _("Old Amber"), + .name = ITEM_NAME("Old Amber"), .description = COMPOUND_STRING( "A stone containing\n" "the genes of an\n" @@ -3072,6 +3217,7 @@ const struct Item gItemsInfo[] = #if I_KEY_FOSSILS >= GEN_4 .price = 1000, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, #else .price = 0, .importance = 1, @@ -3086,11 +3232,12 @@ const struct Item gItemsInfo[] = [ITEM_ROOT_FOSSIL] = { - .name = _("Root Fossil"), + .name = ITEM_NAME("Root Fossil"), .description = sRootFossilDesc, #if I_KEY_FOSSILS >= GEN_4 .price = (I_PRICE >= GEN_7) ? 7000: 1000, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, #else .price = 0, .importance = 1, @@ -3105,11 +3252,12 @@ const struct Item gItemsInfo[] = [ITEM_CLAW_FOSSIL] = { - .name = _("Claw Fossil"), + .name = ITEM_NAME("Claw Fossil"), .description = sRootFossilDesc, #if I_KEY_FOSSILS >= GEN_4 .price = (I_PRICE >= GEN_7) ? 7000: 1000, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, #else .price = 0, .importance = 1, @@ -3124,13 +3272,14 @@ const struct Item gItemsInfo[] = [ITEM_ARMOR_FOSSIL] = { - .name = _("Armor Fossil"), + .name = ITEM_NAME("Armor Fossil"), .price = (I_PRICE >= GEN_7) ? 7000: 1000, .description = COMPOUND_STRING( "A piece of a\n" "prehistoric PokΓ©-\n" "mon's head."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3140,13 +3289,14 @@ const struct Item gItemsInfo[] = [ITEM_SKULL_FOSSIL] = { - .name = _("Skull Fossil"), + .name = ITEM_NAME("Skull Fossil"), .price = (I_PRICE >= GEN_7) ? 7000: 1000, .description = COMPOUND_STRING( "A piece of a\n" "prehistoric PokΓ©-\n" "mon's collar."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3156,13 +3306,14 @@ const struct Item gItemsInfo[] = [ITEM_COVER_FOSSIL] = { - .name = _("Cover Fossil"), + .name = ITEM_NAME("Cover Fossil"), .price = (I_PRICE >= GEN_7) ? 7000: 1000, .description = COMPOUND_STRING( "A piece of a\n" "prehistoric PokΓ©-\n" "mon's back."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3172,13 +3323,14 @@ const struct Item gItemsInfo[] = [ITEM_PLUME_FOSSIL] = { - .name = _("Plume Fossil"), + .name = ITEM_NAME("Plume Fossil"), .price = (I_PRICE >= GEN_7) ? 7000: 1000, .description = COMPOUND_STRING( "A piece of a\n" "prehistoric PokΓ©-\n" "mon's wing."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3188,13 +3340,14 @@ const struct Item gItemsInfo[] = [ITEM_JAW_FOSSIL] = { - .name = _("Jaw Fossil"), + .name = ITEM_NAME("Jaw Fossil"), .price = (I_PRICE >= GEN_7) ? 7000: 1000, .description = COMPOUND_STRING( "A piece of a\n" "prehistoric PokΓ©-\n" "mon's large jaw."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3204,13 +3357,14 @@ const struct Item gItemsInfo[] = [ITEM_SAIL_FOSSIL] = { - .name = _("Sail Fossil"), + .name = ITEM_NAME("Sail Fossil"), .price = (I_PRICE >= GEN_7) ? 7000: 1000, .description = COMPOUND_STRING( "A piece of a\n" "prehistoric PokΓ©-\n" "mon's skin sail."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3220,13 +3374,14 @@ const struct Item gItemsInfo[] = [ITEM_FOSSILIZED_BIRD] = { - .name = _("Fossilized Bird"), + .name = ITEM_NAME("Fossilized Bird"), .price = 5000, .description = COMPOUND_STRING( "A fossil of an\n" "ancient, sky-\n" "soaring PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3236,11 +3391,12 @@ const struct Item gItemsInfo[] = [ITEM_FOSSILIZED_FISH] = { - .name = _("Fossilized Fish"), - .pluralName = _("Fossilized Fishes"), + .name = ITEM_NAME("Fossilized Fish"), + .pluralName = ITEM_PLURAL_NAME("Fossilized Fishes"), .price = 5000, .description = sFossilizedFishDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3250,13 +3406,14 @@ const struct Item gItemsInfo[] = [ITEM_FOSSILIZED_DRAKE] = { - .name = _("Fossilized Drake"), + .name = ITEM_NAME("Fossilized Drake"), .price = 5000, .description = COMPOUND_STRING( "A fossil of an\n" "ancient, land-\n" "roaming PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3266,10 +3423,11 @@ const struct Item gItemsInfo[] = [ITEM_FOSSILIZED_DINO] = { - .name = _("Fossilized Dino"), + .name = ITEM_NAME("Fossilized Dino"), .price = 5000, .description = sFossilizedFishDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3281,8 +3439,8 @@ const struct Item gItemsInfo[] = [ITEM_GROWTH_MULCH] = { - .name = _("Growth Mulch"), - .pluralName = _("Growth Mulch"), + .name = ITEM_NAME("Growth Mulch"), + .pluralName = ITEM_PLURAL_NAME("Growth Mulch"), .price = 200, #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( @@ -3293,6 +3451,7 @@ const struct Item gItemsInfo[] = .description = sGenericMulchDesc, #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = ITEM_TO_MULCH(ITEM_GROWTH_MULCH), @@ -3303,8 +3462,8 @@ const struct Item gItemsInfo[] = [ITEM_DAMP_MULCH] = { - .name = _("Damp Mulch"), - .pluralName = _("Damp Mulch"), + .name = ITEM_NAME("Damp Mulch"), + .pluralName = ITEM_PLURAL_NAME("Damp Mulch"), .price = 200, #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( @@ -3315,6 +3474,7 @@ const struct Item gItemsInfo[] = .description = sGenericMulchDesc, #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = ITEM_TO_MULCH(ITEM_DAMP_MULCH), @@ -3325,8 +3485,8 @@ const struct Item gItemsInfo[] = [ITEM_STABLE_MULCH] = { - .name = _("Stable Mulch"), - .pluralName = _("Stable Mulch"), + .name = ITEM_NAME("Stable Mulch"), + .pluralName = ITEM_PLURAL_NAME("Stable Mulch"), .price = 200, #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( @@ -3337,6 +3497,7 @@ const struct Item gItemsInfo[] = .description = sGenericMulchDesc, #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = ITEM_TO_MULCH(ITEM_STABLE_MULCH), @@ -3347,8 +3508,8 @@ const struct Item gItemsInfo[] = [ITEM_GOOEY_MULCH] = { - .name = _("Gooey Mulch"), - .pluralName = _("Gooey Mulch"), + .name = ITEM_NAME("Gooey Mulch"), + .pluralName = ITEM_PLURAL_NAME("Gooey Mulch"), .price = 200, #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( @@ -3359,6 +3520,7 @@ const struct Item gItemsInfo[] = .description = sGenericMulchDesc, #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = ITEM_TO_MULCH(ITEM_GOOEY_MULCH), @@ -3369,8 +3531,8 @@ const struct Item gItemsInfo[] = [ITEM_RICH_MULCH] = { - .name = _("Rich Mulch"), - .pluralName = _("Rich Mulch"), + .name = ITEM_NAME("Rich Mulch"), + .pluralName = ITEM_PLURAL_NAME("Rich Mulch"), .price = 200, #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( @@ -3381,6 +3543,7 @@ const struct Item gItemsInfo[] = .description = sGenericMulchDesc, #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = ITEM_TO_MULCH(ITEM_RICH_MULCH), @@ -3391,8 +3554,8 @@ const struct Item gItemsInfo[] = [ITEM_SURPRISE_MULCH] = { - .name = _("Surprise Mulch"), - .pluralName = _("Surprise Mulch"), + .name = ITEM_NAME("Surprise Mulch"), + .pluralName = ITEM_PLURAL_NAME("Surprise Mulch"), .price = 200, #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( @@ -3403,6 +3566,7 @@ const struct Item gItemsInfo[] = .description = sGenericMulchDesc, #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = ITEM_TO_MULCH(ITEM_SURPRISE_MULCH), @@ -3413,8 +3577,8 @@ const struct Item gItemsInfo[] = [ITEM_BOOST_MULCH] = { - .name = _("Boost Mulch"), - .pluralName = _("Boost Mulch"), + .name = ITEM_NAME("Boost Mulch"), + .pluralName = ITEM_PLURAL_NAME("Boost Mulch"), .price = 200, #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( @@ -3425,6 +3589,7 @@ const struct Item gItemsInfo[] = .description = sGenericMulchDesc, #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = ITEM_TO_MULCH(ITEM_BOOST_MULCH), @@ -3435,8 +3600,8 @@ const struct Item gItemsInfo[] = [ITEM_AMAZE_MULCH] = { - .name = _("Amaze Mulch"), - .pluralName = _("Amaze Mulch"), + .name = ITEM_NAME("Amaze Mulch"), + .pluralName = ITEM_PLURAL_NAME("Amaze Mulch"), .price = 200, #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( @@ -3447,6 +3612,7 @@ const struct Item gItemsInfo[] = .description = sGenericMulchDesc, #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = ITEM_TO_MULCH(ITEM_AMAZE_MULCH), @@ -3459,13 +3625,14 @@ const struct Item gItemsInfo[] = [ITEM_RED_APRICORN] = { - .name = _("Red Apricorn"), + .name = ITEM_NAME("Red Apricorn"), .price = (I_PRICE == GEN_4) ? 0 : ((I_PRICE >= GEN_5 && I_PRICE <= GEN_7) ? 20 : 200), .description = COMPOUND_STRING( "A red apricorn.\n" "It assails your\n" "nostrils."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_RedApricorn, @@ -3474,13 +3641,14 @@ const struct Item gItemsInfo[] = [ITEM_BLUE_APRICORN] = { - .name = _("Blue Apricorn"), + .name = ITEM_NAME("Blue Apricorn"), .price = (I_PRICE == GEN_4) ? 0 : ((I_PRICE >= GEN_5 && I_PRICE <= GEN_7) ? 20 : 200), .description = COMPOUND_STRING( "A blue apricorn.\n" "It smells a bit\n" "like grass."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_BlueApricorn, @@ -3489,13 +3657,14 @@ const struct Item gItemsInfo[] = [ITEM_YELLOW_APRICORN] = { - .name = _("Yellow Apricorn"), + .name = ITEM_NAME("Yellow Apricorn"), .price = (I_PRICE == GEN_4) ? 0 : ((I_PRICE >= GEN_5 && I_PRICE <= GEN_7) ? 20 : 200), .description = COMPOUND_STRING( "A yellow apricorn.\n" "It has an invigor-\n" "ating scent."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_YellowApricorn, @@ -3504,13 +3673,14 @@ const struct Item gItemsInfo[] = [ITEM_GREEN_APRICORN] = { - .name = _("Green Apricorn"), + .name = ITEM_NAME("Green Apricorn"), .price = (I_PRICE == GEN_4) ? 0 : ((I_PRICE >= GEN_5 && I_PRICE <= GEN_7) ? 20 : 200), .description = COMPOUND_STRING( "A green apricorn.\n" "It has a strange,\n" "aromatic scent."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_GreenApricorn, @@ -3519,13 +3689,14 @@ const struct Item gItemsInfo[] = [ITEM_PINK_APRICORN] = { - .name = _("Pink Apricorn"), + .name = ITEM_NAME("Pink Apricorn"), .price = (I_PRICE == GEN_4) ? 0 : ((I_PRICE >= GEN_5 && I_PRICE <= GEN_7) ? 20 : 200), .description = COMPOUND_STRING( "A pink apricorn.\n" "It has a nice,\n" "sweet scent."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_PinkApricorn, @@ -3534,13 +3705,14 @@ const struct Item gItemsInfo[] = [ITEM_WHITE_APRICORN] = { - .name = _("White Apricorn"), + .name = ITEM_NAME("White Apricorn"), .price = (I_PRICE == GEN_4) ? 0 : ((I_PRICE >= GEN_5 && I_PRICE <= GEN_7) ? 20 : 200), .description = COMPOUND_STRING( "A white apricorn.\n" "It doesn't smell\n" "like anything."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_WhiteApricorn, @@ -3549,13 +3721,14 @@ const struct Item gItemsInfo[] = [ITEM_BLACK_APRICORN] = { - .name = _("Black Apricorn"), + .name = ITEM_NAME("Black Apricorn"), .price = (I_PRICE == GEN_4) ? 0 : ((I_PRICE >= GEN_5 && I_PRICE <= GEN_7) ? 20 : 200), .description = COMPOUND_STRING( "A black apricorn.\n" "It has an inde-\n" "scribable scent."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_BlackApricorn, @@ -3564,13 +3737,14 @@ const struct Item gItemsInfo[] = [ITEM_WISHING_PIECE] = { - .name = _("Wishing Piece"), + .name = ITEM_NAME("Wishing Piece"), .price = 20, .description = COMPOUND_STRING( "Throw into a\n" "{PKMN} Den to attract\n" "Dynamax PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, // Todo .flingPower = 50, @@ -3580,13 +3754,14 @@ const struct Item gItemsInfo[] = [ITEM_GALARICA_TWIG] = { - .name = _("Galarica Twig"), + .name = ITEM_NAME("Galarica Twig"), .price = 20 * TREASURE_FACTOR, .description = COMPOUND_STRING( "A twig from a tree\n" "in Galar called\n" "Galarica."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -3596,14 +3771,15 @@ const struct Item gItemsInfo[] = [ITEM_ARMORITE_ORE] = { - .name = _("Armorite Ore"), - .pluralName = _("Armorite Ore"), + .name = ITEM_NAME("Armorite Ore"), + .pluralName = ITEM_PLURAL_NAME("Armorite Ore"), .price = 20, .description = COMPOUND_STRING( "A rare ore. Can be\n" "found in the Isle\n" "of Armor at Galar."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -3613,14 +3789,15 @@ const struct Item gItemsInfo[] = [ITEM_DYNITE_ORE] = { - .name = _("Dynite Ore"), - .pluralName = _("Dynite Ore"), + .name = ITEM_NAME("Dynite Ore"), + .pluralName = ITEM_PLURAL_NAME("Dynite Ore"), .price = 20, .description = COMPOUND_STRING( "A mysterious ore.\n" "It can be found in\n" "Galar's Max Lair."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -3632,14 +3809,15 @@ const struct Item gItemsInfo[] = [ITEM_ORANGE_MAIL] = { - .name = _("Orange Mail"), - .pluralName = _("Orange Mail"), + .name = ITEM_NAME("Orange Mail"), + .pluralName = ITEM_PLURAL_NAME("Orange Mail"), .price = 50, .description = COMPOUND_STRING( "A Zigzagoon-print\n" "Mail to be held by\n" "a PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_ORANGE_MAIL), @@ -3649,14 +3827,15 @@ const struct Item gItemsInfo[] = [ITEM_HARBOR_MAIL] = { - .name = _("Harbor Mail"), - .pluralName = _("Harbor Mail"), + .name = ITEM_NAME("Harbor Mail"), + .pluralName = ITEM_PLURAL_NAME("Harbor Mail"), .price = 50, .description = COMPOUND_STRING( "A Wingull-print\n" "Mail to be held by\n" "a PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_HARBOR_MAIL), @@ -3666,14 +3845,15 @@ const struct Item gItemsInfo[] = [ITEM_GLITTER_MAIL] = { - .name = _("Glitter Mail"), - .pluralName = _("Glitter Mail"), + .name = ITEM_NAME("Glitter Mail"), + .pluralName = ITEM_PLURAL_NAME("Glitter Mail"), .price = 50, .description = COMPOUND_STRING( "A Pikachu-print\n" "Mail to be held by\n" "a PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_GLITTER_MAIL), @@ -3683,14 +3863,15 @@ const struct Item gItemsInfo[] = [ITEM_MECH_MAIL] = { - .name = _("Mech Mail"), - .pluralName = _("Mech Mail"), + .name = ITEM_NAME("Mech Mail"), + .pluralName = ITEM_PLURAL_NAME("Mech Mail"), .price = 50, .description = COMPOUND_STRING( "A Magnemite-print\n" "Mail to be held by\n" "a PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_MECH_MAIL), @@ -3700,14 +3881,15 @@ const struct Item gItemsInfo[] = [ITEM_WOOD_MAIL] = { - .name = _("Wood Mail"), - .pluralName = _("Wood Mail"), + .name = ITEM_NAME("Wood Mail"), + .pluralName = ITEM_PLURAL_NAME("Wood Mail"), .price = 50, .description = COMPOUND_STRING( "A Slakoth-print\n" "Mail to be held by\n" "a PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_WOOD_MAIL), @@ -3717,14 +3899,15 @@ const struct Item gItemsInfo[] = [ITEM_WAVE_MAIL] = { - .name = _("Wave Mail"), - .pluralName = _("Wave Mail"), + .name = ITEM_NAME("Wave Mail"), + .pluralName = ITEM_PLURAL_NAME("Wave Mail"), .price = 50, .description = COMPOUND_STRING( "A Wailmer-print\n" "Mail to be held by\n" "a PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_WAVE_MAIL), @@ -3734,11 +3917,12 @@ const struct Item gItemsInfo[] = [ITEM_BEAD_MAIL] = { - .name = _("Bead Mail"), - .pluralName = _("Bead Mail"), + .name = ITEM_NAME("Bead Mail"), + .pluralName = ITEM_PLURAL_NAME("Bead Mail"), .price = 50, .description = sBeadMailDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_BEAD_MAIL), @@ -3748,14 +3932,15 @@ const struct Item gItemsInfo[] = [ITEM_SHADOW_MAIL] = { - .name = _("Shadow Mail"), - .pluralName = _("Shadow Mail"), + .name = ITEM_NAME("Shadow Mail"), + .pluralName = ITEM_PLURAL_NAME("Shadow Mail"), .price = 50, .description = COMPOUND_STRING( "A Duskull-print\n" "Mail to be held by\n" "a PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_SHADOW_MAIL), @@ -3765,14 +3950,15 @@ const struct Item gItemsInfo[] = [ITEM_TROPIC_MAIL] = { - .name = _("Tropic Mail"), - .pluralName = _("Tropic Mail"), + .name = ITEM_NAME("Tropic Mail"), + .pluralName = ITEM_PLURAL_NAME("Tropic Mail"), .price = 50, .description = COMPOUND_STRING( "A Bellossom-print\n" "Mail to be held by\n" "a PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_TROPIC_MAIL), @@ -3782,11 +3968,12 @@ const struct Item gItemsInfo[] = [ITEM_DREAM_MAIL] = { - .name = _("Dream Mail"), - .pluralName = _("Dream Mail"), + .name = ITEM_NAME("Dream Mail"), + .pluralName = ITEM_PLURAL_NAME("Dream Mail"), .price = 50, .description = sBeadMailDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_DREAM_MAIL), @@ -3796,14 +3983,15 @@ const struct Item gItemsInfo[] = [ITEM_FAB_MAIL] = { - .name = _("Fab Mail"), - .pluralName = _("Fab Mail"), + .name = ITEM_NAME("Fab Mail"), + .pluralName = ITEM_PLURAL_NAME("Fab Mail"), .price = 50, .description = COMPOUND_STRING( "A gorgeous-print\n" "Mail to be held\n" "by a PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_FAB_MAIL), @@ -3813,14 +4001,15 @@ const struct Item gItemsInfo[] = [ITEM_RETRO_MAIL] = { - .name = _("Retro Mail"), - .pluralName = _("Retro Mail"), + .name = ITEM_NAME("Retro Mail"), + .pluralName = ITEM_PLURAL_NAME("Retro Mail"), .price = 50, .description = COMPOUND_STRING( "Mail featuring the\n" "drawings of three\n" "PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_RETRO_MAIL), @@ -3832,10 +4021,11 @@ const struct Item gItemsInfo[] = [ITEM_FIRE_STONE] = { - .name = _("Fire Stone"), + .name = ITEM_NAME("Fire Stone"), .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_STONE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -3846,10 +4036,11 @@ const struct Item gItemsInfo[] = [ITEM_WATER_STONE] = { - .name = _("Water Stone"), + .name = ITEM_NAME("Water Stone"), .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_STONE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -3860,10 +4051,11 @@ const struct Item gItemsInfo[] = [ITEM_THUNDER_STONE] = { - .name = _("Thunder Stone"), + .name = ITEM_NAME("Thunder Stone"), .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_STONE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -3874,10 +4066,11 @@ const struct Item gItemsInfo[] = [ITEM_LEAF_STONE] = { - .name = _("Leaf Stone"), + .name = ITEM_NAME("Leaf Stone"), .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_STONE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -3888,10 +4081,11 @@ const struct Item gItemsInfo[] = [ITEM_ICE_STONE] = { - .name = _("Ice Stone"), + .name = ITEM_NAME("Ice Stone"), .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_STONE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -3902,10 +4096,11 @@ const struct Item gItemsInfo[] = [ITEM_SUN_STONE] = { - .name = _("Sun Stone"), + .name = ITEM_NAME("Sun Stone"), .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_STONE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -3916,10 +4111,11 @@ const struct Item gItemsInfo[] = [ITEM_MOON_STONE] = { - .name = _("Moon Stone"), + .name = ITEM_NAME("Moon Stone"), .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_STONE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -3930,10 +4126,11 @@ const struct Item gItemsInfo[] = [ITEM_SHINY_STONE] = { - .name = _("Shiny Stone"), + .name = ITEM_NAME("Shiny Stone"), .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_STONE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -3944,10 +4141,11 @@ const struct Item gItemsInfo[] = [ITEM_DUSK_STONE] = { - .name = _("Dusk Stone"), + .name = ITEM_NAME("Dusk Stone"), .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_STONE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -3958,10 +4156,11 @@ const struct Item gItemsInfo[] = [ITEM_DAWN_STONE] = { - .name = _("Dawn Stone"), + .name = ITEM_NAME("Dawn Stone"), .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_STONE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -3972,13 +4171,14 @@ const struct Item gItemsInfo[] = [ITEM_SWEET_APPLE] = { - .name = _("Sweet Apple"), + .name = ITEM_NAME("Sweet Apple"), .price = 2200, .description = COMPOUND_STRING( "A very sweet apple\n" "that makes certain\n" "PokΓ©mon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -3989,13 +4189,14 @@ const struct Item gItemsInfo[] = [ITEM_TART_APPLE] = { - .name = _("Tart Apple"), + .name = ITEM_NAME("Tart Apple"), .price = 2200, .description = COMPOUND_STRING( "A very tart apple\n" "that makes certain\n" "PokΓ©mon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -4006,13 +4207,14 @@ const struct Item gItemsInfo[] = [ITEM_CRACKED_POT] = { - .name = _("Cracked Pot"), + .name = ITEM_NAME("Cracked Pot"), .price = 1600, .description = COMPOUND_STRING( "A cracked teapot\n" "that makes certain\n" "PokΓ©mon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -4023,13 +4225,14 @@ const struct Item gItemsInfo[] = [ITEM_CHIPPED_POT] = { - .name = _("Chipped Pot"), + .name = ITEM_NAME("Chipped Pot"), .price = 38000, .description = COMPOUND_STRING( "A chipped teapot\n" "that makes certain\n" "PokΓ©mon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -4040,13 +4243,14 @@ const struct Item gItemsInfo[] = [ITEM_GALARICA_CUFF] = { - .name = _("Galarica Cuff"), + .name = ITEM_NAME("Galarica Cuff"), .price = (I_PRICE >= GEN_9) ? 3000 : 6000, .description = COMPOUND_STRING( "A cuff from Galar\n" "that makes certain\n" "PokΓ©mon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -4057,14 +4261,15 @@ const struct Item gItemsInfo[] = [ITEM_GALARICA_WREATH] = { - .name = _("Galarica Wreath"), - .pluralName = _("Galarica Wreathes"), + .name = ITEM_NAME("Galarica Wreath"), + .pluralName = ITEM_PLURAL_NAME("Galarica Wreathes"), .price = (I_PRICE >= GEN_9) ? 3000 : 6000, .description = COMPOUND_STRING( "A wreath made in\n" "Galar. Makes some\n" "PokΓ©mon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -4075,7 +4280,7 @@ const struct Item gItemsInfo[] = [ITEM_DRAGON_SCALE] = { - .name = _("Dragon Scale"), + .name = ITEM_NAME("Dragon Scale"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR : 2100, .holdEffect = HOLD_EFFECT_DRAGON_SCALE, .holdEffectParam = 10, @@ -4084,6 +4289,7 @@ const struct Item gItemsInfo[] = "held by Dragon-\n" "type PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -4094,13 +4300,14 @@ const struct Item gItemsInfo[] = [ITEM_UPGRADE] = { - .name = _("Upgrade"), + .name = ITEM_NAME("Upgrade"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR : 2100, .holdEffect = HOLD_EFFECT_UPGRADE, .description = COMPOUND_STRING( "A peculiar box made\n" "by Silph Co."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -4111,13 +4318,14 @@ const struct Item gItemsInfo[] = [ITEM_PROTECTOR] = { - .name = _("Protector"), + .name = ITEM_NAME("Protector"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR : 2100, .description = COMPOUND_STRING( "Loved by a certain\n" "PokΓ©mon. It's stiff\n" "and heavy."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -4128,13 +4336,14 @@ const struct Item gItemsInfo[] = [ITEM_ELECTIRIZER] = { - .name = _("Electirizer"), + .name = ITEM_NAME("Electirizer"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR : 2100, .description = COMPOUND_STRING( "Loved by a certain\n" "PokΓ©mon. It's full\n" "of electric energy."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -4145,13 +4354,14 @@ const struct Item gItemsInfo[] = [ITEM_MAGMARIZER] = { - .name = _("Magmarizer"), + .name = ITEM_NAME("Magmarizer"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR : 2100, .description = COMPOUND_STRING( "Loved by a certain\n" "PokΓ©mon. It's full\n" "of magma energy."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -4162,13 +4372,14 @@ const struct Item gItemsInfo[] = [ITEM_DUBIOUS_DISC] = { - .name = _("Dubious Disc"), + .name = ITEM_NAME("Dubious Disc"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR : 2100, .description = COMPOUND_STRING( "A clear device\n" "overflowing with\n" "dubious data."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -4179,14 +4390,15 @@ const struct Item gItemsInfo[] = [ITEM_REAPER_CLOTH] = { - .name = _("Reaper Cloth"), - .pluralName = _("Reaper Cloths"), + .name = ITEM_NAME("Reaper Cloth"), + .pluralName = ITEM_PLURAL_NAME("Reaper Cloths"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR : 2100, .description = COMPOUND_STRING( "Loved by a certain\n" "PokΓ©mon. Imbued\n" "with spirit energy."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -4197,13 +4409,14 @@ const struct Item gItemsInfo[] = [ITEM_PRISM_SCALE] = { - .name = _("Prism Scale"), + .name = ITEM_NAME("Prism Scale"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 2000 : 500), .description = COMPOUND_STRING( "A mysterious scale\n" "that evolves a\n" "certain PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -4214,14 +4427,15 @@ const struct Item gItemsInfo[] = [ITEM_WHIPPED_DREAM] = { - .name = _("Whipped Dream"), - .pluralName = _("Whipped Dream"), + .name = ITEM_NAME("Whipped Dream"), + .pluralName = ITEM_PLURAL_NAME("Whipped Dream"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR : 2100, .description = COMPOUND_STRING( "A soft and sweet\n" "treat loved by\n" "a certain PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -4232,13 +4446,14 @@ const struct Item gItemsInfo[] = [ITEM_SACHET] = { - .name = _("Sachet"), + .name = ITEM_NAME("Sachet"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR : 2100, .description = COMPOUND_STRING( "A sachet of strong\n" "perfumes, loved by\n" "a certain PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -4249,13 +4464,14 @@ const struct Item gItemsInfo[] = [ITEM_OVAL_STONE] = { - .name = _("Oval Stone"), + .name = ITEM_NAME("Oval Stone"), .price = (I_PRICE >= GEN_7) ? 2000 : 2100, .description = COMPOUND_STRING( "Peculiar stone\n" "that evolves a\n" "certain PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -4266,13 +4482,14 @@ const struct Item gItemsInfo[] = [ITEM_STRAWBERRY_SWEET] = { - .name = _("Strawberry Sweet"), + .name = ITEM_NAME("Strawberry Sweet"), .price = 500 * TREASURE_FACTOR, .description = COMPOUND_STRING( "Strawberry-shaped\n" "sweet loved by\n" "Milcery."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -4282,13 +4499,14 @@ const struct Item gItemsInfo[] = [ITEM_LOVE_SWEET] = { - .name = _("Love Sweet"), + .name = ITEM_NAME("Love Sweet"), .price = 500 * TREASURE_FACTOR, .description = COMPOUND_STRING( "A heart-shaped\n" "sweet loved by\n" "Milcery."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -4298,13 +4516,14 @@ const struct Item gItemsInfo[] = [ITEM_BERRY_SWEET] = { - .name = _("Berry Sweet"), + .name = ITEM_NAME("Berry Sweet"), .price = 500 * TREASURE_FACTOR, .description = COMPOUND_STRING( "A berry-shaped\n" "sweet loved by\n" "Milcery."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -4314,13 +4533,14 @@ const struct Item gItemsInfo[] = [ITEM_CLOVER_SWEET] = { - .name = _("Clover Sweet"), + .name = ITEM_NAME("Clover Sweet"), .price = 500 * TREASURE_FACTOR, .description = COMPOUND_STRING( "A clover-shaped\n" "sweet loved by\n" "Milcery."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -4330,13 +4550,14 @@ const struct Item gItemsInfo[] = [ITEM_FLOWER_SWEET] = { - .name = _("Flower Sweet"), + .name = ITEM_NAME("Flower Sweet"), .price = 500 * TREASURE_FACTOR, .description = COMPOUND_STRING( "A flower-shaped\n" "sweet loved by\n" "Milcery."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -4346,13 +4567,14 @@ const struct Item gItemsInfo[] = [ITEM_STAR_SWEET] = { - .name = _("Star Sweet"), + .name = ITEM_NAME("Star Sweet"), .price = 500 * TREASURE_FACTOR, .description = COMPOUND_STRING( "A star-shaped\n" "sweet loved by\n" "Milcery."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -4362,13 +4584,14 @@ const struct Item gItemsInfo[] = [ITEM_RIBBON_SWEET] = { - .name = _("Ribbon Sweet"), + .name = ITEM_NAME("Ribbon Sweet"), .price = 500 * TREASURE_FACTOR, .description = COMPOUND_STRING( "A ribbon-shaped\n" "sweet loved by\n" "Milcery."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -4378,7 +4601,7 @@ const struct Item gItemsInfo[] = [ITEM_EVERSTONE] = { - .name = _("Everstone"), + .name = ITEM_NAME("Everstone"), .price = (I_PRICE >= GEN_7) ? 3000 : 200, .holdEffect = HOLD_EFFECT_PREVENT_EVOLVE, .description = COMPOUND_STRING( @@ -4386,6 +4609,7 @@ const struct Item gItemsInfo[] = "item that prevents\n" "evolution."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -4397,11 +4621,12 @@ const struct Item gItemsInfo[] = [ITEM_RED_NECTAR] = { - .name = _("Red Nectar"), + .name = ITEM_NAME("Red Nectar"), .price = 300, .holdEffectParam = 0, .description = sNectarDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NECTAR, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_FormChange_ConsumedOnUse, .flingPower = 10, @@ -4411,11 +4636,12 @@ const struct Item gItemsInfo[] = [ITEM_YELLOW_NECTAR] = { - .name = _("Yellow Nectar"), + .name = ITEM_NAME("Yellow Nectar"), .price = 300, .holdEffectParam = 0, .description = sNectarDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NECTAR, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_FormChange_ConsumedOnUse, .flingPower = 10, @@ -4425,11 +4651,12 @@ const struct Item gItemsInfo[] = [ITEM_PINK_NECTAR] = { - .name = _("Pink Nectar"), + .name = ITEM_NAME("Pink Nectar"), .price = 300, .holdEffectParam = 0, .description = sNectarDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NECTAR, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_FormChange_ConsumedOnUse, .flingPower = 10, @@ -4439,11 +4666,12 @@ const struct Item gItemsInfo[] = [ITEM_PURPLE_NECTAR] = { - .name = _("Purple Nectar"), + .name = ITEM_NAME("Purple Nectar"), .price = 300, .holdEffectParam = 0, .description = sNectarDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NECTAR, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_FormChange_ConsumedOnUse, .flingPower = 10, @@ -4455,7 +4683,7 @@ const struct Item gItemsInfo[] = [ITEM_FLAME_PLATE] = { - .name = _("Flame Plate"), + .name = ITEM_NAME("Flame Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4464,6 +4692,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Fire-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIRE, @@ -4474,7 +4703,7 @@ const struct Item gItemsInfo[] = [ITEM_SPLASH_PLATE] = { - .name = _("Splash Plate"), + .name = ITEM_NAME("Splash Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4483,6 +4712,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Water-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_WATER, @@ -4493,7 +4723,7 @@ const struct Item gItemsInfo[] = [ITEM_ZAP_PLATE] = { - .name = _("Zap Plate"), + .name = ITEM_NAME("Zap Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4502,6 +4732,7 @@ const struct Item gItemsInfo[] = "the power of Elec-\n" "tric-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ELECTRIC, @@ -4512,7 +4743,7 @@ const struct Item gItemsInfo[] = [ITEM_MEADOW_PLATE] = { - .name = _("Meadow Plate"), + .name = ITEM_NAME("Meadow Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4521,6 +4752,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Grass-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GRASS, @@ -4531,7 +4763,7 @@ const struct Item gItemsInfo[] = [ITEM_ICICLE_PLATE] = { - .name = _("Icicle Plate"), + .name = ITEM_NAME("Icicle Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4540,6 +4772,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Ice-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ICE, @@ -4550,7 +4783,7 @@ const struct Item gItemsInfo[] = [ITEM_FIST_PLATE] = { - .name = _("Fist Plate"), + .name = ITEM_NAME("Fist Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4559,6 +4792,7 @@ const struct Item gItemsInfo[] = "the power of Fight-\n" "ing-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIGHTING, @@ -4569,7 +4803,7 @@ const struct Item gItemsInfo[] = [ITEM_TOXIC_PLATE] = { - .name = _("Toxic Plate"), + .name = ITEM_NAME("Toxic Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4578,6 +4812,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Poison-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_POISON, @@ -4588,7 +4823,7 @@ const struct Item gItemsInfo[] = [ITEM_EARTH_PLATE] = { - .name = _("Earth Plate"), + .name = ITEM_NAME("Earth Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4597,6 +4832,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Ground-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GROUND, @@ -4607,7 +4843,7 @@ const struct Item gItemsInfo[] = [ITEM_SKY_PLATE] = { - .name = _("Sky Plate"), + .name = ITEM_NAME("Sky Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4616,6 +4852,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Flying-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FLYING, @@ -4626,7 +4863,7 @@ const struct Item gItemsInfo[] = [ITEM_MIND_PLATE] = { - .name = _("Mind Plate"), + .name = ITEM_NAME("Mind Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4635,6 +4872,7 @@ const struct Item gItemsInfo[] = "the power of Psy\n" "chic-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_PSYCHIC, @@ -4645,7 +4883,7 @@ const struct Item gItemsInfo[] = [ITEM_INSECT_PLATE] = { - .name = _("Insect Plate"), + .name = ITEM_NAME("Insect Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4654,6 +4892,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Bug-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_BUG, @@ -4664,7 +4903,7 @@ const struct Item gItemsInfo[] = [ITEM_STONE_PLATE] = { - .name = _("Stone Plate"), + .name = ITEM_NAME("Stone Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4673,6 +4912,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Rock-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ROCK, @@ -4683,7 +4923,7 @@ const struct Item gItemsInfo[] = [ITEM_SPOOKY_PLATE] = { - .name = _("Spooky Plate"), + .name = ITEM_NAME("Spooky Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4692,6 +4932,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Ghost-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GHOST, @@ -4702,7 +4943,7 @@ const struct Item gItemsInfo[] = [ITEM_DRACO_PLATE] = { - .name = _("Draco Plate"), + .name = ITEM_NAME("Draco Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4711,6 +4952,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Dragon-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DRAGON, @@ -4721,7 +4963,7 @@ const struct Item gItemsInfo[] = [ITEM_DREAD_PLATE] = { - .name = _("Dread Plate"), + .name = ITEM_NAME("Dread Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4730,6 +4972,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Dark-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DARK, @@ -4740,7 +4983,7 @@ const struct Item gItemsInfo[] = [ITEM_IRON_PLATE] = { - .name = _("Iron Plate"), + .name = ITEM_NAME("Iron Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4749,6 +4992,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Steel-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_STEEL, @@ -4759,7 +5003,7 @@ const struct Item gItemsInfo[] = [ITEM_PIXIE_PLATE] = { - .name = _("Pixie Plate"), + .name = ITEM_NAME("Pixie Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4768,6 +5012,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Fairy-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FAIRY, @@ -4780,7 +5025,7 @@ const struct Item gItemsInfo[] = [ITEM_DOUSE_DRIVE] = { - .name = _("Douse Drive"), + .name = ITEM_NAME("Douse Drive"), .price = (I_PRICE >= GEN_7) ? 0 : 1000, .holdEffect = HOLD_EFFECT_DRIVE, .description = COMPOUND_STRING( @@ -4788,6 +5033,7 @@ const struct Item gItemsInfo[] = "Techno Blast to\n" "Water-type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_DRIVE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_WATER, @@ -4798,7 +5044,7 @@ const struct Item gItemsInfo[] = [ITEM_SHOCK_DRIVE] = { - .name = _("Shock Drive"), + .name = ITEM_NAME("Shock Drive"), .price = (I_PRICE >= GEN_7) ? 0 : 1000, .holdEffect = HOLD_EFFECT_DRIVE, .description = COMPOUND_STRING( @@ -4806,6 +5052,7 @@ const struct Item gItemsInfo[] = "Techno Blast to\n" "Electric-type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_DRIVE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ELECTRIC, @@ -4816,7 +5063,7 @@ const struct Item gItemsInfo[] = [ITEM_BURN_DRIVE] = { - .name = _("Burn Drive"), + .name = ITEM_NAME("Burn Drive"), .price = (I_PRICE >= GEN_7) ? 0 : 1000, .holdEffect = HOLD_EFFECT_DRIVE, .description = COMPOUND_STRING( @@ -4824,6 +5071,7 @@ const struct Item gItemsInfo[] = "Techno Blast to\n" "Fire-type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_DRIVE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIRE, @@ -4834,7 +5082,7 @@ const struct Item gItemsInfo[] = [ITEM_CHILL_DRIVE] = { - .name = _("Chill Drive"), + .name = ITEM_NAME("Chill Drive"), .price = (I_PRICE >= GEN_7) ? 0 : 1000, .holdEffect = HOLD_EFFECT_DRIVE, .description = COMPOUND_STRING( @@ -4842,6 +5090,7 @@ const struct Item gItemsInfo[] = "Techno Blast to\n" "Ice-type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_DRIVE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ICE, @@ -4854,8 +5103,8 @@ const struct Item gItemsInfo[] = [ITEM_FIRE_MEMORY] = { - .name = _("Fire Memory"), - .pluralName = _("Fire Memories"), + .name = ITEM_NAME("Fire Memory"), + .pluralName = ITEM_PLURAL_NAME("Fire Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -4864,6 +5113,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIRE, @@ -4874,8 +5124,8 @@ const struct Item gItemsInfo[] = [ITEM_WATER_MEMORY] = { - .name = _("Water Memory"), - .pluralName = _("Water Memories"), + .name = ITEM_NAME("Water Memory"), + .pluralName = ITEM_PLURAL_NAME("Water Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -4884,6 +5134,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_WATER, @@ -4894,8 +5145,8 @@ const struct Item gItemsInfo[] = [ITEM_ELECTRIC_MEMORY] = { - .name = _("Electric Memory"), - .pluralName = _("Electric Memories"), + .name = ITEM_NAME("Electric Memory"), + .pluralName = ITEM_PLURAL_NAME("Electric Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -4904,6 +5155,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ELECTRIC, @@ -4914,8 +5166,8 @@ const struct Item gItemsInfo[] = [ITEM_GRASS_MEMORY] = { - .name = _("Grass Memory"), - .pluralName = _("Grass Memories"), + .name = ITEM_NAME("Grass Memory"), + .pluralName = ITEM_PLURAL_NAME("Grass Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -4924,6 +5176,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GRASS, @@ -4934,8 +5187,8 @@ const struct Item gItemsInfo[] = [ITEM_ICE_MEMORY] = { - .name = _("Ice Memory"), - .pluralName = _("Ice Memories"), + .name = ITEM_NAME("Ice Memory"), + .pluralName = ITEM_PLURAL_NAME("Ice Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -4944,6 +5197,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ICE, @@ -4954,8 +5208,8 @@ const struct Item gItemsInfo[] = [ITEM_FIGHTING_MEMORY] = { - .name = _("Fighting Memory"), - .pluralName = _("Fighting Memories"), + .name = ITEM_NAME("Fighting Memory"), + .pluralName = ITEM_PLURAL_NAME("Fighting Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -4964,6 +5218,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIGHTING, @@ -4974,8 +5229,8 @@ const struct Item gItemsInfo[] = [ITEM_POISON_MEMORY] = { - .name = _("Poison Memory"), - .pluralName = _("Poison Memories"), + .name = ITEM_NAME("Poison Memory"), + .pluralName = ITEM_PLURAL_NAME("Poison Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -4984,6 +5239,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_POISON, @@ -4994,8 +5250,8 @@ const struct Item gItemsInfo[] = [ITEM_GROUND_MEMORY] = { - .name = _("Ground Memory"), - .pluralName = _("Ground Memories"), + .name = ITEM_NAME("Ground Memory"), + .pluralName = ITEM_PLURAL_NAME("Ground Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5004,6 +5260,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GROUND, @@ -5014,8 +5271,8 @@ const struct Item gItemsInfo[] = [ITEM_FLYING_MEMORY] = { - .name = _("Flying Memory"), - .pluralName = _("Flying Memories"), + .name = ITEM_NAME("Flying Memory"), + .pluralName = ITEM_PLURAL_NAME("Flying Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5024,6 +5281,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FLYING, @@ -5034,8 +5292,8 @@ const struct Item gItemsInfo[] = [ITEM_PSYCHIC_MEMORY] = { - .name = _("Psychic Memory"), - .pluralName = _("Psychic Memories"), + .name = ITEM_NAME("Psychic Memory"), + .pluralName = ITEM_PLURAL_NAME("Psychic Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5044,6 +5302,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_PSYCHIC, @@ -5054,8 +5313,8 @@ const struct Item gItemsInfo[] = [ITEM_BUG_MEMORY] = { - .name = _("Bug Memory"), - .pluralName = _("Bug Memories"), + .name = ITEM_NAME("Bug Memory"), + .pluralName = ITEM_PLURAL_NAME("Bug Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5064,6 +5323,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_BUG, @@ -5074,8 +5334,8 @@ const struct Item gItemsInfo[] = [ITEM_ROCK_MEMORY] = { - .name = _("Rock Memory"), - .pluralName = _("Rock Memories"), + .name = ITEM_NAME("Rock Memory"), + .pluralName = ITEM_PLURAL_NAME("Rock Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5084,6 +5344,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ROCK, @@ -5094,8 +5355,8 @@ const struct Item gItemsInfo[] = [ITEM_GHOST_MEMORY] = { - .name = _("Ghost Memory"), - .pluralName = _("Ghost Memories"), + .name = ITEM_NAME("Ghost Memory"), + .pluralName = ITEM_PLURAL_NAME("Ghost Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5104,6 +5365,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GHOST, @@ -5114,8 +5376,8 @@ const struct Item gItemsInfo[] = [ITEM_DRAGON_MEMORY] = { - .name = _("Dragon Memory"), - .pluralName = _("Dragon Memories"), + .name = ITEM_NAME("Dragon Memory"), + .pluralName = ITEM_PLURAL_NAME("Dragon Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5124,6 +5386,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DRAGON, @@ -5134,8 +5397,8 @@ const struct Item gItemsInfo[] = [ITEM_DARK_MEMORY] = { - .name = _("Dark Memory"), - .pluralName = _("Dark Memories"), + .name = ITEM_NAME("Dark Memory"), + .pluralName = ITEM_PLURAL_NAME("Dark Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5144,6 +5407,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DARK, @@ -5154,8 +5418,8 @@ const struct Item gItemsInfo[] = [ITEM_STEEL_MEMORY] = { - .name = _("Steel Memory"), - .pluralName = _("Steel Memories"), + .name = ITEM_NAME("Steel Memory"), + .pluralName = ITEM_PLURAL_NAME("Steel Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5164,6 +5428,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_STEEL, @@ -5174,8 +5439,8 @@ const struct Item gItemsInfo[] = [ITEM_FAIRY_MEMORY] = { - .name = _("Fairy Memory"), - .pluralName = _("Fairy Memories"), + .name = ITEM_NAME("Fairy Memory"), + .pluralName = ITEM_PLURAL_NAME("Fairy Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5184,6 +5449,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FAIRY, @@ -5194,13 +5460,14 @@ const struct Item gItemsInfo[] = [ITEM_RUSTED_SWORD] = { - .name = _("Rusted Sword"), + .name = ITEM_NAME("Rusted Sword"), .price = 0, .description = COMPOUND_STRING( "A rusty sword. A\n" "hero used it to\n" "halt a disaster."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SPECIAL_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_RustedSword, @@ -5209,13 +5476,14 @@ const struct Item gItemsInfo[] = [ITEM_RUSTED_SHIELD] = { - .name = _("Rusted Shield"), + .name = ITEM_NAME("Rusted Shield"), .price = 0, .description = COMPOUND_STRING( "A rusty shield. A\n" "hero used it to\n" "halt a disaster."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SPECIAL_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_RustedShield, @@ -5226,7 +5494,7 @@ const struct Item gItemsInfo[] = [ITEM_RED_ORB] = { - .name = _("Red Orb"), + .name = ITEM_NAME("Red Orb"), .price = 0, .holdEffect = HOLD_EFFECT_PRIMAL_ORB, .description = COMPOUND_STRING( @@ -5234,6 +5502,7 @@ const struct Item gItemsInfo[] = "said to contain an\n" "ancient power."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SPECIAL_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_RedOrb, @@ -5242,7 +5511,7 @@ const struct Item gItemsInfo[] = [ITEM_BLUE_ORB] = { - .name = _("Blue Orb"), + .name = ITEM_NAME("Blue Orb"), .price = 0, .holdEffect = HOLD_EFFECT_PRIMAL_ORB, .description = COMPOUND_STRING( @@ -5250,6 +5519,7 @@ const struct Item gItemsInfo[] = "said to contain an\n" "ancient power."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SPECIAL_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_BlueOrb, @@ -5260,7 +5530,7 @@ const struct Item gItemsInfo[] = [ITEM_VENUSAURITE] = { - .name = _("Venusaurite"), + .name = ITEM_NAME("Venusaurite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5268,6 +5538,7 @@ const struct Item gItemsInfo[] = "Venusaur to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5277,12 +5548,13 @@ const struct Item gItemsInfo[] = [ITEM_CHARIZARDITE_X] = { - .name = _("Charizardite X"), - .pluralName = _("Charizardites X"), + .name = ITEM_NAME("Charizardite X"), + .pluralName = ITEM_PLURAL_NAME("Charizardites X"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = sCharizarditeDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5292,12 +5564,13 @@ const struct Item gItemsInfo[] = [ITEM_CHARIZARDITE_Y] = { - .name = _("Charizardite Y"), - .pluralName = _("Charizardites Y"), + .name = ITEM_NAME("Charizardite Y"), + .pluralName = ITEM_PLURAL_NAME("Charizardites Y"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = sCharizarditeDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5307,7 +5580,7 @@ const struct Item gItemsInfo[] = [ITEM_BLASTOISINITE] = { - .name = _("Blastoisinite"), + .name = ITEM_NAME("Blastoisinite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5315,6 +5588,7 @@ const struct Item gItemsInfo[] = "Blastoise to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5324,7 +5598,7 @@ const struct Item gItemsInfo[] = [ITEM_BEEDRILLITE] = { - .name = _("Beedrillite"), + .name = ITEM_NAME("Beedrillite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5332,6 +5606,7 @@ const struct Item gItemsInfo[] = "Beedrill to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5341,7 +5616,7 @@ const struct Item gItemsInfo[] = [ITEM_PIDGEOTITE] = { - .name = _("Pidgeotite"), + .name = ITEM_NAME("Pidgeotite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5349,6 +5624,7 @@ const struct Item gItemsInfo[] = "Pidgeot to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5358,7 +5634,7 @@ const struct Item gItemsInfo[] = [ITEM_ALAKAZITE] = { - .name = _("Alakazite"), + .name = ITEM_NAME("Alakazite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5366,6 +5642,7 @@ const struct Item gItemsInfo[] = "Alakazam to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5375,7 +5652,7 @@ const struct Item gItemsInfo[] = [ITEM_SLOWBRONITE] = { - .name = _("Slowbronite"), + .name = ITEM_NAME("Slowbronite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5383,6 +5660,7 @@ const struct Item gItemsInfo[] = "Slowbro to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5392,7 +5670,7 @@ const struct Item gItemsInfo[] = [ITEM_GENGARITE] = { - .name = _("Gengarite"), + .name = ITEM_NAME("Gengarite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5400,6 +5678,7 @@ const struct Item gItemsInfo[] = "Gengar to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5409,7 +5688,7 @@ const struct Item gItemsInfo[] = [ITEM_KANGASKHANITE] = { - .name = _("Kangaskhanite"), + .name = ITEM_NAME("Kangaskhanite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5417,6 +5696,7 @@ const struct Item gItemsInfo[] = "Kangaskhan to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5426,7 +5706,7 @@ const struct Item gItemsInfo[] = [ITEM_PINSIRITE] = { - .name = _("Pinsirite"), + .name = ITEM_NAME("Pinsirite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5434,6 +5714,7 @@ const struct Item gItemsInfo[] = "Pinsir to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5443,7 +5724,7 @@ const struct Item gItemsInfo[] = [ITEM_GYARADOSITE] = { - .name = _("Gyaradosite"), + .name = ITEM_NAME("Gyaradosite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5451,6 +5732,7 @@ const struct Item gItemsInfo[] = "Gyarados to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5460,7 +5742,7 @@ const struct Item gItemsInfo[] = [ITEM_AERODACTYLITE] = { - .name = _("Aerodactylite"), + .name = ITEM_NAME("Aerodactylite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5468,6 +5750,7 @@ const struct Item gItemsInfo[] = "Aerodactyl to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5477,12 +5760,13 @@ const struct Item gItemsInfo[] = [ITEM_MEWTWONITE_X] = { - .name = _("Mewtwonite X"), - .pluralName = _("Mewtwonites X"), + .name = ITEM_NAME("Mewtwonite X"), + .pluralName = ITEM_PLURAL_NAME("Mewtwonites X"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = sMewtwoniteDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5492,12 +5776,13 @@ const struct Item gItemsInfo[] = [ITEM_MEWTWONITE_Y] = { - .name = _("Mewtwonite Y"), - .pluralName = _("Mewtwonites Y"), + .name = ITEM_NAME("Mewtwonite Y"), + .pluralName = ITEM_PLURAL_NAME("Mewtwonites Y"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = sMewtwoniteDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5507,7 +5792,7 @@ const struct Item gItemsInfo[] = [ITEM_AMPHAROSITE] = { - .name = _("Ampharosite"), + .name = ITEM_NAME("Ampharosite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5515,6 +5800,7 @@ const struct Item gItemsInfo[] = "Ampharos to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5524,7 +5810,7 @@ const struct Item gItemsInfo[] = [ITEM_STEELIXITE] = { - .name = _("Steelixite"), + .name = ITEM_NAME("Steelixite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5532,6 +5818,7 @@ const struct Item gItemsInfo[] = "Steelix to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5541,7 +5828,7 @@ const struct Item gItemsInfo[] = [ITEM_SCIZORITE] = { - .name = _("Scizorite"), + .name = ITEM_NAME("Scizorite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5549,6 +5836,7 @@ const struct Item gItemsInfo[] = "Scizor to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5558,7 +5846,7 @@ const struct Item gItemsInfo[] = [ITEM_HERACRONITE] = { - .name = _("Heracronite"), + .name = ITEM_NAME("Heracronite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5566,6 +5854,7 @@ const struct Item gItemsInfo[] = "Heracross to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5575,7 +5864,7 @@ const struct Item gItemsInfo[] = [ITEM_HOUNDOOMINITE] = { - .name = _("Houndoominite"), + .name = ITEM_NAME("Houndoominite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5583,6 +5872,7 @@ const struct Item gItemsInfo[] = "Houndoom to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5592,7 +5882,7 @@ const struct Item gItemsInfo[] = [ITEM_TYRANITARITE] = { - .name = _("Tyranitarite"), + .name = ITEM_NAME("Tyranitarite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5600,6 +5890,7 @@ const struct Item gItemsInfo[] = "Tyranitar to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5609,7 +5900,7 @@ const struct Item gItemsInfo[] = [ITEM_SCEPTILITE] = { - .name = _("Sceptilite"), + .name = ITEM_NAME("Sceptilite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5617,6 +5908,7 @@ const struct Item gItemsInfo[] = "Sceptile to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5626,7 +5918,7 @@ const struct Item gItemsInfo[] = [ITEM_BLAZIKENITE] = { - .name = _("Blazikenite"), + .name = ITEM_NAME("Blazikenite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5634,6 +5926,7 @@ const struct Item gItemsInfo[] = "Blaziken to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5643,7 +5936,7 @@ const struct Item gItemsInfo[] = [ITEM_SWAMPERTITE] = { - .name = _("Swampertite"), + .name = ITEM_NAME("Swampertite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5651,6 +5944,7 @@ const struct Item gItemsInfo[] = "Swampert to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5660,7 +5954,7 @@ const struct Item gItemsInfo[] = [ITEM_GARDEVOIRITE] = { - .name = _("Gardevoirite"), + .name = ITEM_NAME("Gardevoirite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5668,6 +5962,7 @@ const struct Item gItemsInfo[] = "Gardevoir to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5677,7 +5972,7 @@ const struct Item gItemsInfo[] = [ITEM_SABLENITE] = { - .name = _("Sablenite"), + .name = ITEM_NAME("Sablenite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5685,6 +5980,7 @@ const struct Item gItemsInfo[] = "Sableye to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5694,7 +5990,7 @@ const struct Item gItemsInfo[] = [ITEM_MAWILITE] = { - .name = _("Mawilite"), + .name = ITEM_NAME("Mawilite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5702,6 +5998,7 @@ const struct Item gItemsInfo[] = "Mawile to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5711,7 +6008,7 @@ const struct Item gItemsInfo[] = [ITEM_AGGRONITE] = { - .name = _("Aggronite"), + .name = ITEM_NAME("Aggronite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5719,6 +6016,7 @@ const struct Item gItemsInfo[] = "Aggron to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5728,7 +6026,7 @@ const struct Item gItemsInfo[] = [ITEM_MEDICHAMITE] = { - .name = _("Medichamite"), + .name = ITEM_NAME("Medichamite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5736,6 +6034,7 @@ const struct Item gItemsInfo[] = "Medicham to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5745,7 +6044,7 @@ const struct Item gItemsInfo[] = [ITEM_MANECTITE] = { - .name = _("Manectite"), + .name = ITEM_NAME("Manectite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5753,6 +6052,7 @@ const struct Item gItemsInfo[] = "Manectric to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5762,7 +6062,7 @@ const struct Item gItemsInfo[] = [ITEM_SHARPEDONITE] = { - .name = _("Sharpedonite"), + .name = ITEM_NAME("Sharpedonite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5770,6 +6070,7 @@ const struct Item gItemsInfo[] = "Sharpedo to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5779,7 +6080,7 @@ const struct Item gItemsInfo[] = [ITEM_CAMERUPTITE] = { - .name = _("Cameruptite"), + .name = ITEM_NAME("Cameruptite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5787,6 +6088,7 @@ const struct Item gItemsInfo[] = "Camerupt to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5796,7 +6098,7 @@ const struct Item gItemsInfo[] = [ITEM_ALTARIANITE] = { - .name = _("Altarianite"), + .name = ITEM_NAME("Altarianite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5804,6 +6106,7 @@ const struct Item gItemsInfo[] = "Altaria to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5813,7 +6116,7 @@ const struct Item gItemsInfo[] = [ITEM_BANETTITE] = { - .name = _("Banettite"), + .name = ITEM_NAME("Banettite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5821,6 +6124,7 @@ const struct Item gItemsInfo[] = "Banette to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5830,7 +6134,7 @@ const struct Item gItemsInfo[] = [ITEM_ABSOLITE] = { - .name = _("Absolite"), + .name = ITEM_NAME("Absolite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5838,6 +6142,7 @@ const struct Item gItemsInfo[] = "Absol to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5847,7 +6152,7 @@ const struct Item gItemsInfo[] = [ITEM_GLALITITE] = { - .name = _("Glalitite"), + .name = ITEM_NAME("Glalitite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5855,6 +6160,7 @@ const struct Item gItemsInfo[] = "Glalie to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5864,7 +6170,7 @@ const struct Item gItemsInfo[] = [ITEM_SALAMENCITE] = { - .name = _("Salamencite"), + .name = ITEM_NAME("Salamencite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5872,6 +6178,7 @@ const struct Item gItemsInfo[] = "Salamence to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5881,7 +6188,7 @@ const struct Item gItemsInfo[] = [ITEM_METAGROSSITE] = { - .name = _("Metagrossite"), + .name = ITEM_NAME("Metagrossite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5889,6 +6196,7 @@ const struct Item gItemsInfo[] = "Metagross to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5898,7 +6206,7 @@ const struct Item gItemsInfo[] = [ITEM_LATIASITE] = { - .name = _("Latiasite"), + .name = ITEM_NAME("Latiasite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5906,6 +6214,7 @@ const struct Item gItemsInfo[] = "Latias to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5915,7 +6224,7 @@ const struct Item gItemsInfo[] = [ITEM_LATIOSITE] = { - .name = _("Latiosite"), + .name = ITEM_NAME("Latiosite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5923,6 +6232,7 @@ const struct Item gItemsInfo[] = "Latios to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5932,7 +6242,7 @@ const struct Item gItemsInfo[] = [ITEM_LOPUNNITE] = { - .name = _("Lopunnite"), + .name = ITEM_NAME("Lopunnite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5940,6 +6250,7 @@ const struct Item gItemsInfo[] = "Lopunny to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5949,7 +6260,7 @@ const struct Item gItemsInfo[] = [ITEM_GARCHOMPITE] = { - .name = _("Garchompite"), + .name = ITEM_NAME("Garchompite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5957,6 +6268,7 @@ const struct Item gItemsInfo[] = "Garchomp to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5966,7 +6278,7 @@ const struct Item gItemsInfo[] = [ITEM_LUCARIONITE] = { - .name = _("Lucarionite"), + .name = ITEM_NAME("Lucarionite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5974,6 +6286,7 @@ const struct Item gItemsInfo[] = "Lucario to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5983,7 +6296,7 @@ const struct Item gItemsInfo[] = [ITEM_ABOMASITE] = { - .name = _("Abomasite"), + .name = ITEM_NAME("Abomasite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5991,6 +6304,7 @@ const struct Item gItemsInfo[] = "Abomasnow to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -6000,7 +6314,7 @@ const struct Item gItemsInfo[] = [ITEM_GALLADITE] = { - .name = _("Galladite"), + .name = ITEM_NAME("Galladite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6008,6 +6322,7 @@ const struct Item gItemsInfo[] = "Gallade to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -6017,7 +6332,7 @@ const struct Item gItemsInfo[] = [ITEM_AUDINITE] = { - .name = _("Audinite"), + .name = ITEM_NAME("Audinite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6025,6 +6340,7 @@ const struct Item gItemsInfo[] = "Audino to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -6034,7 +6350,7 @@ const struct Item gItemsInfo[] = [ITEM_DIANCITE] = { - .name = _("Diancite"), + .name = ITEM_NAME("Diancite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6042,6 +6358,7 @@ const struct Item gItemsInfo[] = "Diancie to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -6049,11 +6366,479 @@ const struct Item gItemsInfo[] = .iconPalette = gItemIconPalette_Diancite, }, + [ITEM_CLEFABLITE] = + { + .name = ITEM_NAME("Clefablite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Clefable to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Clefablite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Clefablite, + }, + + [ITEM_VICTREEBELITE] = + { + .name = ITEM_NAME("Victreebelite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Victreebel to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Victreebelite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Victreebelite, + }, + + [ITEM_STARMINITE] = + { + .name = ITEM_NAME("Starminite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Starmie to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Starminite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Starminite, + }, + + [ITEM_DRAGONINITE] = + { + .name = ITEM_NAME("Dragoninite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Dragonite to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Dragoninite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Dragoninite, + }, + + [ITEM_MEGANIUMITE] = + { + .name = ITEM_NAME("Meganiumite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Meganium to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Meganiumite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Meganiumite, + }, + + [ITEM_FERALIGITE] = + { + .name = ITEM_NAME("Feraligite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Feraligatr to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Feraligite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Feraligite, + }, + + [ITEM_SKARMORITE] = + { + .name = ITEM_NAME("Skarmorite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Skarmory to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Skarmorite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Skarmorite, + }, + + [ITEM_FROSLASSITE] = + { + .name = ITEM_NAME("Froslassite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Froslass to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Froslassite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Froslassite, + }, + + [ITEM_EMBOARITE] = + { + .name = ITEM_NAME("Emboarite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Emboar to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Emboarite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Emboarite, + }, + + [ITEM_EXCADRITE] = + { + .name = ITEM_NAME("Excadrite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Excadrill to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Excadrite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Excadrite, + }, + + [ITEM_SCOLIPITE] = + { + .name = ITEM_NAME("Scolipite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Scolipede to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Scolipite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Scolipite, + }, + + [ITEM_SCRAFTINITE] = + { + .name = ITEM_NAME("Scraftinite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Scrafty to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Scraftinite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Scraftinite, + }, + + [ITEM_EELEKTROSSITE] = + { + .name = ITEM_NAME("Eelektrossite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Eelektross to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Eelektrossite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Eelektrossite, + }, + + [ITEM_CHANDELURITE] = + { + .name = ITEM_NAME("Chandelurite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Chandelure to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Chandelurite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Chandelurite, + }, + + [ITEM_CHESNAUGHTITE] = + { + .name = ITEM_NAME("Chesnaughtite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Chesnaught to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Chesnaughtite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Chesnaughtite, + }, + + [ITEM_DELPHOXITE] = + { + .name = ITEM_NAME("Delphoxite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Delphox to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Delphoxite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Delphoxite, + }, + + [ITEM_GRENINJITE] = + { + .name = ITEM_NAME("Greninjite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Greninja to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Greninjite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Greninjite, + }, + + [ITEM_PYROARITE] = + { + .name = ITEM_NAME("Pyroarite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Pyroar to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Pyroarite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Pyroarite, + }, + + [ITEM_FLOETTITE] = + { + .name = ITEM_NAME("Floettite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Floette to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Floettite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Floettite, + }, + + [ITEM_MALAMARITE] = + { + .name = ITEM_NAME("Malamarite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Malamar to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Malamarite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Malamarite, + }, + + [ITEM_BARBARACITE] = + { + .name = ITEM_NAME("Barbaracite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Barbaracle to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Barbaracite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Barbaracite, + }, + + [ITEM_DRAGALGITE] = + { + .name = ITEM_NAME("Dragalgite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Dragalge to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Dragalgite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Dragalgite, + }, + + [ITEM_HAWLUCHANITE] = + { + .name = ITEM_NAME("Hawluchanite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Hawlucha to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Hawluchanite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Hawluchanite, + }, + + [ITEM_ZYGARDITE] = + { + .name = ITEM_NAME("Zygardite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Zygarde to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Zygardite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Zygardite, + }, + + [ITEM_DRAMPANITE] = + { + .name = ITEM_NAME("Drampanite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Drampa to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Drampanite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Drampanite, + }, + + [ITEM_FALINKSITE] = + { + .name = ITEM_NAME("Falinksite"), + .price = 0, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .description = COMPOUND_STRING( + "This stone enables\n" + "Falinks to Mega\n" + "Evolve in battle."), + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .flingPower = 80, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Falinksite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Falinksite, + }, + // Gems [ITEM_NORMAL_GEM] = { - .name = _("Normal Gem"), + .name = ITEM_NAME("Normal Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6062,6 +6847,7 @@ const struct Item gItemsInfo[] = "power of Normal\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_NORMAL, @@ -6071,7 +6857,7 @@ const struct Item gItemsInfo[] = [ITEM_FIRE_GEM] = { - .name = _("Fire Gem"), + .name = ITEM_NAME("Fire Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6080,6 +6866,7 @@ const struct Item gItemsInfo[] = "power of Fire\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIRE, @@ -6089,7 +6876,7 @@ const struct Item gItemsInfo[] = [ITEM_WATER_GEM] = { - .name = _("Water Gem"), + .name = ITEM_NAME("Water Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6098,6 +6885,7 @@ const struct Item gItemsInfo[] = "power of Water\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_WATER, @@ -6107,7 +6895,7 @@ const struct Item gItemsInfo[] = [ITEM_ELECTRIC_GEM] = { - .name = _("Electric Gem"), + .name = ITEM_NAME("Electric Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6116,6 +6904,7 @@ const struct Item gItemsInfo[] = "power of Electric\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ELECTRIC, @@ -6125,7 +6914,7 @@ const struct Item gItemsInfo[] = [ITEM_GRASS_GEM] = { - .name = _("Grass Gem"), + .name = ITEM_NAME("Grass Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6134,6 +6923,7 @@ const struct Item gItemsInfo[] = "power of Grass\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GRASS, @@ -6143,7 +6933,7 @@ const struct Item gItemsInfo[] = [ITEM_ICE_GEM] = { - .name = _("Ice Gem"), + .name = ITEM_NAME("Ice Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6152,6 +6942,7 @@ const struct Item gItemsInfo[] = "power of Ice\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ICE, @@ -6161,7 +6952,7 @@ const struct Item gItemsInfo[] = [ITEM_FIGHTING_GEM] = { - .name = _("Fighting Gem"), + .name = ITEM_NAME("Fighting Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6170,6 +6961,7 @@ const struct Item gItemsInfo[] = "power of Fighting\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIGHTING, @@ -6179,7 +6971,7 @@ const struct Item gItemsInfo[] = [ITEM_POISON_GEM] = { - .name = _("Poison Gem"), + .name = ITEM_NAME("Poison Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6188,6 +6980,7 @@ const struct Item gItemsInfo[] = "power of Poison\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_POISON, @@ -6197,7 +6990,7 @@ const struct Item gItemsInfo[] = [ITEM_GROUND_GEM] = { - .name = _("Ground Gem"), + .name = ITEM_NAME("Ground Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6206,6 +6999,7 @@ const struct Item gItemsInfo[] = "power of Ground\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GROUND, @@ -6215,7 +7009,7 @@ const struct Item gItemsInfo[] = [ITEM_FLYING_GEM] = { - .name = _("Flying Gem"), + .name = ITEM_NAME("Flying Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6224,6 +7018,7 @@ const struct Item gItemsInfo[] = "power of Flying\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FLYING, @@ -6233,7 +7028,7 @@ const struct Item gItemsInfo[] = [ITEM_PSYCHIC_GEM] = { - .name = _("Psychic Gem"), + .name = ITEM_NAME("Psychic Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6242,6 +7037,7 @@ const struct Item gItemsInfo[] = "power of Psychic\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_PSYCHIC, @@ -6251,7 +7047,7 @@ const struct Item gItemsInfo[] = [ITEM_BUG_GEM] = { - .name = _("Bug Gem"), + .name = ITEM_NAME("Bug Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6260,6 +7056,7 @@ const struct Item gItemsInfo[] = "power of Bug\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_BUG, @@ -6269,7 +7066,7 @@ const struct Item gItemsInfo[] = [ITEM_ROCK_GEM] = { - .name = _("Rock Gem"), + .name = ITEM_NAME("Rock Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6278,6 +7075,7 @@ const struct Item gItemsInfo[] = "power of Rock\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ROCK, @@ -6287,7 +7085,7 @@ const struct Item gItemsInfo[] = [ITEM_GHOST_GEM] = { - .name = _("Ghost Gem"), + .name = ITEM_NAME("Ghost Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6296,6 +7094,7 @@ const struct Item gItemsInfo[] = "power of Ghost\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GHOST, @@ -6305,7 +7104,7 @@ const struct Item gItemsInfo[] = [ITEM_DRAGON_GEM] = { - .name = _("Dragon Gem"), + .name = ITEM_NAME("Dragon Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6314,6 +7113,7 @@ const struct Item gItemsInfo[] = "power of Dragon\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DRAGON, @@ -6323,7 +7123,7 @@ const struct Item gItemsInfo[] = [ITEM_DARK_GEM] = { - .name = _("Dark Gem"), + .name = ITEM_NAME("Dark Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6332,6 +7132,7 @@ const struct Item gItemsInfo[] = "power of Dark\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DARK, @@ -6341,7 +7142,7 @@ const struct Item gItemsInfo[] = [ITEM_STEEL_GEM] = { - .name = _("Steel Gem"), + .name = ITEM_NAME("Steel Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6350,6 +7151,7 @@ const struct Item gItemsInfo[] = "power of Steel\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_STEEL, @@ -6359,7 +7161,7 @@ const struct Item gItemsInfo[] = [ITEM_FAIRY_GEM] = { - .name = _("Fairy Gem"), + .name = ITEM_NAME("Fairy Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6368,6 +7170,7 @@ const struct Item gItemsInfo[] = "power of Fairy\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FAIRY, @@ -6379,7 +7182,7 @@ const struct Item gItemsInfo[] = [ITEM_NORMALIUM_Z] = { - .name = _("Normalium Z"), + .name = ITEM_NAME("Normalium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6387,6 +7190,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_NORMAL, @@ -6396,7 +7200,7 @@ const struct Item gItemsInfo[] = [ITEM_FIRIUM_Z] = { - .name = _("Firium Z"), + .name = ITEM_NAME("Firium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6404,6 +7208,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIRE, @@ -6413,7 +7218,7 @@ const struct Item gItemsInfo[] = [ITEM_WATERIUM_Z] = { - .name = _("Waterium Z"), + .name = ITEM_NAME("Waterium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6421,6 +7226,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_WATER, @@ -6430,7 +7236,7 @@ const struct Item gItemsInfo[] = [ITEM_ELECTRIUM_Z] = { - .name = _("Electrium Z"), + .name = ITEM_NAME("Electrium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6438,6 +7244,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ELECTRIC, @@ -6447,7 +7254,7 @@ const struct Item gItemsInfo[] = [ITEM_GRASSIUM_Z] = { - .name = _("Grassium Z"), + .name = ITEM_NAME("Grassium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6455,6 +7262,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GRASS, @@ -6464,7 +7272,7 @@ const struct Item gItemsInfo[] = [ITEM_ICIUM_Z] = { - .name = _("Icium Z"), + .name = ITEM_NAME("Icium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6472,6 +7280,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ICE, @@ -6481,7 +7290,7 @@ const struct Item gItemsInfo[] = [ITEM_FIGHTINIUM_Z] = { - .name = _("Fightinium Z"), + .name = ITEM_NAME("Fightinium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6489,6 +7298,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIGHTING, @@ -6498,7 +7308,7 @@ const struct Item gItemsInfo[] = [ITEM_POISONIUM_Z] = { - .name = _("Poisonium Z"), + .name = ITEM_NAME("Poisonium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6506,6 +7316,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_POISON, @@ -6515,7 +7326,7 @@ const struct Item gItemsInfo[] = [ITEM_GROUNDIUM_Z] = { - .name = _("Groundium Z"), + .name = ITEM_NAME("Groundium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6523,6 +7334,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GROUND, @@ -6532,7 +7344,7 @@ const struct Item gItemsInfo[] = [ITEM_FLYINIUM_Z] = { - .name = _("Flyinium Z"), + .name = ITEM_NAME("Flyinium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6540,6 +7352,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FLYING, @@ -6549,7 +7362,7 @@ const struct Item gItemsInfo[] = [ITEM_PSYCHIUM_Z] = { - .name = _("Psychium Z"), + .name = ITEM_NAME("Psychium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6557,6 +7370,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_PSYCHIC, @@ -6566,7 +7380,7 @@ const struct Item gItemsInfo[] = [ITEM_BUGINIUM_Z] = { - .name = _("Buginium Z"), + .name = ITEM_NAME("Buginium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6574,6 +7388,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_BUG, @@ -6583,7 +7398,7 @@ const struct Item gItemsInfo[] = [ITEM_ROCKIUM_Z] = { - .name = _("Rockium Z"), + .name = ITEM_NAME("Rockium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6591,6 +7406,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ROCK, @@ -6600,7 +7416,7 @@ const struct Item gItemsInfo[] = [ITEM_GHOSTIUM_Z] = { - .name = _("Ghostium Z"), + .name = ITEM_NAME("Ghostium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6608,6 +7424,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GHOST, @@ -6617,7 +7434,7 @@ const struct Item gItemsInfo[] = [ITEM_DRAGONIUM_Z] = { - .name = _("Dragonium Z"), + .name = ITEM_NAME("Dragonium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6625,6 +7442,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DRAGON, @@ -6634,7 +7452,7 @@ const struct Item gItemsInfo[] = [ITEM_DARKINIUM_Z] = { - .name = _("Darkinium Z"), + .name = ITEM_NAME("Darkinium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6642,6 +7460,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DARK, @@ -6651,7 +7470,7 @@ const struct Item gItemsInfo[] = [ITEM_STEELIUM_Z] = { - .name = _("Steelium Z"), + .name = ITEM_NAME("Steelium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6659,6 +7478,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_STEEL, @@ -6668,7 +7488,7 @@ const struct Item gItemsInfo[] = [ITEM_FAIRIUM_Z] = { - .name = _("Fairium Z"), + .name = ITEM_NAME("Fairium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6676,6 +7496,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FAIRY, @@ -6685,7 +7506,7 @@ const struct Item gItemsInfo[] = [ITEM_PIKANIUM_Z] = { - .name = _("Pikanium Z"), + .name = ITEM_NAME("Pikanium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6693,6 +7514,7 @@ const struct Item gItemsInfo[] = "Volt Tackle\n" "into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6702,7 +7524,7 @@ const struct Item gItemsInfo[] = [ITEM_EEVIUM_Z] = { - .name = _("Eevium Z"), + .name = ITEM_NAME("Eevium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6710,6 +7532,7 @@ const struct Item gItemsInfo[] = "Last Resort\n" "into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6719,7 +7542,7 @@ const struct Item gItemsInfo[] = [ITEM_SNORLIUM_Z] = { - .name = _("Snorlium Z"), + .name = ITEM_NAME("Snorlium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6727,6 +7550,7 @@ const struct Item gItemsInfo[] = "Giga Impact\n" "into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6736,7 +7560,7 @@ const struct Item gItemsInfo[] = [ITEM_MEWNIUM_Z] = { - .name = _("Mewnium Z"), + .name = ITEM_NAME("Mewnium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6744,6 +7568,7 @@ const struct Item gItemsInfo[] = "Psychic into\n" "a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6753,7 +7578,7 @@ const struct Item gItemsInfo[] = [ITEM_DECIDIUM_Z] = { - .name = _("Decidium Z"), + .name = ITEM_NAME("Decidium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6761,6 +7586,7 @@ const struct Item gItemsInfo[] = "eye's Spirit Sha-\n" "ckle into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6770,7 +7596,7 @@ const struct Item gItemsInfo[] = [ITEM_INCINIUM_Z] = { - .name = _("Incinium Z"), + .name = ITEM_NAME("Incinium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6778,6 +7604,7 @@ const struct Item gItemsInfo[] = "roar's Darkest La-\n" "riat into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6787,7 +7614,7 @@ const struct Item gItemsInfo[] = [ITEM_PRIMARIUM_Z] = { - .name = _("Primarium Z"), + .name = ITEM_NAME("Primarium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6795,6 +7622,7 @@ const struct Item gItemsInfo[] = "Sparkling Aria\n" "into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6804,7 +7632,7 @@ const struct Item gItemsInfo[] = [ITEM_LYCANIUM_Z] = { - .name = _("Lycanium Z"), + .name = ITEM_NAME("Lycanium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6812,6 +7640,7 @@ const struct Item gItemsInfo[] = "Stone Edge\n" "into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6821,7 +7650,7 @@ const struct Item gItemsInfo[] = [ITEM_MIMIKIUM_Z] = { - .name = _("Mimikium Z"), + .name = ITEM_NAME("Mimikium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6829,6 +7658,7 @@ const struct Item gItemsInfo[] = "Play Rough\n" "into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6838,7 +7668,7 @@ const struct Item gItemsInfo[] = [ITEM_KOMMONIUM_Z] = { - .name = _("Kommonium Z"), + .name = ITEM_NAME("Kommonium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6846,6 +7676,7 @@ const struct Item gItemsInfo[] = "Clanging Scales\n" "into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6855,7 +7686,7 @@ const struct Item gItemsInfo[] = [ITEM_TAPUNIUM_Z] = { - .name = _("Tapunium Z"), + .name = ITEM_NAME("Tapunium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6863,6 +7694,7 @@ const struct Item gItemsInfo[] = "Nature's Madness\n" "into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, //signature z move @@ -6872,7 +7704,7 @@ const struct Item gItemsInfo[] = [ITEM_SOLGANIUM_Z] = { - .name = _("Solganium Z"), + .name = ITEM_NAME("Solganium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6880,6 +7712,7 @@ const struct Item gItemsInfo[] = "Sunsteel Strike\n" "into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6889,7 +7722,7 @@ const struct Item gItemsInfo[] = [ITEM_LUNALIUM_Z] = { - .name = _("Lunalium Z"), + .name = ITEM_NAME("Lunalium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6897,6 +7730,7 @@ const struct Item gItemsInfo[] = "Moongeist Beam\n" "into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6906,7 +7740,7 @@ const struct Item gItemsInfo[] = [ITEM_MARSHADIUM_Z] = { - .name = _("Marshadium Z"), + .name = ITEM_NAME("Marshadium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6914,6 +7748,7 @@ const struct Item gItemsInfo[] = "dow's Spectral Thi-\n" "ef into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6923,7 +7758,7 @@ const struct Item gItemsInfo[] = [ITEM_ALORAICHIUM_Z] = { - .name = _("Aloraichium Z"), + .name = ITEM_NAME("Aloraichium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6931,6 +7766,7 @@ const struct Item gItemsInfo[] = "Raichu's Thunder-\n" "bolt into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6940,7 +7776,7 @@ const struct Item gItemsInfo[] = [ITEM_PIKASHUNIUM_Z] = { - .name = _("Pikashunium Z"), + .name = ITEM_NAME("Pikashunium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6948,6 +7784,7 @@ const struct Item gItemsInfo[] = "a cap's Thunderbolt\n" "into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6957,7 +7794,7 @@ const struct Item gItemsInfo[] = [ITEM_ULTRANECROZIUM_Z] = { - .name = _("Ultranecrozium Z"), + .name = ITEM_NAME("Ultranecrozium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6965,6 +7802,7 @@ const struct Item gItemsInfo[] = "fused Necrozma\n" "into a new form."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, //signature z move @@ -6976,7 +7814,7 @@ const struct Item gItemsInfo[] = [ITEM_LIGHT_BALL] = { - .name = _("Light Ball"), + .name = ITEM_NAME("Light Ball"), .price = (I_PRICE >= GEN_7) ? 1000 : 100, .holdEffect = HOLD_EFFECT_LIGHT_BALL, .description = COMPOUND_STRING( @@ -6984,6 +7822,7 @@ const struct Item gItemsInfo[] = "raises the Atk and\n" "Sp. Atk of Pikachu."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -6993,7 +7832,7 @@ const struct Item gItemsInfo[] = [ITEM_LEEK] = { - .name = _("Leek"), + .name = ITEM_NAME("Leek"), .price = (I_PRICE >= GEN_7) ? 1000 : 200, .holdEffect = HOLD_EFFECT_LEEK, .description = COMPOUND_STRING( @@ -7001,6 +7840,7 @@ const struct Item gItemsInfo[] = "raises Farfetch'd's\n" "critical-hit ratio."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -7010,7 +7850,7 @@ const struct Item gItemsInfo[] = [ITEM_THICK_CLUB] = { - .name = _("Thick Club"), + .name = ITEM_NAME("Thick Club"), .price = (I_PRICE >= GEN_7) ? 1000 : 500, .holdEffect = HOLD_EFFECT_THICK_CLUB, .description = COMPOUND_STRING( @@ -7018,6 +7858,7 @@ const struct Item gItemsInfo[] = "raises Cubone or\n" "Marowak's Attack."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 90, @@ -7027,8 +7868,8 @@ const struct Item gItemsInfo[] = [ITEM_LUCKY_PUNCH] = { - .name = _("Lucky Punch"), - .pluralName = _("Lucky Punches"), + .name = ITEM_NAME("Lucky Punch"), + .pluralName = ITEM_PLURAL_NAME("Lucky Punches"), .price = (I_PRICE >= GEN_7) ? 1000 : 10, .holdEffect = HOLD_EFFECT_LUCKY_PUNCH, .description = COMPOUND_STRING( @@ -7036,6 +7877,7 @@ const struct Item gItemsInfo[] = "raises Chansey's\n" "critical-hit rate."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 40, @@ -7045,8 +7887,8 @@ const struct Item gItemsInfo[] = [ITEM_METAL_POWDER] = { - .name = _("Metal Powder"), - .pluralName = _("Metal Powder"), + .name = ITEM_NAME("Metal Powder"), + .pluralName = ITEM_PLURAL_NAME("Metal Powder"), .price = (I_PRICE >= GEN_7) ? 1000 : 10, .holdEffect = HOLD_EFFECT_METAL_POWDER, .description = COMPOUND_STRING( @@ -7054,6 +7896,7 @@ const struct Item gItemsInfo[] = "raises Ditto's\n" "Defense."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7063,8 +7906,8 @@ const struct Item gItemsInfo[] = [ITEM_QUICK_POWDER] = { - .name = _("Quick Powder"), - .pluralName = _("Quick Powder"), + .name = ITEM_NAME("Quick Powder"), + .pluralName = ITEM_PLURAL_NAME("Quick Powder"), .price = (I_PRICE >= GEN_7) ? 1000 : 10, .holdEffect = HOLD_EFFECT_QUICK_POWDER, .description = COMPOUND_STRING( @@ -7072,6 +7915,7 @@ const struct Item gItemsInfo[] = "raises the Speed\n" "of Ditto."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7081,7 +7925,7 @@ const struct Item gItemsInfo[] = [ITEM_DEEP_SEA_SCALE] = { - .name = _("Deep Sea Scale"), + .name = ITEM_NAME("Deep Sea Scale"), .price = (I_PRICE >= GEN_7) ? 2000 : 200, .holdEffect = HOLD_EFFECT_DEEP_SEA_SCALE, .description = COMPOUND_STRING( @@ -7089,6 +7933,7 @@ const struct Item gItemsInfo[] = "raises the Sp. Def\n" "of Clamperl."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -7099,8 +7944,8 @@ const struct Item gItemsInfo[] = [ITEM_DEEP_SEA_TOOTH] = { - .name = _("Deep Sea Tooth"), - .pluralName = _("Deep Sea Teeth"), + .name = ITEM_NAME("Deep Sea Tooth"), + .pluralName = ITEM_PLURAL_NAME("Deep Sea Teeth"), .price = (I_PRICE >= GEN_7) ? 2000 : 200, .holdEffect = HOLD_EFFECT_DEEP_SEA_TOOTH, .description = COMPOUND_STRING( @@ -7108,6 +7953,7 @@ const struct Item gItemsInfo[] = "raises the Sp. Atk\n" "of Clamperl."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -7118,7 +7964,7 @@ const struct Item gItemsInfo[] = [ITEM_SOUL_DEW] = { - .name = _("Soul Dew"), + .name = ITEM_NAME("Soul Dew"), .price = (I_PRICE >= GEN_7) ? 0 : 200, .holdEffect = HOLD_EFFECT_SOUL_DEW, .holdEffectParam = B_SOUL_DEW_BOOST >= GEN_7 ? 20 : 50, @@ -7133,6 +7979,7 @@ const struct Item gItemsInfo[] = "Latios & Latias."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SPECIAL_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -7142,7 +7989,7 @@ const struct Item gItemsInfo[] = [ITEM_ADAMANT_ORB] = { - .name = _("Adamant Orb"), + .name = ITEM_NAME("Adamant Orb"), .price = (I_PRICE >= GEN_7) ? 0 : 10000, .holdEffect = HOLD_EFFECT_ADAMANT_ORB, .holdEffectParam = 20, @@ -7151,6 +7998,7 @@ const struct Item gItemsInfo[] = "Dragon and Steel-\n" "type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SPECIAL_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -7160,7 +8008,7 @@ const struct Item gItemsInfo[] = [ITEM_LUSTROUS_ORB] = { - .name = _("Lustrous Orb"), + .name = ITEM_NAME("Lustrous Orb"), .price = (I_PRICE >= GEN_7) ? 0 : 10000, .holdEffect = HOLD_EFFECT_LUSTROUS_ORB, .holdEffectParam = 20, @@ -7169,6 +8017,7 @@ const struct Item gItemsInfo[] = "Dragon and Water-\n" "type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SPECIAL_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -7178,7 +8027,7 @@ const struct Item gItemsInfo[] = [ITEM_GRISEOUS_ORB] = { - .name = _("Griseous Orb"), + .name = ITEM_NAME("Griseous Orb"), .price = (I_PRICE >= GEN_7) ? 0 : 10000, .holdEffect = HOLD_EFFECT_GRISEOUS_ORB, .holdEffectParam = 20, @@ -7187,6 +8036,7 @@ const struct Item gItemsInfo[] = "Dragon and Ghost-\n" "type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SPECIAL_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -7198,12 +8048,13 @@ const struct Item gItemsInfo[] = [ITEM_SEA_INCENSE] = { - .name = _("Sea Incense"), + .name = ITEM_NAME("Sea Incense"), .price = (I_PRICE >= GEN_7) ? 2000 : 9600, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = 20, .description = sSeaIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_INCENSE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_WATER, @@ -7214,7 +8065,7 @@ const struct Item gItemsInfo[] = [ITEM_LAX_INCENSE] = { - .name = _("Lax Incense"), + .name = ITEM_NAME("Lax Incense"), .price = (I_PRICE >= GEN_7) ? 5000 : 9600, .holdEffect = HOLD_EFFECT_EVASION_UP, .holdEffectParam = 10, @@ -7223,6 +8074,7 @@ const struct Item gItemsInfo[] = "slightly lowers the\n" "foe's accuracy."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_INCENSE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7232,12 +8084,13 @@ const struct Item gItemsInfo[] = [ITEM_ODD_INCENSE] = { - .name = _("Odd Incense"), + .name = ITEM_NAME("Odd Incense"), .price = (I_PRICE >= GEN_7) ? 2000 : 9600, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = 20, .description = sOddIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_INCENSE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_PSYCHIC, @@ -7248,12 +8101,13 @@ const struct Item gItemsInfo[] = [ITEM_ROCK_INCENSE] = { - .name = _("Rock Incense"), + .name = ITEM_NAME("Rock Incense"), .price = (I_PRICE >= GEN_7) ? 2000 : 9600, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = 20, .description = sRockIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_INCENSE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ROCK, @@ -7264,12 +8118,13 @@ const struct Item gItemsInfo[] = [ITEM_FULL_INCENSE] = { - .name = _("Full Incense"), + .name = ITEM_NAME("Full Incense"), .price = (I_PRICE >= GEN_7) ? 5000 : 9600, .holdEffect = HOLD_EFFECT_LAGGING_TAIL, .holdEffectParam = 5, .description = sFullIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_INCENSE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7279,12 +8134,13 @@ const struct Item gItemsInfo[] = [ITEM_WAVE_INCENSE] = { - .name = _("Wave Incense"), + .name = ITEM_NAME("Wave Incense"), .price = (I_PRICE >= GEN_7) ? 2000 : 9600, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = 20, .description = sSeaIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_INCENSE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_WATER, @@ -7295,12 +8151,13 @@ const struct Item gItemsInfo[] = [ITEM_ROSE_INCENSE] = { - .name = _("Rose Incense"), + .name = ITEM_NAME("Rose Incense"), .price = (I_PRICE >= GEN_7) ? 2000 : 9600, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = 20, .description = sRoseIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_INCENSE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GRASS, @@ -7311,11 +8168,12 @@ const struct Item gItemsInfo[] = [ITEM_LUCK_INCENSE] = { - .name = _("Luck Incense"), + .name = ITEM_NAME("Luck Incense"), .price = (I_PRICE >= GEN_7) ? 11000 : 9600, .holdEffect = HOLD_EFFECT_DOUBLE_PRIZE, .description = sLuckIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_INCENSE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7325,11 +8183,12 @@ const struct Item gItemsInfo[] = [ITEM_PURE_INCENSE] = { - .name = _("Pure Incense"), + .name = ITEM_NAME("Pure Incense"), .price = (I_PRICE >= GEN_7) ? 6000 : 9600, .holdEffect = HOLD_EFFECT_REPEL, .description = sPureIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_INCENSE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7341,14 +8200,15 @@ const struct Item gItemsInfo[] = [ITEM_RED_SCARF] = { - .name = _("Red Scarf"), - .pluralName = _("Red Scarves"), + .name = ITEM_NAME("Red Scarf"), + .pluralName = ITEM_PLURAL_NAME("Red Scarves"), .price = 100, .description = COMPOUND_STRING( "A hold item that\n" "raises Cool in\n" "Contests."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_CONTEST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7358,14 +8218,15 @@ const struct Item gItemsInfo[] = [ITEM_BLUE_SCARF] = { - .name = _("Blue Scarf"), - .pluralName = _("Blue Scarves"), + .name = ITEM_NAME("Blue Scarf"), + .pluralName = ITEM_PLURAL_NAME("Blue Scarves"), .price = 100, .description = COMPOUND_STRING( "A hold item that\n" "raises Beauty in\n" "Contests."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_CONTEST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7375,14 +8236,15 @@ const struct Item gItemsInfo[] = [ITEM_PINK_SCARF] = { - .name = _("Pink Scarf"), - .pluralName = _("Pink Scarves"), + .name = ITEM_NAME("Pink Scarf"), + .pluralName = ITEM_PLURAL_NAME("Pink Scarves"), .price = 100, .description = COMPOUND_STRING( "A hold item that\n" "raises Cute in\n" "Contests."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_CONTEST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7392,14 +8254,15 @@ const struct Item gItemsInfo[] = [ITEM_GREEN_SCARF] = { - .name = _("Green Scarf"), - .pluralName = _("Green Scarves"), + .name = ITEM_NAME("Green Scarf"), + .pluralName = ITEM_PLURAL_NAME("Green Scarves"), .price = 100, .description = COMPOUND_STRING( "A hold item that\n" "raises Smart in\n" "Contests."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_CONTEST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7409,14 +8272,15 @@ const struct Item gItemsInfo[] = [ITEM_YELLOW_SCARF] = { - .name = _("Yellow Scarf"), - .pluralName = _("Yellow Scarves"), + .name = ITEM_NAME("Yellow Scarf"), + .pluralName = ITEM_PLURAL_NAME("Yellow Scarves"), .price = 100, .description = COMPOUND_STRING( "A hold item that\n" "raises Tough in\n" "Contests."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_CONTEST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7428,7 +8292,7 @@ const struct Item gItemsInfo[] = [ITEM_MACHO_BRACE] = { - .name = _("Macho Brace"), + .name = ITEM_NAME("Macho Brace"), .price = 3000, .holdEffect = HOLD_EFFECT_MACHO_BRACE, .description = COMPOUND_STRING( @@ -7436,6 +8300,7 @@ const struct Item gItemsInfo[] = "promotes growth,\n" "but reduces Speed."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EV_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -7445,7 +8310,7 @@ const struct Item gItemsInfo[] = [ITEM_POWER_WEIGHT] = { - .name = _("Power Weight"), + .name = ITEM_NAME("Power Weight"), .price = (I_PRICE >= GEN_9) ? 10000 : 3000, .holdEffect = HOLD_EFFECT_POWER_ITEM, .holdEffectParam = POWER_ITEM_BOOST, @@ -7454,6 +8319,7 @@ const struct Item gItemsInfo[] = "promotes HP gain,\n" "but reduces Speed."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EV_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = STAT_HP, @@ -7464,7 +8330,7 @@ const struct Item gItemsInfo[] = [ITEM_POWER_BRACER] = { - .name = _("Power Bracer"), + .name = ITEM_NAME("Power Bracer"), .price = (I_PRICE >= GEN_9) ? 10000 : 3000, .holdEffect = HOLD_EFFECT_POWER_ITEM, .holdEffectParam = POWER_ITEM_BOOST, @@ -7473,6 +8339,7 @@ const struct Item gItemsInfo[] = "promotes Atk gain,\n" "but reduces Speed."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EV_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = STAT_ATK, @@ -7483,7 +8350,7 @@ const struct Item gItemsInfo[] = [ITEM_POWER_BELT] = { - .name = _("Power Belt"), + .name = ITEM_NAME("Power Belt"), .price = (I_PRICE >= GEN_9) ? 10000 : 3000, .holdEffect = HOLD_EFFECT_POWER_ITEM, .holdEffectParam = POWER_ITEM_BOOST, @@ -7492,6 +8359,7 @@ const struct Item gItemsInfo[] = "promotes Def gain,\n" "but reduces Speed."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EV_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = STAT_DEF, @@ -7502,8 +8370,8 @@ const struct Item gItemsInfo[] = [ITEM_POWER_LENS] = { - .name = _("Power Lens"), - .pluralName = _("Power Lenses"), + .name = ITEM_NAME("Power Lens"), + .pluralName = ITEM_PLURAL_NAME("Power Lenses"), .price = (I_PRICE >= GEN_9) ? 10000 : 3000, .holdEffect = HOLD_EFFECT_POWER_ITEM, .holdEffectParam = POWER_ITEM_BOOST, @@ -7512,6 +8380,7 @@ const struct Item gItemsInfo[] = "motes Sp. Atk gain,\n" "but reduces Speed."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EV_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = STAT_SPATK, @@ -7522,7 +8391,7 @@ const struct Item gItemsInfo[] = [ITEM_POWER_BAND] = { - .name = _("Power Band"), + .name = ITEM_NAME("Power Band"), .price = (I_PRICE >= GEN_9) ? 10000 : 3000, .holdEffect = HOLD_EFFECT_POWER_ITEM, .holdEffectParam = POWER_ITEM_BOOST, @@ -7531,6 +8400,7 @@ const struct Item gItemsInfo[] = "motes Sp. Def gain,\n" "but reduces Speed."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EV_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = STAT_SPDEF, @@ -7541,7 +8411,7 @@ const struct Item gItemsInfo[] = [ITEM_POWER_ANKLET] = { - .name = _("Power Anklet"), + .name = ITEM_NAME("Power Anklet"), .price = (I_PRICE >= GEN_9) ? 10000 : 3000, .holdEffect = HOLD_EFFECT_POWER_ITEM, .holdEffectParam = POWER_ITEM_BOOST, @@ -7550,6 +8420,7 @@ const struct Item gItemsInfo[] = "promotes Spd gain,\n" "but reduces Speed."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EV_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = STAT_SPEED, @@ -7562,8 +8433,8 @@ const struct Item gItemsInfo[] = [ITEM_SILK_SCARF] = { - .name = _("Silk Scarf"), - .pluralName = _("Silk Scarves"), + .name = ITEM_NAME("Silk Scarf"), + .pluralName = ITEM_PLURAL_NAME("Silk Scarves"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -7572,6 +8443,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Normal-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_NORMAL, @@ -7582,7 +8454,7 @@ const struct Item gItemsInfo[] = [ITEM_CHARCOAL] = { - .name = _("Charcoal"), + .name = ITEM_NAME("Charcoal"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 9800), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -7591,6 +8463,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Fire-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIRE, @@ -7601,8 +8474,8 @@ const struct Item gItemsInfo[] = [ITEM_MYSTIC_WATER] = { - .name = _("Mystic Water"), - .pluralName = _("Mystic Water"), + .name = ITEM_NAME("Mystic Water"), + .pluralName = ITEM_PLURAL_NAME("Mystic Water"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -7611,6 +8484,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Water-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_WATER, @@ -7621,7 +8495,7 @@ const struct Item gItemsInfo[] = [ITEM_MAGNET] = { - .name = _("Magnet"), + .name = ITEM_NAME("Magnet"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -7630,6 +8504,7 @@ const struct Item gItemsInfo[] = "boosts Electric-\n" "type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ELECTRIC, @@ -7640,12 +8515,13 @@ const struct Item gItemsInfo[] = [ITEM_MIRACLE_SEED] = { - .name = _("Miracle Seed"), + .name = ITEM_NAME("Miracle Seed"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = sRoseIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GRASS, @@ -7656,8 +8532,8 @@ const struct Item gItemsInfo[] = [ITEM_NEVER_MELT_ICE] = { - .name = _("Never-Melt Ice"), - .pluralName = _("Never-Melt Ice"), + .name = ITEM_NAME("Never-Melt Ice"), + .pluralName = ITEM_PLURAL_NAME("Never-Melt Ice"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -7666,6 +8542,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Ice-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ICE, @@ -7676,7 +8553,7 @@ const struct Item gItemsInfo[] = [ITEM_BLACK_BELT] = { - .name = _("Black Belt"), + .name = ITEM_NAME("Black Belt"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -7685,6 +8562,7 @@ const struct Item gItemsInfo[] = "boosts Fighting-\n" "type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIGHTING, @@ -7695,7 +8573,7 @@ const struct Item gItemsInfo[] = [ITEM_POISON_BARB] = { - .name = _("Poison Barb"), + .name = ITEM_NAME("Poison Barb"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -7704,6 +8582,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Poison-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_POISON, @@ -7714,8 +8593,8 @@ const struct Item gItemsInfo[] = [ITEM_SOFT_SAND] = { - .name = _("Soft Sand"), - .pluralName = _("Soft Sand"), + .name = ITEM_NAME("Soft Sand"), + .pluralName = ITEM_PLURAL_NAME("Soft Sand"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -7724,6 +8603,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Ground-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GROUND, @@ -7734,7 +8614,7 @@ const struct Item gItemsInfo[] = [ITEM_SHARP_BEAK] = { - .name = _("Sharp Beak"), + .name = ITEM_NAME("Sharp Beak"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -7743,6 +8623,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Flying-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FLYING, @@ -7753,12 +8634,13 @@ const struct Item gItemsInfo[] = [ITEM_TWISTED_SPOON] = { - .name = _("Twisted Spoon"), + .name = ITEM_NAME("Twisted Spoon"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = sOddIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_PSYCHIC, @@ -7769,8 +8651,8 @@ const struct Item gItemsInfo[] = [ITEM_SILVER_POWDER] = { - .name = _("Silver Powder"), - .pluralName = _("Silver Powder"), + .name = ITEM_NAME("Silver Powder"), + .pluralName = ITEM_PLURAL_NAME("Silver Powder"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -7779,6 +8661,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Bug-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_BUG, @@ -7789,12 +8672,13 @@ const struct Item gItemsInfo[] = [ITEM_HARD_STONE] = { - .name = _("Hard Stone"), + .name = ITEM_NAME("Hard Stone"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = sRockIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ROCK, @@ -7805,7 +8689,7 @@ const struct Item gItemsInfo[] = [ITEM_SPELL_TAG] = { - .name = _("Spell Tag"), + .name = ITEM_NAME("Spell Tag"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -7814,6 +8698,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Ghost-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GHOST, @@ -7824,7 +8709,7 @@ const struct Item gItemsInfo[] = [ITEM_DRAGON_FANG] = { - .name = _("Dragon Fang"), + .name = ITEM_NAME("Dragon Fang"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -7833,6 +8718,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Dragon-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DRAGON, @@ -7843,8 +8729,8 @@ const struct Item gItemsInfo[] = [ITEM_BLACK_GLASSES] = { - .name = _("Black Glasses"), - .pluralName = _("Black Glasses"), + .name = ITEM_NAME("Black Glasses"), + .pluralName = ITEM_PLURAL_NAME("Black Glasses"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -7853,6 +8739,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Dark-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DARK, @@ -7863,7 +8750,7 @@ const struct Item gItemsInfo[] = [ITEM_METAL_COAT] = { - .name = _("Metal Coat"), + .name = ITEM_NAME("Metal Coat"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 2000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -7872,6 +8759,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Steel-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -7885,7 +8773,7 @@ const struct Item gItemsInfo[] = [ITEM_CHOICE_BAND] = { - .name = _("Choice Band"), + .name = ITEM_NAME("Choice Band"), .price = (I_PRICE >= GEN_9) ? 100000 : ((I_PRICE >= GEN_7) ? 4000 : 100), .holdEffect = HOLD_EFFECT_CHOICE_BAND, .description = COMPOUND_STRING( @@ -7893,6 +8781,7 @@ const struct Item gItemsInfo[] = "allows the use of\n" "only one move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7902,8 +8791,8 @@ const struct Item gItemsInfo[] = [ITEM_CHOICE_SPECS] = { - .name = _("Choice Specs"), - .pluralName = _("Choice Specs"), + .name = ITEM_NAME("Choice Specs"), + .pluralName = ITEM_PLURAL_NAME("Choice Specs"), .price = (I_PRICE >= GEN_9) ? 100000 : ((I_PRICE >= GEN_7) ? 4000 : 100), .holdEffect = HOLD_EFFECT_CHOICE_SPECS, .description = COMPOUND_STRING( @@ -7911,6 +8800,7 @@ const struct Item gItemsInfo[] = "allows the use of\n" "only one move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7920,8 +8810,8 @@ const struct Item gItemsInfo[] = [ITEM_CHOICE_SCARF] = { - .name = _("Choice Scarf"), - .pluralName = _("Choice Scarves"), + .name = ITEM_NAME("Choice Scarf"), + .pluralName = ITEM_PLURAL_NAME("Choice Scarves"), .price = (I_PRICE >= GEN_9) ? 100000 : ((I_PRICE >= GEN_7) ? 4000 : 100), .holdEffect = HOLD_EFFECT_CHOICE_SCARF, .description = COMPOUND_STRING( @@ -7929,6 +8819,7 @@ const struct Item gItemsInfo[] = "allows the use of\n" "only one move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7940,7 +8831,7 @@ const struct Item gItemsInfo[] = [ITEM_FLAME_ORB] = { - .name = _("Flame Orb"), + .name = ITEM_NAME("Flame Orb"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_FLAME_ORB, .description = COMPOUND_STRING( @@ -7948,6 +8839,7 @@ const struct Item gItemsInfo[] = "inflicts a burn on\n" "holder in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -7957,7 +8849,7 @@ const struct Item gItemsInfo[] = [ITEM_TOXIC_ORB] = { - .name = _("Toxic Orb"), + .name = ITEM_NAME("Toxic Orb"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_TOXIC_ORB, .description = COMPOUND_STRING( @@ -7965,6 +8857,7 @@ const struct Item gItemsInfo[] = "badly poisons the\n" "holder in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -7976,7 +8869,7 @@ const struct Item gItemsInfo[] = [ITEM_DAMP_ROCK] = { - .name = _("Damp Rock"), + .name = ITEM_NAME("Damp Rock"), .price = (I_PRICE >= GEN_9) ? 8000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_DAMP_ROCK, .description = COMPOUND_STRING( @@ -7984,6 +8877,7 @@ const struct Item gItemsInfo[] = "of Rain Dance if\n" "used by the holder."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -7993,7 +8887,7 @@ const struct Item gItemsInfo[] = [ITEM_HEAT_ROCK] = { - .name = _("Heat Rock"), + .name = ITEM_NAME("Heat Rock"), .price = (I_PRICE >= GEN_9) ? 8000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_HEAT_ROCK, .description = COMPOUND_STRING( @@ -8001,6 +8895,7 @@ const struct Item gItemsInfo[] = "of Sunny Day if\n" "used by the holder."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -8010,7 +8905,7 @@ const struct Item gItemsInfo[] = [ITEM_SMOOTH_ROCK] = { - .name = _("Smooth Rock"), + .name = ITEM_NAME("Smooth Rock"), .price = (I_PRICE >= GEN_9) ? 8000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_SMOOTH_ROCK, .description = COMPOUND_STRING( @@ -8018,6 +8913,7 @@ const struct Item gItemsInfo[] = "of Sandstorm if\n" "used by the holder."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8027,7 +8923,7 @@ const struct Item gItemsInfo[] = [ITEM_ICY_ROCK] = { - .name = _("Icy Rock"), + .name = ITEM_NAME("Icy Rock"), .price = (I_PRICE >= GEN_9) ? 8000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_ICY_ROCK, #if B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_HAIL @@ -8047,6 +8943,7 @@ const struct Item gItemsInfo[] = "used by the holder."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 40, @@ -8058,15 +8955,16 @@ const struct Item gItemsInfo[] = [ITEM_ELECTRIC_SEED] = { - .name = _("Electric Seed"), + .name = ITEM_NAME("Electric Seed"), .price = (I_PRICE >= GEN_9) ? 20000 : 4000, - .holdEffect = HOLD_EFFECT_SEEDS, + .holdEffect = HOLD_EFFECT_TERRAIN_SEED, .holdEffectParam = HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN, .description = COMPOUND_STRING( "Boosts Defense on\n" "Electric Terrain,\n" "but only one time."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8076,15 +8974,16 @@ const struct Item gItemsInfo[] = [ITEM_PSYCHIC_SEED] = { - .name = _("Psychic Seed"), + .name = ITEM_NAME("Psychic Seed"), .price = (I_PRICE >= GEN_9) ? 20000 : 4000, - .holdEffect = HOLD_EFFECT_SEEDS, + .holdEffect = HOLD_EFFECT_TERRAIN_SEED, .holdEffectParam = HOLD_EFFECT_PARAM_PSYCHIC_TERRAIN, .description = COMPOUND_STRING( "Boosts Sp. Def. on\n" "Psychic Terrain,\n" "but only one time."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8094,15 +8993,16 @@ const struct Item gItemsInfo[] = [ITEM_MISTY_SEED] = { - .name = _("Misty Seed"), + .name = ITEM_NAME("Misty Seed"), .price = (I_PRICE >= GEN_9) ? 20000 : 4000, - .holdEffect = HOLD_EFFECT_SEEDS, + .holdEffect = HOLD_EFFECT_TERRAIN_SEED, .holdEffectParam = HOLD_EFFECT_PARAM_MISTY_TERRAIN, .description = COMPOUND_STRING( "Boosts Sp. Def. on\n" "Misty Terrain,\n" "but only one time."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8112,15 +9012,16 @@ const struct Item gItemsInfo[] = [ITEM_GRASSY_SEED] = { - .name = _("Grassy Seed"), + .name = ITEM_NAME("Grassy Seed"), .price = (I_PRICE >= GEN_9) ? 20000 : 4000, - .holdEffect = HOLD_EFFECT_SEEDS, + .holdEffect = HOLD_EFFECT_TERRAIN_SEED, .holdEffectParam = HOLD_EFFECT_PARAM_GRASSY_TERRAIN, .description = COMPOUND_STRING( "Boosts Defense on\n" "Grassy Terrain,\n" "but only one time."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8132,7 +9033,7 @@ const struct Item gItemsInfo[] = [ITEM_ABSORB_BULB] = { - .name = _("Absorb Bulb"), + .name = ITEM_NAME("Absorb Bulb"), .price = (I_PRICE >= GEN_9) ? 5000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_ABSORB_BULB, .holdEffectParam = 0, @@ -8141,6 +9042,7 @@ const struct Item gItemsInfo[] = "the holder is hit by\n" "a Water-type move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8150,8 +9052,8 @@ const struct Item gItemsInfo[] = [ITEM_CELL_BATTERY] = { - .name = _("Cell Battery"), - .pluralName = _("Cell Batteries"), + .name = ITEM_NAME("Cell Battery"), + .pluralName = ITEM_PLURAL_NAME("Cell Batteries"), .price = (I_PRICE >= GEN_9) ? 5000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_CELL_BATTERY, .holdEffectParam = 0, @@ -8160,6 +9062,7 @@ const struct Item gItemsInfo[] = "the holder is hit by\n" "an Electric move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8169,8 +9072,8 @@ const struct Item gItemsInfo[] = [ITEM_LUMINOUS_MOSS] = { - .name = _("Luminous Moss"), - .pluralName = _("Luminous Moss"), + .name = ITEM_NAME("Luminous Moss"), + .pluralName = ITEM_PLURAL_NAME("Luminous Moss"), .price = (I_PRICE >= GEN_9) ? 5000 : ((I_PRICE >= GEN_7) ? 4000 : 1000), .holdEffect = HOLD_EFFECT_LUMINOUS_MOSS, .holdEffectParam = 0, @@ -8179,6 +9082,7 @@ const struct Item gItemsInfo[] = "the holder is hit by\n" "a Water-type move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8188,7 +9092,7 @@ const struct Item gItemsInfo[] = [ITEM_SNOWBALL] = { - .name = _("Snowball"), + .name = ITEM_NAME("Snowball"), .price = (I_PRICE >= GEN_9) ? 5000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_SNOWBALL, .holdEffectParam = 0, @@ -8197,6 +9101,7 @@ const struct Item gItemsInfo[] = "holder is hit by an\n" "Ice-type move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8208,8 +9113,8 @@ const struct Item gItemsInfo[] = [ITEM_BRIGHT_POWDER] = { - .name = _("Bright Powder"), - .pluralName = _("Bright Powder"), + .name = ITEM_NAME("Bright Powder"), + .pluralName = ITEM_PLURAL_NAME("Bright Powder"), .price = (I_PRICE >= GEN_9) ? 30000 : ((I_PRICE >= GEN_7) ? 4000 : 10), .holdEffect = HOLD_EFFECT_EVASION_UP, .holdEffectParam = 10, @@ -8218,6 +9123,7 @@ const struct Item gItemsInfo[] = "casts a glare to\n" "reduce accuracy."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8227,7 +9133,7 @@ const struct Item gItemsInfo[] = [ITEM_WHITE_HERB] = { - .name = _("White Herb"), + .name = ITEM_NAME("White Herb"), .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 100), .holdEffect = HOLD_EFFECT_WHITE_HERB, .description = COMPOUND_STRING( @@ -8235,6 +9141,7 @@ const struct Item gItemsInfo[] = "restores any\n" "lowered stat."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8244,7 +9151,7 @@ const struct Item gItemsInfo[] = [ITEM_EXP_SHARE] = { - .name = _("Exp. Share"), + .name = ITEM_NAME("Exp. Share"), .holdEffect = HOLD_EFFECT_EXP_SHARE, #if I_EXP_SHARE_ITEM >= GEN_6 .price = 0, @@ -8260,6 +9167,7 @@ const struct Item gItemsInfo[] = "from battles."), #endif .pocket = I_EXP_SHARE_ITEM >= GEN_6 ? POCKET_KEY_ITEMS : POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_FIELD, .fieldUseFunc = ItemUseOutOfBattle_ExpShare, .flingPower = 30, @@ -8269,7 +9177,7 @@ const struct Item gItemsInfo[] = [ITEM_QUICK_CLAW] = { - .name = _("Quick Claw"), + .name = ITEM_NAME("Quick Claw"), .price = (I_PRICE >= GEN_9) ? 8000 : ((I_PRICE >= GEN_7) ? 4000 : 100), .holdEffect = HOLD_EFFECT_QUICK_CLAW, .holdEffectParam = 20, @@ -8278,6 +9186,7 @@ const struct Item gItemsInfo[] = "occasionally allows\n" "the first strike."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -8287,7 +9196,7 @@ const struct Item gItemsInfo[] = [ITEM_SOOTHE_BELL] = { - .name = _("Soothe Bell"), + .name = ITEM_NAME("Soothe Bell"), .price = (I_PRICE >= GEN_9) ? 5000 : ((I_PRICE >= GEN_7) ? 4000 : 100), .holdEffect = HOLD_EFFECT_FRIENDSHIP_UP, .description = COMPOUND_STRING( @@ -8295,6 +9204,7 @@ const struct Item gItemsInfo[] = "calms spirits and\n" "fosters friendship."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8304,7 +9214,7 @@ const struct Item gItemsInfo[] = [ITEM_MENTAL_HERB] = { - .name = _("Mental Herb"), + .name = ITEM_NAME("Mental Herb"), .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 100), .holdEffect = HOLD_EFFECT_MENTAL_HERB, .description = COMPOUND_STRING( @@ -8318,6 +9228,7 @@ const struct Item gItemsInfo[] = "of infatuation."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8327,12 +9238,13 @@ const struct Item gItemsInfo[] = [ITEM_KINGS_ROCK] = { - .name = _("King's Rock"), + .name = ITEM_NAME("King's Rock"), .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 5000 : 100), .holdEffect = HOLD_EFFECT_FLINCH, .holdEffectParam = 10, .description = sKingsRockDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -8343,11 +9255,12 @@ const struct Item gItemsInfo[] = [ITEM_AMULET_COIN] = { - .name = _("Amulet Coin"), + .name = ITEM_NAME("Amulet Coin"), .price = (I_PRICE >= GEN_9) ? 30000 : ((I_PRICE >= GEN_7) ? 10000 : 100), .holdEffect = HOLD_EFFECT_DOUBLE_PRIZE, .description = sLuckIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8357,11 +9270,12 @@ const struct Item gItemsInfo[] = [ITEM_CLEANSE_TAG] = { - .name = _("Cleanse Tag"), + .name = ITEM_NAME("Cleanse Tag"), .price = (I_PRICE >= GEN_7) ? 5000 : 200, .holdEffect = HOLD_EFFECT_REPEL, .description = sPureIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8371,7 +9285,7 @@ const struct Item gItemsInfo[] = [ITEM_SMOKE_BALL] = { - .name = _("Smoke Ball"), + .name = ITEM_NAME("Smoke Ball"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_CAN_ALWAYS_RUN, .description = COMPOUND_STRING( @@ -8379,6 +9293,7 @@ const struct Item gItemsInfo[] = "assures fleeing\n" "from wild PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8388,7 +9303,7 @@ const struct Item gItemsInfo[] = [ITEM_FOCUS_BAND] = { - .name = _("Focus Band"), + .name = ITEM_NAME("Focus Band"), .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_FOCUS_BAND, .holdEffectParam = 10, @@ -8397,6 +9312,7 @@ const struct Item gItemsInfo[] = "occasionally\n" "prevents fainting."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8406,7 +9322,7 @@ const struct Item gItemsInfo[] = [ITEM_LUCKY_EGG] = { - .name = _("Lucky Egg"), + .name = ITEM_NAME("Lucky Egg"), .price = (I_PRICE >= GEN_7) ? 10000 : 200, .holdEffect = HOLD_EFFECT_LUCKY_EGG, .description = COMPOUND_STRING( @@ -8414,6 +9330,7 @@ const struct Item gItemsInfo[] = "boosts Exp. points\n" "earned in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8423,8 +9340,8 @@ const struct Item gItemsInfo[] = [ITEM_SCOPE_LENS] = { - .name = _("Scope Lens"), - .pluralName = _("Scope Lenses"), + .name = ITEM_NAME("Scope Lens"), + .pluralName = ITEM_PLURAL_NAME("Scope Lenses"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 100), .holdEffect = HOLD_EFFECT_SCOPE_LENS, .description = COMPOUND_STRING( @@ -8432,6 +9349,7 @@ const struct Item gItemsInfo[] = "improves the\n" "critical-hit rate."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8441,8 +9359,8 @@ const struct Item gItemsInfo[] = [ITEM_LEFTOVERS] = { - .name = _("Leftovers"), - .pluralName = _("Leftovers"), + .name = ITEM_NAME("Leftovers"), + .pluralName = ITEM_PLURAL_NAME("Leftovers"), .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_LEFTOVERS, .holdEffectParam = 10, @@ -8451,6 +9369,7 @@ const struct Item gItemsInfo[] = "gradually restores\n" "HP in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8460,7 +9379,7 @@ const struct Item gItemsInfo[] = [ITEM_SHELL_BELL] = { - .name = _("Shell Bell"), + .name = ITEM_NAME("Shell Bell"), .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_SHELL_BELL, .holdEffectParam = 8, @@ -8469,6 +9388,7 @@ const struct Item gItemsInfo[] = "restores HP upon\n" "striking the foe."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8478,8 +9398,8 @@ const struct Item gItemsInfo[] = [ITEM_WIDE_LENS] = { - .name = _("Wide Lens"), - .pluralName = _("Wide Lenses"), + .name = ITEM_NAME("Wide Lens"), + .pluralName = ITEM_PLURAL_NAME("Wide Lenses"), .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_WIDE_LENS, .holdEffectParam = 10, @@ -8488,6 +9408,7 @@ const struct Item gItemsInfo[] = "that boosts the\n" "accuracy of moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8497,7 +9418,7 @@ const struct Item gItemsInfo[] = [ITEM_MUSCLE_BAND] = { - .name = _("Muscle Band"), + .name = ITEM_NAME("Muscle Band"), .price = (I_PRICE >= GEN_9) ? 8000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_MUSCLE_BAND, .holdEffectParam = 10, @@ -8506,6 +9427,7 @@ const struct Item gItemsInfo[] = "boosts the power\n" "of physical moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8515,8 +9437,8 @@ const struct Item gItemsInfo[] = [ITEM_WISE_GLASSES] = { - .name = _("Wise Glasses"), - .pluralName = _("Wise Glasses"), + .name = ITEM_NAME("Wise Glasses"), + .pluralName = ITEM_PLURAL_NAME("Wise Glasses"), .price = (I_PRICE >= GEN_9) ? 8000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_WISE_GLASSES, .holdEffectParam = 10, @@ -8525,6 +9447,7 @@ const struct Item gItemsInfo[] = "that ups the power\n" "of special moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8534,7 +9457,7 @@ const struct Item gItemsInfo[] = [ITEM_EXPERT_BELT] = { - .name = _("Expert Belt"), + .name = ITEM_NAME("Expert Belt"), .price = (I_PRICE >= GEN_9) ? 30000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_EXPERT_BELT, .holdEffectParam = 20, @@ -8543,6 +9466,7 @@ const struct Item gItemsInfo[] = "the power of super\n" "effective moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8552,8 +9476,8 @@ const struct Item gItemsInfo[] = [ITEM_LIGHT_CLAY] = { - .name = _("Light Clay"), - .pluralName = _("Light Clay"), + .name = ITEM_NAME("Light Clay"), + .pluralName = ITEM_PLURAL_NAME("Light Clay"), .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_LIGHT_CLAY, .description = COMPOUND_STRING( @@ -8561,6 +9485,7 @@ const struct Item gItemsInfo[] = "of barrier moves\n" "used by the holder."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8570,7 +9495,7 @@ const struct Item gItemsInfo[] = [ITEM_LIFE_ORB] = { - .name = _("Life Orb"), + .name = ITEM_NAME("Life Orb"), .price = (I_PRICE >= GEN_9) ? 50000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_LIFE_ORB, .description = COMPOUND_STRING( @@ -8578,6 +9503,7 @@ const struct Item gItemsInfo[] = "but holder loses HP\n" "with each attack."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8587,7 +9513,7 @@ const struct Item gItemsInfo[] = [ITEM_POWER_HERB] = { - .name = _("Power Herb"), + .name = ITEM_NAME("Power Herb"), .price = (I_PRICE >= GEN_9) ? 30000 : ((I_PRICE >= GEN_7) ? 4000 : 100), .holdEffect = HOLD_EFFECT_POWER_HERB, .description = COMPOUND_STRING( @@ -8595,6 +9521,7 @@ const struct Item gItemsInfo[] = "use of a move that\n" "charges first."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8604,8 +9531,8 @@ const struct Item gItemsInfo[] = [ITEM_FOCUS_SASH] = { - .name = _("Focus Sash"), - .pluralName = _("Focus Sashes"), + .name = ITEM_NAME("Focus Sash"), + .pluralName = ITEM_PLURAL_NAME("Focus Sashes"), .price = (I_PRICE >= GEN_9) ? 50000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_FOCUS_SASH, .description = COMPOUND_STRING( @@ -8613,6 +9540,7 @@ const struct Item gItemsInfo[] = "full HP, it endures\n" "KO hits with 1 HP."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8622,8 +9550,8 @@ const struct Item gItemsInfo[] = [ITEM_ZOOM_LENS] = { - .name = _("Zoom Lens"), - .pluralName = _("Zoom Lenses"), + .name = ITEM_NAME("Zoom Lens"), + .pluralName = ITEM_PLURAL_NAME("Zoom Lenses"), .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_ZOOM_LENS, .holdEffectParam = 20, @@ -8632,6 +9560,7 @@ const struct Item gItemsInfo[] = "after the foe, it'll\n" "boost accuracy."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8641,7 +9570,7 @@ const struct Item gItemsInfo[] = [ITEM_METRONOME] = { - .name = _("Metronome"), + .name = ITEM_NAME("Metronome"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_METRONOME, .holdEffectParam = 20, @@ -8650,6 +9579,7 @@ const struct Item gItemsInfo[] = "boosts a move used\n" "consecutively."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8659,7 +9589,7 @@ const struct Item gItemsInfo[] = [ITEM_IRON_BALL] = { - .name = _("Iron Ball"), + .name = ITEM_NAME("Iron Ball"), .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_IRON_BALL, .description = COMPOUND_STRING( @@ -8667,6 +9597,7 @@ const struct Item gItemsInfo[] = "becomes vulnerable\n" "to Ground moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 130, @@ -8676,11 +9607,12 @@ const struct Item gItemsInfo[] = [ITEM_LAGGING_TAIL] = { - .name = _("Lagging Tail"), + .name = ITEM_NAME("Lagging Tail"), .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_LAGGING_TAIL, .description = sFullIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8690,7 +9622,7 @@ const struct Item gItemsInfo[] = [ITEM_DESTINY_KNOT] = { - .name = _("Destiny Knot"), + .name = ITEM_NAME("Destiny Knot"), .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_DESTINY_KNOT, .description = COMPOUND_STRING( @@ -8698,6 +9630,7 @@ const struct Item gItemsInfo[] = "in love, the foe\n" "does too."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8707,8 +9640,8 @@ const struct Item gItemsInfo[] = [ITEM_BLACK_SLUDGE] = { - .name = _("Black Sludge"), - .pluralName = _("Black Sludge"), + .name = ITEM_NAME("Black Sludge"), + .pluralName = ITEM_PLURAL_NAME("Black Sludge"), .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_BLACK_SLUDGE, .description = COMPOUND_STRING( @@ -8716,6 +9649,7 @@ const struct Item gItemsInfo[] = "Poison-types.\n" "Damages all others."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8725,7 +9659,7 @@ const struct Item gItemsInfo[] = [ITEM_GRIP_CLAW] = { - .name = _("Grip Claw"), + .name = ITEM_NAME("Grip Claw"), .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GRIP_CLAW, .description = COMPOUND_STRING( @@ -8733,6 +9667,7 @@ const struct Item gItemsInfo[] = "extends binding\n" "moves like Wrap."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 90, @@ -8742,7 +9677,7 @@ const struct Item gItemsInfo[] = [ITEM_STICKY_BARB] = { - .name = _("Sticky Barb"), + .name = ITEM_NAME("Sticky Barb"), .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_STICKY_BARB, .description = COMPOUND_STRING( @@ -8750,6 +9685,7 @@ const struct Item gItemsInfo[] = "each turn. May\n" "latch on to foes."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -8759,7 +9695,7 @@ const struct Item gItemsInfo[] = [ITEM_SHED_SHELL] = { - .name = _("Shed Shell"), + .name = ITEM_NAME("Shed Shell"), .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 100), .holdEffect = HOLD_EFFECT_SHED_SHELL, .description = COMPOUND_STRING( @@ -8767,6 +9703,7 @@ const struct Item gItemsInfo[] = "to switch out\n" "without fail."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8776,7 +9713,7 @@ const struct Item gItemsInfo[] = [ITEM_BIG_ROOT] = { - .name = _("Big Root"), + .name = ITEM_NAME("Big Root"), .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_BIG_ROOT, .holdEffectParam = 30, @@ -8785,6 +9722,7 @@ const struct Item gItemsInfo[] = "ups the power of\n" "HP-stealing moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8794,7 +9732,7 @@ const struct Item gItemsInfo[] = [ITEM_RAZOR_CLAW] = { - .name = _("Razor Claw"), + .name = ITEM_NAME("Razor Claw"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 5000 : 2100), .holdEffect = HOLD_EFFECT_SCOPE_LENS, .description = COMPOUND_STRING( @@ -8802,6 +9740,7 @@ const struct Item gItemsInfo[] = "ups the holder's\n" "critical-hit ratio."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -8812,12 +9751,13 @@ const struct Item gItemsInfo[] = [ITEM_RAZOR_FANG] = { - .name = _("Razor Fang"), + .name = ITEM_NAME("Razor Fang"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 5000 : 2100), .holdEffect = HOLD_EFFECT_FLINCH, .holdEffectParam = 10, .description = sKingsRockDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -8828,7 +9768,7 @@ const struct Item gItemsInfo[] = [ITEM_EVIOLITE] = { - .name = _("Eviolite"), + .name = ITEM_NAME("Eviolite"), .price = (I_PRICE >= GEN_9) ? 50000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_EVIOLITE, .holdEffectParam = 50, @@ -8837,6 +9777,7 @@ const struct Item gItemsInfo[] = "Sp. Def of PokΓ©mon\n" "that can evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 40, @@ -8846,7 +9787,7 @@ const struct Item gItemsInfo[] = [ITEM_FLOAT_STONE] = { - .name = _("Float Stone"), + .name = ITEM_NAME("Float Stone"), .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_FLOAT_STONE, .description = COMPOUND_STRING( @@ -8854,6 +9795,7 @@ const struct Item gItemsInfo[] = "when held, it halves\n" "a PokΓ©mon's weight."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8863,7 +9805,7 @@ const struct Item gItemsInfo[] = [ITEM_ROCKY_HELMET] = { - .name = _("Rocky Helmet"), + .name = ITEM_NAME("Rocky Helmet"), .price = (I_PRICE >= GEN_9) ? 50000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_ROCKY_HELMET, .holdEffectParam = 0, @@ -8872,6 +9814,7 @@ const struct Item gItemsInfo[] = "they touch its\n" "holder."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -8881,7 +9824,7 @@ const struct Item gItemsInfo[] = [ITEM_AIR_BALLOON] = { - .name = _("Air Balloon"), + .name = ITEM_NAME("Air Balloon"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_AIR_BALLOON, .holdEffectParam = 0, @@ -8890,6 +9833,7 @@ const struct Item gItemsInfo[] = "float but bursts\n" "if hit by an attack."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8899,7 +9843,7 @@ const struct Item gItemsInfo[] = [ITEM_RED_CARD] = { - .name = _("Red Card"), + .name = ITEM_NAME("Red Card"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_RED_CARD, .holdEffectParam = 0, @@ -8908,6 +9852,7 @@ const struct Item gItemsInfo[] = "foe if they hit the\n" "holder."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8917,7 +9862,7 @@ const struct Item gItemsInfo[] = [ITEM_RING_TARGET] = { - .name = _("Ring Target"), + .name = ITEM_NAME("Ring Target"), .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_RING_TARGET, .holdEffectParam = 0, @@ -8926,6 +9871,7 @@ const struct Item gItemsInfo[] = "have no effect will\n" "hit the holder."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8935,7 +9881,7 @@ const struct Item gItemsInfo[] = [ITEM_BINDING_BAND] = { - .name = _("Binding Band"), + .name = ITEM_NAME("Binding Band"), .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_BINDING_BAND, .description = COMPOUND_STRING( @@ -8943,6 +9889,7 @@ const struct Item gItemsInfo[] = "power of binding\n" "moves when held."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8952,7 +9899,7 @@ const struct Item gItemsInfo[] = [ITEM_EJECT_BUTTON] = { - .name = _("Eject Button"), + .name = ITEM_NAME("Eject Button"), .price = (I_PRICE >= GEN_9) ? 30000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_EJECT_BUTTON, .holdEffectParam = 0, @@ -8961,6 +9908,7 @@ const struct Item gItemsInfo[] = "user if they're hit\n" "by the foe."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8970,8 +9918,8 @@ const struct Item gItemsInfo[] = [ITEM_WEAKNESS_POLICY] = { - .name = _("Weakness Policy"), - .pluralName = _("Weakness Policies"), + .name = ITEM_NAME("Weakness Policy"), + .pluralName = ITEM_PLURAL_NAME("Weakness Policies"), .price = (I_PRICE >= GEN_9) ? 50000 : 1000, .holdEffect = HOLD_EFFECT_WEAKNESS_POLICY, .holdEffectParam = 0, @@ -8980,6 +9928,7 @@ const struct Item gItemsInfo[] = "effective move,\n" "ups Atk and Sp. Atk."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -8989,7 +9938,7 @@ const struct Item gItemsInfo[] = [ITEM_ASSAULT_VEST] = { - .name = _("Assault Vest"), + .name = ITEM_NAME("Assault Vest"), .price = (I_PRICE >= GEN_9) ? 50000 : 1000, .holdEffect = HOLD_EFFECT_ASSAULT_VEST, .holdEffectParam = 50, @@ -8998,6 +9947,7 @@ const struct Item gItemsInfo[] = "prevents the use\n" "of status moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -9007,8 +9957,8 @@ const struct Item gItemsInfo[] = [ITEM_SAFETY_GOGGLES] = { - .name = _("Safety Goggles"), - .pluralName = _("Safety Goggles"), + .name = ITEM_NAME("Safety Goggles"), + .pluralName = ITEM_PLURAL_NAME("Safety Goggles"), .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 1000), .holdEffect = HOLD_EFFECT_SAFETY_GOGGLES, .description = COMPOUND_STRING( @@ -9016,6 +9966,7 @@ const struct Item gItemsInfo[] = "weather damage and\n" "powder moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -9025,7 +9976,7 @@ const struct Item gItemsInfo[] = [ITEM_ADRENALINE_ORB] = { - .name = _("Adrenaline Orb"), + .name = ITEM_NAME("Adrenaline Orb"), .price = (I_PRICE >= GEN_9) ? 5000 : ((I_PRICE >= GEN_8) ? 4000 : 300), .holdEffect = HOLD_EFFECT_ADRENALINE_ORB, .description = COMPOUND_STRING( @@ -9033,6 +9984,7 @@ const struct Item gItemsInfo[] = "Speed if the holder\n" "is intimidated."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -9042,7 +9994,7 @@ const struct Item gItemsInfo[] = [ITEM_TERRAIN_EXTENDER] = { - .name = _("Terrain Extender"), + .name = ITEM_NAME("Terrain Extender"), .price = (I_PRICE >= GEN_9) ? 15000 : 4000, .holdEffect = HOLD_EFFECT_TERRAIN_EXTENDER, .description = COMPOUND_STRING( @@ -9050,6 +10002,7 @@ const struct Item gItemsInfo[] = "of the active\n" "battle terrain."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -9059,8 +10012,8 @@ const struct Item gItemsInfo[] = [ITEM_PROTECTIVE_PADS] = { - .name = _("Protective Pads"), - .pluralName = _("Protective Pads"), + .name = ITEM_NAME("Protective Pads"), + .pluralName = ITEM_PLURAL_NAME("Protective Pads"), .price = (I_PRICE >= GEN_9) ? 15000 : 4000, .holdEffect = HOLD_EFFECT_PROTECTIVE_PADS, .description = COMPOUND_STRING( @@ -9068,6 +10021,7 @@ const struct Item gItemsInfo[] = "from contact move\n" "effects."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -9077,7 +10031,7 @@ const struct Item gItemsInfo[] = [ITEM_THROAT_SPRAY] = { - .name = _("Throat Spray"), + .name = ITEM_NAME("Throat Spray"), .price = (I_PRICE >= GEN_9) ? 20000 : 4000, .holdEffect = HOLD_EFFECT_THROAT_SPRAY, .description = COMPOUND_STRING( @@ -9085,6 +10039,7 @@ const struct Item gItemsInfo[] = "the holder uses a\n" "sound-based move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -9094,7 +10049,7 @@ const struct Item gItemsInfo[] = [ITEM_EJECT_PACK] = { - .name = _("Eject Pack"), + .name = ITEM_NAME("Eject Pack"), .price = (I_PRICE >= GEN_9) ? 30000 : 4000, .holdEffect = HOLD_EFFECT_EJECT_PACK, .description = COMPOUND_STRING( @@ -9102,6 +10057,7 @@ const struct Item gItemsInfo[] = "switch if its stats\n" "are lowered."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 50, @@ -9111,8 +10067,8 @@ const struct Item gItemsInfo[] = [ITEM_HEAVY_DUTY_BOOTS] = { - .name = _("Heavy-Duty Boots"), - .pluralName = _("Heavy-Duty Boots"), + .name = ITEM_NAME("Heavy-Duty Boots"), + .pluralName = ITEM_PLURAL_NAME("Heavy-Duty Boots"), .price = (I_PRICE >= GEN_9) ? 20000 : 4000, .holdEffect = HOLD_EFFECT_HEAVY_DUTY_BOOTS, .description = COMPOUND_STRING( @@ -9120,6 +10076,7 @@ const struct Item gItemsInfo[] = "effects of traps\n" "set in the field."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -9129,8 +10086,8 @@ const struct Item gItemsInfo[] = [ITEM_BLUNDER_POLICY] = { - .name = _("Blunder Policy"), - .pluralName = _("Blunder Policies"), + .name = ITEM_NAME("Blunder Policy"), + .pluralName = ITEM_PLURAL_NAME("Blunder Policies"), .price = (I_PRICE >= GEN_9) ? 30000 : 4000, .holdEffect = HOLD_EFFECT_BLUNDER_POLICY, .description = COMPOUND_STRING( @@ -9138,6 +10095,7 @@ const struct Item gItemsInfo[] = "the user misses\n" "due to Accuracy."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -9147,7 +10105,7 @@ const struct Item gItemsInfo[] = [ITEM_ROOM_SERVICE] = { - .name = _("Room Service"), + .name = ITEM_NAME("Room Service"), .price = (I_PRICE >= GEN_9) ? 20000 : 4000, .holdEffect = HOLD_EFFECT_ROOM_SERVICE, .description = COMPOUND_STRING( @@ -9155,6 +10113,7 @@ const struct Item gItemsInfo[] = "Trick Room is\n" "active."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -9164,7 +10123,7 @@ const struct Item gItemsInfo[] = [ITEM_UTILITY_UMBRELLA] = { - .name = _("Utility Umbrella"), + .name = ITEM_NAME("Utility Umbrella"), .price = (I_PRICE >= GEN_9) ? 15000 : 4000, .holdEffect = HOLD_EFFECT_UTILITY_UMBRELLA, .description = COMPOUND_STRING( @@ -9172,6 +10131,7 @@ const struct Item gItemsInfo[] = "protects from\n" "weather effects."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -9183,8 +10143,8 @@ const struct Item gItemsInfo[] = [ITEM_CHERI_BERRY] = { - .name = _("Cheri Berry"), - .pluralName = _("Cheri Berries"), + .name = ITEM_NAME("Cheri Berry"), + .pluralName = ITEM_PLURAL_NAME("Cheri Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CURE_PAR, .description = COMPOUND_STRING( @@ -9203,8 +10163,8 @@ const struct Item gItemsInfo[] = [ITEM_CHESTO_BERRY] = { - .name = _("Chesto Berry"), - .pluralName = _("Chesto Berries"), + .name = ITEM_NAME("Chesto Berry"), + .pluralName = ITEM_PLURAL_NAME("Chesto Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CURE_SLP, .description = COMPOUND_STRING( @@ -9223,8 +10183,8 @@ const struct Item gItemsInfo[] = [ITEM_PECHA_BERRY] = { - .name = _("Pecha Berry"), - .pluralName = _("Pecha Berries"), + .name = ITEM_NAME("Pecha Berry"), + .pluralName = ITEM_PLURAL_NAME("Pecha Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CURE_PSN, .description = COMPOUND_STRING( @@ -9243,8 +10203,8 @@ const struct Item gItemsInfo[] = [ITEM_RAWST_BERRY] = { - .name = _("Rawst Berry"), - .pluralName = _("Rawst Berries"), + .name = ITEM_NAME("Rawst Berry"), + .pluralName = ITEM_PLURAL_NAME("Rawst Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CURE_BRN, .description = COMPOUND_STRING( @@ -9263,8 +10223,8 @@ const struct Item gItemsInfo[] = [ITEM_ASPEAR_BERRY] = { - .name = _("Aspear Berry"), - .pluralName = _("Aspear Berries"), + .name = ITEM_NAME("Aspear Berry"), + .pluralName = ITEM_PLURAL_NAME("Aspear Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CURE_FRZ, .description = COMPOUND_STRING( @@ -9283,8 +10243,8 @@ const struct Item gItemsInfo[] = [ITEM_LEPPA_BERRY] = { - .name = _("Leppa Berry"), - .pluralName = _("Leppa Berries"), + .name = ITEM_NAME("Leppa Berry"), + .pluralName = ITEM_PLURAL_NAME("Leppa Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESTORE_PP, .holdEffectParam = 10, @@ -9304,8 +10264,8 @@ const struct Item gItemsInfo[] = [ITEM_ORAN_BERRY] = { - .name = _("Oran Berry"), - .pluralName = _("Oran Berries"), + .name = ITEM_NAME("Oran Berry"), + .pluralName = ITEM_PLURAL_NAME("Oran Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESTORE_HP, .holdEffectParam = 10, @@ -9325,8 +10285,8 @@ const struct Item gItemsInfo[] = [ITEM_PERSIM_BERRY] = { - .name = _("Persim Berry"), - .pluralName = _("Persim Berries"), + .name = ITEM_NAME("Persim Berry"), + .pluralName = ITEM_PLURAL_NAME("Persim Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CURE_CONFUSION, .description = COMPOUND_STRING( @@ -9334,7 +10294,7 @@ const struct Item gItemsInfo[] = "heals confusion\n" "in battle."), .pocket = POCKET_BERRIES, - .type = ITEM_USE_BAG_MENU, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_CURE_STATUS, .effect = gItemEffect_PersimBerry, @@ -9345,8 +10305,8 @@ const struct Item gItemsInfo[] = [ITEM_LUM_BERRY] = { - .name = _("Lum Berry"), - .pluralName = _("Lum Berries"), + .name = ITEM_NAME("Lum Berry"), + .pluralName = ITEM_PLURAL_NAME("Lum Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CURE_STATUS, .description = COMPOUND_STRING( @@ -9365,8 +10325,8 @@ const struct Item gItemsInfo[] = [ITEM_SITRUS_BERRY] = { - .name = _("Sitrus Berry"), - .pluralName = _("Sitrus Berries"), + .name = ITEM_NAME("Sitrus Berry"), + .pluralName = ITEM_PLURAL_NAME("Sitrus Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, #if I_SITRUS_BERRY_HEAL >= GEN_4 .holdEffect = HOLD_EFFECT_RESTORE_PCT_HP, @@ -9395,8 +10355,8 @@ const struct Item gItemsInfo[] = [ITEM_FIGY_BERRY] = { - .name = _("Figy Berry"), - .pluralName = _("Figy Berries"), + .name = ITEM_NAME("Figy Berry"), + .pluralName = ITEM_PLURAL_NAME("Figy Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CONFUSE_SPICY, .holdEffectParam = CONFUSE_BERRY_HEAL_FRACTION, @@ -9411,8 +10371,8 @@ const struct Item gItemsInfo[] = [ITEM_WIKI_BERRY] = { - .name = _("Wiki Berry"), - .pluralName = _("Wiki Berries"), + .name = ITEM_NAME("Wiki Berry"), + .pluralName = ITEM_PLURAL_NAME("Wiki Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CONFUSE_DRY, .holdEffectParam = CONFUSE_BERRY_HEAL_FRACTION, @@ -9427,8 +10387,8 @@ const struct Item gItemsInfo[] = [ITEM_MAGO_BERRY] = { - .name = _("Mago Berry"), - .pluralName = _("Mago Berries"), + .name = ITEM_NAME("Mago Berry"), + .pluralName = ITEM_PLURAL_NAME("Mago Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CONFUSE_SWEET, .holdEffectParam = CONFUSE_BERRY_HEAL_FRACTION, @@ -9443,8 +10403,8 @@ const struct Item gItemsInfo[] = [ITEM_AGUAV_BERRY] = { - .name = _("Aguav Berry"), - .pluralName = _("Aguav Berries"), + .name = ITEM_NAME("Aguav Berry"), + .pluralName = ITEM_PLURAL_NAME("Aguav Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CONFUSE_BITTER, .holdEffectParam = CONFUSE_BERRY_HEAL_FRACTION, @@ -9459,8 +10419,8 @@ const struct Item gItemsInfo[] = [ITEM_IAPAPA_BERRY] = { - .name = _("Iapapa Berry"), - .pluralName = _("Iapapa Berries"), + .name = ITEM_NAME("Iapapa Berry"), + .pluralName = ITEM_PLURAL_NAME("Iapapa Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CONFUSE_SOUR, .holdEffectParam = CONFUSE_BERRY_HEAL_FRACTION, @@ -9475,8 +10435,8 @@ const struct Item gItemsInfo[] = [ITEM_RAZZ_BERRY] = { - .name = _("Razz Berry"), - .pluralName = _("Razz Berries"), + .name = ITEM_NAME("Razz Berry"), + .pluralName = ITEM_PLURAL_NAME("Razz Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -9492,8 +10452,8 @@ const struct Item gItemsInfo[] = [ITEM_BLUK_BERRY] = { - .name = _("Bluk Berry"), - .pluralName = _("Bluk Berries"), + .name = ITEM_NAME("Bluk Berry"), + .pluralName = ITEM_PLURAL_NAME("Bluk Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -9509,8 +10469,8 @@ const struct Item gItemsInfo[] = [ITEM_NANAB_BERRY] = { - .name = _("Nanab Berry"), - .pluralName = _("Nanab Berries"), + .name = ITEM_NAME("Nanab Berry"), + .pluralName = ITEM_PLURAL_NAME("Nanab Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -9526,8 +10486,8 @@ const struct Item gItemsInfo[] = [ITEM_WEPEAR_BERRY] = { - .name = _("Wepear Berry"), - .pluralName = _("Wepear Berries"), + .name = ITEM_NAME("Wepear Berry"), + .pluralName = ITEM_PLURAL_NAME("Wepear Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -9543,8 +10503,8 @@ const struct Item gItemsInfo[] = [ITEM_PINAP_BERRY] = { - .name = _("Pinap Berry"), - .pluralName = _("Pinap Berries"), + .name = ITEM_NAME("Pinap Berry"), + .pluralName = ITEM_PLURAL_NAME("Pinap Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -9560,8 +10520,8 @@ const struct Item gItemsInfo[] = [ITEM_POMEG_BERRY] = { - .name = _("Pomeg Berry"), - .pluralName = _("Pomeg Berries"), + .name = ITEM_NAME("Pomeg Berry"), + .pluralName = ITEM_PLURAL_NAME("Pomeg Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "Makes a PokΓ©mon\n" @@ -9578,8 +10538,8 @@ const struct Item gItemsInfo[] = [ITEM_KELPSY_BERRY] = { - .name = _("Kelpsy Berry"), - .pluralName = _("Kelpsy Berries"), + .name = ITEM_NAME("Kelpsy Berry"), + .pluralName = ITEM_PLURAL_NAME("Kelpsy Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "Makes a PokΓ©mon\n" @@ -9596,8 +10556,8 @@ const struct Item gItemsInfo[] = [ITEM_QUALOT_BERRY] = { - .name = _("Qualot Berry"), - .pluralName = _("Qualot Berries"), + .name = ITEM_NAME("Qualot Berry"), + .pluralName = ITEM_PLURAL_NAME("Qualot Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "Makes a PokΓ©mon\n" @@ -9614,8 +10574,8 @@ const struct Item gItemsInfo[] = [ITEM_HONDEW_BERRY] = { - .name = _("Hondew Berry"), - .pluralName = _("Hondew Berries"), + .name = ITEM_NAME("Hondew Berry"), + .pluralName = ITEM_PLURAL_NAME("Hondew Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "Makes a PokΓ©mon\n" @@ -9632,8 +10592,8 @@ const struct Item gItemsInfo[] = [ITEM_GREPA_BERRY] = { - .name = _("Grepa Berry"), - .pluralName = _("Grepa Berries"), + .name = ITEM_NAME("Grepa Berry"), + .pluralName = ITEM_PLURAL_NAME("Grepa Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "Makes a PokΓ©mon\n" @@ -9650,8 +10610,8 @@ const struct Item gItemsInfo[] = [ITEM_TAMATO_BERRY] = { - .name = _("Tamato Berry"), - .pluralName = _("Tamato Berries"), + .name = ITEM_NAME("Tamato Berry"), + .pluralName = ITEM_PLURAL_NAME("Tamato Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "Makes a PokΓ©mon\n" @@ -9668,8 +10628,8 @@ const struct Item gItemsInfo[] = [ITEM_CORNN_BERRY] = { - .name = _("Cornn Berry"), - .pluralName = _("Cornn Berries"), + .name = ITEM_NAME("Cornn Berry"), + .pluralName = ITEM_PLURAL_NAME("Cornn Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -9685,8 +10645,8 @@ const struct Item gItemsInfo[] = [ITEM_MAGOST_BERRY] = { - .name = _("Magost Berry"), - .pluralName = _("Magost Berries"), + .name = ITEM_NAME("Magost Berry"), + .pluralName = ITEM_PLURAL_NAME("Magost Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -9702,8 +10662,8 @@ const struct Item gItemsInfo[] = [ITEM_RABUTA_BERRY] = { - .name = _("Rabuta Berry"), - .pluralName = _("Rabuta Berries"), + .name = ITEM_NAME("Rabuta Berry"), + .pluralName = ITEM_PLURAL_NAME("Rabuta Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -9719,8 +10679,8 @@ const struct Item gItemsInfo[] = [ITEM_NOMEL_BERRY] = { - .name = _("Nomel Berry"), - .pluralName = _("Nomel Berries"), + .name = ITEM_NAME("Nomel Berry"), + .pluralName = ITEM_PLURAL_NAME("Nomel Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -9736,8 +10696,8 @@ const struct Item gItemsInfo[] = [ITEM_SPELON_BERRY] = { - .name = _("Spelon Berry"), - .pluralName = _("Spelon Berries"), + .name = ITEM_NAME("Spelon Berry"), + .pluralName = ITEM_PLURAL_NAME("Spelon Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -9753,8 +10713,8 @@ const struct Item gItemsInfo[] = [ITEM_PAMTRE_BERRY] = { - .name = _("Pamtre Berry"), - .pluralName = _("Pamtre Berries"), + .name = ITEM_NAME("Pamtre Berry"), + .pluralName = ITEM_PLURAL_NAME("Pamtre Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -9770,8 +10730,8 @@ const struct Item gItemsInfo[] = [ITEM_WATMEL_BERRY] = { - .name = _("Watmel Berry"), - .pluralName = _("Watmel Berries"), + .name = ITEM_NAME("Watmel Berry"), + .pluralName = ITEM_PLURAL_NAME("Watmel Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -9787,8 +10747,8 @@ const struct Item gItemsInfo[] = [ITEM_DURIN_BERRY] = { - .name = _("Durin Berry"), - .pluralName = _("Durin Berries"), + .name = ITEM_NAME("Durin Berry"), + .pluralName = ITEM_PLURAL_NAME("Durin Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -9804,8 +10764,8 @@ const struct Item gItemsInfo[] = [ITEM_BELUE_BERRY] = { - .name = _("Belue Berry"), - .pluralName = _("Belue Berries"), + .name = ITEM_NAME("Belue Berry"), + .pluralName = ITEM_PLURAL_NAME("Belue Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -9821,8 +10781,8 @@ const struct Item gItemsInfo[] = [ITEM_CHILAN_BERRY] = { - .name = _("Chilan Berry"), - .pluralName = _("Chilan Berries"), + .name = ITEM_NAME("Chilan Berry"), + .pluralName = ITEM_PLURAL_NAME("Chilan Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_NORMAL, @@ -9840,8 +10800,8 @@ const struct Item gItemsInfo[] = [ITEM_OCCA_BERRY] = { - .name = _("Occa Berry"), - .pluralName = _("Occa Berries"), + .name = ITEM_NAME("Occa Berry"), + .pluralName = ITEM_PLURAL_NAME("Occa Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_FIRE, @@ -9859,8 +10819,8 @@ const struct Item gItemsInfo[] = [ITEM_PASSHO_BERRY] = { - .name = _("Passho Berry"), - .pluralName = _("Passho Berries"), + .name = ITEM_NAME("Passho Berry"), + .pluralName = ITEM_PLURAL_NAME("Passho Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_WATER, @@ -9878,8 +10838,8 @@ const struct Item gItemsInfo[] = [ITEM_WACAN_BERRY] = { - .name = _("Wacan Berry"), - .pluralName = _("Wacan Berries"), + .name = ITEM_NAME("Wacan Berry"), + .pluralName = ITEM_PLURAL_NAME("Wacan Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_ELECTRIC, @@ -9897,8 +10857,8 @@ const struct Item gItemsInfo[] = [ITEM_RINDO_BERRY] = { - .name = _("Rindo Berry"), - .pluralName = _("Rindo Berries"), + .name = ITEM_NAME("Rindo Berry"), + .pluralName = ITEM_PLURAL_NAME("Rindo Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_GRASS, @@ -9916,8 +10876,8 @@ const struct Item gItemsInfo[] = [ITEM_YACHE_BERRY] = { - .name = _("Yache Berry"), - .pluralName = _("Yache Berries"), + .name = ITEM_NAME("Yache Berry"), + .pluralName = ITEM_PLURAL_NAME("Yache Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_ICE, @@ -9935,8 +10895,8 @@ const struct Item gItemsInfo[] = [ITEM_CHOPLE_BERRY] = { - .name = _("Chople Berry"), - .pluralName = _("Chople Berries"), + .name = ITEM_NAME("Chople Berry"), + .pluralName = ITEM_PLURAL_NAME("Chople Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_FIGHTING, @@ -9954,8 +10914,8 @@ const struct Item gItemsInfo[] = [ITEM_KEBIA_BERRY] = { - .name = _("Kebia Berry"), - .pluralName = _("Kebia Berries"), + .name = ITEM_NAME("Kebia Berry"), + .pluralName = ITEM_PLURAL_NAME("Kebia Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_POISON, @@ -9973,8 +10933,8 @@ const struct Item gItemsInfo[] = [ITEM_SHUCA_BERRY] = { - .name = _("Shuca Berry"), - .pluralName = _("Shuca Berries"), + .name = ITEM_NAME("Shuca Berry"), + .pluralName = ITEM_PLURAL_NAME("Shuca Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_GROUND, @@ -9992,8 +10952,8 @@ const struct Item gItemsInfo[] = [ITEM_COBA_BERRY] = { - .name = _("Coba Berry"), - .pluralName = _("Coba Berries"), + .name = ITEM_NAME("Coba Berry"), + .pluralName = ITEM_PLURAL_NAME("Coba Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_FLYING, @@ -10011,8 +10971,8 @@ const struct Item gItemsInfo[] = [ITEM_PAYAPA_BERRY] = { - .name = _("Payapa Berry"), - .pluralName = _("Payapa Berries"), + .name = ITEM_NAME("Payapa Berry"), + .pluralName = ITEM_PLURAL_NAME("Payapa Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_PSYCHIC, @@ -10030,8 +10990,8 @@ const struct Item gItemsInfo[] = [ITEM_TANGA_BERRY] = { - .name = _("Tanga Berry"), - .pluralName = _("Tanga Berries"), + .name = ITEM_NAME("Tanga Berry"), + .pluralName = ITEM_PLURAL_NAME("Tanga Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_BUG, @@ -10049,8 +11009,8 @@ const struct Item gItemsInfo[] = [ITEM_CHARTI_BERRY] = { - .name = _("Charti Berry"), - .pluralName = _("Charti Berries"), + .name = ITEM_NAME("Charti Berry"), + .pluralName = ITEM_PLURAL_NAME("Charti Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_ROCK, @@ -10068,8 +11028,8 @@ const struct Item gItemsInfo[] = [ITEM_KASIB_BERRY] = { - .name = _("Kasib Berry"), - .pluralName = _("Kasib Berries"), + .name = ITEM_NAME("Kasib Berry"), + .pluralName = ITEM_PLURAL_NAME("Kasib Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_GHOST, @@ -10087,8 +11047,8 @@ const struct Item gItemsInfo[] = [ITEM_HABAN_BERRY] = { - .name = _("Haban Berry"), - .pluralName = _("Haban Berries"), + .name = ITEM_NAME("Haban Berry"), + .pluralName = ITEM_PLURAL_NAME("Haban Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_DRAGON, @@ -10106,8 +11066,8 @@ const struct Item gItemsInfo[] = [ITEM_COLBUR_BERRY] = { - .name = _("Colbur Berry"), - .pluralName = _("Colbur Berries"), + .name = ITEM_NAME("Colbur Berry"), + .pluralName = ITEM_PLURAL_NAME("Colbur Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_DARK, @@ -10125,8 +11085,8 @@ const struct Item gItemsInfo[] = [ITEM_BABIRI_BERRY] = { - .name = _("Babiri Berry"), - .pluralName = _("Babiri Berries"), + .name = ITEM_NAME("Babiri Berry"), + .pluralName = ITEM_PLURAL_NAME("Babiri Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_STEEL, @@ -10144,8 +11104,8 @@ const struct Item gItemsInfo[] = [ITEM_ROSELI_BERRY] = { - .name = _("Roseli Berry"), - .pluralName = _("Roseli Berries"), + .name = ITEM_NAME("Roseli Berry"), + .pluralName = ITEM_PLURAL_NAME("Roseli Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_FAIRY, @@ -10163,8 +11123,8 @@ const struct Item gItemsInfo[] = [ITEM_LIECHI_BERRY] = { - .name = _("Liechi Berry"), - .pluralName = _("Liechi Berries"), + .name = ITEM_NAME("Liechi Berry"), + .pluralName = ITEM_PLURAL_NAME("Liechi Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_ATTACK_UP, .holdEffectParam = 4, @@ -10182,8 +11142,8 @@ const struct Item gItemsInfo[] = [ITEM_GANLON_BERRY] = { - .name = _("Ganlon Berry"), - .pluralName = _("Ganlon Berries"), + .name = ITEM_NAME("Ganlon Berry"), + .pluralName = ITEM_PLURAL_NAME("Ganlon Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_DEFENSE_UP, .holdEffectParam = 4, @@ -10201,8 +11161,8 @@ const struct Item gItemsInfo[] = [ITEM_SALAC_BERRY] = { - .name = _("Salac Berry"), - .pluralName = _("Salac Berries"), + .name = ITEM_NAME("Salac Berry"), + .pluralName = ITEM_PLURAL_NAME("Salac Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_SPEED_UP, .holdEffectParam = 4, @@ -10220,8 +11180,8 @@ const struct Item gItemsInfo[] = [ITEM_PETAYA_BERRY] = { - .name = _("Petaya Berry"), - .pluralName = _("Petaya Berries"), + .name = ITEM_NAME("Petaya Berry"), + .pluralName = ITEM_PLURAL_NAME("Petaya Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_SP_ATTACK_UP, .holdEffectParam = 4, @@ -10239,8 +11199,8 @@ const struct Item gItemsInfo[] = [ITEM_APICOT_BERRY] = { - .name = _("Apicot Berry"), - .pluralName = _("Apicot Berries"), + .name = ITEM_NAME("Apicot Berry"), + .pluralName = ITEM_PLURAL_NAME("Apicot Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_SP_DEFENSE_UP, .holdEffectParam = 4, @@ -10258,8 +11218,8 @@ const struct Item gItemsInfo[] = [ITEM_LANSAT_BERRY] = { - .name = _("Lansat Berry"), - .pluralName = _("Lansat Berries"), + .name = ITEM_NAME("Lansat Berry"), + .pluralName = ITEM_PLURAL_NAME("Lansat Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CRITICAL_UP, .holdEffectParam = 4, @@ -10277,8 +11237,8 @@ const struct Item gItemsInfo[] = [ITEM_STARF_BERRY] = { - .name = _("Starf Berry"), - .pluralName = _("Starf Berries"), + .name = ITEM_NAME("Starf Berry"), + .pluralName = ITEM_PLURAL_NAME("Starf Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RANDOM_STAT_UP, .holdEffectParam = 4, @@ -10296,8 +11256,8 @@ const struct Item gItemsInfo[] = [ITEM_ENIGMA_BERRY] = { - .name = _("Enigma Berry"), - .pluralName = _("Enigma Berries"), + .name = ITEM_NAME("Enigma Berry"), + .pluralName = ITEM_PLURAL_NAME("Enigma Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_ENIGMA_BERRY, .description = COMPOUND_STRING( @@ -10314,8 +11274,8 @@ const struct Item gItemsInfo[] = [ITEM_MICLE_BERRY] = { - .name = _("Micle Berry"), - .pluralName = _("Micle Berries"), + .name = ITEM_NAME("Micle Berry"), + .pluralName = ITEM_PLURAL_NAME("Micle Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_MICLE_BERRY, .holdEffectParam = 4, @@ -10333,8 +11293,8 @@ const struct Item gItemsInfo[] = [ITEM_CUSTAP_BERRY] = { - .name = _("Custap Berry"), - .pluralName = _("Custap Berries"), + .name = ITEM_NAME("Custap Berry"), + .pluralName = ITEM_PLURAL_NAME("Custap Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CUSTAP_BERRY, .holdEffectParam = 4, @@ -10352,8 +11312,8 @@ const struct Item gItemsInfo[] = [ITEM_JABOCA_BERRY] = { - .name = _("Jaboca Berry"), - .pluralName = _("Jaboca Berries"), + .name = ITEM_NAME("Jaboca Berry"), + .pluralName = ITEM_PLURAL_NAME("Jaboca Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_JABOCA_BERRY, .description = COMPOUND_STRING( @@ -10370,8 +11330,8 @@ const struct Item gItemsInfo[] = [ITEM_ROWAP_BERRY] = { - .name = _("Rowap Berry"), - .pluralName = _("Rowap Berries"), + .name = ITEM_NAME("Rowap Berry"), + .pluralName = ITEM_PLURAL_NAME("Rowap Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_ROWAP_BERRY, .description = COMPOUND_STRING( @@ -10388,8 +11348,8 @@ const struct Item gItemsInfo[] = [ITEM_KEE_BERRY] = { - .name = _("Kee Berry"), - .pluralName = _("Kee Berries"), + .name = ITEM_NAME("Kee Berry"), + .pluralName = ITEM_PLURAL_NAME("Kee Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_KEE_BERRY, .description = COMPOUND_STRING( @@ -10406,8 +11366,8 @@ const struct Item gItemsInfo[] = [ITEM_MARANGA_BERRY] = { - .name = _("Maranga Berry"), - .pluralName = _("Maranga Berries"), + .name = ITEM_NAME("Maranga Berry"), + .pluralName = ITEM_PLURAL_NAME("Maranga Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_MARANGA_BERRY, .description = COMPOUND_STRING( @@ -10424,8 +11384,8 @@ const struct Item gItemsInfo[] = [ITEM_ENIGMA_BERRY_E_READER] = { - .name = _("Enigma Berry"), - .pluralName = _("Enigma Berries"), + .name = ITEM_NAME("Enigma Berry"), + .pluralName = ITEM_PLURAL_NAME("Enigma Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -10444,7 +11404,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_FOCUS_PUNCH] = { - .name = _("TM01"), + .name = ITEM_NAME("TM01"), .price = 3000, .description = COMPOUND_STRING( "Powerful, but makes\n" @@ -10454,12 +11414,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_FOCUS_PUNCH, }, [ITEM_TM_DRAGON_CLAW] = { - .name = _("TM02"), + .name = ITEM_NAME("TM02"), .price = 3000, .description = COMPOUND_STRING( "Hooks and slashes\n" @@ -10469,12 +11428,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_DRAGON_CLAW, }, [ITEM_TM_WATER_PULSE] = { - .name = _("TM03"), + .name = ITEM_NAME("TM03"), .price = 3000, .description = COMPOUND_STRING( "Generates an\n" @@ -10484,12 +11442,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_WATER_PULSE, }, [ITEM_TM_CALM_MIND] = { - .name = _("TM04"), + .name = ITEM_NAME("TM04"), .price = 3000, .description = COMPOUND_STRING( "Raises Sp. Atk and\n" @@ -10499,12 +11456,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_CALM_MIND, }, [ITEM_TM_ROAR] = { - .name = _("TM05"), + .name = ITEM_NAME("TM05"), .price = 1000, .description = COMPOUND_STRING( "A savage roar that\n" @@ -10514,12 +11470,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_ROAR, }, [ITEM_TM_TOXIC] = { - .name = _("TM06"), + .name = ITEM_NAME("TM06"), .price = 3000, .description = COMPOUND_STRING( "Poisons the foe\n" @@ -10529,12 +11484,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_TOXIC, }, [ITEM_TM_HAIL] = { - .name = _("TM07"), + .name = ITEM_NAME("TM07"), .price = 3000, #if B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_SNOW .description = COMPOUND_STRING( @@ -10551,12 +11505,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_HAIL, }, [ITEM_TM_BULK_UP] = { - .name = _("TM08"), + .name = ITEM_NAME("TM08"), .price = 3000, .description = COMPOUND_STRING( "Bulks up the body\n" @@ -10566,12 +11519,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_BULK_UP, }, [ITEM_TM_BULLET_SEED] = { - .name = _("TM09"), + .name = ITEM_NAME("TM09"), .price = 3000, .description = COMPOUND_STRING( "Shoots 2 to 5 seeds\n" @@ -10581,12 +11533,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_BULLET_SEED, }, [ITEM_TM_HIDDEN_POWER] = { - .name = _("TM10"), + .name = ITEM_NAME("TM10"), .price = 3000, .description = COMPOUND_STRING( "The attack power\n" @@ -10596,12 +11547,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_HIDDEN_POWER, }, [ITEM_TM_SUNNY_DAY] = { - .name = _("TM11"), + .name = ITEM_NAME("TM11"), .price = 2000, .description = COMPOUND_STRING( "Raises the power of\n" @@ -10611,12 +11561,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SUNNY_DAY, }, [ITEM_TM_TAUNT] = { - .name = _("TM12"), + .name = ITEM_NAME("TM12"), .price = 3000, .description = COMPOUND_STRING( "Enrages the foe so\n" @@ -10626,12 +11575,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_TAUNT, }, [ITEM_TM_ICE_BEAM] = { - .name = _("TM13"), + .name = ITEM_NAME("TM13"), .price = 3000, .description = COMPOUND_STRING( "Fires an icy cold\n" @@ -10645,12 +11593,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_ICE_BEAM, }, [ITEM_TM_BLIZZARD] = { - .name = _("TM14"), + .name = ITEM_NAME("TM14"), .price = 5500, .description = COMPOUND_STRING( #if B_USE_FROSTBITE == TRUE @@ -10666,12 +11613,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_BLIZZARD, }, [ITEM_TM_HYPER_BEAM] = { - .name = _("TM15"), + .name = ITEM_NAME("TM15"), .price = 7500, .description = COMPOUND_STRING( "Powerful, but needs\n" @@ -10681,12 +11627,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_HYPER_BEAM, }, [ITEM_TM_LIGHT_SCREEN] = { - .name = _("TM16"), + .name = ITEM_NAME("TM16"), .price = 3000, .description = COMPOUND_STRING( "Creates a wall of\n" @@ -10696,12 +11641,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_LIGHT_SCREEN, }, [ITEM_TM_PROTECT] = { - .name = _("TM17"), + .name = ITEM_NAME("TM17"), .price = 3000, .description = COMPOUND_STRING( "Negates all damage,\n" @@ -10711,12 +11655,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_PROTECT, }, [ITEM_TM_RAIN_DANCE] = { - .name = _("TM18"), + .name = ITEM_NAME("TM18"), .price = 2000, .description = COMPOUND_STRING( "Raises the power of\n" @@ -10726,12 +11669,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_RAIN_DANCE, }, [ITEM_TM_GIGA_DRAIN] = { - .name = _("TM19"), + .name = ITEM_NAME("TM19"), .price = 3000, .description = COMPOUND_STRING( "Recovers half the\n" @@ -10741,12 +11683,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_GIGA_DRAIN, }, [ITEM_TM_SAFEGUARD] = { - .name = _("TM20"), + .name = ITEM_NAME("TM20"), .price = 3000, .description = COMPOUND_STRING( "Prevents status\n" @@ -10756,12 +11697,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SAFEGUARD, }, [ITEM_TM_FRUSTRATION] = { - .name = _("TM21"), + .name = ITEM_NAME("TM21"), .price = 1000, .description = COMPOUND_STRING( "The less the user\n" @@ -10771,12 +11711,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_FRUSTRATION, }, [ITEM_TM_SOLAR_BEAM] = { - .name = _("TM22"), + .name = ITEM_NAME("TM22"), .price = 3000, .description = COMPOUND_STRING( "Absorbs sunlight in\n" @@ -10786,12 +11725,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SOLAR_BEAM, }, [ITEM_TM_IRON_TAIL] = { - .name = _("TM23"), + .name = ITEM_NAME("TM23"), .price = 3000, .description = COMPOUND_STRING( "Slams the foe with\n" @@ -10801,12 +11739,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_IRON_TAIL, }, [ITEM_TM_THUNDERBOLT] = { - .name = _("TM24"), + .name = ITEM_NAME("TM24"), .price = 3000, .description = COMPOUND_STRING( "A powerful electric\n" @@ -10816,12 +11753,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_THUNDERBOLT, }, [ITEM_TM_THUNDER] = { - .name = _("TM25"), + .name = ITEM_NAME("TM25"), .price = 5500, .description = COMPOUND_STRING( "Strikes the foe\n" @@ -10831,12 +11767,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_THUNDER, }, [ITEM_TM_EARTHQUAKE] = { - .name = _("TM26"), + .name = ITEM_NAME("TM26"), .price = 3000, .description = COMPOUND_STRING( "Causes a quake\n" @@ -10846,12 +11781,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_EARTHQUAKE, }, [ITEM_TM_RETURN] = { - .name = _("TM27"), + .name = ITEM_NAME("TM27"), .price = 1000, .description = COMPOUND_STRING( "The more the user\n" @@ -10861,12 +11795,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_RETURN, }, [ITEM_TM_DIG] = { - .name = _("TM28"), + .name = ITEM_NAME("TM28"), .price = 2000, .description = COMPOUND_STRING( "Digs underground\n" @@ -10876,12 +11809,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_DIG, }, [ITEM_TM_PSYCHIC] = { - .name = _("TM29"), + .name = ITEM_NAME("TM29"), .price = 2000, .description = COMPOUND_STRING( "A powerful psychic\n" @@ -10891,12 +11823,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_PSYCHIC, }, [ITEM_TM_SHADOW_BALL] = { - .name = _("TM30"), + .name = ITEM_NAME("TM30"), .price = 3000, .description = COMPOUND_STRING( "Hurls a dark lump\n" @@ -10906,12 +11837,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SHADOW_BALL, }, [ITEM_TM_BRICK_BREAK] = { - .name = _("TM31"), + .name = ITEM_NAME("TM31"), .price = 3000, .description = COMPOUND_STRING( "Destroys barriers\n" @@ -10921,12 +11851,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_BRICK_BREAK, }, [ITEM_TM_DOUBLE_TEAM] = { - .name = _("TM32"), + .name = ITEM_NAME("TM32"), .price = 2000, .description = COMPOUND_STRING( "Creates illusory\n" @@ -10936,12 +11865,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_DOUBLE_TEAM, }, [ITEM_TM_REFLECT] = { - .name = _("TM33"), + .name = ITEM_NAME("TM33"), .price = 3000, .description = COMPOUND_STRING( "Creates a wall of\n" @@ -10951,12 +11879,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_REFLECT, }, [ITEM_TM_SHOCK_WAVE] = { - .name = _("TM34"), + .name = ITEM_NAME("TM34"), .price = 3000, .description = COMPOUND_STRING( "Zaps the foe with a\n" @@ -10966,12 +11893,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SHOCK_WAVE, }, [ITEM_TM_FLAMETHROWER] = { - .name = _("TM35"), + .name = ITEM_NAME("TM35"), .price = 3000, .description = COMPOUND_STRING( "Looses a stream of\n" @@ -10981,12 +11907,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_FLAMETHROWER, }, [ITEM_TM_SLUDGE_BOMB] = { - .name = _("TM36"), + .name = ITEM_NAME("TM36"), .price = 1000, .description = COMPOUND_STRING( "Hurls sludge at the\n" @@ -10996,12 +11921,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SLUDGE_BOMB, }, [ITEM_TM_SANDSTORM] = { - .name = _("TM37"), + .name = ITEM_NAME("TM37"), .price = 2000, .description = COMPOUND_STRING( "Causes a sandstorm\n" @@ -11011,12 +11935,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SANDSTORM, }, [ITEM_TM_FIRE_BLAST] = { - .name = _("TM38"), + .name = ITEM_NAME("TM38"), .price = 5500, .description = COMPOUND_STRING( "A powerful fire\n" @@ -11026,12 +11949,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_FIRE_BLAST, }, [ITEM_TM_ROCK_TOMB] = { - .name = _("TM39"), + .name = ITEM_NAME("TM39"), .price = 3000, .description = COMPOUND_STRING( "Stops the foe from\n" @@ -11041,12 +11963,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_ROCK_TOMB, }, [ITEM_TM_AERIAL_ACE] = { - .name = _("TM40"), + .name = ITEM_NAME("TM40"), .price = 3000, .description = COMPOUND_STRING( "An extremely fast\n" @@ -11056,12 +11977,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_AERIAL_ACE, }, [ITEM_TM_TORMENT] = { - .name = _("TM41"), + .name = ITEM_NAME("TM41"), .price = 3000, .description = COMPOUND_STRING( "Prevents the foe\n" @@ -11071,12 +11991,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_TORMENT, }, [ITEM_TM_FACADE] = { - .name = _("TM42"), + .name = ITEM_NAME("TM42"), .price = 3000, .description = COMPOUND_STRING( "Raises Attack when\n" @@ -11086,12 +12005,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_FACADE, }, [ITEM_TM_SECRET_POWER] = { - .name = _("TM43"), + .name = ITEM_NAME("TM43"), .price = 3000, .description = COMPOUND_STRING( "Adds an effect to\n" @@ -11101,12 +12019,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SECRET_POWER, }, [ITEM_TM_REST] = { - .name = _("TM44"), + .name = ITEM_NAME("TM44"), .price = 3000, .description = COMPOUND_STRING( "The user sleeps for\n" @@ -11116,12 +12033,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_REST, }, [ITEM_TM_ATTRACT] = { - .name = _("TM45"), + .name = ITEM_NAME("TM45"), .price = 3000, .description = COMPOUND_STRING( "Makes it tough to\n" @@ -11131,12 +12047,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_ATTRACT, }, [ITEM_TM_THIEF] = { - .name = _("TM46"), + .name = ITEM_NAME("TM46"), .price = 3000, .description = COMPOUND_STRING( "While attacking,\n" @@ -11146,12 +12061,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_THIEF, }, [ITEM_TM_STEEL_WING] = { - .name = _("TM47"), + .name = ITEM_NAME("TM47"), .price = 3000, .description = COMPOUND_STRING( "Spreads hard-\n" @@ -11161,12 +12075,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_STEEL_WING, }, [ITEM_TM_SKILL_SWAP] = { - .name = _("TM48"), + .name = ITEM_NAME("TM48"), .price = 3000, .description = COMPOUND_STRING( "Switches abilities\n" @@ -11176,12 +12089,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SKILL_SWAP, }, [ITEM_TM_SNATCH] = { - .name = _("TM49"), + .name = ITEM_NAME("TM49"), .price = 3000, .description = COMPOUND_STRING( "Steals the effects\n" @@ -11191,12 +12103,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SNATCH, }, [ITEM_TM_OVERHEAT] = { - .name = _("TM50"), + .name = ITEM_NAME("TM50"), .price = 3000, .description = COMPOUND_STRING( "Enables full-power\n" @@ -11206,612 +12117,561 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_OVERHEAT, }, [ITEM_TM51] = { - .name = _("TM51"), + .name = ITEM_NAME("TM51"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM52] = { - .name = _("TM52"), + .name = ITEM_NAME("TM52"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM53] = { - .name = _("TM53"), + .name = ITEM_NAME("TM53"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM54] = { - .name = _("TM54"), + .name = ITEM_NAME("TM54"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM55] = { - .name = _("TM55"), + .name = ITEM_NAME("TM55"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM56] = { - .name = _("TM56"), + .name = ITEM_NAME("TM56"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM57] = { - .name = _("TM57"), + .name = ITEM_NAME("TM57"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM58] = { - .name = _("TM58"), + .name = ITEM_NAME("TM58"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM59] = { - .name = _("TM59"), + .name = ITEM_NAME("TM59"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM60] = { - .name = _("TM60"), + .name = ITEM_NAME("TM60"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM61] = { - .name = _("TM61"), + .name = ITEM_NAME("TM61"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM62] = { - .name = _("TM62"), + .name = ITEM_NAME("TM62"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM63] = { - .name = _("TM63"), + .name = ITEM_NAME("TM63"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM64] = { - .name = _("TM64"), + .name = ITEM_NAME("TM64"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM65] = { - .name = _("TM65"), + .name = ITEM_NAME("TM65"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM66] = { - .name = _("TM66"), + .name = ITEM_NAME("TM66"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM67] = { - .name = _("TM67"), + .name = ITEM_NAME("TM67"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM68] = { - .name = _("TM68"), + .name = ITEM_NAME("TM68"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM69] = { - .name = _("TM69"), + .name = ITEM_NAME("TM69"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM70] = { - .name = _("TM70"), + .name = ITEM_NAME("TM70"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM71] = { - .name = _("TM71"), + .name = ITEM_NAME("TM71"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM72] = { - .name = _("TM72"), + .name = ITEM_NAME("TM72"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM73] = { - .name = _("TM73"), + .name = ITEM_NAME("TM73"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM74] = { - .name = _("TM74"), + .name = ITEM_NAME("TM74"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM75] = { - .name = _("TM75"), + .name = ITEM_NAME("TM75"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM76] = { - .name = _("TM76"), + .name = ITEM_NAME("TM76"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM77] = { - .name = _("TM77"), + .name = ITEM_NAME("TM77"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM78] = { - .name = _("TM78"), + .name = ITEM_NAME("TM78"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM79] = { - .name = _("TM79"), + .name = ITEM_NAME("TM79"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM80] = { - .name = _("TM80"), + .name = ITEM_NAME("TM80"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM81] = { - .name = _("TM81"), + .name = ITEM_NAME("TM81"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM82] = { - .name = _("TM82"), + .name = ITEM_NAME("TM82"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM83] = { - .name = _("TM83"), + .name = ITEM_NAME("TM83"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM84] = { - .name = _("TM84"), + .name = ITEM_NAME("TM84"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM85] = { - .name = _("TM85"), + .name = ITEM_NAME("TM85"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM86] = { - .name = _("TM86"), + .name = ITEM_NAME("TM86"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM87] = { - .name = _("TM87"), + .name = ITEM_NAME("TM87"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM88] = { - .name = _("TM88"), + .name = ITEM_NAME("TM88"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM89] = { - .name = _("TM89"), + .name = ITEM_NAME("TM89"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM90] = { - .name = _("TM90"), + .name = ITEM_NAME("TM90"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM91] = { - .name = _("TM91"), + .name = ITEM_NAME("TM91"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM92] = { - .name = _("TM92"), + .name = ITEM_NAME("TM92"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM93] = { - .name = _("TM93"), + .name = ITEM_NAME("TM93"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM94] = { - .name = _("TM94"), + .name = ITEM_NAME("TM94"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM95] = { - .name = _("TM95"), + .name = ITEM_NAME("TM95"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM96] = { - .name = _("TM96"), + .name = ITEM_NAME("TM96"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM97] = { - .name = _("TM97"), + .name = ITEM_NAME("TM97"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM98] = { - .name = _("TM98"), + .name = ITEM_NAME("TM98"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM99] = { - .name = _("TM99"), + .name = ITEM_NAME("TM99"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM100] = { - .name = _("TM100"), + .name = ITEM_NAME("TM100"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_HM_CUT] = { - .name = _("HM01"), + .name = ITEM_NAME("HM01"), .price = 0, .description = COMPOUND_STRING( "Attacks the foe\n" @@ -11821,12 +12681,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_CUT, }, [ITEM_HM_FLY] = { - .name = _("HM02"), + .name = ITEM_NAME("HM02"), .price = 0, .description = COMPOUND_STRING( "Flies up on the\n" @@ -11836,12 +12695,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_FLY, }, [ITEM_HM_SURF] = { - .name = _("HM03"), + .name = ITEM_NAME("HM03"), .price = 0, .description = COMPOUND_STRING( "Creates a huge\n" @@ -11851,12 +12709,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SURF, }, [ITEM_HM_STRENGTH] = { - .name = _("HM04"), + .name = ITEM_NAME("HM04"), .price = 0, .description = COMPOUND_STRING( "Builds enormous\n" @@ -11866,12 +12723,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_STRENGTH, }, [ITEM_HM_FLASH] = { - .name = _("HM05"), + .name = ITEM_NAME("HM05"), .price = 0, .description = COMPOUND_STRING( "Looses a powerful\n" @@ -11881,12 +12737,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_FLASH, }, [ITEM_HM_ROCK_SMASH] = { - .name = _("HM06"), + .name = ITEM_NAME("HM06"), .price = 0, .description = COMPOUND_STRING( "A rock-crushingly\n" @@ -11896,12 +12751,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_ROCK_SMASH, }, [ITEM_HM_WATERFALL] = { - .name = _("HM07"), + .name = ITEM_NAME("HM07"), .price = 0, .description = COMPOUND_STRING( "Attacks the foe\n" @@ -11911,12 +12765,11 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_WATERFALL, }, [ITEM_HM_DIVE] = { - .name = _("HM08"), + .name = ITEM_NAME("HM08"), .price = 0, .description = COMPOUND_STRING( "Dives underwater\n" @@ -11926,7 +12779,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_DIVE, }, @@ -11934,7 +12786,7 @@ const struct Item gItemsInfo[] = [ITEM_OVAL_CHARM] = { - .name = _("Oval Charm"), + .name = ITEM_NAME("Oval Charm"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -11950,7 +12802,7 @@ const struct Item gItemsInfo[] = [ITEM_SHINY_CHARM] = { - .name = _("Shiny Charm"), + .name = ITEM_NAME("Shiny Charm"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -11966,7 +12818,7 @@ const struct Item gItemsInfo[] = [ITEM_CATCHING_CHARM] = { - .name = _("Catching Charm"), + .name = ITEM_NAME("Catching Charm"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -11982,7 +12834,7 @@ const struct Item gItemsInfo[] = [ITEM_EXP_CHARM] = { - .name = _("Exp. Charm"), + .name = ITEM_NAME("Exp. Charm"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12000,7 +12852,7 @@ const struct Item gItemsInfo[] = [ITEM_ROTOM_CATALOG] = { - .name = _("Rotom Catalog"), + .name = ITEM_NAME("Rotom Catalog"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12016,7 +12868,7 @@ const struct Item gItemsInfo[] = [ITEM_GRACIDEA] = { - .name = _("Gracidea"), + .name = ITEM_NAME("Gracidea"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12032,8 +12884,8 @@ const struct Item gItemsInfo[] = [ITEM_REVEAL_GLASS] = { - .name = _("Reveal Glass"), - .pluralName = _("Reveal Glasses"), + .name = ITEM_NAME("Reveal Glass"), + .pluralName = ITEM_PLURAL_NAME("Reveal Glasses"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12049,8 +12901,8 @@ const struct Item gItemsInfo[] = [ITEM_DNA_SPLICERS] = { - .name = _("DNA Splicers"), - .pluralName = _("DNA Splicers"), + .name = ITEM_NAME("DNA Splicers"), + .pluralName = ITEM_PLURAL_NAME("DNA Splicers"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12066,7 +12918,7 @@ const struct Item gItemsInfo[] = [ITEM_ZYGARDE_CUBE] = { - .name = _("Zygarde Cube"), + .name = ITEM_NAME("Zygarde Cube"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12082,7 +12934,7 @@ const struct Item gItemsInfo[] = [ITEM_PRISON_BOTTLE] = { - .name = _("Prison Bottle"), + .name = ITEM_NAME("Prison Bottle"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12098,7 +12950,7 @@ const struct Item gItemsInfo[] = [ITEM_N_SOLARIZER] = { - .name = _("N-Solarizer"), + .name = ITEM_NAME("N-Solarizer"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12114,7 +12966,7 @@ const struct Item gItemsInfo[] = [ITEM_N_LUNARIZER] = { - .name = _("N-Lunarizer"), + .name = ITEM_NAME("N-Lunarizer"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12130,8 +12982,8 @@ const struct Item gItemsInfo[] = [ITEM_REINS_OF_UNITY] = { - .name = _("Reins of Unity"), - .pluralName = _("Reins of Unity"), + .name = ITEM_NAME("Reins of Unity"), + .pluralName = ITEM_PLURAL_NAME("Reins of Unity"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12149,7 +13001,7 @@ const struct Item gItemsInfo[] = [ITEM_MEGA_RING] = { - .name = _("Mega Ring"), + .name = ITEM_NAME("Mega Ring"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12165,7 +13017,7 @@ const struct Item gItemsInfo[] = [ITEM_Z_POWER_RING] = { - .name = _("Z-Power Ring"), + .name = ITEM_NAME("Z-Power Ring"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12181,7 +13033,7 @@ const struct Item gItemsInfo[] = [ITEM_DYNAMAX_BAND] = { - .name = _("Dynamax Band"), + .name = ITEM_NAME("Dynamax Band"), .price = 0, .description = COMPOUND_STRING( "A band carrying a\n" @@ -12198,7 +13050,7 @@ const struct Item gItemsInfo[] = [ITEM_BICYCLE] = { - .name = _("Bicycle"), + .name = ITEM_NAME("Bicycle"), .price = 0, .description = COMPOUND_STRING( "A folding bicycle\n" @@ -12214,7 +13066,7 @@ const struct Item gItemsInfo[] = [ITEM_MACH_BIKE] = { - .name = _("Mach Bike"), + .name = ITEM_NAME("Mach Bike"), .price = 0, .description = COMPOUND_STRING( "A folding bicycle\n" @@ -12231,7 +13083,7 @@ const struct Item gItemsInfo[] = [ITEM_ACRO_BIKE] = { - .name = _("Acro Bike"), + .name = ITEM_NAME("Acro Bike"), .price = 0, .description = COMPOUND_STRING( "A folding bicycle\n" @@ -12248,7 +13100,7 @@ const struct Item gItemsInfo[] = [ITEM_OLD_ROD] = { - .name = _("Old Rod"), + .name = ITEM_NAME("Old Rod"), .price = 0, .description = COMPOUND_STRING( "Use by any body of\n" @@ -12265,7 +13117,7 @@ const struct Item gItemsInfo[] = [ITEM_GOOD_ROD] = { - .name = _("Good Rod"), + .name = ITEM_NAME("Good Rod"), .price = 0, .description = COMPOUND_STRING( "A decent fishing\n" @@ -12282,7 +13134,7 @@ const struct Item gItemsInfo[] = [ITEM_SUPER_ROD] = { - .name = _("Super Rod"), + .name = ITEM_NAME("Super Rod"), .price = 0, .description = COMPOUND_STRING( "The best fishing\n" @@ -12299,7 +13151,7 @@ const struct Item gItemsInfo[] = [ITEM_DOWSING_MACHINE] = { - .name = _("Dowsing Machine"), + .name = ITEM_NAME("Dowsing Machine"), .price = 0, .description = COMPOUND_STRING( "A device that\n" @@ -12315,7 +13167,7 @@ const struct Item gItemsInfo[] = [ITEM_TOWN_MAP] = { - .name = _("Town Map"), + .name = ITEM_NAME("Town Map"), .price = 0, .description = COMPOUND_STRING( "Can be viewed\n" @@ -12331,7 +13183,7 @@ const struct Item gItemsInfo[] = [ITEM_VS_SEEKER] = { - .name = _("Vs. Seeker"), + .name = ITEM_NAME("Vs. Seeker"), .price = 0, .description = COMPOUND_STRING( "A rechargeable unit\n" @@ -12351,7 +13203,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_CASE] = { - .name = _("TM Case"), + .name = ITEM_NAME("TM Case"), .price = 0, .description = COMPOUND_STRING( "A convenient case\n" @@ -12367,8 +13219,8 @@ const struct Item gItemsInfo[] = [ITEM_BERRY_POUCH] = { - .name = _("Berry Pouch"), - .pluralName = _("Berry Pouches"), + .name = ITEM_NAME("Berry Pouch"), + .pluralName = ITEM_PLURAL_NAME("Berry Pouches"), .price = 0, .description = COMPOUND_STRING( "A convenient\n" @@ -12384,7 +13236,7 @@ const struct Item gItemsInfo[] = [ITEM_POKEMON_BOX_LINK] = { - .name = _("{PKMN} Box Link"), + .name = ITEM_NAME("{PKMN} Box Link"), .price = 0, .description = COMPOUND_STRING( "This device grants\n" @@ -12400,7 +13252,7 @@ const struct Item gItemsInfo[] = [ITEM_COIN_CASE] = { - .name = _("Coin Case"), + .name = ITEM_NAME("Coin Case"), .price = 0, .description = COMPOUND_STRING( "A case that holds\n" @@ -12415,7 +13267,7 @@ const struct Item gItemsInfo[] = [ITEM_POWDER_JAR] = { - .name = _("Powder Jar"), + .name = ITEM_NAME("Powder Jar"), .price = 0, .description = COMPOUND_STRING( "Stores Berry\n" @@ -12431,7 +13283,7 @@ const struct Item gItemsInfo[] = [ITEM_WAILMER_PAIL] = { - .name = _("Wailmer Pail"), + .name = ITEM_NAME("Wailmer Pail"), .price = 0, .description = COMPOUND_STRING( "A tool used for\n" @@ -12447,7 +13299,7 @@ const struct Item gItemsInfo[] = [ITEM_POKE_RADAR] = { - .name = _("PokΓ© Radar"), + .name = ITEM_NAME("PokΓ© Radar"), .price = 0, .description = COMPOUND_STRING( "A tool used to\n" @@ -12463,7 +13315,7 @@ const struct Item gItemsInfo[] = [ITEM_POKEBLOCK_CASE] = { - .name = _("{POKEBLOCK} Case"), + .name = ITEM_NAME("{POKEBLOCK} Case"), .price = 0, .description = COMPOUND_STRING( "A case for holding\n" @@ -12479,7 +13331,7 @@ const struct Item gItemsInfo[] = [ITEM_SOOT_SACK] = { - .name = _("Soot Sack"), + .name = ITEM_NAME("Soot Sack"), .price = 0, .description = COMPOUND_STRING( "A sack used to\n" @@ -12495,7 +13347,7 @@ const struct Item gItemsInfo[] = [ITEM_POKE_FLUTE] = { - .name = _("PokΓ© Flute"), + .name = ITEM_NAME("PokΓ© Flute"), .price = 0, .description = COMPOUND_STRING( "A sweet-sounding\n" @@ -12512,7 +13364,7 @@ const struct Item gItemsInfo[] = [ITEM_FAME_CHECKER] = { - .name = _("Fame Checker"), + .name = ITEM_NAME("Fame Checker"), .price = 0, .description = COMPOUND_STRING( "Stores information\n" @@ -12528,7 +13380,7 @@ const struct Item gItemsInfo[] = [ITEM_TEACHY_TV] = { - .name = _("Teachy TV"), + .name = ITEM_NAME("Teachy TV"), .price = 0, .description = COMPOUND_STRING( "A TV set tuned to\n" @@ -12546,7 +13398,7 @@ const struct Item gItemsInfo[] = [ITEM_SS_TICKET] = { - .name = _("S.S. Ticket"), + .name = ITEM_NAME("S.S. Ticket"), .price = 0, .description = COMPOUND_STRING( "The ticket required\n" @@ -12562,7 +13414,7 @@ const struct Item gItemsInfo[] = [ITEM_EON_TICKET] = { - .name = _("Eon Ticket"), + .name = ITEM_NAME("Eon Ticket"), .price = 0, .description = COMPOUND_STRING( "The ticket for a\n" @@ -12579,7 +13431,7 @@ const struct Item gItemsInfo[] = [ITEM_MYSTIC_TICKET] = { - .name = _("Mystic Ticket"), + .name = ITEM_NAME("Mystic Ticket"), .price = 0, .description = COMPOUND_STRING( "A ticket required\n" @@ -12595,7 +13447,7 @@ const struct Item gItemsInfo[] = [ITEM_AURORA_TICKET] = { - .name = _("Aurora Ticket"), + .name = ITEM_NAME("Aurora Ticket"), .price = 0, .description = COMPOUND_STRING( "A ticket required\n" @@ -12611,7 +13463,7 @@ const struct Item gItemsInfo[] = [ITEM_OLD_SEA_MAP] = { - .name = _("Old Sea Map"), + .name = ITEM_NAME("Old Sea Map"), .price = 0, .description = COMPOUND_STRING( "A faded sea chart\n" @@ -12627,7 +13479,7 @@ const struct Item gItemsInfo[] = [ITEM_LETTER] = { - .name = _("Letter"), + .name = ITEM_NAME("Letter"), .price = 0, .description = COMPOUND_STRING( "A letter to Steven\n" @@ -12643,8 +13495,8 @@ const struct Item gItemsInfo[] = [ITEM_DEVON_PARTS] = { - .name = _("Devon Parts"), - .pluralName = _("Devon Parts"), + .name = ITEM_NAME("Devon Parts"), + .pluralName = ITEM_PLURAL_NAME("Devon Parts"), .price = 0, .description = COMPOUND_STRING( "A package that\n" @@ -12660,8 +13512,8 @@ const struct Item gItemsInfo[] = [ITEM_GO_GOGGLES] = { - .name = _("Go-Goggles"), - .pluralName = _("Go-Goggles"), + .name = ITEM_NAME("Go-Goggles"), + .pluralName = ITEM_PLURAL_NAME("Go-Goggles"), .price = 0, .description = COMPOUND_STRING( "Nifty goggles that\n" @@ -12677,7 +13529,7 @@ const struct Item gItemsInfo[] = [ITEM_DEVON_SCOPE] = { - .name = _("Devon Scope"), + .name = ITEM_NAME("Devon Scope"), .price = 0, .description = COMPOUND_STRING( "A device by Devon\n" @@ -12693,7 +13545,7 @@ const struct Item gItemsInfo[] = [ITEM_BASEMENT_KEY] = { - .name = _("Basement Key"), + .name = ITEM_NAME("Basement Key"), .price = 0, .description = COMPOUND_STRING( "The key for New\n" @@ -12709,7 +13561,7 @@ const struct Item gItemsInfo[] = [ITEM_SCANNER] = { - .name = _("Scanner"), + .name = ITEM_NAME("Scanner"), .price = 0, .description = COMPOUND_STRING( "A device found\n" @@ -12725,7 +13577,7 @@ const struct Item gItemsInfo[] = [ITEM_STORAGE_KEY] = { - .name = _("Storage Key"), + .name = ITEM_NAME("Storage Key"), .price = 0, .description = COMPOUND_STRING( "The key to the\n" @@ -12741,8 +13593,8 @@ const struct Item gItemsInfo[] = [ITEM_KEY_TO_ROOM_1] = { - .name = _("Key to Room 1"), - .pluralName = _("Keys to Room 1"), + .name = ITEM_NAME("Key to Room 1"), + .pluralName = ITEM_PLURAL_NAME("Keys to Room 1"), .price = 0, .description = sKeyToRoomDesc, .importance = 1, @@ -12755,8 +13607,8 @@ const struct Item gItemsInfo[] = [ITEM_KEY_TO_ROOM_2] = { - .name = _("Key to Room 2"), - .pluralName = _("Keys to Room 2"), + .name = ITEM_NAME("Key to Room 2"), + .pluralName = ITEM_PLURAL_NAME("Keys to Room 2"), .price = 0, .description = sKeyToRoomDesc, .importance = 1, @@ -12769,8 +13621,8 @@ const struct Item gItemsInfo[] = [ITEM_KEY_TO_ROOM_4] = { - .name = _("Key to Room 4"), - .pluralName = _("Keys to Room 4"), + .name = ITEM_NAME("Key to Room 4"), + .pluralName = ITEM_PLURAL_NAME("Keys to Room 4"), .price = 0, .description = sKeyToRoomDesc, .importance = 1, @@ -12783,8 +13635,8 @@ const struct Item gItemsInfo[] = [ITEM_KEY_TO_ROOM_6] = { - .name = _("Key to Room 6"), - .pluralName = _("Keys to Room 6"), + .name = ITEM_NAME("Key to Room 6"), + .pluralName = ITEM_PLURAL_NAME("Keys to Room 6"), .price = 0, .description = sKeyToRoomDesc, .importance = 1, @@ -12797,7 +13649,7 @@ const struct Item gItemsInfo[] = [ITEM_METEORITE] = { - .name = _("Meteorite"), + .name = ITEM_NAME("Meteorite"), .price = 0, .description = COMPOUND_STRING( "A meteorite found\n" @@ -12812,7 +13664,7 @@ const struct Item gItemsInfo[] = [ITEM_MAGMA_EMBLEM] = { - .name = _("Magma Emblem"), + .name = ITEM_NAME("Magma Emblem"), .price = 0, .description = COMPOUND_STRING( "A medal-like item in\n" @@ -12828,8 +13680,8 @@ const struct Item gItemsInfo[] = [ITEM_CONTEST_PASS] = { - .name = _("Contest Pass"), - .pluralName = _("Contest Passes"), + .name = ITEM_NAME("Contest Pass"), + .pluralName = ITEM_PLURAL_NAME("Contest Passes"), .price = 0, .description = COMPOUND_STRING( "The pass required\n" @@ -12845,7 +13697,7 @@ const struct Item gItemsInfo[] = [ITEM_PARCEL] = { - .name = _("Parcel"), + .name = ITEM_NAME("Parcel"), .price = 0, .description = COMPOUND_STRING( "A parcel for Prof.\n" @@ -12861,7 +13713,7 @@ const struct Item gItemsInfo[] = [ITEM_SECRET_KEY] = { - .name = _("Secret Key"), + .name = ITEM_NAME("Secret Key"), .price = 0, .description = COMPOUND_STRING( "The key to the\n" @@ -12877,7 +13729,7 @@ const struct Item gItemsInfo[] = [ITEM_BIKE_VOUCHER] = { - .name = _("Bike Voucher"), + .name = ITEM_NAME("Bike Voucher"), .price = 0, .description = COMPOUND_STRING( "A voucher for\n" @@ -12893,8 +13745,8 @@ const struct Item gItemsInfo[] = [ITEM_GOLD_TEETH] = { - .name = _("Gold Teeth"), - .pluralName = _("Gold Teeth"), + .name = ITEM_NAME("Gold Teeth"), + .pluralName = ITEM_PLURAL_NAME("Gold Teeth"), .price = 0, .description = COMPOUND_STRING( "Gold dentures lost\n" @@ -12910,7 +13762,7 @@ const struct Item gItemsInfo[] = [ITEM_CARD_KEY] = { - .name = _("Card Key"), + .name = ITEM_NAME("Card Key"), .price = 0, .description = COMPOUND_STRING( "A card-type door\n" @@ -12926,7 +13778,7 @@ const struct Item gItemsInfo[] = [ITEM_LIFT_KEY] = { - .name = _("Lift Key"), + .name = ITEM_NAME("Lift Key"), .price = 0, .description = COMPOUND_STRING( "An elevator key\n" @@ -12942,7 +13794,7 @@ const struct Item gItemsInfo[] = [ITEM_SILPH_SCOPE] = { - .name = _("Silph Scope"), + .name = ITEM_NAME("Silph Scope"), .price = 0, .description = COMPOUND_STRING( "Silph Co's scope\n" @@ -12958,8 +13810,8 @@ const struct Item gItemsInfo[] = [ITEM_TRI_PASS] = { - .name = _("Tri-Pass"), - .pluralName = _("Tri-Passes"), + .name = ITEM_NAME("Tri-Pass"), + .pluralName = ITEM_PLURAL_NAME("Tri-Passes"), .price = 0, .description = COMPOUND_STRING( "A pass for ferries\n" @@ -12975,8 +13827,8 @@ const struct Item gItemsInfo[] = [ITEM_RAINBOW_PASS] = { - .name = _("Rainbow Pass"), - .pluralName = _("Rainbow Passes"), + .name = ITEM_NAME("Rainbow Pass"), + .pluralName = ITEM_PLURAL_NAME("Rainbow Passes"), .price = 0, .description = COMPOUND_STRING( "For ferries serving\n" @@ -12992,8 +13844,8 @@ const struct Item gItemsInfo[] = [ITEM_TEA] = { - .name = _("Tea"), - .pluralName = _("Tea"), + .name = ITEM_NAME("Tea"), + .pluralName = ITEM_PLURAL_NAME("Tea"), .price = 0, .description = COMPOUND_STRING( "A thirst-quenching\n" @@ -13009,8 +13861,8 @@ const struct Item gItemsInfo[] = [ITEM_RUBY] = { - .name = _("Ruby"), - .pluralName = _("Rubies"), + .name = ITEM_NAME("Ruby"), + .pluralName = ITEM_PLURAL_NAME("Rubies"), .price = 0, .description = COMPOUND_STRING( "An exquisite, red-\n" @@ -13026,7 +13878,7 @@ const struct Item gItemsInfo[] = [ITEM_SAPPHIRE] = { - .name = _("Sapphire"), + .name = ITEM_NAME("Sapphire"), .price = 0, .description = COMPOUND_STRING( "A brilliant blue gem\n" @@ -13042,7 +13894,7 @@ const struct Item gItemsInfo[] = [ITEM_ABILITY_SHIELD] = { - .name = _("Ability Shield"), + .name = ITEM_NAME("Ability Shield"), .price = 20000, .holdEffect = HOLD_EFFECT_ABILITY_SHIELD, .description = COMPOUND_STRING( @@ -13061,7 +13913,7 @@ const struct Item gItemsInfo[] = [ITEM_CLEAR_AMULET] = { - .name = _("Clear Amulet"), + .name = ITEM_NAME("Clear Amulet"), .price = 30000, .holdEffect = HOLD_EFFECT_CLEAR_AMULET, .description = COMPOUND_STRING( @@ -13069,6 +13921,7 @@ const struct Item gItemsInfo[] = "prevented for this\n" "items's holder."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -13078,7 +13931,7 @@ const struct Item gItemsInfo[] = [ITEM_PUNCHING_GLOVE] = { - .name = _("Punching Glove"), + .name = ITEM_NAME("Punching Glove"), .price = 15000, .holdEffect = HOLD_EFFECT_PUNCHING_GLOVE, .description = COMPOUND_STRING( @@ -13086,6 +13939,7 @@ const struct Item gItemsInfo[] = "moves and removes\n" "their contact."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -13095,7 +13949,7 @@ const struct Item gItemsInfo[] = [ITEM_COVERT_CLOAK] = { - .name = _("Covert Cloak"), + .name = ITEM_NAME("Covert Cloak"), .price = 20000, .holdEffect = HOLD_EFFECT_COVERT_CLOAK, .description = COMPOUND_STRING( @@ -13103,6 +13957,7 @@ const struct Item gItemsInfo[] = "from additional\n" "effects of moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -13112,8 +13967,8 @@ const struct Item gItemsInfo[] = [ITEM_LOADED_DICE] = { - .name = _("Loaded Dice"), - .pluralName = _("Loaded Dice"), + .name = ITEM_NAME("Loaded Dice"), + .pluralName = ITEM_PLURAL_NAME("Loaded Dice"), .price = 20000, .holdEffect = HOLD_EFFECT_LOADED_DICE, .description = COMPOUND_STRING( @@ -13121,6 +13976,7 @@ const struct Item gItemsInfo[] = "Multihit strikes\n" "hit more times."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -13130,13 +13986,14 @@ const struct Item gItemsInfo[] = [ITEM_AUSPICIOUS_ARMOR] = { - .name = _("Auspicious Armor"), + .name = ITEM_NAME("Auspicious Armor"), .price = 3000, .description = COMPOUND_STRING( "Armor inhabited by\n" "auspicious wishes.\n" "Causes evolution."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -13147,8 +14004,8 @@ const struct Item gItemsInfo[] = [ITEM_BOOSTER_ENERGY] = { - .name = _("Booster Energy"), - .pluralName = _("Booster Energies"), + .name = ITEM_NAME("Booster Energy"), + .pluralName = ITEM_PLURAL_NAME("Booster Energies"), .price = 0, .holdEffect = HOLD_EFFECT_BOOSTER_ENERGY, .description = COMPOUND_STRING( @@ -13156,6 +14013,7 @@ const struct Item gItemsInfo[] = "ups PokΓ©mon with\n" "certain Abilities."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -13165,13 +14023,14 @@ const struct Item gItemsInfo[] = [ITEM_BIG_BAMBOO_SHOOT] = { - .name = _("Big Bamboo Shoot"), + .name = ITEM_NAME("Big Bamboo Shoot"), .price = 3000, .description = COMPOUND_STRING( "A large and rare\n" "bamboo shoot. Best\n" "sold to gourmands."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -13181,13 +14040,14 @@ const struct Item gItemsInfo[] = [ITEM_GIMMIGHOUL_COIN] = { - .name = _("Gimmighoul Coin"), + .name = ITEM_NAME("Gimmighoul Coin"), .price = 400, .description = COMPOUND_STRING( "Gimmighoul hoard\n" "and treasure these\n" "curious coins."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_GimmighoulCoin, @@ -13196,13 +14056,14 @@ const struct Item gItemsInfo[] = [ITEM_LEADERS_CREST] = { - .name = _("Leader's Crest"), + .name = ITEM_NAME("Leader's Crest"), .price = 3000, .description = COMPOUND_STRING( "A shard of an old\n" "blade of some sort.\n" "Held by Bisharp."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_LeadersCrest, @@ -13211,13 +14072,14 @@ const struct Item gItemsInfo[] = [ITEM_MALICIOUS_ARMOR] = { - .name = _("Malicious Armor"), + .name = ITEM_NAME("Malicious Armor"), .price = 3000, .description = COMPOUND_STRING( "Armor inhabited by\n" "malicious will.\n" "Causes evolution."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -13228,7 +14090,7 @@ const struct Item gItemsInfo[] = [ITEM_MIRROR_HERB] = { - .name = _("Mirror Herb"), + .name = ITEM_NAME("Mirror Herb"), .price = 30000, .holdEffect = HOLD_EFFECT_MIRROR_HERB, .description = COMPOUND_STRING( @@ -13236,6 +14098,7 @@ const struct Item gItemsInfo[] = "stat increases\n" "but only once."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -13245,8 +14108,8 @@ const struct Item gItemsInfo[] = [ITEM_SCROLL_OF_DARKNESS] = { - .name = _("Scroll of Darkness"), - .pluralName = _("Scrolls of Darkness"), + .name = ITEM_NAME("Scroll of Darkness"), + .pluralName = ITEM_PLURAL_NAME("Scrolls of Darkness"), .price = 0, .description = COMPOUND_STRING( "A peculiar scroll\n" @@ -13254,6 +14117,7 @@ const struct Item gItemsInfo[] = "the dark path."), .importance = 1, .pocket = POCKET_KEY_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -13263,8 +14127,8 @@ const struct Item gItemsInfo[] = [ITEM_SCROLL_OF_WATERS] = { - .name = _("Scroll of Waters"), - .pluralName = _("Scrolls of Waters"), + .name = ITEM_NAME("Scroll of Waters"), + .pluralName = ITEM_PLURAL_NAME("Scrolls of Waters"), .price = 0, .description = COMPOUND_STRING( "A peculiar scroll\n" @@ -13272,6 +14136,7 @@ const struct Item gItemsInfo[] = "the water path."), .importance = 1, .pocket = POCKET_KEY_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -13281,7 +14146,7 @@ const struct Item gItemsInfo[] = [ITEM_TERA_ORB] = { - .name = _("Tera Orb"), + .name = ITEM_NAME("Tera Orb"), .price = 0, .description = COMPOUND_STRING( "Energy charges can\n" @@ -13297,13 +14162,14 @@ const struct Item gItemsInfo[] = [ITEM_TINY_BAMBOO_SHOOT] = { - .name = _("Tiny Bamboo Shoot"), + .name = ITEM_NAME("Tiny Bamboo Shoot"), .price = 750, .description = COMPOUND_STRING( "A small and rare\n" "bamboo shoot. Best\n" "sold to gourmands."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -13313,10 +14179,11 @@ const struct Item gItemsInfo[] = [ITEM_BUG_TERA_SHARD] = { - .name = _("Bug Tera Shard"), + .name = ITEM_NAME("Bug Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13325,10 +14192,11 @@ const struct Item gItemsInfo[] = [ITEM_DARK_TERA_SHARD] = { - .name = _("Dark Tera Shard"), + .name = ITEM_NAME("Dark Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13337,10 +14205,11 @@ const struct Item gItemsInfo[] = [ITEM_DRAGON_TERA_SHARD] = { - .name = _("Dragon Tera Shard"), + .name = ITEM_NAME("Dragon Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13349,10 +14218,11 @@ const struct Item gItemsInfo[] = [ITEM_ELECTRIC_TERA_SHARD] = { - .name = _("Electric Tera Shard"), + .name = ITEM_NAME("Electric Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13361,10 +14231,11 @@ const struct Item gItemsInfo[] = [ITEM_FAIRY_TERA_SHARD] = { - .name = _("Fairy Tera Shard"), + .name = ITEM_NAME("Fairy Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13373,10 +14244,11 @@ const struct Item gItemsInfo[] = [ITEM_FIGHTING_TERA_SHARD] = { - .name = _("Fighting Tera Shard"), + .name = ITEM_NAME("Fighting Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13385,10 +14257,11 @@ const struct Item gItemsInfo[] = [ITEM_FIRE_TERA_SHARD] = { - .name = _("Fire Tera Shard"), + .name = ITEM_NAME("Fire Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13397,10 +14270,11 @@ const struct Item gItemsInfo[] = [ITEM_FLYING_TERA_SHARD] = { - .name = _("Flying Tera Shard"), + .name = ITEM_NAME("Flying Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13409,10 +14283,11 @@ const struct Item gItemsInfo[] = [ITEM_GHOST_TERA_SHARD] = { - .name = _("Ghost Tera Shard"), + .name = ITEM_NAME("Ghost Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13421,10 +14296,11 @@ const struct Item gItemsInfo[] = [ITEM_GRASS_TERA_SHARD] = { - .name = _("Grass Tera Shard"), + .name = ITEM_NAME("Grass Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13433,10 +14309,11 @@ const struct Item gItemsInfo[] = [ITEM_GROUND_TERA_SHARD] = { - .name = _("Ground Tera Shard"), + .name = ITEM_NAME("Ground Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13445,10 +14322,11 @@ const struct Item gItemsInfo[] = [ITEM_ICE_TERA_SHARD] = { - .name = _("Ice Tera Shard"), + .name = ITEM_NAME("Ice Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13457,10 +14335,11 @@ const struct Item gItemsInfo[] = [ITEM_NORMAL_TERA_SHARD] = { - .name = _("Normal Tera Shard"), + .name = ITEM_NAME("Normal Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13469,10 +14348,11 @@ const struct Item gItemsInfo[] = [ITEM_POISON_TERA_SHARD] = { - .name = _("Poison Tera Shard"), + .name = ITEM_NAME("Poison Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13481,10 +14361,11 @@ const struct Item gItemsInfo[] = [ITEM_PSYCHIC_TERA_SHARD] = { - .name = _("Psychic Tera Shard"), + .name = ITEM_NAME("Psychic Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13493,10 +14374,11 @@ const struct Item gItemsInfo[] = [ITEM_ROCK_TERA_SHARD] = { - .name = _("Rock Tera Shard"), + .name = ITEM_NAME("Rock Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13505,10 +14387,11 @@ const struct Item gItemsInfo[] = [ITEM_STEEL_TERA_SHARD] = { - .name = _("Steel Tera Shard"), + .name = ITEM_NAME("Steel Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13517,10 +14400,11 @@ const struct Item gItemsInfo[] = [ITEM_WATER_TERA_SHARD] = { - .name = _("Water Tera Shard"), + .name = ITEM_NAME("Water Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13529,7 +14413,7 @@ const struct Item gItemsInfo[] = [ITEM_ADAMANT_CRYSTAL] = { - .name = _("Adamant Crystal"), + .name = ITEM_NAME("Adamant Crystal"), .price = 0, .holdEffect = HOLD_EFFECT_ADAMANT_ORB, .holdEffectParam = 20, @@ -13538,6 +14422,7 @@ const struct Item gItemsInfo[] = "that lets Dialga\n" "change form."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -13547,7 +14432,7 @@ const struct Item gItemsInfo[] = [ITEM_GRISEOUS_CORE] = { - .name = _("Griseous Core"), + .name = ITEM_NAME("Griseous Core"), .price = 0, .holdEffect = HOLD_EFFECT_GRISEOUS_ORB, .holdEffectParam = 20, @@ -13556,6 +14441,7 @@ const struct Item gItemsInfo[] = "that lets Giratina\n" "change form."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -13565,7 +14451,7 @@ const struct Item gItemsInfo[] = [ITEM_LUSTROUS_GLOBE] = { - .name = _("Lustrous Globe"), + .name = ITEM_NAME("Lustrous Globe"), .price = 0, .holdEffect = HOLD_EFFECT_LUSTROUS_ORB, .holdEffectParam = 20, @@ -13574,6 +14460,7 @@ const struct Item gItemsInfo[] = "that lets Palkia\n" "change form."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -13583,13 +14470,14 @@ const struct Item gItemsInfo[] = [ITEM_BLACK_AUGURITE] = { - .name = _("Black Augurite"), + .name = ITEM_NAME("Black Augurite"), .price = 8000, .description = COMPOUND_STRING( "A black stone that\n" "makes some PokΓ©mon\n" "evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -13600,13 +14488,14 @@ const struct Item gItemsInfo[] = [ITEM_LINKING_CORD] = { - .name = _("Linking Cord"), + .name = ITEM_NAME("Linking Cord"), .price = 8000, .description = COMPOUND_STRING( "A mysterious string\n" "that makes some\n" "PokΓ©mon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -13617,13 +14506,14 @@ const struct Item gItemsInfo[] = [ITEM_PEAT_BLOCK] = { - .name = _("Peat Block"), + .name = ITEM_NAME("Peat Block"), .price = 10000, .description = COMPOUND_STRING( "A block of material\n" "that makes some\n" "PokΓ©mon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -13634,7 +14524,7 @@ const struct Item gItemsInfo[] = [ITEM_BERSERK_GENE] = { - .name = _("Berserk Gene"), + .name = ITEM_NAME("Berserk Gene"), .price = 20, .holdEffect = HOLD_EFFECT_BERSERK_GENE, .description = COMPOUND_STRING( @@ -13642,6 +14532,7 @@ const struct Item gItemsInfo[] = "Attack, but causes\n" "lasting confusion."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -13651,7 +14542,7 @@ const struct Item gItemsInfo[] = [ITEM_FAIRY_FEATHER] = { - .name = _("Fairy Feather"), + .name = ITEM_NAME("Fairy Feather"), .price = 1000, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -13660,6 +14551,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Fairy-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FAIRY, @@ -13670,13 +14562,14 @@ const struct Item gItemsInfo[] = [ITEM_SYRUPY_APPLE] = { - .name = _("Syrupy Apple"), + .name = ITEM_NAME("Syrupy Apple"), .price = 2200, .description = COMPOUND_STRING( "A very syrupy apple\n" "that makes certain\n" "PokΓ©mon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -13687,13 +14580,14 @@ const struct Item gItemsInfo[] = [ITEM_UNREMARKABLE_TEACUP] = { - .name = _("Unremarkable Teacup"), + .name = ITEM_NAME("Unremarkable Teacup"), .price = 1600, .description = COMPOUND_STRING( "A cracked teacup\n" "that makes certain\n" "PokΓ©mon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -13704,13 +14598,14 @@ const struct Item gItemsInfo[] = [ITEM_MASTERPIECE_TEACUP] = { - .name = _("Masterpiece Teacup"), + .name = ITEM_NAME("Masterpiece Teacup"), .price = 38000, .description = COMPOUND_STRING( "A chipped teacup\n" "that makes certain\n" "PokΓ©mon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -13721,7 +14616,7 @@ const struct Item gItemsInfo[] = [ITEM_CORNERSTONE_MASK] = { - .name = _("Cornerstone Mask"), + .name = ITEM_NAME("Cornerstone Mask"), .price = 0, .holdEffect = HOLD_EFFECT_OGERPON_MASK, .holdEffectParam = 20, @@ -13730,6 +14625,7 @@ const struct Item gItemsInfo[] = "wield the Rock-\n" "type in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SPECIAL_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_CornerstoneMask, @@ -13738,7 +14634,7 @@ const struct Item gItemsInfo[] = [ITEM_WELLSPRING_MASK] = { - .name = _("Wellspring Mask"), + .name = ITEM_NAME("Wellspring Mask"), .price = 0, .holdEffect = HOLD_EFFECT_OGERPON_MASK, .holdEffectParam = 20, @@ -13747,6 +14643,7 @@ const struct Item gItemsInfo[] = "wield the Water-\n" "type in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SPECIAL_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_WellspringMask, @@ -13755,7 +14652,7 @@ const struct Item gItemsInfo[] = [ITEM_HEARTHFLAME_MASK] = { - .name = _("Hearthflame Mask"), + .name = ITEM_NAME("Hearthflame Mask"), .price = 0, .holdEffect = HOLD_EFFECT_OGERPON_MASK, .holdEffectParam = 20, @@ -13764,6 +14661,7 @@ const struct Item gItemsInfo[] = "wield the Fire-\n" "type in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SPECIAL_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_HearthflameMask, @@ -13772,11 +14670,12 @@ const struct Item gItemsInfo[] = [ITEM_HEALTH_MOCHI] = { - .name = _("Health Mochi"), - .pluralName = _("Health Mochi"), + .name = ITEM_NAME("Health Mochi"), + .pluralName = ITEM_PLURAL_NAME("Health Mochi"), .price = 500, .description = sHealthFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_MOCHI, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_HpMochi, @@ -13787,11 +14686,12 @@ const struct Item gItemsInfo[] = [ITEM_MUSCLE_MOCHI] = { - .name = _("Muscle Mochi"), - .pluralName = _("Muscle Mochi"), + .name = ITEM_NAME("Muscle Mochi"), + .pluralName = ITEM_PLURAL_NAME("Muscle Mochi"), .price = 500, .description = sMuscleFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_MOCHI, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_AtkMochi, @@ -13802,11 +14702,12 @@ const struct Item gItemsInfo[] = [ITEM_RESIST_MOCHI] = { - .name = _("Resist Mochi"), - .pluralName = _("Resist Mochi"), + .name = ITEM_NAME("Resist Mochi"), + .pluralName = ITEM_PLURAL_NAME("Resist Mochi"), .price = 500, .description = sResistFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_MOCHI, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_DefMochi, @@ -13817,11 +14718,12 @@ const struct Item gItemsInfo[] = [ITEM_GENIUS_MOCHI] = { - .name = _("Genius Mochi"), - .pluralName = _("Genius Mochi"), + .name = ITEM_NAME("Genius Mochi"), + .pluralName = ITEM_PLURAL_NAME("Genius Mochi"), .price = 500, .description = sGeniusFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_MOCHI, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_SpatkMochi, @@ -13832,11 +14734,12 @@ const struct Item gItemsInfo[] = [ITEM_CLEVER_MOCHI] = { - .name = _("Clever Mochi"), - .pluralName = _("Clever Mochi"), + .name = ITEM_NAME("Clever Mochi"), + .pluralName = ITEM_PLURAL_NAME("Clever Mochi"), .price = 500, .description = sCleverFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_MOCHI, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_SpdefMochi, @@ -13847,11 +14750,12 @@ const struct Item gItemsInfo[] = [ITEM_SWIFT_MOCHI] = { - .name = _("Swift Mochi"), - .pluralName = _("Swift Mochi"), + .name = ITEM_NAME("Swift Mochi"), + .pluralName = ITEM_PLURAL_NAME("Swift Mochi"), .price = 500, .description = sSwiftFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_MOCHI, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_SpeedMochi, @@ -13862,14 +14766,15 @@ const struct Item gItemsInfo[] = [ITEM_FRESH_START_MOCHI] = { - .name = _("Fresh Start Mochi"), - .pluralName = _("Fresh Start Mochi"), + .name = ITEM_NAME("Fresh Start Mochi"), + .pluralName = ITEM_PLURAL_NAME("Fresh Start Mochi"), .price = 300, .description = COMPOUND_STRING( "An item that resets\n" "all base points of\n" "a PokΓ©mon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_MOCHI, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_ResetEVs, .effect = gItemEffect_ResetMochi, @@ -13880,7 +14785,7 @@ const struct Item gItemsInfo[] = [ITEM_GLIMMERING_CHARM] = { - .name = _("Glimmering Charm"), + .name = ITEM_NAME("Glimmering Charm"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -13896,13 +14801,14 @@ const struct Item gItemsInfo[] = [ITEM_METAL_ALLOY] = { - .name = _("Metal Alloy"), + .name = ITEM_NAME("Metal Alloy"), .price = 6000, .description = COMPOUND_STRING( "A peculiar metal\n" "that makes certain\n" "PokΓ©mon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -13912,10 +14818,11 @@ const struct Item gItemsInfo[] = [ITEM_STELLAR_TERA_SHARD] = { - .name = _("Stellar Tera Shard"), + .name = ITEM_NAME("Stellar Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_StellarTeraShard, @@ -13924,10 +14831,11 @@ const struct Item gItemsInfo[] = [ITEM_JUBILIFE_MUFFIN] = { - .name = _("Jubilife Muffin"), + .name = ITEM_NAME("Jubilife Muffin"), .price = 250, .description = sFullHealDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -13939,13 +14847,14 @@ const struct Item gItemsInfo[] = [ITEM_REMEDY] = { - .name = _("Remedy"), + .name = ITEM_NAME("Remedy"), .price = 150, .description = COMPOUND_STRING( "A bitter powder\n" "that restores HP\n" "by 20 points."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -13957,7 +14866,7 @@ const struct Item gItemsInfo[] = [ITEM_FINE_REMEDY] = { - .name = _("Fine Remedy"), + .name = ITEM_NAME("Fine Remedy"), .price = 150, .description = COMPOUND_STRING( "A bitter powder\n" @@ -13968,6 +14877,7 @@ const struct Item gItemsInfo[] = "by 50 points."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -13979,7 +14889,7 @@ const struct Item gItemsInfo[] = [ITEM_SUPERB_REMEDY] = { - .name = _("Superb Remedy"), + .name = ITEM_NAME("Superb Remedy"), .price = 750, .description = COMPOUND_STRING( "A bitter powder\n" @@ -13990,6 +14900,7 @@ const struct Item gItemsInfo[] = "by 200 points."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -14001,7 +14912,7 @@ const struct Item gItemsInfo[] = [ITEM_AUX_EVASION] = { - .name = _("Aux Evasion"), + .name = ITEM_NAME("Aux Evasion"), .price = 800, .holdEffectParam = X_ITEM_STAGES, .description = COMPOUND_STRING( @@ -14014,6 +14925,7 @@ const struct Item gItemsInfo[] = "during one battle."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_AUX_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, //.effect = currently missing @@ -14023,7 +14935,7 @@ const struct Item gItemsInfo[] = [ITEM_AUX_GUARD] = { - .name = _("Aux Guard"), + .name = ITEM_NAME("Aux Guard"), .price = 400, .holdEffectParam = X_ITEM_STAGES, .description = COMPOUND_STRING( @@ -14036,6 +14948,7 @@ const struct Item gItemsInfo[] = "during one battle."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_AUX_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, //.effect = currently missing @@ -14045,7 +14958,7 @@ const struct Item gItemsInfo[] = [ITEM_AUX_POWER] = { - .name = _("Aux Power"), + .name = ITEM_NAME("Aux Power"), .price = 400, .holdEffectParam = X_ITEM_STAGES, .description = COMPOUND_STRING( @@ -14058,6 +14971,7 @@ const struct Item gItemsInfo[] = "during one battle."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_AUX_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, //.effect = currently missing @@ -14067,7 +14981,7 @@ const struct Item gItemsInfo[] = [ITEM_AUX_POWERGUARD] = { - .name = _("Aux Powerguard"), + .name = ITEM_NAME("Aux Powerguard"), .price = 1200, .holdEffectParam = X_ITEM_STAGES, .description = COMPOUND_STRING( @@ -14081,6 +14995,7 @@ const struct Item gItemsInfo[] = "one battle."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_AUX_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, //.effect = currently missing @@ -14090,7 +15005,7 @@ const struct Item gItemsInfo[] = [ITEM_CHOICE_DUMPLING] = { - .name = _("Choice Dumpling"), + .name = ITEM_NAME("Choice Dumpling"), .price = 1200, .description = sQuestionMarksDesc, .pocket = POCKET_ITEMS, @@ -14103,7 +15018,7 @@ const struct Item gItemsInfo[] = [ITEM_SWAP_SNACK] = { - .name = _("Swap Snack"), + .name = ITEM_NAME("Swap Snack"), .price = 1200, .description = sQuestionMarksDesc, .pocket = POCKET_ITEMS, @@ -14116,7 +15031,7 @@ const struct Item gItemsInfo[] = [ITEM_TWICE_SPICED_RADISH] = { - .name = _("Twice-Spiced Radish"), + .name = ITEM_NAME("Twice-Spiced Radish"), .price = 1600, .description = sQuestionMarksDesc, .pocket = POCKET_ITEMS, @@ -14129,16 +15044,20 @@ const struct Item gItemsInfo[] = [ITEM_POKESHI_DOLL] = { - .name = _("PokΓ©shi Doll"), + .name = ITEM_NAME("PokΓ©shi Doll"), .price = 2000, .description = COMPOUND_STRING( "A wooden toy\n" - "resembling a PokΓ©-.\n" + "resembling a PokΓ©-\n" "mon. Can be sold."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_PokeshiDoll, .iconPalette = gItemIconPalette_PokeshiDoll, }, }; + +#undef ITEM_NAME +#undef ITEM_PLURAL_NAME diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 51f3438952db..5db6742239d9 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -171,15 +171,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "high critical-hit ratio."), .effect = EFFECT_HIT, .power = 50, - .type = TYPE_FIGHTING, + .type = B_UPDATED_MOVE_TYPES >= GEN_2 ? TYPE_FIGHTING : TYPE_NORMAL, .accuracy = 100, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 25, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, @@ -202,8 +202,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_CUTE : CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_POUND}, .battleAnimScript = gBattleAnimMove_DoubleSlap, @@ -226,7 +226,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .punchingMove = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -249,7 +249,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .punchingMove = TRUE, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_REPETITION_NOT_BORING : CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_MIND_READER}, @@ -274,7 +274,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PAYDAY, }), - .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST : CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -302,7 +302,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .chance = 10, }), .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = COMBO_STARTER_FIRE_PUNCH, .contestComboMoves = {COMBO_STARTER_ICE_PUNCH, COMBO_STARTER_SUNNY_DAY, COMBO_STARTER_THUNDER_PUNCH}, .battleAnimScript = gBattleAnimMove_FirePunch, @@ -439,14 +439,26 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_RAZOR_WIND] = { .name = COMPOUND_STRING("Razor Wind"), - .description = COMPOUND_STRING( - "A 2-turn move with a high\n" - "critical-hit ratio."), + #if B_UPDATED_MOVE_DATA == GEN_3 + .description = COMPOUND_STRING( + "A 2-turn move that strikes\n" + "the foe on the 2nd turn."); + #else + .description = COMPOUND_STRING( + "A 2-turn move with a high\n" + "critical-hit ratio."), + #endif .effect = EFFECT_TWO_TURNS_ATTACK, .power = 80, .type = TYPE_NORMAL, - .accuracy = 100, - .criticalHitStage = 1, + .accuracy = B_UPDATED_MOVE_DATA >= GEN_3 ? 100 : 75, + #if B_UPDATED_MOVE_DATA >= GEN_4 + .criticalHitStage = 1, + #elif B_UPDATED_MOVE_DATA == GEN_3 + .criticalHitStage = 0, + #else + .criticalHitStage = 2, + #endif .pp = 10, .target = MOVE_TARGET_BOTH, .priority = 0, @@ -503,7 +515,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .slicingMove = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SWORDS_DANCE}, @@ -518,16 +530,16 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "of wind whipped up by wings."), .effect = EFFECT_HIT, .power = 40, - .type = TYPE_FLYING, + .type = B_UPDATED_MOVE_TYPES >= GEN_2 ? TYPE_FLYING : TYPE_NORMAL, .accuracy = 100, .pp = 35, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_4) || (B_UPDATED_MOVE_FLAGS < GEN_3), - .damagesAirborneDoubleDamage = TRUE, + .damagesAirborneDoubleDamage = B_UPDATED_MOVE_FLAGS >= GEN_2, .windMove = TRUE, - .contestEffect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MON : CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -541,7 +553,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "Strikes the foe with wings\n" "spread wide."), .effect = EFFECT_HIT, - .power = 60, + .power = B_UPDATED_MOVE_DATA >= GEN_2 ? 60 : 35, .type = TYPE_FLYING, .accuracy = 100, .pp = 35, @@ -549,7 +561,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -565,22 +577,33 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_ROAR, .power = 0, .type = TYPE_NORMAL, - .accuracy = B_UPDATED_MOVE_DATA >= GEN_6 ? 0 : 100, + #if B_UPDATED_MOVE_DATA >= GEN_6 + .accuracy = 0, + .priority = -6, + #elif B_UPDATED_MOVE_DATA >= GEN_3 + .accuracy = 100, + .priority = -6, + #elif B_UPDATED_MOVE_DATA == GEN_2 + .accuracy = 100, + .priority = -1, + #else + .accuracy = 85, + .priority = 0, + #endif .pp = 20, .target = MOVE_TARGET_SELECTED, - .priority = -6, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, .windMove = TRUE, .ignoresProtect = B_UPDATED_MOVE_FLAGS >= GEN_6, .ignoresSubstitute = TRUE, .magicCoatAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, - .copycatBanned = TRUE, - .assistBanned = TRUE, - .contestEffect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, + .copycatBanned = B_UPDATED_MOVE_FLAGS >= GEN_6, + .assistBanned = B_UPDATED_MOVE_FLAGS >= GEN_6, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_NEXT_APPEAL_LATER : CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_STEALTH_ROCK, COMBO_STARTER_SPIKES, COMBO_STARTER_TOXIC_SPIKES}, .battleAnimScript = gBattleAnimMove_Whirlwind, .validApprenticeMove = TRUE, }, @@ -603,9 +626,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .gravityBanned = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .assistBanned = TRUE, - .argument.twoTurnAttack = { .stringId = STRINGID_PKMNFLEWHIGH, .status = COMPRESS_BITS(STATUS3_ON_AIR) }, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, + .assistBanned = B_UPDATED_MOVE_FLAGS >= GEN_6, + .argument.twoTurnAttack = { .stringId = STRINGID_PKMNFLEWHIGH, .status = STATE_ON_AIR }, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE_ONCE : CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -631,6 +654,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WRAP, + .multistring.wrapped = B_MSG_WRAPPED_BIND, }), .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -656,7 +680,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .skyBattleBanned = TRUE, - .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_POUND}, @@ -707,13 +731,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .minimizeDoubleDamage = TRUE, + .minimizeDoubleDamage = B_UPDATED_MOVE_FLAGS >= GEN_2, .skyBattleBanned = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FLINCH, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_LEER}, @@ -737,7 +761,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .strikeCount = 2, - .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL : CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -760,7 +784,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED : CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_MIND_READER}, @@ -776,7 +800,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "miss and hurt the kicker."), #if B_UPDATED_MOVE_DATA >= GEN_5 .power = 100, - #elif B_UPDATED_MOVE_DATA >= GEN_4 + #elif B_UPDATED_MOVE_DATA == GEN_4 .power = 85, #else .power = 70, @@ -818,7 +842,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_FLINCH, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -834,7 +858,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "by hurling sand in its face."), .effect = EFFECT_ACCURACY_DOWN, .power = 0, - .type = TYPE_GROUND, + .type = B_UPDATED_MOVE_TYPES >= GEN_2 ? TYPE_GROUND : TYPE_NORMAL, .accuracy = 100, .pp = 15, .target = MOVE_TARGET_SELECTED, @@ -842,7 +866,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_EVSN_UP_1 }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION : CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = COMBO_STARTER_SAND_ATTACK, .contestComboMoves = {COMBO_STARTER_MUD_SLAP, COMBO_STARTER_SANDSTORM}, @@ -869,7 +893,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_FLINCH, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MON, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_STARTLE_PREV_MON, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, @@ -914,7 +938,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HORN_ATTACK, COMBO_STARTER_PECK}, @@ -1016,8 +1040,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, + .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WRAP, + .multistring.wrapped = B_MSG_WRAPPED_WRAP, }), .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -1071,7 +1097,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_THRASH, .self = TRUE, }), - .contestEffect = CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_USER_MORE_EASILY_STARTLED : CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAGE}, @@ -1086,14 +1112,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "A life-risking tackle that\n" "also hurts the user."), .effect = EFFECT_RECOIL, - .power = 120, + .power = B_UPDATED_MOVE_DATA >= GEN_2 ? 120 : 100, .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .recoilPercentage = 33 }, + .argument = { .recoilPercentage = B_UPDATED_MOVE_DATA >= GEN_3 ? 33 : 25 }, .makesContact = TRUE, .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -1142,7 +1168,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_POISON, - .chance = 30, + .chance = B_UPDATED_MOVE_DATA >= GEN_2 ? 30 : 20, }), .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MON, .contestCategory = CONTEST_CATEGORY_SMART, @@ -1171,7 +1197,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_POISON, .chance = 20, }), - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MON, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_IF_SAME_TYPE : CONTEST_EFFECT_STARTLE_PREV_MON, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -1193,7 +1219,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -1216,7 +1242,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ATK_UP_1 }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION : CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = COMBO_STARTER_LEER, .contestComboMoves = {COMBO_STARTER_RAGE, COMBO_STARTER_SCARY_FACE}, @@ -1231,7 +1257,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "May cause flinching."), .effect = EFFECT_HIT, .power = 60, - .type = TYPE_DARK, + .type = B_UPDATED_MOVE_TYPES >= GEN_2 ? TYPE_DARK : TYPE_NORMAL, .accuracy = 100, .pp = 25, .target = MOVE_TARGET_SELECTED, @@ -1241,9 +1267,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .bitingMove = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FLINCH, - .chance = 30, + .chance = B_UPDATED_MOVE_DATA >= GEN_2 ? 30 : 10, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MON : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_LEER, COMBO_STARTER_SCARY_FACE}, @@ -1288,19 +1314,25 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .accuracy = B_UPDATED_MOVE_DATA >= GEN_6 ? 0 : 100, .pp = 20, .target = MOVE_TARGET_SELECTED, - .priority = -6, + #if B_UPDATED_MOVE_DATA >= GEN_3 + .priority = -6, + #elif B_UPDATED_MOVE_DATA == GEN_2 + .priority = -1, + #else + .priority = 0, + #endif .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, .ignoresProtect = B_UPDATED_MOVE_FLAGS >= GEN_6, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .magicCoatAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, .soundMove = TRUE, - .copycatBanned = TRUE, - .assistBanned = TRUE, - .contestEffect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, + .copycatBanned = B_UPDATED_MOVE_FLAGS >= GEN_6, + .assistBanned = B_UPDATED_MOVE_FLAGS >= GEN_6, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_NEXT_APPEAL_LATER : CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_STEALTH_ROCK, COMBO_STARTER_ENTRAINMENT, COMBO_STARTER_PLAY_NICE, COMBO_STARTER_SPIKES, COMBO_STARTER_TOXIC_SPIKES}, .battleAnimScript = gBattleAnimMove_Roar, .validApprenticeMove = TRUE, }, @@ -1350,7 +1382,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .magicCoatAffected = TRUE, .soundMove = TRUE, - .contestEffect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION : CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -1364,7 +1396,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Launches shock waves that\n" "always inflict 20 HP damage."), - .effect = EFFECT_FIXED_DAMAGE_ARG, + .effect = EFFECT_FIXED_HP_DAMAGE, .power = 1, .type = TYPE_NORMAL, .accuracy = 90, @@ -1373,7 +1405,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .fixedDamage = 20 }, - .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_REPETITION_NOT_BORING : CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -1438,9 +1470,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = B_UPDATED_MOVE_DATA >= GEN_4 ? MOVE_EFFECT_SP_DEF_MINUS_1 : MOVE_EFFECT_DEF_MINUS_1, - .chance = 10, + .chance = B_UPDATED_MOVE_DATA >= GEN_2 ? 10 : 33, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -1466,7 +1498,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .chance = 10, }), .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_CUTE : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_Ember, @@ -1559,7 +1591,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED : CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, @@ -1587,7 +1619,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .damagesUnderwater = TRUE, .skyBattleBanned = TRUE, - .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MONS : CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = COMBO_STARTER_SURF, .contestComboMoves = {COMBO_STARTER_DIVE, COMBO_STARTER_RAIN_DANCE}, @@ -1619,7 +1651,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE, .chance = 10, }), - .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON : CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HAIL}, @@ -1640,7 +1672,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_HIT, .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 110 : 120, .type = TYPE_ICE, - .accuracy = 70, + .accuracy = B_UPDATED_MOVE_DATA >= GEN_2 ? 70 : 90, .pp = 5, .target = MOVE_TARGET_BOTH, .priority = 0, @@ -1651,7 +1683,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE, .chance = 10, }), - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS : CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HAIL, COMBO_STARTER_POWDER_SNOW}, @@ -1677,7 +1709,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_CONFUSION, .chance = 10, }), - .contestEffect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION : CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND}, @@ -1701,9 +1733,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_SPD_MINUS_1, - .chance = 10, + .chance = B_UPDATED_MOVE_DATA >= GEN_2 ? 10 : 33, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MON : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, @@ -1726,9 +1758,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_ATK_MINUS_1, - .chance = 10, + .chance = B_UPDATED_MOVE_DATA >= GEN_2 ? 10 : 33, }), - .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MON : CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HAIL}, @@ -1797,7 +1829,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL : CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_PECK}, @@ -1832,19 +1864,30 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_LOW_KICK] = { .name = COMPOUND_STRING("Low Kick"), - .description = COMPOUND_STRING( - "A kick that inflicts more\n" - "damage on heavier foes."), - .effect = EFFECT_LOW_KICK, - .power = 1, + #if B_UPDATED_MOVE_DATA >= GEN_3 + .description = COMPOUND_STRING( + "A kick that inflicts more\n" + "damage on heavier foes."), + .effect = EFFECT_LOW_KICK, + #else + .description = COMPOUND_STRING( + "A low, tripping kick that\n" + "may cause flinching."), + .effect = EFFECT_HIT, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), + #endif + .power = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 50, .type = TYPE_FIGHTING, - .accuracy = 100, + .accuracy = B_UPDATED_MOVE_DATA >= GEN_3 ? 100 : 90, .pp = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_WHEN_LATER : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -1867,15 +1910,17 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = -5, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, + .ignoresProtect = B_UPDATED_MOVE_FLAGS < GEN_5, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_3 || B_UPDATED_MOVE_FLAGS == GEN_4), .meFirstBanned = TRUE, .metronomeBanned = B_UPDATED_MOVE_FLAGS >= GEN_2, .copycatBanned = TRUE, .assistBanned = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, + .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS >= GEN_4, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_IF_LAST : CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_TAUNT}, + .contestComboMoves = {COMBO_STARTER_TAUNT, COMBO_STARTER_ENCORE, COMBO_STARTER_TORMENT}, .battleAnimScript = gBattleAnimMove_Counter, .validApprenticeMove = TRUE, }, @@ -1896,10 +1941,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .skyBattleBanned = TRUE, - .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_REPETITION_NOT_BORING : CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_FAKE_OUT}, + .contestComboMoves = {COMBO_STARTER_FAKE_OUT, COMBO_STARTER_ENTRAINMENT, COMBO_STARTER_PLAY_NICE}, .battleAnimScript = gBattleAnimMove_SeismicToss, .validApprenticeMove = TRUE, }, @@ -1919,7 +1964,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -1944,7 +1989,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .argument = { .absorbPercentage = 50 }, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_3 || B_UPDATED_MOVE_FLAGS == GEN_4), .healingMove = B_HEAL_BLOCKING >= GEN_6, - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MON, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_STARTLE_PREV_MON, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_GROWTH}, @@ -1967,7 +2012,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .zMove = { .powerOverride = 120 }, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_3 || B_UPDATED_MOVE_FLAGS == GEN_4), .healingMove = B_HEAL_BLOCKING >= GEN_6, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MON : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_GROWTH}, @@ -1990,10 +2035,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS : CONTEST_EFFECT_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = COMBO_STARTER_LEECH_SEED, - .contestComboMoves = {COMBO_STARTER_GROWTH, COMBO_STARTER_WORRY_SEED}, + .contestComboMoves = {COMBO_STARTER_GROWTH, COMBO_STARTER_WORRY_SEED, COMBO_STARTER_ROTOTILLER}, .battleAnimScript = gBattleAnimMove_LeechSeed, .validApprenticeMove = TRUE, }, @@ -2024,7 +2069,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = COMBO_STARTER_GROWTH, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_Growth, .validApprenticeMove = TRUE, }, @@ -2039,13 +2084,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 55, .type = TYPE_GRASS, .accuracy = 95, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 25, .target = MOVE_TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .slicingMove = TRUE, - .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_GROWTH}, @@ -2070,7 +2115,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .sleepTalkBanned = TRUE, .instructBanned = TRUE, .argument.twoTurnAttack = { .stringId = STRINGID_PKMNTOOKSUNLIGHT, .status = B_WEATHER_SUN }, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL : CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_GROWTH, COMBO_STARTER_SUNNY_DAY}, @@ -2098,7 +2143,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .powderMove = TRUE, .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_POISON_POWDER, .contestComboMoves = {COMBO_STARTER_SWEET_SCENT}, .battleAnimScript = gBattleAnimMove_PoisonPowder, .validApprenticeMove = TRUE, @@ -2150,7 +2195,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .powderMove = TRUE, .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_SLEEP_POWDER, .contestComboMoves = {COMBO_STARTER_SWEET_SCENT}, .battleAnimScript = gBattleAnimMove_SleepPowder, .validApprenticeMove = TRUE, @@ -2183,7 +2228,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_THRASH, .self = TRUE, }), - .contestEffect = CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_USER_MORE_EASILY_STARTLED : CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_GROWTH}, @@ -2220,7 +2265,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Launches shock waves that\n" "always inflict 40 HP damage."), - .effect = EFFECT_FIXED_DAMAGE_ARG, + .effect = EFFECT_FIXED_HP_DAMAGE, .power = 1, .type = TYPE_DRAGON, .accuracy = 100, @@ -2230,7 +2275,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_4) || (B_UPDATED_MOVE_FLAGS < GEN_3), .argument = { .fixedDamage = 40 }, - .contestEffect = CONTEST_EFFECT_BETTER_WHEN_LATER, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_REPETITION_NOT_BORING : CONTEST_EFFECT_BETTER_WHEN_LATER, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = COMBO_STARTER_DRAGON_RAGE, .contestComboMoves = {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_DANCE, COMBO_STARTER_DRAGON_RUSH, COMBO_STARTER_DRAGON_TAIL}, @@ -2255,6 +2300,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WRAP, + .multistring.wrapped = B_MSG_WRAPPED_FIRE_SPIN, }), .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_BEAUTY, @@ -2332,9 +2378,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .argument = { .nonVolatileStatus = MOVE_EFFECT_PARALYSIS }, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS : CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, .contestCategory = CONTEST_CATEGORY_COOL, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_THUNDER_WAVE, .contestComboMoves = {COMBO_STARTER_CHARGE}, .battleAnimScript = gBattleAnimMove_ThunderWave, .validApprenticeMove = TRUE, @@ -2354,14 +2400,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .damagesAirborne = TRUE, + .damagesAirborne = B_UPDATED_MOVE_FLAGS >= GEN_2, .alwaysHitsInRain = TRUE, .accuracy50InSun = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PARALYSIS, - .chance = 30, + .chance = B_UPDATED_MOVE_DATA >= GEN_2 ? 30 : 10, }), - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED : CONTEST_EFFECT_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CHARGE, COMBO_STARTER_LOCK_ON, COMBO_STARTER_RAIN_DANCE}, @@ -2378,12 +2424,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_HIT, .power = 50, .type = TYPE_ROCK, - .accuracy = 90, + .accuracy = B_UPDATED_MOVE_DATA >= GEN_2 ? 90 : 65, .pp = 15, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = COMBO_STARTER_ROCK_THROW, .contestComboMoves = {0}, @@ -2405,9 +2451,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, - .damagesUnderground = TRUE, + .damagesUnderground = B_UPDATED_MOVE_FLAGS >= GEN_2, .skyBattleBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = COMBO_STARTER_EARTHQUAKE, .contestComboMoves = {0}, @@ -2446,7 +2492,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "Digs underground the first\n" "turn and strikes next turn."), .effect = EFFECT_SEMI_INVULNERABLE, - .power = B_UPDATED_MOVE_DATA >= GEN_4 ? 80 : 60, + #if B_UPDATED_MOVE_DATA >= GEN_4 + .power = 80, + #elif B_UPDATED_MOVE_DATA >= GEN_2 + .power = 60, + #else + .power = 100, + #endif .type = TYPE_GROUND, .accuracy = 100, .pp = 10, @@ -2456,11 +2508,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .makesContact = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .assistBanned = TRUE, + .assistBanned = B_UPDATED_MOVE_FLAGS >= GEN_6, .skyBattleBanned = TRUE, - .argument.twoTurnAttack = { .stringId = STRINGID_PKMNDUGHOLE, .status = COMPRESS_BITS(STATUS3_UNDERGROUND) }, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, - .contestCategory = CONTEST_CATEGORY_SMART, + .argument.twoTurnAttack = { .stringId = STRINGID_PKMNDUGHOLE, .status = STATE_UNDERGROUND }, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE_ONCE : CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Dig, @@ -2510,7 +2562,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_CONFUSION, .chance = 10, }), - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MON, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_STARTLE_PREV_MON, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = COMBO_STARTER_CONFUSION, .contestComboMoves = {COMBO_STARTER_CALM_MIND, COMBO_STARTER_KINESIS, COMBO_STARTER_PSYCHIC}, @@ -2533,9 +2585,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_1, - .chance = 10, + .chance = B_UPDATED_MOVE_DATA >= GEN_2 ? 10 : 33, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = COMBO_STARTER_PSYCHIC, .contestComboMoves = {COMBO_STARTER_CALM_MIND, COMBO_STARTER_CONFUSION, COMBO_STARTER_KINESIS}, @@ -2614,7 +2666,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = TRUE, .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, .contestCategory = CONTEST_CATEGORY_COOL, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_AGILITY, .contestComboMoves = {COMBO_STARTER_DOUBLE_TEAM}, .battleAnimScript = gBattleAnimMove_Agility, .validApprenticeMove = TRUE, @@ -2658,8 +2710,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS : CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_COOL, .contestComboStarterId = COMBO_STARTER_RAGE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Rage, @@ -2668,10 +2720,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_TELEPORT] = { .name = COMPOUND_STRING("Teleport"), - #if B_TELEPORT_BEHAVIOUR >= GEN_8 + #if B_TELEPORT_BEHAVIOR >= GEN_8 .description = COMPOUND_STRING( "Switches the user out last.\n" - "Flees when used by wild {PKMN}.") + "Flees when used by wild {PKMN}."), #else .description = COMPOUND_STRING( "A psychic move for fleeing\n" @@ -2683,7 +2735,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .accuracy = 0, .pp = 20, .target = MOVE_TARGET_USER, - .priority = -6, + .priority = B_UPDATED_MOVE_DATA >= GEN_8 ? -6 : 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RECOVER_HP }, .ignoresProtect = TRUE, @@ -2709,7 +2761,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_REPETITION_NOT_BORING : CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -2726,7 +2778,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_MIMIC, .power = 0, .type = TYPE_NORMAL, - .accuracy = 0, + .accuracy = B_UPDATED_MOVE_DATA >= GEN_3 ? 0 : 100, .pp = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, @@ -2766,7 +2818,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .magicCoatAffected = TRUE, .soundMove = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -2792,7 +2844,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .snatchAffected = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS : CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = COMBO_STARTER_DOUBLE_TEAM, .contestComboMoves = {0}, @@ -2825,7 +2877,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .mirrorMoveBanned = TRUE, .healingMove = TRUE, .snatchAffected = TRUE, - .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_IF_SAME_TYPE : CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -2866,7 +2918,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "Minimizes the user's size to\n" #if B_MINIMIZE_EVASION >= GEN_5 "sharply raise evasiveness."), - #else + #else "raise evasiveness."), #endif .effect = EFFECT_MINIMIZE, @@ -2881,7 +2933,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .snatchAffected = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE : CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -2905,7 +2957,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_EVSN_UP_1 }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MON : CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SMOG}, @@ -2929,7 +2981,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION : CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -2955,7 +3007,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .snatchAffected = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE_ONCE : CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, @@ -3033,7 +3085,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .snatchAffected = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE_ONCE : CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND}, @@ -3085,7 +3137,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .snatchAffected = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE_ONCE : CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND}, @@ -3108,11 +3160,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ACC_UP_1 }, - .argument = { .status = STATUS2_FOCUS_ENERGY }, + .argument = { .status = VOLATILE_FOCUS_ENERGY }, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .snatchAffected = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = COMBO_STARTER_FOCUS_ENERGY, .contestComboMoves = {0}, @@ -3129,16 +3181,24 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_BIDE, .power = 1, .type = TYPE_NORMAL, - .accuracy = B_UPDATED_MOVE_DATA >= GEN_4 ? 0 : 100, + #if B_UPDATED_MOVE_DATA >= GEN_4 + .accuracy = 0, + .priority = 1, + #elif B_UPDATED_MOVE_DATA >= GEN_2 + .accuracy = 100, + .priority = 0, + #else + .accuracy = 0, + .priority = 0, + #endif .pp = 10, .target = MOVE_TARGET_USER, - .priority = B_UPDATED_MOVE_DATA >= GEN_4 ? 1 : 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_NEXT_APPEAL_LATER : CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -3168,7 +3228,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .instructBanned = TRUE, .encoreBanned = TRUE, .assistBanned = TRUE, - .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -3213,7 +3273,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "Inflicts severe damage but\n" "makes the user faint."), .effect = EFFECT_EXPLOSION, - .power = 200, + .power = B_UPDATED_MOVE_DATA >= GEN_2 ? 200 : 130, .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, @@ -3221,10 +3281,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .parentalBondBanned = TRUE, + .dampBanned = TRUE, .contestEffect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_MEAN_LOOK, COMBO_STARTER_BLOCK}, .battleAnimScript = gBattleAnimMove_SelfDestruct, .validApprenticeMove = TRUE, }, @@ -3245,7 +3306,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .ballisticMove = TRUE, .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_CUTE : CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SOFT_BOILED}, .battleAnimScript = gBattleAnimMove_EggBomb, @@ -3271,8 +3332,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_PARALYSIS, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MON : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_CUTE : CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Lick, @@ -3297,7 +3358,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_POISON, .chance = 40, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = COMBO_STARTER_SMOG, .contestComboMoves = {0}, @@ -3320,9 +3381,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_POISON, - .chance = 30, + .chance = B_UPDATED_MOVE_DATA >= GEN_2 ? 30 : 40, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MON : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = COMBO_STARTER_SLUDGE, .contestComboMoves = {COMBO_STARTER_SLUDGE_BOMB}, @@ -3347,7 +3408,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_FLINCH, .chance = 10, }), - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_REPETITION_NOT_BORING : CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = COMBO_STARTER_BONE_CLUB, .contestComboMoves = {COMBO_STARTER_BONEMERANG, COMBO_STARTER_BONE_RUSH, COMBO_STARTER_SHADOW_BONE}, @@ -3370,9 +3431,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_BURN, - .chance = 10, + .chance = B_UPDATED_MOVE_DATA >= GEN_2 ? 10 : 30, }), - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED : CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, @@ -3401,7 +3462,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .chance = 20, }), #endif - .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_BETTER_IF_LAST, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, @@ -3427,6 +3488,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WRAP, + .multistring.wrapped = B_MSG_WRAPPED_CLAMP, }), .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -3476,12 +3538,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .sleepTalkBanned = TRUE, .instructBanned = TRUE, .argument.twoTurnAttack = { .stringId = STRINGID_PKMNLOWEREDHEAD }, - .additionalEffects = ADDITIONAL_EFFECTS({ - .moveEffect = MOVE_EFFECT_DEF_PLUS_1, - .self = TRUE, - .onChargeTurnOnly = TRUE, - }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + #if B_UPDATED_MOVE_DATA >= GEN_2 + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEF_PLUS_1, + .self = TRUE, + .onChargeTurnOnly = TRUE, + }), + #endif + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -3503,7 +3567,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -3527,9 +3591,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .makesContact = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_SPD_MINUS_1, - .chance = 10, + .chance = B_UPDATED_MOVE_DATA >= GEN_2 ? 10 : 33, }), - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MON, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS : CONTEST_EFFECT_STARTLE_PREV_MON, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -3554,9 +3618,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .snatchAffected = TRUE, - .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE : CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_CUTE, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_AMNESIA, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Amnesia, .validApprenticeMove = TRUE, @@ -3577,8 +3641,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_EVSN_UP_1 }, - .magicCoatAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, - .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .magicCoatAffected = B_UPDATED_MOVE_FLAGS >= GEN_4, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_REPETITION_NOT_BORING : CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = COMBO_STARTER_KINESIS, .contestComboMoves = {COMBO_STARTER_CONFUSION, COMBO_STARTER_PSYCHIC}, @@ -3595,7 +3659,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_SOFTBOILED, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = B_UPDATED_MOVE_DATA >= GEN_9 ? 5 : 10, .target = MOVE_TARGET_USER, .priority = 0, @@ -3605,8 +3669,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .snatchAffected = TRUE, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_IF_FIRST : CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_CUTE : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = COMBO_STARTER_SOFT_BOILED, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SoftBoiled, @@ -3666,9 +3730,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .argument = { .nonVolatileStatus = MOVE_EFFECT_PARALYSIS }, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_IF_SAME_TYPE : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_TOUGH, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_GLARE, .contestComboMoves = {COMBO_STARTER_LEER}, .battleAnimScript = gBattleAnimMove_Glare, .validApprenticeMove = TRUE, @@ -3689,11 +3753,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .healingMove = B_HEAL_BLOCKING >= GEN_6, - .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_5, .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_CALM_MIND, COMBO_STARTER_HYPNOSIS}, + .contestComboMoves = {COMBO_STARTER_CALM_MIND, COMBO_STARTER_HYPNOSIS, COMBO_STARTER_LOVELY_KISS, COMBO_STARTER_SPORE, COMBO_STARTER_SING, COMBO_STARTER_YAWN, COMBO_STARTER_DARK_VOID, COMBO_STARTER_GRASS_WHISTLE, COMBO_STARTER_SLEEP_POWDER}, .battleAnimScript = gBattleAnimMove_DreamEater, .validApprenticeMove = TRUE, }, @@ -3704,13 +3767,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( #if B_UPDATED_MOVE_DATA >= GEN_5 "Envelops the foes in a toxic\n" - #else + #else "Envelops the foe in a toxic\n" #endif "gas that may poison."), #if B_UPDATED_MOVE_DATA >= GEN_6 .accuracy = 90, - #elif B_UPDATED_MOVE_DATA >= GEN_5 + #elif B_UPDATED_MOVE_DATA == GEN_5 .accuracy = 80, #else .accuracy = 55, @@ -3725,9 +3788,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .argument = { .nonVolatileStatus = MOVE_EFFECT_POISON }, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION : CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_POISON_GAS, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_PoisonGas, }, @@ -3747,8 +3810,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .ballisticMove = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_CUTE : CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Barrage, @@ -3772,7 +3835,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .makesContact = TRUE, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_3 || B_UPDATED_MOVE_FLAGS == GEN_4), .healingMove = B_HEAL_BLOCKING >= GEN_6, - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MON, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE : CONTEST_EFFECT_STARTLE_PREV_MON, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -3796,9 +3859,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .argument = { .nonVolatileStatus = MOVE_EFFECT_SLEEP }, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, //C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUICKLY_GROW_BORED : .contestCategory = CONTEST_CATEGORY_BEAUTY, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_LOVELY_KISS, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_LovelyKiss, .validApprenticeMove = TRUE, @@ -3852,13 +3915,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RECOVER_HP }, .ignoresProtect = TRUE, + .ignoresSubstitute = B_UPDATED_MOVE_FLAGS < GEN_5, .mirrorMoveBanned = TRUE, .mimicBanned = TRUE, .metronomeBanned = B_UPDATED_MOVE_FLAGS >= GEN_5, - .copycatBanned = TRUE, + .copycatBanned = B_UPDATED_MOVE_FLAGS >= GEN_5, .instructBanned = TRUE, .encoreBanned = TRUE, - .assistBanned = TRUE, + .assistBanned = B_UPDATED_MOVE_FLAGS >= GEN_5, .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, @@ -3883,9 +3947,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_SPD_MINUS_1, - .chance = 10, + .chance = B_UPDATED_MOVE_DATA >= GEN_2 ? 10 : 33, }), - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, @@ -3895,9 +3959,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_DIZZY_PUNCH] = { .name = COMPOUND_STRING("Dizzy Punch"), - .description = COMPOUND_STRING( - "A rhythmic punch that may\n" - "confuse the foe."), + #if B_UPDATED_MOVE_DATA >= GEN_2 + .description = COMPOUND_STRING( + "A rhythmic punch that may\n" + "confuse the target."), + #else + .description = COMPOUND_STRING( + "The target is hit with\n" + "rhythmic punches."), + #endif .effect = EFFECT_HIT, .power = 70, .type = TYPE_NORMAL, @@ -3908,12 +3978,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .punchingMove = TRUE, - .additionalEffects = ADDITIONAL_EFFECTS({ - .moveEffect = MOVE_EFFECT_CONFUSION, - .chance = 20, - }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, - .contestCategory = CONTEST_CATEGORY_COOL, + #if B_UPDATED_MOVE_DATA >= GEN_2 + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CONFUSION, + .chance = 20, + }), + #endif + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_CUTE : CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_DizzyPunch, @@ -3940,7 +4012,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .powderMove = TRUE, .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_BEAUTY, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_SPORE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Spore, .validApprenticeMove = TRUE, @@ -3984,7 +4056,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND}, @@ -4010,7 +4082,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .gravityBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, //C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUICKLY_GROW_BORED : .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -4035,7 +4107,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = TRUE, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE : CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -4053,13 +4125,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 100 : 90, .type = TYPE_WATER, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 90 : 85, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_REPETITION_NOT_BORING : CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_SWORDS_DANCE}, @@ -4074,7 +4146,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "Inflicts severe damage but\n" "makes the user faint."), .effect = EFFECT_EXPLOSION, - .power = 250, + .power = B_UPDATED_MOVE_DATA >= GEN_2 ? 250 : 170, .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, @@ -4082,10 +4154,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .parentalBondBanned = TRUE, + .dampBanned = TRUE, .contestEffect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_MEAN_LOOK, COMBO_STARTER_BLOCK}, .battleAnimScript = gBattleAnimMove_Explosion, .validApprenticeMove = TRUE, }, @@ -4105,7 +4178,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SCRATCH}, @@ -4127,7 +4200,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .strikeCount = 2, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL : CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = COMBO_STARTER_BONEMERANG, .contestComboMoves = {COMBO_STARTER_BONE_CLUB, COMBO_STARTER_BONE_RUSH, COMBO_STARTER_SHADOW_BONE}, @@ -4154,7 +4227,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .healingMove = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE : CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = COMBO_STARTER_REST, .contestComboMoves = {COMBO_STARTER_BELLY_DRUM, COMBO_STARTER_CHARM, COMBO_STARTER_YAWN}, @@ -4165,9 +4238,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_ROCK_SLIDE] = { .name = COMPOUND_STRING("Rock Slide"), - .description = COMPOUND_STRING( - "Large boulders are hurled.\n" - "May cause flinching."), + #if B_UPDATED_MOVE_DATA >= GEN_2 + .description = COMPOUND_STRING( + "Large boulders are hurled.\n" + "May cause flinching."), + #else + .description = COMPOUND_STRING( + "Hits the foe with an\n" + "avalanche of rocks."), + #endif .effect = EFFECT_HIT, .power = 75, .type = TYPE_ROCK, @@ -4176,11 +4255,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .additionalEffects = ADDITIONAL_EFFECTS({ - .moveEffect = MOVE_EFFECT_FLINCH, - .chance = 30, - }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + #if B_UPDATED_MOVE_DATA >= GEN_2 + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), + #endif + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MONS : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_ROCK_THROW}, @@ -4208,7 +4289,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_FLINCH, .chance = 10, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_REPETITION_NOT_BORING : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -4275,12 +4356,18 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_TRI_ATTACK] = { .name = COMPOUND_STRING("Tri Attack"), - .description = COMPOUND_STRING( - "Fires three types of beams.\n" - #if B_USE_FROSTBITE == TRUE - "May burn/para/frostbite."), + #if B_UPDATED_MOVE_DATA >= GEN_2 + .description = COMPOUND_STRING( + "Fires three types of beams.\n" + #if B_USE_FROSTBITE == TRUE + "May burn/para/frostbite."), + #else + "May burn/paralyze/freeze."), + #endif #else - "May burn/paralyze/freeze."), + .description = COMPOUND_STRING( + "A triangular field of energy\n" + "is created and launched."); #endif .effect = EFFECT_HIT, .power = 80, @@ -4290,11 +4377,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .additionalEffects = ADDITIONAL_EFFECTS({ - .moveEffect = MOVE_EFFECT_TRI_ATTACK, - .chance = 20, - }), - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MONS, + #if B_UPDATED_MOVE_DATA >= GEN_2 + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_TRI_ATTACK, + .chance = 20, + }), + #endif + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_LOCK_ON}, @@ -4308,7 +4397,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Attacks with sharp fangs\n" "and cuts half the foe's HP."), - .effect = EFFECT_SUPER_FANG, + .effect = EFFECT_FIXED_PERCENT_DAMAGE, .power = 1, .type = TYPE_NORMAL, .accuracy = 90, @@ -4316,6 +4405,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .argument = { .damagePercentage = 50 }, .makesContact = TRUE, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_3 || B_UPDATED_MOVE_FLAGS == GEN_4), .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, @@ -4336,14 +4426,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 70, .type = TYPE_NORMAL, .accuracy = 100, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .slicingMove = TRUE, - .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SCRATCH, COMBO_STARTER_SWORDS_DANCE}, @@ -4371,7 +4461,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .mirrorMoveBanned = TRUE, .skyBattleBanned = TRUE, .contestEffect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_CUTE : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Substitute, @@ -4387,19 +4477,24 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = #if B_UPDATED_MOVE_DATA >= GEN_4 .effect = EFFECT_STRUGGLE, .accuracy = 0, - .mirrorMoveBanned = TRUE, + .pp = 1, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_RECOIL_HP_25, .self = TRUE, }), - #else + #elif B_UPDATED_MOVE_DATA >= GEN_2 .effect = EFFECT_RECOIL, .accuracy = 100, + .pp = 1, .argument = { .recoilPercentage = 25 }, + #else + .effect = EFFECT_RECOIL, + .accuracy = 100, + .pp = 10, + .argument = { .recoilPercentage = 50 }, #endif .power = 50, .type = TYPE_NORMAL, - .pp = 1, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, @@ -4413,8 +4508,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .encoreBanned = TRUE, .assistBanned = TRUE, .sketchBanned = TRUE, + .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS >= GEN_4, .battleAnimScript = gBattleAnimMove_Struggle, .validApprenticeMove = TRUE, + .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_TOUGH, }, [MOVE_SKETCH] = @@ -4433,7 +4531,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ALL_STATS_UP_1 }, .ignoresProtect = TRUE, - .ignoresSubstitute = TRUE, + .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_5, .mirrorMoveBanned = TRUE, .mimicBanned = TRUE, .metronomeBanned = TRUE, @@ -4467,7 +4565,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .strikeCount = 3, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_REPETITION_NOT_BORING : CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, @@ -4481,7 +4579,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "While attacking, it may\n" "steal the foe's held item."), - .effect = EFFECT_HIT, + .effect = EFFECT_STEAL_ITEM, .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 60 : 40, .type = TYPE_DARK, .accuracy = 100, @@ -4490,15 +4588,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .additionalEffects = ADDITIONAL_EFFECTS({ - .moveEffect = MOVE_EFFECT_STEAL_ITEM, - }), .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_3 || B_UPDATED_MOVE_FLAGS == GEN_4), .meFirstBanned = TRUE, .metronomeBanned = TRUE, .copycatBanned = TRUE, .assistBanned = TRUE, - .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE : CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -4521,7 +4616,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, - .ignoresProtect = (B_UPDATED_MOVE_FLAGS >= GEN_6) || (B_UPDATED_MOVE_FLAGS <= GEN_3), + .ignoresProtect = (B_UPDATED_MOVE_FLAGS >= GEN_6) || (B_UPDATED_MOVE_FLAGS < GEN_3), .magicCoatAffected = TRUE, .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_SMART, @@ -4546,7 +4641,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, - .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_NEXT_APPEAL_EARLIER : CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = COMBO_STARTER_MIND_READER, .contestComboMoves = {0}, @@ -4569,11 +4664,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, - .ignoresProtect = B_UPDATED_MOVE_FLAGS <= GEN_3, + .ignoresProtect = B_UPDATED_MOVE_FLAGS < GEN_3, .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_LOVELY_KISS, COMBO_STARTER_SPORE, COMBO_STARTER_SING, COMBO_STARTER_YAWN, COMBO_STARTER_HYPNOSIS, COMBO_STARTER_DARK_VOID, COMBO_STARTER_GRASS_WHISTLE, COMBO_STARTER_SLEEP_POWDER}, .battleAnimScript = gBattleAnimMove_Nightmare, .validApprenticeMove = TRUE, }, @@ -4598,7 +4693,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_BURN, .chance = 10, }), - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL : CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, @@ -4626,7 +4721,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_FLINCH, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, //C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUICKLY_GROW_BORED : .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_REST}, @@ -4650,7 +4745,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_CURSE }, .ignoresProtect = TRUE, - .ignoresSubstitute = TRUE, + .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_5, .mirrorMoveBanned = TRUE, .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_LATER, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -4698,8 +4793,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RECOVER_HP }, - .ignoresProtect = B_UPDATED_MOVE_FLAGS >= GEN_5, - .ignoresSubstitute = TRUE, + .ignoresProtect = B_UPDATED_MOVE_FLAGS >= GEN_3, + .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_5, .mirrorMoveBanned = TRUE, .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_BEAUTY, @@ -4719,13 +4814,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 100, .type = TYPE_FLYING, .accuracy = 95, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 5, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .windMove = TRUE, - .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, //C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_EXCITES_AUDIENCE_MORE_IF_LAST : .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -4777,7 +4872,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_WHEN_LATER : CONTEST_EFFECT_BETTER_IF_LAST, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_ENDURE}, @@ -4806,10 +4901,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .zMove = { .effect = Z_EFFECT_RECOVER_HP }, .magicCoatAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, .ignoresSubstitute = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_WHEN_LATER, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS : CONTEST_EFFECT_BETTER_WHEN_LATER, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_CURSE}, + .contestComboMoves = {COMBO_STARTER_CURSE, COMBO_STARTER_ENCORE, COMBO_STARTER_TAUNT, COMBO_STARTER_TORMENT}, .battleAnimScript = gBattleAnimMove_Spite, .validApprenticeMove = TRUE, }, @@ -4853,14 +4948,20 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .accuracy = 0, .pp = 10, .target = MOVE_TARGET_USER, - .priority = B_UPDATED_MOVE_DATA >= GEN_5 ? 4 : 3, + #if B_UPDATED_MOVE_DATA >= GEN_5 + .priority = 4, + #elif B_UPDATED_MOVE_DATA >= GEN_3 + .priority = 3, + #else + .priority = 2, + #endif .category = DAMAGE_CATEGORY_STATUS, .argument = { .protectMethod = PROTECT_NORMAL }, .zMove = { .effect = Z_EFFECT_RESET_STATS }, .metronomeBanned = TRUE, .copycatBanned = TRUE, .assistBanned = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE_ONCE : CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HARDEN}, @@ -4908,7 +5009,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS : CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = COMBO_STARTER_SCARY_FACE, .contestComboMoves = {COMBO_STARTER_LEER, COMBO_STARTER_RAGE}, @@ -4981,7 +5082,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = TRUE, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_USER_MORE_EASILY_STARTLED : CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = COMBO_STARTER_BELLY_DRUM, .contestComboMoves = {0}, @@ -5034,7 +5135,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_ACC_MINUS_1, .chance = 100, }), - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS : CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = COMBO_STARTER_MUD_SLAP, .contestComboMoves = {COMBO_STARTER_MUD_SPORT, COMBO_STARTER_SAND_ATTACK, COMBO_STARTER_SANDSTORM}, @@ -5061,7 +5162,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_ACC_MINUS_1, .chance = 50, }), - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_REPETITION_NOT_BORING : CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_LOCK_ON, COMBO_STARTER_RAIN_DANCE}, @@ -5091,7 +5192,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .skyBattleBanned = TRUE, .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_SMART, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_SPIKES, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Spikes, .validApprenticeMove = TRUE, @@ -5116,7 +5217,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_PARALYSIS, .chance = 100, }), - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS : CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CHARGE, COMBO_STARTER_LOCK_ON}, @@ -5141,7 +5242,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .zMove = { .effect = Z_EFFECT_BOOST_CRITS }, .magicCoatAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, .ignoresSubstitute = TRUE, - .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL : CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -5170,10 +5271,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .copycatBanned = TRUE, .assistBanned = TRUE, - .contestEffect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, + .contestEffect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, //C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUICKLY_GROW_BORED : .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_CURSE, COMBO_STARTER_ENDURE, COMBO_STARTER_MEAN_LOOK}, + .contestComboMoves = {COMBO_STARTER_CURSE, COMBO_STARTER_ENDURE, COMBO_STARTER_MEAN_LOOK, COMBO_STARTER_ENCORE, COMBO_STARTER_TAUNT, COMBO_STARTER_TORMENT}, .battleAnimScript = gBattleAnimMove_DestinyBond, .validApprenticeMove = TRUE, }, @@ -5194,13 +5295,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, .ignoresProtect = TRUE, - .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, + .ignoresSubstitute = TRUE, .mirrorMoveBanned = TRUE, .soundMove = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, + .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, //C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUICKLY_GROW_BORED : .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_MEAN_LOOK, COMBO_STARTER_SING}, + .contestComboMoves = {COMBO_STARTER_MEAN_LOOK, COMBO_STARTER_SING, COMBO_STARTER_BLOCK}, .battleAnimScript = gBattleAnimMove_PerishSong, .validApprenticeMove = TRUE, }, @@ -5242,7 +5343,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .accuracy = 0, .pp = 5, .target = MOVE_TARGET_USER, - .priority = B_UPDATED_MOVE_DATA >= GEN_5 ? 4 : 3, + #if B_UPDATED_MOVE_DATA >= GEN_5 + .priority = 4, + #elif B_UPDATED_MOVE_DATA >= GEN_3 + .priority = 3, + #else + .priority = 2, + #endif .category = DAMAGE_CATEGORY_STATUS, .argument = { .protectMethod = PROTECT_NORMAL }, .zMove = { .effect = Z_EFFECT_EVSN_UP_1 }, @@ -5251,7 +5358,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .copycatBanned = TRUE, .assistBanned = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE : CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_TAUNT}, @@ -5273,7 +5380,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = COMBO_STARTER_BONE_RUSH, .contestComboMoves = {COMBO_STARTER_BONE_CLUB, COMBO_STARTER_BONEMERANG, COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_SHADOW_BONE}, @@ -5295,7 +5402,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, - .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_NEXT_APPEAL_EARLIER : CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = COMBO_STARTER_LOCK_ON, .contestComboMoves = {0}, @@ -5323,7 +5430,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_THRASH, .self = TRUE, }), - .contestEffect = CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_USER_MORE_EASILY_STARTLED : CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -5349,7 +5456,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .windMove = TRUE, - .contestEffect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS : CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = COMBO_STARTER_SANDSTORM, .contestComboMoves = {0}, @@ -5374,7 +5481,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .argument = { .absorbPercentage = 50 }, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_3 || B_UPDATED_MOVE_FLAGS == GEN_4), .healingMove = B_HEAL_BLOCKING >= GEN_6, - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON : CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_GROWTH}, @@ -5394,7 +5501,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .accuracy = 0, .pp = 10, .target = MOVE_TARGET_USER, - .priority = B_UPDATED_MOVE_DATA >= GEN_5 ? 4 : 3, + #if B_UPDATED_MOVE_DATA >= GEN_5 + .priority = 4, + #elif B_UPDATED_MOVE_DATA >= GEN_3 + .priority = 3, + #else + .priority = 2, + #endif .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, .ignoresProtect = TRUE, @@ -5402,7 +5515,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .copycatBanned = TRUE, .assistBanned = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_NEXT_APPEAL_LATER : CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = COMBO_STARTER_ENDURE, .contestComboMoves = {0}, @@ -5426,7 +5539,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION : CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = COMBO_STARTER_CHARM, .contestComboMoves = {0}, @@ -5451,8 +5564,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .makesContact = TRUE, .instructBanned = TRUE, .parentalBondBanned = TRUE, - .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_REPETITION_NOT_BORING : CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_CUTE : CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_DEFENSE_CURL, COMBO_STARTER_HARDEN}, .battleAnimScript = gBattleAnimMove_Rollout, @@ -5472,7 +5585,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, //C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUICKLY_GROW_BORED : .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SWORDS_DANCE}, @@ -5495,8 +5608,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, + //.ignoresSubstitute = TRUE, In Gen4+, the attack raise will no longer bypass Substitute. However, this is tricky to code .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS : CONTEST_EFFECT_BETTER_IF_FIRST, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -5523,7 +5637,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = TRUE, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_IF_FIRST : CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -5550,7 +5664,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_PARALYSIS, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CHARGE}, @@ -5565,7 +5679,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "on each successive hit."), #if B_UPDATED_MOVE_DATA >= GEN_6 .power = 40, - #elif B_UPDATED_MOVE_DATA >= GEN_5 + #elif B_UPDATED_MOVE_DATA == GEN_5 .power = 20, #else .power = 10, @@ -5602,12 +5716,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, + .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_DEF_PLUS_1, .self = TRUE, .chance = 10, }), - .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL : CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -5630,7 +5745,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, - .ignoresProtect = (B_UPDATED_MOVE_FLAGS >= GEN_6) || (B_UPDATED_MOVE_FLAGS <= GEN_3), + .ignoresProtect = (B_UPDATED_MOVE_FLAGS >= GEN_6) || (B_UPDATED_MOVE_FLAGS < GEN_3), .magicCoatAffected = TRUE, .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_BEAUTY, @@ -5689,7 +5804,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .mimicBanned = TRUE, .encoreBanned = TRUE, .assistBanned = TRUE, - .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_REST}, @@ -5716,8 +5831,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .ignoresSubstitute = TRUE, .mirrorMoveBanned = TRUE, - .soundMove = B_UPDATED_MOVE_FLAGS != GEN_5, - .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, + .soundMove = TRUE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE : CONTEST_EFFECT_BETTER_IF_LAST, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = COMBO_STARTER_HEAL_BELL, .contestComboMoves = {COMBO_STARTER_LUCKY_CHANT}, @@ -5740,7 +5855,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -5766,7 +5881,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_CELEBRATE, COMBO_STARTER_COVET, COMBO_STARTER_HAPPY_HOUR, COMBO_STARTER_WISH}, .battleAnimScript = gBattleAnimMove_Present, .validApprenticeMove = TRUE, }, @@ -5786,7 +5901,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MON : CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -5812,7 +5927,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = TRUE, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE_ONCE : CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -5829,13 +5944,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_PAIN_SPLIT, .power = 0, .type = TYPE_NORMAL, - .accuracy = 0, + .accuracy = B_UPDATED_MOVE_DATA >= GEN_3 ? 0 : 100, .pp = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_ENDURE}, @@ -5862,7 +5977,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_BURN, .chance = 50, }), - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_IF_LAST : CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, @@ -5936,7 +6051,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_REPETITION_NOT_BORING : CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -5963,7 +6078,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_PARALYSIS, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MON : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = COMBO_STARTER_DRAGON_BREATH, .contestComboMoves = {COMBO_STARTER_DRAGON_DANCE, COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_RUSH, COMBO_STARTER_DRAGON_TAIL}, @@ -5988,10 +6103,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .zMove = { .effect = Z_EFFECT_RESET_STATS }, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION : CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_AGILITY, COMBO_STARTER_AMNESIA, COMBO_STARTER_HONE_CLAWS, COMBO_STARTER_CALM_MIND, COMBO_STARTER_NASTY_PLOT, COMBO_STARTER_ROCK_POLISH}, .battleAnimScript = gBattleAnimMove_BatonPass, .validApprenticeMove = TRUE, }, @@ -6016,7 +6131,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresSubstitute = TRUE, .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_CUTE, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_ENCORE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Encore, .validApprenticeMove = TRUE, @@ -6038,7 +6153,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_3 || B_UPDATED_MOVE_FLAGS == GEN_4), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL : CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -6053,7 +6168,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "User spins and removes some\n" #if B_SPEED_BUFFING_RAPID_SPIN >= GEN_8 "effects, while upping speed."), - #else + #else "effects."), #endif .effect = EFFECT_RAPID_SPIN, @@ -6074,7 +6189,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = } #endif ), - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED : CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -6103,7 +6218,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ACC_UP_1 }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE_ONCE : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = COMBO_STARTER_SWEET_SCENT, .contestComboMoves = {0}, @@ -6130,7 +6245,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_DEF_MINUS_1, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -6181,10 +6296,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = -1, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_LATER, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_IF_LAST : CONTEST_EFFECT_NEXT_APPEAL_LATER, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_FAKE_OUT}, + .contestComboMoves = {COMBO_STARTER_FAKE_OUT, COMBO_STARTER_ENTRAINMENT, COMBO_STARTER_PLAY_NICE}, .battleAnimScript = gBattleAnimMove_VitalThrow, .validApprenticeMove = TRUE, }, @@ -6280,7 +6395,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = #else "The type and effectiveness\n" "vary with the user."), - #endif + #endif .power = B_HIDDEN_POWER_DMG >= GEN_6 ? 60 : 1, .effect = EFFECT_HIDDEN_POWER, .type = TYPE_NORMAL, @@ -6307,7 +6422,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 100, .type = TYPE_FIGHTING, .accuracy = 80, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 5, .target = MOVE_TARGET_SELECTED, .priority = 0, @@ -6335,13 +6450,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, + .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, .damagesAirborneDoubleDamage = TRUE, .windMove = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FLINCH, .chance = 20, }), - .contestEffect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -6366,7 +6482,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_BEAUTY : CONTEST_CATEGORY_TOUGH, .contestComboStarterId = COMBO_STARTER_RAIN_DANCE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_RainDance, @@ -6448,14 +6564,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_DEPENDS, .priority = -5, .category = DAMAGE_CATEGORY_SPECIAL, + .ignoresProtect = B_UPDATED_MOVE_FLAGS < GEN_5, .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS >= GEN_4, .meFirstBanned = TRUE, .metronomeBanned = TRUE, .assistBanned = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_IF_LAST : CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_TAUNT}, + .contestComboMoves = {COMBO_STARTER_TAUNT, COMBO_STARTER_ENCORE, COMBO_STARTER_TORMENT}, .battleAnimScript = gBattleAnimMove_MirrorCoat, .validApprenticeMove = TRUE, }, @@ -6557,7 +6674,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_1, .chance = 20, }), - .contestEffect = CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -6573,7 +6690,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "strike 2 turns later."), #if B_UPDATED_MOVE_DATA >= GEN_6 .power = 120, - #elif B_UPDATED_MOVE_DATA >= GEN_5 + #elif B_UPDATED_MOVE_DATA == GEN_5 .power = 100, #else .power = 80, @@ -6587,7 +6704,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_IF_SAME_TYPE : CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND, COMBO_STARTER_CONFUSION, COMBO_STARTER_KINESIS, COMBO_STARTER_PSYCHIC}, @@ -6614,7 +6731,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_DEF_MINUS_1, .chance = 50, }), - .contestEffect = CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -6636,9 +6753,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, + .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, .damagesUnderwater = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WRAP, + .multistring.wrapped = B_MSG_WRAPPED_WHIRLPOOL, }), .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_BEAUTY, @@ -6662,7 +6781,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION : CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -6689,7 +6808,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_FLINCH, .chance = 100, }), - .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MON : CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = COMBO_STARTER_FAKE_OUT, .contestComboMoves = {0}, @@ -6701,12 +6820,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Uproar"), .description = COMPOUND_STRING( - #if B_UPROAR_TURNS >= GEN_5 - "Causes an uproar for 2 to 5\n" - #else - "Causes an uproar for 3\n" - #endif - "turns and prevents sleep."), + #if B_UPROAR_TURNS >= GEN_5 + "Causes an uproar for 3\n" + #else + "Causes an uproar for 2 to 5\n" + #endif + "turns and prevents sleep."), .effect = EFFECT_UPROAR, .power = B_UPDATED_MOVE_DATA >= GEN_5 ? 90 : 50, .type = TYPE_NORMAL, @@ -6723,7 +6842,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_UPROAR, .self = TRUE, }), - .contestEffect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION : CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -6749,7 +6868,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = TRUE, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS : CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = COMBO_STARTER_STOCKPILE, .contestComboMoves = {0}, @@ -6764,7 +6883,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "Releases stockpiled power\n" "(the more the better)."), .effect = EFFECT_SPIT_UP, - .power = B_UPDATED_MOVE_DATA >= GEN_4 ? 1 : 100, + .power = 1, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, @@ -6772,7 +6891,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION : CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_STOCKPILE}, @@ -6799,7 +6918,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = TRUE, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE_ONCE : CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_STOCKPILE}, @@ -6826,7 +6945,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_BURN, .chance = 10, }), - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MONS : CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, @@ -6858,7 +6977,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = COMBO_STARTER_HAIL, .contestComboMoves = {0}, @@ -6884,7 +7003,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .magicCoatAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_TOUGH, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_TORMENT, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Torment, .validApprenticeMove = TRUE, @@ -6931,9 +7050,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .argument = { .nonVolatileStatus = MOVE_EFFECT_BURN }, .zMove = { .effect = Z_EFFECT_ATK_UP_1 }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_BEAUTY, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_WILL_O_WISP, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_WillOWisp, .validApprenticeMove = TRUE, @@ -6948,7 +7067,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_MEMENTO, .power = 0, .type = TYPE_DARK, - .accuracy = 100, + .accuracy = B_UPDATED_MOVE_DATA >= GEN_4 ? 100 : 0, .pp = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, @@ -6957,7 +7076,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_MEAN_LOOK, COMBO_STARTER_BLOCK}, .battleAnimScript = gBattleAnimMove_Memento, .validApprenticeMove = TRUE, }, @@ -7008,7 +7127,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .copycatBanned = TRUE, .instructBanned = TRUE, .assistBanned = TRUE, - .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_LATER, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_IF_LAST : CONTEST_EFFECT_NEXT_APPEAL_LATER, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, @@ -7035,10 +7154,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_REMOVE_STATUS, }), - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MON, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL : CONTEST_EFFECT_STARTLE_PREV_MON, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_FORCE_PALM, COMBO_STARTER_THUNDER_WAVE, COMBO_STARTER_GLARE}, .battleAnimScript = gBattleAnimMove_SmellingSalts, .validApprenticeMove = TRUE, }, @@ -7052,7 +7171,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_FOLLOW_ME, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 20, .target = MOVE_TARGET_USER, .priority = B_UPDATED_MOVE_DATA >= GEN_6 ? 2 : 3, @@ -7085,12 +7204,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_DEPENDS, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, - .metronomeBanned = B_UPDATED_MOVE_FLAGS >= GEN_4, + .metronomeBanned = B_UPDATED_MOVE_FLAGS >= GEN_5, .copycatBanned = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, .encoreBanned = TRUE, - .assistBanned = TRUE, + .assistBanned = B_UPDATED_MOVE_FLAGS >= GEN_6, .mimicBanned = TRUE, .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, .contestCategory = CONTEST_CATEGORY_BEAUTY, @@ -7109,7 +7228,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_CHARGE, .power = 0, .type = TYPE_ELECTRIC, - .accuracy = 100, + .accuracy = 0, .pp = 20, .target = MOVE_TARGET_USER, .priority = 0, @@ -7118,7 +7237,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = TRUE, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS : CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = COMBO_STARTER_CHARGE, .contestComboMoves = {0}, @@ -7143,7 +7262,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .zMove = { .effect = Z_EFFECT_ATK_UP_1 }, .ignoresSubstitute = TRUE, .magicCoatAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, - .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS < GEN_4, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION : CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = COMBO_STARTER_TAUNT, .contestComboMoves = {0}, @@ -7160,7 +7280,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_HELPING_HAND, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 20, .target = B_UPDATED_MOVE_DATA >= GEN_4 ? MOVE_TARGET_ALLY : MOVE_TARGET_USER, .priority = 5, @@ -7172,7 +7292,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .copycatBanned = TRUE, .assistBanned = TRUE, - .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -7198,7 +7318,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .copycatBanned = TRUE, .assistBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL : CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -7251,9 +7371,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_IF_LAST : CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_CUTE, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_WISH, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Wish, .validApprenticeMove = TRUE, @@ -7268,7 +7388,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_ASSIST, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 20, .target = MOVE_TARGET_DEPENDS, .priority = 0, @@ -7299,7 +7419,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_INGRAIN, .power = 0, .type = TYPE_GRASS, - .accuracy = 100, + .accuracy = 0, .pp = 20, .target = MOVE_TARGET_USER, .priority = 0, @@ -7309,7 +7429,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .skyBattleBanned = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS : CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -7353,7 +7473,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_MAGIC_COAT, .power = 0, .type = TYPE_PSYCHIC, - .accuracy = 100, + .accuracy = 0, .pp = 15, .target = MOVE_TARGET_DEPENDS, .priority = 4, @@ -7361,7 +7481,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .zMove = { .effect = Z_EFFECT_SPDEF_UP_2 }, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_IF_LAST : CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -7378,7 +7498,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_RECYCLE, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 10, .target = MOVE_TARGET_USER, .priority = 0, @@ -7387,7 +7507,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE : CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -7408,7 +7528,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = -4, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_LATER, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_IF_LAST : CONTEST_EFFECT_NEXT_APPEAL_LATER, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = COMBO_STARTER_REVENGE, .contestComboMoves = {COMBO_STARTER_PAYBACK}, @@ -7431,7 +7551,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, @@ -7479,7 +7599,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MON : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FAKE_OUT}, @@ -7525,7 +7645,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .contestEffect = CONTEST_EFFECT_BETTER_WHEN_LATER, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_USER_MORE_EASILY_STARTLED : CONTEST_EFFECT_BETTER_WHEN_LATER, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_EARTHQUAKE, COMBO_STARTER_ENDURE, COMBO_STARTER_SUNNY_DAY}, @@ -7566,7 +7686,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_IMPRISON, .power = 0, .type = TYPE_PSYCHIC, - .accuracy = 100, + .accuracy = 0, .pp = 10, .target = MOVE_TARGET_USER, .priority = 0, @@ -7577,7 +7697,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresSubstitute = TRUE, .mirrorMoveBanned = TRUE, .forcePressure = TRUE, - .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_DONT_EXCITE_AUDIENCE : CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -7594,7 +7714,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_REFRESH, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 20, .target = MOVE_TARGET_USER, .priority = 0, @@ -7603,7 +7723,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = TRUE, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE_ONCE : CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SING, COMBO_STARTER_WATER_SPORT}, @@ -7620,7 +7740,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_GRUDGE, .power = 0, .type = TYPE_GHOST, - .accuracy = 100, + .accuracy = 0, .pp = 5, .target = MOVE_TARGET_USER, .priority = 0, @@ -7629,10 +7749,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .ignoresSubstitute = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_WHEN_LATER, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN : CONTEST_EFFECT_BETTER_WHEN_LATER, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_CURSE}, + .contestComboMoves = {COMBO_STARTER_CURSE, COMBO_STARTER_ENCORE, COMBO_STARTER_TAUNT, COMBO_STARTER_TORMENT}, .battleAnimScript = gBattleAnimMove_Grudge, .validApprenticeMove = TRUE, }, @@ -7646,7 +7766,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_SNATCH, .power = 0, .type = TYPE_DARK, - .accuracy = 100, + .accuracy = 0, .pp = 10, .target = MOVE_TARGET_DEPENDS, .priority = 4, @@ -7657,7 +7777,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .copycatBanned = TRUE, .assistBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE : CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -7708,9 +7828,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .makesContact = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .assistBanned = TRUE, + .assistBanned = B_UPDATED_MOVE_FLAGS >= GEN_6, .skyBattleBanned = TRUE, - .argument.twoTurnAttack = { .stringId = STRINGID_PKMNHIDUNDERWATER, .status = COMPRESS_BITS(STATUS3_UNDERWATER) }, + .argument.twoTurnAttack = { .stringId = STRINGID_PKMNHIDUNDERWATER, .status = STATE_UNDERWATER }, .contestEffect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = COMBO_STARTER_DIVE, @@ -7734,7 +7854,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FAKE_OUT, COMBO_STARTER_FOCUS_ENERGY}, @@ -7750,7 +7870,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_CAMOUFLAGE, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 20, .target = MOVE_TARGET_USER, .priority = 0, @@ -7759,7 +7879,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = TRUE, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES : CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -7815,7 +7935,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_1, .chance = 50, }), - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MON, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL : CONTEST_EFFECT_STARTLE_PREV_MON, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND}, @@ -7842,7 +7962,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SP_ATK_MINUS_1, .chance = 50, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND}, @@ -7910,7 +8030,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 85, .type = TYPE_FIRE, .accuracy = 90, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, @@ -7920,10 +8040,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_BURN, .chance = 10, }), - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_REPETITION_NOT_BORING : CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, + .contestComboMoves = {COMBO_STARTER_SUNNY_DAY, COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_BlazeKick, .validApprenticeMove = TRUE, }, @@ -7938,7 +8058,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_MUD_SPORT, .power = 0, .type = TYPE_GROUND, - .accuracy = 100, + .accuracy = 0, .pp = 15, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, @@ -7947,7 +8067,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .skyBattleBanned = TRUE, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST : CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = COMBO_STARTER_MUD_SPORT, .contestComboMoves = {COMBO_STARTER_MUD_SLAP, COMBO_STARTER_SANDSTORM, COMBO_STARTER_WATER_SPORT}, @@ -7976,7 +8096,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_HAIL}, + .contestComboMoves = {COMBO_STARTER_HAIL, COMBO_STARTER_DEFENSE_CURL}, .battleAnimScript = gBattleAnimMove_IceBall, }, @@ -8000,7 +8120,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_FLINCH, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -8017,7 +8137,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_RESTORE_HP, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = B_UPDATED_MOVE_DATA >= GEN_9 ? 5 : 10, .target = MOVE_TARGET_USER, .priority = 0, @@ -8027,7 +8147,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = TRUE, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_WHEN_LATER, + .contestEffect = CONTEST_EFFECT_BETTER_WHEN_LATER, //C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUICKLY_GROW_BORED : .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -8051,7 +8171,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .soundMove = TRUE, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MONS : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -8079,7 +8199,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_TOXIC, .chance = B_UPDATED_MOVE_DATA >= GEN_6 ? 50 : 30, }), - .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -8186,7 +8306,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .self = TRUE, .chance = 20, }), - .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_REPETITION_NOT_BORING : CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -8215,7 +8335,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .chance = 30, }), .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MON, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_CUTE : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Astonish, @@ -8238,8 +8358,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .zMove = { .powerOverride = 160 }, .ballisticMove = TRUE, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_REPETITION_NOT_BORING : CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_BEAUTY : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HAIL, COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_SANDSTORM, COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_WeatherBall, @@ -8263,8 +8383,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .zMove = { .effect = Z_EFFECT_RECOVER_HP }, .snatchAffected = TRUE, .ignoresProtect = TRUE, + .ignoresSubstitute = B_UPDATED_MOVE_FLAGS < GEN_6, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE : CONTEST_EFFECT_BETTER_IF_LAST, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -8288,8 +8409,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, //C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUICKLY_GROW_BORED : + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_CUTE : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_FakeTears, @@ -8306,14 +8427,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 60 : 55, .type = TYPE_FLYING, .accuracy = 95, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 25, .target = MOVE_TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .windMove = TRUE, .slicingMove = TRUE, - .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -8365,7 +8486,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .zMove = { .effect = Z_EFFECT_ATK_UP_1 }, .ignoresSubstitute = TRUE, .magicCoatAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, - .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE_ONCE : CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -8391,7 +8512,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SPD_MINUS_1, .chance = 100, }), - .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION : CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_ROCK_THROW}, @@ -8472,9 +8593,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .magicCoatAffected = TRUE, .soundMove = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE_ONCE : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_GRASS_WHISTLE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_GrassWhistle, .validApprenticeMove = TRUE, @@ -8495,6 +8616,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, + .ignoresSubstitute = B_UPDATED_MOVE_FLAGS < GEN_4, .magicCoatAffected = TRUE, .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_CUTE, @@ -8523,7 +8645,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_BEAUTY : CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_CosmicPower, @@ -8544,7 +8666,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .contestEffect = CONTEST_EFFECT_BETTER_WHEN_LATER, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_USER_MORE_EASILY_STARTLED : CONTEST_EFFECT_BETTER_WHEN_LATER, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, @@ -8570,7 +8692,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_CONFUSION, .chance = 10, }), - .contestEffect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION : CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -8621,7 +8743,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_FLINCH, .chance = 10, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -8670,6 +8792,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WRAP, + .multistring.wrapped = B_MSG_WRAPPED_SAND_TOMB, }), .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_SMART, @@ -8685,7 +8808,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "A chilling attack that\n" "causes fainting if it hits."), - .effect = EFFECT_OHKO, + .effect = EFFECT_SHEER_COLD, .power = 1, .type = TYPE_ICE, .accuracy = 30, @@ -8720,7 +8843,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_ACC_MINUS_1, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MONS : CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, @@ -8743,10 +8866,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .ballisticMove = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_GROWTH}, + .contestComboMoves = {COMBO_STARTER_GROWTH, COMBO_STARTER_ROTOTILLER}, .battleAnimScript = gBattleAnimMove_BulletSeed, }, @@ -8788,7 +8911,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -8836,11 +8959,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, - .ignoresProtect = (B_UPDATED_MOVE_FLAGS >= GEN_6) || (B_UPDATED_MOVE_FLAGS <= GEN_3), + .ignoresProtect = B_UPDATED_MOVE_FLAGS >= GEN_6, .magicCoatAffected = TRUE, .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_CUTE, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_BLOCK, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Block, .validApprenticeMove = TRUE, @@ -8865,7 +8988,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .soundMove = B_UPDATED_MOVE_FLAGS >= GEN_8, - .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_IF_LAST : CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -8888,7 +9011,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_DANCE, COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_RUSH, COMBO_STARTER_DRAGON_TAIL}, @@ -8942,7 +9065,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_BulkUp, @@ -8967,8 +9090,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .gravityBanned = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .assistBanned = TRUE, - .argument.twoTurnAttack = { .stringId = STRINGID_PKMNSPRANGUP, .status = COMPRESS_BITS(STATUS3_ON_AIR) }, + .assistBanned = B_UPDATED_MOVE_FLAGS >= GEN_6, + .argument.twoTurnAttack = { .stringId = STRINGID_PKMNSPRANGUP, .status = STATE_ON_AIR }, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PARALYSIS, .chance = 30, @@ -8999,7 +9122,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SPD_MINUS_1, .chance = 100, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SANDSTORM}, @@ -9016,7 +9139,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 50, .type = TYPE_POISON, .accuracy = 100, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 25, .target = MOVE_TARGET_SELECTED, .priority = 0, @@ -9029,7 +9152,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_PoisonTail, .validApprenticeMove = TRUE, }, @@ -9040,7 +9163,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Cutely begs to obtain an\n" "item held by the foe."), - .effect = EFFECT_HIT, + .effect = EFFECT_STEAL_ITEM, .power = B_UPDATED_MOVE_DATA >= GEN_5 ? 60 : 40, .type = TYPE_NORMAL, .accuracy = 100, @@ -9053,12 +9176,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .copycatBanned = TRUE, .assistBanned = TRUE, - .additionalEffects = ADDITIONAL_EFFECTS({ - .moveEffect = MOVE_EFFECT_STEAL_ITEM, - }), .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, .contestCategory = CONTEST_CATEGORY_CUTE, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_COVET, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Covet, .validApprenticeMove = TRUE, @@ -9076,7 +9196,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "A life-risking tackle that\n" "slightly hurts the user."), #endif - .effect = EFFECT_HIT, + .effect = EFFECT_RECOIL, .power = 120, .type = TYPE_ELECTRIC, .accuracy = 100, @@ -9094,7 +9214,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = #endif .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, .contestCategory = CONTEST_CATEGORY_COOL, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_CHARGE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_VoltTackle, .validApprenticeMove = TRUE, @@ -9132,7 +9252,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_WATER_SPORT, .power = 0, .type = TYPE_WATER, - .accuracy = 100, + .accuracy = 0, .pp = 15, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, @@ -9141,7 +9261,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .skyBattleBanned = TRUE, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST : CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = COMBO_STARTER_WATER_SPORT, .contestComboMoves = {COMBO_STARTER_MUD_SPORT, COMBO_STARTER_RAIN_DANCE}, @@ -9167,7 +9287,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = TRUE, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS : CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = COMBO_STARTER_CALM_MIND, .contestComboMoves = {0}, @@ -9185,14 +9305,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = B_UPDATED_MOVE_DATA >= GEN_4 ? 90 : 70, .type = TYPE_GRASS, .accuracy = 100, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 15, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .slicingMove = TRUE, - .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_REPETITION_NOT_BORING : CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -9242,7 +9362,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .ballisticMove = B_UPDATED_MOVE_FLAGS >= GEN_6, - .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -9290,7 +9410,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_CONFUSION, .chance = 20, }), - .contestEffect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION : CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, @@ -9314,8 +9434,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, //C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_EXCITES_AUDIENCE_MORE_IF_LAST : + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_BEAUTY : CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_DoomDesire, @@ -9367,8 +9487,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = TRUE, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, //CONTEST_EFFECT_QUICKLY_GROW_BORED + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_SMART : CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_BRAVE_BIRD}, .battleAnimScript = gBattleAnimMove_Roost, @@ -9392,8 +9512,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .skyBattleBanned = TRUE, - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_SMART : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Gravity, @@ -9416,8 +9536,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, .ignoresSubstitute = TRUE, .magicCoatAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, - .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestEffect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_SMART : CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_MiracleEye, @@ -9442,10 +9562,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_REMOVE_STATUS, }), - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MON, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_LOVELY_KISS, COMBO_STARTER_SPORE, COMBO_STARTER_ENTRAINMENT, COMBO_STARTER_PLAY_NICE, COMBO_STARTER_SING, COMBO_STARTER_YAWN, COMBO_STARTER_HYPNOSIS, COMBO_STARTER_DARK_VOID, COMBO_STARTER_GRASS_WHISTLE, COMBO_STARTER_SLEEP_POWDER}, .battleAnimScript = gBattleAnimMove_WakeUpSlap, }, @@ -9469,8 +9589,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SPD_MINUS_1, .self = TRUE, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_HammerArm, @@ -9492,8 +9612,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .ballisticMove = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = CONTEST_EFFECT_BETTER_WHEN_LATER, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_GyroBall, @@ -9516,7 +9636,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .contestEffect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_BEAUTY : CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_HealingWish, @@ -9536,8 +9656,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_Brine, @@ -9557,8 +9677,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .contestEffect = CONTEST_EFFECT_BETTER_WHEN_LATER, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_SMART : CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_NaturalGift, @@ -9584,8 +9704,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FEINT, }), - .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_SMART : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Feint, @@ -9607,7 +9727,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_BUG_BITE, }), - .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -9621,7 +9741,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "Whips up a breeze, doubling\n" #if B_TAILWIND_TURNS >= GEN_5 "ally Speed for 4 turns."), - #else + #else "ally Speed for 3 turns."), #endif .effect = EFFECT_TAILWIND, @@ -9638,7 +9758,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Tailwind, @@ -9662,8 +9782,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .snatchAffected = B_UPDATED_MOVE_FLAGS < GEN_5, - .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Acupressure, @@ -9683,11 +9803,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_DEPENDS, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .ignoresProtect = B_UPDATED_MOVE_FLAGS < GEN_5, .meFirstBanned = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_METAL_SOUND}, + .contestComboMoves = {COMBO_STARTER_METAL_SOUND, COMBO_STARTER_ENCORE, COMBO_STARTER_TAUNT, COMBO_STARTER_TORMENT}, .battleAnimScript = gBattleAnimMove_MetalBurst, }, @@ -9704,7 +9825,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, + .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, //CONTEST_EFFECT_QUICKLY_GROW_BORED .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -9729,7 +9850,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .self = TRUE, }), .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_MIND_READER}, .battleAnimScript = gBattleAnimMove_CloseCombat, @@ -9750,8 +9871,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_COOL, .contestComboStarterId = COMBO_STARTER_PAYBACK, .contestComboMoves = {COMBO_STARTER_REVENGE}, .battleAnimScript = gBattleAnimMove_Payback, @@ -9772,8 +9893,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_LATER, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_SMART : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_PAYBACK, COMBO_STARTER_REVENGE}, .battleAnimScript = gBattleAnimMove_Assurance, @@ -9795,8 +9916,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, .magicCoatAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, - .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_SMART : CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Embargo, @@ -9817,10 +9938,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .parentalBondBanned = TRUE, - .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_CUTE : CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_CELEBRATE, COMBO_STARTER_COVET, COMBO_STARTER_HAPPY_HOUR, COMBO_STARTER_WISH}, .battleAnimScript = gBattleAnimMove_Fling, }, @@ -9839,8 +9960,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_2 }, - .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_SMART : CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_PsychoShift, @@ -9884,8 +10005,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_2 }, .magicCoatAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, - .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_SMART : CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_HealBlock, @@ -9904,8 +10025,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MON, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_WringOut, @@ -9929,8 +10050,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_SMART : CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_PowerTrick, @@ -9952,8 +10073,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_GastroAcid, @@ -9977,7 +10098,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = COMBO_STARTER_LUCKY_CHANT, .contestComboMoves = {COMBO_STARTER_HEAL_BELL}, @@ -10010,7 +10131,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .assistBanned = TRUE, .mimicBanned = TRUE, .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_SMART : CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_MeFirst, @@ -10041,7 +10162,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .assistBanned = TRUE, .mimicBanned = TRUE, .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_CUTE : CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Copycat, @@ -10064,7 +10185,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, .ignoresSubstitute = TRUE, .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_SMART : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_PowerSwap, @@ -10086,8 +10207,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, .ignoresSubstitute = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_SMART : CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_GuardSwap, @@ -10108,8 +10229,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_WHEN_LATER, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Punishment, @@ -10130,7 +10251,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestEffect = CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -10143,7 +10264,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Plants a seed on the foe\n" "giving it Insomnia."), - .effect = EFFECT_WORRY_SEED, + .effect = EFFECT_OVERWRITE_ABILITY, .power = 0, .type = TYPE_GRASS, .accuracy = 100, @@ -10151,12 +10272,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, + .argument = { .overwriteAbility = ABILITY_INSOMNIA }, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, .magicCoatAffected = TRUE, .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_SMART : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = COMBO_STARTER_WORRY_SEED, - .contestComboMoves = {COMBO_STARTER_LEECH_SEED}, + .contestComboMoves = {COMBO_STARTER_LEECH_SEED, COMBO_STARTER_ROTOTILLER}, .battleAnimScript = gBattleAnimMove_WorrySeed, }, @@ -10202,7 +10324,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .skyBattleBanned = TRUE, .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_SMART, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_TOXIC_SPIKES, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_ToxicSpikes, }, @@ -10224,7 +10346,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .zMove = { .effect = Z_EFFECT_BOOST_CRITS }, .ignoresSubstitute = TRUE, .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_SMART : CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_HeartSwap, @@ -10248,7 +10370,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, + .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -10274,8 +10396,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .gravityBanned = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_SMART : CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_MagnetRise, @@ -10303,7 +10425,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .chance = 10, }), .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_FlareBlitz, @@ -10328,9 +10450,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_PARALYSIS, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_COOL, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_FORCE_PALM, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_ForcePalm, }, @@ -10378,7 +10500,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .mirrorMoveBanned = TRUE, .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, .contestCategory = CONTEST_CATEGORY_TOUGH, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_ROCK_POLISH, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_RockPolish, }, @@ -10402,8 +10524,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_POISON, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_PoisonJab, @@ -10428,7 +10550,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_FLINCH, .chance = 20, }), - .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -10445,7 +10567,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 70, .type = TYPE_DARK, .accuracy = 100, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 15, .target = MOVE_TARGET_SELECTED, .priority = 0, @@ -10453,9 +10575,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .makesContact = TRUE, .slicingMove = TRUE, .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_NightSlash, }, @@ -10475,7 +10597,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_BEAUTY : CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_AquaTail, @@ -10497,9 +10619,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .ballisticMove = TRUE, .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_ROTOTILLER}, .battleAnimScript = gBattleAnimMove_SeedBomb, }, @@ -10522,7 +10644,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_FLINCH, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -10545,8 +10667,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .slicingMove = TRUE, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SWORDS_DANCE}, .battleAnimScript = gBattleAnimMove_XScissor, @@ -10572,8 +10694,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_1, .chance = 10, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_BEAUTIFUL : CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_BugBuzz, @@ -10594,8 +10716,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .pulseMove = TRUE, - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_BEAUTY : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_DragonPulse, @@ -10621,8 +10743,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_FLINCH, .chance = 20, }), - .contestEffect = CONTEST_EFFECT_BETTER_IF_FIRST, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_COOL, .contestComboStarterId = COMBO_STARTER_DRAGON_RUSH, .contestComboMoves = {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_DANCE, COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_TAIL}, .battleAnimScript = gBattleAnimMove_DragonRush, @@ -10665,8 +10787,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .makesContact = TRUE, .punchingMove = TRUE, .healingMove = B_HEAL_BLOCKING >= GEN_6, - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_DrainPunch, @@ -10687,7 +10809,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 1, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_VacuumWave, @@ -10712,7 +10834,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_1, .chance = 10, }), - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, @@ -10738,7 +10860,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_1, .chance = 10, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_GROWTH}, @@ -10762,7 +10884,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .argument = { .recoilPercentage = 33 }, .makesContact = TRUE, .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_CUTE, .contestComboStarterId = COMBO_STARTER_BRAVE_BIRD, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_BraveBird, @@ -10787,8 +10909,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_1, .chance = 10, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_BEAUTY : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_EarthPower, @@ -10812,8 +10934,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .copycatBanned = TRUE, .assistBanned = TRUE, - .contestEffect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_SMART : CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Switcheroo, @@ -10837,7 +10959,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .self = TRUE, }), .contestEffect = CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_GigaImpact, @@ -10862,8 +10984,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, - .contestCategory = CONTEST_CATEGORY_CUTE, - .contestComboStarterId = 0, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_SMART : CONTEST_CATEGORY_CUTE, + .contestComboStarterId = COMBO_STARTER_NASTY_PLOT, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_NastyPlot, }, @@ -10885,7 +11007,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .makesContact = TRUE, .punchingMove = TRUE, .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_BulletPunch, @@ -10904,8 +11026,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = -4, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_LATER, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_BEAUTY : CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Avalanche, @@ -10942,16 +11064,16 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 70, .type = TYPE_GHOST, .accuracy = 100, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 15, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_ShadowClaw, }, @@ -10980,7 +11102,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .chance = 10, }), .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_SMART, .contestComboStarterId = COMBO_STARTER_THUNDER_FANG, .contestComboMoves = {COMBO_STARTER_CHARGE, COMBO_STARTER_FIRE_FANG, COMBO_STARTER_ICE_FANG}, .battleAnimScript = gBattleAnimMove_ThunderFang, @@ -11046,7 +11168,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .chance = 10, }), .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = COMBO_STARTER_FIRE_FANG, .contestComboMoves = {COMBO_STARTER_ICE_FANG, COMBO_STARTER_THUNDER_FANG}, .battleAnimScript = gBattleAnimMove_FireFang, @@ -11093,8 +11215,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_ACC_MINUS_1, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MON, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_CUTE : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_MudBomb, @@ -11110,13 +11232,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 70, .type = TYPE_PSYCHIC, .accuracy = 100, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .slicingMove = TRUE, - .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -11142,8 +11264,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_FLINCH, .chance = 20, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_SMART : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_ZenHeadbutt, @@ -11167,8 +11289,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_ACC_MINUS_1, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MON, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_BEAUTY : CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_MirrorShot, @@ -11192,8 +11314,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_1, .chance = 10, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_BEAUTY : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_FlashCannon, @@ -11218,7 +11340,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_CONFUSION, .chance = 20, }), - .contestEffect = CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, + .contestEffect = CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -11242,8 +11364,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .zMove = { .effect = Z_EFFECT_ACC_UP_1 }, //.ignoresSubstitute = TRUE, In Gen5+, the evasion drop will no longer bypass Substitute. However, this is tricky to code .magicCoatAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, - .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Defog, @@ -11265,8 +11387,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ACC_UP_1 }, .ignoresProtect = TRUE, - .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_LATER, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestEffect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_SMART : CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_TrickRoom, @@ -11291,7 +11413,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .self = TRUE, }), .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_BEAUTY : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_DracoMeteor, @@ -11315,8 +11437,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_PARALYSIS, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MONS, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_BEAUTY : CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CHARGE}, .battleAnimScript = gBattleAnimMove_Discharge, @@ -11338,7 +11460,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_BURN, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, @@ -11364,7 +11486,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .self = TRUE, }), .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_BEAUTY : CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_LeafStorm, @@ -11385,8 +11507,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_GROWTH}, .battleAnimScript = gBattleAnimMove_PowerWhip, @@ -11426,7 +11548,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 70, .type = TYPE_POISON, .accuracy = 100, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, @@ -11437,7 +11559,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_POISON, .chance = 10, }), - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -11462,8 +11584,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_POISON, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_GunkShot, @@ -11488,7 +11610,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_FLINCH, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -11527,7 +11649,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 100, .type = TYPE_ROCK, .accuracy = 80, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 5, .target = MOVE_TARGET_SELECTED, .priority = 0, @@ -11535,7 +11657,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_StoneEdge, }, @@ -11555,8 +11677,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_2 }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, //CONTEST_EFFECT_QUICKLY_GROW_BORED + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_CUTE : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CHARM}, .battleAnimScript = gBattleAnimMove_Captivate, @@ -11584,7 +11706,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_STEALTH_ROCK}, .battleAnimScript = gBattleAnimMove_StealthRock, }, @@ -11604,8 +11726,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .makesContact = TRUE, .skyBattleBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_BETTER_WHEN_LATER, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_CUTE : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_GrassKnot, @@ -11638,14 +11760,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_CONFUSION, #if B_UPDATED_MOVE_DATA >= GEN_6 .chance = 100, - #elif B_UPDATED_MOVE_DATA >= GEN_5 + #elif B_UPDATED_MOVE_DATA == GEN_5 .chance = 10, #else .chance = 31, #endif }), - .contestEffect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_CUTE : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Chatter, @@ -11666,8 +11788,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .holdEffect = HOLD_EFFECT_PLATE }, - .contestEffect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_BEAUTY : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Judgment, @@ -11689,8 +11811,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_BUG_BITE, }), - .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_CUTE : CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_BugBite, @@ -11715,7 +11837,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .self = TRUE, .chance = 70, }), - .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestEffect = CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CHARGE}, @@ -11761,7 +11883,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_AquaJet, @@ -11777,12 +11899,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 90, .type = TYPE_BUG, .accuracy = 100, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 15, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = COMBO_STARTER_ATTACK_ORDER, .contestComboMoves = {COMBO_STARTER_DEFEND_ORDER, COMBO_STARTER_HEAL_ORDER}, @@ -11807,7 +11929,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = TRUE, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, + .contestEffect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = COMBO_STARTER_DEFEND_ORDER, .contestComboMoves = {COMBO_STARTER_ATTACK_ORDER, COMBO_STARTER_HEAL_ORDER}, @@ -11879,8 +12001,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .strikeCount = 2, - .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_DoubleHit, @@ -11905,7 +12027,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .self = TRUE, }), .contestEffect = CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_BEAUTY : CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_RoarOfTime, @@ -11921,13 +12043,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 100, .type = TYPE_DRAGON, .accuracy = 95, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 5, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_BEAUTY : CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SpacialRend, @@ -11937,7 +12059,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Lunar Dance"), .description = sHealingWishDescription, - .effect = EFFECT_HEALING_WISH, + .effect = EFFECT_LUNAR_DANCE, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -11970,7 +12092,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -11993,6 +12115,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WRAP, + .multistring.wrapped = B_MSG_WRAPPED_MAGMA_STORM, }), .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -12019,9 +12142,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .zMove = { .effect = Z_EFFECT_RESET_STATS }, .magicCoatAffected = TRUE, .sketchBanned = (B_SKETCH_BANS >= GEN_9), - .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_SMART, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_DARK_VOID, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_DarkVoid, }, @@ -12044,8 +12167,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_2, .chance = 40, }), - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_BEAUTY : CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SeedFlare, @@ -12072,7 +12195,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .chance = 10, }), .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_BEAUTY : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_OminousWind, @@ -12095,13 +12218,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .minimizeDoubleDamage = B_UPDATED_MOVE_FLAGS == GEN_6, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .assistBanned = TRUE, - .argument.twoTurnAttack = { .stringId = STRINGID_VANISHEDINSTANTLY, .status = COMPRESS_BITS(STATUS3_PHANTOM_FORCE) }, + .assistBanned = B_UPDATED_MOVE_FLAGS >= GEN_6, + .argument.twoTurnAttack = { .stringId = STRINGID_VANISHEDINSTANTLY, .status = STATE_PHANTOM_FORCE }, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FEINT, }), - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_ShadowForce, @@ -12126,8 +12249,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, - .contestCategory = CONTEST_CATEGORY_COOL, - .contestComboStarterId = 0, + .contestCategory = CONTEST_CATEGORY_CUTE, + .contestComboStarterId = COMBO_STARTER_HONE_CLAWS, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_HoneClaws, }, @@ -12175,7 +12298,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, + .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -12221,8 +12344,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, .ignoresProtect = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, + .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_WonderRoom, @@ -12240,8 +12363,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Psyshock, @@ -12263,9 +12386,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .status = STATUS1_PSN_ANY }, .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_TOXIC}, + .contestComboMoves = {COMBO_STARTER_TOXIC, COMBO_STARTER_POISON_GAS, COMBO_STARTER_POISON_POWDER, COMBO_STARTER_TOXIC_SPIKES}, .battleAnimScript = gBattleAnimMove_Venoshock, }, @@ -12287,8 +12410,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = TRUE, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Autotomize, @@ -12316,7 +12439,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .copycatBanned = TRUE, .assistBanned = TRUE, .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_RagePowder, @@ -12339,7 +12462,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, .magicCoatAffected = TRUE, .gravityBanned = TRUE, - .contestEffect = CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, + .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -12362,7 +12485,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, .ignoresProtect = TRUE, - .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -12385,10 +12508,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .damagesAirborne = TRUE, .skyBattleBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_ENTRAINMENT, COMBO_STARTER_PLAY_NICE}, .battleAnimScript = gBattleAnimMove_SmackDown, }, @@ -12406,10 +12529,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .alwaysCriticalHit = TRUE, - .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestEffect = CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, + .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_ENTRAINMENT, COMBO_STARTER_PLAY_NICE}, .battleAnimScript = gBattleAnimMove_StormThrow, }, @@ -12431,7 +12554,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_FLAME_BURST, .self = TRUE, }), - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MONS, + .contestEffect = CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -12456,7 +12579,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_POISON, .chance = 10, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -12483,7 +12606,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_QuiverDance, @@ -12504,7 +12627,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .makesContact = TRUE, .minimizeDoubleDamage = B_UPDATED_MOVE_FLAGS >= GEN_7, .skyBattleBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -12525,7 +12648,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -12547,10 +12670,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ballisticMove = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, //CONTEST_EFFECT_EXCITES_AUDIENCE_MORE_IF_FIRST .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_AGILITY, COMBO_STARTER_CHARGE, COMBO_STARTER_ROCK_POLISH}, .battleAnimScript = gBattleAnimMove_ElectroBall, }, @@ -12568,12 +12691,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, + .argument = { .type = TYPE_WATER }, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_Soak, }, @@ -12597,8 +12721,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .self = TRUE, .chance = 100, }), - .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, + .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_FlameCharge, @@ -12623,7 +12747,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Coil, @@ -12648,8 +12772,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SPD_MINUS_1, .chance = 100, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MON, + .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_LowSweep, @@ -12674,8 +12798,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_2, .chance = 100, }), - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_AcidSpray, @@ -12696,8 +12820,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE, + .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_FoulPlay, @@ -12709,7 +12833,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "A beam that changes the\n" "foe's Ability to Simple."), - .effect = EFFECT_SIMPLE_BEAM, + .effect = EFFECT_OVERWRITE_ABILITY, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, @@ -12717,9 +12841,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, + .argument = { .overwriteAbility = ABILITY_SIMPLE }, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, + .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -12742,9 +12867,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_CUTE, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_ENTRAINMENT, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Entrainment, }, @@ -12794,8 +12919,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_ROUND, }), - .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Round, @@ -12818,7 +12943,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .soundMove = TRUE, .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_EchoedVoice, @@ -12838,7 +12963,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .ignoresTargetDefenseEvasionStages = TRUE, - .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestEffect = CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -12862,7 +12987,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_CLEAR_SMOG, }), - .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestEffect = CONTEST_EFFECT_BETTER_IF_FIRST, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -12883,10 +13008,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .contestEffect = CONTEST_EFFECT_BETTER_WHEN_LATER, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, + .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_AMNESIA, COMBO_STARTER_HONE_CLAWS, COMBO_STARTER_CALM_MIND, COMBO_STARTER_NASTY_PLOT}, .battleAnimScript = gBattleAnimMove_StoredPower, }, @@ -12910,8 +13035,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .metronomeBanned = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestEffect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_QuickGuard, @@ -12960,7 +13085,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_BURN, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = COMBO_STARTER_SCALD, .contestComboMoves = {0}, @@ -12985,7 +13110,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = TRUE, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -13011,8 +13136,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .mirrorMoveBanned = TRUE, .healingMove = TRUE, .pulseMove = TRUE, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, + .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_HealPulse, @@ -13034,10 +13159,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .zMove = { .powerOverride = 160 }, .argument = { .status = STATUS1_ANY }, - .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_TOXIC}, + .contestComboMoves = {COMBO_STARTER_TOXIC, COMBO_STARTER_FORCE_PALM, COMBO_STARTER_THUNDER_WAVE, COMBO_STARTER_INFERNO, COMBO_STARTER_WILL_O_WISP, COMBO_STARTER_LOVELY_KISS, COMBO_STARTER_SPORE, COMBO_STARTER_SING, COMBO_STARTER_YAWN, COMBO_STARTER_HYPNOSIS, COMBO_STARTER_DARK_VOID, COMBO_STARTER_GRASS_WHISTLE, COMBO_STARTER_SLEEP_POWDER, COMBO_STARTER_POISON_GAS, COMBO_STARTER_POISON_POWDER, COMBO_STARTER_TOXIC_SPIKES, COMBO_STARTER_GLARE}, .battleAnimScript = gBattleAnimMove_Hex, }, @@ -13059,12 +13184,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .gravityBanned = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .assistBanned = TRUE, - .argument.twoTurnAttack = { .stringId = STRINGID_PKMNTOOKTARGETHIGH, .status = COMPRESS_BITS(STATUS3_ON_AIR) }, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, - .contestCategory = CONTEST_CATEGORY_SMART, + .assistBanned = B_UPDATED_MOVE_FLAGS >= GEN_6, + .argument.twoTurnAttack = { .stringId = STRINGID_PKMNTOOKTARGETHIGH, .status = STATE_ON_AIR }, + .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_ENTRAINMENT, COMBO_STARTER_PLAY_NICE}, .battleAnimScript = gBattleAnimMove_SkyDrop, }, @@ -13088,7 +13213,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .mirrorMoveBanned = TRUE, .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_SMART, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_SHIFT_GEAR, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_ShiftGear, }, @@ -13108,10 +13233,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .makesContact = TRUE, .copycatBanned = TRUE, .assistBanned = TRUE, - .contestEffect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_LATER, + .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_ENTRAINMENT, COMBO_STARTER_PLAY_NICE}, .battleAnimScript = gBattleAnimMove_CircleThrow, }, @@ -13132,8 +13257,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_INCINERATE, }), - .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, + .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Incinerate, @@ -13155,8 +13280,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, .metronomeBanned = TRUE, - .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_LATER, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, + .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Quash, @@ -13177,7 +13302,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestEffect = CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -13201,7 +13326,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, .ignoresSubstitute = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -13223,8 +13348,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_LATER, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Retaliate, @@ -13273,10 +13398,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .copycatBanned = TRUE, .assistBanned = TRUE, - .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_CELEBRATE, COMBO_STARTER_COVET, COMBO_STARTER_HAPPY_HOUR, COMBO_STARTER_WISH}, .battleAnimScript = gBattleAnimMove_Bestow, }, @@ -13298,9 +13423,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_BURN, .chance = 100, }), - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_BEAUTY, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_INFERNO, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Inferno, }, @@ -13320,8 +13445,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .skyBattleBanned = TRUE, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestEffect = CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, + .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_WaterPledge, @@ -13342,7 +13467,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .skyBattleBanned = TRUE, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -13364,8 +13489,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .skyBattleBanned = TRUE, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, + .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_GrassPledge, @@ -13383,9 +13508,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, + .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, //CONTEST_EFFECT_QUICKLY_GROW_BORED .contestCategory = CONTEST_CATEGORY_COOL, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_CHARGE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_VoltSwitch, }, @@ -13408,8 +13533,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SP_ATK_MINUS_1, .chance = 100, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_StruggleBug, @@ -13434,7 +13559,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SPD_MINUS_1, .chance = 100, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -13454,7 +13579,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .alwaysCriticalHit = TRUE, - .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, //CONTEST_EFFECT_QUICKLY_GROW_BORED .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -13476,10 +13601,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .makesContact = TRUE, .copycatBanned = TRUE, .assistBanned = TRUE, - .contestEffect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_LATER, + .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = COMBO_STARTER_DRAGON_TAIL, - .contestComboMoves = {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_DANCE, COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_RUSH}, + .contestComboMoves = {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_DANCE, COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_RUSH, COMBO_STARTER_STEALTH_ROCK, COMBO_STARTER_SPIKES, COMBO_STARTER_TOXIC_SPIKES}, .battleAnimScript = gBattleAnimMove_DragonTail, }, @@ -13501,8 +13626,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = TRUE, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, //CONTEST_EFFECT_EXCITES_AUDIENCE_MORE_IF_FIRST + .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_WorkUp, @@ -13526,10 +13651,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SPD_MINUS_1, .chance = 100, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_STRING_SHOT}, .battleAnimScript = gBattleAnimMove_Electroweb, }, @@ -13550,7 +13675,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .argument = { .recoilPercentage = 25 }, .makesContact = TRUE, .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_WildCharge, @@ -13566,7 +13691,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 80, .type = TYPE_GROUND, .accuracy = 95, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, @@ -13575,7 +13700,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_DrillRun, }, @@ -13595,7 +13720,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .strikeCount = 2, - .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -13621,7 +13746,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_FLINCH, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -13643,8 +13768,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .argument = { .absorbPercentage = 50 }, .makesContact = TRUE, .healingMove = B_HEAL_BLOCKING >= GEN_6, - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE, + .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_HornLeech, @@ -13665,8 +13790,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .makesContact = TRUE, .ignoresTargetDefenseEvasionStages = TRUE, .slicingMove = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestEffect = CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, + .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SacredSword, @@ -13692,8 +13817,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_DEF_MINUS_1, .chance = 50, }), - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_RazorShell, @@ -13713,8 +13838,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .minimizeDoubleDamage = B_UPDATED_MOVE_FLAGS >= GEN_6, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_HeatCrash, @@ -13738,8 +13863,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_ACC_MINUS_1, .chance = 50, }), - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_LeafTornado, @@ -13765,7 +13890,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_FLINCH, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -13791,7 +13916,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_CottonGuard, @@ -13815,7 +13940,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_ACC_MINUS_1, .chance = 40, }), - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -13834,8 +13959,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Psystrike, @@ -13856,7 +13981,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestEffect = CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -13885,10 +14010,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_CONFUSION, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, + .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_Hurricane, }, @@ -13932,10 +14057,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .zMove = { .powerOverride = 180 }, .makesContact = TRUE, .strikeCount = 2, - .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_SHIFT_GEAR}, .battleAnimScript = gBattleAnimMove_GearGrind, }, @@ -13956,8 +14081,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_BURN, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SearingShot, @@ -13979,7 +14104,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .holdEffect = HOLD_EFFECT_DRIVE }, .metronomeBanned = TRUE, - .contestEffect = CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, + .contestEffect = CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -13992,7 +14117,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Attacks with an ancient\n" "song. May induce sleep."), - .effect = EFFECT_RELIC_SONG, + .effect = EFFECT_HIT, .power = 75, .type = TYPE_NORMAL, .accuracy = 100, @@ -14008,8 +14133,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SLEEP, .chance = 10, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestCategory = CONTEST_CATEGORY_BEAUTIFUL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_RelicSong, @@ -14031,8 +14156,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .slicingMove = TRUE, .metronomeBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestCategory = CONTEST_CATEGORY_BEAUTIFUL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SecretSword, @@ -14056,10 +14181,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SPD_MINUS_1, .chance = 100, }), - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MONS, + .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_HAIL}, .battleAnimScript = gBattleAnimMove_Glaciate, }, @@ -14082,8 +14207,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_PARALYSIS, .chance = 20, }), - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_BoltStrike, @@ -14107,7 +14232,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_BURN, .chance = 20, }), - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -14134,7 +14259,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .self = TRUE, .chance = 50, }), - .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestEffect = CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -14163,7 +14288,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_PARALYSIS, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MONS, + .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -14220,8 +14345,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SP_ATK_MINUS_1, .chance = 100, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, //CONTEST_EFFECT_QUICKLY_GROW_BORED + .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Snarl, @@ -14245,10 +14370,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_FLINCH, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MON, + .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_HAIL}, .battleAnimScript = gBattleAnimMove_IcicleCrash, }, @@ -14295,7 +14420,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .thawsUser = TRUE, - .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestEffect = CONTEST_EFFECT_BETTER_WHEN_LATER, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -14316,7 +14441,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestEffect = CONTEST_EFFECT_BETTER_WHEN_LATER, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -14343,8 +14468,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .minimizeDoubleDamage = TRUE, .gravityBanned = TRUE, .skyBattleBanned = TRUE, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, + .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_FlyingPress, @@ -14373,7 +14498,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .copycatBanned = TRUE, .assistBanned = TRUE, .skyBattleBanned = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, + .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -14402,8 +14527,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .sleepTalkBanned = TRUE, .instructBanned = TRUE, .assistBanned = TRUE, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, + .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Belch, @@ -14429,7 +14554,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .skyBattleBanned = TRUE, .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_TOUGH, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_ROTOTILLER, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Rototiller, }, @@ -14453,10 +14578,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .mirrorMoveBanned = TRUE, .magicCoatAffected = TRUE, .skyBattleBanned = TRUE, - .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_STRING_SHOT}, .battleAnimScript = gBattleAnimMove_StickyWeb, }, @@ -14475,8 +14600,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, + .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_FellStinger, @@ -14496,16 +14621,16 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .ignoresProtect = TRUE, .makesContact = TRUE, - .minimizeDoubleDamage = B_UPDATED_MOVE_FLAGS == GEN_6, + .minimizeDoubleDamage = B_UPDATED_MOVE_FLAGS < GEN_7, .sleepTalkBanned = TRUE, .instructBanned = TRUE, .assistBanned = TRUE, - .argument.twoTurnAttack = { .stringId = STRINGID_VANISHEDINSTANTLY, .status = COMPRESS_BITS(STATUS3_PHANTOM_FORCE) }, + .argument.twoTurnAttack = { .stringId = STRINGID_VANISHEDINSTANTLY, .status = STATE_PHANTOM_FORCE }, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FEINT, }), - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_PhantomForce, @@ -14528,8 +14653,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .argument = { .type = TYPE_GHOST }, .zMove = { .effect = Z_EFFECT_ALL_STATS_UP_1 }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_TrickOrTreat, @@ -14553,8 +14678,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .magicCoatAffected = TRUE, .soundMove = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_NobleRoar, @@ -14577,7 +14702,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -14600,10 +14725,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .absorbPercentage = 50 }, .healingMove = B_HEAL_BLOCKING >= GEN_6, - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, - .contestCategory = CONTEST_CATEGORY_BEAUTY, - .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, + .contestCategory = CONTEST_CATEGORY_SMART, + .contestComboStarterId = COMBO_STARTER_PARABOLIC_CHARGE, + .contestComboMoves = {COMBO_STARTER_CHARGE}, .battleAnimScript = gBattleAnimMove_ParabolicCharge, }, @@ -14624,7 +14749,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .argument = { .type = TYPE_GRASS }, .zMove = { .effect = Z_EFFECT_ALL_STATS_UP_1 }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -14646,7 +14771,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .windMove = TRUE, - .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -14676,7 +14801,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE, .chance = 10, }), - .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -14724,8 +14849,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .magicCoatAffected = TRUE, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .soundMove = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, //CONTEST_EFFECT_EXCITES_AUDIENCE_MORE_IF_LAST + .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_PartingShot, @@ -14747,8 +14872,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ATK_UP_1 }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestEffect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, + .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_TopsyTurvy, @@ -14769,7 +14894,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .argument = { .absorbPercentage = 75 }, .makesContact = TRUE, .healingMove = B_HEAL_BLOCKING >= GEN_6, - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -14795,7 +14920,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .metronomeBanned = TRUE, - .contestEffect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, + .contestEffect = CONTEST_EFFECT_BETTER_IF_FIRST, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -14820,7 +14945,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_FlowerShield, @@ -14844,8 +14969,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .skyBattleBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, //CONTEST_EFFECT_EXCITES_AUDIENCE_MORE_IF_FIRST + .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = COMBO_STARTER_GRASSY_TERRAIN, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_GrassyTerrain, @@ -14869,8 +14994,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .skyBattleBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, //CONTEST_EFFECT_EXCITES_AUDIENCE_MORE_IF_FIRST + .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = COMBO_STARTER_MISTY_TERRAIN, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_MistyTerrain, @@ -14891,10 +15016,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, - .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_PARABOLIC_CHARGE}, .battleAnimScript = gBattleAnimMove_Electrify, }, @@ -14917,8 +15042,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_ATK_MINUS_1, .chance = 10, }), - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_PlayRough, @@ -14940,7 +15065,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .windMove = TRUE, .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_FairyWind, @@ -14964,8 +15089,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SP_ATK_MINUS_1, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Moonblast, @@ -14987,8 +15112,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .soundMove = TRUE, - .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, + .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Boomburst, @@ -15011,8 +15136,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, .ignoresProtect = TRUE, .ignoresSubstitute = TRUE, - .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_FairyLock, @@ -15041,7 +15166,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .instructBanned = TRUE, .assistBanned = TRUE, .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_KingsShield, @@ -15065,9 +15190,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .ignoresSubstitute = TRUE, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, .contestCategory = CONTEST_CATEGORY_CUTE, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_PLAY_NICE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_PlayNice, }, @@ -15091,8 +15216,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .magicCoatAffected = TRUE, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .soundMove = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Confide, @@ -15118,7 +15243,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .self = TRUE, .chance = 50, }), - .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, //CONTEST_EFFECT_EXCITES_AUDIENCE_MORE_IF_LAST .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -15145,8 +15270,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_BURN, .chance = 30, }), - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, //CONTEST_EFFECT_EXCITES_AUDIENCE_MORE_IF_LAST + .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SCALD}, .battleAnimScript = gBattleAnimMove_SteamEruption, @@ -15170,7 +15295,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FEINT, }), - .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, //CONTEST_EFFECT_EXCITES_AUDIENCE_MORE_IF_FIRST .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = COMBO_STARTER_HYPERSPACE_HOLE, .contestComboMoves = {COMBO_STARTER_HYPERSPACE_FURY}, @@ -15191,8 +15316,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 1, .category = B_UPDATED_MOVE_DATA >= GEN_7 ? DAMAGE_CATEGORY_SPECIAL : DAMAGE_CATEGORY_PHYSICAL, - .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, + .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_WaterShuriken, @@ -15216,7 +15341,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SP_ATK_MINUS_1, .chance = 100, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -15245,7 +15370,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .copycatBanned = TRUE, .assistBanned = TRUE, .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SpikyShield, @@ -15269,8 +15394,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .ignoresSubstitute = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_BEAUTIFUL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_AromaticMist, @@ -15292,8 +15417,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, - .contestCategory = CONTEST_CATEGORY_COOL, + .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_EerieImpulse, @@ -15318,7 +15443,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_TOXIC}, + .contestComboMoves = {COMBO_STARTER_TOXIC, COMBO_STARTER_POISON_GAS, COMBO_STARTER_POISON_POWDER, COMBO_STARTER_TOXIC_SPIKES}, .battleAnimScript = gBattleAnimMove_VenomDrench, }, @@ -15339,7 +15464,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .zMove = { .effect = Z_EFFECT_SPDEF_UP_2 }, .powderMove = TRUE, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, //CONTEST_EFFECT_QUICKLY_GROW_BORED .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -15366,7 +15491,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .skyBattleBanned = TRUE, .argument.twoTurnAttack = { .stringId = STRINGID_PKNMABSORBINGPOWER }, .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestCategory = CONTEST_CATEGORY_BEAUTIFUL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Geomancy, @@ -15391,8 +15516,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .ignoresSubstitute = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_MagneticFlux, @@ -15415,9 +15540,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .zMove = { .effect = Z_EFFECT_ALL_STATS_UP_1 }, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, - .contestCategory = CONTEST_CATEGORY_COOL, - .contestComboStarterId = 0, + .contestEffect = CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, + .contestCategory = CONTEST_CATEGORY_CUTE, + .contestComboStarterId = COMBO_STARTER_HAPPY_HOUR, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_HappyHour, }, @@ -15440,8 +15565,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .skyBattleBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, //CONTEST_EFFECT_EXCITES_AUDIENCE_MORE_IF_FIRST + .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = COMBO_STARTER_ELECTRIC_TERRAIN, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_ElectricTerrain, @@ -15461,8 +15586,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_DazzlingGleam, @@ -15491,9 +15616,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .sleepTalkBanned = TRUE, .instructBanned = TRUE, .assistBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestEffect = CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, .contestCategory = CONTEST_CATEGORY_CUTE, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_CELEBRATE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Celebrate, }, @@ -15570,10 +15695,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_PARALYSIS, .chance = 100, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, + .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_CHARGE}, .battleAnimScript = gBattleAnimMove_Nuzzle, }, @@ -15590,8 +15715,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, //CONTEST_EFFECT_QUICKLY_GROW_BORED + .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_HoldBack, @@ -15614,9 +15739,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .makesContact = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WRAP, + .multistring.wrapped = B_MSG_WRAPPED_INFESTATION, }), .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, - .contestCategory = CONTEST_CATEGORY_SMART, + .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Infestation, @@ -15643,7 +15769,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .self = TRUE, .chance = 100, }), - .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestEffect = CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -15664,7 +15790,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .absorbPercentage = 75 }, .healingMove = B_HEAL_BLOCKING >= GEN_6, - .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -15689,8 +15815,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoreTypeIfFlyingAndUngrounded = TRUE, .metronomeBanned = TRUE, .skyBattleBanned = TRUE, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestCategory = CONTEST_CATEGORY_BEAUTIFUL, .contestComboStarterId = COMBO_STARTER_THOUSAND_ARROWS, .contestComboMoves = {COMBO_STARTER_THOUSAND_WAVES}, .battleAnimScript = gBattleAnimMove_ThousandArrows, @@ -15715,7 +15841,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PREVENT_ESCAPE, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, + .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = COMBO_STARTER_THOUSAND_WAVES, .contestComboMoves = {COMBO_STARTER_THOUSAND_ARROWS}, @@ -15737,8 +15863,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .skyBattleBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_LandsWrath, @@ -15760,6 +15886,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .recoilPercentage = 50 }, .metronomeBanned = TRUE, + .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestComboStarterId = 0, + .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_LightOfRuin, }, @@ -15779,7 +15909,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .pulseMove = TRUE, .metronomeBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestEffect = CONTEST_EFFECT_BETTER_IF_FIRST, //CONTEST_EFFECT_EXCITES_AUDIENCE_MORE_IF_FIRST .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -15801,8 +15931,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .metronomeBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, - .contestCategory = CONTEST_CATEGORY_CUTE, + .skyBattleBanned = TRUE, + .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, //CONTEST_EFFECT_EXCITES_AUDIENCE_MORE_IF_LAST + .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_PrecipiceBlades, @@ -15854,7 +15985,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_DEF_MINUS_1, .self = TRUE, }), - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, //CONTEST_EFFECT_EXCITES_AUDIENCE_MORE_IF_FIRST .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = COMBO_STARTER_HYPERSPACE_FURY, .contestComboMoves = {COMBO_STARTER_HYPERSPACE_HOLE}, @@ -16005,7 +16136,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .soundMove = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_REMOVE_STATUS, - .sheerForceBoost = SHEER_FORCE_BOOST, + .sheerForceOverride = TRUE, }), .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_BEAUTY, @@ -16034,7 +16165,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SPD_MINUS_1, .self = TRUE, }), - .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HAIL}, @@ -16060,7 +16191,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .mirrorMoveBanned = TRUE, .healingMove = TRUE, .magicCoatAffected = TRUE, - .contestEffect = CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING, + .contestEffect = CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -16352,6 +16483,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, + .skyBattleBanned = TRUE, .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = COMBO_STARTER_PSYCHIC_TERRAIN, @@ -16426,7 +16558,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_WHEN_LATER, + .contestEffect = CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -17089,7 +17221,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Halves the foe's HP with\n" "the power of nature."), - .effect = EFFECT_SUPER_FANG, + .effect = EFFECT_FIXED_PERCENT_DAMAGE, .power = 1, .type = TYPE_FAIRY, .accuracy = 90, @@ -17097,6 +17229,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, + .argument = { .damagePercentage = 50 }, .metronomeBanned = B_UPDATED_MOVE_FLAGS >= GEN_8, .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, .contestCategory = CONTEST_CATEGORY_CUTE, @@ -17134,7 +17267,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "It explodes the user's head\n" "to damage everything around."), - .effect = EFFECT_MIND_BLOWN, + .effect = EFFECT_MAX_HP_50_RECOIL, .power = 150, .type = TYPE_FIRE, .accuracy = 100, @@ -17143,6 +17276,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, + .dampBanned = TRUE, .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, @@ -17173,8 +17307,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboMoves = {0}, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_ION_DELUGE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), .battleAnimScript = gBattleAnimMove_PlasmaFists, }, @@ -17223,8 +17355,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = #if B_UPDATED_MOVE_DATA >= GEN_8 .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_EVS_PLUS_1, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, + .self = TRUE, }), #endif .battleAnimScript = gBattleAnimMove_ZippyZap, @@ -17274,7 +17405,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FLINCH, .chance = 30, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, + .sheerForceOverride = TRUE, }), .battleAnimScript = gBattleAnimMove_FloatyFall, }, @@ -17341,8 +17472,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PARALYSIS, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), .battleAnimScript = gBattleAnimMove_BuzzyBuzz, }, @@ -17367,8 +17496,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_BURN, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), .battleAnimScript = gBattleAnimMove_SizzlySlide, }, @@ -17391,8 +17518,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_LIGHT_SCREEN, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), .battleAnimScript = gBattleAnimMove_GlitzyGlow, }, @@ -17415,8 +17540,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_REFLECT, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), .battleAnimScript = gBattleAnimMove_BaddyBad, }, @@ -17440,8 +17563,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_LEECH_SEED, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), .battleAnimScript = gBattleAnimMove_SappySeed, }, @@ -17464,8 +17585,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_HAZE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), .battleAnimScript = gBattleAnimMove_FreezyFrost, }, @@ -17488,8 +17607,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_AROMATHERAPY, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), .battleAnimScript = gBattleAnimMove_SparklySwirl, }, @@ -17584,7 +17701,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 80, .type = TYPE_WATER, .accuracy = 100, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 15, .target = MOVE_TARGET_SELECTED, .priority = 0, @@ -17709,7 +17826,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .argument = { .type = TYPE_PSYCHIC }, .magicCoatAffected = TRUE, .powderMove = TRUE, - .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -17971,6 +18088,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .skyBattleBanned = B_EXTRAPOLATED_MOVE_FLAGS, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WRAP, + .multistring.wrapped = B_MSG_WRAPPED_SNAP_TRAP, }), .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -18272,12 +18390,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Scatters water to restore\n" "the HP of itself and allies."), - .effect = EFFECT_JUNGLE_HEALING, + .effect = EFFECT_LIFE_DEW, .power = 0, .type = TYPE_WATER, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = MOVE_TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .snatchAffected = TRUE, @@ -18444,7 +18562,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Destroys terrain. Fails if\n" "ground isn't terrain."), - .effect = EFFECT_HIT_SET_REMOVE_TERRAIN, + .effect = EFFECT_STEEL_ROLLER, .power = 130, .type = TYPE_STEEL, .accuracy = 100, @@ -18453,7 +18571,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .argument = { .moveProperty = ARG_TRY_REMOVE_TERRAIN_FAIL }, // Remove a field terrain if there is one and hit, otherwise fail. .skyBattleBanned = TRUE, .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -18543,7 +18660,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Hit everything and faint.\n" "Powers up on Misty Terrain."), - .effect = EFFECT_EXPLOSION, + .effect = EFFECT_MISTY_EXPLOSION, .power = 100, .type = TYPE_FAIRY, .accuracy = 100, @@ -18551,6 +18668,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, + .dampBanned = TRUE, .contestEffect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, @@ -18617,7 +18735,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .pulseMove = TRUE, - .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_REPETITION_NOT_BORING : CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_ELECTRIC_TERRAIN, COMBO_STARTER_MISTY_TERRAIN, COMBO_STARTER_GRASSY_TERRAIN, COMBO_STARTER_PSYCHIC_TERRAIN}, @@ -18680,8 +18798,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Lash Out"), .description = COMPOUND_STRING( - "If stats lowered during this\n" - "turn, power is doubled."), + "If user's stats were lowered\n" + "this turn, power is doubled."), .effect = EFFECT_LASH_OUT, .power = 75, .type = TYPE_DARK, @@ -18953,6 +19071,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WRAP, + .multistring.wrapped = B_MSG_WRAPPED_THUNDER_CAGE, }), .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_COOL, @@ -18976,7 +19095,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, - .contestEffect = CONTEST_EFFECT_BETTER_WHEN_LATER, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_USER_MORE_EASILY_STARTLED : CONTEST_EFFECT_BETTER_WHEN_LATER, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -19209,7 +19328,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "High critical hit ratio. Sets\n" "Splinters that hurt the foe."), - .effect = EFFECT_HIT, + .effect = EFFECT_STONE_AXE, .power = 65, .type = TYPE_ROCK, .accuracy = 90, @@ -19220,8 +19339,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .makesContact = TRUE, .slicingMove = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ - .moveEffect = MOVE_EFFECT_STEALTH_ROCK, - .chance = 100, + .sheerForceOverride = TRUE, }), .battleAnimScript = gBattleAnimMove_StoneAxe, }, @@ -19290,6 +19408,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_THRASH, .self = TRUE, }), + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_USER_MORE_EASILY_STARTLED : CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, + .contestComboStarterId = 0, + .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_RagingFury, }, @@ -19310,6 +19431,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .argument = { .recoilPercentage = 33 }, .makesContact = TRUE, .skyBattleBanned = B_EXTRAPOLATED_MOVE_FLAGS, + .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestComboStarterId = 0, + .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_WaveCrash, }, @@ -19340,7 +19464,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 100, .type = TYPE_ICE, .accuracy = 85, - .pp = 5, + .pp = B_UPDATED_MOVE_DATA >= GEN_9 ? 10 : 5, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, @@ -19369,6 +19493,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = TRUE, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, + .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestComboStarterId = 0, + .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_VictoryDance, }, @@ -19392,6 +19519,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_DEF_SPDEF_DOWN, .self = TRUE, }), + .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestComboStarterId = 0, + .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_HeadlongRush, }, @@ -19427,7 +19557,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = B_UPDATED_MOVE_DATA >= GEN_9 ? 80 : 75, .type = TYPE_PSYCHIC, .accuracy = B_UPDATED_MOVE_DATA >= GEN_9 ? 100 : 90, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, @@ -19492,7 +19622,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = B_UPDATED_MOVE_DATA >= GEN_9 ? 10 : 15, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, @@ -19535,7 +19665,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "High critical hit ratio. Sets\n" "Splinters that hurt the foe."), - .effect = EFFECT_HIT, + .effect = EFFECT_CEASELESS_EDGE, .power = 65, .type = TYPE_DARK, .accuracy = 90, @@ -19546,8 +19676,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .makesContact = TRUE, .slicingMove = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ - .moveEffect = MOVE_EFFECT_SPIKES, - .chance = 100, + .sheerForceOverride = TRUE, }), .battleAnimScript = gBattleAnimMove_CeaselessEdge, }, @@ -19807,6 +19936,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .makesContact = TRUE, .punchingMove = TRUE, .metronomeBanned = TRUE, + .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, + .contestComboStarterId = 0, + .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_JetPunch, }, @@ -19879,7 +20011,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Ice-covered feet hit a foe\n" "and destroy the terrain."), - .effect = EFFECT_HIT_SET_REMOVE_TERRAIN, + .effect = EFFECT_ICE_SPINNER, .power = 80, .type = TYPE_ICE, .accuracy = 100, @@ -19888,7 +20020,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .argument = { .moveProperty = ARG_TRY_REMOVE_TERRAIN_HIT }, // Remove the active field terrain if there is one. .skyBattleBanned = B_EXTRAPOLATED_MOVE_FLAGS, .battleAnimScript = gBattleAnimMove_IceSpinner, }, @@ -20174,7 +20305,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Summons a ruinous disaster\n" "and cuts half the foe's HP."), - .effect = EFFECT_SUPER_FANG, + .effect = EFFECT_FIXED_PERCENT_DAMAGE, .power = 1, .type = TYPE_DARK, .accuracy = 90, @@ -20182,7 +20313,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, + .argument = { .damagePercentage = 50 }, .metronomeBanned = TRUE, + .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, + .contestComboStarterId = 0, + .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Ruination, }, @@ -20317,6 +20452,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .metronomeBanned = TRUE, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestComboStarterId = 0, + .contestComboMoves = {0}, .battleAnimScript = (B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_HAIL) ? gBattleAnimMove_Hail : gBattleAnimMove_Snowscape, }, @@ -20364,6 +20503,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .self = TRUE, .chance = 100, }), + .contestEffect = CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, + .contestComboStarterId = 0, + .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Trailblaze, }, @@ -20386,6 +20528,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_ATK_MINUS_1, .chance = 100, }), + .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestComboStarterId = 0, + .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_ChillingWater, }, @@ -20467,6 +20612,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_DEF_SPDEF_DOWN, .self = TRUE, }), + .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestComboStarterId = 0, + .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_ArmorCannon, }, @@ -20550,6 +20698,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .makesContact = TRUE, .meFirstBanned = TRUE, .metronomeBanned = TRUE, + .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestComboStarterId = 0, + .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Comeuppance, }, @@ -20563,7 +20714,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 70, .type = TYPE_WATER, .accuracy = 100, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, @@ -20831,7 +20982,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 10, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, @@ -20858,7 +21009,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SP_ATK_PLUS_1, .self = TRUE, .onChargeTurnOnly = TRUE, - .sheerForceBoost = SHEER_FORCE_BOOST, + .sheerForceOverride = TRUE, }), .battleAnimScript = gBattleAnimMove_ElectroShot, }, @@ -20937,6 +21088,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 1, .category = DAMAGE_CATEGORY_SPECIAL, + .contestEffect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestComboStarterId = 0, + .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Thunderclap, }, @@ -21026,7 +21180,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .soundMove = TRUE, - .ignoresSubstitute = TRUE, + .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_CONFUSION, .onlyIfTargetRaisedStats = TRUE, @@ -21069,6 +21223,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .minimizeDoubleDamage = TRUE, + .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestComboStarterId = 0, + .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SupercellSlam, }, @@ -21087,7 +21244,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .soundMove = TRUE, - .ignoresSubstitute = TRUE, + .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PSYCHIC_NOISE, .chance = 100, @@ -21134,7 +21291,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_TOXIC, .chance = 50, - .sheerForceBoost = SHEER_FORCE_BOOST, }), .battleAnimScript = gBattleAnimMove_MalignantChain, }, @@ -21520,7 +21676,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Mew attacks with full force.\n" "Psychically charges terrain."), - .effect = EFFECT_HIT_SET_REMOVE_TERRAIN, + .effect = EFFECT_HIT, .power = 185, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -21528,8 +21684,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .argument = { .moveProperty = ARG_SET_PSYCHIC_TERRAIN }, // Set Psychic Terrain. If there's a different field terrain active, overwrite it. .battleAnimScript = gBattleAnimMove_GenesisSupernova, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PSYCHIC_TERRAIN, + .chance = 100, + }), }, [MOVE_SINISTER_ARROW_RAID] = { @@ -21561,6 +21720,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .minimizeDoubleDamage = TRUE, .battleAnimScript = gBattleAnimMove_MaliciousMoonsault, }, [MOVE_OCEANIC_OPERETTA] = @@ -21585,7 +21745,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Lycanroc attacks with full\n" "force. Removes all terrain."), - .effect = EFFECT_HIT_SET_REMOVE_TERRAIN, + .effect = EFFECT_ICE_SPINNER, .power = 190, .type = TYPE_ROCK, .accuracy = 0, @@ -21593,7 +21753,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .moveProperty = ARG_TRY_REMOVE_TERRAIN_HIT }, // Remove the active field terrain if there is one. .battleAnimScript = gBattleAnimMove_SplinteredStormshards, }, [MOVE_LETS_SNUGGLE_FOREVER] = @@ -21641,7 +21800,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "The Land Spirit PokΓ©mon\n" "greatly reduces the foe's HP."), - .effect = EFFECT_GUARDIAN_OF_ALOLA, + .effect = EFFECT_FIXED_PERCENT_DAMAGE, .power = 1, .type = TYPE_FAIRY, .accuracy = 0, @@ -21649,6 +21808,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, + .argument = { .damagePercentage = 75 }, .battleAnimScript = gBattleAnimMove_GuardianOfAlola, }, [MOVE_SEARING_SUNRAZE_SMASH] = @@ -21752,8 +21912,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxFlare, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_SUN, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -21774,8 +21932,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxFlutterby, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_LOWER_SP_ATK_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -21796,8 +21952,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxLightning, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_ELECTRIC_TERRAIN, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -21818,8 +21972,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxStrike, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_LOWER_SPEED_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -21840,8 +21992,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxKnuckle, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_RAISE_TEAM_ATTACK, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -21862,8 +22012,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxPhantasm, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_LOWER_DEFENSE_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -21884,8 +22032,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxHailstorm, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_HAIL, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -21906,8 +22052,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxOoze, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_RAISE_TEAM_SP_ATK, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -21928,8 +22072,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxGeyser, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_RAIN, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -21950,8 +22092,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxAirstream, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_RAISE_TEAM_SPEED, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -21972,8 +22112,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxStarfall, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_MISTY_TERRAIN, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -21994,8 +22132,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxWyrmwind, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_LOWER_ATTACK_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22016,8 +22152,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxMindstorm, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PSYCHIC_TERRAIN, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22038,8 +22172,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxRockfall, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_SANDSTORM, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22061,8 +22193,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxQuake, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_RAISE_TEAM_SP_DEF, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22083,8 +22213,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxDarkness, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_LOWER_SP_DEF_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22105,8 +22233,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxOvergrowth, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_GRASSY_TERRAIN, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22127,8 +22253,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxSteelspike, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_RAISE_TEAM_DEFENSE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22149,8 +22273,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxVineLash, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_VINE_LASH, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22171,8 +22293,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxWildfire, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WILDFIRE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22193,8 +22313,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxCannonade, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_CANNONADE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22215,8 +22333,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxBefuddle, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_EFFECT_SPORE_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22237,8 +22353,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxVoltCrash, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PARALYZE_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22259,8 +22373,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxGoldRush, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_CONFUSE_PAY_DAY_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22281,8 +22393,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxChiStrike, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_CRIT_PLUS_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22303,8 +22413,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxTerror, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PREVENT_ESCAPE_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22325,8 +22433,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxFoamBurst, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_LOWER_SPEED_2_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22347,8 +22453,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxResonance, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_AURORA_VEIL, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22369,8 +22473,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxCuddle, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_INFATUATE_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22391,8 +22493,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxReplenish, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_RECYCLE_BERRIES, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22413,8 +22513,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxMalodor, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_POISON_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22435,8 +22533,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxMeltdown, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_TORMENT_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22458,8 +22554,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxDrumSolo, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FIXED_POWER, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22481,8 +22575,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxFireball, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FIXED_POWER, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22504,8 +22596,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxHydrosnipe, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FIXED_POWER, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22526,8 +22616,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxWindRage, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_DEFOG, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22548,8 +22636,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxGravitas, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_GRAVITY, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22570,8 +22656,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxStonesurge, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_STEALTH_ROCK, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22592,8 +22676,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxVolcalith, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_VOLCALITH, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22614,8 +22696,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxTartness, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_LOWER_EVASIVENESS_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22636,8 +22716,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxSweetness, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_AROMATHERAPY, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22658,8 +22736,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxSandblast, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_SANDBLAST_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22680,8 +22756,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxStunShock, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_POISON_PARALYZE_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22702,8 +22776,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxCentiferno, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FIRE_SPIN_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22724,8 +22796,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxSmite, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_CONFUSE_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22747,8 +22817,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxSnooze, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_YAWN_FOE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22769,8 +22837,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxFinale, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_HEAL_TEAM, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22791,8 +22857,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxSteelsurge, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_STEELSURGE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22813,8 +22877,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxDepletion, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_SPITE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, diff --git a/src/data/object_events/movement_action_func_tables.h b/src/data/object_events/movement_action_func_tables.h index 44639b6c9ba9..17f601af8a96 100755 --- a/src/data/object_events/movement_action_func_tables.h +++ b/src/data/object_events/movement_action_func_tables.h @@ -287,6 +287,12 @@ u8 MovementAction_SurfStillLeft_Step0(struct ObjectEvent *objectEvent, struct Sp u8 MovementAction_SurfStillLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); u8 MovementAction_SurfStillRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); u8 MovementAction_SurfStillRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +//fast diagonal +u8 MovementAction_WalkFastDiagonalUpLeft_Step0(struct ObjectEvent *, struct Sprite *); +u8 MovementAction_WalkFastDiagonalUpRight_Step0(struct ObjectEvent *, struct Sprite *); +u8 MovementAction_WalkFastDiagonalDownLeft_Step0(struct ObjectEvent *, struct Sprite *); +u8 MovementAction_WalkFastDiagonalDownRight_Step0(struct ObjectEvent *, struct Sprite *); +u8 MovementAction_WalkFastDiagonal_Step1(struct ObjectEvent *, struct Sprite *); u8 (*const gMovementActionFuncs_FaceDown[])(struct ObjectEvent *, struct Sprite *); @@ -463,6 +469,12 @@ u8 (*const gMovementActionFuncs_SurfStillDown[])(struct ObjectEvent *, struct Sp u8 (*const gMovementActionFuncs_SurfStillUp[])(struct ObjectEvent *, struct Sprite *); u8 (*const gMovementActionFuncs_SurfStillLeft[])(struct ObjectEvent *, struct Sprite *); u8 (*const gMovementActionFuncs_SurfStillRight[])(struct ObjectEvent *, struct Sprite *); +//fast diagonal +u8 (*const gMovementActionFuncs_WalkFastDiagonalUpLeft[])(struct ObjectEvent *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkFastDiagonalUpRight[])(struct ObjectEvent *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkFastDiagonalDownLeft[])(struct ObjectEvent *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkFastDiagonalDownRight[])(struct ObjectEvent *, struct Sprite *); + u8 (*const *const gMovementActionFuncs[])(struct ObjectEvent *, struct Sprite *) = { [MOVEMENT_ACTION_FACE_DOWN] = gMovementActionFuncs_FaceDown, @@ -639,6 +651,12 @@ u8 (*const *const gMovementActionFuncs[])(struct ObjectEvent *, struct Sprite *) [MOVEMENT_ACTION_SURF_STILL_UP] = gMovementActionFuncs_SurfStillUp, [MOVEMENT_ACTION_SURF_STILL_LEFT] = gMovementActionFuncs_SurfStillLeft, [MOVEMENT_ACTION_SURF_STILL_RIGHT] = gMovementActionFuncs_SurfStillRight, + //fast diagonal + [MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_LEFT] = gMovementActionFuncs_WalkFastDiagonalUpLeft, + [MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_RIGHT] = gMovementActionFuncs_WalkFastDiagonalUpRight, + [MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_LEFT] = gMovementActionFuncs_WalkFastDiagonalDownLeft, + [MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_RIGHT] = gMovementActionFuncs_WalkFastDiagonalDownRight, + }; u8 (*const gMovementActionFuncs_FaceDown[])(struct ObjectEvent *, struct Sprite *) = { @@ -1649,30 +1667,55 @@ bool8 (*const gMovementActionFuncs_WalkSlowStairsRight[])(struct ObjectEvent *, MovementAction_PauseSpriteAnim, }; -u8 (*const gMovementActionFuncs_SurfStillDown[])(struct ObjectEvent *, struct Sprite *) = +u8 (*const gMovementActionFuncs_SurfStillDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_SurfStillDown_Step0, MovementAction_SurfStillDown_Step1, MovementAction_PauseSpriteAnim, }; -u8 (*const gMovementActionFuncs_SurfStillUp[])(struct ObjectEvent *, struct Sprite *) = +u8 (*const gMovementActionFuncs_SurfStillUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_SurfStillUp_Step0, MovementAction_SurfStillUp_Step1, MovementAction_PauseSpriteAnim, }; -u8 (*const gMovementActionFuncs_SurfStillLeft[])(struct ObjectEvent *, struct Sprite *) = +u8 (*const gMovementActionFuncs_SurfStillLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_SurfStillLeft_Step0, MovementAction_SurfStillLeft_Step1, MovementAction_PauseSpriteAnim, }; -u8 (*const gMovementActionFuncs_SurfStillRight[])(struct ObjectEvent *, struct Sprite *) = +u8 (*const gMovementActionFuncs_SurfStillRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_SurfStillRight_Step0, MovementAction_SurfStillRight_Step1, MovementAction_PauseSpriteAnim, }; +// fast diagonal +u8 (*const gMovementActionFuncs_WalkFastDiagonalUpLeft[])(struct ObjectEvent *, struct Sprite *) = { + MovementAction_WalkFastDiagonalUpLeft_Step0, + MovementAction_WalkFastDiagonal_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkFastDiagonalUpRight[])(struct ObjectEvent *, struct Sprite *) = { + MovementAction_WalkFastDiagonalUpRight_Step0, + MovementAction_WalkFastDiagonal_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkFastDiagonalDownLeft[])(struct ObjectEvent *, struct Sprite *) = { + MovementAction_WalkFastDiagonalDownLeft_Step0, + MovementAction_WalkFastDiagonal_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkFastDiagonalDownRight[])(struct ObjectEvent *, struct Sprite *) = { + MovementAction_WalkFastDiagonalDownRight_Step0, + MovementAction_WalkFastDiagonal_Step1, + MovementAction_PauseSpriteAnim, +}; + diff --git a/src/data/object_events/object_event_graphics.h b/src/data/object_events/object_event_graphics.h index c7b92def912d..424d4224f389 100755 --- a/src/data/object_events/object_event_graphics.h +++ b/src/data/object_events/object_event_graphics.h @@ -286,6 +286,8 @@ const u32 gObjectEventPic_CustapBerryTree[] = INCBIN_U32("graphics/object_events const u32 gObjectEventPic_JabocaBerryTree[] = INCBIN_U32("graphics/object_events/pics/berry_trees/jaboca.4bpp"); const u32 gObjectEventPic_RowapBerryTree[] = INCBIN_U32("graphics/object_events/pics/berry_trees/rowap.4bpp"); const u32 gFieldEffectObjectPic_SurfBlob[] = INCBIN_U32("graphics/field_effects/pics/surf_blob.4bpp"); +const u32 gFieldEffectObjectPic_RockClimbBlob[] = INCBIN_U32("graphics/field_effects/pics/rock_climb_blob.4bpp"); +const u32 gFieldEffectObjectPic_RockClimbDust[] = INCBIN_U32("graphics/field_effects/pics/rock_climb_dust.4bpp"); const u32 gObjectEventPic_QuintyPlump[] = INCBIN_U32("graphics/object_events/pics/people/quinty_plump.4bpp"); const u16 gObjectEventPal_QuintyPlump[] = INCBIN_U16("graphics/object_events/palettes/quinty_plump.gbapal"); const u16 gObjectEventPal_QuintyPlumpReflection[] = INCBIN_U16("graphics/object_events/palettes/quinty_plump_reflection.gbapal"); @@ -330,6 +332,7 @@ const u32 gFieldEffectObjectPic_MountainDisguise[] = INCBIN_U32("graphics/field_ const u32 gFieldEffectObjectPic_SandDisguisePlaceholder[] = INCBIN_U32("graphics/field_effects/pics/sand_disguise_placeholder.4bpp"); const u32 gFieldEffectObjectPic_HotSpringsWater[] = INCBIN_U32("graphics/field_effects/pics/hot_springs_water.4bpp"); const u16 gFieldEffectPal_Ash[] = INCBIN_U16("graphics/field_effects/palettes/ash.gbapal"); +const u16 gFieldEffectPal_DustCloud[] = INCBIN_U16("graphics/field_effects/palettes/big_dust.gbapal"); const u32 gFieldEffectObjectPic_AshPuff[] = INCBIN_U32("graphics/field_effects/pics/ash_puff.4bpp"); const u32 gFieldEffectObjectPic_AshLaunch[] = INCBIN_U32("graphics/field_effects/pics/ash_launch.4bpp"); const u32 gFieldEffectObjectPic_Bubbles[] = INCBIN_U32("graphics/field_effects/pics/bubbles.4bpp"); @@ -462,3 +465,5 @@ const u16 gObjectEventPal_StrangeBall[] = INCBIN_U16("graphics/object_events/pic const u32 gFieldEffectObjectPic_CaveDust[] = INCBIN_U32("graphics/field_effects/pics/cave_dust.4bpp"); const u16 gFieldEffectObjectPalette_CaveDust[] = INCBIN_U16("graphics/field_effects/palettes/cave_dust.gbapal"); + +const u32 gObjectEventPic_ApricornTree[] = INCBIN_U32("graphics/object_events/pics/misc/apricorn_tree.4bpp"); diff --git a/src/data/object_events/object_event_graphics_info.h b/src/data/object_events/object_event_graphics_info.h index 91b3ab2c9d5d..5b1c891eb44a 100755 --- a/src/data/object_events/object_event_graphics_info.h +++ b/src/data/object_events/object_event_graphics_info.h @@ -4690,3 +4690,22 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BallLight = { .images = gFieldEffectObjectPicTable_BallLight, .affineAnims = gDummySpriteAffineAnimTable, }; + +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ApricornTree = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_NPC_3, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 128, + .width = 16, + .height = 16, + .paletteSlot = PALSLOT_NPC_3, + .shadowSize = SHADOW_SIZE_S, + .inanimate = TRUE, + .compressed = FALSE, + .tracks = TRACKS_NONE, + .oam = &gObjectEventBaseOam_16x16, + .subspriteTables = sOamTables_16x16, + .anims = sAnimTable_Inanimate, + .images = sPicTable_ApricornTree, + .affineAnims = gDummySpriteAffineAnimTable, +}; diff --git a/src/data/object_events/object_event_graphics_info_pointers.h b/src/data/object_events/object_event_graphics_info_pointers.h index 117187739bf1..a239bce99317 100755 --- a/src/data/object_events/object_event_graphics_info_pointers.h +++ b/src/data/object_events/object_event_graphics_info_pointers.h @@ -248,6 +248,7 @@ extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Storyteller extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Giddy; extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedMauvilleOldMan1; extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedMauvilleOldMan2; +extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ApricornTree; const struct ObjectEventGraphicsInfo *const gObjectEventGraphicsInfoPointers[NUM_OBJ_EVENT_GFX] = { [OBJ_EVENT_GFX_BRENDAN_NORMAL] = &gObjectEventGraphicsInfo_BrendanNormal, @@ -492,6 +493,7 @@ const struct ObjectEventGraphicsInfo *const gObjectEventGraphicsInfoPointers[NUM [OBJ_EVENT_GFX_POKE_BALL] = &gObjectEventGraphicsInfo_PokeBall, [OBJ_EVENT_GFX_OW_MON] = &gObjectEventGraphicsInfo_Follower, [OBJ_EVENT_GFX_LIGHT_SPRITE] = &gObjectEventGraphicsInfo_BallLight, + [OBJ_EVENT_GFX_APRICORN_TREE] = &gObjectEventGraphicsInfo_ApricornTree, }; const struct ObjectEventGraphicsInfo *const gMauvilleOldManGraphicsInfoPointers[] = { diff --git a/src/data/object_events/object_event_pic_tables.h b/src/data/object_events/object_event_pic_tables.h index c1f8fd6f1c94..06d353b44d37 100755 --- a/src/data/object_events/object_event_pic_tables.h +++ b/src/data/object_events/object_event_pic_tables.h @@ -1356,3 +1356,7 @@ static const struct SpriteFrameImage sPicTable_KirliaOld[] = { static const struct SpriteFrameImage sPicTable_RubySapphireMay[] = { overworld_ascending_frames(gObjectEventPic_RubySapphireMayNormal, 2, 4), }; + +static const struct SpriteFrameImage sPicTable_ApricornTree[] = { + overworld_frame(gObjectEventPic_ApricornTree, 2, 2, 0), +}; diff --git a/src/data/object_events/object_event_pic_tables_followers.h b/src/data/object_events/object_event_pic_tables_followers.h index 305fd6b74e3e..13f9d173160c 100644 --- a/src/data/object_events/object_event_pic_tables_followers.h +++ b/src/data/object_events/object_event_pic_tables_followers.h @@ -4590,9 +4590,11 @@ static const struct SpriteFrameImage sPicTable_Frogadier[] = { static const struct SpriteFrameImage sPicTable_Greninja[] = { overworld_ascending_frames(gObjectEventPic_Greninja, 4, 4), }; -/*static const struct SpriteFrameImage sPicTable_GreninjaAsh[] = { +#if OW_BATTLE_ONLY_FORMS +static const struct SpriteFrameImage sPicTable_GreninjaAsh[] = { overworld_ascending_frames(gObjectEventPic_GreninjaAsh, 4, 4), -};*/ +}; +#endif //OW_BATTLE_ONLY_FORMS #endif //P_FAMILY_FROAKIE #if P_FAMILY_BUNNELBY diff --git a/src/data/party_menu.h b/src/data/party_menu.h index f8860ac4b06e..cce9c7036c68 100644 --- a/src/data/party_menu.h +++ b/src/data/party_menu.h @@ -118,6 +118,7 @@ static const u8 sFontColorTable[][3] = {TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}, // Selection actions {TEXT_COLOR_WHITE, TEXT_COLOR_BLUE, TEXT_COLOR_LIGHT_BLUE}, // Field moves {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY}, // Unused + {TEXT_COLOR_WHITE, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED}, // Move relearner }; static const struct WindowTemplate sSinglePartyMenuWindowTemplate[] = @@ -717,6 +718,11 @@ struct [MENU_TRADE1] = {sText_Trade4, CursorCb_Trade1}, [MENU_TRADE2] = {sText_Trade4, CursorCb_Trade2}, [MENU_TOSS] = {gMenuText_Toss, CursorCb_Toss}, + [MENU_LEVEL_UP_MOVES] = {COMPOUND_STRING("LEVEL MOVES"), CursorCb_ChangeLevelUpMoves}, + [MENU_EGG_MOVES] = {COMPOUND_STRING("EGG MOVES"), CursorCb_ChangeEggMoves}, + [MENU_TM_MOVES] = {COMPOUND_STRING("TM MOVES"), CursorCb_ChangeTMMoves}, + [MENU_TUTOR_MOVES] = {COMPOUND_STRING("TUTOR MOVES"), CursorCb_ChangeTutorMoves}, + [MENU_SUB_MOVES] = {COMPOUND_STRING("LEARN MOVES"), CursorCb_LearnMovesSubMenu}, [MENU_CATALOG_BULB] = {COMPOUND_STRING("Light bulb"), CursorCb_CatalogBulb}, [MENU_CATALOG_OVEN] = {COMPOUND_STRING("Microwave oven"), CursorCb_CatalogOven}, [MENU_CATALOG_WASHING] = {COMPOUND_STRING("Washing machine"), CursorCb_CatalogWashing}, @@ -785,55 +791,6 @@ static const u8 sPartyMenuActionCounts[] = [ACTIONS_ZYGARDE_CUBE] = ARRAY_COUNT(sPartyMenuAction_ZygardeCube), }; -static const u16 sFieldMoves[FIELD_MOVES_COUNT + 1] = -{ - [FIELD_MOVE_CUT] = MOVE_CUT, - [FIELD_MOVE_FLASH] = MOVE_FLASH, - [FIELD_MOVE_ROCK_SMASH] = MOVE_ROCK_SMASH, - [FIELD_MOVE_STRENGTH] = MOVE_STRENGTH, - [FIELD_MOVE_SURF] = MOVE_SURF, - [FIELD_MOVE_FLY] = MOVE_FLY, - [FIELD_MOVE_DIVE] = MOVE_DIVE, - [FIELD_MOVE_WATERFALL] = MOVE_WATERFALL, - [FIELD_MOVE_TELEPORT] = MOVE_TELEPORT, - [FIELD_MOVE_DIG] = MOVE_DIG, - [FIELD_MOVE_SECRET_POWER] = MOVE_SECRET_POWER, - [FIELD_MOVE_MILK_DRINK] = MOVE_MILK_DRINK, - [FIELD_MOVE_SOFT_BOILED] = MOVE_SOFT_BOILED, - [FIELD_MOVE_SWEET_SCENT] = MOVE_SWEET_SCENT, -#if OW_DEFOG_FIELD_MOVE == TRUE - [FIELD_MOVE_DEFOG] = MOVE_DEFOG, -#endif - // NOTE: This value is used as the terminal value for the table. There's no reason to do this, as the size of the table is known. - // Whichever move shares this value (MOVE_SWORDS_DANCE by default) if present will be treated as the end of the array rather than a field move. - [FIELD_MOVES_COUNT] = FIELD_MOVES_COUNT -}; - -struct -{ - bool8 (*fieldMoveFunc)(void); - u8 msgId; -} static const sFieldMoveCursorCallbacks[FIELD_MOVES_COUNT] = -{ - [FIELD_MOVE_CUT] = {SetUpFieldMove_Cut, PARTY_MSG_NOTHING_TO_CUT}, - [FIELD_MOVE_FLASH] = {SetUpFieldMove_Flash, PARTY_MSG_CANT_USE_HERE}, - [FIELD_MOVE_ROCK_SMASH] = {SetUpFieldMove_RockSmash, PARTY_MSG_CANT_USE_HERE}, - [FIELD_MOVE_STRENGTH] = {SetUpFieldMove_Strength, PARTY_MSG_CANT_USE_HERE}, - [FIELD_MOVE_SURF] = {SetUpFieldMove_Surf, PARTY_MSG_CANT_SURF_HERE}, - [FIELD_MOVE_FLY] = {SetUpFieldMove_Fly, PARTY_MSG_CANT_USE_HERE}, - [FIELD_MOVE_DIVE] = {SetUpFieldMove_Dive, PARTY_MSG_CANT_USE_HERE}, - [FIELD_MOVE_WATERFALL] = {SetUpFieldMove_Waterfall, PARTY_MSG_CANT_USE_HERE}, - [FIELD_MOVE_TELEPORT] = {SetUpFieldMove_Teleport, PARTY_MSG_CANT_USE_HERE}, - [FIELD_MOVE_DIG] = {SetUpFieldMove_Dig, PARTY_MSG_CANT_USE_HERE}, - [FIELD_MOVE_SECRET_POWER] = {SetUpFieldMove_SecretPower, PARTY_MSG_CANT_USE_HERE}, - [FIELD_MOVE_MILK_DRINK] = {SetUpFieldMove_SoftBoiled, PARTY_MSG_NOT_ENOUGH_HP}, - [FIELD_MOVE_SOFT_BOILED] = {SetUpFieldMove_SoftBoiled, PARTY_MSG_NOT_ENOUGH_HP}, - [FIELD_MOVE_SWEET_SCENT] = {SetUpFieldMove_SweetScent, PARTY_MSG_CANT_USE_HERE}, -#if OW_DEFOG_FIELD_MOVE == TRUE - [FIELD_MOVE_DEFOG] = {SetUpFieldMove_Defog, PARTY_MSG_CANT_USE_HERE}, -#endif -}; - static const u8 *const sUnionRoomTradeMessages[] = { [UR_TRADE_MSG_NOT_MON_PARTNER_WANTS - 1] = gText_NotPkmnOtherTrainerWants, diff --git a/src/data/pokemon/form_change_table_pointers.h b/src/data/pokemon/form_change_table_pointers.h index ea2cdfd2a252..1af386a8971e 100644 --- a/src/data/pokemon/form_change_table_pointers.h +++ b/src/data/pokemon/form_change_table_pointers.h @@ -34,3 +34,22 @@ const struct Fusion *const gFusionTablePointers[NUM_SPECIES] = #endif //P_FAMILY_CALYREX #endif //P_FUSION_FORMS }; + +#if P_FUSION_FORMS +#if P_FAMILY_KYUREM +#if P_FAMILY_RESHIRAM +const u16 gKyuremWhiteSwapMoveTable[][2] = +{ + {MOVE_SCARY_FACE, MOVE_FUSION_FLARE}, + {MOVE_GLACIATE, MOVE_ICE_BURN}, +}; +#endif //P_FAMILY_RESHIRAM +#if P_FAMILY_ZEKROM +const u16 gKyuremBlackSwapMoveTable[][2] = +{ + {MOVE_SCARY_FACE, MOVE_FUSION_BOLT}, + {MOVE_GLACIATE, MOVE_FREEZE_SHOCK}, +}; +#endif //P_FAMILY_ZEKROM +#endif //P_FAMILY_KYUREM +#endif //P_FUSION_FORMS diff --git a/src/data/pokemon/form_change_tables.h b/src/data/pokemon/form_change_tables.h index b15ad80b76ab..54584c579645 100644 --- a/src/data/pokemon/form_change_tables.h +++ b/src/data/pokemon/form_change_tables.h @@ -73,6 +73,15 @@ static const struct FormChange sPikachuFormChangeTable[] = }; #endif //P_FAMILY_PIKACHU +#if P_FAMILY_CLEFAIRY +static const struct FormChange sClefableFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_CLEFABLE_MEGA, ITEM_CLEFABLITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_CLEFAIRY + #if P_FAMILY_MEOWTH static const struct FormChange sMeowthFormChangeTable[] = { @@ -102,6 +111,15 @@ static const struct FormChange sMachampFormChangeTable[] = }; #endif //P_FAMILY_MACHOP +#if P_FAMILY_BELLSPROUT +static const struct FormChange sVictreebelFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_VICTREEBEL_MEGA, ITEM_VICTREEBELITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_BELLSPROUT + #if P_FAMILY_SLOWPOKE static const struct FormChange sSlowbroFormChangeTable[] = { #if P_MEGA_EVOLUTIONS @@ -153,6 +171,15 @@ static const struct FormChange sKangaskhanFormChangeTable[] = { }; #endif //P_FAMILY_KANGASKHAN +#if P_FAMILY_STARYU +static const struct FormChange sStarmieFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_STARMIE_MEGA, ITEM_STARMINITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_STARYU + #if P_FAMILY_SCYTHER #if P_GEN_2_CROSS_EVOS static const struct FormChange sScizorFormChangeTable[] = { @@ -218,6 +245,15 @@ static const struct FormChange sSnorlaxFormChangeTable[] = { }; #endif //P_FAMILY_SNORLAX +#if P_FAMILY_DRATINI +static const struct FormChange sDragoniteFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_DRAGONITE_MEGA, ITEM_DRAGONINITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_DRATINI + #if P_FAMILY_MEWTWO static const struct FormChange sMewtwoFormChangeTable[] = { #if P_MEGA_EVOLUTIONS @@ -228,6 +264,24 @@ static const struct FormChange sMewtwoFormChangeTable[] = { }; #endif //P_FAMILY_MEWTWO +#if P_FAMILY_CHIKORITA +static const struct FormChange sMeganiumFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_MEGANIUM_MEGA, ITEM_MEGANIUMITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_CHIKORITA + +#if P_FAMILY_TOTODILE +static const struct FormChange sFeraligatrFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_FERALIGATR_MEGA, ITEM_FERALIGITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_TOTODILE + #if P_FAMILY_MAREEP static const struct FormChange sAmpharosFormChangeTable[] = { #if P_MEGA_EVOLUTIONS @@ -246,6 +300,15 @@ static const struct FormChange sHeracrossFormChangeTable[] = { }; #endif //P_FAMILY_HERACROSS +#if P_FAMILY_SKARMORY +static const struct FormChange sSkarmoryFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_SKARMORY_MEGA, ITEM_SKARMORITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_SKARMORY + #if P_FAMILY_HOUNDOUR static const struct FormChange sHoundoomFormChangeTable[] = { #if P_MEGA_EVOLUTIONS @@ -406,6 +469,13 @@ static const struct FormChange sGlalieFormChangeTable[] = { #endif {FORM_CHANGE_TERMINATOR}, }; + +static const struct FormChange sFroslassFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_FROSLASS_MEGA, ITEM_FROSLASSITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; #endif //P_FAMILY_SNORUNT #if P_FAMILY_CASTFORM @@ -528,14 +598,14 @@ static const struct FormChange sDeoxysSpeedFormChangeTable[] = { #if P_FAMILY_BURMY static const struct FormChange sBurmyFormChangeTable[] = { - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_GRASS}, - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_LONG_GRASS}, - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_POND}, - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_MOUNTAIN}, - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_PLAIN}, - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_SANDY, BATTLE_ENVIRONMENT_CAVE}, - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_SANDY, BATTLE_ENVIRONMENT_SAND}, - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_TRASH, BATTLE_ENVIRONMENT_BUILDING}, + {FORM_CHANGE_END_BATTLE_ENVIRONMENT, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_GRASS}, + {FORM_CHANGE_END_BATTLE_ENVIRONMENT, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_LONG_GRASS}, + {FORM_CHANGE_END_BATTLE_ENVIRONMENT, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_POND}, + {FORM_CHANGE_END_BATTLE_ENVIRONMENT, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_MOUNTAIN}, + {FORM_CHANGE_END_BATTLE_ENVIRONMENT, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_PLAIN}, + {FORM_CHANGE_END_BATTLE_ENVIRONMENT, SPECIES_BURMY_SANDY, BATTLE_ENVIRONMENT_CAVE}, + {FORM_CHANGE_END_BATTLE_ENVIRONMENT, SPECIES_BURMY_SANDY, BATTLE_ENVIRONMENT_SAND}, + {FORM_CHANGE_END_BATTLE_ENVIRONMENT, SPECIES_BURMY_TRASH, BATTLE_ENVIRONMENT_BUILDING}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_BURMY @@ -690,6 +760,24 @@ static const struct FormChange sArceusFormChangeTable[] = { }; #endif //P_FAMILY_ARCEUS +#if P_FAMILY_TEPIG +static const struct FormChange sEmboarFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_EMBOAR_MEGA, ITEM_EMBOARITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_TEPIG + +#if P_FAMILY_DRILBUR +static const struct FormChange sExcadrillFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_EXCADRILL_MEGA, ITEM_EXCADRITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_DRILBUR + #if P_FAMILY_AUDINO static const struct FormChange sAudinoFormChangeTable[] = { #if P_MEGA_EVOLUTIONS @@ -699,6 +787,15 @@ static const struct FormChange sAudinoFormChangeTable[] = { }; #endif //P_FAMILY_AUDINO +#if P_FAMILY_VENIPEDE +static const struct FormChange sScolipedeFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_SCOLIPEDE_MEGA, ITEM_SCOLIPITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_VENIPEDE + #if P_FAMILY_DARUMAKA static const struct FormChange sDarmanitanFormChangeTable[] = { {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_DARMANITAN_STANDARD, ABILITY_ZEN_MODE, HP_HIGHER_THAN, 50}, @@ -719,6 +816,15 @@ static const struct FormChange sDarmanitanGalarFormChangeTable[] = { #endif //P_GALARIAN_FORMS #endif //P_FAMILY_DARUMAKA +#if P_FAMILY_SCRAGGY +static const struct FormChange sScraftyFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_SCRAFTY_MEGA, ITEM_SCRAFTINITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_SCRAGGY + #if P_FAMILY_TRUBBISH static const struct FormChange sGarbodorFormChangeTable[] = { @@ -729,6 +835,24 @@ static const struct FormChange sGarbodorFormChangeTable[] = }; #endif //P_FAMILY_TRUBBISH +#if P_FAMILY_TYNAMO +static const struct FormChange sEelektrossFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_EELEKTROSS_MEGA, ITEM_EELEKTROSSITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_TYNAMO + +#if P_FAMILY_LITWICK +static const struct FormChange sChandelureFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_CHANDELURE_MEGA, ITEM_CHANDELURITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_LITWICK + #if P_FAMILY_TORNADUS static const struct FormChange sTornadusFormChangeTable[] = { {FORM_CHANGE_ITEM_USE, SPECIES_TORNADUS_THERIAN, ITEM_REVEAL_GLASS}, @@ -755,8 +879,8 @@ static const struct FormChange sLandorusFormChangeTable[] = { #if P_FAMILY_KYUREM static const struct Fusion sKyuremFusionTable[] = { - {0, ITEM_DNA_SPLICERS, SPECIES_KYUREM, SPECIES_RESHIRAM, SPECIES_KYUREM_WHITE}, - {0, ITEM_DNA_SPLICERS, SPECIES_KYUREM, SPECIES_ZEKROM, SPECIES_KYUREM_BLACK}, + {0, ITEM_DNA_SPLICERS, SPECIES_KYUREM, SPECIES_RESHIRAM, SPECIES_KYUREM_WHITE, MOVE_NONE, SWAP_EXTRA_MOVES_KYUREM_WHITE}, + {0, ITEM_DNA_SPLICERS, SPECIES_KYUREM, SPECIES_ZEKROM, SPECIES_KYUREM_BLACK, MOVE_NONE, SWAP_EXTRA_MOVES_KYUREM_BLACK}, {FUSION_TERMINATOR}, }; #endif //P_FAMILY_KYUREM @@ -771,15 +895,17 @@ static const struct FormChange sKeldeoFormChangeTable[] = { #if P_FAMILY_MELOETTA static const struct FormChange sMeloettaFormChangeTable[] = { - {FORM_CHANGE_FAINT, SPECIES_MELOETTA_ARIA}, - {FORM_CHANGE_END_BATTLE, SPECIES_MELOETTA_ARIA}, + {FORM_CHANGE_BATTLE_AFTER_MOVE, SPECIES_MELOETTA_PIROUETTE, MOVE_RELIC_SONG}, + {FORM_CHANGE_BATTLE_AFTER_MOVE, SPECIES_MELOETTA_ARIA, MOVE_RELIC_SONG}, + {FORM_CHANGE_FAINT, SPECIES_MELOETTA_ARIA}, + {FORM_CHANGE_END_BATTLE, SPECIES_MELOETTA_ARIA}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_MELOETTA #if P_FAMILY_GENESECT static const struct FormChange sGenesectFormChangeTable[] = { - {FORM_CHANGE_ITEM_HOLD, SPECIES_GENESECT, ITEM_NONE}, + {FORM_CHANGE_ITEM_HOLD, SPECIES_GENESECT, ITEM_NONE}, {FORM_CHANGE_ITEM_HOLD, SPECIES_GENESECT_DOUSE, ITEM_DOUSE_DRIVE}, {FORM_CHANGE_ITEM_HOLD, SPECIES_GENESECT_SHOCK, ITEM_SHOCK_DRIVE}, {FORM_CHANGE_ITEM_HOLD, SPECIES_GENESECT_BURN, ITEM_BURN_DRIVE}, @@ -788,7 +914,32 @@ static const struct FormChange sGenesectFormChangeTable[] = { }; #endif //P_FAMILY_GENESECT +#if P_FAMILY_CHESPIN +static const struct FormChange sChesnaughtFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_CHESNAUGHT_MEGA, ITEM_CHESNAUGHTITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_CHESPIN + +#if P_FAMILY_FENNEKIN +static const struct FormChange sDelphoxFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_DELPHOX_MEGA, ITEM_DELPHOXITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_FENNEKIN + #if P_FAMILY_FROAKIE +static const struct FormChange sGreninjaFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GRENINJA_MEGA, ITEM_GRENINJITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; + static const struct FormChange sGreninjaBattleBondFormChangeTable[] = { {FORM_CHANGE_FAINT, SPECIES_GRENINJA_BATTLE_BOND}, {FORM_CHANGE_END_BATTLE, SPECIES_GRENINJA_BATTLE_BOND}, @@ -796,6 +947,24 @@ static const struct FormChange sGreninjaBattleBondFormChangeTable[] = { }; #endif //P_FAMILY_FROAKIE +#if P_FAMILY_LITLEO +static const struct FormChange sPyroarFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_PYROAR_MEGA, ITEM_PYROARITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_LITLEO + +#if P_FAMILY_FLABEBE +static const struct FormChange sFloetteEternalFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_FLOETTE_MEGA, ITEM_FLOETTITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_FLABEBE + #if P_FAMILY_FURFROU static const struct FormChange sFurfrouFormChangeTable[] = { {FORM_CHANGE_WITHDRAW, SPECIES_FURFROU_NATURAL}, @@ -816,6 +985,42 @@ static const struct FormChange sAegislashFormChangeTable[] = { }; #endif //P_FAMILY_HONEDGE +#if P_FAMILY_INKAY +static const struct FormChange sMalamarFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_MALAMAR_MEGA, ITEM_MALAMARITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_INKAY + +#if P_FAMILY_BINACLE +static const struct FormChange sBarbaracleFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_BARBARACLE_MEGA, ITEM_BARBARACITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_BINACLE + +#if P_FAMILY_SKRELP +static const struct FormChange sDragalgeFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_DRAGALGE_MEGA, ITEM_DRAGALGITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_SKRELP + +#if P_FAMILY_HAWLUCHA +static const struct FormChange sHawluchaFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_HAWLUCHA_MEGA, ITEM_HAWLUCHANITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_HAWLUCHA + #if P_FAMILY_XERNEAS static const struct FormChange sXerneasFormChangeTable[] = { {FORM_CHANGE_BEGIN_BATTLE, SPECIES_XERNEAS_ACTIVE}, @@ -854,6 +1059,9 @@ static const struct FormChange sZygarde10PowerConstructFormChangeTable[] = { static const struct FormChange sZygardeCompleteFormChangeTable[] = { {FORM_CHANGE_FAINT}, {FORM_CHANGE_END_BATTLE}, +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_ZYGARDE_MEGA, ITEM_ZYGARDITE}, +#endif {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_ZYGARDE @@ -923,6 +1131,7 @@ static const struct FormChange sSilvallyFormChangeTable[] = { #if P_FAMILY_MINIOR static const struct FormChange sMiniorRedFormChangeTable[] = { + {FORM_CHANGE_BEGIN_BATTLE, SPECIES_MINIOR_CORE_RED}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_METEOR_RED, ABILITY_SHIELDS_DOWN, HP_HIGHER_THAN, 50}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_CORE_RED, ABILITY_SHIELDS_DOWN, HP_LOWER_EQ_THAN, 50}, {FORM_CHANGE_BATTLE_SWITCH, SPECIES_MINIOR_CORE_RED}, @@ -931,6 +1140,7 @@ static const struct FormChange sMiniorRedFormChangeTable[] = { {FORM_CHANGE_TERMINATOR}, }; static const struct FormChange sMiniorBlueFormChangeTable[] = { + {FORM_CHANGE_BEGIN_BATTLE, SPECIES_MINIOR_CORE_BLUE}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_METEOR_BLUE, ABILITY_SHIELDS_DOWN, HP_HIGHER_THAN, 50}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_CORE_BLUE, ABILITY_SHIELDS_DOWN, HP_LOWER_EQ_THAN, 50}, {FORM_CHANGE_BATTLE_SWITCH, SPECIES_MINIOR_CORE_BLUE}, @@ -939,6 +1149,7 @@ static const struct FormChange sMiniorBlueFormChangeTable[] = { {FORM_CHANGE_TERMINATOR}, }; static const struct FormChange sMiniorGreenFormChangeTable[] = { + {FORM_CHANGE_BEGIN_BATTLE, SPECIES_MINIOR_CORE_GREEN}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_METEOR_GREEN, ABILITY_SHIELDS_DOWN, HP_HIGHER_THAN, 50}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_CORE_GREEN, ABILITY_SHIELDS_DOWN, HP_LOWER_EQ_THAN, 50}, {FORM_CHANGE_BATTLE_SWITCH, SPECIES_MINIOR_CORE_GREEN}, @@ -947,6 +1158,7 @@ static const struct FormChange sMiniorGreenFormChangeTable[] = { {FORM_CHANGE_TERMINATOR}, }; static const struct FormChange sMiniorIndigoFormChangeTable[] = { + {FORM_CHANGE_BEGIN_BATTLE, SPECIES_MINIOR_CORE_INDIGO}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_METEOR_INDIGO, ABILITY_SHIELDS_DOWN, HP_HIGHER_THAN, 50}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_CORE_INDIGO, ABILITY_SHIELDS_DOWN, HP_LOWER_EQ_THAN, 50}, {FORM_CHANGE_BATTLE_SWITCH, SPECIES_MINIOR_CORE_INDIGO}, @@ -955,6 +1167,7 @@ static const struct FormChange sMiniorIndigoFormChangeTable[] = { {FORM_CHANGE_TERMINATOR}, }; static const struct FormChange sMiniorOrangeFormChangeTable[] = { + {FORM_CHANGE_BEGIN_BATTLE, SPECIES_MINIOR_CORE_ORANGE}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_METEOR_ORANGE, ABILITY_SHIELDS_DOWN, HP_HIGHER_THAN, 50}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_CORE_ORANGE, ABILITY_SHIELDS_DOWN, HP_LOWER_EQ_THAN, 50}, {FORM_CHANGE_BATTLE_SWITCH, SPECIES_MINIOR_CORE_ORANGE}, @@ -963,6 +1176,7 @@ static const struct FormChange sMiniorOrangeFormChangeTable[] = { {FORM_CHANGE_TERMINATOR}, }; static const struct FormChange sMiniorVioletFormChangeTable[] = { + {FORM_CHANGE_BEGIN_BATTLE, SPECIES_MINIOR_CORE_VIOLET}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_METEOR_VIOLET, ABILITY_SHIELDS_DOWN, HP_HIGHER_THAN, 50}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_CORE_VIOLET, ABILITY_SHIELDS_DOWN, HP_LOWER_EQ_THAN, 50}, {FORM_CHANGE_BATTLE_SWITCH, SPECIES_MINIOR_CORE_VIOLET}, @@ -971,6 +1185,7 @@ static const struct FormChange sMiniorVioletFormChangeTable[] = { {FORM_CHANGE_TERMINATOR}, }; static const struct FormChange sMiniorYellowFormChangeTable[] = { + {FORM_CHANGE_BEGIN_BATTLE, SPECIES_MINIOR_CORE_YELLOW}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_METEOR_YELLOW, ABILITY_SHIELDS_DOWN, HP_HIGHER_THAN, 50}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_CORE_YELLOW, ABILITY_SHIELDS_DOWN, HP_LOWER_EQ_THAN, 50}, {FORM_CHANGE_BATTLE_SWITCH, SPECIES_MINIOR_CORE_YELLOW}, @@ -994,10 +1209,19 @@ static const struct FormChange sMimikyuTotemFormChangeTable[] = { }; #endif //P_FAMILY_MIMIKYU +#if P_FAMILY_DRAMPA +static const struct FormChange sDrampaFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_DRAMPA_MEGA, ITEM_DRAMPANITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_DRAMPA + #if P_FAMILY_NECROZMA static const struct Fusion sNecrozmaFusionTable[] = { - {1, ITEM_N_SOLARIZER, SPECIES_NECROZMA, SPECIES_SOLGALEO, SPECIES_NECROZMA_DUSK_MANE, MOVE_SUNSTEEL_STRIKE, MOVE_CONFUSION}, - {2, ITEM_N_LUNARIZER, SPECIES_NECROZMA, SPECIES_LUNALA, SPECIES_NECROZMA_DAWN_WINGS, MOVE_MOONGEIST_BEAM, MOVE_CONFUSION}, + {1, ITEM_N_SOLARIZER, SPECIES_NECROZMA, SPECIES_SOLGALEO, SPECIES_NECROZMA_DUSK_MANE, MOVE_SUNSTEEL_STRIKE, FORGET_EXTRA_MOVES}, + {2, ITEM_N_LUNARIZER, SPECIES_NECROZMA, SPECIES_LUNALA, SPECIES_NECROZMA_DAWN_WINGS, MOVE_MOONGEIST_BEAM, FORGET_EXTRA_MOVES}, {FUSION_TERMINATOR}, }; @@ -1193,8 +1417,18 @@ static const struct FormChange sAlcremieFormChangeTable[] = }; #endif //P_FAMILY_MILCERY +#if P_FAMILY_FALINKS +static const struct FormChange sFalinksFormChangeTable[] = { +#if P_GEN_9_MEGA_EVOLUTIONS + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_FALINKS_MEGA, ITEM_FALINKSITE}, +#endif + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_FALINKS + #if P_FAMILY_EISCUE static const struct FormChange sEiscueFormChangeTable[] = { + {FORM_CHANGE_BATTLE_WEATHER, SPECIES_EISCUE_ICE, B_WEATHER_HAIL | B_WEATHER_SNOW, ABILITY_ICE_FACE}, {FORM_CHANGE_FAINT, SPECIES_EISCUE_ICE}, {FORM_CHANGE_END_BATTLE, SPECIES_EISCUE_ICE}, {FORM_CHANGE_TERMINATOR}, @@ -1264,8 +1498,8 @@ static const struct FormChange sUrshifuRapidStrikeFormChangeTable[] = { #if P_FAMILY_CALYREX static const struct Fusion sCalyrexFusionTable[] = { - {3, ITEM_REINS_OF_UNITY, SPECIES_CALYREX, SPECIES_GLASTRIER, SPECIES_CALYREX_ICE, MOVE_GLACIAL_LANCE, MOVE_CONFUSION}, - {3, ITEM_REINS_OF_UNITY, SPECIES_CALYREX, SPECIES_SPECTRIER, SPECIES_CALYREX_SHADOW, MOVE_ASTRAL_BARRAGE, MOVE_CONFUSION}, + {3, ITEM_REINS_OF_UNITY, SPECIES_CALYREX, SPECIES_GLASTRIER, SPECIES_CALYREX_ICE, MOVE_GLACIAL_LANCE, FORGET_EXTRA_MOVES}, + {3, ITEM_REINS_OF_UNITY, SPECIES_CALYREX, SPECIES_SPECTRIER, SPECIES_CALYREX_SHADOW, MOVE_ASTRAL_BARRAGE, FORGET_EXTRA_MOVES}, {FUSION_TERMINATOR}, }; #endif //P_FAMILY_CALYREX diff --git a/src/data/pokemon/form_species_tables.h b/src/data/pokemon/form_species_tables.h index 53ee47f933e6..ab703bc2d095 100644 --- a/src/data/pokemon/form_species_tables.h +++ b/src/data/pokemon/form_species_tables.h @@ -150,6 +150,16 @@ static const u16 sSandslashFormSpeciesIdTable[] = { }; #endif //P_FAMILY_SANDSHREW +#if P_FAMILY_CLEFAIRY +static const u16 sClefableFormSpeciesIdTable[] = { + SPECIES_CLEFABLE, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_CLEFABLE_MEGA, +#endif + FORM_SPECIES_END, +}; +#endif //P_FAMILY_CLEFAIRY + #if P_FAMILY_VULPIX static const u16 sVulpixFormSpeciesIdTable[] = { SPECIES_VULPIX, @@ -248,6 +258,16 @@ static const u16 sMachampFormSpeciesIdTable[] = { }; #endif //P_FAMILY_MACHOP +#if P_FAMILY_BELLSPROUT +static const u16 sVictreebelFormSpeciesIdTable[] = { + SPECIES_VICTREEBEL, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_VICTREEBEL_MEGA, +#endif + FORM_SPECIES_END, +}; +#endif //P_FAMILY_BELLSPROUT + #if P_FAMILY_GEODUDE static const u16 sGeodudeFormSpeciesIdTable[] = { SPECIES_GEODUDE, @@ -445,6 +465,16 @@ static const u16 sKangaskhanFormSpeciesIdTable[] = { }; #endif //P_FAMILY_KANGASKHAN +#if P_FAMILY_STARYU +static const u16 sStarmieFormSpeciesIdTable[] = { + SPECIES_STARMIE, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_STARMIE_MEGA, +#endif + FORM_SPECIES_END, +}; +#endif //P_FAMILY_STARYU + #if P_FAMILY_MR_MIME static const u16 sMrMimeFormSpeciesIdTable[] = { SPECIES_MR_MIME, @@ -570,6 +600,16 @@ static const u16 sMoltresFormSpeciesIdTable[] = { }; #endif //P_FAMILY_MOLTRES +#if P_FAMILY_DRATINI +static const u16 sDragoniteFormSpeciesIdTable[] = { + SPECIES_DRAGONITE, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_DRAGONITE_MEGA, +#endif + FORM_SPECIES_END, +}; +#endif //P_FAMILY_DRATINI + #if P_FAMILY_MEWTWO static const u16 sMewtwoFormSpeciesIdTable[] = { SPECIES_MEWTWO, @@ -581,6 +621,16 @@ static const u16 sMewtwoFormSpeciesIdTable[] = { }; #endif //P_FAMILY_MEWTWO +#if P_FAMILY_CHIKORITA +static const u16 sMeganiumFormSpeciesIdTable[] = { + SPECIES_MEGANIUM, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_MEGANIUM_MEGA, +#endif + FORM_SPECIES_END, +}; +#endif //P_FAMILY_CHIKORITA + #if P_FAMILY_CYNDAQUIL static const u16 sTyphlosionFormSpeciesIdTable[] = { SPECIES_TYPHLOSION, @@ -591,6 +641,16 @@ static const u16 sTyphlosionFormSpeciesIdTable[] = { }; #endif //P_FAMILY_CYNDAQUIL +#if P_FAMILY_TOTODILE +static const u16 sFeraligatrFormSpeciesIdTable[] = { + SPECIES_FERALIGATR, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_FERALIGATR_MEGA, +#endif + FORM_SPECIES_END, +}; +#endif //P_FAMILY_TOTODILE + #if P_FAMILY_MAREEP static const u16 sAmpharosFormSpeciesIdTable[] = { SPECIES_AMPHAROS, @@ -701,6 +761,16 @@ static const u16 sCorsolaFormSpeciesIdTable[] = { }; #endif //P_FAMILY_CORSOLA +#if P_FAMILY_SKARMORY +static const u16 sSkarmoryFormSpeciesIdTable[] = { + SPECIES_SKARMORY, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_SKARMORY_MEGA, +#endif + FORM_SPECIES_END, +}; +#endif //P_FAMILY_SKARMORY + #if P_FAMILY_HOUNDOUR static const u16 sHoundoomFormSpeciesIdTable[] = { SPECIES_HOUNDOOM, @@ -907,6 +977,14 @@ static const u16 sGlalieFormSpeciesIdTable[] = { #endif FORM_SPECIES_END, }; + +static const u16 sFroslassFormSpeciesIdTable[] = { + SPECIES_FROSLASS, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_FROSLASS_MEGA, +#endif + FORM_SPECIES_END, +}; #endif //P_FAMILY_SNORUNT #if P_FAMILY_BAGON @@ -1142,6 +1220,16 @@ static const u16 sArceusFormSpeciesIdTable[] = { }; #endif //P_FAMILY_ARCEUS +#if P_FAMILY_TEPIG +static const u16 sEmboarFormSpeciesIdTable[] = { + SPECIES_EMBOAR, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_EMBOAR_MEGA, +#endif + FORM_SPECIES_END, +}; +#endif //P_FAMILY_TEPIG + #if P_FAMILY_OSHAWOTT static const u16 sSamurottFormSpeciesIdTable[] = { SPECIES_SAMUROTT, @@ -1152,6 +1240,16 @@ static const u16 sSamurottFormSpeciesIdTable[] = { }; #endif //P_FAMILY_OSHAWOTT +#if P_FAMILY_DRILBUR +static const u16 sExcadrillFormSpeciesIdTable[] = { + SPECIES_EXCADRILL, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_EXCADRILL_MEGA, +#endif + FORM_SPECIES_END, +}; +#endif //P_FAMILY_DRILBUR + #if P_FAMILY_AUDINO static const u16 sAudinoFormSpeciesIdTable[] = { SPECIES_AUDINO, @@ -1162,6 +1260,16 @@ static const u16 sAudinoFormSpeciesIdTable[] = { }; #endif //P_FAMILY_AUDINO +#if P_FAMILY_VENIPEDE +static const u16 sScolipedeFormSpeciesIdTable[] = { + SPECIES_SCOLIPEDE, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_SCOLIPEDE_MEGA, +#endif + FORM_SPECIES_END, +}; +#endif //P_FAMILY_VENIPEDE + #if P_FAMILY_PETILIL static const u16 sLilligantFormSpeciesIdTable[] = { SPECIES_LILLIGANT, @@ -1207,6 +1315,16 @@ static const u16 sDarmanitanFormSpeciesIdTable[] = { }; #endif //P_FAMILY_DARUMAKA +#if P_FAMILY_SCRAGGY +static const u16 sScraftyFormSpeciesIdTable[] = { + SPECIES_SCRAFTY, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_SCRAFTY_MEGA, +#endif + FORM_SPECIES_END, +}; +#endif //P_FAMILY_SCRAGGY + #if P_FAMILY_YAMASK static const u16 sYamaskFormSpeciesIdTable[] = { SPECIES_YAMASK, @@ -1263,6 +1381,26 @@ static const u16 sSawsbuckFormSpeciesIdTable[] = { }; #endif //P_FAMILY_DEERLING +#if P_FAMILY_TYNAMO +static const u16 sEelektrossFormSpeciesIdTable[] = { + SPECIES_EELEKTROSS, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_EELEKTROSS_MEGA, +#endif + FORM_SPECIES_END, +}; +#endif //P_FAMILY_TYNAMO + +#if P_FAMILY_LITWICK +static const u16 sChandelureFormSpeciesIdTable[] = { + SPECIES_CHANDELURE, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_CHANDELURE_MEGA, +#endif + FORM_SPECIES_END, +}; +#endif //P_FAMILY_LITWICK + #if P_FAMILY_STUNFISK static const u16 sStunfiskFormSpeciesIdTable[] = { SPECIES_STUNFISK, @@ -1343,11 +1481,34 @@ static const u16 sGenesectFormSpeciesIdTable[] = { }; #endif //P_FAMILY_GENESECT +#if P_FAMILY_CHESPIN +static const u16 sChesnaughtFormSpeciesIdTable[] = { + SPECIES_CHESNAUGHT, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_CHESNAUGHT_MEGA, +#endif + FORM_SPECIES_END, +}; +#endif //P_FAMILY_CHESPIN + +#if P_FAMILY_FENNEKIN +static const u16 sDelphoxFormSpeciesIdTable[] = { + SPECIES_DELPHOX, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_DELPHOX_MEGA, +#endif + FORM_SPECIES_END, +}; +#endif //P_FAMILY_FENNEKIN + #if P_FAMILY_FROAKIE static const u16 sGreninjaFormSpeciesIdTable[] = { SPECIES_GRENINJA, SPECIES_GRENINJA_BATTLE_BOND, SPECIES_GRENINJA_ASH, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_GRENINJA_MEGA, +#endif FORM_SPECIES_END, }; #endif //P_FAMILY_FROAKIE @@ -1426,6 +1587,16 @@ static const u16 sVivillonFormSpeciesIdTable[] = { }; #endif //P_FAMILY_SCATTERBUG +#if P_FAMILY_LITLEO +static const u16 sPyroarFormSpeciesIdTable[] = { + SPECIES_PYROAR, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_PYROAR_MEGA, +#endif + FORM_SPECIES_END, +}; +#endif //P_FAMILY_LITLEO + #if P_FAMILY_FLABEBE static const u16 sFlabebeFormSpeciesIdTable[] = { SPECIES_FLABEBE_RED, @@ -1443,6 +1614,9 @@ static const u16 sFloetteFormSpeciesIdTable[] = { SPECIES_FLOETTE_BLUE, SPECIES_FLOETTE_WHITE, SPECIES_FLOETTE_ETERNAL, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_FLOETTE_MEGA, +#endif FORM_SPECIES_END, }; @@ -1488,6 +1662,46 @@ static const u16 sAegislashFormSpeciesIdTable[] = { }; #endif //P_FAMILY_HONEDGE +#if P_FAMILY_INKAY +static const u16 sMalamarFormSpeciesIdTable[] = { + SPECIES_MALAMAR, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_MALAMAR_MEGA, +#endif + FORM_SPECIES_END, +}; +#endif //P_FAMILY_INKAY + +#if P_FAMILY_BINACLE +static const u16 sBarbaracleFormSpeciesIdTable[] = { + SPECIES_BARBARACLE, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_BARBARACLE_MEGA, +#endif + FORM_SPECIES_END, +}; +#endif //P_FAMILY_BINACLE + +#if P_FAMILY_SKRELP +static const u16 sDragalgeFormSpeciesIdTable[] = { + SPECIES_DRAGALGE, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_DRAGALGE_MEGA, +#endif + FORM_SPECIES_END, +}; +#endif //P_FAMILY_SKRELP + +#if P_FAMILY_HAWLUCHA +static const u16 sHawluchaFormSpeciesIdTable[] = { + SPECIES_HAWLUCHA, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_HAWLUCHA_MEGA, +#endif + FORM_SPECIES_END, +}; +#endif //P_FAMILY_HAWLUCHA + #if P_FAMILY_GOOMY static const u16 sSliggooFormSpeciesIdTable[] = { SPECIES_SLIGGOO, @@ -1549,6 +1763,9 @@ static const u16 sZygardeFormSpeciesIdTable[] = { SPECIES_ZYGARDE_10_POWER_CONSTRUCT, SPECIES_ZYGARDE_50_POWER_CONSTRUCT, SPECIES_ZYGARDE_COMPLETE, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_ZYGARDE_MEGA, +#endif FORM_SPECIES_END, }; #endif //P_FAMILY_ZYGARDE @@ -1724,6 +1941,16 @@ static const u16 sMimikyuFormSpeciesIdTable[] = { }; #endif //P_FAMILY_MIMIKYU +#if P_FAMILY_DRAMPA +static const u16 sDrampaFormSpeciesIdTable[] = { + SPECIES_DRAMPA, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_DRAMPA_MEGA, +#endif + FORM_SPECIES_END, +}; +#endif //P_FAMILY_DRAMPA + #if P_FAMILY_JANGMO_O static const u16 sKommoOFormSpeciesIdTable[] = { SPECIES_KOMMO_O, @@ -1999,6 +2226,16 @@ static const u16 sAlcremieFormSpeciesIdTable[] = { }; #endif //P_FAMILY_MILCERY +#if P_FAMILY_FALINKS +static const u16 sFalinksFormSpeciesIdTable[] = { + SPECIES_FALINKS, +#if P_GEN_9_MEGA_EVOLUTIONS + SPECIES_FALINKS_MEGA, +#endif + FORM_SPECIES_END, +}; +#endif //P_FAMILY_FALINKS + #if P_FAMILY_EISCUE static const u16 sEiscueFormSpeciesIdTable[] = { SPECIES_EISCUE_ICE, diff --git a/src/data/pokemon/item_effects.h b/src/data/pokemon/item_effects.h index 93ff78ad7c12..851424021f5a 100644 --- a/src/data/pokemon/item_effects.h +++ b/src/data/pokemon/item_effects.h @@ -334,14 +334,8 @@ const u8 gItemEffect_PPMax[9] = { VITAMIN_FRIENDSHIP_CHANGE(6), }; -#define STAT_BOOST_FRIENDSHIP_CHANGE \ - [6] = 1, /* Friendship change, low */ \ - [7] = 1 /* Friendship change, mid */ - const u8 gItemEffect_GuardSpec[8] = { [3] = ITEM3_GUARD_SPEC, - [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - STAT_BOOST_FRIENDSHIP_CHANGE, }; // The first item effect value for the stat boost items @@ -350,44 +344,30 @@ const u8 gItemEffect_GuardSpec[8] = { const u8 gItemEffect_DireHit[8] = { [0] = 1 << 5, // ITEM0_DIRE_HIT - [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - STAT_BOOST_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_XAttack[8] = { [1] = ITEM1_X_ATTACK, - [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - STAT_BOOST_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_XDefense[8] = { [1] = ITEM1_X_DEFENSE, - [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - STAT_BOOST_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_XSpeed[8] = { [1] = ITEM1_X_SPEED, - [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - STAT_BOOST_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_XAccuracy[8] = { [1] = ITEM1_X_ACCURACY, - [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - STAT_BOOST_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_XSpecialAttack[8] = { [1] = ITEM1_X_SPATK, - [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - STAT_BOOST_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_XSpecialDefense[8] = { [1] = ITEM1_X_SPDEF, - [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - STAT_BOOST_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_EvoItem[6] = { diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index 70165414ba37..aab42559cbf9 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -200,12 +200,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Venusaur, .iconSprite = gMonIcon_Venusaur, .iconPalIndex = P_GBA_STYLE_SPECIES_ICONS ? 1 : 4, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_VenusaurF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 64), .backPicFemale = gMonBackPic_VenusaurF, .backPicSizeFemale = MON_COORDS_SIZE(64, 48), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(2, 6, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Venusaur) @@ -1336,12 +1336,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Butterfree, .iconSprite = gMonIcon_Butterfree, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_ButterfreeF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 56), .backPicFemale = gMonBackPic_ButterfreeF, .backPicSizeFemale = MON_COORDS_SIZE(64, 56), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-3, 13, SHADOW_SIZE_S) FOOTPRINT(Butterfree) @@ -2100,12 +2100,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Rattata, .iconSprite = gMonIcon_Rattata, .iconPalIndex = 2, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_RattataF, .frontPicSizeFemale = MON_COORDS_SIZE(40, 40), .backPicFemale = gMonBackPic_RattataF, .backPicSizeFemale = MON_COORDS_SIZE(64, 56), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_FAST, SHADOW(1, -3, SHADOW_SIZE_S) FOOTPRINT(Rattata) @@ -2192,12 +2192,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Raticate, .iconSprite = gMonIcon_Raticate, .iconPalIndex = P_GBA_STYLE_SPECIES_ICONS ? 1 : 2, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_RaticateF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 56), .backPicFemale = gMonBackPic_RaticateF, .backPicSizeFemale = MON_COORDS_SIZE(64, 48), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_FAST, SHADOW(0, 8, SHADOW_SIZE_L) FOOTPRINT(Raticate) @@ -2916,7 +2916,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Pikachu, .iconSprite = gMonIcon_Pikachu, .iconPalIndex = 2, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_PikachuF, .frontPicSizeFemale = MON_COORDS_SIZE(48, 48), .backPicFemale = gMonBackPic_PikachuF, @@ -2925,7 +2925,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconSpriteFemale = gMonIcon_PikachuF, .iconPalIndexFemale = 2, #endif //P_CUSTOM_GENDER_DIFF_ICONS -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NORMAL, SHADOW(-3, 5, SHADOW_SIZE_M) OVERWORLD( @@ -2949,8 +2949,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .teachableLearnset = sPikachuTeachableLearnset, .formSpeciesIdTable = sPikachuFormSpeciesIdTable, .formChangeTable = sPikachuFormChangeTable, - .evolutions = EVOLUTION({EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU}, - {EVO_NONE, 0, SPECIES_RAICHU_ALOLA}), + .evolutions = EVOLUTION({EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU, CONDITIONS({IF_NOT_REGION, REGION_ALOLA})}, + {EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU_ALOLA, CONDITIONS({IF_REGION, REGION_ALOLA})}), }, #if P_COSPLAY_PIKACHU_FORMS @@ -5001,7 +5001,96 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sClefableLevelUpLearnset, .teachableLearnset = sClefableTeachableLearnset, + .formSpeciesIdTable = sClefableFormSpeciesIdTable, + .formChangeTable = sClefableFormChangeTable, + }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_CLEFABLE_MEGA] = + { + .baseHP = 95, + .baseAttack = 80, + .baseDefense = 93, + .baseSpeed = 70, + .baseSpAttack = 135, + .baseSpDefense = 110, + .types = MON_TYPES(TYPE_FAIRY, TYPE_FLYING), + .catchRate = 25, + #if P_UPDATED_EXP_YIELDS >= GEN_8 + .expYield = 242, + #elif P_UPDATED_EXP_YIELDS >= GEN_7 + .expYield = 217, + #elif P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 213, + #else + .expYield = 129, + #endif + .evYield_HP = 3, + .itemRare = ITEM_MOON_STONE, + .genderRatio = PERCENT_FEMALE(75), + .eggCycles = 10, + .friendship = 140, + .growthRate = GROWTH_FAST, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FAIRY), + #if P_UPDATED_ABILITIES >= GEN_4 + .abilities = { ABILITY_CUTE_CHARM, ABILITY_MAGIC_GUARD, ABILITY_UNAWARE }, + #else + .abilities = { ABILITY_CUTE_CHARM, ABILITY_NONE, ABILITY_UNAWARE }, + #endif + .bodyColor = BODY_COLOR_PINK, + .speciesName = _("Clefable"), + .cryId = CRY_CLEFABLE, // CRY_CLEFABLE_MEGA, + .natDexNum = NATIONAL_DEX_CLEFABLE, + .categoryName = _("Fairy"), + .height = 17, + .weight = 423, + .description = COMPOUND_STRING( + "It flies by using the power of\n" + "moonlight to control gravity within\n" + "a radius of over 32 feet around it."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sClefableLevelUpLearnset, + .teachableLearnset = sClefableTeachableLearnset, + .formSpeciesIdTable = sClefableFormSpeciesIdTable, + .formChangeTable = sClefableFormChangeTable, }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_CLEFAIRY #if P_FAMILY_VULPIX @@ -5604,12 +5693,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Zubat, .iconSprite = gMonIcon_Zubat, .iconPalIndex = 2, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_ZubatF, .frontPicSizeFemale = MON_COORDS_SIZE(56, 48), .backPicFemale = gMonBackPic_ZubatF, .backPicSizeFemale = MON_COORDS_SIZE(56, 56), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-4, 11, SHADOW_SIZE_S) FOOTPRINT(Zubat) @@ -5703,12 +5792,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Golbat, .iconSprite = gMonIcon_Golbat, .iconPalIndex = 2, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_GolbatF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 56), .backPicFemale = gMonBackPic_GolbatF, .backPicSizeFemale = MON_COORDS_SIZE(56, 40), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(2, 14, SHADOW_SIZE_M) FOOTPRINT(Golbat) @@ -5730,7 +5819,9 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sGolbatLevelUpLearnset, .teachableLearnset = sGolbatTeachableLearnset, + #if P_GEN_2_CROSS_EVOS .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_CROBAT, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), + #endif }, #if P_GEN_2_CROSS_EVOS @@ -5952,12 +6043,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Gloom, .iconSprite = gMonIcon_Gloom, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_GloomF, .frontPicSizeFemale = MON_COORDS_SIZE(56, 48), .backPicFemale = gMonBackPic_GloomF, .backPicSizeFemale = MON_COORDS_SIZE(64, 48), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-1, 3, SHADOW_SIZE_M) FOOTPRINT(Gloom) @@ -5979,8 +6070,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sGloomLevelUpLearnset, .teachableLearnset = sGloomTeachableLearnset, - .evolutions = EVOLUTION({EVO_ITEM, ITEM_LEAF_STONE, SPECIES_VILEPLUME}, - {EVO_ITEM, ITEM_SUN_STONE, SPECIES_BELLOSSOM}), + .evolutions = EVOLUTION({EVO_ITEM, ITEM_LEAF_STONE, SPECIES_VILEPLUME} + #if P_GEN_2_CROSS_EVOS + ,{EVO_ITEM, ITEM_SUN_STONE, SPECIES_BELLOSSOM} + #endif + ), }, [SPECIES_VILEPLUME] = @@ -6042,12 +6136,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Vileplume, .iconSprite = gMonIcon_Vileplume, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_VileplumeF, .frontPicSizeFemale = MON_COORDS_SIZE(56, 56), .backPicFemale = gMonBackPic_VileplumeF, .backPicSizeFemale = MON_COORDS_SIZE(64, 56), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-1, 7, SHADOW_SIZE_L) FOOTPRINT(Vileplume) @@ -7577,7 +7671,9 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sPrimeapeLevelUpLearnset, .teachableLearnset = sPrimeapeTeachableLearnset, + #if P_GEN_9_CROSS_EVOS .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_ANNIHILAPE, CONDITIONS({IF_USED_MOVE_X_TIMES, MOVE_RAGE_FIST, 20})}), + #endif }, #if P_GEN_9_CROSS_EVOS @@ -8064,9 +8160,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sPoliwhirlLevelUpLearnset, .teachableLearnset = sPoliwhirlTeachableLearnset, - .evolutions = EVOLUTION({EVO_ITEM, ITEM_WATER_STONE, SPECIES_POLIWRATH}, - {EVO_TRADE, 0, SPECIES_POLITOED, CONDITIONS({IF_HOLD_ITEM, ITEM_KINGS_ROCK})}, - {EVO_ITEM, ITEM_KINGS_ROCK, SPECIES_POLITOED}), + .evolutions = EVOLUTION({EVO_ITEM, ITEM_WATER_STONE, SPECIES_POLIWRATH} + #if P_GEN_2_CROSS_EVOS + ,{EVO_TRADE, 0, SPECIES_POLITOED, CONDITIONS({IF_HOLD_ITEM, ITEM_KINGS_ROCK})}, + {EVO_ITEM, ITEM_KINGS_ROCK, SPECIES_POLITOED} + #endif + ), }, [SPECIES_POLIWRATH] = @@ -8209,12 +8308,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Politoed, .iconSprite = gMonIcon_Politoed, .iconPalIndex = 1, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_PolitoedF, .frontPicSizeFemale = MON_COORDS_SIZE(48, 56), .backPicFemale = gMonBackPic_PolitoedF, .backPicSizeFemale = MON_COORDS_SIZE(56, 56), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(1, 9, SHADOW_SIZE_M) FOOTPRINT(Politoed) @@ -8372,12 +8471,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Kadabra, .iconSprite = gMonIcon_Kadabra, .iconPalIndex = 2, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_KadabraF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 56), .backPicFemale = gMonBackPic_KadabraF, .backPicSizeFemale = MON_COORDS_SIZE(64, 48), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(1, 6, SHADOW_SIZE_L) FOOTPRINT(Kadabra) @@ -8471,12 +8570,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Alakazam, .iconSprite = gMonIcon_Alakazam, .iconPalIndex = 2, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_AlakazamF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 64), .backPicFemale = gMonBackPic_AlakazamF, .backPicSizeFemale = MON_COORDS_SIZE(64, 56), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-1, 9, SHADOW_SIZE_L) FOOTPRINT(Alakazam) @@ -9111,7 +9210,92 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sVictreebelLevelUpLearnset, .teachableLearnset = sVictreebelTeachableLearnset, + .formSpeciesIdTable = sVictreebelFormSpeciesIdTable, + .formChangeTable = sVictreebelFormChangeTable, + }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_VICTREEBEL_MEGA] = + { + .baseHP = 80, + .baseAttack = 125, + .baseDefense = 85, + .baseSpeed = 70, + .baseSpAttack = 135, + .baseSpDefense = 95, + .types = MON_TYPES(TYPE_GRASS, TYPE_POISON), + .catchRate = 45, + #if P_UPDATED_EXP_YIELDS >= GEN_8 + .expYield = 245, + #elif P_UPDATED_EXP_YIELDS >= GEN_7 + .expYield = 221, + #elif P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 216, + #else + .expYield = 191, + #endif + .evYield_Attack = 3, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_GRASS), + .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE, ABILITY_GLUTTONY }, + .bodyColor = BODY_COLOR_GREEN, + .speciesName = _("Victreebel"), + .cryId = CRY_VICTREEBEL, // CRY_VICTREEBEL_MEGA, + .natDexNum = NATIONAL_DEX_VICTREEBEL, + .categoryName = _("Flycatcher"), + .height = 45, + .weight = 1255, + .description = COMPOUND_STRING( + "The volume of this PokΓ©mon's acid\n" + "has increased due to Mega Evolution,\n" + "filling its mouth. If not careful,\n" + "the acid will overflow and spill out."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sVictreebelLevelUpLearnset, + .teachableLearnset = sVictreebelTeachableLearnset, + .formSpeciesIdTable = sVictreebelFormSpeciesIdTable, + .formChangeTable = sVictreebelFormChangeTable, }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_BELLSPROUT #if P_FAMILY_TENTACOOL @@ -10045,9 +10229,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .teachableLearnset = sSlowpokeTeachableLearnset, .eggMoveLearnset = sSlowpokeEggMoveLearnset, .formSpeciesIdTable = sSlowpokeFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL, 37, SPECIES_SLOWBRO}, - {EVO_TRADE, 0, SPECIES_SLOWKING, CONDITIONS({IF_HOLD_ITEM, ITEM_KINGS_ROCK})}, - {EVO_ITEM, ITEM_KINGS_ROCK, SPECIES_SLOWKING}), + .evolutions = EVOLUTION({EVO_LEVEL, 37, SPECIES_SLOWBRO} + #if P_GEN_2_CROSS_EVOS + ,{EVO_TRADE, 0, SPECIES_SLOWKING, CONDITIONS({IF_HOLD_ITEM, ITEM_KINGS_ROCK})}, + {EVO_ITEM, ITEM_KINGS_ROCK, SPECIES_SLOWKING} + #endif + ), }, [SPECIES_SLOWBRO] = @@ -10326,8 +10513,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .teachableLearnset = sSlowpokeGalarTeachableLearnset, .eggMoveLearnset = sSlowpokeGalarEggMoveLearnset, .formSpeciesIdTable = sSlowpokeFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_ITEM, ITEM_GALARICA_CUFF, SPECIES_SLOWBRO_GALAR}, - {EVO_ITEM, ITEM_GALARICA_WREATH, SPECIES_SLOWKING_GALAR}), + .evolutions = EVOLUTION({EVO_ITEM, ITEM_GALARICA_CUFF, SPECIES_SLOWBRO_GALAR} + #if P_GEN_2_CROSS_EVOS + ,{EVO_ITEM, ITEM_GALARICA_WREATH, SPECIES_SLOWKING_GALAR} + #endif + ), }, [SPECIES_SLOWBRO_GALAR] = @@ -10609,8 +10799,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sMagnetonLevelUpLearnset, .teachableLearnset = sMagnetonTeachableLearnset, + #if P_GEN_4_CROSS_EVOS .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_MAGNEZONE, CONDITIONS({IF_IN_MAPSEC, MAPSEC_NEW_MAUVILLE})}, {EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_MAGNEZONE}), + #endif }, #if P_GEN_4_CROSS_EVOS @@ -10973,12 +11165,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Doduo, .iconSprite = gMonIcon_Doduo, .iconPalIndex = 2, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_DoduoF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 56), .backPicFemale = gMonBackPic_DoduoF, .backPicSizeFemale = MON_COORDS_SIZE(64, 56), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(6, 5, SHADOW_SIZE_M) FOOTPRINT(Doduo) @@ -11066,12 +11258,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Dodrio, .iconSprite = gMonIcon_Dodrio, .iconPalIndex = 2, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_DodrioF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 64), .backPicFemale = gMonBackPic_DodrioF, .backPicSizeFemale = MON_COORDS_SIZE(64, 64), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(3, 12, SHADOW_SIZE_L) FOOTPRINT(Dodrio) @@ -12107,8 +12299,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sOnixLevelUpLearnset, .teachableLearnset = sOnixTeachableLearnset, .eggMoveLearnset = sOnixEggMoveLearnset, + #if P_GEN_2_CROSS_EVOS .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_STEELIX, CONDITIONS({IF_HOLD_ITEM, ITEM_METAL_COAT})}, {EVO_ITEM, ITEM_METAL_COAT, SPECIES_STEELIX}), + #endif }, #if P_GEN_2_CROSS_EVOS @@ -12167,12 +12361,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Steelix, .iconSprite = gMonIcon_Steelix, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_SteelixF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 64), .backPicFemale = gMonBackPic_SteelixF, .backPicSizeFemale = MON_COORDS_SIZE(64, 64), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(2, 12, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Steelix) @@ -12409,12 +12603,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Hypno, .iconSprite = gMonIcon_Hypno, .iconPalIndex = P_GBA_STYLE_SPECIES_ICONS ? 1 : 2, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_HypnoF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 64), .backPicFemale = gMonBackPic_HypnoF, .backPicSizeFemale = MON_COORDS_SIZE(64, 56), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-3, 9, SHADOW_SIZE_L) FOOTPRINT(Hypno) @@ -12502,7 +12696,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, - sAnimTable_Following, + sAnimTable_Following_Asym, gOverworldPalette_Krabby, gShinyOverworldPalette_Krabby ) @@ -12572,7 +12766,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, - sAnimTable_Following, + sAnimTable_Following_Asym, gOverworldPalette_Kingler, gShinyOverworldPalette_Kingler ) @@ -12821,7 +13015,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .height = 5, .weight = 130, .description = COMPOUND_STRING( - "It esembles an ancient PokΓ© Ball design.\n" + "It resembles an ancient PokΓ© Ball design.\n" "When excited, it discharges the electric\n" "current it has stored in its belly, then\n" "lets out a great, uproarious laugh."), @@ -13002,8 +13196,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sExeggcuteLevelUpLearnset, .teachableLearnset = sExeggcuteTeachableLearnset, .eggMoveLearnset = sExeggcuteEggMoveLearnset, - .evolutions = EVOLUTION({EVO_ITEM, ITEM_LEAF_STONE, SPECIES_EXEGGUTOR}, - {EVO_NONE, 0, SPECIES_EXEGGUTOR_ALOLA}), + .evolutions = EVOLUTION({EVO_ITEM, ITEM_LEAF_STONE, SPECIES_EXEGGUTOR, CONDITIONS({IF_NOT_REGION, REGION_ALOLA})}, + {EVO_ITEM, ITEM_LEAF_STONE, SPECIES_EXEGGUTOR_ALOLA, CONDITIONS({IF_REGION, REGION_ALOLA})}), }, #if P_UPDATED_EXP_YIELDS >= GEN_7 @@ -13229,8 +13423,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sCuboneLevelUpLearnset, .teachableLearnset = sCuboneTeachableLearnset, .eggMoveLearnset = sCuboneEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 28, SPECIES_MAROWAK}, - {EVO_NONE, 0, SPECIES_MAROWAK_ALOLA}, + .evolutions = EVOLUTION({EVO_LEVEL, 28, SPECIES_MAROWAK, CONDITIONS({IF_NOT_REGION, REGION_ALOLA})}, + {EVO_LEVEL, 28, SPECIES_MAROWAK_ALOLA, CONDITIONS({IF_REGION, REGION_ALOLA}, {IF_TIME, TIME_NIGHT})}, {EVO_NONE, 0, SPECIES_MAROWAK_ALOLA_TOTEM}), }, @@ -13805,7 +13999,9 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sLickitungLevelUpLearnset, .teachableLearnset = sLickitungTeachableLearnset, .eggMoveLearnset = sLickitungEggMoveLearnset, + #if P_GEN_4_CROSS_EVOS .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_LICKILICKY, CONDITIONS({IF_KNOWS_MOVE, MOVE_ROLLOUT})}), + #endif }, #if P_GEN_4_CROSS_EVOS @@ -13960,8 +14156,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sKoffingLevelUpLearnset, .teachableLearnset = sKoffingTeachableLearnset, .eggMoveLearnset = sKoffingEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 35, SPECIES_WEEZING}, - {EVO_NONE, 0, SPECIES_WEEZING_GALAR}), + .evolutions = EVOLUTION({EVO_LEVEL, 35, SPECIES_WEEZING, CONDITIONS({IF_NOT_REGION, REGION_GALAR})}, + {EVO_LEVEL, 35, SPECIES_WEEZING_GALAR, CONDITIONS({IF_REGION, REGION_GALAR})}), }, [SPECIES_WEEZING] = @@ -14166,12 +14362,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Rhyhorn, .iconSprite = gMonIcon_Rhyhorn, .iconPalIndex = 1, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_RhyhornF, .frontPicSizeFemale = MON_COORDS_SIZE(56, 40), .backPicFemale = gMonBackPic_RhyhornF, .backPicSizeFemale = MON_COORDS_SIZE(64, 48), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(0, 0, SHADOW_SIZE_L) FOOTPRINT(Rhyhorn) @@ -14247,12 +14443,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Rhydon, .iconSprite = gMonIcon_Rhydon, .iconPalIndex = 1, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_RhydonF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 56), .backPicFemale = gMonBackPic_RhydonF, .backPicSizeFemale = MON_COORDS_SIZE(64, 56), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(3, 9, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Rhydon) @@ -14274,8 +14470,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sRhydonLevelUpLearnset, .teachableLearnset = sRhydonTeachableLearnset, + #if P_GEN_4_CROSS_EVOS .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_RHYPERIOR, CONDITIONS({IF_HOLD_ITEM, ITEM_PROTECTOR})}, {EVO_ITEM, ITEM_PROTECTOR, SPECIES_RHYPERIOR}), + #endif }, #if P_GEN_4_CROSS_EVOS @@ -14510,7 +14708,9 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sChanseyLevelUpLearnset, .teachableLearnset = sChanseyTeachableLearnset, .eggMoveLearnset = sChanseyEggMoveLearnset, + #if P_GEN_2_CROSS_EVOS .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_BLISSEY, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), + #endif }, #if P_GEN_2_CROSS_EVOS @@ -14655,7 +14855,9 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sTangelaLevelUpLearnset, .teachableLearnset = sTangelaTeachableLearnset, .eggMoveLearnset = sTangelaEggMoveLearnset, + #if P_GEN_4_CROSS_EVOS .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_TANGROWTH, CONDITIONS({IF_KNOWS_MOVE, MOVE_ANCIENT_POWER})}), + #endif }, #if P_GEN_4_CROSS_EVOS @@ -15037,8 +15239,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sSeadraLevelUpLearnset, .teachableLearnset = sSeadraTeachableLearnset, + #if P_GEN_2_CROSS_EVOS .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_KINGDRA, CONDITIONS({IF_HOLD_ITEM, ITEM_DRAGON_SCALE})}, {EVO_ITEM, ITEM_DRAGON_SCALE, SPECIES_KINGDRA}), + #endif }, #if P_GEN_2_CROSS_EVOS @@ -15185,12 +15389,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Goldeen, .iconSprite = gMonIcon_Goldeen, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_GoldeenF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 40), .backPicFemale = gMonBackPic_GoldeenF, .backPicSizeFemale = MON_COORDS_SIZE(64, 48), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-6, 0, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Goldeen) @@ -15270,12 +15474,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Seaking, .iconSprite = gMonIcon_Seaking, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_SeakingF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 56), .backPicFemale = gMonBackPic_SeakingF, .backPicSizeFemale = MON_COORDS_SIZE(64, 56), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(0, 8, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Seaking) @@ -15443,7 +15647,86 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sStarmieLevelUpLearnset, .teachableLearnset = sStarmieTeachableLearnset, + .formSpeciesIdTable = sStarmieFormSpeciesIdTable, + .formChangeTable = sStarmieFormChangeTable, }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_STARMIE_MEGA] = + { + .baseHP = 60, + .baseAttack = 140, + .baseDefense = 105, + .baseSpeed = 120, + .baseSpAttack = 130, + .baseSpDefense = 105, + .types = MON_TYPES(TYPE_WATER, TYPE_PSYCHIC), + .catchRate = 60, + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 182 : 207, + .evYield_Speed = 2, + .itemCommon = ITEM_STARDUST, + .itemRare = ITEM_STAR_PIECE, + .genderRatio = MON_GENDERLESS, + .eggCycles = 20, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_SLOW, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_WATER_3), + .abilities = { ABILITY_ILLUMINATE, ABILITY_NATURAL_CURE, ABILITY_ANALYTIC }, + .bodyColor = BODY_COLOR_PURPLE, + .speciesName = _("Starmie"), + .cryId = CRY_STARMIE, // CRY_STARMIE_MEGA, + .natDexNum = NATIONAL_DEX_STARMIE, + .categoryName = _("Mysterious"), + .height = 23, + .weight = 800, + .description = COMPOUND_STRING( + "Its movements have become more\n" + "humanlike. Whether it's simply\n" + "trying to communicate or wants to\n" + "supplant humanity is unclear."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sStarmieLevelUpLearnset, + .teachableLearnset = sStarmieTeachableLearnset, + .formSpeciesIdTable = sStarmieFormSpeciesIdTable, + .formChangeTable = sStarmieFormChangeTable, + }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_STARYU #if P_FAMILY_MR_MIME @@ -15525,8 +15808,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sMimeJrLevelUpLearnset, .teachableLearnset = sMimeJrTeachableLearnset, .eggMoveLearnset = sMimeJrEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_MR_MIME, CONDITIONS({IF_KNOWS_MOVE, MOVE_MIMIC})}, - {EVO_NONE, 0, SPECIES_MR_MIME_GALAR}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_MR_MIME, CONDITIONS({IF_KNOWS_MOVE, MOVE_MIMIC}, {IF_NOT_REGION, REGION_GALAR})}, + {EVO_LEVEL, 0, SPECIES_MR_MIME_GALAR, CONDITIONS({IF_KNOWS_MOVE, MOVE_MIMIC}, {IF_REGION, REGION_GALAR})}), }, #endif //P_GEN_4_CROSS_EVOS @@ -15826,9 +16109,20 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sScytherLevelUpLearnset, .teachableLearnset = sScytherTeachableLearnset, .eggMoveLearnset = sScytherEggMoveLearnset, - .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_SCIZOR, CONDITIONS({IF_HOLD_ITEM, ITEM_METAL_COAT})}, - {EVO_ITEM, ITEM_BLACK_AUGURITE, SPECIES_KLEAVOR}, - {EVO_ITEM, ITEM_METAL_COAT, SPECIES_SCIZOR}), + #if P_GEN_2_CROSS_EVOS || P_GEN_8_CROSS_EVOS + .evolutions = EVOLUTION( + #if P_GEN_2_CROSS_EVOS + {EVO_TRADE, 0, SPECIES_SCIZOR, CONDITIONS({IF_HOLD_ITEM, ITEM_METAL_COAT})}, + {EVO_ITEM, ITEM_METAL_COAT, SPECIES_SCIZOR} + #if P_GEN_8_CROSS_EVOS + , + #endif + #endif + #if P_GEN_8_CROSS_EVOS + {EVO_ITEM, ITEM_BLACK_AUGURITE, SPECIES_KLEAVOR} + #endif + ), + #endif }, #if P_GEN_2_CROSS_EVOS @@ -16346,8 +16640,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sElectabuzzLevelUpLearnset, .teachableLearnset = sElectabuzzTeachableLearnset, + #if P_GEN_4_CROSS_EVOS .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_ELECTIVIRE, CONDITIONS({IF_HOLD_ITEM, ITEM_ELECTIRIZER})}, {EVO_ITEM, ITEM_ELECTIRIZER, SPECIES_ELECTIVIRE}), + #endif }, #if P_GEN_4_CROSS_EVOS @@ -16567,8 +16863,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sMagmarLevelUpLearnset, .teachableLearnset = sMagmarTeachableLearnset, + #if P_GEN_4_CROSS_EVOS .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_MAGMORTAR, CONDITIONS({IF_HOLD_ITEM, ITEM_MAGMARIZER})}, {EVO_ITEM, ITEM_MAGMARIZER, SPECIES_MAGMORTAR}), + #endif }, #if P_GEN_4_CROSS_EVOS @@ -17133,12 +17431,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Magikarp, .iconSprite = gMonIcon_Magikarp, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_MagikarpF, .frontPicSizeFemale = MON_COORDS_SIZE(48, 56), .backPicFemale = gMonBackPic_MagikarpF, .backPicSizeFemale = MON_COORDS_SIZE(64, 56), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(1, 7, SHADOW_SIZE_M) FOOTPRINT(Magikarp) @@ -17215,12 +17513,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Gyarados, .iconSprite = gMonIcon_Gyarados, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_GyaradosF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 64), .backPicFemale = gMonBackPic_GyaradosF, .backPicSizeFemale = MON_COORDS_SIZE(64, 64), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(5, 9, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Gyarados) @@ -17577,12 +17875,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Eevee, .iconSprite = gMonIcon_Eevee, .iconPalIndex = 2, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_EeveeF, .frontPicSizeFemale = MON_COORDS_SIZE(40, 48), .backPicFemale = gMonBackPic_EeveeF, .backPicSizeFemale = MON_COORDS_SIZE(56, 48), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NORMAL, SHADOW(-2, 2, SHADOW_SIZE_S) FOOTPRINT(Eevee) @@ -17609,14 +17907,21 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .formChangeTable = sEeveeFormChangeTable, .evolutions = EVOLUTION({EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_JOLTEON}, {EVO_ITEM, ITEM_WATER_STONE, SPECIES_VAPOREON}, - {EVO_ITEM, ITEM_FIRE_STONE, SPECIES_FLAREON}, - {EVO_LEVEL, 0, SPECIES_SYLVEON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD}, {IF_KNOWS_MOVE_TYPE, TYPE_FAIRY})}, - {EVO_LEVEL, 0, SPECIES_ESPEON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD}, {IF_NOT_TIME, TIME_NIGHT})}, - {EVO_LEVEL, 0, SPECIES_UMBREON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD}, {IF_TIME, TIME_NIGHT})}, - {EVO_LEVEL, 0, SPECIES_LEAFEON, CONDITIONS({IF_IN_MAP, MAP_PETALBURG_WOODS})}, + {EVO_ITEM, ITEM_FIRE_STONE, SPECIES_FLAREON} + #if P_GEN_6_CROSS_EVOS + ,{EVO_LEVEL, 0, SPECIES_SYLVEON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD}, {IF_KNOWS_MOVE_TYPE, TYPE_FAIRY})} + #endif + #if P_GEN_2_CROSS_EVOS + ,{EVO_LEVEL, 0, SPECIES_ESPEON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD}, {IF_NOT_TIME, TIME_NIGHT})}, + {EVO_LEVEL, 0, SPECIES_UMBREON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD}, {IF_TIME, TIME_NIGHT})} + #endif + #if P_GEN_4_CROSS_EVOS + ,{EVO_LEVEL, 0, SPECIES_LEAFEON, CONDITIONS({IF_IN_MAP, MAP_PETALBURG_WOODS})}, {EVO_ITEM, ITEM_LEAF_STONE, SPECIES_LEAFEON}, {EVO_LEVEL, 0, SPECIES_GLACEON, CONDITIONS({IF_IN_MAP, MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM})}, - {EVO_ITEM, ITEM_ICE_STONE, SPECIES_GLACEON}), + {EVO_ITEM, ITEM_ICE_STONE, SPECIES_GLACEON} + #endif + ), }, #if P_GIGANTAMAX_FORMS @@ -17725,7 +18030,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .shinyPalette = gMonShinyPalette_Eevee, .iconSprite = gMonIcon_EeveePartner, .iconPalIndex = 2, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_EeveeF, .frontPicSizeFemale = MON_COORDS_SIZE(40, 48), .backPicFemale = gMonBackPic_EeveeF, @@ -17734,7 +18039,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconSpriteFemale = gMonIcon_EeveePartnerF, .iconPalIndexFemale = 2, #endif -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NORMAL, SHADOW(-2, 2, SHADOW_SIZE_S) FOOTPRINT(Eevee) @@ -18366,8 +18671,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sPorygonLevelUpLearnset, .teachableLearnset = sPorygonTeachableLearnset, + #if P_GEN_2_CROSS_EVOS .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_PORYGON2, CONDITIONS({IF_HOLD_ITEM, ITEM_UPGRADE})}, {EVO_ITEM, ITEM_UPGRADE, SPECIES_PORYGON2}), + #endif }, #if P_GEN_2_CROSS_EVOS @@ -18443,8 +18750,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sPorygon2LevelUpLearnset, .teachableLearnset = sPorygon2TeachableLearnset, + #if P_GEN_4_CROSS_EVOS .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_PORYGON_Z, CONDITIONS({IF_HOLD_ITEM, ITEM_DUBIOUS_DISC})}, {EVO_ITEM, ITEM_DUBIOUS_DISC, SPECIES_PORYGON_Z}), + #endif }, #if P_GEN_4_CROSS_EVOS @@ -19880,7 +20189,91 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sDragoniteLevelUpLearnset, .teachableLearnset = sDragoniteTeachableLearnset, + .formSpeciesIdTable = sDragoniteFormSpeciesIdTable, + .formChangeTable = sDragoniteFormChangeTable, + }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_DRAGONITE_MEGA] = + { + .baseHP = 91, + .baseAttack = 124, + .baseDefense = 115, + .baseSpeed = 100, + .baseSpAttack = 145, + .baseSpDefense = 125, + .types = MON_TYPES(TYPE_DRAGON, TYPE_FLYING), + .catchRate = 45, + #if P_UPDATED_EXP_YIELDS >= GEN_8 + .expYield = 300, + #elif P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 270, + #else + .expYield = 218, + #endif + .evYield_Attack = 3, + .itemRare = ITEM_DRAGON_SCALE, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 40, + .friendship = 35, + .growthRate = GROWTH_SLOW, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_WATER_1, EGG_GROUP_DRAGON), + .abilities = { ABILITY_INNER_FOCUS, ABILITY_NONE, ABILITY_MULTISCALE }, + .bodyColor = BODY_COLOR_BROWN, + .speciesName = _("Dragonite"), + .cryId = CRY_DRAGONITE, // CRY_DRAGONITE_MEGA, + .natDexNum = NATIONAL_DEX_DRAGONITE, + .categoryName = _("Dragon"), + .height = 22, + .weight = 2900, + .description = COMPOUND_STRING( + "Mega Evolution has excessively\n" + "powered up this PokΓ©mon's feelings\n" + "of kindness. It finishes off its\n" + "opponents with mercy in its heart."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sDragoniteLevelUpLearnset, + .teachableLearnset = sDragoniteTeachableLearnset, + .formSpeciesIdTable = sDragoniteFormSpeciesIdTable, + .formChangeTable = sDragoniteFormChangeTable, }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_DRATINI #if P_FAMILY_MEWTWO diff --git a/src/data/pokemon/species_info/gen_2_families.h b/src/data/pokemon/species_info/gen_2_families.h index c8143d02f082..3849ab760df7 100644 --- a/src/data/pokemon/species_info/gen_2_families.h +++ b/src/data/pokemon/species_info/gen_2_families.h @@ -198,12 +198,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .shinyPalette = gMonShinyPalette_Meganium, .iconSprite = gMonIcon_Meganium, .iconPalIndex = 1, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_MeganiumF, .frontPicSizeFemale = MON_COORDS_SIZE(48, 64), .backPicFemale = gMonBackPic_MeganiumF, .backPicSizeFemale = MON_COORDS_SIZE(56, 64), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(0, 13, SHADOW_SIZE_M) FOOTPRINT(Meganium) @@ -225,7 +225,91 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = ) .levelUpLearnset = sMeganiumLevelUpLearnset, .teachableLearnset = sMeganiumTeachableLearnset, + .formSpeciesIdTable = sMeganiumFormSpeciesIdTable, + .formChangeTable = sMeganiumFormChangeTable, + }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_MEGANIUM_MEGA] = + { + .baseHP = 80, + .baseAttack = 92, + .baseDefense = 115, + .baseSpeed = 80, + .baseSpAttack = 143, + .baseSpDefense = 115, + .types = MON_TYPES(TYPE_GRASS, TYPE_FAIRY), + .catchRate = 45, + #if P_UPDATED_EXP_YIELDS >= GEN_8 + .expYield = 263, + #elif P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 236, + #else + .expYield = 208, + #endif + .evYield_Defense = 1, + .evYield_SpDefense = 2, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_MONSTER, EGG_GROUP_GRASS), + .abilities = { ABILITY_OVERGROW, ABILITY_NONE, ABILITY_LEAF_GUARD }, + .bodyColor = BODY_COLOR_GREEN, + .speciesName = _("Meganium"), + .cryId = CRY_MEGANIUM, // CRY_MEGANIUM_MEGA, + .natDexNum = NATIONAL_DEX_MEGANIUM, + .categoryName = _("Herb"), + .height = 24, + .weight = 2010, + .description = COMPOUND_STRING( + "This PokΓ©mon can fire a tremendously\n" + "powerful Solar Beam from its four\n" + "flowers. Another name for this is\n" + "Mega Sol Cannon."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sMeganiumLevelUpLearnset, + .teachableLearnset = sMeganiumTeachableLearnset, + .formSpeciesIdTable = sMeganiumFormSpeciesIdTable, + .formChangeTable = sMeganiumFormChangeTable, }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_CHIKORITA #if P_FAMILY_CYNDAQUIL @@ -364,8 +448,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = ) .levelUpLearnset = sQuilavaLevelUpLearnset, .teachableLearnset = sQuilavaTeachableLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 36, SPECIES_TYPHLOSION}, - {EVO_NONE, 0, SPECIES_TYPHLOSION_HISUI}), + .evolutions = EVOLUTION({EVO_LEVEL, 36, SPECIES_TYPHLOSION, CONDITIONS({IF_NOT_REGION, REGION_HISUI})}, + {EVO_LEVEL, 36, SPECIES_TYPHLOSION_HISUI, CONDITIONS({IF_REGION, REGION_HISUI})}), }, #if P_UPDATED_EXP_YIELDS >= GEN_8 @@ -728,7 +812,91 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = ) .levelUpLearnset = sFeraligatrLevelUpLearnset, .teachableLearnset = sFeraligatrTeachableLearnset, + .formSpeciesIdTable = sFeraligatrFormSpeciesIdTable, + .formChangeTable = sFeraligatrFormChangeTable, + }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_FERALIGATR_MEGA] = + { + .baseHP = 85, + .baseAttack = 160, + .baseDefense = 125, + .baseSpeed = 78, + .baseSpAttack = 89, + .baseSpDefense = 93, + .types = MON_TYPES(TYPE_WATER, TYPE_DRAGON), + .catchRate = 45, + #if P_UPDATED_EXP_YIELDS >= GEN_8 + .expYield = 265, + #elif P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 239, + #else + .expYield = 210, + #endif + .evYield_Attack = 2, + .evYield_Defense = 1, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_MONSTER, EGG_GROUP_WATER_1), + .abilities = { ABILITY_TORRENT, ABILITY_NONE, ABILITY_SHEER_FORCE }, + .bodyColor = BODY_COLOR_BLUE, + .speciesName = _("Feraligatr"), + .cryId = CRY_FERALIGATR, // CRY_FERALIGATR_MEGA, + .natDexNum = NATIONAL_DEX_FERALIGATR, + .categoryName = _("Double Jaw"), + .height = 23, + .weight = 1088, + .description = COMPOUND_STRING( + "With its arms and hoodlike fin, this\n" + "PokΓ©mon forms a gigantic set of jaws\n" + "with a bite 10 times as powerful\n" + "as Mega Feraligatr's actual jaws."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sFeraligatrLevelUpLearnset, + .teachableLearnset = sFeraligatrTeachableLearnset, + .formSpeciesIdTable = sFeraligatrFormSpeciesIdTable, + .formChangeTable = sFeraligatrFormChangeTable, }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_TOTODILE #if P_FAMILY_SENTRET @@ -1074,12 +1242,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .shinyPalette = gMonShinyPalette_Ledyba, .iconSprite = gMonIcon_Ledyba, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_LedybaF, .frontPicSizeFemale = MON_COORDS_SIZE(48, 48), .backPicFemale = gMonBackPic_LedybaF, .backPicSizeFemale = MON_COORDS_SIZE(56, 48), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(2, 4, SHADOW_SIZE_M) FOOTPRINT(Ledyba) @@ -1158,12 +1326,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .shinyPalette = gMonShinyPalette_Ledian, .iconSprite = gMonIcon_Ledian, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_LedianF, .frontPicSizeFemale = MON_COORDS_SIZE(48, 56), .backPicFemale = gMonBackPic_LedianF, .backPicSizeFemale = MON_COORDS_SIZE(64, 64), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(0, 15, SHADOW_SIZE_S) FOOTPRINT(Ledian) @@ -1619,7 +1787,9 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = ) .levelUpLearnset = sTogeticLevelUpLearnset, .teachableLearnset = sTogeticTeachableLearnset, + #if P_GEN_4_CROSS_EVOS .evolutions = EVOLUTION({EVO_ITEM, ITEM_SHINY_STONE, SPECIES_TOGEKISS}), + #endif }, #if P_GEN_4_CROSS_EVOS @@ -2520,12 +2690,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .shinyPalette = gMonShinyPalette_Sudowoodo, .iconSprite = gMonIcon_Sudowoodo, .iconPalIndex = 1, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_SudowoodoF, .frontPicSizeFemale = MON_COORDS_SIZE(48, 56), .backPicFemale = gMonBackPic_SudowoodoF, .backPicSizeFemale = MON_COORDS_SIZE(48, 56), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-2, 7, SHADOW_SIZE_S) FOOTPRINT(Sudowoodo) @@ -2840,12 +3010,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .shinyPalette = gMonShinyPalette_Aipom, .iconSprite = gMonIcon_Aipom, .iconPalIndex = 2, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_AipomF, .frontPicSizeFemale = MON_COORDS_SIZE(32, 64), .backPicFemale = gMonBackPic_AipomF, .backPicSizeFemale = MON_COORDS_SIZE(64, 64), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-1, 12, SHADOW_SIZE_S) FOOTPRINT(Aipom) @@ -2868,7 +3038,9 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sAipomLevelUpLearnset, .teachableLearnset = sAipomTeachableLearnset, .eggMoveLearnset = sAipomEggMoveLearnset, + #if P_GEN_4_CROSS_EVOS .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_AMBIPOM, CONDITIONS({IF_KNOWS_MOVE, MOVE_DOUBLE_HIT})}), + #endif }, #if P_GEN_4_CROSS_EVOS @@ -2923,12 +3095,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .shinyPalette = gMonShinyPalette_Ambipom, .iconSprite = gMonIcon_Ambipom, .iconPalIndex = 2, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_AmbipomF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 64), .backPicFemale = gMonBackPic_AmbipomF, .backPicSizeFemale = MON_COORDS_SIZE(64, 64), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-1, 13, SHADOW_SIZE_S) FOOTPRINT(Ambipom) @@ -3191,7 +3363,9 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sYanmaLevelUpLearnset, .teachableLearnset = sYanmaTeachableLearnset, .eggMoveLearnset = sYanmaEggMoveLearnset, + #if P_GEN_4_CROSS_EVOS .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_YANMEGA, CONDITIONS({IF_KNOWS_MOVE, MOVE_ANCIENT_POWER})}), + #endif }, #if P_GEN_4_CROSS_EVOS @@ -3341,12 +3515,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .shinyPalette = gMonShinyPalette_Wooper, .iconSprite = gMonIcon_Wooper, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_WooperF, .frontPicSizeFemale = MON_COORDS_SIZE(40, 32), .backPicFemale = gMonBackPic_WooperF, .backPicSizeFemale = MON_COORDS_SIZE(64, 40), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_SLOW, SHADOW(1, -2, SHADOW_SIZE_S) FOOTPRINT(Wooper) @@ -3423,12 +3597,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .shinyPalette = gMonShinyPalette_Quagsire, .iconSprite = gMonIcon_Quagsire, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_QuagsireF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 56), .backPicFemale = gMonBackPic_QuagsireF, .backPicSizeFemale = MON_COORDS_SIZE(64, 56), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(0, 8, SHADOW_SIZE_M) FOOTPRINT(Quagsire) @@ -3641,12 +3815,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .shinyPalette = gMonShinyPalette_Murkrow, .iconSprite = gMonIcon_Murkrow, .iconPalIndex = 2, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_MurkrowF, .frontPicSizeFemale = MON_COORDS_SIZE(48, 40), .backPicFemale = gMonBackPic_MurkrowF, .backPicSizeFemale = MON_COORDS_SIZE(40, 56), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-2, 8, SHADOW_SIZE_S) FOOTPRINT(Murkrow) @@ -3669,7 +3843,9 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sMurkrowLevelUpLearnset, .teachableLearnset = sMurkrowTeachableLearnset, .eggMoveLearnset = sMurkrowEggMoveLearnset, + #if P_GEN_4_CROSS_EVOS .evolutions = EVOLUTION({EVO_ITEM, ITEM_DUSK_STONE, SPECIES_HONCHKROW}), + #endif }, #if P_GEN_4_CROSS_EVOS @@ -3819,7 +3995,9 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sMisdreavusLevelUpLearnset, .teachableLearnset = sMisdreavusTeachableLearnset, .eggMoveLearnset = sMisdreavusEggMoveLearnset, + #if P_GEN_4_CROSS_EVOS .evolutions = EVOLUTION({EVO_ITEM, ITEM_DUSK_STONE, SPECIES_MISMAGIUS}), + #endif }, #if P_GEN_4_CROSS_EVOS @@ -4124,7 +4302,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .shinyPalette = gMonShinyPalette_Wobbuffet, .iconSprite = gMonIcon_Wobbuffet, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_WobbuffetF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 56), .backPicFemale = gMonBackPic_WobbuffetF, @@ -4133,7 +4311,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .iconSpriteFemale = gMonIcon_WobbuffetF, .iconPalIndexFemale = 0, #endif -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-3, 8, SHADOW_SIZE_M) FOOTPRINT(Wobbuffet) @@ -4211,12 +4389,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .shinyPalette = gMonShinyPalette_Girafarig, .iconSprite = gMonIcon_Girafarig, .iconPalIndex = 1, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_GirafarigF, .frontPicSizeFemale = MON_COORDS_SIZE(56, 64), .backPicFemale = gMonBackPic_GirafarigF, .backPicSizeFemale = MON_COORDS_SIZE(64, 64), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(2, 13, SHADOW_SIZE_M) FOOTPRINT(Girafarig) @@ -4239,7 +4417,9 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sGirafarigLevelUpLearnset, .teachableLearnset = sGirafarigTeachableLearnset, .eggMoveLearnset = sGirafarigEggMoveLearnset, + #if P_GEN_9_CROSS_EVOS .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_FARIGIRAF, CONDITIONS({IF_KNOWS_MOVE, MOVE_TWIN_BEAM})}), + #endif }, #if P_GEN_9_CROSS_EVOS @@ -4527,8 +4707,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sDunsparceLevelUpLearnset, .teachableLearnset = sDunsparceTeachableLearnset, .eggMoveLearnset = sDunsparceEggMoveLearnset, + #if P_GEN_9_CROSS_EVOS .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_DUDUNSPARCE_TWO_SEGMENT, CONDITIONS({IF_KNOWS_MOVE, MOVE_HYPER_DRILL}, {IF_PID_MODULO_100_GT, 0})}, {EVO_LEVEL, 0, SPECIES_DUDUNSPARCE_THREE_SEGMENT, CONDITIONS({IF_KNOWS_MOVE, MOVE_HYPER_DRILL}, {IF_PID_MODULO_100_EQ, 0})}), + #endif }, #if P_GEN_9_CROSS_EVOS @@ -4714,12 +4896,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .shinyPalette = gMonShinyPalette_Gligar, .iconSprite = gMonIcon_Gligar, .iconPalIndex = P_GBA_STYLE_SPECIES_ICONS ? 2 : 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_GligarF, .frontPicSizeFemale = MON_COORDS_SIZE(56, 56), .backPicFemale = gMonBackPic_GligarF, .backPicSizeFemale = MON_COORDS_SIZE(64, 64), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(0, 15, SHADOW_SIZE_S) FOOTPRINT(Gligar) @@ -4742,8 +4924,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sGligarLevelUpLearnset, .teachableLearnset = sGligarTeachableLearnset, .eggMoveLearnset = sGligarEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_GLISCOR, CONDITIONS({IF_TIME, TIME_NIGHT}, {IF_HOLD_ITEM, ITEM_RAZOR_FANG})}, + #if P_GEN_4_CROSS_EVOS + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_GLISCOR, CONDITIONS({IF_TIME, TIME_NIGHT}, {IF_HOLD_ITEM, ITEM_RAZOR_FANG})}, {EVO_ITEM, ITEM_RAZOR_FANG, SPECIES_GLISCOR, CONDITIONS({IF_TIME, TIME_NIGHT})}), + #endif }, #if P_GEN_4_CROSS_EVOS @@ -5316,12 +5500,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .shinyPalette = gMonShinyPalette_Heracross, .iconSprite = gMonIcon_Heracross, .iconPalIndex = P_GBA_STYLE_SPECIES_ICONS ? 2 : 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_HeracrossF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 64), .backPicFemale = gMonBackPic_HeracrossF, .backPicSizeFemale = MON_COORDS_SIZE(48, 64), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-1, 10, SHADOW_SIZE_M) FOOTPRINT(Heracross) @@ -5477,12 +5661,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .shinyPalette = gMonShinyPalette_Sneasel, .iconSprite = gMonIcon_Sneasel, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_SneaselF, .frontPicSizeFemale = MON_COORDS_SIZE(56, 48), .backPicFemale = gMonBackPic_SneaselF, .backPicSizeFemale = MON_COORDS_SIZE(64, 64), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-1, 5, SHADOW_SIZE_S) FOOTPRINT(Sneasel) @@ -5506,8 +5690,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .teachableLearnset = sSneaselTeachableLearnset, .eggMoveLearnset = sSneaselEggMoveLearnset, .formSpeciesIdTable = sSneaselFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_WEAVILE, CONDITIONS({IF_TIME, TIME_NIGHT}, {IF_HOLD_ITEM, ITEM_RAZOR_CLAW})}, + #if P_GEN_4_CROSS_EVOS + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_WEAVILE, CONDITIONS({IF_TIME, TIME_NIGHT}, {IF_HOLD_ITEM, ITEM_RAZOR_CLAW})}, {EVO_ITEM, ITEM_RAZOR_CLAW, SPECIES_WEAVILE, CONDITIONS({IF_TIME, TIME_NIGHT})}), + #endif }, #if P_GEN_4_CROSS_EVOS @@ -5672,7 +5858,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sSneaselHisuiLevelUpLearnset, .teachableLearnset = sSneaselHisuiTeachableLearnset, .formSpeciesIdTable = sSneaselFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_SNEASLER, CONDITIONS({IF_NOT_TIME, TIME_NIGHT}, {IF_HOLD_ITEM, ITEM_RAZOR_CLAW})}, + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_SNEASLER, CONDITIONS({IF_NOT_TIME, TIME_NIGHT}, {IF_HOLD_ITEM, ITEM_RAZOR_CLAW})}, {EVO_ITEM, ITEM_RAZOR_CLAW, SPECIES_SNEASLER, CONDITIONS({IF_NOT_TIME, TIME_NIGHT})}), }, @@ -5870,12 +6056,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .shinyPalette = gMonShinyPalette_Ursaring, .iconSprite = gMonIcon_Ursaring, .iconPalIndex = 2, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_UrsaringF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 64), .backPicFemale = gMonBackPic_UrsaringF, .backPicSizeFemale = MON_COORDS_SIZE(56, 64), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(1, 14, SHADOW_SIZE_L) FOOTPRINT(Ursaring) @@ -5897,8 +6083,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = ) .levelUpLearnset = sUrsaringLevelUpLearnset, .teachableLearnset = sUrsaringTeachableLearnset, - .evolutions = EVOLUTION({EVO_ITEM, ITEM_PEAT_BLOCK, SPECIES_URSALUNA, CONDITIONS({IF_TIME, TIME_NIGHT})}, + #if P_GEN_8_CROSS_EVOS + .evolutions = EVOLUTION({EVO_ITEM, ITEM_PEAT_BLOCK, SPECIES_URSALUNA, CONDITIONS({IF_REGION, REGION_HISUI}, {IF_TIME, TIME_NIGHT})}, {EVO_NONE, 0, SPECIES_URSALUNA_BLOODMOON}), + #endif }, #if P_GEN_8_CROSS_EVOS @@ -6303,12 +6491,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .shinyPalette = gMonShinyPalette_Piloswine, .iconSprite = gMonIcon_Piloswine, .iconPalIndex = 2, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_PiloswineF, .frontPicSizeFemale = MON_COORDS_SIZE(48, 56), .backPicFemale = gMonBackPic_PiloswineF, .backPicSizeFemale = MON_COORDS_SIZE(64, 48), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-1, 3, SHADOW_SIZE_M) FOOTPRINT(Piloswine) @@ -6330,7 +6518,9 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = ) .levelUpLearnset = sPiloswineLevelUpLearnset, .teachableLearnset = sPiloswineTeachableLearnset, + #if P_GEN_4_CROSS_EVOS .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_MAMOSWINE, CONDITIONS({IF_KNOWS_MOVE, MOVE_ANCIENT_POWER})}), + #endif }, #if P_GEN_4_CROSS_EVOS @@ -6769,12 +6959,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .shinyPalette = gMonShinyPalette_Octillery, .iconSprite = gMonIcon_Octillery, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_OctilleryF, .frontPicSizeFemale = MON_COORDS_SIZE(56, 48), .backPicFemale = gMonBackPic_OctilleryF, .backPicSizeFemale = MON_COORDS_SIZE(64, 56), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(1, 4, SHADOW_SIZE_M) FOOTPRINT(Octillery) @@ -7085,7 +7275,85 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sSkarmoryLevelUpLearnset, .teachableLearnset = sSkarmoryTeachableLearnset, .eggMoveLearnset = sSkarmoryEggMoveLearnset, + .formSpeciesIdTable = sSkarmoryFormSpeciesIdTable, + .formChangeTable = sSkarmoryFormChangeTable, + }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_SKARMORY_MEGA] = + { + .baseHP = 65, + .baseAttack = 140, + .baseDefense = 110, + .baseSpeed = 110, + .baseSpAttack = 40, + .baseSpDefense = 100, + .types = MON_TYPES(TYPE_STEEL, TYPE_FLYING), + .catchRate = 25, + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 163 : 168, + .evYield_Defense = 2, + .itemRare = ITEM_METAL_COAT, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 25, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_SLOW, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FLYING), + .abilities = { ABILITY_KEEN_EYE, ABILITY_STURDY, ABILITY_WEAK_ARMOR }, + .bodyColor = BODY_COLOR_GRAY, + .speciesName = _("Skarmory"), + .cryId = CRY_SKARMORY, // CRY_SKARMORY_MEGA, + .natDexNum = NATIONAL_DEX_SKARMORY, + .categoryName = _("Armor Bird"), + .height = 17, + .weight = 404, + .description = COMPOUND_STRING( + "Due to the effects of Mega Evolution,\n" + "its pincers have taken a more\n" + "diabolical form, ripping anything\n" + "they pierce to shreds."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sSkarmoryLevelUpLearnset, + .teachableLearnset = sSkarmoryTeachableLearnset, + .formSpeciesIdTable = sSkarmoryFormSpeciesIdTable, + .formChangeTable = sSkarmoryFormChangeTable, }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_SKARMORY #if P_FAMILY_HOUNDOUR @@ -7207,12 +7475,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .shinyPalette = gMonShinyPalette_Houndoom, .iconSprite = gMonIcon_Houndoom, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_HoundoomF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 64), .backPicFemale = gMonBackPic_HoundoomF, .backPicSizeFemale = MON_COORDS_SIZE(64, 56), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-5, 13, SHADOW_SIZE_L) FOOTPRINT(Houndoom) @@ -7434,12 +7702,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .shinyPalette = gMonShinyPalette_Donphan, .iconSprite = gMonIcon_Donphan, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_DonphanF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 48), .backPicFemale = gMonBackPic_DonphanF, .backPicSizeFemale = MON_COORDS_SIZE(64, 48), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(7, 2, SHADOW_SIZE_L) FOOTPRINT(Donphan) @@ -7534,7 +7802,9 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sStantlerLevelUpLearnset, .teachableLearnset = sStantlerTeachableLearnset, .eggMoveLearnset = sStantlerEggMoveLearnset, + #if P_GEN_8_CROSS_EVOS .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_WYRDEER, CONDITIONS({IF_USED_MOVE_X_TIMES, MOVE_PSYSHIELD_BASH, 20})}), + #endif }, #if P_GEN_8_CROSS_EVOS diff --git a/src/data/pokemon/species_info/gen_3_families.h b/src/data/pokemon/species_info/gen_3_families.h index 272c57668e75..6535497ddfb8 100644 --- a/src/data/pokemon/species_info/gen_3_families.h +++ b/src/data/pokemon/species_info/gen_3_families.h @@ -347,10 +347,10 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .shinyPalette = gMonShinyPalette_Torchic, .iconSprite = gMonIcon_Torchic, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .backPicFemale = gMonBackPic_TorchicF, .backPicSizeFemale = MON_COORDS_SIZE(40, 48), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_SLOW, SHADOW(-1, 1, SHADOW_SIZE_S) FOOTPRINT(Torchic) @@ -428,12 +428,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .shinyPalette = gMonShinyPalette_Combusken, .iconSprite = gMonIcon_Combusken, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_CombuskenF, .frontPicSizeFemale = MON_COORDS_SIZE(48, 64), .backPicFemale = gMonBackPic_CombuskenF, .backPicSizeFemale = MON_COORDS_SIZE(64, 64), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-1, 8, SHADOW_SIZE_M) FOOTPRINT(Combusken) @@ -517,12 +517,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .shinyPalette = gMonShinyPalette_Blaziken, .iconSprite = gMonIcon_Blaziken, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_BlazikenF, .frontPicSizeFemale = MON_COORDS_SIZE(56, 64), .backPicFemale = gMonBackPic_BlazikenF, .backPicSizeFemale = MON_COORDS_SIZE(64, 64), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(4, 8, SHADOW_SIZE_M) FOOTPRINT(Blaziken) @@ -1644,12 +1644,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .shinyPalette = gMonShinyPalette_Beautifly, .iconSprite = gMonIcon_Beautifly, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_BeautiflyF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 56), .backPicFemale = gMonBackPic_BeautiflyF, .backPicSizeFemale = MON_COORDS_SIZE(64, 64), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-5, 12, SHADOW_SIZE_S) FOOTPRINT(Beautifly) @@ -1825,12 +1825,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .shinyPalette = gMonShinyPalette_Dustox, .iconSprite = gMonIcon_Dustox, .iconPalIndex = P_GBA_STYLE_SPECIES_ICONS ? 1 : 5, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_DustoxF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 48), .backPicFemale = gMonBackPic_DustoxF, .backPicSizeFemale = MON_COORDS_SIZE(64, 64), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-2, 11, SHADOW_SIZE_S) FOOTPRINT(Dustox) @@ -2059,12 +2059,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .shinyPalette = gMonShinyPalette_Ludicolo, .iconSprite = gMonIcon_Ludicolo, .iconPalIndex = 1, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_LudicoloF, .frontPicSizeFemale = MON_COORDS_SIZE(56, 64), .backPicFemale = gMonBackPic_LudicoloF, .backPicSizeFemale = MON_COORDS_SIZE(64, 56), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-3, 14, SHADOW_SIZE_M) FOOTPRINT(Ludicolo) @@ -2224,12 +2224,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .shinyPalette = gMonShinyPalette_Nuzleaf, .iconSprite = gMonIcon_Nuzleaf, .iconPalIndex = 1, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_NuzleafF, .frontPicSizeFemale = MON_COORDS_SIZE(40, 56), .backPicFemale = gMonBackPic_NuzleafF, .backPicSizeFemale = MON_COORDS_SIZE(56, 48), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-3, 5, SHADOW_SIZE_S) FOOTPRINT(Nuzleaf) @@ -2316,12 +2316,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .shinyPalette = gMonShinyPalette_Shiftry, .iconSprite = gMonIcon_Shiftry, .iconPalIndex = P_GBA_STYLE_SPECIES_ICONS ? 0 : 5, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_ShiftryF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 56), .backPicFemale = gMonBackPic_ShiftryF, .backPicSizeFemale = MON_COORDS_SIZE(64, 56), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-5, 5, SHADOW_SIZE_M) FOOTPRINT(Shiftry) @@ -2801,8 +2801,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = ) .levelUpLearnset = sKirliaLevelUpLearnset, .teachableLearnset = sKirliaTeachableLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 30, SPECIES_GARDEVOIR}, - {EVO_ITEM, ITEM_DAWN_STONE, SPECIES_GALLADE, CONDITIONS({IF_GENDER, MON_MALE})}), + .evolutions = EVOLUTION({EVO_LEVEL, 30, SPECIES_GARDEVOIR} + #if P_GEN_4_CROSS_EVOS + ,{EVO_ITEM, ITEM_DAWN_STONE, SPECIES_GALLADE, CONDITIONS({IF_GENDER, MON_MALE})} + #endif + ), }, [SPECIES_GARDEVOIR] = @@ -4314,8 +4317,10 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .levelUpLearnset = sNosepassLevelUpLearnset, .teachableLearnset = sNosepassTeachableLearnset, .eggMoveLearnset = sNosepassEggMoveLearnset, + #if P_GEN_4_CROSS_EVOS .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_PROBOPASS, CONDITIONS({IF_IN_MAPSEC, MAPSEC_NEW_MAUVILLE})}, {EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_PROBOPASS}), + #endif }, #if P_GEN_4_CROSS_EVOS @@ -5197,12 +5202,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .shinyPalette = gMonShinyPalette_Meditite, .iconSprite = gMonIcon_Meditite, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_MedititeF, .frontPicSizeFemale = MON_COORDS_SIZE(48, 48), .backPicFemale = gMonBackPic_MedititeF, .backPicSizeFemale = MON_COORDS_SIZE(48, 48), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_SLOW, SHADOW(0, 1, SHADOW_SIZE_S) FOOTPRINT(Meditite) @@ -5283,12 +5288,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .shinyPalette = gMonShinyPalette_Medicham, .iconSprite = gMonIcon_Medicham, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_MedichamF, .frontPicSizeFemale = MON_COORDS_SIZE(40, 64), .backPicFemale = gMonBackPic_MedichamF, .backPicSizeFemale = MON_COORDS_SIZE(56, 64), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-2, 13, SHADOW_SIZE_S) FOOTPRINT(Medicham) @@ -6041,12 +6046,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .shinyPalette = gMonShinyPalette_Roselia, .iconSprite = gMonIcon_Roselia, .iconPalIndex = P_GBA_STYLE_SPECIES_ICONS ? 0 : 4, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_RoseliaF, .frontPicSizeFemale = MON_COORDS_SIZE(56, 48), .backPicFemale = gMonBackPic_RoseliaF, .backPicSizeFemale = MON_COORDS_SIZE(64, 56), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_SLOW, SHADOW(-2, 3, SHADOW_SIZE_S) FOOTPRINT(Roselia) @@ -6069,7 +6074,9 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .levelUpLearnset = sRoseliaLevelUpLearnset, .teachableLearnset = sRoseliaTeachableLearnset, .eggMoveLearnset = sRoseliaEggMoveLearnset, + #if P_GEN_4_CROSS_EVOS .evolutions = EVOLUTION({EVO_ITEM, ITEM_SHINY_STONE, SPECIES_ROSERADE}), + #endif }, #if P_GEN_4_CROSS_EVOS @@ -6220,12 +6227,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .shinyPalette = gMonShinyPalette_Gulpin, .iconSprite = gMonIcon_Gulpin, .iconPalIndex = 1, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_GulpinF, .frontPicSizeFemale = MON_COORDS_SIZE(40, 48), .backPicFemale = gMonBackPic_GulpinF, .backPicSizeFemale = MON_COORDS_SIZE(56, 48), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_SLOW, SHADOW(1, -2, SHADOW_SIZE_S) FOOTPRINT(Gulpin) @@ -6305,12 +6312,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .shinyPalette = gMonShinyPalette_Swalot, .iconSprite = gMonIcon_Swalot, .iconPalIndex = 2, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_SwalotF, .frontPicSizeFemale = MON_COORDS_SIZE(56, 56), .backPicFemale = gMonBackPic_SwalotF, .backPicSizeFemale = MON_COORDS_SIZE(64, 64), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(4, 3, SHADOW_SIZE_L) FOOTPRINT(Swalot) @@ -6762,12 +6769,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .shinyPalette = gMonShinyPalette_Numel, .iconSprite = gMonIcon_Numel, .iconPalIndex = 1, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_NumelF, .frontPicSizeFemale = MON_COORDS_SIZE(40, 48), .backPicFemale = gMonBackPic_NumelF, .backPicSizeFemale = MON_COORDS_SIZE(56, 56), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_SLOW, SHADOW(4, 2, SHADOW_SIZE_S) FOOTPRINT(Numel) @@ -6853,12 +6860,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .shinyPalette = gMonShinyPalette_Camerupt, .iconSprite = gMonIcon_Camerupt, .iconPalIndex = 0, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_CameruptF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 56), .backPicFemale = gMonBackPic_CameruptF, .backPicSizeFemale = MON_COORDS_SIZE(64, 40), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(2, 4, SHADOW_SIZE_L) FOOTPRINT(Camerupt) @@ -7225,13 +7232,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Spinda, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 8, - .frontAnimFrames = ANIM_FRAMES( - ANIMCMD_FRAME(0, 17), - ANIMCMD_FRAME(1, 23), - ANIMCMD_FRAME(0, 17), - ANIMCMD_FRAME(1, 23), - ANIMCMD_FRAME(0, 13), - ), + #if !P_GBA_STYLE_SPECIES_GFX + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 17), + ANIMCMD_FRAME(1, 23), + ANIMCMD_FRAME(0, 17), + ANIMCMD_FRAME(1, 23), + ANIMCMD_FRAME(0, 13), + ), + #else + .frontAnimFrames = sAnims_SingleFramePlaceHolder, + #endif .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_JUMPS : ANIM_CIRCLE_INTO_BG, .backPic = gMonBackPic_Spinda, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -9105,12 +9116,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .shinyPalette = gMonShinyPalette_Milotic, .iconSprite = gMonIcon_Milotic, .iconPalIndex = P_GBA_STYLE_SPECIES_ICONS ? 0 : 2, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_MiloticF, .frontPicSizeFemale = MON_COORDS_SIZE(64, 64), .backPicFemale = gMonBackPic_MiloticF, .backPicSizeFemale = MON_COORDS_SIZE(64, 64), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(0, 12, SHADOW_SIZE_M) FOOTPRINT(Milotic) @@ -9175,13 +9186,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_CastformNormal, .frontPicSize = MON_COORDS_SIZE(24, 32), .frontPicYOffset = 17, - .frontAnimFrames = ANIM_FRAMES( - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 24), - ANIMCMD_FRAME(0, 24), - ANIMCMD_FRAME(1, 24), - ANIMCMD_FRAME(0, 24), - ), + #if !P_GBA_STYLE_SPECIES_GFX + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 24), + ANIMCMD_FRAME(0, 24), + ANIMCMD_FRAME(1, 24), + ANIMCMD_FRAME(0, 24), + ), + #else + .frontAnimFrames = sAnims_SingleFramePlaceHolder, + #endif .frontAnimId = ANIM_H_SLIDE_WOBBLE, .enemyMonElevation = 16, .backPic = gMonBackPic_CastformNormal, @@ -9250,21 +9265,25 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_CastformSunny, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 9, - .frontAnimFrames = ANIM_FRAMES( - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ), - .frontAnimId = ANIM_GROW_VIBRATE, + #if !P_GBA_STYLE_SPECIES_GFX + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ), + #else + .frontAnimFrames = sAnims_SingleFramePlaceHolder, + #endif + .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_SLIDE_WOBBLE : ANIM_GROW_VIBRATE, .enemyMonElevation = 5, .backPic = gMonBackPic_CastformSunny, .backPicSize = MON_COORDS_SIZE(56, 64), .backPicYOffset = 0, - .backAnimId = BACK_ANIM_SHAKE_GLOW_RED, + .backAnimId = P_GBA_STYLE_SPECIES_GFX ? BACK_ANIM_CONVEX_DOUBLE_ARC : BACK_ANIM_SHAKE_GLOW_RED, .palette = gMonPalette_CastformSunny, .shinyPalette = gMonShinyPalette_CastformSunny, .iconSprite = gMonIcon_CastformSunny, @@ -9327,19 +9346,23 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_CastformRainy, .frontPicSize = MON_COORDS_SIZE(32, 48), .frontPicYOffset = 9, - .frontAnimFrames = ANIM_FRAMES( - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 11), - ), - .frontAnimId = ANIM_SWING_CONVEX_FAST, + #if !P_GBA_STYLE_SPECIES_GFX + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 11), + ), + #else + .frontAnimFrames = sAnims_SingleFramePlaceHolder, + #endif + .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_SLIDE_WOBBLE : ANIM_SWING_CONVEX_FAST, .enemyMonElevation = 5, .backPic = gMonBackPic_CastformRainy, .backPicSize = MON_COORDS_SIZE(40, 64), .backPicYOffset = 0, - .backAnimId = BACK_ANIM_SHRINK_GROW_VIBRATE, + .backAnimId = P_GBA_STYLE_SPECIES_GFX ? BACK_ANIM_CONVEX_DOUBLE_ARC : BACK_ANIM_SHRINK_GROW_VIBRATE, .palette = gMonPalette_CastformRainy, .shinyPalette = gMonShinyPalette_CastformRainy, .iconSprite = gMonIcon_CastformRainy, @@ -9402,19 +9425,23 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_CastformSnowy, .frontPicSize = MON_COORDS_SIZE(40, 56), .frontPicYOffset = 8, - .frontAnimFrames = ANIM_FRAMES( - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 29), - ANIMCMD_FRAME(0, 12), - ), - .frontAnimId = ANIM_V_STRETCH, + #if !P_GBA_STYLE_SPECIES_GFX + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 29), + ANIMCMD_FRAME(0, 12), + ), + #else + .frontAnimFrames = sAnims_SingleFramePlaceHolder, + #endif + .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_SLIDE_WOBBLE : ANIM_V_STRETCH, .enemyMonElevation = 5, .backPic = gMonBackPic_CastformSnowy, .backPicSize = MON_COORDS_SIZE(56, 64), .backPicYOffset = 0, - .backAnimId = BACK_ANIM_TRIANGLE_DOWN, + .backAnimId = P_GBA_STYLE_SPECIES_GFX ? BACK_ANIM_CONVEX_DOUBLE_ARC : BACK_ANIM_TRIANGLE_DOWN, .palette = gMonPalette_CastformSnowy, .shinyPalette = gMonShinyPalette_CastformSnowy, .iconSprite = gMonIcon_CastformSnowy, @@ -9900,8 +9927,10 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = ) .levelUpLearnset = sDusclopsLevelUpLearnset, .teachableLearnset = sDusclopsTeachableLearnset, + #if P_GEN_4_CROSS_EVOS .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_DUSKNOIR, CONDITIONS({IF_HOLD_ITEM, ITEM_REAPER_CLOTH})}, {EVO_ITEM, ITEM_REAPER_CLOTH, SPECIES_DUSKNOIR}), + #endif }, #if P_GEN_4_CROSS_EVOS @@ -10459,8 +10488,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .levelUpLearnset = sSnoruntLevelUpLearnset, .teachableLearnset = sSnoruntTeachableLearnset, .eggMoveLearnset = sSnoruntEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 42, SPECIES_GLALIE}, - {EVO_ITEM, ITEM_DAWN_STONE, SPECIES_FROSLASS, CONDITIONS({IF_GENDER, MON_FEMALE})}), + .evolutions = EVOLUTION({EVO_LEVEL, 42, SPECIES_GLALIE} + #if P_GEN_4_CROSS_EVOS + ,{EVO_ITEM, ITEM_DAWN_STONE, SPECIES_FROSLASS, CONDITIONS({IF_GENDER, MON_FEMALE})} + #endif + ), }, [SPECIES_GLALIE] = @@ -10676,7 +10708,84 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = ) .levelUpLearnset = sFroslassLevelUpLearnset, .teachableLearnset = sFroslassTeachableLearnset, + .formSpeciesIdTable = sFroslassFormSpeciesIdTable, + .formChangeTable = sFroslassFormChangeTable, + }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_FROSLASS_MEGA] = + { + .baseHP = 70, + .baseAttack = 80, + .baseDefense = 70, + .baseSpeed = 120, + .baseSpAttack = 140, + .baseSpDefense = 100, + .types = MON_TYPES(TYPE_ICE, TYPE_GHOST), + .catchRate = 75, + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 168 : 187, + .evYield_Speed = 2, + .genderRatio = MON_FEMALE, + .eggCycles = 20, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FAIRY, EGG_GROUP_MINERAL), + .abilities = { ABILITY_SNOW_CLOAK, ABILITY_NONE, ABILITY_CURSED_BODY }, + .bodyColor = BODY_COLOR_WHITE, + .speciesName = _("Froslass"), + .cryId = CRY_FROSLASS, // CRY_FROSLASS_MEGA, + .natDexNum = NATIONAL_DEX_FROSLASS, + .categoryName = _("Snow Land"), + .height = 26, + .weight = 296, + .description = COMPOUND_STRING( + "This PokΓ©mon can use eerie cold\n" + "air imbued with ghost energy to\n" + "freeze even insubstantial things,\n" + "such as flames or the wind."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sFroslassLevelUpLearnset, + .teachableLearnset = sFroslassTeachableLearnset, + .formSpeciesIdTable = sFroslassFormSpeciesIdTable, + .formChangeTable = sFroslassFormChangeTable, }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_GEN_4_CROSS_EVOS #endif //P_FAMILY_SNORUNT @@ -11189,12 +11298,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .shinyPalette = gMonShinyPalette_Relicanth, .iconSprite = gMonIcon_Relicanth, .iconPalIndex = P_GBA_STYLE_SPECIES_ICONS ? 1 : 2, -#if P_GENDER_DIFFERENCES +#if P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .frontPicFemale = gMonFrontPic_RelicanthF, .frontPicSizeFemale = MON_COORDS_SIZE(56, 56), .backPicFemale = gMonBackPic_RelicanthF, .backPicSizeFemale = MON_COORDS_SIZE(64, 40), -#endif //P_GENDER_DIFFERENCES +#endif //P_GENDER_DIFFERENCES && !P_GBA_STYLE_SPECIES_GFX .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(0, 3, SHADOW_SIZE_M) FOOTPRINT(Relicanth) @@ -13033,15 +13142,20 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .trainerOffset = 2, .frontPic = gMonFrontPic_DeoxysNormal, .frontPicSize = MON_COORDS_SIZE(64, 64), - .frontPicYOffset = 0, - .frontAnimFrames = ANIM_FRAMES( - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 26), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ), - .frontAnimId = ANIM_GROW_VIBRATE, + .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 0, + #if !P_GBA_STYLE_SPECIES_GFX + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 26), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ), + #else + .frontAnimFrames = sAnims_SingleFramePlaceHolder, + #endif + .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_PIVOT : ANIM_GROW_VIBRATE, + .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 0, .backPic = gMonBackPic_DeoxysNormal, .backPicSize = MON_COORDS_SIZE(64, 56), .backPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 2 : 6, @@ -13104,19 +13218,24 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .trainerOffset = 2, .frontPic = gMonFrontPic_DeoxysAttack, .frontPicSize = MON_COORDS_SIZE(64, 64), - .frontPicYOffset = 0, - .frontAnimFrames = ANIM_FRAMES( - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 26), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ), - .frontAnimId = ANIM_GROW_VIBRATE, + .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 0, + #if !P_GBA_STYLE_SPECIES_GFX + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 26), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ), + #else + .frontAnimFrames = sAnims_SingleFramePlaceHolder, + #endif + .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_PIVOT : ANIM_GROW_VIBRATE, + .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 0, .backPic = gMonBackPic_DeoxysAttack, - .backPicSize = MON_COORDS_SIZE(64, 64), - .backPicYOffset = 1, - .backAnimId = BACK_ANIM_TRIANGLE_DOWN, + .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 64), + .backPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 7 : 1, + .backAnimId = P_GBA_STYLE_SPECIES_GFX ? BACK_ANIM_SHRINK_GROW_VIBRATE : BACK_ANIM_TRIANGLE_DOWN, .palette = gMonPalette_DeoxysAttack, .shinyPalette = gMonShinyPalette_DeoxysAttack, .iconSprite = gMonIcon_DeoxysAttack, @@ -13173,20 +13292,25 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .trainerScale = 290, .trainerOffset = 2, .frontPic = gMonFrontPic_DeoxysDefense, - .frontPicSize = MON_COORDS_SIZE(56, 64), - .frontPicYOffset = 0, - .frontAnimFrames = ANIM_FRAMES( - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 26), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ), - .frontAnimId = ANIM_GROW_VIBRATE, + .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(56, 64), + .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 0, + #if !P_GBA_STYLE_SPECIES_GFX + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 26), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ), + #else + .frontAnimFrames = sAnims_SingleFramePlaceHolder, + #endif + .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_PIVOT : ANIM_GROW_VIBRATE, + .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 0, .backPic = gMonBackPic_DeoxysDefense, .backPicSize = MON_COORDS_SIZE(64, 56), - .backPicYOffset = 8, - .backAnimId = BACK_ANIM_TRIANGLE_DOWN, + .backPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 7 : 8, + .backAnimId = P_GBA_STYLE_SPECIES_GFX ? BACK_ANIM_SHRINK_GROW_VIBRATE : BACK_ANIM_TRIANGLE_DOWN, .palette = gMonPalette_DeoxysDefense, .shinyPalette = gMonShinyPalette_DeoxysDefense, .iconSprite = gMonIcon_DeoxysDefense, @@ -13246,18 +13370,23 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_DeoxysSpeed, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = ANIM_FRAMES( - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 26), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ), - .frontAnimId = ANIM_GROW_VIBRATE, + #if !P_GBA_STYLE_SPECIES_GFX + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 26), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ), + #else + .frontAnimFrames = sAnims_SingleFramePlaceHolder, + #endif + .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_PIVOT : ANIM_GROW_VIBRATE, + .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 0, .backPic = gMonBackPic_DeoxysSpeed, - .backPicSize = MON_COORDS_SIZE(64, 64), - .backPicYOffset = 0, - .backAnimId = BACK_ANIM_TRIANGLE_DOWN, + .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 64), + .backPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 9 : 0, + .backAnimId = P_GBA_STYLE_SPECIES_GFX ? BACK_ANIM_SHRINK_GROW_VIBRATE : BACK_ANIM_TRIANGLE_DOWN, .palette = gMonPalette_DeoxysSpeed, .shinyPalette = gMonShinyPalette_DeoxysSpeed, .iconSprite = gMonIcon_DeoxysSpeed, diff --git a/src/data/pokemon/species_info/gen_5_families.h b/src/data/pokemon/species_info/gen_5_families.h index 9e906e8f855c..0acaeb8ec7f5 100644 --- a/src/data/pokemon/species_info/gen_5_families.h +++ b/src/data/pokemon/species_info/gen_5_families.h @@ -512,7 +512,85 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = ) .levelUpLearnset = sEmboarLevelUpLearnset, .teachableLearnset = sEmboarTeachableLearnset, + .formSpeciesIdTable = sEmboarFormSpeciesIdTable, + .formChangeTable = sEmboarFormChangeTable, }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_EMBOAR_MEGA] = + { + .baseHP = 110, + .baseAttack = 148, + .baseDefense = 75, + .baseSpeed = 75, + .baseSpAttack = 110, + .baseSpDefense = 110, + .types = MON_TYPES(TYPE_FIRE, TYPE_FIGHTING), + .catchRate = 45, + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 264 : 238, + .evYield_Attack = 3, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FIELD), + .abilities = { ABILITY_BLAZE, ABILITY_NONE, ABILITY_RECKLESS }, + .bodyColor = BODY_COLOR_RED, + .noFlip = TRUE, + .speciesName = _("Emboar"), + .cryId = CRY_EMBOAR, // CRY_EMBOAR_MEGA, + .natDexNum = NATIONAL_DEX_EMBOAR, + .categoryName = _("Fire Pig"), + .height = 18, + .weight = 1803, + .description = COMPOUND_STRING( + "Brandishing a blazing flame\n" + "shaped like a serpentine spear,\n" + "it rushes in to save its\n" + "imperiled allies."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sEmboarLevelUpLearnset, + .teachableLearnset = sEmboarTeachableLearnset, + .formSpeciesIdTable = sEmboarFormSpeciesIdTable, + .formChangeTable = sEmboarFormChangeTable, + }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_TEPIG #if P_FAMILY_OSHAWOTT @@ -656,8 +734,8 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = ) .levelUpLearnset = sDewottLevelUpLearnset, .teachableLearnset = sDewottTeachableLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 36, SPECIES_SAMUROTT}, - {EVO_NONE, 0, SPECIES_SAMUROTT_HISUI}), + .evolutions = EVOLUTION({EVO_LEVEL, 36, SPECIES_SAMUROTT, CONDITIONS({IF_NOT_REGION, REGION_HISUI})}, + {EVO_LEVEL, 36, SPECIES_SAMUROTT_HISUI, CONDITIONS({IF_REGION, REGION_HISUI})}), }, [SPECIES_SAMUROTT] = @@ -2766,7 +2844,85 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = ) .levelUpLearnset = sExcadrillLevelUpLearnset, .teachableLearnset = sExcadrillTeachableLearnset, + .formSpeciesIdTable = sExcadrillFormSpeciesIdTable, + .formChangeTable = sExcadrillFormChangeTable, }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_EXCADRILL_MEGA] = + { + .baseHP = 110, + .baseAttack = 165, + .baseDefense = 100, + .baseSpeed = 103, + .baseSpAttack = 65, + .baseSpDefense = 65, + .types = MON_TYPES(TYPE_GROUND, TYPE_STEEL), + .catchRate = 60, + .expYield = 178, + .evYield_Attack = 2, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FIELD), + .abilities = { ABILITY_SAND_RUSH, ABILITY_SAND_FORCE, ABILITY_MOLD_BREAKER }, + .bodyColor = BODY_COLOR_GRAY, + .noFlip = TRUE, + .speciesName = _("Excadrill"), + .cryId = CRY_EXCADRILL, // CRY_EXCADRILL_MEGA, + .natDexNum = NATIONAL_DEX_EXCADRILL, + .categoryName = _("Subterrene"), + .height = 9, + .weight = 600, + .description = COMPOUND_STRING( + "If this PokΓ©mon brings its arms and\n" + "head together to form a streamlined\n" + "shape and spins at high speeds,\n" + "it can destroy anything."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sExcadrillLevelUpLearnset, + .teachableLearnset = sExcadrillTeachableLearnset, + .formSpeciesIdTable = sExcadrillFormSpeciesIdTable, + .formChangeTable = sExcadrillFormChangeTable, + }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_DRILBUR #if P_FAMILY_AUDINO @@ -3932,7 +4088,90 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = ) .levelUpLearnset = sScolipedeLevelUpLearnset, .teachableLearnset = sScolipedeTeachableLearnset, + .formSpeciesIdTable = sScolipedeFormSpeciesIdTable, + .formChangeTable = sScolipedeFormChangeTable, }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_SCOLIPEDE_MEGA] = + { + .baseHP = 60, + .baseAttack = 140, + .baseDefense = 149, + .baseSpeed = 62, + .baseSpAttack = 75, + .baseSpDefense = 99, + .types = MON_TYPES(TYPE_BUG, TYPE_POISON), + .catchRate = 45, + #if P_UPDATED_EXP_YIELDS >= GEN_8 + .expYield = 243, + #elif P_UPDATED_EXP_YIELDS >= GEN_7 + .expYield = 218, + #else + .expYield = 214, + #endif + .evYield_Speed = 3, + .itemRare = ITEM_POISON_BARB, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_BUG), + .abilities = { ABILITY_POISON_POINT, ABILITY_SWARM, ABILITY_SPEED_BOOST }, + .bodyColor = BODY_COLOR_RED, + .speciesName = _("Scolipede"), + .cryId = CRY_SCOLIPEDE, // CRY_SCOLIPEDE_MEGA, + .natDexNum = NATIONAL_DEX_SCOLIPEDE, + .categoryName = _("Megapede"), + .height = 32, + .weight = 2305, + .description = COMPOUND_STRING( + "Its deadly venom gives off a faint\n" + "glow. The venom affects Scolipede's\n" + "mind, honing its viciousness."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sScolipedeLevelUpLearnset, + .teachableLearnset = sScolipedeTeachableLearnset, + .formSpeciesIdTable = sScolipedeFormSpeciesIdTable, + .formChangeTable = sScolipedeFormChangeTable, + }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_VENIPEDE #if P_FAMILY_COTTONEE @@ -4158,8 +4397,8 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .levelUpLearnset = sPetililLevelUpLearnset, .teachableLearnset = sPetililTeachableLearnset, .eggMoveLearnset = sPetililEggMoveLearnset, - .evolutions = EVOLUTION({EVO_ITEM, ITEM_SUN_STONE, SPECIES_LILLIGANT}, - {EVO_NONE, 0, SPECIES_LILLIGANT_HISUI}), + .evolutions = EVOLUTION({EVO_ITEM, ITEM_SUN_STONE, SPECIES_LILLIGANT, CONDITIONS({IF_NOT_REGION, REGION_HISUI})}, + {EVO_ITEM, ITEM_SUN_STONE, SPECIES_LILLIGANT_HISUI, CONDITIONS({IF_REGION, REGION_HISUI})}), }, [SPECIES_LILLIGANT] = @@ -5609,7 +5848,86 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = ) .levelUpLearnset = sScraftyLevelUpLearnset, .teachableLearnset = sScraftyTeachableLearnset, + .formSpeciesIdTable = sScraftyFormSpeciesIdTable, + .formChangeTable = sScraftyFormChangeTable, }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_SCRAFTY_MEGA] = + { + .baseHP = 65, + .baseAttack = 130, + .baseDefense = 135, + .baseSpeed = 68, + .baseSpAttack = 55, + .baseSpDefense = 135, + .types = MON_TYPES(TYPE_DARK, TYPE_FIGHTING), + .catchRate = 90, + .expYield = 171, + .evYield_Defense = 1, + .evYield_SpDefense = 1, + .itemRare = ITEM_SHED_SHELL, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 15, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FIELD, EGG_GROUP_DRAGON), + .abilities = { ABILITY_SHED_SKIN, ABILITY_MOXIE, ABILITY_INTIMIDATE }, + .bodyColor = BODY_COLOR_RED, + .speciesName = _("Scrafty"), + .cryId = CRY_SCRAFTY, + .natDexNum = NATIONAL_DEX_SCRAFTY, + .categoryName = _("Hoodlum"), + .height = 11, + .weight = 310, + .description = COMPOUND_STRING( + "Mega Evolution has caused Scrafty's\n" + "shed skin to turn white, growing\n" + "tough and supple. Of course, this\n" + "PokΓ©mon is still as feisty as ever."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sScraftyLevelUpLearnset, + .teachableLearnset = sScraftyTeachableLearnset, + .formSpeciesIdTable = sScraftyFormSpeciesIdTable, + .formChangeTable = sScraftyFormChangeTable, + }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_SCRAGGY #if P_FAMILY_SIGILYPH @@ -9540,7 +9858,84 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = ) .levelUpLearnset = sEelektrossLevelUpLearnset, .teachableLearnset = sEelektrossTeachableLearnset, + .formSpeciesIdTable = sEelektrossFormSpeciesIdTable, + .formChangeTable = sEelektrossFormChangeTable, + }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_EELEKTROSS_MEGA] = + { + .baseHP = 85, + .baseAttack = 145, + .baseDefense = 80, + .baseSpeed = 80, + .baseSpAttack = 135, + .baseSpDefense = 90, + .types = MON_TYPES(TYPE_ELECTRIC), + .catchRate = 30, + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 258 : 232, + .evYield_Attack = 3, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_SLOW, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_AMORPHOUS), + .abilities = { ABILITY_LEVITATE, ABILITY_NONE, ABILITY_NONE }, + .bodyColor = BODY_COLOR_BLUE, + .speciesName = _("Eelektross"), + .cryId = CRY_EELEKTROSS, // CRY_EELEKTROSS_MEGA, + .natDexNum = NATIONAL_DEX_EELEKTROSS, + .categoryName = _("EleFish"), + .height = 30, + .weight = 1800, + .description = COMPOUND_STRING( + "It now generates 10 times the\n" + "electricity it did before Mega\n" + "Evolving. It discharges this energy\n" + "from its false Eelektrik made of mucus."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sEelektrossLevelUpLearnset, + .teachableLearnset = sEelektrossTeachableLearnset, + .formSpeciesIdTable = sEelektrossFormSpeciesIdTable, + .formChangeTable = sEelektrossFormChangeTable, }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_TYNAMO #if P_FAMILY_ELGYEM @@ -9905,7 +10300,84 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = ) .levelUpLearnset = sChandelureLevelUpLearnset, .teachableLearnset = sChandelureTeachableLearnset, + .formSpeciesIdTable = sChandelureFormSpeciesIdTable, + .formChangeTable = sChandelureFormChangeTable, }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_CHANDELURE_MEGA] = + { + .baseHP = 60, + .baseAttack = 75, + .baseDefense = 110, + .baseSpeed = 90, + .baseSpAttack = 175, + .baseSpDefense = 110, + .types = MON_TYPES(TYPE_GHOST, TYPE_FIRE), + .catchRate = 45, + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 260 : 234, + .evYield_SpAttack = 3, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_AMORPHOUS), + .abilities = { ABILITY_FLASH_FIRE, ABILITY_FLAME_BODY, ABILITY_INFILTRATOR }, + .bodyColor = BODY_COLOR_BLACK, + .speciesName = _("Chandelure"), + .cryId = CRY_CHANDELURE, // CRY_CHANDELURE_MEGA, + .natDexNum = NATIONAL_DEX_CHANDELURE, + .categoryName = _("Luring"), + .height = 25, + .weight = 696, + .description = COMPOUND_STRING( + "One of its eyes is a window linking\n" + "our world with the afterlife.\n" + "This PokΓ©mon draws in hatred and\n" + "converts it into power."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sChandelureLevelUpLearnset, + .teachableLearnset = sChandelureTeachableLearnset, + .formSpeciesIdTable = sChandelureFormSpeciesIdTable, + .formChangeTable = sChandelureFormChangeTable, + }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_LITWICK #if P_FAMILY_AXEW @@ -11107,7 +11579,9 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = ) .levelUpLearnset = sBisharpLevelUpLearnset, .teachableLearnset = sBisharpTeachableLearnset, + #if P_GEN_9_CROSS_EVOS .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_KINGAMBIT, CONDITIONS({IF_DEFEAT_X_WITH_ITEMS, SPECIES_BISHARP, ITEM_LEADERS_CREST, 3})}), + #endif }, #if P_GEN_9_CROSS_EVOS @@ -11314,8 +11788,8 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = ) .levelUpLearnset = sRuffletLevelUpLearnset, .teachableLearnset = sRuffletTeachableLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 54, SPECIES_BRAVIARY}, - {EVO_NONE, 0, SPECIES_BRAVIARY_HISUI}), + .evolutions = EVOLUTION({EVO_LEVEL, 54, SPECIES_BRAVIARY, CONDITIONS({IF_NOT_REGION, REGION_HISUI})}, + {EVO_LEVEL, 54, SPECIES_BRAVIARY_HISUI, CONDITIONS({IF_REGION, REGION_HISUI})}), }, [SPECIES_BRAVIARY] = diff --git a/src/data/pokemon/species_info/gen_6_families.h b/src/data/pokemon/species_info/gen_6_families.h index 9dfac96c8062..3e99facb915c 100644 --- a/src/data/pokemon/species_info/gen_6_families.h +++ b/src/data/pokemon/species_info/gen_6_families.h @@ -210,7 +210,83 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = ) .levelUpLearnset = sChesnaughtLevelUpLearnset, .teachableLearnset = sChesnaughtTeachableLearnset, + .formSpeciesIdTable = sChesnaughtFormSpeciesIdTable, + .formChangeTable = sChesnaughtFormChangeTable, }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_CHESNAUGHT_MEGA] = + { + .baseHP = 88, + .baseAttack = 137, + .baseDefense = 172, + .baseSpeed = 44, + .baseSpAttack = 74, + .baseSpDefense = 115, + .types = MON_TYPES(TYPE_GRASS, TYPE_FIGHTING), + .catchRate = 45, + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 265 : 239, + .evYield_Defense = 3, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FIELD), + .abilities = { ABILITY_OVERGROW, ABILITY_NONE, ABILITY_BULLETPROOF }, + .bodyColor = BODY_COLOR_GREEN, + .speciesName = _("Chesnaught"), + .cryId = CRY_CHESNAUGHT, + .natDexNum = NATIONAL_DEX_CHESNAUGHT, + .categoryName = _("Spiny Armor"), + .height = 16, + .weight = 900, + .description = COMPOUND_STRING( + "It has fortified armor and a\n" + "will to defend at all costs.\n" + "Both are absurdly strong."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sChesnaughtLevelUpLearnset, + .teachableLearnset = sChesnaughtTeachableLearnset, + .formSpeciesIdTable = sChesnaughtFormSpeciesIdTable, + .formChangeTable = sChesnaughtFormChangeTable, + }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_CHESPIN #if P_FAMILY_FENNEKIN @@ -424,7 +500,84 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = ) .levelUpLearnset = sDelphoxLevelUpLearnset, .teachableLearnset = sDelphoxTeachableLearnset, + .formSpeciesIdTable = sDelphoxFormSpeciesIdTable, + .formChangeTable = sDelphoxFormChangeTable, }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_DELPHOX_MEGA] = + { + .baseHP = 75, + .baseAttack = 69, + .baseDefense = 72, + .baseSpeed = 134, + .baseSpAttack = 159, + .baseSpDefense = 125, + .types = MON_TYPES(TYPE_FIRE, TYPE_PSYCHIC), + .catchRate = 45, + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 267 : 240, + .evYield_SpAttack = 3, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FIELD), + .abilities = { ABILITY_BLAZE, ABILITY_NONE, ABILITY_MAGICIAN }, + .bodyColor = BODY_COLOR_RED, + .speciesName = _("Delphox"), + .cryId = CRY_DELPHOX, // CRY_DELPHOX_MEGA, + .natDexNum = NATIONAL_DEX_DELPHOX, + .categoryName = _("Fox"), + .height = 15, + .weight = 390, + .description = COMPOUND_STRING( + "It wields flaming branches to\n" + "dazzle its opponents before\n" + "incinerating them with a\n" + "huge fireball."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sDelphoxLevelUpLearnset, + .teachableLearnset = sDelphoxTeachableLearnset, + .formSpeciesIdTable = sDelphoxFormSpeciesIdTable, + .formChangeTable = sDelphoxFormChangeTable, + }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_FENNEKIN #if P_FAMILY_FROAKIE @@ -627,6 +780,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .levelUpLearnset = sGreninjaLevelUpLearnset, .teachableLearnset = sGreninjaTeachableLearnset, .formSpeciesIdTable = sGreninjaFormSpeciesIdTable, + .formChangeTable = sGreninjaFormChangeTable, }, [SPECIES_GRENINJA_BATTLE_BOND] = @@ -744,11 +898,98 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(1, 10, SHADOW_SIZE_L) FOOTPRINT(Greninja) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_GreninjaAsh, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_GreninjaAsh, + gShinyOverworldPalette_GreninjaAsh + ) + #endif //OW_BATTLE_ONLY_FORMS .levelUpLearnset = sGreninjaLevelUpLearnset, .teachableLearnset = sGreninjaTeachableLearnset, .formSpeciesIdTable = sGreninjaFormSpeciesIdTable, .formChangeTable = sGreninjaBattleBondFormChangeTable, }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_GRENINJA_MEGA] = + { + .baseHP = 72, + .baseAttack = 125, + .baseDefense = 77, + .baseSpeed = 142, + .baseSpAttack = 133, + .baseSpDefense = 81, + .types = MON_TYPES(TYPE_WATER, TYPE_DARK), + .catchRate = 45, + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 265 : 239, + .evYield_Speed = 3, + .genderRatio = PERCENT_FEMALE(12.5), + .eggCycles = 20, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_WATER_1), + .abilities = { ABILITY_TORRENT, ABILITY_NONE, ABILITY_PROTEAN }, + .bodyColor = BODY_COLOR_BLUE, + .noFlip = TRUE, + .speciesName = _("Greninja"), + .cryId = CRY_GRENINJA, // CRY_GRENINJA_MEGA, + .natDexNum = NATIONAL_DEX_GRENINJA, + .categoryName = _("Ninja"), + .height = 15, + .weight = 400, + .description = COMPOUND_STRING( + "This PokΓ©mon spins a giant\n" + "shuriken at high speed to make it\n" + "float, then clings to it upside\n" + "down to catch opponents unawares."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sGreninjaLevelUpLearnset, + .teachableLearnset = sGreninjaTeachableLearnset, + .formSpeciesIdTable = sGreninjaFormSpeciesIdTable, + .formChangeTable = sGreninjaFormChangeTable, + }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_FROAKIE #if P_FAMILY_BUNNELBY @@ -1661,7 +1902,84 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = ) .levelUpLearnset = sPyroarLevelUpLearnset, .teachableLearnset = sPyroarTeachableLearnset, + .formSpeciesIdTable = sPyroarFormSpeciesIdTable, + .formChangeTable = sPyroarFormChangeTable, + }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_PYROAR_MEGA] = + { + .baseHP = 86, + .baseAttack = 88, + .baseDefense = 92, + .baseSpeed = 126, + .baseSpAttack = 129, + .baseSpDefense = 86, + .types = MON_TYPES(TYPE_FIRE, TYPE_NORMAL), + .catchRate = 65, + .expYield = 177, + .evYield_SpAttack = 2, + .genderRatio = PERCENT_FEMALE(87.5), + .eggCycles = 20, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FIELD), + .abilities = { ABILITY_RIVALRY, ABILITY_UNNERVE, ABILITY_MOXIE }, + .bodyColor = BODY_COLOR_BROWN, + .speciesName = _("Pyroar"), + .cryId = CRY_PYROAR, // CRY_PYROAR_MEGA, + .natDexNum = NATIONAL_DEX_PYROAR, + .categoryName = _("Royal"), + .height = 15, + .weight = 933, + .description = COMPOUND_STRING( + "This PokΓ©mon spews flames hotter\n" + "than 18,000 degrees Fahrenheit.\n" + "It swings around its grand, blazing\n" + "mane as it protects its allies."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sPyroarLevelUpLearnset, + .teachableLearnset = sPyroarTeachableLearnset, + .formSpeciesIdTable = sPyroarFormSpeciesIdTable, + .formChangeTable = sPyroarFormChangeTable, }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_LITLEO #if P_FAMILY_FLABEBE @@ -1904,6 +2222,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .backPicYOffset = 2, .levelUpLearnset = sFloetteEternalLevelUpLearnset, .teachableLearnset = sFloetteEternalTeachableLearnset, + .formChangeTable = sFloetteEternalFormChangeTable, }, #define FLORGES_MISC_INFO(Form, iconPal) \ @@ -2007,6 +2326,81 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "decorated with flowering plants of\n" "many different colors."), }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_FLOETTE_MEGA] = + { + .baseHP = 74, + .baseAttack = 85, + .baseDefense = 87, + .baseSpeed = 102, + .baseSpAttack = 155, + .baseSpDefense = 148, + .types = MON_TYPES(TYPE_FAIRY), + .catchRate = 120, + .expYield = 1, + .evYield_SpDefense = 2, + .genderRatio = MON_FEMALE, + .eggCycles = 20, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED), + .abilities = { ABILITY_FLOWER_VEIL, ABILITY_NONE, ABILITY_SYMBIOSIS }, + .bodyColor = BODY_COLOR_WHITE, + .speciesName = _("Floette"), + .cryId = CRY_FLOETTE_ETERNAL, // CRY_FLOETTE_MEGA, + .natDexNum = NATIONAL_DEX_FLOETTE, + .categoryName = _("Single Bloom"), + // height + // weight + .description = COMPOUND_STRING( + "The Eternal Flower has absorbed\n" + "all the energy from Mega\n" + "Evolution. The flower now attacks\n" + "enemies on its own."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sFloetteEternalLevelUpLearnset, + .teachableLearnset = sFloetteEternalTeachableLearnset, + .formSpeciesIdTable = sFloetteFormSpeciesIdTable, + .formChangeTable = sFloetteEternalFormChangeTable, + }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_FLABEBE #if P_FAMILY_SKIDDO @@ -3284,7 +3678,84 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = ) .levelUpLearnset = sMalamarLevelUpLearnset, .teachableLearnset = sMalamarTeachableLearnset, + .formSpeciesIdTable = sMalamarFormSpeciesIdTable, + .formChangeTable = sMalamarFormChangeTable, }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_MALAMAR_MEGA] = + { + .baseHP = 86, + .baseAttack = 102, + .baseDefense = 88, + .baseSpeed = 88, + .baseSpAttack = 98, + .baseSpDefense = 120, + .types = MON_TYPES(TYPE_DARK, TYPE_PSYCHIC), + .catchRate = 80, + .expYield = 169, + .evYield_Attack = 2, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_WATER_1, EGG_GROUP_WATER_2), + .abilities = { ABILITY_CONTRARY, ABILITY_SUCTION_CUPS, ABILITY_INFILTRATOR }, + .bodyColor = BODY_COLOR_BLUE, + .speciesName = _("Malamar"), + .cryId = CRY_MALAMAR, // CRY_MALAMAR_MEGA, + .natDexNum = NATIONAL_DEX_MALAMAR, + .categoryName = _("Overturning"), + .height = 29, + .weight = 698, + .description = COMPOUND_STRING( + "It uses its colorful lights to\n" + "overwrite the personality and\n" + "memories of others-and to\n" + "control them."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sMalamarLevelUpLearnset, + .teachableLearnset = sMalamarTeachableLearnset, + .formSpeciesIdTable = sMalamarFormSpeciesIdTable, + .formChangeTable = sMalamarFormChangeTable, + }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_INKAY #if P_FAMILY_BINACLE @@ -3425,7 +3896,84 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = ) .levelUpLearnset = sBarbaracleLevelUpLearnset, .teachableLearnset = sBarbaracleTeachableLearnset, + .formSpeciesIdTable = sBarbaracleFormSpeciesIdTable, + .formChangeTable = sBarbaracleFormChangeTable, }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_BARBARACLE_MEGA] = + { + .baseHP = 72, + .baseAttack = 140, + .baseDefense = 130, + .baseSpeed = 88, + .baseSpAttack = 64, + .baseSpDefense = 106, + .types = MON_TYPES(TYPE_ROCK, TYPE_FIGHTING), + .catchRate = 45, + .expYield = 175, + .evYield_Attack = 2, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_WATER_3), + .abilities = { ABILITY_TOUGH_CLAWS, ABILITY_SNIPER, ABILITY_PICKPOCKET }, + .bodyColor = BODY_COLOR_BROWN, + .noFlip = TRUE, + .speciesName = _("Barbaracle"), + .cryId = CRY_BARBARACLE, // CRY_BARBARACLE_MEGA, + .natDexNum = NATIONAL_DEX_BARBARACLE, + .categoryName = _("Collective"), + .height = 22, + .weight = 1000, + .description = COMPOUND_STRING( + "It uses its many arms to toy\n" + "with its opponents. This\n" + "keeps the head extremely busy."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sBarbaracleLevelUpLearnset, + .teachableLearnset = sBarbaracleTeachableLearnset, + .formSpeciesIdTable = sBarbaracleFormSpeciesIdTable, + .formChangeTable = sBarbaracleFormChangeTable, + }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_BINACLE #if P_FAMILY_SKRELP @@ -3569,7 +4117,84 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = ) .levelUpLearnset = sDragalgeLevelUpLearnset, .teachableLearnset = sDragalgeTeachableLearnset, + .formSpeciesIdTable = sDragalgeFormSpeciesIdTable, + .formChangeTable = sDragalgeFormChangeTable, }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_DRAGALGE_MEGA] = + { + .baseHP = 65, + .baseAttack = 85, + .baseDefense = 105, + .baseSpeed = 44, + .baseSpAttack = 132, + .baseSpDefense = 163, + .types = MON_TYPES(TYPE_POISON, TYPE_DRAGON), + .catchRate = 55, + .expYield = 173, + .evYield_SpDefense = 2, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_WATER_1, EGG_GROUP_DRAGON), + .abilities = { ABILITY_POISON_POINT, ABILITY_POISON_TOUCH, ABILITY_ADAPTABILITY }, + .bodyColor = BODY_COLOR_BROWN, + .speciesName = _("Dragalge"), + .cryId = CRY_DRAGALGE, // CRY_DRAGALGE_MEGA, + .natDexNum = NATIONAL_DEX_DRAGALGE, + .categoryName = _("Mock Kelp"), + .height = 21, + .weight = 1003, + .description = COMPOUND_STRING( + "It spits a liquid that causes the\n" + "regenerative power of cells to run\n" + "wild. The liquid is deadly poison\n" + "to everything other than itself."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sDragalgeLevelUpLearnset, + .teachableLearnset = sDragalgeTeachableLearnset, + .formSpeciesIdTable = sDragalgeFormSpeciesIdTable, + .formChangeTable = sDragalgeFormChangeTable, + }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_SKRELP #if P_FAMILY_CLAUNCHER @@ -4212,7 +4837,84 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .levelUpLearnset = sHawluchaLevelUpLearnset, .teachableLearnset = sHawluchaTeachableLearnset, .eggMoveLearnset = sHawluchaEggMoveLearnset, + .formSpeciesIdTable = sHawluchaFormSpeciesIdTable, + .formChangeTable = sHawluchaFormChangeTable, + }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_HAWLUCHA_MEGA] = + { + .baseHP = 78, + .baseAttack = 137, + .baseDefense = 100, + .baseSpeed = 118, + .baseSpAttack = 74, + .baseSpDefense = 93, + .types = MON_TYPES(TYPE_FIGHTING, TYPE_FLYING), + .catchRate = 100, + .expYield = 175, + .evYield_Attack = 2, + .itemRare = ITEM_KINGS_ROCK, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FLYING, EGG_GROUP_HUMAN_LIKE), + .abilities = { ABILITY_LIMBER, ABILITY_UNBURDEN, ABILITY_MOLD_BREAKER }, + .bodyColor = BODY_COLOR_GREEN, + .speciesName = _("Hawlucha"), + .cryId = CRY_HAWLUCHA, // CRY_HAWLUCHA_MEGA, + .natDexNum = NATIONAL_DEX_HAWLUCHA, + .categoryName = _("Wrestling"), + .height = 10, + .weight = 250, + .description = COMPOUND_STRING( + "Mega Evolution has pumped up all\n" + "its muscles. Hawlucha flexes to\n" + "show off its strength."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sHawluchaLevelUpLearnset, + .teachableLearnset = sHawluchaTeachableLearnset, + .formSpeciesIdTable = sHawluchaFormSpeciesIdTable, + .formChangeTable = sHawluchaFormChangeTable, }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_HAWLUCHA #if P_FAMILY_DEDENNE @@ -4430,8 +5132,8 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .levelUpLearnset = sGoomyLevelUpLearnset, .teachableLearnset = sGoomyTeachableLearnset, .eggMoveLearnset = sGoomyEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 40, SPECIES_SLIGGOO}, - {EVO_NONE, 0, SPECIES_SLIGGOO_HISUI}), + .evolutions = EVOLUTION({EVO_LEVEL, 40, SPECIES_SLIGGOO, CONDITIONS({IF_NOT_REGION, REGION_HISUI})}, + {EVO_LEVEL, 40, SPECIES_SLIGGOO_HISUI, CONDITIONS({IF_REGION, REGION_HISUI})}), }, [SPECIES_SLIGGOO] = @@ -5535,8 +6237,8 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .levelUpLearnset = sBergmiteLevelUpLearnset, .teachableLearnset = sBergmiteTeachableLearnset, .eggMoveLearnset = sBergmiteEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 37, SPECIES_AVALUGG}, - {EVO_NONE, 0, SPECIES_AVALUGG_HISUI}), + .evolutions = EVOLUTION({EVO_LEVEL, 37, SPECIES_AVALUGG, CONDITIONS({IF_NOT_REGION, REGION_HISUI})}, + {EVO_LEVEL, 37, SPECIES_AVALUGG_HISUI, CONDITIONS({IF_REGION, REGION_HISUI})}), }, [SPECIES_AVALUGG] = @@ -6361,6 +7063,82 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .formSpeciesIdTable = sZygardeFormSpeciesIdTable, .formChangeTable = sZygardeCompleteFormChangeTable, }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_ZYGARDE_MEGA] = + { + .baseHP = 216, + .baseAttack = 70, + .baseDefense = 91, + .baseSpeed = 100, + .baseSpAttack = 216, + .baseSpDefense = 85, + .types = MON_TYPES(TYPE_DRAGON, TYPE_GROUND), + .catchRate = 3, + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 354 : 319, + .evYield_HP = 3, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 0, + .growthRate = GROWTH_SLOW, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED), + .abilities = { ABILITY_AURA_BREAK, ABILITY_NONE, ABILITY_NONE }, + .bodyColor = BODY_COLOR_BLACK, + .noFlip = TRUE, + .speciesName = _("Zygarde"), + .cryId = CRY_ZYGARDE_COMPLETE, // CRY_ZYGARDE_MEGA, + .natDexNum = NATIONAL_DEX_ZYGARDE, + .categoryName = _("Order"), + .height = 77, + .weight = 6100, + .description = COMPOUND_STRING( + "In response to people's emotions\n" + "during an unprecedented crisis,\n" + "Zygarde Mega Evolves and calms the\n" + "situation with its unmatched power."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sZygardeLevelUpLearnset, + .teachableLearnset = sZygardeTeachableLearnset, + .formSpeciesIdTable = sZygardeFormSpeciesIdTable, + .formChangeTable = sZygardeCompleteFormChangeTable, + }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_ZYGARDE #if P_FAMILY_DIANCIE diff --git a/src/data/pokemon/species_info/gen_7_families.h b/src/data/pokemon/species_info/gen_7_families.h index d264f830adb9..3b982f2c22de 100644 --- a/src/data/pokemon/species_info/gen_7_families.h +++ b/src/data/pokemon/species_info/gen_7_families.h @@ -137,8 +137,8 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = ) .levelUpLearnset = sDartrixLevelUpLearnset, .teachableLearnset = sDartrixTeachableLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 34, SPECIES_DECIDUEYE}, - {EVO_NONE, 0, SPECIES_DECIDUEYE_HISUI}), + .evolutions = EVOLUTION({EVO_LEVEL, 34, SPECIES_DECIDUEYE, CONDITIONS({IF_NOT_REGION, REGION_HISUI})}, + {EVO_LEVEL, 36, SPECIES_DECIDUEYE_HISUI, CONDITIONS({IF_REGION, REGION_HISUI})}), }, [SPECIES_DECIDUEYE] = @@ -5203,7 +5203,85 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .levelUpLearnset = sDrampaLevelUpLearnset, .teachableLearnset = sDrampaTeachableLearnset, .eggMoveLearnset = sDrampaEggMoveLearnset, + .formSpeciesIdTable = sDrampaFormSpeciesIdTable, + .formChangeTable = sDrampaFormChangeTable, }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_DRAMPA_MEGA] = + { + .baseHP = 78, + .baseAttack = 85, + .baseDefense = 110, + .baseSpeed = 36, + .baseSpAttack = 160, + .baseSpDefense = 116, + .types = MON_TYPES(TYPE_NORMAL, TYPE_DRAGON), + .catchRate = 70, + .expYield = 170, + .evYield_SpAttack = 2, + .itemRare = ITEM_PERSIM_BERRY, + .genderRatio = PERCENT_FEMALE(50), + .eggCycles = 20, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_MONSTER, EGG_GROUP_DRAGON), + .abilities = { ABILITY_BERSERK, ABILITY_SAP_SIPPER, ABILITY_CLOUD_NINE }, + .bodyColor = BODY_COLOR_WHITE, + .speciesName = _("Drampa"), + .cryId = CRY_DRAMPA, // CRY_DRAMPA_MEGA, + .natDexNum = NATIONAL_DEX_DRAMPA, + .categoryName = _("Imposing"), + .height = 3, + .weight = 2405, + .description = COMPOUND_STRING( + "Drampa's cells have been\n" + "invigorated, allowing it to regain\n" + "its youth. It manipulates the\n" + "atmosphere to summon storms."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sDrampaLevelUpLearnset, + .teachableLearnset = sDrampaTeachableLearnset, + .formSpeciesIdTable = sDrampaFormSpeciesIdTable, + .formChangeTable = sDrampaFormChangeTable, + }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_DRAMPA #if P_FAMILY_DHELMISE diff --git a/src/data/pokemon/species_info/gen_8_families.h b/src/data/pokemon/species_info/gen_8_families.h index 8495287bf784..04dc82f4931a 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -2466,8 +2466,11 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .teachableLearnset = sApplinTeachableLearnset, .eggMoveLearnset = sApplinEggMoveLearnset, .evolutions = EVOLUTION({EVO_ITEM, ITEM_TART_APPLE, SPECIES_FLAPPLE}, - {EVO_ITEM, ITEM_SWEET_APPLE, SPECIES_APPLETUN}, - {EVO_ITEM, ITEM_SYRUPY_APPLE, SPECIES_DIPPLIN}), + {EVO_ITEM, ITEM_SWEET_APPLE, SPECIES_APPLETUN} + #if P_GEN_9_CROSS_EVOS + ,{EVO_ITEM, ITEM_SYRUPY_APPLE, SPECIES_DIPPLIN} + #endif + ), }, [SPECIES_FLAPPLE] = @@ -5238,7 +5241,85 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = ) .levelUpLearnset = sFalinksLevelUpLearnset, .teachableLearnset = sFalinksTeachableLearnset, + .formSpeciesIdTable = sFalinksFormSpeciesIdTable, + .formChangeTable = sFalinksFormChangeTable, }, + +#if P_GEN_9_MEGA_EVOLUTIONS + [SPECIES_FALINKS_MEGA] = + { + .baseHP = 65, + .baseAttack = 135, + .baseDefense = 135, + .baseSpeed = 100, + .baseSpAttack = 70, + .baseSpDefense = 65, + .types = MON_TYPES(TYPE_FIGHTING), + .catchRate = 45, + .expYield = 165, + .evYield_Attack = 2, + .evYield_SpDefense = 1, + .genderRatio = MON_GENDERLESS, + .eggCycles = 25, + .friendship = STANDARD_FRIENDSHIP, + .growthRate = GROWTH_MEDIUM_FAST, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FAIRY, EGG_GROUP_MINERAL), + .abilities = { ABILITY_BATTLE_ARMOR, ABILITY_NONE, ABILITY_DEFIANT }, + .bodyColor = BODY_COLOR_YELLOW, + .speciesName = _("Falinks"), + .cryId = CRY_FALINKS, + .natDexNum = NATIONAL_DEX_FALINKS, + .categoryName = _("Formation"), + .height = 16, + .weight = 990, + .description = COMPOUND_STRING( + "Mega Falinks has taken on the\n" + "ultimate battle formation, which\n" + "can be achieved only if the troopers\n" + "and brass have the strongest of bonds."), + .frontPic = gMonFrontPic_CircledQuestionMark, + .frontPicSize = MON_COORDS_SIZE(40, 40), + .frontPicYOffset = 12, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .backPic = gMonBackPic_CircledQuestionMark, + .backPicSize = MON_COORDS_SIZE(40, 40), + .backPicYOffset = 12, + .backAnimId = BACK_ANIM_NONE, + .palette = gMonPalette_CircledQuestionMark, + .shinyPalette = gMonShinyPalette_CircledQuestionMark, + .iconSprite = gMonIcon_QuestionMark, + .iconPalIndex = 0, + .pokemonJumpType = PKMN_JUMP_TYPE_NONE, + FOOTPRINT(QuestionMark) + SHADOW(-1, 0, SHADOW_SIZE_M) + #if OW_BATTLE_ONLY_FORMS + .overworldData = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_M, + .inanimate = FALSE, + .compressed = COMP, + .tracks = TRACKS_FOOT, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Following, + .images = sPicTable_Substitute, + .affineAnims = gDummySpriteAffineAnimTable, + }, + #endif //OW_BATTLE_ONLY_FORMS + .isMegaEvolution = TRUE, + .levelUpLearnset = sFalinksLevelUpLearnset, + .teachableLearnset = sFalinksTeachableLearnset, + .formSpeciesIdTable = sFalinksFormSpeciesIdTable, + .formChangeTable = sFalinksFormChangeTable, + }, +#endif //P_GEN_9_MEGA_EVOLUTIONS #endif //P_FAMILY_FALINKS #if P_FAMILY_PINCURCHIN @@ -6405,7 +6486,9 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .eggMoveLearnset = sDuraludonEggMoveLearnset, .formSpeciesIdTable = sDuraludonFormSpeciesIdTable, .formChangeTable = sDuraludonFormChangeTable, + #if P_GEN_9_CROSS_EVOS .evolutions = EVOLUTION({EVO_ITEM, ITEM_METAL_ALLOY, SPECIES_ARCHALUDON}), + #endif }, #if P_GIGANTAMAX_FORMS diff --git a/src/data/pokemon/teachable_learnsets.h b/src/data/pokemon/teachable_learnsets.h index ae04d18e68e0..970cde222afa 100644 --- a/src/data/pokemon/teachable_learnsets.h +++ b/src/data/pokemon/teachable_learnsets.h @@ -909,8 +909,10 @@ static const u16 sArbokTeachableLearnset[] = { static const u16 sPichuTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BODY_SLAM, + MOVE_BRICK_BREAK, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_ENDURE, @@ -1501,6 +1503,7 @@ static const u16 sNidokingTeachableLearnset[] = { #if P_GEN_2_CROSS_EVOS static const u16 sCleffaTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BLIZZARD, MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_COUNTER, @@ -1514,6 +1517,7 @@ static const u16 sCleffaTeachableLearnset[] = { MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_ICE_BEAM, MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, @@ -1539,6 +1543,8 @@ static const u16 sCleffaTeachableLearnset[] = { MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -4113,6 +4119,7 @@ static const u16 sSlowbroGalarTeachableLearnset[] = { MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_HAIL, MOVE_HYPER_BEAM, @@ -4139,6 +4146,7 @@ static const u16 sSlowbroGalarTeachableLearnset[] = { MOVE_SUNNY_DAY, MOVE_SURF, MOVE_SWIFT, + MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, @@ -6401,6 +6409,7 @@ static const u16 sStaryuTeachableLearnset[] = { MOVE_REFLECT, MOVE_REST, MOVE_ROLLOUT, + MOVE_SAFEGUARD, MOVE_SLEEP_TALK, MOVE_SNORE, MOVE_SURF, @@ -6418,6 +6427,7 @@ static const u16 sStaryuTeachableLearnset[] = { static const u16 sStarmieTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BULK_UP, MOVE_DIVE, MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, @@ -6437,6 +6447,7 @@ static const u16 sStarmieTeachableLearnset[] = { MOVE_REFLECT, MOVE_REST, MOVE_ROLLOUT, + MOVE_SAFEGUARD, MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, MOVE_SNORE, @@ -7073,6 +7084,7 @@ static const u16 sMagmortarTeachableLearnset[] = { #if P_FAMILY_PINSIR static const u16 sPinsirTeachableLearnset[] = { + MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BODY_SLAM, MOVE_BRICK_BREAK, @@ -7373,6 +7385,7 @@ static const u16 sVaporeonTeachableLearnset[] = { MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -7442,6 +7455,8 @@ static const u16 sFlareonTeachableLearnset[] = { MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -7471,6 +7486,7 @@ static const u16 sEspeonTeachableLearnset[] = { MOVE_REST, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SAFEGUARD, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, @@ -7556,6 +7572,7 @@ static const u16 sLeafeonTeachableLearnset[] = { MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -7588,6 +7605,7 @@ static const u16 sGlaceonTeachableLearnset[] = { MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -7626,6 +7644,7 @@ static const u16 sSylveonTeachableLearnset[] = { MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -14445,6 +14464,7 @@ static const u16 sSableyeTeachableLearnset[] = { MOVE_REST, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SAFEGUARD, MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, @@ -14974,6 +14994,7 @@ static const u16 sIllumiseTeachableLearnset[] = { #if P_GEN_4_CROSS_EVOS static const u16 sBudewTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, MOVE_DOUBLE_TEAM, @@ -16512,6 +16533,7 @@ static const u16 sShuppetTeachableLearnset[] = { MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, @@ -19381,6 +19403,7 @@ static const u16 sBunearyTeachableLearnset[] = { MOVE_DIG, MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_PUNCH, @@ -19419,6 +19442,7 @@ static const u16 sLopunnyTeachableLearnset[] = { MOVE_DIG, MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_PUNCH, @@ -19444,6 +19468,7 @@ static const u16 sLopunnyTeachableLearnset[] = { MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, @@ -19778,6 +19803,7 @@ static const u16 sGabiteTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BODY_SLAM, + MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_EDGE, @@ -21372,6 +21398,7 @@ static const u16 sPatratTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_IRON_TAIL, MOVE_PROTECT, @@ -21394,8 +21421,10 @@ static const u16 sWatchogTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, @@ -21417,6 +21446,7 @@ static const u16 sWatchogTeachableLearnset[] = { MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_THUNDER, MOVE_THUNDERBOLT, @@ -21576,10 +21606,12 @@ static const u16 sLiepardTeachableLearnset[] = { #if P_FAMILY_PANSAGE static const u16 sPansageTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, @@ -21587,6 +21619,7 @@ static const u16 sPansageTeachableLearnset[] = { MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SLEEP_TALK, @@ -21594,6 +21627,7 @@ static const u16 sPansageTeachableLearnset[] = { MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -21608,6 +21642,7 @@ static const u16 sSimisageTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, @@ -21624,6 +21659,7 @@ static const u16 sSimisageTeachableLearnset[] = { MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -21635,9 +21671,11 @@ static const u16 sSimisageTeachableLearnset[] = { #if P_FAMILY_PANSEAR static const u16 sPansearTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, @@ -21647,6 +21685,7 @@ static const u16 sPansearTeachableLearnset[] = { MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SLEEP_TALK, @@ -21654,6 +21693,7 @@ static const u16 sPansearTeachableLearnset[] = { MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -21667,6 +21707,7 @@ static const u16 sSimisearTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, @@ -21685,6 +21726,7 @@ static const u16 sSimisearTeachableLearnset[] = { MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -21697,10 +21739,12 @@ static const u16 sSimisearTeachableLearnset[] = { static const u16 sPanpourTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, MOVE_HAIL, @@ -21711,12 +21755,14 @@ static const u16 sPanpourTeachableLearnset[] = { MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SLEEP_TALK, MOVE_SNORE, MOVE_SURF, MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -21734,6 +21780,7 @@ static const u16 sSimipourTeachableLearnset[] = { MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, MOVE_HAIL, @@ -21752,6 +21799,7 @@ static const u16 sSimipourTeachableLearnset[] = { MOVE_SNORE, MOVE_SURF, MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -22558,6 +22606,7 @@ static const u16 sVenipedeTeachableLearnset[] = { MOVE_PROTECT, MOVE_REST, MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, @@ -22580,6 +22629,7 @@ static const u16 sWhirlipedeTeachableLearnset[] = { MOVE_PROTECT, MOVE_REST, MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, @@ -22823,6 +22873,7 @@ static const u16 sBasculegionTeachableLearnset[] = { #if P_FAMILY_SANDILE static const u16 sSandileTeachableLearnset[] = { + MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BODY_SLAM, MOVE_BRICK_BREAK, @@ -22831,6 +22882,7 @@ static const u16 sSandileTeachableLearnset[] = { MOVE_DIG, MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_ENDURE, MOVE_FACADE, @@ -23166,6 +23218,7 @@ static const u16 sScraggyTeachableLearnset[] = { MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_PUNCH, @@ -23206,6 +23259,7 @@ static const u16 sScraftyTeachableLearnset[] = { MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_PUNCH, @@ -23513,6 +23567,7 @@ static const u16 sArcheopsTeachableLearnset[] = { #if P_FAMILY_TRUBBISH static const u16 sTrubbishTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, MOVE_ENDURE, MOVE_EXPLOSION, @@ -23535,6 +23590,7 @@ static const u16 sTrubbishTeachableLearnset[] = { static const u16 sGarbodorTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BODY_SLAM, + MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, MOVE_ENDURE, MOVE_EXPLOSION, @@ -24568,6 +24624,7 @@ static const u16 sKlinklangTeachableLearnset[] = { #if P_FAMILY_TYNAMO static const u16 sTynamoTeachableLearnset[] = { + MOVE_PROTECT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -24633,6 +24690,7 @@ static const u16 sEelektrossTeachableLearnset[] = { MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_WATERFALL, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TYNAMO @@ -25106,6 +25164,7 @@ static const u16 sStunfiskGalarTeachableLearnset[] = { MOVE_SNORE, MOVE_SURF, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GALARIAN_FORMS @@ -26523,6 +26582,7 @@ static const u16 sFrogadierTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BRICK_BREAK, MOVE_COUNTER, MOVE_CUT, MOVE_DIG, @@ -26762,6 +26822,7 @@ static const u16 sTalonflameTeachableLearnset[] = { #if P_FAMILY_SCATTERBUG static const u16 sScatterbugTeachableLearnset[] = { + MOVE_PROTECT, MOVE_UNAVAILABLE, }; @@ -26926,6 +26987,7 @@ static const u16 sFloetteEternalTeachableLearnset[] = { MOVE_FACADE, MOVE_FLASH, MOVE_GIGA_DRAIN, + MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_METRONOME, MOVE_PROTECT, @@ -27099,6 +27161,7 @@ static const u16 sPangoroTeachableLearnset[] = { MOVE_FACADE, MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_GIGA_DRAIN, MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, @@ -27133,9 +27196,12 @@ static const u16 sPangoroTeachableLearnset[] = { static const u16 sFurfrouTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, @@ -27217,6 +27283,7 @@ static const u16 sMeowsticMTeachableLearnset[] = { MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_TORMENT, @@ -27257,6 +27324,7 @@ static const u16 sMeowsticFTeachableLearnset[] = { MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ESPURR @@ -27417,6 +27485,7 @@ static const u16 sSwirlixTeachableLearnset[] = { MOVE_SUNNY_DAY, MOVE_SURF, MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDERBOLT, MOVE_TOXIC, @@ -27446,6 +27515,7 @@ static const u16 sSlurpuffTeachableLearnset[] = { MOVE_SUNNY_DAY, MOVE_SURF, MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, @@ -27491,6 +27561,7 @@ static const u16 sInkayTeachableLearnset[] = { static const u16 sMalamarTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BULK_UP, MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, @@ -27558,6 +27629,7 @@ static const u16 sBinacleTeachableLearnset[] = { MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_WATERFALL, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -27600,6 +27672,7 @@ static const u16 sBarbaracleTeachableLearnset[] = { MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_WATERFALL, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -28061,6 +28134,7 @@ static const u16 sGoomyTeachableLearnset[] = { MOVE_SLUDGE_BOMB, MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SURF, MOVE_SWAGGER, MOVE_THUNDERBOLT, MOVE_TOXIC, @@ -28087,6 +28161,7 @@ static const u16 sSliggooTeachableLearnset[] = { MOVE_SLUDGE_BOMB, MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SURF, MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, @@ -28109,6 +28184,7 @@ static const u16 sGoodraTeachableLearnset[] = { MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_GIGA_DRAIN, MOVE_HAIL, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, @@ -28154,8 +28230,10 @@ static const u16 sSliggooHisuiTeachableLearnset[] = { MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, + MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -28188,6 +28266,7 @@ static const u16 sGoodraHisuiTeachableLearnset[] = { MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -28441,6 +28520,7 @@ static const u16 sAvaluggHisuiTeachableLearnset[] = { MOVE_ROCK_TOMB, MOVE_SANDSTORM, MOVE_SLEEP_TALK, + MOVE_SURF, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -30524,6 +30604,7 @@ static const u16 sBruxishTeachableLearnset[] = { static const u16 sDrampaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, @@ -32096,6 +32177,7 @@ static const u16 sDipplinTeachableLearnset[] = { static const u16 sHydrappleTeachableLearnset[] = { MOVE_BODY_SLAM, MOVE_BULLET_SEED, + MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_ENDURE, @@ -32106,6 +32188,7 @@ static const u16 sHydrappleTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, diff --git a/src/data/pokemon/trainer_class_lookups.h b/src/data/pokemon/trainer_class_lookups.h index 963537520c94..9ce0b629e3c5 100644 --- a/src/data/pokemon/trainer_class_lookups.h +++ b/src/data/pokemon/trainer_class_lookups.h @@ -84,19 +84,7 @@ const u16 gFacilityClassToPicIndex[] = [FACILITY_CLASS_RS_MAY] = TRAINER_PIC_RS_MAY, }; -const u16 gTrainerPicToTrainerBackPic[] = -{ - [TRAINER_BACK_PIC_BRENDAN] = TRAINER_PIC_BRENDAN, - [TRAINER_BACK_PIC_MAY] = TRAINER_PIC_MAY, - [TRAINER_BACK_PIC_RED] = TRAINER_PIC_RED, - [TRAINER_BACK_PIC_LEAF] = TRAINER_PIC_LEAF, - [TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN] = TRAINER_PIC_RS_BRENDAN, - [TRAINER_BACK_PIC_RUBY_SAPPHIRE_MAY] = TRAINER_PIC_RS_MAY, - [TRAINER_BACK_PIC_WALLY] = TRAINER_PIC_WALLY, - [TRAINER_BACK_PIC_STEVEN] = TRAINER_PIC_STEVEN, -}; - -const u16 gFacilityClassToTrainerClass[] = +const enum TrainerClassID gFacilityClassToTrainerClass[] = { [FACILITY_CLASS_HIKER] = TRAINER_CLASS_HIKER, [FACILITY_CLASS_AQUA_GRUNT_M] = TRAINER_CLASS_TEAM_AQUA, diff --git a/src/data/region_map/city_map_tilemaps.h b/src/data/region_map/city_map_tilemaps.h index 11a48c15dc41..52df1c0086f7 100644 --- a/src/data/region_map/city_map_tilemaps.h +++ b/src/data/region_map/city_map_tilemaps.h @@ -1,22 +1,22 @@ -const u32 gPokenavCityMap_Lavaridge_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/lavaridge_0.bin.lz"); -const u32 gPokenavCityMap_Fallarbor_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/fallarbor_0.bin.lz"); -const u32 gPokenavCityMap_Fortree_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/fortree_0.bin.lz"); -const u32 gPokenavCityMap_Slateport_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/slateport_0.bin.lz"); -const u32 gPokenavCityMap_Slateport_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/slateport_1.bin.lz"); -const u32 gPokenavCityMap_Rustboro_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/rustboro_0.bin.lz"); -const u32 gPokenavCityMap_Rustboro_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/rustboro_1.bin.lz"); -const u32 gPokenavCityMap_Pacifidlog_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/pacifidlog_0.bin.lz"); -const u32 gPokenavCityMap_Mauville_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/mauville_1.bin.lz"); -const u32 gPokenavCityMap_Mauville_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/mauville_0.bin.lz"); -const u32 gPokenavCityMap_Oldale_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/oldale_0.bin.lz"); -const u32 gPokenavCityMap_Lilycove_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/lilycove_1.bin.lz"); -const u32 gPokenavCityMap_Lilycove_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/lilycove_0.bin.lz"); -const u32 gPokenavCityMap_Littleroot_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/littleroot_0.bin.lz"); -const u32 gPokenavCityMap_Dewford_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/dewford_0.bin.lz"); -const u32 gPokenavCityMap_Sootopolis_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/sootopolis_0.bin.lz"); -const u32 gPokenavCityMap_EverGrande_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/ever_grande_0.bin.lz"); -const u32 gPokenavCityMap_EverGrande_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/ever_grande_1.bin.lz"); -const u32 gPokenavCityMap_Verdanturf_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/verdanturf_0.bin.lz"); -const u32 gPokenavCityMap_Mossdeep_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/mossdeep_1.bin.lz"); -const u32 gPokenavCityMap_Mossdeep_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/mossdeep_0.bin.lz"); -const u32 gPokenavCityMap_Petalburg_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/petalburg_0.bin.lz"); +const u32 gPokenavCityMap_Lavaridge_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/lavaridge_0.bin.smolTM"); +const u32 gPokenavCityMap_Fallarbor_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/fallarbor_0.bin.smolTM"); +const u32 gPokenavCityMap_Fortree_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/fortree_0.bin.smolTM"); +const u32 gPokenavCityMap_Slateport_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/slateport_0.bin.smolTM"); +const u32 gPokenavCityMap_Slateport_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/slateport_1.bin.smolTM"); +const u32 gPokenavCityMap_Rustboro_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/rustboro_0.bin.smolTM"); +const u32 gPokenavCityMap_Rustboro_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/rustboro_1.bin.smolTM"); +const u32 gPokenavCityMap_Pacifidlog_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/pacifidlog_0.bin.smolTM"); +const u32 gPokenavCityMap_Mauville_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/mauville_1.bin.smolTM"); +const u32 gPokenavCityMap_Mauville_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/mauville_0.bin.smolTM"); +const u32 gPokenavCityMap_Oldale_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/oldale_0.bin.smolTM"); +const u32 gPokenavCityMap_Lilycove_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/lilycove_1.bin.smolTM"); +const u32 gPokenavCityMap_Lilycove_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/lilycove_0.bin.smolTM"); +const u32 gPokenavCityMap_Littleroot_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/littleroot_0.bin.smolTM"); +const u32 gPokenavCityMap_Dewford_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/dewford_0.bin.smolTM"); +const u32 gPokenavCityMap_Sootopolis_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/sootopolis_0.bin.smolTM"); +const u32 gPokenavCityMap_EverGrande_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/ever_grande_0.bin.smolTM"); +const u32 gPokenavCityMap_EverGrande_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/ever_grande_1.bin.smolTM"); +const u32 gPokenavCityMap_Verdanturf_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/verdanturf_0.bin.smolTM"); +const u32 gPokenavCityMap_Mossdeep_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/mossdeep_1.bin.smolTM"); +const u32 gPokenavCityMap_Mossdeep_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/mossdeep_0.bin.smolTM"); +const u32 gPokenavCityMap_Petalburg_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/petalburg_0.bin.smolTM"); diff --git a/src/data/region_map/region_map_layout.h b/src/data/region_map/region_map_layout.h index 95a4e94f3120..32ce91724d97 100644 --- a/src/data/region_map/region_map_layout.h +++ b/src/data/region_map/region_map_layout.h @@ -1,4 +1,4 @@ -static const u8 sRegionMap_MapSectionLayout[MAP_HEIGHT][MAP_WIDTH] = { +static const mapsec_u8_t sRegionMap_MapSectionLayout[MAP_HEIGHT][MAP_WIDTH] = { {MAPSEC_NONE, MAPSEC_ROUTE_114, MAPSEC_ROUTE_114, MAPSEC_FALLARBOR_TOWN, MAPSEC_ROUTE_113, MAPSEC_ROUTE_113, MAPSEC_ROUTE_113, MAPSEC_ROUTE_113, MAPSEC_ROUTE_111, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_119, MAPSEC_FORTREE_CITY, MAPSEC_ROUTE_120, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_ROUTE_114, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_MT_CHIMNEY, MAPSEC_MT_CHIMNEY, MAPSEC_ROUTE_111, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_119, MAPSEC_NONE, MAPSEC_ROUTE_120, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_ROUTE_115, MAPSEC_ROUTE_114, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_MT_CHIMNEY, MAPSEC_MT_CHIMNEY, MAPSEC_ROUTE_111, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_119, MAPSEC_NONE, MAPSEC_ROUTE_120, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_SAFARI_ZONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, diff --git a/src/data/region_map/region_map_sections.json b/src/data/region_map/region_map_sections.json index fa7eb5efa467..5fc041e8eab2 100644 --- a/src/data/region_map/region_map_sections.json +++ b/src/data/region_map/region_map_sections.json @@ -531,7 +531,6 @@ { "id": "MAPSEC_AQUA_HIDEOUT_OLD", "name": "{AQUA} HIDEOUT", - "name_clone": true, "x": 19, "y": 3, "width": 1, @@ -675,11 +674,7 @@ }, { "id": "MAPSEC_INSIDE_OF_TRUCK", - "name": "INSIDE OF TRUCK", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "INSIDE OF TRUCK" }, { "id": "MAPSEC_SKY_PILLAR", @@ -691,897 +686,446 @@ }, { "id": "MAPSEC_SECRET_BASE", - "name": "SECRET BASE", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "SECRET BASE" }, { - "id": "MAPSEC_DYNAMIC", - "name": "", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "id": "MAPSEC_DYNAMIC" }, { "id": "MAPSEC_PALLET_TOWN", - "name": "PALLET TOWN", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "PALLET TOWN" }, { "id": "MAPSEC_VIRIDIAN_CITY", - "name": "VIRIDIAN CITY", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "VIRIDIAN CITY" }, { "id": "MAPSEC_PEWTER_CITY", - "name": "PEWTER CITY", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "PEWTER CITY" }, { "id": "MAPSEC_CERULEAN_CITY", - "name": "CERULEAN CITY", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "CERULEAN CITY" }, { "id": "MAPSEC_LAVENDER_TOWN", - "name": "LAVENDER TOWN", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "LAVENDER TOWN" }, { "id": "MAPSEC_VERMILION_CITY", - "name": "VERMILION CITY", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "VERMILION CITY" }, { "id": "MAPSEC_CELADON_CITY", - "name": "CELADON CITY", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "CELADON CITY" }, { "id": "MAPSEC_FUCHSIA_CITY", - "name": "FUCHSIA CITY", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "FUCHSIA CITY" }, { "id": "MAPSEC_CINNABAR_ISLAND", - "name": "CINNABAR ISLAND", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "CINNABAR ISLAND" }, { "id": "MAPSEC_INDIGO_PLATEAU", - "name": "INDIGO PLATEAU", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "INDIGO PLATEAU" }, { "id": "MAPSEC_SAFFRON_CITY", - "name": "SAFFRON CITY", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "SAFFRON CITY" }, { "id": "MAPSEC_ROUTE_4_POKECENTER", - "name": "ROUTE 4", - "name_clone": true, - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 4" }, { "id": "MAPSEC_ROUTE_10_POKECENTER", - "name": "ROUTE 10", - "name_clone": true, - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 10" }, { "id": "MAPSEC_ROUTE_1", - "name": "ROUTE 1", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 1" }, { "id": "MAPSEC_ROUTE_2", - "name": "ROUTE 2", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 2" }, { "id": "MAPSEC_ROUTE_3", - "name": "ROUTE 3", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 3" }, { "id": "MAPSEC_ROUTE_4", - "name": "ROUTE 4", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 4" }, { "id": "MAPSEC_ROUTE_5", - "name": "ROUTE 5", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 5" }, { "id": "MAPSEC_ROUTE_6", - "name": "ROUTE 6", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 6" }, { "id": "MAPSEC_ROUTE_7", - "name": "ROUTE 7", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 7" }, { "id": "MAPSEC_ROUTE_8", - "name": "ROUTE 8", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 8" }, { "id": "MAPSEC_ROUTE_9", - "name": "ROUTE 9", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 9" }, { "id": "MAPSEC_ROUTE_10", - "name": "ROUTE 10", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 10" }, { "id": "MAPSEC_ROUTE_11", - "name": "ROUTE 11", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 11" }, { "id": "MAPSEC_ROUTE_12", - "name": "ROUTE 12", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 12" }, { "id": "MAPSEC_ROUTE_13", - "name": "ROUTE 13", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 13" }, { "id": "MAPSEC_ROUTE_14", - "name": "ROUTE 14", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 14" }, { "id": "MAPSEC_ROUTE_15", - "name": "ROUTE 15", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 15" }, { "id": "MAPSEC_ROUTE_16", - "name": "ROUTE 16", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 16" }, { "id": "MAPSEC_ROUTE_17", - "name": "ROUTE 17", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 17" }, { "id": "MAPSEC_ROUTE_18", - "name": "ROUTE 18", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 18" }, { "id": "MAPSEC_ROUTE_19", - "name": "ROUTE 19", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 19" }, { "id": "MAPSEC_ROUTE_20", - "name": "ROUTE 20", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 20" }, { "id": "MAPSEC_ROUTE_21", - "name": "ROUTE 21", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 21" }, { "id": "MAPSEC_ROUTE_22", - "name": "ROUTE 22", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 22" }, { "id": "MAPSEC_ROUTE_23", - "name": "ROUTE 23", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 23" }, { "id": "MAPSEC_ROUTE_24", - "name": "ROUTE 24", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 24" }, { "id": "MAPSEC_ROUTE_25", - "name": "ROUTE 25", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROUTE 25" }, { "id": "MAPSEC_VIRIDIAN_FOREST", - "name": "VIRIDIAN FOREST", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "VIRIDIAN FOREST" }, { "id": "MAPSEC_MT_MOON", - "name": "MT. MOON", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "MT. MOON" }, { "id": "MAPSEC_S_S_ANNE", - "name": "S.S. ANNE", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "S.S. ANNE" }, { "id": "MAPSEC_UNDERGROUND_PATH", - "name": "UNDERGROUND PATH", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "UNDERGROUND PATH" }, { "id": "MAPSEC_UNDERGROUND_PATH_2", - "name": "UNDERGROUND PATH", - "name_clone": true, - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "UNDERGROUND PATH" }, { "id": "MAPSEC_DIGLETTS_CAVE", - "name": "DIGLETT'S CAVE", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "DIGLETT'S CAVE" }, { "id": "MAPSEC_KANTO_VICTORY_ROAD", - "name": "VICTORY ROAD", - "name_clone": true, - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "VICTORY ROAD" }, { "id": "MAPSEC_ROCKET_HIDEOUT", - "name": "ROCKET HIDEOUT", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROCKET HIDEOUT" }, { "id": "MAPSEC_SILPH_CO", - "name": "SILPH CO.", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "SILPH CO." }, { "id": "MAPSEC_POKEMON_MANSION", - "name": "POKΓ©MON MANSION", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "POKΓ©MON MANSION" }, { "id": "MAPSEC_KANTO_SAFARI_ZONE", - "name": "SAFARI ZONE", - "name_clone": true, - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "SAFARI ZONE" }, { "id": "MAPSEC_POKEMON_LEAGUE", - "name": "POKΓ©MON LEAGUE", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "POKΓ©MON LEAGUE" }, { "id": "MAPSEC_ROCK_TUNNEL", - "name": "ROCK TUNNEL", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROCK TUNNEL" }, { "id": "MAPSEC_SEAFOAM_ISLANDS", - "name": "SEAFOAM ISLANDS", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "SEAFOAM ISLANDS" }, { "id": "MAPSEC_POKEMON_TOWER", - "name": "POKΓ©MON TOWER", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "POKΓ©MON TOWER" }, { "id": "MAPSEC_CERULEAN_CAVE", - "name": "CERULEAN CAVE", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "CERULEAN CAVE" }, { "id": "MAPSEC_POWER_PLANT", - "name": "POWER PLANT", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "POWER PLANT" }, { "id": "MAPSEC_ONE_ISLAND", - "name": "ONE ISLAND", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ONE ISLAND" }, { "id": "MAPSEC_TWO_ISLAND", - "name": "TWO ISLAND", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "TWO ISLAND" }, { "id": "MAPSEC_THREE_ISLAND", - "name": "THREE ISLAND", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "THREE ISLAND" }, { "id": "MAPSEC_FOUR_ISLAND", - "name": "FOUR ISLAND", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "FOUR ISLAND" }, { "id": "MAPSEC_FIVE_ISLAND", - "name": "FIVE ISLAND", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "FIVE ISLAND" }, { "id": "MAPSEC_SEVEN_ISLAND", - "name": "SEVEN ISLAND", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "SEVEN ISLAND" }, { "id": "MAPSEC_SIX_ISLAND", - "name": "SIX ISLAND", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "SIX ISLAND" }, { "id": "MAPSEC_KINDLE_ROAD", - "name": "KINDLE ROAD", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "KINDLE ROAD" }, { "id": "MAPSEC_TREASURE_BEACH", - "name": "TREASURE BEACH", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "TREASURE BEACH" }, { "id": "MAPSEC_CAPE_BRINK", - "name": "CAPE BRINK", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "CAPE BRINK" }, { "id": "MAPSEC_BOND_BRIDGE", - "name": "BOND BRIDGE", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "BOND BRIDGE" }, { "id": "MAPSEC_THREE_ISLE_PORT", - "name": "THREE ISLE PORT", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "THREE ISLE PORT" }, { "id": "MAPSEC_SEVII_ISLE_6", - "name": "SEVII ISLE 6", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "SEVII ISLE 6" }, { "id": "MAPSEC_SEVII_ISLE_7", - "name": "SEVII ISLE 7", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "SEVII ISLE 7" }, { "id": "MAPSEC_SEVII_ISLE_8", - "name": "SEVII ISLE 8", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "SEVII ISLE 8" }, { "id": "MAPSEC_SEVII_ISLE_9", - "name": "SEVII ISLE 9", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "SEVII ISLE 9" }, { "id": "MAPSEC_RESORT_GORGEOUS", - "name": "RESORT GORGEOUS", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "RESORT GORGEOUS" }, { "id": "MAPSEC_WATER_LABYRINTH", - "name": "WATER LABYRINTH", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "WATER LABYRINTH" }, { "id": "MAPSEC_FIVE_ISLE_MEADOW", - "name": "FIVE ISLE MEADOW", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "FIVE ISLE MEADOW" }, { "id": "MAPSEC_MEMORIAL_PILLAR", - "name": "MEMORIAL PILLAR", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "MEMORIAL PILLAR" }, { "id": "MAPSEC_OUTCAST_ISLAND", - "name": "OUTCAST ISLAND", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "OUTCAST ISLAND" }, { "id": "MAPSEC_GREEN_PATH", - "name": "GREEN PATH", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "GREEN PATH" }, { "id": "MAPSEC_WATER_PATH", - "name": "WATER PATH", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "WATER PATH" }, { "id": "MAPSEC_RUIN_VALLEY", - "name": "RUIN VALLEY", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "RUIN VALLEY" }, { "id": "MAPSEC_TRAINER_TOWER", - "name": "TRAINER TOWER", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "TRAINER TOWER" }, { "id": "MAPSEC_CANYON_ENTRANCE", - "name": "CANYON ENTRANCE", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "CANYON ENTRANCE" }, { "id": "MAPSEC_SEVAULT_CANYON", - "name": "SEVAULT CANYON", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "SEVAULT CANYON" }, { "id": "MAPSEC_TANOBY_RUINS", - "name": "TANOBY RUINS", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "TANOBY RUINS" }, { "id": "MAPSEC_SEVII_ISLE_22", - "name": "SEVII ISLE 22", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "SEVII ISLE 22" }, { "id": "MAPSEC_SEVII_ISLE_23", - "name": "SEVII ISLE 23", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "SEVII ISLE 23" }, { "id": "MAPSEC_SEVII_ISLE_24", - "name": "SEVII ISLE 24", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "SEVII ISLE 24" }, { "id": "MAPSEC_NAVEL_ROCK_FRLG", - "name": "NAVEL ROCK", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "NAVEL ROCK" }, { "id": "MAPSEC_MT_EMBER", - "name": "MT. EMBER", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "MT. EMBER" }, { "id": "MAPSEC_BERRY_FOREST", - "name": "BERRY FOREST", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "BERRY FOREST" }, { "id": "MAPSEC_ICEFALL_CAVE", - "name": "ICEFALL CAVE", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ICEFALL CAVE" }, { "id": "MAPSEC_ROCKET_WAREHOUSE", - "name": "ROCKET WAREHOUSE", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ROCKET WAREHOUSE" }, { "id": "MAPSEC_TRAINER_TOWER_2", - "name": "TRAINER TOWER", - "name_clone": true, - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "TRAINER TOWER" }, { "id": "MAPSEC_DOTTED_HOLE", - "name": "DOTTED HOLE", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "DOTTED HOLE" }, { "id": "MAPSEC_LOST_CAVE", - "name": "LOST CAVE", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "LOST CAVE" }, { "id": "MAPSEC_PATTERN_BUSH", - "name": "PATTERN BUSH", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "PATTERN BUSH" }, { "id": "MAPSEC_ALTERING_CAVE_FRLG", - "name": "ALTERING CAVE", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "ALTERING CAVE" }, { "id": "MAPSEC_TANOBY_CHAMBERS", - "name": "TANOBY CHAMBERS", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "TANOBY CHAMBERS" }, { "id": "MAPSEC_THREE_ISLE_PATH", - "name": "THREE ISLE PATH", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "THREE ISLE PATH" }, { "id": "MAPSEC_TANOBY_KEY", - "name": "TANOBY KEY", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "TANOBY KEY" }, { "id": "MAPSEC_BIRTH_ISLAND_FRLG", - "name": "BIRTH ISLAND", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "BIRTH ISLAND" }, { "id": "MAPSEC_MONEAN_CHAMBER", - "name": "MONEAN CHAMBER", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "MONEAN CHAMBER" }, { "id": "MAPSEC_LIPTOO_CHAMBER", - "name": "LIPTOO CHAMBER", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "LIPTOO CHAMBER" }, { "id": "MAPSEC_WEEPTH_CHAMBER", - "name": "WEEPTH CHAMBER", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "WEEPTH CHAMBER" }, { "id": "MAPSEC_DILFORD_CHAMBER", - "name": "DILFORD CHAMBER", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "DILFORD CHAMBER" }, { "id": "MAPSEC_SCUFIB_CHAMBER", - "name": "SCUFIB CHAMBER", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "SCUFIB CHAMBER" }, { "id": "MAPSEC_RIXY_CHAMBER", - "name": "RIXY CHAMBER", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "RIXY CHAMBER" }, { "id": "MAPSEC_VIAPOIS_CHAMBER", - "name": "VIAPOIS CHAMBER", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "VIAPOIS CHAMBER" }, { "id": "MAPSEC_EMBER_SPA", - "name": "EMBER SPA", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "EMBER SPA" }, { "id": "MAPSEC_SPECIAL_AREA", - "name": "SPECIAL AREA", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "SPECIAL AREA" }, { "id": "MAPSEC_AQUA_HIDEOUT", @@ -1609,19 +1153,11 @@ }, { "id": "MAPSEC_BIRTH_ISLAND", - "name": "BIRTH ISLAND", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "BIRTH ISLAND" }, { "id": "MAPSEC_FARAWAY_ISLAND", - "name": "FARAWAY ISLAND", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "FARAWAY ISLAND" }, { "id": "MAPSEC_ARTISAN_CAVE", @@ -1633,27 +1169,15 @@ }, { "id": "MAPSEC_MARINE_CAVE", - "name": "MARINE CAVE", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "MARINE CAVE" }, { "id": "MAPSEC_UNDERWATER_MARINE_CAVE", - "name": "UNDERWATER", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "UNDERWATER" }, { "id": "MAPSEC_TERRA_CAVE", - "name": "TERRA CAVE", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "TERRA CAVE" }, { "id": "MAPSEC_UNDERWATER_105", @@ -1697,11 +1221,7 @@ }, { "id": "MAPSEC_NAVEL_ROCK", - "name": "NAVEL ROCK", - "x": 0, - "y": 0, - "width": 1, - "height": 1 + "name": "NAVEL ROCK" }, { "id": "MAPSEC_TRAINER_HILL", diff --git a/src/data/region_map/region_map_sections.json.txt b/src/data/region_map/region_map_sections.json.txt index b73f992d6d1a..5c532a050af4 100644 --- a/src/data/region_map/region_map_sections.json.txt +++ b/src/data/region_map/region_map_sections.json.txt @@ -2,26 +2,35 @@ #ifndef GUARD_DATA_REGION_MAP_REGION_MAP_ENTRIES_H #define GUARD_DATA_REGION_MAP_REGION_MAP_ENTRIES_H +const struct RegionMapLocation gRegionMapEntries[] = { ## for map_section in map_sections -{% if existsIn(map_section, "name") and isEmptyString(getVar(map_section.name)) and not existsIn(map_section, "name_clone") %}{{ setVar(map_section.name, map_section.id) }}{% endif %} -## endfor - -## for map_section in map_sections -{% if existsIn(map_section, "name") %} -{% if getVar(map_section.name) == map_section.id %} -static const u8 sMapName_{{ cleanString(map_section.name) }}[] = _("{{ map_section.name }}"); + [{{ map_section.id }}] = { +{% if existsIn(map_section, "x") %} + .x = {{ map_section.x }}, +{% else %} + .x = 0, {% endif %} -{% if existsIn(map_section, "name_clone") %} -static const u8 sMapName_{{ cleanString(map_section.name) }}_Clone[] = _("{{ map_section.name }}"); +{% if existsIn(map_section, "y") %} + .y = {{ map_section.y }}, +{% else %} + .y = 0, {% endif %} +{% if existsIn(map_section, "width") %} + .width = {{ map_section.width }}, +{% else %} + .width = 1, {% endif %} -## endfor - -const struct RegionMapLocation gRegionMapEntries[] = { -## for map_section in map_sections -{% if existsIn(map_section, "x") and existsIn(map_section, "y") and existsIn(map_section, "width") and existsIn(map_section, "height") and existsIn(map_section, "name") %} - [{{ map_section.id }}] = { {{ map_section.x }}, {{ map_section.y }}, {{ map_section.width }}, {{ map_section.height }}, sMapName_{{ cleanString(map_section.name) }}{% if existsIn(map_section, "name_clone") %}_Clone{% endif %} }, +{% if existsIn(map_section, "height") %} + .height = {{ map_section.height }}, +{% else %} + .height = 1, +{% endif %} +{% if existsIn(map_section, "name") %} + .name = COMPOUND_STRING("{{ map_section.name }}"), +{% else %} + .name = (const u8[])_(""), {% endif %} + }, ## endfor }; diff --git a/src/data/speaker_names.h b/src/data/speaker_names.h new file mode 100644 index 000000000000..7f0ca56ca7db --- /dev/null +++ b/src/data/speaker_names.h @@ -0,0 +1,5 @@ +const u8 *const gSpeakerNamesTable[SP_NAME_COUNT] = +{ + [SP_NAME_MOM] = COMPOUND_STRING("MOM"), + [SP_NAME_PLAYER] = COMPOUND_STRING("{PLAYER}"), +}; diff --git a/src/data/tilesets/graphics.h b/src/data/tilesets/graphics.h index a4cec62cf530..a8b2d7593bb1 100644 --- a/src/data/tilesets/graphics.h +++ b/src/data/tilesets/graphics.h @@ -1,4 +1,4 @@ -const u32 gTilesetTiles_Petalburg[] = INCBIN_U32("data/tilesets/secondary/petalburg/tiles.4bpp.lz"); +const u32 gTilesetTiles_Petalburg[] = INCBIN_U32("data/tilesets/secondary/petalburg/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Petalburg[][16] = { @@ -20,7 +20,7 @@ const u16 gTilesetPalettes_Petalburg[][16] = INCBIN_U16("data/tilesets/secondary/petalburg/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Rustboro[] = INCBIN_U32("data/tilesets/secondary/rustboro/tiles.4bpp.lz"); +const u32 gTilesetTiles_Rustboro[] = INCBIN_U32("data/tilesets/secondary/rustboro/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Rustboro[][16] = { @@ -42,7 +42,7 @@ const u16 gTilesetPalettes_Rustboro[][16] = INCBIN_U16("data/tilesets/secondary/rustboro/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Dewford[] = INCBIN_U32("data/tilesets/secondary/dewford/tiles.4bpp.lz"); +const u32 gTilesetTiles_Dewford[] = INCBIN_U32("data/tilesets/secondary/dewford/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Dewford[][16] = { @@ -64,7 +64,7 @@ const u16 gTilesetPalettes_Dewford[][16] = INCBIN_U16("data/tilesets/secondary/dewford/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Slateport[] = INCBIN_U32("data/tilesets/secondary/slateport/tiles.4bpp.lz"); +const u32 gTilesetTiles_Slateport[] = INCBIN_U32("data/tilesets/secondary/slateport/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Slateport[][16] = { @@ -86,7 +86,7 @@ const u16 gTilesetPalettes_Slateport[][16] = INCBIN_U16("data/tilesets/secondary/slateport/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Mauville[] = INCBIN_U32("data/tilesets/secondary/mauville/tiles.4bpp.lz"); +const u32 gTilesetTiles_Mauville[] = INCBIN_U32("data/tilesets/secondary/mauville/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Mauville[][16] = { @@ -108,7 +108,7 @@ const u16 gTilesetPalettes_Mauville[][16] = INCBIN_U16("data/tilesets/secondary/mauville/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Lavaridge[] = INCBIN_U32("data/tilesets/secondary/lavaridge/tiles.4bpp.lz"); +const u32 gTilesetTiles_Lavaridge[] = INCBIN_U32("data/tilesets/secondary/lavaridge/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Lavaridge[][16] = { @@ -130,7 +130,7 @@ const u16 gTilesetPalettes_Lavaridge[][16] = INCBIN_U16("data/tilesets/secondary/lavaridge/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Fallarbor[] = INCBIN_U32("data/tilesets/secondary/fallarbor/tiles.4bpp.lz"); +const u32 gTilesetTiles_Fallarbor[] = INCBIN_U32("data/tilesets/secondary/fallarbor/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Fallarbor[][16] = { @@ -152,7 +152,7 @@ const u16 gTilesetPalettes_Fallarbor[][16] = INCBIN_U16("data/tilesets/secondary/fallarbor/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Fortree[] = INCBIN_U32("data/tilesets/secondary/fortree/tiles.4bpp.lz"); +const u32 gTilesetTiles_Fortree[] = INCBIN_U32("data/tilesets/secondary/fortree/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Fortree[][16] = { @@ -174,7 +174,7 @@ const u16 gTilesetPalettes_Fortree[][16] = INCBIN_U16("data/tilesets/secondary/fortree/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Lilycove[] = INCBIN_U32("data/tilesets/secondary/lilycove/tiles.4bpp.lz"); +const u32 gTilesetTiles_Lilycove[] = INCBIN_U32("data/tilesets/secondary/lilycove/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Lilycove[][16] = { @@ -196,7 +196,7 @@ const u16 gTilesetPalettes_Lilycove[][16] = INCBIN_U16("data/tilesets/secondary/lilycove/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Mossdeep[] = INCBIN_U32("data/tilesets/secondary/mossdeep/tiles.4bpp.lz"); +const u32 gTilesetTiles_Mossdeep[] = INCBIN_U32("data/tilesets/secondary/mossdeep/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Mossdeep[][16] = { @@ -218,7 +218,7 @@ const u16 gTilesetPalettes_Mossdeep[][16] = INCBIN_U16("data/tilesets/secondary/mossdeep/palettes/15.gbapal"), }; -const u32 gTilesetTiles_EverGrande[] = INCBIN_U32("data/tilesets/secondary/ever_grande/tiles.4bpp.lz"); +const u32 gTilesetTiles_EverGrande[] = INCBIN_U32("data/tilesets/secondary/ever_grande/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_EverGrande[][16] = { @@ -240,7 +240,7 @@ const u16 gTilesetPalettes_EverGrande[][16] = INCBIN_U16("data/tilesets/secondary/ever_grande/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Pacifidlog[] = INCBIN_U32("data/tilesets/secondary/pacifidlog/tiles.4bpp.lz"); +const u32 gTilesetTiles_Pacifidlog[] = INCBIN_U32("data/tilesets/secondary/pacifidlog/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Pacifidlog[][16] = { @@ -262,7 +262,7 @@ const u16 gTilesetPalettes_Pacifidlog[][16] = INCBIN_U16("data/tilesets/secondary/pacifidlog/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Sootopolis[] = INCBIN_U32("data/tilesets/secondary/sootopolis/tiles.4bpp.lz"); +const u32 gTilesetTiles_Sootopolis[] = INCBIN_U32("data/tilesets/secondary/sootopolis/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Sootopolis[][16] = { @@ -284,7 +284,7 @@ const u16 gTilesetPalettes_Sootopolis[][16] = INCBIN_U16("data/tilesets/secondary/sootopolis/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BattleFrontierOutsideWest[] = INCBIN_U32("data/tilesets/secondary/battle_frontier_outside_west/tiles.4bpp.lz"); +const u32 gTilesetTiles_BattleFrontierOutsideWest[] = INCBIN_U32("data/tilesets/secondary/battle_frontier_outside_west/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BattleFrontierOutsideWest[][16] = { @@ -306,7 +306,7 @@ const u16 gTilesetPalettes_BattleFrontierOutsideWest[][16] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BattleFrontierOutsideEast[] = INCBIN_U32("data/tilesets/secondary/battle_frontier_outside_east/tiles.4bpp.lz"); +const u32 gTilesetTiles_BattleFrontierOutsideEast[] = INCBIN_U32("data/tilesets/secondary/battle_frontier_outside_east/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BattleFrontierOutsideEast[][16] = { @@ -328,7 +328,7 @@ const u16 gTilesetPalettes_BattleFrontierOutsideEast[][16] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/palettes/15.gbapal"), }; -const u32 gTilesetTiles_InsideBuilding[] = INCBIN_U32("data/tilesets/primary/building/tiles.4bpp.lz"); +const u32 gTilesetTiles_InsideBuilding[] = INCBIN_U32("data/tilesets/primary/building/tiles.4bpp.smol"); const u16 gTilesetPalettes_InsideBuilding[][16] = { @@ -350,7 +350,7 @@ const u16 gTilesetPalettes_InsideBuilding[][16] = INCBIN_U16("data/tilesets/primary/building/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Shop[] = INCBIN_U32("data/tilesets/secondary/shop/tiles.4bpp.lz"); +const u32 gTilesetTiles_Shop[] = INCBIN_U32("data/tilesets/secondary/shop/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Shop[][16] = { @@ -372,7 +372,7 @@ const u16 gTilesetPalettes_Shop[][16] = INCBIN_U16("data/tilesets/secondary/shop/palettes/15.gbapal"), }; -const u32 gTilesetTiles_PokemonCenter[] = INCBIN_U32("data/tilesets/secondary/pokemon_center/tiles.4bpp.lz"); +const u32 gTilesetTiles_PokemonCenter[] = INCBIN_U32("data/tilesets/secondary/pokemon_center/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_PokemonCenter[][16] = { @@ -394,7 +394,7 @@ const u16 gTilesetPalettes_PokemonCenter[][16] = INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Cave[] = INCBIN_U32("data/tilesets/secondary/cave/tiles.4bpp.lz"); +const u32 gTilesetTiles_Cave[] = INCBIN_U32("data/tilesets/secondary/cave/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Cave[][16] = { @@ -416,7 +416,7 @@ const u16 gTilesetPalettes_Cave[][16] = INCBIN_U16("data/tilesets/secondary/cave/palettes/15.gbapal"), }; -const u32 gTilesetTiles_PokemonSchool[] = INCBIN_U32("data/tilesets/secondary/pokemon_school/tiles.4bpp.lz"); +const u32 gTilesetTiles_PokemonSchool[] = INCBIN_U32("data/tilesets/secondary/pokemon_school/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_PokemonSchool[][16] = { @@ -438,7 +438,7 @@ const u16 gTilesetPalettes_PokemonSchool[][16] = INCBIN_U16("data/tilesets/secondary/pokemon_school/palettes/15.gbapal"), }; -const u32 gTilesetTiles_PokemonFanClub[] = INCBIN_U32("data/tilesets/secondary/pokemon_fan_club/tiles.4bpp.lz"); +const u32 gTilesetTiles_PokemonFanClub[] = INCBIN_U32("data/tilesets/secondary/pokemon_fan_club/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_PokemonFanClub[][16] = { @@ -460,7 +460,7 @@ const u16 gTilesetPalettes_PokemonFanClub[][16] = INCBIN_U16("data/tilesets/secondary/pokemon_fan_club/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Unused1[] = INCBIN_U32("data/tilesets/secondary/unused_1/tiles.4bpp.lz"); +const u32 gTilesetTiles_Unused1[] = INCBIN_U32("data/tilesets/secondary/unused_1/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Unused1[][16] = { @@ -482,7 +482,7 @@ const u16 gTilesetPalettes_Unused1[][16] = INCBIN_U16("data/tilesets/secondary/unused_1/palettes/15.gbapal"), }; -const u32 gTilesetTiles_MeteorFalls[] = INCBIN_U32("data/tilesets/secondary/meteor_falls/tiles.4bpp.lz"); +const u32 gTilesetTiles_MeteorFalls[] = INCBIN_U32("data/tilesets/secondary/meteor_falls/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_MeteorFalls[][16] = { @@ -504,7 +504,7 @@ const u16 gTilesetPalettes_MeteorFalls[][16] = INCBIN_U16("data/tilesets/secondary/meteor_falls/palettes/15.gbapal"), }; -const u32 gTilesetTiles_OceanicMuseum[] = INCBIN_U32("data/tilesets/secondary/oceanic_museum/tiles.4bpp.lz"); +const u32 gTilesetTiles_OceanicMuseum[] = INCBIN_U32("data/tilesets/secondary/oceanic_museum/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_OceanicMuseum[][16] = { @@ -549,7 +549,7 @@ const u16 gTilesetPalettes_CableClub[][16] = INCBIN_U16("data/tilesets/secondary/cable_club/palettes/15.gbapal"), }; -const u32 gTilesetTiles_SeashoreHouse[] = INCBIN_U32("data/tilesets/secondary/seashore_house/tiles.4bpp.lz"); +const u32 gTilesetTiles_SeashoreHouse[] = INCBIN_U32("data/tilesets/secondary/seashore_house/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_SeashoreHouse[][16] = { @@ -571,7 +571,7 @@ const u16 gTilesetPalettes_SeashoreHouse[][16] = INCBIN_U16("data/tilesets/secondary/seashore_house/palettes/15.gbapal"), }; -const u32 gTilesetTiles_PrettyPetalFlowerShop[] = INCBIN_U32("data/tilesets/secondary/pretty_petal_flower_shop/tiles.4bpp.lz"); +const u32 gTilesetTiles_PrettyPetalFlowerShop[] = INCBIN_U32("data/tilesets/secondary/pretty_petal_flower_shop/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_PrettyPetalFlowerShop[][16] = { @@ -593,7 +593,7 @@ const u16 gTilesetPalettes_PrettyPetalFlowerShop[][16] = INCBIN_U16("data/tilesets/secondary/pretty_petal_flower_shop/palettes/15.gbapal"), }; -const u32 gTilesetTiles_PokemonDayCare[] = INCBIN_U32("data/tilesets/secondary/pokemon_day_care/tiles.4bpp.lz"); +const u32 gTilesetTiles_PokemonDayCare[] = INCBIN_U32("data/tilesets/secondary/pokemon_day_care/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_PokemonDayCare[][16] = { @@ -615,7 +615,7 @@ const u16 gTilesetPalettes_PokemonDayCare[][16] = INCBIN_U16("data/tilesets/secondary/pokemon_day_care/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Facility[] = INCBIN_U32("data/tilesets/secondary/facility/tiles.4bpp.lz"); +const u32 gTilesetTiles_Facility[] = INCBIN_U32("data/tilesets/secondary/facility/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Facility[][16] = { @@ -637,7 +637,7 @@ const u16 gTilesetPalettes_Facility[][16] = INCBIN_U16("data/tilesets/secondary/facility/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BikeShop[] = INCBIN_U32("data/tilesets/secondary/bike_shop/tiles.4bpp.lz"); +const u32 gTilesetTiles_BikeShop[] = INCBIN_U32("data/tilesets/secondary/bike_shop/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BikeShop[][16] = { @@ -659,7 +659,7 @@ const u16 gTilesetPalettes_BikeShop[][16] = INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/15.gbapal"), }; -const u32 gTilesetTiles_RusturfTunnel[] = INCBIN_U32("data/tilesets/secondary/rusturf_tunnel/tiles.4bpp.lz"); +const u32 gTilesetTiles_RusturfTunnel[] = INCBIN_U32("data/tilesets/secondary/rusturf_tunnel/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_RusturfTunnel[][16] = { @@ -681,7 +681,7 @@ const u16 gTilesetPalettes_RusturfTunnel[][16] = INCBIN_U16("data/tilesets/secondary/rusturf_tunnel/palettes/15.gbapal"), }; -const u32 gTilesetTiles_SecretBaseBrownCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/brown_cave/unused_tiles.4bpp.lz"); +const u32 gTilesetTiles_SecretBaseBrownCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/brown_cave/unused_tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_SecretBaseBrownCave[][16] = { @@ -703,7 +703,7 @@ const u16 gTilesetPalettes_SecretBaseBrownCave[][16] = INCBIN_U16("data/tilesets/secondary/secret_base/brown_cave/palettes/15.gbapal"), }; -const u32 gTilesetTiles_SecretBaseTreeCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/tree/unused_tiles.4bpp.lz"); +const u32 gTilesetTiles_SecretBaseTreeCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/tree/unused_tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_SecretBaseTree[][16] = { @@ -725,7 +725,7 @@ const u16 gTilesetPalettes_SecretBaseTree[][16] = INCBIN_U16("data/tilesets/secondary/secret_base/tree/palettes/15.gbapal"), }; -const u32 gTilesetTiles_SecretBaseShrubCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/shrub/unused_tiles.4bpp.lz"); +const u32 gTilesetTiles_SecretBaseShrubCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/shrub/unused_tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_SecretBaseShrub[][16] = { @@ -747,7 +747,7 @@ const u16 gTilesetPalettes_SecretBaseShrub[][16] = INCBIN_U16("data/tilesets/secondary/secret_base/shrub/palettes/15.gbapal"), }; -const u32 gTilesetTiles_SecretBaseBlueCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/blue_cave/unused_tiles.4bpp.lz"); +const u32 gTilesetTiles_SecretBaseBlueCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/blue_cave/unused_tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_SecretBaseBlueCave[][16] = { @@ -769,7 +769,7 @@ const u16 gTilesetPalettes_SecretBaseBlueCave[][16] = INCBIN_U16("data/tilesets/secondary/secret_base/blue_cave/palettes/15.gbapal"), }; -const u32 gTilesetTiles_SecretBaseYellowCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/yellow_cave/unused_tiles.4bpp.lz"); +const u32 gTilesetTiles_SecretBaseYellowCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/yellow_cave/unused_tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_SecretBaseYellowCave[][16] = { @@ -791,7 +791,7 @@ const u16 gTilesetPalettes_SecretBaseYellowCave[][16] = INCBIN_U16("data/tilesets/secondary/secret_base/yellow_cave/palettes/15.gbapal"), }; -const u32 gTilesetTiles_SecretBaseRedCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/red_cave/unused_tiles.4bpp.lz"); +const u32 gTilesetTiles_SecretBaseRedCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/red_cave/unused_tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_SecretBaseRedCave[][16] = { @@ -820,7 +820,7 @@ const u32 gTilesetTiles_SecretBaseBlueCave[] = INCBIN_U32("data/tilesets/seconda const u32 gTilesetTiles_SecretBaseYellowCave[] = INCBIN_U32("data/tilesets/secondary/secret_base/yellow_cave/tiles.4bpp"); const u32 gTilesetTiles_SecretBaseRedCave[] = INCBIN_U32("data/tilesets/secondary/secret_base/red_cave/tiles.4bpp"); -const u32 gTilesetTiles_InsideOfTruck[] = INCBIN_U32("data/tilesets/secondary/inside_of_truck/tiles.4bpp.lz"); +const u32 gTilesetTiles_InsideOfTruck[] = INCBIN_U32("data/tilesets/secondary/inside_of_truck/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_InsideOfTruck[][16] = { @@ -842,7 +842,7 @@ const u16 gTilesetPalettes_InsideOfTruck[][16] = INCBIN_U16("data/tilesets/secondary/inside_of_truck/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Contest[] = INCBIN_U32("data/tilesets/secondary/contest/tiles.4bpp.lz"); +const u32 gTilesetTiles_Contest[] = INCBIN_U32("data/tilesets/secondary/contest/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Contest[][16] = { @@ -864,7 +864,7 @@ const u16 gTilesetPalettes_Contest[][16] = INCBIN_U16("data/tilesets/secondary/contest/palettes/15.gbapal"), }; -const u32 gTilesetTiles_LilycoveMuseum[] = INCBIN_U32("data/tilesets/secondary/lilycove_museum/tiles.4bpp.lz"); +const u32 gTilesetTiles_LilycoveMuseum[] = INCBIN_U32("data/tilesets/secondary/lilycove_museum/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_LilycoveMuseum[][16] = { @@ -886,7 +886,7 @@ const u16 gTilesetPalettes_LilycoveMuseum[][16] = INCBIN_U16("data/tilesets/secondary/lilycove_museum/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BrendansMaysHouse[] = INCBIN_U32("data/tilesets/secondary/brendans_mays_house/tiles.4bpp.lz"); +const u32 gTilesetTiles_BrendansMaysHouse[] = INCBIN_U32("data/tilesets/secondary/brendans_mays_house/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BrendansMaysHouse[][16] = { @@ -908,7 +908,7 @@ const u16 gTilesetPalettes_BrendansMaysHouse[][16] = INCBIN_U16("data/tilesets/secondary/brendans_mays_house/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Lab[] = INCBIN_U32("data/tilesets/secondary/lab/tiles.4bpp.lz"); +const u32 gTilesetTiles_Lab[] = INCBIN_U32("data/tilesets/secondary/lab/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Lab[][16] = { @@ -930,7 +930,7 @@ const u16 gTilesetPalettes_Lab[][16] = INCBIN_U16("data/tilesets/secondary/lab/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Underwater[] = INCBIN_U32("data/tilesets/secondary/underwater/tiles.4bpp.lz"); +const u32 gTilesetTiles_Underwater[] = INCBIN_U32("data/tilesets/secondary/underwater/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Underwater[][16] = { @@ -952,7 +952,7 @@ const u16 gTilesetPalettes_Underwater[][16] = INCBIN_U16("data/tilesets/secondary/underwater/palettes/15.gbapal"), }; -const u32 gTilesetTiles_GenericBuilding[] = INCBIN_U32("data/tilesets/secondary/generic_building/tiles.4bpp.lz"); +const u32 gTilesetTiles_GenericBuilding[] = INCBIN_U32("data/tilesets/secondary/generic_building/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_GenericBuilding[][16] = { @@ -974,7 +974,7 @@ const u16 gTilesetPalettes_GenericBuilding[][16] = INCBIN_U16("data/tilesets/secondary/generic_building/palettes/15.gbapal"), }; -const u32 gTilesetTiles_MauvilleGameCorner[] = INCBIN_U32("data/tilesets/secondary/mauville_game_corner/tiles.4bpp.lz"); +const u32 gTilesetTiles_MauvilleGameCorner[] = INCBIN_U32("data/tilesets/secondary/mauville_game_corner/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_MauvilleGameCorner[][16] = { @@ -996,7 +996,7 @@ const u16 gTilesetPalettes_MauvilleGameCorner[][16] = INCBIN_U16("data/tilesets/secondary/mauville_game_corner/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Unused2[] = INCBIN_U32("data/tilesets/secondary/unused_2/tiles.4bpp.lz"); +const u32 gTilesetTiles_Unused2[] = INCBIN_U32("data/tilesets/secondary/unused_2/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Unused2[][16] = { @@ -1018,7 +1018,7 @@ const u16 gTilesetPalettes_Unused2[][16] = INCBIN_U16("data/tilesets/secondary/unused_2/palettes/15.gbapal"), }; -const u32 gTilesetTiles_RustboroGym[] = INCBIN_U32("data/tilesets/secondary/rustboro_gym/tiles.4bpp.lz"); +const u32 gTilesetTiles_RustboroGym[] = INCBIN_U32("data/tilesets/secondary/rustboro_gym/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_RustboroGym[][16] = { @@ -1040,7 +1040,7 @@ const u16 gTilesetPalettes_RustboroGym[][16] = INCBIN_U16("data/tilesets/secondary/rustboro_gym/palettes/15.gbapal"), }; -const u32 gTilesetTiles_DewfordGym[] = INCBIN_U32("data/tilesets/secondary/dewford_gym/tiles.4bpp.lz"); +const u32 gTilesetTiles_DewfordGym[] = INCBIN_U32("data/tilesets/secondary/dewford_gym/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_DewfordGym[][16] = { @@ -1062,7 +1062,7 @@ const u16 gTilesetPalettes_DewfordGym[][16] = INCBIN_U16("data/tilesets/secondary/dewford_gym/palettes/15.gbapal"), }; -const u32 gTilesetTiles_MauvilleGym[] = INCBIN_U32("data/tilesets/secondary/mauville_gym/tiles.4bpp.lz"); +const u32 gTilesetTiles_MauvilleGym[] = INCBIN_U32("data/tilesets/secondary/mauville_gym/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_MauvilleGym[][16] = { @@ -1084,7 +1084,7 @@ const u16 gTilesetPalettes_MauvilleGym[][16] = INCBIN_U16("data/tilesets/secondary/mauville_gym/palettes/15.gbapal"), }; -const u32 gTilesetTiles_LavaridgeGym[] = INCBIN_U32("data/tilesets/secondary/lavaridge_gym/tiles.4bpp.lz"); +const u32 gTilesetTiles_LavaridgeGym[] = INCBIN_U32("data/tilesets/secondary/lavaridge_gym/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_LavaridgeGym[][16] = { @@ -1106,7 +1106,7 @@ const u16 gTilesetPalettes_LavaridgeGym[][16] = INCBIN_U16("data/tilesets/secondary/lavaridge_gym/palettes/15.gbapal"), }; -const u32 gTilesetTiles_PetalburgGym[] = INCBIN_U32("data/tilesets/secondary/petalburg_gym/tiles.4bpp.lz"); +const u32 gTilesetTiles_PetalburgGym[] = INCBIN_U32("data/tilesets/secondary/petalburg_gym/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_PetalburgGym[][16] = { @@ -1128,7 +1128,7 @@ const u16 gTilesetPalettes_PetalburgGym[][16] = INCBIN_U16("data/tilesets/secondary/petalburg_gym/palettes/15.gbapal"), }; -const u32 gTilesetTiles_FortreeGym[] = INCBIN_U32("data/tilesets/secondary/fortree_gym/tiles.4bpp.lz"); +const u32 gTilesetTiles_FortreeGym[] = INCBIN_U32("data/tilesets/secondary/fortree_gym/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_FortreeGym[][16] = { @@ -1150,7 +1150,7 @@ const u16 gTilesetPalettes_FortreeGym[][16] = INCBIN_U16("data/tilesets/secondary/fortree_gym/palettes/15.gbapal"), }; -const u32 gTilesetTiles_MossdeepGym[] = INCBIN_U32("data/tilesets/secondary/mossdeep_gym/tiles.4bpp.lz"); +const u32 gTilesetTiles_MossdeepGym[] = INCBIN_U32("data/tilesets/secondary/mossdeep_gym/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_MossdeepGym[][16] = { @@ -1172,7 +1172,7 @@ const u16 gTilesetPalettes_MossdeepGym[][16] = INCBIN_U16("data/tilesets/secondary/mossdeep_gym/palettes/15.gbapal"), }; -const u32 gTilesetTiles_SootopolisGym[] = INCBIN_U32("data/tilesets/secondary/sootopolis_gym/tiles.4bpp.lz"); +const u32 gTilesetTiles_SootopolisGym[] = INCBIN_U32("data/tilesets/secondary/sootopolis_gym/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_SootopolisGym[][16] = { @@ -1194,7 +1194,7 @@ const u16 gTilesetPalettes_SootopolisGym[][16] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/palettes/15.gbapal"), }; -const u32 gTilesetTiles_TrickHousePuzzle[] = INCBIN_U32("data/tilesets/secondary/trick_house_puzzle/tiles.4bpp.lz"); +const u32 gTilesetTiles_TrickHousePuzzle[] = INCBIN_U32("data/tilesets/secondary/trick_house_puzzle/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_TrickHousePuzzle[][16] = { @@ -1216,7 +1216,7 @@ const u16 gTilesetPalettes_TrickHousePuzzle[][16] = INCBIN_U16("data/tilesets/secondary/trick_house_puzzle/palettes/15.gbapal"), }; -const u32 gTilesetTiles_InsideShip[] = INCBIN_U32("data/tilesets/secondary/inside_ship/tiles.4bpp.lz"); +const u32 gTilesetTiles_InsideShip[] = INCBIN_U32("data/tilesets/secondary/inside_ship/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_InsideShip[][16] = { @@ -1261,7 +1261,7 @@ const u16 gTilesetPalettes_SecretBase[][16] = INCBIN_U16("data/tilesets/primary/secret_base/palettes/15.gbapal"), }; -const u32 gTilesetTiles_EliteFour[] = INCBIN_U32("data/tilesets/secondary/elite_four/tiles.4bpp.lz"); +const u32 gTilesetTiles_EliteFour[] = INCBIN_U32("data/tilesets/secondary/elite_four/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_EliteFour[][16] = { @@ -1283,7 +1283,7 @@ const u16 gTilesetPalettes_EliteFour[][16] = INCBIN_U16("data/tilesets/secondary/elite_four/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BattleFrontier[] = INCBIN_U32("data/tilesets/secondary/battle_frontier/tiles.4bpp.lz"); +const u32 gTilesetTiles_BattleFrontier[] = INCBIN_U32("data/tilesets/secondary/battle_frontier/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BattleFrontier[][16] = { @@ -1305,7 +1305,7 @@ const u16 gTilesetPalettes_BattleFrontier[][16] = INCBIN_U16("data/tilesets/secondary/battle_frontier/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BattlePalace[] = INCBIN_U32("data/tilesets/secondary/battle_palace/tiles.4bpp.lz"); +const u32 gTilesetTiles_BattlePalace[] = INCBIN_U32("data/tilesets/secondary/battle_palace/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BattlePalace[][16] = { @@ -1327,7 +1327,7 @@ const u16 gTilesetPalettes_BattlePalace[][16] = INCBIN_U16("data/tilesets/secondary/battle_palace/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BattleDome[] = INCBIN_U32("data/tilesets/secondary/battle_dome/tiles.4bpp.lz"); +const u32 gTilesetTiles_BattleDome[] = INCBIN_U32("data/tilesets/secondary/battle_dome/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BattleDome[][16] = { @@ -1349,7 +1349,7 @@ const u16 gTilesetPalettes_BattleDome[][16] = INCBIN_U16("data/tilesets/secondary/battle_dome/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BattleFactory[] = INCBIN_U32("data/tilesets/secondary/battle_factory/tiles.4bpp.lz"); +const u32 gTilesetTiles_BattleFactory[] = INCBIN_U32("data/tilesets/secondary/battle_factory/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BattleFactory[][16] = { @@ -1371,7 +1371,7 @@ const u16 gTilesetPalettes_BattleFactory[][16] = INCBIN_U16("data/tilesets/secondary/battle_factory/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BattlePike[] = INCBIN_U32("data/tilesets/secondary/battle_pike/tiles.4bpp.lz"); +const u32 gTilesetTiles_BattlePike[] = INCBIN_U32("data/tilesets/secondary/battle_pike/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BattlePike[][16] = { @@ -1393,7 +1393,7 @@ const u16 gTilesetPalettes_BattlePike[][16] = INCBIN_U16("data/tilesets/secondary/battle_pike/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BattleArena[] = INCBIN_U32("data/tilesets/secondary/battle_arena/tiles.4bpp.lz"); +const u32 gTilesetTiles_BattleArena[] = INCBIN_U32("data/tilesets/secondary/battle_arena/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BattleArena[][16] = { @@ -1415,7 +1415,7 @@ const u16 gTilesetPalettes_BattleArena[][16] = INCBIN_U16("data/tilesets/secondary/battle_arena/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BattlePyramid[] = INCBIN_U32("data/tilesets/secondary/battle_pyramid/tiles.4bpp.lz"); +const u32 gTilesetTiles_BattlePyramid[] = INCBIN_U32("data/tilesets/secondary/battle_pyramid/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BattlePyramid[][16] = { @@ -1437,7 +1437,7 @@ const u16 gTilesetPalettes_BattlePyramid[][16] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/palettes/15.gbapal"), }; -const u32 gTilesetTiles_MirageTower[] = INCBIN_U32("data/tilesets/secondary/mirage_tower/tiles.4bpp.lz"); +const u32 gTilesetTiles_MirageTower[] = INCBIN_U32("data/tilesets/secondary/mirage_tower/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_MirageTower[][16] = { @@ -1459,7 +1459,7 @@ const u16 gTilesetPalettes_MirageTower[][16] = INCBIN_U16("data/tilesets/secondary/mirage_tower/palettes/15.gbapal"), }; -const u32 gTilesetTiles_MossdeepGameCorner[] = INCBIN_U32("data/tilesets/secondary/mossdeep_game_corner/tiles.4bpp.lz"); +const u32 gTilesetTiles_MossdeepGameCorner[] = INCBIN_U32("data/tilesets/secondary/mossdeep_game_corner/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_MossdeepGameCorner[][16] = { @@ -1481,7 +1481,7 @@ const u16 gTilesetPalettes_MossdeepGameCorner[][16] = INCBIN_U16("data/tilesets/secondary/mossdeep_game_corner/palettes/15.gbapal"), }; -const u32 gTilesetTiles_IslandHarbor[] = INCBIN_U32("data/tilesets/secondary/island_harbor/tiles.4bpp.lz"); +const u32 gTilesetTiles_IslandHarbor[] = INCBIN_U32("data/tilesets/secondary/island_harbor/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_IslandHarbor[][16] = { @@ -1503,7 +1503,7 @@ const u16 gTilesetPalettes_IslandHarbor[][16] = INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/15.gbapal"), }; -const u32 gTilesetTiles_TrainerHill[] = INCBIN_U32("data/tilesets/secondary/trainer_hill/tiles.4bpp.lz"); +const u32 gTilesetTiles_TrainerHill[] = INCBIN_U32("data/tilesets/secondary/trainer_hill/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_TrainerHill[][16] = { @@ -1525,7 +1525,7 @@ const u16 gTilesetPalettes_TrainerHill[][16] = INCBIN_U16("data/tilesets/secondary/trainer_hill/palettes/15.gbapal"), }; -const u32 gTilesetTiles_NavelRock[] = INCBIN_U32("data/tilesets/secondary/navel_rock/tiles.4bpp.lz"); +const u32 gTilesetTiles_NavelRock[] = INCBIN_U32("data/tilesets/secondary/navel_rock/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_NavelRock[][16] = { @@ -1547,7 +1547,7 @@ const u16 gTilesetPalettes_NavelRock[][16] = INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BattleFrontierRankingHall[] = INCBIN_U32("data/tilesets/secondary/battle_frontier_ranking_hall/tiles.4bpp.lz"); +const u32 gTilesetTiles_BattleFrontierRankingHall[] = INCBIN_U32("data/tilesets/secondary/battle_frontier_ranking_hall/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BattleFrontierRankingHall[][16] = { @@ -1569,7 +1569,7 @@ const u16 gTilesetPalettes_BattleFrontierRankingHall[][16] = INCBIN_U16("data/tilesets/secondary/battle_frontier_ranking_hall/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BattleTent[] = INCBIN_U32("data/tilesets/secondary/battle_tent/tiles.4bpp.lz"); +const u32 gTilesetTiles_BattleTent[] = INCBIN_U32("data/tilesets/secondary/battle_tent/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BattleTent[][16] = { @@ -1591,7 +1591,7 @@ const u16 gTilesetPalettes_BattleTent[][16] = INCBIN_U16("data/tilesets/secondary/battle_tent/palettes/15.gbapal"), }; -const u32 gTilesetTiles_MysteryEventsHouse[] = INCBIN_U32("data/tilesets/secondary/mystery_events_house/tiles.4bpp.lz"); +const u32 gTilesetTiles_MysteryEventsHouse[] = INCBIN_U32("data/tilesets/secondary/mystery_events_house/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_MysteryEventsHouse[][16] = { @@ -1633,4 +1633,4 @@ const u16 gTilesetPalettes_UnionRoom[][16] = INCBIN_U16("data/tilesets/secondary/union_room/palettes/15.gbapal"), }; -const u32 gTilesetTiles_UnionRoom[] = INCBIN_U32("data/tilesets/secondary/union_room/tiles.4bpp.lz"); +const u32 gTilesetTiles_UnionRoom[] = INCBIN_U32("data/tilesets/secondary/union_room/tiles.4bpp.fastSmol"); diff --git a/src/data/trade.h b/src/data/trade.h index ba49f4b8743c..592ced339dea 100644 --- a/src/data/trade.h +++ b/src/data/trade.h @@ -642,12 +642,12 @@ static const u8 sGbaAffineMapCable[] = INCBIN_U8("graphics/trade/gba_affine_map_ static const u8 sGbaAffineMapWireless[] = INCBIN_U8("graphics/trade/gba_affine_map_wireless.bin"); static const u16 sGbaMapWireless[] = INCBIN_U16("graphics/trade/gba_map_wireless.bin"); static const u16 sGbaMapCable[] = INCBIN_U16("graphics/trade/gba_map_cable.bin"); -static const u32 sWirelessCloseup_Map[] = INCBIN_U32("graphics/trade/crossing_highlight_wireless.bin.lz"); +static const u32 sWirelessCloseup_Map[] = INCBIN_U32("graphics/trade/crossing_highlight_wireless.bin.smolTM"); static const u16 sWirelessSignalSend_Pal[] = INCBIN_U16("graphics/trade/wireless_signal_send.gbapal"); static const u16 sWirelessSignalRecv_Pal[] = INCBIN_U16("graphics/trade/wireless_signal_receive.gbapal"); static const u16 sWirelessSignalNone_Pal[] = INCBIN_U16("graphics/trade/wireless_signal_none.gbapal"); -static const u32 sWirelessSignal_Gfx[] = INCBIN_U32("graphics/trade/wireless_signal.4bpp.lz"); -static const u32 sWirelessSignal_Tilemap[] = INCBIN_U32("graphics/trade/wireless_signal.bin.lz"); +static const u32 sWirelessSignal_Gfx[] = INCBIN_U32("graphics/trade/wireless_signal.4bpp.smol"); +static const u32 sWirelessSignal_Tilemap[] = INCBIN_U32("graphics/trade/wireless_signal.bin.smolTM"); static const struct OamData sOamData_Pokeball = { diff --git a/src/data/trainers.h b/src/data/trainers.h deleted file mode 100644 index 44cb25be75ce..000000000000 --- a/src/data/trainers.h +++ /dev/null @@ -1,42180 +0,0 @@ -// -// DO NOT MODIFY THIS FILE! It is auto-generated from src/data/trainers.party -// -// If you want to modify this file set COMPETITIVE_PARTY_SYNTAX to FALSE -// in include/config/general.h and remove this notice. -// Use sed -i '/^#line/d' 'src/data/trainers.h' to remove #line markers. -// - -#line 1 "src/data/trainers.party" - -#line 76 - [DIFFICULTY_NORMAL][TRAINER_NONE] = - { -#line 78 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 79 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 81 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 82 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 0, - .party = (const struct TrainerMon[]) - { - }, - }, -#line 84 - [DIFFICULTY_NORMAL][TRAINER_SAWYER_1] = - { -#line 85 - .trainerName = _("SAWYER"), -#line 86 - .trainerClass = TRAINER_CLASS_HIKER, -#line 87 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 89 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 90 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 91 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 93 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 95 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 94 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 97 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_1] = - { -#line 98 - .trainerName = _("GRUNT"), -#line 99 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 100 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 102 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 103 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 104 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 106 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 108 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 107 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 110 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_2] = - { -#line 111 - .trainerName = _("GRUNT"), -#line 112 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 113 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 115 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 116 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 117 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 119 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 121 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 120 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 123 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 125 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 124 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 127 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_3] = - { -#line 128 - .trainerName = _("GRUNT"), -#line 129 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 130 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 132 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 133 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 134 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 136 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 138 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 137 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 140 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_4] = - { -#line 141 - .trainerName = _("GRUNT"), -#line 142 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 143 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 145 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 146 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 147 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 149 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 151 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 150 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 153 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SEAFLOOR_CAVERN_1] = - { -#line 154 - .trainerName = _("GRUNT"), -#line 155 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 156 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 158 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 159 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 160 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 162 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 164 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 163 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 166 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SEAFLOOR_CAVERN_2] = - { -#line 167 - .trainerName = _("GRUNT"), -#line 168 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 169 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 171 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 172 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 173 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 175 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 177 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 176 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 179 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SEAFLOOR_CAVERN_3] = - { -#line 180 - .trainerName = _("GRUNT"), -#line 181 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 182 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 184 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 185 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 186 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 188 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 190 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 189 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 192 - [DIFFICULTY_NORMAL][TRAINER_GABRIELLE_1] = - { -#line 193 - .trainerName = _("GABRIELLE"), -#line 194 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 195 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 196 -F_TRAINER_FEMALE | -#line 197 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 198 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 199 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 201 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 203 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 202 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 205 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 207 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 206 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 209 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 211 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 210 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 213 - .species = SPECIES_LOTAD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 215 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 214 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 217 - .species = SPECIES_SEEDOT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 219 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 218 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 221 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 223 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 222 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 225 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_PETALBURG_WOODS] = - { -#line 226 - .trainerName = _("GRUNT"), -#line 227 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 228 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 230 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 231 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 232 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 234 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 236 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 235 - .lvl = 9, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 238 - [DIFFICULTY_NORMAL][TRAINER_MARCEL] = - { -#line 239 - .trainerName = _("MARCEL"), -#line 240 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 241 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 243 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 244 - .items = { ITEM_HYPER_POTION }, -#line 245 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 246 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 248 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 250 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 249 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 252 - .species = SPECIES_SHIFTRY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 254 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 253 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 256 - [DIFFICULTY_NORMAL][TRAINER_ALBERTO] = - { -#line 257 - .trainerName = _("ALBERTO"), -#line 258 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 259 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 261 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 262 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 263 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 265 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 267 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 266 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 269 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 271 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 270 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 273 - [DIFFICULTY_NORMAL][TRAINER_ED] = - { -#line 274 - .trainerName = _("ED"), -#line 275 - .trainerClass = TRAINER_CLASS_COLLECTOR, -#line 276 - .trainerPic = TRAINER_PIC_COLLECTOR, - .encounterMusic_gender = -#line 278 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 279 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 280 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 282 - .species = SPECIES_ZANGOOSE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 284 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 283 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 286 - .species = SPECIES_SEVIPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 288 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 287 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 290 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SEAFLOOR_CAVERN_4] = - { -#line 291 - .trainerName = _("GRUNT"), -#line 292 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 293 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = -#line 294 -F_TRAINER_FEMALE | -#line 295 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 296 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 297 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 299 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 301 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 300 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 303 - [DIFFICULTY_NORMAL][TRAINER_DECLAN] = - { -#line 304 - .trainerName = _("DECLAN"), -#line 305 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 306 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 308 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 309 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 310 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 312 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 314 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 313 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 316 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_RUSTURF_TUNNEL] = - { -#line 317 - .trainerName = _("GRUNT"), -#line 318 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 319 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 321 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 322 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 323 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 325 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 327 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 326 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 329 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_WEATHER_INST_1] = - { -#line 330 - .trainerName = _("GRUNT"), -#line 331 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 332 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 334 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 335 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 336 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 338 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 340 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 339 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 342 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 344 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 343 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 346 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_WEATHER_INST_2] = - { -#line 347 - .trainerName = _("GRUNT"), -#line 348 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 349 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 351 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 352 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 353 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 355 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 357 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 356 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 359 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 361 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 360 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 363 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_WEATHER_INST_3] = - { -#line 364 - .trainerName = _("GRUNT"), -#line 365 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 366 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 368 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 369 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 370 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 372 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 374 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 373 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 376 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 378 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 377 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 380 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 382 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 381 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 384 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MUSEUM_1] = - { -#line 385 - .trainerName = _("GRUNT"), -#line 386 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 387 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 389 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 390 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 391 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 393 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 395 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 394 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 397 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MUSEUM_2] = - { -#line 398 - .trainerName = _("GRUNT"), -#line 399 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 400 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 402 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 403 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 404 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 406 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 408 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 407 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 410 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 412 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 411 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 414 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SPACE_CENTER_1] = - { -#line 415 - .trainerName = _("GRUNT"), -#line 416 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 417 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 419 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 420 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 421 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 423 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 425 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 424 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 427 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MT_PYRE_1] = - { -#line 428 - .trainerName = _("GRUNT"), -#line 429 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 430 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 432 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 433 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 434 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 436 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 438 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 437 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 440 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MT_PYRE_2] = - { -#line 441 - .trainerName = _("GRUNT"), -#line 442 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 443 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 445 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 446 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 447 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 449 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 451 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 450 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 453 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MT_PYRE_3] = - { -#line 454 - .trainerName = _("GRUNT"), -#line 455 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 456 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 458 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 459 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 460 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 462 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 464 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 463 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 466 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 468 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 467 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 470 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_WEATHER_INST_4] = - { -#line 471 - .trainerName = _("GRUNT"), -#line 472 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 473 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = -#line 474 -F_TRAINER_FEMALE | -#line 475 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 476 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 477 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 479 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 481 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 480 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 483 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_5] = - { -#line 484 - .trainerName = _("GRUNT"), -#line 485 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 486 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = -#line 487 -F_TRAINER_FEMALE | -#line 488 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 489 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 490 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 492 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 494 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 493 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 496 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_6] = - { -#line 497 - .trainerName = _("GRUNT"), -#line 498 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 499 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = -#line 500 -F_TRAINER_FEMALE | -#line 501 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 502 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 503 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 505 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 507 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 506 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 509 - [DIFFICULTY_NORMAL][TRAINER_FREDRICK] = - { -#line 510 - .trainerName = _("FREDRICK"), -#line 511 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 512 - .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = -#line 514 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 515 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 516 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 518 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 520 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 519 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 522 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 524 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 523 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 526 - [DIFFICULTY_NORMAL][TRAINER_MATT] = - { -#line 527 - .trainerName = _("MATT"), -#line 528 - .trainerClass = TRAINER_CLASS_AQUA_ADMIN, -#line 529 - .trainerPic = TRAINER_PIC_AQUA_ADMIN_M, - .encounterMusic_gender = -#line 531 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 532 - .items = { ITEM_SUPER_POTION }, -#line 533 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 534 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 536 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 538 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 537 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 540 - .species = SPECIES_GOLBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 542 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 541 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 544 - [DIFFICULTY_NORMAL][TRAINER_ZANDER] = - { -#line 545 - .trainerName = _("ZANDER"), -#line 546 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 547 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 549 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 550 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 551 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 553 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 555 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 554 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 557 - [DIFFICULTY_NORMAL][TRAINER_SHELLY_WEATHER_INSTITUTE] = - { -#line 558 - .trainerName = _("SHELLY"), -#line 559 - .trainerClass = TRAINER_CLASS_AQUA_ADMIN, -#line 560 - .trainerPic = TRAINER_PIC_AQUA_ADMIN_F, - .encounterMusic_gender = -#line 561 -F_TRAINER_FEMALE | -#line 562 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 563 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 564 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 566 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 568 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 567 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 570 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 572 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 571 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 574 - [DIFFICULTY_NORMAL][TRAINER_SHELLY_SEAFLOOR_CAVERN] = - { -#line 575 - .trainerName = _("SHELLY"), -#line 576 - .trainerClass = TRAINER_CLASS_AQUA_ADMIN, -#line 577 - .trainerPic = TRAINER_PIC_AQUA_ADMIN_F, - .encounterMusic_gender = -#line 578 -F_TRAINER_FEMALE | -#line 579 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 580 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 581 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 583 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 585 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 584 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 587 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 589 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 588 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 591 - [DIFFICULTY_NORMAL][TRAINER_ARCHIE] = - { -#line 592 - .trainerName = _("ARCHIE"), -#line 593 - .trainerClass = TRAINER_CLASS_AQUA_LEADER, -#line 594 - .trainerPic = TRAINER_PIC_AQUA_LEADER_ARCHIE, - .encounterMusic_gender = -#line 596 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 597 - .items = { ITEM_SUPER_POTION, ITEM_SUPER_POTION }, -#line 598 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 599 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 601 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 603 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 602 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 605 - .species = SPECIES_CROBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 607 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 606 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 609 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 611 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 610 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 613 - [DIFFICULTY_NORMAL][TRAINER_LEAH] = - { -#line 614 - .trainerName = _("LEAH"), -#line 615 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 616 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 617 -F_TRAINER_FEMALE | -#line 618 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 619 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 620 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 622 - .species = SPECIES_SPOINK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 624 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 623 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 626 - [DIFFICULTY_NORMAL][TRAINER_DAISY] = - { -#line 627 - .trainerName = _("DAISY"), -#line 628 - .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 629 - .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = -#line 630 -F_TRAINER_FEMALE | -#line 631 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 632 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 633 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 635 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 637 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 636 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 639 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 641 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 640 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 643 - [DIFFICULTY_NORMAL][TRAINER_ROSE_1] = - { -#line 644 - .trainerName = _("ROSE"), -#line 645 - .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 646 - .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = -#line 647 -F_TRAINER_FEMALE | -#line 648 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 649 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 650 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 652 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 654 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 653 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 656 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 658 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 657 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 660 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 662 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 661 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 664 - [DIFFICULTY_NORMAL][TRAINER_FELIX] = - { -#line 665 - .trainerName = _("FELIX"), -#line 666 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 667 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 669 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 670 - .items = { ITEM_FULL_RESTORE }, -#line 671 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 672 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 674 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 676 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 675 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 677 - MOVE_PSYCHIC, - }, - }, - { -#line 679 - .species = SPECIES_CLAYDOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 681 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 680 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 682 - MOVE_SKILL_SWAP, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 685 - [DIFFICULTY_NORMAL][TRAINER_VIOLET] = - { -#line 686 - .trainerName = _("VIOLET"), -#line 687 - .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 688 - .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = -#line 689 -F_TRAINER_FEMALE | -#line 690 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 691 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 692 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 694 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 696 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 695 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 698 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 700 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 699 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 702 - [DIFFICULTY_NORMAL][TRAINER_ROSE_2] = - { -#line 703 - .trainerName = _("ROSE"), -#line 704 - .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 705 - .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = -#line 706 -F_TRAINER_FEMALE | -#line 707 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 708 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 709 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 711 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 713 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 712 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 715 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 717 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 716 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 719 - [DIFFICULTY_NORMAL][TRAINER_ROSE_3] = - { -#line 720 - .trainerName = _("ROSE"), -#line 721 - .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 722 - .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = -#line 723 -F_TRAINER_FEMALE | -#line 724 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 725 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 726 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 728 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 730 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 729 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 732 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 734 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 733 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 736 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 738 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 737 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 740 - [DIFFICULTY_NORMAL][TRAINER_ROSE_4] = - { -#line 741 - .trainerName = _("ROSE"), -#line 742 - .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 743 - .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = -#line 744 -F_TRAINER_FEMALE | -#line 745 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 746 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 747 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 749 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 751 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 750 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 753 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 755 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 754 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 757 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 759 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 758 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 761 - [DIFFICULTY_NORMAL][TRAINER_ROSE_5] = - { -#line 762 - .trainerName = _("ROSE"), -#line 763 - .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 764 - .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = -#line 765 -F_TRAINER_FEMALE | -#line 766 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 767 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 768 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 770 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 772 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 771 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 774 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 776 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 775 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 778 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 780 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 779 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 782 - [DIFFICULTY_NORMAL][TRAINER_DUSTY_1] = - { -#line 783 - .trainerName = _("DUSTY"), -#line 784 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 785 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 787 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 788 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 789 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 791 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 793 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 792 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 794 - MOVE_DIG, - MOVE_SLASH, - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - }, - }, - }, - }, -#line 799 - [DIFFICULTY_NORMAL][TRAINER_CHIP] = - { -#line 800 - .trainerName = _("CHIP"), -#line 801 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 802 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 804 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 805 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 806 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 808 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 810 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 809 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 811 - MOVE_PSYBEAM, - MOVE_SELF_DESTRUCT, - MOVE_SANDSTORM, - MOVE_ANCIENT_POWER, - }, - }, - { -#line 816 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 818 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 817 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 819 - MOVE_DIG, - MOVE_SLASH, - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - }, - }, - { -#line 824 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 826 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 825 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 827 - MOVE_DIG, - MOVE_SLASH, - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - }, - }, - }, - }, -#line 832 - [DIFFICULTY_NORMAL][TRAINER_FOSTER] = - { -#line 833 - .trainerName = _("FOSTER"), -#line 834 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 835 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 837 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 838 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 839 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 841 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 843 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 842 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 844 - MOVE_DIG, - MOVE_SLASH, - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - }, - }, - { -#line 849 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 851 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 850 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 852 - MOVE_DIG, - MOVE_SLASH, - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - }, - }, - }, - }, -#line 857 - [DIFFICULTY_NORMAL][TRAINER_DUSTY_2] = - { -#line 858 - .trainerName = _("DUSTY"), -#line 859 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 860 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 862 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 863 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 864 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 866 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 868 - .iv = TRAINER_PARTY_IVS(7, 7, 7, 7, 7, 7), -#line 867 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 869 - MOVE_DIG, - MOVE_SLASH, - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - }, - }, - }, - }, -#line 874 - [DIFFICULTY_NORMAL][TRAINER_DUSTY_3] = - { -#line 875 - .trainerName = _("DUSTY"), -#line 876 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 877 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 879 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 880 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 881 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 883 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 885 - .iv = TRAINER_PARTY_IVS(8, 8, 8, 8, 8, 8), -#line 884 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 886 - MOVE_DIG, - MOVE_SLASH, - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - }, - }, - }, - }, -#line 891 - [DIFFICULTY_NORMAL][TRAINER_DUSTY_4] = - { -#line 892 - .trainerName = _("DUSTY"), -#line 893 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 894 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 896 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 897 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 898 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 900 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 902 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 901 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 903 - MOVE_DIG, - MOVE_SLASH, - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - }, - }, - }, - }, -#line 908 - [DIFFICULTY_NORMAL][TRAINER_DUSTY_5] = - { -#line 909 - .trainerName = _("DUSTY"), -#line 910 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 911 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 913 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 914 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 915 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 917 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 919 - .iv = TRAINER_PARTY_IVS(10, 10, 10, 10, 10, 10), -#line 918 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 920 - MOVE_DIG, - MOVE_SLASH, - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - }, - }, - }, - }, -#line 925 - [DIFFICULTY_NORMAL][TRAINER_GABBY_AND_TY_1] = - { -#line 926 - .trainerName = _("GABBY & TY"), -#line 927 - .trainerClass = TRAINER_CLASS_INTERVIEWER, -#line 928 - .trainerPic = TRAINER_PIC_INTERVIEWER, - .encounterMusic_gender = -#line 930 - TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, -#line 931 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 932 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 934 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 936 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 935 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 938 - .species = SPECIES_WHISMUR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 940 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 939 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 942 - [DIFFICULTY_NORMAL][TRAINER_GABBY_AND_TY_2] = - { -#line 943 - .trainerName = _("GABBY & TY"), -#line 944 - .trainerClass = TRAINER_CLASS_INTERVIEWER, -#line 945 - .trainerPic = TRAINER_PIC_INTERVIEWER, - .encounterMusic_gender = -#line 947 - TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, -#line 948 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 949 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 951 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 953 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 952 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 955 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 957 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 956 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 959 - [DIFFICULTY_NORMAL][TRAINER_GABBY_AND_TY_3] = - { -#line 960 - .trainerName = _("GABBY & TY"), -#line 961 - .trainerClass = TRAINER_CLASS_INTERVIEWER, -#line 962 - .trainerPic = TRAINER_PIC_INTERVIEWER, - .encounterMusic_gender = -#line 964 - TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, -#line 965 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 966 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 968 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 970 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 969 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 972 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 974 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 973 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 976 - [DIFFICULTY_NORMAL][TRAINER_GABBY_AND_TY_4] = - { -#line 977 - .trainerName = _("GABBY & TY"), -#line 978 - .trainerClass = TRAINER_CLASS_INTERVIEWER, -#line 979 - .trainerPic = TRAINER_PIC_INTERVIEWER, - .encounterMusic_gender = -#line 981 - TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, -#line 982 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 983 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 985 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 987 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 986 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 989 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 991 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 990 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 993 - [DIFFICULTY_NORMAL][TRAINER_GABBY_AND_TY_5] = - { -#line 994 - .trainerName = _("GABBY & TY"), -#line 995 - .trainerClass = TRAINER_CLASS_INTERVIEWER, -#line 996 - .trainerPic = TRAINER_PIC_INTERVIEWER, - .encounterMusic_gender = -#line 998 - TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, -#line 999 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 1000 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1002 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1004 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 1003 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1006 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1008 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 1007 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1010 - [DIFFICULTY_NORMAL][TRAINER_GABBY_AND_TY_6] = - { -#line 1011 - .trainerName = _("GABBY & TY"), -#line 1012 - .trainerClass = TRAINER_CLASS_INTERVIEWER, -#line 1013 - .trainerPic = TRAINER_PIC_INTERVIEWER, - .encounterMusic_gender = -#line 1015 - TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, -#line 1016 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 1017 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1019 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1021 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 1020 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1022 - MOVE_SONIC_BOOM, - MOVE_THUNDER_WAVE, - MOVE_METAL_SOUND, - MOVE_THUNDERBOLT, - }, - }, - { -#line 1027 - .species = SPECIES_EXPLOUD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1029 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 1028 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1030 - MOVE_ASTONISH, - MOVE_STOMP, - MOVE_SUPERSONIC, - MOVE_HYPER_VOICE, - }, - }, - }, - }, -#line 1035 - [DIFFICULTY_NORMAL][TRAINER_LOLA_1] = - { -#line 1036 - .trainerName = _("LOLA"), -#line 1037 - .trainerClass = TRAINER_CLASS_TUBER_F, -#line 1038 - .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = -#line 1039 -F_TRAINER_FEMALE | -#line 1040 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1041 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1042 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1044 - .species = SPECIES_AZURILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1046 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 1045 - .lvl = 12, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1048 - .species = SPECIES_AZURILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1050 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 1049 - .lvl = 12, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1052 - [DIFFICULTY_NORMAL][TRAINER_AUSTINA] = - { -#line 1053 - .trainerName = _("AUSTINA"), -#line 1054 - .trainerClass = TRAINER_CLASS_TUBER_F, -#line 1055 - .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = -#line 1056 -F_TRAINER_FEMALE | -#line 1057 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1058 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1059 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1061 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1063 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1062 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1065 - [DIFFICULTY_NORMAL][TRAINER_GWEN] = - { -#line 1066 - .trainerName = _("GWEN"), -#line 1067 - .trainerClass = TRAINER_CLASS_TUBER_F, -#line 1068 - .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = -#line 1069 -F_TRAINER_FEMALE | -#line 1070 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1071 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1072 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1074 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1076 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1075 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1078 - [DIFFICULTY_NORMAL][TRAINER_LOLA_2] = - { -#line 1079 - .trainerName = _("LOLA"), -#line 1080 - .trainerClass = TRAINER_CLASS_TUBER_F, -#line 1081 - .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = -#line 1082 -F_TRAINER_FEMALE | -#line 1083 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1084 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1085 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1087 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1089 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 1088 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1091 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1093 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 1092 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1095 - [DIFFICULTY_NORMAL][TRAINER_LOLA_3] = - { -#line 1096 - .trainerName = _("LOLA"), -#line 1097 - .trainerClass = TRAINER_CLASS_TUBER_F, -#line 1098 - .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = -#line 1099 -F_TRAINER_FEMALE | -#line 1100 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1101 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1102 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1104 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1106 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 1105 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1108 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1110 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 1109 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1112 - [DIFFICULTY_NORMAL][TRAINER_LOLA_4] = - { -#line 1113 - .trainerName = _("LOLA"), -#line 1114 - .trainerClass = TRAINER_CLASS_TUBER_F, -#line 1115 - .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = -#line 1116 -F_TRAINER_FEMALE | -#line 1117 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1118 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1119 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1121 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1123 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 1122 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1125 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1127 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 1126 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1129 - [DIFFICULTY_NORMAL][TRAINER_LOLA_5] = - { -#line 1130 - .trainerName = _("LOLA"), -#line 1131 - .trainerClass = TRAINER_CLASS_TUBER_F, -#line 1132 - .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = -#line 1133 -F_TRAINER_FEMALE | -#line 1134 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1135 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1136 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1138 - .species = SPECIES_AZUMARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1140 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 1139 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1142 - .species = SPECIES_AZUMARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1144 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 1143 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1146 - [DIFFICULTY_NORMAL][TRAINER_RICKY_1] = - { -#line 1147 - .trainerName = _("RICKY"), -#line 1148 - .trainerClass = TRAINER_CLASS_TUBER_M, -#line 1149 - .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = -#line 1151 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1152 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1153 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1155 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1157 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 1156 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1158 - MOVE_SAND_ATTACK, - MOVE_HEADBUTT, - MOVE_TAIL_WHIP, - MOVE_SURF, - }, - }, - }, - }, -#line 1163 - [DIFFICULTY_NORMAL][TRAINER_SIMON] = - { -#line 1164 - .trainerName = _("SIMON"), -#line 1165 - .trainerClass = TRAINER_CLASS_TUBER_M, -#line 1166 - .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = -#line 1168 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1169 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1170 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1172 - .species = SPECIES_AZURILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1174 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1173 - .lvl = 12, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1176 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1178 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1177 - .lvl = 12, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1180 - [DIFFICULTY_NORMAL][TRAINER_CHARLIE] = - { -#line 1181 - .trainerName = _("CHARLIE"), -#line 1182 - .trainerClass = TRAINER_CLASS_TUBER_M, -#line 1183 - .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = -#line 1185 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1186 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1187 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1189 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1191 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1190 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1193 - [DIFFICULTY_NORMAL][TRAINER_RICKY_2] = - { -#line 1194 - .trainerName = _("RICKY"), -#line 1195 - .trainerClass = TRAINER_CLASS_TUBER_M, -#line 1196 - .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = -#line 1198 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1199 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1200 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1202 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1204 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 1203 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1205 - MOVE_SAND_ATTACK, - MOVE_PIN_MISSILE, - MOVE_TAIL_WHIP, - MOVE_SURF, - }, - }, - }, - }, -#line 1210 - [DIFFICULTY_NORMAL][TRAINER_RICKY_3] = - { -#line 1211 - .trainerName = _("RICKY"), -#line 1212 - .trainerClass = TRAINER_CLASS_TUBER_M, -#line 1213 - .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = -#line 1215 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1216 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1217 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1219 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1221 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 1220 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1222 - MOVE_SAND_ATTACK, - MOVE_PIN_MISSILE, - MOVE_TAIL_WHIP, - MOVE_SURF, - }, - }, - }, - }, -#line 1227 - [DIFFICULTY_NORMAL][TRAINER_RICKY_4] = - { -#line 1228 - .trainerName = _("RICKY"), -#line 1229 - .trainerClass = TRAINER_CLASS_TUBER_M, -#line 1230 - .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = -#line 1232 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1233 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1234 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1236 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1238 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 1237 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1239 - MOVE_SAND_ATTACK, - MOVE_PIN_MISSILE, - MOVE_TAIL_WHIP, - MOVE_SURF, - }, - }, - }, - }, -#line 1244 - [DIFFICULTY_NORMAL][TRAINER_RICKY_5] = - { -#line 1245 - .trainerName = _("RICKY"), -#line 1246 - .trainerClass = TRAINER_CLASS_TUBER_M, -#line 1247 - .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = -#line 1249 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1250 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1251 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1253 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1255 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 1254 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1256 - MOVE_SAND_ATTACK, - MOVE_PIN_MISSILE, - MOVE_TAIL_WHIP, - MOVE_SURF, - }, - }, - }, - }, -#line 1261 - [DIFFICULTY_NORMAL][TRAINER_RANDALL] = - { -#line 1262 - .trainerName = _("RANDALL"), -#line 1263 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1264 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1266 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1267 - .items = { ITEM_HYPER_POTION }, -#line 1268 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1269 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1271 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1273 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 1272 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1274 - MOVE_QUICK_ATTACK, - MOVE_AGILITY, - MOVE_WING_ATTACK, - }, - }, - }, - }, -#line 1278 - [DIFFICULTY_NORMAL][TRAINER_PARKER] = - { -#line 1279 - .trainerName = _("PARKER"), -#line 1280 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1281 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1283 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1284 - .items = { ITEM_HYPER_POTION }, -#line 1285 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1286 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1288 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1290 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 1289 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1291 - MOVE_TEETER_DANCE, - MOVE_DIZZY_PUNCH, - MOVE_FOCUS_PUNCH, - }, - }, - }, - }, -#line 1295 - [DIFFICULTY_NORMAL][TRAINER_GEORGE] = - { -#line 1296 - .trainerName = _("GEORGE"), -#line 1297 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1298 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1300 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1301 - .items = { ITEM_HYPER_POTION }, -#line 1302 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1303 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1305 - .species = SPECIES_SLAKOTH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1305 - .heldItem = ITEM_SITRUS_BERRY, -#line 1307 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 1306 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1308 - MOVE_SLACK_OFF, - MOVE_COUNTER, - MOVE_SHADOW_BALL, - }, - }, - }, - }, -#line 1312 - [DIFFICULTY_NORMAL][TRAINER_BERKE] = - { -#line 1313 - .trainerName = _("BERKE"), -#line 1314 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1315 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1317 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1318 - .items = { ITEM_HYPER_POTION }, -#line 1319 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1320 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1322 - .species = SPECIES_VIGOROTH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1324 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 1323 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1325 - MOVE_FOCUS_ENERGY, - MOVE_SLASH, - }, - }, - }, - }, -#line 1328 - [DIFFICULTY_NORMAL][TRAINER_BRAXTON] = - { -#line 1329 - .trainerName = _("BRAXTON"), -#line 1330 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1331 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1333 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1334 - .items = { ITEM_HYPER_POTION }, -#line 1335 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1336 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 1338 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1340 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1339 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1341 - MOVE_FOCUS_ENERGY, - MOVE_QUICK_ATTACK, - MOVE_WING_ATTACK, - MOVE_ENDEAVOR, - }, - }, - { -#line 1346 - .species = SPECIES_TRAPINCH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1348 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1347 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1349 - MOVE_BITE, - MOVE_DIG, - MOVE_FEINT_ATTACK, - MOVE_SAND_TOMB, - }, - }, - { -#line 1354 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1356 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1355 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1357 - MOVE_ROLLOUT, - MOVE_WHIRLPOOL, - MOVE_ASTONISH, - MOVE_WATER_PULSE, - }, - }, - { -#line 1362 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1364 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1363 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1365 - MOVE_THUNDERBOLT, - MOVE_SUPERSONIC, - MOVE_THUNDER_WAVE, - MOVE_SONIC_BOOM, - }, - }, - { -#line 1370 - .species = SPECIES_SHIFTRY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1372 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1371 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1373 - MOVE_GIGA_DRAIN, - MOVE_FEINT_ATTACK, - MOVE_DOUBLE_TEAM, - MOVE_SWAGGER, - }, - }, - }, - }, -#line 1378 - [DIFFICULTY_NORMAL][TRAINER_VINCENT] = - { -#line 1379 - .trainerName = _("VINCENT"), -#line 1380 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1381 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1383 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1384 - .items = { ITEM_FULL_RESTORE }, -#line 1385 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1386 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1388 - .species = SPECIES_SABLEYE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1390 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1389 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1392 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1394 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1393 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1396 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1398 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1397 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1400 - [DIFFICULTY_NORMAL][TRAINER_LEROY] = - { -#line 1401 - .trainerName = _("LEROY"), -#line 1402 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1403 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1405 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1406 - .items = { ITEM_FULL_RESTORE }, -#line 1407 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1408 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1410 - .species = SPECIES_MAWILE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1412 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1411 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1414 - .species = SPECIES_STARMIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1416 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1415 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1418 - [DIFFICULTY_NORMAL][TRAINER_WILTON_1] = - { -#line 1419 - .trainerName = _("WILTON"), -#line 1420 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1421 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1423 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1424 - .items = { ITEM_SUPER_POTION }, -#line 1425 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1426 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1428 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1430 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1429 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1432 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1434 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1433 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1436 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1438 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1437 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1440 - [DIFFICULTY_NORMAL][TRAINER_EDGAR] = - { -#line 1441 - .trainerName = _("EDGAR"), -#line 1442 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1443 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1445 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1446 - .items = { ITEM_FULL_RESTORE }, -#line 1447 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1448 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1450 - .species = SPECIES_CACTURNE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1452 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1451 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1454 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1456 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1455 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1458 - [DIFFICULTY_NORMAL][TRAINER_ALBERT] = - { -#line 1459 - .trainerName = _("ALBERT"), -#line 1460 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1461 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1463 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1464 - .items = { ITEM_FULL_RESTORE }, -#line 1465 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1466 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1468 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1470 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1469 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1472 - .species = SPECIES_MUK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1474 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1473 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1476 - [DIFFICULTY_NORMAL][TRAINER_SAMUEL] = - { -#line 1477 - .trainerName = _("SAMUEL"), -#line 1478 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1479 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1481 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1482 - .items = { ITEM_FULL_RESTORE }, -#line 1483 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1484 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1486 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1488 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1487 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1490 - .species = SPECIES_MAWILE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1492 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1491 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1494 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1496 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1495 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1498 - [DIFFICULTY_NORMAL][TRAINER_VITO] = - { -#line 1499 - .trainerName = _("VITO"), -#line 1500 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1501 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1503 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1504 - .items = { ITEM_FULL_RESTORE }, -#line 1505 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1506 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 1508 - .species = SPECIES_DODRIO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1510 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1509 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1512 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1514 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1513 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1516 - .species = SPECIES_ELECTRODE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1518 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1517 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1520 - .species = SPECIES_SHIFTRY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1522 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1521 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1524 - [DIFFICULTY_NORMAL][TRAINER_OWEN] = - { -#line 1525 - .trainerName = _("OWEN"), -#line 1526 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1527 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1529 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1530 - .items = { ITEM_FULL_RESTORE }, -#line 1531 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1532 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1534 - .species = SPECIES_KECLEON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1536 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1535 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1538 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1540 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1539 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1542 - .species = SPECIES_WAILORD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1544 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1543 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1546 - [DIFFICULTY_NORMAL][TRAINER_WILTON_2] = - { -#line 1547 - .trainerName = _("WILTON"), -#line 1548 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1549 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1551 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1552 - .items = { ITEM_HYPER_POTION }, -#line 1553 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1554 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1556 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1558 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 1557 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1560 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1562 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 1561 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1564 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1566 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 1565 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1568 - [DIFFICULTY_NORMAL][TRAINER_WILTON_3] = - { -#line 1569 - .trainerName = _("WILTON"), -#line 1570 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1571 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1573 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1574 - .items = { ITEM_HYPER_POTION }, -#line 1575 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1576 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1578 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1580 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 1579 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1582 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1584 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 1583 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1586 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1588 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 1587 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1590 - [DIFFICULTY_NORMAL][TRAINER_WILTON_4] = - { -#line 1591 - .trainerName = _("WILTON"), -#line 1592 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1593 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1595 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1596 - .items = { ITEM_FULL_RESTORE }, -#line 1597 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1598 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1600 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1602 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 1601 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1604 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1606 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 1605 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1608 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1610 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 1609 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1612 - [DIFFICULTY_NORMAL][TRAINER_WILTON_5] = - { -#line 1613 - .trainerName = _("WILTON"), -#line 1614 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1615 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1617 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1618 - .items = { ITEM_FULL_RESTORE }, -#line 1619 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1620 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1622 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1624 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 1623 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1626 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1628 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 1627 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1630 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1632 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 1631 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1634 - [DIFFICULTY_NORMAL][TRAINER_WARREN] = - { -#line 1635 - .trainerName = _("WARREN"), -#line 1636 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1637 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1639 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1640 - .items = { ITEM_FULL_RESTORE }, -#line 1641 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1642 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1644 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1646 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1645 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1648 - .species = SPECIES_LUDICOLO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1650 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1649 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1652 - [DIFFICULTY_NORMAL][TRAINER_MARY] = - { -#line 1653 - .trainerName = _("MARY"), -#line 1654 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1655 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1656 -F_TRAINER_FEMALE | -#line 1657 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1658 - .items = { ITEM_HYPER_POTION }, -#line 1659 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1660 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1662 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1664 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 1663 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1665 - MOVE_FEINT_ATTACK, - MOVE_SHOCK_WAVE, - }, - }, - }, - }, -#line 1668 - [DIFFICULTY_NORMAL][TRAINER_ALEXIA] = - { -#line 1669 - .trainerName = _("ALEXIA"), -#line 1670 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1671 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1672 -F_TRAINER_FEMALE | -#line 1673 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1674 - .items = { ITEM_HYPER_POTION }, -#line 1675 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1676 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1678 - .species = SPECIES_WIGGLYTUFF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1680 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 1679 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1681 - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_SHADOW_BALL, - }, - }, - }, - }, -#line 1685 - [DIFFICULTY_NORMAL][TRAINER_JODY] = - { -#line 1686 - .trainerName = _("JODY"), -#line 1687 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1688 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1689 -F_TRAINER_FEMALE | -#line 1690 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1691 - .items = { ITEM_HYPER_POTION }, -#line 1692 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1693 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1695 - .species = SPECIES_ZANGOOSE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1697 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 1696 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1698 - MOVE_SWORDS_DANCE, - MOVE_SLASH, - }, - }, - }, - }, -#line 1701 - [DIFFICULTY_NORMAL][TRAINER_WENDY] = - { -#line 1702 - .trainerName = _("WENDY"), -#line 1703 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1704 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1705 -F_TRAINER_FEMALE | -#line 1706 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1707 - .items = { ITEM_FULL_RESTORE }, -#line 1708 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1709 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1711 - .species = SPECIES_MAWILE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1713 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1712 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1714 - MOVE_BATON_PASS, - MOVE_FEINT_ATTACK, - MOVE_FAKE_TEARS, - MOVE_BITE, - }, - }, - { -#line 1719 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1721 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1720 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1722 - MOVE_MEGA_DRAIN, - MOVE_MAGICAL_LEAF, - MOVE_GRASS_WHISTLE, - MOVE_LEECH_SEED, - }, - }, - { -#line 1727 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1729 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1728 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1730 - MOVE_FLY, - MOVE_WATER_GUN, - MOVE_MIST, - MOVE_PROTECT, - }, - }, - }, - }, -#line 1735 - [DIFFICULTY_NORMAL][TRAINER_KEIRA] = - { -#line 1736 - .trainerName = _("KEIRA"), -#line 1737 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1738 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1739 -F_TRAINER_FEMALE | -#line 1740 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1741 - .items = { ITEM_FULL_RESTORE }, -#line 1742 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1743 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1745 - .species = SPECIES_LAIRON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1747 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1746 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1749 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1751 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1750 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1753 - [DIFFICULTY_NORMAL][TRAINER_BROOKE_1] = - { -#line 1754 - .trainerName = _("BROOKE"), -#line 1755 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1756 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1757 -F_TRAINER_FEMALE | -#line 1758 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1759 - .items = { ITEM_SUPER_POTION }, -#line 1760 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1761 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1763 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1765 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1764 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1767 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1769 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1768 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1771 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1773 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1772 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1775 - [DIFFICULTY_NORMAL][TRAINER_JENNIFER] = - { -#line 1776 - .trainerName = _("JENNIFER"), -#line 1777 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1778 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1779 -F_TRAINER_FEMALE | -#line 1780 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1781 - .items = { ITEM_FULL_RESTORE }, -#line 1782 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1783 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1785 - .species = SPECIES_SABLEYE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1787 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 1786 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1789 - [DIFFICULTY_NORMAL][TRAINER_HOPE] = - { -#line 1790 - .trainerName = _("HOPE"), -#line 1791 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1792 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1793 -F_TRAINER_FEMALE | -#line 1794 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1795 - .items = { ITEM_FULL_RESTORE }, -#line 1796 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1797 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1799 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1801 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1800 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1803 - [DIFFICULTY_NORMAL][TRAINER_SHANNON] = - { -#line 1804 - .trainerName = _("SHANNON"), -#line 1805 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1806 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1807 -F_TRAINER_FEMALE | -#line 1808 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1809 - .items = { ITEM_FULL_RESTORE }, -#line 1810 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1811 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1813 - .species = SPECIES_CLAYDOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1815 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1814 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1817 - [DIFFICULTY_NORMAL][TRAINER_MICHELLE] = - { -#line 1818 - .trainerName = _("MICHELLE"), -#line 1819 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1820 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1821 -F_TRAINER_FEMALE | -#line 1822 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1823 - .items = { ITEM_FULL_RESTORE }, -#line 1824 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1825 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1827 - .species = SPECIES_TORKOAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1829 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1828 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1831 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1833 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1832 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1835 - .species = SPECIES_LUDICOLO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1837 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1836 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1839 - [DIFFICULTY_NORMAL][TRAINER_CAROLINE] = - { -#line 1840 - .trainerName = _("CAROLINE"), -#line 1841 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1842 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1843 -F_TRAINER_FEMALE | -#line 1844 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1845 - .items = { ITEM_FULL_RESTORE }, -#line 1846 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1847 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1849 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1851 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1850 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1853 - .species = SPECIES_SABLEYE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1855 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1854 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1857 - [DIFFICULTY_NORMAL][TRAINER_JULIE] = - { -#line 1858 - .trainerName = _("JULIE"), -#line 1859 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1860 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1861 -F_TRAINER_FEMALE | -#line 1862 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1863 - .items = { ITEM_FULL_RESTORE }, -#line 1864 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1865 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1867 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1869 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1868 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1871 - .species = SPECIES_NINETALES, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1873 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1872 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1875 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1877 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1876 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1879 - [DIFFICULTY_NORMAL][TRAINER_BROOKE_2] = - { -#line 1880 - .trainerName = _("BROOKE"), -#line 1881 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1882 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1883 -F_TRAINER_FEMALE | -#line 1884 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1885 - .items = { ITEM_HYPER_POTION }, -#line 1886 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1887 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1889 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1891 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 1890 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1893 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1895 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 1894 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1897 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1899 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 1898 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1901 - [DIFFICULTY_NORMAL][TRAINER_BROOKE_3] = - { -#line 1902 - .trainerName = _("BROOKE"), -#line 1903 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1904 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1905 -F_TRAINER_FEMALE | -#line 1906 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1907 - .items = { ITEM_HYPER_POTION }, -#line 1908 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1909 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1911 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1913 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 1912 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1915 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1917 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 1916 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1919 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1921 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 1920 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1923 - [DIFFICULTY_NORMAL][TRAINER_BROOKE_4] = - { -#line 1924 - .trainerName = _("BROOKE"), -#line 1925 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1926 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1927 -F_TRAINER_FEMALE | -#line 1928 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1929 - .items = { ITEM_FULL_RESTORE }, -#line 1930 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1931 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1933 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1935 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 1934 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1937 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1939 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 1938 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1941 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1943 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 1942 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1945 - [DIFFICULTY_NORMAL][TRAINER_BROOKE_5] = - { -#line 1946 - .trainerName = _("BROOKE"), -#line 1947 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1948 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1949 -F_TRAINER_FEMALE | -#line 1950 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1951 - .items = { ITEM_FULL_RESTORE }, -#line 1952 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1953 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1955 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1957 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 1956 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1959 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1961 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 1960 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1963 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1965 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 1964 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1967 - [DIFFICULTY_NORMAL][TRAINER_PATRICIA] = - { -#line 1968 - .trainerName = _("PATRICIA"), -#line 1969 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 1970 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 1971 -F_TRAINER_FEMALE | -#line 1972 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 1973 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1974 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1976 - .species = SPECIES_BANETTE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1978 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1977 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1980 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1982 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1981 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1984 - [DIFFICULTY_NORMAL][TRAINER_KINDRA] = - { -#line 1985 - .trainerName = _("KINDRA"), -#line 1986 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 1987 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 1988 -F_TRAINER_FEMALE | -#line 1989 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 1990 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1991 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1993 - .species = SPECIES_DUSKULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1995 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1994 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1997 - .species = SPECIES_SHUPPET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1999 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1998 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2001 - [DIFFICULTY_NORMAL][TRAINER_TAMMY] = - { -#line 2002 - .trainerName = _("TAMMY"), -#line 2003 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 2004 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 2005 -F_TRAINER_FEMALE | -#line 2006 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2007 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2008 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2010 - .species = SPECIES_DUSKULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2012 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2011 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2014 - .species = SPECIES_SHUPPET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2016 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2015 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2018 - [DIFFICULTY_NORMAL][TRAINER_VALERIE_1] = - { -#line 2019 - .trainerName = _("VALERIE"), -#line 2020 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 2021 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 2022 -F_TRAINER_FEMALE | -#line 2023 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2024 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2025 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2027 - .species = SPECIES_SABLEYE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2029 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2028 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2031 - [DIFFICULTY_NORMAL][TRAINER_TASHA] = - { -#line 2032 - .trainerName = _("TASHA"), -#line 2033 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 2034 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 2035 -F_TRAINER_FEMALE | -#line 2036 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2037 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2038 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2040 - .species = SPECIES_SHUPPET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2042 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 2041 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2044 - [DIFFICULTY_NORMAL][TRAINER_VALERIE_2] = - { -#line 2045 - .trainerName = _("VALERIE"), -#line 2046 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 2047 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 2048 -F_TRAINER_FEMALE | -#line 2049 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2050 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2051 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2053 - .species = SPECIES_SABLEYE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2055 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2054 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2057 - .species = SPECIES_SPOINK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2059 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2058 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2061 - [DIFFICULTY_NORMAL][TRAINER_VALERIE_3] = - { -#line 2062 - .trainerName = _("VALERIE"), -#line 2063 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 2064 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 2065 -F_TRAINER_FEMALE | -#line 2066 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2067 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2068 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2070 - .species = SPECIES_SPOINK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2072 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 2071 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2074 - .species = SPECIES_SABLEYE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2076 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 2075 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2078 - [DIFFICULTY_NORMAL][TRAINER_VALERIE_4] = - { -#line 2079 - .trainerName = _("VALERIE"), -#line 2080 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 2081 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 2082 -F_TRAINER_FEMALE | -#line 2083 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2084 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2085 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2087 - .species = SPECIES_SPOINK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2089 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 2088 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2091 - .species = SPECIES_SABLEYE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2093 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 2092 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2095 - [DIFFICULTY_NORMAL][TRAINER_VALERIE_5] = - { -#line 2096 - .trainerName = _("VALERIE"), -#line 2097 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 2098 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 2099 -F_TRAINER_FEMALE | -#line 2100 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2101 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2102 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 2104 - .species = SPECIES_DUSKULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2106 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2105 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2108 - .species = SPECIES_SABLEYE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2110 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2109 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2112 - .species = SPECIES_GRUMPIG, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2114 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2113 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2116 - [DIFFICULTY_NORMAL][TRAINER_CINDY_1] = - { -#line 2117 - .trainerName = _("CINDY"), -#line 2118 - .trainerClass = TRAINER_CLASS_LADY, -#line 2119 - .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = -#line 2120 -F_TRAINER_FEMALE | -#line 2121 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2122 - .items = { ITEM_FULL_RESTORE }, -#line 2123 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2124 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2126 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2126 - .heldItem = ITEM_NUGGET, -#line 2128 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2127 - .lvl = 7, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2130 - [DIFFICULTY_NORMAL][TRAINER_DAPHNE] = - { -#line 2131 - .trainerName = _("DAPHNE"), -#line 2132 - .trainerClass = TRAINER_CLASS_LADY, -#line 2133 - .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = -#line 2134 -F_TRAINER_FEMALE | -#line 2135 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2136 - .items = { ITEM_FULL_RESTORE }, -#line 2137 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2138 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2140 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2140 - .heldItem = ITEM_NUGGET, -#line 2142 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2141 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2143 - MOVE_ATTRACT, - MOVE_SWEET_KISS, - MOVE_FLAIL, - MOVE_WATER_PULSE, - }, - }, - { -#line 2148 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2148 - .heldItem = ITEM_NUGGET, -#line 2150 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2149 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2151 - MOVE_ATTRACT, - MOVE_SAFEGUARD, - MOVE_TAKE_DOWN, - MOVE_WATER_PULSE, - }, - }, - }, - }, -#line 2156 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SPACE_CENTER_2] = - { -#line 2157 - .trainerName = _("GRUNT"), -#line 2158 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 2159 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 2161 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 2162 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2163 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 2165 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2167 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2166 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2169 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2171 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2170 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2173 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2175 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2174 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2177 - [DIFFICULTY_NORMAL][TRAINER_CINDY_2] = - { -#line 2178 - .trainerName = _("CINDY"), -#line 2179 - .trainerClass = TRAINER_CLASS_LADY, -#line 2180 - .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = -#line 2181 -F_TRAINER_FEMALE | -#line 2182 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2183 - .items = { ITEM_FULL_RESTORE }, -#line 2184 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2185 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2187 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2187 - .heldItem = ITEM_NUGGET, -#line 2189 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2188 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2190 - MOVE_TACKLE, - MOVE_TAIL_WHIP, - }, - }, - }, - }, -#line 2193 - [DIFFICULTY_NORMAL][TRAINER_BRIANNA] = - { -#line 2194 - .trainerName = _("BRIANNA"), -#line 2195 - .trainerClass = TRAINER_CLASS_LADY, -#line 2196 - .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = -#line 2197 -F_TRAINER_FEMALE | -#line 2198 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2199 - .items = { ITEM_FULL_RESTORE }, -#line 2200 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2201 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2203 - .species = SPECIES_SEAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2203 - .heldItem = ITEM_NUGGET, -#line 2205 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 2204 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2207 - [DIFFICULTY_NORMAL][TRAINER_NAOMI] = - { -#line 2208 - .trainerName = _("NAOMI"), -#line 2209 - .trainerClass = TRAINER_CLASS_LADY, -#line 2210 - .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = -#line 2211 -F_TRAINER_FEMALE | -#line 2212 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2213 - .items = { ITEM_FULL_RESTORE }, -#line 2214 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2215 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2217 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2217 - .heldItem = ITEM_NUGGET, -#line 2219 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2218 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2221 - [DIFFICULTY_NORMAL][TRAINER_CINDY_3] = - { -#line 2222 - .trainerName = _("CINDY"), -#line 2223 - .trainerClass = TRAINER_CLASS_LADY, -#line 2224 - .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = -#line 2225 -F_TRAINER_FEMALE | -#line 2226 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2227 - .items = { ITEM_FULL_RESTORE }, -#line 2228 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2229 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2231 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2231 - .heldItem = ITEM_NUGGET, -#line 2233 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2232 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2235 - [DIFFICULTY_NORMAL][TRAINER_CINDY_4] = - { -#line 2236 - .trainerName = _("CINDY"), -#line 2237 - .trainerClass = TRAINER_CLASS_LADY, -#line 2238 - .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = -#line 2239 -F_TRAINER_FEMALE | -#line 2240 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2241 - .items = { ITEM_FULL_RESTORE }, -#line 2242 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2243 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2245 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2245 - .heldItem = ITEM_NUGGET, -#line 2247 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 2246 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2249 - [DIFFICULTY_NORMAL][TRAINER_CINDY_5] = - { -#line 2250 - .trainerName = _("CINDY"), -#line 2251 - .trainerClass = TRAINER_CLASS_LADY, -#line 2252 - .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = -#line 2253 -F_TRAINER_FEMALE | -#line 2254 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2255 - .items = { ITEM_FULL_RESTORE }, -#line 2256 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2257 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2259 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2259 - .heldItem = ITEM_NUGGET, -#line 2261 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 2260 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2263 - [DIFFICULTY_NORMAL][TRAINER_CINDY_6] = - { -#line 2264 - .trainerName = _("CINDY"), -#line 2265 - .trainerClass = TRAINER_CLASS_LADY, -#line 2266 - .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = -#line 2267 -F_TRAINER_FEMALE | -#line 2268 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2269 - .items = { ITEM_FULL_RESTORE }, -#line 2270 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2271 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2273 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2273 - .heldItem = ITEM_NUGGET, -#line 2275 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2274 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2276 - MOVE_FURY_SWIPES, - MOVE_MUD_SPORT, - MOVE_ODOR_SLEUTH, - MOVE_SAND_ATTACK, - }, - }, - }, - }, -#line 2281 - [DIFFICULTY_NORMAL][TRAINER_MELISSA] = - { -#line 2282 - .trainerName = _("MELISSA"), -#line 2283 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2284 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2285 -F_TRAINER_FEMALE | -#line 2286 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2287 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2288 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2290 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2292 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2291 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2294 - [DIFFICULTY_NORMAL][TRAINER_SHEILA] = - { -#line 2295 - .trainerName = _("SHEILA"), -#line 2296 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2297 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2298 -F_TRAINER_FEMALE | -#line 2299 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2300 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2301 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2303 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2305 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2304 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2307 - [DIFFICULTY_NORMAL][TRAINER_SHIRLEY] = - { -#line 2308 - .trainerName = _("SHIRLEY"), -#line 2309 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2310 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2311 -F_TRAINER_FEMALE | -#line 2312 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2313 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2314 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2316 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2318 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2317 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2320 - [DIFFICULTY_NORMAL][TRAINER_JESSICA_1] = - { -#line 2321 - .trainerName = _("JESSICA"), -#line 2322 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2323 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2324 -F_TRAINER_FEMALE | -#line 2325 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2326 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2327 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2329 - .species = SPECIES_KECLEON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2331 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2330 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2332 - MOVE_BIND, - MOVE_LICK, - MOVE_FURY_SWIPES, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 2337 - .species = SPECIES_SEVIPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2339 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2338 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2340 - MOVE_POISON_TAIL, - MOVE_SCREECH, - MOVE_GLARE, - MOVE_CRUNCH, - }, - }, - }, - }, -#line 2345 - [DIFFICULTY_NORMAL][TRAINER_CONNIE] = - { -#line 2346 - .trainerName = _("CONNIE"), -#line 2347 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2348 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2349 -F_TRAINER_FEMALE | -#line 2350 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2351 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2352 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2354 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2356 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2355 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2358 - [DIFFICULTY_NORMAL][TRAINER_BRIDGET] = - { -#line 2359 - .trainerName = _("BRIDGET"), -#line 2360 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2361 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2362 -F_TRAINER_FEMALE | -#line 2363 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2364 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2365 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2367 - .species = SPECIES_AZUMARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2369 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 2368 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2371 - [DIFFICULTY_NORMAL][TRAINER_OLIVIA] = - { -#line 2372 - .trainerName = _("OLIVIA"), -#line 2373 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2374 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2375 -F_TRAINER_FEMALE | -#line 2376 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2377 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2378 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 2380 - .species = SPECIES_CLAMPERL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2382 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2381 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2383 - MOVE_IRON_DEFENSE, - MOVE_WHIRLPOOL, - MOVE_RAIN_DANCE, - MOVE_WATER_PULSE, - }, - }, - { -#line 2388 - .species = SPECIES_CORPHISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2390 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2389 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2391 - MOVE_TAUNT, - MOVE_CRABHAMMER, - MOVE_WATER_PULSE, - }, - }, - { -#line 2395 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2397 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2396 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2398 - MOVE_UPROAR, - MOVE_FURY_SWIPES, - MOVE_FAKE_OUT, - MOVE_WATER_PULSE, - }, - }, - }, - }, -#line 2403 - [DIFFICULTY_NORMAL][TRAINER_TIFFANY] = - { -#line 2404 - .trainerName = _("TIFFANY"), -#line 2405 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2406 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2407 -F_TRAINER_FEMALE | -#line 2408 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2409 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2410 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2412 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2414 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2413 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2416 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2418 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2417 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2420 - [DIFFICULTY_NORMAL][TRAINER_JESSICA_2] = - { -#line 2421 - .trainerName = _("JESSICA"), -#line 2422 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2423 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2424 -F_TRAINER_FEMALE | -#line 2425 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2426 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2427 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2429 - .species = SPECIES_KECLEON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2431 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2430 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2432 - MOVE_BIND, - MOVE_LICK, - MOVE_FURY_SWIPES, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 2437 - .species = SPECIES_SEVIPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2439 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2438 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2440 - MOVE_POISON_TAIL, - MOVE_SCREECH, - MOVE_GLARE, - MOVE_CRUNCH, - }, - }, - }, - }, -#line 2445 - [DIFFICULTY_NORMAL][TRAINER_JESSICA_3] = - { -#line 2446 - .trainerName = _("JESSICA"), -#line 2447 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2448 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2449 -F_TRAINER_FEMALE | -#line 2450 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2451 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2452 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2454 - .species = SPECIES_KECLEON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2456 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 2455 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2457 - MOVE_BIND, - MOVE_LICK, - MOVE_FURY_SWIPES, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 2462 - .species = SPECIES_SEVIPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2464 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 2463 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2465 - MOVE_POISON_TAIL, - MOVE_SCREECH, - MOVE_GLARE, - MOVE_CRUNCH, - }, - }, - }, - }, -#line 2470 - [DIFFICULTY_NORMAL][TRAINER_JESSICA_4] = - { -#line 2471 - .trainerName = _("JESSICA"), -#line 2472 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2473 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2474 -F_TRAINER_FEMALE | -#line 2475 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2476 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2477 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2479 - .species = SPECIES_KECLEON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2481 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 2480 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2482 - MOVE_BIND, - MOVE_LICK, - MOVE_FURY_SWIPES, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 2487 - .species = SPECIES_SEVIPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2489 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 2488 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2490 - MOVE_POISON_TAIL, - MOVE_SCREECH, - MOVE_GLARE, - MOVE_CRUNCH, - }, - }, - }, - }, -#line 2495 - [DIFFICULTY_NORMAL][TRAINER_JESSICA_5] = - { -#line 2496 - .trainerName = _("JESSICA"), -#line 2497 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2498 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2499 -F_TRAINER_FEMALE | -#line 2500 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2501 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2502 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2504 - .species = SPECIES_KECLEON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2506 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2505 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2507 - MOVE_BIND, - MOVE_LICK, - MOVE_FURY_SWIPES, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 2512 - .species = SPECIES_SEVIPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2514 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2513 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2515 - MOVE_POISON_TAIL, - MOVE_SCREECH, - MOVE_GLARE, - MOVE_CRUNCH, - }, - }, - }, - }, -#line 2520 - [DIFFICULTY_NORMAL][TRAINER_WINSTON_1] = - { -#line 2521 - .trainerName = _("WINSTON"), -#line 2522 - .trainerClass = TRAINER_CLASS_RICH_BOY, -#line 2523 - .trainerPic = TRAINER_PIC_RICH_BOY, - .encounterMusic_gender = -#line 2525 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 2526 - .items = { ITEM_FULL_RESTORE }, -#line 2527 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2528 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2530 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2530 - .heldItem = ITEM_NUGGET, -#line 2532 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2531 - .lvl = 7, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2534 - [DIFFICULTY_NORMAL][TRAINER_MOLLIE] = - { -#line 2535 - .trainerName = _("MOLLIE"), -#line 2536 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 2537 - .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = -#line 2538 -F_TRAINER_FEMALE | -#line 2539 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 2540 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2541 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2543 - .species = SPECIES_WHISCASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2545 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2544 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2547 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2549 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 2548 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2551 - [DIFFICULTY_NORMAL][TRAINER_GARRET] = - { -#line 2552 - .trainerName = _("GARRET"), -#line 2553 - .trainerClass = TRAINER_CLASS_RICH_BOY, -#line 2554 - .trainerPic = TRAINER_PIC_RICH_BOY, - .encounterMusic_gender = -#line 2556 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 2557 - .items = { ITEM_FULL_RESTORE }, -#line 2558 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2559 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2561 - .species = SPECIES_AZUMARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2561 - .heldItem = ITEM_NUGGET, -#line 2563 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2562 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2565 - [DIFFICULTY_NORMAL][TRAINER_WINSTON_2] = - { -#line 2566 - .trainerName = _("WINSTON"), -#line 2567 - .trainerClass = TRAINER_CLASS_RICH_BOY, -#line 2568 - .trainerPic = TRAINER_PIC_RICH_BOY, - .encounterMusic_gender = -#line 2570 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 2571 - .items = { ITEM_FULL_RESTORE }, -#line 2572 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2573 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2575 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2575 - .heldItem = ITEM_NUGGET, -#line 2577 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2576 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2579 - [DIFFICULTY_NORMAL][TRAINER_WINSTON_3] = - { -#line 2580 - .trainerName = _("WINSTON"), -#line 2581 - .trainerClass = TRAINER_CLASS_RICH_BOY, -#line 2582 - .trainerPic = TRAINER_PIC_RICH_BOY, - .encounterMusic_gender = -#line 2584 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 2585 - .items = { ITEM_FULL_RESTORE }, -#line 2586 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2587 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2589 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2589 - .heldItem = ITEM_NUGGET, -#line 2591 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2590 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2593 - [DIFFICULTY_NORMAL][TRAINER_WINSTON_4] = - { -#line 2594 - .trainerName = _("WINSTON"), -#line 2595 - .trainerClass = TRAINER_CLASS_RICH_BOY, -#line 2596 - .trainerPic = TRAINER_PIC_RICH_BOY, - .encounterMusic_gender = -#line 2598 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 2599 - .items = { ITEM_FULL_RESTORE }, -#line 2600 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2601 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2603 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2603 - .heldItem = ITEM_NUGGET, -#line 2605 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2604 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2607 - [DIFFICULTY_NORMAL][TRAINER_WINSTON_5] = - { -#line 2608 - .trainerName = _("WINSTON"), -#line 2609 - .trainerClass = TRAINER_CLASS_RICH_BOY, -#line 2610 - .trainerPic = TRAINER_PIC_RICH_BOY, - .encounterMusic_gender = -#line 2612 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 2613 - .items = { ITEM_FULL_RESTORE }, -#line 2614 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2615 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2617 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2617 - .heldItem = ITEM_NUGGET, -#line 2619 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2618 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2620 - MOVE_FURY_SWIPES, - MOVE_MUD_SPORT, - MOVE_ODOR_SLEUTH, - MOVE_SAND_ATTACK, - }, - }, - }, - }, -#line 2625 - [DIFFICULTY_NORMAL][TRAINER_STEVE_1] = - { -#line 2626 - .trainerName = _("STEVE"), -#line 2627 - .trainerClass = TRAINER_CLASS_POKEMANIAC, -#line 2628 - .trainerPic = TRAINER_PIC_POKEMANIAC, - .encounterMusic_gender = -#line 2630 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2631 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2632 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2634 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2636 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2635 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2638 - [DIFFICULTY_NORMAL][TRAINER_THALIA_1] = - { -#line 2639 - .trainerName = _("THALIA"), -#line 2640 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2641 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2642 -F_TRAINER_FEMALE | -#line 2643 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2644 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2645 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2647 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2649 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2648 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2651 - .species = SPECIES_HORSEA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2653 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2652 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2655 - [DIFFICULTY_NORMAL][TRAINER_MARK] = - { -#line 2656 - .trainerName = _("MARK"), -#line 2657 - .trainerClass = TRAINER_CLASS_POKEMANIAC, -#line 2658 - .trainerPic = TRAINER_PIC_POKEMANIAC, - .encounterMusic_gender = -#line 2660 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2661 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2662 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2664 - .species = SPECIES_RHYHORN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2666 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2665 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2668 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MT_CHIMNEY_1] = - { -#line 2669 - .trainerName = _("GRUNT"), -#line 2670 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 2671 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, - .encounterMusic_gender = -#line 2672 -F_TRAINER_FEMALE | -#line 2673 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 2674 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2675 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2677 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2679 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2678 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2681 - [DIFFICULTY_NORMAL][TRAINER_STEVE_2] = - { -#line 2682 - .trainerName = _("STEVE"), -#line 2683 - .trainerClass = TRAINER_CLASS_POKEMANIAC, -#line 2684 - .trainerPic = TRAINER_PIC_POKEMANIAC, - .encounterMusic_gender = -#line 2686 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2687 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2688 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2690 - .species = SPECIES_LAIRON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2692 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2691 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2694 - [DIFFICULTY_NORMAL][TRAINER_STEVE_3] = - { -#line 2695 - .trainerName = _("STEVE"), -#line 2696 - .trainerClass = TRAINER_CLASS_POKEMANIAC, -#line 2697 - .trainerPic = TRAINER_PIC_POKEMANIAC, - .encounterMusic_gender = -#line 2699 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2700 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2701 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2703 - .species = SPECIES_LAIRON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2705 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 2704 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2707 - .species = SPECIES_RHYHORN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2709 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 2708 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2711 - [DIFFICULTY_NORMAL][TRAINER_STEVE_4] = - { -#line 2712 - .trainerName = _("STEVE"), -#line 2713 - .trainerClass = TRAINER_CLASS_POKEMANIAC, -#line 2714 - .trainerPic = TRAINER_PIC_POKEMANIAC, - .encounterMusic_gender = -#line 2716 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2717 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2718 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2720 - .species = SPECIES_LAIRON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2722 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 2721 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2724 - .species = SPECIES_RHYHORN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2726 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 2725 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2728 - [DIFFICULTY_NORMAL][TRAINER_STEVE_5] = - { -#line 2729 - .trainerName = _("STEVE"), -#line 2730 - .trainerClass = TRAINER_CLASS_POKEMANIAC, -#line 2731 - .trainerPic = TRAINER_PIC_POKEMANIAC, - .encounterMusic_gender = -#line 2733 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2734 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2735 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2737 - .species = SPECIES_AGGRON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2739 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2738 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2741 - .species = SPECIES_RHYDON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2743 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2742 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2745 - [DIFFICULTY_NORMAL][TRAINER_LUIS] = - { -#line 2746 - .trainerName = _("LUIS"), -#line 2747 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2748 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2750 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2751 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2752 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2754 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2756 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2755 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2758 - [DIFFICULTY_NORMAL][TRAINER_DOMINIK] = - { -#line 2759 - .trainerName = _("DOMINIK"), -#line 2760 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2761 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2763 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2764 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2765 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2767 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2769 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2768 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2771 - [DIFFICULTY_NORMAL][TRAINER_DOUGLAS] = - { -#line 2772 - .trainerName = _("DOUGLAS"), -#line 2773 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2774 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2776 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2777 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2778 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2780 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2782 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2781 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2784 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2786 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2785 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2788 - [DIFFICULTY_NORMAL][TRAINER_DARRIN] = - { -#line 2789 - .trainerName = _("DARRIN"), -#line 2790 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2791 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2793 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2794 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2795 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 2797 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2799 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2798 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2801 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2803 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2802 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2805 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2807 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2806 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2809 - [DIFFICULTY_NORMAL][TRAINER_TONY_1] = - { -#line 2810 - .trainerName = _("TONY"), -#line 2811 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2812 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2814 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2815 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2816 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2818 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2820 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2819 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2822 - [DIFFICULTY_NORMAL][TRAINER_JEROME] = - { -#line 2823 - .trainerName = _("JEROME"), -#line 2824 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2825 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2827 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2828 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2829 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2831 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2833 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2832 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2835 - [DIFFICULTY_NORMAL][TRAINER_MATTHEW] = - { -#line 2836 - .trainerName = _("MATTHEW"), -#line 2837 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2838 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2840 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2841 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2842 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2844 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2846 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2845 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2848 - [DIFFICULTY_NORMAL][TRAINER_DAVID] = - { -#line 2849 - .trainerName = _("DAVID"), -#line 2850 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2851 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2853 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2854 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2855 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2857 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2859 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2858 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2861 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2863 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2862 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2865 - [DIFFICULTY_NORMAL][TRAINER_SPENCER] = - { -#line 2866 - .trainerName = _("SPENCER"), -#line 2867 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2868 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2870 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2871 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2872 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2874 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2876 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2875 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2878 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2880 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2879 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2882 - [DIFFICULTY_NORMAL][TRAINER_ROLAND] = - { -#line 2883 - .trainerName = _("ROLAND"), -#line 2884 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2885 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2887 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2888 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2889 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2891 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2893 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2892 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2895 - [DIFFICULTY_NORMAL][TRAINER_NOLEN] = - { -#line 2896 - .trainerName = _("NOLEN"), -#line 2897 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2898 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2900 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2901 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2902 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2904 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2906 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2905 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2908 - [DIFFICULTY_NORMAL][TRAINER_STAN] = - { -#line 2909 - .trainerName = _("STAN"), -#line 2910 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2911 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2913 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2914 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2915 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2917 - .species = SPECIES_HORSEA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2919 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2918 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2921 - [DIFFICULTY_NORMAL][TRAINER_BARRY] = - { -#line 2922 - .trainerName = _("BARRY"), -#line 2923 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2924 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2926 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2927 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2928 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2930 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2932 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2931 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2934 - [DIFFICULTY_NORMAL][TRAINER_DEAN] = - { -#line 2935 - .trainerName = _("DEAN"), -#line 2936 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2937 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2939 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2940 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2941 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 2943 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2945 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2944 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2947 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2949 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2948 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2951 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2953 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2952 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2955 - [DIFFICULTY_NORMAL][TRAINER_RODNEY] = - { -#line 2956 - .trainerName = _("RODNEY"), -#line 2957 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2958 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2960 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2961 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2962 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2964 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2966 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2965 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2968 - [DIFFICULTY_NORMAL][TRAINER_RICHARD] = - { -#line 2969 - .trainerName = _("RICHARD"), -#line 2970 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2971 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2973 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2974 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2975 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2977 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2979 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2978 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2981 - [DIFFICULTY_NORMAL][TRAINER_HERMAN] = - { -#line 2982 - .trainerName = _("HERMAN"), -#line 2983 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2984 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2986 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2987 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2988 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2990 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2992 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2991 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2994 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2996 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2995 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2998 - [DIFFICULTY_NORMAL][TRAINER_SANTIAGO] = - { -#line 2999 - .trainerName = _("SANTIAGO"), -#line 3000 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3001 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3003 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3004 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3005 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3007 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3009 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3008 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3011 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3013 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3012 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3015 - [DIFFICULTY_NORMAL][TRAINER_GILBERT] = - { -#line 3016 - .trainerName = _("GILBERT"), -#line 3017 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3018 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3020 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3021 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3022 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3024 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3026 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3025 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3028 - [DIFFICULTY_NORMAL][TRAINER_FRANKLIN] = - { -#line 3029 - .trainerName = _("FRANKLIN"), -#line 3030 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3031 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3033 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3034 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3035 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3037 - .species = SPECIES_SEALEO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3039 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3038 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3041 - [DIFFICULTY_NORMAL][TRAINER_KEVIN] = - { -#line 3042 - .trainerName = _("KEVIN"), -#line 3043 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3044 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3046 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3047 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3048 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3050 - .species = SPECIES_SPHEAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3052 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3051 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3054 - [DIFFICULTY_NORMAL][TRAINER_JACK] = - { -#line 3055 - .trainerName = _("JACK"), -#line 3056 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3057 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3059 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3060 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3061 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3063 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3065 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3064 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3067 - [DIFFICULTY_NORMAL][TRAINER_DUDLEY] = - { -#line 3068 - .trainerName = _("DUDLEY"), -#line 3069 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3070 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3072 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3073 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3074 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3076 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3078 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3077 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3080 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3082 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3081 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3084 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3086 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3085 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3088 - [DIFFICULTY_NORMAL][TRAINER_CHAD] = - { -#line 3089 - .trainerName = _("CHAD"), -#line 3090 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3091 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3093 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3094 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3095 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3097 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3099 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3098 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3101 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3103 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3102 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3105 - [DIFFICULTY_NORMAL][TRAINER_TONY_2] = - { -#line 3106 - .trainerName = _("TONY"), -#line 3107 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3108 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3110 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3111 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3112 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3114 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3116 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3115 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3118 - [DIFFICULTY_NORMAL][TRAINER_TONY_3] = - { -#line 3119 - .trainerName = _("TONY"), -#line 3120 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3121 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3123 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3124 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3125 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3127 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3129 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3128 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3131 - [DIFFICULTY_NORMAL][TRAINER_TONY_4] = - { -#line 3132 - .trainerName = _("TONY"), -#line 3133 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3134 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3136 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3137 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3138 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3140 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3142 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3141 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3144 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3146 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3145 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3148 - [DIFFICULTY_NORMAL][TRAINER_TONY_5] = - { -#line 3149 - .trainerName = _("TONY"), -#line 3150 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3151 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3153 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3154 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3155 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3157 - .species = SPECIES_STARMIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3159 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3158 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3161 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3163 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3162 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3165 - [DIFFICULTY_NORMAL][TRAINER_TAKAO] = - { -#line 3166 - .trainerName = _("TAKAO"), -#line 3167 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3168 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3170 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3171 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3172 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3174 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3176 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 3175 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3178 - [DIFFICULTY_NORMAL][TRAINER_HITOSHI] = - { -#line 3179 - .trainerName = _("HITOSHI"), -#line 3180 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3181 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3183 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3184 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3185 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3187 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3189 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 3188 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3191 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3193 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 3192 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3195 - [DIFFICULTY_NORMAL][TRAINER_KIYO] = - { -#line 3196 - .trainerName = _("KIYO"), -#line 3197 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3198 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3200 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3201 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3202 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3204 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3206 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3205 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3208 - [DIFFICULTY_NORMAL][TRAINER_KOICHI] = - { -#line 3209 - .trainerName = _("KOICHI"), -#line 3210 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3211 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3213 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3214 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3215 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3217 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3219 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3218 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3221 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3223 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 3222 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3225 - [DIFFICULTY_NORMAL][TRAINER_NOB_1] = - { -#line 3226 - .trainerName = _("NOB"), -#line 3227 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3228 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3230 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3231 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3232 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3234 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3236 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3235 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3238 - [DIFFICULTY_NORMAL][TRAINER_NOB_2] = - { -#line 3239 - .trainerName = _("NOB"), -#line 3240 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3241 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3243 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3244 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3245 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3247 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3249 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 3248 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3251 - [DIFFICULTY_NORMAL][TRAINER_NOB_3] = - { -#line 3252 - .trainerName = _("NOB"), -#line 3253 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3254 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3256 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3257 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3258 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3260 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3262 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 3261 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3264 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3266 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 3265 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3268 - [DIFFICULTY_NORMAL][TRAINER_NOB_4] = - { -#line 3269 - .trainerName = _("NOB"), -#line 3270 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3271 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3273 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3274 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3275 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3277 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3279 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 3278 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3281 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3283 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 3282 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3285 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3287 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 3286 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3289 - [DIFFICULTY_NORMAL][TRAINER_NOB_5] = - { -#line 3290 - .trainerName = _("NOB"), -#line 3291 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3292 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3294 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3295 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3296 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 3298 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3300 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 3299 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3302 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3304 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 3303 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3306 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3308 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 3307 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3310 - .species = SPECIES_MACHAMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3310 - .heldItem = ITEM_BLACK_BELT, -#line 3312 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 3311 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3314 - [DIFFICULTY_NORMAL][TRAINER_YUJI] = - { -#line 3315 - .trainerName = _("YUJI"), -#line 3316 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3317 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3319 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3320 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3321 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3323 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3325 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3324 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3327 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3329 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3328 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3331 - [DIFFICULTY_NORMAL][TRAINER_DAISUKE] = - { -#line 3332 - .trainerName = _("DAISUKE"), -#line 3333 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3334 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3336 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3337 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3338 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3340 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3342 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3341 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3344 - [DIFFICULTY_NORMAL][TRAINER_ATSUSHI] = - { -#line 3345 - .trainerName = _("ATSUSHI"), -#line 3346 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3347 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3349 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3350 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3351 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3353 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3355 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3354 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3357 - [DIFFICULTY_NORMAL][TRAINER_KIRK] = - { -#line 3358 - .trainerName = _("KIRK"), -#line 3359 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3360 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 3362 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3363 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3364 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3366 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3368 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3367 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 3369 - MOVE_QUICK_ATTACK, - MOVE_THUNDER_WAVE, - MOVE_SPARK, - MOVE_LEER, - }, - }, - { -#line 3374 - .species = SPECIES_VOLTORB, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3376 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3375 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 3377 - MOVE_CHARGE, - MOVE_SHOCK_WAVE, - MOVE_SCREECH, - }, - }, - }, - }, -#line 3381 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_7] = - { -#line 3382 - .trainerName = _("GRUNT"), -#line 3383 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 3384 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = -#line 3385 -F_TRAINER_FEMALE | -#line 3386 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 3387 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3388 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3390 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3392 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3391 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3394 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3396 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3395 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3398 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_8] = - { -#line 3399 - .trainerName = _("GRUNT"), -#line 3400 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 3401 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 3403 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 3404 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3405 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3407 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3409 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3408 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3411 - [DIFFICULTY_NORMAL][TRAINER_SHAWN] = - { -#line 3412 - .trainerName = _("SHAWN"), -#line 3413 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3414 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 3416 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3417 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3418 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3420 - .species = SPECIES_VOLTORB, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3422 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3421 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3424 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3426 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3425 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3428 - [DIFFICULTY_NORMAL][TRAINER_FERNANDO_1] = - { -#line 3429 - .trainerName = _("FERNANDO"), -#line 3430 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3431 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 3433 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3434 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3435 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3437 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3439 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3438 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3441 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3443 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3442 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3445 - [DIFFICULTY_NORMAL][TRAINER_DALTON_1] = - { -#line 3446 - .trainerName = _("DALTON"), -#line 3447 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3448 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 3450 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3451 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3452 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3454 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3456 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3455 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3458 - .species = SPECIES_WHISMUR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3460 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3459 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3462 - [DIFFICULTY_NORMAL][TRAINER_DALTON_2] = - { -#line 3463 - .trainerName = _("DALTON"), -#line 3464 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3465 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 3467 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3468 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3469 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3471 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3473 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3472 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3475 - .species = SPECIES_WHISMUR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3477 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3476 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3479 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3481 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3480 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3483 - [DIFFICULTY_NORMAL][TRAINER_DALTON_3] = - { -#line 3484 - .trainerName = _("DALTON"), -#line 3485 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3486 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 3488 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3489 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3490 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3492 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3494 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3493 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3496 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3498 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3497 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3500 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3502 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3501 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3504 - [DIFFICULTY_NORMAL][TRAINER_DALTON_4] = - { -#line 3505 - .trainerName = _("DALTON"), -#line 3506 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3507 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 3509 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3510 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3511 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3513 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3515 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3514 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3517 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3519 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3518 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3521 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3523 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3522 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3525 - [DIFFICULTY_NORMAL][TRAINER_DALTON_5] = - { -#line 3526 - .trainerName = _("DALTON"), -#line 3527 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3528 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 3530 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3531 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3532 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3534 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3536 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3535 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3538 - .species = SPECIES_EXPLOUD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3540 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3539 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3542 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3544 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3543 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3546 - [DIFFICULTY_NORMAL][TRAINER_COLE] = - { -#line 3547 - .trainerName = _("COLE"), -#line 3548 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 3549 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 3551 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3552 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3553 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3555 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3557 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3556 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3559 - [DIFFICULTY_NORMAL][TRAINER_JEFF] = - { -#line 3560 - .trainerName = _("JEFF"), -#line 3561 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 3562 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 3564 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3565 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3566 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3568 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3570 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3569 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3572 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3574 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3573 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3576 - [DIFFICULTY_NORMAL][TRAINER_AXLE] = - { -#line 3577 - .trainerName = _("AXLE"), -#line 3578 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 3579 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 3581 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3582 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3583 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3585 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3587 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3586 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3589 - [DIFFICULTY_NORMAL][TRAINER_JACE] = - { -#line 3590 - .trainerName = _("JACE"), -#line 3591 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 3592 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 3594 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3595 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3596 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3598 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3600 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3599 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3602 - [DIFFICULTY_NORMAL][TRAINER_KEEGAN] = - { -#line 3603 - .trainerName = _("KEEGAN"), -#line 3604 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 3605 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 3607 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3608 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3609 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3611 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3613 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 3612 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3615 - [DIFFICULTY_NORMAL][TRAINER_BERNIE_1] = - { -#line 3616 - .trainerName = _("BERNIE"), -#line 3617 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 3618 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 3620 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3621 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3622 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3624 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3626 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3625 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3628 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3630 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3629 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3632 - [DIFFICULTY_NORMAL][TRAINER_BERNIE_2] = - { -#line 3633 - .trainerName = _("BERNIE"), -#line 3634 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 3635 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 3637 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3638 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3639 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3641 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3643 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3642 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3645 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3647 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3646 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3649 - [DIFFICULTY_NORMAL][TRAINER_BERNIE_3] = - { -#line 3650 - .trainerName = _("BERNIE"), -#line 3651 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 3652 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 3654 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3655 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3656 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3658 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3660 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3659 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3662 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3664 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3663 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3666 - [DIFFICULTY_NORMAL][TRAINER_BERNIE_4] = - { -#line 3667 - .trainerName = _("BERNIE"), -#line 3668 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 3669 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 3671 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3672 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3673 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3675 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3677 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3676 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3679 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3681 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3680 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3683 - [DIFFICULTY_NORMAL][TRAINER_BERNIE_5] = - { -#line 3684 - .trainerName = _("BERNIE"), -#line 3685 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 3686 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 3688 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3689 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3690 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3692 - .species = SPECIES_MAGCARGO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3694 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3693 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3696 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3698 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3697 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3700 - [DIFFICULTY_NORMAL][TRAINER_DREW] = - { -#line 3701 - .trainerName = _("DREW"), -#line 3702 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 3703 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 3705 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3706 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3707 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3709 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3711 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3710 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 3712 - MOVE_DIG, - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - MOVE_SLASH, - }, - }, - }, - }, -#line 3717 - [DIFFICULTY_NORMAL][TRAINER_BEAU] = - { -#line 3718 - .trainerName = _("BEAU"), -#line 3719 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 3720 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 3722 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3723 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3724 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3726 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3728 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3727 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 3729 - MOVE_RAPID_SPIN, - MOVE_MUD_SLAP, - MOVE_PSYBEAM, - MOVE_ROCK_TOMB, - }, - }, - { -#line 3734 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3736 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3735 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 3737 - MOVE_POISON_STING, - MOVE_SAND_ATTACK, - MOVE_SCRATCH, - MOVE_DIG, - }, - }, - { -#line 3742 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3744 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3743 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 3745 - MOVE_RAPID_SPIN, - MOVE_MUD_SLAP, - MOVE_PSYBEAM, - MOVE_ROCK_TOMB, - }, - }, - }, - }, -#line 3750 - [DIFFICULTY_NORMAL][TRAINER_LARRY] = - { -#line 3751 - .trainerName = _("LARRY"), -#line 3752 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 3753 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 3755 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3756 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3757 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3759 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3761 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3760 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3763 - [DIFFICULTY_NORMAL][TRAINER_SHANE] = - { -#line 3764 - .trainerName = _("SHANE"), -#line 3765 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 3766 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 3768 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3769 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3770 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3772 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3774 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3773 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3776 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3778 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3777 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3780 - [DIFFICULTY_NORMAL][TRAINER_JUSTIN] = - { -#line 3781 - .trainerName = _("JUSTIN"), -#line 3782 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 3783 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 3785 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3786 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3787 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3789 - .species = SPECIES_KECLEON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3791 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3790 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3793 - [DIFFICULTY_NORMAL][TRAINER_ETHAN_1] = - { -#line 3794 - .trainerName = _("ETHAN"), -#line 3795 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 3796 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 3798 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3799 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3800 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3802 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3804 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3803 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3806 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3808 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3807 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3810 - [DIFFICULTY_NORMAL][TRAINER_AUTUMN] = - { -#line 3811 - .trainerName = _("AUTUMN"), -#line 3812 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 3813 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 3814 -F_TRAINER_FEMALE | -#line 3815 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 3816 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3817 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3819 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3821 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3820 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3823 - [DIFFICULTY_NORMAL][TRAINER_TRAVIS] = - { -#line 3824 - .trainerName = _("TRAVIS"), -#line 3825 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 3826 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 3828 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3829 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3830 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3832 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3834 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3833 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3836 - [DIFFICULTY_NORMAL][TRAINER_ETHAN_2] = - { -#line 3837 - .trainerName = _("ETHAN"), -#line 3838 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 3839 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 3841 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3842 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3843 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3845 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3847 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3846 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3849 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3851 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3850 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3853 - [DIFFICULTY_NORMAL][TRAINER_ETHAN_3] = - { -#line 3854 - .trainerName = _("ETHAN"), -#line 3855 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 3856 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 3858 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3859 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3860 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3862 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3864 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3863 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3866 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3868 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3867 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3870 - [DIFFICULTY_NORMAL][TRAINER_ETHAN_4] = - { -#line 3871 - .trainerName = _("ETHAN"), -#line 3872 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 3873 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 3875 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3876 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3877 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3879 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3881 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3880 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3883 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3885 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3884 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3887 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3889 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3888 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3891 - [DIFFICULTY_NORMAL][TRAINER_ETHAN_5] = - { -#line 3892 - .trainerName = _("ETHAN"), -#line 3893 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 3894 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 3896 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3897 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3898 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3900 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3902 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3901 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3904 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3906 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3905 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3908 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3910 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3909 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3912 - [DIFFICULTY_NORMAL][TRAINER_BRENT] = - { -#line 3913 - .trainerName = _("BRENT"), -#line 3914 - .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 3915 - .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = -#line 3917 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 3918 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3919 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3921 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3923 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3922 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3925 - [DIFFICULTY_NORMAL][TRAINER_DONALD] = - { -#line 3926 - .trainerName = _("DONALD"), -#line 3927 - .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 3928 - .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = -#line 3930 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 3931 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3932 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3934 - .species = SPECIES_WURMPLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3936 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3935 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3938 - .species = SPECIES_SILCOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3940 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3939 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3942 - .species = SPECIES_BEAUTIFLY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3944 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3943 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3946 - [DIFFICULTY_NORMAL][TRAINER_TAYLOR] = - { -#line 3947 - .trainerName = _("TAYLOR"), -#line 3948 - .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 3949 - .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = -#line 3951 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 3952 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3953 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3955 - .species = SPECIES_WURMPLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3957 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3956 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3959 - .species = SPECIES_CASCOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3961 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3960 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3963 - .species = SPECIES_DUSTOX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3965 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3964 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3967 - [DIFFICULTY_NORMAL][TRAINER_JEFFREY_1] = - { -#line 3968 - .trainerName = _("JEFFREY"), -#line 3969 - .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 3970 - .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = -#line 3972 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 3973 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3974 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3976 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3978 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3977 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3980 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3982 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3981 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3984 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3986 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3985 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3988 - [DIFFICULTY_NORMAL][TRAINER_DEREK] = - { -#line 3989 - .trainerName = _("DEREK"), -#line 3990 - .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 3991 - .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = -#line 3993 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 3994 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3995 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3997 - .species = SPECIES_DUSTOX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3999 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 3998 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4001 - .species = SPECIES_BEAUTIFLY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4003 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 4002 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4005 - [DIFFICULTY_NORMAL][TRAINER_JEFFREY_2] = - { -#line 4006 - .trainerName = _("JEFFREY"), -#line 4007 - .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 4008 - .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = -#line 4010 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 4011 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4012 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 4014 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4016 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 4015 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4018 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4020 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 4019 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4022 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4024 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 4023 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4026 - [DIFFICULTY_NORMAL][TRAINER_JEFFREY_3] = - { -#line 4027 - .trainerName = _("JEFFREY"), -#line 4028 - .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 4029 - .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = -#line 4031 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 4032 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4033 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 4035 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4037 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4036 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4039 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4041 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4040 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4043 - .species = SPECIES_MASQUERAIN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4045 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4044 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4047 - [DIFFICULTY_NORMAL][TRAINER_JEFFREY_4] = - { -#line 4048 - .trainerName = _("JEFFREY"), -#line 4049 - .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 4050 - .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = -#line 4052 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 4053 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4054 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 4056 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4058 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4057 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4060 - .species = SPECIES_WURMPLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4062 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4061 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4064 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4066 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4065 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4068 - .species = SPECIES_MASQUERAIN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4070 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4069 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4072 - [DIFFICULTY_NORMAL][TRAINER_JEFFREY_5] = - { -#line 4073 - .trainerName = _("JEFFREY"), -#line 4074 - .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 4075 - .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = -#line 4077 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 4078 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4079 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 4081 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4083 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4082 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4085 - .species = SPECIES_DUSTOX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4087 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4086 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4089 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4091 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4090 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4093 - .species = SPECIES_MASQUERAIN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4093 - .heldItem = ITEM_SILVER_POWDER, -#line 4095 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4094 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4097 - .species = SPECIES_BEAUTIFLY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4099 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4098 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4101 - [DIFFICULTY_NORMAL][TRAINER_EDWARD] = - { -#line 4102 - .trainerName = _("EDWARD"), -#line 4103 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4104 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4106 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4107 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4108 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4110 - .species = SPECIES_ABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4112 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4111 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4113 - MOVE_HIDDEN_POWER, - }, - }, - }, - }, -#line 4115 - [DIFFICULTY_NORMAL][TRAINER_PRESTON] = - { -#line 4116 - .trainerName = _("PRESTON"), -#line 4117 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4118 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4120 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4121 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4122 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4124 - .species = SPECIES_KIRLIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4126 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4125 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4128 - [DIFFICULTY_NORMAL][TRAINER_VIRGIL] = - { -#line 4129 - .trainerName = _("VIRGIL"), -#line 4130 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4131 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4133 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4134 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4135 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4137 - .species = SPECIES_RALTS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4139 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4138 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4141 - [DIFFICULTY_NORMAL][TRAINER_BLAKE] = - { -#line 4142 - .trainerName = _("BLAKE"), -#line 4143 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4144 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4146 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4147 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4148 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4150 - .species = SPECIES_GIRAFARIG, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4152 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4151 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4154 - [DIFFICULTY_NORMAL][TRAINER_WILLIAM] = - { -#line 4155 - .trainerName = _("WILLIAM"), -#line 4156 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4157 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4159 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4160 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4161 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 4163 - .species = SPECIES_RALTS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4165 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4164 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4167 - .species = SPECIES_RALTS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4169 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4168 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4171 - .species = SPECIES_KIRLIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4173 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4172 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4175 - [DIFFICULTY_NORMAL][TRAINER_JOSHUA] = - { -#line 4176 - .trainerName = _("JOSHUA"), -#line 4177 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4178 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4180 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4181 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4182 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4184 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4186 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4185 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4188 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4190 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4189 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4192 - [DIFFICULTY_NORMAL][TRAINER_CAMERON_1] = - { -#line 4193 - .trainerName = _("CAMERON"), -#line 4194 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4195 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4197 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4198 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4199 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4201 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4203 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4202 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4205 - [DIFFICULTY_NORMAL][TRAINER_CAMERON_2] = - { -#line 4206 - .trainerName = _("CAMERON"), -#line 4207 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4208 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4210 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4211 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4212 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4214 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4216 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 4215 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4218 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4220 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 4219 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4222 - [DIFFICULTY_NORMAL][TRAINER_CAMERON_3] = - { -#line 4223 - .trainerName = _("CAMERON"), -#line 4224 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4225 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4227 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4228 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4229 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4231 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4233 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4232 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4235 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4237 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4236 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4239 - [DIFFICULTY_NORMAL][TRAINER_CAMERON_4] = - { -#line 4240 - .trainerName = _("CAMERON"), -#line 4241 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4242 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4244 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4245 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4246 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4248 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4250 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4249 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4252 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4254 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4253 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4256 - [DIFFICULTY_NORMAL][TRAINER_CAMERON_5] = - { -#line 4257 - .trainerName = _("CAMERON"), -#line 4258 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4259 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4261 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4262 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4263 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4265 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4267 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4266 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4269 - .species = SPECIES_ALAKAZAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4271 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4270 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4273 - [DIFFICULTY_NORMAL][TRAINER_JACLYN] = - { -#line 4274 - .trainerName = _("JACLYN"), -#line 4275 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4276 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4277 -F_TRAINER_FEMALE | -#line 4278 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4279 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4280 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4282 - .species = SPECIES_ABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4284 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4283 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4285 - MOVE_HIDDEN_POWER, - }, - }, - }, - }, -#line 4287 - [DIFFICULTY_NORMAL][TRAINER_HANNAH] = - { -#line 4288 - .trainerName = _("HANNAH"), -#line 4289 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4290 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4291 -F_TRAINER_FEMALE | -#line 4292 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4293 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4294 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4296 - .species = SPECIES_KIRLIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4298 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4297 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4300 - [DIFFICULTY_NORMAL][TRAINER_SAMANTHA] = - { -#line 4301 - .trainerName = _("SAMANTHA"), -#line 4302 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4303 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4304 -F_TRAINER_FEMALE | -#line 4305 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4306 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4307 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4309 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4311 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4310 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4313 - [DIFFICULTY_NORMAL][TRAINER_MAURA] = - { -#line 4314 - .trainerName = _("MAURA"), -#line 4315 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4316 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4317 -F_TRAINER_FEMALE | -#line 4318 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4319 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4320 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4322 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4324 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4323 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4326 - [DIFFICULTY_NORMAL][TRAINER_KAYLA] = - { -#line 4327 - .trainerName = _("KAYLA"), -#line 4328 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4329 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4330 -F_TRAINER_FEMALE | -#line 4331 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4332 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4333 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 4335 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4337 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4336 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4339 - .species = SPECIES_NATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4341 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4340 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4343 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4345 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4344 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4347 - [DIFFICULTY_NORMAL][TRAINER_ALEXIS] = - { -#line 4348 - .trainerName = _("ALEXIS"), -#line 4349 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4350 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4351 -F_TRAINER_FEMALE | -#line 4352 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4353 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4354 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4356 - .species = SPECIES_KIRLIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4358 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4357 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4360 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4362 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4361 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4364 - [DIFFICULTY_NORMAL][TRAINER_JACKI_1] = - { -#line 4365 - .trainerName = _("JACKI"), -#line 4366 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4367 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4368 -F_TRAINER_FEMALE | -#line 4369 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4370 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4371 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4373 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4375 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4374 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4377 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4379 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4378 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4381 - [DIFFICULTY_NORMAL][TRAINER_JACKI_2] = - { -#line 4382 - .trainerName = _("JACKI"), -#line 4383 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4384 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4385 -F_TRAINER_FEMALE | -#line 4386 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4387 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4388 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4390 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4392 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 4391 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4394 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4396 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 4395 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4398 - [DIFFICULTY_NORMAL][TRAINER_JACKI_3] = - { -#line 4399 - .trainerName = _("JACKI"), -#line 4400 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4401 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4402 -F_TRAINER_FEMALE | -#line 4403 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4404 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4405 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4407 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4409 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4408 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4411 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4413 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4412 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4415 - [DIFFICULTY_NORMAL][TRAINER_JACKI_4] = - { -#line 4416 - .trainerName = _("JACKI"), -#line 4417 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4418 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4419 -F_TRAINER_FEMALE | -#line 4420 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4421 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4422 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4424 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4426 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4425 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4428 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4430 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4429 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4432 - [DIFFICULTY_NORMAL][TRAINER_JACKI_5] = - { -#line 4433 - .trainerName = _("JACKI"), -#line 4434 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4435 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4436 -F_TRAINER_FEMALE | -#line 4437 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4438 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4439 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4441 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4443 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4442 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4445 - .species = SPECIES_ALAKAZAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4447 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4446 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4449 - [DIFFICULTY_NORMAL][TRAINER_WALTER_1] = - { -#line 4450 - .trainerName = _("WALTER"), -#line 4451 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 4452 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 4454 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 4455 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4456 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4458 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4460 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4459 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4462 - [DIFFICULTY_NORMAL][TRAINER_MICAH] = - { -#line 4463 - .trainerName = _("MICAH"), -#line 4464 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 4465 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 4467 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 4468 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4469 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4471 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4473 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4472 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4475 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4477 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4476 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4479 - [DIFFICULTY_NORMAL][TRAINER_THOMAS] = - { -#line 4480 - .trainerName = _("THOMAS"), -#line 4481 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 4482 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 4484 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 4485 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4486 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4488 - .species = SPECIES_ZANGOOSE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4490 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4489 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4492 - [DIFFICULTY_NORMAL][TRAINER_WALTER_2] = - { -#line 4493 - .trainerName = _("WALTER"), -#line 4494 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 4495 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 4497 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 4498 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4499 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4501 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4503 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 4502 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4505 - [DIFFICULTY_NORMAL][TRAINER_WALTER_3] = - { -#line 4506 - .trainerName = _("WALTER"), -#line 4507 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 4508 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 4510 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 4511 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4512 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4514 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4516 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4515 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4517 - MOVE_HEADBUTT, - MOVE_SAND_ATTACK, - MOVE_ODOR_SLEUTH, - MOVE_FURY_SWIPES, - }, - }, - { -#line 4522 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4524 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4523 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4525 - MOVE_QUICK_ATTACK, - MOVE_SPARK, - MOVE_ODOR_SLEUTH, - MOVE_ROAR, - }, - }, - }, - }, -#line 4530 - [DIFFICULTY_NORMAL][TRAINER_WALTER_4] = - { -#line 4531 - .trainerName = _("WALTER"), -#line 4532 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 4533 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 4535 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 4536 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4537 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4539 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4541 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4540 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4542 - MOVE_HEADBUTT, - MOVE_SAND_ATTACK, - MOVE_ODOR_SLEUTH, - MOVE_FURY_SWIPES, - }, - }, - { -#line 4547 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4549 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4548 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4550 - MOVE_QUICK_ATTACK, - MOVE_SPARK, - MOVE_ODOR_SLEUTH, - }, - }, - }, - }, -#line 4554 - [DIFFICULTY_NORMAL][TRAINER_WALTER_5] = - { -#line 4555 - .trainerName = _("WALTER"), -#line 4556 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 4557 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 4559 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 4560 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4561 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 4563 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4565 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4564 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4566 - MOVE_HEADBUTT, - MOVE_SAND_ATTACK, - MOVE_ODOR_SLEUTH, - MOVE_FURY_SWIPES, - }, - }, - { -#line 4571 - .species = SPECIES_GOLDUCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4573 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4572 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4574 - MOVE_FURY_SWIPES, - MOVE_DISABLE, - MOVE_CONFUSION, - MOVE_PSYCH_UP, - }, - }, - { -#line 4579 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4581 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4580 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4582 - MOVE_QUICK_ATTACK, - MOVE_SPARK, - MOVE_ODOR_SLEUTH, - MOVE_ROAR, - }, - }, - }, - }, -#line 4587 - [DIFFICULTY_NORMAL][TRAINER_SIDNEY] = - { -#line 4588 - .trainerName = _("SIDNEY"), -#line 4589 - .trainerClass = TRAINER_CLASS_ELITE_FOUR, -#line 4590 - .trainerPic = TRAINER_PIC_ELITE_FOUR_SIDNEY, - .encounterMusic_gender = -#line 4592 - TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, -#line 4593 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 4594 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4595 - .aiFlags = AI_FLAG_BASIC_TRAINER | AI_FLAG_FORCE_SETUP_FIRST_TURN, -#line 4596 - .mugshotColor = MUGSHOT_COLOR_PURPLE, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 4598 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4600 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4599 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4601 - MOVE_ROAR, - MOVE_DOUBLE_EDGE, - MOVE_SAND_ATTACK, - MOVE_CRUNCH, - }, - }, - { -#line 4606 - .species = SPECIES_SHIFTRY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4608 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4607 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4609 - MOVE_TORMENT, - MOVE_DOUBLE_TEAM, - MOVE_SWAGGER, - MOVE_EXTRASENSORY, - }, - }, - { -#line 4614 - .species = SPECIES_CACTURNE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4616 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4615 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4617 - MOVE_LEECH_SEED, - MOVE_FEINT_ATTACK, - MOVE_NEEDLE_ARM, - MOVE_COTTON_SPORE, - }, - }, - { -#line 4622 - .species = SPECIES_CRAWDAUNT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4624 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4623 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4625 - MOVE_SURF, - MOVE_SWORDS_DANCE, - MOVE_STRENGTH, - MOVE_FACADE, - }, - }, - { -#line 4630 - .species = SPECIES_ABSOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4630 - .heldItem = ITEM_SITRUS_BERRY, -#line 4632 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 4631 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4633 - MOVE_AERIAL_ACE, - MOVE_ROCK_SLIDE, - MOVE_SWORDS_DANCE, - MOVE_SLASH, - }, - }, - }, - }, -#line 4638 - [DIFFICULTY_NORMAL][TRAINER_PHOEBE] = - { -#line 4639 - .trainerName = _("PHOEBE"), -#line 4640 - .trainerClass = TRAINER_CLASS_ELITE_FOUR, -#line 4641 - .trainerPic = TRAINER_PIC_ELITE_FOUR_PHOEBE, - .encounterMusic_gender = -#line 4642 -F_TRAINER_FEMALE | -#line 4643 - TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, -#line 4644 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 4645 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4646 - .aiFlags = AI_FLAG_BASIC_TRAINER, -#line 4647 - .mugshotColor = MUGSHOT_COLOR_GREEN, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 4649 - .species = SPECIES_DUSCLOPS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4651 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4650 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4652 - MOVE_SHADOW_PUNCH, - MOVE_CONFUSE_RAY, - MOVE_CURSE, - MOVE_PROTECT, - }, - }, - { -#line 4657 - .species = SPECIES_BANETTE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4659 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4658 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4660 - MOVE_SHADOW_BALL, - MOVE_GRUDGE, - MOVE_WILL_O_WISP, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 4665 - .species = SPECIES_SABLEYE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4667 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4666 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4668 - MOVE_SHADOW_BALL, - MOVE_DOUBLE_TEAM, - MOVE_NIGHT_SHADE, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 4673 - .species = SPECIES_BANETTE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4675 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4674 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4676 - MOVE_SHADOW_BALL, - MOVE_PSYCHIC, - MOVE_THUNDERBOLT, - MOVE_FACADE, - }, - }, - { -#line 4681 - .species = SPECIES_DUSCLOPS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4681 - .heldItem = ITEM_SITRUS_BERRY, -#line 4683 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 4682 - .lvl = 51, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4684 - MOVE_SHADOW_BALL, - MOVE_ICE_BEAM, - MOVE_ROCK_SLIDE, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 4689 - [DIFFICULTY_NORMAL][TRAINER_GLACIA] = - { -#line 4690 - .trainerName = _("GLACIA"), -#line 4691 - .trainerClass = TRAINER_CLASS_ELITE_FOUR, -#line 4692 - .trainerPic = TRAINER_PIC_ELITE_FOUR_GLACIA, - .encounterMusic_gender = -#line 4693 -F_TRAINER_FEMALE | -#line 4694 - TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, -#line 4695 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 4696 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4697 - .aiFlags = AI_FLAG_BASIC_TRAINER, -#line 4698 - .mugshotColor = MUGSHOT_COLOR_PINK, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 4700 - .species = SPECIES_SEALEO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4702 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4701 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4703 - MOVE_ENCORE, - MOVE_BODY_SLAM, - MOVE_HAIL, - MOVE_ICE_BALL, - }, - }, - { -#line 4708 - .species = SPECIES_GLALIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4710 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4709 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4711 - MOVE_LIGHT_SCREEN, - MOVE_CRUNCH, - MOVE_ICY_WIND, - MOVE_ICE_BEAM, - }, - }, - { -#line 4716 - .species = SPECIES_SEALEO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4718 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4717 - .lvl = 52, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4719 - MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, - MOVE_HAIL, - MOVE_BLIZZARD, - }, - }, - { -#line 4724 - .species = SPECIES_GLALIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4726 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4725 - .lvl = 52, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4727 - MOVE_SHADOW_BALL, - MOVE_EXPLOSION, - MOVE_HAIL, - MOVE_ICE_BEAM, - }, - }, - { -#line 4732 - .species = SPECIES_WALREIN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4732 - .heldItem = ITEM_SITRUS_BERRY, -#line 4734 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 4733 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4735 - MOVE_SURF, - MOVE_BODY_SLAM, - MOVE_ICE_BEAM, - MOVE_SHEER_COLD, - }, - }, - }, - }, -#line 4740 - [DIFFICULTY_NORMAL][TRAINER_DRAKE] = - { -#line 4741 - .trainerName = _("DRAKE"), -#line 4742 - .trainerClass = TRAINER_CLASS_ELITE_FOUR, -#line 4743 - .trainerPic = TRAINER_PIC_ELITE_FOUR_DRAKE, - .encounterMusic_gender = -#line 4745 - TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, -#line 4746 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 4747 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4748 - .aiFlags = AI_FLAG_BASIC_TRAINER, -#line 4749 - .mugshotColor = MUGSHOT_COLOR_BLUE, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 4751 - .species = SPECIES_SHELGON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4753 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4752 - .lvl = 52, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4754 - MOVE_ROCK_TOMB, - MOVE_DRAGON_CLAW, - MOVE_PROTECT, - MOVE_DOUBLE_EDGE, - }, - }, - { -#line 4759 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4761 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4760 - .lvl = 54, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4762 - MOVE_DOUBLE_EDGE, - MOVE_DRAGON_BREATH, - MOVE_DRAGON_DANCE, - MOVE_AERIAL_ACE, - }, - }, - { -#line 4767 - .species = SPECIES_KINGDRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4769 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4768 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4770 - MOVE_SMOKESCREEN, - MOVE_DRAGON_DANCE, - MOVE_SURF, - MOVE_BODY_SLAM, - }, - }, - { -#line 4775 - .species = SPECIES_FLYGON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4777 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4776 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4778 - MOVE_FLAMETHROWER, - MOVE_CRUNCH, - MOVE_DRAGON_BREATH, - MOVE_EARTHQUAKE, - }, - }, - { -#line 4783 - .species = SPECIES_SALAMENCE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4783 - .heldItem = ITEM_SITRUS_BERRY, -#line 4785 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 4784 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4786 - MOVE_FLAMETHROWER, - MOVE_DRAGON_CLAW, - MOVE_ROCK_SLIDE, - MOVE_CRUNCH, - }, - }, - }, - }, -#line 4791 - [DIFFICULTY_NORMAL][TRAINER_ROXANNE_1] = - { -#line 4792 - .trainerName = _("ROXANNE"), -#line 4793 - .trainerClass = TRAINER_CLASS_LEADER, -#line 4794 - .trainerPic = TRAINER_PIC_LEADER_ROXANNE, - .encounterMusic_gender = -#line 4795 -F_TRAINER_FEMALE | -#line 4796 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 4797 - .items = { ITEM_POTION, ITEM_POTION }, -#line 4798 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4799 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 4801 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4803 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4802 - .lvl = 12, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4804 - MOVE_TACKLE, - MOVE_DEFENSE_CURL, - MOVE_ROCK_THROW, - MOVE_ROCK_TOMB, - }, - }, - { -#line 4809 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4811 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4810 - .lvl = 12, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4812 - MOVE_TACKLE, - MOVE_DEFENSE_CURL, - MOVE_ROCK_THROW, - MOVE_ROCK_TOMB, - }, - }, - { -#line 4817 - .species = SPECIES_NOSEPASS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4817 - .heldItem = ITEM_ORAN_BERRY, -#line 4819 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4818 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4820 - MOVE_BLOCK, - MOVE_HARDEN, - MOVE_TACKLE, - MOVE_ROCK_TOMB, - }, - }, - }, - }, -#line 4825 - [DIFFICULTY_NORMAL][TRAINER_BRAWLY_1] = - { -#line 4826 - .trainerName = _("BRAWLY"), -#line 4827 - .trainerClass = TRAINER_CLASS_LEADER, -#line 4828 - .trainerPic = TRAINER_PIC_LEADER_BRAWLY, - .encounterMusic_gender = -#line 4830 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 4831 - .items = { ITEM_SUPER_POTION, ITEM_SUPER_POTION }, -#line 4832 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4833 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 4835 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4837 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4836 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4838 - MOVE_KARATE_CHOP, - MOVE_LOW_KICK, - MOVE_SEISMIC_TOSS, - MOVE_BULK_UP, - }, - }, - { -#line 4843 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4845 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4844 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4846 - MOVE_FOCUS_PUNCH, - MOVE_LIGHT_SCREEN, - MOVE_REFLECT, - MOVE_BULK_UP, - }, - }, - { -#line 4851 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4851 - .heldItem = ITEM_SITRUS_BERRY, -#line 4853 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4852 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4854 - MOVE_ARM_THRUST, - MOVE_VITAL_THROW, - MOVE_REVERSAL, - MOVE_BULK_UP, - }, - }, - }, - }, -#line 4859 - [DIFFICULTY_NORMAL][TRAINER_WATTSON_1] = - { -#line 4860 - .trainerName = _("WATTSON"), -#line 4861 - .trainerClass = TRAINER_CLASS_LEADER, -#line 4862 - .trainerPic = TRAINER_PIC_LEADER_WATTSON, - .encounterMusic_gender = -#line 4864 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 4865 - .items = { ITEM_SUPER_POTION, ITEM_SUPER_POTION }, -#line 4866 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4867 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 4869 - .species = SPECIES_VOLTORB, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4871 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4870 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4872 - MOVE_ROLLOUT, - MOVE_SPARK, - MOVE_SELF_DESTRUCT, - MOVE_SHOCK_WAVE, - }, - }, - { -#line 4877 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4879 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4878 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4880 - MOVE_SHOCK_WAVE, - MOVE_LEER, - MOVE_QUICK_ATTACK, - MOVE_HOWL, - }, - }, - { -#line 4885 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4887 - .iv = TRAINER_PARTY_IVS(26, 26, 26, 26, 26, 26), -#line 4886 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4888 - MOVE_SUPERSONIC, - MOVE_SHOCK_WAVE, - MOVE_THUNDER_WAVE, - MOVE_SONIC_BOOM, - }, - }, - { -#line 4893 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4893 - .heldItem = ITEM_SITRUS_BERRY, -#line 4895 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4894 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4896 - MOVE_QUICK_ATTACK, - MOVE_THUNDER_WAVE, - MOVE_SHOCK_WAVE, - MOVE_HOWL, - }, - }, - }, - }, -#line 4901 - [DIFFICULTY_NORMAL][TRAINER_FLANNERY_1] = - { -#line 4902 - .trainerName = _("FLANNERY"), -#line 4903 - .trainerClass = TRAINER_CLASS_LEADER, -#line 4904 - .trainerPic = TRAINER_PIC_LEADER_FLANNERY, - .encounterMusic_gender = -#line 4905 -F_TRAINER_FEMALE | -#line 4906 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 4907 - .items = { ITEM_HYPER_POTION, ITEM_HYPER_POTION }, -#line 4908 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4909 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 4911 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4913 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4912 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4914 - MOVE_OVERHEAT, - MOVE_TAKE_DOWN, - MOVE_MAGNITUDE, - MOVE_SUNNY_DAY, - }, - }, - { -#line 4919 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4921 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4920 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4922 - MOVE_OVERHEAT, - MOVE_SMOG, - MOVE_LIGHT_SCREEN, - MOVE_SUNNY_DAY, - }, - }, - { -#line 4927 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4929 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4928 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4930 - MOVE_OVERHEAT, - MOVE_TACKLE, - MOVE_SUNNY_DAY, - MOVE_ATTRACT, - }, - }, - { -#line 4935 - .species = SPECIES_TORKOAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4935 - .heldItem = ITEM_WHITE_HERB, -#line 4937 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4936 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4938 - MOVE_OVERHEAT, - MOVE_SUNNY_DAY, - MOVE_BODY_SLAM, - MOVE_ATTRACT, - }, - }, - }, - }, -#line 4943 - [DIFFICULTY_NORMAL][TRAINER_NORMAN_1] = - { -#line 4944 - .trainerName = _("NORMAN"), -#line 4945 - .trainerClass = TRAINER_CLASS_LEADER, -#line 4946 - .trainerPic = TRAINER_PIC_LEADER_NORMAN, - .encounterMusic_gender = -#line 4948 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 4949 - .items = { ITEM_HYPER_POTION, ITEM_HYPER_POTION }, -#line 4950 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4951 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 4953 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4955 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4954 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4956 - MOVE_TEETER_DANCE, - MOVE_PSYBEAM, - MOVE_FACADE, - MOVE_ENCORE, - }, - }, - { -#line 4961 - .species = SPECIES_VIGOROTH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4963 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4962 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4964 - MOVE_SLASH, - MOVE_FACADE, - MOVE_ENCORE, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 4969 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4971 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4970 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4972 - MOVE_SLASH, - MOVE_BELLY_DRUM, - MOVE_FACADE, - MOVE_HEADBUTT, - }, - }, - { -#line 4977 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4977 - .heldItem = ITEM_SITRUS_BERRY, -#line 4979 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4978 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4980 - MOVE_COUNTER, - MOVE_YAWN, - MOVE_FACADE, - MOVE_FEINT_ATTACK, - }, - }, - }, - }, -#line 4985 - [DIFFICULTY_NORMAL][TRAINER_WINONA_1] = - { -#line 4986 - .trainerName = _("WINONA"), -#line 4987 - .trainerClass = TRAINER_CLASS_LEADER, -#line 4988 - .trainerPic = TRAINER_PIC_LEADER_WINONA, - .encounterMusic_gender = -#line 4989 -F_TRAINER_FEMALE | -#line 4990 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 4991 - .items = { ITEM_HYPER_POTION, ITEM_HYPER_POTION }, -#line 4992 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4993 - .aiFlags = AI_FLAG_BASIC_TRAINER | AI_FLAG_RISKY, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 4995 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4997 - .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 4996 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4998 - MOVE_PERISH_SONG, - MOVE_MIRROR_MOVE, - MOVE_SAFEGUARD, - MOVE_AERIAL_ACE, - }, - }, - { -#line 5003 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5005 - .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 5004 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5006 - MOVE_SUNNY_DAY, - MOVE_AERIAL_ACE, - MOVE_SOLAR_BEAM, - MOVE_SYNTHESIS, - }, - }, - { -#line 5011 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5013 - .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 5012 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5014 - MOVE_WATER_GUN, - MOVE_SUPERSONIC, - MOVE_PROTECT, - MOVE_AERIAL_ACE, - }, - }, - { -#line 5019 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5021 - .iv = TRAINER_PARTY_IVS(26, 26, 26, 26, 26, 26), -#line 5020 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5022 - MOVE_SAND_ATTACK, - MOVE_FURY_ATTACK, - MOVE_STEEL_WING, - MOVE_AERIAL_ACE, - }, - }, - { -#line 5027 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5027 - .heldItem = ITEM_ORAN_BERRY, -#line 5029 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 5028 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5030 - MOVE_EARTHQUAKE, - MOVE_DRAGON_BREATH, - MOVE_DRAGON_DANCE, - MOVE_AERIAL_ACE, - }, - }, - }, - }, -#line 5035 - [DIFFICULTY_NORMAL][TRAINER_TATE_AND_LIZA_1] = - { -#line 5036 - .trainerName = _("TATE&LIZA"), -#line 5037 - .trainerClass = TRAINER_CLASS_LEADER, -#line 5038 - .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, - .encounterMusic_gender = -#line 5040 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 5041 - .items = { ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_HYPER_POTION }, -#line 5042 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 5043 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 5045 - .species = SPECIES_CLAYDOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5047 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 5046 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5048 - MOVE_EARTHQUAKE, - MOVE_ANCIENT_POWER, - MOVE_PSYCHIC, - MOVE_LIGHT_SCREEN, - }, - }, - { -#line 5053 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5055 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 5054 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5056 - MOVE_PSYCHIC, - MOVE_SUNNY_DAY, - MOVE_CONFUSE_RAY, - MOVE_CALM_MIND, - }, - }, - { -#line 5061 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5061 - .heldItem = ITEM_SITRUS_BERRY, -#line 5063 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 5062 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5064 - MOVE_LIGHT_SCREEN, - MOVE_PSYCHIC, - MOVE_HYPNOSIS, - MOVE_CALM_MIND, - }, - }, - { -#line 5069 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5069 - .heldItem = ITEM_SITRUS_BERRY, -#line 5071 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 5070 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5072 - MOVE_SUNNY_DAY, - MOVE_SOLAR_BEAM, - MOVE_PSYCHIC, - MOVE_FLAMETHROWER, - }, - }, - }, - }, -#line 5077 - [DIFFICULTY_NORMAL][TRAINER_JUAN_1] = - { -#line 5078 - .trainerName = _("JUAN"), -#line 5079 - .trainerClass = TRAINER_CLASS_LEADER, -#line 5080 - .trainerPic = TRAINER_PIC_LEADER_JUAN, - .encounterMusic_gender = -#line 5082 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5083 - .items = { ITEM_HYPER_POTION, ITEM_HYPER_POTION }, -#line 5084 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5085 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 5087 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5089 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5088 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5090 - MOVE_WATER_PULSE, - MOVE_ATTRACT, - MOVE_SWEET_KISS, - MOVE_FLAIL, - }, - }, - { -#line 5095 - .species = SPECIES_WHISCASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5097 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5096 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5098 - MOVE_RAIN_DANCE, - MOVE_WATER_PULSE, - MOVE_AMNESIA, - MOVE_EARTHQUAKE, - }, - }, - { -#line 5103 - .species = SPECIES_SEALEO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5105 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5104 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5106 - MOVE_ENCORE, - MOVE_BODY_SLAM, - MOVE_AURORA_BEAM, - MOVE_WATER_PULSE, - }, - }, - { -#line 5111 - .species = SPECIES_CRAWDAUNT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5113 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5112 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5114 - MOVE_WATER_PULSE, - MOVE_CRABHAMMER, - MOVE_TAUNT, - MOVE_LEER, - }, - }, - { -#line 5119 - .species = SPECIES_KINGDRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5119 - .heldItem = ITEM_CHESTO_BERRY, -#line 5121 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 5120 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5122 - MOVE_WATER_PULSE, - MOVE_DOUBLE_TEAM, - MOVE_ICE_BEAM, - MOVE_REST, - }, - }, - }, - }, -#line 5127 - [DIFFICULTY_NORMAL][TRAINER_JERRY_1] = - { -#line 5128 - .trainerName = _("JERRY"), -#line 5129 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5130 - .trainerPic = TRAINER_PIC_SCHOOL_KID_M, - .encounterMusic_gender = -#line 5132 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5133 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5134 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5136 - .species = SPECIES_RALTS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5138 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5137 - .lvl = 9, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5140 - [DIFFICULTY_NORMAL][TRAINER_TED] = - { -#line 5141 - .trainerName = _("TED"), -#line 5142 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5143 - .trainerPic = TRAINER_PIC_SCHOOL_KID_M, - .encounterMusic_gender = -#line 5145 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5146 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5147 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5149 - .species = SPECIES_RALTS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5151 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5150 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5153 - [DIFFICULTY_NORMAL][TRAINER_PAUL] = - { -#line 5154 - .trainerName = _("PAUL"), -#line 5155 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5156 - .trainerPic = TRAINER_PIC_SCHOOL_KID_M, - .encounterMusic_gender = -#line 5158 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5159 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5160 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 5162 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5164 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5163 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5166 - .species = SPECIES_ODDISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5168 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5167 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5170 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5172 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5171 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5174 - [DIFFICULTY_NORMAL][TRAINER_JERRY_2] = - { -#line 5175 - .trainerName = _("JERRY"), -#line 5176 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5177 - .trainerPic = TRAINER_PIC_SCHOOL_KID_M, - .encounterMusic_gender = -#line 5179 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5180 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5181 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5183 - .species = SPECIES_RALTS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5185 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5184 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5187 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5189 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5188 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5191 - [DIFFICULTY_NORMAL][TRAINER_JERRY_3] = - { -#line 5192 - .trainerName = _("JERRY"), -#line 5193 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5194 - .trainerPic = TRAINER_PIC_SCHOOL_KID_M, - .encounterMusic_gender = -#line 5196 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5197 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5198 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5200 - .species = SPECIES_KIRLIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5202 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5201 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5204 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5206 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5205 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5208 - [DIFFICULTY_NORMAL][TRAINER_JERRY_4] = - { -#line 5209 - .trainerName = _("JERRY"), -#line 5210 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5211 - .trainerPic = TRAINER_PIC_SCHOOL_KID_M, - .encounterMusic_gender = -#line 5213 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5214 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5215 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5217 - .species = SPECIES_KIRLIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5219 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5218 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5221 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5223 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5222 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5225 - [DIFFICULTY_NORMAL][TRAINER_JERRY_5] = - { -#line 5226 - .trainerName = _("JERRY"), -#line 5227 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5228 - .trainerPic = TRAINER_PIC_SCHOOL_KID_M, - .encounterMusic_gender = -#line 5230 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5231 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5232 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 5234 - .species = SPECIES_KIRLIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5236 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 5235 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5238 - .species = SPECIES_BANETTE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5240 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 5239 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5242 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5244 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 5243 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5246 - [DIFFICULTY_NORMAL][TRAINER_KAREN_1] = - { -#line 5247 - .trainerName = _("KAREN"), -#line 5248 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5249 - .trainerPic = TRAINER_PIC_SCHOOL_KID_F, - .encounterMusic_gender = -#line 5250 -F_TRAINER_FEMALE | -#line 5251 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 5252 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5253 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5255 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5257 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5256 - .lvl = 9, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5259 - [DIFFICULTY_NORMAL][TRAINER_GEORGIA] = - { -#line 5260 - .trainerName = _("GEORGIA"), -#line 5261 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5262 - .trainerPic = TRAINER_PIC_SCHOOL_KID_F, - .encounterMusic_gender = -#line 5263 -F_TRAINER_FEMALE | -#line 5264 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 5265 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5266 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5268 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5270 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5269 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5272 - .species = SPECIES_BEAUTIFLY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5274 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5273 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5276 - [DIFFICULTY_NORMAL][TRAINER_KAREN_2] = - { -#line 5277 - .trainerName = _("KAREN"), -#line 5278 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5279 - .trainerPic = TRAINER_PIC_SCHOOL_KID_F, - .encounterMusic_gender = -#line 5280 -F_TRAINER_FEMALE | -#line 5281 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 5282 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5283 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5285 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5287 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5286 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5289 - .species = SPECIES_WHISMUR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5291 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5290 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5293 - [DIFFICULTY_NORMAL][TRAINER_KAREN_3] = - { -#line 5294 - .trainerName = _("KAREN"), -#line 5295 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5296 - .trainerPic = TRAINER_PIC_SCHOOL_KID_F, - .encounterMusic_gender = -#line 5297 -F_TRAINER_FEMALE | -#line 5298 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 5299 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5300 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5302 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5304 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5303 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5306 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5308 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5307 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5310 - [DIFFICULTY_NORMAL][TRAINER_KAREN_4] = - { -#line 5311 - .trainerName = _("KAREN"), -#line 5312 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5313 - .trainerPic = TRAINER_PIC_SCHOOL_KID_F, - .encounterMusic_gender = -#line 5314 -F_TRAINER_FEMALE | -#line 5315 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 5316 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5317 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5319 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5321 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5320 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5323 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5325 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5324 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5327 - [DIFFICULTY_NORMAL][TRAINER_KAREN_5] = - { -#line 5328 - .trainerName = _("KAREN"), -#line 5329 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5330 - .trainerPic = TRAINER_PIC_SCHOOL_KID_F, - .encounterMusic_gender = -#line 5331 -F_TRAINER_FEMALE | -#line 5332 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 5333 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5334 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5336 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5338 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 5337 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5340 - .species = SPECIES_EXPLOUD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5342 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 5341 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5344 - [DIFFICULTY_NORMAL][TRAINER_KATE_AND_JOY] = - { -#line 5345 - .trainerName = _("KATE & JOY"), -#line 5346 - .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 5347 - .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = -#line 5349 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5350 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 5351 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5353 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5355 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5354 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5356 - MOVE_HYPNOSIS, - MOVE_PSYBEAM, - MOVE_DIZZY_PUNCH, - MOVE_TEETER_DANCE, - }, - }, - { -#line 5361 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5363 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5362 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5364 - MOVE_FOCUS_PUNCH, - MOVE_YAWN, - MOVE_SLACK_OFF, - MOVE_FEINT_ATTACK, - }, - }, - }, - }, -#line 5369 - [DIFFICULTY_NORMAL][TRAINER_ANNA_AND_MEG_1] = - { -#line 5370 - .trainerName = _("ANNA & MEG"), -#line 5371 - .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 5372 - .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = -#line 5374 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5375 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 5376 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5378 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5380 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5379 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5381 - MOVE_GROWL, - MOVE_TAIL_WHIP, - MOVE_HEADBUTT, - MOVE_ODOR_SLEUTH, - }, - }, - { -#line 5386 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5388 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5387 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5389 - MOVE_TACKLE, - MOVE_FOCUS_ENERGY, - MOVE_ARM_THRUST, - }, - }, - }, - }, -#line 5393 - [DIFFICULTY_NORMAL][TRAINER_ANNA_AND_MEG_2] = - { -#line 5394 - .trainerName = _("ANNA & MEG"), -#line 5395 - .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 5396 - .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = -#line 5398 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5399 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 5400 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5402 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5404 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5403 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5405 - MOVE_GROWL, - MOVE_TAIL_WHIP, - MOVE_HEADBUTT, - MOVE_ODOR_SLEUTH, - }, - }, - { -#line 5410 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5412 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5411 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5413 - MOVE_TACKLE, - MOVE_FOCUS_ENERGY, - MOVE_ARM_THRUST, - }, - }, - }, - }, -#line 5417 - [DIFFICULTY_NORMAL][TRAINER_ANNA_AND_MEG_3] = - { -#line 5418 - .trainerName = _("ANNA & MEG"), -#line 5419 - .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 5420 - .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = -#line 5422 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5423 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 5424 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5426 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5428 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5427 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5429 - MOVE_GROWL, - MOVE_TAIL_WHIP, - MOVE_HEADBUTT, - MOVE_ODOR_SLEUTH, - }, - }, - { -#line 5434 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5436 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5435 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5437 - MOVE_TACKLE, - MOVE_FOCUS_ENERGY, - MOVE_ARM_THRUST, - }, - }, - }, - }, -#line 5441 - [DIFFICULTY_NORMAL][TRAINER_ANNA_AND_MEG_4] = - { -#line 5442 - .trainerName = _("ANNA & MEG"), -#line 5443 - .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 5444 - .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = -#line 5446 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5447 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 5448 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5450 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5452 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5451 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5453 - MOVE_GROWL, - MOVE_TAIL_WHIP, - MOVE_HEADBUTT, - MOVE_ODOR_SLEUTH, - }, - }, - { -#line 5458 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5460 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5459 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5461 - MOVE_TACKLE, - MOVE_FOCUS_ENERGY, - MOVE_ARM_THRUST, - }, - }, - }, - }, -#line 5465 - [DIFFICULTY_NORMAL][TRAINER_ANNA_AND_MEG_5] = - { -#line 5466 - .trainerName = _("ANNA & MEG"), -#line 5467 - .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 5468 - .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = -#line 5470 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5471 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 5472 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5474 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5476 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5475 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5477 - MOVE_GROWL, - MOVE_TAIL_WHIP, - MOVE_HEADBUTT, - MOVE_ODOR_SLEUTH, - }, - }, - { -#line 5482 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5484 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5483 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5485 - MOVE_TACKLE, - MOVE_FOCUS_ENERGY, - MOVE_ARM_THRUST, - }, - }, - }, - }, -#line 5489 - [DIFFICULTY_NORMAL][TRAINER_VICTOR] = - { -#line 5490 - .trainerName = _("VICTOR"), -#line 5491 - .trainerClass = TRAINER_CLASS_WINSTRATE, -#line 5492 - .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = -#line 5494 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5495 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5496 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5498 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5498 - .heldItem = ITEM_ORAN_BERRY, -#line 5500 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5499 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5502 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5502 - .heldItem = ITEM_ORAN_BERRY, -#line 5504 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5503 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5506 - [DIFFICULTY_NORMAL][TRAINER_MIGUEL_1] = - { -#line 5507 - .trainerName = _("MIGUEL"), -#line 5508 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5509 - .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = -#line 5511 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5512 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5513 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5515 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5515 - .heldItem = ITEM_ORAN_BERRY, -#line 5517 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5516 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5519 - [DIFFICULTY_NORMAL][TRAINER_COLTON] = - { -#line 5520 - .trainerName = _("COLTON"), -#line 5521 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5522 - .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = -#line 5524 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5525 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5526 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 5528 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5528 - .heldItem = ITEM_ORAN_BERRY, -#line 5530 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5529 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5531 - MOVE_ASSIST, - MOVE_CHARM, - MOVE_FEINT_ATTACK, - MOVE_HEAL_BELL, - }, - }, - { -#line 5536 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5536 - .heldItem = ITEM_ORAN_BERRY, -#line 5538 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5537 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5539 - MOVE_ASSIST, - MOVE_CHARM, - MOVE_FEINT_ATTACK, - MOVE_HEAL_BELL, - }, - }, - { -#line 5544 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5544 - .heldItem = ITEM_ORAN_BERRY, -#line 5546 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5545 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5547 - MOVE_ASSIST, - MOVE_CHARM, - MOVE_FEINT_ATTACK, - MOVE_HEAL_BELL, - }, - }, - { -#line 5552 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5552 - .heldItem = ITEM_ORAN_BERRY, -#line 5554 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5553 - .lvl = 12, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5555 - MOVE_ASSIST, - MOVE_CHARM, - MOVE_FEINT_ATTACK, - MOVE_HEAL_BELL, - }, - }, - { -#line 5560 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5560 - .heldItem = ITEM_ORAN_BERRY, -#line 5562 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5561 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5563 - MOVE_ASSIST, - MOVE_CHARM, - MOVE_FEINT_ATTACK, - MOVE_HEAL_BELL, - }, - }, - { -#line 5568 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5568 - .heldItem = ITEM_ORAN_BERRY, -#line 5570 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5569 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5571 - MOVE_ASSIST, - MOVE_CHARM, - MOVE_FEINT_ATTACK, - MOVE_HEAL_BELL, - }, - }, - }, - }, -#line 5576 - [DIFFICULTY_NORMAL][TRAINER_MIGUEL_2] = - { -#line 5577 - .trainerName = _("MIGUEL"), -#line 5578 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5579 - .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = -#line 5581 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5582 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5583 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5585 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5585 - .heldItem = ITEM_ORAN_BERRY, -#line 5587 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5586 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5589 - [DIFFICULTY_NORMAL][TRAINER_MIGUEL_3] = - { -#line 5590 - .trainerName = _("MIGUEL"), -#line 5591 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5592 - .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = -#line 5594 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5595 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5596 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5598 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5598 - .heldItem = ITEM_ORAN_BERRY, -#line 5600 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5599 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5602 - [DIFFICULTY_NORMAL][TRAINER_MIGUEL_4] = - { -#line 5603 - .trainerName = _("MIGUEL"), -#line 5604 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5605 - .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = -#line 5607 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5608 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5609 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5611 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5611 - .heldItem = ITEM_ORAN_BERRY, -#line 5613 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5612 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5615 - [DIFFICULTY_NORMAL][TRAINER_MIGUEL_5] = - { -#line 5616 - .trainerName = _("MIGUEL"), -#line 5617 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5618 - .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = -#line 5620 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5621 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5622 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5624 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5624 - .heldItem = ITEM_SITRUS_BERRY, -#line 5626 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5625 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5628 - [DIFFICULTY_NORMAL][TRAINER_VICTORIA] = - { -#line 5629 - .trainerName = _("VICTORIA"), -#line 5630 - .trainerClass = TRAINER_CLASS_WINSTRATE, -#line 5631 - .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = -#line 5632 -F_TRAINER_FEMALE | -#line 5633 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5634 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5635 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5637 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5637 - .heldItem = ITEM_ORAN_BERRY, -#line 5639 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 5638 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5641 - [DIFFICULTY_NORMAL][TRAINER_VANESSA] = - { -#line 5642 - .trainerName = _("VANESSA"), -#line 5643 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5644 - .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = -#line 5645 -F_TRAINER_FEMALE | -#line 5646 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5647 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5648 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5650 - .species = SPECIES_PIKACHU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5650 - .heldItem = ITEM_ORAN_BERRY, -#line 5652 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5651 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5654 - [DIFFICULTY_NORMAL][TRAINER_BETHANY] = - { -#line 5655 - .trainerName = _("BETHANY"), -#line 5656 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5657 - .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = -#line 5658 -F_TRAINER_FEMALE | -#line 5659 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5660 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5661 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 5663 - .species = SPECIES_AZURILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5663 - .heldItem = ITEM_ORAN_BERRY, -#line 5665 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 5664 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5667 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5667 - .heldItem = ITEM_ORAN_BERRY, -#line 5669 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 5668 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5671 - .species = SPECIES_AZUMARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5671 - .heldItem = ITEM_ORAN_BERRY, -#line 5673 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 5672 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5675 - [DIFFICULTY_NORMAL][TRAINER_ISABEL_1] = - { -#line 5676 - .trainerName = _("ISABEL"), -#line 5677 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5678 - .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = -#line 5679 -F_TRAINER_FEMALE | -#line 5680 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5681 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5682 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5684 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5684 - .heldItem = ITEM_ORAN_BERRY, -#line 5686 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5685 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5688 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5688 - .heldItem = ITEM_ORAN_BERRY, -#line 5690 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5689 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5692 - [DIFFICULTY_NORMAL][TRAINER_ISABEL_2] = - { -#line 5693 - .trainerName = _("ISABEL"), -#line 5694 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5695 - .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = -#line 5696 -F_TRAINER_FEMALE | -#line 5697 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5698 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5699 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5701 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5701 - .heldItem = ITEM_ORAN_BERRY, -#line 5703 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5702 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5705 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5705 - .heldItem = ITEM_ORAN_BERRY, -#line 5707 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5706 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5709 - [DIFFICULTY_NORMAL][TRAINER_ISABEL_3] = - { -#line 5710 - .trainerName = _("ISABEL"), -#line 5711 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5712 - .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = -#line 5713 -F_TRAINER_FEMALE | -#line 5714 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5715 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5716 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5718 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5718 - .heldItem = ITEM_ORAN_BERRY, -#line 5720 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5719 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5722 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5722 - .heldItem = ITEM_ORAN_BERRY, -#line 5724 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5723 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5726 - [DIFFICULTY_NORMAL][TRAINER_ISABEL_4] = - { -#line 5727 - .trainerName = _("ISABEL"), -#line 5728 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5729 - .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = -#line 5730 -F_TRAINER_FEMALE | -#line 5731 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5732 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5733 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5735 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5735 - .heldItem = ITEM_ORAN_BERRY, -#line 5737 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5736 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5739 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5739 - .heldItem = ITEM_ORAN_BERRY, -#line 5741 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5740 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5743 - [DIFFICULTY_NORMAL][TRAINER_ISABEL_5] = - { -#line 5744 - .trainerName = _("ISABEL"), -#line 5745 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5746 - .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = -#line 5747 -F_TRAINER_FEMALE | -#line 5748 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5749 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5750 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5752 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5752 - .heldItem = ITEM_SITRUS_BERRY, -#line 5754 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5753 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5756 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5756 - .heldItem = ITEM_SITRUS_BERRY, -#line 5758 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5757 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5760 - [DIFFICULTY_NORMAL][TRAINER_TIMOTHY_1] = - { -#line 5761 - .trainerName = _("TIMOTHY"), -#line 5762 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 5763 - .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = -#line 5765 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5766 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5767 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5769 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5771 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5770 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5773 - [DIFFICULTY_NORMAL][TRAINER_TIMOTHY_2] = - { -#line 5774 - .trainerName = _("TIMOTHY"), -#line 5775 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 5776 - .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = -#line 5778 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5779 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5780 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5782 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5784 - .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 5783 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5785 - MOVE_ARM_THRUST, - MOVE_KNOCK_OFF, - MOVE_SAND_ATTACK, - MOVE_DIG, - }, - }, - }, - }, -#line 5790 - [DIFFICULTY_NORMAL][TRAINER_TIMOTHY_3] = - { -#line 5791 - .trainerName = _("TIMOTHY"), -#line 5792 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 5793 - .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = -#line 5795 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5796 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5797 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5799 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5801 - .iv = TRAINER_PARTY_IVS(26, 26, 26, 26, 26, 26), -#line 5800 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5802 - MOVE_ARM_THRUST, - MOVE_KNOCK_OFF, - MOVE_SAND_ATTACK, - MOVE_DIG, - }, - }, - }, - }, -#line 5807 - [DIFFICULTY_NORMAL][TRAINER_TIMOTHY_4] = - { -#line 5808 - .trainerName = _("TIMOTHY"), -#line 5809 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 5810 - .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = -#line 5812 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5813 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5814 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5816 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5818 - .iv = TRAINER_PARTY_IVS(27, 27, 27, 27, 27, 27), -#line 5817 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5819 - MOVE_ARM_THRUST, - MOVE_BELLY_DRUM, - MOVE_SAND_ATTACK, - MOVE_DIG, - }, - }, - }, - }, -#line 5824 - [DIFFICULTY_NORMAL][TRAINER_TIMOTHY_5] = - { -#line 5825 - .trainerName = _("TIMOTHY"), -#line 5826 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 5827 - .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = -#line 5829 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5830 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5831 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5833 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5835 - .iv = TRAINER_PARTY_IVS(29, 29, 29, 29, 29, 29), -#line 5834 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5836 - MOVE_ARM_THRUST, - MOVE_BELLY_DRUM, - MOVE_SAND_ATTACK, - MOVE_DIG, - }, - }, - }, - }, -#line 5841 - [DIFFICULTY_NORMAL][TRAINER_VICKY] = - { -#line 5842 - .trainerName = _("VICKY"), -#line 5843 - .trainerClass = TRAINER_CLASS_WINSTRATE, -#line 5844 - .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = -#line 5845 -F_TRAINER_FEMALE | -#line 5846 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5847 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5848 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5850 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5852 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5851 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5853 - MOVE_HIGH_JUMP_KICK, - MOVE_MEDITATE, - MOVE_CONFUSION, - MOVE_DETECT, - }, - }, - }, - }, -#line 5858 - [DIFFICULTY_NORMAL][TRAINER_SHELBY_1] = - { -#line 5859 - .trainerName = _("SHELBY"), -#line 5860 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 5861 - .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = -#line 5862 -F_TRAINER_FEMALE | -#line 5863 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5864 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5865 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5867 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5869 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5868 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5871 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5873 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5872 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5875 - [DIFFICULTY_NORMAL][TRAINER_SHELBY_2] = - { -#line 5876 - .trainerName = _("SHELBY"), -#line 5877 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 5878 - .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = -#line 5879 -F_TRAINER_FEMALE | -#line 5880 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5881 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5882 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5884 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5886 - .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 5885 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5888 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5890 - .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 5889 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5892 - [DIFFICULTY_NORMAL][TRAINER_SHELBY_3] = - { -#line 5893 - .trainerName = _("SHELBY"), -#line 5894 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 5895 - .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = -#line 5896 -F_TRAINER_FEMALE | -#line 5897 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5898 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5899 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5901 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5903 - .iv = TRAINER_PARTY_IVS(26, 26, 26, 26, 26, 26), -#line 5902 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5905 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5907 - .iv = TRAINER_PARTY_IVS(26, 26, 26, 26, 26, 26), -#line 5906 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5909 - [DIFFICULTY_NORMAL][TRAINER_SHELBY_4] = - { -#line 5910 - .trainerName = _("SHELBY"), -#line 5911 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 5912 - .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = -#line 5913 -F_TRAINER_FEMALE | -#line 5914 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5915 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5916 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5918 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5920 - .iv = TRAINER_PARTY_IVS(27, 27, 27, 27, 27, 27), -#line 5919 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5922 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5924 - .iv = TRAINER_PARTY_IVS(27, 27, 27, 27, 27, 27), -#line 5923 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5926 - [DIFFICULTY_NORMAL][TRAINER_SHELBY_5] = - { -#line 5927 - .trainerName = _("SHELBY"), -#line 5928 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 5929 - .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = -#line 5930 -F_TRAINER_FEMALE | -#line 5931 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5932 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5933 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5935 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5937 - .iv = TRAINER_PARTY_IVS(29, 29, 29, 29, 29, 29), -#line 5936 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5939 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5941 - .iv = TRAINER_PARTY_IVS(29, 29, 29, 29, 29, 29), -#line 5940 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5943 - [DIFFICULTY_NORMAL][TRAINER_CALVIN_1] = - { -#line 5944 - .trainerName = _("CALVIN"), -#line 5945 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 5946 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 5948 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5949 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5950 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5952 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5954 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5953 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5956 - [DIFFICULTY_NORMAL][TRAINER_BILLY] = - { -#line 5957 - .trainerName = _("BILLY"), -#line 5958 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 5959 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 5961 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5962 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5963 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5965 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5967 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5966 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5969 - .species = SPECIES_SEEDOT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5971 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5970 - .lvl = 7, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5973 - [DIFFICULTY_NORMAL][TRAINER_JOSH] = - { -#line 5974 - .trainerName = _("JOSH"), -#line 5975 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 5976 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 5978 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5979 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5980 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5982 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5984 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 5983 - .lvl = 10, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5985 - MOVE_TACKLE, - }, - }, - }, - }, -#line 5987 - [DIFFICULTY_NORMAL][TRAINER_TOMMY] = - { -#line 5988 - .trainerName = _("TOMMY"), -#line 5989 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 5990 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 5992 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5993 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5994 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5996 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5998 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 5997 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6000 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6002 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 6001 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6004 - [DIFFICULTY_NORMAL][TRAINER_JOEY] = - { -#line 6005 - .trainerName = _("JOEY"), -#line 6006 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6007 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6009 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6010 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6011 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6013 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6015 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6014 - .lvl = 9, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6017 - [DIFFICULTY_NORMAL][TRAINER_BEN] = - { -#line 6018 - .trainerName = _("BEN"), -#line 6019 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6020 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6022 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6023 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6024 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6026 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6028 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 6027 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6029 - MOVE_HEADBUTT, - MOVE_SAND_ATTACK, - MOVE_GROWL, - MOVE_THUNDERBOLT, - }, - }, - { -#line 6034 - .species = SPECIES_GULPIN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6036 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 6035 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6037 - MOVE_AMNESIA, - MOVE_SLUDGE, - MOVE_YAWN, - MOVE_POUND, - }, - }, - }, - }, -#line 6042 - [DIFFICULTY_NORMAL][TRAINER_QUINCY] = - { -#line 6043 - .trainerName = _("QUINCY"), -#line 6044 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 6045 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 6047 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 6048 - .items = { ITEM_FULL_RESTORE }, -#line 6049 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6050 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6052 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6054 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 6053 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6055 - MOVE_ATTRACT, - MOVE_ICE_BEAM, - MOVE_THUNDERBOLT, - MOVE_FLAMETHROWER, - }, - }, - { -#line 6060 - .species = SPECIES_DUSCLOPS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6062 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 6061 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6063 - MOVE_SKILL_SWAP, - MOVE_PROTECT, - MOVE_WILL_O_WISP, - MOVE_TOXIC, - }, - }, - }, - }, -#line 6068 - [DIFFICULTY_NORMAL][TRAINER_KATELYNN] = - { -#line 6069 - .trainerName = _("KATELYNN"), -#line 6070 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 6071 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 6072 -F_TRAINER_FEMALE | -#line 6073 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 6074 - .items = { ITEM_FULL_RESTORE }, -#line 6075 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6076 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6078 - .species = SPECIES_GARDEVOIR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6080 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 6079 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6081 - MOVE_SKILL_SWAP, - MOVE_PSYCHIC, - MOVE_THUNDERBOLT, - MOVE_CALM_MIND, - }, - }, - { -#line 6086 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6088 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 6087 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6089 - MOVE_EARTHQUAKE, - MOVE_SHADOW_BALL, - MOVE_AERIAL_ACE, - MOVE_BRICK_BREAK, - }, - }, - }, - }, -#line 6094 - [DIFFICULTY_NORMAL][TRAINER_JAYLEN] = - { -#line 6095 - .trainerName = _("JAYLEN"), -#line 6096 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6097 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6099 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6100 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6101 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6103 - .species = SPECIES_TRAPINCH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6105 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6104 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6107 - [DIFFICULTY_NORMAL][TRAINER_DILLON] = - { -#line 6108 - .trainerName = _("DILLON"), -#line 6109 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6110 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6112 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6113 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6114 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6116 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6118 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6117 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6120 - [DIFFICULTY_NORMAL][TRAINER_CALVIN_2] = - { -#line 6121 - .trainerName = _("CALVIN"), -#line 6122 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6123 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6125 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6126 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6127 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6129 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6131 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6130 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6133 - [DIFFICULTY_NORMAL][TRAINER_CALVIN_3] = - { -#line 6134 - .trainerName = _("CALVIN"), -#line 6135 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6136 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6138 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6139 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6140 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6142 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6144 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6143 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6146 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6148 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6147 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6150 - [DIFFICULTY_NORMAL][TRAINER_CALVIN_4] = - { -#line 6151 - .trainerName = _("CALVIN"), -#line 6152 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6153 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6155 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6156 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6157 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 6159 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6161 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6160 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6163 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6165 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6164 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6167 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6169 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6168 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6171 - [DIFFICULTY_NORMAL][TRAINER_CALVIN_5] = - { -#line 6172 - .trainerName = _("CALVIN"), -#line 6173 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6174 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6176 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6177 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6178 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 6180 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6182 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6181 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6184 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6186 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6185 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6188 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6190 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6189 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6192 - [DIFFICULTY_NORMAL][TRAINER_EDDIE] = - { -#line 6193 - .trainerName = _("EDDIE"), -#line 6194 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6195 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6197 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6198 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6199 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6201 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6203 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6202 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6205 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6207 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6206 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6209 - [DIFFICULTY_NORMAL][TRAINER_ALLEN] = - { -#line 6210 - .trainerName = _("ALLEN"), -#line 6211 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6212 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6214 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6215 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6216 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6218 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6220 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6219 - .lvl = 4, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6222 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6224 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6223 - .lvl = 3, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6226 - [DIFFICULTY_NORMAL][TRAINER_TIMMY] = - { -#line 6227 - .trainerName = _("TIMMY"), -#line 6228 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6229 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6231 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6232 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6233 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6235 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6237 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6236 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6239 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6241 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6240 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6243 - [DIFFICULTY_NORMAL][TRAINER_WALLACE] = - { -#line 6244 - .trainerName = _("WALLACE"), -#line 6245 - .trainerClass = TRAINER_CLASS_CHAMPION, -#line 6246 - .trainerPic = TRAINER_PIC_CHAMPION_WALLACE, - .encounterMusic_gender = -#line 6248 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6249 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 6250 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6251 - .aiFlags = AI_FLAG_BASIC_TRAINER, -#line 6252 - .mugshotColor = MUGSHOT_COLOR_YELLOW, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 6254 - .species = SPECIES_WAILORD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6256 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 6255 - .lvl = 57, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6257 - MOVE_RAIN_DANCE, - MOVE_WATER_SPOUT, - MOVE_DOUBLE_EDGE, - MOVE_BLIZZARD, - }, - }, - { -#line 6262 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6264 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 6263 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6265 - MOVE_TOXIC, - MOVE_HYDRO_PUMP, - MOVE_SLUDGE_BOMB, - MOVE_ICE_BEAM, - }, - }, - { -#line 6270 - .species = SPECIES_LUDICOLO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6272 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 6271 - .lvl = 56, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6273 - MOVE_GIGA_DRAIN, - MOVE_SURF, - MOVE_LEECH_SEED, - MOVE_DOUBLE_TEAM, - }, - }, - { -#line 6278 - .species = SPECIES_WHISCASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6280 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 6279 - .lvl = 56, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6281 - MOVE_EARTHQUAKE, - MOVE_SURF, - MOVE_AMNESIA, - MOVE_HYPER_BEAM, - }, - }, - { -#line 6286 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6288 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 6287 - .lvl = 56, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6289 - MOVE_DRAGON_DANCE, - MOVE_EARTHQUAKE, - MOVE_HYPER_BEAM, - MOVE_SURF, - }, - }, - { -#line 6294 - .species = SPECIES_MILOTIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6294 - .heldItem = ITEM_SITRUS_BERRY, -#line 6296 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 6295 - .lvl = 58, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6297 - MOVE_RECOVER, - MOVE_SURF, - MOVE_ICE_BEAM, - MOVE_TOXIC, - }, - }, - }, - }, -#line 6302 - [DIFFICULTY_NORMAL][TRAINER_ANDREW] = - { -#line 6303 - .trainerName = _("ANDREW"), -#line 6304 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6305 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6307 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6308 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6309 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 6311 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6313 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6312 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6315 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6317 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6316 - .lvl = 10, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6319 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6321 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6320 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6323 - [DIFFICULTY_NORMAL][TRAINER_IVAN] = - { -#line 6324 - .trainerName = _("IVAN"), -#line 6325 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6326 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6328 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6329 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6330 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 6332 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6334 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6333 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6336 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6338 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6337 - .lvl = 6, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6340 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6342 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6341 - .lvl = 7, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6344 - [DIFFICULTY_NORMAL][TRAINER_CLAUDE] = - { -#line 6345 - .trainerName = _("CLAUDE"), -#line 6346 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6347 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6349 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6350 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6351 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 6353 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6355 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6354 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6357 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6359 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6358 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6361 - .species = SPECIES_BARBOACH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6363 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6362 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6365 - [DIFFICULTY_NORMAL][TRAINER_ELLIOT_1] = - { -#line 6366 - .trainerName = _("ELLIOT"), -#line 6367 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6368 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6370 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6371 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6372 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 6374 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6376 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6375 - .lvl = 10, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6378 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6380 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6379 - .lvl = 7, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6382 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6384 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6383 - .lvl = 10, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6386 - [DIFFICULTY_NORMAL][TRAINER_NED] = - { -#line 6387 - .trainerName = _("NED"), -#line 6388 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6389 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6391 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6392 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6393 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6395 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6397 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6396 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6399 - [DIFFICULTY_NORMAL][TRAINER_DALE] = - { -#line 6400 - .trainerName = _("DALE"), -#line 6401 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6402 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6404 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6405 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6406 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 6408 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6410 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6409 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6412 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6414 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6413 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6416 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6418 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6417 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6420 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6422 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6421 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6424 - [DIFFICULTY_NORMAL][TRAINER_NOLAN] = - { -#line 6425 - .trainerName = _("NOLAN"), -#line 6426 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6427 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6429 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6430 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6431 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6433 - .species = SPECIES_BARBOACH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6435 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6434 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6437 - [DIFFICULTY_NORMAL][TRAINER_BARNY] = - { -#line 6438 - .trainerName = _("BARNY"), -#line 6439 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6440 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6442 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6443 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6444 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6446 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6448 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6447 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6450 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6452 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6451 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6454 - [DIFFICULTY_NORMAL][TRAINER_WADE] = - { -#line 6455 - .trainerName = _("WADE"), -#line 6456 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6457 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6459 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6460 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6461 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6463 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6465 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6464 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6467 - [DIFFICULTY_NORMAL][TRAINER_CARTER] = - { -#line 6468 - .trainerName = _("CARTER"), -#line 6469 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6470 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6472 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6473 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6474 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6476 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6478 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6477 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6480 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6482 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6481 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6484 - [DIFFICULTY_NORMAL][TRAINER_ELLIOT_2] = - { -#line 6485 - .trainerName = _("ELLIOT"), -#line 6486 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6487 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6489 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6490 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6491 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 6493 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6495 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6494 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6497 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6499 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6498 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6501 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6503 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6502 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6505 - [DIFFICULTY_NORMAL][TRAINER_ELLIOT_3] = - { -#line 6506 - .trainerName = _("ELLIOT"), -#line 6507 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6508 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6510 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6511 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6512 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 6514 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6516 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6515 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6518 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6520 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6519 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6522 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6524 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6523 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6526 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6528 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6527 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6530 - [DIFFICULTY_NORMAL][TRAINER_ELLIOT_4] = - { -#line 6531 - .trainerName = _("ELLIOT"), -#line 6532 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6533 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6535 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6536 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6537 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 6539 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6541 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6540 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6543 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6545 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6544 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6547 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6549 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6548 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6551 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6553 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6552 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6555 - [DIFFICULTY_NORMAL][TRAINER_ELLIOT_5] = - { -#line 6556 - .trainerName = _("ELLIOT"), -#line 6557 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6558 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6560 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6561 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6562 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 6564 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6566 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6565 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6568 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6570 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6569 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6572 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6574 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6573 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6576 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6578 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6577 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6580 - [DIFFICULTY_NORMAL][TRAINER_RONALD] = - { -#line 6581 - .trainerName = _("RONALD"), -#line 6582 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6583 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6585 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6586 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6587 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 6589 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6591 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6590 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6593 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6595 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6594 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6597 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6599 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6598 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6601 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6603 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6602 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6605 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6607 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6606 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6609 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6611 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6610 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6613 - [DIFFICULTY_NORMAL][TRAINER_JACOB] = - { -#line 6614 - .trainerName = _("JACOB"), -#line 6615 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6616 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6618 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6619 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6620 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 6622 - .species = SPECIES_VOLTORB, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6624 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6623 - .lvl = 6, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6626 - .species = SPECIES_VOLTORB, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6628 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6627 - .lvl = 6, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6630 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6632 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 6631 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6634 - [DIFFICULTY_NORMAL][TRAINER_ANTHONY] = - { -#line 6635 - .trainerName = _("ANTHONY"), -#line 6636 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6637 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6639 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6640 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6641 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6643 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6645 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6644 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6647 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6649 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6648 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6651 - [DIFFICULTY_NORMAL][TRAINER_BENJAMIN_1] = - { -#line 6652 - .trainerName = _("BENJAMIN"), -#line 6653 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6654 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6656 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6657 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6658 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6660 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6662 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6661 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6664 - [DIFFICULTY_NORMAL][TRAINER_BENJAMIN_2] = - { -#line 6665 - .trainerName = _("BENJAMIN"), -#line 6666 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6667 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6669 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6670 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6671 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6673 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6675 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6674 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6677 - [DIFFICULTY_NORMAL][TRAINER_BENJAMIN_3] = - { -#line 6678 - .trainerName = _("BENJAMIN"), -#line 6679 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6680 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6682 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6683 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6684 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6686 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6688 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6687 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6690 - [DIFFICULTY_NORMAL][TRAINER_BENJAMIN_4] = - { -#line 6691 - .trainerName = _("BENJAMIN"), -#line 6692 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6693 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6695 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6696 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6697 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6699 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6701 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6700 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6703 - [DIFFICULTY_NORMAL][TRAINER_BENJAMIN_5] = - { -#line 6704 - .trainerName = _("BENJAMIN"), -#line 6705 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6706 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6708 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6709 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6710 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6712 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6714 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6713 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6716 - [DIFFICULTY_NORMAL][TRAINER_ABIGAIL_1] = - { -#line 6717 - .trainerName = _("ABIGAIL"), -#line 6718 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6719 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6720 -F_TRAINER_FEMALE | -#line 6721 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6722 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6723 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6725 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6727 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6726 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6729 - [DIFFICULTY_NORMAL][TRAINER_JASMINE] = - { -#line 6730 - .trainerName = _("JASMINE"), -#line 6731 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6732 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6733 -F_TRAINER_FEMALE | -#line 6734 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6735 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6736 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 6738 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6740 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 6739 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6742 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6744 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 6743 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6746 - .species = SPECIES_VOLTORB, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6748 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6747 - .lvl = 6, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6750 - [DIFFICULTY_NORMAL][TRAINER_ABIGAIL_2] = - { -#line 6751 - .trainerName = _("ABIGAIL"), -#line 6752 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6753 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6754 -F_TRAINER_FEMALE | -#line 6755 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6756 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6757 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6759 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6761 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6760 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6763 - [DIFFICULTY_NORMAL][TRAINER_ABIGAIL_3] = - { -#line 6764 - .trainerName = _("ABIGAIL"), -#line 6765 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6766 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6767 -F_TRAINER_FEMALE | -#line 6768 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6769 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6770 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6772 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6774 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6773 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6776 - [DIFFICULTY_NORMAL][TRAINER_ABIGAIL_4] = - { -#line 6777 - .trainerName = _("ABIGAIL"), -#line 6778 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6779 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6780 -F_TRAINER_FEMALE | -#line 6781 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6782 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6783 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6785 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6787 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6786 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6789 - [DIFFICULTY_NORMAL][TRAINER_ABIGAIL_5] = - { -#line 6790 - .trainerName = _("ABIGAIL"), -#line 6791 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6792 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6793 -F_TRAINER_FEMALE | -#line 6794 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6795 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6796 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6798 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6800 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6799 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6802 - [DIFFICULTY_NORMAL][TRAINER_DYLAN_1] = - { -#line 6803 - .trainerName = _("DYLAN"), -#line 6804 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6805 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6807 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6808 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6809 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6811 - .species = SPECIES_DODUO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6813 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6812 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6815 - [DIFFICULTY_NORMAL][TRAINER_DYLAN_2] = - { -#line 6816 - .trainerName = _("DYLAN"), -#line 6817 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6818 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6820 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6821 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6822 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6824 - .species = SPECIES_DODUO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6826 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6825 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6828 - [DIFFICULTY_NORMAL][TRAINER_DYLAN_3] = - { -#line 6829 - .trainerName = _("DYLAN"), -#line 6830 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6831 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6833 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6834 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6835 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6837 - .species = SPECIES_DODUO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6839 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6838 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6841 - [DIFFICULTY_NORMAL][TRAINER_DYLAN_4] = - { -#line 6842 - .trainerName = _("DYLAN"), -#line 6843 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6844 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6846 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6847 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6848 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6850 - .species = SPECIES_DODRIO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6852 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6851 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6854 - [DIFFICULTY_NORMAL][TRAINER_DYLAN_5] = - { -#line 6855 - .trainerName = _("DYLAN"), -#line 6856 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6857 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6859 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6860 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6861 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6863 - .species = SPECIES_DODRIO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6865 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6864 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6867 - [DIFFICULTY_NORMAL][TRAINER_MARIA_1] = - { -#line 6868 - .trainerName = _("MARIA"), -#line 6869 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6870 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6871 -F_TRAINER_FEMALE | -#line 6872 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6873 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6874 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6876 - .species = SPECIES_DODUO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6878 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6877 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6880 - [DIFFICULTY_NORMAL][TRAINER_MARIA_2] = - { -#line 6881 - .trainerName = _("MARIA"), -#line 6882 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6883 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6884 -F_TRAINER_FEMALE | -#line 6885 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6886 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6887 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6889 - .species = SPECIES_DODUO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6891 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6890 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6893 - [DIFFICULTY_NORMAL][TRAINER_MARIA_3] = - { -#line 6894 - .trainerName = _("MARIA"), -#line 6895 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6896 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6897 -F_TRAINER_FEMALE | -#line 6898 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6899 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6900 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6902 - .species = SPECIES_DODUO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6904 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6903 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6906 - [DIFFICULTY_NORMAL][TRAINER_MARIA_4] = - { -#line 6907 - .trainerName = _("MARIA"), -#line 6908 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6909 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6910 -F_TRAINER_FEMALE | -#line 6911 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6912 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6913 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6915 - .species = SPECIES_DODRIO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6917 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6916 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6919 - [DIFFICULTY_NORMAL][TRAINER_MARIA_5] = - { -#line 6920 - .trainerName = _("MARIA"), -#line 6921 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6922 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6923 -F_TRAINER_FEMALE | -#line 6924 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6925 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6926 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6928 - .species = SPECIES_DODRIO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6930 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6929 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6932 - [DIFFICULTY_NORMAL][TRAINER_CAMDEN] = - { -#line 6933 - .trainerName = _("CAMDEN"), -#line 6934 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6935 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6937 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 6938 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6939 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6941 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6943 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6942 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6945 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6947 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6946 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6949 - [DIFFICULTY_NORMAL][TRAINER_DEMETRIUS] = - { -#line 6950 - .trainerName = _("DEMETRIUS"), -#line 6951 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6952 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6954 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6955 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6956 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6958 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6960 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6959 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6962 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6964 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6963 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6966 - [DIFFICULTY_NORMAL][TRAINER_ISAIAH_1] = - { -#line 6967 - .trainerName = _("ISAIAH"), -#line 6968 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6969 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6971 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 6972 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6973 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6975 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6977 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6976 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6979 - [DIFFICULTY_NORMAL][TRAINER_PABLO_1] = - { -#line 6980 - .trainerName = _("PABLO"), -#line 6981 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6982 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6984 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 6985 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6986 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6988 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6990 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6989 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6992 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6994 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6993 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6996 - [DIFFICULTY_NORMAL][TRAINER_CHASE] = - { -#line 6997 - .trainerName = _("CHASE"), -#line 6998 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6999 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 7001 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7002 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7003 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7005 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7007 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7006 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7009 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7011 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 7010 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7013 - [DIFFICULTY_NORMAL][TRAINER_ISAIAH_2] = - { -#line 7014 - .trainerName = _("ISAIAH"), -#line 7015 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7016 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 7018 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7019 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7020 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7022 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7024 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 7023 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7026 - [DIFFICULTY_NORMAL][TRAINER_ISAIAH_3] = - { -#line 7027 - .trainerName = _("ISAIAH"), -#line 7028 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7029 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 7031 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7032 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7033 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7035 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7037 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7036 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7039 - [DIFFICULTY_NORMAL][TRAINER_ISAIAH_4] = - { -#line 7040 - .trainerName = _("ISAIAH"), -#line 7041 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7042 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 7044 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7045 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7046 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7048 - .species = SPECIES_STARMIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7050 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 7049 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7052 - [DIFFICULTY_NORMAL][TRAINER_ISAIAH_5] = - { -#line 7053 - .trainerName = _("ISAIAH"), -#line 7054 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7055 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 7057 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7058 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7059 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7061 - .species = SPECIES_STARMIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7063 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 7062 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7065 - [DIFFICULTY_NORMAL][TRAINER_ISOBEL] = - { -#line 7066 - .trainerName = _("ISOBEL"), -#line 7067 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7068 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7069 -F_TRAINER_FEMALE | -#line 7070 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7071 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7072 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7074 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7076 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7075 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7078 - [DIFFICULTY_NORMAL][TRAINER_DONNY] = - { -#line 7079 - .trainerName = _("DONNY"), -#line 7080 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7081 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7082 -F_TRAINER_FEMALE | -#line 7083 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7084 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7085 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7087 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7089 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7088 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7091 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7093 - .iv = TRAINER_PARTY_IVS(19, 19, 19, 19, 19, 19), -#line 7092 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7095 - [DIFFICULTY_NORMAL][TRAINER_TALIA] = - { -#line 7096 - .trainerName = _("TALIA"), -#line 7097 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7098 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7099 -F_TRAINER_FEMALE | -#line 7100 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7101 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7102 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7104 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7106 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7105 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7108 - [DIFFICULTY_NORMAL][TRAINER_KATELYN_1] = - { -#line 7109 - .trainerName = _("KATELYN"), -#line 7110 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7111 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7112 -F_TRAINER_FEMALE | -#line 7113 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7114 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7115 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7117 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7119 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7118 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7121 - [DIFFICULTY_NORMAL][TRAINER_ALLISON] = - { -#line 7122 - .trainerName = _("ALLISON"), -#line 7123 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7124 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7125 -F_TRAINER_FEMALE | -#line 7126 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7127 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7128 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7130 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7132 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7131 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7134 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7136 - .iv = TRAINER_PARTY_IVS(29, 29, 29, 29, 29, 29), -#line 7135 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7138 - [DIFFICULTY_NORMAL][TRAINER_KATELYN_2] = - { -#line 7139 - .trainerName = _("KATELYN"), -#line 7140 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7141 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7142 -F_TRAINER_FEMALE | -#line 7143 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7144 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7145 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7147 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7149 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 7148 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7151 - [DIFFICULTY_NORMAL][TRAINER_KATELYN_3] = - { -#line 7152 - .trainerName = _("KATELYN"), -#line 7153 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7154 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7155 -F_TRAINER_FEMALE | -#line 7156 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7157 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7158 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7160 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7162 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7161 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7164 - [DIFFICULTY_NORMAL][TRAINER_KATELYN_4] = - { -#line 7165 - .trainerName = _("KATELYN"), -#line 7166 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7167 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7168 -F_TRAINER_FEMALE | -#line 7169 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7170 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7171 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7173 - .species = SPECIES_STARMIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7175 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 7174 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7177 - [DIFFICULTY_NORMAL][TRAINER_KATELYN_5] = - { -#line 7178 - .trainerName = _("KATELYN"), -#line 7179 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7180 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7181 -F_TRAINER_FEMALE | -#line 7182 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7183 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7184 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7186 - .species = SPECIES_STARMIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7188 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 7187 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7190 - [DIFFICULTY_NORMAL][TRAINER_NICOLAS_1] = - { -#line 7191 - .trainerName = _("NICOLAS"), -#line 7192 - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, -#line 7193 - .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = -#line 7195 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7196 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7197 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7199 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7201 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7200 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7203 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7205 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7204 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7207 - [DIFFICULTY_NORMAL][TRAINER_NICOLAS_2] = - { -#line 7208 - .trainerName = _("NICOLAS"), -#line 7209 - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, -#line 7210 - .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = -#line 7212 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7213 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7214 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7216 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7218 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 7217 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7220 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7222 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 7221 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7224 - [DIFFICULTY_NORMAL][TRAINER_NICOLAS_3] = - { -#line 7225 - .trainerName = _("NICOLAS"), -#line 7226 - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, -#line 7227 - .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = -#line 7229 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7230 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7231 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7233 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7235 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 7234 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7237 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7239 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 7238 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7241 - [DIFFICULTY_NORMAL][TRAINER_NICOLAS_4] = - { -#line 7242 - .trainerName = _("NICOLAS"), -#line 7243 - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, -#line 7244 - .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = -#line 7246 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7247 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7248 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 7250 - .species = SPECIES_BAGON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7252 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 7251 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7254 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7256 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 7255 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7258 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7260 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 7259 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7262 - [DIFFICULTY_NORMAL][TRAINER_NICOLAS_5] = - { -#line 7263 - .trainerName = _("NICOLAS"), -#line 7264 - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, -#line 7265 - .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = -#line 7267 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7268 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7269 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 7271 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7273 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 7272 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7275 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7277 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 7276 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7279 - .species = SPECIES_SHELGON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7279 - .heldItem = ITEM_DRAGON_FANG, -#line 7281 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 7280 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7283 - [DIFFICULTY_NORMAL][TRAINER_AARON] = - { -#line 7284 - .trainerName = _("AARON"), -#line 7285 - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, -#line 7286 - .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = -#line 7288 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7289 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7290 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7292 - .species = SPECIES_BAGON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7294 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 7293 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7295 - MOVE_DRAGON_BREATH, - MOVE_HEADBUTT, - MOVE_FOCUS_ENERGY, - MOVE_EMBER, - }, - }, - }, - }, -#line 7300 - [DIFFICULTY_NORMAL][TRAINER_PERRY] = - { -#line 7301 - .trainerName = _("PERRY"), -#line 7302 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7303 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7305 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7306 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7307 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7309 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7311 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7310 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7313 - [DIFFICULTY_NORMAL][TRAINER_HUGH] = - { -#line 7314 - .trainerName = _("HUGH"), -#line 7315 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7316 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7318 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7319 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7320 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7322 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7324 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7323 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7326 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7328 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7327 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7330 - [DIFFICULTY_NORMAL][TRAINER_PHIL] = - { -#line 7331 - .trainerName = _("PHIL"), -#line 7332 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7333 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7335 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7336 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7337 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7339 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7341 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7340 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7343 - [DIFFICULTY_NORMAL][TRAINER_JARED] = - { -#line 7344 - .trainerName = _("JARED"), -#line 7345 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7346 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7348 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7349 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7350 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 7352 - .species = SPECIES_DODUO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7354 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7353 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7356 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7358 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7357 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7360 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7362 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7361 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7364 - [DIFFICULTY_NORMAL][TRAINER_HUMBERTO] = - { -#line 7365 - .trainerName = _("HUMBERTO"), -#line 7366 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7367 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7369 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7370 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7371 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7373 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7375 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 7374 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7377 - [DIFFICULTY_NORMAL][TRAINER_PRESLEY] = - { -#line 7378 - .trainerName = _("PRESLEY"), -#line 7379 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7380 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7382 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7383 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7384 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7386 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7388 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7387 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7390 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7392 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7391 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7394 - [DIFFICULTY_NORMAL][TRAINER_EDWARDO] = - { -#line 7395 - .trainerName = _("EDWARDO"), -#line 7396 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7397 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7399 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7400 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7401 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7403 - .species = SPECIES_DODUO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7405 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 7404 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7407 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7409 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 7408 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7411 - [DIFFICULTY_NORMAL][TRAINER_COLIN] = - { -#line 7412 - .trainerName = _("COLIN"), -#line 7413 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7414 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7416 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7417 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7418 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7420 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7422 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7421 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7424 - .species = SPECIES_NATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7426 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7425 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7428 - [DIFFICULTY_NORMAL][TRAINER_ROBERT_1] = - { -#line 7429 - .trainerName = _("ROBERT"), -#line 7430 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7431 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7433 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7434 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7435 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7437 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7439 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7438 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7441 - [DIFFICULTY_NORMAL][TRAINER_BENNY] = - { -#line 7442 - .trainerName = _("BENNY"), -#line 7443 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7444 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7446 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7447 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7448 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 7450 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7452 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7451 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7454 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7456 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7455 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7458 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7460 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7459 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7462 - [DIFFICULTY_NORMAL][TRAINER_CHESTER] = - { -#line 7463 - .trainerName = _("CHESTER"), -#line 7464 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7465 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7467 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7468 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7469 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7471 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7473 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7472 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7475 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7477 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7476 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7479 - [DIFFICULTY_NORMAL][TRAINER_ROBERT_2] = - { -#line 7480 - .trainerName = _("ROBERT"), -#line 7481 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7482 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7484 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7485 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7486 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7488 - .species = SPECIES_NATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7490 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 7489 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7492 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7494 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 7493 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7496 - [DIFFICULTY_NORMAL][TRAINER_ROBERT_3] = - { -#line 7497 - .trainerName = _("ROBERT"), -#line 7498 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7499 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7501 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7502 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7503 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7505 - .species = SPECIES_NATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7507 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7506 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7509 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7511 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7510 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7513 - [DIFFICULTY_NORMAL][TRAINER_ROBERT_4] = - { -#line 7514 - .trainerName = _("ROBERT"), -#line 7515 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7516 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7518 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7519 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7520 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7522 - .species = SPECIES_NATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7524 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 7523 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7526 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7528 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 7527 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7530 - [DIFFICULTY_NORMAL][TRAINER_ROBERT_5] = - { -#line 7531 - .trainerName = _("ROBERT"), -#line 7532 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7533 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7535 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7536 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7537 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7539 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7541 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 7540 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7543 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7545 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 7544 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7547 - [DIFFICULTY_NORMAL][TRAINER_ALEX] = - { -#line 7548 - .trainerName = _("ALEX"), -#line 7549 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7550 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7552 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7553 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7554 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7556 - .species = SPECIES_NATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7558 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 7557 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7560 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7562 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 7561 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7564 - [DIFFICULTY_NORMAL][TRAINER_BECK] = - { -#line 7565 - .trainerName = _("BECK"), -#line 7566 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7567 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7569 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7570 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7571 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7573 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7575 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7574 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7577 - [DIFFICULTY_NORMAL][TRAINER_YASU] = - { -#line 7578 - .trainerName = _("YASU"), -#line 7579 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7580 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 7582 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7583 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7584 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7586 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7588 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7587 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7590 - [DIFFICULTY_NORMAL][TRAINER_TAKASHI] = - { -#line 7591 - .trainerName = _("TAKASHI"), -#line 7592 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7593 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 7595 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7596 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7597 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7599 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7601 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7600 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7603 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7605 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7604 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7607 - [DIFFICULTY_NORMAL][TRAINER_DIANNE] = - { -#line 7608 - .trainerName = _("DIANNE"), -#line 7609 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 7610 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 7611 -F_TRAINER_FEMALE | -#line 7612 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7613 - .items = { ITEM_FULL_RESTORE }, -#line 7614 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7616 - .species = SPECIES_CLAYDOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7618 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7617 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7619 - MOVE_SKILL_SWAP, - MOVE_EARTHQUAKE, - }, - }, - { -#line 7622 - .species = SPECIES_LANTURN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7624 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7623 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7625 - MOVE_THUNDERBOLT, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 7628 - [DIFFICULTY_NORMAL][TRAINER_JANI] = - { -#line 7629 - .trainerName = _("JANI"), -#line 7630 - .trainerClass = TRAINER_CLASS_TUBER_F, -#line 7631 - .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = -#line 7632 -F_TRAINER_FEMALE | -#line 7633 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 7634 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7636 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7638 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7637 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7640 - [DIFFICULTY_NORMAL][TRAINER_LAO_1] = - { -#line 7641 - .trainerName = _("LAO"), -#line 7642 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7643 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 7645 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7646 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 7648 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7650 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7649 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7651 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SMOG, - MOVE_SELF_DESTRUCT, - }, - }, - { -#line 7656 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7658 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7657 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7659 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SMOG, - MOVE_SELF_DESTRUCT, - }, - }, - { -#line 7664 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7666 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7665 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7667 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - MOVE_SELF_DESTRUCT, - }, - }, - }, - }, -#line 7672 - [DIFFICULTY_NORMAL][TRAINER_LUNG] = - { -#line 7673 - .trainerName = _("LUNG"), -#line 7674 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7675 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 7677 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7678 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7680 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7682 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7681 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7684 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7686 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7685 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7688 - [DIFFICULTY_NORMAL][TRAINER_LAO_2] = - { -#line 7689 - .trainerName = _("LAO"), -#line 7690 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7691 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 7693 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7694 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 7696 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7698 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7697 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7699 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - MOVE_SELF_DESTRUCT, - }, - }, - { -#line 7704 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7706 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7705 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7707 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - { -#line 7711 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7713 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7712 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7714 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - MOVE_SELF_DESTRUCT, - }, - }, - { -#line 7719 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7721 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7720 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7722 - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - }, - }, -#line 7725 - [DIFFICULTY_NORMAL][TRAINER_LAO_3] = - { -#line 7726 - .trainerName = _("LAO"), -#line 7727 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7728 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 7730 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7731 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 7733 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7735 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7734 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7736 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - MOVE_SELF_DESTRUCT, - }, - }, - { -#line 7741 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7743 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7742 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7744 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - MOVE_SELF_DESTRUCT, - }, - }, - { -#line 7749 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7751 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7750 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7752 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - { -#line 7756 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7758 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7757 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7759 - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - }, - }, -#line 7762 - [DIFFICULTY_NORMAL][TRAINER_LAO_4] = - { -#line 7763 - .trainerName = _("LAO"), -#line 7764 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7765 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 7767 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7768 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 7770 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7772 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 7771 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7773 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - { -#line 7777 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7779 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 7778 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7780 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - { -#line 7784 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7786 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 7785 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7787 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - { -#line 7791 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7793 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 7792 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7794 - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - }, - }, -#line 7797 - [DIFFICULTY_NORMAL][TRAINER_LAO_5] = - { -#line 7798 - .trainerName = _("LAO"), -#line 7799 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7800 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 7802 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7803 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 7805 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7807 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 7806 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7808 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - { -#line 7812 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7814 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 7813 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7815 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - MOVE_SELF_DESTRUCT, - }, - }, - { -#line 7820 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7822 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 7821 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7823 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - MOVE_SELF_DESTRUCT, - }, - }, - { -#line 7828 - .species = SPECIES_WEEZING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7828 - .heldItem = ITEM_SMOKE_BALL, -#line 7830 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 7829 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7831 - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - }, - }, -#line 7834 - [DIFFICULTY_NORMAL][TRAINER_JOCELYN] = - { -#line 7835 - .trainerName = _("JOCELYN"), -#line 7836 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7837 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 7838 -F_TRAINER_FEMALE | -#line 7839 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7840 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7841 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7843 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7845 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 7844 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7847 - [DIFFICULTY_NORMAL][TRAINER_LAURA] = - { -#line 7848 - .trainerName = _("LAURA"), -#line 7849 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7850 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 7851 -F_TRAINER_FEMALE | -#line 7852 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7853 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7854 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7856 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7858 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 7857 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7860 - [DIFFICULTY_NORMAL][TRAINER_CYNDY_1] = - { -#line 7861 - .trainerName = _("CYNDY"), -#line 7862 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7863 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 7864 -F_TRAINER_FEMALE | -#line 7865 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7866 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7867 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7869 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7871 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7870 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7873 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7875 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7874 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7877 - [DIFFICULTY_NORMAL][TRAINER_CORA] = - { -#line 7878 - .trainerName = _("CORA"), -#line 7879 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7880 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 7881 -F_TRAINER_FEMALE | -#line 7882 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7883 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7884 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7886 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7888 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7887 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7890 - [DIFFICULTY_NORMAL][TRAINER_PAULA] = - { -#line 7891 - .trainerName = _("PAULA"), -#line 7892 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7893 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 7894 -F_TRAINER_FEMALE | -#line 7895 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7896 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7897 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7899 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7901 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7900 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7903 - [DIFFICULTY_NORMAL][TRAINER_CYNDY_2] = - { -#line 7904 - .trainerName = _("CYNDY"), -#line 7905 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7906 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 7907 -F_TRAINER_FEMALE | -#line 7908 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7909 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7910 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7912 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7914 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 7913 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7916 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7918 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 7917 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7920 - [DIFFICULTY_NORMAL][TRAINER_CYNDY_3] = - { -#line 7921 - .trainerName = _("CYNDY"), -#line 7922 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7923 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 7924 -F_TRAINER_FEMALE | -#line 7925 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7926 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7927 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7929 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7931 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 7930 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7933 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7935 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 7934 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7937 - [DIFFICULTY_NORMAL][TRAINER_CYNDY_4] = - { -#line 7938 - .trainerName = _("CYNDY"), -#line 7939 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7940 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 7941 -F_TRAINER_FEMALE | -#line 7942 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7943 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7944 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7946 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7948 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 7947 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7950 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7952 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 7951 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7954 - [DIFFICULTY_NORMAL][TRAINER_CYNDY_5] = - { -#line 7955 - .trainerName = _("CYNDY"), -#line 7956 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7957 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 7958 -F_TRAINER_FEMALE | -#line 7959 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7960 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7961 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7963 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7965 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 7964 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7967 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7969 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 7968 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7971 - [DIFFICULTY_NORMAL][TRAINER_MADELINE_1] = - { -#line 7972 - .trainerName = _("MADELINE"), -#line 7973 - .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 7974 - .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = -#line 7975 -F_TRAINER_FEMALE | -#line 7976 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 7977 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7978 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7980 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7982 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7981 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7983 - MOVE_EMBER, - MOVE_TACKLE, - MOVE_MAGNITUDE, - MOVE_SUNNY_DAY, - }, - }, - }, - }, -#line 7988 - [DIFFICULTY_NORMAL][TRAINER_CLARISSA] = - { -#line 7989 - .trainerName = _("CLARISSA"), -#line 7990 - .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 7991 - .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = -#line 7992 -F_TRAINER_FEMALE | -#line 7993 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 7994 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7995 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7997 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7999 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7998 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8001 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8003 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8002 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8005 - [DIFFICULTY_NORMAL][TRAINER_ANGELICA] = - { -#line 8006 - .trainerName = _("ANGELICA"), -#line 8007 - .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 8008 - .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = -#line 8009 -F_TRAINER_FEMALE | -#line 8010 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 8011 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8012 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8014 - .species = SPECIES_CASTFORM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8016 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 8015 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8017 - MOVE_RAIN_DANCE, - MOVE_WEATHER_BALL, - MOVE_THUNDER, - MOVE_WATER_PULSE, - }, - }, - }, - }, -#line 8022 - [DIFFICULTY_NORMAL][TRAINER_MADELINE_2] = - { -#line 8023 - .trainerName = _("MADELINE"), -#line 8024 - .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 8025 - .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = -#line 8026 -F_TRAINER_FEMALE | -#line 8027 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 8028 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8029 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8031 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8033 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8032 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8034 - MOVE_EMBER, - MOVE_TACKLE, - MOVE_MAGNITUDE, - MOVE_SUNNY_DAY, - }, - }, - }, - }, -#line 8039 - [DIFFICULTY_NORMAL][TRAINER_MADELINE_3] = - { -#line 8040 - .trainerName = _("MADELINE"), -#line 8041 - .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 8042 - .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = -#line 8043 -F_TRAINER_FEMALE | -#line 8044 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 8045 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8046 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8048 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8050 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 8049 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8051 - MOVE_EMBER, - MOVE_TAKE_DOWN, - MOVE_MAGNITUDE, - MOVE_SUNNY_DAY, - }, - }, - }, - }, -#line 8056 - [DIFFICULTY_NORMAL][TRAINER_MADELINE_4] = - { -#line 8057 - .trainerName = _("MADELINE"), -#line 8058 - .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 8059 - .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = -#line 8060 -F_TRAINER_FEMALE | -#line 8061 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 8062 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8063 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8065 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8067 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 8066 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8068 - MOVE_LEECH_SEED, - MOVE_MEGA_DRAIN, - MOVE_GRASS_WHISTLE, - MOVE_SUNNY_DAY, - }, - }, - { -#line 8073 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8075 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 8074 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8076 - MOVE_FLAMETHROWER, - MOVE_TAKE_DOWN, - MOVE_MAGNITUDE, - MOVE_SUNNY_DAY, - }, - }, - }, - }, -#line 8081 - [DIFFICULTY_NORMAL][TRAINER_MADELINE_5] = - { -#line 8082 - .trainerName = _("MADELINE"), -#line 8083 - .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 8084 - .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = -#line 8085 -F_TRAINER_FEMALE | -#line 8086 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 8087 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8088 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8090 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8092 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 8091 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8093 - MOVE_LEECH_SEED, - MOVE_GIGA_DRAIN, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - }, - }, - { -#line 8098 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8100 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 8099 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8101 - MOVE_FLAMETHROWER, - MOVE_TAKE_DOWN, - MOVE_EARTHQUAKE, - MOVE_SUNNY_DAY, - }, - }, - }, - }, -#line 8106 - [DIFFICULTY_NORMAL][TRAINER_BEVERLY] = - { -#line 8107 - .trainerName = _("BEVERLY"), -#line 8108 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8109 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8110 -F_TRAINER_FEMALE | -#line 8111 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8112 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8113 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8115 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8117 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8116 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8119 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8121 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8120 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8123 - [DIFFICULTY_NORMAL][TRAINER_IMANI] = - { -#line 8124 - .trainerName = _("IMANI"), -#line 8125 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8126 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8127 -F_TRAINER_FEMALE | -#line 8128 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8129 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8130 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8132 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8134 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8133 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8136 - [DIFFICULTY_NORMAL][TRAINER_KYLA] = - { -#line 8137 - .trainerName = _("KYLA"), -#line 8138 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8139 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8140 -F_TRAINER_FEMALE | -#line 8141 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8142 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8143 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8145 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8147 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8146 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8149 - [DIFFICULTY_NORMAL][TRAINER_DENISE] = - { -#line 8150 - .trainerName = _("DENISE"), -#line 8151 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8152 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8153 -F_TRAINER_FEMALE | -#line 8154 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8155 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8156 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8158 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8160 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8159 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8162 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8164 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8163 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8166 - [DIFFICULTY_NORMAL][TRAINER_BETH] = - { -#line 8167 - .trainerName = _("BETH"), -#line 8168 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8169 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8170 -F_TRAINER_FEMALE | -#line 8171 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8172 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8173 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8175 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8177 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8176 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8179 - [DIFFICULTY_NORMAL][TRAINER_TARA] = - { -#line 8180 - .trainerName = _("TARA"), -#line 8181 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8182 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8183 -F_TRAINER_FEMALE | -#line 8184 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8185 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8186 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8188 - .species = SPECIES_HORSEA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8190 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8189 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8192 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8194 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8193 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8196 - [DIFFICULTY_NORMAL][TRAINER_MISSY] = - { -#line 8197 - .trainerName = _("MISSY"), -#line 8198 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8199 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8200 -F_TRAINER_FEMALE | -#line 8201 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8202 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8203 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8205 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8207 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8206 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8209 - [DIFFICULTY_NORMAL][TRAINER_ALICE] = - { -#line 8210 - .trainerName = _("ALICE"), -#line 8211 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8212 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8213 -F_TRAINER_FEMALE | -#line 8214 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8215 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8216 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 8218 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8220 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8219 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8222 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8224 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8223 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8226 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8228 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8227 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8230 - [DIFFICULTY_NORMAL][TRAINER_JENNY_1] = - { -#line 8231 - .trainerName = _("JENNY"), -#line 8232 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8233 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8234 -F_TRAINER_FEMALE | -#line 8235 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8236 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8237 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8239 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8241 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8240 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8243 - [DIFFICULTY_NORMAL][TRAINER_GRACE] = - { -#line 8244 - .trainerName = _("GRACE"), -#line 8245 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8246 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8247 -F_TRAINER_FEMALE | -#line 8248 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8249 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8250 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8252 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8254 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8253 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8256 - [DIFFICULTY_NORMAL][TRAINER_TANYA] = - { -#line 8257 - .trainerName = _("TANYA"), -#line 8258 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8259 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8260 -F_TRAINER_FEMALE | -#line 8261 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8262 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8263 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8265 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8267 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8266 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8269 - [DIFFICULTY_NORMAL][TRAINER_SHARON] = - { -#line 8270 - .trainerName = _("SHARON"), -#line 8271 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8272 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8273 -F_TRAINER_FEMALE | -#line 8274 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8275 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8276 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8278 - .species = SPECIES_SEAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8280 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8279 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8282 - [DIFFICULTY_NORMAL][TRAINER_NIKKI] = - { -#line 8283 - .trainerName = _("NIKKI"), -#line 8284 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8285 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8286 -F_TRAINER_FEMALE | -#line 8287 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8288 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8289 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8291 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8293 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8292 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8295 - .species = SPECIES_SPHEAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8297 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8296 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8299 - [DIFFICULTY_NORMAL][TRAINER_BRENDA] = - { -#line 8300 - .trainerName = _("BRENDA"), -#line 8301 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8302 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8303 -F_TRAINER_FEMALE | -#line 8304 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8305 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8306 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8308 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8310 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8309 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8312 - [DIFFICULTY_NORMAL][TRAINER_KATIE] = - { -#line 8313 - .trainerName = _("KATIE"), -#line 8314 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8315 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8316 -F_TRAINER_FEMALE | -#line 8317 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8318 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8319 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8321 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8323 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8322 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8325 - .species = SPECIES_SPHEAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8327 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8326 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8329 - [DIFFICULTY_NORMAL][TRAINER_SUSIE] = - { -#line 8330 - .trainerName = _("SUSIE"), -#line 8331 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8332 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8333 -F_TRAINER_FEMALE | -#line 8334 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8335 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8336 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8338 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8340 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8339 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8342 - [DIFFICULTY_NORMAL][TRAINER_KARA] = - { -#line 8343 - .trainerName = _("KARA"), -#line 8344 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8345 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8346 -F_TRAINER_FEMALE | -#line 8347 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8348 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8349 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8351 - .species = SPECIES_SEAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8353 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8352 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8355 - [DIFFICULTY_NORMAL][TRAINER_DANA] = - { -#line 8356 - .trainerName = _("DANA"), -#line 8357 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8358 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8359 -F_TRAINER_FEMALE | -#line 8360 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8361 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8362 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8364 - .species = SPECIES_AZUMARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8366 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8365 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8368 - [DIFFICULTY_NORMAL][TRAINER_SIENNA] = - { -#line 8369 - .trainerName = _("SIENNA"), -#line 8370 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8371 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8372 -F_TRAINER_FEMALE | -#line 8373 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8374 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8375 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8377 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8379 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8378 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8381 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8383 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8382 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8385 - [DIFFICULTY_NORMAL][TRAINER_DEBRA] = - { -#line 8386 - .trainerName = _("DEBRA"), -#line 8387 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8388 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8389 -F_TRAINER_FEMALE | -#line 8390 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8391 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8392 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8394 - .species = SPECIES_SEAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8396 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8395 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8398 - [DIFFICULTY_NORMAL][TRAINER_LINDA] = - { -#line 8399 - .trainerName = _("LINDA"), -#line 8400 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8401 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8402 -F_TRAINER_FEMALE | -#line 8403 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8404 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8405 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8407 - .species = SPECIES_HORSEA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8409 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8408 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8411 - .species = SPECIES_SEADRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8413 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8412 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8415 - [DIFFICULTY_NORMAL][TRAINER_KAYLEE] = - { -#line 8416 - .trainerName = _("KAYLEE"), -#line 8417 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8418 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8419 -F_TRAINER_FEMALE | -#line 8420 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8421 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8422 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8424 - .species = SPECIES_LANTURN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8426 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8425 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8428 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8430 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8429 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8432 - [DIFFICULTY_NORMAL][TRAINER_LAUREL] = - { -#line 8433 - .trainerName = _("LAUREL"), -#line 8434 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8435 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8436 -F_TRAINER_FEMALE | -#line 8437 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8438 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8439 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8441 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8443 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8442 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8445 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8447 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8446 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8449 - [DIFFICULTY_NORMAL][TRAINER_CARLEE] = - { -#line 8450 - .trainerName = _("CARLEE"), -#line 8451 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8452 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8453 -F_TRAINER_FEMALE | -#line 8454 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8455 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8456 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8458 - .species = SPECIES_SEAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8460 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8459 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8462 - [DIFFICULTY_NORMAL][TRAINER_JENNY_2] = - { -#line 8463 - .trainerName = _("JENNY"), -#line 8464 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8465 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8466 -F_TRAINER_FEMALE | -#line 8467 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8468 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8469 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8471 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8473 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8472 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8475 - [DIFFICULTY_NORMAL][TRAINER_JENNY_3] = - { -#line 8476 - .trainerName = _("JENNY"), -#line 8477 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8478 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8479 -F_TRAINER_FEMALE | -#line 8480 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8481 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8482 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8484 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8486 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8485 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8488 - [DIFFICULTY_NORMAL][TRAINER_JENNY_4] = - { -#line 8489 - .trainerName = _("JENNY"), -#line 8490 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8491 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8492 -F_TRAINER_FEMALE | -#line 8493 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8494 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8495 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8497 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8499 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8498 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8501 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8503 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8502 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8505 - [DIFFICULTY_NORMAL][TRAINER_JENNY_5] = - { -#line 8506 - .trainerName = _("JENNY"), -#line 8507 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8508 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8509 -F_TRAINER_FEMALE | -#line 8510 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8511 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8512 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 8514 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8516 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8515 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8518 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8520 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8519 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8522 - .species = SPECIES_STARMIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8524 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8523 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8526 - [DIFFICULTY_NORMAL][TRAINER_HEIDI] = - { -#line 8527 - .trainerName = _("HEIDI"), -#line 8528 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8529 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 8530 -F_TRAINER_FEMALE | -#line 8531 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8532 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8533 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8535 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8537 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8536 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8538 - MOVE_DIG, - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - MOVE_SLASH, - }, - }, - { -#line 8543 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8545 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8544 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8546 - MOVE_RAPID_SPIN, - MOVE_MUD_SLAP, - MOVE_PSYBEAM, - MOVE_ROCK_TOMB, - }, - }, - }, - }, -#line 8551 - [DIFFICULTY_NORMAL][TRAINER_BECKY] = - { -#line 8552 - .trainerName = _("BECKY"), -#line 8553 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8554 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 8555 -F_TRAINER_FEMALE | -#line 8556 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8557 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8558 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8560 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8562 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8561 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8563 - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - MOVE_SLASH, - MOVE_DIG, - }, - }, - { -#line 8568 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8570 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8569 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8571 - MOVE_ROLLOUT, - MOVE_BUBBLE_BEAM, - MOVE_TAIL_WHIP, - MOVE_DEFENSE_CURL, - }, - }, - }, - }, -#line 8576 - [DIFFICULTY_NORMAL][TRAINER_CAROL] = - { -#line 8577 - .trainerName = _("CAROL"), -#line 8578 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8579 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 8580 -F_TRAINER_FEMALE | -#line 8581 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8582 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8583 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8585 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8587 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8586 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8589 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8591 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8590 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8593 - [DIFFICULTY_NORMAL][TRAINER_NANCY] = - { -#line 8594 - .trainerName = _("NANCY"), -#line 8595 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8596 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 8597 -F_TRAINER_FEMALE | -#line 8598 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8599 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8600 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8602 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8604 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8603 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8606 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8608 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8607 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8610 - [DIFFICULTY_NORMAL][TRAINER_MARTHA] = - { -#line 8611 - .trainerName = _("MARTHA"), -#line 8612 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8613 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 8614 -F_TRAINER_FEMALE | -#line 8615 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8616 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8617 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8619 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8621 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8620 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8623 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8625 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8624 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8627 - [DIFFICULTY_NORMAL][TRAINER_DIANA_1] = - { -#line 8628 - .trainerName = _("DIANA"), -#line 8629 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8630 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 8631 -F_TRAINER_FEMALE | -#line 8632 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8633 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8634 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 8636 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8638 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8637 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8640 - .species = SPECIES_ODDISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8642 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8641 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8644 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8646 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8645 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8648 - [DIFFICULTY_NORMAL][TRAINER_CEDRIC] = - { -#line 8649 - .trainerName = _("CEDRIC"), -#line 8650 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 8651 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 8653 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 8654 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8655 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8657 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8659 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8658 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8660 - MOVE_DESTINY_BOND, - MOVE_SAFEGUARD, - MOVE_COUNTER, - MOVE_MIRROR_COAT, - }, - }, - }, - }, -#line 8665 - [DIFFICULTY_NORMAL][TRAINER_IRENE] = - { -#line 8666 - .trainerName = _("IRENE"), -#line 8667 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8668 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 8669 -F_TRAINER_FEMALE | -#line 8670 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8671 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8672 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8674 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8676 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8675 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8678 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8680 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8679 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8682 - [DIFFICULTY_NORMAL][TRAINER_DIANA_2] = - { -#line 8683 - .trainerName = _("DIANA"), -#line 8684 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8685 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 8686 -F_TRAINER_FEMALE | -#line 8687 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8688 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8689 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 8691 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8693 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8692 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8695 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8697 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8696 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8699 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8701 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8700 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8703 - [DIFFICULTY_NORMAL][TRAINER_DIANA_3] = - { -#line 8704 - .trainerName = _("DIANA"), -#line 8705 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8706 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 8707 -F_TRAINER_FEMALE | -#line 8708 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8709 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8710 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 8712 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8714 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 8713 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8716 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8718 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 8717 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8720 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8722 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 8721 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8724 - [DIFFICULTY_NORMAL][TRAINER_DIANA_4] = - { -#line 8725 - .trainerName = _("DIANA"), -#line 8726 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8727 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 8728 -F_TRAINER_FEMALE | -#line 8729 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8730 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8731 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 8733 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8735 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 8734 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8737 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8739 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 8738 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8741 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8743 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 8742 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8745 - [DIFFICULTY_NORMAL][TRAINER_DIANA_5] = - { -#line 8746 - .trainerName = _("DIANA"), -#line 8747 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8748 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 8749 -F_TRAINER_FEMALE | -#line 8750 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8751 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8752 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 8754 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8756 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 8755 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8758 - .species = SPECIES_VILEPLUME, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8760 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 8759 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8762 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8764 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 8763 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8766 - [DIFFICULTY_NORMAL][TRAINER_AMY_AND_LIV_1] = - { -#line 8767 - .trainerName = _("AMY & LIV"), -#line 8768 - .trainerClass = TRAINER_CLASS_TWINS, -#line 8769 - .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = -#line 8771 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8772 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 8773 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8775 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8777 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8776 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8779 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8781 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8780 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8783 - [DIFFICULTY_NORMAL][TRAINER_AMY_AND_LIV_2] = - { -#line 8784 - .trainerName = _("AMY & LIV"), -#line 8785 - .trainerClass = TRAINER_CLASS_TWINS, -#line 8786 - .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = -#line 8788 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8789 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 8790 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8792 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8794 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8793 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8796 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8798 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8797 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8800 - [DIFFICULTY_NORMAL][TRAINER_GINA_AND_MIA_1] = - { -#line 8801 - .trainerName = _("GINA & MIA"), -#line 8802 - .trainerClass = TRAINER_CLASS_TWINS, -#line 8803 - .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = -#line 8805 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8806 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 8807 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8809 - .species = SPECIES_SEEDOT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8811 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8810 - .lvl = 6, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8813 - .species = SPECIES_LOTAD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8815 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8814 - .lvl = 6, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8817 - [DIFFICULTY_NORMAL][TRAINER_MIU_AND_YUKI] = - { -#line 8818 - .trainerName = _("MIU & YUKI"), -#line 8819 - .trainerClass = TRAINER_CLASS_TWINS, -#line 8820 - .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = -#line 8822 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8823 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 8824 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8826 - .species = SPECIES_BEAUTIFLY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8828 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8827 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8830 - .species = SPECIES_DUSTOX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8832 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8831 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8834 - [DIFFICULTY_NORMAL][TRAINER_AMY_AND_LIV_3] = - { -#line 8835 - .trainerName = _("AMY & LIV"), -#line 8836 - .trainerClass = TRAINER_CLASS_TWINS, -#line 8837 - .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = -#line 8839 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8840 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 8841 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8843 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8845 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8844 - .lvl = 9, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8847 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8849 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8848 - .lvl = 9, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8851 - [DIFFICULTY_NORMAL][TRAINER_GINA_AND_MIA_2] = - { -#line 8852 - .trainerName = _("GINA & MIA"), -#line 8853 - .trainerClass = TRAINER_CLASS_TWINS, -#line 8854 - .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = -#line 8856 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8857 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 8858 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8860 - .species = SPECIES_DUSKULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8862 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8861 - .lvl = 10, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8863 - MOVE_NIGHT_SHADE, - MOVE_DISABLE, - }, - }, - { -#line 8866 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8868 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8867 - .lvl = 10, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8869 - MOVE_ABSORB, - MOVE_LEECH_SEED, - }, - }, - }, - }, -#line 8872 - [DIFFICULTY_NORMAL][TRAINER_AMY_AND_LIV_4] = - { -#line 8873 - .trainerName = _("AMY & LIV"), -#line 8874 - .trainerClass = TRAINER_CLASS_TWINS, -#line 8875 - .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = -#line 8877 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8878 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 8879 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8881 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8883 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 8882 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8885 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8887 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 8886 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8889 - [DIFFICULTY_NORMAL][TRAINER_AMY_AND_LIV_5] = - { -#line 8890 - .trainerName = _("AMY & LIV"), -#line 8891 - .trainerClass = TRAINER_CLASS_TWINS, -#line 8892 - .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = -#line 8894 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8895 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 8896 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8898 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8900 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 8899 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8901 - MOVE_SPARK, - MOVE_CHARGE, - MOVE_FAKE_TEARS, - MOVE_HELPING_HAND, - }, - }, - { -#line 8906 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8908 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 8907 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8909 - MOVE_SPARK, - MOVE_CHARGE, - MOVE_CHARM, - MOVE_HELPING_HAND, - }, - }, - }, - }, -#line 8914 - [DIFFICULTY_NORMAL][TRAINER_AMY_AND_LIV_6] = - { -#line 8915 - .trainerName = _("AMY & LIV"), -#line 8916 - .trainerClass = TRAINER_CLASS_TWINS, -#line 8917 - .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = -#line 8919 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8920 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 8921 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8923 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8925 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 8924 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8926 - MOVE_THUNDER, - MOVE_CHARGE, - MOVE_FAKE_TEARS, - MOVE_HELPING_HAND, - }, - }, - { -#line 8931 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8933 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 8932 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8934 - MOVE_THUNDER, - MOVE_CHARGE, - MOVE_CHARM, - MOVE_HELPING_HAND, - }, - }, - }, - }, -#line 8939 - [DIFFICULTY_NORMAL][TRAINER_HUEY] = - { -#line 8940 - .trainerName = _("HUEY"), -#line 8941 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 8942 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 8944 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 8945 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8946 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8948 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8950 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8949 - .lvl = 12, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8952 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8954 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8953 - .lvl = 12, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8956 - [DIFFICULTY_NORMAL][TRAINER_EDMOND] = - { -#line 8957 - .trainerName = _("EDMOND"), -#line 8958 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 8959 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 8961 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 8962 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8963 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8965 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8967 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8966 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8969 - [DIFFICULTY_NORMAL][TRAINER_ERNEST_1] = - { -#line 8970 - .trainerName = _("ERNEST"), -#line 8971 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 8972 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 8974 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 8975 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8976 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8978 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8980 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8979 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8982 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8984 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8983 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8986 - [DIFFICULTY_NORMAL][TRAINER_DWAYNE] = - { -#line 8987 - .trainerName = _("DWAYNE"), -#line 8988 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 8989 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 8991 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 8992 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8993 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 8995 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8997 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8996 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8999 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9001 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9000 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9003 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9005 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9004 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9007 - [DIFFICULTY_NORMAL][TRAINER_PHILLIP] = - { -#line 9008 - .trainerName = _("PHILLIP"), -#line 9009 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 9010 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 9012 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9013 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9014 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9016 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9018 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9017 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9020 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9022 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9021 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9024 - [DIFFICULTY_NORMAL][TRAINER_LEONARD] = - { -#line 9025 - .trainerName = _("LEONARD"), -#line 9026 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 9027 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 9029 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9030 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9031 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9033 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9035 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9034 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9037 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9039 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9038 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9041 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9043 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9042 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9045 - [DIFFICULTY_NORMAL][TRAINER_DUNCAN] = - { -#line 9046 - .trainerName = _("DUNCAN"), -#line 9047 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 9048 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 9050 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9051 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9052 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9054 - .species = SPECIES_SPHEAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9056 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9055 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9058 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9060 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9059 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9062 - [DIFFICULTY_NORMAL][TRAINER_ERNEST_2] = - { -#line 9063 - .trainerName = _("ERNEST"), -#line 9064 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 9065 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 9067 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9068 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9069 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9071 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9073 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9072 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9075 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9077 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9076 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9079 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9081 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9080 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9083 - [DIFFICULTY_NORMAL][TRAINER_ERNEST_3] = - { -#line 9084 - .trainerName = _("ERNEST"), -#line 9085 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 9086 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 9088 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9089 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9090 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9092 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9094 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9093 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9096 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9098 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9097 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9100 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9102 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9101 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9104 - [DIFFICULTY_NORMAL][TRAINER_ERNEST_4] = - { -#line 9105 - .trainerName = _("ERNEST"), -#line 9106 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 9107 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 9109 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9110 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9111 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9113 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9115 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9114 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9117 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9119 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9118 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9121 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9123 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9122 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9125 - [DIFFICULTY_NORMAL][TRAINER_ERNEST_5] = - { -#line 9126 - .trainerName = _("ERNEST"), -#line 9127 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 9128 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 9130 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9131 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9132 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9134 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9136 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 9135 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9138 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9140 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 9139 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9142 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9144 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 9143 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9146 - [DIFFICULTY_NORMAL][TRAINER_ELI] = - { -#line 9147 - .trainerName = _("ELI"), -#line 9148 - .trainerClass = TRAINER_CLASS_HIKER, -#line 9149 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 9151 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 9152 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9153 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9155 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9157 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9156 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9159 - [DIFFICULTY_NORMAL][TRAINER_ANNIKA] = - { -#line 9160 - .trainerName = _("ANNIKA"), -#line 9161 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 9162 - .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = -#line 9163 -F_TRAINER_FEMALE | -#line 9164 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 9165 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9166 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9168 - .species = SPECIES_FEEBAS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9168 - .heldItem = ITEM_ORAN_BERRY, -#line 9170 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9169 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9171 - MOVE_FLAIL, - MOVE_WATER_PULSE, - MOVE_RETURN, - MOVE_ATTRACT, - }, - }, - { -#line 9176 - .species = SPECIES_FEEBAS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9176 - .heldItem = ITEM_ORAN_BERRY, -#line 9178 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9177 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9179 - MOVE_FLAIL, - MOVE_WATER_PULSE, - MOVE_RETURN, - MOVE_ATTRACT, - }, - }, - }, - }, -#line 9184 - [DIFFICULTY_NORMAL][TRAINER_JAZMYN] = - { -#line 9185 - .trainerName = _("JAZMYN"), -#line 9186 - .trainerClass = TRAINER_CLASS_COOLTRAINER_2, -#line 9187 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 9188 -F_TRAINER_FEMALE | -#line 9189 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 9190 - .items = { ITEM_HYPER_POTION }, -#line 9191 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9192 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9194 - .species = SPECIES_ABSOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9196 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9195 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9198 - [DIFFICULTY_NORMAL][TRAINER_JONAS] = - { -#line 9199 - .trainerName = _("JONAS"), -#line 9200 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 9201 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 9203 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 9204 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9205 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9207 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9209 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9208 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9210 - MOVE_TOXIC, - MOVE_THUNDER, - MOVE_SELF_DESTRUCT, - MOVE_SLUDGE_BOMB, - }, - }, - }, - }, -#line 9215 - [DIFFICULTY_NORMAL][TRAINER_KAYLEY] = - { -#line 9216 - .trainerName = _("KAYLEY"), -#line 9217 - .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 9218 - .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = -#line 9219 -F_TRAINER_FEMALE | -#line 9220 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9221 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9222 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9224 - .species = SPECIES_CASTFORM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9226 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9225 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9227 - MOVE_SUNNY_DAY, - MOVE_WEATHER_BALL, - MOVE_FLAMETHROWER, - MOVE_SOLAR_BEAM, - }, - }, - }, - }, -#line 9232 - [DIFFICULTY_NORMAL][TRAINER_AURON] = - { -#line 9233 - .trainerName = _("AURON"), -#line 9234 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 9235 - .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = -#line 9237 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 9238 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9239 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9241 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9243 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9242 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9245 - .species = SPECIES_MACHAMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9247 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9246 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9249 - [DIFFICULTY_NORMAL][TRAINER_KELVIN] = - { -#line 9250 - .trainerName = _("KELVIN"), -#line 9251 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 9252 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 9254 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9255 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9256 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9258 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9260 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9259 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9262 - .species = SPECIES_SPHEAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9264 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9263 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9266 - [DIFFICULTY_NORMAL][TRAINER_MARLEY] = - { -#line 9267 - .trainerName = _("MARLEY"), -#line 9268 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 9269 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 9270 -F_TRAINER_FEMALE | -#line 9271 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 9272 - .items = { ITEM_HYPER_POTION }, -#line 9273 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9274 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9276 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9278 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 9277 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9279 - MOVE_BITE, - MOVE_ROAR, - MOVE_THUNDER_WAVE, - MOVE_THUNDERBOLT, - }, - }, - }, - }, -#line 9284 - [DIFFICULTY_NORMAL][TRAINER_REYNA] = - { -#line 9285 - .trainerName = _("REYNA"), -#line 9286 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 9287 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 9288 -F_TRAINER_FEMALE | -#line 9289 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 9290 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9291 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9293 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9295 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9294 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9297 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9299 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 9298 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9301 - [DIFFICULTY_NORMAL][TRAINER_HUDSON] = - { -#line 9302 - .trainerName = _("HUDSON"), -#line 9303 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 9304 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 9306 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9307 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9308 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9310 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9312 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9311 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9314 - [DIFFICULTY_NORMAL][TRAINER_CONOR] = - { -#line 9315 - .trainerName = _("CONOR"), -#line 9316 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 9317 - .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = -#line 9319 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 9320 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9321 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9323 - .species = SPECIES_CHINCHOU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9325 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9324 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9327 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9329 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 9328 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9331 - [DIFFICULTY_NORMAL][TRAINER_EDWIN_1] = - { -#line 9332 - .trainerName = _("EDWIN"), -#line 9333 - .trainerClass = TRAINER_CLASS_COLLECTOR, -#line 9334 - .trainerPic = TRAINER_PIC_COLLECTOR, - .encounterMusic_gender = -#line 9336 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 9337 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9338 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9340 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9342 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9341 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9344 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9346 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9345 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9348 - [DIFFICULTY_NORMAL][TRAINER_HECTOR] = - { -#line 9349 - .trainerName = _("HECTOR"), -#line 9350 - .trainerClass = TRAINER_CLASS_COLLECTOR, -#line 9351 - .trainerPic = TRAINER_PIC_COLLECTOR, - .encounterMusic_gender = -#line 9353 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 9354 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9355 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9357 - .species = SPECIES_ZANGOOSE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9359 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9358 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9361 - .species = SPECIES_SEVIPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9363 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9362 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9365 - [DIFFICULTY_NORMAL][TRAINER_TABITHA_MOSSDEEP] = - { -#line 9366 - .trainerName = _("TABITHA"), -#line 9367 - .trainerClass = TRAINER_CLASS_MAGMA_ADMIN, -#line 9368 - .trainerPic = TRAINER_PIC_MAGMA_ADMIN, - .encounterMusic_gender = -#line 9370 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 9371 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9372 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9374 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9376 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9375 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9378 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9380 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9379 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9382 - .species = SPECIES_GOLBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9384 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9383 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9386 - [DIFFICULTY_NORMAL][TRAINER_EDWIN_2] = - { -#line 9387 - .trainerName = _("EDWIN"), -#line 9388 - .trainerClass = TRAINER_CLASS_COLLECTOR, -#line 9389 - .trainerPic = TRAINER_PIC_COLLECTOR, - .encounterMusic_gender = -#line 9391 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 9392 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9393 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9395 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9397 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9396 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9399 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9401 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9400 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9403 - [DIFFICULTY_NORMAL][TRAINER_EDWIN_3] = - { -#line 9404 - .trainerName = _("EDWIN"), -#line 9405 - .trainerClass = TRAINER_CLASS_COLLECTOR, -#line 9406 - .trainerPic = TRAINER_PIC_COLLECTOR, - .encounterMusic_gender = -#line 9408 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 9409 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9410 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9412 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9414 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9413 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9416 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9418 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9417 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9420 - [DIFFICULTY_NORMAL][TRAINER_EDWIN_4] = - { -#line 9421 - .trainerName = _("EDWIN"), -#line 9422 - .trainerClass = TRAINER_CLASS_COLLECTOR, -#line 9423 - .trainerPic = TRAINER_PIC_COLLECTOR, - .encounterMusic_gender = -#line 9425 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 9426 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9427 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9429 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9431 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9430 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9433 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9435 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9434 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9437 - [DIFFICULTY_NORMAL][TRAINER_EDWIN_5] = - { -#line 9438 - .trainerName = _("EDWIN"), -#line 9439 - .trainerClass = TRAINER_CLASS_COLLECTOR, -#line 9440 - .trainerPic = TRAINER_PIC_COLLECTOR, - .encounterMusic_gender = -#line 9442 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 9443 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9444 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9446 - .species = SPECIES_LUDICOLO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9448 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9447 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9450 - .species = SPECIES_SHIFTRY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9452 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9451 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9454 - [DIFFICULTY_NORMAL][TRAINER_WALLY_VR_1] = - { -#line 9455 - .trainerName = _("WALLY"), -#line 9456 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9457 - .trainerPic = TRAINER_PIC_WALLY, - .encounterMusic_gender = -#line 9459 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9460 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 9461 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9462 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 9464 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9466 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9465 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9467 - MOVE_AERIAL_ACE, - MOVE_SAFEGUARD, - MOVE_DRAGON_BREATH, - MOVE_DRAGON_DANCE, - }, - }, - { -#line 9472 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9474 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9473 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9475 - MOVE_SING, - MOVE_ASSIST, - MOVE_CHARM, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 9480 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9482 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9481 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9483 - MOVE_MAGICAL_LEAF, - MOVE_LEECH_SEED, - MOVE_GIGA_DRAIN, - MOVE_TOXIC, - }, - }, - { -#line 9488 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9490 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9489 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9491 - MOVE_SUPERSONIC, - MOVE_THUNDERBOLT, - MOVE_TRI_ATTACK, - MOVE_SCREECH, - }, - }, - { -#line 9496 - .species = SPECIES_GARDEVOIR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9498 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 9497 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9499 - MOVE_DOUBLE_TEAM, - MOVE_CALM_MIND, - MOVE_PSYCHIC, - MOVE_FUTURE_SIGHT, - }, - }, - }, - }, -#line 9504 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_103_MUDKIP] = - { -#line 9505 - .trainerName = _("BRENDAN"), -#line 9506 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9507 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 9509 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9510 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9511 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9513 - .species = SPECIES_TREECKO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9515 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9514 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9517 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_110_MUDKIP] = - { -#line 9518 - .trainerName = _("BRENDAN"), -#line 9519 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9520 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 9522 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9523 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9524 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9526 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9528 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9527 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9530 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9532 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9531 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9534 - .species = SPECIES_GROVYLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9536 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9535 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9538 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_119_MUDKIP] = - { -#line 9539 - .trainerName = _("BRENDAN"), -#line 9540 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9541 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 9543 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9544 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9545 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9547 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9549 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9548 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9551 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9553 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9552 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9555 - .species = SPECIES_GROVYLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9557 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9556 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9559 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_103_TREECKO] = - { -#line 9560 - .trainerName = _("BRENDAN"), -#line 9561 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9562 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 9564 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9565 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9566 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9568 - .species = SPECIES_TORCHIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9570 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9569 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9572 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_110_TREECKO] = - { -#line 9573 - .trainerName = _("BRENDAN"), -#line 9574 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9575 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 9577 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9578 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9579 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9581 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9583 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9582 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9585 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9587 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9586 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9589 - .species = SPECIES_COMBUSKEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9591 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9590 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9593 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_119_TREECKO] = - { -#line 9594 - .trainerName = _("BRENDAN"), -#line 9595 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9596 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 9598 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9599 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9600 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9602 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9604 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9603 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9606 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9608 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9607 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9610 - .species = SPECIES_COMBUSKEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9612 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9611 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9614 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_103_TORCHIC] = - { -#line 9615 - .trainerName = _("BRENDAN"), -#line 9616 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9617 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 9619 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9620 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9621 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9623 - .species = SPECIES_MUDKIP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9625 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9624 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9627 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_110_TORCHIC] = - { -#line 9628 - .trainerName = _("BRENDAN"), -#line 9629 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9630 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 9632 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9633 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9634 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9636 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9638 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9637 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9640 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9642 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9641 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9644 - .species = SPECIES_MARSHTOMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9646 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9645 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9648 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_119_TORCHIC] = - { -#line 9649 - .trainerName = _("BRENDAN"), -#line 9650 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9651 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 9653 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9654 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9655 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9657 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9659 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9658 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9661 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9663 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9662 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9665 - .species = SPECIES_MARSHTOMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9667 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9666 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9669 - [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_103_MUDKIP] = - { -#line 9670 - .trainerName = _("MAY"), -#line 9671 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9672 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 9673 -F_TRAINER_FEMALE | -#line 9674 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9675 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9676 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9678 - .species = SPECIES_TREECKO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9680 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9679 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9682 - [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_110_MUDKIP] = - { -#line 9683 - .trainerName = _("MAY"), -#line 9684 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9685 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 9686 -F_TRAINER_FEMALE | -#line 9687 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9688 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9689 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9691 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9693 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9692 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9695 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9697 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9696 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9699 - .species = SPECIES_GROVYLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9701 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9700 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9703 - [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_119_MUDKIP] = - { -#line 9704 - .trainerName = _("MAY"), -#line 9705 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9706 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 9707 -F_TRAINER_FEMALE | -#line 9708 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9709 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9710 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9712 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9714 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9713 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9716 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9718 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9717 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9720 - .species = SPECIES_GROVYLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9722 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9721 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9724 - [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_103_TREECKO] = - { -#line 9725 - .trainerName = _("MAY"), -#line 9726 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9727 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 9728 -F_TRAINER_FEMALE | -#line 9729 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9730 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9731 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9733 - .species = SPECIES_TORCHIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9735 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9734 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9737 - [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_110_TREECKO] = - { -#line 9738 - .trainerName = _("MAY"), -#line 9739 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9740 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 9741 -F_TRAINER_FEMALE | -#line 9742 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9743 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9744 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9746 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9748 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9747 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9750 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9752 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9751 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9754 - .species = SPECIES_COMBUSKEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9756 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9755 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9758 - [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_119_TREECKO] = - { -#line 9759 - .trainerName = _("MAY"), -#line 9760 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9761 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 9762 -F_TRAINER_FEMALE | -#line 9763 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9764 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9765 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9767 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9769 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9768 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9771 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9773 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9772 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9775 - .species = SPECIES_COMBUSKEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9777 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9776 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9779 - [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_103_TORCHIC] = - { -#line 9780 - .trainerName = _("MAY"), -#line 9781 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9782 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 9783 -F_TRAINER_FEMALE | -#line 9784 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9785 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9786 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9788 - .species = SPECIES_MUDKIP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9790 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9789 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9792 - [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_110_TORCHIC] = - { -#line 9793 - .trainerName = _("MAY"), -#line 9794 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9795 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 9796 -F_TRAINER_FEMALE | -#line 9797 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9798 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9799 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9801 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9803 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9802 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9805 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9807 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9806 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9809 - .species = SPECIES_MARSHTOMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9811 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9810 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9813 - [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_119_TORCHIC] = - { -#line 9814 - .trainerName = _("MAY"), -#line 9815 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9816 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 9817 -F_TRAINER_FEMALE | -#line 9818 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9819 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9820 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9822 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9824 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9823 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9826 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9828 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9827 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9830 - .species = SPECIES_MARSHTOMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9832 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9831 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9834 - [DIFFICULTY_NORMAL][TRAINER_ISAAC_1] = - { -#line 9835 - .trainerName = _("ISAAC"), -#line 9836 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 9837 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, - .encounterMusic_gender = -#line 9839 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9840 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9841 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 9843 - .species = SPECIES_WHISMUR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9845 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9844 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9847 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9849 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9848 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9851 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9853 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9852 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9855 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9857 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9856 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9859 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9861 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9860 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9863 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9865 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9864 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9867 - [DIFFICULTY_NORMAL][TRAINER_DAVIS] = - { -#line 9868 - .trainerName = _("DAVIS"), -#line 9869 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 9870 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 9872 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9873 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9874 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9876 - .species = SPECIES_PINSIR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9878 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9877 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9880 - [DIFFICULTY_NORMAL][TRAINER_MITCHELL] = - { -#line 9881 - .trainerName = _("MITCHELL"), -#line 9882 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 9883 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 9885 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 9886 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9887 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9889 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9891 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9890 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9892 - MOVE_EXPLOSION, - MOVE_REFLECT, - MOVE_LIGHT_SCREEN, - MOVE_PSYCHIC, - }, - }, - { -#line 9897 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9899 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9898 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9900 - MOVE_EXPLOSION, - MOVE_REFLECT, - MOVE_LIGHT_SCREEN, - MOVE_SHADOW_BALL, - }, - }, - }, - }, -#line 9905 - [DIFFICULTY_NORMAL][TRAINER_ISAAC_2] = - { -#line 9906 - .trainerName = _("ISAAC"), -#line 9907 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 9908 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, - .encounterMusic_gender = -#line 9910 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9911 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9912 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 9914 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9916 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9915 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9918 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9920 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9919 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9922 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9924 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9923 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9926 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9928 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9927 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9930 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9932 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9931 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9934 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9936 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9935 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9938 - [DIFFICULTY_NORMAL][TRAINER_ISAAC_3] = - { -#line 9939 - .trainerName = _("ISAAC"), -#line 9940 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 9941 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, - .encounterMusic_gender = -#line 9943 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9944 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9945 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 9947 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9949 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9948 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9951 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9953 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9952 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9955 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9957 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9956 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9959 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9961 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9960 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9963 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9965 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9964 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9967 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9969 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9968 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9971 - [DIFFICULTY_NORMAL][TRAINER_ISAAC_4] = - { -#line 9972 - .trainerName = _("ISAAC"), -#line 9973 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 9974 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, - .encounterMusic_gender = -#line 9976 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9977 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9978 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 9980 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9982 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9981 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9984 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9986 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9985 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9988 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9990 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9989 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9992 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9994 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9993 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9996 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9998 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9997 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10000 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10002 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10001 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10004 - [DIFFICULTY_NORMAL][TRAINER_ISAAC_5] = - { -#line 10005 - .trainerName = _("ISAAC"), -#line 10006 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 10007 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, - .encounterMusic_gender = -#line 10009 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 10010 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10011 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 10013 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10015 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10014 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10017 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10019 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10018 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10021 - .species = SPECIES_LAIRON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10023 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10022 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10025 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10027 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10026 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10029 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10031 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10030 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10033 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10035 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10034 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10037 - [DIFFICULTY_NORMAL][TRAINER_LYDIA_1] = - { -#line 10038 - .trainerName = _("LYDIA"), -#line 10039 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 10040 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 10041 -F_TRAINER_FEMALE | -#line 10042 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 10043 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10044 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 10046 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10048 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10047 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10050 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10052 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10051 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10054 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10056 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10055 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10058 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10060 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10059 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10062 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10064 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10063 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10066 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10068 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10067 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10070 - [DIFFICULTY_NORMAL][TRAINER_HALLE] = - { -#line 10071 - .trainerName = _("HALLE"), -#line 10072 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 10073 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 10074 -F_TRAINER_FEMALE | -#line 10075 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10076 - .items = { ITEM_FULL_RESTORE }, -#line 10077 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10078 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10080 - .species = SPECIES_SABLEYE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10082 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10081 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10084 - .species = SPECIES_ABSOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10086 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10085 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10088 - [DIFFICULTY_NORMAL][TRAINER_GARRISON] = - { -#line 10089 - .trainerName = _("GARRISON"), -#line 10090 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 10091 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 10093 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 10094 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10095 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10097 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10099 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10098 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10101 - [DIFFICULTY_NORMAL][TRAINER_LYDIA_2] = - { -#line 10102 - .trainerName = _("LYDIA"), -#line 10103 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 10104 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 10105 -F_TRAINER_FEMALE | -#line 10106 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 10107 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10108 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 10110 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10112 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 10111 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10114 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10116 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 10115 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10118 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10120 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 10119 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10122 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10124 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 10123 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10126 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10128 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 10127 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10130 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10132 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 10131 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10134 - [DIFFICULTY_NORMAL][TRAINER_LYDIA_3] = - { -#line 10135 - .trainerName = _("LYDIA"), -#line 10136 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 10137 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 10138 -F_TRAINER_FEMALE | -#line 10139 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 10140 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10141 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 10143 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10145 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 10144 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10147 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10149 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 10148 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10151 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10153 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 10152 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10155 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10157 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 10156 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10159 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10161 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 10160 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10163 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10165 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 10164 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10167 - [DIFFICULTY_NORMAL][TRAINER_LYDIA_4] = - { -#line 10168 - .trainerName = _("LYDIA"), -#line 10169 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 10170 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 10171 -F_TRAINER_FEMALE | -#line 10172 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 10173 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10174 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 10176 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10178 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10177 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10180 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10182 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10181 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10184 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10186 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10185 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10188 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10190 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10189 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10192 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10194 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10193 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10196 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10198 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10197 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10200 - [DIFFICULTY_NORMAL][TRAINER_LYDIA_5] = - { -#line 10201 - .trainerName = _("LYDIA"), -#line 10202 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 10203 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 10204 -F_TRAINER_FEMALE | -#line 10205 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 10206 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10207 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 10209 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10211 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10210 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10213 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10215 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10214 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10217 - .species = SPECIES_AZUMARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10219 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10218 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10221 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10223 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10222 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10225 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10227 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10226 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10229 - .species = SPECIES_SEAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10231 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10230 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10233 - [DIFFICULTY_NORMAL][TRAINER_JACKSON_1] = - { -#line 10234 - .trainerName = _("JACKSON"), -#line 10235 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10236 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = -#line 10238 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10239 - .items = { ITEM_FULL_RESTORE }, -#line 10240 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10241 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10243 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10245 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10244 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10247 - [DIFFICULTY_NORMAL][TRAINER_LORENZO] = - { -#line 10248 - .trainerName = _("LORENZO"), -#line 10249 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10250 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = -#line 10252 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10253 - .items = { ITEM_FULL_RESTORE }, -#line 10254 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10255 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 10257 - .species = SPECIES_SEEDOT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10259 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10258 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10261 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10263 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10262 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10265 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10267 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10266 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10269 - [DIFFICULTY_NORMAL][TRAINER_SEBASTIAN] = - { -#line 10270 - .trainerName = _("SEBASTIAN"), -#line 10271 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10272 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = -#line 10274 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10275 - .items = { ITEM_FULL_RESTORE }, -#line 10276 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10277 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10279 - .species = SPECIES_CACTURNE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10281 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10280 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10283 - [DIFFICULTY_NORMAL][TRAINER_JACKSON_2] = - { -#line 10284 - .trainerName = _("JACKSON"), -#line 10285 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10286 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = -#line 10288 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10289 - .items = { ITEM_FULL_RESTORE }, -#line 10290 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10291 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10293 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10295 - .iv = TRAINER_PARTY_IVS(7, 7, 7, 7, 7, 7), -#line 10294 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10297 - [DIFFICULTY_NORMAL][TRAINER_JACKSON_3] = - { -#line 10298 - .trainerName = _("JACKSON"), -#line 10299 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10300 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = -#line 10302 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10303 - .items = { ITEM_FULL_RESTORE }, -#line 10304 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10305 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10307 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10309 - .iv = TRAINER_PARTY_IVS(8, 8, 8, 8, 8, 8), -#line 10308 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10311 - [DIFFICULTY_NORMAL][TRAINER_JACKSON_4] = - { -#line 10312 - .trainerName = _("JACKSON"), -#line 10313 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10314 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = -#line 10316 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10317 - .items = { ITEM_FULL_RESTORE }, -#line 10318 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10319 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10321 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10323 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 10322 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10325 - [DIFFICULTY_NORMAL][TRAINER_JACKSON_5] = - { -#line 10326 - .trainerName = _("JACKSON"), -#line 10327 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10328 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = -#line 10330 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10331 - .items = { ITEM_FULL_RESTORE }, -#line 10332 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10333 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10335 - .species = SPECIES_KECLEON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10337 - .iv = TRAINER_PARTY_IVS(10, 10, 10, 10, 10, 10), -#line 10336 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10339 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10341 - .iv = TRAINER_PARTY_IVS(10, 10, 10, 10, 10, 10), -#line 10340 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10343 - [DIFFICULTY_NORMAL][TRAINER_CATHERINE_1] = - { -#line 10344 - .trainerName = _("CATHERINE"), -#line 10345 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10346 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = -#line 10347 -F_TRAINER_FEMALE | -#line 10348 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10349 - .items = { ITEM_FULL_RESTORE }, -#line 10350 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10351 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10353 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10355 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10354 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10357 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10359 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10358 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10361 - [DIFFICULTY_NORMAL][TRAINER_JENNA] = - { -#line 10362 - .trainerName = _("JENNA"), -#line 10363 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10364 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = -#line 10365 -F_TRAINER_FEMALE | -#line 10366 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10367 - .items = { ITEM_FULL_RESTORE }, -#line 10368 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10369 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 10371 - .species = SPECIES_LOTAD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10373 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10372 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10375 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10377 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10376 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10379 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10381 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10380 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10383 - [DIFFICULTY_NORMAL][TRAINER_SOPHIA] = - { -#line 10384 - .trainerName = _("SOPHIA"), -#line 10385 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10386 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = -#line 10387 -F_TRAINER_FEMALE | -#line 10388 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10389 - .items = { ITEM_FULL_RESTORE }, -#line 10390 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10391 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10393 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10395 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10394 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10397 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10399 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10398 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10401 - [DIFFICULTY_NORMAL][TRAINER_CATHERINE_2] = - { -#line 10402 - .trainerName = _("CATHERINE"), -#line 10403 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10404 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = -#line 10405 -F_TRAINER_FEMALE | -#line 10406 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10407 - .items = { ITEM_FULL_RESTORE }, -#line 10408 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10409 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10411 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10413 - .iv = TRAINER_PARTY_IVS(7, 7, 7, 7, 7, 7), -#line 10412 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10415 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10417 - .iv = TRAINER_PARTY_IVS(7, 7, 7, 7, 7, 7), -#line 10416 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10419 - [DIFFICULTY_NORMAL][TRAINER_CATHERINE_3] = - { -#line 10420 - .trainerName = _("CATHERINE"), -#line 10421 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10422 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = -#line 10423 -F_TRAINER_FEMALE | -#line 10424 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10425 - .items = { ITEM_FULL_RESTORE }, -#line 10426 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10427 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10429 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10431 - .iv = TRAINER_PARTY_IVS(8, 8, 8, 8, 8, 8), -#line 10430 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10433 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10435 - .iv = TRAINER_PARTY_IVS(8, 8, 8, 8, 8, 8), -#line 10434 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10437 - [DIFFICULTY_NORMAL][TRAINER_CATHERINE_4] = - { -#line 10438 - .trainerName = _("CATHERINE"), -#line 10439 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10440 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = -#line 10441 -F_TRAINER_FEMALE | -#line 10442 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10443 - .items = { ITEM_FULL_RESTORE }, -#line 10444 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10445 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10447 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10449 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 10448 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10451 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10453 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 10452 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10455 - [DIFFICULTY_NORMAL][TRAINER_CATHERINE_5] = - { -#line 10456 - .trainerName = _("CATHERINE"), -#line 10457 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10458 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = -#line 10459 -F_TRAINER_FEMALE | -#line 10460 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10461 - .items = { ITEM_FULL_RESTORE }, -#line 10462 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10463 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10465 - .species = SPECIES_BELLOSSOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10467 - .iv = TRAINER_PARTY_IVS(10, 10, 10, 10, 10, 10), -#line 10466 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10469 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10471 - .iv = TRAINER_PARTY_IVS(10, 10, 10, 10, 10, 10), -#line 10470 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10473 - [DIFFICULTY_NORMAL][TRAINER_JULIO] = - { -#line 10474 - .trainerName = _("JULIO"), -#line 10475 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 10476 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = -#line 10478 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 10479 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10480 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10482 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10484 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10483 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10486 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SEAFLOOR_CAVERN_5] = - { -#line 10487 - .trainerName = _("GRUNT"), -#line 10488 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 10489 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 10491 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 10492 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10493 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10495 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10497 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10496 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10499 - .species = SPECIES_GOLBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10501 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10500 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10503 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_UNUSED] = - { -#line 10504 - .trainerName = _("GRUNT"), -#line 10505 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10506 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = -#line 10507 -F_TRAINER_FEMALE | -#line 10508 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 10509 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10510 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10512 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10514 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10513 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10516 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10518 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10517 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10520 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MT_PYRE_4] = - { -#line 10521 - .trainerName = _("GRUNT"), -#line 10522 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 10523 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = -#line 10524 -F_TRAINER_FEMALE | -#line 10525 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 10526 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10527 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10529 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10531 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10530 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10533 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10535 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10534 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10537 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_JAGGED_PASS] = - { -#line 10538 - .trainerName = _("GRUNT"), -#line 10539 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10540 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 10542 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10543 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10544 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10546 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10548 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10547 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10550 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10552 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10551 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10554 - [DIFFICULTY_NORMAL][TRAINER_MARC] = - { -#line 10555 - .trainerName = _("MARC"), -#line 10556 - .trainerClass = TRAINER_CLASS_HIKER, -#line 10557 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 10559 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 10560 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10561 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10563 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10565 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 10564 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10567 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10569 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 10568 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10571 - [DIFFICULTY_NORMAL][TRAINER_BRENDEN] = - { -#line 10572 - .trainerName = _("BRENDEN"), -#line 10573 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 10574 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 10576 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 10577 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10578 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10580 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10582 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 10581 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10584 - [DIFFICULTY_NORMAL][TRAINER_LILITH] = - { -#line 10585 - .trainerName = _("LILITH"), -#line 10586 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 10587 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 10588 -F_TRAINER_FEMALE | -#line 10589 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 10590 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10591 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10593 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10595 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 10594 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10597 - [DIFFICULTY_NORMAL][TRAINER_CRISTIAN] = - { -#line 10598 - .trainerName = _("CRISTIAN"), -#line 10599 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 10600 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 10602 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 10603 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10604 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10606 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10608 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 10607 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10610 - [DIFFICULTY_NORMAL][TRAINER_SYLVIA] = - { -#line 10611 - .trainerName = _("SYLVIA"), -#line 10612 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 10613 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 10614 -F_TRAINER_FEMALE | -#line 10615 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 10616 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10617 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10619 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10621 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 10620 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10623 - [DIFFICULTY_NORMAL][TRAINER_LEONARDO] = - { -#line 10624 - .trainerName = _("LEONARDO"), -#line 10625 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 10626 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 10628 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 10629 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10630 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10632 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10634 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10633 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10636 - [DIFFICULTY_NORMAL][TRAINER_ATHENA] = - { -#line 10637 - .trainerName = _("ATHENA"), -#line 10638 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 10639 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 10640 -F_TRAINER_FEMALE | -#line 10641 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10642 - .items = { ITEM_HYPER_POTION }, -#line 10643 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10644 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10646 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10648 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 10647 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 10649 - MOVE_THUNDER, - MOVE_THUNDER_WAVE, - MOVE_QUICK_ATTACK, - }, - }, - { -#line 10653 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10655 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 10654 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 10656 - MOVE_SURF, - MOVE_THIEF, - }, - }, - }, - }, -#line 10659 - [DIFFICULTY_NORMAL][TRAINER_HARRISON] = - { -#line 10660 - .trainerName = _("HARRISON"), -#line 10661 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 10662 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 10664 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 10665 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10666 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10668 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10670 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10669 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10672 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MT_CHIMNEY_2] = - { -#line 10673 - .trainerName = _("GRUNT"), -#line 10674 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10675 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 10677 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10678 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10679 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10681 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10683 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10682 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10685 - [DIFFICULTY_NORMAL][TRAINER_CLARENCE] = - { -#line 10686 - .trainerName = _("CLARENCE"), -#line 10687 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 10688 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 10690 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 10691 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10692 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10694 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10696 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10695 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10698 - [DIFFICULTY_NORMAL][TRAINER_TERRY] = - { -#line 10699 - .trainerName = _("TERRY"), -#line 10700 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 10701 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 10702 -F_TRAINER_FEMALE | -#line 10703 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 10704 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10705 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10707 - .species = SPECIES_GIRAFARIG, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10709 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10708 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10711 - [DIFFICULTY_NORMAL][TRAINER_NATE] = - { -#line 10712 - .trainerName = _("NATE"), -#line 10713 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 10714 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 10716 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 10717 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10718 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10720 - .species = SPECIES_SPOINK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10722 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 10721 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10724 - [DIFFICULTY_NORMAL][TRAINER_KATHLEEN] = - { -#line 10725 - .trainerName = _("KATHLEEN"), -#line 10726 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 10727 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 10728 -F_TRAINER_FEMALE | -#line 10729 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 10730 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10731 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10733 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10735 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 10734 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10737 - [DIFFICULTY_NORMAL][TRAINER_CLIFFORD] = - { -#line 10738 - .trainerName = _("CLIFFORD"), -#line 10739 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 10740 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 10742 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 10743 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10744 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10746 - .species = SPECIES_GIRAFARIG, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10748 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10747 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10750 - [DIFFICULTY_NORMAL][TRAINER_NICHOLAS] = - { -#line 10751 - .trainerName = _("NICHOLAS"), -#line 10752 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 10753 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 10755 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 10756 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10757 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10759 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10761 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10760 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10763 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SPACE_CENTER_3] = - { -#line 10764 - .trainerName = _("GRUNT"), -#line 10765 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10766 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, - .encounterMusic_gender = -#line 10767 -F_TRAINER_FEMALE | -#line 10768 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10769 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10770 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10772 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10774 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10773 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10776 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10778 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10777 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10780 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SPACE_CENTER_4] = - { -#line 10781 - .trainerName = _("GRUNT"), -#line 10782 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10783 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 10785 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10786 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10787 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10789 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10791 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10790 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10793 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SPACE_CENTER_5] = - { -#line 10794 - .trainerName = _("GRUNT"), -#line 10795 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10796 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 10798 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10799 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10800 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10802 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10804 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10803 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10806 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SPACE_CENTER_6] = - { -#line 10807 - .trainerName = _("GRUNT"), -#line 10808 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10809 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 10811 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10812 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10813 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10815 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10817 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10816 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10819 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SPACE_CENTER_7] = - { -#line 10820 - .trainerName = _("GRUNT"), -#line 10821 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10822 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 10824 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10825 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10826 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10828 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10830 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10829 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10832 - [DIFFICULTY_NORMAL][TRAINER_MACEY] = - { -#line 10833 - .trainerName = _("MACEY"), -#line 10834 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 10835 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 10836 -F_TRAINER_FEMALE | -#line 10837 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 10838 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10839 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10841 - .species = SPECIES_NATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10843 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10842 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10845 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_RUSTBORO_TREECKO] = - { -#line 10846 - .trainerName = _("BRENDAN"), -#line 10847 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 10848 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 10850 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 10851 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10852 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10854 - .species = SPECIES_LOTAD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10856 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10855 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10858 - .species = SPECIES_TORCHIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10860 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10859 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10862 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_RUSTBORO_MUDKIP] = - { -#line 10863 - .trainerName = _("BRENDAN"), -#line 10864 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 10865 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 10867 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 10868 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10869 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10871 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10873 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10872 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10875 - .species = SPECIES_TREECKO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10877 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10876 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10879 - [DIFFICULTY_NORMAL][TRAINER_PAXTON] = - { -#line 10880 - .trainerName = _("PAXTON"), -#line 10881 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 10882 - .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = -#line 10884 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 10885 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10886 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10888 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10890 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10889 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10892 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10894 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10893 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10896 - [DIFFICULTY_NORMAL][TRAINER_ISABELLA] = - { -#line 10897 - .trainerName = _("ISABELLA"), -#line 10898 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 10899 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 10900 -F_TRAINER_FEMALE | -#line 10901 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 10902 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10903 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10905 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10907 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10906 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10909 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_WEATHER_INST_5] = - { -#line 10910 - .trainerName = _("GRUNT"), -#line 10911 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 10912 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = -#line 10913 -F_TRAINER_FEMALE | -#line 10914 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 10915 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10916 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10918 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10920 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10919 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10922 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10924 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10923 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10926 - [DIFFICULTY_NORMAL][TRAINER_TABITHA_MT_CHIMNEY] = - { -#line 10927 - .trainerName = _("TABITHA"), -#line 10928 - .trainerClass = TRAINER_CLASS_MAGMA_ADMIN, -#line 10929 - .trainerPic = TRAINER_PIC_MAGMA_ADMIN, - .encounterMusic_gender = -#line 10931 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10932 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10933 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 10935 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10937 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10936 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10939 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10941 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10940 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10943 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10945 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10944 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10947 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10949 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10948 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10951 - [DIFFICULTY_NORMAL][TRAINER_JONATHAN] = - { -#line 10952 - .trainerName = _("JONATHAN"), -#line 10953 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 10954 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 10956 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10957 - .items = { ITEM_HYPER_POTION }, -#line 10958 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10959 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10961 - .species = SPECIES_KECLEON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10963 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10962 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10965 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10967 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10966 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10969 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_RUSTBORO_TORCHIC] = - { -#line 10970 - .trainerName = _("BRENDAN"), -#line 10971 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 10972 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 10974 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 10975 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10976 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10978 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10980 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10979 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10982 - .species = SPECIES_MUDKIP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10984 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10983 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10986 - [DIFFICULTY_NORMAL][TRAINER_MAY_RUSTBORO_MUDKIP] = - { -#line 10987 - .trainerName = _("MAY"), -#line 10988 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 10989 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 10990 -F_TRAINER_FEMALE | -#line 10991 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 10992 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10993 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10995 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10997 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10996 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10999 - .species = SPECIES_TREECKO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11001 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 11000 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11003 - [DIFFICULTY_NORMAL][TRAINER_MAXIE_MAGMA_HIDEOUT] = - { -#line 11004 - .trainerName = _("MAXIE"), -#line 11005 - .trainerClass = TRAINER_CLASS_MAGMA_LEADER, -#line 11006 - .trainerPic = TRAINER_PIC_MAGMA_LEADER_MAXIE, - .encounterMusic_gender = -#line 11008 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 11009 - .items = { ITEM_SUPER_POTION, ITEM_SUPER_POTION }, -#line 11010 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11011 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 11013 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11015 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 11014 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11017 - .species = SPECIES_CROBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11019 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 11018 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11021 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11023 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 11022 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11025 - [DIFFICULTY_NORMAL][TRAINER_MAXIE_MT_CHIMNEY] = - { -#line 11026 - .trainerName = _("MAXIE"), -#line 11027 - .trainerClass = TRAINER_CLASS_MAGMA_LEADER, -#line 11028 - .trainerPic = TRAINER_PIC_MAGMA_LEADER_MAXIE, - .encounterMusic_gender = -#line 11030 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 11031 - .items = { ITEM_SUPER_POTION, ITEM_SUPER_POTION }, -#line 11032 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11033 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 11035 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11037 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 11036 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11039 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11041 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 11040 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11043 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11045 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 11044 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11047 - [DIFFICULTY_NORMAL][TRAINER_TIANA] = - { -#line 11048 - .trainerName = _("TIANA"), -#line 11049 - .trainerClass = TRAINER_CLASS_LASS, -#line 11050 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11051 -F_TRAINER_FEMALE | -#line 11052 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11053 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11054 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11056 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11058 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11057 - .lvl = 4, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11060 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11062 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11061 - .lvl = 4, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11064 - [DIFFICULTY_NORMAL][TRAINER_HALEY_1] = - { -#line 11065 - .trainerName = _("HALEY"), -#line 11066 - .trainerClass = TRAINER_CLASS_LASS, -#line 11067 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11068 -F_TRAINER_FEMALE | -#line 11069 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11070 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11071 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11073 - .species = SPECIES_LOTAD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11075 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11074 - .lvl = 6, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11077 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11079 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11078 - .lvl = 6, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11081 - [DIFFICULTY_NORMAL][TRAINER_JANICE] = - { -#line 11082 - .trainerName = _("JANICE"), -#line 11083 - .trainerClass = TRAINER_CLASS_LASS, -#line 11084 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11085 -F_TRAINER_FEMALE | -#line 11086 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11087 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11088 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 11090 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11092 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11091 - .lvl = 9, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11094 - [DIFFICULTY_NORMAL][TRAINER_VIVI] = - { -#line 11095 - .trainerName = _("VIVI"), -#line 11096 - .trainerClass = TRAINER_CLASS_WINSTRATE, -#line 11097 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11098 -F_TRAINER_FEMALE | -#line 11099 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11100 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11101 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 11103 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11105 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11104 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11107 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11109 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11108 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11111 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11113 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11112 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11115 - [DIFFICULTY_NORMAL][TRAINER_HALEY_2] = - { -#line 11116 - .trainerName = _("HALEY"), -#line 11117 - .trainerClass = TRAINER_CLASS_LASS, -#line 11118 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11119 -F_TRAINER_FEMALE | -#line 11120 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11121 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11122 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11124 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11126 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11125 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11128 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11130 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11129 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11132 - [DIFFICULTY_NORMAL][TRAINER_HALEY_3] = - { -#line 11133 - .trainerName = _("HALEY"), -#line 11134 - .trainerClass = TRAINER_CLASS_LASS, -#line 11135 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11136 -F_TRAINER_FEMALE | -#line 11137 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11138 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11139 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11141 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11143 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11142 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11145 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11147 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11146 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11149 - [DIFFICULTY_NORMAL][TRAINER_HALEY_4] = - { -#line 11150 - .trainerName = _("HALEY"), -#line 11151 - .trainerClass = TRAINER_CLASS_LASS, -#line 11152 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11153 -F_TRAINER_FEMALE | -#line 11154 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11155 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11156 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11158 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11160 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11159 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11162 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11164 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11163 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11166 - [DIFFICULTY_NORMAL][TRAINER_HALEY_5] = - { -#line 11167 - .trainerName = _("HALEY"), -#line 11168 - .trainerClass = TRAINER_CLASS_LASS, -#line 11169 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11170 -F_TRAINER_FEMALE | -#line 11171 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11172 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11173 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 11175 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11177 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11176 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11179 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11181 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11180 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11183 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11185 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11184 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11187 - [DIFFICULTY_NORMAL][TRAINER_SALLY] = - { -#line 11188 - .trainerName = _("SALLY"), -#line 11189 - .trainerClass = TRAINER_CLASS_LASS, -#line 11190 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11191 -F_TRAINER_FEMALE | -#line 11192 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11193 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11194 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 11196 - .species = SPECIES_ODDISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11198 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11197 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11200 - [DIFFICULTY_NORMAL][TRAINER_ROBIN] = - { -#line 11201 - .trainerName = _("ROBIN"), -#line 11202 - .trainerClass = TRAINER_CLASS_LASS, -#line 11203 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11204 -F_TRAINER_FEMALE | -#line 11205 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11206 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11207 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 11209 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11211 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11210 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11213 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11215 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11214 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11217 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11219 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11218 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11221 - [DIFFICULTY_NORMAL][TRAINER_ANDREA] = - { -#line 11222 - .trainerName = _("ANDREA"), -#line 11223 - .trainerClass = TRAINER_CLASS_LASS, -#line 11224 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11225 -F_TRAINER_FEMALE | -#line 11226 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11227 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11228 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 11230 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11232 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11231 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11234 - [DIFFICULTY_NORMAL][TRAINER_CRISSY] = - { -#line 11235 - .trainerName = _("CRISSY"), -#line 11236 - .trainerClass = TRAINER_CLASS_LASS, -#line 11237 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11238 -F_TRAINER_FEMALE | -#line 11239 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11240 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11241 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11243 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11245 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11244 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11247 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11249 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11248 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11251 - [DIFFICULTY_NORMAL][TRAINER_RICK] = - { -#line 11252 - .trainerName = _("RICK"), -#line 11253 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11254 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 11256 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11257 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11258 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11260 - .species = SPECIES_WURMPLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11262 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11261 - .lvl = 4, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11264 - .species = SPECIES_WURMPLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11266 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11265 - .lvl = 4, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11268 - [DIFFICULTY_NORMAL][TRAINER_LYLE] = - { -#line 11269 - .trainerName = _("LYLE"), -#line 11270 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11271 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 11273 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11274 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11275 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 11277 - .species = SPECIES_WURMPLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11279 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11278 - .lvl = 3, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11281 - .species = SPECIES_WURMPLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11283 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11282 - .lvl = 3, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11285 - .species = SPECIES_WURMPLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11287 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11286 - .lvl = 3, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11289 - .species = SPECIES_WURMPLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11291 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11290 - .lvl = 3, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11293 - [DIFFICULTY_NORMAL][TRAINER_JOSE] = - { -#line 11294 - .trainerName = _("JOSE"), -#line 11295 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11296 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 11298 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11299 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11300 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11302 - .species = SPECIES_WURMPLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11304 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 11303 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11306 - .species = SPECIES_NINCADA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11308 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 11307 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11310 - [DIFFICULTY_NORMAL][TRAINER_DOUG] = - { -#line 11311 - .trainerName = _("DOUG"), -#line 11312 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11313 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 11315 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11316 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11317 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11319 - .species = SPECIES_NINCADA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11321 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11320 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11323 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11325 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11324 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11327 - [DIFFICULTY_NORMAL][TRAINER_GREG] = - { -#line 11328 - .trainerName = _("GREG"), -#line 11329 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11330 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 11332 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11333 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11334 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11336 - .species = SPECIES_VOLBEAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11338 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11337 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11340 - .species = SPECIES_ILLUMISE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11342 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11341 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11344 - [DIFFICULTY_NORMAL][TRAINER_KENT] = - { -#line 11345 - .trainerName = _("KENT"), -#line 11346 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11347 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 11349 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11350 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11351 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 11353 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11355 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11354 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11357 - [DIFFICULTY_NORMAL][TRAINER_JAMES_1] = - { -#line 11358 - .trainerName = _("JAMES"), -#line 11359 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11360 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 11362 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11363 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11364 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11366 - .species = SPECIES_NINCADA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11368 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11367 - .lvl = 6, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11370 - .species = SPECIES_NINCADA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11372 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11371 - .lvl = 6, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11374 - [DIFFICULTY_NORMAL][TRAINER_JAMES_2] = - { -#line 11375 - .trainerName = _("JAMES"), -#line 11376 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11377 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 11379 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11380 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11381 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 11383 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11385 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11384 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11387 - [DIFFICULTY_NORMAL][TRAINER_JAMES_3] = - { -#line 11388 - .trainerName = _("JAMES"), -#line 11389 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11390 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 11392 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11393 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11394 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11396 - .species = SPECIES_DUSTOX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11398 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11397 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11400 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11402 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11401 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11404 - [DIFFICULTY_NORMAL][TRAINER_JAMES_4] = - { -#line 11405 - .trainerName = _("JAMES"), -#line 11406 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11407 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 11409 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11410 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11411 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 11413 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11415 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11414 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11417 - .species = SPECIES_DUSTOX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11419 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11418 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11421 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11423 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11422 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11425 - [DIFFICULTY_NORMAL][TRAINER_JAMES_5] = - { -#line 11426 - .trainerName = _("JAMES"), -#line 11427 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11428 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 11430 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11431 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11432 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 11434 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11436 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11435 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11438 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11440 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11439 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11442 - .species = SPECIES_DUSTOX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11444 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11443 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11446 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11448 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11447 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11450 - [DIFFICULTY_NORMAL][TRAINER_BRICE] = - { -#line 11451 - .trainerName = _("BRICE"), -#line 11452 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11453 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11455 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11456 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11457 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11459 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11461 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11460 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11463 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11465 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11464 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11467 - [DIFFICULTY_NORMAL][TRAINER_TRENT_1] = - { -#line 11468 - .trainerName = _("TRENT"), -#line 11469 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11470 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11472 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11473 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11474 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 11476 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11478 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11477 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11480 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11482 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11481 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11484 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11486 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11485 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11488 - [DIFFICULTY_NORMAL][TRAINER_LENNY] = - { -#line 11489 - .trainerName = _("LENNY"), -#line 11490 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11491 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11493 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11494 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11495 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11497 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11499 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11498 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11501 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11503 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11502 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11505 - [DIFFICULTY_NORMAL][TRAINER_LUCAS_1] = - { -#line 11506 - .trainerName = _("LUCAS"), -#line 11507 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11508 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11510 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11511 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11512 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11514 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11516 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11515 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11518 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11520 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11519 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11522 - [DIFFICULTY_NORMAL][TRAINER_ALAN] = - { -#line 11523 - .trainerName = _("ALAN"), -#line 11524 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11525 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11527 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11528 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11529 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 11531 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11533 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11532 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11535 - .species = SPECIES_NOSEPASS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11537 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11536 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11539 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11541 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11540 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11543 - [DIFFICULTY_NORMAL][TRAINER_CLARK] = - { -#line 11544 - .trainerName = _("CLARK"), -#line 11545 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11546 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11548 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11549 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11550 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 11552 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11554 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11553 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11556 - [DIFFICULTY_NORMAL][TRAINER_ERIC] = - { -#line 11557 - .trainerName = _("ERIC"), -#line 11558 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11559 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11561 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11562 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11563 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11565 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11567 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11566 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11569 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11571 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11570 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11573 - [DIFFICULTY_NORMAL][TRAINER_LUCAS_2] = - { -#line 11574 - .trainerName = _("LUCAS"), -#line 11575 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11576 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11578 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11579 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11580 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 11582 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11584 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11583 - .lvl = 9, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11585 - MOVE_SPLASH, - MOVE_WATER_GUN, - }, - }, - }, - }, -#line 11588 - [DIFFICULTY_NORMAL][TRAINER_MIKE_1] = - { -#line 11589 - .trainerName = _("MIKE"), -#line 11590 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11591 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11593 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11594 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11595 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11597 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11599 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11598 - .lvl = 10, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11600 - MOVE_GUST, - MOVE_GROWL, - }, - }, - { -#line 11603 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11605 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11604 - .lvl = 10, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11606 - MOVE_BITE, - MOVE_SCARY_FACE, - }, - }, - }, - }, -#line 11609 - [DIFFICULTY_NORMAL][TRAINER_MIKE_2] = - { -#line 11610 - .trainerName = _("MIKE"), -#line 11611 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11612 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11614 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11615 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11616 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 11618 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11620 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11619 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11622 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11624 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11623 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11626 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11628 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11627 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11630 - [DIFFICULTY_NORMAL][TRAINER_TRENT_2] = - { -#line 11631 - .trainerName = _("TRENT"), -#line 11632 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11633 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11635 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11636 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11637 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 11639 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11641 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11640 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11643 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11645 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11644 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11647 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11649 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11648 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11651 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11653 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11652 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11655 - [DIFFICULTY_NORMAL][TRAINER_TRENT_3] = - { -#line 11656 - .trainerName = _("TRENT"), -#line 11657 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11658 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11660 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11661 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11662 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 11664 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11666 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11665 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11668 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11670 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11669 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11672 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11674 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11673 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11676 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11678 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11677 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11680 - [DIFFICULTY_NORMAL][TRAINER_TRENT_4] = - { -#line 11681 - .trainerName = _("TRENT"), -#line 11682 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11683 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11685 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11686 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11687 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 11689 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11691 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11690 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11693 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11695 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11694 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11697 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11699 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11698 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11701 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11703 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11702 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11705 - [DIFFICULTY_NORMAL][TRAINER_TRENT_5] = - { -#line 11706 - .trainerName = _("TRENT"), -#line 11707 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11708 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11710 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11711 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11712 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 11714 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11716 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11715 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11718 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11720 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11719 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11722 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11724 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11723 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11726 - .species = SPECIES_GOLEM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11728 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11727 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11730 - [DIFFICULTY_NORMAL][TRAINER_DEZ_AND_LUKE] = - { -#line 11731 - .trainerName = _("DEZ & LUKE"), -#line 11732 - .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 11733 - .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = -#line 11735 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 11736 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 11737 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11739 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11741 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11740 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11743 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11745 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11744 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11747 - [DIFFICULTY_NORMAL][TRAINER_LEA_AND_JED] = - { -#line 11748 - .trainerName = _("LEA & JED"), -#line 11749 - .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 11750 - .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = -#line 11752 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 11753 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 11754 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11756 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11758 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11757 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11760 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11762 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11761 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11764 - [DIFFICULTY_NORMAL][TRAINER_KIRA_AND_DAN_1] = - { -#line 11765 - .trainerName = _("KIRA & DAN"), -#line 11766 - .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 11767 - .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = -#line 11769 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 11770 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 11771 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11773 - .species = SPECIES_VOLBEAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11775 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11774 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11777 - .species = SPECIES_ILLUMISE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11779 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11778 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11781 - [DIFFICULTY_NORMAL][TRAINER_KIRA_AND_DAN_2] = - { -#line 11782 - .trainerName = _("KIRA & DAN"), -#line 11783 - .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 11784 - .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = -#line 11786 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 11787 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 11788 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11790 - .species = SPECIES_VOLBEAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11792 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11791 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11794 - .species = SPECIES_ILLUMISE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11796 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11795 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11798 - [DIFFICULTY_NORMAL][TRAINER_KIRA_AND_DAN_3] = - { -#line 11799 - .trainerName = _("KIRA & DAN"), -#line 11800 - .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 11801 - .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = -#line 11803 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 11804 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 11805 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11807 - .species = SPECIES_VOLBEAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11809 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11808 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11811 - .species = SPECIES_ILLUMISE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11813 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11812 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11815 - [DIFFICULTY_NORMAL][TRAINER_KIRA_AND_DAN_4] = - { -#line 11816 - .trainerName = _("KIRA & DAN"), -#line 11817 - .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 11818 - .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = -#line 11820 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 11821 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 11822 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11824 - .species = SPECIES_VOLBEAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11826 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11825 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11828 - .species = SPECIES_ILLUMISE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11830 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11829 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11832 - [DIFFICULTY_NORMAL][TRAINER_KIRA_AND_DAN_5] = - { -#line 11833 - .trainerName = _("KIRA & DAN"), -#line 11834 - .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 11835 - .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = -#line 11837 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 11838 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 11839 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11841 - .species = SPECIES_VOLBEAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11843 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11842 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11845 - .species = SPECIES_ILLUMISE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11847 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11846 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11849 - [DIFFICULTY_NORMAL][TRAINER_JOHANNA] = - { -#line 11850 - .trainerName = _("JOHANNA"), -#line 11851 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 11852 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 11853 -F_TRAINER_FEMALE | -#line 11854 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11855 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11856 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 11858 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11860 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11859 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11862 - [DIFFICULTY_NORMAL][TRAINER_GERALD] = - { -#line 11863 - .trainerName = _("GERALD"), -#line 11864 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 11865 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 11867 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 11868 - .items = { ITEM_HYPER_POTION }, -#line 11869 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11870 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 11872 - .species = SPECIES_KECLEON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11874 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11873 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11875 - MOVE_FLAMETHROWER, - MOVE_FURY_SWIPES, - MOVE_FEINT_ATTACK, - MOVE_BIND, - }, - }, - }, - }, -#line 11880 - [DIFFICULTY_NORMAL][TRAINER_VIVIAN] = - { -#line 11881 - .trainerName = _("VIVIAN"), -#line 11882 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 11883 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 11884 -F_TRAINER_FEMALE | -#line 11885 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 11886 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11887 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11889 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11891 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11890 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11892 - MOVE_BIDE, - MOVE_DETECT, - MOVE_CONFUSION, - MOVE_THUNDER_PUNCH, - }, - }, - { -#line 11897 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11899 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11898 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11900 - MOVE_THUNDER_PUNCH, - MOVE_DETECT, - MOVE_CONFUSION, - MOVE_MEDITATE, - }, - }, - }, - }, -#line 11905 - [DIFFICULTY_NORMAL][TRAINER_DANIELLE] = - { -#line 11906 - .trainerName = _("DANIELLE"), -#line 11907 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 11908 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 11909 -F_TRAINER_FEMALE | -#line 11910 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 11911 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11912 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 11914 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11916 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11915 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11917 - MOVE_BIDE, - MOVE_DETECT, - MOVE_CONFUSION, - MOVE_FIRE_PUNCH, - }, - }, - }, - }, -#line 11922 - [DIFFICULTY_NORMAL][TRAINER_HIDEO] = - { -#line 11923 - .trainerName = _("HIDEO"), -#line 11924 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 11925 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 11927 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 11928 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11929 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11931 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11933 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11932 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11934 - MOVE_TACKLE, - MOVE_SELF_DESTRUCT, - MOVE_SLUDGE, - MOVE_SMOKESCREEN, - }, - }, - { -#line 11939 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11941 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11940 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11942 - MOVE_TACKLE, - MOVE_POISON_GAS, - MOVE_SLUDGE, - MOVE_SMOKESCREEN, - }, - }, - }, - }, -#line 11947 - [DIFFICULTY_NORMAL][TRAINER_KEIGO] = - { -#line 11948 - .trainerName = _("KEIGO"), -#line 11949 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 11950 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 11952 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 11953 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11954 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11956 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11958 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11957 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11959 - MOVE_POISON_GAS, - MOVE_SELF_DESTRUCT, - MOVE_SLUDGE, - MOVE_SMOKESCREEN, - }, - }, - { -#line 11964 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11966 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11965 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11967 - MOVE_SAND_ATTACK, - MOVE_DOUBLE_TEAM, - MOVE_FURY_CUTTER, - MOVE_SWORDS_DANCE, - }, - }, - }, - }, -#line 11972 - [DIFFICULTY_NORMAL][TRAINER_RILEY] = - { -#line 11973 - .trainerName = _("RILEY"), -#line 11974 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 11975 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 11977 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 11978 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11979 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11981 - .species = SPECIES_NINCADA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11983 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11982 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11984 - MOVE_LEECH_LIFE, - MOVE_FURY_SWIPES, - MOVE_MIND_READER, - MOVE_DIG, - }, - }, - { -#line 11989 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11991 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11990 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11992 - MOVE_TACKLE, - MOVE_SELF_DESTRUCT, - MOVE_SLUDGE, - MOVE_SMOKESCREEN, - }, - }, - }, - }, -#line 11997 - [DIFFICULTY_NORMAL][TRAINER_FLINT] = - { -#line 11998 - .trainerName = _("FLINT"), -#line 11999 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 12000 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 12002 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12003 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12004 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12006 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12008 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12007 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12010 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12012 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12011 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12014 - [DIFFICULTY_NORMAL][TRAINER_ASHLEY] = - { -#line 12015 - .trainerName = _("ASHLEY"), -#line 12016 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 12017 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 12018 -F_TRAINER_FEMALE | -#line 12019 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 12020 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12021 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 12023 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12025 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 12024 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12027 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12029 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 12028 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12031 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12033 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 12032 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12035 - [DIFFICULTY_NORMAL][TRAINER_WALLY_MAUVILLE] = - { -#line 12036 - .trainerName = _("WALLY"), -#line 12037 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 12038 - .trainerPic = TRAINER_PIC_WALLY, - .encounterMusic_gender = -#line 12040 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12041 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12042 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 12044 - .species = SPECIES_RALTS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12046 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 12045 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12048 - [DIFFICULTY_NORMAL][TRAINER_WALLY_VR_2] = - { -#line 12049 - .trainerName = _("WALLY"), -#line 12050 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 12051 - .trainerPic = TRAINER_PIC_WALLY, - .encounterMusic_gender = -#line 12053 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12054 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 12055 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12056 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 12058 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12060 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12059 - .lvl = 47, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12061 - MOVE_AERIAL_ACE, - MOVE_SAFEGUARD, - MOVE_DRAGON_BREATH, - MOVE_DRAGON_DANCE, - }, - }, - { -#line 12066 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12068 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12067 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12069 - MOVE_SING, - MOVE_ASSIST, - MOVE_CHARM, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 12074 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12076 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12075 - .lvl = 47, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12077 - MOVE_MAGICAL_LEAF, - MOVE_LEECH_SEED, - MOVE_GIGA_DRAIN, - MOVE_TOXIC, - }, - }, - { -#line 12082 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12084 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12083 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12085 - MOVE_SUPERSONIC, - MOVE_THUNDERBOLT, - MOVE_TRI_ATTACK, - MOVE_SCREECH, - }, - }, - { -#line 12090 - .species = SPECIES_GARDEVOIR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12092 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 12091 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12093 - MOVE_DOUBLE_TEAM, - MOVE_CALM_MIND, - MOVE_PSYCHIC, - MOVE_FUTURE_SIGHT, - }, - }, - }, - }, -#line 12098 - [DIFFICULTY_NORMAL][TRAINER_WALLY_VR_3] = - { -#line 12099 - .trainerName = _("WALLY"), -#line 12100 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 12101 - .trainerPic = TRAINER_PIC_WALLY, - .encounterMusic_gender = -#line 12103 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12104 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 12105 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12106 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 12108 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12110 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12109 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12111 - MOVE_AERIAL_ACE, - MOVE_SAFEGUARD, - MOVE_DRAGON_BREATH, - MOVE_DRAGON_DANCE, - }, - }, - { -#line 12116 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12118 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12117 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12119 - MOVE_SING, - MOVE_ASSIST, - MOVE_CHARM, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 12124 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12126 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12125 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12127 - MOVE_MAGICAL_LEAF, - MOVE_LEECH_SEED, - MOVE_GIGA_DRAIN, - MOVE_TOXIC, - }, - }, - { -#line 12132 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12134 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12133 - .lvl = 47, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12135 - MOVE_SUPERSONIC, - MOVE_THUNDERBOLT, - MOVE_TRI_ATTACK, - MOVE_SCREECH, - }, - }, - { -#line 12140 - .species = SPECIES_GARDEVOIR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12142 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 12141 - .lvl = 51, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12143 - MOVE_DOUBLE_TEAM, - MOVE_CALM_MIND, - MOVE_PSYCHIC, - MOVE_FUTURE_SIGHT, - }, - }, - }, - }, -#line 12148 - [DIFFICULTY_NORMAL][TRAINER_WALLY_VR_4] = - { -#line 12149 - .trainerName = _("WALLY"), -#line 12150 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 12151 - .trainerPic = TRAINER_PIC_WALLY, - .encounterMusic_gender = -#line 12153 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12154 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 12155 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12156 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 12158 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12160 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12159 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12161 - MOVE_AERIAL_ACE, - MOVE_SAFEGUARD, - MOVE_DRAGON_BREATH, - MOVE_DRAGON_DANCE, - }, - }, - { -#line 12166 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12168 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12167 - .lvl = 52, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12169 - MOVE_SING, - MOVE_ASSIST, - MOVE_CHARM, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 12174 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12176 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12175 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12177 - MOVE_MAGICAL_LEAF, - MOVE_LEECH_SEED, - MOVE_GIGA_DRAIN, - MOVE_TOXIC, - }, - }, - { -#line 12182 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12184 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12183 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12185 - MOVE_SUPERSONIC, - MOVE_THUNDERBOLT, - MOVE_TRI_ATTACK, - MOVE_SCREECH, - }, - }, - { -#line 12190 - .species = SPECIES_GARDEVOIR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12192 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 12191 - .lvl = 54, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12193 - MOVE_DOUBLE_TEAM, - MOVE_CALM_MIND, - MOVE_PSYCHIC, - MOVE_FUTURE_SIGHT, - }, - }, - }, - }, -#line 12198 - [DIFFICULTY_NORMAL][TRAINER_WALLY_VR_5] = - { -#line 12199 - .trainerName = _("WALLY"), -#line 12200 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 12201 - .trainerPic = TRAINER_PIC_WALLY, - .encounterMusic_gender = -#line 12203 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12204 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 12205 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12206 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 12208 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12210 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12209 - .lvl = 56, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12211 - MOVE_AERIAL_ACE, - MOVE_SAFEGUARD, - MOVE_DRAGON_BREATH, - MOVE_DRAGON_DANCE, - }, - }, - { -#line 12216 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12218 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12217 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12219 - MOVE_SING, - MOVE_ASSIST, - MOVE_CHARM, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 12224 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12226 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12225 - .lvl = 56, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12227 - MOVE_MAGICAL_LEAF, - MOVE_LEECH_SEED, - MOVE_GIGA_DRAIN, - MOVE_TOXIC, - }, - }, - { -#line 12232 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12234 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12233 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12235 - MOVE_SUPERSONIC, - MOVE_THUNDERBOLT, - MOVE_TRI_ATTACK, - MOVE_SCREECH, - }, - }, - { -#line 12240 - .species = SPECIES_GARDEVOIR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12242 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 12241 - .lvl = 57, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12243 - MOVE_DOUBLE_TEAM, - MOVE_CALM_MIND, - MOVE_PSYCHIC, - MOVE_FUTURE_SIGHT, - }, - }, - }, - }, -#line 12248 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_LILYCOVE_MUDKIP] = - { -#line 12249 - .trainerName = _("BRENDAN"), -#line 12250 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 12251 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 12253 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12254 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12255 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 12257 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12259 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12258 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12261 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12263 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12262 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12265 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12267 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12266 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12269 - .species = SPECIES_GROVYLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12271 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12270 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12273 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_LILYCOVE_TREECKO] = - { -#line 12274 - .trainerName = _("BRENDAN"), -#line 12275 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 12276 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 12278 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12279 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12280 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 12282 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12284 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12283 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12286 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12288 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12287 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12290 - .species = SPECIES_LUDICOLO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12292 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12291 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12294 - .species = SPECIES_COMBUSKEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12296 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12295 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12298 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_LILYCOVE_TORCHIC] = - { -#line 12299 - .trainerName = _("BRENDAN"), -#line 12300 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 12301 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 12303 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12304 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12305 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 12307 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12309 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12308 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12311 - .species = SPECIES_LUDICOLO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12313 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12312 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12315 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12317 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12316 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12319 - .species = SPECIES_MARSHTOMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12321 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12320 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12323 - [DIFFICULTY_NORMAL][TRAINER_MAY_LILYCOVE_MUDKIP] = - { -#line 12324 - .trainerName = _("MAY"), -#line 12325 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 12326 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 12327 -F_TRAINER_FEMALE | -#line 12328 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 12329 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12330 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 12332 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12334 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12333 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12336 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12338 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12337 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12340 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12342 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12341 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12344 - .species = SPECIES_GROVYLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12346 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12345 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12348 - [DIFFICULTY_NORMAL][TRAINER_MAY_LILYCOVE_TREECKO] = - { -#line 12349 - .trainerName = _("MAY"), -#line 12350 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 12351 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 12352 -F_TRAINER_FEMALE | -#line 12353 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 12354 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12355 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 12357 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12359 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12358 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12361 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12363 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12362 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12365 - .species = SPECIES_LUDICOLO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12367 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12366 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12369 - .species = SPECIES_COMBUSKEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12371 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12370 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12373 - [DIFFICULTY_NORMAL][TRAINER_MAY_LILYCOVE_TORCHIC] = - { -#line 12374 - .trainerName = _("MAY"), -#line 12375 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 12376 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 12377 -F_TRAINER_FEMALE | -#line 12378 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 12379 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12380 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 12382 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12384 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12383 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12386 - .species = SPECIES_LUDICOLO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12388 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12387 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12390 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12392 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12391 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12394 - .species = SPECIES_MARSHTOMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12396 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12395 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12398 - [DIFFICULTY_NORMAL][TRAINER_JONAH] = - { -#line 12399 - .trainerName = _("JONAH"), -#line 12400 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 12401 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 12403 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 12404 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12405 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 12407 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12409 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12408 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12411 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12413 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12412 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12415 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12417 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12416 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12419 - [DIFFICULTY_NORMAL][TRAINER_HENRY] = - { -#line 12420 - .trainerName = _("HENRY"), -#line 12421 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 12422 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 12424 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 12425 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12426 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12428 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12430 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12429 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12432 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12434 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12433 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12436 - [DIFFICULTY_NORMAL][TRAINER_ROGER] = - { -#line 12437 - .trainerName = _("ROGER"), -#line 12438 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 12439 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 12441 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 12442 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12443 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 12445 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12447 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12446 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12449 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12451 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12450 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12453 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12455 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12454 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12457 - [DIFFICULTY_NORMAL][TRAINER_ALEXA] = - { -#line 12458 - .trainerName = _("ALEXA"), -#line 12459 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 12460 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 12461 -F_TRAINER_FEMALE | -#line 12462 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 12463 - .items = { ITEM_FULL_RESTORE }, -#line 12464 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12465 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12467 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12469 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 12468 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12471 - .species = SPECIES_AZUMARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12473 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 12472 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12475 - [DIFFICULTY_NORMAL][TRAINER_RUBEN] = - { -#line 12476 - .trainerName = _("RUBEN"), -#line 12477 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 12478 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 12480 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 12481 - .items = { ITEM_HYPER_POTION }, -#line 12482 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12483 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12485 - .species = SPECIES_SHIFTRY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12487 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 12486 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12489 - .species = SPECIES_NOSEPASS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12491 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 12490 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12493 - [DIFFICULTY_NORMAL][TRAINER_KOJI_1] = - { -#line 12494 - .trainerName = _("KOJI"), -#line 12495 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 12496 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 12498 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 12499 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12500 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 12502 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12504 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12503 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12506 - [DIFFICULTY_NORMAL][TRAINER_WAYNE] = - { -#line 12507 - .trainerName = _("WAYNE"), -#line 12508 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 12509 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 12511 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 12512 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12513 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 12515 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12517 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12516 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12519 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12521 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12520 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12523 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12525 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12524 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12527 - [DIFFICULTY_NORMAL][TRAINER_AIDAN] = - { -#line 12528 - .trainerName = _("AIDAN"), -#line 12529 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 12530 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 12532 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 12533 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12534 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12536 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12538 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12537 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12540 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12542 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12541 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12544 - [DIFFICULTY_NORMAL][TRAINER_REED] = - { -#line 12545 - .trainerName = _("REED"), -#line 12546 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 12547 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 12549 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12550 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12551 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12553 - .species = SPECIES_SPHEAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12555 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12554 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12557 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12559 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12558 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12561 - [DIFFICULTY_NORMAL][TRAINER_TISHA] = - { -#line 12562 - .trainerName = _("TISHA"), -#line 12563 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 12564 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 12565 -F_TRAINER_FEMALE | -#line 12566 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12567 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12568 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 12570 - .species = SPECIES_CHINCHOU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12572 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12571 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12574 - [DIFFICULTY_NORMAL][TRAINER_TORI_AND_TIA] = - { -#line 12575 - .trainerName = _("TORI & TIA"), -#line 12576 - .trainerClass = TRAINER_CLASS_TWINS, -#line 12577 - .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = -#line 12579 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 12580 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12581 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12583 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12585 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12584 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12587 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12589 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12588 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12591 - [DIFFICULTY_NORMAL][TRAINER_KIM_AND_IRIS] = - { -#line 12592 - .trainerName = _("KIM & IRIS"), -#line 12593 - .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 12594 - .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = -#line 12596 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 12597 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12598 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12600 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12602 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12601 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12603 - MOVE_SING, - MOVE_FURY_ATTACK, - MOVE_SAFEGUARD, - MOVE_AERIAL_ACE, - }, - }, - { -#line 12608 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12610 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12609 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12611 - MOVE_FLAMETHROWER, - MOVE_TAKE_DOWN, - MOVE_REST, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 12616 - [DIFFICULTY_NORMAL][TRAINER_TYRA_AND_IVY] = - { -#line 12617 - .trainerName = _("TYRA & IVY"), -#line 12618 - .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 12619 - .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = -#line 12621 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 12622 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12623 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12625 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12627 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12626 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12628 - MOVE_GROWTH, - MOVE_STUN_SPORE, - MOVE_MEGA_DRAIN, - MOVE_LEECH_SEED, - }, - }, - { -#line 12633 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12635 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12634 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12636 - MOVE_DEFENSE_CURL, - MOVE_ROLLOUT, - MOVE_MUD_SPORT, - MOVE_ROCK_THROW, - }, - }, - }, - }, -#line 12641 - [DIFFICULTY_NORMAL][TRAINER_MEL_AND_PAUL] = - { -#line 12642 - .trainerName = _("MEL & PAUL"), -#line 12643 - .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 12644 - .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = -#line 12646 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 12647 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12648 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12650 - .species = SPECIES_DUSTOX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12652 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12651 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12653 - MOVE_GUST, - MOVE_PSYBEAM, - MOVE_TOXIC, - MOVE_PROTECT, - }, - }, - { -#line 12658 - .species = SPECIES_BEAUTIFLY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12660 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12659 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12661 - MOVE_GUST, - MOVE_MEGA_DRAIN, - MOVE_ATTRACT, - MOVE_STUN_SPORE, - }, - }, - }, - }, -#line 12666 - [DIFFICULTY_NORMAL][TRAINER_JOHN_AND_JAY_1] = - { -#line 12667 - .trainerName = _("JOHN & JAY"), -#line 12668 - .trainerClass = TRAINER_CLASS_OLD_COUPLE, -#line 12669 - .trainerPic = TRAINER_PIC_OLD_COUPLE, - .encounterMusic_gender = -#line 12671 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 12672 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12673 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12675 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12677 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12676 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12678 - MOVE_PSYCHIC, - MOVE_FIRE_PUNCH, - MOVE_PSYCH_UP, - MOVE_PROTECT, - }, - }, - { -#line 12683 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12685 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12684 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12686 - MOVE_FOCUS_PUNCH, - MOVE_ROCK_TOMB, - MOVE_REST, - MOVE_BELLY_DRUM, - }, - }, - }, - }, -#line 12691 - [DIFFICULTY_NORMAL][TRAINER_JOHN_AND_JAY_2] = - { -#line 12692 - .trainerName = _("JOHN & JAY"), -#line 12693 - .trainerClass = TRAINER_CLASS_OLD_COUPLE, -#line 12694 - .trainerPic = TRAINER_PIC_OLD_COUPLE, - .encounterMusic_gender = -#line 12696 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 12697 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12698 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12700 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12702 - .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 12701 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12703 - MOVE_PSYCHIC, - MOVE_FIRE_PUNCH, - MOVE_PSYCH_UP, - MOVE_PROTECT, - }, - }, - { -#line 12708 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12710 - .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 12709 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12711 - MOVE_FOCUS_PUNCH, - MOVE_ROCK_TOMB, - MOVE_REST, - MOVE_BELLY_DRUM, - }, - }, - }, - }, -#line 12716 - [DIFFICULTY_NORMAL][TRAINER_JOHN_AND_JAY_3] = - { -#line 12717 - .trainerName = _("JOHN & JAY"), -#line 12718 - .trainerClass = TRAINER_CLASS_OLD_COUPLE, -#line 12719 - .trainerPic = TRAINER_PIC_OLD_COUPLE, - .encounterMusic_gender = -#line 12721 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 12722 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12723 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12725 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12727 - .iv = TRAINER_PARTY_IVS(26, 26, 26, 26, 26, 26), -#line 12726 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12728 - MOVE_PSYCHIC, - MOVE_FIRE_PUNCH, - MOVE_PSYCH_UP, - MOVE_PROTECT, - }, - }, - { -#line 12733 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12735 - .iv = TRAINER_PARTY_IVS(26, 26, 26, 26, 26, 26), -#line 12734 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12736 - MOVE_FOCUS_PUNCH, - MOVE_ROCK_TOMB, - MOVE_REST, - MOVE_BELLY_DRUM, - }, - }, - }, - }, -#line 12741 - [DIFFICULTY_NORMAL][TRAINER_JOHN_AND_JAY_4] = - { -#line 12742 - .trainerName = _("JOHN & JAY"), -#line 12743 - .trainerClass = TRAINER_CLASS_OLD_COUPLE, -#line 12744 - .trainerPic = TRAINER_PIC_OLD_COUPLE, - .encounterMusic_gender = -#line 12746 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 12747 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12748 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12750 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12752 - .iv = TRAINER_PARTY_IVS(27, 27, 27, 27, 27, 27), -#line 12751 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12753 - MOVE_PSYCHIC, - MOVE_FIRE_PUNCH, - MOVE_PSYCH_UP, - MOVE_PROTECT, - }, - }, - { -#line 12758 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12760 - .iv = TRAINER_PARTY_IVS(27, 27, 27, 27, 27, 27), -#line 12759 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12761 - MOVE_FOCUS_PUNCH, - MOVE_ROCK_TOMB, - MOVE_REST, - MOVE_BELLY_DRUM, - }, - }, - }, - }, -#line 12766 - [DIFFICULTY_NORMAL][TRAINER_JOHN_AND_JAY_5] = - { -#line 12767 - .trainerName = _("JOHN & JAY"), -#line 12768 - .trainerClass = TRAINER_CLASS_OLD_COUPLE, -#line 12769 - .trainerPic = TRAINER_PIC_OLD_COUPLE, - .encounterMusic_gender = -#line 12771 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 12772 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12773 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12775 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12777 - .iv = TRAINER_PARTY_IVS(29, 29, 29, 29, 29, 29), -#line 12776 - .lvl = 52, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12778 - MOVE_PSYCHIC, - MOVE_FIRE_PUNCH, - MOVE_PSYCH_UP, - MOVE_PROTECT, - }, - }, - { -#line 12783 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12785 - .iv = TRAINER_PARTY_IVS(29, 29, 29, 29, 29, 29), -#line 12784 - .lvl = 52, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12786 - MOVE_FOCUS_PUNCH, - MOVE_ROCK_TOMB, - MOVE_REST, - MOVE_BELLY_DRUM, - }, - }, - }, - }, -#line 12791 - [DIFFICULTY_NORMAL][TRAINER_RELI_AND_IAN] = - { -#line 12792 - .trainerName = _("RELI & IAN"), -#line 12793 - .trainerClass = TRAINER_CLASS_SIS_AND_BRO, -#line 12794 - .trainerPic = TRAINER_PIC_SIS_AND_BRO, - .encounterMusic_gender = -#line 12796 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12797 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12798 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12800 - .species = SPECIES_AZUMARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12802 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12801 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12804 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12806 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12805 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12808 - [DIFFICULTY_NORMAL][TRAINER_LILA_AND_ROY_1] = - { -#line 12809 - .trainerName = _("LILA & ROY"), -#line 12810 - .trainerClass = TRAINER_CLASS_SIS_AND_BRO, -#line 12811 - .trainerPic = TRAINER_PIC_SIS_AND_BRO, - .encounterMusic_gender = -#line 12813 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12814 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12815 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12817 - .species = SPECIES_CHINCHOU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12819 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12818 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12821 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12823 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12822 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12825 - [DIFFICULTY_NORMAL][TRAINER_LILA_AND_ROY_2] = - { -#line 12826 - .trainerName = _("LILA & ROY"), -#line 12827 - .trainerClass = TRAINER_CLASS_SIS_AND_BRO, -#line 12828 - .trainerPic = TRAINER_PIC_SIS_AND_BRO, - .encounterMusic_gender = -#line 12830 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12831 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12832 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12834 - .species = SPECIES_CHINCHOU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12836 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12835 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12838 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12840 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12839 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12842 - [DIFFICULTY_NORMAL][TRAINER_LILA_AND_ROY_3] = - { -#line 12843 - .trainerName = _("LILA & ROY"), -#line 12844 - .trainerClass = TRAINER_CLASS_SIS_AND_BRO, -#line 12845 - .trainerPic = TRAINER_PIC_SIS_AND_BRO, - .encounterMusic_gender = -#line 12847 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12848 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12849 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12851 - .species = SPECIES_LANTURN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12853 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12852 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12855 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12857 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12856 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12859 - [DIFFICULTY_NORMAL][TRAINER_LILA_AND_ROY_4] = - { -#line 12860 - .trainerName = _("LILA & ROY"), -#line 12861 - .trainerClass = TRAINER_CLASS_SIS_AND_BRO, -#line 12862 - .trainerPic = TRAINER_PIC_SIS_AND_BRO, - .encounterMusic_gender = -#line 12864 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12865 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12866 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12868 - .species = SPECIES_LANTURN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12870 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12869 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12872 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12874 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12873 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12876 - [DIFFICULTY_NORMAL][TRAINER_LILA_AND_ROY_5] = - { -#line 12877 - .trainerName = _("LILA & ROY"), -#line 12878 - .trainerClass = TRAINER_CLASS_SIS_AND_BRO, -#line 12879 - .trainerPic = TRAINER_PIC_SIS_AND_BRO, - .encounterMusic_gender = -#line 12881 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12882 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12883 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12885 - .species = SPECIES_LANTURN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12887 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12886 - .lvl = 51, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12889 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12891 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12890 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12893 - [DIFFICULTY_NORMAL][TRAINER_LISA_AND_RAY] = - { -#line 12894 - .trainerName = _("LISA & RAY"), -#line 12895 - .trainerClass = TRAINER_CLASS_SIS_AND_BRO, -#line 12896 - .trainerPic = TRAINER_PIC_SIS_AND_BRO, - .encounterMusic_gender = -#line 12898 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12899 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12900 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12902 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12904 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12903 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12906 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12908 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12907 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12910 - [DIFFICULTY_NORMAL][TRAINER_CHRIS] = - { -#line 12911 - .trainerName = _("CHRIS"), -#line 12912 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 12913 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 12915 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 12916 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12917 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 12919 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12921 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12920 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12923 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12925 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12924 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12927 - .species = SPECIES_FEEBAS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12929 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12928 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12931 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12933 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12932 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12935 - [DIFFICULTY_NORMAL][TRAINER_DAWSON] = - { -#line 12936 - .trainerName = _("DAWSON"), -#line 12937 - .trainerClass = TRAINER_CLASS_RICH_BOY, -#line 12938 - .trainerPic = TRAINER_PIC_RICH_BOY, - .encounterMusic_gender = -#line 12940 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 12941 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12942 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12944 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12944 - .heldItem = ITEM_NUGGET, -#line 12946 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12945 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12948 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12950 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12949 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12952 - [DIFFICULTY_NORMAL][TRAINER_SARAH] = - { -#line 12953 - .trainerName = _("SARAH"), -#line 12954 - .trainerClass = TRAINER_CLASS_LADY, -#line 12955 - .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = -#line 12956 -F_TRAINER_FEMALE | -#line 12957 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 12958 - .items = { ITEM_FULL_RESTORE }, -#line 12959 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12960 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12962 - .species = SPECIES_LOTAD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12964 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12963 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12966 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12966 - .heldItem = ITEM_NUGGET, -#line 12968 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12967 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12970 - [DIFFICULTY_NORMAL][TRAINER_DARIAN] = - { -#line 12971 - .trainerName = _("DARIAN"), -#line 12972 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 12973 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 12975 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 12976 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12977 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 12979 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12981 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12980 - .lvl = 9, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12983 - [DIFFICULTY_NORMAL][TRAINER_HAILEY] = - { -#line 12984 - .trainerName = _("HAILEY"), -#line 12985 - .trainerClass = TRAINER_CLASS_TUBER_F, -#line 12986 - .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = -#line 12987 -F_TRAINER_FEMALE | -#line 12988 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 12989 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12990 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 12992 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12994 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12993 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12996 - [DIFFICULTY_NORMAL][TRAINER_CHANDLER] = - { -#line 12997 - .trainerName = _("CHANDLER"), -#line 12998 - .trainerClass = TRAINER_CLASS_TUBER_M, -#line 12999 - .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = -#line 13001 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 13002 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13003 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13005 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13007 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13006 - .lvl = 12, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13009 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13011 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13010 - .lvl = 12, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13013 - [DIFFICULTY_NORMAL][TRAINER_KALEB] = - { -#line 13014 - .trainerName = _("KALEB"), -#line 13015 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 13016 - .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = -#line 13018 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 13019 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13020 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13022 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13022 - .heldItem = ITEM_ORAN_BERRY, -#line 13024 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13023 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13026 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13026 - .heldItem = ITEM_ORAN_BERRY, -#line 13028 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13027 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13030 - [DIFFICULTY_NORMAL][TRAINER_JOSEPH] = - { -#line 13031 - .trainerName = _("JOSEPH"), -#line 13032 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 13033 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 13035 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13036 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13037 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13039 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13041 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13040 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13043 - .species = SPECIES_VOLTORB, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13045 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13044 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13047 - [DIFFICULTY_NORMAL][TRAINER_ALYSSA] = - { -#line 13048 - .trainerName = _("ALYSSA"), -#line 13049 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 13050 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = -#line 13051 -F_TRAINER_FEMALE | -#line 13052 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 13053 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13054 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13056 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13058 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13057 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13060 - [DIFFICULTY_NORMAL][TRAINER_MARCOS] = - { -#line 13061 - .trainerName = _("MARCOS"), -#line 13062 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 13063 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 13065 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13066 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13067 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13069 - .species = SPECIES_VOLTORB, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13071 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 13070 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13073 - [DIFFICULTY_NORMAL][TRAINER_RHETT] = - { -#line 13074 - .trainerName = _("RHETT"), -#line 13075 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 13076 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 13078 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13079 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13080 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13082 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13084 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 13083 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13086 - [DIFFICULTY_NORMAL][TRAINER_TYRON] = - { -#line 13087 - .trainerName = _("TYRON"), -#line 13088 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 13089 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 13091 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 13092 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13093 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13095 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13097 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13096 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13099 - [DIFFICULTY_NORMAL][TRAINER_CELINA] = - { -#line 13100 - .trainerName = _("CELINA"), -#line 13101 - .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 13102 - .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = -#line 13103 -F_TRAINER_FEMALE | -#line 13104 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 13105 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13106 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13108 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13110 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13109 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13112 - [DIFFICULTY_NORMAL][TRAINER_BIANCA] = - { -#line 13113 - .trainerName = _("BIANCA"), -#line 13114 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 13115 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 13116 -F_TRAINER_FEMALE | -#line 13117 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 13118 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13119 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13121 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13123 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13122 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13125 - [DIFFICULTY_NORMAL][TRAINER_HAYDEN] = - { -#line 13126 - .trainerName = _("HAYDEN"), -#line 13127 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 13128 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 13130 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 13131 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13132 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13134 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13136 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13135 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13138 - [DIFFICULTY_NORMAL][TRAINER_SOPHIE] = - { -#line 13139 - .trainerName = _("SOPHIE"), -#line 13140 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 13141 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 13142 -F_TRAINER_FEMALE | -#line 13143 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 13144 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13145 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13147 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13149 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13148 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13151 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13153 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13152 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13155 - [DIFFICULTY_NORMAL][TRAINER_COBY] = - { -#line 13156 - .trainerName = _("COBY"), -#line 13157 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 13158 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 13160 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 13161 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13162 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13164 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13166 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13165 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13168 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13170 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13169 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13172 - [DIFFICULTY_NORMAL][TRAINER_LAWRENCE] = - { -#line 13173 - .trainerName = _("LAWRENCE"), -#line 13174 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 13175 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 13177 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 13178 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13179 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13181 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13183 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13182 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13185 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13187 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13186 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13189 - [DIFFICULTY_NORMAL][TRAINER_WYATT] = - { -#line 13190 - .trainerName = _("WYATT"), -#line 13191 - .trainerClass = TRAINER_CLASS_POKEMANIAC, -#line 13192 - .trainerPic = TRAINER_PIC_POKEMANIAC, - .encounterMusic_gender = -#line 13194 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 13195 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13196 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13198 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13200 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13199 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13202 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13204 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13203 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13206 - [DIFFICULTY_NORMAL][TRAINER_ANGELINA] = - { -#line 13207 - .trainerName = _("ANGELINA"), -#line 13208 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 13209 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 13210 -F_TRAINER_FEMALE | -#line 13211 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 13212 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13213 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13215 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13217 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13216 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13219 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13221 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13220 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13223 - [DIFFICULTY_NORMAL][TRAINER_KAI] = - { -#line 13224 - .trainerName = _("KAI"), -#line 13225 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 13226 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 13228 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 13229 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13230 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13232 - .species = SPECIES_BARBOACH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13234 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13233 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13236 - [DIFFICULTY_NORMAL][TRAINER_CHARLOTTE] = - { -#line 13237 - .trainerName = _("CHARLOTTE"), -#line 13238 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 13239 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 13240 -F_TRAINER_FEMALE | -#line 13241 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 13242 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13243 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13245 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13247 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13246 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13249 - [DIFFICULTY_NORMAL][TRAINER_DEANDRE] = - { -#line 13250 - .trainerName = _("DEANDRE"), -#line 13251 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 13252 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 13254 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 13255 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13256 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 13258 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13260 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13259 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13262 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13264 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13263 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13266 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13268 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13267 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13270 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_1] = - { -#line 13271 - .trainerName = _("GRUNT"), -#line 13272 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13273 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13275 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13276 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13277 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13279 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13281 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13280 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13283 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_2] = - { -#line 13284 - .trainerName = _("GRUNT"), -#line 13285 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13286 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13288 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13289 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13290 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13292 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13294 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13293 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13296 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_3] = - { -#line 13297 - .trainerName = _("GRUNT"), -#line 13298 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13299 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13301 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13302 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13303 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13305 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13307 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13306 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13309 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_4] = - { -#line 13310 - .trainerName = _("GRUNT"), -#line 13311 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13312 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13314 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13315 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13316 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13318 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13320 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13319 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13322 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13324 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13323 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13326 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_5] = - { -#line 13327 - .trainerName = _("GRUNT"), -#line 13328 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13329 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13331 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13332 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13333 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13335 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13337 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13336 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13339 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13341 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13340 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13343 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_6] = - { -#line 13344 - .trainerName = _("GRUNT"), -#line 13345 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13346 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13348 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13349 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13350 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13352 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13354 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13353 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13356 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_7] = - { -#line 13357 - .trainerName = _("GRUNT"), -#line 13358 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13359 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13361 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13362 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13363 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13365 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13367 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13366 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13369 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_8] = - { -#line 13370 - .trainerName = _("GRUNT"), -#line 13371 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13372 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13374 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13375 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13376 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13378 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13380 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13379 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13382 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_9] = - { -#line 13383 - .trainerName = _("GRUNT"), -#line 13384 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13385 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13387 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13388 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13389 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13391 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13393 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13392 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13395 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_10] = - { -#line 13396 - .trainerName = _("GRUNT"), -#line 13397 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13398 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13400 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13401 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13402 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13404 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13406 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13405 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13408 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_11] = - { -#line 13409 - .trainerName = _("GRUNT"), -#line 13410 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13411 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13413 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13414 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13415 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13417 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13419 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13418 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13421 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_12] = - { -#line 13422 - .trainerName = _("GRUNT"), -#line 13423 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13424 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13426 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13427 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13428 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13430 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13432 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13431 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13434 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_13] = - { -#line 13435 - .trainerName = _("GRUNT"), -#line 13436 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13437 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13439 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13440 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13441 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13443 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13445 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13444 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13447 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_14] = - { -#line 13448 - .trainerName = _("GRUNT"), -#line 13449 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13450 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, - .encounterMusic_gender = -#line 13451 -F_TRAINER_FEMALE | -#line 13452 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13453 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13454 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13456 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13458 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13457 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13460 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_15] = - { -#line 13461 - .trainerName = _("GRUNT"), -#line 13462 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13463 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, - .encounterMusic_gender = -#line 13464 -F_TRAINER_FEMALE | -#line 13465 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13466 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13467 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13469 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13471 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13470 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13473 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_16] = - { -#line 13474 - .trainerName = _("GRUNT"), -#line 13475 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13476 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, - .encounterMusic_gender = -#line 13477 -F_TRAINER_FEMALE | -#line 13478 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13479 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13480 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13482 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13484 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13483 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13486 - [DIFFICULTY_NORMAL][TRAINER_TABITHA_MAGMA_HIDEOUT] = - { -#line 13487 - .trainerName = _("TABITHA"), -#line 13488 - .trainerClass = TRAINER_CLASS_MAGMA_ADMIN, -#line 13489 - .trainerPic = TRAINER_PIC_MAGMA_ADMIN, - .encounterMusic_gender = -#line 13491 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13492 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13493 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 13495 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13497 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 13496 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13499 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13501 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 13500 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13503 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13505 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 13504 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13507 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13509 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 13508 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13511 - [DIFFICULTY_NORMAL][TRAINER_DARCY] = - { -#line 13512 - .trainerName = _("DARCY"), -#line 13513 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 13514 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 13515 -F_TRAINER_FEMALE | -#line 13516 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 13517 - .items = { ITEM_HYPER_POTION }, -#line 13518 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13519 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13521 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13523 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13522 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13525 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13527 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13526 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13529 - [DIFFICULTY_NORMAL][TRAINER_MAXIE_MOSSDEEP] = - { -#line 13530 - .trainerName = _("MAXIE"), -#line 13531 - .trainerClass = TRAINER_CLASS_MAGMA_LEADER, -#line 13532 - .trainerPic = TRAINER_PIC_MAGMA_LEADER_MAXIE, - .encounterMusic_gender = -#line 13534 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13535 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13536 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 13538 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13540 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 13539 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13542 - .species = SPECIES_CROBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13544 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 13543 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13546 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13548 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 13547 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13550 - [DIFFICULTY_NORMAL][TRAINER_PETE] = - { -#line 13551 - .trainerName = _("PETE"), -#line 13552 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 13553 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 13555 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 13556 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13557 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13559 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13561 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13560 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13563 - [DIFFICULTY_NORMAL][TRAINER_ISABELLE] = - { -#line 13564 - .trainerName = _("ISABELLE"), -#line 13565 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 13566 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 13567 -F_TRAINER_FEMALE | -#line 13568 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 13569 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13570 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13572 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13574 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13573 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13576 - [DIFFICULTY_NORMAL][TRAINER_ANDRES_1] = - { -#line 13577 - .trainerName = _("ANDRES"), -#line 13578 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 13579 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 13581 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 13582 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13583 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13585 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13587 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 13586 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13589 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13591 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 13590 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13593 - [DIFFICULTY_NORMAL][TRAINER_JOSUE] = - { -#line 13594 - .trainerName = _("JOSUE"), -#line 13595 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 13596 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 13598 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 13599 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13600 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13602 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13604 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 13603 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13606 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13608 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 13607 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13610 - [DIFFICULTY_NORMAL][TRAINER_CAMRON] = - { -#line 13611 - .trainerName = _("CAMRON"), -#line 13612 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 13613 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 13615 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 13616 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13617 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13619 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13621 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13620 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13623 - [DIFFICULTY_NORMAL][TRAINER_CORY_1] = - { -#line 13624 - .trainerName = _("CORY"), -#line 13625 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 13626 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 13628 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 13629 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13630 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 13632 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13634 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13633 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13636 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13638 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13637 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13640 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13642 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13641 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13644 - [DIFFICULTY_NORMAL][TRAINER_CAROLINA] = - { -#line 13645 - .trainerName = _("CAROLINA"), -#line 13646 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 13647 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 13648 -F_TRAINER_FEMALE | -#line 13649 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 13650 - .items = { ITEM_HYPER_POTION }, -#line 13651 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13652 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 13654 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13656 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 13655 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13658 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13660 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 13659 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13662 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13664 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 13663 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13666 - [DIFFICULTY_NORMAL][TRAINER_ELIJAH] = - { -#line 13667 - .trainerName = _("ELIJAH"), -#line 13668 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 13669 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 13671 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 13672 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13673 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13675 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13677 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13676 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13679 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13681 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13680 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13683 - [DIFFICULTY_NORMAL][TRAINER_CELIA] = - { -#line 13684 - .trainerName = _("CELIA"), -#line 13685 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 13686 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 13687 -F_TRAINER_FEMALE | -#line 13688 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 13689 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13690 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13692 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13694 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13693 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13696 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13698 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13697 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13700 - [DIFFICULTY_NORMAL][TRAINER_BRYAN] = - { -#line 13701 - .trainerName = _("BRYAN"), -#line 13702 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 13703 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 13705 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 13706 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13707 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13709 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13711 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13710 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13713 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13715 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13714 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13717 - [DIFFICULTY_NORMAL][TRAINER_BRANDEN] = - { -#line 13718 - .trainerName = _("BRANDEN"), -#line 13719 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 13720 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 13722 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 13723 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13724 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13726 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13728 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13727 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13730 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13732 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13731 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13734 - [DIFFICULTY_NORMAL][TRAINER_BRYANT] = - { -#line 13735 - .trainerName = _("BRYANT"), -#line 13736 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 13737 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 13739 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 13740 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13741 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13743 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13745 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13744 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13747 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13749 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13748 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13751 - [DIFFICULTY_NORMAL][TRAINER_SHAYLA] = - { -#line 13752 - .trainerName = _("SHAYLA"), -#line 13753 - .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 13754 - .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = -#line 13755 -F_TRAINER_FEMALE | -#line 13756 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 13757 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13758 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13760 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13762 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13761 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13764 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13766 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13765 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13768 - [DIFFICULTY_NORMAL][TRAINER_KYRA] = - { -#line 13769 - .trainerName = _("KYRA"), -#line 13770 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 13771 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, - .encounterMusic_gender = -#line 13772 -F_TRAINER_FEMALE | -#line 13773 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 13774 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13775 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13777 - .species = SPECIES_DODUO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13779 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13778 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13781 - .species = SPECIES_DODRIO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13783 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13782 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13785 - [DIFFICULTY_NORMAL][TRAINER_JAIDEN] = - { -#line 13786 - .trainerName = _("JAIDEN"), -#line 13787 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 13788 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 13790 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 13791 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13792 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13794 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13796 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13795 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13798 - .species = SPECIES_GULPIN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13800 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13799 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13802 - [DIFFICULTY_NORMAL][TRAINER_ALIX] = - { -#line 13803 - .trainerName = _("ALIX"), -#line 13804 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 13805 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 13806 -F_TRAINER_FEMALE | -#line 13807 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13808 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13809 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13811 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13813 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13812 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13815 - .species = SPECIES_KIRLIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13817 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13816 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13819 - [DIFFICULTY_NORMAL][TRAINER_HELENE] = - { -#line 13820 - .trainerName = _("HELENE"), -#line 13821 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 13822 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 13823 -F_TRAINER_FEMALE | -#line 13824 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13825 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13826 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13828 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13830 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13829 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13832 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13834 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13833 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13836 - [DIFFICULTY_NORMAL][TRAINER_MARLENE] = - { -#line 13837 - .trainerName = _("MARLENE"), -#line 13838 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 13839 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 13840 -F_TRAINER_FEMALE | -#line 13841 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13842 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13843 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13845 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13847 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13846 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13849 - .species = SPECIES_SPOINK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13851 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13850 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13853 - [DIFFICULTY_NORMAL][TRAINER_DEVAN] = - { -#line 13854 - .trainerName = _("DEVAN"), -#line 13855 - .trainerClass = TRAINER_CLASS_HIKER, -#line 13856 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 13858 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 13859 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13860 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13862 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13864 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13863 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13866 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13868 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13867 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13870 - [DIFFICULTY_NORMAL][TRAINER_JOHNSON] = - { -#line 13871 - .trainerName = _("JOHNSON"), -#line 13872 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 13873 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 13875 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 13876 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13877 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13879 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13881 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13880 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13883 - .species = SPECIES_LOTAD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13885 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13884 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13887 - [DIFFICULTY_NORMAL][TRAINER_MELINA] = - { -#line 13888 - .trainerName = _("MELINA"), -#line 13889 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 13890 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, - .encounterMusic_gender = -#line 13891 -F_TRAINER_FEMALE | -#line 13892 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 13893 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13894 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13896 - .species = SPECIES_DODUO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13898 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13897 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13900 - [DIFFICULTY_NORMAL][TRAINER_BRANDI] = - { -#line 13901 - .trainerName = _("BRANDI"), -#line 13902 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 13903 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 13904 -F_TRAINER_FEMALE | -#line 13905 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13906 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13907 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13909 - .species = SPECIES_RALTS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13911 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13910 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13913 - [DIFFICULTY_NORMAL][TRAINER_AISHA] = - { -#line 13914 - .trainerName = _("AISHA"), -#line 13915 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 13916 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 13917 -F_TRAINER_FEMALE | -#line 13918 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13919 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13920 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13922 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13924 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13923 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13926 - [DIFFICULTY_NORMAL][TRAINER_MAKAYLA] = - { -#line 13927 - .trainerName = _("MAKAYLA"), -#line 13928 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 13929 - .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = -#line 13930 -F_TRAINER_FEMALE | -#line 13931 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13932 - .items = { ITEM_HYPER_POTION }, -#line 13933 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13934 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13936 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13938 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13937 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13940 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13942 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13941 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13944 - [DIFFICULTY_NORMAL][TRAINER_FABIAN] = - { -#line 13945 - .trainerName = _("FABIAN"), -#line 13946 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 13947 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 13949 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13950 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13951 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13953 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13955 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13954 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13957 - [DIFFICULTY_NORMAL][TRAINER_DAYTON] = - { -#line 13958 - .trainerName = _("DAYTON"), -#line 13959 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 13960 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 13962 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 13963 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13964 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13966 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13968 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13967 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13970 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13972 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13971 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13974 - [DIFFICULTY_NORMAL][TRAINER_RACHEL] = - { -#line 13975 - .trainerName = _("RACHEL"), -#line 13976 - .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 13977 - .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = -#line 13978 -F_TRAINER_FEMALE | -#line 13979 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 13980 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13981 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13983 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13985 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13984 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13987 - [DIFFICULTY_NORMAL][TRAINER_LEONEL] = - { -#line 13988 - .trainerName = _("LEONEL"), -#line 13989 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 13990 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 13992 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 13993 - .items = { ITEM_HYPER_POTION }, -#line 13994 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13995 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13997 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13999 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 13998 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14000 - MOVE_THUNDER, - MOVE_QUICK_ATTACK, - MOVE_THUNDER_WAVE, - }, - }, - }, - }, -#line 14004 - [DIFFICULTY_NORMAL][TRAINER_CALLIE] = - { -#line 14005 - .trainerName = _("CALLIE"), -#line 14006 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 14007 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 14008 -F_TRAINER_FEMALE | -#line 14009 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 14010 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 14011 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 14013 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14015 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 14014 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14017 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14019 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 14018 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 14021 - [DIFFICULTY_NORMAL][TRAINER_CALE] = - { -#line 14022 - .trainerName = _("CALE"), -#line 14023 - .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 14024 - .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = -#line 14026 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 14027 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 14028 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 14030 - .species = SPECIES_DUSTOX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14032 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 14031 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14034 - .species = SPECIES_BEAUTIFLY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14036 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 14035 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 14038 - [DIFFICULTY_NORMAL][TRAINER_MYLES] = - { -#line 14039 - .trainerName = _("MYLES"), -#line 14040 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 14041 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, - .encounterMusic_gender = -#line 14043 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14044 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 14045 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 14047 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14049 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14048 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14051 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14053 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14052 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14055 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14057 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14056 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14059 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14061 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14060 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14063 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14065 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14064 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14067 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14069 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14068 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 14071 - [DIFFICULTY_NORMAL][TRAINER_PAT] = - { -#line 14072 - .trainerName = _("PAT"), -#line 14073 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 14074 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 14075 -F_TRAINER_FEMALE | -#line 14076 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14077 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 14078 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 14080 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14082 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14081 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14084 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14086 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14085 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14088 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14090 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14089 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14092 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14094 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14093 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14096 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14098 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14097 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14100 - .species = SPECIES_GULPIN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14102 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14101 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 14104 - [DIFFICULTY_NORMAL][TRAINER_CRISTIN_1] = - { -#line 14105 - .trainerName = _("CRISTIN"), -#line 14106 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 14107 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 14108 -F_TRAINER_FEMALE | -#line 14109 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 14110 - .items = { ITEM_HYPER_POTION }, -#line 14111 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 14112 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 14114 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14116 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 14115 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14118 - .species = SPECIES_VIGOROTH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14120 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 14119 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 14122 - [DIFFICULTY_NORMAL][TRAINER_MAY_RUSTBORO_TREECKO] = - { -#line 14123 - .trainerName = _("MAY"), -#line 14124 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 14125 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 14126 -F_TRAINER_FEMALE | -#line 14127 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14128 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 14129 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 14131 - .species = SPECIES_LOTAD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14133 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 14132 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14135 - .species = SPECIES_TORCHIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14137 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 14136 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 14139 - [DIFFICULTY_NORMAL][TRAINER_MAY_RUSTBORO_TORCHIC] = - { -#line 14140 - .trainerName = _("MAY"), -#line 14141 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 14142 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 14143 -F_TRAINER_FEMALE | -#line 14144 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14145 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 14146 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 14148 - .species = SPECIES_TORKOAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14150 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 14149 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14152 - .species = SPECIES_MUDKIP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14154 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 14153 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 14156 - [DIFFICULTY_NORMAL][TRAINER_ROXANNE_2] = - { -#line 14157 - .trainerName = _("ROXANNE"), -#line 14158 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14159 - .trainerPic = TRAINER_PIC_LEADER_ROXANNE, - .encounterMusic_gender = -#line 14160 -F_TRAINER_FEMALE | -#line 14161 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14162 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14163 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14164 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 14166 - .species = SPECIES_GOLEM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14168 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14167 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14169 - MOVE_PROTECT, - MOVE_ROLLOUT, - MOVE_MAGNITUDE, - MOVE_EXPLOSION, - }, - }, - { -#line 14174 - .species = SPECIES_KABUTO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14174 - .heldItem = ITEM_SITRUS_BERRY, -#line 14176 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14175 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14177 - MOVE_SWORDS_DANCE, - MOVE_ICE_BEAM, - MOVE_SURF, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14182 - .species = SPECIES_ONIX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14184 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14183 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14185 - MOVE_IRON_TAIL, - MOVE_EXPLOSION, - MOVE_ROAR, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14190 - .species = SPECIES_NOSEPASS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14190 - .heldItem = ITEM_SITRUS_BERRY, -#line 14192 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14191 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14193 - MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, - MOVE_PROTECT, - MOVE_ROCK_SLIDE, - }, - }, - }, - }, -#line 14198 - [DIFFICULTY_NORMAL][TRAINER_ROXANNE_3] = - { -#line 14199 - .trainerName = _("ROXANNE"), -#line 14200 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14201 - .trainerPic = TRAINER_PIC_LEADER_ROXANNE, - .encounterMusic_gender = -#line 14202 -F_TRAINER_FEMALE | -#line 14203 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14204 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14205 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14206 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 14208 - .species = SPECIES_OMANYTE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14210 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14209 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14211 - MOVE_PROTECT, - MOVE_ICE_BEAM, - MOVE_ROCK_SLIDE, - MOVE_SURF, - }, - }, - { -#line 14216 - .species = SPECIES_GOLEM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14218 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14217 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14219 - MOVE_PROTECT, - MOVE_ROLLOUT, - MOVE_MAGNITUDE, - MOVE_EXPLOSION, - }, - }, - { -#line 14224 - .species = SPECIES_KABUTOPS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14224 - .heldItem = ITEM_SITRUS_BERRY, -#line 14226 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14225 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14227 - MOVE_SWORDS_DANCE, - MOVE_ICE_BEAM, - MOVE_SURF, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14232 - .species = SPECIES_ONIX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14234 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14233 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14235 - MOVE_IRON_TAIL, - MOVE_EXPLOSION, - MOVE_ROAR, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14240 - .species = SPECIES_NOSEPASS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14240 - .heldItem = ITEM_SITRUS_BERRY, -#line 14242 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14241 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14243 - MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, - MOVE_PROTECT, - MOVE_ROCK_SLIDE, - }, - }, - }, - }, -#line 14248 - [DIFFICULTY_NORMAL][TRAINER_ROXANNE_4] = - { -#line 14249 - .trainerName = _("ROXANNE"), -#line 14250 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14251 - .trainerPic = TRAINER_PIC_LEADER_ROXANNE, - .encounterMusic_gender = -#line 14252 -F_TRAINER_FEMALE | -#line 14253 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14254 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14255 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14256 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 14258 - .species = SPECIES_OMASTAR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14260 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14259 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14261 - MOVE_PROTECT, - MOVE_ICE_BEAM, - MOVE_ROCK_SLIDE, - MOVE_SURF, - }, - }, - { -#line 14266 - .species = SPECIES_GOLEM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14268 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14267 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14269 - MOVE_PROTECT, - MOVE_ROLLOUT, - MOVE_EARTHQUAKE, - MOVE_EXPLOSION, - }, - }, - { -#line 14274 - .species = SPECIES_KABUTOPS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14274 - .heldItem = ITEM_SITRUS_BERRY, -#line 14276 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14275 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14277 - MOVE_SWORDS_DANCE, - MOVE_ICE_BEAM, - MOVE_SURF, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14282 - .species = SPECIES_ONIX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14284 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14283 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14285 - MOVE_IRON_TAIL, - MOVE_EXPLOSION, - MOVE_ROAR, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14290 - .species = SPECIES_NOSEPASS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14290 - .heldItem = ITEM_SITRUS_BERRY, -#line 14292 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14291 - .lvl = 47, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14293 - MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, - MOVE_PROTECT, - MOVE_ROCK_SLIDE, - }, - }, - }, - }, -#line 14298 - [DIFFICULTY_NORMAL][TRAINER_ROXANNE_5] = - { -#line 14299 - .trainerName = _("ROXANNE"), -#line 14300 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14301 - .trainerPic = TRAINER_PIC_LEADER_ROXANNE, - .encounterMusic_gender = -#line 14302 -F_TRAINER_FEMALE | -#line 14303 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14304 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14305 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14306 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 14308 - .species = SPECIES_AERODACTYL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14310 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14309 - .lvl = 47, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14311 - MOVE_ROCK_SLIDE, - MOVE_HYPER_BEAM, - MOVE_SUPERSONIC, - MOVE_PROTECT, - }, - }, - { -#line 14316 - .species = SPECIES_GOLEM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14318 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14317 - .lvl = 47, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14319 - MOVE_FOCUS_PUNCH, - MOVE_ROLLOUT, - MOVE_EARTHQUAKE, - MOVE_EXPLOSION, - }, - }, - { -#line 14324 - .species = SPECIES_OMASTAR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14326 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14325 - .lvl = 47, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14327 - MOVE_PROTECT, - MOVE_ICE_BEAM, - MOVE_ROCK_SLIDE, - MOVE_SURF, - }, - }, - { -#line 14332 - .species = SPECIES_KABUTOPS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14332 - .heldItem = ITEM_SITRUS_BERRY, -#line 14334 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14333 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14335 - MOVE_SWORDS_DANCE, - MOVE_ICE_BEAM, - MOVE_SURF, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14340 - .species = SPECIES_STEELIX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14342 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14341 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14343 - MOVE_IRON_TAIL, - MOVE_EXPLOSION, - MOVE_ROAR, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14348 - .species = SPECIES_NOSEPASS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14348 - .heldItem = ITEM_SITRUS_BERRY, -#line 14350 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14349 - .lvl = 52, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14351 - MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, - MOVE_PROTECT, - MOVE_ROCK_SLIDE, - }, - }, - }, - }, -#line 14356 - [DIFFICULTY_NORMAL][TRAINER_BRAWLY_2] = - { -#line 14357 - .trainerName = _("BRAWLY"), -#line 14358 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14359 - .trainerPic = TRAINER_PIC_LEADER_BRAWLY, - .encounterMusic_gender = -#line 14361 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14362 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14363 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14364 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 14366 - .species = SPECIES_MACHAMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14366 - .heldItem = ITEM_SITRUS_BERRY, -#line 14368 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14367 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14369 - MOVE_KARATE_CHOP, - MOVE_ROCK_SLIDE, - MOVE_FOCUS_PUNCH, - MOVE_BULK_UP, - }, - }, - { -#line 14374 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14376 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14375 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14377 - MOVE_PSYCHIC, - MOVE_LIGHT_SCREEN, - MOVE_REFLECT, - MOVE_FOCUS_PUNCH, - }, - }, - { -#line 14382 - .species = SPECIES_HITMONTOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14384 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14383 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14385 - MOVE_PURSUIT, - MOVE_COUNTER, - MOVE_PROTECT, - MOVE_TRIPLE_KICK, - }, - }, - { -#line 14390 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14390 - .heldItem = ITEM_SITRUS_BERRY, -#line 14392 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14391 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14393 - MOVE_FAKE_OUT, - MOVE_FOCUS_PUNCH, - MOVE_BELLY_DRUM, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 14398 - [DIFFICULTY_NORMAL][TRAINER_BRAWLY_3] = - { -#line 14399 - .trainerName = _("BRAWLY"), -#line 14400 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14401 - .trainerPic = TRAINER_PIC_LEADER_BRAWLY, - .encounterMusic_gender = -#line 14403 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14404 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14405 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14406 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 14408 - .species = SPECIES_MACHAMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14408 - .heldItem = ITEM_SITRUS_BERRY, -#line 14410 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14409 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14411 - MOVE_KARATE_CHOP, - MOVE_ROCK_SLIDE, - MOVE_FOCUS_PUNCH, - MOVE_BULK_UP, - }, - }, - { -#line 14416 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14418 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14417 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14419 - MOVE_PSYCHIC, - MOVE_LIGHT_SCREEN, - MOVE_REFLECT, - MOVE_FOCUS_PUNCH, - }, - }, - { -#line 14424 - .species = SPECIES_HITMONTOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14426 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14425 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14427 - MOVE_PURSUIT, - MOVE_COUNTER, - MOVE_PROTECT, - MOVE_TRIPLE_KICK, - }, - }, - { -#line 14432 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14432 - .heldItem = ITEM_SITRUS_BERRY, -#line 14434 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14433 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14435 - MOVE_FAKE_OUT, - MOVE_FOCUS_PUNCH, - MOVE_BELLY_DRUM, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 14440 - [DIFFICULTY_NORMAL][TRAINER_BRAWLY_4] = - { -#line 14441 - .trainerName = _("BRAWLY"), -#line 14442 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14443 - .trainerPic = TRAINER_PIC_LEADER_BRAWLY, - .encounterMusic_gender = -#line 14445 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14446 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14447 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14448 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 14450 - .species = SPECIES_HITMONCHAN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14452 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14451 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14453 - MOVE_SKY_UPPERCUT, - MOVE_PROTECT, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - }, - }, - { -#line 14458 - .species = SPECIES_MACHAMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14458 - .heldItem = ITEM_SITRUS_BERRY, -#line 14460 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14459 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14461 - MOVE_KARATE_CHOP, - MOVE_ROCK_SLIDE, - MOVE_FOCUS_PUNCH, - MOVE_BULK_UP, - }, - }, - { -#line 14466 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14468 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14467 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14469 - MOVE_FOCUS_PUNCH, - MOVE_LIGHT_SCREEN, - MOVE_REFLECT, - MOVE_PSYCHIC, - }, - }, - { -#line 14474 - .species = SPECIES_HITMONTOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14476 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14475 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14477 - MOVE_PURSUIT, - MOVE_COUNTER, - MOVE_PROTECT, - MOVE_TRIPLE_KICK, - }, - }, - { -#line 14482 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14482 - .heldItem = ITEM_SITRUS_BERRY, -#line 14484 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14483 - .lvl = 47, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14485 - MOVE_FAKE_OUT, - MOVE_FOCUS_PUNCH, - MOVE_BELLY_DRUM, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 14490 - [DIFFICULTY_NORMAL][TRAINER_BRAWLY_5] = - { -#line 14491 - .trainerName = _("BRAWLY"), -#line 14492 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14493 - .trainerPic = TRAINER_PIC_LEADER_BRAWLY, - .encounterMusic_gender = -#line 14495 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14496 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14497 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14498 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 14500 - .species = SPECIES_HITMONLEE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14502 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14501 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14503 - MOVE_MEGA_KICK, - MOVE_FOCUS_PUNCH, - MOVE_EARTHQUAKE, - MOVE_BULK_UP, - }, - }, - { -#line 14508 - .species = SPECIES_HITMONCHAN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14510 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14509 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14511 - MOVE_SKY_UPPERCUT, - MOVE_PROTECT, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - }, - }, - { -#line 14516 - .species = SPECIES_MACHAMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14516 - .heldItem = ITEM_SITRUS_BERRY, -#line 14518 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14517 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14519 - MOVE_CROSS_CHOP, - MOVE_ROCK_SLIDE, - MOVE_FOCUS_PUNCH, - MOVE_BULK_UP, - }, - }, - { -#line 14524 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14526 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14525 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14527 - MOVE_FOCUS_PUNCH, - MOVE_LIGHT_SCREEN, - MOVE_REFLECT, - MOVE_PSYCHIC, - }, - }, - { -#line 14532 - .species = SPECIES_HITMONTOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14534 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14533 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14535 - MOVE_PURSUIT, - MOVE_COUNTER, - MOVE_PROTECT, - MOVE_TRIPLE_KICK, - }, - }, - { -#line 14540 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14540 - .heldItem = ITEM_SITRUS_BERRY, -#line 14542 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14541 - .lvl = 52, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14543 - MOVE_FAKE_OUT, - MOVE_FOCUS_PUNCH, - MOVE_BELLY_DRUM, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 14548 - [DIFFICULTY_NORMAL][TRAINER_WATTSON_2] = - { -#line 14549 - .trainerName = _("WATTSON"), -#line 14550 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14551 - .trainerPic = TRAINER_PIC_LEADER_WATTSON, - .encounterMusic_gender = -#line 14553 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14554 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14555 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14556 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 14558 - .species = SPECIES_MAREEP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14560 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14559 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14561 - MOVE_THUNDER, - MOVE_PROTECT, - MOVE_THUNDER_WAVE, - MOVE_LIGHT_SCREEN, - }, - }, - { -#line 14566 - .species = SPECIES_ELECTRODE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14568 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14567 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14569 - MOVE_ROLLOUT, - MOVE_THUNDER, - MOVE_EXPLOSION, - MOVE_RAIN_DANCE, - }, - }, - { -#line 14574 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14574 - .heldItem = ITEM_SITRUS_BERRY, -#line 14576 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14575 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14577 - MOVE_SUPERSONIC, - MOVE_PROTECT, - MOVE_THUNDER, - MOVE_RAIN_DANCE, - }, - }, - { -#line 14582 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14582 - .heldItem = ITEM_SITRUS_BERRY, -#line 14584 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14583 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14585 - MOVE_BITE, - MOVE_THUNDER_WAVE, - MOVE_THUNDER, - MOVE_PROTECT, - }, - }, - }, - }, -#line 14590 - [DIFFICULTY_NORMAL][TRAINER_WATTSON_3] = - { -#line 14591 - .trainerName = _("WATTSON"), -#line 14592 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14593 - .trainerPic = TRAINER_PIC_LEADER_WATTSON, - .encounterMusic_gender = -#line 14595 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14596 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14597 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14598 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 14600 - .species = SPECIES_PIKACHU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14602 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14601 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14603 - MOVE_THUNDER, - MOVE_SLAM, - MOVE_RAIN_DANCE, - MOVE_SHOCK_WAVE, - }, - }, - { -#line 14608 - .species = SPECIES_FLAAFFY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14610 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14609 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14611 - MOVE_THUNDER, - MOVE_PROTECT, - MOVE_THUNDER_WAVE, - MOVE_LIGHT_SCREEN, - }, - }, - { -#line 14616 - .species = SPECIES_ELECTRODE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14618 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14617 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14619 - MOVE_ROLLOUT, - MOVE_THUNDER, - MOVE_EXPLOSION, - MOVE_RAIN_DANCE, - }, - }, - { -#line 14624 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14624 - .heldItem = ITEM_SITRUS_BERRY, -#line 14626 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14625 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14627 - MOVE_SUPERSONIC, - MOVE_PROTECT, - MOVE_THUNDER, - MOVE_RAIN_DANCE, - }, - }, - { -#line 14632 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14632 - .heldItem = ITEM_SITRUS_BERRY, -#line 14634 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14633 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14635 - MOVE_BITE, - MOVE_THUNDER_WAVE, - MOVE_THUNDER, - MOVE_PROTECT, - }, - }, - }, - }, -#line 14640 - [DIFFICULTY_NORMAL][TRAINER_WATTSON_4] = - { -#line 14641 - .trainerName = _("WATTSON"), -#line 14642 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14643 - .trainerPic = TRAINER_PIC_LEADER_WATTSON, - .encounterMusic_gender = -#line 14645 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14646 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14647 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14648 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 14650 - .species = SPECIES_RAICHU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14652 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14651 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14653 - MOVE_THUNDER, - MOVE_SLAM, - MOVE_RAIN_DANCE, - MOVE_PROTECT, - }, - }, - { -#line 14658 - .species = SPECIES_AMPHAROS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14660 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14659 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14661 - MOVE_THUNDER, - MOVE_PROTECT, - MOVE_THUNDER_WAVE, - MOVE_LIGHT_SCREEN, - }, - }, - { -#line 14666 - .species = SPECIES_ELECTRODE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14668 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14667 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14669 - MOVE_ROLLOUT, - MOVE_THUNDER, - MOVE_EXPLOSION, - MOVE_RAIN_DANCE, - }, - }, - { -#line 14674 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14674 - .heldItem = ITEM_SITRUS_BERRY, -#line 14676 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14675 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14677 - MOVE_SUPERSONIC, - MOVE_PROTECT, - MOVE_THUNDER, - MOVE_RAIN_DANCE, - }, - }, - { -#line 14682 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14682 - .heldItem = ITEM_SITRUS_BERRY, -#line 14684 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14683 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14685 - MOVE_BITE, - MOVE_THUNDER_WAVE, - MOVE_THUNDER, - MOVE_PROTECT, - }, - }, - }, - }, -#line 14690 - [DIFFICULTY_NORMAL][TRAINER_WATTSON_5] = - { -#line 14691 - .trainerName = _("WATTSON"), -#line 14692 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14693 - .trainerPic = TRAINER_PIC_LEADER_WATTSON, - .encounterMusic_gender = -#line 14695 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14696 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14697 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14698 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 14700 - .species = SPECIES_ELECTABUZZ, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14702 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14701 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14703 - MOVE_SWIFT, - MOVE_FOCUS_PUNCH, - MOVE_THUNDER_PUNCH, - MOVE_LIGHT_SCREEN, - }, - }, - { -#line 14708 - .species = SPECIES_RAICHU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14710 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14709 - .lvl = 51, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14711 - MOVE_THUNDER, - MOVE_SLAM, - MOVE_RAIN_DANCE, - MOVE_PROTECT, - }, - }, - { -#line 14716 - .species = SPECIES_AMPHAROS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14718 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14717 - .lvl = 51, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14719 - MOVE_THUNDER, - MOVE_PROTECT, - MOVE_THUNDER_WAVE, - MOVE_LIGHT_SCREEN, - }, - }, - { -#line 14724 - .species = SPECIES_ELECTRODE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14726 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14725 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14727 - MOVE_ROLLOUT, - MOVE_THUNDER, - MOVE_EXPLOSION, - MOVE_RAIN_DANCE, - }, - }, - { -#line 14732 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14732 - .heldItem = ITEM_SITRUS_BERRY, -#line 14734 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14733 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14735 - MOVE_SUPERSONIC, - MOVE_PROTECT, - MOVE_THUNDER, - MOVE_RAIN_DANCE, - }, - }, - { -#line 14740 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14740 - .heldItem = ITEM_SITRUS_BERRY, -#line 14742 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14741 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14743 - MOVE_BITE, - MOVE_THUNDER_WAVE, - MOVE_THUNDER, - MOVE_PROTECT, - }, - }, - }, - }, -#line 14748 - [DIFFICULTY_NORMAL][TRAINER_FLANNERY_2] = - { -#line 14749 - .trainerName = _("FLANNERY"), -#line 14750 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14751 - .trainerPic = TRAINER_PIC_LEADER_FLANNERY, - .encounterMusic_gender = -#line 14752 -F_TRAINER_FEMALE | -#line 14753 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14754 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14755 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14756 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 14758 - .species = SPECIES_MAGCARGO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14758 - .heldItem = ITEM_WHITE_HERB, -#line 14760 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14759 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14761 - MOVE_OVERHEAT, - MOVE_ATTRACT, - MOVE_LIGHT_SCREEN, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14766 - .species = SPECIES_PONYTA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14768 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14767 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14769 - MOVE_FLAMETHROWER, - MOVE_ATTRACT, - MOVE_SOLAR_BEAM, - MOVE_BOUNCE, - }, - }, - { -#line 14774 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14774 - .heldItem = ITEM_WHITE_HERB, -#line 14776 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14775 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14777 - MOVE_OVERHEAT, - MOVE_SUNNY_DAY, - MOVE_EARTHQUAKE, - MOVE_ATTRACT, - }, - }, - { -#line 14782 - .species = SPECIES_TORKOAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14782 - .heldItem = ITEM_WHITE_HERB, -#line 14784 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14783 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14785 - MOVE_OVERHEAT, - MOVE_SUNNY_DAY, - MOVE_EXPLOSION, - MOVE_ATTRACT, - }, - }, - }, - }, -#line 14790 - [DIFFICULTY_NORMAL][TRAINER_FLANNERY_3] = - { -#line 14791 - .trainerName = _("FLANNERY"), -#line 14792 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14793 - .trainerPic = TRAINER_PIC_LEADER_FLANNERY, - .encounterMusic_gender = -#line 14794 -F_TRAINER_FEMALE | -#line 14795 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14796 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14797 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14798 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 14800 - .species = SPECIES_GROWLITHE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14802 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14801 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14803 - MOVE_HELPING_HAND, - MOVE_FLAMETHROWER, - MOVE_ROAR, - MOVE_SUNNY_DAY, - }, - }, - { -#line 14808 - .species = SPECIES_MAGCARGO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14808 - .heldItem = ITEM_WHITE_HERB, -#line 14810 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14809 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14811 - MOVE_OVERHEAT, - MOVE_ATTRACT, - MOVE_LIGHT_SCREEN, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14816 - .species = SPECIES_PONYTA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14818 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14817 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14819 - MOVE_FLAMETHROWER, - MOVE_ATTRACT, - MOVE_SOLAR_BEAM, - MOVE_BOUNCE, - }, - }, - { -#line 14824 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14824 - .heldItem = ITEM_WHITE_HERB, -#line 14826 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14825 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14827 - MOVE_OVERHEAT, - MOVE_SUNNY_DAY, - MOVE_EARTHQUAKE, - MOVE_ATTRACT, - }, - }, - { -#line 14832 - .species = SPECIES_TORKOAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14832 - .heldItem = ITEM_WHITE_HERB, -#line 14834 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14833 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14835 - MOVE_OVERHEAT, - MOVE_SUNNY_DAY, - MOVE_EXPLOSION, - MOVE_ATTRACT, - }, - }, - }, - }, -#line 14840 - [DIFFICULTY_NORMAL][TRAINER_FLANNERY_4] = - { -#line 14841 - .trainerName = _("FLANNERY"), -#line 14842 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14843 - .trainerPic = TRAINER_PIC_LEADER_FLANNERY, - .encounterMusic_gender = -#line 14844 -F_TRAINER_FEMALE | -#line 14845 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14846 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14847 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14848 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 14850 - .species = SPECIES_HOUNDOUR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14852 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14851 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14853 - MOVE_ROAR, - MOVE_SOLAR_BEAM, - MOVE_TAUNT, - MOVE_SUNNY_DAY, - }, - }, - { -#line 14858 - .species = SPECIES_GROWLITHE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14860 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14859 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14861 - MOVE_HELPING_HAND, - MOVE_FLAMETHROWER, - MOVE_SUNNY_DAY, - MOVE_ROAR, - }, - }, - { -#line 14866 - .species = SPECIES_MAGCARGO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14866 - .heldItem = ITEM_WHITE_HERB, -#line 14868 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14867 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14869 - MOVE_OVERHEAT, - MOVE_ATTRACT, - MOVE_LIGHT_SCREEN, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14874 - .species = SPECIES_RAPIDASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14876 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14875 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14877 - MOVE_FLAMETHROWER, - MOVE_ATTRACT, - MOVE_SOLAR_BEAM, - MOVE_BOUNCE, - }, - }, - { -#line 14882 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14882 - .heldItem = ITEM_WHITE_HERB, -#line 14884 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14883 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14885 - MOVE_OVERHEAT, - MOVE_SUNNY_DAY, - MOVE_EARTHQUAKE, - MOVE_ATTRACT, - }, - }, - { -#line 14890 - .species = SPECIES_TORKOAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14890 - .heldItem = ITEM_WHITE_HERB, -#line 14892 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14891 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14893 - MOVE_OVERHEAT, - MOVE_SUNNY_DAY, - MOVE_EXPLOSION, - MOVE_ATTRACT, - }, - }, - }, - }, -#line 14898 - [DIFFICULTY_NORMAL][TRAINER_FLANNERY_5] = - { -#line 14899 - .trainerName = _("FLANNERY"), -#line 14900 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14901 - .trainerPic = TRAINER_PIC_LEADER_FLANNERY, - .encounterMusic_gender = -#line 14902 -F_TRAINER_FEMALE | -#line 14903 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14904 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14905 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14906 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 14908 - .species = SPECIES_ARCANINE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14910 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14909 - .lvl = 51, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14911 - MOVE_HELPING_HAND, - MOVE_FLAMETHROWER, - MOVE_SUNNY_DAY, - MOVE_ROAR, - }, - }, - { -#line 14916 - .species = SPECIES_MAGCARGO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14916 - .heldItem = ITEM_WHITE_HERB, -#line 14918 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14917 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14919 - MOVE_OVERHEAT, - MOVE_ATTRACT, - MOVE_LIGHT_SCREEN, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14924 - .species = SPECIES_HOUNDOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14926 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14925 - .lvl = 51, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14927 - MOVE_ROAR, - MOVE_SOLAR_BEAM, - MOVE_TAUNT, - MOVE_SUNNY_DAY, - }, - }, - { -#line 14932 - .species = SPECIES_RAPIDASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14934 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14933 - .lvl = 51, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14935 - MOVE_FLAMETHROWER, - MOVE_ATTRACT, - MOVE_SOLAR_BEAM, - MOVE_BOUNCE, - }, - }, - { -#line 14940 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14940 - .heldItem = ITEM_WHITE_HERB, -#line 14942 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14941 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14943 - MOVE_OVERHEAT, - MOVE_SUNNY_DAY, - MOVE_EARTHQUAKE, - MOVE_ATTRACT, - }, - }, - { -#line 14948 - .species = SPECIES_TORKOAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14948 - .heldItem = ITEM_WHITE_HERB, -#line 14950 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14949 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14951 - MOVE_OVERHEAT, - MOVE_SUNNY_DAY, - MOVE_EXPLOSION, - MOVE_ATTRACT, - }, - }, - }, - }, -#line 14956 - [DIFFICULTY_NORMAL][TRAINER_NORMAN_2] = - { -#line 14957 - .trainerName = _("NORMAN"), -#line 14958 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14959 - .trainerPic = TRAINER_PIC_LEADER_NORMAN, - .encounterMusic_gender = -#line 14961 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14962 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14963 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14964 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 14966 - .species = SPECIES_CHANSEY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14968 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14967 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14969 - MOVE_LIGHT_SCREEN, - MOVE_SING, - MOVE_SKILL_SWAP, - MOVE_FOCUS_PUNCH, - }, - }, - { -#line 14974 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14974 - .heldItem = ITEM_SITRUS_BERRY, -#line 14976 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14975 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14977 - MOVE_BLIZZARD, - MOVE_SHADOW_BALL, - MOVE_DOUBLE_EDGE, - MOVE_FIRE_BLAST, - }, - }, - { -#line 14982 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14984 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14983 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14985 - MOVE_TEETER_DANCE, - MOVE_SKILL_SWAP, - MOVE_FACADE, - MOVE_HYPNOSIS, - }, - }, - { -#line 14990 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14990 - .heldItem = ITEM_SITRUS_BERRY, -#line 14992 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14991 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14993 - MOVE_HYPER_BEAM, - MOVE_FLAMETHROWER, - MOVE_THUNDERBOLT, - MOVE_SHADOW_BALL, - }, - }, - }, - }, -#line 14998 - [DIFFICULTY_NORMAL][TRAINER_NORMAN_3] = - { -#line 14999 - .trainerName = _("NORMAN"), -#line 15000 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15001 - .trainerPic = TRAINER_PIC_LEADER_NORMAN, - .encounterMusic_gender = -#line 15003 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15004 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15005 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15006 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 15008 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15008 - .heldItem = ITEM_SITRUS_BERRY, -#line 15010 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15009 - .lvl = 47, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15011 - MOVE_BLIZZARD, - MOVE_SHADOW_BALL, - MOVE_DOUBLE_EDGE, - MOVE_FIRE_BLAST, - }, - }, - { -#line 15016 - .species = SPECIES_CHANSEY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15018 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15017 - .lvl = 47, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15019 - MOVE_LIGHT_SCREEN, - MOVE_SING, - MOVE_SKILL_SWAP, - MOVE_FOCUS_PUNCH, - }, - }, - { -#line 15024 - .species = SPECIES_KANGASKHAN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15026 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15025 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15027 - MOVE_FAKE_OUT, - MOVE_DIZZY_PUNCH, - MOVE_ENDURE, - MOVE_REVERSAL, - }, - }, - { -#line 15032 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15034 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15033 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15035 - MOVE_TEETER_DANCE, - MOVE_SKILL_SWAP, - MOVE_FACADE, - MOVE_HYPNOSIS, - }, - }, - { -#line 15040 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15040 - .heldItem = ITEM_SITRUS_BERRY, -#line 15042 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15041 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15043 - MOVE_HYPER_BEAM, - MOVE_FLAMETHROWER, - MOVE_THUNDERBOLT, - MOVE_SHADOW_BALL, - }, - }, - }, - }, -#line 15048 - [DIFFICULTY_NORMAL][TRAINER_NORMAN_4] = - { -#line 15049 - .trainerName = _("NORMAN"), -#line 15050 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15051 - .trainerPic = TRAINER_PIC_LEADER_NORMAN, - .encounterMusic_gender = -#line 15053 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15054 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15055 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15056 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 15058 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15058 - .heldItem = ITEM_SITRUS_BERRY, -#line 15060 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15059 - .lvl = 52, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15061 - MOVE_BLIZZARD, - MOVE_SHADOW_BALL, - MOVE_DOUBLE_EDGE, - MOVE_FIRE_BLAST, - }, - }, - { -#line 15066 - .species = SPECIES_BLISSEY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15068 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15067 - .lvl = 52, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15069 - MOVE_LIGHT_SCREEN, - MOVE_SING, - MOVE_SKILL_SWAP, - MOVE_FOCUS_PUNCH, - }, - }, - { -#line 15074 - .species = SPECIES_KANGASKHAN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15076 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15075 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15077 - MOVE_FAKE_OUT, - MOVE_DIZZY_PUNCH, - MOVE_ENDURE, - MOVE_REVERSAL, - }, - }, - { -#line 15082 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15084 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15083 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15085 - MOVE_TEETER_DANCE, - MOVE_SKILL_SWAP, - MOVE_FACADE, - MOVE_HYPNOSIS, - }, - }, - { -#line 15090 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15090 - .heldItem = ITEM_SITRUS_BERRY, -#line 15092 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15091 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15093 - MOVE_HYPER_BEAM, - MOVE_FLAMETHROWER, - MOVE_THUNDERBOLT, - MOVE_SHADOW_BALL, - }, - }, - }, - }, -#line 15098 - [DIFFICULTY_NORMAL][TRAINER_NORMAN_5] = - { -#line 15099 - .trainerName = _("NORMAN"), -#line 15100 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15101 - .trainerPic = TRAINER_PIC_LEADER_NORMAN, - .encounterMusic_gender = -#line 15103 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15104 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15105 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15106 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 15108 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15108 - .heldItem = ITEM_SITRUS_BERRY, -#line 15110 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15109 - .lvl = 57, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15111 - MOVE_BLIZZARD, - MOVE_SHADOW_BALL, - MOVE_DOUBLE_EDGE, - MOVE_FIRE_BLAST, - }, - }, - { -#line 15116 - .species = SPECIES_BLISSEY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15118 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15117 - .lvl = 57, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15119 - MOVE_PROTECT, - MOVE_SING, - MOVE_SKILL_SWAP, - MOVE_FOCUS_PUNCH, - }, - }, - { -#line 15124 - .species = SPECIES_KANGASKHAN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15126 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15125 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15127 - MOVE_FAKE_OUT, - MOVE_DIZZY_PUNCH, - MOVE_ENDURE, - MOVE_REVERSAL, - }, - }, - { -#line 15132 - .species = SPECIES_TAUROS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15134 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15133 - .lvl = 57, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15135 - MOVE_TAKE_DOWN, - MOVE_PROTECT, - MOVE_FIRE_BLAST, - MOVE_EARTHQUAKE, - }, - }, - { -#line 15140 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15142 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15141 - .lvl = 58, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15143 - MOVE_TEETER_DANCE, - MOVE_SKILL_SWAP, - MOVE_FACADE, - MOVE_HYPNOSIS, - }, - }, - { -#line 15148 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15148 - .heldItem = ITEM_SITRUS_BERRY, -#line 15150 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15149 - .lvl = 60, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15151 - MOVE_HYPER_BEAM, - MOVE_FLAMETHROWER, - MOVE_THUNDERBOLT, - MOVE_SHADOW_BALL, - }, - }, - }, - }, -#line 15156 - [DIFFICULTY_NORMAL][TRAINER_WINONA_2] = - { -#line 15157 - .trainerName = _("WINONA"), -#line 15158 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15159 - .trainerPic = TRAINER_PIC_LEADER_WINONA, - .encounterMusic_gender = -#line 15160 -F_TRAINER_FEMALE | -#line 15161 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15162 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15163 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15164 - .aiFlags = AI_FLAG_BASIC_TRAINER | AI_FLAG_RISKY, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 15166 - .species = SPECIES_DRATINI, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15166 - .heldItem = ITEM_SITRUS_BERRY, -#line 15168 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15167 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15169 - MOVE_THUNDER_WAVE, - MOVE_THUNDERBOLT, - MOVE_PROTECT, - MOVE_ICE_BEAM, - }, - }, - { -#line 15174 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15176 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15175 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15177 - MOVE_SUNNY_DAY, - MOVE_AERIAL_ACE, - MOVE_SOLAR_BEAM, - MOVE_EARTHQUAKE, - }, - }, - { -#line 15182 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15184 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15183 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15185 - MOVE_SURF, - MOVE_SUPERSONIC, - MOVE_PROTECT, - MOVE_AERIAL_ACE, - }, - }, - { -#line 15190 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15192 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15191 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15193 - MOVE_WHIRLWIND, - MOVE_SPIKES, - MOVE_STEEL_WING, - MOVE_AERIAL_ACE, - }, - }, - { -#line 15198 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15198 - .heldItem = ITEM_CHESTO_BERRY, -#line 15200 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15199 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15201 - MOVE_AERIAL_ACE, - MOVE_REST, - MOVE_DRAGON_DANCE, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 15206 - [DIFFICULTY_NORMAL][TRAINER_WINONA_3] = - { -#line 15207 - .trainerName = _("WINONA"), -#line 15208 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15209 - .trainerPic = TRAINER_PIC_LEADER_WINONA, - .encounterMusic_gender = -#line 15210 -F_TRAINER_FEMALE | -#line 15211 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15212 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15213 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15214 - .aiFlags = AI_FLAG_BASIC_TRAINER | AI_FLAG_RISKY, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 15216 - .species = SPECIES_HOOTHOOT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15218 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15217 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15219 - MOVE_HYPNOSIS, - MOVE_PSYCHIC, - MOVE_REFLECT, - MOVE_DREAM_EATER, - }, - }, - { -#line 15224 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15226 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15225 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15227 - MOVE_SUNNY_DAY, - MOVE_AERIAL_ACE, - MOVE_SOLAR_BEAM, - MOVE_EARTHQUAKE, - }, - }, - { -#line 15232 - .species = SPECIES_DRAGONAIR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15232 - .heldItem = ITEM_SITRUS_BERRY, -#line 15234 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15233 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15235 - MOVE_THUNDER_WAVE, - MOVE_THUNDERBOLT, - MOVE_PROTECT, - MOVE_ICE_BEAM, - }, - }, - { -#line 15240 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15242 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15241 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15243 - MOVE_SURF, - MOVE_SUPERSONIC, - MOVE_PROTECT, - MOVE_AERIAL_ACE, - }, - }, - { -#line 15248 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15250 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15249 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15251 - MOVE_WHIRLWIND, - MOVE_SPIKES, - MOVE_STEEL_WING, - MOVE_AERIAL_ACE, - }, - }, - { -#line 15256 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15256 - .heldItem = ITEM_CHESTO_BERRY, -#line 15258 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15257 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15259 - MOVE_AERIAL_ACE, - MOVE_REST, - MOVE_DRAGON_DANCE, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 15264 - [DIFFICULTY_NORMAL][TRAINER_WINONA_4] = - { -#line 15265 - .trainerName = _("WINONA"), -#line 15266 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15267 - .trainerPic = TRAINER_PIC_LEADER_WINONA, - .encounterMusic_gender = -#line 15268 -F_TRAINER_FEMALE | -#line 15269 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15270 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15271 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15272 - .aiFlags = AI_FLAG_BASIC_TRAINER | AI_FLAG_RISKY, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 15274 - .species = SPECIES_NOCTOWL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15276 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15275 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15277 - MOVE_HYPNOSIS, - MOVE_PSYCHIC, - MOVE_REFLECT, - MOVE_DREAM_EATER, - }, - }, - { -#line 15282 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15284 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15283 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15285 - MOVE_SUNNY_DAY, - MOVE_AERIAL_ACE, - MOVE_SOLAR_BEAM, - MOVE_EARTHQUAKE, - }, - }, - { -#line 15290 - .species = SPECIES_DRAGONAIR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15290 - .heldItem = ITEM_SITRUS_BERRY, -#line 15292 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15291 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15293 - MOVE_THUNDER_WAVE, - MOVE_THUNDERBOLT, - MOVE_PROTECT, - MOVE_ICE_BEAM, - }, - }, - { -#line 15298 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15300 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15299 - .lvl = 51, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15301 - MOVE_SURF, - MOVE_SUPERSONIC, - MOVE_PROTECT, - MOVE_AERIAL_ACE, - }, - }, - { -#line 15306 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15308 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15307 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15309 - MOVE_WHIRLWIND, - MOVE_SPIKES, - MOVE_STEEL_WING, - MOVE_AERIAL_ACE, - }, - }, - { -#line 15314 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15314 - .heldItem = ITEM_CHESTO_BERRY, -#line 15316 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15315 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15317 - MOVE_AERIAL_ACE, - MOVE_REST, - MOVE_DRAGON_DANCE, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 15322 - [DIFFICULTY_NORMAL][TRAINER_WINONA_5] = - { -#line 15323 - .trainerName = _("WINONA"), -#line 15324 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15325 - .trainerPic = TRAINER_PIC_LEADER_WINONA, - .encounterMusic_gender = -#line 15326 -F_TRAINER_FEMALE | -#line 15327 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15328 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15329 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15330 - .aiFlags = AI_FLAG_BASIC_TRAINER | AI_FLAG_RISKY, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 15332 - .species = SPECIES_NOCTOWL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15334 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15333 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15335 - MOVE_HYPNOSIS, - MOVE_PSYCHIC, - MOVE_REFLECT, - MOVE_DREAM_EATER, - }, - }, - { -#line 15340 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15342 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15341 - .lvl = 54, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15343 - MOVE_SUNNY_DAY, - MOVE_AERIAL_ACE, - MOVE_SOLAR_BEAM, - MOVE_EARTHQUAKE, - }, - }, - { -#line 15348 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15350 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15349 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15351 - MOVE_SURF, - MOVE_SUPERSONIC, - MOVE_PROTECT, - MOVE_AERIAL_ACE, - }, - }, - { -#line 15356 - .species = SPECIES_DRAGONITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15356 - .heldItem = ITEM_SITRUS_BERRY, -#line 15358 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15357 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15359 - MOVE_HYPER_BEAM, - MOVE_THUNDERBOLT, - MOVE_EARTHQUAKE, - MOVE_ICE_BEAM, - }, - }, - { -#line 15364 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15366 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15365 - .lvl = 58, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15367 - MOVE_WHIRLWIND, - MOVE_SPIKES, - MOVE_STEEL_WING, - MOVE_AERIAL_ACE, - }, - }, - { -#line 15372 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15372 - .heldItem = ITEM_CHESTO_BERRY, -#line 15374 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15373 - .lvl = 60, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15375 - MOVE_SKY_ATTACK, - MOVE_REST, - MOVE_DRAGON_DANCE, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 15380 - [DIFFICULTY_NORMAL][TRAINER_TATE_AND_LIZA_2] = - { -#line 15381 - .trainerName = _("TATE&LIZA"), -#line 15382 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15383 - .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, - .encounterMusic_gender = -#line 15385 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15386 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15387 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15388 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 15390 - .species = SPECIES_SLOWPOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15392 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15391 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15393 - MOVE_YAWN, - MOVE_PSYCHIC, - MOVE_CALM_MIND, - MOVE_PROTECT, - }, - }, - { -#line 15398 - .species = SPECIES_CLAYDOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15400 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15399 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15401 - MOVE_EARTHQUAKE, - MOVE_ANCIENT_POWER, - MOVE_PSYCHIC, - MOVE_LIGHT_SCREEN, - }, - }, - { -#line 15406 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15406 - .heldItem = ITEM_CHESTO_BERRY, -#line 15408 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15407 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15409 - MOVE_PSYCHIC, - MOVE_REST, - MOVE_CONFUSE_RAY, - MOVE_CALM_MIND, - }, - }, - { -#line 15414 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15414 - .heldItem = ITEM_CHESTO_BERRY, -#line 15416 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15415 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15417 - MOVE_EARTHQUAKE, - MOVE_PSYCHIC, - MOVE_REST, - MOVE_CALM_MIND, - }, - }, - { -#line 15422 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15422 - .heldItem = ITEM_SITRUS_BERRY, -#line 15424 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15423 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15425 - MOVE_SUNNY_DAY, - MOVE_SOLAR_BEAM, - MOVE_PSYCHIC, - MOVE_FLAMETHROWER, - }, - }, - }, - }, -#line 15430 - [DIFFICULTY_NORMAL][TRAINER_TATE_AND_LIZA_3] = - { -#line 15431 - .trainerName = _("TATE&LIZA"), -#line 15432 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15433 - .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, - .encounterMusic_gender = -#line 15435 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15436 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15437 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15438 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 15440 - .species = SPECIES_DROWZEE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15442 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15441 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15443 - MOVE_HYPNOSIS, - MOVE_DREAM_EATER, - MOVE_HEADBUTT, - MOVE_PROTECT, - }, - }, - { -#line 15448 - .species = SPECIES_SLOWPOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15450 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15449 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15451 - MOVE_YAWN, - MOVE_PSYCHIC, - MOVE_CALM_MIND, - MOVE_PROTECT, - }, - }, - { -#line 15456 - .species = SPECIES_CLAYDOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15458 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15457 - .lvl = 54, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15459 - MOVE_EARTHQUAKE, - MOVE_EXPLOSION, - MOVE_PSYCHIC, - MOVE_LIGHT_SCREEN, - }, - }, - { -#line 15464 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15464 - .heldItem = ITEM_CHESTO_BERRY, -#line 15466 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15465 - .lvl = 54, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15467 - MOVE_PSYCHIC, - MOVE_REST, - MOVE_CONFUSE_RAY, - MOVE_CALM_MIND, - }, - }, - { -#line 15472 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15472 - .heldItem = ITEM_CHESTO_BERRY, -#line 15474 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15473 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15475 - MOVE_EARTHQUAKE, - MOVE_PSYCHIC, - MOVE_REST, - MOVE_CALM_MIND, - }, - }, - { -#line 15480 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15480 - .heldItem = ITEM_SITRUS_BERRY, -#line 15482 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15481 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15483 - MOVE_SUNNY_DAY, - MOVE_SOLAR_BEAM, - MOVE_PSYCHIC, - MOVE_FLAMETHROWER, - }, - }, - }, - }, -#line 15488 - [DIFFICULTY_NORMAL][TRAINER_TATE_AND_LIZA_4] = - { -#line 15489 - .trainerName = _("TATE&LIZA"), -#line 15490 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15491 - .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, - .encounterMusic_gender = -#line 15493 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15494 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15495 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15496 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 15498 - .species = SPECIES_HYPNO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15500 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15499 - .lvl = 58, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15501 - MOVE_HYPNOSIS, - MOVE_DREAM_EATER, - MOVE_HEADBUTT, - MOVE_PROTECT, - }, - }, - { -#line 15506 - .species = SPECIES_CLAYDOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15508 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15507 - .lvl = 59, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15509 - MOVE_EARTHQUAKE, - MOVE_EXPLOSION, - MOVE_PSYCHIC, - MOVE_LIGHT_SCREEN, - }, - }, - { -#line 15514 - .species = SPECIES_SLOWPOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15516 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15515 - .lvl = 58, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15517 - MOVE_YAWN, - MOVE_PSYCHIC, - MOVE_CALM_MIND, - MOVE_PROTECT, - }, - }, - { -#line 15522 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15522 - .heldItem = ITEM_CHESTO_BERRY, -#line 15524 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15523 - .lvl = 59, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15525 - MOVE_PSYCHIC, - MOVE_REST, - MOVE_CONFUSE_RAY, - MOVE_CALM_MIND, - }, - }, - { -#line 15530 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15530 - .heldItem = ITEM_CHESTO_BERRY, -#line 15532 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15531 - .lvl = 60, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15533 - MOVE_EARTHQUAKE, - MOVE_PSYCHIC, - MOVE_REST, - MOVE_CALM_MIND, - }, - }, - { -#line 15538 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15538 - .heldItem = ITEM_SITRUS_BERRY, -#line 15540 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15539 - .lvl = 60, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15541 - MOVE_SUNNY_DAY, - MOVE_SOLAR_BEAM, - MOVE_PSYCHIC, - MOVE_FLAMETHROWER, - }, - }, - }, - }, -#line 15546 - [DIFFICULTY_NORMAL][TRAINER_TATE_AND_LIZA_5] = - { -#line 15547 - .trainerName = _("TATE&LIZA"), -#line 15548 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15549 - .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, - .encounterMusic_gender = -#line 15551 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15552 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15553 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15554 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 15556 - .species = SPECIES_HYPNO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15558 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15557 - .lvl = 63, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15559 - MOVE_HYPNOSIS, - MOVE_DREAM_EATER, - MOVE_HEADBUTT, - MOVE_PROTECT, - }, - }, - { -#line 15564 - .species = SPECIES_CLAYDOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15566 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15565 - .lvl = 64, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15567 - MOVE_EARTHQUAKE, - MOVE_EXPLOSION, - MOVE_PSYCHIC, - MOVE_LIGHT_SCREEN, - }, - }, - { -#line 15572 - .species = SPECIES_SLOWKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15574 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15573 - .lvl = 63, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15575 - MOVE_YAWN, - MOVE_PSYCHIC, - MOVE_CALM_MIND, - MOVE_PROTECT, - }, - }, - { -#line 15580 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15580 - .heldItem = ITEM_CHESTO_BERRY, -#line 15582 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15581 - .lvl = 64, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15583 - MOVE_PSYCHIC, - MOVE_REST, - MOVE_CONFUSE_RAY, - MOVE_CALM_MIND, - }, - }, - { -#line 15588 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15588 - .heldItem = ITEM_CHESTO_BERRY, -#line 15590 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15589 - .lvl = 65, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15591 - MOVE_EARTHQUAKE, - MOVE_PSYCHIC, - MOVE_REST, - MOVE_CALM_MIND, - }, - }, - { -#line 15596 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15596 - .heldItem = ITEM_SITRUS_BERRY, -#line 15598 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15597 - .lvl = 65, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15599 - MOVE_SUNNY_DAY, - MOVE_SOLAR_BEAM, - MOVE_PSYCHIC, - MOVE_FLAMETHROWER, - }, - }, - }, - }, -#line 15604 - [DIFFICULTY_NORMAL][TRAINER_JUAN_2] = - { -#line 15605 - .trainerName = _("JUAN"), -#line 15606 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15607 - .trainerPic = TRAINER_PIC_LEADER_JUAN, - .encounterMusic_gender = -#line 15609 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15610 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15611 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15612 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 15614 - .species = SPECIES_POLIWAG, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15616 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15615 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15617 - MOVE_HYPNOSIS, - MOVE_RAIN_DANCE, - MOVE_PROTECT, - MOVE_HYDRO_PUMP, - }, - }, - { -#line 15622 - .species = SPECIES_WHISCASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15624 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15623 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15625 - MOVE_RAIN_DANCE, - MOVE_WATER_PULSE, - MOVE_DOUBLE_TEAM, - MOVE_FISSURE, - }, - }, - { -#line 15630 - .species = SPECIES_WALREIN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15632 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15631 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15633 - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_PROTECT, - MOVE_ICE_BEAM, - }, - }, - { -#line 15638 - .species = SPECIES_CRAWDAUNT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15638 - .heldItem = ITEM_CHESTO_BERRY, -#line 15640 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15639 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15641 - MOVE_REST, - MOVE_CRABHAMMER, - MOVE_TAUNT, - MOVE_DOUBLE_TEAM, - }, - }, - { -#line 15646 - .species = SPECIES_KINGDRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15646 - .heldItem = ITEM_CHESTO_BERRY, -#line 15648 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15647 - .lvl = 51, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15649 - MOVE_WATER_PULSE, - MOVE_DOUBLE_TEAM, - MOVE_ICE_BEAM, - MOVE_REST, - }, - }, - }, - }, -#line 15654 - [DIFFICULTY_NORMAL][TRAINER_JUAN_3] = - { -#line 15655 - .trainerName = _("JUAN"), -#line 15656 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15657 - .trainerPic = TRAINER_PIC_LEADER_JUAN, - .encounterMusic_gender = -#line 15659 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15660 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15661 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15662 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 15664 - .species = SPECIES_POLIWHIRL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15666 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15665 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15667 - MOVE_HYPNOSIS, - MOVE_RAIN_DANCE, - MOVE_PROTECT, - MOVE_HYDRO_PUMP, - }, - }, - { -#line 15672 - .species = SPECIES_WHISCASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15674 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15673 - .lvl = 51, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15675 - MOVE_RAIN_DANCE, - MOVE_WATER_PULSE, - MOVE_DOUBLE_TEAM, - MOVE_FISSURE, - }, - }, - { -#line 15680 - .species = SPECIES_WALREIN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15682 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15681 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15683 - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_PROTECT, - MOVE_ICE_BEAM, - }, - }, - { -#line 15688 - .species = SPECIES_CRAWDAUNT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15688 - .heldItem = ITEM_CHESTO_BERRY, -#line 15690 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15689 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15691 - MOVE_REST, - MOVE_GUILLOTINE, - MOVE_TAUNT, - MOVE_DOUBLE_TEAM, - }, - }, - { -#line 15696 - .species = SPECIES_KINGDRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15696 - .heldItem = ITEM_CHESTO_BERRY, -#line 15698 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15697 - .lvl = 56, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15699 - MOVE_WATER_PULSE, - MOVE_DOUBLE_TEAM, - MOVE_ICE_BEAM, - MOVE_REST, - }, - }, - }, - }, -#line 15704 - [DIFFICULTY_NORMAL][TRAINER_JUAN_4] = - { -#line 15705 - .trainerName = _("JUAN"), -#line 15706 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15707 - .trainerPic = TRAINER_PIC_LEADER_JUAN, - .encounterMusic_gender = -#line 15709 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15710 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15711 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15712 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 15714 - .species = SPECIES_LAPRAS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15716 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15715 - .lvl = 56, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15717 - MOVE_HYDRO_PUMP, - MOVE_PERISH_SONG, - MOVE_ICE_BEAM, - MOVE_CONFUSE_RAY, - }, - }, - { -#line 15722 - .species = SPECIES_WHISCASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15724 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15723 - .lvl = 58, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15725 - MOVE_RAIN_DANCE, - MOVE_WATER_PULSE, - MOVE_DOUBLE_TEAM, - MOVE_FISSURE, - }, - }, - { -#line 15730 - .species = SPECIES_POLIWHIRL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15732 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15731 - .lvl = 56, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15733 - MOVE_HYPNOSIS, - MOVE_RAIN_DANCE, - MOVE_PROTECT, - MOVE_HYDRO_PUMP, - }, - }, - { -#line 15738 - .species = SPECIES_WALREIN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15740 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15739 - .lvl = 58, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15741 - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_PROTECT, - MOVE_ICE_BEAM, - }, - }, - { -#line 15746 - .species = SPECIES_CRAWDAUNT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15746 - .heldItem = ITEM_CHESTO_BERRY, -#line 15748 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15747 - .lvl = 58, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15749 - MOVE_REST, - MOVE_GUILLOTINE, - MOVE_TAUNT, - MOVE_DOUBLE_TEAM, - }, - }, - { -#line 15754 - .species = SPECIES_KINGDRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15754 - .heldItem = ITEM_CHESTO_BERRY, -#line 15756 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15755 - .lvl = 61, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15757 - MOVE_WATER_PULSE, - MOVE_DOUBLE_TEAM, - MOVE_ICE_BEAM, - MOVE_REST, - }, - }, - }, - }, -#line 15762 - [DIFFICULTY_NORMAL][TRAINER_JUAN_5] = - { -#line 15763 - .trainerName = _("JUAN"), -#line 15764 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15765 - .trainerPic = TRAINER_PIC_LEADER_JUAN, - .encounterMusic_gender = -#line 15767 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15768 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15769 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15770 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 15772 - .species = SPECIES_LAPRAS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15774 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15773 - .lvl = 61, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15775 - MOVE_HYDRO_PUMP, - MOVE_PERISH_SONG, - MOVE_ICE_BEAM, - MOVE_CONFUSE_RAY, - }, - }, - { -#line 15780 - .species = SPECIES_WHISCASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15782 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15781 - .lvl = 63, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15783 - MOVE_RAIN_DANCE, - MOVE_WATER_PULSE, - MOVE_DOUBLE_TEAM, - MOVE_FISSURE, - }, - }, - { -#line 15788 - .species = SPECIES_POLITOED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15790 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15789 - .lvl = 61, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15791 - MOVE_HYPNOSIS, - MOVE_RAIN_DANCE, - MOVE_HYDRO_PUMP, - MOVE_PERISH_SONG, - }, - }, - { -#line 15796 - .species = SPECIES_WALREIN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15798 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15797 - .lvl = 63, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15799 - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_PROTECT, - MOVE_SHEER_COLD, - }, - }, - { -#line 15804 - .species = SPECIES_CRAWDAUNT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15804 - .heldItem = ITEM_CHESTO_BERRY, -#line 15806 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15805 - .lvl = 63, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15807 - MOVE_REST, - MOVE_GUILLOTINE, - MOVE_TAUNT, - MOVE_DOUBLE_TEAM, - }, - }, - { -#line 15812 - .species = SPECIES_KINGDRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15812 - .heldItem = ITEM_CHESTO_BERRY, -#line 15814 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15813 - .lvl = 66, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15815 - MOVE_WATER_PULSE, - MOVE_DOUBLE_TEAM, - MOVE_ICE_BEAM, - MOVE_REST, - }, - }, - }, - }, -#line 15820 - [DIFFICULTY_NORMAL][TRAINER_ANGELO] = - { -#line 15821 - .trainerName = _("ANGELO"), -#line 15822 - .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 15823 - .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = -#line 15825 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 15826 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 15827 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 15829 - .species = SPECIES_ILLUMISE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15831 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 15830 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15832 - MOVE_SHOCK_WAVE, - MOVE_QUICK_ATTACK, - MOVE_CHARM, - }, - }, - { -#line 15836 - .species = SPECIES_VOLBEAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15838 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 15837 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15839 - MOVE_SHOCK_WAVE, - MOVE_QUICK_ATTACK, - MOVE_CONFUSE_RAY, - }, - }, - }, - }, -#line 15843 - [DIFFICULTY_NORMAL][TRAINER_DARIUS] = - { -#line 15844 - .trainerName = _("DARIUS"), -#line 15845 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 15846 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 15848 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 15849 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 15850 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 15852 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15854 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 15853 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 15856 - [DIFFICULTY_NORMAL][TRAINER_STEVEN] = - { -#line 15857 - .trainerName = _("STEVEN"), -#line 15858 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 15859 - .trainerPic = TRAINER_PIC_STEVEN, - .encounterMusic_gender = -#line 15861 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15862 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15863 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 15864 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 15866 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15868 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15867 - .lvl = 77, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15869 - MOVE_TOXIC, - MOVE_AERIAL_ACE, - MOVE_SPIKES, - MOVE_STEEL_WING, - }, - }, - { -#line 15874 - .species = SPECIES_CLAYDOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15876 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15875 - .lvl = 75, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15877 - MOVE_REFLECT, - MOVE_LIGHT_SCREEN, - MOVE_ANCIENT_POWER, - MOVE_EARTHQUAKE, - }, - }, - { -#line 15882 - .species = SPECIES_AGGRON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15884 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15883 - .lvl = 76, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15885 - MOVE_THUNDER, - MOVE_EARTHQUAKE, - MOVE_SOLAR_BEAM, - MOVE_DRAGON_CLAW, - }, - }, - { -#line 15890 - .species = SPECIES_CRADILY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15892 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15891 - .lvl = 76, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15893 - MOVE_GIGA_DRAIN, - MOVE_ANCIENT_POWER, - MOVE_INGRAIN, - MOVE_CONFUSE_RAY, - }, - }, - { -#line 15898 - .species = SPECIES_ARMALDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15900 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15899 - .lvl = 76, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15901 - MOVE_WATER_PULSE, - MOVE_ANCIENT_POWER, - MOVE_AERIAL_ACE, - MOVE_SLASH, - }, - }, - { -#line 15906 - .species = SPECIES_METAGROSS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15906 - .heldItem = ITEM_SITRUS_BERRY, -#line 15908 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15907 - .lvl = 78, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15909 - MOVE_EARTHQUAKE, - MOVE_PSYCHIC, - MOVE_METEOR_MASH, - MOVE_SHADOW_BALL, - }, - }, - }, - }, -#line 15914 - [DIFFICULTY_NORMAL][TRAINER_ANABEL] = - { -#line 15915 - .trainerName = _("ANABEL"), -#line 15916 - .trainerClass = TRAINER_CLASS_SALON_MAIDEN, -#line 15917 - .trainerPic = TRAINER_PIC_SALON_MAIDEN_ANABEL, - .encounterMusic_gender = -#line 15918 -F_TRAINER_FEMALE | -#line 15919 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15920 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 15921 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 15923 - .species = SPECIES_BELDUM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15925 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 15924 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 15927 - [DIFFICULTY_NORMAL][TRAINER_TUCKER] = - { -#line 15928 - .trainerName = _("TUCKER"), -#line 15929 - .trainerClass = TRAINER_CLASS_DOME_ACE, -#line 15930 - .trainerPic = TRAINER_PIC_DOME_ACE_TUCKER, - .encounterMusic_gender = -#line 15932 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15933 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 15934 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 15936 - .species = SPECIES_BELDUM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15938 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 15937 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 15940 - [DIFFICULTY_NORMAL][TRAINER_SPENSER] = - { -#line 15941 - .trainerName = _("SPENSER"), -#line 15942 - .trainerClass = TRAINER_CLASS_PALACE_MAVEN, -#line 15943 - .trainerPic = TRAINER_PIC_PALACE_MAVEN_SPENSER, - .encounterMusic_gender = -#line 15945 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15946 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 15947 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 15949 - .species = SPECIES_BELDUM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15951 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 15950 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 15953 - [DIFFICULTY_NORMAL][TRAINER_GRETA] = - { -#line 15954 - .trainerName = _("GRETA"), -#line 15955 - .trainerClass = TRAINER_CLASS_ARENA_TYCOON, -#line 15956 - .trainerPic = TRAINER_PIC_ARENA_TYCOON_GRETA, - .encounterMusic_gender = -#line 15957 -F_TRAINER_FEMALE | -#line 15958 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15959 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 15960 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 15962 - .species = SPECIES_BELDUM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15964 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 15963 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 15966 - [DIFFICULTY_NORMAL][TRAINER_NOLAND] = - { -#line 15967 - .trainerName = _("NOLAND"), -#line 15968 - .trainerClass = TRAINER_CLASS_FACTORY_HEAD, -#line 15969 - .trainerPic = TRAINER_PIC_FACTORY_HEAD_NOLAND, - .encounterMusic_gender = -#line 15971 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15972 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 15973 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 15975 - .species = SPECIES_BELDUM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15977 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 15976 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 15979 - [DIFFICULTY_NORMAL][TRAINER_LUCY] = - { -#line 15980 - .trainerName = _("LUCY"), -#line 15981 - .trainerClass = TRAINER_CLASS_PIKE_QUEEN, -#line 15982 - .trainerPic = TRAINER_PIC_PIKE_QUEEN_LUCY, - .encounterMusic_gender = -#line 15983 -F_TRAINER_FEMALE | -#line 15984 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15985 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 15986 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 15988 - .species = SPECIES_BELDUM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15990 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 15989 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 15992 - [DIFFICULTY_NORMAL][TRAINER_BRANDON] = - { -#line 15993 - .trainerName = _("BRANDON"), -#line 15994 - .trainerClass = TRAINER_CLASS_PYRAMID_KING, -#line 15995 - .trainerPic = TRAINER_PIC_PYRAMID_KING_BRANDON, - .encounterMusic_gender = -#line 15997 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15998 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 15999 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 16001 - .species = SPECIES_BELDUM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16003 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16002 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16005 - [DIFFICULTY_NORMAL][TRAINER_ANDRES_2] = - { -#line 16006 - .trainerName = _("ANDRES"), -#line 16007 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 16008 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 16010 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 16011 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16012 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 16014 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16016 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16015 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16018 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16020 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16019 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16022 - [DIFFICULTY_NORMAL][TRAINER_ANDRES_3] = - { -#line 16023 - .trainerName = _("ANDRES"), -#line 16024 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 16025 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 16027 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 16028 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16029 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16031 - .species = SPECIES_NOSEPASS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16033 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16032 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16035 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16037 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16036 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16039 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16041 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16040 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16043 - [DIFFICULTY_NORMAL][TRAINER_ANDRES_4] = - { -#line 16044 - .trainerName = _("ANDRES"), -#line 16045 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 16046 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 16048 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 16049 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16050 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16052 - .species = SPECIES_NOSEPASS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16054 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16053 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16056 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16058 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16057 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16060 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16062 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16061 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16064 - [DIFFICULTY_NORMAL][TRAINER_ANDRES_5] = - { -#line 16065 - .trainerName = _("ANDRES"), -#line 16066 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 16067 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 16069 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 16070 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16071 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16073 - .species = SPECIES_NOSEPASS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16075 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16074 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16077 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16079 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16078 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16081 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16083 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16082 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16085 - [DIFFICULTY_NORMAL][TRAINER_CORY_2] = - { -#line 16086 - .trainerName = _("CORY"), -#line 16087 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 16088 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 16090 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16091 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16092 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16094 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16096 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16095 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16098 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16100 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16099 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16102 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16104 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16103 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16106 - [DIFFICULTY_NORMAL][TRAINER_CORY_3] = - { -#line 16107 - .trainerName = _("CORY"), -#line 16108 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 16109 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 16111 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16112 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16113 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16115 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16117 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16116 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16119 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16121 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16120 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16123 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16125 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16124 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16127 - [DIFFICULTY_NORMAL][TRAINER_CORY_4] = - { -#line 16128 - .trainerName = _("CORY"), -#line 16129 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 16130 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 16132 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16133 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16134 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16136 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16138 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16137 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16140 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16142 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16141 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16144 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16146 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16145 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16148 - [DIFFICULTY_NORMAL][TRAINER_CORY_5] = - { -#line 16149 - .trainerName = _("CORY"), -#line 16150 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 16151 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 16153 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16154 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16155 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16157 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16159 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16158 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16161 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16163 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16162 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16165 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16167 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16166 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16169 - [DIFFICULTY_NORMAL][TRAINER_PABLO_2] = - { -#line 16170 - .trainerName = _("PABLO"), -#line 16171 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 16172 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 16174 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 16175 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16176 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 16178 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16180 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16179 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16182 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16184 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16183 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16186 - [DIFFICULTY_NORMAL][TRAINER_PABLO_3] = - { -#line 16187 - .trainerName = _("PABLO"), -#line 16188 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 16189 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 16191 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 16192 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16193 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16195 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16197 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16196 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16199 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16201 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16200 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16203 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16205 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16204 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16207 - [DIFFICULTY_NORMAL][TRAINER_PABLO_4] = - { -#line 16208 - .trainerName = _("PABLO"), -#line 16209 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 16210 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 16212 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 16213 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16214 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16216 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16218 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16217 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16220 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16222 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16221 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16224 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16226 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16225 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16228 - [DIFFICULTY_NORMAL][TRAINER_PABLO_5] = - { -#line 16229 - .trainerName = _("PABLO"), -#line 16230 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 16231 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 16233 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 16234 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16235 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16237 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16239 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16238 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16241 - .species = SPECIES_STARMIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16243 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16242 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16245 - .species = SPECIES_STARMIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16247 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16246 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16249 - [DIFFICULTY_NORMAL][TRAINER_KOJI_2] = - { -#line 16250 - .trainerName = _("KOJI"), -#line 16251 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 16252 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 16254 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16255 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16256 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 16258 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16260 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16259 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16262 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16264 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16263 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16266 - [DIFFICULTY_NORMAL][TRAINER_KOJI_3] = - { -#line 16267 - .trainerName = _("KOJI"), -#line 16268 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 16269 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 16271 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16272 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16273 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16275 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16277 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16276 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16279 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16281 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16280 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16283 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16285 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16284 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16287 - [DIFFICULTY_NORMAL][TRAINER_KOJI_4] = - { -#line 16288 - .trainerName = _("KOJI"), -#line 16289 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 16290 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 16292 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16293 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16294 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16296 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16298 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16297 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16300 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16302 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16301 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16304 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16306 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16305 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16308 - [DIFFICULTY_NORMAL][TRAINER_KOJI_5] = - { -#line 16309 - .trainerName = _("KOJI"), -#line 16310 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 16311 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 16313 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16314 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16315 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16317 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16319 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16318 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16321 - .species = SPECIES_MACHAMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16323 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16322 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16325 - .species = SPECIES_MACHAMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16327 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16326 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16329 - [DIFFICULTY_NORMAL][TRAINER_CRISTIN_2] = - { -#line 16330 - .trainerName = _("CRISTIN"), -#line 16331 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 16332 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 16333 -F_TRAINER_FEMALE | -#line 16334 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 16335 - .items = { ITEM_HYPER_POTION }, -#line 16336 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16337 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 16339 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16341 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 16340 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16343 - .species = SPECIES_VIGOROTH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16345 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 16344 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16347 - [DIFFICULTY_NORMAL][TRAINER_CRISTIN_3] = - { -#line 16348 - .trainerName = _("CRISTIN"), -#line 16349 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 16350 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 16351 -F_TRAINER_FEMALE | -#line 16352 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 16353 - .items = { ITEM_HYPER_POTION }, -#line 16354 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16355 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16357 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16359 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 16358 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16361 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16363 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 16362 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16365 - .species = SPECIES_VIGOROTH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16367 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 16366 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16369 - [DIFFICULTY_NORMAL][TRAINER_CRISTIN_4] = - { -#line 16370 - .trainerName = _("CRISTIN"), -#line 16371 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 16372 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 16373 -F_TRAINER_FEMALE | -#line 16374 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 16375 - .items = { ITEM_HYPER_POTION }, -#line 16376 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16377 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16379 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16381 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 16380 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16383 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16385 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 16384 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16387 - .species = SPECIES_VIGOROTH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16389 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 16388 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16391 - [DIFFICULTY_NORMAL][TRAINER_CRISTIN_5] = - { -#line 16392 - .trainerName = _("CRISTIN"), -#line 16393 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 16394 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 16395 -F_TRAINER_FEMALE | -#line 16396 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 16397 - .items = { ITEM_HYPER_POTION }, -#line 16398 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16399 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16401 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16403 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 16402 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16405 - .species = SPECIES_EXPLOUD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16407 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 16406 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16409 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16411 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 16410 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16413 - [DIFFICULTY_NORMAL][TRAINER_FERNANDO_2] = - { -#line 16414 - .trainerName = _("FERNANDO"), -#line 16415 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 16416 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 16418 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16419 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16420 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16422 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16424 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16423 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16426 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16428 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16427 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16430 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16432 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16431 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16434 - [DIFFICULTY_NORMAL][TRAINER_FERNANDO_3] = - { -#line 16435 - .trainerName = _("FERNANDO"), -#line 16436 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 16437 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 16439 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16440 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16441 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16443 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16445 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16444 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16447 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16449 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16448 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16451 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16453 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16452 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16455 - [DIFFICULTY_NORMAL][TRAINER_FERNANDO_4] = - { -#line 16456 - .trainerName = _("FERNANDO"), -#line 16457 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 16458 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 16460 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16461 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16462 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16464 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16466 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16465 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16468 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16470 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16469 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16472 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16474 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16473 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16476 - [DIFFICULTY_NORMAL][TRAINER_FERNANDO_5] = - { -#line 16477 - .trainerName = _("FERNANDO"), -#line 16478 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 16479 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 16481 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16482 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16483 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16485 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16487 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16486 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16489 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16491 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16490 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16493 - .species = SPECIES_EXPLOUD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16495 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16494 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16497 - [DIFFICULTY_NORMAL][TRAINER_SAWYER_2] = - { -#line 16498 - .trainerName = _("SAWYER"), -#line 16499 - .trainerClass = TRAINER_CLASS_HIKER, -#line 16500 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 16502 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 16503 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16504 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 16506 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16508 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16507 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16510 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16512 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16511 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16514 - [DIFFICULTY_NORMAL][TRAINER_SAWYER_3] = - { -#line 16515 - .trainerName = _("SAWYER"), -#line 16516 - .trainerClass = TRAINER_CLASS_HIKER, -#line 16517 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 16519 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 16520 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16521 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16523 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16525 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16524 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16527 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16529 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16528 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16531 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16533 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16532 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16535 - [DIFFICULTY_NORMAL][TRAINER_SAWYER_4] = - { -#line 16536 - .trainerName = _("SAWYER"), -#line 16537 - .trainerClass = TRAINER_CLASS_HIKER, -#line 16538 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 16540 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 16541 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16542 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16544 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16546 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16545 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16548 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16550 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16549 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16552 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16554 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16553 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16556 - [DIFFICULTY_NORMAL][TRAINER_SAWYER_5] = - { -#line 16557 - .trainerName = _("SAWYER"), -#line 16558 - .trainerClass = TRAINER_CLASS_HIKER, -#line 16559 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 16561 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 16562 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16563 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16565 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16567 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16566 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16569 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16571 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16570 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16573 - .species = SPECIES_GOLEM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16575 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16574 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16577 - [DIFFICULTY_NORMAL][TRAINER_GABRIELLE_2] = - { -#line 16578 - .trainerName = _("GABRIELLE"), -#line 16579 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 16580 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 16581 -F_TRAINER_FEMALE | -#line 16582 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16583 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16584 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 16586 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16588 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16587 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16590 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16592 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16591 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16594 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16596 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16595 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16598 - .species = SPECIES_LOTAD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16600 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16599 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16602 - .species = SPECIES_SEEDOT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16604 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16603 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16606 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16608 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16607 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16610 - [DIFFICULTY_NORMAL][TRAINER_GABRIELLE_3] = - { -#line 16611 - .trainerName = _("GABRIELLE"), -#line 16612 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 16613 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 16614 -F_TRAINER_FEMALE | -#line 16615 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16616 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16617 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 16619 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16621 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16620 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16623 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16625 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16624 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16627 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16629 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16628 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16631 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16633 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16632 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16635 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16637 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16636 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16639 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16641 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16640 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16643 - [DIFFICULTY_NORMAL][TRAINER_GABRIELLE_4] = - { -#line 16644 - .trainerName = _("GABRIELLE"), -#line 16645 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 16646 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 16647 -F_TRAINER_FEMALE | -#line 16648 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16649 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16650 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 16652 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16654 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16653 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16656 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16658 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16657 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16660 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16662 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16661 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16664 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16666 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16665 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16668 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16670 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16669 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16672 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16674 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16673 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16676 - [DIFFICULTY_NORMAL][TRAINER_GABRIELLE_5] = - { -#line 16677 - .trainerName = _("GABRIELLE"), -#line 16678 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 16679 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 16680 -F_TRAINER_FEMALE | -#line 16681 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16682 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16683 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 16685 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16687 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16686 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16689 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16691 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16690 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16693 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16695 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16694 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16697 - .species = SPECIES_LUDICOLO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16699 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16698 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16701 - .species = SPECIES_SHIFTRY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16703 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16702 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16705 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16707 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16706 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16709 - [DIFFICULTY_NORMAL][TRAINER_THALIA_2] = - { -#line 16710 - .trainerName = _("THALIA"), -#line 16711 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 16712 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 16713 -F_TRAINER_FEMALE | -#line 16714 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16715 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16716 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 16718 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16720 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16719 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16722 - .species = SPECIES_HORSEA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16724 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16723 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16726 - [DIFFICULTY_NORMAL][TRAINER_THALIA_3] = - { -#line 16727 - .trainerName = _("THALIA"), -#line 16728 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 16729 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 16730 -F_TRAINER_FEMALE | -#line 16731 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16732 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16733 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16735 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16737 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16736 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16739 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16741 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16740 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16743 - .species = SPECIES_SEADRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16745 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16744 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16747 - [DIFFICULTY_NORMAL][TRAINER_THALIA_4] = - { -#line 16748 - .trainerName = _("THALIA"), -#line 16749 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 16750 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 16751 -F_TRAINER_FEMALE | -#line 16752 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16753 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16754 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16756 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16758 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16757 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16760 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16762 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16761 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16764 - .species = SPECIES_SEADRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16766 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16765 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16768 - [DIFFICULTY_NORMAL][TRAINER_THALIA_5] = - { -#line 16769 - .trainerName = _("THALIA"), -#line 16770 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 16771 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 16772 -F_TRAINER_FEMALE | -#line 16773 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16774 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16775 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16777 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16779 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16778 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16781 - .species = SPECIES_WAILORD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16783 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16782 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16785 - .species = SPECIES_KINGDRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16787 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16786 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16789 - [DIFFICULTY_NORMAL][TRAINER_MARIELA] = - { -#line 16790 - .trainerName = _("MARIELA"), -#line 16791 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 16792 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 16793 -F_TRAINER_FEMALE | -#line 16794 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16795 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 16797 - .species = SPECIES_CHIMECHO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16799 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16798 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16801 - [DIFFICULTY_NORMAL][TRAINER_ALVARO] = - { -#line 16802 - .trainerName = _("ALVARO"), -#line 16803 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 16804 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 16806 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16807 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 16809 - .species = SPECIES_BANETTE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16811 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16810 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16813 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16815 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16814 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16817 - [DIFFICULTY_NORMAL][TRAINER_EVERETT] = - { -#line 16818 - .trainerName = _("EVERETT"), -#line 16819 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 16820 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 16822 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 16823 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 16825 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16827 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16826 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16829 - [DIFFICULTY_NORMAL][TRAINER_RED] = - { -#line 16830 - .trainerName = _("RED"), -#line 16831 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 16832 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 16834 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16835 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 16837 - .species = SPECIES_CHARMANDER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16839 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16838 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16841 - [DIFFICULTY_NORMAL][TRAINER_LEAF] = - { -#line 16842 - .trainerName = _("LEAF"), -#line 16843 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 16844 - .trainerPic = TRAINER_PIC_LEAF, - .encounterMusic_gender = -#line 16845 -F_TRAINER_FEMALE | -#line 16846 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16847 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 16849 - .species = SPECIES_BULBASAUR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16851 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16850 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16853 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_PLACEHOLDER] = - { -#line 16854 - .trainerName = _("BRENDAN"), -#line 16855 - .trainerClass = TRAINER_CLASS_RS_PROTAG, -#line 16856 - .trainerPic = TRAINER_PIC_RS_BRENDAN, - .encounterMusic_gender = -#line 16858 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16859 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 16861 - .species = SPECIES_GROUDON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16863 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16862 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16865 - [DIFFICULTY_NORMAL][TRAINER_MAY_PLACEHOLDER] = - { -#line 16866 - .trainerName = _("MAY"), -#line 16867 - .trainerClass = TRAINER_CLASS_RS_PROTAG, -#line 16868 - .trainerPic = TRAINER_PIC_RS_MAY, - .encounterMusic_gender = -#line 16869 -F_TRAINER_FEMALE | -#line 16870 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16871 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 16873 - .species = SPECIES_KYOGRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16875 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16874 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, diff --git a/src/data/wallpapers.h b/src/data/wallpapers.h index d204d441307d..e2ef3e8ae3bf 100644 --- a/src/data/wallpapers.h +++ b/src/data/wallpapers.h @@ -25,127 +25,127 @@ static const u16 sWallpaperPalettes_Forest[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/forest/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/forest/bg.gbapal"), }; -static const u32 sWallpaperTiles_Forest[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/forest/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Forest[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/forest/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Forest[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/forest/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Forest[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/forest/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_City[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/city/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/city/bg.gbapal"), }; -static const u32 sWallpaperTiles_City[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/city/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_City[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/city/tilemap.bin.lz"); +static const u32 sWallpaperTiles_City[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/city/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_City[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/city/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Desert[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/desert/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/desert/bg.gbapal"), }; -static const u32 sWallpaperTiles_Desert[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/desert/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Desert[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/desert/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Desert[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/desert/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Desert[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/desert/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Savanna[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/savanna/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/savanna/bg.gbapal"), }; -static const u32 sWallpaperTiles_Savanna[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/savanna/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Savanna[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/savanna/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Savanna[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/savanna/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Savanna[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/savanna/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Crag[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/crag/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/crag/bg.gbapal"), }; -static const u32 sWallpaperTiles_Crag[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/crag/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Crag[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/crag/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Crag[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/crag/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Crag[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/crag/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Volcano[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/volcano/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/volcano/bg.gbapal"), }; -static const u32 sWallpaperTiles_Volcano[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/volcano/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Volcano[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/volcano/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Volcano[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/volcano/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Volcano[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/volcano/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Snow[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/snow/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/snow/bg.gbapal"), }; -static const u32 sWallpaperTiles_Snow[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/snow/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Snow[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/snow/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Snow[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/snow/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Snow[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/snow/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Cave[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/cave/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/cave/bg.gbapal"), }; -static const u32 sWallpaperTiles_Cave[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/cave/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Cave[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/cave/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Cave[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/cave/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Cave[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/cave/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Beach[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/beach/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/beach/bg.gbapal"), }; -static const u32 sWallpaperTiles_Beach[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/beach/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Beach[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/beach/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Beach[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/beach/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Beach[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/beach/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Seafloor[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/seafloor/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/seafloor/bg.gbapal"), }; -static const u32 sWallpaperTiles_Seafloor[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/seafloor/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Seafloor[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/seafloor/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Seafloor[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/seafloor/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Seafloor[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/seafloor/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_River[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/river/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/river/bg.gbapal"), }; -static const u32 sWallpaperTiles_River[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/river/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_River[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/river/tilemap.bin.lz"); +static const u32 sWallpaperTiles_River[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/river/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_River[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/river/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Sky[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/sky/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/sky/bg.gbapal"), }; -static const u32 sWallpaperTiles_Sky[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/sky/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Sky[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/sky/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Sky[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/sky/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Sky[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/sky/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_PolkaDot[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/polkadot/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/polkadot/bg.gbapal"), }; -static const u32 sWallpaperTiles_PolkaDot[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/polkadot/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_PolkaDot[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/polkadot/tilemap.bin.lz"); +static const u32 sWallpaperTiles_PolkaDot[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/polkadot/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_PolkaDot[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/polkadot/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Pokecenter[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/pokecenter/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/pokecenter/bg.gbapal"), }; -static const u32 sWallpaperTiles_Pokecenter[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Pokecenter[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Pokecenter[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Pokecenter[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Machine[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/machine/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/machine/bg.gbapal"), }; -static const u32 sWallpaperTiles_Machine[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/machine/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Machine[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/machine/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Machine[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/machine/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Machine[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/machine/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Plain[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/plain/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/plain/bg.gbapal"), }; -static const u32 sWallpaperTiles_Plain[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/plain/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Plain[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/plain/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Plain[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/plain/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Plain[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/plain/tilemap.bin.smolTM"); // 12x18 tilemap static const u32 sWallpaperTilemap_Unused[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/unused.bin"); @@ -203,143 +203,143 @@ static const u16 sWallpaperPalettes_Zigzagoon[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame1.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/zigzagoon/bg.gbapal"), }; -static const u32 sWallpaperTiles_Zigzagoon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/zigzagoon/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Zigzagoon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/zigzagoon/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Zigzagoon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/zigzagoon/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Zigzagoon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/zigzagoon/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Screen[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame1.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/screen/bg.gbapal"), }; -static const u32 sWallpaperTiles_Screen[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/screen/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Screen[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/screen/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Screen[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/screen/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Screen[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/screen/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Diagonal[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame1.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/diagonal/bg.gbapal"), }; -static const u32 sWallpaperTiles_Diagonal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/diagonal/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Diagonal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/diagonal/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Diagonal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/diagonal/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Diagonal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/diagonal/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Block[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/block/bg.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/block/bg.gbapal"), }; -static const u32 sWallpaperTiles_Block[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/block/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Block[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/block/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Block[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/block/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Block[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/block/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Pokecenter2[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/pokecenter2/bg.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/pokecenter2/bg.gbapal"), }; -static const u32 sWallpaperTiles_Pokecenter2[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter2/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Pokecenter2[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter2/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Pokecenter2[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter2/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Pokecenter2[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter2/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Frame[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/frame/bg.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/frame/bg.gbapal"), }; -static const u32 sWallpaperTiles_Frame[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/frame/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Frame[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/frame/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Frame[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/frame/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Frame[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/frame/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Blank[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame1.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/zigzagoon/bg.gbapal"), }; -static const u32 sWallpaperTiles_Blank[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/blank/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Blank[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/blank/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Blank[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/blank/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Blank[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/blank/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Circles[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame2.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/circles/bg.gbapal"), }; -static const u32 sWallpaperTiles_Circles[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/circles/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Circles[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/circles/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Circles[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/circles/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Circles[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/circles/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Azumarill[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame2.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/azumarill/bg.gbapal"), }; -static const u32 sWallpaperTiles_Azumarill[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/azumarill/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Azumarill[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/azumarill/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Azumarill[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/azumarill/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Azumarill[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/azumarill/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Pikachu[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame2.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/pikachu/bg.gbapal"), }; -static const u32 sWallpaperTiles_Pikachu[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pikachu/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Pikachu[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pikachu/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Pikachu[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pikachu/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Pikachu[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pikachu/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Legendary[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame2.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/legendary/bg.gbapal"), }; -static const u32 sWallpaperTiles_Legendary[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/legendary/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Legendary[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/legendary/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Legendary[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/legendary/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Legendary[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/legendary/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Dusclops[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame2.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/dusclops/bg.gbapal"), }; -static const u32 sWallpaperTiles_Dusclops[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/dusclops/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Dusclops[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/dusclops/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Dusclops[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/dusclops/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Dusclops[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/dusclops/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Ludicolo[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame2.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/ludicolo/bg.gbapal"), }; -static const u32 sWallpaperTiles_Ludicolo[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/ludicolo/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Ludicolo[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/ludicolo/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Ludicolo[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/ludicolo/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Ludicolo[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/ludicolo/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Whiscash[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame2.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/whiscash/bg.gbapal"), }; -static const u32 sWallpaperTiles_Whiscash[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/whiscash/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Whiscash[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/whiscash/tilemap.bin.lz"); - -static const u32 sWallpaperIcon_Aqua[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/aqua.4bpp.lz"); -static const u32 sWallpaperIcon_Heart[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/heart.4bpp.lz"); -static const u32 sWallpaperIcon_FiveStar[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/five_star.4bpp.lz"); -static const u32 sWallpaperIcon_Brick[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/brick.4bpp.lz"); -static const u32 sWallpaperIcon_FourStar[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/four_star.4bpp.lz"); -static const u32 sWallpaperIcon_Asterisk[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/asterisk.4bpp.lz"); -static const u32 sWallpaperIcon_Dot[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/dot.4bpp.lz"); -static const u32 sWallpaperIcon_CrossJapan[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/cross_japan.4bpp.lz"); -static const u32 sWallpaperIcon_LineCircle[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/line_circle.4bpp.lz"); -static const u32 sWallpaperIcon_PokeBall[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/pokeball.4bpp.lz"); -static const u32 sWallpaperIcon_Maze[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/maze.4bpp.lz"); -static const u32 sWallpaperIcon_Footprint[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/footprint.4bpp.lz"); -static const u32 sWallpaperIcon_BigAsterisk[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/big_asterisk.4bpp.lz"); -static const u32 sWallpaperIcon_Circle[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/circle.4bpp.lz"); -static const u32 sWallpaperIcon_Koffing[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/koffing.4bpp.lz"); -static const u32 sWallpaperIcon_Ribbon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/ribbon.4bpp.lz"); -static const u32 sWallpaperIcon_BoltJapan[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/bolt_japan.4bpp.lz"); -static const u32 sWallpaperIcon_FourCircles[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/four_circles.4bpp.lz"); -static const u32 sWallpaperIcon_Lotad[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/lotad.4bpp.lz"); -static const u32 sWallpaperIcon_Crystal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/crystal.4bpp.lz"); -static const u32 sWallpaperIcon_Pichu[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/pichu.4bpp.lz"); -static const u32 sWallpaperIcon_Diglett[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/diglett.4bpp.lz"); -static const u32 sWallpaperIcon_Luvdisc[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/luvdisc.4bpp.lz"); -static const u32 sWallpaperIcon_StarInCircle[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/star_in_circle.4bpp.lz"); -static const u32 sWallpaperIcon_Spinda[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/spinda.4bpp.lz"); -static const u32 sWallpaperIcon_Latis[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/latis.4bpp.lz"); -static const u32 sWallpaperIcon_PlusleJapan[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/plusle_japan.4bpp.lz"); -static const u32 sWallpaperIcon_Minun[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/minun.4bpp.lz"); -static const u32 sWallpaperIcon_Togepi[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/togepi.4bpp.lz"); -static const u32 sWallpaperIcon_Magma[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/magma.4bpp.lz"); +static const u32 sWallpaperTiles_Whiscash[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/whiscash/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Whiscash[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/whiscash/tilemap.bin.smolTM"); + +static const u32 sWallpaperIcon_Aqua[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/aqua.4bpp.smol"); +static const u32 sWallpaperIcon_Heart[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/heart.4bpp.smol"); +static const u32 sWallpaperIcon_FiveStar[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/five_star.4bpp.smol"); +static const u32 sWallpaperIcon_Brick[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/brick.4bpp.smol"); +static const u32 sWallpaperIcon_FourStar[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/four_star.4bpp.smol"); +static const u32 sWallpaperIcon_Asterisk[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/asterisk.4bpp.smol"); +static const u32 sWallpaperIcon_Dot[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/dot.4bpp.smol"); +static const u32 sWallpaperIcon_CrossJapan[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/cross_japan.4bpp.smol"); +static const u32 sWallpaperIcon_LineCircle[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/line_circle.4bpp.smol"); +static const u32 sWallpaperIcon_PokeBall[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/pokeball.4bpp.smol"); +static const u32 sWallpaperIcon_Maze[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/maze.4bpp.smol"); +static const u32 sWallpaperIcon_Footprint[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/footprint.4bpp.smol"); +static const u32 sWallpaperIcon_BigAsterisk[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/big_asterisk.4bpp.smol"); +static const u32 sWallpaperIcon_Circle[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/circle.4bpp.smol"); +static const u32 sWallpaperIcon_Koffing[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/koffing.4bpp.smol"); +static const u32 sWallpaperIcon_Ribbon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/ribbon.4bpp.smol"); +static const u32 sWallpaperIcon_BoltJapan[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/bolt_japan.4bpp.smol"); +static const u32 sWallpaperIcon_FourCircles[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/four_circles.4bpp.smol"); +static const u32 sWallpaperIcon_Lotad[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/lotad.4bpp.smol"); +static const u32 sWallpaperIcon_Crystal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/crystal.4bpp.smol"); +static const u32 sWallpaperIcon_Pichu[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/pichu.4bpp.smol"); +static const u32 sWallpaperIcon_Diglett[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/diglett.4bpp.smol"); +static const u32 sWallpaperIcon_Luvdisc[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/luvdisc.4bpp.smol"); +static const u32 sWallpaperIcon_StarInCircle[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/star_in_circle.4bpp.smol"); +static const u32 sWallpaperIcon_Spinda[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/spinda.4bpp.smol"); +static const u32 sWallpaperIcon_Latis[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/latis.4bpp.smol"); +static const u32 sWallpaperIcon_PlusleJapan[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/plusle_japan.4bpp.smol"); +static const u32 sWallpaperIcon_Minun[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/minun.4bpp.smol"); +static const u32 sWallpaperIcon_Togepi[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/togepi.4bpp.smol"); +static const u32 sWallpaperIcon_Magma[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/magma.4bpp.smol"); static const struct Wallpaper sWaldaWallpapers[] = { diff --git a/src/data/wild_encounters.json b/src/data/wild_encounters.json index 0b30c0f65bf2..053c4c095f40 100755 --- a/src/data/wild_encounters.json +++ b/src/data/wild_encounters.json @@ -7,30 +7,71 @@ { "type": "land_mons", "encounter_rates": [ - 20, 20, 10, 10, 10, 10, 5, 5, 4, 4, 1, 1 + 20, + 20, + 10, + 10, + 10, + 10, + 5, + 5, + 4, + 4, + 1, + 1 ] }, { "type": "water_mons", "encounter_rates": [ - 60, 30, 5, 4, 1 + 60, + 30, + 5, + 4, + 1 ] }, { "type": "rock_smash_mons", "encounter_rates": [ - 60, 30, 5, 4, 1 + 60, + 30, + 5, + 4, + 1 ] }, { "type": "fishing_mons", "encounter_rates": [ - 70, 30, 60, 20, 20, 40, 40, 15, 4, 1 + 70, + 30, + 60, + 20, + 20, + 40, + 40, + 15, + 4, + 1 ], "groups": { - "old_rod": [0, 1], - "good_rod": [2, 3, 4], - "super_rod": [5, 6, 7, 8, 9] + "old_rod": [ + 0, + 1 + ], + "good_rod": [ + 2, + 3, + 4 + ], + "super_rod": [ + 5, + 6, + 7, + 8, + 9 + ] } } ], diff --git a/src/data/wild_encounters.json.txt b/src/data/wild_encounters.json.txt deleted file mode 100755 index 8ae70efc6ec1..000000000000 --- a/src/data/wild_encounters.json.txt +++ /dev/null @@ -1,103 +0,0 @@ -{{ doNotModifyHeader }} - -## for wild_encounter_group in wild_encounter_groups -{% if wild_encounter_group.for_maps %} -## for wild_encounter_field in wild_encounter_group.fields -{% if not existsIn(wild_encounter_field, "groups") %} -## for encounter_rate in wild_encounter_field.encounter_rates -{% if loop.index == 0 %} -#define ENCOUNTER_CHANCE_{{ upper(wild_encounter_field.type) }}_SLOT_{{ loop.index }} {{ encounter_rate }} {% else %}#define ENCOUNTER_CHANCE_{{ upper(wild_encounter_field.type) }}_SLOT_{{ loop.index }} ENCOUNTER_CHANCE_{{ upper(wild_encounter_field.type) }}_SLOT_{{ subtract(loop.index, 1) }} + {{ encounter_rate }}{% endif %} {{ setVarInt(wild_encounter_field.type, loop.index) }} -## endfor -#define ENCOUNTER_CHANCE_{{ upper(wild_encounter_field.type) }}_TOTAL (ENCOUNTER_CHANCE_{{ upper(wild_encounter_field.type) }}_SLOT_{{ getVar(wild_encounter_field.type) }}) -{% else %} -## for field_subgroup_key, field_subgroup_subarray in wild_encounter_field.groups -## for field_subgroup_index in field_subgroup_subarray -{% if loop.index == 0 %} -#define ENCOUNTER_CHANCE_{{ upper(wild_encounter_field.type) }}_{{ upper(field_subgroup_key) }}_SLOT_{{ field_subgroup_index }} {{ at(wild_encounter_field.encounter_rates, field_subgroup_index) }} {% else %}#define ENCOUNTER_CHANCE_{{ upper(wild_encounter_field.type) }}_{{ upper(field_subgroup_key) }}_SLOT_{{ field_subgroup_index }} ENCOUNTER_CHANCE_{{ upper(wild_encounter_field.type) }}_{{ upper(field_subgroup_key) }}_SLOT_{{ getVar("previous_slot") }} + {{ at(wild_encounter_field.encounter_rates, field_subgroup_index) }}{% endif %}{{ setVarInt(concat(wild_encounter_field.type, field_subgroup_key), field_subgroup_index) }}{{ setVarInt("previous_slot", field_subgroup_index) }} -## endfor -#define ENCOUNTER_CHANCE_{{ upper(wild_encounter_field.type) }}_{{ upper(field_subgroup_key) }}_TOTAL (ENCOUNTER_CHANCE_{{ upper(wild_encounter_field.type) }}_{{ upper(field_subgroup_key) }}_SLOT_{{ getVar(concat(wild_encounter_field.type, field_subgroup_key)) }}) -## endfor -{% endif %} -## endfor -{% endif %} - - - -## for encounter in wild_encounter_group.encounters -{% if existsIn(encounter, "land_mons") %} -const struct WildPokemon {{ encounter.base_label }}_LandMons[] = -{ -## for wild_mon in encounter.land_mons.mons - { {{ wild_mon.min_level }}, {{ wild_mon.max_level }}, {{ wild_mon.species }} }, -## endfor -}; - -const struct WildPokemonInfo {{ encounter.base_label }}_LandMonsInfo = { {{encounter.land_mons.encounter_rate}}, {{ encounter.base_label }}_LandMons }; -{% endif %} -{% if existsIn(encounter, "water_mons") %} -const struct WildPokemon {{ encounter.base_label }}_WaterMons[] = -{ -## for wild_mon in encounter.water_mons.mons - { {{ wild_mon.min_level }}, {{ wild_mon.max_level }}, {{ wild_mon.species }} }, -## endfor -}; - -const struct WildPokemonInfo {{ encounter.base_label }}_WaterMonsInfo = { {{encounter.water_mons.encounter_rate}}, {{ encounter.base_label }}_WaterMons }; -{% endif %} -{% if existsIn(encounter, "rock_smash_mons") %} -const struct WildPokemon {{ encounter.base_label }}_RockSmashMons[] = -{ -## for wild_mon in encounter.rock_smash_mons.mons - { {{ wild_mon.min_level }}, {{ wild_mon.max_level }}, {{ wild_mon.species }} }, -## endfor -}; - -const struct WildPokemonInfo {{ encounter.base_label }}_RockSmashMonsInfo = { {{encounter.rock_smash_mons.encounter_rate}}, {{ encounter.base_label }}_RockSmashMons }; -{% endif %} -{% if existsIn(encounter, "fishing_mons") %} -const struct WildPokemon {{ encounter.base_label }}_FishingMons[] = -{ -## for wild_mon in encounter.fishing_mons.mons - { {{ wild_mon.min_level }}, {{ wild_mon.max_level }}, {{ wild_mon.species }} }, -## endfor -}; - -const struct WildPokemonInfo {{ encounter.base_label }}_FishingMonsInfo = { {{encounter.fishing_mons.encounter_rate}}, {{ encounter.base_label }}_FishingMons }; -{% endif %} - -{% if existsIn(encounter, "hidden_mons") %} -const struct WildPokemon {{ encounter.base_label }}_HiddenMons[] = -{ -## for wild_mon in encounter.hidden_mons.mons - { {{ wild_mon.min_level }}, {{ wild_mon.max_level }}, {{ wild_mon.species }} }, -## endfor -}; - -const struct WildPokemonInfo {{ encounter.base_label }}_HiddenMonsInfo = { {{encounter.hidden_mons.encounter_rate}}, {{ encounter.base_label }}_HiddenMons }; -{% endif %} - -## endfor -const struct WildPokemonHeader {{ wild_encounter_group.label }}[] = -{ -## for encounter in wild_encounter_group.encounters - { - .mapGroup = {% if wild_encounter_group.for_maps %}MAP_GROUP({{ encounter.map }}){% else %}0{% endif %}, - .mapNum = {% if wild_encounter_group.for_maps %}MAP_NUM({{ encounter.map }}){% else %}{{ loop.index1 }}{% endif %}, - .landMonsInfo = {% if existsIn(encounter, "land_mons") %}&{{ encounter.base_label }}_LandMonsInfo{% else %}NULL{% endif %}, - .waterMonsInfo = {% if existsIn(encounter, "water_mons") %}&{{ encounter.base_label }}_WaterMonsInfo{% else %}NULL{% endif %}, - .rockSmashMonsInfo = {% if existsIn(encounter, "rock_smash_mons") %}&{{ encounter.base_label }}_RockSmashMonsInfo{% else %}NULL{% endif %}, - .fishingMonsInfo = {% if existsIn(encounter, "fishing_mons") %}&{{ encounter.base_label }}_FishingMonsInfo{% else %}NULL{% endif %}, - .hiddenMonsInfo = {% if existsIn(encounter, "hidden_mons") %}&{{ encounter.base_label }}_HiddenMonsInfo{% else %}NULL{% endif %}, - }, -## endfor - { - .mapGroup = MAP_GROUP(MAP_UNDEFINED), - .mapNum = MAP_NUM(MAP_UNDEFINED), - .landMonsInfo = NULL, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - .hiddenMonsInfo = NULL, - }, -}; -## endfor diff --git a/src/daycare.c b/src/daycare.c index e2f6f8f0704d..439c0db3d6da 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -24,7 +24,6 @@ #include "regions.h" #include "constants/form_change_types.h" #include "constants/items.h" -#include "constants/hold_effects.h" #include "constants/moves.h" #include "constants/region_map_sections.h" @@ -505,6 +504,8 @@ static u16 GetEggSpecies(u16 species) found = FALSE; for (j = 1; j < NUM_SPECIES; j++) { + if (!IsSpeciesEnabled(j)) + continue; const struct Evolution *evolutions = GetSpeciesEvolutions(j); if (evolutions == NULL) continue; @@ -741,10 +742,10 @@ static void InheritPokeball(struct Pokemon *egg, struct BoxPokemon *father, stru static void InheritAbility(struct Pokemon *egg, struct BoxPokemon *father, struct BoxPokemon *mother) { - u16 fatherAbility = GetBoxMonData(father, MON_DATA_ABILITY_NUM); - u16 motherAbility = GetBoxMonData(mother, MON_DATA_ABILITY_NUM); + enum Ability fatherAbility = GetBoxMonData(father, MON_DATA_ABILITY_NUM); + enum Ability motherAbility = GetBoxMonData(mother, MON_DATA_ABILITY_NUM); u16 motherSpecies = GetBoxMonData(mother, MON_DATA_SPECIES); - u16 inheritAbility = motherAbility; + enum Ability inheritAbility = motherAbility; if (motherSpecies == SPECIES_DITTO) { @@ -895,9 +896,9 @@ static void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, stru { if (sHatchedEggFatherMoves[i] != MOVE_NONE) { - for (j = 0; j < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; j++) + for (j = 0; j < NUM_ALL_MACHINES; j++) { - u16 moveId = ItemIdToBattleMoveId(ITEM_TM01 + j); + u16 moveId = GetTMHMMoveId(j + 1); if (sHatchedEggFatherMoves[i] == moveId && CanLearnTeachableMove(GetMonData(egg, MON_DATA_SPECIES_OR_EGG), moveId)) { if (GiveMoveToMon(egg, sHatchedEggFatherMoves[i]) == MON_HAS_MAX_MOVES) @@ -1107,7 +1108,7 @@ void CreateEgg(struct Pokemon *mon, u16 species, bool8 setHotSpringsLocation) u8 metLevel; enum PokeBall ball; u8 language; - u8 metLocation; + metloc_u8_t metLocation; u8 isEgg; CreateMon(mon, species, EGG_HATCH_LEVEL, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0); diff --git a/src/debug.c b/src/debug.c index 6694266e0830..4d3e5cd39f4c 100644 --- a/src/debug.c +++ b/src/debug.c @@ -17,15 +17,19 @@ #include "data.h" #include "daycare.h" #include "debug.h" +#include "decoration.h" +#include "decoration_inventory.h" #include "event_data.h" #include "event_object_movement.h" #include "event_scripts.h" #include "field_message_box.h" #include "field_screen_effect.h" #include "field_weather.h" +#include "follower_npc.h" #include "international_string_util.h" #include "item.h" #include "item_icon.h" +#include "item_use.h" #include "list_menu.h" #include "m4a.h" #include "main.h" @@ -52,12 +56,15 @@ #include "strings.h" #include "string_util.h" #include "task.h" +#include "tv.h" #include "pokemon_summary_screen.h" #include "wild_encounter.h" #include "constants/abilities.h" #include "constants/battle_ai.h" #include "constants/battle_frontier.h" #include "constants/coins.h" +#include "constants/decorations.h" +#include "constants/event_objects.h" #include "constants/expansion.h" #include "constants/flags.h" #include "constants/items.h" @@ -71,106 +78,15 @@ #include "fake_rtc.h" #include "save.h" -// ******************************* -enum DebugMenu -{ - DEBUG_MENU_ITEM_UTILITIES, - DEBUG_MENU_ITEM_PCBAG, - DEBUG_MENU_ITEM_PARTY, - DEBUG_MENU_ITEM_GIVE, - DEBUG_MENU_ITEM_PLAYER, - DEBUG_MENU_ITEM_SCRIPTS, - DEBUG_MENU_ITEM_FLAGVAR, - //DEBUG_MENU_ITEM_BATTLE, - DEBUG_MENU_ITEM_SOUND, - DEBUG_MENU_ITEM_ROMINFO, - DEBUG_MENU_ITEM_CANCEL, -}; - -enum UtilDebugMenu -{ - DEBUG_UTIL_MENU_ITEM_FLY, - DEBUG_UTIL_MENU_ITEM_WARP, - DEBUG_UTIL_MENU_ITEM_WEATHER, - DEBUG_UTIL_MENU_ITEM_FONT_TEST, - DEBUG_UTIL_MENU_ITEM_TIME_MENU, - DEBUG_UTIL_MENU_ITEM_WATCHCREDITS, - DEBUG_UTIL_MENU_ITEM_CHEAT, - DEBUG_UTIL_MENU_ITEM_BERRY_FUNCTIONS, - DEBUG_UTIL_MENU_ITEM_EWRAM_COUNTERS, - DEBUG_UTIL_MENU_ITEM_STEVEN_MULTI // Please keep this at the bottom <3 -}; - -enum TimeMenuDebugMenu -{ - DEBUG_TIME_MENU_ITEM_PRINTTIME, - DEBUG_TIME_MENU_ITEM_PRINTTIMEOFDAY, - DEBUG_TIME_MENU_ITEM_TIMESOFDAY, - DEBUG_TIME_MENU_ITEM_WEEKDAYS, - DEBUG_TIME_MENU_ITEM_CHECKWALLCLOCK, - DEBUG_TIME_MENU_ITEM_SETWALLCLOCK, -}; - -enum TimeMenuTimeOfDay -{ - DEBUG_TIME_MENU_ITEM_MORNING, - DEBUG_TIME_MENU_ITEM_DAY, - DEBUG_TIME_MENU_ITEM_EVENING, - DEBUG_TIME_MENU_ITEM_NIGHT, -}; - -enum TimeMenuWeekdays -{ - DEBUG_TIME_MENU_ITEM_SUNDAY, - DEBUG_TIME_MENU_ITEM_MONDAY, - DEBUG_TIME_MENU_ITEM_TUESDAY, - DEBUG_TIME_MENU_ITEM_WEDNESDAY, - DEBUG_TIME_MENU_ITEM_THURSDAY, - DEBUG_TIME_MENU_ITEM_FRIDAY, - DEBUG_TIME_MENU_ITEM_SATURDAY, -}; - -enum GivePCBagDebugMenu -{ - DEBUG_PCBAG_MENU_ITEM_ACCESS_PC, - DEBUG_PCBAG_MENU_ITEM_FILL, - DEBUG_PCBAG_MENU_ITEM_CLEAR_BAG, - DEBUG_PCBAG_MENU_ITEM_CLEAR_BOXES, -}; - -enum GivePCBagFillDebugMenu -{ - DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_FAST, - DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_SLOW, - DEBUG_PCBAG_MENU_ITEM_FILL_PC_ITEMS, - DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_ITEMS, - DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BALLS, - DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_TMHM, - DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BERRIES, - DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_KEY_ITEMS, -}; - -enum PartyDebugMenu -{ - DEBUG_PARTY_MENU_ITEM_MOVE_REMINDER, - DEBUG_PARTY_MENU_ITEM_HATCH_AN_EGG, - DEBUG_PARTY_MENU_ITEM_HEAL_PARTY, - DEBUG_PARTY_MENU_ITEM_INFLICT_STATUS1, - DEBUG_PARTY_MENU_ITEM_CHECK_EVS, - DEBUG_PARTY_MENU_ITEM_CHECK_IVS, - DEBUG_PARTY_MENU_ITEM_CLEAR_PARTY, -}; - -enum ScriptDebugMenu +enum FollowerNPCCreateDebugMenu { - DEBUG_UTIL_MENU_ITEM_SCRIPT_1, - DEBUG_UTIL_MENU_ITEM_SCRIPT_2, - DEBUG_UTIL_MENU_ITEM_SCRIPT_3, - DEBUG_UTIL_MENU_ITEM_SCRIPT_4, - DEBUG_UTIL_MENU_ITEM_SCRIPT_5, - DEBUG_UTIL_MENU_ITEM_SCRIPT_6, - DEBUG_UTIL_MENU_ITEM_SCRIPT_7, - DEBUG_UTIL_MENU_ITEM_SCRIPT_8, + DEBUG_FNPC_BRENDAN, + DEBUG_FNPC_MAY, + DEBUG_FNPC_STEVEN, + DEBUG_FNPC_WALLY, + DEBUG_FNPC_RED, + DEBUG_FNPC_LEAF, + DEBUG_FNPC_COUNT, }; enum FlagsVarsDebugMenu @@ -191,11 +107,11 @@ enum FlagsVarsDebugMenu DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLLISION, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_ENCOUNTER, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_TRAINER_SEE, - DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING, + DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE, }; -enum BattleType +enum DebugBattleType { DEBUG_BATTLE_0_MENU_ITEM_WILD, DEBUG_BATTLE_0_MENU_ITEM_WILD_DOUBLE, @@ -204,7 +120,7 @@ enum BattleType DEBUG_BATTLE_0_MENU_ITEM_MULTI, }; -enum BattleAIFlags +enum DebugBattleAIFlags { DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_00, DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_01, @@ -227,58 +143,18 @@ enum BattleAIFlags DEBUG_BATTLE_1_MENU_ITEM_CONTINUE, }; -enum BattleTerrain -{ - DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_0, - DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_1, - DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_2, - DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_3, - DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_4, - DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_5, - DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_6, - DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_7, - DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_8, - DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_9, -}; - -enum GiveDebugMenu -{ - DEBUG_GIVE_MENU_ITEM_ITEM_X, - DEBUG_GIVE_MENU_ITEM_POKEMON_SIMPLE, - DEBUG_GIVE_MENU_ITEM_POKEMON_COMPLEX, - DEBUG_GIVE_MENU_ITEM_MAX_MONEY, - DEBUG_GIVE_MENU_ITEM_MAX_COINS, - DEBUG_GIVE_MENU_ITEM_MAX_BATTLE_POINTS, - DEBUG_GIVE_MENU_ITEM_DAYCARE_EGG, -}; - -enum SoundDebugMenu -{ - DEBUG_SOUND_MENU_ITEM_SE, - DEBUG_SOUND_MENU_ITEM_MUS, -}; - -enum BerryFunctionsMenu -{ - DEBUG_BERRY_FUNCTIONS_MENU_CLEAR_ALL, - DEBUG_BERRY_FUNCTIONS_MENU_READY, - DEBUG_BERRY_FUNCTIONS_MENU_NEXT_STAGE, - DEBUG_BERRY_FUNCTIONS_MENU_WEEDS, - DEBUG_BERRY_FUNCTIONS_MENU_PESTS, -}; - -enum PlayerDebugMenu -{ - DEBUG_PLAYER_MENU_ITEM_PLAYER_NAME, - DEBUG_PLAYER_MENU_ITEM_PLAYER_GENDER, - DEBUG_PLAYER_MENU_ITEM_PLAYER_ID, -}; - -enum ROMInfoDebugMenu -{ - DEBUG_ROM_INFO_MENU_ITEM_SAVEBLOCK, - DEBUG_ROM_INFO_MENU_ITEM_ROM_SPACE, - DEBUG_ROM_INFO_MENU_ITEM_EXPANSION_VER, +enum DebugBattleEnvironment +{ + DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_0, + DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_1, + DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_2, + DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_3, + DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_4, + DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_5, + DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_6, + DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_7, + DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_8, + DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_9, }; // ******************************* @@ -309,9 +185,22 @@ enum ROMInfoDebugMenu #define DEBUG_NUMBER_ICON_X 210 #define DEBUG_NUMBER_ICON_Y 50 -#define DEBUG_MAX_MENU_ITEMS 50 +#define DEBUG_MAX_MENU_ITEMS 20 +#define DEBUG_MAX_SUB_MENU_LEVELS 4 // ******************************* +struct DebugMenuOption; + +typedef void (*DebugFunc)(u8 taskId); +typedef void (*DebugSubmenuFunc)(u8 taskId, const struct DebugMenuOption *items); + +struct DebugMenuOption +{ + const u8 *text; + const void *action; + const void *actionParams; +}; + struct DebugMonData { u16 species; @@ -329,68 +218,37 @@ struct DebugMonData struct DebugMenuListData { - struct ListMenuItem listItems[20 + 1]; + const struct DebugMenuOption *subMenuItems[DEBUG_MAX_SUB_MENU_LEVELS]; + struct ListMenuItem listItems[DEBUG_MAX_MENU_ITEMS + 1]; u8 itemNames[DEBUG_MAX_MENU_ITEMS + 1][26]; u8 listId; }; -struct DebugBattleData -{ - u8 submenu; - u8 battleType; - u8 battleTerrain; - bool8 aiFlags[AI_FLAG_COUNT]; -}; - // EWRAM static EWRAM_DATA struct DebugMonData *sDebugMonData = NULL; static EWRAM_DATA struct DebugMenuListData *sDebugMenuListData = NULL; -static EWRAM_DATA struct DebugBattleData *sDebugBattleData = NULL; EWRAM_DATA bool8 gIsDebugBattle = FALSE; EWRAM_DATA u64 gDebugAIFlags = 0; // ******************************* // Define functions -static void Debug_ReShowMainMenu(void); -static void Debug_ShowMenu(void (*HandleInput)(u8), struct ListMenuTemplate LMtemplate); +static void Debug_ShowMenu(DebugFunc HandleInput, const struct DebugMenuOption *items); +static u8 Debug_GenerateListMenuNames(void); static void Debug_DestroyMenu(u8 taskId); -static void Debug_DestroyMenu_Full(u8 taskId); static void DebugAction_Cancel(u8 taskId); static void DebugAction_DestroyExtraWindow(u8 taskId); -static void Debug_InitDebugBattleData(void); static void Debug_RefreshListMenu(u8 taskId); -static void Debug_RedrawListMenu(u8 taskId); - -static void DebugAction_Util_Script_1(u8 taskId); -static void DebugAction_Util_Script_2(u8 taskId); -static void DebugAction_Util_Script_3(u8 taskId); -static void DebugAction_Util_Script_4(u8 taskId); -static void DebugAction_Util_Script_5(u8 taskId); -static void DebugAction_Util_Script_6(u8 taskId); -static void DebugAction_Util_Script_7(u8 taskId); -static void DebugAction_Util_Script_8(u8 taskId); - -static void DebugAction_OpenUtilitiesMenu(u8 taskId); -static void DebugAction_OpenPCBagMenu(u8 taskId); -static void DebugAction_OpenPartyMenu(u8 taskId); -static void DebugAction_OpenScriptsMenu(u8 taskId); -static void DebugAction_OpenFlagsVarsMenu(u8 taskId); -static void DebugAction_OpenGiveMenu(u8 taskId); -static void DebugAction_OpenSoundMenu(u8 taskId); -static void DebugAction_OpenPlayerMenu(u8 taskId); -static void DebugAction_OpenROMInfoMenu(u8 taskId); - -static void DebugTask_HandleMenuInput_Main(u8 taskId); -static void DebugTask_HandleMenuInput_Utilities(u8 taskId); -static void DebugTask_HandleMenuInput_PCBag(u8 taskId); -static void DebugTask_HandleMenuInput_PCBag_Fill(u8 taskId); -static void DebugTask_HandleMenuInput_Party(u8 taskId); -static void DebugTask_HandleMenuInput_Scripts(u8 taskId); -static void DebugTask_HandleMenuInput_FlagsVars(u8 taskId); -static void DebugTask_HandleMenuInput_Battle(u8 taskId); -static void DebugTask_HandleMenuInput_Give(u8 taskId); -static void DebugTask_HandleMenuInput_Sound(u8 taskId); -static void DebugTask_HandleMenuInput_BerryFunctions(u8 taskId); +static u8 DebugNativeStep_CreateDebugWindow(void); +static void DebugNativeStep_CloseDebugWindow(u8 taskId); + +static void DebugAction_OpenSubMenu(u8 taskId, const struct DebugMenuOption *items); +static void DebugAction_OpenSubMenuFlagsVars(u8 taskId, const struct DebugMenuOption *items); +static void DebugAction_OpenSubMenuFakeRTC(u8 taskId, const struct DebugMenuOption *items); +static void DebugAction_OpenSubMenuCreateFollowerNPC(u8 taskId, const struct DebugMenuOption *items); +static void DebugAction_ExecuteScript(u8 taskId, const u8 *script); +static void DebugAction_ToggleFlag(u8 taskId); + +static void DebugTask_HandleMenuInput_General(u8 taskId); static void DebugAction_Util_Fly(u8 taskId); static void DebugAction_Util_Warp_Warp(u8 taskId); @@ -399,25 +257,15 @@ static void DebugAction_Util_Warp_SelectMap(u8 taskId); static void DebugAction_Util_Warp_SelectWarp(u8 taskId); static void DebugAction_Util_Weather(u8 taskId); static void DebugAction_Util_Weather_SelectId(u8 taskId); -static void DebugAction_Util_FontTest(u8 taskId); -static void DebugAction_TimeMenu_CheckWallClock(u8 taskId); -static void DebugAction_TimeMenu_SetWallClock(u8 taskId); static void DebugAction_Util_WatchCredits(u8 taskId); static void DebugAction_Util_CheatStart(u8 taskId); -static void DebugAction_Util_BerryFunctions(u8 taskId); -static void DebugAction_Util_CheckEWRAMCounters(u8 taskId); -static void DebugAction_Util_Steven_Multi(u8 taskId); -static void DebugAction_Util_OpenTimeMenu(u8 taskId); - -static void DebugAction_TimeMenu_PrintTime(u8 taskId); -static void DebugAction_TimeMenu_PrintTimeOfDay(u8 taskId); -static void DebugAction_TimeMenu_TimesOfDay(u8 taskId); -static void DebugAction_TimeMenu_Weekdays(u8 taskId); static void DebugAction_TimeMenu_ChangeTimeOfDay(u8 taskId); static void DebugAction_TimeMenu_ChangeWeekdays(u8 taskId); -static void DebugAction_OpenPCBagFillMenu(u8 taskId); +static void DebugAction_CreateFollowerNPC(u8 taskId); +static void DebugAction_DestroyFollowerNPC(u8 taskId); + static void DebugAction_PCBag_Fill_PCBoxes_Fast(u8 taskId); static void DebugAction_PCBag_Fill_PCBoxes_Slow(u8 taskId); static void DebugAction_PCBag_Fill_PCItemStorage(u8 taskId); @@ -426,17 +274,13 @@ static void DebugAction_PCBag_Fill_PocketPokeBalls(u8 taskId); static void DebugAction_PCBag_Fill_PocketTMHM(u8 taskId); static void DebugAction_PCBag_Fill_PocketBerries(u8 taskId); static void DebugAction_PCBag_Fill_PocketKeyItems(u8 taskId); -static void DebugAction_PCBag_AccessPC(u8 taskId); static void DebugAction_PCBag_ClearBag(u8 taskId); static void DebugAction_PCBag_ClearBoxes(u8 taskId); -static void DebugAction_Party_MoveReminder(u8 taskId); -static void DebugAction_Party_HatchAnEgg(u8 taskId); static void DebugAction_Party_HealParty(u8 taskId); -static void DebugAction_Party_InflictStatus1(u8 taskId); -static void DebugAction_Party_CheckEVs(u8 taskId); -static void DebugAction_Party_CheckIVs(u8 taskId); static void DebugAction_Party_ClearParty(u8 taskId); +static void DebugAction_Party_SetParty(u8 taskId); +static void DebugAction_Party_BattleSingle(u8 taskId); static void DebugAction_FlagsVars_Flags(u8 taskId); static void DebugAction_FlagsVars_FlagsSelect(u8 taskId); @@ -460,8 +304,6 @@ static void DebugAction_FlagsVars_BagUseOnOff(u8 taskId); static void DebugAction_FlagsVars_CatchingOnOff(u8 taskId); static void DebugAction_FlagsVars_RunningShoes(u8 taskId); -static void Debug_InitializeBattle(u8 taskId); - static void DebugAction_Give_Item(u8 taskId); static void DebugAction_Give_Item_SelectId(u8 taskId); static void DebugAction_Give_Item_SelectQuantity(u8 taskId); @@ -479,6 +321,8 @@ static void DebugAction_Give_Pokemon_SelectIVs(u8 taskId); static void DebugAction_Give_Pokemon_SelectEVs(u8 taskId); static void DebugAction_Give_Pokemon_ComplexCreateMon(u8 taskId); static void DebugAction_Give_Pokemon_Move(u8 taskId); +static void DebugAction_Give_Decoration(u8 taskId); +static void DebugAction_Give_Decoration_SelectId(u8 taskId); static void DebugAction_Give_MaxMoney(u8 taskId); static void DebugAction_Give_MaxCoins(u8 taskId); static void DebugAction_Give_MaxBattlePoints(u8 taskId); @@ -499,17 +343,17 @@ static void DebugAction_Player_Name(u8 taskId); static void DebugAction_Player_Gender(u8 taskId); static void DebugAction_Player_Id(u8 taskId); -static void DebugAction_ROMInfo_CheckSaveBlock(u8 taskId); -static void DebugAction_ROMInfo_CheckROMSpace(u8 taskId); -static void DebugAction_ROMInfo_ExpansionVersion(u8 taskId); - extern const u8 Debug_FlagsNotSetOverworldConfigMessage[]; extern const u8 Debug_FlagsNotSetBattleConfigMessage[]; +extern const u8 Debug_VarsNotSetBattleConfigMessage[]; extern const u8 Debug_FlagsAndVarNotSetBattleConfigMessage[]; extern const u8 Debug_EventScript_FontTest[]; extern const u8 Debug_EventScript_CheckEVs[]; extern const u8 Debug_EventScript_CheckIVs[]; extern const u8 Debug_EventScript_InflictStatus1[]; +extern const u8 Debug_EventScript_SetHiddenNature[]; +extern const u8 Debug_EventScript_SetAbility[]; +extern const u8 Debug_EventScript_SetFriendship[]; extern const u8 Debug_EventScript_Script_1[]; extern const u8 Debug_EventScript_Script_2[]; extern const u8 Debug_EventScript_Script_3[]; @@ -532,6 +376,8 @@ extern const u8 Debug_CheckROMSpace[]; extern const u8 Debug_BoxFilledMessage[]; extern const u8 Debug_ShowExpansionVersion[]; extern const u8 Debug_EventScript_EWRAMCounters[]; +extern const u8 Debug_Follower_NPC_Event_Script[]; +extern const u8 Debug_Follower_NPC_Not_Enabled[]; extern const u8 Debug_EventScript_Steven_Multi[]; extern const u8 Debug_EventScript_PrintTimeOfDay[]; extern const u8 Debug_EventScript_TellTheTime[]; @@ -540,19 +386,20 @@ extern const u8 Debug_EventScript_FakeRTCNotEnabled[]; extern const u8 Debug_BerryPestsDisabled[]; extern const u8 Debug_BerryWeedsDisabled[]; -extern const u8 FallarborTown_MoveRelearnersHouse_EventScript_ChooseMon[]; +extern const u8 Common_EventScript_MoveRelearner[]; #include "data/map_group_count.h" // Text // General +static const u8 sDebugText_Arrow[] = _("{CLEAR_TO 110}{RIGHT_ARROW}"); static const u8 sDebugText_True[] = _("TRUE"); static const u8 sDebugText_False[] = _("FALSE"); static const u8 sDebugText_Colored_True[] = _("{COLOR GREEN}TRUE"); static const u8 sDebugText_Colored_False[] = _("{COLOR RED}FALSE"); static const u8 sDebugText_Dashes[] = _("---"); static const u8 sDebugText_Empty[] = _(""); -static const u8 sDebugText_Continue[] = _("Continue…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Continue[] = _("Continue…"); // Util Menu static const u8 sDebugText_Util_WarpToMap_SelectMapGroup[] = _("Group: {STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n\n{STR_VAR_3}{CLEAR_TO 90}"); static const u8 sDebugText_Util_WarpToMap_SelectMap[] = _("Map: {STR_VAR_1}{CLEAR_TO 90}\nMapSec:{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}\n{STR_VAR_3}{CLEAR_TO 90}"); @@ -579,21 +426,23 @@ static const u8 *const gTimeOfDayStringsTable[TIMES_OF_DAY_COUNT] = { COMPOUND_STRING("Night"), }; +// Follower NPC + +static const u8 *const gFollowerNPCStringsTable[DEBUG_FNPC_COUNT] = { + COMPOUND_STRING("Brendan"), + COMPOUND_STRING("May"), + COMPOUND_STRING("Steven"), + COMPOUND_STRING("Wally"), + COMPOUND_STRING("Red"), + COMPOUND_STRING("Leaf"), +}; + // Flags/Vars Menu -static const u8 sDebugText_FlagsVars_Flag[] = _("Flag: {STR_VAR_1}{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}\n{STR_VAR_3}"); static const u8 sDebugText_FlagsVars_VariableHex[] = _("{STR_VAR_1}{CLEAR_TO 90}\n0x{STR_VAR_2}{CLEAR_TO 90}"); static const u8 sDebugText_FlagsVars_Variable[] = _("Var: {STR_VAR_1}{CLEAR_TO 90}\nVal: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_2}"); static const u8 sDebugText_FlagsVars_VariableValueSet[] = _("Var: {STR_VAR_1}{CLEAR_TO 90}\nVal: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_2}"); // Give Menu -static const u8 sDebugText_ItemQuantity[] = _("Quantity:{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n\n{STR_VAR_2}"); -static const u8 sDebugText_ItemID[] = _("Item ID: {STR_VAR_3}\n{STR_VAR_1}{CLEAR_TO 90}\n\n{STR_VAR_2}"); -static const u8 sDebugText_PokemonID[] = _("Species: {STR_VAR_3}\n{STR_VAR_1}{CLEAR_TO 90}\n\n{STR_VAR_2}{CLEAR_TO 90}"); -static const u8 sDebugText_PokemonLevel[] = _("Level:{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); static const u8 sDebugText_PokemonShiny[] = _("Shiny:{CLEAR_TO 90}\n {STR_VAR_2}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{CLEAR_TO 90}"); -static const u8 sDebugText_PokemonAbility[] = _("Ability Num: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); -static const u8 sDebugText_PokemonTeraType[] = _("Tera Type: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); -static const u8 sDebugText_PokemonDynamaxLevel[] = _("Dmax Lvl:{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); -static const u8 sDebugText_PokemonGmaxFactor[] = _("Gmax Factor:{CLEAR_TO 90}\n {STR_VAR_2}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{CLEAR_TO 90}"); static const u8 sDebugText_IVs[] = _("IV {STR_VAR_1}:{CLEAR_TO 90}\n {STR_VAR_3}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); static const u8 sDebugText_EVs[] = _("EV {STR_VAR_1}:{CLEAR_TO 90}\n {STR_VAR_3}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); // Sound Menu @@ -627,378 +476,214 @@ static const s32 sPowersOfTen[] = }; // ******************************* -// List Menu Items -static const struct ListMenuItem sDebugMenu_Items_Main[] = -{ - [DEBUG_MENU_ITEM_UTILITIES] = {COMPOUND_STRING("Utilities…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_UTILITIES}, - [DEBUG_MENU_ITEM_PCBAG] = {COMPOUND_STRING("PC/Bag…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_PCBAG}, - [DEBUG_MENU_ITEM_PARTY] = {COMPOUND_STRING("Party…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_PARTY}, - [DEBUG_MENU_ITEM_GIVE] = {COMPOUND_STRING("Give X…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_GIVE}, - [DEBUG_MENU_ITEM_PLAYER] = {COMPOUND_STRING("Player…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_PLAYER}, - [DEBUG_MENU_ITEM_SCRIPTS] = {COMPOUND_STRING("Scripts…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_SCRIPTS}, - [DEBUG_MENU_ITEM_FLAGVAR] = {COMPOUND_STRING("Flags & Vars…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_FLAGVAR}, - //[DEBUG_MENU_ITEM_BATTLE] = {COMPOUND_STRING("Battle Test{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_BATTLE}, - [DEBUG_MENU_ITEM_SOUND] = {COMPOUND_STRING("Sound…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_SOUND}, - [DEBUG_MENU_ITEM_ROMINFO] = {COMPOUND_STRING("ROM Info…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_ROMINFO}, - [DEBUG_MENU_ITEM_CANCEL] = {COMPOUND_STRING("Cancel"), DEBUG_MENU_ITEM_CANCEL}, -}; - -static const struct ListMenuItem sDebugMenu_Items_Utilities[] = -{ - [DEBUG_UTIL_MENU_ITEM_FLY] = {COMPOUND_STRING("Fly to map…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_FLY}, - [DEBUG_UTIL_MENU_ITEM_WARP] = {COMPOUND_STRING("Warp to map warp…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_WARP}, - [DEBUG_UTIL_MENU_ITEM_WEATHER] = {COMPOUND_STRING("Set weather…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_WEATHER}, - [DEBUG_UTIL_MENU_ITEM_FONT_TEST] = {COMPOUND_STRING("Font Test…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_FONT_TEST}, - [DEBUG_UTIL_MENU_ITEM_TIME_MENU] = {COMPOUND_STRING("Time Functions…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_TIME_MENU}, - [DEBUG_UTIL_MENU_ITEM_WATCHCREDITS] = {COMPOUND_STRING("Watch credits…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_WATCHCREDITS}, - [DEBUG_UTIL_MENU_ITEM_CHEAT] = {COMPOUND_STRING("Cheat start"), DEBUG_UTIL_MENU_ITEM_CHEAT}, - [DEBUG_UTIL_MENU_ITEM_BERRY_FUNCTIONS] = {COMPOUND_STRING("Berry Functions…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_BERRY_FUNCTIONS}, - [DEBUG_UTIL_MENU_ITEM_EWRAM_COUNTERS] = {COMPOUND_STRING("EWRAM Counters…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_EWRAM_COUNTERS}, - [DEBUG_UTIL_MENU_ITEM_STEVEN_MULTI] = {COMPOUND_STRING("Steven Multi"), DEBUG_UTIL_MENU_ITEM_STEVEN_MULTI}, -}; - -static const struct ListMenuItem sDebugMenu_Items_TimeMenu[] = -{ - [DEBUG_TIME_MENU_ITEM_PRINTTIME] = {COMPOUND_STRING("Print current time…"), DEBUG_TIME_MENU_ITEM_PRINTTIME}, - [DEBUG_TIME_MENU_ITEM_PRINTTIMEOFDAY] = {COMPOUND_STRING("{FONT_NARROW}Print current time of day…"), DEBUG_TIME_MENU_ITEM_PRINTTIMEOFDAY}, - [DEBUG_TIME_MENU_ITEM_TIMESOFDAY] = {COMPOUND_STRING("{FONT_NARROW}Change current time of day…"), DEBUG_TIME_MENU_ITEM_TIMESOFDAY}, - [DEBUG_TIME_MENU_ITEM_WEEKDAYS] = {COMPOUND_STRING("Change current weekday…"), DEBUG_TIME_MENU_ITEM_WEEKDAYS}, - [DEBUG_TIME_MENU_ITEM_CHECKWALLCLOCK] = {COMPOUND_STRING("Check wall clock…"), DEBUG_TIME_MENU_ITEM_CHECKWALLCLOCK}, - [DEBUG_TIME_MENU_ITEM_SETWALLCLOCK] = {COMPOUND_STRING("Set wall clock…"), DEBUG_TIME_MENU_ITEM_SETWALLCLOCK}, -}; - -static const struct ListMenuItem sDebugMenu_Items_TimeMenu_TimesOfDay[] = -{ - [DEBUG_TIME_MENU_ITEM_MORNING] = {gTimeOfDayStringsTable[TIME_MORNING], DEBUG_TIME_MENU_ITEM_MORNING}, - [DEBUG_TIME_MENU_ITEM_DAY] = {gTimeOfDayStringsTable[TIME_DAY], DEBUG_TIME_MENU_ITEM_DAY}, - [DEBUG_TIME_MENU_ITEM_EVENING] = {gTimeOfDayStringsTable[TIME_EVENING], DEBUG_TIME_MENU_ITEM_EVENING}, - [DEBUG_TIME_MENU_ITEM_NIGHT] = {gTimeOfDayStringsTable[TIME_NIGHT], DEBUG_TIME_MENU_ITEM_NIGHT}, -}; - -static const struct ListMenuItem sDebugMenu_Items_TimeMenu_Weekdays[] = -{ - [DEBUG_TIME_MENU_ITEM_SUNDAY] = {gDayNameStringsTable[WEEKDAY_SUN], DEBUG_TIME_MENU_ITEM_SUNDAY}, - [DEBUG_TIME_MENU_ITEM_MONDAY] = {gDayNameStringsTable[WEEKDAY_MON], DEBUG_TIME_MENU_ITEM_MONDAY}, - [DEBUG_TIME_MENU_ITEM_TUESDAY] = {gDayNameStringsTable[WEEKDAY_TUE], DEBUG_TIME_MENU_ITEM_TUESDAY}, - [DEBUG_TIME_MENU_ITEM_WEDNESDAY] = {gDayNameStringsTable[WEEKDAY_WED], DEBUG_TIME_MENU_ITEM_WEDNESDAY}, - [DEBUG_TIME_MENU_ITEM_THURSDAY] = {gDayNameStringsTable[WEEKDAY_THU], DEBUG_TIME_MENU_ITEM_THURSDAY}, - [DEBUG_TIME_MENU_ITEM_FRIDAY] = {gDayNameStringsTable[WEEKDAY_FRI], DEBUG_TIME_MENU_ITEM_FRIDAY}, - [DEBUG_TIME_MENU_ITEM_SATURDAY] = {gDayNameStringsTable[WEEKDAY_SAT], DEBUG_TIME_MENU_ITEM_SATURDAY}, -}; - -static const struct ListMenuItem sDebugMenu_Items_PCBag[] = -{ - [DEBUG_PCBAG_MENU_ITEM_ACCESS_PC] = {COMPOUND_STRING("Access PC"), DEBUG_PCBAG_MENU_ITEM_ACCESS_PC}, - [DEBUG_PCBAG_MENU_ITEM_FILL] = {COMPOUND_STRING("Fill…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_PCBAG_MENU_ITEM_FILL}, - [DEBUG_PCBAG_MENU_ITEM_CLEAR_BAG] = {COMPOUND_STRING("Clear Bag"), DEBUG_PCBAG_MENU_ITEM_CLEAR_BAG}, - [DEBUG_PCBAG_MENU_ITEM_CLEAR_BOXES] = {COMPOUND_STRING("Clear Storage Boxes"), DEBUG_PCBAG_MENU_ITEM_CLEAR_BOXES}, -}; - -static const struct ListMenuItem sDebugMenu_Items_PCBag_Fill[] = -{ - [DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_FAST] = {COMPOUND_STRING("Fill PC Boxes Fast"), DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_FAST}, - [DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_SLOW] = {COMPOUND_STRING("Fill PC Boxes Slow (LAG!)"), DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_SLOW}, - [DEBUG_PCBAG_MENU_ITEM_FILL_PC_ITEMS] = {COMPOUND_STRING("Fill PC Items") , DEBUG_PCBAG_MENU_ITEM_FILL_PC_ITEMS}, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_ITEMS] = {COMPOUND_STRING("Fill Pocket Items"), DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_ITEMS}, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BALLS] = {COMPOUND_STRING("Fill Pocket PokΓ© Balls"), DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BALLS}, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_TMHM] = {COMPOUND_STRING("Fill Pocket TMHM"), DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_TMHM}, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BERRIES] = {COMPOUND_STRING("Fill Pocket Berries"), DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BERRIES}, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_KEY_ITEMS] = {COMPOUND_STRING("Fill Pocket Key Items"), DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_KEY_ITEMS}, -}; - -static const struct ListMenuItem sDebugMenu_Items_Party[] = -{ - [DEBUG_PARTY_MENU_ITEM_MOVE_REMINDER] = {COMPOUND_STRING("Move Reminder"), DEBUG_PARTY_MENU_ITEM_MOVE_REMINDER}, - [DEBUG_PARTY_MENU_ITEM_HATCH_AN_EGG] = {COMPOUND_STRING("Hatch an Egg"), DEBUG_PARTY_MENU_ITEM_HATCH_AN_EGG}, - [DEBUG_PARTY_MENU_ITEM_HEAL_PARTY] = {COMPOUND_STRING("Heal party"), DEBUG_PARTY_MENU_ITEM_HEAL_PARTY}, - [DEBUG_PARTY_MENU_ITEM_INFLICT_STATUS1] = {COMPOUND_STRING("Inflict Status1"), DEBUG_PARTY_MENU_ITEM_INFLICT_STATUS1}, - [DEBUG_PARTY_MENU_ITEM_CHECK_EVS] = {COMPOUND_STRING("Check EVs"), DEBUG_PARTY_MENU_ITEM_CHECK_EVS}, - [DEBUG_PARTY_MENU_ITEM_CHECK_IVS] = {COMPOUND_STRING("Check IVs"), DEBUG_PARTY_MENU_ITEM_CHECK_IVS}, - [DEBUG_PARTY_MENU_ITEM_CLEAR_PARTY] = {COMPOUND_STRING("Clear Party"), DEBUG_PARTY_MENU_ITEM_CLEAR_PARTY}, +// Menu Actions. Make sure that submenus are defined before the menus that call them. +static const struct DebugMenuOption sDebugMenu_Actions_TimeMenu_TimesOfDay[] = +{ + [TIME_MORNING] = { gTimeOfDayStringsTable[TIME_MORNING], DebugAction_TimeMenu_ChangeTimeOfDay }, + [TIME_DAY] = { gTimeOfDayStringsTable[TIME_DAY], DebugAction_TimeMenu_ChangeTimeOfDay }, + [TIME_EVENING] = { gTimeOfDayStringsTable[TIME_EVENING], DebugAction_TimeMenu_ChangeTimeOfDay }, + [TIME_NIGHT] = { gTimeOfDayStringsTable[TIME_NIGHT], DebugAction_TimeMenu_ChangeTimeOfDay }, + { NULL } }; -static const struct ListMenuItem sDebugMenu_Items_Scripts[] = +static const struct DebugMenuOption sDebugMenu_Actions_TimeMenu_Weekdays[] = { - [DEBUG_UTIL_MENU_ITEM_SCRIPT_1] = {COMPOUND_STRING("Script 1"), DEBUG_UTIL_MENU_ITEM_SCRIPT_1}, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_2] = {COMPOUND_STRING("Script 2"), DEBUG_UTIL_MENU_ITEM_SCRIPT_2}, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_3] = {COMPOUND_STRING("Script 3"), DEBUG_UTIL_MENU_ITEM_SCRIPT_3}, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_4] = {COMPOUND_STRING("Script 4"), DEBUG_UTIL_MENU_ITEM_SCRIPT_4}, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_5] = {COMPOUND_STRING("Script 5"), DEBUG_UTIL_MENU_ITEM_SCRIPT_5}, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_6] = {COMPOUND_STRING("Script 6"), DEBUG_UTIL_MENU_ITEM_SCRIPT_6}, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_7] = {COMPOUND_STRING("Script 7"), DEBUG_UTIL_MENU_ITEM_SCRIPT_7}, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_8] = {COMPOUND_STRING("Script 8"), DEBUG_UTIL_MENU_ITEM_SCRIPT_8}, -}; - -static const struct ListMenuItem sDebugMenu_Items_FlagsVars[] = -{ - [DEBUG_FLAGVAR_MENU_ITEM_FLAGS] = {COMPOUND_STRING("Set Flag XYZ…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_FLAGVAR_MENU_ITEM_FLAGS}, - [DEBUG_FLAGVAR_MENU_ITEM_VARS] = {COMPOUND_STRING("Set Var XYZ…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_FLAGVAR_MENU_ITEM_VARS}, - [DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_ALL] = {COMPOUND_STRING("PokΓ©dex Flags All"), DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_ALL}, - [DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_RESET] = {COMPOUND_STRING("PokΓ©dex Flags Reset"), DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_RESET}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKEDEX] = {COMPOUND_STRING("Toggle {STR_VAR_1}PokΓ©dex"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKEDEX}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_NATDEX] = {COMPOUND_STRING("Toggle {STR_VAR_1}National Dex"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_NATDEX}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKENAV] = {COMPOUND_STRING("Toggle {STR_VAR_1}PokΓ©Nav"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKENAV}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_MATCH_CALL] = {COMPOUND_STRING("Toggle {STR_VAR_1}Match Call"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_MATCH_CALL}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_RUN_SHOES] = {COMPOUND_STRING("Toggle {STR_VAR_1}Running Shoes"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_RUN_SHOES}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_LOCATIONS] = {COMPOUND_STRING("Toggle {STR_VAR_1}Fly Flags"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_LOCATIONS}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BADGES_ALL] = {COMPOUND_STRING("Toggle {STR_VAR_1}All badges"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BADGES_ALL}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_GAME_CLEAR] = {COMPOUND_STRING("Toggle {STR_VAR_1}Game clear"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_GAME_CLEAR}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_FRONTIER_PASS] = {COMPOUND_STRING("Toggle {STR_VAR_1}Frontier Pass"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_FRONTIER_PASS}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLLISION] = {COMPOUND_STRING("Toggle {STR_VAR_1}Collision OFF"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLLISION}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_ENCOUNTER] = {COMPOUND_STRING("Toggle {STR_VAR_1}Encounter OFF"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_ENCOUNTER}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_TRAINER_SEE] = {COMPOUND_STRING("Toggle {STR_VAR_1}Trainer See OFF"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_TRAINER_SEE}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE] = {COMPOUND_STRING("Toggle {STR_VAR_1}Bag Use OFF"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING] = {COMPOUND_STRING("Toggle {STR_VAR_1}Catching OFF"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING}, + [WEEKDAY_SUN] = { gDayNameStringsTable[WEEKDAY_SUN], DebugAction_TimeMenu_ChangeWeekdays }, + [WEEKDAY_MON] = { gDayNameStringsTable[WEEKDAY_MON], DebugAction_TimeMenu_ChangeWeekdays }, + [WEEKDAY_TUE] = { gDayNameStringsTable[WEEKDAY_TUE], DebugAction_TimeMenu_ChangeWeekdays }, + [WEEKDAY_WED] = { gDayNameStringsTable[WEEKDAY_WED], DebugAction_TimeMenu_ChangeWeekdays }, + [WEEKDAY_THU] = { gDayNameStringsTable[WEEKDAY_THU], DebugAction_TimeMenu_ChangeWeekdays }, + [WEEKDAY_FRI] = { gDayNameStringsTable[WEEKDAY_FRI], DebugAction_TimeMenu_ChangeWeekdays }, + [WEEKDAY_SAT] = { gDayNameStringsTable[WEEKDAY_SAT], DebugAction_TimeMenu_ChangeWeekdays }, + { NULL } }; -static const struct ListMenuItem sDebugMenu_Items_Battle_0[] = +static const struct DebugMenuOption sDebugMenu_Actions_FollowerNPCMenu_Create[] = { - [DEBUG_BATTLE_0_MENU_ITEM_WILD] = {COMPOUND_STRING("Wild…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_0_MENU_ITEM_WILD}, - [DEBUG_BATTLE_0_MENU_ITEM_WILD_DOUBLE] = {COMPOUND_STRING("Wild Double…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_0_MENU_ITEM_WILD_DOUBLE}, - [DEBUG_BATTLE_0_MENU_ITEM_SINGLE] = {COMPOUND_STRING("Single…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_0_MENU_ITEM_SINGLE}, - [DEBUG_BATTLE_0_MENU_ITEM_DOUBLE] = {COMPOUND_STRING("Double…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_0_MENU_ITEM_DOUBLE}, - [DEBUG_BATTLE_0_MENU_ITEM_MULTI] = {COMPOUND_STRING("Multi…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_0_MENU_ITEM_MULTI}, -}; - -static const struct ListMenuItem sDebugMenu_Items_Battle_1[] = -{ - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_00] = {COMPOUND_STRING("{STR_VAR_1}Check bad move"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_00}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_01] = {COMPOUND_STRING("{STR_VAR_1}Try to faint"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_01}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_02] = {COMPOUND_STRING("{STR_VAR_1}Check viability"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_02}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_03] = {COMPOUND_STRING("{STR_VAR_1}Setup first turn"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_03}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_04] = {COMPOUND_STRING("{STR_VAR_1}Risky"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_04}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_05] = {COMPOUND_STRING("{STR_VAR_1}Prefer strongest move"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_05}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_06] = {COMPOUND_STRING("{STR_VAR_1}Prefer Baton Pass"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_06}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_07] = {COMPOUND_STRING("{STR_VAR_1}Double battle"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_07}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_08] = {COMPOUND_STRING("{STR_VAR_1}HP aware"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_08}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_09] = {COMPOUND_STRING("{STR_VAR_1}Negate Unaware"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_09}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_10] = {COMPOUND_STRING("{STR_VAR_1}Will suicide"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_10}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_11] = {COMPOUND_STRING("{STR_VAR_1}Help partner"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_11}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_12] = {COMPOUND_STRING("{STR_VAR_1}Prefer status moves"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_12}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_13] = {COMPOUND_STRING("{STR_VAR_1}Stall"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_13}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_14] = {COMPOUND_STRING("{STR_VAR_1}Screener"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_14}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_15] = {COMPOUND_STRING("{STR_VAR_1}Smart switching"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_15}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_16] = {COMPOUND_STRING("{STR_VAR_1}Ace pokemon"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_16}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_17] = {COMPOUND_STRING("{STR_VAR_1}Omniscient"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_17}, - [DEBUG_BATTLE_1_MENU_ITEM_CONTINUE] = {sDebugText_Continue, DEBUG_BATTLE_1_MENU_ITEM_CONTINUE}, -}; - -static const struct ListMenuItem sDebugMenu_Items_Battle_2[] = -{ - [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_0] = {COMPOUND_STRING("Grass…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_0}, - [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_1] = {COMPOUND_STRING("Long grass…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_1}, - [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_2] = {COMPOUND_STRING("Sand…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_2}, - [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_3] = {COMPOUND_STRING("Underwater…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_3}, - [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_4] = {COMPOUND_STRING("Water…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_4}, - [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_5] = {COMPOUND_STRING("Pond…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_5}, - [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_6] = {COMPOUND_STRING("Mountain…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_6}, - [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_7] = {COMPOUND_STRING("Cave…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_7}, - [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_8] = {COMPOUND_STRING("Building…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_8}, - [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_9] = {COMPOUND_STRING("Plain…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_9}, + [DEBUG_FNPC_BRENDAN] = { gFollowerNPCStringsTable[DEBUG_FNPC_BRENDAN], DebugAction_CreateFollowerNPC }, + [DEBUG_FNPC_MAY] = { gFollowerNPCStringsTable[DEBUG_FNPC_MAY], DebugAction_CreateFollowerNPC }, + [DEBUG_FNPC_STEVEN] = { gFollowerNPCStringsTable[DEBUG_FNPC_STEVEN], DebugAction_CreateFollowerNPC }, + [DEBUG_FNPC_WALLY] = { gFollowerNPCStringsTable[DEBUG_FNPC_WALLY], DebugAction_CreateFollowerNPC }, + [DEBUG_FNPC_RED] = { gFollowerNPCStringsTable[DEBUG_FNPC_RED], DebugAction_CreateFollowerNPC }, + [DEBUG_FNPC_LEAF] = { gFollowerNPCStringsTable[DEBUG_FNPC_LEAF], DebugAction_CreateFollowerNPC }, + { NULL } }; -static const struct ListMenuItem sDebugMenu_Items_Give[] = +static const struct DebugMenuOption sDebugMenu_Actions_TimeMenu[] = { - [DEBUG_GIVE_MENU_ITEM_ITEM_X] = {COMPOUND_STRING("Give item XYZ…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_GIVE_MENU_ITEM_ITEM_X}, - [DEBUG_GIVE_MENU_ITEM_POKEMON_SIMPLE] = {COMPOUND_STRING("PokΓ©mon (Basic){CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_GIVE_MENU_ITEM_POKEMON_SIMPLE}, - [DEBUG_GIVE_MENU_ITEM_POKEMON_COMPLEX] = {COMPOUND_STRING("PokΓ©mon (Complex){CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_GIVE_MENU_ITEM_POKEMON_COMPLEX}, - [DEBUG_GIVE_MENU_ITEM_MAX_MONEY] = {COMPOUND_STRING("Max Money"), DEBUG_GIVE_MENU_ITEM_MAX_MONEY}, - [DEBUG_GIVE_MENU_ITEM_MAX_COINS] = {COMPOUND_STRING("Max Coins"), DEBUG_GIVE_MENU_ITEM_MAX_COINS}, - [DEBUG_GIVE_MENU_ITEM_MAX_BATTLE_POINTS] = {COMPOUND_STRING("Max Battle Points"), DEBUG_GIVE_MENU_ITEM_MAX_BATTLE_POINTS}, - [DEBUG_GIVE_MENU_ITEM_DAYCARE_EGG] = {COMPOUND_STRING("Daycare Egg"), DEBUG_GIVE_MENU_ITEM_DAYCARE_EGG}, + { COMPOUND_STRING("Get time…"), DebugAction_ExecuteScript, Debug_EventScript_TellTheTime }, + { COMPOUND_STRING("Get time of day…"), DebugAction_ExecuteScript, Debug_EventScript_PrintTimeOfDay }, + { COMPOUND_STRING("Set time of day…"), DebugAction_OpenSubMenuFakeRTC, sDebugMenu_Actions_TimeMenu_TimesOfDay }, + { COMPOUND_STRING("Set weekday…"), DebugAction_OpenSubMenuFakeRTC, sDebugMenu_Actions_TimeMenu_Weekdays }, + { COMPOUND_STRING("Check wall clock…"), DebugAction_ExecuteScript, PlayersHouse_2F_EventScript_CheckWallClock }, + { COMPOUND_STRING("Set wall clock…"), DebugAction_ExecuteScript, PlayersHouse_2F_EventScript_SetWallClock }, + { NULL } }; -static const struct ListMenuItem sDebugMenu_Items_Sound[] = +static const struct DebugMenuOption sDebugMenu_Actions_BerryFunctions[] = { - [DEBUG_SOUND_MENU_ITEM_SE] = {COMPOUND_STRING("SFX…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_SOUND_MENU_ITEM_SE}, - [DEBUG_SOUND_MENU_ITEM_MUS] = {COMPOUND_STRING("Music…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_SOUND_MENU_ITEM_MUS}, + { COMPOUND_STRING("Clear map trees"), DebugAction_BerryFunctions_ClearAll }, + { COMPOUND_STRING("Ready map trees"), DebugAction_BerryFunctions_Ready }, + { COMPOUND_STRING("Grow map trees"), DebugAction_BerryFunctions_NextStage }, + { COMPOUND_STRING("Give map trees pests"), DebugAction_BerryFunctions_Pests }, + { COMPOUND_STRING("Give map trees weeds"), DebugAction_BerryFunctions_Weeds }, + { NULL } }; -static const struct ListMenuItem sDebugMenu_Items_BerryFunctions[] = +static const struct DebugMenuOption sDebugMenu_Actions_FollowerNPCMenu[] = { - [DEBUG_BERRY_FUNCTIONS_MENU_CLEAR_ALL] = {COMPOUND_STRING("Clear map trees"), DEBUG_BERRY_FUNCTIONS_MENU_CLEAR_ALL}, - [DEBUG_BERRY_FUNCTIONS_MENU_READY] = {COMPOUND_STRING("Ready map trees"), DEBUG_BERRY_FUNCTIONS_MENU_READY}, - [DEBUG_BERRY_FUNCTIONS_MENU_NEXT_STAGE] = {COMPOUND_STRING("Grow map trees"), DEBUG_BERRY_FUNCTIONS_MENU_NEXT_STAGE}, - [DEBUG_BERRY_FUNCTIONS_MENU_PESTS] = {COMPOUND_STRING("Give map trees pests"), DEBUG_BERRY_FUNCTIONS_MENU_PESTS}, - [DEBUG_BERRY_FUNCTIONS_MENU_WEEDS] = {COMPOUND_STRING("Give map trees weeds"), DEBUG_BERRY_FUNCTIONS_MENU_WEEDS}, -}; - -static const struct ListMenuItem sDebugMenu_Items_Player[] = -{ - [DEBUG_PLAYER_MENU_ITEM_PLAYER_NAME] = {COMPOUND_STRING("Player name"), DEBUG_PLAYER_MENU_ITEM_PLAYER_NAME}, - [DEBUG_PLAYER_MENU_ITEM_PLAYER_GENDER] = {COMPOUND_STRING("Toggle gender"), DEBUG_PLAYER_MENU_ITEM_PLAYER_GENDER}, - [DEBUG_PLAYER_MENU_ITEM_PLAYER_ID] = {COMPOUND_STRING("New Trainer ID"), DEBUG_PLAYER_MENU_ITEM_PLAYER_ID}, -}; - -static const struct ListMenuItem sDebugMenu_Items_ROMInfo[] = -{ - [DEBUG_ROM_INFO_MENU_ITEM_SAVEBLOCK] = {COMPOUND_STRING("Save Block space"), DEBUG_ROM_INFO_MENU_ITEM_SAVEBLOCK}, - [DEBUG_ROM_INFO_MENU_ITEM_ROM_SPACE] = {COMPOUND_STRING("ROM space"), DEBUG_ROM_INFO_MENU_ITEM_ROM_SPACE}, - [DEBUG_ROM_INFO_MENU_ITEM_EXPANSION_VER] = {COMPOUND_STRING("Expansion Version"), DEBUG_ROM_INFO_MENU_ITEM_EXPANSION_VER}, -}; - -// ******************************* -// Menu Actions -static void (*const sDebugMenu_Actions_Main[])(u8) = -{ - [DEBUG_MENU_ITEM_UTILITIES] = DebugAction_OpenUtilitiesMenu, - [DEBUG_MENU_ITEM_PCBAG] = DebugAction_OpenPCBagMenu, - [DEBUG_MENU_ITEM_PARTY] = DebugAction_OpenPartyMenu, - [DEBUG_MENU_ITEM_GIVE] = DebugAction_OpenGiveMenu, - [DEBUG_MENU_ITEM_PLAYER] = DebugAction_OpenPlayerMenu, - [DEBUG_MENU_ITEM_SCRIPTS] = DebugAction_OpenScriptsMenu, - [DEBUG_MENU_ITEM_FLAGVAR] = DebugAction_OpenFlagsVarsMenu, - //[DEBUG_MENU_ITEM_BATTLE] = DebugAction_OpenBattleMenu, - [DEBUG_MENU_ITEM_SOUND] = DebugAction_OpenSoundMenu, - [DEBUG_MENU_ITEM_ROMINFO] = DebugAction_OpenROMInfoMenu, - [DEBUG_MENU_ITEM_CANCEL] = DebugAction_Cancel -}; - -static void (*const sDebugMenu_Actions_Utilities[])(u8) = -{ - [DEBUG_UTIL_MENU_ITEM_FLY] = DebugAction_Util_Fly, - [DEBUG_UTIL_MENU_ITEM_WARP] = DebugAction_Util_Warp_Warp, - [DEBUG_UTIL_MENU_ITEM_WEATHER] = DebugAction_Util_Weather, - [DEBUG_UTIL_MENU_ITEM_FONT_TEST] = DebugAction_Util_FontTest, - [DEBUG_UTIL_MENU_ITEM_TIME_MENU] = DebugAction_Util_OpenTimeMenu, - [DEBUG_UTIL_MENU_ITEM_WATCHCREDITS] = DebugAction_Util_WatchCredits, - [DEBUG_UTIL_MENU_ITEM_CHEAT] = DebugAction_Util_CheatStart, - [DEBUG_UTIL_MENU_ITEM_BERRY_FUNCTIONS] = DebugAction_Util_BerryFunctions, - [DEBUG_UTIL_MENU_ITEM_EWRAM_COUNTERS] = DebugAction_Util_CheckEWRAMCounters, - [DEBUG_UTIL_MENU_ITEM_STEVEN_MULTI] = DebugAction_Util_Steven_Multi, + { COMPOUND_STRING("Create Follower"), DebugAction_OpenSubMenuCreateFollowerNPC, sDebugMenu_Actions_FollowerNPCMenu_Create }, + { COMPOUND_STRING("Destroy Follower"), DebugAction_DestroyFollowerNPC }, + { NULL } }; -static void (*const sDebugMenu_Actions_PCBag[])(u8) = -{ - [DEBUG_PCBAG_MENU_ITEM_ACCESS_PC] = DebugAction_PCBag_AccessPC, - [DEBUG_PCBAG_MENU_ITEM_FILL] = DebugAction_OpenPCBagFillMenu, - [DEBUG_PCBAG_MENU_ITEM_CLEAR_BAG] = DebugAction_PCBag_ClearBag, - [DEBUG_PCBAG_MENU_ITEM_CLEAR_BOXES] = DebugAction_PCBag_ClearBoxes, +static const struct DebugMenuOption sDebugMenu_Actions_Utilities[] = +{ + { COMPOUND_STRING("Fly to map…"), DebugAction_Util_Fly }, + { COMPOUND_STRING("Warp to map warp…"), DebugAction_Util_Warp_Warp }, + { COMPOUND_STRING("Set weather…"), DebugAction_Util_Weather }, + { COMPOUND_STRING("Font Test…"), DebugAction_ExecuteScript, Debug_EventScript_FontTest }, + { COMPOUND_STRING("Time Functions…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_TimeMenu, }, + { COMPOUND_STRING("Watch credits…"), DebugAction_Util_WatchCredits }, + { COMPOUND_STRING("Cheat start"), DebugAction_Util_CheatStart }, + { COMPOUND_STRING("Berry Functions…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_BerryFunctions }, + { COMPOUND_STRING("EWRAM Counters…"), DebugAction_ExecuteScript, Debug_EventScript_EWRAMCounters }, + { COMPOUND_STRING("Follower NPC…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_FollowerNPCMenu }, + { COMPOUND_STRING("Steven Multi"), DebugAction_ExecuteScript, Debug_EventScript_Steven_Multi }, + { NULL } }; -static void (*const sDebugMenu_Actions_PCBag_Fill[])(u8) = -{ - [DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_FAST] = DebugAction_PCBag_Fill_PCBoxes_Fast, - [DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_SLOW] = DebugAction_PCBag_Fill_PCBoxes_Slow, - [DEBUG_PCBAG_MENU_ITEM_FILL_PC_ITEMS] = DebugAction_PCBag_Fill_PCItemStorage, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_ITEMS] = DebugAction_PCBag_Fill_PocketItems, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BALLS] = DebugAction_PCBag_Fill_PocketPokeBalls, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_TMHM] = DebugAction_PCBag_Fill_PocketTMHM, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BERRIES] = DebugAction_PCBag_Fill_PocketBerries, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_KEY_ITEMS] = DebugAction_PCBag_Fill_PocketKeyItems, +static const struct DebugMenuOption sDebugMenu_Actions_PCBag_Fill[] = +{ + { COMPOUND_STRING("Fill PC Boxes Fast"), DebugAction_PCBag_Fill_PCBoxes_Fast }, + { COMPOUND_STRING("Fill PC Boxes Slow (LAG!)"), DebugAction_PCBag_Fill_PCBoxes_Slow }, + { COMPOUND_STRING("Fill PC Items") , DebugAction_PCBag_Fill_PCItemStorage }, + { COMPOUND_STRING("Fill Pocket Items"), DebugAction_PCBag_Fill_PocketItems }, + { COMPOUND_STRING("Fill Pocket PokΓ© Balls"), DebugAction_PCBag_Fill_PocketPokeBalls }, + { COMPOUND_STRING("Fill Pocket TMHM"), DebugAction_PCBag_Fill_PocketTMHM }, + { COMPOUND_STRING("Fill Pocket Berries"), DebugAction_PCBag_Fill_PocketBerries }, + { COMPOUND_STRING("Fill Pocket Key Items"), DebugAction_PCBag_Fill_PocketKeyItems }, + { NULL } }; -static void (*const sDebugMenu_Actions_Party[])(u8) = +static const struct DebugMenuOption sDebugMenu_Actions_PCBag[] = { - [DEBUG_PARTY_MENU_ITEM_MOVE_REMINDER] = DebugAction_Party_MoveReminder, - [DEBUG_PARTY_MENU_ITEM_HATCH_AN_EGG] = DebugAction_Party_HatchAnEgg, - [DEBUG_PARTY_MENU_ITEM_HEAL_PARTY] = DebugAction_Party_HealParty, - [DEBUG_PARTY_MENU_ITEM_INFLICT_STATUS1] = DebugAction_Party_InflictStatus1, - [DEBUG_PARTY_MENU_ITEM_CHECK_EVS] = DebugAction_Party_CheckEVs, - [DEBUG_PARTY_MENU_ITEM_CHECK_IVS] = DebugAction_Party_CheckIVs, - [DEBUG_PARTY_MENU_ITEM_CLEAR_PARTY] = DebugAction_Party_ClearParty, + { COMPOUND_STRING("Access PC"), DebugAction_ExecuteScript, EventScript_PC }, + { COMPOUND_STRING("Fill…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_PCBag_Fill }, + { COMPOUND_STRING("Clear Bag"), DebugAction_PCBag_ClearBag }, + { COMPOUND_STRING("Clear Storage Boxes"), DebugAction_PCBag_ClearBoxes }, + { NULL } }; -static void (*const sDebugMenu_Actions_Scripts[])(u8) = -{ - [DEBUG_UTIL_MENU_ITEM_SCRIPT_1] = DebugAction_Util_Script_1, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_2] = DebugAction_Util_Script_2, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_3] = DebugAction_Util_Script_3, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_4] = DebugAction_Util_Script_4, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_5] = DebugAction_Util_Script_5, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_6] = DebugAction_Util_Script_6, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_7] = DebugAction_Util_Script_7, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_8] = DebugAction_Util_Script_8, +static const struct DebugMenuOption sDebugMenu_Actions_Party[] = +{ + { COMPOUND_STRING("Move Relearner"), DebugAction_ExecuteScript, Common_EventScript_MoveRelearner }, + { COMPOUND_STRING("Hatch an Egg"), DebugAction_ExecuteScript, Debug_HatchAnEgg }, + { COMPOUND_STRING("Heal party"), DebugAction_Party_HealParty }, + { COMPOUND_STRING("Inflict Status1"), DebugAction_ExecuteScript, Debug_EventScript_InflictStatus1 }, + { COMPOUND_STRING("Set Hidden Nature"), DebugAction_ExecuteScript, Debug_EventScript_SetHiddenNature }, + { COMPOUND_STRING("Set Friendship"), DebugAction_ExecuteScript, Debug_EventScript_SetFriendship }, + { COMPOUND_STRING("Set Ability"), DebugAction_ExecuteScript, Debug_EventScript_SetAbility }, + { COMPOUND_STRING("Check EVs"), DebugAction_ExecuteScript, Debug_EventScript_CheckEVs }, + { COMPOUND_STRING("Check IVs"), DebugAction_ExecuteScript, Debug_EventScript_CheckIVs }, + { COMPOUND_STRING("Clear Party"), DebugAction_Party_ClearParty }, + { COMPOUND_STRING("Set Party"), DebugAction_Party_SetParty }, + { COMPOUND_STRING("Start Debug Battle"), DebugAction_Party_BattleSingle }, + { NULL } }; -static void (*const sDebugMenu_Actions_Flags[])(u8) = -{ - [DEBUG_FLAGVAR_MENU_ITEM_FLAGS] = DebugAction_FlagsVars_Flags, - [DEBUG_FLAGVAR_MENU_ITEM_VARS] = DebugAction_FlagsVars_Vars, - [DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_ALL] = DebugAction_FlagsVars_PokedexFlags_All, - [DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_RESET] = DebugAction_FlagsVars_PokedexFlags_Reset, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKEDEX] = DebugAction_FlagsVars_SwitchDex, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_NATDEX] = DebugAction_FlagsVars_SwitchNatDex, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKENAV] = DebugAction_FlagsVars_SwitchPokeNav, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_MATCH_CALL] = DebugAction_FlagsVars_SwitchMatchCall, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_RUN_SHOES] = DebugAction_FlagsVars_RunningShoes, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_LOCATIONS] = DebugAction_FlagsVars_ToggleFlyFlags, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BADGES_ALL] = DebugAction_FlagsVars_ToggleBadgeFlags, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_GAME_CLEAR] = DebugAction_FlagsVars_ToggleGameClear, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_FRONTIER_PASS] = DebugAction_FlagsVars_ToggleFrontierPass, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLLISION] = DebugAction_FlagsVars_CollisionOnOff, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_ENCOUNTER] = DebugAction_FlagsVars_EncounterOnOff, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_TRAINER_SEE] = DebugAction_FlagsVars_TrainerSeeOnOff, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE] = DebugAction_FlagsVars_BagUseOnOff, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING] = DebugAction_FlagsVars_CatchingOnOff, -}; -static void (*const sDebugMenu_Actions_Give[])(u8) = -{ - [DEBUG_GIVE_MENU_ITEM_ITEM_X] = DebugAction_Give_Item, - [DEBUG_GIVE_MENU_ITEM_POKEMON_SIMPLE] = DebugAction_Give_PokemonSimple, - [DEBUG_GIVE_MENU_ITEM_POKEMON_COMPLEX] = DebugAction_Give_PokemonComplex, - [DEBUG_GIVE_MENU_ITEM_MAX_MONEY] = DebugAction_Give_MaxMoney, - [DEBUG_GIVE_MENU_ITEM_MAX_COINS] = DebugAction_Give_MaxCoins, - [DEBUG_GIVE_MENU_ITEM_MAX_BATTLE_POINTS] = DebugAction_Give_MaxBattlePoints, - [DEBUG_GIVE_MENU_ITEM_DAYCARE_EGG] = DebugAction_Give_DayCareEgg, +static const struct DebugMenuOption sDebugMenu_Actions_Give[] = +{ + { COMPOUND_STRING("Give item XYZ…"), DebugAction_Give_Item }, + { COMPOUND_STRING("PokΓ©mon (Basic)"), DebugAction_Give_PokemonSimple }, + { COMPOUND_STRING("PokΓ©mon (Complex)"), DebugAction_Give_PokemonComplex }, + { COMPOUND_STRING("Give Decoration…"), DebugAction_Give_Decoration }, + { COMPOUND_STRING("Max Money"), DebugAction_Give_MaxMoney }, + { COMPOUND_STRING("Max Coins"), DebugAction_Give_MaxCoins }, + { COMPOUND_STRING("Max Battle Points"), DebugAction_Give_MaxBattlePoints }, + { COMPOUND_STRING("Daycare Egg"), DebugAction_Give_DayCareEgg }, + { NULL } }; -static void (*const sDebugMenu_Actions_Sound[])(u8) = +static const struct DebugMenuOption sDebugMenu_Actions_Player[] = { - [DEBUG_SOUND_MENU_ITEM_SE] = DebugAction_Sound_SE, - [DEBUG_SOUND_MENU_ITEM_MUS] = DebugAction_Sound_MUS, + { COMPOUND_STRING("Player name"), DebugAction_Player_Name }, + { COMPOUND_STRING("Toggle gender"), DebugAction_Player_Gender }, + { COMPOUND_STRING("New Trainer ID"), DebugAction_Player_Id }, + { NULL } }; -static void (*const sDebugMenu_Actions_BerryFunctions[])(u8) = -{ - [DEBUG_BERRY_FUNCTIONS_MENU_CLEAR_ALL] = DebugAction_BerryFunctions_ClearAll, - [DEBUG_BERRY_FUNCTIONS_MENU_READY] = DebugAction_BerryFunctions_Ready, - [DEBUG_BERRY_FUNCTIONS_MENU_NEXT_STAGE] = DebugAction_BerryFunctions_NextStage, - [DEBUG_BERRY_FUNCTIONS_MENU_PESTS] = DebugAction_BerryFunctions_Pests, - [DEBUG_BERRY_FUNCTIONS_MENU_WEEDS] = DebugAction_BerryFunctions_Weeds, +static const struct DebugMenuOption sDebugMenu_Actions_Scripts[] = +{ + { COMPOUND_STRING("Script 1"), DebugAction_ExecuteScript, Debug_EventScript_Script_1 }, + { COMPOUND_STRING("Script 2"), DebugAction_ExecuteScript, Debug_EventScript_Script_2 }, + { COMPOUND_STRING("Script 3"), DebugAction_ExecuteScript, Debug_EventScript_Script_3 }, + { COMPOUND_STRING("Script 4"), DebugAction_ExecuteScript, Debug_EventScript_Script_4 }, + { COMPOUND_STRING("Script 5"), DebugAction_ExecuteScript, Debug_EventScript_Script_5 }, + { COMPOUND_STRING("Script 6"), DebugAction_ExecuteScript, Debug_EventScript_Script_6 }, + { COMPOUND_STRING("Script 7"), DebugAction_ExecuteScript, Debug_EventScript_Script_7 }, + { COMPOUND_STRING("Script 8"), DebugAction_ExecuteScript, Debug_EventScript_Script_8 }, + { NULL } }; -static void (*const sDebugMenu_Actions_TimeMenu[])(u8) = +static const struct DebugMenuOption sDebugMenu_Actions_Sound[] = { - [DEBUG_TIME_MENU_ITEM_PRINTTIME] = DebugAction_TimeMenu_PrintTime, - [DEBUG_TIME_MENU_ITEM_PRINTTIMEOFDAY] = DebugAction_TimeMenu_PrintTimeOfDay, - [DEBUG_TIME_MENU_ITEM_TIMESOFDAY] = DebugAction_TimeMenu_TimesOfDay, - [DEBUG_TIME_MENU_ITEM_WEEKDAYS] = DebugAction_TimeMenu_Weekdays, - [DEBUG_TIME_MENU_ITEM_CHECKWALLCLOCK] = DebugAction_TimeMenu_CheckWallClock, - [DEBUG_TIME_MENU_ITEM_SETWALLCLOCK] = DebugAction_TimeMenu_SetWallClock, + { COMPOUND_STRING("SFX…"), DebugAction_Sound_SE }, + { COMPOUND_STRING("Music…"), DebugAction_Sound_MUS }, + { NULL } }; -static void (*const sDebugMenu_Actions_TimeMenu_TimesOfDay[])(u8) = +static const struct DebugMenuOption sDebugMenu_Actions_ROMInfo2[] = { - [DEBUG_TIME_MENU_ITEM_MORNING] = DebugAction_TimeMenu_ChangeTimeOfDay, - [DEBUG_TIME_MENU_ITEM_DAY] = DebugAction_TimeMenu_ChangeTimeOfDay, - [DEBUG_TIME_MENU_ITEM_EVENING] = DebugAction_TimeMenu_ChangeTimeOfDay, - [DEBUG_TIME_MENU_ITEM_NIGHT] = DebugAction_TimeMenu_ChangeTimeOfDay, + { COMPOUND_STRING("Save Block space"), DebugAction_ExecuteScript, Debug_CheckSaveBlock }, + { COMPOUND_STRING("ROM space"), DebugAction_ExecuteScript, Debug_CheckROMSpace }, + { COMPOUND_STRING("Expansion Version"), DebugAction_ExecuteScript, Debug_ShowExpansionVersion }, + { NULL } }; -static void (*const sDebugMenu_Actions_TimeMenu_Weekdays[])(u8) = -{ - [DEBUG_TIME_MENU_ITEM_SUNDAY] = DebugAction_TimeMenu_ChangeWeekdays, - [DEBUG_TIME_MENU_ITEM_MONDAY] = DebugAction_TimeMenu_ChangeWeekdays, - [DEBUG_TIME_MENU_ITEM_TUESDAY] = DebugAction_TimeMenu_ChangeWeekdays, - [DEBUG_TIME_MENU_ITEM_WEDNESDAY] = DebugAction_TimeMenu_ChangeWeekdays, - [DEBUG_TIME_MENU_ITEM_THURSDAY] = DebugAction_TimeMenu_ChangeWeekdays, - [DEBUG_TIME_MENU_ITEM_FRIDAY] = DebugAction_TimeMenu_ChangeWeekdays, - [DEBUG_TIME_MENU_ITEM_SATURDAY] = DebugAction_TimeMenu_ChangeWeekdays, +static const struct DebugMenuOption sDebugMenu_Actions_Flags[] = +{ + [DEBUG_FLAGVAR_MENU_ITEM_FLAGS] = { COMPOUND_STRING("Set Flag XYZ…"), DebugAction_FlagsVars_Flags }, + [DEBUG_FLAGVAR_MENU_ITEM_VARS] = { COMPOUND_STRING("Set Var XYZ…"), DebugAction_FlagsVars_Vars }, + [DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_ALL] = { COMPOUND_STRING("PokΓ©dex Flags All"), DebugAction_FlagsVars_PokedexFlags_All }, + [DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_RESET] = { COMPOUND_STRING("PokΓ©dex Flags Reset"), DebugAction_FlagsVars_PokedexFlags_Reset }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKEDEX] = { COMPOUND_STRING("Toggle {STR_VAR_1}PokΓ©dex"), DebugAction_ToggleFlag, DebugAction_FlagsVars_SwitchDex }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_NATDEX] = { COMPOUND_STRING("Toggle {STR_VAR_1}National Dex"), DebugAction_ToggleFlag, DebugAction_FlagsVars_SwitchNatDex }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKENAV] = { COMPOUND_STRING("Toggle {STR_VAR_1}PokΓ©Nav"), DebugAction_ToggleFlag, DebugAction_FlagsVars_SwitchPokeNav }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_MATCH_CALL] = { COMPOUND_STRING("Toggle {STR_VAR_1}Match Call"), DebugAction_ToggleFlag, DebugAction_FlagsVars_SwitchMatchCall }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_RUN_SHOES] = { COMPOUND_STRING("Toggle {STR_VAR_1}Running Shoes"), DebugAction_ToggleFlag, DebugAction_FlagsVars_RunningShoes }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_LOCATIONS] = { COMPOUND_STRING("Toggle {STR_VAR_1}Fly Flags"), DebugAction_ToggleFlag, DebugAction_FlagsVars_ToggleFlyFlags }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BADGES_ALL] = { COMPOUND_STRING("Toggle {STR_VAR_1}All badges"), DebugAction_ToggleFlag, DebugAction_FlagsVars_ToggleBadgeFlags }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_GAME_CLEAR] = { COMPOUND_STRING("Toggle {STR_VAR_1}Game clear"), DebugAction_ToggleFlag, DebugAction_FlagsVars_ToggleGameClear }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_FRONTIER_PASS] = { COMPOUND_STRING("Toggle {STR_VAR_1}Frontier Pass"), DebugAction_ToggleFlag, DebugAction_FlagsVars_ToggleFrontierPass }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLLISION] = { COMPOUND_STRING("Toggle {STR_VAR_1}Collision OFF"), DebugAction_ToggleFlag, DebugAction_FlagsVars_CollisionOnOff }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_ENCOUNTER] = { COMPOUND_STRING("Toggle {STR_VAR_1}Encounter OFF"), DebugAction_ToggleFlag, DebugAction_FlagsVars_EncounterOnOff }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_TRAINER_SEE] = { COMPOUND_STRING("Toggle {STR_VAR_1}Trainer See OFF"), DebugAction_ToggleFlag, DebugAction_FlagsVars_TrainerSeeOnOff }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING] = { COMPOUND_STRING("Toggle {STR_VAR_1}Catching OFF"), DebugAction_ToggleFlag, DebugAction_FlagsVars_CatchingOnOff }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE] = { COMPOUND_STRING("Toggle {STR_VAR_1}Bag Use OFF"), DebugAction_ToggleFlag, DebugAction_FlagsVars_BagUseOnOff }, + { NULL } }; -static void (*const sDebugMenu_Actions_Player[])(u8) = +static const u8 *const sDebugMenu_Actions_BagUse_Options[] = { - [DEBUG_PLAYER_MENU_ITEM_PLAYER_NAME] = DebugAction_Player_Name, - [DEBUG_PLAYER_MENU_ITEM_PLAYER_GENDER] = DebugAction_Player_Gender, - [DEBUG_PLAYER_MENU_ITEM_PLAYER_ID] = DebugAction_Player_Id, + COMPOUND_STRING("No Bag: {STR_VAR_1}Inactive"), + COMPOUND_STRING("No Bag: {STR_VAR_1}VS Trainers"), + COMPOUND_STRING("No Bag: {STR_VAR_1}Active"), }; -static void (*const sDebugMenu_Actions_ROMInfo[])(u8) = -{ - [DEBUG_ROM_INFO_MENU_ITEM_SAVEBLOCK] = DebugAction_ROMInfo_CheckSaveBlock, - [DEBUG_ROM_INFO_MENU_ITEM_ROM_SPACE] = DebugAction_ROMInfo_CheckROMSpace, - [DEBUG_ROM_INFO_MENU_ITEM_EXPANSION_VER] = DebugAction_ROMInfo_ExpansionVersion, +static const struct DebugMenuOption sDebugMenu_Actions_Main[] = +{ + { COMPOUND_STRING("Utilities…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_Utilities, }, + { COMPOUND_STRING("PC/Bag…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_PCBag, }, + { COMPOUND_STRING("Party…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_Party, }, + { COMPOUND_STRING("Give X…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_Give, }, + { COMPOUND_STRING("Player…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_Player, }, + { COMPOUND_STRING("Scripts…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_Scripts, }, + { COMPOUND_STRING("Flags & Vars…"), DebugAction_OpenSubMenuFlagsVars, sDebugMenu_Actions_Flags, }, + { COMPOUND_STRING("Sound…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_Sound, }, + { COMPOUND_STRING("ROM Info…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_ROMInfo2, }, + { COMPOUND_STRING("Cancel"), DebugAction_Cancel, }, + { NULL } }; // ******************************* @@ -1047,182 +732,117 @@ static const struct WindowTemplate sDebugMenuWindowTemplateSound = .baseBlock = 1, }; -static const struct WindowTemplate sDebugMenuWindowTemplateFlagsVars = -{ - .bg = 0, - .tilemapLeft = 30 - DEBUG_MENU_WIDTH_FLAGVAR - 1, - .tilemapTop = 1, - .width = DEBUG_MENU_WIDTH_FLAGVAR, - .height = DEBUG_MENU_HEIGHT_FLAGVAR, - .paletteNum = 15, - .baseBlock = 1 + DEBUG_MENU_WIDTH_MAIN * DEBUG_MENU_HEIGHT_MAIN * 2, -}; +static bool32 Debug_SaveCallbackMenu(struct DebugMenuOption *callbackItems); // ******************************* -// List Menu Templates -static const struct ListMenuTemplate sDebugMenu_ListTemplate_Main = -{ - .items = sDebugMenu_Items_Main, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_Main), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_Utilities = -{ - .items = sDebugMenu_Items_Utilities, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_Utilities), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_PCBag = -{ - .items = sDebugMenu_Items_PCBag, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_PCBag), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_PCBag_Fill = -{ - .items = sDebugMenu_Items_PCBag_Fill, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_PCBag_Fill), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_Party = -{ - .items = sDebugMenu_Items_Party, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_Party), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_Scripts = -{ - .items = sDebugMenu_Items_Scripts, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_Scripts), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_FlagsVars = -{ - .items = sDebugMenu_Items_FlagsVars, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_FlagsVars), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_Battle_0 = -{ - .items = sDebugMenu_Items_Battle_0, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_Battle_0), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_Battle_1 = -{ - .items = sDebugMenu_Items_Battle_1, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_Battle_1), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_Battle_2 = -{ - .items = sDebugMenu_Items_Battle_2, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_Battle_2), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_Give = -{ - .items = sDebugMenu_Items_Give, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_Give), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_Sound = -{ - .items = sDebugMenu_Items_Sound, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_Sound), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_BerryFunctions = -{ - .items = sDebugMenu_Items_BerryFunctions, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_BerryFunctions), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_TimeMenu = -{ - .items = sDebugMenu_Items_TimeMenu, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_TimeMenu), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_TimeMenu_TimesOfDay = +// Functions universal +void Debug_ShowMainMenu(void) { - .items = sDebugMenu_Items_TimeMenu_TimesOfDay, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_TimeMenu_TimesOfDay), -}; + sDebugMenuListData = AllocZeroed(sizeof(*sDebugMenuListData)); + sDebugMenuListData->listId = 0; + Debug_ShowMenu(DebugTask_HandleMenuInput_General, sDebugMenu_Actions_Main); +} -static const struct ListMenuTemplate sDebugMenu_ListTemplate_TimeMenu_Weekdays = -{ - .items = sDebugMenu_Items_TimeMenu_Weekdays, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_TimeMenu_Weekdays), -}; +#define tMenuTaskId data[0] +#define tWindowId data[1] +#define tSubWindowId data[2] +#define tInput data[3] +#define tDigit data[4] -static const struct ListMenuTemplate sDebugMenu_ListTemplate_Player = +static bool32 Debug_SaveCallbackMenu(struct DebugMenuOption *callbackItems) { - .items = sDebugMenu_Items_Player, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_Player), -}; + bool32 success = FALSE; + for (u32 i = 0; i < DEBUG_MAX_SUB_MENU_LEVELS; i++) + { + if (sDebugMenuListData->subMenuItems[i] == NULL) + { + sDebugMenuListData->subMenuItems[i] = callbackItems; + success = TRUE; + break; + } + } + return success; +} -static const struct ListMenuTemplate sDebugMenu_ListTemplate_ROMInfo = +static u32 Debug_RemoveCallbackMenu(void) { - .items = sDebugMenu_Items_ROMInfo, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_ROMInfo), -}; + u32 freeCallbackLevel = 0; + for (u32 i = DEBUG_MAX_SUB_MENU_LEVELS; i > 0; i--) + { + if (sDebugMenuListData->subMenuItems[i - 1] != NULL) + { + sDebugMenuListData->subMenuItems[i - 1] = NULL; + freeCallbackLevel = i - 1; + break; + } + } + return freeCallbackLevel; +} -// ******************************* -// Functions universal -void Debug_ShowMainMenu(void) +static const struct DebugMenuOption *Debug_GetCurrentCallbackMenu(void) { - sDebugBattleData = AllocZeroed(sizeof(*sDebugBattleData)); - sDebugMenuListData = AllocZeroed(sizeof(*sDebugMenuListData)); - Debug_InitDebugBattleData(); - - Debug_ShowMenu(DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); + const struct DebugMenuOption *callbackItems = NULL; + for (u32 i = DEBUG_MAX_SUB_MENU_LEVELS; i > 0; i--) + { + if (sDebugMenuListData->subMenuItems[i - 1] != NULL) + { + callbackItems = sDebugMenuListData->subMenuItems[i - 1]; + break; + } + } + return callbackItems; } -static void Debug_ReShowMainMenu(void) +static bool32 IsSubMenuAction(const void *action) { - Debug_ShowMenu(DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); + return action == DebugAction_OpenSubMenu + || action == DebugAction_OpenSubMenuFlagsVars + || action == DebugAction_OpenSubMenuFakeRTC + || action == DebugAction_OpenSubMenuCreateFollowerNPC; } -#define tMenuTaskId data[0] -#define tWindowId data[1] -#define tSubWindowId data[2] -#define tInput data[3] -#define tDigit data[4] - -static void Debug_ShowMenu(void (*HandleInput)(u8), struct ListMenuTemplate LMtemplate) +static void Debug_ShowMenu(DebugFunc HandleInput, const struct DebugMenuOption *items) { - struct ListMenuTemplate menuTemplate; + struct ListMenuTemplate menuTemplate = {0}; u8 windowId; u8 menuTaskId; u8 inputTaskId; + if (items != NULL) + Debug_SaveCallbackMenu((struct DebugMenuOption *)items); + else + items = Debug_GetCurrentCallbackMenu(); + // create window HideMapNamePopUpWindow(); LoadMessageBoxAndBorderGfx(); windowId = AddWindow(&sDebugMenuWindowTemplateMain); DrawStdWindowFrame(windowId, FALSE); + u32 totalItems = 0; + + if (sDebugMenuListData->listId == 1) + { + totalItems = Debug_GenerateListMenuNames(); + } + else + { + for (u32 i = 0; items[i].text != NULL; i++) + { + sDebugMenuListData->listItems[i].id = i; + StringExpandPlaceholders(gStringVar4, items[i].text); + if (IsSubMenuAction(items[i].action)) + StringAppend(gStringVar4, sDebugText_Arrow); + StringCopy(&sDebugMenuListData->itemNames[i][0], gStringVar4); + sDebugMenuListData->listItems[i].name = &sDebugMenuListData->itemNames[i][0]; + totalItems++; + } + } + // create list menu - menuTemplate = LMtemplate; + menuTemplate.items = sDebugMenuListData->listItems; + menuTemplate.moveCursorFunc = ListMenuDefaultCursorMoveFunc; + menuTemplate.totalItems = totalItems; menuTemplate.maxShowed = DEBUG_MENU_HEIGHT_MAIN; menuTemplate.windowId = windowId; menuTemplate.header_X = 0; @@ -1271,7 +891,6 @@ static void Debug_DestroyMenu_Full(u8 taskId) DestroyTask(taskId); UnfreezeObjectEvents(); Free(sDebugMenuListData); - Free(sDebugBattleData); } static void Debug_DestroyMenu_Full_Script(u8 taskId, const u8 *script) @@ -1328,6 +947,29 @@ static void DebugAction_DestroyExtraWindow(u8 taskId) UnfreezeObjectEvents(); } +static u8 DebugNativeStep_CreateDebugWindow(void) +{ + u8 windowId; + + LockPlayerFieldControls(); + FreezeObjectEvents(); + HideMapNamePopUpWindow(); + LoadMessageBoxAndBorderGfx(); + windowId = AddWindow(&sDebugMenuWindowTemplateExtra); + DrawStdWindowFrame(windowId, FALSE); + CopyWindowToVram(windowId, COPYWIN_FULL); + + return windowId; +} + +static void DebugNativeStep_CloseDebugWindow(u8 taskId) +{ + ClearStdWindowAndFrame(gTasks[taskId].tSubWindowId, TRUE); + RemoveWindow(gTasks[taskId].tSubWindowId); + DestroyTask(taskId); + UnfreezeObjectEvents(); + UnlockPlayerFieldControls(); +} static const u16 sLocationFlags[] = { @@ -1353,7 +995,7 @@ static const u16 sLocationFlags[] = static u8 Debug_CheckToggleFlags(u8 id) { - u8 result = FALSE; + bool32 result = FALSE; switch (id) { @@ -1415,16 +1057,14 @@ static u8 Debug_CheckToggleFlags(u8 id) result = FlagGet(OW_FLAG_NO_TRAINER_SEE); break; #endif - #if B_FLAG_NO_BAG_USE != 0 - case DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE: - result = FlagGet(B_FLAG_NO_BAG_USE); - break; - #endif #if B_FLAG_NO_CATCHING != 0 case DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING: result = FlagGet(B_FLAG_NO_CATCHING); break; #endif + case DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE: + result = VarGet(B_VAR_NO_BAG_USE); + break; default: result = 0xFF; break; @@ -1433,107 +1073,56 @@ static u8 Debug_CheckToggleFlags(u8 id) return result; } -static void Debug_InitDebugBattleData(void) -{ - u32 i; - sDebugBattleData->submenu = 0; - sDebugBattleData->battleType = 0xFF; - sDebugBattleData->battleTerrain = 0xFF; - - for (i = 0; i < AI_FLAG_COUNT; i++) - sDebugBattleData->aiFlags[i] = FALSE; -} - -static void Debug_GenerateListMenuNames(u32 totalItems) +static u8 Debug_GenerateListMenuNames(void) { const u8 sColor_Red[] = _("{COLOR RED}"); const u8 sColor_Green[] = _("{COLOR GREEN}"); u32 i, flagResult = 0; u8 const *name = NULL; + u8 totalItems = 0; + if (sDebugMenuListData->listId == 1) + // Failsafe to prevent memory corruption + totalItems = min(ARRAY_COUNT(sDebugMenu_Actions_Flags) - 1, DEBUG_MAX_MENU_ITEMS); + // Copy item names for all entries but the last (which is Cancel) for (i = 0; i < totalItems; i++) { - if (sDebugMenuListData->listId == 1 && sDebugBattleData->submenu > 1) + if (sDebugMenuListData->listId == 1) { - u16 species; - if (i == 6) - { - name = sDebugText_Continue; - StringCopy(&sDebugMenuListData->itemNames[i][0], name); - } - else if (GetMonData(&gEnemyParty[i], MON_DATA_SANITY_HAS_SPECIES)) - { - species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES); - StringCopy(gStringVar1, GetSpeciesName(species)); - StringCopy(&sDebugMenuListData->itemNames[i][0], gStringVar1); - } + flagResult = Debug_CheckToggleFlags(i); + if (i == DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE) + name = sDebugMenu_Actions_BagUse_Options[flagResult]; else - { - StringCopy(&sDebugMenuListData->itemNames[i][0], sDebugText_Dashes); - } + name = sDebugMenu_Actions_Flags[i].text; + } + + if (flagResult == 0xFF) + { + StringCopy(&sDebugMenuListData->itemNames[i][0], name); + } + else if (flagResult) + { + StringCopy(gStringVar1, sColor_Green); + StringExpandPlaceholders(gStringVar4, name); + StringCopy(&sDebugMenuListData->itemNames[i][0], gStringVar4); } else { - if (sDebugMenuListData->listId == 0) - { - flagResult = Debug_CheckToggleFlags(i); - name = sDebugMenu_Items_FlagsVars[i].name; - } - else if (sDebugMenuListData->listId == 1) - { - flagResult = sDebugBattleData->aiFlags[i]; - if (i == totalItems - 1) - flagResult = 0xFF; - name = sDebugMenu_Items_Battle_1[i].name; - } - - if (flagResult == 0xFF) - { - StringCopy(&sDebugMenuListData->itemNames[i][0], name); - } - else if (flagResult) - { - StringCopy(gStringVar1, sColor_Green); - StringExpandPlaceholders(gStringVar4, name); - StringCopy(&sDebugMenuListData->itemNames[i][0], gStringVar4); - } - else - { - StringCopy(gStringVar1, sColor_Red); - StringExpandPlaceholders(gStringVar4, name); - StringCopy(&sDebugMenuListData->itemNames[i][0], gStringVar4); - } + StringCopy(gStringVar1, sColor_Red); + StringExpandPlaceholders(gStringVar4, name); + StringCopy(&sDebugMenuListData->itemNames[i][0], gStringVar4); } sDebugMenuListData->listItems[i].name = &sDebugMenuListData->itemNames[i][0]; sDebugMenuListData->listItems[i].id = i; } + return totalItems; } static void Debug_RefreshListMenu(u8 taskId) { - u8 totalItems = 0; - - if (sDebugMenuListData->listId == 0) - { - gMultiuseListMenuTemplate = sDebugMenu_ListTemplate_FlagsVars; - totalItems = gMultiuseListMenuTemplate.totalItems; - } - else if (sDebugMenuListData->listId == 1 && sDebugBattleData->submenu <= 1) - { - gMultiuseListMenuTemplate = sDebugMenu_ListTemplate_Battle_1; - totalItems = gMultiuseListMenuTemplate.totalItems; - } - else if (sDebugMenuListData->listId == 1 && sDebugBattleData->submenu > 1) - { - gMultiuseListMenuTemplate = sDebugMenu_ListTemplate_Battle_2; - totalItems = 7; - } - - // Failsafe to prevent memory corruption - totalItems = min(totalItems, DEBUG_MAX_MENU_ITEMS); - Debug_GenerateListMenuNames(totalItems); + u8 totalItems = Debug_GenerateListMenuNames(); // Set list menu data gMultiuseListMenuTemplate.items = sDebugMenuListData->listItems; @@ -1554,373 +1143,69 @@ static void Debug_RefreshListMenu(u8 taskId) gMultiuseListMenuTemplate.cursorKind = 0; } -static void Debug_RedrawListMenu(u8 taskId) -{ - u8 listTaskId = gTasks[taskId].tMenuTaskId; - u16 scrollOffset, selectedRow; - ListMenuGetScrollAndRow(listTaskId, &scrollOffset, &selectedRow); - - DestroyListMenuTask(gTasks[taskId].tMenuTaskId, &scrollOffset, &selectedRow); - Debug_RefreshListMenu(taskId); - gTasks[taskId].tMenuTaskId = ListMenuInit(&gMultiuseListMenuTemplate, scrollOffset, selectedRow); -} - - -// ******************************* -// Handle Inputs -static void DebugTask_HandleMenuInput_Main(u8 taskId) -{ - void (*func)(u8); - u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuTaskId); - - if (JOY_NEW(A_BUTTON)) - { - PlaySE(SE_SELECT); - if ((func = sDebugMenu_Actions_Main[input]) != NULL) - func(taskId); - } - else if (JOY_NEW(B_BUTTON)) - { - PlaySE(SE_SELECT); - Debug_DestroyMenu_Full(taskId); - ScriptContext_Enable(); - } -} - -static void DebugTask_HandleMenuInput_General(u8 taskId, const void (*const actions[])(u8), void (*callbackInput)(u8), struct ListMenuTemplate callbackMenuTemplate) -{ - void (*func)(u8); - u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuTaskId); - - if (JOY_NEW(A_BUTTON)) - { - PlaySE(SE_SELECT); - if ((func = actions[input]) != NULL) - func(taskId); - } - else if (JOY_NEW(B_BUTTON)) - { - PlaySE(SE_SELECT); - Debug_DestroyMenu(taskId); - Debug_ShowMenu(callbackInput, callbackMenuTemplate); - } -} - -static void DebugTask_HandleMenuInput_Utilities(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_Utilities, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); -} - -static void DebugTask_HandleMenuInput_PCBag(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_PCBag, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); -} - -static void DebugTask_HandleMenuInput_PCBag_Fill(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_PCBag_Fill, DebugTask_HandleMenuInput_PCBag, sDebugMenu_ListTemplate_PCBag); -} - -static void DebugTask_HandleMenuInput_Party(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_Party, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); -} - -static void DebugTask_HandleMenuInput_Scripts(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_Scripts, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); -} - -static void DebugTask_HandleMenuInput_TimeMenu(u8 taskId) +static void DebugTask_HandleMenuInput_General(u8 taskId) { - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_TimeMenu, DebugTask_HandleMenuInput_Utilities, sDebugMenu_ListTemplate_Utilities); -} - -static void DebugTask_HandleMenuInput_TimeMenu_TimesOfDay(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_TimeMenu_TimesOfDay, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); -} - -static void DebugTask_HandleMenuInput_TimeMenu_Weekdays(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_TimeMenu_Weekdays, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); -} - -static void DebugTask_HandleMenuInput_FlagsVars(u8 taskId) -{ - void (*func)(u8); + const struct DebugMenuOption *options = Debug_GetCurrentCallbackMenu(); u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuTaskId); + struct DebugMenuOption option = options[input]; if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); - if ((func = sDebugMenu_Actions_Flags[input]) != NULL) - { - if (input == DEBUG_FLAGVAR_MENU_ITEM_FLAGS || input == DEBUG_FLAGVAR_MENU_ITEM_VARS) - { - Debug_RedrawListMenu(taskId); - func(taskId); - } - else - { - func(taskId); - Debug_GenerateListMenuNames(gMultiuseListMenuTemplate.totalItems); - RedrawListMenu(gTasks[taskId].tMenuTaskId); - } - - // Remove TRUE/FALSE window for functions that haven't been assigned flags - if (gTasks[taskId].tInput == 0xFF) - { - ClearStdWindowAndFrame(gTasks[taskId].tSubWindowId, TRUE); - RemoveWindow(gTasks[taskId].tSubWindowId); - Free(sDebugMenuListData); - } - } - } - else if (JOY_NEW(B_BUTTON)) - { - PlaySE(SE_SELECT); - Debug_DestroyMenu(taskId); - Debug_ReShowMainMenu(); - } -} - -static void DebugTask_HandleBattleMenuReDraw(u8 taskId) -{ - Debug_RefreshListMenu(taskId); - switch (sDebugBattleData->submenu) - { - case 0: - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, sDebugMenu_ListTemplate_Battle_0); - break; - case 1: - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, gMultiuseListMenuTemplate); - break; - case 2: - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, sDebugMenu_ListTemplate_Battle_2); - break; - case 3: - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, gMultiuseListMenuTemplate); - break; - } -} - -static void DebugTask_HandleMenuInput_Battle(u8 taskId) -{ - u16 idx; - u8 listTaskId = gTasks[taskId].tMenuTaskId; - ListMenu_ProcessInput(listTaskId); - - ListMenuGetCurrentItemArrayId(listTaskId, &idx); - - if (JOY_NEW(A_BUTTON)) - { - PlaySE(SE_SELECT); - - switch (sDebugBattleData->submenu) + if (option.action != NULL) { - case 0: // Battle type - sDebugBattleData->battleType = idx; - sDebugBattleData->submenu++; - Debug_DestroyMenu(taskId); - - if (sDebugBattleData->battleType == DEBUG_BATTLE_0_MENU_ITEM_WILD // Skip AI Flag selection if wild battle - || sDebugBattleData->battleType == DEBUG_BATTLE_0_MENU_ITEM_WILD_DOUBLE) + if (IsSubMenuAction(option.action)) { - sDebugBattleData->submenu++; - Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, sDebugMenu_ListTemplate_Battle_2); + ((DebugSubmenuFunc)option.action)(taskId, option.actionParams); } - else + else if (option.action == DebugAction_ExecuteScript) { - Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, gMultiuseListMenuTemplate); + Debug_DestroyMenu_Full_Script(taskId, (const u8 *)option.actionParams); } - break; - case 1: // AI Flags - if (idx == sDebugMenu_ListTemplate_Battle_1.totalItems - 1) + else if (option.action == DebugAction_ToggleFlag) { - sDebugBattleData->submenu++; - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, sDebugMenu_ListTemplate_Battle_2); + ((DebugFunc)option.actionParams)(taskId); + DebugAction_ToggleFlag(taskId); } else { - sDebugBattleData->aiFlags[idx] = !sDebugBattleData->aiFlags[idx]; - Debug_RedrawListMenu(taskId); + ((DebugFunc)option.action)(taskId); } - - break; - case 2: // Terrain - sDebugBattleData->submenu++; - sDebugBattleData->battleTerrain = idx; - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, gMultiuseListMenuTemplate); - break; - case 3: // Enemy pokemon - if (idx == 6) - Debug_InitializeBattle(taskId); - break; } } else if (JOY_NEW(B_BUTTON)) { - switch (sDebugBattleData->submenu) + PlaySE(SE_SELECT); + if (Debug_GetCurrentCallbackMenu() != NULL && Debug_RemoveCallbackMenu() != 0) { - case 0: // Return to Main menu - PlaySE(SE_SELECT); Debug_DestroyMenu(taskId); - Debug_ReShowMainMenu(); - break; - case 2: // Skip AI Flag selection if wild battle - if (sDebugBattleData->battleType == DEBUG_BATTLE_0_MENU_ITEM_WILD - || sDebugBattleData->battleType == DEBUG_BATTLE_0_MENU_ITEM_WILD_DOUBLE) - { - sDebugBattleData->submenu = 0; - } - else - sDebugBattleData->submenu--; - DebugTask_HandleBattleMenuReDraw(taskId); - break; - default: - sDebugBattleData->submenu--; - DebugTask_HandleBattleMenuReDraw(taskId); - break; + if (sDebugMenuListData->listId != 0) + sDebugMenuListData->listId = 0; + Debug_ShowMenu(DebugTask_HandleMenuInput_General, NULL); + } + else + { + Debug_DestroyMenu_Full(taskId); + ScriptContext_Enable(); } } } -static void Debug_InitializeBattle(u8 taskId) -{ - u32 i; - gBattleTypeFlags = 0; - - // Set main battle flags - switch (sDebugBattleData->battleType) - { - case DEBUG_BATTLE_0_MENU_ITEM_WILD: - break; - case DEBUG_BATTLE_0_MENU_ITEM_SINGLE: - gBattleTypeFlags = (BATTLE_TYPE_TRAINER); - break; - case DEBUG_BATTLE_0_MENU_ITEM_DOUBLE: - gBattleTypeFlags = (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_TRAINER); - break; - case DEBUG_BATTLE_0_MENU_ITEM_MULTI: - gBattleTypeFlags = (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_TRAINER | BATTLE_TYPE_INGAME_PARTNER); - break; - } - - // Set terrain - gBattleEnvironment = sDebugBattleData->battleTerrain; - - // Populate enemy party - for (i = 0; i < PARTY_SIZE; i++) - { - ZeroMonData(&gEnemyParty[i]); - if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_HAS_SPECIES)) - gEnemyParty[i] = gPlayerParty[i]; - } - - // Set AI flags - for (i = 0; i < ARRAY_COUNT(sDebugBattleData->aiFlags); i++) - { - if (sDebugBattleData->aiFlags[i]) - gDebugAIFlags |= (1 << i); - } - - gIsDebugBattle = TRUE; - BattleSetup_StartTrainerBattle_Debug(); - - - Debug_DestroyMenu_Full(taskId); -} - -static void DebugTask_HandleMenuInput_Give(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_Give, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); -} - -static void DebugTask_HandleMenuInput_Sound(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_Sound, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); -} - -static void DebugTask_HandleMenuInput_BerryFunctions(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_BerryFunctions, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); -} - -static void DebugTask_HandleMenuInput_Player(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_Player, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); -} - -static void DebugTask_HandleMenuInput_ROMInfo(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_ROMInfo, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); -} - -// ******************************* -// Open sub-menus -static void DebugAction_OpenUtilitiesMenu(u8 taskId) +static void DebugAction_OpenSubMenuFlagsVars(u8 taskId, const struct DebugMenuOption *items) { Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Utilities, sDebugMenu_ListTemplate_Utilities); + sDebugMenuListData->listId = 1; + Debug_ShowMenu(DebugTask_HandleMenuInput_General, items); } -static void DebugAction_OpenPCBagMenu(u8 taskId) -{ - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_PCBag, sDebugMenu_ListTemplate_PCBag); -} - -static void DebugAction_OpenPartyMenu(u8 taskId) -{ - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Party, sDebugMenu_ListTemplate_Party); -} - -static void DebugAction_OpenScriptsMenu(u8 taskId) -{ - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Scripts, sDebugMenu_ListTemplate_Scripts); -} - -static void DebugAction_OpenFlagsVarsMenu(u8 taskId) +static void DebugAction_OpenSubMenu(u8 taskId, const struct DebugMenuOption *items) { Debug_DestroyMenu(taskId); sDebugMenuListData->listId = 0; - Debug_ShowMenu(DebugTask_HandleMenuInput_FlagsVars, gMultiuseListMenuTemplate); -} - -static void DebugAction_OpenGiveMenu(u8 taskId) -{ - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Give, sDebugMenu_ListTemplate_Give); -} - -static void DebugAction_OpenSoundMenu(u8 taskId) -{ - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Sound, sDebugMenu_ListTemplate_Sound); -} - -static void DebugAction_Util_BerryFunctions(u8 taskId) -{ - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_BerryFunctions, sDebugMenu_ListTemplate_BerryFunctions); + Debug_ShowMenu(DebugTask_HandleMenuInput_General, items); } -static void DebugAction_Util_OpenTimeMenu(u8 taskId) -{ - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_TimeMenu, sDebugMenu_ListTemplate_TimeMenu); -} - -static void DebugAction_TimeMenu_TimesOfDay(u8 taskId) +static void DebugAction_OpenSubMenuFakeRTC(u8 taskId, const struct DebugMenuOption *items) { if (!OW_USE_FAKE_RTC) { @@ -1928,34 +1213,33 @@ static void DebugAction_TimeMenu_TimesOfDay(u8 taskId) } else { - Debug_DestroyMenu_Full(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_TimeMenu_TimesOfDay, sDebugMenu_ListTemplate_TimeMenu_TimesOfDay); + Debug_DestroyMenu(taskId); + Debug_ShowMenu(DebugTask_HandleMenuInput_General, items); } } -static void DebugAction_TimeMenu_Weekdays(u8 taskId) +static void DebugAction_ExecuteScript(u8 taskId, const u8 *script) { - if (!OW_USE_FAKE_RTC) - { - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_FakeRTCNotEnabled); - } - else - { - Debug_DestroyMenu_Full(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_TimeMenu_Weekdays, sDebugMenu_ListTemplate_TimeMenu_Weekdays); - } + Debug_DestroyMenu_Full_Script(taskId, script); } -static void DebugAction_OpenPlayerMenu(u8 taskId) +static void DebugAction_ToggleFlag(u8 taskId) { - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Player, sDebugMenu_ListTemplate_Player); + Debug_GenerateListMenuNames(); + RedrawListMenu(gTasks[taskId].tMenuTaskId); } -static void DebugAction_OpenROMInfoMenu(u8 taskId) +static void DebugAction_OpenSubMenuCreateFollowerNPC(u8 taskId, const struct DebugMenuOption *items) { - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_ROMInfo, sDebugMenu_ListTemplate_ROMInfo); + if (FNPC_ENABLE_NPC_FOLLOWERS) + { + Debug_DestroyMenu(taskId); + Debug_ShowMenu(DebugTask_HandleMenuInput_General, items); + } + else + { + Debug_DestroyMenu_Full_Script(taskId, Debug_Follower_NPC_Not_Enabled); + } } // ******************************* @@ -2159,11 +1443,6 @@ void CheckPokemonStorageSize(struct ScriptContext *ctx) ConvertIntToDecimalStringN(gStringVar3, maxPkmnStorageSize - currPkmnStorageSize, STR_CONV_MODE_LEFT_ALIGN, 6); } -static void DebugAction_ROMInfo_CheckSaveBlock(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_CheckSaveBlock); -} - enum RoundMode { ROUND_CEILING, @@ -2212,41 +1491,6 @@ void CheckROMSize(struct ScriptContext *ctx) ConvertQ22_10ToDecimalString(gStringVar2, currROMFreeKB, 2, ROUND_FLOOR); } -static void DebugAction_ROMInfo_CheckROMSpace(u8 taskId) -{ - Debug_DestroyMenu_Full(taskId); - LockPlayerFieldControls(); - ScriptContext_SetupScript(Debug_CheckROMSpace); -} - -static const u8 sWeatherNames[WEATHER_COUNT][24] = { - [WEATHER_NONE] = _("NONE"), - [WEATHER_SUNNY_CLOUDS] = _("SUNNY CLOUDS"), - [WEATHER_SUNNY] = _("SUNNY"), - [WEATHER_RAIN] = _("RAIN"), - [WEATHER_SNOW] = _("SNOW"), - [WEATHER_RAIN_THUNDERSTORM] = _("RAIN THUNDERSTORM"), - [WEATHER_FOG_HORIZONTAL] = _("FOG HORIZONTAL"), - [WEATHER_VOLCANIC_ASH] = _("VOLCANIC ASH"), - [WEATHER_SANDSTORM] = _("SANDSTORM"), - [WEATHER_FOG_DIAGONAL] = _("FOG DIAGONAL"), - [WEATHER_UNDERWATER] = _("UNDERWATER"), - [WEATHER_SHADE] = _("SHADE"), - [WEATHER_DROUGHT] = _("DROUGHT"), - [WEATHER_DOWNPOUR] = _("DOWNPOUR"), - [WEATHER_UNDERWATER_BUBBLES] = _("UNDERWATER BUBBLES"), - [WEATHER_ABNORMAL] = _("ABNORMAL(NOT WORKING)"), - [WEATHER_ROUTE119_CYCLE] = _("ROUTE119 CYCLE"), - [WEATHER_ROUTE123_CYCLE] = _("ROUTE123 CYCLE"), - [WEATHER_FOG] = _("FOG"), -}; - -const u8 *GetWeatherName(u32 weatherId) -{ - return sWeatherNames[weatherId]; -} - -static const u8 sDebugText_WeatherNotDefined[] = _("NOT DEFINED!!!"); static void DebugAction_Util_Weather(u8 taskId) { u8 windowId; @@ -2264,7 +1508,7 @@ static void DebugAction_Util_Weather(u8 taskId) //Display initial ID StringCopy(gStringVar2, gText_DigitIndicator[0]); ConvertIntToDecimalStringN(gStringVar3, 1, STR_CONV_MODE_LEADING_ZEROS, 2); - StringCopyPadded(gStringVar1, sWeatherNames[0], CHAR_SPACE, 30); + StringCopyPadded(gStringVar1, GetWeatherName(0), CHAR_SPACE, 30); StringExpandPlaceholders(gStringVar4, sDebugText_Util_Weather_ID); AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); @@ -2284,10 +1528,7 @@ static void DebugAction_Util_Weather_SelectId(u8 taskId) StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 2); - if (gTasks[taskId].tInput <= 15 || gTasks[taskId].tInput >= 20) - StringCopyPadded(gStringVar1, sWeatherNames[gTasks[taskId].tInput], CHAR_SPACE, 30); - else - StringCopyPadded(gStringVar1, sDebugText_WeatherNotDefined, CHAR_SPACE, 30); + StringCopyPadded(gStringVar1, GetWeatherName(gTasks[taskId].tInput), CHAR_SPACE, 30); StringExpandPlaceholders(gStringVar4, sDebugText_Util_Weather_ID); AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); @@ -2305,22 +1546,7 @@ static void DebugAction_Util_Weather_SelectId(u8 taskId) { PlaySE(SE_SELECT); DebugAction_DestroyExtraWindow(taskId); - } -} - -static void DebugAction_Util_FontTest(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_FontTest); -} - -static void DebugAction_TimeMenu_CheckWallClock(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, PlayersHouse_2F_EventScript_CheckWallClock); -} - -static void DebugAction_TimeMenu_SetWallClock(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, PlayersHouse_2F_EventScript_SetWallClock); + } } static void DebugAction_Util_WatchCredits(u8 taskId) @@ -2361,18 +1587,6 @@ static void DebugAction_Util_CheatStart(u8 taskId) Debug_DestroyMenu_Full_Script(taskId, Debug_CheatStart); } -static void DebugAction_ROMInfo_ExpansionVersion(u8 taskId) -{ - Debug_DestroyMenu_Full(taskId); - LockPlayerFieldControls(); - ScriptContext_SetupScript(Debug_ShowExpansionVersion); -} - -static void DebugAction_Util_Steven_Multi(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_Steven_Multi); -} - void BufferExpansionVersion(struct ScriptContext *ctx) { static const u8 sText_Released[] = _("\nRelease Build"); @@ -2390,12 +1604,6 @@ void BufferExpansionVersion(struct ScriptContext *ctx) string = StringCopy(string, sText_Unreleased); } -static void DebugAction_TimeMenu_PrintTime(u8 taskId) -{ - LockPlayerFieldControls(); - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_TellTheTime); -} - void DebugMenu_CalculateTime(struct ScriptContext *ctx) { if (OW_USE_FAKE_RTC) @@ -2415,75 +1623,22 @@ void DebugMenu_CalculateTime(struct ScriptContext *ctx) } } -static void DebugAction_TimeMenu_PrintTimeOfDay(u8 taskId) -{ - LockPlayerFieldControls(); - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_PrintTimeOfDay); -} - void DebugMenu_CalculateTimeOfDay(struct ScriptContext *ctx) { - switch (GetTimeOfDay()) + enum TimeOfDay timeOfDay = GetTimeOfDay(); + switch (timeOfDay) { case TIME_MORNING: - StringExpandPlaceholders(gStringVar1, gTimeOfDayStringsTable[TIME_MORNING]); - break; case TIME_DAY: - StringExpandPlaceholders(gStringVar1, gTimeOfDayStringsTable[TIME_DAY]); - break; case TIME_EVENING: - StringExpandPlaceholders(gStringVar1, gTimeOfDayStringsTable[TIME_EVENING]); - break; case TIME_NIGHT: - StringExpandPlaceholders(gStringVar1, gTimeOfDayStringsTable[TIME_NIGHT]); + StringExpandPlaceholders(gStringVar1, gTimeOfDayStringsTable[timeOfDay]); break; - default: + case TIMES_OF_DAY_COUNT: break; } } -// ******************************* -// Actions Scripts -static void DebugAction_Util_Script_1(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_Script_1); -} - -static void DebugAction_Util_Script_2(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_Script_2); -} - -static void DebugAction_Util_Script_3(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_Script_3); -} - -static void DebugAction_Util_Script_4(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_Script_4); -} - -static void DebugAction_Util_Script_5(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_Script_5); -} - -static void DebugAction_Util_Script_6(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_Script_6); -} - -static void DebugAction_Util_Script_7(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_Script_7); -} - -static void DebugAction_Util_Script_8(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_Script_8); -} - // ******************************* // Actions Flags and Vars static void Debug_Display_FlagInfo(u32 flag, u32 digit, u8 windowId) @@ -2496,7 +1651,7 @@ static void Debug_Display_FlagInfo(u32 flag, u32 digit, u8 windowId) else StringCopyPadded(gStringVar2, sDebugText_False, CHAR_SPACE, 15); StringCopy(gStringVar3, gText_DigitIndicator[digit]); - StringExpandPlaceholders(gStringVar4, sDebugText_FlagsVars_Flag); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Flag: {STR_VAR_1}{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}\n{STR_VAR_3}")); AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); } @@ -2891,14 +2046,11 @@ static void DebugAction_FlagsVars_TrainerSeeOnOff(u8 taskId) static void DebugAction_FlagsVars_BagUseOnOff(u8 taskId) { -#if B_FLAG_NO_BAG_USE == 0 - Debug_DestroyMenu_Full_Script(taskId, Debug_FlagsNotSetBattleConfigMessage); +#if B_VAR_NO_BAG_USE < VARS_START || B_VAR_NO_BAG_USE > VARS_END + Debug_DestroyMenu_Full_Script(taskId, Debug_VarsNotSetBattleConfigMessage); #else - if (FlagGet(B_FLAG_NO_BAG_USE)) - PlaySE(SE_PC_OFF); - else - PlaySE(SE_PC_LOGIN); - FlagToggle(B_FLAG_NO_BAG_USE); + PlaySE(SE_SELECT); + VarSet(B_VAR_NO_BAG_USE, (VarGet(B_VAR_NO_BAG_USE) + 1) % 3); #endif } @@ -2925,10 +2077,21 @@ static void Debug_Display_ItemInfo(u32 itemId, u32 digit, u8 windowId) { StringCopy(gStringVar2, gText_DigitIndicator[digit]); u8* end = CopyItemName(itemId, gStringVar1); + u16 moveId = ItemIdToBattleMoveId(itemId); + if (moveId != MOVE_NONE) + { + end = StringCopy(end, gText_Space); + end = StringCopy(end, GetMoveName(moveId)); + } + else if (CheckIfItemIsTMHMOrEvolutionStone(itemId) == 1) + { + end = StringCopy(end, COMPOUND_STRING(" None")); + } + WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(windowId)); StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); ConvertIntToDecimalStringN(gStringVar3, itemId, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEMS); - StringExpandPlaceholders(gStringVar4, sDebugText_ItemID); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Item ID: {STR_VAR_3}\n{STR_VAR_1}{CLEAR_TO 90}\n\n{STR_VAR_2}")); AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); } @@ -2972,7 +2135,7 @@ static void Debug_Display_ItemQuantity(u32 quantity, u32 digit, u8 windowId) StringCopy(gStringVar2, gText_DigitIndicator[digit]); ConvertIntToDecimalStringN(gStringVar1, quantity, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEM_QUANTITY); StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); - StringExpandPlaceholders(gStringVar4, sDebugText_ItemQuantity); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Quantity:{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n\n{STR_VAR_2}")); AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); } @@ -3067,7 +2230,7 @@ static void Debug_Display_SpeciesInfo(u32 species, u32 digit, u8 windowId) WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(windowId)); StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); ConvertIntToDecimalStringN(gStringVar3, species, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEMS); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonID); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Species: {STR_VAR_3}\n{STR_VAR_1}{CLEAR_TO 90}\n\n{STR_VAR_2}{CLEAR_TO 90}")); AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); } @@ -3146,7 +2309,7 @@ static void Debug_Display_Level(u32 level, u32 digit, u8 windowId) StringCopy(gStringVar2, gText_DigitIndicator[digit]); ConvertIntToDecimalStringN(gStringVar1, level, STR_CONV_MODE_LEADING_ZEROS, 3); StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonLevel); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Level:{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}")); AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); } @@ -3271,14 +2434,14 @@ static void DebugAction_Give_Pokemon_SelectShiny(u8 taskId) } } -static void Debug_Display_Ability(u32 abilityId, u32 digit, u8 windowId)//(u32 natureId, u32 digit, u8 windowId) +static void Debug_Display_Ability(enum Ability abilityId, u32 digit, u8 windowId)//(u32 natureId, u32 digit, u8 windowId) { StringCopy(gStringVar2, gText_DigitIndicator[digit]); ConvertIntToDecimalStringN(gStringVar3, abilityId, STR_CONV_MODE_LEADING_ZEROS, 2); StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); u8 *end = StringCopy(gStringVar1, gAbilitiesInfo[abilityId].name); WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(windowId)); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonAbility); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Ability Num: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}")); AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); } @@ -3310,7 +2473,7 @@ static void DebugAction_Give_Pokemon_SelectNature(u8 taskId) gTasks[taskId].tInput = 0; gTasks[taskId].tDigit = 0; - u32 abilityId = GetAbilityBySpecies(sDebugMonData->species, 0); + enum Ability abilityId = GetAbilityBySpecies(sDebugMonData->species, 0); Debug_Display_Ability(abilityId, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectAbility; @@ -3323,6 +2486,16 @@ static void DebugAction_Give_Pokemon_SelectNature(u8 taskId) } } +static void Debug_Display_TeraType(u32 typeId, u32 digit, u8 windowId) +{ + StringCopy(gStringVar2, gText_DigitIndicator[digit]); + ConvertIntToDecimalStringN(gStringVar3, typeId, STR_CONV_MODE_LEADING_ZEROS, 2); + StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); + StringCopy(gStringVar1, gTypesInfo[typeId].name); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Tera Type: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}")); + AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); +} + static void DebugAction_Give_Pokemon_SelectAbility(u8 taskId) { u8 abilityCount = NUM_ABILITY_SLOTS - 1; //-1 for proper iteration @@ -3349,7 +2522,7 @@ static void DebugAction_Give_Pokemon_SelectAbility(u8 taskId) { i++; } - u32 abilityId = GetAbilityBySpecies(sDebugMonData->species, gTasks[taskId].tInput - i); + enum Ability abilityId = GetAbilityBySpecies(sDebugMonData->species, gTasks[taskId].tInput - i); Debug_Display_Ability(abilityId, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); } @@ -3359,12 +2532,7 @@ static void DebugAction_Give_Pokemon_SelectAbility(u8 taskId) gTasks[taskId].tInput = 0; gTasks[taskId].tDigit = 0; - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 2); - StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); - StringCopy(gStringVar1, gTypesInfo[0].name); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonTeraType); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_Display_TeraType(gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectTeraType; } @@ -3376,6 +2544,15 @@ static void DebugAction_Give_Pokemon_SelectAbility(u8 taskId) } } +static void Debug_Display_DynamaxLevel(u32 level, u32 digit, u8 windowId) +{ + StringCopy(gStringVar2, gText_DigitIndicator[digit]); + ConvertIntToDecimalStringN(gStringVar1, level, STR_CONV_MODE_LEADING_ZEROS, 2); + StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Dmax Lvl:{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}")); + AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); +} + static void DebugAction_Give_Pokemon_SelectTeraType(u8 taskId) { if (JOY_NEW(DPAD_ANY)) @@ -3395,12 +2572,7 @@ static void DebugAction_Give_Pokemon_SelectTeraType(u8 taskId) gTasks[taskId].tInput = 0; } - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 2); - StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); - StringCopy(gStringVar1, gTypesInfo[gTasks[taskId].tInput].name); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonTeraType); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_Display_TeraType(gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); } if (JOY_NEW(A_BUTTON)) @@ -3409,11 +2581,7 @@ static void DebugAction_Give_Pokemon_SelectTeraType(u8 taskId) gTasks[taskId].tInput = 0; gTasks[taskId].tDigit = 0; - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 2); - StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonDynamaxLevel); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_Display_DynamaxLevel(gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectDynamaxLevel; } @@ -3425,18 +2593,18 @@ static void DebugAction_Give_Pokemon_SelectTeraType(u8 taskId) } } +static void Debug_Display_GigantamaxFactor(u32 input, u8 windowId) +{ + Debug_Display_TrueFalse(input, windowId, COMPOUND_STRING("Gmax Factor:{CLEAR_TO 90}\n {STR_VAR_2}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{CLEAR_TO 90}")); +} + static void DebugAction_Give_Pokemon_SelectDynamaxLevel(u8 taskId) { if (JOY_NEW(DPAD_ANY)) { PlaySE(SE_SELECT); Debug_HandleInput_Numeric(taskId, 0, MAX_DYNAMAX_LEVEL, 2); - - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 2); - StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonDynamaxLevel); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_Display_DynamaxLevel(gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); } if (JOY_NEW(A_BUTTON)) @@ -3444,7 +2612,7 @@ static void DebugAction_Give_Pokemon_SelectDynamaxLevel(u8 taskId) sDebugMonData->dynamaxLevel = gTasks[taskId].tInput; gTasks[taskId].tInput = 0; gTasks[taskId].tDigit = 0; - Debug_Display_TrueFalse(gTasks[taskId].tInput, gTasks[taskId].tSubWindowId, sDebugText_PokemonGmaxFactor); + Debug_Display_GigantamaxFactor(gTasks[taskId].tInput, gTasks[taskId].tSubWindowId); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectGigantamaxFactor; } else if (JOY_NEW(B_BUTTON)) @@ -3457,11 +2625,11 @@ static void DebugAction_Give_Pokemon_SelectDynamaxLevel(u8 taskId) } } -static void Debug_Display_StatInfo(const u8* text, u32 stat, u32 value, u32 digit, u8 windowId) +static void Debug_Display_StatInfo(const u8* text, u32 stat, u32 value, u32 digit, u8 windowId, u32 maxValue) { StringCopy(gStringVar1, gStatNamesTable[stat]); StringCopy(gStringVar2, gText_DigitIndicator[digit]); - ConvertIntToDecimalStringN(gStringVar3, value, STR_CONV_MODE_LEADING_ZEROS, 2); + ConvertIntToDecimalStringN(gStringVar3, value, STR_CONV_MODE_LEADING_ZEROS, CountDigits(maxValue)); StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); StringExpandPlaceholders(gStringVar4, text); AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); @@ -3473,7 +2641,7 @@ static void DebugAction_Give_Pokemon_SelectGigantamaxFactor(u8 taskId) { PlaySE(SE_SELECT); gTasks[taskId].tInput ^= JOY_NEW(DPAD_UP | DPAD_DOWN) > 0; - Debug_Display_TrueFalse(gTasks[taskId].tInput, gTasks[taskId].tSubWindowId, sDebugText_PokemonGmaxFactor); + Debug_Display_GigantamaxFactor(gTasks[taskId].tInput, gTasks[taskId].tSubWindowId); } if (JOY_NEW(A_BUTTON)) @@ -3481,7 +2649,7 @@ static void DebugAction_Give_Pokemon_SelectGigantamaxFactor(u8 taskId) sDebugMonData->gmaxFactor = gTasks[taskId].tInput; gTasks[taskId].tInput = 0; gTasks[taskId].tDigit = 0; - Debug_Display_StatInfo(sDebugText_IVs, gTasks[taskId].tIterator, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); + Debug_Display_StatInfo(sDebugText_IVs, gTasks[taskId].tIterator, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId, MAX_PER_STAT_IVS); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectIVs; } else if (JOY_NEW(B_BUTTON)) @@ -3498,7 +2666,7 @@ static void DebugAction_Give_Pokemon_SelectIVs(u8 taskId) { PlaySE(SE_SELECT); Debug_HandleInput_Numeric(taskId, 0, MAX_PER_STAT_IVS, 3); - Debug_Display_StatInfo(sDebugText_IVs, gTasks[taskId].tIterator, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); + Debug_Display_StatInfo(sDebugText_IVs, gTasks[taskId].tIterator, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId, MAX_PER_STAT_IVS); } //If A or B button @@ -3514,7 +2682,7 @@ static void DebugAction_Give_Pokemon_SelectIVs(u8 taskId) gTasks[taskId].tInput = 0; gTasks[taskId].tDigit = 0; - Debug_Display_StatInfo(sDebugText_IVs, gTasks[taskId].tIterator, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); + Debug_Display_StatInfo(sDebugText_IVs, gTasks[taskId].tIterator, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId, MAX_PER_STAT_IVS); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectIVs; } else @@ -3523,7 +2691,7 @@ static void DebugAction_Give_Pokemon_SelectIVs(u8 taskId) gTasks[taskId].tDigit = 0; gTasks[taskId].tIterator = 0; - Debug_Display_StatInfo(sDebugText_EVs, gTasks[taskId].tIterator, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); + Debug_Display_StatInfo(sDebugText_EVs, gTasks[taskId].tIterator, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId, MAX_PER_STAT_EVS); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectEVs; } } @@ -3571,7 +2739,7 @@ static void DebugAction_Give_Pokemon_SelectEVs(u8 taskId) { PlaySE(SE_SELECT); Debug_HandleInput_Numeric(taskId, 0, MAX_PER_STAT_EVS, 4); - Debug_Display_StatInfo(sDebugText_EVs, gTasks[taskId].tIterator, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); + Debug_Display_StatInfo(sDebugText_EVs, gTasks[taskId].tIterator, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId, MAX_PER_STAT_EVS); } //If A or B button @@ -3586,7 +2754,7 @@ static void DebugAction_Give_Pokemon_SelectEVs(u8 taskId) gTasks[taskId].tIterator++; gTasks[taskId].tInput = 0; gTasks[taskId].tDigit = 0; - Debug_Display_StatInfo(sDebugText_EVs, gTasks[taskId].tIterator, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); + Debug_Display_StatInfo(sDebugText_EVs, gTasks[taskId].tIterator, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId, MAX_PER_STAT_EVS); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectEVs; } else @@ -3603,7 +2771,7 @@ static void DebugAction_Give_Pokemon_SelectEVs(u8 taskId) } PlaySE(SE_FAILURE); - Debug_Display_StatInfo(sDebugText_EVs, gTasks[taskId].tIterator, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); + Debug_Display_StatInfo(sDebugText_EVs, gTasks[taskId].tIterator, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId, MAX_PER_STAT_EVS); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectEVs; } else @@ -3669,7 +2837,7 @@ static void DebugAction_Give_Pokemon_Move(u8 taskId) static void DebugAction_Give_Pokemon_ComplexCreateMon(u8 taskId) //https://github.com/ghoulslash/pokeemerald/tree/custom-givemon { - u16 nationalDexNum; + enum NationalDexOrder nationalDexNum; int sentToPc; struct Pokemon mon; u8 i; @@ -3734,6 +2902,10 @@ static void DebugAction_Give_Pokemon_ComplexCreateMon(u8 taskId) //https://githu //Moves for (i = 0; i < MAX_MON_MOVES; i++) { + // Non-default moveset chosen. Reset moves before setting the chosen moves. + if (moves[0] != MOVE_NONE) + SetMonMoveSlot(&mon, MOVE_NONE, i); + if (moves[i] == MOVE_NONE || moves[i] >= MOVES_COUNT) continue; @@ -3797,6 +2969,82 @@ static void DebugAction_Give_Pokemon_ComplexCreateMon(u8 taskId) //https://githu #undef tSpriteId #undef tIterator +//Decoration +#define tSpriteId data[6] + +static void Debug_Display_DecorationInfo(u32 itemId, u32 digit, u8 windowId) +{ + StringCopy(gStringVar2, gText_DigitIndicator[digit]); + u8* end = StringCopy(gStringVar1, gDecorations[itemId].name); + WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(windowId)); + StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); + ConvertIntToDecimalStringN(gStringVar3, itemId, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEMS); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Decor ID: {STR_VAR_3}\n{STR_VAR_1}{CLEAR_TO 90}\n\n{STR_VAR_2}")); + AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); +} + +static void DebugAction_Give_Decoration(u8 taskId) +{ + u8 windowId; + + ClearStdWindowAndFrame(gTasks[taskId].tWindowId, TRUE); + RemoveWindow(gTasks[taskId].tWindowId); + + HideMapNamePopUpWindow(); + LoadMessageBoxAndBorderGfx(); + windowId = AddWindow(&sDebugMenuWindowTemplateExtra); + DrawStdWindowFrame(windowId, FALSE); + + CopyWindowToVram(windowId, COPYWIN_FULL); + + // Display initial decoration + Debug_Display_DecorationInfo(1, 0, windowId); + + gTasks[taskId].func = DebugAction_Give_Decoration_SelectId; + gTasks[taskId].tSubWindowId = windowId; + gTasks[taskId].tInput = 1; + gTasks[taskId].tDigit = 0; + gTasks[taskId].tSpriteId = AddDecorationIconObject(gTasks[taskId].tInput, DEBUG_NUMBER_ICON_X+8, DEBUG_NUMBER_ICON_Y+10, 0, ITEM_TAG, ITEM_TAG); +} + +static void DestroyDecorationIcon(u8 taskId) +{ + FreeSpriteTilesByTag(ITEM_TAG); + FreeSpritePaletteByTag(ITEM_TAG); + FreeSpriteOamMatrix(&gSprites[gTasks[taskId].tSpriteId]); + DestroySprite(&gSprites[gTasks[taskId].tSpriteId]); +} + +static void DebugAction_Give_Decoration_SelectId(u8 taskId) +{ + if (JOY_NEW(DPAD_ANY)) + { + PlaySE(SE_SELECT); + Debug_HandleInput_Numeric(taskId, 1, NUM_DECORATIONS, DEBUG_NUMBER_DIGITS_ITEMS); + Debug_Display_DecorationInfo(gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); + DestroyDecorationIcon(taskId); + gTasks[taskId].tSpriteId = AddDecorationIconObject(gTasks[taskId].tInput, DEBUG_NUMBER_ICON_X+8, DEBUG_NUMBER_ICON_Y+10, 0, ITEM_TAG, ITEM_TAG); + } + + if (JOY_NEW(A_BUTTON)) + { + DestroyItemIcon(taskId); + + PlaySE(MUS_LEVEL_UP); + DecorationAdd(gTasks[taskId].tInput); + DebugAction_DestroyExtraWindow(taskId); + } + else if (JOY_NEW(B_BUTTON)) + { + DestroyDecorationIcon(taskId); + + PlaySE(SE_SELECT); + DebugAction_DestroyExtraWindow(taskId); + } +} + +#undef tSpriteId + static void DebugAction_Give_MaxMoney(u8 taskId) { SetMoney(&gSaveBlock1Ptr->money, MAX_MONEY); @@ -3805,6 +3053,9 @@ static void DebugAction_Give_MaxMoney(u8 taskId) static void DebugAction_Give_MaxCoins(u8 taskId) { SetCoins(MAX_COINS); + + if (!CheckBagHasItem(ITEM_COIN_CASE, 1)) + AddBagItem(ITEM_COIN_CASE, 1); } static void DebugAction_Give_MaxBattlePoints(u8 taskId) @@ -3835,16 +3086,16 @@ static void DebugAction_TimeMenu_ChangeTimeOfDay(u8 taskId) DebugAction_DestroyExtraWindow(taskId); switch (input) { - case DEBUG_TIME_MENU_ITEM_MORNING: + case TIME_MORNING: FakeRtc_ForwardTimeTo(MORNING_HOUR_BEGIN, 0, 0); break; - case DEBUG_TIME_MENU_ITEM_DAY: + case TIME_DAY: FakeRtc_ForwardTimeTo(DAY_HOUR_BEGIN, 0, 0); break; - case DEBUG_TIME_MENU_ITEM_EVENING: + case TIME_EVENING: FakeRtc_ForwardTimeTo(EVENING_HOUR_BEGIN, 0, 0); break; - case DEBUG_TIME_MENU_ITEM_NIGHT: + case TIME_NIGHT: FakeRtc_ForwardTimeTo(NIGHT_HOUR_BEGIN, 0, 0); break; } @@ -3859,37 +3110,8 @@ static void DebugAction_TimeMenu_ChangeWeekdays(u8 taskId) u32 daysToAdd = 0; DebugAction_DestroyExtraWindow(taskId); - switch(input) - { - case DEBUG_TIME_MENU_ITEM_SUNDAY: - daysToAdd = ((WEEKDAY_SUN - rtc->dayOfWeek) + WEEKDAY_COUNT) % WEEKDAY_COUNT; - FakeRtc_AdvanceTimeBy(daysToAdd, 0, 0, 0); - break; - case DEBUG_TIME_MENU_ITEM_MONDAY: - daysToAdd = ((WEEKDAY_MON - rtc->dayOfWeek) + WEEKDAY_COUNT) % WEEKDAY_COUNT; - FakeRtc_AdvanceTimeBy(daysToAdd, 0, 0, 0); - break; - case DEBUG_TIME_MENU_ITEM_TUESDAY: - daysToAdd = ((WEEKDAY_TUE - rtc->dayOfWeek) + WEEKDAY_COUNT) % WEEKDAY_COUNT; - FakeRtc_AdvanceTimeBy(daysToAdd, 0, 0, 0); - break; - case DEBUG_TIME_MENU_ITEM_WEDNESDAY: - daysToAdd = ((WEEKDAY_WED - rtc->dayOfWeek) + WEEKDAY_COUNT) % WEEKDAY_COUNT; - FakeRtc_AdvanceTimeBy(daysToAdd, 0, 0, 0); - break; - case DEBUG_TIME_MENU_ITEM_THURSDAY: - daysToAdd = ((WEEKDAY_THU - rtc->dayOfWeek) + WEEKDAY_COUNT) % WEEKDAY_COUNT; - FakeRtc_AdvanceTimeBy(daysToAdd, 0, 0, 0); - break; - case DEBUG_TIME_MENU_ITEM_FRIDAY: - daysToAdd = ((WEEKDAY_FRI - rtc->dayOfWeek) + WEEKDAY_COUNT) % WEEKDAY_COUNT; - FakeRtc_AdvanceTimeBy(daysToAdd, 0, 0, 0); - break; - case DEBUG_TIME_MENU_ITEM_SATURDAY: - daysToAdd = ((WEEKDAY_SAT - rtc->dayOfWeek) + WEEKDAY_COUNT) % WEEKDAY_COUNT; - FakeRtc_AdvanceTimeBy(daysToAdd, 0, 0, 0); - break; - } + daysToAdd = ((input - rtc->dayOfWeek) + WEEKDAY_COUNT) % WEEKDAY_COUNT; + FakeRtc_AdvanceTimeBy(daysToAdd, 0, 0, 0); Debug_DestroyMenu_Full(taskId); SetMainCallback2(CB2_LoadMap); } @@ -3897,12 +3119,6 @@ static void DebugAction_TimeMenu_ChangeWeekdays(u8 taskId) // ******************************* // Actions PCBag -static void DebugAction_OpenPCBagFillMenu(u8 taskId) -{ - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_PCBag_Fill, sDebugMenu_ListTemplate_PCBag_Fill); -} - static void DebugAction_PCBag_Fill_PCBoxes_Fast(u8 taskId) //Credit: Sierraffinity { int boxId, boxPosition; @@ -3991,21 +3207,20 @@ static void DebugAction_PCBag_Fill_PocketItems(u8 taskId) static void DebugAction_PCBag_Fill_PocketPokeBalls(u8 taskId) { - u16 ballId; - - for (ballId = BALL_STRANGE; ballId < POKEBALL_COUNT; ballId++) + for (enum PokeBall ballId = BALL_STRANGE; ballId < POKEBALL_COUNT; ballId++) { if (CheckBagHasSpace(ballId, MAX_BAG_ITEM_CAPACITY)) - AddBagItem(ballId, MAX_BAG_ITEM_CAPACITY); + AddBagItem(gBallItemIds[ballId], MAX_BAG_ITEM_CAPACITY); } } static void DebugAction_PCBag_Fill_PocketTMHM(u8 taskId) { - u16 itemId; + u16 index, itemId; - for (itemId = ITEM_TM01; itemId <= ITEM_HM08; itemId++) + for (index = 0; index < NUM_ALL_MACHINES; index++) { + itemId = GetTMHMItemId(index + 1); if (CheckBagHasSpace(itemId, 1) && ItemIdToBattleMoveId(itemId) != MOVE_NONE) AddBagItem(itemId, 1); } @@ -4033,11 +3248,6 @@ static void DebugAction_PCBag_Fill_PocketKeyItems(u8 taskId) } } -static void DebugAction_PCBag_AccessPC(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, EventScript_PC); -} - static void DebugAction_PCBag_ClearBag(u8 taskId) { PlaySE(MUS_LEVEL_UP); @@ -4053,8 +3263,8 @@ static void DebugAction_PCBag_ClearBoxes(u8 taskId) // ******************************* // Actions Sound -static const u8 *const sBGMNames[]; -static const u8 *const sSENames[]; +static const u8 *const sBGMNames[END_MUS - START_MUS + 1]; +static const u8 *const sSENames[END_SE + 1]; #define tCurrentSong data[5] @@ -4092,10 +3302,14 @@ static void DebugAction_Sound_SE_SelectId(u8 taskId) { if (JOY_NEW(DPAD_ANY)) { + const u8 *seName; Debug_HandleInput_Numeric(taskId, 1, END_SE, DEBUG_NUMBER_DIGITS_ITEMS); StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - StringCopyPadded(gStringVar1, sSENames[gTasks[taskId].tInput - 1], CHAR_SPACE, 35); + seName = sSENames[gTasks[taskId].tInput - 1]; + if (seName == NULL) + seName = sDebugText_Dashes; + StringCopyPadded(gStringVar1, seName, CHAR_SPACE, 35); ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEMS); StringExpandPlaceholders(gStringVar4, sDebugText_Sound_SFX_ID); AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); @@ -4153,10 +3367,14 @@ static void DebugAction_Sound_MUS_SelectId(u8 taskId) { if (JOY_NEW(DPAD_ANY)) { + const u8 *bgmName; Debug_HandleInput_Numeric(taskId, START_MUS, END_MUS, DEBUG_NUMBER_DIGITS_ITEMS); StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - StringCopyPadded(gStringVar1, sBGMNames[gTasks[taskId].tInput - START_MUS], CHAR_SPACE, 35); + bgmName = sBGMNames[gTasks[taskId].tInput - START_MUS]; + if (bgmName == NULL) + bgmName = sDebugText_Dashes; + StringCopyPadded(gStringVar1, bgmName, CHAR_SPACE, 35); ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEMS); StringExpandPlaceholders(gStringVar4, sDebugText_Sound_Music_ID); AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); @@ -4180,554 +3398,536 @@ static void DebugAction_Sound_MUS_SelectId(u8 taskId) } } +static const u32 gDebugFollowerNPCGraphics[] = +{ + OBJ_EVENT_GFX_RIVAL_BRENDAN_NORMAL, + OBJ_EVENT_GFX_RIVAL_MAY_NORMAL, + OBJ_EVENT_GFX_STEVEN, + OBJ_EVENT_GFX_WALLY, + OBJ_EVENT_GFX_RED, + OBJ_EVENT_GFX_LEAF, +}; + +static void DebugAction_CreateFollowerNPC(u8 taskId) +{ + u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuTaskId); + u32 gfx = gDebugFollowerNPCGraphics[input]; + + Debug_DestroyMenu_Full(taskId); + LockPlayerFieldControls(); + DestroyFollowerNPC(); + SetFollowerNPCData(FNPC_DATA_BATTLE_PARTNER, PARTNER_STEVEN); + CreateFollowerNPC(gfx, FNPC_ALL, Debug_Follower_NPC_Event_Script); + UnlockPlayerFieldControls(); +} + +static void DebugAction_DestroyFollowerNPC(u8 taskId) +{ + if (FNPC_ENABLE_NPC_FOLLOWERS) + { + Debug_DestroyMenu_Full(taskId); + LockPlayerFieldControls(); + DestroyFollowerNPC(); + UnlockPlayerFieldControls(); + } + else + { + Debug_DestroyMenu_Full_Script(taskId, Debug_Follower_NPC_Not_Enabled); + } +} + #undef tCurrentSong -#undef tMenuTaskId -#undef tWindowId -#undef tSubWindowId -#undef tInput -#undef tDigit -#define SOUND_LIST_BGM \ - X(MUS_LITTLEROOT_TEST) \ - X(MUS_GSC_ROUTE38) \ - X(MUS_CAUGHT) \ - X(MUS_VICTORY_WILD) \ - X(MUS_VICTORY_GYM_LEADER) \ - X(MUS_VICTORY_LEAGUE) \ - X(MUS_C_COMM_CENTER) \ - X(MUS_GSC_PEWTER) \ - X(MUS_C_VS_LEGEND_BEAST) \ - X(MUS_ROUTE101) \ - X(MUS_ROUTE110) \ - X(MUS_ROUTE120) \ - X(MUS_PETALBURG) \ - X(MUS_OLDALE) \ - X(MUS_GYM) \ - X(MUS_SURF) \ - X(MUS_PETALBURG_WOODS) \ - X(MUS_LEVEL_UP) \ - X(MUS_HEAL) \ - X(MUS_OBTAIN_BADGE) \ - X(MUS_OBTAIN_ITEM) \ - X(MUS_EVOLVED) \ - X(MUS_OBTAIN_TMHM) \ - X(MUS_LILYCOVE_MUSEUM) \ - X(MUS_ROUTE122) \ - X(MUS_OCEANIC_MUSEUM) \ - X(MUS_EVOLUTION_INTRO) \ - X(MUS_EVOLUTION) \ - X(MUS_MOVE_DELETED) \ - X(MUS_ENCOUNTER_GIRL) \ - X(MUS_ENCOUNTER_MALE) \ - X(MUS_ABANDONED_SHIP) \ - X(MUS_FORTREE) \ - X(MUS_BIRCH_LAB) \ - X(MUS_B_TOWER_RS) \ - X(MUS_ENCOUNTER_SWIMMER) \ - X(MUS_CAVE_OF_ORIGIN) \ - X(MUS_OBTAIN_BERRY) \ - X(MUS_AWAKEN_LEGEND) \ - X(MUS_SLOTS_JACKPOT) \ - X(MUS_SLOTS_WIN) \ - X(MUS_TOO_BAD) \ - X(MUS_ROULETTE) \ - X(MUS_LINK_CONTEST_P1) \ - X(MUS_LINK_CONTEST_P2) \ - X(MUS_LINK_CONTEST_P3) \ - X(MUS_LINK_CONTEST_P4) \ - X(MUS_ENCOUNTER_RICH) \ - X(MUS_VERDANTURF) \ - X(MUS_RUSTBORO) \ - X(MUS_POKE_CENTER) \ - X(MUS_ROUTE104) \ - X(MUS_ROUTE119) \ - X(MUS_CYCLING) \ - X(MUS_POKE_MART) \ - X(MUS_LITTLEROOT) \ - X(MUS_MT_CHIMNEY) \ - X(MUS_ENCOUNTER_FEMALE) \ - X(MUS_LILYCOVE) \ - X(MUS_ROUTE111) \ - X(MUS_HELP) \ - X(MUS_UNDERWATER) \ - X(MUS_VICTORY_TRAINER) \ - X(MUS_TITLE) \ - X(MUS_INTRO) \ - X(MUS_ENCOUNTER_MAY) \ - X(MUS_ENCOUNTER_INTENSE) \ - X(MUS_ENCOUNTER_COOL) \ - X(MUS_ROUTE113) \ - X(MUS_ENCOUNTER_AQUA) \ - X(MUS_FOLLOW_ME) \ - X(MUS_ENCOUNTER_BRENDAN) \ - X(MUS_EVER_GRANDE) \ - X(MUS_ENCOUNTER_SUSPICIOUS) \ - X(MUS_VICTORY_AQUA_MAGMA) \ - X(MUS_CABLE_CAR) \ - X(MUS_GAME_CORNER) \ - X(MUS_DEWFORD) \ - X(MUS_SAFARI_ZONE) \ - X(MUS_VICTORY_ROAD) \ - X(MUS_AQUA_MAGMA_HIDEOUT) \ - X(MUS_SAILING) \ - X(MUS_MT_PYRE) \ - X(MUS_SLATEPORT) \ - X(MUS_MT_PYRE_EXTERIOR) \ - X(MUS_SCHOOL) \ - X(MUS_HALL_OF_FAME) \ - X(MUS_FALLARBOR) \ - X(MUS_SEALED_CHAMBER) \ - X(MUS_CONTEST_WINNER) \ - X(MUS_CONTEST) \ - X(MUS_ENCOUNTER_MAGMA) \ - X(MUS_INTRO_BATTLE) \ - X(MUS_WEATHER_KYOGRE) \ - X(MUS_WEATHER_GROUDON) \ - X(MUS_SOOTOPOLIS) \ - X(MUS_CONTEST_RESULTS) \ - X(MUS_HALL_OF_FAME_ROOM) \ - X(MUS_TRICK_HOUSE) \ - X(MUS_ENCOUNTER_TWINS) \ - X(MUS_ENCOUNTER_ELITE_FOUR) \ - X(MUS_ENCOUNTER_HIKER) \ - X(MUS_CONTEST_LOBBY) \ - X(MUS_ENCOUNTER_INTERVIEWER) \ - X(MUS_ENCOUNTER_CHAMPION) \ - X(MUS_CREDITS) \ - X(MUS_END) \ - X(MUS_B_FRONTIER) \ - X(MUS_B_ARENA) \ - X(MUS_OBTAIN_B_POINTS) \ - X(MUS_REGISTER_MATCH_CALL) \ - X(MUS_B_PYRAMID) \ - X(MUS_B_PYRAMID_TOP) \ - X(MUS_B_PALACE) \ - X(MUS_RAYQUAZA_APPEARS) \ - X(MUS_B_TOWER) \ - X(MUS_OBTAIN_SYMBOL) \ - X(MUS_B_DOME) \ - X(MUS_B_PIKE) \ - X(MUS_B_FACTORY) \ - X(MUS_VS_RAYQUAZA) \ - X(MUS_VS_FRONTIER_BRAIN) \ - X(MUS_VS_MEW) \ - X(MUS_B_DOME_LOBBY) \ - X(MUS_VS_WILD) \ - X(MUS_VS_AQUA_MAGMA) \ - X(MUS_VS_TRAINER) \ - X(MUS_VS_GYM_LEADER) \ - X(MUS_VS_CHAMPION) \ - X(MUS_VS_REGI) \ - X(MUS_VS_KYOGRE_GROUDON) \ - X(MUS_VS_RIVAL) \ - X(MUS_VS_ELITE_FOUR) \ - X(MUS_VS_AQUA_MAGMA_LEADER) \ - X(MUS_RG_FOLLOW_ME) \ - X(MUS_RG_GAME_CORNER) \ - X(MUS_RG_ROCKET_HIDEOUT) \ - X(MUS_RG_GYM) \ - X(MUS_RG_JIGGLYPUFF) \ - X(MUS_RG_INTRO_FIGHT) \ - X(MUS_RG_TITLE) \ - X(MUS_RG_CINNABAR) \ - X(MUS_RG_LAVENDER) \ - X(MUS_RG_HEAL) \ - X(MUS_RG_CYCLING) \ - X(MUS_RG_ENCOUNTER_ROCKET) \ - X(MUS_RG_ENCOUNTER_GIRL) \ - X(MUS_RG_ENCOUNTER_BOY) \ - X(MUS_RG_HALL_OF_FAME) \ - X(MUS_RG_VIRIDIAN_FOREST) \ - X(MUS_RG_MT_MOON) \ - X(MUS_RG_POKE_MANSION) \ - X(MUS_RG_CREDITS) \ - X(MUS_RG_ROUTE1) \ - X(MUS_RG_ROUTE24) \ - X(MUS_RG_ROUTE3) \ - X(MUS_RG_ROUTE11) \ - X(MUS_RG_VICTORY_ROAD) \ - X(MUS_RG_VS_GYM_LEADER) \ - X(MUS_RG_VS_TRAINER) \ - X(MUS_RG_VS_WILD) \ - X(MUS_RG_VS_CHAMPION) \ - X(MUS_RG_PALLET) \ - X(MUS_RG_OAK_LAB) \ - X(MUS_RG_OAK) \ - X(MUS_RG_POKE_CENTER) \ - X(MUS_RG_SS_ANNE) \ - X(MUS_RG_SURF) \ - X(MUS_RG_POKE_TOWER) \ - X(MUS_RG_SILPH) \ - X(MUS_RG_FUCHSIA) \ - X(MUS_RG_CELADON) \ - X(MUS_RG_VICTORY_TRAINER) \ - X(MUS_RG_VICTORY_WILD) \ - X(MUS_RG_VICTORY_GYM_LEADER) \ - X(MUS_RG_VERMILLION) \ - X(MUS_RG_PEWTER) \ - X(MUS_RG_ENCOUNTER_RIVAL) \ - X(MUS_RG_RIVAL_EXIT) \ - X(MUS_RG_DEX_RATING) \ - X(MUS_RG_OBTAIN_KEY_ITEM) \ - X(MUS_RG_CAUGHT_INTRO) \ - X(MUS_RG_PHOTO) \ - X(MUS_RG_GAME_FREAK) \ - X(MUS_RG_CAUGHT) \ - X(MUS_RG_NEW_GAME_INSTRUCT) \ - X(MUS_RG_NEW_GAME_INTRO) \ - X(MUS_RG_NEW_GAME_EXIT) \ - X(MUS_RG_POKE_JUMP) \ - X(MUS_RG_UNION_ROOM) \ - X(MUS_RG_NET_CENTER) \ - X(MUS_RG_MYSTERY_GIFT) \ - X(MUS_RG_BERRY_PICK) \ - X(MUS_RG_SEVII_CAVE) \ - X(MUS_RG_TEACHY_TV_SHOW) \ - X(MUS_RG_SEVII_ROUTE) \ - X(MUS_RG_SEVII_DUNGEON) \ - X(MUS_RG_SEVII_123) \ - X(MUS_RG_SEVII_45) \ - X(MUS_RG_SEVII_67) \ - X(MUS_RG_POKE_FLUTE) \ - X(MUS_RG_VS_DEOXYS) \ - X(MUS_RG_VS_MEWTWO) \ - X(MUS_RG_VS_LEGEND) \ - X(MUS_RG_ENCOUNTER_GYM_LEADER) \ - X(MUS_RG_ENCOUNTER_DEOXYS) \ - X(MUS_RG_TRAINER_TOWER) \ - X(MUS_RG_SLOW_PALLET) \ - X(MUS_RG_TEACHY_TV_MENU) \ - X(PH_TRAP_BLEND) \ - X(PH_TRAP_HELD) \ - X(PH_TRAP_SOLO) \ - X(PH_FACE_BLEND) \ - X(PH_FACE_HELD) \ - X(PH_FACE_SOLO) \ - X(PH_CLOTH_BLEND) \ - X(PH_CLOTH_HELD) \ - X(PH_CLOTH_SOLO) \ - X(PH_DRESS_BLEND) \ - X(PH_DRESS_HELD) \ - X(PH_DRESS_SOLO) \ - X(PH_FLEECE_BLEND) \ - X(PH_FLEECE_HELD) \ - X(PH_FLEECE_SOLO) \ - X(PH_KIT_BLEND) \ - X(PH_KIT_HELD) \ - X(PH_KIT_SOLO) \ - X(PH_PRICE_BLEND) \ - X(PH_PRICE_HELD) \ - X(PH_PRICE_SOLO) \ - X(PH_LOT_BLEND) \ - X(PH_LOT_HELD) \ - X(PH_LOT_SOLO) \ - X(PH_GOAT_BLEND) \ - X(PH_GOAT_HELD) \ - X(PH_GOAT_SOLO) \ - X(PH_THOUGHT_BLEND) \ - X(PH_THOUGHT_HELD) \ - X(PH_THOUGHT_SOLO) \ - X(PH_CHOICE_BLEND) \ - X(PH_CHOICE_HELD) \ - X(PH_CHOICE_SOLO) \ - X(PH_MOUTH_BLEND) \ - X(PH_MOUTH_HELD) \ - X(PH_MOUTH_SOLO) \ - X(PH_FOOT_BLEND) \ - X(PH_FOOT_HELD) \ - X(PH_FOOT_SOLO) \ - X(PH_GOOSE_BLEND) \ - X(PH_GOOSE_HELD) \ - X(PH_GOOSE_SOLO) \ - X(PH_STRUT_BLEND) \ - X(PH_STRUT_HELD) \ - X(PH_STRUT_SOLO) \ - X(PH_CURE_BLEND) \ - X(PH_CURE_HELD) \ - X(PH_CURE_SOLO) \ - X(PH_NURSE_BLEND) \ - X(PH_NURSE_HELD) \ - X(PH_NURSE_SOLO) \ - -#define SOUND_LIST_SE \ - X(SE_USE_ITEM) \ - X(SE_PC_LOGIN) \ - X(SE_PC_OFF) \ - X(SE_PC_ON) \ - X(SE_SELECT) \ - X(SE_WIN_OPEN) \ - X(SE_WALL_HIT) \ - X(SE_DOOR) \ - X(SE_EXIT) \ - X(SE_LEDGE) \ - X(SE_BIKE_BELL) \ - X(SE_NOT_EFFECTIVE) \ - X(SE_EFFECTIVE) \ - X(SE_SUPER_EFFECTIVE) \ - X(SE_BALL_OPEN) \ - X(SE_FAINT) \ - X(SE_FLEE) \ - X(SE_SLIDING_DOOR) \ - X(SE_SHIP) \ - X(SE_BANG) \ - X(SE_PIN) \ - X(SE_BOO) \ - X(SE_BALL) \ - X(SE_CONTEST_PLACE) \ - X(SE_A) \ - X(SE_I) \ - X(SE_U) \ - X(SE_E) \ - X(SE_O) \ - X(SE_N) \ - X(SE_SUCCESS) \ - X(SE_FAILURE) \ - X(SE_EXP) \ - X(SE_BIKE_HOP) \ - X(SE_SWITCH) \ - X(SE_CLICK) \ - X(SE_FU_ZAKU) \ - X(SE_CONTEST_CONDITION_LOSE) \ - X(SE_LAVARIDGE_FALL_WARP) \ - X(SE_ICE_STAIRS) \ - X(SE_ICE_BREAK) \ - X(SE_ICE_CRACK) \ - X(SE_FALL) \ - X(SE_UNLOCK) \ - X(SE_WARP_IN) \ - X(SE_WARP_OUT) \ - X(SE_REPEL) \ - X(SE_ROTATING_GATE) \ - X(SE_TRUCK_MOVE) \ - X(SE_TRUCK_STOP) \ - X(SE_TRUCK_UNLOAD) \ - X(SE_TRUCK_DOOR) \ - X(SE_BERRY_BLENDER) \ - X(SE_CARD) \ - X(SE_SAVE) \ - X(SE_BALL_BOUNCE_1) \ - X(SE_BALL_BOUNCE_2) \ - X(SE_BALL_BOUNCE_3) \ - X(SE_BALL_BOUNCE_4) \ - X(SE_BALL_TRADE) \ - X(SE_BALL_THROW) \ - X(SE_NOTE_C) \ - X(SE_NOTE_D) \ - X(SE_NOTE_E) \ - X(SE_NOTE_F) \ - X(SE_NOTE_G) \ - X(SE_NOTE_A) \ - X(SE_NOTE_B) \ - X(SE_NOTE_C_HIGH) \ - X(SE_PUDDLE) \ - X(SE_BRIDGE_WALK) \ - X(SE_ITEMFINDER) \ - X(SE_DING_DONG) \ - X(SE_BALLOON_RED) \ - X(SE_BALLOON_BLUE) \ - X(SE_BALLOON_YELLOW) \ - X(SE_BREAKABLE_DOOR) \ - X(SE_MUD_BALL) \ - X(SE_FIELD_POISON) \ - X(SE_ESCALATOR) \ - X(SE_THUNDERSTORM) \ - X(SE_THUNDERSTORM_STOP) \ - X(SE_DOWNPOUR) \ - X(SE_DOWNPOUR_STOP) \ - X(SE_RAIN) \ - X(SE_RAIN_STOP) \ - X(SE_THUNDER) \ - X(SE_THUNDER2) \ - X(SE_ELEVATOR) \ - X(SE_LOW_HEALTH) \ - X(SE_EXP_MAX) \ - X(SE_ROULETTE_BALL) \ - X(SE_ROULETTE_BALL2) \ - X(SE_TAILLOW_WING_FLAP) \ - X(SE_SHOP) \ - X(SE_CONTEST_HEART) \ - X(SE_CONTEST_CURTAIN_RISE) \ - X(SE_CONTEST_CURTAIN_FALL) \ - X(SE_CONTEST_ICON_CHANGE) \ - X(SE_CONTEST_ICON_CLEAR) \ - X(SE_CONTEST_MONS_TURN) \ - X(SE_SHINY) \ - X(SE_INTRO_BLAST) \ - X(SE_MUGSHOT) \ - X(SE_APPLAUSE) \ - X(SE_VEND) \ - X(SE_ORB) \ - X(SE_DEX_SCROLL) \ - X(SE_DEX_PAGE) \ - X(SE_POKENAV_ON) \ - X(SE_POKENAV_OFF) \ - X(SE_DEX_SEARCH) \ - X(SE_EGG_HATCH) \ - X(SE_BALL_TRAY_ENTER) \ - X(SE_BALL_TRAY_BALL) \ - X(SE_BALL_TRAY_EXIT) \ - X(SE_GLASS_FLUTE) \ - X(SE_M_THUNDERBOLT) \ - X(SE_M_THUNDERBOLT2) \ - X(SE_M_HARDEN) \ - X(SE_M_NIGHTMARE) \ - X(SE_M_VITAL_THROW) \ - X(SE_M_VITAL_THROW2) \ - X(SE_M_BUBBLE) \ - X(SE_M_BUBBLE2) \ - X(SE_M_BUBBLE3) \ - X(SE_M_RAIN_DANCE) \ - X(SE_M_CUT) \ - X(SE_M_STRING_SHOT) \ - X(SE_M_STRING_SHOT2) \ - X(SE_M_ROCK_THROW) \ - X(SE_M_GUST) \ - X(SE_M_GUST2) \ - X(SE_M_DOUBLE_SLAP) \ - X(SE_M_DOUBLE_TEAM) \ - X(SE_M_RAZOR_WIND) \ - X(SE_M_ICY_WIND) \ - X(SE_M_THUNDER_WAVE) \ - X(SE_M_COMET_PUNCH) \ - X(SE_M_MEGA_KICK) \ - X(SE_M_MEGA_KICK2) \ - X(SE_M_CRABHAMMER) \ - X(SE_M_JUMP_KICK) \ - X(SE_M_FLAME_WHEEL) \ - X(SE_M_FLAME_WHEEL2) \ - X(SE_M_FLAMETHROWER) \ - X(SE_M_FIRE_PUNCH) \ - X(SE_M_TOXIC) \ - X(SE_M_SACRED_FIRE) \ - X(SE_M_SACRED_FIRE2) \ - X(SE_M_EMBER) \ - X(SE_M_TAKE_DOWN) \ - X(SE_M_BLIZZARD) \ - X(SE_M_BLIZZARD2) \ - X(SE_M_SCRATCH) \ - X(SE_M_VICEGRIP) \ - X(SE_M_WING_ATTACK) \ - X(SE_M_FLY) \ - X(SE_M_SAND_ATTACK) \ - X(SE_M_RAZOR_WIND2) \ - X(SE_M_BITE) \ - X(SE_M_HEADBUTT) \ - X(SE_M_SURF) \ - X(SE_M_HYDRO_PUMP) \ - X(SE_M_WHIRLPOOL) \ - X(SE_M_HORN_ATTACK) \ - X(SE_M_TAIL_WHIP) \ - X(SE_M_MIST) \ - X(SE_M_POISON_POWDER) \ - X(SE_M_BIND) \ - X(SE_M_DRAGON_RAGE) \ - X(SE_M_SING) \ - X(SE_M_PERISH_SONG) \ - X(SE_M_PAY_DAY) \ - X(SE_M_DIG) \ - X(SE_M_DIZZY_PUNCH) \ - X(SE_M_SELF_DESTRUCT) \ - X(SE_M_EXPLOSION) \ - X(SE_M_ABSORB_2) \ - X(SE_M_ABSORB) \ - X(SE_M_SCREECH) \ - X(SE_M_BUBBLE_BEAM) \ - X(SE_M_BUBBLE_BEAM2) \ - X(SE_M_SUPERSONIC) \ - X(SE_M_BELLY_DRUM) \ - X(SE_M_METRONOME) \ - X(SE_M_BONEMERANG) \ - X(SE_M_LICK) \ - X(SE_M_PSYBEAM) \ - X(SE_M_FAINT_ATTACK) \ - X(SE_M_SWORDS_DANCE) \ - X(SE_M_LEER) \ - X(SE_M_SWAGGER) \ - X(SE_M_SWAGGER2) \ - X(SE_M_HEAL_BELL) \ - X(SE_M_CONFUSE_RAY) \ - X(SE_M_SNORE) \ - X(SE_M_BRICK_BREAK) \ - X(SE_M_GIGA_DRAIN) \ - X(SE_M_PSYBEAM2) \ - X(SE_M_SOLAR_BEAM) \ - X(SE_M_PETAL_DANCE) \ - X(SE_M_TELEPORT) \ - X(SE_M_MINIMIZE) \ - X(SE_M_SKETCH) \ - X(SE_M_SWIFT) \ - X(SE_M_REFLECT) \ - X(SE_M_BARRIER) \ - X(SE_M_DETECT) \ - X(SE_M_LOCK_ON) \ - X(SE_M_MOONLIGHT) \ - X(SE_M_CHARM) \ - X(SE_M_CHARGE) \ - X(SE_M_STRENGTH) \ - X(SE_M_HYPER_BEAM) \ - X(SE_M_WATERFALL) \ - X(SE_M_REVERSAL) \ - X(SE_M_ACID_ARMOR) \ - X(SE_M_SANDSTORM) \ - X(SE_M_TRI_ATTACK) \ - X(SE_M_TRI_ATTACK2) \ - X(SE_M_ENCORE) \ - X(SE_M_ENCORE2) \ - X(SE_M_BATON_PASS) \ - X(SE_M_MILK_DRINK) \ - X(SE_M_ATTRACT) \ - X(SE_M_ATTRACT2) \ - X(SE_M_MORNING_SUN) \ - X(SE_M_FLATTER) \ - X(SE_M_SAND_TOMB) \ - X(SE_M_GRASSWHISTLE) \ - X(SE_M_SPIT_UP) \ - X(SE_M_DIVE) \ - X(SE_M_EARTHQUAKE) \ - X(SE_M_TWISTER) \ - X(SE_M_SWEET_SCENT) \ - X(SE_M_YAWN) \ - X(SE_M_SKY_UPPERCUT) \ - X(SE_M_STAT_INCREASE) \ - X(SE_M_HEAT_WAVE) \ - X(SE_M_UPROAR) \ - X(SE_M_HAIL) \ - X(SE_M_COSMIC_POWER) \ - X(SE_M_TEETER_DANCE) \ - X(SE_M_STAT_DECREASE) \ - X(SE_M_HAZE) \ - X(SE_M_HYPER_BEAM2) \ - X(SE_RG_DOOR) \ - X(SE_RG_CARD_FLIP) \ - X(SE_RG_CARD_FLIPPING) \ - X(SE_RG_CARD_OPEN) \ - X(SE_RG_BAG_CURSOR) \ - X(SE_RG_BAG_POCKET) \ - X(SE_RG_BALL_CLICK) \ - X(SE_RG_SHOP) \ - X(SE_RG_SS_ANNE_HORN) \ - X(SE_RG_HELP_OPEN) \ - X(SE_RG_HELP_CLOSE) \ - X(SE_RG_HELP_ERROR) \ - X(SE_RG_DEOXYS_MOVE) \ - X(SE_RG_POKE_JUMP_SUCCESS) \ - X(SE_RG_POKE_JUMP_FAILURE) \ - X(SE_PHONE_CALL) \ - X(SE_PHONE_CLICK) \ - X(SE_ARENA_TIMEUP1) \ - X(SE_ARENA_TIMEUP2) \ - X(SE_PIKE_CURTAIN_CLOSE) \ - X(SE_PIKE_CURTAIN_OPEN) \ - X(SE_SUDOWOODO_SHAKE) \ +#define SOUND_LIST_BGM \ + X(MUS_LITTLEROOT_TEST) \ + X(MUS_GSC_ROUTE38) \ + X(MUS_CAUGHT) \ + X(MUS_VICTORY_WILD) \ + X(MUS_VICTORY_GYM_LEADER) \ + X(MUS_VICTORY_LEAGUE) \ + X(MUS_C_COMM_CENTER) \ + X(MUS_GSC_PEWTER) \ + X(MUS_C_VS_LEGEND_BEAST) \ + X(MUS_ROUTE101) \ + X(MUS_ROUTE110) \ + X(MUS_ROUTE120) \ + X(MUS_PETALBURG) \ + X(MUS_OLDALE) \ + X(MUS_GYM) \ + X(MUS_SURF) \ + X(MUS_PETALBURG_WOODS) \ + X(MUS_LEVEL_UP) \ + X(MUS_HEAL) \ + X(MUS_OBTAIN_BADGE) \ + X(MUS_OBTAIN_ITEM) \ + X(MUS_EVOLVED) \ + X(MUS_OBTAIN_TMHM) \ + X(MUS_LILYCOVE_MUSEUM) \ + X(MUS_ROUTE122) \ + X(MUS_OCEANIC_MUSEUM) \ + X(MUS_EVOLUTION_INTRO) \ + X(MUS_EVOLUTION) \ + X(MUS_MOVE_DELETED) \ + X(MUS_ENCOUNTER_GIRL) \ + X(MUS_ENCOUNTER_MALE) \ + X(MUS_ABANDONED_SHIP) \ + X(MUS_FORTREE) \ + X(MUS_BIRCH_LAB) \ + X(MUS_B_TOWER_RS) \ + X(MUS_ENCOUNTER_SWIMMER) \ + X(MUS_CAVE_OF_ORIGIN) \ + X(MUS_OBTAIN_BERRY) \ + X(MUS_AWAKEN_LEGEND) \ + X(MUS_SLOTS_JACKPOT) \ + X(MUS_SLOTS_WIN) \ + X(MUS_TOO_BAD) \ + X(MUS_ROULETTE) \ + X(MUS_LINK_CONTEST_P1) \ + X(MUS_LINK_CONTEST_P2) \ + X(MUS_LINK_CONTEST_P3) \ + X(MUS_LINK_CONTEST_P4) \ + X(MUS_ENCOUNTER_RICH) \ + X(MUS_VERDANTURF) \ + X(MUS_RUSTBORO) \ + X(MUS_POKE_CENTER) \ + X(MUS_ROUTE104) \ + X(MUS_ROUTE119) \ + X(MUS_CYCLING) \ + X(MUS_POKE_MART) \ + X(MUS_LITTLEROOT) \ + X(MUS_MT_CHIMNEY) \ + X(MUS_ENCOUNTER_FEMALE) \ + X(MUS_LILYCOVE) \ + X(MUS_DESERT) \ + X(MUS_HELP) \ + X(MUS_UNDERWATER) \ + X(MUS_VICTORY_TRAINER) \ + X(MUS_TITLE) \ + X(MUS_INTRO) \ + X(MUS_ENCOUNTER_MAY) \ + X(MUS_ENCOUNTER_INTENSE) \ + X(MUS_ENCOUNTER_COOL) \ + X(MUS_ROUTE113) \ + X(MUS_ENCOUNTER_AQUA) \ + X(MUS_FOLLOW_ME) \ + X(MUS_ENCOUNTER_BRENDAN) \ + X(MUS_EVER_GRANDE) \ + X(MUS_ENCOUNTER_SUSPICIOUS) \ + X(MUS_VICTORY_AQUA_MAGMA) \ + X(MUS_CABLE_CAR) \ + X(MUS_GAME_CORNER) \ + X(MUS_DEWFORD) \ + X(MUS_SAFARI_ZONE) \ + X(MUS_VICTORY_ROAD) \ + X(MUS_AQUA_MAGMA_HIDEOUT) \ + X(MUS_SAILING) \ + X(MUS_MT_PYRE) \ + X(MUS_SLATEPORT) \ + X(MUS_MT_PYRE_EXTERIOR) \ + X(MUS_SCHOOL) \ + X(MUS_HALL_OF_FAME) \ + X(MUS_FALLARBOR) \ + X(MUS_SEALED_CHAMBER) \ + X(MUS_CONTEST_WINNER) \ + X(MUS_CONTEST) \ + X(MUS_ENCOUNTER_MAGMA) \ + X(MUS_INTRO_BATTLE) \ + X(MUS_ABNORMAL_WEATHER) \ + X(MUS_WEATHER_GROUDON) \ + X(MUS_SOOTOPOLIS) \ + X(MUS_CONTEST_RESULTS) \ + X(MUS_HALL_OF_FAME_ROOM) \ + X(MUS_TRICK_HOUSE) \ + X(MUS_ENCOUNTER_TWINS) \ + X(MUS_ENCOUNTER_ELITE_FOUR) \ + X(MUS_ENCOUNTER_HIKER) \ + X(MUS_CONTEST_LOBBY) \ + X(MUS_ENCOUNTER_INTERVIEWER) \ + X(MUS_ENCOUNTER_CHAMPION) \ + X(MUS_CREDITS) \ + X(MUS_END) \ + X(MUS_B_FRONTIER) \ + X(MUS_B_ARENA) \ + X(MUS_OBTAIN_B_POINTS) \ + X(MUS_REGISTER_MATCH_CALL) \ + X(MUS_B_PYRAMID) \ + X(MUS_B_PYRAMID_TOP) \ + X(MUS_B_PALACE) \ + X(MUS_RAYQUAZA_APPEARS) \ + X(MUS_B_TOWER) \ + X(MUS_OBTAIN_SYMBOL) \ + X(MUS_B_DOME) \ + X(MUS_B_PIKE) \ + X(MUS_B_FACTORY) \ + X(MUS_VS_RAYQUAZA) \ + X(MUS_VS_FRONTIER_BRAIN) \ + X(MUS_VS_MEW) \ + X(MUS_B_DOME_LOBBY) \ + X(MUS_VS_WILD) \ + X(MUS_VS_AQUA_MAGMA) \ + X(MUS_VS_TRAINER) \ + X(MUS_VS_GYM_LEADER) \ + X(MUS_VS_CHAMPION) \ + X(MUS_VS_REGI) \ + X(MUS_VS_KYOGRE_GROUDON) \ + X(MUS_VS_RIVAL) \ + X(MUS_VS_ELITE_FOUR) \ + X(MUS_VS_AQUA_MAGMA_LEADER) \ + X(MUS_RG_FOLLOW_ME) \ + X(MUS_RG_GAME_CORNER) \ + X(MUS_RG_ROCKET_HIDEOUT) \ + X(MUS_RG_GYM) \ + X(MUS_RG_JIGGLYPUFF) \ + X(MUS_RG_INTRO_FIGHT) \ + X(MUS_RG_TITLE) \ + X(MUS_RG_CINNABAR) \ + X(MUS_RG_LAVENDER) \ + X(MUS_RG_HEAL) \ + X(MUS_RG_CYCLING) \ + X(MUS_RG_ENCOUNTER_ROCKET) \ + X(MUS_RG_ENCOUNTER_GIRL) \ + X(MUS_RG_ENCOUNTER_BOY) \ + X(MUS_RG_HALL_OF_FAME) \ + X(MUS_RG_VIRIDIAN_FOREST) \ + X(MUS_RG_MT_MOON) \ + X(MUS_RG_POKE_MANSION) \ + X(MUS_RG_CREDITS) \ + X(MUS_RG_ROUTE1) \ + X(MUS_RG_ROUTE24) \ + X(MUS_RG_ROUTE3) \ + X(MUS_RG_ROUTE11) \ + X(MUS_RG_VICTORY_ROAD) \ + X(MUS_RG_VS_GYM_LEADER) \ + X(MUS_RG_VS_TRAINER) \ + X(MUS_RG_VS_WILD) \ + X(MUS_RG_VS_CHAMPION) \ + X(MUS_RG_PALLET) \ + X(MUS_RG_OAK_LAB) \ + X(MUS_RG_OAK) \ + X(MUS_RG_POKE_CENTER) \ + X(MUS_RG_SS_ANNE) \ + X(MUS_RG_SURF) \ + X(MUS_RG_POKE_TOWER) \ + X(MUS_RG_SILPH) \ + X(MUS_RG_FUCHSIA) \ + X(MUS_RG_CELADON) \ + X(MUS_RG_VICTORY_TRAINER) \ + X(MUS_RG_VICTORY_WILD) \ + X(MUS_RG_VICTORY_GYM_LEADER) \ + X(MUS_RG_VERMILLION) \ + X(MUS_RG_PEWTER) \ + X(MUS_RG_ENCOUNTER_RIVAL) \ + X(MUS_RG_RIVAL_EXIT) \ + X(MUS_RG_DEX_RATING) \ + X(MUS_RG_OBTAIN_KEY_ITEM) \ + X(MUS_RG_CAUGHT_INTRO) \ + X(MUS_RG_PHOTO) \ + X(MUS_RG_GAME_FREAK) \ + X(MUS_RG_CAUGHT) \ + X(MUS_RG_NEW_GAME_INSTRUCT) \ + X(MUS_RG_NEW_GAME_INTRO) \ + X(MUS_RG_NEW_GAME_EXIT) \ + X(MUS_RG_POKE_JUMP) \ + X(MUS_RG_UNION_ROOM) \ + X(MUS_RG_NET_CENTER) \ + X(MUS_RG_MYSTERY_GIFT) \ + X(MUS_RG_BERRY_PICK) \ + X(MUS_RG_SEVII_CAVE) \ + X(MUS_RG_TEACHY_TV_SHOW) \ + X(MUS_RG_SEVII_ROUTE) \ + X(MUS_RG_SEVII_DUNGEON) \ + X(MUS_RG_SEVII_123) \ + X(MUS_RG_SEVII_45) \ + X(MUS_RG_SEVII_67) \ + X(MUS_RG_POKE_FLUTE) \ + X(MUS_RG_VS_DEOXYS) \ + X(MUS_RG_VS_MEWTWO) \ + X(MUS_RG_VS_LEGEND) \ + X(MUS_RG_ENCOUNTER_GYM_LEADER) \ + X(MUS_RG_ENCOUNTER_DEOXYS) \ + X(MUS_RG_TRAINER_TOWER) \ + X(MUS_RG_SLOW_PALLET) \ + X(MUS_RG_TEACHY_TV_MENU) + +#define SOUND_LIST_SE \ + X(SE_USE_ITEM) \ + X(SE_PC_LOGIN) \ + X(SE_PC_OFF) \ + X(SE_PC_ON) \ + X(SE_SELECT) \ + X(SE_WIN_OPEN) \ + X(SE_WALL_HIT) \ + X(SE_DOOR) \ + X(SE_EXIT) \ + X(SE_LEDGE) \ + X(SE_BIKE_BELL) \ + X(SE_NOT_EFFECTIVE) \ + X(SE_EFFECTIVE) \ + X(SE_SUPER_EFFECTIVE) \ + X(SE_BALL_OPEN) \ + X(SE_FAINT) \ + X(SE_FLEE) \ + X(SE_SLIDING_DOOR) \ + X(SE_SHIP) \ + X(SE_BANG) \ + X(SE_PIN) \ + X(SE_BOO) \ + X(SE_BALL) \ + X(SE_CONTEST_PLACE) \ + X(SE_A) \ + X(SE_I) \ + X(SE_U) \ + X(SE_E) \ + X(SE_O) \ + X(SE_N) \ + X(SE_SUCCESS) \ + X(SE_FAILURE) \ + X(SE_EXP) \ + X(SE_BIKE_HOP) \ + X(SE_SWITCH) \ + X(SE_CLICK) \ + X(SE_FU_ZAKU) \ + X(SE_CONTEST_CONDITION_LOSE) \ + X(SE_LAVARIDGE_FALL_WARP) \ + X(SE_ICE_STAIRS) \ + X(SE_ICE_BREAK) \ + X(SE_ICE_CRACK) \ + X(SE_FALL) \ + X(SE_UNLOCK) \ + X(SE_WARP_IN) \ + X(SE_WARP_OUT) \ + X(SE_REPEL) \ + X(SE_ROTATING_GATE) \ + X(SE_TRUCK_MOVE) \ + X(SE_TRUCK_STOP) \ + X(SE_TRUCK_UNLOAD) \ + X(SE_TRUCK_DOOR) \ + X(SE_BERRY_BLENDER) \ + X(SE_CARD) \ + X(SE_SAVE) \ + X(SE_BALL_BOUNCE_1) \ + X(SE_BALL_BOUNCE_2) \ + X(SE_BALL_BOUNCE_3) \ + X(SE_BALL_BOUNCE_4) \ + X(SE_BALL_TRADE) \ + X(SE_BALL_THROW) \ + X(SE_NOTE_C) \ + X(SE_NOTE_D) \ + X(SE_NOTE_E) \ + X(SE_NOTE_F) \ + X(SE_NOTE_G) \ + X(SE_NOTE_A) \ + X(SE_NOTE_B) \ + X(SE_NOTE_C_HIGH) \ + X(SE_PUDDLE) \ + X(SE_BRIDGE_WALK) \ + X(SE_ITEMFINDER) \ + X(SE_DING_DONG) \ + X(SE_BALLOON_RED) \ + X(SE_BALLOON_BLUE) \ + X(SE_BALLOON_YELLOW) \ + X(SE_BREAKABLE_DOOR) \ + X(SE_MUD_BALL) \ + X(SE_FIELD_POISON) \ + X(SE_ESCALATOR) \ + X(SE_THUNDERSTORM) \ + X(SE_THUNDERSTORM_STOP) \ + X(SE_DOWNPOUR) \ + X(SE_DOWNPOUR_STOP) \ + X(SE_RAIN) \ + X(SE_RAIN_STOP) \ + X(SE_THUNDER) \ + X(SE_THUNDER2) \ + X(SE_ELEVATOR) \ + X(SE_LOW_HEALTH) \ + X(SE_EXP_MAX) \ + X(SE_ROULETTE_BALL) \ + X(SE_ROULETTE_BALL2) \ + X(SE_TAILLOW_WING_FLAP) \ + X(SE_SHOP) \ + X(SE_CONTEST_HEART) \ + X(SE_CONTEST_CURTAIN_RISE) \ + X(SE_CONTEST_CURTAIN_FALL) \ + X(SE_CONTEST_ICON_CHANGE) \ + X(SE_CONTEST_ICON_CLEAR) \ + X(SE_CONTEST_MONS_TURN) \ + X(SE_SHINY) \ + X(SE_INTRO_BLAST) \ + X(SE_MUGSHOT) \ + X(SE_APPLAUSE) \ + X(SE_VEND) \ + X(SE_ORB) \ + X(SE_DEX_SCROLL) \ + X(SE_DEX_PAGE) \ + X(SE_POKENAV_ON) \ + X(SE_POKENAV_OFF) \ + X(SE_DEX_SEARCH) \ + X(SE_EGG_HATCH) \ + X(SE_BALL_TRAY_ENTER) \ + X(SE_BALL_TRAY_BALL) \ + X(SE_BALL_TRAY_EXIT) \ + X(SE_GLASS_FLUTE) \ + X(SE_M_THUNDERBOLT) \ + X(SE_M_THUNDERBOLT2) \ + X(SE_M_HARDEN) \ + X(SE_M_NIGHTMARE) \ + X(SE_M_VITAL_THROW) \ + X(SE_M_VITAL_THROW2) \ + X(SE_M_BUBBLE) \ + X(SE_M_BUBBLE2) \ + X(SE_M_BUBBLE3) \ + X(SE_M_RAIN_DANCE) \ + X(SE_M_CUT) \ + X(SE_M_STRING_SHOT) \ + X(SE_M_STRING_SHOT2) \ + X(SE_M_ROCK_THROW) \ + X(SE_M_GUST) \ + X(SE_M_GUST2) \ + X(SE_M_DOUBLE_SLAP) \ + X(SE_M_DOUBLE_TEAM) \ + X(SE_M_RAZOR_WIND) \ + X(SE_M_ICY_WIND) \ + X(SE_M_THUNDER_WAVE) \ + X(SE_M_COMET_PUNCH) \ + X(SE_M_MEGA_KICK) \ + X(SE_M_MEGA_KICK2) \ + X(SE_M_CRABHAMMER) \ + X(SE_M_JUMP_KICK) \ + X(SE_M_FLAME_WHEEL) \ + X(SE_M_FLAME_WHEEL2) \ + X(SE_M_FLAMETHROWER) \ + X(SE_M_FIRE_PUNCH) \ + X(SE_M_TOXIC) \ + X(SE_M_SACRED_FIRE) \ + X(SE_M_SACRED_FIRE2) \ + X(SE_M_EMBER) \ + X(SE_M_TAKE_DOWN) \ + X(SE_M_BLIZZARD) \ + X(SE_M_BLIZZARD2) \ + X(SE_M_SCRATCH) \ + X(SE_M_VICEGRIP) \ + X(SE_M_WING_ATTACK) \ + X(SE_M_FLY) \ + X(SE_M_SAND_ATTACK) \ + X(SE_M_RAZOR_WIND2) \ + X(SE_M_BITE) \ + X(SE_M_HEADBUTT) \ + X(SE_M_SURF) \ + X(SE_M_HYDRO_PUMP) \ + X(SE_M_WHIRLPOOL) \ + X(SE_M_HORN_ATTACK) \ + X(SE_M_TAIL_WHIP) \ + X(SE_M_MIST) \ + X(SE_M_POISON_POWDER) \ + X(SE_M_BIND) \ + X(SE_M_DRAGON_RAGE) \ + X(SE_M_SING) \ + X(SE_M_PERISH_SONG) \ + X(SE_M_PAY_DAY) \ + X(SE_M_DIG) \ + X(SE_M_DIZZY_PUNCH) \ + X(SE_M_SELF_DESTRUCT) \ + X(SE_M_EXPLOSION) \ + X(SE_M_ABSORB_2) \ + X(SE_M_ABSORB) \ + X(SE_M_SCREECH) \ + X(SE_M_BUBBLE_BEAM) \ + X(SE_M_BUBBLE_BEAM2) \ + X(SE_M_SUPERSONIC) \ + X(SE_M_BELLY_DRUM) \ + X(SE_M_METRONOME) \ + X(SE_M_BONEMERANG) \ + X(SE_M_LICK) \ + X(SE_M_PSYBEAM) \ + X(SE_M_FAINT_ATTACK) \ + X(SE_M_SWORDS_DANCE) \ + X(SE_M_LEER) \ + X(SE_M_SWAGGER) \ + X(SE_M_SWAGGER2) \ + X(SE_M_HEAL_BELL) \ + X(SE_M_CONFUSE_RAY) \ + X(SE_M_SNORE) \ + X(SE_M_BRICK_BREAK) \ + X(SE_M_GIGA_DRAIN) \ + X(SE_M_PSYBEAM2) \ + X(SE_M_SOLAR_BEAM) \ + X(SE_M_PETAL_DANCE) \ + X(SE_M_TELEPORT) \ + X(SE_M_MINIMIZE) \ + X(SE_M_SKETCH) \ + X(SE_M_SWIFT) \ + X(SE_M_REFLECT) \ + X(SE_M_BARRIER) \ + X(SE_M_DETECT) \ + X(SE_M_LOCK_ON) \ + X(SE_M_MOONLIGHT) \ + X(SE_M_CHARM) \ + X(SE_M_CHARGE) \ + X(SE_M_STRENGTH) \ + X(SE_M_HYPER_BEAM) \ + X(SE_M_WATERFALL) \ + X(SE_M_REVERSAL) \ + X(SE_M_ACID_ARMOR) \ + X(SE_M_SANDSTORM) \ + X(SE_M_TRI_ATTACK) \ + X(SE_M_TRI_ATTACK2) \ + X(SE_M_ENCORE) \ + X(SE_M_ENCORE2) \ + X(SE_M_BATON_PASS) \ + X(SE_M_MILK_DRINK) \ + X(SE_M_ATTRACT) \ + X(SE_M_ATTRACT2) \ + X(SE_M_MORNING_SUN) \ + X(SE_M_FLATTER) \ + X(SE_M_SAND_TOMB) \ + X(SE_M_GRASSWHISTLE) \ + X(SE_M_SPIT_UP) \ + X(SE_M_DIVE) \ + X(SE_M_EARTHQUAKE) \ + X(SE_M_TWISTER) \ + X(SE_M_SWEET_SCENT) \ + X(SE_M_YAWN) \ + X(SE_M_SKY_UPPERCUT) \ + X(SE_M_STAT_INCREASE) \ + X(SE_M_HEAT_WAVE) \ + X(SE_M_UPROAR) \ + X(SE_M_HAIL) \ + X(SE_M_COSMIC_POWER) \ + X(SE_M_TEETER_DANCE) \ + X(SE_M_STAT_DECREASE) \ + X(SE_M_HAZE) \ + X(SE_M_HYPER_BEAM2) \ + X(SE_RG_DOOR) \ + X(SE_RG_CARD_FLIP) \ + X(SE_RG_CARD_FLIPPING) \ + X(SE_RG_CARD_OPEN) \ + X(SE_RG_BAG_CURSOR) \ + X(SE_RG_BAG_POCKET) \ + X(SE_RG_BALL_CLICK) \ + X(SE_RG_SHOP) \ + X(SE_RG_SS_ANNE_HORN) \ + X(SE_RG_HELP_OPEN) \ + X(SE_RG_HELP_CLOSE) \ + X(SE_RG_HELP_ERROR) \ + X(SE_RG_DEOXYS_MOVE) \ + X(SE_RG_POKE_JUMP_SUCCESS) \ + X(SE_RG_POKE_JUMP_FAILURE) \ + X(SE_POKENAV_CALL) \ + X(SE_POKENAV_HANG_UP) \ + X(SE_ARENA_TIMEUP1) \ + X(SE_ARENA_TIMEUP2) \ + X(SE_PIKE_CURTAIN_CLOSE) \ + X(SE_PIKE_CURTAIN_OPEN) \ + X(SE_SUDOWOODO_SHAKE) // Create BGM list #define X(songId) static const u8 sBGMName_##songId[] = _(#songId); SOUND_LIST_BGM #undef X -#define X(songId) sBGMName_##songId, -static const u8 *const sBGMNames[] = +#define X(songId) [songId - START_MUS] = sBGMName_##songId, +static const u8 *const sBGMNames[END_MUS - START_MUS + 1] = { SOUND_LIST_BGM }; @@ -4738,8 +3938,8 @@ SOUND_LIST_BGM SOUND_LIST_SE #undef X -#define X(songId) sSEName_##songId, -static const u8 *const sSENames[] = +#define X(songId) [songId - 1] = sSEName_##songId, +static const u8 *const sSENames[END_SE + 1] = { SOUND_LIST_SE }; @@ -4853,39 +4053,89 @@ static void DebugAction_BerryFunctions_Weeds(u8 taskId) // ******************************* // Actions Party/Boxes -static void DebugAction_Party_MoveReminder(u8 taskId) +static void DebugAction_Party_HealParty(u8 taskId) { - Debug_DestroyMenu_Full_Script(taskId, FallarborTown_MoveRelearnersHouse_EventScript_ChooseMon); + PlaySE(SE_USE_ITEM); + HealPlayerParty(); + ScriptContext_Enable(); + Debug_DestroyMenu_Full(taskId); } -static void DebugAction_Party_HatchAnEgg(u8 taskId) +void DebugNative_GetAbilityNames(void) { - Debug_DestroyMenu_Full_Script(taskId, Debug_HatchAnEgg); + u32 species = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPECIES); + StringCopy(gStringVar1, gAbilitiesInfo[GetAbilityBySpecies(species, 0)].name); + StringCopy(gStringVar2, gAbilitiesInfo[GetAbilityBySpecies(species, 1)].name); + StringCopy(gStringVar3, gAbilitiesInfo[GetAbilityBySpecies(species, 2)].name); } -static void DebugAction_Party_HealParty(u8 taskId) +#define tPartyId data[5] +#define tFriendship data[6] + +static void Debug_Display_FriendshipInfo(s32 oldFriendship, s32 newFriendship, u32 digit, u8 windowId) { - PlaySE(SE_USE_ITEM); - HealPlayerParty(); - ScriptContext_Enable(); - Debug_DestroyMenu_Full(taskId); + ConvertIntToDecimalStringN(gStringVar1, oldFriendship, STR_CONV_MODE_LEADING_ZEROS, 3); + ConvertIntToDecimalStringN(gStringVar2, newFriendship, STR_CONV_MODE_LEADING_ZEROS, 3); + StringCopy(gStringVar3, gText_DigitIndicator[digit]); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Friendship:\n{STR_VAR_1} {RIGHT_ARROW} {STR_VAR_2}\n\n{STR_VAR_3}")); + AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); } -static void DebugAction_Party_InflictStatus1(u8 taskId) +static void DebugNativeStep_Party_SetFriendshipSelect(u8 taskId) { - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_InflictStatus1); + if (JOY_NEW(A_BUTTON)) + { + PlaySE(SE_SELECT); + gTasks[taskId].tFriendship = gTasks[taskId].tInput; + SetMonData(&gPlayerParty[gTasks[taskId].tPartyId], MON_DATA_FRIENDSHIP, &gTasks[taskId].tInput); + } + else if (JOY_NEW(B_BUTTON)) + { + PlaySE(SE_SELECT); + DebugNativeStep_CloseDebugWindow(taskId); + return; + } + + Debug_HandleInput_Numeric(taskId, 0, 255, 3); + + if (JOY_NEW(DPAD_ANY) || JOY_NEW(A_BUTTON)) + Debug_Display_FriendshipInfo(gTasks[taskId].tFriendship, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); } -static void DebugAction_Party_CheckEVs(u8 taskId) +static void DebugNativeStep_Party_SetFriendshipMain(u8 taskId) { - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_CheckEVs); + u8 windowId = DebugNativeStep_CreateDebugWindow(); + u32 friendship = GetMonData(&gPlayerParty[gTasks[taskId].tPartyId], MON_DATA_FRIENDSHIP); + + // Display initial flag + Debug_Display_FriendshipInfo(friendship, friendship, 0, windowId); + + gTasks[taskId].func = DebugNativeStep_Party_SetFriendshipSelect; + gTasks[taskId].tSubWindowId = windowId; + gTasks[taskId].tFriendship = friendship; + gTasks[taskId].tInput = friendship; + gTasks[taskId].tDigit = 0; + gTasks[taskId].tPartyId = 0; } -static void DebugAction_Party_CheckIVs(u8 taskId) +void DebugNative_Party_SetFriendship(void) { - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_CheckIVs); + if (gSpecialVar_0x8004 < PARTY_SIZE) + { + u32 taskId = CreateTask(DebugNativeStep_Party_SetFriendshipMain, 1); + gTasks[taskId].tPartyId = gSpecialVar_0x8004; + } } +#undef tPartyId +#undef tFriendship + +#undef tMenuTaskId +#undef tWindowId +#undef tSubWindowId +#undef tInput +#undef tDigit + static void DebugAction_Party_ClearParty(u8 taskId) { ZeroPlayerPartyMons(); @@ -4893,13 +4143,49 @@ static void DebugAction_Party_ClearParty(u8 taskId) Debug_DestroyMenu_Full(taskId); } -void CheckEWRAMCounters(struct ScriptContext *ctx) +enum DebugTrainerIds { - ConvertIntToDecimalStringN(gStringVar1, gFollowerSteps, STR_CONV_MODE_LEFT_ALIGN, 5); - ConvertIntToDecimalStringN(gStringVar2, gChainFishingDexNavStreak, STR_CONV_MODE_LEFT_ALIGN, 5); + DEBUG_TRAINER_PLAYER, + DEBUG_TRAINER_AI, + DEBUG_TRAINERS_COUNT +}; + +const struct Trainer sDebugTrainers[DIFFICULTY_COUNT][DEBUG_TRAINERS_COUNT] = +{ +#include "data/debug_trainers.h" +}; + +const struct Trainer* GetDebugAiTrainer(void) +{ + return &sDebugTrainers[DIFFICULTY_NORMAL][DEBUG_TRAINER_AI]; +} + +static void DebugAction_Party_SetParty(u8 taskId) +{ + ZeroPlayerPartyMons(); + CreateNPCTrainerPartyFromTrainer(gPlayerParty, &sDebugTrainers[DIFFICULTY_NORMAL][DEBUG_TRAINER_PLAYER], TRUE, BATTLE_TYPE_TRAINER); + ScriptContext_Enable(); + Debug_DestroyMenu_Full(taskId); +} + +static void DebugAction_Party_BattleSingle(u8 taskId) +{ + ZeroPlayerPartyMons(); + ZeroEnemyPartyMons(); + CreateNPCTrainerPartyFromTrainer(gPlayerParty, &sDebugTrainers[DIFFICULTY_NORMAL][DEBUG_TRAINER_PLAYER], TRUE, BATTLE_TYPE_TRAINER); + CreateNPCTrainerPartyFromTrainer(gEnemyParty, GetDebugAiTrainer(), FALSE, BATTLE_TYPE_TRAINER); + + gBattleTypeFlags = BATTLE_TYPE_TRAINER; + gDebugAIFlags = sDebugTrainers[DIFFICULTY_NORMAL][DEBUG_TRAINER_AI].aiFlags; + gIsDebugBattle = TRUE; + gBattleEnvironment = BattleSetup_GetEnvironmentId(); + CalculateEnemyPartyCount(); + BattleSetup_StartTrainerBattle_Debug(); + Debug_DestroyMenu_Full(taskId); } -static void DebugAction_Util_CheckEWRAMCounters(u8 taskId) +void CheckEWRAMCounters(struct ScriptContext *ctx) { - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_EWRAMCounters); + ConvertIntToDecimalStringN(gStringVar1, gFollowerSteps, STR_CONV_MODE_LEFT_ALIGN, 5); + ConvertIntToDecimalStringN(gStringVar2, gChainFishingDexNavStreak, STR_CONV_MODE_LEFT_ALIGN, 5); } diff --git a/src/decompress.c b/src/decompress.c index ed935eae1688..d0868536ea46 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -2,20 +2,175 @@ #include "malloc.h" #include "data.h" #include "decompress.h" +#include "decompress_error_handler.h" #include "pokemon.h" #include "pokemon_sprite_visualizer.h" #include "text.h" #include "menu.h" -void LZDecompressWram(const u32 *src, void *dest) -{ - LZ77UnCompWram(src, dest); -} +// === WARNING === WARNING === WARNING === +// === No user serviceable code before === +// === the SpecialPokePic function, do === +// === not modify code unless magician === +// === WARNING === WARNING === WARNING === -void LZDecompressVram(const u32 *src, void *dest) -{ - LZ77UnCompVram(src, dest); -} +static void SmolDecompressData(const struct SmolHeader *header, const u32 *data, void *dest); +static void SmolDecompressTilemap(const struct SmolTilemapHeader *header, const u32 *data, u16 *dest); + +static bool32 isModeLoEncoded(enum CompressionMode mode); +static bool32 isModeSymEncoded(enum CompressionMode mode); +static bool32 isModeSymDelta(enum CompressionMode mode); + + +#define TABLE_READ_K(tableVal)((tableVal & 7)) +#define TABLE_READ_SYMBOL(tableVal)((tableVal & 0xFF) >> 3) +#define TABLE_READ_Y(tableVal)((tableVal >> 8) & 0xFF) +#define TABLE_READ_MASK(tableVal)((tableVal >> 16)) + +/* +Layout is the following: +u32 kVal:3; +u32 symbol:5; // Set in BuildDecompressionTable +u32 yVal:8; +u32 mask:8; +*/ + +#define SET_TABLE_ENTRY(k, y, mask)(((k) & 7) | ((y) << 8) | ((mask) << 16)) + +static IWRAM_DATA u32 sWorkingYkTable[TANS_TABLE_SIZE] = {0}; + +// Helper struct to build the tANS decode tables without having to do calculations at run-time +// Mask Table is 0, 1, 3, 7, 15, 31, 63. +static const u32 sYkTemplate[2*TANS_TABLE_SIZE] = { + [0] = 0, + [1] = SET_TABLE_ENTRY(6, (1 << 6) - 64, 63), + [2] = SET_TABLE_ENTRY(5, (2 << 5) - 64, 31), + [3] = SET_TABLE_ENTRY(5, (3 << 5) - 64, 31), + [4] = SET_TABLE_ENTRY(4, (4 << 4) - 64, 15), + [5] = SET_TABLE_ENTRY(4, (5 << 4) - 64, 15), + [6] = SET_TABLE_ENTRY(4, (6 << 4) - 64, 15), + [7] = SET_TABLE_ENTRY(4, (7 << 4) - 64, 15), + [8] = SET_TABLE_ENTRY(3, (8 << 3) - 64, 7), + [9] = SET_TABLE_ENTRY(3, (9 << 3) - 64, 7), + [10] = SET_TABLE_ENTRY(3, (10 << 3) - 64, 7), + [11] = SET_TABLE_ENTRY(3, (11 << 3) - 64, 7), + [12] = SET_TABLE_ENTRY(3, (12 << 3) - 64, 7), + [13] = SET_TABLE_ENTRY(3, (13 << 3) - 64, 7), + [14] = SET_TABLE_ENTRY(3, (14 << 3) - 64, 7), + [15] = SET_TABLE_ENTRY(3, (15 << 3) - 64, 7), + [16] = SET_TABLE_ENTRY(2, (16 << 2) - 64, 3), + [17] = SET_TABLE_ENTRY(2, (17 << 2) - 64, 3), + [18] = SET_TABLE_ENTRY(2, (18 << 2) - 64, 3), + [19] = SET_TABLE_ENTRY(2, (19 << 2) - 64, 3), + [20] = SET_TABLE_ENTRY(2, (20 << 2) - 64, 3), + [21] = SET_TABLE_ENTRY(2, (21 << 2) - 64, 3), + [22] = SET_TABLE_ENTRY(2, (22 << 2) - 64, 3), + [23] = SET_TABLE_ENTRY(2, (23 << 2) - 64, 3), + [24] = SET_TABLE_ENTRY(2, (24 << 2) - 64, 3), + [25] = SET_TABLE_ENTRY(2, (25 << 2) - 64, 3), + [26] = SET_TABLE_ENTRY(2, (26 << 2) - 64, 3), + [27] = SET_TABLE_ENTRY(2, (27 << 2) - 64, 3), + [28] = SET_TABLE_ENTRY(2, (28 << 2) - 64, 3), + [29] = SET_TABLE_ENTRY(2, (29 << 2) - 64, 3), + [30] = SET_TABLE_ENTRY(2, (30 << 2) - 64, 3), + [31] = SET_TABLE_ENTRY(2, (31 << 2) - 64, 3), + [32] = SET_TABLE_ENTRY(1, (32 << 1) - 64, 1), + [33] = SET_TABLE_ENTRY(1, (33 << 1) - 64, 1), + [34] = SET_TABLE_ENTRY(1, (34 << 1) - 64, 1), + [35] = SET_TABLE_ENTRY(1, (35 << 1) - 64, 1), + [36] = SET_TABLE_ENTRY(1, (36 << 1) - 64, 1), + [37] = SET_TABLE_ENTRY(1, (37 << 1) - 64, 1), + [38] = SET_TABLE_ENTRY(1, (38 << 1) - 64, 1), + [39] = SET_TABLE_ENTRY(1, (39 << 1) - 64, 1), + [40] = SET_TABLE_ENTRY(1, (40 << 1) - 64, 1), + [41] = SET_TABLE_ENTRY(1, (41 << 1) - 64, 1), + [42] = SET_TABLE_ENTRY(1, (42 << 1) - 64, 1), + [43] = SET_TABLE_ENTRY(1, (43 << 1) - 64, 1), + [44] = SET_TABLE_ENTRY(1, (44 << 1) - 64, 1), + [45] = SET_TABLE_ENTRY(1, (45 << 1) - 64, 1), + [46] = SET_TABLE_ENTRY(1, (46 << 1) - 64, 1), + [47] = SET_TABLE_ENTRY(1, (47 << 1) - 64, 1), + [48] = SET_TABLE_ENTRY(1, (48 << 1) - 64, 1), + [49] = SET_TABLE_ENTRY(1, (49 << 1) - 64, 1), + [50] = SET_TABLE_ENTRY(1, (50 << 1) - 64, 1), + [51] = SET_TABLE_ENTRY(1, (51 << 1) - 64, 1), + [52] = SET_TABLE_ENTRY(1, (52 << 1) - 64, 1), + [53] = SET_TABLE_ENTRY(1, (53 << 1) - 64, 1), + [54] = SET_TABLE_ENTRY(1, (54 << 1) - 64, 1), + [55] = SET_TABLE_ENTRY(1, (55 << 1) - 64, 1), + [56] = SET_TABLE_ENTRY(1, (56 << 1) - 64, 1), + [57] = SET_TABLE_ENTRY(1, (57 << 1) - 64, 1), + [58] = SET_TABLE_ENTRY(1, (58 << 1) - 64, 1), + [59] = SET_TABLE_ENTRY(1, (59 << 1) - 64, 1), + [60] = SET_TABLE_ENTRY(1, (60 << 1) - 64, 1), + [61] = SET_TABLE_ENTRY(1, (61 << 1) - 64, 1), + [62] = SET_TABLE_ENTRY(1, (62 << 1) - 64, 1), + [63] = SET_TABLE_ENTRY(1, (63 << 1) - 64, 1), + [64] = SET_TABLE_ENTRY(0, 64 - 64, 0), + [65] = SET_TABLE_ENTRY(0, 65 - 64, 0), + [66] = SET_TABLE_ENTRY(0, 66 - 64, 0), + [67] = SET_TABLE_ENTRY(0, 67 - 64, 0), + [68] = SET_TABLE_ENTRY(0, 68 - 64, 0), + [69] = SET_TABLE_ENTRY(0, 69 - 64, 0), + [70] = SET_TABLE_ENTRY(0, 70 - 64, 0), + [71] = SET_TABLE_ENTRY(0, 71 - 64, 0), + [72] = SET_TABLE_ENTRY(0, 72 - 64, 0), + [73] = SET_TABLE_ENTRY(0, 73 - 64, 0), + [74] = SET_TABLE_ENTRY(0, 74 - 64, 0), + [75] = SET_TABLE_ENTRY(0, 75 - 64, 0), + [76] = SET_TABLE_ENTRY(0, 76 - 64, 0), + [77] = SET_TABLE_ENTRY(0, 77 - 64, 0), + [78] = SET_TABLE_ENTRY(0, 78 - 64, 0), + [79] = SET_TABLE_ENTRY(0, 79 - 64, 0), + [80] = SET_TABLE_ENTRY(0, 80 - 64, 0), + [81] = SET_TABLE_ENTRY(0, 81 - 64, 0), + [82] = SET_TABLE_ENTRY(0, 82 - 64, 0), + [83] = SET_TABLE_ENTRY(0, 83 - 64, 0), + [84] = SET_TABLE_ENTRY(0, 84 - 64, 0), + [85] = SET_TABLE_ENTRY(0, 85 - 64, 0), + [86] = SET_TABLE_ENTRY(0, 86 - 64, 0), + [87] = SET_TABLE_ENTRY(0, 87 - 64, 0), + [88] = SET_TABLE_ENTRY(0, 88 - 64, 0), + [89] = SET_TABLE_ENTRY(0, 89 - 64, 0), + [90] = SET_TABLE_ENTRY(0, 90 - 64, 0), + [91] = SET_TABLE_ENTRY(0, 91 - 64, 0), + [92] = SET_TABLE_ENTRY(0, 92 - 64, 0), + [93] = SET_TABLE_ENTRY(0, 93 - 64, 0), + [94] = SET_TABLE_ENTRY(0, 94 - 64, 0), + [95] = SET_TABLE_ENTRY(0, 95 - 64, 0), + [96] = SET_TABLE_ENTRY(0, 96 - 64, 0), + [97] = SET_TABLE_ENTRY(0, 97 - 64, 0), + [98] = SET_TABLE_ENTRY(0, 98 - 64, 0), + [99] = SET_TABLE_ENTRY(0, 99 - 64, 0), + [100] = SET_TABLE_ENTRY(0, 100 - 64, 0), + [101] = SET_TABLE_ENTRY(0, 101 - 64, 0), + [102] = SET_TABLE_ENTRY(0, 102 - 64, 0), + [103] = SET_TABLE_ENTRY(0, 103 - 64, 0), + [104] = SET_TABLE_ENTRY(0, 104 - 64, 0), + [105] = SET_TABLE_ENTRY(0, 105 - 64, 0), + [106] = SET_TABLE_ENTRY(0, 106 - 64, 0), + [107] = SET_TABLE_ENTRY(0, 107 - 64, 0), + [108] = SET_TABLE_ENTRY(0, 108 - 64, 0), + [109] = SET_TABLE_ENTRY(0, 109 - 64, 0), + [110] = SET_TABLE_ENTRY(0, 110 - 64, 0), + [111] = SET_TABLE_ENTRY(0, 111 - 64, 0), + [112] = SET_TABLE_ENTRY(0, 112 - 64, 0), + [113] = SET_TABLE_ENTRY(0, 113 - 64, 0), + [114] = SET_TABLE_ENTRY(0, 114 - 64, 0), + [115] = SET_TABLE_ENTRY(0, 115 - 64, 0), + [116] = SET_TABLE_ENTRY(0, 116 - 64, 0), + [117] = SET_TABLE_ENTRY(0, 117 - 64, 0), + [118] = SET_TABLE_ENTRY(0, 118 - 64, 0), + [119] = SET_TABLE_ENTRY(0, 119 - 64, 0), + [120] = SET_TABLE_ENTRY(0, 120 - 64, 0), + [121] = SET_TABLE_ENTRY(0, 121 - 64, 0), + [122] = SET_TABLE_ENTRY(0, 122 - 64, 0), + [123] = SET_TABLE_ENTRY(0, 123 - 64, 0), + [124] = SET_TABLE_ENTRY(0, 124 - 64, 0), + [125] = SET_TABLE_ENTRY(0, 125 - 64, 0), + [126] = SET_TABLE_ENTRY(0, 126 - 64, 0), + [127] = SET_TABLE_ENTRY(0, 127 - 64, 0), +}; // Checks if `ptr` is likely LZ77 data // Checks word-alignment, min/max size, and header byte @@ -60,7 +215,7 @@ u32 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src) u32 LoadCompressedSpriteSheetOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer) { - LZDecompressWram(src->data, buffer); + DecompressDataWithHeaderWram(src->data, buffer); return DoLoadCompressedSpriteSheet(src, buffer); } @@ -72,23 +227,26 @@ u32 LoadCompressedSpriteSheetByTemplate(const struct SpriteTemplate *template, s u32 size; // Check for LZ77 header and read uncompressed size, or fallback if not compressed (zero size) - if ((size = IsLZ77Data(template->images->data, TILE_SIZE_4BPP, MAX_DECOMPRESSION_BUFFER_SIZE)) == 0) - return LoadSpriteSheetByTemplate(template, 0, offset); + if (IsCompressedData(template->images->data)) + { + size = GetDecompressedDataSize(template->images->data); + void *buffer = malloc_and_decompress(template->images->data, NULL); + myImage.data = buffer; + myImage.size = size + offset; + myTemplate.images = &myImage; + myTemplate.tileTag = template->tileTag; - void *buffer = malloc_and_decompress(template->images->data, NULL); - myImage.data = buffer; - myImage.size = size + offset; - myTemplate.images = &myImage; - myTemplate.tileTag = template->tileTag; + u32 ret = LoadSpriteSheetByTemplate(&myTemplate, 0, offset); + Free(buffer); + return ret; + } + return LoadSpriteSheetByTemplate(template, 0, offset); - u32 ret = LoadSpriteSheetByTemplate(&myTemplate, 0, offset); - Free(buffer); - return ret; } void DecompressPicFromTable(const struct CompressedSpriteSheet *src, void *buffer) { - LZ77UnCompWram(src->data, buffer); + DecompressDataWithHeaderWram(src->data, buffer); } void HandleLoadSpecialPokePic(bool32 isFrontPic, void *dest, s32 species, u32 personality) @@ -96,6 +254,876 @@ void HandleLoadSpecialPokePic(bool32 isFrontPic, void *dest, s32 species, u32 pe LoadSpecialPokePic(dest, species, personality, isFrontPic); } +// Wrapper function for all decompression calls using formats with headers +// calls the correct decompression function depending on the header +// VRAM version +void DecompressDataWithHeaderVram(const u32 *src, void *dest) +{ + union CompressionHeader header; + CpuCopy32(src, &header, 8); + switch (header.smol.mode) + { + case MODE_LZ77: + LZ77UnCompVram(src, dest); + break; + case IS_TILEMAP: + SmolDecompressTilemap(&header.smolTilemap, &src[2], dest); + break; + case BASE_ONLY: + case ENCODE_SYMS: + case ENCODE_DELTA_SYMS: + case ENCODE_LO: + case ENCODE_BOTH: + case ENCODE_BOTH_DELTA_SYMS: + SmolDecompressData(&header.smol, &src[2], dest); + break; + default: + DecompressionError(src, HEADER_ERROR); + } +} + +// Wrapper function for all decompression calls using formats with headers +// calls the correct decompression function depending on the header +// WRAM version +void DecompressDataWithHeaderWram(const u32 *src, void *dest) +{ + union CompressionHeader header; + CpuCopy32(src, &header, 8); + switch (header.smol.mode) + { + case MODE_LZ77: + FastLZ77UnCompWram(src, dest); + break; + case IS_TILEMAP: + SmolDecompressTilemap(&header.smolTilemap, &src[2], dest); + break; + case BASE_ONLY: + case ENCODE_SYMS: + case ENCODE_DELTA_SYMS: + case ENCODE_LO: + case ENCODE_BOTH: + case ENCODE_BOTH_DELTA_SYMS: + SmolDecompressData(&header.smol, &src[2], dest); + break; + default: + DecompressionError(src, HEADER_ERROR); + } +} + +#define REP0(X) +#define REP1(X) X +#define REP2(X) REP1(X) X +#define REP3(X) REP2(X) X +#define REP4(X) REP3(X) X +#define REP5(X) REP4(X) X +#define REP6(X) REP5(X) X +#define REP7(X) REP6(X) X +#define REP8(X) REP7(X) X +#define REP9(X) REP8(X) X +#define REP10(X) REP9(X) X + +#define REP(TENS,ONES,X) \ + REP##TENS(REP10(X)) \ + REP##ONES(X) + +// Unpack packed tANS encoded data symbol frequences into their individual parts +static __attribute__((always_inline)) inline void UnpackFrequenciesLoop(const u32 *packedFreqs, u16 *freqs, u32 i) +{ + // Loop unpack + freqs[i*5 + 0] = (packedFreqs[i] >> (6*0)) & PACKED_FREQ_MASK; + freqs[i*5 + 1] = (packedFreqs[i] >> (6*1)) & PACKED_FREQ_MASK; + freqs[i*5 + 2] = (packedFreqs[i] >> (6*2)) & PACKED_FREQ_MASK; + freqs[i*5 + 3] = (packedFreqs[i] >> (6*3)) & PACKED_FREQ_MASK; + freqs[i*5 + 4] = (packedFreqs[i] >> (6*4)) & PACKED_FREQ_MASK; + + freqs[15] += (packedFreqs[i] & PARTIAL_FREQ_MASK) >> (30 - 2*i); +} + +static __attribute__((always_inline)) inline void UnpackFrequencies(const u32 *packedFreqs, u16 *freqs) +{ + freqs[15] = 0; + + UnpackFrequenciesLoop(packedFreqs, freqs, 0); + UnpackFrequenciesLoop(packedFreqs, freqs, 1); + UnpackFrequenciesLoop(packedFreqs, freqs, 2); +} + +// This is a small function, so we can store it in IWRAM for improved performance and don't need to worry about it taking too much precious IWRAM space. +ARM_FUNC __attribute__((section(".iwram.code"))) __attribute__((noinline)) static void CopyTable(u32 *dst, const u32 *src, u32 size, u32 orrVal) +{ + for (u32 i = 0; i < size; i++) { + *dst++ = (*src++) | orrVal; + } +} + +// Build the tANS decompression table from the specified frequencies and the precomputed helper struct +__attribute__((optimize("-O3"))) static void BuildDecompressionTable(const u32 *packedFreqs, u32 *table) +{ + u16 freqs[16]; + + UnpackFrequencies(packedFreqs, freqs); + + for (u8 i = 0; i < 16; i++) + { + const u32 *srcTemplate; + + switch (freqs[i]) { + case 0: + break; + default: { + srcTemplate = &sYkTemplate[freqs[i]]; + CopyTable(table, srcTemplate, freqs[i], i << 3); + table += freqs[i]; + srcTemplate += freqs[i]; + break; + } + case 1: + srcTemplate = &sYkTemplate[1]; + REP(0, 1, *table++ = *srcTemplate++ | (i << 3);) + break; + case 2: + srcTemplate = &sYkTemplate[2]; + REP(0, 2, *table++ = (*srcTemplate++) | (i << 3);) + break; + case 3: + srcTemplate = &sYkTemplate[3]; + REP(0, 3, *table++ = (*srcTemplate++) | (i << 3);) + break; + } + } +} + +static IWRAM_DATA u8 sBitIndex = 0; +static IWRAM_DATA const u32 *sDataPtr = 0; +static IWRAM_DATA u32 sCurrState = 0; + +// 33 because of FastUnsafeCopy32, we divide by 4 because the buffer is an array of u32 +#define FUNC_BUFFER_SIZE(funcStart, funcEnd)(((u32)(funcEnd) - (u32)(funcStart) + 33) / 4) + +extern void FastUnsafeCopy32(void *, const void *, u32 size); + +// Dark Egg magic +static inline void CopyFuncToIwram(void *funcBuffer, const void *funcStartAddress, const void *funcEndAdress) +{ + FastUnsafeCopy32(funcBuffer, funcStartAddress, funcEndAdress - funcStartAddress); +} + +// The reason for macros and unrolling the loops stems from the following: +// currK can be max 6, meaning in the worst case scenario it takes minimum 4 loop iterations, where we don't need to check if bitIndex is >= 32, because it's mathematically impossible for it to be. +// This optimization matters for large images, because we don't waste a cycle on comparing operations. If the loops run over 5000 times in total, these can be costly. + +#define LOT_LOOP_MAIN(nibble) \ +{ \ + u32 ykVals = ykTable[sCurrState]; \ + symbol |= TABLE_READ_SYMBOL(ykVals) << (nibble*4); \ + currK = TABLE_READ_K(ykVals); \ + sCurrState = TABLE_READ_Y(ykVals); \ + sCurrState += (currBits >> bitIndex) & TABLE_READ_MASK(ykVals); \ + bitIndex += currK; \ +} + +// The same for all the loops +#define LOOP_BITADVANCE() \ +{ \ + currBits = *data++; \ + bitIndex -= 32; \ + if (bitIndex != 0) \ + { \ + sCurrState += (currBits & ((1u << bitIndex) - 1)) << (currK - bitIndex); \ + } \ +} +// Inner loop of tANS decoding for Lengths and Offset data for decompression instructions, uses u8 data sizes +// Basic process for decoding a tANS encoded value is to read the current symbol from the decoding table, then calculate the next state +// from the y and k values for the current state and add the value read from the next k bits in the bitstream +ARM_FUNC __attribute__((flatten, noinline, no_reorder)) __attribute__((optimize("-O3"))) static void DecodeLOtANSLoop(const u32 *data, u32 *ykTable, u8 *resultVec, u8 *resultVecEnd) +{ + u32 currBits = *data++; + u32 bitIndex = sBitIndex; + u16 *resultVec_u16 = (u16 *) resultVec; + + do + { + u32 currK; + u32 symbol = 0; + + { + LOT_LOOP_MAIN(0); + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + LOT_LOOP_MAIN(1); + LOT_LOOP_MAIN(2); + LOT_LOOP_MAIN(3); + + goto LOOP_STORE; + } + } + { + LOT_LOOP_MAIN(1); + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + LOT_LOOP_MAIN(2); + LOT_LOOP_MAIN(3); + + goto LOOP_STORE; + } + } + { + LOT_LOOP_MAIN(2); + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + LOT_LOOP_MAIN(3); + + goto LOOP_STORE; + } + } + { + LOT_LOOP_MAIN(3); + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + *resultVec_u16++ = symbol; + if (resultVec_u16 >= (u16 *) resultVecEnd) + break; + + symbol = 0; + + LOT_LOOP_MAIN(0); + LOT_LOOP_MAIN(1); + LOT_LOOP_MAIN(2); + LOT_LOOP_MAIN(3); + } + } + +LOOP_STORE: + *resultVec_u16++ = symbol; + } while (resultVec_u16 < (u16 *) resultVecEnd); + + sBitIndex = bitIndex; + sDataPtr = data - 1; +} + +// Dark Egg magic +ARM_FUNC __attribute__((no_reorder)) static void SwitchToArmCallLOtANS(const u32 *data, u32 *ykTable, void *resultVec, void *resultVecEnd, void (*decodeFunction)(const u32 *data, u32 *ykTable, void *resultVec, void *resultVecEnd)) +{ + decodeFunction(data, ykTable, resultVec, resultVecEnd); +} + +// Function that decodes tANS encoded LO data, resulting data is u8 values +static void DecodeLOtANS(const u32 *data, const u32 *pFreqs, u8 *resultVec, u32 count) +{ + BuildDecompressionTable(pFreqs, sWorkingYkTable); + + // We want to store in packs of 2, so count needs to be divisible by 2 + u32 remainingCount = count % 2; + + u32 funcBuffer[FUNC_BUFFER_SIZE(DecodeLOtANSLoop, SwitchToArmCallLOtANS)]; + + CopyFuncToIwram(funcBuffer, DecodeLOtANSLoop, SwitchToArmCallLOtANS); + SwitchToArmCallLOtANS(data, sWorkingYkTable, resultVec, &resultVec[count - remainingCount], (void *) funcBuffer); + + if (remainingCount) + { + u32 currBits = *sDataPtr; + u32 symbol = 0; + for (u32 currNibble = 0; currNibble < 2; currNibble++) + { + u32 ykVals = sWorkingYkTable[sCurrState]; + symbol |= TABLE_READ_SYMBOL(ykVals) << (currNibble*4); + u32 currK = TABLE_READ_K(ykVals); + sCurrState = TABLE_READ_Y(ykVals); + sCurrState += (currBits >> sBitIndex) & TABLE_READ_MASK(ykVals); + sBitIndex += currK; + if (sBitIndex >= 32) + { + currBits = *(++sDataPtr); + sBitIndex -= 32; + if (sBitIndex != 0) + { + sCurrState += (currBits & ((1u << sBitIndex) - 1)) << (currK - sBitIndex); + } + } + } + resultVec[count - remainingCount] = symbol; + } +} + +// The reason this function is UNUSED, because it's currently exactly the same as `DecodeLOtANSLoop`(as it was optimized out for halfwords and not bytes as it's technically designed). +// If ever DecodeLOtANSLoop or DecodeSymtANSLoop were to change make sure to uncomment the 'CopyFuncToIwram' call. + +ARM_FUNC __attribute__((flatten, noinline, no_reorder)) __attribute__((optimize("-O3"))) UNUSED static void DecodeSymtANSLoop(const u32 *data, u32 *ykTable, u16 *resultVec, u16 *resultVecEnd) +{ + u32 currBits = *data++; + u32 bitIndex = sBitIndex; + + do + { + u32 symbol = 0; + for (u32 currNibble = 0; currNibble < 4; currNibble++) + { + u32 ykVals = ykTable[sCurrState]; + symbol |= TABLE_READ_SYMBOL(ykVals) << (currNibble*4); + u32 currK = TABLE_READ_K(ykVals); + sCurrState = TABLE_READ_Y(ykVals); + sCurrState += (currBits >> bitIndex) & TABLE_READ_MASK(ykVals); + bitIndex += currK; + if (bitIndex >= 32) + { + currBits = *data++; + bitIndex -= 32; + if (bitIndex != 0) + { + sCurrState += (currBits & ((1u << bitIndex) - 1)) << (currK - bitIndex); + } + } + } + *resultVec++ = symbol; + } while (resultVec < resultVecEnd); + + sBitIndex = bitIndex; + sDataPtr = data - 1; +} + +ARM_FUNC __attribute__((no_reorder)) static void SwitchToArmCallDecodeSymtANS(const u32 *data, u32 *ykTable, u16 *resultVec, u16 *resultVecEnd, void (*decodeFunction)(const u32 *data, u32 *ykTable, u16 *resultVec, u16 *resultVecEnd)) +{ + decodeFunction(data, ykTable, resultVec, resultVecEnd); +} + +static void DecodeSymtANS(const u32 *data, const u32 *pFreqs, u16 *resultVec, u32 count) +{ + BuildDecompressionTable(pFreqs, sWorkingYkTable); + + u32 funcBuffer[FUNC_BUFFER_SIZE(DecodeLOtANSLoop, SwitchToArmCallLOtANS)]; + // CopyFuncToIwram(funcBuffer, DecodeSymtANSLoop, SwitchToArmCallDecodeSymtANS); + CopyFuncToIwram(funcBuffer, DecodeLOtANSLoop, SwitchToArmCallLOtANS); + SwitchToArmCallDecodeSymtANS(data, sWorkingYkTable, resultVec, &resultVec[count], (void *) funcBuffer); +} + +#define ANS_LOOP_MAIN(nibble) \ +{ \ + u32 ykVals = ykTable[sCurrState]; \ + currK = TABLE_READ_K(ykVals); \ + currSymbol = (currSymbol + TABLE_READ_SYMBOL(ykVals)) & 0xf; \ + symbol |= currSymbol << (nibble*4); \ + sCurrState = TABLE_READ_Y(ykVals); \ + sCurrState += ((currBits >> bitIndex) & TABLE_READ_MASK(ykVals)); \ + bitIndex += currK; \ +} + +// Inner loop of tANS decoding for delta encoded symbol data, uses u16 data size +// Basic process for decoding a tANS encoded value is to read the current symbol from the decoding table, then calculate the next state +// from the y and k values for the current state and add the value read from the next k bits in the bitstream +ARM_FUNC __attribute__((flatten, noinline, no_reorder)) __attribute__((optimize("-O3"))) u32 DecodeSymDeltatANSLoop(const u32 *data, u32 *ykTable, u16 *resultVec, u16 *resultVecEnd) +{ + u32 currBits = *data++; + u32 currSymbol = 0; + u32 bitIndex = sBitIndex; + u32 * resultVec_32 = (u32*)(resultVec); // Since we're doing 2 symbols at one time we store as word which is faster than storing two halfwords. + + do + { + u32 symbol = 0; + u32 currK; + + { + ANS_LOOP_MAIN(0); + + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + ANS_LOOP_MAIN(1); + ANS_LOOP_MAIN(2); + ANS_LOOP_MAIN(3); + ANS_LOOP_MAIN(4); + + goto NIBBLE_5; + } + } + { + ANS_LOOP_MAIN(1); + + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + ANS_LOOP_MAIN(2); + ANS_LOOP_MAIN(3); + ANS_LOOP_MAIN(4); + ANS_LOOP_MAIN(5); + + goto NIBBLE_6; + } + } + { + ANS_LOOP_MAIN(2); + + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + ANS_LOOP_MAIN(3); + ANS_LOOP_MAIN(4); + ANS_LOOP_MAIN(5); + ANS_LOOP_MAIN(6); + + goto NIBBLE_7; + } + } + { + ANS_LOOP_MAIN(3); + + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + ANS_LOOP_MAIN(4); + ANS_LOOP_MAIN(5); + ANS_LOOP_MAIN(6); + ANS_LOOP_MAIN(7); + + goto LOOP_STORE; + } + } + NIBBLE_4: + { + ANS_LOOP_MAIN(4); + + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + ANS_LOOP_MAIN(5); + ANS_LOOP_MAIN(6); + ANS_LOOP_MAIN(7); + + goto LOOP_STORE; + } + } + NIBBLE_5: + { + ANS_LOOP_MAIN(5); + + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + ANS_LOOP_MAIN(6); + ANS_LOOP_MAIN(7); + + goto LOOP_STORE; + } + } + NIBBLE_6: + { + ANS_LOOP_MAIN(6); + + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + ANS_LOOP_MAIN(7); + + goto LOOP_STORE; + } + } + NIBBLE_7: + { + ANS_LOOP_MAIN(7); + + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + *resultVec_32++ = (symbol); + if (resultVec_32 >= (u32 *) resultVecEnd) + break; + + symbol = 0; + + ANS_LOOP_MAIN(0); + ANS_LOOP_MAIN(1); + ANS_LOOP_MAIN(2); + ANS_LOOP_MAIN(3); + + goto NIBBLE_4; + } + } + + LOOP_STORE: + *resultVec_32++ = (symbol); + + } while (resultVec_32 < (u32 *) resultVecEnd); + sBitIndex = bitIndex; + sDataPtr = data - 1; + return currSymbol; +} + +// Dark Egg magic +ARM_FUNC __attribute__((no_reorder)) static u32 SwitchToArmCallSymDeltaANS(const u32 *data, u32 *ykTable, u16 *resultVec, u16 *resultVecEnd, u32 (*decodeFunction)(const u32 *data, u32 *ykTable, u16 *resultVec, u16 *resultVecEnd)) +{ + return decodeFunction(data, ykTable, resultVec, resultVecEnd); +} + +static void DecodeSymDeltatANS(const u32 *data, const u32 *pFreqs, u16 *resultVec, u32 count) +{ + BuildDecompressionTable(pFreqs, sWorkingYkTable); + + // We want to store in packs of 2, so count needs to be divisible by 2 + u32 remainingCount = count % 2; + + u32 funcBuffer[FUNC_BUFFER_SIZE(DecodeSymDeltatANSLoop, SwitchToArmCallSymDeltaANS)]; + CopyFuncToIwram(funcBuffer, DecodeSymDeltatANSLoop, SwitchToArmCallSymDeltaANS); + u32 currSymbol = SwitchToArmCallSymDeltaANS(data, sWorkingYkTable, resultVec, &resultVec[count - remainingCount], (void *) funcBuffer); + + if (remainingCount) + { + u32 currK; + u32 *ykTable = sWorkingYkTable; + const u32 *data = sDataPtr; + u32 currBits = *data++; + u32 bitIndex = sBitIndex; + u32 symbol = 0; + + ANS_LOOP_MAIN(0); + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + ANS_LOOP_MAIN(1); + ANS_LOOP_MAIN(2); + ANS_LOOP_MAIN(3); + + goto LOOP_STORE; + } + + ANS_LOOP_MAIN(1); + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + ANS_LOOP_MAIN(2); + ANS_LOOP_MAIN(3); + + goto LOOP_STORE; + } + + ANS_LOOP_MAIN(2); + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + ANS_LOOP_MAIN(3); + + goto LOOP_STORE; + } + + ANS_LOOP_MAIN(3); + + LOOP_STORE: + resultVec[count - remainingCount] = symbol; + sBitIndex = bitIndex; + } +} + +static __attribute__((always_inline)) inline void Fill16(u16 value, void *_dst, u32 size) +{ + u16 *dst = _dst; + for (u32 i = 0; i < size; i++) { + dst[i] = value; + } +} + +static __attribute__((always_inline)) inline void Copy16(const void *_src, void *_dst, u32 size) +{ + const u16 *src = _src; + u16 *dst = _dst; + for (u32 i = 0; i < size; i++) { + dst[i] = src[i]; + } +} + +// Function to decode the instructions into the actual decompressed data +// Basic process: +// Read length from the loVec, 1 or 2 bytes as indicated by the last bit in the first byte +// Read offset from the loVec, 1 or 2 bytes as indicated by the last bit in the first byte +// If length is not 0 and offset is not 1: +// Insert the current value from the Symbol vector into current result position and advance symbol vector by 1 +// Copy values from values back in the result vector +// If length is not 0 and offser is 1: +// Insert the current value from the Symbol vector into current result position times, then advance symbol vector by 1 +// If length is 0: +// Insert number of symbols from the symbol vector into the result vector and advance the symbol vector position by +ARM_FUNC __attribute__((flatten, noinline, no_reorder)) __attribute__((optimize("-O3"))) static void DecodeInstructions(u32 headerLoSize, const u8 *loVec, const u16 *symVec, u16 *dest) +{ + const u8 *loVecEnd = loVec + headerLoSize; + do + { + u32 currOffset, currLength; + + if (loVec[0] & CONTINUE_BIT) + { + currLength = (loVec[0] & FIRST_LO_MASK) | (loVec[1] << 7); + currOffset = loVec[2] & FIRST_LO_MASK; + if (loVec[2] & CONTINUE_BIT) + { + currOffset |= loVec[3] << 7; + loVec += 4; + } + else + { + loVec += 3; + } + } + else + { + currLength = loVec[0] & FIRST_LO_MASK; + currOffset = loVec[1] & FIRST_LO_MASK; + + if (loVec[1] & CONTINUE_BIT) + { + currOffset |= (loVec[2] << 7); + loVec += 3; + } + else + { + loVec += 2; + } + } + + if (currLength != 0) + { + u16 symVecVal = *symVec; + *dest++ = *symVec++; + if (currOffset == 1) + { + Fill16(symVecVal, dest, currLength); + dest += currLength; + } + else + { + // Copy16 is slower in this case. + u16 *from = dest - currOffset; + u16 *to = dest + currLength; + do { + *dest++ = *from++; + } while (dest != to); + } + } + else + { + Copy16(symVec, dest, currOffset); + dest += currOffset; + symVec += currOffset; + } + } while (loVec < loVecEnd); +} + +// Dark Egg magic +ARM_FUNC __attribute__((no_reorder)) static void SwitchToArmCallDecodeInstructions(u32 headerLoSize, const u8 *loVec, const u16 *symVec, void *dest, void (*decodeFunction)(u32 headerLoSize, const u8 *loVec, const u16 *symVec, void *dest)) +{ + decodeFunction(headerLoSize, loVec, symVec, dest); +} + +// Dark Egg magic +static void DecodeInstructionsIwram(u32 headerLoSize, const u8 *loVec, const u16 *symVec, void *dest) +{ + u32 funcBuffer[FUNC_BUFFER_SIZE(DecodeInstructions, SwitchToArmCallDecodeInstructions)]; + + CopyFuncToIwram(funcBuffer, DecodeInstructions, SwitchToArmCallDecodeInstructions); + SwitchToArmCallDecodeInstructions(headerLoSize, loVec, symVec, dest, (void *) funcBuffer); +} + +// Entrance point for smol compressed data +static void SmolDecompressData(const struct SmolHeader *header, const u32 *data, void *dest) +{ + // This is apparently needed due to Game Freak sending bullshit down the decompression pipeline + if (header->loSize == 0 || header->symSize == 0) + return; + const u8 *leftoverPos = (u8 *)data; + + sCurrState = header->initialState; + + u32 headerLoSize = header->loSize; + u32 headerSymSize = header->symSize; + + const u32 *pLoFreqs = NULL; + const u32 *pSymFreqs = NULL; + + // Use different decoding flows depending on which mode the data is compressed with + switch (header->mode) + { + case BASE_ONLY: // Used by .fastSmol, there is no encoding there, so we can quickly decode all the instructions and quit. + DecodeInstructionsIwram(headerLoSize, leftoverPos + headerSymSize*2, (void *) leftoverPos, dest); + return; + case ENCODE_LO: + pLoFreqs = &data[0]; + sDataPtr = &data[3]; + break; + case ENCODE_DELTA_SYMS: + case ENCODE_SYMS: + pSymFreqs = &data[0]; + sDataPtr = &data[3]; + break; + case ENCODE_BOTH: + case ENCODE_BOTH_DELTA_SYMS: + pLoFreqs = &data[0]; + pSymFreqs = &data[3]; + sDataPtr = &data[6]; + break; + } + + bool32 loEncoded = isModeLoEncoded(header->mode); + bool32 symEncoded = isModeSymEncoded(header->mode); + bool32 symDelta = isModeSymDelta(header->mode); + + // Everything needs to be aligned. + u32 alignedLoSize = header->loSize % 2 == 1 ? headerLoSize + 1 : headerLoSize; + u32 alignedSymSize = header->symSize % 2 == 1 ? headerSymSize + 1 : headerSymSize; + void *memoryAlloced = Alloc((alignedSymSize*2) + alignedLoSize); + u16 *symVec = memoryAlloced; + u8 *loVec = memoryAlloced + alignedSymSize*2; + + sBitIndex = 0; + // Decode tANS encoded LO data, mode 3, 4 and 5 + if (loEncoded) + { + DecodeLOtANS(sDataPtr, pLoFreqs, loVec, headerLoSize); + leftoverPos += 12; + } + // Decode tANS encoded symbol data, mode 1, 2, 4 and 5 + if (symEncoded) + { + // Symbols are delta encoded, mode 2 and 5 + if (symDelta) + DecodeSymDeltatANS(sDataPtr, pSymFreqs, symVec, headerSymSize); + // Symbols are not delta encoded, mode 1 and 4 + else + DecodeSymtANS(sDataPtr, pSymFreqs, symVec, headerSymSize); + leftoverPos += 12; + } + + // If not both of lo and sym data are tANS encoded, data that isn't entropy encoded exists + // This is stored after the 32-bit aligned bitstream + if (loEncoded || symEncoded) + leftoverPos += 4*header->bitstreamSize; + + // Copy the not entropy encoded symbol data to the symbol buffer + // Symbol data is u16 aligned + if (symEncoded == FALSE) + { + symVec = (void *) leftoverPos; + leftoverPos += headerSymSize*2; + } + + // Copy the not entropy encoded lo data to the lo buffer + // Despite the individual lo values being u8 aligned, the entire vector for the u8 values is u16 aligned + if (loEncoded == FALSE) + { + loVec = (void *) leftoverPos; + } + + // Actually decode the final data from loVec and symVec + DecodeInstructionsIwram(headerLoSize, loVec, symVec, dest); + + Free(memoryAlloced); +} + +ARM_FUNC __attribute__((flatten, noinline, no_reorder)) __attribute__((optimize("-O3"))) static void DeltaDecodeTileNumbers(u16 *tileNumbers, u32 arraySize) +{ + u32 prevVal = 0; + u32 reminder = arraySize % 8; + u16 *dst = tileNumbers + (arraySize - reminder); + do + { + prevVal += *tileNumbers; + *tileNumbers++ = prevVal; + + prevVal += *tileNumbers; + *tileNumbers++ = prevVal; + + prevVal += *tileNumbers; + *tileNumbers++ = prevVal; + + prevVal += *tileNumbers; + *tileNumbers++ = prevVal; + + prevVal += *tileNumbers; + *tileNumbers++ = prevVal; + + prevVal += *tileNumbers; + *tileNumbers++ = prevVal; + + prevVal += *tileNumbers; + *tileNumbers++ = prevVal; + + prevVal += *tileNumbers; + *tileNumbers++ = prevVal; + } while (tileNumbers != dst); + + for (u32 i = 0; i < reminder; i++) + { + prevVal += *tileNumbers; + *tileNumbers++ = prevVal; + } +} + +ARM_FUNC __attribute__((no_reorder)) static void SwitchToArmCallDecodeTileNumbers(u16 *tileNumbers, u32 arraySize, void (*decodeFunction)(u16 *tileNumbers, u32 arraySize)) +{ + decodeFunction(tileNumbers, arraySize); +} + +static void SmolDecompressTilemap(const struct SmolTilemapHeader *header, const u32 *data, u16 *dest) +{ + u16 *deltaDest = dest; + u32 loOffset = header->symSize*2 + 2*(header->symSize % 2); + u8 *loVec = (u8 *)data; + loVec = &loVec[loOffset]; + u16 *symVec = (u16 *)data; + + DecodeInstructionsIwram(header->tileNumberSize, loVec, symVec, dest); + u32 arraySize = header->tilemapSize/2; + + u32 funcBuffer[FUNC_BUFFER_SIZE(DeltaDecodeTileNumbers, SwitchToArmCallDecodeTileNumbers)]; + + CopyFuncToIwram(funcBuffer, DeltaDecodeTileNumbers, SwitchToArmCallDecodeTileNumbers); + SwitchToArmCallDecodeTileNumbers(deltaDest, arraySize, (void *) funcBuffer); +} + +// Helper functions for determining modes +static bool32 isModeLoEncoded(enum CompressionMode mode) +{ + if (mode == ENCODE_LO + || mode == ENCODE_BOTH + || mode == ENCODE_BOTH_DELTA_SYMS) + return TRUE; + return FALSE; +} + +static bool32 isModeSymEncoded(enum CompressionMode mode) +{ + if (mode == ENCODE_SYMS + || mode == ENCODE_DELTA_SYMS + || mode == ENCODE_BOTH + || mode == ENCODE_BOTH_DELTA_SYMS) + return TRUE; + return FALSE; +} + +static bool32 isModeSymDelta(enum CompressionMode mode) +{ + if (mode == ENCODE_DELTA_SYMS + || mode == ENCODE_BOTH_DELTA_SYMS) + return TRUE; + return FALSE; +} + void LoadSpecialPokePic(void *dest, s32 species, u32 personality, bool8 isFrontPic) { species = SanitizeSpeciesId(species); @@ -106,25 +1134,25 @@ void LoadSpecialPokePic(void *dest, s32 species, u32 personality, bool8 isFrontP { #if P_GENDER_DIFFERENCES if (gSpeciesInfo[species].frontPicFemale != NULL && IsPersonalityFemale(species, personality)) - LZ77UnCompWram(gSpeciesInfo[species].frontPicFemale, dest); + DecompressDataWithHeaderWram(gSpeciesInfo[species].frontPicFemale, dest); else #endif if (gSpeciesInfo[species].frontPic != NULL) - LZ77UnCompWram(gSpeciesInfo[species].frontPic, dest); + DecompressDataWithHeaderWram(gSpeciesInfo[species].frontPic, dest); else - LZ77UnCompWram(gSpeciesInfo[SPECIES_NONE].frontPic, dest); + DecompressDataWithHeaderWram(gSpeciesInfo[SPECIES_NONE].frontPic, dest); } else { #if P_GENDER_DIFFERENCES if (gSpeciesInfo[species].backPicFemale != NULL && IsPersonalityFemale(species, personality)) - LZ77UnCompWram(gSpeciesInfo[species].backPicFemale, dest); + DecompressDataWithHeaderWram(gSpeciesInfo[species].backPicFemale, dest); else #endif if (gSpeciesInfo[species].backPic != NULL) - LZ77UnCompWram(gSpeciesInfo[species].backPic, dest); + DecompressDataWithHeaderWram(gSpeciesInfo[species].backPic, dest); else - LZ77UnCompWram(gSpeciesInfo[SPECIES_NONE].backPic, dest); + DecompressDataWithHeaderWram(gSpeciesInfo[SPECIES_NONE].backPic, dest); } if (species == SPECIES_SPINDA && isFrontPic) @@ -134,9 +1162,9 @@ void LoadSpecialPokePic(void *dest, s32 species, u32 personality, bool8 isFrontP } } -void Unused_LZDecompressWramIndirect(const void **src, void *dest) +void Unused_DecompressDataWithHeaderWramIndirect(const void **src, void *dest) { - LZ77UnCompWram(*src, dest); + DecompressDataWithHeaderWram(*src, dest); } static void UNUSED StitchObjectsOn8x8Canvas(s32 object_size, s32 object_count, u8 *src_tiles, u8 *dest_tiles) @@ -290,8 +1318,45 @@ static void UNUSED StitchObjectsOn8x8Canvas(s32 object_size, s32 object_count, u u32 GetDecompressedDataSize(const u32 *ptr) { - const u8 *ptr8 = (const u8 *)ptr; - return (ptr8[3] << 16) | (ptr8[2] << 8) | (ptr8[1]); + union CompressionHeader *header = (union CompressionHeader *)ptr; + switch (header->smol.mode) + { + case MODE_LZ77: + return header->lz77.size; + case IS_TILEMAP: + return header->smolTilemap.tilemapSize; + default: + return header->smol.imageSize*SMOL_IMAGE_SIZE_MULTIPLIER; + } +} + +bool32 IsCompressedData(const u32 *ptr) +{ + u32 size; + union CompressionHeader *header = (union CompressionHeader *)ptr; + switch (header->smol.mode) + { + case MODE_LZ77: + return IsLZ77Data(ptr, TILE_SIZE_4BPP, MAX_DECOMPRESSION_BUFFER_SIZE); + case BASE_ONLY: + case ENCODE_SYMS: + case ENCODE_DELTA_SYMS: + case ENCODE_LO: + case ENCODE_BOTH: + case ENCODE_BOTH_DELTA_SYMS: + size = GetDecompressedDataSize(ptr); + if (size % TILE_SIZE_4BPP == 0 && size < MAX_DECOMPRESSION_BUFFER_SIZE) + return TRUE; + break; + case IS_FRAME_CONTAINER: + // No implemented yet + case IS_TILEMAP: + // Has to use another assumption + default: + // Is not one of these cases, it's not compressed data + return FALSE; + } + return FALSE; } bool8 LoadCompressedSpriteSheetUsingHeap(const struct CompressedSpriteSheet *src) @@ -299,8 +1364,8 @@ bool8 LoadCompressedSpriteSheetUsingHeap(const struct CompressedSpriteSheet *src struct SpriteSheet dest; void *buffer; - buffer = AllocZeroed(src->data[0] >> 8); - LZ77UnCompWram(src->data, buffer); + buffer = AllocZeroed(GetDecompressedDataSize(&src->data[0])); + DecompressDataWithHeaderWram(src->data, buffer); dest.data = buffer; dest.size = src->size; @@ -310,3 +1375,19 @@ bool8 LoadCompressedSpriteSheetUsingHeap(const struct CompressedSpriteSheet *src Free(buffer); return FALSE; } + +extern const u32 LZ77UnCompWRAMOptimized[]; +extern const u32 LZ77UnCompWRAMOptimized_end[]; + +ARM_FUNC static void SwitchToArmCallFastLZ77(const u32 *src, void *dest, void (*funcPtr)(const u32 *src, void *dest)) +{ + funcPtr(src, dest); +} + +void FastLZ77UnCompWram(const u32 *src, void *dest) +{ + u32 funcBuffer[200]; + + CopyFuncToIwram(funcBuffer, LZ77UnCompWRAMOptimized, LZ77UnCompWRAMOptimized_end); + SwitchToArmCallFastLZ77(src, dest, (void *) funcBuffer); +} diff --git a/src/decompress_asm.s b/src/decompress_asm.s new file mode 100644 index 000000000000..bfe690ef607c --- /dev/null +++ b/src/decompress_asm.s @@ -0,0 +1,131 @@ + .syntax unified + + .arm + .section .iwram.code + .align 2 + +.global FastUnsafeCopy32 +.type FastUnsafeCopy32, %function + + @ Word aligned, 32-byte copy + @ This function WILL overwrite your buffer, so make sure it is at least 32 bytes larger than the desired size. +FastUnsafeCopy32: + push {r4-r10} +.Lloop_32: + ldmia r1!, {r3-r10} + stmia r0!, {r3-r10} + subs r2, r2, #32 + bgt .Lloop_32 + pop {r4-r10} + bx lr + + +@ Credit to: luckytyphlosion as it's his implementation + + .section .text @Copied to stack on run-time + .align 2 + +.global LZ77UnCompWRAMOptimized +.type LZ77UnCompWRAMOptimized, %function +LZ77UnCompWRAMOptimized: @ 0x000010FC + push {r4, r5, r6, lr} + // read in data header in r5 + // Data header (32bit) + // Bit 0-3 Reserved + // Bit 4-7 Compressed type (must be 1 for LZ77) + // Bit 8-31 Size of decompressed data + ldr r5, [r0], #4 + // store decompressed size in r2 + lsr r2, r5, #8 + // main loop + cmp r2, #0 + ble LZ77_Done +LZ77_MainLoop: + // read in Flag Byte + // Flag data (8bit) + // Bit 0-7 Type Flags for next 8 Blocks, MSB first + ldrb lr, [r0], #1 + // shift to the highest byte + lsl lr, lr, #24 + // 8 blocks so set counter (r4) to 8 + mov r4, #8 + b LZ77_EightBlockLoop +LZ77_HandleCompressedData: + // reading in block type 1 Part 1 into r5 + // Block Type 1 Part 1 - Compressed - Copy N+3 Bytes from Dest-Disp-1 to Dest + // Bit 0-3 Disp MSBs + // Bit 4-7 Number of bytes to copy (minus 3) + // byte copy range: [3, 18] + ldrb r5, [r0], #1 + + + // 18 -> 0 + // 17 -> 1 + // 16 -> 2 + // ... + // 3 -> 15 + // formula: do 18 - x + // want to calculate r3 = 18 - (3 + (numBytesToCopy)) + // r3 = 18 - 3 - (numBytesToCopy) + // r3 = 15 - numBytesToCopy + // but then also need to do r2 = r2 - (3 + (numBytesToCopy)) + // r2 = r2 - 3 - numBytesToCopy + // r2 = r2 - 18 + 18 - 3 - numBytesToCopy + // r2 = r2 - 18 + 15 - numBytesToCopy + + mov r6, #3 + // r3 = 3 + (numBytesToCopy) + add r3, r6, r5, asr #4 + // get displacement high bits + and r5, r5, #0xf + // Now reading Block Type 1 Part 2 into r6 + // Block type 1 Part 2 + // Bit 0-7 Disp LSBs + ldrb r6, [r0], #1 + // combine low and high bits into r6 + orr r6, r6, r5, lsl #8 + // +1 because of reasons + add r6, r6, #1 + // subtract how many bytes are going to be copied from the size + subs r2, r2, r3 + + // do duff's device + // https://en.wikipedia.org/wiki/Duff%27s_device + // calculate pc offset + rsb r3, r3, #18 + // jump + add pc, pc, r3, lsl #3 + nop + .rept 18 + ldrb r5, [r1, -r6] + strb r5, [r1], #1 + .endr + + // cpsr flags still preserved from earlier + // check if no more bytes have to be copied + ble LZ77_Done + // check if end of the block + subs r4, r4, #1 + ble LZ77_MainLoop +LZ77_EightBlockLoop: + // check if compressed data (bit set) + lsls lr, lr, #1 + bcs LZ77_HandleCompressedData + // uncompressed data can only be 1 byte long + // copy one byte of uncompressed data + ldrb r6, [r0], #1 + strb r6, [r1], #1 + subs r2, r2, #1 + ble LZ77_Done +LZ77_EightBlockLoop_HandleLoop: + // check if we're done with the 8 blocks + subs r4, r4, #1 + bgt LZ77_EightBlockLoop // go back to main loop if so + // no need to check if r2 is 0 since already checked elsewhere + b LZ77_MainLoop +LZ77_Done: + pop {r4, r5, r6, lr} + bx lr + +.global LZ77UnCompWRAMOptimized_end +LZ77UnCompWRAMOptimized_end: diff --git a/src/decompress_error_handler.c b/src/decompress_error_handler.c new file mode 100644 index 000000000000..ff332618ffa0 --- /dev/null +++ b/src/decompress_error_handler.c @@ -0,0 +1,196 @@ +#include "decompress_error_handler.h" +#include "global.h" +#include "data.h" +#include "menu.h" +#include "menu_helpers.h" +#include "malloc.h" +#include "palette.h" +#include "graphics.h" +#include "gpu_regs.h" +#include "bg.h" +#include "main.h" +#include "text_window.h" +#include "string_util.h" +#include "constants/rgb.h" + +static EWRAM_DATA u32 sErrorAddress; +static EWRAM_DATA enum CompressionError sCompressionError; + +static const struct BgTemplate sBgTemplates[3] = +{ + { + .bg = 0, + .charBaseIndex = 2, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0, + }, + { + .bg = 2, + .charBaseIndex = 0, + .mapBaseIndex = 14, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0, + }, + { + .bg = 3, + .charBaseIndex = 0, + .mapBaseIndex = 15, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0, + }, +}; + +static void DecompressErrorScreenTextPrint(u32 window, const u8 *text, u8 x, u8 y) +{ + u8 color[3]; + + color[0] = TEXT_COLOR_TRANSPARENT; + color[1] = TEXT_DYNAMIC_COLOR_6; + color[2] = TEXT_COLOR_LIGHT_GRAY; + AddTextPrinterParameterized4(window, FONT_NORMAL, x * 8, y * 8 + 1, 0, 0, color, 0, text); +} + +static void GetHexStringFromU32(u8 *str, u32 value) +{ + str[0] = CHAR_0; + str[1] = CHAR_x; + str[10] = EOS; + for (u32 i = 0; i < 8; i++) + { + u8 currChar = 0; + switch ((value >> (4*i)) & 0xF) + { + case 0: + currChar = CHAR_0; + break; + case 1: + currChar = CHAR_1; + break; + case 2: + currChar = CHAR_2; + break; + case 3: + currChar = CHAR_3; + break; + case 4: + currChar = CHAR_4; + break; + case 5: + currChar = CHAR_5; + break; + case 6: + currChar = CHAR_6; + break; + case 7: + currChar = CHAR_7; + break; + case 8: + currChar = CHAR_8; + break; + case 9: + currChar = CHAR_9; + break; + case 10: + currChar = CHAR_A; + break; + case 11: + currChar = CHAR_B; + break; + case 12: + currChar = CHAR_C; + break; + case 13: + currChar = CHAR_D; + break; + case 14: + currChar = CHAR_E; + break; + case 15: + currChar = CHAR_F; + break; + } + u32 pos = 9 - i; + str[pos] = currChar; + } +} + +static const struct WindowTemplate sTextWin = +{ + .bg = 0, + .tilemapLeft = 3, + .tilemapTop = 2, + .width = 24, + .height = 16, + .paletteNum = 15, + .baseBlock = 1, +}; + +void DecompressionError_CB2(void) +{ + + if (sErrorAddress == 0) + return; + + ResetVramOamAndBgCntRegs(); + ResetAllBgsCoordinates(); + FreeAllWindowBuffers(); + + SetGpuReg(REG_OFFSET_DISPCNT, 0); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BG0CNT, 0); + SetGpuReg(REG_OFFSET_BG0HOFS, 0); + SetGpuReg(REG_OFFSET_BG0VOFS, 0); + DmaFill16(3, 0, VRAM, VRAM_SIZE); + DmaFill32(3, 0, OAM, OAM_SIZE); + DmaFill16(3, 0, PLTT, PLTT_SIZE); + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); + LoadBgTiles(0, gTextWindowFrame1_Gfx, 0x120, 0x214); + DeactivateAllTextPrinters(); + ResetTasks(); + ResetPaletteFade(); + LoadPalette(gTextWindowFrame1_Pal, 0xE0, 0x20); + LoadPalette(gStandardMenuPalette, 0xF0, 0x20); + u32 window = AddWindow(&sTextWin); + DrawStdFrameWithCustomTileAndPalette(window, TRUE, 0x214, 0xE); + static const u8 romCheckFailMessage[] =_( + "{COLOR RED}ERROR! {COLOR DARK_GRAY}Decompression Failed!\n" + "\n" + "Address:\n" + "Error:\n"); + DecompressErrorScreenTextPrint(window, romCheckFailMessage, 1, 0); + u8 addressStr[11]; + u8 errorStr[11]; + GetHexStringFromU32(addressStr, sErrorAddress); + GetHexStringFromU32(errorStr, sCompressionError); + DecompressErrorScreenTextPrint(window, addressStr, 7, 4); + DecompressErrorScreenTextPrint(window, errorStr, 7, 6); + TransferPlttBuffer(); + *(u16*)PLTT = RGB(17, 18, 31); + ShowBg(0); + sErrorAddress = 0; + // This loop is apparently needed to prevent the game from doing + // stupid stuff with data it couldn't decompress + while(TRUE) + sCompressionError++; +} + +void DecompressionError(const u32 *src, enum CompressionError error) +{ + sErrorAddress = (u32)src; + sCompressionError = error; + SetMainCallback2(DecompressionError_CB2); + DecompressionError_CB2(); +} + +void DoDecompressionError(void) +{ + DecompressionError((u32 *)0x12345678, HEADER_ERROR); +} diff --git a/src/decoration.c b/src/decoration.c index 160806125508..eee436ec8209 100644 --- a/src/decoration.c +++ b/src/decoration.c @@ -1227,9 +1227,9 @@ static void ShowDecorationOnMap_(u16 mapX, u16 mapY, u8 decWidth, u8 decHeight, { x = mapX + i; attributes = GetMetatileAttributesById(NUM_TILES_IN_PRIMARY + gDecorations[decoration].tiles[j * decWidth + i]); - if (MetatileBehavior_IsSecretBaseImpassable(attributes & METATILE_ATTR_BEHAVIOR_MASK) == TRUE + if (MetatileBehavior_IsSecretBaseImpassable(UNPACK_BEHAVIOR(attributes)) == TRUE || (gDecorations[decoration].permission != DECORPERM_PASS_FLOOR && (attributes >> METATILE_ATTR_LAYER_SHIFT) != METATILE_LAYER_TYPE_NORMAL)) - impassableFlag = MAPGRID_COLLISION_MASK; + impassableFlag = MAPGRID_IMPASSABLE; else impassableFlag = 0; @@ -1521,6 +1521,17 @@ static bool8 IsFloorOrBoardAndHole(u16 behaviorAt, const struct Decoration *deco return FALSE; } +#ifdef BUGFIX +#define GetLayerType(tileId) UNPACK_LAYER_TYPE(GetMetatileAttributesById(tileId)) +#else +// This incompletely extracts the layer type data. The result is that comparisons against any nonzero +// value in the valid range always have the same result. +// Because GF only compares against 0 (METATILE_LAYER_TYPE_NORMAL) there are no ill effects and it's possible this +// is what they intended. We use the named constant for the comparisons, which implies you can use nonzero constants at +// those locations (which you can't), so to avoid this trap and keep the better documentation this is included as a bug fix. +#define GetLayerType(tileId) GetMetatileAttributesById(tileId) & METATILE_ATTR_LAYER_MASK +#endif + static bool8 CanPlaceDecoration(u8 taskId, const struct Decoration *decoration) { u8 i; @@ -1545,7 +1556,7 @@ static bool8 CanPlaceDecoration(u8 taskId, const struct Decoration *decoration) { curX = gTasks[taskId].tCursorX + j; behaviorAt = MapGridGetMetatileBehaviorAt(curX, curY); - layerType = GetMetatileAttributesById(NUM_TILES_IN_PRIMARY + decoration->tiles[(mapY - 1 - i) * mapX + j]) & METATILE_ATTR_LAYER_MASK; + layerType = GetLayerType(NUM_TILES_IN_PRIMARY + decoration->tiles[(mapY - 1 - i) * mapX + j]); if (!IsFloorOrBoardAndHole(behaviorAt, decoration)) return FALSE; @@ -1566,7 +1577,7 @@ static bool8 CanPlaceDecoration(u8 taskId, const struct Decoration *decoration) { curX = gTasks[taskId].tCursorX + j; behaviorAt = MapGridGetMetatileBehaviorAt(curX, curY); - layerType = GetMetatileAttributesById(NUM_TILES_IN_PRIMARY + decoration->tiles[(mapY - 1 - i) * mapX + j]) & METATILE_ATTR_LAYER_MASK; + layerType = GetLayerType(NUM_TILES_IN_PRIMARY + decoration->tiles[(mapY - 1 - i) * mapX + j]); if (!MetatileBehavior_IsNormal(behaviorAt) && !IsSecretBaseTrainerSpot(behaviorAt, layerType)) return FALSE; @@ -1583,7 +1594,7 @@ static bool8 CanPlaceDecoration(u8 taskId, const struct Decoration *decoration) { curX = gTasks[taskId].tCursorX + j; behaviorAt = MapGridGetMetatileBehaviorAt(curX, curY); - layerType = GetMetatileAttributesById(NUM_TILES_IN_PRIMARY + decoration->tiles[j]) & METATILE_ATTR_LAYER_MASK; + layerType = GetLayerType(NUM_TILES_IN_PRIMARY + decoration->tiles[j]); if (!MetatileBehavior_IsNormal(behaviorAt) && !MetatileBehavior_IsSecretBaseNorthWall(behaviorAt)) return FALSE; @@ -2080,7 +2091,7 @@ static u8 AddDecorationIconObjectFromIconTable(u16 tilesTag, u16 paletteTag, u8 if (!AllocItemIconTemporaryBuffers()) return MAX_SPRITES; - LZDecompressWram(GetDecorationIconPic(decor), gItemIconDecompressionBuffer); + DecompressDataWithHeaderWram(GetDecorationIconPic(decor), gItemIconDecompressionBuffer); CopyItemIconPicTo4x4Buffer(gItemIconDecompressionBuffer, gItemIcon4x4Buffer); sheet.data = gItemIcon4x4Buffer; sheet.size = 0x200; diff --git a/src/dexnav.c b/src/dexnav.c index 48dd75829b3c..3244d07a6f7a 100644 --- a/src/dexnav.c +++ b/src/dexnav.c @@ -50,7 +50,6 @@ #include "text_window.h" #include "wild_encounter.h" #include "window.h" -#include "constants/map_types.h" #include "constants/species.h" #include "constants/maps.h" #include "constants/field_effects.h" @@ -164,21 +163,21 @@ static void DrawHiddenSearchWindow(u8 width); //// Const Data // gui image data -static const u32 sDexNavGuiTiles[] = INCBIN_U32("graphics/dexnav/gui_tiles.4bpp.lz"); -static const u32 sDexNavGuiTilemap[] = INCBIN_U32("graphics/dexnav/gui_tilemap.bin.lz"); +static const u32 sDexNavGuiTiles[] = INCBIN_U32("graphics/dexnav/gui_tiles.4bpp.smol"); +static const u32 sDexNavGuiTilemap[] = INCBIN_U32("graphics/dexnav/gui_tilemap.bin.smolTM"); static const u32 sDexNavGuiPal[] = INCBIN_U32("graphics/dexnav/gui.gbapal"); -static const u32 sSelectionCursorGfx[] = INCBIN_U32("graphics/dexnav/cursor.4bpp.lz"); +static const u32 sSelectionCursorGfx[] = INCBIN_U32("graphics/dexnav/cursor.4bpp.smol"); static const u16 sSelectionCursorPal[] = INCBIN_U16("graphics/dexnav/cursor.gbapal"); -static const u32 sCapturedAllMonsTiles[] = INCBIN_U32("graphics/dexnav/captured_all.4bpp.lz"); //uses selection cursor pal +static const u32 sCapturedAllMonsTiles[] = INCBIN_U32("graphics/dexnav/captured_all.4bpp.smol"); //uses selection cursor pal -static const u32 sNoDataGfx[] = INCBIN_U32("graphics/dexnav/no_data.4bpp.lz"); +static const u32 sNoDataGfx[] = INCBIN_U32("graphics/dexnav/no_data.4bpp.smol"); // searching image data -static const u32 sPotentialStarGfx[] = INCBIN_U32("graphics/dexnav/star.4bpp.lz"); -static const u32 sHiddenSearchIconGfx[] = INCBIN_U32("graphics/dexnav/hidden_search.4bpp.lz"); -static const u32 sOwnedIconGfx[] = INCBIN_U32("graphics/dexnav/owned_icon.4bpp.lz"); -static const u32 sHiddenMonIconGfx[] = INCBIN_U32("graphics/dexnav/hidden.4bpp.lz"); +static const u32 sPotentialStarGfx[] = INCBIN_U32("graphics/dexnav/star.4bpp.smol"); +static const u32 sHiddenSearchIconGfx[] = INCBIN_U32("graphics/dexnav/hidden_search.4bpp.smol"); +static const u32 sOwnedIconGfx[] = INCBIN_U32("graphics/dexnav/owned_icon.4bpp.smol"); +static const u32 sHiddenMonIconGfx[] = INCBIN_U32("graphics/dexnav/hidden.4bpp.smol"); // strings static const u8 sText_DexNav_NoInfo[] = _("--------"); @@ -473,8 +472,8 @@ static void AddSearchWindow(u8 width) } #define WINDOW_COL_0 (SPECIES_ICON_X + 4) -#define WINDOW_COL_1 (WINDOW_COL_0 + (GetFontAttribute(sDexNavSearchDataPtr->windowId, FONTATTR_MAX_LETTER_WIDTH) * (POKEMON_NAME_LENGTH))) -#define WINDOW_MOVE_NAME_X (WINDOW_COL_1 + (GetFontAttribute(sDexNavSearchDataPtr->windowId, FONTATTR_MAX_LETTER_WIDTH) * 6)) +#define WINDOW_COL_1 (WINDOW_COL_0 + (GetFontAttribute(FONT_SMALL, FONTATTR_MAX_LETTER_WIDTH) * (POKEMON_NAME_LENGTH))) +#define WINDOW_MOVE_NAME_X (WINDOW_COL_1 + (GetFontAttribute(FONT_SMALL, FONTATTR_MAX_LETTER_WIDTH) * 6)) #define SEARCH_ARROW_X (WINDOW_MOVE_NAME_X + 90) #define SEARCH_ARROW_Y 0 @@ -486,19 +485,19 @@ static void AddSearchWindowText(u16 species, u8 proximity, u8 searchLevel, bool8 if (hidden) { StringCopy(gStringVar4, sText_ThreeQmarks); - AddTextPrinterParameterized3(sDexNavSearchDataPtr->windowId, 0, WINDOW_COL_0, 0, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar4); + AddTextPrinterParameterized3(sDexNavSearchDataPtr->windowId, FONT_SMALL, WINDOW_COL_0, 0, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar4); return; } else { StringCopy(gStringVar1, GetSpeciesName(species)); - AddTextPrinterParameterized3(sDexNavSearchDataPtr->windowId, 0, WINDOW_COL_0, 0, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar1); + AddTextPrinterParameterized3(sDexNavSearchDataPtr->windowId, FONT_SMALL, WINDOW_COL_0, 0, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar1); } //level - always present ConvertIntToDecimalStringN(gStringVar1, sDexNavSearchDataPtr->monLevel, STR_CONV_MODE_LEFT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, sText_MonLevel); - AddTextPrinterParameterized3(sDexNavSearchDataPtr->windowId, 0, WINDOW_COL_1, 0, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar4); + AddTextPrinterParameterized3(sDexNavSearchDataPtr->windowId, FONT_SMALL, WINDOW_COL_1, 0, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar4); if (proximity <= SNEAKING_PROXIMITY) { @@ -508,21 +507,21 @@ static void AddSearchWindowText(u16 species, u8 proximity, u8 searchLevel, bool8 { StringCopy(gStringVar1, GetMoveName(sDexNavSearchDataPtr->moves[0])); StringExpandPlaceholders(gStringVar4, sText_EggMove); - AddTextPrinterParameterized3(windowId, 0, WINDOW_MOVE_NAME_X, 0, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar4); + AddTextPrinterParameterized3(windowId, FONT_SMALL, WINDOW_MOVE_NAME_X, 0, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar4); } if (searchLevel > 2) { // ability name StringCopy(gStringVar1, gAbilitiesInfo[GetAbilityBySpecies(species, sDexNavSearchDataPtr->abilityNum)].name); - AddTextPrinterParameterized3(windowId, 0, WINDOW_COL_1 + 16, 12, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar1); + AddTextPrinterParameterized3(windowId, FONT_SMALL, WINDOW_COL_1 + 16, 12, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar1); // item name if (sDexNavSearchDataPtr->heldItem) { CopyItemName(sDexNavSearchDataPtr->heldItem, gStringVar1); StringExpandPlaceholders(gStringVar4, sText_HeldItem); - AddTextPrinterParameterized3(windowId, 0, WINDOW_COL_0, 12, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar4); + AddTextPrinterParameterized3(windowId, FONT_SMALL, WINDOW_COL_0, 12, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar4); } } } @@ -533,7 +532,7 @@ static void AddSearchWindowText(u16 species, u8 proximity, u8 searchLevel, bool8 StringExpandPlaceholders(gStringVar4, sText_DexNavChainLong); else StringExpandPlaceholders(gStringVar4, sText_DexNavChain); - AddTextPrinterParameterized3(windowId, 0, SEARCH_ARROW_X - 16, 12, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar4); + AddTextPrinterParameterized3(windowId, FONT_SMALL, SEARCH_ARROW_X - 16, 12, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar4); CopyWindowToVram(sDexNavSearchDataPtr->windowId, 2); } @@ -614,7 +613,7 @@ static bool8 DexNavPickTile(enum EncounterType environment, u8 areaX, u8 areaY, bool8 nextIter; u8 scale = 0; u8 weight = 0; - u8 currMapType = GetCurrentMapType(); + enum MapType currMapType = GetCurrentMapType(); u8 tileBehaviour; u8 tileBuffer = 2; u8 *xPos = AllocZeroed((botX - topX) * (botY - topY) * sizeof(u8)); @@ -726,7 +725,7 @@ static bool8 DexNavPickTile(enum EncounterType environment, u8 areaX, u8 areaY, static bool8 TryStartHiddenMonFieldEffect(enum EncounterType environment, u8 xSize, u8 ySize, bool8 smallScan) { - u8 currMapType = GetCurrentMapType(); + enum MapType currMapType = GetCurrentMapType(); u8 fldEffId = 0; if (DexNavPickTile(environment, xSize, ySize, smallScan)) @@ -933,8 +932,8 @@ static void DexNavUpdateDirectionArrow(void) { u16 tileX = sDexNavSearchDataPtr->tileX; u16 tileY = sDexNavSearchDataPtr->tileY; - u16 playerX = gSaveBlock1Ptr->pos.x + 7; - u16 playerY = gSaveBlock1Ptr->pos.y + 7; + u16 playerX = gSaveBlock1Ptr->pos.x + MAP_OFFSET; + u16 playerY = gSaveBlock1Ptr->pos.y + MAP_OFFSET; u16 deltaX = abs(tileX - playerX); u16 deltaY = abs(tileY - playerY); const u8 *str; @@ -960,7 +959,7 @@ static void DexNavUpdateDirectionArrow(void) str = sText_ArrowDown; //player above } - AddTextPrinterParameterized3(windowId, 1, SEARCH_ARROW_X, SEARCH_ARROW_Y, sSearchFontColor, TEXT_SKIP_DRAW, str); + AddTextPrinterParameterized3(windowId, FONT_NORMAL, SEARCH_ARROW_X, SEARCH_ARROW_Y, sSearchFontColor, TEXT_SKIP_DRAW, str); CopyWindowToVram(windowId, 2); } @@ -1403,7 +1402,7 @@ static u8 DexNavGetAbilityNum(u16 species, u8 searchLevel) } if (genAbility - && gSpeciesInfo[species].abilities[2] != ABILITY_NONE + && GetSpeciesAbility(species, 2) != ABILITY_NONE && GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) { //Only give hidden ability if Pokemon has been caught before @@ -1412,7 +1411,7 @@ static u8 DexNavGetAbilityNum(u16 species, u8 searchLevel) else { //Pick a normal ability of that Pokemon - if (gSpeciesInfo[species].abilities[1] != ABILITY_NONE) + if (GetSpeciesAbility(species, 1) != ABILITY_NONE) abilityNum = Random() & 1; else abilityNum = 0; @@ -1518,7 +1517,7 @@ static u8 GetEncounterLevelFromMapData(u16 species, enum EncounterType environme { u32 headerId = GetCurrentMapWildMonHeaderId(); enum TimeOfDay timeOfDay; - u8 min = 100; + u8 min = MAX_LEVEL; u8 max = 0; u8 i; @@ -1656,7 +1655,7 @@ static bool8 DexNav_LoadGraphics(void) case 1: if (FreeTempTileDataBuffersIfPossible() != TRUE) { - LZDecompressWram(sDexNavGuiTilemap, sBg1TilemapBuffer); + DecompressDataWithHeaderWram(sDexNavGuiTilemap, sBg1TilemapBuffer); sDexNavUiDataPtr->state++; } break; @@ -1910,7 +1909,7 @@ static void DexNavFadeAndExit(void) static bool8 SpeciesInArray(u16 species, u8 section) { u32 i; - u16 dexNum = SpeciesToNationalPokedexNum(species); + enum NationalDexOrder dexNum = SpeciesToNationalPokedexNum(species); switch (section) { @@ -2123,8 +2122,8 @@ static void SetTypeIconPosAndPal(u8 typeId, u8 x, u8 y, u8 spriteArrayId) static void PrintCurrentSpeciesInfo(void) { u16 species = DexNavGetSpecies(); - u16 dexNum = SpeciesToNationalPokedexNum(species); - u8 type1, type2; + enum NationalDexOrder dexNum = SpeciesToNationalPokedexNum(species); + enum Type type1, type2; if (!GetSetPokedexFlag(dexNum, FLAG_GET_SEEN)) species = SPECIES_NONE; @@ -2134,13 +2133,13 @@ static void PrintCurrentSpeciesInfo(void) //species name if (species == SPECIES_NONE) - AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, SPECIES_INFO_Y, sFontColor_Black, 0, sText_DexNav_NoInfo); + AddTextPrinterParameterized3(WINDOW_INFO, FONT_SMALL, 0, SPECIES_INFO_Y, sFontColor_Black, 0, sText_DexNav_NoInfo); else - AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, SPECIES_INFO_Y, sFontColor_Black, 0, GetSpeciesName(species)); + AddTextPrinterParameterized3(WINDOW_INFO, FONT_SMALL, 0, SPECIES_INFO_Y, sFontColor_Black, 0, GetSpeciesName(species)); //type icon(s) - type1 = gSpeciesInfo[species].types[0]; - type2 = gSpeciesInfo[species].types[1]; + type1 = GetSpeciesType(species, 0); + type2 = GetSpeciesType(species, 1); if (species == SPECIES_NONE) type1 = type2 = TYPE_MYSTERY; @@ -2158,34 +2157,34 @@ static void PrintCurrentSpeciesInfo(void) //search level if (species == SPECIES_NONE) { - AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, SEARCH_LEVEL_Y, sFontColor_Black, 0, sText_DexNav_NoInfo); + AddTextPrinterParameterized3(WINDOW_INFO, FONT_SMALL, 0, SEARCH_LEVEL_Y, sFontColor_Black, 0, sText_DexNav_NoInfo); } else { ConvertIntToDecimalStringN(gStringVar4, GetSearchLevel(species), 0, 4); - AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, SEARCH_LEVEL_Y, sFontColor_Black, 0, gStringVar4); + AddTextPrinterParameterized3(WINDOW_INFO, FONT_SMALL, 0, SEARCH_LEVEL_Y, sFontColor_Black, 0, gStringVar4); } //hidden ability if (species == SPECIES_NONE) { - AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, HA_INFO_Y, sFontColor_Black, 0, sText_DexNav_NoInfo); + AddTextPrinterParameterized3(WINDOW_INFO, FONT_SMALL, 0, HA_INFO_Y, sFontColor_Black, 0, sText_DexNav_NoInfo); } else if (GetSetPokedexFlag(dexNum, FLAG_GET_CAUGHT)) { - if (gSpeciesInfo[species].abilities[2] != ABILITY_NONE) - AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, HA_INFO_Y, sFontColor_Black, 0, gAbilitiesInfo[gSpeciesInfo[species].abilities[2]].name); + if (GetSpeciesAbility(species, 2) != ABILITY_NONE) + AddTextPrinterParameterized3(WINDOW_INFO, FONT_SMALL, 0, HA_INFO_Y, sFontColor_Black, 0, gAbilitiesInfo[GetSpeciesAbility(species, 2)].name); else - AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, HA_INFO_Y, sFontColor_Black, 0, gText_None); + AddTextPrinterParameterized3(WINDOW_INFO, FONT_SMALL, 0, HA_INFO_Y, sFontColor_Black, 0, gText_None); } else { - AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, HA_INFO_Y, sFontColor_Black, 0, sText_DexNav_CaptureToSee); + AddTextPrinterParameterized3(WINDOW_INFO, FONT_SMALL, 0, HA_INFO_Y, sFontColor_Black, 0, sText_DexNav_CaptureToSee); } //current chain ConvertIntToDecimalStringN(gStringVar1, gSaveBlock3Ptr->dexNavChain, STR_CONV_MODE_LEFT_ALIGN, 3); - AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, CHAIN_BONUS_Y, sFontColor_Black, 0, gStringVar1); + AddTextPrinterParameterized3(WINDOW_INFO, FONT_SMALL, 0, CHAIN_BONUS_Y, sFontColor_Black, 0, gStringVar1); CopyWindowToVram(WINDOW_INFO, 3); PutWindowTilemap(WINDOW_INFO); @@ -2194,7 +2193,7 @@ static void PrintCurrentSpeciesInfo(void) static void PrintMapName(void) { GetMapName(gStringVar3, GetCurrentRegionMapSectionId(), 0); - AddTextPrinterParameterized3(WINDOW_REGISTERED, 1, 108 + + AddTextPrinterParameterized3(WINDOW_REGISTERED, FONT_NORMAL, 108 + GetStringRightAlignXOffset(1, gStringVar3, MAP_NAME_LENGTH * GetFontAttribute(1, FONTATTR_MAX_LETTER_WIDTH)), 0, sFontColor_White, 0, gStringVar3); CopyWindowToVram(WINDOW_REGISTERED, 3); @@ -2206,13 +2205,13 @@ static void PrintSearchableSpecies(u16 species) PutWindowTilemap(WINDOW_REGISTERED); if (species == SPECIES_NONE) { - AddTextPrinterParameterized3(WINDOW_REGISTERED, 1, 0, 0, sFontColor_White, TEXT_SKIP_DRAW, sText_DexNav_PressRToRegister); + AddTextPrinterParameterized3(WINDOW_REGISTERED, FONT_NORMAL, 0, 0, sFontColor_White, TEXT_SKIP_DRAW, sText_DexNav_PressRToRegister); } else { StringCopy(gStringVar1, GetSpeciesName(species)); StringExpandPlaceholders(gStringVar4, sText_DexNav_SearchForRegisteredSpecies); - AddTextPrinterParameterized3(WINDOW_REGISTERED, 1, 0, 0, sFontColor_White, TEXT_SKIP_DRAW, gStringVar4); + AddTextPrinterParameterized3(WINDOW_REGISTERED, FONT_NORMAL, 0, 0, sFontColor_White, TEXT_SKIP_DRAW, gStringVar4); } PrintMapName(); @@ -2578,7 +2577,7 @@ bool8 TryFindHiddenPokemon(void) } else { - species = gWildMonHeaders[headerId].encounterTypes[timeOfDay].waterMonsInfo->wildPokemon[ChooseWildMonIndex_WaterRock()].species; + species = gWildMonHeaders[headerId].encounterTypes[timeOfDay].waterMonsInfo->wildPokemon[ChooseWildMonIndex_Water()].species; environment = ENCOUNTER_TYPE_WATER; } @@ -2652,11 +2651,11 @@ static void DrawSearchIcon(void) static void DrawHiddenSearchWindow(u8 width) { AddSearchWindow(width); - AddTextPrinterParameterized3(sDexNavSearchDataPtr->windowId, 0, SPECIES_ICON_X + 4, 0, sSearchFontColor, TEXT_SKIP_DRAW, sText_ThreeQmarks); + AddTextPrinterParameterized3(sDexNavSearchDataPtr->windowId, FONT_SMALL, SPECIES_ICON_X + 4, 0, sSearchFontColor, TEXT_SKIP_DRAW, sText_ThreeQmarks); ConvertIntToDecimalStringN(gStringVar1, sDexNavSearchDataPtr->searchLevel, STR_CONV_MODE_LEFT_ALIGN, 2); StringExpandPlaceholders(gStringVar4, sText_SearchLevel); - AddTextPrinterParameterized3(sDexNavSearchDataPtr->windowId, 0, SPECIES_ICON_X + 4, 12, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar4); + AddTextPrinterParameterized3(sDexNavSearchDataPtr->windowId, FONT_SMALL, SPECIES_ICON_X + 4, 12, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar4); CopyWindowToVram(sDexNavSearchDataPtr->windowId, 2); } diff --git a/src/diploma.c b/src/diploma.c index 2a188674503c..80b0cb42ef0b 100644 --- a/src/diploma.c +++ b/src/diploma.c @@ -44,8 +44,8 @@ static const u16 sDiplomaPalettes[][16] = INCBIN_U16("graphics/diploma/hoenn.gbapal"), }; -static const u32 sDiplomaTilemap[] = INCBIN_U32("graphics/diploma/tilemap.bin.lz"); -static const u32 sDiplomaTiles[] = INCBIN_U32("graphics/diploma/tiles.4bpp.lz"); +static const u32 sDiplomaTilemap[] = INCBIN_U32("graphics/diploma/tilemap.bin.smolTM"); +static const u32 sDiplomaTiles[] = INCBIN_U32("graphics/diploma/tiles.4bpp.smol"); void CB2_ShowDiploma(void) { @@ -80,7 +80,7 @@ void CB2_ShowDiploma(void) DecompressAndCopyTileDataToVram(1, &sDiplomaTiles, 0, 0, 0); while (FreeTempTileDataBuffersIfPossible()) ; - LZDecompressWram(sDiplomaTilemap, sDiplomaTilemapPtr); + DecompressDataWithHeaderWram(sDiplomaTilemap, sDiplomaTilemapPtr); CopyBgTilemapBufferToVram(1); DisplayDiplomaText(); BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); diff --git a/src/dodrio_berry_picking.c b/src/dodrio_berry_picking.c index 16ea035c7cc5..f4b339d41787 100644 --- a/src/dodrio_berry_picking.c +++ b/src/dodrio_berry_picking.c @@ -1,6 +1,7 @@ #include "global.h" #include "malloc.h" #include "bg.h" +#include "decompress.h" #include "dodrio_berry_picking.h" #include "dynamic_placeholder_text_util.h" #include "event_data.h" @@ -10,7 +11,6 @@ #include "link.h" #include "link_rfu.h" #include "m4a.h" -#include "main.h" #include "palette.h" #include "minigame_countdown.h" #include "random.h" @@ -223,7 +223,7 @@ struct DodrioGame_ScoreResults struct DodrioGame { - /*0x0000*/ void (*exitCallback)(void); + /*0x0000*/ MainCallback exitCallback; /*0x0004*/ u8 ALIGNED(4) taskId; /*0x0008*/ u8 ALIGNED(4) playersReceived; /*0x000C*/ u8 ALIGNED(4) startState; @@ -558,16 +558,16 @@ static const u32 sDuplicateGfx[] = INCBIN_U32("graphics/dodrio_berry_picking/tre "graphics/dodrio_berry_picking/shiny.gbapal", "graphics/dodrio_berry_picking/status.gbapal", "graphics/dodrio_berry_picking/berries.gbapal", - "graphics/dodrio_berry_picking/berries.4bpp.lz", + "graphics/dodrio_berry_picking/berries.4bpp.smol", "graphics/dodrio_berry_picking/cloud.gbapal", - "graphics/dodrio_berry_picking/bg.4bpp.lz", - "graphics/dodrio_berry_picking/tree_border.4bpp.lz", - "graphics/dodrio_berry_picking/status.4bpp.lz", - "graphics/dodrio_berry_picking/cloud.4bpp.lz", - "graphics/dodrio_berry_picking/dodrio.4bpp.lz", - "graphics/dodrio_berry_picking/bg.bin.lz", - "graphics/dodrio_berry_picking/tree_border_right.bin.lz", - "graphics/dodrio_berry_picking/tree_border_left.bin.lz"); + "graphics/dodrio_berry_picking/bg.4bpp.smol", + "graphics/dodrio_berry_picking/tree_border.4bpp.smol", + "graphics/dodrio_berry_picking/status.4bpp.smol", + "graphics/dodrio_berry_picking/cloud.4bpp.smol", + "graphics/dodrio_berry_picking/dodrio.4bpp.smol", + "graphics/dodrio_berry_picking/bg.bin.smolTM", + "graphics/dodrio_berry_picking/tree_border_right.bin.smolTM", + "graphics/dodrio_berry_picking/tree_border_left.bin.smolTM"); static const u8 sBerryFallDelays[][3] = @@ -661,7 +661,7 @@ static void (*const sMemberFuncs[])(void) = [FUNC_WAIT_END_GAME] = WaitEndGame_Member }; -void StartDodrioBerryPicking(u16 partyId, void (*exitCallback)(void)) +void StartDodrioBerryPicking(u16 partyId, MainCallback exitCallback) { sExitingGame = FALSE; @@ -3098,6 +3098,7 @@ struct ReadyToStartPacket { u8 id; bool8 ALIGNED(4) ready; + u32 unused; // Put here, so that packet has the same size as gRfu.packet(12 bytes). }; static void SendPacket_ReadyToStart(bool32 ready) @@ -3302,6 +3303,7 @@ struct PickStatePacket { u8 id; u8 ALIGNED(4) pickState; + u32 unused; // Put here, so that packet has the same size as gRfu.packet(12 bytes). }; static void SendPacket_PickState(u8 pickState) @@ -3333,6 +3335,7 @@ struct ReadyToEndPacket { u8 id; bool32 ready; + u32 unused; // Put here, so that packet has the same size as gRfu.packet(12 bytes). }; static void SendPacket_ReadyToEnd(bool32 ready) @@ -3598,16 +3601,16 @@ static const u16 sDodrioNormal_Pal[] = INCBIN_U16("graphics/dodrio_berry_ static const u16 sDodrioShiny_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/shiny.gbapal"); static const u16 sStatus_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/status.gbapal"); static const u16 sBerries_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/berries.gbapal"); -static const u32 sBerries_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/berries.4bpp.lz"); +static const u32 sBerries_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/berries.4bpp.smol"); static const u16 sCloud_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/cloud.gbapal"); -static const u32 sBg_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/bg.4bpp.lz"); -static const u32 sTreeBorder_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/tree_border.4bpp.lz"); -static const u32 sStatus_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/status.4bpp.lz"); -static const u32 sCloud_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/cloud.4bpp.lz"); -static const u32 sDodrio_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/dodrio.4bpp.lz"); -static const u32 sBg_Tilemap[] = INCBIN_U32("graphics/dodrio_berry_picking/bg.bin.lz"); -static const u32 sTreeBorderRight_Tilemap[] = INCBIN_U32("graphics/dodrio_berry_picking/tree_border_right.bin.lz"); -static const u32 sTreeBorderLeft_Tilemap[] = INCBIN_U32("graphics/dodrio_berry_picking/tree_border_left.bin.lz"); +static const u32 sBg_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/bg.4bpp.smol"); +static const u32 sTreeBorder_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/tree_border.4bpp.smol"); +static const u32 sStatus_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/status.4bpp.smol"); +static const u32 sCloud_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/cloud.4bpp.smol"); +static const u32 sDodrio_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/dodrio.4bpp.smol"); +static const u32 sBg_Tilemap[] = INCBIN_U32("graphics/dodrio_berry_picking/bg.bin.smolTM"); +static const u32 sTreeBorderRight_Tilemap[] = INCBIN_U32("graphics/dodrio_berry_picking/tree_border_right.bin.smolTM"); +static const u32 sTreeBorderLeft_Tilemap[] = INCBIN_U32("graphics/dodrio_berry_picking/tree_border_left.bin.smolTM"); static const struct OamData sOamData_Dodrio = { @@ -3830,7 +3833,7 @@ static void LoadDodrioGfx(void) struct SpritePalette normal = {sDodrioNormal_Pal, PALTAG_DODRIO_NORMAL}; struct SpritePalette shiny = {sDodrioShiny_Pal, PALTAG_DODRIO_SHINY}; - LZ77UnCompWram(sDodrio_Gfx, ptr); + DecompressDataWithHeaderWram(sDodrio_Gfx, ptr); if (ptr) { struct SpriteSheet sheet = {ptr, 0x3000, GFXTAG_DODRIO}; @@ -4013,7 +4016,7 @@ static void CreateStatusBarSprites(void) void *ptr = AllocZeroed(0x180); struct SpritePalette pal = {sStatus_Pal, PALTAG_STATUS}; - LZ77UnCompWram(sStatus_Gfx, ptr); + DecompressDataWithHeaderWram(sStatus_Gfx, ptr); // This check should be one line up. if (ptr) { @@ -4155,7 +4158,7 @@ static void LoadBerryGfx(void) void *ptr = AllocZeroed(0x480); struct SpritePalette pal = {sBerries_Pal, PALTAG_BERRIES}; - LZ77UnCompWram(sBerries_Gfx, ptr); + DecompressDataWithHeaderWram(sBerries_Gfx, ptr); if (ptr) { struct SpriteSheet sheet = {ptr, 0x480, GFXTAG_BERRIES}; @@ -4303,7 +4306,7 @@ static void CreateCloudSprites(void) void *ptr = AllocZeroed(0x400); struct SpritePalette pal = {sCloud_Pal, PALTAG_CLOUD}; - LZ77UnCompWram(sCloud_Gfx, ptr); + DecompressDataWithHeaderWram(sCloud_Gfx, ptr); if (ptr) { struct SpriteSheet sheet = {ptr, 0x400, GFXTAG_CLOUD}; diff --git a/src/easy_chat.c b/src/easy_chat.c index 0de7abad25c1..63808597a295 100644 --- a/src/easy_chat.c +++ b/src/easy_chat.c @@ -714,10 +714,10 @@ static const u32 sStartSelectButtons_Gfx[] = INCBIN_U32("graphics/easy_chat/star // on screen the interview_frame gfx was shown behind them. // In Emerald all Easy Chat screens have a filled background, so these gfx go unused static const u16 sRSInterviewFrame_Pal[] = INCBIN_U16("graphics/easy_chat/interview_frame.gbapal"); -static const u32 sRSInterviewFrame_Gfx[] = INCBIN_U32("graphics/easy_chat/interview_frame.4bpp.lz"); +static const u32 sRSInterviewFrame_Gfx[] = INCBIN_U32("graphics/easy_chat/interview_frame.4bpp.smol"); static const u16 sTextInputFrameOrange_Pal[] = INCBIN_U16("graphics/easy_chat/text_input_frame_orange.gbapal"); static const u16 sTextInputFrameGreen_Pal[] = INCBIN_U16("graphics/easy_chat/text_input_frame_green.gbapal"); -static const u32 sTextInputFrame_Gfx[] = INCBIN_U32("graphics/easy_chat/text_input_frame.4bpp.lz"); +static const u32 sTextInputFrame_Gfx[] = INCBIN_U32("graphics/easy_chat/text_input_frame.4bpp.smol"); static const u16 sTitleText_Pal[] = INCBIN_U16("graphics/easy_chat/title_text.gbapal"); static const u16 sText_Pal[] = INCBIN_U16("graphics/easy_chat/text.gbapal"); @@ -5545,7 +5545,7 @@ static u16 GetRandomUnlockedEasyChatPokemon(void) numWords = gEasyChatGroups[EC_GROUP_POKEMON].numWords; for (i = 0; i < numWords; i++) { - u16 dexNum = SpeciesToNationalPokedexNum(*species); + enum NationalDexOrder dexNum = SpeciesToNationalPokedexNum(*species); if (GetSetPokedexFlag(dexNum, FLAG_GET_SEEN)) { if (index) @@ -5851,16 +5851,23 @@ static u8 IsEasyChatWordUnlocked(u16 easyChatWord) void InitializeEasyChatWordArray(u16 *words, u16 length) { u16 i; - for (i = length - 1; i != EC_EMPTY_WORD; i--) - *(words++) = EC_EMPTY_WORD; + if (words != NULL) + { + for (i = length - 1; i != EC_EMPTY_WORD; i--) + *(words++) = EC_EMPTY_WORD; + } } void InitQuestionnaireWords(void) { int i; u16 *words = GetQuestionnaireWordsPtr(); - for (i = 0; i < NUM_QUESTIONNAIRE_WORDS; i++) - words[i] = EC_EMPTY_WORD; + + if (words != NULL) + { + for (i = 0; i < NUM_QUESTIONNAIRE_WORDS; i++) + words[i] = EC_EMPTY_WORD; + } } bool32 IsEasyChatAnswerUnlocked(int easyChatWord) diff --git a/src/egg_hatch.c b/src/egg_hatch.c index 3f72cadeaa67..2c632ee5781b 100644 --- a/src/egg_hatch.c +++ b/src/egg_hatch.c @@ -362,10 +362,10 @@ static void CreateHatchedMon(struct Pokemon *egg, struct Pokemon *temp) static void AddHatchedMonToParty(u8 id) { u8 isEgg = 0x46; // ? - u16 species; + enum NationalDexOrder species; u8 name[POKEMON_NAME_LENGTH + 1]; u16 metLevel; - u8 metLocation; + metloc_u8_t metLocation; struct Pokemon *mon = &gPlayerParty[id]; CreateHatchedMon(mon, &gEnemyParty[0]); @@ -931,7 +931,7 @@ u8 GetEggCyclesToSubtract(void) { if (!GetMonData(&gPlayerParty[i], MON_DATA_SANITY_IS_EGG)) { - u16 ability = GetMonAbility(&gPlayerParty[i]); + enum Ability ability = GetMonAbility(&gPlayerParty[i]); if (ability == ABILITY_MAGMA_ARMOR || ability == ABILITY_FLAME_BODY || ability == ABILITY_STEAM_ENGINE) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 361111ac4ead..848289aec7d7 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -46,7 +46,6 @@ #include "constants/event_objects.h" #include "constants/field_effects.h" #include "constants/items.h" -#include "constants/map_types.h" #include "constants/mauville_old_man.h" #include "constants/metatile_behaviors.h" #include "constants/rgb.h" @@ -821,10 +820,10 @@ static const u8 sJumpSpecialDirectionAnimNums[] = { // used for jumping onto sur [DIR_NORTH] = ANIM_GET_ON_OFF_POKEMON_NORTH, [DIR_WEST] = ANIM_GET_ON_OFF_POKEMON_WEST, [DIR_EAST] = ANIM_GET_ON_OFF_POKEMON_EAST, - [DIR_SOUTHWEST] = ANIM_GET_ON_OFF_POKEMON_SOUTH, - [DIR_SOUTHEAST] = ANIM_GET_ON_OFF_POKEMON_SOUTH, - [DIR_NORTHWEST] = ANIM_GET_ON_OFF_POKEMON_NORTH, - [DIR_NORTHEAST] = ANIM_GET_ON_OFF_POKEMON_NORTH, + [DIR_SOUTHWEST] = ANIM_GET_ON_OFF_POKEMON_WEST, + [DIR_SOUTHEAST] = ANIM_GET_ON_OFF_POKEMON_EAST, + [DIR_NORTHWEST] = ANIM_GET_ON_OFF_POKEMON_WEST, + [DIR_NORTHEAST] = ANIM_GET_ON_OFF_POKEMON_EAST, }; static const u8 sAcroWheelieDirectionAnimNums[] = { [DIR_NONE] = ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH, @@ -1069,6 +1068,10 @@ const u8 gJumpSpecialMovementActions[] = { MOVEMENT_ACTION_JUMP_SPECIAL_UP, MOVEMENT_ACTION_JUMP_SPECIAL_LEFT, MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT, + MOVEMENT_ACTION_JUMP_SPECIAL_LEFT, + MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT, + MOVEMENT_ACTION_JUMP_SPECIAL_LEFT, + MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT, }; const u8 gWalkInPlaceSlowMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN, @@ -1481,7 +1484,7 @@ u8 Unref_TryInitLocalObjectEvent(u8 localId) if (gMapHeader.events != NULL) { - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) objectEventCount = GetNumBattlePyramidObjectEvents(); else if (InTrainerHill()) objectEventCount = HILL_TRAINERS_PER_FLOOR; @@ -1924,8 +1927,15 @@ u8 CreateVirtualObject(u16 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 elevati x += MAP_OFFSET; y += MAP_OFFSET; SetSpritePosToOffsetMapCoords(&x, &y, 8, 16); - if (spriteTemplate.paletteTag != TAG_NONE) + if (spriteTemplate.paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) + { + u32 paletteNum = LoadDynamicFollowerPaletteFromGraphicsId(graphicsId, &spriteTemplate); + spriteTemplate.paletteTag = GetSpritePaletteTagByPaletteNum(paletteNum); + } + else if (spriteTemplate.paletteTag != TAG_NONE) + { LoadObjectEventPalette(spriteTemplate.paletteTag); + } spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0); if (spriteId != MAX_SPRITES) @@ -1939,6 +1949,9 @@ u8 CreateVirtualObject(u16 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 elevati sprite->sVirtualObjId = virtualObjId; sprite->sVirtualObjElev = elevation; + if (OW_GFX_COMPRESS && graphicsInfo->compressed) + spriteTemplate.tileTag = LoadSheetGraphicsInfo(graphicsInfo, graphicsId, sprite); + if (subspriteTables != NULL) { SetSubspriteTables(sprite, subspriteTables); @@ -2052,19 +2065,7 @@ static u32 LoadDynamicFollowerPalette(u32 species, bool32 shiny, bool32 female) spritePalette.data = gSpeciesInfo[species].overworldPalette; } - // Check if pal data must be decompressed - if (IsLZ77Data(spritePalette.data, PLTT_SIZE_4BPP, PLTT_SIZE_4BPP)) - { - struct SpritePalette compSpritePalette; - - compSpritePalette.data = (const void *) spritePalette.data; - compSpritePalette.tag = spritePalette.tag; - paletteNum = LoadSpritePalette(&compSpritePalette); - } - else - { - paletteNum = LoadSpritePalette(&spritePalette); - } + paletteNum = LoadSpritePalette(&spritePalette); } else #endif //OW_POKEMON_OBJECT_EVENTS == TRUE && OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE @@ -2280,7 +2281,7 @@ bool32 IsFollowerVisible(void) static bool8 SpeciesHasType(u16 species, u8 type) { - return gSpeciesInfo[species].types[0] == type || gSpeciesInfo[species].types[1] == type; + return GetSpeciesType(species, 0) == type || GetSpeciesType(species, 1) == type; } // Display an emote above an object event @@ -2335,7 +2336,12 @@ bool32 CheckMsgCondition(const struct MsgCondition *cond, struct Pokemon *mon, u switch (cond->type) { case MSG_COND_SPECIES: - return (cond->data.raw == species); + multi = cond->data.split.hw; + // if byte nonzero, invert; check != species! + if (cond->data.split.b) + return (cond->data.split.hw != species); + else + return (cond->data.split.hw == species); case MSG_COND_TYPE: multi = (SpeciesHasType(species, cond->data.bytes[0]) || SpeciesHasType(species, cond->data.bytes[1])); @@ -2621,37 +2627,29 @@ void UpdateLightSprite(struct Sprite *sprite) return; } - // Note: Don't set window registers during hardware fade! - switch (sprite->sLightType) + if (sprite->sLightType == LIGHT_TYPE_BALL) { - default: - case LIGHT_TYPE_BALL: if (gPaletteFade.active) // if palette fade is active, don't flicker since the timer won't be updated { - Weather_SetBlendCoeffs(7, BASE_SHADOW_INTENSITY); sprite->invisible = FALSE; } else if (gPlayerAvatar.tileTransitionState) { - Weather_SetBlendCoeffs(7, BASE_SHADOW_INTENSITY); // As long as the second coefficient stays 12, shadows will not change sprite->invisible = FALSE; if (GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum) == OBJ_EVENT_PAL_TAG_LIGHT_2) LoadSpritePaletteInSlot(&sObjectEventSpritePalettes[FindObjectEventPaletteIndexByTag(OBJ_EVENT_PAL_TAG_LIGHT)], sprite->oam.paletteNum); } else if ((sprite->invisible = gTimeUpdateCounter & 1)) { - Weather_SetBlendCoeffs(7, BASE_SHADOW_INTENSITY); sprite->invisible = FALSE; if (GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum) == OBJ_EVENT_PAL_TAG_LIGHT_2) LoadSpritePaletteInSlot(&sObjectEventSpritePalettes[FindObjectEventPaletteIndexByTag(OBJ_EVENT_PAL_TAG_LIGHT)], sprite->oam.paletteNum); } - break; - case LIGHT_TYPE_PKMN_CENTER_SIGN: - case LIGHT_TYPE_POKE_MART_SIGN: - Weather_SetBlendCoeffs(12, BASE_SHADOW_INTENSITY); + } else { sprite->invisible = FALSE; - break; } + // Note: Don't set window registers during hardware fade! + Weather_SetBlendCoeffs(7, BASE_SHADOW_INTENSITY); } // Spawn a light at a map coordinate @@ -2719,7 +2717,7 @@ void TrySpawnLightSprites(s16 camX, s16 camY) if (gMapHeader.events == NULL) return; - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) objectCount = GetNumBattlePyramidObjectEvents(); else if (InTrainerHill()) objectCount = 2; @@ -2751,7 +2749,7 @@ void TrySpawnObjectEvents(s16 cameraX, s16 cameraY) s16 top = gSaveBlock1Ptr->pos.y; s16 bottom = gSaveBlock1Ptr->pos.y + MAP_OFFSET_H + 2; - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) objectCount = GetNumBattlePyramidObjectEvents(); else if (InTrainerHill()) objectCount = HILL_TRAINERS_PER_FLOOR; @@ -5504,7 +5502,7 @@ static bool32 TryStartFollowerTransformEffect(struct ObjectEvent *objectEvent, s { u32 multi; struct Pokemon *mon; - u32 ability; + enum Ability ability; if (DoesSpeciesHaveFormChangeMethod(OW_SPECIES(objectEvent), FORM_CHANGE_OVERWORLD_WEATHER) && OW_SPECIES(objectEvent) != (multi = GetOverworldWeatherSpecies(OW_SPECIES(objectEvent)))) { @@ -6595,7 +6593,7 @@ bool8 ObjectEventIsHeldMovementActive(struct ObjectEvent *objectEvent) static u8 TryUpdateMovementActionOnStairs(struct ObjectEvent *objectEvent, u8 movementActionId) { - if (objectEvent->isPlayer || objectEvent->localId == OBJ_EVENT_ID_FOLLOWER) + if (objectEvent->isPlayer || objectEvent->localId == OBJ_EVENT_ID_FOLLOWER || objectEvent->localId == OBJ_EVENT_ID_NPC_FOLLOWER) return movementActionId; // handled separately if (!ObjectMovingOnRockStairs(objectEvent, objectEvent->movementDirection)) @@ -11349,6 +11347,41 @@ bool8 MovementAction_WalkSlowStairsUp_Step1(struct ObjectEvent *objectEvent, str return FALSE; } +// fast diagonal +bool8 MovementAction_WalkFastDiagonalUpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + InitMovementNormal(objectEvent, sprite, DIR_NORTHWEST, 1); + return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite); +} + +bool8 MovementAction_WalkFastDiagonalUpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + InitMovementNormal(objectEvent, sprite, DIR_NORTHEAST, 1); + return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite); +} + +bool8 MovementAction_WalkFastDiagonalDownLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + InitMovementNormal(objectEvent, sprite, DIR_SOUTHWEST, 1); + return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite); +} + +bool8 MovementAction_WalkFastDiagonalDownRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + InitMovementNormal(objectEvent, sprite, DIR_SOUTHEAST, 1); + return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite); +} + +bool8 MovementAction_WalkFastDiagonal_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + if (UpdateMovementNormal(objectEvent, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + bool8 MovementAction_WalkSlowStairsDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitWalkSlow(objectEvent, sprite, DIR_SOUTH); @@ -11503,3 +11536,8 @@ bool8 MovementAction_SurfStillRight_Step1(struct ObjectEvent *objectEvent, struc } return FALSE; } + +u8 GetObjectEventApricornTreeId(u8 objectEventId) +{ + return gObjectEvents[objectEventId].trainerRange_berryTreeId; +} diff --git a/src/evolution_graphics.c b/src/evolution_graphics.c index 1568c18d5fba..f05cd8c9166b 100644 --- a/src/evolution_graphics.c +++ b/src/evolution_graphics.c @@ -39,7 +39,7 @@ static void EndOnPostEvoMon(u8 taskId); #define TAG_SPARKLE 1001 static const u16 sEvoSparkle_Pal[] = INCBIN_U16("graphics/misc/evo_sparkle.gbapal"); -static const u32 sEvoSparkle_Gfx[] = INCBIN_U32("graphics/misc/evo_sparkle.4bpp.lz"); +static const u32 sEvoSparkle_Gfx[] = INCBIN_U32("graphics/misc/evo_sparkle.4bpp.smol"); static const struct CompressedSpriteSheet sEvoSparkleSpriteSheets[] = { diff --git a/src/evolution_scene.c b/src/evolution_scene.c index d0dbb688fa98..fb3e79a655e5 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -67,9 +67,9 @@ static void Task_AnimateBg(u8 taskId); static void RestoreBgAfterAnim(void); static const u16 sUnusedPal1[] = INCBIN_U16("graphics/evolution_scene/unused_1.gbapal"); -static const u32 sBgAnim_Gfx[] = INCBIN_U32("graphics/evolution_scene/bg.4bpp.lz"); -static const u32 sBgAnim_Inner_Tilemap[] = INCBIN_U32("graphics/evolution_scene/bg_inner.bin.lz"); -static const u32 sBgAnim_Outer_Tilemap[] = INCBIN_U32("graphics/evolution_scene/bg_outer.bin.lz"); +static const u32 sBgAnim_Gfx[] = INCBIN_U32("graphics/evolution_scene/bg.4bpp.smol"); +static const u32 sBgAnim_Inner_Tilemap[] = INCBIN_U32("graphics/evolution_scene/bg_inner.bin.smolTM"); +static const u32 sBgAnim_Outer_Tilemap[] = INCBIN_U32("graphics/evolution_scene/bg_outer.bin.smolTM"); static const u16 sBgAnim_Intro_Pal[] = INCBIN_U16("graphics/evolution_scene/bg_anim_intro.gbapal"); static const u16 sUnusedPal2[] = INCBIN_U16("graphics/evolution_scene/unused_2.gbapal"); static const u16 sUnusedPal3[] = INCBIN_U16("graphics/evolution_scene/unused_3.gbapal"); @@ -910,7 +910,7 @@ static void Task_EvolutionScene(u8 taskId) BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3]); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gTasks[taskId].tLearnMoveYesState = MVSTATE_SHOW_MOVE_SELECT; - gTasks[taskId].tLearnMoveNoState = MVSTATE_ASK_CANCEL; + gTasks[taskId].tLearnMoveNoState = (P_ASK_MOVE_CONFIRMATION) ? MVSTATE_ASK_CANCEL : MVSTATE_CANCEL; gTasks[taskId].tLearnMoveState++; } case MVSTATE_PRINT_YES_NO: @@ -986,13 +986,13 @@ static void Task_EvolutionScene(u8 taskId) if (var == MAX_MON_MOVES) { // Didn't select move slot - gTasks[taskId].tLearnMoveState = MVSTATE_ASK_CANCEL; + gTasks[taskId].tLearnMoveState = (P_ASK_MOVE_CONFIRMATION) ? MVSTATE_ASK_CANCEL : MVSTATE_CANCEL; } else { // Selected move to forget u16 move = GetMonData(mon, var + MON_DATA_MOVE1); - if (IsMoveHM(move)) + if (CannotForgetMove(move)) { // Can't forget HMs BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN]); @@ -1313,7 +1313,7 @@ static void Task_TradeEvolutionScene(u8 taskId) BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tLearnMoveYesState = T_MVSTATE_SHOW_MOVE_SELECT; - gTasks[taskId].tLearnMoveNoState = T_MVSTATE_ASK_CANCEL; + gTasks[taskId].tLearnMoveNoState = (P_ASK_MOVE_CONFIRMATION) ? T_MVSTATE_ASK_CANCEL : T_MVSTATE_CANCEL; gTasks[taskId].tLearnMoveState++; } case T_MVSTATE_PRINT_YES_NO: @@ -1370,13 +1370,13 @@ static void Task_TradeEvolutionScene(u8 taskId) if (var == MAX_MON_MOVES) { // Didn't select move slot - gTasks[taskId].tLearnMoveState = T_MVSTATE_ASK_CANCEL; + gTasks[taskId].tLearnMoveState = (P_ASK_MOVE_CONFIRMATION) ? T_MVSTATE_ASK_CANCEL : T_MVSTATE_CANCEL; } else { // Selected move to forget u16 move = GetMonData(mon, var + MON_DATA_MOVE1); - if (IsMoveHM(move)) + if (CannotForgetMove(move)) { // Can't forget HMs BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN]); diff --git a/src/expansion_intro.c b/src/expansion_intro.c index f656c4ff5e8d..d7b4cd715433 100644 --- a/src/expansion_intro.c +++ b/src/expansion_intro.c @@ -52,13 +52,13 @@ enum ANIM_DIZZY_DIZZY }; -static const u32 sBgTiles_PoweredBy[] = INCBIN_U32("graphics/expansion_intro/powered_by.4bpp.lz"); -static const u32 sBgTiles_RhhCredits[] = INCBIN_U32("graphics/expansion_intro/rhh_credits.8bpp.lz"); -static const u32 sBgMap_PoweredBy[] = INCBIN_U32("graphics/expansion_intro/powered_by.bin.lz"); -static const u32 sBgMap_RhhCredits[] = INCBIN_U32("graphics/expansion_intro/rhh_credits.bin.lz"); +static const u32 sBgTiles_PoweredBy[] = INCBIN_U32("graphics/expansion_intro/powered_by.4bpp.smol"); +static const u32 sBgTiles_RhhCredits[] = INCBIN_U32("graphics/expansion_intro/rhh_credits.8bpp.smol"); +static const u32 sBgMap_PoweredBy[] = INCBIN_U32("graphics/expansion_intro/powered_by.bin.smolTM"); +static const u32 sBgMap_RhhCredits[] = INCBIN_U32("graphics/expansion_intro/rhh_credits.bin.smolTM"); static const u16 sBgPal_Credits[] = INCBIN_U16("graphics/expansion_intro/credits.gbapal"); -static const u32 sSpriteTiles_DizzyEgg[] = INCBIN_U32("graphics/expansion_intro/sprites/dizzy_egg.4bpp.lz"); -static const u32 sSpriteTiles_Porygon[] = INCBIN_U32("graphics/expansion_intro/sprites/porygon.4bpp.lz"); +static const u32 sSpriteTiles_DizzyEgg[] = INCBIN_U32("graphics/expansion_intro/sprites/dizzy_egg.4bpp.smol"); +static const u32 sSpriteTiles_Porygon[] = INCBIN_U32("graphics/expansion_intro/sprites/porygon.4bpp.smol"); static const u16 sSpritePal_DizzyEgg[] = INCBIN_U16("graphics/expansion_intro/sprites/dizzy_egg.gbapal"); static const u16 sSpritePal_Porygon[] = INCBIN_U16("graphics/expansion_intro/sprites/porygon.gbapal"); static const u16 sSpritePal_PorygonShiny[] = INCBIN_U16("graphics/expansion_intro/sprites/shiny.gbapal"); @@ -308,10 +308,10 @@ static void ExpansionIntro_InitBgs(void) static void ExpansionIntro_LoadGraphics(void) { - LZ77UnCompVram(sBgTiles_PoweredBy, (void*) BG_CHAR_ADDR(sBgTemplates_RhhCopyrightScreen[EXPANSION_INTRO_BG3].charBaseIndex)); - LZ77UnCompVram(sBgMap_PoweredBy, (u16*) BG_SCREEN_ADDR(sBgTemplates_RhhCopyrightScreen[EXPANSION_INTRO_BG3].mapBaseIndex)); - LZ77UnCompVram(sBgTiles_RhhCredits, (void*) BG_CHAR_ADDR(sBgTemplates_RhhCopyrightScreen[EXPANSION_INTRO_BG2].charBaseIndex)); - LZ77UnCompVram(sBgMap_RhhCredits, (u16*) BG_SCREEN_ADDR(sBgTemplates_RhhCopyrightScreen[EXPANSION_INTRO_BG2].mapBaseIndex)); + DecompressDataWithHeaderVram(sBgTiles_PoweredBy, (void*) BG_CHAR_ADDR(sBgTemplates_RhhCopyrightScreen[EXPANSION_INTRO_BG3].charBaseIndex)); + DecompressDataWithHeaderVram(sBgMap_PoweredBy, (u16*) BG_SCREEN_ADDR(sBgTemplates_RhhCopyrightScreen[EXPANSION_INTRO_BG3].mapBaseIndex)); + DecompressDataWithHeaderVram(sBgTiles_RhhCredits, (void*) BG_CHAR_ADDR(sBgTemplates_RhhCopyrightScreen[EXPANSION_INTRO_BG2].charBaseIndex)); + DecompressDataWithHeaderVram(sBgMap_RhhCredits, (u16*) BG_SCREEN_ADDR(sBgTemplates_RhhCopyrightScreen[EXPANSION_INTRO_BG2].mapBaseIndex)); LoadPalette(sBgPal_Credits, 0x00, 0x60); LoadCompressedSpriteSheet(&sSpriteSheet_DizzyEgg); diff --git a/src/faraway_island.c b/src/faraway_island.c index e275bcfa374b..67acf5cc6d8c 100755 --- a/src/faraway_island.c +++ b/src/faraway_island.c @@ -393,6 +393,7 @@ void SetMewAboveGrass(void) LoadSpritePalette(&gSpritePalette_GeneralFieldEffect1); UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(gSpritePalette_GeneralFieldEffect1.tag), FALSE); + gSprites[mew->spriteId].subspriteTableNum = 1; x = mew->currentCoords.x; y = mew->currentCoords.y; diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index a83990cc586d..f35c349fc6b1 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -12,6 +12,8 @@ #include "fieldmap.h" #include "field_control_avatar.h" #include "field_message_box.h" +#include "field_move.h" +#include "field_effect.h" #include "field_player_avatar.h" #include "field_poison.h" #include "field_screen_effect.h" @@ -36,7 +38,6 @@ #include "constants/event_bg.h" #include "constants/event_objects.h" #include "constants/field_poison.h" -#include "constants/map_types.h" #include "constants/metatile_behaviors.h" #include "constants/songs.h" #include "constants/trainer_hill.h" @@ -521,6 +522,8 @@ static const u8 *GetInteractedMetatileScript(struct MapPosition *position, u8 me SetMsgSignPostAndVarFacing(direction); return Common_EventScript_ShowPokemonCenterSign; } + if (MetatileBehavior_IsRockClimbable(metatileBehavior) == TRUE && !IsRockClimbActive()) + return EventScript_UseRockClimb; elevation = position->elevation; if (elevation == MapGridGetElevationAt(position->x, position->y)) @@ -560,7 +563,7 @@ static const u8 *GetInteractedMetatileScript(struct MapPosition *position, u8 me static const u8 *GetInteractedWaterScript(struct MapPosition *unused1, u8 metatileBehavior, u8 direction) { - if (FlagGet(FLAG_BADGE05_GET) == TRUE && PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE + if (IsFieldMoveUnlocked(FIELD_MOVE_SURF) && PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE && CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_SURF) ) return EventScript_UseSurf; @@ -569,7 +572,7 @@ static const u8 *GetInteractedWaterScript(struct MapPosition *unused1, u8 metati && CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_WATERFALL) ) { - if (FlagGet(FLAG_BADGE08_GET) == TRUE && IsPlayerSurfingNorth() == TRUE) + if (IsFieldMoveUnlocked(FIELD_MOVE_WATERFALL) && IsPlayerSurfingNorth() == TRUE) return EventScript_UseWaterfall; else return EventScript_CannotUseWaterfall; @@ -582,7 +585,7 @@ static bool32 TrySetupDiveDownScript(void) if (!CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_DIVE)) return FALSE; - if (FlagGet(FLAG_BADGE07_GET) && TrySetDiveWarp() == 2) + if (IsFieldMoveUnlocked(FIELD_MOVE_DIVE) && TrySetDiveWarp() == 2) { ScriptContext_SetupScript(EventScript_UseDive); return TRUE; @@ -595,7 +598,7 @@ static bool32 TrySetupDiveEmergeScript(void) if (!CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_DIVE)) return FALSE; - if (FlagGet(FLAG_BADGE07_GET) && gMapHeader.mapType == MAP_TYPE_UNDERWATER && TrySetDiveWarp() == 1) + if (IsFieldMoveUnlocked(FIELD_MOVE_DIVE) && gMapHeader.mapType == MAP_TYPE_UNDERWATER && TrySetDiveWarp() == 1) { ScriptContext_SetupScript(EventScript_UseDiveUnderwater); return TRUE; diff --git a/src/field_effect.c b/src/field_effect.c index 1f2feaba8fa9..174c071ae432 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -19,6 +19,7 @@ #include "mirage_tower.h" #include "menu.h" #include "metatile_behavior.h" +#include "oras_dowse.h" #include "overworld.h" #include "palette.h" #include "party_menu.h" @@ -38,7 +39,6 @@ #include "constants/metatile_behaviors.h" #include "constants/rgb.h" #include "constants/songs.h" -#include "constants/map_types.h" #define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))} @@ -246,6 +246,18 @@ static void UseVsSeeker_DoPlayerAnimation(struct Task *task); static void UseVsSeeker_ResetPlayerGraphics(struct Task *task); static void UseVsSeeker_CleanUpFieldEffect(struct Task *task); +static void Task_UseRockClimb(u8); +static bool8 RockClimb_Init(struct Task *, struct ObjectEvent *); +static bool8 RockClimb_FieldMovePose(struct Task *, struct ObjectEvent *); +static bool8 RockClimb_ShowMon(struct Task *, struct ObjectEvent *); +static bool8 RockClimb_JumpOnRockClimbBlob(struct Task *task, struct ObjectEvent *objectEvent); +static bool8 RockClimb_WaitJumpOnRockClimbBlob(struct Task *task, struct ObjectEvent *objectEvent); +static bool8 RockClimb_Ride(struct Task *task, struct ObjectEvent *objectEvent); +//static bool8 RockClimb_RideUp(struct Task *, struct ObjectEvent *); +//static bool8 RockClimb_RideDown(struct Task *, struct ObjectEvent *); +static bool8 RockClimb_ContinueRideOrEnd(struct Task *, struct ObjectEvent *); +static bool8 RockClimb_WaitStopRockClimb(struct Task *task, struct ObjectEvent *objectEvent); +static bool8 RockClimb_StopRockClimbInit(struct Task *task, struct ObjectEvent *objectEvent); // Static RAM declarations static u8 sActiveList[32]; @@ -930,7 +942,7 @@ u8 CreateTrainerSprite(u8 trainerSpriteID, s16 x, s16 y, u8 subpriority, u8 *buf static void UNUSED LoadTrainerGfx_TrainerCard(u8 gender, u16 palOffset, u8 *dest) { - LZDecompressVram(gTrainerSprites[gender].frontPic.data, dest); + DecompressDataWithHeaderVram(gTrainerSprites[gender].frontPic.data, dest); LoadPalette(gTrainerSprites[gender].palette.data, palOffset, PLTT_SIZE_4BPP); } @@ -1650,7 +1662,7 @@ static bool8 FallWarpEffect_End(struct Task *task) #define tState data[0] #define tGoingUp data[1] -static void HideFollowerForFieldEffect(void) +void HideFollowerForFieldEffect(void) { struct ObjectEvent *followerObj = GetFollowerObject(); if (!followerObj || followerObj->invisible) @@ -1668,6 +1680,7 @@ void StartEscalatorWarp(u8 metatileBehavior, u8 priority) { gTasks[taskId].tGoingUp = TRUE; } + EndORASDowsing(); } static void Task_EscalatorWarpOut(u8 taskId) @@ -2054,6 +2067,7 @@ static bool8 DiveFieldEffect_TryWarp(struct Task *task) void StartLavaridgeGymB1FWarp(u8 priority) { + EndORASDowsing(); CreateTask(Task_LavaridgeGymB1FWarp, priority); } @@ -2262,6 +2276,7 @@ void SpriteCB_AshLaunch(struct Sprite *sprite) void StartLavaridgeGym1FWarp(u8 priority) { + EndORASDowsing(); CreateTask(Task_LavaridgeGym1FWarp, priority); } @@ -2384,6 +2399,7 @@ void StartEscapeRopeFieldEffect(void) LockPlayerFieldControls(); FreezeObjectEvents(); HideFollowerForFieldEffect(); // hide follower before warping + EndORASDowsing(); CreateTask(Task_EscapeRopeWarpOut, 80); } @@ -2578,6 +2594,7 @@ static void TeleportWarpOutFieldEffect_Init(struct Task *task) LockPlayerFieldControls(); FreezeObjectEvents(); CameraObjectFreeze(); + EndORASDowsing(); task->data[15] = GetPlayerFacingDirection(); task->tState++; } @@ -4157,6 +4174,263 @@ u8 FldEff_CaveDust(void) return spriteId; } +// ROCK CLIMB +enum RockClimbState +{ + STATE_ROCK_CLIMB_INIT, + STATE_ROCK_CLIMB_POSE, + STATE_ROCK_CLIMB_SHOW_MON, + STATE_ROCK_CLIMB_JUMP_ON, + STATE_ROCK_CLIMB_WAIT_JUMP, + STATE_ROCK_CLIMB_RIDE, + STATE_ROCK_CLIMB_CONTINUE_RIDE, + STATE_ROCK_CLIMB_STOP_INIT, + STATE_ROCK_CLIMB_WAIT_STOP +}; + +#define tState data[0] +#define tDestX data[1] +#define tDestY data[2] +#define tMonId data[15] + +static u8 CreateRockClimbBlob(void) +{ + u8 spriteId; + struct Sprite *sprite; + + SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ROCK_CLIMB_BLOB], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x96); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.paletteNum = LoadPlayerObjectEventPalette(gSaveBlock2Ptr->playerGender); + sprite->data[2] = gFieldEffectArguments[2]; + sprite->data[3] = -1; + sprite->data[6] = -1; + sprite->data[7] = -1; + } + + return spriteId; +} + +bool8 (*const sRockClimbFieldEffectFuncs[])(struct Task *, struct ObjectEvent *) = +{ + [STATE_ROCK_CLIMB_INIT] = RockClimb_Init, + [STATE_ROCK_CLIMB_POSE] = RockClimb_FieldMovePose, + [STATE_ROCK_CLIMB_SHOW_MON] = RockClimb_ShowMon, + [STATE_ROCK_CLIMB_JUMP_ON] = RockClimb_JumpOnRockClimbBlob, + [STATE_ROCK_CLIMB_WAIT_JUMP] = RockClimb_WaitJumpOnRockClimbBlob, + [STATE_ROCK_CLIMB_RIDE] = RockClimb_Ride, + [STATE_ROCK_CLIMB_CONTINUE_RIDE] = RockClimb_ContinueRideOrEnd, + [STATE_ROCK_CLIMB_STOP_INIT] = RockClimb_StopRockClimbInit, + [STATE_ROCK_CLIMB_WAIT_STOP] = RockClimb_WaitStopRockClimb +}; + +bool8 FldEff_UseRockClimb(void) +{ + u8 taskId; + taskId = CreateTask(Task_UseRockClimb, 0xff); + gTasks[taskId].tMonId = gFieldEffectArguments[0]; + Task_UseRockClimb(taskId); + return FALSE; +} + +static void Task_UseRockClimb(u8 taskId) +{ + while (sRockClimbFieldEffectFuncs[gTasks[taskId].tState](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId])); +} + +static bool8 RockClimb_Init(struct Task *task, struct ObjectEvent *objectEvent) +{ + LockPlayerFieldControls(); + FreezeObjectEvents(); + // Put follower into pokeball before using Rock Climb + HideFollowerForFieldEffect(); + gPlayerAvatar.preventStep = TRUE; + SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_SURFING); + PlayerGetDestCoords(&task->tDestX, &task->tDestY); + MoveCoords(gObjectEvents[gPlayerAvatar.objectEventId].movementDirection, &task->tDestX, &task->tDestY); + task->tState++; + return FALSE; +} + +static bool8 RockClimb_FieldMovePose(struct Task *task, struct ObjectEvent *objectEvent) +{ + if (!ObjectEventIsMovementOverridden(objectEvent) || ObjectEventClearHeldMovementIfFinished(objectEvent)) + { + SetPlayerAvatarFieldMove(); + ObjectEventSetHeldMovement(objectEvent, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION); + task->tState++; + } + return FALSE; +} + +static bool8 RockClimb_ShowMon(struct Task *task, struct ObjectEvent *objectEvent) +{ + if (ObjectEventCheckHeldMovementStatus(objectEvent)) + { + gFieldEffectArguments[0] = task->tMonId | 0x80000000; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + task->tState++; + return TRUE; + } + return FALSE; +} + +static bool8 RockClimb_JumpOnRockClimbBlob(struct Task *task, struct ObjectEvent *objectEvent) +{ + if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + objectEvent->noShadow = TRUE; // hide shadow + ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_SURFING)); + ObjectEventClearHeldMovementIfFinished(objectEvent); + ObjectEventSetHeldMovement(objectEvent, GetJumpSpecialMovementAction(objectEvent->movementDirection)); + gFieldEffectArguments[0] = task->tDestX; + gFieldEffectArguments[1] = task->tDestY; + gFieldEffectArguments[2] = gPlayerAvatar.objectEventId; + objectEvent->fieldEffectSpriteId = CreateRockClimbBlob(); + task->tState++; + } + + return FALSE; +} + +static bool8 RockClimb_WaitJumpOnRockClimbBlob(struct Task *task, struct ObjectEvent *objectEvent) +{ + if (ObjectEventClearHeldMovementIfFinished(objectEvent)) + { + SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, BOB_PLAYER_AND_MON); + switch (objectEvent->facingDirection) + { + case DIR_EAST: + //check southeast then northeast + if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(task->tDestX + 1, task->tDestY + 1))) + objectEvent->movementDirection = DIR_SOUTHEAST; + else if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(task->tDestX + 1, task->tDestY - 1))) + objectEvent->movementDirection = DIR_NORTHEAST; + break; + case DIR_WEST: + //check northwest then southwest + if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(task->tDestX - 1, task->tDestY - 1))) + objectEvent->movementDirection = DIR_NORTHWEST; + else if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(task->tDestX - 1, task->tDestY + 1))) + objectEvent->movementDirection = DIR_SOUTHWEST; + break; + } + + task->tState = STATE_ROCK_CLIMB_CONTINUE_RIDE; + } + + return FALSE; +} + +struct RockClimbRide +{ + u8 action; + s8 dx; + s8 dy; + u8 jumpDir; +}; +static const struct RockClimbRide sRockClimbMovement[] = +{ + [DIR_NONE] = {MOVEMENT_ACTION_WALK_FAST_DOWN, 0, 0, DIR_NONE}, + [DIR_SOUTH] = {MOVEMENT_ACTION_WALK_FAST_DOWN, 0, -1, DIR_SOUTH}, + [DIR_NORTH] = {MOVEMENT_ACTION_WALK_FAST_UP, 0, 1, DIR_NORTH}, + [DIR_WEST] = {MOVEMENT_ACTION_WALK_FAST_LEFT, 1, 1, DIR_WEST}, + [DIR_EAST] = {MOVEMENT_ACTION_WALK_FAST_RIGHT, -1, -1, DIR_EAST}, + [DIR_SOUTHWEST] = {MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_LEFT, 1, -1, DIR_WEST}, + [DIR_SOUTHEAST] = {MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_RIGHT, -1, -1, DIR_EAST}, + [DIR_NORTHWEST] = {MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_LEFT, 1, 1, DIR_WEST}, + [DIR_NORTHEAST] = {MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_RIGHT, -1, 1, DIR_EAST}, +}; + +static void RockClimbDust(struct ObjectEvent *objectEvent, u8 direction) +{ + s8 dx = sRockClimbMovement[direction].dx; + s8 dy = sRockClimbMovement[direction].dy; + + gFieldEffectArguments[0] = objectEvent->currentCoords.x + dx; + gFieldEffectArguments[1] = objectEvent->currentCoords.y + dy; + gFieldEffectArguments[2] = objectEvent->previousElevation; + gFieldEffectArguments[3] = gSprites[objectEvent->spriteId].oam.priority; + FieldEffectStart(FLDEFF_ROCK_CLIMB_DUST); +} + +static bool8 RockClimb_Ride(struct Task *task, struct ObjectEvent *objectEvent) +{ + ObjectEventSetHeldMovement(objectEvent, sRockClimbMovement[objectEvent->movementDirection].action); + PlaySE(SE_M_ROCK_THROW); + RockClimbDust(objectEvent, objectEvent->movementDirection); + task->tState++; + return FALSE; +} + +static bool8 RockClimb_ContinueRideOrEnd(struct Task *task, struct ObjectEvent *objectEvent) +{ + if (!ObjectEventClearHeldMovementIfFinished(objectEvent)) + return FALSE; + + PlayerGetDestCoords(&task->tDestX, &task->tDestY); + MoveCoords(objectEvent->movementDirection, &task->tDestX, &task->tDestY); + if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(task->tDestX, task->tDestY))) + { + task->tState = STATE_ROCK_CLIMB_RIDE; + return TRUE; + } + + LockPlayerFieldControls(); + gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_SURFING; + gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_ON_FOOT; + task->tState++; + return FALSE; +} + +static bool8 RockClimb_StopRockClimbInit(struct Task *task, struct ObjectEvent *objectEvent) +{ + if (ObjectEventIsMovementOverridden(objectEvent)) + { + if (!ObjectEventClearHeldMovementIfFinished(objectEvent)) + return FALSE; + } + + RockClimbDust(objectEvent, DIR_NONE); //dust on final spot + ObjectEventSetHeldMovement(objectEvent, GetJumpSpecialMovementAction(sRockClimbMovement[objectEvent->movementDirection].jumpDir)); + SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, BOB_NONE); + task->tState++; + return TRUE; +} + +static bool8 RockClimb_WaitStopRockClimb(struct Task *task, struct ObjectEvent *objectEvent) +{ + struct ObjectEvent *followerObject = GetFollowerObject(); + if (ObjectEventClearHeldMovementIfFinished(objectEvent)) + { + ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_NORMAL)); + ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(objectEvent->facingDirection)); + gPlayerAvatar.preventStep = FALSE; + if (followerObject) + ObjectEventClearHeldMovementIfFinished(followerObject); // restore follower to normal + objectEvent->noShadow = FALSE; // restore shadow + UnfreezeObjectEvents(); + UnlockPlayerFieldControls(); + DestroySprite(&gSprites[objectEvent->fieldEffectSpriteId]); + FieldEffectActiveListRemove(FLDEFF_USE_ROCK_CLIMB); + objectEvent->triggerGroundEffectsOnMove = TRUE; // e.g. if dismount on grass + DestroyTask(FindTaskIdByFunc(Task_UseRockClimb)); + } + + return FALSE; +} + +bool8 IsRockClimbActive(void) +{ + if (FieldEffectActiveListContains(FLDEFF_USE_ROCK_CLIMB)) + return TRUE; + else + return FALSE; +} + #undef tState #undef tSpriteId #undef tTargetX diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index f7a6531ec281..f5f62a236752 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -35,8 +35,8 @@ static void UpdateFeetInFlowingWaterFieldEffect(struct Sprite *); static void UpdateAshFieldEffect_Wait(struct Sprite *); static void UpdateAshFieldEffect_Show(struct Sprite *); static void UpdateAshFieldEffect_End(struct Sprite *); -static void SynchroniseSurfAnim(struct ObjectEvent *, struct Sprite *); -static void SynchroniseSurfPosition(struct ObjectEvent *, struct Sprite *); +static void SynchronizeSurfAnim(struct ObjectEvent *, struct Sprite *); +static void SynchronizeSurfPosition(struct ObjectEvent *, struct Sprite *); static void UpdateBobbingEffect(struct ObjectEvent *, struct Sprite *, struct Sprite *); static void SpriteCB_UnderwaterSurfBlob(struct Sprite *); static u32 ShowDisguiseFieldEffect(u8, u8, u8); @@ -1248,13 +1248,13 @@ void UpdateSurfBlobFieldEffect(struct Sprite *sprite) { struct ObjectEvent *playerObj = &gObjectEvents[sprite->sPlayerObjId]; struct Sprite *playerSprite = &gSprites[playerObj->spriteId]; - SynchroniseSurfAnim(playerObj, sprite); - SynchroniseSurfPosition(playerObj, sprite); + SynchronizeSurfAnim(playerObj, sprite); + SynchronizeSurfPosition(playerObj, sprite); UpdateBobbingEffect(playerObj, playerSprite, sprite); sprite->oam.priority = playerSprite->oam.priority; } -static void SynchroniseSurfAnim(struct ObjectEvent *playerObj, struct Sprite *sprite) +static void SynchronizeSurfAnim(struct ObjectEvent *playerObj, struct Sprite *sprite) { // Indexes into sAnimTable_SurfBlob u8 surfBlobDirectionAnims[] = { @@ -1263,17 +1263,17 @@ static void SynchroniseSurfAnim(struct ObjectEvent *playerObj, struct Sprite *sp [DIR_NORTH] = 1, [DIR_WEST] = 2, [DIR_EAST] = 3, - [DIR_SOUTHWEST] = 0, - [DIR_SOUTHEAST] = 0, - [DIR_NORTHWEST] = 1, - [DIR_NORTHEAST] = 1, + [DIR_SOUTHWEST] = 2, + [DIR_SOUTHEAST] = 3, + [DIR_NORTHWEST] = 2, + [DIR_NORTHEAST] = 3, }; if (!GetSurfBlob_DontSyncAnim(sprite)) StartSpriteAnimIfDifferent(sprite, surfBlobDirectionAnims[playerObj->movementDirection]); } -void SynchroniseSurfPosition(struct ObjectEvent *playerObj, struct Sprite *sprite) +void SynchronizeSurfPosition(struct ObjectEvent *playerObj, struct Sprite *sprite) { u8 i; s16 x = playerObj->currentCoords.x; @@ -1389,6 +1389,24 @@ u32 FldEff_Dust(void) return 0; } +u32 FldEff_RockClimbDust(void) +{ + u8 spriteId; + struct Sprite *sprite; + + SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ROCK_CLIMB_DUST], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data[0] = gFieldEffectArguments[2]; + sprite->data[1] = FLDEFF_ROCK_CLIMB_DUST; + } + return 0; +} + // Sprite data for FLDEFF_SAND_PILE #define sLocalId data[0] #define sMapNum data[1] @@ -1885,4 +1903,3 @@ static void UpdateGrassFieldEffectSubpriority(struct Sprite *sprite, u8 elevatio } } } - diff --git a/src/field_message_box.c b/src/field_message_box.c index bf9ce1aa9317..6cac5218539c 100755 --- a/src/field_message_box.c +++ b/src/field_message_box.c @@ -7,6 +7,7 @@ #include "field_message_box.h" #include "text_window.h" #include "script.h" +#include "field_name_box.h" static EWRAM_DATA u8 sFieldMessageBoxMode = 0; EWRAM_DATA u8 gWalkAwayFromSignpostTimer = 0; @@ -39,9 +40,14 @@ static void Task_DrawFieldMessage(u8 taskId) task->tState++; break; case 1: - DrawDialogueFrame(0, TRUE); - task->tState++; - break; + { + u32 nameboxWinId = GetNameboxWindowId(); + DrawDialogueFrame(0, TRUE); + if (nameboxWinId != WINDOW_NONE) + DrawNamebox(nameboxWinId, NAME_BOX_BASE_TILE_NUM - NAME_BOX_BASE_TILES_TOTAL, TRUE); + task->tState++; + break; + } case 2: if (RunTextPrintersAndIsPrinter0Active() != TRUE) { @@ -123,6 +129,7 @@ bool8 ShowFieldMessageFromBuffer(void) static void ExpandStringAndStartDrawFieldMessage(const u8 *str, bool32 allowSkippingDelayWithButtonPress) { + TrySpawnNamebox(NAME_BOX_BASE_TILE_NUM); StringExpandPlaceholders(gStringVar4, str); AddTextPrinterForMessage(allowSkippingDelayWithButtonPress); CreateTask_DrawFieldMessage(); @@ -138,6 +145,7 @@ void HideFieldMessageBox(void) { DestroyTask_DrawFieldMessage(); ClearDialogWindowAndFrame(0, TRUE); + DestroyNamebox(); sFieldMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; } diff --git a/src/field_move.c b/src/field_move.c new file mode 100644 index 000000000000..49c81bec9ad6 --- /dev/null +++ b/src/field_move.c @@ -0,0 +1,226 @@ +#include "global.h" +#include "event_data.h" +#include "field_move.h" +#include "fldeff.h" +#include "fldeff_misc.h" +#include "party_menu.h" +#include "constants/field_move.h" +#include "constants/moves.h" +#include "constants/party_menu.h" + +static bool32 IsFieldMoveUnlocked_Cut(void) +{ + return FlagGet(FLAG_BADGE01_GET); +} + +static bool32 IsFieldMoveUnlocked_Flash(void) +{ + return FlagGet(FLAG_BADGE02_GET); +} + +static bool32 IsFieldMoveUnlocked_RockSmash(void) +{ + return FlagGet(FLAG_BADGE03_GET); +} + +static bool32 IsFieldMoveUnlocked_Strength(void) +{ + return FlagGet(FLAG_BADGE04_GET); +} + +static bool32 IsFieldMoveUnlocked_Surf(void) +{ + return FlagGet(FLAG_BADGE05_GET); +} + +static bool32 IsFieldMoveUnlocked_Fly(void) +{ + return FlagGet(FLAG_BADGE06_GET); +} + +static bool32 IsFieldMoveUnlocked_Dive(void) +{ + return FlagGet(FLAG_BADGE07_GET); +} + +static bool32 IsFieldMoveUnlocked_Waterfall(void) +{ + return FlagGet(FLAG_BADGE08_GET); +} + +#if OW_ROCK_CLIMB_FIELD_MOVE == TRUE +static bool32 IsFieldMoveUnlocked_RockClimb(void) +{ + return TRUE; +} +#endif + +static bool32 IsFieldMoveUnlocked_Teleport(void) +{ + return TRUE; +} + +static bool32 IsFieldMoveUnlocked_Dig(void) +{ + return TRUE; +} + +static bool32 IsFieldMoveUnlocked_SecretPower(void) +{ + return TRUE; +} + +static bool32 IsFieldMoveUnlocked_MilkDrink(void) +{ + return TRUE; +} + +static bool32 IsFieldMoveUnlocked_SoftBoiled(void) +{ + return TRUE; +} + +static bool32 IsFieldMoveUnlocked_SweetScent(void) +{ + return TRUE; +} + +#if OW_DEFOG_FIELD_MOVE == TRUE +static bool32 IsFieldMoveUnlocked_Defog(void) +{ + return TRUE; +} +#endif + +const struct FieldMoveInfo gFieldMoveInfo[FIELD_MOVES_COUNT] = +{ + [FIELD_MOVE_CUT] = + { + .fieldMoveFunc = SetUpFieldMove_Cut, + .isUnlockedFunc = IsFieldMoveUnlocked_Cut, + .moveID = MOVE_CUT, + .partyMsgID = PARTY_MSG_NOTHING_TO_CUT, + }, + + [FIELD_MOVE_FLASH] = + { + .fieldMoveFunc = SetUpFieldMove_Flash, + .isUnlockedFunc = IsFieldMoveUnlocked_Flash, + .moveID = MOVE_FLASH, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, + + [FIELD_MOVE_ROCK_SMASH] = + { + .fieldMoveFunc = SetUpFieldMove_RockSmash, + .isUnlockedFunc = IsFieldMoveUnlocked_RockSmash, + .moveID = MOVE_ROCK_SMASH, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, + + [FIELD_MOVE_STRENGTH] = + { + .fieldMoveFunc = SetUpFieldMove_Strength, + .isUnlockedFunc = IsFieldMoveUnlocked_Strength, + .moveID = MOVE_STRENGTH, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, + + [FIELD_MOVE_SURF] = + { + .fieldMoveFunc = SetUpFieldMove_Surf, + .isUnlockedFunc = IsFieldMoveUnlocked_Surf, + .moveID = MOVE_SURF, + .partyMsgID = PARTY_MSG_CANT_SURF_HERE, + }, + + [FIELD_MOVE_FLY] = + { + .fieldMoveFunc = SetUpFieldMove_Fly, + .isUnlockedFunc = IsFieldMoveUnlocked_Fly, + .moveID = MOVE_FLY, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, + + [FIELD_MOVE_DIVE] = + { + .fieldMoveFunc = SetUpFieldMove_Dive, + .isUnlockedFunc = IsFieldMoveUnlocked_Dive, + .moveID = MOVE_DIVE, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, + + [FIELD_MOVE_WATERFALL] = + { + .fieldMoveFunc = SetUpFieldMove_Waterfall, + .isUnlockedFunc = IsFieldMoveUnlocked_Waterfall, + .moveID = MOVE_WATERFALL, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, + + [FIELD_MOVE_TELEPORT] = + { + .fieldMoveFunc = SetUpFieldMove_Teleport, + .isUnlockedFunc = IsFieldMoveUnlocked_Teleport, + .moveID = MOVE_TELEPORT, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, + + [FIELD_MOVE_DIG] = + { + .fieldMoveFunc = SetUpFieldMove_Dig, + .isUnlockedFunc = IsFieldMoveUnlocked_Dig, + .moveID = MOVE_DIG, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, + + [FIELD_MOVE_SECRET_POWER] = + { + .fieldMoveFunc = SetUpFieldMove_SecretPower, + .isUnlockedFunc = IsFieldMoveUnlocked_SecretPower, + .moveID = MOVE_SECRET_POWER, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, + + [FIELD_MOVE_MILK_DRINK] = + { + .fieldMoveFunc = SetUpFieldMove_SoftBoiled, + .isUnlockedFunc = IsFieldMoveUnlocked_MilkDrink, + .moveID = MOVE_MILK_DRINK, + .partyMsgID = PARTY_MSG_NOT_ENOUGH_HP, + }, + + [FIELD_MOVE_SOFT_BOILED] = + { + .fieldMoveFunc = SetUpFieldMove_SoftBoiled, + .isUnlockedFunc = IsFieldMoveUnlocked_SoftBoiled, + .moveID = MOVE_SOFT_BOILED, + .partyMsgID = PARTY_MSG_NOT_ENOUGH_HP, + }, + + [FIELD_MOVE_SWEET_SCENT] = + { + .fieldMoveFunc = SetUpFieldMove_SweetScent, + .isUnlockedFunc = IsFieldMoveUnlocked_SweetScent, + .moveID = MOVE_SWEET_SCENT, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, +#if OW_ROCK_CLIMB_FIELD_MOVE == TRUE + [FIELD_MOVE_ROCK_CLIMB] = + { + .fieldMoveFunc = SetUpFieldMove_RockClimb, + .isUnlockedFunc = IsFieldMoveUnlocked_RockClimb, + .moveID = MOVE_ROCK_CLIMB, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, +#endif +#if OW_DEFOG_FIELD_MOVE == TRUE + [FIELD_MOVE_DEFOG] = + { + .fieldMoveFunc = SetUpFieldMove_Defog, + .isUnlockedFunc = IsFieldMoveUnlocked_Defog, + .moveID = MOVE_DEFOG, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, +#endif +}; diff --git a/src/field_name_box.c b/src/field_name_box.c new file mode 100644 index 000000000000..4c51f89d857b --- /dev/null +++ b/src/field_name_box.c @@ -0,0 +1,201 @@ +#include "global.h" +#include "main.h" +#include "menu.h" +#include "bg.h" +#include "window.h" +#include "text.h" +#include "string_util.h" +#include "international_string_util.h" +#include "script_menu.h" +#include "field_message_box.h" +#include "graphics.h" +#include "script.h" +#include "field_name_box.h" +#include "event_data.h" +#include "match_call.h" +#include "malloc.h" +#include "constants/speaker_names.h" +#include "data/speaker_names.h" + +static EWRAM_INIT u8 sNameboxWindowId = WINDOW_NONE; +EWRAM_DATA const u8 *gSpeakerName = NULL; + +static const u32 sNameBoxDefaultGfx[] = INCBIN_U32("graphics/text_window/name_box.4bpp"); +static const u32 sNameBoxPokenavGfx[] = INCBIN_U32("graphics/pokenav/name_box.4bpp"); + +static void WindowFunc_DrawNamebox(u32, u32, u32, u32, u32, u32, u32); +static void WindowFunc_ClearNamebox(u8, u8, u8, u8, u8, u8); + +void TrySpawnNamebox(u32 tileNum) +{ + u8 *strbuf = AllocZeroed(32 * sizeof(u8)); + if ((OW_FLAG_SUPPRESS_NAME_BOX != 0 && FlagGet(OW_FLAG_SUPPRESS_NAME_BOX)) || gSpeakerName == NULL || !strbuf) + { + // Re-check again in case anything but !strbuf is TRUE. + if (strbuf) + Free(strbuf); + + DestroyNamebox(); + return; + } + + StringExpandPlaceholders(strbuf, gSpeakerName); + + u32 fontId = FONT_SMALL; + u32 winWidth = OW_NAME_BOX_DEFAULT_WIDTH; + + if (OW_NAME_BOX_USE_DYNAMIC_WIDTH) + { + winWidth = ConvertPixelWidthToTileWidth(GetStringWidth(fontId, strbuf, -1)); + if (winWidth > OW_NAME_BOX_DEFAULT_WIDTH) + winWidth = OW_NAME_BOX_DEFAULT_WIDTH; + } + + if (sNameboxWindowId != WINDOW_NONE) + { + DestroyNamebox(); + RedrawDialogueFrame(); + } + + bool32 matchCall = IsMatchCallTaskActive(); + + struct WindowTemplate template = + { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 13, + .width = winWidth, + .height = OW_NAME_BOX_DEFAULT_HEIGHT, + .paletteNum = matchCall ? 14 : DLG_WINDOW_PALETTE_NUM, + .baseBlock = tileNum, + }; + + sNameboxWindowId = AddWindow(&template); + FillNamebox(); + + u8 colors[3] = {TEXT_COLOR_TRANSPARENT, OW_NAME_BOX_FOREGROUND_COLOR, OW_NAME_BOX_SHADOW_COLOR}; + u8 bakColors[3]; + int strX = GetStringCenterAlignXOffset(fontId, strbuf, (winWidth * 8)); + if (matchCall) + { + colors[1] = 1; + colors[2] = 0; + } + + SaveTextColors(&bakColors[0], &bakColors[1], &bakColors[2]); + AddTextPrinterParameterized3(sNameboxWindowId, fontId, strX, 0, colors, 0, strbuf); + RestoreTextColors(&bakColors[0], &bakColors[1], &bakColors[2]); + PutWindowTilemap(sNameboxWindowId); + Free(strbuf); +} + +u32 GetNameboxWindowId(void) +{ + return sNameboxWindowId; +} + +void ResetNameboxData(void) +{ + sNameboxWindowId = WINDOW_NONE; + gSpeakerName = NULL; +} + +void DestroyNamebox(void) +{ + if (sNameboxWindowId == WINDOW_NONE) + return; + + ClearNamebox(sNameboxWindowId, TRUE); + ClearWindowTilemap(sNameboxWindowId); + RemoveWindow(sNameboxWindowId); + sNameboxWindowId = WINDOW_NONE; + gSpeakerName = NULL; +} + +u32 GetNameboxWidth(void) +{ + return gWindows[sNameboxWindowId].window.width; +} + +static const u32 *GetNameboxGraphics(void) +{ + if (IsMatchCallTaskActive()) + return sNameBoxPokenavGfx; + else + return sNameBoxDefaultGfx; +} + +void FillNamebox(void) +{ + u32 winSize = GetNameboxWidth(); + const u32 *gfx = GetNameboxGraphics(); + + for (u32 i = 0; i < winSize; i++) + { + #define TILE(x) (8 * x) + CopyToWindowPixelBuffer(sNameboxWindowId, &gfx[TILE(1)], TILE_SIZE_4BPP, i); + CopyToWindowPixelBuffer(sNameboxWindowId, &gfx[TILE(4)], TILE_SIZE_4BPP, i + winSize); + #undef TILE + } +} + +void DrawNamebox(u32 windowId, u32 tileNum, bool32 copyToVram) +{ + // manual instead of using CallWindowFunction for extra tileNum param + struct WindowTemplate *w = &gWindows[windowId].window; + u32 size = TILE_OFFSET_4BPP(NAME_BOX_BASE_TILES_TOTAL); + + LoadBgTiles(GetWindowAttribute(sNameboxWindowId, WINDOW_BG), GetNameboxGraphics(), size, tileNum); + WindowFunc_DrawNamebox(w->bg, w->tilemapLeft, w->tilemapTop, w->width, w->height, w->paletteNum, tileNum); + PutWindowTilemap(windowId); + if (copyToVram == TRUE) + CopyWindowToVram(windowId, COPYWIN_FULL); +} + +void ClearNamebox(u32 windowId, bool32 copyToVram) +{ + CallWindowFunction(windowId, WindowFunc_ClearNamebox); + ClearWindowTilemap(windowId); + if (copyToVram == TRUE) + CopyWindowToVram(windowId, COPYWIN_FULL); +} + +static void WindowFunc_DrawNamebox(u32 bg, u32 L, u32 T, u32 w, u32 h, u32 p, u32 tileNum) +{ + // left-most + FillBgTilemapBufferRect(bg, tileNum, L - 1, T, 1, 1, p); + FillBgTilemapBufferRect(bg, tileNum + 3, L - 1, T + 1, 1, 1, p); + + // right-most + FillBgTilemapBufferRect(bg, tileNum + 2, L + w, T, 1, 1, p); + FillBgTilemapBufferRect(bg, tileNum + 5, L + w, T + 1, 1, 1, p); +} + +static void WindowFunc_ClearNamebox(u8 bg, u8 L, u8 T, u8 w, u8 h, u8 p) +{ + FillBgTilemapBufferRect(bg, 0, L - 1, T, w + 2, h, 0); // palette doesn't matter +} + +void SetSpeaker(struct ScriptContext *ctx) +{ + u32 arg = ScriptReadWord(ctx); + const u8 *speaker = NULL; + + if (arg < SP_NAME_COUNT) + speaker = gSpeakerNamesTable[arg]; + else if (arg >= ROM_START && arg < ROM_END) + speaker = (const u8 *)arg; + + gSpeakerName = speaker; +} + +// useful for other context e.g. match call +void TrySpawnAndShowNamebox(const u8 *speaker, u32 tileNum) +{ + gSpeakerName = speaker; + TrySpawnNamebox(tileNum); + if (sNameboxWindowId != WINDOW_NONE) + DrawNamebox(sNameboxWindowId, tileNum - NAME_BOX_BASE_TILES_TOTAL, TRUE); + else // either NULL or SP_NAME_NONE + RedrawDialogueFrame(); +} diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index d02ecbd9fc3a..a46f29251759 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -12,6 +12,7 @@ #include "follower_npc.h" #include "menu.h" #include "metatile_behavior.h" +#include "oras_dowse.h" #include "overworld.h" #include "party_menu.h" #include "random.h" @@ -146,40 +147,6 @@ static void CreateStopSurfingTask(u8); static void Task_StopSurfingInit(u8); static void Task_WaitStopSurfing(u8); -static void Task_Fishing(u8); -static bool32 Fishing_Init(struct Task *); -static bool32 Fishing_GetRodOut(struct Task *); -static bool32 Fishing_WaitBeforeDots(struct Task *); -static bool32 Fishing_InitDots(struct Task *); -static bool32 Fishing_ShowDots(struct Task *); -static bool32 Fishing_CheckForBite(struct Task *); -static bool32 Fishing_GotBite(struct Task *); -static bool32 Fishing_ChangeMinigame(struct Task *); -static bool32 Fishing_WaitForA(struct Task *); -static bool32 Fishing_APressNoMinigame(struct Task *); -static bool32 Fishing_CheckMoreDots(struct Task *); -static bool32 Fishing_MonOnHook(struct Task *); -static bool32 Fishing_StartEncounter(struct Task *); -static bool32 Fishing_NotEvenNibble(struct Task *); -static bool32 Fishing_GotAway(struct Task *); -static bool32 Fishing_NoMon(struct Task *); -static bool32 Fishing_PutRodAway(struct Task *); -static bool32 Fishing_EndNoMon(struct Task *); -static void AlignFishingAnimationFrames(void); -static bool32 DoesFishingMinigameAllowCancel(void); -static bool32 Fishing_DoesFirstMonInPartyHaveSuctionCupsOrStickyHold(void); -static bool32 Fishing_RollForBite(u32, bool32); -static u32 CalculateFishingBiteOdds(u32, bool32); -static u32 CalculateFishingFollowerBoost(void); -static u32 CalculateFishingProximityBoost(u32 odds); -static void GetCoordinatesAroundBobber(s16[], s16[][AXIS_COUNT], u32); -static u32 CountQualifyingTiles(s16[][AXIS_COUNT], s16 player[], u8 facingDirection, struct ObjectEvent *objectEvent, bool32 isTileLand[]); -static bool32 CheckTileQualification(s16 tile[], s16 player[], u32 facingDirection, struct ObjectEvent* objectEvent, bool32 isTileLand[], u32 direction); -static u32 CountLandTiles(bool32 isTileLand[]); -static bool32 IsPlayerHere(s16, s16, s16, s16); -static bool32 IsMetatileBlocking(s16, s16, u32); -static bool32 IsMetatileLand(s16, s16, u32); - static u8 TrySpinPlayerForWarp(struct ObjectEvent *, s16 *); static bool8 (*const sForcedMovementTestFuncs[NUM_FORCED_MOVEMENTS])(u8) = @@ -382,13 +349,23 @@ void PlayerStep(u8 direction, u16 newKeys, u16 heldKeys) DoPlayerAvatarTransition(); if (TryDoMetatileBehaviorForcedMovement() == 0) { - MovePlayerAvatarUsingKeypadInput(direction, newKeys, heldKeys); - PlayerAllowForcedMovementIfMovingSameDirection(); + if (GetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT) != FNPC_FORCED_NONE) + { + gPlayerAvatar.preventStep = TRUE; + CreateTask(Task_MoveNPCFollowerAfterForcedMovement, 1); + } + else + { + MovePlayerAvatarUsingKeypadInput(direction, newKeys, heldKeys); + PlayerAllowForcedMovementIfMovingSameDirection(); + } } } } } +#define sCounter data[3] + static bool8 TryInterruptObjectEventSpecialAnim(struct ObjectEvent *playerObjEvent, u8 direction) { if (ObjectEventIsMovementOverridden(playerObjEvent) @@ -397,6 +374,8 @@ static bool8 TryInterruptObjectEventSpecialAnim(struct ObjectEvent *playerObjEve u8 heldMovementActionId = ObjectEventGetHeldMovementActionId(playerObjEvent); if (heldMovementActionId > MOVEMENT_ACTION_WALK_FAST_RIGHT && heldMovementActionId < MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN) { + struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId]; + if (direction == DIR_NONE) { return TRUE; @@ -404,12 +383,21 @@ static bool8 TryInterruptObjectEventSpecialAnim(struct ObjectEvent *playerObjEve if (playerObjEvent->movementDirection != direction) { + if (I_ORAS_DOWSING_FLAG != 0 && FlagGet(I_ORAS_DOWSING_FLAG)) + gSprites[playerObj->fieldEffectSpriteId].sCounter = 0; + ObjectEventClearHeldMovement(playerObjEvent); return FALSE; } if (CheckForPlayerAvatarStaticCollision(direction) == COLLISION_NONE) { + if (I_ORAS_DOWSING_FLAG != 0 && FlagGet(I_ORAS_DOWSING_FLAG)) + { + gSprites[playerObj->fieldEffectSpriteId].sCounter = 0; + gSprites[playerObj->fieldEffectSpriteId].y2 = 0; + } + ObjectEventClearHeldMovement(playerObjEvent); return FALSE; } @@ -421,6 +409,8 @@ static bool8 TryInterruptObjectEventSpecialAnim(struct ObjectEvent *playerObjEve return FALSE; } +#undef sCounter + static void npc_clear_strange_bits(struct ObjectEvent *objEvent) { objEvent->inanimate = FALSE; @@ -510,7 +500,11 @@ static bool8 DoForcedMovement(u8 direction, void (*moveFunc)(u8)) else { if (collision == COLLISION_LEDGE_JUMP) + { + SetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT, FNPC_FORCED_NONE); PlayerJumpLedge(direction); + } + playerAvatar->flags |= PLAYER_AVATAR_FLAG_FORCED_MOVE; playerAvatar->runningState = MOVING; return TRUE; @@ -518,12 +512,11 @@ static bool8 DoForcedMovement(u8 direction, void (*moveFunc)(u8)) } else { + if (PlayerHasFollowerNPC() && GetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT) != FNPC_FORCED_STAY) + SetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT, FNPC_FORCED_FOLLOW); + playerAvatar->runningState = MOVING; moveFunc(direction); - if (PlayerHasFollowerNPC() - && gObjectEvents[GetFollowerNPCObjectId()].invisible == FALSE - && FindTaskIdByFunc(Task_MoveNPCFollowerAfterForcedMovement) == TASK_NONE) - CreateTask(Task_MoveNPCFollowerAfterForcedMovement, 3); return TRUE; } } @@ -847,8 +840,12 @@ static void PlayerNotOnBikeMoving(u8 direction, u16 heldKeys) return; } - if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_UNDERWATER) && (heldKeys & B_BUTTON) && FlagGet(FLAG_SYS_B_DASH) - && IsRunningDisallowed(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior) == 0 && !FollowerNPCComingThroughDoor()) + if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_UNDERWATER) + && (heldKeys & B_BUTTON) + && FlagGet(FLAG_SYS_B_DASH) + && IsRunningDisallowed(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior) == 0 + && !FollowerNPCComingThroughDoor() + && (I_ORAS_DOWSING_FLAG == 0 || (I_ORAS_DOWSING_FLAG != 0 && !FlagGet(I_ORAS_DOWSING_FLAG)))) { if (ObjectMovingOnRockStairs(&gObjectEvents[gPlayerAvatar.objectEventId], direction)) PlayerRunSlow(direction); @@ -1186,17 +1183,18 @@ void PlayerSetAnimId(u8 movementActionId, u8 copyableMovement) // slow stairs (from FRLG--faster than slow) static void PlayerWalkSlowStairs(u8 direction) { - PlayerSetAnimId(GetWalkSlowStairsMovementAction(direction), 2); + PlayerSetAnimId(GetWalkSlowStairsMovementAction(direction), COPY_MOVE_WALK); } // slow static void UNUSED PlayerWalkSlow(u8 direction) { - PlayerSetAnimId(GetWalkSlowMovementAction(direction), 2); + PlayerSetAnimId(GetWalkSlowMovementAction(direction), COPY_MOVE_WALK); } + static void PlayerRunSlow(u8 direction) { - PlayerSetAnimId(GetPlayerRunSlowMovementAction(direction), 2); + PlayerSetAnimId(GetPlayerRunSlowMovementAction(direction), COPY_MOVE_WALK); } // normal speed (1 speed) @@ -1228,7 +1226,7 @@ static void PlayerRun(u8 direction) void PlayerOnBikeCollide(u8 direction) { PlayCollisionSoundIfNotFacingWarp(direction); - PlayerSetAnimId(GetWalkInPlaceNormalMovementAction(direction), COPY_MOVE_WALK); + PlayerSetAnimId(GetWalkInPlaceNormalMovementAction(direction), COPY_MOVE_FACE); // Edge case: If the player stops at the top of a mud slide, but the NPC follower is still on a mud slide tile, // move the follower into the player and hide them. if (PlayerHasFollowerNPC()) @@ -1249,18 +1247,18 @@ void PlayerOnBikeCollide(u8 direction) void PlayerOnBikeCollideWithFarawayIslandMew(u8 direction) { - PlayerSetAnimId(GetWalkInPlaceNormalMovementAction(direction), COPY_MOVE_WALK); + PlayerSetAnimId(GetWalkInPlaceNormalMovementAction(direction), COPY_MOVE_FACE); } static void PlayerNotOnBikeCollide(u8 direction) { PlayCollisionSoundIfNotFacingWarp(direction); - PlayerSetAnimId(GetWalkInPlaceSlowMovementAction(direction), COPY_MOVE_WALK); + PlayerSetAnimId(GetWalkInPlaceSlowMovementAction(direction), COPY_MOVE_FACE); } static void PlayerNotOnBikeCollideWithFarawayIslandMew(u8 direction) { - PlayerSetAnimId(GetWalkInPlaceSlowMovementAction(direction), COPY_MOVE_WALK); + PlayerSetAnimId(GetWalkInPlaceSlowMovementAction(direction), COPY_MOVE_FACE); } void PlayerFaceDirection(u8 direction) @@ -1648,12 +1646,14 @@ void SetPlayerInvisibility(bool8 invisible) void SetPlayerAvatarFieldMove(void) { + EndORASDowsing(); ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_FIELD_MOVE)); StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], ANIM_FIELD_MOVE); } -static void SetPlayerAvatarFishing(u8 direction) +void SetPlayerAvatarFishing(u8 direction) { + EndORASDowsing(); ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_FISHING)); StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingDirectionAnimNum(direction)); } @@ -1667,6 +1667,7 @@ void PlayerUseAcroBikeOnBumpySlope(u8 direction) void SetPlayerAvatarWatering(u8 direction) { + EndORASDowsing(); ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_WATERING)); StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFaceDirectionAnimNum(direction)); } @@ -1922,644 +1923,6 @@ static void Task_WaitStopSurfing(u8 taskId) } } -#define tStep data[0] -#define tFrameCounter data[1] -#define tNumDots data[2] -#define tDotsRequired data[3] -#define tRoundsPlayed data[12] -#define tMinRoundsRequired data[13] -#define tPlayerGfxId data[14] -#define tFishingRod data[15] - -#define FISHING_PROXIMITY_BOOST 4 -#define FISHING_STICKY_BOOST 36 - -#if I_FISHING_BITE_ODDS >= GEN_4 - #define FISHING_OLD_ROD_ODDS 75 - #define FISHING_GOOD_ROD_ODDS 50 - #define FISHING_SUPER_ROD_ODDS 25 -#elif I_FISHING_BITE_ODDS >= GEN_3 - #define FISHING_OLD_ROD_ODDS 50 - #define FISHING_GOOD_ROD_ODDS 50 - #define FISHING_SUPER_ROD_ODDS 50 -#else - #define FISHING_OLD_ROD_ODDS 0 - #define FISHING_GOOD_ROD_ODDS 33 - #define FISHING_SUPER_ROD_ODDS 50 -#endif - -enum -{ - FISHING_INIT, - FISHING_GET_ROD_OUT, - FISHING_WAIT_BEFORE_DOTS, - FISHING_INIT_DOTS, - FISHING_SHOW_DOTS, - FISHING_CHECK_FOR_BITE, - FISHING_GOT_BITE, - FISHING_CHANGE_MINIGAME, - FISHING_WAIT_FOR_A, - FISHING_A_PRESS_NO_MINIGAME, - FISHING_CHECK_MORE_DOTS, - FISHING_MON_ON_HOOK, - FISHING_START_ENCOUNTER, - FISHING_NOT_EVEN_NIBBLE, - FISHING_GOT_AWAY, - FISHING_NO_MON, - FISHING_PUT_ROD_AWAY, - FISHING_END_NO_MON, -}; - -static bool32 (*const sFishingStateFuncs[])(struct Task *) = -{ - [FISHING_INIT] = Fishing_Init, - [FISHING_GET_ROD_OUT] = Fishing_GetRodOut, - [FISHING_WAIT_BEFORE_DOTS] = Fishing_WaitBeforeDots, - [FISHING_INIT_DOTS] = Fishing_InitDots, - [FISHING_SHOW_DOTS] = Fishing_ShowDots, - [FISHING_CHECK_FOR_BITE] = Fishing_CheckForBite, - [FISHING_GOT_BITE] = Fishing_GotBite, - [FISHING_CHANGE_MINIGAME] = Fishing_ChangeMinigame, - [FISHING_WAIT_FOR_A] = Fishing_WaitForA, - [FISHING_A_PRESS_NO_MINIGAME] = Fishing_APressNoMinigame, - [FISHING_CHECK_MORE_DOTS] = Fishing_CheckMoreDots, - [FISHING_MON_ON_HOOK] = Fishing_MonOnHook, - [FISHING_START_ENCOUNTER] = Fishing_StartEncounter, - [FISHING_NOT_EVEN_NIBBLE] = Fishing_NotEvenNibble, - [FISHING_GOT_AWAY] = Fishing_GotAway, - [FISHING_NO_MON] = Fishing_NoMon, - [FISHING_PUT_ROD_AWAY] = Fishing_PutRodAway, - [FISHING_END_NO_MON] = Fishing_EndNoMon, -}; - -void StartFishing(u8 rod) -{ - u8 taskId = CreateTask(Task_Fishing, 0xFF); - - gTasks[taskId].tFishingRod = rod; - Task_Fishing(taskId); -} - -static void Task_Fishing(u8 taskId) -{ - while (sFishingStateFuncs[gTasks[taskId].tStep](&gTasks[taskId])) - ; -} - -static bool32 Fishing_Init(struct Task *task) -{ - LockPlayerFieldControls(); - gPlayerAvatar.preventStep = TRUE; - task->tStep = FISHING_GET_ROD_OUT; - return FALSE; -} - -static bool32 Fishing_GetRodOut(struct Task *task) -{ - struct ObjectEvent *playerObjEvent; - const s16 minRounds1[] = { - [OLD_ROD] = 1, - [GOOD_ROD] = 1, - [SUPER_ROD] = 1 - }; - const s16 minRounds2[] = { - [OLD_ROD] = 1, - [GOOD_ROD] = 3, - [SUPER_ROD] = 6 - }; - - task->tRoundsPlayed = 0; - task->tMinRoundsRequired = minRounds1[task->tFishingRod] + (Random() % minRounds2[task->tFishingRod]); - task->tPlayerGfxId = gObjectEvents[gPlayerAvatar.objectEventId].graphicsId; - playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; - ObjectEventClearHeldMovementIfActive(playerObjEvent); - playerObjEvent->enableAnim = TRUE; - SetPlayerAvatarFishing(playerObjEvent->facingDirection); - task->tStep = FISHING_WAIT_BEFORE_DOTS; - return FALSE; -} - -static bool32 Fishing_WaitBeforeDots(struct Task *task) -{ - AlignFishingAnimationFrames(); - - // Wait one second - task->tFrameCounter++; - if (task->tFrameCounter >= 60) - task->tStep = FISHING_INIT_DOTS; - return FALSE; -} - -static bool32 Fishing_InitDots(struct Task *task) -{ - u32 randVal; - - LoadMessageBoxAndFrameGfx(0, TRUE); - task->tStep = FISHING_SHOW_DOTS; - task->tFrameCounter = 0; - task->tNumDots = 0; - randVal = Random(); - randVal %= 10; - task->tDotsRequired = randVal + 1; - if (task->tRoundsPlayed == 0) - task->tDotsRequired = randVal + 4; - if (task->tDotsRequired >= 10) - task->tDotsRequired = 10; - return TRUE; -} - -static bool32 Fishing_ShowDots(struct Task *task) -{ - const u8 dot[] = _("Β·"); - - AlignFishingAnimationFrames(); - task->tFrameCounter++; - if (JOY_NEW(A_BUTTON)) - { - if (!DoesFishingMinigameAllowCancel()) - return FALSE; - - task->tStep = FISHING_NOT_EVEN_NIBBLE; - if (task->tRoundsPlayed != 0) - task->tStep = FISHING_GOT_AWAY; - return TRUE; - } - else - { - if (task->tFrameCounter >= 20) - { - task->tFrameCounter = 0; - if (task->tNumDots >= task->tDotsRequired) - { - task->tStep = FISHING_CHECK_FOR_BITE; - if (task->tRoundsPlayed != 0) - task->tStep = FISHING_GOT_BITE; - task->tRoundsPlayed++; - } - else - { - AddTextPrinterParameterized(0, FONT_NORMAL, dot, task->tNumDots * 8, 1, 0, NULL); - task->tNumDots++; - } - } - return FALSE; - } -} - -static bool32 Fishing_CheckForBite(struct Task *task) -{ - bool32 bite, firstMonHasSuctionOrSticky; - - AlignFishingAnimationFrames(); - task->tStep = FISHING_GOT_BITE; - bite = FALSE; - - if (!DoesCurrentMapHaveFishingMons()) - { - task->tStep = FISHING_NOT_EVEN_NIBBLE; - return TRUE; - } - - firstMonHasSuctionOrSticky = Fishing_DoesFirstMonInPartyHaveSuctionCupsOrStickyHold(); - - if(firstMonHasSuctionOrSticky) - bite = Fishing_RollForBite(task->tFishingRod, firstMonHasSuctionOrSticky); - - if (!bite) - bite = Fishing_RollForBite(task->tFishingRod, FALSE); - - if (!bite) - task->tStep = FISHING_NOT_EVEN_NIBBLE; - - if (bite) - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingBiteDirectionAnimNum(GetPlayerFacingDirection())); - - return TRUE; -} - -static bool32 Fishing_GotBite(struct Task *task) -{ - AlignFishingAnimationFrames(); - AddTextPrinterParameterized(0, FONT_NORMAL, gText_OhABite, 0, 17, 0, NULL); - task->tStep = FISHING_CHANGE_MINIGAME; - task->tFrameCounter = 0; - return FALSE; -} - -static bool32 Fishing_ChangeMinigame(struct Task *task) -{ - switch (I_FISHING_MINIGAME) - { - case GEN_1: - case GEN_2: - task->tStep = FISHING_A_PRESS_NO_MINIGAME; - break; - case GEN_3: - default: - task->tStep = FISHING_WAIT_FOR_A; - break; - } - return TRUE; -} - -// We have a bite. Now, wait for the player to press A, or the timer to expire. -static bool32 Fishing_WaitForA(struct Task *task) -{ - const s16 reelTimeouts[3] = { - [OLD_ROD] = 36, - [GOOD_ROD] = 33, - [SUPER_ROD] = 30 - }; - - AlignFishingAnimationFrames(); - task->tFrameCounter++; - if (task->tFrameCounter >= reelTimeouts[task->tFishingRod]) - task->tStep = FISHING_GOT_AWAY; - else if (JOY_NEW(A_BUTTON)) - task->tStep = FISHING_CHECK_MORE_DOTS; - return FALSE; -} - -static bool32 Fishing_APressNoMinigame(struct Task *task) -{ - AlignFishingAnimationFrames(); - if (JOY_NEW(A_BUTTON)) - task->tStep = FISHING_MON_ON_HOOK; - return FALSE; -} - -// Determine if we're going to play the dot game again -static bool32 Fishing_CheckMoreDots(struct Task *task) -{ - const s16 moreDotsChance[][2] = - { - [OLD_ROD] = {0, 0}, - [GOOD_ROD] = {40, 10}, - [SUPER_ROD] = {70, 30} - }; - - AlignFishingAnimationFrames(); - task->tStep = FISHING_MON_ON_HOOK; - if (task->tRoundsPlayed < task->tMinRoundsRequired) - { - task->tStep = FISHING_INIT_DOTS; - } - else if (task->tRoundsPlayed < 2) - { - // probability of having to play another round - s16 probability = Random() % 100; - - if (moreDotsChance[task->tFishingRod][task->tRoundsPlayed] > probability) - task->tStep = FISHING_INIT_DOTS; - } - return FALSE; -} - -static bool32 Fishing_MonOnHook(struct Task *task) -{ - AlignFishingAnimationFrames(); - FillWindowPixelBuffer(0, PIXEL_FILL(1)); - AddTextPrinterParameterized2(0, FONT_NORMAL, gText_PokemonOnHook, 1, 0, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); - task->tStep = FISHING_START_ENCOUNTER; - task->tFrameCounter = 0; - return FALSE; -} - -static bool32 Fishing_StartEncounter(struct Task *task) -{ - if (task->tFrameCounter == 0) - AlignFishingAnimationFrames(); - - RunTextPrinters(); - - if (task->tFrameCounter == 0) - { - if (!IsTextPrinterActive(0)) - { - struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; - - ObjectEventSetGraphicsId(playerObjEvent, task->tPlayerGfxId); - ObjectEventTurn(playerObjEvent, playerObjEvent->movementDirection); - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) - SetSurfBlob_PlayerOffset(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, FALSE, 0); - gSprites[gPlayerAvatar.spriteId].x2 = 0; - gSprites[gPlayerAvatar.spriteId].y2 = 0; - ClearDialogWindowAndFrame(0, TRUE); - task->tFrameCounter++; - return FALSE; - } - } - - if (task->tFrameCounter != 0) - { - gPlayerAvatar.preventStep = FALSE; - UnlockPlayerFieldControls(); - FishingWildEncounter(task->tFishingRod); - RecordFishingAttemptForTV(TRUE); - DestroyTask(FindTaskIdByFunc(Task_Fishing)); - } - return FALSE; -} - -static bool32 Fishing_NotEvenNibble(struct Task *task) -{ - gChainFishingDexNavStreak = 0; - AlignFishingAnimationFrames(); - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingNoCatchDirectionAnimNum(GetPlayerFacingDirection())); - FillWindowPixelBuffer(0, PIXEL_FILL(1)); - AddTextPrinterParameterized2(0, FONT_NORMAL, gText_NotEvenANibble, 1, 0, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); - task->tStep = FISHING_NO_MON; - return TRUE; -} - -static bool32 Fishing_GotAway(struct Task *task) -{ - gChainFishingDexNavStreak = 0; - AlignFishingAnimationFrames(); - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingNoCatchDirectionAnimNum(GetPlayerFacingDirection())); - FillWindowPixelBuffer(0, PIXEL_FILL(1)); - AddTextPrinterParameterized2(0, FONT_NORMAL, gText_ItGotAway, 1, 0, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); - task->tStep = FISHING_NO_MON; - return TRUE; -} - -static bool32 Fishing_NoMon(struct Task *task) -{ - AlignFishingAnimationFrames(); - task->tStep = FISHING_PUT_ROD_AWAY; - return FALSE; -} - -static bool32 Fishing_PutRodAway(struct Task *task) -{ - AlignFishingAnimationFrames(); - if (gSprites[gPlayerAvatar.spriteId].animEnded) - { - struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; - - ObjectEventSetGraphicsId(playerObjEvent, task->tPlayerGfxId); - ObjectEventTurn(playerObjEvent, playerObjEvent->movementDirection); - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) - SetSurfBlob_PlayerOffset(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, FALSE, 0); - gSprites[gPlayerAvatar.spriteId].x2 = 0; - gSprites[gPlayerAvatar.spriteId].y2 = 0; - task->tStep = FISHING_END_NO_MON; - } - return FALSE; -} - -static bool32 Fishing_EndNoMon(struct Task *task) -{ - RunTextPrinters(); - if (!IsTextPrinterActive(0)) - { - gPlayerAvatar.preventStep = FALSE; - UnlockPlayerFieldControls(); - UnfreezeObjectEvents(); - ClearDialogWindowAndFrame(0, TRUE); - RecordFishingAttemptForTV(FALSE); - DestroyTask(FindTaskIdByFunc(Task_Fishing)); - } - return FALSE; -} - -static bool32 DoesFishingMinigameAllowCancel(void) -{ - switch(I_FISHING_MINIGAME) - { - case GEN_1: - case GEN_2: - return FALSE; - case GEN_3: - default: - return TRUE; - } -} - -static bool32 Fishing_DoesFirstMonInPartyHaveSuctionCupsOrStickyHold(void) -{ - u32 ability; - - if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) - return FALSE; - - ability = GetMonAbility(&gPlayerParty[0]); - - return (ability == ABILITY_SUCTION_CUPS || ability == ABILITY_STICKY_HOLD); -} - -static bool32 Fishing_RollForBite(u32 rod, bool32 isStickyHold) -{ - return ((Random() % 100) > CalculateFishingBiteOdds(rod, isStickyHold)); -} - -static u32 CalculateFishingBiteOdds(u32 rod, bool32 isStickyHold) -{ - u32 odds; - - if (rod == OLD_ROD) - odds = FISHING_OLD_ROD_ODDS; - if (rod == GOOD_ROD) - odds = FISHING_GOOD_ROD_ODDS; - if (rod == SUPER_ROD) - odds = FISHING_SUPER_ROD_ODDS; - - odds -= CalculateFishingFollowerBoost(); - - if (isStickyHold) - { - if (I_FISHING_STICKY_BOOST >= GEN_4) - odds -= (100 - odds); - else - odds -= FISHING_STICKY_BOOST; - } - - odds -= CalculateFishingProximityBoost(odds); - - return odds; -} - -static u32 CalculateFishingFollowerBoost() -{ - u32 friendship; - struct Pokemon *mon = GetFirstLiveMon(); - - if (!I_FISHING_FOLLOWER_BOOST || !mon) - return 0; - - friendship = GetMonData(mon, MON_DATA_FRIENDSHIP); - if (friendship >= 250) - return 50; - else if (friendship >= 200) - return 40; - else if (friendship >= 150) - return 30; - else if (friendship >= 100) - return 20; - else - return 0; -} - -static u32 CalculateFishingProximityBoost(u32 odds) -{ - s16 player[AXIS_COUNT], bobber[AXIS_COUNT]; - s16 surroundingTile[CARDINAL_DIRECTION_COUNT][AXIS_COUNT] = {{0, 0}}; - bool32 isTileLand[CARDINAL_DIRECTION_COUNT] = {FALSE}; - u32 facingDirection, numQualifyingTile = 0; - struct ObjectEvent *objectEvent; - - if (!I_FISHING_PROXIMITY) - return 0; - - objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; - - player[AXIS_X] = objectEvent->currentCoords.x; - player[AXIS_Y] = objectEvent->currentCoords.y; - bobber[AXIS_X] = objectEvent->currentCoords.x; - bobber[AXIS_Y] = objectEvent->currentCoords.y; - - facingDirection = GetPlayerFacingDirection(); - MoveCoords(facingDirection, &bobber[AXIS_X], &bobber[AXIS_Y]); - - GetCoordinatesAroundBobber(bobber, surroundingTile, facingDirection); - numQualifyingTile = CountQualifyingTiles(surroundingTile, player, facingDirection, objectEvent, isTileLand); - - numQualifyingTile += CountLandTiles(isTileLand); - - return (numQualifyingTile == 3) ? odds : (numQualifyingTile * FISHING_PROXIMITY_BOOST); -} - -static void GetCoordinatesAroundBobber(s16 bobber[], s16 surroundingTile[][AXIS_COUNT], u32 facingDirection) -{ - u32 direction; - - for (direction = DIR_SOUTH; direction < CARDINAL_DIRECTION_COUNT; direction++) - { - surroundingTile[direction][AXIS_X] = bobber[AXIS_X]; - surroundingTile[direction][AXIS_Y] = bobber[AXIS_Y]; - MoveCoords(direction, &surroundingTile[direction][AXIS_X], &surroundingTile[direction][AXIS_Y]); - } -} - -static u32 CountQualifyingTiles(s16 surroundingTile[][AXIS_COUNT], s16 player[], u8 facingDirection, struct ObjectEvent *objectEvent, bool32 isTileLand[]) -{ - u32 numQualifyingTile = 0; - s16 tile[AXIS_COUNT]; - u8 direction = DIR_SOUTH; - - for (direction = DIR_SOUTH; direction < CARDINAL_DIRECTION_COUNT; direction++) - { - tile[AXIS_X] = surroundingTile[direction][AXIS_X]; - tile[AXIS_Y] = surroundingTile[direction][AXIS_Y]; - - if (!CheckTileQualification(tile, player, facingDirection, objectEvent, isTileLand, direction)) - continue; - - numQualifyingTile++; - } - return numQualifyingTile; -} - -static bool32 CheckTileQualification(s16 tile[], s16 player[], u32 facingDirection, struct ObjectEvent* objectEvent, bool32 isTileLand[], u32 direction) -{ - u32 collison = GetCollisionAtCoords(objectEvent, tile[AXIS_X], tile[AXIS_Y], facingDirection); - - if (IsPlayerHere(tile[AXIS_X], tile[AXIS_Y], player[AXIS_X], player[AXIS_Y])) - return FALSE; - else if (IsMetatileBlocking(tile[AXIS_X], tile[AXIS_Y], collison)) - return TRUE; - else if (MetatileBehavior_IsSurfableFishableWater(MapGridGetMetatileBehaviorAt(tile[AXIS_X], tile[AXIS_Y]))) - return FALSE; - else if (IsMetatileLand(tile[AXIS_X], tile[AXIS_Y], collison)) - isTileLand[direction] = TRUE; - - return FALSE; -} - -static u32 CountLandTiles(bool32 isTileLand[]) -{ - u32 direction, numQualifyingTile = 0; - - for (direction = DIR_SOUTH; direction < CARDINAL_DIRECTION_COUNT; direction++) - if (isTileLand[direction]) - numQualifyingTile++; - - return (numQualifyingTile < 2) ? 0 : numQualifyingTile; -} - -static bool32 IsPlayerHere(s16 x, s16 y, s16 playerX, s16 playerY) -{ - return ((x == playerX) && (y == playerY)); -} - -static bool32 IsMetatileBlocking(s16 x, s16 y, u32 collison) -{ - switch(collison) - { - case COLLISION_NONE: - case COLLISION_STOP_SURFING: - case COLLISION_ELEVATION_MISMATCH: - return FALSE; - default: - return TRUE; - case COLLISION_OBJECT_EVENT: - return (gObjectEvents[GetObjectEventIdByXY(x,y)].inanimate); - } - return TRUE; -} - -static bool32 IsMetatileLand(s16 x, s16 y, u32 collison) -{ - switch(collison) - { - case COLLISION_NONE: - case COLLISION_STOP_SURFING: - case COLLISION_ELEVATION_MISMATCH: - return TRUE; - default: - return FALSE; - } -} - -#undef tStep -#undef tFrameCounter -#undef tFishingRod - -static void AlignFishingAnimationFrames(void) -{ - struct Sprite *playerSprite = &gSprites[gPlayerAvatar.spriteId]; - u8 animCmdIndex; - u8 animType; - - AnimateSprite(playerSprite); - playerSprite->x2 = 0; - playerSprite->y2 = 0; - animCmdIndex = playerSprite->animCmdIndex; - if (playerSprite->anims[playerSprite->animNum][animCmdIndex].type == -1) - { - animCmdIndex--; - } - else - { - playerSprite->animDelayCounter++; - if (playerSprite->anims[playerSprite->animNum][animCmdIndex].type == -1) - animCmdIndex--; - } - animType = playerSprite->anims[playerSprite->animNum][animCmdIndex].type; - if (animType == 1 || animType == 2 || animType == 3) - { - playerSprite->x2 = 8; - if (GetPlayerFacingDirection() == 3) - playerSprite->x2 = -8; - } - if (animType == 5) - playerSprite->y2 = -8; - if (animType == 10 || animType == 11) - playerSprite->y2 = 8; - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) - SetSurfBlob_PlayerOffset(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, TRUE, playerSprite->y2); -} - void SetSpinStartFacingDir(u8 direction) { sSpinStartFacingDir = direction; @@ -2762,7 +2125,6 @@ bool8 ObjectMovingOnRockStairs(struct ObjectEvent *objectEvent, u8 direction) s16 x = objectEvent->currentCoords.x; s16 y = objectEvent->currentCoords.y; - // TODO followers on sideways stairs if (IsFollowerVisible() && GetFollowerObject() != NULL && (objectEvent->isPlayer || objectEvent->localId == OBJ_EVENT_ID_FOLLOWER)) return FALSE; diff --git a/src/field_poison.c b/src/field_poison.c index 30ae7c21a7a1..f4be9970a239 100644 --- a/src/field_poison.c +++ b/src/field_poison.c @@ -94,9 +94,9 @@ static void Task_TryFieldPoisonWhiteOut(u8 taskId) { // Battle facilities have their own white out script to handle the challenge loss #ifdef BUGFIX - if (InBattlePyramid() || InBattlePike() || InTrainerHillChallenge()) + if (CurrentBattlePyramidLocation() || InBattlePike() || InTrainerHillChallenge()) #else - if (InBattlePyramid() | InBattlePike() || InTrainerHillChallenge()) + if (CurrentBattlePyramidLocation() | InBattlePike() || InTrainerHillChallenge()) #endif gSpecialVar_Result = FLDPSN_FRONTIER_WHITEOUT; else diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index 7b17f53666f6..2a3a5993d8e2 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -24,6 +24,7 @@ #include "mirage_tower.h" #include "metatile_behavior.h" #include "palette.h" +#include "oras_dowse.h" #include "overworld.h" #include "scanline_effect.h" #include "script.h" @@ -86,7 +87,7 @@ static void FillPalBufferBlack(void) void WarpFadeInScreen(void) { - u8 previousMapType = GetLastUsedWarpMapType(); + enum MapType previousMapType = GetLastUsedWarpMapType(); switch (GetMapPairFadeFromType(previousMapType, GetCurrentMapType())) { case 0: @@ -113,7 +114,7 @@ void FadeInFromBlack(void) void WarpFadeOutScreen(void) { - u8 currentMapType = GetCurrentMapType(); + enum MapType currentMapType = GetCurrentMapType(); switch (GetMapPairFadeToType(currentMapType, GetDestinationWarpMapHeader()->mapType)) { case 0: @@ -684,6 +685,7 @@ void Task_WarpAndLoadMap(u8 taskId) case 0: FreezeObjectEvents(); LockPlayerFieldControls(); + EndORASDowsing(); task->tState++; break; case 1: @@ -745,6 +747,7 @@ void Task_DoDoorWarp(u8 taskId) ObjectEventSetHeldMovement(followerObject, MOVEMENT_ACTION_ENTER_POKEBALL); } task->tDoorTask = FieldAnimateDoorOpen(*x, *y - 1); + EndORASDowsing(); task->tState = DOORWARP_START_WALK_UP; break; case DOORWARP_START_WALK_UP: @@ -1384,10 +1387,10 @@ static bool32 PrintWhiteOutRecoveryMessage(u8 taskId, const u8 *text, u32 x, u32 } enum { - FRLG_WHITEOUT_ENTER_MSG_SCREEN, - FRLG_WHITEOUT_PRINT_MSG, - FRLG_WHITEOUT_LEAVE_MSG_SCREEN, - FRLG_WHITEOUT_HEAL_SCRIPT, + WHITEOUT_CUTSCENE_ENTER_MSG_SCREEN, + WHITEOUT_CUTSCENE_PRINT_MSG, + WHITEOUT_CUTSCENE_LEAVE_MSG_SCREEN, + WHITEOUT_CUTSCENE_HEAL_SCRIPT, }; static const u8 *GenerateRecoveryMessage(u8 taskId) @@ -1411,7 +1414,7 @@ static void Task_RushInjuredPokemonToCenter(u8 taskId) switch (gTasks[taskId].tState) { - case FRLG_WHITEOUT_ENTER_MSG_SCREEN: + case WHITEOUT_CUTSCENE_ENTER_MSG_SCREEN: windowId = AddWindow(&sWindowTemplate_WhiteoutText); gTasks[taskId].tWindowId = windowId; Menu_LoadStdPalAt(BG_PLTT_ID(15)); @@ -1420,28 +1423,28 @@ static void Task_RushInjuredPokemonToCenter(u8 taskId) CopyWindowToVram(windowId, COPYWIN_FULL); gTasks[taskId].tIsPlayerHouse = IsLastHealLocationPlayerHouse(); - gTasks[taskId].tState = FRLG_WHITEOUT_PRINT_MSG; + gTasks[taskId].tState = WHITEOUT_CUTSCENE_PRINT_MSG; break; - case FRLG_WHITEOUT_PRINT_MSG: + case WHITEOUT_CUTSCENE_PRINT_MSG: { const u8 *recoveryMessage = GenerateRecoveryMessage(taskId); if (PrintWhiteOutRecoveryMessage(taskId, recoveryMessage, 2, 8)) { ObjectEventTurn(&gObjectEvents[gPlayerAvatar.objectEventId], DIR_NORTH); - gTasks[taskId].tState = FRLG_WHITEOUT_LEAVE_MSG_SCREEN; + gTasks[taskId].tState = WHITEOUT_CUTSCENE_LEAVE_MSG_SCREEN; } break; } - case FRLG_WHITEOUT_LEAVE_MSG_SCREEN: + case WHITEOUT_CUTSCENE_LEAVE_MSG_SCREEN: windowId = gTasks[taskId].tWindowId; ClearWindowTilemap(windowId); CopyWindowToVram(windowId, COPYWIN_MAP); RemoveWindow(windowId); FadeInFromBlack(); - gTasks[taskId].tState = FRLG_WHITEOUT_HEAL_SCRIPT; + gTasks[taskId].tState = WHITEOUT_CUTSCENE_HEAL_SCRIPT; break; - case FRLG_WHITEOUT_HEAL_SCRIPT: + case WHITEOUT_CUTSCENE_HEAL_SCRIPT: if (WaitForWeatherFadeIn() == TRUE) { DestroyTask(taskId); @@ -1461,7 +1464,7 @@ void FieldCB_RushInjuredPokemonToCenter(void) LockPlayerFieldControls(); FillPalBufferBlack(); taskId = CreateTask(Task_RushInjuredPokemonToCenter, 10); - gTasks[taskId].tState = FRLG_WHITEOUT_ENTER_MSG_SCREEN; + gTasks[taskId].tState = WHITEOUT_CUTSCENE_ENTER_MSG_SCREEN; } static void GetStairsMovementDirection(u32 metatileBehavior, s16 *speedX, s16 *speedY) @@ -1571,12 +1574,14 @@ static void Task_ExitStairs(u8 taskId) tState++; break; } + gObjectEvents[gPlayerAvatar.objectEventId].noShadow = FALSE; } static void ForceStairsMovement(u32 metatileBehavior, s16 *speedX, s16 *speedY) { ObjectEventForceSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], GetWalkInPlaceNormalMovementAction(GetPlayerFacingDirection())); GetStairsMovementDirection(metatileBehavior, speedX, speedY); + gObjectEvents[gPlayerAvatar.objectEventId].noShadow = TRUE; } #undef tSpeedX #undef tSpeedY @@ -1620,6 +1625,7 @@ static void Task_StairWarp(u8 taskId) LockPlayerFieldControls(); FreezeObjectEvents(); CameraObjectFreeze(); + HideFollowerForFieldEffect(); tState++; break; case 1: diff --git a/src/field_special_scene.c b/src/field_special_scene.c index ccb15f02b4d4..6c66b50f8bf4 100644 --- a/src/field_special_scene.c +++ b/src/field_special_scene.c @@ -34,7 +34,7 @@ #define BOX3_Y_OFFSET 0 // porthole states -enum +enum PortholeState { INIT_PORTHOLE, IDLE_CHECK, @@ -300,7 +300,7 @@ void Task_HandlePorthole(u8 taskId) u16 *cruiseState = GetVarPointer(VAR_SS_TIDAL_STATE); struct WarpData *location = &gSaveBlock1Ptr->location; - switch (data[0]) + switch ((enum PortholeState)data[0]) { case INIT_PORTHOLE: // finish fading before making porthole finish. if (!gPaletteFade.active) diff --git a/src/field_specials.c b/src/field_specials.c index 971847888a5a..d48ac09d3e85 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -19,14 +19,16 @@ #include "field_weather.h" #include "graphics.h" #include "international_string_util.h" +#include "item.h" #include "item_icon.h" #include "link.h" -#include "load_save.h" #include "list_menu.h" +#include "load_save.h" #include "main.h" -#include "mystery_gift.h" #include "match_call.h" #include "menu.h" +#include "metatile_behavior.h" +#include "mystery_gift.h" #include "overworld.h" #include "party_menu.h" #include "pokeblock.h" @@ -59,7 +61,6 @@ #include "constants/field_specials.h" #include "constants/items.h" #include "constants/heal_locations.h" -#include "constants/map_types.h" #include "constants/mystery_gift.h" #include "constants/slot_machine.h" #include "constants/songs.h" @@ -122,14 +123,14 @@ static void Task_MoveElevator(u8); static void MoveElevatorWindowLights(u16, bool8); static void Task_MoveElevatorWindowLights(u8); static void Task_ShowScrollableMultichoice(u8); -static void FillFrontierExchangeCornerWindowAndItemIcon(u16, u16); -static void ShowBattleFrontierTutorWindow(u8, u16); +static void FillFrontierExchangeCornerWindowAndItemIcon(enum ScrollMulti, u16); +static void ShowBattleFrontierTutorWindow(enum ScrollMulti, u16); static void InitScrollableMultichoice(void); static void ScrollableMultichoice_ProcessInput(u8); static void ScrollableMultichoice_UpdateScrollArrows(u8); static void ScrollableMultichoice_MoveCursor(s32, bool8, struct ListMenu *); -static void HideFrontierExchangeCornerItemIcon(u16, u16); -static void ShowBattleFrontierTutorMoveDescription(u8, u16); +static void HideFrontierExchangeCornerItemIcon(enum ScrollMulti, u16); +static void ShowBattleFrontierTutorMoveDescription(enum ScrollMulti, u16); static void CloseScrollableMultichoice(u8); static void ScrollableMultichoice_RemoveScrollArrows(u8); static void Task_ScrollableMultichoice_WaitReturnToList(u8); @@ -314,10 +315,11 @@ bool32 CountSSTidalStep(u16 delta) return TRUE; } -u8 GetSSTidalLocation(s8 *mapGroup, s8 *mapNum, s16 *x, s16 *y) +enum SSTidalLocation GetSSTidalLocation(s8 *mapGroup, s8 *mapNum, s16 *x, s16 *y) { u16 *varCruiseStepCount = GetVarPointer(VAR_CRUISE_STEP_COUNT); - switch (*GetVarPointer(VAR_SS_TIDAL_STATE)) + + switch ((enum SSTidalState)(*GetVarPointer(VAR_SS_TIDAL_STATE))) { case SS_TIDAL_BOARD_SLATEPORT: case SS_TIDAL_LAND_SLATEPORT: @@ -680,10 +682,10 @@ void MauvilleGymSetDefaultBarriers(void) MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH2_On); break; case METATILE_MauvilleGym_GreenBeamH3_Off: - MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH3_On | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH3_On | MAPGRID_IMPASSABLE); break; case METATILE_MauvilleGym_GreenBeamH4_Off: - MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH4_On | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH4_On | MAPGRID_IMPASSABLE); break; case METATILE_MauvilleGym_RedBeamH1_On: MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH1_Off); @@ -704,37 +706,37 @@ void MauvilleGymSetDefaultBarriers(void) MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH2_On); break; case METATILE_MauvilleGym_RedBeamH3_Off: - MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH3_On | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH3_On | MAPGRID_IMPASSABLE); break; case METATILE_MauvilleGym_RedBeamH4_Off: - MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH4_On | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH4_On | MAPGRID_IMPASSABLE); break; case METATILE_MauvilleGym_GreenBeamV1_On: - MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleBottom_On | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleBottom_On | MAPGRID_IMPASSABLE); break; case METATILE_MauvilleGym_GreenBeamV2_On: MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_FloorTile); break; case METATILE_MauvilleGym_RedBeamV1_On: - MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleBottom_Off | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleBottom_Off | MAPGRID_IMPASSABLE); break; case METATILE_MauvilleGym_RedBeamV2_On: MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_FloorTile); break; case METATILE_MauvilleGym_PoleBottom_On: - MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamV1_On | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamV1_On | MAPGRID_IMPASSABLE); break; case METATILE_MauvilleGym_FloorTile: if (MapGridGetMetatileIdAt(x, y - 1) == METATILE_MauvilleGym_GreenBeamV1_On) - MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamV2_On | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamV2_On | MAPGRID_IMPASSABLE); else - MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamV2_On | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamV2_On | MAPGRID_IMPASSABLE); break; case METATILE_MauvilleGym_PoleBottom_Off: - MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamV1_On | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamV1_On | MAPGRID_IMPASSABLE); break; case METATILE_MauvilleGym_PoleTop_Off: - MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleTop_On | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleTop_On | MAPGRID_IMPASSABLE); break; case METATILE_MauvilleGym_PoleTop_On: MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleTop_Off); @@ -785,10 +787,10 @@ void MauvilleGymDeactivatePuzzle(void) MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH4_Off); break; case METATILE_MauvilleGym_GreenBeamV1_On: - MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleBottom_On | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleBottom_On | MAPGRID_IMPASSABLE); break; case METATILE_MauvilleGym_RedBeamV1_On: - MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleBottom_Off | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleBottom_Off | MAPGRID_IMPASSABLE); break; case METATILE_MauvilleGym_GreenBeamV2_On: case METATILE_MauvilleGym_RedBeamV2_On: @@ -897,8 +899,8 @@ static void PetalburgGymSetDoorMetatiles(u8 roomNumber, u16 metatileId) } for (i = 0; i < nDoors; i++) { - MapGridSetMetatileIdAt(doorCoordsX[i] + MAP_OFFSET, doorCoordsY[i] + MAP_OFFSET, metatileId | MAPGRID_COLLISION_MASK); - MapGridSetMetatileIdAt(doorCoordsX[i] + MAP_OFFSET, doorCoordsY[i] + MAP_OFFSET + 1, (metatileId + METATILE_ROW_WIDTH) | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(doorCoordsX[i] + MAP_OFFSET, doorCoordsY[i] + MAP_OFFSET, metatileId | MAPGRID_IMPASSABLE); + MapGridSetMetatileIdAt(doorCoordsX[i] + MAP_OFFSET, doorCoordsY[i] + MAP_OFFSET + 1, (metatileId + METATILE_ROW_WIDTH) | MAPGRID_IMPASSABLE); } DrawWholeMapView(); } @@ -984,7 +986,7 @@ void FieldShowRegionMap(void) static bool32 IsBuildingPCTile(u32 tileId) { - return gMapHeader.mapLayout->primaryTileset == &gTileset_Building && (tileId == METATILE_Building_PC_On || tileId == METATILE_Building_PC_Off); + return (MetatileBehavior_IsPC(UNPACK_BEHAVIOR(GetMetatileAttributesById(tileId)))); } static bool32 IsPlayerHousePCTile(u32 tileId) @@ -1098,7 +1100,7 @@ static void PCTurnOnEffect_SetMetatile(s16 isScreenOn, s8 dx, s8 dy) else if (gSpecialVar_0x8004 == PC_LOCATION_MAYS_HOUSE) metatileId = METATILE_BrendansMaysHouse_MayPC_On; } - MapGridSetMetatileIdAt(gSaveBlock1Ptr->pos.x + dx + MAP_OFFSET, gSaveBlock1Ptr->pos.y + dy + MAP_OFFSET, metatileId | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(gSaveBlock1Ptr->pos.x + dx + MAP_OFFSET, gSaveBlock1Ptr->pos.y + dy + MAP_OFFSET, metatileId | MAPGRID_IMPASSABLE); } // For this special, gSpecialVar_0x8004 is expected to be some PC_LOCATION_* value. @@ -1141,7 +1143,7 @@ static void PCTurnOffEffect(void) else if (gSpecialVar_0x8004 == PC_LOCATION_MAYS_HOUSE) metatileId = METATILE_BrendansMaysHouse_MayPC_Off; - MapGridSetMetatileIdAt(gSaveBlock1Ptr->pos.x + dx + MAP_OFFSET, gSaveBlock1Ptr->pos.y + dy + MAP_OFFSET, metatileId | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(gSaveBlock1Ptr->pos.x + dx + MAP_OFFSET, gSaveBlock1Ptr->pos.y + dy + MAP_OFFSET, metatileId | MAPGRID_IMPASSABLE); DrawWholeMapView(); } @@ -1173,14 +1175,14 @@ static void LotteryCornerComputerEffect(struct Task *task) if (task->tIsScreenOn) { // Screen is on, set it off - MapGridSetMetatileIdAt(11 + MAP_OFFSET, 1 + MAP_OFFSET, METATILE_Shop_Laptop1_Normal | MAPGRID_COLLISION_MASK); - MapGridSetMetatileIdAt(11 + MAP_OFFSET, 2 + MAP_OFFSET, METATILE_Shop_Laptop2_Normal | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(11 + MAP_OFFSET, 1 + MAP_OFFSET, METATILE_Shop_Laptop1_Normal | MAPGRID_IMPASSABLE); + MapGridSetMetatileIdAt(11 + MAP_OFFSET, 2 + MAP_OFFSET, METATILE_Shop_Laptop2_Normal | MAPGRID_IMPASSABLE); } else { // Screen is off, set it on - MapGridSetMetatileIdAt(11 + MAP_OFFSET, 1 + MAP_OFFSET, METATILE_Shop_Laptop1_Flash | MAPGRID_COLLISION_MASK); - MapGridSetMetatileIdAt(11 + MAP_OFFSET, 2 + MAP_OFFSET, METATILE_Shop_Laptop2_Flash | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(11 + MAP_OFFSET, 1 + MAP_OFFSET, METATILE_Shop_Laptop1_Flash | MAPGRID_IMPASSABLE); + MapGridSetMetatileIdAt(11 + MAP_OFFSET, 2 + MAP_OFFSET, METATILE_Shop_Laptop2_Flash | MAPGRID_IMPASSABLE); } DrawWholeMapView(); @@ -1195,8 +1197,8 @@ static void LotteryCornerComputerEffect(struct Task *task) void EndLotteryCornerComputerEffect(void) { - MapGridSetMetatileIdAt(11 + MAP_OFFSET, 1 + MAP_OFFSET, METATILE_Shop_Laptop1_Normal | MAPGRID_COLLISION_MASK); - MapGridSetMetatileIdAt(11 + MAP_OFFSET, 2 + MAP_OFFSET, METATILE_Shop_Laptop2_Normal | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(11 + MAP_OFFSET, 1 + MAP_OFFSET, METATILE_Shop_Laptop1_Normal | MAPGRID_IMPASSABLE); + MapGridSetMetatileIdAt(11 + MAP_OFFSET, 2 + MAP_OFFSET, METATILE_Shop_Laptop2_Normal | MAPGRID_IMPASSABLE); DrawWholeMapView(); } @@ -1273,7 +1275,7 @@ void IsGrassTypeInParty(void) if (GetMonData(pokemon, MON_DATA_SANITY_HAS_SPECIES) && !GetMonData(pokemon, MON_DATA_IS_EGG)) { species = GetMonData(pokemon, MON_DATA_SPECIES); - if (gSpeciesInfo[species].types[0] == TYPE_GRASS || gSpeciesInfo[species].types[1] == TYPE_GRASS) + if (GetSpeciesType(species, 0) == TYPE_GRASS || GetSpeciesType(species, 1) == TYPE_GRASS) { gSpecialVar_Result = TRUE; return; @@ -1672,7 +1674,7 @@ u16 GetMysteryGiftCardStat(void) bool8 BufferTMHMMoveName(void) { - if (gSpecialVar_0x8004 >= ITEM_TM01 && gSpecialVar_0x8004 <= ITEM_HM08) + if (gItemsInfo[gSpecialVar_0x8004].pocket == POCKET_TM_HM) { StringCopy(gStringVar2, GetMoveName(ItemIdToBattleMoveId(gSpecialVar_0x8004))); return TRUE; @@ -1781,7 +1783,7 @@ static const u16 sElevatorWindowTiles_Descending[ELEVATOR_WINDOW_HEIGHT][ELEVATO void SetDeptStoreFloor(void) { - u8 deptStoreFloor; + enum DeptStoreFloorNumber deptStoreFloor; switch (gSaveBlock1Ptr->dynamicWarp.mapNum) { case MAP_NUM(MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F): @@ -1976,7 +1978,7 @@ static void Task_MoveElevatorWindowLights(u8 taskId) for (y = 0; y < ELEVATOR_WINDOW_HEIGHT; y++) { for (x = 0; x < ELEVATOR_WINDOW_WIDTH; x++) - MapGridSetMetatileIdAt(x + MAP_OFFSET + 1, y + MAP_OFFSET, sElevatorWindowTiles_Ascending[y][tMoveCounter % ELEVATOR_LIGHT_STAGES] | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x + MAP_OFFSET + 1, y + MAP_OFFSET, sElevatorWindowTiles_Ascending[y][tMoveCounter % ELEVATOR_LIGHT_STAGES] | MAPGRID_IMPASSABLE); } } else @@ -1985,7 +1987,7 @@ static void Task_MoveElevatorWindowLights(u8 taskId) for (y = 0; y < ELEVATOR_WINDOW_HEIGHT; y++) { for (x = 0; x < ELEVATOR_WINDOW_WIDTH; x++) - MapGridSetMetatileIdAt(x + MAP_OFFSET + 1, y + MAP_OFFSET, sElevatorWindowTiles_Descending[y][tMoveCounter % ELEVATOR_LIGHT_STAGES] | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x + MAP_OFFSET + 1, y + MAP_OFFSET, sElevatorWindowTiles_Descending[y][tMoveCounter % ELEVATOR_LIGHT_STAGES] | MAPGRID_IMPASSABLE); } } DrawWholeMapView(); @@ -2294,7 +2296,7 @@ void ShowScrollableMultichoice(void) struct Task *task = &gTasks[taskId]; task->tScrollMultiId = gSpecialVar_0x8004; - switch (gSpecialVar_0x8004) + switch ((enum ScrollMulti)gSpecialVar_0x8004) { case SCROLL_MULTI_NONE: task->tMaxItemsOnScreen = 1; @@ -2989,7 +2991,7 @@ void CloseFrontierExchangeCornerItemIconWindow(void) RemoveWindow(sFrontierExchangeCorner_ItemIconWindowId); } -static void FillFrontierExchangeCornerWindowAndItemIcon(u16 menu, u16 selection) +static void FillFrontierExchangeCornerWindowAndItemIcon(enum ScrollMulti menu, u16 selection) { #include "data/battle_frontier/battle_frontier_exchange_corner.h" @@ -3032,6 +3034,8 @@ static void FillFrontierExchangeCornerWindowAndItemIcon(u16 menu, u16 selection) AddTextPrinterParameterized2(0, FONT_NORMAL, sFrontierExchangeCorner_HoldItemsDescriptions[selection], 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); ShowFrontierExchangeCornerItemIcon(sFrontierExchangeCorner_HoldItems[selection]); break; + default: + break; } } } @@ -3050,7 +3054,7 @@ static void ShowFrontierExchangeCornerItemIcon(u16 item) } } -static void HideFrontierExchangeCornerItemIcon(u16 menu, u16 unused) +static void HideFrontierExchangeCornerItemIcon(enum ScrollMulti menu, u16 unused) { if (sScrollableMultichoice_ItemSpriteId != MAX_SPRITES) { @@ -3063,6 +3067,8 @@ static void HideFrontierExchangeCornerItemIcon(u16 menu, u16 unused) // This makes sure deleting the icon will not clear palettes in use by object events FieldEffectFreeGraphicsResources(&gSprites[sScrollableMultichoice_ItemSpriteId]); break; + default: + break; } sScrollableMultichoice_ItemSpriteId = MAX_SPRITES; } @@ -3073,7 +3079,7 @@ void BufferBattleFrontierTutorMoveName(void) StringCopy(gStringVar1, GetMoveName(gSpecialVar_0x8005)); } -static void ShowBattleFrontierTutorWindow(u8 menu, u16 selection) +static void ShowBattleFrontierTutorWindow(enum ScrollMulti menu, u16 selection) { static const struct WindowTemplate sBattleFrontierTutor_WindowTemplate = { @@ -3097,7 +3103,7 @@ static void ShowBattleFrontierTutorWindow(u8 menu, u16 selection) } } -static void ShowBattleFrontierTutorMoveDescription(u8 menu, u16 selection) +static void ShowBattleFrontierTutorMoveDescription(enum ScrollMulti menu, u16 selection) { static const u8 *const sBattleFrontier_TutorMoveDescriptions1[] = { @@ -4307,8 +4313,8 @@ void GetObjectPosition(u16* xPointer, u16* yPointer, u32 localId, u32 useTemplat objectId = GetObjectEventIdByLocalId(localId); objEvent = &gObjectEvents[objectId]; - *xPointer = objEvent->currentCoords.x - 7; - *yPointer = objEvent->currentCoords.y - 7; + *xPointer = objEvent->currentCoords.x - MAP_OFFSET; + *yPointer = objEvent->currentCoords.y - MAP_OFFSET; } bool32 CheckObjectAtXY(u32 x, u32 y) @@ -4350,6 +4356,7 @@ void UseBlankMessageToCancelPokemonPic(void) void EnterCode(void) { + StringCopy(gStringVar2, COMPOUND_STRING("")); DoNamingScreen(NAMING_SCREEN_CODE, gStringVar2, 0, 0, 0, CB2_ReturnToFieldContinueScript); } @@ -4361,3 +4368,16 @@ void GetCodeFeedback(void) else gSpecialVar_Result = 0; } + +void SetHiddenNature(void) +{ + u32 hiddenNature = gSpecialVar_Result; + SetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_HIDDEN_NATURE, &hiddenNature); + CalculateMonStats(&gPlayerParty[gSpecialVar_0x8004]); +} + +void SetAbility(void) +{ + u32 ability = gSpecialVar_Result; + SetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_ABILITY_NUM, &ability); +} diff --git a/src/field_weather.c b/src/field_weather.c index 7e8d83b2a5fb..7355b788098a 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -1186,3 +1186,33 @@ bool32 IsWeatherAlphaBlend(void) || gWeatherPtr->currWeather == WEATHER_UNDERWATER_BUBBLES || gWeatherPtr->currWeather == WEATHER_UNDERWATER); } + +static const u8 sWeatherNames[WEATHER_COUNT][24] = { + [WEATHER_NONE] = _("NONE"), + [WEATHER_SUNNY_CLOUDS] = _("SUNNY CLOUDS"), + [WEATHER_SUNNY] = _("SUNNY"), + [WEATHER_RAIN] = _("RAIN"), + [WEATHER_SNOW] = _("SNOW"), + [WEATHER_RAIN_THUNDERSTORM] = _("RAIN THUNDERSTORM"), + [WEATHER_FOG_HORIZONTAL] = _("FOG HORIZONTAL"), + [WEATHER_VOLCANIC_ASH] = _("VOLCANIC ASH"), + [WEATHER_SANDSTORM] = _("SANDSTORM"), + [WEATHER_FOG_DIAGONAL] = _("FOG DIAGONAL"), + [WEATHER_UNDERWATER] = _("UNDERWATER"), + [WEATHER_SHADE] = _("SHADE"), + [WEATHER_DROUGHT] = _("DROUGHT"), + [WEATHER_DOWNPOUR] = _("DOWNPOUR"), + [WEATHER_UNDERWATER_BUBBLES] = _("UNDERWATER BUBBLES"), + [WEATHER_ABNORMAL] = _("ABNORMAL(NOT WORKING)"), + [WEATHER_ROUTE119_CYCLE] = _("ROUTE119 CYCLE"), + [WEATHER_ROUTE123_CYCLE] = _("ROUTE123 CYCLE"), + [WEATHER_FOG] = _("FOG"), +}; + +static const u8 sDebugText_WeatherNotDefined[] = _("NOT DEFINED!!!"); +const u8 *GetWeatherName(u32 weatherId) +{ + if (sWeatherNames[weatherId][0] != 0) + return sWeatherNames[weatherId]; + return sDebugText_WeatherNotDefined; +} diff --git a/src/fieldmap.c b/src/fieldmap.c index 255e1b89048e..5e8a261cab40 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -52,7 +52,7 @@ static inline u16 GetBorderBlockAt(int x, int y) { int i = (x + 1) & 1; i += ((y + 1) & 1) * 2; - return gMapHeader.mapLayout->border[i] | MAPGRID_COLLISION_MASK; + return gMapHeader.mapLayout->border[i] | MAPGRID_IMPASSABLE; } #define AreCoordsWithinMapGridBounds(x, y) (x >= 0 && x < gBackupMapLayout.width && y >= 0 && y < gBackupMapLayout.height) @@ -345,7 +345,7 @@ u8 MapGridGetElevationAt(int x, int y) if (block == MAPGRID_UNDEFINED) return 0; - return block >> MAPGRID_ELEVATION_SHIFT; + return UNPACK_ELEVATION(block); } u8 MapGridGetCollisionAt(int x, int y) @@ -355,7 +355,7 @@ u8 MapGridGetCollisionAt(int x, int y) if (block == MAPGRID_UNDEFINED) return TRUE; - return (block & MAPGRID_COLLISION_MASK) >> MAPGRID_COLLISION_SHIFT; + return UNPACK_COLLISION(block); } u32 MapGridGetMetatileIdAt(int x, int y) @@ -363,21 +363,21 @@ u32 MapGridGetMetatileIdAt(int x, int y) u16 block = GetMapGridBlockAt(x, y); if (block == MAPGRID_UNDEFINED) - return GetBorderBlockAt(x, y) & MAPGRID_METATILE_ID_MASK; + return UNPACK_METATILE(GetBorderBlockAt(x, y)); - return block & MAPGRID_METATILE_ID_MASK; + return UNPACK_METATILE(block); } u32 MapGridGetMetatileBehaviorAt(int x, int y) { u16 metatile = MapGridGetMetatileIdAt(x, y); - return GetMetatileAttributesById(metatile) & METATILE_ATTR_BEHAVIOR_MASK; + return UNPACK_BEHAVIOR(GetMetatileAttributesById(metatile)); } u8 MapGridGetMetatileLayerTypeAt(int x, int y) { u16 metatile = MapGridGetMetatileIdAt(x, y); - return (GetMetatileAttributesById(metatile) & METATILE_ATTR_LAYER_MASK) >> METATILE_ATTR_LAYER_SHIFT; + return UNPACK_LAYER_TYPE(GetMetatileAttributesById(metatile)); } void MapGridSetMetatileIdAt(int x, int y, u16 metatile) @@ -386,6 +386,8 @@ void MapGridSetMetatileIdAt(int x, int y, u16 metatile) if (AreCoordsWithinMapGridBounds(x, y)) { i = x + y * gBackupMapLayout.width; + + // Elevation is ignored in the argument, but copy metatile ID and collision gBackupMapLayout.map[i] = (gBackupMapLayout.map[i] & MAPGRID_ELEVATION_MASK) | (metatile & ~MAPGRID_ELEVATION_MASK); } } @@ -839,7 +841,7 @@ static bool8 SkipCopyingMetatileFromSavedMap(u16 *mapBlock, u16 mapWidth, u8 yMo else mapBlock += mapWidth; - if (IsLargeBreakableDecoration(*mapBlock & MAPGRID_METATILE_ID_MASK, yMode) == TRUE) + if (IsLargeBreakableDecoration(UNPACK_METATILE(*mapBlock), yMode) == TRUE) return TRUE; return FALSE; } diff --git a/src/fishing.c b/src/fishing.c new file mode 100644 index 000000000000..7730351abbcb --- /dev/null +++ b/src/fishing.c @@ -0,0 +1,650 @@ +#include "global.h" +#include "main.h" +#include "event_object_movement.h" +#include "fieldmap.h" +#include "field_effect_helpers.h" +#include "field_player_avatar.h" +#include "menu.h" +#include "metatile_behavior.h" +#include "random.h" +#include "script.h" +#include "strings.h" +#include "task.h" +#include "text.h" +#include "tv.h" +#include "wild_encounter.h" +#include "config/fishing.h" + +static void Task_Fishing(u8); +static bool32 Fishing_Init(struct Task *); +static bool32 Fishing_GetRodOut(struct Task *); +static bool32 Fishing_WaitBeforeDots(struct Task *); +static bool32 Fishing_InitDots(struct Task *); +static bool32 Fishing_ShowDots(struct Task *); +static bool32 Fishing_CheckForBite(struct Task *); +static bool32 Fishing_GotBite(struct Task *); +static bool32 Fishing_ChangeMinigame(struct Task *); +static bool32 Fishing_WaitForA(struct Task *); +static bool32 Fishing_APressNoMinigame(struct Task *); +static bool32 Fishing_CheckMoreDots(struct Task *); +static bool32 Fishing_MonOnHook(struct Task *); +static bool32 Fishing_StartEncounter(struct Task *); +static bool32 Fishing_NotEvenNibble(struct Task *); +static bool32 Fishing_GotAway(struct Task *); +static bool32 Fishing_NoMon(struct Task *); +static bool32 Fishing_PutRodAway(struct Task *); +static bool32 Fishing_EndNoMon(struct Task *); +static void AlignFishingAnimationFrames(void); +static bool32 DoesFishingMinigameAllowCancel(void); +static bool32 Fishing_DoesFirstMonInPartyHaveSuctionCupsOrStickyHold(void); +static bool32 Fishing_RollForBite(u32, bool32); +static u32 CalculateFishingBiteOdds(u32, bool32); +static u32 CalculateFishingFollowerBoost(void); +static u32 CalculateFishingProximityBoost(void); +static u32 CalculateFishingTimeOfDayBoost(void); + +#define FISHING_PROXIMITY_BOOST 20 //Active if config I_FISHING_PROXIMITY is TRUE +#define FISHING_TIME_OF_DAY_BOOST 20 //Active if config I_FISHING_TIME_OF_DAY_BOOST is TRUE +#define FISHING_GEN3_STICKY_CHANCE 85 //Active if config I_FISHING_STICKY_BOOST is set to GEN_3 or lower + +#if I_FISHING_BITE_ODDS >= GEN_4 + #define FISHING_OLD_ROD_ODDS 25 + #define FISHING_GOOD_ROD_ODDS 50 + #define FISHING_SUPER_ROD_ODDS 75 +#elif I_FISHING_BITE_ODDS >= GEN_3 + #define FISHING_OLD_ROD_ODDS 50 + #define FISHING_GOOD_ROD_ODDS 50 + #define FISHING_SUPER_ROD_ODDS 50 +#else + #define FISHING_OLD_ROD_ODDS 100 + #define FISHING_GOOD_ROD_ODDS 33 + #define FISHING_SUPER_ROD_ODDS 50 +#endif + +struct FriendshipHookChanceBoost +{ + u8 threshold; + u8 bonus; +}; + +//Needs to be defined in descending order and end with the 0 friendship boost +//Active if config I_FISHING_FOLLOWER_BOOST is TRUE +static const struct FriendshipHookChanceBoost sFriendshipHookChanceBoostArray[] = +{ + {.threshold = 250, .bonus = 50}, + {.threshold = 200, .bonus = 40}, + {.threshold = 150, .bonus = 30}, + {.threshold = 100, .bonus = 20}, + {.threshold = 0, .bonus = 0}, +}; + +#define FISHING_CHAIN_SHINY_STREAK_MAX 20 + +enum +{ + FISHING_INIT, + FISHING_GET_ROD_OUT, + FISHING_WAIT_BEFORE_DOTS, + FISHING_INIT_DOTS, + FISHING_SHOW_DOTS, + FISHING_CHECK_FOR_BITE, + FISHING_GOT_BITE, + FISHING_CHANGE_MINIGAME, + FISHING_WAIT_FOR_A, + FISHING_A_PRESS_NO_MINIGAME, + FISHING_CHECK_MORE_DOTS, + FISHING_MON_ON_HOOK, + FISHING_START_ENCOUNTER, + FISHING_NOT_EVEN_NIBBLE, + FISHING_GOT_AWAY, + FISHING_NO_MON, + FISHING_PUT_ROD_AWAY, + FISHING_END_NO_MON, +}; + +static bool32 (*const sFishingStateFuncs[])(struct Task *) = +{ + [FISHING_INIT] = Fishing_Init, + [FISHING_GET_ROD_OUT] = Fishing_GetRodOut, + [FISHING_WAIT_BEFORE_DOTS] = Fishing_WaitBeforeDots, + [FISHING_INIT_DOTS] = Fishing_InitDots, + [FISHING_SHOW_DOTS] = Fishing_ShowDots, + [FISHING_CHECK_FOR_BITE] = Fishing_CheckForBite, + [FISHING_GOT_BITE] = Fishing_GotBite, + [FISHING_CHANGE_MINIGAME] = Fishing_ChangeMinigame, + [FISHING_WAIT_FOR_A] = Fishing_WaitForA, + [FISHING_A_PRESS_NO_MINIGAME] = Fishing_APressNoMinigame, + [FISHING_CHECK_MORE_DOTS] = Fishing_CheckMoreDots, + [FISHING_MON_ON_HOOK] = Fishing_MonOnHook, + [FISHING_START_ENCOUNTER] = Fishing_StartEncounter, + [FISHING_NOT_EVEN_NIBBLE] = Fishing_NotEvenNibble, + [FISHING_GOT_AWAY] = Fishing_GotAway, + [FISHING_NO_MON] = Fishing_NoMon, + [FISHING_PUT_ROD_AWAY] = Fishing_PutRodAway, + [FISHING_END_NO_MON] = Fishing_EndNoMon, +}; + +#define tStep data[0] +#define tFrameCounter data[1] +#define tNumDots data[2] +#define tDotsRequired data[3] +#define tRoundsPlayed data[12] +#define tMinRoundsRequired data[13] +#define tPlayerGfxId data[14] +#define tFishingRod data[15] + +void StartFishing(u8 rod) +{ + u8 taskId = CreateTask(Task_Fishing, 0xFF); + + gTasks[taskId].tFishingRod = rod; + Task_Fishing(taskId); +} + +static void Task_Fishing(u8 taskId) +{ + while (sFishingStateFuncs[gTasks[taskId].tStep](&gTasks[taskId])) + ; +} + +static bool32 Fishing_Init(struct Task *task) +{ + LockPlayerFieldControls(); + gPlayerAvatar.preventStep = TRUE; + task->tStep = FISHING_GET_ROD_OUT; + return FALSE; +} + +static bool32 Fishing_GetRodOut(struct Task *task) +{ + struct ObjectEvent *playerObjEvent; + const s16 minRounds1[] = { + [OLD_ROD] = 1, + [GOOD_ROD] = 1, + [SUPER_ROD] = 1 + }; + const s16 minRounds2[] = { + [OLD_ROD] = 1, + [GOOD_ROD] = 3, + [SUPER_ROD] = 6 + }; + + task->tRoundsPlayed = 0; + task->tMinRoundsRequired = minRounds1[task->tFishingRod] + (Random() % minRounds2[task->tFishingRod]); + task->tPlayerGfxId = gObjectEvents[gPlayerAvatar.objectEventId].graphicsId; + playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; + ObjectEventClearHeldMovementIfActive(playerObjEvent); + playerObjEvent->enableAnim = TRUE; + SetPlayerAvatarFishing(playerObjEvent->facingDirection); + task->tStep = FISHING_WAIT_BEFORE_DOTS; + return FALSE; +} + +static bool32 Fishing_WaitBeforeDots(struct Task *task) +{ + AlignFishingAnimationFrames(); + + // Wait one second + task->tFrameCounter++; + if (task->tFrameCounter >= 60) + task->tStep = FISHING_INIT_DOTS; + return FALSE; +} + +static bool32 Fishing_InitDots(struct Task *task) +{ + u32 randVal; + + LoadMessageBoxAndFrameGfx(0, TRUE); + task->tStep = FISHING_SHOW_DOTS; + task->tFrameCounter = 0; + task->tNumDots = 0; + randVal = Random(); + randVal %= 10; + task->tDotsRequired = randVal + 1; + if (task->tRoundsPlayed == 0) + task->tDotsRequired = randVal + 4; + if (task->tDotsRequired >= 10) + task->tDotsRequired = 10; + return TRUE; +} + +static bool32 Fishing_ShowDots(struct Task *task) +{ + const u8 dot[] = _("Β·"); + + AlignFishingAnimationFrames(); + task->tFrameCounter++; + if (JOY_NEW(A_BUTTON)) + { + if (!DoesFishingMinigameAllowCancel()) + return FALSE; + + task->tStep = FISHING_NOT_EVEN_NIBBLE; + if (task->tRoundsPlayed != 0) + task->tStep = FISHING_GOT_AWAY; + return TRUE; + } + else + { + if (task->tFrameCounter >= 20) + { + task->tFrameCounter = 0; + if (task->tNumDots >= task->tDotsRequired) + { + task->tStep = FISHING_CHECK_FOR_BITE; + if (task->tRoundsPlayed != 0) + task->tStep = FISHING_GOT_BITE; + task->tRoundsPlayed++; + } + else + { + AddTextPrinterParameterized(0, FONT_NORMAL, dot, task->tNumDots * 8, 1, 0, NULL); + task->tNumDots++; + } + } + return FALSE; + } +} + +static bool32 Fishing_CheckForBite(struct Task *task) +{ + bool32 bite, firstMonHasSuctionOrSticky; + + AlignFishingAnimationFrames(); + task->tStep = FISHING_GOT_BITE; + bite = FALSE; + + if (!DoesCurrentMapHaveFishingMons()) + { + task->tStep = FISHING_NOT_EVEN_NIBBLE; + return TRUE; + } + + firstMonHasSuctionOrSticky = Fishing_DoesFirstMonInPartyHaveSuctionCupsOrStickyHold(); + + if(firstMonHasSuctionOrSticky && I_FISHING_STICKY_BOOST < GEN_4) + bite = RandomPercentage(RNG_FISHING_GEN3_STICKY, FISHING_GEN3_STICKY_CHANCE); + + if (!bite) + bite = Fishing_RollForBite(task->tFishingRod, firstMonHasSuctionOrSticky); + + if (!bite) + task->tStep = FISHING_NOT_EVEN_NIBBLE; + + if (bite) + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingBiteDirectionAnimNum(GetPlayerFacingDirection())); + + return TRUE; +} + +static bool32 Fishing_GotBite(struct Task *task) +{ + AlignFishingAnimationFrames(); + AddTextPrinterParameterized(0, FONT_NORMAL, gText_OhABite, 0, 17, 0, NULL); + task->tStep = FISHING_CHANGE_MINIGAME; + task->tFrameCounter = 0; + return FALSE; +} + +static bool32 Fishing_ChangeMinigame(struct Task *task) +{ + switch (I_FISHING_MINIGAME) + { + case GEN_1: + case GEN_2: + task->tStep = FISHING_A_PRESS_NO_MINIGAME; + break; + case GEN_3: + default: + task->tStep = FISHING_WAIT_FOR_A; + break; + } + return TRUE; +} + +// We have a bite. Now, wait for the player to press A, or the timer to expire. +static bool32 Fishing_WaitForA(struct Task *task) +{ + const s16 reelTimeouts[3] = { + [OLD_ROD] = 36, + [GOOD_ROD] = 33, + [SUPER_ROD] = 30 + }; + + AlignFishingAnimationFrames(); + task->tFrameCounter++; + if (task->tFrameCounter >= reelTimeouts[task->tFishingRod]) + task->tStep = FISHING_GOT_AWAY; + else if (JOY_NEW(A_BUTTON)) + task->tStep = FISHING_CHECK_MORE_DOTS; + return FALSE; +} + +static bool32 Fishing_APressNoMinigame(struct Task *task) +{ + AlignFishingAnimationFrames(); + if (JOY_NEW(A_BUTTON)) + task->tStep = FISHING_MON_ON_HOOK; + return FALSE; +} + +// Determine if we're going to play the dot game again +static bool32 Fishing_CheckMoreDots(struct Task *task) +{ + const s16 moreDotsChance[][2] = + { + [OLD_ROD] = {0, 0}, + [GOOD_ROD] = {40, 10}, + [SUPER_ROD] = {70, 30} + }; + + AlignFishingAnimationFrames(); + task->tStep = FISHING_MON_ON_HOOK; + if (task->tRoundsPlayed < task->tMinRoundsRequired) + { + task->tStep = FISHING_INIT_DOTS; + } + else if (task->tRoundsPlayed < 2) + { + // probability of having to play another round + s16 probability = Random() % 100; + + if (moreDotsChance[task->tFishingRod][task->tRoundsPlayed] > probability) + task->tStep = FISHING_INIT_DOTS; + } + return FALSE; +} + +static bool32 Fishing_MonOnHook(struct Task *task) +{ + AlignFishingAnimationFrames(); + FillWindowPixelBuffer(0, PIXEL_FILL(1)); + AddTextPrinterParameterized2(0, FONT_NORMAL, gText_PokemonOnHook, 1, 0, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); + task->tStep = FISHING_START_ENCOUNTER; + task->tFrameCounter = 0; + return FALSE; +} + +static bool32 Fishing_StartEncounter(struct Task *task) +{ + if (task->tFrameCounter == 0) + AlignFishingAnimationFrames(); + + RunTextPrinters(); + + if (task->tFrameCounter == 0) + { + if (!IsTextPrinterActive(0)) + { + struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; + + ObjectEventSetGraphicsId(playerObjEvent, task->tPlayerGfxId); + ObjectEventTurn(playerObjEvent, playerObjEvent->movementDirection); + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) + SetSurfBlob_PlayerOffset(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, FALSE, 0); + gSprites[gPlayerAvatar.spriteId].x2 = 0; + gSprites[gPlayerAvatar.spriteId].y2 = 0; + ClearDialogWindowAndFrame(0, TRUE); + task->tFrameCounter++; + return FALSE; + } + } + + if (task->tFrameCounter != 0) + { + gPlayerAvatar.preventStep = FALSE; + UnlockPlayerFieldControls(); + FishingWildEncounter(task->tFishingRod); + RecordFishingAttemptForTV(TRUE); + DestroyTask(FindTaskIdByFunc(Task_Fishing)); + } + return FALSE; +} + +static bool32 Fishing_NotEvenNibble(struct Task *task) +{ + gChainFishingDexNavStreak = 0; + AlignFishingAnimationFrames(); + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingNoCatchDirectionAnimNum(GetPlayerFacingDirection())); + FillWindowPixelBuffer(0, PIXEL_FILL(1)); + AddTextPrinterParameterized2(0, FONT_NORMAL, gText_NotEvenANibble, 1, 0, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); + task->tStep = FISHING_NO_MON; + return TRUE; +} + +static bool32 Fishing_GotAway(struct Task *task) +{ + gChainFishingDexNavStreak = 0; + AlignFishingAnimationFrames(); + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingNoCatchDirectionAnimNum(GetPlayerFacingDirection())); + FillWindowPixelBuffer(0, PIXEL_FILL(1)); + AddTextPrinterParameterized2(0, FONT_NORMAL, gText_ItGotAway, 1, 0, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); + task->tStep = FISHING_NO_MON; + return TRUE; +} + +static bool32 Fishing_NoMon(struct Task *task) +{ + AlignFishingAnimationFrames(); + task->tStep = FISHING_PUT_ROD_AWAY; + return FALSE; +} + +static bool32 Fishing_PutRodAway(struct Task *task) +{ + AlignFishingAnimationFrames(); + if (gSprites[gPlayerAvatar.spriteId].animEnded) + { + struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; + + ObjectEventSetGraphicsId(playerObjEvent, task->tPlayerGfxId); + ObjectEventTurn(playerObjEvent, playerObjEvent->movementDirection); + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) + SetSurfBlob_PlayerOffset(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, FALSE, 0); + gSprites[gPlayerAvatar.spriteId].x2 = 0; + gSprites[gPlayerAvatar.spriteId].y2 = 0; + task->tStep = FISHING_END_NO_MON; + } + return FALSE; +} + +static bool32 Fishing_EndNoMon(struct Task *task) +{ + RunTextPrinters(); + if (!IsTextPrinterActive(0)) + { + gPlayerAvatar.preventStep = FALSE; + UnlockPlayerFieldControls(); + UnfreezeObjectEvents(); + ClearDialogWindowAndFrame(0, TRUE); + RecordFishingAttemptForTV(FALSE); + DestroyTask(FindTaskIdByFunc(Task_Fishing)); + } + return FALSE; +} + +static bool32 DoesFishingMinigameAllowCancel(void) +{ + switch(I_FISHING_MINIGAME) + { + case GEN_1: + case GEN_2: + return FALSE; + case GEN_3: + default: + return TRUE; + } +} + +static bool32 Fishing_DoesFirstMonInPartyHaveSuctionCupsOrStickyHold(void) +{ + enum Ability ability; + + if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) + return FALSE; + + ability = GetMonAbility(&gPlayerParty[0]); + + return (ability == ABILITY_SUCTION_CUPS || ability == ABILITY_STICKY_HOLD); +} + +static bool32 Fishing_RollForBite(u32 rod, bool32 isStickyHold) +{ + return ((RandomUniform(RNG_FISHING_BITE, 1, 100)) <= CalculateFishingBiteOdds(rod, isStickyHold)); +} + +static u32 CalculateFishingBiteOdds(u32 rod, bool32 isStickyHold) +{ + u32 odds; + + if (rod == OLD_ROD) + odds = FISHING_OLD_ROD_ODDS; + if (rod == GOOD_ROD) + odds = FISHING_GOOD_ROD_ODDS; + if (rod == SUPER_ROD) + odds = FISHING_SUPER_ROD_ODDS; + + odds += CalculateFishingFollowerBoost(); + odds += CalculateFishingProximityBoost(); + odds += CalculateFishingTimeOfDayBoost(); + + if (isStickyHold && I_FISHING_STICKY_BOOST >= GEN_4) + odds *= 2; + + odds = min(100, odds); + DebugPrintf("Fishing odds: %d", odds); + return odds; +} + +static u32 CalculateFishingFollowerBoost() +{ + u32 friendship; + struct Pokemon *mon = GetFirstLiveMon(); + + if (!I_FISHING_FOLLOWER_BOOST || !mon) + return 0; + + friendship = GetMonData(mon, MON_DATA_FRIENDSHIP); + for (u32 i = 0;; i++) + { + if (friendship >= sFriendshipHookChanceBoostArray[i].threshold) + return sFriendshipHookChanceBoostArray[i].bonus; + } +} + +static u32 CalculateFishingProximityBoost() +{ + s16 bobber_x, bobber_y, tile_x, tile_y; + u32 direction, facingDirection, numQualifyingTile = 0; + struct ObjectEvent *objectEvent; + + if (!I_FISHING_PROXIMITY) + return 0; + + objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; + + bobber_x = objectEvent->currentCoords.x; + bobber_y = objectEvent->currentCoords.y; + + facingDirection = GetPlayerFacingDirection(); + MoveCoords(facingDirection, &bobber_x, &bobber_y); + + numQualifyingTile = 0; + for (direction = DIR_SOUTH; direction < CARDINAL_DIRECTION_COUNT; direction++) + { + tile_x = bobber_x; + tile_y = bobber_y; + MoveCoords(direction, &tile_x, &tile_y); + if (tile_x == objectEvent->currentCoords.x && tile_y == objectEvent->currentCoords.y) + continue; + if (!MetatileBehavior_IsSurfableFishableWater(MapGridGetMetatileBehaviorAt(tile_x, tile_y))) + numQualifyingTile++; + else if (MapGridGetCollisionAt(tile_x, tile_y)) + numQualifyingTile++; + else if (GetMapBorderIdAt(tile_x, tile_y) == -1) + numQualifyingTile++; + } + + return (numQualifyingTile * FISHING_PROXIMITY_BOOST); +} + +static u32 CalculateFishingTimeOfDayBoost() +{ + if (!I_FISHING_TIME_OF_DAY_BOOST) + return 0; + + enum TimeOfDay timeOfDay = GetTimeOfDay(); + if (timeOfDay == TIME_MORNING || timeOfDay == TIME_EVENING) + return FISHING_TIME_OF_DAY_BOOST; + return 0; +} + +#undef tStep +#undef tFrameCounter +#undef tNumDots +#undef tDotsRequired +#undef tRoundsPlayed +#undef tMinRoundsRequired +#undef tPlayerGfxId +#undef tFishingRod + +static void AlignFishingAnimationFrames(void) +{ + struct Sprite *playerSprite = &gSprites[gPlayerAvatar.spriteId]; + u8 animCmdIndex; + u8 animType; + + AnimateSprite(playerSprite); + playerSprite->x2 = 0; + playerSprite->y2 = 0; + animCmdIndex = playerSprite->animCmdIndex; + if (playerSprite->anims[playerSprite->animNum][animCmdIndex].type == -1) + { + animCmdIndex--; + } + else + { + playerSprite->animDelayCounter++; + if (playerSprite->anims[playerSprite->animNum][animCmdIndex].type == -1) + animCmdIndex--; + } + animType = playerSprite->anims[playerSprite->animNum][animCmdIndex].type; + if (animType == 1 || animType == 2 || animType == 3) + { + playerSprite->x2 = 8; + if (GetPlayerFacingDirection() == 3) + playerSprite->x2 = -8; + } + if (animType == 5) + playerSprite->y2 = -8; + if (animType == 10 || animType == 11) + playerSprite->y2 = 8; + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) + SetSurfBlob_PlayerOffset(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, TRUE, playerSprite->y2); +} + +void UpdateChainFishingStreak() +{ + if (!I_FISHING_CHAIN) + return; + + if (gChainFishingDexNavStreak == MAX_u8) + return; + + gChainFishingDexNavStreak++; +} + +u32 CalculateChainFishingShinyRolls(void) +{ + if (!I_FISHING_CHAIN || !gIsFishingEncounter) + return 0; + u32 a = 2 * min(gChainFishingDexNavStreak, FISHING_CHAIN_SHINY_STREAK_MAX); + DebugPrintf("Total Shiny Rolls %d", a); + return a; +} + +bool32 ShouldUseFishingEnvironmentInBattle() +{ + return (I_FISHING_ENVIRONMENT >= GEN_4 && gIsFishingEncounter); +} \ No newline at end of file diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c index a7eccf651c58..a5f45ab29e55 100644 --- a/src/fldeff_cut.c +++ b/src/fldeff_cut.c @@ -135,12 +135,12 @@ static const struct SpriteTemplate sSpriteTemplate_CutGrass = }; // code -bool8 SetUpFieldMove_Cut(void) +bool32 SetUpFieldMove_Cut(void) { s16 x, y; u8 i, j; u8 tileBehavior; - u16 userAbility; + enum Ability userAbility; bool8 cutTiles[CUT_NORMAL_AREA]; bool8 ret; diff --git a/src/fldeff_defog.c b/src/fldeff_defog.c index bccf0d65f7b5..42c79bad1dfc 100644 --- a/src/fldeff_defog.c +++ b/src/fldeff_defog.c @@ -19,7 +19,7 @@ static void FieldCallback_Defog(void); static void FieldMove_Defog(void); static void EndDefogTask(u8 taskId); -bool8 SetUpFieldMove_Defog(void) +bool32 SetUpFieldMove_Defog(void) { if (gWeather.currWeather != WEATHER_FOG_HORIZONTAL && gWeather.currWeather != WEATHER_FOG_DIAGONAL) return FALSE; diff --git a/src/fldeff_dig.c b/src/fldeff_dig.c index 63eb848bf2f9..646865f9c20d 100644 --- a/src/fldeff_dig.c +++ b/src/fldeff_dig.c @@ -16,7 +16,7 @@ static void FieldCallback_Dig(void); static void StartDigFieldEffect(void); // text -bool8 SetUpFieldMove_Dig(void) +bool32 SetUpFieldMove_Dig(void) { if (CanUseDigOrEscapeRopeOnCurMap() == TRUE) { diff --git a/src/fldeff_escalator.c b/src/fldeff_escalator.c index eabbd535497b..f49b97b0c8d2 100644 --- a/src/fldeff_escalator.c +++ b/src/fldeff_escalator.c @@ -126,13 +126,13 @@ static void Task_DrawEscalator(u8 taskId) SetEscalatorMetatile(taskId, sEscalatorMetatiles_1F_1, 0); break; case 2: - SetEscalatorMetatile(taskId, sEscalatorMetatiles_1F_2, MAPGRID_COLLISION_MASK); + SetEscalatorMetatile(taskId, sEscalatorMetatiles_1F_2, MAPGRID_IMPASSABLE); break; case 3: SetEscalatorMetatile(taskId, sEscalatorMetatiles_1F_3, 0); break; case 4: - SetEscalatorMetatile(taskId, sEscalatorMetatiles_2F_0, MAPGRID_COLLISION_MASK); + SetEscalatorMetatile(taskId, sEscalatorMetatiles_2F_0, MAPGRID_IMPASSABLE); break; case 5: SetEscalatorMetatile(taskId, sEscalatorMetatiles_2F_1, 0); diff --git a/src/fldeff_flash.c b/src/fldeff_flash.c index 1e2b9a95fc72..2ae6b256e108 100644 --- a/src/fldeff_flash.c +++ b/src/fldeff_flash.c @@ -1,5 +1,6 @@ #include "global.h" #include "braille_puzzles.h" +#include "decompress.h" #include "event_data.h" #include "event_scripts.h" #include "field_effect.h" @@ -14,7 +15,6 @@ #include "sprite.h" #include "task.h" #include "constants/songs.h" -#include "constants/map_types.h" struct FlashStruct { @@ -66,10 +66,10 @@ static const u16 sCaveTransitionPalette_Black[] = INCBIN_U16("graphics/cave_tran static const u16 sCaveTransitionPalette_Enter[] = INCBIN_U16("graphics/cave_transition/enter.gbapal"); -static const u32 sCaveTransitionTilemap[] = INCBIN_U32("graphics/cave_transition/tilemap.bin.lz"); -static const u32 sCaveTransitionTiles[] = INCBIN_U32("graphics/cave_transition/tiles.4bpp.lz"); +static const u32 sCaveTransitionTilemap[] = INCBIN_U32("graphics/cave_transition/tilemap.bin.smolTM"); +static const u32 sCaveTransitionTiles[] = INCBIN_U32("graphics/cave_transition/tiles.4bpp.smol"); -bool8 SetUpFieldMove_Flash(void) +bool32 SetUpFieldMove_Flash(void) { // In Ruby and Sapphire, Registeel's tomb is opened by using Fly. In Emerald, // Flash is used instead. @@ -154,8 +154,8 @@ void CB2_DoChangeMap(void) static bool8 TryDoMapTransition(void) { u8 i; - u8 fromType = GetLastUsedWarpMapType(); - u8 toType = GetCurrentMapType(); + enum MapType fromType = GetLastUsedWarpMapType(); + enum MapType toType = GetCurrentMapType(); for (i = 0; sTransitionTypes[i].fromType; i++) { @@ -216,8 +216,8 @@ static void Task_ExitCaveTransition1(u8 taskId) static void Task_ExitCaveTransition2(u8 taskId) { SetGpuReg(REG_OFFSET_DISPCNT, 0); - LZ77UnCompVram(sCaveTransitionTiles, (void *)(VRAM + 0xC000)); - LZ77UnCompVram(sCaveTransitionTilemap, (void *)(VRAM + 0xF800)); + DecompressDataWithHeaderVram(sCaveTransitionTiles, (void *)(VRAM + 0xC000)); + DecompressDataWithHeaderVram(sCaveTransitionTilemap, (void *)(VRAM + 0xF800)); LoadPalette(sCaveTransitionPalette_White, BG_PLTT_ID(14), PLTT_SIZE_4BPP); LoadPalette(&sCaveTransitionPalette_Enter[8], BG_PLTT_ID(14), PLTT_SIZEOF(8)); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 @@ -301,8 +301,8 @@ static void Task_EnterCaveTransition1(u8 taskId) static void Task_EnterCaveTransition2(u8 taskId) { SetGpuReg(REG_OFFSET_DISPCNT, 0); - LZ77UnCompVram(sCaveTransitionTiles, (void *)(VRAM + 0xC000)); - LZ77UnCompVram(sCaveTransitionTilemap, (void *)(VRAM + 0xF800)); + DecompressDataWithHeaderVram(sCaveTransitionTiles, (void *)(VRAM + 0xC000)); + DecompressDataWithHeaderVram(sCaveTransitionTilemap, (void *)(VRAM + 0xF800)); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); diff --git a/src/fldeff_misc.c b/src/fldeff_misc.c index d3e6982f2950..883463a9aac8 100644 --- a/src/fldeff_misc.c +++ b/src/fldeff_misc.c @@ -339,9 +339,9 @@ bool8 IsComputerScreenCloseEffectActive(void) #define tBlendCnt data[7] #define tBlendY data[8] -static void CreateComputerScreenEffectTask(void (*taskfunc) (u8), u16 increment, u16 unused, u8 priority) +static void CreateComputerScreenEffectTask(TaskFunc func, u16 increment, u16 unused, u8 priority) { - u8 taskId = CreateTask(taskfunc, priority); + u8 taskId = CreateTask(func, priority); gTasks[taskId].tState = 0; gTasks[taskId].tHorzIncrement = increment == 0 ? 16 : increment; @@ -544,7 +544,7 @@ static void AdjustSecretPowerSpritePixelOffsets(void) } } -bool8 SetUpFieldMove_SecretPower(void) +bool32 SetUpFieldMove_SecretPower(void) { u8 mb; @@ -840,9 +840,9 @@ void DoSecretBasePCTurnOffEffect(void) PlaySE(SE_PC_OFF); if (!VarGet(VAR_CURRENT_SECRET_BASE)) - MapGridSetMetatileIdAt(x, y, METATILE_SecretBase_PC | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x, y, METATILE_SecretBase_PC | MAPGRID_IMPASSABLE); else - MapGridSetMetatileIdAt(x, y, METATILE_SecretBase_RegisterPC | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x, y, METATILE_SecretBase_RegisterPC | MAPGRID_IMPASSABLE); CurrentMapDrawMetatileAt(x, y); } @@ -1083,7 +1083,7 @@ static void SpriteCB_SandPillar_BreakTop(struct Sprite *sprite) PlaySE(SE_M_ROCK_THROW); if (MapGridGetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1) == METATILE_SecretBase_SandOrnament_TopWall) - MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1, METATILE_SecretBase_Wall_TopMid | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1, METATILE_SecretBase_Wall_TopMid | MAPGRID_IMPASSABLE); else MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1, METATILE_SecretBase_SandOrnament_BrokenTop); @@ -1103,7 +1103,7 @@ static void SpriteCB_SandPillar_BreakBase(struct Sprite *sprite) } else { - MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6], METATILE_SecretBase_SandOrnament_BrokenBase | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6], METATILE_SecretBase_SandOrnament_BrokenBase | MAPGRID_IMPASSABLE); CurrentMapDrawMetatileAt(gFieldEffectArguments[5], gFieldEffectArguments[6]); sprite->data[0] = 0; sprite->callback = SpriteCB_SandPillar_End; diff --git a/src/fldeff_rocksmash.c b/src/fldeff_rocksmash.c index 39f64adb877b..1ad4eaaf484f 100644 --- a/src/fldeff_rocksmash.c +++ b/src/fldeff_rocksmash.c @@ -16,7 +16,6 @@ #include "constants/event_object_movement.h" #include "constants/event_objects.h" #include "constants/field_effects.h" -#include "constants/map_types.h" #include "constants/songs.h" static void Task_DoFieldMove_Init(u8 taskId); @@ -120,7 +119,7 @@ static void Task_DoFieldMove_RunFunc(u8 taskId) // Called when Rock Smash is used from the party menu // For interacting with a smashable rock in the field, see EventScript_RockSmash -bool8 SetUpFieldMove_RockSmash(void) +bool32 SetUpFieldMove_RockSmash(void) { // In Ruby and Sapphire, Regirock's tomb is opened by using Strength. In Emerald, // it is opened by using Rock Smash. diff --git a/src/fldeff_softboiled.c b/src/fldeff_softboiled.c index 3a38f67f023d..492577a50ce4 100644 --- a/src/fldeff_softboiled.c +++ b/src/fldeff_softboiled.c @@ -15,7 +15,7 @@ static void Task_DisplayHPRestoredMessage(u8 taskId); static void Task_FinishSoftboiled(u8 taskId); static void CantUseSoftboiledOnMon(u8 taskId); -bool8 SetUpFieldMove_SoftBoiled(void) +bool32 SetUpFieldMove_SoftBoiled(void) { u16 maxHp; u16 hp; diff --git a/src/fldeff_strength.c b/src/fldeff_strength.c index 931215040331..a0d278edc729 100644 --- a/src/fldeff_strength.c +++ b/src/fldeff_strength.c @@ -15,7 +15,7 @@ static void FieldCallback_Strength(void); static void StartStrengthFieldEffect(void); // text -bool8 SetUpFieldMove_Strength(void) +bool32 SetUpFieldMove_Strength(void) { if (CheckObjectGraphicsInFrontOfPlayer(OBJ_EVENT_GFX_PUSHABLE_BOULDER) == TRUE) { diff --git a/src/fldeff_sweetscent.c b/src/fldeff_sweetscent.c index 1be00baebca2..bc86d683a36b 100644 --- a/src/fldeff_sweetscent.c +++ b/src/fldeff_sweetscent.c @@ -25,7 +25,7 @@ static void FieldCallback_SweetScent(void); static void TrySweetScentEncounter(u8 taskId); static void FailSweetScentEncounter(u8 taskId); -bool8 SetUpFieldMove_SweetScent(void) +bool32 SetUpFieldMove_SweetScent(void) { gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; gPostMenuFieldCallback = FieldCallback_SweetScent; diff --git a/src/fldeff_teleport.c b/src/fldeff_teleport.c index 83028c394976..b76082b05f39 100644 --- a/src/fldeff_teleport.c +++ b/src/fldeff_teleport.c @@ -11,7 +11,7 @@ static void FieldCallback_Teleport(void); static void StartTeleportFieldEffect(void); -bool8 SetUpFieldMove_Teleport(void) +bool32 SetUpFieldMove_Teleport(void) { if (!CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_LEAVE_ROUTE)) return FALSE; diff --git a/src/follower_helper.c b/src/follower_helper.c index e85289d1f7ac..474bd79fd78e 100644 --- a/src/follower_helper.c +++ b/src/follower_helper.c @@ -38,7 +38,7 @@ static const u8 sCondMsg16[] = _("{STR_VAR_1} doesn't want to get off\nthe boat static const u8* const sBoatTexts[] = {sCondMsg14, sCondMsg15, sCondMsg16, NULL}; static const u8 sCondMsg17[] = _("{STR_VAR_1} is listening to the\nsound of the machines."); static const u8* const sMachineTexts[] = {sCondMsg13, sCondMsg17, NULL}; -static const u8 sCondMsg18[] = _("Waah! your POKΓ©MON suddenly splashed\nwater!"); +static const u8 sCondMsg18[] = _("Waah! Your POKΓ©MON suddenly splashed\nwater!"); static const u8 sCondMsg19[] = _("Your POKΓ©MON is blowing sand in the\nair!"); static const u8 sCondMsg20[] = _("{STR_VAR_1} is playing around,\nplucking bits of grass."); static const u8 sCondMsg21[] = _("Your POKΓ©MON is happily looking at\nyour footprints!"); @@ -74,6 +74,7 @@ static const u8* const sDayTexts[] = {sCondMsg43, sCondMsg44, NULL}; static const u8 sCondMsg45[] = _("Your POKΓ©MON is staring spellbound\nat the night sky!"); static const u8 sCondMsg46[] = _("Your POKΓ©MON is happily gazing at\nthe beautiful, starry sky!"); static const u8* const sNightTexts[] = {sCondMsg45, sCondMsg46, NULL}; +static const u8 sCondMsg50[] = _("{STR_VAR_1} is disturbed by the\nabnormal weather!"); // See the struct definition in follower_helper.h for more info const struct FollowerMsgInfoExtended gFollowerConditionalMessages[COND_MSG_COUNT] = @@ -378,6 +379,18 @@ const struct FollowerMsgInfoExtended gFollowerConditionalMessages[COND_MSG_COUNT MATCH_TIME_OF_DAY(TIME_NIGHT), }, }, + [COND_MSG_ABNORMAL_WEATHER] = + { + .text = sCondMsg50, + .emotion = FOLLOWER_EMOTION_SURPRISE, + .conditions = + { + MATCH_MUSIC(MUS_ABNORMAL_WEATHER), + MATCH_NOT_SPECIES(SPECIES_KYOGRE), + MATCH_NOT_SPECIES(SPECIES_GROUDON), + MATCH_NOT_SPECIES(SPECIES_RAYQUAZA), + } + }, }; // Pool of "unconditional" follower messages diff --git a/src/follower_npc.c b/src/follower_npc.c index 0a8cde49c8f6..2cca3186b310 100644 --- a/src/follower_npc.c +++ b/src/follower_npc.c @@ -4,6 +4,7 @@ #include "battle.h" #include "battle_setup.h" #include "battle_tower.h" +#include "bike.h" #include "event_data.h" #include "event_object_movement.h" #include "event_scripts.h" @@ -50,7 +51,10 @@ static void SetFollowerNPCScriptPointer(const u8 *script); static void PlayerLogCoordinates(struct ObjectEvent *player); static void TurnNPCIntoFollower(u32 localId, u32 followerFlags, u32 setScript, const u8 *script); static u32 GetFollowerNPCSprite(void); +static bool32 FollowerNPCHasRunningFrames(void); static bool32 IsStateMovement(u32 state); +static u32 GetNewPlayerMovementDirection(u32 state); +static bool32 IsPlayerForcedOntoSameTile(u8 metatileBehavior, u8 direction); static u32 GetPlayerFaceToDoorDirection(struct ObjectEvent *player, struct ObjectEvent *follower); static u32 ReturnFollowerNPCDelayedState(u32 direction); static void TryUpdateFollowerNPCSpriteUnderwater(void); @@ -83,6 +87,9 @@ void SetFollowerNPCData(enum FollowerNPCDataTypes type, u32 value) case FNPC_DATA_COME_OUT_DOOR: gSaveBlock3Ptr->NPCfollower.comeOutDoorStairs = value; break; + case FNPC_DATA_FORCED_MOVEMENT: + gSaveBlock3Ptr->NPCfollower.forcedMovement = value; + break; case FNPC_DATA_OBJ_ID: gSaveBlock3Ptr->NPCfollower.objId = value; break; @@ -92,15 +99,6 @@ void SetFollowerNPCData(enum FollowerNPCDataTypes type, u32 value) case FNPC_DATA_DELAYED_STATE: gSaveBlock3Ptr->NPCfollower.delayedState = value; break; - case FNPC_DATA_MAP_ID: - gSaveBlock3Ptr->NPCfollower.map.id = value; - break; - case FNPC_DATA_MAP_NUM: - gSaveBlock3Ptr->NPCfollower.map.number = value; - break; - case FNPC_DATA_MAP_GROUP: - gSaveBlock3Ptr->NPCfollower.map.group = value; - break; case FNPC_DATA_EVENT_FLAG: gSaveBlock3Ptr->NPCfollower.flag = value; break; @@ -155,18 +153,14 @@ u32 GetFollowerNPCData(enum FollowerNPCDataTypes type) return gSaveBlock3Ptr->NPCfollower.createSurfBlob; case FNPC_DATA_COME_OUT_DOOR: return gSaveBlock3Ptr->NPCfollower.comeOutDoorStairs; + case FNPC_DATA_FORCED_MOVEMENT: + return gSaveBlock3Ptr->NPCfollower.forcedMovement; case FNPC_DATA_OBJ_ID: return gSaveBlock3Ptr->NPCfollower.objId; case FNPC_DATA_CURRENT_SPRITE: return gSaveBlock3Ptr->NPCfollower.currentSprite; case FNPC_DATA_DELAYED_STATE: return gSaveBlock3Ptr->NPCfollower.delayedState; - case FNPC_DATA_MAP_ID: - return gSaveBlock3Ptr->NPCfollower.map.id; - case FNPC_DATA_MAP_NUM: - return gSaveBlock3Ptr->NPCfollower.map.number; - case FNPC_DATA_MAP_GROUP: - return gSaveBlock3Ptr->NPCfollower.map.group; case FNPC_DATA_EVENT_FLAG: return gSaveBlock3Ptr->NPCfollower.flag; case FNPC_DATA_GFX_ID: @@ -187,77 +181,62 @@ void ClearFollowerNPCData(void) #endif } -static void TurnNPCIntoFollower(u32 localId, u32 followerFlags, u32 setScript, const u8 *ptr) +static void TurnNPCIntoFollower(u32 localId, u32 followerFlags, u32 setScript, const u8 *scriptPtr) { struct ObjectEventTemplate npc; struct ObjectEvent *follower; - u32 npcX, npcY; - u32 faceDirection; - u32 eventObjId; + u32 eventObjId = GetObjectEventIdByLocalId(localId); + u32 npcX = gObjectEvents[eventObjId].currentCoords.x; + u32 npcY = gObjectEvents[eventObjId].currentCoords.y; const u8 *script; u32 flag; + u16 facingDirection = gObjectEvents[eventObjId].facingDirection; - // Only allow 1 follower NPC at a time. - if (PlayerHasFollowerNPC()) + flag = GetObjectEventFlagIdByLocalIdAndMap(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); + // If the object does not have an event flag, don't create follower. + if (flag == 0) return; - for (eventObjId = 0; eventObjId < OBJECT_EVENTS_COUNT; eventObjId++) - { - if (!gObjectEvents[eventObjId].active || gObjectEvents[eventObjId].isPlayer) - continue; + if (setScript == TRUE) + // Set the custom script. + script = scriptPtr; + else + // Use the object's original script. + script = GetObjectEventScriptPointerByObjectEventId(eventObjId); - if (gObjectEvents[eventObjId].localId == localId) - { - flag = GetObjectEventFlagIdByLocalIdAndMap(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); - // If the object does not have an event flag, don't create follower. - if (flag == 0) - return; - - if (setScript == TRUE) - // Set the custom script. - script = ptr; - else - // Use the object's original script. - script = GetObjectEventScriptPointerByObjectEventId(eventObjId); - - npcX = gObjectEvents[eventObjId].currentCoords.x; - npcY = gObjectEvents[eventObjId].currentCoords.y; - faceDirection = gObjectEvents[eventObjId].facingDirection; - SetFollowerNPCData(FNPC_DATA_MAP_ID, gObjectEvents[eventObjId].localId); - RemoveObjectEvent(&gObjectEvents[eventObjId]); - FlagSet(flag); - - npc = *GetObjectEventTemplateByLocalIdAndMap(GetFollowerNPCData(FNPC_DATA_MAP_ID), gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); - npc.movementType = 0; - npc.script = script; - npc.localId = OBJ_EVENT_ID_NPC_FOLLOWER; - SetFollowerNPCData(FNPC_DATA_OBJ_ID, TrySpawnObjectEventTemplate(&npc, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, npcX, npcY)); - follower = &gObjectEvents[GetFollowerNPCData(FNPC_DATA_OBJ_ID)]; - MoveObjectEventToMapCoords(follower, npcX, npcY); - ObjectEventTurn(follower, faceDirection); - follower->movementType = MOVEMENT_TYPE_NONE; - gSprites[follower->spriteId].callback = MovementType_None; - - SetFollowerNPCData(FNPC_DATA_IN_PROGRESS, TRUE); - SetFollowerNPCData(FNPC_DATA_GFX_ID, follower->graphicsId); - SetFollowerNPCData(FNPC_DATA_MAP_NUM, gSaveBlock1Ptr->location.mapNum); - SetFollowerNPCData(FNPC_DATA_MAP_GROUP, gSaveBlock1Ptr->location.mapGroup); - SetFollowerNPCScriptPointer(script); - SetFollowerNPCData(FNPC_DATA_EVENT_FLAG, flag); - SetFollowerNPCData(FNPC_DATA_FOLLOWER_FLAGS, followerFlags); - SetFollowerNPCData(FNPC_DATA_SURF_BLOB, FNPC_SURF_BLOB_NONE); - SetFollowerNPCData(FNPC_DATA_COME_OUT_DOOR, FNPC_DOOR_NONE); - - // If the player is biking and the follower flags prohibit biking, force the player to dismount the bike. - if (!CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_BIKE) - && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_BIKE)) - SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); - - // Set the follower sprite to match the player state. - if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ON_FOOT)) - FollowerNPC_HandleSprite(); - } - } + RemoveObjectEvent(&gObjectEvents[eventObjId]); + FlagSet(flag); + + npc = *GetObjectEventTemplateByLocalIdAndMap(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); + npc.movementType = 0; + npc.script = script; + npc.localId = OBJ_EVENT_ID_NPC_FOLLOWER; + SetFollowerNPCData(FNPC_DATA_OBJ_ID, TrySpawnObjectEventTemplate(&npc, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, npcX, npcY)); + follower = &gObjectEvents[GetFollowerNPCData(FNPC_DATA_OBJ_ID)]; + MoveObjectEventToMapCoords(follower, npcX, npcY); + ObjectEventTurn(follower, facingDirection); + follower->movementType = MOVEMENT_TYPE_NONE; + gSprites[follower->spriteId].callback = MovementType_None; + + SetFollowerNPCData(FNPC_DATA_IN_PROGRESS, TRUE); + SetFollowerNPCData(FNPC_DATA_GFX_ID, follower->graphicsId); + SetFollowerNPCScriptPointer(script); + SetFollowerNPCData(FNPC_DATA_EVENT_FLAG, flag); + SetFollowerNPCData(FNPC_DATA_SURF_BLOB, FNPC_SURF_BLOB_NONE); + SetFollowerNPCData(FNPC_DATA_COME_OUT_DOOR, FNPC_DOOR_NONE); + if (FollowerNPCHasRunningFrames()) + followerFlags |= FOLLOWER_NPC_FLAG_HAS_RUNNING_FRAMES; + + SetFollowerNPCData(FNPC_DATA_FOLLOWER_FLAGS, followerFlags); + + // If the player is biking and the follower flags prohibit biking, force the player to dismount the bike. + if (!CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_BIKE) + && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_BIKE)) + SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); + + // Set the follower sprite to match the player state. + if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ON_FOOT)) + FollowerNPC_HandleSprite(); } static u32 GetFollowerNPCSprite(void) @@ -291,6 +270,18 @@ static u32 GetFollowerNPCSprite(void) return GetFollowerNPCData(FNPC_DATA_GFX_ID); } +static bool32 FollowerNPCHasRunningFrames(void) +{ + for (u32 i = 0; i < NELEMS(gFollowerNPCAlternateSprites); i++) + { + if (gFollowerNPCAlternateSprites[i].normalId == GetFollowerNPCData(FNPC_DATA_GFX_ID) + && gFollowerNPCAlternateSprites[i].hasRunningFrames == TRUE) + return TRUE; + } + + return FALSE; +} + static bool32 IsStateMovement(u32 state) { switch (state) @@ -363,6 +354,115 @@ static bool32 IsStateMovement(u32 state) return TRUE; } +// Because we want the NPC follower's movements to happen simultaneously with the player's, +// we need to set the follower's movement before the player object's movementDirection parameter gets set. +// This function allows us to determine the player's new movement direction before it gets set. +static u32 GetNewPlayerMovementDirection(u32 state) +{ + switch (state) + { + case MOVEMENT_ACTION_WALK_SLOW_DOWN: + case MOVEMENT_ACTION_WALK_NORMAL_DOWN: + case MOVEMENT_ACTION_WALK_FAST_DOWN: + case MOVEMENT_ACTION_WALK_FASTER_DOWN: + case MOVEMENT_ACTION_PLAYER_RUN_DOWN: + case MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN: + case MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN: + case MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN: + case MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN: + case MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_DOWN: + case MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN: + case MOVEMENT_ACTION_JUMP_DOWN: + return DIR_SOUTH; + case MOVEMENT_ACTION_WALK_SLOW_UP: + case MOVEMENT_ACTION_WALK_NORMAL_UP: + case MOVEMENT_ACTION_WALK_FAST_UP: + case MOVEMENT_ACTION_WALK_FASTER_UP: + case MOVEMENT_ACTION_PLAYER_RUN_UP: + case MOVEMENT_ACTION_ACRO_WHEELIE_HOP_UP: + case MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_UP: + case MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_UP: + case MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_UP: + case MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_UP: + case MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP: + case MOVEMENT_ACTION_JUMP_UP: + return DIR_NORTH; + case MOVEMENT_ACTION_WALK_SLOW_LEFT: + case MOVEMENT_ACTION_WALK_NORMAL_LEFT: + case MOVEMENT_ACTION_WALK_FAST_LEFT: + case MOVEMENT_ACTION_WALK_FASTER_LEFT: + case MOVEMENT_ACTION_PLAYER_RUN_LEFT: + case MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT: + case MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT: + case MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT: + case MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT: + case MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_LEFT: + case MOVEMENT_ACTION_RIDE_WATER_CURRENT_LEFT: + case MOVEMENT_ACTION_JUMP_LEFT: + return DIR_WEST; + case MOVEMENT_ACTION_WALK_SLOW_RIGHT: + case MOVEMENT_ACTION_WALK_NORMAL_RIGHT: + case MOVEMENT_ACTION_WALK_FAST_RIGHT: + case MOVEMENT_ACTION_WALK_FASTER_RIGHT: + case MOVEMENT_ACTION_PLAYER_RUN_RIGHT: + case MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT: + case MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT: + case MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT: + case MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT: + case MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_RIGHT: + case MOVEMENT_ACTION_RIDE_WATER_CURRENT_RIGHT: + case MOVEMENT_ACTION_JUMP_RIGHT: + return DIR_EAST; + default: + return DIR_NONE; + } +} + +static bool32 IsPlayerForcedOntoSameTile(u8 metatileBehavior, u8 direction) +{ + u8 oppositeDirection = DIR_NONE; + + switch (metatileBehavior) + { + case MB_WALK_EAST: + case MB_SLIDE_EAST: + case MB_EASTWARD_CURRENT: + oppositeDirection = DIR_WEST; + break; + case MB_WALK_WEST: + case MB_SLIDE_WEST: + case MB_WESTWARD_CURRENT: + oppositeDirection = DIR_EAST; + break; + case MB_WALK_NORTH: + case MB_SLIDE_NORTH: + case MB_NORTHWARD_CURRENT: + oppositeDirection = DIR_SOUTH; + break; + case MB_WALK_SOUTH: + case MB_SLIDE_SOUTH: + case MB_SOUTHWARD_CURRENT: + case MB_MUDDY_SLOPE: + case MB_WATERFALL: + oppositeDirection = DIR_NORTH; + break; + default: + return FALSE; + } + + if (oppositeDirection == direction) + return TRUE; + + return FALSE; +} + +void GetXYCoordsPlayerMovementDest(u32 direction, s16 *x, s16 *y) +{ + *x = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x; + *y = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y; + MoveCoords(direction, x, y); +} + static u32 GetPlayerFaceToDoorDirection(struct ObjectEvent *player, struct ObjectEvent *follower) { s32 delta_x = player->currentCoords.x - follower->currentCoords.x; @@ -706,6 +806,61 @@ static void CalculateFollowerNPCEscalatorTrajectoryDown(struct Task *task) #undef tCounter +void CreateFollowerNPC(u32 gfx, u32 followerFlags, const u8 *scriptPtr) +{ + if (PlayerHasFollowerNPC()) + return; + + struct ObjectEvent *player = &gObjectEvents[gPlayerAvatar.objectEventId]; + struct ObjectEvent *follower; + struct ObjectEventTemplate npc = + { + .localId = OBJ_EVENT_ID_NPC_FOLLOWER, + .graphicsId = gfx, + .x = player->currentCoords.x, + .y = player->currentCoords.y, + .elevation = PlayerGetElevation(), + .script = scriptPtr + }; + + SetFollowerNPCData(FNPC_DATA_OBJ_ID, TrySpawnObjectEventTemplate(&npc, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, player->currentCoords.x, player->currentCoords.y)); + follower = &gObjectEvents[GetFollowerNPCData(FNPC_DATA_OBJ_ID)]; + follower->movementType = MOVEMENT_TYPE_NONE; + gSprites[follower->spriteId].callback = MovementType_None; + + SetFollowerNPCData(FNPC_DATA_IN_PROGRESS, TRUE); + SetFollowerNPCData(FNPC_DATA_GFX_ID, follower->graphicsId); + SetFollowerNPCData(FNPC_DATA_SURF_BLOB, FNPC_SURF_BLOB_NONE); + SetFollowerNPCData(FNPC_DATA_COME_OUT_DOOR, FNPC_DOOR_NONE); + SetFollowerNPCScriptPointer(scriptPtr); + if (FollowerNPCHasRunningFrames()) + followerFlags |= FOLLOWER_NPC_FLAG_HAS_RUNNING_FRAMES; + + SetFollowerNPCData(FNPC_DATA_FOLLOWER_FLAGS, followerFlags); + + // If the player is biking and the follower flags prohibit biking, force the player to dismount the bike. + if (!CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_BIKE) + && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_BIKE)) + SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); + + // Set the follower sprite to match the player state. + if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ON_FOOT)) + FollowerNPC_HandleSprite(); + + HideNPCFollower(); + SetFollowerNPCData(FNPC_DATA_WARP_END, FNPC_WARP_REAPPEAR); +} + +void DestroyFollowerNPC(void) +{ + if (!PlayerHasFollowerNPC()) + return; + + RemoveObjectEvent(&gObjectEvents[GetFollowerNPCData(FNPC_DATA_OBJ_ID)]); + ClearFollowerNPCData(); + UpdateFollowingPokemon(); +} + #define RETURN_STATE(state, dir) return newState == MOVEMENT_INVALID ? state + (dir - 1) : ReturnFollowerNPCDelayedState(dir - 1); u32 DetermineFollowerNPCState(struct ObjectEvent *follower, u32 state, u32 direction) { @@ -717,17 +872,36 @@ u32 DetermineFollowerNPCState(struct ObjectEvent *follower, u32 state, u32 direc u32 nextBehavior; u32 noSpecialAnimFrames = (GetFollowerNPCSprite() == GetFollowerNPCData(FNPC_DATA_GFX_ID)); u32 delayedState = GetFollowerNPCData(FNPC_DATA_DELAYED_STATE); + s16 playerDestX, playerDestY; + u32 playerMoveDirection = GetNewPlayerMovementDirection(state); + u32 newPlayerMB; MoveCoords(direction, &followerX, &followerY); nextBehavior = MapGridGetMetatileBehaviorAt(followerX, followerY); - - if (FindTaskIdByFunc(Task_MoveNPCFollowerAfterForcedMovement) == TASK_NONE) - follower->facingDirectionLocked = FALSE; + follower->facingDirectionLocked = FALSE; // Follower won't do delayed movement until player does a movement. if (!IsStateMovement(state) && delayedState) return MOVEMENT_ACTION_NONE; + // Follower won't move if player is forced back onto the same tile. + if (GetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT) == FNPC_FORCED_STAY) + return MOVEMENT_ACTION_NONE; + + GetXYCoordsPlayerMovementDest(playerMoveDirection, &playerDestX, &playerDestY); + newPlayerMB = MapGridGetMetatileBehaviorAt(playerDestX, playerDestY); + + if (IsPlayerForcedOntoSameTile(newPlayerMB, playerMoveDirection) + && !(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE && playerMoveDirection == DIR_NORTH && newPlayerMB == MB_MUDDY_SLOPE && GetPlayerSpeed() >= PLAYER_SPEED_FAST)) + { + SetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT, FNPC_FORCED_STAY); + SetFollowerNPCData(FNPC_DATA_DELAYED_STATE, 0); + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ON_FOOT) + ObjectEventSetHeldMovement(follower, GetFaceDirectionAnimNum(follower->facingDirection)); + + return MOVEMENT_INVALID; + } + if (IsStateMovement(state) && delayedState) { // Lock face direction for Acro side jump. @@ -777,10 +951,6 @@ u32 DetermineFollowerNPCState(struct ObjectEvent *follower, u32 state, u32 direc RETURN_STATE(MOVEMENT_ACTION_WALK_NORMAL_DOWN, direction); case MOVEMENT_ACTION_WALK_FAST_DOWN ... MOVEMENT_ACTION_WALK_FAST_RIGHT: - // Handle player on waterfall. - if (PlayerIsUnderWaterfall(&gObjectEvents[gPlayerAvatar.objectEventId]) && (state == MOVEMENT_ACTION_WALK_FAST_UP)) - return MOVEMENT_INVALID; - // Handle ice tile (some walking animation). if (MetatileBehavior_IsIce(follower->currentMetatileBehavior) || MetatileBehavior_IsTrickHouseSlipperyFloor(follower->currentMetatileBehavior)) follower->disableAnim = TRUE; @@ -789,6 +959,9 @@ u32 DetermineFollowerNPCState(struct ObjectEvent *follower, u32 state, u32 direc if (GetFollowerNPCData(FNPC_DATA_CURRENT_SPRITE) == FOLLOWER_NPC_SPRITE_INDEX_SURF && GetFollowerNPCSprite() == GetFollowerNPCData(FNPC_DATA_GFX_ID)) RETURN_STATE(MOVEMENT_ACTION_SURF_STILL_DOWN, direction); + if (MetatileBehavior_IsMuddySlope(follower->currentMetatileBehavior)) + follower->facingDirectionLocked = TRUE; + RETURN_STATE(MOVEMENT_ACTION_WALK_FAST_DOWN, direction); case MOVEMENT_ACTION_WALK_FASTER_DOWN ... MOVEMENT_ACTION_WALK_FASTER_RIGHT: @@ -798,10 +971,6 @@ u32 DetermineFollowerNPCState(struct ObjectEvent *follower, u32 state, u32 direc RETURN_STATE(MOVEMENT_ACTION_WALK_FASTER_DOWN, direction); case MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN ... MOVEMENT_ACTION_RIDE_WATER_CURRENT_RIGHT: - // Handle player on waterfall. - if (PlayerIsUnderWaterfall(&gObjectEvents[gPlayerAvatar.objectEventId]) && IsPlayerSurfingNorth()) - return MOVEMENT_INVALID; - RETURN_STATE(MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN, direction); // Acro bike. @@ -918,6 +1087,10 @@ u32 DetermineFollowerNPCState(struct ObjectEvent *follower, u32 state, u32 direc RETURN_STATE(MOVEMENT_ACTION_WALK_NORMAL_DOWN, direction); + // Slow stairs. + case MOVEMENT_ACTION_WALK_SLOW_STAIRS_DOWN ... MOVEMENT_ACTION_WALK_SLOW_STAIRS_RIGHT: + RETURN_STATE(MOVEMENT_ACTION_WALK_SLOW_STAIRS_DOWN, direction); + default: return MOVEMENT_INVALID; } @@ -951,13 +1124,13 @@ void SetFollowerNPCSprite(u32 spriteIndex) SetFollowerNPCData(FNPC_DATA_CURRENT_SPRITE, spriteIndex); oldSpriteId = follower->spriteId; newGraphicsId = GetFollowerNPCSprite(); + clone = *GetObjectEventTemplateByLocalIdAndMap(OBJ_EVENT_ID_NPC_FOLLOWER, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); backupFollower = *follower; backupFollower.graphicsId = newGraphicsId; DestroySprite(&gSprites[oldSpriteId]); RemoveObjectEvent(&gObjectEvents[GetFollowerNPCObjectId()]); - clone = *GetObjectEventTemplateByLocalIdAndMap(GetFollowerNPCData(FNPC_DATA_MAP_ID), GetFollowerNPCData(FNPC_DATA_MAP_NUM), GetFollowerNPCData(FNPC_DATA_MAP_GROUP)); clone.graphicsId = newGraphicsId; clone.movementType = 0; clone.localId = OBJ_EVENT_ID_NPC_FOLLOWER; @@ -1128,20 +1301,20 @@ void NPCFollow(struct ObjectEvent *npc, u32 state, bool32 ignoreScriptActive) void CreateFollowerNPCAvatar(void) { - struct ObjectEvent *player; - struct ObjectEventTemplate clone; - if (!PlayerHasFollowerNPC()) return; - player = &gObjectEvents[gPlayerAvatar.objectEventId]; - clone = *GetObjectEventTemplateByLocalIdAndMap(GetFollowerNPCData(FNPC_DATA_MAP_ID), GetFollowerNPCData(FNPC_DATA_MAP_NUM), GetFollowerNPCData(FNPC_DATA_MAP_GROUP)); - - clone.graphicsId = GetFollowerNPCSprite(); - clone.x = player->currentCoords.x - 7; - clone.y = player->currentCoords.y - 7; - clone.movementType = 0; - clone.localId = OBJ_EVENT_ID_NPC_FOLLOWER; + struct ObjectEvent *player = &gObjectEvents[gPlayerAvatar.objectEventId]; + struct ObjectEventTemplate clone = + { + .localId = OBJ_EVENT_ID_NPC_FOLLOWER, + .graphicsId = GetFollowerNPCSprite(), + .x = player->currentCoords.x - 7, + .y = player->currentCoords.y - 7, + .elevation = player->currentElevation, + .script = GetFollowerNPCScriptPointer(), + .movementType = MOVEMENT_TYPE_FACE_DOWN + }; switch (GetPlayerFacingDirection()) { @@ -1157,7 +1330,7 @@ void CreateFollowerNPCAvatar(void) } // Create NPC and store ID. - SetFollowerNPCData(FNPC_DATA_OBJ_ID, TrySpawnObjectEventTemplate(&clone, GetFollowerNPCData(FNPC_DATA_MAP_NUM), GetFollowerNPCData(FNPC_DATA_MAP_GROUP), clone.x, clone.y)); + SetFollowerNPCData(FNPC_DATA_OBJ_ID, TrySpawnObjectEventTemplate(&clone, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, clone.x, clone.y)); if (GetFollowerNPCData(FNPC_DATA_OBJ_ID) == OBJECT_EVENTS_COUNT) { ClearFollowerNPCData(); @@ -1179,10 +1352,6 @@ void FollowerNPC_HandleSprite(void) else if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) SetFollowerNPCSprite(FOLLOWER_NPC_SPRITE_INDEX_ACRO_BIKE); } - else if (gMapHeader.mapType == MAP_TYPE_UNDERWATER) - { - TryUpdateFollowerNPCSpriteUnderwater(); - } else if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ON_FOOT) { SetFollowerNPCSprite(FOLLOWER_NPC_SPRITE_INDEX_NORMAL); @@ -1548,55 +1717,52 @@ void FollowerNPC_TryRemoveFollowerOnWhiteOut(void) #undef tDoorY // Task data -#define PREVENT_PLAYER_STEP 0 -#define DO_ALL_FORCED_MOVEMENTS 1 -#define NPC_INTO_PLAYER 2 -#define ENABLE_PLAYER_STEP 3 +#define NPC_INTO_PLAYER 0 +#define ENABLE_PLAYER_STEP 1 void Task_MoveNPCFollowerAfterForcedMovement(u8 taskId) { struct ObjectEvent *follower = &gObjectEvents[GetFollowerNPCObjectId()]; struct ObjectEvent *player = &gObjectEvents[gPlayerAvatar.objectEventId]; - // Prevent player input until all forced mmovements are done and the follower is hidden. - if (gTasks[taskId].tState == PREVENT_PLAYER_STEP) + // If follower moved during player's forced momvements. + if (GetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT) == FNPC_FORCED_FOLLOW) { - gPlayerAvatar.preventStep = TRUE; - gTasks[taskId].tState = DO_ALL_FORCED_MOVEMENTS; - } - // The player will keep doing forced movments until they land on a non-forced-move metatile or hit collision. - else if (gTasks[taskId].tState == DO_ALL_FORCED_MOVEMENTS && ObjectEventClearHeldMovementIfFinished(player) != 0) - { - // Lock follower facing direction for muddy slope. - if (follower->currentMetatileBehavior == MB_MUDDY_SLOPE) - follower->facingDirectionLocked = TRUE; - - if (TryDoMetatileBehaviorForcedMovement() == 0) - gTasks[taskId].tState = NPC_INTO_PLAYER; + // The NPC will take an extra step and be on the same tile as the player. + if (gTasks[taskId].tState == NPC_INTO_PLAYER && ObjectEventClearHeldMovementIfFinished(player) != 0 && ObjectEventClearHeldMovementIfFinished(follower) != 0) + { + if (follower->currentMetatileBehavior == MB_MUDDY_SLOPE) + follower->facingDirectionLocked = TRUE; - return; - } - // The NPC will take an extra step and be on the same tile as the player. - else if (gTasks[taskId].tState == NPC_INTO_PLAYER && ObjectEventClearHeldMovementIfFinished(player) != 0 && ObjectEventClearHeldMovementIfFinished(follower) != 0) - { - ObjectEventSetHeldMovement(follower, GetWalkFastMovementAction(DetermineFollowerNPCDirection(player, follower))); - gTasks[taskId].tState = ENABLE_PLAYER_STEP; - return; + ObjectEventSetHeldMovement(follower, GetWalkFastMovementAction(DetermineFollowerNPCDirection(player, follower))); + gTasks[taskId].tState = ENABLE_PLAYER_STEP; + return; + } + // Hide the NPC until the player takes a step. Reallow player input. + else if (gTasks[taskId].tState == ENABLE_PLAYER_STEP && ObjectEventClearHeldMovementIfFinished(follower) != 0) + { + follower->facingDirectionLocked = FALSE; + HideNPCFollower(); + SetFollowerNPCData(FNPC_DATA_WARP_END, FNPC_WARP_REAPPEAR); + SetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT, FNPC_FORCED_NONE); + gPlayerAvatar.preventStep = FALSE; + DestroyTask(taskId); + } } - // Hide the NPC until the player takes a step. Reallow player input. - else if (gTasks[taskId].tState == ENABLE_PLAYER_STEP && ObjectEventClearHeldMovementIfFinished(follower) != 0) + // If player was forced back onto the same tile. + else if (GetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT) == FNPC_FORCED_STAY) { - follower->facingDirectionLocked = FALSE; - HideNPCFollower(); - SetFollowerNPCData(FNPC_DATA_WARP_END, FNPC_WARP_REAPPEAR); - gPlayerAvatar.preventStep = FALSE; - DestroyTask(taskId); + if (ObjectEventClearHeldMovementIfFinished(player) != 0) + { + SetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT, FNPC_FORCED_NONE); + SetFollowerNPCData(FNPC_DATA_DELAYED_STATE, 0); + gPlayerAvatar.preventStep = FALSE; + DestroyTask(taskId); + } } } #undef tState -#undef PREVENT_PLAYER_STEP -#undef DO_ALL_FORCED_MOVEMENTS #undef NPC_INTO_PLAYER #undef ENABLE_PLAYER_STEP @@ -1622,19 +1788,30 @@ void ScriptSetFollowerNPC(struct ScriptContext *ctx) u32 battlePartner = ScriptReadHalfword(ctx); const u8 *script = (const u8 *)ScriptReadWord(ctx); + if (PlayerHasFollowerNPC()) + return; + SetFollowerNPCData(FNPC_DATA_BATTLE_PARTNER, battlePartner); TurnNPCIntoFollower(localId, flags, setScript, script); } -void ScriptDestroyFollowerNPC(struct ScriptContext *ctx) +void ScriptCreateFollowerNPC(struct ScriptContext *ctx) { - if (!PlayerHasFollowerNPC()) + u32 gfx = ScriptReadHalfword(ctx); + u32 flags = ScriptReadHalfword(ctx); + const u8 *script = (const u8 *)ScriptReadWord(ctx); + u32 battlePartner = ScriptReadHalfword(ctx); + + if (!FNPC_ENABLE_NPC_FOLLOWERS || PlayerHasFollowerNPC()) return; - RemoveObjectEvent(&gObjectEvents[GetFollowerNPCData(FNPC_DATA_OBJ_ID)]); - FlagSet(GetFollowerNPCData(FNPC_DATA_EVENT_FLAG)); - ClearFollowerNPCData(); - UpdateFollowingPokemon(); + SetFollowerNPCData(FNPC_DATA_BATTLE_PARTNER, battlePartner); + CreateFollowerNPC(gfx, flags, script); +} + +void ScriptDestroyFollowerNPC(struct ScriptContext *ctx) +{ + DestroyFollowerNPC(); } void ScriptFaceFollowerNPC(struct ScriptContext *ctx) diff --git a/src/fonts.c b/src/fonts.c index 46f3a335c4dd..3e6953711307 100644 --- a/src/fonts.c +++ b/src/fonts.c @@ -229,7 +229,7 @@ ALIGNED(4) const u8 gFontSmallNarrowerLatinGlyphWidths[] = { 4, 5, 6, 7, 4, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 2, 4, 2, - 4, 4, 4, 2, 2, 4, 4, 8, 2, 8, 5, 4, 4, 4, 4, 4, + 4, 4, 4, 2, 2, 4, 4, 8, 2, 8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 3, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, diff --git a/src/frontier_pass.c b/src/frontier_pass.c index 12bb1f3ea72c..a81d23615781 100644 --- a/src/frontier_pass.c +++ b/src/frontier_pass.c @@ -106,7 +106,7 @@ enum { struct FrontierPassData { - void (*callback)(void); + MainCallback callback; u16 state; u16 battlePoints; s16 cursorX; @@ -137,14 +137,14 @@ struct FrontierPassGfx struct FrontierPassSaved { - void (*callback)(void); + MainCallback callback; s16 cursorX; s16 cursorY; }; struct FrontierMapData { - void (*callback)(void); + MainCallback callback; struct Sprite *cursorSprite; struct Sprite *playerHeadSprite; struct Sprite *mapIndicatorSprite; @@ -160,8 +160,8 @@ static EWRAM_DATA struct FrontierPassGfx *sPassGfx = NULL; static EWRAM_DATA struct FrontierMapData *sMapData = NULL; static EWRAM_DATA struct FrontierPassSaved sSavedPassData = {0}; -static u32 AllocateFrontierPassData(void (*callback)(void)); -static void ShowFrontierMap(void (*callback)(void)); +static u32 AllocateFrontierPassData(MainCallback callback); +static void ShowFrontierMap(MainCallback callback); static void CB2_InitFrontierPass(void); static void DrawFrontierPassBg(void); static void FreeCursorAndSymbolSprites(void); @@ -178,15 +178,15 @@ static void SpriteCB_PlayerHead(struct Sprite *); static const u16 sMaleHead_Pal[] = INCBIN_U16("graphics/frontier_pass/map_heads.gbapal"); static const u16 sFemaleHead_Pal[] = INCBIN_U16("graphics/frontier_pass/map_heads_female.gbapal"); -static const u32 sMapScreen_Gfx[] = INCBIN_U32("graphics/frontier_pass/map_screen.4bpp.lz"); -static const u32 sCursor_Gfx[] = INCBIN_U32("graphics/frontier_pass/cursor.4bpp.lz"); -static const u32 sHeads_Gfx[] = INCBIN_U32("graphics/frontier_pass/map_heads.4bpp.lz"); -static const u32 sMapCursor_Gfx[] = INCBIN_U32("graphics/frontier_pass/map_cursor.4bpp.lz"); -static const u32 sMapScreen_Tilemap[] = INCBIN_U32("graphics/frontier_pass/map_screen.bin.lz"); -static const u32 sMapAndCard_ZoomedOut_Tilemap[] = INCBIN_U32("graphics/frontier_pass/small_map_and_card.bin.lz"); +static const u32 sMapScreen_Gfx[] = INCBIN_U32("graphics/frontier_pass/map_screen.4bpp.smol"); +static const u32 sCursor_Gfx[] = INCBIN_U32("graphics/frontier_pass/cursor.4bpp.smol"); +static const u32 sHeads_Gfx[] = INCBIN_U32("graphics/frontier_pass/map_heads.4bpp.smol"); +static const u32 sMapCursor_Gfx[] = INCBIN_U32("graphics/frontier_pass/map_cursor.4bpp.smol"); +static const u32 sMapScreen_Tilemap[] = INCBIN_U32("graphics/frontier_pass/map_screen.bin.smolTM"); +static const u32 sMapAndCard_ZoomedOut_Tilemap[] = INCBIN_U32("graphics/frontier_pass/small_map_and_card.bin.smolTM"); static const u32 sCardBall_Filled_Tilemap[] = INCBIN_U32("graphics/frontier_pass/card_ball_filled.bin"); // Unused -static const u32 sBattleRecord_Tilemap[] = INCBIN_U32("graphics/frontier_pass/record_frame.bin.lz"); -static const u32 sMapAndCard_Zooming_Tilemap[] = INCBIN_U32("graphics/frontier_pass/small_map_and_card_affine.bin.lz"); +static const u32 sBattleRecord_Tilemap[] = INCBIN_U32("graphics/frontier_pass/record_frame.bin.smolTM"); +static const u32 sMapAndCard_Zooming_Tilemap[] = INCBIN_U32("graphics/frontier_pass/small_map_and_card_affine.bin.smolTM"); static const s16 sBgAffineCoords[][2] = { @@ -604,9 +604,11 @@ static void LeaveFrontierPass(void) FreeFrontierPassData(); } -static u32 AllocateFrontierPassData(void (*callback)(void)) +static u32 AllocateFrontierPassData(MainCallback callback) { - u8 i; + // This variable is a MAPSEC initially, but is recycled as a + // bare integer near the end of the function. + mapsec_u8_t i; if (sPassData != NULL) return ERR_ALREADY_DONE; @@ -917,12 +919,12 @@ static void CB2_ReturnFromRecord(void) sPassData->cursorX = sSavedPassData.cursorX; sPassData->cursorY = sSavedPassData.cursorY; memset(&sSavedPassData, 0, sizeof(sSavedPassData)); - switch (InBattlePyramid()) + switch (CurrentBattlePyramidLocation()) { - case 1: + case PYRAMID_LOCATION_FLOOR: PlayBGM(MUS_B_PYRAMID); break; - case 2: + case PYRAMID_LOCATION_TOP: PlayBGM(MUS_B_PYRAMID_TOP); break; default: @@ -1363,7 +1365,7 @@ static void PrintOnFrontierMap(void); static void InitFrontierMapSprites(void); static void HandleFrontierMapCursorMove(u8 direction); -static void ShowFrontierMap(void (*callback)(void)) +static void ShowFrontierMap(MainCallback callback) { if (sMapData != NULL) SetMainCallback2(callback); // This line doesn't make sense at all, since it gets overwritten later anyway. diff --git a/src/frontier_util.c b/src/frontier_util.c index cf2cbaba8d60..50f0c671674d 100644 --- a/src/frontier_util.c +++ b/src/frontier_util.c @@ -38,6 +38,7 @@ #include "constants/items.h" #include "constants/event_objects.h" #include "party_menu.h" +#include "list_menu.h" struct FrontierBrainMon { @@ -93,6 +94,9 @@ static void ShowArenaResultsWindow(void); static void ShowPyramidResultsWindow(void); static void ShowLinkContestResultsWindow(void); static void CopyFrontierBrainText(bool8 playerWonText); +static u16 *MakeCaughtBannesSpeciesList(u32 totalBannedSpecies); +static void PrintBannedSpeciesName(u8 windowId, u32 itemId, u8 y); +static void Task_BannedSpeciesWindowInput(u8 taskId); // battledBit: Flags to change the conversation when the Frontier Brain is encountered for a battle // First bit is has battled them before and not won yet, second bit is has battled them and won (obtained a Symbol) @@ -784,6 +788,58 @@ static const u8 *const sHallFacilityToRecordsText[] = [RANKING_HALL_TOWER_LINK] = gText_FrontierFacilityWinStreak, }; + +#define BANNED_SPECIES_SHOWN 6 + +static const struct ListMenuTemplate sCaughtBannedSpeciesListTemplate = +{ + .items = NULL, + .isDynamic = TRUE, + .moveCursorFunc = ListMenuDefaultCursorMoveFunc, + .itemPrintFunc = PrintBannedSpeciesName, + .maxShowed = BANNED_SPECIES_SHOWN, + .header_X = 0, + .item_X = 8, + .cursor_X = 0, + .upText_Y = 1, + .cursorPal = 2, + .fillValue = 1, + .cursorShadowPal = 3, + .lettersSpacing = 1, + .itemVerticalPadding = 0, + .scrollMultiple = LIST_NO_MULTIPLE_SCROLL, + .fontId = FONT_NORMAL, + .cursorKind = 0 +}; + +static const struct WindowTemplate sBannedSpeciesWindowTemplateMain = +{ + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 12, + .height = 2 * BANNED_SPECIES_SHOWN, + .paletteNum = 15, + .baseBlock = 1, +}; + +#define TAG_LIST_ARROWS 5425 + +static const struct ScrollArrowsTemplate sCaughtBannedSpeciesScrollArrowsTemplate = +{ + .firstArrowType = SCROLL_ARROW_UP, + .firstX = 56, + .firstY = 8, + .secondArrowType = SCROLL_ARROW_DOWN, + .secondX = 56, + .secondY = 104, + .fullyUpThreshold = 0, + .fullyDownThreshold = 0, + .tileTag = TAG_LIST_ARROWS, + .palTag = TAG_LIST_ARROWS, + .palNum = 0, +}; + // code void CallFrontierUtilFunc(void) { @@ -913,7 +969,7 @@ static void SaveSelectedParty(void) { u16 monId = gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1; if (monId < PARTY_SIZE) - gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1] = gPlayerParty[i]; + SavePlayerPartyMon(gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1, &gPlayerParty[i]); } } @@ -1943,21 +1999,18 @@ static void CheckBattleTypeFlag(void) gSpecialVar_Result = FALSE; } -#define SPECIES_PER_LINE 3 - static void AppendCaughtBannedMonSpeciesName(u16 species, u8 count, s32 numBannedMonsCaught) { - if (numBannedMonsCaught == count) + if (count == 1) + ; + else if (numBannedMonsCaught == count) StringAppend(gStringVar1, gText_SpaceAndSpace); else if (numBannedMonsCaught > count) StringAppend(gStringVar1, gText_CommaSpace); - if ((count % SPECIES_PER_LINE) == 0) - { - if (count == SPECIES_PER_LINE) - StringAppend(gStringVar1, gText_NewLine); - else - StringAppend(gStringVar1, gText_LineBreak); - } + if (count == 3) + StringAppend(gStringVar1, gText_NewLine2); + else if (count == 6) + StringAppend(gStringVar1, gText_LineBreak); StringAppend(gStringVar1, GetSpeciesName(species)); } @@ -2053,46 +2106,60 @@ static void CheckPartyIneligibility(void) if (numEligibleMons < toChoose) { - u32 i; + u32 i, j; u32 baseSpecies = 0; u32 totalCaughtBanned = 0; - u32 caughtBanned[100] = {0}; + u32 totalPartyBanned = 0; + u32 partyBanned[PARTY_SIZE] = {0}; for (i = 0; i < NUM_SPECIES; i++) { - if (totalCaughtBanned >= ARRAY_COUNT(caughtBanned)) - break; baseSpecies = GET_BASE_SPECIES_ID(i); - if (baseSpecies == i) + if (baseSpecies == i && gSpeciesInfo[baseSpecies].isFrontierBanned) + { + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(baseSpecies), FLAG_GET_CAUGHT)) + totalCaughtBanned++; + } + } + + for (i = 0; i < PARTY_SIZE; i++) + { + u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG); + if (species == SPECIES_EGG || species == SPECIES_NONE) + continue; + if (gSpeciesInfo[GET_BASE_SPECIES_ID(species)].isFrontierBanned) { - if (gSpeciesInfo[baseSpecies].isFrontierBanned) + bool32 addToList = TRUE; + for (j = 0; j < totalPartyBanned; j++) + if (partyBanned[j] == species) + addToList = FALSE; + if (addToList) { - if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(baseSpecies), FLAG_GET_CAUGHT)) - { - caughtBanned[totalCaughtBanned] = baseSpecies; - totalCaughtBanned++; - } + partyBanned[totalPartyBanned] = species; + totalPartyBanned++; } } } + gStringVar1[0] = EOS; gSpecialVar_0x8004 = TRUE; - for (i = 0; i < totalCaughtBanned; i++) - AppendCaughtBannedMonSpeciesName(caughtBanned[i], i+1, totalCaughtBanned); - if (totalCaughtBanned == 0) { - StringAppend(gStringVar1, gText_Space2); - StringAppend(gStringVar1, gText_Are); + StringAppend(gStringVar1, gText_FrontierFacilityAreInelegible); } else { - if (totalCaughtBanned % SPECIES_PER_LINE == SPECIES_PER_LINE - 1) - StringAppend(gStringVar1, gText_LineBreak); - else - StringAppend(gStringVar1, gText_Space2); - StringAppend(gStringVar1, gText_Are2); + ConvertIntToDecimalStringN(gStringVar2, totalCaughtBanned, STR_CONV_MODE_LEFT_ALIGN, 3); + StringExpandPlaceholders(gStringVar4, gText_FrontierFacilityTotalCaughtSpeciesBanned); + StringAppend(gStringVar1, gStringVar4); + } + if (totalPartyBanned > 0) + { + StringAppend(gStringVar1, gText_FrontierFacilityIncluding); + for (i = 0; i < totalPartyBanned; i++) + AppendCaughtBannedMonSpeciesName(partyBanned[i], i+1, totalPartyBanned); } + gSpecialVar_0x8005 = totalCaughtBanned; } else { @@ -2102,8 +2169,6 @@ static void CheckPartyIneligibility(void) #undef numEligibleMons } -#undef SPECIES_PER_LINE - static void ValidateVisitingTrainer(void) { ValidateEReaderTrainer(); @@ -2165,7 +2230,7 @@ static void RestoreHeldItems(void) { if (gSaveBlock2Ptr->frontier.selectedPartyMons[i] != 0) { - u16 item = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], MON_DATA_HELD_ITEM, NULL); + u16 item = GetMonData(GetSavedPlayerPartyMon(gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1), MON_DATA_HELD_ITEM, NULL); SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &item); } } @@ -2203,14 +2268,14 @@ static void ResetSketchedMoves(void) { for (k = 0; k < MAX_MON_MOVES; k++) { - if (GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], MON_DATA_MOVE1 + k, NULL) + if (GetMonData(GetSavedPlayerPartyMon(gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1), MON_DATA_MOVE1 + k, NULL) == GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j, NULL)) break; } if (k == MAX_MON_MOVES) SetMonMoveSlot(&gPlayerParty[i], MOVE_SKETCH, j); } - gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1] = gPlayerParty[i]; + SavePlayerPartyMon(gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1, &gPlayerParty[i]); } } } @@ -2459,7 +2524,7 @@ u8 GetFrontierBrainTrainerPicIndex(void) return GetTrainerPicFromId(gFrontierBrainInfo[facility].trainerId); } -u8 GetFrontierBrainTrainerClass(void) +enum TrainerClassID GetFrontierBrainTrainerClass(void) { s32 facility; @@ -2649,3 +2714,98 @@ void ClearEnemyPartyAfterChallenge() ZeroEnemyPartyMons(); } } + +#define tWindowId data[0] +#define tMenuTaskId data[1] +#define tArrowTaskId data[2] +#define tScrollOffset data[3] +#define tListPointerElemId 4 + +static u16 *MakeCaughtBannesSpeciesList(u32 totalBannedSpecies) +{ + u32 count = 0; + u16 *list = AllocZeroed(sizeof(u16) * totalBannedSpecies); + for (u32 i = 0; i < NUM_SPECIES; i++) + { + u32 baseSpecies = GET_BASE_SPECIES_ID(i); + if (baseSpecies == i && gSpeciesInfo[baseSpecies].isFrontierBanned) + { + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(baseSpecies), FLAG_GET_CAUGHT)) + { + list[count] = i; + count++; + } + } + } + return list; +} + +static void PrintBannedSpeciesName(u8 windowId, u32 itemId, u8 y) +{ + u8 colors[3] = { + sCaughtBannedSpeciesListTemplate.fillValue, + sCaughtBannedSpeciesListTemplate.cursorPal, + sCaughtBannedSpeciesListTemplate.cursorShadowPal + }; + u16 *list = (u16 *) GetWordTaskArg(gSpecialVar_0x8006, tListPointerElemId); + AddTextPrinterParameterized4(windowId, + sCaughtBannedSpeciesListTemplate.fontId, + sCaughtBannedSpeciesListTemplate.item_X, y, + sCaughtBannedSpeciesListTemplate.lettersSpacing, 0, colors, TEXT_SKIP_DRAW, + GetSpeciesName(list[itemId])); +} + +void ShowBattleFrontierCaughtBannedSpecies(void) +{ + u8 windowId; + struct ListMenuTemplate listTemplate = sCaughtBannedSpeciesListTemplate; + u32 totalCaughtBanned = gSpecialVar_0x8005; + listTemplate.totalItems = totalCaughtBanned; + + // create window + LoadMessageBoxAndBorderGfx(); + windowId = AddWindow(&sBannedSpeciesWindowTemplateMain); + DrawStdWindowFrame(windowId, FALSE); + listTemplate.windowId = windowId; + + u16 *listItems = MakeCaughtBannesSpeciesList(totalCaughtBanned); + u32 inputTaskId = CreateTask(Task_BannedSpeciesWindowInput, 3); + gTasks[inputTaskId].tWindowId = windowId; + gSpecialVar_0x8006 = inputTaskId; + SetWordTaskArg(inputTaskId, tListPointerElemId, (u32)listItems); + u32 menuTaskId = ListMenuInit(&listTemplate, 0, 0); + gTasks[inputTaskId].tMenuTaskId = menuTaskId; + gTasks[inputTaskId].tArrowTaskId = TASK_NONE; + if (listTemplate.totalItems > listTemplate.maxShowed) + { + gTempScrollArrowTemplate = sCaughtBannedSpeciesScrollArrowsTemplate; + gTempScrollArrowTemplate.fullyDownThreshold = listTemplate.totalItems - listTemplate.maxShowed; + gTasks[inputTaskId].tArrowTaskId = AddScrollIndicatorArrowPair(&gTempScrollArrowTemplate, (u16 *)&gTasks[inputTaskId].tScrollOffset); + } + + // draw everything + CopyWindowToVram(windowId, COPYWIN_FULL); +} + +static void Task_BannedSpeciesWindowInput(u8 taskId) +{ + ListMenu_ProcessInput(gTasks[taskId].tMenuTaskId); + ListMenuGetScrollAndRow(gTasks[taskId].tMenuTaskId, (u16 *)&gTasks[taskId].tScrollOffset, NULL); + if (JOY_NEW(B_BUTTON)) + { + ScriptContext_Enable(); + if (gTasks[taskId].tArrowTaskId < TASK_NONE) + RemoveScrollIndicatorArrowPair(gTasks[taskId].tArrowTaskId); + Free((struct ListItem *)(GetWordTaskArg(taskId, tListPointerElemId))); + DestroyListMenuTask(gTasks[taskId].tMenuTaskId, NULL, NULL); + ClearStdWindowAndFrame(gTasks[taskId].tWindowId, TRUE); + RemoveWindow(gTasks[taskId].tWindowId); + DestroyTask(taskId); + } +} + +#undef tWindowId +#undef tMenuTaskId +#undef tArrowTaskId +#undef tScrollOffset +#undef tListPointerElemId diff --git a/src/generational_changes.c b/src/generational_changes.c index 1ad29aa675e7..a02b6ce944ee 100644 --- a/src/generational_changes.c +++ b/src/generational_changes.c @@ -3,17 +3,113 @@ #include "malloc.h" #include "constants/generational_changes.h" +#define UNPACK_CONFIG_GEN_CHANGES2(_name, _field, ...) ._field = B_##_name, + +const struct GenChanges sConfigChanges = +{ + CONFIG_DEFINITIONS(UNPACK_CONFIG_GEN_CHANGES2) + /* Expands to: + .critChance = B_CRIT_CHANCE, + .critMultiplier = B_CRIT_MULTIPLIER, + */ +}; + +#if TESTING +EWRAM_DATA struct GenChanges *gConfigChangesTestOverride = NULL; +#define UNPACK_CONFIG_OVERRIDE_GETTERS(_name, _field, ...) case CONFIG_##_name: return gConfigChangesTestOverride->_field; +#define UNPACK_CONFIG_GETTERS(_name, _field, ...) case CONFIG_##_name: return sConfigChanges._field; +#define UNPACK_CONFIG_CLAMPER(_name, _field, _typeMaxValue, ...) case CONFIG_##_name: clampedValue = min(GET_CONFIG_MAXIMUM(_typeMaxValue), newValue); break; +#define UNPACK_CONFIG_SETTERS(_name, _field, _typeMaxValue, ...) case CONFIG_##_name: gConfigChangesTestOverride->_field = clampedValue; break; + +#else + +#define UNPACK_CONFIG_OVERRIDE_GETTERS(_name, _field, ...) case CONFIG_##_name: return sConfigChanges._field; +#define UNPACK_CONFIG_GETTERS(_name, _field, ...) case CONFIG_##_name: return sConfigChanges._field; +#define UNPACK_CONFIG_CLAMPER(_name, _field, ...) case CONFIG_##_name: return 0; +#define UNPACK_CONFIG_SETTERS(_name, _field, ...) case CONFIG_##_name: return; +#endif + +// Gets the value of a volatile status flag for a certain battler +// Primarily used for the debug menu and scripts. Outside of it explicit references are preferred +u32 GetConfig(enum ConfigTag _genConfig) +{ +#if TESTING + if (gConfigChangesTestOverride == NULL) + { + switch (_genConfig) + { + CONFIG_DEFINITIONS(UNPACK_CONFIG_GETTERS) + /* Expands to: + case CONFIG_CRIT_CHANCE: + return gConfigChangesTestOverride->critChance; + */ + default: + return 0; + } + } + else +#endif + { + switch (_genConfig) + { + CONFIG_DEFINITIONS(UNPACK_CONFIG_OVERRIDE_GETTERS) + /* Expands to: + case CONFIG_CRIT_CHANCE: + return sConfigChanges.critChance; + */ + default: // Invalid config tag + return 0; + } + } +} + #if TESTING -EWRAM_DATA u8 *gGenerationalChangesTestOverride = NULL; +u32 GetClampedValue(enum ConfigTag _genConfig, u32 newValue) +{ + u32 clampedValue = 0; + switch(_genConfig) + { + CONFIG_DEFINITIONS(UNPACK_CONFIG_CLAMPER) + default: + return 0; + } + return clampedValue; +} +#endif +void SetConfig(enum ConfigTag _genConfig, u32 _value) +{ +#if TESTING + // Clamping is done here instead of the switch due to an internal compiler error! + u32 clampedValue = GetClampedValue(_genConfig, _value); + switch (_genConfig) + { + CONFIG_DEFINITIONS(UNPACK_CONFIG_SETTERS) + /* Expands to: + #if TESTING + case CONFIG_CRIT_CHANCE: + gConfigChangesTestOverride->critChance = clampedValue; + break; + #else + case CONFIG_CRIT_CHANCE: + return; + #endif + */ + default: // Invalid config tag + return; + } +#endif +} + +#if TESTING void TestInitConfigData(void) { - gGenerationalChangesTestOverride = Alloc(sizeof(sGenerationalChanges)); - memcpy(gGenerationalChangesTestOverride, sGenerationalChanges, sizeof(sGenerationalChanges)); + gConfigChangesTestOverride = Alloc(sizeof(sConfigChanges)); + memcpy(gConfigChangesTestOverride, &sConfigChanges, sizeof(sConfigChanges)); } void TestFreeConfigData(void) { - TRY_FREE_AND_SET_NULL(gGenerationalChangesTestOverride) + TRY_FREE_AND_SET_NULL(gConfigChangesTestOverride) } #endif diff --git a/src/gpu_regs.c b/src/gpu_regs.c index 3bcc4fd93131..d645c1442d1a 100644 --- a/src/gpu_regs.c +++ b/src/gpu_regs.c @@ -8,7 +8,7 @@ #define EMPTY_SLOT 0xFF -static u8 sGpuRegBuffer[GPU_REG_BUF_SIZE]; +static ALIGNED(2) u8 sGpuRegBuffer[GPU_REG_BUF_SIZE]; // sGpuRegBuffer is read as u16 so it needs to be properly aligned static u8 sGpuRegWaitingList[GPU_REG_BUF_SIZE]; static volatile bool8 sGpuRegBufferLocked; static volatile bool8 sShouldSyncRegIE; diff --git a/src/graphics.c b/src/graphics.c index 4f245c421211..013c2d2b85be 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1,319 +1,322 @@ #include "global.h" #include "graphics.h" -const u32 gBattleTextboxTiles[] = INCBIN_U32("graphics/battle_interface/textbox.4bpp.lz"); +const u32 gBattleTextboxTiles[] = INCBIN_U32("graphics/battle_interface/textbox.4bpp.smol"); const u16 gBattleTextboxPalette[] = INCBIN_U16("graphics/battle_interface/textbox.gbapal"); -const u32 gBattleTextboxTilemap[] = INCBIN_U32("graphics/battle_interface/textbox_map.bin.lz"); +const u32 gBattleTextboxTilemap[] = INCBIN_U32("graphics/battle_interface/textbox_map.bin.smolTM"); -const u32 gUnusedGfx_OldCharmap[] = INCBIN_U32("graphics/unused/old_charmap.4bpp.lz"); // japanese table and bunch of stuff -const u32 gUnusedTimemap_OldCharmap[] = INCBIN_U32("graphics/unused/old_charmap.bin.lz"); +const u32 gUnusedGfx_OldCharmap[] = INCBIN_U32("graphics/unused/old_charmap.4bpp.smol"); // japanese table and bunch of stuff +const u32 gUnusedTimemap_OldCharmap[] = INCBIN_U32("graphics/unused/old_charmap.bin.smolTM"); const u16 gUnusedPal_OldCharmap[] = INCBIN_U16("graphics/unused/old_charmap.gbapal"); -const u32 gSmokescreenImpactTiles[] = INCBIN_U32("graphics/battle_anims/sprites/smokescreen_impact.4bpp.lz"); +const u32 gSmokescreenImpactTiles[] = INCBIN_U32("graphics/battle_anims/sprites/smokescreen_impact.4bpp.smol"); const u16 gSmokescreenImpactPalette[] = INCBIN_U16("graphics/battle_anims/sprites/smokescreen_impact.gbapal"); #include "data/graphics/pokeballs.h" -const u32 gBlankGfxCompressed[] = INCBIN_U32("graphics/interface/blank.4bpp.lz"); +const u32 gBlankGfxCompressed[] = INCBIN_U32("graphics/interface/blank.4bpp.smol"); // New Battle anims Particles -const u32 gBattleAnimSpriteGfx_WhiteStreak[] = INCBIN_U32("graphics/battle_anims/sprites/white_streak.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WhiteStreak[] = INCBIN_U32("graphics/battle_anims/sprites/white_streak.4bpp.smol"); const u16 gBattleAnimSpritePal_WhiteStreak[] = INCBIN_U16("graphics/battle_anims/sprites/white_streak.gbapal"); -const u32 gBattleAnimSpriteGfx_PurpleJab[] = INCBIN_U32("graphics/battle_anims/sprites/purple_jab.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PurpleJab[] = INCBIN_U32("graphics/battle_anims/sprites/purple_jab.4bpp.smol"); const u16 gBattleAnimSpritePal_PurpleJab[] = INCBIN_U16("graphics/battle_anims/sprites/purple_jab.gbapal"); const u16 gBattleAnimSpritePal_ToxicSpikes[] = INCBIN_U16("graphics/battle_anims/sprites/toxic_spikes.gbapal"); -const u32 gBattleAnimSpriteGfx_EnergyBall[] = INCBIN_U32("graphics/battle_anims/sprites/energy_ball.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_EnergyBall[] = INCBIN_U32("graphics/battle_anims/sprites/energy_ball.4bpp.smol"); const u16 gBattleAnimSpritePal_EnergyBall[] = INCBIN_U16("graphics/battle_anims/sprites/energy_ball.gbapal"); -const u32 gBattleAnimSpriteGfx_MegaStone[] = INCBIN_U32("graphics/battle_anims/sprites/mega_stone.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MegaStone[] = INCBIN_U32("graphics/battle_anims/sprites/mega_stone.4bpp.smol"); const u16 gBattleAnimSpritePal_MegaStone[] = INCBIN_U16("graphics/battle_anims/sprites/mega_stone.gbapal"); -const u32 gBattleAnimSpriteGfx_MegaParticles[] = INCBIN_U32("graphics/battle_anims/sprites/mega_particles.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MegaParticles[] = INCBIN_U32("graphics/battle_anims/sprites/mega_particles.4bpp.smol"); const u16 gBattleAnimSpritePal_MegaParticles[] = INCBIN_U16("graphics/battle_anims/sprites/mega_particles.gbapal"); -const u32 gBattleAnimSpriteGfx_MegaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/mega_symbol.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MegaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/mega_symbol.4bpp.smol"); const u16 gBattleAnimSpritePal_MegaSymbol[] = INCBIN_U16("graphics/battle_anims/sprites/mega_symbol.gbapal"); -const u32 gBattleAnimSpriteGfx_AlphaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/alpha_symbol.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_AlphaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/alpha_symbol.4bpp.smol"); const u16 gBattleAnimSpritePal_AlphaSymbol[] = INCBIN_U16("graphics/battle_anims/sprites/alpha_symbol.gbapal"); -const u32 gBattleAnimSpriteGfx_OmegaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/omega_symbol.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_OmegaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/omega_symbol.4bpp.smol"); const u16 gBattleAnimSpritePal_OmegaSymbol[] = INCBIN_U16("graphics/battle_anims/sprites/omega_symbol.gbapal"); -const u32 gBattleAnimSpriteGfx_FlashCannonBall[] = INCBIN_U32("graphics/battle_anims/sprites/flash_cannon_ball.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_TeraSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/tera_symbol.4bpp.smol"); +const u16 gBattleAnimSpritePal_TeraSymbol[] = INCBIN_U16("graphics/battle_anims/sprites/tera_symbol.gbapal"); + +const u32 gBattleAnimSpriteGfx_FlashCannonBall[] = INCBIN_U32("graphics/battle_anims/sprites/flash_cannon_ball.4bpp.smol"); const u16 gBattleAnimSpritePal_FlashCannonBall[] = INCBIN_U16("graphics/battle_anims/sprites/flash_cannon_ball.gbapal"); -const u32 gBattleAnimSpriteGfx_WaterGun[] = INCBIN_U32("graphics/battle_anims/sprites/water_gun.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WaterGun[] = INCBIN_U32("graphics/battle_anims/sprites/water_gun.4bpp.smol"); const u16 gBattleAnimSpritePal_WaterGun[] = INCBIN_U16("graphics/battle_anims/sprites/water_gun.gbapal"); -const u32 gBattleAnimSpriteGfx_Punishment[] = INCBIN_U32("graphics/battle_anims/sprites/punishment.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Punishment[] = INCBIN_U32("graphics/battle_anims/sprites/punishment.4bpp.smol"); const u16 gBattleAnimSpritePal_Punishment[] = INCBIN_U16("graphics/battle_anims/sprites/punishment.gbapal"); -const u32 gBattleAnimSpriteGfx_QuickGuard[] = INCBIN_U32("graphics/battle_anims/sprites/quick_guard.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_QuickGuard[] = INCBIN_U32("graphics/battle_anims/sprites/quick_guard.4bpp.smol"); const u16 gBattleAnimSpritePal_QuickGuard[] = INCBIN_U16("graphics/battle_anims/sprites/quick_guard.gbapal"); -const u32 gBattleAnimSpriteGfx_AlphaStone[] = INCBIN_U32("graphics/battle_anims/sprites/alpha_stone.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_AlphaStone[] = INCBIN_U32("graphics/battle_anims/sprites/alpha_stone.4bpp.smol"); const u16 gBattleAnimSpritePal_AlphaStone[] = INCBIN_U16("graphics/battle_anims/sprites/alpha_stone.gbapal"); -const u32 gBattleAnimSpriteGfx_TeraCrystal[] = INCBIN_U32("graphics/battle_anims/sprites/tera_crystal.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_TeraCrystal[] = INCBIN_U32("graphics/battle_anims/sprites/tera_crystal.4bpp.smol"); const u16 gBattleAnimSpritePal_TeraCrystal[] = INCBIN_U16("graphics/battle_anims/sprites/tera_crystal.gbapal"); -const u32 gBattleAnimSpriteGfx_TeraShatter[] = INCBIN_U32("graphics/battle_anims/sprites/tera_shatter.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_TeraShatter[] = INCBIN_U32("graphics/battle_anims/sprites/tera_shatter.4bpp.smol"); const u16 gBattleAnimSpritePal_TeraShatter[] = INCBIN_U16("graphics/battle_anims/sprites/tera_shatter.gbapal"); -const u32 gBattleAnimSpriteGfx_Anchor[] = INCBIN_U32("graphics/battle_anims/sprites/anchor.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Anchor[] = INCBIN_U32("graphics/battle_anims/sprites/anchor.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Apple[] = INCBIN_U32("graphics/battle_anims/sprites/apple.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Apple[] = INCBIN_U32("graphics/battle_anims/sprites/apple.4bpp.smol"); const u16 gBattleAnimSpritePal_Apple[] = INCBIN_U16("graphics/battle_anims/sprites/apple.gbapal"); -const u32 gBattleAnimSpriteGfx_Arrows[] = INCBIN_U32("graphics/battle_anims/sprites/arrows.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Arrows[] = INCBIN_U32("graphics/battle_anims/sprites/arrows.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_AssuranceHand[] = INCBIN_U32("graphics/battle_anims/sprites/assurance_hand.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_AssuranceHand[] = INCBIN_U32("graphics/battle_anims/sprites/assurance_hand.4bpp.smol"); const u16 gBattleAnimSpritePal_AssuranceHand[] = INCBIN_U16("graphics/battle_anims/sprites/assurance_hand.gbapal"); -const u32 gBattleAnimSpriteGfx_AuraSphere[] = INCBIN_U32("graphics/battle_anims/sprites/aura_sphere.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_AuraSphere[] = INCBIN_U32("graphics/battle_anims/sprites/aura_sphere.4bpp.smol"); const u16 gBattleAnimSpritePal_AuraSphere[] = INCBIN_U16("graphics/battle_anims/sprites/aura_sphere.gbapal"); const u16 gBattleAnimSpritePal_AvalancheRocks[] = INCBIN_U16("graphics/battle_anims/sprites/avalanche_rocks.gbapal"); -const u32 gBattleAnimSpriteGfx_NewPokeball[] = INCBIN_U32("graphics/battle_anims/sprites/baton_pass_ball.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewPokeball[] = INCBIN_U32("graphics/battle_anims/sprites/baton_pass_ball.4bpp.smol"); const u16 gBattleAnimSpritePal_NewPokeball[] = INCBIN_U16("graphics/battle_anims/sprites/baton_pass_ball.gbapal"); -const u32 gBattleAnimSpriteGfx_Beam[] = INCBIN_U32("graphics/battle_anims/sprites/beam.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Beam[] = INCBIN_U32("graphics/battle_anims/sprites/beam.4bpp.smol"); const u16 gBattleAnimSpritePal_Beam[] = INCBIN_U16("graphics/battle_anims/sprites/beam.gbapal"); -const u32 gBattleAnimSpriteGfx_BerryEaten[] = INCBIN_U32("graphics/battle_anims/sprites/berry_eaten.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BerryEaten[] = INCBIN_U32("graphics/battle_anims/sprites/berry_eaten.4bpp.smol"); const u16 gBattleAnimSpritePal_BerryEaten[] = INCBIN_U16("graphics/battle_anims/sprites/berry_eaten.gbapal"); -const u32 gBattleAnimSpriteGfx_BerryNormal[] = INCBIN_U32("graphics/battle_anims/sprites/berry_normal.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BerryNormal[] = INCBIN_U32("graphics/battle_anims/sprites/berry_normal.4bpp.smol"); const u16 gBattleAnimSpritePal_BerryNormal[] = INCBIN_U16("graphics/battle_anims/sprites/berry_normal.gbapal"); -const u32 gBattleAnimSpriteGfx_BigRock[] = INCBIN_U32("graphics/battle_anims/sprites/big_rock.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BigRock[] = INCBIN_U32("graphics/battle_anims/sprites/big_rock.4bpp.smol"); const u16 gBattleAnimSpritePal_BigRock[] = INCBIN_U16("graphics/battle_anims/sprites/big_rock.gbapal"); -const u32 gBattleAnimSpriteGfx_BlacephalonHead[] = INCBIN_U32("graphics/battle_anims/sprites/blacephalon_head.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BlacephalonHead[] = INCBIN_U32("graphics/battle_anims/sprites/blacephalon_head.4bpp.smol"); const u16 gBattleAnimSpritePal_BlacephalonHead[] = INCBIN_U16("graphics/battle_anims/sprites/blacephalon_head.gbapal"); -const u32 gBattleAnimSpriteGfx_BloodMoon[] = INCBIN_U32("graphics/battle_anims/sprites/blood_moon.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BloodMoon[] = INCBIN_U32("graphics/battle_anims/sprites/blood_moon.4bpp.smol"); const u16 gBattleAnimSpritePal_BloodMoon[] = INCBIN_U16("graphics/battle_anims/sprites/blood_moon.gbapal"); const u16 gBattleAnimSpritePal_BlueFlare[] = INCBIN_U16("graphics/battle_anims/sprites/blue_flare.gbapal"); -const u32 gBattleAnimSpriteGfx_Branch[] = INCBIN_U32("graphics/battle_anims/sprites/branch.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Branch[] = INCBIN_U32("graphics/battle_anims/sprites/branch.4bpp.smol"); const u16 gBattleAnimSpritePal_Branch[] = INCBIN_U16("graphics/battle_anims/sprites/branch.gbapal"); -const u32 gBattleAnimSpriteGfx_Brine[] = INCBIN_U32("graphics/battle_anims/sprites/brine.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Brine[] = INCBIN_U32("graphics/battle_anims/sprites/brine.4bpp.smol"); const u16 gBattleAnimSpritePal_Brine[] = INCBIN_U16("graphics/battle_anims/sprites/brine.gbapal"); -const u32 gBattleAnimSpriteGfx_ChainLink[] = INCBIN_U32("graphics/battle_anims/sprites/chain_link.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ChainLink[] = INCBIN_U32("graphics/battle_anims/sprites/chain_link.4bpp.smol"); const u16 gBattleAnimSpritePal_ChainLink[] = INCBIN_U16("graphics/battle_anims/sprites/chain_link.gbapal"); -const u32 gBattleAnimSpriteGfx_Chop[] = INCBIN_U32("graphics/battle_anims/sprites/chop.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Chop[] = INCBIN_U32("graphics/battle_anims/sprites/chop.4bpp.smol"); const u16 gBattleAnimSpritePal_Chop[] = INCBIN_U16("graphics/battle_anims/sprites/chop.gbapal"); -const u32 gBattleAnimSpriteGfx_Cacoon[] = INCBIN_U32("graphics/battle_anims/sprites/cacoon.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Cacoon[] = INCBIN_U32("graphics/battle_anims/sprites/cacoon.4bpp.smol"); const u16 gBattleAnimSpritePal_Cacoon[] = INCBIN_U16("graphics/battle_anims/sprites/cacoon.gbapal"); -const u32 gBattleAnimSpriteGfx_Confide[] = INCBIN_U32("graphics/battle_anims/sprites/confide.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Confide[] = INCBIN_U32("graphics/battle_anims/sprites/confide.4bpp.smol"); const u16 gBattleAnimSpritePal_Confide[] = INCBIN_U16("graphics/battle_anims/sprites/confide.gbapal"); -const u32 gBattleAnimSpriteGfx_CraftyShield[] = INCBIN_U32("graphics/battle_anims/sprites/crafty_shield.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_CraftyShield[] = INCBIN_U32("graphics/battle_anims/sprites/crafty_shield.4bpp.smol"); const u16 gBattleAnimSpritePal_CraftyShield[] = INCBIN_U16("graphics/battle_anims/sprites/crafty_shield.gbapal"); -const u32 gBattleAnimSpriteGfx_NewNail[] = INCBIN_U32("graphics/battle_anims/sprites/curse_nail.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewNail[] = INCBIN_U32("graphics/battle_anims/sprites/curse_nail.4bpp.smol"); const u16 gBattleAnimSpritePal_NewNail[] = INCBIN_U16("graphics/battle_anims/sprites/curse_nail.gbapal"); const u16 gBattleAnimSpritePal_DracoMeteor[] = INCBIN_U16("graphics/battle_anims/sprites/draco_meteor.gbapal"); -const u32 gBattleAnimSpriteGfx_DragonPulseRing[] = INCBIN_U32("graphics/battle_anims/sprites/dragon_pulse_ring.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_DragonPulseRing[] = INCBIN_U32("graphics/battle_anims/sprites/dragon_pulse_ring.4bpp.smol"); const u16 gBattleAnimSpritePal_DragonPulseRing[] = INCBIN_U16("graphics/battle_anims/sprites/dragon_pulse_ring.gbapal"); -const u32 gBattleAnimSpriteGfx_DreepyMissile[] = INCBIN_U32("graphics/battle_anims/sprites/dreepy_missile.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_DreepyMissile[] = INCBIN_U32("graphics/battle_anims/sprites/dreepy_missile.4bpp.smol"); const u16 gBattleAnimSpritePal_DreepyMissile[] = INCBIN_U16("graphics/battle_anims/sprites/dreepy_missile.gbapal"); -const u32 gBattleAnimSpriteGfx_DreepyMissileShiny[] = INCBIN_U32("graphics/battle_anims/sprites/dreepy_missile.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_DreepyMissileShiny[] = INCBIN_U32("graphics/battle_anims/sprites/dreepy_missile.4bpp.smol"); const u16 gBattleAnimSpritePal_DreepyMissileShiny[] = INCBIN_U16("graphics/battle_anims/sprites/dreepy_missile_shiny.gbapal"); -const u32 gBattleAnimSpriteGfx_Drill[] = INCBIN_U32("graphics/battle_anims/sprites/drill.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Drill[] = INCBIN_U32("graphics/battle_anims/sprites/drill.4bpp.smol"); const u16 gBattleAnimSpritePal_Drill[] = INCBIN_U16("graphics/battle_anims/sprites/drill.gbapal"); -const u32 gBattleAnimSpriteGfx_NewEmbers[] = INCBIN_U32("graphics/battle_anims/sprites/embers.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewEmbers[] = INCBIN_U32("graphics/battle_anims/sprites/embers.4bpp.smol"); const u16 gBattleAnimSpritePal_NewEmbers[] = INCBIN_U16("graphics/battle_anims/sprites/embers.gbapal"); -const u32 gBattleAnimSpriteGfx_FairyLockChains[] = INCBIN_U32("graphics/battle_anims/sprites/fairy_lock_chains.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_FairyLockChains[] = INCBIN_U32("graphics/battle_anims/sprites/fairy_lock_chains.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Fishies[] = INCBIN_U32("graphics/battle_anims/sprites/fishies.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Fishies[] = INCBIN_U32("graphics/battle_anims/sprites/fishies.4bpp.smol"); const u16 gBattleAnimSpritePal_Fishies[] = INCBIN_U16("graphics/battle_anims/sprites/fishies.gbapal"); -const u32 gBattleAnimSpriteGfx_NewFly[] = INCBIN_U32("graphics/battle_anims/sprites/fly.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewFly[] = INCBIN_U32("graphics/battle_anims/sprites/fly.4bpp.smol"); const u16 gBattleAnimSpritePal_NewFly[] = INCBIN_U16("graphics/battle_anims/sprites/fly.gbapal"); const u16 gBattleAnimSpritePal_FusionFlare[] = INCBIN_U16("graphics/battle_anims/sprites/fusion_flare.gbapal"); const u16 gBattleAnimSpritePal_GarbagePoisonPillar[] = INCBIN_U16("graphics/battle_anims/sprites/garbage_poison_column.gbapal"); -const u32 gBattleAnimSpriteGfx_Gear[] = INCBIN_U32("graphics/battle_anims/sprites/gear.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Gear[] = INCBIN_U32("graphics/battle_anims/sprites/gear.4bpp.smol"); const u16 gBattleAnimSpritePal_Gear[] = INCBIN_U16("graphics/battle_anims/sprites/gear.gbapal"); -const u32 gBattleAnimSpriteGfx_GigavoltHavocSpear[] = INCBIN_U32("graphics/battle_anims/sprites/gigavolt_havoc_spear.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GigavoltHavocSpear[] = INCBIN_U32("graphics/battle_anims/sprites/gigavolt_havoc_spear.4bpp.smol"); const u16 gBattleAnimSpritePal_GigavoltHavocSpear[] = INCBIN_U16("graphics/battle_anims/sprites/gigavolt_havoc_spear.gbapal"); -const u32 gBattleAnimSpriteGfx_GoldenApple[] = INCBIN_U32("graphics/battle_anims/sprites/golden_apple.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GoldenApple[] = INCBIN_U32("graphics/battle_anims/sprites/golden_apple.4bpp.smol"); const u16 gBattleAnimSpritePal_GoldenApple[] = INCBIN_U16("graphics/battle_anims/sprites/golden_apple.gbapal"); const u16 gBattleAnimSpritePal_GreenDrake[] = INCBIN_U16("graphics/battle_anims/sprites/green_drake.gbapal"); -const u32 gBattleAnimSpriteGfx_NewGreenStar[] = INCBIN_U32("graphics/battle_anims/sprites/green_star_new.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewGreenStar[] = INCBIN_U32("graphics/battle_anims/sprites/green_star_new.4bpp.smol"); const u16 gBattleAnimSpritePal_NewGreenStar[] = INCBIN_U16("graphics/battle_anims/sprites/green_star_new.gbapal"); -const u32 gBattleAnimSpriteGfx_HeartStamp[] = INCBIN_U32("graphics/battle_anims/sprites/heart_stamp.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HeartStamp[] = INCBIN_U32("graphics/battle_anims/sprites/heart_stamp.4bpp.smol"); const u16 gBattleAnimSpritePal_HeartStamp[] = INCBIN_U16("graphics/battle_anims/sprites/heart_stamp.gbapal"); -const u32 gBattleAnimSpriteGfx_ZygardeHexes[] = INCBIN_U32("graphics/battle_anims/sprites/hexes.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ZygardeHexes[] = INCBIN_U32("graphics/battle_anims/sprites/hexes.4bpp.smol"); const u16 gBattleAnimSpritePal_ZygardeHexes[] = INCBIN_U16("graphics/battle_anims/sprites/hexes.gbapal"); -const u32 gBattleAnimSpriteGfx_HoopaHand[] = INCBIN_U32("graphics/battle_anims/sprites/hoopa_hand.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HoopaHand[] = INCBIN_U32("graphics/battle_anims/sprites/hoopa_hand.4bpp.smol"); const u16 gBattleAnimSpritePal_HoopaHand[] = INCBIN_U16("graphics/battle_anims/sprites/hoopa_hand.gbapal"); -const u32 gBattleAnimSpriteGfx_HoopaRing[] = INCBIN_U32("graphics/battle_anims/sprites/hoopa_ring.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HoopaRing[] = INCBIN_U32("graphics/battle_anims/sprites/hoopa_ring.4bpp.smol"); const u16 gBattleAnimSpritePal_HoopaRing[] = INCBIN_U16("graphics/battle_anims/sprites/hoopa_ring.gbapal"); -const u32 gBattleAnimSpriteGfx_NewHornHit[] = INCBIN_U32("graphics/battle_anims/sprites/horn_hit_new.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewHornHit[] = INCBIN_U32("graphics/battle_anims/sprites/horn_hit_new.4bpp.smol"); const u16 gBattleAnimSpritePal_NewHornHit[] = INCBIN_U16("graphics/battle_anims/sprites/horn_hit_new.gbapal"); -const u32 gBattleAnimSpriteGfx_HornLeech[] = INCBIN_U32("graphics/battle_anims/sprites/horn_leech.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HornLeech[] = INCBIN_U32("graphics/battle_anims/sprites/horn_leech.4bpp.smol"); const u16 gBattleAnimSpritePal_HornLeech[] = INCBIN_U16("graphics/battle_anims/sprites/horn_leech.gbapal"); -const u32 gBattleAnimSpriteGfx_HorseshoeFist[] = INCBIN_U32("graphics/battle_anims/sprites/horseshoe_fist.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HorseshoeFist[] = INCBIN_U32("graphics/battle_anims/sprites/horseshoe_fist.4bpp.smol"); const u16 gBattleAnimSpritePal_HorseshoeFist[] = INCBIN_U16("graphics/battle_anims/sprites/horseshoe_fist.gbapal"); -const u32 gBattleAnimSpriteGfx_HydroPump[] = INCBIN_U32("graphics/battle_anims/sprites/hydro_pump.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HydroPump[] = INCBIN_U32("graphics/battle_anims/sprites/hydro_pump.4bpp.smol"); const u16 gBattleAnimSpritePal_HydroPump[] = INCBIN_U16("graphics/battle_anims/sprites/hydro_pump.gbapal"); -const u32 gBattleAnimSpriteGfx_IceRock[] = INCBIN_U32("graphics/battle_anims/sprites/ice_rock.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_IceRock[] = INCBIN_U32("graphics/battle_anims/sprites/ice_rock.4bpp.smol"); const u16 gBattleAnimSpritePal_IceRock[] = INCBIN_U16("graphics/battle_anims/sprites/ice_rock.gbapal"); -const u32 gBattleAnimSpriteGfx_LargeSpike[] = INCBIN_U32("graphics/battle_anims/sprites/large_spike.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_LargeSpike[] = INCBIN_U32("graphics/battle_anims/sprites/large_spike.4bpp.smol"); const u16 gBattleAnimSpritePal_LargeSpike[] = INCBIN_U16("graphics/battle_anims/sprites/large_spike.gbapal"); -const u32 gBattleAnimSpriteGfx_NewLeaf[] = INCBIN_U32("graphics/battle_anims/sprites/leaves.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewLeaf[] = INCBIN_U32("graphics/battle_anims/sprites/leaves.4bpp.smol"); const u16 gBattleAnimSpritePal_NewLeaf[] = INCBIN_U16("graphics/battle_anims/sprites/leaves.gbapal"); -const u32 gBattleAnimSpriteGfx_NewLeechSeed[] = INCBIN_U32("graphics/battle_anims/sprites/leech_seed.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewLeechSeed[] = INCBIN_U32("graphics/battle_anims/sprites/leech_seed.4bpp.smol"); const u16 gBattleAnimSpritePal_NewLeechSeed[] = INCBIN_U16("graphics/battle_anims/sprites/leech_seed.gbapal"); -const u32 gBattleAnimSpriteGfx_LightningRain[] = INCBIN_U32("graphics/battle_anims/sprites/lightning_rain.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_LightningRain[] = INCBIN_U32("graphics/battle_anims/sprites/lightning_rain.4bpp.smol"); const u16 gBattleAnimSpritePal_LightningRain[] = INCBIN_U16("graphics/battle_anims/sprites/lightning_rain.gbapal"); -const u32 gBattleAnimSpriteGfx_NewEye[] = INCBIN_U32("graphics/battle_anims/sprites/mean_look.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewEye[] = INCBIN_U32("graphics/battle_anims/sprites/mean_look.4bpp.smol"); const u16 gBattleAnimSpritePal_NewEye[] = INCBIN_U16("graphics/battle_anims/sprites/mean_look.gbapal"); -const u32 gBattleAnimSpriteGfx_MetalBits[] = INCBIN_U32("graphics/battle_anims/sprites/metal_bits.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MetalBits[] = INCBIN_U32("graphics/battle_anims/sprites/metal_bits.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_MudBomb[] = INCBIN_U32("graphics/battle_anims/sprites/mud_bomb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MudBomb[] = INCBIN_U32("graphics/battle_anims/sprites/mud_bomb.4bpp.smol"); const u16 gBattleAnimSpritePal_MudBomb[] = INCBIN_U16("graphics/battle_anims/sprites/mud_bomb.gbapal"); -const u32 gBattleAnimSpriteGfx_Mushroom[] = INCBIN_U32("graphics/battle_anims/sprites/mushroom.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Mushroom[] = INCBIN_U32("graphics/battle_anims/sprites/mushroom.4bpp.smol"); const u16 gBattleAnimSpritePal_Mushroom[] = INCBIN_U16("graphics/battle_anims/sprites/mushroom.gbapal"); const u16 gBattleAnimSpritePal_NaturalGiftRing[] = INCBIN_U16("graphics/battle_anims/sprites/natural_gift_ring.gbapal"); -const u32 gBattleAnimSpriteGfx_NecrozmaStar[] = INCBIN_U32("graphics/battle_anims/sprites/necrozma_star.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NecrozmaStar[] = INCBIN_U32("graphics/battle_anims/sprites/necrozma_star.4bpp.smol"); const u16 gBattleAnimSpritePal_NecrozmaStar[] = INCBIN_U16("graphics/battle_anims/sprites/necrozma_star.gbapal"); const u16 gBattleAnimSpritePal_NewImpact[] = INCBIN_U16("graphics/battle_anims/sprites/impact_new.gbapal"); -const u32 gBattleAnimSpriteGfx_Obstruct[] = INCBIN_U32("graphics/battle_anims/sprites/obstruct.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Obstruct[] = INCBIN_U32("graphics/battle_anims/sprites/obstruct.4bpp.smol"); const u16 gBattleAnimSpritePal_Obstruct[] = INCBIN_U16("graphics/battle_anims/sprites/obstruct.gbapal"); -const u32 gBattleAnimSpriteGfx_OmegaStone[] = INCBIN_U32("graphics/battle_anims/sprites/omega_stone.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_OmegaStone[] = INCBIN_U32("graphics/battle_anims/sprites/omega_stone.4bpp.smol"); const u16 gBattleAnimSpritePal_OmegaStone[] = INCBIN_U16("graphics/battle_anims/sprites/omega_stone.gbapal"); -const u32 gBattleAnimSpriteGfx_PinkDiamond[] = INCBIN_U32("graphics/battle_anims/sprites/pink_diamond.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PinkDiamond[] = INCBIN_U32("graphics/battle_anims/sprites/pink_diamond.4bpp.smol"); const u16 gBattleAnimSpritePal_PinkDiamond[] = INCBIN_U16("graphics/battle_anims/sprites/pink_diamond.gbapal"); -const u32 gBattleAnimSpriteGfx_PoisonColumn[] = INCBIN_U32("graphics/battle_anims/sprites/poison_column.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PoisonColumn[] = INCBIN_U32("graphics/battle_anims/sprites/poison_column.4bpp.smol"); const u16 gBattleAnimSpritePal_PoisonColumn[] = INCBIN_U16("graphics/battle_anims/sprites/poison_column.gbapal"); -const u32 gBattleAnimSpriteGfx_PowerTrick[] = INCBIN_U32("graphics/battle_anims/sprites/power_trick.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PowerTrick[] = INCBIN_U32("graphics/battle_anims/sprites/power_trick.4bpp.smol"); const u16 gBattleAnimSpritePal_PowerTrick[] = INCBIN_U16("graphics/battle_anims/sprites/power_trick.gbapal"); -const u32 gBattleAnimSpriteGfx_PurpleChain[] = INCBIN_U32("graphics/battle_anims/sprites/purple_chain.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PurpleChain[] = INCBIN_U32("graphics/battle_anims/sprites/purple_chain.4bpp.smol"); const u16 gBattleAnimSpritePal_PurpleChain[] = INCBIN_U16("graphics/battle_anims/sprites/purple_chain.gbapal"); -const u32 gBattleAnimSpriteGfx_PurpleDrake[] = INCBIN_U32("graphics/battle_anims/sprites/purple_drake.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PurpleDrake[] = INCBIN_U32("graphics/battle_anims/sprites/purple_drake.4bpp.smol"); const u16 gBattleAnimSpritePal_PurpleDrake[] = INCBIN_U16("graphics/battle_anims/sprites/purple_drake.gbapal"); -const u32 gBattleAnimSpriteGfx_RazorShell[] = INCBIN_U32("graphics/battle_anims/sprites/razor_shell.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RazorShell[] = INCBIN_U32("graphics/battle_anims/sprites/razor_shell.4bpp.smol"); const u16 gBattleAnimSpritePal_RazorShell[] = INCBIN_U16("graphics/battle_anims/sprites/razor_shell.gbapal"); -const u32 gBattleAnimSpriteGfx_RedExplosion[] = INCBIN_U32("graphics/battle_anims/sprites/red_explosion.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RedExplosion[] = INCBIN_U32("graphics/battle_anims/sprites/red_explosion.4bpp.smol"); const u16 gBattleAnimSpritePal_RedExplosion[] = INCBIN_U16("graphics/battle_anims/sprites/red_explosion.gbapal"); -const u32 gBattleAnimSpriteGfx_RocksSmall[] = INCBIN_U32("graphics/battle_anims/sprites/rock_small.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RocksSmall[] = INCBIN_U32("graphics/battle_anims/sprites/rock_small.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_NewRocks[] = INCBIN_U32("graphics/battle_anims/sprites/rocks_new.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewRocks[] = INCBIN_U32("graphics/battle_anims/sprites/rocks_new.4bpp.smol"); const u16 gBattleAnimSpritePal_NewRocks[] = INCBIN_U16("graphics/battle_anims/sprites/rocks_new.gbapal"); -const u32 gBattleAnimSpriteGfx_ShellLeft[] = INCBIN_U32("graphics/battle_anims/sprites/shell_left.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ShellLeft[] = INCBIN_U32("graphics/battle_anims/sprites/shell_left.4bpp.smol"); const u16 gBattleAnimSpritePal_ShellLeft[] = INCBIN_U16("graphics/battle_anims/sprites/shell_left.gbapal"); -const u32 gBattleAnimSpriteGfx_ShellRight[] = INCBIN_U32("graphics/battle_anims/sprites/shell_right.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ShellRight[] = INCBIN_U32("graphics/battle_anims/sprites/shell_right.4bpp.smol"); const u16 gBattleAnimSpritePal_SpacialRendSlices[] = INCBIN_U16("graphics/battle_anims/sprites/spacial_rend_slices.gbapal"); -const u32 gBattleAnimSpriteGfx_NewSpikes[] = INCBIN_U32("graphics/battle_anims/sprites/spikes_new.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewSpikes[] = INCBIN_U32("graphics/battle_anims/sprites/spikes_new.4bpp.smol"); const u16 gBattleAnimSpritePal_NewSpikes[] = INCBIN_U16("graphics/battle_anims/sprites/spikes_new.gbapal"); -const u32 gBattleAnimSpriteGfx_SpiritShackleArrow[] = INCBIN_U32("graphics/battle_anims/sprites/spirit_shackle_arrow.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SpiritShackleArrow[] = INCBIN_U32("graphics/battle_anims/sprites/spirit_shackle_arrow.4bpp.smol"); const u16 gBattleAnimSpritePal_SpiritShackleArrow[] = INCBIN_U16("graphics/battle_anims/sprites/spirit_shackle_arrow.gbapal"); -const u32 gBattleAnimSpriteGfx_SteamEruption[] = INCBIN_U32("graphics/battle_anims/sprites/steam_eruption.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SteamEruption[] = INCBIN_U32("graphics/battle_anims/sprites/steam_eruption.4bpp.smol"); const u16 gBattleAnimSpritePal_SteamEruption[] = INCBIN_U16("graphics/battle_anims/sprites/steam_eruption.gbapal"); -const u32 gBattleAnimSpriteGfx_Steamroller[] = INCBIN_U32("graphics/battle_anims/sprites/steamroller.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Steamroller[] = INCBIN_U32("graphics/battle_anims/sprites/steamroller.4bpp.smol"); const u16 gBattleAnimSpritePal_Steamroller[] = INCBIN_U16("graphics/battle_anims/sprites/steamroller.gbapal"); -const u32 gBattleAnimSpriteGfx_StonePillar[] = INCBIN_U32("graphics/battle_anims/sprites/stone_pillar.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_StonePillar[] = INCBIN_U32("graphics/battle_anims/sprites/stone_pillar.4bpp.smol"); const u16 gBattleAnimSpritePal_StonePillar[] = INCBIN_U16("graphics/battle_anims/sprites/stone_pillar.gbapal"); const u16 gBattleAnimSpritePal_Poltergeist[] = INCBIN_U16("graphics/battle_anims/sprites/poltergeist.gbapal"); const u16 gBattleAnimSpritePal_SteelBeam[] = INCBIN_U16("graphics/battle_anims/sprites/steel_beam.gbapal"); -const u32 gBattleAnimSpriteGfx_StraightBeam[] = INCBIN_U32("graphics/battle_anims/sprites/straight_beam.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_StraightBeam[] = INCBIN_U32("graphics/battle_anims/sprites/straight_beam.4bpp.smol"); const u16 gBattleAnimSpritePal_StraightBeam[] = INCBIN_U16("graphics/battle_anims/sprites/straight_beam.gbapal"); const u16 gBattleAnimSpritePal_NewSurf[] = INCBIN_U16("graphics/battle_anims/sprites/surf_new.gbapal"); -const u32 gBattleAnimSpriteGfx_NewSword[] = INCBIN_U32("graphics/battle_anims/sprites/sword_new.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewSword[] = INCBIN_U32("graphics/battle_anims/sprites/sword_new.4bpp.smol"); const u16 gBattleAnimSpritePal_NewSword[] = INCBIN_U16("graphics/battle_anims/sprites/sword_new.gbapal"); -const u32 gBattleAnimSpriteGfx_NewTeeth[] = INCBIN_U32("graphics/battle_anims/sprites/teeth_new.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewTeeth[] = INCBIN_U32("graphics/battle_anims/sprites/teeth_new.4bpp.smol"); const u16 gBattleAnimSpritePal_NewTeeth[] = INCBIN_U16("graphics/battle_anims/sprites/teeth_new.gbapal"); -const u32 gBattleAnimSpriteGfx_NewHandsAndFeet[] = INCBIN_U32("graphics/battle_anims/sprites/hands_and_feet_new.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewHandsAndFeet[] = INCBIN_U32("graphics/battle_anims/sprites/hands_and_feet_new.4bpp.smol"); const u16 gBattleAnimSpritePal_NewHandsAndFeet[] = INCBIN_U16("graphics/battle_anims/sprites/hands_and_feet_new.gbapal"); -const u32 gBattleAnimSpriteGfx_Tornado[] = INCBIN_U32("graphics/battle_anims/sprites/tornado.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Tornado[] = INCBIN_U32("graphics/battle_anims/sprites/tornado.4bpp.smol"); const u16 gBattleAnimSpritePal_Tornado[] = INCBIN_U16("graphics/battle_anims/sprites/tornado.gbapal"); -const u32 gBattleAnimSpriteGfx_ZMoveSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/z_move_symbol.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ZMoveSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/z_move_symbol.4bpp.smol"); const u16 gBattleAnimSpritePal_ZMoveSymbol[] = INCBIN_U16("graphics/battle_anims/sprites/z_move_symbol.gbapal"); -const u32 gBattleAnimSpriteGfx_Teapot[] = INCBIN_U32("graphics/battle_anims/sprites/new/teapot.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Teapot[] = INCBIN_U32("graphics/battle_anims/sprites/new/teapot.4bpp.smol"); const u16 gBattleAnimSpritePal_Teapot[] = INCBIN_U16("graphics/battle_anims/sprites/new/teapot.gbapal"); // Battle anims -const u32 gBattleAnimSpriteGfx_Bubble[] = INCBIN_U32("graphics/battle_anims/sprites/bubble.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Bone[] = INCBIN_U32("graphics/battle_anims/sprites/bone.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_AirWave[] = INCBIN_U32("graphics/battle_anims/sprites/air_wave.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Orb[] = INCBIN_U32("graphics/battle_anims/sprites/orb.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Sword[] = INCBIN_U32("graphics/battle_anims/sprites/sword.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Seed[] = INCBIN_U32("graphics/battle_anims/sprites/seed.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_SeedBrown[] = INCBIN_U32("graphics/battle_anims/sprites/seed_new.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Bubble[] = INCBIN_U32("graphics/battle_anims/sprites/bubble.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Bone[] = INCBIN_U32("graphics/battle_anims/sprites/bone.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_AirWave[] = INCBIN_U32("graphics/battle_anims/sprites/air_wave.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Orb[] = INCBIN_U32("graphics/battle_anims/sprites/orb.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Sword[] = INCBIN_U32("graphics/battle_anims/sprites/sword.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Seed[] = INCBIN_U32("graphics/battle_anims/sprites/seed.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_SeedBrown[] = INCBIN_U32("graphics/battle_anims/sprites/seed_new.4bpp.smol"); const u16 gBattleAnimSpritePal_RainDrops[] = INCBIN_U16("graphics/battle_anims/sprites/rain_drops.gbapal"); const u16 gBattleAnimSpritePal_Bone[] = INCBIN_U16("graphics/battle_anims/sprites/bone.gbapal"); @@ -323,162 +326,162 @@ const u16 gBattleAnimSpritePal_Sword[] = INCBIN_U16("graphics/battle_anims/sprit const u16 gBattleAnimSpritePal_Seed[] = INCBIN_U16("graphics/battle_anims/sprites/seed.gbapal"); const u16 gBattleAnimSpritePal_SeedBrown[] = INCBIN_U16("graphics/battle_anims/sprites/seed_new.gbapal"); -const u32 gBattleAnimSpriteGfx_Needle[] = INCBIN_U32("graphics/battle_anims/sprites/needle.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Needle[] = INCBIN_U32("graphics/battle_anims/sprites/needle.4bpp.smol"); const u16 gBattleAnimSpritePal_Needle[] = INCBIN_U16("graphics/battle_anims/sprites/needle.gbapal"); -const u32 gBattleAnimSpriteGfx_Explosion6[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_6.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Explosion6[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_6.4bpp.smol"); const u16 gBattleAnimSpritePal_Explosion6[] = INCBIN_U16("graphics/battle_anims/sprites/explosion_6.gbapal"); -const u32 gBattleAnimSpriteGfx_PinkOrb[] = INCBIN_U32("graphics/battle_anims/sprites/pink_orb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PinkOrb[] = INCBIN_U32("graphics/battle_anims/sprites/pink_orb.4bpp.smol"); const u16 gBattleAnimSpritePal_PinkOrb[] = INCBIN_U16("graphics/battle_anims/sprites/pink_orb.gbapal"); const u16 gBattleAnimSpritePal_IceCube[] = INCBIN_U16("graphics/battle_anims/sprites/ice_cube.gbapal"); -const u32 gBattleAnimSpriteGfx_IceCube[] = INCBIN_U32("graphics/battle_anims/sprites/ice_cube.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_IceCube[] = INCBIN_U32("graphics/battle_anims/sprites/ice_cube.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Gust[] = INCBIN_U32("graphics/battle_anims/sprites/gust.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Gust[] = INCBIN_U32("graphics/battle_anims/sprites/gust.4bpp.smol"); const u16 gBattleAnimSpritePal_Gust[] = INCBIN_U16("graphics/battle_anims/sprites/gust.gbapal"); -const u32 gBattleAnimSpriteGfx_Spark2[] = INCBIN_U32("graphics/battle_anims/sprites/spark_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Spark2[] = INCBIN_U32("graphics/battle_anims/sprites/spark_2.4bpp.smol"); const u16 gBattleAnimSpritePal_Spark2[] = INCBIN_U16("graphics/battle_anims/sprites/spark_2.gbapal"); -const u32 gBattleAnimSpriteGfx_Orange[] = INCBIN_U32("graphics/battle_anims/sprites/orange.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Orange[] = INCBIN_U32("graphics/battle_anims/sprites/orange.4bpp.smol"); const u16 gBattleAnimSpritePal_Orange[] = INCBIN_U16("graphics/battle_anims/sprites/orange.gbapal"); -const u32 gBattleAnimSpriteGfx_Spikes[] = INCBIN_U32("graphics/battle_anims/sprites/spikes.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Spikes[] = INCBIN_U32("graphics/battle_anims/sprites/spikes.4bpp.smol"); const u16 gBattleAnimSpritePal_Spikes[] = INCBIN_U16("graphics/battle_anims/sprites/spikes.gbapal"); -const u32 gBattleAnimSpriteGfx_YellowBall[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_ball.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_YellowBall[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_ball.4bpp.smol"); const u16 gBattleAnimSpritePal_YellowBall[] = INCBIN_U16("graphics/battle_anims/sprites/yellow_ball.gbapal"); -const u32 gBattleAnimSpriteGfx_TiedBag[] = INCBIN_U32("graphics/battle_anims/sprites/tied_bag.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_TiedBag[] = INCBIN_U32("graphics/battle_anims/sprites/tied_bag.4bpp.smol"); const u16 gBattleAnimSpritePal_TiedBag[] = INCBIN_U16("graphics/battle_anims/sprites/tied_bag.gbapal"); -const u32 gBattleAnimSpriteGfx_BlackSmoke[] = INCBIN_U32("graphics/battle_anims/sprites/black_smoke.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BlackSmoke[] = INCBIN_U32("graphics/battle_anims/sprites/black_smoke.4bpp.smol"); const u16 gBattleAnimSpritePal_BlackSmoke[] = INCBIN_U16("graphics/battle_anims/sprites/black_smoke.gbapal"); -const u32 gBattleAnimSpriteGfx_BlackBall[] = INCBIN_U32("graphics/battle_anims/sprites/black_ball.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BlackBall[] = INCBIN_U32("graphics/battle_anims/sprites/black_ball.4bpp.smol"); const u16 gBattleAnimSpritePal_BlackBall[] = INCBIN_U16("graphics/battle_anims/sprites/black_ball.gbapal"); const u16 gBattleAnimSpritePal_Glass[] = INCBIN_U16("graphics/battle_anims/sprites/glass.gbapal"); -const u32 gBattleAnimSpriteGfx_Glass[] = INCBIN_U32("graphics/battle_anims/sprites/glass.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Glass[] = INCBIN_U32("graphics/battle_anims/sprites/glass.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_HornHit[] = INCBIN_U32("graphics/battle_anims/sprites/horn_hit.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HornHit[] = INCBIN_U32("graphics/battle_anims/sprites/horn_hit.4bpp.smol"); const u16 gBattleAnimSpritePal_HornHit[] = INCBIN_U16("graphics/battle_anims/sprites/horn_hit.gbapal"); const u16 gBattleAnimSpritePal_BlueShards[] = INCBIN_U16("graphics/battle_anims/sprites/blue_shards.gbapal"); -const u32 gBattleAnimSpriteGfx_BlueShards[] = INCBIN_U32("graphics/battle_anims/sprites/blue_shards.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BlueShards[] = INCBIN_U32("graphics/battle_anims/sprites/blue_shards.4bpp.smol"); const u16 gBattleAnimUnusedPal_MusicNotes[] = INCBIN_U16("graphics/battle_anims/unused/music_notes.gbapal"); -const u32 gBattleAnimUnusedGfx_MusicNotes[] = INCBIN_U32("graphics/battle_anims/unused/music_notes.4bpp.lz"); +const u32 gBattleAnimUnusedGfx_MusicNotes[] = INCBIN_U32("graphics/battle_anims/unused/music_notes.4bpp.smol"); const u16 gBattleAnimSpritePal_Hit[] = INCBIN_U16("graphics/battle_anims/sprites/hit.gbapal"); -const u32 gBattleAnimSpriteGfx_Hit[] = INCBIN_U32("graphics/battle_anims/sprites/hit.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Hit[] = INCBIN_U32("graphics/battle_anims/sprites/hit.4bpp.smol"); const u16 gBattleAnimSpritePal_Hit2[] = INCBIN_U16("graphics/battle_anims/sprites/hit_2.gbapal"); const u16 gBattleAnimSpritePal_WavingHand[] = INCBIN_U16("graphics/battle_anims/sprites/waving_hand.gbapal"); -const u32 gBattleAnimSpriteGfx_WavingHand[] = INCBIN_U32("graphics/battle_anims/sprites/waving_hand.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WavingHand[] = INCBIN_U32("graphics/battle_anims/sprites/waving_hand.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Feint[] = INCBIN_U32("graphics/battle_anims/sprites/feint_punch.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Feint[] = INCBIN_U32("graphics/battle_anims/sprites/feint_punch.4bpp.smol"); const u16 gBattleAnimSpritePal_Feint[] = INCBIN_U16("graphics/battle_anims/sprites/feint_punch.gbapal"); -const u32 gBattleAnimSpriteGfx_TrumpCard[] = INCBIN_U32("graphics/battle_anims/sprites/trump_cards.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_TrumpCard[] = INCBIN_U32("graphics/battle_anims/sprites/trump_cards.4bpp.smol"); const u16 gBattleAnimSpritePal_TrumpCard[] = INCBIN_U16("graphics/battle_anims/sprites/trump_cards.gbapal"); -const u32 gBattleAnimSpriteGfx_TrumpCardParticles[] = INCBIN_U32("graphics/battle_anims/sprites/trump_card_particles.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_TrumpCardParticles[] = INCBIN_U32("graphics/battle_anims/sprites/trump_card_particles.4bpp.smol"); const u16 gBattleAnimSpritePal_TrumpCardParticles[] = INCBIN_U16("graphics/battle_anims/sprites/trump_card_particles.gbapal"); -const u32 gBattleAnimSpriteGfx_Acupressure[] = INCBIN_U32("graphics/battle_anims/sprites/acupressure.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Acupressure[] = INCBIN_U32("graphics/battle_anims/sprites/acupressure.4bpp.smol"); const u16 gBattleAnimSpritePal_Acupressure[] = INCBIN_U16("graphics/battle_anims/sprites/acupressure.gbapal"); -const u32 gBattleAnimSpriteGfx_WringOut[] = INCBIN_U32("graphics/battle_anims/sprites/wring_out.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WringOut[] = INCBIN_U32("graphics/battle_anims/sprites/wring_out.4bpp.smol"); const u16 gBattleAnimSpritePal_WringOut[] = INCBIN_U16("graphics/battle_anims/sprites/wring_out.gbapal"); -const u32 gBattleAnimSpriteGfx_ClosingEye[] = INCBIN_U32("graphics/battle_anims/sprites/closing_eye.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ClosingEye[] = INCBIN_U32("graphics/battle_anims/sprites/closing_eye.4bpp.smol"); const u16 gBattleAnimSpritePal_ClosingEye[] = INCBIN_U16("graphics/battle_anims/sprites/closing_eye.gbapal"); -const u32 gBattleAnimSpriteGfx_BlueStar[] = INCBIN_U32("graphics/battle_anims/sprites/blue_star.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BlueStar[] = INCBIN_U32("graphics/battle_anims/sprites/blue_star.4bpp.smol"); const u16 gBattleAnimSpritePal_BlueStar[] = INCBIN_U16("graphics/battle_anims/sprites/blue_star.gbapal"); const u16 gBattleAnimSpritePal_BubbleBurst[] = INCBIN_U16("graphics/battle_anims/sprites/bubble_burst.gbapal"); -const u32 gBattleAnimSpriteGfx_BubbleBurst[] = INCBIN_U32("graphics/battle_anims/sprites/bubble_burst.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BubbleBurst[] = INCBIN_U32("graphics/battle_anims/sprites/bubble_burst.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_HitDuplicate[] = INCBIN_U32("graphics/battle_anims/sprites/hit_duplicate.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HitDuplicate[] = INCBIN_U32("graphics/battle_anims/sprites/hit_duplicate.4bpp.smol"); const u16 gBattleAnimSpritePal_HitDuplicate[] = INCBIN_U16("graphics/battle_anims/sprites/hit_duplicate.gbapal"); const u16 gBattleAnimSpritePal_Leer[] = INCBIN_U16("graphics/battle_anims/sprites/leer.gbapal"); -const u32 gBattleAnimSpriteGfx_Leer[] = INCBIN_U32("graphics/battle_anims/sprites/leer.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Leer[] = INCBIN_U32("graphics/battle_anims/sprites/leer.4bpp.smol"); const u16 gBattleAnimSpritePal_BlueBurst[] = INCBIN_U16("graphics/battle_anims/sprites/blue_burst.gbapal"); -const u32 gBattleAnimSpriteGfx_BlueBurst[] = INCBIN_U32("graphics/battle_anims/sprites/blue_burst.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BlueBurst[] = INCBIN_U32("graphics/battle_anims/sprites/blue_burst.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_SmallEmber[] = INCBIN_U32("graphics/battle_anims/sprites/small_ember.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SmallEmber[] = INCBIN_U32("graphics/battle_anims/sprites/small_ember.4bpp.smol"); const u16 gBattleAnimSpritePal_SmallEmber[] = INCBIN_U16("graphics/battle_anims/sprites/small_ember.gbapal"); -const u32 gBattleAnimSpriteGfx_GraySmoke[] = INCBIN_U32("graphics/battle_anims/sprites/gray_smoke.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GraySmoke[] = INCBIN_U32("graphics/battle_anims/sprites/gray_smoke.4bpp.smol"); const u16 gBattleAnimSpritePal_GraySmoke[] = INCBIN_U16("graphics/battle_anims/sprites/gray_smoke.gbapal"); const u16 gBattleAnimSpritePal_Fire[] = INCBIN_U16("graphics/battle_anims/sprites/fire.gbapal"); -const u32 gBattleAnimSpriteGfx_Fire[] = INCBIN_U32("graphics/battle_anims/sprites/fire.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Fire[] = INCBIN_U32("graphics/battle_anims/sprites/fire.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_SpinningFire[] = INCBIN_U32("graphics/battle_anims/sprites/spinning_fire.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_FirePlume[] = INCBIN_U32("graphics/battle_anims/sprites/fire_plume.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SpinningFire[] = INCBIN_U32("graphics/battle_anims/sprites/spinning_fire.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_FirePlume[] = INCBIN_U32("graphics/battle_anims/sprites/fire_plume.4bpp.smol"); const u16 gBattleAnimSpritePal_Lightning2[] = INCBIN_U16("graphics/battle_anims/sprites/lightning_2.gbapal"); -const u32 gBattleAnimSpriteGfx_Lightning2[] = INCBIN_U32("graphics/battle_anims/sprites/lightning_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Lightning2[] = INCBIN_U32("graphics/battle_anims/sprites/lightning_2.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Lightning[] = INCBIN_U32("graphics/battle_anims/sprites/lightning.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Lightning[] = INCBIN_U32("graphics/battle_anims/sprites/lightning.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_ColoredOrbs[] = INCBIN_U32("graphics/battle_anims/sprites/colored_orbs.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ColoredOrbs[] = INCBIN_U32("graphics/battle_anims/sprites/colored_orbs.4bpp.smol"); const u16 gBattleAnimSpritePal_ColoredOrbs[] = INCBIN_U16("graphics/battle_anims/sprites/colored_orbs.gbapal"); -const u32 gBattleAnimSpriteGfx_WorrySeed[] = INCBIN_U32("graphics/battle_anims/sprites/worry_seed.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WorrySeed[] = INCBIN_U32("graphics/battle_anims/sprites/worry_seed.4bpp.smol"); const u16 gBattleAnimSpritePal_WorrySeed[] = INCBIN_U16("graphics/battle_anims/sprites/worry_seed.gbapal"); -const u32 gBattleAnimSpriteGfx_SmallCloud[] = INCBIN_U32("graphics/battle_anims/sprites/small_cloud.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SmallCloud[] = INCBIN_U32("graphics/battle_anims/sprites/small_cloud.4bpp.smol"); const u16 gBattleAnimSpritePal_SmallCloud[] = INCBIN_U16("graphics/battle_anims/sprites/small_cloud.gbapal"); -const u32 gBattleAnimSpriteGfx_AttackOrder[] = INCBIN_U32("graphics/battle_anims/sprites/attack_order.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_AttackOrder[] = INCBIN_U32("graphics/battle_anims/sprites/attack_order.4bpp.smol"); const u16 gBattleAnimSpritePal_AttackOrder[] = INCBIN_U16("graphics/battle_anims/sprites/attack_order.gbapal"); -const u32 gBattleAnimSpriteGfx_DragonPulse[] = INCBIN_U32("graphics/battle_anims/sprites/dragon_pulse.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_DragonPulse[] = INCBIN_U32("graphics/battle_anims/sprites/dragon_pulse.4bpp.smol"); const u16 gBattleAnimSpritePal_DragonPulse[] = INCBIN_U16("graphics/battle_anims/sprites/dragon_pulse.gbapal"); -const u32 gBattleAnimSpriteGfx_WoodHammer[] = INCBIN_U32("graphics/battle_anims/sprites/wood_hammer.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WoodHammer[] = INCBIN_U32("graphics/battle_anims/sprites/wood_hammer.4bpp.smol"); const u16 gBattleAnimSpritePal_WoodHammer[] = INCBIN_U16("graphics/battle_anims/sprites/wood_hammer.gbapal"); -const u32 gBattleAnimSpriteGfx_PsychoCut[] = INCBIN_U32("graphics/battle_anims/sprites/psycho_cut.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PsychoCut[] = INCBIN_U32("graphics/battle_anims/sprites/psycho_cut.4bpp.smol"); const u16 gBattleAnimSpritePal_PsychoCut[] = INCBIN_U16("graphics/battle_anims/sprites/psycho_cut.gbapal"); -const u32 gBattleAnimSpriteGfx_PowerGem[] = INCBIN_U32("graphics/battle_anims/sprites/power_gem.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PowerGem[] = INCBIN_U32("graphics/battle_anims/sprites/power_gem.4bpp.smol"); const u16 gBattleAnimSpritePal_PowerGem[] = INCBIN_U16("graphics/battle_anims/sprites/power_gem.gbapal"); -const u32 gBattleAnimSpriteGfx_StoneEdge[] = INCBIN_U32("graphics/battle_anims/sprites/stone_edge.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_StoneEdge[] = INCBIN_U32("graphics/battle_anims/sprites/stone_edge.4bpp.smol"); const u16 gBattleAnimSpritePal_StoneEdge[] = INCBIN_U16("graphics/battle_anims/sprites/stone_edge.gbapal"); -const u32 gBattleAnimSpriteGfx_StealthRock[] = INCBIN_U32("graphics/battle_anims/sprites/stealth_rock.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_StealthRock[] = INCBIN_U32("graphics/battle_anims/sprites/stealth_rock.4bpp.smol"); const u16 gBattleAnimSpritePal_StealthRock[] = INCBIN_U16("graphics/battle_anims/sprites/stealth_rock.gbapal"); -const u32 gBattleAnimSpriteGfx_PoisonJab[] = INCBIN_U32("graphics/battle_anims/sprites/poison_jab.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PoisonJab[] = INCBIN_U32("graphics/battle_anims/sprites/poison_jab.4bpp.smol"); const u16 gBattleAnimSpritePal_PoisonJab[] = INCBIN_U16("graphics/battle_anims/sprites/poison_jab.gbapal"); -const u32 gBattleAnimSpriteGfx_SpinningBall[] = INCBIN_U32("graphics/battle_anims/unused/spinning_ball.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SpinningBall[] = INCBIN_U32("graphics/battle_anims/unused/spinning_ball.4bpp.smol"); const u16 gBattleAnimSpritePal_SpinningBall[] = INCBIN_U16("graphics/battle_anims/unused/spinning_ball.gbapal"); const u16 gBattleAnimSpritePal_SpinningBall2[] = INCBIN_U16("graphics/battle_anims/unused/spinning_ball_2.gbapal"); -const u32 gBattleAnimSpriteGfx_WoodHammerHammer[] = INCBIN_U32("graphics/battle_anims/sprites/wood_hammer_hammer.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WoodHammerHammer[] = INCBIN_U32("graphics/battle_anims/sprites/wood_hammer_hammer.4bpp.smol"); const u16 gBattleAnimSpritePal_WoodHammerHammer[] = INCBIN_U16("graphics/battle_anims/sprites/wood_hammer_hammer.gbapal"); -const u32 gBattleAnimSpriteGfx_Snowflakes[] = INCBIN_U32("graphics/battle_anims/sprites/snowflakes.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Snowflakes[] = INCBIN_U32("graphics/battle_anims/sprites/snowflakes.4bpp.smol"); const u16 gBattleAnimSpritePal_Snowflakes[] = INCBIN_U16("graphics/battle_anims/sprites/snowflakes.gbapal"); -const u32 gBattleAnimSpriteGfx_SyrupBlob[] = INCBIN_U32("graphics/battle_anims/sprites/syrup_bomb_blob.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_SyrupShell[] = INCBIN_U32("graphics/battle_anims/sprites/syrup_bomb_shell.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_SyrupSplat[] = INCBIN_U32("graphics/battle_anims/sprites/syrup_bomb_splat.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SyrupBlob[] = INCBIN_U32("graphics/battle_anims/sprites/syrup_bomb_blob.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_SyrupShell[] = INCBIN_U32("graphics/battle_anims/sprites/syrup_bomb_shell.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_SyrupSplat[] = INCBIN_U32("graphics/battle_anims/sprites/syrup_bomb_splat.4bpp.smol"); const u16 gBattleAnimSpritePal_SyrupRed[] = INCBIN_U16("graphics/battle_anims/sprites/syrup_red.gbapal"); const u16 gBattleAnimSpritePal_SyrupYellow[] = INCBIN_U16("graphics/battle_anims/sprites/syrup_yellow.gbapal"); -const u32 gBattleAnimSpriteGfx_IvyCudgel[] = INCBIN_U32("graphics/battle_anims/sprites/cudgel.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_IvyCudgel[] = INCBIN_U32("graphics/battle_anims/sprites/cudgel.4bpp.smol"); const u16 gBattleAnimSpritePal_IvyCudgelGrass[] = INCBIN_U16("graphics/pokemon/ogerpon/normal.gbapal"); const u16 gBattleAnimSpritePal_IvyCudgelFire[] = INCBIN_U16("graphics/pokemon/ogerpon/hearthflame/normal.gbapal"); const u16 gBattleAnimSpritePal_IvyCudgelRock[] = INCBIN_U16("graphics/pokemon/ogerpon/cornerstone/normal.gbapal"); @@ -486,135 +489,135 @@ const u16 gBattleAnimSpritePal_IvyCudgelWater[] = INCBIN_U16("graphics/pokemon/o // old battle interface data, unused -const u32 gOldBattleInterfaceGfx[] = INCBIN_U32("graphics/unused/obi1.4bpp.lz"); +const u32 gOldBattleInterfaceGfx[] = INCBIN_U32("graphics/unused/obi1.4bpp.smol"); const u16 gOldBattleInterfacePal_1_2_3[] = INCBIN_U16("graphics/unused/obi_palpak1.gbapal"); // palettes 1-3 const u16 gOldBattleInterfacePal4[] = INCBIN_U16("graphics/unused/old_pal4.gbapal"); // 4 is by itself const u16 gOldBattleInterfacePal_5_6_7[] = INCBIN_U16("graphics/unused/obi_palpak3.gbapal"); // palettes 5-7 -const u32 gOldBattleInterfaceGfx2[] = INCBIN_U32("graphics/unused/obi2.4bpp.lz"); -const u32 gOldBattleInterfaceTilemap[] = INCBIN_U32("graphics/unused/old_battle_interface_tilemap.bin.lz"); +const u32 gOldBattleInterfaceGfx2[] = INCBIN_U32("graphics/unused/obi2.4bpp.smol"); +const u32 gOldBattleInterfaceTilemap[] = INCBIN_U32("graphics/unused/old_battle_interface_tilemap.bin.smolTM"); const u16 gBattleAnimSpritePal_ClawSlash2[] = INCBIN_U16("graphics/battle_anims/sprites/claw_slash_2.gbapal"); const u16 gBattleAnimSpritePal_ClawSlash[] = INCBIN_U16("graphics/battle_anims/sprites/claw_slash.gbapal"); -const u32 gBattleAnimSpriteGfx_ClawSlash2[] = INCBIN_U32("graphics/battle_anims/sprites/claw_slash_2.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_ClawSlash[] = INCBIN_U32("graphics/battle_anims/sprites/claw_slash.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Scratch3[] = INCBIN_U32("graphics/battle_anims/sprites/scratch_3.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Scratch2[] = INCBIN_U32("graphics/battle_anims/sprites/scratch_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ClawSlash2[] = INCBIN_U32("graphics/battle_anims/sprites/claw_slash_2.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_ClawSlash[] = INCBIN_U32("graphics/battle_anims/sprites/claw_slash.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Scratch3[] = INCBIN_U32("graphics/battle_anims/sprites/scratch_3.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Scratch2[] = INCBIN_U32("graphics/battle_anims/sprites/scratch_2.4bpp.smol"); -const u32 gUnusedHpBar_Gfx[] = INCBIN_U32("graphics/battle_interface/hpbar_unused.4bpp.lz"); +const u32 gUnusedHpBar_Gfx[] = INCBIN_U32("graphics/battle_interface/hpbar_unused.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_BubbleBurst2[] = INCBIN_U32("graphics/battle_anims/sprites/bubble_burst_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BubbleBurst2[] = INCBIN_U32("graphics/battle_anims/sprites/bubble_burst_2.4bpp.smol"); const u16 gBattleAnimSpritePal_BubbleBurst2[] = INCBIN_U16("graphics/battle_anims/sprites/bubble_burst_2.gbapal"); -const u32 gBattleAnimSpriteGfx_IceChunk[] = INCBIN_U32("graphics/battle_anims/sprites/ice_chunk.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_IceChunk[] = INCBIN_U32("graphics/battle_anims/sprites/ice_chunk.4bpp.smol"); const u16 gBattleAnimSpritePal_IceChunk[] = INCBIN_U16("graphics/battle_anims/sprites/ice_chunk.gbapal"); const u16 gBattleAnimSpritePal_Glass2[] = INCBIN_U16("graphics/battle_anims/sprites/glass_2.gbapal"); -const u32 gBattleAnimSpriteGfx_Glass2[] = INCBIN_U32("graphics/battle_anims/sprites/glass_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Glass2[] = INCBIN_U32("graphics/battle_anims/sprites/glass_2.4bpp.smol"); const u16 gBattleAnimSpritePal_PinkHeart2[] = INCBIN_U16("graphics/battle_anims/sprites/pink_heart_2.gbapal"); -const u32 gBattleAnimSpriteGfx_PinkHeart2[] = INCBIN_U32("graphics/battle_anims/sprites/pink_heart_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PinkHeart2[] = INCBIN_U32("graphics/battle_anims/sprites/pink_heart_2.4bpp.smol"); -const u32 gBattleInterfaceGfx_UnusedWindow1[] = INCBIN_U32("graphics/battle_interface/unused_window.4bpp.lz"); +const u32 gBattleInterfaceGfx_UnusedWindow1[] = INCBIN_U32("graphics/battle_interface/unused_window.4bpp.smol"); const u16 gBattleInterfacePal_UnusedWindow1[] = INCBIN_U16("graphics/battle_interface/unused_window.gbapal"); -const u32 gBattleInterfaceGfx_BattleBar[] = INCBIN_U32("graphics/battle_interface/battle_bar.4bpp.lz"); +const u32 gBattleInterfaceGfx_BattleBar[] = INCBIN_U32("graphics/battle_interface/battle_bar.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_SapDrip[] = INCBIN_U32("graphics/battle_anims/sprites/sap_drip.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SapDrip[] = INCBIN_U32("graphics/battle_anims/sprites/sap_drip.4bpp.smol"); const u16 gBattleAnimSpritePal_SapDrip[] = INCBIN_U16("graphics/battle_anims/sprites/sap_drip.gbapal"); const u16 gBattleAnimSpritePal_SapDrip2[] = INCBIN_U16("graphics/battle_anims/sprites/sap_drip_2.gbapal"); -const u32 gBattleInterfaceGfx_UnusedWindow2[] = INCBIN_U32("graphics/battle_interface/unused_window2.4bpp.lz"); -const u32 gBattleInterfaceGfx_UnusedWindow2Bar[] = INCBIN_U32("graphics/battle_interface/unused_window2bar.4bpp.lz"); +const u32 gBattleInterfaceGfx_UnusedWindow2[] = INCBIN_U32("graphics/battle_interface/unused_window2.4bpp.smol"); +const u32 gBattleInterfaceGfx_UnusedWindow2Bar[] = INCBIN_U32("graphics/battle_interface/unused_window2bar.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Sparkle1[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_1.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Sparkle1[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_1.4bpp.smol"); const u16 gBattleAnimSpritePal_Sparkle1[] = INCBIN_U16("graphics/battle_anims/sprites/sparkle_1.gbapal"); const u16 gBattleAnimSpritePal_Sparkle2[] = INCBIN_U16("graphics/battle_anims/sprites/sparkle_2.gbapal"); const u16 gBattleAnimSpritePal_HumanoidFoot[] = INCBIN_U16("graphics/battle_anims/sprites/humanoid_foot.gbapal"); -const u32 gBattleAnimSpriteGfx_HumanoidFoot[] = INCBIN_U32("graphics/battle_anims/sprites/humanoid_foot.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_MonsterFoot[] = INCBIN_U32("graphics/battle_anims/sprites/monster_foot.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_HumanoidHand[] = INCBIN_U32("graphics/battle_anims/sprites/humanoid_hand.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HumanoidFoot[] = INCBIN_U32("graphics/battle_anims/sprites/humanoid_foot.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_MonsterFoot[] = INCBIN_U32("graphics/battle_anims/sprites/monster_foot.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_HumanoidHand[] = INCBIN_U32("graphics/battle_anims/sprites/humanoid_hand.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_LineSketch[] = INCBIN_U32("graphics/battle_anims/unused/line_sketch.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_LineSketch[] = INCBIN_U32("graphics/battle_anims/unused/line_sketch.4bpp.smol"); const u16 gBattleAnimSpritePal_LineSketch[] = INCBIN_U16("graphics/battle_anims/unused/line_sketch.gbapal"); -const u32 gBattleAnimSpriteGfx_YellowUnk[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_unk.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_YellowUnk[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_unk.4bpp.smol"); const u16 gBattleAnimSpritePal_YellowUnk[] = INCBIN_U16("graphics/battle_anims/sprites/yellow_unk.gbapal"); -const u32 gBattleAnimSpriteGfx_SlamHit[] = INCBIN_U32("graphics/battle_anims/sprites/slam_hit.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SlamHit[] = INCBIN_U32("graphics/battle_anims/sprites/slam_hit.4bpp.smol"); const u16 gBattleAnimSpritePal_SlamHit[] = INCBIN_U16("graphics/battle_anims/sprites/slam_hit.gbapal"); -const u32 gBattleAnimSpriteGfx_RedFist[] = INCBIN_U32("graphics/battle_anims/sprites/red_fist.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RedFist[] = INCBIN_U32("graphics/battle_anims/sprites/red_fist.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Ring[] = INCBIN_U32("graphics/battle_anims/sprites/ring.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Ring[] = INCBIN_U32("graphics/battle_anims/sprites/ring.4bpp.smol"); const u16 gBattleAnimSpritePal_Ring[] = INCBIN_U16("graphics/battle_anims/sprites/ring.gbapal"); -const u32 gBattleAnimSpriteGfx_Rocks[] = INCBIN_U32("graphics/battle_anims/sprites/rocks.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Rocks[] = INCBIN_U32("graphics/battle_anims/sprites/rocks.4bpp.smol"); const u16 gBattleAnimSpritePal_Rocks[] = INCBIN_U16("graphics/battle_anims/sprites/rocks.gbapal"); -const u32 gBattleAnimSpriteGfx_Z[] = INCBIN_U32("graphics/battle_anims/sprites/z.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Z[] = INCBIN_U32("graphics/battle_anims/sprites/z.4bpp.smol"); const u16 gBattleAnimSpritePal_Z[] = INCBIN_U16("graphics/battle_anims/sprites/z.gbapal"); -const u32 gBattleAnimSpriteGfx_YellowUnk2[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_unk_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_YellowUnk2[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_unk_2.4bpp.smol"); const u16 gBattleAnimSpritePal_YellowUnk2[] = INCBIN_U16("graphics/battle_anims/sprites/yellow_unk_2.gbapal"); -const u32 gBattleAnimSpriteGfx_AirSlash[] = INCBIN_U32("graphics/battle_anims/sprites/air_slash.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_AirSlash[] = INCBIN_U32("graphics/battle_anims/sprites/air_slash.4bpp.smol"); const u16 gBattleAnimSpritePal_AirSlash[] = INCBIN_U16("graphics/battle_anims/sprites/air_slash.gbapal"); -const u32 gBattleAnimSpriteGfx_SpinningGreenOrbs[] = INCBIN_U32("graphics/battle_anims/sprites/spinning_green_orbs.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SpinningGreenOrbs[] = INCBIN_U32("graphics/battle_anims/sprites/spinning_green_orbs.4bpp.smol"); const u16 gBattleAnimSpritePal_SpinningGreenOrbs[] = INCBIN_U16("graphics/battle_anims/sprites/spinning_green_orbs.gbapal"); -const u32 gBattleAnimSpriteGfx_Leaf[] = INCBIN_U32("graphics/battle_anims/sprites/leaf.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Leaf[] = INCBIN_U32("graphics/battle_anims/sprites/leaf.4bpp.smol"); const u16 gBattleAnimSpritePal_Leaf[] = INCBIN_U16("graphics/battle_anims/sprites/leaf.gbapal"); -const u32 gBattleAnimSpriteGfx_MetronomeSmallHand[] = INCBIN_U32("graphics/battle_anims/unused/metronome_hand_small.4bpp.lz"); // unused, was for metronome at one point +const u32 gBattleAnimSpriteGfx_MetronomeSmallHand[] = INCBIN_U32("graphics/battle_anims/unused/metronome_hand_small.4bpp.smol"); // unused, was for metronome at one point const u16 gBattleAnimSpritePal_Clapping[] = INCBIN_U16("graphics/battle_anims/sprites/clapping.gbapal"); -const u32 gBattleAnimSpriteGfx_PoisonPowder[] = INCBIN_U32("graphics/battle_anims/sprites/poison_powder.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PoisonPowder[] = INCBIN_U32("graphics/battle_anims/sprites/poison_powder.4bpp.smol"); const u16 gBattleAnimSpritePal_PoisonPowder[] = INCBIN_U16("graphics/battle_anims/sprites/poison_powder.gbapal"); -const u32 gBattleAnimSpriteGfx_BrownTriangle[] = INCBIN_U32("graphics/battle_anims/sprites/brown_triangle.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BrownTriangle[] = INCBIN_U32("graphics/battle_anims/sprites/brown_triangle.4bpp.smol"); const u16 gBattleAnimSpritePal_BrownTriangle[] = INCBIN_U16("graphics/battle_anims/sprites/brown_triangle.gbapal"); -const u32 gBattleAnimSpriteGfx_Sparkle3[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_3.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Sparkle3[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_3.4bpp.smol"); const u16 gBattleAnimSpritePal_Sparkle3[] = INCBIN_U16("graphics/battle_anims/sprites/sparkle_3.gbapal"); -const u32 gBattleAnimSpriteGfx_Sparkle4[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_4.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Sparkle4[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_4.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_MusicNotes[] = INCBIN_U32("graphics/battle_anims/sprites/music_notes.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MusicNotes[] = INCBIN_U32("graphics/battle_anims/sprites/music_notes.4bpp.smol"); const u16 gBattleAnimSpritePal_MusicNotes[] = INCBIN_U16("graphics/battle_anims/sprites/music_notes.gbapal"); -const u32 gBattleAnimSpriteGfx_Duck[] = INCBIN_U32("graphics/battle_anims/sprites/duck.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Duck[] = INCBIN_U32("graphics/battle_anims/sprites/duck.4bpp.smol"); const u16 gBattleAnimSpritePal_Duck[] = INCBIN_U16("graphics/battle_anims/sprites/duck.gbapal"); -const u32 gBattleAnimSpriteGfx_Alert[] = INCBIN_U32("graphics/battle_anims/sprites/alert.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Alert[] = INCBIN_U32("graphics/battle_anims/sprites/alert.4bpp.smol"); const u16 gBattleAnimSpritePal_Alert[] = INCBIN_U16("graphics/battle_anims/sprites/alert.gbapal"); -const u32 gBattleAnimSpriteGfx_Shock4[] = INCBIN_U32("graphics/battle_anims/sprites/shock_4.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Shock4[] = INCBIN_U32("graphics/battle_anims/sprites/shock_4.4bpp.smol"); const u16 gBattleAnimSpritePal_Shock4[] = INCBIN_U16("graphics/battle_anims/sprites/shock_4.gbapal"); -const u32 gBattleAnimSpriteGfx_Shock[] = INCBIN_U32("graphics/battle_anims/sprites/shock.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Shock[] = INCBIN_U32("graphics/battle_anims/sprites/shock.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Bell2[] = INCBIN_U32("graphics/battle_anims/sprites/bell_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Bell2[] = INCBIN_U32("graphics/battle_anims/sprites/bell_2.4bpp.smol"); const u16 gBattleAnimSpritePal_Bell2[] = INCBIN_U16("graphics/battle_anims/sprites/bell_2.gbapal"); -const u32 gBattleAnimSpriteGfx_PinkGlove[] = INCBIN_U32("graphics/battle_anims/sprites/pink_glove.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PinkGlove[] = INCBIN_U32("graphics/battle_anims/sprites/pink_glove.4bpp.smol"); const u16 gBattleAnimSpritePal_PinkGlove[] = INCBIN_U16("graphics/battle_anims/sprites/pink_glove.gbapal"); const u16 gBattleAnimUnused_Unknown1[] = INCBIN_U16("graphics/battle_anims/unused/unknown_1.bin"); const u16 gBattleAnimUnused_Unknown2[] = INCBIN_U16("graphics/battle_anims/unused/unknown_2.bin"); const u16 gBattleAnimUnused_Unknown3[] = INCBIN_U16("graphics/battle_anims/unused/unknown_3.bin"); -const u32 gBattleAnimUnusedGfx_LineSketch2[] = INCBIN_U32("graphics/battle_anims/unused/line_sketch_2.8bpp.lz"); +const u32 gBattleAnimUnusedGfx_LineSketch2[] = INCBIN_U32("graphics/battle_anims/unused/line_sketch_2.8bpp.smol"); const u16 gBattleAnimUnusedPal_LineSketch2[] = INCBIN_U16("graphics/battle_anims/unused/line_sketch_2.gbapal"); -const u32 gBattleAnimUnusedTilemap_LineSketch2[] = INCBIN_U32("graphics/battle_anims/unused/line_sketch_2.bin.lz"); +const u32 gBattleAnimUnusedTilemap_LineSketch2[] = INCBIN_U32("graphics/battle_anims/unused/line_sketch_2.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_BlueLines[] = INCBIN_U32("graphics/battle_anims/sprites/blue_lines.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BlueLines[] = INCBIN_U32("graphics/battle_anims/sprites/blue_lines.4bpp.smol"); const u16 gBattleAnimSpritePal_BlueLines[] = INCBIN_U16("graphics/battle_anims/sprites/blue_lines.gbapal"); const u16 gBattleAnimSpritePal_Impact3[] = INCBIN_U16("graphics/battle_anims/sprites/impact_3.gbapal"); @@ -628,7 +631,7 @@ const u16 gBattleAnimSpritePal_RedTube[] = INCBIN_U16("graphics/battle_anims/spr const u16 gBattleAnimSpritePal_Amnesia[] = INCBIN_U16("graphics/battle_anims/sprites/amnesia.gbapal"); const u16 gBattleAnimSpritePal_String2[] = INCBIN_U16("graphics/battle_anims/sprites/string_2.gbapal"); -const u32 gBattleAnimUnused_Unknown4[] = INCBIN_U32("graphics/battle_anims/unused/unknown_4.bin.lz"); +const u32 gBattleAnimUnused_Unknown4[] = INCBIN_U32("graphics/battle_anims/unused/unknown_4.bin.smolTM"); const u16 gBattleAnimSpritePal_Pencil2[] = INCBIN_U16("graphics/battle_anims/sprites/pencil_2.gbapal"); const u16 gBattleAnimSpritePal_Petal[] = INCBIN_U16("graphics/battle_anims/sprites/petal.gbapal"); @@ -637,70 +640,70 @@ const u16 gBattleAnimSpritePal_Coin[] = INCBIN_U16("graphics/battle_anims/sprite const u16 gBattleAnimSpritePal_CrackedEgg[] = INCBIN_U16("graphics/battle_anims/sprites/cracked_egg.gbapal"); const u16 gBattleAnimSpritePal_FreshEgg[] = INCBIN_U16("graphics/battle_anims/sprites/fresh_egg.gbapal"); -const u32 gBattleAnimSpriteGfx_Impact3[] = INCBIN_U32("graphics/battle_anims/sprites/impact_3.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Impact2[] = INCBIN_U32("graphics/battle_anims/sprites/impact_2.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Reticle[] = INCBIN_U32("graphics/battle_anims/sprites/reticle.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Breath[] = INCBIN_U32("graphics/battle_anims/sprites/breath.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Snowball[] = INCBIN_U32("graphics/battle_anims/sprites/snowball.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Vine[] = INCBIN_U32("graphics/battle_anims/sprites/vine.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Sword2[] = INCBIN_U32("graphics/battle_anims/sprites/sword_2.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Clapping[] = INCBIN_U32("graphics/battle_anims/sprites/clapping.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_RedTube[] = INCBIN_U32("graphics/battle_anims/sprites/red_tube.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Amnesia[] = INCBIN_U32("graphics/battle_anims/sprites/amnesia.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_String2[] = INCBIN_U32("graphics/battle_anims/sprites/string_2.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Pencil2[] = INCBIN_U32("graphics/battle_anims/sprites/pencil_2.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Petal[] = INCBIN_U32("graphics/battle_anims/sprites/petal.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_BentSpoon[] = INCBIN_U32("graphics/battle_anims/sprites/bent_spoon.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Web[] = INCBIN_U32("graphics/battle_anims/sprites/web.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Coin[] = INCBIN_U32("graphics/battle_anims/sprites/coin.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_CrackedEgg[] = INCBIN_U32("graphics/battle_anims/sprites/cracked_egg.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_HatchedEgg[] = INCBIN_U32("graphics/battle_anims/sprites/hatched_egg.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_FreshEgg[] = INCBIN_U32("graphics/battle_anims/sprites/fresh_egg.4bpp.lz"); - -const u32 gBattleAnimSpriteGfx_Fangs[] = INCBIN_U32("graphics/battle_anims/sprites/fangs.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Impact3[] = INCBIN_U32("graphics/battle_anims/sprites/impact_3.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Impact2[] = INCBIN_U32("graphics/battle_anims/sprites/impact_2.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Reticle[] = INCBIN_U32("graphics/battle_anims/sprites/reticle.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Breath[] = INCBIN_U32("graphics/battle_anims/sprites/breath.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Snowball[] = INCBIN_U32("graphics/battle_anims/sprites/snowball.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Vine[] = INCBIN_U32("graphics/battle_anims/sprites/vine.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Sword2[] = INCBIN_U32("graphics/battle_anims/sprites/sword_2.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Clapping[] = INCBIN_U32("graphics/battle_anims/sprites/clapping.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_RedTube[] = INCBIN_U32("graphics/battle_anims/sprites/red_tube.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Amnesia[] = INCBIN_U32("graphics/battle_anims/sprites/amnesia.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_String2[] = INCBIN_U32("graphics/battle_anims/sprites/string_2.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Pencil2[] = INCBIN_U32("graphics/battle_anims/sprites/pencil_2.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Petal[] = INCBIN_U32("graphics/battle_anims/sprites/petal.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_BentSpoon[] = INCBIN_U32("graphics/battle_anims/sprites/bent_spoon.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Web[] = INCBIN_U32("graphics/battle_anims/sprites/web.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Coin[] = INCBIN_U32("graphics/battle_anims/sprites/coin.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_CrackedEgg[] = INCBIN_U32("graphics/battle_anims/sprites/cracked_egg.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_HatchedEgg[] = INCBIN_U32("graphics/battle_anims/sprites/hatched_egg.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_FreshEgg[] = INCBIN_U32("graphics/battle_anims/sprites/fresh_egg.4bpp.smol"); + +const u32 gBattleAnimSpriteGfx_Fangs[] = INCBIN_U32("graphics/battle_anims/sprites/fangs.4bpp.smol"); const u16 gBattleAnimSpritePal_Fangs[] = INCBIN_U16("graphics/battle_anims/sprites/fangs.gbapal"); -const u32 gBattleAnimSpriteGfx_Explosion2[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Explosion2[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_2.4bpp.smol"); const u16 gBattleAnimSpritePal_Explosion2[] = INCBIN_U16("graphics/battle_anims/sprites/explosion_2.gbapal"); -const u32 gBattleAnimSpriteGfx_Explosion3[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_3.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Explosion3[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_3.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_WaterDroplet[] = INCBIN_U32("graphics/battle_anims/sprites/water_droplet.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WaterDroplet[] = INCBIN_U32("graphics/battle_anims/sprites/water_droplet.4bpp.smol"); const u16 gBattleAnimSpritePal_WaterDroplet[] = INCBIN_U16("graphics/battle_anims/sprites/water_droplet.gbapal"); -const u32 gBattleAnimSpriteGfx_WaterDroplet2[] = INCBIN_U32("graphics/battle_anims/sprites/water_droplet_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WaterDroplet2[] = INCBIN_U32("graphics/battle_anims/sprites/water_droplet_2.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Seed2[] = INCBIN_U32("graphics/battle_anims/sprites/seed_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Seed2[] = INCBIN_U32("graphics/battle_anims/sprites/seed_2.4bpp.smol"); const u16 gBattleAnimSpritePal_Seed2[] = INCBIN_U16("graphics/battle_anims/sprites/seed_2.gbapal"); -const u32 gBattleAnimSpriteGfx_Sprout[] = INCBIN_U32("graphics/battle_anims/sprites/sprout.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Sprout[] = INCBIN_U32("graphics/battle_anims/sprites/sprout.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_RedWand[] = INCBIN_U32("graphics/battle_anims/sprites/red_wand.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RedWand[] = INCBIN_U32("graphics/battle_anims/sprites/red_wand.4bpp.smol"); const u16 gBattleAnimSpritePal_RedWand[] = INCBIN_U16("graphics/battle_anims/sprites/red_wand.gbapal"); -const u32 gBattleAnimSpriteGfx_PurpleGreenUnk[] = INCBIN_U32("graphics/battle_anims/sprites/purple_green_unk.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PurpleGreenUnk[] = INCBIN_U32("graphics/battle_anims/sprites/purple_green_unk.4bpp.smol"); const u16 gBattleAnimSpritePal_PurpleGreenUnk[] = INCBIN_U16("graphics/battle_anims/sprites/purple_green_unk.gbapal"); -const u32 gBattleAnimSpriteGfx_WaterColumn[] = INCBIN_U32("graphics/battle_anims/sprites/water_column.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WaterColumn[] = INCBIN_U32("graphics/battle_anims/sprites/water_column.4bpp.smol"); const u16 gBattleAnimSpritePal_WaterColumn[] = INCBIN_U16("graphics/battle_anims/sprites/water_column.gbapal"); -const u32 gBattleAnimSpriteGfx_MudUnk[] = INCBIN_U32("graphics/battle_anims/sprites/mud_unk.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MudUnk[] = INCBIN_U32("graphics/battle_anims/sprites/mud_unk.4bpp.smol"); const u16 gBattleAnimSpritePal_MudUnk[] = INCBIN_U16("graphics/battle_anims/sprites/mud_unk.gbapal"); -const u32 gUnusedTilemap_BlueFrame[] = INCBIN_U32("graphics/unused/blue_frame.bin.lz"); // P1, P2, P3 and P4 tilemaps? -const u32 gUnusedTilemap_RedYellowGreenFrame[] = INCBIN_U32("graphics/unused/redyellowgreen_frame.bin.lz"); -const u32 gUnusedGfx_ColorFrames[] = INCBIN_U32("graphics/unused/color_frames.4bpp.lz"); +const u32 gUnusedTilemap_BlueFrame[] = INCBIN_U32("graphics/unused/blue_frame.bin.smolTM"); // P1, P2, P3 and P4 tilemaps? +const u32 gUnusedTilemap_RedYellowGreenFrame[] = INCBIN_U32("graphics/unused/redyellowgreen_frame.bin.smolTM"); +const u32 gUnusedGfx_ColorFrames[] = INCBIN_U32("graphics/unused/color_frames.4bpp.smol"); const u16 gUnusedPal_ColorFrames[] = INCBIN_U16("graphics/unused/color_frames.gbapal"); -const u32 gBattleAnimSpriteGfx_RainDrops[] = INCBIN_U32("graphics/battle_anims/sprites/rain_drops.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RainDrops[] = INCBIN_U32("graphics/battle_anims/sprites/rain_drops.4bpp.smol"); -const u32 gBattleAnimUnusedGfx_WaterSplash[] = INCBIN_U32("graphics/battle_anims/unused/water_splash.8bpp.lz"); -const u32 gBattleAnimUnusedTilemap_WaterSplash[] = INCBIN_U32("graphics/battle_anims/unused/water_splash.bin.lz"); +const u32 gBattleAnimUnusedGfx_WaterSplash[] = INCBIN_U32("graphics/battle_anims/unused/water_splash.8bpp.smol"); +const u32 gBattleAnimUnusedTilemap_WaterSplash[] = INCBIN_U32("graphics/battle_anims/unused/water_splash.bin.smolTM"); const u16 gBattleAnimUnusedPal_WaterSplash[] = INCBIN_U16("graphics/battle_anims/unused/water_splash.gbapal"); -const u32 gUnusedGfx_BasicFrame[] = INCBIN_U32("graphics/unused/basic_frame.4bpp.lz"); +const u32 gUnusedGfx_BasicFrame[] = INCBIN_U32("graphics/unused/basic_frame.4bpp.smol"); const u16 gUnusedPal_BasicFrame[] = INCBIN_U16("graphics/unused/basic_frame.gbapal"); -const u32 gUnusedTilemap_BasicFrame[] = INCBIN_U32("graphics/unused/basic_frame.bin.lz"); +const u32 gUnusedTilemap_BasicFrame[] = INCBIN_U32("graphics/unused/basic_frame.bin.smolTM"); // Battle Interface @@ -721,191 +724,200 @@ const u8 gHealthboxElementsGfxTable[][32] = INCBIN_U8("graphics/battle_interface "graphics/battle_interface/status4.4bpp", "graphics/battle_interface/healthbox_doubles_frameend.4bpp", "graphics/battle_interface/healthbox_doubles_frameend_bar.4bpp"); -const u32 gBattleInterfaceGfx_UnusedWindow3[] = INCBIN_U32("graphics/battle_interface/unused_window3.4bpp.lz"); -const u32 gBattleInterfaceGfx_UnusedWindow4[] = INCBIN_U32("graphics/battle_interface/unused_window4.4bpp.lz"); +const u32 gBattleInterfaceGfx_UnusedWindow3[] = INCBIN_U32("graphics/battle_interface/unused_window3.4bpp.smol"); +const u32 gBattleInterfaceGfx_UnusedWindow4[] = INCBIN_U32("graphics/battle_interface/unused_window4.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_FurySwipes[] = INCBIN_U32("graphics/battle_anims/sprites/fury_swipes.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_FurySwipes[] = INCBIN_U32("graphics/battle_anims/sprites/fury_swipes.4bpp.smol"); const u16 gBattleAnimSpritePal_FurySwipes[] = INCBIN_U16("graphics/battle_anims/sprites/fury_swipes.gbapal"); -const u32 gBattleAnimSpriteGfx_Vine2[] = INCBIN_U32("graphics/battle_anims/sprites/vine_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Vine2[] = INCBIN_U32("graphics/battle_anims/sprites/vine_2.4bpp.smol"); const u16 gBattleAnimSpritePal_Vine2[] = INCBIN_U16("graphics/battle_anims/sprites/vine_2.gbapal"); -const u32 gBattleAnimSpriteGfx_Teeth[] = INCBIN_U32("graphics/battle_anims/sprites/teeth.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Teeth[] = INCBIN_U32("graphics/battle_anims/sprites/teeth.4bpp.smol"); const u16 gBattleAnimSpritePal_Teeth[] = INCBIN_U16("graphics/battle_anims/sprites/teeth.gbapal"); -const u32 gBattleAnimSpriteGfx_Bone2[] = INCBIN_U32("graphics/battle_anims/sprites/bone_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Bone2[] = INCBIN_U32("graphics/battle_anims/sprites/bone_2.4bpp.smol"); const u16 gBattleAnimSpritePal_Bone2[] = INCBIN_U16("graphics/battle_anims/sprites/bone_2.gbapal"); -const u32 gBattleAnimSpriteGfx_WhiteBag[] = INCBIN_U32("graphics/battle_anims/sprites/white_bag.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WhiteBag[] = INCBIN_U32("graphics/battle_anims/sprites/white_bag.4bpp.smol"); const u16 gBattleAnimSpritePal_WhiteBag[] = INCBIN_U16("graphics/battle_anims/sprites/white_bag.gbapal"); -const u32 gBattleAnimSpriteGfx_Unknown[] = INCBIN_U32("graphics/battle_anims/sprites/unknown.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Unknown[] = INCBIN_U32("graphics/battle_anims/sprites/unknown.4bpp.smol"); const u16 gBattleAnimSpritePal_Unknown[] = INCBIN_U16("graphics/battle_anims/sprites/unknown.gbapal"); -const u32 gBattleAnimSpriteGfx_PurpleCoral[] = INCBIN_U32("graphics/battle_anims/sprites/purple_coral.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PurpleCoral[] = INCBIN_U32("graphics/battle_anims/sprites/purple_coral.4bpp.smol"); const u16 gBattleAnimSpritePal_PurpleCoral[] = INCBIN_U16("graphics/battle_anims/sprites/purple_coral.gbapal"); -const u32 gBattleAnimSpriteGfx_PurpleDroplet[] = INCBIN_U32("graphics/battle_anims/sprites/purple_droplet.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PurpleDroplet[] = INCBIN_U32("graphics/battle_anims/sprites/purple_droplet.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Shock2[] = INCBIN_U32("graphics/battle_anims/sprites/shock_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Shock2[] = INCBIN_U32("graphics/battle_anims/sprites/shock_2.4bpp.smol"); const u16 gBattleAnimSpritePal_Shock2[] = INCBIN_U16("graphics/battle_anims/sprites/shock_2.gbapal"); -const u32 gBattleAnimSpriteGfx_ClosingEye2[] = INCBIN_U32("graphics/battle_anims/sprites/closing_eye_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ClosingEye2[] = INCBIN_U32("graphics/battle_anims/sprites/closing_eye_2.4bpp.smol"); const u16 gBattleAnimSpritePal_ClosingEye2[] = INCBIN_U16("graphics/battle_anims/sprites/closing_eye_2.gbapal"); -const u32 gBattleAnimSpriteGfx_MetalBall[] = INCBIN_U32("graphics/battle_anims/sprites/metal_ball.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MetalBall[] = INCBIN_U32("graphics/battle_anims/sprites/metal_ball.4bpp.smol"); const u16 gBattleAnimSpritePal_MetalBall[] = INCBIN_U16("graphics/battle_anims/sprites/metal_ball.gbapal"); -const u32 gBattleAnimSpriteGfx_MonsterDoll[] = INCBIN_U32("graphics/battle_anims/sprites/monster_doll.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MonsterDoll[] = INCBIN_U32("graphics/battle_anims/sprites/monster_doll.4bpp.smol"); const u16 gBattleAnimSpritePal_MonsterDoll[] = INCBIN_U16("graphics/battle_anims/sprites/monster_doll.gbapal"); -const u32 gBattleAnimSpriteGfx_Whirlwind[] = INCBIN_U32("graphics/battle_anims/sprites/whirlwind.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Whirlwind[] = INCBIN_U32("graphics/battle_anims/sprites/whirlwind.4bpp.smol"); const u16 gBattleAnimSpritePal_Whirlwind[] = INCBIN_U16("graphics/battle_anims/sprites/whirlwind.gbapal"); -const u32 gBattleAnimSpriteGfx_Whirlwind2[] = INCBIN_U32("graphics/battle_anims/sprites/whirlwind_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Whirlwind2[] = INCBIN_U32("graphics/battle_anims/sprites/whirlwind_2.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Explosion4[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_4.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Explosion4[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_4.4bpp.smol"); const u16 gBattleAnimSpritePal_Explosion4[] = INCBIN_U16("graphics/battle_anims/sprites/explosion_4.gbapal"); -const u32 gBattleAnimSpriteGfx_Explosion5[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_5.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Explosion5[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_5.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Tongue[] = INCBIN_U32("graphics/battle_anims/sprites/tongue.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Tongue[] = INCBIN_U32("graphics/battle_anims/sprites/tongue.4bpp.smol"); const u16 gBattleAnimSpritePal_Tongue[] = INCBIN_U16("graphics/battle_anims/sprites/tongue.gbapal"); -const u32 gBattleAnimSpriteGfx_Smoke[] = INCBIN_U32("graphics/battle_anims/sprites/smoke.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Smoke[] = INCBIN_U32("graphics/battle_anims/sprites/smoke.4bpp.smol"); const u16 gBattleAnimSpritePal_Smoke[] = INCBIN_U16("graphics/battle_anims/sprites/smoke.gbapal"); -const u32 gBattleAnimSpriteGfx_Smoke2[] = INCBIN_U32("graphics/battle_anims/sprites/smoke_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Smoke2[] = INCBIN_U32("graphics/battle_anims/sprites/smoke_2.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_BlueFlames[] = INCBIN_U32("graphics/battle_anims/sprites/blue_flames.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BlueFlames[] = INCBIN_U32("graphics/battle_anims/sprites/blue_flames.4bpp.smol"); const u16 gBattleAnimSpritePal_BlueFlames[] = INCBIN_U16("graphics/battle_anims/sprites/blue_flames.gbapal"); -const u32 gBattleAnimSpriteGfx_BlueFlames2[] = INCBIN_U32("graphics/battle_anims/sprites/blue_flames_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BlueFlames2[] = INCBIN_U32("graphics/battle_anims/sprites/blue_flames_2.4bpp.smol"); + +const u32 gBattleAnimSpriteGfx_TatsugiriCurly[] = INCBIN_U32("graphics/battle_anims/sprites/tatsugiri_curly.4bpp.smol"); +const u16 gBattleAnimSpritePal_TatsugiriCurly[] = INCBIN_U16("graphics/battle_anims/sprites/tatsugiri_curly.gbapal"); + +const u32 gBattleAnimSpriteGfx_TatsugiriDroopy[] = INCBIN_U32("graphics/battle_anims/sprites/tatsugiri_droopy.4bpp.smol"); +const u16 gBattleAnimSpritePal_TatsugiriDroopy[] = INCBIN_U16("graphics/battle_anims/sprites/tatsugiri_droopy.gbapal"); + +const u32 gBattleAnimSpriteGfx_TatsugiriStretchy[] = INCBIN_U32("graphics/battle_anims/sprites/tatsugiri_stretchy.4bpp.smol"); +const u16 gBattleAnimSpritePal_TatsugiriStretchy[] = INCBIN_U16("graphics/battle_anims/sprites/tatsugiri_stretchy.gbapal"); // Contest -const u32 gJPContestGfx1[] = INCBIN_U32("graphics/contest/japanese/composite_1.4bpp.lz"); +const u32 gJPContestGfx1[] = INCBIN_U32("graphics/contest/japanese/composite_1.4bpp.smol"); const u16 gJPContestPal[] = INCBIN_U16("graphics/contest/japanese/palette.gbapal"); -const u32 gJPContestBgTilemap[] = INCBIN_U32("graphics/contest/japanese/bg.bin.lz"); -const u32 gJPContestWindowsTilemap[] = INCBIN_U32("graphics/contest/japanese/windows.bin.lz"); -const u32 gJPContestGfx2[] = INCBIN_U32("graphics/contest/japanese/composite_2.4bpp.lz"); +const u32 gJPContestBgTilemap[] = INCBIN_U32("graphics/contest/japanese/bg.bin.smolTM"); +const u32 gJPContestWindowsTilemap[] = INCBIN_U32("graphics/contest/japanese/windows.bin.smolTM"); +const u32 gJPContestGfx2[] = INCBIN_U32("graphics/contest/japanese/composite_2.4bpp.smol"); const u16 gContestInterfaceAudiencePalette[] = INCBIN_U16("graphics/contest/interface.gbapal"); -const u32 gContestAudienceTilemap[] = INCBIN_U32("graphics/contest/audience.bin.lz"); -const u32 gContestInterfaceTilemap[] = INCBIN_U32("graphics/contest/interface.bin.lz"); -const u32 gJPContestInterfaceTilemap[] = INCBIN_U32("graphics/contest/japanese/interface.bin.lz"); -const u32 gJPContestAudienceTilemap[] = INCBIN_U32("graphics/contest/japanese/audience.bin.lz"); -const u32 gContestCurtainTilemap[] = INCBIN_U32("graphics/contest/curtain.bin.lz"); - -const u32 gContestInterfaceGfx[] = INCBIN_U32("graphics/contest/interface.4bpp.lz"); -const u32 gContestAudienceGfx[] = INCBIN_U32("graphics/contest/audience.4bpp.lz"); -const u32 gContestFaces_Gfx[] = INCBIN_U32("graphics/contest/faces.4bpp.lz"); -const u32 gContestJudgeSymbolsGfx[] = INCBIN_U32("graphics/contest/judge_symbols.4bpp.lz"); +const u32 gContestAudienceTilemap[] = INCBIN_U32("graphics/contest/audience.bin.smolTM"); +const u32 gContestInterfaceTilemap[] = INCBIN_U32("graphics/contest/interface.bin.smolTM"); +const u32 gJPContestInterfaceTilemap[] = INCBIN_U32("graphics/contest/japanese/interface.bin.smolTM"); +const u32 gJPContestAudienceTilemap[] = INCBIN_U32("graphics/contest/japanese/audience.bin.smolTM"); +const u32 gContestCurtainTilemap[] = INCBIN_U32("graphics/contest/curtain.bin.smolTM"); + +const u32 gContestInterfaceGfx[] = INCBIN_U32("graphics/contest/interface.4bpp.smol"); +const u32 gContestAudienceGfx[] = INCBIN_U32("graphics/contest/audience.4bpp.smol"); +const u32 gContestFaces_Gfx[] = INCBIN_U32("graphics/contest/faces.4bpp.smol"); +const u32 gContestJudgeSymbolsGfx[] = INCBIN_U32("graphics/contest/judge_symbols.4bpp.smol"); const u16 gContestJudgeSymbolsPal[] = INCBIN_U16("graphics/contest/judge_symbols.gbapal"); const u8 gContestSliderHeart_Gfx[] = INCBIN_U8("graphics/contest/slider_heart.4bpp"); // JP equivalent of the Applause meter -const u32 gJPContestVoltageGfx[] = INCBIN_U32("graphics/contest/japanese/voltage.4bpp.lz"); +const u32 gJPContestVoltageGfx[] = INCBIN_U32("graphics/contest/japanese/voltage.4bpp.smol"); const u16 gJPContestVoltagePal[] = INCBIN_U16("graphics/contest/japanese/voltage.gbapal"); // Contest results -const u32 gContestResults_Gfx[] = INCBIN_U32("graphics/contest/results_screen/tiles.4bpp.lz"); -const u32 gContestResults_WinnerBanner_Tilemap[] = INCBIN_U32("graphics/contest/results_screen/winner_banner.bin.lz"); -const u32 gContestResults_Interface_Tilemap[] = INCBIN_U32("graphics/contest/results_screen/interface.bin.lz"); -const u32 gContestResults_Bg_Tilemap[] = INCBIN_U32("graphics/contest/results_screen/bg.bin.lz"); +const u32 gContestResults_Gfx[] = INCBIN_U32("graphics/contest/results_screen/tiles.4bpp.smol"); +const u32 gContestResults_WinnerBanner_Tilemap[] = INCBIN_U32("graphics/contest/results_screen/winner_banner.bin.smolTM"); +const u32 gContestResults_Interface_Tilemap[] = INCBIN_U32("graphics/contest/results_screen/interface.bin.smolTM"); +const u32 gContestResults_Bg_Tilemap[] = INCBIN_U32("graphics/contest/results_screen/bg.bin.smolTM"); const u16 gContestResults_Pal[] = INCBIN_U16("graphics/contest/results_screen/tiles.gbapal"); -const u32 gBattleAnimSpriteGfx_Impact[] = INCBIN_U32("graphics/battle_anims/sprites/impact.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Impact[] = INCBIN_U32("graphics/battle_anims/sprites/impact.4bpp.smol"); const u16 gBattleAnimSpritePal_Impact[] = INCBIN_U16("graphics/battle_anims/sprites/impact.gbapal"); -const u32 gBattleAnimSpriteGfx_Particles[] = INCBIN_U32("graphics/battle_anims/sprites/particles.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Particles[] = INCBIN_U32("graphics/battle_anims/sprites/particles.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Particles2[] = INCBIN_U32("graphics/battle_anims/sprites/particles2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Particles2[] = INCBIN_U32("graphics/battle_anims/sprites/particles2.4bpp.smol"); const u16 gBattleAnimSpritePal_Particles2[] = INCBIN_U16("graphics/battle_anims/sprites/particles2.gbapal"); -const u32 gBattleAnimSpriteGfx_CircleImpact[] = INCBIN_U32("graphics/battle_anims/sprites/circle_impact.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_CircleImpact[] = INCBIN_U32("graphics/battle_anims/sprites/circle_impact.4bpp.smol"); const u16 gBattleAnimSpritePal_CircleImpact[] = INCBIN_U16("graphics/battle_anims/sprites/circle_impact.gbapal"); -const u32 gBattleAnimSpriteGfx_Scratch[] = INCBIN_U32("graphics/battle_anims/sprites/scratch.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Scratch[] = INCBIN_U32("graphics/battle_anims/sprites/scratch.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_SharpTeeth[] = INCBIN_U32("graphics/battle_anims/sprites/sharp_teeth.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SharpTeeth[] = INCBIN_U32("graphics/battle_anims/sprites/sharp_teeth.4bpp.smol"); const u16 gBattleAnimSpritePal_SharpTeeth[] = INCBIN_U16("graphics/battle_anims/sprites/sharp_teeth.gbapal"); -const u32 gBattleAnimSpriteGfx_Clamp[] = INCBIN_U32("graphics/battle_anims/sprites/clamp.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Clamp[] = INCBIN_U32("graphics/battle_anims/sprites/clamp.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Cut[] = INCBIN_U32("graphics/battle_anims/sprites/cut.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Cut[] = INCBIN_U32("graphics/battle_anims/sprites/cut.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_RainbowRings[] = INCBIN_U32("graphics/battle_anims/sprites/rainbow_rings.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RainbowRings[] = INCBIN_U32("graphics/battle_anims/sprites/rainbow_rings.4bpp.smol"); const u16 gBattleAnimSpritePal_RainbowRings[] = INCBIN_U16("graphics/battle_anims/sprites/rainbow_rings.gbapal"); -const u32 gBattleAnimSpriteGfx_IceCrystals[] = INCBIN_U32("graphics/battle_anims/sprites/ice_crystals.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_IceCrystals[] = INCBIN_U32("graphics/battle_anims/sprites/ice_crystals.4bpp.smol"); const u16 gBattleAnimSpritePal_IceCrystals[] = INCBIN_U16("graphics/battle_anims/sprites/ice_crystals.gbapal"); -const u32 gBattleAnimSpriteGfx_IceSpikes[] = INCBIN_U32("graphics/battle_anims/sprites/ice_spikes.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_IceSpikes[] = INCBIN_U32("graphics/battle_anims/sprites/ice_spikes.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_OldBeatUp[] = INCBIN_U32("graphics/battle_anims/unused/old_beatup.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_OldBeatUp[] = INCBIN_U32("graphics/battle_anims/unused/old_beatup.4bpp.smol"); const u16 gBattleAnimSpritePal_OldBeatUp[] = INCBIN_U16("graphics/battle_anims/unused/old_beatup.gbapal"); -const u32 gBattleAnimSpriteGfx_Orbs[] = INCBIN_U32("graphics/battle_anims/sprites/orbs.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Orbs[] = INCBIN_U32("graphics/battle_anims/sprites/orbs.4bpp.smol"); const u16 gBattleAnimSpritePal_Orbs[] = INCBIN_U16("graphics/battle_anims/sprites/orbs.gbapal"); -const u32 gBattleAnimSpriteGfx_WaterOrb[] = INCBIN_U32("graphics/battle_anims/sprites/water_orb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WaterOrb[] = INCBIN_U32("graphics/battle_anims/sprites/water_orb.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_WaterImpact[] = INCBIN_U32("graphics/battle_anims/sprites/water_impact.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WaterImpact[] = INCBIN_U32("graphics/battle_anims/sprites/water_impact.4bpp.smol"); const u16 gBattleAnimSpritePal_WaterImpact[] = INCBIN_U16("graphics/battle_anims/sprites/water_impact.gbapal"); const u16 gBattleAnimSpritePal_BrownOrb[] = INCBIN_U16("graphics/battle_anims/sprites/brown_orb.gbapal"); -const u32 gBattleAnimSpriteGfx_MudSand[] = INCBIN_U32("graphics/battle_anims/sprites/mud_sand.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MudSand[] = INCBIN_U32("graphics/battle_anims/sprites/mud_sand.4bpp.smol"); const u16 gBattleAnimSpritePal_MudSand[] = INCBIN_U16("graphics/battle_anims/sprites/mud_sand.gbapal"); -const u32 gBattleAnimSpriteGfx_PoisonBubble[] = INCBIN_U32("graphics/battle_anims/sprites/poison_bubble.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PoisonBubble[] = INCBIN_U32("graphics/battle_anims/sprites/poison_bubble.4bpp.smol"); const u16 gBattleAnimSpritePal_PoisonBubble[] = INCBIN_U16("graphics/battle_anims/sprites/poison_bubble.gbapal"); -const u32 gBattleAnimSpriteGfx_ToxicBubble[] = INCBIN_U32("graphics/battle_anims/sprites/toxic_bubble.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ToxicBubble[] = INCBIN_U32("graphics/battle_anims/sprites/toxic_bubble.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_HornHit2[] = INCBIN_U32("graphics/battle_anims/sprites/horn_hit_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HornHit2[] = INCBIN_U32("graphics/battle_anims/sprites/horn_hit_2.4bpp.smol"); const u16 gBattleAnimSpritePal_HornHit2[] = INCBIN_U16("graphics/battle_anims/sprites/horn_hit_2.gbapal"); -const u32 gBattleAnimSpriteGfx_AirWave2[] = INCBIN_U32("graphics/battle_anims/sprites/air_wave_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_AirWave2[] = INCBIN_U32("graphics/battle_anims/sprites/air_wave_2.4bpp.smol"); const u16 gBattleAnimSpritePal_AirWave2[] = INCBIN_U16("graphics/battle_anims/sprites/air_wave_2.gbapal"); -const u32 gBattleAnimSpriteGfx_SmallBubbles[] = INCBIN_U32("graphics/battle_anims/sprites/small_bubbles.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SmallBubbles[] = INCBIN_U32("graphics/battle_anims/sprites/small_bubbles.4bpp.smol"); const u16 gBattleAnimSpritePal_SmallBubbles[] = INCBIN_U16("graphics/battle_anims/sprites/small_bubbles.gbapal"); -const u32 gBattleAnimSpriteGfx_RoundShadow[] = INCBIN_U32("graphics/battle_anims/sprites/round_shadow.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RoundShadow[] = INCBIN_U32("graphics/battle_anims/sprites/round_shadow.4bpp.smol"); const u16 gBattleAnimSpritePal_RoundShadow[] = INCBIN_U16("graphics/battle_anims/sprites/round_shadow.gbapal"); -const u32 gBattleAnimSpriteGfx_Sunlight[] = INCBIN_U32("graphics/battle_anims/sprites/sunlight.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Sunlight[] = INCBIN_U32("graphics/battle_anims/sprites/sunlight.4bpp.smol"); const u16 gBattleAnimSpritePal_Sunlight[] = INCBIN_U16("graphics/battle_anims/sprites/sunlight.gbapal"); -const u32 gBattleAnimSpriteGfx_Spore[] = INCBIN_U32("graphics/battle_anims/sprites/spore.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Spore[] = INCBIN_U32("graphics/battle_anims/sprites/spore.4bpp.smol"); const u16 gBattleAnimSpritePal_Spore[] = INCBIN_U16("graphics/battle_anims/sprites/spore.gbapal"); -const u32 gBattleAnimSpriteGfx_Flower[] = INCBIN_U32("graphics/battle_anims/sprites/flower.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Flower[] = INCBIN_U32("graphics/battle_anims/sprites/flower.4bpp.smol"); const u16 gBattleAnimSpritePal_Flower[] = INCBIN_U16("graphics/battle_anims/sprites/flower.gbapal"); -const u32 gBattleAnimSpriteGfx_RazorLeaf[] = INCBIN_U32("graphics/battle_anims/sprites/razor_leaf.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RazorLeaf[] = INCBIN_U32("graphics/battle_anims/sprites/razor_leaf.4bpp.smol"); const u16 gBattleAnimSpritePal_RazorLeaf[] = INCBIN_U16("graphics/battle_anims/sprites/razor_leaf.gbapal"); -const u32 gBattleAnimSpriteGfx_MistCloud[] = INCBIN_U32("graphics/battle_anims/sprites/mist_cloud.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MistCloud[] = INCBIN_U32("graphics/battle_anims/sprites/mist_cloud.4bpp.smol"); const u16 gBattleAnimSpritePal_MistCloud[] = INCBIN_U16("graphics/battle_anims/sprites/mist_cloud.gbapal"); -const u32 gBattleAnimUnusedGfx_Lights[] = INCBIN_U32("graphics/battle_anims/unused/lights.4bpp.lz"); +const u32 gBattleAnimUnusedGfx_Lights[] = INCBIN_U32("graphics/battle_anims/unused/lights.4bpp.smol"); const u16 gBattleAnimUnusedPal_Lights[] = INCBIN_U16("graphics/battle_anims/unused/lights.gbapal"); -const u32 gBattleAnimUnusedTilemap_Lights[] = INCBIN_U32("graphics/battle_anims/unused/lights.bin.lz"); +const u32 gBattleAnimUnusedTilemap_Lights[] = INCBIN_U32("graphics/battle_anims/unused/lights.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_WhirlwindLines[] = INCBIN_U32("graphics/battle_anims/sprites/whirlwind_lines.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WhirlwindLines[] = INCBIN_U32("graphics/battle_anims/sprites/whirlwind_lines.4bpp.smol"); const u16 gBattleAnimSpritePal_WhirlwindLines[] = INCBIN_U16("graphics/battle_anims/sprites/whirlwind_lines.gbapal"); -const u32 gBattleAnimSpriteGfx_GoldRing[] = INCBIN_U32("graphics/battle_anims/sprites/gold_ring.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GoldRing[] = INCBIN_U32("graphics/battle_anims/sprites/gold_ring.4bpp.smol"); const u16 gBattleAnimSpritePal_GoldRing[] = INCBIN_U16("graphics/battle_anims/sprites/gold_ring.gbapal"); const u16 gBattleAnimSpritePal_BlueRing2[] = INCBIN_U16("graphics/battle_anims/sprites/blue_ring_2.gbapal"); const u16 gBattleAnimSpritePal_PurpleRing[] = INCBIN_U16("graphics/battle_anims/sprites/purple_ring.gbapal"); const u16 gBattleAnimSpritePal_BlueRing[] = INCBIN_U16("graphics/battle_anims/sprites/blue_ring.gbapal"); -const u32 gBattleAnimSpriteGfx_GreenLightWall[] = INCBIN_U32("graphics/battle_anims/sprites/green_light_wall.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GreenLightWall[] = INCBIN_U32("graphics/battle_anims/sprites/green_light_wall.4bpp.smol"); const u16 gBattleAnimSpritePal_GreenLightWall[] = INCBIN_U16("graphics/battle_anims/sprites/green_light_wall.gbapal"); const u16 gBattleAnimSpritePal_BlueLightWall[] = INCBIN_U16("graphics/battle_anims/sprites/blue_light_wall.gbapal"); @@ -913,318 +925,318 @@ const u16 gBattleAnimSpritePal_RedLightWall[] = INCBIN_U16("graphics/battle_anim const u16 gBattleAnimSpritePal_GrayLightWall[] = INCBIN_U16("graphics/battle_anims/sprites/gray_light_wall.gbapal"); const u16 gBattleAnimSpritePal_OrangeLightWall[] = INCBIN_U16("graphics/battle_anims/sprites/orange_light_wall.gbapal"); -const u32 gBattleAnimSpriteGfx_BlackBall2[] = INCBIN_U32("graphics/battle_anims/sprites/black_ball_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BlackBall2[] = INCBIN_U32("graphics/battle_anims/sprites/black_ball_2.4bpp.smol"); const u16 gBattleAnimSpritePal_BlackBall2[] = INCBIN_U16("graphics/battle_anims/sprites/black_ball_2.gbapal"); const u16 gBattleAnimSpritePal_PurpleGasCloud[] = INCBIN_U16("graphics/battle_anims/sprites/purple_gas_cloud.gbapal"); -const u32 gContestJudgeGfx[] = INCBIN_U32("graphics/contest/judge.4bpp.lz"); +const u32 gContestJudgeGfx[] = INCBIN_U32("graphics/contest/judge.4bpp.smol"); const u16 gContest2Pal[] = INCBIN_U16("graphics/contest/judge.gbapal"); -const u32 gBattleAnimSpriteGfx_Spark[] = INCBIN_U32("graphics/battle_anims/sprites/spark.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Spark[] = INCBIN_U32("graphics/battle_anims/sprites/spark.4bpp.smol"); const u16 gBattleAnimSpritePal_Spark[] = INCBIN_U16("graphics/battle_anims/sprites/spark.gbapal"); -const u32 gBattleAnimSpriteGfx_SparkH[] = INCBIN_U32("graphics/battle_anims/sprites/spark_h.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SparkH[] = INCBIN_U32("graphics/battle_anims/sprites/spark_h.4bpp.smol"); -const u32 gBattleAnimBgImage_Dark[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark.4bpp.lz"); +const u32 gBattleAnimBgImage_Dark[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark.4bpp.smol"); const u16 gBattleAnimBgPalette_Dark[] = INCBIN_U16("graphics/battle_anims/backgrounds/dark.gbapal"); -const u32 gBattleAnimBgTilemap_Dark[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark.bin.lz"); +const u32 gBattleAnimBgTilemap_Dark[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark.bin.smolTM"); -const u32 gMetalShineGfx[] = INCBIN_U32("graphics/battle_anims/masks/metal_shine.4bpp.lz"); +const u32 gMetalShineGfx[] = INCBIN_U32("graphics/battle_anims/masks/metal_shine.4bpp.smol"); const u16 gMetalShinePalette[] = INCBIN_U16("graphics/battle_anims/masks/metal_shine.gbapal"); -const u32 gMetalShineTilemap[] = INCBIN_U32("graphics/battle_anims/masks/metal_shine.bin.lz"); +const u32 gMetalShineTilemap[] = INCBIN_U32("graphics/battle_anims/masks/metal_shine.bin.smolTM"); -const u32 gUnusedGfx_Goosuto[] = INCBIN_U32("graphics/battle_anims/unused/goosuto.4bpp.lz"); // ghost +const u32 gUnusedGfx_Goosuto[] = INCBIN_U32("graphics/battle_anims/unused/goosuto.4bpp.smol"); // ghost const u16 gUnusedPal_Goosuto[] = INCBIN_U16("graphics/battle_anims/unused/goosuto.gbapal"); -const u32 gUnusedTilemap_Goosuto[] = INCBIN_U32("graphics/battle_anims/unused/goosuto.bin.lz"); +const u32 gUnusedTilemap_Goosuto[] = INCBIN_U32("graphics/battle_anims/unused/goosuto.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_YellowStar[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_star.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_YellowStar[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_star.4bpp.smol"); const u16 gBattleAnimSpritePal_YellowStar[] = INCBIN_U16("graphics/battle_anims/sprites/yellow_star.gbapal"); -const u32 gBattleAnimSpriteGfx_LargeFreshEgg[] = INCBIN_U32("graphics/battle_anims/sprites/large_fresh_egg.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_LargeFreshEgg[] = INCBIN_U32("graphics/battle_anims/sprites/large_fresh_egg.4bpp.smol"); const u16 gBattleAnimSpritePal_LargeFreshEgg[] = INCBIN_U16("graphics/battle_anims/sprites/large_fresh_egg.gbapal"); -const u32 gBattleAnimSpriteGfx_ShadowBall[] = INCBIN_U32("graphics/battle_anims/sprites/shadow_ball.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ShadowBall[] = INCBIN_U32("graphics/battle_anims/sprites/shadow_ball.4bpp.smol"); const u16 gBattleAnimSpritePal_ShadowBall[] = INCBIN_U16("graphics/battle_anims/sprites/shadow_ball.gbapal"); -const u32 gBattleAnimSpriteGfx_Lick[] = INCBIN_U32("graphics/battle_anims/sprites/lick.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Lick[] = INCBIN_U32("graphics/battle_anims/sprites/lick.4bpp.smol"); const u16 gBattleAnimSpritePal_Lick[] = INCBIN_U16("graphics/battle_anims/sprites/lick.gbapal"); -const u32 gBattleAnimSpriteGfx_VoidLines[] = INCBIN_U32("graphics/battle_anims/sprites/void_lines.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_VoidLines[] = INCBIN_U32("graphics/battle_anims/sprites/void_lines.4bpp.smol"); const u16 gBattleAnimSpritePal_VoidLines[] = INCBIN_U16("graphics/battle_anims/sprites/void_lines.gbapal"); const u16 gBattleAnimSpritePal_String[] = INCBIN_U16("graphics/battle_anims/sprites/string.gbapal"); -const u32 gBattleAnimSpriteGfx_String[] = INCBIN_U32("graphics/battle_anims/sprites/string.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_String[] = INCBIN_U32("graphics/battle_anims/sprites/string.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_WebThread[] = INCBIN_U32("graphics/battle_anims/sprites/web_thread.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_SpiderWeb[] = INCBIN_U32("graphics/battle_anims/sprites/spider_web.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WebThread[] = INCBIN_U32("graphics/battle_anims/sprites/web_thread.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_SpiderWeb[] = INCBIN_U32("graphics/battle_anims/sprites/spider_web.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Lightbulb[] = INCBIN_U32("graphics/battle_anims/sprites/lightbulb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Lightbulb[] = INCBIN_U32("graphics/battle_anims/sprites/lightbulb.4bpp.smol"); const u16 gBattleAnimSpritePal_Lightbulb[] = INCBIN_U16("graphics/battle_anims/sprites/lightbulb.gbapal"); -const u32 gBattleAnimSpriteGfx_Slash[] = INCBIN_U32("graphics/battle_anims/sprites/slash.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Slash[] = INCBIN_U32("graphics/battle_anims/sprites/slash.4bpp.smol"); const u16 gBattleAnimSpritePal_Slash[] = INCBIN_U16("graphics/battle_anims/sprites/slash.gbapal"); -const u32 gBattleAnimSpriteGfx_FocusEnergy[] = INCBIN_U32("graphics/battle_anims/sprites/focus_energy.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_FocusEnergy[] = INCBIN_U32("graphics/battle_anims/sprites/focus_energy.4bpp.smol"); const u16 gBattleAnimSpritePal_FocusEnergy[] = INCBIN_U16("graphics/battle_anims/sprites/focus_energy.gbapal"); -const u32 gBattleAnimSpriteGfx_SphereToCube[] = INCBIN_U32("graphics/battle_anims/sprites/sphere_to_cube.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SphereToCube[] = INCBIN_U32("graphics/battle_anims/sprites/sphere_to_cube.4bpp.smol"); const u16 gBattleAnimSpritePal_SphereToCube[] = INCBIN_U16("graphics/battle_anims/sprites/sphere_to_cube.gbapal"); -const u32 gBattleAnimBgImage_Psychic[] = INCBIN_U32("graphics/battle_anims/backgrounds/psychic.4bpp.lz"); +const u32 gBattleAnimBgImage_Psychic[] = INCBIN_U32("graphics/battle_anims/backgrounds/psychic.4bpp.smol"); const u16 gBattleAnimBgPalette_Psychic[] = INCBIN_U16("graphics/battle_anims/backgrounds/psychic.gbapal"); -const u32 gBattleAnimBgTilemap_Psychic[] = INCBIN_U32("graphics/battle_anims/backgrounds/psychic.bin.lz"); +const u32 gBattleAnimBgTilemap_Psychic[] = INCBIN_U32("graphics/battle_anims/backgrounds/psychic.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_Eye[] = INCBIN_U32("graphics/battle_anims/sprites/eye.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Eye[] = INCBIN_U32("graphics/battle_anims/sprites/eye.4bpp.smol"); const u16 gBattleAnimSpritePal_Eye[] = INCBIN_U16("graphics/battle_anims/sprites/eye.gbapal"); -const u32 gBattleAnimSpriteGfx_Tendrils[] = INCBIN_U32("graphics/battle_anims/sprites/tendrils.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Tendrils[] = INCBIN_U32("graphics/battle_anims/sprites/tendrils.4bpp.smol"); const u16 gBattleAnimSpritePal_Tendrils[] = INCBIN_U16("graphics/battle_anims/sprites/tendrils.gbapal"); -const u32 gHealthboxSinglesPlayerGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_singles_player.4bpp.lz"); -const u32 gHealthboxSinglesOpponentGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_singles_opponent.4bpp.lz"); -const u32 gHealthboxDoublesPlayerGfx[] = INCBIN_U32( "graphics/battle_interface/healthbox_doubles_player.4bpp.lz"); -const u32 gHealthboxDoublesOpponentGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_doubles_opponent.4bpp.lz"); -const u32 gHealthboxSafariGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_safari.4bpp.lz"); +const u32 gHealthboxSinglesPlayerGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_singles_player.4bpp.smol"); +const u32 gHealthboxSinglesOpponentGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_singles_opponent.4bpp.smol"); +const u32 gHealthboxDoublesPlayerGfx[] = INCBIN_U32( "graphics/battle_interface/healthbox_doubles_player.4bpp.smol"); +const u32 gHealthboxDoublesOpponentGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_doubles_opponent.4bpp.smol"); +const u32 gHealthboxSafariGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_safari.4bpp.smol"); -const u32 gUnusedGfx_Shadow[] = INCBIN_U32("graphics/unused/shadow.4bpp.lz"); +const u32 gUnusedGfx_Shadow[] = INCBIN_U32("graphics/unused/shadow.4bpp.smol"); const u16 gUnusedPal_Shadow[] = INCBIN_U16("graphics/unused/shadow.gbapal"); -const u32 gBattleAnimSpriteGfx_LockOn[] = INCBIN_U32("graphics/battle_anims/sprites/lock_on.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_LockOn[] = INCBIN_U32("graphics/battle_anims/sprites/lock_on.4bpp.smol"); const u16 gBattleAnimSpritePal_LockOn[] = INCBIN_U16("graphics/battle_anims/sprites/lock_on.gbapal"); -const u32 gBattleAnimSpriteGfx_OpeningEye[] = INCBIN_U32("graphics/battle_anims/sprites/opening_eye.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_OpeningEye[] = INCBIN_U32("graphics/battle_anims/sprites/opening_eye.4bpp.smol"); const u16 gBattleAnimSpritePal_OpeningEye[] = INCBIN_U16("graphics/battle_anims/sprites/opening_eye.gbapal"); -const u32 gBattleAnimSpriteGfx_RoundWhiteHalo[] = INCBIN_U32("graphics/battle_anims/sprites/round_white_halo.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RoundWhiteHalo[] = INCBIN_U32("graphics/battle_anims/sprites/round_white_halo.4bpp.smol"); const u16 gBattleAnimSpritePal_RoundWhiteHalo[] = INCBIN_U16("graphics/battle_anims/sprites/round_white_halo.gbapal"); -const u32 gBattleAnimSpriteGfx_TealAlert[] = INCBIN_U32("graphics/battle_anims/sprites/teal_alert.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_TealAlert[] = INCBIN_U32("graphics/battle_anims/sprites/teal_alert.4bpp.smol"); const u16 gBattleAnimSpritePal_TealAlert[] = INCBIN_U16("graphics/battle_anims/sprites/teal_alert.gbapal"); -const u32 gBattleAnimSpriteGfx_FangAttack[] = INCBIN_U32("graphics/battle_anims/sprites/fang_attack.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_FangAttack[] = INCBIN_U32("graphics/battle_anims/sprites/fang_attack.4bpp.smol"); const u16 gBattleAnimSpritePal_FangAttack[] = INCBIN_U16("graphics/battle_anims/sprites/fang_attack.gbapal"); -const u32 gBattleAnimSpriteGfx_PurpleHandOutline[] = INCBIN_U32("graphics/battle_anims/sprites/purple_hand_outline.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PurpleHandOutline[] = INCBIN_U32("graphics/battle_anims/sprites/purple_hand_outline.4bpp.smol"); const u16 gBattleAnimSpritePal_PurpleHandOutline[] = INCBIN_U16("graphics/battle_anims/sprites/purple_hand_outline.gbapal"); -const u32 gBattleAnimMaskImage_Curse[] = INCBIN_U32("graphics/battle_anims/masks/curse.4bpp.lz"); -const u32 gBattleAnimMaskTilemap_Curse[] = INCBIN_U32("graphics/battle_anims/masks/curse.bin.lz"); +const u32 gBattleAnimMaskImage_Curse[] = INCBIN_U32("graphics/battle_anims/masks/curse.4bpp.smol"); +const u32 gBattleAnimMaskTilemap_Curse[] = INCBIN_U32("graphics/battle_anims/masks/curse.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_Pencil[] = INCBIN_U32("graphics/battle_anims/sprites/pencil.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Pencil[] = INCBIN_U32("graphics/battle_anims/sprites/pencil.4bpp.smol"); const u16 gBattleAnimSpritePal_Pencil[] = INCBIN_U16("graphics/battle_anims/sprites/pencil.gbapal"); -const u32 gBattleAnimSpriteGfx_Spiral[] = INCBIN_U32("graphics/battle_anims/sprites/spiral.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Spiral[] = INCBIN_U32("graphics/battle_anims/sprites/spiral.4bpp.smol"); const u16 gBattleAnimSpritePal_Spiral[] = INCBIN_U16("graphics/battle_anims/sprites/spiral.gbapal"); -const u32 gBattleAnimSpriteGfx_Moon[] = INCBIN_U32("graphics/battle_anims/sprites/moon.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Moon[] = INCBIN_U32("graphics/battle_anims/sprites/moon.4bpp.smol"); const u16 gBattleAnimSpritePal_Moon[] = INCBIN_U16("graphics/battle_anims/sprites/moon.gbapal"); -const u32 gBattleAnimSpriteGfx_GreenSparkle[] = INCBIN_U32("graphics/battle_anims/sprites/green_sparkle.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GreenSparkle[] = INCBIN_U32("graphics/battle_anims/sprites/green_sparkle.4bpp.smol"); const u16 gBattleAnimSpritePal_GreenSparkle[] = INCBIN_U16("graphics/battle_anims/sprites/green_sparkle.gbapal"); -const u32 gBattleAnimSpriteGfx_SnoreZ[] = INCBIN_U32("graphics/battle_anims/sprites/snore_z.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SnoreZ[] = INCBIN_U32("graphics/battle_anims/sprites/snore_z.4bpp.smol"); const u16 gBattleAnimSpritePal_SnoreZ[] = INCBIN_U16("graphics/battle_anims/sprites/snore_z.gbapal"); -const u32 gBattleAnimSpriteGfx_Explosion[] = INCBIN_U32("graphics/battle_anims/sprites/explosion.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Explosion[] = INCBIN_U32("graphics/battle_anims/sprites/explosion.4bpp.smol"); const u16 gBattleAnimSpritePal_Explosion[] = INCBIN_U16("graphics/battle_anims/sprites/explosion.gbapal"); -const u32 gBattleAnimSpriteGfx_Nail[] = INCBIN_U32("graphics/battle_anims/sprites/nail.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Nail[] = INCBIN_U32("graphics/battle_anims/sprites/nail.4bpp.smol"); const u16 gBattleAnimSpritePal_Nail[] = INCBIN_U16("graphics/battle_anims/sprites/nail.gbapal"); -const u32 gBattleAnimSpriteGfx_GhostlySpirit[] = INCBIN_U32("graphics/battle_anims/sprites/ghostly_spirit.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GhostlySpirit[] = INCBIN_U32("graphics/battle_anims/sprites/ghostly_spirit.4bpp.smol"); const u16 gBattleAnimSpritePal_GhostlySpirit[] = INCBIN_U16("graphics/battle_anims/sprites/ghostly_spirit.gbapal"); -const u32 gBattleAnimSpriteGfx_WarmRock[] = INCBIN_U32("graphics/battle_anims/sprites/warm_rock.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WarmRock[] = INCBIN_U32("graphics/battle_anims/sprites/warm_rock.4bpp.smol"); const u16 gBattleAnimSpritePal_WarmRock[] = INCBIN_U16("graphics/battle_anims/sprites/warm_rock.gbapal"); -const u32 gBattleAnimSpriteGfx_PunchImpact[] = INCBIN_U32("graphics/battle_anims/sprites/punch_impact.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PunchImpact[] = INCBIN_U32("graphics/battle_anims/sprites/punch_impact.4bpp.smol"); const u16 gBattleAnimSpritePal_PunchImpact[] = INCBIN_U16("graphics/battle_anims/sprites/punch_impact.gbapal"); -const u32 gBattleAnimSpriteGfx_BreakingEgg[] = INCBIN_U32("graphics/battle_anims/sprites/breaking_egg.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BreakingEgg[] = INCBIN_U32("graphics/battle_anims/sprites/breaking_egg.4bpp.smol"); const u16 gBattleAnimSpritePal_BreakingEgg[] = INCBIN_U16("graphics/battle_anims/sprites/breaking_egg.gbapal"); -const u32 gBattleAnimSpriteGfx_ThinRing[] = INCBIN_U32("graphics/battle_anims/sprites/thin_ring.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ThinRing[] = INCBIN_U32("graphics/battle_anims/sprites/thin_ring.4bpp.smol"); const u16 gBattleAnimSpritePal_ThinRing[] = INCBIN_U16("graphics/battle_anims/sprites/thin_ring.gbapal"); -const u32 gBattleAnimSpriteGfx_MusicNotes2[] = INCBIN_U32("graphics/battle_anims/sprites/music_notes_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MusicNotes2[] = INCBIN_U32("graphics/battle_anims/sprites/music_notes_2.4bpp.smol"); const u16 gBattleAnimSpritePal_MusicNotes2[] = INCBIN_U16("graphics/battle_anims/sprites/music_notes_2.gbapal"); -const u32 gBattleAnimSpriteGfx_Bell[] = INCBIN_U32("graphics/battle_anims/sprites/bell.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Bell[] = INCBIN_U32("graphics/battle_anims/sprites/bell.4bpp.smol"); const u16 gBattleAnimSpritePal_Bell[] = INCBIN_U16("graphics/battle_anims/sprites/bell.gbapal"); -const u32 gBattleAnimSpriteGfx_SpeedDust[] = INCBIN_U32("graphics/battle_anims/sprites/speed_dust.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SpeedDust[] = INCBIN_U32("graphics/battle_anims/sprites/speed_dust.4bpp.smol"); const u16 gBattleAnimSpritePal_SpeedDust[] = INCBIN_U16("graphics/battle_anims/sprites/speed_dust.gbapal"); -const u32 gBattleAnimSpriteGfx_TornMetal[] = INCBIN_U32("graphics/battle_anims/sprites/torn_metal.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_TornMetal[] = INCBIN_U32("graphics/battle_anims/sprites/torn_metal.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_ThoughtBubble[] = INCBIN_U32("graphics/battle_anims/sprites/thought_bubble.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ThoughtBubble[] = INCBIN_U32("graphics/battle_anims/sprites/thought_bubble.4bpp.smol"); const u16 gBattleAnimSpritePal_ThoughtBubble[] = INCBIN_U16("graphics/battle_anims/sprites/thought_bubble.gbapal"); -const u32 gBattleAnimSpriteGfx_Finger[] = INCBIN_U32("graphics/battle_anims/sprites/finger.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Finger[] = INCBIN_U32("graphics/battle_anims/sprites/finger.4bpp.smol"); const u16 gBattleAnimSpritePal_Finger[] = INCBIN_U16("graphics/battle_anims/sprites/finger.gbapal"); -const u32 gBattleAnimSpriteGfx_MagentaHeart[] = INCBIN_U32("graphics/battle_anims/sprites/magenta_heart.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MagentaHeart[] = INCBIN_U32("graphics/battle_anims/sprites/magenta_heart.4bpp.smol"); const u16 gBattleAnimSpritePal_PinkHeart[] = INCBIN_U16("graphics/battle_anims/sprites/pink_heart.gbapal"); const u16 gBattleAnimSpritePal_MagentaHeart[] = INCBIN_U16("graphics/battle_anims/sprites/magenta_heart.gbapal"); const u16 gBattleAnimSpritePal_RedHeart[] = INCBIN_U16("graphics/battle_anims/sprites/red_heart.gbapal"); -const u32 gBattleAnimBgImage_Attract[] = INCBIN_U32("graphics/battle_anims/backgrounds/attract.4bpp.lz"); +const u32 gBattleAnimBgImage_Attract[] = INCBIN_U32("graphics/battle_anims/backgrounds/attract.4bpp.smol"); const u16 gBattleAnimBgPalette_Attract[] = INCBIN_U16("graphics/battle_anims/backgrounds/attract.gbapal"); -const u32 gBattleAnimBgTilemap_Attract[] = INCBIN_U32("graphics/battle_anims/backgrounds/attract.bin.lz"); +const u32 gBattleAnimBgTilemap_Attract[] = INCBIN_U32("graphics/battle_anims/backgrounds/attract.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_RedOrb[] = INCBIN_U32("graphics/battle_anims/sprites/red_orb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RedOrb[] = INCBIN_U32("graphics/battle_anims/sprites/red_orb.4bpp.smol"); const u16 gBattleAnimSpritePal_RedOrb[] = INCBIN_U16("graphics/battle_anims/sprites/red_orb.gbapal"); -const u32 gBattleAnimSpriteGfx_CircleOfLight[] = INCBIN_U32("graphics/battle_anims/sprites/circle_of_light.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_ElectricOrbs[] = INCBIN_U32("graphics/battle_anims/sprites/electric_orbs.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Electricity[] = INCBIN_U32("graphics/battle_anims/sprites/electricity.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_CircleOfLight[] = INCBIN_U32("graphics/battle_anims/sprites/circle_of_light.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_ElectricOrbs[] = INCBIN_U32("graphics/battle_anims/sprites/electric_orbs.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Electricity[] = INCBIN_U32("graphics/battle_anims/sprites/electricity.4bpp.smol"); const u16 gBattleAnimSpritePal_ElectricOrbs[] = INCBIN_U16("graphics/battle_anims/sprites/electric_orbs.gbapal"); -const u32 gBattleAnimSpriteGfx_Finger2[] = INCBIN_U32("graphics/battle_anims/sprites/finger_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Finger2[] = INCBIN_U32("graphics/battle_anims/sprites/finger_2.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_MovementWaves[] = INCBIN_U32("graphics/battle_anims/sprites/movement_waves.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MovementWaves[] = INCBIN_U32("graphics/battle_anims/sprites/movement_waves.4bpp.smol"); const u16 gBattleAnimSpritePal_MovementWaves[] = INCBIN_U16("graphics/battle_anims/sprites/movement_waves.gbapal"); const u16 gBattleAnimBgPalette_ScaryFace[] = INCBIN_U16("graphics/battle_anims/backgrounds/scary_face.gbapal"); -const u32 gBattleAnimBgImage_ScaryFace[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face.4bpp.lz"); +const u32 gBattleAnimBgImage_ScaryFace[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face.4bpp.smol"); const u16 gBattleAnimSpritePal_EyeSparkle[] = INCBIN_U16("graphics/battle_anims/sprites/eye_sparkle.gbapal"); -const u32 gBattleAnimSpriteGfx_EyeSparkle[] = INCBIN_U32("graphics/battle_anims/sprites/eye_sparkle.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_EyeSparkle[] = INCBIN_U32("graphics/battle_anims/sprites/eye_sparkle.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Anger[] = INCBIN_U32("graphics/battle_anims/sprites/anger.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Anger[] = INCBIN_U32("graphics/battle_anims/sprites/anger.4bpp.smol"); const u16 gBattleAnimSpritePal_Anger[] = INCBIN_U16("graphics/battle_anims/sprites/anger.gbapal"); -const u32 gBattleAnimSpriteGfx_Conversion[] = INCBIN_U32("graphics/battle_anims/sprites/conversion.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Conversion[] = INCBIN_U32("graphics/battle_anims/sprites/conversion.4bpp.smol"); const u16 gBattleAnimSpritePal_Conversion[] = INCBIN_U16("graphics/battle_anims/sprites/conversion.gbapal"); const u16 gBattleAnimSpritePal_Angel[] = INCBIN_U16("graphics/battle_anims/sprites/angel.gbapal"); -const u32 gBattleAnimSpriteGfx_Angel[] = INCBIN_U32("graphics/battle_anims/sprites/angel.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Angel[] = INCBIN_U32("graphics/battle_anims/sprites/angel.4bpp.smol"); const u16 gBattleAnimSpritePal_Devil[] = INCBIN_U16("graphics/battle_anims/sprites/devil.gbapal"); -const u32 gBattleAnimSpriteGfx_Devil[] = INCBIN_U32("graphics/battle_anims/sprites/devil.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Devil[] = INCBIN_U32("graphics/battle_anims/sprites/devil.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Swipe[] = INCBIN_U32("graphics/battle_anims/sprites/swipe.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Swipe[] = INCBIN_U32("graphics/battle_anims/sprites/swipe.4bpp.smol"); const u16 gBattleAnimSpritePal_Swipe[] = INCBIN_U16("graphics/battle_anims/sprites/swipe.gbapal"); const u16 gBattleAnimSpritePal_Roots[] = INCBIN_U16("graphics/battle_anims/sprites/roots.gbapal"); -const u32 gBattleAnimSpriteGfx_Roots[] = INCBIN_U32("graphics/battle_anims/sprites/roots.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Roots[] = INCBIN_U32("graphics/battle_anims/sprites/roots.4bpp.smol"); const u16 gBattleAnimSpritePal_ItemBag[] = INCBIN_U16("graphics/battle_anims/sprites/item_bag.gbapal"); -const u32 gBattleAnimSpriteGfx_ItemBag[] = INCBIN_U32("graphics/battle_anims/sprites/item_bag.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ItemBag[] = INCBIN_U32("graphics/battle_anims/sprites/item_bag.4bpp.smol"); const u16 gBattleAnimSpritePal_TriAttackTriangle[] = INCBIN_U16("graphics/battle_anims/sprites/tri_attack_triangle.gbapal"); -const u32 gBattleAnimSpriteGfx_TriAttackTriangle[] = INCBIN_U32("graphics/battle_anims/sprites/tri_attack_triangle.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_TriAttackTriangle[] = INCBIN_U32("graphics/battle_anims/sprites/tri_attack_triangle.4bpp.smol"); const u16 gBattleAnimSpritePal_LetterZ[] = INCBIN_U16("graphics/battle_anims/sprites/letter_z.gbapal"); -const u32 gBattleAnimSpriteGfx_LetterZ[] = INCBIN_U32("graphics/battle_anims/sprites/letter_z.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_LetterZ[] = INCBIN_U32("graphics/battle_anims/sprites/letter_z.4bpp.smol"); const u16 gBattleAnimBgPalette_Impact[] = INCBIN_U16("graphics/battle_anims/backgrounds/impact.gbapal"); -const u32 gBattleAnimBgImage_Impact[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact.4bpp.lz"); -const u32 gBattleAnimBgTilemap_ImpactOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact_opponent.bin.lz"); +const u32 gBattleAnimBgImage_Impact[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact.4bpp.smol"); +const u32 gBattleAnimBgTilemap_ImpactOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact_opponent.bin.smolTM"); -const u32 gBattleAnimBgTilemap_ImpactPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact_player.bin.lz"); -const u32 gBattleAnimBgTilemap_ImpactContests[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact_contests.bin.lz"); +const u32 gBattleAnimBgTilemap_ImpactPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact_player.bin.smolTM"); +const u32 gBattleAnimBgTilemap_ImpactContests[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact_contests.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_JaggedMusicNote[] = INCBIN_U32("graphics/battle_anims/sprites/jagged_music_note.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_JaggedMusicNote[] = INCBIN_U32("graphics/battle_anims/sprites/jagged_music_note.4bpp.smol"); const u16 gBattleAnimSpritePal_JaggedMusicNote[] = INCBIN_U16("graphics/battle_anims/sprites/jagged_music_note.gbapal"); -const u32 gBattleAnimSpriteGfx_Spotlight[] = INCBIN_U32("graphics/battle_anims/sprites/spotlight.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Spotlight[] = INCBIN_U32("graphics/battle_anims/sprites/spotlight.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Pokeball[] = INCBIN_U32("graphics/battle_anims/sprites/pokeball.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Pokeball[] = INCBIN_U32("graphics/battle_anims/sprites/pokeball.4bpp.smol"); const u16 gBattleAnimSpritePal_Pokeball[] = INCBIN_U16("graphics/battle_anims/sprites/pokeball.gbapal"); -const u32 gBattleAnimSpriteGfx_RapidSpin[] = INCBIN_U32("graphics/battle_anims/sprites/rapid_spin.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RapidSpin[] = INCBIN_U32("graphics/battle_anims/sprites/rapid_spin.4bpp.smol"); const u16 gBattleAnimSpritePal_RapidSpin[] = INCBIN_U16("graphics/battle_anims/sprites/rapid_spin.gbapal"); -const u32 gBattleAnimSpriteGfx_MilkBottle[] = INCBIN_U32("graphics/battle_anims/sprites/milk_bottle.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MilkBottle[] = INCBIN_U32("graphics/battle_anims/sprites/milk_bottle.4bpp.smol"); const u16 gBattleAnimSpritePal_MilkBottle[] = INCBIN_U16("graphics/battle_anims/sprites/milk_bottle.gbapal"); -const u32 gBattleAnimSpriteGfx_WispFire[] = INCBIN_U32("graphics/battle_anims/sprites/wisp_fire.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WispFire[] = INCBIN_U32("graphics/battle_anims/sprites/wisp_fire.4bpp.smol"); const u16 gBattleAnimSpritePal_WispOrb[] = INCBIN_U16("graphics/battle_anims/sprites/wisp_orb.gbapal"); -const u32 gBattleAnimSpriteGfx_WispOrb[] = INCBIN_U32("graphics/battle_anims/sprites/wisp_orb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WispOrb[] = INCBIN_U32("graphics/battle_anims/sprites/wisp_orb.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_GoldStars[] = INCBIN_U32("graphics/battle_anims/sprites/gold_stars.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GoldStars[] = INCBIN_U32("graphics/battle_anims/sprites/gold_stars.4bpp.smol"); const u16 gBattleAnimSpritePal_GoldStars[] = INCBIN_U16("graphics/battle_anims/sprites/gold_stars.gbapal"); -const u32 gBattleAnimSpriteGfx_EclipsingOrb[] = INCBIN_U32("graphics/battle_anims/sprites/eclipsing_orb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_EclipsingOrb[] = INCBIN_U32("graphics/battle_anims/sprites/eclipsing_orb.4bpp.smol"); const u16 gBattleAnimSpritePal_EclipsingOrb[] = INCBIN_U16("graphics/battle_anims/sprites/eclipsing_orb.gbapal"); -const u32 gBattleAnimSpriteGfx_PinkPetal[] = INCBIN_U32("graphics/battle_anims/sprites/pink_petal.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PinkPetal[] = INCBIN_U32("graphics/battle_anims/sprites/pink_petal.4bpp.smol"); const u16 gBattleAnimSpritePal_PinkPetal[] = INCBIN_U16("graphics/battle_anims/sprites/pink_petal.gbapal"); -const u32 gBattleAnimSpriteGfx_GrayOrb[] = INCBIN_U32("graphics/battle_anims/sprites/gray_orb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GrayOrb[] = INCBIN_U32("graphics/battle_anims/sprites/gray_orb.4bpp.smol"); const u16 gBattleAnimSpritePal_GrayOrb[] = INCBIN_U16("graphics/battle_anims/sprites/gray_orb.gbapal"); const u16 gBattleAnimSpritePal_BlueOrb[] = INCBIN_U16("graphics/battle_anims/sprites/blue_orb.gbapal"); const u16 gBattleAnimSpritePal_RedOrb2[] = INCBIN_U16("graphics/battle_anims/sprites/red_orb_2.gbapal"); -const u32 gBattleAnimBgImage_Drill[] = INCBIN_U32("graphics/battle_anims/backgrounds/drill.4bpp.lz"); +const u32 gBattleAnimBgImage_Drill[] = INCBIN_U32("graphics/battle_anims/backgrounds/drill.4bpp.smol"); const u16 gBattleAnimBgPalette_Drill[] = INCBIN_U16("graphics/battle_anims/backgrounds/drill.gbapal"); const u16 gBattleAnimBgPalette_Sky[] = INCBIN_U16("graphics/battle_anims/backgrounds/sky.gbapal"); -const u32 gBattleAnimBgTilemap_Drill[] = INCBIN_U32("graphics/battle_anims/backgrounds/drill.bin.lz"); -const u32 gBattleAnimBgTilemap_DrillContests[] = INCBIN_U32("graphics/battle_anims/backgrounds/drill_contests.bin.lz"); +const u32 gBattleAnimBgTilemap_Drill[] = INCBIN_U32("graphics/battle_anims/backgrounds/drill.bin.smolTM"); +const u32 gBattleAnimBgTilemap_DrillContests[] = INCBIN_U32("graphics/battle_anims/backgrounds/drill_contests.bin.smolTM"); -const u32 gBattleAnimBgImage_Aurora[] = INCBIN_U32("graphics/battle_anims/backgrounds/aurora.4bpp.lz"); +const u32 gBattleAnimBgImage_Aurora[] = INCBIN_U32("graphics/battle_anims/backgrounds/aurora.4bpp.smol"); const u16 gBattleAnimBgPalette_Aurora[] = INCBIN_U16("graphics/battle_anims/backgrounds/aurora.gbapal"); -const u32 gBattleAnimBgTilemap_Aurora[] = INCBIN_U32("graphics/battle_anims/backgrounds/aurora.bin.lz"); +const u32 gBattleAnimBgTilemap_Aurora[] = INCBIN_U32("graphics/battle_anims/backgrounds/aurora.bin.smolTM"); -const u32 gBattleAnimBgTilemap_HighspeedOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/highspeed_opponent.bin.lz"); +const u32 gBattleAnimBgTilemap_HighspeedOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/highspeed_opponent.bin.smolTM"); const u16 gBattleAnimBgPalette_Highspeed[] = INCBIN_U16("graphics/battle_anims/backgrounds/highspeed.gbapal"); const u16 gBattleAnimBgPalette_Bug[] = INCBIN_U16("graphics/battle_anims/backgrounds/bug.gbapal"); -const u32 gBattleAnimBgImage_Highspeed[] = INCBIN_U32("graphics/battle_anims/backgrounds/highspeed.4bpp.lz"); -const u32 gBattleAnimBgTilemap_HighspeedPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/highspeed_player.bin.lz"); +const u32 gBattleAnimBgImage_Highspeed[] = INCBIN_U32("graphics/battle_anims/backgrounds/highspeed.4bpp.smol"); +const u32 gBattleAnimBgTilemap_HighspeedPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/highspeed_player.bin.smolTM"); -const u32 gBattleAnimMaskImage_LightBeam[] = INCBIN_U32("graphics/battle_anims/masks/light_beam.4bpp.lz"); +const u32 gBattleAnimMaskImage_LightBeam[] = INCBIN_U32("graphics/battle_anims/masks/light_beam.4bpp.smol"); const u16 gBattleAnimMaskPalette_LightBeam[] = INCBIN_U16("graphics/battle_anims/masks/light_beam.gbapal"); -const u32 gBattleAnimMaskTilemap_LightBeam[] = INCBIN_U32("graphics/battle_anims/masks/light_beam.bin.lz"); +const u32 gBattleAnimMaskTilemap_LightBeam[] = INCBIN_U32("graphics/battle_anims/masks/light_beam.bin.smolTM"); -const u32 gBattleAnimBgTilemap_GuillotineOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine_opponent.bin.lz"); -const u32 gBattleAnimBgTilemap_GuillotinePlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine_player.bin.lz"); -const u32 gBattleAnimBgTilemap_GuillotineContests[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine_contests.bin.lz"); +const u32 gBattleAnimBgTilemap_GuillotineOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine_opponent.bin.smolTM"); +const u32 gBattleAnimBgTilemap_GuillotinePlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine_player.bin.smolTM"); +const u32 gBattleAnimBgTilemap_GuillotineContests[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine_contests.bin.smolTM"); -const u32 gBattleAnimBgImage_Guillotine[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine.4bpp.lz"); +const u32 gBattleAnimBgImage_Guillotine[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine.4bpp.smol"); const u16 gBattleAnimBgPalette_Guillotine[] = INCBIN_U16("graphics/battle_anims/backgrounds/guillotine.gbapal"); -const u32 gBattleAnimBgImage_Thunder[] = INCBIN_U32("graphics/battle_anims/backgrounds/thunder.4bpp.lz"); +const u32 gBattleAnimBgImage_Thunder[] = INCBIN_U32("graphics/battle_anims/backgrounds/thunder.4bpp.smol"); const u16 gBattleAnimBgPalette_Thunder[] = INCBIN_U16("graphics/battle_anims/backgrounds/thunder.gbapal"); -const u32 gBattleAnimBgTilemap_Thunder[] = INCBIN_U32("graphics/battle_anims/backgrounds/thunder.bin.lz"); +const u32 gBattleAnimBgTilemap_Thunder[] = INCBIN_U32("graphics/battle_anims/backgrounds/thunder.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_PainSplit[] = INCBIN_U32("graphics/battle_anims/sprites/pain_split.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PainSplit[] = INCBIN_U32("graphics/battle_anims/sprites/pain_split.4bpp.smol"); const u16 gBattleAnimSpritePal_PainSplit[] = INCBIN_U16("graphics/battle_anims/sprites/pain_split.gbapal"); -const u32 gBattleAnimSpriteGfx_HandsAndFeet[] = INCBIN_U32("graphics/battle_anims/sprites/hands_and_feet.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HandsAndFeet[] = INCBIN_U32("graphics/battle_anims/sprites/hands_and_feet.4bpp.smol"); const u16 gBattleAnimSpritePal_HandsAndFeet[] = INCBIN_U16("graphics/battle_anims/sprites/hands_and_feet.gbapal"); -const u32 gBattleAnimSpriteGfx_Confetti[] = INCBIN_U32("graphics/battle_anims/sprites/confetti.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Confetti[] = INCBIN_U32("graphics/battle_anims/sprites/confetti.4bpp.smol"); const u16 gBattleAnimSpritePal_Confetti[] = INCBIN_U16("graphics/battle_anims/sprites/confetti.gbapal"); -const u32 gBattleAnimSpriteGfx_Substitute[] = INCBIN_U32("graphics/battle_anims/sprites/substitute.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_SubstituteBack[] = INCBIN_U32("graphics/battle_anims/sprites/substitute_back.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Substitute[] = INCBIN_U32("graphics/battle_anims/sprites/substitute.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_SubstituteBack[] = INCBIN_U32("graphics/battle_anims/sprites/substitute_back.4bpp.smol"); const u16 gBattleAnimSpritePal_Substitute[] = INCBIN_U16("graphics/battle_anims/sprites/substitute.gbapal"); -const u32 gBattleAnimSpriteGfx_GreenStar[] = INCBIN_U32("graphics/battle_anims/sprites/green_star.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GreenStar[] = INCBIN_U32("graphics/battle_anims/sprites/green_star.4bpp.smol"); const u16 gBattleAnimSpritePal_GreenStar[] = INCBIN_U16("graphics/battle_anims/sprites/green_star.gbapal"); -const u32 gConfetti_Gfx[] = INCBIN_U32("graphics/misc/confetti.4bpp.lz"); +const u32 gConfetti_Gfx[] = INCBIN_U32("graphics/misc/confetti.4bpp.smol"); const u16 gConfetti_Pal[] = INCBIN_U16("graphics/misc/confetti.gbapal"); -const u32 gBattleAnimSpriteGfx_PinkCloud[] = INCBIN_U32("graphics/battle_anims/sprites/pink_cloud.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PinkCloud[] = INCBIN_U32("graphics/battle_anims/sprites/pink_cloud.4bpp.smol"); const u16 gBattleAnimSpritePal_PinkCloud[] = INCBIN_U16("graphics/battle_anims/sprites/pink_cloud.gbapal"); -const u32 gBattleAnimSpriteGfx_SweatDrop[] = INCBIN_U32("graphics/battle_anims/sprites/sweat_drop.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SweatDrop[] = INCBIN_U32("graphics/battle_anims/sprites/sweat_drop.4bpp.smol"); const u16 gBattleAnimSpritePal_SweatDrop[] = INCBIN_U16("graphics/battle_anims/sprites/sweat_drop.gbapal"); -const u32 gStatAnim_Gfx[] = INCBIN_U32("graphics/battle_anims/stat_change/tiles.4bpp.lz"); -const u32 gStatAnim_Increase_Tilemap[] = INCBIN_U32("graphics/battle_anims/stat_change/increase.bin.lz"); -const u32 gStatAnim_Decrease_Tilemap[] = INCBIN_U32("graphics/battle_anims/stat_change/decrease.bin.lz"); +const u32 gStatAnim_Gfx[] = INCBIN_U32("graphics/battle_anims/stat_change/tiles.4bpp.smol"); +const u32 gStatAnim_Increase_Tilemap[] = INCBIN_U32("graphics/battle_anims/stat_change/increase.bin.smolTM"); +const u32 gStatAnim_Decrease_Tilemap[] = INCBIN_U32("graphics/battle_anims/stat_change/decrease.bin.smolTM"); const u16 gStatAnim_Defense_Pal[] = INCBIN_U16("graphics/battle_anims/stat_change/defense.gbapal"); const u16 gStatAnim_Attack_Pal[] = INCBIN_U16("graphics/battle_anims/stat_change/attack.gbapal"); const u16 gStatAnim_Accuracy_Pal[] = INCBIN_U16("graphics/battle_anims/stat_change/accuracy.gbapal"); @@ -1234,93 +1246,93 @@ const u16 gStatAnim_Evasion_Pal[] = INCBIN_U16("graphics/battle_anims/stat_ const u16 gStatAnim_SpAttack_Pal[] = INCBIN_U16("graphics/battle_anims/stat_change/sp_attack.gbapal"); const u16 gStatAnim_SpDefense_Pal[] = INCBIN_U16("graphics/battle_anims/stat_change/sp_defense.gbapal"); -const u32 gCureBubblesGfx[] = INCBIN_U32("graphics/battle_anims/masks/cure_bubbles.4bpp.lz"); +const u32 gCureBubblesGfx[] = INCBIN_U32("graphics/battle_anims/masks/cure_bubbles.4bpp.smol"); const u16 gCureBubblesPal[] = INCBIN_U16("graphics/battle_anims/masks/cure_bubbles.gbapal"); -const u32 gCureBubblesTilemap[] = INCBIN_U32("graphics/battle_anims/masks/cure_bubbles.bin.lz"); +const u32 gCureBubblesTilemap[] = INCBIN_U32("graphics/battle_anims/masks/cure_bubbles.bin.smolTM"); const u16 gBattleAnimSpritePal_PurpleScratch[] = INCBIN_U16("graphics/battle_anims/sprites/purple_scratch.gbapal"); -const u32 gBattleAnimSpriteGfx_PurpleScratch[] = INCBIN_U32("graphics/battle_anims/sprites/purple_scratch.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PurpleScratch[] = INCBIN_U32("graphics/battle_anims/sprites/purple_scratch.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_PurpleSwipe[] = INCBIN_U32("graphics/battle_anims/sprites/purple_swipe.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PurpleSwipe[] = INCBIN_U32("graphics/battle_anims/sprites/purple_swipe.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_GuardRing[] = INCBIN_U32("graphics/battle_anims/sprites/guard_ring.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GuardRing[] = INCBIN_U32("graphics/battle_anims/sprites/guard_ring.4bpp.smol"); const u16 gBattleAnimSpritePal_GuardRing[] = INCBIN_U16("graphics/battle_anims/sprites/guard_ring.gbapal"); -const u32 gBattleAnimSpriteGfx_TagHand[] = INCBIN_U32("graphics/battle_anims/sprites/tag_hand.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_TagHand[] = INCBIN_U32("graphics/battle_anims/sprites/tag_hand.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_NoiseLine[] = INCBIN_U32("graphics/battle_anims/sprites/noise_line.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NoiseLine[] = INCBIN_U32("graphics/battle_anims/sprites/noise_line.4bpp.smol"); -const u32 UnusedLevelupAnimationGfx[] = INCBIN_U32("graphics/battle_anims/masks/unused_level_up.4bpp.lz"); -const u32 UnusedLevelupAnimationTilemap[] = INCBIN_U32("graphics/battle_anims/masks/unused_level_up.bin.lz"); +const u32 UnusedLevelupAnimationGfx[] = INCBIN_U32("graphics/battle_anims/masks/unused_level_up.4bpp.smol"); +const u32 UnusedLevelupAnimationTilemap[] = INCBIN_U32("graphics/battle_anims/masks/unused_level_up.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_SmallRedEye[] = INCBIN_U32("graphics/battle_anims/sprites/small_red_eye.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SmallRedEye[] = INCBIN_U32("graphics/battle_anims/sprites/small_red_eye.4bpp.smol"); const u16 gBattleAnimSpritePal_SmallRedEye[] = INCBIN_U16("graphics/battle_anims/sprites/small_red_eye.gbapal"); -const u32 gBattleAnimSpriteGfx_HollowOrb[] = INCBIN_U32("graphics/battle_anims/sprites/hollow_orb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HollowOrb[] = INCBIN_U32("graphics/battle_anims/sprites/hollow_orb.4bpp.smol"); const u16 gBattleAnimSpritePal_HollowOrb[] = INCBIN_U16("graphics/battle_anims/sprites/hollow_orb.gbapal"); -const u32 gBattleAnimSpriteGfx_XSign[] = INCBIN_U32("graphics/battle_anims/sprites/x_sign.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_XSign[] = INCBIN_U32("graphics/battle_anims/sprites/x_sign.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_BluegreenOrb[] = INCBIN_U32("graphics/battle_anims/sprites/bluegreen_orb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BluegreenOrb[] = INCBIN_U32("graphics/battle_anims/sprites/bluegreen_orb.4bpp.smol"); const u16 gBattleAnimSpritePal_BluegreenOrb[] = INCBIN_U16("graphics/battle_anims/sprites/bluegreen_orb.gbapal"); -const u32 gBattleAnimSpriteGfx_PinkVioletOrb[] = INCBIN_U32("graphics/battle_anims/sprites/pinkvio_orb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PinkVioletOrb[] = INCBIN_U32("graphics/battle_anims/sprites/pinkvio_orb.4bpp.smol"); const u16 gBattleAnimSpritePal_PinkVioletOrb[] = INCBIN_U16("graphics/battle_anims/sprites/pinkvio_orb.gbapal"); -const u32 gBattleAnimSpriteGfx_PawPrint[] = INCBIN_U32("graphics/battle_anims/sprites/paw_print.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PawPrint[] = INCBIN_U32("graphics/battle_anims/sprites/paw_print.4bpp.smol"); const u16 gBattleAnimSpritePal_PawPrint[] = INCBIN_U16("graphics/battle_anims/sprites/paw_print.gbapal"); -const u32 gBattleAnimSpriteGfx_PurpleFlame[] = INCBIN_U32("graphics/battle_anims/sprites/purple_flame.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PurpleFlame[] = INCBIN_U32("graphics/battle_anims/sprites/purple_flame.4bpp.smol"); const u16 gBattleAnimSpritePal_PurpleFlame[] = INCBIN_U16("graphics/battle_anims/sprites/purple_flame.gbapal"); -const u32 gBattleAnimSpriteGfx_RedBall[] = INCBIN_U32("graphics/battle_anims/sprites/red_ball.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RedBall[] = INCBIN_U32("graphics/battle_anims/sprites/red_ball.4bpp.smol"); const u16 gBattleAnimSpritePal_RedBall[] = INCBIN_U16("graphics/battle_anims/sprites/red_ball.gbapal"); -const u32 gBattleAnimSpriteGfx_SmellingsaltEffect[] = INCBIN_U32("graphics/battle_anims/sprites/smellingsalt_effect.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SmellingsaltEffect[] = INCBIN_U32("graphics/battle_anims/sprites/smellingsalt_effect.4bpp.smol"); const u16 gBattleAnimSpritePal_SmellingsaltEffect[] = INCBIN_U16("graphics/battle_anims/sprites/smellingsalt_effect.gbapal"); -const u32 gBattleAnimSpriteGfx_MagnifyingGlass[] = INCBIN_U32("graphics/battle_anims/sprites/magnifying_glass.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MagnifyingGlass[] = INCBIN_U32("graphics/battle_anims/sprites/magnifying_glass.4bpp.smol"); const u16 gBattleAnimSpritePal_MagnifyingGlass[] = INCBIN_U16("graphics/battle_anims/sprites/magnifying_glass.gbapal"); -const u32 gBattleAnimSpriteGfx_Meteor[] = INCBIN_U32("graphics/battle_anims/sprites/meteor.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Meteor[] = INCBIN_U32("graphics/battle_anims/sprites/meteor.4bpp.smol"); const u16 gBattleAnimSpritePal_Meteor[] = INCBIN_U16("graphics/battle_anims/sprites/meteor.gbapal"); -const u32 gBattleAnimSpriteGfx_FlatRock[] = INCBIN_U32("graphics/battle_anims/sprites/flat_rock.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_FlatRock[] = INCBIN_U32("graphics/battle_anims/sprites/flat_rock.4bpp.smol"); const u16 gBattleAnimSpritePal_FlatRock[] = INCBIN_U16("graphics/battle_anims/sprites/flat_rock.gbapal"); -const u32 gBattleAnimSpriteGfx_TeraStarstormBeam[] = INCBIN_U32("graphics/battle_anims/sprites/starstorm_beam.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_TeraStarstormBeam[] = INCBIN_U32("graphics/battle_anims/sprites/starstorm_beam.4bpp.smol"); const u16 gBattleAnimSpritePal_TeraStarstormBeam[] = INCBIN_U16("graphics/battle_anims/sprites/starstorm_beam.gbapal"); -const u32 gBattleAnimSpriteGfx_SaltParticle[] = INCBIN_U32("graphics/battle_anims/sprites/salt_particle.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SaltParticle[] = INCBIN_U32("graphics/battle_anims/sprites/salt_particle.4bpp.smol"); const u16 gBattleAnimSpritePal_SaltParticle[] = INCBIN_U16("graphics/battle_anims/sprites/salt_particle.gbapal"); const u16 gBattleAnimUnusedPal_Unknown2[] = INCBIN_U16("graphics/battle_anims/unused/unknown_2.gbapal"); #include "data/graphics/trainers.h" -const u32 gBattleVSFrame_Gfx[] = INCBIN_U32("graphics/battle_transitions/vs_frame.4bpp.lz"); -const u32 gBattleVSFrame_Tilemap[] = INCBIN_U32("graphics/battle_transitions/vs_frame.bin.lz"); +const u32 gBattleVSFrame_Gfx[] = INCBIN_U32("graphics/battle_transitions/vs_frame.4bpp.smol"); +const u32 gBattleVSFrame_Tilemap[] = INCBIN_U32("graphics/battle_transitions/vs_frame.bin.smolTM"); const u16 gBattleVSFrame_Pal[] = INCBIN_U16("graphics/battle_transitions/vs_frame.gbapal"); -const u32 gVsLettersGfx[] = INCBIN_U32("graphics/battle_transitions/vs.4bpp.lz"); +const u32 gVsLettersGfx[] = INCBIN_U32("graphics/battle_transitions/vs.4bpp.smol"); #include "data/graphics/battle_environment.h" // Battle Dome -const u32 gDomeTourneyTree_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_tree.4bpp.lz"); -const u32 gDomeTourneyLine_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_line.4bpp.lz"); // the red glow mask for the tourney advancement lines -const u32 gDomeTourneyTree_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_tree.bin.lz"); -const u32 gDomeTourneyLineDown_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_line_down_map.bin.lz"); -const u32 gDomeTourneyLineUp_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_line_up_map.bin.lz"); -const u32 gDomeTourneyInfoCard_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_info_card.4bpp.lz"); -const u32 gDomeTourneyInfoCard_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_info_card_tilemap.bin.lz"); -const u32 gDomeTourneyInfoCardBg_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_info_card_bg.bin.lz"); -const u32 gDomeTourneyTreeButtons_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_buttons.4bpp.lz"); // exit/cancel and PokΓ© Ball buttons +const u32 gDomeTourneyTree_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_tree.4bpp.smol"); +const u32 gDomeTourneyLine_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_line.4bpp.smol"); // the red glow mask for the tourney advancement lines +const u32 gDomeTourneyTree_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_tree.bin.smolTM"); +const u32 gDomeTourneyLineDown_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_line_down_map.bin.smolTM"); +const u32 gDomeTourneyLineUp_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_line_up_map.bin.smolTM"); +const u32 gDomeTourneyInfoCard_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_info_card.4bpp.smol"); +const u32 gDomeTourneyInfoCard_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_info_card_tilemap.bin.smolTM"); +const u32 gDomeTourneyInfoCardBg_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_info_card_bg.bin.smolTM"); +const u32 gDomeTourneyTreeButtons_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_buttons.4bpp.smol"); // exit/cancel and PokΓ© Ball buttons const u16 gDomeTourneyTree_Pal[] = INCBIN_U16("graphics/battle_frontier/tourney_tree.gbapal"); const u16 gDomeTourneyTreeButtons_Pal[] = INCBIN_U16("graphics/battle_frontier/tourney_buttons.gbapal"); const u16 gDomeTourneyMatchCardBg_Pal[] = INCBIN_U16("graphics/battle_frontier/tourney_match_card_bg.gbapal"); -const u32 gBattleArenaJudgmentSymbolsGfx[] = INCBIN_U32("graphics/battle_frontier/arena_judgment_symbols.4bpp.lz"); +const u32 gBattleArenaJudgmentSymbolsGfx[] = INCBIN_U32("graphics/battle_frontier/arena_judgment_symbols.4bpp.smol"); const u16 gBattleArenaJudgmentSymbolsPalette[] = INCBIN_U16("graphics/battle_frontier/arena_judgment_symbols.gbapal"); const u16 gBattleWindowTextPalette[] = INCBIN_U16("graphics/battle_interface/text.gbapal"); @@ -1335,407 +1347,409 @@ static const u16 sUnused0[] = {0x13F, 0x119, 0x113, 0x10E}; const u16 gBattlePyramidFloor_Pal[][16] = INCBIN_U16("graphics/battle_frontier/pyramid_floor.gbapal"); -const u32 gMultiBattleIntroBg_Opponent_Tilemap[] = INCBIN_U32("graphics/battle_frontier/multi_battle_intro_bg_opponent.bin.lz"); -const u32 gMultiBattleIntroBg_Player_Tilemap[] = INCBIN_U32("graphics/battle_frontier/multi_battle_intro_bg_player.bin.lz"); +const u32 gMultiBattleIntroBg_Opponent_Tilemap[] = INCBIN_U32("graphics/battle_frontier/multi_battle_intro_bg_opponent.bin.smolTM"); +const u32 gMultiBattleIntroBg_Player_Tilemap[] = INCBIN_U32("graphics/battle_frontier/multi_battle_intro_bg_player.bin.smolTM"); #include "data/graphics/intro_scene.h" -const u32 gBattleAnimSpriteGfx_FlyingDirt[] = INCBIN_U32("graphics/battle_anims/sprites/flying_dirt.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_FlyingDirt[] = INCBIN_U32("graphics/battle_anims/sprites/flying_dirt.4bpp.smol"); const u16 gBattleAnimSpritePal_FlyingDirt[] = INCBIN_U16("graphics/battle_anims/sprites/flying_dirt.gbapal"); -const u32 gBattleAnimBgTilemap_Sandstorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/sandstorm_brew.bin.lz"); -const u32 gBattleAnimBgImage_Sandstorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/sandstorm_brew.4bpp.lz"); +const u32 gBattleAnimBgTilemap_Sandstorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/sandstorm_brew.bin.smolTM"); +const u32 gBattleAnimBgImage_Sandstorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/sandstorm_brew.4bpp.smol"); const u16 gBattleAnimSpritePal_Windstorm[] = INCBIN_U16("graphics/battle_anims/backgrounds/windstorm_brew.gbapal"); -const u32 gBattleAnimSpriteGfx_MetalSoundWaves[] = INCBIN_U32("graphics/battle_anims/sprites/metal_sound_waves.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MetalSoundWaves[] = INCBIN_U32("graphics/battle_anims/sprites/metal_sound_waves.4bpp.smol"); const u16 gBattleAnimSpritePal_MetalSoundWaves[] = INCBIN_U16("graphics/battle_anims/sprites/metal_sound_waves.gbapal"); -const u32 gBattleAnimBgImage_Ice[] = INCBIN_U32("graphics/battle_anims/backgrounds/ice.4bpp.lz"); +const u32 gBattleAnimBgImage_Ice[] = INCBIN_U32("graphics/battle_anims/backgrounds/ice.4bpp.smol"); const u16 gBattleAnimBgPalette_Ice[] = INCBIN_U16("graphics/battle_anims/backgrounds/ice.gbapal"); -const u32 gBattleAnimBgTilemap_Ice[] = INCBIN_U32("graphics/battle_anims/backgrounds/ice.bin.lz"); +const u32 gBattleAnimBgTilemap_Ice[] = INCBIN_U32("graphics/battle_anims/backgrounds/ice.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_IcicleSpear[] = INCBIN_U32("graphics/battle_anims/sprites/icicle_spear.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_IcicleSpear[] = INCBIN_U32("graphics/battle_anims/sprites/icicle_spear.4bpp.smol"); const u16 gBattleAnimSpritePal_IcicleSpear[] = INCBIN_U16("graphics/battle_anims/sprites/icicle_spear.gbapal"); -const u32 gContestNextTurnGfx[] = INCBIN_U32("graphics/contest/nextturn.4bpp.lz"); +const u32 gContestNextTurnGfx[] = INCBIN_U32("graphics/contest/nextturn.4bpp.smol"); const u8 gContestNextTurnNumbersGfx[] = INCBIN_U8("graphics/contest/nextturn_numbers.4bpp"); const u8 gContestNextTurnRandomGfx[] = INCBIN_U8("graphics/contest/nextturn_random.4bpp"); -const u32 gBattleAnimSpriteGfx_GlowyRedOrb[] = INCBIN_U32("graphics/battle_anims/sprites/glowy_red_orb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GlowyRedOrb[] = INCBIN_U32("graphics/battle_anims/sprites/glowy_red_orb.4bpp.smol"); const u16 gBattleAnimSpritePal_GlowyRedOrb[] = INCBIN_U16("graphics/battle_anims/sprites/glowy_red_orb.gbapal"); const u16 gBattleAnimSpritePal_GlowyGreenOrb[] = INCBIN_U16("graphics/battle_anims/sprites/glowy_green_orb.gbapal"); const u16 gBattleAnimSpritePal_SleepPowder[] = INCBIN_U16("graphics/battle_anims/sprites/sleep_powder.gbapal"); const u16 gBattleAnimSpritePal_StunSpore[] = INCBIN_U16("graphics/battle_anims/sprites/stun_spore.gbapal"); -const u32 gContestApplauseGfx[] = INCBIN_U32("graphics/contest/applause.4bpp.lz"); +const u32 gContestApplauseGfx[] = INCBIN_U32("graphics/contest/applause.4bpp.smol"); const u8 gContestApplauseMeterGfx[] = INCBIN_U8("graphics/contest/applause_meter.4bpp"); const u16 gContestPal[] = INCBIN_U16("graphics/contest/nextturn.gbapal"); -const u32 gBattleAnimSpriteGfx_Splash[] = INCBIN_U32("graphics/battle_anims/sprites/splash.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Splash[] = INCBIN_U32("graphics/battle_anims/sprites/splash.4bpp.smol"); const u16 gBattleAnimSpritePal_Splash[] = INCBIN_U16("graphics/battle_anims/sprites/splash.gbapal"); -const u32 gBattleAnimSpriteGfx_SweatBead[] = INCBIN_U32("graphics/battle_anims/sprites/sweat_bead.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SweatBead[] = INCBIN_U32("graphics/battle_anims/sprites/sweat_bead.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Pokeblock[] = INCBIN_U32("graphics/battle_anims/sprites/pokeblock.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Pokeblock[] = INCBIN_U32("graphics/battle_anims/sprites/pokeblock.4bpp.smol"); const u16 gBattleAnimSpritePal_Pokeblock[] = INCBIN_U16("graphics/battle_anims/sprites/pokeblock.gbapal"); -const u32 gBattleAnimSpriteGfx_Gem1[] = INCBIN_U32("graphics/battle_anims/sprites/gem_1.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Gem2[] = INCBIN_U32("graphics/battle_anims/sprites/gem_2.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Gem3[] = INCBIN_U32("graphics/battle_anims/sprites/gem_3.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Gem1[] = INCBIN_U32("graphics/battle_anims/sprites/gem_1.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Gem2[] = INCBIN_U32("graphics/battle_anims/sprites/gem_2.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Gem3[] = INCBIN_U32("graphics/battle_anims/sprites/gem_3.4bpp.smol"); const u16 gBattleAnimSpritePal_Gem1[] = INCBIN_U16("graphics/battle_anims/sprites/gem_1.gbapal"); -const u32 gBattleAnimBgImage_InAir[] = INCBIN_U32("graphics/battle_anims/backgrounds/in_air.4bpp.lz"); +const u32 gBattleAnimBgImage_InAir[] = INCBIN_U32("graphics/battle_anims/backgrounds/in_air.4bpp.smol"); const u16 gBattleAnimBgPalette_InAir[] = INCBIN_U16("graphics/battle_anims/backgrounds/in_air.gbapal"); -const u32 gBattleAnimBgTilemap_InAir[] = INCBIN_U32("graphics/battle_anims/backgrounds/in_air.bin.lz"); +const u32 gBattleAnimBgTilemap_InAir[] = INCBIN_U32("graphics/battle_anims/backgrounds/in_air.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_Protect[] = INCBIN_U32("graphics/battle_anims/sprites/protect.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Protect[] = INCBIN_U32("graphics/battle_anims/sprites/protect.4bpp.smol"); const u16 gBattleAnimSpritePal_Protect[] = INCBIN_U16("graphics/battle_anims/sprites/protect.gbapal"); const u16 gBattleAnimBackgroundImageMuddyWater_Pal[] = INCBIN_U16("graphics/battle_anims/backgrounds/water_muddy.gbapal"); -const u32 gEnemyMonShadow_Gfx[] = INCBIN_U32("graphics/battle_interface/enemy_mon_shadow.4bpp.lz"); -const u32 gEnemyMonShadowsSized_Gfx[] = INCBIN_U32("graphics/battle_interface/enemy_mon_shadows_sized.4bpp.lz"); +const u32 gEnemyMonShadow_Gfx[] = INCBIN_U32("graphics/battle_interface/enemy_mon_shadow.4bpp.smol"); +const u32 gEnemyMonShadowsSized_Gfx[] = INCBIN_U32("graphics/battle_interface/enemy_mon_shadows_sized.4bpp.smol"); -const u32 gBattleInterface_BallStatusBarGfx[] = INCBIN_U32("graphics/battle_interface/ball_status_bar.4bpp.lz"); +const u32 gBattleInterface_BallStatusBarGfx[] = INCBIN_U32("graphics/battle_interface/ball_status_bar.4bpp.smol"); -const u32 gBattleAnimBgImage_Ghost[] = INCBIN_U32("graphics/battle_anims/backgrounds/ghost.4bpp.lz"); +const u32 gBattleAnimBgImage_Ghost[] = INCBIN_U32("graphics/battle_anims/backgrounds/ghost.4bpp.smol"); const u16 gBattleAnimBgPalette_Ghost[] = INCBIN_U16("graphics/battle_anims/backgrounds/ghost.gbapal"); -const u32 gBattleAnimBgTilemap_Ghost[] = INCBIN_U32("graphics/battle_anims/backgrounds/ghost.bin.lz"); +const u32 gBattleAnimBgTilemap_Ghost[] = INCBIN_U32("graphics/battle_anims/backgrounds/ghost.bin.smolTM"); const u16 gBattleAnimSpritePal_WhipHit[] = INCBIN_U16("graphics/battle_anims/sprites/whip_hit.gbapal"); const u16 gBattleAnimBgPalette_SolarBeam[] = INCBIN_U16("graphics/battle_anims/backgrounds/solarbeam.gbapal"); -const u32 gBattleAnimBgTilemap_SolarBeam[] = INCBIN_U32("graphics/battle_anims/backgrounds/solarbeam.bin.lz"); // Unused +const u32 gBattleAnimBgTilemap_SolarBeam[] = INCBIN_U32("graphics/battle_anims/backgrounds/solarbeam.bin.smolTM"); // Unused const u16 gBattleAnimBgPalette_MagmaStorm[] = INCBIN_U16("graphics/battle_anims/backgrounds/magma_storm.gbapal"); //new battle bgs -const u32 gBattleAnimBgImage_Hurricane[] = INCBIN_U32("graphics/battle_anims/backgrounds/hurricane.4bpp.lz"); +const u32 gBattleAnimBgImage_Hurricane[] = INCBIN_U32("graphics/battle_anims/backgrounds/hurricane.4bpp.smol"); const u16 gBattleAnimBgPalette_Hurricane[] = INCBIN_U16("graphics/battle_anims/backgrounds/hurricane.gbapal"); -const u32 gBattleAnimBgTilemap_Hurricane[] = INCBIN_U32("graphics/battle_anims/backgrounds/hurricane.bin.lz"); +const u32 gBattleAnimBgTilemap_Hurricane[] = INCBIN_U32("graphics/battle_anims/backgrounds/hurricane.bin.smolTM"); const u16 gBattleAnimBgPalette_RockWrecker[] = INCBIN_U16("graphics/battle_anims/backgrounds/rock_wrecker.gbapal"); -const u32 gBattleAnimBgTilemap_GigaImpactPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/giga_impact_player.bin.lz"); -const u32 gBattleAnimBgTilemap_GigaImpactOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/giga_impact_opponent.bin.lz"); -const u32 gBattleAnimBgTilemap_GigaImpactContest[] = INCBIN_U32("graphics/battle_anims/backgrounds/giga_impact_contest.bin.lz"); -const u32 gBattleAnimBgImage_GigaImpact[] = INCBIN_U32("graphics/battle_anims/backgrounds/giga_impact.4bpp.lz"); -const u32 gBattleAnimBgImage_GigaImpactContest[] = INCBIN_U32("graphics/battle_anims/backgrounds/giga_impact_contest.4bpp.lz"); +const u32 gBattleAnimBgTilemap_GigaImpactPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/giga_impact_player.bin.smolTM"); +const u32 gBattleAnimBgTilemap_GigaImpactOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/giga_impact_opponent.bin.smolTM"); +const u32 gBattleAnimBgTilemap_GigaImpactContest[] = INCBIN_U32("graphics/battle_anims/backgrounds/giga_impact_contest.bin.smolTM"); +const u32 gBattleAnimBgImage_GigaImpact[] = INCBIN_U32("graphics/battle_anims/backgrounds/giga_impact.4bpp.smol"); +const u32 gBattleAnimBgImage_GigaImpactContest[] = INCBIN_U32("graphics/battle_anims/backgrounds/giga_impact_contest.4bpp.smol"); const u16 gBattleAnimBgPalette_GigaImpact[] = INCBIN_U16("graphics/battle_anims/backgrounds/giga_impact.gbapal"); -const u32 gBattleAnimBgImage_SpacialRend[] = INCBIN_U32("graphics/battle_anims/backgrounds/spacial_rend.4bpp.lz"); +const u32 gBattleAnimBgImage_SpacialRend[] = INCBIN_U32("graphics/battle_anims/backgrounds/spacial_rend.4bpp.smol"); const u16 gBattleAnimBgPalette_SpacialRend[] = INCBIN_U16("graphics/battle_anims/backgrounds/spacial_rend.gbapal"); const u16 gBattleAnimBgPalette_SludgeWave[] = INCBIN_U16("graphics/battle_anims/backgrounds/sludge_wave.gbapal"); -const u32 gBattleAnimBgImage_Aeroblast[] = INCBIN_U32("graphics/battle_anims/backgrounds/aeroblast_tiles.4bpp.lz"); +const u32 gBattleAnimBgImage_Aeroblast[] = INCBIN_U32("graphics/battle_anims/backgrounds/aeroblast_tiles.4bpp.smol"); const u16 gBattleAnimBgPalette_Aeroblast[] = INCBIN_U16("graphics/battle_anims/backgrounds/aeroblast.gbapal"); -const u32 gBattleAnimBgTilemap_Aeroblast[] = INCBIN_U32("graphics/battle_anims/backgrounds/aeroblast_map.bin.lz"); +const u32 gBattleAnimBgTilemap_Aeroblast[] = INCBIN_U32("graphics/battle_anims/backgrounds/aeroblast_map.bin.smolTM"); const u16 gBattleAnimBgPalette_AuraSphere[] = INCBIN_U16("graphics/battle_anims/backgrounds/aura_sphere.gbapal"); -const u32 gBattleAnimBgImage_BlackholeEclipse[] = INCBIN_U32("graphics/battle_anims/backgrounds/blackhole_eclipse.4bpp.lz"); +const u32 gBattleAnimBgImage_BlackholeEclipse[] = INCBIN_U32("graphics/battle_anims/backgrounds/blackhole_eclipse.4bpp.smol"); const u16 gBattleAnimBgPalette_BlackholeEclipse[] = INCBIN_U16("graphics/battle_anims/backgrounds/blackhole_eclipse.gbapal"); -const u32 gBattleAnimBgTilemap_BlackholeEclipse[] = INCBIN_U32("graphics/battle_anims/backgrounds/blackhole_eclipse.bin.lz"); +const u32 gBattleAnimBgTilemap_BlackholeEclipse[] = INCBIN_U32("graphics/battle_anims/backgrounds/blackhole_eclipse.bin.smolTM"); -const u32 gBattleAnimBgImage_BloomDoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/bloom_doom.4bpp.lz"); +const u32 gBattleAnimBgImage_BloomDoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/bloom_doom.4bpp.smol"); const u16 gBattleAnimBgPalette_BloomDoom[] = INCBIN_U16("graphics/battle_anims/backgrounds/bloom_doom.gbapal"); -const u32 gBattleAnimBgTilemap_BloomDoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/bloom_doom.bin.lz"); +const u32 gBattleAnimBgTilemap_BloomDoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/bloom_doom.bin.smolTM"); -const u32 gBattleAnimBgImage_BoltStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/bolt_strike.4bpp.lz"); +const u32 gBattleAnimBgImage_BoltStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/bolt_strike.4bpp.smol"); const u16 gBattleAnimBgPalette_BoltStrike[] = INCBIN_U16("graphics/battle_anims/backgrounds/bolt_strike.gbapal"); -const u32 gBattleAnimBgTilemap_BoltStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/bolt_strike.bin.lz"); +const u32 gBattleAnimBgTilemap_BoltStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/bolt_strike.bin.smolTM"); -const u32 gBattleAnimBgImage_ClangorousSoulblaze[] = INCBIN_U32("graphics/battle_anims/backgrounds/clangorous_soulblaze.4bpp.lz"); +const u32 gBattleAnimBgImage_ClangorousSoulblaze[] = INCBIN_U32("graphics/battle_anims/backgrounds/clangorous_soulblaze.4bpp.smol"); const u16 gBattleAnimBgPalette_ClangorousSoulblaze[] = INCBIN_U16("graphics/battle_anims/backgrounds/clangorous_soulblaze.gbapal"); -const u32 gBattleAnimBgTilemap_ClangorousSoulblaze[] = INCBIN_U32("graphics/battle_anims/backgrounds/clangorous_soulblaze.bin.lz"); +const u32 gBattleAnimBgTilemap_ClangorousSoulblaze[] = INCBIN_U32("graphics/battle_anims/backgrounds/clangorous_soulblaze.bin.smolTM"); const u16 gBattleAnimBgPalette_DynamaxCannon[] = INCBIN_U16("graphics/battle_anims/backgrounds/dynamax_cannon.gbapal"); -const u32 gBattleAnimBgImage_Fire1[] = INCBIN_U32("graphics/battle_anims/backgrounds/fire1.4bpp.lz"); +const u32 gBattleAnimBgImage_Fire1[] = INCBIN_U32("graphics/battle_anims/backgrounds/fire1.4bpp.smol"); const u16 gBattleAnimBgPalette_Fire1[] = INCBIN_U16("graphics/battle_anims/backgrounds/fire1.gbapal"); -const u32 gBattleAnimBgTilemap_Fire1[] = INCBIN_U32("graphics/battle_anims/backgrounds/fire1.bin.lz"); +const u32 gBattleAnimBgTilemap_Fire1[] = INCBIN_U32("graphics/battle_anims/backgrounds/fire1.bin.smolTM"); const u16 gBattleAnimBgPalette_Fire2[] = INCBIN_U16("graphics/battle_anims/backgrounds/fire2.gbapal"); -const u32 gBattleAnimBgImage_FocusBlast[] = INCBIN_U32("graphics/battle_anims/backgrounds/focus_blast.4bpp.lz"); +const u32 gBattleAnimBgImage_FocusBlast[] = INCBIN_U32("graphics/battle_anims/backgrounds/focus_blast.4bpp.smol"); const u16 gBattleAnimBgPalette_FocusBlast[] = INCBIN_U16("graphics/battle_anims/backgrounds/focus_blast.gbapal"); -const u32 gBattleAnimBgTilemap_FocusBlast[] = INCBIN_U32("graphics/battle_anims/backgrounds/focus_blast.bin.lz"); +const u32 gBattleAnimBgTilemap_FocusBlast[] = INCBIN_U32("graphics/battle_anims/backgrounds/focus_blast.bin.smolTM"); const u16 gBattleAnimBgPalette_GarbageFalls[] = INCBIN_U16("graphics/battle_anims/backgrounds/garbage_falls.gbapal"); const u16 gBattleAnimBgPalette_GunkShot[] = INCBIN_U16("graphics/battle_anims/backgrounds/gunk_shot.gbapal"); -const u32 gBattleAnimBgImage_HydroCannon[] = INCBIN_U32("graphics/battle_anims/backgrounds/hydro_cannon.4bpp.lz"); +const u32 gBattleAnimBgImage_HydroCannon[] = INCBIN_U32("graphics/battle_anims/backgrounds/hydro_cannon.4bpp.smol"); const u16 gBattleAnimBgPalette_HydroCannon[] = INCBIN_U16("graphics/battle_anims/backgrounds/hydro_cannon.gbapal"); -const u32 gBattleAnimBgTilemap_HydroCannon[] = INCBIN_U32("graphics/battle_anims/backgrounds/hydro_cannon.bin.lz"); +const u32 gBattleAnimBgTilemap_HydroCannon[] = INCBIN_U32("graphics/battle_anims/backgrounds/hydro_cannon.bin.smolTM"); const u16 gBattleAnimBgPalette_Chloroblast[] = INCBIN_U16("graphics/battle_anims/backgrounds/chloroblast.gbapal"); -const u32 gBattleAnimBgImage_HydroPump[] = INCBIN_U32("graphics/battle_anims/backgrounds/hydro_pump.4bpp.lz"); +const u32 gBattleAnimBgImage_HydroPump[] = INCBIN_U32("graphics/battle_anims/backgrounds/hydro_pump.4bpp.smol"); const u16 gBattleAnimBgPalette_HydroPump[] = INCBIN_U16("graphics/battle_anims/backgrounds/hydro_pump.gbapal"); -const u32 gBattleAnimBgTilemap_HydroPump[] = INCBIN_U32("graphics/battle_anims/backgrounds/hydro_pump.bin.lz"); +const u32 gBattleAnimBgTilemap_HydroPump[] = INCBIN_U32("graphics/battle_anims/backgrounds/hydro_pump.bin.smolTM"); const u16 gBattleAnimBgPalette_HyperBeam[] = INCBIN_U16("graphics/battle_anims/backgrounds/hyper_beam.gbapal"); const u16 gBattleAnimBgPalette_HyperspaceFury[] = INCBIN_U16("graphics/battle_anims/backgrounds/hyperspace_fury.gbapal"); -const u32 gBattleAnimBgImage_InfernoOverdrive[] = INCBIN_U32("graphics/battle_anims/backgrounds/inferno_overdrive.4bpp.lz"); +const u32 gBattleAnimBgImage_InfernoOverdrive[] = INCBIN_U32("graphics/battle_anims/backgrounds/inferno_overdrive.4bpp.smol"); const u16 gBattleAnimBgPalette_InfernoOverdrive[] = INCBIN_U16("graphics/battle_anims/backgrounds/inferno_overdrive.gbapal"); -const u32 gBattleAnimBgTilemap_InfernoOverdrive[] = INCBIN_U32("graphics/battle_anims/backgrounds/inferno_overdrive.bin.lz"); +const u32 gBattleAnimBgTilemap_InfernoOverdrive[] = INCBIN_U32("graphics/battle_anims/backgrounds/inferno_overdrive.bin.smolTM"); -const u32 gBattleAnimBgImage_LeafStorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/leaf_storm.4bpp.lz"); +const u32 gBattleAnimBgImage_LeafStorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/leaf_storm.4bpp.smol"); const u16 gBattleAnimBgPalette_LeafStorm[] = INCBIN_U16("graphics/battle_anims/backgrounds/leaf_storm.gbapal"); -const u32 gBattleAnimBgTilemap_LeafStorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/leaf_storm.bin.lz"); +const u32 gBattleAnimBgTilemap_LeafStorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/leaf_storm.bin.smolTM"); -const u32 gBattleAnimBgImage_MaliciousMoonsault[] = INCBIN_U32("graphics/battle_anims/backgrounds/malicious_moonsault.4bpp.lz"); +const u32 gBattleAnimBgImage_MaliciousMoonsault[] = INCBIN_U32("graphics/battle_anims/backgrounds/malicious_moonsault.4bpp.smol"); const u16 gBattleAnimBgPalette_MaliciousMoonsault[] = INCBIN_U16("graphics/battle_anims/backgrounds/malicious_moonsault.gbapal"); -const u32 gBattleAnimBgTilemap_MaliciousMoonsault[] = INCBIN_U32("graphics/battle_anims/backgrounds/malicious_moonsault.bin.lz"); +const u32 gBattleAnimBgTilemap_MaliciousMoonsault[] = INCBIN_U32("graphics/battle_anims/backgrounds/malicious_moonsault.bin.smolTM"); -const u32 gBattleAnimBgImage_MaxLightning[] = INCBIN_U32("graphics/battle_anims/backgrounds/max_lightning.4bpp.lz"); +const u32 gBattleAnimBgImage_MaxLightning[] = INCBIN_U32("graphics/battle_anims/backgrounds/max_lightning.4bpp.smol"); const u16 gBattleAnimBgPalette_MaxLightning[] = INCBIN_U16("graphics/battle_anims/backgrounds/max_lightning.gbapal"); -const u32 gBattleAnimBgTilemap_MaxLightning[] = INCBIN_U32("graphics/battle_anims/backgrounds/max_lightning.bin.lz"); +const u32 gBattleAnimBgTilemap_MaxLightning[] = INCBIN_U32("graphics/battle_anims/backgrounds/max_lightning.bin.smolTM"); -const u32 gBattleAnimBgImage_NeverendingNightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/neverending_nightmare.4bpp.lz"); +const u32 gBattleAnimBgImage_NeverendingNightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/neverending_nightmare.4bpp.smol"); const u16 gBattleAnimBgPalette_NeverendingNightmare[] = INCBIN_U16("graphics/battle_anims/backgrounds/neverending_nightmare.gbapal"); -const u32 gBattleAnimBgTilemap_NeverendingNightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/neverending_nightmare.bin.lz"); +const u32 gBattleAnimBgTilemap_NeverendingNightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/neverending_nightmare.bin.smolTM"); #if B_NEW_TERRAIN_BACKGROUNDS -const u32 gBattleAnimBgImage_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_electric_terrain.4bpp.lz"); +const u32 gBattleAnimBgImage_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_electric_terrain.4bpp.smol"); const u16 gBattleAnimBgPalette_ElectricTerrain[] = INCBIN_U16("graphics/battle_anims/backgrounds/new_electric_terrain.gbapal"); -const u32 gBattleAnimBgTilemap_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_electric_terrain.bin.lz"); +const u32 gBattleAnimBgTilemap_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_electric_terrain.bin.smolTM"); -const u32 gBattleAnimBgImage_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_grassy_terrain.4bpp.lz"); +const u32 gBattleAnimBgImage_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_grassy_terrain.4bpp.smol"); const u16 gBattleAnimBgPalette_GrassyTerrain[] = INCBIN_U16("graphics/battle_anims/backgrounds/new_grassy_terrain.gbapal"); -const u32 gBattleAnimBgTilemap_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_grassy_terrain.bin.lz"); +const u32 gBattleAnimBgTilemap_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_grassy_terrain.bin.smolTM"); -const u32 gBattleAnimBgImage_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_misty_terrain.4bpp.lz"); +const u32 gBattleAnimBgImage_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_misty_terrain.4bpp.smol"); const u16 gBattleAnimBgPalette_MistyTerrain[] = INCBIN_U16("graphics/battle_anims/backgrounds/new_misty_terrain.gbapal"); -const u32 gBattleAnimBgTilemap_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_misty_terrain.bin.lz"); +const u32 gBattleAnimBgTilemap_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_misty_terrain.bin.smolTM"); -const u32 gBattleAnimBgImage_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_psychic_terrain.4bpp.lz"); +const u32 gBattleAnimBgImage_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_psychic_terrain.4bpp.smol"); const u16 gBattleAnimBgPalette_PsychicTerrain[] = INCBIN_U16("graphics/battle_anims/backgrounds/new_psychic_terrain.gbapal"); -const u32 gBattleAnimBgTilemap_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_psychic_terrain.bin.lz"); +const u32 gBattleAnimBgTilemap_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_psychic_terrain.bin.smolTM"); #else -const u32 gBattleAnimBgImage_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/psychic_terrain.4bpp.lz"); +const u32 gBattleAnimBgImage_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/psychic_terrain.4bpp.smol"); const u16 gBattleAnimBgPalette_PsychicTerrain[] = INCBIN_U16("graphics/battle_anims/backgrounds/psychic_terrain.gbapal"); -const u32 gBattleAnimBgTilemap_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/psychic_terrain.bin.lz"); +const u32 gBattleAnimBgTilemap_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/psychic_terrain.bin.smolTM"); -const u32 gBattleAnimBgImage_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/electric_terrain.4bpp.lz"); +const u32 gBattleAnimBgImage_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/electric_terrain.4bpp.smol"); const u16 gBattleAnimBgPalette_ElectricTerrain[] = INCBIN_U16("graphics/battle_anims/backgrounds/electric_terrain.gbapal"); -const u32 gBattleAnimBgTilemap_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/electric_terrain.bin.lz"); +const u32 gBattleAnimBgTilemap_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/electric_terrain.bin.smolTM"); -const u32 gBattleAnimBgImage_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/grassy_terrain.4bpp.lz"); +const u32 gBattleAnimBgImage_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/grassy_terrain.4bpp.smol"); const u16 gBattleAnimBgPalette_GrassyTerrain[] = INCBIN_U16("graphics/battle_anims/backgrounds/grassy_terrain.gbapal"); -const u32 gBattleAnimBgTilemap_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/grassy_terrain.bin.lz"); +const u32 gBattleAnimBgTilemap_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/grassy_terrain.bin.smolTM"); -const u32 gBattleAnimBgImage_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/misty_terrain.4bpp.lz"); +const u32 gBattleAnimBgImage_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/misty_terrain.4bpp.smol"); const u16 gBattleAnimBgPalette_MistyTerrain[] = INCBIN_U16("graphics/battle_anims/backgrounds/misty_terrain.gbapal"); -const u32 gBattleAnimBgTilemap_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/misty_terrain.bin.lz"); +const u32 gBattleAnimBgTilemap_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/misty_terrain.bin.smolTM"); #endif -const u32 gBattleAnimBgImage_Nightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/nightmare.4bpp.lz"); +const u32 gBattleAnimBgImage_Nightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/nightmare.4bpp.smol"); const u16 gBattleAnimBgPalette_Nightmare[] = INCBIN_U16("graphics/battle_anims/backgrounds/nightmare.gbapal"); -const u32 gBattleAnimBgTilemap_Nightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/nightmare.bin.lz"); +const u32 gBattleAnimBgTilemap_Nightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/nightmare.bin.smolTM"); const u16 gBattleAnimBgPalette_PoisonFalls[] = INCBIN_U16("graphics/battle_anims/backgrounds/poison_falls.gbapal"); const u16 gBattleAnimBgPalette_PsychicNew[] = INCBIN_U16("graphics/battle_anims/backgrounds/psychic_new.gbapal"); -const u32 gBattleAnimBgImage_ShatteredPsyche[] = INCBIN_U32("graphics/battle_anims/backgrounds/shattered_psyche.4bpp.lz"); +const u32 gBattleAnimBgImage_ShatteredPsyche[] = INCBIN_U32("graphics/battle_anims/backgrounds/shattered_psyche.4bpp.smol"); const u16 gBattleAnimBgPalette_ShatteredPsyche[] = INCBIN_U16("graphics/battle_anims/backgrounds/shattered_psyche.gbapal"); -const u32 gBattleAnimBgTilemap_ShatteredPsyche[] = INCBIN_U32("graphics/battle_anims/backgrounds/shattered_psyche.bin.lz"); +const u32 gBattleAnimBgTilemap_ShatteredPsyche[] = INCBIN_U32("graphics/battle_anims/backgrounds/shattered_psyche.bin.smolTM"); -const u32 gBattleAnimBgImage_RockField[] = INCBIN_U32("graphics/battle_anims/backgrounds/rock_field.4bpp.lz"); +const u32 gBattleAnimBgImage_RockField[] = INCBIN_U32("graphics/battle_anims/backgrounds/rock_field.4bpp.smol"); const u16 gBattleAnimBgPalette_RockDay[] = INCBIN_U16("graphics/battle_anims/backgrounds/rock_day.gbapal"); -const u32 gBattleAnimBgTilemap_RockField[] = INCBIN_U32("graphics/battle_anims/backgrounds/rock_field.bin.lz"); +const u32 gBattleAnimBgTilemap_RockField[] = INCBIN_U32("graphics/battle_anims/backgrounds/rock_field.bin.smolTM"); const u16 gBattleAnimBgPalette_RockAfternoon[] = INCBIN_U16("graphics/battle_anims/backgrounds/rock_afternoon.gbapal"); const u16 gBattleAnimBgPalette_RockNight[] = INCBIN_U16("graphics/battle_anims/backgrounds/rock_night.gbapal"); -const u32 gBattleAnimBgImage_SnuggleForever[] = INCBIN_U32("graphics/battle_anims/backgrounds/snuggle_forever.4bpp.lz"); +const u32 gBattleAnimBgImage_SnuggleForever[] = INCBIN_U32("graphics/battle_anims/backgrounds/snuggle_forever.4bpp.smol"); const u16 gBattleAnimBgPalette_SnuggleForever[] = INCBIN_U16("graphics/battle_anims/backgrounds/snuggle_forever.gbapal"); -const u32 gBattleAnimBgTilemap_SnuggleForever[] = INCBIN_U32("graphics/battle_anims/backgrounds/snuggle_forever.bin.lz"); +const u32 gBattleAnimBgTilemap_SnuggleForever[] = INCBIN_U32("graphics/battle_anims/backgrounds/snuggle_forever.bin.smolTM"); -const u32 gBattleAnimBgImage_SoulStealing7StarStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/soulstealing_7star_strike.4bpp.lz"); +const u32 gBattleAnimBgImage_SoulStealing7StarStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/soulstealing_7star_strike.4bpp.smol"); const u16 gBattleAnimBgPalette_SoulStealing7StarStrike[] = INCBIN_U16("graphics/battle_anims/backgrounds/soulstealing_7star_strike.gbapal"); -const u32 gBattleAnimBgTilemap_SoulStealing7StarStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/soulstealing_7star_strike.bin.lz"); +const u32 gBattleAnimBgTilemap_SoulStealing7StarStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/soulstealing_7star_strike.bin.smolTM"); const u16 gBattleAnimBgPalette_TectonicRage[] = INCBIN_U16("graphics/battle_anims/backgrounds/tectonic_rage.gbapal"); -const u32 gBattleAnimBgImage_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/trick_room.4bpp.lz"); +const u32 gBattleAnimBgImage_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/trick_room.4bpp.smol"); const u16 gBattleAnimBgPalette_TrickRoom[] = INCBIN_U16("graphics/battle_anims/backgrounds/trick_room.gbapal"); -const u32 gBattleAnimBgTilemap_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/trick_room.bin.lz"); +const u32 gBattleAnimBgTilemap_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/trick_room.bin.smolTM"); const u16 gBattleAnimBgPalette_MagicRoom[] = INCBIN_U16("graphics/battle_anims/backgrounds/magic_room.gbapal"); const u16 gBattleAnimBgPalette_WonderRoom[] = INCBIN_U16("graphics/battle_anims/backgrounds/wonder_room.gbapal"); -const u32 gBattleAnimBgImage_TwinkleTackle[] = INCBIN_U32("graphics/battle_anims/backgrounds/twinkle_tackle.4bpp.lz"); +const u32 gBattleAnimBgImage_TwinkleTackle[] = INCBIN_U32("graphics/battle_anims/backgrounds/twinkle_tackle.4bpp.smol"); const u16 gBattleAnimBgPalette_TwinkleTackle[] = INCBIN_U16("graphics/battle_anims/backgrounds/twinkle_tackle.gbapal"); -const u32 gBattleAnimBgTilemap_TwinkleTackle[] = INCBIN_U32("graphics/battle_anims/backgrounds/twinkle_tackle.bin.lz"); +const u32 gBattleAnimBgTilemap_TwinkleTackle[] = INCBIN_U32("graphics/battle_anims/backgrounds/twinkle_tackle.bin.smolTM"); -const u32 gBattleAnimBgImage_WaterPulse[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_pulse.4bpp.lz"); +const u32 gBattleAnimBgImage_WaterPulse[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_pulse.4bpp.smol"); const u16 gBattleAnimBgPalette_WaterPulse[] = INCBIN_U16("graphics/battle_anims/backgrounds/water_pulse.gbapal"); -const u32 gBattleAnimBgTilemap_WaterPulse[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_pulse.bin.lz"); +const u32 gBattleAnimBgTilemap_WaterPulse[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_pulse.bin.smolTM"); -const u32 gBattleAnimBgImage_Waterfall[] = INCBIN_U32("graphics/battle_anims/backgrounds/waterfall.4bpp.lz"); +const u32 gBattleAnimBgImage_Waterfall[] = INCBIN_U32("graphics/battle_anims/backgrounds/waterfall.4bpp.smol"); const u16 gBattleAnimBgPalette_Waterfall[] = INCBIN_U16("graphics/battle_anims/backgrounds/waterfall.gbapal"); -const u32 gBattleAnimBgTilemap_Waterfall[] = INCBIN_U32("graphics/battle_anims/backgrounds/waterfall.bin.lz"); +const u32 gBattleAnimBgTilemap_Waterfall[] = INCBIN_U32("graphics/battle_anims/backgrounds/waterfall.bin.smolTM"); const u16 gBattleAnimBgPalette_DarkVoid[] = INCBIN_U16("graphics/battle_anims/backgrounds/dark_void.gbapal"); -const u32 gBattleAnimBgTilemap_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark_void.bin.lz"); +const u32 gBattleAnimBgTilemap_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark_void.bin.smolTM"); -const u32 gBattleAnimBgImage_ZMoveActivate[] = INCBIN_U32("graphics/battle_anims/backgrounds/zmove_activate.4bpp.lz"); +const u32 gBattleAnimBgImage_ZMoveActivate[] = INCBIN_U32("graphics/battle_anims/backgrounds/zmove_activate.4bpp.smol"); const u16 gBattleAnimBgPalette_ZMoveActivate[] = INCBIN_U16("graphics/battle_anims/backgrounds/zmove_activate.gbapal"); -const u32 gBattleAnimBgTilemap_ZMoveActivate[] = INCBIN_U32("graphics/battle_anims/backgrounds/zmove_activate.bin.lz"); +const u32 gBattleAnimBgTilemap_ZMoveActivate[] = INCBIN_U32("graphics/battle_anims/backgrounds/zmove_activate.bin.smolTM"); -const u32 gBattleAnimBgImage_ZMoveMountain[] = INCBIN_U32("graphics/battle_anims/backgrounds/zmove_mountain.4bpp.lz"); +const u32 gBattleAnimBgImage_ZMoveMountain[] = INCBIN_U32("graphics/battle_anims/backgrounds/zmove_mountain.4bpp.smol"); const u16 gBattleAnimBgPalette_ZMoveMountain[] = INCBIN_U16("graphics/battle_anims/backgrounds/zmove_mountain.gbapal"); -const u32 gBattleAnimBgTilemap_ZMoveMountain[] = INCBIN_U32("graphics/battle_anims/backgrounds/zmove_mountain.bin.lz"); +const u32 gBattleAnimBgTilemap_ZMoveMountain[] = INCBIN_U32("graphics/battle_anims/backgrounds/zmove_mountain.bin.smolTM"); const u16 gBattleAnimBgPalette_SteelBeam[] = INCBIN_U16("graphics/battle_anims/backgrounds/steel_beam.gbapal"); // misc -const u32 gBerryBlenderCenter_Gfx[] = INCBIN_U32("graphics/berry_blender/center.8bpp.lz"); -const u32 gBerryBlenderOuter_Gfx[] = INCBIN_U32("graphics/berry_blender/outer.4bpp.lz"); -const u32 gBerryBlenderOuter_Tilemap[] = INCBIN_U32("graphics/berry_blender/outer_map.bin.lz"); +const u32 gBerryBlenderCenter_Gfx[] = INCBIN_U32("graphics/berry_blender/center.8bpp.smol"); +const u32 gBerryBlenderOuter_Gfx[] = INCBIN_U32("graphics/berry_blender/outer.4bpp.smol"); +const u32 gBerryBlenderOuter_Tilemap[] = INCBIN_U32("graphics/berry_blender/outer_map.bin.smolTM"); const u16 gBattleAnimBgPalette_Cosmic[] = INCBIN_U16("graphics/battle_anims/backgrounds/cosmic.gbapal"); -const u32 gBattleAnimBgImage_Cosmic[] = INCBIN_U32("graphics/battle_anims/backgrounds/cosmic.4bpp.lz"); -const u32 gBattleAnimBgTilemap_Cosmic[] = INCBIN_U32("graphics/battle_anims/backgrounds/cosmic.bin.lz"); +const u32 gBattleAnimBgImage_Cosmic[] = INCBIN_U32("graphics/battle_anims/backgrounds/cosmic.4bpp.smol"); +const u32 gBattleAnimBgTilemap_Cosmic[] = INCBIN_U32("graphics/battle_anims/backgrounds/cosmic.bin.smolTM"); const u16 gBattleAnimSpritePal_SlamHit2[] = INCBIN_U16("graphics/battle_anims/sprites/slam_hit_2.gbapal"); -const u32 gBattleAnimSpriteGfx_SlamHit2[] = INCBIN_U32("graphics/battle_anims/sprites/slam_hit_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SlamHit2[] = INCBIN_U32("graphics/battle_anims/sprites/slam_hit_2.4bpp.smol"); -const u32 gBattleAnimFogTilemap[] = INCBIN_U32("graphics/battle_anims/backgrounds/fog.bin.lz"); +const u32 gBattleAnimFogTilemap[] = INCBIN_U32("graphics/battle_anims/backgrounds/fog.bin.smolTM"); const u16 gBattleAnimSpritePal_WeatherBall[] = INCBIN_U16("graphics/battle_anims/sprites/weather_ball.gbapal"); -const u32 gBattleAnimSpriteGfx_WeatherBall[] = INCBIN_U32("graphics/battle_anims/sprites/weather_ball.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WeatherBall[] = INCBIN_U32("graphics/battle_anims/sprites/weather_ball.4bpp.smol"); -const u32 gBattleAnimBgTilemap_ScaryFacePlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face_player.bin.lz"); -const u32 gBattleAnimBgTilemap_ScaryFaceOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face_opponent.bin.lz"); -const u32 gBattleAnimBgTilemap_ScaryFaceContest[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face_contest.bin.lz"); +const u32 gBattleAnimBgTilemap_ScaryFacePlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face_player.bin.smolTM"); +const u32 gBattleAnimBgTilemap_ScaryFaceOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face_opponent.bin.smolTM"); +const u32 gBattleAnimBgTilemap_ScaryFaceContest[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face_contest.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_Hail[] = INCBIN_U32("graphics/battle_anims/sprites/hail.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Hail[] = INCBIN_U32("graphics/battle_anims/sprites/hail.4bpp.smol"); const u16 gBattleAnimSpritePal_Hail[] = INCBIN_U16("graphics/battle_anims/sprites/hail.gbapal"); -const u32 gBattleAnimSpriteGfx_GreenSpike[] = INCBIN_U32("graphics/battle_anims/sprites/green_spike.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GreenSpike[] = INCBIN_U32("graphics/battle_anims/sprites/green_spike.4bpp.smol"); const u16 gBattleAnimSpritePal_GreenSpike[] = INCBIN_U16("graphics/battle_anims/sprites/green_spike.gbapal"); const u16 gBattleAnimSpritePal_WhiteCircleOfLight[] = INCBIN_U16("graphics/battle_anims/sprites/white_circle_of_light.gbapal"); const u16 gBattleAnimSpritePal_GlowyBlueOrb[] = INCBIN_U16("graphics/battle_anims/sprites/glowy_blue_orb.gbapal"); -const u32 gBattleAnimSpriteGfx_Recycle[] = INCBIN_U32("graphics/battle_anims/sprites/recycle.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Recycle[] = INCBIN_U32("graphics/battle_anims/sprites/recycle.4bpp.smol"); const u16 gBattleAnimSpritePal_Recycle[] = INCBIN_U16("graphics/battle_anims/sprites/recycle.gbapal"); -const u32 gBattleAnimSpriteGfx_RedParticles[] = INCBIN_U32("graphics/battle_anims/sprites/red_particles.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RedParticles[] = INCBIN_U32("graphics/battle_anims/sprites/red_particles.4bpp.smol"); const u16 gBattleAnimSpritePal_RedParticles[] = INCBIN_U16("graphics/battle_anims/sprites/red_particles.gbapal"); -const u32 gBattleAnimSpriteGfx_DirtMound[] = INCBIN_U32("graphics/battle_anims/sprites/dirt_mound.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_DirtMound[] = INCBIN_U32("graphics/battle_anims/sprites/dirt_mound.4bpp.smol"); const u16 gBattleAnimSpritePal_DirtMound[] = INCBIN_U16("graphics/battle_anims/sprites/dirt_mound.gbapal"); -const u32 gBattleAnimBgImage_Fissure[] = INCBIN_U32("graphics/battle_anims/backgrounds/fissure.4bpp.lz"); +const u32 gBattleAnimBgImage_Fissure[] = INCBIN_U32("graphics/battle_anims/backgrounds/fissure.4bpp.smol"); const u16 gBattleAnimBgPalette_Fissure[] = INCBIN_U16("graphics/battle_anims/backgrounds/fissure.gbapal"); -const u32 gBattleAnimBgTilemap_Fissure[] = INCBIN_U32("graphics/battle_anims/backgrounds/fissure.bin.lz"); +const u32 gBattleAnimBgTilemap_Fissure[] = INCBIN_U32("graphics/battle_anims/backgrounds/fissure.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_Bird[] = INCBIN_U32("graphics/battle_anims/sprites/bird.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Bird[] = INCBIN_U32("graphics/battle_anims/sprites/bird.4bpp.smol"); const u16 gBattleAnimSpritePal_Bird[] = INCBIN_U16("graphics/battle_anims/sprites/bird.gbapal"); -const u32 gBattleAnimSpriteGfx_CrossImpact[] = INCBIN_U32("graphics/battle_anims/sprites/cross_impact.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_CrossImpact[] = INCBIN_U32("graphics/battle_anims/sprites/cross_impact.4bpp.smol"); const u16 gBattleAnimSpritePal_CrossImpact[] = INCBIN_U16("graphics/battle_anims/sprites/cross_impact.gbapal"); -const u32 gBattleAnimBgImage_Surf[] = INCBIN_U32("graphics/battle_anims/backgrounds/water.4bpp.lz"); +const u32 gBattleAnimBgImage_Surf[] = INCBIN_U32("graphics/battle_anims/backgrounds/water.4bpp.smol"); const u16 gBattleAnimBgPalette_Surf[] = INCBIN_U16("graphics/battle_anims/backgrounds/water.gbapal"); -const u32 gBattleAnimBgTilemap_SurfOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_opponent.bin.lz"); -const u32 gBattleAnimBgTilemap_SurfPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_player.bin.lz"); -const u32 gBattleAnimBgTilemap_SurfContest[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_contest.bin.lz"); +const u32 gBattleAnimBgTilemap_SurfOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_opponent.bin.smolTM"); +const u32 gBattleAnimBgTilemap_SurfPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_player.bin.smolTM"); +const u32 gBattleAnimBgTilemap_SurfContest[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_contest.bin.smolTM"); const u16 gBattleAnimSpritePal_Slash2[] = INCBIN_U16("graphics/battle_anims/sprites/slash_2.gbapal"); -const u32 gBattleAnimSpriteGfx_WhiteShadow[] = INCBIN_U32("graphics/battle_anims/sprites/white_shadow.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WhiteShadow[] = INCBIN_U32("graphics/battle_anims/sprites/white_shadow.4bpp.smol"); const u16 gBattleAnimSpritePal_WhiteShadow[] = INCBIN_U16("graphics/battle_anims/sprites/white_shadow.gbapal"); // Pledge Effect field status - Rainbow -const u32 gBattleAnimBgImage_Rainbow[] = INCBIN_U32("graphics/battle_anims/backgrounds/rainbow.4bpp.lz"); -const u16 gBattleAnimBGPalette_Rainbow[] = INCBIN_U16("graphics/battle_anims/backgrounds/rainbow.gbapal"); -const u32 gBattleAnimBgTilemap_Rainbow[] = INCBIN_U32("graphics/battle_anims/backgrounds/rainbow.bin.lz"); +const u32 gBattleAnimBgImage_RainbowPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/rainbow_player_tile.4bpp.smol"); +const u32 gBattleAnimBgImage_RainbowOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/rainbow_opponent_tile.4bpp.smol"); +const u16 gBattleAnimBGPalette_Rainbow[] = INCBIN_U16("graphics/battle_anims/backgrounds/rainbow_player_tile.gbapal"); +const u32 gBattleAnimBgTilemap_RainbowPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/rainbow_player_tile.bin.smolTM"); +const u32 gBattleAnimBgTilemap_RainbowOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/rainbow_opponent_tile.bin.smolTM"); // Pledge Effect field status - Swamp -const u32 gBattleAnimBgImage_Swamp[] = INCBIN_U32("graphics/battle_anims/backgrounds/swampswizzle.4bpp.lz"); +const u32 gBattleAnimBgImage_Swamp[] = INCBIN_U32("graphics/battle_anims/backgrounds/swampswizzle.4bpp.smol"); const u16 gBattleAnimBGPalette_Swamp[] = INCBIN_U16("graphics/battle_anims/backgrounds/swampswizzle.gbapal"); -const u32 gBattleAnimBgTilemap_Swamp[] = INCBIN_U32("graphics/battle_anims/backgrounds/swampswizzle.bin.lz"); +const u32 gBattleAnimBgTilemap_Swamp[] = INCBIN_U32("graphics/battle_anims/backgrounds/swampswizzle.bin.smolTM"); -const u32 gPartyMenuBg_Gfx[] = INCBIN_U32("graphics/party_menu/bg.4bpp.lz"); +const u32 gPartyMenuBg_Gfx[] = INCBIN_U32("graphics/party_menu/bg.4bpp.smol"); const u16 gPartyMenuBg_Pal[] = INCBIN_U16("graphics/party_menu/bg.gbapal"); -const u32 gPartyMenuBg_Tilemap[] = INCBIN_U32("graphics/party_menu/bg.bin.lz"); +const u32 gPartyMenuBg_Tilemap[] = INCBIN_U32("graphics/party_menu/bg.bin.smolTM"); -const u32 gPartyMenuPokeball_Gfx[] = INCBIN_U32("graphics/party_menu/pokeball.4bpp.lz"); -const u32 gPartyMenuPokeballSmall_Gfx[] = INCBIN_U32("graphics/party_menu/pokeball_small.4bpp.lz"); //unused +const u32 gPartyMenuPokeball_Gfx[] = INCBIN_U32("graphics/party_menu/pokeball.4bpp.smol"); +const u32 gPartyMenuPokeballSmall_Gfx[] = INCBIN_U32("graphics/party_menu/pokeball_small.4bpp.smol"); //unused const u16 gPartyMenuPokeball_Pal[] = INCBIN_U16("graphics/party_menu/pokeball.gbapal"); -const u32 gStatusGfx_Icons[] = INCBIN_U32("graphics/interface/status_icons.4bpp.lz"); +const u32 gStatusGfx_Icons[] = INCBIN_U32("graphics/interface/status_icons.4bpp.smol"); const u16 gStatusPal_Icons[] = INCBIN_U16("graphics/interface/status_icons.gbapal"); const u16 gCategoryIcons_Pal[] = INCBIN_U16("graphics/interface/category_icons.gbapal"); -const u32 gCategoryIcons_Gfx[] = INCBIN_U32("graphics/interface/category_icons.4bpp.lz"); +const u32 gCategoryIcons_Gfx[] = INCBIN_U32("graphics/interface/category_icons.4bpp.smol"); -const u32 gMoveTypes_Gfx[] = INCBIN_U32("graphics/types/move_types.4bpp.lz"); +const u32 gMoveTypes_Gfx[] = INCBIN_U32("graphics/types/move_types.4bpp.smol"); const u16 gMoveTypes_Pal[] = INCBIN_U16("graphics/types/move_types.gbapal"); -const u32 gSummaryMoveSelect_Gfx[] = INCBIN_U32("graphics/summary_screen/move_select.4bpp.lz"); +const u32 gSummaryMoveSelect_Gfx[] = INCBIN_U32("graphics/summary_screen/move_select.4bpp.smol"); const u16 gSummaryMoveSelect_Pal[] = INCBIN_U16("graphics/summary_screen/move_select.gbapal"); #if P_SUMMARY_SCREEN_IV_EV_TILESET -const u32 gSummaryScreen_Gfx[] = INCBIN_U32("graphics/summary_screen/iv_ev_tiles.4bpp.lz"); +const u32 gSummaryScreen_Gfx[] = INCBIN_U32("graphics/summary_screen/iv_ev_tiles.4bpp.smol"); #else -const u32 gSummaryScreen_Gfx[] = INCBIN_U32("graphics/summary_screen/tiles.4bpp.lz"); +const u32 gSummaryScreen_Gfx[] = INCBIN_U32("graphics/summary_screen/tiles.4bpp.smol"); #endif // P_SUMMARY_SCREEN_IV_EV_TILESET const u16 gSummaryScreen_Pal[] = INCBIN_U16("graphics/summary_screen/tiles.gbapal"); -const u32 gSummaryPage_Info_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_info.bin.lz"); -const u32 gSummaryPage_Skills_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_skills.bin.lz"); -const u32 gSummaryPage_BattleMoves_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_battle_moves.bin.lz"); -const u32 gSummaryPage_ContestMoves_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_contest_moves.bin.lz"); -const u32 gSummaryPage_InfoEgg_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_info_egg.bin.lz"); - -const u32 gBagMaleTiles[] = INCBIN_U32("graphics/bag/bag_male.4bpp.lz"); -const u32 gBagFemaleTiles[] = INCBIN_U32("graphics/bag/bag_female.4bpp.lz"); +const u32 gSummaryPage_Info_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_info.bin.smolTM"); +const u32 gSummaryPage_Skills_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_skills.bin.smolTM"); +const u32 gSummaryPage_BattleMoves_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_battle_moves.bin.smolTM"); +const u32 gSummaryPage_ContestMoves_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_contest_moves.bin.smolTM"); +const u32 gSummaryPage_InfoEgg_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_info_egg.bin.smolTM"); + +const u32 gBagMaleTiles[] = INCBIN_U32("graphics/bag/bag_male.4bpp.smol"); +const u32 gBagFemaleTiles[] = INCBIN_U32("graphics/bag/bag_female.4bpp.smol"); const u16 gBagPalette[] = INCBIN_U16("graphics/bag/bag.gbapal"); const u16 gBagScreenMale_Pal[] = INCBIN_U16("graphics/bag/menu_male.gbapal"); const u16 gBagScreenFemale_Pal[] = INCBIN_U16("graphics/bag/menu_female.gbapal"); -const u32 gBagScreen_Gfx[] = INCBIN_U32("graphics/bag/menu.4bpp.lz"); -const u32 gBagScreen_GfxTileMap[] = INCBIN_U32("graphics/bag/menu.bin.lz"); +const u32 gBagScreen_Gfx[] = INCBIN_U32("graphics/bag/menu.4bpp.smol"); +const u32 gBagScreen_GfxTileMap[] = INCBIN_U32("graphics/bag/menu.bin.smolTM"); -const u32 gBattlePyramidBag_Gfx[] = INCBIN_U32("graphics/bag/bag_pyramid.4bpp.lz"); +const u32 gBattlePyramidBag_Gfx[] = INCBIN_U32("graphics/bag/bag_pyramid.4bpp.smol"); const u16 gBattlePyramidBag_Pal[] = INCBIN_U16("graphics/bag/bag_pyramid.gbapal"); // female palette is first and male is second. -const u32 gBattlePyramidBagTilemap[] = INCBIN_U32("graphics/bag/menu_pyramid.bin.lz"); +const u32 gBattlePyramidBagTilemap[] = INCBIN_U32("graphics/bag/menu_pyramid.bin.smolTM"); const u16 gBattlePyramidBagInterface_Pal[] = INCBIN_U16("graphics/bag/menu_pyramid.gbapal"); -const u32 gSwapLineGfx[] = INCBIN_U32("graphics/interface/swap_line.4bpp.lz"); +const u32 gSwapLineGfx[] = INCBIN_U32("graphics/interface/swap_line.4bpp.smol"); const u16 gSwapLinePal[] = INCBIN_U16("graphics/interface/swap_line.gbapal"); -const u32 gShopMenu_Gfx[] = INCBIN_U32("graphics/shop/menu.4bpp.lz"); +const u32 gShopMenu_Gfx[] = INCBIN_U32("graphics/shop/menu.4bpp.smol"); const u16 gShopMenu_Pal[] = INCBIN_U16("graphics/shop/menu.gbapal"); -const u32 gShopMenu_Tilemap[] = INCBIN_U32("graphics/shop/menu.bin.lz"); -const u32 gShopMenuMoney_Gfx[] = INCBIN_U32("graphics/shop/money.4bpp.lz"); +const u32 gShopMenu_Tilemap[] = INCBIN_U32("graphics/shop/menu.bin.smolTM"); +const u32 gShopMenuMoney_Gfx[] = INCBIN_U32("graphics/shop/money.4bpp.smol"); // Pokeblock -const u32 gMenuPokeblock_Gfx[] = INCBIN_U32("graphics/pokeblock/menu.4bpp.lz"); +const u32 gMenuPokeblock_Gfx[] = INCBIN_U32("graphics/pokeblock/menu.4bpp.smol"); const u16 gMenuPokeblock_Pal[] = INCBIN_U16("graphics/pokeblock/menu.gbapal"); -const u32 gMenuPokeblockDevice_Gfx[] = INCBIN_U32("graphics/pokeblock/device.4bpp.lz"); +const u32 gMenuPokeblockDevice_Gfx[] = INCBIN_U32("graphics/pokeblock/device.4bpp.smol"); const u16 gMenuPokeblockDevice_Pal[] = INCBIN_U16("graphics/pokeblock/device.gbapal"); -const u32 gMenuPokeblock_Tilemap[] = INCBIN_U32("graphics/pokeblock/menu.bin.lz"); +const u32 gMenuPokeblock_Tilemap[] = INCBIN_U32("graphics/pokeblock/menu.bin.smolTM"); -const u32 gPokeblock_Gfx[] = INCBIN_U32("graphics/pokeblock/pokeblock.4bpp.lz"); +const u32 gPokeblock_Gfx[] = INCBIN_U32("graphics/pokeblock/pokeblock.4bpp.smol"); const u16 gPokeblockRed_Pal[] = INCBIN_U16("graphics/pokeblock/red.gbapal"); const u16 gPokeblockBlue_Pal[] = INCBIN_U16("graphics/pokeblock/blue.gbapal"); const u16 gPokeblockPink_Pal[] = INCBIN_U16("graphics/pokeblock/pink.gbapal"); @@ -1751,7 +1765,7 @@ const u16 gPokeblockBlack_Pal[] = INCBIN_U16("graphics/pokeblock/black.gbapal"); const u16 gPokeblockWhite_Pal[] = INCBIN_U16("graphics/pokeblock/white.gbapal"); const u16 gPokeblockGold_Pal[] = INCBIN_U16("graphics/pokeblock/gold.gbapal"); -const u32 gPokeblockFeedBg_Tilemap[] = INCBIN_U32("graphics/pokeblock/feeding_bg.bin.lz"); +const u32 gPokeblockFeedBg_Tilemap[] = INCBIN_U32("graphics/pokeblock/feeding_bg.bin.smolTM"); #include "data/graphics/berries.h" #include "data/graphics/rayquaza_scene.h" @@ -1759,29 +1773,29 @@ const u32 gPokeblockFeedBg_Tilemap[] = INCBIN_U32("graphics/pokeblock/feeding_bg #include "data/graphics/decorations.h" const u16 gBattleAnimSpritePal_Shock3[] = INCBIN_U16("graphics/battle_anims/sprites/shock_3.gbapal"); -const u32 gBattleAnimSpriteGfx_Shock3[] = INCBIN_U32("graphics/battle_anims/sprites/shock_3.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Shock3[] = INCBIN_U32("graphics/battle_anims/sprites/shock_3.4bpp.smol"); const u16 gBattleAnimSpritePal_WhiteFeather[] = INCBIN_U16("graphics/battle_anims/sprites/white_feather.gbapal"); -const u32 gBattleAnimSpriteGfx_WhiteFeather[] = INCBIN_U32("graphics/battle_anims/sprites/white_feather.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WhiteFeather[] = INCBIN_U32("graphics/battle_anims/sprites/white_feather.4bpp.smol"); const u16 gBattleAnimSpritePal_Sparkle6[] = INCBIN_U16("graphics/battle_anims/sprites/sparkle_6.gbapal"); -const u32 gBattleAnimSpriteGfx_Sparkle6[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_6.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Sparkle6[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_6.4bpp.smol"); const u16 gCableCarBg_Pal[] = INCBIN_U16("graphics/cable_car/bg.gbapal"); const u16 gCableCar_Pal[] = INCBIN_U16("graphics/cable_car/cable_car.gbapal"); -const u32 gCableCarBg_Gfx[] = INCBIN_U32("graphics/cable_car/bg.4bpp.lz"); -const u32 gCableCar_Gfx[] = INCBIN_U32("graphics/cable_car/cable_car.4bpp.lz"); -const u32 gCableCarDoor_Gfx[] = INCBIN_U32("graphics/cable_car/door.4bpp.lz"); -const u32 gCableCarCable_Gfx[] = INCBIN_U32("graphics/cable_car/cable.4bpp.lz"); +const u32 gCableCarBg_Gfx[] = INCBIN_U32("graphics/cable_car/bg.4bpp.smol"); +const u32 gCableCar_Gfx[] = INCBIN_U32("graphics/cable_car/cable_car.4bpp.smol"); +const u32 gCableCarDoor_Gfx[] = INCBIN_U32("graphics/cable_car/door.4bpp.smol"); +const u32 gCableCarCable_Gfx[] = INCBIN_U32("graphics/cable_car/cable.4bpp.smol"); // Roulette -const u32 gRouletteMenu_Gfx[] = INCBIN_U32("graphics/roulette/window.4bpp.lz"); -const u32 gRouletteWheel_Gfx[] = INCBIN_U32("graphics/roulette/wheel.8bpp.lz"); -const u32 gRouletteCenter_Gfx[] = INCBIN_U32("graphics/roulette/center.4bpp.lz"); -const u32 gRouletteHeaders_Gfx[] = INCBIN_U32("graphics/roulette/headers.4bpp.lz"); -const u32 gRouletteCredit_Gfx[] = INCBIN_U32("graphics/roulette/credit.4bpp.lz"); -const u32 gRouletteNumbers_Gfx[] = INCBIN_U32("graphics/roulette/numbers.4bpp.lz"); -const u32 gRouletteMultiplier_Gfx[] = INCBIN_U32("graphics/roulette/multiplier.4bpp.lz"); +const u32 gRouletteMenu_Gfx[] = INCBIN_U32("graphics/roulette/window.4bpp.smol"); +const u32 gRouletteWheel_Gfx[] = INCBIN_U32("graphics/roulette/wheel.8bpp.smol"); +const u32 gRouletteCenter_Gfx[] = INCBIN_U32("graphics/roulette/center.4bpp.smol"); +const u32 gRouletteHeaders_Gfx[] = INCBIN_U32("graphics/roulette/headers.4bpp.smol"); +const u32 gRouletteCredit_Gfx[] = INCBIN_U32("graphics/roulette/credit.4bpp.smol"); +const u32 gRouletteNumbers_Gfx[] = INCBIN_U32("graphics/roulette/numbers.4bpp.smol"); +const u32 gRouletteMultiplier_Gfx[] = INCBIN_U32("graphics/roulette/multiplier.4bpp.smol"); #include "data/graphics/mail.h" @@ -1789,7 +1803,7 @@ const u16 gFrontierFactoryMenu_Pal[] = INCBIN_U16("graphics/battle_frontier/fact const u16 gFrontierFactoryMenu_Gfx[] = INCBIN_U16("graphics/battle_frontier/factory_screen/menu.4bpp"); const u16 gFrontierFactoryMenu_Tilemap[] = INCBIN_U16("graphics/battle_frontier/factory_screen/menu.bin"); -const u32 gFrontierPassMedals_Gfx[] = INCBIN_U32("graphics/frontier_pass/medals.4bpp.lz"); +const u32 gFrontierPassMedals_Gfx[] = INCBIN_U32("graphics/frontier_pass/medals.4bpp.smol"); const u16 gFrontierPassCursor_Pal[] = INCBIN_U16("graphics/frontier_pass/cursor.gbapal"); @@ -1802,33 +1816,33 @@ const u16 gFrontierPassMedalsGold_Pal[] = INCBIN_U16("graphics/frontier_pass/gol const u16 gPokedexBgHoenn_Pal[] = INCBIN_U16("graphics/pokedex/bg_hoenn.gbapal"); const u16 gPokedexSearchResults_Pal[] = INCBIN_U16("graphics/pokedex/search_results_bg.gbapal"); const u16 gPokedexBgNational_Pal[] = INCBIN_U16("graphics/pokedex/bg_national.gbapal"); -const u32 gPokedexMenu_Gfx[] = INCBIN_U32("graphics/pokedex/menu.4bpp.lz"); -const u32 gPokedexInterface_Gfx[] = INCBIN_U32("graphics/pokedex/interface.4bpp.lz"); -const u32 gUnused_PokedexNoBall[] = INCBIN_U32("graphics/pokedex/noball_unused.4bpp.lz"); -const u32 gPokedexStartMenuMain_Tilemap[] = INCBIN_U32("graphics/pokedex/start_menu_main.bin.lz"); -const u32 gPokedexStartMenuSearchResults_Tilemap[] = INCBIN_U32("graphics/pokedex/start_menu_search_results.bin.lz"); -const u32 gPokedexList_Tilemap[] = INCBIN_U32("graphics/pokedex/list.bin.lz"); -const u32 gPokedexListUnderlay_Tilemap[] = INCBIN_U32("graphics/pokedex/list_underlay.bin.lz"); -const u32 gPokedexSizeScreen_Tilemap[] = INCBIN_U32("graphics/pokedex/size_screen.bin.lz"); -const u32 gPokedexScreenSelectBarMain_Tilemap[] = INCBIN_U32("graphics/pokedex/screen_select_bar_main.bin.lz"); -const u32 gPokedexScreenSelectBarSubmenu_Tilemap[] = INCBIN_U32("graphics/pokedex/screen_select_bar_submenu.bin.lz"); -const u32 gPokedexInfoScreen_Tilemap[] = INCBIN_U32("graphics/pokedex/info_screen.bin.lz"); -const u32 gPokedexCryScreen_Tilemap[] = INCBIN_U32("graphics/pokedex/cry_screen.bin.lz"); +const u32 gPokedexMenu_Gfx[] = INCBIN_U32("graphics/pokedex/menu.4bpp.smol"); +const u32 gPokedexInterface_Gfx[] = INCBIN_U32("graphics/pokedex/interface.4bpp.smol"); +const u32 gUnused_PokedexNoBall[] = INCBIN_U32("graphics/pokedex/noball_unused.4bpp.smol"); +const u32 gPokedexStartMenuMain_Tilemap[] = INCBIN_U32("graphics/pokedex/start_menu_main.bin.smolTM"); +const u32 gPokedexStartMenuSearchResults_Tilemap[] = INCBIN_U32("graphics/pokedex/start_menu_search_results.bin.smolTM"); +const u32 gPokedexList_Tilemap[] = INCBIN_U32("graphics/pokedex/list.bin.smolTM"); +const u32 gPokedexListUnderlay_Tilemap[] = INCBIN_U32("graphics/pokedex/list_underlay.bin.smolTM"); +const u32 gPokedexSizeScreen_Tilemap[] = INCBIN_U32("graphics/pokedex/size_screen.bin.smolTM"); +const u32 gPokedexScreenSelectBarMain_Tilemap[] = INCBIN_U32("graphics/pokedex/screen_select_bar_main.bin.smolTM"); +const u32 gPokedexScreenSelectBarSubmenu_Tilemap[] = INCBIN_U32("graphics/pokedex/screen_select_bar_submenu.bin.smolTM"); +const u32 gPokedexInfoScreen_Tilemap[] = INCBIN_U32("graphics/pokedex/info_screen.bin.smolTM"); +const u32 gPokedexCryScreen_Tilemap[] = INCBIN_U32("graphics/pokedex/cry_screen.bin.smolTM"); const u16 gPokedexSearchMenu_Pal[] = INCBIN_U16("graphics/pokedex/search_menu.gbapal"); -const u32 gPokedexSearchMenu_Gfx[] = INCBIN_U32("graphics/pokedex/search_menu.4bpp.lz"); -const u32 gPokedexSearchMenuNational_Tilemap[] = INCBIN_U32("graphics/pokedex/search_menu_national.bin.lz"); -const u32 gPokedexSearchMenuHoenn_Tilemap[] = INCBIN_U32("graphics/pokedex/search_menu_hoenn.bin.lz"); +const u32 gPokedexSearchMenu_Gfx[] = INCBIN_U32("graphics/pokedex/search_menu.4bpp.smol"); +const u32 gPokedexSearchMenuNational_Tilemap[] = INCBIN_U32("graphics/pokedex/search_menu_national.bin.smolTM"); +const u32 gPokedexSearchMenuHoenn_Tilemap[] = INCBIN_U32("graphics/pokedex/search_menu_hoenn.bin.smolTM"); const u16 gSummaryScreen_MoveEffect_Battle_Tilemap[] = INCBIN_U16("graphics/summary_screen/effect_battle.bin"); const u16 gSummaryScreen_MoveEffect_Contest_Tilemap[] = INCBIN_U16("graphics/summary_screen/effect_contest.bin"); const u16 gSummaryScreen_MoveEffect_Cancel_Tilemap[] = INCBIN_U16("graphics/summary_screen/effect_cancel.bin"); const u16 gIntroCopyright_Pal[] = INCBIN_U16("graphics/intro/copyright.gbapal"); -const u32 gIntroCopyright_Gfx[] = INCBIN_U32("graphics/intro/copyright.4bpp.lz"); -const u32 gIntroCopyright_Tilemap[] = INCBIN_U32("graphics/intro/copyright.bin.lz"); +const u32 gIntroCopyright_Gfx[] = INCBIN_U32("graphics/intro/copyright.4bpp.smol"); +const u32 gIntroCopyright_Tilemap[] = INCBIN_U32("graphics/intro/copyright.bin.smolTM"); const u16 gPokedexAreaScreenAreaUnknown_Pal[] = INCBIN_U16("graphics/pokedex/area_unknown.gbapal"); -const u32 gPokedexAreaScreenAreaUnknown_Gfx[] = INCBIN_U32("graphics/pokedex/area_unknown.4bpp.lz"); +const u32 gPokedexAreaScreenAreaUnknown_Gfx[] = INCBIN_U32("graphics/pokedex/area_unknown.4bpp.smol"); const u16 gMenuInfoElements1_Pal[] = INCBIN_U16("graphics/interface/menu_info1.gbapal"); const u16 gMenuInfoElements2_Pal[] = INCBIN_U16("graphics/interface/menu_info2.gbapal"); @@ -1854,37 +1868,37 @@ const u16 gContestResultsTitle_Tilemap[] = INCBIN_U16("graphics/contest/r // PokΓ©Nav const u16 gPokenavCondition_Pal[] = INCBIN_U16("graphics/pokenav/condition/graph.gbapal"); -const u32 gPokenavCondition_Gfx[] = INCBIN_U32("graphics/pokenav/condition/graph.4bpp.lz"); -const u32 gPokenavCondition_Tilemap[] = INCBIN_U32("graphics/pokenav/condition/graph.bin.lz"); +const u32 gPokenavCondition_Gfx[] = INCBIN_U32("graphics/pokenav/condition/graph.4bpp.smol"); +const u32 gPokenavCondition_Tilemap[] = INCBIN_U32("graphics/pokenav/condition/graph.bin.smolTM"); const u16 gPokenavOptions_Tilemap[] = INCBIN_U16("graphics/pokenav/options/options.bin"); -const u32 gPokenavOptions_Gfx[] = INCBIN_U32("graphics/pokenav/options/options.4bpp.lz"); +const u32 gPokenavOptions_Gfx[] = INCBIN_U32("graphics/pokenav/options/options.4bpp.smol"); const u16 gPokenavOptions_Pal[] = INCBIN_U16("graphics/pokenav/options/options.gbapal"); const u16 gPokenavHeader_Pal[] = INCBIN_U16("graphics/pokenav/header.gbapal"); -const u32 gPokenavHeader_Gfx[] = INCBIN_U32("graphics/pokenav/header.4bpp.lz"); // TODO: use width 9 and makefile rule for cleanliness, make wasnt behaving, didnt want to apply num_tiles to this -const u32 gPokenavHeader_Tilemap[] = INCBIN_U32("graphics/pokenav/header.bin.lz"); +const u32 gPokenavHeader_Gfx[] = INCBIN_U32("graphics/pokenav/header.4bpp.smol"); // TODO: use width 9 and makefile rule for cleanliness, make wasnt behaving, didnt want to apply num_tiles to this +const u32 gPokenavHeader_Tilemap[] = INCBIN_U32("graphics/pokenav/header.bin.smolTM"); const u16 gPokenavLeftHeader_Pal[] = INCBIN_U16("graphics/pokenav/left_headers/palette.gbapal"); -const u32 gPokenavLeftHeaderBeauty_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/beauty.4bpp.lz"); -const u32 gPokenavLeftHeaderSmart_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/smart.4bpp.lz"); -const u32 gPokenavLeftHeaderCondition_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/condition.4bpp.lz"); -const u32 gPokenavLeftHeaderCute_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/cute.4bpp.lz"); -const u32 gPokenavLeftHeaderMatchCall_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/match_call.4bpp.lz"); -const u32 gPokenavLeftHeaderMainMenu_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/main_menu.4bpp.lz"); -const u32 gPokenavLeftHeaderHoennMap_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/hoenn_map.4bpp.lz"); -const u32 gPokenavLeftHeaderRibbons_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/ribbons.4bpp.lz"); -const u32 gPokenavLeftHeaderSearch_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/search.4bpp.lz"); -const u32 gPokenavLeftHeaderTough_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/tough.4bpp.lz"); -const u32 gPokenavLeftHeaderCool_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/cool.4bpp.lz"); -const u32 gPokenavLeftHeaderParty_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/party.4bpp.lz"); +const u32 gPokenavLeftHeaderBeauty_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/beauty.4bpp.smol"); +const u32 gPokenavLeftHeaderSmart_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/smart.4bpp.smol"); +const u32 gPokenavLeftHeaderCondition_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/condition.4bpp.smol"); +const u32 gPokenavLeftHeaderCute_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/cute.4bpp.smol"); +const u32 gPokenavLeftHeaderMatchCall_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/match_call.4bpp.smol"); +const u32 gPokenavLeftHeaderMainMenu_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/main_menu.4bpp.smol"); +const u32 gPokenavLeftHeaderHoennMap_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/hoenn_map.4bpp.smol"); +const u32 gPokenavLeftHeaderRibbons_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/ribbons.4bpp.smol"); +const u32 gPokenavLeftHeaderSearch_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/search.4bpp.smol"); +const u32 gPokenavLeftHeaderTough_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/tough.4bpp.smol"); +const u32 gPokenavLeftHeaderCool_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/cool.4bpp.smol"); +const u32 gPokenavLeftHeaderParty_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/party.4bpp.smol"); const u16 gPokenavMessageBox_Pal[] = INCBIN_U16("graphics/pokenav/message.gbapal"); -const u32 gPokenavMessageBox_Gfx[] = INCBIN_U32("graphics/pokenav/message.4bpp.lz"); -const u32 gPokenavMessageBox_Tilemap[] = INCBIN_U32("graphics/pokenav/message.bin.lz"); +const u32 gPokenavMessageBox_Gfx[] = INCBIN_U32("graphics/pokenav/message.4bpp.smol"); +const u32 gPokenavMessageBox_Tilemap[] = INCBIN_U32("graphics/pokenav/message.bin.smolTM"); const u16 gRegionMapCityZoomTiles_Pal[] = INCBIN_U16("graphics/pokenav/region_map/zoom_tiles.gbapal"); -const u32 gRegionMapCityZoomText_Gfx[] = INCBIN_U32("graphics/pokenav/region_map/city_zoom_text.4bpp.lz"); +const u32 gRegionMapCityZoomText_Gfx[] = INCBIN_U32("graphics/pokenav/region_map/city_zoom_text.4bpp.smol"); const u16 gPokenavConditionCancel_Pal[] = INCBIN_U16("graphics/pokenav/condition/cancel.gbapal"); const u8 gPokenavConditionCancel_Gfx[] = INCBIN_U8("graphics/pokenav/condition/cancel.4bpp"); @@ -1905,33 +1919,33 @@ const u8 gBerryBlenderPlayerArrow_Gfx[] = INCBIN_U8("graphics/berry_blender/arro static const u8 sEmpty2[0x2C0] = {0}; const u16 gEasyChatRectangleCursor_Pal[] = INCBIN_U16("graphics/easy_chat/rectangle_cursor.gbapal"); -const u32 gEasyChatRectangleCursor_Gfx[] = INCBIN_U32("graphics/easy_chat/rectangle_cursor.4bpp.lz"); +const u32 gEasyChatRectangleCursor_Gfx[] = INCBIN_U32("graphics/easy_chat/rectangle_cursor.4bpp.smol"); const u16 gEasyChatButtonWindow_Pal[] = INCBIN_U16("graphics/easy_chat/button_window.gbapal"); -const u32 gEasyChatButtonWindow_Gfx[] = INCBIN_U32("graphics/easy_chat/button_window.4bpp.lz"); +const u32 gEasyChatButtonWindow_Gfx[] = INCBIN_U32("graphics/easy_chat/button_window.4bpp.smol"); -const u32 gEasyChatMode_Gfx[] = INCBIN_U32("graphics/easy_chat/mode.4bpp.lz"); +const u32 gEasyChatMode_Gfx[] = INCBIN_U32("graphics/easy_chat/mode.4bpp.smol"); const u16 gEasyChatMode_Pal[] = INCBIN_U16("graphics/easy_chat/mode.gbapal"); -const u32 gEasyChatWindow_Gfx[] = INCBIN_U32("graphics/easy_chat/window.4bpp.lz"); // uses mode pal -const u32 gEasyChatWindow_Tilemap[] = INCBIN_U32("graphics/easy_chat/window.bin.lz"); +const u32 gEasyChatWindow_Gfx[] = INCBIN_U32("graphics/easy_chat/window.4bpp.smol"); // uses mode pal +const u32 gEasyChatWindow_Tilemap[] = INCBIN_U32("graphics/easy_chat/window.bin.smolTM"); const u16 gWallClockMale_Pal[] = INCBIN_U16("graphics/wallclock/male.gbapal"); const u16 gWallClockFemale_Pal[] = INCBIN_U16("graphics/wallclock/female.gbapal"); -const u32 gWallClock_Gfx[] = INCBIN_U32("graphics/wallclock/clock.4bpp.lz"); -const u32 gWallClockStart_Tilemap[] = INCBIN_U32("graphics/wallclock/clock_start.bin.lz"); -const u32 gWallClockView_Tilemap[] = INCBIN_U32("graphics/wallclock/clock_view.bin.lz"); +const u32 gWallClock_Gfx[] = INCBIN_U32("graphics/wallclock/clock.4bpp.smol"); +const u32 gWallClockStart_Tilemap[] = INCBIN_U32("graphics/wallclock/clock_start.bin.smolTM"); +const u32 gWallClockView_Tilemap[] = INCBIN_U32("graphics/wallclock/clock_view.bin.smolTM"); const u16 gUsePokeblockCondition_Pal[] = INCBIN_U16("graphics/pokeblock/use_screen/condition.gbapal"); -const u32 gUsePokeblockCondition_Gfx[] = INCBIN_U32("graphics/pokeblock/use_screen/condition.4bpp.lz"); +const u32 gUsePokeblockCondition_Gfx[] = INCBIN_U32("graphics/pokeblock/use_screen/condition.4bpp.smol"); const u16 gUsePokeblockUpDown_Pal[] = INCBIN_U16("graphics/pokeblock/use_screen/updown.gbapal"); const u8 gUsePokeblockUpDown_Gfx[] = INCBIN_U8("graphics/pokeblock/use_screen/updown.4bpp"); const u16 gUsePokeblockGraph_Pal[] = INCBIN_U16("graphics/pokeblock/use_screen/graph.gbapal"); -const u32 gUsePokeblockGraph_Gfx[] = INCBIN_U32("graphics/pokeblock/use_screen/graph.4bpp.lz"); +const u32 gUsePokeblockGraph_Gfx[] = INCBIN_U32("graphics/pokeblock/use_screen/graph.4bpp.smol"); -const u32 gUsePokeblockGraph_Tilemap[] = INCBIN_U32("graphics/pokeblock/use_screen/graph.bin.lz"); +const u32 gUsePokeblockGraph_Tilemap[] = INCBIN_U32("graphics/pokeblock/use_screen/graph.bin.smolTM"); const u16 gUsePokeblockNatureWin_Pal[] = INCBIN_U16("graphics/pokeblock/use_screen/nature.gbapal"); #include "data/graphics/slot_machine.h" @@ -1939,24 +1953,24 @@ const u16 gUsePokeblockNatureWin_Pal[] = INCBIN_U16("graphics/pokeblock/use_scre // trainer card const u16 gHoennTrainerCardGreen_Pal[] = INCBIN_U16("graphics/trainer_card/green.gbapal"); -const u32 gHoennTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/tiles.4bpp.lz"); -const u32 gHoennTrainerCardBg_Tilemap[] = INCBIN_U32("graphics/trainer_card/bg.bin.lz"); -const u32 gHoennTrainerCardFront_Tilemap[] = INCBIN_U32("graphics/trainer_card/front.bin.lz"); -const u32 gHoennTrainerCardBack_Tilemap[] = INCBIN_U32("graphics/trainer_card/back.bin.lz"); -const u32 gHoennTrainerCardFrontLink_Tilemap[] = INCBIN_U32("graphics/trainer_card/front_link.bin.lz"); +const u32 gHoennTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/tiles.4bpp.smol"); +const u32 gHoennTrainerCardBg_Tilemap[] = INCBIN_U32("graphics/trainer_card/bg.bin.smolTM"); +const u32 gHoennTrainerCardFront_Tilemap[] = INCBIN_U32("graphics/trainer_card/front.bin.smolTM"); +const u32 gHoennTrainerCardBack_Tilemap[] = INCBIN_U32("graphics/trainer_card/back.bin.smolTM"); +const u32 gHoennTrainerCardFrontLink_Tilemap[] = INCBIN_U32("graphics/trainer_card/front_link.bin.smolTM"); const u16 gKantoTrainerCardBlue_Pal[] = INCBIN_U16("graphics/trainer_card/frlg/blue.gbapal"); -const u32 gKantoTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/frlg/tiles.4bpp.lz"); -const u32 gKantoTrainerCardBg_Tilemap[] = INCBIN_U32("graphics/trainer_card/frlg/bg.bin.lz"); -const u32 gKantoTrainerCardFront_Tilemap[] = INCBIN_U32("graphics/trainer_card/frlg/front.bin.lz"); -const u32 gKantoTrainerCardBack_Tilemap[] = INCBIN_U32("graphics/trainer_card/frlg/back.bin.lz"); -const u32 gKantoTrainerCardFrontLink_Tilemap[] = INCBIN_U32("graphics/trainer_card/frlg/front_link.bin.lz"); +const u32 gKantoTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/frlg/tiles.4bpp.smol"); +const u32 gKantoTrainerCardBg_Tilemap[] = INCBIN_U32("graphics/trainer_card/frlg/bg.bin.smolTM"); +const u32 gKantoTrainerCardFront_Tilemap[] = INCBIN_U32("graphics/trainer_card/frlg/front.bin.smolTM"); +const u32 gKantoTrainerCardBack_Tilemap[] = INCBIN_U32("graphics/trainer_card/frlg/back.bin.smolTM"); +const u32 gKantoTrainerCardFrontLink_Tilemap[] = INCBIN_U32("graphics/trainer_card/frlg/front_link.bin.smolTM"); // PokΓ©mon storage system -const u32 gStorageSystemMenu_Gfx[] = INCBIN_U32("graphics/pokemon_storage/menu.4bpp.lz"); +const u32 gStorageSystemMenu_Gfx[] = INCBIN_U32("graphics/pokemon_storage/menu.4bpp.smol"); const u16 gStorageSystemPartyMenu_Pal[] = INCBIN_U16("graphics/pokemon_storage/party_menu.gbapal"); -const u32 gStorageSystemPartyMenu_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/party_menu.bin.lz"); +const u32 gStorageSystemPartyMenu_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/party_menu.bin.smolTM"); // naming screen @@ -1969,7 +1983,7 @@ const u16 gNamingScreenMenu_Pal[6][16] = INCBIN_U16("graphics/naming_screen/buttons.gbapal"), INCBIN_U16("graphics/naming_screen/cursor.gbapal"), }; -const u32 gNamingScreenMenu_Gfx[] = INCBIN_U32("graphics/naming_screen/menu.4bpp.lz"); +const u32 gNamingScreenMenu_Gfx[] = INCBIN_U32("graphics/naming_screen/menu.4bpp.smol"); const u32 gNamingScreenPageSwapFrame_Gfx[] = INCBIN_U32("graphics/naming_screen/page_swap_frame.4bpp"); const u32 gNamingScreenBackButton_Gfx[] = INCBIN_U32("graphics/naming_screen/back_button.4bpp"); const u32 gNamingScreenOKButton_Gfx[] = INCBIN_U32("graphics/naming_screen/ok_button.4bpp"); @@ -1982,20 +1996,20 @@ const u32 gNamingScreenCursorFilled_Gfx[] = INCBIN_U32("graphics/naming_s const u32 gNamingScreenPageSwapButton_Gfx[] = INCBIN_U32("graphics/naming_screen/page_swap_button.4bpp"); const u32 gNamingScreenInputArrow_Gfx[] = INCBIN_U32("graphics/naming_screen/input_arrow.4bpp"); const u32 gNamingScreenUnderscore_Gfx[] = INCBIN_U32("graphics/naming_screen/underscore.4bpp"); -const u32 gNamingScreenBackground_Tilemap[] = INCBIN_U32("graphics/naming_screen/background.bin.lz"); -const u32 gNamingScreenKeyboardUpper_Tilemap[] = INCBIN_U32("graphics/naming_screen/keyboard_upper.bin.lz"); -const u32 gNamingScreenKeyboardLower_Tilemap[] = INCBIN_U32("graphics/naming_screen/keyboard_lower.bin.lz"); -const u32 gNamingScreenKeyboardSymbols_Tilemap[] = INCBIN_U32("graphics/naming_screen/keyboard_symbols.bin.lz"); +const u32 gNamingScreenBackground_Tilemap[] = INCBIN_U32("graphics/naming_screen/background.bin.smolTM"); +const u32 gNamingScreenKeyboardUpper_Tilemap[] = INCBIN_U32("graphics/naming_screen/keyboard_upper.bin.smolTM"); +const u32 gNamingScreenKeyboardLower_Tilemap[] = INCBIN_U32("graphics/naming_screen/keyboard_lower.bin.smolTM"); +const u32 gNamingScreenKeyboardSymbols_Tilemap[] = INCBIN_U32("graphics/naming_screen/keyboard_symbols.bin.smolTM"); // union room chat const u16 gUnionRoomChat_Background_Pal[] = INCBIN_U16("graphics/union_room_chat/background.gbapal"); -const u32 gUnionRoomChat_Background_Gfx[] = INCBIN_U32("graphics/union_room_chat/background.4bpp.lz"); -const u32 gUnionRoomChat_Background_Tilemap[] = INCBIN_U32("graphics/union_room_chat/background.bin.lz"); +const u32 gUnionRoomChat_Background_Gfx[] = INCBIN_U32("graphics/union_room_chat/background.4bpp.smol"); +const u32 gUnionRoomChat_Background_Tilemap[] = INCBIN_U32("graphics/union_room_chat/background.bin.smolTM"); const u16 gUnionRoomChat_InputText_Pal[] = INCBIN_U16("graphics/union_room_chat/input_text.gbapal"); const u16 gUnionRoomChat_Keyboard_Pal[] = INCBIN_U16("graphics/union_room_chat/keyboard.gbapal"); -const u32 gUnionRoomChat_Keyboard_Gfx[] = INCBIN_U32("graphics/union_room_chat/keyboard.4bpp.lz"); -const u32 gUnionRoomChat_Keyboard_Tilemap[] = INCBIN_U32("graphics/union_room_chat/keyboard.bin.lz"); -const u32 gUnionRoomChat_RButtonLabels[] = INCBIN_U32("graphics/union_room_chat/r_button_labels.4bpp.lz"); +const u32 gUnionRoomChat_Keyboard_Gfx[] = INCBIN_U32("graphics/union_room_chat/keyboard.4bpp.smol"); +const u32 gUnionRoomChat_Keyboard_Tilemap[] = INCBIN_U32("graphics/union_room_chat/keyboard.bin.smolTM"); +const u32 gUnionRoomChat_RButtonLabels[] = INCBIN_U32("graphics/union_room_chat/r_button_labels.4bpp.smol"); const u16 ALIGNED(4) gTilesetPalettes_General[][16] = { @@ -2017,7 +2031,7 @@ const u16 ALIGNED(4) gTilesetPalettes_General[][16] = INCBIN_U16("data/tilesets/primary/general/palettes/15.gbapal"), }; -const u32 gTilesetTiles_General[] = INCBIN_U32("data/tilesets/primary/general/tiles.4bpp.lz"); +const u32 gTilesetTiles_General[] = INCBIN_U32("data/tilesets/primary/general/tiles.4bpp.smol"); // trade/egg hatch @@ -2042,9 +2056,9 @@ const u16 gMessageBox_Pal[] = INCBIN_U16("graphics/text_window/message_box.gbapa const u8 gMessageBox_Gfx[] = INCBIN_U8("graphics/text_window/message_box.4bpp"); const u8 gSignpostWindow_Gfx[] = INCBIN_U8("graphics/text_window/signpost.4bpp"); -const u32 gWallpaperIcon_Cross[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/cross.4bpp.lz"); -const u32 gWallpaperIcon_Bolt[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/bolt.4bpp.lz"); -const u32 gWallpaperIcon_Plusle[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/plusle.4bpp.lz"); +const u32 gWallpaperIcon_Cross[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/cross.4bpp.smol"); +const u32 gWallpaperIcon_Bolt[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/bolt.4bpp.smol"); +const u32 gWallpaperIcon_Plusle[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/plusle.4bpp.smol"); const u16 gWallpaperPalettes_Horizontal[][16] = { @@ -2052,8 +2066,8 @@ const u16 gWallpaperPalettes_Horizontal[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/horizontal/bg.gbapal"), }; -const u32 gWallpaperTiles_Horizontal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/horizontal/tiles.4bpp.lz"); -const u32 gWallpaperTilemap_Horizontal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/horizontal/tilemap.bin.lz"); +const u32 gWallpaperTiles_Horizontal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/horizontal/tiles.4bpp.smol"); +const u32 gWallpaperTilemap_Horizontal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/horizontal/tilemap.bin.smolTM"); const u16 gWallpaperPalettes_Ribbon[][16] = { @@ -2061,12 +2075,12 @@ const u16 gWallpaperPalettes_Ribbon[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/ribbon/bg.gbapal"), }; -const u32 gWallpaperTiles_Ribbon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/ribbon/tiles.4bpp.lz"); -const u32 gWallpaperTilemap_Ribbon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/ribbon/tilemap.bin.lz"); +const u32 gWallpaperTiles_Ribbon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/ribbon/tiles.4bpp.smol"); +const u32 gWallpaperTilemap_Ribbon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/ribbon/tilemap.bin.smolTM"); const u16 gPokenavRibbonsSummaryBg_Pal[] = INCBIN_U16("graphics/pokenav/ribbons/summary_bg.gbapal"); -const u32 gPokenavRibbonsSummaryBg_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons/summary_bg.4bpp.lz"); -const u32 gPokenavRibbonsSummaryBg_Tilemap[] = INCBIN_U32("graphics/pokenav/ribbons/summary_bg.bin.lz"); +const u32 gPokenavRibbonsSummaryBg_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons/summary_bg.4bpp.smol"); +const u32 gPokenavRibbonsSummaryBg_Tilemap[] = INCBIN_U32("graphics/pokenav/ribbons/summary_bg.bin.smolTM"); const u16 gMonIconPalettes[][16] = { @@ -2081,27 +2095,27 @@ const u16 gMonIconPalettes[][16] = const u16 gTitleScreenBgPalettes[] = INCBIN_U16("graphics/title_screen/pokemon_logo.gbapal", "graphics/title_screen/rayquaza_and_clouds.gbapal"); const u16 gTitleScreenEmeraldVersionPal[] = INCBIN_U16("graphics/title_screen/emerald_version.gbapal"); -const u32 gTitleScreenCloudsTilemap[] = INCBIN_U32("graphics/title_screen/clouds.bin.lz"); -const u32 gTitleScreenPokemonLogoGfx[] = INCBIN_U32("graphics/title_screen/pokemon_logo.8bpp.lz"); -const u32 gTitleScreenEmeraldVersionGfx[] = INCBIN_U32("graphics/title_screen/emerald_version.8bpp.lz"); +const u32 gTitleScreenCloudsTilemap[] = INCBIN_U32("graphics/title_screen/clouds.bin.smolTM"); +const u32 gTitleScreenPokemonLogoGfx[] = INCBIN_U32("graphics/title_screen/pokemon_logo.8bpp.smol"); +const u32 gTitleScreenEmeraldVersionGfx[] = INCBIN_U32("graphics/title_screen/emerald_version.8bpp.smol"); const u16 gTitleScreenPressStartPal[] = INCBIN_U16("graphics/title_screen/press_start.gbapal"); -const u32 gTitleScreenPressStartGfx[] = INCBIN_U32("graphics/title_screen/press_start.4bpp.lz"); -const u32 gTitleScreenPokemonLogoTilemap[] = INCBIN_U32("graphics/title_screen/pokemon_logo.bin.lz"); +const u32 gTitleScreenPressStartGfx[] = INCBIN_U32("graphics/title_screen/press_start.4bpp.smol"); +const u32 gTitleScreenPokemonLogoTilemap[] = INCBIN_U32("graphics/title_screen/pokemon_logo.bin.smolTM"); const u16 gFrontierPassBg_Pal[][16] = INCBIN_U16("graphics/frontier_pass/bg.gbapal"); // 8 x 16 -const u32 gFrontierPassBg_Gfx[] = INCBIN_U32("graphics/frontier_pass/bg.4bpp.lz"); -const u32 gFrontierPassMapAndCard_Gfx[] = INCBIN_U32("graphics/frontier_pass/map_and_card.8bpp.lz"); -const u32 gFrontierPassBg_Tilemap[] = INCBIN_U32("graphics/frontier_pass/bg.bin.lz"); +const u32 gFrontierPassBg_Gfx[] = INCBIN_U32("graphics/frontier_pass/bg.4bpp.smol"); +const u32 gFrontierPassMapAndCard_Gfx[] = INCBIN_U32("graphics/frontier_pass/map_and_card.8bpp.smol"); +const u32 gFrontierPassBg_Tilemap[] = INCBIN_U32("graphics/frontier_pass/bg.bin.smolTM"); const u32 gFrontierPassCancelButton_Tilemap[] = INCBIN_U32("graphics/frontier_pass/cancel.bin"); const u32 gFrontierPassCancelButtonHighlighted_Tilemap[] = INCBIN_U32("graphics/frontier_pass/cancel_highlighted.bin"); // Berry Crush const u16 gBerryCrush_Crusher_Pal[] = INCBIN_U16("graphics/berry_crush/crusher.gbapal"); -const u32 gBerryCrush_Crusher_Gfx[] = INCBIN_U32("graphics/berry_crush/crusher.4bpp.lz"); -const u32 gBerryCrush_TextWindows_Tilemap[] = INCBIN_U32("graphics/berry_crush/text_windows.bin.lz"); +const u32 gBerryCrush_Crusher_Gfx[] = INCBIN_U32("graphics/berry_crush/crusher.4bpp.smol"); +const u32 gBerryCrush_TextWindows_Tilemap[] = INCBIN_U32("graphics/berry_crush/text_windows.bin.smolTM"); -const u32 gBattleIcons_Gfx1[] = INCBIN_U32("graphics/types/battle_icons1.4bpp.lz"); -const u32 gBattleIcons_Gfx2[] = INCBIN_U32("graphics/types/battle_icons2.4bpp.lz"); +const u32 gBattleIcons_Gfx1[] = INCBIN_U32("graphics/types/battle_icons1.4bpp.smol"); +const u32 gBattleIcons_Gfx2[] = INCBIN_U32("graphics/types/battle_icons2.4bpp.smol"); const u16 gBattleIcons_Pal1[] = INCBIN_U16("graphics/types/battle_icons1.gbapal"); const u16 gBattleIcons_Pal2[] = INCBIN_U16("graphics/types/battle_icons2.gbapal"); diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c index 06142b0bb03a..08b6bfb8f3f0 100644 --- a/src/hall_of_fame.c +++ b/src/hall_of_fame.c @@ -317,7 +317,7 @@ static const struct SpriteTemplate sSpriteTemplate_HofConfetti = static const u16 sHallOfFame_Pal[] = INCBIN_U16("graphics/misc/japanese_hof.gbapal"); -static const u32 sHallOfFame_Gfx[] = INCBIN_U32("graphics/misc/japanese_hof.4bpp.lz"); +static const u32 sHallOfFame_Gfx[] = INCBIN_U32("graphics/misc/japanese_hof.4bpp.smol"); static const struct HallofFameMon sDummyFameMon = { diff --git a/src/heal_location.c b/src/heal_location.c index b261fce17d5a..fd376e71e042 100644 --- a/src/heal_location.c +++ b/src/heal_location.c @@ -1,11 +1,11 @@ #include "global.h" #include "event_data.h" #include "heal_location.h" +#include "constants/event_objects.h" #include "constants/heal_locations.h" #include "constants/maps.h" #include "data/heal_locations.h" -#include "data/heal_locations_pkm_center.h" u32 GetHealLocationIndexByMap(u16 mapGroup, u16 mapNum) { @@ -81,14 +81,13 @@ u32 GetHealNpcLocalId(u32 healLocationId) if (healLocationId == HEAL_LOCATION_NONE || healLocationId >= NUM_HEAL_LOCATIONS) return 0; - return sHealNpcLocalId[healLocationId - 1]; + return sWhiteoutRespawnHealerNpcIds[healLocationId - 1]; } void SetWhiteoutRespawnWarpAndHealerNPC(struct WarpData *warp) { u32 healLocationId = GetHealLocationIndexByWarpData(&gSaveBlock1Ptr->lastHealLocation); u32 healNpcLocalId = GetHealNpcLocalId(healLocationId); - struct HealLocation pkmCenterHealLocation; if (!healNpcLocalId) { @@ -96,11 +95,10 @@ void SetWhiteoutRespawnWarpAndHealerNPC(struct WarpData *warp) return; } - pkmCenterHealLocation = sHealLocationsPokemonCenter[healLocationId - 1]; - warp->mapGroup = pkmCenterHealLocation.mapGroup; - warp->mapNum = pkmCenterHealLocation.mapNum; + warp->mapGroup = sWhiteoutRespawnHealCenterMapIdxs[healLocationId - 1][0]; + warp->mapNum = sWhiteoutRespawnHealCenterMapIdxs[healLocationId - 1][1]; warp->warpId = WARP_ID_NONE; - warp->x = pkmCenterHealLocation.x; - warp->y = pkmCenterHealLocation.y; + warp->x = sWhiteoutRespawnHealCenterMapIdxs[healLocationId - 1][2]; + warp->y = sWhiteoutRespawnHealCenterMapIdxs[healLocationId - 1][3]; gSpecialVar_LastTalked = healNpcLocalId; } diff --git a/src/international_string_util.c b/src/international_string_util.c index feba03c97f5a..b5a904c773a0 100644 --- a/src/international_string_util.c +++ b/src/international_string_util.c @@ -220,7 +220,7 @@ void FillWindowTilesByRow(int windowId, int columnStart, int rowStart, int numFi fillSize = numFillTiles * TILE_SIZE_4BPP; windowRowSize = window->window.width * TILE_SIZE_4BPP; - windowTileData = window->tileData + (rowStart * windowRowSize) + (columnStart * TILE_SIZE_4BPP); + windowTileData = (u8 *)window->tileData + (rowStart * windowRowSize) + (columnStart * TILE_SIZE_4BPP); if (numRows > 0) { for (i = numRows; i != 0; i--) diff --git a/src/intro.c b/src/intro.c index ae5ee190fcb8..6548fec358f7 100644 --- a/src/intro.c +++ b/src/intro.c @@ -183,24 +183,24 @@ COMMON_DATA struct GcmbStruct gMultibootProgramStruct = {0}; static const u16 sIntroDrops_Pal[] = INCBIN_U16("graphics/intro/scene_1/drops.gbapal"); static const u16 sIntroLogo_Pal[] = INCBIN_U16("graphics/intro/scene_1/logo.gbapal"); -static const u32 sIntroDropsLogo_Gfx[] = INCBIN_U32("graphics/intro/scene_1/drops_logo.4bpp.lz"); +static const u32 sIntroDropsLogo_Gfx[] = INCBIN_U32("graphics/intro/scene_1/drops_logo.4bpp.smol"); static const u16 sIntro1Bg_Pal[] = INCBIN_U16("graphics/intro/scene_1/bg.gbapal"); // 16 x 16 -static const u32 sIntro1Bg0_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg0_map.bin.lz"); -static const u32 sIntro1Bg1_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg1_map.bin.lz"); -static const u32 sIntro1Bg2_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg2_map.bin.lz"); -static const u32 sIntro1Bg3_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg3_map.bin.lz"); -static const u32 sIntro1Bg_Gfx[] = INCBIN_U32("graphics/intro/scene_1/bg.4bpp.lz"); +static const u32 sIntro1Bg0_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg0_map.bin.smolTM"); +static const u32 sIntro1Bg1_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg1_map.bin.smolTM"); +static const u32 sIntro1Bg2_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg2_map.bin.smolTM"); +static const u32 sIntro1Bg3_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg3_map.bin.smolTM"); +static const u32 sIntro1Bg_Gfx[] = INCBIN_U32("graphics/intro/scene_1/bg.4bpp.smol"); static const u16 sIntroPokeball_Pal[] = INCBIN_U16("graphics/intro/scene_3/pokeball.gbapal"); -static const u32 sIntroPokeball_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/pokeball_map.bin.lz"); -static const u32 sIntroPokeball_Gfx[] = INCBIN_U32("graphics/intro/scene_3/pokeball.8bpp.lz"); +static const u32 sIntroPokeball_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/pokeball_map.bin.smolTM"); +static const u32 sIntroPokeball_Gfx[] = INCBIN_U32("graphics/intro/scene_3/pokeball.8bpp.smol"); static const u16 sIntroStreaks_Pal[] = INCBIN_U16("graphics/intro/scene_3/streaks.gbapal"); // Unused -static const u32 sIntroStreaks_Gfx[] = INCBIN_U32("graphics/intro/scene_3/streaks.4bpp.lz"); // Unused -static const u32 sIntroStreaks_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/streaks_map.bin.lz"); // Unused +static const u32 sIntroStreaks_Gfx[] = INCBIN_U32("graphics/intro/scene_3/streaks.4bpp.smol"); // Unused +static const u32 sIntroStreaks_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/streaks_map.bin.smolTM"); // Unused static const u16 sIntroRayquzaOrb_Pal[] = INCBIN_U16("graphics/intro/scene_3/rayquaza_orb.gbapal"); static const u16 sIntroMisc_Pal[] = INCBIN_U16("graphics/intro/scene_3/misc.gbapal"); // Unused -static const u32 sIntroMisc_Gfx[] = INCBIN_U32("graphics/intro/scene_3/misc.4bpp.lz"); // Rayquza orb, and misc unused gfx +static const u32 sIntroMisc_Gfx[] = INCBIN_U32("graphics/intro/scene_3/misc.4bpp.smol"); // Rayquza orb, and misc unused gfx static const u16 sIntroFlygonSilhouette_Pal[] = INCBIN_U16("graphics/intro/scene_1/flygon.gbapal"); -static const u32 sIntroLati_Gfx[] = INCBIN_U32("graphics/intro/scene_1/lati.4bpp.lz"); // Unused +static const u32 sIntroLati_Gfx[] = INCBIN_U32("graphics/intro/scene_1/lati.4bpp.smol"); // Unused static const u8 sUnusedData[] = { 0x02, 0x03, 0x04, 0x05, 0x01, 0x01, 0x01, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x02, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x02, 0x0D, 0x0E, 0x0F, @@ -1059,8 +1059,8 @@ static void MainCB2_EndIntro(void) static void LoadCopyrightGraphics(u16 tilesetAddress, u16 tilemapAddress, u16 paletteOffset) { - LZ77UnCompVram(gIntroCopyright_Gfx, (void *)(VRAM + tilesetAddress)); - LZ77UnCompVram(gIntroCopyright_Tilemap, (void *)(VRAM + tilemapAddress)); + DecompressDataWithHeaderVram(gIntroCopyright_Gfx, (void *)(VRAM + tilesetAddress)); + DecompressDataWithHeaderVram(gIntroCopyright_Tilemap, (void *)(VRAM + tilemapAddress)); LoadPalette(gIntroCopyright_Pal, paletteOffset, PLTT_SIZE_4BPP); } @@ -1184,14 +1184,14 @@ void Task_Scene1_Load(u8 taskId) SetGpuReg(REG_OFFSET_BG2VOFS, 80); SetGpuReg(REG_OFFSET_BG1VOFS, 24); SetGpuReg(REG_OFFSET_BG0VOFS, 40); - LZ77UnCompVram(sIntro1Bg_Gfx, (void *)VRAM); - LZ77UnCompVram(sIntro1Bg0_Tilemap, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(sIntro1Bg_Gfx, (void *)VRAM); + DecompressDataWithHeaderVram(sIntro1Bg0_Tilemap, (void *)(BG_CHAR_ADDR(2))); DmaClear16(3, BG_SCREEN_ADDR(17), BG_SCREEN_SIZE); - LZ77UnCompVram(sIntro1Bg1_Tilemap, (void *)(BG_SCREEN_ADDR(18))); + DecompressDataWithHeaderVram(sIntro1Bg1_Tilemap, (void *)(BG_SCREEN_ADDR(18))); DmaClear16(3, BG_SCREEN_ADDR(19), BG_SCREEN_SIZE); - LZ77UnCompVram(sIntro1Bg2_Tilemap, (void *)(BG_SCREEN_ADDR(20))); + DecompressDataWithHeaderVram(sIntro1Bg2_Tilemap, (void *)(BG_SCREEN_ADDR(20))); DmaClear16(3, BG_SCREEN_ADDR(21), BG_SCREEN_SIZE); - LZ77UnCompVram(sIntro1Bg3_Tilemap, (void *)(BG_SCREEN_ADDR(22))); + DecompressDataWithHeaderVram(sIntro1Bg3_Tilemap, (void *)(BG_SCREEN_ADDR(22))); DmaClear16(3, BG_SCREEN_ADDR(23), BG_SCREEN_SIZE); LoadPalette(sIntro1Bg_Pal, BG_PLTT_ID(0), sizeof(sIntro1Bg_Pal)); SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(22) | BGCNT_16COLOR | BGCNT_TXT256x512); @@ -1730,8 +1730,8 @@ static void SpriteCB_Manectric(struct Sprite *sprite) static void Task_Scene3_Load(u8 taskId) { IntroResetGpuRegs(); - LZ77UnCompVram(sIntroPokeball_Gfx, (void *)VRAM); - LZ77UnCompVram(sIntroPokeball_Tilemap, (void *)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(sIntroPokeball_Gfx, (void *)VRAM); + DecompressDataWithHeaderVram(sIntroPokeball_Tilemap, (void *)(BG_CHAR_ADDR(1))); LoadPalette(sIntroPokeball_Pal, BG_PLTT_ID(0), sizeof(sIntroPokeball_Pal)); gTasks[taskId].tAlpha = 0; gTasks[taskId].tZoomDiv = 0; @@ -1785,10 +1785,10 @@ static void Task_Scene3_LoadGroudon(u8 taskId) ResetSpriteData(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 8; - LZDecompressVram(gIntroGroudon_Gfx, (void *)VRAM); - LZDecompressVram(gIntroGroudon_Tilemap, (void *)(BG_CHAR_ADDR(3))); - LZDecompressVram(gIntroLegendBg_Gfx, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(gIntroGroudonBg_Tilemap, (void *)(BG_SCREEN_ADDR(28))); + DecompressDataWithHeaderVram(gIntroGroudon_Gfx, (void *)VRAM); + DecompressDataWithHeaderVram(gIntroGroudon_Tilemap, (void *)(BG_CHAR_ADDR(3))); + DecompressDataWithHeaderVram(gIntroLegendBg_Gfx, (void *)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(gIntroGroudonBg_Tilemap, (void *)(BG_SCREEN_ADDR(28))); LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_ROCKS)]); LoadSpritePalette(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_ROCKS)]); CpuCopy16(gIntro3Bg_Pal, gPlttBufferUnfaded, sizeof(gIntro3Bg_Pal)); @@ -2063,9 +2063,9 @@ static void SpriteCB_GroudonRocks(struct Sprite *sprite) static void Task_Scene3_LoadKyogre(u8 taskId) { ResetSpriteData(); - LZDecompressVram(gIntroKyogre_Gfx, (void *)VRAM); - LZDecompressVram(gIntroKyogre_Tilemap, (void *)(BG_CHAR_ADDR(3))); - LZDecompressVram(gIntroKyogreBg_Tilemap, (void *)(BG_SCREEN_ADDR(28))); + DecompressDataWithHeaderVram(gIntroKyogre_Gfx, (void *)VRAM); + DecompressDataWithHeaderVram(gIntroKyogre_Tilemap, (void *)(BG_CHAR_ADDR(3))); + DecompressDataWithHeaderVram(gIntroKyogreBg_Tilemap, (void *)(BG_SCREEN_ADDR(28))); LoadCompressedSpriteSheet(sSpriteSheet_Bubbles); LoadSpritePalette(sSpritePalette_Bubbles); BeginNormalPaletteFade(PALETTES_ALL & ~1, 0, 16, 0, RGB_WHITEALPHA); @@ -2371,16 +2371,16 @@ static void Task_Scene3_LoadClouds1(u8 taskId) SetGpuReg(REG_OFFSET_BG1VOFS, 0); SetGpuReg(REG_OFFSET_BG2HOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); - LZDecompressVram(gIntroClouds_Gfx, (void *)VRAM); - LZDecompressVram(gIntroClouds_Gfx, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(gIntroCloudsSun_Tilemap, (void *)(BG_SCREEN_ADDR(28))); + DecompressDataWithHeaderVram(gIntroClouds_Gfx, (void *)VRAM); + DecompressDataWithHeaderVram(gIntroClouds_Gfx, (void *)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(gIntroCloudsSun_Tilemap, (void *)(BG_SCREEN_ADDR(28))); gTasks[taskId].func = Task_Scene3_LoadClouds2; } static void Task_Scene3_LoadClouds2(u8 taskId) { - LZDecompressVram(gIntroCloudsLeft_Tilemap, (void *)(BG_CHAR_ADDR(3))); - LZDecompressVram(gIntroCloudsRight_Tilemap, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gIntroCloudsLeft_Tilemap, (void *)(BG_CHAR_ADDR(3))); + DecompressDataWithHeaderVram(gIntroCloudsRight_Tilemap, (void *)(BG_SCREEN_ADDR(26))); gTasks[taskId].func = Task_Scene3_InitClouds; } @@ -2438,10 +2438,10 @@ static void Task_Scene3_Clouds(u8 taskId) static void Task_Scene3_LoadLightning(u8 taskId) { - LZDecompressVram(gIntroRayquaza_Tilemap, (void *)(BG_SCREEN_ADDR(28))); - LZDecompressVram(gIntroRayquazaClouds_Tilemap, (void *)(BG_CHAR_ADDR(3))); - LZDecompressVram(gIntroRayquaza_Gfx, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(gIntroRayquazaClouds_Gfx, (void *)VRAM); + DecompressDataWithHeaderVram(gIntroRayquaza_Tilemap, (void *)(BG_SCREEN_ADDR(28))); + DecompressDataWithHeaderVram(gIntroRayquazaClouds_Tilemap, (void *)(BG_CHAR_ADDR(3))); + DecompressDataWithHeaderVram(gIntroRayquaza_Gfx, (void *)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(gIntroRayquazaClouds_Gfx, (void *)VRAM); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON diff --git a/src/intro_credits_graphics.c b/src/intro_credits_graphics.c index c4b059fdd78b..f59d66111068 100644 --- a/src/intro_credits_graphics.c +++ b/src/intro_credits_graphics.c @@ -40,36 +40,36 @@ struct IntroCreditsSpriteMetadata static const u16 sGrass_Pal[] = INCBIN_U16("graphics/intro/scene_2/grass.gbapal"); static const u16 sGrassSunset_Pal[] = INCBIN_U16("graphics/intro/scene_2/grass_sunset.gbapal"); static const u16 sGrassNight_Pal[] = INCBIN_U16("graphics/intro/scene_2/grass_night.gbapal"); -static const u32 sGrass_Gfx[] = INCBIN_U32("graphics/intro/scene_2/grass.4bpp.lz"); -static const u32 sGrass_Tilemap[] = INCBIN_U32("graphics/intro/scene_2/grass_map.bin.lz"); +static const u32 sGrass_Gfx[] = INCBIN_U32("graphics/intro/scene_2/grass.4bpp.smol"); +static const u32 sGrass_Tilemap[] = INCBIN_U32("graphics/intro/scene_2/grass_map.bin.smolTM"); static const u16 sCloudsBg_Pal[] = INCBIN_U16("graphics/intro/scene_2/clouds_bg.gbapal"); static const u16 sCloudsBgSunset_Pal[] = INCBIN_U16("graphics/intro/scene_2/clouds_bg_sunset.gbapal"); -static const u32 sCloudsBg_Gfx[] = INCBIN_U32("graphics/intro/scene_2/clouds_bg.4bpp.lz"); -static const u32 sCloudsBg_Tilemap[] = INCBIN_U32("graphics/intro/scene_2/clouds_bg_map.bin.lz"); +static const u32 sCloudsBg_Gfx[] = INCBIN_U32("graphics/intro/scene_2/clouds_bg.4bpp.smol"); +static const u32 sCloudsBg_Tilemap[] = INCBIN_U32("graphics/intro/scene_2/clouds_bg_map.bin.smolTM"); static const u16 sClouds_Pal[] = INCBIN_U16("graphics/intro/scene_2/clouds.gbapal"); static const u16 sCloudsSunset_Pal[] = INCBIN_U16("graphics/intro/scene_2/clouds_sunset.gbapal"); -static const u32 sClouds_Gfx[] = INCBIN_U32("graphics/intro/scene_2/clouds.4bpp.lz"); +static const u32 sClouds_Gfx[] = INCBIN_U32("graphics/intro/scene_2/clouds.4bpp.smol"); static const u16 sTrees_Pal[] = INCBIN_U16("graphics/intro/scene_2/trees.gbapal"); static const u16 sTreesSunset_Pal[] = INCBIN_U16("graphics/intro/scene_2/trees_sunset.gbapal"); -static const u32 sTrees_Gfx[] = INCBIN_U32("graphics/intro/scene_2/trees.4bpp.lz"); -static const u32 sTrees_Tilemap[] = INCBIN_U32("graphics/intro/scene_2/trees_map.bin.lz"); +static const u32 sTrees_Gfx[] = INCBIN_U32("graphics/intro/scene_2/trees.4bpp.smol"); +static const u32 sTrees_Tilemap[] = INCBIN_U32("graphics/intro/scene_2/trees_map.bin.smolTM"); static const u16 sTreesSmall_Pal[] = INCBIN_U16("graphics/intro/scene_2/trees_small.gbapal"); -static const u32 sTreesSmall_Gfx[] = INCBIN_U32("graphics/intro/scene_2/trees_small.4bpp.lz"); +static const u32 sTreesSmall_Gfx[] = INCBIN_U32("graphics/intro/scene_2/trees_small.4bpp.smol"); static const u16 sHouses_Pal[] = INCBIN_U16("graphics/intro/scene_2/houses.gbapal"); -static const u32 sHouses_Gfx[] = INCBIN_U32("graphics/intro/scene_2/houses.4bpp.lz"); +static const u32 sHouses_Gfx[] = INCBIN_U32("graphics/intro/scene_2/houses.4bpp.smol"); static const u16 sHouseSilhouette_Pal[] = INCBIN_U16("graphics/intro/scene_2/house_silhouette.gbapal"); -static const u32 sHouses_Tilemap[] = INCBIN_U32("graphics/intro/scene_2/houses_map.bin.lz"); -static const u32 sHouseSilhouette_Gfx[] = INCBIN_U32("graphics/intro/scene_2/house_silhouette.4bpp.lz"); +static const u32 sHouses_Tilemap[] = INCBIN_U32("graphics/intro/scene_2/houses_map.bin.smolTM"); +static const u32 sHouseSilhouette_Gfx[] = INCBIN_U32("graphics/intro/scene_2/house_silhouette.4bpp.smol"); static const u16 sBrendanCredits_Pal[] = INCBIN_U16("graphics/intro/scene_2/brendan_credits.gbapal"); -static const u32 sBrendanCredits_Gfx[] = INCBIN_U32("graphics/intro/scene_2/brendan_credits.4bpp.lz"); +static const u32 sBrendanCredits_Gfx[] = INCBIN_U32("graphics/intro/scene_2/brendan_credits.4bpp.smol"); static const u16 sMayCredits_Pal[] = INCBIN_U16("graphics/intro/scene_2/may_credits.gbapal"); static const u16 sUnused[0xF0] = {0}; -static const u32 sMayCredits_Gfx[] = INCBIN_U32("graphics/intro/scene_2/may_credits.4bpp.lz"); -static const u32 sBicycle_Gfx[] = INCBIN_U32("graphics/intro/scene_2/bicycle.4bpp.lz"); +static const u32 sMayCredits_Gfx[] = INCBIN_U32("graphics/intro/scene_2/may_credits.4bpp.smol"); +static const u32 sBicycle_Gfx[] = INCBIN_U32("graphics/intro/scene_2/bicycle.4bpp.smol"); static const u16 sLatios_Pal[] = INCBIN_U16("graphics/intro/scene_2/latios.gbapal"); -static const u32 sLatios_Gfx[] = INCBIN_U32("graphics/intro/scene_2/latios.4bpp.lz"); +static const u32 sLatios_Gfx[] = INCBIN_U32("graphics/intro/scene_2/latios.4bpp.smol"); static const u16 sLatias_Pal[] = INCBIN_U16("graphics/intro/scene_2/latias.gbapal"); -static const u32 sLatias_Gfx[] = INCBIN_U32("graphics/intro/scene_2/latias.4bpp.lz"); +static const u32 sLatias_Gfx[] = INCBIN_U32("graphics/intro/scene_2/latias.4bpp.smol"); static void SpriteCB_MovingScenery(struct Sprite *sprite); static void SpriteCB_Player(struct Sprite *sprite); @@ -728,8 +728,8 @@ static void Task_BicycleBgAnimation(u8); void LoadIntroPart2Graphics(u8 scenery) { - LZ77UnCompVram(sGrass_Gfx, (void *)(BG_CHAR_ADDR(1))); - LZ77UnCompVram(sGrass_Tilemap, (void *)(BG_SCREEN_ADDR(15))); + DecompressDataWithHeaderVram(sGrass_Gfx, (void *)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(sGrass_Tilemap, (void *)(BG_SCREEN_ADDR(15))); LoadPalette(&sGrass_Pal, BG_PLTT_ID(15), sizeof(sGrass_Pal)); switch (scenery) { @@ -737,16 +737,16 @@ void LoadIntroPart2Graphics(u8 scenery) default: // Never reached, only called with an argument of 1 // Clouds are never used in this part of the intro - LZ77UnCompVram(sCloudsBg_Gfx, (void *)(VRAM)); - LZ77UnCompVram(sCloudsBg_Tilemap, (void *)(BG_SCREEN_ADDR(6))); + DecompressDataWithHeaderVram(sCloudsBg_Gfx, (void *)(VRAM)); + DecompressDataWithHeaderVram(sCloudsBg_Tilemap, (void *)(BG_SCREEN_ADDR(6))); LoadPalette(&sCloudsBg_Pal, BG_PLTT_ID(0), sizeof(sCloudsBg_Pal)); LoadCompressedSpriteSheet(sSpriteSheet_Clouds); LoadPalette(&sClouds_Pal, OBJ_PLTT_ID(0), sizeof(sClouds_Pal)); CreateCloudSprites(); break; case 1: - LZ77UnCompVram(sTrees_Gfx, (void *)(VRAM)); - LZ77UnCompVram(sTrees_Tilemap, (void *)(BG_SCREEN_ADDR(6))); + DecompressDataWithHeaderVram(sTrees_Gfx, (void *)(VRAM)); + DecompressDataWithHeaderVram(sTrees_Tilemap, (void *)(BG_SCREEN_ADDR(6))); LoadPalette(&sTrees_Pal, BG_PLTT_ID(0), sizeof(sTrees_Pal)); LoadCompressedSpriteSheet(sSpriteSheet_TreesSmall); LoadPalette(&sTreesSmall_Pal, OBJ_PLTT_ID(0), sizeof(sTreesSmall_Pal)); @@ -837,36 +837,36 @@ void SetIntroPart2BgCnt(u8 scenery) void LoadCreditsSceneGraphics(u8 scene) { - LZ77UnCompVram(sGrass_Gfx, (void *)(BG_CHAR_ADDR(1))); - LZ77UnCompVram(sGrass_Tilemap, (void *)(BG_SCREEN_ADDR(15))); + DecompressDataWithHeaderVram(sGrass_Gfx, (void *)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(sGrass_Tilemap, (void *)(BG_SCREEN_ADDR(15))); switch (scene) { case SCENE_OCEAN_MORNING: default: LoadPalette(&sGrass_Pal, BG_PLTT_ID(15), sizeof(sGrass_Pal)); - LZ77UnCompVram(sCloudsBg_Gfx, (void *)(VRAM)); - LZ77UnCompVram(sCloudsBg_Tilemap, (void *)(BG_SCREEN_ADDR(6))); + DecompressDataWithHeaderVram(sCloudsBg_Gfx, (void *)(VRAM)); + DecompressDataWithHeaderVram(sCloudsBg_Tilemap, (void *)(BG_SCREEN_ADDR(6))); LoadPalette(&sCloudsBg_Pal, BG_PLTT_ID(0), sizeof(sCloudsBg_Pal)); LoadCompressedSpriteSheet(sSpriteSheet_Clouds); - LZ77UnCompVram(sClouds_Gfx, (void *)(OBJ_VRAM0)); + DecompressDataWithHeaderVram(sClouds_Gfx, (void *)(OBJ_VRAM0)); LoadPalette(&sClouds_Pal, OBJ_PLTT_ID(0), sizeof(sClouds_Pal)); CreateCloudSprites(); break; case SCENE_OCEAN_SUNSET: LoadPalette(&sGrassSunset_Pal, BG_PLTT_ID(15), sizeof(sGrassSunset_Pal)); - LZ77UnCompVram(sCloudsBg_Gfx, (void *)(VRAM)); - LZ77UnCompVram(sCloudsBg_Tilemap, (void *)(BG_SCREEN_ADDR(6))); + DecompressDataWithHeaderVram(sCloudsBg_Gfx, (void *)(VRAM)); + DecompressDataWithHeaderVram(sCloudsBg_Tilemap, (void *)(BG_SCREEN_ADDR(6))); LoadPalette(&sCloudsBgSunset_Pal, BG_PLTT_ID(0), sizeof(sCloudsBgSunset_Pal)); LoadCompressedSpriteSheet(sSpriteSheet_Clouds); - LZ77UnCompVram(sClouds_Gfx, (void *)(OBJ_VRAM0)); + DecompressDataWithHeaderVram(sClouds_Gfx, (void *)(OBJ_VRAM0)); LoadPalette(&sCloudsSunset_Pal, OBJ_PLTT_ID(0), sizeof(sCloudsSunset_Pal)); CreateCloudSprites(); break; case SCENE_FOREST_RIVAL_ARRIVE: case SCENE_FOREST_CATCH_RIVAL: LoadPalette(&sGrassSunset_Pal, BG_PLTT_ID(15), sizeof(sGrassSunset_Pal)); - LZ77UnCompVram(sTrees_Gfx, (void *)(VRAM)); - LZ77UnCompVram(sTrees_Tilemap, (void *)(BG_SCREEN_ADDR(6))); + DecompressDataWithHeaderVram(sTrees_Gfx, (void *)(VRAM)); + DecompressDataWithHeaderVram(sTrees_Tilemap, (void *)(BG_SCREEN_ADDR(6))); LoadPalette(&sTreesSunset_Pal, BG_PLTT_ID(0), sizeof(sTreesSunset_Pal)); LoadCompressedSpriteSheet(sSpriteSheet_TreesSmall); LoadPalette(&sTreesSunset_Pal, OBJ_PLTT_ID(0), sizeof(sTreesSunset_Pal)); @@ -874,8 +874,8 @@ void LoadCreditsSceneGraphics(u8 scene) break; case SCENE_CITY_NIGHT: LoadPalette(&sGrassNight_Pal, BG_PLTT_ID(15), sizeof(sGrassNight_Pal)); - LZ77UnCompVram(sHouses_Gfx, (void *)(VRAM)); - LZ77UnCompVram(sHouses_Tilemap, (void *)(BG_SCREEN_ADDR(6))); + DecompressDataWithHeaderVram(sHouses_Gfx, (void *)(VRAM)); + DecompressDataWithHeaderVram(sHouses_Tilemap, (void *)(BG_SCREEN_ADDR(6))); LoadPalette(&sHouses_Pal, BG_PLTT_ID(0), sizeof(sHouses_Pal)); LoadCompressedSpriteSheet(sSpriteSheet_HouseSilhouette); LoadPalette(&sHouseSilhouette_Pal, OBJ_PLTT_ID(0), sizeof(sHouseSilhouette_Pal)); diff --git a/src/item.c b/src/item.c index 87752548f3f8..d9de596eabc9 100644 --- a/src/item.c +++ b/src/item.c @@ -21,67 +21,145 @@ #include "constants/item_effects.h" #include "constants/hold_effects.h" -static bool8 CheckPyramidBagHasItem(u16 itemId, u16 count); -static bool8 CheckPyramidBagHasSpace(u16 itemId, u16 count); +#define DUMMY_PC_BAG_POCKET \ +{ \ + .id = POCKET_DUMMY, \ + .capacity = PC_ITEMS_COUNT, \ + .itemSlots = gSaveBlock1Ptr->pcItems, \ +} + +static bool32 CheckPyramidBagHasItem(u16 itemId, u16 count); +static bool32 CheckPyramidBagHasSpace(u16 itemId, u16 count); static const u8 *GetItemPluralName(u16); static bool32 DoesItemHavePluralName(u16); +static void NONNULL BagPocket_CompactItems(struct BagPocket *pocket); EWRAM_DATA struct BagPocket gBagPockets[POCKETS_COUNT] = {0}; #include "data/pokemon/item_effects.h" #include "data/items.h" -static u16 GetBagItemQuantity(u16 *quantity) +#define UNPACK_TM_ITEM_ID(_tm) [CAT(ENUM_TM_HM_, _tm) + 1] = { CAT(ITEM_TM_, _tm), CAT(MOVE_, _tm) }, +#define UNPACK_HM_ITEM_ID(_hm) [CAT(ENUM_TM_HM_, _hm) + 1] = { CAT(ITEM_HM_, _hm), CAT(MOVE_, _hm) }, + +const struct TmHmIndexKey gTMHMItemMoveIds[NUM_ALL_MACHINES + 1] = +{ + [0] = { ITEM_NONE, MOVE_NONE }, // Failsafe + FOREACH_TM(UNPACK_TM_ITEM_ID) + FOREACH_HM(UNPACK_HM_ITEM_ID) + /* + * Expands to the following: + * + * [1] = { ITEM_TM_FOCUS_PUNCH, MOVE_FOCUS_PUNCH }, + * [2] = { ITEM_TM_DRAGON_CLAW, MOVE_DRAGON_CLAW }, + * [3] = { ITEM_TM_WATER_PULSE, MOVE_WATER_PULSE }, + * etc etc + */ +}; + +#undef UNPACK_TM_ITEM_ID +#undef UNPACK_HM_ITEM_ID + +static inline struct ItemSlot NONNULL BagPocket_GetSlotDataGeneric(struct BagPocket *pocket, u32 pocketPos) { - return gSaveBlock2Ptr->encryptionKey ^ *quantity; + return (struct ItemSlot) { + .itemId = pocket->itemSlots[pocketPos].itemId, + .quantity = pocket->itemSlots[pocketPos].quantity ^ gSaveBlock2Ptr->encryptionKey, + }; } -static void SetBagItemQuantity(u16 *quantity, u16 newValue) +static inline struct ItemSlot NONNULL BagPocket_GetSlotDataPC(struct BagPocket *pocket, u32 pocketPos) { - *quantity = newValue ^ gSaveBlock2Ptr->encryptionKey; + return (struct ItemSlot) { + .itemId = pocket->itemSlots[pocketPos].itemId, + .quantity = pocket->itemSlots[pocketPos].quantity, + }; } -static u16 GetPCItemQuantity(u16 *quantity) +static inline void NONNULL BagPocket_SetSlotDataGeneric(struct BagPocket *pocket, u32 pocketPos, struct ItemSlot newSlot) { - return *quantity; + pocket->itemSlots[pocketPos].itemId = newSlot.itemId; + pocket->itemSlots[pocketPos].quantity = newSlot.quantity ^ gSaveBlock2Ptr->encryptionKey; } -static void SetPCItemQuantity(u16 *quantity, u16 newValue) +static inline void NONNULL BagPocket_SetSlotDataPC(struct BagPocket *pocket, u32 pocketPos, struct ItemSlot newSlot) { - *quantity = newValue; + pocket->itemSlots[pocketPos].itemId = newSlot.itemId; + pocket->itemSlots[pocketPos].quantity = newSlot.quantity; } -void ApplyNewEncryptionKeyToBagItems(u32 newKey) +struct ItemSlot NONNULL BagPocket_GetSlotData(struct BagPocket *pocket, u32 pocketPos) { - u32 pocket, item; - for (pocket = 0; pocket < POCKETS_COUNT; pocket++) + switch (pocket->id) + { + case POCKET_ITEMS: + case POCKET_KEY_ITEMS: + case POCKET_POKE_BALLS: + case POCKET_TM_HM: + case POCKET_BERRIES: + return BagPocket_GetSlotDataGeneric(pocket, pocketPos); + case POCKET_DUMMY: + return BagPocket_GetSlotDataPC(pocket, pocketPos); + } + + return (struct ItemSlot) {0}; // Because compiler complains +} + +void NONNULL BagPocket_SetSlotData(struct BagPocket *pocket, u32 pocketPos, struct ItemSlot newSlot) +{ + if (newSlot.itemId == ITEM_NONE || newSlot.quantity == 0) // Sets to zero if quantity or itemId is zero + { + newSlot.itemId = ITEM_NONE; + newSlot.quantity = 0; + } + + switch (pocket->id) { - for (item = 0; item < gBagPockets[pocket].capacity; item++) - ApplyNewEncryptionKeyToHword(&(gBagPockets[pocket].itemSlots[item].quantity), newKey); + case POCKET_ITEMS: + case POCKET_KEY_ITEMS: + case POCKET_POKE_BALLS: + case POCKET_TM_HM: + case POCKET_BERRIES: + BagPocket_SetSlotDataGeneric(pocket, pocketPos, newSlot); + break; + case POCKET_DUMMY: + BagPocket_SetSlotDataPC(pocket, pocketPos, newSlot); + break; } } -void ApplyNewEncryptionKeyToBagItems_(u32 newKey) // really GF? +void ApplyNewEncryptionKeyToBagItems(u32 newKey) { - ApplyNewEncryptionKeyToBagItems(newKey); + enum Pocket pocketId; + u32 item; + for (pocketId = 0; pocketId < POCKETS_COUNT; pocketId++) + { + for (item = 0; item < gBagPockets[pocketId].capacity; item++) + ApplyNewEncryptionKeyToHword(&(gBagPockets[pocketId].itemSlots[item].quantity), newKey); + } } void SetBagItemsPointers(void) { - gBagPockets[ITEMS_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_Items; - gBagPockets[ITEMS_POCKET].capacity = BAG_ITEMS_COUNT; + gBagPockets[POCKET_ITEMS].itemSlots = gSaveBlock1Ptr->bag.items; + gBagPockets[POCKET_ITEMS].capacity = BAG_ITEMS_COUNT; + gBagPockets[POCKET_ITEMS].id = POCKET_ITEMS; - gBagPockets[KEYITEMS_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_KeyItems; - gBagPockets[KEYITEMS_POCKET].capacity = BAG_KEYITEMS_COUNT; + gBagPockets[POCKET_KEY_ITEMS].itemSlots = gSaveBlock1Ptr->bag.keyItems; + gBagPockets[POCKET_KEY_ITEMS].capacity = BAG_KEYITEMS_COUNT; + gBagPockets[POCKET_KEY_ITEMS].id = POCKET_KEY_ITEMS; - gBagPockets[BALLS_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_PokeBalls; - gBagPockets[BALLS_POCKET].capacity = BAG_POKEBALLS_COUNT; + gBagPockets[POCKET_POKE_BALLS].itemSlots = gSaveBlock1Ptr->bag.pokeBalls; + gBagPockets[POCKET_POKE_BALLS].capacity = BAG_POKEBALLS_COUNT; + gBagPockets[POCKET_POKE_BALLS].id = POCKET_POKE_BALLS; - gBagPockets[TMHM_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_TMHM; - gBagPockets[TMHM_POCKET].capacity = BAG_TMHM_COUNT; + gBagPockets[POCKET_TM_HM].itemSlots = gSaveBlock1Ptr->bag.TMsHMs; + gBagPockets[POCKET_TM_HM].capacity = BAG_TMHM_COUNT; + gBagPockets[POCKET_TM_HM].id = POCKET_TM_HM; - gBagPockets[BERRIES_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_Berries; - gBagPockets[BERRIES_POCKET].capacity = BAG_BERRIES_COUNT; + gBagPockets[POCKET_BERRIES].itemSlots = gSaveBlock1Ptr->bag.berries; + gBagPockets[POCKET_BERRIES].capacity = BAG_BERRIES_COUNT; + gBagPockets[POCKET_BERRIES].id = POCKET_BERRIES; } u8 *CopyItemName(u16 itemId, u8 *dst) @@ -108,438 +186,320 @@ u8 *CopyItemNameHandlePlural(u16 itemId, u8 *dst, u32 quantity) } } -bool8 IsBagPocketNonEmpty(u8 pocket) +bool32 IsBagPocketNonEmpty(enum Pocket pocketId) { u8 i; - for (i = 0; i < gBagPockets[pocket - 1].capacity; i++) + for (i = 0; i < gBagPockets[pocketId].capacity; i++) { - if (gBagPockets[pocket - 1].itemSlots[i].itemId != 0) + if (GetBagItemId(pocketId, i) != ITEM_NONE) return TRUE; } return FALSE; } -bool8 CheckBagHasItem(u16 itemId, u16 count) +static bool32 NONNULL BagPocket_CheckHasItem(struct BagPocket *pocket, u16 itemId, u16 count) { - u8 i; - u8 pocket; + struct ItemSlot tempItem; - if (GetItemPocket(itemId) == 0) - return FALSE; - if (InBattlePyramid() || FlagGet(FLAG_STORING_ITEMS_IN_PYRAMID_BAG) == TRUE) - return CheckPyramidBagHasItem(itemId, count); - pocket = GetItemPocket(itemId) - 1; // Check for item slots that contain the item - for (i = 0; i < gBagPockets[pocket].capacity; i++) + for (u32 i = 0; i < pocket->capacity && count > 0; i++) { - if (gBagPockets[pocket].itemSlots[i].itemId == itemId) - { - u16 quantity; - // Does this item slot contain enough of the item? - quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity); - if (quantity >= count) - return TRUE; - count -= quantity; - // Does this item slot and all previous slots contain enough of the item? - if (count == 0) - return TRUE; - } + tempItem = BagPocket_GetSlotData(pocket, i); + if (tempItem.itemId == itemId) + count -= min(count, tempItem.quantity); } - return FALSE; + + return count == 0; } -bool8 HasAtLeastOneBerry(void) +bool32 CheckBagHasItem(u16 itemId, u16 count) { - u16 i; + if (GetItemPocket(itemId) >= POCKETS_COUNT) + return FALSE; + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE || FlagGet(FLAG_STORING_ITEMS_IN_PYRAMID_BAG) == TRUE) + return CheckPyramidBagHasItem(itemId, count); - for (i = FIRST_BERRY_INDEX; i <= LAST_BERRY_INDEX; i++) - { - if (CheckBagHasItem(i, 1) == TRUE) - { - gSpecialVar_Result = TRUE; - return TRUE; - } - } - gSpecialVar_Result = FALSE; - return FALSE; + return BagPocket_CheckHasItem(&gBagPockets[GetItemPocket(itemId)], itemId, count); } -bool8 HasAtLeastOnePokeBall(void) +bool32 HasAtLeastOneBerry(void) { - u16 ballId; + gSpecialVar_Result = FALSE; + + for (u32 i = FIRST_BERRY_INDEX; i <= LAST_BERRY_INDEX && gSpecialVar_Result == FALSE; i++) + gSpecialVar_Result = CheckBagHasItem(i, 1); + + return gSpecialVar_Result; +} - for (ballId = BALL_STRANGE; ballId < POKEBALL_COUNT; ballId++) +bool32 HasAtLeastOnePokeBall(void) +{ + for (enum PokeBall ballId = BALL_STRANGE; ballId < POKEBALL_COUNT; ballId++) { - if (CheckBagHasItem(ballId, 1) == TRUE) + if (CheckBagHasItem(gBallItemIds[ballId], 1) == TRUE) return TRUE; } return FALSE; } -bool8 CheckBagHasSpace(u16 itemId, u16 count) +bool32 CheckBagHasSpace(u16 itemId, u16 count) { - if (GetItemPocket(itemId) == POCKET_NONE) + if (GetItemPocket(itemId) >= POCKETS_COUNT) return FALSE; - if (InBattlePyramid() || FlagGet(FLAG_STORING_ITEMS_IN_PYRAMID_BAG) == TRUE) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE || FlagGet(FLAG_STORING_ITEMS_IN_PYRAMID_BAG) == TRUE) return CheckPyramidBagHasSpace(itemId, count); return GetFreeSpaceForItemInBag(itemId) >= count; } -u32 GetFreeSpaceForItemInBag(u16 itemId) +static u32 NONNULL BagPocket_GetFreeSpaceForItem(struct BagPocket *pocket, u16 itemId) { - u8 i; - u8 pocket = GetItemPocket(itemId) - 1; - u16 ownedCount; u32 spaceForItem = 0; - - if (GetItemPocket(itemId) == POCKET_NONE) - return 0; + struct ItemSlot tempItem; // Check space in any existing item slots that already contain this item - for (i = 0; i < gBagPockets[pocket].capacity; i++) + for (u32 i = 0; i < pocket->capacity; i++) { - if (gBagPockets[pocket].itemSlots[i].itemId == itemId) - { - ownedCount = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity); - spaceForItem += max(0, MAX_BAG_ITEM_CAPACITY - ownedCount); - } - else if (gBagPockets[pocket].itemSlots[i].itemId == ITEM_NONE) - { - spaceForItem += MAX_BAG_ITEM_CAPACITY; - } + tempItem = BagPocket_GetSlotData(pocket, i); + if (tempItem.itemId == ITEM_NONE || tempItem.itemId == itemId) + spaceForItem += (tempItem.itemId ? (MAX_BAG_ITEM_CAPACITY - tempItem.quantity) : MAX_BAG_ITEM_CAPACITY); } + return spaceForItem; } -bool8 AddBagItem(u16 itemId, u16 count) +u32 GetFreeSpaceForItemInBag(u16 itemId) { - u8 i; + if (GetItemPocket(itemId) >= POCKETS_COUNT) + return 0; - if (GetItemPocket(itemId) == POCKET_NONE) - return FALSE; + return BagPocket_GetFreeSpaceForItem(&gBagPockets[GetItemPocket(itemId)], itemId); +} - // check Battle Pyramid Bag - if (InBattlePyramid() || FlagGet(FLAG_STORING_ITEMS_IN_PYRAMID_BAG) == TRUE) +static inline bool32 NONNULL CheckSlotAndUpdateCount(struct BagPocket *pocket, u16 itemId, u32 pocketPos, u32 *nextPocketPos, u16 *count, u16 *tempPocketSlotQuantities) +{ + struct ItemSlot tempItem = BagPocket_GetSlotData(pocket, pocketPos); + if (tempItem.itemId == ITEM_NONE || tempItem.itemId == itemId) { - return AddPyramidBagItem(itemId, count); + // The quantity already at the slot - zero if an empty slot + if (tempItem.itemId == ITEM_NONE) + tempItem.quantity = 0; + + // Record slot quantity in tempPocketSlotQuantities, adjust count + tempPocketSlotQuantities[pocketPos] = min(MAX_BAG_ITEM_CAPACITY, *count + tempItem.quantity); + *count -= min(*count, MAX_BAG_ITEM_CAPACITY - tempItem.quantity); + + // Set the starting index for the next loop to set items (shifted by one) + if (!*nextPocketPos) + *nextPocketPos = pocketPos + 1; + + return TRUE; } - else - { - struct BagPocket *itemPocket; - struct ItemSlot *newItems; - u16 ownedCount; - u8 pocket = GetItemPocket(itemId) - 1; - itemPocket = &gBagPockets[pocket]; - newItems = AllocZeroed(itemPocket->capacity * sizeof(struct ItemSlot)); - memcpy(newItems, itemPocket->itemSlots, itemPocket->capacity * sizeof(struct ItemSlot)); + return FALSE; +} - for (i = 0; i < itemPocket->capacity; i++) - { - if (newItems[i].itemId == itemId) - { - ownedCount = GetBagItemQuantity(&newItems[i].quantity); - // check if won't exceed max slot capacity - if (ownedCount + count <= MAX_BAG_ITEM_CAPACITY) - { - // successfully added to already existing item's count - SetBagItemQuantity(&newItems[i].quantity, ownedCount + count); - memcpy(itemPocket->itemSlots, newItems, itemPocket->capacity * sizeof(struct ItemSlot)); - Free(newItems); - return TRUE; - } - else - { - // try creating another instance of the item if possible - if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET) - { - Free(newItems); - return FALSE; - } - else - { - count -= MAX_BAG_ITEM_CAPACITY - ownedCount; - SetBagItemQuantity(&newItems[i].quantity, MAX_BAG_ITEM_CAPACITY); - // don't create another instance of the item if it's at max slot capacity and count is equal to 0 - if (count == 0) - { - break; - } - } - } - } - } +static bool32 NONNULL BagPocket_AddItem(struct BagPocket *pocket, u16 itemId, u16 count) +{ + u32 itemLookupIndex, itemAddIndex = 0; - // we're done if quantity is equal to 0 - if (count > 0) - { - // either no existing item was found or we have to create another instance, because the capacity was exceeded - for (i = 0; i < itemPocket->capacity; i++) + // First, check that there is a free slot for this item + u16 *tempPocketSlotQuantities = AllocZeroed(sizeof(u16) * pocket->capacity); + + switch (pocket->id) + { + case POCKET_TM_HM: + case POCKET_BERRIES: + for (itemLookupIndex = 0; itemLookupIndex < pocket->capacity && count > 0; itemLookupIndex++) { - if (newItems[i].itemId == ITEM_NONE) + // Check if we found a slot to store the item but weren't able to reduce count to 0 + // This means that we have more than one stack's worth, which isn't allowed in these pockets + if (CheckSlotAndUpdateCount(pocket, itemId, itemLookupIndex, &itemAddIndex, &count, tempPocketSlotQuantities) && count > 0) { - newItems[i].itemId = itemId; - if (count > MAX_BAG_ITEM_CAPACITY) - { - // try creating a new slot with max capacity if duplicates are possible - if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET) - { - Free(newItems); - return FALSE; - } - count -= MAX_BAG_ITEM_CAPACITY; - SetBagItemQuantity(&newItems[i].quantity, MAX_BAG_ITEM_CAPACITY); - } - else - { - // created a new slot and added quantity - SetBagItemQuantity(&newItems[i].quantity, count); - count = 0; - break; - } + Free(tempPocketSlotQuantities); + return FALSE; } } + break; + default: + for (itemLookupIndex = 0; itemLookupIndex < pocket->capacity && count > 0; itemLookupIndex++) + CheckSlotAndUpdateCount(pocket, itemId, itemLookupIndex, &itemAddIndex, &count, tempPocketSlotQuantities); + } - if (count > 0) - { - Free(newItems); - return FALSE; - } + // If the count is still greater than zero, clearly we have not found enough slots for this... + // Otherwise, we have found slots - update the actual pockets with the updated quantities + if (count == 0) + { + for (--itemAddIndex; itemAddIndex < itemLookupIndex; itemAddIndex++) + { + if (tempPocketSlotQuantities[itemAddIndex] > 0) + BagPocket_SetSlotItemIdAndCount(pocket, itemAddIndex, itemId, tempPocketSlotQuantities[itemAddIndex]); } - memcpy(itemPocket->itemSlots, newItems, itemPocket->capacity * sizeof(struct ItemSlot)); - Free(newItems); - return TRUE; } + + Free(tempPocketSlotQuantities); + return count == 0; } -bool8 RemoveBagItem(u16 itemId, u16 count) +bool32 AddBagItem(u16 itemId, u16 count) { - u8 i; - u16 totalQuantity = 0; - - if (GetItemPocket(itemId) == POCKET_NONE || itemId == ITEM_NONE) + if (GetItemPocket(itemId) >= POCKETS_COUNT) return FALSE; // check Battle Pyramid Bag - if (InBattlePyramid() || FlagGet(FLAG_STORING_ITEMS_IN_PYRAMID_BAG) == TRUE) - { - return RemovePyramidBagItem(itemId, count); - } - else - { - u8 pocket; - u8 var; - u16 ownedCount; - struct BagPocket *itemPocket; + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE || FlagGet(FLAG_STORING_ITEMS_IN_PYRAMID_BAG) == TRUE) + return AddPyramidBagItem(itemId, count); - pocket = GetItemPocket(itemId) - 1; - itemPocket = &gBagPockets[pocket]; + return BagPocket_AddItem(&gBagPockets[GetItemPocket(itemId)], itemId, count); +} + +static bool32 NONNULL BagPocket_RemoveItem(struct BagPocket *pocket, u16 itemId, u16 count) +{ + u32 itemLookupIndex, itemRemoveIndex = 0, totalQuantity = 0; + struct ItemSlot tempItem; + u16 *tempPocketSlotQuantities = AllocZeroed(sizeof(u16) * pocket->capacity); - for (i = 0; i < itemPocket->capacity; i++) + for (itemLookupIndex = 0; itemLookupIndex < pocket->capacity && totalQuantity < count; itemLookupIndex++) + { + tempItem = BagPocket_GetSlotData(pocket, itemLookupIndex); + if (tempItem.itemId == itemId) { - if (itemPocket->itemSlots[i].itemId == itemId) - totalQuantity += GetBagItemQuantity(&itemPocket->itemSlots[i].quantity); - } + // Index for the next loop - where we should start removing items + if (!itemRemoveIndex) + itemRemoveIndex = itemLookupIndex + 1; - if (totalQuantity < count) - return FALSE; // We don't have enough of the item + // Gather quantities (+ 1 to tempPocketSlotQuantities so that even if setting to 0 we know which indices to target) + totalQuantity += tempItem.quantity; + tempPocketSlotQuantities[itemLookupIndex] = (tempItem.quantity <= count ? 0 : tempItem.quantity - count) + 1; + } + } + if (totalQuantity >= count) // We have enough of the item + { if (CurMapIsSecretBase() == TRUE) { VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | SECRET_BASE_USED_BAG); VarSet(VAR_SECRET_BASE_LAST_ITEM_USED, itemId); } - var = GetItemListPosition(pocket); - if (itemPocket->capacity > var - && itemPocket->itemSlots[var].itemId == itemId) + // Update the quantities correctly with the items removed + for (--itemRemoveIndex; itemRemoveIndex < itemLookupIndex; itemRemoveIndex++) { - ownedCount = GetBagItemQuantity(&itemPocket->itemSlots[var].quantity); - if (ownedCount >= count) - { - SetBagItemQuantity(&itemPocket->itemSlots[var].quantity, ownedCount - count); - count = 0; - } - else - { - count -= ownedCount; - SetBagItemQuantity(&itemPocket->itemSlots[var].quantity, 0); - } - - if (GetBagItemQuantity(&itemPocket->itemSlots[var].quantity) == 0) - itemPocket->itemSlots[var].itemId = ITEM_NONE; - - if (count == 0) - return TRUE; + if (tempPocketSlotQuantities[itemRemoveIndex] > 0) + BagPocket_SetSlotItemIdAndCount(pocket, itemRemoveIndex, itemId, tempPocketSlotQuantities[itemRemoveIndex] - 1); } + } - for (i = 0; i < itemPocket->capacity; i++) - { - if (itemPocket->itemSlots[i].itemId == itemId) - { - ownedCount = GetBagItemQuantity(&itemPocket->itemSlots[i].quantity); - if (ownedCount >= count) - { - SetBagItemQuantity(&itemPocket->itemSlots[i].quantity, ownedCount - count); - count = 0; - } - else - { - count -= ownedCount; - SetBagItemQuantity(&itemPocket->itemSlots[i].quantity, 0); - } - - if (GetBagItemQuantity(&itemPocket->itemSlots[i].quantity) == 0) - itemPocket->itemSlots[i].itemId = ITEM_NONE; + if (totalQuantity == count) + BagPocket_CompactItems(pocket); - if (count == 0) - return TRUE; - } - } - return TRUE; - } + Free(tempPocketSlotQuantities); + return totalQuantity >= count; } -u8 GetPocketByItemId(u16 itemId) +bool32 RemoveBagItem(u16 itemId, u16 count) { - return GetItemPocket(itemId); -} + if (GetItemPocket(itemId) >= POCKETS_COUNT || itemId == ITEM_NONE) + return FALSE; -void ClearItemSlots(struct ItemSlot *itemSlots, u8 itemCount) -{ - u16 i; + // check Battle Pyramid Bag + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE || FlagGet(FLAG_STORING_ITEMS_IN_PYRAMID_BAG) == TRUE) + return RemovePyramidBagItem(itemId, count); - for (i = 0; i < itemCount; i++) - { - itemSlots[i].itemId = ITEM_NONE; - SetBagItemQuantity(&itemSlots[i].quantity, 0); - } + return BagPocket_RemoveItem(&gBagPockets[GetItemPocket(itemId)], itemId, count); } -static s32 FindFreePCItemSlot(void) +// Unsafe function: Only use with functions that already check the slot and count are valid +void RemoveBagItemFromSlot(struct BagPocket *pocket, u16 slotId, u16 count) { - s8 i; - - for (i = 0; i < PC_ITEMS_COUNT; i++) - { - if (gSaveBlock1Ptr->pcItems[i].itemId == ITEM_NONE) - return i; - } - return -1; + struct ItemSlot itemSlot = BagPocket_GetSlotData(pocket, slotId); + BagPocket_SetSlotItemIdAndCount(pocket, slotId, itemSlot.itemId, itemSlot.quantity - count); } -u8 CountUsedPCItemSlots(void) +static u8 NONNULL BagPocket_CountUsedItemSlots(struct BagPocket *pocket) { u8 usedSlots = 0; - u8 i; - for (i = 0; i < PC_ITEMS_COUNT; i++) + for (u32 i = 0; i < pocket->capacity; i++) { - if (gSaveBlock1Ptr->pcItems[i].itemId != ITEM_NONE) + if (BagPocket_GetSlotData(pocket, i).itemId != ITEM_NONE) usedSlots++; } return usedSlots; } -bool8 CheckPCHasItem(u16 itemId, u16 count) +u8 CountUsedPCItemSlots(void) { - u8 i; + struct BagPocket dummyPocket = DUMMY_PC_BAG_POCKET; + return BagPocket_CountUsedItemSlots(&dummyPocket); +} + +static bool32 NONNULL BagPocket_CheckPocketForItemCount(struct BagPocket *pocket, u16 itemId, u16 count) +{ + struct ItemSlot tempItem; - for (i = 0; i < PC_ITEMS_COUNT; i++) + for (u32 i = 0; i < pocket->capacity; i++) { - if (gSaveBlock1Ptr->pcItems[i].itemId == itemId && GetPCItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity) >= count) + tempItem = BagPocket_GetSlotData(pocket, i); + if (tempItem.itemId == itemId && tempItem.quantity >= count) return TRUE; } return FALSE; } -bool8 AddPCItem(u16 itemId, u16 count) +bool32 CheckPCHasItem(u16 itemId, u16 count) { - u8 i; - s8 freeSlot; - u16 ownedCount; - struct ItemSlot *newItems; - - // Copy PC items - newItems = AllocZeroed(sizeof(gSaveBlock1Ptr->pcItems)); - memcpy(newItems, gSaveBlock1Ptr->pcItems, sizeof(gSaveBlock1Ptr->pcItems)); + struct BagPocket dummyPocket = DUMMY_PC_BAG_POCKET; + return BagPocket_CheckPocketForItemCount(&dummyPocket, itemId, count); +} - // Use any item slots that already contain this item - for (i = 0; i < PC_ITEMS_COUNT; i++) - { - if (newItems[i].itemId == itemId) - { - ownedCount = GetPCItemQuantity(&newItems[i].quantity); - if (ownedCount + count <= MAX_PC_ITEM_CAPACITY) - { - SetPCItemQuantity(&newItems[i].quantity, ownedCount + count); - memcpy(gSaveBlock1Ptr->pcItems, newItems, sizeof(gSaveBlock1Ptr->pcItems)); - Free(newItems); - return TRUE; - } - count += ownedCount - MAX_PC_ITEM_CAPACITY; - SetPCItemQuantity(&newItems[i].quantity, MAX_PC_ITEM_CAPACITY); - if (count == 0) - { - memcpy(gSaveBlock1Ptr->pcItems, newItems, sizeof(gSaveBlock1Ptr->pcItems)); - Free(newItems); - return TRUE; - } - } - } +bool32 AddPCItem(u16 itemId, u16 count) +{ + struct BagPocket dummyPocket = DUMMY_PC_BAG_POCKET; + return BagPocket_AddItem(&dummyPocket, itemId, count); +} - // Put any remaining items into a new item slot. - if (count > 0) +static void NONNULL BagPocket_CompactItems(struct BagPocket *pocket) +{ + struct ItemSlot tempItem; + u32 slotCursor = 0; + for (u32 i = 0; i < pocket->capacity; i++) { - freeSlot = FindFreePCItemSlot(); - if (freeSlot == -1) + tempItem = BagPocket_GetSlotData(pocket, i); + if (tempItem.itemId == ITEM_NONE) { - Free(newItems); - return FALSE; + if (!slotCursor) + slotCursor = i + 1; } - else + else if (slotCursor > 0) { - newItems[freeSlot].itemId = itemId; - SetPCItemQuantity(&newItems[freeSlot].quantity, count); + BagPocket_SetSlotData(pocket, slotCursor++ - 1, tempItem); + BagPocket_SetSlotItemIdAndCount(pocket, i, ITEM_NONE, 0); } } - - // Copy items back to the PC - memcpy(gSaveBlock1Ptr->pcItems, newItems, sizeof(gSaveBlock1Ptr->pcItems)); - Free(newItems); - return TRUE; } void RemovePCItem(u8 index, u16 count) { - gSaveBlock1Ptr->pcItems[index].quantity -= count; - if (gSaveBlock1Ptr->pcItems[index].quantity == 0) - { - gSaveBlock1Ptr->pcItems[index].itemId = ITEM_NONE; - CompactPCItems(); - } + struct BagPocket dummyPocket = DUMMY_PC_BAG_POCKET; + + // Get id, quantity at slot + struct ItemSlot tempItem = BagPocket_GetSlotData(&dummyPocket, index); + + // Remove quantity + BagPocket_SetSlotItemIdAndCount(&dummyPocket, index, tempItem.itemId, tempItem.quantity - count); + + // Compact if necessary + if (tempItem.quantity == 0) + BagPocket_CompactItems(&dummyPocket); } void CompactPCItems(void) { - u16 i; - u16 j; - - for (i = 0; i < PC_ITEMS_COUNT - 1; i++) - { - for (j = i + 1; j < PC_ITEMS_COUNT; j++) - { - if (gSaveBlock1Ptr->pcItems[i].itemId == 0) - { - struct ItemSlot temp = gSaveBlock1Ptr->pcItems[i]; - gSaveBlock1Ptr->pcItems[i] = gSaveBlock1Ptr->pcItems[j]; - gSaveBlock1Ptr->pcItems[j] = temp; - } - } - } + struct BagPocket dummyPocket = DUMMY_PC_BAG_POCKET; + BagPocket_CompactItems(&dummyPocket); } void SwapRegisteredBike(void) @@ -555,108 +515,68 @@ void SwapRegisteredBike(void) } } -u16 BagGetItemIdByPocketPosition(u8 pocketId, u16 pocketPos) +void CompactItemsInBagPocket(enum Pocket pocketId) { - return gBagPockets[pocketId - 1].itemSlots[pocketPos].itemId; + BagPocket_CompactItems(&gBagPockets[pocketId]); } -u16 BagGetQuantityByPocketPosition(u8 pocketId, u16 pocketPos) +static inline void NONNULL BagPocket_MoveItemSlot(struct BagPocket *pocket, u32 from, u32 to) { - return GetBagItemQuantity(&gBagPockets[pocketId - 1].itemSlots[pocketPos].quantity); -} + if (from != to) + { + s8 shift = (to > from) ? 1 : -1; + if (to > from) + to--; -static void SwapItemSlots(struct ItemSlot *a, struct ItemSlot *b) -{ - struct ItemSlot temp; - SWAP(*a, *b, temp); -} + // Record the values at "from" + struct ItemSlot fromSlot = BagPocket_GetSlotData(pocket, from); -void CompactItemsInBagPocket(struct BagPocket *bagPocket) -{ - u16 i, j; + // Shuffle items between "to" and "from" + for (u32 i = from; i != to; i += shift) + BagPocket_SetSlotData(pocket, i, BagPocket_GetSlotData(pocket, i + shift)); - for (i = 0; i < bagPocket->capacity - 1; i++) - { - for (j = i + 1; j < bagPocket->capacity; j++) - { - if (GetBagItemQuantity(&bagPocket->itemSlots[i].quantity) == 0) - SwapItemSlots(&bagPocket->itemSlots[i], &bagPocket->itemSlots[j]); - } + // Move the saved "from" to "to" + BagPocket_SetSlotData(pocket, to, fromSlot); } } -void SortBerriesOrTMHMs(struct BagPocket *bagPocket) +void MoveItemSlotInPocket(enum Pocket pocketId, u32 from, u32 to) { - u16 i, j; - - for (i = 0; i < bagPocket->capacity - 1; i++) - { - for (j = i + 1; j < bagPocket->capacity; j++) - { - if (GetBagItemQuantity(&bagPocket->itemSlots[i].quantity) != 0) - { - if (GetBagItemQuantity(&bagPocket->itemSlots[j].quantity) == 0) - continue; - if (bagPocket->itemSlots[i].itemId <= bagPocket->itemSlots[j].itemId) - continue; - } - SwapItemSlots(&bagPocket->itemSlots[i], &bagPocket->itemSlots[j]); - } - } + BagPocket_MoveItemSlot(&gBagPockets[pocketId], from, to); } -void MoveItemSlotInList(struct ItemSlot *itemSlots_, u32 from, u32 to_) +void MoveItemSlotInPC(struct ItemSlot *itemSlots, u32 from, u32 to) { - // dumb assignments needed to match - struct ItemSlot *itemSlots = itemSlots_; - u32 to = to_; - - if (from != to) - { - s16 i, count; - struct ItemSlot firstSlot = itemSlots[from]; - - if (to > from) - { - to--; - for (i = from, count = to; i < count; i++) - itemSlots[i] = itemSlots[i + 1]; - } - else - { - for (i = from, count = to; i > count; i--) - itemSlots[i] = itemSlots[i - 1]; - } - itemSlots[to] = firstSlot; - } + struct BagPocket dummyPocket = DUMMY_PC_BAG_POCKET; + return BagPocket_MoveItemSlot(&dummyPocket, from, to); } void ClearBag(void) { - u16 i; - - for (i = 0; i < POCKETS_COUNT; i++) - { - ClearItemSlots(gBagPockets[i].itemSlots, gBagPockets[i].capacity); - } + CpuFastFill(0, &gSaveBlock1Ptr->bag, sizeof(struct Bag)); } -u16 CountTotalItemQuantityInBag(u16 itemId) +static inline u16 NONNULL BagPocket_CountTotalItemQuantity(struct BagPocket *pocket, u16 itemId) { - u16 i; - u16 ownedCount = 0; - struct BagPocket *bagPocket = &gBagPockets[GetItemPocket(itemId) - 1]; + u32 ownedCount = 0; + struct ItemSlot tempItem; - for (i = 0; i < bagPocket->capacity; i++) + for (u32 i = 0; i < pocket->capacity; i++) { - if (bagPocket->itemSlots[i].itemId == itemId) - ownedCount += GetBagItemQuantity(&bagPocket->itemSlots[i].quantity); + tempItem = BagPocket_GetSlotData(pocket, i); + if (tempItem.itemId == itemId) + ownedCount += tempItem.quantity; } return ownedCount; } -static bool8 CheckPyramidBagHasItem(u16 itemId, u16 count) +u16 CountTotalItemQuantityInBag(u16 itemId) +{ + return BagPocket_CountTotalItemQuantity(&gBagPockets[GetItemPocket(itemId)], itemId); +} + +static bool32 CheckPyramidBagHasItem(u16 itemId, u16 count) { u8 i; u16 *items = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode]; @@ -682,7 +602,7 @@ static bool8 CheckPyramidBagHasItem(u16 itemId, u16 count) return FALSE; } -static bool8 CheckPyramidBagHasSpace(u16 itemId, u16 count) +static bool32 CheckPyramidBagHasSpace(u16 itemId, u16 count) { u8 i; u16 *items = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode]; @@ -708,7 +628,7 @@ static bool8 CheckPyramidBagHasSpace(u16 itemId, u16 count) return FALSE; } -bool8 AddPyramidBagItem(u16 itemId, u16 count) +bool32 AddPyramidBagItem(u16 itemId, u16 count) { u16 i; @@ -786,7 +706,7 @@ bool8 AddPyramidBagItem(u16 itemId, u16 count) } } -bool8 RemovePyramidBagItem(u16 itemId, u16 count) +bool32 RemovePyramidBagItem(u16 itemId, u16 count) { u16 i; @@ -867,7 +787,9 @@ static u16 SanitizeItemId(u16 itemId) const u8 *GetItemName(u16 itemId) { - return gItemsInfo[SanitizeItemId(itemId)].name; + const u8 *name = gItemsInfo[SanitizeItemId(itemId)].name; + + return name == NULL ? gQuestionMarksItemName : name; } u32 GetItemPrice(u16 itemId) @@ -877,7 +799,7 @@ u32 GetItemPrice(u16 itemId) static bool32 DoesItemHavePluralName(u16 itemId) { - return (gItemsInfo[SanitizeItemId(itemId)].pluralName[0] != '\0'); + return gItemsInfo[SanitizeItemId(itemId)].pluralName != NULL; } static const u8 *GetItemPluralName(u16 itemId) @@ -897,7 +819,7 @@ const u8 *GetItemEffect(u32 itemId) return gItemsInfo[SanitizeItemId(itemId)].effect; } -u32 GetItemHoldEffect(u32 itemId) +enum HoldEffect GetItemHoldEffect(u32 itemId) { return gItemsInfo[SanitizeItemId(itemId)].holdEffect; } @@ -922,7 +844,7 @@ u8 GetItemConsumability(u16 itemId) return !gItemsInfo[SanitizeItemId(itemId)].notConsumed; } -u8 GetItemPocket(u16 itemId) +enum Pocket GetItemPocket(u16 itemId) { return gItemsInfo[SanitizeItemId(itemId)].pocket; } @@ -1001,20 +923,28 @@ u32 GetItemStatus1Mask(u16 itemId) return 0; } -u32 GetItemStatus2Mask(u16 itemId) +bool32 ItemHasVolatileFlag(u16 itemId, enum Volatile _volatile) { const u8 *effect = GetItemEffect(itemId); - if (effect[3] & ITEM3_STATUS_ALL) - return STATUS2_INFATUATION | STATUS2_CONFUSION; - else if (effect[0] & ITEM0_INFATUATION) - return STATUS2_INFATUATION; - else if (effect[3] & ITEM3_CONFUSION) - return STATUS2_CONFUSION; - else - return 0; + switch (_volatile) + { + case VOLATILE_CONFUSION: + return (effect[3] & ITEM3_STATUS_ALL) || (effect[3] & ITEM3_CONFUSION); + case VOLATILE_INFATUATION: + return (effect[3] & ITEM3_STATUS_ALL) || (effect[0] & ITEM0_INFATUATION); + default: + return FALSE; + } } u32 GetItemSellPrice(u32 itemId) { return GetItemPrice(itemId) / ITEM_SELL_FACTOR; } + +bool32 IsHoldEffectChoice(enum HoldEffect holdEffect) +{ + return holdEffect == HOLD_EFFECT_CHOICE_BAND + || holdEffect == HOLD_EFFECT_CHOICE_SCARF + || holdEffect == HOLD_EFFECT_CHOICE_SPECS; +} diff --git a/src/item_icon.c b/src/item_icon.c index e5bd085d7f6f..8d4ff3223d19 100644 --- a/src/item_icon.c +++ b/src/item_icon.c @@ -99,7 +99,7 @@ u8 AddItemIconSprite(u16 tilesTag, u16 paletteTag, u16 itemId) struct SpritePalette spritePalette; struct SpriteTemplate *spriteTemplate; - LZDecompressWram(GetItemIconPic(itemId), gItemIconDecompressionBuffer); + DecompressDataWithHeaderWram(GetItemIconPic(itemId), gItemIconDecompressionBuffer); CopyItemIconPicTo4x4Buffer(gItemIconDecompressionBuffer, gItemIcon4x4Buffer); spriteSheet.data = gItemIcon4x4Buffer; spriteSheet.size = 0x200; @@ -136,7 +136,7 @@ u8 AddCustomItemIconSprite(const struct SpriteTemplate *customSpriteTemplate, u1 struct SpritePalette spritePalette; struct SpriteTemplate *spriteTemplate; - LZDecompressWram(GetItemIconPic(itemId), gItemIconDecompressionBuffer); + DecompressDataWithHeaderWram(GetItemIconPic(itemId), gItemIconDecompressionBuffer); CopyItemIconPicTo4x4Buffer(gItemIconDecompressionBuffer, gItemIcon4x4Buffer); spriteSheet.data = gItemIcon4x4Buffer; spriteSheet.size = 0x200; @@ -166,11 +166,11 @@ const void *GetItemIconPic(u16 itemId) return gItemIcon_ReturnToFieldArrow; // Use last icon, the "return to field" arrow if (itemId >= ITEMS_COUNT) return gItemsInfo[0].iconPic; - if (itemId >= ITEM_TM01 && itemId < ITEM_HM01 + NUM_HIDDEN_MACHINES) + if (gItemsInfo[itemId].pocket == POCKET_TM_HM) { - if (itemId < ITEM_TM01 + NUM_TECHNICAL_MACHINES) - return gItemIcon_TM; - return gItemIcon_HM; + if (GetItemTMHMIndex(itemId) > NUM_TECHNICAL_MACHINES) + return gItemIcon_HM; + return gItemIcon_TM; } return gItemsInfo[itemId].iconPic; @@ -182,8 +182,8 @@ const u16 *GetItemIconPalette(u16 itemId) return gItemIconPalette_ReturnToFieldArrow; if (itemId >= ITEMS_COUNT) return gItemsInfo[0].iconPalette; - if (itemId >= ITEM_TM01 && itemId < ITEM_HM01 + NUM_HIDDEN_MACHINES) - return gTypesInfo[GetMoveType(gItemsInfo[itemId].secondaryId)].paletteTMHM; + if (gItemsInfo[itemId].pocket == POCKET_TM_HM) + return gTypesInfo[GetMoveType(GetItemTMHMMoveId(itemId))].paletteTMHM; return gItemsInfo[itemId].iconPalette; } diff --git a/src/item_menu.c b/src/item_menu.c index 12ecb99804a0..1479c9b3fa84 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -24,7 +24,6 @@ #include "list_menu.h" #include "link.h" #include "mail.h" -#include "main.h" #include "malloc.h" #include "map_name_popup.h" #include "menu.h" @@ -89,6 +88,10 @@ enum { ACTION_SHOW, ACTION_GIVE_FAVOR_LADY, ACTION_CONFIRM_QUIZ_LADY, + ACTION_BY_NAME, + ACTION_BY_TYPE, + ACTION_BY_AMOUNT, + ACTION_BY_INDEX, ACTION_DUMMY, }; @@ -167,6 +170,7 @@ static void PrintThereIsNoPokemon(u8); static void Task_ChooseHowManyToToss(u8); static void AskTossItems(u8); static void Task_RemoveItemFromBag(u8); +static void Task_TossItemFromBag(u8 taskId); static void ItemMenu_Cancel(u8); static void HandleErrorMessage(u8); static void PrintItemCantBeHeld(u8); @@ -218,6 +222,19 @@ static const u8 sText_DepositedVar2Var1s[] = _("Deposited {STR_VAR_2}\n{STR_VAR_ static const u8 sText_NoRoomForItems[] = _("There's no room to\nstore items."); static const u8 sText_CantStoreImportantItems[] = _("Important items\ncan't be stored in\nthe PC!"); +static void Task_LoadBagSortOptions(u8 taskId); +static void ItemMenu_SortByName(u8 taskId); +static void ItemMenu_SortByType(u8 taskId); +static void ItemMenu_SortByAmount(u8 taskId); +static void ItemMenu_SortByIndex(u8 taskId); +static void SortBagItems(u8 taskId); +static void Task_SortFinish(u8 taskId); +static void MergeSort(struct BagPocket *pocket, s32 (*comparator)(enum Pocket, struct ItemSlot, struct ItemSlot)); +static s32 CompareItemsAlphabetically(enum Pocket pocketId, struct ItemSlot item1, struct ItemSlot item2); +static s32 CompareItemsByMost(enum Pocket pocketId, struct ItemSlot item1, struct ItemSlot item2); +static s32 CompareItemsByType(enum Pocket pocketId, struct ItemSlot item1, struct ItemSlot item2); +static s32 CompareItemsByIndex(enum Pocket pocketId, struct ItemSlot item1, struct ItemSlot item2); + static const struct BgTemplate sBgTemplates_ItemMenu[] = { { @@ -271,6 +288,7 @@ static const struct ListMenuTemplate sItemListMenu = .cursorKind = CURSOR_BLACK_ARROW }; +static const u8 sText_NothingToSort[] = _("There's nothing to sort!"); static const struct MenuAction sItemMenuActions[] = { [ACTION_USE] = {gMenuText_Use, {ItemMenu_UseOutOfBattle}}, [ACTION_TOSS] = {gMenuText_Toss, {ItemMenu_Toss}}, @@ -286,6 +304,10 @@ static const struct MenuAction sItemMenuActions[] = { [ACTION_SHOW] = {COMPOUND_STRING("SHOW"), {ItemMenu_Show}}, [ACTION_GIVE_FAVOR_LADY] = {gMenuText_Give2, {ItemMenu_GiveFavorLady}}, [ACTION_CONFIRM_QUIZ_LADY] = {gMenuText_Confirm, {ItemMenu_ConfirmQuizLady}}, + [ACTION_BY_NAME] = {COMPOUND_STRING("Name"), {ItemMenu_SortByName}}, + [ACTION_BY_TYPE] = {COMPOUND_STRING("Type"), {ItemMenu_SortByType}}, + [ACTION_BY_AMOUNT] = {COMPOUND_STRING("Amount"), {ItemMenu_SortByAmount}}, + [ACTION_BY_INDEX] = {COMPOUND_STRING("Index"), {ItemMenu_SortByIndex}}, [ACTION_DUMMY] = {gText_EmptyString2, {NULL}} }; @@ -561,7 +583,7 @@ static EWRAM_DATA struct TempWallyBag *sTempWallyBag = 0; void ResetBagScrollPositions(void) { - gBagPosition.pocket = ITEMS_POCKET; + gBagPosition.pocket = POCKET_ITEMS; memset(gBagPosition.cursorPosition, 0, sizeof(gBagPosition.cursorPosition)); memset(gBagPosition.scrollPosition, 0, sizeof(gBagPosition.scrollPosition)); } @@ -573,7 +595,7 @@ void CB2_BagMenuFromStartMenu(void) void CB2_BagMenuFromBattle(void) { - if (!InBattlePyramid()) + if (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE) GoToBagMenu(ITEMMENULOCATION_BATTLE, POCKETS_COUNT, CB2_SetUpReshowBattleScreenAfterMenu2); else GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_BATTLE, CB2_SetUpReshowBattleScreenAfterMenu2); @@ -582,19 +604,19 @@ void CB2_BagMenuFromBattle(void) // Choosing berry to plant void CB2_ChooseBerry(void) { - GoToBagMenu(ITEMMENULOCATION_BERRY_TREE, BERRIES_POCKET, CB2_ReturnToFieldContinueScript); + GoToBagMenu(ITEMMENULOCATION_BERRY_TREE, POCKET_BERRIES, CB2_ReturnToFieldContinueScript); } // Choosing mulch to use void CB2_ChooseMulch(void) { - GoToBagMenu(ITEMMENULOCATION_BERRY_TREE_MULCH, ITEMS_POCKET, CB2_ReturnToFieldContinueScript); + GoToBagMenu(ITEMMENULOCATION_BERRY_TREE_MULCH, POCKET_ITEMS, CB2_ReturnToFieldContinueScript); } // Choosing berry for Berry Blender or Berry Crush -void ChooseBerryForMachine(void (*exitCallback)(void)) +void ChooseBerryForMachine(MainCallback exitCallback) { - GoToBagMenu(ITEMMENULOCATION_BERRY_BLENDER_CRUSH, BERRIES_POCKET, exitCallback); + GoToBagMenu(ITEMMENULOCATION_BERRY_BLENDER_CRUSH, POCKET_BERRIES, exitCallback); } void CB2_GoToSellMenu(void) @@ -626,7 +648,7 @@ void QuizLadyOpenBagMenu(void) gSpecialVar_Result = FALSE; } -void GoToBagMenu(u8 location, u8 pocket, void ( *exitCallback)()) +void GoToBagMenu(u8 location, u8 pocket, MainCallback exitCallback) { gBagMenu = AllocZeroed(sizeof(*gBagMenu)); if (gBagMenu == NULL) @@ -827,7 +849,7 @@ static bool8 LoadBagMenu_Graphics(void) case 1: if (FreeTempTileDataBuffersIfPossible() != TRUE) { - LZDecompressWram(gBagScreen_GfxTileMap, gBagMenu->tilemapBuffer); + DecompressDataWithHeaderWram(gBagScreen_GfxTileMap, gBagMenu->tilemapBuffer); gBagMenu->graphicsLoadState++; } break; @@ -876,14 +898,13 @@ static void AllocateBagItemListBuffers(void) static void LoadBagItemListBuffers(u8 pocketId) { u16 i; - struct BagPocket *pocket = &gBagPockets[pocketId]; struct ListMenuItem *subBuffer; if (!gBagMenu->hideCloseBagText) { for (i = 0; i < gBagMenu->numItemStacks[pocketId] - 1; i++) { - GetItemNameFromPocket(sListBuffer2->name[i], pocket->itemSlots[i].itemId); + GetItemNameFromPocket(sListBuffer2->name[i], GetBagItemId(pocketId, i)); subBuffer = sListBuffer1->subBuffers; subBuffer[i].name = sListBuffer2->name[i]; subBuffer[i].id = i; @@ -897,7 +918,7 @@ static void LoadBagItemListBuffers(u8 pocketId) { for (i = 0; i < gBagMenu->numItemStacks[pocketId]; i++) { - GetItemNameFromPocket(sListBuffer2->name[i], pocket->itemSlots[i].itemId); + GetItemNameFromPocket(sListBuffer2->name[i], GetBagItemId(pocketId, i)); subBuffer = sListBuffer1->subBuffers; subBuffer[i].name = sListBuffer2->name[i]; subBuffer[i].id = i; @@ -914,23 +935,23 @@ static void GetItemNameFromPocket(u8 *dest, u16 itemId) u8 *end; switch (gBagPosition.pocket) { - case TMHM_POCKET: + case POCKET_TM_HM: end = StringCopy(gStringVar2, GetMoveName(ItemIdToBattleMoveId(itemId))); - PrependFontIdToFit(gStringVar2, end, FONT_NARROW, 61); - if (itemId >= ITEM_HM01) + PrependFontIdToFit(gStringVar2, end, FONT_NARROW, NUM_TECHNICAL_MACHINES >= 100 ? 60 : 65); + if (GetItemTMHMIndex(itemId) > NUM_TECHNICAL_MACHINES) { // Get HM number - ConvertIntToDecimalStringN(gStringVar1, itemId - ITEM_HM01 + 1, STR_CONV_MODE_LEADING_ZEROS, 1); + ConvertIntToDecimalStringN(gStringVar1, GetItemTMHMIndex(itemId) - NUM_TECHNICAL_MACHINES, STR_CONV_MODE_LEADING_ZEROS, 1); StringExpandPlaceholders(dest, gText_NumberItem_HM); } else { // Get TM number - ConvertIntToDecimalStringN(gStringVar1, itemId - ITEM_TM01 + 1, STR_CONV_MODE_LEADING_ZEROS, 2); + ConvertIntToDecimalStringN(gStringVar1, GetItemTMHMIndex(itemId), STR_CONV_MODE_LEADING_ZEROS, NUM_TECHNICAL_MACHINES >= 100 ? 3 : 2); StringExpandPlaceholders(dest, gText_NumberItem_TMBerry); } break; - case BERRIES_POCKET: + case POCKET_BERRIES: ConvertIntToDecimalStringN(gStringVar1, itemId - FIRST_BERRY_INDEX + 1, STR_CONV_MODE_LEADING_ZEROS, 2); end = CopyItemName(itemId, gStringVar2); PrependFontIdToFit(gStringVar2, end, FONT_NARROW, 61); @@ -954,7 +975,7 @@ static void BagMenu_MoveCursorCallback(s32 itemIndex, bool8 onInit, struct ListM { RemoveBagItemIconSprite(gBagMenu->itemIconSlot ^ 1); if (itemIndex != LIST_CANCEL) - AddBagItemIconSprite(BagGetItemIdByPocketPosition(gBagPosition.pocket + 1, itemIndex), gBagMenu->itemIconSlot); + AddBagItemIconSprite(GetBagItemId(gBagPosition.pocket, itemIndex), gBagMenu->itemIconSlot); else AddBagItemIconSprite(ITEM_LIST_END, gBagMenu->itemIconSlot); gBagMenu->itemIconSlot ^= 1; @@ -965,12 +986,10 @@ static void BagMenu_MoveCursorCallback(s32 itemIndex, bool8 onInit, struct ListM static void BagMenu_ItemPrintCallback(u8 windowId, u32 itemIndex, u8 y) { - u16 itemId; - u16 itemQuantity; - int offset; - if (itemIndex != LIST_CANCEL) { + s32 offset; + if (gBagMenu->toSwapPos != NOT_SWAPPING) { // Swapping items, draw cursor at original item's location @@ -980,17 +999,16 @@ static void BagMenu_ItemPrintCallback(u8 windowId, u32 itemIndex, u8 y) BagMenu_PrintCursorAtPos(y, COLORID_NONE); } - itemId = BagGetItemIdByPocketPosition(gBagPosition.pocket + 1, itemIndex); - itemQuantity = BagGetQuantityByPocketPosition(gBagPosition.pocket + 1, itemIndex); + struct ItemSlot itemSlot = GetBagItemIdAndQuantity(gBagPosition.pocket, itemIndex); // Draw HM icon - if (itemId >= ITEM_HM01 && itemId <= ITEM_HM08) + if (gBagPosition.pocket == POCKET_TM_HM && GetItemTMHMIndex(itemSlot.itemId) > NUM_TECHNICAL_MACHINES) BlitBitmapToWindow(windowId, gBagMenuHMIcon_Gfx, 8, y - 1, 16, 16); - if (gBagPosition.pocket != KEYITEMS_POCKET && GetItemImportance(itemId) == FALSE) + if (gBagPosition.pocket != POCKET_KEY_ITEMS && GetItemImportance(itemSlot.itemId) == FALSE) { // Print item quantity - ConvertIntToDecimalStringN(gStringVar1, itemQuantity, STR_CONV_MODE_RIGHT_ALIGN, MAX_ITEM_DIGITS); + ConvertIntToDecimalStringN(gStringVar1, itemSlot.quantity, STR_CONV_MODE_RIGHT_ALIGN, MAX_ITEM_DIGITS); StringExpandPlaceholders(gStringVar4, gText_xVar1); offset = GetStringRightAlignXOffset(FONT_NARROW, gStringVar4, 119); BagMenu_Print(windowId, FONT_NARROW, gStringVar4, offset, y, 0, 0, TEXT_SKIP_DRAW, COLORID_NORMAL); @@ -998,7 +1016,7 @@ static void BagMenu_ItemPrintCallback(u8 windowId, u32 itemIndex, u8 y) else { // Print registered icon - if (gSaveBlock1Ptr->registeredItem != ITEM_NONE && gSaveBlock1Ptr->registeredItem == itemId) + if (gSaveBlock1Ptr->registeredItem != ITEM_NONE && gSaveBlock1Ptr->registeredItem == itemSlot.itemId) BlitBitmapToWindow(windowId, sRegisteredSelect_Gfx, 96, y - 1, 24, 16); } } @@ -1009,7 +1027,7 @@ static void PrintItemDescription(int itemIndex) const u8 *str; if (itemIndex != LIST_CANCEL) { - str = GetItemDescription(BagGetItemIdByPocketPosition(gBagPosition.pocket + 1, itemIndex)); + str = GetItemDescription(GetBagItemId(gBagPosition.pocket, itemIndex)); } else { @@ -1128,24 +1146,26 @@ static void Task_CloseBagMenu(u8 taskId) } } -void UpdatePocketItemList(u8 pocketId) +void UpdatePocketItemList(enum Pocket pocketId) { - u16 i; + if (pocketId >= POCKETS_COUNT) + return; // shouldn't even get here + struct BagPocket *pocket = &gBagPockets[pocketId]; switch (pocketId) { - case TMHM_POCKET: - case BERRIES_POCKET: - SortBerriesOrTMHMs(pocket); + case POCKET_TM_HM: + case POCKET_BERRIES: + SortItemsInBag(pocket, SORT_BY_INDEX); break; default: - CompactItemsInBagPocket(pocket); + CompactItemsInBagPocket(pocketId); break; } gBagMenu->numItemStacks[pocketId] = 0; - for (i = 0; i < pocket->capacity && pocket->itemSlots[i].itemId; i++) + for (u32 i = 0; i < pocket->capacity && BagPocket_GetSlotData(pocket, i).itemId; i++) gBagMenu->numItemStacks[pocketId]++; if (!gBagMenu->hideCloseBagText) @@ -1188,7 +1208,7 @@ u8 GetItemListPosition(u8 pocketId) return gBagPosition.scrollPosition[pocketId] + gBagPosition.cursorPosition[pocketId]; } -void DisplayItemMessage(u8 taskId, u8 fontId, const u8 *str, void (*callback)(u8 taskId)) +void DisplayItemMessage(u8 taskId, u8 fontId, const u8 *str, TaskFunc callback) { s16 *data = gTasks[taskId].data; @@ -1265,6 +1285,34 @@ static void Task_BagMenu_HandleInput(u8 taskId) } return; } + else if (JOY_NEW(START_BUTTON)) + { + if ((gBagMenu->numItemStacks[gBagPosition.pocket] - 1) <= 1) //can't sort with 0 or 1 item in bag + { + static const u8 sText_NothingToSort[] = _("There's nothing to sort!"); + PlaySE(SE_FAILURE); + DisplayItemMessage(taskId, 1, sText_NothingToSort, HandleErrorMessage); + break; + } + else + { + struct ItemSlot tempItem; + data[1] = GetItemListPosition(gBagPosition.pocket); + tempItem = GetBagItemIdAndQuantity(gBagPosition.pocket, data[1]); + data[2] = tempItem.quantity; + if (gBagPosition.cursorPosition[gBagPosition.pocket] == gBagMenu->numItemStacks[gBagPosition.pocket]) + break; + else + gSpecialVar_ItemId = tempItem.itemId; + + PlaySE(SE_SELECT); + BagDestroyPocketScrollArrowPair(); + BagMenu_PrintCursor(tListTaskId, COLORID_GRAY_CURSOR); + ListMenuGetScrollAndRow(data[0], scrollPos, cursorPos); + gTasks[taskId].func = Task_LoadBagSortOptions; + return; + } + } break; } @@ -1285,13 +1333,16 @@ static void Task_BagMenu_HandleInput(u8 taskId) gTasks[taskId].func = Task_FadeAndCloseBagMenu; break; default: // A_BUTTON - PlaySE(SE_SELECT); - BagDestroyPocketScrollArrowPair(); - BagMenu_PrintCursor(tListTaskId, COLORID_GRAY_CURSOR); - tListPosition = listPosition; - tQuantity = BagGetQuantityByPocketPosition(gBagPosition.pocket + 1, listPosition); - gSpecialVar_ItemId = BagGetItemIdByPocketPosition(gBagPosition.pocket + 1, listPosition); - sContextMenuFuncs[gBagPosition.location](taskId); + { + struct ItemSlot itemSlot = GetBagItemIdAndQuantity(gBagPosition.pocket, listPosition); + PlaySE(SE_SELECT); + BagDestroyPocketScrollArrowPair(); + BagMenu_PrintCursor(tListTaskId, COLORID_GRAY_CURSOR); + tListPosition = listPosition; + gSpecialVar_ItemId = itemSlot.itemId; + tQuantity = itemSlot.quantity; + sContextMenuFuncs[gBagPosition.location](taskId); + } break; } } @@ -1447,8 +1498,8 @@ static bool8 CanSwapItems(void) || gBagPosition.location == ITEMMENULOCATION_BATTLE) { // TMHMs and berries are numbered, and so may not be swapped - if (gBagPosition.pocket != TMHM_POCKET - && gBagPosition.pocket != BERRIES_POCKET) + if (gBagPosition.pocket != POCKET_TM_HM + && gBagPosition.pocket != POCKET_BERRIES) return TRUE; } return FALSE; @@ -1461,7 +1512,7 @@ static void StartItemSwap(u8 taskId) ListMenuSetTemplateField(tListTaskId, LISTFIELD_CURSORKIND, CURSOR_INVISIBLE); tListPosition = gBagPosition.scrollPosition[gBagPosition.pocket] + gBagPosition.cursorPosition[gBagPosition.pocket]; gBagMenu->toSwapPos = tListPosition; - CopyItemName(BagGetItemIdByPocketPosition(gBagPosition.pocket + 1, tListPosition), gStringVar1); + CopyItemName(GetBagItemId(gBagPosition.pocket, tListPosition), gStringVar1); StringExpandPlaceholders(gStringVar4, gText_MoveVar1Where); FillWindowPixelBuffer(WIN_DESCRIPTION, PIXEL_FILL(0)); BagMenu_Print(WIN_DESCRIPTION, FONT_NORMAL, gStringVar4, 3, 1, 0, 0, 0, COLORID_NORMAL); @@ -1523,7 +1574,7 @@ static void DoItemSwap(u8 taskId) } else { - MoveItemSlotInList(gBagPockets[gBagPosition.pocket].itemSlots, tListPosition, realPos); + MoveItemSlotInPocket(gBagPosition.pocket, tListPosition, realPos); gBagMenu->toSwapPos = NOT_SWAPPING; DestroyListMenuTask(tListTaskId, scrollPos, cursorPos); if (tListPosition < realPos) @@ -1618,7 +1669,7 @@ static void OpenContextMenu(u8 taskId) default: if (MenuHelpers_IsLinkActive() == TRUE || InUnionRoom() == TRUE) { - if (gBagPosition.pocket == KEYITEMS_POCKET || !IsHoldingItemAllowed(gSpecialVar_ItemId)) + if (gBagPosition.pocket == POCKET_KEY_ITEMS || !IsHoldingItemAllowed(gSpecialVar_ItemId)) { gBagMenu->contextMenuItemsPtr = sContextMenuItems_Cancel; gBagMenu->contextMenuNumItems = ARRAY_COUNT(sContextMenuItems_Cancel); @@ -1633,14 +1684,14 @@ static void OpenContextMenu(u8 taskId) { switch (gBagPosition.pocket) { - case ITEMS_POCKET: + case POCKET_ITEMS: gBagMenu->contextMenuItemsPtr = gBagMenu->contextMenuItemsBuffer; gBagMenu->contextMenuNumItems = ARRAY_COUNT(sContextMenuItems_ItemsPocket); memcpy(&gBagMenu->contextMenuItemsBuffer, &sContextMenuItems_ItemsPocket, sizeof(sContextMenuItems_ItemsPocket)); if (ItemIsMail(gSpecialVar_ItemId) == TRUE) gBagMenu->contextMenuItemsBuffer[0] = ACTION_CHECK; break; - case KEYITEMS_POCKET: + case POCKET_KEY_ITEMS: gBagMenu->contextMenuItemsPtr = gBagMenu->contextMenuItemsBuffer; gBagMenu->contextMenuNumItems = ARRAY_COUNT(sContextMenuItems_KeyItemsPocket); memcpy(&gBagMenu->contextMenuItemsBuffer, &sContextMenuItems_KeyItemsPocket, sizeof(sContextMenuItems_KeyItemsPocket)); @@ -1652,22 +1703,22 @@ static void OpenContextMenu(u8 taskId) gBagMenu->contextMenuItemsBuffer[0] = ACTION_WALK; } break; - case BALLS_POCKET: + case POCKET_POKE_BALLS: gBagMenu->contextMenuItemsPtr = sContextMenuItems_BallsPocket; gBagMenu->contextMenuNumItems = ARRAY_COUNT(sContextMenuItems_BallsPocket); break; - case TMHM_POCKET: + case POCKET_TM_HM: gBagMenu->contextMenuItemsPtr = sContextMenuItems_TmHmPocket; gBagMenu->contextMenuNumItems = ARRAY_COUNT(sContextMenuItems_TmHmPocket); break; - case BERRIES_POCKET: + case POCKET_BERRIES: gBagMenu->contextMenuItemsPtr = sContextMenuItems_BerriesPocket; gBagMenu->contextMenuNumItems = ARRAY_COUNT(sContextMenuItems_BerriesPocket); break; } } } - if (gBagPosition.pocket == TMHM_POCKET) + if (gBagPosition.pocket == POCKET_TM_HM) { ClearWindowTilemap(WIN_DESCRIPTION); PrintTMHMMoveData(gSpecialVar_ItemId); @@ -1824,7 +1875,7 @@ static void ItemMenu_UseOutOfBattle(u8 taskId) { FillWindowPixelBuffer(WIN_DESCRIPTION, PIXEL_FILL(0)); ScheduleBgCopyTilemapToVram(0); - if (gBagPosition.pocket != BERRIES_POCKET) + if (gBagPosition.pocket != POCKET_BERRIES) GetItemFieldFunc(gSpecialVar_ItemId)(taskId); else ItemUseOutOfBattle_Berry(taskId); @@ -1908,11 +1959,34 @@ static void ConfirmToss(u8 taskId) StringExpandPlaceholders(gStringVar4, gText_ThrewAwayVar2Var1s); FillWindowPixelBuffer(WIN_DESCRIPTION, PIXEL_FILL(0)); BagMenu_Print(WIN_DESCRIPTION, FONT_NORMAL, gStringVar4, 3, 1, 0, 0, 0, COLORID_NORMAL); - gTasks[taskId].func = Task_RemoveItemFromBag; + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE || FlagGet(FLAG_STORING_ITEMS_IN_PYRAMID_BAG) == TRUE) + gTasks[taskId].func = Task_RemoveItemFromBag; + else + gTasks[taskId].func = Task_TossItemFromBag; +} + +static void Task_TossItemFromBag(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + u16 *scrollPos = &gBagPosition.scrollPosition[gBagPosition.pocket]; + u16 *cursorPos = &gBagPosition.cursorPosition[gBagPosition.pocket]; + + if (JOY_NEW(A_BUTTON | B_BUTTON)) + { + PlaySE(SE_SELECT); + RemoveBagItemFromSlot(&gBagPockets[gBagPosition.pocket], *scrollPos + *cursorPos, tItemCount); + DestroyListMenuTask(tListTaskId, scrollPos, cursorPos); + UpdatePocketItemList(gBagPosition.pocket); + UpdatePocketListPosition(gBagPosition.pocket); + LoadBagItemListBuffers(gBagPosition.pocket); + tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, *scrollPos, *cursorPos); + ScheduleBgCopyTilemapToVram(0); + ReturnToItemList(taskId); + } } // Remove selected item(s) from the bag and update list -// For when items are tossed or deposited +// For when items are deposited static void Task_RemoveItemFromBag(u8 taskId) { s16 *data = gTasks[taskId].data; @@ -2047,7 +2121,7 @@ static void Task_ItemContext_GiveToParty(u8 taskId) StringExpandPlaceholders(gStringVar4, sText_Var1CantBeHeldHere); DisplayItemMessage(taskId, FONT_NORMAL, gStringVar4, HandleErrorMessage); } - else if (gBagPosition.pocket != KEYITEMS_POCKET && !GetItemImportance(gSpecialVar_ItemId)) + else if (gBagPosition.pocket != POCKET_KEY_ITEMS && !GetItemImportance(gSpecialVar_ItemId)) { Task_FadeAndCloseBagMenu(taskId); } @@ -2062,7 +2136,7 @@ static void Task_ItemContext_GiveToPC(u8 taskId) { if (ItemIsMail(gSpecialVar_ItemId) == TRUE) DisplayItemMessage(taskId, FONT_NORMAL, gText_CantWriteMail, HandleErrorMessage); - else if (gBagPosition.pocket != KEYITEMS_POCKET && !GetItemImportance(gSpecialVar_ItemId)) + else if (gBagPosition.pocket != POCKET_KEY_ITEMS && !GetItemImportance(gSpecialVar_ItemId)) gTasks[taskId].func = Task_FadeAndCloseBagMenu; else PrintItemCantBeHeld(taskId); @@ -2074,7 +2148,7 @@ bool8 UseRegisteredKeyItemOnField(void) { u8 taskId; - if (InUnionRoom() == TRUE || InBattlePyramid() || InBattlePike() || InMultiPartnerRoom() == TRUE) + if (InUnionRoom() == TRUE || CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE || InBattlePike() || InMultiPartnerRoom() == TRUE) return FALSE; HideMapNamePopUpWindow(); ChangeBgY_ScreenOff(0, 0, BG_COORD_SET); @@ -2331,16 +2405,16 @@ static void PrepareBagForWallyTutorial(void) u32 i; sTempWallyBag = AllocZeroed(sizeof(*sTempWallyBag)); - memcpy(sTempWallyBag->bagPocket_Items, gSaveBlock1Ptr->bagPocket_Items, sizeof(gSaveBlock1Ptr->bagPocket_Items)); - memcpy(sTempWallyBag->bagPocket_PokeBalls, gSaveBlock1Ptr->bagPocket_PokeBalls, sizeof(gSaveBlock1Ptr->bagPocket_PokeBalls)); + memcpy(sTempWallyBag->bagPocket_Items, gSaveBlock1Ptr->bag.items, sizeof(gSaveBlock1Ptr->bag.items)); + memcpy(sTempWallyBag->bagPocket_PokeBalls, gSaveBlock1Ptr->bag.pokeBalls, sizeof(gSaveBlock1Ptr->bag.pokeBalls)); sTempWallyBag->pocket = gBagPosition.pocket; for (i = 0; i < POCKETS_COUNT; i++) { sTempWallyBag->cursorPosition[i] = gBagPosition.cursorPosition[i]; sTempWallyBag->scrollPosition[i] = gBagPosition.scrollPosition[i]; } - ClearItemSlots(gSaveBlock1Ptr->bagPocket_Items, BAG_ITEMS_COUNT); - ClearItemSlots(gSaveBlock1Ptr->bagPocket_PokeBalls, BAG_POKEBALLS_COUNT); + memset(gSaveBlock1Ptr->bag.items, 0, sizeof(gSaveBlock1Ptr->bag.items)); + memset(gSaveBlock1Ptr->bag.pokeBalls, 0, sizeof(gSaveBlock1Ptr->bag.pokeBalls)); ResetBagScrollPositions(); } @@ -2348,8 +2422,8 @@ static void RestoreBagAfterWallyTutorial(void) { u32 i; - memcpy(gSaveBlock1Ptr->bagPocket_Items, sTempWallyBag->bagPocket_Items, sizeof(sTempWallyBag->bagPocket_Items)); - memcpy(gSaveBlock1Ptr->bagPocket_PokeBalls, sTempWallyBag->bagPocket_PokeBalls, sizeof(sTempWallyBag->bagPocket_PokeBalls)); + memcpy(gSaveBlock1Ptr->bag.items, sTempWallyBag->bagPocket_Items, sizeof(sTempWallyBag->bagPocket_Items)); + memcpy(gSaveBlock1Ptr->bag.pokeBalls, sTempWallyBag->bagPocket_PokeBalls, sizeof(sTempWallyBag->bagPocket_PokeBalls)); gBagPosition.pocket = sTempWallyBag->pocket; for (i = 0; i < POCKETS_COUNT; i++) { @@ -2364,7 +2438,7 @@ void DoWallyTutorialBagMenu(void) PrepareBagForWallyTutorial(); AddBagItem(ITEM_POTION, 1); AddBagItem(ITEM_POKE_BALL, 1); - GoToBagMenu(ITEMMENULOCATION_WALLY, ITEMS_POCKET, CB2_SetUpReshowBattleScreenAfterMenu2); + GoToBagMenu(ITEMMENULOCATION_WALLY, POCKET_ITEMS, CB2_SetUpReshowBattleScreenAfterMenu2); } #define tTimer data[8] @@ -2642,3 +2716,307 @@ static void PrintTMHMMoveData(u16 itemId) CopyWindowToVram(WIN_TMHM_INFO, COPYWIN_GFX); } } + +static const u8 sText_SortItemsHow[] = _("Sort items how?"); +static const u8 sText_ItemsSorted[] = _("Items sorted by {STR_VAR_1}!"); +static const u8 *const sSortTypeStrings[] = +{ + [SORT_ALPHABETICALLY] = COMPOUND_STRING("name"), + [SORT_BY_TYPE] = COMPOUND_STRING("type"), + [SORT_BY_AMOUNT] = COMPOUND_STRING("amount"), + [SORT_BY_INDEX] = COMPOUND_STRING("index") +}; + +static const u8 sBagMenuSortItems[] = +{ + ACTION_BY_NAME, + ACTION_BY_TYPE, + ACTION_BY_AMOUNT, + ACTION_CANCEL, +}; + +static const u8 sBagMenuSortKeyItems[] = +{ + ACTION_BY_NAME, + ACTION_CANCEL, +}; + +static const u8 sBagMenuSortPokeBalls[] = +{ + ACTION_BY_NAME, + ACTION_BY_AMOUNT, + ACTION_DUMMY, + ACTION_CANCEL, +}; + +static const u8 sBagMenuSortBerriesTMsHMs[] = +{ + ACTION_BY_NAME, + ACTION_BY_AMOUNT, + ACTION_BY_INDEX, + ACTION_CANCEL, +}; + +static void AddBagSortSubMenu(void) +{ + switch (gBagPosition.pocket) + { + case POCKET_KEY_ITEMS: + gBagMenu->contextMenuItemsPtr = sBagMenuSortKeyItems; + memcpy(&gBagMenu->contextMenuItemsBuffer, &sBagMenuSortKeyItems, NELEMS(sBagMenuSortKeyItems)); + gBagMenu->contextMenuNumItems = NELEMS(sBagMenuSortKeyItems); + break; + case POCKET_POKE_BALLS: + gBagMenu->contextMenuItemsPtr = sBagMenuSortPokeBalls; + memcpy(&gBagMenu->contextMenuItemsBuffer, &sBagMenuSortPokeBalls, NELEMS(sBagMenuSortPokeBalls)); + gBagMenu->contextMenuNumItems = NELEMS(sBagMenuSortPokeBalls); + break; + case POCKET_BERRIES: + case POCKET_TM_HM: + gBagMenu->contextMenuItemsPtr = sBagMenuSortBerriesTMsHMs; + memcpy(&gBagMenu->contextMenuItemsBuffer, &sBagMenuSortBerriesTMsHMs, NELEMS(sBagMenuSortBerriesTMsHMs)); + gBagMenu->contextMenuNumItems = NELEMS(sBagMenuSortBerriesTMsHMs); + break; + default: + gBagMenu->contextMenuItemsPtr = sBagMenuSortItems; + memcpy(&gBagMenu->contextMenuItemsBuffer, &sBagMenuSortItems, NELEMS(sBagMenuSortItems)); + gBagMenu->contextMenuNumItems = NELEMS(sBagMenuSortItems); + break; + } + + StringExpandPlaceholders(gStringVar4, sText_SortItemsHow); + FillWindowPixelBuffer(1, PIXEL_FILL(0)); + BagMenu_Print(1, 1, gStringVar4, 3, 1, 0, 0, 0, 0); + + if (gBagMenu->contextMenuNumItems == 2) + PrintContextMenuItems(BagMenu_AddWindow(ITEMWIN_1x2)); + else if (gBagMenu->contextMenuNumItems == 4) + PrintContextMenuItemGrid(BagMenu_AddWindow(ITEMWIN_2x2), 2, 2); + else + PrintContextMenuItemGrid(BagMenu_AddWindow(ITEMWIN_2x3), 2, 3); +} + +static void Task_LoadBagSortOptions(u8 taskId) +{ + AddBagSortSubMenu(); + if (gBagMenu->contextMenuNumItems <= 2) + gTasks[taskId].func = Task_ItemContext_SingleRow; + else + gTasks[taskId].func = Task_ItemContext_MultipleRows; +} + +#define tSortType data[2] +static void ItemMenu_SortByName(u8 taskId) +{ + gTasks[taskId].tSortType = SORT_ALPHABETICALLY; + StringCopy(gStringVar1, sSortTypeStrings[SORT_ALPHABETICALLY]); + gTasks[taskId].func = SortBagItems; +} + +static void ItemMenu_SortByType(u8 taskId) +{ + gTasks[taskId].tSortType = SORT_BY_TYPE; + StringCopy(gStringVar1, sSortTypeStrings[SORT_BY_TYPE]); + gTasks[taskId].func = SortBagItems; +} + +static void ItemMenu_SortByAmount(u8 taskId) +{ + gTasks[taskId].tSortType = SORT_BY_AMOUNT; //greatest->least + StringCopy(gStringVar1, sSortTypeStrings[SORT_BY_AMOUNT]); + gTasks[taskId].func = SortBagItems; +} + +static void ItemMenu_SortByIndex(u8 taskId) +{ + gTasks[taskId].tSortType = SORT_BY_INDEX; + StringCopy(gStringVar1, sSortTypeStrings[SORT_BY_INDEX]); + gTasks[taskId].func = SortBagItems; +} + +static void SortBagItems(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + u16 *scrollPos = &gBagPosition.scrollPosition[gBagPosition.pocket]; + u16 *cursorPos = &gBagPosition.cursorPosition[gBagPosition.pocket]; + + RemoveContextWindow(); + + SortItemsInBag(&gBagPockets[gBagPosition.pocket], tSortType); + DestroyListMenuTask(data[0], scrollPos, cursorPos); + UpdatePocketListPosition(gBagPosition.pocket); + LoadBagItemListBuffers(gBagPosition.pocket); + data[0] = ListMenuInit(&gMultiuseListMenuTemplate, *scrollPos, *cursorPos); + ScheduleBgCopyTilemapToVram(0); + + StringCopy(gStringVar1, sSortTypeStrings[tSortType]); + StringExpandPlaceholders(gStringVar4, sText_ItemsSorted); + DisplayItemMessage(taskId, 1, gStringVar4, Task_SortFinish); +} + +#undef tSortType + +static void Task_SortFinish(u8 taskId) +{ + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + RemoveItemMessageWindow(4); + ReturnToItemList(taskId); + } +} + +void SortItemsInBag(struct BagPocket *pocket, enum BagSortOptions type) +{ + switch (type) + { + case SORT_ALPHABETICALLY: + MergeSort(pocket, CompareItemsAlphabetically); + break; + case SORT_BY_AMOUNT: + MergeSort(pocket, CompareItemsByMost); + break; + case SORT_BY_INDEX: + MergeSort(pocket, CompareItemsByIndex); + break; + default: + MergeSort(pocket, CompareItemsByType); + break; + } +} + +static inline __attribute__((always_inline)) void Merge(struct BagPocket *pocket, u32 iLeft, u32 iRight, u32 iEnd, struct ItemSlot *dummySlots, s32 (*comparator)(enum Pocket, struct ItemSlot, struct ItemSlot)) +{ + struct ItemSlot item_i, item_j; + u32 i = iLeft, j = iRight; + for (u32 k = iLeft; k < iEnd; k++) + { + item_i = BagPocket_GetSlotData(pocket, i); + item_j = BagPocket_GetSlotData(pocket, j); + if (i < iRight && (j >= iEnd || comparator(pocket->id, item_i, item_j) < 0)) + { + dummySlots[k] = item_i; + i++; + } + else + { + dummySlots[k] = item_j; + j++; + } + } +} + +// Source: https://en.wikipedia.org/wiki/Merge_sort#Bottom-up_implementation +static void MergeSort(struct BagPocket *pocket, s32 (*comparator)(enum Pocket, struct ItemSlot, struct ItemSlot)) +{ + struct ItemSlot *dummySlots = AllocZeroed(sizeof(struct ItemSlot) * pocket->capacity); + + u32 usedCapacity; + for (usedCapacity = 0; usedCapacity < pocket->capacity; usedCapacity++) + { + if (BagPocket_GetSlotData(pocket, usedCapacity).itemId == ITEM_NONE) + break; + } + + for (u32 width = 1; width < usedCapacity; width *= 2) + { + for (u32 i = 0; i < usedCapacity; i += 2 * width) + Merge(pocket, i, min(i + width, usedCapacity), min(i + 2 * width, usedCapacity), dummySlots, comparator); + + for (u32 j = 0; j < usedCapacity; j++) + BagPocket_SetSlotData(pocket, j, dummySlots[j]); + } + + Free(dummySlots); +} + +static s32 CompareItemsAlphabetically(enum Pocket pocketId, struct ItemSlot item1, struct ItemSlot item2) +{ + const u8 *name1, *name2; + + if (item1.itemId == ITEM_NONE) + return 1; + else if (item2.itemId == ITEM_NONE) + return -1; + + if (pocketId == POCKET_TM_HM) + { + name1 = GetMoveName(GetTMHMMoveId(GetItemTMHMIndex(item1.itemId))); + name2 = GetMoveName(GetTMHMMoveId(GetItemTMHMIndex(item2.itemId))); + } + else + { + name1 = GetItemName(item1.itemId); + name2 = GetItemName(item2.itemId); + } + + return StringCompare(name1, name2); +} + +static s32 CompareItemsByMost(enum Pocket pocketId, struct ItemSlot item1, struct ItemSlot item2) +{ + if (item1.itemId == ITEM_NONE) + return 1; + else if (item2.itemId == ITEM_NONE) + return -1; + + if (item1.quantity < item2.quantity) + return 1; + else if (item1.quantity > item2.quantity) + return -1; + + return CompareItemsAlphabetically(pocketId, item1, item2); // Items have same quantity so sort alphabetically +} + +static s32 CompareItemsByType(enum Pocket pocketId, struct ItemSlot item1, struct ItemSlot item2) +{ + if (item1.itemId == ITEM_NONE) + return 1; + else if (item2.itemId == ITEM_NONE) + return -1; + + enum ItemSortType type1 = gItemsInfo[item1.itemId].sortType; + enum ItemSortType type2 = gItemsInfo[item2.itemId].sortType; + + // Uncategorized items go last. + if (type1 != ITEM_TYPE_UNCATEGORIZED && type2 == ITEM_TYPE_UNCATEGORIZED) + return -1; + else if (type2 != ITEM_TYPE_UNCATEGORIZED && type1 == ITEM_TYPE_UNCATEGORIZED) + return 1; + else if (type1 < type2) + return -1; + else if (type1 > type2) + return 1; + + return CompareItemsAlphabetically(pocketId, item1, item2); // Items are of same type so sort alphabetically +} + +static s32 CompareItemsByIndex(enum Pocket pocketId, struct ItemSlot item1, struct ItemSlot item2) +{ + u16 index1 = 0, index2 = 0; + + if (item1.itemId == ITEM_NONE) + return 1; + else if (item2.itemId == ITEM_NONE) + return -1; + + switch (pocketId) + { + case POCKET_TM_HM: + index1 = GetItemTMHMIndex(item1.itemId); + index2 = GetItemTMHMIndex(item2.itemId); + break; + case POCKET_BERRIES: // To do - requires #7305 + index1 = item1.itemId; + index2 = item2.itemId; + break; + default: + return 0; + } + + if (index1 < index2) + return -1; + else if (index1 > index2) + return 1; + + return 0; // Cannot have multiple stacks of indexed items +} diff --git a/src/item_menu_icons.c b/src/item_menu_icons.c index a56e6189ef0f..fa769b160f83 100644 --- a/src/item_menu_icons.c +++ b/src/item_menu_icons.c @@ -96,12 +96,12 @@ static const union AnimCmd sSpriteAnim_Bag_Berries[] = static const union AnimCmd *const sBagSpriteAnimTable[] = { - [POCKET_NONE] = sSpriteAnim_Bag_Closed, [POCKET_ITEMS] = sSpriteAnim_Bag_Items, [POCKET_POKE_BALLS] = sSpriteAnim_Bag_Pokeballs, [POCKET_TM_HM] = sSpriteAnim_Bag_TMsHMs, [POCKET_BERRIES] = sSpriteAnim_Bag_Berries, [POCKET_KEY_ITEMS] = sSpriteAnim_Bag_KeyItems, + [POCKET_DUMMY] = sSpriteAnim_Bag_Closed, }; static const union AffineAnimCmd sSpriteAffineAnim_BagNormal[] = @@ -473,12 +473,12 @@ void SetBagVisualPocketId(u8 bagPocketId, bool8 isSwitchingPockets) { sprite->y2 = -5; sprite->callback = SpriteCB_BagVisualSwitchingPockets; - sprite->sPocketId = bagPocketId + 1; - StartSpriteAnim(sprite, POCKET_NONE); + sprite->sPocketId = bagPocketId; + StartSpriteAnim(sprite, POCKET_DUMMY); } else { - StartSpriteAnim(sprite, bagPocketId + 1); + StartSpriteAnim(sprite, bagPocketId); } } diff --git a/src/item_use.c b/src/item_use.c index 44858183c16a..ff8ff9d588e6 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -18,6 +18,7 @@ #include "field_player_avatar.h" #include "field_screen_effect.h" #include "field_weather.h" +#include "fishing.h" #include "fldeff.h" #include "follower_npc.h" #include "item.h" @@ -28,6 +29,7 @@ #include "menu.h" #include "menu_helpers.h" #include "metatile_behavior.h" +#include "oras_dowse.h" #include "overworld.h" #include "palette.h" #include "party_menu.h" @@ -45,17 +47,15 @@ #include "constants/item_effects.h" #include "constants/items.h" #include "constants/songs.h" -#include "constants/map_types.h" static void SetUpItemUseCallback(u8); static void FieldCB_UseItemOnField(void); static void Task_CallItemUseOnFieldCallback(u8); +static void Task_PartyMenuItemUseFromField(u8); static void Task_UseItemfinder(u8); static void Task_CloseItemfinderMessage(u8); static void Task_HiddenItemNearby(u8); static void Task_StandingOnHiddenItem(u8); -static bool8 ItemfinderCheckForHiddenItems(const struct MapEvents *, u8); -static u8 GetDirectionToHiddenItem(s16, s16); static void PlayerFaceHiddenItem(u8); static void CheckForHiddenItemsInMapConnection(u8); static void Task_OpenRegisteredPokeblockCase(u8); @@ -97,7 +97,7 @@ static const u8 sText_PlayedPokeFlute[] = _("Played the POKΓ© FLUTE."); static const u8 sText_PokeFluteAwakenedMon[] = _("The POKΓ© FLUTE awakened sleeping\nPOKΓ©MON.{PAUSE_UNTIL_PRESS}"); // EWRAM variables -EWRAM_DATA static void(*sItemUseOnFieldCB)(u8 taskId) = NULL; +EWRAM_DATA static TaskFunc sItemUseOnFieldCB = NULL; // Below is set TRUE by UseRegisteredKeyItemOnField #define tUsingRegisteredKeyItem data[3] @@ -128,15 +128,25 @@ static void SetUpItemUseCallback(u8 taskId) type = gTasks[taskId].tEnigmaBerryType - 1; else type = GetItemType(gSpecialVar_ItemId) - 1; - if (!InBattlePyramid()) + + if (gTasks[taskId].tUsingRegisteredKeyItem && type == (ITEM_USE_PARTY_MENU - 1)) { - gBagMenu->newScreenCallback = sItemUseCallbacks[type]; - Task_FadeAndCloseBagMenu(taskId); + FadeScreen(FADE_TO_BLACK, 0); + gPartyMenu.data1 = DATA1_PARTY_MENU_FROM_FIELD; + gTasks[taskId].func = Task_PartyMenuItemUseFromField; } else { - gPyramidBagMenu->newScreenCallback = sItemUseCallbacks[type]; - CloseBattlePyramidBag(taskId); + if (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE) + { + gBagMenu->newScreenCallback = sItemUseCallbacks[type]; + Task_FadeAndCloseBagMenu(taskId); + } + else + { + gPyramidBagMenu->newScreenCallback = sItemUseCallbacks[type]; + CloseBattlePyramidBag(taskId); + } } } @@ -165,12 +175,22 @@ static void Task_CallItemUseOnFieldCallback(u8 taskId) sItemUseOnFieldCB(taskId); } +static void Task_PartyMenuItemUseFromField(u8 taskId) +{ + if (!gPaletteFade.active) + { + CleanupOverworldWindowsAndTilemaps(); + SetMainCallback2(CB2_ShowPartyMenuForItemUse); + DestroyTask(taskId); + } +} + static void DisplayCannotUseItemMessage(u8 taskId, bool8 isUsingRegisteredKeyItemOnField, const u8 *str) { StringExpandPlaceholders(gStringVar4, str); if (!isUsingRegisteredKeyItemOnField) { - if (!InBattlePyramid()) + if (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE) DisplayItemMessage(taskId, FONT_NORMAL, gStringVar4, CloseItemMessage); else DisplayItemMessageInBattlePyramid(taskId, gText_DadsAdvice, Task_CloseBattlePyramidBagMessage); @@ -347,10 +367,20 @@ void ItemUseOutOfBattle_Itemfinder(u8 var) static void ItemUseOnFieldCB_Itemfinder(u8 taskId) { - if (ItemfinderCheckForHiddenItems(gMapHeader.events, taskId) == TRUE) - gTasks[taskId].func = Task_UseItemfinder; + if (I_ORAS_DOWSING_FLAG != 0) + { + if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && !TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_UNDERWATER)) + gTasks[taskId].func = Task_UseORASDowsingMachine; + else + DisplayItemMessageOnField(taskId, gText_DadsAdvice, Task_CloseItemfinderMessage); + } else - DisplayItemMessageOnField(taskId, sText_ItemFinderNothing, Task_CloseItemfinderMessage); + { + if (ItemfinderCheckForHiddenItems(gMapHeader.events, taskId) == TRUE) + gTasks[taskId].func = Task_UseItemfinder; + else + DisplayItemMessageOnField(taskId, sText_ItemFinderNothing, Task_CloseItemfinderMessage); + } } // Define itemfinder task data @@ -406,12 +436,15 @@ static void Task_CloseItemfinderMessage(u8 taskId) DestroyTask(taskId); } -static bool8 ItemfinderCheckForHiddenItems(const struct MapEvents *events, u8 taskId) +bool8 ItemfinderCheckForHiddenItems(const struct MapEvents *events, u8 taskId) { int itemX, itemY; s16 playerX, playerY, i, distanceX, distanceY; PlayerGetDestCoords(&playerX, &playerY); - gTasks[taskId].tItemFound = FALSE; + if (I_ORAS_DOWSING_FLAG != 0) + gSprites[gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId].tItemFound = FALSE; + else + gTasks[taskId].tItemFound = FALSE; for (i = 0; i < events->bgEventCount; i++) { @@ -431,7 +464,7 @@ static bool8 ItemfinderCheckForHiddenItems(const struct MapEvents *events, u8 ta } CheckForHiddenItemsInMapConnection(taskId); - if (gTasks[taskId].tItemFound == TRUE) + if (gTasks[taskId].tItemFound == TRUE || gSprites[gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId].tItemFound) return TRUE; else return FALSE; @@ -530,6 +563,8 @@ static void SetDistanceOfClosestHiddenItem(u8 taskId, s16 itemDistanceX, s16 ite { s16 *data = gTasks[taskId].data; s16 oldItemAbsX, oldItemAbsY, newItemAbsX, newItemAbsY; + if (I_ORAS_DOWSING_FLAG != 0) + data = gSprites[gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId].data; if (tItemFound == FALSE) { @@ -586,7 +621,7 @@ static void SetDistanceOfClosestHiddenItem(u8 taskId, s16 itemDistanceX, s16 ite } } -static u8 GetDirectionToHiddenItem(s16 itemDistanceX, s16 itemDistanceY) +u8 GetDirectionToHiddenItem(s16 itemDistanceX, s16 itemDistanceY) { s16 absX, absY; @@ -885,7 +920,7 @@ void ItemUseOutOfBattle_DynamaxCandy(u8 taskId) void ItemUseOutOfBattle_TMHM(u8 taskId) { - if (gSpecialVar_ItemId >= ITEM_HM01) + if (GetItemTMHMIndex(gSpecialVar_ItemId) > NUM_TECHNICAL_MACHINES) DisplayItemMessage(taskId, FONT_NORMAL, sText_BootedUpHM, BootUpSoundTMHM); // HM else DisplayItemMessage(taskId, FONT_NORMAL, sText_BootedUpTM, BootUpSoundTMHM); // TM @@ -923,7 +958,7 @@ static void RemoveUsedItem(void) RemoveBagItem(gSpecialVar_ItemId, 1); CopyItemName(gSpecialVar_ItemId, gStringVar2); StringExpandPlaceholders(gStringVar4, gText_PlayerUsedVar2); - if (!InBattlePyramid()) + if (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE) { UpdatePocketItemList(GetItemPocket(gSpecialVar_ItemId)); UpdatePocketListPosition(GetItemPocket(gSpecialVar_ItemId)); @@ -939,7 +974,7 @@ void ItemUseOutOfBattle_Repel(u8 taskId) { if (REPEL_STEP_COUNT == 0) gTasks[taskId].func = Task_StartUseRepel; - else if (!InBattlePyramid()) + else if (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE) DisplayItemMessage(taskId, FONT_NORMAL, gText_RepelEffectsLingered, CloseItemMessage); else DisplayItemMessageInBattlePyramid(taskId, gText_RepelEffectsLingered, Task_CloseBattlePyramidBagMessage); @@ -966,7 +1001,7 @@ static void Task_UseRepel(u8 taskId) VarSet(VAR_LAST_REPEL_LURE_USED, gSpecialVar_ItemId); #endif RemoveUsedItem(); - if (!InBattlePyramid()) + if (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE) DisplayItemMessage(taskId, FONT_NORMAL, gStringVar4, CloseItemMessage); else DisplayItemMessageInBattlePyramid(taskId, gStringVar4, Task_CloseBattlePyramidBagMessage); @@ -983,7 +1018,7 @@ void ItemUseOutOfBattle_Lure(u8 taskId) { if (LURE_STEP_COUNT == 0) gTasks[taskId].func = Task_StartUseLure; - else if (!InBattlePyramid()) + else if (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE) DisplayItemMessage(taskId, FONT_NORMAL, gText_LureEffectsLingered, CloseItemMessage); else DisplayItemMessageInBattlePyramid(taskId, gText_LureEffectsLingered, Task_CloseBattlePyramidBagMessage); @@ -1010,7 +1045,7 @@ static void Task_UseLure(u8 taskId) VarSet(VAR_LAST_REPEL_LURE_USED, gSpecialVar_ItemId); #endif RemoveUsedItem(); - if (!InBattlePyramid()) + if (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE) DisplayItemMessage(taskId, FONT_NORMAL, gStringVar4, CloseItemMessage); else DisplayItemMessageInBattlePyramid(taskId, gStringVar4, Task_CloseBattlePyramidBagMessage); @@ -1029,7 +1064,7 @@ static void Task_UsedBlackWhiteFlute(u8 taskId) if(++gTasks[taskId].data[8] > 7) { PlaySE(SE_GLASS_FLUTE); - if (!InBattlePyramid()) + if (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE) DisplayItemMessage(taskId, FONT_NORMAL, gStringVar4, CloseItemMessage); else DisplayItemMessageInBattlePyramid(taskId, gStringVar4, Task_CloseBattlePyramidBagMessage); @@ -1111,9 +1146,9 @@ static u32 GetBallThrowableState(void) return BALL_THROW_UNABLE_TWO_MONS; else if (IsPlayerPartyAndPokemonStorageFull() == TRUE) return BALL_THROW_UNABLE_NO_ROOM; - else if (B_SEMI_INVULNERABLE_CATCH >= GEN_4 && (gStatuses3[GetCatchingBattler()] & STATUS3_SEMI_INVULNERABLE)) + else if (B_SEMI_INVULNERABLE_CATCH >= GEN_4 && IsSemiInvulnerable(GetCatchingBattler(), CHECK_ALL)) return BALL_THROW_UNABLE_SEMI_INVULNERABLE; - else if (FlagGet(B_FLAG_NO_CATCHING)) + else if (FlagGet(B_FLAG_NO_CATCHING) || !IsAllowedToUseBag()) return BALL_THROW_UNABLE_DISABLED_FLAG; return BALL_THROW_ABLE; @@ -1134,31 +1169,31 @@ void ItemUseInBattle_PokeBall(u8 taskId) case BALL_THROW_ABLE: default: RemoveBagItem(gSpecialVar_ItemId, 1); - if (!InBattlePyramid()) + if (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE) Task_FadeAndCloseBagMenu(taskId); else CloseBattlePyramidBag(taskId); break; case BALL_THROW_UNABLE_TWO_MONS: - if (!InBattlePyramid()) + if (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE) DisplayItemMessage(taskId, FONT_NORMAL, sText_CantThrowPokeBall_TwoMons, CloseItemMessage); else DisplayItemMessageInBattlePyramid(taskId, sText_CantThrowPokeBall_TwoMons, Task_CloseBattlePyramidBagMessage); break; case BALL_THROW_UNABLE_NO_ROOM: - if (!InBattlePyramid()) + if (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE) DisplayItemMessage(taskId, FONT_NORMAL, gText_BoxFull, CloseItemMessage); else DisplayItemMessageInBattlePyramid(taskId, gText_BoxFull, Task_CloseBattlePyramidBagMessage); break; case BALL_THROW_UNABLE_SEMI_INVULNERABLE: - if (!InBattlePyramid()) + if (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE) DisplayItemMessage(taskId, FONT_NORMAL, sText_CantThrowPokeBall_SemiInvulnerable, CloseItemMessage); else DisplayItemMessageInBattlePyramid(taskId, sText_CantThrowPokeBall_SemiInvulnerable, Task_CloseBattlePyramidBagMessage); break; case BALL_THROW_UNABLE_DISABLED_FLAG: - if (!InBattlePyramid()) + if (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE) DisplayItemMessage(taskId, FONT_NORMAL, sText_CantThrowPokeBall_Disabled, CloseItemMessage); else DisplayItemMessageInBattlePyramid(taskId, sText_CantThrowPokeBall_Disabled, Task_CloseBattlePyramidBagMessage); @@ -1168,7 +1203,7 @@ void ItemUseInBattle_PokeBall(u8 taskId) static void ItemUseInBattle_ShowPartyMenu(u8 taskId) { - if (!InBattlePyramid()) + if (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE) { gBagMenu->newScreenCallback = ChooseMonForInBattleItem; Task_FadeAndCloseBagMenu(taskId); @@ -1192,12 +1227,25 @@ void ItemUseInBattle_PartyMenuChooseMove(u8 taskId) ItemUseInBattle_ShowPartyMenu(taskId); } -static bool32 SelectedMonHasStatus2(u16 itemId) +static bool32 IteamHealsMonVolatile(u32 battler, u16 itemId) +{ + const u8 *effect = GetItemEffect(itemId); + if (effect[3] & ITEM3_STATUS_ALL) + return (gBattleMons[battler].volatiles.infatuation || gBattleMons[battler].volatiles.confusionTurns > 0); + else if (effect[0] & ITEM0_INFATUATION) + return gBattleMons[battler].volatiles.infatuation; + else if (effect[3] & ITEM3_CONFUSION) + return gBattleMons[battler].volatiles.confusionTurns > 0; + + return FALSE; +} + +static bool32 SelectedMonHasVolatile(u16 itemId) { if (gPartyMenu.slotId == 0) - return gBattleMons[0].status2 & GetItemStatus2Mask(itemId); + return IteamHealsMonVolatile(0, itemId); else if (gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI) && gPartyMenu.slotId == 1) - return gBattleMons[2].status2 & GetItemStatus2Mask(itemId); + return IteamHealsMonVolatile(2, itemId); return FALSE; } @@ -1211,8 +1259,8 @@ bool32 CannotUseItemsInBattle(u16 itemId, struct Pokemon *mon) u16 hp = GetMonData(mon, MON_DATA_HP); // Embargo Check - if ((gPartyMenu.slotId == 0 && gStatuses3[B_POSITION_PLAYER_LEFT] & STATUS3_EMBARGO) - || (gPartyMenu.slotId == 1 && gStatuses3[B_POSITION_PLAYER_RIGHT] & STATUS3_EMBARGO)) + if ((gPartyMenu.slotId == 0 && gBattleMons[B_POSITION_PLAYER_LEFT].volatiles.embargo) + || (gPartyMenu.slotId == 1 && gBattleMons[B_POSITION_PLAYER_RIGHT].volatiles.embargo)) { return TRUE; } @@ -1221,11 +1269,11 @@ bool32 CannotUseItemsInBattle(u16 itemId, struct Pokemon *mon) switch (battleUsage) { case EFFECT_ITEM_INCREASE_STAT: - if (gBattleMons[gBattlerInMenuId].statStages[GetItemEffect(itemId)[1]] == MAX_STAT_STAGE) + if (CompareStat(gBattlerInMenuId, GetItemEffect(itemId)[1], MAX_STAT_STAGE, CMP_EQUAL, GetBattlerAbility(gBattlerInMenuId))) cannotUse = TRUE; break; case EFFECT_ITEM_SET_FOCUS_ENERGY: - if (gBattleMons[gBattlerInMenuId].status2 & STATUS2_FOCUS_ENERGY_ANY) + if (gBattleMons[gBattlerInMenuId].volatiles.dragonCheer || gBattleMons[gBattlerInMenuId].volatiles.focusEnergy) cannotUse = TRUE; break; case EFFECT_ITEM_SET_MIST: @@ -1258,28 +1306,32 @@ bool32 CannotUseItemsInBattle(u16 itemId, struct Pokemon *mon) } break; case EFFECT_ITEM_INCREASE_ALL_STATS: + { + u32 ability = GetBattlerAbility(gBattlerInMenuId); + cannotUse = TRUE; for (i = STAT_ATK; i < NUM_STATS; i++) { - if (CompareStat(gBattlerInMenuId, i, MAX_STAT_STAGE, CMP_EQUAL)) + if (!CompareStat(gBattlerInMenuId, i, MAX_STAT_STAGE, CMP_EQUAL, ability)) { - cannotUse = TRUE; + cannotUse = FALSE; break; } } break; + } case EFFECT_ITEM_RESTORE_HP: if (hp == 0 || hp == GetMonData(mon, MON_DATA_MAX_HP)) cannotUse = TRUE; break; case EFFECT_ITEM_CURE_STATUS: if (!((GetMonData(mon, MON_DATA_STATUS) & GetItemStatus1Mask(itemId)) - || SelectedMonHasStatus2(itemId))) + || SelectedMonHasVolatile(itemId))) cannotUse = TRUE; break; case EFFECT_ITEM_HEAL_AND_CURE_STATUS: if ((hp == 0 || hp == GetMonData(mon, MON_DATA_MAX_HP)) && !((GetMonData(mon, MON_DATA_STATUS) & GetItemStatus1Mask(itemId)) - || SelectedMonHasStatus2(itemId))) + || SelectedMonHasVolatile(itemId))) cannotUse = TRUE; break; case EFFECT_ITEM_REVIVE: @@ -1316,7 +1368,7 @@ void ItemUseInBattle_BagMenu(u8 taskId) { if (CannotUseItemsInBattle(gSpecialVar_ItemId, NULL)) { - if (!InBattlePyramid()) + if (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE) DisplayItemMessage(taskId, FONT_NORMAL, gStringVar4, CloseItemMessage); else DisplayItemMessageInBattlePyramid(taskId, gStringVar4, Task_CloseBattlePyramidBagMessage); @@ -1327,7 +1379,7 @@ void ItemUseInBattle_BagMenu(u8 taskId) if (!GetItemImportance(gSpecialVar_ItemId) && !(B_TRY_CATCH_TRAINER_BALL >= GEN_4 && (GetItemBattleUsage(gSpecialVar_ItemId) == EFFECT_ITEM_THROW_BALL) && (gBattleTypeFlags & BATTLE_TYPE_TRAINER))) RemoveUsedItem(); ScheduleBgCopyTilemapToVram(2); - if (!InBattlePyramid()) + if (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE) gTasks[taskId].func = Task_FadeAndCloseBagMenu; else gTasks[taskId].func = CloseBattlePyramidBag; @@ -1380,82 +1432,36 @@ void ItemUseOutOfBattle_EnigmaBerry(u8 taskId) void ItemUseOutOfBattle_FormChange(u8 taskId) { - if (!gTasks[taskId].tUsingRegisteredKeyItem) - { - gItemUseCB = ItemUseCB_FormChange; - gTasks[taskId].data[0] = FALSE; - SetUpItemUseOnFieldCallback(taskId); - } - else - { - // TODO: handle key items with callbacks to menus allow to be used by registering them. - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].tUsingRegisteredKeyItem); - } + gItemUseCB = ItemUseCB_FormChange; + SetUpItemUseCallback(taskId); } void ItemUseOutOfBattle_FormChange_ConsumedOnUse(u8 taskId) { - if (!gTasks[taskId].tUsingRegisteredKeyItem) - { - gItemUseCB = ItemUseCB_FormChange_ConsumedOnUse; - gTasks[taskId].data[0] = TRUE; - SetUpItemUseOnFieldCallback(taskId); - } - else - { - // TODO: handle key items with callbacks to menus allow to be used by registering them. - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].tUsingRegisteredKeyItem); - } + gItemUseCB = ItemUseCB_FormChange_ConsumedOnUse; + SetUpItemUseCallback(taskId); } void ItemUseOutOfBattle_RotomCatalog(u8 taskId) { - if (!gTasks[taskId].tUsingRegisteredKeyItem) - { - gItemUseCB = ItemUseCB_RotomCatalog; - gTasks[taskId].data[0] = TRUE; - SetUpItemUseOnFieldCallback(taskId); - } - else - { - // TODO: handle key items with callbacks to menus allow to be used by registering them. - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].tUsingRegisteredKeyItem); - } + gItemUseCB = ItemUseCB_RotomCatalog; + SetUpItemUseCallback(taskId); } void ItemUseOutOfBattle_ZygardeCube(u8 taskId) { - if (!gTasks[taskId].tUsingRegisteredKeyItem) - { - gItemUseCB = ItemUseCB_ZygardeCube; - gTasks[taskId].data[0] = TRUE; - SetUpItemUseOnFieldCallback(taskId); - } - else - { - // TODO: handle key items with callbacks to menus allow to be used by registering them. - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].tUsingRegisteredKeyItem); - } + gItemUseCB = ItemUseCB_ZygardeCube; + SetUpItemUseCallback(taskId); } void ItemUseOutOfBattle_Fusion(u8 taskId) { - if (!gTasks[taskId].tUsingRegisteredKeyItem) - { - gItemUseCB = ItemUseCB_Fusion; - gTasks[taskId].data[0] = FALSE; - SetUpItemUseCallback(taskId); - } - else - { - // TODO: handle key items with callbacks to menus allow to be used by registering them. - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].tUsingRegisteredKeyItem); - } + gItemUseCB = ItemUseCB_Fusion; + SetUpItemUseCallback(taskId); } void Task_UseHoneyOnField(u8 taskId) { - //ResetInitialPlayerAvatarState(); StartSweetScentFieldEffect(); DestroyTask(taskId); } @@ -1466,7 +1472,6 @@ static void ItemUseOnFieldCB_Honey(u8 taskId) RemoveBagItem(gSpecialVar_ItemId, 1); CopyItemName(gSpecialVar_ItemId, gStringVar2); StringExpandPlaceholders(gStringVar4, gText_PlayerUsedVar2); - gTasks[taskId].data[0] = 0; DisplayItemMessageOnField(taskId, gStringVar4, Task_UseHoneyOnField); } @@ -1487,7 +1492,7 @@ static bool32 IsValidLocationForVsSeeker(void) { u16 mapGroup = gSaveBlock1Ptr->location.mapGroup; u16 mapNum = gSaveBlock1Ptr->location.mapNum; - u16 mapType = gMapHeader.mapType; + enum MapType mapType = gMapHeader.mapType; typedef struct { u16 mapGroup; @@ -1551,7 +1556,7 @@ static void Task_DisplayPokeFluteMessage(u8 taskId) { if (WaitFanfare(FALSE)) { - if (gTasks[taskId].data[3] == 0) + if (!gTasks[taskId].tUsingRegisteredKeyItem) DisplayItemMessage(taskId, FONT_NORMAL, sText_PokeFluteAwakenedMon, CloseItemMessage); else DisplayItemMessageOnField(taskId, sText_PokeFluteAwakenedMon, Task_CloseCantUseKeyItemMessage); @@ -1577,14 +1582,14 @@ void ItemUseOutOfBattle_PokeFlute(u8 taskId) if (wokeSomeoneUp) { - if (gTasks[taskId].data[3] == 0) + if (!gTasks[taskId].tUsingRegisteredKeyItem) DisplayItemMessage(taskId, FONT_NORMAL, sText_PlayedPokeFlute, Task_PlayPokeFlute); else DisplayItemMessageOnField(taskId, sText_PlayedPokeFlute, Task_PlayPokeFlute); } else { - if (gTasks[taskId].data[3] == 0) + if (!gTasks[taskId].tUsingRegisteredKeyItem) DisplayItemMessage(taskId, FONT_NORMAL, sText_PlayedPokeFluteCatchy, CloseItemMessage); else DisplayItemMessageOnField(taskId, sText_PlayedPokeFluteCatchy, Task_CloseCantUseKeyItemMessage); @@ -1609,8 +1614,7 @@ void ItemUseOutOfBattle_TownMap(u8 taskId) } else { - // TODO: handle key items with callbacks to menus allow to be used by registering them. - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].tUsingRegisteredKeyItem); + gTasks[taskId].func = ItemUseOnFieldCB_TownMap; } } diff --git a/src/landmark.c b/src/landmark.c index d2bb3c4105a7..c26e61f45f60 100644 --- a/src/landmark.c +++ b/src/landmark.c @@ -10,95 +10,54 @@ struct Landmark struct LandmarkList { - u8 mapSection; + mapsec_u8_t mapSection; u8 id; const struct Landmark *const *landmarks; }; -static const u8 LandmarkName_FlowerShop[] = _("FLOWER SHOP"); -static const u8 LandmarkName_PetalburgWoods[] = _("PETALBURG WOODS"); -static const u8 LandmarkName_MrBrineysCottage[] = _("MR. BRINEY'S COTTAGE"); -static const u8 LandmarkName_AbandonedShip[] = _("ABANDONED SHIP"); -static const u8 LandmarkName_SeashoreHouse[] = _("SEASHORE HOUSE"); -static const u8 LandmarkName_SlateportBeach[] = _("SLATEPORT BEACH"); -static const u8 LandmarkName_CyclingRoad[] = _("CYCLING ROAD"); -static const u8 LandmarkName_NewMauville[] = _("NEW MAUVILLE"); -static const u8 LandmarkName_TrickHouse[] = _("TRICK HOUSE"); -static const u8 LandmarkName_OldLadysRestShop[] = _("OLD LADY'S REST STOP"); -static const u8 LandmarkName_Desert[] = _("DESERT"); -static const u8 LandmarkName_WinstrateFamily[] = _("THE WINSTRATE FAMILY"); -static const u8 LandmarkName_CableCar[] = _("CABLE CAR"); -static const u8 LandmarkName_GlassWorkshop[] = _("GLASS WORKSHOP"); -static const u8 LandmarkName_WeatherInstitute[] = _("WEATHER INSTITUTE"); -static const u8 LandmarkName_MeteorFalls[] = _("METEOR FALLS"); -static const u8 LandmarkName_TunnelersRestHouse[] = _("TUNNELER'S RESTHOUSE"); -static const u8 LandmarkName_RusturfTunnel[] = _("RUSTURF TUNNEL"); -static const u8 LandmarkName_PokemonDayCare[] = _("POKΓ©MON DAY CARE"); -static const u8 LandmarkName_SafariZoneEntrance[] = _("SAFARI ZONE ENTRANCE"); -static const u8 LandmarkName_MtPyre[] = _("MT. PYRE"); -static const u8 LandmarkName_ShoalCave[] = _("SHOAL CAVE"); -static const u8 LandmarkName_SeafloorCavern[] = _("SEAFLOOR CAVERN"); -static const u8 LandmarkName_GraniteCave[] = _("GRANITE CAVE"); -static const u8 LandmarkName_OceanCurrent[] = _("OCEAN CURRENT"); -static const u8 LandmarkName_LanettesHouse[] = _("LANETTE'S HOUSE"); -static const u8 LandmarkName_FieryPath[] = _("FIERY PATH"); -static const u8 LandmarkName_JaggedPass[] = _("JAGGED PASS"); -static const u8 LandmarkName_SkyPillar[] = _("SKY PILLAR"); -static const u8 LandmarkName_BerryMastersHouse[] = _("BERRY MASTER'S HOUSE"); -static const u8 LandmarkName_IslandCave[] = _("ISLAND CAVE"); -static const u8 LandmarkName_DesertRuins[] = _("DESERT RUINS"); -static const u8 LandmarkName_ScorchedSlab[] = _("SCORCHED SLAB"); -static const u8 LandmarkName_AncientTomb[] = _("ANCIENT TOMB"); -static const u8 LandmarkName_SealedChamber[] = _("SEALED CHAMBER"); -static const u8 LandmarkName_FossilManiacsHouse[] = _("FOSSIL MANIAC'S HOUSE"); -static const u8 LandmarkName_HuntersHouse[] = _("HUNTER'S HOUSE"); -static const u8 LandmarkName_MagmaHideout[] = _("MAGMA HIDEOUT"); -static const u8 LandmarkName_MirageTower[] = _("MIRAGE TOWER"); -static const u8 LandmarkName_AlteringCave[] = _("ALTERING CAVE"); -static const u8 LandmarkName_DesertUnderpass[] = _("DESERT UNDERPASS"); -static const u8 LandmarkName_TrainerHill[] = _("TRAINER HILL"); - -static const struct Landmark Landmark_FlowerShop = {LandmarkName_FlowerShop, FLAG_LANDMARK_FLOWER_SHOP}; -static const struct Landmark Landmark_PetalburgWoods = {LandmarkName_PetalburgWoods, -1}; -static const struct Landmark Landmark_MrBrineysCottage = {LandmarkName_MrBrineysCottage, FLAG_LANDMARK_MR_BRINEY_HOUSE}; -static const struct Landmark Landmark_AbandonedShip = {LandmarkName_AbandonedShip, FLAG_LANDMARK_ABANDONED_SHIP}; -static const struct Landmark Landmark_SeashoreHouse = {LandmarkName_SeashoreHouse, FLAG_LANDMARK_SEASHORE_HOUSE}; -static const struct Landmark Landmark_SlateportBeach = {LandmarkName_SlateportBeach, -1}; -static const struct Landmark Landmark_CyclingRoad = {LandmarkName_CyclingRoad, -1}; -static const struct Landmark Landmark_NewMauville = {LandmarkName_NewMauville, FLAG_LANDMARK_NEW_MAUVILLE}; -static const struct Landmark Landmark_TrickHouse = {LandmarkName_TrickHouse, FLAG_LANDMARK_TRICK_HOUSE}; -static const struct Landmark Landmark_OldLadysRestShop = {LandmarkName_OldLadysRestShop, FLAG_LANDMARK_OLD_LADY_REST_SHOP}; -static const struct Landmark Landmark_Desert = {LandmarkName_Desert, -1}; -static const struct Landmark Landmark_WinstrateFamily = {LandmarkName_WinstrateFamily, FLAG_LANDMARK_WINSTRATE_FAMILY}; -static const struct Landmark Landmark_CableCar = {LandmarkName_CableCar, -1}; -static const struct Landmark Landmark_GlassWorkshop = {LandmarkName_GlassWorkshop, FLAG_LANDMARK_GLASS_WORKSHOP}; -static const struct Landmark Landmark_WeatherInstitute = {LandmarkName_WeatherInstitute, -1}; -static const struct Landmark Landmark_MeteorFalls = {LandmarkName_MeteorFalls, -1}; -static const struct Landmark Landmark_TunnelersRestHouse = {LandmarkName_TunnelersRestHouse, FLAG_LANDMARK_TUNNELERS_REST_HOUSE}; -static const struct Landmark Landmark_RusturfTunnel = {LandmarkName_RusturfTunnel, -1}; -static const struct Landmark Landmark_PokemonDayCare = {LandmarkName_PokemonDayCare, FLAG_LANDMARK_POKEMON_DAYCARE}; -static const struct Landmark Landmark_SafariZoneEntrance = {LandmarkName_SafariZoneEntrance, -1}; -static const struct Landmark Landmark_MtPyre = {LandmarkName_MtPyre, -1}; -static const struct Landmark Landmark_ShoalCave = {LandmarkName_ShoalCave, -1}; -static const struct Landmark Landmark_SeafloorCavern = {LandmarkName_SeafloorCavern, FLAG_LANDMARK_SEAFLOOR_CAVERN}; -static const struct Landmark Landmark_GraniteCave = {LandmarkName_GraniteCave, -1}; -static const struct Landmark Landmark_OceanCurrent = {LandmarkName_OceanCurrent, -1}; -static const struct Landmark Landmark_LanettesHouse = {LandmarkName_LanettesHouse, FLAG_LANDMARK_LANETTES_HOUSE}; -static const struct Landmark Landmark_FieryPath = {LandmarkName_FieryPath, FLAG_LANDMARK_FIERY_PATH}; -static const struct Landmark Landmark_JaggedPass = {LandmarkName_JaggedPass, -1}; -static const struct Landmark Landmark_BerryMastersHouse = {LandmarkName_BerryMastersHouse, FLAG_LANDMARK_BERRY_MASTERS_HOUSE}; -static const struct Landmark Landmark_IslandCave = {LandmarkName_IslandCave, FLAG_LANDMARK_ISLAND_CAVE}; -static const struct Landmark Landmark_DesertRuins = {LandmarkName_DesertRuins, FLAG_LANDMARK_DESERT_RUINS}; -static const struct Landmark Landmark_ScorchedSlab = {LandmarkName_ScorchedSlab, FLAG_LANDMARK_SCORCHED_SLAB}; -static const struct Landmark Landmark_AncientTomb = {LandmarkName_AncientTomb, FLAG_LANDMARK_ANCIENT_TOMB}; -static const struct Landmark Landmark_SealedChamber = {LandmarkName_SealedChamber, FLAG_LANDMARK_SEALED_CHAMBER}; -static const struct Landmark Landmark_FossilManiacsHouse = {LandmarkName_FossilManiacsHouse, FLAG_LANDMARK_FOSSIL_MANIACS_HOUSE}; -static const struct Landmark Landmark_HuntersHouse = {LandmarkName_HuntersHouse, FLAG_LANDMARK_HUNTERS_HOUSE}; -static const struct Landmark Landmark_SkyPillar = {LandmarkName_SkyPillar, FLAG_LANDMARK_SKY_PILLAR}; -static const struct Landmark Landmark_MirageTower = {LandmarkName_MirageTower, FLAG_LANDMARK_MIRAGE_TOWER}; -static const struct Landmark Landmark_AlteringCave = {LandmarkName_AlteringCave, FLAG_LANDMARK_ALTERING_CAVE}; -static const struct Landmark Landmark_DesertUnderpass = {LandmarkName_DesertUnderpass, FLAG_LANDMARK_DESERT_UNDERPASS}; -static const struct Landmark Landmark_TrainerHill = {LandmarkName_TrainerHill, FLAG_LANDMARK_TRAINER_HILL}; +static const u8 LandmarkName_MagmaHideout[] = _("MAGMA HIDEOUT"); //Unused + +static const struct Landmark Landmark_FlowerShop = {COMPOUND_STRING("FLOWER SHOP"), FLAG_LANDMARK_FLOWER_SHOP}; +static const struct Landmark Landmark_PetalburgWoods = {COMPOUND_STRING("PETALBURG WOODS"), -1}; +static const struct Landmark Landmark_MrBrineysCottage = {COMPOUND_STRING("MR. BRINEY'S COTTAGE"), FLAG_LANDMARK_MR_BRINEY_HOUSE}; +static const struct Landmark Landmark_AbandonedShip = {COMPOUND_STRING("ABANDONED SHIP"), FLAG_LANDMARK_ABANDONED_SHIP}; +static const struct Landmark Landmark_SeashoreHouse = {COMPOUND_STRING("SEASHORE HOUSE"), FLAG_LANDMARK_SEASHORE_HOUSE}; +static const struct Landmark Landmark_SlateportBeach = {COMPOUND_STRING("SLATEPORT BEACH"), -1}; +static const struct Landmark Landmark_CyclingRoad = {COMPOUND_STRING("CYCLING ROAD"), -1}; +static const struct Landmark Landmark_NewMauville = {COMPOUND_STRING("NEW MAUVILLE"), FLAG_LANDMARK_NEW_MAUVILLE}; +static const struct Landmark Landmark_TrickHouse = {COMPOUND_STRING("TRICK HOUSE"), FLAG_LANDMARK_TRICK_HOUSE}; +static const struct Landmark Landmark_OldLadysRestShop = {COMPOUND_STRING("OLD LADY'S REST STOP"), FLAG_LANDMARK_OLD_LADY_REST_SHOP}; +static const struct Landmark Landmark_Desert = {COMPOUND_STRING("DESERT"), -1}; +static const struct Landmark Landmark_WinstrateFamily = {COMPOUND_STRING("THE WINSTRATE FAMILY"), FLAG_LANDMARK_WINSTRATE_FAMILY}; +static const struct Landmark Landmark_CableCar = {COMPOUND_STRING("CABLE CAR"), -1}; +static const struct Landmark Landmark_GlassWorkshop = {COMPOUND_STRING("GLASS WORKSHOP"), FLAG_LANDMARK_GLASS_WORKSHOP}; +static const struct Landmark Landmark_WeatherInstitute = {COMPOUND_STRING("WEATHER INSTITUTE"), -1}; +static const struct Landmark Landmark_MeteorFalls = {COMPOUND_STRING("METEOR FALLS"), -1}; +static const struct Landmark Landmark_TunnelersRestHouse = {COMPOUND_STRING("TUNNELER'S RESTHOUSE"), FLAG_LANDMARK_TUNNELERS_REST_HOUSE}; +static const struct Landmark Landmark_RusturfTunnel = {COMPOUND_STRING("RUSTURF TUNNEL"), -1}; +static const struct Landmark Landmark_PokemonDayCare = {COMPOUND_STRING("POKΓ©MON DAY CARE"), FLAG_LANDMARK_POKEMON_DAYCARE}; +static const struct Landmark Landmark_SafariZoneEntrance = {COMPOUND_STRING("SAFARI ZONE ENTRANCE"), -1}; +static const struct Landmark Landmark_MtPyre = {COMPOUND_STRING("MT. PYRE"), -1}; +static const struct Landmark Landmark_ShoalCave = {COMPOUND_STRING("SHOAL CAVE"), -1}; +static const struct Landmark Landmark_SeafloorCavern = {COMPOUND_STRING("SEAFLOOR CAVERN"), FLAG_LANDMARK_SEAFLOOR_CAVERN}; +static const struct Landmark Landmark_GraniteCave = {COMPOUND_STRING("GRANITE CAVE"), -1}; +static const struct Landmark Landmark_OceanCurrent = {COMPOUND_STRING("OCEAN CURRENT"), -1}; +static const struct Landmark Landmark_LanettesHouse = {COMPOUND_STRING("LANETTE'S HOUSE"), FLAG_LANDMARK_LANETTES_HOUSE}; +static const struct Landmark Landmark_FieryPath = {COMPOUND_STRING("FIERY PATH"), FLAG_LANDMARK_FIERY_PATH}; +static const struct Landmark Landmark_JaggedPass = {COMPOUND_STRING("JAGGED PASS"), -1}; +static const struct Landmark Landmark_BerryMastersHouse = {COMPOUND_STRING("BERRY MASTER'S HOUSE"), FLAG_LANDMARK_BERRY_MASTERS_HOUSE}; +static const struct Landmark Landmark_IslandCave = {COMPOUND_STRING("ISLAND CAVE"), FLAG_LANDMARK_ISLAND_CAVE}; +static const struct Landmark Landmark_DesertRuins = {COMPOUND_STRING("DESERT RUINS"), FLAG_LANDMARK_DESERT_RUINS}; +static const struct Landmark Landmark_ScorchedSlab = {COMPOUND_STRING("SCORCHED SLAB"), FLAG_LANDMARK_SCORCHED_SLAB}; +static const struct Landmark Landmark_AncientTomb = {COMPOUND_STRING("ANCIENT TOMB"), FLAG_LANDMARK_ANCIENT_TOMB}; +static const struct Landmark Landmark_SealedChamber = {COMPOUND_STRING("SEALED CHAMBER"), FLAG_LANDMARK_SEALED_CHAMBER}; +static const struct Landmark Landmark_FossilManiacsHouse = {COMPOUND_STRING("FOSSIL MANIAC'S HOUSE"), FLAG_LANDMARK_FOSSIL_MANIACS_HOUSE}; +static const struct Landmark Landmark_HuntersHouse = {COMPOUND_STRING("HUNTER'S HOUSE"), FLAG_LANDMARK_HUNTERS_HOUSE}; +static const struct Landmark Landmark_SkyPillar = {COMPOUND_STRING("SKY PILLAR"), FLAG_LANDMARK_SKY_PILLAR}; +static const struct Landmark Landmark_MirageTower = {COMPOUND_STRING("MIRAGE TOWER"), FLAG_LANDMARK_MIRAGE_TOWER}; +static const struct Landmark Landmark_AlteringCave = {COMPOUND_STRING("ALTERING CAVE"), FLAG_LANDMARK_ALTERING_CAVE}; +static const struct Landmark Landmark_DesertUnderpass = {COMPOUND_STRING("DESERT UNDERPASS"), FLAG_LANDMARK_DESERT_UNDERPASS}; +static const struct Landmark Landmark_TrainerHill = {COMPOUND_STRING("TRAINER HILL"), FLAG_LANDMARK_TRAINER_HILL}; static const struct Landmark *const Landmarks_Route103_2[] = { @@ -392,9 +351,9 @@ static const struct LandmarkList sLandmarkLists[] = {MAPSEC_NONE, 0, NULL}, }; -static const struct Landmark *const *GetLandmarks(u8 mapSection, u8 id); +static const struct Landmark *const *GetLandmarks(mapsec_u8_t mapSection, u8 id); -const u8 *GetLandmarkName(u8 mapSection, u8 id, u8 count) +const u8 *GetLandmarkName(mapsec_u8_t mapSection, u8 id, u8 count) { const struct Landmark *const *landmarks = GetLandmarks(mapSection, id); @@ -421,7 +380,7 @@ const u8 *GetLandmarkName(u8 mapSection, u8 id, u8 count) return (*landmarks)->name; } -static const struct Landmark *const *GetLandmarks(u8 mapSection, u8 id) +static const struct Landmark *const *GetLandmarks(mapsec_u8_t mapSection, u8 id) { u16 i = 0; diff --git a/src/line_break.c b/src/line_break.c index 6684b3237587..bb601a0d767b 100644 --- a/src/line_break.c +++ b/src/line_break.c @@ -29,6 +29,25 @@ u32 CountLineBreaks(u8 *src) } void BreakStringAutomatic(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId, enum ToggleScrollPrompt toggleScrollPrompt) +{ + u32 currIndex = 0; + u8 *currSrc = src; + while (src[currIndex] != EOS) + { + if (src[currIndex] == CHAR_PROMPT_CLEAR) + { + u8 replacedChar = src[currIndex]; + src[currIndex] = EOS; + BreakSubStringAutomatic(currSrc, maxWidth, screenLines, fontId, toggleScrollPrompt); + src[currIndex] = replacedChar; + currSrc = &src[currIndex + 1]; + } + currIndex++; + } + BreakSubStringAutomatic(currSrc, maxWidth, screenLines, fontId, toggleScrollPrompt); +} + +void BreakStringNaive(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId, enum ToggleScrollPrompt toggleScrollPrompt) { u32 currIndex = 0; u8 *currSrc = src; @@ -38,13 +57,124 @@ void BreakStringAutomatic(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId, enu { u8 replacedChar = src[currIndex + 1]; src[currIndex + 1] = EOS; - BreakSubStringAutomatic(currSrc, maxWidth, screenLines, fontId, toggleScrollPrompt); + BreakSubStringNaive(currSrc, maxWidth, screenLines, fontId, toggleScrollPrompt); src[currIndex + 1] = replacedChar; currSrc = &src[currIndex + 1]; } currIndex++; } - BreakSubStringAutomatic(currSrc, maxWidth, screenLines, fontId, toggleScrollPrompt); + BreakSubStringNaive(currSrc, maxWidth, screenLines, fontId, toggleScrollPrompt); +} + +#define SCROLL_PROMPT_WIDTH 8 +void BreakSubStringNaive(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId, enum ToggleScrollPrompt toggleScrollPrompt) +{ + // If the string already has line breaks, don't interfere with them + if (StringHasManualBreaks(src)) + return; + // Sanity check + if (src[0] == EOS) + return; + u32 numChars = 1; + u32 numWords = 1; + u32 currWordIndex = 0; + u32 currWordLength = 1; + bool32 isPrevCharSplitting = FALSE; + bool32 isCurrCharSplitting; + // Get numbers of chars in string and count words + while (src[numChars] != EOS) + { + isCurrCharSplitting = IsWordSplittingChar(src, numChars); + if (isCurrCharSplitting && !isPrevCharSplitting) + numWords++; + isPrevCharSplitting = isCurrCharSplitting; + numChars++; + } + // Allocate enough space for word data + struct StringWord *allWords = Alloc(numWords*sizeof(struct StringWord)); + + allWords[currWordIndex].startIndex = 0; + allWords[currWordIndex].width = 0; + isPrevCharSplitting = FALSE; + // Fill in word begin index and lengths + for (u32 i = 1; i < numChars; i++) + { + isCurrCharSplitting = IsWordSplittingChar(src, i); + if (isCurrCharSplitting && !isPrevCharSplitting) + { + allWords[currWordIndex].length = currWordLength; + currWordIndex++; + currWordLength = 0; + } + else if (!isCurrCharSplitting && isPrevCharSplitting) + { + allWords[currWordIndex].startIndex = i; + allWords[currWordIndex].width = 0; + currWordLength++; + } + else + { + currWordLength++; + } + isPrevCharSplitting = isCurrCharSplitting; + } + allWords[currWordIndex].length = currWordLength; + + // Fill in individual word widths + for (u32 i = 0; i < numWords; i++) + { + for (u32 j = 0; j < allWords[i].length; j++) + allWords[i].width += GetGlyphWidth(src[allWords[i].startIndex + j], FALSE, fontId); + } + + // Step 1: Does it all fit one one line? Then no break + // Step 2: Try to split across minimum number of lines + u32 spaceWidth = GetGlyphWidth(CHAR_SPACE, FALSE, fontId); + u32 totalWidth = allWords[0].width; + // Calculate total widths without any line breaks + for (u32 i = 1; i < numWords; i++) + totalWidth += allWords[i].width + spaceWidth; + + // If it doesn't fit on 1 line, do line breaks + if (totalWidth > maxWidth) + { + u32 currWidth = 0; + u32 numBreaks = 0; + u32 currWords = 1; + for (u32 wordIndex = 0; wordIndex < numWords; wordIndex++) + { + currWidth += allWords[wordIndex].width; + if (numBreaks == screenLines - 1) + { + if (SCROLL_PROMPT_WIDTH + currWidth + (currWords - 1) * spaceWidth > maxWidth) + { + src[allWords[wordIndex].startIndex - 1] = CHAR_PROMPT_SCROLL; + currWidth = allWords[wordIndex].length; + currWords = 1; + } + else + { + currWords++; + } + } + else + { + if (currWidth + (currWords - 1) * spaceWidth > maxWidth) + { + src[allWords[wordIndex].startIndex - 1] = CHAR_NEWLINE; + currWidth = allWords[wordIndex].width; + currWords = 1; + numBreaks++; + } + else + { + currWords++; + } + } + } + } + + Free(allWords); } void BreakSubStringAutomatic(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId, enum ToggleScrollPrompt toggleScrollPrompt) @@ -109,12 +239,15 @@ void BreakSubStringAutomatic(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId, // Step 1: Does it all fit one one line? Then no break // Step 2: Try to split across minimum number of lines - u32 spaceWidth = GetGlyphWidth(0, FALSE, fontId); + u32 spaceWidth = GetGlyphWidth(CHAR_SPACE, FALSE, fontId); u32 totalWidth = allWords[0].width; // Calculate total widths without any line breaks for (u32 i = 1; i < numWords; i++) totalWidth += allWords[i].width + spaceWidth; + if (toggleScrollPrompt == SHOW_SCROLL_PROMPT) + totalWidth += SCROLL_PROMPT_WIDTH; + // If it doesn't fit on 1 line, do fancy line break calculation // NOTE: Currently the line break calculation isn't fancy if (totalWidth > maxWidth) @@ -125,6 +258,8 @@ void BreakSubStringAutomatic(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId, bool32 shouldTryAgain; for (currWordIndex = 0; currWordIndex < numWords; currWordIndex++) { + if (toggleScrollPrompt == SHOW_SCROLL_PROMPT && currWordIndex + 1 == numWords) + currLineWidth += SCROLL_PROMPT_WIDTH; if (currLineWidth + allWords[currWordIndex].length > maxWidth) { totalLines++; @@ -135,6 +270,10 @@ void BreakSubStringAutomatic(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId, currLineWidth += allWords[currWordIndex].width + spaceWidth; } } + + if (currLineWidth > maxWidth) + totalLines++; + // LINE LAYOUT STARTS HERE struct StringLine *stringLines; do @@ -293,3 +432,4 @@ bool32 StringHasManualBreaks(u8 *src) } return FALSE; } +#undef SCROLL_PROMPT_WIDTH diff --git a/src/link.c b/src/link.c index fe633c58d7cf..30caf34d3b03 100644 --- a/src/link.c +++ b/src/link.c @@ -156,8 +156,8 @@ static void StopTimer(void); static void SendRecvDone(void); static const u16 sWirelessLinkDisplayPal[] = INCBIN_U16("graphics/link/wireless_display.gbapal"); -static const u32 sWirelessLinkDisplayGfx[] = INCBIN_U32("graphics/link/wireless_display.4bpp.lz"); -static const u32 sWirelessLinkDisplayTilemap[] = INCBIN_U32("graphics/link/wireless_display.bin.lz"); +static const u32 sWirelessLinkDisplayGfx[] = INCBIN_U32("graphics/link/wireless_display.4bpp.smol"); +static const u32 sWirelessLinkDisplayTilemap[] = INCBIN_U32("graphics/link/wireless_display.bin.smolTM"); static const u16 sLinkTestDigitsPal[] = INCBIN_U16("graphics/link/test_digits.gbapal"); static const u16 sLinkTestDigitsGfx[] = INCBIN_U16("graphics/link/test_digits.4bpp"); static const u8 sUnusedTransparentWhite[] = _("{HIGHLIGHT TRANSPARENT}{COLOR WHITE}"); diff --git a/src/link_rfu_3.c b/src/link_rfu_3.c index 1f3f895c21e1..cecd818d15dd 100644 --- a/src/link_rfu_3.c +++ b/src/link_rfu_3.c @@ -35,7 +35,7 @@ EWRAM_DATA u8 gWirelessStatusIndicatorSpriteId = 0; static u8 sSequenceArrayValOffset; static const u16 sWirelessLinkIconPalette[] = INCBIN_U16("graphics/link/wireless_icon.gbapal"); -static const u32 sWirelessLinkIconPic[] = INCBIN_U32("graphics/link/wireless_icon.4bpp.lz"); +static const u32 sWirelessLinkIconPic[] = INCBIN_U32("graphics/link/wireless_icon.4bpp.smol"); // Most of the below two tables won't make sense with ASCII encoding. static const u8 sWireless_ASCIItoRSETable[256] = { diff --git a/src/list_menu.c b/src/list_menu.c index 7f78c2da404f..1a129e9f20e7 100644 --- a/src/list_menu.c +++ b/src/list_menu.c @@ -13,6 +13,10 @@ #include "sound.h" #include "constants/songs.h" +// GF cast Task data to ListMenu in many places, which effectively puts +// an upper bound on sizeof(struct ListMenu). +STATIC_ASSERT(sizeof(struct ListMenu) <= sizeof(((struct Task *)NULL)->data), ListMenuTooLargeForTaskData); + // Cursors after this point are created using a sprite with their own task. // This allows them to have idle animations. Cursors prior to this are simply printed text. #define CURSOR_OBJECT_START CURSOR_RED_OUTLINE @@ -282,9 +286,9 @@ static const struct SpriteTemplate sSpriteTemplate_RedArrowCursor = }; static const u16 sRedInterface_Pal[] = INCBIN_U16("graphics/interface/red.gbapal"); // Shared by all of the below gfx -static const u32 sScrollIndicator_Gfx[] = INCBIN_U32("graphics/interface/scroll_indicator.4bpp.lz"); -static const u32 sOutlineCursor_Gfx[] = INCBIN_U32("graphics/interface/outline_cursor.4bpp.lz"); -static const u32 sArrowCursor_Gfx[] = INCBIN_U32("graphics/interface/arrow_cursor.4bpp.lz"); +static const u32 sScrollIndicator_Gfx[] = INCBIN_U32("graphics/interface/scroll_indicator.4bpp.smol"); +static const u32 sOutlineCursor_Gfx[] = INCBIN_U32("graphics/interface/outline_cursor.4bpp.smol"); +static const u32 sArrowCursor_Gfx[] = INCBIN_U32("graphics/interface/arrow_cursor.4bpp.smol"); // code static void ListMenuDummyTask(u8 taskId) @@ -392,7 +396,10 @@ s32 ListMenu_ProcessInput(u8 listTaskId) if (JOY_NEW(A_BUTTON)) { - return list->template.items[list->scrollOffset + list->selectedRow].id; + if (list->template.isDynamic) + return list->scrollOffset + list->selectedRow; + else + return list->template.items[list->scrollOffset + list->selectedRow].id; } else if (JOY_NEW(B_BUTTON)) { @@ -612,7 +619,6 @@ static void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOff s32 i; u8 x, y; u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding; - for (i = 0; i < count; i++) { if (list->template.items[startIndex].id != LIST_HEADER) @@ -621,10 +627,16 @@ static void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOff x = list->template.header_X; y = (yOffset + i) * yMultiplier + list->template.upText_Y; - if (list->template.itemPrintFunc != NULL) - list->template.itemPrintFunc(list->template.windowId, list->template.items[startIndex].id, y); - - ListMenuPrint(list, list->template.items[startIndex].name, x, y); + if (list->template.isDynamic) + { + list->template.itemPrintFunc(list->template.windowId, startIndex, y); + } + else + { + if (list->template.itemPrintFunc != NULL) + list->template.itemPrintFunc(list->template.windowId, list->template.items[startIndex].id, y); + ListMenuPrint(list, list->template.items[startIndex].name, x, y); + } startIndex++; } } @@ -711,7 +723,7 @@ static u8 ListMenuUpdateSelectedRowIndexAndScrollOffset(struct ListMenu *list, b while (selectedRow != 0) { selectedRow--; - if (list->template.items[scrollOffset + selectedRow].id != LIST_HEADER) + if (list->template.isDynamic || list->template.items[scrollOffset + selectedRow].id != LIST_HEADER) { list->selectedRow = selectedRow; return 1; @@ -725,7 +737,7 @@ static u8 ListMenuUpdateSelectedRowIndexAndScrollOffset(struct ListMenu *list, b while (selectedRow > newRow) { selectedRow--; - if (list->template.items[scrollOffset + selectedRow].id != LIST_HEADER) + if (list->template.isDynamic || list->template.items[scrollOffset + selectedRow].id != LIST_HEADER) { list->selectedRow = selectedRow; return 1; @@ -747,7 +759,7 @@ static u8 ListMenuUpdateSelectedRowIndexAndScrollOffset(struct ListMenu *list, b while (selectedRow < list->template.maxShowed - 1) { selectedRow++; - if (list->template.items[scrollOffset + selectedRow].id != LIST_HEADER) + if (list->template.isDynamic || list->template.items[scrollOffset + selectedRow].id != LIST_HEADER) { list->selectedRow = selectedRow; return 1; @@ -761,7 +773,7 @@ static u8 ListMenuUpdateSelectedRowIndexAndScrollOffset(struct ListMenu *list, b while (selectedRow < newRow) { selectedRow++; - if (list->template.items[scrollOffset + selectedRow].id != LIST_HEADER) + if (list->template.isDynamic || list->template.items[scrollOffset + selectedRow].id != LIST_HEADER) { list->selectedRow = selectedRow; return 1; @@ -825,16 +837,26 @@ bool8 ListMenuChangeSelectionFull(struct ListMenu *list, bool32 updateCursor, bo oldSelectedRow = list->selectedRow; cursorCount = 0; selectionChange = 0; + for (i = 0; i < count; i++) { - do + if (list->template.isDynamic) { u8 ret = ListMenuUpdateSelectedRowIndexAndScrollOffset(list, movingDown); selectionChange |= ret; - if (ret != 2) - break; cursorCount++; - } while (list->template.items[list->scrollOffset + list->selectedRow].id == LIST_HEADER); + } + else + { + do + { + u8 ret = ListMenuUpdateSelectedRowIndexAndScrollOffset(list, movingDown); + selectionChange |= ret; + if (ret != 2) + break; + cursorCount++; + } while (list->template.items[list->scrollOffset + list->selectedRow].id == LIST_HEADER); + } } if (updateCursor) diff --git a/src/load_save.c b/src/load_save.c index ed9a9852e794..ea0fcbdb8d05 100644 --- a/src/load_save.c +++ b/src/load_save.c @@ -25,11 +25,7 @@ static void ApplyNewEncryptionKeyToAllEncryptedData(u32 encryptionKey); struct LoadedSaveData { - /*0x0000*/ struct ItemSlot items[BAG_ITEMS_COUNT]; - /*0x0078*/ struct ItemSlot keyItems[BAG_KEYITEMS_COUNT]; - /*0x00F0*/ struct ItemSlot pokeBalls[BAG_POKEBALLS_COUNT]; - /*0x0130*/ struct ItemSlot TMsHMs[BAG_TMHM_COUNT]; - /*0x0230*/ struct ItemSlot berries[BAG_BERRIES_COUNT]; + /*0x0000*/ struct Bag bag; /*0x02E8*/ struct Mail mail[MAIL_COUNT]; }; @@ -173,23 +169,22 @@ void ClearContinueGameWarpStatus2(void) void SavePlayerParty(void) { int i; - - gSaveBlock1Ptr->playerPartyCount = gPlayerPartyCount; + *GetSavedPlayerPartyCount() = gPlayerPartyCount; for (i = 0; i < PARTY_SIZE; i++) - gSaveBlock1Ptr->playerParty[i] = gPlayerParty[i]; + SavePlayerPartyMon(i, &gPlayerParty[i]); } void LoadPlayerParty(void) { int i; - gPlayerPartyCount = gSaveBlock1Ptr->playerPartyCount; + gPlayerPartyCount = *GetSavedPlayerPartyCount(); for (i = 0; i < PARTY_SIZE; i++) { u32 data; - gPlayerParty[i] = gSaveBlock1Ptr->playerParty[i]; + gPlayerParty[i] = *GetSavedPlayerPartyMon(i); // TODO: Turn this into a save migration once those are available. // At which point we can remove hp and status from Pokemon entirely. @@ -260,25 +255,8 @@ void LoadPlayerBag(void) { int i; - // load player items. - for (i = 0; i < BAG_ITEMS_COUNT; i++) - gLoadedSaveData.items[i] = gSaveBlock1Ptr->bagPocket_Items[i]; - - // load player key items. - for (i = 0; i < BAG_KEYITEMS_COUNT; i++) - gLoadedSaveData.keyItems[i] = gSaveBlock1Ptr->bagPocket_KeyItems[i]; - - // load player pokeballs. - for (i = 0; i < BAG_POKEBALLS_COUNT; i++) - gLoadedSaveData.pokeBalls[i] = gSaveBlock1Ptr->bagPocket_PokeBalls[i]; - - // load player TMs and HMs. - for (i = 0; i < BAG_TMHM_COUNT; i++) - gLoadedSaveData.TMsHMs[i] = gSaveBlock1Ptr->bagPocket_TMHM[i]; - - // load player berries. - for (i = 0; i < BAG_BERRIES_COUNT; i++) - gLoadedSaveData.berries[i] = gSaveBlock1Ptr->bagPocket_Berries[i]; + // load player bag. + memcpy(&gLoadedSaveData.bag, &gSaveBlock1Ptr->bag, sizeof(struct Bag)); // load mail. for (i = 0; i < MAIL_COUNT; i++) @@ -292,25 +270,8 @@ void SavePlayerBag(void) int i; u32 encryptionKeyBackup; - // save player items. - for (i = 0; i < BAG_ITEMS_COUNT; i++) - gSaveBlock1Ptr->bagPocket_Items[i] = gLoadedSaveData.items[i]; - - // save player key items. - for (i = 0; i < BAG_KEYITEMS_COUNT; i++) - gSaveBlock1Ptr->bagPocket_KeyItems[i] = gLoadedSaveData.keyItems[i]; - - // save player pokeballs. - for (i = 0; i < BAG_POKEBALLS_COUNT; i++) - gSaveBlock1Ptr->bagPocket_PokeBalls[i] = gLoadedSaveData.pokeBalls[i]; - - // save player TMs and HMs. - for (i = 0; i < BAG_TMHM_COUNT; i++) - gSaveBlock1Ptr->bagPocket_TMHM[i] = gLoadedSaveData.TMsHMs[i]; - - // save player berries. - for (i = 0; i < BAG_BERRIES_COUNT; i++) - gSaveBlock1Ptr->bagPocket_Berries[i] = gLoadedSaveData.berries[i]; + // save player bag. + memcpy(&gSaveBlock1Ptr->bag, &gLoadedSaveData.bag, sizeof(struct Bag)); // save mail. for (i = 0; i < MAIL_COUNT; i++) @@ -337,7 +298,7 @@ void ApplyNewEncryptionKeyToWord(u32 *word, u32 newKey) static void ApplyNewEncryptionKeyToAllEncryptedData(u32 encryptionKey) { ApplyNewEncryptionKeyToGameStats(encryptionKey); - ApplyNewEncryptionKeyToBagItems_(encryptionKey); + ApplyNewEncryptionKeyToBagItems(encryptionKey); ApplyNewEncryptionKeyToBerryPowder(encryptionKey); ApplyNewEncryptionKeyToWord(&gSaveBlock1Ptr->money, encryptionKey); ApplyNewEncryptionKeyToHword(&gSaveBlock1Ptr->coins, encryptionKey); diff --git a/src/m4a_tables.c b/src/m4a_tables.c index 6fb3b273a356..5bc1075494d0 100644 --- a/src/m4a_tables.c +++ b/src/m4a_tables.c @@ -261,7 +261,7 @@ const struct PokemonCrySong gPokemonCrySongTemplate = .blockCount = 0, .priority = 255, .reverb = 0, - .tone = (struct ToneData *)&voicegroup000, + .tone = (struct ToneData *)&voicegroup_dummy, .part = {NULL, NULL}, .gap = 0, .part0 = TUNE, diff --git a/src/mail.c b/src/mail.c index 34d1520ef409..67accf303147 100644 --- a/src/mail.c +++ b/src/mail.c @@ -1,7 +1,6 @@ #include "global.h" #include "mail.h" #include "constants/items.h" -#include "main.h" #include "overworld.h" #include "task.h" #include "scanline_effect.h" @@ -443,7 +442,7 @@ static const struct MailLayout sMailLayouts_Tall[] = { }, }; -void ReadMail(struct Mail *mail, void (*exitCallback)(void), bool8 hasText) +void ReadMail(struct Mail *mail, MainCallback exitCallback, bool8 hasText) { u16 buffer[2]; u16 species; diff --git a/src/main.c b/src/main.c index 3fd080c75b66..7abc47265ef7 100644 --- a/src/main.c +++ b/src/main.c @@ -116,7 +116,7 @@ void AgbMain(void) gSoftResetDisabled = FALSE; if (gFlashMemoryPresent != TRUE) - SetMainCallback2((SAVE_TYPE_ERROR_SCREEN) ? CB2_FlashNotDetectedScreen : NULL); + SetMainCallback2(CB2_FlashNotDetectedScreen); gLinkTransferringData = FALSE; diff --git a/src/main_menu.c b/src/main_menu.c index 5dd421043d32..1beae8c4978d 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -252,8 +252,8 @@ static const u16 sBirchSpeechBgPals[][16] = { INCBIN_U16("graphics/birch_speech/bg1.gbapal") }; -static const u32 sBirchSpeechShadowGfx[] = INCBIN_U32("graphics/birch_speech/shadow.4bpp.lz"); -static const u32 sBirchSpeechBgMap[] = INCBIN_U32("graphics/birch_speech/map.bin.lz"); +static const u32 sBirchSpeechShadowGfx[] = INCBIN_U32("graphics/birch_speech/shadow.4bpp.smol"); +static const u32 sBirchSpeechBgMap[] = INCBIN_U32("graphics/birch_speech/map.bin.smolTM"); static const u16 sBirchSpeechBgGradientPal[] = INCBIN_U16("graphics/birch_speech/bg2.gbapal"); static const u8 gText_SaveFileCorrupted[] = _("The save file is corrupted. The\nprevious save file will be loaded."); @@ -1295,8 +1295,8 @@ static void Task_NewGameBirchSpeech_Init(u8 taskId) SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); - LZ77UnCompVram(sBirchSpeechShadowGfx, (void *)VRAM); - LZ77UnCompVram(sBirchSpeechBgMap, (void *)(BG_SCREEN_ADDR(7))); + DecompressDataWithHeaderVram(sBirchSpeechShadowGfx, (void *)VRAM); + DecompressDataWithHeaderVram(sBirchSpeechBgMap, (void *)(BG_SCREEN_ADDR(7))); LoadPalette(sBirchSpeechBgPals, BG_PLTT_ID(0), 2 * PLTT_SIZE_4BPP); LoadPalette(&sBirchSpeechBgGradientPal[8], BG_PLTT_ID(0) + 1, PLTT_SIZEOF(8)); ScanlineEffect_Stop(); @@ -1830,8 +1830,8 @@ static void CB2_NewGameBirchSpeech_ReturnFromNamingScreen(void) DmaFill32(3, 0, OAM, OAM_SIZE); DmaFill16(3, 0, PLTT, PLTT_SIZE); ResetPaletteFade(); - LZ77UnCompVram(sBirchSpeechShadowGfx, (u8 *)VRAM); - LZ77UnCompVram(sBirchSpeechBgMap, (u8 *)(BG_SCREEN_ADDR(7))); + DecompressDataWithHeaderVram(sBirchSpeechShadowGfx, (u8 *)VRAM); + DecompressDataWithHeaderVram(sBirchSpeechBgMap, (u8 *)(BG_SCREEN_ADDR(7))); LoadPalette(sBirchSpeechBgPals, BG_PLTT_ID(0), 2 * PLTT_SIZE_4BPP); LoadPalette(&sBirchSpeechBgGradientPal[1], BG_PLTT_ID(0) + 1, PLTT_SIZEOF(8)); ResetTasks(); diff --git a/src/malloc.c b/src/malloc.c index 95d41fbb97e6..f4f079f30ad3 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -101,6 +101,11 @@ void *AllocInternal(void *heapStart, u32 size, const char *location) while (block != head); Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":L%s:%d, %s: OOM allocating %d bytes", gTestRunnerState.test->filename, SourceLine(0), location, size); #endif + if (location) + { + DebugPrintfLevel(MGBA_LOG_ERROR, "%s: out of memory trying to allocate %d bytes", location, size); + } + AGB_ASSERT(FALSE); return NULL; } @@ -114,6 +119,8 @@ void FreeInternal(void *heapStart, void *pointer) { struct MemBlock *head = (struct MemBlock *)heapStart; struct MemBlock *block = (struct MemBlock *)((u8 *)pointer - sizeof(struct MemBlock)); + AGB_ASSERT(block->magic == MALLOC_SYSTEM_ID); + AGB_ASSERT(block->allocated == TRUE); block->allocated = FALSE; // If the freed block isn't the last one, merge with the next block @@ -136,6 +143,8 @@ void FreeInternal(void *heapStart, void *pointer) { if (!block->prev->allocated) { + AGB_ASSERT(block->prev->magic == MALLOC_SYSTEM_ID); + block->prev->next = block->next; if (block->next != head) diff --git a/src/map_name_popup.c b/src/map_name_popup.c index c14203fc5661..0b3c9fbb0286 100644 --- a/src/map_name_popup.c +++ b/src/map_name_popup.c @@ -526,7 +526,7 @@ static void ShowMapNamePopUpWindow(void) const u8 *mapDisplayHeaderSource; u8 mapNamePopUpWindowId, secondaryPopUpWindowId; - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) { if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP) { @@ -615,7 +615,7 @@ static void LoadMapNamePopUpWindowBg(void) { u8 popUpThemeId; u8 popupWindowId = GetMapNamePopUpWindowId(); - u16 regionMapSectionId = gMapHeader.regionMapSectionId; + mapsec_u16_t regionMapSectionId = gMapHeader.regionMapSectionId; u8 secondaryPopUpWindowId; if (OW_POPUP_GENERATION == GEN_5) diff --git a/src/match_call.c b/src/match_call.c index 7b76d63813d1..e8782cf60e2a 100644 --- a/src/match_call.c +++ b/src/match_call.c @@ -27,6 +27,7 @@ #include "task.h" #include "wild_encounter.h" #include "window.h" +#include "field_name_box.h" #include "constants/abilities.h" #include "constants/battle_frontier.h" #include "constants/event_objects.h" @@ -135,7 +136,7 @@ static u32 GetCurrentTotalMinutes(struct Time *); static u32 GetNumRegisteredTrainers(void); static u32 GetActiveMatchCallTrainerId(u32); static int GetTrainerMatchCallId(int); -static u16 GetRematchTrainerLocation(int); +static mapsec_u16_t GetRematchTrainerLocation(int); static bool32 TrainerIsEligibleForRematch(int); static void StartMatchCall(void); static void ExecuteMatchCall(u8); @@ -1198,7 +1199,7 @@ static void StartMatchCall(void) static const u16 sMatchCallWindow_Pal[] = INCBIN_U16("graphics/pokenav/match_call/window.gbapal"); static const u8 sMatchCallWindow_Gfx[] = INCBIN_U8("graphics/pokenav/match_call/window.4bpp"); static const u16 sPokenavIcon_Pal[] = INCBIN_U16("graphics/pokenav/match_call/nav_icon.gbapal"); -static const u32 sPokenavIcon_Gfx[] = INCBIN_U32("graphics/pokenav/match_call/nav_icon.4bpp.lz"); +static const u32 sPokenavIcon_Gfx[] = INCBIN_U32("graphics/pokenav/match_call/nav_icon.4bpp.smol"); static const u8 sText_PokenavCallEllipsis[] = _("………………\p"); @@ -1321,9 +1322,11 @@ static bool32 MatchCall_PrintIntro(u8 taskId) { FillWindowPixelBuffer(tWindowId, PIXEL_FILL(8)); - // Ready the message + // Ready the message (and the speaker's name if possible) if (!sMatchCallState.triggeredFromScript) SelectMatchCallMessage(sMatchCallState.trainerId, gStringVar4); + + TrySpawnAndShowNamebox(gSpeakerName, NAME_BOX_BASE_TILE_NUM); InitMatchCallTextPrinter(tWindowId, gStringVar4); return TRUE; } @@ -1348,9 +1351,9 @@ static bool32 MatchCall_PrintMessage(u8 taskId) static bool32 MatchCall_SlideWindowOut(u8 taskId) { s16 *data = gTasks[taskId].data; - if (ChangeBgY(0, 0x600, BG_COORD_SUB) <= -0x2000) + if (ChangeBgY(0, 0x600, BG_COORD_SUB) <= -0x4000) { - FillBgTilemapBufferRect_Palette0(0, 0, 0, 14, 30, 6); + FillBgTilemapBufferRect_Palette0(0, 0, 0, 12, 30, 8); DestroyTask(tIconTaskId); RemoveWindow(tWindowId); CopyBgTilemapBufferToVram(0); @@ -1404,6 +1407,31 @@ static void DrawMatchCallTextBoxBorder_Internal(u32 windowId, u32 tileOffset, u3 FillBgTilemapBufferRect_Palette0(bg, ((paletteId << 12) & 0xF000) | (tileNum + 7), x + width, y + height, 1, 1); } +static u8 GetMatchCallWindowId(void) +{ + if (!IsMatchCallTaskActive()) + return WINDOW_NONE; + + u32 taskId = FindTaskIdByFunc(ExecuteMatchCall); + return gTasks[taskId].tWindowId; +} + +// redraw only the top-half +void RedrawMatchCallTextBoxBorder(void) +{ + u32 windowId = GetMatchCallWindowId(); + u32 bg = GetWindowAttribute(windowId, WINDOW_BG); + u32 x = GetWindowAttribute(windowId, WINDOW_TILEMAP_LEFT); + u32 y = GetWindowAttribute(windowId, WINDOW_TILEMAP_TOP); + u32 width = GetWindowAttribute(windowId, WINDOW_WIDTH); + u32 tileNum = TILE_MC_WINDOW + GetBgAttribute(bg, BG_ATTR_BASETILE); + u32 paletteId = 14; + + FillBgTilemapBufferRect_Palette0(bg, ((paletteId << 12) & 0xF000) | (tileNum + 0), x - 1, y - 1, 1, 1); + FillBgTilemapBufferRect_Palette0(bg, ((paletteId << 12) & 0xF000) | (tileNum + 1), x, y - 1, width, 1); + FillBgTilemapBufferRect_Palette0(bg, ((paletteId << 12) & 0xF000) | (tileNum + 2), x + width, y - 1, 1, 1); +} + static void InitMatchCallTextPrinter(int windowId, const u8 *str) { struct TextPrinterTemplate printerTemplate; @@ -1468,7 +1496,7 @@ static bool32 TrainerIsEligibleForRematch(int matchCallId) #endif //FREE_MATCH_CALL } -static u16 GetRematchTrainerLocation(int matchCallId) +static mapsec_u16_t GetRematchTrainerLocation(int matchCallId) { const struct MapHeader *mapHeader = Overworld_GetMapHeaderByGroupAndId(gRematchTable[matchCallId].mapGroup, gRematchTable[matchCallId].mapNum); return mapHeader->regionMapSectionId; diff --git a/src/math_util.c b/src/math_util.c index f77c82608a37..a29b03a15bf2 100644 --- a/src/math_util.c +++ b/src/math_util.c @@ -84,3 +84,12 @@ s32 MathUtil_Inv32(s32 y) x = 0x10000; return x / y; } + +u32 MathUtil_Exponent(u32 x, u32 y) +{ + u32 result = 1; + for (u32 index = 0; index < y; index++) + result *= x; + + return result; +} diff --git a/src/menu.c b/src/menu.c index a6d6a3892643..4e7d5920a319 100644 --- a/src/menu.c +++ b/src/menu.c @@ -1,13 +1,16 @@ #include "global.h" -#include "malloc.h" #include "bg.h" #include "blit.h" +#include "decompress.h" #include "dma3.h" #include "event_data.h" +#include "field_name_box.h" #include "field_weather.h" #include "graphics.h" #include "main.h" +#include "malloc.h" #include "map_name_popup.h" +#include "match_call.h" #include "menu.h" #include "menu_helpers.h" #include "palette.h" @@ -21,7 +24,6 @@ #include "task.h" #include "text_window.h" #include "window.h" -#include "config/overworld.h" #include "constants/songs.h" struct MenuInfoIcon @@ -74,13 +76,6 @@ static EWRAM_DATA void *sTempTileDataBuffer[0x20] = {NULL}; const u16 gStandardMenuPalette[] = INCBIN_U16("graphics/interface/std_menu.gbapal"); -static const u8 sTextSpeedFrameDelays[] = -{ - [OPTIONS_TEXT_SPEED_SLOW] = 8, - [OPTIONS_TEXT_SPEED_MID] = 4, - [OPTIONS_TEXT_SPEED_FAST] = 1 -}; - static const struct WindowTemplate sStandardTextBox_WindowTemplates[] = { { @@ -144,6 +139,7 @@ static const struct MenuInfoIcon sMenuInfoIcons[] = void InitStandardTextBoxWindows(void) { + ResetNameboxData(); InitWindows(sStandardTextBox_WindowTemplates); sStartMenuWindowId = WINDOW_NONE; sMapNamePopupWindowId = WINDOW_NONE; @@ -193,13 +189,6 @@ u16 AddTextPrinterParameterized2(u8 windowId, u8 fontId, const u8 *str, u8 speed } void AddTextPrinterForMessage(bool8 allowSkippingDelayWithButtonPress) -{ - void (*callback)(struct TextPrinterTemplate *, u16) = NULL; - gTextFlags.canABSpeedUpPrint = allowSkippingDelayWithButtonPress; - AddTextPrinterParameterized2(0, FONT_NORMAL, gStringVar4, GetPlayerTextSpeedDelay(), callback, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); -} - -void AddTextPrinterForMessage_2(bool8 allowSkippingDelayWithButtonPress) { gTextFlags.canABSpeedUpPrint = allowSkippingDelayWithButtonPress; AddTextPrinterParameterized2(0, FONT_NORMAL, gStringVar4, GetPlayerTextSpeedDelay(), NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); @@ -340,6 +329,53 @@ void DrawDialogueFrame(u8 windowId, bool8 copyToVram) CopyWindowToVram(windowId, COPYWIN_FULL); } +static void WindowFunc_RedrawDialogueFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) +{ + FillBgTilemapBufferRect(bg, + DLG_WINDOW_BASE_TILE_NUM + 1, + tilemapLeft - 2, + tilemapTop - 1, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + DLG_WINDOW_BASE_TILE_NUM + 3, + tilemapLeft - 1, + tilemapTop - 1, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + DLG_WINDOW_BASE_TILE_NUM + 4, + tilemapLeft, + tilemapTop - 1, + width - 1, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + DLG_WINDOW_BASE_TILE_NUM + 5, + tilemapLeft + width - 1, + tilemapTop - 1, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + DLG_WINDOW_BASE_TILE_NUM + 6, + tilemapLeft + width, + tilemapTop - 1, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); +} + +void RedrawDialogueFrame(void) +{ + if (IsMatchCallTaskActive()) + RedrawMatchCallTextBoxBorder(); + else + CallWindowFunction(0, WindowFunc_RedrawDialogueFrame); +} + void DrawStdWindowFrame(u8 windowId, bool8 copyToVram) { CallWindowFunction(windowId, WindowFunc_DrawStandardFrame); @@ -369,8 +405,6 @@ void ClearStdWindowAndFrame(u8 windowId, bool8 copyToVram) static void WindowFunc_DrawStandardFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) { - int i; - FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 0, tilemapLeft - 1, @@ -392,25 +426,20 @@ static void WindowFunc_DrawStandardFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u 1, 1, STD_WINDOW_PALETTE_NUM); - - for (i = tilemapTop; i < tilemapTop + height; i++) - { - FillBgTilemapBufferRect(bg, - STD_WINDOW_BASE_TILE_NUM + 3, - tilemapLeft - 1, - i, - 1, - 1, - STD_WINDOW_PALETTE_NUM); - FillBgTilemapBufferRect(bg, - STD_WINDOW_BASE_TILE_NUM + 5, - tilemapLeft + width, - i, - 1, - 1, - STD_WINDOW_PALETTE_NUM); - } - + FillBgTilemapBufferRect(bg, + STD_WINDOW_BASE_TILE_NUM + 3, + tilemapLeft - 1, + tilemapTop, + 1, + height, + STD_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + STD_WINDOW_BASE_TILE_NUM + 5, + tilemapLeft + width, + tilemapTop, + 1, + height, + STD_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 6, tilemapLeft - 1, @@ -589,22 +618,6 @@ void DisplayYesNoMenuWithDefault(u8 initialCursorPos) CreateYesNoMenu(&sYesNo_WindowTemplates, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, initialCursorPos); } -u32 GetPlayerTextSpeed(void) -{ - if (gTextFlags.forceMidTextSpeed) - return OPTIONS_TEXT_SPEED_MID; - return gSaveBlock2Ptr->optionsTextSpeed; -} - -u8 GetPlayerTextSpeedDelay(void) -{ - u32 speed; - if (gSaveBlock2Ptr->optionsTextSpeed > OPTIONS_TEXT_SPEED_FAST) - gSaveBlock2Ptr->optionsTextSpeed = OPTIONS_TEXT_SPEED_MID; - speed = GetPlayerTextSpeed(); - return sTextSpeedFrameDelays[speed]; -} - u8 AddStartMenuWindow(u8 numActions) { if (sStartMenuWindowId == WINDOW_NONE) @@ -1943,23 +1956,15 @@ void task_free_buf_after_copying_tile_data_to_vram(u8 taskId) void *malloc_and_decompress(const void *src, u32 *size) { - u32 sizeLocal; // If size is passed as NULL, because we don't care about knowing the size void *ptr; + u32 localSize = GetDecompressedDataSize(src); - if (size == NULL) - size = &sizeLocal; - - u8 *sizeAsBytes = (u8 *)size; - u8 *srcAsBytes = (u8 *)src; - - sizeAsBytes[0] = srcAsBytes[1]; - sizeAsBytes[1] = srcAsBytes[2]; - sizeAsBytes[2] = srcAsBytes[3]; - sizeAsBytes[3] = 0; + if (size != NULL) + *size = localSize; - ptr = Alloc(*size); + ptr = Alloc(localSize); if (ptr) - LZ77UnCompWram(src, ptr); + DecompressDataWithHeaderWram(src, ptr); return ptr; } diff --git a/src/menu_helpers.c b/src/menu_helpers.c index e1483c957944..3b97d1f4042b 100644 --- a/src/menu_helpers.c +++ b/src/menu_helpers.c @@ -322,13 +322,12 @@ bool8 MenuHelpers_ShouldWaitForLinkRecv(void) void SetItemListPerPageCount(struct ItemSlot *slots, u8 slotsCount, u8 *pageItems, u8 *totalItems, u8 maxPerPage) { u16 i; - struct ItemSlot *slots_ = slots; // Count the number of non-empty item slots *totalItems = 0; for (i = 0; i < slotsCount; i++) { - if (slots_[i].itemId != ITEM_NONE) + if (slots[i].itemId != ITEM_NONE) (*totalItems)++; } (*totalItems)++; // + 1 for 'Cancel' diff --git a/src/menu_specialized.c b/src/menu_specialized.c index df4233fd141a..33f26a5b902a 100644 --- a/src/menu_specialized.c +++ b/src/menu_specialized.c @@ -1,9 +1,11 @@ #include "global.h" #include "malloc.h" #include "battle_main.h" +#include "contest.h" #include "contest_effect.h" #include "data.h" #include "decompress.h" +#include "event_data.h" #include "gpu_regs.h" #include "graphics.h" #include "menu.h" @@ -836,10 +838,10 @@ static void MoveRelearnerMenuLoadContestMoveDescription(u32 chosenMove) return; } - str = gContestMoveTypeTextPointers[GetMoveContestCategory(chosenMove)]; + str = gContestCategoryInfo[GetMoveContestCategory(chosenMove)].name; AddTextPrinterParameterized(RELEARNERWIN_DESC_CONTEST, FONT_NORMAL, str, 4, 25, TEXT_SKIP_DRAW, NULL); - str = gContestEffectDescriptionPointers[GetMoveContestEffect(chosenMove)]; + str = gContestEffects[GetMoveContestEffect(chosenMove)].description; AddTextPrinterParameterized(RELEARNERWIN_DESC_CONTEST, FONT_NARROW, str, 0, 65, TEXT_SKIP_DRAW, NULL); CopyWindowToVram(RELEARNERWIN_DESC_CONTEST, COPYWIN_GFX); diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index 2d61e9a75af8..115a0d4c7b53 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -133,6 +133,7 @@ static const u8 sTileBitAttributes[NUM_METATILE_BEHAVIORS] = [MB_SIDEWAYS_STAIRS_RIGHT_SIDE_BOTTOM] = TILE_FLAG_UNUSED, [MB_SIDEWAYS_STAIRS_LEFT_SIDE_BOTTOM] = TILE_FLAG_UNUSED, [MB_ROCK_STAIRS] = TILE_FLAG_UNUSED, + [MB_ROCK_CLIMB] = TILE_FLAG_UNUSED, }; bool8 MetatileBehavior_IsATile(u8 metatileBehavior) @@ -330,7 +331,7 @@ bool8 MetatileBehavior_IsSouthArrowWarp(u8 metatileBehavior) bool8 UNUSED Unref_MetatileBehavior_IsArrowWarp(u8 metatileBehavior) { - u8 isArrowWarp = FALSE; + bool32 isArrowWarp = FALSE; if (MetatileBehavior_IsEastArrowWarp(metatileBehavior) || MetatileBehavior_IsWestArrowWarp(metatileBehavior) @@ -1542,3 +1543,11 @@ bool8 MetatileBehavior_IsRockStairs(u8 metatileBehavior) else return FALSE; } + +bool8 MetatileBehavior_IsRockClimbable(u8 metatileBehavior) +{ + if (metatileBehavior == MB_ROCK_CLIMB) + return TRUE; + else + return FALSE; +} diff --git a/src/minigame_countdown.c b/src/minigame_countdown.c index 617922e5aa1d..30d76cb4b4de 100644 --- a/src/minigame_countdown.c +++ b/src/minigame_countdown.c @@ -49,7 +49,7 @@ static void Task_StaticCountdown_Start(u8 taskId); static void Task_StaticCountdown_Run(u8 taskId); static const u16 s321Start_Static_Pal[] = INCBIN_U16("graphics/link/321start_static.gbapal"); -static const u32 s321Start_Static_Gfx[] = INCBIN_U32("graphics/link/321start_static.4bpp.lz"); +static const u32 s321Start_Static_Gfx[] = INCBIN_U32("graphics/link/321start_static.4bpp.smol"); static const struct CompressedSpriteSheet sSpriteSheet_321Start_Static[] = { @@ -374,7 +374,7 @@ static void InitStartGraphic(u8 spriteId1, u8 spriteId2, u8 spriteId3); static void SpriteCB_Start(struct Sprite *sprite); static const u16 s321Start_Pal[] = INCBIN_U16("graphics/link/321start.gbapal"); -static const u32 s321Start_Gfx[] = INCBIN_U32("graphics/link/321start.4bpp.lz"); +static const u32 s321Start_Gfx[] = INCBIN_U32("graphics/link/321start.4bpp.smol"); #define tState data[0] #define tTilesTag data[2] diff --git a/src/mirage_tower.c b/src/mirage_tower.c index e2ed74a21a3a..bf73692a36e6 100644 --- a/src/mirage_tower.c +++ b/src/mirage_tower.c @@ -202,7 +202,7 @@ static const struct OamData sOamData_CeilingCrumbleSmall = static const struct SpriteTemplate sSpriteTemplate_CeilingCrumbleSmall = { .tileTag = TAG_CEILING_CRUMBLE, - .paletteTag = TAG_NONE, + .paletteTag = TAG_CEILING_CRUMBLE, .oam = &sOamData_CeilingCrumbleSmall, .anims = sAnims_CeilingCrumbleSmall, .images = NULL, @@ -241,7 +241,7 @@ static const struct OamData sOamData_CeilingCrumbleLarge = static const struct SpriteTemplate sSpriteTemplate_CeilingCrumbleLarge = { .tileTag = TAG_CEILING_CRUMBLE, - .paletteTag = TAG_NONE, + .paletteTag = TAG_CEILING_CRUMBLE, .oam = &sOamData_CeilingCrumbleLarge, .anims = sAnims_CeilingCrumbleLarge, .images = NULL, @@ -420,6 +420,7 @@ static void IncrementCeilingCrumbleFinishedCount(void) void DoMirageTowerCeilingCrumble(void) { + LoadSpritePaletteWithTag(sMirageTowerCrumbles_Palette, TAG_CEILING_CRUMBLE); LoadSpriteSheets(sCeilingCrumbleSpriteSheets); CreateCeilingCrumbleSprites(); CreateTask(WaitCeilingCrumble, 8); @@ -454,17 +455,12 @@ static void CreateCeilingCrumbleSprites(void) { spriteId = CreateSprite(&sSpriteTemplate_CeilingCrumbleLarge, sCeilingCrumblePositions[i][0] + 120, sCeilingCrumblePositions[i][1], 8); gSprites[spriteId].oam.priority = 0; - // These sprites use color index 11 from the player's sprite palette. This probably wasn't intentional. - // The palettes for Brendan and May have different shades of green at this index, so the color of these sprites changes - // depending on the player's gender (and neither shade of green particularly fits a crumbling yellow/brown ceiling). - gSprites[spriteId].oam.paletteNum = PALSLOT_PLAYER; gSprites[spriteId].sIndex = i; } for (i = 0; i < ARRAY_COUNT(sCeilingCrumblePositions); i++) { spriteId = CreateSprite(&sSpriteTemplate_CeilingCrumbleSmall, sCeilingCrumblePositions[i][0] + 115, sCeilingCrumblePositions[i][1] - 3, 8); gSprites[spriteId].oam.priority = 0; - gSprites[spriteId].oam.paletteNum = PALSLOT_PLAYER; gSprites[spriteId].sIndex = i; } } diff --git a/src/mon_markings.c b/src/mon_markings.c index d7a61c27e757..1de8e413fd09 100644 --- a/src/mon_markings.c +++ b/src/mon_markings.c @@ -23,7 +23,7 @@ static void SpriteCB_Cursor(struct Sprite *); static struct Sprite *CreateMarkingComboSprite(u16, u16, const u16 *, u16); static const u16 sMonMarkings_Pal[] = INCBIN_U16("graphics/interface/mon_markings.gbapal"); -static const u8 sMonMarkings_Gfx[] = INCBIN_U8("graphics/interface/mon_markings.4bpp"); +static const ALIGNED(4) u8 sMonMarkings_Gfx[] = INCBIN_U8("graphics/interface/mon_markings.4bpp"); // Alignment needed for dma copy static const struct OamData sOamData_MenuWindow = { diff --git a/src/move_relearner.c b/src/move_relearner.c index 7ac7a6bb11e6..9aafbb4b590f 100644 --- a/src/move_relearner.c +++ b/src/move_relearner.c @@ -9,6 +9,7 @@ #include "event_data.h" #include "field_screen_effect.h" #include "gpu_regs.h" +#include "item.h" #include "move_relearner.h" #include "list_menu.h" #include "malloc.h" @@ -134,7 +135,8 @@ #define MENU_STATE_CONFIRM_DELETE_OLD_MOVE 18 #define MENU_STATE_PRINT_WHICH_MOVE_PROMPT 19 #define MENU_STATE_SHOW_MOVE_SUMMARY_SCREEN 20 -// States 21, 22, and 23 are skipped. +#define MENU_STATE_RETURN_TO_PARTY_MENU 21 +// States 22 and 23 are skipped. #define MENU_STATE_PRINT_STOP_TEACHING 24 #define MENU_STATE_WAIT_FOR_STOP_TEACHING 25 #define MENU_STATE_CONFIRM_STOP_TEACHING 26 @@ -183,7 +185,8 @@ static EWRAM_DATA struct { bool8 showContestInfo; } sMoveRelearnerMenuState = {0}; -EWRAM_DATA u8 gOriginSummaryScreenPage = 0; // indicates summary screen page that the move relearner was opened from (if opened from PSS) +EWRAM_DATA enum MoveRelearnerStates gMoveRelearnerState = MOVE_RELEARNER_LEVEL_UP_MOVES; +EWRAM_DATA enum RelearnMode gRelearnMode = RELEARN_MODE_NONE; static const u16 sUI_Pal[] = INCBIN_U16("graphics/interface/ui_learn_move.gbapal"); @@ -402,11 +405,28 @@ void CB2_InitLearnMove(void) SetVBlankCallback(VBlankCB_MoveRelearner); InitMoveRelearnerBackgroundLayers(); - InitMoveRelearnerWindows(gOriginSummaryScreenPage == PSS_PAGE_CONTEST_MOVES); + InitMoveRelearnerWindows(gRelearnMode == RELEARN_MODE_PSS_PAGE_CONTEST_MOVES); sMoveRelearnerMenuState.listOffset = 0; sMoveRelearnerMenuState.listRow = 0; - sMoveRelearnerMenuState.showContestInfo = gOriginSummaryScreenPage == PSS_PAGE_CONTEST_MOVES; + sMoveRelearnerMenuState.showContestInfo = gRelearnMode == RELEARN_MODE_PSS_PAGE_CONTEST_MOVES; + + switch (gMoveRelearnerState) + { + case MOVE_RELEARNER_EGG_MOVES: + StringCopy(gStringVar3, MoveRelearner_Text_EggMoveLWR); + break; + case MOVE_RELEARNER_TM_MOVES: + StringCopy(gStringVar3, MoveRelearner_Text_TMMoveLWR); + break; + case MOVE_RELEARNER_TUTOR_MOVES: + StringCopy(gStringVar3, MoveRelearner_Text_TutorMoveLWR); + break; + case MOVE_RELEARNER_LEVEL_UP_MOVES: + default: + StringCopy(gStringVar3, MoveRelearner_Text_LevelUpMoveLWR); + break; + } CreateLearnableMovesList(); @@ -474,6 +494,18 @@ static void PrintMessageWithPlaceholders(const u8 *src) MoveRelearnerPrintMessage(gStringVar4); } +// If reusable TMs is off, remove the TM from the bag +static void RemoveRelearnerTMFromBag(u16 move) +{ + u16 item = GetTMHMItemIdFromMoveId(move); + + if (!I_REUSABLE_TMS && !P_ENABLE_ALL_TM_MOVES + && gMoveRelearnerState == MOVE_RELEARNER_TM_MOVES && GetItemTMHMIndex(item) <= NUM_TECHNICAL_MACHINES) + { + RemoveBagItem(item, 1); + } +} + // See the state machine doc at the top of the file. static void DoMoveRelearnerMain(void) { @@ -482,14 +514,14 @@ static void DoMoveRelearnerMain(void) case MENU_STATE_FADE_TO_BLACK: sMoveRelearnerStruct->state++; HideHeartSpritesAndShowTeachMoveText(FALSE); - if (gOriginSummaryScreenPage == PSS_PAGE_CONTEST_MOVES) + if (gRelearnMode == RELEARN_MODE_PSS_PAGE_CONTEST_MOVES) MoveRelearnerShowHideHearts(GetCurrentSelectedMove()); BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); break; case MENU_STATE_WAIT_FOR_FADE: if (!gPaletteFade.active) { - if (gOriginSummaryScreenPage == PSS_PAGE_CONTEST_MOVES) + if (gRelearnMode == RELEARN_MODE_PSS_PAGE_CONTEST_MOVES) sMoveRelearnerStruct->state = MENU_STATE_IDLE_CONTEST_MODE; else sMoveRelearnerStruct->state = MENU_STATE_IDLE_BATTLE_MODE; @@ -499,7 +531,6 @@ static void DoMoveRelearnerMain(void) sMoveRelearnerStruct->state++; break; case MENU_STATE_SETUP_BATTLE_MODE: - HideHeartSpritesAndShowTeachMoveText(FALSE); sMoveRelearnerStruct->state++; AddScrollArrows(); @@ -603,7 +634,21 @@ static void DoMoveRelearnerMain(void) } else if (selection == MENU_B_PRESSED || selection == 1) { - sMoveRelearnerStruct->state = MENU_STATE_PRINT_STOP_TEACHING; + if (P_ASK_MOVE_CONFIRMATION) + { + sMoveRelearnerStruct->state = MENU_STATE_PRINT_STOP_TEACHING; + } + else + { + if (sMoveRelearnerMenuState.showContestInfo == FALSE) + { + sMoveRelearnerStruct->state = MENU_STATE_SETUP_BATTLE_MODE; + } + else if (sMoveRelearnerMenuState.showContestInfo == TRUE) + { + sMoveRelearnerStruct->state = MENU_STATE_SETUP_CONTEST_MODE; + } + } } } break; @@ -670,10 +715,11 @@ static void DoMoveRelearnerMain(void) FreeMoveRelearnerResources(); } break; - case 21: - if (!MoveRelearnerRunTextPrinters()) + case MENU_STATE_RETURN_TO_PARTY_MENU: + if (!gPaletteFade.active) { - sMoveRelearnerStruct->state = MENU_STATE_FADE_AND_RETURN; + FreeMoveRelearnerResources(); + SetMainCallback2(CB2_ReturnToPartyMenuFromSummaryScreen); } break; case 22: @@ -681,26 +727,28 @@ static void DoMoveRelearnerMain(void) break; case MENU_STATE_FADE_AND_RETURN: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); - sMoveRelearnerStruct->state++; + if (gRelearnMode == RELEARN_MODE_PARTY_MENU) + sMoveRelearnerStruct->state = MENU_STATE_RETURN_TO_PARTY_MENU; + else + sMoveRelearnerStruct->state++; break; case MENU_STATE_RETURN_TO_FIELD: if (!gPaletteFade.active) { if (gInitialSummaryScreenCallback != NULL) { - switch (gOriginSummaryScreenPage) + switch (gRelearnMode) { - case PSS_PAGE_BATTLE_MOVES: + case RELEARN_MODE_PSS_PAGE_BATTLE_MOVES: ShowPokemonSummaryScreen(SUMMARY_MODE_RELEARNER_BATTLE, gPlayerParty, sMoveRelearnerStruct->partyMon, gPlayerPartyCount - 1, gInitialSummaryScreenCallback); break; - case PSS_PAGE_CONTEST_MOVES: + case RELEARN_MODE_PSS_PAGE_CONTEST_MOVES: ShowPokemonSummaryScreen(SUMMARY_MODE_RELEARNER_CONTEST, gPlayerParty, sMoveRelearnerStruct->partyMon, gPlayerPartyCount - 1, gInitialSummaryScreenCallback); break; default: ShowPokemonSummaryScreen(SUMMARY_MODE_NORMAL, gPlayerParty, sMoveRelearnerStruct->partyMon, gPlayerPartyCount - 1, gInitialSummaryScreenCallback); break; } - gOriginSummaryScreenPage = 0; } else { @@ -708,6 +756,7 @@ static void DoMoveRelearnerMain(void) } FreeMoveRelearnerResources(); + gRelearnMode = RELEARN_MODE_NONE; } break; case MENU_STATE_FADE_FROM_SUMMARY_SCREEN: @@ -740,7 +789,8 @@ static void DoMoveRelearnerMain(void) RemoveMonPPBonus(&gPlayerParty[sMoveRelearnerStruct->partyMon], sMoveRelearnerStruct->moveSlot); SetMonMoveSlot(&gPlayerParty[sMoveRelearnerStruct->partyMon], GetCurrentSelectedMove(), sMoveRelearnerStruct->moveSlot); u8 newPP = GetMonData(&gPlayerParty[sMoveRelearnerStruct->partyMon], MON_DATA_PP1 + sMoveRelearnerStruct->moveSlot); - if (!P_SUMMARY_MOVE_RELEARNER_FULL_PP && gOriginSummaryScreenPage != 0 && originalPP < newPP) + if (!P_SUMMARY_MOVE_RELEARNER_FULL_PP + && (gRelearnMode == RELEARN_MODE_PSS_PAGE_BATTLE_MOVES || gRelearnMode == RELEARN_MODE_PSS_PAGE_BATTLE_MOVES) && originalPP < newPP) SetMonData(&gPlayerParty[sMoveRelearnerStruct->partyMon], MON_DATA_PP1 + sMoveRelearnerStruct->moveSlot, &originalPP); StringCopy(gStringVar2, GetMoveName(GetCurrentSelectedMove())); PrintMessageWithPlaceholders(gText_MoveRelearnerAndPoof); @@ -761,6 +811,7 @@ static void DoMoveRelearnerMain(void) if (!MoveRelearnerRunTextPrinters()) { PlayFanfare(MUS_LEVEL_UP); + RemoveRelearnerTMFromBag(GetCurrentSelectedMove()); sMoveRelearnerStruct->state = MENU_STATE_WAIT_FOR_FANFARE; } break; @@ -939,7 +990,22 @@ static void CreateLearnableMovesList(void) s32 i; u8 nickname[POKEMON_NAME_LENGTH + 1]; - sMoveRelearnerStruct->numMenuChoices = GetMoveRelearnerMoves(&gPlayerParty[sMoveRelearnerStruct->partyMon], sMoveRelearnerStruct->movesToLearn); + switch (gMoveRelearnerState) + { + case MOVE_RELEARNER_EGG_MOVES: + sMoveRelearnerStruct->numMenuChoices = GetRelearnerEggMoves(&gPlayerParty[sMoveRelearnerStruct->partyMon], sMoveRelearnerStruct->movesToLearn); + break; + case MOVE_RELEARNER_TM_MOVES: + sMoveRelearnerStruct->numMenuChoices = GetRelearnerTMMoves(&gPlayerParty[sMoveRelearnerStruct->partyMon], sMoveRelearnerStruct->movesToLearn); + break; + case MOVE_RELEARNER_TUTOR_MOVES: + sMoveRelearnerStruct->numMenuChoices = GetRelearnerTutorMoves(&gPlayerParty[sMoveRelearnerStruct->partyMon], sMoveRelearnerStruct->movesToLearn); + break; + case MOVE_RELEARNER_LEVEL_UP_MOVES: + default: + sMoveRelearnerStruct->numMenuChoices = GetRelearnerLevelUpMoves(&gPlayerParty[sMoveRelearnerStruct->partyMon], sMoveRelearnerStruct->movesToLearn); + break; + } for (i = 0; i < sMoveRelearnerStruct->numMenuChoices; i++) { diff --git a/src/mystery_event_script.c b/src/mystery_event_script.c index 8ef53351f8b4..c50ef5f9638c 100644 --- a/src/mystery_event_script.c +++ b/src/mystery_event_script.c @@ -340,7 +340,7 @@ bool8 MEScrCmd_givepokemon(struct ScriptContext *ctx) if (species != SPECIES_EGG) { - u16 pokedexNum = SpeciesToNationalPokedexNum(species); + enum NationalDexOrder pokedexNum = SpeciesToNationalPokedexNum(species); GetSetPokedexFlag(pokedexNum, FLAG_SET_SEEN); GetSetPokedexFlag(pokedexNum, FLAG_SET_CAUGHT); } diff --git a/src/mystery_gift_menu.c b/src/mystery_gift_menu.c index 8cbbbac3f9bc..a1bdd9083ec8 100644 --- a/src/mystery_gift_menu.c +++ b/src/mystery_gift_menu.c @@ -49,7 +49,7 @@ EWRAM_DATA static u8 sDownArrowCounterAndYCoordIdx[8] = {}; EWRAM_DATA bool8 gGiftIsFromEReader = FALSE; static const u16 sTextboxBorder_Pal[] = INCBIN_U16("graphics/interface/mystery_gift_textbox_border.gbapal"); -static const u32 sTextboxBorder_Gfx[] = INCBIN_U32("graphics/interface/mystery_gift_textbox_border.4bpp.lz"); +static const u32 sTextboxBorder_Gfx[] = INCBIN_U32("graphics/interface/mystery_gift_textbox_border.4bpp.smol"); struct MysteryGiftTaskData { diff --git a/src/mystery_gift_view.c b/src/mystery_gift_view.c index 9d1ae836dc22..6546ab43b102 100644 --- a/src/mystery_gift_view.c +++ b/src/mystery_gift_view.c @@ -127,16 +127,16 @@ static const u16 sWonderCardBgPal5[] = INCBIN_U16("graphics/wonder_card/bg5. static const u16 sWonderCardBgPal6[] = INCBIN_U16("graphics/wonder_card/bg6.gbapal"); static const u16 sWonderCardBgPal7[] = INCBIN_U16("graphics/wonder_card/bg7.gbapal"); static const u16 sWonderCardBgPal8[] = INCBIN_U16("graphics/wonder_card/bg8.gbapal"); -static const u32 sWonderCardBgGfx1[] = INCBIN_U32("graphics/wonder_card/bg1.4bpp.lz"); -static const u32 sWonderCardBgTilemap1[] = INCBIN_U32("graphics/wonder_card/bg1.bin.lz"); -static const u32 sWonderCardBgGfx2[] = INCBIN_U32("graphics/wonder_card/bg2.4bpp.lz"); -static const u32 sWonderCardBgTilemap2[] = INCBIN_U32("graphics/wonder_card/bg2.bin.lz"); -static const u32 sWonderCardBgGfx3[] = INCBIN_U32("graphics/wonder_card/bg3.4bpp.lz"); -static const u32 sWonderCardBgTilemap3[] = INCBIN_U32("graphics/wonder_card/bg3.bin.lz"); -static const u32 sWonderCardBgGfx7[] = INCBIN_U32("graphics/wonder_card/bg7.4bpp.lz"); -static const u32 sWonderCardBgTilemap7[] = INCBIN_U32("graphics/wonder_card/bg7.bin.lz"); -static const u32 sWonderCardBgGfx8[] = INCBIN_U32("graphics/wonder_card/bg8.4bpp.lz"); -static const u32 sWonderCardBgTilemap8[] = INCBIN_U32("graphics/wonder_card/bg8.bin.lz"); +static const u32 sWonderCardBgGfx1[] = INCBIN_U32("graphics/wonder_card/bg1.4bpp.smol"); +static const u32 sWonderCardBgTilemap1[] = INCBIN_U32("graphics/wonder_card/bg1.bin.smolTM"); +static const u32 sWonderCardBgGfx2[] = INCBIN_U32("graphics/wonder_card/bg2.4bpp.smol"); +static const u32 sWonderCardBgTilemap2[] = INCBIN_U32("graphics/wonder_card/bg2.bin.smolTM"); +static const u32 sWonderCardBgGfx3[] = INCBIN_U32("graphics/wonder_card/bg3.4bpp.smol"); +static const u32 sWonderCardBgTilemap3[] = INCBIN_U32("graphics/wonder_card/bg3.bin.smolTM"); +static const u32 sWonderCardBgGfx7[] = INCBIN_U32("graphics/wonder_card/bg7.4bpp.smol"); +static const u32 sWonderCardBgTilemap7[] = INCBIN_U32("graphics/wonder_card/bg7.bin.smolTM"); +static const u32 sWonderCardBgGfx8[] = INCBIN_U32("graphics/wonder_card/bg8.4bpp.smol"); +static const u32 sWonderCardBgTilemap8[] = INCBIN_U32("graphics/wonder_card/bg8.bin.smolTM"); static const u16 sStampShadowPal1[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_1.gbapal"); static const u16 sStampShadowPal2[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_2.gbapal"); static const u16 sStampShadowPal3[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_3.gbapal"); @@ -145,7 +145,7 @@ static const u16 sStampShadowPal5[] = INCBIN_U16("graphics/wonder_card/stam static const u16 sStampShadowPal6[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_6.gbapal"); static const u16 sStampShadowPal7[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_7.gbapal"); static const u16 sStampShadowPal8[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_8.gbapal"); -static const u32 sStampShadowGfx[] = INCBIN_U32("graphics/wonder_card/stamp_shadow.4bpp.lz"); +static const u32 sStampShadowGfx[] = INCBIN_U32("graphics/wonder_card/stamp_shadow.4bpp.smol"); static const struct CompressedSpriteSheet sSpriteSheet_StampShadow = { sStampShadowGfx, 0x100, TAG_STAMP_SHADOW @@ -243,7 +243,7 @@ s32 WonderCard_Enter(void) LoadPalette(GetTextWindowPalette(1), BG_PLTT_ID(2), PLTT_SIZE_4BPP); gPaletteFade.bufferTransferDisabled = TRUE; LoadPalette(sWonderCardData->gfx->pal, BG_PLTT_ID(1), PLTT_SIZE_4BPP); - LZ77UnCompWram(sWonderCardData->gfx->map, sWonderCardData->bgTilemapBuffer); + DecompressDataWithHeaderWram(sWonderCardData->gfx->map, sWonderCardData->bgTilemapBuffer); CopyRectToBgTilemapBufferRect(2, sWonderCardData->bgTilemapBuffer, 0, 0, DISPLAY_TILE_WIDTH, DISPLAY_TILE_HEIGHT, 0, 0, DISPLAY_TILE_WIDTH, DISPLAY_TILE_HEIGHT, 1, 0x008, 0); CopyBgTilemapBufferToVram(2); break; @@ -618,16 +618,16 @@ static const struct ScrollArrowsTemplate sNews_ArrowsTemplate = { static const u16 sWonderNewsPal1[] = INCBIN_U16("graphics/wonder_news/bg1.gbapal"); static const u16 sWonderNewsPal7[] = INCBIN_U16("graphics/wonder_news/bg7.gbapal"); static const u16 sWonderNewsPal8[] = INCBIN_U16("graphics/wonder_news/bg8.gbapal"); -static const u32 sWonderNewsGfx1[] = INCBIN_U32("graphics/wonder_news/bg1.4bpp.lz"); -static const u32 sWonderNewsTilemap1[] = INCBIN_U32("graphics/wonder_news/bg1.bin.lz"); -static const u32 sWonderNewsGfx2[] = INCBIN_U32("graphics/wonder_news/bg2.4bpp.lz"); -static const u32 sWonderNewsTilemap2[] = INCBIN_U32("graphics/wonder_news/bg2.bin.lz"); -static const u32 sWonderNewsGfx3[] = INCBIN_U32("graphics/wonder_news/bg3.4bpp.lz"); -static const u32 sWonderNewsTilemap3[] = INCBIN_U32("graphics/wonder_news/bg3.bin.lz"); -static const u32 sWonderNewsGfx7[] = INCBIN_U32("graphics/wonder_news/bg7.4bpp.lz"); -static const u32 sWonderNewsTilemap7[] = INCBIN_U32("graphics/wonder_news/bg7.bin.lz"); -static const u32 sWonderNewsGfx8[] = INCBIN_U32("graphics/wonder_news/bg8.4bpp.lz"); -static const u32 sWonderNewsTilemap8[] = INCBIN_U32("graphics/wonder_news/bg8.bin.lz"); +static const u32 sWonderNewsGfx1[] = INCBIN_U32("graphics/wonder_news/bg1.4bpp.smol"); +static const u32 sWonderNewsTilemap1[] = INCBIN_U32("graphics/wonder_news/bg1.bin.smolTM"); +static const u32 sWonderNewsGfx2[] = INCBIN_U32("graphics/wonder_news/bg2.4bpp.smol"); +static const u32 sWonderNewsTilemap2[] = INCBIN_U32("graphics/wonder_news/bg2.bin.smolTM"); +static const u32 sWonderNewsGfx3[] = INCBIN_U32("graphics/wonder_news/bg3.4bpp.smol"); +static const u32 sWonderNewsTilemap3[] = INCBIN_U32("graphics/wonder_news/bg3.bin.smolTM"); +static const u32 sWonderNewsGfx7[] = INCBIN_U32("graphics/wonder_news/bg7.4bpp.smol"); +static const u32 sWonderNewsTilemap7[] = INCBIN_U32("graphics/wonder_news/bg7.bin.smolTM"); +static const u32 sWonderNewsGfx8[] = INCBIN_U32("graphics/wonder_news/bg8.4bpp.smol"); +static const u32 sWonderNewsTilemap8[] = INCBIN_U32("graphics/wonder_news/bg8.bin.smolTM"); static const struct WonderGraphics sNewsGraphics[NUM_WONDER_BGS] = { {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sWonderNewsGfx1, .map = sWonderNewsTilemap1, .pal = sWonderNewsPal1}, @@ -706,7 +706,7 @@ s32 WonderNews_Enter(void) LoadPalette(GetTextWindowPalette(1), BG_PLTT_ID(2), PLTT_SIZE_4BPP); gPaletteFade.bufferTransferDisabled = TRUE; LoadPalette(sWonderNewsData->gfx->pal, BG_PLTT_ID(1), PLTT_SIZE_4BPP); - LZ77UnCompWram(sWonderNewsData->gfx->map, sWonderNewsData->bgTilemapBuffer); + DecompressDataWithHeaderWram(sWonderNewsData->gfx->map, sWonderNewsData->bgTilemapBuffer); CopyRectToBgTilemapBufferRect(1, sWonderNewsData->bgTilemapBuffer, 0, 0, DISPLAY_TILE_WIDTH, 3, 0, 0, DISPLAY_TILE_WIDTH, 3, 1, 8, 0); CopyRectToBgTilemapBufferRect(3, sWonderNewsData->bgTilemapBuffer, 0, 3, DISPLAY_TILE_WIDTH, 3 + DISPLAY_TILE_HEIGHT, 0, 3, DISPLAY_TILE_WIDTH, 3 + DISPLAY_TILE_HEIGHT, 1, 8, 0); CopyBgTilemapBufferToVram(1); diff --git a/src/naming_screen.c b/src/naming_screen.c index 13f9edad5dec..157f6868fd0b 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -27,6 +27,7 @@ #include "overworld.h" #include "walda_phrase.h" #include "main.h" +#include "decompress.h" #include "constants/event_objects.h" #include "constants/rgb.h" @@ -1886,7 +1887,7 @@ static void SaveInputText(void) static void LoadGfx(void) { - LZ77UnCompWram(gNamingScreenMenu_Gfx, sNamingScreen->tileBuffer); + DecompressDataWithHeaderWram(gNamingScreenMenu_Gfx, sNamingScreen->tileBuffer); LoadBgTiles(1, sNamingScreen->tileBuffer, sizeof(sNamingScreen->tileBuffer), 0); LoadBgTiles(2, sNamingScreen->tileBuffer, sizeof(sNamingScreen->tileBuffer), 0); LoadBgTiles(3, sNamingScreen->tileBuffer, sizeof(sNamingScreen->tileBuffer), 0); diff --git a/src/option_menu.c b/src/option_menu.c index fda3a24c4779..a55d4da4e464 100644 --- a/src/option_menu.c +++ b/src/option_menu.c @@ -72,19 +72,35 @@ static void DrawBgWindowFrames(void); EWRAM_DATA static bool8 sArrowPressed = FALSE; +static const u8 gText_Option[] = _("OPTION"); +static const u8 gText_TextSpeedSlow[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}SLOW"); +static const u8 gText_TextSpeedMid[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}MID"); +static const u8 gText_TextSpeedFast[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}FAST"); +static const u8 gText_BattleSceneOn[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}ON"); +static const u8 gText_BattleSceneOff[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}OFF"); +static const u8 gText_BattleStyleShift[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}SHIFT"); +static const u8 gText_BattleStyleSet[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}SET"); +static const u8 gText_SoundMono[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}MONO"); +static const u8 gText_SoundStereo[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}STEREO"); +static const u8 gText_FrameType[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}TYPE"); +static const u8 gText_FrameTypeNumber[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}"); +static const u8 gText_ButtonTypeNormal[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}NORMAL"); +static const u8 gText_ButtonTypeLR[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}LR"); +static const u8 gText_ButtonTypeLEqualsA[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}L=A"); + static const u16 sOptionMenuText_Pal[] = INCBIN_U16("graphics/interface/option_menu_text.gbapal"); // note: this is only used in the Japanese release static const u8 sEqualSignGfx[] = INCBIN_U8("graphics/interface/option_menu_equals_sign.4bpp"); static const u8 *const sOptionMenuItemsNames[MENUITEM_COUNT] = { - [MENUITEM_TEXTSPEED] = gText_TextSpeed, - [MENUITEM_BATTLESCENE] = gText_BattleScene, - [MENUITEM_BATTLESTYLE] = gText_BattleStyle, - [MENUITEM_SOUND] = gText_Sound, - [MENUITEM_BUTTONMODE] = gText_ButtonMode, - [MENUITEM_FRAMETYPE] = gText_Frame, - [MENUITEM_CANCEL] = gText_OptionMenuCancel, + [MENUITEM_TEXTSPEED] = COMPOUND_STRING("TEXT SPEED"), + [MENUITEM_BATTLESCENE] = COMPOUND_STRING("BATTLE SCENE"), + [MENUITEM_BATTLESTYLE] = COMPOUND_STRING("BATTLE STYLE"), + [MENUITEM_SOUND] = COMPOUND_STRING("SOUND"), + [MENUITEM_BUTTONMODE] = COMPOUND_STRING("BUTTON MODE"), + [MENUITEM_FRAMETYPE] = COMPOUND_STRING("FRAME"), + [MENUITEM_CANCEL] = COMPOUND_STRING("CANCEL"), }; static const struct WindowTemplate sOptionMenuWinTemplates[] = diff --git a/src/oras_dowse.c b/src/oras_dowse.c new file mode 100644 index 000000000000..237c45618745 --- /dev/null +++ b/src/oras_dowse.c @@ -0,0 +1,562 @@ +#include "global.h" +#include "oras_dowse.h" +#include "bike.h" +#include "event_data.h" +#include "event_object_lock.h" +#include "event_object_movement.h" +#include "field_effect.h" +#include "field_effect_helpers.h" +#include "field_player_avatar.h" +#include "fldeff.h" +#include "item_use.h" +#include "palette.h" +#include "script.h" +#include "sound.h" +#include "task.h" +#include "constants/field_effects.h" +#include "constants/songs.h" +#include "constants/rgb.h" + +static void StartORASDowseFieldEffect(void); +static void UpdateORASDowsingFieldEffect(struct Sprite *sprite); +static void ChangeDowsingColor(u8 direction, struct Sprite *sprite); +static void ClearDowsingColor(struct Sprite *sprite); +static void PlayDowseSound(u32 dowseState); + +const u32 gFieldEffectObjectPic_ORASDowsingBrendan[] = INCBIN_U32("graphics/field_effects/pics/oras_dowsing_brendan.4bpp"); +const u32 gFieldEffectObjectPic_ORASDowsingMay[] = INCBIN_U32("graphics/field_effects/pics/oras_dowsing_may.4bpp"); +const u16 gFieldEffectPal_ORASDowsing[] = INCBIN_U16("graphics/field_effects/palettes/oras_dowsing.gbapal"); + +static const struct SpriteFrameImage sPicTable_ORASDowsingBrendan[] = { + overworld_ascending_frames(gFieldEffectObjectPic_ORASDowsingBrendan, 2, 4), +}; + +static const struct SpriteFrameImage sPicTable_ORASDowsingMay[] = { + overworld_ascending_frames(gFieldEffectObjectPic_ORASDowsingMay, 2, 4), +}; + +static const union AnimCmd sAnim_FaceSouth[] = +{ + ANIMCMD_FRAME(0, 16), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_FaceNorth[] = +{ + ANIMCMD_FRAME(1, 16), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_FaceWest[] = +{ + ANIMCMD_FRAME(2, 16), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_FaceEast[] = +{ + ANIMCMD_FRAME(2, 16, .hFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_ORASDowseWiggleSouthSlow[] = +{ + ANIMCMD_FRAME(0, 32), + ANIMCMD_FRAME(0, 32), + ANIMCMD_FRAME(4, 32), + ANIMCMD_FRAME(4, 32), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_ORASDowseWiggleNorthSlow[] = +{ + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(6, 32), + ANIMCMD_FRAME(6, 32), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_ORASDowseWiggleWestSlow[] = +{ + ANIMCMD_FRAME(2, 32), + ANIMCMD_FRAME(2, 32), + ANIMCMD_FRAME(8, 32), + ANIMCMD_FRAME(8, 32), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_ORASDowseWiggleEastSlow[] = +{ + ANIMCMD_FRAME(2, 32, .hFlip = TRUE), + ANIMCMD_FRAME(2, 32, .hFlip = TRUE), + ANIMCMD_FRAME(8, 32, .hFlip = TRUE), + ANIMCMD_FRAME(8, 32, .hFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_ORASDowseWiggleSouth[] = +{ + ANIMCMD_FRAME(0, 32), + ANIMCMD_FRAME(3, 32), + ANIMCMD_FRAME(0, 32), + ANIMCMD_FRAME(4, 32), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_ORASDowseWiggleNorth[] = +{ + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(5, 32), + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(6, 32), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_ORASDowseWiggleWest[] = +{ + ANIMCMD_FRAME(2, 32), + ANIMCMD_FRAME(7, 32), + ANIMCMD_FRAME(2, 32), + ANIMCMD_FRAME(8, 32), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_ORASDowseWiggleEast[] = +{ + ANIMCMD_FRAME(2, 32, .hFlip = TRUE), + ANIMCMD_FRAME(7, 32, .hFlip = TRUE), + ANIMCMD_FRAME(2, 32, .hFlip = TRUE), + ANIMCMD_FRAME(8, 32, .hFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_ORASDowseWiggleSouthFast[] = +{ + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(3, 16), + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(4, 16), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_ORASDowseWiggleNorthFast[] = +{ + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(5, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(6, 16), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_ORASDowseWiggleWestFast[] = +{ + ANIMCMD_FRAME(2, 16), + ANIMCMD_FRAME(7, 16), + ANIMCMD_FRAME(2, 16), + ANIMCMD_FRAME(8, 16), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_ORASDowseWiggleEastFast[] = +{ + ANIMCMD_FRAME(2, 16, .hFlip = TRUE), + ANIMCMD_FRAME(7, 16, .hFlip = TRUE), + ANIMCMD_FRAME(2, 16, .hFlip = TRUE), + ANIMCMD_FRAME(8, 16, .hFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_ORASDowseWiggleSouthFaster[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(3, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_ORASDowseWiggleNorthFaster[] = +{ + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(5, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(6, 8), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_ORASDowseWiggleWestFaster[] = +{ + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(7, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(8, 8), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_ORASDowseWiggleEastFaster[] = +{ + ANIMCMD_FRAME(2, 8, .hFlip = TRUE), + ANIMCMD_FRAME(7, 8, .hFlip = TRUE), + ANIMCMD_FRAME(2, 8, .hFlip = TRUE), + ANIMCMD_FRAME(8, 8, .hFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd *const sAnimTable_ORASDowsing[] = +{ + [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth, + [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth, + [ANIM_STD_FACE_WEST] = sAnim_FaceWest, + [ANIM_STD_FACE_EAST] = sAnim_FaceEast, + [ANIM_ORAS_DOWSE_WIGGLE_SOUTH_SLOW] = sAnim_ORASDowseWiggleSouthSlow, + [ANIM_ORAS_DOWSE_WIGGLE_NORTH_SLOW] = sAnim_ORASDowseWiggleNorthSlow, + [ANIM_ORAS_DOWSE_WIGGLE_WEST_SLOW] = sAnim_ORASDowseWiggleWestSlow, + [ANIM_ORAS_DOWSE_WIGGLE_EAST_SLOW] = sAnim_ORASDowseWiggleEastSlow, + [ANIM_ORAS_DOWSE_WIGGLE_SOUTH] = sAnim_ORASDowseWiggleSouth, + [ANIM_ORAS_DOWSE_WIGGLE_NORTH] = sAnim_ORASDowseWiggleNorth, + [ANIM_ORAS_DOWSE_WIGGLE_WEST] = sAnim_ORASDowseWiggleWest, + [ANIM_ORAS_DOWSE_WIGGLE_EAST] = sAnim_ORASDowseWiggleEast, + [ANIM_ORAS_DOWSE_WIGGLE_SOUTH_FAST] = sAnim_ORASDowseWiggleSouthFast, + [ANIM_ORAS_DOWSE_WIGGLE_NORTH_FAST] = sAnim_ORASDowseWiggleNorthFast, + [ANIM_ORAS_DOWSE_WIGGLE_WEST_FAST] = sAnim_ORASDowseWiggleWestFast, + [ANIM_ORAS_DOWSE_WIGGLE_EAST_FAST] = sAnim_ORASDowseWiggleEastFast, + [ANIM_ORAS_DOWSE_WIGGLE_SOUTH_FASTER] = sAnim_ORASDowseWiggleSouthFaster, + [ANIM_ORAS_DOWSE_WIGGLE_NORTH_FASTER] = sAnim_ORASDowseWiggleNorthFaster, + [ANIM_ORAS_DOWSE_WIGGLE_WEST_FASTER] = sAnim_ORASDowseWiggleWestFaster, + [ANIM_ORAS_DOWSE_WIGGLE_EAST_FASTER] = sAnim_ORASDowseWiggleEastFaster, +}; + +static const struct OamData gObjectEventOam_ORASDowse = { + .shape = SPRITE_SHAPE(16x32), + .size = SPRITE_SIZE(16x32), + .priority = 2 +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_ORASDowsingBrendan = { + .tileTag = TAG_NONE, + .paletteTag = FLDEFF_PAL_TAG_ORAS_DOWSE, + .oam = &gObjectEventOam_ORASDowse, + .anims = sAnimTable_ORASDowsing, + .images = sPicTable_ORASDowsingBrendan, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = UpdateORASDowsingFieldEffect, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_ORASDowsingMay = { + .tileTag = TAG_NONE, + .paletteTag = FLDEFF_PAL_TAG_ORAS_DOWSE, + .oam = &gObjectEventOam_ORASDowse, + .anims = sAnimTable_ORASDowsing, + .images = sPicTable_ORASDowsingMay, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = UpdateORASDowsingFieldEffect, +}; + +void Task_UseORASDowsingMachine(u8 taskId) +{ + if (FlagGet(I_ORAS_DOWSING_FLAG)) + { + EndORASDowsing(); + } + else + { + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_BIKE)) + GetOnOffBike(0); + + StartORASDowseFieldEffect(); + } + ScriptUnfreezeObjectEvents(); + UnlockPlayerFieldControls(); + DestroyTask(taskId); +} + +static void StartORASDowseFieldEffect(void) +{ + struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId]; + + gFieldEffectArguments[0] = playerObj->currentCoords.x; + gFieldEffectArguments[1] = playerObj->currentCoords.y; + FieldEffectStart(FLDEFF_ORAS_DOWSE); +} + +void ResumeORASDowseFieldEffect(void) +{ + if (I_ORAS_DOWSING_FLAG != 0 && FlagGet(I_ORAS_DOWSING_FLAG)) + StartORASDowseFieldEffect(); +} + +static const struct SpritePalette gSpritePalette_ORASDowsing = {gFieldEffectPal_ORASDowsing, FLDEFF_PAL_TAG_ORAS_DOWSE}; + +// Sprite data for ORAS Dowsing Machine +#define tItemDistanceX data[0] +#define tItemDistanceY data[1] +#define sItemFound data[2] +#define sCounter data[3] +#define sSoundTimer data[4] +#define sDowseState data[5] +#define sPrevDowseState data[6] +#define sMoveActive data[7] + +#define fPlayerX gFieldEffectArguments[0] +#define fPlayerY gFieldEffectArguments[1] + +// Create the ORAS Dowsing Machine sprite. +u32 FldEff_ORASDowsing(void) +{ + struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId]; + u32 spriteId; + u32 palNum; + + FlagSet(I_ORAS_DOWSING_FLAG); + SetSpritePosToOffsetMapCoords((s16 *)&fPlayerX, (s16 *)&fPlayerY, 8, 0); + if (gPlayerAvatar.gender == MALE) + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ORAS_DOWSE_BRENDAN], fPlayerX, fPlayerY, 1); + else + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ORAS_DOWSE_MAY], fPlayerX, fPlayerY, 1); + + if (spriteId != MAX_SPRITES) + { + struct Sprite *sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + palNum = LoadSpritePalette(&gSpritePalette_ORASDowsing); + if (palNum != 0xFF) + sprite->oam.paletteNum = palNum; + else + sprite->oam.paletteNum = LoadPlayerObjectEventPalette(gSaveBlock2Ptr->playerGender); + + playerObj->fieldEffectSpriteId = spriteId; + sprite->sDowseState = ORASD_WIGGLE_NONE; + UpdateDowseState(sprite); + } + FieldEffectActiveListRemove(FLDEFF_ORAS_DOWSE); + return spriteId; +} + +// Callback for ORAS Dowsing Machine sprite. +static void UpdateORASDowsingFieldEffect(struct Sprite *sprite) +{ + struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId]; + struct Sprite *playerSprite = &gSprites[playerObj->spriteId]; + + if (!FlagGet(I_ORAS_DOWSING_FLAG)) + { + DestroySpriteAndFreeResources(sprite); + return; + } + + sprite->x = playerSprite->x; + sprite->y = playerSprite->y; + sprite->x2 = playerSprite->x2; + sprite->y2 = playerSprite->y2; + + if (playerSprite->anims[playerSprite->animNum][playerSprite->animCmdIndex].frame.imageValue > 2) + sprite->y2++; + + if (playerObj->previousMovementDirection != playerObj->movementDirection) + UpdateDowsingAnimDirection(sprite, playerObj); + + if (playerObj->movementActionId != MOVEMENT_ACTION_NONE) + { + if (playerObj->heldMovementFinished == FALSE) + { + if (sprite->sCounter == 0) + { + sprite->sMoveActive = TRUE; + sprite->sCounter++; + } + } + else if (playerObj->heldMovementFinished == TRUE && sprite->sMoveActive) + { + sprite->sMoveActive = FALSE; + sprite->sCounter = 0; + UpdateDowseState(sprite); + } + } + + if (I_ORAS_DOWSING_SOUNDS && sprite->sDowseState == ORASD_WIGGLE_FASTER && playerObj->heldMovementFinished != FALSE) + { + if (++sprite->sSoundTimer == 70) + { + PlaySE(SE_ITEMFINDER); + sprite->sSoundTimer = 0; + } + } + sprite->oam.priority = playerSprite->oam.priority; +} + +static const u8 sClockwiseDirections[] = {DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST}; + +void UpdateDowseState(struct Sprite *sprite) +{ + struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId]; + + sprite->tItemDistanceX = 0; + sprite->tItemDistanceY = 0; + sprite->sPrevDowseState = sprite->sDowseState; + if (ItemfinderCheckForHiddenItems(gMapHeader.events, TASK_NONE) == TRUE) + { + s8 distX = sprite->tItemDistanceX; + s8 distY = sprite->tItemDistanceY; + u8 directionToItem = CARDINAL_DIRECTION_COUNT; + u8 playerDirToItem = GetDirectionToHiddenItem(distX, distY); + if (playerDirToItem != DIR_NONE) + directionToItem = sClockwiseDirections[GetDirectionToHiddenItem(distX, distY) - 1]; + + if (distX < 0) + distX *= -1; + + if (distY < 0) + distY *= -1; + + // If the player is facing the item's direction. + if (directionToItem == playerObj->movementDirection) + { + ChangeDowsingColor(directionToItem, sprite); + } + // If x and y distances are equal, make sure item can bee seen from both facing directions. + else if (distX == distY && distX != 0) + { + if ((directionToItem == DIR_NORTH || directionToItem == DIR_SOUTH) && sprite->tItemDistanceX > 0 && playerObj->movementDirection == DIR_EAST) + ChangeDowsingColor(DIR_EAST, sprite); + else if ((directionToItem == DIR_NORTH || directionToItem == DIR_SOUTH) && sprite->tItemDistanceX < 0 && playerObj->movementDirection == DIR_WEST) + ChangeDowsingColor(DIR_WEST, sprite); + else + ClearDowsingColor(sprite); + } + else + { + ClearDowsingColor(sprite); + } + } + else + { + ClearDowsingColor(sprite); + } + UpdateDowsingAnimDirection(sprite, playerObj); +} + +static void ChangeDowsingColor(u8 direction, struct Sprite *sprite) +{ + s16 distance; + u16 color = I_ORAS_DOWSING_COLOR_NONE; + + if (direction == DIR_NORTH || direction == DIR_SOUTH) + distance = sprite->tItemDistanceY; + else + distance = sprite->tItemDistanceX; + + // Absolute value. + if (distance < 0) + distance *= -1; + + switch (distance) + { + case 1: + if (sprite->tItemDistanceX == 0 || sprite->tItemDistanceY == 0) + { + color = I_ORAS_DOWSING_COLOR_FASTER; + sprite->sDowseState = ORASD_WIGGLE_FASTER; + break; + } + case 2: + color = I_ORAS_DOWSING_COLOR_FAST; + sprite->sDowseState = ORASD_WIGGLE_FAST; + break; + case 3: + case 4: + color = I_ORAS_DOWSING_COLOR_NORMAL; + sprite->sDowseState = ORASD_WIGGLE_NORMAL; + break; + case 5: + case 6: + case 7: + color = I_ORAS_DOWSING_COLOR_SLOW; + sprite->sDowseState = ORASD_WIGGLE_SLOW; + break; + } + + if (I_ORAS_DOWSING_SOUNDS && sprite->sDowseState != sprite->sPrevDowseState) + { + sprite->sSoundTimer = 0; + PlayDowseSound(sprite->sDowseState); + } + + FillPalette(color, (OBJ_PLTT_ID(IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_ORAS_DOWSE)) + I_ORAS_DOWSING_COLOR_PAL), PLTT_SIZEOF(1)); + UpdateSpritePaletteWithTime(IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_ORAS_DOWSE)); +} + +static void ClearDowsingColor(struct Sprite *sprite) +{ + sprite->sDowseState = ORASD_WIGGLE_NONE; + FillPalette(I_ORAS_DOWSING_COLOR_NONE, (OBJ_PLTT_ID(IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_ORAS_DOWSE)) + I_ORAS_DOWSING_COLOR_PAL), PLTT_SIZEOF(1)); + UpdateSpritePaletteWithTime(IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_ORAS_DOWSE)); +} + +static void PlayDowseSound(u32 dowseState) +{ + switch (dowseState) + { + case ORASD_WIGGLE_SLOW: + PlaySE(SE_CONTEST_ICON_CLEAR); + return; + case ORASD_WIGGLE_NORMAL: + PlaySE(SE_PIN); + return; + case ORASD_WIGGLE_FAST: + PlaySE(SE_SUCCESS); + return; + case ORASD_WIGGLE_FASTER: + PlaySE(SE_ITEMFINDER); + return; + } +} + +void UpdateDowsingAnimDirection(struct Sprite *sprite, struct ObjectEvent *playerObj) +{ + u32 anim = (playerObj->facingDirection - 1); + + switch (sprite->sDowseState) + { + case ORASD_WIGGLE_SLOW: + anim += 4; + break; + case ORASD_WIGGLE_NORMAL: + anim += 8; + break; + case ORASD_WIGGLE_FAST: + anim += 12; + break; + case ORASD_WIGGLE_FASTER: + anim += 16; + break; + } + + // Don't completely restart anim if wiggling didn't stop. + if (sprite->sPrevDowseState != ORASD_WIGGLE_NONE && sprite->sDowseState != ORASD_WIGGLE_NONE) + SetAndStartSpriteAnim(sprite, anim, sprite->animCmdIndex); + else + StartSpriteAnimIfDifferent(sprite, anim); +} + +void EndORASDowsing(void) +{ + if (I_ORAS_DOWSING_FLAG != 0 && FlagGet(I_ORAS_DOWSING_FLAG)) + FlagClear(I_ORAS_DOWSING_FLAG); +} + +void Script_ClearDowsingColor(void) +{ + if (I_ORAS_DOWSING_FLAG != 0 && FlagGet(I_ORAS_DOWSING_FLAG)) + { + struct Sprite *sprite = &gSprites[gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId]; + ClearDowsingColor(sprite); + UpdateDowsingAnimDirection(sprite, &gObjectEvents[gPlayerAvatar.objectEventId]); + } +} + +void Script_UpdateDowseState(void) +{ + if (I_ORAS_DOWSING_FLAG != 0 && FlagGet(I_ORAS_DOWSING_FLAG)) + UpdateDowseState(&gSprites[gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId]); +} diff --git a/src/overworld.c b/src/overworld.c index d827d46a2c80..4157236a791f 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -43,6 +43,7 @@ #include "mirage_tower.h" #include "money.h" #include "new_game.h" +#include "oras_dowse.h" #include "palette.h" #include "play_time.h" #include "random.h" @@ -72,7 +73,6 @@ #include "constants/event_object_movement.h" #include "constants/event_objects.h" #include "constants/layouts.h" -#include "constants/map_types.h" #include "constants/region_map_sections.h" #include "constants/songs.h" #include "constants/trainer_hill.h" @@ -180,8 +180,8 @@ static void SetKeyInterceptCallback(u16 (*func)(u32)); static void SetFieldVBlankCallback(void); static void FieldClearVBlankHBlankCallbacks(void); static void TransitionMapMusic(void); -static u8 GetAdjustedInitialTransitionFlags(struct InitialPlayerAvatarState *, u16, u8); -static u8 GetAdjustedInitialDirection(struct InitialPlayerAvatarState *, u8, u16, u8); +static u8 GetAdjustedInitialTransitionFlags(struct InitialPlayerAvatarState *playerStruct, u16 metatileBehavior, enum MapType mapType); +static u8 GetAdjustedInitialDirection(struct InitialPlayerAvatarState *playerStruct, u8 transitionFlags, u16 metatileBehavior, enum MapType mapType); static u16 GetCenterScreenMetatileBehavior(void); static void *sUnusedOverworldCallback; @@ -212,7 +212,7 @@ EWRAM_DATA struct WarpData gLastUsedWarp = {0}; EWRAM_DATA static struct WarpData sWarpDestination = {0}; // new warp position EWRAM_DATA static struct WarpData sFixedDiveWarp = {0}; EWRAM_DATA static struct WarpData sFixedHoleWarp = {0}; -EWRAM_DATA static u16 sLastMapSectionId = 0; +EWRAM_DATA static mapsec_u16_t sLastMapSectionId = 0; EWRAM_DATA static struct InitialPlayerAvatarState sInitialPlayerAvatarState = {0}; EWRAM_DATA static u16 sAmbientCrySpecies = 0; EWRAM_DATA static bool8 sIsAmbientCryWaterMon = FALSE; @@ -430,10 +430,13 @@ void Overworld_ResetBattleFlagsAndVars(void) VarSet(B_VAR_WILD_AI_FLAGS,0); #endif + #if B_VAR_NO_BAG_USE != 0 + VarSet(B_VAR_NO_BAG_USE, 0); + #endif + FlagClear(B_FLAG_INVERSE_BATTLE); FlagClear(B_FLAG_FORCE_DOUBLE_WILD); FlagClear(B_SMART_WILD_AI_FLAG); - FlagClear(B_FLAG_NO_BAG_USE); FlagClear(B_FLAG_NO_CATCHING); FlagClear(B_FLAG_NO_RUNNING); FlagClear(B_FLAG_DYNAMAX_BATTLE); @@ -708,16 +711,16 @@ void SetWarpDestinationToHealLocation(u8 healLocationId) SetWarpDestination(healLocation->mapGroup, healLocation->mapNum, WARP_ID_NONE, healLocation->x, healLocation->y); } -static bool32 IsFRLGWhiteout(void) +static bool32 IsWhiteoutCutscene(void) { - if (!OW_FRLG_WHITEOUT) + if (OW_WHITEOUT_CUTSCENE < GEN_4) return FALSE; return GetHealNpcLocalId(GetHealLocationIndexByWarpData(&gSaveBlock1Ptr->lastHealLocation)) > 0; } void SetWarpDestinationToLastHealLocation(void) { - if (IsFRLGWhiteout()) + if (IsWhiteoutCutscene()) SetWhiteoutRespawnWarpAndHealerNPC(&sWarpDestination); else sWarpDestination = gSaveBlock1Ptr->lastHealLocation; @@ -732,8 +735,8 @@ void SetLastHealLocationWarp(u8 healLocationId) void UpdateEscapeWarp(s16 x, s16 y) { - u8 currMapType = GetCurrentMapType(); - u8 destMapType = GetMapTypeByGroupAndId(sWarpDestination.mapGroup, sWarpDestination.mapNum); + enum MapType currMapType = GetCurrentMapType(); + enum MapType destMapType = GetMapTypeByGroupAndId(sWarpDestination.mapGroup, sWarpDestination.mapNum); if (IsMapTypeOutdoors(currMapType) && IsMapTypeOutdoors(destMapType) != TRUE) SetEscapeWarp(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, WARP_ID_NONE, x - MAP_OFFSET, y - MAP_OFFSET + 1); } @@ -857,8 +860,8 @@ void LoadMapFromCameraTransition(u8 mapGroup, u8 mapNum) TryUpdateRandomTrainerRematches(mapGroup, mapNum); #endif //FREE_MATCH_CALL -if (I_VS_SEEKER_CHARGING != 0) - MapResetTrainerRematches(mapGroup, mapNum); + if (I_VS_SEEKER_CHARGING != 0) + MapResetTrainerRematches(mapGroup, mapNum); DoTimeBasedEvents(); SetSavedWeatherFromCurrMapHeader(); @@ -916,15 +919,15 @@ static void LoadMapFromWarp(bool32 a1) ClearTempFieldEventData(); ResetDexNavSearch(); // reset hours override on every warp - sHoursOverride = 0; + sHoursOverride = 0; ResetCyclingRoadChallengeData(); RestartWildEncounterImmunitySteps(); #if FREE_MATCH_CALL == FALSE TryUpdateRandomTrainerRematches(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum); #endif //FREE_MATCH_CALL -if (I_VS_SEEKER_CHARGING != 0) - MapResetTrainerRematches(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum); + if (I_VS_SEEKER_CHARGING != 0) + MapResetTrainerRematches(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum); if (a1 != TRUE) DoTimeBasedEvents(); @@ -977,7 +980,7 @@ void StoreInitialPlayerAvatarState(void) static struct InitialPlayerAvatarState *GetInitialPlayerAvatarState(void) { struct InitialPlayerAvatarState playerStruct; - u8 mapType = GetCurrentMapType(); + enum MapType mapType = GetCurrentMapType(); u16 metatileBehavior = GetCenterScreenMetatileBehavior(); u8 transitionFlags = GetAdjustedInitialTransitionFlags(&sInitialPlayerAvatarState, metatileBehavior, mapType); playerStruct.transitionFlags = transitionFlags; @@ -986,7 +989,7 @@ static struct InitialPlayerAvatarState *GetInitialPlayerAvatarState(void) return &sInitialPlayerAvatarState; } -static u8 GetAdjustedInitialTransitionFlags(struct InitialPlayerAvatarState *playerStruct, u16 metatileBehavior, u8 mapType) +static u8 GetAdjustedInitialTransitionFlags(struct InitialPlayerAvatarState *playerStruct, u16 metatileBehavior, enum MapType mapType) { if (mapType != MAP_TYPE_INDOOR && FlagGet(FLAG_SYS_CRUISE_MODE)) return PLAYER_AVATAR_FLAG_ON_FOOT; @@ -1004,7 +1007,7 @@ static u8 GetAdjustedInitialTransitionFlags(struct InitialPlayerAvatarState *pla return PLAYER_AVATAR_FLAG_ACRO_BIKE; } -static u8 GetAdjustedInitialDirection(struct InitialPlayerAvatarState *playerStruct, u8 transitionFlags, u16 metatileBehavior, u8 mapType) +static u8 GetAdjustedInitialDirection(struct InitialPlayerAvatarState *playerStruct, u8 transitionFlags, u16 metatileBehavior, enum MapType mapType) { if (FlagGet(FLAG_SYS_CRUISE_MODE) && mapType == MAP_TYPE_OCEAN_ROUTE) return DIR_EAST; @@ -1413,27 +1416,27 @@ static void ChooseAmbientCrySpecies(void) } } -u8 GetMapTypeByGroupAndId(s8 mapGroup, s8 mapNum) +enum MapType GetMapTypeByGroupAndId(s8 mapGroup, s8 mapNum) { return Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum)->mapType; } -u8 GetMapTypeByWarpData(struct WarpData *warp) +enum MapType GetMapTypeByWarpData(struct WarpData *warp) { return GetMapTypeByGroupAndId(warp->mapGroup, warp->mapNum); } -u8 GetCurrentMapType(void) +enum MapType GetCurrentMapType(void) { return GetMapTypeByWarpData(&gSaveBlock1Ptr->location); } -u8 GetLastUsedWarpMapType(void) +enum MapType GetLastUsedWarpMapType(void) { return GetMapTypeByWarpData(&gLastUsedWarp); } -bool8 IsMapTypeOutdoors(u8 mapType) +bool8 IsMapTypeOutdoors(enum MapType mapType) { if (mapType == MAP_TYPE_ROUTE || mapType == MAP_TYPE_TOWN @@ -1445,7 +1448,7 @@ bool8 IsMapTypeOutdoors(u8 mapType) return FALSE; } -bool8 Overworld_MapTypeAllowsTeleportAndFly(u8 mapType) +bool8 Overworld_MapTypeAllowsTeleportAndFly(enum MapType mapType) { if (mapType == MAP_TYPE_ROUTE || mapType == MAP_TYPE_TOWN @@ -1456,7 +1459,7 @@ bool8 Overworld_MapTypeAllowsTeleportAndFly(u8 mapType) return FALSE; } -bool8 IsMapTypeIndoors(u8 mapType) +bool8 IsMapTypeIndoors(enum MapType mapType) { if (mapType == MAP_TYPE_INDOOR || mapType == MAP_TYPE_SECRET_BASE) @@ -1465,17 +1468,17 @@ bool8 IsMapTypeIndoors(u8 mapType) return FALSE; } -u8 GetSavedWarpRegionMapSectionId(void) +mapsec_u8_t GetSavedWarpRegionMapSectionId(void) { return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->dynamicWarp.mapGroup, gSaveBlock1Ptr->dynamicWarp.mapNum)->regionMapSectionId; } -u8 GetCurrentRegionMapSectionId(void) +mapsec_u8_t GetCurrentRegionMapSectionId(void) { return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)->regionMapSectionId; } -u8 GetCurrentMapBattleScene(void) +enum MapBattleScene GetCurrentMapBattleScene(void) { return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)->battleType; } @@ -1559,7 +1562,7 @@ const struct BlendSettings gTimeOfDayBlend[] = }; #define DEFAULT_WEIGHT 256 -#define TIME_BLEND_WEIGHT(begin, end) (DEFAULT_WEIGHT - (DEFAULT_WEIGHT * ((hours - begin) * MINUTES_PER_HOUR + minutes) / ((end - begin) * MINUTES_PER_HOUR))) +#define TIME_BLEND_WEIGHT(begin, end) (DEFAULT_WEIGHT - SAFE_DIV((DEFAULT_WEIGHT * ((hours - begin) * MINUTES_PER_HOUR + minutes)), ((end - begin) * MINUTES_PER_HOUR))) #define MORNING_HOUR_MIDDLE (MORNING_HOUR_BEGIN + ((MORNING_HOUR_END - MORNING_HOUR_BEGIN) / 2)) @@ -1622,7 +1625,7 @@ void UpdateTimeOfDay(void) #undef DEFAULT_WEIGHT // Whether a map type is naturally lit/outside -bool32 MapHasNaturalLight(u8 mapType) +bool32 MapHasNaturalLight(enum MapType mapType) { return (OW_ENABLE_DNS && (mapType == MAP_TYPE_TOWN @@ -1713,12 +1716,12 @@ static void OverworldBasic(void) gTimeUpdateCounter = (SECONDS_PER_MINUTE * 60 / FakeRtc_GetSecondsRatio()); UpdateTimeOfDay(); FormChangeTimeUpdate(); - if (bld0[0] != bld1[0] + if (MapHasNaturalLight(gMapHeader.mapType) && + (bld0[0] != bld1[0] || bld0[1] != bld1[1] - || bld0[2] != bld1[2]) + || bld0[2] != bld1[2])) { - UpdateAltBgPalettes(PALETTES_BG); - UpdatePalettesWithTime(PALETTES_ALL); + ApplyWeatherColorMapIfIdle(gWeatherPtr->colorMapIndex); } } } @@ -1796,6 +1799,10 @@ void CB2_NewGame(void) SetFieldVBlankCallback(); SetMainCallback1(CB1_Overworld); SetMainCallback2(CB2_Overworld); +#if OW_USE_FAKE_RTC + // Wall clock now track local time so we set it to 10AM to match initial wall clock time + RtcCalcLocalTimeOffset(0, 10, 0, 0); +#endif } void CB2_WhiteOut(void) @@ -1811,7 +1818,7 @@ void CB2_WhiteOut(void) ResetInitialPlayerAvatarState(); ScriptContext_Init(); UnlockPlayerFieldControls(); - if (IsFRLGWhiteout()) + if (IsWhiteoutCutscene()) gFieldCallback = FieldCB_RushInjuredPokemonToCenter; else gFieldCallback = FieldCB_WarpExitFadeFromBlack; @@ -2235,6 +2242,7 @@ static bool32 ReturnToFieldLocal(u8 *state) InitViewGraphics(); TryLoadTrainerHillEReaderPalette(); FollowerNPC_BindToSurfBlobOnReloadScreen(); + ResumeORASDowseFieldEffect(); (*state)++; break; case 2: @@ -3514,8 +3522,6 @@ bool8 GetSetItemObtained(u16 item, enum ItemObtainFlags caseId) return FALSE; } -#if OW_SHOW_ITEM_DESCRIPTIONS != OW_ITEM_DESCRIPTIONS_OFF - EWRAM_DATA static u8 sHeaderBoxWindowId = 0; EWRAM_DATA u8 sItemIconSpriteId = 0; EWRAM_DATA u8 sItemIconSpriteId2 = 0; @@ -3567,6 +3573,12 @@ static u8 ReformatItemDescription(u16 item, u8 *dest) void ScriptShowItemDescription(struct ScriptContext *ctx) { + if (OW_SHOW_ITEM_DESCRIPTIONS == OW_ITEM_DESCRIPTIONS_OFF) + { + (void) ScriptReadByte(ctx); + return; + } + u8 headerType = ScriptReadByte(ctx); Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); @@ -3610,6 +3622,9 @@ void ScriptShowItemDescription(struct ScriptContext *ctx) void ScriptHideItemDescription(struct ScriptContext *ctx) { + if (OW_SHOW_ITEM_DESCRIPTIONS == OW_ITEM_DESCRIPTIONS_OFF) + return; + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); DestroyItemIconSprite(); @@ -3685,17 +3700,6 @@ static void DestroyItemIconSprite(void) } } -#else -void ScriptShowItemDescription(struct ScriptContext *ctx) -{ - (void) ScriptReadByte(ctx); -} -void ScriptHideItemDescription(struct ScriptContext *ctx) -{ -} -#endif // OW_SHOW_ITEM_DESCRIPTIONS - - // returns old sHoursOverride u16 SetTimeOfDay(u16 hours) { diff --git a/src/palette.c b/src/palette.c index c4d65404d148..013a10db4728 100644 --- a/src/palette.c +++ b/src/palette.c @@ -2,10 +2,12 @@ #include "palette.h" #include "util.h" #include "decompress.h" +#include "field_weather.h" #include "malloc.h" #include "menu.h" #include "gpu_regs.h" #include "task.h" +#include "constants/field_weather.h" #include "constants/rgb.h" enum @@ -718,26 +720,46 @@ static void UpdateBlendRegisters(void) { SetGpuReg(REG_OFFSET_BLDCNT, (u16)gPaletteFadeBlendCnt); SetGpuReg(REG_OFFSET_BLDY, gPaletteFade.y); - // If fade-out, also adjust BLDALPHA and DISPCNT - if (!gPaletteFade.yDec) + // if TGT2 enabled, also adjust BLDALPHA and DISPCNT + if (((u16)gPaletteFadeBlendCnt) & BLDCNT_TGT2_ALL) { u16 bldAlpha = GetGpuReg(REG_OFFSET_BLDALPHA); u8 tgt1 = BLDALPHA_TGT1(bldAlpha); u8 tgt2 = BLDALPHA_TGT2(bldAlpha); - u8 bldFade; + u8 mode = (gPaletteFadeBlendCnt & BLDCNT_EFFECT_EFF_MASK) == BLDCNT_EFFECT_LIGHTEN ? FADE_FROM_WHITE : FADE_FROM_BLACK; + if (!gPaletteFade.yDec) + mode++; + + ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK); - switch (gPaletteFadeBlendCnt & BLDCNT_EFFECT_EFF_MASK) + switch (mode) { - // FADE_TO_BLACK - case BLDCNT_EFFECT_DARKEN: - bldFade = BLDALPHA_TGT1(max(0, 16 - gPaletteFade.y)); - SetGpuReg(REG_OFFSET_BLDALPHA, - BLDALPHA_BLEND(min(tgt1, bldFade), min(tgt2, bldFade))); + case FADE_FROM_BLACK: + // increment each target until reaching weather's values + SetGpuReg( + REG_OFFSET_BLDALPHA, + BLDALPHA_BLEND( + min(++tgt1, gWeatherPtr->currBlendEVA), + min(++tgt2, gWeatherPtr->currBlendEVB) + ) + ); + break; + case FADE_TO_BLACK: + bldAlpha = BLDALPHA_TGT1(max(0, 16 - gPaletteFade.y)); + SetGpuReg( + REG_OFFSET_BLDALPHA, + BLDALPHA_BLEND(min(tgt1, bldAlpha), min(tgt2, bldAlpha)) + ); break; - // FADE_TO_WHITE - case BLDCNT_EFFECT_LIGHTEN: - SetGpuReg(REG_OFFSET_BLDALPHA, - BLDALPHA_BLEND(min(++tgt1, 31), min(++tgt2, 31))); + // Not handled; blend sprites will pop in, + // but the effect coming from white looks okay + // case FADE_FROM_WHITE: + // break; + case FADE_TO_WHITE: + SetGpuReg( + REG_OFFSET_BLDALPHA, + BLDALPHA_BLEND(min(++tgt1, 31), min(++tgt2, 31)) + ); // cause display to show white when finished // (otherwise blend-mode sprites will still be visible) if (gPaletteFade.hardwareFadeFinishing && gPaletteFade.y >= 16) @@ -745,10 +767,6 @@ static void UpdateBlendRegisters(void) break; } } - else - { - ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK); - } if (gPaletteFade.hardwareFadeFinishing) { @@ -1253,7 +1271,7 @@ void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTa { u8 taskId; - taskId = CreateTask((void *)Task_BlendPalettesGradually, priority); + taskId = CreateTask(Task_BlendPalettesGradually, priority); gTasks[taskId].tCoeff = coeff; gTasks[taskId].tCoeffTarget = coeffTarget; diff --git a/src/party_menu.c b/src/party_menu.c index f05c42bd0a36..6c1be78b458a 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -18,6 +18,7 @@ #include "evolution_scene.h" #include "field_control_avatar.h" #include "field_effect.h" +#include "field_move.h" #include "field_player_avatar.h" #include "field_screen_effect.h" #include "field_specials.h" @@ -42,6 +43,7 @@ #include "menu_helpers.h" #include "menu_specialized.h" #include "metatile_behavior.h" +#include "move_relearner.h" #include "overworld.h" #include "palette.h" #include "party_menu.h" @@ -69,6 +71,7 @@ #include "constants/battle.h" #include "constants/battle_frontier.h" #include "constants/field_effects.h" +#include "constants/field_move.h" #include "constants/form_change_types.h" #include "constants/item_effects.h" #include "constants/items.h" @@ -97,6 +100,11 @@ enum { MENU_REGISTER, MENU_TRADE1, MENU_TRADE2, + MENU_LEVEL_UP_MOVES, + MENU_EGG_MOVES, + MENU_TM_MOVES, + MENU_TUTOR_MOVES, + MENU_SUB_MOVES, MENU_TOSS, MENU_CATALOG_BULB, MENU_CATALOG_OVEN, @@ -124,34 +132,12 @@ enum { ACTIONS_REGISTER, ACTIONS_TRADE, ACTIONS_SPIN_TRADE, + ACTIONS_MOVES_SUB, ACTIONS_TAKEITEM_TOSS, ACTIONS_ROTOM_CATALOG, ACTIONS_ZYGARDE_CUBE, }; -// In CursorCb_FieldMove, field moves <= FIELD_MOVE_WATERFALL are assumed to line up with the badge flags. -// Badge flag names are commented here for people searching for references to remove the badge requirement. -enum { - FIELD_MOVE_CUT, // FLAG_BADGE01_GET - FIELD_MOVE_FLASH, // FLAG_BADGE02_GET - FIELD_MOVE_ROCK_SMASH, // FLAG_BADGE03_GET - FIELD_MOVE_STRENGTH, // FLAG_BADGE04_GET - FIELD_MOVE_SURF, // FLAG_BADGE05_GET - FIELD_MOVE_FLY, // FLAG_BADGE06_GET - FIELD_MOVE_DIVE, // FLAG_BADGE07_GET - FIELD_MOVE_WATERFALL, // FLAG_BADGE08_GET - FIELD_MOVE_TELEPORT, - FIELD_MOVE_DIG, - FIELD_MOVE_SECRET_POWER, - FIELD_MOVE_MILK_DRINK, - FIELD_MOVE_SOFT_BOILED, - FIELD_MOVE_SWEET_SCENT, -#if OW_DEFOG_FIELD_MOVE == TRUE - FIELD_MOVE_DEFOG, -#endif - FIELD_MOVES_COUNT -}; - enum { PARTY_BOX_LEFT_COLUMN, PARTY_BOX_RIGHT_COLUMN, @@ -179,14 +165,6 @@ enum { #define MENU_DIR_RIGHT 2 #define MENU_DIR_LEFT -2 -#define HM_MOVES_END 0xFFFF - -static const u16 sHMMoves[] = -{ - MOVE_CUT, MOVE_FLY, MOVE_SURF, MOVE_STRENGTH, MOVE_FLASH, - MOVE_ROCK_SMASH, MOVE_WATERFALL, MOVE_DIVE, HM_MOVES_END -}; - enum { CAN_LEARN_MOVE, CANNOT_LEARN_MOVE, @@ -302,6 +280,7 @@ static bool8 IsMonAllowedInMinigame(u8); static void DisplayPartyPokemonDataToTeachMove(u8, u16); static u8 CanTeachMove(struct Pokemon *, u16); static void DisplayPartyPokemonBarDetail(u8, const u8 *, u8, const u8 *); +static void DisplayPartyPokemonBarDetailToFit(u8 windowId, const u8 *str, u8 color, const u8 *align, u32 width); static void DisplayPartyPokemonLevel(u8, struct PartyMenuBox *); static void DisplayPartyPokemonGender(u8, u16, u8 *, struct PartyMenuBox *); static void DisplayPartyPokemonHP(u16 hp, u16 maxHp, struct PartyMenuBox *menuBox); @@ -363,13 +342,13 @@ static void Task_CancelParticipationYesNo(u8); static void Task_HandleCancelParticipationYesNoInput(u8); static bool8 ShouldUseChooseMonText(void); static void SetPartyMonFieldSelectionActions(struct Pokemon *, u8); +static void SetPartyMonLearnMoveSelectionActions(struct Pokemon*, u8); static u8 GetPartyMenuActionsTypeInBattle(struct Pokemon *); static u8 GetPartySlotEntryStatus(s8); static void Task_UpdateHeldItemSprite(u8); static void Task_HandleSelectionMenuInput(u8); static void CB2_ShowPokemonSummaryScreen(void); static void UpdatePartyToBattleOrder(void); -static void CB2_ReturnToPartyMenuFromSummaryScreen(void); static void SlidePartyMenuBoxOneStep(u8); static void Task_SlideSelectedSlotsOffscreen(u8); static void SwitchPartyMon(void); @@ -435,6 +414,7 @@ static void CB2_ReturnToPartyMenuWhileLearningMove(void); static void Task_ReturnToPartyMenuWhileLearningMove(u8); static void DisplayPartyMenuForgotMoveMessage(u8); static void Task_PartyMenuReplaceMove(u8); +static void Task_HandleStopLearningMove(u8 taskId); static void Task_StopLearningMoveYesNo(u8); static void Task_HandleStopLearningMoveYesNoInput(u8); static void Task_TryLearningNextMoveAfterText(u8); @@ -454,7 +434,6 @@ static void Task_SacredAshDisplayHPRestored(u8); static void GiveItemOrMailToSelectedMon(u8); static void DisplayItemMustBeRemovedFirstMessage(u8); static void Task_SwitchItemsFromBagYesNo(u8); -static void RemoveItemToGiveFromBag(u16); static void CB2_WriteMailToGiveMonFromBag(void); static void GiveItemToSelectedMon(u8); static void Task_UpdateHeldItemSpriteAndClosePartyMenu(u8); @@ -506,6 +485,11 @@ static void CursorCb_Trade1(u8); static void CursorCb_Trade2(u8); static void CursorCb_Toss(u8); static void CursorCb_FieldMove(u8); +static void CursorCb_ChangeLevelUpMoves(u8); +static void CursorCb_ChangeEggMoves(u8); +static void CursorCb_ChangeTMMoves(u8); +static void CursorCb_ChangeTutorMoves(u8); +static void CursorCb_LearnMovesSubMenu(u8); static void CursorCb_CatalogBulb(u8); static void CursorCb_CatalogOven(u8); static void CursorCb_CatalogWashing(u8); @@ -514,14 +498,11 @@ static void CursorCb_CatalogFan(u8); static void CursorCb_CatalogMower(u8); static void CursorCb_ChangeForm(u8); static void CursorCb_ChangeAbility(u8); -static bool8 SetUpFieldMove_Surf(void); -static bool8 SetUpFieldMove_Fly(void); -static bool8 SetUpFieldMove_Waterfall(void); -static bool8 SetUpFieldMove_Dive(void); void TryItemHoldFormChange(struct Pokemon *mon, s8 slotId); static void ShowMoveSelectWindow(u8 slot); static void Task_HandleWhichMoveInput(u8 taskId); static void Task_HideFollowerNPCForTeleport(u8); +static void FieldCallback_RockClimb(void); // static const data #include "data/party_menu.h" @@ -904,7 +885,7 @@ static bool8 AllocPartyMenuBgGfx(void) case 1: if (!IsDma3ManagerBusyWithBgCopy()) { - LZDecompressWram(gPartyMenuBg_Tilemap, sPartyBgTilemapBuffer); + DecompressDataWithHeaderWram(gPartyMenuBg_Tilemap, sPartyBgTilemapBuffer); sPartyMenuInternal->data[0]++; } break; @@ -1112,10 +1093,27 @@ static void DisplayPartyPokemonDataForContest(u8 slot) static void DisplayPartyPokemonDataForRelearner(u8 slot) { - if (GetNumberOfRelearnableMoves(&gPlayerParty[slot]) == 0) - DisplayPartyPokemonDescriptionData(slot, PARTYBOX_DESC_NOT_ABLE_2); - else - DisplayPartyPokemonDescriptionData(slot, PARTYBOX_DESC_ABLE_2); + struct Pokemon *mon = &gPlayerParty[slot]; + bool32 hasMoves = FALSE; + + switch (gMoveRelearnerState) + { + case MOVE_RELEARNER_EGG_MOVES: + hasMoves = HasRelearnerEggMoves(mon); + break; + case MOVE_RELEARNER_TM_MOVES: + hasMoves = HasRelearnerTMMoves(mon); + break; + case MOVE_RELEARNER_TUTOR_MOVES: + hasMoves = HasRelearnerTutorMoves(mon); + break; + default: + hasMoves = HasRelearnerLevelUpMoves(mon); + break; + } + + u32 desc = (hasMoves ? PARTYBOX_DESC_ABLE_2 : PARTYBOX_DESC_NOT_ABLE_2); + DisplayPartyPokemonDescriptionData(slot, desc); } static void DisplayPartyPokemonDataForWirelessMinigame(u8 slot) @@ -1199,7 +1197,7 @@ static void DisplayPartyPokemonDataForMultiBattle(u8 slot) StringCopy(gStringVar1, gMultiPartnerParty[actualSlot].nickname); StringGet_Nickname(gStringVar1); ConvertInternationalPlayerName(gStringVar1); - DisplayPartyPokemonBarDetail(menuBox->windowId, gStringVar1, 0, menuBox->infoRects->dimensions); + DisplayPartyPokemonBarDetailToFit(menuBox->windowId, gStringVar1, 0, menuBox->infoRects->dimensions, 50); DisplayPartyPokemonLevel(gMultiPartnerParty[actualSlot].level, menuBox); DisplayPartyPokemonGender(gMultiPartnerParty[actualSlot].gender, gMultiPartnerParty[actualSlot].species, gMultiPartnerParty[actualSlot].nickname, menuBox); DisplayPartyPokemonHP(gMultiPartnerParty[actualSlot].hp, gMultiPartnerParty[actualSlot].maxhp, menuBox); @@ -1542,12 +1540,14 @@ static void HandleChooseMonSelection(u8 taskId, s8 *slotPtr) } case PARTY_ACTION_SEND_MON_TO_BOX: { - u8 partyId = GetPartyIdFromBattleSlot((u8)*slotPtr); - if (partyId == 0 || ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && partyId == 2) - || ((gBattleTypeFlags & BATTLE_TYPE_MULTI) && partyId >= (PARTY_SIZE / 2))) + u8 partyId = (u8)*slotPtr; + if ((gBattleTypeFlags & BATTLE_TYPE_MULTI) && partyId >= (PARTY_SIZE / 2)) { - // Can't select if mon is currently on the field, or doesn't belong to you + // Can't select if mon doesn't belong to you PlaySE(SE_FAILURE); + DisplayPartyMenuMessage(gText_CannotSendMonToBoxPartner, FALSE); + ScheduleBgCopyTilemapToVram(2); + gTasks[taskId].func = Task_ReturnToChooseMonAfterText; } else if (DoesSelectedMonKnowHM((u8 *)slotPtr)) { @@ -1559,7 +1559,7 @@ static void HandleChooseMonSelection(u8 taskId, s8 *slotPtr) else { PlaySE(SE_SELECT); - gSelectedMonPartyId = partyId; + gSelectedMonPartyId = GetPartyIdFromBattleSlot(partyId); Task_ClosePartyMenu(taskId); } break; @@ -1591,14 +1591,8 @@ static bool8 DoesSelectedMonKnowHM(u8 *slotPtr) for (u32 i = 0; i < MAX_MON_MOVES; i++) { - u32 j = 0; - u16 move = GetMonData(&gPlayerParty[*slotPtr], MON_DATA_MOVE1 + i); - - while (sHMMoves[j] != HM_MOVES_END) - { - if (sHMMoves[j++] == move) - return TRUE; - } + if (IsMoveHM(GetMonData(&gPlayerParty[*slotPtr], MON_DATA_MOVE1 + i))) + return TRUE; } return FALSE; } @@ -2806,9 +2800,15 @@ static u8 DisplaySelectionWindow(u8 windowType) for (i = 0; i < sPartyMenuInternal->numActions; i++) { const u8 *text; - u8 fontColorsId = (sPartyMenuInternal->actions[i] >= MENU_FIELD_MOVES) ? 4 : 3; + u8 fontColorsId = 3; + + if (sPartyMenuInternal->actions[i] >= MENU_FIELD_MOVES) + fontColorsId = 4; + if (sPartyMenuInternal->actions[i] >= MENU_LEVEL_UP_MOVES && sPartyMenuInternal->actions[i] <= MENU_SUB_MOVES) + fontColorsId = 6; + if (sPartyMenuInternal->actions[i] >= MENU_FIELD_MOVES) - text = GetMoveName(sFieldMoves[sPartyMenuInternal->actions[i] - MENU_FIELD_MOVES]); + text = GetMoveName(FieldMove_GetMoveId(sPartyMenuInternal->actions[i] - MENU_FIELD_MOVES)); else text = sCursorOptions[sPartyMenuInternal->actions[i]].text; @@ -2854,6 +2854,11 @@ static void SetPartyMonSelectionActions(struct Pokemon *mons, u8 slotId, u8 acti { SetPartyMonFieldSelectionActions(mons, slotId); } + else if (action == ACTIONS_MOVES_SUB && P_PARTY_MOVE_RELEARNER) + { + sPartyMenuInternal->numActions = 0; + SetPartyMonLearnMoveSelectionActions(mons, slotId); + } else { sPartyMenuInternal->numActions = sPartyMenuActionCounts[action]; @@ -2869,12 +2874,18 @@ static void SetPartyMonFieldSelectionActions(struct Pokemon *mons, u8 slotId) sPartyMenuInternal->numActions = 0; AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, MENU_SUMMARY); + if (P_PARTY_MOVE_RELEARNER + && (GetMonData(&mons[slotId], MON_DATA_SPECIES) + && (HasRelearnerLevelUpMoves(&mons[slotId]) || HasRelearnerEggMoves(&mons[slotId]) + || HasRelearnerTMMoves(&mons[slotId]) || HasRelearnerTutorMoves(&mons[slotId])))) + AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, MENU_SUB_MOVES); + // Add field moves to action list for (i = 0; i < MAX_MON_MOVES; i++) { for (j = 0; j != FIELD_MOVES_COUNT; j++) { - if (GetMonData(&mons[slotId], i + MON_DATA_MOVE1) == sFieldMoves[j]) + if (GetMonData(&mons[slotId], i + MON_DATA_MOVE1) == FieldMove_GetMoveId(j)) { AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, j + MENU_FIELD_MOVES); break; @@ -2894,6 +2905,32 @@ static void SetPartyMonFieldSelectionActions(struct Pokemon *mons, u8 slotId) AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, MENU_CANCEL1); } +static void SetPartyMonLearnMoveSelectionActions(struct Pokemon *mons, u8 slotId) +{ + if (GetMonData(&mons[slotId], MON_DATA_SPECIES) != SPECIES_NONE && HasRelearnerLevelUpMoves(&mons[slotId])) + AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, MENU_LEVEL_UP_MOVES); + + if (P_ENABLE_MOVE_RELEARNERS || (P_FLAG_EGG_MOVES != 0 && FlagGet(P_FLAG_EGG_MOVES))) + { + if (GetMonData(&mons[slotId], MON_DATA_SPECIES) != SPECIES_NONE && HasRelearnerEggMoves(&mons[slotId])) + AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, MENU_EGG_MOVES); + } + + if (P_ENABLE_MOVE_RELEARNERS || P_TM_MOVES_RELEARNER) + { + if (GetMonData(&mons[slotId], MON_DATA_SPECIES) != SPECIES_NONE && HasRelearnerTMMoves(&mons[slotId])) + AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, MENU_TM_MOVES); + } + + if (P_ENABLE_MOVE_RELEARNERS || (P_FLAG_TUTOR_MOVES != 0 && FlagGet(P_FLAG_TUTOR_MOVES))) + { + if (GetMonData(&mons[slotId], MON_DATA_SPECIES) != SPECIES_NONE && HasRelearnerTutorMoves(&mons[slotId])) + AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, MENU_TUTOR_MOVES); + } + + AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, MENU_CANCEL1); +} + static u8 GetPartyMenuActionsType(struct Pokemon *mon) { u32 actionType; @@ -3045,13 +3082,17 @@ static void CB2_ShowPokemonSummaryScreen(void) UpdatePartyToBattleOrder(); ShowPokemonSummaryScreen(SUMMARY_MODE_LOCK_MOVES, gPlayerParty, gPartyMenu.slotId, gPlayerPartyCount - 1, CB2_ReturnToPartyMenuFromSummaryScreen); } + else if (gPartyMenu.menuType == PARTY_MENU_TYPE_CHOOSE_HALF) + { + ShowPokemonSummaryScreen(SUMMARY_MODE_LOCK_MOVES, gPlayerParty, gPartyMenu.slotId, gPlayerPartyCount - 1, CB2_ReturnToPartyMenuFromSummaryScreen); + } else { ShowPokemonSummaryScreen(SUMMARY_MODE_NORMAL, gPlayerParty, gPartyMenu.slotId, gPlayerPartyCount - 1, CB2_ReturnToPartyMenuFromSummaryScreen); } } -static void CB2_ReturnToPartyMenuFromSummaryScreen(void) +void CB2_ReturnToPartyMenuFromSummaryScreen(void) { gPaletteFade.bufferTransferDisabled = TRUE; gPartyMenu.slotId = gLastViewedMonIndex; @@ -3359,7 +3400,7 @@ static void CursorCb_Give(u8 taskId) static void CB2_SelectBagItemToGive(void) { - if (InBattlePyramid() == FALSE) + if (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE) GoToBagMenu(ITEMMENULOCATION_PARTY, POCKETS_COUNT, CB2_GiveHoldItem); else GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_PARTY, CB2_GiveHoldItem); @@ -3975,7 +4016,7 @@ static void CursorCb_FieldMove(u8 taskId) const struct MapHeader *mapHeader; PlaySE(SE_SELECT); - if (sFieldMoveCursorCallbacks[fieldMove].fieldMoveFunc == NULL) + if (gFieldMoveInfo[fieldMove].fieldMoveFunc == NULL) return; PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]); @@ -3985,19 +4026,19 @@ static void CursorCb_FieldMove(u8 taskId) if (fieldMove == FIELD_MOVE_MILK_DRINK || fieldMove == FIELD_MOVE_SOFT_BOILED) DisplayPartyMenuStdMessage(PARTY_MSG_CANT_USE_HERE); else - DisplayPartyMenuStdMessage(sFieldMoveCursorCallbacks[fieldMove].msgId); + DisplayPartyMenuStdMessage(FieldMove_GetPartyMsgID(fieldMove)); gTasks[taskId].func = Task_CancelAfterAorBPress; } else { // All field moves before WATERFALL are HMs. - if (fieldMove <= FIELD_MOVE_WATERFALL && FlagGet(FLAG_BADGE01_GET + fieldMove) != TRUE) + if (!IsFieldMoveUnlocked(fieldMove)) { DisplayPartyMenuMessage(gText_CantUseUntilNewBadge, TRUE); gTasks[taskId].func = Task_ReturnToChooseMonAfterText; } - else if (sFieldMoveCursorCallbacks[fieldMove].fieldMoveFunc() == TRUE) + else if (SetUpFieldMove(fieldMove) == TRUE) { switch (fieldMove) { @@ -4041,7 +4082,7 @@ static void CursorCb_FieldMove(u8 taskId) DisplayCantUseFlashMessage(); break; default: - DisplayPartyMenuStdMessage(sFieldMoveCursorCallbacks[fieldMove].msgId); + DisplayPartyMenuStdMessage(FieldMove_GetPartyMsgID(fieldMove)); break; } gTasks[taskId].func = Task_CancelAfterAorBPress; @@ -4172,7 +4213,7 @@ static void FieldCallback_Surf(void) FieldEffectStart(FLDEFF_USE_SURF); } -static bool8 SetUpFieldMove_Surf(void) +bool32 SetUpFieldMove_Surf(void) { if (!CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_SURF)) return FALSE; @@ -4194,7 +4235,7 @@ static void DisplayCantUseSurfMessage(void) DisplayPartyMenuStdMessage(PARTY_MSG_CANT_SURF_HERE); } -static bool8 SetUpFieldMove_Fly(void) +bool32 SetUpFieldMove_Fly(void) { if (!CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_LEAVE_ROUTE)) return FALSE; @@ -4216,7 +4257,7 @@ static void FieldCallback_Waterfall(void) FieldEffectStart(FLDEFF_USE_WATERFALL); } -static bool8 SetUpFieldMove_Waterfall(void) +bool32 SetUpFieldMove_Waterfall(void) { s16 x, y; @@ -4233,13 +4274,28 @@ static bool8 SetUpFieldMove_Waterfall(void) return FALSE; } +bool32 SetUpFieldMove_RockClimb(void) +{ + s16 x, y; + + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(x, y))) + { + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = FieldCallback_RockClimb; + return TRUE; + } + + return FALSE; +} + static void FieldCallback_Dive(void) { gFieldEffectArguments[0] = GetCursorSelectionMonId(); FieldEffectStart(FLDEFF_USE_DIVE); } -static bool8 SetUpFieldMove_Dive(void) +bool32 SetUpFieldMove_Dive(void) { if (!CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_DIVE)) return FALSE; @@ -4559,6 +4615,12 @@ void CB2_ShowPartyMenuForItemUse(void) u8 msgId; TaskFunc task; + if (gPartyMenu.data1 == DATA1_PARTY_MENU_FROM_FIELD) + { + callback = CB2_ReturnToField; + gPartyMenu.data1 = 0; + } + if (gMain.inBattle) { menuType = PARTY_MENU_TYPE_IN_BATTLE; @@ -4586,7 +4648,7 @@ void CB2_ShowPartyMenuForItemUse(void) } else { - if (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_TM_HM) + if (GetItemPocket(gSpecialVar_ItemId) == POCKET_TM_HM) msgId = PARTY_MSG_TEACH_WHICH_MON; else msgId = PARTY_MSG_USE_ON_WHICH_MON; @@ -4599,7 +4661,7 @@ void CB2_ShowPartyMenuForItemUse(void) static void CB2_ReturnToBagMenu(void) { - if (InBattlePyramid() == FALSE) + if (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE) GoToBagMenu(ITEMMENULOCATION_LAST, POCKETS_COUNT, NULL); else GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_PREV, gPyramidBagMenuState.exitCallback); @@ -4831,8 +4893,8 @@ void Task_AbilityCapsule(u8 taskId) { case 0: // Can't use. - if (gSpeciesInfo[tSpecies].abilities[0] == gSpeciesInfo[tSpecies].abilities[1] - || gSpeciesInfo[tSpecies].abilities[1] == 0 + if (GetSpeciesAbility(tSpecies, 0) == GetSpeciesAbility(tSpecies, 1) + || GetSpeciesAbility(tSpecies, 1) == 0 || tAbilityNum > 1 || !tSpecies) { @@ -4919,7 +4981,7 @@ void Task_AbilityPatch(u8 taskId) { case 0: // Can't use. - if (gSpeciesInfo[tSpecies].abilities[tAbilityNum] == 0 + if (GetSpeciesAbility(tSpecies, tAbilityNum) == 0 || !tSpecies ) { @@ -5247,13 +5309,13 @@ static void ShowMoveSelectWindow(u8 slot) { u8 i; u8 moveCount = 0; - u8 fontId = FONT_NORMAL; u8 windowId = DisplaySelectionWindow(SELECTWINDOW_MOVES); u16 move; for (i = 0; i < MAX_MON_MOVES; i++) { move = GetMonData(&gPlayerParty[slot], MON_DATA_MOVE1 + i); + u8 fontId = GetFontIdToFit(GetMoveName(move), FONT_NORMAL, 0, 72); AddTextPrinterParameterized(windowId, fontId, GetMoveName(move), 8, (i * 16) + 1, TEXT_SKIP_DRAW, NULL); if (move != MOVE_NONE) moveCount++; @@ -5379,7 +5441,7 @@ void ItemUseCB_PPUp(u8 taskId, TaskFunc task) u16 ItemIdToBattleMoveId(u16 item) { - return (GetItemPocket(item) == POCKET_TM_HM) ? gItemsInfo[item].secondaryId : MOVE_NONE; + return (GetItemPocket(item) == POCKET_TM_HM) ? GetItemTMHMMoveId(item) : MOVE_NONE; } bool8 MonKnowsMove(struct Pokemon *mon, u16 move) @@ -5592,11 +5654,28 @@ static void Task_PartyMenuReplaceMove(u8 taskId) static void StopLearningMovePrompt(u8 taskId) { + if (P_ASK_MOVE_CONFIRMATION == FALSE) + { + struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; + GetMonNickname(mon, gStringVar1); + } + StringCopy(gStringVar2, GetMoveName(gPartyMenu.data1)); - StringExpandPlaceholders(gStringVar4, gText_StopLearningMove2); + StringExpandPlaceholders(gStringVar4, (P_ASK_MOVE_CONFIRMATION) ? gText_StopLearningMove2 : gText_MoveNotLearned); DisplayPartyMenuMessage(gStringVar4, TRUE); ScheduleBgCopyTilemapToVram(2); - gTasks[taskId].func = Task_StopLearningMoveYesNo; + gTasks[taskId].func = (P_ASK_MOVE_CONFIRMATION) ? Task_StopLearningMoveYesNo : Task_HandleStopLearningMove; +} + +static void Task_HandleStopLearningMove(u8 taskId) +{ + if (IsPartyMenuTextPrinterActive() != TRUE) + { + if (gPartyMenu.learnMoveState == 1) + gTasks[taskId].func = Task_TryLearningNextMoveAfterText; + else + gTasks[taskId].func = Task_ClosePartyMenuAfterText; + } } static void Task_StopLearningMoveYesNo(u8 taskId) @@ -6113,13 +6192,14 @@ void ItemUseCB_EvolutionStone(u8 taskId, TaskFunc task) #define tAnimWait data[2] #define tNextFunc 3 -#define fusionType data[7] -#define firstFusion data[8] -#define firstFusionSlot data[9] -#define fusionResult data[10] -#define secondFusionSlot data[11] -#define unfuseSecondMon data[12] -#define moveToLearn data[13] +#define fusionType data[6] +#define firstFusion data[7] +#define firstFusionSlot data[8] +#define fusionResult data[9] +#define secondFusionSlot data[10] +#define unfuseSecondMon data[11] +#define moveToLearn data[12] +#define tExtraMoveHandling data[13] #define forgetMove data[14] #define storageIndex data[15] @@ -6254,6 +6334,79 @@ static void RestoreFusionMon(struct Pokemon *mon) } } +static void DeleteInvalidFusionMoves(struct Pokemon *mon, u32 species) +{ + for (u32 i = 0; i < MAX_MON_MOVES; i++) + { + u32 move = GetMonData(mon, MON_DATA_MOVE1 + i); + bool32 toDelete = TRUE; + const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species); + for (u32 j = 0; learnset[j].move != LEVEL_UP_MOVE_END;j++) + { + if (learnset[j].move == move) + { + toDelete = FALSE; + break; + } + } + if (!toDelete) + continue; + const u16 *learnset2 = GetSpeciesTeachableLearnset(species); + for (u32 j = 0; learnset2[j] != MOVE_UNAVAILABLE;j++) + { + if (learnset2[j] == move) + { + toDelete = FALSE; + break; + } + } + if (!toDelete) + continue; + const u16 *learnset3 = GetSpeciesEggMoves(species); + for (u32 j = 0; learnset3[j] != MOVE_UNAVAILABLE;j++) + { + if (learnset3[j] == move) + { + toDelete = FALSE; + break; + } + } + if (toDelete) + DeleteMove(mon, move); + } +} + +#if P_FUSION_FORMS +static void SwapFusionMonMoves(struct Pokemon *mon, const u16 moveTable[][2], u32 mode) +{ + u32 oldMoveIndex, newMoveIndex; + if (mode == FUSE_MON) + { + oldMoveIndex = 0; + newMoveIndex = 1; + } + else //mode == UNFUSE_MON + { + oldMoveIndex = 1; + newMoveIndex = 0; + } + for (u32 i = 0; i < MAX_MON_MOVES; i++) + { + u32 move = GetMonData(mon, MON_DATA_MOVE1 + i); + for (u32 j = 0; j < 2; j++) + { + if (move == moveTable[j][oldMoveIndex]) + { + u32 pp = GetMovePP(moveTable[j][newMoveIndex]); + SetMonData(mon, MON_DATA_MOVE1 + i, &moveTable[j][newMoveIndex]); + SetMonData(mon, MON_DATA_PP1 + i, &pp); + } + } + } + +} +#endif //P_FUSION_FORMS + static void Task_TryItemUseFusionChange(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gTasks[taskId].firstFusionSlot]; @@ -6345,15 +6498,42 @@ static void Task_TryItemUseFusionChange(u8 taskId) case 6: if (!IsPartyMenuTextPrinterActive()) { - if (gTasks[taskId].moveToLearn != 0) + if (gTasks[taskId].fusionType == FUSE_MON) { - if (gTasks[taskId].fusionType == FUSE_MON) +#if P_FUSION_FORMS +#if P_FAMILY_KYUREM +#if P_FAMILY_RESHIRAM + if (gTasks[taskId].tExtraMoveHandling == SWAP_EXTRA_MOVES_KYUREM_WHITE) + SwapFusionMonMoves(mon, gKyuremWhiteSwapMoveTable, FUSE_MON); +#endif //P_FAMILY_RESHIRAM +#if P_FAMILY_ZEKROM + if (gTasks[taskId].tExtraMoveHandling == SWAP_EXTRA_MOVES_KYUREM_BLACK) + SwapFusionMonMoves(mon, gKyuremBlackSwapMoveTable, FUSE_MON); +#endif //P_FAMILY_ZEKROM +#endif //P_FAMILY_KYUREM +#endif //P_FUSION_FORMS + if (gTasks[taskId].moveToLearn != 0) FormChangeTeachMove(taskId, gTasks[taskId].moveToLearn, gTasks[taskId].firstFusionSlot); - else + } + else //(gTasks[taskId].fusionType == UNFUSE_MON) + { +#if P_FUSION_FORMS +#if P_FAMILY_KYUREM +#if P_FAMILY_RESHIRAM + if (gTasks[taskId].tExtraMoveHandling == SWAP_EXTRA_MOVES_KYUREM_WHITE) + SwapFusionMonMoves(mon, gKyuremWhiteSwapMoveTable, UNFUSE_MON); +#endif //P_FAMILY_RESHIRAM +#if P_FAMILY_ZEKROM + if (gTasks[taskId].tExtraMoveHandling == SWAP_EXTRA_MOVES_KYUREM_BLACK) + SwapFusionMonMoves(mon, gKyuremBlackSwapMoveTable, UNFUSE_MON); +#endif //P_FAMILY_ZEKROM +#endif //P_FAMILY_KYUREM +#endif //P_FUSION_FORMS + if ( gTasks[taskId].tExtraMoveHandling == FORGET_EXTRA_MOVES) { - DeleteMove(mon, gTasks[taskId].forgetMove); + DeleteInvalidFusionMoves(mon, gTasks[taskId].fusionResult); if (!DoesMonHaveAnyMoves(mon)) - FormChangeTeachMove(taskId, gTasks[taskId].moveToLearn, gTasks[taskId].firstFusionSlot); + FormChangeTeachMove(taskId, MOVE_CONFUSION, gTasks[taskId].firstFusionSlot); } } gTasks[taskId].tState++; @@ -6400,7 +6580,7 @@ void ItemUseCB_Fusion(u8 taskId, TaskFunc taskFunc) task->storageIndex = itemFusion[i].fusionStorageIndex; task->fusionResult = itemFusion[i].targetSpecies1; task->unfuseSecondMon = itemFusion[i].targetSpecies2; - task->moveToLearn = itemFusion[i].unfuseForgetMove; + task->tExtraMoveHandling = itemFusion[i].extraMoveHandling; task->forgetMove = itemFusion[i].fusionMove; TryItemUseFusionChange(taskId, taskFunc); return; @@ -6440,6 +6620,7 @@ void ItemUseCB_Fusion(u8 taskId, TaskFunc taskFunc) task->fusionResult = itemFusion[i].fusingIntoMon; task->secondFusionSlot = gPartyMenu.slotId; task->moveToLearn = itemFusion[i].fusionMove; + task->tExtraMoveHandling = itemFusion[i].extraMoveHandling; // Start Fusion TryItemUseFusionChange(taskId, taskFunc); return; @@ -6844,7 +7025,7 @@ void CB2_PartyMenuFromStartMenu(void) // As opposted to by selecting Give in the party menu, which is handled by CursorCb_Give void CB2_ChooseMonToGiveItem(void) { - MainCallback callback = (InBattlePyramid() == FALSE) ? CB2_ReturnToBagMenu : CB2_ReturnToPyramidBagMenu; + MainCallback callback = (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE) ? CB2_ReturnToBagMenu : CB2_ReturnToPyramidBagMenu; InitPartyMenu(PARTY_MENU_TYPE_FIELD, PARTY_LAYOUT_SINGLE, PARTY_ACTION_GIVE_ITEM, FALSE, PARTY_MSG_GIVE_TO_WHICH_MON, Task_HandleChooseMonInput, callback); gPartyMenu.bagItem = gSpecialVar_ItemId; } @@ -6871,7 +7052,7 @@ static void GiveItemOrMailToSelectedMon(u8 taskId) { if (ItemIsMail(gPartyMenu.bagItem)) { - RemoveItemToGiveFromBag(gPartyMenu.bagItem); + RemoveBagItem(gPartyMenu.bagItem, 1); sPartyMenuInternal->exitCallback = CB2_WriteMailToGiveMonFromBag; Task_ClosePartyMenu(taskId); } @@ -6890,7 +7071,7 @@ static void GiveItemToSelectedMon(u8 taskId) item = gPartyMenu.bagItem; DisplayGaveHeldItemMessage(&gPlayerParty[gPartyMenu.slotId], item, FALSE, 1); GiveItemToMon(&gPlayerParty[gPartyMenu.slotId], item); - RemoveItemToGiveFromBag(item); + RemoveBagItem(item, 1); gTasks[taskId].func = Task_UpdateHeldItemSpriteAndClosePartyMenu; } } @@ -6969,7 +7150,7 @@ static void Task_HandleSwitchItemsFromBagYesNoInput(u8 taskId) { case 0: // Yes, switch items item = gPartyMenu.bagItem; - RemoveItemToGiveFromBag(item); + RemoveBagItem(item, 1); if (AddBagItem(sPartyMenuItemId, 1) == FALSE) { ReturnGiveItemToBagOrPC(item); @@ -7005,14 +7186,6 @@ static void DisplayItemMustBeRemovedFirstMessage(u8 taskId) gTasks[taskId].func = Task_UpdateHeldItemSpriteAndClosePartyMenu; } -static void RemoveItemToGiveFromBag(u16 item) -{ - if (gPartyMenu.action == PARTY_ACTION_GIVE_PC_ITEM) // Unused, never occurs - RemovePCItem(item, 1); - else - RemoveBagItem(item, 1); -} - // Returns FALSE if there was no space to return the item // but there always should be, and the return is ignored in all uses static bool8 ReturnGiveItemToBagOrPC(u16 item) @@ -7411,19 +7584,12 @@ static void BufferBattlePartyOrderBySide(u8 *partyBattleOrder, u8 flankId, u8 ba { u8 partyIndexes[PARTY_SIZE]; int i, j; - u8 leftBattler; - u8 rightBattler; + u8 leftBattler; if (IsOnPlayerSide(battler)) - { leftBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - rightBattler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); - } else - { leftBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - rightBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); - } if (IsMultiBattle() == TRUE) { @@ -7456,6 +7622,12 @@ static void BufferBattlePartyOrderBySide(u8 *partyBattleOrder, u8 flankId, u8 ba } else { + u8 rightBattler; + if (IsOnPlayerSide(battler)) + rightBattler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); + else + rightBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); + j = 2; partyIndexes[0] = gBattlerPartyIndexes[leftBattler]; partyIndexes[1] = gBattlerPartyIndexes[rightBattler]; @@ -7768,6 +7940,7 @@ static void Task_ChoosePartyMon(u8 taskId) void ChooseMonForMoveRelearner(void) { + gRelearnMode = RELEARN_MODE_SCRIPT; LockPlayerFieldControls(); FadeScreen(FADE_TO_BLACK, 0); CreateTask(Task_ChooseMonForMoveRelearner, 10); @@ -7787,9 +7960,27 @@ static void CB2_ChooseMonForMoveRelearner(void) { gSpecialVar_0x8004 = GetCursorSelectionMonId(); if (gSpecialVar_0x8004 >= PARTY_SIZE) + { gSpecialVar_0x8004 = PARTY_NOTHING_CHOSEN; + } else - gSpecialVar_0x8005 = GetNumberOfRelearnableMoves(&gPlayerParty[gSpecialVar_0x8004]); + { + switch(gMoveRelearnerState) + { + case MOVE_RELEARNER_EGG_MOVES: + gSpecialVar_0x8005 = HasRelearnerEggMoves(&gPlayerParty[gSpecialVar_0x8004]); + break; + case MOVE_RELEARNER_TM_MOVES: + gSpecialVar_0x8005 = HasRelearnerTMMoves(&gPlayerParty[gSpecialVar_0x8004]); + break; + case MOVE_RELEARNER_TUTOR_MOVES: + gSpecialVar_0x8005 = HasRelearnerTutorMoves(&gPlayerParty[gSpecialVar_0x8004]); + break; + default: + gSpecialVar_0x8005 = HasRelearnerLevelUpMoves(&gPlayerParty[gSpecialVar_0x8004]); + break; + } + } gFieldCallback2 = CB2_FadeFromPartyMenu; SetMainCallback2(CB2_ReturnToField); } @@ -7919,6 +8110,62 @@ void IsLastMonThatKnowsSurf(void) } } +static void CursorCb_ChangeLevelUpMoves(u8 taskId) +{ + PlaySE(SE_SELECT); + gMoveRelearnerState = MOVE_RELEARNER_LEVEL_UP_MOVES; + gRelearnMode = RELEARN_MODE_PARTY_MENU; + gLastViewedMonIndex = gPartyMenu.slotId; + gSpecialVar_0x8004 = gLastViewedMonIndex; + TeachMoveRelearnerMove(); + Task_ClosePartyMenu(taskId); +} + +static void CursorCb_ChangeEggMoves(u8 taskId) +{ + PlaySE(SE_SELECT); + gMoveRelearnerState = MOVE_RELEARNER_EGG_MOVES; + gRelearnMode = RELEARN_MODE_PARTY_MENU; + gLastViewedMonIndex = gPartyMenu.slotId; + gSpecialVar_0x8004 = gLastViewedMonIndex; + TeachMoveRelearnerMove(); + Task_ClosePartyMenu(taskId); +} + +static void CursorCb_ChangeTMMoves(u8 taskId) +{ + PlaySE(SE_SELECT); + gMoveRelearnerState = MOVE_RELEARNER_TM_MOVES; + gRelearnMode = RELEARN_MODE_PARTY_MENU; + gLastViewedMonIndex = gPartyMenu.slotId; + gSpecialVar_0x8004 = gLastViewedMonIndex; + TeachMoveRelearnerMove(); + Task_ClosePartyMenu(taskId); +} + +static void CursorCb_ChangeTutorMoves(u8 taskId) +{ + PlaySE(SE_SELECT); + gMoveRelearnerState = MOVE_RELEARNER_TUTOR_MOVES; + gRelearnMode = RELEARN_MODE_PARTY_MENU; + gLastViewedMonIndex = gPartyMenu.slotId; + gSpecialVar_0x8004 = gLastViewedMonIndex; + TeachMoveRelearnerMove(); + Task_ClosePartyMenu(taskId); +} + +static void CursorCb_LearnMovesSubMenu(u8 taskId) +{ + PlaySE(SE_SELECT); + PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]); + PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]); + SetPartyMonSelectionActions(gPlayerParty, gPartyMenu.slotId, ACTIONS_MOVES_SUB); + DisplaySelectionWindow(SELECTWINDOW_ACTIONS); + DisplayPartyMenuStdMessage(PARTY_MSG_DO_WHAT_WITH_MON); + gTasks[taskId].data[0] = 0xFF; + gTasks[taskId].func = Task_HandleSelectionMenuInput; +} + void CursorCb_MoveItemCallback(u8 taskId) { u16 item1, item2; @@ -8027,3 +8274,9 @@ void CursorCb_MoveItem(u8 taskId) gTasks[taskId].func = Task_UpdateHeldItemSprite; } } + +static void FieldCallback_RockClimb(void) +{ + gFieldEffectArguments[0] = GetCursorSelectionMonId(); + FieldEffectStart(FLDEFF_USE_ROCK_CLIMB); +} diff --git a/src/player_pc.c b/src/player_pc.c index ebc720e0a6ba..6adb6e17ba64 100644 --- a/src/player_pc.c +++ b/src/player_pc.c @@ -369,7 +369,7 @@ static const u8 sSwapArrowTextColors[] = {TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRA void NewGameInitPCItems(void) { u8 i = 0; - ClearItemSlots(gSaveBlock1Ptr->pcItems, PC_ITEMS_COUNT); + CpuFastFill(0, gSaveBlock1Ptr->pcItems, sizeof(gSaveBlock1Ptr->pcItems)); while (TRUE) { @@ -1334,7 +1334,7 @@ static void ItemStorage_FinishItemSwap(u8 taskId, bool8 canceled) if (!canceled && sItemStorageMenu->toSwapPos != newPos && sItemStorageMenu->toSwapPos != newPos - 1) { - MoveItemSlotInList(gSaveBlock1Ptr->pcItems, sItemStorageMenu->toSwapPos, newPos); + MoveItemSlotInPC(gSaveBlock1Ptr->pcItems, sItemStorageMenu->toSwapPos, newPos); ItemStorage_RefreshListMenu(); } if (sItemStorageMenu->toSwapPos < newPos) diff --git a/src/pokeball.c b/src/pokeball.c index 86b5bc9d9e18..2b36072e6013 100644 --- a/src/pokeball.c +++ b/src/pokeball.c @@ -11,6 +11,7 @@ #include "sprite.h" #include "task.h" #include "trig.h" +#include "test_runner.h" #include "util.h" #include "data.h" #include "item.h" @@ -544,6 +545,38 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = #define tBattler data[3] #define tOpponentBattler data[4] +const u16 gBallItemIds[POKEBALL_COUNT] = +{ + [BALL_STRANGE] = ITEM_STRANGE_BALL, + [BALL_POKE] = ITEM_POKE_BALL, + [BALL_GREAT] = ITEM_GREAT_BALL, + [BALL_ULTRA] = ITEM_ULTRA_BALL, + [BALL_MASTER] = ITEM_MASTER_BALL, + [BALL_PREMIER] = ITEM_PREMIER_BALL, + [BALL_HEAL] = ITEM_HEAL_BALL, + [BALL_NET] = ITEM_NET_BALL, + [BALL_NEST] = ITEM_NEST_BALL, + [BALL_DIVE] = ITEM_DIVE_BALL, + [BALL_DUSK] = ITEM_DUSK_BALL, + [BALL_TIMER] = ITEM_TIMER_BALL, + [BALL_QUICK] = ITEM_QUICK_BALL, + [BALL_REPEAT] = ITEM_REPEAT_BALL, + [BALL_LUXURY] = ITEM_LUXURY_BALL, + [BALL_LEVEL] = ITEM_LEVEL_BALL, + [BALL_LURE] = ITEM_LURE_BALL, + [BALL_MOON] = ITEM_MOON_BALL, + [BALL_FRIEND] = ITEM_FRIEND_BALL, + [BALL_LOVE] = ITEM_LOVE_BALL, + [BALL_FAST] = ITEM_FAST_BALL, + [BALL_HEAVY] = ITEM_HEAVY_BALL, + [BALL_DREAM] = ITEM_DREAM_BALL, + [BALL_SAFARI] = ITEM_SAFARI_BALL, + [BALL_SPORT] = ITEM_SPORT_BALL, + [BALL_PARK] = ITEM_PARK_BALL, + [BALL_BEAST] = ITEM_BEAST_BALL, + [BALL_CHERISH] = ITEM_CHERISH_BALL, +}; + u8 DoPokeballSendOutAnimation(u32 battler, s16 pan, u8 kindOfThrow) { u8 taskId; @@ -565,8 +598,8 @@ static void Task_DoPokeballSendOutAnim(u8 taskId) { u32 throwCaseId, ballId, battler, ballSpriteId; bool32 notSendOut = FALSE; - u32 throwXoffset = (B_ENEMY_THROW_BALLS >= GEN_6) ? 24 : 0; - s32 throwYoffset = (B_ENEMY_THROW_BALLS >= GEN_6) ? -16 : 24; + u32 throwXoffset = (B_ENEMY_THROW_BALLS >= GEN_6 && !gTestRunnerHeadless) ? 24 : 0; + s32 throwYoffset = (B_ENEMY_THROW_BALLS >= GEN_6 && !gTestRunnerHeadless) ? -16 : 24; if (gTasks[taskId].tFrames == 0) { @@ -643,7 +676,7 @@ static inline void DoPokeballSendOutSoundEffect(u32 battler) static inline void *GetOpponentMonSendOutCallback(void) { - return (B_ENEMY_THROW_BALLS >= GEN_6) ? SpriteCB_MonSendOut_1 : SpriteCB_OpponentMonSendOut; + return (B_ENEMY_THROW_BALLS >= GEN_6 && !gTestRunnerHeadless) ? SpriteCB_MonSendOut_1 : SpriteCB_OpponentMonSendOut; } // This sequence of functions is very similar to those that get run when @@ -1080,8 +1113,11 @@ static void HandleBallAnimEnd(struct Sprite *sprite) AnimateSprite(&gSprites[gBattlerSpriteIds[battler]]); gSprites[gBattlerSpriteIds[battler]].data[1] = 0x1000; } + else + { + gSprites[gBattlerSpriteIds[battler]].invisible = FALSE; + } - gSprites[gBattlerSpriteIds[battler]].invisible = FALSE; if (sprite->animEnded) sprite->invisible = TRUE; if (gSprites[gBattlerSpriteIds[battler]].affineAnimEnded) @@ -1170,7 +1206,7 @@ static void SpriteCB_MonSendOut_2(struct Sprite *sprite) u32 r7; bool32 rightPosition = (IsBattlerPlayer(sprite->sBattler)) ? B_POSITION_PLAYER_RIGHT : B_POSITION_OPPONENT_RIGHT; - if (HIBYTE(sprite->data[7]) >= 35 && HIBYTE(sprite->data[7]) < 80) + if (HIBYTE(sprite->data[7]) >= 35 && HIBYTE(sprite->data[7]) < 80 && !gTestRunnerHeadless) { s16 r4; @@ -1211,7 +1247,8 @@ static void SpriteCB_MonSendOut_2(struct Sprite *sprite) sprite->data[0] = 0; if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->introAnimActive - && sprite->sBattler == GetBattlerAtPosition(rightPosition)) + && sprite->sBattler == GetBattlerAtPosition(rightPosition) + && !gTestRunnerHeadless) sprite->callback = SpriteCB_ReleaseMon2FromBall; else sprite->callback = SpriteCB_ReleaseMonFromBall; @@ -1234,12 +1271,15 @@ static void SpriteCB_ReleaseMon2FromBall(struct Sprite *sprite) static void SpriteCB_OpponentMonSendOut(struct Sprite *sprite) { + if (gTestRunnerHeadless) + sprite->data[0] = 15; sprite->data[0]++; if (sprite->data[0] > 15) { sprite->data[0] = 0; if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->introAnimActive - && sprite->sBattler == GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)) + && sprite->sBattler == GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT) + && !gTestRunnerHeadless) sprite->callback = SpriteCB_ReleaseMon2FromBall; else sprite->callback = SpriteCB_ReleaseMonFromBall; @@ -1499,7 +1539,7 @@ void StartHealthboxSlideIn(u8 battler) healthboxSprite->y2 = -healthboxSprite->y2; } gSprites[healthboxSprite->data[5]].callback(&gSprites[healthboxSprite->data[5]]); - if (GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT) + if (GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT && !gTestRunnerHeadless) healthboxSprite->callback = SpriteCB_HealthboxSlideInDelayed; } @@ -1567,7 +1607,7 @@ void LoadBallGfx(u8 ballId) case BALL_REPEAT: case BALL_SAFARI: var = GetSpriteTileStartByTag(gBallSpriteSheets[ballId].tag); - LZDecompressVram(gOpenPokeballGfx, (void *)(OBJ_VRAM0 + 0x100 + var * 32)); + DecompressDataWithHeaderVram(gOpenPokeballGfx, (void *)(OBJ_VRAM0 + 0x100 + var * 32)); break; } } diff --git a/src/pokeblock.c b/src/pokeblock.c index 41d68ed8d6f9..d26a271f9c59 100644 --- a/src/pokeblock.c +++ b/src/pokeblock.c @@ -62,7 +62,7 @@ enum { struct PokeblockMenuStruct { u8 tilemap[BG_SCREEN_SIZE]; - void (*callbackOnUse)(void); + MainCallback callbackOnUse; const u8 *pokeblockActionIds; u8 numActions; u8 caseId; @@ -80,7 +80,7 @@ struct PokeblockMenuStruct struct PokeblockSavedData { - void (*callback)(void); + MainCallback callback; u16 selectedRow; u16 scrollOffset; }; @@ -653,7 +653,7 @@ static bool8 LoadPokeblockMenuGfx(void) case 1: if (FreeTempTileDataBuffersIfPossible() != TRUE) { - LZDecompressWram(gMenuPokeblock_Tilemap, sPokeblockMenu->tilemap); + DecompressDataWithHeaderWram(gMenuPokeblock_Tilemap, sPokeblockMenu->tilemap); sPokeblockMenu->gfxState++; } break; diff --git a/src/pokeblock_feed.c b/src/pokeblock_feed.c index ef83dc6edae0..6a50a1d4b6d4 100644 --- a/src/pokeblock_feed.c +++ b/src/pokeblock_feed.c @@ -697,7 +697,7 @@ static bool8 LoadMonAndSceneGfx(struct Pokemon *mon) case 7: if (FreeTempTileDataBuffersIfPossible() != TRUE) { - LZDecompressWram(gPokeblockFeedBg_Tilemap, sPokeblockFeed->tilemapBuffer); + DecompressDataWithHeaderWram(gPokeblockFeedBg_Tilemap, sPokeblockFeed->tilemapBuffer); sPokeblockFeed->loadGfxState++; } break; diff --git a/src/pokedex.c b/src/pokedex.c index 5078f5ca943f..d8265a4cee19 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -1,5 +1,6 @@ #include "global.h" #include "battle_main.h" +#include "battle_script_commands.h" #include "bg.h" #include "data.h" #include "decompress.h" @@ -1425,7 +1426,7 @@ static const u8 sOrderOptions[] = ORDER_SMALLEST, }; -static const u8 sDexSearchTypeIds[NUMBER_OF_MON_TYPES] = +static const enum Type sDexSearchTypeIds[NUMBER_OF_MON_TYPES] = { TYPE_NONE, TYPE_NORMAL, @@ -4021,8 +4022,8 @@ static void HighlightSubmenuScreenSelectBarItem(u8 a, u16 b) #define tPalTimer data[2] #define tMonSpriteId data[3] #define tIsShiny data[13] -#define tPersonalityLo data[14] -#define tPersonalityHi data[15] +#define tPersonalityLo 14 +#define tPersonalityHi 15 u8 DisplayCaughtMonDexPage(u16 species, bool32 isShiny, u32 personality) { @@ -4035,16 +4036,34 @@ u8 DisplayCaughtMonDexPage(u16 species, bool32 isShiny, u32 personality) gTasks[taskId].tState = 0; gTasks[taskId].tSpecies = species; gTasks[taskId].tIsShiny = isShiny; - gTasks[taskId].tPersonalityLo = personality; - gTasks[taskId].tPersonalityHi = personality >> 16; + gTasks[taskId].data[tPersonalityLo] = personality; + gTasks[taskId].data[tPersonalityHi] = personality >> 16; return taskId; } +static void LoadDexMonPalette(u32 taskId, bool32 isShiny) +{ + const u16 *paletteData = GetMonSpritePalFromSpeciesAndPersonality(gTasks[taskId].tSpecies, isShiny, GetWordTaskArg(taskId, tPersonalityLo)); + u32 paletteNum = gSprites[gTasks[taskId].tMonSpriteId].oam.paletteNum; + LoadPalette(paletteData, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); +} + +u32 Pokedex_CreateCaughtMonSprite(u32 species, s32 x, s32 y) +{ + u32 spriteId; + + SetMultiuseSpriteTemplateToPokemon(species, GetCatchingBattler()); + spriteId = CreateSprite(&gMultiuseSpriteTemplate, x, y, 0); + gSprites[spriteId].oam.priority = 0; + gSprites[spriteId].callback = SpriteCallbackDummy; + return spriteId; +} + static void Task_DisplayCaughtMonDexPage(u8 taskId) { u8 spriteId; u16 species = gTasks[taskId].tSpecies; - u16 dexNum = SpeciesToNationalPokedexNum(species); + enum NationalDexOrder dexNum = SpeciesToNationalPokedexNum(species); switch (gTasks[taskId].tState) { @@ -4087,11 +4106,13 @@ static void Task_DisplayCaughtMonDexPage(u8 taskId) gTasks[taskId].tState++; break; case 4: - spriteId = CreateMonPicSprite(species, FALSE, ((u16)gTasks[taskId].tPersonalityHi << 16) | (u16)gTasks[taskId].tPersonalityLo, TRUE, MON_PAGE_X, MON_PAGE_Y, 0, TAG_NONE); + // We're using a different mon sprite creation method, because we don't have enough memory to safely use CreateMonPicSprite. + spriteId = Pokedex_CreateCaughtMonSprite(species, MON_PAGE_X, MON_PAGE_Y); + gTasks[taskId].tMonSpriteId = spriteId; + LoadDexMonPalette(taskId, FALSE); gSprites[spriteId].oam.priority = 0; BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); SetVBlankCallback(gPokedexVBlankCB); - gTasks[taskId].tMonSpriteId = spriteId; gTasks[taskId].tState++; break; case 5: @@ -4138,9 +4159,6 @@ static void Task_ExitCaughtMonPage(u8 taskId) if (!gPaletteFade.active) { bool32 isShiny; - u32 personality; - u8 paletteNum; - const u16 *paletteData; void *buffer; SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); @@ -4153,10 +4171,7 @@ static void Task_ExitCaughtMonPage(u8 taskId) Free(buffer); isShiny = (bool8)gTasks[taskId].tIsShiny; - personality = ((u16)gTasks[taskId].tPersonalityHi << 16) | (u16)gTasks[taskId].tPersonalityLo; - paletteNum = gSprites[gTasks[taskId].tMonSpriteId].oam.paletteNum; - paletteData = GetMonSpritePalFromSpeciesAndPersonality(gTasks[taskId].tSpecies, isShiny, personality); - LoadPalette(paletteData, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); + LoadDexMonPalette(taskId, isShiny); DestroyTask(taskId); } } @@ -4513,7 +4528,7 @@ static u8* ConvertMeasurementToMetricString(u32 num, u32* index) return string; } -s8 GetSetPokedexFlag(u16 nationalDexNo, u8 caseID) +s8 GetSetPokedexFlag(enum NationalDexOrder nationalDexNo, u8 caseID) { u32 index, bit, mask; s8 retVal = 0; @@ -4890,7 +4905,7 @@ static u32 GetPokedexMonPersonality(u16 species) } } -u16 CreateMonSpriteFromNationalDexNumber(u16 nationalNum, s16 x, s16 y, u16 paletteSlot) +u16 CreateMonSpriteFromNationalDexNumber(enum NationalDexOrder nationalNum, s16 x, s16 y, u16 paletteSlot) { nationalNum = NationalPokedexNumToSpecies(nationalNum); return CreateMonPicSprite(nationalNum, FALSE, GetPokedexMonPersonality(nationalNum), TRUE, x, y, paletteSlot, TAG_NONE); @@ -4925,12 +4940,12 @@ static u16 CreateSizeScreenTrainerPic(u16 species, s16 x, s16 y, s8 paletteSlot) return CreateTrainerPicSprite(species, TRUE, x, y, paletteSlot, TAG_NONE); } -static int DoPokedexSearch(u8 dexMode, u8 order, u8 abcGroup, u8 bodyColor, u8 type1, u8 type2) +static int DoPokedexSearch(u8 dexMode, u8 order, u8 abcGroup, enum BodyColor bodyColor, enum Type type1, enum Type type2) { u16 species; u16 i; u16 resultsCount; - u8 types[2]; + enum Type types[2]; CreatePokedexList(dexMode, order); @@ -4995,8 +5010,8 @@ static int DoPokedexSearch(u8 dexMode, u8 order, u8 abcGroup, u8 bodyColor, u8 t { species = NationalPokedexNumToSpecies(sPokedexView->pokedexList[i].dexNum); - types[0] = gSpeciesInfo[species].types[0]; - types[1] = gSpeciesInfo[species].types[1]; + types[0] = GetSpeciesType(species, 0); + types[1] = GetSpeciesType(species, 1); if (types[0] == type1 || types[1] == type1) { sPokedexView->pokedexList[resultsCount] = sPokedexView->pokedexList[i]; @@ -5013,8 +5028,8 @@ static int DoPokedexSearch(u8 dexMode, u8 order, u8 abcGroup, u8 bodyColor, u8 t { species = NationalPokedexNumToSpecies(sPokedexView->pokedexList[i].dexNum); - types[0] = gSpeciesInfo[species].types[0]; - types[1] = gSpeciesInfo[species].types[1]; + types[0] = GetSpeciesType(species, 0); + types[1] = GetSpeciesType(species, 1); if ((types[0] == type1 && types[1] == type2) || (types[0] == type2 && types[1] == type1)) { sPokedexView->pokedexList[resultsCount] = sPokedexView->pokedexList[i]; @@ -5336,9 +5351,9 @@ static void Task_StartPokedexSearch(u8 taskId) u8 dexMode = GetSearchModeSelection(taskId, SEARCH_MODE); u8 order = GetSearchModeSelection(taskId, SEARCH_ORDER); u8 abcGroup = GetSearchModeSelection(taskId, SEARCH_NAME); - u8 bodyColor = GetSearchModeSelection(taskId, SEARCH_COLOR); - u8 type1 = GetSearchModeSelection(taskId, SEARCH_TYPE_LEFT); - u8 type2 = GetSearchModeSelection(taskId, SEARCH_TYPE_RIGHT); + enum BodyColor bodyColor = GetSearchModeSelection(taskId, SEARCH_COLOR); + enum Type type1 = GetSearchModeSelection(taskId, SEARCH_TYPE_LEFT); + enum Type type2 = GetSearchModeSelection(taskId, SEARCH_TYPE_RIGHT); DoPokedexSearch(dexMode, order, abcGroup, bodyColor, type1, type2); gTasks[taskId].func = Task_WaitAndCompleteSearch; diff --git a/src/pokedex_area_region_map.c b/src/pokedex_area_region_map.c index 06bd05a87b89..2725b5f2d313 100644 --- a/src/pokedex_area_region_map.c +++ b/src/pokedex_area_region_map.c @@ -9,10 +9,10 @@ static EWRAM_DATA u8 *sPokedexAreaMapBgNum = NULL; static const u16 ALIGNED(4) sPokedexAreaMap_Pal[] = INCBIN_U16("graphics/pokedex/region_map.gbapal"); -static const u32 sPokedexAreaMap_Gfx[] = INCBIN_U32("graphics/pokedex/region_map.8bpp.lz"); -static const u32 sPokedexAreaMap_Tilemap[] = INCBIN_U32("graphics/pokedex/region_map.bin.lz"); -static const u32 sPokedexAreaMapAffine_Gfx[] = INCBIN_U32("graphics/pokedex/region_map_affine.8bpp.lz"); -static const u32 sPokedexAreaMapAffine_Tilemap[] = INCBIN_U32("graphics/pokedex/region_map_affine.bin.lz"); +static const u32 sPokedexAreaMap_Gfx[] = INCBIN_U32("graphics/pokedex/region_map.8bpp.smol"); +static const u32 sPokedexAreaMap_Tilemap[] = INCBIN_U32("graphics/pokedex/region_map.bin.smolTM"); +static const u32 sPokedexAreaMapAffine_Gfx[] = INCBIN_U32("graphics/pokedex/region_map_affine.8bpp.smol"); +static const u32 sPokedexAreaMapAffine_Tilemap[] = INCBIN_U32("graphics/pokedex/region_map_affine.bin.smolTM"); void LoadPokedexAreaMapGfx(const struct PokedexAreaMapTemplate *template) { diff --git a/src/pokedex_area_screen.c b/src/pokedex_area_screen.c index 93866817d2ba..76e3b71c6cef 100644 --- a/src/pokedex_area_screen.c +++ b/src/pokedex_area_screen.c @@ -1,5 +1,6 @@ #include "global.h" #include "bg.h" +#include "decompress.h" #include "event_data.h" #include "gpu_regs.h" #include "graphics.h" @@ -74,7 +75,7 @@ struct OverworldArea { u8 mapGroup; u8 mapNum; - u16 regionMapSectionId; + mapsec_u16_t regionMapSectionId; }; struct @@ -95,7 +96,7 @@ struct /*0x61C*/ u16 areaShadeBldArgHi; /*0x61E*/ bool8 showingMarkers; /*0x61F*/ u8 markerFlashCounter; - /*0x620*/ u16 specialAreaRegionMapSectionIds[MAX_AREA_MARKERS]; + /*0x620*/ mapsec_u16_t specialAreaRegionMapSectionIds[MAX_AREA_MARKERS]; /*0x660*/ struct Sprite *areaMarkerSprites[MAX_AREA_MARKERS]; /*0x6E0*/ u16 numAreaMarkerSprites; /*0x6E2*/ u16 alteringCaveCounter; @@ -115,7 +116,7 @@ static void FindMapsWithMon(u16); static void BuildAreaGlowTilemap(void); static void SetAreaHasMon(u16, u16); static void SetSpecialMapHasMon(u16, u16); -static u16 GetRegionMapSectionId(u8, u8); +static mapsec_u16_t GetRegionMapSectionId(u8, u8); static bool8 MapHasSpecies(const struct WildEncounterTypes *, u16); static bool8 MonListHasSpecies(const struct WildPokemonInfo *, u16, u16); static void DoAreaGlow(void); @@ -136,14 +137,14 @@ static void ClearAreaWindowLabel(enum PokedexAreaLabels labelId); bool32 ShouldShowAreaUnknownLabel(void); static const u32 sAreaGlow_Pal[] = INCBIN_U32("graphics/pokedex/area_glow.gbapal"); -static const u32 sAreaGlow_Gfx[] = INCBIN_U32("graphics/pokedex/area_glow.4bpp.lz"); +static const u32 sAreaGlow_Gfx[] = INCBIN_U32("graphics/pokedex/area_glow.4bpp.smol"); -static const u32 sPokedexPlusHGSS_ScreenSelectBarSubmenu_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/SelectBar.bin.lz"); +static const u32 sPokedexPlusHGSS_ScreenSelectBarSubmenu_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/SelectBar.bin.smolTM"); static void LoadHGSSScreenSelectBarSubmenu(void); static const u16 sSpeciesHiddenFromAreaScreen[] = { SPECIES_WYNAUT }; -static const u16 sMovingRegionMapSections[3] = +static const mapsec_u16_t sMovingRegionMapSections[3] = { MAPSEC_MARINE_CAVE, MAPSEC_UNDERWATER_MARINE_CAVE, @@ -156,7 +157,7 @@ static const u16 sFeebasData[][3] = {NUM_SPECIES} }; -static const u16 sLandmarkData[][2] = +static const mapsec_u16_t sLandmarkData[][2] = { {MAPSEC_SKY_PILLAR, FLAG_LANDMARK_SKY_PILLAR}, {MAPSEC_SEAFLOOR_CAVERN, FLAG_LANDMARK_SEAFLOOR_CAVERN}, @@ -247,7 +248,7 @@ static const struct WindowTemplate sTimeOfDayWindowLabelTemplates[] = .baseBlock = 0x16C }, - [DEX_AREA_LABEL_AREA_UNKNOWN] = + [DEX_AREA_LABEL_AREA_UNKNOWN] = { .bg = LABEL_WINDOW_BG, .tilemapLeft = 12, @@ -388,7 +389,7 @@ static void SetSpecialMapHasMon(u16 mapGroup, u16 mapNum) if (sPokedexAreaScreen->numSpecialAreas < MAX_AREA_MARKERS) { - u16 regionMapSectionId = GetRegionMapSectionId(mapGroup, mapNum); + mapsec_u16_t regionMapSectionId = GetRegionMapSectionId(mapGroup, mapNum); if (regionMapSectionId < MAPSEC_NONE) { // Don't highlight the area if it's a moving area (Marine/Terra Cave) @@ -422,7 +423,7 @@ static void SetSpecialMapHasMon(u16 mapGroup, u16 mapNum) } } -static u16 GetRegionMapSectionId(u8 mapGroup, u8 mapNum) +static mapsec_u16_t GetRegionMapSectionId(u8 mapGroup, u8 mapNum) { return Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum)->regionMapSectionId; } @@ -946,7 +947,7 @@ static void CreateAreaMarkerSprites(void) s16 x; s16 y; s16 i; - s16 mapSecId; + mapsec_u16_t mapSecId; s16 numSprites; LoadSpriteSheet(&sAreaMarkerSpriteSheet); @@ -1000,7 +1001,7 @@ static void LoadAreaUnknownGraphics(void) .size = sizeof(sPokedexAreaScreen->areaUnknownGraphicsBuffer), .tag = TAG_AREA_UNKNOWN, }; - LZ77UnCompWram(gPokedexAreaScreenAreaUnknown_Gfx, sPokedexAreaScreen->areaUnknownGraphicsBuffer); + DecompressDataWithHeaderWram(gPokedexAreaScreenAreaUnknown_Gfx, sPokedexAreaScreen->areaUnknownGraphicsBuffer); LoadSpriteSheet(&spriteSheet); LoadSpritePalette(&sAreaUnknownSpritePalette); } diff --git a/src/pokedex_cry_screen.c b/src/pokedex_cry_screen.c index 2fb3d55a2455..810a8dae6a78 100644 --- a/src/pokedex_cry_screen.c +++ b/src/pokedex_cry_screen.c @@ -72,7 +72,7 @@ static const u8 sCryMeterNeedle_Gfx[] = INCBIN_U8("graphics/pokedex/cry_meter_ne static const u16 sCryMeter_Tilemap[] = INCBIN_U16("graphics/pokedex/cry_meter_map.bin"); // Unused static const u16 sCryMeter_Pal[] = INCBIN_U16("graphics/pokedex/cry_meter.gbapal"); -static const u8 sCryMeter_Gfx[] = INCBIN_U8("graphics/pokedex/cry_meter.4bpp.lz"); +static const u8 sCryMeter_Gfx[] = INCBIN_U8("graphics/pokedex/cry_meter.4bpp.smol"); static const u16 sWaveformOffsets[][72] = { @@ -228,7 +228,7 @@ static const struct SpritePalette sCryMeterNeedleSpritePalettes[] = bool8 LoadCryWaveformWindow(struct CryScreenWindow *window, u8 windowId) { u8 i; - u8 finished = FALSE; + bool32 finished = FALSE; switch (gDexCryScreenState) { diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 6541e9d3a75c..2adf0d57a177 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -2,6 +2,7 @@ #include "battle_main.h" #include "battle_util.h" #include "bg.h" +#include "contest.h" #include "contest_effect.h" #include "data.h" #include "daycare.h" @@ -239,30 +240,30 @@ static const u16 sPokedexPlusHGSS_Default_dark_Pal[] = INCBIN_U16("graphics/poke static const u16 sPokedexPlusHGSS_National_dark_Pal[] = INCBIN_U16("graphics/pokedex/hgss/palette_national_dark.gbapal"); static const u16 sPokedexPlusHGSS_MenuSearch_dark_Pal[] = INCBIN_U16("graphics/pokedex/hgss/palette_search_menu_dark.gbapal"); static const u16 sPokedexPlusHGSS_SearchResults_dark_Pal[] = INCBIN_U16("graphics/pokedex/hgss/palette_search_results_dark.gbapal"); -static const u32 sPokedexPlusHGSS_MenuList_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu_list.4bpp.lz"); -static const u32 sPokedexPlusHGSS_MenuList_DECA_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu_list_DECA.4bpp.lz"); -static const u32 sPokedexPlusHGSS_Interface_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_interface.4bpp.lz"); -static const u32 sPokedexPlusHGSS_Interface_DECA_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_interface_DECA.4bpp.lz"); -static const u32 sPokedexPlusHGSS_Menu_1_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu1.4bpp.lz"); -static const u32 sPokedexPlusHGSS_Menu_2_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu2.4bpp.lz"); -static const u32 sPokedexPlusHGSS_Menu_3_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu3.4bpp.lz"); -static const u32 sPokedexPlusHGSS_MenuSearch_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu_search.4bpp.lz"); -static const u32 sPokedexPlusHGSS_MenuSearch_DECA_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu_search_DECA.4bpp.lz"); -static const u32 sPokedexPlusHGSS_StartMenuMain_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_start_menu.bin.lz"); -static const u32 sPokedexPlusHGSS_StartMenuSearchResults_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_start_menu_search_results.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenSelectBarSubmenu_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/SelectBar.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenSelectBarSubmenu_Tilemap_Clear[] = INCBIN_U32("graphics/pokedex/hgss/SelectBar_clear.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenList_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_list_screen.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenListUnderlay_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_list_screen_underlay.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenInfo_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_info_screen.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenStats_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_stats_screen.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenEvolution_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_evo_screen.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenEvolution_Tilemap_PE[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_evo_screen_PE.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenForms_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_forms_screen.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenCry_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_cry_screen.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenSize_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_size_screen.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenSearchHoenn_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_search_screen_hoenn.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenSearchNational_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_search_screen_national.bin.lz"); +static const u32 sPokedexPlusHGSS_MenuList_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu_list.4bpp.smol"); +static const u32 sPokedexPlusHGSS_MenuList_DECA_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu_list_DECA.4bpp.smol"); +static const u32 sPokedexPlusHGSS_Interface_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_interface.4bpp.smol"); +static const u32 sPokedexPlusHGSS_Interface_DECA_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_interface_DECA.4bpp.smol"); +static const u32 sPokedexPlusHGSS_Menu_1_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu1.4bpp.smol"); +static const u32 sPokedexPlusHGSS_Menu_2_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu2.4bpp.smol"); +static const u32 sPokedexPlusHGSS_Menu_3_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu3.4bpp.smol"); +static const u32 sPokedexPlusHGSS_MenuSearch_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu_search.4bpp.smol"); +static const u32 sPokedexPlusHGSS_MenuSearch_DECA_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu_search_DECA.4bpp.smol"); +static const u32 sPokedexPlusHGSS_StartMenuMain_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_start_menu.bin.smolTM"); +static const u32 sPokedexPlusHGSS_StartMenuSearchResults_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_start_menu_search_results.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenSelectBarSubmenu_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/SelectBar.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenSelectBarSubmenu_Tilemap_Clear[] = INCBIN_U32("graphics/pokedex/hgss/SelectBar_clear.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenList_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_list_screen.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenListUnderlay_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_list_screen_underlay.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenInfo_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_info_screen.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenStats_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_stats_screen.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenEvolution_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_evo_screen.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenEvolution_Tilemap_PE[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_evo_screen_PE.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenForms_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_forms_screen.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenCry_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_cry_screen.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenSize_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_size_screen.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenSearchHoenn_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_search_screen_hoenn.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenSearchNational_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_search_screen_national.bin.smolTM"); #define SCROLLING_MON_X 146 @@ -290,9 +291,9 @@ static EWRAM_DATA u16 sLastSelectedPokemon = 0; static EWRAM_DATA u8 sPokeBallRotation = 0; static EWRAM_DATA struct PokedexListItem *sPokedexListItem = NULL; //Pokedex Plus HGSS_Ui -#define MOVES_COUNT_TOTAL (EGG_MOVES_ARRAY_COUNT + MAX_LEVEL_UP_MOVES + NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES) +#define MOVES_COUNT_TOTAL (EGG_MOVES_ARRAY_COUNT + MAX_LEVEL_UP_MOVES + NUM_ALL_MACHINES) EWRAM_DATA static u16 sStatsMoves[MOVES_COUNT_TOTAL] = {0}; -EWRAM_DATA static u16 sStatsMovesTMHM_ID[NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES] = {0}; +EWRAM_DATA static u16 sStatsMovesTMHM_ID[NUM_ALL_MACHINES] = {0}; struct SearchOptionText @@ -354,15 +355,15 @@ struct PokemonStats u8 evYield_Defense; u8 evYield_SpDefense; u8 catchRate; - u8 growthRate; + enum GrowthRate growthRate:8; u8 eggGroup1; u8 eggGroup2; u8 eggCycles; u16 expYield; u8 friendship; - u16 ability0; - u16 ability1; - u16 abilityHidden; + enum Ability ability0; + enum Ability ability1; + enum Ability abilityHidden; }; struct EvoScreenData @@ -590,7 +591,7 @@ static void Task_SwitchScreensFromFormsScreen(u8 taskId); static void Task_ExitFormsScreen(u8 taskId); //Physical/Special/Status category icon -static u8 ShowCategoryIcon(u32 category); +static u8 ShowCategoryIcon(enum DamageCategory category); static void DestroyCategoryIcon(void); static u16 NationalPokedexNumToSpeciesHGSS(u16 nationalNum); @@ -1913,7 +1914,7 @@ static const u8 sOrderOptions[] = ORDER_SMALLEST, }; -static const u8 sDexSearchTypeIds[NUMBER_OF_MON_TYPES] = +static const enum Type sDexSearchTypeIds[NUMBER_OF_MON_TYPES] = { TYPE_NONE, TYPE_NORMAL, @@ -2421,6 +2422,8 @@ static bool8 LoadPokedexListPage(u8 page) // when returning to search results after selecting an evo, we have to restore // the original dexNum because the search results page doesn't rebuild the list sPokedexListItem->dexNum = sPokedexView->originalSearchSelectionNum; + sPokedexListItem->seen = GetSetPokedexFlag(sPokedexView->originalSearchSelectionNum, FLAG_GET_SEEN); + sPokedexListItem->owned = GetSetPokedexFlag(sPokedexView->originalSearchSelectionNum, FLAG_GET_CAUGHT); sPokedexView->originalSearchSelectionNum = 0; } CreateMonSpritesAtPos(sPokedexView->selectedPokemon, 0xE); @@ -4086,11 +4089,17 @@ static void UNUSED HighlightScreenSelectBarItem(u8 selectedScreen, u16 unused) #define tPersonalityLo data[14] #define tPersonalityHi data[15] +// Types palettes need to be loaded at a different slot than anticipated by gTypesInfo +// to avoid overlapping with caught mon sprite palette slot +// Normal type info palette slots: 13, 14 and 15 +// Caught mon palette slot: 15 +#define TYPE_INFO_PALETTE_NUM_OFFSET -1 + void Task_DisplayCaughtMonDexPageHGSS(u8 taskId) { u8 spriteId; u16 species; - u16 dexNum; + enum NationalDexOrder dexNum; if (!POKEDEX_PLUS_HGSS) return; // prevents the compiler from emitting static .rodata // if the feature is disabled @@ -4148,13 +4157,18 @@ void Task_DisplayCaughtMonDexPageHGSS(u8 taskId) gTasks[taskId].tState++; break; case 4: - spriteId = CreateMonSpriteFromNationalDexNumberHGSS(dexNum, MON_PAGE_X, MON_PAGE_Y, 0); - gSprites[spriteId].oam.priority = 0; + { + u32 personality = ((u16)gTasks[taskId].tPersonalityHi << 16) | (u16)gTasks[taskId].tPersonalityLo; + const u16 *paletteData = GetMonSpritePalFromSpeciesAndPersonality(species, FALSE, personality); + + spriteId = Pokedex_CreateCaughtMonSprite(species, MON_PAGE_X, MON_PAGE_Y); + LoadPalette(paletteData, OBJ_PLTT_ID(gSprites[spriteId].oam.paletteNum), PLTT_SIZE_4BPP); BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); SetVBlankCallback(gPokedexVBlankCB); gTasks[taskId].tMonSpriteId = spriteId; gTasks[taskId].tState++; break; + } case 5: SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); @@ -4228,6 +4242,13 @@ static void Task_ExitCaughtMonPage(u8 taskId) paletteNum = gSprites[gTasks[taskId].tMonSpriteId].oam.paletteNum; paletteData = GetMonSpritePalFromSpeciesAndPersonality(species, otId, personality); LoadPalette(paletteData, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); + + if (sPokedexView) + { + Free(sPokedexView); + sPokedexView = NULL; + } + DestroyTask(taskId); } } @@ -4320,14 +4341,7 @@ static void SetSpriteInvisibility(u8 spriteArrayId, bool8 invisible) { gSprites[sPokedexView->typeIconSpriteIds[spriteArrayId]].invisible = invisible; } -static const u8 sContestCategoryToOamPaletteNum[CONTEST_CATEGORIES_COUNT] = -{ - [CONTEST_CATEGORY_COOL] = 13, - [CONTEST_CATEGORY_BEAUTY] = 14, - [CONTEST_CATEGORY_CUTE] = 14, - [CONTEST_CATEGORY_SMART] = 15, - [CONTEST_CATEGORY_TOUGH] = 13, -}; + static void SetTypeIconPosAndPal(u8 typeId, u8 x, u8 y, u8 spriteArrayId) { struct Sprite *sprite; @@ -4335,16 +4349,16 @@ static void SetTypeIconPosAndPal(u8 typeId, u8 x, u8 y, u8 spriteArrayId) sprite = &gSprites[sPokedexView->typeIconSpriteIds[spriteArrayId]]; StartSpriteAnim(sprite, typeId); if (typeId < NUMBER_OF_MON_TYPES) - sprite->oam.paletteNum = gTypesInfo[typeId].palette; + sprite->oam.paletteNum = gTypesInfo[typeId].palette + TYPE_INFO_PALETTE_NUM_OFFSET; else - sprite->oam.paletteNum = sContestCategoryToOamPaletteNum[typeId - NUMBER_OF_MON_TYPES]; + sprite->oam.paletteNum = gContestCategoryInfo[typeId - NUMBER_OF_MON_TYPES].palette + TYPE_INFO_PALETTE_NUM_OFFSET; sprite->x = x + 16; sprite->y = y + 8; SetSpriteInvisibility(spriteArrayId, FALSE); } static void PrintCurrentSpeciesTypeInfo(u8 newEntry, u16 species) { - u8 type1, type2; + enum Type type1, type2; if (!newEntry) { @@ -4355,8 +4369,8 @@ static void PrintCurrentSpeciesTypeInfo(u8 newEntry, u16 species) type1 = GetTypeBySpecies(species, 1); type2 = GetTypeBySpecies(species, 2); #else - type1 = gSpeciesInfo[species].types[0]; - type2 = gSpeciesInfo[species].types[1]; + type1 = GetSpeciesType(species, 0); + type2 = GetSpeciesType(species, 1); #endif if (species == SPECIES_NONE) type1 = type2 = TYPE_MYSTERY; @@ -4378,7 +4392,8 @@ static void CreateTypeIconSprites(void) u8 i; LoadCompressedSpriteSheet(&gSpriteSheet_MoveTypes); - LoadPalette(gMoveTypes_Pal, 0x1D0, 0x60); + u32 paletteNum = gTypesInfo[TYPE_NORMAL].palette + TYPE_INFO_PALETTE_NUM_OFFSET; + LoadPalette(gMoveTypes_Pal, OBJ_PLTT_ID(paletteNum), 3 * PLTT_SIZE_4BPP); for (i = 0; i < 2; i++) { if (sPokedexView->typeIconSpriteIds[i] == 0xFF) @@ -4525,8 +4540,8 @@ static u32 GetPokedexMonPersonality(u16 species) static u16 CreateMonSpriteFromNationalDexNumberHGSS(u16 nationalNum, s16 x, s16 y, u16 paletteSlot) { - nationalNum = NationalPokedexNumToSpeciesHGSS(nationalNum); - return CreateMonPicSprite(nationalNum, FALSE, GetPokedexMonPersonality(nationalNum), TRUE, x, y, paletteSlot, TAG_NONE); + u32 species = NationalPokedexNumToSpeciesHGSS(nationalNum); + return CreateMonPicSprite(species, FALSE, GetPokedexMonPersonality(species), TRUE, x, y, paletteSlot, TAG_NONE); } static u16 GetPokemonScaleFromNationalDexNumber(u16 nationalNum) @@ -4558,6 +4573,7 @@ static u16 CreateSizeScreenTrainerPic(u16 species, s16 x, s16 y, s8 paletteSlot) return CreateTrainerPicSprite(species, TRUE, x, y, paletteSlot, TAG_NONE); } +#undef TYPE_INFO_PALETTE_NUM_OFFSET //************************************ //* * @@ -4701,7 +4717,7 @@ static void LoadTilesetTilemapHGSS(u8 page) } //Physical/Special/Status category -static u8 ShowCategoryIcon(u32 category) +static u8 ShowCategoryIcon(enum DamageCategory category) { if (sPokedexView->categoryIconSpriteId == 0xFF) sPokedexView->categoryIconSpriteId = CreateSprite(&gSpriteTemplate_CategoryIcons, 139, 90, 0); @@ -4777,12 +4793,12 @@ static void SaveMonDataInStruct(void) sPokedexView->sPokemonStats.species = species; sPokedexView->sPokemonStats.genderRatio = gSpeciesInfo[species].genderRatio; - sPokedexView->sPokemonStats.baseHP = gSpeciesInfo[species].baseHP; - sPokedexView->sPokemonStats.baseSpeed = gSpeciesInfo[species].baseSpeed; - sPokedexView->sPokemonStats.baseAttack = gSpeciesInfo[species].baseAttack; - sPokedexView->sPokemonStats.baseSpAttack = gSpeciesInfo[species].baseSpAttack; - sPokedexView->sPokemonStats.baseDefense = gSpeciesInfo[species].baseDefense; - sPokedexView->sPokemonStats.baseSpDefense = gSpeciesInfo[species].baseSpDefense; + sPokedexView->sPokemonStats.baseHP = GetSpeciesBaseHP(species); + sPokedexView->sPokemonStats.baseSpeed = GetSpeciesBaseSpeed(species); + sPokedexView->sPokemonStats.baseAttack = GetSpeciesBaseAttack(species); + sPokedexView->sPokemonStats.baseSpAttack = GetSpeciesBaseSpAttack(species); + sPokedexView->sPokemonStats.baseDefense = GetSpeciesBaseDefense(species); + sPokedexView->sPokemonStats.baseSpDefense = GetSpeciesBaseSpDefense(species); sPokedexView->sPokemonStats.differentEVs = differentEVs; sPokedexView->sPokemonStats.evYield_HP = evs[STAT_HP]; sPokedexView->sPokemonStats.evYield_Speed = evs[STAT_ATK]; @@ -4846,7 +4862,6 @@ static void Task_LoadStatsScreen(u8 taskId) sPokedexView->typeIconSpriteIds[1] = 0xFF; CreateTypeIconSprites(); sPokedexView->categoryIconSpriteId = 0xFF; - LoadPalette(gMoveTypes_Pal, 0x1D0, 0x60); LoadCompressedSpriteSheet(&gSpriteSheet_CategoryIcons); LoadSpritePalette(&gSpritePal_CategoryIcons); gMain.state++; @@ -5054,13 +5069,13 @@ static u16 AddTMTutorMoves(u16 species, u16 movesTotal, u8 *numTMHMMoves, u8 *nu // TM Moves if (HGSS_SORT_TMS_BY_NUM) { - for (i = 0; i < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; i++) + for (i = 0; i < NUM_ALL_MACHINES; i++) { - move = ItemIdToBattleMoveId(ITEM_TM01 + i); + move = GetTMHMMoveId(i + 1); if (move != MOVE_NONE && CanLearnTeachableMove(species, move)) { isTMMove[move] = TRUE; - sStatsMovesTMHM_ID[*numTMHMMoves] = ITEM_TM01 + i; + sStatsMovesTMHM_ID[*numTMHMMoves] = GetTMHMItemId(i + 1); (*numTMHMMoves)++; sStatsMoves[movesTotal] = move; movesTotal++; @@ -5072,12 +5087,12 @@ static u16 AddTMTutorMoves(u16 species, u16 movesTotal, u8 *numTMHMMoves, u8 *nu for (i = 0; teachableLearnset[i] != MOVE_UNAVAILABLE; i++) { move = teachableLearnset[i]; - for (u16 j = 0; j < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; j++) + for (u16 j = 0; j < NUM_ALL_MACHINES; j++) { - if (ItemIdToBattleMoveId(ITEM_TM01 + j) == move) + if (GetTMHMMoveId(j + 1) == move) { isTMMove[move] = TRUE; - sStatsMovesTMHM_ID[*numTMHMMoves] = ITEM_TM01 + j; + sStatsMovesTMHM_ID[*numTMHMMoves] = GetTMHMItemId(j + 1); (*numTMHMMoves)++; sStatsMoves[movesTotal] = move; movesTotal++; @@ -5272,7 +5287,7 @@ static void PrintStatsScreen_Moves_Description(u8 taskId) } else { - StringCopy(gStringVar4, gContestEffectDescriptionPointers[GetMoveContestEffect(move)]); + StringCopy(gStringVar4, gContestEffects[GetMoveContestEffect(move)].description); PrintStatsScreenTextSmall(WIN_STATS_MOVES_DESCRIPTION, gStringVar4, moves_x, moves_y); } } @@ -5622,7 +5637,7 @@ static void PrintStatsScreen_Left(u8 taskId) if (gTasks[taskId].data[5] == 0) { u32 catchRate = sPokedexView->sPokemonStats.catchRate; - u32 growthRate = sPokedexView->sPokemonStats.growthRate; + enum GrowthRate growthRate = sPokedexView->sPokemonStats.growthRate; //Catch rate PrintStatsScreenTextSmall(WIN_STATS_LEFT, sText_Stats_CatchRate, base_x, base_y + base_y_offset*base_i); @@ -5859,9 +5874,9 @@ static void PrintStatsScreen_Abilities(u8 taskId) { u8 abilities_x = 5; u8 abilities_y = 3; - u16 ability0; - u16 ability1; - u16 abilityHidden; + enum Ability ability0; + enum Ability ability1; + enum Ability abilityHidden; //Abilitie(s) @@ -6178,8 +6193,8 @@ static void Task_HandleEvolutionScreenInput(u8 taskId) if (JOY_NEW(A_BUTTON)) { - u16 targetSpecies = sPokedexView->sEvoScreenData.targetSpecies[sPokedexView->sEvoScreenData.menuPos]; - u16 dexNum = SpeciesToNationalPokedexNum(targetSpecies); + u16 targetSpecies = sPokedexView->sEvoScreenData.targetSpecies[sPokedexView->sEvoScreenData.menuPos]; + enum NationalDexOrder dexNum = SpeciesToNationalPokedexNum(targetSpecies); if (sPokedexView->isSearchResults && sPokedexView->originalSearchSelectionNum == 0) sPokedexView->originalSearchSelectionNum = sPokedexListItem->dexNum; @@ -6299,6 +6314,17 @@ static void HandlePreEvolutionSpeciesPrint(u8 taskId, u16 preSpecies, u16 specie } } +static bool32 HasTwoPreEvolutions(u32 species) +{ + switch (species) + { + case SPECIES_GHOLDENGO: + return TRUE; + default: + return FALSE; + } +} + static u8 PrintPreEvolutions(u8 taskId, u16 species) { u16 i; @@ -6350,13 +6376,39 @@ static u8 PrintPreEvolutions(u8 taskId, u16 species) { if (evolutions[j].targetSpecies == species) { - preEvolutionOne = i; - numPreEvolutions += 1; - break; + if (numPreEvolutions == 0) + { + preEvolutionOne = i; + numPreEvolutions += 1; + if (!HasTwoPreEvolutions(species)) + break; + } + else + { + preEvolutionTwo = i; + numPreEvolutions += 1; + break; + } } } } + if (HasTwoPreEvolutions(species)) + { + CreateCaughtBallEvolutionScreen(preEvolutionOne, base_x - 9, base_y + base_y_offset*0, 0); + HandlePreEvolutionSpeciesPrint(taskId, preEvolutionOne, species, base_x, base_y, base_y_offset, 0); + + CreateCaughtBallEvolutionScreen(preEvolutionTwo, base_x - 9, base_y + base_y_offset*(numPreEvolutions - 1), 0); + HandlePreEvolutionSpeciesPrint(taskId, preEvolutionTwo, species, base_x, base_y, base_y_offset, numPreEvolutions - 1); + + sPokedexView->sEvoScreenData.targetSpecies[0] = preEvolutionOne; + sPokedexView->sEvoScreenData.targetSpecies[1] = preEvolutionTwo; + + sPokedexView->numPreEvolutions = numPreEvolutions; + sPokedexView->sEvoScreenData.numAllEvolutions += numPreEvolutions; + return numPreEvolutions; + } + //Calculate if previous evolution also has a previous evolution if (numPreEvolutions != 0) { @@ -6517,38 +6569,45 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept } } - switch ((enum EvolutionMethods)evolutions[i].method) + bool32 caught = GetSetPokedexFlag(SpeciesToNationalPokedexNum(targetSpecies), FLAG_GET_CAUGHT); + if (HGSS_HIDE_UNOWNED_EVOLUTION_METHODS == TRUE && !caught) { - case EVO_SCRIPT_TRIGGER: - case EVO_NONE: StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Unknown")); - break; - case EVO_LEVEL: - case EVO_LEVEL_BATTLE_ONLY: - StringCopy(gStringVar4, COMPOUND_STRING("{LV}{UP_ARROW}")); - if (evolutions[i].param > 1) + } + else + { + switch ((enum EvolutionMethods)evolutions[i].method) { - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEFT_ALIGN, EVO_SCREEN_LVL_DIGITS); //level - StringAppend(gStringVar4, gStringVar2); - } - if ((enum EvolutionMethods)evolutions[i].method == EVO_LEVEL_BATTLE_ONLY) - StringAppend(gStringVar4, COMPOUND_STRING(", in battle")); - break; - case EVO_TRADE: - StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Trading")); - break; - case EVO_ITEM: - CopyItemName(evolutions[i].param, gStringVar2); - StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("{STR_VAR_2} is used")); - break; - case EVO_SPLIT_FROM_EVO: - StringCopy(gStringVar4, COMPOUND_STRING("Splits from ")); - StringAppend(gStringVar4, GetSpeciesName(evolutions[i].param)); //mon name - break; - case EVO_BATTLE_END: - StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("End battle")); - break; - case EVO_SPIN: + case EVO_SCRIPT_TRIGGER: + case EVO_NONE: + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Unknown")); + break; + case EVO_LEVEL: + case EVO_LEVEL_BATTLE_ONLY: + StringCopy(gStringVar4, COMPOUND_STRING("{LV}{UP_ARROW}")); + if (evolutions[i].param > 1) + { + ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEFT_ALIGN, EVO_SCREEN_LVL_DIGITS); //level + StringAppend(gStringVar4, gStringVar2); + } + if ((enum EvolutionMethods)evolutions[i].method == EVO_LEVEL_BATTLE_ONLY) + StringAppend(gStringVar4, COMPOUND_STRING(", in battle")); + break; + case EVO_TRADE: + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Trading")); + break; + case EVO_ITEM: + CopyItemName(evolutions[i].param, gStringVar2); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("{STR_VAR_2} is used")); + break; + case EVO_SPLIT_FROM_EVO: + StringCopy(gStringVar4, COMPOUND_STRING("Splits from ")); + StringAppend(gStringVar4, GetSpeciesName(evolutions[i].param)); //mon name + break; + case EVO_BATTLE_END: + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("End battle")); + break; + case EVO_SPIN: StringCopy(gStringVar4, COMPOUND_STRING("Spin ")); if (evolutions[i].param == SPIN_CW_SHORT) StringAppend(gStringVar4, COMPOUND_STRING("CW <5s")); @@ -6560,218 +6619,247 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept StringAppend(gStringVar4, COMPOUND_STRING("CCW >5s")); else StringAppend(gStringVar4, COMPOUND_STRING("CW/CCW >10s")); - break; - }//Switch end - - // Check for additional conditions. Skips if there's no additional conditions. - for (j = 0; evolutions[i].params != NULL && evolutions[i].params[j].condition != CONDITIONS_END; j++) - { - if (j == 0) - { - StringAppend(gStringVar4, COMPOUND_STRING(", ")); - } + break; + }//Switch end - switch((enum EvolutionConditions)evolutions[i].params[j].condition) + // Check for additional conditions. Skips if there's no additional conditions. + for (j = 0; evolutions[i].params != NULL && evolutions[i].params[j].condition != CONDITIONS_END; j++) { - // Gen 2 - case IF_GENDER: - switch(evolutions[i].params[j].arg1) - { - case MON_MALE: StringAppend(gStringVar4, COMPOUND_STRING("Male")); break; - case MON_FEMALE: StringAppend(gStringVar4, COMPOUND_STRING("Female")); break; - } - break; - case IF_MIN_FRIENDSHIP: - StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}friendship")); - break; - case IF_ATK_GT_DEF: - StringAppend(gStringVar4, COMPOUND_STRING("Atk > Def")); - break; - case IF_ATK_EQ_DEF: - StringAppend(gStringVar4, COMPOUND_STRING("Atk = Def")); - break; - case IF_ATK_LT_DEF: - StringAppend(gStringVar4, COMPOUND_STRING("Atk < Def")); - break; - case IF_TIME: - switch(evolutions[i].params[j].arg1) + if (j == 0) { - case TIME_MORNING: StringAppend(gStringVar4, COMPOUND_STRING("Morning")); break; - case TIME_DAY: StringAppend(gStringVar4, COMPOUND_STRING("Day")); break; - case TIME_EVENING: StringAppend(gStringVar4, COMPOUND_STRING("Evening")); break; - case TIME_NIGHT: StringAppend(gStringVar4, COMPOUND_STRING("Night")); break; + StringAppend(gStringVar4, COMPOUND_STRING(", ")); } - break; - case IF_NOT_TIME: - switch(evolutions[i].params[j].arg1) + + enum EvolutionConditions condition = evolutions[i].params[j].condition; + switch(condition) { - case TIME_MORNING: StringAppend(gStringVar4, COMPOUND_STRING("NOT Morning")); break; - case TIME_DAY: StringAppend(gStringVar4, COMPOUND_STRING("NOT Day")); break; - case TIME_EVENING: StringAppend(gStringVar4, COMPOUND_STRING("NOT Evening")); break; - case TIME_NIGHT: StringAppend(gStringVar4, COMPOUND_STRING("Day")); break; // More intuitive than "NOT Night" - } - break; - case IF_HOLD_ITEM: - StringAppend(gStringVar4, COMPOUND_STRING("holds ")); - if (isAlcremie && IsItemSweet(evolutions[i].params[j].arg1)) + // Gen 2 + case IF_GENDER: + switch(evolutions[i].params[j].arg1) + { + case MON_MALE: StringAppend(gStringVar4, COMPOUND_STRING("Male")); break; + case MON_FEMALE: StringAppend(gStringVar4, COMPOUND_STRING("Female")); break; + } + break; + case IF_MIN_FRIENDSHIP: + StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}friendship")); + break; + case IF_ATK_GT_DEF: + StringAppend(gStringVar4, COMPOUND_STRING("Atk > Def")); + break; + case IF_ATK_EQ_DEF: + StringAppend(gStringVar4, COMPOUND_STRING("Atk = Def")); + break; + case IF_ATK_LT_DEF: + StringAppend(gStringVar4, COMPOUND_STRING("Atk < Def")); + break; + case IF_TIME: + switch(evolutions[i].params[j].arg1) + { + case TIME_MORNING: StringAppend(gStringVar4, COMPOUND_STRING("Morning")); break; + case TIME_DAY: StringAppend(gStringVar4, COMPOUND_STRING("Day")); break; + case TIME_EVENING: StringAppend(gStringVar4, COMPOUND_STRING("Evening")); break; + case TIME_NIGHT: StringAppend(gStringVar4, COMPOUND_STRING("Night")); break; + } + break; + case IF_NOT_TIME: + switch(evolutions[i].params[j].arg1) + { + case TIME_MORNING: StringAppend(gStringVar4, COMPOUND_STRING("NOT Morning")); break; + case TIME_DAY: StringAppend(gStringVar4, COMPOUND_STRING("NOT Day")); break; + case TIME_EVENING: StringAppend(gStringVar4, COMPOUND_STRING("NOT Evening")); break; + case TIME_NIGHT: StringAppend(gStringVar4, COMPOUND_STRING("Day")); break; // More intuitive than "NOT Night" + } + break; + case IF_HOLD_ITEM: + StringAppend(gStringVar4, COMPOUND_STRING("holds ")); + if (isAlcremie && IsItemSweet(evolutions[i].params[j].arg1)) + { + StringAppend(gStringVar4, COMPOUND_STRING("Sweet")); //item + } + else + { + CopyItemName(evolutions[i].params[j].arg1, gStringVar2); //item + StringAppend(gStringVar4, gStringVar2); + } + break; + // Gen 3 + case IF_PID_UPPER_MODULO_10_GT: + case IF_PID_UPPER_MODULO_10_EQ: + case IF_PID_UPPER_MODULO_10_LT: + arg = evolutions[i].params[j].arg1; + if (condition == IF_PID_UPPER_MODULO_10_GT + && arg < 10 && arg >= 0) + arg = 9 - arg; + else if (condition == IF_PID_UPPER_MODULO_10_EQ + && arg < 10 && arg >= 0) + arg = 1; + ConvertIntToDecimalStringN(gStringVar2, arg * 10, STR_CONV_MODE_LEFT_ALIGN, 3); + StringAppend(gStringVar4, COMPOUND_STRING("random %")); + StringAppend(gStringVar4, gStringVar2); + break; + case IF_MIN_BEAUTY: + StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}beauty")); + break; + case IF_MIN_COOLNESS: + StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}coolness")); + break; + case IF_MIN_SMARTNESS: + StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}smartness")); + break; + case IF_MIN_TOUGHNESS: + StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}toughness")); + break; + case IF_MIN_CUTENESS: + StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}cuteness")); + break; + // Gen 4 + case IF_SPECIES_IN_PARTY: + StringAppend(gStringVar4, GetSpeciesName(evolutions[i].params[j].arg1)); //mon name + StringAppend(gStringVar4, COMPOUND_STRING(" in party")); + break; + case IF_IN_MAPSEC: + StringAppend(gStringVar4, COMPOUND_STRING("in ")); + StringCopy(gStringVar2, gRegionMapEntries[evolutions[i].params[j].arg1].name); + StringAppend(gStringVar4, gStringVar2); + break; + case IF_IN_MAP: + StringAppend(gStringVar4, COMPOUND_STRING("in ")); + GetMapName(gStringVar2, Overworld_GetMapHeaderByGroupAndId(evolutions[i].params[j].arg1 >> 8, evolutions[i].params[j].arg1 & 0xFF)->regionMapSectionId, 0); + StringAppend(gStringVar4, gStringVar2); + break; + case IF_KNOWS_MOVE: + StringAppend(gStringVar4, COMPOUND_STRING("knows ")); + StringAppend(gStringVar4, GetMoveName(evolutions[i].params[j].arg1)); + break; + // Gen 5 + case IF_TRADE_PARTNER_SPECIES: + StringAppend(gStringVar4, COMPOUND_STRING("traded with ")); + StringAppend(gStringVar4, GetSpeciesName(evolutions[i].params[j].arg1)); + break; + // Gen 6 + case IF_TYPE_IN_PARTY: + StringAppend(gStringVar4, gTypesInfo[evolutions[i].params[j].arg1].name); //type name + StringAppend(gStringVar4, COMPOUND_STRING("-type in party")); + break; + case IF_WEATHER: + StringAppend(gStringVar4, COMPOUND_STRING("weather ")); + StringAppend(gStringVar4, GetWeatherName(evolutions[i].params[j].arg1)); + break; + case IF_KNOWS_MOVE_TYPE: + StringAppend(gStringVar4, gTypesInfo[evolutions[i].params[j].arg1].name); + StringAppend(gStringVar4, COMPOUND_STRING(" move")); + break; + case IF_REGION: + case IF_NOT_REGION: { - StringAppend(gStringVar4, COMPOUND_STRING("Sweet")); //item + if (condition == IF_REGION) + StringAppend(gStringVar4, COMPOUND_STRING("in ")); + else if (condition == IF_NOT_REGION) + StringAppend(gStringVar4, COMPOUND_STRING("out of ")); + + switch ((enum Region)evolutions[i].params[j].arg1) + { + case REGION_NONE: + case REGIONS_COUNT: + StringAppend(gStringVar4, COMPOUND_STRING("???")); + break; + case REGION_KANTO: StringAppend(gStringVar4, COMPOUND_STRING("Kanto")); break; + case REGION_JOHTO: StringAppend(gStringVar4, COMPOUND_STRING("Johto")); break; + case REGION_HOENN: StringAppend(gStringVar4, COMPOUND_STRING("Hoenn")); break; + case REGION_SINNOH: StringAppend(gStringVar4, COMPOUND_STRING("Sinnoh")); break; + case REGION_UNOVA: StringAppend(gStringVar4, COMPOUND_STRING("Unova")); break; + case REGION_KALOS: StringAppend(gStringVar4, COMPOUND_STRING("Kalos")); break; + case REGION_ALOLA: StringAppend(gStringVar4, COMPOUND_STRING("Alola")); break; + case REGION_GALAR: StringAppend(gStringVar4, COMPOUND_STRING("Galar")); break; + case REGION_HISUI: StringAppend(gStringVar4, COMPOUND_STRING("Hisui")); break; + case REGION_PALDEA: StringAppend(gStringVar4, COMPOUND_STRING("Paldea")); break; + } + break; } - else - { - CopyItemName(evolutions[i].params[j].arg1, gStringVar2); //item + // Gen 8 + case IF_NATURE: + StringCopy(gStringVar2, gNaturesInfo[evolutions[i].params[j].arg1].name); StringAppend(gStringVar4, gStringVar2); - } - break; - // Gen 3 - case IF_PID_UPPER_MODULO_10_GT: - case IF_PID_UPPER_MODULO_10_EQ: - case IF_PID_UPPER_MODULO_10_LT: - arg = evolutions[i].params[j].arg1; - if ((enum EvolutionConditions)evolutions[i].params[j].condition == IF_PID_UPPER_MODULO_10_GT - && arg < 10 && arg >= 0) - arg = 9 - arg; - else if ((enum EvolutionConditions)evolutions[i].params[j].condition == IF_PID_UPPER_MODULO_10_EQ - && arg < 10 && arg >= 0) - arg = 1; - ConvertIntToDecimalStringN(gStringVar2, arg * 10, STR_CONV_MODE_LEFT_ALIGN, 3); - StringAppend(gStringVar4, COMPOUND_STRING("random %")); - StringAppend(gStringVar4, gStringVar2); - break; - case IF_MIN_BEAUTY: - StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}beauty")); - break; - case IF_MIN_COOLNESS: - StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}coolness")); - break; - case IF_MIN_SMARTNESS: - StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}smartness")); - break; - case IF_MIN_TOUGHNESS: - StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}toughness")); - break; - case IF_MIN_CUTENESS: - StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}cuteness")); - break; - // Gen 4 - case IF_SPECIES_IN_PARTY: - StringAppend(gStringVar4, GetSpeciesName(evolutions[i].params[j].arg1)); //mon name - StringAppend(gStringVar4, COMPOUND_STRING(" in party")); - break; - case IF_IN_MAPSEC: - StringAppend(gStringVar4, COMPOUND_STRING("in ")); - StringCopy(gStringVar2, gRegionMapEntries[evolutions[i].params[j].arg1].name); - StringAppend(gStringVar4, gStringVar2); - break; - case IF_IN_MAP: - StringAppend(gStringVar4, COMPOUND_STRING("in ")); - GetMapName(gStringVar2, Overworld_GetMapHeaderByGroupAndId(evolutions[i].params[j].arg1 >> 8, evolutions[i].params[j].arg1 & 0xFF)->regionMapSectionId, 0); - StringAppend(gStringVar4, gStringVar2); - break; - case IF_KNOWS_MOVE: - StringAppend(gStringVar4, COMPOUND_STRING("knows ")); - StringAppend(gStringVar4, GetMoveName(evolutions[i].params[j].arg1)); - break; - // Gen 5 - case IF_TRADE_PARTNER_SPECIES: - StringAppend(gStringVar4, COMPOUND_STRING("traded with ")); - StringAppend(gStringVar4, GetSpeciesName(evolutions[i].params[j].arg1)); - break; - // Gen 6 - case IF_TYPE_IN_PARTY: - StringAppend(gStringVar4, gTypesInfo[evolutions[i].params[j].arg1].name); //type name - StringAppend(gStringVar4, COMPOUND_STRING("-type in party")); - break; - case IF_WEATHER: - StringAppend(gStringVar4, COMPOUND_STRING("weather ")); - StringAppend(gStringVar4, GetWeatherName(evolutions[i].params[j].arg1)); - break; - case IF_KNOWS_MOVE_TYPE: - StringAppend(gStringVar4, gTypesInfo[evolutions[i].params[j].arg1].name); - StringAppend(gStringVar4, COMPOUND_STRING(" move")); - break; - // Gen 8 - case IF_NATURE: - StringCopy(gStringVar2, gNaturesInfo[evolutions[i].params[j].arg1].name); - StringAppend(gStringVar4, gStringVar2); - StringAppend(gStringVar4, COMPOUND_STRING(" nature")); - break; - case IF_AMPED_NATURE: - StringAppend(gStringVar4, COMPOUND_STRING("amped natures")); - break; - case IF_LOW_KEY_NATURE: - StringAppend(gStringVar4, COMPOUND_STRING("low-Key natures")); - break; - case IF_RECOIL_DAMAGE_GE: - StringAppend(gStringVar4, COMPOUND_STRING("takes >= ")); - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg1, STR_CONV_MODE_LEFT_ALIGN, 3); - StringAppend(gStringVar4, gStringVar2); - StringAppend(gStringVar4, COMPOUND_STRING(" recoil dmg")); - break; - case IF_CURRENT_DAMAGE_GE: - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg1, STR_CONV_MODE_LEFT_ALIGN, 3); - StringAppend(gStringVar4, gStringVar2); - StringAppend(gStringVar4, COMPOUND_STRING(" current dmg")); - break; - case IF_CRITICAL_HITS_GE: - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg1, STR_CONV_MODE_LEFT_ALIGN, 2); - StringAppend(gStringVar4, gStringVar2); - StringAppend(gStringVar4, COMPOUND_STRING(" critical hits")); - break; - case IF_USED_MOVE_X_TIMES: - StringAppend(gStringVar4, COMPOUND_STRING("use move ")); - StringAppend(gStringVar4, GetMoveName(evolutions[i].params[j].arg1)); - StringAppend(gStringVar4, COMPOUND_STRING(" ")); - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg2, STR_CONV_MODE_LEFT_ALIGN, 3); - StringAppend(gStringVar4, gStringVar2); - StringAppend(gStringVar4, COMPOUND_STRING(" times")); - break; - // Gen 9 - case IF_DEFEAT_X_WITH_ITEMS: - StringAppend(gStringVar4, COMPOUND_STRING("defeat ")); - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg3, STR_CONV_MODE_LEFT_ALIGN, 3); - StringAppend(gStringVar4, gStringVar2); - StringAppend(gStringVar4, COMPOUND_STRING(" ")); - StringAppend(gStringVar4, GetSpeciesName(evolutions[i].params[j].arg1)); - StringAppend(gStringVar4, COMPOUND_STRING(" that hold ")); - CopyItemName(evolutions[i].params[j].arg2, gStringVar2); - StringAppend(gStringVar4, gStringVar2); - break; - case IF_PID_MODULO_100_GT: - case IF_PID_MODULO_100_EQ: - case IF_PID_MODULO_100_LT: + StringAppend(gStringVar4, COMPOUND_STRING(" nature")); + break; + case IF_AMPED_NATURE: + StringAppend(gStringVar4, COMPOUND_STRING("amped natures")); + break; + case IF_LOW_KEY_NATURE: + StringAppend(gStringVar4, COMPOUND_STRING("low-Key natures")); + break; + case IF_RECOIL_DAMAGE_GE: + StringAppend(gStringVar4, COMPOUND_STRING("takes >= ")); + ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg1, STR_CONV_MODE_LEFT_ALIGN, 3); + StringAppend(gStringVar4, gStringVar2); + StringAppend(gStringVar4, COMPOUND_STRING(" recoil dmg")); + break; + case IF_CURRENT_DAMAGE_GE: + ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg1, STR_CONV_MODE_LEFT_ALIGN, 3); + StringAppend(gStringVar4, gStringVar2); + StringAppend(gStringVar4, COMPOUND_STRING(" current dmg")); + break; + case IF_CRITICAL_HITS_GE: + ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg1, STR_CONV_MODE_LEFT_ALIGN, 2); + StringAppend(gStringVar4, gStringVar2); + StringAppend(gStringVar4, COMPOUND_STRING(" critical hits")); + break; + case IF_USED_MOVE_X_TIMES: + StringAppend(gStringVar4, COMPOUND_STRING("use move ")); + StringAppend(gStringVar4, GetMoveName(evolutions[i].params[j].arg1)); + StringAppend(gStringVar4, COMPOUND_STRING(" ")); + ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg2, STR_CONV_MODE_LEFT_ALIGN, 3); + StringAppend(gStringVar4, gStringVar2); + StringAppend(gStringVar4, COMPOUND_STRING(" times")); + break; + // Gen 9 + case IF_DEFEAT_X_WITH_ITEMS: + StringAppend(gStringVar4, COMPOUND_STRING("defeat ")); + ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg3, STR_CONV_MODE_LEFT_ALIGN, 3); + StringAppend(gStringVar4, gStringVar2); + StringAppend(gStringVar4, COMPOUND_STRING(" ")); + StringAppend(gStringVar4, GetSpeciesName(evolutions[i].params[j].arg1)); + StringAppend(gStringVar4, COMPOUND_STRING(" that hold ")); + CopyItemName(evolutions[i].params[j].arg2, gStringVar2); + StringAppend(gStringVar4, gStringVar2); + break; + case IF_PID_MODULO_100_GT: + case IF_PID_MODULO_100_EQ: + case IF_PID_MODULO_100_LT: arg = evolutions[i].params[j].arg1; - if ((enum EvolutionConditions)evolutions[i].params[j].condition == IF_PID_MODULO_100_GT + if (condition == IF_PID_MODULO_100_GT && arg < 100 && arg >= 0) arg = 99 - arg; - else if ((enum EvolutionConditions)evolutions[i].params[j].condition == IF_PID_MODULO_100_EQ + else if (condition == IF_PID_MODULO_100_EQ && arg < 100 && arg >= 0) arg = 1; ConvertIntToDecimalStringN(gStringVar2, arg, STR_CONV_MODE_LEFT_ALIGN, 3); StringAppend(gStringVar4, COMPOUND_STRING("%")); StringAppend(gStringVar4, gStringVar2); - break; - case IF_MIN_OVERWORLD_STEPS: - StringAppend(gStringVar4, COMPOUND_STRING("after ")); - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg1, STR_CONV_MODE_LEFT_ALIGN, 4); - StringAppend(gStringVar4, gStringVar2); - StringAppend(gStringVar4, COMPOUND_STRING(" steps")); - break; - case IF_BAG_ITEM_COUNT: - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg2, STR_CONV_MODE_LEFT_ALIGN, 3); - StringAppend(gStringVar4, gStringVar2); - StringAppend(gStringVar4, COMPOUND_STRING(" ")); - CopyItemNameHandlePlural(evolutions[i].params[j].arg1, gStringVar2, evolutions[i].params[j].arg2); - StringAppend(gStringVar4, gStringVar2); - StringAppend(gStringVar4, COMPOUND_STRING(" in bag")); - break; - case CONDITIONS_END: - break; - } + break; + case IF_MIN_OVERWORLD_STEPS: + StringAppend(gStringVar4, COMPOUND_STRING("after ")); + ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg1, STR_CONV_MODE_LEFT_ALIGN, 4); + StringAppend(gStringVar4, gStringVar2); + StringAppend(gStringVar4, COMPOUND_STRING(" steps")); + break; + case IF_BAG_ITEM_COUNT: + ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg2, STR_CONV_MODE_LEFT_ALIGN, 3); + StringAppend(gStringVar4, gStringVar2); + StringAppend(gStringVar4, COMPOUND_STRING(" ")); + CopyItemNameHandlePlural(evolutions[i].params[j].arg1, gStringVar2, evolutions[i].params[j].arg2); + StringAppend(gStringVar4, gStringVar2); + StringAppend(gStringVar4, COMPOUND_STRING(" in bag")); + break; + case CONDITIONS_END: + break; + } - if (evolutions[i].params[j+1].condition != CONDITIONS_END) - { - StringAppend(gStringVar4, COMPOUND_STRING(", ")); + if (evolutions[i].params[j+1].condition != CONDITIONS_END) + { + StringAppend(gStringVar4, COMPOUND_STRING(", ")); + } } } @@ -7747,12 +7835,12 @@ static void Task_ClosePokedexFromSearchResultsStartMenu(u8 taskId) //* Search code * //* * //************************************ -static int DoPokedexSearch(u8 dexMode, u8 order, u8 abcGroup, u8 bodyColor, u8 type1, u8 type2) +static int DoPokedexSearch(u8 dexMode, u8 order, u8 abcGroup, enum BodyColor bodyColor, enum Type type1, enum Type type2) { u16 species; u16 i; u16 resultsCount; - u8 types[2]; + enum Type types[2]; CreatePokedexList(dexMode, order); @@ -7817,8 +7905,8 @@ static int DoPokedexSearch(u8 dexMode, u8 order, u8 abcGroup, u8 bodyColor, u8 t { species = NationalPokedexNumToSpecies(sPokedexView->pokedexList[i].dexNum); - types[0] = gSpeciesInfo[species].types[0]; - types[1] = gSpeciesInfo[species].types[1]; + types[0] = GetSpeciesType(species, 0); + types[1] = GetSpeciesType(species, 1); if (types[0] == type1 || types[1] == type1) { sPokedexView->pokedexList[resultsCount] = sPokedexView->pokedexList[i]; @@ -7835,8 +7923,8 @@ static int DoPokedexSearch(u8 dexMode, u8 order, u8 abcGroup, u8 bodyColor, u8 t { species = NationalPokedexNumToSpecies(sPokedexView->pokedexList[i].dexNum); - types[0] = gSpeciesInfo[species].types[0]; - types[1] = gSpeciesInfo[species].types[1]; + types[0] = GetSpeciesType(species, 0); + types[1] = GetSpeciesType(species, 1); if ((types[0] == type1 && types[1] == type2) || (types[0] == type2 && types[1] == type1)) { sPokedexView->pokedexList[resultsCount] = sPokedexView->pokedexList[i]; @@ -8163,9 +8251,9 @@ static void Task_StartPokedexSearch(u8 taskId) u8 dexMode = GetSearchModeSelection(taskId, SEARCH_MODE); u8 order = GetSearchModeSelection(taskId, SEARCH_ORDER); u8 abcGroup = GetSearchModeSelection(taskId, SEARCH_NAME); - u8 bodyColor = GetSearchModeSelection(taskId, SEARCH_COLOR); - u8 type1 = GetSearchModeSelection(taskId, SEARCH_TYPE_LEFT); - u8 type2 = GetSearchModeSelection(taskId, SEARCH_TYPE_RIGHT); + enum BodyColor bodyColor = GetSearchModeSelection(taskId, SEARCH_COLOR); + enum Type type1 = GetSearchModeSelection(taskId, SEARCH_TYPE_LEFT); + enum Type type2 = GetSearchModeSelection(taskId, SEARCH_TYPE_RIGHT); DoPokedexSearch(dexMode, order, abcGroup, bodyColor, type1, type2); gTasks[taskId].func = Task_WaitAndCompleteSearch; diff --git a/src/pokemon.c b/src/pokemon.c index 6636c7c7fab9..9567c2263680 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -12,6 +12,7 @@ #include "battle_tower.h" #include "battle_z_move.h" #include "data.h" +#include "daycare.h" #include "dexnav.h" #include "event_data.h" #include "event_object_movement.h" @@ -19,12 +20,14 @@ #include "field_player_avatar.h" #include "field_specials.h" #include "field_weather.h" +#include "fishing.h" #include "follower_npc.h" #include "graphics.h" #include "item.h" #include "caps.h" #include "link.h" #include "main.h" +#include "move_relearner.h" #include "overworld.h" #include "m4a.h" #include "party_menu.h" @@ -37,6 +40,7 @@ #include "pokemon_storage_system.h" #include "random.h" #include "recorded_battle.h" +#include "regions.h" #include "rtc.h" #include "sound.h" #include "string_util.h" @@ -55,7 +59,6 @@ #include "constants/cries.h" #include "constants/event_objects.h" #include "constants/form_change_types.h" -#include "constants/hold_effects.h" #include "constants/item_effects.h" #include "constants/items.h" #include "constants/layouts.h" @@ -65,7 +68,6 @@ #include "constants/trainers.h" #include "constants/union_room.h" #include "constants/weather.h" -#include "wild_encounter.h" #define FRIENDSHIP_EVO_THRESHOLD ((P_FRIENDSHIP_EVO_THRESHOLD >= GEN_8) ? 160 : 220) @@ -76,11 +78,12 @@ struct SpeciesItem }; static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon); -static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType); +static u16 CalculateBoxMonChecksumDecrypt(struct BoxPokemon *boxMon); +static u16 CalculateBoxMonChecksumReencrypt(struct BoxPokemon *boxMon); +static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, enum SubstructType substructType); static void EncryptBoxMon(struct BoxPokemon *boxMon); static void DecryptBoxMon(struct BoxPokemon *boxMon); static void Task_PlayMapChosenOrBattleBGM(u8 taskId); -static bool8 ShouldSkipFriendshipChange(void); void TrySpecialOverworldEvo(); EWRAM_DATA static u8 sLearningMoveTableID = 0; @@ -119,7 +122,7 @@ static const struct CombinedMove sCombinedMoves[2] = #define HOENN_TO_NATIONAL(name) [HOENN_DEX_##name - 1] = NATIONAL_DEX_##name // Assigns all Hoenn Dex Indexes to a National Dex Index -static const u16 sHoennToNationalOrder[HOENN_DEX_COUNT - 1] = +static const enum NationalDexOrder sHoennToNationalOrder[HOENN_DEX_COUNT - 1] = { HOENN_TO_NATIONAL(TREECKO), HOENN_TO_NATIONAL(GROVYLE), @@ -810,80 +813,15 @@ const struct SpriteTemplate gBattlerSpriteTemplates[MAX_BATTLERS_COUNT] = }, }; -static const struct SpriteTemplate sTrainerBackSpriteTemplates[] = +static const struct SpriteTemplate sTrainerBackSpriteTemplate = { - [TRAINER_BACK_PIC_BRENDAN] = { - .tileTag = TAG_NONE, - .paletteTag = 0, - .oam = &gOamData_BattleSpritePlayerSide, - .anims = NULL, - .images = gTrainerBackPicTable_Brendan, - .affineAnims = gAffineAnims_BattleSpritePlayerSide, - .callback = SpriteCB_BattleSpriteStartSlideLeft, - }, - [TRAINER_BACK_PIC_MAY] = { - .tileTag = TAG_NONE, - .paletteTag = 0, - .oam = &gOamData_BattleSpritePlayerSide, - .anims = NULL, - .images = gTrainerBackPicTable_May, - .affineAnims = gAffineAnims_BattleSpritePlayerSide, - .callback = SpriteCB_BattleSpriteStartSlideLeft, - }, - [TRAINER_BACK_PIC_RED] = { - .tileTag = TAG_NONE, - .paletteTag = 0, - .oam = &gOamData_BattleSpritePlayerSide, - .anims = NULL, - .images = gTrainerBackPicTable_Red, - .affineAnims = gAffineAnims_BattleSpritePlayerSide, - .callback = SpriteCB_BattleSpriteStartSlideLeft, - }, - [TRAINER_BACK_PIC_LEAF] = { - .tileTag = TAG_NONE, - .paletteTag = 0, - .oam = &gOamData_BattleSpritePlayerSide, - .anims = NULL, - .images = gTrainerBackPicTable_Leaf, - .affineAnims = gAffineAnims_BattleSpritePlayerSide, - .callback = SpriteCB_BattleSpriteStartSlideLeft, - }, - [TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN] = { - .tileTag = TAG_NONE, - .paletteTag = 0, - .oam = &gOamData_BattleSpritePlayerSide, - .anims = NULL, - .images = gTrainerBackPicTable_RubySapphireBrendan, - .affineAnims = gAffineAnims_BattleSpritePlayerSide, - .callback = SpriteCB_BattleSpriteStartSlideLeft, - }, - [TRAINER_BACK_PIC_RUBY_SAPPHIRE_MAY] = { - .tileTag = TAG_NONE, - .paletteTag = 0, - .oam = &gOamData_BattleSpritePlayerSide, - .anims = NULL, - .images = gTrainerBackPicTable_RubySapphireMay, - .affineAnims = gAffineAnims_BattleSpritePlayerSide, - .callback = SpriteCB_BattleSpriteStartSlideLeft, - }, - [TRAINER_BACK_PIC_WALLY] = { - .tileTag = TAG_NONE, - .paletteTag = 0, - .oam = &gOamData_BattleSpritePlayerSide, - .anims = NULL, - .images = gTrainerBackPicTable_Wally, - .affineAnims = gAffineAnims_BattleSpritePlayerSide, - .callback = SpriteCB_BattleSpriteStartSlideLeft, - }, - [TRAINER_BACK_PIC_STEVEN] = { - .tileTag = TAG_NONE, - .paletteTag = 0, - .oam = &gOamData_BattleSpritePlayerSide, - .anims = NULL, - .images = gTrainerBackPicTable_Steven, - .affineAnims = gAffineAnims_BattleSpritePlayerSide, - .callback = SpriteCB_BattleSpriteStartSlideLeft, - }, + .tileTag = TAG_NONE, + .paletteTag = 0, + .oam = &gOamData_BattleSpritePlayerSide, + .anims = NULL, + .images = NULL, + .affineAnims = gAffineAnims_BattleSpritePlayerSide, + .callback = SpriteCB_BattleSpriteStartSlideLeft, }; #define NUM_SECRET_BASE_CLASSES 5 @@ -916,7 +854,7 @@ static const u8 sGetMonDataEVConstants[] = }; // For stat-raising items -static const u8 sStatsToRaise[] = +static const enum Stat sStatsToRaise[] = { STAT_ATK, STAT_ATK, STAT_DEF, STAT_SPEED, STAT_SPATK, STAT_SPDEF, STAT_ACC }; @@ -936,14 +874,6 @@ static const s8 sFriendshipEventModifiers[][3] = [FRIENDSHIP_EVENT_FAINT_LARGE] = {-5, -5, -10}, }; -#define HM_MOVES_END 0xFFFF - -static const u16 sHMMoves[] = -{ - MOVE_CUT, MOVE_FLY, MOVE_SURF, MOVE_STRENGTH, MOVE_FLASH, - MOVE_ROCK_SMASH, MOVE_WATERFALL, MOVE_DIVE, HM_MOVES_END -}; - static const struct SpeciesItem sAlteringCaveWildMonHeldItems[] = { {SPECIES_NONE, ITEM_NONE}, @@ -1114,8 +1044,8 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, u32 value; u16 checksum; u8 i; - u8 availableIVs[NUM_STATS]; - u8 selectedIvs[NUM_STATS]; + enum Stat availableIVs[NUM_STATS]; + enum Stat selectedIvs[NUM_STATS]; bool32 isShiny; ZeroBoxMonData(boxMon); @@ -1146,7 +1076,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, { isShiny = TRUE; } - else if (P_ONLY_OBTAINABLE_SHINIES && InBattlePyramid()) + else if (P_ONLY_OBTAINABLE_SHINIES && (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE || (B_FLAG_NO_CATCHING != 0 && FlagGet(B_FLAG_NO_CATCHING)))) { isShiny = FALSE; } @@ -1161,8 +1091,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, totalRerolls += I_SHINY_CHARM_ADDITIONAL_ROLLS; if (LURE_STEP_COUNT != 0) totalRerolls += 1; - if (I_FISHING_CHAIN && gIsFishingEncounter) - totalRerolls += CalculateChainFishingShinyRolls(); + totalRerolls += CalculateChainFishingShinyRolls(); if (gDexNavSpecies) totalRerolls += CalculateDexNavShinyRolls(); @@ -1201,7 +1130,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, SetBoxMonData(boxMon, MON_DATA_POKEBALL, &value); SetBoxMonData(boxMon, MON_DATA_OT_GENDER, &gSaveBlock2Ptr->playerGender); - u32 teraType = (boxMon->personality & 0x1) == 0 ? gSpeciesInfo[species].types[0] : gSpeciesInfo[species].types[1]; + enum Type teraType = (boxMon->personality & 0x1) == 0 ? GetSpeciesType(species, 0) : GetSpeciesType(species, 1); SetBoxMonData(boxMon, MON_DATA_TERA_TYPE, &teraType); if (fixedIV < USE_RANDOM_IVS) @@ -1273,12 +1202,14 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, case STAT_SPDEF: SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &iv); break; + default: + break; } } } } - if (gSpeciesInfo[species].abilities[1]) + if (GetSpeciesAbility(species, 1)) { value = personality & 1; SetBoxMonData(boxMon, MON_DATA_ABILITY_NUM, &value); @@ -1623,63 +1554,6 @@ static void CreateEventMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedI SetMonData(mon, MON_DATA_MODERN_FATEFUL_ENCOUNTER, &isModernFatefulEncounter); } -// If FALSE, should load this game's Deoxys form. If TRUE, should load normal Deoxys form -bool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battler) -{ - switch (caseId) - { - case 0: - default: - return FALSE; - case 1: // Player's side in battle - if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - return FALSE; - if (!gMain.inBattle) - return FALSE; - if (gLinkPlayers[GetMultiplayerId()].id == battler) - return FALSE; - break; - case 2: - break; - case 3: // Summary Screen - if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - return FALSE; - if (!gMain.inBattle) - return FALSE; - if (battler == 1 || battler == 4 || battler == 5) - return TRUE; - return FALSE; - case 4: - break; - case 5: // In move animation, e.g. in Role Play or Snatch - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - if (!gMain.inBattle) - return FALSE; - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if (gLinkPlayers[GetMultiplayerId()].id == battler) - return FALSE; - } - else - { - if (IsOnPlayerSide(battler)) - return FALSE; - } - } - else - { - if (!gMain.inBattle) - return FALSE; - if (IsOnPlayerSide(battler)) - return FALSE; - } - break; - } - - return TRUE; -} - u16 GetUnionRoomTrainerPic(void) { u8 linkId; @@ -1695,7 +1569,7 @@ u16 GetUnionRoomTrainerPic(void) return FacilityClassToPicIndex(gUnionRoomFacilityClasses[arrId]); } -u16 GetUnionRoomTrainerClass(void) +enum TrainerClassID GetUnionRoomTrainerClass(void) { u8 linkId; u32 arrId; @@ -1729,54 +1603,44 @@ void CreateEnemyEventMon(void) static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon) { - u16 checksum = 0; - union PokemonSubstruct *substruct0 = GetSubstruct(boxMon, boxMon->personality, 0); - union PokemonSubstruct *substruct1 = GetSubstruct(boxMon, boxMon->personality, 1); - union PokemonSubstruct *substruct2 = GetSubstruct(boxMon, boxMon->personality, 2); - union PokemonSubstruct *substruct3 = GetSubstruct(boxMon, boxMon->personality, 3); - s32 i; + u32 checksum = 0; - for (i = 0; i < (s32)ARRAY_COUNT(substruct0->raw); i++) - checksum += substruct0->raw[i]; + for (u32 i = 0; i < ARRAY_COUNT(boxMon->secure.raw); i++) + checksum += boxMon->secure.raw[i] + (boxMon->secure.raw[i] >> 16); - for (i = 0; i < (s32)ARRAY_COUNT(substruct1->raw); i++) - checksum += substruct1->raw[i]; + return checksum; +} - for (i = 0; i < (s32)ARRAY_COUNT(substruct2->raw); i++) - checksum += substruct2->raw[i]; +static u16 CalculateBoxMonChecksumDecrypt(struct BoxPokemon *boxMon) +{ + u32 checksum = 0; - for (i = 0; i < (s32)ARRAY_COUNT(substruct3->raw); i++) - checksum += substruct3->raw[i]; + for (u32 i = 0; i < ARRAY_COUNT(boxMon->secure.raw); i++) + { + boxMon->secure.raw[i] ^= (boxMon->otId ^ boxMon->personality); + checksum += boxMon->secure.raw[i] + (boxMon->secure.raw[i] >> 16); + } return checksum; } -#define CALC_STAT(base, iv, ev, statIndex, field) \ -{ \ - u8 baseStat = gSpeciesInfo[species].base; \ - s32 n = (((2 * baseStat + iv + ev / 4) * level) / 100) + 5; \ - n = ModifyStatByNature(nature, n, statIndex); \ - if (B_FRIENDSHIP_BOOST == TRUE) \ - n = n + ((n * 10 * friendship) / (MAX_FRIENDSHIP * 100));\ - SetMonData(mon, field, &n); \ +static u16 CalculateBoxMonChecksumReencrypt(struct BoxPokemon *boxMon) +{ + u32 checksum = 0; + + for (u32 i = 0; i < ARRAY_COUNT(boxMon->secure.raw); i++) + { + checksum += boxMon->secure.raw[i] + (boxMon->secure.raw[i] >> 16); + boxMon->secure.raw[i] ^= (boxMon->otId ^ boxMon->personality); + } + + return checksum; } void CalculateMonStats(struct Pokemon *mon) { s32 oldMaxHP = GetMonData(mon, MON_DATA_MAX_HP, NULL); s32 currentHP = GetMonData(mon, MON_DATA_HP, NULL); - s32 hpIV = GetMonData(mon, MON_DATA_HYPER_TRAINED_HP) ? MAX_PER_STAT_IVS : GetMonData(mon, MON_DATA_HP_IV, NULL); - s32 hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL); - s32 attackIV = GetMonData(mon, MON_DATA_HYPER_TRAINED_ATK) ? MAX_PER_STAT_IVS : GetMonData(mon, MON_DATA_ATK_IV, NULL); - s32 attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL); - s32 defenseIV = GetMonData(mon, MON_DATA_HYPER_TRAINED_DEF) ? MAX_PER_STAT_IVS : GetMonData(mon, MON_DATA_DEF_IV, NULL); - s32 defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL); - s32 speedIV = GetMonData(mon, MON_DATA_HYPER_TRAINED_SPEED) ? MAX_PER_STAT_IVS : GetMonData(mon, MON_DATA_SPEED_IV, NULL); - s32 speedEV = GetMonData(mon, MON_DATA_SPEED_EV, NULL); - s32 spAttackIV = GetMonData(mon, MON_DATA_HYPER_TRAINED_SPATK) ? MAX_PER_STAT_IVS : GetMonData(mon, MON_DATA_SPATK_IV, NULL); - s32 spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL); - s32 spDefenseIV = GetMonData(mon, MON_DATA_HYPER_TRAINED_SPDEF) ? MAX_PER_STAT_IVS : GetMonData(mon, MON_DATA_SPDEF_IV, NULL); - s32 spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL); u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); u8 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); s32 level = GetLevelFromMonExp(mon); @@ -1786,28 +1650,55 @@ void CalculateMonStats(struct Pokemon *mon) SetMonData(mon, MON_DATA_LEVEL, &level); + bool32 hyperTrained[NUM_STATS]; //In a battle test, hyper training flag indicates a fixed stat + s32 iv[NUM_STATS]; + s32 ev[NUM_STATS]; + for (u32 i = 0; i < NUM_STATS; i++) + { + hyperTrained[i] = GetMonData(mon, MON_DATA_HYPER_TRAINED_HP + i); + iv[i] = GetMonData(mon, MON_DATA_HP_IV + i); + ev[i] = GetMonData(mon, MON_DATA_HP_EV + i); + + if (hyperTrained[i]) + { + #if TESTING + if (gMain.inBattle) + continue; + #endif + iv[i] = MAX_PER_STAT_IVS; + } + + if (i == STAT_HP) + continue; + + u8 baseStat = GetSpeciesBaseStat(species, i); + s32 n = (((2 * baseStat + iv[i] + ev[i] / 4) * level) / 100) + 5; + n = ModifyStatByNature(nature, n, i); + if (B_FRIENDSHIP_BOOST == TRUE) + n = n + ((n * 10 * friendship) / (MAX_FRIENDSHIP * 100)); + SetMonData(mon, MON_DATA_MAX_HP + i, &n); + } + +#if TESTING + if (hyperTrained[STAT_HP] && gMain.inBattle) + return; +#endif + if (species == SPECIES_SHEDINJA) { newMaxHP = 1; } else { - s32 n = 2 * gSpeciesInfo[species].baseHP + hpIV; - newMaxHP = (((n + hpEV / 4) * level) / 100) + level + 10; + s32 n = 2 * GetSpeciesBaseHP(species) + iv[STAT_HP]; + newMaxHP = (((n + ev[STAT_HP] / 4) * level) / 100) + level + 10; } gBattleScripting.levelUpHP = newMaxHP - oldMaxHP; if (gBattleScripting.levelUpHP == 0) gBattleScripting.levelUpHP = 1; - SetMonData(mon, MON_DATA_MAX_HP, &newMaxHP); - CALC_STAT(baseAttack, attackIV, attackEV, STAT_ATK, MON_DATA_ATK) - CALC_STAT(baseDefense, defenseIV, defenseEV, STAT_DEF, MON_DATA_DEF) - CALC_STAT(baseSpeed, speedIV, speedEV, STAT_SPEED, MON_DATA_SPEED) - CALC_STAT(baseSpAttack, spAttackIV, spAttackEV, STAT_SPATK, MON_DATA_SPATK) - CALC_STAT(baseSpDefense, spDefenseIV, spDefenseEV, STAT_SPDEF, MON_DATA_SPDEF) - // Since a pokemon's maxHP data could either not have // been initialized at this point or this pokemon is // just fainted, the check for oldMaxHP is important. @@ -2240,7 +2131,8 @@ void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerPicId, u8 battlerPosition gMultiuseSpriteTemplate.paletteTag = trainerPicId; if (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_PLAYER_RIGHT) { - gMultiuseSpriteTemplate = sTrainerBackSpriteTemplates[trainerPicId]; + gMultiuseSpriteTemplate = sTrainerBackSpriteTemplate; + gMultiuseSpriteTemplate.images = &gTrainerBacksprites[trainerPicId].backPic; gMultiuseSpriteTemplate.anims = gTrainerBacksprites[trainerPicId].animation; } else @@ -2266,8 +2158,7 @@ void SetMultiuseSpriteTemplateToTrainerFront(u16 trainerPicId, u8 battlerPositio static void EncryptBoxMon(struct BoxPokemon *boxMon) { - u32 i; - for (i = 0; i < ARRAY_COUNT(boxMon->secure.raw); i++) + for (u32 i = 0; i < ARRAY_COUNT(boxMon->secure.raw); i++) { boxMon->secure.raw[i] ^= boxMon->personality; boxMon->secure.raw[i] ^= boxMon->otId; @@ -2276,70 +2167,26 @@ static void EncryptBoxMon(struct BoxPokemon *boxMon) static void DecryptBoxMon(struct BoxPokemon *boxMon) { - u32 i; - for (i = 0; i < ARRAY_COUNT(boxMon->secure.raw); i++) + for (u32 i = 0; i < ARRAY_COUNT(boxMon->secure.raw); i++) { boxMon->secure.raw[i] ^= boxMon->otId; boxMon->secure.raw[i] ^= boxMon->personality; } } -#define SUBSTRUCT_CASE(n, v1, v2, v3, v4) \ -case n: \ - { \ - \ - switch (substructType) \ - { \ - case 0: \ - substruct = &boxMon->secure.substructs[v1]; \ - break; \ - case 1: \ - substruct = &boxMon->secure.substructs[v2]; \ - break; \ - case 2: \ - substruct = &boxMon->secure.substructs[v3]; \ - break; \ - case 3: \ - substruct = &boxMon->secure.substructs[v4]; \ - break; \ - } \ - break; \ - } \ - - -static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType) -{ - union PokemonSubstruct *substruct = NULL; - - switch (personality % 24) - { - SUBSTRUCT_CASE( 0,0,1,2,3) - SUBSTRUCT_CASE( 1,0,1,3,2) - SUBSTRUCT_CASE( 2,0,2,1,3) - SUBSTRUCT_CASE( 3,0,3,1,2) - SUBSTRUCT_CASE( 4,0,2,3,1) - SUBSTRUCT_CASE( 5,0,3,2,1) - SUBSTRUCT_CASE( 6,1,0,2,3) - SUBSTRUCT_CASE( 7,1,0,3,2) - SUBSTRUCT_CASE( 8,2,0,1,3) - SUBSTRUCT_CASE( 9,3,0,1,2) - SUBSTRUCT_CASE(10,2,0,3,1) - SUBSTRUCT_CASE(11,3,0,2,1) - SUBSTRUCT_CASE(12,1,2,0,3) - SUBSTRUCT_CASE(13,1,3,0,2) - SUBSTRUCT_CASE(14,2,1,0,3) - SUBSTRUCT_CASE(15,3,1,0,2) - SUBSTRUCT_CASE(16,2,3,0,1) - SUBSTRUCT_CASE(17,3,2,0,1) - SUBSTRUCT_CASE(18,1,2,3,0) - SUBSTRUCT_CASE(19,1,3,2,0) - SUBSTRUCT_CASE(20,2,1,3,0) - SUBSTRUCT_CASE(21,3,1,2,0) - SUBSTRUCT_CASE(22,2,3,1,0) - SUBSTRUCT_CASE(23,3,2,1,0) - } - - return substruct; +static const u8 sSubstructOffsets[4][24] = +{ + [SUBSTRUCT_TYPE_0] = {0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 2, 3, 1, 1, 2, 3, 2, 3, 1, 1, 2, 3, 2, 3}, + [SUBSTRUCT_TYPE_1] = {1, 1, 2, 3, 2, 3, 0, 0, 0, 0, 0, 0, 2, 3, 1, 1, 3, 2, 2, 3, 1, 1, 3, 2}, + [SUBSTRUCT_TYPE_2] = {2, 3, 1, 1, 3, 2, 2, 3, 1, 1, 3, 2, 0, 0, 0, 0, 0, 0, 3, 2, 3, 2, 1, 1}, + [SUBSTRUCT_TYPE_3] = {3, 2, 3, 2, 1, 1, 3, 2, 3, 2, 1, 1, 3, 2, 3, 2, 1, 1, 0, 0, 0, 0, 0, 0}, +}; + +ARM_FUNC NOINLINE static u32 ConstantMod24(u32 a) { return a % 24; } + +static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, enum SubstructType substructType) +{ + return &boxMon->secure.substructs[sSubstructOffsets[substructType][ConstantMod24(personality)]]; } /* GameFreak called GetMonData with either 2 or 3 arguments, for type @@ -2409,19 +2256,58 @@ u32 GetMonData2(struct Pokemon *mon, s32 field) return GetMonData3(mon, field, NULL); } -struct EvolutionTrackerBitfield -{ - u16 a: 5; - u16 b: 5; - u16 unused: 6; -}; union EvolutionTracker { - u16 value; - struct EvolutionTrackerBitfield asField; + u16 combinedValue:10; + struct { + u16 tracker1: 5; + u16 tracker2: 5; + }; }; +static ALWAYS_INLINE struct PokemonSubstruct0 *GetSubstruct0(struct BoxPokemon *boxMon) +{ + return &(GetSubstruct(boxMon, boxMon->personality, SUBSTRUCT_TYPE_0)->type0); +} + +static ALWAYS_INLINE struct PokemonSubstruct1 *GetSubstruct1(struct BoxPokemon *boxMon) +{ + return &(GetSubstruct(boxMon, boxMon->personality, SUBSTRUCT_TYPE_1)->type1); +} + +static ALWAYS_INLINE struct PokemonSubstruct2 *GetSubstruct2(struct BoxPokemon *boxMon) +{ + return &(GetSubstruct(boxMon, boxMon->personality, SUBSTRUCT_TYPE_2)->type2); +} + +static ALWAYS_INLINE struct PokemonSubstruct3 *GetSubstruct3(struct BoxPokemon *boxMon) +{ + return &(GetSubstruct(boxMon, boxMon->personality, SUBSTRUCT_TYPE_3)->type3); +} + +static bool32 IsBadEgg(struct BoxPokemon *boxMon) +{ + if (boxMon->isBadEgg) + return TRUE; + + if (CalculateBoxMonChecksum(boxMon) != boxMon->checksum) + { + boxMon->isBadEgg = TRUE; + boxMon->isEgg = TRUE; + GetSubstruct3(boxMon)->isEgg = TRUE; + + return TRUE; + } + + return FALSE; +} + +static ALWAYS_INLINE bool32 IsEggOrBadEgg(struct BoxPokemon *boxMon) +{ + return GetSubstruct3(boxMon)->isEgg || IsBadEgg(boxMon); +} + /* GameFreak called GetBoxMonData with either 2 or 3 arguments, for type * safety we have a GetBoxMonData macro (in include/pokemon.h) which * dispatches to either GetBoxMonData2 or GetBoxMonData3 based on the @@ -2430,35 +2316,18 @@ u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) { s32 i; u32 retVal = 0; - struct PokemonSubstruct0 *substruct0 = NULL; - struct PokemonSubstruct1 *substruct1 = NULL; - struct PokemonSubstruct2 *substruct2 = NULL; - struct PokemonSubstruct3 *substruct3 = NULL; - union EvolutionTracker evoTracker; // Any field greater than MON_DATA_ENCRYPT_SEPARATOR is encrypted and must be treated as such if (field > MON_DATA_ENCRYPT_SEPARATOR) { - substruct0 = &(GetSubstruct(boxMon, boxMon->personality, 0)->type0); - substruct1 = &(GetSubstruct(boxMon, boxMon->personality, 1)->type1); - substruct2 = &(GetSubstruct(boxMon, boxMon->personality, 2)->type2); - substruct3 = &(GetSubstruct(boxMon, boxMon->personality, 3)->type3); - DecryptBoxMon(boxMon); - if (CalculateBoxMonChecksum(boxMon) != boxMon->checksum) - { - boxMon->isBadEgg = TRUE; - boxMon->isEgg = TRUE; - substruct3->isEgg = TRUE; - } - switch (field) { case MON_DATA_NICKNAME: case MON_DATA_NICKNAME10: { - if (boxMon->isBadEgg) + if (IsBadEgg(boxMon)) { for (retVal = 0; retVal < POKEMON_NAME_LENGTH && gText_BadEgg[retVal] != EOS; @@ -2497,6 +2366,7 @@ u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) // so if both are 0 we assume that this is a vanilla // PokΓ©mon and replace them with EOS. This means that // two CHAR_SPACE at the end of a nickname are trimmed. + struct PokemonSubstruct0 *substruct0 = GetSubstruct0(boxMon); if (field != MON_DATA_NICKNAME10 && POKEMON_NAME_LENGTH >= 12) { if (substruct0->nickname11 == 0 && substruct0->nickname12 == 0) @@ -2510,7 +2380,7 @@ u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) data[retVal++] = substruct0->nickname12; } } - else if (POKEMON_NAME_LENGTH >= 11) + else if (field != MON_DATA_NICKNAME10 && POKEMON_NAME_LENGTH >= 11) { if (substruct0->nickname11 == 0) { @@ -2527,182 +2397,184 @@ u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) break; } case MON_DATA_SPECIES: - retVal = boxMon->isBadEgg ? SPECIES_EGG : substruct0->species; + retVal = IsBadEgg(boxMon) ? SPECIES_EGG : GetSubstruct0(boxMon)->species; break; case MON_DATA_HELD_ITEM: - retVal = substruct0->heldItem; + retVal = GetSubstruct0(boxMon)->heldItem; break; case MON_DATA_EXP: - retVal = substruct0->experience; + retVal = GetSubstruct0(boxMon)->experience; break; case MON_DATA_PP_BONUSES: - retVal = substruct0->ppBonuses; + retVal = GetSubstruct0(boxMon)->ppBonuses; break; case MON_DATA_FRIENDSHIP: - retVal = substruct0->friendship; + retVal = GetSubstruct0(boxMon)->friendship; break; case MON_DATA_MOVE1: - retVal = substruct1->move1; + retVal = GetSubstruct1(boxMon)->move1; break; case MON_DATA_MOVE2: - retVal = substruct1->move2; + retVal = GetSubstruct1(boxMon)->move2; break; case MON_DATA_MOVE3: - retVal = substruct1->move3; + retVal = GetSubstruct1(boxMon)->move3; break; case MON_DATA_MOVE4: - retVal = substruct1->move4; + retVal = GetSubstruct1(boxMon)->move4; break; case MON_DATA_PP1: - retVal = substruct1->pp1; + retVal = GetSubstruct1(boxMon)->pp1; break; case MON_DATA_PP2: - retVal = substruct1->pp2; + retVal = GetSubstruct1(boxMon)->pp2; break; case MON_DATA_PP3: - retVal = substruct1->pp3; + retVal = GetSubstruct1(boxMon)->pp3; break; case MON_DATA_PP4: - retVal = substruct1->pp4; + retVal = GetSubstruct1(boxMon)->pp4; break; case MON_DATA_HP_EV: - retVal = substruct2->hpEV; + retVal = GetSubstruct2(boxMon)->hpEV; break; case MON_DATA_ATK_EV: - retVal = substruct2->attackEV; + retVal = GetSubstruct2(boxMon)->attackEV; break; case MON_DATA_DEF_EV: - retVal = substruct2->defenseEV; + retVal = GetSubstruct2(boxMon)->defenseEV; break; case MON_DATA_SPEED_EV: - retVal = substruct2->speedEV; + retVal = GetSubstruct2(boxMon)->speedEV; break; case MON_DATA_SPATK_EV: - retVal = substruct2->spAttackEV; + retVal = GetSubstruct2(boxMon)->spAttackEV; break; case MON_DATA_SPDEF_EV: - retVal = substruct2->spDefenseEV; + retVal = GetSubstruct2(boxMon)->spDefenseEV; break; case MON_DATA_COOL: - retVal = substruct2->cool; + retVal = GetSubstruct2(boxMon)->cool; break; case MON_DATA_BEAUTY: - retVal = substruct2->beauty; + retVal = GetSubstruct2(boxMon)->beauty; break; case MON_DATA_CUTE: - retVal = substruct2->cute; + retVal = GetSubstruct2(boxMon)->cute; break; case MON_DATA_SMART: - retVal = substruct2->smart; + retVal = GetSubstruct2(boxMon)->smart; break; case MON_DATA_TOUGH: - retVal = substruct2->tough; + retVal = GetSubstruct2(boxMon)->tough; break; case MON_DATA_SHEEN: - retVal = substruct2->sheen; + retVal = GetSubstruct2(boxMon)->sheen; break; case MON_DATA_POKERUS: - retVal = substruct3->pokerus; + retVal = GetSubstruct3(boxMon)->pokerus; break; case MON_DATA_MET_LOCATION: - retVal = substruct3->metLocation; + retVal = GetSubstruct3(boxMon)->metLocation; break; case MON_DATA_MET_LEVEL: - retVal = substruct3->metLevel; + retVal = GetSubstruct3(boxMon)->metLevel; break; case MON_DATA_MET_GAME: - retVal = substruct3->metGame; + retVal = GetSubstruct3(boxMon)->metGame; break; case MON_DATA_POKEBALL: - retVal = substruct0->pokeball; + retVal = GetSubstruct0(boxMon)->pokeball; break; case MON_DATA_OT_GENDER: - retVal = substruct3->otGender; + retVal = GetSubstruct3(boxMon)->otGender; break; case MON_DATA_HP_IV: - retVal = substruct3->hpIV; + retVal = GetSubstruct3(boxMon)->hpIV; break; case MON_DATA_ATK_IV: - retVal = substruct3->attackIV; + retVal = GetSubstruct3(boxMon)->attackIV; break; case MON_DATA_DEF_IV: - retVal = substruct3->defenseIV; + retVal = GetSubstruct3(boxMon)->defenseIV; break; case MON_DATA_SPEED_IV: - retVal = substruct3->speedIV; + retVal = GetSubstruct3(boxMon)->speedIV; break; case MON_DATA_SPATK_IV: - retVal = substruct3->spAttackIV; + retVal = GetSubstruct3(boxMon)->spAttackIV; break; case MON_DATA_SPDEF_IV: - retVal = substruct3->spDefenseIV; + retVal = GetSubstruct3(boxMon)->spDefenseIV; break; case MON_DATA_IS_EGG: - retVal = substruct3->isEgg; + retVal = IsEggOrBadEgg(boxMon); break; case MON_DATA_ABILITY_NUM: - retVal = substruct3->abilityNum; + retVal = GetSubstruct3(boxMon)->abilityNum; break; case MON_DATA_COOL_RIBBON: - retVal = substruct3->coolRibbon; + retVal = GetSubstruct3(boxMon)->coolRibbon; break; case MON_DATA_BEAUTY_RIBBON: - retVal = substruct3->beautyRibbon; + retVal = GetSubstruct3(boxMon)->beautyRibbon; break; case MON_DATA_CUTE_RIBBON: - retVal = substruct3->cuteRibbon; + retVal = GetSubstruct3(boxMon)->cuteRibbon; break; case MON_DATA_SMART_RIBBON: - retVal = substruct3->smartRibbon; + retVal = GetSubstruct3(boxMon)->smartRibbon; break; case MON_DATA_TOUGH_RIBBON: - retVal = substruct3->toughRibbon; + retVal = GetSubstruct3(boxMon)->toughRibbon; break; case MON_DATA_CHAMPION_RIBBON: - retVal = substruct3->championRibbon; + retVal = GetSubstruct3(boxMon)->championRibbon; break; case MON_DATA_WINNING_RIBBON: - retVal = substruct3->winningRibbon; + retVal = GetSubstruct3(boxMon)->winningRibbon; break; case MON_DATA_VICTORY_RIBBON: - retVal = substruct3->victoryRibbon; + retVal = GetSubstruct3(boxMon)->victoryRibbon; break; case MON_DATA_ARTIST_RIBBON: - retVal = substruct3->artistRibbon; + retVal = GetSubstruct3(boxMon)->artistRibbon; break; case MON_DATA_EFFORT_RIBBON: - retVal = substruct3->effortRibbon; + retVal = GetSubstruct3(boxMon)->effortRibbon; break; case MON_DATA_MARINE_RIBBON: - retVal = substruct3->marineRibbon; + retVal = GetSubstruct3(boxMon)->marineRibbon; break; case MON_DATA_LAND_RIBBON: - retVal = substruct3->landRibbon; + retVal = GetSubstruct3(boxMon)->landRibbon; break; case MON_DATA_SKY_RIBBON: - retVal = substruct3->skyRibbon; + retVal = GetSubstruct3(boxMon)->skyRibbon; break; case MON_DATA_COUNTRY_RIBBON: - retVal = substruct3->countryRibbon; + retVal = GetSubstruct3(boxMon)->countryRibbon; break; case MON_DATA_NATIONAL_RIBBON: - retVal = substruct3->nationalRibbon; + retVal = GetSubstruct3(boxMon)->nationalRibbon; break; case MON_DATA_EARTH_RIBBON: - retVal = substruct3->earthRibbon; + retVal = GetSubstruct3(boxMon)->earthRibbon; break; case MON_DATA_WORLD_RIBBON: - retVal = substruct3->worldRibbon; + retVal = GetSubstruct3(boxMon)->worldRibbon; break; case MON_DATA_MODERN_FATEFUL_ENCOUNTER: - retVal = substruct3->modernFatefulEncounter; + retVal = GetSubstruct3(boxMon)->modernFatefulEncounter; break; case MON_DATA_SPECIES_OR_EGG: - retVal = substruct0->species; - if (substruct0->species && (substruct3->isEgg || boxMon->isBadEgg)) + retVal = GetSubstruct0(boxMon)->species; + if (retVal && IsEggOrBadEgg(boxMon)) retVal = SPECIES_EGG; break; case MON_DATA_IVS: + { + struct PokemonSubstruct3 *substruct3 = GetSubstruct3(boxMon); retVal = substruct3->hpIV | (substruct3->attackIV << 5) | (substruct3->defenseIV << 10) @@ -2710,9 +2582,11 @@ u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) | (substruct3->spAttackIV << 20) | (substruct3->spDefenseIV << 25); break; + } case MON_DATA_KNOWN_MOVES: - if (substruct0->species && !substruct3->isEgg) + if (GetSubstruct0(boxMon)->species && !IsEggOrBadEgg(boxMon)) { + struct PokemonSubstruct1 *substruct1 = GetSubstruct1(boxMon); u16 *moves = (u16 *)data; s32 i = 0; @@ -2729,9 +2603,10 @@ u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) } break; case MON_DATA_RIBBON_COUNT: - retVal = 0; - if (substruct0->species && !substruct3->isEgg) + if (GetSubstruct0(boxMon)->species && !IsEggOrBadEgg(boxMon)) { + struct PokemonSubstruct3 *substruct3 = GetSubstruct3(boxMon); + retVal = 0; retVal += substruct3->coolRibbon; retVal += substruct3->beautyRibbon; retVal += substruct3->cuteRibbon; @@ -2752,75 +2627,81 @@ u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) } break; case MON_DATA_RIBBONS: - retVal = 0; - if (substruct0->species && !substruct3->isEgg) + if (GetSubstruct0(boxMon)->species && !IsEggOrBadEgg(boxMon)) { + struct PokemonSubstruct3 *substruct3 = GetSubstruct3(boxMon); retVal = substruct3->championRibbon - | (substruct3->coolRibbon << 1) - | (substruct3->beautyRibbon << 4) - | (substruct3->cuteRibbon << 7) - | (substruct3->smartRibbon << 10) - | (substruct3->toughRibbon << 13) - | (substruct3->winningRibbon << 16) - | (substruct3->victoryRibbon << 17) - | (substruct3->artistRibbon << 18) - | (substruct3->effortRibbon << 19) - | (substruct3->marineRibbon << 20) - | (substruct3->landRibbon << 21) - | (substruct3->skyRibbon << 22) - | (substruct3->countryRibbon << 23) - | (substruct3->nationalRibbon << 24) - | (substruct3->earthRibbon << 25) - | (substruct3->worldRibbon << 26); + | (substruct3->coolRibbon << 1) + | (substruct3->beautyRibbon << 4) + | (substruct3->cuteRibbon << 7) + | (substruct3->smartRibbon << 10) + | (substruct3->toughRibbon << 13) + | (substruct3->winningRibbon << 16) + | (substruct3->victoryRibbon << 17) + | (substruct3->artistRibbon << 18) + | (substruct3->effortRibbon << 19) + | (substruct3->marineRibbon << 20) + | (substruct3->landRibbon << 21) + | (substruct3->skyRibbon << 22) + | (substruct3->countryRibbon << 23) + | (substruct3->nationalRibbon << 24) + | (substruct3->earthRibbon << 25) + | (substruct3->worldRibbon << 26); } break; case MON_DATA_HYPER_TRAINED_HP: - retVal = substruct1->hyperTrainedHP; + retVal = GetSubstruct1(boxMon)->hyperTrainedHP; break; case MON_DATA_HYPER_TRAINED_ATK: - retVal = substruct1->hyperTrainedAttack; + retVal = GetSubstruct1(boxMon)->hyperTrainedAttack; break; case MON_DATA_HYPER_TRAINED_DEF: - retVal = substruct1->hyperTrainedDefense; + retVal = GetSubstruct1(boxMon)->hyperTrainedDefense; break; case MON_DATA_HYPER_TRAINED_SPEED: - retVal = substruct1->hyperTrainedSpeed; + retVal = GetSubstruct1(boxMon)->hyperTrainedSpeed; break; case MON_DATA_HYPER_TRAINED_SPATK: - retVal = substruct1->hyperTrainedSpAttack; + retVal = GetSubstruct1(boxMon)->hyperTrainedSpAttack; break; case MON_DATA_HYPER_TRAINED_SPDEF: - retVal = substruct1->hyperTrainedSpDefense; + retVal = GetSubstruct1(boxMon)->hyperTrainedSpDefense; break; case MON_DATA_IS_SHADOW: - retVal = substruct3->isShadow; + retVal = GetSubstruct3(boxMon)->isShadow; break; case MON_DATA_DYNAMAX_LEVEL: - retVal = substruct3->dynamaxLevel; + retVal = GetSubstruct3(boxMon)->dynamaxLevel; break; case MON_DATA_GIGANTAMAX_FACTOR: - retVal = substruct3->gigantamaxFactor; + retVal = GetSubstruct3(boxMon)->gigantamaxFactor; break; case MON_DATA_TERA_TYPE: - if (gSpeciesInfo[substruct0->species].forceTeraType) - { - retVal = gSpeciesInfo[substruct0->species].forceTeraType; - } - else if (substruct0->teraType == TYPE_NONE) // Tera Type hasn't been modified so we can just use the personality - { - const u8 *types = gSpeciesInfo[substruct0->species].types; - retVal = (boxMon->personality & 0x1) == 0 ? types[0] : types[1]; - } - else { - retVal = substruct0->teraType; + struct PokemonSubstruct0 *substruct0 = GetSubstruct0(boxMon); + if (gSpeciesInfo[substruct0->species].forceTeraType) + { + retVal = gSpeciesInfo[substruct0->species].forceTeraType; + } + else if (substruct0->teraType == TYPE_NONE) // Tera Type hasn't been modified so we can just use the personality + { + const enum Type *types = gSpeciesInfo[substruct0->species].types; + retVal = (boxMon->personality & 0x1) == 0 ? types[0] : types[1]; + } + else + { + retVal = substruct0->teraType; + } } break; case MON_DATA_EVOLUTION_TRACKER: - evoTracker.asField.a = substruct1->evolutionTracker1; - evoTracker.asField.b = substruct1->evolutionTracker2; - evoTracker.asField.unused = 0; - retVal = evoTracker.value; + { + struct PokemonSubstruct1 *substruct1 = GetSubstruct1(boxMon); + retVal = (union EvolutionTracker) { + .tracker1 = substruct1->evolutionTracker1, + .tracker2 = substruct1->evolutionTracker2, + }.combinedValue; + } break; default: break; @@ -2907,6 +2788,19 @@ u32 GetBoxMonData2(struct BoxPokemon *boxMon, s32 field) #define SET8(lhs) (lhs) = *data #define SET16(lhs) (lhs) = data[0] + (data[1] << 8) #define SET32(lhs) (lhs) = data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24) +// +// Prefer SET_BY_WIDTH for fields whose types might be extended (e.g. +// anything whose typedef is in gametypes.h). +// +#define SET_BY_WIDTH(lhs) \ + do { \ + if (sizeof(lhs) == 1) \ + SET8(lhs); \ + else if (sizeof(lhs) == 2) \ + SET16(lhs); \ + else if (sizeof(lhs) == 4) \ + SET32(lhs); \ + } while (0) void SetMonData(struct Pokemon *mon, s32 field, const void *dataArg) { @@ -2970,25 +2864,13 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) { const u8 *data = dataArg; - struct PokemonSubstruct0 *substruct0 = NULL; - struct PokemonSubstruct1 *substruct1 = NULL; - struct PokemonSubstruct2 *substruct2 = NULL; - struct PokemonSubstruct3 *substruct3 = NULL; - if (field > MON_DATA_ENCRYPT_SEPARATOR) { - substruct0 = &(GetSubstruct(boxMon, boxMon->personality, 0)->type0); - substruct1 = &(GetSubstruct(boxMon, boxMon->personality, 1)->type1); - substruct2 = &(GetSubstruct(boxMon, boxMon->personality, 2)->type2); - substruct3 = &(GetSubstruct(boxMon, boxMon->personality, 3)->type3); - - DecryptBoxMon(boxMon); - - if (CalculateBoxMonChecksum(boxMon) != boxMon->checksum) + if (CalculateBoxMonChecksumDecrypt(boxMon) != boxMon->checksum) { boxMon->isBadEgg = TRUE; boxMon->isEgg = TRUE; - substruct3->isEgg = TRUE; + GetSubstruct3(boxMon)->isEgg = TRUE; EncryptBoxMon(boxMon); return; } @@ -2999,6 +2881,7 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) case MON_DATA_NICKNAME10: { s32 i; + struct PokemonSubstruct0 *substruct0 = GetSubstruct0(boxMon); for (i = 0; i < min(sizeof(boxMon->nickname), POKEMON_NAME_LENGTH); i++) boxMon->nickname[i] = data[i]; if (field != MON_DATA_NICKNAME10) @@ -3017,6 +2900,7 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) } case MON_DATA_SPECIES: { + struct PokemonSubstruct0 *substruct0 = GetSubstruct0(boxMon); SET16(substruct0->species); if (substruct0->species) boxMon->hasSpecies = TRUE; @@ -3025,180 +2909,178 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) break; } case MON_DATA_HELD_ITEM: - SET16(substruct0->heldItem); + SET16(GetSubstruct0(boxMon)->heldItem); break; case MON_DATA_EXP: - SET32(substruct0->experience); + SET32(GetSubstruct0(boxMon)->experience); break; case MON_DATA_PP_BONUSES: - SET8(substruct0->ppBonuses); + SET8(GetSubstruct0(boxMon)->ppBonuses); break; case MON_DATA_FRIENDSHIP: - SET8(substruct0->friendship); + SET8(GetSubstruct0(boxMon)->friendship); break; case MON_DATA_MOVE1: - SET16(substruct1->move1); + SET16(GetSubstruct1(boxMon)->move1); break; case MON_DATA_MOVE2: - SET16(substruct1->move2); + SET16(GetSubstruct1(boxMon)->move2); break; case MON_DATA_MOVE3: - SET16(substruct1->move3); + SET16(GetSubstruct1(boxMon)->move3); break; case MON_DATA_MOVE4: - SET16(substruct1->move4); + SET16(GetSubstruct1(boxMon)->move4); break; case MON_DATA_PP1: - SET8(substruct1->pp1); + SET8(GetSubstruct1(boxMon)->pp1); break; case MON_DATA_PP2: - SET8(substruct1->pp2); + SET8(GetSubstruct1(boxMon)->pp2); break; case MON_DATA_PP3: - SET8(substruct1->pp3); + SET8(GetSubstruct1(boxMon)->pp3); break; case MON_DATA_PP4: - SET8(substruct1->pp4); + SET8(GetSubstruct1(boxMon)->pp4); break; case MON_DATA_HP_EV: - SET8(substruct2->hpEV); + SET8(GetSubstruct2(boxMon)->hpEV); break; case MON_DATA_ATK_EV: - SET8(substruct2->attackEV); + SET8(GetSubstruct2(boxMon)->attackEV); break; case MON_DATA_DEF_EV: - SET8(substruct2->defenseEV); + SET8(GetSubstruct2(boxMon)->defenseEV); break; case MON_DATA_SPEED_EV: - SET8(substruct2->speedEV); + SET8(GetSubstruct2(boxMon)->speedEV); break; case MON_DATA_SPATK_EV: - SET8(substruct2->spAttackEV); + SET8(GetSubstruct2(boxMon)->spAttackEV); break; case MON_DATA_SPDEF_EV: - SET8(substruct2->spDefenseEV); + SET8(GetSubstruct2(boxMon)->spDefenseEV); break; case MON_DATA_COOL: - SET8(substruct2->cool); + SET8(GetSubstruct2(boxMon)->cool); break; case MON_DATA_BEAUTY: - SET8(substruct2->beauty); + SET8(GetSubstruct2(boxMon)->beauty); break; case MON_DATA_CUTE: - SET8(substruct2->cute); + SET8(GetSubstruct2(boxMon)->cute); break; case MON_DATA_SMART: - SET8(substruct2->smart); + SET8(GetSubstruct2(boxMon)->smart); break; case MON_DATA_TOUGH: - SET8(substruct2->tough); + SET8(GetSubstruct2(boxMon)->tough); break; case MON_DATA_SHEEN: - SET8(substruct2->sheen); + SET8(GetSubstruct2(boxMon)->sheen); break; case MON_DATA_POKERUS: - SET8(substruct3->pokerus); + SET8(GetSubstruct3(boxMon)->pokerus); break; case MON_DATA_MET_LOCATION: - SET8(substruct3->metLocation); + SET8(GetSubstruct3(boxMon)->metLocation); break; case MON_DATA_MET_LEVEL: - SET8(substruct3->metLevel); + SET8(GetSubstruct3(boxMon)->metLevel); break; case MON_DATA_MET_GAME: - SET8(substruct3->metGame); + SET8(GetSubstruct3(boxMon)->metGame); break; case MON_DATA_POKEBALL: - SET8(substruct0->pokeball); + SET8(GetSubstruct0(boxMon)->pokeball); break; case MON_DATA_OT_GENDER: - SET8(substruct3->otGender); + SET8(GetSubstruct3(boxMon)->otGender); break; case MON_DATA_HP_IV: - SET8(substruct3->hpIV); + SET8(GetSubstruct3(boxMon)->hpIV); break; case MON_DATA_ATK_IV: - SET8(substruct3->attackIV); + SET8(GetSubstruct3(boxMon)->attackIV); break; case MON_DATA_DEF_IV: - SET8(substruct3->defenseIV); + SET8(GetSubstruct3(boxMon)->defenseIV); break; case MON_DATA_SPEED_IV: - SET8(substruct3->speedIV); + SET8(GetSubstruct3(boxMon)->speedIV); break; case MON_DATA_SPATK_IV: - SET8(substruct3->spAttackIV); + SET8(GetSubstruct3(boxMon)->spAttackIV); break; case MON_DATA_SPDEF_IV: - SET8(substruct3->spDefenseIV); + SET8(GetSubstruct3(boxMon)->spDefenseIV); break; case MON_DATA_IS_EGG: - SET8(substruct3->isEgg); - if (substruct3->isEgg) - boxMon->isEgg = TRUE; - else - boxMon->isEgg = FALSE; + SET8(GetSubstruct3(boxMon)->isEgg); + SET8(boxMon->isEgg); break; case MON_DATA_ABILITY_NUM: - SET8(substruct3->abilityNum); + SET8(GetSubstruct3(boxMon)->abilityNum); break; case MON_DATA_COOL_RIBBON: - SET8(substruct3->coolRibbon); + SET8(GetSubstruct3(boxMon)->coolRibbon); break; case MON_DATA_BEAUTY_RIBBON: - SET8(substruct3->beautyRibbon); + SET8(GetSubstruct3(boxMon)->beautyRibbon); break; case MON_DATA_CUTE_RIBBON: - SET8(substruct3->cuteRibbon); + SET8(GetSubstruct3(boxMon)->cuteRibbon); break; case MON_DATA_SMART_RIBBON: - SET8(substruct3->smartRibbon); + SET8(GetSubstruct3(boxMon)->smartRibbon); break; case MON_DATA_TOUGH_RIBBON: - SET8(substruct3->toughRibbon); + SET8(GetSubstruct3(boxMon)->toughRibbon); break; case MON_DATA_CHAMPION_RIBBON: - SET8(substruct3->championRibbon); + SET8(GetSubstruct3(boxMon)->championRibbon); break; case MON_DATA_WINNING_RIBBON: - SET8(substruct3->winningRibbon); + SET8(GetSubstruct3(boxMon)->winningRibbon); break; case MON_DATA_VICTORY_RIBBON: - SET8(substruct3->victoryRibbon); + SET8(GetSubstruct3(boxMon)->victoryRibbon); break; case MON_DATA_ARTIST_RIBBON: - SET8(substruct3->artistRibbon); + SET8(GetSubstruct3(boxMon)->artistRibbon); break; case MON_DATA_EFFORT_RIBBON: - SET8(substruct3->effortRibbon); + SET8(GetSubstruct3(boxMon)->effortRibbon); break; case MON_DATA_MARINE_RIBBON: - SET8(substruct3->marineRibbon); + SET8(GetSubstruct3(boxMon)->marineRibbon); break; case MON_DATA_LAND_RIBBON: - SET8(substruct3->landRibbon); + SET8(GetSubstruct3(boxMon)->landRibbon); break; case MON_DATA_SKY_RIBBON: - SET8(substruct3->skyRibbon); + SET8(GetSubstruct3(boxMon)->skyRibbon); break; case MON_DATA_COUNTRY_RIBBON: - SET8(substruct3->countryRibbon); + SET8(GetSubstruct3(boxMon)->countryRibbon); break; case MON_DATA_NATIONAL_RIBBON: - SET8(substruct3->nationalRibbon); + SET8(GetSubstruct3(boxMon)->nationalRibbon); break; case MON_DATA_EARTH_RIBBON: - SET8(substruct3->earthRibbon); + SET8(GetSubstruct3(boxMon)->earthRibbon); break; case MON_DATA_WORLD_RIBBON: - SET8(substruct3->worldRibbon); + SET8(GetSubstruct3(boxMon)->worldRibbon); break; case MON_DATA_MODERN_FATEFUL_ENCOUNTER: - SET8(substruct3->modernFatefulEncounter); + SET8(GetSubstruct3(boxMon)->modernFatefulEncounter); break; case MON_DATA_IVS: { u32 ivs; + struct PokemonSubstruct3 *substruct3 = GetSubstruct3(boxMon); SET32(ivs); substruct3->hpIV = ivs & MAX_IV_MASK; substruct3->attackIV = (ivs >> 5) & MAX_IV_MASK; @@ -3209,43 +3091,42 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) break; } case MON_DATA_HYPER_TRAINED_HP: - SET8(substruct1->hyperTrainedHP); + SET8(GetSubstruct1(boxMon)->hyperTrainedHP); break; case MON_DATA_HYPER_TRAINED_ATK: - SET8(substruct1->hyperTrainedAttack); + SET8(GetSubstruct1(boxMon)->hyperTrainedAttack); break; case MON_DATA_HYPER_TRAINED_DEF: - SET8(substruct1->hyperTrainedDefense); + SET8(GetSubstruct1(boxMon)->hyperTrainedDefense); break; case MON_DATA_HYPER_TRAINED_SPEED: - SET8(substruct1->hyperTrainedSpeed); + SET8(GetSubstruct1(boxMon)->hyperTrainedSpeed); break; case MON_DATA_HYPER_TRAINED_SPATK: - SET8(substruct1->hyperTrainedSpAttack); + SET8(GetSubstruct1(boxMon)->hyperTrainedSpAttack); break; case MON_DATA_HYPER_TRAINED_SPDEF: - SET8(substruct1->hyperTrainedSpDefense); + SET8(GetSubstruct1(boxMon)->hyperTrainedSpDefense); break; case MON_DATA_IS_SHADOW: - SET8(substruct3->isShadow); + SET8(GetSubstruct3(boxMon)->isShadow); break; case MON_DATA_DYNAMAX_LEVEL: - SET8(substruct3->dynamaxLevel); + SET8(GetSubstruct3(boxMon)->dynamaxLevel); break; case MON_DATA_GIGANTAMAX_FACTOR: - SET8(substruct3->gigantamaxFactor); + SET8(GetSubstruct3(boxMon)->gigantamaxFactor); break; case MON_DATA_TERA_TYPE: - SET8(substruct0->teraType); + SET8(GetSubstruct0(boxMon)->teraType); break; case MON_DATA_EVOLUTION_TRACKER: { union EvolutionTracker evoTracker; - u32 evoTrackerValue; - SET32(evoTrackerValue); - evoTracker.value = evoTrackerValue; - substruct1->evolutionTracker1 = evoTracker.asField.a; - substruct1->evolutionTracker2 = evoTracker.asField.b; + struct PokemonSubstruct1 *substruct1 = GetSubstruct1(boxMon); + SET32(evoTracker.combinedValue); + substruct1->evolutionTracker1 = evoTracker.tracker1; + substruct1->evolutionTracker2 = evoTracker.tracker2; break; } default: @@ -3320,10 +3201,7 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) } if (field > MON_DATA_ENCRYPT_SEPARATOR) - { - boxMon->checksum = CalculateBoxMonChecksum(boxMon); - EncryptBoxMon(boxMon); - } + boxMon->checksum = CalculateBoxMonChecksumReencrypt(boxMon); } void CopyMon(void *dest, void *src, size_t size) @@ -3477,12 +3355,12 @@ u8 GetMonsStateToDoubles_2(void) return (aliveCount > 1) ? PLAYER_HAS_TWO_USABLE_MONS : PLAYER_HAS_ONE_USABLE_MON; } -u16 GetAbilityBySpecies(u16 species, u8 abilityNum) +enum Ability GetAbilityBySpecies(u16 species, u8 abilityNum) { int i; if (abilityNum < NUM_ABILITY_SLOTS) - gLastUsedAbility = gSpeciesInfo[species].abilities[abilityNum]; + gLastUsedAbility = GetSpeciesAbility(species, abilityNum); else gLastUsedAbility = ABILITY_NONE; @@ -3490,19 +3368,19 @@ u16 GetAbilityBySpecies(u16 species, u8 abilityNum) { for (i = NUM_NORMAL_ABILITY_SLOTS; i < NUM_ABILITY_SLOTS && gLastUsedAbility == ABILITY_NONE; i++) { - gLastUsedAbility = gSpeciesInfo[species].abilities[i]; + gLastUsedAbility = GetSpeciesAbility(species, i); } } for (i = 0; i < NUM_ABILITY_SLOTS && gLastUsedAbility == ABILITY_NONE; i++) // look for any non-empty ability { - gLastUsedAbility = gSpeciesInfo[species].abilities[i]; + gLastUsedAbility = GetSpeciesAbility(species, i); } return gLastUsedAbility; } -u16 GetMonAbility(struct Pokemon *mon) +enum Ability GetMonAbility(struct Pokemon *mon) { u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); u8 abilityNum = GetMonData(mon, MON_DATA_ABILITY_NUM, NULL); @@ -3550,7 +3428,7 @@ u8 GetSecretBaseTrainerPicIndex(void) return gFacilityClassToPicIndex[facilityClass]; } -u8 GetSecretBaseTrainerClass(void) +enum TrainerClassID GetSecretBaseTrainerClass(void) { u8 facilityClass = sSecretBaseFacilityClasses[gBattleResources->secretBase->gender][gBattleResources->secretBase->trainerId[0] % NUM_SECRET_BASE_CLASSES]; return gFacilityClassToTrainerClass[facilityClass]; @@ -3603,16 +3481,76 @@ const u8 *GetSpeciesPokedexDescription(u16 species) return gSpeciesInfo[species].description; } -u16 GetSpeciesHeight(u16 species) +u32 GetSpeciesHeight(u16 species) { return gSpeciesInfo[SanitizeSpeciesId(species)].height; } -u16 GetSpeciesWeight(u16 species) +u32 GetSpeciesWeight(u16 species) { return gSpeciesInfo[SanitizeSpeciesId(species)].weight; } +enum Type GetSpeciesType(u16 species, u8 slot) +{ + return gSpeciesInfo[SanitizeSpeciesId(species)].types[slot]; +} + +enum Ability GetSpeciesAbility(u16 species, u8 slot) +{ + return gSpeciesInfo[SanitizeSpeciesId(species)].abilities[slot]; +} + +u32 GetSpeciesBaseHP(u16 species) +{ + return gSpeciesInfo[SanitizeSpeciesId(species)].baseHP; +} + +u32 GetSpeciesBaseAttack(u16 species) +{ + return gSpeciesInfo[SanitizeSpeciesId(species)].baseAttack; +} + +u32 GetSpeciesBaseDefense(u16 species) +{ + return gSpeciesInfo[SanitizeSpeciesId(species)].baseDefense; +} + +u32 GetSpeciesBaseSpAttack(u16 species) +{ + return gSpeciesInfo[SanitizeSpeciesId(species)].baseSpAttack; +} + +u32 GetSpeciesBaseSpDefense(u16 species) +{ + return gSpeciesInfo[SanitizeSpeciesId(species)].baseSpDefense; +} + +u32 GetSpeciesBaseSpeed(u16 species) +{ + return gSpeciesInfo[SanitizeSpeciesId(species)].baseSpeed; +} + +u32 GetSpeciesBaseStat(u16 species, u32 statIndex) +{ + switch (statIndex) + { + case STAT_HP: + return GetSpeciesBaseHP(species); + case STAT_ATK: + return GetSpeciesBaseAttack(species); + case STAT_DEF: + return GetSpeciesBaseDefense(species); + case STAT_SPEED: + return GetSpeciesBaseSpeed(species); + case STAT_SPATK: + return GetSpeciesBaseSpAttack(species); + case STAT_SPDEF: + return GetSpeciesBaseSpDefense(species); + } + return 0; +} + const struct LevelUpMove *GetSpeciesLevelUpLearnset(u16 species) { const struct LevelUpMove *learnset = gSpeciesInfo[SanitizeSpeciesId(species)].levelUpLearnset; @@ -3713,8 +3651,8 @@ void PokemonToBattleMon(struct Pokemon *src, struct BattlePokemon *dst) dst->spDefense = GetMonData(src, MON_DATA_SPDEF, NULL); dst->abilityNum = GetMonData(src, MON_DATA_ABILITY_NUM, NULL); dst->otId = GetMonData(src, MON_DATA_OT_ID, NULL); - dst->types[0] = gSpeciesInfo[dst->species].types[0]; - dst->types[1] = gSpeciesInfo[dst->species].types[1]; + dst->types[0] = GetSpeciesType(dst->species, 0); + dst->types[1] = GetSpeciesType(dst->species, 1); dst->types[2] = TYPE_MYSTERY; dst->isShiny = IsMonShiny(src); dst->ability = GetAbilityBySpecies(dst->species, dst->abilityNum); @@ -3725,7 +3663,7 @@ void PokemonToBattleMon(struct Pokemon *src, struct BattlePokemon *dst) for (i = 0; i < NUM_BATTLE_STATS; i++) dst->statStages[i] = DEFAULT_STAT_STAGE; - dst->status2 = 0; + memset(&dst->volatiles, 0, sizeof(struct Volatiles)); } void CopyPartyMonToBattleData(u32 battler, u32 partyIndex) @@ -3749,17 +3687,7 @@ bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, { \ friendshipChange = itemEffect[itemEffectParam]; \ friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); \ - if (friendshipChange > 0 && holdEffect == HOLD_EFFECT_FRIENDSHIP_UP) \ - friendship += 150 * friendshipChange / 100; \ - else \ - friendship += friendshipChange; \ - if (friendshipChange > 0) \ - { \ - if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == ITEM_LUXURY_BALL) \ - friendship++; \ - if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) \ - friendship++; \ - } \ + friendship += CalculateFriendshipBonuses(mon,friendshipChange,holdEffect); \ if (friendship < 0) \ friendship = 0; \ if (friendship > MAX_FRIENDSHIP) \ @@ -3790,9 +3718,9 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov u8 itemEffectParam = ITEM_EFFECT_ARG_START; u32 temp1, temp2; s8 friendshipChange = 0; - u8 holdEffect; + enum HoldEffect holdEffect; u8 battler = MAX_BATTLERS_COUNT; - u32 friendshipOnly = FALSE; + bool32 friendshipOnly = FALSE; u16 heldItem; u8 effectFlags; s8 evChange; @@ -4376,7 +4304,7 @@ u8 GetItemEffectParamOffset(u32 battler, u16 itemId, u8 effectByte, u8 effectBit return offset; } -static void BufferStatRoseMessage(s32 statIdx) +static void BufferStatRoseMessage(enum Stat statIdx) { gBattlerTarget = gBattlerInMenuId; StringCopy(gBattleTextBuff1, gStatNamesTable[sStatsToRaise[statIdx]]); @@ -4490,7 +4418,7 @@ bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct Evoluti u32 removeBagItemCount = 0; u32 evolutionTracker = GetMonData(mon, MON_DATA_EVOLUTION_TRACKER, 0); u32 partnerSpecies, partnerHeldItem; - enum ItemHoldEffect partnerHoldEffect; + enum HoldEffect partnerHoldEffect; if (tradePartner != NULL) { @@ -4517,13 +4445,13 @@ bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct Evoluti for (i = 0; params != NULL && params[i].condition != CONDITIONS_END; i++) { enum EvolutionConditions condition = params[i].condition; - u32 currentCondition = FALSE; + bool32 currentCondition = FALSE; switch(condition) { // Gen 2 case IF_GENDER: - if (gender == GetMonGender(mon)) + if (gender == params[i].arg1) currentCondition = TRUE; break; case IF_MIN_FRIENDSHIP: @@ -4641,8 +4569,8 @@ bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct Evoluti for (j = 0; j < PARTY_SIZE; j++) { u16 currSpecies = GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL); - if (gSpeciesInfo[currSpecies].types[0] == params[i].arg1 - || gSpeciesInfo[currSpecies].types[1] == params[i].arg1) + if (GetSpeciesType(currSpecies, 0) == params[i].arg1 + || GetSpeciesType(currSpecies, 1) == params[i].arg1) { currentCondition = TRUE; break; @@ -4769,6 +4697,14 @@ bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct Evoluti *canStopEvo = FALSE; } break; + case IF_REGION: + if (GetCurrentRegion() == params[i].arg1) + currentCondition = TRUE; + break; + case IF_NOT_REGION: + if (GetCurrentRegion() != params[i].arg1) + currentCondition = TRUE; + break; case CONDITIONS_END: break; } @@ -4800,7 +4736,7 @@ u32 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 u32 species = GetMonData(mon, MON_DATA_SPECIES, 0); u32 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); u32 level = GetMonData(mon, MON_DATA_LEVEL, 0); - u32 holdEffect; + enum HoldEffect holdEffect; const struct Evolution *evolutions = GetSpeciesEvolutions(species); if (evolutions == NULL) @@ -4882,7 +4818,7 @@ u32 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 case EVO_MODE_ITEM_CHECK: for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) { - bool32 conditionMet = FALSE; + bool32 conditionsMet = FALSE; if (SanitizeSpeciesId(evolutions[i].targetSpecies) == SPECIES_NONE) continue; @@ -4890,11 +4826,11 @@ u32 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 { case EVO_ITEM: if (evolutions[i].param == evolutionItem) - conditionMet = TRUE; + conditionsMet = TRUE; break; } - if (conditionMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, PARTY_SIZE, canStopEvo, evoState)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, PARTY_SIZE, canStopEvo, evoState)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4916,9 +4852,9 @@ u32 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 switch (evolutions[i].method) { - case EVO_BATTLE_END: - conditionsMet = TRUE; - break; + case EVO_BATTLE_END: + conditionsMet = TRUE; + break; } if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, evolutionItem, canStopEvo, evoState)) @@ -4941,11 +4877,9 @@ u32 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 switch (evolutions[i].method) { - case EVO_SCRIPT_TRIGGER: case EVO_SPIN: if (gSpecialVar_0x8000 == evolutions[i].param) conditionsMet = TRUE; - break; } @@ -4959,6 +4893,23 @@ u32 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 } } break; + case EVO_MODE_SCRIPT_TRIGGER: + for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) + { + if (SanitizeSpeciesId(evolutions[i].targetSpecies) == SPECIES_NONE) + continue; + if (evolutions[i].method != EVO_SCRIPT_TRIGGER) + continue; + if (DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, PARTY_SIZE, canStopEvo, evoState)) + { + // All checks passed, so stop checking the rest of the evolutions. + // This is different from vanilla where the loop continues. + // If you have overlapping evolutions, put the ones you want to happen first on top of the list. + targetSpecies = evolutions[i].targetSpecies; + break; + } + } + break; } // Pikachu, Meowth, Eevee and Duraludon cannot evolve if they have the @@ -5001,7 +4952,7 @@ bool8 IsMonPastEvolutionLevel(struct Pokemon *mon) return FALSE; } -u16 NationalPokedexNumToSpecies(u16 nationalNum) +u16 NationalPokedexNumToSpecies(enum NationalDexOrder nationalNum) { u16 species; @@ -5019,7 +4970,7 @@ u16 NationalPokedexNumToSpecies(u16 nationalNum) return GET_BASE_SPECIES_ID(species); } -u16 NationalToHoennOrder(u16 nationalNum) +enum HoennDexOrder NationalToHoennOrder(enum NationalDexOrder nationalNum) { u16 hoennNum; @@ -5037,7 +4988,7 @@ u16 NationalToHoennOrder(u16 nationalNum) return hoennNum + 1; } -u16 SpeciesToNationalPokedexNum(u16 species) +enum NationalDexOrder SpeciesToNationalPokedexNum(u16 species) { species = SanitizeSpeciesId(species); if (!species) @@ -5046,14 +4997,14 @@ u16 SpeciesToNationalPokedexNum(u16 species) return gSpeciesInfo[species].natDexNum; } -u16 SpeciesToHoennPokedexNum(u16 species) +enum HoennDexOrder SpeciesToHoennPokedexNum(u16 species) { if (!species) return 0; return NationalToHoennOrder(gSpeciesInfo[species].natDexNum); } -u16 HoennToNationalOrder(u16 hoennNum) +enum NationalDexOrder HoennToNationalOrder(enum HoennDexOrder hoennNum) { if (!hoennNum || hoennNum >= HOENN_DEX_COUNT) return 0; @@ -5220,7 +5171,7 @@ u8 GetTrainerEncounterMusicId(u16 trainerOpponentId) u32 sanitizedTrainerId = SanitizeTrainerId(trainerOpponentId); enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) return GetTrainerEncounterMusicIdInBattlePyramid(trainerOpponentId); else if (InTrainerHillChallenge()) return GetTrainerEncounterMusicIdInTrainerHill(trainerOpponentId); @@ -5228,7 +5179,7 @@ u8 GetTrainerEncounterMusicId(u16 trainerOpponentId) return gTrainers[difficulty][sanitizedTrainerId].encounterMusic_gender & (F_TRAINER_FEMALE - 1); } -u16 ModifyStatByNature(u8 nature, u16 stat, u8 statIndex) +u16 ModifyStatByNature(u8 nature, u16 stat, enum Stat statIndex) { // Don't modify HP, Accuracy, or Evasion by nature if (statIndex <= STAT_HP || statIndex > NUM_NATURE_STATS || gNaturesInfo[nature].statUp == gNaturesInfo[nature].statDown) @@ -5244,7 +5195,7 @@ u16 ModifyStatByNature(u8 nature, u16 stat, u8 statIndex) void AdjustFriendship(struct Pokemon *mon, u8 event) { u16 species, heldItem; - u8 holdEffect; + enum HoldEffect holdEffect; s8 mod; if (ShouldSkipFriendshipChange()) @@ -5272,8 +5223,8 @@ void AdjustFriendship(struct Pokemon *mon, u8 event) if (species && species != SPECIES_EGG) { u8 friendshipLevel = 0; - s16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); - u32 opponentTrainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); + s32 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); + enum TrainerClassID opponentTrainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (friendship > 99) friendshipLevel++; @@ -5298,18 +5249,7 @@ void AdjustFriendship(struct Pokemon *mon, u8 event) } mod = sFriendshipEventModifiers[event][friendshipLevel]; - if (mod > 0 && holdEffect == HOLD_EFFECT_FRIENDSHIP_UP) - // 50% increase, rounding down - mod = (150 * mod) / 100; - - friendship += mod; - if (mod > 0) - { - if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == ITEM_LUXURY_BALL) - friendship++; - if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) - friendship++; - } + friendship += CalculateFriendshipBonuses(mon,mod,holdEffect); if (friendship < 0) friendship = 0; @@ -5320,14 +5260,36 @@ void AdjustFriendship(struct Pokemon *mon, u8 event) } } +u8 CalculateFriendshipBonuses(struct Pokemon *mon, u32 modifier, enum HoldEffect itemHoldEffect) +{ + u32 bonus = 0; + + if ((modifier > 0) && (itemHoldEffect == HOLD_EFFECT_FRIENDSHIP_UP)) + bonus += 150 * modifier / 100; + else + bonus += modifier; + + if (modifier == 0) + return bonus; + + if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == ITEM_LUXURY_BALL) + bonus += ITEM_FRIENDSHIP_LUXURY_BONUS; + + if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) + bonus += ITEM_FRIENDSHIP_MAPSEC_BONUS; + + return bonus; +} + void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies) { u8 evs[NUM_STATS]; u16 evIncrease = 0; u16 totalEVs = 0; u16 heldItem; - u8 holdEffect; - int i, multiplier; + enum HoldEffect holdEffect; + enum Stat i; + int multiplier; u8 stat; u8 bonus; u32 currentEVCap = GetCurrentEVCap(); @@ -5406,6 +5368,8 @@ void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies) else evIncrease = gSpeciesInfo[defeatedSpecies].evYield_SpDefense * multiplier; break; + default: + break; } if (holdEffect == HOLD_EFFECT_MACHO_BRACE) @@ -5690,100 +5654,390 @@ u8 CanLearnTeachableMove(u16 species, u16 move) } } -u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves) +static void QuickSortMoves(u16 *moves, s32 left, s32 right) { - u16 learnedMoves[4]; - u8 numMoves = 0; - u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); - u8 level = GetMonData(mon, MON_DATA_LEVEL, 0); - const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species); - int i, j, k; + if (left >= right) + return; - for (i = 0; i < MAX_MON_MOVES; i++) - learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); + u16 pivot = moves[(left + right) / 2]; + s32 i = left, j = right; - for (i = 0; i < MAX_LEVEL_UP_MOVES; i++) + while (i <= j) { - u16 moveLevel; + while (moves[i] != MOVE_NONE && StringCompare(GetMoveName(moves[i]), GetMoveName(pivot)) < 0) + i++; + while (moves[j] != MOVE_NONE && StringCompare(GetMoveName(moves[j]), GetMoveName(pivot)) > 0) + j--; - if (learnset[i].move == LEVEL_UP_MOVE_END) - break; + if (i <= j) + { + u16 temp = moves[i]; + moves[i] = moves[j]; + moves[j] = temp; + i++; + j--; + } + } + + QuickSortMoves(moves, left, j); + QuickSortMoves(moves, i, right); +} + +static void SortMovesAlphabetically(u16 *moves, u32 numMoves) +{ + if (numMoves > 1) + QuickSortMoves(moves, 0, numMoves - 1); +} - moveLevel = learnset[i].level; +u32 GetRelearnerLevelUpMoves(struct Pokemon *mon, u16 *moves) +{ + u16 learnedMoves[MAX_MON_MOVES] = {0}; + u32 numMoves = 0; + u32 species = GetMonData(mon, MON_DATA_SPECIES, 0); + u32 level = (P_ENABLE_ALL_LEVEL_UP_MOVES ? MAX_LEVEL : GetMonData(mon, MON_DATA_LEVEL, 0)); - if (moveLevel <= level) + for (u32 i = 0; i < MAX_MON_MOVES; i++) + learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); + + do + { + const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species); + + for (u32 i = 0; i < MAX_LEVEL_UP_MOVES && learnset[i].move != LEVEL_UP_MOVE_END; i++) { - for (j = 0; j < MAX_MON_MOVES && learnedMoves[j] != learnset[i].move; j++) - ; + if (learnset[i].level > level) + break; - if (j == MAX_MON_MOVES) + u32 j; + for (j = 0; j < MAX_MON_MOVES; j++) { - for (k = 0; k < numMoves && moves[k] != learnset[i].move; k++) - ; + if (learnedMoves[j] == learnset[i].move) + break; + } + if (j < MAX_MON_MOVES) + continue; - if (k == numMoves) - moves[numMoves++] = learnset[i].move; + for (j = 0; j < numMoves; j++) + { + if (moves[j] == learnset[i].move) + break; } + if (j < numMoves) + continue; + + moves[numMoves++] = learnset[i].move; } - } + + species = (P_PRE_EVO_MOVES ? GetSpeciesPreEvolution(species) : SPECIES_NONE); + } while (species != SPECIES_NONE); + + if (P_SORT_MOVES) + SortMovesAlphabetically(moves, numMoves); return numMoves; } -u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves) +u32 GetRelearnerEggMoves(struct Pokemon *mon, u16 *moves) { - u8 numMoves = 0; - int i; - const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species); + if (!FlagGet(P_FLAG_EGG_MOVES) && !P_ENABLE_MOVE_RELEARNERS) + return 0; - for (i = 0; i < MAX_LEVEL_UP_MOVES && learnset[i].move != LEVEL_UP_MOVE_END; i++) - moves[numMoves++] = learnset[i].move; + u32 learnedMoves[MAX_MON_MOVES] = {0}; + u32 numMoves = 0; + u32 species = GetMonData(mon, MON_DATA_SPECIES); - return numMoves; + while (GetSpeciesPreEvolution(species) != SPECIES_NONE) + species = GetSpeciesPreEvolution(species); + const u16 *eggMoves = GetSpeciesEggMoves(species); + + if (eggMoves == sNoneEggMoveLearnset) + return numMoves; + + for (u32 i = 0; i < MAX_MON_MOVES; i++) + learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); + + for (u32 i = 0; eggMoves[i] != MOVE_UNAVAILABLE; i++) + { + u32 j; + for (j = 0; j < MAX_MON_MOVES; j++) + { + if (learnedMoves[j] == eggMoves[i]) + break; + } + if (j < MAX_MON_MOVES) + continue; + + for (j = 0; j < numMoves; j++) + { + if (moves[j] == eggMoves[i]) + break; + } + if (j < numMoves) + continue; + + moves[numMoves++] = eggMoves[i]; + } + + if (P_SORT_MOVES) + SortMovesAlphabetically(moves, numMoves); + + return numMoves; } -u8 GetNumberOfRelearnableMoves(struct Pokemon *mon) +u32 GetRelearnerTMMoves(struct Pokemon *mon, u16 *moves) { - u16 learnedMoves[MAX_MON_MOVES]; - u16 moves[MAX_LEVEL_UP_MOVES]; - u8 numMoves = 0; - u16 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG, 0); - u8 level = GetMonData(mon, MON_DATA_LEVEL, 0); - const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species); - int i, j, k; + if (!P_TM_MOVES_RELEARNER) + return 0; - if (species == SPECIES_EGG) + u32 learnedMoves[MAX_MON_MOVES] = {0}; + u32 numMoves = 0; + u32 species = GetMonData(mon, MON_DATA_SPECIES); + u16 allMoves[NUM_ALL_MACHINES]; + u32 totalMoveCount = 0; + + for (u32 i = 0; i < NUM_ALL_MACHINES; i++) + { + enum TMHMItemId item = GetTMHMItemId(i + 1); + u32 move = GetTMHMMoveId(i + 1); + + if (move == MOVE_NONE) + continue; + + if ((P_ENABLE_ALL_TM_MOVES || CheckBagHasItem(item, 1)) && CanLearnTeachableMove(species, move) && move != MOVE_NONE) + allMoves[totalMoveCount++] = move; + } + + for (u32 i = 0; i < MAX_MON_MOVES; i++) + learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); + + for (u32 i = 0; i < totalMoveCount; i++) + { + u32 j; + for (j = 0; j < MAX_MON_MOVES; j++) + { + if (learnedMoves[j] == allMoves[i]) + break; + } + if (j < MAX_MON_MOVES) + continue; + + for (j = 0; j < numMoves; j++) + { + if (moves[j] == allMoves[i]) + break; + } + if (j < numMoves) + continue; + + moves[numMoves++] = allMoves[i]; + } + + if (P_SORT_MOVES) + SortMovesAlphabetically(moves, numMoves); + + return numMoves; +} + +u32 GetRelearnerTutorMoves(struct Pokemon *mon, u16 *moves) +{ + if (!FlagGet(P_FLAG_TUTOR_MOVES) && !P_ENABLE_MOVE_RELEARNERS) return 0; - for (i = 0; i < MAX_MON_MOVES; i++) +#if P_TUTOR_MOVES_ARRAY + u16 learnedMoves[MAX_MON_MOVES] = {0}; + u32 numMoves = 0; + u32 species = GetMonData(mon, MON_DATA_SPECIES, 0); + + for (u32 i = 0; i < MAX_MON_MOVES; i++) learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); - for (i = 0; i < MAX_LEVEL_UP_MOVES; i++) + for (u32 i = 0; gTutorMoves[i] != MOVE_UNAVAILABLE; i++) { - u16 moveLevel; + u32 move = gTutorMoves[i]; - if (learnset[i].move == LEVEL_UP_MOVE_END) - break; + if (!CanLearnTeachableMove(species, move)) + continue; - moveLevel = learnset[i].level; + u32 j; + for (j = 0; j < MAX_MON_MOVES; j++) + { + if (learnedMoves[j] == move) + break; + } + if (j < MAX_MON_MOVES) + continue; - if (moveLevel <= level) + for (j = 0; j < numMoves; j++) { - for (j = 0; j < MAX_MON_MOVES && learnedMoves[j] != learnset[i].move; j++) - ; + if (moves[j] == move) + break; + } + if (j < numMoves) + continue; - if (j == MAX_MON_MOVES) - { - for (k = 0; k < numMoves && moves[k] != learnset[i].move; k++) - ; + moves[numMoves++] = move; + } - if (k == numMoves) - moves[numMoves++] = learnset[i].move; - } + if (P_SORT_MOVES) + SortMovesAlphabetically(moves, numMoves); + + return numMoves; +#else + return 0; +#endif // P_TUTOR_MOVES_ARRAY +} + +static inline bool32 DoesMonHaveMove(const u16 *moves, u16 move) +{ + for (u32 i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] == move) + return TRUE; + } + return FALSE; +} + +bool32 HasRelearnerLevelUpMoves(struct Pokemon *mon) +{ + u32 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG, 0); + + if (species == SPECIES_EGG) + return FALSE; + + u16 learnedMoves[MAX_MON_MOVES]; + + for (u32 i = 0; i < MAX_MON_MOVES; i++) + learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); + + u32 level = (P_ENABLE_ALL_LEVEL_UP_MOVES ? MAX_LEVEL : GetMonData(mon, MON_DATA_LEVEL, 0)); + + do + { + const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species); + + for (u32 i = 0; i < MAX_LEVEL_UP_MOVES && learnset[i].move != LEVEL_UP_MOVE_END; i++) + { + if (learnset[i].level > level) + break; + + if (!DoesMonHaveMove(learnedMoves, learnset[i].move)) + return TRUE; } + + species = (P_PRE_EVO_MOVES ? GetSpeciesPreEvolution(species) : SPECIES_NONE); + + } while (species != SPECIES_NONE); + + return FALSE; +} + +bool32 HasRelearnerEggMoves(struct Pokemon *mon) +{ + if (!FlagGet(P_FLAG_EGG_MOVES) && !P_ENABLE_MOVE_RELEARNERS) + return FALSE; + + u32 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG, 0); + + if (species == SPECIES_EGG) + return FALSE; + + u16 learnedMoves[MAX_MON_MOVES]; + + for (u32 i = 0; i < MAX_MON_MOVES; i++) + learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); + + while (GetSpeciesPreEvolution(species) != SPECIES_NONE) + species = GetSpeciesPreEvolution(species); + + const u16 *eggMoves = GetSpeciesEggMoves(species); + if (eggMoves == sNoneEggMoveLearnset) + return FALSE; + + for (u32 i = 0; eggMoves[i] != MOVE_UNAVAILABLE; i++) + { + if (!DoesMonHaveMove(learnedMoves, eggMoves[i])) + return TRUE; } - return numMoves; + return FALSE; +} + +bool32 HasRelearnerTMMoves(struct Pokemon *mon) +{ + if (!P_TM_MOVES_RELEARNER) + return FALSE; + + u32 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG, 0); + + if (species == SPECIES_EGG) + return FALSE; + + u16 learnedMoves[MAX_MON_MOVES]; + + for (u32 i = 0; i < MAX_MON_MOVES; i++) + learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); + + for (u32 i = 0; i < NUM_ALL_MACHINES; i++) + { + enum TMHMItemId item = GetTMHMItemId(i + 1); + u32 move = GetTMHMMoveId(i + 1); + + if (move == MOVE_NONE) + continue; + + if (!P_ENABLE_ALL_TM_MOVES && !CheckBagHasItem(item, 1)) + continue; + + if (!CanLearnTeachableMove(species, move)) + continue; + + if (!DoesMonHaveMove(learnedMoves, move)) + return TRUE; + } + + return FALSE; +} + +bool32 HasRelearnerTutorMoves(struct Pokemon *mon) +{ + if (!FlagGet(P_FLAG_TUTOR_MOVES) && !P_ENABLE_MOVE_RELEARNERS) + return FALSE; + +#if P_TUTOR_MOVES_ARRAY + u32 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG, 0); + + if (species == SPECIES_EGG) + return FALSE; + + u16 learnedMoves[MAX_MON_MOVES]; + + for (u32 i = 0; i < MAX_MON_MOVES; i++) + learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); + + for (u32 i = 0; gTutorMoves[i] != MOVE_UNAVAILABLE; i++) + { + u32 move = gTutorMoves[i]; + + if (!CanLearnTeachableMove(species, move)) + continue; + + if (!DoesMonHaveMove(learnedMoves, move)) + return TRUE; + } +#endif + return FALSE; +} + +u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves) +{ + u8 numMoves = 0; + int i; + const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species); + + for (i = 0; i < MAX_LEVEL_UP_MOVES && learnset[i].move != LEVEL_UP_MOVE_END; i++) + moves[numMoves++] = learnset[i].move; + + return numMoves; } u16 SpeciesToPokedexNum(u16 species) @@ -5837,7 +6091,7 @@ u16 GetBattleBGM(void) } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - u8 trainerClass; + enum TrainerClassID trainerClass; if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) trainerClass = GetFrontierOpponentClass(TRAINER_BATTLE_PARAM.opponentA); @@ -5971,19 +6225,21 @@ const u16 *GetMonSpritePalFromSpecies(u16 species, bool32 isShiny, bool32 isFema } } -bool8 IsMoveHM(u16 move) +#define OR_MOVE_IS_HM(_hm) || (move == MOVE_##_hm) + +bool32 IsMoveHM(u16 move) { - int i = 0; + return FALSE FOREACH_HM(OR_MOVE_IS_HM); +} +#undef OR_MOVE_IS_HM + +bool32 CannotForgetMove(u16 move) +{ if (P_CAN_FORGET_HIDDEN_MOVE) return FALSE; - while (sHMMoves[i] != HM_MOVES_END) - { - if (sHMMoves[i++] == move) - return TRUE; - } - return FALSE; + return IsMoveHM(move); } bool8 IsMonSpriteNotFlipped(u16 species) @@ -6081,7 +6337,7 @@ static s32 GetWildMonTableIdInAlteringCave(u16 species) static inline bool32 CanFirstMonBoostHeldItemRarity(void) { - u32 ability; + enum Ability ability; if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) return FALSE; @@ -6364,7 +6620,7 @@ u16 PlayerGenderToFrontTrainerPicId(u8 playerGender) return FacilityClassToPicIndex(FACILITY_CLASS_BRENDAN); } -void HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality) +void HandleSetPokedexFlag(enum NationalDexOrder nationalNum, u8 caseId, u32 personality) { u8 getFlagCaseId = (caseId == FLAG_SET_SEEN) ? FLAG_GET_SEEN : FLAG_GET_CAUGHT; if (!GetSetPokedexFlag(nationalNum, getFlagCaseId)) // don't set if it's already set @@ -6377,6 +6633,14 @@ void HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality) } } +void HandleSetPokedexFlagFromMon(struct Pokemon *mon, u32 caseId) +{ + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY); + enum NationalDexOrder nationalNum = SpeciesToNationalPokedexNum(GetMonData(mon, MON_DATA_SPECIES)); + + HandleSetPokedexFlag(nationalNum, caseId, personality); +} + bool8 HasTwoFramesAnimation(u16 species) { return P_TWO_FRAME_FRONT_SPRITES @@ -6385,11 +6649,11 @@ bool8 HasTwoFramesAnimation(u16 species) && !gTestRunnerHeadless; } -static bool8 ShouldSkipFriendshipChange(void) +bool8 ShouldSkipFriendshipChange(void) { if (gMain.inBattle && gBattleTypeFlags & (BATTLE_TYPE_FRONTIER)) return TRUE; - if (!gMain.inBattle && (InBattlePike() || InBattlePyramid())) + if (!gMain.inBattle && (InBattlePike() || CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE)) return TRUE; return FALSE; } @@ -6613,7 +6877,7 @@ u32 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, enum FormChanges u32 targetSpecies = species; const struct FormChange *formChanges = GetSpeciesFormChanges(species); u16 heldItem; - u32 ability; + enum Ability ability; if (formChanges != NULL) { @@ -6633,7 +6897,7 @@ u32 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, enum FormChanges // This is to prevent reverting to base form when giving the item to the corresponding form. // Eg. Giving a Zap Plate to an Electric Arceus without an item (most likely to happen when using givemon) bool32 currentItemForm = FALSE; - for (int j = 0; formChanges[j].method != FORM_CHANGE_TERMINATOR; j++) + for (u32 j = 0; formChanges[j].method != FORM_CHANGE_TERMINATOR; j++) { if (species == formChanges[j].targetSpecies && formChanges[j].param1 == heldItem @@ -6686,7 +6950,7 @@ u32 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, enum FormChanges if (heldItem == formChanges[i].param1 || formChanges[i].param1 == ITEM_NONE) targetSpecies = formChanges[i].targetSpecies; break; - case FORM_CHANGE_END_BATTLE_TERRAIN: + case FORM_CHANGE_END_BATTLE_ENVIRONMENT: if (gBattleEnvironment == formChanges[i].param1) targetSpecies = formChanges[i].targetSpecies; break; @@ -6803,6 +7067,37 @@ void RemoveIVIndexFromList(u8 *ivs, u8 selectedIv) } // Attempts to perform non-level/item related overworld evolutions; called by tryspecialevo command. +void TryScriptEvolution(void) +{ + u8 i; + bool32 canStopEvo = gSpecialVar_0x8001; + u16 tryMultiple = gSpecialVar_0x8002; + + for (i = 0; i < PARTY_SIZE; i++) + { + u32 targetSpecies = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_SCRIPT_TRIGGER, 0, NULL, &canStopEvo, CHECK_EVO); + + if (targetSpecies != SPECIES_NONE && !(sTriedEvolving & (1u << i))) + { + GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_SCRIPT_TRIGGER, 0, NULL, &canStopEvo, DO_EVO); + sTriedEvolving |= 1u << i; + if(gMain.callback2 == TryScriptEvolution) // This fixes small graphics glitches. + EvolutionScene(&gPlayerParty[i], targetSpecies, canStopEvo, i); + else + BeginEvolutionScene(&gPlayerParty[i], targetSpecies, canStopEvo, i); + + if (tryMultiple) + gCB2_AfterEvolution = TryScriptEvolution; + else + gCB2_AfterEvolution = CB2_ReturnToField; + return; + } + } + + sTriedEvolving = 0; + SetMainCallback2(CB2_ReturnToField); +} + void TrySpecialOverworldEvo(void) { u8 i; @@ -6848,7 +7143,7 @@ bool32 SpeciesHasGenderDifferences(u16 species) return FALSE; } -bool32 TryFormChange(u32 monId, u32 side, enum FormChanges method) +bool32 TryFormChange(u32 monId, enum BattleSide side, enum FormChanges method) { struct Pokemon *party = (side == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; @@ -6859,8 +7154,8 @@ bool32 TryFormChange(u32 monId, u32 side, enum FormChanges method) u32 currentSpecies = GetMonData(&party[monId], MON_DATA_SPECIES); u32 targetSpecies = GetFormChangeTargetSpecies(&party[monId], method, 0); - if (targetSpecies == currentSpecies && gBattleStruct != NULL && gBattleStruct->changedSpecies[side][monId] != SPECIES_NONE) - targetSpecies = gBattleStruct->changedSpecies[side][monId]; + if (targetSpecies == currentSpecies && gBattleStruct != NULL && gBattleStruct->partyState[side][monId].changedSpecies != SPECIES_NONE) + targetSpecies = gBattleStruct->partyState[side][monId].changedSpecies; if (targetSpecies != currentSpecies) { @@ -6883,6 +7178,7 @@ u16 SanitizeSpeciesId(u16 species) bool32 IsSpeciesEnabled(u16 species) { + // This function should not use the GetSpeciesBaseHP function, as the included sanitation will result in an infinite loop return gSpeciesInfo[species].baseHP > 0 || species == SPECIES_EGG; } @@ -6965,18 +7261,18 @@ void UpdateMonPersonality(struct BoxPokemon *boxMon, u32 personality) bool32 isShiny = GetBoxMonData(boxMon, MON_DATA_IS_SHINY, NULL); u32 hiddenNature = GetBoxMonData(boxMon, MON_DATA_HIDDEN_NATURE, NULL); - u32 teraType = GetBoxMonData(boxMon, MON_DATA_TERA_TYPE, NULL); + enum Type teraType = GetBoxMonData(boxMon, MON_DATA_TERA_TYPE, NULL); old = *boxMon; - old0 = &(GetSubstruct(&old, old.personality, 0)->type0); - old1 = &(GetSubstruct(&old, old.personality, 1)->type1); - old2 = &(GetSubstruct(&old, old.personality, 2)->type2); - old3 = &(GetSubstruct(&old, old.personality, 3)->type3); + old0 = &(GetSubstruct(&old, old.personality, SUBSTRUCT_TYPE_0)->type0); + old1 = &(GetSubstruct(&old, old.personality, SUBSTRUCT_TYPE_1)->type1); + old2 = &(GetSubstruct(&old, old.personality, SUBSTRUCT_TYPE_2)->type2); + old3 = &(GetSubstruct(&old, old.personality, SUBSTRUCT_TYPE_3)->type3); - new0 = &(GetSubstruct(boxMon, personality, 0)->type0); - new1 = &(GetSubstruct(boxMon, personality, 1)->type1); - new2 = &(GetSubstruct(boxMon, personality, 2)->type2); - new3 = &(GetSubstruct(boxMon, personality, 3)->type3); + new0 = &(GetSubstruct(boxMon, personality, SUBSTRUCT_TYPE_0)->type0); + new1 = &(GetSubstruct(boxMon, personality, SUBSTRUCT_TYPE_1)->type1); + new2 = &(GetSubstruct(boxMon, personality, SUBSTRUCT_TYPE_2)->type2); + new3 = &(GetSubstruct(boxMon, personality, SUBSTRUCT_TYPE_3)->type3); DecryptBoxMon(&old); boxMon->personality = personality; @@ -6984,8 +7280,7 @@ void UpdateMonPersonality(struct BoxPokemon *boxMon, u32 personality) *new1 = *old1; *new2 = *old2; *new3 = *old3; - boxMon->checksum = CalculateBoxMonChecksum(boxMon); - EncryptBoxMon(boxMon); + boxMon->checksum = CalculateBoxMonChecksumReencrypt(boxMon); SetBoxMonData(boxMon, MON_DATA_IS_SHINY, &isShiny); SetBoxMonData(boxMon, MON_DATA_HIDDEN_NATURE, &hiddenNature); @@ -7018,7 +7313,7 @@ void HealBoxPokemon(struct BoxPokemon *boxMon) BoxMonRestorePP(boxMon); } -u16 GetCryIdBySpecies(u16 species) +enum PokemonCry GetCryIdBySpecies(u16 species) { species = SanitizeSpeciesId(species); if (P_CRIES_ENABLED == FALSE || gSpeciesInfo[species].cryId >= CRY_COUNT || gTestRunnerHeadless) @@ -7081,9 +7376,9 @@ void UpdateDaysPassedSinceFormChange(u16 days) } } -u32 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState state) +enum Type CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState state) { - u32 moveType = GetDynamicMoveType(mon, move, battler, state); + enum Type moveType = GetDynamicMoveType(mon, move, battler, state); if (moveType != TYPE_NONE) return moveType; return GetMoveType(move); @@ -7163,8 +7458,31 @@ bool32 IsSpeciesForeignRegionalForm(u32 species, u32 currentRegion) return FALSE; } -u32 GetTeraTypeFromPersonality(struct Pokemon *mon) +enum Type GetTeraTypeFromPersonality(struct Pokemon *mon) { const u8 *types = gSpeciesInfo[GetMonData(mon, MON_DATA_SPECIES)].types; return (GetMonData(mon, MON_DATA_PERSONALITY) & 0x1) == 0 ? types[0] : types[1]; } + +struct Pokemon *GetSavedPlayerPartyMon(u32 index) +{ + return &gSaveBlock1Ptr->playerParty[index]; +} + +u8 *GetSavedPlayerPartyCount(void) +{ + return &gSaveBlock1Ptr->playerPartyCount; +} + +void SavePlayerPartyMon(u32 index, struct Pokemon *mon) +{ + gSaveBlock1Ptr->playerParty[index] = *mon; +} + +bool32 IsSpeciesOfType(u32 species, enum Type type) +{ + if (gSpeciesInfo[species].types[0] == type + || gSpeciesInfo[species].types[1] == type) + return TRUE; + return FALSE; +} diff --git a/src/pokemon_animation.c b/src/pokemon_animation.c index 41bc400105c6..346536c8aa5f 100644 --- a/src/pokemon_animation.c +++ b/src/pokemon_animation.c @@ -468,7 +468,7 @@ static void SetPosForRotation(struct Sprite *sprite, u16 index, s16 amplitudeX, sprite->y2 = yAdder + amplitudeY; } -u8 GetSpeciesBackAnimSet(u16 species) +enum BackAnim GetSpeciesBackAnimSet(u16 species) { if (gSpeciesInfo[species].backAnimId != BACK_ANIM_NONE) return gSpeciesInfo[species].backAnimId - 1; @@ -523,11 +523,16 @@ static void Task_HandleMonAnimation(u8 taskId) sprite->data[2] = gTasks[taskId].tSpeciesId; sprite->data[1] = 0; + // Task_HandleMonAnimation handles more than just KO animations, + // but if the counter is non-zero then only KO animations are running. + // This assumption is not checked. + if (gBattleStruct->battlerKOAnimsRunning > 0) + gBattleStruct->battlerKOAnimsRunning--; DestroyTask(taskId); } } -void LaunchAnimationTaskForFrontSprite(struct Sprite *sprite, u8 frontAnimId) +void LaunchAnimationTaskForFrontSprite(struct Sprite *sprite, enum AnimFunctionIDs frontAnimId) { u8 taskId = CreateTask(Task_HandleMonAnimation, 128); gTasks[taskId].tPtrHi = (u32)(sprite) >> 16; @@ -535,16 +540,17 @@ void LaunchAnimationTaskForFrontSprite(struct Sprite *sprite, u8 frontAnimId) gTasks[taskId].tAnimId = frontAnimId; } -void StartMonSummaryAnimation(struct Sprite *sprite, u8 frontAnimId) +void StartMonSummaryAnimation(struct Sprite *sprite, enum AnimFunctionIDs frontAnimId) { // sDontFlip is expected to still be FALSE here, not explicitly cleared sIsSummaryAnim = TRUE; sprite->callback = sMonAnimFunctions[frontAnimId]; } -void LaunchAnimationTaskForBackSprite(struct Sprite *sprite, u8 backAnimSet) +void LaunchAnimationTaskForBackSprite(struct Sprite *sprite, enum BackAnim backAnimSet) { - u8 nature, taskId, animId, battler; + u8 nature, taskId, battler; + enum AnimFunctionIDs animId; taskId = CreateTask(Task_HandleMonAnimation, 128); gTasks[taskId].tPtrHi = (u32)(sprite) >> 16; diff --git a/src/pokemon_jump.c b/src/pokemon_jump.c index e186e07b962f..4ede87e3d735 100755 --- a/src/pokemon_jump.c +++ b/src/pokemon_jump.c @@ -2242,12 +2242,12 @@ void IsPokemonJumpSpeciesInParty(void) static const u16 sPokeJumpPal1[] = INCBIN_U16("graphics/pokemon_jump/pal1.gbapal"); static const u16 sPokeJumpPal2[] = INCBIN_U16("graphics/pokemon_jump/pal2.gbapal"); -static const u32 sVine1_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine1.4bpp.lz"); -static const u32 sVine2_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine2.4bpp.lz"); -static const u32 sVine3_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine3.4bpp.lz"); -static const u32 sVine4_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine4.4bpp.lz"); +static const u32 sVine1_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine1.4bpp.smol"); +static const u32 sVine2_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine2.4bpp.smol"); +static const u32 sVine3_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine3.4bpp.smol"); +static const u32 sVine4_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine4.4bpp.smol"); -static const u32 sStar_Gfx[] = INCBIN_U32("graphics/pokemon_jump/star.4bpp.lz"); +static const u32 sStar_Gfx[] = INCBIN_U32("graphics/pokemon_jump/star.4bpp.smol"); static const struct CompressedSpriteSheet sCompressedSpriteSheets[] = { @@ -2918,16 +2918,16 @@ static void InitPokeJumpGfx(struct PokemonJumpGfx *jumpGfx) static const u16 sInterface_Pal[] = INCBIN_U16("graphics/pokemon_jump/interface.gbapal"); static const u16 sBg_Pal[] = INCBIN_U16("graphics/pokemon_jump/bg.gbapal"); -static const u32 sBg_Gfx[] = INCBIN_U32("graphics/pokemon_jump/bg.4bpp.lz"); -static const u32 sBg_Tilemap[] = INCBIN_U32("graphics/pokemon_jump/bg.bin.lz"); +static const u32 sBg_Gfx[] = INCBIN_U32("graphics/pokemon_jump/bg.4bpp.smol"); +static const u32 sBg_Tilemap[] = INCBIN_U32("graphics/pokemon_jump/bg.bin.smolTM"); static const u16 sVenusaur_Pal[] = INCBIN_U16("graphics/pokemon_jump/venusaur.gbapal"); -static const u32 sVenusaur_Gfx[] = INCBIN_U32("graphics/pokemon_jump/venusaur.4bpp.lz"); -static const u32 sVenusaur_Tilemap[] = INCBIN_U32("graphics/pokemon_jump/venusaur.bin.lz"); +static const u32 sVenusaur_Gfx[] = INCBIN_U32("graphics/pokemon_jump/venusaur.4bpp.smol"); +static const u32 sVenusaur_Tilemap[] = INCBIN_U32("graphics/pokemon_jump/venusaur.bin.smolTM"); static const u16 sBonuses_Pal[] = INCBIN_U16("graphics/pokemon_jump/bonuses.gbapal"); -static const u32 sBonuses_Gfx[] = INCBIN_U32("graphics/pokemon_jump/bonuses.4bpp.lz"); -static const u32 sBonuses_Tilemap[] = INCBIN_U32("graphics/pokemon_jump/bonuses.bin.lz"); +static const u32 sBonuses_Gfx[] = INCBIN_U32("graphics/pokemon_jump/bonuses.4bpp.smol"); +static const u32 sBonuses_Tilemap[] = INCBIN_U32("graphics/pokemon_jump/bonuses.bin.smolTM"); static const struct BgTemplate sBgTemplates[] = { diff --git a/src/pokemon_sprite_visualizer.c b/src/pokemon_sprite_visualizer.c index e2264dfc6475..a5f36a0db677 100644 --- a/src/pokemon_sprite_visualizer.c +++ b/src/pokemon_sprite_visualizer.c @@ -3,6 +3,7 @@ #include "battle.h" #include "battle_anim.h" #include "battle_gfx_sfx_util.h" +#include "battle_environment.h" #include "bg.h" #include "data.h" #include "decompress.h" @@ -42,7 +43,7 @@ #include "constants/rgb.h" #include "constants/songs.h" -extern const struct BattleBackground sBattleEnvironmentTable[]; +extern const struct BattleEnvironment gBattleEnvironmentInfo[BATTLE_ENVIRONMENT_COUNT]; extern const struct CompressedSpriteSheet gSpriteSheet_EnemyShadow; extern const struct CompressedSpriteSheet gSpriteSheet_EnemyShadowsSized; extern const struct SpriteTemplate gSpriteTemplate_EnemyShadow; @@ -385,6 +386,7 @@ const u8 gBattleBackgroundNames[][30] = [MAP_BATTLE_SCENE_KYOGRE] = _("KYOGRE "), [MAP_BATTLE_SCENE_RAYQUAZA] = _("RAYQUAZA "), }; + const u8 gBattleBackgroundTerrainNames[][26] = { [BATTLE_ENVIRONMENT_GRASS] = _("NORMAL - GRASS "), @@ -398,6 +400,7 @@ const u8 gBattleBackgroundTerrainNames[][26] = [BATTLE_ENVIRONMENT_BUILDING] = _("NORMAL - BUILDING "), [BATTLE_ENVIRONMENT_PLAIN] = _("NORMAL - PLAIN "), }; + const u8 sShadowSizeLabels[][4] = { [SHADOW_SIZE_S] = _(" S"), @@ -405,6 +408,7 @@ const u8 sShadowSizeLabels[][4] = [SHADOW_SIZE_L] = _(" L"), [SHADOW_SIZE_XL_BATTLE_ONLY] = _(" XL"), }; + //Function declarations static void PrintDigitChars(struct PokemonSpriteVisualizer *data); static void SetUpModifyArrows(struct PokemonSpriteVisualizer *data); @@ -921,83 +925,84 @@ static void LoadAndCreateEnemyShadowSpriteCustom(struct PokemonSpriteVisualizer } //Battle background functions -static void LoadBattleBg(u8 battleBgType, u8 battleEnvironment) +static void LoadBattleBg(u8 battleBgType, enum BattleEnvironments battleEnvironment) { switch (battleBgType) { default: case MAP_BATTLE_SCENE_NORMAL: - LZDecompressVram(sBattleEnvironmentTable[battleEnvironment].tileset, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(sBattleEnvironmentTable[battleEnvironment].tilemap, (void*)(BG_SCREEN_ADDR(26))); - LoadPalette(sBattleEnvironmentTable[battleEnvironment].palette, 0x20, 0x60); + DecompressDataWithHeaderVram(gBattleEnvironmentInfo[battleEnvironment].background.tileset, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentInfo[battleEnvironment].background.tilemap, (void*)(BG_SCREEN_ADDR(26))); + LoadPalette(gBattleEnvironmentInfo[battleEnvironment].background.palette, 0x20, 0x60); break; case MAP_BATTLE_SCENE_GYM: - LZDecompressVram(gBattleEnvironmentTiles_Building, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Building, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_BuildingGym, 0x20, 0x60); break; case MAP_BATTLE_SCENE_MAGMA: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_StadiumMagma, 0x20, 0x60); break; case MAP_BATTLE_SCENE_AQUA: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_StadiumAqua, 0x20, 0x60); break; case MAP_BATTLE_SCENE_SIDNEY: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_StadiumSidney, 0x20, 0x60); break; case MAP_BATTLE_SCENE_PHOEBE: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_StadiumPhoebe, 0x20, 0x60); break; case MAP_BATTLE_SCENE_GLACIA: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_StadiumGlacia, 0x20, 0x60); break; case MAP_BATTLE_SCENE_DRAKE: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_StadiumDrake, 0x20, 0x60); break; case MAP_BATTLE_SCENE_FRONTIER: - LZDecompressVram(gBattleEnvironmentTiles_Building, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Building, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_Frontier, 0x20, 0x60); break; case MAP_BATTLE_SCENE_LEADER: - LZDecompressVram(gBattleEnvironmentTiles_Building, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Building, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_BuildingLeader, 0x20, 0x60); break; case MAP_BATTLE_SCENE_WALLACE: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_StadiumWallace, 0x20, 0x60); break; case MAP_BATTLE_SCENE_GROUDON: - LZDecompressVram(gBattleEnvironmentTiles_Cave, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Cave, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Cave, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Cave, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_Groudon, 0x20, 0x60); break; case MAP_BATTLE_SCENE_KYOGRE: - LZDecompressVram(gBattleEnvironmentTiles_Water, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Water, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Water, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Water, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_Kyogre, 0x20, 0x60); break; case MAP_BATTLE_SCENE_RAYQUAZA: - LZDecompressVram(gBattleEnvironmentTiles_Rayquaza, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Rayquaza, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Rayquaza, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Rayquaza, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_Rayquaza, 0x20, 0x60); break; } } + static void PrintBattleBgName(u8 taskId) { struct PokemonSpriteVisualizer *data = GetStructPtr(taskId); @@ -1005,11 +1010,12 @@ static void PrintBattleBgName(u8 taskId) u8 text[30+1]; if (data->battleBgType == 0) - StringCopy(text, gBattleBackgroundTerrainNames[data->battleTerrain]); + StringCopy(text, gBattleBackgroundTerrainNames[data->battleEnvironment]); else StringCopy(text, gBattleBackgroundNames[data->battleBgType]); AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, text, 0, 24, 0, NULL); } + static void UpdateBattleBg(u8 taskId, bool8 increment) { struct PokemonSpriteVisualizer *data = GetStructPtr(taskId); @@ -1018,17 +1024,17 @@ static void UpdateBattleBg(u8 taskId, bool8 increment) { if (increment) { - if (data->battleTerrain == BATTLE_ENVIRONMENT_PLAIN) + if (data->battleEnvironment == BATTLE_ENVIRONMENT_PLAIN) data->battleBgType += 1; else - data->battleTerrain += 1; + data->battleEnvironment += 1; } else { - if (data->battleTerrain == BATTLE_ENVIRONMENT_GRASS) + if (data->battleEnvironment == BATTLE_ENVIRONMENT_GRASS) data->battleBgType = MAP_BATTLE_SCENE_RAYQUAZA; else - data->battleTerrain -= 1; + data->battleEnvironment -= 1; } } else if (data->battleBgType == MAP_BATTLE_SCENE_GYM) @@ -1038,7 +1044,7 @@ static void UpdateBattleBg(u8 taskId, bool8 increment) else { data->battleBgType = MAP_BATTLE_SCENE_NORMAL; - data->battleTerrain = BATTLE_ENVIRONMENT_PLAIN; + data->battleEnvironment = BATTLE_ENVIRONMENT_PLAIN; } } else if (data->battleBgType == MAP_BATTLE_SCENE_RAYQUAZA) @@ -1046,7 +1052,7 @@ static void UpdateBattleBg(u8 taskId, bool8 increment) if (increment) { data->battleBgType = MAP_BATTLE_SCENE_NORMAL; - data->battleTerrain = BATTLE_ENVIRONMENT_GRASS; + data->battleEnvironment = BATTLE_ENVIRONMENT_GRASS; } else data->battleBgType -= 1; @@ -1061,7 +1067,7 @@ static void UpdateBattleBg(u8 taskId, bool8 increment) PrintBattleBgName(taskId); - LoadBattleBg(data->battleBgType, data->battleTerrain); + LoadBattleBg(data->battleBgType, data->battleEnvironment); } // ******************************* @@ -1673,12 +1679,12 @@ static void HandleInput_PokemonSpriteVisualizer(u8 taskId) if (JOY_NEW(L_BUTTON) && (Backsprite->callback == SpriteCallbackDummy)) { - PlayCryInternal(data->currentmonId, 0, 120, 10, 0); + PlayCryInternal(data->currentmonId, 0, 120, 10, CRY_MODE_NORMAL); LaunchAnimationTaskForBackSprite(Backsprite, data->animIdBack-1); } if (JOY_NEW(R_BUTTON) && (Frontsprite->callback == SpriteCallbackDummy)) { - PlayCryInternal(data->currentmonId, 0, 120, 10, 0); + PlayCryInternal(data->currentmonId, 0, 120, 10, CRY_MODE_NORMAL); if (HasTwoFramesAnimation(data->currentmonId)) StartSpriteAnim(Frontsprite, 1); diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index 8c54c43f0c16..baf083a0dc4c 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -924,10 +924,10 @@ static const u8 sText_OutOf30[] = _("/30"); static const u16 sChooseBoxMenu_Pal[] = INCBIN_U16("graphics/pokemon_storage/box_selection_popup.gbapal"); static const u8 sChooseBoxMenuCenter_Gfx[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_center.4bpp"); static const u8 sChooseBoxMenuSides_Gfx[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_sides.4bpp"); -static const u32 sScrollingBg_Gfx[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.4bpp.lz"); -static const u32 sScrollingBg_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.bin.lz"); +static const u32 sScrollingBg_Gfx[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.4bpp.smol"); +static const u32 sScrollingBg_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.bin.smolTM"); static const u16 sDisplayMenu_Pal[] = INCBIN_U16("graphics/pokemon_storage/display_menu.gbapal"); // Unused -static const u32 sDisplayMenu_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/display_menu.bin.lz"); +static const u32 sDisplayMenu_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/display_menu.bin.smolTM"); static const u16 sPkmnData_Tilemap[] = INCBIN_U16("graphics/pokemon_storage/pkmn_data.bin"); // sInterface_Pal - parts of the display frame, "PkmnData"'s normal color, Close Box static const u16 sInterface_Pal[] = INCBIN_U16("graphics/pokemon_storage/interface.gbapal"); @@ -3809,7 +3809,7 @@ static void SetScrollingBackground(void) { SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(3) | BGCNT_16COLOR | BGCNT_SCREENBASE(31)); DecompressAndLoadBgGfxUsingHeap(3, sScrollingBg_Gfx, 0, 0, 0); - LZ77UnCompVram(sScrollingBg_Tilemap, (void *)BG_SCREEN_ADDR(31)); + DecompressDataWithHeaderVram(sScrollingBg_Tilemap, (void *)BG_SCREEN_ADDR(31)); } static void ScrollBackground(void) @@ -3822,7 +3822,7 @@ static void LoadPokeStorageMenuGfx(void) { InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); DecompressAndLoadBgGfxUsingHeap(1, gStorageSystemMenu_Gfx, 0, 0, 0); - LZ77UnCompWram(sDisplayMenu_Tilemap, sStorage->displayMenuTilemapBuffer); + DecompressDataWithHeaderWram(sDisplayMenu_Tilemap, sStorage->displayMenuTilemapBuffer); SetBgTilemapBuffer(1, sStorage->displayMenuTilemapBuffer); ShowBg(1); ScheduleBgCopyTilemapToVram(1); @@ -4040,7 +4040,7 @@ static void UpdateWaveformAnimation(void) static void InitSupplementalTilemaps(void) { - LZ77UnCompWram(gStorageSystemPartyMenu_Tilemap, sStorage->partyMenuTilemapBuffer); + DecompressDataWithHeaderWram(gStorageSystemPartyMenu_Tilemap, sStorage->partyMenuTilemapBuffer); LoadPalette(gStorageSystemPartyMenu_Pal, BG_PLTT_ID(1), PLTT_SIZE_4BPP); TilemapUtil_SetMap(TILEMAPID_PARTY_MENU, 1, sStorage->partyMenuTilemapBuffer, 12, 22); TilemapUtil_SetMap(TILEMAPID_CLOSE_BUTTON, 1, sCloseBoxButton_Tilemap, 9, 4); @@ -5387,7 +5387,7 @@ static void LoadWallpaperGfx(u8 boxId, s8 direction) if (wallpaperId != WALLPAPER_FRIENDS) { wallpaper = &sWallpapers[wallpaperId]; - LZ77UnCompWram(wallpaper->tilemap, sStorage->wallpaperTilemap); + DecompressDataWithHeaderWram(wallpaper->tilemap, sStorage->wallpaperTilemap); DrawWallpaper(sStorage->wallpaperTilemap, sStorage->wallpaperLoadDir, sStorage->wallpaperOffset); if (sStorage->wallpaperLoadDir != 0) @@ -5401,7 +5401,7 @@ static void LoadWallpaperGfx(u8 boxId, s8 direction) else { wallpaper = &sWaldaWallpapers[GetWaldaWallpaperPatternId()]; - LZ77UnCompWram(wallpaper->tilemap, sStorage->wallpaperTilemap); + DecompressDataWithHeaderWram(wallpaper->tilemap, sStorage->wallpaperTilemap); DrawWallpaper(sStorage->wallpaperTilemap, sStorage->wallpaperLoadDir, sStorage->wallpaperOffset); CpuCopy16(wallpaper->palettes, sStorage->wallpaperTilemap, 0x40); @@ -9180,7 +9180,7 @@ static void LoadItemIconGfx(u8 id, const u32 *itemTiles, const u16 *itemPal) return; CpuFastFill(0, sStorage->itemIconBuffer, 0x200); - LZ77UnCompWram(itemTiles, sStorage->tileBuffer); + DecompressDataWithHeaderWram(itemTiles, sStorage->tileBuffer); for (i = 0; i < 3; i++) CpuFastCopy(&sStorage->tileBuffer[i * 0x60], &sStorage->itemIconBuffer[i * 0x80], 0x60); @@ -10081,7 +10081,7 @@ void UpdateSpeciesSpritePSS(struct BoxPokemon *boxMon) DestroyBoxMonIconAtPosition(sCursorPosition); CreateBoxMonIconAtPos(sCursorPosition); if (sStorage->boxOption == OPTION_MOVE_ITEMS) - SetBoxMonIconObjMode(sCursorPosition, (GetBoxMonData(boxMon, MON_DATA_HELD_ITEM) == ITEM_NONE ? ST_OAM_OBJ_NORMAL : ST_OAM_OBJ_BLEND)); + SetBoxMonIconObjMode(sCursorPosition, (GetBoxMonData(boxMon, MON_DATA_HELD_ITEM) == ITEM_NONE ? ST_OAM_OBJ_BLEND : ST_OAM_OBJ_NORMAL)); } } sJustOpenedBag = FALSE; diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index d4ea8e5d4ec3..56d9cd094319 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -44,7 +44,6 @@ #include "tv.h" #include "window.h" #include "constants/battle_move_effects.h" -#include "constants/hold_effects.h" #include "constants/items.h" #include "constants/moves.h" #include "constants/party_menu.h" @@ -142,7 +141,7 @@ static EWRAM_DATA struct PokemonSummaryScreenData u8 ribbonCount; // 0x6 u8 ailment; // 0x7 u8 abilityNum; // 0x8 - u8 metLocation; // 0x9 + metloc_u8_t metLocation; // 0x9 u8 metLevel; // 0xA u8 metGame; // 0xB u32 pid; // 0xC @@ -164,7 +163,7 @@ static EWRAM_DATA struct PokemonSummaryScreenData u8 sanity; // 0x35 u8 OTName[17]; // 0x36 u32 OTID; // 0x48 - u8 teraType; + enum Type teraType; u8 mintNature; } summary; u16 bgTilemapBuffers[PSS_PAGE_COUNT][2][0x400]; @@ -182,7 +181,7 @@ static EWRAM_DATA struct PokemonSummaryScreenData u8 secondMoveIndex; bool8 lockMovesFlag; // This is used to prevent the player from changing position of moves in a battle or when trading. u8 bgDisplayOrder; // Determines the order page backgrounds are loaded while scrolling between them - u8 relearnableMovesNum; + bool8 hasRelearnableMoves; u8 windowIds[8]; u8 spriteIds[SPRITE_ARR_ID_COUNT]; bool8 handleDeoxys; @@ -334,6 +333,7 @@ static const u8 *GetLetterGrade(u32 stat); static u8 AddWindowFromTemplateList(const struct WindowTemplate *template, u8 templateId); static u8 IncrementSkillsStatsMode(u8 mode); static void ClearStatLabel(u32 length, u32 statsCoordX, u32 statsCoordY); +u32 GetAdjustedIvData(struct Pokemon *mon, u32 stat); static const struct BgTemplate sBgTemplates[] = { @@ -551,12 +551,12 @@ static const struct WindowTemplate sSummaryTemplate[] = }, [PSS_LABEL_WINDOW_PROMPT_RELEARN] = { .bg = 0, - .tilemapLeft = 22, + .tilemapLeft = 18, .tilemapTop = 2, - .width = 8, + .width = 11, .height = 2, .paletteNum = 15, - .baseBlock = 387, + .baseBlock = 800, }, [PSS_LABEL_WINDOW_PORTRAIT_DEX_NUMBER] = { .bg = 0, @@ -734,7 +734,7 @@ static void (*const sTextPrinterFunctions[])(void) = [PSS_PAGE_CONTEST_MOVES] = PrintContestMoves }; -static void (*const sTextPrinterTasks[])(u8 taskId) = +static const TaskFunc sTextPrinterTasks[] = { [PSS_PAGE_INFO] = Task_PrintInfoPage, [PSS_PAGE_SKILLS] = Task_PrintSkillsPage, @@ -976,14 +976,7 @@ const struct SpriteTemplate gSpriteTemplate_MoveTypes = .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const u8 sContestCategoryToOamPaletteNum[CONTEST_CATEGORIES_COUNT] = -{ - [CONTEST_CATEGORY_COOL] = 13, - [CONTEST_CATEGORY_BEAUTY] = 14, - [CONTEST_CATEGORY_CUTE] = 14, - [CONTEST_CATEGORY_SMART] = 15, - [CONTEST_CATEGORY_TOUGH] = 13, -}; + static const struct OamData sOamData_MoveSelector = { .y = 0, @@ -1156,7 +1149,7 @@ static const struct SpriteTemplate sSpriteTemplate_StatusCondition = static const u16 sMarkings_Pal[] = INCBIN_U16("graphics/summary_screen/markings.gbapal"); // code -static u8 ShowCategoryIcon(u32 category) +static u8 ShowCategoryIcon(enum DamageCategory category) { if (sMonSummaryScreen->categoryIconSpriteId == 0xFF) sMonSummaryScreen->categoryIconSpriteId = CreateSprite(&gSpriteTemplate_CategoryIcons, 48, 128, 0); @@ -1173,6 +1166,13 @@ static void DestroyCategoryIcon(void) sMonSummaryScreen->categoryIconSpriteId = 0xFF; } +u32 GetAdjustedIvData(struct Pokemon *mon, u32 stat) +{ + if (P_SUMMARY_SCREEN_IV_HYPERTRAIN && GetMonData(mon, MON_DATA_HYPER_TRAINED_HP + stat)) + return MAX_PER_STAT_IVS; + return GetMonData(mon, MON_DATA_HP_IV + stat); +} + void ShowPokemonSummaryScreen(u8 mode, void *mons, u8 monIndex, u8 maxMonIndex, void (*callback)(void)) { sMonSummaryScreen = AllocZeroed(sizeof(*sMonSummaryScreen)); @@ -1224,6 +1224,9 @@ void ShowPokemonSummaryScreen(u8 mode, void *mons, u8 monIndex, u8 maxMonIndex, if (gMonSpritesGfxPtr == NULL) CreateMonSpritesGfxManager(MON_SPR_GFX_MANAGER_A, MON_SPR_GFX_MODE_NORMAL); + if (ShouldShowMoveRelearner()) + TryUpdateRelearnType(TRY_SET_UPDATE); + SetMainCallback2(CB2_InitSummaryScreen); } @@ -1418,24 +1421,24 @@ static bool8 DecompressGraphics(void) case 1: if (FreeTempTileDataBuffersIfPossible() != 1) { - LZDecompressWram(gSummaryPage_Info_Tilemap, sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_INFO][0]); + DecompressDataWithHeaderWram(gSummaryPage_Info_Tilemap, sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_INFO][0]); sMonSummaryScreen->switchCounter++; } break; case 2: - LZDecompressWram(gSummaryPage_InfoEgg_Tilemap, sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_INFO][1]); + DecompressDataWithHeaderWram(gSummaryPage_InfoEgg_Tilemap, sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_INFO][1]); sMonSummaryScreen->switchCounter++; break; case 3: - LZDecompressWram(gSummaryPage_Skills_Tilemap, sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_SKILLS][1]); + DecompressDataWithHeaderWram(gSummaryPage_Skills_Tilemap, sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_SKILLS][1]); sMonSummaryScreen->switchCounter++; break; case 4: - LZDecompressWram(gSummaryPage_BattleMoves_Tilemap, sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_BATTLE_MOVES][1]); + DecompressDataWithHeaderWram(gSummaryPage_BattleMoves_Tilemap, sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_BATTLE_MOVES][1]); sMonSummaryScreen->switchCounter++; break; case 5: - LZDecompressWram(gSummaryPage_ContestMoves_Tilemap, sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_CONTEST_MOVES][1]); + DecompressDataWithHeaderWram(gSummaryPage_ContestMoves_Tilemap, sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_CONTEST_MOVES][1]); sMonSummaryScreen->switchCounter++; break; case 6: @@ -1536,7 +1539,6 @@ static bool8 ExtractMonDataToSummaryStruct(struct Pokemon *mon) sum->ribbonCount = GetMonData(mon, MON_DATA_RIBBON_COUNT); sum->teraType = GetMonData(mon, MON_DATA_TERA_TYPE); sum->isShiny = GetMonData(mon, MON_DATA_IS_SHINY); - sMonSummaryScreen->relearnableMovesNum = P_SUMMARY_SCREEN_MOVE_RELEARNER ? GetNumberOfRelearnableMoves(mon) : 0; return TRUE; } sMonSummaryScreen->switchCounter++; @@ -1696,11 +1698,11 @@ static void Task_HandleInput(u8 taskId) { ChangeSummaryPokemon(taskId, 1); } - else if ((JOY_NEW(DPAD_LEFT)) || GetLRKeysPressed() == MENU_L_PRESSED) + else if (JOY_NEW(DPAD_LEFT)) { ChangePage(taskId, -1); } - else if ((JOY_NEW(DPAD_RIGHT)) || GetLRKeysPressed() == MENU_R_PRESSED) + else if (JOY_NEW(DPAD_RIGHT)) { ChangePage(taskId, 1); } @@ -1748,7 +1750,7 @@ static void Task_HandleInput(u8 taskId) { sMonSummaryScreen->callback = CB2_InitLearnMove; gSpecialVar_0x8004 = sMonSummaryScreen->curMonIndex; - gOriginSummaryScreenPage = sMonSummaryScreen->currPageIndex; + gRelearnMode = sMonSummaryScreen->currPageIndex; StopPokemonAnimations(); PlaySE(SE_SELECT); BeginCloseSummaryScreen(taskId); @@ -1760,6 +1762,24 @@ static void Task_HandleInput(u8 taskId) PlaySE(SE_SELECT); CloseSummaryScreen(taskId); } + else if (JOY_NEW(R_BUTTON)) // R means increase. Level -> Egg -> TM -> Tutor + { + if (P_SUMMARY_SCREEN_MOVE_RELEARNER && (sMonSummaryScreen->currPageIndex == PSS_PAGE_BATTLE_MOVES || sMonSummaryScreen->currPageIndex == PSS_PAGE_CONTEST_MOVES) && !gMain.inBattle) + { + TryUpdateRelearnType(TRY_INCREMENT); + PlaySE(SE_SELECT); + ShowRelearnPrompt(); + } + } + else if (JOY_NEW(L_BUTTON)) // L means decrease. Level <- Egg <- TM <- Tutor + { + if (P_SUMMARY_SCREEN_MOVE_RELEARNER && (sMonSummaryScreen->currPageIndex == PSS_PAGE_BATTLE_MOVES || sMonSummaryScreen->currPageIndex == PSS_PAGE_CONTEST_MOVES) && !gMain.inBattle) + { + TryUpdateRelearnType(TRY_DECREMENT); + PlaySE(SE_SELECT); + ShowRelearnPrompt(); + } + } } } @@ -1864,12 +1884,12 @@ void ExtractMonSkillStatsData(struct Pokemon *mon, struct PokeSummary *sum) void ExtractMonSkillIvData(struct Pokemon *mon, struct PokeSummary *sum) { - sum->currentHP = GetMonData(mon, MON_DATA_HP_IV); - sum->atk = GetMonData(mon, MON_DATA_ATK_IV); - sum->def = GetMonData(mon, MON_DATA_DEF_IV); - sum->spatk = GetMonData(mon, MON_DATA_SPATK_IV); - sum->spdef = GetMonData(mon, MON_DATA_SPDEF_IV); - sum->speed = GetMonData(mon, MON_DATA_SPEED_IV); + sum->currentHP = GetAdjustedIvData(mon, STAT_HP); + sum->atk = GetAdjustedIvData(mon, STAT_ATK); + sum->def = GetAdjustedIvData(mon, STAT_DEF); + sum->spatk = GetAdjustedIvData(mon, STAT_SPATK); + sum->spdef = GetAdjustedIvData(mon, STAT_SPDEF); + sum->speed = GetAdjustedIvData(mon, STAT_SPEED); } void ExtractMonSkillEvData(struct Pokemon *mon, struct PokeSummary *sum) @@ -1882,6 +1902,115 @@ void ExtractMonSkillEvData(struct Pokemon *mon, struct PokeSummary *sum) sum->speed = GetMonData(mon, MON_DATA_SPEED_EV); } +bool32 HasAnyRelearnableMoves(enum MoveRelearnerStates state) +{ + struct Pokemon *mon = &sMonSummaryScreen->currentMon; + + switch (state) + { + case MOVE_RELEARNER_EGG_MOVES: + return HasRelearnerEggMoves(mon); + case MOVE_RELEARNER_TM_MOVES: + return HasRelearnerTMMoves(mon); + case MOVE_RELEARNER_TUTOR_MOVES: + return HasRelearnerTutorMoves(mon); + case MOVE_RELEARNER_LEVEL_UP_MOVES: + return HasRelearnerLevelUpMoves(mon); + default: + return FALSE; + } +} + +bool32 NoMovesAvailableToRelearn(void) +{ + u32 zeroCounter = 0; + for (enum MoveRelearnerStates state = MOVE_RELEARNER_LEVEL_UP_MOVES; state < MOVE_RELEARNER_COUNT; state++) + { + if (!HasAnyRelearnableMoves(state)) + zeroCounter++; + } + + return zeroCounter == MOVE_RELEARNER_COUNT; +} + +bool32 CheckRelearnerStateFlag(enum MoveRelearnerStates state) +{ + if (P_ENABLE_MOVE_RELEARNERS) + return TRUE; + + switch (state) + { + case MOVE_RELEARNER_LEVEL_UP_MOVES: + return TRUE; + case MOVE_RELEARNER_EGG_MOVES: + return FlagGet(P_FLAG_EGG_MOVES); + case MOVE_RELEARNER_TM_MOVES: + return P_TM_MOVES_RELEARNER; + case MOVE_RELEARNER_TUTOR_MOVES: + return FlagGet(P_FLAG_TUTOR_MOVES); + default: + return FALSE; + } +} + +void TryUpdateRelearnType(enum IncrDecrUpdateValues delta) +{ + bool32 hasRelearnableMoves = FALSE; + u32 zeroCounter = 0; + enum MoveRelearnerStates state = gMoveRelearnerState; + + // just in case everything is off, default to level up moves + if ((!P_ENABLE_MOVE_RELEARNERS + && !P_TM_MOVES_RELEARNER + && !FlagGet(P_FLAG_EGG_MOVES) + && !FlagGet(P_FLAG_TUTOR_MOVES))) + { + sMonSummaryScreen->hasRelearnableMoves = HasAnyRelearnableMoves(MOVE_RELEARNER_LEVEL_UP_MOVES); + return; + } + + do + { + switch (delta) + { + default: + case TRY_SET_UPDATE: + hasRelearnableMoves = HasAnyRelearnableMoves(gMoveRelearnerState); + if (!hasRelearnableMoves) + { + delta = TRY_INCREMENT; + continue; + } + else + { + sMonSummaryScreen->hasRelearnableMoves = hasRelearnableMoves; + return; + } + // should never reach this, but just in case + break; + case TRY_INCREMENT: + state = state >= MOVE_RELEARNER_TUTOR_MOVES ? MOVE_RELEARNER_LEVEL_UP_MOVES : state + 1; + break; + case TRY_DECREMENT: + state = state == MOVE_RELEARNER_LEVEL_UP_MOVES ? MOVE_RELEARNER_TUTOR_MOVES : state - 1; + break; + } + + if (!CheckRelearnerStateFlag(state)) + continue; + + hasRelearnableMoves = HasAnyRelearnableMoves(state); + if (hasRelearnableMoves) + { + gMoveRelearnerState = state; + sMonSummaryScreen->hasRelearnableMoves = hasRelearnableMoves; + return; + } + zeroCounter++; + + } while (zeroCounter <= MOVE_RELEARNER_COUNT && !hasRelearnableMoves); +} + static void ChangeSummaryPokemon(u8 taskId, s8 delta) { s8 monId; @@ -1953,27 +2082,32 @@ static void Task_ChangeSummaryMon(u8 taskId) sMonSummaryScreen->switchCounter = 0; break; case 4: + if (ExtractMonDataToSummaryStruct(&sMonSummaryScreen->currentMon) == FALSE) + return; + if (P_SUMMARY_SCREEN_RENAME && sMonSummaryScreen->currPageIndex == PSS_PAGE_INFO) ShowUtilityPrompt(SUMMARY_MODE_NORMAL); + if (ShouldShowIvEvPrompt() && sMonSummaryScreen->currPageIndex == PSS_PAGE_SKILLS) { sMonSummaryScreen->skillsPageMode = SUMMARY_SKILLS_MODE_STATS; ChangeStatLabel(SUMMARY_SKILLS_MODE_STATS); } - if (ExtractMonDataToSummaryStruct(&sMonSummaryScreen->currentMon) == FALSE) + + if (P_SUMMARY_SCREEN_MOVE_RELEARNER + && (sMonSummaryScreen->currPageIndex == PSS_PAGE_BATTLE_MOVES + || sMonSummaryScreen->currPageIndex == PSS_PAGE_CONTEST_MOVES)) { - return; + gMoveRelearnerState = MOVE_RELEARNER_LEVEL_UP_MOVES; + TryUpdateRelearnType(TRY_SET_UPDATE); + if (ShouldShowMoveRelearner()) + ShowRelearnPrompt(); + else + ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_RELEARN); } else { - if (P_SUMMARY_SCREEN_MOVE_RELEARNER - && (sMonSummaryScreen->currPageIndex == PSS_PAGE_BATTLE_MOVES || sMonSummaryScreen->currPageIndex == PSS_PAGE_CONTEST_MOVES)) - { - if (ShouldShowMoveRelearner()) - PutWindowTilemap(PSS_LABEL_WINDOW_PROMPT_RELEARN); - else - ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_RELEARN); - } + ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_RELEARN); } break; case 5: @@ -2089,6 +2223,7 @@ static void ChangePage(u8 taskId, s8 delta) { struct PokeSummary *summary = &sMonSummaryScreen->summary; s16 *data = gTasks[taskId].data; + u32 currPageIndex; if (summary->isEgg) return; @@ -2099,17 +2234,17 @@ static void ChangePage(u8 taskId, s8 delta) PlaySE(SE_SELECT); ClearPageWindowTilemaps(sMonSummaryScreen->currPageIndex); - sMonSummaryScreen->currPageIndex += delta; + currPageIndex = sMonSummaryScreen->currPageIndex += delta; data[0] = 0; if (delta == 1) SetTaskFuncWithFollowupFunc(taskId, PssScrollRight, gTasks[taskId].func); else SetTaskFuncWithFollowupFunc(taskId, PssScrollLeft, gTasks[taskId].func); - CreateTextPrinterTask(sMonSummaryScreen->currPageIndex); + CreateTextPrinterTask(currPageIndex); HidePageSpecificSprites(); - if (sMonSummaryScreen->currPageIndex == PSS_PAGE_SKILLS - || (sMonSummaryScreen->currPageIndex + delta) == PSS_PAGE_SKILLS) + if (currPageIndex == PSS_PAGE_SKILLS + || (currPageIndex + delta) == PSS_PAGE_SKILLS) { struct Pokemon *mon = &sMonSummaryScreen->currentMon; @@ -2125,6 +2260,19 @@ static void ChangePage(u8 taskId, s8 delta) { ShowUtilityPrompt(SUMMARY_MODE_NORMAL); } + + // acts like a quick reset + if (currPageIndex == PSS_PAGE_SKILLS) + { + gMoveRelearnerState = MOVE_RELEARNER_LEVEL_UP_MOVES; + TryUpdateRelearnType(TRY_SET_UPDATE); + } + + // to prevent nothing showing + if (currPageIndex >= PSS_PAGE_BATTLE_MOVES && !sMonSummaryScreen->hasRelearnableMoves) + TryUpdateRelearnType(TRY_SET_UPDATE); + else + ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_RELEARN); } static void PssScrollRight(u8 taskId) // Scroll right @@ -2168,6 +2316,7 @@ static void PssScrollRightEnd(u8 taskId) // display right SetTypeIcons(); TryDrawExperienceProgressBar(); SwitchTaskToFollowupFunc(taskId); + ShowRelearnPrompt(); } static void PssScrollLeft(u8 taskId) // Scroll left @@ -2220,6 +2369,7 @@ static void PssScrollLeftEnd(u8 taskId) // display left SetTypeIcons(); TryDrawExperienceProgressBar(); SwitchTaskToFollowupFunc(taskId); + ShowRelearnPrompt(); } static void TryDrawExperienceProgressBar(void) @@ -2609,7 +2759,7 @@ static bool8 CanReplaceMove(void) { if (sMonSummaryScreen->firstMoveIndex == MAX_MON_MOVES || sMonSummaryScreen->newMove == MOVE_NONE - || IsMoveHM(sMonSummaryScreen->summary.moves[sMonSummaryScreen->firstMoveIndex]) != TRUE) + || !CannotForgetMove(sMonSummaryScreen->summary.moves[sMonSummaryScreen->firstMoveIndex])) return TRUE; else return FALSE; @@ -3231,7 +3381,13 @@ static void PrintPageNamesAndStats(void) PrintTextOnWindow(PSS_LABEL_WINDOW_MOVES_POWER_ACC, gText_Accuracy2, 0, 17, 0, 1); PrintTextOnWindow(PSS_LABEL_WINDOW_MOVES_APPEAL_JAM, gText_Appeal, 0, 1, 0, 1); PrintTextOnWindow(PSS_LABEL_WINDOW_MOVES_APPEAL_JAM, gText_Jam, 0, 17, 0, 1); - PrintTextOnWindowWithFont(PSS_LABEL_WINDOW_PROMPT_RELEARN, gText_Relearn, 0, 4, 0, 0, FONT_SMALL); + + if (sMonSummaryScreen->currPageIndex == PSS_PAGE_BATTLE_MOVES + || sMonSummaryScreen->currPageIndex == PSS_PAGE_CONTEST_MOVES) + { + TryUpdateRelearnType(TRY_SET_UPDATE); + ShowRelearnPrompt(); + } } static void PutPageWindowTilemaps(u8 page) @@ -3307,6 +3463,7 @@ static void ClearPageWindowTilemaps(u8 page) if (InBattleFactory() == TRUE || InSlateportBattleTent() == TRUE) ClearWindowTilemap(PSS_LABEL_WINDOW_POKEMON_INFO_RENTAL); ClearWindowTilemap(PSS_LABEL_WINDOW_POKEMON_INFO_TYPE); + ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_RELEARN); break; case PSS_PAGE_SKILLS: ClearWindowTilemap(PSS_LABEL_WINDOW_POKEMON_SKILLS_STATS_LEFT); @@ -3314,6 +3471,7 @@ static void ClearPageWindowTilemaps(u8 page) ClearWindowTilemap(PSS_LABEL_WINDOW_POKEMON_SKILLS_EXP); if (ShouldShowIvEvPrompt()) ClearPageWindowTilemaps(PSS_LABEL_WINDOW_PROMPT_UTILITY); + ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_RELEARN); break; case PSS_PAGE_BATTLE_MOVES: if (sMonSummaryScreen->mode == SUMMARY_MODE_SELECT_MOVE) @@ -3324,11 +3482,8 @@ static void ClearPageWindowTilemaps(u8 page) gSprites[sMonSummaryScreen->categoryIconSpriteId].invisible = TRUE; } } - else - { - if (ShouldShowMoveRelearner()) - ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_RELEARN); - } + + ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_RELEARN); break; case PSS_PAGE_CONTEST_MOVES: if (sMonSummaryScreen->mode == SUMMARY_MODE_SELECT_MOVE) @@ -3336,11 +3491,8 @@ static void ClearPageWindowTilemaps(u8 page) if (sMonSummaryScreen->newMove != MOVE_NONE || sMonSummaryScreen->firstMoveIndex != MAX_MON_MOVES) ClearWindowTilemap(PSS_LABEL_WINDOW_MOVES_APPEAL_JAM); } - else - { - if (ShouldShowMoveRelearner()) - ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_RELEARN); - } + + ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_RELEARN); break; } @@ -3466,13 +3618,13 @@ static void PrintMonOTID(void) static void PrintMonAbilityName(void) { - u16 ability = GetAbilityBySpecies(sMonSummaryScreen->summary.species, sMonSummaryScreen->summary.abilityNum); + enum Ability ability = GetAbilityBySpecies(sMonSummaryScreen->summary.species, sMonSummaryScreen->summary.abilityNum); PrintTextOnWindow(AddWindowFromTemplateList(sPageInfoTemplate, PSS_DATA_WINDOW_INFO_ABILITY), gAbilitiesInfo[ability].name, 0, 1, 0, 1); } static void PrintMonAbilityDescription(void) { - u16 ability = GetAbilityBySpecies(sMonSummaryScreen->summary.species, sMonSummaryScreen->summary.abilityNum); + enum Ability ability = GetAbilityBySpecies(sMonSummaryScreen->summary.species, sMonSummaryScreen->summary.abilityNum); PrintTextOnWindow(AddWindowFromTemplateList(sPageInfoTemplate, PSS_DATA_WINDOW_INFO_ABILITY), gAbilitiesInfo[ability].description, 0, 17, 0, 0); } @@ -3758,14 +3910,14 @@ static void PrintRibbonCount(void) PrintTextOnWindow(AddWindowFromTemplateList(sPageSkillsTemplate, PSS_DATA_WINDOW_SKILLS_RIBBON_COUNT), text, x, 1, 0, 0); } -static void BufferStat(u8 *dst, u8 statIndex, u32 stat, u32 strId, u32 n) +static void BufferStat(u8 *dst, enum Stat statIndex, u32 stat, u32 strId, u32 n) { static const u8 sTextNatureDown[] = _("{COLOR}{08}"); static const u8 sTextNatureUp[] = _("{COLOR}{05}"); static const u8 sTextNatureNeutral[] = _("{COLOR}{01}"); u8 *txtPtr; - if (statIndex == 0 || !SUMMARY_SCREEN_NATURE_COLORS || gNaturesInfo[sMonSummaryScreen->summary.mintNature].statUp == gNaturesInfo[sMonSummaryScreen->summary.mintNature].statDown) + if (statIndex == 0 || !P_SUMMARY_SCREEN_NATURE_COLORS || gNaturesInfo[sMonSummaryScreen->summary.mintNature].statUp == gNaturesInfo[sMonSummaryScreen->summary.mintNature].statDown) txtPtr = StringCopy(dst, sTextNatureNeutral); else if (statIndex == gNaturesInfo[sMonSummaryScreen->summary.mintNature].statUp) txtPtr = StringCopy(dst, sTextNatureUp); @@ -3792,18 +3944,18 @@ static const u8 *GetLetterGrade(u32 stat) static const u8 gText_GradeA[] = _("A"); static const u8 gText_GradeS[] = _("S"); - if (stat > 0 && stat <= 15) + if (stat <= 0) + return gText_GradeF; + else if (stat <= 15) return gText_GradeD; - else if (stat > 15 && stat <= 25) + else if (stat <= 25) return gText_GradeC; - else if (stat > 26 && stat <= 29) + else if (stat <= 29) return gText_GradeB; - else if (stat == 30) + else if (stat <= 30) return gText_GradeA; - else if (stat == 31) - return gText_GradeS; else - return gText_GradeF; + return gText_GradeS; } static void BufferLeftColumnStats(void) @@ -4101,7 +4253,7 @@ static void PrintContestMoveDescription(u8 moveSlot) if (move != MOVE_NONE) { u8 windowId = AddWindowFromTemplateList(sPageMovesTemplate, PSS_DATA_WINDOW_MOVE_DESCRIPTION); - PrintTextOnWindow(windowId, gContestEffectDescriptionPointers[GetMoveContestEffect(move)], 6, 1, 0, 0); + PrintTextOnWindow(windowId, gContestEffects[GetMoveContestEffect(move)].description, 6, 1, 0, 0); } } @@ -4120,7 +4272,7 @@ static void PrintMoveDetails(u16 move) } else { - PrintTextOnWindow(windowId, gContestEffectDescriptionPointers[GetMoveContestEffect(move)], 6, 1, 0, 0); + PrintTextOnWindow(windowId, gContestEffects[GetMoveContestEffect(move)].description, 6, 1, 0, 0); } PutWindowTilemap(windowId); } @@ -4253,14 +4405,14 @@ static void CreateMoveTypeIcons(void) } } -void SetTypeSpritePosAndPal(u8 typeId, u8 x, u8 y, u8 spriteArrayId) +void SetTypeSpritePosAndPal(enum Type typeId, u8 x, u8 y, u8 spriteArrayId) { struct Sprite *sprite = &gSprites[sMonSummaryScreen->spriteIds[spriteArrayId]]; StartSpriteAnim(sprite, typeId); if (typeId < NUMBER_OF_MON_TYPES) sprite->oam.paletteNum = gTypesInfo[typeId].palette; else - sprite->oam.paletteNum = sContestCategoryToOamPaletteNum[typeId - NUMBER_OF_MON_TYPES]; + sprite->oam.paletteNum = gContestCategoryInfo[typeId - NUMBER_OF_MON_TYPES].palette; sprite->x = x + 16; sprite->y = y + 8; SetSpriteInvisibility(spriteArrayId, FALSE); @@ -4276,10 +4428,10 @@ static void SetMonTypeIcons(void) } else { - SetTypeSpritePosAndPal(gSpeciesInfo[summary->species].types[0], 120, 48, SPRITE_ARR_ID_TYPE); - if (gSpeciesInfo[summary->species].types[0] != gSpeciesInfo[summary->species].types[1]) + SetTypeSpritePosAndPal(GetSpeciesType(summary->species, 0), 120, 48, SPRITE_ARR_ID_TYPE); + if (GetSpeciesType(summary->species, 0) != GetSpeciesType(summary->species, 1)) { - SetTypeSpritePosAndPal(gSpeciesInfo[summary->species].types[1], 160, 48, SPRITE_ARR_ID_TYPE + 1); + SetTypeSpritePosAndPal(GetSpeciesType(summary->species, 1), 160, 48, SPRITE_ARR_ID_TYPE + 1); SetSpriteInvisibility(SPRITE_ARR_ID_TYPE + 1, FALSE); } else @@ -4298,7 +4450,7 @@ static void SetMoveTypeIcons(void) u32 i; struct PokeSummary *summary = &sMonSummaryScreen->summary; struct Pokemon *mon = &sMonSummaryScreen->currentMon; - u32 type; + enum Type type; for (i = 0; i < MAX_MON_MOVES; i++) { @@ -4335,7 +4487,7 @@ static void SetContestMoveTypeIcons(void) static void SetNewMoveTypeIcon(void) { - u32 type = GetMoveType(sMonSummaryScreen->newMove); + enum Type type = GetMoveType(sMonSummaryScreen->newMove); struct Pokemon *mon = &sMonSummaryScreen->currentMon; if (P_SHOW_DYNAMIC_TYPES) @@ -4652,9 +4804,10 @@ static inline bool32 ShouldShowMoveRelearner(void) && !sMonSummaryScreen->isBoxMon && sMonSummaryScreen->mode != SUMMARY_MODE_BOX && sMonSummaryScreen->mode != SUMMARY_MODE_BOX_CURSOR - && sMonSummaryScreen->relearnableMovesNum > 0 + && sMonSummaryScreen->hasRelearnableMoves && !InBattleFactory() - && !InSlateportBattleTent()); + && !InSlateportBattleTent() + && !NoMovesAvailableToRelearn()); } static inline bool32 ShouldShowRename(void) @@ -4675,7 +4828,7 @@ static inline bool32 ShouldShowIvEvPrompt(void) if (P_SUMMARY_SCREEN_IV_EV_BOX_ONLY) { return (P_SUMMARY_SCREEN_IV_EV_INFO || FlagGet(P_FLAG_SUMMARY_SCREEN_IV_EV_INFO)) - && (sMonSummaryScreen->mode == SUMMARY_MODE_BOX|| sMonSummaryScreen->mode == SUMMARY_MODE_BOX_CURSOR); + && (sMonSummaryScreen->mode == SUMMARY_MODE_BOX || sMonSummaryScreen->mode == SUMMARY_MODE_BOX_CURSOR); } else if (!P_SUMMARY_SCREEN_IV_EV_BOX_ONLY) { @@ -4750,6 +4903,49 @@ static inline void ShowUtilityPrompt(s16 mode) PrintTextOnWindow(PSS_LABEL_WINDOW_PROMPT_UTILITY, promptText, stringXPos, 1, 0, 0); } +void ShowRelearnPrompt(void) +{ + u32 currPage = sMonSummaryScreen->currPageIndex; + + if (!ShouldShowMoveRelearner() || !(currPage >= PSS_PAGE_BATTLE_MOVES)) + { + ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_RELEARN); + return; + } + + if (!HasAnyRelearnableMoves(gMoveRelearnerState)) + return; + + const u8* relearnText; + + int relearnTextXPos; + + switch (gMoveRelearnerState) + { + case MOVE_RELEARNER_LEVEL_UP_MOVES: + relearnText = gText_Relearn_LevelUp; + break; + case MOVE_RELEARNER_EGG_MOVES: + relearnText = gText_Relearn_Egg; + break; + case MOVE_RELEARNER_TM_MOVES: + relearnText = gText_Relearn_TM; + break; + case MOVE_RELEARNER_TUTOR_MOVES: + relearnText = gText_Relearn_Tutor; + break; + default: + relearnText = gText_Relearn; + break; + } + + relearnTextXPos = GetStringRightAlignXOffset(FONT_NORMAL, relearnText, 0); + + FillWindowPixelBuffer(PSS_LABEL_WINDOW_PROMPT_RELEARN, PIXEL_FILL(0)); + PutWindowTilemap(PSS_LABEL_WINDOW_PROMPT_RELEARN); + PrintTextOnWindowWithFont(PSS_LABEL_WINDOW_PROMPT_RELEARN, relearnText, relearnTextXPos, 4, 0, 0, FONT_SMALL); +} + static void CB2_ReturnToSummaryScreenFromNamingScreen(void) { SetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar2); diff --git a/src/pokenav_conditions_gfx.c b/src/pokenav_conditions_gfx.c index 8845307c0e6b..a73a33b76946 100644 --- a/src/pokenav_conditions_gfx.c +++ b/src/pokenav_conditions_gfx.c @@ -26,8 +26,8 @@ static u8 sInitialLoadId; // Never read const u16 gConditionGraphData_Pal[] = INCBIN_U16("graphics/pokenav/condition/graph_data.gbapal"); const u16 gConditionText_Pal[] = INCBIN_U16("graphics/pokenav/condition/text.gbapal"); -static const u32 sConditionGraphData_Gfx[] = INCBIN_U32("graphics/pokenav/condition/graph_data.4bpp.lz"); -static const u32 sConditionGraphData_Tilemap[] = INCBIN_U32("graphics/pokenav/condition/graph_data.bin.lz"); +static const u32 sConditionGraphData_Gfx[] = INCBIN_U32("graphics/pokenav/condition/graph_data.4bpp.smol"); +static const u32 sConditionGraphData_Tilemap[] = INCBIN_U32("graphics/pokenav/condition/graph_data.bin.smolTM"); static const u16 sMonMarkings_Pal[] = INCBIN_U16("graphics/pokenav/condition/mon_markings.gbapal"); static const u8 gText_Number2[] = _("No. "); @@ -222,7 +222,7 @@ static u32 LoopedTask_OpenConditionGraphMenu(s32 state) if (FreeTempTileDataBuffersIfPossible()) return LT_PAUSE; - LZ77UnCompVram(gPokenavCondition_Tilemap, menu->tilemapBuffers[0]); + DecompressDataWithHeaderVram(gPokenavCondition_Tilemap, menu->tilemapBuffers[0]); SetBgTilemapBuffer(3, menu->tilemapBuffers[0]); if (IsConditionMenuSearchMode() == TRUE) CopyToBgTilemapBufferRect(3, gPokenavOptions_Tilemap, 0, 5, 9, 4); @@ -236,7 +236,7 @@ static u32 LoopedTask_OpenConditionGraphMenu(s32 state) if (FreeTempTileDataBuffersIfPossible()) return LT_PAUSE; - LZ77UnCompVram(sConditionGraphData_Tilemap, menu->tilemapBuffers[2]); + DecompressDataWithHeaderVram(sConditionGraphData_Tilemap, menu->tilemapBuffers[2]); SetBgTilemapBuffer(2, menu->tilemapBuffers[2]); CopyBgTilemapBufferToVram(2); CopyPaletteIntoBufferUnfaded(gConditionGraphData_Pal, BG_PLTT_ID(3), PLTT_SIZE_4BPP); diff --git a/src/pokenav_conditions_search_results.c b/src/pokenav_conditions_search_results.c index e7b317d7ea49..dfca6b268d20 100644 --- a/src/pokenav_conditions_search_results.c +++ b/src/pokenav_conditions_search_results.c @@ -80,8 +80,8 @@ static const LoopedTask sConditionSearchLoopedTaskFuncs[] = }; static const u16 sConditionSearchResultFramePal[] = INCBIN_U16("graphics/pokenav/condition/search_results.gbapal"); -static const u32 sConditionSearchResultTiles[] = INCBIN_U32("graphics/pokenav/condition/search_results.4bpp.lz"); -static const u32 sConditionSearchResultTilemap[] = INCBIN_U32("graphics/pokenav/condition/search_results.bin.lz"); +static const u32 sConditionSearchResultTiles[] = INCBIN_U32("graphics/pokenav/condition/search_results.4bpp.smol"); +static const u32 sConditionSearchResultTilemap[] = INCBIN_U32("graphics/pokenav/condition/search_results.bin.smolTM"); static const u16 sListBg_Pal[] = INCBIN_U16("graphics/pokenav/condition/search_results_list.gbapal"); static const struct BgTemplate sConditionSearchResultBgTemplates[] = diff --git a/src/pokenav_list.c b/src/pokenav_list.c index c39c7b1b4caa..85393ca68a01 100644 --- a/src/pokenav_list.c +++ b/src/pokenav_list.c @@ -94,7 +94,7 @@ static u32 LoopedTask_ReshowListFromCheckPage(s32); static u32 LoopedTask_PrintCheckPageInfo(s32); static const u16 sListArrow_Pal[] = INCBIN_U16("graphics/pokenav/list_arrows.gbapal"); -static const u32 sListArrow_Gfx[] = INCBIN_U32("graphics/pokenav/list_arrows.4bpp.lz"); +static const u32 sListArrow_Gfx[] = INCBIN_U32("graphics/pokenav/list_arrows.4bpp.smol"); static const u8 gText_PokenavMatchCall_Strategy[] = _("STRATEGY"); static const u8 gText_PokenavMatchCall_TrainerPokemon[] = _("TRAINER'S POKΓ©MON"); diff --git a/src/pokenav_main_menu.c b/src/pokenav_main_menu.c index d2765b67061e..f3ce513f4fa4 100644 --- a/src/pokenav_main_menu.c +++ b/src/pokenav_main_menu.c @@ -32,7 +32,7 @@ struct Pokenav_MainMenu // Needed to match LoadLeftHeaderGfxForSubMenu. struct CompressedSpriteSheetNoSize { - const u32 *data; // LZ77 compressed palette data + const u32 *data; // Compressed sprite data u32 tag; }; @@ -55,8 +55,8 @@ static void SpriteCB_SpinningPokenav(struct Sprite *); static u32 LoopedTask_InitPokenavMenu(s32); static const u16 sSpinningPokenav_Pal[] = INCBIN_U16("graphics/pokenav/nav_icon.gbapal"); -static const u32 sSpinningPokenav_Gfx[] = INCBIN_U32("graphics/pokenav/nav_icon.4bpp.lz"); -static const u32 sBlueLightCopy[] = INCBIN_U32("graphics/pokenav/blue_light.4bpp.lz"); // Unused copy of sMatchCallBlueLightTiles +static const u32 sSpinningPokenav_Gfx[] = INCBIN_U32("graphics/pokenav/nav_icon.4bpp.smol"); +static const u32 sBlueLightCopy[] = INCBIN_U32("graphics/pokenav/blue_light.4bpp.smol"); // Unused copy of sMatchCallBlueLightTiles const struct BgTemplate gPokenavMainMenuBgTemplates[] = { @@ -685,7 +685,7 @@ static void LoadLeftHeaderGfxForMenu(u32 menuGfxId) tag = sMenuLeftHeaderSpriteSheets[menuGfxId].tag; size = GetDecompressedDataSize(sMenuLeftHeaderSpriteSheets[menuGfxId].data); LoadPalette(&gPokenavLeftHeader_Pal[tag * 16], OBJ_PLTT_ID(IndexOfSpritePaletteTag(1)), PLTT_SIZE_4BPP); - LZDecompressWram(sMenuLeftHeaderSpriteSheets[menuGfxId].data, menu->leftHeaderMenuBuffer); + DecompressDataWithHeaderWram(sMenuLeftHeaderSpriteSheets[menuGfxId].data, menu->leftHeaderMenuBuffer); RequestDma3Copy(menu->leftHeaderMenuBuffer, (void *)OBJ_VRAM0 + (GetSpriteTileStartByTag(2) * 32), size, 1); menu->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + sMenuLeftHeaderSpriteSheets[menuGfxId].size; @@ -707,7 +707,7 @@ static void LoadLeftHeaderGfxForSubMenu(u32 menuGfxId) tag = sPokenavSubMenuLeftHeaderSpriteSheets[menuGfxId].tag; size = GetDecompressedDataSize(sPokenavSubMenuLeftHeaderSpriteSheets[menuGfxId].data); LoadPalette(&gPokenavLeftHeader_Pal[tag * 16], OBJ_PLTT_ID(IndexOfSpritePaletteTag(2)), PLTT_SIZE_4BPP); - LZDecompressWram(sPokenavSubMenuLeftHeaderSpriteSheets[menuGfxId].data, menu->leftHeaderSubMenuBuffer); + DecompressDataWithHeaderWram(sPokenavSubMenuLeftHeaderSpriteSheets[menuGfxId].data, menu->leftHeaderSubMenuBuffer); RequestDma3Copy(menu->leftHeaderSubMenuBuffer, (void *)OBJ_VRAM0 + 0x800 + (GetSpriteTileStartByTag(2) * 32), size, 1); } diff --git a/src/pokenav_match_call_data.c b/src/pokenav_match_call_data.c index 65f3e5578089..e3bd81aff385 100644 --- a/src/pokenav_match_call_data.c +++ b/src/pokenav_match_call_data.c @@ -34,13 +34,13 @@ typedef struct MatchCallTextDataStruct { struct MatchCallStructCommon { u8 type; - u8 mapSec; + mapsec_u8_t mapSec; u16 flag; }; struct MatchCallStructNPC { u8 type; - u8 mapSec; + mapsec_u8_t mapSec; u16 flag; const u8 *desc; const u8 *name; @@ -50,7 +50,7 @@ struct MatchCallStructNPC { // Shared by MC_TYPE_TRAINER and MC_TYPE_LEADER struct MatchCallStructTrainer { u8 type; - u8 mapSec; + mapsec_u8_t mapSec; u16 flag; u16 rematchTableIdx; const u8 *desc; @@ -60,12 +60,12 @@ struct MatchCallStructTrainer { struct MatchCallLocationOverride { u16 flag; - u8 mapSec; + mapsec_u8_t mapSec; }; struct MatchCallWally { u8 type; - u8 mapSec; + mapsec_u8_t mapSec; u16 flag; u16 rematchTableIdx; const u8 *desc; @@ -75,7 +75,7 @@ struct MatchCallWally { struct MatchCallBirch { u8 type; - u8 mapSec; + mapsec_u8_t mapSec; u16 flag; const u8 *desc; const u8 *name; @@ -117,11 +117,11 @@ static bool32 MatchCall_GetEnabled_Wally(match_call_t); static bool32 MatchCall_GetEnabled_Birch(match_call_t); static bool32 MatchCall_GetEnabled_Rival(match_call_t); -static u8 MatchCall_GetMapSec_NPC(match_call_t); -static u8 MatchCall_GetMapSec_Trainer(match_call_t); -static u8 MatchCall_GetMapSec_Wally(match_call_t); -static u8 MatchCall_GetMapSec_Birch(match_call_t); -static u8 MatchCall_GetMapSec_Rival(match_call_t); +static mapsec_u8_t MatchCall_GetMapSec_NPC(match_call_t); +static mapsec_u8_t MatchCall_GetMapSec_Trainer(match_call_t); +static mapsec_u8_t MatchCall_GetMapSec_Wally(match_call_t); +static mapsec_u8_t MatchCall_GetMapSec_Birch(match_call_t); +static mapsec_u8_t MatchCall_GetMapSec_Rival(match_call_t); static bool32 MatchCall_IsRematchable_NPC(match_call_t); static bool32 MatchCall_IsRematchable_Trainer(match_call_t); @@ -613,7 +613,7 @@ static bool32 (*const sMatchCallGetEnabledFuncs[])(match_call_t) = { MatchCall_GetEnabled_Birch }; -static u8 (*const sMatchCallGetMapSecFuncs[])(match_call_t) = { +static mapsec_u8_t (*const sMatchCallGetMapSecFuncs[])(match_call_t) = { MatchCall_GetMapSec_NPC, MatchCall_GetMapSec_Trainer, MatchCall_GetMapSec_Wally, @@ -796,7 +796,7 @@ static bool32 MatchCall_GetEnabled_Birch(match_call_t matchCall) return FlagGet(matchCall.birch->flag); } -u8 MatchCall_GetMapSec(u32 idx) +mapsec_u8_t MatchCall_GetMapSec(u32 idx) { match_call_t matchCall; u32 i; @@ -808,17 +808,17 @@ u8 MatchCall_GetMapSec(u32 idx) return sMatchCallGetMapSecFuncs[i](matchCall); } -static u8 MatchCall_GetMapSec_NPC(match_call_t matchCall) +static mapsec_u8_t MatchCall_GetMapSec_NPC(match_call_t matchCall) { return matchCall.npc->mapSec; } -static u8 MatchCall_GetMapSec_Trainer(match_call_t matchCall) +static mapsec_u8_t MatchCall_GetMapSec_Trainer(match_call_t matchCall) { return matchCall.trainer->mapSec; } -static u8 MatchCall_GetMapSec_Wally(match_call_t matchCall) +static mapsec_u8_t MatchCall_GetMapSec_Wally(match_call_t matchCall) { s32 i; @@ -830,12 +830,12 @@ static u8 MatchCall_GetMapSec_Wally(match_call_t matchCall) return matchCall.wally->locationData[i].mapSec; } -static u8 MatchCall_GetMapSec_Rival(match_call_t matchCall) +static mapsec_u8_t MatchCall_GetMapSec_Rival(match_call_t matchCall) { return MAPSEC_NONE; } -static u8 MatchCall_GetMapSec_Birch(match_call_t matchCall) +static mapsec_u8_t MatchCall_GetMapSec_Birch(match_call_t matchCall) { return MAPSEC_NONE; } diff --git a/src/pokenav_match_call_gfx.c b/src/pokenav_match_call_gfx.c index e844b6843aad..cfa55c61e3bc 100755 --- a/src/pokenav_match_call_gfx.c +++ b/src/pokenav_match_call_gfx.c @@ -115,14 +115,14 @@ static u32 ExitCheckPage(s32); static u32 ExitMatchCall(s32); static const u16 sMatchCallUI_Pal[] = INCBIN_U16("graphics/pokenav/match_call/ui.gbapal"); -static const u32 sMatchCallUI_Gfx[] = INCBIN_U32("graphics/pokenav/match_call/ui.4bpp.lz"); -static const u32 sMatchCallUI_Tilemap[] = INCBIN_U32("graphics/pokenav/match_call/ui.bin.lz"); +static const u32 sMatchCallUI_Gfx[] = INCBIN_U32("graphics/pokenav/match_call/ui.4bpp.smol"); +static const u32 sMatchCallUI_Tilemap[] = INCBIN_U32("graphics/pokenav/match_call/ui.bin.smolTM"); static const u16 sOptionsCursor_Pal[] = INCBIN_U16("graphics/pokenav/match_call/options_cursor.gbapal"); -static const u32 sOptionsCursor_Gfx[] = INCBIN_U32("graphics/pokenav/match_call/options_cursor.4bpp.lz"); +static const u32 sOptionsCursor_Gfx[] = INCBIN_U32("graphics/pokenav/match_call/options_cursor.4bpp.smol"); static const u16 sCallWindow_Pal[] = INCBIN_U16("graphics/pokenav/match_call/call_window.gbapal"); static const u16 sListWindow_Pal[] = INCBIN_U16("graphics/pokenav/match_call/list_window.gbapal"); static const u16 sPokeball_Pal[] = INCBIN_U16("graphics/pokenav/match_call/pokeball.gbapal"); -static const u32 sPokeball_Gfx[] = INCBIN_U32("graphics/pokenav/match_call/pokeball.4bpp.lz"); +static const u32 sPokeball_Gfx[] = INCBIN_U32("graphics/pokenav/match_call/pokeball.4bpp.smol"); static const u8 gText_NumberRegistered[] = _("No. registered"); static const u8 gText_NumberOfBattles[] = _("No. of battles"); @@ -1027,7 +1027,7 @@ static void PrintMatchCallLocation(struct Pokenav_MatchCallGfx *gfx, int delta) u8 mapName[32]; int x; int index = PokenavList_GetSelectedIndex() + delta; - int mapSec = GetMatchCallMapSec(index); + mapsec_s32_t mapSec = GetMatchCallMapSec(index); if (mapSec != MAPSEC_NONE) GetMapName(mapName, mapSec, 0); else diff --git a/src/pokenav_match_call_list.c b/src/pokenav_match_call_list.c index 9a51c092e9f0..d56e7b140a7a 100755 --- a/src/pokenav_match_call_list.c +++ b/src/pokenav_match_call_list.c @@ -308,7 +308,7 @@ struct PokenavMatchCallEntry *GetMatchCallList(void) return state->matchCallEntries; } -u16 GetMatchCallMapSec(int index) +mapsec_u16_t GetMatchCallMapSec(int index) { struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); return state->matchCallEntries[index].mapSec; @@ -410,7 +410,7 @@ void BufferMatchCallNameAndDesc(struct PokenavMatchCallEntry *matchCallEntry, u8 { int index = GetTrainerIdxByRematchIdx(matchCallEntry->headerId); const struct Trainer *trainer = GetTrainerStructFromId(index); - int class = trainer->trainerClass; + enum TrainerClassID class = trainer->trainerClass; className = gTrainerClasses[class].name; trainerName = trainer->trainerName; } @@ -430,7 +430,7 @@ void BufferMatchCallNameAndDesc(struct PokenavMatchCallEntry *matchCallEntry, u8 } } -u8 GetMatchTableMapSectionId(int rematchIndex) +mapsec_u8_t GetMatchTableMapSectionId(int rematchIndex) { int mapGroup = gRematchTable[rematchIndex].mapGroup; int mapNum = gRematchTable[rematchIndex].mapNum; diff --git a/src/pokenav_menu_handler_gfx.c b/src/pokenav_menu_handler_gfx.c index 6004f52ebb6d..9d6bbe501e80 100644 --- a/src/pokenav_menu_handler_gfx.c +++ b/src/pokenav_menu_handler_gfx.c @@ -100,13 +100,13 @@ static void Task_CurrentMenuOptionGlow(u8); static void SetMenuOptionGlow(void); static const u16 sPokenavBgDotsPal[] = INCBIN_U16("graphics/pokenav/bg_dots.gbapal"); -static const u32 sPokenavBgDotsTiles[] = INCBIN_U32("graphics/pokenav/bg_dots.4bpp.lz"); -static const u32 sPokenavBgDotsTilemap[] = INCBIN_U32("graphics/pokenav/bg_dots.bin.lz"); +static const u32 sPokenavBgDotsTiles[] = INCBIN_U32("graphics/pokenav/bg_dots.4bpp.smol"); +static const u32 sPokenavBgDotsTilemap[] = INCBIN_U32("graphics/pokenav/bg_dots.bin.smolTM"); static const u16 sPokenavDeviceBgPal[] = INCBIN_U16("graphics/pokenav/device_outline.gbapal"); -static const u32 sPokenavDeviceBgTiles[] = INCBIN_U32("graphics/pokenav/device_outline.4bpp.lz"); -static const u32 sPokenavDeviceBgTilemap[] = INCBIN_U32("graphics/pokenav/device_outline_map.bin.lz"); +static const u32 sPokenavDeviceBgTiles[] = INCBIN_U32("graphics/pokenav/device_outline.4bpp.smol"); +static const u32 sPokenavDeviceBgTilemap[] = INCBIN_U32("graphics/pokenav/device_outline_map.bin.smolTM"); static const u16 sMatchCallBlueLightPal[] = INCBIN_U16("graphics/pokenav/blue_light.gbapal"); -static const u32 sMatchCallBlueLightTiles[] = INCBIN_U32("graphics/pokenav/blue_light.4bpp.lz"); +static const u32 sMatchCallBlueLightTiles[] = INCBIN_U32("graphics/pokenav/blue_light.4bpp.smol"); static const u8 gText_NoRibbonWinners[] = _("There are no RIBBON winners."); diff --git a/src/pokenav_region_map.c b/src/pokenav_region_map.c index b17689aad8b6..633ecdb056e5 100755 --- a/src/pokenav_region_map.c +++ b/src/pokenav_region_map.c @@ -44,7 +44,7 @@ struct Pokenav_RegionMapGfx struct CityMapEntry { - u16 mapSecId; + mapsec_u16_t mapSecId; u16 index; const u32 *tilemap; }; @@ -66,8 +66,8 @@ static bool32 IsDma3ManagerBusyWithBgCopy_(struct Pokenav_RegionMapGfx *); static void ChangeBgYForZoom(bool32); static bool32 IsChangeBgYForZoomActive(void); static void CreateCityZoomTextSprites(void); -static void DrawCityMap(struct Pokenav_RegionMapGfx *, int, int); -static void PrintLandmarkNames(struct Pokenav_RegionMapGfx *, int, int); +static void DrawCityMap(struct Pokenav_RegionMapGfx *, mapsec_s32_t, int); +static void PrintLandmarkNames(struct Pokenav_RegionMapGfx *, mapsec_s32_t, int); static void SetCityZoomTextInvisibility(bool32); static void Task_ChangeBgYForZoom(u8 taskId); static void UpdateCityZoomTextPosition(void); @@ -82,7 +82,7 @@ extern const u16 gRegionMapCityZoomTiles_Pal[]; extern const u32 gRegionMapCityZoomText_Gfx[]; static const u16 sMapSecInfoWindow_Pal[] = INCBIN_U16("graphics/pokenav/region_map/info_window.gbapal"); -static const u32 sRegionMapCityZoomTiles_Gfx[] = INCBIN_U32("graphics/pokenav/region_map/zoom_tiles.4bpp.lz"); +static const u32 sRegionMapCityZoomTiles_Gfx[] = INCBIN_U32("graphics/pokenav/region_map/zoom_tiles.4bpp.smol"); #include "data/region_map/city_map_tilemaps.h" @@ -657,14 +657,14 @@ static u32 LoopedTask_DecompressCityMaps(s32 taskState) struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM); if (taskState < NUM_CITY_MAPS) { - LZ77UnCompWram(sPokenavCityMaps[taskState].tilemap, state->cityZoomPics[taskState]); + DecompressDataWithHeaderWram(sPokenavCityMaps[taskState].tilemap, state->cityZoomPics[taskState]); return LT_INC_AND_CONTINUE; } return LT_FINISH; } -static void DrawCityMap(struct Pokenav_RegionMapGfx *state, int mapSecId, int pos) +static void DrawCityMap(struct Pokenav_RegionMapGfx *state, mapsec_s32_t mapSecId, int pos) { int i; for (i = 0; i < NUM_CITY_MAPS && (sPokenavCityMaps[i].mapSecId != mapSecId || sPokenavCityMaps[i].index != pos); i++) @@ -677,7 +677,7 @@ static void DrawCityMap(struct Pokenav_RegionMapGfx *state, int mapSecId, int po CopyToBgTilemapBufferRect(1, state->cityZoomPics[i], 18, 6, 10, 10); } -static void PrintLandmarkNames(struct Pokenav_RegionMapGfx *state, int mapSecId, int pos) +static void PrintLandmarkNames(struct Pokenav_RegionMapGfx *state, mapsec_s32_t mapSecId, int pos) { int i = 0; while (1) diff --git a/src/pokenav_ribbons_list.c b/src/pokenav_ribbons_list.c index 6b4ce428240c..34ea4572751c 100644 --- a/src/pokenav_ribbons_list.c +++ b/src/pokenav_ribbons_list.c @@ -73,8 +73,8 @@ static const LoopedTask sMonRibbonListLoopTaskFuncs[] = }; static const u16 sMonRibbonListFramePal[] = INCBIN_U16("graphics/pokenav/ribbons/list_bg.gbapal"); -static const u32 sMonRibbonListFrameTiles[] = INCBIN_U32("graphics/pokenav/ribbons/list_bg.4bpp.lz"); -static const u32 sMonRibbonListFrameTilemap[] = INCBIN_U32("graphics/pokenav/ribbons/list_bg.bin.lz"); +static const u32 sMonRibbonListFrameTiles[] = INCBIN_U32("graphics/pokenav/ribbons/list_bg.4bpp.smol"); +static const u32 sMonRibbonListFrameTilemap[] = INCBIN_U32("graphics/pokenav/ribbons/list_bg.bin.smolTM"); static const u16 sMonRibbonListUi_Pal[] = INCBIN_U16("graphics/pokenav/ribbons/list_ui.gbapal"); static const struct BgTemplate sMonRibbonListBgTemplates[] = diff --git a/src/pokenav_ribbons_summary.c b/src/pokenav_ribbons_summary.c index 85082c2620dc..1e3d88b2dd4d 100644 --- a/src/pokenav_ribbons_summary.c +++ b/src/pokenav_ribbons_summary.c @@ -152,8 +152,8 @@ static const u16 sRibbonIcons3_Pal[] = INCBIN_U16("graphics/pokenav/ribbons/icon static const u16 sRibbonIcons4_Pal[] = INCBIN_U16("graphics/pokenav/ribbons/icons4.gbapal"); static const u16 sRibbonIcons5_Pal[] = INCBIN_U16("graphics/pokenav/ribbons/icons5.gbapal"); static const u16 sMonInfo_Pal[] = INCBIN_U16("graphics/pokenav/ribbons/mon_info.gbapal"); // palette for PokΓ©mon's name/gender/level text -static const u32 sRibbonIconsSmall_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons/icons.4bpp.lz"); -static const u32 sRibbonIconsBig_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons/icons_big.4bpp.lz"); +static const u32 sRibbonIconsSmall_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons/icons.4bpp.smol"); +static const u32 sRibbonIconsBig_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons/icons_big.4bpp.smol"); static const struct BgTemplate sBgTemplates[] = { @@ -585,7 +585,11 @@ static u32 LoopedTask_OpenRibbonsSummaryMenu(s32 state) DecompressAndCopyTileDataToVram(1, sRibbonIconsSmall_Gfx, 0, 1, 0); SetBgTilemapBuffer(1, menu->tilemapBuffers[1]); FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20); - CopyPaletteIntoBufferUnfaded(sRibbonIcons1_Pal, BG_PLTT_ID(2), 5 * PLTT_SIZE_4BPP); + CopyPaletteIntoBufferUnfaded(sRibbonIcons1_Pal, BG_PLTT_ID(2), PLTT_SIZE_4BPP); + CopyPaletteIntoBufferUnfaded(sRibbonIcons2_Pal, BG_PLTT_ID(3), PLTT_SIZE_4BPP); + CopyPaletteIntoBufferUnfaded(sRibbonIcons3_Pal, BG_PLTT_ID(4), PLTT_SIZE_4BPP); + CopyPaletteIntoBufferUnfaded(sRibbonIcons4_Pal, BG_PLTT_ID(5), PLTT_SIZE_4BPP); + CopyPaletteIntoBufferUnfaded(sRibbonIcons5_Pal, BG_PLTT_ID(6), PLTT_SIZE_4BPP); CopyPaletteIntoBufferUnfaded(sMonInfo_Pal, BG_PLTT_ID(10), sizeof(sMonInfo_Pal)); CopyBgTilemapBufferToVram(1); return LT_INC_AND_PAUSE; diff --git a/src/rayquaza_scene.c b/src/rayquaza_scene.c index 161440bdb3bd..62060128fa48 100644 --- a/src/rayquaza_scene.c +++ b/src/rayquaza_scene.c @@ -5,7 +5,6 @@ #include "task.h" #include "graphics.h" #include "bg.h" -#include "main.h" #include "malloc.h" #include "palette.h" #include "scanline_effect.h" @@ -1287,7 +1286,7 @@ static const struct BgTemplate sBgTemplates_ChasesAway[] = } }; -void DoRayquazaScene(u8 animId, bool8 endEarly, void (*exitCallback)(void)) +void DoRayquazaScene(u8 animId, bool8 endEarly, MainCallback exitCallback) { sRayScene = AllocZeroed(sizeof(*sRayScene)); sRayScene->animId = animId; @@ -1599,9 +1598,9 @@ static void LoadDuoFightSceneGfx(void) DecompressAndCopyTileDataToVram(0, gRaySceneDuoFight_Clouds_Gfx, 0, 0, 0); while (FreeTempTileDataBuffersIfPossible()) ; - LZDecompressWram(gRaySceneDuoFight_Clouds2_Tilemap, sRayScene->tilemapBuffers[0]); - LZDecompressWram(gRaySceneDuoFight_Clouds1_Tilemap, sRayScene->tilemapBuffers[1]); - LZDecompressWram(gRaySceneDuoFight_Clouds3_Tilemap, sRayScene->tilemapBuffers[2]); + DecompressDataWithHeaderWram(gRaySceneDuoFight_Clouds2_Tilemap, sRayScene->tilemapBuffers[0]); + DecompressDataWithHeaderWram(gRaySceneDuoFight_Clouds1_Tilemap, sRayScene->tilemapBuffers[1]); + DecompressDataWithHeaderWram(gRaySceneDuoFight_Clouds3_Tilemap, sRayScene->tilemapBuffers[2]); LoadPalette(gRaySceneDuoFight_Clouds_Pal, BG_PLTT_ID(0), 2 * PLTT_SIZE_4BPP); LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_Groudon); LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_GroudonShoulder); @@ -2039,9 +2038,9 @@ static void LoadTakesFlightSceneGfx(void) DecompressAndCopyTileDataToVram(2, gRaySceneTakesFlight_Rayquaza_Gfx, 0, 0, 0); while (FreeTempTileDataBuffersIfPossible()) ; - LZDecompressWram(gRaySceneDuoFight_Clouds2_Tilemap, sRayScene->tilemapBuffers[0]); - LZDecompressWram(gRaySceneTakesFlight_Bg_Tilemap, sRayScene->tilemapBuffers[1]); - LZDecompressWram(gRaySceneTakesFlight_Rayquaza_Tilemap, sRayScene->tilemapBuffers[2]); + DecompressDataWithHeaderWram(gRaySceneDuoFight_Clouds2_Tilemap, sRayScene->tilemapBuffers[0]); + DecompressDataWithHeaderWram(gRaySceneTakesFlight_Bg_Tilemap, sRayScene->tilemapBuffers[1]); + DecompressDataWithHeaderWram(gRaySceneTakesFlight_Rayquaza_Tilemap, sRayScene->tilemapBuffers[2]); LoadPalette(gRaySceneTakesFlight_Rayquaza_Pal, BG_PLTT_ID(0), 2 * PLTT_SIZE_4BPP); LoadCompressedSpriteSheet(&sSpriteSheet_TakesFlight_Smoke); LoadSpritePalette(&sSpritePal_TakesFlight_Smoke); @@ -2242,8 +2241,8 @@ static void LoadDescendsSceneGfx(void) DecompressAndCopyTileDataToVram(1, gRaySceneDescends_Bg_Gfx, 0, 0, 0); while (FreeTempTileDataBuffersIfPossible()) ; - LZDecompressWram(gRaySceneDescends_Light_Tilemap, sRayScene->tilemapBuffers[0]); - LZDecompressWram(gRaySceneDescends_Bg_Tilemap, sRayScene->tilemapBuffers[3]); + DecompressDataWithHeaderWram(gRaySceneDescends_Light_Tilemap, sRayScene->tilemapBuffers[0]); + DecompressDataWithHeaderWram(gRaySceneDescends_Bg_Tilemap, sRayScene->tilemapBuffers[3]); CpuFastFill16(0, sRayScene->tilemapBuffers[2], BG_SCREEN_SIZE); CpuFastCopy(sRayScene->tilemapBuffers[3], sRayScene->tilemapBuffers[1], BG_SCREEN_SIZE); CpuFastFill16(0, &sRayScene->tilemapBuffers[1][0x100], 0x340); @@ -2493,10 +2492,10 @@ static void LoadChargesSceneGfx(void) DecompressAndCopyTileDataToVram(3, gRaySceneCharges_Bg_Gfx, 0, 0, 0); while (FreeTempTileDataBuffersIfPossible()) ; - LZDecompressWram(gRaySceneCharges_Orbs_Tilemap, sRayScene->tilemapBuffers[0]); - LZDecompressWram(gRaySceneCharges_Rayquaza_Tilemap, sRayScene->tilemapBuffers[1]); - LZDecompressWram(gRaySceneCharges_Streaks_Tilemap, sRayScene->tilemapBuffers[2]); - LZDecompressWram(gRaySceneCharges_Bg_Tilemap, sRayScene->tilemapBuffers[3]); + DecompressDataWithHeaderWram(gRaySceneCharges_Orbs_Tilemap, sRayScene->tilemapBuffers[0]); + DecompressDataWithHeaderWram(gRaySceneCharges_Rayquaza_Tilemap, sRayScene->tilemapBuffers[1]); + DecompressDataWithHeaderWram(gRaySceneCharges_Streaks_Tilemap, sRayScene->tilemapBuffers[2]); + DecompressDataWithHeaderWram(gRaySceneCharges_Bg_Tilemap, sRayScene->tilemapBuffers[3]); LoadPalette(gRaySceneCharges_Bg_Pal, BG_PLTT_ID(0), 4 * PLTT_SIZE_4BPP); } @@ -2678,9 +2677,9 @@ static void LoadChasesAwaySceneGfx(void) DecompressAndCopyTileDataToVram(0, gRaySceneChasesAway_Light_Gfx, 0, 0, 0); while (FreeTempTileDataBuffersIfPossible()) ; - LZDecompressWram(gRaySceneChasesAway_Bg_Tilemap, sRayScene->tilemapBuffers[1]); - LZDecompressWram(gRaySceneChasesAway_Light_Tilemap, sRayScene->tilemapBuffers[0]); - LZDecompressWram(gRaySceneChasesAway_Ring_Tilemap, sRayScene->tilemapBuffers[2]); + DecompressDataWithHeaderWram(gRaySceneChasesAway_Bg_Tilemap, sRayScene->tilemapBuffers[1]); + DecompressDataWithHeaderWram(gRaySceneChasesAway_Light_Tilemap, sRayScene->tilemapBuffers[0]); + DecompressDataWithHeaderWram(gRaySceneChasesAway_Ring_Tilemap, sRayScene->tilemapBuffers[2]); LoadPalette(gRaySceneChasesAway_Bg_Pal, BG_PLTT_ID(0), 3 * PLTT_SIZE_4BPP); LoadCompressedSpriteSheet(&sSpriteSheet_ChasesAway_Groudon); LoadCompressedSpriteSheet(&sSpriteSheet_ChasesAway_GroudonTail); diff --git a/src/record_mixing.c b/src/record_mixing.c index 1ff36d1fe850..087ca2e70e1b 100644 --- a/src/record_mixing.c +++ b/src/record_mixing.c @@ -961,7 +961,7 @@ static void ReceiveDaycareMailData(struct RecordMixingDaycareMail *records, size static void ReceiveGiftItem(u16 *item, u8 multiplayerId) { - if (multiplayerId != 0 && *item != ITEM_NONE && GetPocketByItemId(*item) == POCKET_KEY_ITEMS) + if (multiplayerId != 0 && *item != ITEM_NONE && GetItemPocket(*item) == POCKET_KEY_ITEMS) { if (!CheckBagHasItem(*item, 1) && !CheckPCHasItem(*item, 1) && AddBagItem(*item, 1)) { diff --git a/src/recorded_battle.c b/src/recorded_battle.c index 52f9be63b5bb..5b61a8b4dd7c 100644 --- a/src/recorded_battle.c +++ b/src/recorded_battle.c @@ -49,7 +49,7 @@ EWRAM_DATA static u8 sFrontierPassFlag = 0; EWRAM_DATA static u8 sBattleScene = 0; EWRAM_DATA static u8 sTextSpeed = 0; EWRAM_DATA static u32 sBattleFlags = 0; -EWRAM_DATA static u64 sAI_Scripts = 0; +EWRAM_DATA static u64 sAI_Scripts[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA static struct Pokemon sSavedPlayerParty[PARTY_SIZE] = {0}; EWRAM_DATA static struct Pokemon sSavedOpponentParty[PARTY_SIZE] = {0}; EWRAM_DATA static u16 sPlayerMonMoves[MAX_BATTLERS_COUNT / 2][MAX_MON_MOVES] = {0}; @@ -87,7 +87,7 @@ void RecordedBattle_Init(u8 mode) for (j = 0; j < BATTLER_RECORD_SIZE; j++) sBattleRecords[i][j] = 0xFF; sBattleFlags = gBattleTypeFlags; - sAI_Scripts = gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT]; + sAI_Scripts[i] = gAiThinkingStruct->aiFlags[i]; } } } @@ -312,6 +312,7 @@ bool32 MoveRecordedBattleToSaveData(void) battleSave->playersLanguage[i] = sPlayers[i].language; battleSave->playersBattlers[i] = sPlayers[i].battler; battleSave->playersTrainerId[i] = sPlayers[i].trainerId; + battleSave->AI_scripts[i] = sAI_Scripts[i]; } battleSave->rngSeed = gRecordedBattleRngSeed; @@ -358,7 +359,6 @@ bool32 MoveRecordedBattleToSaveData(void) battleSave->frontierBrainSymbol = sFrontierBrainSymbol; battleSave->battleScene = gSaveBlock2Ptr->optionsBattleSceneOff; battleSave->textSpeed = gSaveBlock2Ptr->optionsTextSpeed; - battleSave->AI_scripts = sAI_Scripts; if (TRAINER_BATTLE_PARAM.opponentA >= TRAINER_RECORD_MIXING_FRIEND && TRAINER_BATTLE_PARAM.opponentA < TRAINER_RECORD_MIXING_APPRENTICE) { @@ -523,6 +523,7 @@ void SetVariablesForRecordedBattle(struct RecordedBattleSave *src) gLinkPlayers[i].language = src->playersLanguage[i]; gLinkPlayers[i].id = src->playersBattlers[i]; gLinkPlayers[i].trainerId = src->playersTrainerId[i]; + sAI_Scripts[i] = src->AI_scripts[i]; if (var) ConvertInternationalString(gLinkPlayers[i].name, gLinkPlayers[i].language); @@ -539,7 +540,6 @@ void SetVariablesForRecordedBattle(struct RecordedBattleSave *src) sFrontierBrainSymbol = src->frontierBrainSymbol; sBattleScene = src->battleScene; sTextSpeed = src->textSpeed; - sAI_Scripts = src->AI_scripts; for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++) sRecordMixFriendName[i] = src->recordMixFriendName[i]; @@ -756,38 +756,39 @@ void RecordedBattle_CheckMovesetChanges(u8 mode) gDisableStructs[battler].mimickedMoves |= mimickedMoveSlots[j] << j; } - if (!(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) + if (!(gBattleMons[battler].volatiles.transformed)) { + struct Pokemon *mon = GetBattlerMon(battler); for (j = 0; j < MAX_MON_MOVES; j++) - ppBonuses[j] = (GetMonData(GetBattlerMon(battler), MON_DATA_PP_BONUSES, NULL) & ((3 << (j << 1)))) >> (j << 1); + ppBonuses[j] = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & ((3 << (j << 1)))) >> (j << 1); for (j = 0; j < MAX_MON_MOVES; j++) { - movePp.moves[j] = GetMonData(GetBattlerMon(battler), MON_DATA_MOVE1 + moveSlots[j], NULL); - movePp.currentPp[j] = GetMonData(GetBattlerMon(battler), MON_DATA_PP1 + moveSlots[j], NULL); + movePp.moves[j] = GetMonData(mon, MON_DATA_MOVE1 + moveSlots[j], NULL); + movePp.currentPp[j] = GetMonData(mon, MON_DATA_PP1 + moveSlots[j], NULL); movePp.maxPp[j] = ppBonuses[moveSlots[j]]; } for (j = 0; j < MAX_MON_MOVES; j++) { - SetMonData(GetBattlerMon(battler), MON_DATA_MOVE1 + j, &movePp.moves[j]); - SetMonData(GetBattlerMon(battler), MON_DATA_PP1 + j, &movePp.currentPp[j]); + SetMonData(mon, MON_DATA_MOVE1 + j, &movePp.moves[j]); + SetMonData(mon, MON_DATA_PP1 + j, &movePp.currentPp[j]); } ppBonusSet = 0; for (j = 0; j < MAX_MON_MOVES; j++) ppBonusSet |= movePp.maxPp[j] << (j << 1); - SetMonData(GetBattlerMon(battler), MON_DATA_PP_BONUSES, &ppBonusSet); + SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonusSet); } - gChosenMoveByBattler[battler] = gBattleMons[battler].moves[gBattleStruct->chosenMovePositions[battler]]; + gChosenMoveByBattler[battler] = GetChosenMoveFromPosition(battler); } } } } } -u64 GetAiScriptsInRecordedBattle(void) +u64 GetAiScriptsInRecordedBattle(u32 battler) { - return sAI_Scripts; + return sAI_Scripts[battler]; } // Used to determine when the player is allowed to press B to end a recorded battle's playback diff --git a/src/region_map.c b/src/region_map.c index be033f8e477a..889f38533acc 100644 --- a/src/region_map.c +++ b/src/region_map.c @@ -20,11 +20,11 @@ #include "field_specials.h" #include "fldeff.h" #include "region_map.h" +#include "decompress.h" #include "constants/region_map_sections.h" #include "heal_location.h" #include "constants/field_specials.h" #include "constants/heal_locations.h" -#include "constants/map_types.h" #include "constants/rgb.h" #include "constants/weather.h" @@ -63,7 +63,7 @@ enum { struct MultiNameFlyDest { const u8 *const *name; - u16 mapSecId; + mapsec_u16_t mapSecId; u16 flag; }; @@ -72,7 +72,7 @@ static EWRAM_DATA struct RegionMap *sRegionMap = NULL; static EWRAM_DATA struct { void (*callback)(void); u16 state; - u16 mapSecId; + mapsec_u16_t mapSecId; struct RegionMap regionMap; u8 tileBuffer[0x1c0]; u8 nameBuffer[0x26]; // never read @@ -86,15 +86,15 @@ static u8 MoveRegionMapCursor_Full(void); static u8 ProcessRegionMapInput_Zoomed(void); static u8 MoveRegionMapCursor_Zoomed(void); static void CalcZoomScrollParams(s16 scrollX, s16 scrollY, s16 c, s16 d, u16 e, u16 f, u8 rotation); -static u16 GetMapSecIdAt(u16 x, u16 y); +static mapsec_u16_t GetMapSecIdAt(u16 x, u16 y); static void RegionMap_SetBG2XAndBG2Y(s16 x, s16 y); static void InitMapBasedOnPlayerLocation(void); static void RegionMap_InitializeStateBasedOnSSTidalLocation(void); -static u8 GetMapsecType(u16 mapSecId); -static u16 CorrectSpecialMapSecId_Internal(u16 mapSecId); -static u16 GetTerraOrMarineCaveMapSecId(void); +static u8 GetMapsecType(mapsec_u16_t mapSecId); +static mapsec_u16_t CorrectSpecialMapSecId_Internal(mapsec_u16_t mapSecId); +static mapsec_u16_t GetTerraOrMarineCaveMapSecId(void); static void GetMarineCaveCoords(u16 *x, u16 *y); -static bool32 IsPlayerInAquaHideout(u8 mapSecId); +static bool32 IsPlayerInAquaHideout(mapsec_u8_t mapSecId); static void GetPositionOfCursorWithinMapSec(void); static bool8 RegionMap_IsMapSecIdInNextRow(u16 y); static void SpriteCB_CursorMapFull(struct Sprite *sprite); @@ -117,11 +117,11 @@ static void CB_HandleFlyMapInput(void); static void CB_ExitFlyMap(void); static const u16 sRegionMapCursorPal[] = INCBIN_U16("graphics/pokenav/region_map/cursor.gbapal"); -static const u32 sRegionMapCursorSmallGfxLZ[] = INCBIN_U32("graphics/pokenav/region_map/cursor_small.4bpp.lz"); -static const u32 sRegionMapCursorLargeGfxLZ[] = INCBIN_U32("graphics/pokenav/region_map/cursor_large.4bpp.lz"); +static const u32 sRegionMapCursorSmallGfxLZ[] = INCBIN_U32("graphics/pokenav/region_map/cursor_small.4bpp.smol"); +static const u32 sRegionMapCursorLargeGfxLZ[] = INCBIN_U32("graphics/pokenav/region_map/cursor_large.4bpp.smol"); static const u16 sRegionMapBg_Pal[] = INCBIN_U16("graphics/pokenav/region_map/map.gbapal"); -static const u32 sRegionMapBg_GfxLZ[] = INCBIN_U32("graphics/pokenav/region_map/map.8bpp.lz"); -static const u32 sRegionMapBg_TilemapLZ[] = INCBIN_U32("graphics/pokenav/region_map/map.bin.lz"); +static const u32 sRegionMapBg_GfxLZ[] = INCBIN_U32("graphics/pokenav/region_map/map.8bpp.smol"); +static const u32 sRegionMapBg_TilemapLZ[] = INCBIN_U32("graphics/pokenav/region_map/map.bin.smolTM"); static const u16 sRegionMapPlayerIcon_BrendanPal[] = INCBIN_U16("graphics/pokenav/region_map/brendan_icon.gbapal"); static const u8 sRegionMapPlayerIcon_BrendanGfx[] = INCBIN_U8("graphics/pokenav/region_map/brendan_icon.4bpp"); static const u16 sRegionMapPlayerIcon_MayPal[] = INCBIN_U16("graphics/pokenav/region_map/may_icon.gbapal"); @@ -130,7 +130,7 @@ static const u8 sRegionMapPlayerIcon_MayGfx[] = INCBIN_U8("graphics/pokenav/regi #include "data/region_map/region_map_layout.h" #include "data/region_map/region_map_entries.h" -static const u16 sRegionMap_SpecialPlaceLocations[][2] = +static const mapsec_u16_t sRegionMap_SpecialPlaceLocations[][2] = { {MAPSEC_UNDERWATER_105, MAPSEC_ROUTE_105}, {MAPSEC_UNDERWATER_124, MAPSEC_ROUTE_124}, @@ -162,14 +162,14 @@ static const u16 sRegionMap_SpecialPlaceLocations[][2] = {MAPSEC_NONE, MAPSEC_NONE} }; -static const u16 sMarineCaveMapSecIds[] = +static const mapsec_u16_t sMarineCaveMapSecIds[] = { MAPSEC_MARINE_CAVE, MAPSEC_UNDERWATER_MARINE_CAVE, MAPSEC_UNDERWATER_MARINE_CAVE }; -static const u16 sTerraOrMarineCaveMapSecIds[ABNORMAL_WEATHER_LOCATIONS] = +static const mapsec_u16_t sTerraOrMarineCaveMapSecIds[ABNORMAL_WEATHER_LOCATIONS] = { [ABNORMAL_WEATHER_ROUTE_114_NORTH - 1] = MAPSEC_ROUTE_114, [ABNORMAL_WEATHER_ROUTE_114_SOUTH - 1] = MAPSEC_ROUTE_114, @@ -203,7 +203,7 @@ static const struct UCoords16 sMarineCaveLocationCoords[MARINE_CAVE_LOCATIONS] = [MARINE_CAVE_COORD(ROUTE_129_EAST)] = {24, 10} }; -static const u8 sMapSecAquaHideoutOld[] = +static const mapsec_u8_t sMapSecAquaHideoutOld[] = { MAPSEC_AQUA_HIDEOUT_OLD }; @@ -273,7 +273,7 @@ static const union AnimCmd *const sRegionMapPlayerIconAnimTable[] = }; // Event islands that don't appear on map. (Southern Island does) -static const u8 sMapSecIdsOffMap[] = +static const mapsec_u8_t sMapSecIdsOffMap[] = { MAPSEC_BIRTH_ISLAND, MAPSEC_FARAWAY_ISLAND, @@ -281,10 +281,10 @@ static const u8 sMapSecIdsOffMap[] = }; static const u16 sRegionMapFramePal[] = INCBIN_U16("graphics/pokenav/region_map/frame.gbapal"); -static const u32 sRegionMapFrameGfxLZ[] = INCBIN_U32("graphics/pokenav/region_map/frame.4bpp.lz"); -static const u32 sRegionMapFrameTilemapLZ[] = INCBIN_U32("graphics/pokenav/region_map/frame.bin.lz"); +static const u32 sRegionMapFrameGfxLZ[] = INCBIN_U32("graphics/pokenav/region_map/frame.4bpp.smol"); +static const u32 sRegionMapFrameTilemapLZ[] = INCBIN_U32("graphics/pokenav/region_map/frame.bin.smolTM"); static const u16 sFlyTargetIcons_Pal[] = INCBIN_U16("graphics/pokenav/region_map/fly_target_icons.gbapal"); -static const u32 sFlyTargetIcons_Gfx[] = INCBIN_U32("graphics/pokenav/region_map/fly_target_icons.4bpp.lz"); +static const u32 sFlyTargetIcons_Gfx[] = INCBIN_U32("graphics/pokenav/region_map/fly_target_icons.4bpp.smol"); static const u8 sMapHealLocations[][3] = { @@ -421,7 +421,7 @@ static const struct SpritePalette sFlyTargetIconsSpritePalette = .tag = TAG_FLY_ICON }; -static const u16 sRedOutlineFlyDestinations[][2] = +static const mapsec_u16_t sRedOutlineFlyDestinations[][2] = { { FLAG_LANDMARK_BATTLE_FRONTIER, @@ -549,7 +549,7 @@ bool8 LoadRegionMapGfx(void) if (sRegionMap->bgManaged) DecompressAndCopyTileDataToVram(sRegionMap->bgNum, sRegionMapBg_GfxLZ, 0, 0, 0); else - LZ77UnCompVram(sRegionMapBg_GfxLZ, (u16 *)BG_CHAR_ADDR(2)); + DecompressDataWithHeaderVram(sRegionMapBg_GfxLZ, (u16 *)BG_CHAR_ADDR(2)); break; case 1: if (sRegionMap->bgManaged) @@ -559,7 +559,7 @@ bool8 LoadRegionMapGfx(void) } else { - LZ77UnCompVram(sRegionMapBg_TilemapLZ, (u16 *)BG_SCREEN_ADDR(28)); + DecompressDataWithHeaderVram(sRegionMapBg_TilemapLZ, (u16 *)BG_SCREEN_ADDR(28)); } break; case 2: @@ -567,10 +567,10 @@ bool8 LoadRegionMapGfx(void) LoadPalette(sRegionMapBg_Pal, BG_PLTT_ID(7), 3 * PLTT_SIZE_4BPP); break; case 3: - LZ77UnCompWram(sRegionMapCursorSmallGfxLZ, sRegionMap->cursorSmallImage); + DecompressDataWithHeaderWram(sRegionMapCursorSmallGfxLZ, sRegionMap->cursorSmallImage); break; case 4: - LZ77UnCompWram(sRegionMapCursorLargeGfxLZ, sRegionMap->cursorLargeImage); + DecompressDataWithHeaderWram(sRegionMapCursorLargeGfxLZ, sRegionMap->cursorLargeImage); break; case 5: InitMapBasedOnPlayerLocation(); @@ -694,7 +694,7 @@ static u8 ProcessRegionMapInput_Full(void) static u8 MoveRegionMapCursor_Full(void) { - u16 mapSecId; + mapsec_u16_t mapSecId; if (sRegionMap->cursorMovementFrameCounter != 0) return MAP_INPUT_MOVE_CONT; @@ -779,7 +779,7 @@ static u8 MoveRegionMapCursor_Zoomed(void) { u16 x; u16 y; - u16 mapSecId; + mapsec_u16_t mapSecId; sRegionMap->scrollY += sRegionMap->zoomedCursorDeltaY; sRegionMap->scrollX += sRegionMap->zoomedCursorDeltaX; @@ -962,7 +962,7 @@ void PokedexAreaScreen_UpdateRegionMapVariablesAndVideoRegs(s16 x, s16 y) } } -static u16 GetMapSecIdAt(u16 x, u16 y) +static mapsec_u16_t GetMapSecIdAt(u16 x, u16 y) { if (y < MAPCURSOR_Y_MIN || y > MAPCURSOR_Y_MAX || x < MAPCURSOR_X_MIN || x > MAPCURSOR_X_MAX) { @@ -1180,7 +1180,7 @@ static void RegionMap_InitializeStateBasedOnSSTidalLocation(void) sRegionMap->cursorPosY = gRegionMapEntries[sRegionMap->mapSecId].y + y + MAPCURSOR_Y_MIN; } -static u8 GetMapsecType(u16 mapSecId) +static u8 GetMapsecType(mapsec_u16_t mapSecId) { switch (mapSecId) { @@ -1227,12 +1227,12 @@ static u8 GetMapsecType(u16 mapSecId) } } -u16 GetRegionMapSecIdAt(u16 x, u16 y) +mapsec_u16_t GetRegionMapSecIdAt(u16 x, u16 y) { return GetMapSecIdAt(x, y); } -static u16 CorrectSpecialMapSecId_Internal(u16 mapSecId) +static mapsec_u16_t CorrectSpecialMapSecId_Internal(mapsec_u16_t mapSecId) { u32 i; @@ -1253,7 +1253,7 @@ static u16 CorrectSpecialMapSecId_Internal(u16 mapSecId) return mapSecId; } -static u16 GetTerraOrMarineCaveMapSecId(void) +static mapsec_u16_t GetTerraOrMarineCaveMapSecId(void) { s16 idx; @@ -1282,7 +1282,7 @@ static void GetMarineCaveCoords(u16 *x, u16 *y) // Probably meant to be an "IsPlayerInIndoorDungeon" function, but in practice it only has the one mapsec // Additionally, because the mapsec doesnt exist in Emerald, this function always returns FALSE -static bool32 IsPlayerInAquaHideout(u8 mapSecId) +static bool32 IsPlayerInAquaHideout(mapsec_u8_t mapSecId) { u32 i; @@ -1294,7 +1294,7 @@ static bool32 IsPlayerInAquaHideout(u8 mapSecId) return FALSE; } -u16 CorrectSpecialMapSecId(u16 mapSecId) +mapsec_u16_t CorrectSpecialMapSecId(mapsec_u16_t mapSecId) { return CorrectSpecialMapSecId_Internal(mapSecId); } @@ -1573,7 +1573,7 @@ void TrySetPlayerIconBlink(void) #undef sVisible #undef sTimer -u8 *GetMapName(u8 *dest, u16 regionMapId, u16 padLength) +u8 *GetMapName(u8 *dest, mapsec_u16_t regionMapId, u16 padLength) { u8 *str; u16 i; @@ -1606,7 +1606,7 @@ u8 *GetMapName(u8 *dest, u16 regionMapId, u16 padLength) } // TODO: probably needs a better name -u8 *GetMapNameGeneric(u8 *dest, u16 mapSecId) +u8 *GetMapNameGeneric(u8 *dest, mapsec_u16_t mapSecId) { switch (mapSecId) { @@ -1619,7 +1619,7 @@ u8 *GetMapNameGeneric(u8 *dest, u16 mapSecId) } } -u8 *GetMapNameHandleAquaHideout(u8 *dest, u16 mapSecId) +u8 *GetMapNameHandleAquaHideout(u8 *dest, mapsec_u16_t mapSecId) { if (mapSecId == MAPSEC_AQUA_HIDEOUT_OLD) return StringCopy(dest, gText_Hideout); @@ -1627,7 +1627,7 @@ u8 *GetMapNameHandleAquaHideout(u8 *dest, u16 mapSecId) return GetMapNameGeneric(dest, mapSecId); } -static void GetMapSecDimensions(u16 mapSecId, u16 *x, u16 *y, u16 *width, u16 *height) +static void GetMapSecDimensions(mapsec_u16_t mapSecId, u16 *x, u16 *y, u16 *width, u16 *height) { *x = gRegionMapEntries[mapSecId].x; *y = gRegionMapEntries[mapSecId].y; @@ -1640,7 +1640,7 @@ bool8 IsRegionMapZoomed(void) return sRegionMap->zoomed; } -bool32 IsEventIslandMapSecId(u8 mapSecId) +bool32 IsEventIslandMapSecId(mapsec_u8_t mapSecId) { u32 i; @@ -1707,11 +1707,11 @@ void CB2_OpenFlyMap(void) gMain.state++; break; case 5: - LZ77UnCompVram(sRegionMapFrameGfxLZ, (u16 *)BG_CHAR_ADDR(3)); + DecompressDataWithHeaderVram(sRegionMapFrameGfxLZ, (u16 *)BG_CHAR_ADDR(3)); gMain.state++; break; case 6: - LZ77UnCompVram(sRegionMapFrameTilemapLZ, (u16 *)BG_SCREEN_ADDR(30)); + DecompressDataWithHeaderVram(sRegionMapFrameTilemapLZ, (u16 *)BG_SCREEN_ADDR(30)); gMain.state++; break; case 7: @@ -1830,7 +1830,7 @@ static void LoadFlyDestIcons(void) { struct SpriteSheet sheet; - LZ77UnCompWram(sFlyTargetIcons_Gfx, sFlyMap->tileBuffer); + DecompressDataWithHeaderWram(sFlyTargetIcons_Gfx, sFlyMap->tileBuffer); sheet.data = sFlyMap->tileBuffer; sheet.size = sizeof(sFlyMap->tileBuffer); sheet.tag = TAG_FLY_ICON; @@ -1847,7 +1847,7 @@ static void LoadFlyDestIcons(void) static void CreateFlyDestIcons(void) { u16 canFlyFlag; - u16 mapSecId; + mapsec_u16_t mapSecId; u16 x; u16 y; u16 width; @@ -1895,7 +1895,7 @@ static void TryCreateRedOutlineFlyDestIcons(void) u16 y; u16 width; u16 height; - u16 mapSecId; + mapsec_u16_t mapSecId; u8 spriteId; for (i = 0; sRedOutlineFlyDestinations[i][1] != MAPSEC_NONE; i++) diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c index d46ef692cce6..d56f910dda1a 100644 --- a/src/reshow_battle_screen.c +++ b/src/reshow_battle_screen.c @@ -237,7 +237,7 @@ static void CB2_ReshowBlankBattleScreenAfterMenu(void) gBattleScripting.reshowMainState--; break; case 10: - if (gBattleScripting.monCaught) + if (gBattleScripting.monCaught) CreateCaughtMonSprite(); // displays the caught mon for the switch into party feature break; default: @@ -302,17 +302,19 @@ void CreateBattlerSprite(u32 battler) if (!IsOnPlayerSide(battler)) { - if (GetMonData(GetBattlerMon(battler), MON_DATA_HP) == 0) + struct Pokemon *mon = GetBattlerMon(battler); + if (GetMonData(mon, MON_DATA_HP) == 0) return; if (gBattleScripting.monCaught) // Don't create opponent sprite if it has been caught. return; + u32 species = GetMonData(mon, MON_DATA_SPECIES); - SetMultiuseSpriteTemplateToPokemon(GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES), GetBattlerPosition(battler)); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battler)); gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2), posY, GetBattlerSpriteSubpriority(battler)); gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; gSprites[gBattlerSpriteIds[battler]].data[0] = battler; - gSprites[gBattlerSpriteIds[battler]].data[2] = GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES); + gSprites[gBattlerSpriteIds[battler]].data[2] = species; StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 0); } @@ -322,7 +324,7 @@ void CreateBattlerSprite(u32 battler) gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, 0x50, (8 - gTrainerBacksprites[gSaveBlock2Ptr->playerGender].coordinates.size) * 4 + 80, GetBattlerSpriteSubpriority(0)); - gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; + gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = (8 + battler / 2); gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; gSprites[gBattlerSpriteIds[battler]].data[0] = battler; } @@ -332,21 +334,23 @@ void CreateBattlerSprite(u32 battler) gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, 0x50, (8 - gTrainerBacksprites[TRAINER_BACK_PIC_WALLY].coordinates.size) * 4 + 80, GetBattlerSpriteSubpriority(0)); - gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; + gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = (8 + battler / 2); gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; gSprites[gBattlerSpriteIds[battler]].data[0] = battler; } else { - if (!IsValidForBattle(GetBattlerMon(battler))) + struct Pokemon *mon = GetBattlerMon(battler); + if (!IsValidForBattle(mon)) return; + u32 species = GetMonData(mon, MON_DATA_SPECIES); - SetMultiuseSpriteTemplateToPokemon(GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES), GetBattlerPosition(battler)); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battler)); gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2), posY, GetBattlerSpriteSubpriority(battler)); gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; gSprites[gBattlerSpriteIds[battler]].data[0] = battler; - gSprites[gBattlerSpriteIds[battler]].data[2] = GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES); + gSprites[gBattlerSpriteIds[battler]].data[2] = species; StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 0); } diff --git a/src/rom_header.s b/src/rom_header.s index 5ced627a392e..eed3c53c6365 100644 --- a/src/rom_header.s +++ b/src/rom_header.s @@ -7,34 +7,34 @@ Start:: RomHeaderNintendoLogo:: .space 156 -RomHeaderGameTitle: +RomHeaderGameTitle:: .space 12 RomHeaderGameCode:: .space 4 -RomHeaderMakerCode: +RomHeaderMakerCode:: .space 2 -RomHeaderMagic: +RomHeaderMagic:: .byte 0 -RomHeaderMainUnitCode: +RomHeaderMainUnitCode:: .byte 0 -RomHeaderDeviceType: +RomHeaderDeviceType:: .byte 0 -RomHeaderReserved1: +RomHeaderReserved1:: .space 7 RomHeaderSoftwareVersion:: .byte 0 -RomHeaderChecksum: +RomHeaderChecksum:: .byte 0 -RomHeaderReserved2: +RomHeaderReserved2:: .space 2 .word 0 diff --git a/src/rom_header_gf.c b/src/rom_header_gf.c index 5613fe615273..16628503526d 100644 --- a/src/rom_header_gf.c +++ b/src/rom_header_gf.c @@ -97,9 +97,8 @@ struct GFRomHeader }; // This seems to need to be in the text section for some reason. -// To avoid a changed section attributes warning it's put in a special .text.consts section. -__attribute__((section(".text.consts"))) -USED static const struct GFRomHeader sGFRomHeader = { +// To avoid a changed section attributes warning it's put in a special .text.header_gf section. +__attribute__((section(".text.header_gf"))) USED static const struct GFRomHeader sGFRomHeader = { .version = GAME_VERSION, .language = GAME_LANGUAGE, .gameName = "pokemon emerald version", diff --git a/src/rom_header_rhh.c b/src/rom_header_rhh.c index e9310415c3e5..3a88a2c41393 100644 --- a/src/rom_header_rhh.c +++ b/src/rom_header_rhh.c @@ -21,14 +21,13 @@ struct RHHRomHeader /*0x0A*/ u16 movesCount; /*0x0C*/ u16 numSpecies; /*0x0E*/ u16 abilitiesCount; - /*0x10*/ const struct Ability *abilities; + /*0x10*/ const struct AbilityInfo *abilities; /*0x14*/ u16 itemsCount; /*0x16*/ u8 itemNameLength; /*0x17*/ u8 padding; }; -__attribute__((section(".text.consts"))) -USED static const struct RHHRomHeader sRHHRomHeader = +__attribute__((section(".text.header_rhh"))) USED static const struct RHHRomHeader sRHHRomHeader = { .rhh_magic = { 'R', 'H', 'H', 'E', 'X', 'P' }, .expansionVersionMajor = EXPANSION_VERSION_MAJOR, diff --git a/src/roulette.c b/src/roulette.c index c72b1b78766b..4bea3b6852ca 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -417,8 +417,8 @@ static void SpriteCB_Shroomish(struct Sprite *); static void SpriteCB_Taillow(struct Sprite *); static const u16 sWheel_Pal[] = INCBIN_U16("graphics/roulette/wheel.gbapal"); // also palette for grid -static const u32 sGrid_Tilemap[] = INCBIN_U32("graphics/roulette/grid.bin.lz"); -static const u32 sWheel_Tilemap[] = INCBIN_U32("graphics/roulette/wheel.bin.lz"); +static const u32 sGrid_Tilemap[] = INCBIN_U32("graphics/roulette/grid.bin.smolTM"); +static const u32 sWheel_Tilemap[] = INCBIN_U32("graphics/roulette/wheel.bin.smolTM"); static const struct BgTemplate sBgTemplates[] = { // Text box @@ -2339,13 +2339,13 @@ static const u16 sUnused1_Pal[] = INCBIN_U16("graphics/roulette/unused_1.gbapal" static const u16 sUnused2_Pal[] = INCBIN_U16("graphics/roulette/unused_2.gbapal"); static const u16 sUnused3_Pal[] = INCBIN_U16("graphics/roulette/unused_3.gbapal"); static const u16 sUnused4_Pal[] = INCBIN_U16("graphics/roulette/unused_4.gbapal"); -static const u32 sBall_Gfx[] = INCBIN_U32("graphics/roulette/ball.4bpp.lz"); -static const u32 sBallCounter_Gfx[] = INCBIN_U32("graphics/roulette/ball_counter.4bpp.lz"); -static const u32 sShroomishTaillow_Gfx[] = INCBIN_U32("graphics/roulette/roulette_tilt.4bpp.lz"); -static const u32 sGridIcons_Gfx[] = INCBIN_U32("graphics/roulette/grid_icons.4bpp.lz"); -static const u32 sWheelIcons_Gfx[] = INCBIN_U32("graphics/roulette/wheel_icons.4bpp.lz"); -static const u32 sShadow_Gfx[] = INCBIN_U32("graphics/roulette/shadow.4bpp.lz"); -static const u32 sCursor_Gfx[] = INCBIN_U32("graphics/roulette/cursor.4bpp.lz"); +static const u32 sBall_Gfx[] = INCBIN_U32("graphics/roulette/ball.4bpp.smol"); +static const u32 sBallCounter_Gfx[] = INCBIN_U32("graphics/roulette/ball_counter.4bpp.smol"); +static const u32 sShroomishTaillow_Gfx[] = INCBIN_U32("graphics/roulette/roulette_tilt.4bpp.smol"); +static const u32 sGridIcons_Gfx[] = INCBIN_U32("graphics/roulette/grid_icons.4bpp.smol"); +static const u32 sWheelIcons_Gfx[] = INCBIN_U32("graphics/roulette/wheel_icons.4bpp.smol"); +static const u32 sShadow_Gfx[] = INCBIN_U32("graphics/roulette/shadow.4bpp.smol"); +static const u32 sCursor_Gfx[] = INCBIN_U32("graphics/roulette/cursor.4bpp.smol"); static const struct SpritePalette sSpritePalettes[] = { @@ -3833,9 +3833,7 @@ static void SpriteCB_GridSquare(struct Sprite *sprite) static void CreateWheelCenterSprite(void) { u8 spriteId; - LoadCompressedSpriteSheet(&sSpriteSheet_WheelCenter); - // This sprite id isn't saved because it doesn't need to be referenced again // but by virtue of creation order it's SPR_WHEEL_CENTER spriteId = CreateSprite(&sSpriteTemplate_WheelCenter, 116, 80, 81); diff --git a/src/rtc.c b/src/rtc.c index 34f84183cf36..555c86b87ed7 100644 --- a/src/rtc.c +++ b/src/rtc.c @@ -334,7 +334,8 @@ enum TimeOfDay GetTimeOfDay(void) enum TimeOfDay GetTimeOfDayForDex(void) { - return OW_TIME_OF_DAY_ENCOUNTERS ? GetTimeOfDay() : TIME_OF_DAY_DEFAULT; + enum TimeOfDay timeOfDay = OW_TIME_OF_DAY_ENCOUNTERS ? GetTimeOfDay() : TIME_OF_DAY_DEFAULT; + return GenConfigTimeOfDay(timeOfDay); } void RtcInitLocalTimeOffset(s32 hour, s32 minute) @@ -348,6 +349,7 @@ void RtcCalcLocalTimeOffset(s32 days, s32 hours, s32 minutes, s32 seconds) gLocalTime.hours = hours; gLocalTime.minutes = minutes; gLocalTime.seconds = seconds; + FakeRtc_ManuallySetTime(gLocalTime.days, gLocalTime.hours, gLocalTime.minutes, seconds); RtcGetInfo(&sRtc); RtcCalcTimeDifference(&sRtc, &gSaveBlock2Ptr->localTimeOffset, &gLocalTime); } @@ -455,12 +457,24 @@ enum Weekday GetDayOfWeek(void) return dateTime.dayOfWeek; } +enum TimeOfDay GenConfigTimeOfDay(enum TimeOfDay timeOfDay) +{ + if ((((timeOfDay == TIME_MORNING || timeOfDay == TIME_EVENING) && OW_TIMES_OF_DAY == GEN_3) + || (timeOfDay == TIME_EVENING && OW_TIMES_OF_DAY == GEN_4)) + && timeOfDay < TIME_LAST) + timeOfDay++; + + return timeOfDay; +} + enum TimeOfDay TryIncrementTimeOfDay(enum TimeOfDay timeOfDay) { - return timeOfDay == TIME_NIGHT ? TIME_MORNING : timeOfDay + 1; + timeOfDay = timeOfDay == TIME_LAST ? TIME_FIRST : timeOfDay + 1; + return GenConfigTimeOfDay(timeOfDay); } enum TimeOfDay TryDecrementTimeOfDay(enum TimeOfDay timeOfDay) { - return timeOfDay == TIME_MORNING ? TIME_NIGHT : timeOfDay - 1; + timeOfDay = timeOfDay == TIME_FIRST ? TIME_LAST : timeOfDay - 1; + return GenConfigTimeOfDay(timeOfDay); } diff --git a/src/save.c b/src/save.c index 4e6c41b6f963..ff7cef598999 100644 --- a/src/save.c +++ b/src/save.c @@ -9,7 +9,6 @@ #include "overworld.h" #include "hall_of_fame.h" #include "pokemon_storage_system.h" -#include "main.h" #include "trainer_hill.h" #include "link.h" #include "constants/game_stat.h" @@ -92,7 +91,7 @@ COMMON_DATA struct SaveSector *gReadWriteSector = NULL; // Pointer to a buffer f COMMON_DATA u16 gIncrementalSectorId = 0; COMMON_DATA u16 gSaveUnusedVar = 0; COMMON_DATA u16 gSaveFileStatus = 0; -COMMON_DATA void (*gGameContinueCallback)(void) = NULL; +COMMON_DATA MainCallback gGameContinueCallback = NULL; COMMON_DATA struct SaveSectorLocation gRamSaveSectorLocations[NUM_SECTORS_PER_SLOT] = {0}; COMMON_DATA u16 gSaveUnusedVar2 = 0; COMMON_DATA u16 gSaveAttemptStatus = 0; @@ -856,7 +855,7 @@ bool8 WriteSaveBlock2(void) // It returns TRUE when finished. bool8 WriteSaveBlock1Sector(void) { - u8 finished = FALSE; + bool32 finished = FALSE; u16 sectorId = ++gIncrementalSectorId; // Because WriteSaveBlock2 will have been called prior, this will be SECTOR_ID_SAVEBLOCK1_START if (sectorId <= SECTOR_ID_SAVEBLOCK1_END) { @@ -897,7 +896,7 @@ u8 LoadGameSave(u8 saveType) status = TryLoadSaveSlot(FULL_SAVE_SLOT, gRamSaveSectorLocations); CopyPartyAndObjectsFromSave(); gSaveFileStatus = status; - gGameContinueCallback = 0; + gGameContinueCallback = NULL; break; case SAVE_HALL_OF_FAME: if (gHoFSaveBuffer != NULL) diff --git a/src/save_failed_screen.c b/src/save_failed_screen.c index 08cc1aaeb9fe..8ce47d3f3fa9 100644 --- a/src/save_failed_screen.c +++ b/src/save_failed_screen.c @@ -133,7 +133,7 @@ static const u8 sClockFrames[8][3] = }; static const u8 sSaveFailedClockPal[] = INCBIN_U8("graphics/misc/clock_small.gbapal"); -static const u32 sSaveFailedClockGfx[] = INCBIN_U32("graphics/misc/clock_small.4bpp.lz"); +static const u32 sSaveFailedClockGfx[] = INCBIN_U32("graphics/misc/clock_small.4bpp.smol"); static void CB2_SaveFailedScreen(void); static void CB2_WipeSave(void); @@ -205,10 +205,10 @@ static void CB2_SaveFailedScreen(void) DmaFill16(3, 0, VRAM, VRAM_SIZE); DmaFill32(3, 0, OAM, OAM_SIZE); DmaFill16(3, 0, PLTT, PLTT_SIZE); - LZ77UnCompVram(gBirchBagGrass_Gfx, (void *)VRAM); - LZ77UnCompVram(gBirchBagTilemap, (void *)(BG_SCREEN_ADDR(14))); - LZ77UnCompVram(gBirchGrassTilemap, (void *)(BG_SCREEN_ADDR(15))); - LZ77UnCompVram(sSaveFailedClockGfx, (void *)(OBJ_VRAM0 + 0x20)); + DecompressDataWithHeaderVram(gBirchBagGrass_Gfx, (void *)VRAM); + DecompressDataWithHeaderVram(gBirchBagTilemap, (void *)(BG_SCREEN_ADDR(14))); + DecompressDataWithHeaderVram(gBirchGrassTilemap, (void *)(BG_SCREEN_ADDR(15))); + DecompressDataWithHeaderVram(sSaveFailedClockGfx, (void *)(OBJ_VRAM0 + 0x20)); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); SetBgTilemapBuffer(0, sSaveFailedBuffers->tilemapBuffer); @@ -336,7 +336,7 @@ static void CB2_ReturnToTitleScreen(void) } else { - SetMainCallback2((MainCallback)gGameContinueCallback); + SetMainCallback2(gGameContinueCallback); gGameContinueCallback = NULL; } } diff --git a/src/scrcmd.c b/src/scrcmd.c index 87bc8e62983b..cf1fb1ab6778 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -14,6 +14,7 @@ #include "event_data.h" #include "field_door.h" #include "field_effect.h" +#include "field_move.h" #include "event_object_lock.h" #include "event_object_movement.h" #include "event_scripts.h" @@ -33,6 +34,7 @@ #include "menu.h" #include "money.h" #include "move.h" +#include "move_relearner.h" #include "mystery_event_script.h" #include "palette.h" #include "party_menu.h" @@ -666,7 +668,7 @@ bool8 ScrCmd_checkitemtype(struct ScriptContext *ctx) Script_RequestEffects(SCREFF_V1); - gSpecialVar_Result = GetPocketByItemId(itemId); + gSpecialVar_Result = GetItemPocket(itemId); return FALSE; } @@ -839,6 +841,8 @@ bool8 ScrCmd_fadescreenswapbuffers(struct ScriptContext *ctx) switch (mode) { case FADE_FROM_BLACK: + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0)); + break; case FADE_FROM_WHITE: // Restore last weather blend before fading in, // since BLDALPHA was modified by fade-out @@ -2283,15 +2287,20 @@ bool8 ScrCmd_setmonmove(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_checkpartymove(struct ScriptContext *ctx) +bool8 ScrCmd_checkfieldmove(struct ScriptContext *ctx) { - u8 i; - u16 move = ScriptReadHalfword(ctx); + enum FieldMove fieldMove = ScriptReadByte(ctx); + bool32 doUnlockedCheck = ScriptReadByte(ctx); + u16 move; Script_RequestEffects(SCREFF_V1); gSpecialVar_Result = PARTY_SIZE; - for (i = 0; i < PARTY_SIZE; i++) + if (doUnlockedCheck && !IsFieldMoveUnlocked(fieldMove)) + return FALSE; + + move = FieldMove_GetMoveId(fieldMove); + for (u32 i = 0; i < PARTY_SIZE; i++) { u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL); if (!species) @@ -2303,6 +2312,7 @@ bool8 ScrCmd_checkpartymove(struct ScriptContext *ctx) break; } } + return FALSE; } @@ -2726,7 +2736,7 @@ bool8 ScrCmd_setmetatile(struct ScriptContext *ctx) if (!isImpassable) MapGridSetMetatileIdAt(x, y, metatileId); else - MapGridSetMetatileIdAt(x, y, metatileId | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x, y, metatileId | MAPGRID_IMPASSABLE); return FALSE; } @@ -2996,7 +3006,7 @@ static void CloseBrailleWindow(void) bool8 ScrCmd_buffertrainerclassname(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); - u16 trainerClassId = VarGet(ScriptReadHalfword(ctx)); + enum TrainerClassID trainerClassId = VarGet(ScriptReadHalfword(ctx)); Script_RequestEffects(SCREFF_V1); @@ -3007,7 +3017,7 @@ bool8 ScrCmd_buffertrainerclassname(struct ScriptContext *ctx) bool8 ScrCmd_buffertrainername(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); - u16 trainerClassId = VarGet(ScriptReadHalfword(ctx)); + enum TrainerClassID trainerClassId = VarGet(ScriptReadHalfword(ctx)); Script_RequestEffects(SCREFF_V1); @@ -3076,8 +3086,8 @@ bool8 ScrCmd_getobjectxy(struct ScriptContext *ctx) bool8 ScrCmd_checkobjectat(struct ScriptContext *ctx) { - u32 x = VarGet(ScriptReadHalfword(ctx)) + 7; - u32 y = VarGet(ScriptReadHalfword(ctx)) + 7; + u32 x = VarGet(ScriptReadHalfword(ctx)) + MAP_OFFSET; + u32 y = VarGet(ScriptReadHalfword(ctx)) + MAP_OFFSET; u32 varId = ScriptReadHalfword(ctx); Script_RequestEffects(SCREFF_V1); @@ -3092,7 +3102,7 @@ bool8 ScrCmd_checkobjectat(struct ScriptContext *ctx) bool8 Scrcmd_getsetpokedexflag(struct ScriptContext *ctx) { - u32 speciesId = SpeciesToNationalPokedexNum(VarGet(ScriptReadHalfword(ctx))); + enum NationalDexOrder speciesId = SpeciesToNationalPokedexNum(VarGet(ScriptReadHalfword(ctx))); u32 desiredFlag = VarGet(ScriptReadHalfword(ctx)); if (desiredFlag == FLAG_SET_CAUGHT || desiredFlag == FLAG_SET_SEEN) @@ -3145,11 +3155,13 @@ bool8 Scrcmd_getobjectfacingdirection(struct ScriptContext *ctx) return FALSE; } -bool8 ScrFunc_hidefollower(struct ScriptContext *ctx) +bool8 ScrCmd_hidefollower(struct ScriptContext *ctx) { bool16 wait = VarGet(ScriptReadHalfword(ctx)); struct ObjectEvent *obj; + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + if ((obj = ScriptHideFollower()) != NULL && wait) { sMovingNpcId = obj->localId; @@ -3244,3 +3256,38 @@ void Script_EndTrainerCanSeeIf(struct ScriptContext *ctx) if (ctx->breakOnTrainerBattle && sScriptConditionTable[condition][ctx->comparisonResult] == 1) StopScript(ctx); } + +bool8 ScrCmd_setmoverelearnerstate(struct ScriptContext *ctx) +{ + enum MoveRelearnerStates state = VarGet(ScriptReadHalfword(ctx)); + + Script_RequestEffects(SCREFF_V1); + + gMoveRelearnerState = state; + return FALSE; +} + +bool8 ScrCmd_getmoverelearnerstate(struct ScriptContext *ctx) +{ + u32 varId = ScriptReadHalfword(ctx); + + Script_RequestEffects(SCREFF_V1); + Script_RequestWriteVar(varId); + + u16 *varPointer = GetVarPointer(varId); + *varPointer = gMoveRelearnerState; + return FALSE; +} + +bool8 ScrCmd_istmrelearneractive(struct ScriptContext *ctx) +{ + const u8 *ptr = (const u8 *)ScriptReadWord(ctx); + + Script_RequestEffects(SCREFF_V1); + + if ((P_TM_MOVES_RELEARNER || P_ENABLE_MOVE_RELEARNERS) + && (P_ENABLE_ALL_TM_MOVES || IsBagPocketNonEmpty(POCKET_TM_HM))) + ScriptCall(ctx, ptr); + + return FALSE; +} diff --git a/src/script_pokemon_util.c b/src/script_pokemon_util.c index 7288870441f9..ae503d101634 100644 --- a/src/script_pokemon_util.c +++ b/src/script_pokemon_util.c @@ -319,7 +319,7 @@ void CheckTeraType(struct ScriptContext *ctx) void SetTeraType(struct ScriptContext *ctx) { - u32 type = ScriptReadByte(ctx); + enum Type type = ScriptReadByte(ctx); u32 partyIndex = VarGet(ScriptReadHalfword(ctx)); Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); @@ -332,14 +332,15 @@ void SetTeraType(struct ScriptContext *ctx) * if side/slot are assigned, it will create the mon at the assigned party location * if slot == PARTY_SIZE, it will give the mon to first available party or storage slot */ -static u32 ScriptGiveMonParameterized(u8 side, u8 slot, u16 species, u8 level, u16 item, enum PokeBall ball, u8 nature, u8 abilityNum, u8 gender, u8 *evs, u8 *ivs, u16 *moves, bool8 isShiny, bool8 gmaxFactor, u8 teraType, u8 dmaxLevel) +static u32 ScriptGiveMonParameterized(u8 side, u8 slot, u16 species, u8 level, u16 item, enum PokeBall ball, u8 nature, u8 abilityNum, u8 gender, u8 *evs, u8 *ivs, u16 *moves, enum ShinyMode shinyMode, bool8 gmaxFactor, enum Type teraType, u8 dmaxLevel) { - u16 nationalDexNum; + enum NationalDexOrder nationalDexNum; int sentToPc; struct Pokemon mon; u32 i; u8 genderRatio = gSpeciesInfo[species].genderRatio; u16 targetSpecies; + bool32 isShiny; // check whether to use a specific nature or a random one if (nature >= NUM_NATURES) @@ -360,10 +361,13 @@ static u32 ScriptGiveMonParameterized(u8 side, u8 slot, u16 species, u8 level, u CreateMonWithNature(&mon, species, level, 32, nature); // shininess - if (P_FLAG_FORCE_SHINY != 0 && FlagGet(P_FLAG_FORCE_SHINY)) + if (shinyMode == SHINY_MODE_ALWAYS || (P_FLAG_FORCE_SHINY != 0 && FlagGet(P_FLAG_FORCE_SHINY))) isShiny = TRUE; - else if (P_FLAG_FORCE_NO_SHINY != 0 && FlagGet(P_FLAG_FORCE_NO_SHINY)) + else if (shinyMode == SHINY_MODE_NEVER || (P_FLAG_FORCE_NO_SHINY != 0 && FlagGet(P_FLAG_FORCE_NO_SHINY))) isShiny = FALSE; + else + isShiny = GetMonData(&mon, MON_DATA_IS_SHINY); + SetMonData(&mon, MON_DATA_IS_SHINY, &isShiny); // gigantamax factor @@ -479,7 +483,7 @@ u32 ScriptGiveMon(u16 species, u8 level, u16 item) MAX_PER_STAT_IVS + 1, MAX_PER_STAT_IVS + 1, MAX_PER_STAT_IVS + 1}; // ScriptGiveMonParameterized won't touch the stats' IV. u16 moves[MAX_MON_MOVES] = {MOVE_NONE, MOVE_NONE, MOVE_NONE, MOVE_NONE}; - return ScriptGiveMonParameterized(0, PARTY_SIZE, species, level, item, ITEM_POKE_BALL, NUM_NATURES, NUM_ABILITY_PERSONALITY, MON_GENDERLESS, evs, ivs, moves, FALSE, FALSE, NUMBER_OF_MON_TYPES, 0); + return ScriptGiveMonParameterized(0, PARTY_SIZE, species, level, item, ITEM_POKE_BALL, NUM_NATURES, NUM_ABILITY_PERSONALITY, MON_GENDERLESS, evs, ivs, moves, SHINY_MODE_RANDOM, FALSE, NUMBER_OF_MON_TYPES, 0); } #define PARSE_FLAG(n, default_) (flags & (1 << (n))) ? VarGet(ScriptReadHalfword(ctx)) : (default_) @@ -514,8 +518,8 @@ void ScrCmd_createmon(struct ScriptContext *ctx) // Perfect IV calculation u32 i; - u8 availableIVs[NUM_STATS]; - u8 selectedIvs[NUM_STATS]; + enum Stat availableIVs[NUM_STATS]; + enum Stat selectedIvs[NUM_STATS]; if (gSpeciesInfo[species].perfectIVCount != 0) { // Initialize a list of IV indices. @@ -539,23 +543,24 @@ void ScrCmd_createmon(struct ScriptContext *ctx) case STAT_SPEED: speedIv = MAX_PER_STAT_IVS; break; case STAT_SPATK: spAtkIv = MAX_PER_STAT_IVS; break; case STAT_SPDEF: spDefIv = MAX_PER_STAT_IVS; break; + default: break; } } } - hpIv = PARSE_FLAG(11, hpIv); - atkIv = PARSE_FLAG(12, atkIv); - defIv = PARSE_FLAG(13, defIv); - speedIv = PARSE_FLAG(14, speedIv); - spAtkIv = PARSE_FLAG(15, spAtkIv); - spDefIv = PARSE_FLAG(16, spDefIv); - u16 move1 = PARSE_FLAG(17, MOVE_NONE); - u16 move2 = PARSE_FLAG(18, MOVE_NONE); - u16 move3 = PARSE_FLAG(19, MOVE_NONE); - u16 move4 = PARSE_FLAG(20, MOVE_NONE); - bool8 isShiny = PARSE_FLAG(21, FALSE); - bool8 gmaxFactor = PARSE_FLAG(22, FALSE); - u8 teraType = PARSE_FLAG(23, NUMBER_OF_MON_TYPES); - u8 dmaxLevel = PARSE_FLAG(24, 0); + hpIv = PARSE_FLAG(11, hpIv); + atkIv = PARSE_FLAG(12, atkIv); + defIv = PARSE_FLAG(13, defIv); + speedIv = PARSE_FLAG(14, speedIv); + spAtkIv = PARSE_FLAG(15, spAtkIv); + spDefIv = PARSE_FLAG(16, spDefIv); + u16 move1 = PARSE_FLAG(17, MOVE_NONE); + u16 move2 = PARSE_FLAG(18, MOVE_NONE); + u16 move3 = PARSE_FLAG(19, MOVE_NONE); + u16 move4 = PARSE_FLAG(20, MOVE_NONE); + enum ShinyMode shinyMode = PARSE_FLAG(21, SHINY_MODE_RANDOM); + bool8 gmaxFactor = PARSE_FLAG(22, FALSE); + enum Type teraType = PARSE_FLAG(23, NUMBER_OF_MON_TYPES); + u8 dmaxLevel = PARSE_FLAG(24, 0); u8 evs[NUM_STATS] = {hpEv, atkEv, defEv, speedEv, spAtkEv, spDefEv}; u8 ivs[NUM_STATS] = {hpIv, atkIv, defIv, speedIv, spAtkIv, spDefIv}; @@ -566,7 +571,7 @@ void ScrCmd_createmon(struct ScriptContext *ctx) else Script_RequestEffects(SCREFF_V1); - gSpecialVar_Result = ScriptGiveMonParameterized(side, slot, species, level, item, ball, nature, abilityNum, gender, evs, ivs, moves, isShiny, gmaxFactor, teraType, dmaxLevel); + gSpecialVar_Result = ScriptGiveMonParameterized(side, slot, species, level, item, ball, nature, abilityNum, gender, evs, ivs, moves, shinyMode, gmaxFactor, teraType, dmaxLevel); } #undef PARSE_FLAG diff --git a/src/secret_base.c b/src/secret_base.c index de0825b91e74..d15663206d4a 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -39,7 +39,6 @@ #include "constants/event_objects.h" #include "constants/field_specials.h" #include "constants/items.h" -#include "constants/map_types.h" #include "constants/metatile_behaviors.h" #include "constants/metatile_labels.h" #include "constants/moves.h" @@ -332,7 +331,7 @@ void ToggleSecretBaseEntranceMetatile(void) { if (sSecretBaseEntranceMetatiles[i].closedMetatileId == metatileId) { - MapGridSetMetatileIdAt(x, y, sSecretBaseEntranceMetatiles[i].openMetatileId | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x, y, sSecretBaseEntranceMetatiles[i].openMetatileId | MAPGRID_IMPASSABLE); CurrentMapDrawMetatileAt(x, y); return; } @@ -343,7 +342,7 @@ void ToggleSecretBaseEntranceMetatile(void) { if (sSecretBaseEntranceMetatiles[i].openMetatileId == metatileId) { - MapGridSetMetatileIdAt(x, y, sSecretBaseEntranceMetatiles[i].closedMetatileId | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x, y, sSecretBaseEntranceMetatiles[i].closedMetatileId | MAPGRID_IMPASSABLE); CurrentMapDrawMetatileAt(x, y); return; } @@ -398,7 +397,7 @@ void SetOccupiedSecretBaseEntranceMetatiles(struct MapEvents const *events) { if (sSecretBaseEntranceMetatiles[i].closedMetatileId == tile_id) { - MapGridSetMetatileIdAt(x, y, sSecretBaseEntranceMetatiles[i].openMetatileId | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x, y, sSecretBaseEntranceMetatiles[i].openMetatileId | MAPGRID_IMPASSABLE); break; } } @@ -477,7 +476,7 @@ static void EnterNewlyCreatedSecretBase_StartFadeIn(void) FindMetatileIdMapCoords(&x, &y, METATILE_SecretBase_PC); x += MAP_OFFSET; y += MAP_OFFSET; - MapGridSetMetatileIdAt(x, y, METATILE_SecretBase_PC | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x, y, METATILE_SecretBase_PC | MAPGRID_IMPASSABLE); CurrentMapDrawMetatileAt(x, y); FadeInFromBlack(); CreateTask(EnterNewlyCreatedSecretBase_WaitFadeIn, 0); @@ -538,13 +537,13 @@ void InitSecretBaseAppearance(bool8 hidePC) { // Another player's secret base. Change PC type to the "Register" PC. FindMetatileIdMapCoords(&x, &y, METATILE_SecretBase_PC); - MapGridSetMetatileIdAt(x + MAP_OFFSET, y + MAP_OFFSET, METATILE_SecretBase_RegisterPC | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x + MAP_OFFSET, y + MAP_OFFSET, METATILE_SecretBase_RegisterPC | MAPGRID_IMPASSABLE); } else if (hidePC == TRUE && VarGet(VAR_SECRET_BASE_INITIALIZED) == 1) { // Change PC to regular ground tile. FindMetatileIdMapCoords(&x, &y, METATILE_SecretBase_PC); - MapGridSetMetatileIdAt(x + MAP_OFFSET, y + MAP_OFFSET, METATILE_SecretBase_Ground | MAPGRID_COLLISION_MASK); + MapGridSetMetatileIdAt(x + MAP_OFFSET, y + MAP_OFFSET, METATILE_SecretBase_Ground | MAPGRID_IMPASSABLE); } } } @@ -840,7 +839,7 @@ static void ClosePlayerSecretBaseEntrance(void) { MapGridSetMetatileIdAt(events->bgEvents[i].x + MAP_OFFSET, events->bgEvents[i].y + MAP_OFFSET, - sSecretBaseEntranceMetatiles[j].closedMetatileId | MAPGRID_COLLISION_MASK); + sSecretBaseEntranceMetatiles[j].closedMetatileId | MAPGRID_IMPASSABLE); break; } } diff --git a/src/shop.c b/src/shop.c index ac8a01a9b478..e983213963b8 100644 --- a/src/shop.c +++ b/src/shop.c @@ -45,6 +45,7 @@ #define TAG_ITEM_ICON_BASE 9110 // immune to time blending #define MAX_ITEMS_SHOWN 8 +#define SHOP_MENU_PALETTE_ID 12 enum { WIN_BUY_SELL_QUIT, @@ -457,7 +458,7 @@ static void Task_GoToBuyOrSellMenu(u8 taskId) if (!gPaletteFade.active) { DestroyTask(taskId); - SetMainCallback2((void *)((u16)tCallbackHi << 16 | (u16)tCallbackLo)); + SetMainCallback2((MainCallback)((u16)tCallbackHi << 16 | (u16)tCallbackLo)); } } @@ -745,8 +746,8 @@ static void BuyMenuInitBgs(void) static void BuyMenuDecompressBgGraphics(void) { DecompressAndCopyTileDataToVram(1, gShopMenu_Gfx, 0x3A0, 0x3E3, 0); - LZDecompressWram(gShopMenu_Tilemap, sShopData->tilemapBuffers[0]); - LoadPalette(gShopMenu_Pal, BG_PLTT_ID(12), PLTT_SIZE_4BPP); + DecompressDataWithHeaderWram(gShopMenu_Tilemap, sShopData->tilemapBuffers[0]); + LoadPalette(gShopMenu_Pal, BG_PLTT_ID(SHOP_MENU_PALETTE_ID), PLTT_SIZE_4BPP); } static void BuyMenuInitWindows(void) @@ -956,7 +957,7 @@ static void BuyMenuCopyMenuBgToBg1TilemapBuffer(void) for (i = 0; i < 1024; i++) { if (src[i] != 0) - dest[i] = src[i] + 0xC3E3; + dest[i] = src[i] + ((SHOP_MENU_PALETTE_ID << 12) | 0x3E3); } } diff --git a/src/siirtc.c b/src/siirtc.c index 5c511f681540..ecce71a03cf5 100644 --- a/src/siirtc.c +++ b/src/siirtc.c @@ -75,7 +75,7 @@ static u8 ReadData(); static void EnableGpioPortRead(); static void DisableGpioPortRead(); -USED static const char AgbLibRtcVersion[] = "SIIRTC_V001"; +KEEP_SECTION USED static const char AgbLibRtcVersion[] = "SIIRTC_V001"; void SiiRtcUnprotect(void) { diff --git a/src/slot_machine.c b/src/slot_machine.c index 7f1139651474..e35087e51391 100644 --- a/src/slot_machine.c +++ b/src/slot_machine.c @@ -314,6 +314,11 @@ enum { DIG_DISPLAY_BONUS_BIG }; +// IDs for the text windows +enum { + WIN_MSG, + WIN_INFO, +}; // How ReelTime works // ================== @@ -1249,7 +1254,7 @@ static void SlotMachineSetup_LoadGfxAndTilemaps(void) LoadSlotMachineGfx(); LoadMessageBoxGfx(0, 0x200, BG_PLTT_ID(15)); LoadUserWindowBorderGfx(0, 0x214, BG_PLTT_ID(14)); - PutWindowTilemap(0); + PutWindowTilemap(WIN_MSG); } static void CreateSlotMachineSprites(void) @@ -1390,9 +1395,9 @@ static bool8 SlotTask_HandleBetInput(struct Task *task) // SLOTTASK_MSG_NEED_3_COINS static bool8 SlotTask_PrintMsg_Need3Coins(struct Task *task) { - DrawDialogueFrame(0, FALSE); - AddTextPrinterParameterized(0, FONT_NORMAL, gText_YouDontHaveThreeCoins, 0, 1, 0, 0); - CopyWindowToVram(0, COPYWIN_FULL); + DrawDialogueFrame(WIN_MSG, FALSE); + AddTextPrinterParameterized(WIN_MSG, FONT_NORMAL, gText_YouDontHaveThreeCoins, 0, 1, 0, 0); + CopyWindowToVram(WIN_MSG, COPYWIN_FULL); sSlotMachine->state = SLOTTASK_WAIT_MSG_NEED_3_COINS; return FALSE; } @@ -1402,7 +1407,7 @@ static bool8 SlotTask_WaitMsg_Need3Coins(struct Task *task) { if (JOY_NEW(A_BUTTON | B_BUTTON)) { - ClearDialogWindowAndFrame(0, TRUE); + ClearDialogWindowAndFrame(WIN_MSG, TRUE); sSlotMachine->state = SLOTTASK_BET_INPUT; } return FALSE; @@ -1655,9 +1660,9 @@ static bool8 SlotTask_NoMatches(struct Task *task) // SLOTTASK_ASK_QUIT static bool8 SlotTask_AskQuit(struct Task *task) { - DrawDialogueFrame(0, FALSE); - AddTextPrinterParameterized(0, FONT_NORMAL, gText_QuitTheGame, 0, 1, 0, 0); - CopyWindowToVram(0, COPYWIN_FULL); + DrawDialogueFrame(WIN_MSG, FALSE); + AddTextPrinterParameterized(WIN_MSG, FONT_NORMAL, gText_QuitTheGame, 0, 1, 0, 0); + CopyWindowToVram(WIN_MSG, COPYWIN_FULL); CreateYesNoMenuParameterized(0x15, 7, 0x214, 0x180, 0xE, 0xF); sSlotMachine->state = SLOTTASK_HANDLE_QUIT_INPUT; return FALSE; @@ -1669,16 +1674,16 @@ static bool8 SlotTask_HandleQuitInput(struct Task *task) s8 input = Menu_ProcessInputNoWrapClearOnChoose(); if (input == 0) // Chose to quit { - ClearDialogWindowAndFrame(0, TRUE); + ClearDialogWindowAndFrame(WIN_MSG, TRUE); DarkenBetTiles(0); DarkenBetTiles(1); DarkenBetTiles(2); sSlotMachine->coins += sSlotMachine->bet; sSlotMachine->state = SLOTTASK_END; } - else if (input == 1 || input == -1) // Chose not to quit + else if (input == 1 || input == MENU_B_PRESSED) // Chose not to quit { - ClearDialogWindowAndFrame(0, TRUE); + ClearDialogWindowAndFrame(WIN_MSG, TRUE); sSlotMachine->state = SLOTTASK_BET_INPUT; } return FALSE; @@ -1687,9 +1692,9 @@ static bool8 SlotTask_HandleQuitInput(struct Task *task) // SLOTTASK_MSG_MAX_COINS static bool8 SlotTask_PrintMsg_MaxCoins(struct Task *task) { - DrawDialogueFrame(0, FALSE); - AddTextPrinterParameterized(0, FONT_NORMAL, gText_YouveGot9999Coins, 0, 1, 0, 0); - CopyWindowToVram(0, COPYWIN_FULL); + DrawDialogueFrame(WIN_MSG, FALSE); + AddTextPrinterParameterized(WIN_MSG, FONT_NORMAL, gText_YouveGot9999Coins, 0, 1, 0, 0); + CopyWindowToVram(WIN_MSG, COPYWIN_FULL); sSlotMachine->state = SLOTTASK_WAIT_MSG_MAX_COINS; return FALSE; } @@ -1699,7 +1704,7 @@ static bool8 SlotTask_WaitMsg_MaxCoins(struct Task *task) { if (JOY_NEW(A_BUTTON | B_BUTTON)) { - ClearDialogWindowAndFrame(0, TRUE); + ClearDialogWindowAndFrame(WIN_MSG, TRUE); sSlotMachine->state = SLOTTASK_BET_INPUT; } return FALSE; @@ -1708,9 +1713,9 @@ static bool8 SlotTask_WaitMsg_MaxCoins(struct Task *task) // SLOTTASK_MSG_NO_MORE_COINS static bool8 SlotTask_PrintMsg_NoMoreCoins(struct Task *task) { - DrawDialogueFrame(0, FALSE); - AddTextPrinterParameterized(0, FONT_NORMAL, gText_YouveRunOutOfCoins, 0, 1, 0, 0); - CopyWindowToVram(0, COPYWIN_FULL); + DrawDialogueFrame(WIN_MSG, FALSE); + AddTextPrinterParameterized(WIN_MSG, FONT_NORMAL, gText_YouveRunOutOfCoins, 0, 1, 0, 0); + CopyWindowToVram(WIN_MSG, COPYWIN_FULL); sSlotMachine->state = SLOTTASK_WAIT_MSG_NO_MORE_COINS; return FALSE; } @@ -1720,7 +1725,7 @@ static bool8 SlotTask_WaitMsg_NoMoreCoins(struct Task *task) { if (JOY_NEW(A_BUTTON | B_BUTTON)) { - ClearDialogWindowAndFrame(0, TRUE); + ClearDialogWindowAndFrame(WIN_MSG, TRUE); sSlotMachine->state = SLOTTASK_END; } return FALSE; @@ -3922,15 +3927,15 @@ static void InfoBox_DrawWindow(struct Task *task) DestroyDigitalDisplayScene(); LoadInfoBoxTilemap(); AddWindow(&sWindowTemplate_InfoBox); - PutWindowTilemap(1); - FillWindowPixelBuffer(1, PIXEL_FILL(0)); + PutWindowTilemap(WIN_INFO); + FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0)); task->tState++; } static void InfoBox_AddText(struct Task *task) { - AddTextPrinterParameterized3(1, FONT_NORMAL, 2, 5, sColors_ReeltimeHelp, 0, gText_ReelTimeHelp); - CopyWindowToVram(1, COPYWIN_FULL); + AddTextPrinterParameterized3(WIN_INFO, FONT_NORMAL, 2, 5, sColors_ReeltimeHelp, 0, gText_ReelTimeHelp); + CopyWindowToVram(WIN_INFO, COPYWIN_FULL); BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); task->tState++; } @@ -3939,10 +3944,10 @@ static void InfoBox_WaitInput(struct Task *task) { if (JOY_NEW(B_BUTTON | SELECT_BUTTON)) { - FillWindowPixelBuffer(1, PIXEL_FILL(0)); - ClearWindowTilemap(1); - CopyWindowToVram(1, COPYWIN_MAP); - RemoveWindow(1); + FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0)); + ClearWindowTilemap(WIN_INFO); + CopyWindowToVram(WIN_INFO, COPYWIN_MAP); + RemoveWindow(WIN_INFO); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); task->tState++; } @@ -5015,9 +5020,9 @@ static void LoadSlotMachineGfx(void) LoadReelBackground(); sDigitalDisplayGfxPtr = Alloc(0x3200); - LZDecompressWram(gSlotMachineDigitalDisplay_Gfx, sDigitalDisplayGfxPtr); + DecompressDataWithHeaderWram(gSlotMachineDigitalDisplay_Gfx, sDigitalDisplayGfxPtr); sReelTimeGfxPtr = Alloc(0x3600); - LZDecompressWram(sReelTimeGfx, sReelTimeGfxPtr); + DecompressDataWithHeaderWram(sReelTimeGfx, sReelTimeGfxPtr); sSlotMachineSpritesheetsPtr = AllocZeroed(sizeof(struct SpriteSheet) * ARRAY_COUNT(sSlotMachineSpriteSheets)); for (i = 0; i < ARRAY_COUNT(sSlotMachineSpriteSheets); i++) { @@ -5055,7 +5060,7 @@ static void LoadReelBackground(void) static void LoadMenuGfx(void) { sMenuGfx = Alloc(0x2200); - LZDecompressWram(gSlotMachineMenu_Gfx, sMenuGfx); + DecompressDataWithHeaderWram(gSlotMachineMenu_Gfx, sMenuGfx); LoadBgTiles(2, sMenuGfx, 0x2200, 0); LoadPalette(gSlotMachineMenu_Pal, BG_PLTT_ID(0), 5 * PLTT_SIZE_4BPP); LoadPalette(sUnkPalette, BG_PLTT_ID(13), PLTT_SIZE_4BPP); @@ -7945,6 +7950,6 @@ static const struct SpritePalette sSlotMachineSpritePalettes[] = {} }; -static const u32 sReelTimeGfx[] = INCBIN_U32("graphics/slot_machine/reel_time_gfx.4bpp.lz"); // reel_time_machine and reel_time_pikachu +static const u32 sReelTimeGfx[] = INCBIN_U32("graphics/slot_machine/reel_time_gfx.4bpp.smol"); // reel_time_machine and reel_time_pikachu static const u16 sReelTimeWindow_Tilemap[] = INCBIN_U16("graphics/slot_machine/reel_time_window.bin"); static const u16 sEmptyTilemap[] = {0}; diff --git a/src/sound.c b/src/sound.c index 5b4ae29f712a..80676a492034 100644 --- a/src/sound.c +++ b/src/sound.c @@ -34,6 +34,7 @@ static void Task_Fanfare(u8 taskId); static void CreateFanfareTask(void); static void RestoreBGMVolumeAfterPokemonCry(void); +// The 1st argument in the table is the length of the fanfare, measured in frames. This is calculated by taking the duration of the midi file, multiplying by 59.72750056960583, and rounding up to the next nearest integer. static const struct Fanfare sFanfares[] = { [FANFARE_LEVEL_UP] = { MUS_LEVEL_UP, 80 }, [FANFARE_OBTAIN_ITEM] = { MUS_OBTAIN_ITEM, 160 }, @@ -456,6 +457,12 @@ void PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode) case CRY_MODE_WEAK: pitch = 15000; break; + case CRY_MODE_DYNAMAX: + length = 255; + release = 255; + pitch = 12150; + chorus = 200; + break; } SetPokemonCryVolume(volume); @@ -467,11 +474,11 @@ void PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode) SetPokemonCryChorus(chorus); SetPokemonCryPriority(priority); - species = GetCryIdBySpecies(species); - if (species != CRY_NONE) + enum PokemonCry cryId = GetCryIdBySpecies(species); + if (cryId != CRY_NONE) { - species--; - gMPlay_PokemonCry = SetPokemonCryTone(reverse ? &gCryTable_Reverse[species] : &gCryTable[species]); + cryId--; + gMPlay_PokemonCry = SetPokemonCryTone(reverse ? &gCryTable_Reverse[cryId] : &gCryTable[cryId]); } } diff --git a/src/sprite.c b/src/sprite.c index 8367881e7dac..2df5e2760a11 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -28,6 +28,8 @@ #if T_SHOULD_RUN_MOVE_ANIM EWRAM_DATA bool32 gLoadFail = FALSE; +EWRAM_DATA bool32 gCountAllocs = FALSE; +EWRAM_DATA s32 gSpriteAllocs = 0; #endif // T_SHOULD_RUN_MOVE_ANIM struct SpriteCopyRequest @@ -85,7 +87,6 @@ static void ApplyAffineAnimFrameRelativeAndUpdateMatrix(u8 matrixNum, struct Aff static s16 ConvertScaleParam(s16 scale); static void GetAffineAnimFrame(u8 matrixNum, struct Sprite *sprite, struct AffineAnimFrameCmd *frameCmd); static void ApplyAffineAnimFrame(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd); -static u8 IndexOfSpriteTileTag(u16 tag); static void AllocSpriteTileRange(u16 tag, u16 start, u16 count); static void DoLoadSpritePalette(const u16 *src, u16 paletteOffset); static void UpdateSpriteMatrixAnchorPos(struct Sprite *, s32, s32); @@ -878,8 +879,11 @@ void BeginAnim(struct Sprite *sprite) if (sprite->usingSheet) { + // Inject OW decompression here if (OW_GFX_COMPRESS && sprite->sheetSpan) + { imageValue = (imageValue + 1) << sprite->sheetSpan; + } sprite->oam.tileNum = sprite->sheetTileStart + imageValue; } else @@ -937,7 +941,10 @@ void AnimCmd_frame(struct Sprite *sprite) if (sprite->usingSheet) { if (OW_GFX_COMPRESS && sprite->sheetSpan) + { + // Inject OW frame switcher here imageValue = (imageValue + 1) << sprite->sheetSpan; + } sprite->oam.tileNum = sprite->sheetTileStart + imageValue; } else @@ -1496,6 +1503,10 @@ void LoadSpriteSheets(const struct SpriteSheet *sheets) void FreeSpriteTilesByTag(u16 tag) { +#if T_SHOULD_RUN_MOVE_ANIM + if (gCountAllocs) + gSpriteAllocs--; +#endif u8 index = IndexOfSpriteTileTag(tag); if (index != 0xFF) { @@ -1561,6 +1572,10 @@ u16 GetSpriteTileTagByTileStart(u16 start) void AllocSpriteTileRange(u16 tag, u16 start, u16 count) { +#if T_SHOULD_RUN_MOVE_ANIM + if (gCountAllocs) + gSpriteAllocs++; +#endif u8 freeIndex = IndexOfSpriteTileTag(TAG_NONE); sSpriteTileRangeTags[freeIndex] = tag; SET_SPRITE_TILE_RANGE(freeIndex, start, count); diff --git a/src/start_menu.c b/src/start_menu.c index 72a420e90ed4..6566ee2e8e67 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -306,7 +306,7 @@ static void BuildStartMenuActions(void) { BuildBattlePikeStartMenu(); } - else if (InBattlePyramid()) + else if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) { BuildBattlePyramidStartMenu(); } @@ -468,7 +468,7 @@ static void RemoveExtraStartMenuWindows(void) CopyWindowToVram(sSafariBallsWindowId, COPYWIN_GFX); RemoveWindow(sSafariBallsWindowId); } - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) { ClearStdWindowAndFrameToTransparent(sBattlePyramidFloorWindowId, FALSE); RemoveWindow(sBattlePyramidFloorWindowId); @@ -528,7 +528,7 @@ static bool32 InitStartMenuStep(void) case 3: if (GetSafariZoneFlag()) ShowSafariBallsWindow(); - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) ShowPyramidFloorWindow(); sInitStartMenuData[0]++; break; @@ -753,7 +753,7 @@ static bool8 StartMenuPlayerNameCallback(void) static bool8 StartMenuSaveCallback(void) { - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) RemoveExtraStartMenuWindows(); gMenuCallback = SaveStartCallback; // Display save menu @@ -957,7 +957,7 @@ static void ShowSaveMessage(const u8 *message, u8 (*saveCallback)(void)) { StringExpandPlaceholders(gStringVar4, message); LoadMessageBoxAndFrameGfx(0, TRUE); - AddTextPrinterForMessage_2(TRUE); + AddTextPrinterForMessage(TRUE); sSavingComplete = TRUE; sSaveDialogCallback = saveCallback; } @@ -1035,7 +1035,7 @@ static u8 SaveConfirmSaveCallback(void) RemoveStartMenuWindow(); ShowSaveInfoWindow(); - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) { ShowSaveMessage(gText_BattlePyramidConfirmRest, SaveYesNoCallback); } diff --git a/src/starter_choose.c b/src/starter_choose.c index 7eaff8254dd2..94557468579d 100644 --- a/src/starter_choose.c +++ b/src/starter_choose.c @@ -54,11 +54,11 @@ static u16 sStarterLabelWindowId; const u16 gBirchBagGrass_Pal[] = INCBIN_U16("graphics/starter_choose/tiles.gbapal"); static const u16 sPokeballSelection_Pal[] = INCBIN_U16("graphics/starter_choose/pokeball_selection.gbapal"); static const u16 sStarterCircle_Pal[] = INCBIN_U16("graphics/starter_choose/starter_circle.gbapal"); -const u32 gBirchBagTilemap[] = INCBIN_U32("graphics/starter_choose/birch_bag.bin.lz"); -const u32 gBirchGrassTilemap[] = INCBIN_U32("graphics/starter_choose/birch_grass.bin.lz"); -const u32 gBirchBagGrass_Gfx[] = INCBIN_U32("graphics/starter_choose/tiles.4bpp.lz"); -const u32 gPokeballSelection_Gfx[] = INCBIN_U32("graphics/starter_choose/pokeball_selection.4bpp.lz"); -static const u32 sStarterCircle_Gfx[] = INCBIN_U32("graphics/starter_choose/starter_circle.4bpp.lz"); +const u32 gBirchBagTilemap[] = INCBIN_U32("graphics/starter_choose/birch_bag.bin.smolTM"); +const u32 gBirchGrassTilemap[] = INCBIN_U32("graphics/starter_choose/birch_grass.bin.smolTM"); +const u32 gBirchBagGrass_Gfx[] = INCBIN_U32("graphics/starter_choose/tiles.4bpp.smol"); +const u32 gPokeballSelection_Gfx[] = INCBIN_U32("graphics/starter_choose/pokeball_selection.4bpp.smol"); +static const u32 sStarterCircle_Gfx[] = INCBIN_U32("graphics/starter_choose/starter_circle.4bpp.smol"); static const struct WindowTemplate sWindowTemplates[] = { @@ -397,9 +397,9 @@ void CB2_ChooseStarter(void) DmaFill32(3, 0, OAM, OAM_SIZE); DmaFill16(3, 0, PLTT, PLTT_SIZE); - LZ77UnCompVram(gBirchBagGrass_Gfx, (void *)VRAM); - LZ77UnCompVram(gBirchBagTilemap, (void *)(BG_SCREEN_ADDR(6))); - LZ77UnCompVram(gBirchGrassTilemap, (void *)(BG_SCREEN_ADDR(7))); + DecompressDataWithHeaderVram(gBirchBagGrass_Gfx, (void *)VRAM); + DecompressDataWithHeaderVram(gBirchBagTilemap, (void *)(BG_SCREEN_ADDR(6))); + DecompressDataWithHeaderVram(gBirchGrassTilemap, (void *)(BG_SCREEN_ADDR(7))); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); diff --git a/src/string_util.c b/src/string_util.c index fd4a0861eeb2..fe8b6fa59214 100644 --- a/src/string_util.c +++ b/src/string_util.c @@ -706,6 +706,7 @@ u8 GetExtCtrlCodeLength(u8 code) [EXT_CTRL_CODE_ENG] = 1, [EXT_CTRL_CODE_PAUSE_MUSIC] = 1, [EXT_CTRL_CODE_RESUME_MUSIC] = 1, + [EXT_CTRL_CODE_SPEAKER] = 1, }; u8 length = 0; diff --git a/src/strings.c b/src/strings.c index 3d1e1ebf3258..d63266c03825 100644 --- a/src/strings.c +++ b/src/strings.c @@ -18,8 +18,8 @@ const u8 gText_ExpandedPlaceholder_Kyogre[] = _("KYOGRE"); const u8 gText_ExpandedPlaceholder_Groudon[] = _("GROUDON"); const u8 gText_ExpandedPlaceholder_Brendan[] = _("BRENDAN"); const u8 gText_ExpandedPlaceholder_May[] = _("MAY"); -const u8 gText_EggNickname[] = _("EGG"); -const u8 gText_Pokemon[] = _("POKΓ©MON"); +const u8 gText_EggNickname[POKEMON_NAME_LENGTH + 1] = _("EGG"); +const u8 gText_Pokemon[POKEMON_NAME_LENGTH + 1] = _("POKΓ©MON"); const u8 gText_Player[] = _("PLAYER"); // Unused const u8 gText_Pokedex[] = _("POKΓ©DEX"); // Unused const u8 gText_Time[] = _("TIME"); @@ -199,14 +199,14 @@ const u8 gText_ReturnToVar1[] = _("Return to\n{STR_VAR_1}."); const u8 *const gPocketNamesStringsTable[] = { - [ITEMS_POCKET] = COMPOUND_STRING("ITEMS"), - [BALLS_POCKET] = COMPOUND_STRING("POKΓ© BALLS"), - [TMHM_POCKET] = COMPOUND_STRING("TMs & HMs"), - [BERRIES_POCKET] = COMPOUND_STRING("BERRIES"), - [KEYITEMS_POCKET] = COMPOUND_STRING("KEY ITEMS") + [POCKET_ITEMS] = COMPOUND_STRING("ITEMS"), + [POCKET_POKE_BALLS] = COMPOUND_STRING("POKΓ© BALLS"), + [POCKET_TM_HM] = COMPOUND_STRING("TMs & HMs"), + [POCKET_BERRIES] = COMPOUND_STRING("BERRIES"), + [POCKET_KEY_ITEMS] = COMPOUND_STRING("KEY ITEMS") }; -const u8 gText_NumberItem_TMBerry[] = _("{NO}{STR_VAR_1}{CLEAR 0x07}{STR_VAR_2}"); +const u8 gText_NumberItem_TMBerry[] = _("{NO}{STR_VAR_1}{CLEAR 0x03}{STR_VAR_2}"); const u8 gText_NumberItem_HM[] = _("{CLEAR_TO 0x11}{STR_VAR_1}{CLEAR 0x05}{STR_VAR_2}"); const u8 gText_ShopBuy[] = _("BUY"); @@ -809,8 +809,8 @@ const u8 gText_ThankYou[] = _("THANK YOU"); const u8 gText_ByeBye[] = _("BYE-BYE!"); const u8 gText_PlayerScurriedToCenter[] = _("{PLAYER} scurried to a POKΓ©MON CENTER,\nprotecting the exhausted and fainted\nPOKΓ©MON from further harm…\p"); const u8 gText_PlayerScurriedBackHome[] = _("{PLAYER} scurried back home, protecting\nthe exhausted and fainted POKΓ©MON from\nfurther harm…\p"); -const u8 gText_PlayerRegroupCenter[] = _("{PLAYER} went running back to a POKΓ©MON CENTER\nto regroup and reconsider their battle\lstrategy…\p"); -const u8 gText_PlayerRegroupHome[] = _("{PLAYER} went running back home to regroup\nand reconsider their battle strategy…\p"); +const u8 gText_PlayerRegroupCenter[] = _("{PLAYER} scurried to a POKΓ©MON CENTER,\nto regroup and reconsider the battle\nstrategy…\p"); +const u8 gText_PlayerRegroupHome[] = _("{PLAYER} scurried back home, to regroup\nand reconsider the battle strategy…\p"); const u8 gText_HatchedFromEgg[] = _("{STR_VAR_1} hatched from the EGG!"); const u8 gText_NicknameHatchPrompt[] = _("Would you like to nickname the newly\nhatched {STR_VAR_1}?"); ALIGNED(4) const u8 gText_ReadyPickBerry[] = _("Are you ready to BERRY-CRUSH?\nPlease pick a BERRY for use.\p"); @@ -972,6 +972,9 @@ ALIGNED(4) const u8 gText_FrontierFacilityRoomsCleared[] = _("Rooms cleared: {ST ALIGNED(4) const u8 gText_FrontierFacilityKOsStreak[] = _("KOs in a row: {STR_VAR_2}"); ALIGNED(4) const u8 gText_FrontierFacilityFloorsCleared[] = _("Floors cleared: {STR_VAR_2}"); ALIGNED(4) const u8 gText_123Dot[][3] = {_("1."), _("2."), _("3.")}; +const u8 gText_FrontierFacilityTotalCaughtSpeciesBanned[] = _(" and {STR_VAR_2} of the POKΓ©MON species\nyou caught are inelegible"); +const u8 gText_FrontierFacilityIncluding[] = _(".\pThese include "); +const u8 gText_FrontierFacilityAreInelegible[] = _(" are inelegible"); const u8 gText_SavingDontTurnOff2[] = _("SAVING…\nDON'T TURN OFF THE POWER."); const u8 gText_BlenderMaxSpeedRecord[] = _("BERRY BLENDER\nMAXIMUM SPEED RECORD!"); @@ -984,28 +987,6 @@ const u8 gText_CommErrorEllipsis[] = _("Communication error…"); const u8 gText_MoveCloserToLinkPartner[] = _("Move closer to your link partner(s).\nAvoid obstacles between partners."); const u8 gText_ABtnRegistrationCounter[] = _("A Button: Registration Counter"); const u8 gText_ABtnTitleScreen[] = _("A Button: Title Screen"); -const u8 gText_Option[] = _("OPTION"); -const u8 gText_TextSpeed[] = _("TEXT SPEED"); -const u8 gText_BattleScene[] = _("BATTLE SCENE"); -const u8 gText_BattleStyle[] = _("BATTLE STYLE"); -const u8 gText_Sound[] = _("SOUND"); -const u8 gText_Frame[] = _("FRAME"); -const u8 gText_OptionMenuCancel[] = _("CANCEL"); -const u8 gText_ButtonMode[] = _("BUTTON MODE"); -const u8 gText_TextSpeedSlow[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}SLOW"); -const u8 gText_TextSpeedMid[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}MID"); -const u8 gText_TextSpeedFast[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}FAST"); -const u8 gText_BattleSceneOn[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}ON"); -const u8 gText_BattleSceneOff[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}OFF"); -const u8 gText_BattleStyleShift[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}SHIFT"); -const u8 gText_BattleStyleSet[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}SET"); -const u8 gText_SoundMono[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}MONO"); -const u8 gText_SoundStereo[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}STEREO"); -const u8 gText_FrameType[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}TYPE"); -const u8 gText_FrameTypeNumber[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}"); -const u8 gText_ButtonTypeNormal[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}NORMAL"); -const u8 gText_ButtonTypeLR[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}LR"); -const u8 gText_ButtonTypeLEqualsA[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}L=A"); const u8 gText_NumPlayerLink[] = _("{STR_VAR_1}P LINK"); const u8 gText_BronzeCard[] = _("BRONZE"); const u8 gText_CopperCard[] = _("COPPER"); @@ -1237,7 +1218,7 @@ const u8 gText_TrainerHill1F[] = _("1F"); const u8 gText_TrainerHill2F[] = _("2F"); const u8 gText_TrainerHill3F[] = _("3F"); const u8 gText_TrainerHill4F[] = _("4F"); -const u8 gText_TeachWhichMoveToPkmn[] = _("Teach which move to\n{STR_VAR_1}?"); +const u8 gText_TeachWhichMoveToPkmn[] = _("Teach which {STR_VAR_3} to\n{STR_VAR_1}?"); const u8 gText_MoveRelearnerTeachMoveConfirm[] = _("Teach {STR_VAR_2}?"); const u8 gText_MoveRelearnerPkmnLearnedMove[] = _("{STR_VAR_1} learned\n{STR_VAR_2}!"); const u8 gText_MoveRelearnerPkmnTryingToLearnMove[] = _("{STR_VAR_1} is trying to learn\n{STR_VAR_2}.\pBut {STR_VAR_1} can't learn more\nthan four moves.\pDelete an older move to make\nroom for {STR_VAR_2}?"); @@ -1298,5 +1279,11 @@ const u8 gText_BasePointsResetToZero[] = _("{STR_VAR_1}'s base points\nwere all const u8 gText_AM[] = _("AM"); const u8 gText_PM[] = _("PM"); const u8 gText_Relearn[] = _("{START_BUTTON} RELEARN"); // future note: don't decap this, because it mimics the summary screen BG graphics which will not get decapped +const u8 gText_Relearn_LevelUp[] = _("{START_BUTTON} RELEARN LEVEL"); +const u8 gText_Relearn_Egg[] = _("{START_BUTTON} RELEARN EGG"); +const u8 gText_Relearn_TM[] = _("{START_BUTTON} RELEARN TM"); +const u8 gText_Relearn_Tutor[] = _("{START_BUTTON} RELEARN TUTOR"); const u8 gText_Rename[] = _("RENAME"); const u8 gText_CannotSendMonToBoxHM[] = _("Cannot send that mon to the box,\nbecause it knows a HM move.{PAUSE_UNTIL_PRESS}"); +const u8 gText_CannotSendMonToBoxActive[] = _("Cannot send an active battler\nto the box.{PAUSE_UNTIL_PRESS}"); +const u8 gText_CannotSendMonToBoxPartner[] = _("Cannot send a mon that doesn't,\nbelong to you to the box.{PAUSE_UNTIL_PRESS}"); diff --git a/src/test_runner_stub.c b/src/test_runner_stub.c index 9a9452ed21f4..20aabe3d9afa 100644 --- a/src/test_runner_stub.c +++ b/src/test_runner_stub.c @@ -7,5 +7,7 @@ const bool8 gTestRunnerEnabled = FALSE; // The Makefile patches gTestRunnerHeadless as part of make test. // This allows us to open the ROM in an mgba with a UI and see the // animations and messages play, which helps when debugging a test. +#if TESTING const bool8 gTestRunnerHeadless = FALSE; +#endif const bool8 gTestRunnerSkipIsFail = FALSE; diff --git a/src/text.c b/src/text.c index 29ffc5ea3a1f..a08d304e34e7 100644 --- a/src/text.c +++ b/src/text.c @@ -1,17 +1,20 @@ #include "global.h" #include "battle.h" -#include "main.h" +#include "blit.h" +#include "dynamic_placeholder_text_util.h" +#include "event_data.h" +#include "field_name_box.h" +#include "fonts.h" #include "m4a.h" +#include "main.h" +#include "menu.h" #include "palette.h" #include "sound.h" -#include "constants/songs.h" #include "string_util.h" -#include "window.h" #include "text.h" -#include "blit.h" -#include "menu.h" -#include "dynamic_placeholder_text_util.h" -#include "fonts.h" +#include "window.h" +#include "constants/songs.h" +#include "constants/speaker_names.h" static u16 RenderText(struct TextPrinter *); static u32 RenderFont(struct TextPrinter *); @@ -85,11 +88,6 @@ static const u8 sDarkDownArrowTiles[] = INCBIN_U8("graphics/fonts/down_arrow_alt static const u8 sUnusedFRLGBlankedDownArrow[] = INCBIN_U8("graphics/fonts/unused_frlg_blanked_down_arrow.4bpp"); static const u8 sUnusedFRLGDownArrow[] = INCBIN_U8("graphics/fonts/unused_frlg_down_arrow.4bpp"); static const u8 sDownArrowYCoords[] = { 0, 1, 2, 1 }; -static const u8 sWindowVerticalScrollSpeeds[] = { - [OPTIONS_TEXT_SPEED_SLOW] = 1, - [OPTIONS_TEXT_SPEED_MID] = 2, - [OPTIONS_TEXT_SPEED_FAST] = 4, -}; static const struct GlyphWidthFunc sGlyphWidthFuncs[] = { @@ -294,6 +292,31 @@ static const u8 sMenuCursorDimensions[][2] = [FONT_SHORT_NARROWER] = { 8, 14 }, }; +// these three arrays are most for readability, ie instead of returning a magic number 8 +static const u8 sTextSpeedFrameDelays[] = +{ + [OPTIONS_TEXT_SPEED_SLOW] = 8, + [OPTIONS_TEXT_SPEED_MID] = 4, + [OPTIONS_TEXT_SPEED_FAST] = 1, + [OPTIONS_TEXT_SPEED_INSTANT] = 1, +}; + +static const u8 sTextSpeedModifiers[] = +{ + [OPTIONS_TEXT_SPEED_SLOW] = TEXT_SPEED_SLOW_MODIFIER, + [OPTIONS_TEXT_SPEED_MID] = TEXT_SPEED_MEDIUM_MODIFIER, + [OPTIONS_TEXT_SPEED_FAST] = TEXT_SPEED_FAST_MODIFIER, + [OPTIONS_TEXT_SPEED_INSTANT] = TEXT_SPEED_INSTANT_MODIFIER, +}; + +static const u8 sTextScrollSpeeds[] = +{ + [OPTIONS_TEXT_SPEED_SLOW] = 1, + [OPTIONS_TEXT_SPEED_MID] = 2, + [OPTIONS_TEXT_SPEED_FAST] = 4, + [OPTIONS_TEXT_SPEED_INSTANT] = 6, +}; + static const u16 sFontBoldJapaneseGlyphs[] = INCBIN_U16("graphics/fonts/bold.hwjpnfont"); static void SetFontsPointer(const struct FontInfo *fonts) @@ -301,6 +324,40 @@ static void SetFontsPointer(const struct FontInfo *fonts) gFonts = fonts; } +u32 GetPlayerTextSpeed(void) +{ + if (gTextFlags.forceMidTextSpeed) + return OPTIONS_TEXT_SPEED_MID; + + if (gSaveBlock2Ptr->optionsTextSpeed > OPTIONS_TEXT_SPEED_INSTANT) + gSaveBlock2Ptr->optionsTextSpeed = OPTIONS_TEXT_SPEED_FAST; + + if (FlagGet(FLAG_TEXT_SPEED_INSTANT) || TEXT_SPEED_INSTANT) + return OPTIONS_TEXT_SPEED_INSTANT; + + return gSaveBlock2Ptr->optionsTextSpeed; +} + +u32 GetPlayerTextSpeedDelay(void) +{ + return sTextSpeedFrameDelays[GetPlayerTextSpeed()]; +} + +u32 GetPlayerTextSpeedModifier(void) +{ + return sTextSpeedModifiers[GetPlayerTextSpeed()]; +} + +u32 GetPlayerTextScrollSpeed(void) +{ + return sTextScrollSpeeds[GetPlayerTextSpeed()]; +} + +bool32 IsPlayerTextSpeedInstant(void) +{ + return GetPlayerTextSpeed() == OPTIONS_TEXT_SPEED_INSTANT; +} + void DeactivateAllTextPrinters(void) { int printer; @@ -378,30 +435,53 @@ bool32 AddTextPrinter(struct TextPrinterTemplate *printerTemplate, u8 speed, voi void RunTextPrinters(void) { - int i; + bool32 isInstantText = IsPlayerTextSpeedInstant(); + u32 textRepeats = GetPlayerTextSpeedModifier(); + + if (gDisableTextPrinters) + return; - if (!gDisableTextPrinters) + do { - for (i = 0; i < WINDOWS_MAX; ++i) + u32 numEmpty = 0; + for (u32 windowId = 0; windowId < WINDOWS_MAX; windowId++) { - if (sTextPrinters[i].active) + if (sTextPrinters[windowId].active) { - u16 renderCmd = RenderFont(&sTextPrinters[i]); - switch (renderCmd) + for (u32 repeat = 0; repeat < textRepeats; repeat++) { - case RENDER_PRINT: - CopyWindowToVram(sTextPrinters[i].printerTemplate.windowId, COPYWIN_GFX); - case RENDER_UPDATE: - if (sTextPrinters[i].callback != NULL) - sTextPrinters[i].callback(&sTextPrinters[i].printerTemplate, renderCmd); - break; - case RENDER_FINISH: - sTextPrinters[i].active = FALSE; - break; + u32 renderState = RenderFont(&sTextPrinters[windowId]); + switch (renderState) + { + case RENDER_PRINT: + CopyWindowToVram(sTextPrinters[windowId].printerTemplate.windowId, COPYWIN_GFX); + if (sTextPrinters[windowId].callback != NULL) + sTextPrinters[windowId].callback(&sTextPrinters[windowId].printerTemplate, renderState); + break; + case RENDER_UPDATE: + if (sTextPrinters[windowId].callback != NULL) + sTextPrinters[windowId].callback(&sTextPrinters[windowId].printerTemplate, renderState); + isInstantText = FALSE; + break; + case RENDER_FINISH: + sTextPrinters[windowId].active = FALSE; + isInstantText = FALSE; + break; + } + + if (!sTextPrinters[windowId].active) + break; } } + else + { + numEmpty++; + } } - } + + if (numEmpty == WINDOWS_MAX) + return; + } while (isInstantText); } bool32 IsTextPrinterActive(u8 id) @@ -427,6 +507,13 @@ void GenerateFontHalfRowLookupTable(u8 fgColor, u8 bgColor, u8 shadowColor) u16 *current = sFontHalfRowLookupTable; + if (fgColor == sLastTextFgColor + && bgColor == sLastTextBgColor + && shadowColor == sLastTextShadowColor) + { + return; + } + sLastTextBgColor = bgColor; sLastTextFgColor = fgColor; sLastTextShadowColor = shadowColor; @@ -629,27 +716,35 @@ static u8 UNUSED GetLastTextColor(u8 colorType) } } -inline static void GLYPH_COPY(u8 *windowTiles, u32 widthOffset, u32 j, u32 i, u32 *glyphPixels, s32 width, s32 height) +inline static void GLYPH_COPY(u8 *windowTiles, u32 widthOffset, u32 x0, u32 y0, u32 *glyphPixels, s32 width, s32 height) { - u32 xAdd, yAdd, pixelData, bits, toOrr, dummyX; - u8 *dst; + if (width <= 0) + return; + + u32 widthMask = (1 << (width * 4)) - 1; + + u32 shift0 = (x0 % 8) * 4, shift8 = 32 - shift0; + + u32 *alignedWindowTilesX = (u32 *)(windowTiles + ((x0 / 8) * TILE_SIZE_4BPP)); - xAdd = j + width; - yAdd = i + height; - dummyX = j; - for (; i < yAdd; i++) + u32 y1 = y0 + height; + for (u32 y = y0; y < y1; y++) { - pixelData = *glyphPixels++; - for (j = dummyX; j < xAdd; j++) - { - if ((toOrr = pixelData & 0xF)) - { - dst = windowTiles + ((j / 8) * 32) + ((j % 8) / 2) + ((i / 8) * widthOffset) + ((i % 8) * 4); - bits = ((j & 1) * 4); - *dst = (toOrr << bits) | (*dst & (0xF0 >> bits)); - } - pixelData >>= 4; - } + u32 pixels = *glyphPixels++ & widthMask; + + u32 mask = pixels; + mask = mask | (mask >> 2); + mask = mask | (mask >> 1); + mask = mask & 0x11111111; + mask = mask * 0xF; + + u32 pixels0 = pixels << shift0, pixels8 = pixels >> shift8; + u32 mask0 = mask << shift0, mask8 = mask >> shift8; + + u32 *alignedWindowTiles = (u32 *)((u8 *)alignedWindowTilesX + ((y / 8) * widthOffset) + ((y % 8) * 4)); + + alignedWindowTiles[0] = (alignedWindowTiles[0] & ~mask0) | pixels0; + alignedWindowTiles[8] = (alignedWindowTiles[8] & ~mask8) | pixels8; } } @@ -888,7 +983,7 @@ void TextPrinterInitDownArrowCounters(struct TextPrinter *textPrinter) else { subStruct->downArrowYPosIdx = 0; - subStruct->downArrowDelay = 0; + subStruct->utilityCounter = 0; } } @@ -899,9 +994,9 @@ void TextPrinterDrawDownArrow(struct TextPrinter *textPrinter) if (gTextFlags.autoScroll == 0) { - if (subStruct->downArrowDelay != 0) + if (subStruct->utilityCounter != 0) { - subStruct->downArrowDelay--; + subStruct->utilityCounter--; } else { @@ -937,7 +1032,7 @@ void TextPrinterDrawDownArrow(struct TextPrinter *textPrinter) 16); CopyWindowToVram(textPrinter->printerTemplate.windowId, COPYWIN_GFX); - subStruct->downArrowDelay = 8; + subStruct->utilityCounter = 8 * GetPlayerTextSpeedModifier(); subStruct->downArrowYPosIdx++; } } @@ -1041,7 +1136,7 @@ void DrawDownArrow(u8 windowId, u16 x, u16 y, u8 bgColor, bool32 drawArrow, u8 * BlitBitmapRectToWindow(windowId, arrowTiles, 0, sDownArrowYCoords[*yCoordIndex & 3], 8, 16, x, y - 2, 8, 16); CopyWindowToVram(windowId, COPYWIN_GFX); - *counter = 8; + *counter = 8 * GetPlayerTextSpeedModifier(); ++*yCoordIndex; } } @@ -1057,7 +1152,7 @@ static u16 RenderText(struct TextPrinter *textPrinter) switch (textPrinter->state) { case RENDER_STATE_HANDLE_CHAR: - if (JOY_HELD(A_BUTTON | B_BUTTON) && subStruct->hasPrintBeenSpedUp) + if ((JOY_HELD(A_BUTTON | B_BUTTON) && subStruct->hasPrintBeenSpedUp) || IsPlayerTextSpeedInstant()) textPrinter->delayCounter = 0; if (textPrinter->delayCounter && textPrinter->textSpeed) @@ -1213,6 +1308,13 @@ static u16 RenderText(struct TextPrinter *textPrinter) case EXT_CTRL_CODE_ENG: textPrinter->japanese = FALSE; return RENDER_REPEAT; + case EXT_CTRL_CODE_SPEAKER: + { + enum SpeakerNames name = *textPrinter->printerTemplate.currentChar++; + TrySpawnAndShowNamebox(gSpeakerNamesTable[name], NAME_BOX_BASE_TILE_NUM); + + return RENDER_REPEAT; + } } break; case CHAR_PROMPT_CLEAR: @@ -1308,6 +1410,7 @@ static u16 RenderText(struct TextPrinter *textPrinter) case RENDER_STATE_SCROLL_START: if (TextPrinterWaitWithDownArrow(textPrinter)) { + subStruct->utilityCounter = 0; TextPrinterClearDownArrow(textPrinter); textPrinter->scrollDistance = gFonts[textPrinter->printerTemplate.fontId].maxLetterHeight + textPrinter->printerTemplate.lineSpacing; textPrinter->printerTemplate.currentX = textPrinter->printerTemplate.x; @@ -1317,18 +1420,31 @@ static u16 RenderText(struct TextPrinter *textPrinter) case RENDER_STATE_SCROLL: if (textPrinter->scrollDistance) { - int scrollSpeed = GetPlayerTextSpeed(); - int speed = sWindowVerticalScrollSpeeds[scrollSpeed]; - if (textPrinter->scrollDistance < speed) + u32 scrollSpeed = GetPlayerTextScrollSpeed(); + u32 speedModifier = GetPlayerTextSpeedModifier(); + + if (subStruct->utilityCounter != 0) + { + subStruct->utilityCounter--; + return RENDER_UPDATE; + } + + if (textPrinter->scrollDistance < scrollSpeed) { ScrollWindow(textPrinter->printerTemplate.windowId, 0, textPrinter->scrollDistance, PIXEL_FILL(textPrinter->printerTemplate.bgColor)); textPrinter->scrollDistance = 0; } else { - ScrollWindow(textPrinter->printerTemplate.windowId, 0, speed, PIXEL_FILL(textPrinter->printerTemplate.bgColor)); - textPrinter->scrollDistance -= speed; + ScrollWindow(textPrinter->printerTemplate.windowId, 0, scrollSpeed, PIXEL_FILL(textPrinter->printerTemplate.bgColor)); + textPrinter->scrollDistance -= scrollSpeed; } + + if (speedModifier > 1) + subStruct->utilityCounter = speedModifier; + else + subStruct->utilityCounter = 0; + CopyWindowToVram(textPrinter->printerTemplate.windowId, COPYWIN_GFX); } else @@ -1403,6 +1519,7 @@ static u32 UNUSED GetStringWidthFixedWidthFont(const u8 *str, u8 fontId, u8 lett case EXT_CTRL_CODE_SKIP: case EXT_CTRL_CODE_CLEAR_TO: case EXT_CTRL_CODE_MIN_LETTER_SPACING: + case EXT_CTRL_CODE_SPEAKER: ++strPos; break; case EXT_CTRL_CODE_RESET_FONT: @@ -1551,6 +1668,7 @@ s32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing) case EXT_CTRL_CODE_ESCAPE: case EXT_CTRL_CODE_SHIFT_RIGHT: case EXT_CTRL_CODE_SHIFT_DOWN: + case EXT_CTRL_CODE_SPEAKER: ++str; break; case EXT_CTRL_CODE_FONT: @@ -1720,6 +1838,7 @@ u8 RenderTextHandleBold(u8 *pixels, u8 fontId, u8 *str) case EXT_CTRL_CODE_SKIP: case EXT_CTRL_CODE_CLEAR_TO: case EXT_CTRL_CODE_MIN_LETTER_SPACING: + case EXT_CTRL_CODE_SPEAKER: ++strPos; break; case EXT_CTRL_CODE_RESET_FONT: diff --git a/src/title_screen.c b/src/title_screen.c index 1d605d1fc056..a443da0f4cd1 100644 --- a/src/title_screen.c +++ b/src/title_screen.c @@ -60,10 +60,10 @@ static void SpriteCB_PokemonLogoShine(struct Sprite *sprite); // const rom data static const u16 sUnusedUnknownPal[] = INCBIN_U16("graphics/title_screen/unused.gbapal"); -static const u32 sTitleScreenRayquazaGfx[] = INCBIN_U32("graphics/title_screen/rayquaza.4bpp.lz"); -static const u32 sTitleScreenRayquazaTilemap[] = INCBIN_U32("graphics/title_screen/rayquaza.bin.lz"); -static const u32 sTitleScreenLogoShineGfx[] = INCBIN_U32("graphics/title_screen/logo_shine.4bpp.lz"); -static const u32 sTitleScreenCloudsGfx[] = INCBIN_U32("graphics/title_screen/clouds.4bpp.lz"); +static const u32 sTitleScreenRayquazaGfx[] = INCBIN_U32("graphics/title_screen/rayquaza.4bpp.smol"); +static const u32 sTitleScreenRayquazaTilemap[] = INCBIN_U32("graphics/title_screen/rayquaza.bin.smolTM"); +static const u32 sTitleScreenLogoShineGfx[] = INCBIN_U32("graphics/title_screen/logo_shine.4bpp.smol"); +static const u32 sTitleScreenCloudsGfx[] = INCBIN_U32("graphics/title_screen/clouds.4bpp.smol"); @@ -596,15 +596,15 @@ void CB2_InitTitleScreen(void) break; case 1: // bg2 - LZ77UnCompVram(gTitleScreenPokemonLogoGfx, (void *)(BG_CHAR_ADDR(0))); - LZ77UnCompVram(gTitleScreenPokemonLogoTilemap, (void *)(BG_SCREEN_ADDR(9))); + DecompressDataWithHeaderVram(gTitleScreenPokemonLogoGfx, (void *)(BG_CHAR_ADDR(0))); + DecompressDataWithHeaderVram(gTitleScreenPokemonLogoTilemap, (void *)(BG_SCREEN_ADDR(9))); LoadPalette(gTitleScreenBgPalettes, BG_PLTT_ID(0), 15 * PLTT_SIZE_4BPP); // bg3 - LZ77UnCompVram(sTitleScreenRayquazaGfx, (void *)(BG_CHAR_ADDR(2))); - LZ77UnCompVram(sTitleScreenRayquazaTilemap, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(sTitleScreenRayquazaGfx, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(sTitleScreenRayquazaTilemap, (void *)(BG_SCREEN_ADDR(26))); // bg1 - LZ77UnCompVram(sTitleScreenCloudsGfx, (void *)(BG_CHAR_ADDR(3))); - LZ77UnCompVram(gTitleScreenCloudsTilemap, (void *)(BG_SCREEN_ADDR(27))); + DecompressDataWithHeaderVram(sTitleScreenCloudsGfx, (void *)(BG_CHAR_ADDR(3))); + DecompressDataWithHeaderVram(gTitleScreenCloudsTilemap, (void *)(BG_SCREEN_ADDR(27))); ScanlineEffect_Stop(); ResetTasks(); ResetSpriteData(); diff --git a/src/trade.c b/src/trade.c index 4d51cfbd9a0d..01cd6f15ca70 100644 --- a/src/trade.c +++ b/src/trade.c @@ -138,7 +138,7 @@ enum { #define NUM_CHOOSE_PKMN_SPRITES (1 + GFXTAG_CHOOSE_PKMN_EMPTY_3 - GFXTAG_CHOOSE_PKMN_L) // Values for signaling to/from the link partner -enum { +enum SignalStatus { STATUS_NONE, STATUS_READY, STATUS_CANCEL, @@ -2482,7 +2482,7 @@ s32 GetGameProgressForLinkTrade(void) return TRADE_BOTH_PLAYERS_READY; } -int GetUnionRoomTradeMessageId(struct RfuGameCompatibilityData player, struct RfuGameCompatibilityData partner, u16 playerSpecies2, u16 partnerSpecies, u8 requestedType, u16 playerSpecies, bool8 isModernFatefulEncounter) +int GetUnionRoomTradeMessageId(struct RfuGameCompatibilityData player, struct RfuGameCompatibilityData partner, u16 playerSpecies2, u16 partnerSpecies, enum Type requestedType, u16 playerSpecies, bool8 isModernFatefulEncounter) { bool8 playerHasNationalDex = player.hasNationalDex; bool8 playerCanLinkNationally = player.canLinkNationally; @@ -2513,8 +2513,8 @@ int GetUnionRoomTradeMessageId(struct RfuGameCompatibilityData player, struct Rf else { // Player's PokΓ©mon must be of the type the partner requested - if (gSpeciesInfo[playerSpecies2].types[0] != requestedType - && gSpeciesInfo[playerSpecies2].types[1] != requestedType) + if (GetSpeciesType(playerSpecies2, 0) != requestedType + && GetSpeciesType(playerSpecies2, 1) != requestedType) return UR_TRADE_MSG_NOT_MON_PARTNER_WANTS; } @@ -3057,9 +3057,9 @@ static void UpdatePokedexForReceivedMon(u8 partyIdx) { u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); - species = SpeciesToNationalPokedexNum(species); - GetSetPokedexFlag(species, FLAG_SET_SEEN); - HandleSetPokedexFlag(species, FLAG_SET_CAUGHT, personality); + enum NationalDexOrder dexNum = SpeciesToNationalPokedexNum(species); + GetSetPokedexFlag(dexNum, FLAG_SET_SEEN); + HandleSetPokedexFlag(dexNum, FLAG_SET_CAUGHT, personality); } } @@ -3189,7 +3189,7 @@ static void SetTradeSequenceBgGpuRegs(u8 state) DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); - LZ77UnCompVram(sWirelessCloseup_Map, (void *) BG_SCREEN_ADDR(5)); + DecompressDataWithHeaderVram(sWirelessCloseup_Map, (void *) BG_SCREEN_ADDR(5)); BlendPalettes(0x8, 16, RGB_BLACK); } else @@ -3204,8 +3204,8 @@ static void SetTradeSequenceBgGpuRegs(u8 state) break; case 3: LoadPalette(sWirelessSignalNone_Pal, BG_PLTT_ID(3), PLTT_SIZE_4BPP); - LZ77UnCompVram(sWirelessSignal_Gfx, (void *) BG_CHAR_ADDR(1)); - LZ77UnCompVram(sWirelessSignal_Tilemap, (void *) BG_SCREEN_ADDR(18)); + DecompressDataWithHeaderVram(sWirelessSignal_Gfx, (void *) BG_CHAR_ADDR(1)); + DecompressDataWithHeaderVram(sWirelessSignal_Tilemap, (void *) BG_SCREEN_ADDR(18)); sTradeAnim->bg2vofs = 80; SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | @@ -4535,7 +4535,7 @@ static void CreateInGameTradePokemonInternal(u8 whichPlayerMon, u8 whichInGameTr u8 level = GetMonData(&gPlayerParty[whichPlayerMon], MON_DATA_LEVEL); struct Mail mail; - u8 metLocation = METLOC_IN_GAME_TRADE; + metloc_u8_t metLocation = METLOC_IN_GAME_TRADE; u8 mailNum; struct Pokemon *pokemon = &gEnemyParty[0]; diff --git a/src/trainer_card.c b/src/trainer_card.c index 29e94bfe9f19..e03b34daad51 100755 --- a/src/trainer_card.c +++ b/src/trainer_card.c @@ -26,6 +26,7 @@ #include "pokemon_icon.h" #include "trainer_pokemon_sprites.h" #include "contest_util.h" +#include "decompress.h" #include "constants/songs.h" #include "constants/game_stat.h" #include "constants/battle_frontier.h" @@ -77,7 +78,7 @@ struct TrainerCardData u8 cardType; bool8 isHoenn; u16 blendColor; - void (*callback2)(void); + MainCallback callback2; struct TrainerCard trainerCard; u16 frontTilemap[600]; u16 backTilemap[600]; @@ -168,7 +169,7 @@ static bool8 Task_EndCardFlip(struct Task *task); static void UpdateCardFlipRegs(u16); static void LoadMonIconGfx(void); -static const u32 sTrainerCardStickers_Gfx[] = INCBIN_U32("graphics/trainer_card/frlg/stickers.4bpp.lz"); +static const u32 sTrainerCardStickers_Gfx[] = INCBIN_U32("graphics/trainer_card/frlg/stickers.4bpp.smol"); static const u16 sUnused_Pal[] = INCBIN_U16("graphics/trainer_card/unused.gbapal"); static const u16 sHoennTrainerCardBronze_Pal[] = INCBIN_U16("graphics/trainer_card/bronze.gbapal"); static const u16 sKantoTrainerCardGreen_Pal[] = INCBIN_U16("graphics/trainer_card/frlg/green.gbapal"); @@ -187,8 +188,8 @@ static const u16 sTrainerCardSticker1_Pal[] = INCBIN_U16("graphics/trainer_ static const u16 sTrainerCardSticker2_Pal[] = INCBIN_U16("graphics/trainer_card/frlg/stickers2.gbapal"); static const u16 sTrainerCardSticker3_Pal[] = INCBIN_U16("graphics/trainer_card/frlg/stickers3.gbapal"); static const u16 sTrainerCardSticker4_Pal[] = INCBIN_U16("graphics/trainer_card/frlg/stickers4.gbapal"); -static const u32 sHoennTrainerCardBadges_Gfx[] = INCBIN_U32("graphics/trainer_card/badges.4bpp.lz"); -static const u32 sKantoTrainerCardBadges_Gfx[] = INCBIN_U32("graphics/trainer_card/frlg/badges.4bpp.lz"); +static const u32 sHoennTrainerCardBadges_Gfx[] = INCBIN_U32("graphics/trainer_card/badges.4bpp.smol"); +static const u32 sKantoTrainerCardBadges_Gfx[] = INCBIN_U32("graphics/trainer_card/frlg/badges.4bpp.smol"); static const struct BgTemplate sTrainerCardBgTemplates[4] = { @@ -535,47 +536,47 @@ static bool8 LoadCardGfx(void) { case 0: if (sData->cardType != CARD_TYPE_FRLG) - LZ77UnCompWram(gHoennTrainerCardBg_Tilemap, sData->bgTilemap); + DecompressDataWithHeaderWram(gHoennTrainerCardBg_Tilemap, sData->bgTilemap); else - LZ77UnCompWram(gKantoTrainerCardBg_Tilemap, sData->bgTilemap); + DecompressDataWithHeaderWram(gKantoTrainerCardBg_Tilemap, sData->bgTilemap); break; case 1: if (sData->cardType != CARD_TYPE_FRLG) - LZ77UnCompWram(gHoennTrainerCardBack_Tilemap, sData->backTilemap); + DecompressDataWithHeaderWram(gHoennTrainerCardBack_Tilemap, sData->backTilemap); else - LZ77UnCompWram(gKantoTrainerCardBack_Tilemap, sData->backTilemap); + DecompressDataWithHeaderWram(gKantoTrainerCardBack_Tilemap, sData->backTilemap); break; case 2: if (!sData->isLink) { if (sData->cardType != CARD_TYPE_FRLG) - LZ77UnCompWram(gHoennTrainerCardFront_Tilemap, sData->frontTilemap); + DecompressDataWithHeaderWram(gHoennTrainerCardFront_Tilemap, sData->frontTilemap); else - LZ77UnCompWram(gKantoTrainerCardFront_Tilemap, sData->frontTilemap); + DecompressDataWithHeaderWram(gKantoTrainerCardFront_Tilemap, sData->frontTilemap); } else { if (sData->cardType != CARD_TYPE_FRLG) - LZ77UnCompWram(gHoennTrainerCardFrontLink_Tilemap, sData->frontTilemap); + DecompressDataWithHeaderWram(gHoennTrainerCardFrontLink_Tilemap, sData->frontTilemap); else - LZ77UnCompWram(gKantoTrainerCardFrontLink_Tilemap, sData->frontTilemap); + DecompressDataWithHeaderWram(gKantoTrainerCardFrontLink_Tilemap, sData->frontTilemap); } break; case 3: if (sData->cardType != CARD_TYPE_FRLG) - LZ77UnCompWram(sHoennTrainerCardBadges_Gfx, sData->badgeTiles); + DecompressDataWithHeaderWram(sHoennTrainerCardBadges_Gfx, sData->badgeTiles); else - LZ77UnCompWram(sKantoTrainerCardBadges_Gfx, sData->badgeTiles); + DecompressDataWithHeaderWram(sKantoTrainerCardBadges_Gfx, sData->badgeTiles); break; case 4: if (sData->cardType != CARD_TYPE_FRLG) - LZ77UnCompWram(gHoennTrainerCard_Gfx, sData->cardTiles); + DecompressDataWithHeaderWram(gHoennTrainerCard_Gfx, sData->cardTiles); else - LZ77UnCompWram(gKantoTrainerCard_Gfx, sData->cardTiles); + DecompressDataWithHeaderWram(gKantoTrainerCard_Gfx, sData->cardTiles); break; case 5: if (sData->cardType == CARD_TYPE_FRLG) - LZ77UnCompWram(sTrainerCardStickers_Gfx, sData->stickerTiles); + DecompressDataWithHeaderWram(sTrainerCardStickers_Gfx, sData->stickerTiles); break; default: sData->gfxLoadState = 0; diff --git a/src/trainer_hill.c b/src/trainer_hill.c index 3b2b74e1ab7e..3acf98363228 100644 --- a/src/trainer_hill.c +++ b/src/trainer_hill.c @@ -309,7 +309,7 @@ static u8 GetFloorId(void) return gMapHeader.mapLayoutId - LAYOUT_TRAINER_HILL_1F; } -u8 GetTrainerHillOpponentClass(u16 trainerId) +enum TrainerClassID GetTrainerHillOpponentClass(u16 trainerId) { u8 id = trainerId - 1; @@ -707,17 +707,17 @@ bool32 LoadTrainerHillFloorObjectEventScripts(void) return TRUE; } -static u16 GetMetatileForFloor(u8 floorId, u32 x, u32 y, u32 floorWidth) // floorWidth is always 16 +static u16 GetMapDataForFloor(u8 floorId, u32 x, u32 y, u32 floorWidth) // floorWidth is always 16 { bool8 impassable; - u16 metatile; + u16 metatileId; u16 elevation; impassable = (sHillData->floors[floorId].map.collisionData[y] >> (15 - x) & 1); - metatile = sHillData->floors[floorId].map.metatileData[floorWidth * y + x] + NUM_METATILES_IN_PRIMARY; - elevation = 3 << MAPGRID_ELEVATION_SHIFT; + metatileId = sHillData->floors[floorId].map.metatileData[floorWidth * y + x] + NUM_METATILES_IN_PRIMARY; + elevation = PACK_ELEVATION(3); - return ((impassable << MAPGRID_COLLISION_SHIFT) & MAPGRID_COLLISION_MASK) | elevation | (metatile & MAPGRID_METATILE_ID_MASK); + return PACK_COLLISION(impassable) | elevation | PACK_METATILE(metatileId); } void GenerateTrainerHillFloorLayout(u16 *mapArg) @@ -762,7 +762,7 @@ void GenerateTrainerHillFloorLayout(u16 *mapArg) for (y = 0; y < HILL_FLOOR_HEIGHT_MAIN; y++) { for (x = 0; x < HILL_FLOOR_WIDTH; x++) - dst[x] = GetMetatileForFloor(mapId, x, y, HILL_FLOOR_WIDTH); + dst[x] = GetMapDataForFloor(mapId, x, y, HILL_FLOOR_WIDTH); dst += 31; } diff --git a/src/trainer_pokemon_sprites.c b/src/trainer_pokemon_sprites.c index c15f4bc5010b..6dc2a6995643 100644 --- a/src/trainer_pokemon_sprites.c +++ b/src/trainer_pokemon_sprites.c @@ -68,7 +68,7 @@ static bool16 DecompressPic(u16 species, u32 personality, bool8 isFrontPic, u8 * if (isFrontPic) DecompressPicFromTable(&gTrainerSprites[species].frontPic, dest); else - DecompressPicFromTable(&gTrainerBacksprites[species].backPic, dest); + CopyTrainerBackspriteFramesToDest(species, dest); } return FALSE; } @@ -357,3 +357,11 @@ u16 PlayerGenderToFrontTrainerPicId_Debug(u8 gender, bool8 getClass) } return gender; } + +void CopyTrainerBackspriteFramesToDest(u8 trainerPicId, u8 *dest) +{ + const struct SpriteFrameImage *frame = &gTrainerBacksprites[trainerPicId].backPic; + // y_offset is repurposed to indicates how many frames does the trainer pic have. + u32 size = (frame->size * gTrainerBacksprites[trainerPicId].coordinates.y_offset); + CpuSmartCopy16(frame->data, dest, size); +} diff --git a/src/trainer_pools.c b/src/trainer_pools.c index a2db4d81f5a7..faf93fcc9edc 100644 --- a/src/trainer_pools.c +++ b/src/trainer_pools.c @@ -1,5 +1,6 @@ #include "global.h" #include "data.h" +#include "item.h" #include "malloc.h" #include "pokemon.h" #include "random.h" @@ -166,10 +167,14 @@ static u32 PickMonFromPool(const struct Trainer *trainer, u8 *poolIndexArray, u3 // If no mon has been found yet continue looking if (monIndex == POOL_SLOT_DISABLED) monIndex = pickFunctions.OtherFunction(trainer, poolIndexArray, partyIndex, monsCount, battleTypeFlags, rules); + // If a mon still hasn't been found, return POOL_SLOT_DISABLED which makes party generation default to regular party generation + if (monIndex == POOL_SLOT_DISABLED) + return monIndex; + u32 chosenTags = trainer->party[monIndex].tags; u16 chosenSpecies = trainer->party[monIndex].species; u16 chosenItem = trainer->party[monIndex].heldItem; - u16 chosenNatDex = gSpeciesInfo[chosenSpecies].natDexNum; + enum NationalDexOrder chosenNatDex = gSpeciesInfo[chosenSpecies].natDexNum; // If tag was required, change pool rule to account for the required tag already being picked u32 tagsToEliminate = 0; for (u32 currTag = 0; currTag < POOL_NUM_TAGS; currTag++) @@ -197,7 +202,7 @@ static u32 PickMonFromPool(const struct Trainer *trainer, u8 *poolIndexArray, u3 u32 currentTags = trainer->party[poolIndexArray[currIndex]].tags; u16 currentSpecies = trainer->party[poolIndexArray[currIndex]].species; u16 currentItem = trainer->party[poolIndexArray[currIndex]].heldItem; - u16 currentNatDex = gSpeciesInfo[currentSpecies].natDexNum; + enum NationalDexOrder currentNatDex = gSpeciesInfo[currentSpecies].natDexNum; if (currentTags & tagsToEliminate) { poolIndexArray[currIndex] = POOL_SLOT_DISABLED; @@ -227,6 +232,10 @@ static u32 PickMonFromPool(const struct Trainer *trainer, u8 *poolIndexArray, u3 poolIndexArray[currIndex] = POOL_SLOT_DISABLED; } } + if (rules->megaStoneClause && gItemsInfo[currentItem].sortType == ITEM_TYPE_MEGA_STONE && gItemsInfo[chosenItem].sortType == ITEM_TYPE_MEGA_STONE) + poolIndexArray[currIndex] = POOL_SLOT_DISABLED; + if (rules->zCrystalClause && gItemsInfo[currentItem].sortType == ITEM_TYPE_Z_CRYSTAL && gItemsInfo[chosenItem].sortType == ITEM_TYPE_Z_CRYSTAL) + poolIndexArray[currIndex] = POOL_SLOT_DISABLED; } } return monIndex; diff --git a/src/trainer_see.c b/src/trainer_see.c index 0a3b68f8c259..bf66f66e2ece 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -19,6 +19,7 @@ #include "constants/event_objects.h" #include "constants/event_object_movement.h" #include "constants/field_effects.h" +#include "constants/script_commands.h" #include "constants/trainer_types.h" // this file's functions @@ -360,6 +361,8 @@ static const struct SpriteTemplate sSpriteTemplate_Emote = bool8 CheckForTrainersWantingBattle(void) { u8 i; + u8 trainerObjects[OBJECT_EVENTS_COUNT] = {0}; + u8 trainerObjectsCount = 0; if (FlagGet(OW_FLAG_NO_TRAINER_SEE)) return FALSE; @@ -367,19 +370,37 @@ bool8 CheckForTrainersWantingBattle(void) gNoOfApproachingTrainers = 0; gApproachingTrainerId = 0; + // Adds trainers wanting to battle to array for (i = 0; i < OBJECT_EVENTS_COUNT; i++) - { - u8 numTrainers; - + { if (!gObjectEvents[i].active) continue; - if (gObjectEvents[i].trainerType != TRAINER_TYPE_NORMAL && gObjectEvents[i].trainerType != TRAINER_TYPE_BURIED) + if (gObjectEvents[i].trainerType != TRAINER_TYPE_NORMAL && gObjectEvents[i].trainerType != TRAINER_TYPE_SEE_ALL_DIRECTIONS && gObjectEvents[i].trainerType != TRAINER_TYPE_BURIED) continue; + trainerObjects[trainerObjectsCount++] = i; + } - numTrainers = CheckTrainer(i); - if (numTrainers == 0xFF) // non-trainerbatle script + // Sorts array by localId + for (i = 1; i <= trainerObjectsCount; i++) + { + u8 x = trainerObjects[i]; + u8 j = i; + while (j > 0 && gObjectEvents[trainerObjects[j-1]].localId > gObjectEvents[x].localId) + { + trainerObjects[j] = trainerObjects[j-1]; + j--; + } + trainerObjects[j] = x; + } + + for (i = 0; i <= trainerObjectsCount; i++) + { + u8 numTrainers; + numTrainers = CheckTrainer(trainerObjects[i]); + if (numTrainers == 0xFF) // non-trainerbattle script { u32 objectEventId = gApproachingTrainers[gNoOfApproachingTrainers - 1].objectEventId; + gApproachingTrainers[gNoOfApproachingTrainers - 1].trainerScriptPtr = GetObjectEventScriptPointerByObjectEventId(objectEventId); gSelectedObjectEvent = objectEventId; gSpecialVar_LastTalked = gObjectEvents[objectEventId].localId; ScriptContext_SetupScript(EventScript_ObjectApproachPlayer); @@ -429,7 +450,7 @@ bool8 CheckForTrainersWantingBattle(void) static u8 CheckTrainer(u8 objectEventId) { - const u8 *scriptPtr, *trainerBattlePtr; + const u8 *trainerBattlePtr; u8 numTrainers = 1; u8 approachDistance = GetTrainerApproachDistance(&gObjectEvents[objectEventId]); @@ -438,15 +459,15 @@ static u8 CheckTrainer(u8 objectEventId) if (InTrainerHill() == TRUE) { - trainerBattlePtr = scriptPtr = GetTrainerHillTrainerScript(); + trainerBattlePtr = GetTrainerHillTrainerScript(); } else { - trainerBattlePtr = scriptPtr = GetObjectEventScriptPointerByObjectEventId(objectEventId); + trainerBattlePtr = GetObjectEventScriptPointerByObjectEventId(objectEventId); struct ScriptContext ctx; - if (RunScriptImmediatelyUntilEffect(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE | SCREFF_TRAINERBATTLE, scriptPtr, &ctx)) + if (RunScriptImmediatelyUntilEffect(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE | SCREFF_TRAINERBATTLE, trainerBattlePtr, &ctx)) { - if (*ctx.scriptPtr == 0x5c) // trainerbattle + if (*ctx.scriptPtr == SCR_OP_TRAINERBATTLE) trainerBattlePtr = ctx.scriptPtr; else trainerBattlePtr = NULL; @@ -457,7 +478,7 @@ static u8 CheckTrainer(u8 objectEventId) } } - if (InBattlePyramid()) + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) { if (GetBattlePyramidTrainerFlag(objectEventId)) return 0; @@ -470,7 +491,18 @@ static u8 CheckTrainer(u8 objectEventId) else if (trainerBattlePtr) { if (GetTrainerFlagFromScriptPointer(trainerBattlePtr)) - return 0; + { + //If there is a rematch, we want to trigger the approach sequence + if (I_VS_SEEKER_CHARGING && GetRematchFromScriptPointer(trainerBattlePtr)) + { + trainerBattlePtr = NULL; + numTrainers = 0xFF; + } + else + { + return 0; + } + } } else { @@ -492,7 +524,7 @@ static u8 CheckTrainer(u8 objectEventId) } gApproachingTrainers[gNoOfApproachingTrainers].objectEventId = objectEventId; - gApproachingTrainers[gNoOfApproachingTrainers].trainerScriptPtr = scriptPtr; + gApproachingTrainers[gNoOfApproachingTrainers].trainerScriptPtr = trainerBattlePtr; gApproachingTrainers[gNoOfApproachingTrainers].radius = approachDistance; InitTrainerApproachTask(&gObjectEvents[objectEventId], approachDistance - 1); gNoOfApproachingTrainers++; @@ -509,6 +541,9 @@ static u8 GetTrainerApproachDistance(struct ObjectEvent *trainerObj) PlayerGetDestCoords(&x, &y); if (trainerObj->trainerType == TRAINER_TYPE_NORMAL) // can only see in one direction { + // Disable trainer approach while moving diagonally (usually moving on sideway stairs) + if (trainerObj->facingDirection > DIR_EAST) + return 0; approachDistance = sDirectionalApproachDistanceFuncs[trainerObj->facingDirection - 1](trainerObj, trainerObj->trainerRange_berryTreeId, x, y); return CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, trainerObj->facingDirection); } @@ -951,13 +986,17 @@ u8 FldEff_HeartIcon(void) return 0; } - u8 FldEff_DoubleExclMarkIcon(void) { u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_ExclamationQuestionMark, 0, 0, 0x53); if (spriteId != MAX_SPRITES) - SetIconSpriteData(&gSprites[spriteId], FLDEFF_EXCLAMATION_MARK_ICON, 2); + { + struct Sprite *sprite = &gSprites[spriteId]; + + SetIconSpriteData(sprite, FLDEFF_DOUBLE_EXCL_MARK_ICON, 2); + UpdateSpritePaletteByTemplate(&sSpriteTemplate_ExclamationQuestionMark, sprite); + } return 0; } @@ -967,7 +1006,12 @@ u8 FldEff_XIcon(void) u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_ExclamationQuestionMark, 0, 0, 0x53); if (spriteId != MAX_SPRITES) - SetIconSpriteData(&gSprites[spriteId], FLDEFF_EXCLAMATION_MARK_ICON, 3); + { + struct Sprite *sprite = &gSprites[spriteId]; + + SetIconSpriteData(sprite, FLDEFF_X_ICON, 3); + UpdateSpritePaletteByTemplate(&sSpriteTemplate_ExclamationQuestionMark, sprite); + } return 0; } diff --git a/src/trainer_slide.c b/src/trainer_slide.c index 3b94894a793f..080c1d4bbc9b 100644 --- a/src/trainer_slide.c +++ b/src/trainer_slide.c @@ -312,7 +312,7 @@ static bool32 IsSlideInitalizedOrPlayed(enum TrainerSlideType slideId) return FALSE; } -void TryInitializeFirstSTABMoveTrainerSlide(u32 battlerDef, u32 battlerAtk, u32 moveType) +void TryInitializeFirstSTABMoveTrainerSlide(u32 battlerDef, u32 battlerAtk, enum Type moveType) { enum TrainerSlideType slideId = TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE; diff --git a/src/tv.c b/src/tv.c index 4faf848f4211..114c7ff10247 100644 --- a/src/tv.c +++ b/src/tv.c @@ -2394,8 +2394,8 @@ void TryPutFrontierTVShowOnAir(u16 winStreak, u8 facilityAndMode) show->frontier.species2 = GetMonData(&gPlayerParty[1], MON_DATA_SPECIES, NULL); break; case FRONTIER_SHOW_TOWER_LINK_MULTIS: - show->frontier.species1 = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[0] - 1], MON_DATA_SPECIES, NULL); - show->frontier.species2 = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[1] - 1], MON_DATA_SPECIES, NULL); + show->frontier.species1 = GetMonData(GetSavedPlayerPartyMon(gSaveBlock2Ptr->frontier.selectedPartyMons[0] - 1), MON_DATA_SPECIES, NULL); + show->frontier.species2 = GetMonData(GetSavedPlayerPartyMon(gSaveBlock2Ptr->frontier.selectedPartyMons[1] - 1), MON_DATA_SPECIES, NULL); break; } StorePlayerIdInRecordMixShow(show); diff --git a/src/type_icons.c b/src/type_icons.c index c47690fcaeb3..237c2c9a4fc3 100644 --- a/src/type_icons.c +++ b/src/type_icons.c @@ -14,18 +14,18 @@ static void LoadTypeIconsPerBattler(u32, u32); static bool32 UseDoubleBattleCoords(u32); -static u32 GetMonPublicType(u32, u32); +static enum Type GetMonPublicType(u32, u32); static bool32 ShouldHideUncaughtType(u32 species); static bool32 ShouldHideUnseenType(u32 species); -static u32 GetMonDefensiveTeraType(struct Pokemon *, struct Pokemon*, u32, u32, u32, u32); -static u32 IsIllusionActiveAndTypeUnchanged(struct Pokemon*, u32, u32); +static enum Type GetMonDefensiveTeraType(struct Pokemon *, struct Pokemon*, u32, u32, u32, u32); +static bool32 IsIllusionActiveAndTypeUnchanged(struct Pokemon*, u32, u32); -static void CreateSpriteFromType(u32, bool32, u32[], u32, u32); -static bool32 ShouldSkipSecondType(u32[], u32); +static void CreateSpriteFromType(u32, bool32, enum Type[], u32, u32); +static bool32 ShouldSkipSecondType(enum Type[], u32); static void SetTypeIconXY(s32*, s32*, u32, bool32, u32); -static void CreateSpriteAndSetTypeSpriteAttributes(u32, u32 x, u32 y, u32, u32, bool32); -static bool32 ShouldFlipTypeIcon(bool32, u32, u32); +static void CreateSpriteAndSetTypeSpriteAttributes(enum Type, u32 x, u32 y, u32, u32, bool32); +static bool32 ShouldFlipTypeIcon(bool32, u32, enum Type); static void SpriteCB_TypeIcon(struct Sprite*); static void DestroyTypeIcon(struct Sprite*); @@ -266,7 +266,8 @@ static void LoadTypeSpritesAndPalettes(void) static void LoadTypeIconsPerBattler(u32 battler, u32 position) { - u32 typeNum, types[2]; + u32 typeNum; + enum Type types[2]; u32 battlerId = GetBattlerAtPosition(position); bool32 useDoubleBattleCoords = UseDoubleBattleCoords(battlerId); @@ -294,11 +295,11 @@ static bool32 UseDoubleBattleCoords(u32 position) return TRUE; } -static u32 GetMonPublicType(u32 battlerId, u32 typeNum) +static enum Type GetMonPublicType(u32 battlerId, u32 typeNum) { - struct Pokemon* mon = GetBattlerMon(battlerId); + struct Pokemon *mon = GetBattlerMon(battlerId); u32 monSpecies = GetMonData(mon,MON_DATA_SPECIES,NULL); - struct Pokemon* monIllusion; + struct Pokemon *monIllusion; u32 illusionSpecies; if (ShouldHideUncaughtType(monSpecies) || ShouldHideUnseenType(monSpecies)) @@ -311,7 +312,7 @@ static u32 GetMonPublicType(u32 battlerId, u32 typeNum) return GetMonDefensiveTeraType(mon,monIllusion,battlerId,typeNum,illusionSpecies,monSpecies); if (IsIllusionActiveAndTypeUnchanged(monIllusion,monSpecies, battlerId)) - return gSpeciesInfo[illusionSpecies].types[typeNum]; + return GetSpeciesType(illusionSpecies, typeNum); return gBattleMons[battlerId].types[typeNum]; } @@ -338,9 +339,9 @@ static bool32 ShouldHideUnseenType(u32 species) return TRUE; } -static u32 GetMonDefensiveTeraType(struct Pokemon * mon, struct Pokemon* monIllusion, u32 battlerId, u32 typeNum, u32 illusionSpecies, u32 monSpecies) +static enum Type GetMonDefensiveTeraType(struct Pokemon *mon, struct Pokemon *monIllusion, u32 battlerId, u32 typeNum, u32 illusionSpecies, u32 monSpecies) { - u32 teraType = GetBattlerTeraType(battlerId); + enum Type teraType = GetBattlerTeraType(battlerId); u32 targetSpecies; if (teraType != TYPE_STELLAR) @@ -348,10 +349,10 @@ static u32 GetMonDefensiveTeraType(struct Pokemon * mon, struct Pokemon* monIllu targetSpecies = (monIllusion != NULL) ? illusionSpecies : monSpecies; - return gSpeciesInfo[targetSpecies].types[typeNum]; + return GetSpeciesType(targetSpecies, typeNum); } -static u32 IsIllusionActiveAndTypeUnchanged(struct Pokemon* monIllusion, u32 monSpecies, u32 battlerId) +static bool32 IsIllusionActiveAndTypeUnchanged(struct Pokemon *monIllusion, u32 monSpecies, u32 battlerId) { u32 typeNum; @@ -359,13 +360,13 @@ static u32 IsIllusionActiveAndTypeUnchanged(struct Pokemon* monIllusion, u32 mon return FALSE; for (typeNum = 0; typeNum < 2; typeNum++) - if (gSpeciesInfo[monSpecies].types[typeNum] != gBattleMons[battlerId].types[typeNum]) + if (GetSpeciesType(monSpecies, typeNum) != gBattleMons[battlerId].types[typeNum]) return FALSE; return TRUE; } -static void CreateSpriteFromType(u32 position, bool32 useDoubleBattleCoords, u32 types[], u32 typeNum, u32 battler) +static void CreateSpriteFromType(u32 position, bool32 useDoubleBattleCoords, enum Type types[], u32 typeNum, u32 battler) { s32 x = 0, y = 0; @@ -377,7 +378,7 @@ static void CreateSpriteFromType(u32 position, bool32 useDoubleBattleCoords, u32 CreateSpriteAndSetTypeSpriteAttributes(types[typeNum], x, y, position, battler, useDoubleBattleCoords); } -static bool32 ShouldSkipSecondType(u32 types[], u32 typeNum) +static bool32 ShouldSkipSecondType(enum Type types[], u32 typeNum) { if (!typeNum) return FALSE; @@ -394,7 +395,7 @@ static void SetTypeIconXY(s32* x, s32* y, u32 position, bool32 useDoubleBattleCo *y = sTypeIconPositions[position][useDoubleBattleCoords].y + (11 * typeNum); } -static void CreateSpriteAndSetTypeSpriteAttributes(u32 type, u32 x, u32 y, u32 position, u32 battler, bool32 useDoubleBattleCoords) +static void CreateSpriteAndSetTypeSpriteAttributes(enum Type type, u32 x, u32 y, u32 position, u32 battler, bool32 useDoubleBattleCoords) { struct Sprite* sprite; const struct SpriteTemplate* spriteTemplate = gTypesInfo[type].useSecondTypeIconPalette ? &sSpriteTemplate_TypeIcons2 : &sSpriteTemplate_TypeIcons1; @@ -413,9 +414,9 @@ static void CreateSpriteAndSetTypeSpriteAttributes(u32 type, u32 x, u32 y, u32 p StartSpriteAnim(sprite, type); } -static bool32 ShouldFlipTypeIcon(bool32 useDoubleBattleCoords, u32 position, u32 typeId) +static bool32 ShouldFlipTypeIcon(bool32 useDoubleBattleCoords, u32 position, enum Type typeId) { - bool32 side = (useDoubleBattleCoords) ? B_SIDE_OPPONENT : B_SIDE_PLAYER; + enum BattleSide side = (useDoubleBattleCoords) ? B_SIDE_OPPONENT : B_SIDE_PLAYER; if (GetBattlerSide(GetBattlerAtPosition(position)) != side) return FALSE; @@ -423,7 +424,7 @@ static bool32 ShouldFlipTypeIcon(bool32 useDoubleBattleCoords, u32 position, u32 return !gTypesInfo[typeId].isSpecialCaseType; } -static void SpriteCB_TypeIcon(struct Sprite* sprite) +static void SpriteCB_TypeIcon(struct Sprite *sprite) { u32 position = sprite->tMonPosition; u32 battlerId = sprite->tBattlerId; @@ -487,7 +488,7 @@ static void FreeAllTypeIconResources(void) } } -static void (* const sShowTypesControllerFuncs[])(u32 battler) = +static void (*const sShowTypesControllerFuncs[])(u32 battler) = { PlayerHandleChooseMove, HandleChooseMoveAfterDma3, @@ -562,7 +563,7 @@ static s32 GetTypeIconSlideMovement(bool32 useDoubleBattleCoords, u32 position, static s32 GetTypeIconBounceMovement(s32 originalY, u32 position) { - struct Sprite* healthbox = &gSprites[gHealthboxSpriteIds[GetBattlerAtPosition(position)]]; + struct Sprite *healthbox = &gSprites[gHealthboxSpriteIds[GetBattlerAtPosition(position)]]; return originalY + healthbox->y2; } diff --git a/src/union_room.c b/src/union_room.c index 6042c6420aad..368becd0a27f 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -205,7 +205,7 @@ static EWRAM_DATA union } sWirelessLinkMain = {}; EWRAM_DATA struct RfuGameCompatibilityData gRfuPartnerCompatibilityData = {}; EWRAM_DATA u16 gUnionRoomOfferedSpecies = 0; -EWRAM_DATA u8 gUnionRoomRequestedMonType = 0; +EWRAM_DATA enum Type gUnionRoomRequestedMonType = 0; static EWRAM_DATA struct UnionRoomTrade sUnionRoomTrade = {}; static struct WirelessLink_Leader *sLeader; @@ -270,7 +270,7 @@ static void GetURoomActivityRejectMsg(u8 *, s32, u32); static u32 ConvPartnerUnameAndGetWhetherMetAlready(struct RfuPlayer *); static void GetURoomActivityStartMsg(u8 *, u8); static void UR_ClearBg0(void); -static s32 IsRequestedTradeInPlayerParty(u32, u32); +static s32 IsRequestedTradeInPlayerParty(enum Type, u32); static bool32 UR_PrintFieldMessage(const u8 *); static s32 GetChatLeaderActionRequestMessage(u8 *, u32, u16 *, struct WirelessLink_URoom *); static void Task_InitUnionRoom(u8 taskId); @@ -3612,7 +3612,7 @@ static bool8 PrintOnTextbox(u8 *textState, const u8 *str) LoadMessageBoxAndBorderGfx(); DrawDialogueFrame(0, TRUE); StringExpandPlaceholders(gStringVar4, str); - AddTextPrinterForMessage_2(TRUE); + AddTextPrinterForMessage(TRUE); (*textState)++; break; case 1: @@ -4104,7 +4104,7 @@ static void TradeBoardPrintItemInfo(u8 windowId, u8 y, struct RfuGameData *data, { u8 levelStr[4]; u16 species = data->tradeSpecies; - u8 type = data->tradeType; + enum Type type = data->tradeType; u8 level = data->tradeLevel; PrintUnionRoomText(windowId, FONT_NORMAL, playerName, 8, y, colorIdx); @@ -4174,7 +4174,7 @@ static s32 GetUnionRoomPlayerGender(s32 playerIdx, struct RfuPlayerList *list) return list->players[playerIdx].rfu.data.playerGender; } -static s32 IsRequestedTradeInPlayerParty(u32 type, u32 species) +static s32 IsRequestedTradeInPlayerParty(enum Type type, u32 species) { s32 i; @@ -4193,7 +4193,7 @@ static s32 IsRequestedTradeInPlayerParty(u32 type, u32 species) for (i = 0; i < gPlayerPartyCount; i++) { species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG); - if (gSpeciesInfo[species].types[0] == type || gSpeciesInfo[species].types[1] == type) + if (GetSpeciesType(species, 0) == type || GetSpeciesType(species, 1) == type) return UR_TRADE_MATCH; } return UR_TRADE_NOTYPE; diff --git a/src/union_room_chat.c b/src/union_room_chat.c index b32f23c467ee..17f5097c683c 100644 --- a/src/union_room_chat.c +++ b/src/union_room_chat.c @@ -752,10 +752,10 @@ static const struct MenuAction sKeyboardPageTitleTexts[UNION_ROOM_KB_PAGE_COUNT }; static const u16 sUnionRoomChatInterfacePal[] = INCBIN_U16("graphics/union_room_chat/interface.gbapal"); -static const u32 sKeyboardCursorTiles[] = INCBIN_U32("graphics/union_room_chat/keyboard_cursor.4bpp.lz"); -static const u32 sTextEntryCursorTiles[] = INCBIN_U32("graphics/union_room_chat/text_entry_cursor.4bpp.lz"); -static const u32 sTextEntryArrowTiles[] = INCBIN_U32("graphics/union_room_chat/text_entry_arrow.4bpp.lz"); -static const u32 sRButtonGfxTiles[] = INCBIN_U32("graphics/union_room_chat/r_button.4bpp.lz"); +static const u32 sKeyboardCursorTiles[] = INCBIN_U32("graphics/union_room_chat/keyboard_cursor.4bpp.smol"); +static const u32 sTextEntryCursorTiles[] = INCBIN_U32("graphics/union_room_chat/text_entry_cursor.4bpp.smol"); +static const u32 sTextEntryArrowTiles[] = INCBIN_U32("graphics/union_room_chat/text_entry_arrow.4bpp.smol"); +static const u32 sRButtonGfxTiles[] = INCBIN_U32("graphics/union_room_chat/r_button.4bpp.smol"); static const struct CompressedSpriteSheet sSpriteSheets[] = { {.data = sKeyboardCursorTiles, .size = 0x1000, .tag = GFXTAG_KEYBOARD_CURSOR}, diff --git a/src/use_pokeblock.c b/src/use_pokeblock.c index 7d6af9bd794a..db4541a7f155 100644 --- a/src/use_pokeblock.c +++ b/src/use_pokeblock.c @@ -50,7 +50,7 @@ enum { struct UsePokeblockSession { void (*callback)(void); - void (*exitCallback)(void); + MainCallback exitCallback; struct Pokeblock *pokeblock; struct Pokemon *mon; u8 stringBuffer[64]; @@ -162,7 +162,7 @@ extern const u16 gConditionText_Pal[]; // The below 3 are saved for returning to the screen after feeding a pokeblock to a mon // so that the rest of the data can be freed static EWRAM_DATA struct UsePokeblockSession *sInfo = NULL; -static EWRAM_DATA void (*sExitCallback)(void) = NULL; +static EWRAM_DATA MainCallback sExitCallback = NULL; static EWRAM_DATA struct Pokeblock *sPokeblock = NULL; EWRAM_DATA u8 gPokeblockMonId = 0; EWRAM_DATA s16 gPokeblockGain = 0; @@ -173,8 +173,8 @@ static EWRAM_DATA struct UsePokeblockMenu *sMenu = NULL; static const u32 sMonFrame_Pal[] = INCBIN_U32("graphics/pokeblock/use_screen/mon_frame_pal.bin"); static const u32 sMonFrame_Gfx[] = INCBIN_U32("graphics/pokeblock/use_screen/mon_frame.4bpp"); -static const u32 sMonFrame_Tilemap[] = INCBIN_U32("graphics/pokeblock/use_screen/mon_frame.bin.lz"); -static const u32 sGraphData_Tilemap[] = INCBIN_U32("graphics/pokeblock/use_screen/graph_data.bin.lz"); +static const u32 sMonFrame_Tilemap[] = INCBIN_U32("graphics/pokeblock/use_screen/mon_frame.bin.smolTM"); +static const u32 sGraphData_Tilemap[] = INCBIN_U32("graphics/pokeblock/use_screen/graph_data.bin.smolTM"); // The condition/flavors aren't listed in their normal order in this file, they're listed as shown on the graph going counter-clockwise // Normally they would go Cool/Spicy, Beauty/Dry, Cute/Sweet, Smart/Bitter, Tough/Sour (also graph order, but clockwise) @@ -1334,7 +1334,7 @@ static bool8 LoadUsePokeblockMenuGfx(void) sMonFrame_TilemapPtr = Alloc(1280); break; case 2: - LZ77UnCompVram(sMonFrame_Tilemap, sMonFrame_TilemapPtr); + DecompressDataWithHeaderVram(sMonFrame_Tilemap, sMonFrame_TilemapPtr); break; case 3: LoadBgTiles(3, sMonFrame_Gfx, 224, 0); @@ -1347,10 +1347,10 @@ static bool8 LoadUsePokeblockMenuGfx(void) sMenu->curMonXOffset = -80; break; case 6: - LZ77UnCompVram(gUsePokeblockGraph_Gfx, sGraph_Gfx); + DecompressDataWithHeaderVram(gUsePokeblockGraph_Gfx, sGraph_Gfx); break; case 7: - LZ77UnCompVram(gUsePokeblockGraph_Tilemap, sGraph_Tilemap); + DecompressDataWithHeaderVram(gUsePokeblockGraph_Tilemap, sGraph_Tilemap); LoadPalette(gUsePokeblockGraph_Pal, BG_PLTT_ID(2), PLTT_SIZE_4BPP); break; case 8: @@ -1362,7 +1362,7 @@ static bool8 LoadUsePokeblockMenuGfx(void) CopyBgTilemapBufferToVram(1); break; case 10: - LZ77UnCompVram(sGraphData_Tilemap, sMenu->tilemapBuffer); + DecompressDataWithHeaderVram(sGraphData_Tilemap, sMenu->tilemapBuffer); break; case 11: LoadBgTilemap(2, sMenu->tilemapBuffer, 1280, 0); diff --git a/src/vs_seeker.c b/src/vs_seeker.c index 15829c3bd551..48bdbc2abbdf 100644 --- a/src/vs_seeker.c +++ b/src/vs_seeker.c @@ -15,6 +15,7 @@ #include "battle_setup.h" #include "random.h" #include "field_player_avatar.h" +#include "fieldmap.h" #include "vs_seeker.h" #include "menu.h" #include "string_util.h" @@ -28,9 +29,12 @@ #include "constants/items.h" #include "constants/maps.h" #include "constants/songs.h" +#include "constants/script_commands.h" #include "constants/trainer_types.h" #include "constants/field_effects.h" +// Documentation for the Vs. Seeker can be found in docs/tutorials/vs_seeker.md. + enum { VSSEEKER_NOT_CHARGED, @@ -230,6 +234,9 @@ bool8 UpdateVsSeekerStepCounter(void) if (!I_VS_SEEKER_CHARGING) return FALSE; + // This condition helps in case your save file is switching between vs seeker and matchcall + if (gSaveBlock1Ptr->trainerRematchStepCounter > VSSEEKER_RECHARGE_STEPS && gSaveBlock1Ptr->trainerRematchStepCounter <= 0xFF) + gSaveBlock1Ptr->trainerRematchStepCounter = 0; if (CheckBagHasItem(ITEM_VS_SEEKER, 1)) { if ((gSaveBlock1Ptr->trainerRematchStepCounter & 0xFF) < VSSEEKER_RECHARGE_STEPS) @@ -376,13 +383,16 @@ static void GatherNearbyTrainerInfo(void) if (templates[objectEventIdx].trainerType != TRAINER_TYPE_NORMAL && templates[objectEventIdx].trainerType != TRAINER_TYPE_BURIED) continue; + u16 trainerIdx = GetTrainerFlagFromScript(templates[objectEventIdx].script); + if (trainerIdx == TRAINER_NONE) + continue; sVsSeeker->trainerInfo[vsSeekerObjectIdx].script = templates[objectEventIdx].script; - sVsSeeker->trainerInfo[vsSeekerObjectIdx].trainerIdx = GetTrainerFlagFromScript(templates[objectEventIdx].script); + sVsSeeker->trainerInfo[vsSeekerObjectIdx].trainerIdx = trainerIdx; sVsSeeker->trainerInfo[vsSeekerObjectIdx].localId = templates[objectEventIdx].localId; TryGetObjectEventIdByLocalIdAndMap(templates[objectEventIdx].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectEventId); sVsSeeker->trainerInfo[vsSeekerObjectIdx].objectEventId = objectEventId; - sVsSeeker->trainerInfo[vsSeekerObjectIdx].xCoord = gObjectEvents[objectEventId].currentCoords.x - 7; - sVsSeeker->trainerInfo[vsSeekerObjectIdx].yCoord = gObjectEvents[objectEventId].currentCoords.y - 7; + sVsSeeker->trainerInfo[vsSeekerObjectIdx].xCoord = gObjectEvents[objectEventId].currentCoords.x - MAP_OFFSET; + sVsSeeker->trainerInfo[vsSeekerObjectIdx].yCoord = gObjectEvents[objectEventId].currentCoords.y - MAP_OFFSET; sVsSeeker->trainerInfo[vsSeekerObjectIdx].graphicsId = templates[objectEventIdx].graphicsId; vsSeekerObjectIdx++; } @@ -529,7 +539,6 @@ void ClearRematchMovementByTrainerId(void) TryGetObjectEventIdByLocalIdAndMap(objectEventTemplates[i].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objEventId); objectEvent = &gObjectEvents[objEventId]; - GetRandomFaceDirectionMovementType(&objectEventTemplates[i]); TryOverrideTemplateCoordsForObjectEvent(objectEvent, sFaceDirectionMovementTypeByFacingDirection[objectEvent->facingDirection]); if (gSelectedObjectEvent == objEventId) @@ -705,23 +714,36 @@ static u8 GetResponseMovementTypeFromTrainerGraphicsId(u8 graphicsId) #endif //FREE_MATCH_CALL static u16 GetTrainerFlagFromScript(const u8 *script) - /* - * The trainer flag is a little-endian short located +2 from - * the script pointer, assuming the trainerbattle command is - * first in the script. Because scripts are unaligned, and - * because the ARM processor requires shorts to be 16-bit - * aligned, this function needs to perform explicit bitwise - * operations to get the correct flag. - * - * 5c XX YY ZZ ... - * -- -- - */ { + // The trainer flag is located 3 bytes (command + flags + localIdA) from the script pointer, assuming the trainerbattle command is first in the script. + // Because scripts are unaligned, and because the ARM processor requires shorts to be 16-bit aligned, this function needs to perform explicit bitwise operations to get the correct flag. u16 trainerFlag; - - script += 2; - trainerFlag = script[0]; - trainerFlag |= script[1] << 8; + switch (script[0]) + { + case SCR_OP_TRAINERBATTLE: + script += 3; + trainerFlag = script[0]; + trainerFlag |= script[1] << 8; + break; + case SCR_OP_CALLNATIVE: + { + u32 callnativeFunc = (((((script[4] << 8) + script[3]) << 8) + script[2]) << 8) + script[1]; + if (callnativeFunc == ((u32)NativeVsSeekerRematchId | 0xA000000)) // | 0xA000000 corresponds to the request_effects=1 version of the function + { + script += 5; + trainerFlag = script[0]; + trainerFlag |= script[1] << 8; + } + else + { + trainerFlag = TRAINER_NONE; + } + break; + } + default: + trainerFlag = TRAINER_NONE; + break; + } return trainerFlag; } @@ -745,8 +767,8 @@ static bool8 IsTrainerVisibleOnScreen(struct VsSeekerTrainerInfo * trainerInfo) s16 y; PlayerGetDestCoords(&x, &y); - x -= 7; - y -= 7; + x -= MAP_OFFSET; + y -= MAP_OFFSET; if ( x - 7 <= trainerInfo->xCoord && x + 7 >= trainerInfo->xCoord @@ -800,6 +822,14 @@ static u8 GetCurVsSeekerResponse(s32 vsSeekerIdx, u16 trainerIdx) } #endif //FREE_MATCH_CALL +void NativeVsSeekerRematchId(struct ScriptContext *ctx) +{ + u16 trainerId = ScriptReadHalfword(ctx); + if (ctx->breakOnTrainerBattle && HasTrainerBeenFought(trainerId) && !ShouldTryRematchBattleForTrainerId(trainerId)) + StopScript(ctx); +} + + static void StartAllRespondantIdleMovements(void) { #if FREE_MATCH_CALL == FALSE diff --git a/src/wallclock.c b/src/wallclock.c index ab1add25a0b5..6bc87513ddd6 100644 --- a/src/wallclock.c +++ b/src/wallclock.c @@ -61,9 +61,9 @@ enum { }; enum { - MOVE_NONE, - MOVE_BACKWARD, - MOVE_FORWARD, + CLOCK_MOVE_NONE, + CLOCK_MOVE_BACKWARD, + CLOCK_MOVE_FORWARD, }; enum { @@ -71,7 +71,7 @@ enum { WIN_BUTTON_LABEL, }; -static const u32 sHand_Gfx[] = INCBIN_U32("graphics/wallclock/hand.4bpp.lz"); +static const u32 sHand_Gfx[] = INCBIN_U32("graphics/wallclock/hand.4bpp.smol"); static const u16 sTextPrompt_Pal[] = INCBIN_U16("graphics/wallclock/text_prompt.gbapal"); // for "Cancel" or "Confirm" static const struct WindowTemplate sWindowTemplates[] = @@ -644,7 +644,7 @@ static void LoadWallClockGraphics(void) DmaFillLarge16(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000); DmaClear32(3, (void *)OAM, OAM_SIZE); DmaClear16(3, (void *)PLTT, PLTT_SIZE); - LZ77UnCompVram(gWallClock_Gfx, (void *)VRAM); + DecompressDataWithHeaderVram(gWallClock_Gfx, (void *)VRAM); if (gSpecialVar_0x8004 == MALE) LoadPalette(gWallClockMale_Pal, BG_PLTT_ID(0), PLTT_SIZE_4BPP); @@ -689,16 +689,16 @@ void CB2_StartWallClock(void) u8 spriteId; LoadWallClockGraphics(); - LZ77UnCompVram(gWallClockStart_Tilemap, (u16 *)BG_SCREEN_ADDR(7)); + DecompressDataWithHeaderVram(gWallClockStart_Tilemap, (u16 *)BG_SCREEN_ADDR(7)); taskId = CreateTask(Task_SetClock_WaitFadeIn, 0); - gTasks[taskId].tHours = 10; - gTasks[taskId].tMinutes = 0; + gTasks[taskId].tHours = gLocalTime.hours; + gTasks[taskId].tMinutes = gLocalTime.minutes; gTasks[taskId].tMoveDir = 0; - gTasks[taskId].tPeriod = 0; + gTasks[taskId].tPeriod = gTasks[taskId].tHours / 12; gTasks[taskId].tMoveSpeed = 0; - gTasks[taskId].tMinuteHandAngle = 0; - gTasks[taskId].tHourHandAngle = 300; + gTasks[taskId].tMinuteHandAngle = gTasks[taskId].tMinutes * 6; + gTasks[taskId].tHourHandAngle = (gTasks[taskId].tHours % 12) * 30 + (gTasks[taskId].tMinutes / 10) * 5; spriteId = CreateSprite(&sSpriteTemplate_MinuteHand, 120, 80, 1); gSprites[spriteId].sTaskId = taskId; @@ -733,7 +733,7 @@ void CB2_ViewWallClock(void) u8 angle2; LoadWallClockGraphics(); - LZ77UnCompVram(gWallClockView_Tilemap, (u16 *)BG_SCREEN_ADDR(7)); + DecompressDataWithHeaderVram(gWallClockView_Tilemap, (u16 *)BG_SCREEN_ADDR(7)); taskId = CreateTask(Task_ViewClock_WaitFadeIn, 0); InitClockWithRtc(taskId); @@ -806,15 +806,15 @@ static void Task_SetClock_HandleInput(u8 taskId) } else { - gTasks[taskId].tMoveDir = MOVE_NONE; + gTasks[taskId].tMoveDir = CLOCK_MOVE_NONE; if (JOY_HELD(DPAD_LEFT)) - gTasks[taskId].tMoveDir = MOVE_BACKWARD; + gTasks[taskId].tMoveDir = CLOCK_MOVE_BACKWARD; if (JOY_HELD(DPAD_RIGHT)) - gTasks[taskId].tMoveDir = MOVE_FORWARD; + gTasks[taskId].tMoveDir = CLOCK_MOVE_FORWARD; - if (gTasks[taskId].tMoveDir != MOVE_NONE) + if (gTasks[taskId].tMoveDir != CLOCK_MOVE_NONE) { if (gTasks[taskId].tMoveSpeed < 0xFF) gTasks[taskId].tMoveSpeed++; @@ -916,13 +916,13 @@ static u16 CalcNewMinHandAngle(u16 angle, u8 direction, u8 speed) u8 delta = CalcMinHandDelta(speed); switch (direction) { - case MOVE_BACKWARD: + case CLOCK_MOVE_BACKWARD: if (angle) angle -= delta; else angle = 360 - delta; break; - case MOVE_FORWARD: + case CLOCK_MOVE_FORWARD: if (angle < 360 - delta) angle += delta; else @@ -936,7 +936,7 @@ static bool32 AdvanceClock(u8 taskId, u8 direction) { switch (direction) { - case MOVE_BACKWARD: + case CLOCK_MOVE_BACKWARD: if (gTasks[taskId].tMinutes > 0) { gTasks[taskId].tMinutes--; @@ -953,7 +953,7 @@ static bool32 AdvanceClock(u8 taskId, u8 direction) UpdateClockPeriod(taskId, direction); } break; - case MOVE_FORWARD: + case CLOCK_MOVE_FORWARD: if (gTasks[taskId].tMinutes < 59) { gTasks[taskId].tMinutes++; @@ -979,7 +979,7 @@ static void UpdateClockPeriod(u8 taskId, u8 direction) u8 hours = gTasks[taskId].tHours; switch (direction) { - case MOVE_BACKWARD: + case CLOCK_MOVE_BACKWARD: switch (hours) { case 11: @@ -990,7 +990,7 @@ static void UpdateClockPeriod(u8 taskId, u8 direction) break; } break; - case MOVE_FORWARD: + case CLOCK_MOVE_FORWARD: switch (hours) { case 0: diff --git a/src/wild_encounter.c b/src/wild_encounter.c index f77fe272d6bf..4c81fa371c6d 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -1,20 +1,24 @@ #include "global.h" -#include "wild_encounter.h" -#include "pokemon.h" -#include "metatile_behavior.h" +#include "battle_setup.h" +#include "battle_pike.h" +#include "battle_pyramid.h" +#include "event_data.h" #include "fieldmap.h" +#include "fishing.h" #include "follower_npc.h" #include "random.h" #include "field_player_avatar.h" -#include "event_data.h" -#include "safari_zone.h" +#include "link.h" +#include "metatile_behavior.h" #include "overworld.h" #include "pokeblock.h" -#include "battle_setup.h" +#include "pokemon.h" +#include "random.h" #include "roamer.h" -#include "tv.h" -#include "link.h" +#include "safari_zone.h" #include "script.h" +#include "tv.h" +#include "wild_encounter.h" #include "battle_debug.h" #include "battle_pike.h" #include "battle_pyramid.h" @@ -43,15 +47,14 @@ extern const u8 EventScript_SprayWoreOff[]; static u16 FeebasRandom(void); static void FeebasSeedRng(u16 seed); -static void UpdateChainFishingStreak(); static bool8 IsWildLevelAllowedByRepel(u8 level); static void ApplyFluteEncounterRateMod(u32 *encRate); static void ApplyCleanseTagEncounterRateMod(u32 *encRate); static u8 GetMaxLevelOfSpeciesInWildTable(const struct WildPokemon *wildMon, u16 species, enum WildPokemonArea area); #ifdef BUGFIX -static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u16 ability, u8 *monIndex, u32 size); +static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, enum Type type, enum Ability ability, u8 *monIndex, u32 size); #else -static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u16 ability, u8 *monIndex); +static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, enum Type type, enum Ability ability, u8 *monIndex); #endif static bool8 IsAbilityAllowingEncounter(u8 level); @@ -178,7 +181,7 @@ static void FeebasSeedRng(u16 seed) } // LAND_WILD_COUNT -u8 ChooseWildMonIndex_Land(void) +u32 ChooseWildMonIndex_Land(void) { u8 wildMonIndex = 0; bool8 swap = FALSE; @@ -218,10 +221,10 @@ u8 ChooseWildMonIndex_Land(void) return wildMonIndex; } -// ROCK_WILD_COUNT / WATER_WILD_COUNT -u8 ChooseWildMonIndex_WaterRock(void) +// WATER_WILD_COUNT +u32 ChooseWildMonIndex_Water(void) { - u8 wildMonIndex = 0; + u32 wildMonIndex = 0; bool8 swap = FALSE; u8 rand = Random() % ENCOUNTER_CHANCE_WATER_MONS_TOTAL; @@ -245,8 +248,35 @@ u8 ChooseWildMonIndex_WaterRock(void) return wildMonIndex; } +// ROCK_WILD_COUNT +u32 ChooseWildMonIndex_Rocks(void) +{ + u32 wildMonIndex = 0; + bool8 swap = FALSE; + u8 rand = Random() % ENCOUNTER_CHANCE_ROCK_SMASH_MONS_TOTAL; + + if (rand < ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_0) + wildMonIndex = 0; + else if (rand >= ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_0 && rand < ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_1) + wildMonIndex = 1; + else if (rand >= ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_1 && rand < ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_2) + wildMonIndex = 2; + else if (rand >= ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_2 && rand < ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_3) + wildMonIndex = 3; + else + wildMonIndex = 4; + + if (LURE_STEP_COUNT != 0 && (Random() % 10 < 2)) + swap = TRUE; + + if (swap) + wildMonIndex = 4 - wildMonIndex; + + return wildMonIndex; +} + // FISH_WILD_COUNT -static u8 ChooseWildMonIndex_Fishing(u8 rod) +static u32 ChooseWildMonIndex_Fishing(u8 rod) { u8 wildMonIndex = 0; bool8 swap = FALSE; @@ -323,7 +353,7 @@ static u8 ChooseWildMonLevel(const struct WildPokemon *wildPokemon, u8 wildMonIn // check ability for max level mon if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) { - u16 ability = GetMonAbility(&gPlayerParty[0]); + enum Ability ability = GetMonAbility(&gPlayerParty[0]); if (ability == ABILITY_HUSTLE || ability == ABILITY_VITAL_SPIRIT || ability == ABILITY_PRESSURE) { if (Random() % 2 == 0) @@ -384,37 +414,33 @@ enum TimeOfDay GetTimeOfDayForEncounters(u32 headerId, enum WildPokemonArea area if (!OW_TIME_OF_DAY_ENCOUNTERS) return TIME_OF_DAY_DEFAULT; - if (InBattlePike() || InBattlePyramid()) - { + if (InBattlePike() || CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) return OW_TIME_OF_DAY_FALLBACK; - } - else + + switch (area) { - switch (area) - { - default: - case WILD_AREA_LAND: - wildMonInfo = gWildMonHeaders[headerId].encounterTypes[timeOfDay].landMonsInfo; - break; - case WILD_AREA_WATER: - wildMonInfo = gWildMonHeaders[headerId].encounterTypes[timeOfDay].waterMonsInfo; - break; - case WILD_AREA_ROCKS: - wildMonInfo = gWildMonHeaders[headerId].encounterTypes[timeOfDay].rockSmashMonsInfo; - break; - case WILD_AREA_FISHING: - wildMonInfo = gWildMonHeaders[headerId].encounterTypes[timeOfDay].fishingMonsInfo; - break; - case WILD_AREA_HIDDEN: - wildMonInfo = gWildMonHeaders[headerId].encounterTypes[timeOfDay].hiddenMonsInfo; - break; - } + default: + case WILD_AREA_LAND: + wildMonInfo = gWildMonHeaders[headerId].encounterTypes[timeOfDay].landMonsInfo; + break; + case WILD_AREA_WATER: + wildMonInfo = gWildMonHeaders[headerId].encounterTypes[timeOfDay].waterMonsInfo; + break; + case WILD_AREA_ROCKS: + wildMonInfo = gWildMonHeaders[headerId].encounterTypes[timeOfDay].rockSmashMonsInfo; + break; + case WILD_AREA_FISHING: + wildMonInfo = gWildMonHeaders[headerId].encounterTypes[timeOfDay].fishingMonsInfo; + break; + case WILD_AREA_HIDDEN: + wildMonInfo = gWildMonHeaders[headerId].encounterTypes[timeOfDay].hiddenMonsInfo; + break; } - if (wildMonInfo == NULL && !OW_TIME_OF_DAY_DISABLE_FALLBACK) + if (wildMonInfo == NULL && !OW_TIME_OF_DAY_DISABLE_FALLBACK) return OW_TIME_OF_DAY_FALLBACK; else - return timeOfDay; + return GenConfigTimeOfDay(timeOfDay); } u8 PickWildMonNature(void) @@ -529,10 +555,10 @@ static bool8 TryGenerateWildMon(const struct WildPokemonInfo *wildMonInfo, enum if (OW_STORM_DRAIN >= GEN_8 && TRY_GET_ABILITY_INFLUENCED_WILD_MON_INDEX(wildMonInfo->wildPokemon, TYPE_WATER, ABILITY_STORM_DRAIN, &wildMonIndex, WATER_WILD_COUNT)) break; - wildMonIndex = ChooseWildMonIndex_WaterRock(); + wildMonIndex = ChooseWildMonIndex_Water(); break; case WILD_AREA_ROCKS: - wildMonIndex = ChooseWildMonIndex_WaterRock(); + wildMonIndex = ChooseWildMonIndex_Rocks(); break; default: case WILD_AREA_FISHING: @@ -607,7 +633,7 @@ static bool8 WildEncounterCheck(u32 encounterRate, bool8 ignoreAbility) encounterRate *= 2; if (!ignoreAbility && !GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) { - u32 ability = GetMonAbility(&gPlayerParty[0]); + enum Ability ability = GetMonAbility(&gPlayerParty[0]); if (ability == ABILITY_STENCH && gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR) encounterRate = encounterRate * 3 / 4; @@ -937,22 +963,6 @@ bool8 DoesCurrentMapHaveFishingMons(void) return FALSE; } -u32 CalculateChainFishingShinyRolls(void) -{ - return (2 * min(gChainFishingDexNavStreak, FISHING_CHAIN_SHINY_STREAK_MAX)); -} - -static void UpdateChainFishingStreak() -{ - if (!I_FISHING_CHAIN) - return; - - if (gChainFishingDexNavStreak >= FISHING_CHAIN_LENGTH_MAX) - return; - - gChainFishingDexNavStreak++; -} - void FishingWildEncounter(u8 rod) { u16 species; @@ -1007,7 +1017,7 @@ u16 GetLocalWildMon(bool8 *isWaterMon) else if (landMonsInfo == NULL && waterMonsInfo != NULL) { *isWaterMon = TRUE; - return waterMonsInfo->wildPokemon[ChooseWildMonIndex_WaterRock()].species; + return waterMonsInfo->wildPokemon[ChooseWildMonIndex_Water()].species; } // Either land or water PokΓ©mon if ((Random() % 100) < 80) @@ -1017,7 +1027,7 @@ u16 GetLocalWildMon(bool8 *isWaterMon) else { *isWaterMon = TRUE; - return waterMonsInfo->wildPokemon[ChooseWildMonIndex_WaterRock()].species; + return waterMonsInfo->wildPokemon[ChooseWildMonIndex_Water()].species; } } @@ -1033,7 +1043,7 @@ u16 GetLocalWaterMon(void) const struct WildPokemonInfo *waterMonsInfo = gWildMonHeaders[headerId].encounterTypes[timeOfDay].waterMonsInfo; if (waterMonsInfo) - return waterMonsInfo->wildPokemon[ChooseWildMonIndex_WaterRock()].species; + return waterMonsInfo->wildPokemon[ChooseWildMonIndex_Water()].species; } return SPECIES_NONE; } @@ -1044,7 +1054,7 @@ bool8 UpdateRepelCounter(void) u16 steps = REPEL_LURE_STEPS(repelLureVar); bool32 isLure = IS_LAST_USED_LURE(repelLureVar); - if (InBattlePike() || InBattlePyramid()) + if (InBattlePike() || CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) return FALSE; if (InUnionRoom() == TRUE) return FALSE; @@ -1096,7 +1106,7 @@ static bool8 IsWildLevelAllowedByRepel(u8 wildLevel) static bool8 IsAbilityAllowingEncounter(u8 level) { - u16 ability; + enum Ability ability; if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) return TRUE; @@ -1112,7 +1122,7 @@ static bool8 IsAbilityAllowingEncounter(u8 level) return TRUE; } -static bool8 TryGetRandomWildMonIndexByType(const struct WildPokemon *wildMon, u8 type, u8 numMon, u8 *monIndex) +static bool8 TryGetRandomWildMonIndexByType(const struct WildPokemon *wildMon, enum Type type, u8 numMon, u8 *monIndex) { u8 validIndexes[numMon]; // variable length array, an interesting feature u8 i, validMonCount; @@ -1122,7 +1132,7 @@ static bool8 TryGetRandomWildMonIndexByType(const struct WildPokemon *wildMon, u for (validMonCount = 0, i = 0; i < numMon; i++) { - if (gSpeciesInfo[wildMon[i].species].types[0] == type || gSpeciesInfo[wildMon[i].species].types[1] == type) + if (GetSpeciesType(wildMon[i].species, 0) == type || GetSpeciesType(wildMon[i].species, 1) == type) validIndexes[validMonCount++] = i; } @@ -1166,9 +1176,9 @@ static u8 GetMaxLevelOfSpeciesInWildTable(const struct WildPokemon *wildMon, u16 } #ifdef BUGFIX -static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u16 ability, u8 *monIndex, u32 size) +static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, enum Type type, enum Ability ability, u8 *monIndex, u32 size) #else -static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u16 ability, u8 *monIndex) +static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, enum Type type, enum Ability ability, u8 *monIndex) #endif { if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) @@ -1226,7 +1236,7 @@ bool8 StandardWildEncounter_Debug(void) return TRUE; } -u8 ChooseHiddenMonIndex(void) +u32 ChooseHiddenMonIndex(void) { #ifdef ENCOUNTER_CHANCE_HIDDEN_MONS_TOTAL u8 rand = Random() % ENCOUNTER_CHANCE_HIDDEN_MONS_TOTAL; diff --git a/src/window.c b/src/window.c index f393b109def6..51b473e89ceb 100644 --- a/src/window.c +++ b/src/window.c @@ -3,15 +3,12 @@ #include "malloc.h" #include "bg.h" #include "blit.h" +#include "decompress.h" -// This global is set to 0 and never changed. -COMMON_DATA u8 gTransparentTileNumber = 0; COMMON_DATA void *gWindowBgTilemapBuffers[NUM_BACKGROUNDS] = {0}; extern u32 gWindowTileAutoAllocEnabled; EWRAM_DATA struct Window gWindows[WINDOWS_MAX] = {0}; -EWRAM_DATA static struct Window *sWindowPtr = NULL; -EWRAM_DATA static u16 sWindowSize = 0; static u32 GetNumActiveWindowsOnBg(u32 bgId); static u32 GetNumActiveWindowsOnBg8Bit(u32 bgId); @@ -102,7 +99,6 @@ bool32 InitWindows(const struct WindowTemplate *templates) } } - gTransparentTileNumber = 0; return TRUE; } @@ -374,7 +370,7 @@ void ClearWindowTilemap(u32 windowId) FillBgTilemapBufferRect( windowLocal.window.bg, - gTransparentTileNumber, + 0, windowLocal.window.tilemapLeft, windowLocal.window.tilemapTop, windowLocal.window.width, @@ -457,7 +453,7 @@ void CopyToWindowPixelBuffer(u32 windowId, const void *src, u16 size, u16 tileOf if (size != 0) CpuCopy16(src, gWindows[windowId].tileData + (32 * tileOffset), size); else - LZ77UnCompWram(src, gWindows[windowId].tileData + (32 * tileOffset)); + DecompressDataWithHeaderWram(src, gWindows[windowId].tileData + (32 * tileOffset)); } // Sets all pixels within the window to the fillValue color. @@ -697,20 +693,20 @@ void BlitBitmapRectToWindow4BitTo8Bit(u32 windowId, const u8 *pixels, u16 srcX, void CopyWindowToVram8Bit(u32 windowId, u8 mode) { - sWindowPtr = &gWindows[windowId]; - sWindowSize = 64 * (sWindowPtr->window.width * sWindowPtr->window.height); + struct Window *window = &gWindows[windowId]; + u16 windowSize = 64 * (window->window.width * window->window.height); switch (mode) { case COPYWIN_MAP: - CopyBgTilemapBufferToVram(sWindowPtr->window.bg); + CopyBgTilemapBufferToVram(window->window.bg); break; case COPYWIN_GFX: - LoadBgTiles(sWindowPtr->window.bg, sWindowPtr->tileData, sWindowSize, sWindowPtr->window.baseBlock); + LoadBgTiles(window->window.bg, window->tileData, windowSize, window->window.baseBlock); break; case COPYWIN_FULL: - LoadBgTiles(sWindowPtr->window.bg, sWindowPtr->tileData, sWindowSize, sWindowPtr->window.baseBlock); - CopyBgTilemapBufferToVram(sWindowPtr->window.bg); + LoadBgTiles(window->window.bg, window->tileData, windowSize, window->window.baseBlock); + CopyBgTilemapBufferToVram(window->window.bg); break; } } diff --git a/src/wireless_communication_status_screen.c b/src/wireless_communication_status_screen.c index 7734c39d24b2..a4e0167c213f 100644 --- a/src/wireless_communication_status_screen.c +++ b/src/wireless_communication_status_screen.c @@ -79,8 +79,8 @@ static const u16 sPalettes[][16] = { INCBIN_U16("graphics/wireless_status_screen/anim_12.gbapal"), INCBIN_U16("graphics/wireless_status_screen/anim_13.gbapal") }; -static const u32 sBgTiles_Gfx[] = INCBIN_U32("graphics/wireless_status_screen/bg.4bpp.lz"); -static const u32 sBgTiles_Tilemap[] = INCBIN_U32("graphics/wireless_status_screen/bg.bin.lz"); +static const u32 sBgTiles_Gfx[] = INCBIN_U32("graphics/wireless_status_screen/bg.4bpp.smol"); +static const u32 sBgTiles_Tilemap[] = INCBIN_U32("graphics/wireless_status_screen/bg.bin.smolTM"); static const struct BgTemplate sBgTemplates[] = { { diff --git a/test/bag.c b/test/bag.c new file mode 100644 index 000000000000..fe33d01eeed6 --- /dev/null +++ b/test/bag.c @@ -0,0 +1,165 @@ +#include "global.h" +#include "battle.h" +#include "event_data.h" +#include "item_menu.h" +#include "pokemon.h" +#include "test/overworld_script.h" +#include "test/test.h" + +TEST("TMs and HMs are sorted correctly in the bag") +{ + struct BagPocket *pocket = &gBagPockets[POCKET_TM_HM]; + + ASSUME(GetItemPocket(ITEM_HM07) == POCKET_TM_HM); + ASSUME(GetItemPocket(ITEM_TM25) == POCKET_TM_HM); + ASSUME(GetItemPocket(ITEM_TM14) == POCKET_TM_HM); + ASSUME(GetItemPocket(ITEM_TM42) == POCKET_TM_HM); + ASSUME(GetItemPocket(ITEM_HM05) == POCKET_TM_HM); + ASSUME(GetItemPocket(ITEM_TM05) == POCKET_TM_HM); + ASSUME(GetItemPocket(ITEM_TM01) == POCKET_TM_HM); + ASSUME(GetItemPocket(ITEM_HM02) == POCKET_TM_HM); + + /* + * Note: I would add a test to make sure that TMs are sorted correctly by move name, + * but downstream users are likely to rearrange TMs so this would just be a nuisance. + */ + + RUN_OVERWORLD_SCRIPT( + additem ITEM_HM07; + additem ITEM_TM25; + additem ITEM_TM14; + additem ITEM_TM42; + additem ITEM_HM05; + additem ITEM_TM05; + additem ITEM_TM01; + additem ITEM_HM02; + ); + + SortItemsInBag(&gBagPockets[POCKET_TM_HM], SORT_BY_INDEX); + + EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_TM01); + EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_TM05); + EXPECT_EQ(pocket->itemSlots[2].itemId, ITEM_TM14); + EXPECT_EQ(pocket->itemSlots[3].itemId, ITEM_TM25); + EXPECT_EQ(pocket->itemSlots[4].itemId, ITEM_TM42); + EXPECT_EQ(pocket->itemSlots[5].itemId, ITEM_HM02); + EXPECT_EQ(pocket->itemSlots[6].itemId, ITEM_HM05); + EXPECT_EQ(pocket->itemSlots[7].itemId, ITEM_HM07); + EXPECT_EQ(pocket->itemSlots[8].itemId, ITEM_NONE); +} + +TEST("Berries are sorted correctly in the bag") +{ + struct BagPocket *pocket = &gBagPockets[POCKET_BERRIES]; + + ASSUME(GetItemPocket(ITEM_POMEG_BERRY) == POCKET_BERRIES); + ASSUME(GetItemPocket(ITEM_MAGOST_BERRY) == POCKET_BERRIES); + ASSUME(GetItemPocket(ITEM_KELPSY_BERRY) == POCKET_BERRIES); + ASSUME(GetItemPocket(ITEM_MICLE_BERRY) == POCKET_BERRIES); + ASSUME(GetItemPocket(ITEM_CHARTI_BERRY) == POCKET_BERRIES); + ASSUME(GetItemPocket(ITEM_GANLON_BERRY) == POCKET_BERRIES); + ASSUME(GetItemPocket(ITEM_ORAN_BERRY) == POCKET_BERRIES); + ASSUME(GetItemPocket(ITEM_CHERI_BERRY) == POCKET_BERRIES); + + RUN_OVERWORLD_SCRIPT( + additem ITEM_POMEG_BERRY; + additem ITEM_MAGOST_BERRY; + additem ITEM_KELPSY_BERRY; + additem ITEM_MICLE_BERRY; + additem ITEM_CHARTI_BERRY; + additem ITEM_GANLON_BERRY; + additem ITEM_ORAN_BERRY; + additem ITEM_CHERI_BERRY; + ); + + SortItemsInBag(&gBagPockets[POCKET_BERRIES], SORT_BY_INDEX); + + EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_CHERI_BERRY); + EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_ORAN_BERRY); + EXPECT_EQ(pocket->itemSlots[2].itemId, ITEM_POMEG_BERRY); + EXPECT_EQ(pocket->itemSlots[3].itemId, ITEM_KELPSY_BERRY); + EXPECT_EQ(pocket->itemSlots[4].itemId, ITEM_MAGOST_BERRY); + EXPECT_EQ(pocket->itemSlots[5].itemId, ITEM_CHARTI_BERRY); + EXPECT_EQ(pocket->itemSlots[6].itemId, ITEM_GANLON_BERRY); + EXPECT_EQ(pocket->itemSlots[7].itemId, ITEM_MICLE_BERRY); + EXPECT_EQ(pocket->itemSlots[8].itemId, ITEM_NONE); + + SortItemsInBag(&gBagPockets[POCKET_BERRIES], SORT_ALPHABETICALLY); + + EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_CHARTI_BERRY); + EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_CHERI_BERRY); + EXPECT_EQ(pocket->itemSlots[2].itemId, ITEM_GANLON_BERRY); + EXPECT_EQ(pocket->itemSlots[3].itemId, ITEM_KELPSY_BERRY); + EXPECT_EQ(pocket->itemSlots[4].itemId, ITEM_MAGOST_BERRY); + EXPECT_EQ(pocket->itemSlots[5].itemId, ITEM_MICLE_BERRY); + EXPECT_EQ(pocket->itemSlots[6].itemId, ITEM_ORAN_BERRY); + EXPECT_EQ(pocket->itemSlots[7].itemId, ITEM_POMEG_BERRY); + EXPECT_EQ(pocket->itemSlots[8].itemId, ITEM_NONE); +} + +TEST("Items are correctly sorted and compacted in the bag") +{ + struct BagPocket *pocket = &gBagPockets[POCKET_ITEMS]; + memset(pocket->itemSlots, 0, sizeof(gSaveBlock1Ptr->bag.items)); + + ASSUME(GetItemPocket(ITEM_NUGGET) == POCKET_ITEMS); + ASSUME(GetItemPocket(ITEM_BIG_NUGGET) == POCKET_ITEMS); + ASSUME(GetItemPocket(ITEM_TINY_MUSHROOM) == POCKET_ITEMS); + ASSUME(GetItemPocket(ITEM_BIG_MUSHROOM) == POCKET_ITEMS); + ASSUME(GetItemPocket(ITEM_PEARL) == POCKET_ITEMS); + ASSUME(GetItemPocket(ITEM_BIG_PEARL) == POCKET_ITEMS); + + RUN_OVERWORLD_SCRIPT( + additem ITEM_NUGGET; + additem ITEM_BIG_NUGGET; + additem ITEM_TINY_MUSHROOM; + additem ITEM_BIG_MUSHROOM; + additem ITEM_PEARL; + additem ITEM_BIG_PEARL; + ); + + EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_NUGGET); + EXPECT_EQ(pocket->itemSlots[0].quantity, 1); + EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_BIG_NUGGET); + EXPECT_EQ(pocket->itemSlots[1].quantity, 1); + EXPECT_EQ(pocket->itemSlots[2].itemId, ITEM_TINY_MUSHROOM); + EXPECT_EQ(pocket->itemSlots[2].quantity, 1); + EXPECT_EQ(pocket->itemSlots[3].itemId, ITEM_BIG_MUSHROOM); + EXPECT_EQ(pocket->itemSlots[3].quantity, 1); + EXPECT_EQ(pocket->itemSlots[4].itemId, ITEM_PEARL); + EXPECT_EQ(pocket->itemSlots[4].quantity, 1); + EXPECT_EQ(pocket->itemSlots[5].itemId, ITEM_BIG_PEARL); + EXPECT_EQ(pocket->itemSlots[5].quantity, 1); + EXPECT_EQ(pocket->itemSlots[6].itemId, ITEM_NONE); + + SortItemsInBag(&gBagPockets[POCKET_ITEMS], SORT_ALPHABETICALLY); + + EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_BIG_MUSHROOM); + EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_BIG_NUGGET); + EXPECT_EQ(pocket->itemSlots[2].itemId, ITEM_BIG_PEARL); + EXPECT_EQ(pocket->itemSlots[3].itemId, ITEM_NUGGET); + EXPECT_EQ(pocket->itemSlots[4].itemId, ITEM_PEARL); + EXPECT_EQ(pocket->itemSlots[5].itemId, ITEM_TINY_MUSHROOM); + EXPECT_EQ(pocket->itemSlots[6].itemId, ITEM_NONE); + + // Try removing the big items, check that everything is compacted correctly + + RUN_OVERWORLD_SCRIPT( + removeitem ITEM_BIG_NUGGET; + removeitem ITEM_BIG_MUSHROOM; + removeitem ITEM_BIG_PEARL; + ); + + CompactItemsInBagPocket(POCKET_ITEMS); + + EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_NUGGET); + EXPECT_EQ(pocket->itemSlots[0].quantity, 1); + EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_PEARL); + EXPECT_EQ(pocket->itemSlots[1].quantity, 1); + EXPECT_EQ(pocket->itemSlots[2].itemId, ITEM_TINY_MUSHROOM); + EXPECT_EQ(pocket->itemSlots[2].quantity, 1); + EXPECT_EQ(pocket->itemSlots[3].itemId, ITEM_NONE); + EXPECT_EQ(pocket->itemSlots[4].itemId, ITEM_NONE); + EXPECT_EQ(pocket->itemSlots[5].itemId, ITEM_NONE); + EXPECT_EQ(pocket->itemSlots[6].itemId, ITEM_NONE); +} diff --git a/test/battle/ability/adaptability.c b/test/battle/ability/adaptability.c index 4c1c8439b7d5..876dac212c9f 100644 --- a/test/battle/ability/adaptability.c +++ b/test/battle/ability/adaptability.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Adaptability increases same-type attack bonus from x1.5 to x2", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_HYPER_CUTTER; } PARAMETRIZE { ability = ABILITY_ADAPTABILITY; } GIVEN { diff --git a/test/battle/ability/aerilate.c b/test/battle/ability/aerilate.c index e213e177d6ef..b6ae57bd50d5 100644 --- a/test/battle/ability/aerilate.c +++ b/test/battle/ability/aerilate.c @@ -54,7 +54,7 @@ SINGLE_BATTLE_TEST("Aerilate boosts power of affected moves by 20% (Gen7+) or 30 PARAMETRIZE { move = MOVE_SKILL_SWAP; genConfig = GEN_6; } GIVEN { - WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, genConfig); + WITH_CONFIG(CONFIG_ATE_MULTIPLIER, genConfig); ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL); ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); PLAYER(SPECIES_WOBBUFFET); @@ -82,7 +82,7 @@ SINGLE_BATTLE_TEST("Aerilate doesn't affect Weather Ball's type", s16 damage) ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL); ASSUME(GetMoveType(MOVE_WEATHER_BALL) == TYPE_NORMAL); ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); - ASSUME(gSpeciesInfo[SPECIES_PINSIR].types[0] == TYPE_BUG); + ASSUME(GetSpeciesType(SPECIES_PINSIR, 0) == TYPE_BUG); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PINSIR) { Ability(ABILITY_HYPER_CUTTER); Item(ITEM_PINSIRITE); } } WHEN { @@ -111,7 +111,7 @@ SINGLE_BATTLE_TEST("Aerilate doesn't affect Natural Gift's type") ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT); ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_PERSIM_BERRY)].type == TYPE_GROUND); - ASSUME(gSpeciesInfo[SPECIES_SALAMENCE_MEGA].types[0] == TYPE_FLYING || gSpeciesInfo[SPECIES_SALAMENCE_MEGA].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_SALAMENCE_MEGA, 0) == TYPE_FLYING || GetSpeciesType(SPECIES_SALAMENCE_MEGA, 1) == TYPE_FLYING); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_PERSIM_BERRY); } OPPONENT(SPECIES_SALAMENCE) { Item(ITEM_SALAMENCITE); } } WHEN { @@ -140,7 +140,7 @@ SINGLE_BATTLE_TEST("Aerilate doesn't affect Judgment / Techno Blast / Multi-Atta ASSUME(gItemsInfo[ITEM_SHOCK_DRIVE].secondaryId == TYPE_ELECTRIC); ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].holdEffect == HOLD_EFFECT_MEMORY); ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].secondaryId == TYPE_ELECTRIC); - ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND); PLAYER(SPECIES_WOBBUFFET) { Item(item); } OPPONENT(SPECIES_SALAMENCE) { Item(ITEM_SALAMENCITE); } OPPONENT(SPECIES_DIGLETT); @@ -159,7 +159,7 @@ SINGLE_BATTLE_TEST("Aerilate doesn't affect Hidden Power's type") GIVEN { ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER); ASSUME(gTypesInfo[TYPE_ELECTRIC].isHiddenPowerType == TRUE); - ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND); PLAYER(SPECIES_PINSIR) { Ability(ABILITY_AERILATE); HPIV(31); AttackIV(31); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(31); } // HP Electric OPPONENT(SPECIES_DIGLETT); } WHEN { diff --git a/test/battle/ability/analytic.c b/test/battle/ability/analytic.c index 5e50c24d59ed..da2b8e28a682 100644 --- a/test/battle/ability/analytic.c +++ b/test/battle/ability/analytic.c @@ -20,9 +20,59 @@ SINGLE_BATTLE_TEST("Analytic increases the power of moves by 30% if it's the las } } +DOUBLE_BATTLE_TEST("Analytic activates correctly with empty slot after fainting", s16 damage) +{ + u32 speed; + + PARAMETRIZE { speed = 50; } + PARAMETRIZE { speed = 5; } + + GIVEN { + PLAYER(SPECIES_MAGNEMITE) { Ability(ABILITY_ANALYTIC); Speed(speed); } + PLAYER(SPECIES_WYNAUT) { HP(1); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(20); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerRight); } + TURN { + MOVE(opponentRight, MOVE_CELEBRATE); + MOVE(playerLeft, MOVE_SCRATCH, target: opponentLeft); + } + } SCENE { + HP_BAR(opponentLeft, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.3), results[1].damage); + } +} + +DOUBLE_BATTLE_TEST("Analytic does not activate when not moving last with empty slot", s16 damage) +{ + u32 speed; + + PARAMETRIZE { speed = 50; } + PARAMETRIZE { speed = 15; } + + GIVEN { + PLAYER(SPECIES_MAGNEMITE) { Ability(ABILITY_ANALYTIC); Speed(speed); } + PLAYER(SPECIES_WYNAUT) { HP(1); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(20); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerRight); } + TURN { + MOVE(opponentLeft, MOVE_CELEBRATE); + MOVE(opponentRight, MOVE_CELEBRATE); + MOVE(playerLeft, MOVE_SCRATCH, target: opponentLeft); + } + } SCENE { + HP_BAR(opponentLeft, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} + TO_DO_BATTLE_TEST("Analytic takes into account modifications to speeed an priority (Gen 5-8)"); //Eg. Paralysis, Power Weight, Stall TO_DO_BATTLE_TEST("Analytic does not take into account modifications to speeed an priority (Gen 8)"); //Eg. Paralysis, Power Weight, Stall -TO_DO_BATTLE_TEST("Analytic takes into account the turn order of what fainted PokΓ©mon would've moved"); // Triple Battles needed to test //TO_DO_BATTLE_TEST("If the PokΓ©mon with Analytic is targeting a PokΓ©mon in a flank position that chooses to switch with its ally in the middle, its move's power will always be normal when it attacks the PokΓ©mon that is shifted into the flank position"); diff --git a/test/battle/ability/anger_shell.c b/test/battle/ability/anger_shell.c index 875088c94514..6c9064ee0d7b 100644 --- a/test/battle/ability/anger_shell.c +++ b/test/battle/ability/anger_shell.c @@ -93,3 +93,23 @@ SINGLE_BATTLE_TEST("Anger Shell activates after all hits from a multi-hit move") EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 1); } } + +SINGLE_BATTLE_TEST("Anger Shell does not activate if move is boosted by Sheer Force") +{ + u16 maxHp = 500; + GIVEN { + PLAYER(SPECIES_KLAWF) { Ability(ABILITY_ANGER_SHELL); MaxHP(maxHp); HP(maxHp / 2 + 1); } + OPPONENT(SPECIES_NIDOKING) { Ability(ABILITY_SHEER_FORCE); } + } WHEN { + TURN { MOVE(opponent, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, opponent); + NOT ABILITY_POPUP(player, ABILITY_ANGER_SHELL); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); + } +} diff --git a/test/battle/ability/anticipation.c b/test/battle/ability/anticipation.c index 7a4553729670..ee5b602a1367 100644 --- a/test/battle/ability/anticipation.c +++ b/test/battle/ability/anticipation.c @@ -5,8 +5,8 @@ SINGLE_BATTLE_TEST("Anticipation causes notifies if an opponent has a super-effe { GIVEN { ASSUME(GetMoveType(MOVE_CLOSE_COMBAT) == TYPE_FIGHTING); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) == TYPE_NORMAL); PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CLOSE_COMBAT, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -16,6 +16,18 @@ SINGLE_BATTLE_TEST("Anticipation causes notifies if an opponent has a super-effe } } +SINGLE_BATTLE_TEST("Anticipation does not trigger even when a move is super effective on only 1 type") +{ + GIVEN { + PLAYER(SPECIES_WHISCASH) { Ability(ABILITY_ANTICIPATION); } + OPPONENT(SPECIES_PIKACHU) { Moves(MOVE_CELEBRATE, MOVE_THUNDERBOLT); } + } WHEN { + TURN { } + } SCENE { + NOT ABILITY_POPUP(player, ABILITY_ANTICIPATION); + } +} + SINGLE_BATTLE_TEST("Anticipation causes notifies if an opponent has a One-hit KO move") { GIVEN { @@ -46,8 +58,8 @@ SINGLE_BATTLE_TEST("Anticipation doesn't consider Normalize into their effective { GIVEN { ASSUME(GetMoveType(MOVE_CLOSE_COMBAT) == TYPE_FIGHTING); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) == TYPE_NORMAL); PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_DELCATTY) { Ability(ABILITY_NORMALIZE); Moves(MOVE_CLOSE_COMBAT, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -59,28 +71,21 @@ SINGLE_BATTLE_TEST("Anticipation doesn't consider Normalize into their effective SINGLE_BATTLE_TEST("Anticipation doesn't consider Scrappy into their effectiveness (Gen5+)") { - KNOWN_FAILING; GIVEN { ASSUME(GetMoveType(MOVE_CLOSE_COMBAT) == TYPE_FIGHTING); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] == TYPE_NORMAL); - PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); } - OPPONENT(SPECIES_KANGASKHAN) { Ability(ABILITY_SCRAPPY); Moves(MOVE_CLOSE_COMBAT, MOVE_TRICK_OR_TREAT, MOVE_SKILL_SWAP, MOVE_CELEBRATE); } + ASSUME(GetSpeciesType(SPECIES_DOUBLADE, 0) == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_DOUBLADE, 1) == TYPE_GHOST); + PLAYER(SPECIES_DOUBLADE) { Ability(ABILITY_ANTICIPATION); } + OPPONENT(SPECIES_KANGASKHAN) { Ability(ABILITY_SCRAPPY); Moves(MOVE_CLOSE_COMBAT, MOVE_CELEBRATE); } } WHEN { - TURN { MOVE(opponent, MOVE_TRICK_OR_TREAT); MOVE(player, MOVE_SKILL_SWAP); } - TURN { MOVE(opponent, MOVE_SKILL_SWAP); } + TURN { } } SCENE { - ABILITY_POPUP(player, ABILITY_ANTICIPATION); - ANIMATION(ANIM_TYPE_MOVE, MOVE_TRICK_OR_TREAT, opponent); - ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, player); - ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, opponent); NOT ABILITY_POPUP(player, ABILITY_ANTICIPATION); } } SINGLE_BATTLE_TEST("Anticipation doesn't consider Gravity into their effectiveness (Gen5+)") { - KNOWN_FAILING; GIVEN { PLAYER(SPECIES_SKARMORY); OPPONENT(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); Moves(MOVE_EARTHQUAKE, MOVE_GRAVITY, MOVE_SCRATCH, MOVE_POUND); } @@ -95,14 +100,15 @@ SINGLE_BATTLE_TEST("Anticipation doesn't consider Gravity into their effectivene SINGLE_BATTLE_TEST("Anticipation counts Counter, Metal Burst or Mirror Coat as attacking moves of their types (Gen5+)") { - u32 move, species, typeAtk, typeDef; + u32 move, species; + enum Type typeAtk, typeDef; PARAMETRIZE { move = MOVE_COUNTER; species = SPECIES_RATICATE; typeAtk = TYPE_FIGHTING; typeDef = TYPE_NORMAL; } PARAMETRIZE { move = MOVE_METAL_BURST; species = SPECIES_ROGGENROLA; typeAtk = TYPE_STEEL; typeDef = TYPE_ROCK; } PARAMETRIZE { move = MOVE_MIRROR_COAT; species = SPECIES_NIDORINO; typeAtk = TYPE_PSYCHIC; typeDef = TYPE_POISON; } GIVEN { ASSUME(GetMoveType(move) == typeAtk); - ASSUME(gSpeciesInfo[species].types[0] == typeDef); - ASSUME(gSpeciesInfo[species].types[1] == typeDef); + ASSUME(GetSpeciesType(species, 0) == typeDef); + ASSUME(GetSpeciesType(species, 1) == typeDef); PLAYER(species); OPPONENT(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); Moves(move, MOVE_SKILL_SWAP, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -117,10 +123,10 @@ SINGLE_BATTLE_TEST("Anticipation considers Synchronoise as an ordinary Psychic-t { GIVEN { ASSUME(GetMoveType(MOVE_SYNCHRONOISE) == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_NIDORINO].types[0] == TYPE_POISON); - ASSUME(gSpeciesInfo[SPECIES_NIDORINO].types[1] == TYPE_POISON); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] != TYPE_POISON); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] != TYPE_POISON); + ASSUME(GetSpeciesType(SPECIES_NIDORINO, 0) == TYPE_POISON); + ASSUME(GetSpeciesType(SPECIES_NIDORINO, 1) == TYPE_POISON); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) != TYPE_POISON); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) != TYPE_POISON); PLAYER(SPECIES_NIDORINO); OPPONENT(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); Moves(MOVE_SYNCHRONOISE, MOVE_SKILL_SWAP, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -133,11 +139,10 @@ SINGLE_BATTLE_TEST("Anticipation considers Synchronoise as an ordinary Psychic-t SINGLE_BATTLE_TEST("Anticipation considers Freeze-Dry as an ordinary Ice-type move") { - KNOWN_FAILING; GIVEN { ASSUME(GetMoveType(MOVE_FREEZE_DRY) == TYPE_ICE); - ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[0] == TYPE_WATER); - ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[1] == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_SQUIRTLE, 0) == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_SQUIRTLE, 1) == TYPE_WATER); PLAYER(SPECIES_SQUIRTLE); OPPONENT(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); Moves(MOVE_FREEZE_DRY, MOVE_SKILL_SWAP, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -150,11 +155,10 @@ SINGLE_BATTLE_TEST("Anticipation considers Freeze-Dry as an ordinary Ice-type mo SINGLE_BATTLE_TEST("Anticipation considers Flying Press as an ordinary Fighting-type move") { - KNOWN_FAILING; GIVEN { ASSUME(GetMoveType(MOVE_FLYING_PRESS) == TYPE_FIGHTING); - ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[1] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_TANGELA, 1) == TYPE_GRASS); PLAYER(SPECIES_TANGELA); OPPONENT(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); Moves(MOVE_FLYING_PRESS, MOVE_SKILL_SWAP, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -169,8 +173,8 @@ SINGLE_BATTLE_TEST("Anticipation considers Aura Wheel as an ordinary Electric-ty { GIVEN { ASSUME(GetMoveType(MOVE_AURA_WHEEL) == TYPE_ELECTRIC); - ASSUME(gSpeciesInfo[SPECIES_PONYTA_GALAR].types[0] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_PONYTA_GALAR].types[1] == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_PONYTA_GALAR, 0) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_PONYTA_GALAR, 1) == TYPE_PSYCHIC); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_PONYTA_GALAR) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_MORPEKO) { Ability(ABILITY_HUNGER_SWITCH); Moves(MOVE_AURA_WHEEL, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } @@ -188,8 +192,8 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N { GIVEN { ASSUME(GetMoveEffect(MOVE_JUDGMENT) == EFFECT_CHANGE_TYPE_ON_ITEM); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) == TYPE_NORMAL); PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_ARCEUS) { Item(ITEM_FIST_PLATE); Moves(MOVE_JUDGMENT, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -203,8 +207,8 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N { GIVEN { ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL); - ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[1] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 1) == TYPE_STEEL); PLAYER(SPECIES_FERROTHORN) { Ability(ABILITY_ANTICIPATION); Speed(2); } OPPONENT(SPECIES_NINETALES) { Ability(ABILITY_DROUGHT); Moves(MOVE_WEATHER_BALL, MOVE_SKILL_SWAP, MOVE_POUND, MOVE_CELEBRATE); Speed(4); } } WHEN { @@ -221,8 +225,8 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N { GIVEN { ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) == TYPE_NORMAL); PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LEPPA_BERRY); Moves(MOVE_NATURAL_GIFT, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -236,8 +240,8 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N { GIVEN { ASSUME(GetMoveEffect(MOVE_TECHNO_BLAST) == EFFECT_CHANGE_TYPE_ON_ITEM); - ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[1] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 1) == TYPE_STEEL); PLAYER(SPECIES_FERROTHORN) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_GENESECT) { Item(ITEM_BURN_DRIVE); Moves(MOVE_TECHNO_BLAST, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -251,9 +255,9 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N { GIVEN { ASSUME(GetMoveEffect(MOVE_REVELATION_DANCE) == EFFECT_REVELATION_DANCE); - ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[1] == TYPE_STEEL); - ASSUME(gSpeciesInfo[SPECIES_ORICORIO_BAILE].types[0] == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 1) == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_ORICORIO_BAILE, 0) == TYPE_FIRE); PLAYER(SPECIES_FERROTHORN) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_ORICORIO_BAILE) { Moves(MOVE_REVELATION_DANCE, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -267,8 +271,8 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N { GIVEN { ASSUME(GetMoveEffect(MOVE_MULTI_ATTACK) == EFFECT_CHANGE_TYPE_ON_ITEM); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) == TYPE_NORMAL); PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_SILVALLY) { Item(ITEM_FIGHTING_MEMORY); Moves(MOVE_MULTI_ATTACK, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -280,10 +284,9 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N SINGLE_BATTLE_TEST("Anticipation does not consider Strong Winds on type matchups") { - KNOWN_FAILING; GIVEN { - ASSUME(gSpeciesInfo[SPECIES_RAYQUAZA_MEGA].types[0] == TYPE_DRAGON); - ASSUME(gSpeciesInfo[SPECIES_RAYQUAZA_MEGA].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_RAYQUAZA_MEGA, 0) == TYPE_DRAGON); + ASSUME(GetSpeciesType(SPECIES_RAYQUAZA_MEGA, 1) == TYPE_FLYING); PLAYER(SPECIES_RAYQUAZA) { Moves(MOVE_DRAGON_ASCENT, MOVE_CELEBRATE); } OPPONENT(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); Moves(MOVE_ROCK_SLIDE, MOVE_SKILL_SWAP, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -300,8 +303,8 @@ SINGLE_BATTLE_TEST("Anticipation does not consider ate-abilities") { GIVEN { ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_WORMADAM_PLANT].types[0] == TYPE_BUG); - ASSUME(gSpeciesInfo[SPECIES_WORMADAM_PLANT].types[1] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_WORMADAM_PLANT, 0) == TYPE_BUG); + ASSUME(GetSpeciesType(SPECIES_WORMADAM_PLANT, 1) == TYPE_GRASS); PLAYER(SPECIES_WORMADAM_PLANT) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_AURORUS) { Ability(ABILITY_REFRIGERATE); Moves(MOVE_GROWL, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -315,8 +318,8 @@ SINGLE_BATTLE_TEST("Anticipation treats Hidden Power as its dynamic type (Gen6+) { KNOWN_FAILING; GIVEN { - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) == TYPE_NORMAL); PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); Item(ITEM_CHOPLE_BERRY); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HIDDEN_POWER, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); HPIV(30); AttackIV(2); DefenseIV(31); SpAttackIV(30); SpDefenseIV(30); SpeedIV(30); } } WHEN { @@ -335,8 +338,8 @@ SINGLE_BATTLE_TEST("Anticipation considers Inverse Battle types") GIVEN { FLAG_SET(B_FLAG_INVERSE_BATTLE); ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[1] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 1) == TYPE_STEEL); PLAYER(SPECIES_FERROTHORN) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_GROWL, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { diff --git a/test/battle/ability/aura_break.c b/test/battle/ability/aura_break.c index 93b21421e419..c023869c7895 100644 --- a/test/battle/ability/aura_break.c +++ b/test/battle/ability/aura_break.c @@ -1,6 +1,64 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Aura Break inverts Fairy Aura's effect"); -TO_DO_BATTLE_TEST("Aura Break inverts Dark Aura's effect"); -TO_DO_BATTLE_TEST("Aura Break ignores Mold Breaker abilities"); +DOUBLE_BATTLE_TEST("Aura Break inverts Fairy Aura's effect") +{ + s16 damage[3]; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_XERNEAS) { Ability(ABILITY_FAIRY_AURA); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ZYGARDE_50) { Ability(ABILITY_AURA_BREAK); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_PLAY_ROUGH, target:opponentLeft); } + TURN { MOVE(playerLeft, MOVE_PLAY_ROUGH, target:opponentLeft); SWITCH(playerRight, 2); } + TURN { MOVE(playerLeft, MOVE_PLAY_ROUGH, target:opponentLeft); SWITCH(opponentRight, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[0]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[1]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[2]); + + } THEN { + EXPECT_MUL_EQ(damage[0], UQ_4_12(1.33), damage[1]); + EXPECT_MUL_EQ(damage[0], UQ_4_12(0.75), damage[2]); + } +} + +DOUBLE_BATTLE_TEST("Aura Break inverts Dark Aura's effect") +{ + s16 damage[3]; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_YVELTAL) { Ability(ABILITY_DARK_AURA); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ZYGARDE_50) { Ability(ABILITY_AURA_BREAK); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_BITE, target:opponentLeft); } + TURN { MOVE(playerLeft, MOVE_BITE, target:opponentLeft); SWITCH(playerRight, 2); } + TURN { MOVE(playerLeft, MOVE_BITE, target:opponentLeft); SWITCH(opponentRight, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[0]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[1]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[2]); + + } THEN { + EXPECT_MUL_EQ(damage[0], UQ_4_12(1.33), damage[1]); + EXPECT_MUL_EQ(damage[0], UQ_4_12(0.75), damage[2]); + } +} diff --git a/test/battle/ability/bad_dreams.c b/test/battle/ability/bad_dreams.c index 41cedf8e3e27..cb724e24114e 100644 --- a/test/battle/ability/bad_dreams.c +++ b/test/battle/ability/bad_dreams.c @@ -35,6 +35,22 @@ SINGLE_BATTLE_TEST("Bad Dreams causes the sleeping enemy Pokemon to lose 1/8 of } } +SINGLE_BATTLE_TEST("Bad Dreams causes PokΓ©mon with Comatose to lose 1/8 of HP") +{ + GIVEN { + PLAYER(SPECIES_DARKRAI); + OPPONENT(SPECIES_KOMALA) { Ability(ABILITY_COMATOSE); } + } WHEN { + TURN {;} + } SCENE { + ABILITY_POPUP(player, ABILITY_BAD_DREAMS); + MESSAGE("The opposing Komala is tormented!"); + HP_BAR(opponent); + } THEN { + EXPECT_EQ(opponent->hp, opponent->maxHP - opponent->maxHP / 8); + } +} + DOUBLE_BATTLE_TEST("Bad Dreams does not activate if only the partner Pokemon is sleeping") { GIVEN { @@ -57,7 +73,7 @@ DOUBLE_BATTLE_TEST("Bad Dreams does not activate if only the partner Pokemon is } } -DOUBLE_BATTLE_TEST("Bad Dreams activates for both sleeping pokemon on the player side") +DOUBLE_BATTLE_TEST("Bad Dreams activates for both sleeping PokΓ©mon on the player side") { GIVEN { PLAYER(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP);} diff --git a/test/battle/ability/ball_fetch.c b/test/battle/ability/ball_fetch.c index 7411d60a7dd4..762225c0f079 100644 --- a/test/battle/ability/ball_fetch.c +++ b/test/battle/ability/ball_fetch.c @@ -1,7 +1,121 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Ball Fetch causes the PokΓ©mon to pick up the last failed Ball at the end of the turn"); -TO_DO_BATTLE_TEST("Ball Fetch doesn't trigger if the PokΓ©mon is already holding an item"); -TO_DO_BATTLE_TEST("Ball Fetch only picks up the first failed ball, once per battle"); // Bestow can help test this +WILD_BATTLE_TEST("Ball Fetch causes the PokΓ©mon to pick up the last failed Ball at the end of the turn") +{ + u32 item = 0; + + PARAMETRIZE { item = ITEM_POKE_BALL; } + PARAMETRIZE { item = ITEM_GREAT_BALL; } + PARAMETRIZE { item = ITEM_ULTRA_BALL; } + PARAMETRIZE { item = ITEM_STRANGE_BALL; } + PARAMETRIZE { item = ITEM_X_ACCURACY; } + + GIVEN { + PLAYER(SPECIES_YAMPER) { Ability(ABILITY_BALL_FETCH); } + OPPONENT(SPECIES_METAGROSS); + } WHEN { + TURN { USE_ITEM(player, item, WITH_RNG(RNG_BALLTHROW_SHAKE, MAX_u16) );} + TURN {} + } SCENE { + if (item != ITEM_X_ACCURACY) + ABILITY_POPUP(player, ABILITY_BALL_FETCH); + else + NOT ABILITY_POPUP(player, ABILITY_BALL_FETCH); + } THEN { + if (item != ITEM_X_ACCURACY) + EXPECT_EQ(player->item, item); + else + EXPECT_EQ(player->item, ITEM_NONE); + } +} + +WILD_BATTLE_TEST("Ball Fetch doesn't trigger if the PokΓ©mon is already holding an item") +{ + u32 item = 0; + + PARAMETRIZE { item = ITEM_NONE; } + PARAMETRIZE { item = ITEM_NUGGET; } + + GIVEN { + PLAYER(SPECIES_YAMPER) { Ability(ABILITY_BALL_FETCH); Item(item); } + OPPONENT(SPECIES_METAGROSS); + } WHEN { + TURN { USE_ITEM(player, ITEM_GREAT_BALL, WITH_RNG(RNG_BALLTHROW_SHAKE, MAX_u16)); } + } SCENE { + if (item == ITEM_NONE) + { + MESSAGE("You used Great Ball!"); + ABILITY_POPUP(player, ABILITY_BALL_FETCH); + MESSAGE("Yamper found a Great Ball!"); + } + else + { + NONE_OF + { + ABILITY_POPUP(player, ABILITY_BALL_FETCH); + MESSAGE("Yamper found a Great Ball!"); + } + } + } THEN { + if (item == ITEM_NONE) + EXPECT_EQ(player->item, ITEM_GREAT_BALL); + else + EXPECT_EQ(player->item, item); + } +} + +WILD_BATTLE_TEST("Ball Fetch only picks up the first failed ball, once per battle") +{ + u32 item = 0; + u32 item2 = 0; + + PARAMETRIZE { item = ITEM_GREAT_BALL; item2 = ITEM_X_ACCURACY; } + PARAMETRIZE { item = ITEM_GREAT_BALL; item2 = ITEM_ULTRA_BALL; } + PARAMETRIZE { item = ITEM_GREAT_BALL; item2 = ITEM_FAST_BALL; } + PARAMETRIZE { item = ITEM_GREAT_BALL; item2 = ITEM_STRANGE_BALL; } + + + GIVEN { + PLAYER(SPECIES_YAMPER) { Ability(ABILITY_BALL_FETCH); } + OPPONENT(SPECIES_METAGROSS); + } WHEN { + TURN { USE_ITEM(player, item, WITH_RNG(RNG_BALLTHROW_SHAKE, MAX_u16)); } + TURN { MOVE(player, MOVE_BESTOW); } + TURN { USE_ITEM(player, item2, WITH_RNG(RNG_BALLTHROW_SHAKE, MAX_u16)); } + } SCENE { + MESSAGE("You used Great Ball!"); + ABILITY_POPUP(player, ABILITY_BALL_FETCH); + MESSAGE("Yamper found a Great Ball!"); + MESSAGE("Yamper used Bestow!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BESTOW, player); + MESSAGE("The wild Metagross received Great Ball from Yamper!"); + NOT ABILITY_POPUP(player, ABILITY_BALL_FETCH); + } THEN { + EXPECT_EQ(player->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Ball Fetch doesn't trigger in Trainer Battles") +{ + u32 item = 0; + + PARAMETRIZE { item = ITEM_POKE_BALL; } + PARAMETRIZE { item = ITEM_GREAT_BALL; } + PARAMETRIZE { item = ITEM_ULTRA_BALL; } + PARAMETRIZE { item = ITEM_STRANGE_BALL; } + PARAMETRIZE { item = ITEM_X_ACCURACY; } + + GIVEN { + PLAYER(SPECIES_YAMPER) { Ability(ABILITY_BALL_FETCH); } + OPPONENT(SPECIES_METAGROSS); + } WHEN { + TURN { USE_ITEM(player, item, WITH_RNG(RNG_BALLTHROW_SHAKE, 0)); } + } SCENE { + NOT ABILITY_POPUP(player, ABILITY_BALL_FETCH); + } THEN { + EXPECT_EQ(player->item, ITEM_NONE); + } +} + TO_DO_BATTLE_TEST("Ball Fetch doesn't trigger in Max Raid Battles"); diff --git a/test/battle/ability/battery.c b/test/battle/ability/battery.c index cecfa81d0c23..7ddc0b837ceb 100644 --- a/test/battle/ability/battery.c +++ b/test/battle/ability/battery.c @@ -1,5 +1,51 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Battery increases Sp. Attack damage of allies by ~30%"); // 5325/4096 -TO_DO_BATTLE_TEST("Battery does not increase its own Sp. Attack damage"); +DOUBLE_BATTLE_TEST("Battery increases Sp. Attack damage of allies by ~30%") +{ + s16 damage[2]; + + GIVEN { + PLAYER(SPECIES_CHARJABUG) { Speed(1); Ability(ABILITY_BATTERY); } + PLAYER(SPECIES_WOBBUFFET) { Speed(2); Moves(MOVE_SHOCK_WAVE); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(4); Moves(MOVE_CELEBRATE, MOVE_GASTRO_ACID); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(3); } + } WHEN { + TURN { MOVE(playerRight, MOVE_SHOCK_WAVE, target: opponentLeft); } + TURN { MOVE(opponentLeft, MOVE_GASTRO_ACID, target: playerLeft); MOVE(playerRight, MOVE_SHOCK_WAVE, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHOCK_WAVE, playerRight); + HP_BAR(opponentLeft, captureDamage: &damage[0]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_GASTRO_ACID, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHOCK_WAVE, playerRight); + HP_BAR(opponentLeft, captureDamage: &damage[1]); + } THEN { + EXPECT_MUL_EQ(damage[1], UQ_4_12(1.3), damage[0]); + } + +} + +DOUBLE_BATTLE_TEST("Battery does not increase its own Sp. Attack damage") +{ + s16 damage[2]; + + GIVEN { + PLAYER(SPECIES_CHARJABUG) { Speed(1); Ability(ABILITY_BATTERY); } + PLAYER(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(4); Moves(MOVE_CELEBRATE, MOVE_GASTRO_ACID); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(3); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_SHOCK_WAVE, target: opponentLeft); } + TURN { MOVE(opponentLeft, MOVE_GASTRO_ACID, target: playerLeft); MOVE(playerLeft, MOVE_SHOCK_WAVE, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHOCK_WAVE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[0]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_GASTRO_ACID, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHOCK_WAVE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + } +} diff --git a/test/battle/ability/battle_armor.c b/test/battle/ability/battle_armor.c index b5e28c5a0dfa..abf7396f6092 100644 --- a/test/battle/ability/battle_armor.c +++ b/test/battle/ability/battle_armor.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Battle Armor and Shell Armor block critical hits") { u32 species; - u32 ability; + enum Ability ability; PARAMETRIZE { species = SPECIES_KINGLER; ability = ABILITY_SHELL_ARMOR; } PARAMETRIZE { species = SPECIES_ARMALDO; ability = ABILITY_BATTLE_ARMOR; } diff --git a/test/battle/ability/battle_bond.c b/test/battle/ability/battle_bond.c index 401df267b62c..95787429b19b 100644 --- a/test/battle/ability/battle_bond.c +++ b/test/battle/ability/battle_bond.c @@ -6,7 +6,7 @@ ASSUMPTIONS ASSUME(!IsBattleMoveStatus(MOVE_WATER_GUN)); } -// Battle Bond transforms the pokemon when fainting any battler(opposing or partner), unless it's the last pokemon and the battle ends. +// Battle Bond transforms the PokΓ©mon when fainting any battler(opposing or partner), unless it's the last PokΓ©mon and the battle ends. SINGLE_BATTLE_TEST("Battle Bond transforms player's Greninja - Singles") { u32 monsCountPlayer, monsCountOpponent; @@ -17,7 +17,7 @@ SINGLE_BATTLE_TEST("Battle Bond transforms player's Greninja - Singles") PARAMETRIZE {monsCountPlayer = 2; monsCountOpponent = 2; } GIVEN { - WITH_CONFIG(GEN_CONFIG_BATTLE_BOND, GEN_8); + WITH_CONFIG(CONFIG_BATTLE_BOND, GEN_8); PLAYER(SPECIES_GRENINJA_BATTLE_BOND); if (monsCountPlayer == 2) { PLAYER(SPECIES_WOBBUFFET); @@ -65,7 +65,7 @@ SINGLE_BATTLE_TEST("Battle Bond transforms opponent's Greninja - Singles") PARAMETRIZE {monsCountPlayer = 2; monsCountOpponent = 2; } GIVEN { - WITH_CONFIG(GEN_CONFIG_BATTLE_BOND, GEN_8); + WITH_CONFIG(CONFIG_BATTLE_BOND, GEN_8); OPPONENT(SPECIES_GRENINJA_BATTLE_BOND); if (monsCountOpponent == 2) { OPPONENT(SPECIES_WOBBUFFET); @@ -113,7 +113,7 @@ DOUBLE_BATTLE_TEST("Battle Bond transforms player's Greninja when fainting its A PARAMETRIZE {monsCountPlayer = 3; monsCountOpponent = 3; } GIVEN { - WITH_CONFIG(GEN_CONFIG_BATTLE_BOND, GEN_8); + WITH_CONFIG(CONFIG_BATTLE_BOND, GEN_8); PLAYER(SPECIES_GRENINJA_BATTLE_BOND); PLAYER(SPECIES_WOBBUFFET) { HP(1); } if (monsCountPlayer == 3) { @@ -145,7 +145,7 @@ DOUBLE_BATTLE_TEST("Battle Bond transforms player's Greninja when fainting its A SINGLE_BATTLE_TEST("Battle Bond increases Atk, SpAtk and Speed by 1 stage (Gen9+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_BATTLE_BOND, GEN_9); + WITH_CONFIG(CONFIG_BATTLE_BOND, GEN_9); PLAYER(SPECIES_GRENINJA_BATTLE_BOND) { Ability(ABILITY_BATTLE_BOND); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); @@ -166,7 +166,7 @@ SINGLE_BATTLE_TEST("Battle Bond increases Atk, SpAtk and Speed by 1 stage (Gen9+ SINGLE_BATTLE_TEST("Battle Bond increases a Stat even if only one can be increased (Gen9+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_BATTLE_BOND, GEN_9); + WITH_CONFIG(CONFIG_BATTLE_BOND, GEN_9); PLAYER(SPECIES_GRENINJA_BATTLE_BOND) { Ability(ABILITY_BATTLE_BOND); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/beads_of_ruin.c b/test/battle/ability/beads_of_ruin.c index 37240d2d68aa..86172459aba1 100644 --- a/test/battle/ability/beads_of_ruin.c +++ b/test/battle/ability/beads_of_ruin.c @@ -4,6 +4,7 @@ ASSUMPTIONS { ASSUME(GetMoveCategory(MOVE_WATER_GUN) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_ROUND) == DAMAGE_CATEGORY_SPECIAL); ASSUME(GetMoveEffect(MOVE_ROLE_PLAY) == EFFECT_ROLE_PLAY); } @@ -74,4 +75,117 @@ SINGLE_BATTLE_TEST("Beads of Ruin's message displays correctly after all battler } } -TO_DO_BATTLE_TEST("Beads of Ruin reduce Defense if Wonder Room is active"); +DOUBLE_BATTLE_TEST("Beads of Ruin increases damage taken by physical moves in Wonder Room", s16 damage) +{ + bool32 useWonderRoom; + u32 move; + + PARAMETRIZE { useWonderRoom = FALSE; move = MOVE_SCRATCH; } + PARAMETRIZE { useWonderRoom = FALSE; move = MOVE_ROUND; } + PARAMETRIZE { useWonderRoom = TRUE; move = MOVE_SCRATCH; } + PARAMETRIZE { useWonderRoom = TRUE; move = MOVE_ROUND; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_WONDER_ROOM) == EFFECT_WONDER_ROOM); + ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveEffect(MOVE_ROUND) != EFFECT_PSYSHOCK); + PLAYER(SPECIES_CHI_YU) { Ability(ABILITY_BEADS_OF_RUIN); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (useWonderRoom) + TURN { MOVE(opponentLeft, MOVE_WONDER_ROOM); MOVE(playerRight, move, target: opponentLeft); } + else + TURN { MOVE(playerRight, move, target: opponentLeft); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_BEADS_OF_RUIN); + MESSAGE("Chi-Yu's Beads of Ruin weakened the Sp. Def of all surrounding PokΓ©mon!"); + ANIMATION(ANIM_TYPE_MOVE, move, playerRight); + HP_BAR(opponentLeft, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_GT(results[2].damage, results[0].damage); // In Wonder Room, physical move deals more damage + EXPECT_LT(results[3].damage, results[1].damage); // In Wonder Room, special move deals less damage + } +} + +SINGLE_BATTLE_TEST("Beads of Ruin doesn't activate when dragged out by Mold Breaker attacker") +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_MOLD_BREAKER; } + PARAMETRIZE { ability = ABILITY_SAND_RUSH; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_DRAGON_TAIL) == EFFECT_HIT_SWITCH_TARGET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_CHI_YU) { Ability(ABILITY_BEADS_OF_RUIN); } + OPPONENT(SPECIES_EXCADRILL) { Ability(ability); } + } WHEN { + TURN { MOVE(opponent, MOVE_DRAGON_TAIL); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_TAIL, opponent); + if (ability == ABILITY_MOLD_BREAKER) + { + NONE_OF { + ABILITY_POPUP(player, ABILITY_BEADS_OF_RUIN); + MESSAGE("Chi-Yu's Beads of Ruin weakened the Sp. Def of all surrounding PokΓ©mon!"); + } + } + else + { + ABILITY_POPUP(player, ABILITY_BEADS_OF_RUIN); + MESSAGE("Chi-Yu's Beads of Ruin weakened the Sp. Def of all surrounding PokΓ©mon!"); + } + } +} + +DOUBLE_BATTLE_TEST("Beads of Ruin's Sp. Def reduction is not ignored by Mold Breaker", s16 damage) +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_MOLD_BREAKER; } + PARAMETRIZE { ability = ABILITY_SAND_RUSH; } + + GIVEN { + PLAYER(SPECIES_CHI_YU) { Ability(ABILITY_BEADS_OF_RUIN); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_EXCADRILL) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_ROUND, target: playerRight); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_BEADS_OF_RUIN); + MESSAGE("Chi-Yu's Beads of Ruin weakened the Sp. Def of all surrounding PokΓ©mon!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentLeft); + HP_BAR(playerRight, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} + +DOUBLE_BATTLE_TEST("Beads of Ruin's Sp. Def reduction is ignored by Gastro Acid", s16 damage) +{ + u32 move; + + PARAMETRIZE { move = MOVE_GASTRO_ACID; } + PARAMETRIZE { move = MOVE_CELEBRATE; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_GASTRO_ACID) == EFFECT_GASTRO_ACID); + PLAYER(SPECIES_CHI_YU) { Ability(ABILITY_BEADS_OF_RUIN); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentRight, move, target: playerLeft); MOVE(opponentLeft, MOVE_ROUND, target: playerRight); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_BEADS_OF_RUIN); + MESSAGE("Chi-Yu's Beads of Ruin weakened the Sp. Def of all surrounding PokΓ©mon!"); + ANIMATION(ANIM_TYPE_MOVE, move, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentLeft); + HP_BAR(playerRight, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_LT(results[0].damage, results[1].damage); + } +} diff --git a/test/battle/ability/berserk.c b/test/battle/ability/berserk.c index 80e418e3c53a..fe356bc6711d 100644 --- a/test/battle/ability/berserk.c +++ b/test/battle/ability/berserk.c @@ -73,3 +73,64 @@ SINGLE_BATTLE_TEST("Berserk activates after all hits from a multi-hit move") EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); } } + +SINGLE_BATTLE_TEST("Berserk does not activate if move is boosted by Sheer Force") +{ + u16 maxHp = 500; + GIVEN { + PLAYER(SPECIES_DRAMPA) { Ability(ABILITY_BERSERK); MaxHP(maxHp); HP(maxHp / 2 + 1); } + OPPONENT(SPECIES_NIDOKING) { Ability(ABILITY_SHEER_FORCE); } + } WHEN { + TURN { MOVE(opponent, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, opponent); + NOT ABILITY_POPUP(player, ABILITY_BERSERK); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); + } +} + +SINGLE_BATTLE_TEST("Berserk will not activate if the last multi hit move activates a restore berry") +{ + u32 j; + GIVEN { + ASSUME(GetMoveEffect(MOVE_DOUBLE_SLAP) == EFFECT_MULTI_HIT); + PLAYER(SPECIES_DRAMPA) { Ability(ABILITY_BERSERK); Item(ITEM_SITRUS_BERRY); MaxHP(100); HP(90); } + OPPONENT(SPECIES_SHELLDER) { Ability(ABILITY_SKILL_LINK); } // Always hits 5 times. + } WHEN { + TURN { MOVE(opponent, MOVE_DOUBLE_SLAP); } + } SCENE { + for (j = 0; j < 4; j++) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_SLAP, opponent); + NOT ABILITY_POPUP(player, ABILITY_BERSERK); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_SLAP, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + NOT ABILITY_POPUP(player, ABILITY_BERSERK); + + } THEN { + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE); + } +} + +SINGLE_BATTLE_TEST("Berserk activates before the hp can be restored on non multi hit moves") +{ + u16 maxHp = 500; + GIVEN { + ASSUME(!IsBattleMoveStatus(MOVE_SCRATCH)); + PLAYER(SPECIES_DRAMPA) { Ability(ABILITY_BERSERK); Item(ITEM_SITRUS_BERRY); MaxHP(maxHp); HP(maxHp / 2 + 1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + ABILITY_POPUP(player, ABILITY_BERSERK); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + } +} diff --git a/test/battle/ability/bulletproof.c b/test/battle/ability/bulletproof.c index 733eb63a11a7..37d59b468e55 100644 --- a/test/battle/ability/bulletproof.c +++ b/test/battle/ability/bulletproof.c @@ -1,4 +1,20 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Bulletproof makes ballistic moves fail against the ability user"); +SINGLE_BATTLE_TEST("Bulletproof makes ballistic moves fail against the ability user") +{ + GIVEN { + ASSUME(IsBallisticMove(MOVE_ELECTRO_BALL)); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_CHESPIN) { Ability(ABILITY_BULLETPROOF); } + } WHEN { + TURN { MOVE(player, MOVE_ELECTRO_BALL); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_BULLETPROOF); + MESSAGE("The opposing Chespin's Bulletproof blocks Electro Ball!"); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRO_BALL, player); + HP_BAR(opponent); + } + } +} diff --git a/test/battle/ability/cheek_pouch.c b/test/battle/ability/cheek_pouch.c index 3c932c4aa140..ffd1c8416e51 100644 --- a/test/battle/ability/cheek_pouch.c +++ b/test/battle/ability/cheek_pouch.c @@ -1,6 +1,15 @@ #include "global.h" #include "test/battle.h" +TO_DO_BATTLE_TEST("Cheek Pouch restores 33% max HP") +TO_DO_BATTLE_TEST("Cheek Pouch restores HP after the berry's effect") +TO_DO_BATTLE_TEST("Cheek Pouch activates via Bug Bite/Pluck if it would trigger an effect") +TO_DO_BATTLE_TEST("Cheek Pouch activates when receiving from Fling if it would trigger an effect") +TO_DO_BATTLE_TEST("Cheek Pouch doesn't activate when using Natural Gift") +TO_DO_BATTLE_TEST("Cheek Pouch doesn't activate when using Fling") +TO_DO_BATTLE_TEST("Cheek Pouch doesn't activate when using a berry from the bag") +TO_DO_BATTLE_TEST("Cheek Pouch doesn't activate under Heal Block's effect") + SINGLE_BATTLE_TEST("Cheek Pouch activation doesn't mutate damage when restoring HP mid battle") { s16 damage; diff --git a/test/battle/ability/clear_body.c b/test/battle/ability/clear_body.c index 46185791a396..f5b9573fe064 100644 --- a/test/battle/ability/clear_body.c +++ b/test/battle/ability/clear_body.c @@ -5,7 +5,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent intimid { s16 turnOneHit; s16 turnTwoHit; - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; } PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; } @@ -40,7 +41,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent intimid SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent stat stage reduction from moves") { u16 move = MOVE_NONE; - u32 j, species = SPECIES_NONE, ability = ABILITY_NONE; + u32 j, species = SPECIES_NONE; + enum Ability ability = ABILITY_NONE; static const u16 statReductionMoves[] = { MOVE_GROWL, MOVE_LEER, @@ -86,7 +88,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent stat st SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent Sticky Web effect on switchin") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; } PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; } PARAMETRIZE{ species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; } @@ -114,7 +117,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent Sticky SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent stat stage reduction from moves used by the user") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; } PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; } PARAMETRIZE{ species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; } @@ -137,8 +141,9 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent s SINGLE_BATTLE_TEST("Mold Breaker, Teravolt, and Turboblaze ignore Clear Body and White Smoke, but not Full Metal Body") { - u32 j, k, species = SPECIES_NONE, ability = ABILITY_NONE; - u16 breakerAbility = ABILITY_NONE; + u32 j, k, species = SPECIES_NONE; + enum Ability ability = ABILITY_NONE; + enum Ability breakerAbility = ABILITY_NONE; u16 move = ABILITY_NONE; static const u16 breakerAbilities[] = { ABILITY_MOLD_BREAKER, @@ -197,7 +202,8 @@ SINGLE_BATTLE_TEST("Mold Breaker, Teravolt, and Turboblaze ignore Clear Body and SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent Speed reduction from Iron Ball") { - u32 j, species = SPECIES_NONE, ability = ABILITY_NONE; + u32 j, species = SPECIES_NONE; + enum Ability ability = ABILITY_NONE; u16 heldItem = ITEM_NONE; static const u16 heldItems[] = { ITEM_NONE, @@ -239,7 +245,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent S SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent Speed reduction from paralysis") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; } PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; } @@ -276,7 +283,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent S SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent Attack reduction from burn", s16 damage) { bool32 burned = FALSE; - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; burned = FALSE; } PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; burned = TRUE; } PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; burned = FALSE; } @@ -299,7 +307,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent A SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent receiving negative stat changes from Baton Pass") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; } PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; } @@ -329,7 +338,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent r SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent Topsy-Turvy") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; } PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; } @@ -370,7 +380,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent T SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent Spectral Thief from resetting positive stat changes") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; } PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; } @@ -417,7 +428,7 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke protect from Pr { u32 move = MOVE_NONE; u32 species = SPECIES_NONE; - u32 ability = ABILITY_NONE; + enum Ability ability = ABILITY_NONE; static const u32 moves[] = { MOVE_SPIKY_SHIELD, diff --git a/test/battle/ability/cloud_nine.c b/test/battle/ability/cloud_nine.c index 613ea86e0acf..a4eddd1e1c08 100644 --- a/test/battle/ability/cloud_nine.c +++ b/test/battle/ability/cloud_nine.c @@ -3,7 +3,8 @@ SINGLE_BATTLE_TEST("Cloud Nine/Air Lock prevent basic weather effects, but without them disappearing - Sandstorm") { - u32 species = 0, ability = 0; + u32 species = 0; + enum Ability ability = 0; PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; } PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } GIVEN { diff --git a/test/battle/ability/color_change.c b/test/battle/ability/color_change.c index b6af05fdbe41..49eaa3e9167d 100644 --- a/test/battle/ability/color_change.c +++ b/test/battle/ability/color_change.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Color Change changes the type of a Pokemon being hit by a move if the type of the move and the Pokemon are different") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_KECLEON].types[0] != TYPE_PSYCHIC && gSpeciesInfo[SPECIES_KECLEON].types[1] != TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_KECLEON, 0) != TYPE_PSYCHIC && GetSpeciesType(SPECIES_KECLEON, 1) != TYPE_PSYCHIC); ASSUME(GetMoveType(MOVE_PSYWAVE) == TYPE_PSYCHIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_COLOR_CHANGE); } @@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Color Change changes the type of a Pokemon being hit by a mo SINGLE_BATTLE_TEST("Color Change does not change the type when hit by a move that's the same type as itself") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_KECLEON].types[0] == TYPE_NORMAL || gSpeciesInfo[SPECIES_KECLEON].types[1] == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_KECLEON, 0) == TYPE_NORMAL || GetSpeciesType(SPECIES_KECLEON, 1) == TYPE_NORMAL); ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_COLOR_CHANGE); } @@ -153,3 +153,36 @@ SINGLE_BATTLE_TEST("Color Change changes the type to Normal when a Pokemon is hi MESSAGE("The opposing Kecleon's Color Change made it the Normal type!"); } } + +SINGLE_BATTLE_TEST("Color Change does not change the type to Normal when a Pokemon is hit by Struggle") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_COLOR_CHANGE); } + } WHEN { + TURN { MOVE(player, MOVE_SOAK); } + TURN { MOVE(player, MOVE_STRUGGLE); } + TURN { } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SOAK, player); + MESSAGE("The opposing Kecleon transformed into the Water type!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STRUGGLE, player); + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_COLOR_CHANGE); + MESSAGE("The opposing Kecleon's Color Change made it the Normal type!"); + } + } +} + +SINGLE_BATTLE_TEST("Color Change does not activate if move is boosted by Sheer Force") +{ + GIVEN { + PLAYER(SPECIES_KECLEON) { Ability(ABILITY_COLOR_CHANGE); } + OPPONENT(SPECIES_NIDOKING) { Ability(ABILITY_SHEER_FORCE); } + } WHEN { + TURN { MOVE(opponent, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, opponent); + NOT ABILITY_POPUP(player, ABILITY_COLOR_CHANGE); + } +} diff --git a/test/battle/ability/comatose.c b/test/battle/ability/comatose.c index d714ee5e3daf..c049d5624d3b 100644 --- a/test/battle/ability/comatose.c +++ b/test/battle/ability/comatose.c @@ -24,7 +24,7 @@ SINGLE_BATTLE_TEST("Comatose prevents status-inducing moves") } } -SINGLE_BATTLE_TEST("Comatose may be suppressed if pokemon transformed into a pokemon with Comatose ability and was under the effects of Gastro Acid") +SINGLE_BATTLE_TEST("Comatose may be suppressed if PokΓ©mon transformed into a PokΓ©mon with Comatose ability and was under the effects of Gastro Acid") { u32 move; @@ -56,7 +56,7 @@ SINGLE_BATTLE_TEST("Comatose may be suppressed if pokemon transformed into a pok } } -SINGLE_BATTLE_TEST("Comatose pokemon doesn't get poisoned by Toxic Spikes on switch-in") +SINGLE_BATTLE_TEST("Comatose PokΓ©mon doesn't get poisoned by Toxic Spikes on switch-in") { GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -72,7 +72,7 @@ SINGLE_BATTLE_TEST("Comatose pokemon doesn't get poisoned by Toxic Spikes on swi } } -SINGLE_BATTLE_TEST("Comatose pokemon don't get poisoned by Toxic Spikes on switch-in if forced in by phazing with Mold Breaker") +SINGLE_BATTLE_TEST("Comatose PokΓ©mon don't get poisoned by Toxic Spikes on switch-in if forced in by phazing with Mold Breaker") { GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -87,3 +87,8 @@ SINGLE_BATTLE_TEST("Comatose pokemon don't get poisoned by Toxic Spikes on switc NOT HP_BAR(player); } } + +TO_DO_BATTLE_TEST("Comatose makes Rest fail") +TO_DO_BATTLE_TEST("Comatose isn't affected by Mold Breaker, Turboblaze or Teravolt") +TO_DO_BATTLE_TEST("Comatose isn't affected by Poison Touch + Sunsteel Strike") +TO_DO_BATTLE_TEST("Comatose boosts Dream Ball's multiplier") diff --git a/test/battle/ability/competitive.c b/test/battle/ability/competitive.c index cc3e582eab57..28cd0198abe5 100644 --- a/test/battle/ability/competitive.c +++ b/test/battle/ability/competitive.c @@ -1,4 +1,337 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Competitive (Ability) test titles") +DOUBLE_BATTLE_TEST("Competitive sharply raises player's Sp. Atk after Intimidate") +{ + u32 abilityLeft, abilityRight; + + PARAMETRIZE { abilityLeft = ABILITY_FRIEND_GUARD; abilityRight = ABILITY_FRIEND_GUARD; } + PARAMETRIZE { abilityLeft = ABILITY_FRIEND_GUARD; abilityRight = ABILITY_COMPETITIVE; } + PARAMETRIZE { abilityLeft = ABILITY_COMPETITIVE; abilityRight = ABILITY_FRIEND_GUARD; } + PARAMETRIZE { abilityLeft = ABILITY_COMPETITIVE; abilityRight = ABILITY_COMPETITIVE; } + + GIVEN { + PLAYER(SPECIES_IGGLYBUFF) { Ability(abilityLeft); } + PLAYER(SPECIES_JIGGLYPUFF) { Ability(abilityRight); } + OPPONENT(SPECIES_GYARADOS) { Ability(ABILITY_INTIMIDATE); } + OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_SCRATCH, target:opponentLeft); MOVE(playerRight, MOVE_SCRATCH, target:opponentRight); } + } SCENE { + //1st mon Intimidate + ABILITY_POPUP(opponentLeft, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("The opposing Gyarados's Intimidate cuts Igglybuff's Attack!"); + if (abilityLeft == ABILITY_COMPETITIVE) { + ABILITY_POPUP(playerLeft, ABILITY_COMPETITIVE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("Igglybuff's Sp. Atk sharply rose!"); + } + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + MESSAGE("The opposing Gyarados's Intimidate cuts Jigglypuff's Attack!"); + if (abilityRight == ABILITY_COMPETITIVE) { + ABILITY_POPUP(playerRight, ABILITY_COMPETITIVE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + MESSAGE("Jigglypuff's Sp. Atk sharply rose!"); + } + + //2nd mon Intimidate + ABILITY_POPUP(opponentRight, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("The opposing Arbok's Intimidate cuts Igglybuff's Attack!"); + if (abilityLeft == ABILITY_COMPETITIVE) { + ABILITY_POPUP(playerLeft, ABILITY_COMPETITIVE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("Igglybuff's Sp. Atk sharply rose!"); + } + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + MESSAGE("The opposing Arbok's Intimidate cuts Jigglypuff's Attack!"); + if (abilityRight == ABILITY_COMPETITIVE) { + ABILITY_POPUP(playerRight, ABILITY_COMPETITIVE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + MESSAGE("Jigglypuff's Sp. Atk sharply rose!"); + } + } THEN { + EXPECT_EQ(playerLeft->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + (abilityLeft == ABILITY_COMPETITIVE ? 4 : 0)); + EXPECT_EQ(playerRight->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + (abilityRight == ABILITY_COMPETITIVE ? 4 : 0)); + } +} + +// Same as above, but for opponent. +DOUBLE_BATTLE_TEST("Competitive sharply raises opponent's Sp. Atk after Intimidate") +{ + u32 abilityLeft, abilityRight; + + PARAMETRIZE { abilityLeft = ABILITY_FRIEND_GUARD; abilityRight = ABILITY_FRIEND_GUARD; } + PARAMETRIZE { abilityLeft = ABILITY_FRIEND_GUARD; abilityRight = ABILITY_COMPETITIVE; } + PARAMETRIZE { abilityLeft = ABILITY_COMPETITIVE; abilityRight = ABILITY_FRIEND_GUARD; } + PARAMETRIZE { abilityLeft = ABILITY_COMPETITIVE; abilityRight = ABILITY_COMPETITIVE; } + + GIVEN { + OPPONENT(SPECIES_IGGLYBUFF) { Ability(abilityLeft); } + OPPONENT(SPECIES_JIGGLYPUFF) { Ability(abilityRight); } + PLAYER(SPECIES_GYARADOS) { Ability(ABILITY_INTIMIDATE); } + PLAYER(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target:playerLeft); MOVE(opponentRight, MOVE_SCRATCH, target:playerRight); } + } SCENE { + //1st mon Intimidate + ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + MESSAGE("Gyarados's Intimidate cuts the opposing Igglybuff's Attack!"); + if (abilityLeft == ABILITY_COMPETITIVE) { + ABILITY_POPUP(opponentLeft, ABILITY_COMPETITIVE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + MESSAGE("The opposing Igglybuff's Sp. Atk sharply rose!"); + } + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + MESSAGE("Gyarados's Intimidate cuts the opposing Jigglypuff's Attack!"); + if (abilityRight == ABILITY_COMPETITIVE) { + ABILITY_POPUP(opponentRight, ABILITY_COMPETITIVE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + MESSAGE("The opposing Jigglypuff's Sp. Atk sharply rose!"); + } + + //2nd mon Intimidate + ABILITY_POPUP(playerRight, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + MESSAGE("Arbok's Intimidate cuts the opposing Igglybuff's Attack!"); + if (abilityLeft == ABILITY_COMPETITIVE) { + ABILITY_POPUP(opponentLeft, ABILITY_COMPETITIVE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + MESSAGE("The opposing Igglybuff's Sp. Atk sharply rose!"); + } + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + MESSAGE("Arbok's Intimidate cuts the opposing Jigglypuff's Attack!"); + if (abilityRight == ABILITY_COMPETITIVE) { + ABILITY_POPUP(opponentRight, ABILITY_COMPETITIVE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + MESSAGE("The opposing Jigglypuff's Sp. Atk sharply rose!"); + } + } THEN { + EXPECT_EQ(opponentLeft->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + (abilityLeft == ABILITY_COMPETITIVE ? 4 : 0)); + EXPECT_EQ(opponentRight->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + (abilityRight == ABILITY_COMPETITIVE ? 4 : 0)); + } +} + +SINGLE_BATTLE_TEST("Competitive activates after Sticky Web lowers Speed") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_IGGLYBUFF) { Ability(ABILITY_COMPETITIVE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_STICKY_WEB); } + TURN { SWITCH(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, opponent); + // Switch-in - Sticky Web activates + SEND_IN_MESSAGE("Igglybuff"); + MESSAGE("Igglybuff was caught in a sticky web!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Igglybuff's Speed fell!"); + // Competitive activates + ABILITY_POPUP(player, ABILITY_COMPETITIVE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Igglybuff's Sp. Atk sharply rose!"); + } +} + +SINGLE_BATTLE_TEST("Competitive doesn't activate after Sticky Web lowers Speed if Court Changed (gen8)") +{ + GIVEN { + WITH_CONFIG(CONFIG_DEFIANT_STICKY_WEB, GEN_8); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_IGGLYBUFF) { Ability(ABILITY_COMPETITIVE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_STICKY_WEB); MOVE(opponent, MOVE_COURT_CHANGE); } + TURN { SWITCH(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_COURT_CHANGE, opponent); + // Switch-in - Sticky Web activates + SEND_IN_MESSAGE("Igglybuff"); + MESSAGE("Igglybuff was caught in a sticky web!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Igglybuff's Speed fell!"); + // Competitive doesn't activate + NONE_OF { + ABILITY_POPUP(player, ABILITY_COMPETITIVE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Igglybuff's Sp. Atk sharply rose!"); + } + } +} + +SINGLE_BATTLE_TEST("Competitive correctly activates after Sticky Web lowers Speed if Court Changed (Gen8)") +{ + GIVEN { + WITH_CONFIG(CONFIG_DEFIANT_STICKY_WEB, GEN_8); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_IGGLYBUFF) { Ability(ABILITY_COMPETITIVE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_STICKY_WEB); MOVE(opponent, MOVE_COURT_CHANGE); } + TURN { SWITCH(player, 1); } + TURN { MOVE(opponent, MOVE_GROWL);} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_COURT_CHANGE, opponent); + // Switch-in - Sticky Web activates + SEND_IN_MESSAGE("Igglybuff"); + MESSAGE("Igglybuff was caught in a sticky web!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Igglybuff's Speed fell!"); + // Competitive doesn't activate + NONE_OF { + ABILITY_POPUP(player, ABILITY_COMPETITIVE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Igglybuff's Sp. Atk sharply rose!"); + } + // Competitive triggers correctly after Sticky Web + ANIMATION(ANIM_TYPE_MOVE, MOVE_GROWL, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Igglybuff's Attack fell!"); + ABILITY_POPUP(player, ABILITY_COMPETITIVE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Igglybuff's Sp. Atk sharply rose!"); + } +} + +DOUBLE_BATTLE_TEST("Competitive is activated by Cotton Down for non-ally pokemon") +{ + GIVEN { + PLAYER(SPECIES_IGGLYBUFF) { Ability(ABILITY_COMPETITIVE); } + PLAYER(SPECIES_IGGLYBUFF) { Ability(ABILITY_COMPETITIVE); } + OPPONENT(SPECIES_ELDEGOSS) { Ability(ABILITY_COTTON_DOWN); } + OPPONENT(SPECIES_IGGLYBUFF) { Ability(ABILITY_COMPETITIVE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_SCRATCH, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_COTTON_DOWN); + + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("Igglybuff's Speed fell!"); + ABILITY_POPUP(playerLeft, ABILITY_COMPETITIVE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("Igglybuff's Sp. Atk sharply rose!"); + + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + MESSAGE("Igglybuff's Speed fell!"); + ABILITY_POPUP(playerRight, ABILITY_COMPETITIVE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + MESSAGE("Igglybuff's Sp. Atk sharply rose!"); + + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + MESSAGE("The opposing Igglybuff's Speed fell!"); + } THEN { + EXPECT_EQ(playerLeft->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(playerRight->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(opponentRight->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(playerLeft->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 2); + EXPECT_EQ(playerRight->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 2); + } +} + +SINGLE_BATTLE_TEST("Competitive activates before White Herb") +{ + u32 move; + + PARAMETRIZE { move = MOVE_LEER; } + PARAMETRIZE { move = MOVE_CONFIDE; } + + GIVEN { + PLAYER(SPECIES_IGGLYBUFF) { Ability(ABILITY_COMPETITIVE); Item(ITEM_WHITE_HERB); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + + ABILITY_POPUP(player, ABILITY_COMPETITIVE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Igglybuff's Sp. Atk sharply rose!"); + + if (move == MOVE_LEER) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Igglybuff returned its stats to normal using its White Herb!"); + } else { + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Igglybuff returned its stats to normal using its White Herb!"); + } + } + } THEN { + if (move == MOVE_LEER) { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 2); + } else { + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + } + } +} + +SINGLE_BATTLE_TEST("Competitive activates for each stat that is lowered") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_TICKLE) == EFFECT_TICKLE); + PLAYER(SPECIES_IGGLYBUFF) { Ability(ABILITY_COMPETITIVE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_TICKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TICKLE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + + MESSAGE("Igglybuff's Attack fell!"); + ABILITY_POPUP(player, ABILITY_COMPETITIVE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Igglybuff's Sp. Atk sharply rose!"); + + MESSAGE("Igglybuff's Defense fell!"); + ABILITY_POPUP(player, ABILITY_COMPETITIVE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Igglybuff's Sp. Atk sharply rose!"); + + } THEN { + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 4); + } +} + +SINGLE_BATTLE_TEST("Competitive doesn't activate if the pokemon lowers it's own stats") +{ + u32 move; + + PARAMETRIZE { move = MOVE_SUPERPOWER; } + PARAMETRIZE { move = MOVE_CLOSE_COMBAT; } + PARAMETRIZE { move = MOVE_MAKE_IT_RAIN; } + PARAMETRIZE { move = MOVE_SPIN_OUT; } + + GIVEN { + ASSUME(MoveHasAdditionalEffectSelf(MOVE_SUPERPOWER, MOVE_EFFECT_ATK_DEF_DOWN)); + ASSUME(MoveHasAdditionalEffectSelf(MOVE_CLOSE_COMBAT, MOVE_EFFECT_DEF_SPDEF_DOWN)); + ASSUME(MoveHasAdditionalEffectSelf(MOVE_MAKE_IT_RAIN, MOVE_EFFECT_SP_ATK_MINUS_1)); + ASSUME(MoveHasAdditionalEffectSelf(MOVE_SPIN_OUT, MOVE_EFFECT_SPD_MINUS_2)); + PLAYER(SPECIES_IGGLYBUFF) { Ability(ABILITY_COMPETITIVE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + + NONE_OF { + ABILITY_POPUP(player, ABILITY_COMPETITIVE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Igglybuff's Sp. Atk sharply rose!"); + } + } THEN { + if (move == MOVE_SUPERPOWER) + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 1); + else + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + } +} diff --git a/test/battle/ability/contrary.c b/test/battle/ability/contrary.c index e174427406d2..ef5b4c6c7d45 100644 --- a/test/battle/ability/contrary.c +++ b/test/battle/ability/contrary.c @@ -8,7 +8,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Contrary raises Attack when Intimidated in a single battle", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CONTRARY; } PARAMETRIZE { ability = ABILITY_TANGLED_FEET; } GIVEN { @@ -19,20 +19,23 @@ SINGLE_BATTLE_TEST("Contrary raises Attack when Intimidated in a single battle", } SCENE { ABILITY_POPUP(player, ABILITY_INTIMIDATE); if (ability == ABILITY_CONTRARY) { - ABILITY_POPUP(opponent, ABILITY_CONTRARY); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); MESSAGE("The opposing Spinda's Attack rose!"); + } else { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Mightyena's Intimidate cuts the opposing Spinda's Attack!"); } HP_BAR(player, captureDamage: &results[i].damage); - } - FINALLY { + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], (ability == ABILITY_CONTRARY) ? DEFAULT_STAT_STAGE + 1 : DEFAULT_STAT_STAGE - 1); + } FINALLY { EXPECT_MUL_EQ(results[1].damage, Q_4_12(2.25), results[0].damage); } } DOUBLE_BATTLE_TEST("Contrary raises Attack when Intimidated in a double battle", s16 damageLeft, s16 damageRight) { - u32 abilityLeft, abilityRight; + enum Ability abilityLeft, abilityRight; PARAMETRIZE { abilityLeft = ABILITY_CONTRARY; abilityRight = ABILITY_CONTRARY; } PARAMETRIZE { abilityLeft = ABILITY_TANGLED_FEET; abilityRight = ABILITY_TANGLED_FEET; } @@ -49,7 +52,6 @@ DOUBLE_BATTLE_TEST("Contrary raises Attack when Intimidated in a double battle", } SCENE { ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); if (abilityLeft == ABILITY_CONTRARY) { - ABILITY_POPUP(opponentLeft, ABILITY_CONTRARY); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); MESSAGE("The opposing Spinda's Attack rose!"); } else { @@ -57,7 +59,6 @@ DOUBLE_BATTLE_TEST("Contrary raises Attack when Intimidated in a double battle", MESSAGE("Mightyena's Intimidate cuts the opposing Spinda's Attack!"); } if (abilityRight == ABILITY_CONTRARY) { - ABILITY_POPUP(opponentRight, ABILITY_CONTRARY); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); MESSAGE("The opposing Spinda's Attack rose!"); } else { @@ -69,8 +70,7 @@ DOUBLE_BATTLE_TEST("Contrary raises Attack when Intimidated in a double battle", } THEN { EXPECT_EQ(opponentLeft->statStages[STAT_ATK], (abilityLeft == ABILITY_CONTRARY) ? DEFAULT_STAT_STAGE+1 : DEFAULT_STAT_STAGE-1); EXPECT_EQ(opponentRight->statStages[STAT_ATK], (abilityRight == ABILITY_CONTRARY) ? DEFAULT_STAT_STAGE+1 : DEFAULT_STAT_STAGE-1); - } - FINALLY { + } FINALLY { EXPECT_MUL_EQ(results[1].damageLeft, Q_4_12(2.25), results[0].damageLeft); EXPECT_MUL_EQ(results[1].damageRight, Q_4_12(2.25), results[0].damageRight); } @@ -78,7 +78,7 @@ DOUBLE_BATTLE_TEST("Contrary raises Attack when Intimidated in a double battle", SINGLE_BATTLE_TEST("Contrary raises stats after using a move which would normally lower them: Overheat", s16 damageBefore, s16 damageAfter) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CONTRARY; } PARAMETRIZE { ability = ABILITY_TANGLED_FEET; } GIVEN { @@ -122,7 +122,7 @@ SINGLE_BATTLE_TEST("Contrary raises stats after using a move which would normall SINGLE_BATTLE_TEST("Contrary lowers a stat after using a move which would normally raise it: Swords Dance", s16 damageBefore, s16 damageAfter) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CONTRARY; } PARAMETRIZE { ability = ABILITY_TANGLED_FEET; } GIVEN { @@ -159,7 +159,7 @@ SINGLE_BATTLE_TEST("Contrary lowers a stat after using a move which would normal SINGLE_BATTLE_TEST("Contrary raises a stat after using a move which would normally lower it: Growl", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CONTRARY; } PARAMETRIZE { ability = ABILITY_TANGLED_FEET; } GIVEN { @@ -190,7 +190,7 @@ SINGLE_BATTLE_TEST("Contrary raises a stat after using a move which would normal SINGLE_BATTLE_TEST("Contrary lowers a stat after using a move which would normally raise it: Belly Drum", s16 damageBefore, s16 damageAfter) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CONTRARY; } PARAMETRIZE { ability = ABILITY_TANGLED_FEET; } GIVEN { @@ -241,3 +241,32 @@ SINGLE_BATTLE_TEST("Sticky Web raises Speed by 1 for Contrary mon on switch-in") MESSAGE("The opposing Snivy's Speed rose!"); } } + +AI_SINGLE_BATTLE_TEST("AI sees Contrary-effected moves correctly in MoveEffectInPlus instead of as a neutral effect") +{ + GIVEN{ + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_HERACROSS){ + Level(44); + HP(1); + Speed(5); + Nature(NATURE_ADAMANT); + Item(ITEM_LOADED_DICE); + Moves(MOVE_PIN_MISSILE); + } + OPPONENT(SPECIES_SERPERIOR){ + Level(44); + Speed(10); + Nature(NATURE_TIMID); + Ability(ABILITY_CONTRARY); + Moves(MOVE_DRAGON_PULSE, MOVE_SPIN_OUT, MOVE_HIDDEN_POWER, MOVE_GLARE); + } + } WHEN { + TURN{ + MOVE(player, MOVE_PIN_MISSILE); + EXPECT_MOVE(opponent, MOVE_SPIN_OUT); // previously all 107, now sees speed can rise w/ Contrary + } + } +} + +TO_DO_BATTLE_TEST("Contrary does not invert stat changes that have been Baton-passed") diff --git a/test/battle/ability/corrosion.c b/test/battle/ability/corrosion.c index 1e589967db17..ca6b60200279 100644 --- a/test/battle/ability/corrosion.c +++ b/test/battle/ability/corrosion.c @@ -238,3 +238,10 @@ SINGLE_BATTLE_TEST("Corrosion's effect is lost if the move used by the PokΓ©mon } } } + +TO_DO_BATTLE_TEST("Corrosion can poison Poison/Steel types if the PokΓ©mon uses Baneful Bunker") +TO_DO_BATTLE_TEST("Corrosion can poison Poison/Steel types if the PokΓ©mon uses Psycho Shift while poisoned") +TO_DO_BATTLE_TEST("Corrosion can poison Poison/Steel types if the PokΓ©mon uses Fling while holding a Toxic Orb") +TO_DO_BATTLE_TEST("Corrosion can poison Poison/Steel types if the PokΓ©mon uses Fling while holding a Poison Barb") +TO_DO_BATTLE_TEST("Dynamax: Corrosion can poison Poison/Steel types if the PokΓ©mon uses G-Max Malodor") +TO_DO_BATTLE_TEST("Corrosion does not affect Poison Spikes") diff --git a/test/battle/ability/costar.c b/test/battle/ability/costar.c index 7107b00d61a7..bc06ac26a7af 100644 --- a/test/battle/ability/costar.c +++ b/test/battle/ability/costar.c @@ -25,6 +25,99 @@ DOUBLE_BATTLE_TEST("Costar copies an ally's stat stages upon entering battle") } } +DOUBLE_BATTLE_TEST("Costar copies an ally's Dragon Cheer critical hit boost") +{ + PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT); + GIVEN { + ASSUME(gMovesInfo[MOVE_DRAGON_CHEER].effect == EFFECT_DRAGON_CHEER); + ASSUME(gMovesInfo[MOVE_TACKLE].criticalHitStage == 0); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_FLAMIGO) { Ability(ABILITY_COSTAR); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerRight, MOVE_DRAGON_CHEER, target: playerLeft); MOVE(playerLeft, MOVE_CELEBRATE); } + TURN { SWITCH(playerRight, 2); } + TURN { MOVE(playerRight, MOVE_TACKLE, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_CHEER, playerRight); + ABILITY_POPUP(playerRight, ABILITY_COSTAR); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, playerRight); + MESSAGE("A critical hit!"); + } +} + +DOUBLE_BATTLE_TEST("Costar copies an ally's lowered stat stages") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_GROWL].effect == EFFECT_ATTACK_DOWN); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_FLAMIGO) { Ability(ABILITY_COSTAR); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_GROWL); MOVE(opponentRight, MOVE_CELEBRATE); } + TURN { SWITCH(playerRight, 2); MOVE(playerLeft, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GROWL, opponentLeft); + ABILITY_POPUP(playerRight, ABILITY_COSTAR); + } THEN { + EXPECT_EQ(playerLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(playerRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 1); + } +} + +DOUBLE_BATTLE_TEST("Costar copies an ally's Focus Energy critical hit boost") +{ + PASSES_RANDOMLY(1, 2, RNG_CRITICAL_HIT); + GIVEN { + ASSUME(gMovesInfo[MOVE_FOCUS_ENERGY].effect == EFFECT_FOCUS_ENERGY); + ASSUME(gMovesInfo[MOVE_TACKLE].criticalHitStage == 0); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_FLAMIGO) { Ability(ABILITY_COSTAR); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SWORDS_DANCE); MOVE(playerRight, MOVE_CELEBRATE); } + TURN { MOVE(playerLeft, MOVE_FOCUS_ENERGY); MOVE(playerRight, MOVE_CELEBRATE); } + TURN { SWITCH(playerRight, 2); } + TURN { MOVE(playerRight, MOVE_TACKLE, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_ENERGY, playerLeft); + ABILITY_POPUP(playerRight, ABILITY_COSTAR); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, playerRight); + MESSAGE("A critical hit!"); + } +} + +DOUBLE_BATTLE_TEST("Costar copies an ally's Dragon Cheer critical hit boost") +{ + PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT); + GIVEN { + ASSUME(gMovesInfo[MOVE_DRAGON_CHEER].effect == EFFECT_DRAGON_CHEER); + ASSUME(gMovesInfo[MOVE_TACKLE].criticalHitStage == 0); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_FLAMIGO) { Ability(ABILITY_COSTAR); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerRight, MOVE_DRAGON_CHEER, target: playerLeft); MOVE(playerLeft, MOVE_SWORDS_DANCE); } + TURN { SWITCH(playerRight, 2); MOVE(playerLeft, MOVE_CELEBRATE); } + TURN { MOVE(playerRight, MOVE_TACKLE, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_CHEER, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, playerLeft); + ABILITY_POPUP(playerRight, ABILITY_COSTAR); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, playerRight); + MESSAGE("A critical hit!"); + } +} + // Copy from Ruin ability tests TO_DO_BATTLE_TEST("Costar's message displays correctly after all battlers fainted - Player"); TO_DO_BATTLE_TEST("Costar's message displays correctly after all battlers fainted - Opponent"); diff --git a/test/battle/ability/cud_chew.c b/test/battle/ability/cud_chew.c index 486e2e9dac08..aca9e7944735 100644 --- a/test/battle/ability/cud_chew.c +++ b/test/battle/ability/cud_chew.c @@ -28,8 +28,8 @@ SINGLE_BATTLE_TEST("Cud Chew will activate Oran Berry effect again on the next t GIVEN { ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffect == HOLD_EFFECT_RESTORE_HP); ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffectParam == 10); - ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_TAUROS_PALDEA_COMBAT) { MaxHP(60); HP(60); Ability(ABILITY_CUD_CHEW); Item(ITEM_ORAN_BERRY); } } WHEN { @@ -47,3 +47,5 @@ SINGLE_BATTLE_TEST("Cud Chew will activate Oran Berry effect again on the next t EXPECT_EQ(opponent->hp, 40); } } + +TO_DO_BATTLE_TEST("Cud Chew will activate Lum Berry effect again on the next turn") diff --git a/test/battle/ability/curious_medicine.c b/test/battle/ability/curious_medicine.c index 3844170eb004..7c3e200c7a21 100644 --- a/test/battle/ability/curious_medicine.c +++ b/test/battle/ability/curious_medicine.c @@ -3,7 +3,7 @@ DOUBLE_BATTLE_TEST("Curious Medicine resets ally's stat stages upon entering battle") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CURIOUS_MEDICINE; } PARAMETRIZE { ability = ABILITY_OWN_TEMPO; } diff --git a/test/battle/ability/cursed_body.c b/test/battle/ability/cursed_body.c index 26d97a9f1189..b3bc886a3dfd 100644 --- a/test/battle/ability/cursed_body.c +++ b/test/battle/ability/cursed_body.c @@ -15,3 +15,78 @@ SINGLE_BATTLE_TEST("Cursed Body triggers 30% of the time") MESSAGE("Wobbuffet's Aqua Jet was disabled by the opposing Frillish's Cursed Body!"); } } + +SINGLE_BATTLE_TEST("Cursed Body cannot disable Struggle") +{ + GIVEN { + ASSUME(GetItemHoldEffect(ITEM_CHOICE_SCARF) == HOLD_EFFECT_CHOICE_SCARF); + ASSUME(GetMoveEffect(MOVE_TAUNT) == EFFECT_TAUNT); + ASSUME(GetMoveCategory(MOVE_CELEBRATE) == DAMAGE_CATEGORY_STATUS); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_CHOICE_SCARF); Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_FRILLISH) { Ability(ABILITY_CURSED_BODY); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_TAUNT); } + TURN { FORCED_MOVE(player); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STRUGGLE, player); + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_CURSED_BODY); + MESSAGE("Wobbuffet's Struggle was disabled by the opposing Frillish's Cursed Body!"); + } + } +} + +SINGLE_BATTLE_TEST("Cursed Body can trigger if the attacker is behind a Substitute") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SUBSTITUTE) == EFFECT_SUBSTITUTE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_FRILLISH) { Ability(ABILITY_CURSED_BODY); } + } WHEN { + TURN { MOVE(player, MOVE_SUBSTITUTE); } + TURN { MOVE(player, MOVE_AQUA_JET); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_AQUA_JET, player); + ABILITY_POPUP(opponent, ABILITY_CURSED_BODY); + MESSAGE("Wobbuffet's Aqua Jet was disabled by the opposing Frillish's Cursed Body!"); + } +} + +SINGLE_BATTLE_TEST("Cursed Body cannot trigger if the target is behind a Substitute") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SUBSTITUTE) == EFFECT_SUBSTITUTE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_FRILLISH) { Ability(ABILITY_CURSED_BODY); } + } WHEN { + TURN { MOVE(opponent, MOVE_SUBSTITUTE); } + TURN { MOVE(player, MOVE_AQUA_JET); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_AQUA_JET, player); + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_CURSED_BODY); + MESSAGE("Wobbuffet's Aqua Jet was disabled by the opposing Frillish's Cursed Body!"); + } + } +} + +SINGLE_BATTLE_TEST("Cursed Body does not stop a multistrike move mid-execution") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_ROCK_BLAST) == EFFECT_MULTI_HIT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_FRILLISH) { Ability(ABILITY_CURSED_BODY); } + } WHEN { + TURN { MOVE(player, MOVE_ROCK_BLAST); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_BLAST, player); + HP_BAR(opponent); + ABILITY_POPUP(opponent, ABILITY_CURSED_BODY); + MESSAGE("Wobbuffet's Rock Blast was disabled by the opposing Frillish's Cursed Body!"); + HP_BAR(opponent); + } +} + +TO_DO_BATTLE_TEST("Cursed Body disables the move that called another move instead of the called move") +TO_DO_BATTLE_TEST("Cursed Body disables damaging Z-Moves, but not the base move") // Rotom Powers can restore Z-Moves +TO_DO_BATTLE_TEST("Cursed Body disables the base move of a status Z-Move") diff --git a/test/battle/ability/cute_charm.c b/test/battle/ability/cute_charm.c index 0bba66b8acf0..0813296a2eed 100644 --- a/test/battle/ability/cute_charm.c +++ b/test/battle/ability/cute_charm.c @@ -46,7 +46,11 @@ SINGLE_BATTLE_TEST("Cute Charm cannot infatuate same gender") } } -SINGLE_BATTLE_TEST("Cute Charm triggers 30% of the time") +TO_DO_BATTLE_TEST("Cute Charm cannot infatuate if either PokΓ©mon are Gender-unknown") + +TO_DO_BATTLE_TEST("Cute Charm triggers 1/3 of the time (Gen 3)") + +SINGLE_BATTLE_TEST("Cute Charm triggers 30% of the time (Gen 4+)") { PASSES_RANDOMLY(3, 10, RNG_CUTE_CHARM); GIVEN { diff --git a/test/battle/ability/damp.c b/test/battle/ability/damp.c index 030e698d8e30..816588f4974e 100644 --- a/test/battle/ability/damp.c +++ b/test/battle/ability/damp.c @@ -1,7 +1,7 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Damp prevents explosion-like moves from enemies") +SINGLE_BATTLE_TEST("Damp prevents Explosion-like moves from enemies") { u32 move; PARAMETRIZE { move = MOVE_EXPLOSION; } @@ -19,7 +19,7 @@ SINGLE_BATTLE_TEST("Damp prevents explosion-like moves from enemies") } } -DOUBLE_BATTLE_TEST("Damp prevents explosion-like moves from enemies in a double battle") +DOUBLE_BATTLE_TEST("Damp prevents Explosion-like moves from enemies in a double battle") { u32 move; PARAMETRIZE { move = MOVE_EXPLOSION; } @@ -39,7 +39,7 @@ DOUBLE_BATTLE_TEST("Damp prevents explosion-like moves from enemies in a double } } -SINGLE_BATTLE_TEST("Damp prevents explosion-like moves from self") +SINGLE_BATTLE_TEST("Damp prevents Explosion-like moves from self") { u32 move; PARAMETRIZE { move = MOVE_EXPLOSION; } @@ -72,3 +72,5 @@ SINGLE_BATTLE_TEST("Damp prevents damage from Aftermath") NONE_OF { HP_BAR(player); } } } + +//TO_DO_BATTLE_TEST("Damp affects non-adjacent PokΓ©mon (triples)") diff --git a/test/battle/ability/dancer.c b/test/battle/ability/dancer.c index b456d9d79af1..2fb870ea5103 100644 --- a/test/battle/ability/dancer.c +++ b/test/battle/ability/dancer.c @@ -79,6 +79,9 @@ DOUBLE_BATTLE_TEST("Dancer triggers from slowest to fastest") } } +TO_DO_BATTLE_TEST("Dancer triggers from slowest to fastest during Trick Room") +TO_DO_BATTLE_TEST("Dancer triggering ignores Lagging Tail") + SINGLE_BATTLE_TEST("Dancer doesn't trigger if the original user flinches") { GIVEN { @@ -146,6 +149,27 @@ SINGLE_BATTLE_TEST("Dancer-called attacks have their type updated") } } +SINGLE_BATTLE_TEST("Dancer-called attacks do not trigger Life Orb if target is immune") +{ + GIVEN { + ASSUME(IsDanceMove(MOVE_REVELATION_DANCE)); + ASSUME(GetMoveEffect(MOVE_REVELATION_DANCE) == EFFECT_REVELATION_DANCE); + ASSUME(GetMoveEffect(MOVE_ROOST) == EFFECT_ROOST); + ASSUME(GetItemHoldEffect(ITEM_LIFE_ORB) == HOLD_EFFECT_LIFE_ORB); + ASSUME(GetSpeciesType(SPECIES_ORICORIO_POM_POM, 0) == TYPE_ELECTRIC || GetSpeciesType(SPECIES_ORICORIO_POM_POM, 1) == TYPE_ELECTRIC); + PLAYER(SPECIES_RAICHU) { Ability(ABILITY_LIGHTNING_ROD); } + OPPONENT(SPECIES_ORICORIO_POM_POM) { Ability(ABILITY_DANCER); Item(ITEM_LIFE_ORB); } + } WHEN { + TURN { MOVE(opponent, MOVE_ROOST); MOVE(player, MOVE_REVELATION_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVELATION_DANCE, player); + ABILITY_POPUP(opponent, ABILITY_DANCER); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_REVELATION_DANCE, opponent); + ABILITY_POPUP(player, ABILITY_LIGHTNING_ROD); + NOT HP_BAR(opponent); + } +} + DOUBLE_BATTLE_TEST("Dancer doesn't trigger on a snatched move") { GIVEN { @@ -170,6 +194,9 @@ DOUBLE_BATTLE_TEST("Dancer doesn't trigger on a snatched move") } } +TO_DO_BATTLE_TEST("Dancer-called moves can be snatched") +TO_DO_BATTLE_TEST("Dancer-called moves can be reflected by Magic Bounce/Coat") + DOUBLE_BATTLE_TEST("Dancer triggers on Instructed dance moves") { GIVEN { @@ -225,6 +252,9 @@ DOUBLE_BATTLE_TEST("Dancer-called move doesn't update move to be Instructed") } } +TO_DO_BATTLE_TEST("Dancer-called moves doesn't update move to be called by Mimick") +TO_DO_BATTLE_TEST("Dancer-called moves doesn't update move to be called by Mirror Move") + DOUBLE_BATTLE_TEST("Dancer doesn't call a move that didn't execute due to Powder") { GIVEN { @@ -247,7 +277,6 @@ DOUBLE_BATTLE_TEST("Dancer doesn't call a move that didn't execute due to Powder } } - DOUBLE_BATTLE_TEST("Dancer still activates after Red Card") { GIVEN { @@ -334,3 +363,16 @@ DOUBLE_BATTLE_TEST("Dancer correctly restores move targets") HP_BAR(playerRight); } } + +TO_DO_BATTLE_TEST("Dancer-called damaging moves are considered for Counter/Mirror Coat/Metal Burst") + +TO_DO_BATTLE_TEST("Dancer copies a status Z-Move's base move without gaining an additional Z-Power effect") +TO_DO_BATTLE_TEST("Dancer user may hit itself in confusion instead of copying a move if it's confused") +TO_DO_BATTLE_TEST("Dancer tries to copy a move but fails if it's being forced into a different move - Rampage move") // Test with Petal Dance, Thrash +TO_DO_BATTLE_TEST("Dancer tries to copy a move but fails if it's being forced into a different move - Rollout") +TO_DO_BATTLE_TEST("Dancer tries to copy a move but fails if it's being forced into a different move - Choice items") +TO_DO_BATTLE_TEST("Dancer tries to copy a move but fails if it's being forced into a different move - Encore") +TO_DO_BATTLE_TEST("Dancer tries to copy a status move but fails if it's under Taunt's effect") +TO_DO_BATTLE_TEST("Dancer can still copy status moves if the user is holding an Assault Vest") +TO_DO_BATTLE_TEST("Dancer copies Lunar Dance after the original user faints, but before the replacement is sent out") +TO_DO_BATTLE_TEST("Dancer doesn't activate Feather Dance if it was reflected by Magic Bounce/Coat") diff --git a/test/battle/ability/dark_aura.c b/test/battle/ability/dark_aura.c index eb1bf052469b..1371975a2884 100644 --- a/test/battle/ability/dark_aura.c +++ b/test/battle/ability/dark_aura.c @@ -1,4 +1,108 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Dark Aura (Ability) test titles") +DOUBLE_BATTLE_TEST("Dark Aura increases the power of all Dark-type attacks by 33%") +{ + s16 damage[8]; + + GIVEN { + PLAYER(SPECIES_YVELTAL) { Ability(ABILITY_DARK_AURA); } + PLAYER(SPECIES_LINOONE); + PLAYER(SPECIES_LINOONE); + OPPONENT(SPECIES_LINOONE); + OPPONENT(SPECIES_LINOONE); + } WHEN { + TURN { MOVE(playerRight, MOVE_SKILL_SWAP, target: playerLeft); } + TURN { SWITCH(playerLeft, 2); } + TURN { + MOVE(playerLeft, MOVE_BITE, target:opponentLeft, secondaryEffect:FALSE); + MOVE(playerRight, MOVE_BITE, target:opponentRight, secondaryEffect:FALSE); + MOVE(opponentLeft, MOVE_BITE, target:playerLeft, secondaryEffect:FALSE); + MOVE(opponentRight, MOVE_BITE, target:playerRight, secondaryEffect:FALSE); + } + TURN { MOVE(opponentLeft, MOVE_GASTRO_ACID, target:playerRight); } + TURN { + MOVE(playerLeft, MOVE_BITE, target:opponentLeft, secondaryEffect:FALSE); + MOVE(playerRight, MOVE_BITE, target:opponentRight, secondaryEffect:FALSE); + MOVE(opponentLeft, MOVE_BITE, target:playerLeft, secondaryEffect:FALSE); + MOVE(opponentRight, MOVE_BITE, target:playerRight, secondaryEffect:FALSE); + } + } SCENE { + // Turn 1 + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerRight); + HP_BAR(opponentRight, captureDamage: &damage[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, opponentLeft); + HP_BAR(playerLeft, captureDamage: &damage[2]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, opponentRight); + HP_BAR(playerRight, captureDamage: &damage[3]); + + // Turn 2 + ANIMATION(ANIM_TYPE_MOVE, MOVE_GASTRO_ACID, opponentLeft); + + // Turn 3 + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[4]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerRight); + HP_BAR(opponentRight, captureDamage: &damage[5]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, opponentLeft); + HP_BAR(playerLeft, captureDamage: &damage[6]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, opponentRight); + HP_BAR(playerRight, captureDamage: &damage[7]); + } THEN { + EXPECT_MUL_EQ(damage[4], UQ_4_12(1.33), damage[0]); + EXPECT_MUL_EQ(damage[5], UQ_4_12(1.33), damage[1]); + EXPECT_MUL_EQ(damage[6], UQ_4_12(1.33), damage[2]); + EXPECT_MUL_EQ(damage[7], UQ_4_12(1.33), damage[3]); + } +} + +DOUBLE_BATTLE_TEST("Dark Aura's effect doesn't stack multiple times") +{ + s16 damage[6]; + + GIVEN { + PLAYER(SPECIES_YVELTAL) { Ability(ABILITY_DARK_AURA); } + PLAYER(SPECIES_WOBBUFFET) { HP(9999); MaxHP(9999); } + PLAYER(SPECIES_YVELTAL) { Ability(ABILITY_DARK_AURA); } + OPPONENT(SPECIES_WOBBUFFET) { HP(9999); MaxHP(9999); } + OPPONENT(SPECIES_WOBBUFFET) { HP(9999); MaxHP(9999); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_BITE, target:opponentLeft, secondaryEffect:FALSE); + MOVE(opponentLeft, MOVE_BITE, target:playerLeft, secondaryEffect:FALSE); + MOVE(opponentRight, MOVE_BITE, target:playerLeft, secondaryEffect:FALSE); + } + TURN { SWITCH(playerRight, 2); } + TURN { + MOVE(playerLeft, MOVE_BITE, target:opponentLeft, secondaryEffect:FALSE); + MOVE(opponentLeft, MOVE_BITE, target:playerLeft, secondaryEffect:FALSE); + MOVE(opponentRight, MOVE_BITE, target:playerLeft, secondaryEffect:FALSE); + } + } SCENE { + // Turn 1 + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, opponentLeft); + HP_BAR(playerLeft, captureDamage: &damage[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, opponentRight); + HP_BAR(playerLeft, captureDamage: &damage[2]); + + // Turn 2 + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Yveltal"); + + // Turn 3 + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[3]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, opponentLeft); + HP_BAR(playerLeft, captureDamage: &damage[4]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, opponentRight); + HP_BAR(playerLeft, captureDamage: &damage[5]); + } THEN { + EXPECT_EQ(damage[3], damage[0]); + EXPECT_EQ(damage[4], damage[1]); + EXPECT_EQ(damage[5], damage[2]); + } +} diff --git a/test/battle/ability/dauntless_shield.c b/test/battle/ability/dauntless_shield.c index ada4ace7866a..91d5ceb4fc94 100644 --- a/test/battle/ability/dauntless_shield.c +++ b/test/battle/ability/dauntless_shield.c @@ -1,30 +1,48 @@ #include "global.h" #include "test/battle.h" -ASSUMPTIONS +SINGLE_BATTLE_TEST("Dauntless Shield raises Defense by one stage") { - ASSUME(B_DAUNTLESS_SHIELD == GEN_9); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ZAMAZENTA) { Ability(ABILITY_DAUNTLESS_SHIELD); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_DAUNTLESS_SHIELD); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("The opposing Zamazenta's Dauntless Shield raised its Defense!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); + } } -SINGLE_BATTLE_TEST("Dauntless Shield raises Defense by one stage") +SINGLE_BATTLE_TEST("Dauntless Shield raises Defense by one stage every time it switches in (Gen8)") { GIVEN { + WITH_CONFIG(CONFIG_DAUNTLESS_SHIELD, GEN_8); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ZAMAZENTA) { Ability(ABILITY_DAUNTLESS_SHIELD); } + OPPONENT(SPECIES_WYNAUT); } WHEN { - TURN { } + TURN { SWITCH(opponent, 1); } + TURN { SWITCH(opponent, 0); } } SCENE { ABILITY_POPUP(opponent, ABILITY_DAUNTLESS_SHIELD); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); MESSAGE("The opposing Zamazenta's Dauntless Shield raised its Defense!"); + ABILITY_POPUP(opponent, ABILITY_DAUNTLESS_SHIELD); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("The opposing Zamazenta's Dauntless Shield raised its Defense!"); } THEN { EXPECT_EQ(opponent->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); } } -SINGLE_BATTLE_TEST("Dauntless Shield raises Defense by one stage only once per battle") +SINGLE_BATTLE_TEST("Dauntless Shield raises Defense by one stage only once per battle (Gen 9+)") { GIVEN { + WITH_CONFIG(CONFIG_DAUNTLESS_SHIELD, GEN_9); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ZAMAZENTA) { Ability(ABILITY_DAUNTLESS_SHIELD); } OPPONENT(SPECIES_WYNAUT); @@ -63,4 +81,3 @@ SINGLE_BATTLE_TEST("Dauntless Shield activates when it's no longer effected by N MESSAGE("The opposing Zamazenta's Dauntless Shield raised its Defense!"); } } - diff --git a/test/battle/ability/dazzling.c b/test/battle/ability/dazzling.c index 7541b8a566a3..e5dd6bb37d38 100644 --- a/test/battle/ability/dazzling.c +++ b/test/battle/ability/dazzling.c @@ -1,7 +1,6 @@ #include "global.h" #include "test/battle.h" - ASSUMPTIONS { ASSUME(GetMovePriority(MOVE_QUICK_ATTACK) > 0); @@ -9,7 +8,8 @@ ASSUMPTIONS DOUBLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail protect the user from priority moves") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; } PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; } @@ -31,7 +31,8 @@ DOUBLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail protect the user fr DOUBLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail protect users partner from priority moves") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; } PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; } @@ -53,7 +54,8 @@ DOUBLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail protect users partn DOUBLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail don't protect the user from negative priority") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; } PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; } @@ -74,7 +76,8 @@ DOUBLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail don't protect the u SINGLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail protect from all multi hit hits with one activation") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; } PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; } @@ -96,3 +99,36 @@ SINGLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail protect from all mu } } } + +SINGLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail prevent Protean activation") +{ + u32 species, ability; + + PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; } + PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; } + PARAMETRIZE { species = SPECIES_TSAREENA; ability = ABILITY_QUEENLY_MAJESTY; } + + GIVEN { + PLAYER(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_WATER_SHURIKEN); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_SHURIKEN, player); + ABILITY_POPUP(player, ABILITY_PROTEAN); + } + ABILITY_POPUP(opponent, ability); + } +} + +// Listed on Bulbapedia as "Moves that target all PokΓ©mon (except Perish Song, Flower Shield, and Rototiller)," +// Despite the fact that there's only 2 remaining moves from that list, being Haze and Teatime +TO_DO_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail do not block Haze") +TO_DO_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail do not block Teatime") + +TO_DO_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail do not block a move's Z-Status effect") // Z-Baby-Doll eyes increases Def but doesn't reduce Atk +TO_DO_BATTLE_TEST("Mold Breaker ignores Dazzling, Queenly Majesty and Armor Tail") +TO_DO_BATTLE_TEST("Instruct-called moves keep their priority, which is considered for Dazzling, Queenly Majesty and Armor Tail") + +TO_DO_BATTLE_TEST(" Dazzling, Queenly Majesty and Armor Tail do not block high-priority moves called by other moves") // Metronome, Assist, Nature Power, etc. diff --git a/test/battle/ability/defiant.c b/test/battle/ability/defiant.c index 5ec4ebb093ff..21c1e40a43f2 100644 --- a/test/battle/ability/defiant.c +++ b/test/battle/ability/defiant.c @@ -3,7 +3,7 @@ DOUBLE_BATTLE_TEST("Defiant sharply raises player's Attack after Intimidate") { - u32 abilityLeft, abilityRight; + enum Ability abilityLeft, abilityRight; PARAMETRIZE { abilityLeft = ABILITY_VITAL_SPIRIT; abilityRight = ABILITY_VITAL_SPIRIT; } PARAMETRIZE { abilityLeft = ABILITY_VITAL_SPIRIT; abilityRight = ABILITY_DEFIANT; } @@ -51,7 +51,7 @@ DOUBLE_BATTLE_TEST("Defiant sharply raises player's Attack after Intimidate") ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); MESSAGE("Primeape's Attack sharply rose!"); } - } FINALLY { + } THEN { // -2 from Intimidates and +4 from Defiants gets +2 total EXPECT_EQ(playerLeft->statStages[STAT_ATK], (abilityLeft == ABILITY_DEFIANT) ? DEFAULT_STAT_STAGE + 2 : DEFAULT_STAT_STAGE - 2); EXPECT_EQ(playerRight->statStages[STAT_ATK], (abilityRight == ABILITY_DEFIANT) ? DEFAULT_STAT_STAGE + 2 : DEFAULT_STAT_STAGE - 2); @@ -61,7 +61,7 @@ DOUBLE_BATTLE_TEST("Defiant sharply raises player's Attack after Intimidate") // Same as above, but for opponent. DOUBLE_BATTLE_TEST("Defiant sharply raises opponent's Attack after Intimidate") { - u32 abilityLeft, abilityRight; + enum Ability abilityLeft, abilityRight; PARAMETRIZE { abilityLeft = ABILITY_VITAL_SPIRIT; abilityRight = ABILITY_VITAL_SPIRIT; } PARAMETRIZE { abilityLeft = ABILITY_VITAL_SPIRIT; abilityRight = ABILITY_DEFIANT; } @@ -109,7 +109,7 @@ DOUBLE_BATTLE_TEST("Defiant sharply raises opponent's Attack after Intimidate") ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); MESSAGE("The opposing Primeape's Attack sharply rose!"); } - } FINALLY { + } THEN { // -2 from Intimidates and +4 from Defiants gets +2 total EXPECT_EQ(opponentLeft->statStages[STAT_ATK], (abilityLeft == ABILITY_DEFIANT) ? DEFAULT_STAT_STAGE + 2 : DEFAULT_STAT_STAGE - 2); EXPECT_EQ(opponentRight->statStages[STAT_ATK], (abilityRight == ABILITY_DEFIANT) ? DEFAULT_STAT_STAGE + 2 : DEFAULT_STAT_STAGE - 2); @@ -139,15 +139,19 @@ SINGLE_BATTLE_TEST("Defiant activates after Sticky Web lowers Speed") } } -SINGLE_BATTLE_TEST("Defiant doesn't activate after Sticky Web lowers Speed if Court Changed") +SINGLE_BATTLE_TEST("Defiant doesn't activate after Sticky Web lowers Speed if Court Changed (Gen8)") { GIVEN { + WITH_CONFIG(CONFIG_DEFIANT_STICKY_WEB, GEN_8); + ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN); + ASSUME(GetMoveEffect(MOVE_STICKY_WEB) == EFFECT_STICKY_WEB); + ASSUME(GetMoveEffect(MOVE_COURT_CHANGE) == EFFECT_COURT_CHANGE); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_MANKEY) { Ability(ABILITY_DEFIANT); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_STICKY_WEB); MOVE(opponent, MOVE_COURT_CHANGE); } - TURN { SWITCH(player, 1); } + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_GROWL);} } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_COURT_CHANGE, opponent); @@ -162,19 +166,29 @@ SINGLE_BATTLE_TEST("Defiant doesn't activate after Sticky Web lowers Speed if Co ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Mankey's Attack sharply rose!"); } + // Defiant triggers correctly after Sticky Web + ANIMATION(ANIM_TYPE_MOVE, MOVE_GROWL, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Mankey's Attack fell!"); + ABILITY_POPUP(player, ABILITY_DEFIANT); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Mankey's Attack sharply rose!"); } } -SINGLE_BATTLE_TEST("Defiant correctly activates after Sticky Web lowers Speed if Court Changed") +SINGLE_BATTLE_TEST("Defiant activates after Sticky Web lowers Speed if Court Changed (Gen9)") { GIVEN { + WITH_CONFIG(CONFIG_DEFIANT_STICKY_WEB, GEN_9); + ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN); + ASSUME(GetMoveEffect(MOVE_STICKY_WEB) == EFFECT_STICKY_WEB); + ASSUME(GetMoveEffect(MOVE_COURT_CHANGE) == EFFECT_COURT_CHANGE); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_MANKEY) { Ability(ABILITY_DEFIANT); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_STICKY_WEB); MOVE(opponent, MOVE_COURT_CHANGE); } - TURN { SWITCH(player, 1); } - TURN { MOVE(opponent, MOVE_GROWL);} + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_GROWL);} } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_COURT_CHANGE, opponent); @@ -183,12 +197,9 @@ SINGLE_BATTLE_TEST("Defiant correctly activates after Sticky Web lowers Speed if MESSAGE("Mankey was caught in a sticky web!"); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Mankey's Speed fell!"); - // Defiant doesn't activate - NONE_OF { - ABILITY_POPUP(player, ABILITY_DEFIANT); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Mankey's Attack sharply rose!"); - } + ABILITY_POPUP(player, ABILITY_DEFIANT); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Mankey's Attack sharply rose!"); // Defiant triggers correctly after Sticky Web ANIMATION(ANIM_TYPE_MOVE, MOVE_GROWL, opponent); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); @@ -199,7 +210,7 @@ SINGLE_BATTLE_TEST("Defiant correctly activates after Sticky Web lowers Speed if } } -DOUBLE_BATTLE_TEST("Defiant is activated by Cotton Down for non-ally pokemon") +DOUBLE_BATTLE_TEST("Defiant is activated by Cotton Down for non-ally PokΓ©mon") { GIVEN { PLAYER(SPECIES_MANKEY) { Ability(ABILITY_DEFIANT); } @@ -285,12 +296,11 @@ SINGLE_BATTLE_TEST("Defiant activates for each stat that is lowered") } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_TICKLE, opponent); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Mankey's Attack fell!"); ABILITY_POPUP(player, ABILITY_DEFIANT); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Mankey's Attack sharply rose!"); - + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Mankey's Defense fell!"); ABILITY_POPUP(player, ABILITY_DEFIANT); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); @@ -301,7 +311,7 @@ SINGLE_BATTLE_TEST("Defiant activates for each stat that is lowered") } } -SINGLE_BATTLE_TEST("Defiant doesn't activate if the pokemon lowers it's own stats") +SINGLE_BATTLE_TEST("Defiant doesn't activate if the PokΓ©mon lowers it's own stats") { u32 move; @@ -335,3 +345,36 @@ SINGLE_BATTLE_TEST("Defiant doesn't activate if the pokemon lowers it's own stat EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE); } } + +SINGLE_BATTLE_TEST("Defiant doesn't display ability popup when already at Maximum Attack") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_TICKLE) == EFFECT_TICKLE); + ASSUME(GetMoveEffect(MOVE_BELLY_DRUM) == EFFECT_BELLY_DRUM); + PLAYER(SPECIES_MANKEY) { Ability(ABILITY_DEFIANT); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BELLY_DRUM); MOVE(opponent, MOVE_TICKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BELLY_DRUM, player); + // Maxed Attack + ANIMATION(ANIM_TYPE_MOVE, MOVE_TICKLE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Mankey's Attack fell!"); + ABILITY_POPUP(player, ABILITY_DEFIANT); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Mankey's Attack rose!"); + // Maxed Attack + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Mankey's Defense fell!"); + NONE_OF { + ABILITY_POPUP(player, ABILITY_DEFIANT); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Mankey's Attack sharply rose!"); + } + MESSAGE("Mankey's Attack won't go any higher!"); + + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], MAX_STAT_STAGE); + } +} diff --git a/test/battle/ability/delta_stream.c b/test/battle/ability/delta_stream.c index 5b4081cb1e54..a2202d64c0c9 100644 --- a/test/battle/ability/delta_stream.c +++ b/test/battle/ability/delta_stream.c @@ -1,4 +1,9 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Delta Stream (Ability) test titles") +// Effects of strong winds are handled in test/battle/weather/strong_winds.c + +//TO_DO_BATTLE_TEST("Delta Stream doesn't activate if is sent-out in a rotated-out position (Rotation)") +//TO_DO_BATTLE_TEST("Delta Stream doesn't activate if is rotated-in (Rotation)") +TO_DO_BATTLE_TEST("Delta Stream doesn't activate if there's already strong winds") +TO_DO_BATTLE_TEST("Strong winds continue as long as there's a PokΓ©mon with Delta Stream on the field") // Doesn't need to be the original mon diff --git a/test/battle/ability/desolate_land.c b/test/battle/ability/desolate_land.c index e058b7b51412..d9f1e3924a18 100644 --- a/test/battle/ability/desolate_land.c +++ b/test/battle/ability/desolate_land.c @@ -53,7 +53,7 @@ DOUBLE_BATTLE_TEST("Desolate Land blocks damaging Water-type moves and prints th } } -SINGLE_BATTLE_TEST("Desolate Land does not block a move if pokemon is asleep and uses a Water-type move") // Sleep/confusion/paralysis all happen before the check for primal weather +SINGLE_BATTLE_TEST("Desolate Land does not block a move if PokΓ©mon is asleep and uses a Water-type move") // Sleep/confusion/paralysis all happen before the check for primal weather { GIVEN { PLAYER(SPECIES_GROUDON) {Item(ITEM_RED_ORB);} @@ -83,3 +83,30 @@ SINGLE_BATTLE_TEST("Desolate Land will not create a softlock when move in semi i ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); } } + +SINGLE_BATTLE_TEST("Desolate Land is removed immediately if user faints") +{ + GIVEN { + PLAYER(SPECIES_GROUDON) { HP(1); Item(ITEM_RED_ORB); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_POUND); SEND_OUT(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponent); + NOT MESSAGE("The sunlight is strong."); + MESSAGE("The extremely harsh sunlight faded!"); + } +} + +TO_DO_BATTLE_TEST("Desolate Land makes Sunny Day fail") +TO_DO_BATTLE_TEST("Desolate Land makes Rain Dance fail") +TO_DO_BATTLE_TEST("Desolate Land makes Sandstorm fail") +TO_DO_BATTLE_TEST("Desolate Land makes Hail fail") +TO_DO_BATTLE_TEST("Desolate Land makes Snowscape fail") // Extrapolation +TO_DO_BATTLE_TEST("Desolate Land makes Drought fail to activate") +TO_DO_BATTLE_TEST("Desolate Land makes Drizzle fail to activate") +TO_DO_BATTLE_TEST("Desolate Land makes Sand Stream fail to activate") +TO_DO_BATTLE_TEST("Desolate Land makes Snow Warning fail to activate") +TO_DO_BATTLE_TEST("Desolate Land can be replaced by Delta Stream") +TO_DO_BATTLE_TEST("Desolate Land can be replaced by Primordial Sea") diff --git a/test/battle/ability/disguise.c b/test/battle/ability/disguise.c index ef00c1fe9350..d77f94c1db2e 100644 --- a/test/battle/ability/disguise.c +++ b/test/battle/ability/disguise.c @@ -6,11 +6,30 @@ ASSUMPTIONS ASSUME(GetMoveCategory(MOVE_AERIAL_ACE) == DAMAGE_CATEGORY_PHYSICAL); } -SINGLE_BATTLE_TEST("Disguised Mimikyu will lose 1/8 of its max HP upon changing to its busted form") +SINGLE_BATTLE_TEST("Disguised Mimikyu doesn't lose 1/8 of its max HP upon changing to its busted form (Gen7)") +{ + GIVEN { + WITH_CONFIG(CONFIG_DISGUISE_HP_LOSS, GEN_7); + PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_AERIAL_ACE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_AERIAL_ACE, opponent); + NOT HP_BAR(player); + ABILITY_POPUP(player, ABILITY_DISGUISE); + } THEN { + EXPECT_EQ(player->species, SPECIES_MIMIKYU_BUSTED); + EXPECT_EQ(player->hp, player->maxHP); + } +} + +SINGLE_BATTLE_TEST("Disguised Mimikyu will lose 1/8 of its max HP upon changing to its busted form (Gen8+)") { s16 disguiseDamage; GIVEN { + WITH_CONFIG(CONFIG_DISGUISE_HP_LOSS, GEN_8); PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -66,7 +85,7 @@ SINGLE_BATTLE_TEST("Disguised Mimikyu's Air Balloon will pop upon changing to it } } -SINGLE_BATTLE_TEST("Disguised Mimikyu takes damage from secondary damage without breaking the disguise") +SINGLE_BATTLE_TEST("Disguised Mimikyu takes damage from secondary damage without breaking the disguise - Stealth Rock") { GIVEN { ASSUME(GetMoveEffect(MOVE_STEALTH_ROCK) == EFFECT_STEALTH_ROCK); @@ -85,6 +104,8 @@ SINGLE_BATTLE_TEST("Disguised Mimikyu takes damage from secondary damage without } } +TO_DO_BATTLE_TEST("Disguised Mimikyu takes damage from secondary damage without breaking the disguise - Weather") + SINGLE_BATTLE_TEST("Disguised Mimikyu takes damage from Rocky Helmet without breaking the disguise") { GIVEN { diff --git a/test/battle/ability/download.c b/test/battle/ability/download.c index 7219e32329b9..f275b7c2628b 100644 --- a/test/battle/ability/download.c +++ b/test/battle/ability/download.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Download raises Attack if player has lower Def than Sp. Def", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_TRACE; } PARAMETRIZE { ability = ABILITY_DOWNLOAD; } GIVEN { @@ -32,7 +32,7 @@ SINGLE_BATTLE_TEST("Download raises Attack if player has lower Def than Sp. Def" SINGLE_BATTLE_TEST("Download raises Sp.Attack if enemy has lower Sp. Def than Def", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_TRACE; } PARAMETRIZE { ability = ABILITY_DOWNLOAD; } GIVEN { @@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Download raises Sp.Attack if enemy has lower Sp. Def than De SINGLE_BATTLE_TEST("Download doesn't activate if target hasn't been sent out yet", s16 damagePhysical, s16 damageSpecial) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_TRACE; } PARAMETRIZE { ability = ABILITY_DOWNLOAD; } @@ -97,7 +97,7 @@ SINGLE_BATTLE_TEST("Download doesn't activate if target hasn't been sent out yet DOUBLE_BATTLE_TEST("Download raises Sp.Attack if enemies have lower total Sp. Def than Def", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_TRACE; } PARAMETRIZE { ability = ABILITY_DOWNLOAD; } GIVEN { diff --git a/test/battle/ability/dragons_maw.c b/test/battle/ability/dragons_maw.c index 64280cfb5ac5..950cb1db0fe8 100644 --- a/test/battle/ability/dragons_maw.c +++ b/test/battle/ability/dragons_maw.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Dragon's Maw increases Dragon-type move damage", s16 damage) { u32 move; - u16 ability; + enum Ability ability; PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_KLUTZ; } PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_DRAGONS_MAW; } diff --git a/test/battle/ability/drizzle.c b/test/battle/ability/drizzle.c index ce0fc9514b97..fd5670483019 100644 --- a/test/battle/ability/drizzle.c +++ b/test/battle/ability/drizzle.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Drizzle summons rain", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_DRIZZLE; } PARAMETRIZE { ability = ABILITY_DAMP; } diff --git a/test/battle/ability/drought.c b/test/battle/ability/drought.c index c28b0895b8fb..ba78643b5043 100644 --- a/test/battle/ability/drought.c +++ b/test/battle/ability/drought.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Drought sets up sun for 5 turns (Gen6+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_ABILITY_WEATHER, GEN_6); + WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); PLAYER(SPECIES_NINETALES) { Moves(MOVE_CELEBRATE); Ability(ABILITY_DROUGHT); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { @@ -26,7 +26,7 @@ SINGLE_BATTLE_TEST("Drought sets up sun for 5 turns (Gen6+)") SINGLE_BATTLE_TEST("Drought sets up sun for 8 turns with Heat Rock (Gen6+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_ABILITY_WEATHER, GEN_6); + WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); PLAYER(SPECIES_NINETALES) { Moves(MOVE_CELEBRATE); Ability(ABILITY_DROUGHT); Item(ITEM_HEAT_ROCK); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { @@ -54,7 +54,7 @@ SINGLE_BATTLE_TEST("Drought sets up sun for 8 turns with Heat Rock (Gen6+)") SINGLE_BATTLE_TEST("Drought sets up permanent sun (Gen3-5)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_ABILITY_WEATHER, GEN_3); + WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_3); PLAYER(SPECIES_NINETALES) { Moves(MOVE_CELEBRATE); Ability(ABILITY_DROUGHT); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { diff --git a/test/battle/ability/dry_skin.c b/test/battle/ability/dry_skin.c index 95a0cd8fa84d..aab56586188a 100644 --- a/test/battle/ability/dry_skin.c +++ b/test/battle/ability/dry_skin.c @@ -35,16 +35,16 @@ TO_DO_BATTLE_TEST("Dry Skin doesn't heal in Rain if Cloud Nine/Air Lock is on th SINGLE_BATTLE_TEST("Dry Skin increases damage taken from Fire-type moves by 25%", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_EFFECT_SPORE; } PARAMETRIZE { ability = ABILITY_DRY_SKIN; } GIVEN { ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); ASSUME(GetMovePower(MOVE_EMBER) == 40); - ASSUME(gSpeciesInfo[SPECIES_PARASECT].types[0] == TYPE_BUG); - ASSUME(gSpeciesInfo[SPECIES_PARASECT].types[1] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_PARASECT, 0) == TYPE_BUG); + ASSUME(GetSpeciesType(SPECIES_PARASECT, 1) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) == TYPE_PSYCHIC); PLAYER(SPECIES_WOBBUFFET) { SpAttack(71); } OPPONENT(SPECIES_PARASECT) { Ability(ability); SpDefense(165); } } WHEN { diff --git a/test/battle/ability/effect_spore.c b/test/battle/ability/effect_spore.c index 57f5399b5399..ff61683b542c 100644 --- a/test/battle/ability/effect_spore.c +++ b/test/battle/ability/effect_spore.c @@ -88,3 +88,21 @@ SINGLE_BATTLE_TEST("Effect Spore causes sleep 11% of the time") STATUS_ICON(player, sleep: TRUE); } } + +SINGLE_BATTLE_TEST("Effect Spore will check if it can inflict status onto attacker, not itself") +{ + PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); + GIVEN { + ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); + ASSUME(MoveMakesContact(MOVE_SCRATCH)); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_BRELOOM) { Status1(STATUS1_BURN); Ability(ABILITY_EFFECT_SPORE); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_EFFECT_SPORE); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); + MESSAGE("The opposing Breloom's Effect Spore made Wobbuffet sleep!"); + STATUS_ICON(player, sleep: TRUE); + } +} diff --git a/test/battle/ability/embody_aspect.c b/test/battle/ability/embody_aspect.c index fffc8cf4231c..e7ac53a9e824 100644 --- a/test/battle/ability/embody_aspect.c +++ b/test/battle/ability/embody_aspect.c @@ -4,7 +4,8 @@ SINGLE_BATTLE_TEST("Embody Aspect raises a stat depending on the users form by one stage") { - u16 species, ability; + u16 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_OGERPON_TEAL_TERA; ability = ABILITY_EMBODY_ASPECT_TEAL_MASK; } PARAMETRIZE { species = SPECIES_OGERPON_HEARTHFLAME_TERA; ability = ABILITY_EMBODY_ASPECT_HEARTHFLAME_MASK; } diff --git a/test/battle/ability/emergency_exit.c b/test/battle/ability/emergency_exit.c index 5027d929ec23..3592b91b01a7 100644 --- a/test/battle/ability/emergency_exit.c +++ b/test/battle/ability/emergency_exit.c @@ -81,6 +81,23 @@ SINGLE_BATTLE_TEST("Emergency Exit activates when taking residual damage and fal } } +SINGLE_BATTLE_TEST("Emergency Exit activates when healing from under 50% max-hp and taking residual damage to under 50% max-hp - Burn") +{ + // Might fail if users set healing higher than burn damage + GIVEN { + ASSUME(GetMoveEffect(MOVE_AQUA_RING) == EFFECT_AQUA_RING); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(130); Status1(STATUS1_BURN); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_AQUA_RING); SEND_OUT(opponent, 1); } + } SCENE { + HP_BAR(opponent); + HP_BAR(opponent); + ABILITY_POPUP(opponent, ABILITY_EMERGENCY_EXIT); + } +} + SINGLE_BATTLE_TEST("Emergency Exit activates when taking residual damage and falling under 50% max-hp - Weather") { GIVEN { @@ -95,6 +112,24 @@ SINGLE_BATTLE_TEST("Emergency Exit activates when taking residual damage and fal } } +SINGLE_BATTLE_TEST("Emergency Exit activates when healing from under 50% max-hp and taking residual damage to under 50% max-hp - Sticky Barb") +{ + // Might fail if users set healing higher than sticky barb damage + GIVEN { + ASSUME(GetMoveEffect(MOVE_AQUA_RING) == EFFECT_AQUA_RING); + ASSUME(GetItemHoldEffect(ITEM_STICKY_BARB) == HOLD_EFFECT_STICKY_BARB); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(130); Item(ITEM_STICKY_BARB); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_AQUA_RING); SEND_OUT(opponent, 1); } + } SCENE { + HP_BAR(opponent); + HP_BAR(opponent); + ABILITY_POPUP(opponent, ABILITY_EMERGENCY_EXIT); + } +} + SINGLE_BATTLE_TEST("Emergency Exit activates when taking residual damage and falling under 50% max-hp - Salt Cure") { GIVEN { @@ -108,3 +143,69 @@ SINGLE_BATTLE_TEST("Emergency Exit activates when taking residual damage and fal ABILITY_POPUP(opponent, ABILITY_EMERGENCY_EXIT); } } + +WILD_BATTLE_TEST("Emergency Exit makes the pokemon flee during wild battle") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(262); }; + } WHEN { + TURN { MOVE(player, MOVE_SUPER_FANG);} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUPER_FANG, player); + HP_BAR(opponent); + ABILITY_POPUP(opponent, ABILITY_EMERGENCY_EXIT); + } THEN { + EXPECT_EQ(gBattleOutcome, B_OUTCOME_MON_TELEPORTED); + } +} + +WILD_BATTLE_TEST("Emergency Exit activates when taking residual damage and falling under 50% max-hp (wild battle)") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(134); Status1(STATUS1_BURN); }; + } WHEN { + TURN { } + } SCENE { + HP_BAR(opponent); + ABILITY_POPUP(opponent, ABILITY_EMERGENCY_EXIT); + } THEN { + EXPECT_EQ(gBattleOutcome, B_OUTCOME_MON_TELEPORTED); + } +} + +WILD_BATTLE_TEST("Emergency Exit makes the player ran during wild battle") +{ + GIVEN { + PLAYER(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(262); }; + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SUPER_FANG);} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUPER_FANG, opponent); + HP_BAR(player); + ABILITY_POPUP(player, ABILITY_EMERGENCY_EXIT); + } THEN { + EXPECT_EQ(gBattleOutcome, B_OUTCOME_PLAYER_TELEPORTED); + } +} + +WILD_BATTLE_TEST("Emergency Exit activates when taking residual damage and falling under 50% max-hp (wild battle player side)") +{ + GIVEN { + PLAYER(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(134); }; + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SANDSTORM);} + } SCENE { + HP_BAR(player); + ABILITY_POPUP(player, ABILITY_EMERGENCY_EXIT); + } THEN { + EXPECT_EQ(gBattleOutcome, B_OUTCOME_PLAYER_TELEPORTED); + } +} diff --git a/test/battle/ability/fairy_aura.c b/test/battle/ability/fairy_aura.c index 3b8d400b024f..a51abf1be59f 100644 --- a/test/battle/ability/fairy_aura.c +++ b/test/battle/ability/fairy_aura.c @@ -1,4 +1,108 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Fairy Aura (Ability) test titles") +DOUBLE_BATTLE_TEST("Fairy Aura increases the power of all Fairy-type attacks by 33%") +{ + s16 damage[8]; + + GIVEN { + PLAYER(SPECIES_XERNEAS) { Ability(ABILITY_FAIRY_AURA); } + PLAYER(SPECIES_LINOONE); + PLAYER(SPECIES_LINOONE); + OPPONENT(SPECIES_LINOONE); + OPPONENT(SPECIES_LINOONE); + } WHEN { + TURN { MOVE(playerRight, MOVE_SKILL_SWAP, target: playerLeft); } + TURN { SWITCH(playerLeft, 2); } + TURN { + MOVE(playerLeft, MOVE_PLAY_ROUGH, target:opponentLeft, secondaryEffect:FALSE); + MOVE(playerRight, MOVE_PLAY_ROUGH, target:opponentRight, secondaryEffect:FALSE); + MOVE(opponentLeft, MOVE_PLAY_ROUGH, target:playerLeft, secondaryEffect:FALSE); + MOVE(opponentRight, MOVE_PLAY_ROUGH, target:playerRight, secondaryEffect:FALSE); + } + TURN { MOVE(opponentLeft, MOVE_GASTRO_ACID, target:playerRight); } + TURN { + MOVE(playerLeft, MOVE_PLAY_ROUGH, target:opponentLeft, secondaryEffect:FALSE); + MOVE(playerRight, MOVE_PLAY_ROUGH, target:opponentRight, secondaryEffect:FALSE); + MOVE(opponentLeft, MOVE_PLAY_ROUGH, target:playerLeft, secondaryEffect:FALSE); + MOVE(opponentRight, MOVE_PLAY_ROUGH, target:playerRight, secondaryEffect:FALSE); + } + } SCENE { + // Turn 1 + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerRight); + HP_BAR(opponentRight, captureDamage: &damage[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, opponentLeft); + HP_BAR(playerLeft, captureDamage: &damage[2]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, opponentRight); + HP_BAR(playerRight, captureDamage: &damage[3]); + + // Turn 2 + ANIMATION(ANIM_TYPE_MOVE, MOVE_GASTRO_ACID, opponentLeft); + + // Turn 3 + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[4]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerRight); + HP_BAR(opponentRight, captureDamage: &damage[5]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, opponentLeft); + HP_BAR(playerLeft, captureDamage: &damage[6]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, opponentRight); + HP_BAR(playerRight, captureDamage: &damage[7]); + } THEN { + EXPECT_MUL_EQ(damage[4], UQ_4_12(1.33), damage[0]); + EXPECT_MUL_EQ(damage[5], UQ_4_12(1.33), damage[1]); + EXPECT_MUL_EQ(damage[6], UQ_4_12(1.33), damage[2]); + EXPECT_MUL_EQ(damage[7], UQ_4_12(1.33), damage[3]); + } +} + +DOUBLE_BATTLE_TEST("Fairy Aura's effect doesn't stack multiple times") +{ + s16 damage[6]; + + GIVEN { + PLAYER(SPECIES_XERNEAS) { Ability(ABILITY_FAIRY_AURA); } + PLAYER(SPECIES_WOBBUFFET) { HP(9999); MaxHP(9999); } + PLAYER(SPECIES_XERNEAS) { Ability(ABILITY_FAIRY_AURA); } + OPPONENT(SPECIES_WOBBUFFET) { HP(9999); MaxHP(9999); } + OPPONENT(SPECIES_WOBBUFFET) { HP(9999); MaxHP(9999); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_PLAY_ROUGH, target:opponentLeft, secondaryEffect:FALSE); + MOVE(opponentLeft, MOVE_PLAY_ROUGH, target:playerLeft, secondaryEffect:FALSE); + MOVE(opponentRight, MOVE_PLAY_ROUGH, target:playerLeft, secondaryEffect:FALSE); + } + TURN { SWITCH(playerRight, 2); } + TURN { + MOVE(playerLeft, MOVE_PLAY_ROUGH, target:opponentLeft, secondaryEffect:FALSE); + MOVE(opponentLeft, MOVE_PLAY_ROUGH, target:playerLeft, secondaryEffect:FALSE); + MOVE(opponentRight, MOVE_PLAY_ROUGH, target:playerLeft, secondaryEffect:FALSE); + } + } SCENE { + // Turn 1 + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, opponentLeft); + HP_BAR(playerLeft, captureDamage: &damage[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, opponentRight); + HP_BAR(playerLeft, captureDamage: &damage[2]); + + // Turn 2 + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Xerneas"); + + // Turn 3 + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[3]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, opponentLeft); + HP_BAR(playerLeft, captureDamage: &damage[4]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, opponentRight); + HP_BAR(playerLeft, captureDamage: &damage[5]); + } THEN { + EXPECT_EQ(damage[3], damage[0]); + EXPECT_EQ(damage[4], damage[1]); + EXPECT_EQ(damage[5], damage[2]); + } +} diff --git a/test/battle/ability/filter.c b/test/battle/ability/filter.c index ca323b1be28c..db3d353b7982 100644 --- a/test/battle/ability/filter.c +++ b/test/battle/ability/filter.c @@ -1,4 +1,25 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Filter (Ability) test titles") +SINGLE_BATTLE_TEST("Filter reduces damage to Super Effective moves by 0.75", s16 damage) +{ + enum Ability ability; + PARAMETRIZE { ability = ABILITY_SOUNDPROOF; } + PARAMETRIZE { ability = ABILITY_FILTER; } + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_MR_MIME].types[0] == TYPE_PSYCHIC); + ASSUME(gSpeciesInfo[SPECIES_MR_MIME].types[1] == TYPE_FAIRY); + ASSUME(GetMoveType(MOVE_POISON_JAB) == TYPE_POISON); + ASSUME(gTypeEffectivenessTable[TYPE_POISON][TYPE_FAIRY] > UQ_4_12(1.0)); + ASSUME(gTypeEffectivenessTable[TYPE_POISON][TYPE_PSYCHIC] == UQ_4_12(1.0)); + PLAYER(SPECIES_MR_MIME) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_POISON_JAB); } + } SCENE { + HP_BAR(player, captureDamage: &results[i].damage); + MESSAGE("It's super effective!"); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(0.75), results[1].damage); + } +} diff --git a/test/battle/ability/flare_boost.c b/test/battle/ability/flare_boost.c index a4ff14382a1b..54bd3b9d38b7 100644 --- a/test/battle/ability/flare_boost.c +++ b/test/battle/ability/flare_boost.c @@ -1,4 +1,21 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Flare Boost (Ability) test titles") +SINGLE_BATTLE_TEST("Flare Boost increases Sp. Attack by 50% when the PokΓ©mon is burned", s16 damage) +{ + u32 status1; + PARAMETRIZE { status1 = STATUS1_NONE; } + PARAMETRIZE { status1 = STATUS1_BURN; } + GIVEN { + ASSUME(GetMoveCategory(MOVE_SWIFT) == DAMAGE_CATEGORY_SPECIAL); + PLAYER(SPECIES_DRIFBLIM) { Ability(ABILITY_FLARE_BOOST); Status1(status1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SWIFT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWIFT, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); + } +} diff --git a/test/battle/ability/flash_fire.c b/test/battle/ability/flash_fire.c index c81967d1af0b..4cdcec997348 100644 --- a/test/battle/ability/flash_fire.c +++ b/test/battle/ability/flash_fire.c @@ -9,9 +9,9 @@ SINGLE_BATTLE_TEST("Flash Fire boosts fire type moves by 50% but no subsequent i PLAYER(SPECIES_HEATRAN) { Ability(ABILITY_FLASH_FIRE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, MOVE_EMBER); MOVE(opponent, MOVE_EMBER); } - TURN { MOVE(player, MOVE_EMBER); MOVE(opponent, MOVE_EMBER); } - TURN { MOVE(player, MOVE_EMBER); } + TURN { MOVE(player, MOVE_EMBER, secondaryEffect: FALSE); MOVE(opponent, MOVE_EMBER); } + TURN { MOVE(player, MOVE_EMBER, secondaryEffect: FALSE); MOVE(opponent, MOVE_EMBER); } + TURN { MOVE(player, MOVE_EMBER, secondaryEffect: FALSE); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); HP_BAR(opponent, captureDamage: &damage[0]); diff --git a/test/battle/ability/flower_gift.c b/test/battle/ability/flower_gift.c index 8f897e4668d8..30cc7926e553 100644 --- a/test/battle/ability/flower_gift.c +++ b/test/battle/ability/flower_gift.c @@ -65,7 +65,8 @@ SINGLE_BATTLE_TEST("Flower Gift transforms Cherrim back to normal when its abili SINGLE_BATTLE_TEST("Flower Gift transforms Cherrim back to normal under Cloud Nine/Air Lock") { - u32 species = 0, ability = 0; + u32 species = 0; + enum Ability ability = 0; PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; } PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } GIVEN { @@ -199,4 +200,23 @@ SINGLE_BATTLE_TEST("Flower Gift transforms Cherrim back when it uses a move that } } +DOUBLE_BATTLE_TEST("Flower Gift reverts Cherrim back after Teraform Zero clears weather") +{ + GIVEN { + PLAYER(SPECIES_TERAPAGOS_TERASTAL); + PLAYER(SPECIES_CHERRIM) { Ability(ABILITY_FLOWER_GIFT); } + OPPONENT(SPECIES_GROUDON) { Ability(ABILITY_DROUGHT); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); } + } SCENE { + ABILITY_POPUP(opponentLeft, ABILITY_DROUGHT); + ABILITY_POPUP(playerRight, ABILITY_FLOWER_GIFT); + ABILITY_POPUP(playerLeft, ABILITY_TERAFORM_ZERO); + ABILITY_POPUP(playerRight, ABILITY_FLOWER_GIFT); + } THEN { + EXPECT_EQ(playerRight->species, SPECIES_CHERRIM); + } +} + TO_DO_BATTLE_TEST("Flower Gift does not transform Cherrim back to normal when suppressed if Cherrim is Dynamaxed"); diff --git a/test/battle/ability/flower_veil.c b/test/battle/ability/flower_veil.c index 2b36d08d607b..78d15df1bd4c 100644 --- a/test/battle/ability/flower_veil.c +++ b/test/battle/ability/flower_veil.c @@ -15,7 +15,7 @@ ASSUMPTIONS ASSUME(GetMoveNonVolatileStatus(MOVE_HYPNOSIS) == MOVE_EFFECT_SLEEP); } -DOUBLE_BATTLE_TEST("Flower Veil prevents Toxic bad poison on partner - right target") +DOUBLE_BATTLE_TEST("Flower Veil prevents status on allied Grass-types - right target") { u32 move; @@ -39,7 +39,7 @@ DOUBLE_BATTLE_TEST("Flower Veil prevents Toxic bad poison on partner - right tar } } -DOUBLE_BATTLE_TEST("Flower Veil prevents Toxic bad poison on partner - left target") +DOUBLE_BATTLE_TEST("Flower Veil prevents status on allied Grass-types - left target") { u32 move; @@ -62,3 +62,5 @@ DOUBLE_BATTLE_TEST("Flower Veil prevents Toxic bad poison on partner - left targ MESSAGE("The opposing Chikorita surrounded itself with a veil of petals!"); } } + +TO_DO_BATTLE_TEST("Flower Veil's stat reduction protection considers Contrary") // Eg. If a move would reduce stats due to Contrary, it will be protected by Mist. diff --git a/test/battle/ability/fluffy.c b/test/battle/ability/fluffy.c index 4b8ef60396fe..68afbd8993cc 100644 --- a/test/battle/ability/fluffy.c +++ b/test/battle/ability/fluffy.c @@ -12,7 +12,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Fluffy halves damage taken from moves that make direct contact", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_KLUTZ; } PARAMETRIZE { ability = ABILITY_FLUFFY; } GIVEN { @@ -21,7 +21,7 @@ SINGLE_BATTLE_TEST("Fluffy halves damage taken from moves that make direct conta } WHEN { TURN { MOVE(player, MOVE_SCRATCH); } } SCENE { - MESSAGE("Wobbuffet used Scratch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); HP_BAR(opponent, captureDamage: &results[i].damage); } FINALLY { EXPECT_MUL_EQ(results[0].damage, UQ_4_12(0.5), results[1].damage); @@ -30,7 +30,7 @@ SINGLE_BATTLE_TEST("Fluffy halves damage taken from moves that make direct conta SINGLE_BATTLE_TEST("Fluffy doubles damage taken from fire type moves", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_KLUTZ; } PARAMETRIZE { ability = ABILITY_FLUFFY; } GIVEN { @@ -39,7 +39,7 @@ SINGLE_BATTLE_TEST("Fluffy doubles damage taken from fire type moves", s16 damag } WHEN { TURN { MOVE(player, MOVE_EMBER); } } SCENE { - MESSAGE("Wobbuffet used Ember!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); HP_BAR(opponent, captureDamage: &results[i].damage); } FINALLY { EXPECT_MUL_EQ(results[0].damage, UQ_4_12(2.0), results[1].damage); @@ -48,7 +48,7 @@ SINGLE_BATTLE_TEST("Fluffy doubles damage taken from fire type moves", s16 damag SINGLE_BATTLE_TEST("Fluffy does not alter damage of fire-type moves that make direct contact", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_KLUTZ; } PARAMETRIZE { ability = ABILITY_FLUFFY; } GIVEN { @@ -57,7 +57,43 @@ SINGLE_BATTLE_TEST("Fluffy does not alter damage of fire-type moves that make di } WHEN { TURN { MOVE(player, MOVE_FIRE_PUNCH); } } SCENE { - MESSAGE("Wobbuffet used Fire Punch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PUNCH, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} + +SINGLE_BATTLE_TEST("Fluffy halves damage taken from moves that make direct contact even if protected by Protective Pads", s16 damage) +{ + enum Ability ability; + PARAMETRIZE { ability = ABILITY_KLUTZ; } + PARAMETRIZE { ability = ABILITY_FLUFFY; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_PROTECTIVE_PADS); } + OPPONENT(SPECIES_STUFFUL) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, UQ_4_12(0.5), results[1].damage); + } +} + +SINGLE_BATTLE_TEST("Fluffy does not halve damage taken from moves that make direct contact but are ignored by Punching Glove", s16 damage) +{ + enum Ability ability; + PARAMETRIZE { ability = ABILITY_KLUTZ; } + PARAMETRIZE { ability = ABILITY_FLUFFY; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_PUNCHING_GLOVE); } + OPPONENT(SPECIES_STUFFUL) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_THUNDER_PUNCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDER_PUNCH, player); HP_BAR(opponent, captureDamage: &results[i].damage); } FINALLY { EXPECT_EQ(results[0].damage, results[1].damage); diff --git a/test/battle/ability/forecast.c b/test/battle/ability/forecast.c index c462a3a63448..b6889620ab16 100644 --- a/test/battle/ability/forecast.c +++ b/test/battle/ability/forecast.c @@ -157,7 +157,8 @@ DOUBLE_BATTLE_TEST("Forecast transforms all Castforms present in weather") SINGLE_BATTLE_TEST("Forecast transforms Castform in weather from an ability") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_KYOGRE; ability = ABILITY_DRIZZLE; } PARAMETRIZE { species = SPECIES_GROUDON; ability = ABILITY_DROUGHT; } PARAMETRIZE { species = SPECIES_ABOMASNOW; ability = ABILITY_SNOW_WARNING; } @@ -183,13 +184,16 @@ SINGLE_BATTLE_TEST("Forecast transforms Castform in weather from an ability") case ABILITY_SNOW_WARNING: EXPECT_EQ(player->species, SPECIES_CASTFORM_SNOWY); break; + default: + break; } } } SINGLE_BATTLE_TEST("Forecast transforms Castform in primal weather") { - u32 species, item, ability; + u32 species, item; + enum Ability ability; PARAMETRIZE { species = SPECIES_KYOGRE; ability = ABILITY_PRIMORDIAL_SEA; item = ITEM_BLUE_ORB; } PARAMETRIZE { species = SPECIES_GROUDON; ability = ABILITY_DESOLATE_LAND; item = ITEM_RED_ORB; } GIVEN { @@ -212,6 +216,8 @@ SINGLE_BATTLE_TEST("Forecast transforms Castform in primal weather") case ABILITY_PRIMORDIAL_SEA: EXPECT_EQ(player->species, SPECIES_CASTFORM_RAINY); break; + default: + break; } } } @@ -266,7 +272,8 @@ SINGLE_BATTLE_TEST("Forecast transforms Castform back to normal when Sandstorm i SINGLE_BATTLE_TEST("Forecast transforms Castform back to normal under Cloud Nine/Air Lock") { - u32 species = 0, ability = 0; + u32 species = 0; + enum Ability ability = 0; PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; } PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } GIVEN { @@ -400,7 +407,8 @@ SINGLE_BATTLE_TEST("Forecast transforms Castform back when it uses a move that f SINGLE_BATTLE_TEST("Forecast transforms Castform when Cloud Nine ability user leaves the field") { - u32 species = 0, ability = 0; + u32 species = 0; + enum Ability ability = 0; PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; } PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } @@ -419,3 +427,22 @@ SINGLE_BATTLE_TEST("Forecast transforms Castform when Cloud Nine ability user le MESSAGE("Castform transformed!"); } } + +DOUBLE_BATTLE_TEST("Forecast reverts Castform back after Teraform Zero clears weather") +{ + GIVEN { + PLAYER(SPECIES_TERAPAGOS_TERASTAL); + PLAYER(SPECIES_CASTFORM) { Ability(ABILITY_FORECAST); } + OPPONENT(SPECIES_KYOGRE) { Ability(ABILITY_DRIZZLE); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); } + } SCENE { + ABILITY_POPUP(opponentLeft, ABILITY_DRIZZLE); + ABILITY_POPUP(playerRight, ABILITY_FORECAST); + ABILITY_POPUP(playerLeft, ABILITY_TERAFORM_ZERO); + ABILITY_POPUP(playerRight, ABILITY_FORECAST); + } THEN { + EXPECT_EQ(playerRight->species, SPECIES_CASTFORM_NORMAL); + } +} diff --git a/test/battle/ability/frisk.c b/test/battle/ability/frisk.c index e6d7f275fb98..e20d2f52052e 100644 --- a/test/battle/ability/frisk.c +++ b/test/battle/ability/frisk.c @@ -1,7 +1,7 @@ #include "global.h" #include "test/battle.h" -DOUBLE_BATTLE_TEST("Frisk does not trigger when pokemon hold no items") +DOUBLE_BATTLE_TEST("Frisk does not trigger when PokΓ©mon hold no items") { GIVEN { PLAYER(SPECIES_FURRET) { Ability(ABILITY_FRISK); }; diff --git a/test/battle/ability/fur_coat.c b/test/battle/ability/fur_coat.c index 56fb19711423..2ad6a3d5a2eb 100644 --- a/test/battle/ability/fur_coat.c +++ b/test/battle/ability/fur_coat.c @@ -1,4 +1,44 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Fur Coat (Ability) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); +} + +SINGLE_BATTLE_TEST("Fur Coat doubles Defense", s16 damage) +{ + u32 ability; + PARAMETRIZE { ability = ABILITY_FUR_COAT; } + PARAMETRIZE { ability = ABILITY_RATTLED; } + + GIVEN { + PLAYER(SPECIES_PERSIAN_ALOLA) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + HP_BAR(player, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.0), results[1].damage); + } +} + +SINGLE_BATTLE_TEST("Fur Coat has no effect on self-inflicted confusion damage", s16 damage) +{ + u32 ability; + PARAMETRIZE { ability = ABILITY_FUR_COAT; } + PARAMETRIZE { ability = ABILITY_RATTLED; } + + GIVEN { + PLAYER(SPECIES_PERSIAN_ALOLA) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_CONFUSE_RAY); MOVE(player, MOVE_POUND, WITH_RNG(RNG_CONFUSION, TRUE)); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, opponent); + HP_BAR(player, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} diff --git a/test/battle/ability/gale_wings.c b/test/battle/ability/gale_wings.c index df8f02532649..be82da81d4de 100644 --- a/test/battle/ability/gale_wings.c +++ b/test/battle/ability/gale_wings.c @@ -9,7 +9,7 @@ SINGLE_BATTLE_TEST("Gale Wings only grants priority at full HP (Gen 7+)") PARAMETRIZE { hp = 100; config = GEN_6; } PARAMETRIZE { hp = 99; config = GEN_6; } GIVEN { - WITH_CONFIG(GEN_CONFIG_GALE_WINGS, config); + WITH_CONFIG(CONFIG_GALE_WINGS, config); ASSUME(GetMoveType(MOVE_AERIAL_ACE) == TYPE_FLYING); PLAYER(SPECIES_TALONFLAME) { Ability(ABILITY_GALE_WINGS); HP(hp); MaxHP(100); Speed(1);} OPPONENT(SPECIES_WOBBUFFET) { Speed(100);}; diff --git a/test/battle/ability/galvanize.c b/test/battle/ability/galvanize.c index 981b06d5805b..bbfa6c3cfb7c 100644 --- a/test/battle/ability/galvanize.c +++ b/test/battle/ability/galvanize.c @@ -44,14 +44,15 @@ SINGLE_BATTLE_TEST("Galvanize can not turn certain moves into Electric type move SINGLE_BATTLE_TEST("Galvanize boosts power of affected moves by 20% (Gen7+) or 30% (Gen1-6)", s16 damage) { - u32 ability, genConfig; + enum Ability ability; + u32 genConfig; PARAMETRIZE { ability = ABILITY_STURDY; genConfig = GEN_7; } PARAMETRIZE { ability = ABILITY_STURDY; genConfig = GEN_6; } PARAMETRIZE { ability = ABILITY_GALVANIZE; genConfig = GEN_7; } PARAMETRIZE { ability = ABILITY_GALVANIZE; genConfig = GEN_6; } GIVEN { - WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, genConfig); + WITH_CONFIG(CONFIG_ATE_MULTIPLIER, genConfig); PLAYER(SPECIES_GEODUDE_ALOLA) { Ability(ability); Moves(MOVE_TACKLE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -68,7 +69,8 @@ SINGLE_BATTLE_TEST("Galvanize boosts power of affected moves by 20% (Gen7+) or 3 SINGLE_BATTLE_TEST("Galvanize doesn't affect Weather Ball's type", s16 damage) { - u16 move, ability; + u16 move; + enum Ability ability; PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_STURDY; } PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_STURDY; } PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_GALVANIZE; } @@ -76,7 +78,7 @@ SINGLE_BATTLE_TEST("Galvanize doesn't affect Weather Ball's type", s16 damage) GIVEN { ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL); ASSUME(GetMoveType(MOVE_WEATHER_BALL) == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_PINSIR].types[0] == TYPE_BUG); + ASSUME(GetSpeciesType(SPECIES_PINSIR, 0) == TYPE_BUG); PLAYER(SPECIES_GEODUDE_ALOLA) { Ability(ability); } OPPONENT(SPECIES_PINSIR); } WHEN { @@ -96,13 +98,13 @@ SINGLE_BATTLE_TEST("Galvanize doesn't affect Weather Ball's type", s16 damage) SINGLE_BATTLE_TEST("Galvanize doesn't affect Natural Gift's type") { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_STURDY; } PARAMETRIZE { ability = ABILITY_GALVANIZE; } GIVEN { ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT); ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_ORAN_BERRY)].type == TYPE_POISON); - ASSUME(gSpeciesInfo[SPECIES_BELDUM].types[0] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_BELDUM, 0) == TYPE_STEEL); PLAYER(SPECIES_GEODUDE_ALOLA) { Ability(ability); Item(ITEM_ORAN_BERRY); } OPPONENT(SPECIES_BELDUM); } WHEN { @@ -129,7 +131,7 @@ SINGLE_BATTLE_TEST("Galvanize doesn't affect Judgment / Techno Blast / Multi-Att ASSUME(gItemsInfo[ITEM_DOUSE_DRIVE].secondaryId == TYPE_WATER); ASSUME(gItemsInfo[ITEM_WATER_MEMORY].holdEffect == HOLD_EFFECT_MEMORY); ASSUME(gItemsInfo[ITEM_WATER_MEMORY].secondaryId == TYPE_WATER); - ASSUME(gSpeciesInfo[SPECIES_VAPOREON].types[0] == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_VAPOREON, 0) == TYPE_WATER); PLAYER(SPECIES_GEODUDE_ALOLA) { Ability(ABILITY_GALVANIZE); Item(item); } OPPONENT(SPECIES_VAPOREON) { Ability(ABILITY_WATER_ABSORB); } } WHEN { @@ -150,7 +152,7 @@ SINGLE_BATTLE_TEST("Galvanize doesn't affect Hidden Power's type") GIVEN { ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER); ASSUME(gTypesInfo[TYPE_ELECTRIC].isHiddenPowerType == TRUE); - ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND); PLAYER(SPECIES_GEODUDE_ALOLA) { Ability(ABILITY_GALVANIZE); HPIV(31); AttackIV(31); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(30); } // HP Water OPPONENT(SPECIES_VAPOREON) { Ability(ABILITY_WATER_ABSORB); } } WHEN { diff --git a/test/battle/ability/grim_neigh.c b/test/battle/ability/grim_neigh.c index 69d60db93e5f..bb212e589bb2 100644 --- a/test/battle/ability/grim_neigh.c +++ b/test/battle/ability/grim_neigh.c @@ -3,7 +3,8 @@ DOUBLE_BATTLE_TEST("Grim Neigh raises Sp. Attack by one stage after directly causing a Pokemon to faint") { - u32 species = 0, ability = 0, abilityPopUp = 0; + u32 species = 0, abilityPopUp = 0; + enum Ability ability = 0; PARAMETRIZE { species = SPECIES_SPECTRIER; ability = ABILITY_GRIM_NEIGH; abilityPopUp = ABILITY_GRIM_NEIGH; } PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; } GIVEN { @@ -33,7 +34,8 @@ DOUBLE_BATTLE_TEST("Grim Neigh raises Sp. Attack by one stage after directly cau DOUBLE_BATTLE_TEST("Grim Neigh does not trigger if Pokemon faint to indirect damage or damage from other Pokemon") { - u32 species = 0, ability = 0, abilityPopUp = 0; + u32 species = 0, abilityPopUp = 0; + enum Ability ability = 0; PARAMETRIZE { species = SPECIES_SPECTRIER; ability = ABILITY_GRIM_NEIGH; abilityPopUp = ABILITY_GRIM_NEIGH; } PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; } GIVEN { @@ -70,7 +72,8 @@ DOUBLE_BATTLE_TEST("Grim Neigh does not trigger if Pokemon faint to indirect dam DOUBLE_BATTLE_TEST("Grim Neigh does not increase damage done by the same move that causes another Pokemon to faint") { s16 damage[2]; - u32 species = 0, ability = 0, abilityPopUp = 0; + u32 species = 0, abilityPopUp = 0; + enum Ability ability = 0; PARAMETRIZE { species = SPECIES_SPECTRIER; ability = ABILITY_GRIM_NEIGH; abilityPopUp = ABILITY_GRIM_NEIGH; } PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; } diff --git a/test/battle/ability/guard_dog.c b/test/battle/ability/guard_dog.c index 4327140d6889..b8ebbafbad0e 100644 --- a/test/battle/ability/guard_dog.c +++ b/test/battle/ability/guard_dog.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Guard Dog raises Attack when intimidated", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_INTIMIDATE; } PARAMETRIZE { ability = ABILITY_SHED_SKIN; } GIVEN { diff --git a/test/battle/ability/gulp_missile.c b/test/battle/ability/gulp_missile.c index fe1bc718fdbe..5a3266ff17e5 100644 --- a/test/battle/ability/gulp_missile.c +++ b/test/battle/ability/gulp_missile.c @@ -137,13 +137,14 @@ SINGLE_BATTLE_TEST("(Gulp Missile) triggers even if the user is fainted by oppos SINGLE_BATTLE_TEST("(Gulp Missile) Transformed Cramorant Gulping lowers defense but is prevented by stat reduction preventing abilities") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_METAGROSS; ability = ABILITY_CLEAR_BODY; } PARAMETRIZE { species = SPECIES_CORVIKNIGHT; ability = ABILITY_MIRROR_ARMOR; } PARAMETRIZE { species = SPECIES_CHATOT; ability = ABILITY_BIG_PECKS; } GIVEN { PLAYER(SPECIES_CRAMORANT) { Ability(ABILITY_GULP_MISSILE); } - OPPONENT(species) { Ability(ability); } + OPPONENT(species) { Ability(ability); HP(9999); MaxHP(9999); } // In Gen 5 data, Surf would be enough to knock out Chatot } WHEN { TURN { MOVE(player, MOVE_SURF); MOVE(opponent, MOVE_SCRATCH); } } SCENE { @@ -163,7 +164,7 @@ SINGLE_BATTLE_TEST("(Gulp Missile) Transformed Cramorant Gulping lowers defense SINGLE_BATTLE_TEST("(Gulp Missile) Transformed Cramorant Gulping lowers defense and still triggers other effects after") { // Make sure attacker and target are correct after triggering the ability - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_INFILTRATOR; } PARAMETRIZE { ability = ABILITY_CLEAR_BODY; } GIVEN { diff --git a/test/battle/ability/hunger_switch.c b/test/battle/ability/hunger_switch.c index 1892de4424fe..469cf02d3cb6 100644 --- a/test/battle/ability/hunger_switch.c +++ b/test/battle/ability/hunger_switch.c @@ -53,7 +53,6 @@ SINGLE_BATTLE_TEST("Hunger Switch does not switch Morpeko's form when Terastalli SINGLE_BATTLE_TEST("Hunger Switch does not switch Morpeko's form after switching out while Terastallized") { - KNOWN_FAILING; // #7062 GIVEN { ASSUME(GetMoveEffect(MOVE_ROAR) == EFFECT_ROAR); PLAYER(SPECIES_MORPEKO) { Ability(ABILITY_HUNGER_SWITCH); TeraType(TYPE_NORMAL); } diff --git a/test/battle/ability/ice_scales.c b/test/battle/ability/ice_scales.c index 0d49bb49966b..ea96f64961bf 100644 --- a/test/battle/ability/ice_scales.c +++ b/test/battle/ability/ice_scales.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Ice Scales halves the damage from special moves", s16 damage) { u32 move; - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_SHIELD_DUST; move = MOVE_PSYCHIC; } PARAMETRIZE { ability = ABILITY_ICE_SCALES; move = MOVE_PSYCHIC; } PARAMETRIZE { ability = ABILITY_SHIELD_DUST; move = MOVE_PSYSHOCK; } diff --git a/test/battle/ability/illusion.c b/test/battle/ability/illusion.c index 56fad1b62e7c..efa80cdafe74 100644 --- a/test/battle/ability/illusion.c +++ b/test/battle/ability/illusion.c @@ -102,7 +102,7 @@ SINGLE_BATTLE_TEST("Illusion breaks if affected by Gastro Acid") SINGLE_BATTLE_TEST("Illusion breaks if user loses Illusion due to Worry Seed") { GIVEN { - ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_WORRY_SEED); + ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_OVERWRITE_ABILITY); PLAYER(SPECIES_ZOROARK); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); @@ -113,3 +113,20 @@ SINGLE_BATTLE_TEST("Illusion breaks if user loses Illusion due to Worry Seed") ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ILLUSION_OFF, player); } } + +SINGLE_BATTLE_TEST("Illusion breaks when attacked behind a substitute") +{ + GIVEN { + PLAYER(SPECIES_DRAGAPULT) {Ability(ABILITY_INFILTRATOR); Speed(1);}; + OPPONENT(SPECIES_WOBBUFFET) {Speed(2);}; + OPPONENT(SPECIES_ZOROARK) {Speed(2);}; + OPPONENT(SPECIES_WYNAUT) {Speed(2);}; + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); MOVE(opponent, MOVE_SHED_TAIL); SEND_OUT(opponent, 1);} + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SWAP_FROM_SUBSTITUTE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ILLUSION_OFF, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SWAP_TO_SUBSTITUTE, opponent); + MESSAGE("The opposing Zoroark's illusion wore off!"); + } +} diff --git a/test/battle/ability/immunity.c b/test/battle/ability/immunity.c index 81fbe1b8c128..9199638ad578 100644 --- a/test/battle/ability/immunity.c +++ b/test/battle/ability/immunity.c @@ -27,7 +27,7 @@ SINGLE_BATTLE_TEST("Immunity prevents Toxic bad poison") } SCENE { MESSAGE("Wobbuffet used Toxic!"); ABILITY_POPUP(opponent, ABILITY_IMMUNITY); - MESSAGE("The opposing Snorlax's Immunity prevents poisoning!"); + MESSAGE("It doesn't affect the opposing Snorlax…"); NOT STATUS_ICON(opponent, poison: TRUE); } } @@ -47,7 +47,7 @@ SINGLE_BATTLE_TEST("Immunity prevents Toxic Spikes poison") } } -SINGLE_BATTLE_TEST("Immunity doesn't prevent pokemon from being poisoned by Toxic Spikes on switch-in if forced in by phazing with Mold Breaker, but it cures it immediately") +SINGLE_BATTLE_TEST("Immunity doesn't prevent PokΓ©mon from being poisoned by Toxic Spikes on switch-in if forced in by phazing with Mold Breaker, but it cures it immediately") { GIVEN { ASSUME(GetMoveEffect(MOVE_DRAGON_TAIL) == EFFECT_HIT_SWITCH_TARGET); @@ -63,3 +63,19 @@ SINGLE_BATTLE_TEST("Immunity doesn't prevent pokemon from being poisoned by Toxi NOT HP_BAR(player); } } + +SINGLE_BATTLE_TEST("Immunity cures existing poison on turn 0") +{ + GIVEN { + PLAYER(SPECIES_ZANGOOSE) { + Ability(ABILITY_IMMUNITY); + Status1(STATUS1_POISON); + } + OPPONENT(SPECIES_WOBBUFFET); + } SCENE { + ABILITY_POPUP(player, ABILITY_IMMUNITY); + TURN { MOVE(player, MOVE_SPLASH); } + } THEN { + EXPECT_EQ(player->status1, STATUS1_NONE); + } +} diff --git a/test/battle/ability/inner_focus.c b/test/battle/ability/inner_focus.c index e6370f019a0d..7280725e88c7 100644 --- a/test/battle/ability/inner_focus.c +++ b/test/battle/ability/inner_focus.c @@ -1,13 +1,13 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Inner Focus prevents intimidate") +SINGLE_BATTLE_TEST("Inner Focus doesn't prevent intimidate (Gen3-7)") { s16 turnOneHit; s16 turnTwoHit; GIVEN { - ASSUME(B_UPDATED_INTIMIDATE >= GEN_8); + WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_7); PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); }; PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); }; OPPONENT(SPECIES_ZUBAT) { Ability(ABILITY_INNER_FOCUS); }; @@ -16,9 +16,36 @@ SINGLE_BATTLE_TEST("Inner Focus prevents intimidate") TURN { SWITCH(player, 1); MOVE(opponent, MOVE_SCRATCH); } } SCENE { + // Turn 1 HP_BAR(player, captureDamage: &turnOneHit); ABILITY_POPUP(player, ABILITY_INTIMIDATE); - NONE_OF { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); } + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Ekans's Intimidate cuts the opposing Zubat's Attack!"); + // Turn 2 + HP_BAR(player, captureDamage: &turnTwoHit); + } THEN { + EXPECT_GT(turnOneHit, turnTwoHit); + } +} + +SINGLE_BATTLE_TEST("Inner Focus prevents intimidate (Gen8+)") +{ + s16 turnOneHit; + s16 turnTwoHit; + + GIVEN { + WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_8); + PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); }; + PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); }; + OPPONENT(SPECIES_ZUBAT) { Ability(ABILITY_INNER_FOCUS); }; + } WHEN { + TURN { MOVE(opponent, MOVE_SCRATCH); } + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_SCRATCH); } + + } SCENE { + HP_BAR(player, captureDamage: &turnOneHit); + ABILITY_POPUP(player, ABILITY_INTIMIDATE); + NONE_OF { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); } ABILITY_POPUP(opponent, ABILITY_INNER_FOCUS); MESSAGE("The opposing Zubat's Inner Focus prevents stat loss!"); HP_BAR(player, captureDamage: &turnTwoHit); diff --git a/test/battle/ability/insomnia.c b/test/battle/ability/insomnia.c index 61bb1931fafc..c95b29490780 100644 --- a/test/battle/ability/insomnia.c +++ b/test/battle/ability/insomnia.c @@ -40,7 +40,7 @@ SINGLE_BATTLE_TEST("Insomnia prevents yawn") } } -SINGLE_BATTLE_TEST("Insomnia prevents rest") +SINGLE_BATTLE_TEST("Insomnia prevents Rest") { GIVEN { ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); diff --git a/test/battle/ability/intimidate.c b/test/battle/ability/intimidate.c index cefda4d1b854..0606938d45f6 100644 --- a/test/battle/ability/intimidate.c +++ b/test/battle/ability/intimidate.c @@ -8,7 +8,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Intimidate (opponent) lowers player's attack after switch out", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_INTIMIDATE; } PARAMETRIZE { ability = ABILITY_SHED_SKIN; } GIVEN { @@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Intimidate (opponent) lowers player's attack after switch ou SINGLE_BATTLE_TEST("Intimidate (opponent) lowers player's attack after KO", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_INTIMIDATE; } PARAMETRIZE { ability = ABILITY_SHED_SKIN; } GIVEN { @@ -240,6 +240,7 @@ DOUBLE_BATTLE_TEST("Intimidate is not going to trigger if a mon switches out thr ANIMATION(ANIM_TYPE_MOVE, MOVE_HEALING_WISH, opponentRight); ANIMATION(ANIM_TYPE_MOVE, MOVE_U_TURN, playerLeft); HP_BAR(opponentLeft); + NOT ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); MESSAGE("2 sent out Treecko!"); MESSAGE("2 sent out Torchic!"); NOT ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); @@ -264,7 +265,7 @@ SINGLE_BATTLE_TEST("Intimidate activates when it's no longer effected by Neutral } } -SINGLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutralizing Gas - switching moves") +DOUBLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutralizing Gas - switching moves") { u32 move; PARAMETRIZE { move = MOVE_U_TURN; } @@ -276,19 +277,24 @@ SINGLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutral ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); } PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } + OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, move); SEND_OUT(player, 1); } + TURN { + if (move == MOVE_U_TURN) + MOVE(playerLeft, move, target: opponentLeft); + else + MOVE(playerLeft, move); + SEND_OUT(playerLeft, 2); + } } SCENE { - ABILITY_POPUP(player, ABILITY_NEUTRALIZING_GAS); + ABILITY_POPUP(playerLeft, ABILITY_NEUTRALIZING_GAS); MESSAGE("Neutralizing gas filled the area!"); - ANIMATION(ANIM_TYPE_MOVE, move, player); + ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); MESSAGE("The effects of the neutralizing gas wore off!"); - ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); + ABILITY_POPUP(opponentLeft, ABILITY_INTIMIDATE); SEND_IN_MESSAGE("Wobbuffet"); - } THEN { - if (move == MOVE_HEALING_WISH) - EXPECT_EQ(player->hp, player->maxHP); } } @@ -330,23 +336,25 @@ SINGLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutral } } -SINGLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutralizing Gas - fainted") +DOUBLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutralizing Gas - fainted") { GIVEN { ASSUME(GetMoveEffect(MOVE_FELL_STINGER) == EFFECT_FELL_STINGER); PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); HP(1); } PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } + OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(opponent, MOVE_FELL_STINGER); SEND_OUT(player, 1); } + TURN { MOVE(opponentLeft, MOVE_FELL_STINGER, target: playerLeft); SEND_OUT(playerLeft, 2); } } SCENE { - ABILITY_POPUP(player, ABILITY_NEUTRALIZING_GAS); + ABILITY_POPUP(playerLeft, ABILITY_NEUTRALIZING_GAS); MESSAGE("Neutralizing gas filled the area!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_FELL_STINGER, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FELL_STINGER, opponentLeft); MESSAGE("The effects of the neutralizing gas wore off!"); - ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); + ABILITY_POPUP(opponentLeft, ABILITY_INTIMIDATE); MESSAGE("Weezing fainted!"); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); SEND_IN_MESSAGE("Wobbuffet"); } } @@ -376,7 +384,7 @@ DOUBLE_BATTLE_TEST("Intimidate will correctly decrease the attack of the second } } -SINGLE_BATTLE_TEST("Intimdate does not lose timing after mega evolution and switch out by a hit escape move") +SINGLE_BATTLE_TEST("Intimidate does not lose timing after mega evolution and switch out by a hit escape move") { GIVEN { ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); diff --git a/test/battle/ability/intrepid_sword.c b/test/battle/ability/intrepid_sword.c index 58fd9883ebfa..1fc461ebcddd 100644 --- a/test/battle/ability/intrepid_sword.c +++ b/test/battle/ability/intrepid_sword.c @@ -1,30 +1,48 @@ #include "global.h" #include "test/battle.h" -ASSUMPTIONS +SINGLE_BATTLE_TEST("Intrepid Sword raises Attack by one stage") { - ASSUME(B_INTREPID_SWORD == GEN_9); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ZACIAN) { Ability(ABILITY_INTREPID_SWORD); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_INTREPID_SWORD); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("The opposing Zacian's Intrepid Sword raised its Attack!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + } } -SINGLE_BATTLE_TEST("Intrepid Sword raises Attack by one stage") +SINGLE_BATTLE_TEST("Intrepid Sword raises Attack by one stage every time it switches in (Gen8)") { GIVEN { + WITH_CONFIG(CONFIG_INTREPID_SWORD, GEN_8); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ZACIAN) { Ability(ABILITY_INTREPID_SWORD); } + OPPONENT(SPECIES_WYNAUT); } WHEN { - TURN { } + TURN { SWITCH(opponent, 1); } + TURN { SWITCH(opponent, 0); } } SCENE { ABILITY_POPUP(opponent, ABILITY_INTREPID_SWORD); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); MESSAGE("The opposing Zacian's Intrepid Sword raised its Attack!"); + ABILITY_POPUP(opponent, ABILITY_INTREPID_SWORD); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("The opposing Zacian's Intrepid Sword raised its Attack!"); } THEN { EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); } } -SINGLE_BATTLE_TEST("Intrepid Sword raises Attack by one stage only once per battle") +SINGLE_BATTLE_TEST("Intrepid Sword raises Attack by one stage only once per battle (Gen9+)") { GIVEN { + WITH_CONFIG(CONFIG_INTREPID_SWORD, GEN_9); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ZACIAN) { Ability(ABILITY_INTREPID_SWORD); } OPPONENT(SPECIES_WYNAUT); diff --git a/test/battle/ability/iron_fist.c b/test/battle/ability/iron_fist.c index ae26f9cdd07a..360b3606be21 100644 --- a/test/battle/ability/iron_fist.c +++ b/test/battle/ability/iron_fist.c @@ -1,4 +1,26 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Iron Fist (Ability) test titles") +SINGLE_BATTLE_TEST("Iron Fist increases the power of punching moves by 20%", s16 damage) +{ + u32 move, ability; + PARAMETRIZE { move = MOVE_BULLET_PUNCH; ability = ABILITY_IRON_FIST; } + PARAMETRIZE { move = MOVE_BULLET_PUNCH; ability = ABILITY_BLAZE; } + PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_IRON_FIST; } + PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_BLAZE; } + + GIVEN { + ASSUME(IsPunchingMove(MOVE_BULLET_PUNCH)); + ASSUME(!IsPunchingMove(MOVE_SCRATCH)); + ASSUME(GetMovePower(MOVE_BULLET_PUNCH) == GetMovePower(MOVE_SCRATCH)); + PLAYER(SPECIES_CHIMCHAR) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, move); } + } SCENE { + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[1].damage, Q_4_12(1.2), results[0].damage); // Iron Fist affects punching moves + EXPECT_EQ(results[2].damage, results[3].damage); // Iron Fist does not affect non-punching moves + } +} diff --git a/test/battle/ability/keen_eye.c b/test/battle/ability/keen_eye.c index 6874e5a6bff1..7dbef04ee8ce 100644 --- a/test/battle/ability/keen_eye.c +++ b/test/battle/ability/keen_eye.c @@ -5,12 +5,11 @@ ASSUMPTIONS { ASSUME(GetMoveAccuracy(MOVE_SCRATCH) == 100); ASSUME(GetMoveEffect(MOVE_SAND_ATTACK) == EFFECT_ACCURACY_DOWN); - ASSUME(B_ILLUMINATE_EFFECT >= GEN_9); } SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye prevent accuracy stage reduction from moves") { - u16 ability; + enum Ability ability; u32 species; PARAMETRIZE { species = SPECIES_HITMONCHAN; ability = ABILITY_KEEN_EYE; } @@ -19,6 +18,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye prevent accuracy stag PASSES_RANDOMLY(100, 100, RNG_ACCURACY); GIVEN { + WITH_CONFIG(CONFIG_ILLUMINATE_EFFECT, GEN_9); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species) { Ability(ability); } } WHEN { @@ -38,7 +38,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye prevent accuracy stag SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye ignore target's evasion stat") { - u16 ability; + enum Ability ability; u32 species; PARAMETRIZE { species = SPECIES_HITMONCHAN; ability = ABILITY_KEEN_EYE; } @@ -47,6 +47,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye ignore target's evasi PASSES_RANDOMLY(100, 100, RNG_ACCURACY); GIVEN { + WITH_CONFIG(CONFIG_ILLUMINATE_EFFECT, GEN_9); ASSUME(GetMoveEffect(MOVE_DOUBLE_TEAM) == EFFECT_EVASION_UP); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species) { Ability(ability); } @@ -61,7 +62,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye ignore target's evasi SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye are ignored by Mold Breaker abilities") { - u16 abilityPlayer = ABILITY_NONE, abilityOpponent = ABILITY_NONE; + enum Ability abilityPlayer = ABILITY_NONE, abilityOpponent = ABILITY_NONE; u16 speciesPlayer = SPECIES_NONE, speciesOpponent = SPECIES_NONE; u32 j; @@ -80,6 +81,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye are ignored by Mold B PASSES_RANDOMLY(GetMoveAccuracy(MOVE_SCRATCH) * 3 / 4, 100, RNG_ACCURACY); GIVEN { + WITH_CONFIG(CONFIG_ILLUMINATE_EFFECT, GEN_9); PLAYER(speciesPlayer) { Ability(abilityPlayer); } OPPONENT(speciesOpponent) { Ability(abilityOpponent); } } WHEN { @@ -94,7 +96,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye are ignored by Mold B SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent Topsy-Turvy") { - u16 ability; + enum Ability ability; u32 species; PARAMETRIZE { species = SPECIES_HITMONCHAN; ability = ABILITY_KEEN_EYE; } @@ -102,6 +104,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent Topsy-T PARAMETRIZE { species = SPECIES_URSALUNA_BLOODMOON; ability = ABILITY_MINDS_EYE; } GIVEN { + WITH_CONFIG(CONFIG_ILLUMINATE_EFFECT, GEN_9); ASSUME(GetMoveEffect(MOVE_HONE_CLAWS) == EFFECT_ATTACK_ACCURACY_UP); ASSUME(GetMoveEffect(MOVE_TOPSY_TURVY) == EFFECT_TOPSY_TURVY); PLAYER(SPECIES_WOBBUFFET); @@ -134,13 +137,14 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent Topsy-T SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent receiving negative Attack stage changes from Baton Pass") { - u16 ability; + enum Ability ability; u32 species; PARAMETRIZE { species = SPECIES_HITMONCHAN; ability = ABILITY_KEEN_EYE; } PARAMETRIZE { species = SPECIES_STARYU; ability = ABILITY_ILLUMINATE; } PARAMETRIZE { species = SPECIES_URSALUNA_BLOODMOON; ability = ABILITY_MINDS_EYE; } GIVEN { + WITH_CONFIG(CONFIG_ILLUMINATE_EFFECT, GEN_9); ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -166,13 +170,14 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent receivi SINGLE_BATTLE_TEST("Keen Eye & Gen9+ Illuminate don't prevent Spectral Thief from resetting positive accuracy stage changes") { - u16 ability; + enum Ability ability; u32 species; PARAMETRIZE { species = SPECIES_HITMONCHAN; ability = ABILITY_KEEN_EYE; } PARAMETRIZE { species = SPECIES_STARYU; ability = ABILITY_ILLUMINATE; } GIVEN { + WITH_CONFIG(CONFIG_ILLUMINATE_EFFECT, GEN_9); ASSUME(GetMoveEffect(MOVE_HONE_CLAWS) == EFFECT_ATTACK_ACCURACY_UP); ASSUME(GetMoveEffect(MOVE_SPECTRAL_THIEF) == EFFECT_SPECTRAL_THIEF); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/leaf_guard.c b/test/battle/ability/leaf_guard.c index 94785bd29bf9..8efa7abdf3ab 100644 --- a/test/battle/ability/leaf_guard.c +++ b/test/battle/ability/leaf_guard.c @@ -31,7 +31,41 @@ SINGLE_BATTLE_TEST("Leaf Guard prevents non-volatile status conditions in sun") } } -TO_DO_BATTLE_TEST("Leaf Guard doesn't prevent non-volatile status conditions if Cloud Nine/Air Lock is on the field"); +SINGLE_BATTLE_TEST("Leaf Guard doesn't prevent non-volatile status conditions if Cloud Nine/Air Lock is on the field") +{ + u32 move, species, ability; + u16 status; + PARAMETRIZE { move = MOVE_WILL_O_WISP; status = STATUS1_BURN; species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { move = MOVE_HYPNOSIS; status = STATUS1_SLEEP; species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { move = MOVE_THUNDER_WAVE; status = STATUS1_PARALYSIS; species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { move = MOVE_TOXIC; status = STATUS1_TOXIC_POISON; species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { move = MOVE_WILL_O_WISP; status = STATUS1_BURN; species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + PARAMETRIZE { move = MOVE_HYPNOSIS; status = STATUS1_SLEEP; species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + PARAMETRIZE { move = MOVE_THUNDER_WAVE; status = STATUS1_PARALYSIS; species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + PARAMETRIZE { move = MOVE_TOXIC; status = STATUS1_TOXIC_POISON; species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + // PARAMETRIZE { move = MOVE_POWDER_SNOW; status = STATUS1_FREEZE; } // Pointless since you can't freeze in sunlight anyway + GIVEN { + ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_WILL_O_WISP) == MOVE_EFFECT_BURN); + ASSUME(GetMoveEffect(MOVE_HYPNOSIS) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_HYPNOSIS) == MOVE_EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_THUNDER_WAVE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_THUNDER_WAVE) == MOVE_EFFECT_PARALYSIS); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); + PLAYER(SPECIES_LEAFEON) { Ability(ABILITY_LEAF_GUARD); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_SUNNY_DAY); MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + NONE_OF { + ABILITY_POPUP(player, ABILITY_LEAF_GUARD); + MESSAGE("It doesn't affect Leafeon…"); + } + STATUS_ICON(player, status); + } +} SINGLE_BATTLE_TEST("Leaf Guard prevents status conditions from Flame Orb and Toxic Orb") { @@ -50,29 +84,82 @@ SINGLE_BATTLE_TEST("Leaf Guard prevents status conditions from Flame Orb and Tox NONE_OF { MESSAGE("Leafeon was burned!"); STATUS_ICON(player, burn: TRUE); } } else { - NONE_OF { MESSAGE("Leafeon was badly poisoned!"); STATUS_ICON(player, poison: TRUE); } + NONE_OF { MESSAGE("Leafeon was badly poisoned!"); STATUS_ICON(player, badPoison: TRUE); } } } } -TO_DO_BATTLE_TEST("Leaf Guard doesn't prevent status conditions from Flame Orb and Toxic Orb if Cloud Nine/Air Lock is on the field"); +SINGLE_BATTLE_TEST("Leaf Guard doesn't prevent status conditions from Flame Orb and Toxic Orb if Cloud Nine/Air Lock is on the field") +{ + u32 item, species, ability; + PARAMETRIZE { item = ITEM_FLAME_ORB; species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { item = ITEM_TOXIC_ORB; species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { item = ITEM_FLAME_ORB; species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + PARAMETRIZE { item = ITEM_TOXIC_ORB; species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + GIVEN { + ASSUME(gItemsInfo[ITEM_FLAME_ORB].holdEffect == HOLD_EFFECT_FLAME_ORB); + ASSUME(gItemsInfo[ITEM_TOXIC_ORB].holdEffect == HOLD_EFFECT_TOXIC_ORB); + PLAYER(SPECIES_LEAFEON) { Ability(ABILITY_LEAF_GUARD); Item(item); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_SUNNY_DAY); } + } SCENE { + if (item == ITEM_FLAME_ORB) { + MESSAGE("Leafeon was burned!"); + STATUS_ICON(player, burn: TRUE); + } + else { + MESSAGE("Leafeon was badly poisoned!"); + STATUS_ICON(player, badPoison: TRUE); + } + } +} -SINGLE_BATTLE_TEST("Leaf Guard prevents Rest during sun") +SINGLE_BATTLE_TEST("Leaf Guard prevents Rest during sun (Gen 5+)") { + u32 gen; + PARAMETRIZE { gen = GEN_4; } + PARAMETRIZE { gen = GEN_5; } GIVEN { - ASSUME(B_LEAF_GUARD_PREVENTS_REST >= GEN_5); + WITH_CONFIG(CONFIG_LEAF_GUARD_PREVENTS_REST, gen); ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); PLAYER(SPECIES_LEAFEON) { Ability(ABILITY_LEAF_GUARD); HP(100); MaxHP(200); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_SUNNY_DAY); MOVE(player, MOVE_REST); } } SCENE { - MESSAGE("But it failed!"); - NONE_OF { + if (gen >= GEN_5) { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_REST, player); + STATUS_ICON(player, sleep: TRUE); + HP_BAR(player); + } + } + else { STATUS_ICON(player, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_REST, player); HP_BAR(player); } } } -TO_DO_BATTLE_TEST("Leaf Guard doesn't prevent Rest if Cloud Nine/Air Lock is on the field"); +SINGLE_BATTLE_TEST("Leaf Guard doesn't prevent Rest if Cloud Nine/Air Lock is on the field") +{ + u32 species, ability; + PARAMETRIZE { species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + GIVEN { + WITH_CONFIG(CONFIG_LEAF_GUARD_PREVENTS_REST, GEN_5); + ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); + PLAYER(SPECIES_LEAFEON) { Ability(ABILITY_LEAF_GUARD); HP(100); MaxHP(200); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(opponent, MOVE_SUNNY_DAY); MOVE(player, MOVE_REST); } + } SCENE { + STATUS_ICON(player, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_REST, player); + HP_BAR(player); + } +} diff --git a/test/battle/ability/levitate.c b/test/battle/ability/levitate.c index a1c1dc927df3..51ac0dca2c1f 100644 --- a/test/battle/ability/levitate.c +++ b/test/battle/ability/levitate.c @@ -1,4 +1,115 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Levitate (Ability) test titles") +SINGLE_BATTLE_TEST("Levitate activates when targeted by ground type moves") +{ + GIVEN { + ASSUME(GetMoveType(MOVE_MUD_SLAP) == TYPE_GROUND); + PLAYER(SPECIES_LUNATONE) { Ability(ABILITY_LEVITATE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_MUD_SLAP); } + } SCENE { + ABILITY_POPUP(player, ABILITY_LEVITATE); + MESSAGE("Lunatone makes Ground-type moves miss with Levitate!"); + } +} + +SINGLE_BATTLE_TEST("Levitate does not activate if protected") +{ + GIVEN { + ASSUME(GetMoveType(MOVE_MUD_SLAP) == TYPE_GROUND); + PLAYER(SPECIES_LUNATONE) { Ability(ABILITY_LEVITATE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_PROTECT); MOVE(opponent, MOVE_MUD_SLAP); } + } SCENE { + NONE_OF { + ABILITY_POPUP(player, ABILITY_LEVITATE); + MESSAGE("Lunatone makes Ground-type moves miss with Levitate!"); + } + } +} + +SINGLE_BATTLE_TEST("Levitate does not activate on status moves") +{ + GIVEN { + ASSUME(GetMoveType(MOVE_SAND_ATTACK) == TYPE_GROUND); + ASSUME(GetMoveCategory(MOVE_SAND_ATTACK) == DAMAGE_CATEGORY_STATUS); + PLAYER(SPECIES_LUNATONE) { Ability(ABILITY_LEVITATE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SAND_ATTACK); } + } SCENE { + NONE_OF { + ABILITY_POPUP(player, ABILITY_LEVITATE); + MESSAGE("Lunatone makes Ground-type moves miss with Levitate!"); + } + } +} + +SINGLE_BATTLE_TEST("Levitate does not activate if attacked by an opponent with Mold Breaker") +{ + GIVEN { + ASSUME(GetMoveType(MOVE_MUD_SLAP) == TYPE_GROUND); + PLAYER(SPECIES_LUNATONE) { Ability(ABILITY_LEVITATE); } + OPPONENT(SPECIES_TINKATON) { Ability(ABILITY_MOLD_BREAKER); } + } WHEN { + TURN { MOVE(player, MOVE_PROTECT); MOVE(opponent, MOVE_MUD_SLAP); } + } SCENE { + NONE_OF { + ABILITY_POPUP(player, ABILITY_LEVITATE); + MESSAGE("Lunatone makes Ground-type moves miss with Levitate!"); + } + } +} + +DOUBLE_BATTLE_TEST("Levitate does not cause single remaining target to take higher damage") +{ + s16 damage[3]; + GIVEN { + PLAYER(SPECIES_REGIROCK) { Speed(1); } + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + OPPONENT(SPECIES_LUNATONE) { Speed(3); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + } WHEN { + TURN { MOVE(playerRight, MOVE_CELEBRATE); MOVE(playerLeft, MOVE_EARTHQUAKE); } + TURN { MOVE(playerRight, MOVE_MEMENTO, target:opponentLeft); MOVE(playerLeft, MOVE_EARTHQUAKE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, playerLeft); + HP_BAR(playerRight, captureDamage: &damage[0]); + HP_BAR(opponentRight, captureDamage: &damage[1]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_MEMENTO, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, playerLeft); + HP_BAR(opponentRight, captureDamage: &damage[2]); + + } THEN { + EXPECT_EQ(damage[0], damage[1]); + EXPECT_EQ(damage[1], damage[2]); + } +} + +AI_SINGLE_BATTLE_TEST("Levitate is seen correctly by switch AI") +{ + enum Ability ability = ABILITY_NONE, item = ITEM_NONE; + + PARAMETRIZE { ability = ABILITY_OWN_TEMPO, item = ITEM_NONE ; } + PARAMETRIZE { ability = ABILITY_MOLD_BREAKER, item = ITEM_NONE ; } + PARAMETRIZE { ability = ABILITY_MOLD_BREAKER, item = ITEM_ABILITY_SHIELD ; } + + GIVEN { + ASSUME(GetMoveType(MOVE_MUD_SLAP) == TYPE_GROUND); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_TINKATON) { Ability(ability); Speed(3); } + OPPONENT(SPECIES_PONYTA) { Level(1); Item(ITEM_EJECT_PACK); Moves(MOVE_OVERHEAT); Speed(4); } // Forces switchout + OPPONENT(SPECIES_VIKAVOLT) { HP(1); Speed(1); Ability(ABILITY_LEVITATE); Moves(MOVE_FLAMETHROWER); Item(item); } + OPPONENT(SPECIES_HYPNO) { Speed(1); Moves(MOVE_IRON_HEAD); } + } WHEN { + if ((ability == ABILITY_MOLD_BREAKER) && (item != ITEM_ABILITY_SHIELD)) + TURN { MOVE(player, MOVE_MUD_SLAP); EXPECT_SEND_OUT(opponent, 2); } + else + TURN { MOVE(player, MOVE_MUD_SLAP); EXPECT_SEND_OUT(opponent, 1); } + } +} + diff --git a/test/battle/ability/libero.c b/test/battle/ability/libero.c index 8ea93df3c072..b2ebf5cd5bfa 100644 --- a/test/battle/ability/libero.c +++ b/test/battle/ability/libero.c @@ -1,4 +1,4 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Libero (Ability) test titles") +// Tests for Libero are handled in test/battle/ability/protean.c diff --git a/test/battle/ability/lightning_rod.c b/test/battle/ability/lightning_rod.c index ab2f0d89a0a5..e1fedbe17d46 100644 --- a/test/battle/ability/lightning_rod.c +++ b/test/battle/ability/lightning_rod.c @@ -1,16 +1,20 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Lightning Rod absorbs Electric-type moves and increases the Sp. Attack [Gen5+]") +SINGLE_BATTLE_TEST("Lightning Rod absorbs Electric-type moves and increases the Sp. Attack (Gen5+)") { + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, config); ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_RAICHU) { Ability(ABILITY_LIGHTNING_ROD); } } WHEN { TURN { MOVE(player, MOVE_THUNDERBOLT); MOVE(opponent, MOVE_CELEBRATE); } } SCENE { - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5) { + if (config >= GEN_5) { NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); HP_BAR(opponent); @@ -28,12 +32,22 @@ SINGLE_BATTLE_TEST("Lightning Rod absorbs Electric-type moves and increases the HP_BAR(opponent); } ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + } THEN { + if (config >= GEN_5) { + EXPECT_EQ(gBattleHistory->abilities[1], ABILITY_LIGHTNING_ROD); // Check if the correct ability has been recorded + } else { + EXPECT_EQ(gBattleHistory->abilities[1], ABILITY_NONE); + } } } DOUBLE_BATTLE_TEST("Lightning Rod forces single-target Electric-type moves to target the PokΓ©mon with this Ability.") { + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, config); ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -47,7 +61,7 @@ DOUBLE_BATTLE_TEST("Lightning Rod forces single-target Electric-type moves to ta MOVE(opponentRight, MOVE_CELEBRATE); } } SCENE { - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5) { + if (config >= GEN_5) { NONE_OF { HP_BAR(opponentLeft); HP_BAR(opponentRight); @@ -84,7 +98,7 @@ DOUBLE_BATTLE_TEST("Lightning Rod redirects an ally's attack") TURN { MOVE(opponentRight, MOVE_THUNDERBOLT, target: playerLeft); } } SCENE { MESSAGE("The opposing Wobbuffet used Thunderbolt!"); - if (B_REDIRECT_ABILITY_ALLIES >= GEN_5) + if (B_REDIRECT_ABILITY_ALLIES >= GEN_4) { NOT HP_BAR(playerLeft); ABILITY_POPUP(opponentLeft, ABILITY_LIGHTNING_ROD); @@ -98,9 +112,10 @@ DOUBLE_BATTLE_TEST("Lightning Rod redirects an ally's attack") } } -DOUBLE_BATTLE_TEST("Lightning Rod absorbs moves that targets all battlers but does not redirect") +DOUBLE_BATTLE_TEST("Lightning Rod absorbs moves that targets all battlers but does not redirect (Gen6+)") { GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); ASSUME(GetMoveType(MOVE_DISCHARGE) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/limber.c b/test/battle/ability/limber.c index f89f9a1e748e..fc4e398c1fa5 100644 --- a/test/battle/ability/limber.c +++ b/test/battle/ability/limber.c @@ -29,7 +29,7 @@ SINGLE_BATTLE_TEST("Limber prevents paralysis from Thunder Wave") } WHEN { TURN { MOVE(opponent, MOVE_THUNDER_WAVE); } } SCENE { - MESSAGE("Persian's Limber prevents paralysis!"); + MESSAGE("It doesn't affect Persian…"); NONE_OF { ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, player); STATUS_ICON(player, paralysis: TRUE); diff --git a/test/battle/ability/liquid_ooze.c b/test/battle/ability/liquid_ooze.c index 0e5a0c6cf755..38b1428df140 100644 --- a/test/battle/ability/liquid_ooze.c +++ b/test/battle/ability/liquid_ooze.c @@ -109,11 +109,11 @@ SINGLE_BATTLE_TEST("Liquid Ooze causes Strength Sap users to lose HP instead of } /* * https://bulbapedia.bulbagarden.net/wiki/Liquid_Ooze_(Ability)#In_battle: - * If the recipient of Leech Seed's effect were to faint due to Liquid Ooze on the same turn as the victim of Leech Seed, then the victim faints before the recipient. This means that the victim's team loses the battle if both teams had their final PokΓ©mon sent out. + * If the recipient of Leech Seed's effect were to faint due to Liquid Ooze on the same turn as the victim of Leech Seed, then the victim faints before the recipient. This means that the victim's team loses the battle if both teams had their final PokΓ©mon sent out. */ SINGLE_BATTLE_TEST("Liquid Ooze causes leech seed victim to faint before seeder") { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CLEAR_BODY; } PARAMETRIZE { ability = ABILITY_LIQUID_OOZE; } GIVEN { @@ -138,10 +138,11 @@ SINGLE_BATTLE_TEST("Liquid Ooze causes leech seed victim to faint before seeder" } } -SINGLE_BATTLE_TEST("Liquid Ooze causes Dream Eater users to lose HP instead of heal (Gen 5+") +SINGLE_BATTLE_TEST("Liquid Ooze causes Dream Eater users to lose HP instead of heal (Gen 5+)") { s16 damage; GIVEN { + WITH_CONFIG(CONFIG_DREAM_EATER_LIQUID_OOZE, GEN_5); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_DREAM_EATER) == EFFECT_DREAM_EATER); @@ -158,8 +159,62 @@ SINGLE_BATTLE_TEST("Liquid Ooze causes Dream Eater users to lose HP instead of h HP_BAR(opponent); HP_BAR(player, captureDamage: &damage); } THEN { - EXPECT_LT(damage, 0); + EXPECT_GT(damage, 0); // Positive damage } } -TO_DO_BATTLE_TEST("Liquid Ooze does not cause Dream Eater users to lose HP instead of heal (Gen 3-4") +SINGLE_BATTLE_TEST("Liquid Ooze does not cause Dream Eater users to lose HP instead of heal (Gen 3-4") +{ + s16 damage; + GIVEN { + WITH_CONFIG(CONFIG_DREAM_EATER_LIQUID_OOZE, GEN_3); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_DREAM_EATER) == EFFECT_DREAM_EATER); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_TENTACRUEL) { Ability(ABILITY_LIQUID_OOZE); } + } WHEN { + TURN { MOVE(opponent, MOVE_SCRATCH); MOVE(player, MOVE_SPORE); } + TURN { MOVE(player, MOVE_DREAM_EATER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + HP_BAR(player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DREAM_EATER, player); + HP_BAR(opponent); + HP_BAR(player, captureDamage: &damage); + } THEN { + EXPECT_LT(damage, 0); // Negative damage = Heal + } +} + +SINGLE_BATTLE_TEST("Liquid Ooze HP loss from Absorb is blocked by Magic Guard") +{ + GIVEN { + PLAYER(SPECIES_CLEFFA) { Ability(ABILITY_MAGIC_GUARD); } + OPPONENT(SPECIES_TENTACOOL) { Ability(ABILITY_LIQUID_OOZE); } + } WHEN { + TURN { MOVE(player, MOVE_ABSORB); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ABSORB, player); + HP_BAR(opponent); + NONE_OF { + HP_BAR(player); + MESSAGE("Wobbuffet sucked up the liquid ooze!"); + } + } +} + +SINGLE_BATTLE_TEST("Liquid Ooze HP loss from Leech Seed is blocked by Magic Guard") +{ + GIVEN { + PLAYER(SPECIES_CLEFFA) { Ability(ABILITY_MAGIC_GUARD); } + OPPONENT(SPECIES_TENTACOOL) { Ability(ABILITY_LIQUID_OOZE); } + } WHEN { + TURN { MOVE(player, MOVE_LEECH_SEED); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LEECH_SEED, player); + HP_BAR(opponent); + NOT HP_BAR(player); + } +} diff --git a/test/battle/ability/magic_bounce.c b/test/battle/ability/magic_bounce.c index e04c018a3356..efc3173de66f 100644 --- a/test/battle/ability/magic_bounce.c +++ b/test/battle/ability/magic_bounce.c @@ -42,8 +42,9 @@ SINGLE_BATTLE_TEST("Magic Bounce bounces back powder moves") SINGLE_BATTLE_TEST("Magic Bounce cannot bounce back powder moves against Grass Types") { GIVEN { + WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); ASSUME(IsPowderMove(MOVE_STUN_SPORE)); - ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS); PLAYER(SPECIES_ODDISH); OPPONENT(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); } } WHEN { diff --git a/test/battle/ability/magician.c b/test/battle/ability/magician.c index 9e80120025ef..a54ba2df7de8 100644 --- a/test/battle/ability/magician.c +++ b/test/battle/ability/magician.c @@ -25,3 +25,31 @@ SINGLE_BATTLE_TEST("Magician gets self-damage recoil after stealing Life Orb") } } +DOUBLE_BATTLE_TEST("Magician steal the item from the fastest possible target") +{ + u32 playerRightSpeed = 0; + u32 opponentLeftSpeed = 0; + u32 opponentRightSpeed = 0; + + PARAMETRIZE { playerRightSpeed = 4; opponentLeftSpeed = 2; opponentRightSpeed = 3; } + PARAMETRIZE { playerRightSpeed = 3; opponentLeftSpeed = 4; opponentRightSpeed = 2; } + PARAMETRIZE { playerRightSpeed = 2; opponentLeftSpeed = 3; opponentRightSpeed = 4; } + + GIVEN { + PLAYER(SPECIES_DELPHOX) { Speed(1); Ability(ABILITY_MAGICIAN); Item(ITEM_NONE); } + PLAYER(SPECIES_WOBBUFFET) { Speed(playerRightSpeed); Item(ITEM_POKE_BALL); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(opponentLeftSpeed); Item(ITEM_GREAT_BALL); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(opponentRightSpeed); Item(ITEM_ULTRA_BALL); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_SURF); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_MAGICIAN); + } THEN { + if (playerRightSpeed == 4) + EXPECT(playerLeft->item == ITEM_POKE_BALL); + else if (opponentLeftSpeed == 4) + EXPECT(playerLeft->item == ITEM_GREAT_BALL); + else if (playerRightSpeed == 4) + EXPECT(playerLeft->item == ITEM_ULTRA_BALL); + } +} diff --git a/test/battle/ability/mimicry.c b/test/battle/ability/mimicry.c index fbdb5cf98aee..5cdea7276f21 100644 --- a/test/battle/ability/mimicry.c +++ b/test/battle/ability/mimicry.c @@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("Mimicry changes the battler's type based on Terrain") { u32 j; u32 terrainMove = MOVE_NONE; - u32 terrainType = TYPE_NONE; + enum Type terrainType = TYPE_NONE; for (j = 0; j < ARRAY_COUNT(terrainData); j++) PARAMETRIZE { terrainMove = terrainData[j][0]; terrainType = terrainData[j][1]; } @@ -51,8 +51,8 @@ SINGLE_BATTLE_TEST("Mimicry restores the battler's types when terrain is removed } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_STUNFISK_GALAR].types[0] == TYPE_GROUND); - ASSUME(gSpeciesInfo[SPECIES_STUNFISK_GALAR].types[1] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_STUNFISK_GALAR, 0) == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_STUNFISK_GALAR, 1) == TYPE_STEEL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_STUNFISK_GALAR) { Ability(ABILITY_MIMICRY); } } WHEN { @@ -70,3 +70,57 @@ SINGLE_BATTLE_TEST("Mimicry restores the battler's types when terrain is removed EXPECT_EQ(gBattleMons[B_POSITION_OPPONENT_LEFT].types[1], TYPE_STEEL); } } + +DOUBLE_BATTLE_TEST("Mimicry can trigger multiple times in a turn") +{ + GIVEN { + PLAYER(SPECIES_STUNFISK_GALAR) { Speed(50); Ability(ABILITY_MIMICRY); } + PLAYER(SPECIES_MORELULL) { Speed(40); } + OPPONENT(SPECIES_IGGLYBUFF) { Speed(60); } + OPPONENT(SPECIES_BAGON) { Speed(70); } + } WHEN { + TURN { MOVE(opponentRight, MOVE_ELECTRIC_TERRAIN); MOVE(opponentLeft, MOVE_MISTY_TERRAIN); } + } SCENE { + MESSAGE("The opposing Bagon used Electric Terrain!"); + ABILITY_POPUP(playerLeft, ABILITY_MIMICRY); + MESSAGE("Stunfisk's type changed to Electric!"); + // igglybuff + MESSAGE("The opposing Igglybuff used Misty Terrain!"); + ABILITY_POPUP(playerLeft, ABILITY_MIMICRY); + MESSAGE("Stunfisk's type changed to Fairy!"); + } THEN { + EXPECT_EQ(gBattleMons[0].types[0], TYPE_FAIRY); + EXPECT_EQ(gBattleMons[0].types[1], TYPE_FAIRY); + EXPECT_EQ(gBattleMons[0].types[2], TYPE_MYSTERY); + } +} + +DOUBLE_BATTLE_TEST("Mimicry triggers after Skill Swap") +{ + GIVEN { + PLAYER(SPECIES_STUNFISK_GALAR) { Speed(40); Ability(ABILITY_MIMICRY); } + PLAYER(SPECIES_SHIFTRY) { Speed(50); Ability(ABILITY_CHLOROPHYLL); } + OPPONENT(SPECIES_SHUCKLE) { Speed(30); } + OPPONENT(SPECIES_CHANSEY) { Speed(20); } + } WHEN { + TURN { MOVE(playerRight, MOVE_GRASSY_TERRAIN); } + TURN { MOVE(playerRight, MOVE_SKILL_SWAP, target: playerLeft); + MOVE(playerLeft, MOVE_SPLASH); + } + } SCENE { + // turn 1 + MESSAGE("Shiftry used Grassy Terrain!"); + ABILITY_POPUP(playerLeft, ABILITY_MIMICRY); + MESSAGE("Stunfisk's type changed to Grass!"); + // turn 2 + MESSAGE("Shiftry used Skill Swap!"); + ABILITY_POPUP(playerRight, ABILITY_MIMICRY); + MESSAGE("Shiftry's type changed to Grass!"); + MESSAGE("Stunfisk used Splash!"); // make sure popup occurs before the subsequent move + } THEN { + EXPECT_EQ(playerLeft->types[0], TYPE_GRASS); + EXPECT_EQ(playerLeft->types[1], TYPE_GRASS); + EXPECT_EQ(playerRight->types[0], TYPE_GRASS); + EXPECT_EQ(playerRight->types[1], TYPE_GRASS); + } +} diff --git a/test/battle/ability/minds_eye.c b/test/battle/ability/minds_eye.c index 0300c2e4d521..4ac339d89906 100644 --- a/test/battle/ability/minds_eye.c +++ b/test/battle/ability/minds_eye.c @@ -44,7 +44,7 @@ SINGLE_BATTLE_TEST("Mind's Eye doesn't bypass a Ghost-type's Wonder Guard") AI_SINGLE_BATTLE_TEST("AI doesn't use accuracy-lowering moves if it knows that the foe has Mind's Eye") { - u32 abilityAI = ABILITY_NONE; + enum Ability abilityAI = ABILITY_NONE; PARAMETRIZE { abilityAI = ABILITY_SWIFT_SWIM; } PARAMETRIZE { abilityAI = ABILITY_MOLD_BREAKER; } @@ -60,7 +60,7 @@ AI_SINGLE_BATTLE_TEST("AI doesn't use accuracy-lowering moves if it knows that t if (abilityAI == ABILITY_MOLD_BREAKER) { SCORE_GT(opponent, MOVE_SAND_ATTACK, MOVE_CELEBRATE); } else { - SCORE_EQ(opponent, MOVE_SAND_ATTACK, MOVE_CELEBRATE); + SCORE_LT_VAL(opponent, MOVE_SAND_ATTACK, AI_SCORE_DEFAULT); } } } SCENE { diff --git a/test/battle/ability/mirror_armor.c b/test/battle/ability/mirror_armor.c index 66d7ad5284a2..771df02699f2 100644 --- a/test/battle/ability/mirror_armor.c +++ b/test/battle/ability/mirror_armor.c @@ -1,16 +1,16 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Mirror Armor lowers a stat of the attacking pokemon") +SINGLE_BATTLE_TEST("Mirror Armor lowers a stat of the attacking PokΓ©mon") { u16 move, statId; - PARAMETRIZE { move = MOVE_LEER; statId = STAT_DEF; } - PARAMETRIZE { move = MOVE_GROWL; statId = STAT_ATK; } + PARAMETRIZE { move = MOVE_LEER; statId = STAT_DEF; } + PARAMETRIZE { move = MOVE_GROWL; statId = STAT_ATK; } PARAMETRIZE { move = MOVE_SWEET_SCENT; statId = STAT_EVASION; } PARAMETRIZE { move = MOVE_SAND_ATTACK; statId = STAT_ACC; } - PARAMETRIZE { move = MOVE_CONFIDE; statId = STAT_SPATK; } - PARAMETRIZE { move = MOVE_FAKE_TEARS; statId = STAT_SPDEF; } + PARAMETRIZE { move = MOVE_CONFIDE; statId = STAT_SPATK; } + PARAMETRIZE { move = MOVE_FAKE_TEARS; statId = STAT_SPDEF; } GIVEN { PLAYER(SPECIES_CORVIKNIGHT) {Ability(ABILITY_MIRROR_ARMOR);} @@ -29,7 +29,11 @@ SINGLE_BATTLE_TEST("Mirror Armor lowers a stat of the attacking pokemon") MESSAGE("The opposing Wynaut's Attack fell!"); break; case STAT_EVASION: - MESSAGE("The opposing Wynaut's evasiveness harshly fell!"); + if (GetMoveEffect(move) == EFFECT_EVASION_DOWN_2) { + MESSAGE("The opposing Wynaut's evasiveness harshly fell!"); + } else { + MESSAGE("The opposing Wynaut's evasiveness fell!"); + } break; case STAT_ACC: MESSAGE("The opposing Wynaut's accuracy fell!"); @@ -43,7 +47,7 @@ SINGLE_BATTLE_TEST("Mirror Armor lowers a stat of the attacking pokemon") } } THEN { EXPECT_EQ(player->statStages[statId], DEFAULT_STAT_STAGE); - EXPECT_EQ(opponent->statStages[statId], (statId == STAT_SPDEF || statId == STAT_EVASION) ? DEFAULT_STAT_STAGE - 2 : DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(opponent->statStages[statId], (statId == STAT_SPDEF || (statId == STAT_EVASION && GetMoveEffect(move) == EFFECT_EVASION_DOWN_2)) ? DEFAULT_STAT_STAGE - 2 : DEFAULT_STAT_STAGE - 1); } } diff --git a/test/battle/ability/mold_breaker.c b/test/battle/ability/mold_breaker.c index 2c04deeeefe9..fb6f9d11ab93 100644 --- a/test/battle/ability/mold_breaker.c +++ b/test/battle/ability/mold_breaker.c @@ -1,4 +1,22 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Mold Breaker (Ability) test titles") +SINGLE_BATTLE_TEST("Mold Breaker cancels damage reduction from Ice Scales", s16 damage) +{ + u16 ability; + PARAMETRIZE { ability = ABILITY_SHADOW_TAG; } + PARAMETRIZE { ability = ABILITY_MOLD_BREAKER; } + GIVEN { + ASSUME(GetMoveCategory(MOVE_PSYCHIC) == DAMAGE_CATEGORY_SPECIAL); + PLAYER(SPECIES_WOBBUFFET) { Ability(ability); } + OPPONENT(SPECIES_FROSMOTH) { Ability(ABILITY_ICE_SCALES); } + } WHEN { + TURN { MOVE(player, MOVE_PSYCHIC); } + } SCENE { + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[1].damage, UQ_4_12(0.5), results[0].damage); + } +} + +TO_DO_BATTLE_TEST("TODO: Write more Mold Breaker (Ability) test titles") diff --git a/test/battle/ability/moody.c b/test/battle/ability/moody.c index d52f6e9cee01..739bee6d019e 100644 --- a/test/battle/ability/moody.c +++ b/test/battle/ability/moody.c @@ -11,7 +11,7 @@ SINGLE_BATTLE_TEST("Moody randomly raises the user's Attack, Defense, Sp. Atk, S // HP is not included PASSES_RANDOMLY(1, statsNum - 1, RNG_MOODY_INCREASE); GIVEN { - WITH_CONFIG(GEN_CONFIG_MOODY_STATS, config); + WITH_CONFIG(CONFIG_MOODY_ACC_EVASION, config); PLAYER(SPECIES_OCTILLERY) { Ability(ABILITY_MOODY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -36,7 +36,7 @@ SINGLE_BATTLE_TEST("Moody randomly lowers the user's Attack, Defense, Sp. Atk, S // One stat becomes unavailable due to it already increasing PASSES_RANDOMLY(1, statsNum - 2, RNG_MOODY_DECREASE); GIVEN { - WITH_CONFIG(GEN_CONFIG_MOODY_STATS, config); + WITH_CONFIG(CONFIG_MOODY_ACC_EVASION, config); PLAYER(SPECIES_OCTILLERY) { Ability(ABILITY_MOODY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -60,7 +60,7 @@ SINGLE_BATTLE_TEST("Moody randomly raises the holder's Attack, Defense, Sp. Atk, PASSES_RANDOMLY(statsNum - 1, statsNum - 1, RNG_MOODY_DECREASE); GIVEN { - WITH_CONFIG(GEN_CONFIG_MOODY_STATS, config); + WITH_CONFIG(CONFIG_MOODY_ACC_EVASION, config); PLAYER(SPECIES_OCTILLERY) { Ability(ABILITY_MOODY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/moxie.c b/test/battle/ability/moxie.c index a39fb91df8c3..01eb51b9e713 100644 --- a/test/battle/ability/moxie.c +++ b/test/battle/ability/moxie.c @@ -3,9 +3,10 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh raises Attack by one stage after directly causing a Pokemon to faint") { - u32 species = 0, ability = 0, abilityPopUp = 0; - PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; } - PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } + u32 species = 0, abilityPopUp = 0; + enum Ability ability = ABILITY_NONE; + PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; } + PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } GIVEN { ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); @@ -36,9 +37,10 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh raises Attack by one stage after direct DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not trigger if Pokemon faint to indirect damage or damage from other Pokemon") { - u32 species = 0, ability = 0, abilityPopUp = 0; - PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; } - PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } + u32 species = 0, abilityPopUp = 0; + enum Ability ability = ABILITY_NONE; + PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; } + PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } GIVEN { PLAYER(species) { Ability(ability); } @@ -73,9 +75,10 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not trigger if Pokemon faint to in SINGLE_BATTLE_TEST("Moxie/Chilling Neigh does not trigger when already at maximum Attack stage") { - u32 species = 0, ability = 0, abilityPopUp = 0; - PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; } - PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } + u32 species = 0, abilityPopUp = 0; + enum Ability ability = ABILITY_NONE; + PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; } + PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } GIVEN { ASSUME(GetMoveEffect(MOVE_BELLY_DRUM) == EFFECT_BELLY_DRUM); @@ -111,10 +114,11 @@ SINGLE_BATTLE_TEST("Moxie/Chilling Neigh does not trigger when already at maximu DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not increase damage done by the same move that causes another Pokemon to faint") { s16 damage[2]; - u32 species = 0, ability = 0, abilityPopUp = 0; - PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; } - PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } - PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } + u32 species = 0, abilityPopUp = 0; + enum Ability ability = ABILITY_NONE; + PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; } + PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } + PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } GIVEN { ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); diff --git a/test/battle/ability/mummy.c b/test/battle/ability/mummy.c index f03e453e5cb0..990fba7a0d6f 100644 --- a/test/battle/ability/mummy.c +++ b/test/battle/ability/mummy.c @@ -3,7 +3,8 @@ SINGLE_BATTLE_TEST("Mummy/Lingering Aroma replace the attacker's ability on contact") { - u32 move, ability, species; + u32 move, species; + enum Ability ability; PARAMETRIZE { move = MOVE_AQUA_JET; ability = ABILITY_MUMMY; species = SPECIES_YAMASK; } PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_MUMMY; species = SPECIES_YAMASK;} @@ -37,7 +38,7 @@ SINGLE_BATTLE_TEST("Mummy/Lingering Aroma replace the attacker's ability on cont SINGLE_BATTLE_TEST("Mummy and Lingering Aroma don't replace each other") { - u32 ability1, species1, ability2, species2; + enum Ability ability1, species1, ability2, species2; PARAMETRIZE { ability1 = ability2 = ABILITY_MUMMY; species1 = species2 = SPECIES_YAMASK; } PARAMETRIZE { ability1 = ABILITY_MUMMY; species1 = SPECIES_YAMASK; ability2 = ABILITY_LINGERING_AROMA; species2 = SPECIES_OINKOLOGNE; } @@ -66,7 +67,8 @@ SINGLE_BATTLE_TEST("Mummy and Lingering Aroma don't replace each other") SINGLE_BATTLE_TEST("Mummy doesn't replace abilities that can't be suppressed") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; } diff --git a/test/battle/ability/mycelium_might.c b/test/battle/ability/mycelium_might.c index 8491aede5183..7ffac1c6411b 100644 --- a/test/battle/ability/mycelium_might.c +++ b/test/battle/ability/mycelium_might.c @@ -67,3 +67,30 @@ SINGLE_BATTLE_TEST("Mycelium Might vs Stall action order depends on speed") } } } + +DOUBLE_BATTLE_TEST("Mycelium Might priority bracket will not change if the ability is changed mid-turn") +{ + GIVEN { + PLAYER(SPECIES_TOEDSCOOL) { Speed(100); Ability(ABILITY_MYCELIUM_MIGHT); } + PLAYER(SPECIES_WOBBUFFET) { Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(30); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(20); } + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_WORRY_SEED, target: playerLeft); + MOVE(playerLeft, MOVE_SCREECH, target: opponentLeft); + } + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCREECH, playerLeft); + + // Turn 2 + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + } +} diff --git a/test/battle/ability/neuroforce.c b/test/battle/ability/neuroforce.c index bd581b9b7dc9..32f3e91e569e 100644 --- a/test/battle/ability/neuroforce.c +++ b/test/battle/ability/neuroforce.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Neuroforce increases the strength of super-effective moves by 25%", s16 damage) { u32 move; - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_NEUROFORCE; move = MOVE_SHADOW_BALL; } PARAMETRIZE { ability = ABILITY_KLUTZ; move = MOVE_SHADOW_BALL; } PARAMETRIZE { ability = ABILITY_NEUROFORCE; move = MOVE_SCRATCH; } diff --git a/test/battle/ability/neutralizing_gas.c b/test/battle/ability/neutralizing_gas.c index f83e928c4aba..02f7323af294 100644 --- a/test/battle/ability/neutralizing_gas.c +++ b/test/battle/ability/neutralizing_gas.c @@ -83,7 +83,7 @@ DOUBLE_BATTLE_TEST("Neutralizing Gas ignores all battlers' ability effects") SINGLE_BATTLE_TEST("Neutralizing Gas ignores multipliers from attacker's ability", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_NEUTRALIZING_GAS; } PARAMETRIZE { ability = ABILITY_LEVITATE; } GIVEN { @@ -102,7 +102,7 @@ SINGLE_BATTLE_TEST("Neutralizing Gas ignores multipliers from attacker's ability SINGLE_BATTLE_TEST("Neutralizing Gas ignores multipliers from target's ability", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_NEUTRALIZING_GAS; } PARAMETRIZE { ability = ABILITY_LEVITATE; } GIVEN { @@ -122,7 +122,7 @@ SINGLE_BATTLE_TEST("Neutralizing Gas ignores multipliers from target's ability", DOUBLE_BATTLE_TEST("Neutralizing Gas ignores multipliers from target's ally's ability", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_NEUTRALIZING_GAS; } PARAMETRIZE { ability = ABILITY_LEVITATE; } GIVEN { @@ -142,7 +142,7 @@ DOUBLE_BATTLE_TEST("Neutralizing Gas ignores multipliers from target's ally's ab DOUBLE_BATTLE_TEST("Neutralizing Gas ignores multipliers from ally's ability", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_NEUTRALIZING_GAS; } PARAMETRIZE { ability = ABILITY_LEVITATE; } GIVEN { @@ -310,3 +310,88 @@ SINGLE_BATTLE_TEST("Neutralizing Gas exiting the field does not activate Imposte NOT ABILITY_POPUP(player, ABILITY_IMPOSTER); } } + +SINGLE_BATTLE_TEST("Neutralizing Gas exiting the field does not activate Air Lock/Cloud Nine but their effects are kept") +{ + u32 species, ability; + + PARAMETRIZE { species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_RAIN_DANCE) == EFFECT_RAIN_DANCE); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(species) { Ability(ability); } + OPPONENT(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); } + OPPONENT(SPECIES_LUDICOLO) { Ability(ABILITY_RAIN_DISH); } + } WHEN { + TURN { SWITCH(player, 1); SWITCH(opponent, 1); } + TURN { MOVE(player, MOVE_RAIN_DANCE); } + } SCENE { + NOT ABILITY_POPUP(player, ABILITY_AIR_LOCK); + MESSAGE("The effects of the neutralizing gas wore off!"); + NOT ABILITY_POPUP(player, ABILITY_AIR_LOCK); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAIN_DANCE, player); + NOT ABILITY_POPUP(opponent, ABILITY_RAIN_DISH); + } +} + +SINGLE_BATTLE_TEST("Neutralizing Gas only displays exiting message for the last user leaving the field") +{ + GIVEN { + PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { SWITCH(player, 1); SWITCH(opponent, 1); } + } SCENE { + ABILITY_POPUP(player, ABILITY_NEUTRALIZING_GAS); + ABILITY_POPUP(opponent, ABILITY_NEUTRALIZING_GAS); + SEND_IN_MESSAGE("Wobbuffet"); + MESSAGE("The effects of the neutralizing gas wore off!"); + NOT MESSAGE("The effects of the neutralizing gas wore off!"); + } +} + +DOUBLE_BATTLE_TEST("Neutralizing Gas is active for the duration of a Spread Move even if Neutralizing Gas is no longer on the field") +{ + GIVEN { + ASSUME(GetMoveTarget(MOVE_ORIGIN_PULSE) == MOVE_TARGET_BOTH); + PLAYER(SPECIES_WEEZING) { HP(1); Ability(ABILITY_NEUTRALIZING_GAS); } + PLAYER(SPECIES_GOLEM) { Ability(ABILITY_STURDY); } + OPPONENT(SPECIES_BASCULEGION) { Ability(ABILITY_MOLD_BREAKER); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_ORIGIN_PULSE); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_NEUTRALIZING_GAS); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ORIGIN_PULSE, opponentLeft); + HP_BAR(playerLeft); + HP_BAR(playerRight); + MESSAGE("Weezing fainted!"); + MESSAGE("Golem fainted!"); + NOT ABILITY_POPUP(playerRight, ABILITY_STURDY); + } +} + +DOUBLE_BATTLE_TEST("Neutralizing Gas is active until the last Dragon Darts hit even if Neutralizing Gas is no longer on the field") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_DRAGON_DARTS) == EFFECT_DRAGON_DARTS); + PLAYER(SPECIES_WEEZING) { HP(1); Ability(ABILITY_NEUTRALIZING_GAS); } + PLAYER(SPECIES_GOLEM) { HP(2); MaxHP(2); Ability(ABILITY_STURDY); } + OPPONENT(SPECIES_BASCULEGION) { Ability(ABILITY_MOLD_BREAKER); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_DRAGON_DARTS, target: playerLeft); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_NEUTRALIZING_GAS); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DARTS, opponentLeft); + HP_BAR(playerLeft); + MESSAGE("Weezing fainted!"); + HP_BAR(playerRight); + NOT MESSAGE("Golem fainted!"); + ABILITY_POPUP(playerRight, ABILITY_STURDY); + } +} diff --git a/test/battle/ability/normalize.c b/test/battle/ability/normalize.c index 2a449f74a5e6..b50c46be09f9 100644 --- a/test/battle/ability/normalize.c +++ b/test/battle/ability/normalize.c @@ -11,11 +11,11 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Normalize turns a move into a Normal-type move") { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { ability = ABILITY_NORMALIZE; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_GASTLY].types[0] == TYPE_GHOST); + ASSUME(GetSpeciesType(SPECIES_GASTLY, 0) == TYPE_GHOST); PLAYER(SPECIES_GASTLY); OPPONENT(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_WATER_GUN);} } WHEN { @@ -36,12 +36,12 @@ SINGLE_BATTLE_TEST("Normalize turns a move into a Normal-type move") SINGLE_BATTLE_TEST("Normalize affects status moves") { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { ability = ABILITY_NORMALIZE; } GIVEN { ASSUME(GetMoveType(MOVE_THUNDER_WAVE) == TYPE_ELECTRIC); - ASSUME(gSpeciesInfo[SPECIES_DRILBUR].types[0] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_DRILBUR, 0) == TYPE_GROUND); PLAYER(SPECIES_DRILBUR); OPPONENT(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_THUNDER_WAVE);} } WHEN { @@ -62,13 +62,13 @@ SINGLE_BATTLE_TEST("Normalize affects status moves") SINGLE_BATTLE_TEST("Normalize still makes Freeze-Dry do super effective damage to Water-type PokΓ©mon", s16 damage) { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { ability = ABILITY_NORMALIZE; } GIVEN { ASSUME(GetMoveType(MOVE_FREEZE_DRY) == TYPE_ICE); ASSUME(GetMoveEffect(MOVE_FREEZE_DRY) == EFFECT_SUPER_EFFECTIVE_ON_ARG); - ASSUME(gSpeciesInfo[SPECIES_MUDKIP].types[0] == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_MUDKIP, 0) == TYPE_WATER); PLAYER(SPECIES_MUDKIP); OPPONENT(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_FREEZE_DRY);} } WHEN { @@ -82,12 +82,12 @@ SINGLE_BATTLE_TEST("Normalize still makes Freeze-Dry do super effective damage t SINGLE_BATTLE_TEST("Normalize doesn't boost power of unaffected moves by 20% (< Gen7)", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { ability = ABILITY_NORMALIZE; } GIVEN { - WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, GEN_6); + WITH_CONFIG(CONFIG_ATE_MULTIPLIER, GEN_6); PLAYER(SPECIES_DELCATTY) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -101,12 +101,12 @@ SINGLE_BATTLE_TEST("Normalize doesn't boost power of unaffected moves by 20% (< SINGLE_BATTLE_TEST("Normalize boosts power of unaffected moves by 20% (Gen7+)", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { ability = ABILITY_NORMALIZE; } GIVEN { - WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, GEN_7); + WITH_CONFIG(CONFIG_ATE_MULTIPLIER, GEN_7); PLAYER(SPECIES_DELCATTY) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -120,12 +120,12 @@ SINGLE_BATTLE_TEST("Normalize boosts power of unaffected moves by 20% (Gen7+)", SINGLE_BATTLE_TEST("Normalize doesn't boost power of affected moves by 20% (< Gen7)", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { ability = ABILITY_NORMALIZE; } GIVEN { - WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, GEN_6); + WITH_CONFIG(CONFIG_ATE_MULTIPLIER, GEN_6); PLAYER(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_WATER_GUN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -139,12 +139,12 @@ SINGLE_BATTLE_TEST("Normalize doesn't boost power of affected moves by 20% (< Ge SINGLE_BATTLE_TEST("Normalize boosts power of affected moves by 20% (Gen7+)", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { ability = ABILITY_NORMALIZE; } GIVEN { - WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, GEN_7); + WITH_CONFIG(CONFIG_ATE_MULTIPLIER, GEN_7); PLAYER(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_WATER_GUN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -156,59 +156,36 @@ SINGLE_BATTLE_TEST("Normalize boosts power of affected moves by 20% (Gen7+)", s1 } } -SINGLE_BATTLE_TEST("Normalize-affected moves become Electric-type under Electrify's effect", s16 damage) +SINGLE_BATTLE_TEST("Normalize-affected moves become Electric-type under Electrify's effect") { - u32 ability, genConfig; - PARAMETRIZE { ability = ABILITY_CUTE_CHARM; genConfig = GEN_7; } - PARAMETRIZE { ability = ABILITY_CUTE_CHARM; genConfig = GEN_6; } - PARAMETRIZE { ability = ABILITY_NORMALIZE; genConfig = GEN_7; } - PARAMETRIZE { ability = ABILITY_NORMALIZE; genConfig = GEN_6; } - GIVEN { ASSUME(GetMoveEffect(MOVE_ELECTRIFY) == EFFECT_ELECTRIFY); - WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, genConfig); - PLAYER(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_WATER_GUN); } - OPPONENT(SPECIES_WOBBUFFET); + PLAYER(SPECIES_SKITTY) { Ability(ABILITY_NORMALIZE); } + OPPONENT(SPECIES_ROOKIDEE) { Item(ITEM_WACAN_BERRY); } } WHEN { TURN { MOVE(opponent, MOVE_ELECTRIFY); MOVE(player, MOVE_WATER_GUN); } } SCENE { - HP_BAR(opponent, captureDamage: &results[i].damage); - } FINALLY { - if (genConfig >= GEN_7) - EXPECT_EQ(results[0].damage, results[2].damage); - else - EXPECT_EQ(results[1].damage, results[3].damage); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); } } -SINGLE_BATTLE_TEST("Normalize-affected moves become Electric-type under Ion Deluge's effect", s16 damage) +SINGLE_BATTLE_TEST("Normalize-affected moves become Electric-type under Ion Deluge's effect") { - u32 ability, genConfig; - PARAMETRIZE { ability = ABILITY_CUTE_CHARM; genConfig = GEN_7; } - PARAMETRIZE { ability = ABILITY_CUTE_CHARM; genConfig = GEN_6; } - PARAMETRIZE { ability = ABILITY_NORMALIZE; genConfig = GEN_7; } - PARAMETRIZE { ability = ABILITY_NORMALIZE; genConfig = GEN_6; } - GIVEN { ASSUME(GetMoveEffect(MOVE_ION_DELUGE) == EFFECT_ION_DELUGE); - WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, genConfig); - PLAYER(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_WATER_GUN); } - OPPONENT(SPECIES_WOBBUFFET); + PLAYER(SPECIES_SKITTY) { Ability(ABILITY_NORMALIZE); Moves(MOVE_WATER_GUN); } + OPPONENT(SPECIES_ROOKIDEE) { Item(ITEM_WACAN_BERRY); } } WHEN { TURN { MOVE(opponent, MOVE_ION_DELUGE); MOVE(player, MOVE_WATER_GUN); } } SCENE { - HP_BAR(opponent, captureDamage: &results[i].damage); - } FINALLY { - if (genConfig >= GEN_7) - EXPECT_EQ(results[0].damage, results[2].damage); - else - EXPECT_EQ(results[1].damage, results[3].damage); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); } } SINGLE_BATTLE_TEST("Normalize doesn't affect Weather Ball's type", s16 damage) { - u16 move, ability; + u16 move; + enum Ability ability; PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_NORMALIZE; } @@ -216,7 +193,7 @@ SINGLE_BATTLE_TEST("Normalize doesn't affect Weather Ball's type", s16 damage) GIVEN { ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL); ASSUME(GetMoveType(MOVE_WEATHER_BALL) == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_MEGANIUM].types[0] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_MEGANIUM, 0) == TYPE_GRASS); PLAYER(SPECIES_SKITTY) { Ability(ability); } OPPONENT(SPECIES_MEGANIUM); } WHEN { @@ -236,13 +213,13 @@ SINGLE_BATTLE_TEST("Normalize doesn't affect Weather Ball's type", s16 damage) SINGLE_BATTLE_TEST("Normalize doesn't affect Natural Gift's type") { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { ability = ABILITY_NORMALIZE; } GIVEN { ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT); ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_ORAN_BERRY)].type == TYPE_POISON); - ASSUME(gSpeciesInfo[SPECIES_BELDUM].types[0] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_BELDUM, 0) == TYPE_STEEL); PLAYER(SPECIES_SKITTY) { Ability(ability); Item(ITEM_ORAN_BERRY); } OPPONENT(SPECIES_BELDUM); } WHEN { @@ -269,7 +246,7 @@ SINGLE_BATTLE_TEST("Normalize doesn't affect Judgment / Techno Blast / Multi-Att ASSUME(gItemsInfo[ITEM_SHOCK_DRIVE].secondaryId == TYPE_ELECTRIC); ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].holdEffect == HOLD_EFFECT_MEMORY); ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].secondaryId == TYPE_ELECTRIC); - ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND); PLAYER(SPECIES_SKITTY) { Ability(ABILITY_NORMALIZE); Item(item); } OPPONENT(SPECIES_DIGLETT); } WHEN { @@ -285,7 +262,7 @@ SINGLE_BATTLE_TEST("Normalize doesn't affect Hidden Power's type") GIVEN { ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER); ASSUME(gTypesInfo[TYPE_ELECTRIC].isHiddenPowerType == TRUE); - ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND); PLAYER(SPECIES_SKITTY) { Ability(ABILITY_NORMALIZE); HPIV(31); AttackIV(31); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(31); } // HP Electric OPPONENT(SPECIES_DIGLETT); } WHEN { diff --git a/test/battle/ability/oblivious.c b/test/battle/ability/oblivious.c index a787ec657829..03f71d7f5530 100644 --- a/test/battle/ability/oblivious.c +++ b/test/battle/ability/oblivious.c @@ -31,29 +31,62 @@ SINGLE_BATTLE_TEST("Oblivious prevents Captivate") } } -SINGLE_BATTLE_TEST("Oblivious prevents Taunt") +SINGLE_BATTLE_TEST("Oblivious prevents Taunt (Gen6+)") { + u32 gen = 0; + PARAMETRIZE { gen = GEN_5; } + PARAMETRIZE { gen = GEN_6; } GIVEN { + WITH_CONFIG(CONFIG_OBLIVIOUS_TAUNT, gen); ASSUME(GetMoveEffect(MOVE_TAUNT) == EFFECT_TAUNT); - ASSUME(B_OBLIVIOUS_TAUNT >= GEN_6); PLAYER(SPECIES_SLOWPOKE) { Ability(ABILITY_OBLIVIOUS); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_TAUNT); } - TURN { MOVE(player, MOVE_SPORE); } + TURN { MOVE(player, MOVE_SPORE, allowed: gen == GEN_6); } } SCENE { - ABILITY_POPUP(player, ABILITY_OBLIVIOUS); - NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_TAUNT, opponent); } - MESSAGE("It doesn't affect Slowpoke…"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + if (gen == GEN_6) { + NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_TAUNT, opponent); } + ABILITY_POPUP(player, ABILITY_OBLIVIOUS); + MESSAGE("It doesn't affect Slowpoke…"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + } else { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TAUNT, opponent); + NONE_OF { + ABILITY_POPUP(player, ABILITY_OBLIVIOUS); + MESSAGE("It doesn't affect Slowpoke…"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + } + } + } +} + +SINGLE_BATTLE_TEST("Oblivious doesn't prevent Intimidate (Gen3-7)") +{ + GIVEN { + WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_7); + PLAYER(SPECIES_SLOWPOKE) { Ability(ABILITY_OBLIVIOUS); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } + } WHEN { + TURN { SWITCH(opponent, 1); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); + NONE_OF { + ABILITY_POPUP(player, ABILITY_OBLIVIOUS); + MESSAGE("Slowpoke's Oblivious prevents stat loss!"); + } + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("The opposing Ekans's Intimidate cuts Slowpoke's Attack!"); } } -SINGLE_BATTLE_TEST("Oblivious prevents Intimidate") +SINGLE_BATTLE_TEST("Oblivious prevents Intimidate (Gen8+)") { GIVEN { - ASSUME(B_UPDATED_INTIMIDATE >= GEN_8); + WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_8); PLAYER(SPECIES_SLOWPOKE) { Ability(ABILITY_OBLIVIOUS); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } diff --git a/test/battle/ability/opportunist.c b/test/battle/ability/opportunist.c index d48b7c1eebb8..6e5b13dd310e 100644 --- a/test/battle/ability/opportunist.c +++ b/test/battle/ability/opportunist.c @@ -8,7 +8,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Opportunist only copies foe's positive stat changes in a turn", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_FRISK; } PARAMETRIZE { ability = ABILITY_OPPORTUNIST; } GIVEN { @@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Opportunist only copies foe's positive stat changes in a tur DOUBLE_BATTLE_TEST("Opportunist raises Attack only once when partner has Intimidate against Contrary foe in a double battle", s16 damageLeft, s16 damageRight) { - u32 abilityLeft, abilityRight; + enum Ability abilityLeft, abilityRight; PARAMETRIZE { abilityLeft = ABILITY_CONTRARY; abilityRight = ABILITY_CONTRARY; } PARAMETRIZE { abilityLeft = ABILITY_TANGLED_FEET; abilityRight = ABILITY_TANGLED_FEET; } @@ -59,7 +59,6 @@ DOUBLE_BATTLE_TEST("Opportunist raises Attack only once when partner has Intimid } SCENE { ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); if (abilityLeft == ABILITY_CONTRARY) { - ABILITY_POPUP(opponentLeft, ABILITY_CONTRARY); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); MESSAGE("The opposing Spinda's Attack rose!"); } else { @@ -67,7 +66,6 @@ DOUBLE_BATTLE_TEST("Opportunist raises Attack only once when partner has Intimid MESSAGE("Mightyena's Intimidate cuts the opposing Spinda's Attack!"); } if (abilityRight == ABILITY_CONTRARY) { - ABILITY_POPUP(opponentRight, ABILITY_CONTRARY); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); MESSAGE("The opposing Spinda's Attack rose!"); } else { @@ -212,7 +210,7 @@ DOUBLE_BATTLE_TEST("Opportunist copies the stat increase of each opposing mon") } -DOUBLE_BATTLE_TEST("Opportunist copies the stat of each pokemon that were raised at the same time") +DOUBLE_BATTLE_TEST("Opportunist copies the stat of each PokΓ©mon that were raised at the same time") { GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -296,3 +294,24 @@ SINGLE_BATTLE_TEST("Opportunist and Mirror Herb stack stat increases") EXPECT_EQ(opponent->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE); } } + +DOUBLE_BATTLE_TEST("Opportunist and Mirror Herb resolve correctly") +{ + GIVEN { + PLAYER(SPECIES_ZACIAN) { Ability(ABILITY_INTREPID_SWORD); } + PLAYER(SPECIES_ESPATHRA) { Ability(ABILITY_OPPORTUNIST); } + OPPONENT(SPECIES_MEOWSCARADA) { Item(ITEM_MIRROR_HERB); } + OPPONENT(SPECIES_ESPATHRA) { Ability(ABILITY_OPPORTUNIST); Item(ITEM_MIRROR_HERB); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_INTREPID_SWORD); + ABILITY_POPUP(opponentRight, ABILITY_OPPORTUNIST); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight); + } THEN { + EXPECT_EQ(playerLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(opponentLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(opponentRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + } +} diff --git a/test/battle/ability/overcoat.c b/test/battle/ability/overcoat.c index 96f3ffcb087c..b0e8984bec20 100644 --- a/test/battle/ability/overcoat.c +++ b/test/battle/ability/overcoat.c @@ -1,21 +1,99 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Overcoat blocks powder and spore moves") +SINGLE_BATTLE_TEST("Overcoat blocks powder and spore moves (Gen6+)") { + u32 gen = 0; + PARAMETRIZE { gen = GEN_5; } + PARAMETRIZE { gen = GEN_6; } GIVEN { + WITH_CONFIG(CONFIG_POWDER_OVERCOAT, gen); ASSUME(IsPowderMove(MOVE_STUN_SPORE)); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_PINECO) { Ability(ABILITY_OVERCOAT); } } WHEN { TURN { MOVE(player, MOVE_STUN_SPORE); } } SCENE { - ABILITY_POPUP(opponent, ABILITY_OVERCOAT); - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_STUN_SPORE, player); - MESSAGE("It doesn't affect the opposing Pineco…"); + if (gen == GEN_6) { + ABILITY_POPUP(opponent, ABILITY_OVERCOAT); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_STUN_SPORE, player); + MESSAGE("It doesn't affect the opposing Pineco…"); + } else { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STUN_SPORE, player); + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_OVERCOAT); + MESSAGE("It doesn't affect the opposing Pineco…"); + } + } } } -TO_DO_BATTLE_TEST("Overcoat blocks damage from hail"); -TO_DO_BATTLE_TEST("Overcoat blocks damage from sandstorm"); -TO_DO_BATTLE_TEST("Overcoat blocks Effect Spore's effect"); +DOUBLE_BATTLE_TEST("Overcoat blocks damage from sandstorm") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT) { Speed(50); } + PLAYER(SPECIES_HELIOLISK) { Speed(40); Ability(ABILITY_SAND_VEIL); } + OPPONENT(SPECIES_PINECO) { Speed(30); Ability(ABILITY_OVERCOAT); } + OPPONENT(SPECIES_STARLY) { Speed(20); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_SANDSTORM); } + } SCENE { + MESSAGE("Wynaut used Sandstorm!"); + MESSAGE("The sandstorm is raging."); + HP_BAR(playerLeft); + NONE_OF { + HP_BAR(playerRight); + HP_BAR(opponentLeft); + } + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Overcoat blocks damage from hail") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); + PLAYER(SPECIES_WYNAUT) { Speed(50); Ability(ABILITY_SNOW_CLOAK); } + PLAYER(SPECIES_SOLOSIS) { Speed(40); Ability(ABILITY_RUN_AWAY); } + OPPONENT(SPECIES_PINECO) { Speed(30); Ability(ABILITY_OVERCOAT); } + OPPONENT(SPECIES_SNORUNT) { Speed(20); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_HAIL); MOVE(playerRight, MOVE_SKILL_SWAP, target: playerLeft); } + } SCENE { + MESSAGE("Wynaut used Hail!"); + MESSAGE("Solosis used Skill Swap!"); + HP_BAR(playerLeft); + NONE_OF { + HP_BAR(playerRight); + HP_BAR(opponentLeft); + HP_BAR(opponentRight); // ice type + } + } +} + +SINGLE_BATTLE_TEST("Overcoat blocks Effect Spore's effect (Gen6+)") +{ + u32 config; + PARAMETRIZE { config = GEN_5; } + PARAMETRIZE { config = GEN_6; } + GIVEN { + WITH_CONFIG(CONFIG_POWDER_OVERCOAT, config); + PLAYER(SPECIES_PINECO) {Ability(ABILITY_OVERCOAT);} + OPPONENT(SPECIES_SHROOMISH) {Ability(ABILITY_EFFECT_SPORE);} + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, WITH_RNG(RNG_EFFECT_SPORE, 1)); } + } SCENE { + MESSAGE("Pineco used Tackle!"); + if (config == GEN_6) { + NOT ABILITY_POPUP(opponent, ABILITY_EFFECT_SPORE); + } + else { + ABILITY_POPUP(opponent, ABILITY_EFFECT_SPORE); + } + } THEN { + if (config == GEN_6) + EXPECT_EQ(player->status1, 0); + else + EXPECT_NE(player->status1, 0); + } +} diff --git a/test/battle/ability/own_tempo.c b/test/battle/ability/own_tempo.c index ef358a172e50..c2b9f4d6d969 100644 --- a/test/battle/ability/own_tempo.c +++ b/test/battle/ability/own_tempo.c @@ -1,10 +1,28 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Own Tempo prevents Intimidate but no other stat down changes") +SINGLE_BATTLE_TEST("Own Tempo doesn't prevent Intimidate (Gen3-7)") { GIVEN { - ASSUME(B_UPDATED_INTIMIDATE >= GEN_8); + WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_7); + ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); + PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); }; + OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); }; + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(player, ABILITY_INTIMIDATE); + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_OWN_TEMPO); + MESSAGE("The opposing Slowpoke's Own Tempo prevents stat loss!"); + } + } +} + +SINGLE_BATTLE_TEST("Own Tempo prevents Intimidate but no other stat down changes (Gen8+)") +{ + GIVEN { + WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_8); ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); }; OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); }; diff --git a/test/battle/ability/parental_bond.c b/test/battle/ability/parental_bond.c index 2635c740dffe..d8be7c76f2fe 100644 --- a/test/battle/ability/parental_bond.c +++ b/test/battle/ability/parental_bond.c @@ -80,7 +80,7 @@ DOUBLE_BATTLE_TEST("Parental Bond does not convert multi-target moves into a two GIVEN { ASSUME(GetMoveStrikeCount(MOVE_EARTHQUAKE) < 2); ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); - ASSUME(gSpeciesInfo[SPECIES_PIDGEY].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_PIDGEY, 1) == TYPE_FLYING); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } PLAYER(SPECIES_PIDGEY); OPPONENT(SPECIES_WOBBUFFET); @@ -105,10 +105,13 @@ DOUBLE_BATTLE_TEST("Parental Bond does not convert multi-target moves into a two SINGLE_BATTLE_TEST("Parental Bond-converted moves only hit once on Lightning Rod/Storm Drain mons") { - u16 move, species, ability, type; + u16 move, species; + enum Type type; + enum Ability ability; PARAMETRIZE { move = MOVE_THUNDERBOLT; ability = ABILITY_LIGHTNING_ROD; species = SPECIES_RAICHU; type = TYPE_ELECTRIC; } - PARAMETRIZE { move = MOVE_SURF; ability = ABILITY_STORM_DRAIN; species = SPECIES_LILEEP; type = TYPE_WATER; } + PARAMETRIZE { move = MOVE_SURF; ability = ABILITY_STORM_DRAIN; species = SPECIES_LILEEP; type = TYPE_WATER; } GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); ASSUME(GetMoveStrikeCount(move) < 2); ASSUME(GetMoveType(move) == type); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } @@ -139,7 +142,7 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); ASSUME(GetMoveCategory(MOVE_COMET_PUNCH) != DAMAGE_CATEGORY_STATUS); ASSUME(GetMoveEffect(MOVE_COMET_PUNCH) == EFFECT_MULTI_HIT); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } @@ -168,7 +171,7 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); ASSUME(GetMoveCategory(MOVE_COMET_PUNCH) != DAMAGE_CATEGORY_STATUS); ASSUME(GetMoveEffect(MOVE_COMET_PUNCH) == EFFECT_MULTI_HIT); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } @@ -198,7 +201,7 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); ASSUME(GetMoveCategory(MOVE_COMET_PUNCH) != DAMAGE_CATEGORY_STATUS); ASSUME(GetMoveEffect(MOVE_COMET_PUNCH) == EFFECT_MULTI_HIT); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } @@ -229,7 +232,7 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); ASSUME(GetMoveCategory(MOVE_COMET_PUNCH) != DAMAGE_CATEGORY_STATUS); ASSUME(GetMoveEffect(MOVE_COMET_PUNCH) == EFFECT_MULTI_HIT); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } @@ -291,10 +294,10 @@ SINGLE_BATTLE_TEST("Parental Bond Snore strikes twice while asleep") HP_BAR(opponent, captureDamage: &damage[1]); MESSAGE("The PokΓ©mon was hit 2 time(s)!"); } THEN { - if (B_PARENTAL_BOND_DMG == GEN_6) - EXPECT_MUL_EQ(damage[0], Q_4_12(0.5), damage[1]); - else + if (B_PARENTAL_BOND_DMG >= GEN_7) EXPECT_MUL_EQ(damage[0], Q_4_12(0.25), damage[1]); + else + EXPECT_MUL_EQ(damage[0], Q_4_12(0.5), damage[1]); } } @@ -352,6 +355,22 @@ SINGLE_BATTLE_TEST("Parental Bond does not trigger on two turn attacks") } } +SINGLE_BATTLE_TEST("Parental Bond does not trigger Scale Shot effect on Drain Punch") +{ + GIVEN { + PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_DRAIN_PUNCH, gimmick: GIMMICK_MEGA); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAIN_PUNCH, player); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); + } +} + TO_DO_BATTLE_TEST("Parental Bond tests"); // Temporary TODO: Convert Bulbapedia description into tests. diff --git a/test/battle/ability/pastel_veil.c b/test/battle/ability/pastel_veil.c index 1c0926ac807d..11bf32bb9a09 100644 --- a/test/battle/ability/pastel_veil.c +++ b/test/battle/ability/pastel_veil.c @@ -80,7 +80,7 @@ SINGLE_BATTLE_TEST("Pastel Veil prevents Toxic bad poison") } SCENE { MESSAGE("Wobbuffet used Toxic!"); ABILITY_POPUP(opponent, ABILITY_PASTEL_VEIL); - MESSAGE("The opposing Ponyta is protected by a pastel veil!"); + MESSAGE("It doesn't affect the opposing Ponyta…"); NOT STATUS_ICON(opponent, badPoison: TRUE); } } @@ -97,7 +97,7 @@ DOUBLE_BATTLE_TEST("Pastel Veil prevents Toxic bad poison on partner - right tar } SCENE { MESSAGE("Wobbuffet used Toxic!"); ABILITY_POPUP(opponentLeft, ABILITY_PASTEL_VEIL); - MESSAGE("The opposing Wynaut is protected by a pastel veil!"); + MESSAGE("It doesn't affect the opposing Wynaut…"); NOT STATUS_ICON(opponentRight, badPoison: TRUE); } } @@ -114,7 +114,7 @@ DOUBLE_BATTLE_TEST("Pastel Veil prevents Toxic bad poison on partner - left targ } SCENE { MESSAGE("Wobbuffet used Toxic!"); ABILITY_POPUP(opponentRight, ABILITY_PASTEL_VEIL); - MESSAGE("The opposing Wynaut is protected by a pastel veil!"); + MESSAGE("It doesn't affect the opposing Wynaut…"); NOT STATUS_ICON(opponentLeft, badPoison: TRUE); } } diff --git a/test/battle/ability/pickup.c b/test/battle/ability/pickup.c index 9db7c0f2de74..bf7482336115 100644 --- a/test/battle/ability/pickup.c +++ b/test/battle/ability/pickup.c @@ -23,10 +23,10 @@ SINGLE_BATTLE_TEST("Pickup grants an item used by another PokΓ©mon") } } -WILD_BATTLE_TEST("Pickup grants an item used by itself in wild battles (Gen 9)") +WILD_BATTLE_TEST("Pickup grants an item used by itself in wild battles (Gen9+)") { GIVEN { - ASSUME(B_PICKUP_WILD >= GEN_9); + WITH_CONFIG(CONFIG_PICKUP_WILD, GEN_9); PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/pixilate.c b/test/battle/ability/pixilate.c index 091b48f541b3..f6747b92d37f 100644 --- a/test/battle/ability/pixilate.c +++ b/test/battle/ability/pixilate.c @@ -23,14 +23,15 @@ SINGLE_BATTLE_TEST("Pixilate turns a Normal-type move into a Fairy-type move") SINGLE_BATTLE_TEST("Pixilate boosts power of affected moves by 20% (Gen7+) or 30% (Gen1-6)", s16 damage) { - u32 ability, genConfig; + enum Ability ability; + u32 genConfig; PARAMETRIZE { ability = ABILITY_CUTE_CHARM; genConfig = GEN_7; } PARAMETRIZE { ability = ABILITY_CUTE_CHARM; genConfig = GEN_6; } PARAMETRIZE { ability = ABILITY_PIXILATE; genConfig = GEN_7; } PARAMETRIZE { ability = ABILITY_PIXILATE; genConfig = GEN_6; } GIVEN { - WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, genConfig); + WITH_CONFIG(CONFIG_ATE_MULTIPLIER, genConfig); PLAYER(SPECIES_SYLVEON) { Ability(ability); Moves(MOVE_TACKLE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -47,7 +48,8 @@ SINGLE_BATTLE_TEST("Pixilate boosts power of affected moves by 20% (Gen7+) or 30 SINGLE_BATTLE_TEST("Pixilate doesn't affect Weather Ball's type", s16 damage) { - u16 move, ability; + u16 move; + enum Ability ability; PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_STURDY; } PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_STURDY; } PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_PIXILATE; } @@ -55,7 +57,7 @@ SINGLE_BATTLE_TEST("Pixilate doesn't affect Weather Ball's type", s16 damage) GIVEN { ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL); ASSUME(GetMoveType(MOVE_WEATHER_BALL) == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_PINSIR].types[0] == TYPE_BUG); + ASSUME(GetSpeciesType(SPECIES_PINSIR, 0) == TYPE_BUG); PLAYER(SPECIES_SYLVEON) { Level(5); Ability(ability); } OPPONENT(SPECIES_PINSIR); } WHEN { @@ -75,13 +77,13 @@ SINGLE_BATTLE_TEST("Pixilate doesn't affect Weather Ball's type", s16 damage) SINGLE_BATTLE_TEST("Pixilate doesn't affect Natural Gift's type") { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { ability = ABILITY_PIXILATE; } GIVEN { ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT); ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_ORAN_BERRY)].type == TYPE_POISON); - ASSUME(gSpeciesInfo[SPECIES_BELDUM].types[0] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_BELDUM, 0) == TYPE_STEEL); PLAYER(SPECIES_SYLVEON) { Ability(ability); Item(ITEM_ORAN_BERRY); } OPPONENT(SPECIES_BELDUM); } WHEN { @@ -108,7 +110,7 @@ SINGLE_BATTLE_TEST("Pixilate doesn't affect Judgment / Techno Blast / Multi-Atta ASSUME(gItemsInfo[ITEM_SHOCK_DRIVE].secondaryId == TYPE_ELECTRIC); ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].holdEffect == HOLD_EFFECT_MEMORY); ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].secondaryId == TYPE_ELECTRIC); - ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND); PLAYER(SPECIES_SYLVEON) { Ability(ABILITY_PIXILATE); Item(item); } OPPONENT(SPECIES_DIGLETT); } WHEN { @@ -124,7 +126,7 @@ SINGLE_BATTLE_TEST("Pixilate doesn't affect Hidden Power's type") GIVEN { ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER); ASSUME(gTypesInfo[TYPE_ELECTRIC].isHiddenPowerType == TRUE); - ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND); PLAYER(SPECIES_SYLVEON) { Ability(ABILITY_PIXILATE); HPIV(31); AttackIV(31); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(31); } // HP Electric OPPONENT(SPECIES_DIGLETT); } WHEN { diff --git a/test/battle/ability/power_construct.c b/test/battle/ability/power_construct.c index 6a8ca9db5ffa..07d52c17678e 100644 --- a/test/battle/ability/power_construct.c +++ b/test/battle/ability/power_construct.c @@ -2,3 +2,56 @@ #include "test/battle.h" TO_DO_BATTLE_TEST("TODO: Write Power Construct (Ability) test titles") + +SINGLE_BATTLE_TEST("Power Construct switches Zygarde's form when HP is below half") +{ + u16 baseSpecies; + PARAMETRIZE { baseSpecies = SPECIES_ZYGARDE_10_POWER_CONSTRUCT; } + PARAMETRIZE { baseSpecies = SPECIES_ZYGARDE_50_POWER_CONSTRUCT; } + + GIVEN { + PLAYER(baseSpecies) + { + Ability(ABILITY_POWER_CONSTRUCT); + HP((GetMonData(&PLAYER_PARTY[0], MON_DATA_MAX_HP) / 2) + 1); + } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SCRATCH); MOVE(player, MOVE_CELEBRATE); } + } SCENE { + MESSAGE("You sense the presence of many!"); + ABILITY_POPUP(player, ABILITY_POWER_CONSTRUCT); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_POWER_CONSTRUCT, player); + } THEN { + EXPECT_EQ(player->species, SPECIES_ZYGARDE_COMPLETE); + } +} + +WILD_BATTLE_TEST("Power Construct Zygarde reverts to its original form upon catching") +{ + u16 baseSpecies; + PARAMETRIZE { baseSpecies = SPECIES_ZYGARDE_10_POWER_CONSTRUCT; } + PARAMETRIZE { baseSpecies = SPECIES_ZYGARDE_50_POWER_CONSTRUCT; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(baseSpecies) + { + Ability(ABILITY_POWER_CONSTRUCT); + HP((GetMonData(&OPPONENT_PARTY[0], MON_DATA_MAX_HP) / 2) + 1); + } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + TURN { USE_ITEM(player, ITEM_MASTER_BALL); } + } SCENE { + // Turn 1 + MESSAGE("You sense the presence of many!"); + ABILITY_POPUP(opponent, ABILITY_POWER_CONSTRUCT); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_POWER_CONSTRUCT, opponent); + + // Turn 2 + ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_BALL_THROW, player); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[1], MON_DATA_SPECIES), baseSpecies); + } +} diff --git a/test/battle/ability/prankster.c b/test/battle/ability/prankster.c index cf297214d9ab..7e170570cf16 100644 --- a/test/battle/ability/prankster.c +++ b/test/battle/ability/prankster.c @@ -3,26 +3,35 @@ ASSUMPTIONS { - ASSUME(gSpeciesInfo[SPECIES_UMBREON].types[0] == TYPE_DARK); + ASSUME(GetSpeciesType(SPECIES_UMBREON, 0) == TYPE_DARK); ASSUME(GetMoveCategory(MOVE_CONFUSE_RAY) == DAMAGE_CATEGORY_STATUS); } -SINGLE_BATTLE_TEST("Prankster-affected moves don't affect Dark-type PokΓ©mon") +SINGLE_BATTLE_TEST("Prankster-affected moves don't affect Dark-type PokΓ©mon (Gen7+)") { + u32 gen; + PARAMETRIZE { gen = GEN_6; } + PARAMETRIZE { gen = GEN_7; } GIVEN { + WITH_CONFIG(CONFIG_PRANKSTER_DARK_TYPES, gen); PLAYER(SPECIES_UMBREON); OPPONENT(SPECIES_VOLBEAT) { Ability(ABILITY_PRANKSTER); } } WHEN { TURN { MOVE(opponent, MOVE_CONFUSE_RAY); } } SCENE { - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, opponent); - MESSAGE("It doesn't affect Umbreon…"); + if (gen == GEN_6) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, opponent); + } else { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, opponent); + MESSAGE("It doesn't affect Umbreon…"); + } } } SINGLE_BATTLE_TEST("Prankster-affected moves don't affect Dark-type PokΓ©mon after they switch-in") { GIVEN { + WITH_CONFIG(CONFIG_PRANKSTER_DARK_TYPES, GEN_7); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_UMBREON); OPPONENT(SPECIES_VOLBEAT) { Ability(ABILITY_PRANKSTER); } @@ -49,39 +58,62 @@ DOUBLE_BATTLE_TEST("Prankster-affected moves affect Ally Dark-type PokΓ©mon") } } -SINGLE_BATTLE_TEST("Prankster-affected moves called via Assist don't affect Dark-type PokΓ©mon") +SINGLE_BATTLE_TEST("Prankster-affected moves called via Assist don't affect Dark-type PokΓ©mon (Gen 7+)") { + u32 gen; + PARAMETRIZE { gen = GEN_6; } + PARAMETRIZE { gen = GEN_7; } GIVEN { + WITH_CONFIG(CONFIG_PRANKSTER_DARK_TYPES, gen); PLAYER(SPECIES_UMBREON); OPPONENT(SPECIES_VOLBEAT) { Ability(ABILITY_PRANKSTER); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CONFUSE_RAY); }; } WHEN { TURN { MOVE(opponent, MOVE_ASSIST); } } SCENE { - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, opponent); - MESSAGE("It doesn't affect Umbreon…"); + if (gen == GEN_6) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, opponent); + } else { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, opponent); + MESSAGE("It doesn't affect Umbreon…"); + } } } // Tested on Showdown, even though Bulbapedia says otherwise. DOUBLE_BATTLE_TEST("Prankster-affected moves called via Instruct do not affect Dark-type PokΓ©mon") { + u32 gen; + PARAMETRIZE { gen = GEN_6; } + PARAMETRIZE { gen = GEN_7; } GIVEN { + WITH_CONFIG(CONFIG_PRANKSTER_DARK_TYPES, gen); PLAYER(SPECIES_VOLBEAT) { Speed(20); Ability(ABILITY_PRANKSTER); } PLAYER(SPECIES_WOBBUFFET) { Speed(10);} - OPPONENT(SPECIES_UMBREON) { Speed(1); } + OPPONENT(SPECIES_UMBREON) { Speed(15); } OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } + OPPONENT(SPECIES_UMBREON) { Speed(1); } } WHEN { TURN { MOVE(playerLeft, MOVE_CONFUSE_RAY, target: opponentLeft); + MOVE(opponentLeft, MOVE_U_TURN, target: playerRight, WITH_RNG(RNG_CONFUSION, FALSE)); + SEND_OUT(opponentLeft, 2); MOVE(playerRight, MOVE_INSTRUCT, target: playerLeft); } } SCENE { - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, playerLeft); - MESSAGE("It doesn't affect the opposing Umbreon…"); + if (gen == GEN_6) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, playerLeft); + } else { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, playerLeft); + MESSAGE("It doesn't affect the opposing Umbreon…"); + } MESSAGE("Wobbuffet used Instruct!"); MESSAGE("Volbeat used Confuse Ray!"); - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, playerLeft); - MESSAGE("It doesn't affect the opposing Umbreon…"); + if (gen == GEN_6) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, playerLeft); + } else { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, playerLeft); + MESSAGE("It doesn't affect the opposing Umbreon…"); + } } } @@ -165,12 +197,13 @@ SINGLE_BATTLE_TEST("Prankster-affected moves can still be bounced back by Dark-t SINGLE_BATTLE_TEST("Prankster-affected moves which are reflected by Magic Coat can affect Dark-type PokΓ©mon, unless the PokΓ©mon that bounced the move also has Prankster") { - u16 sableyeAbility; + enum Ability sableyeAbility; PARAMETRIZE { sableyeAbility = ABILITY_PRANKSTER; } PARAMETRIZE { sableyeAbility = ABILITY_KEEN_EYE; } GIVEN { + WITH_CONFIG(CONFIG_PRANKSTER_DARK_TYPES, GEN_7); PLAYER(SPECIES_SABLEYE) { Ability(sableyeAbility); } OPPONENT(SPECIES_MURKROW) { Ability(ABILITY_PRANKSTER); } } WHEN { diff --git a/test/battle/ability/primordial_sea.c b/test/battle/ability/primordial_sea.c index e895d8ba4834..f24219f26326 100644 --- a/test/battle/ability/primordial_sea.c +++ b/test/battle/ability/primordial_sea.c @@ -52,7 +52,7 @@ DOUBLE_BATTLE_TEST("Primordial Sea blocks damaging Fire-type moves and prints th } } -SINGLE_BATTLE_TEST("Primordial Sea does not block a move if pokemon is asleep and uses a Fire-type move") // Sleep/confusion/paralysis all happen before the check for primal weather +SINGLE_BATTLE_TEST("Primordial Sea does not block a move if PokΓ©mon is asleep and uses a Fire-type move") // Sleep/confusion/paralysis all happen before the check for primal weather { GIVEN { PLAYER(SPECIES_KYOGRE) {Item(ITEM_BLUE_ORB);} @@ -63,4 +63,16 @@ SINGLE_BATTLE_TEST("Primordial Sea does not block a move if pokemon is asleep an NOT MESSAGE("The Fire-type attack fizzled out in the heavy rain!"); MESSAGE("The opposing Wobbuffet is fast asleep."); } -} \ No newline at end of file +} + +TO_DO_BATTLE_TEST("Primordial Sea makes Sunny Day fail") +TO_DO_BATTLE_TEST("Primordial Sea makes Rain Dance fail") +TO_DO_BATTLE_TEST("Primordial Sea makes Sandstorm fail") +TO_DO_BATTLE_TEST("Primordial Sea makes Hail fail") +TO_DO_BATTLE_TEST("Primordial Sea makes Snowscape fail") // Extrapolation +TO_DO_BATTLE_TEST("Primordial Sea makes Drought fail to activate") +TO_DO_BATTLE_TEST("Primordial Sea makes Drizzle fail to activate") +TO_DO_BATTLE_TEST("Primordial Sea makes Sand Stream fail to activate") +TO_DO_BATTLE_TEST("Primordial Sea makes Snow Warning fail to activate") +TO_DO_BATTLE_TEST("Primordial Sea can be replaced by Delta Stream") +TO_DO_BATTLE_TEST("Primordial Sea can be replaced by Desolate Land") diff --git a/test/battle/ability/prism_armor.c b/test/battle/ability/prism_armor.c index 532642d3a21b..36fbc27f99c9 100644 --- a/test/battle/ability/prism_armor.c +++ b/test/battle/ability/prism_armor.c @@ -1,4 +1,25 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Prism Armor (Ability) test titles") +SINGLE_BATTLE_TEST("Prism Armor reduces damage to Super Effective moves by 0.75", s16 damage) +{ + enum Ability ability; + PARAMETRIZE { ability = ABILITY_NEUTRALIZING_GAS; } + PARAMETRIZE { ability = ABILITY_LEVITATE; } + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_NECROZMA].types[0] == TYPE_PSYCHIC); + ASSUME(gSpeciesInfo[SPECIES_NECROZMA].types[1] == TYPE_PSYCHIC); + ASSUME(GetMoveType(MOVE_DARK_PULSE) == TYPE_DARK); + ASSUME(gTypeEffectivenessTable[TYPE_POISON][TYPE_FAIRY] > UQ_4_12(1.0)); + ASSUME(gTypeEffectivenessTable[TYPE_POISON][TYPE_PSYCHIC] == UQ_4_12(1.0)); + PLAYER(SPECIES_NECROZMA); + OPPONENT(SPECIES_WEEZING) { Ability(ability); } + } WHEN { + TURN { MOVE(opponent, MOVE_DARK_PULSE); } + } SCENE { + HP_BAR(player, captureDamage: &results[i].damage); + MESSAGE("It's super effective!"); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(0.75), results[1].damage); + } +} diff --git a/test/battle/ability/protean.c b/test/battle/ability/protean.c index 88144670a1b4..7ebec1ff6e0e 100644 --- a/test/battle/ability/protean.c +++ b/test/battle/ability/protean.c @@ -1,16 +1,53 @@ #include "global.h" #include "test/battle.h" -ASSUMPTIONS +SINGLE_BATTLE_TEST("Protean/Libero changes the type of the user to the move used every time (Gen6-8)") { - ASSUME(B_PROTEAN_LIBERO == GEN_9); + u32 ability, species; + PARAMETRIZE { ability = ABILITY_PROTEAN; species = SPECIES_KECLEON; } + PARAMETRIZE { ability = ABILITY_LIBERO; species = SPECIES_RABOOT; } + GIVEN { + WITH_CONFIG(CONFIG_PROTEAN_LIBERO, GEN_6); + PLAYER(SPECIES_REGIROCK); + OPPONENT(species) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_WATER_GUN); } + TURN { MOVE(opponent, MOVE_SCRATCH); } + TURN { SWITCH(opponent, 1); } + TURN { SWITCH(opponent, 0); } + TURN { MOVE(opponent, MOVE_WATER_GUN); } + } SCENE { + ABILITY_POPUP(opponent, ability); + if (species == SPECIES_KECLEON) + MESSAGE("The opposing Kecleon transformed into the Water type!"); + else + MESSAGE("The opposing Raboot transformed into the Water type!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, opponent); + ABILITY_POPUP(opponent, ability); + if (species == SPECIES_KECLEON) + MESSAGE("The opposing Kecleon transformed into the Normal type!"); + else + MESSAGE("The opposing Raboot transformed into the Normal type!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + ABILITY_POPUP(opponent, ability); + if (species == SPECIES_KECLEON) + MESSAGE("The opposing Kecleon transformed into the Water type!"); + else + MESSAGE("The opposing Raboot transformed into the Water type!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, opponent); + } } -SINGLE_BATTLE_TEST("Protean changes the type of the user only once per switch in") +SINGLE_BATTLE_TEST("Protean/Libero changes the type of the user only once per switch in (Gen9+)") { + u32 ability, species; + PARAMETRIZE { ability = ABILITY_PROTEAN; species = SPECIES_KECLEON; } + PARAMETRIZE { ability = ABILITY_LIBERO; species = SPECIES_RABOOT; } GIVEN { + WITH_CONFIG(CONFIG_PROTEAN_LIBERO, GEN_9); PLAYER(SPECIES_REGIROCK); - OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); } + OPPONENT(species) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_WATER_GUN); } @@ -19,16 +56,43 @@ SINGLE_BATTLE_TEST("Protean changes the type of the user only once per switch in TURN { SWITCH(opponent, 0); } TURN { MOVE(opponent, MOVE_WATER_GUN); } } SCENE { - ABILITY_POPUP(opponent, ABILITY_PROTEAN); - MESSAGE("The opposing Kecleon transformed into the Water type!"); + ABILITY_POPUP(opponent, ability); + if (species == SPECIES_KECLEON) + MESSAGE("The opposing Kecleon transformed into the Water type!"); + else + MESSAGE("The opposing Raboot transformed into the Water type!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, opponent); NONE_OF { - ABILITY_POPUP(opponent, ABILITY_PROTEAN); + ABILITY_POPUP(opponent, ability); MESSAGE("The opposing Kecleon transformed into the Normal type!"); + MESSAGE("The opposing Raboot transformed into the Normal type!"); } ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); - ABILITY_POPUP(opponent, ABILITY_PROTEAN); - MESSAGE("The opposing Kecleon transformed into the Water type!"); + ABILITY_POPUP(opponent, ability); + if (species == SPECIES_KECLEON) + MESSAGE("The opposing Kecleon transformed into the Water type!"); + else + MESSAGE("The opposing Raboot transformed into the Water type!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, opponent); } } + +SINGLE_BATTLE_TEST("Protean/Libero does not change the user's type when using Struggle") +{ + u32 ability, species; + PARAMETRIZE { ability = ABILITY_PROTEAN; species = SPECIES_GRENINJA; } + PARAMETRIZE { ability = ABILITY_LIBERO; species = SPECIES_RABOOT; } + GIVEN { + PLAYER(SPECIES_REGIROCK); + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(opponent, MOVE_STRUGGLE); } + } SCENE { + NONE_OF { + ABILITY_POPUP(opponent, ability); + MESSAGE("The opposing Greninja transformed into the Normal type!"); + MESSAGE("The opposing Raboot transformed into the Normal type!"); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_STRUGGLE, opponent); + } +} diff --git a/test/battle/ability/protosynthesis.c b/test/battle/ability/protosynthesis.c index 6fd271acb29c..a080e90a11f1 100644 --- a/test/battle/ability/protosynthesis.c +++ b/test/battle/ability/protosynthesis.c @@ -59,6 +59,7 @@ SINGLE_BATTLE_TEST("Protosynthesis ability pop up activates only once during the u16 turns; GIVEN { + WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); PLAYER(SPECIES_WALKING_WAKE) { Ability(ABILITY_PROTOSYNTHESIS); } OPPONENT(SPECIES_NINETALES) { Ability(ABILITY_DROUGHT); }; } WHEN { @@ -184,7 +185,8 @@ SINGLE_BATTLE_TEST("Protosynthesis activates even if the PokΓ©mon is holding an SINGLE_BATTLE_TEST("Protosynthesis doesn't activate if Cloud Nine/Air Lock is on the field") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } PARAMETRIZE { species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } @@ -199,3 +201,113 @@ SINGLE_BATTLE_TEST("Protosynthesis doesn't activate if Cloud Nine/Air Lock is on NOT ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); } } + +SINGLE_BATTLE_TEST("Protosynthesis activates after weather was reset") +{ + GIVEN { + PLAYER(SPECIES_WALKING_WAKE) { Ability(ABILITY_PROTOSYNTHESIS); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUNNY_DAY); } + TURN { MOVE(player, MOVE_RAIN_DANCE); } + TURN { MOVE(player, MOVE_SUNNY_DAY); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, player); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAIN_DANCE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, player); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis accounts for Sticky Web when determining the boosted stat") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(1); } + PLAYER(SPECIES_FLUTTER_MANE) { Ability(ABILITY_PROTOSYNTHESIS); Attack(50); Defense(50); SpAttack(150); SpDefense(140); Speed(180); } + OPPONENT(SPECIES_GALVANTULA) { Speed(60); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } + } WHEN { + TURN { MOVE(opponent, MOVE_STICKY_WEB); MOVE(player, MOVE_SUNNY_DAY); } + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_SPLASH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, player); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + MESSAGE("The harsh sunlight activated Flutter Mane's Protosynthesis!"); + MESSAGE("Flutter Mane's Sp. Atk was heightened!"); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis keeps its initial boosted stat after Speed is lowered") +{ + s16 damage[2]; + + GIVEN { + PLAYER(SPECIES_FLUTTER_MANE) { Ability(ABILITY_PROTOSYNTHESIS); Attack(10); Defense(10); SpAttack(150); SpDefense(120); Speed(180); Moves(MOVE_ROUND); } + OPPONENT(SPECIES_NINETALES) { Ability(ABILITY_DROUGHT); Moves(MOVE_ICY_WIND, MOVE_CELEBRATE); Speed(100); } + } WHEN { + TURN { MOVE(player, MOVE_ROUND); MOVE(opponent, MOVE_ICY_WIND); } + TURN { MOVE(player, MOVE_ROUND); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_DROUGHT); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ICY_WIND, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis recalculates the boosted stat after Neutralizing Gas leaves the field") +{ + GIVEN { + PLAYER(SPECIES_FLUTTER_MANE) { Ability(ABILITY_PROTOSYNTHESIS); Attack(10); Defense(10); SpAttack(150); SpDefense(120); Speed(180); } + OPPONENT(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); Moves(MOVE_ICY_WIND); Speed(70); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } + } WHEN { + TURN { MOVE(player, MOVE_SUNNY_DAY); MOVE(opponent, MOVE_ICY_WIND); } + TURN { SWITCH(opponent, 1); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_NEUTRALIZING_GAS); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, player); + NOT ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ICY_WIND, opponent); + MESSAGE("The effects of the neutralizing gas wore off!"); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + MESSAGE("The harsh sunlight activated Flutter Mane's Protosynthesis!"); + MESSAGE("Flutter Mane's Sp. Atk was heightened!"); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis retains its boosted stat after Neutralizing Gas briefly suppresses it") +{ + s16 damage[2]; + + GIVEN { + PLAYER(SPECIES_FLUTTER_MANE) { Ability(ABILITY_PROTOSYNTHESIS); Attack(10); Defense(10); SpAttack(150); SpDefense(120); Speed(180); Moves(MOVE_SUNNY_DAY, MOVE_ROUND, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); Speed(1); } + OPPONENT(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); Moves(MOVE_CELEBRATE); Speed(70); } + } WHEN { + TURN { MOVE(player, MOVE_SUNNY_DAY); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_ROUND); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); SWITCH(opponent, 1); } + TURN { MOVE(player, MOVE_CELEBRATE); SWITCH(opponent, 0); } + TURN { MOVE(player, MOVE_ROUND); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, player); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ABILITY_POPUP(opponent, ABILITY_NEUTRALIZING_GAS); + MESSAGE("Neutralizing gas filled the area!"); + MESSAGE("The effects of the neutralizing gas wore off!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + } +} diff --git a/test/battle/ability/purifying_salt.c b/test/battle/ability/purifying_salt.c index 49060e659611..80dc786117b9 100644 --- a/test/battle/ability/purifying_salt.c +++ b/test/battle/ability/purifying_salt.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Purifying Salt halves damage from Ghost-type moves", s16 damage) { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_STURDY; } PARAMETRIZE { ability = ABILITY_PURIFYING_SALT; } GIVEN { @@ -21,7 +21,7 @@ SINGLE_BATTLE_TEST("Purifying Salt halves damage from Ghost-type moves", s16 dam SINGLE_BATTLE_TEST("Purifying Salt halves damage from dynamic Ghost-type moves", s16 damage) { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_STURDY; } PARAMETRIZE { ability = ABILITY_PURIFYING_SALT; } GIVEN { @@ -105,7 +105,7 @@ SINGLE_BATTLE_TEST("Purifying Salt user can't be poisoned by Toxic Spikes") } } -SINGLE_BATTLE_TEST("Purifying Salt doesn't prevent pokemon from being poisoned by Toxic Spikes on switch-in if forced in by phazing with Mold Breaker") +SINGLE_BATTLE_TEST("Purifying Salt doesn't prevent PokΓ©mon from being poisoned by Toxic Spikes on switch-in if forced in by phazing with Mold Breaker") { GIVEN { ASSUME(GetMoveEffect(MOVE_DRAGON_TAIL) == EFFECT_HIT_SWITCH_TARGET); diff --git a/test/battle/ability/quark_drive.c b/test/battle/ability/quark_drive.c index 61a51d3d355e..3523f7dca42c 100644 --- a/test/battle/ability/quark_drive.c +++ b/test/battle/ability/quark_drive.c @@ -54,6 +54,59 @@ SINGLE_BATTLE_TEST("Quark Drive boosts either Attack or Special Attack, not both } } +SINGLE_BATTLE_TEST("Quark Drive keeps its initial boosted stat after Speed is lowered") +{ + s16 damage[2]; + + GIVEN { + PLAYER(SPECIES_IRON_MOTH) { Ability(ABILITY_QUARK_DRIVE); Attack(10); Defense(10); SpAttack(150); SpDefense(120); Speed(180); Moves(MOVE_ROUND, MOVE_CELEBRATE); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); Moves(MOVE_CELEBRATE, MOVE_ICY_WIND); Speed(100); } + } WHEN { + TURN { MOVE(player, MOVE_ROUND); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_ICY_WIND); } + TURN { MOVE(player, MOVE_ROUND); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); + ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ICY_WIND, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + } +} + +SINGLE_BATTLE_TEST("Quark Drive retains its boosted stat after Neutralizing Gas briefly suppresses it") +{ + s16 damage[2]; + + GIVEN { + PLAYER(SPECIES_IRON_MOTH) { Ability(ABILITY_QUARK_DRIVE); Attack(10); Defense(10); SpAttack(150); SpDefense(120); Speed(180); Moves(MOVE_ELECTRIC_TERRAIN, MOVE_ROUND, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); Speed(1); } + OPPONENT(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); Moves(MOVE_CELEBRATE); Speed(70); } + } WHEN { + TURN { MOVE(player, MOVE_ELECTRIC_TERRAIN); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_ROUND); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); SWITCH(opponent, 1); } + TURN { MOVE(player, MOVE_CELEBRATE); SWITCH(opponent, 0); } + TURN { MOVE(player, MOVE_ROUND); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIC_TERRAIN, player); + ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ABILITY_POPUP(opponent, ABILITY_NEUTRALIZING_GAS); + MESSAGE("Neutralizing gas filled the area!"); + MESSAGE("The effects of the neutralizing gas wore off!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + } +} + SINGLE_BATTLE_TEST("Quark Drive ability pop up activates only once during the duration of electric terrain") { u16 turns; @@ -104,7 +157,7 @@ SINGLE_BATTLE_TEST("Quark Drive activates on switch-in") SINGLE_BATTLE_TEST("Quark Drive activates on Electric Terrain even if not grounded") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_IRON_JUGULIS].types[0] == TYPE_FLYING || gSpeciesInfo[SPECIES_IRON_JUGULIS].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_IRON_JUGULIS, 0) == TYPE_FLYING || GetSpeciesType(SPECIES_IRON_JUGULIS, 1) == TYPE_FLYING); PLAYER(SPECIES_IRON_JUGULIS) { Ability(ABILITY_QUARK_DRIVE); } OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); }; } WHEN { diff --git a/test/battle/ability/rattled.c b/test/battle/ability/rattled.c index d957dec66a8d..e5e7b3b03e9b 100644 --- a/test/battle/ability/rattled.c +++ b/test/battle/ability/rattled.c @@ -52,10 +52,30 @@ SINGLE_BATTLE_TEST("Rattled boosts speed by 1 when hit by Bug, Dark or Ghost typ } } -SINGLE_BATTLE_TEST("Rattled boosts speed by 1 when affected by Intimidate") +SINGLE_BATTLE_TEST("Rattled does not boost speed by 1 when affected by Intimidate (Gen5-7)") { GIVEN { - ASSUME(B_UPDATED_INTIMIDATE >= GEN_8); + WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_7); + PLAYER(SPECIES_GYARADOS) {Ability(ABILITY_INTIMIDATE); } + OPPONENT(SPECIES_SUDOWOODO) {Ability(ABILITY_RATTLED); } + } WHEN { + TURN {} + } SCENE { + ABILITY_POPUP(player, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Gyarados's Intimidate cuts the opposing Sudowoodo's Attack!"); + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_RATTLED); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("The opposing Sudowoodo's Speed rose!"); + } + } +} + +SINGLE_BATTLE_TEST("Rattled boosts speed by 1 when affected by Intimidate (Gen8+)") +{ + GIVEN { + WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_8); PLAYER(SPECIES_GYARADOS) {Ability(ABILITY_INTIMIDATE); } OPPONENT(SPECIES_SUDOWOODO) {Ability(ABILITY_RATTLED); } } WHEN { diff --git a/test/battle/ability/receiver.c b/test/battle/ability/receiver.c index a9155b7244c0..7e6b7076baf1 100644 --- a/test/battle/ability/receiver.c +++ b/test/battle/ability/receiver.c @@ -1,4 +1,63 @@ #include "global.h" #include "test/battle.h" +DOUBLE_BATTLE_TEST("Receiver copies ally's ability when they faint and immediately activates it") +{ + GIVEN { + ASSUME(!gAbilitiesInfo[ABILITY_INTIMIDATE].cantBeCopied); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_PASSIMIAN) { Ability(ABILITY_RECEIVER); } + OPPONENT(SPECIES_GYARADOS) { Ability(ABILITY_INTIMIDATE); HP(1); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_SCRATCH, target: opponentRight); } + } SCENE { + ABILITY_POPUP(opponentRight, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_RECEIVER); + ABILITY_POPUP(opponentLeft, ABILITY_INTIMIDATE); + } THEN { + EXPECT_EQ(playerLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 2); + EXPECT_EQ(playerRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 2); + } +} + +DOUBLE_BATTLE_TEST("Receiver copies ally's ability when they faint and can activate it on future moves") +{ + GIVEN { + ASSUME(!gAbilitiesInfo[ABILITY_WATER_ABSORB].cantBeCopied); + ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_PASSIMIAN) { Ability(ABILITY_RECEIVER); } + OPPONENT(SPECIES_LANTURN) { Ability(ABILITY_WATER_ABSORB); HP(1); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_SCRATCH, target: opponentRight); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_RECEIVER); + ABILITY_POPUP(opponentLeft, ABILITY_WATER_ABSORB); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, playerRight); + } +} + +DOUBLE_BATTLE_TEST("Receiver copies ally's Soul Heart and immediately activates it") +{ + GIVEN { + ASSUME(!gAbilitiesInfo[ABILITY_SOUL_HEART].cantBeCopied); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_PASSIMIAN) { Ability(ABILITY_RECEIVER); } + OPPONENT(SPECIES_MAGEARNA) { Ability(ABILITY_SOUL_HEART); HP(1); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_SCRATCH, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_RECEIVER); + ABILITY_POPUP(opponentLeft, ABILITY_SOUL_HEART); + } THEN { + EXPECT_EQ(opponentLeft->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + } +} + TO_DO_BATTLE_TEST("TODO: Write Receiver (Ability) test titles") diff --git a/test/battle/ability/refrigerate.c b/test/battle/ability/refrigerate.c index 5f5092f93f6e..0fc274c8e530 100644 --- a/test/battle/ability/refrigerate.c +++ b/test/battle/ability/refrigerate.c @@ -22,14 +22,15 @@ SINGLE_BATTLE_TEST("Refrigerate turns a Normal-type move into a Ice-type move") SINGLE_BATTLE_TEST("Refrigerate boosts power of affected moves by 20% (Gen7+) or 30% (Gen1-6)", s16 damage) { - u32 ability, genConfig; + enum Ability ability; + u32 genConfig; PARAMETRIZE { ability = ABILITY_SNOW_WARNING; genConfig = GEN_7; } PARAMETRIZE { ability = ABILITY_SNOW_WARNING; genConfig = GEN_6; } PARAMETRIZE { ability = ABILITY_REFRIGERATE; genConfig = GEN_7; } PARAMETRIZE { ability = ABILITY_REFRIGERATE; genConfig = GEN_6; } GIVEN { - WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, genConfig); + WITH_CONFIG(CONFIG_ATE_MULTIPLIER, genConfig); PLAYER(SPECIES_AMAURA) { Ability(ability); Moves(MOVE_TACKLE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -46,14 +47,16 @@ SINGLE_BATTLE_TEST("Refrigerate boosts power of affected moves by 20% (Gen7+) or SINGLE_BATTLE_TEST("Refrigerate doesn't affect Weather Ball's type", s16 damage) { - u16 move, ability; + u16 move; + enum Ability ability; PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_SNOW_WARNING; } PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_SNOW_WARNING; } PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_REFRIGERATE; } PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_REFRIGERATE; } GIVEN { + WITH_CONFIG(CONFIG_SNOW_WARNING, GEN_9); //To prevent capturing hail damage ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL); - ASSUME(gSpeciesInfo[SPECIES_PINSIR].types[0] == TYPE_BUG); + ASSUME(GetSpeciesType(SPECIES_PINSIR, 0) == TYPE_BUG); PLAYER(SPECIES_AMAURA) { Ability(ability); } OPPONENT(SPECIES_PINSIR); } WHEN { @@ -73,13 +76,13 @@ SINGLE_BATTLE_TEST("Refrigerate doesn't affect Weather Ball's type", s16 damage) SINGLE_BATTLE_TEST("Refrigerate doesn't affect Natural Gift's type") { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_SNOW_WARNING; } PARAMETRIZE { ability = ABILITY_REFRIGERATE; } GIVEN { ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT); ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_ORAN_BERRY)].type == TYPE_POISON); - ASSUME(gSpeciesInfo[SPECIES_BELDUM].types[0] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_BELDUM, 0) == TYPE_STEEL); PLAYER(SPECIES_AMAURA) { Ability(ability); Item(ITEM_ORAN_BERRY); } OPPONENT(SPECIES_BELDUM); } WHEN { @@ -106,7 +109,7 @@ SINGLE_BATTLE_TEST("Refrigerate doesn't affect Judgment / Techno Blast / Multi-A ASSUME(gItemsInfo[ITEM_SHOCK_DRIVE].secondaryId == TYPE_ELECTRIC); ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].holdEffect == HOLD_EFFECT_MEMORY); ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].secondaryId == TYPE_ELECTRIC); - ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND); PLAYER(SPECIES_AMAURA) { Ability(ABILITY_REFRIGERATE); Item(item); } OPPONENT(SPECIES_DIGLETT); } WHEN { @@ -122,7 +125,7 @@ SINGLE_BATTLE_TEST("Refrigerate doesn't affect Hidden Power's type") GIVEN { ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER); ASSUME(gTypesInfo[TYPE_ELECTRIC].isHiddenPowerType == TRUE); - ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND); PLAYER(SPECIES_AMAURA) { Ability(ABILITY_REFRIGERATE); HPIV(31); AttackIV(31); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(31); } // HP Electric OPPONENT(SPECIES_DIGLETT); } WHEN { diff --git a/test/battle/ability/rivalry.c b/test/battle/ability/rivalry.c index 85d10a5b3bec..fbb4ba453087 100644 --- a/test/battle/ability/rivalry.c +++ b/test/battle/ability/rivalry.c @@ -10,7 +10,8 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Rivalry increases power by x1.25 towards PokΓ©mon of the same gender", s16 damage) { - u16 species, ability; + u16 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_NIDOKING; ability = ABILITY_POISON_POINT; } PARAMETRIZE { species = SPECIES_NIDOKING; ability = ABILITY_RIVALRY; } PARAMETRIZE { species = SPECIES_NIDOQUEEN; ability = ABILITY_POISON_POINT; } @@ -32,7 +33,8 @@ SINGLE_BATTLE_TEST("Rivalry increases power by x1.25 towards PokΓ©mon of the sam SINGLE_BATTLE_TEST("Rivalry decreases power by x0.75 towards PokΓ©mon of different gender", s16 damage) { - u16 species1, species2, ability; + u16 species1, species2; + enum Ability ability; PARAMETRIZE { species1 = SPECIES_NIDOKING; species2 = SPECIES_NIDOQUEEN; ability = ABILITY_POISON_POINT; } PARAMETRIZE { species1 = SPECIES_NIDOKING; species2 = SPECIES_NIDOQUEEN; ability = ABILITY_RIVALRY; } PARAMETRIZE { species1 = SPECIES_NIDOQUEEN; species2 = SPECIES_NIDOKING; ability = ABILITY_POISON_POINT; } @@ -54,14 +56,15 @@ SINGLE_BATTLE_TEST("Rivalry decreases power by x0.75 towards PokΓ©mon of differe SINGLE_BATTLE_TEST("Rivalry doesn't modify power if the attacker is genderless", s16 damage) { - u16 species, ability; + u16 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_NIDOKING; ability = ABILITY_POISON_POINT; } PARAMETRIZE { species = SPECIES_NIDOKING; ability = ABILITY_RIVALRY; } PARAMETRIZE { species = SPECIES_NIDOQUEEN; ability = ABILITY_POISON_POINT; } PARAMETRIZE { species = SPECIES_NIDOQUEEN; ability = ABILITY_RIVALRY; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_PORYGON].abilities[0] == ABILITY_TRACE); + ASSUME(GetSpeciesAbility(SPECIES_PORYGON, 0) == ABILITY_TRACE); PLAYER(SPECIES_PORYGON) { Ability(ABILITY_TRACE); } // No genderless mon naturally gets Rivalry OPPONENT(species) { Ability(ability); }; } WHEN { @@ -78,7 +81,8 @@ SINGLE_BATTLE_TEST("Rivalry doesn't modify power if the attacker is genderless", SINGLE_BATTLE_TEST("Rivalry doesn't modify power if the target is genderless", s16 damage) { - u16 species, ability; + u16 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_NIDOKING; ability = ABILITY_POISON_POINT; } PARAMETRIZE { species = SPECIES_NIDOKING; ability = ABILITY_RIVALRY; } PARAMETRIZE { species = SPECIES_NIDOQUEEN; ability = ABILITY_POISON_POINT; } diff --git a/test/battle/ability/rocky_payload.c b/test/battle/ability/rocky_payload.c index a185efb4f965..d688e5c87e27 100644 --- a/test/battle/ability/rocky_payload.c +++ b/test/battle/ability/rocky_payload.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Rocky Payload increases Rock-type move damage", s16 damage) { u32 move; - u16 ability; + enum Ability ability; PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_BIG_PECKS; } PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_ROCKY_PAYLOAD; } diff --git a/test/battle/ability/sand_force.c b/test/battle/ability/sand_force.c index 959d4379804c..ba062f3fa31e 100644 --- a/test/battle/ability/sand_force.c +++ b/test/battle/ability/sand_force.c @@ -3,8 +3,8 @@ SINGLE_BATTLE_TEST("Sand Force prevents damage from sandstorm") { - u32 type1 = gSpeciesInfo[SPECIES_SHELLOS].types[0]; - u32 type2 = gSpeciesInfo[SPECIES_SHELLOS].types[1]; + enum Type type1 = GetSpeciesType(SPECIES_SHELLOS, 0); + enum Type type2 = GetSpeciesType(SPECIES_SHELLOS, 1); GIVEN { ASSUME(type1 != TYPE_ROCK && type2 != TYPE_ROCK); ASSUME(type1 != TYPE_GROUND && type2 != TYPE_GROUND); diff --git a/test/battle/ability/sand_rush.c b/test/battle/ability/sand_rush.c index 08dd22ef57ba..9d6ef98274e5 100644 --- a/test/battle/ability/sand_rush.c +++ b/test/battle/ability/sand_rush.c @@ -3,8 +3,8 @@ SINGLE_BATTLE_TEST("Sand Rush prevents damage from sandstorm") { - u32 type1 = gSpeciesInfo[SPECIES_STOUTLAND].types[0]; - u32 type2 = gSpeciesInfo[SPECIES_STOUTLAND].types[1]; + enum Type type1 = GetSpeciesType(SPECIES_STOUTLAND, 0); + enum Type type2 = GetSpeciesType(SPECIES_STOUTLAND, 1); GIVEN { ASSUME(type1 != TYPE_ROCK && type2 != TYPE_ROCK); ASSUME(type1 != TYPE_GROUND && type2 != TYPE_GROUND); diff --git a/test/battle/ability/schooling.c b/test/battle/ability/schooling.c index 19c2b14c8fd8..f4da6a2caf61 100644 --- a/test/battle/ability/schooling.c +++ b/test/battle/ability/schooling.c @@ -8,7 +8,7 @@ SINGLE_BATTLE_TEST("Schooling switches Level 20+ Wishiwashi's form when HP is 25 PARAMETRIZE { level = 20; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_WISHIWASHI_SOLO].baseHP == gSpeciesInfo[SPECIES_WISHIWASHI_SCHOOL].baseHP); + ASSUME(GetSpeciesBaseHP(SPECIES_WISHIWASHI_SOLO) == GetSpeciesBaseHP(SPECIES_WISHIWASHI_SCHOOL)); PLAYER(SPECIES_WISHIWASHI_SOLO) { Level(level); @@ -47,7 +47,7 @@ SINGLE_BATTLE_TEST("Schooling switches Level 20+ Wishiwashi's form when HP is ov PARAMETRIZE { level = 20; overQuarterHP = TRUE; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_WISHIWASHI_SOLO].baseHP == gSpeciesInfo[SPECIES_WISHIWASHI_SCHOOL].baseHP); + ASSUME(GetSpeciesBaseHP(SPECIES_WISHIWASHI_SOLO) == GetSpeciesBaseHP(SPECIES_WISHIWASHI_SCHOOL)); PLAYER(SPECIES_WISHIWASHI_SOLO) { Level(level); @@ -80,7 +80,7 @@ SINGLE_BATTLE_TEST("Schooling switches Level 20+ Wishiwashi's form when HP is he PARAMETRIZE { level = 20; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_WISHIWASHI_SOLO].baseHP == gSpeciesInfo[SPECIES_WISHIWASHI_SCHOOL].baseHP); + ASSUME(GetSpeciesBaseHP(SPECIES_WISHIWASHI_SOLO) == GetSpeciesBaseHP(SPECIES_WISHIWASHI_SCHOOL)); PLAYER(SPECIES_WISHIWASHI_SOLO) { Level(level); diff --git a/test/battle/ability/scrappy.c b/test/battle/ability/scrappy.c index 919ee486b971..045f7dbde9cf 100644 --- a/test/battle/ability/scrappy.c +++ b/test/battle/ability/scrappy.c @@ -1,13 +1,13 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Scrappy prevents intimidate") +SINGLE_BATTLE_TEST("Scrappy doesn't prevent Intimidate (Gen4-7)") { s16 turnOneHit; s16 turnTwoHit; GIVEN { - ASSUME(B_UPDATED_INTIMIDATE >= GEN_8); + WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_7); PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); }; PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); }; OPPONENT(SPECIES_KANGASKHAN) { Ability(ABILITY_SCRAPPY); }; @@ -18,7 +18,35 @@ SINGLE_BATTLE_TEST("Scrappy prevents intimidate") } SCENE { HP_BAR(player, captureDamage: &turnOneHit); ABILITY_POPUP(player, ABILITY_INTIMIDATE); - NONE_OF { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); } + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_SCRAPPY); + MESSAGE("The opposing Kangaskhan's Scrappy prevents stat loss!"); + } + HP_BAR(player, captureDamage: &turnTwoHit); + } THEN { + EXPECT_GT(turnOneHit, turnTwoHit); + } +} + +SINGLE_BATTLE_TEST("Scrappy prevents Intimidate (Gen8+)") +{ + s16 turnOneHit; + s16 turnTwoHit; + + GIVEN { + WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_8); + PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); }; + PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); }; + OPPONENT(SPECIES_KANGASKHAN) { Ability(ABILITY_SCRAPPY); }; + } WHEN { + TURN { MOVE(opponent, MOVE_SCRATCH); } + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_SCRATCH); } + + } SCENE { + HP_BAR(player, captureDamage: &turnOneHit); + ABILITY_POPUP(player, ABILITY_INTIMIDATE); + NONE_OF { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); } ABILITY_POPUP(opponent, ABILITY_SCRAPPY); MESSAGE("The opposing Kangaskhan's Scrappy prevents stat loss!"); HP_BAR(player, captureDamage: &turnTwoHit); diff --git a/test/battle/ability/sharpness.c b/test/battle/ability/sharpness.c index 38ed79f86fc5..f737bab72a55 100644 --- a/test/battle/ability/sharpness.c +++ b/test/battle/ability/sharpness.c @@ -1,10 +1,10 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Sharpness increases the power of slicing moves", s16 damage) +SINGLE_BATTLE_TEST("Sharpness increases the power of slicing moves by 50%", s16 damage) { u32 move; - u16 ability; + enum Ability ability; PARAMETRIZE { move = MOVE_AERIAL_ACE; ability = ABILITY_SHARPNESS; } PARAMETRIZE { move = MOVE_AERIAL_ACE; ability = ABILITY_STEADFAST; } PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_SHARPNESS; } diff --git a/test/battle/ability/sheer_force.c b/test/battle/ability/sheer_force.c index ee3e10d14ed4..0f64fbf90492 100644 --- a/test/battle/ability/sheer_force.c +++ b/test/battle/ability/sheer_force.c @@ -1,7 +1,6 @@ #include "global.h" #include "test/battle.h" - ASSUMPTIONS { ASSUME(MoveIsAffectedBySheerForce(MOVE_ELECTRO_SHOT) == TRUE); @@ -9,7 +8,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Sheer Force doesn't boost Magnitude", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -26,7 +25,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Magnitude", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Eruption", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -43,7 +42,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Eruption", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Water Spout", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -60,14 +59,16 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Water Spout", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Present", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { PLAYER(SPECIES_TAUROS) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, MOVE_PRESENT); } + //Test will fail if present heals because the hp change would be 0 + //so we want a damaging version of present + TURN { MOVE(player, MOVE_PRESENT, WITH_RNG(RNG_PRESENT, 1)); } } SCENE { HP_BAR(opponent, captureDamage: &results[i].damage); } FINALLY { @@ -77,7 +78,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Present", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Psywave", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -94,7 +95,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Psywave", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Round", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -111,7 +112,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Round", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Gyro Ball", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -128,7 +129,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Gyro Ball", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Electro Ball", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -145,7 +146,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Electro Ball", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Dragon Energy", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -162,7 +163,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Dragon Energy", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Belch", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -179,7 +180,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Belch", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Shell Trap", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -196,7 +197,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Shell Trap", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Burn Up", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ZEN_MODE; } GIVEN { @@ -230,7 +231,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Double Shock", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Steel Roller", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -247,7 +248,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Steel Roller", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Synchronoise", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -298,7 +299,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Hyperspace Fury", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Bolt Beak", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -315,7 +316,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Bolt Beak", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Fishious Rend", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -332,7 +333,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Fishious Rend", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Comeuppance", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -349,7 +350,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Comeuppance", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Payback", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -568,7 +569,6 @@ static inline bool32 IsMoveSheerForceBoosted(u32 move) case MOVE_POWDER_SNOW: case MOVE_PSYSHIELD_BASH: case MOVE_PYRO_BALL: - case MOVE_RAPID_SPIN: case MOVE_RELIC_SONG: case MOVE_ROLLING_KICK: case MOVE_SACRED_FIRE: @@ -606,16 +606,18 @@ static inline bool32 IsMoveSheerForceBoosted(u32 move) case MOVE_ELECTRO_SHOT: case MOVE_PSYCHIC_NOISE: return TRUE; + case MOVE_RAPID_SPIN: + return B_SPEED_BUFFING_RAPID_SPIN >= GEN_8; } return FALSE; } -// Test split into four parts that handles ~1/4 of all moves each -DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost 1") +// Tests split by generation +DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen1)") { s16 damage1, damage2; u32 move = 0; - for (u32 j = 1; j < MOVES_COUNT; j += 4) + for (u32 j = MOVE_POUND; j < MOVES_COUNT_GEN1; j++) { if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) PARAMETRIZE { move = j; } @@ -687,19 +689,115 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to HP_BAR(opponentRight, captureDamage: &damage1); } } THEN { - if (IsMoveSheerForceBoosted(move)) + if (IsMoveSheerForceBoosted(move)) { + if (!(damage1 > damage2)) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_GT(damage1, damage2); + } else { + if (damage1 != damage2) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); + EXPECT_EQ(damage2, damage1); + } + } +} + +DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen2)") +{ + s16 damage1, damage2; + u32 move = 0; + for (u32 j = MOVE_SKETCH; j < MOVES_COUNT_GEN2; j++) + { + if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) + PARAMETRIZE { move = j; } + } + GIVEN { + PLAYER(SPECIES_STEELIX) { Ability(ABILITY_SHEER_FORCE); Item(ITEM_BLUK_BERRY); } + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_STEELIX) { Ability(ABILITY_STURDY); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + } WHEN { + if (move == MOVE_ALLURING_VOICE || move == MOVE_BURNING_JEALOUSY) // Alluring Voice requires the target to boost stats to have an effect + TURN { MOVE(opponentRight, MOVE_AGILITY); MOVE(playerRight, MOVE_AGILITY); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_UPPER_HAND) // Upper Hand requires the target to be using a damaging priority move + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); MOVE(playerRight, move, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_COUNTER || move == MOVE_UPPER_HAND) + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); + MOVE(playerRight, MOVE_QUICK_ATTACK, target: opponentLeft); + MOVE(playerLeft, move, target: opponentRight); + MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_MIRROR_COAT || move == MOVE_METAL_BURST) + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_SUCKER_PUNCH || move == MOVE_THUNDERCLAP) + TURN { MOVE(opponentRight, MOVE_SCRATCH, target: playerLeft); MOVE(playerRight, MOVE_SCRATCH, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_DREAM_EATER) + { + TURN { MOVE(playerLeft, MOVE_HYPNOSIS, target: opponentRight); MOVE(opponentLeft, MOVE_HYPNOSIS, target: playerRight); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SNORE) + { + TURN { MOVE(opponentRight, MOVE_HYPNOSIS, target: playerLeft); MOVE(playerRight, MOVE_HYPNOSIS, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SPIT_UP || move == MOVE_LAST_RESORT) + { + TURN { MOVE(playerLeft, MOVE_STOCKPILE); MOVE(opponentLeft, MOVE_STOCKPILE); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } else + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + switch (GetMoveEffect(move)) + { + case EFFECT_TWO_TURNS_ATTACK: + case EFFECT_SEMI_INVULNERABLE: + case EFFECT_SOLAR_BEAM: + case EFFECT_SKY_DROP: + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { ; } + break; + case EFFECT_FUTURE_SIGHT: + TURN { ; } + TURN { ; } + break; + case EFFECT_BIDE: + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + break; + default: + break; + } + } SCENE { + if (GetMoveEffect(move) != EFFECT_FUTURE_SIGHT) + { + HP_BAR(opponentRight, captureDamage: &damage1); + HP_BAR(playerRight, captureDamage: &damage2); + } + else + { + HP_BAR(playerRight, captureDamage: &damage2); + HP_BAR(opponentRight, captureDamage: &damage1); + } + } THEN { + if (IsMoveSheerForceBoosted(move)) { + if (!(damage1 > damage2)) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); + EXPECT_GT(damage1, damage2); + } else { + if (damage1 != damage2) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_EQ(damage2, damage1); + } } } -DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost 2") + +DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen3)") { s16 damage1, damage2; u32 move = 0; - for (u32 j = 2; j < MOVES_COUNT; j += 4) + for (u32 j = MOVE_FAKE_OUT; j < MOVES_COUNT_GEN3; j++) + { if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) PARAMETRIZE { move = j; } + } GIVEN { PLAYER(SPECIES_STEELIX) { Ability(ABILITY_SHEER_FORCE); Item(ITEM_BLUK_BERRY); } PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } @@ -767,19 +865,203 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to HP_BAR(opponentRight, captureDamage: &damage1); } } THEN { - if (IsMoveSheerForceBoosted(move)) + if (IsMoveSheerForceBoosted(move)) { + if (!(damage1 > damage2)) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_GT(damage1, damage2); + } else { + if (damage1 != damage2) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); + EXPECT_EQ(damage2, damage1); + } + } +} + +DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen4)") +{ + s16 damage1, damage2; + u32 move = 0; + for (u32 j = MOVE_ROOST; j < MOVES_COUNT_GEN4; j++) + { + if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) + PARAMETRIZE { move = j; } + } + GIVEN { + PLAYER(SPECIES_STEELIX) { Ability(ABILITY_SHEER_FORCE); Item(ITEM_BLUK_BERRY); } + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_STEELIX) { Ability(ABILITY_STURDY); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + } WHEN { + if (move == MOVE_ALLURING_VOICE || move == MOVE_BURNING_JEALOUSY) // Alluring Voice requires the target to boost stats to have an effect + TURN { MOVE(opponentRight, MOVE_AGILITY); MOVE(playerRight, MOVE_AGILITY); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_UPPER_HAND) // Upper Hand requires the target to be using a damaging priority move + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); MOVE(playerRight, move, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_COUNTER || move == MOVE_UPPER_HAND) + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); + MOVE(playerRight, MOVE_QUICK_ATTACK, target: opponentLeft); + MOVE(playerLeft, move, target: opponentRight); + MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_MIRROR_COAT || move == MOVE_METAL_BURST) + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_SUCKER_PUNCH || move == MOVE_THUNDERCLAP) + TURN { MOVE(opponentRight, MOVE_SCRATCH, target: playerLeft); MOVE(playerRight, MOVE_SCRATCH, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_DREAM_EATER) + { + TURN { MOVE(playerLeft, MOVE_HYPNOSIS, target: opponentRight); MOVE(opponentLeft, MOVE_HYPNOSIS, target: playerRight); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SNORE) + { + TURN { MOVE(opponentRight, MOVE_HYPNOSIS, target: playerLeft); MOVE(playerRight, MOVE_HYPNOSIS, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SPIT_UP || move == MOVE_LAST_RESORT) + { + TURN { MOVE(playerLeft, MOVE_STOCKPILE); MOVE(opponentLeft, MOVE_STOCKPILE); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + switch (GetMoveEffect(move)) + { + case EFFECT_TWO_TURNS_ATTACK: + case EFFECT_SEMI_INVULNERABLE: + case EFFECT_SOLAR_BEAM: + case EFFECT_SKY_DROP: + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { ; } + break; + case EFFECT_FUTURE_SIGHT: + TURN { ; } + TURN { ; } + break; + case EFFECT_BIDE: + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + break; + default: + break; + } + } SCENE { + if (GetMoveEffect(move) != EFFECT_FUTURE_SIGHT) + { + HP_BAR(opponentRight, captureDamage: &damage1); + HP_BAR(playerRight, captureDamage: &damage2); + } + else + { + HP_BAR(playerRight, captureDamage: &damage2); + HP_BAR(opponentRight, captureDamage: &damage1); + } + } THEN { + if (IsMoveSheerForceBoosted(move)) { + if (!(damage1 > damage2)) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); + EXPECT_GT(damage1, damage2); + } else { + if (damage1 != damage2) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); + EXPECT_EQ(damage2, damage1); + } + } +} + +DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen5)") +{ + s16 damage1, damage2; + u32 move = 0; + for (u32 j = MOVE_HONE_CLAWS; j < MOVES_COUNT_GEN5; j++) + { + if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) + PARAMETRIZE { move = j; } + } + GIVEN { + PLAYER(SPECIES_STEELIX) { Ability(ABILITY_SHEER_FORCE); Item(ITEM_BLUK_BERRY); } + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_STEELIX) { Ability(ABILITY_STURDY); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + } WHEN { + if (move == MOVE_ALLURING_VOICE || move == MOVE_BURNING_JEALOUSY) // Alluring Voice requires the target to boost stats to have an effect + TURN { MOVE(opponentRight, MOVE_AGILITY); MOVE(playerRight, MOVE_AGILITY); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_UPPER_HAND) // Upper Hand requires the target to be using a damaging priority move + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); MOVE(playerRight, move, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_COUNTER || move == MOVE_UPPER_HAND) + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); + MOVE(playerRight, MOVE_QUICK_ATTACK, target: opponentLeft); + MOVE(playerLeft, move, target: opponentRight); + MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_MIRROR_COAT || move == MOVE_METAL_BURST) + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_SUCKER_PUNCH || move == MOVE_THUNDERCLAP) + TURN { MOVE(opponentRight, MOVE_SCRATCH, target: playerLeft); MOVE(playerRight, MOVE_SCRATCH, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_DREAM_EATER) + { + TURN { MOVE(playerLeft, MOVE_HYPNOSIS, target: opponentRight); MOVE(opponentLeft, MOVE_HYPNOSIS, target: playerRight); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SNORE) + { + TURN { MOVE(opponentRight, MOVE_HYPNOSIS, target: playerLeft); MOVE(playerRight, MOVE_HYPNOSIS, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SPIT_UP || move == MOVE_LAST_RESORT) + { + TURN { MOVE(playerLeft, MOVE_STOCKPILE); MOVE(opponentLeft, MOVE_STOCKPILE); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } else + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + switch (GetMoveEffect(move)) + { + case EFFECT_TWO_TURNS_ATTACK: + case EFFECT_SEMI_INVULNERABLE: + case EFFECT_SOLAR_BEAM: + case EFFECT_SKY_DROP: + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { ; } + break; + case EFFECT_FUTURE_SIGHT: + TURN { ; } + TURN { ; } + break; + case EFFECT_BIDE: + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + break; + default: + break; + } + } SCENE { + if (GetMoveEffect(move) != EFFECT_FUTURE_SIGHT) + { + HP_BAR(opponentRight, captureDamage: &damage1); + HP_BAR(playerRight, captureDamage: &damage2); + } + else + { + HP_BAR(playerRight, captureDamage: &damage2); + HP_BAR(opponentRight, captureDamage: &damage1); + } + } THEN { + if (IsMoveSheerForceBoosted(move)) { + if (!(damage1 > damage2)) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); + EXPECT_GT(damage1, damage2); + } else { + if (damage1 != damage2) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_EQ(damage2, damage1); + } } } -DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost 3") + +DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen6)") { s16 damage1, damage2; u32 move = 0; - for (u32 j = 3; j < MOVES_COUNT; j += 4) + for (u32 j = MOVE_FLYING_PRESS; j < MOVES_COUNT_GEN6; j++) + { if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) PARAMETRIZE { move = j; } + } GIVEN { PLAYER(SPECIES_STEELIX) { Ability(ABILITY_SHEER_FORCE); Item(ITEM_BLUK_BERRY); } PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } @@ -847,17 +1129,111 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to HP_BAR(opponentRight, captureDamage: &damage1); } } THEN { - if (IsMoveSheerForceBoosted(move)) + if (IsMoveSheerForceBoosted(move)) { + if (!(damage1 > damage2)) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_GT(damage1, damage2); + } else { + if (damage1 != damage2) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); + EXPECT_EQ(damage2, damage1); + } + } +} + +DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen7)") +{ + s16 damage1, damage2; + u32 move = 0; + for (u32 j = MOVE_SHORE_UP; j < MOVES_COUNT_GEN7; j++) + { + if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) + PARAMETRIZE { move = j; } + } + GIVEN { + PLAYER(SPECIES_STEELIX) { Ability(ABILITY_SHEER_FORCE); Item(ITEM_BLUK_BERRY); } + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_STEELIX) { Ability(ABILITY_STURDY); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + } WHEN { + if (move == MOVE_ALLURING_VOICE || move == MOVE_BURNING_JEALOUSY) // Alluring Voice requires the target to boost stats to have an effect + TURN { MOVE(opponentRight, MOVE_AGILITY); MOVE(playerRight, MOVE_AGILITY); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_UPPER_HAND) // Upper Hand requires the target to be using a damaging priority move + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); MOVE(playerRight, move, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_COUNTER || move == MOVE_UPPER_HAND) + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); + MOVE(playerRight, MOVE_QUICK_ATTACK, target: opponentLeft); + MOVE(playerLeft, move, target: opponentRight); + MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_MIRROR_COAT || move == MOVE_METAL_BURST) + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_SUCKER_PUNCH || move == MOVE_THUNDERCLAP) + TURN { MOVE(opponentRight, MOVE_SCRATCH, target: playerLeft); MOVE(playerRight, MOVE_SCRATCH, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_DREAM_EATER) + { + TURN { MOVE(playerLeft, MOVE_HYPNOSIS, target: opponentRight); MOVE(opponentLeft, MOVE_HYPNOSIS, target: playerRight); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SNORE) + { + TURN { MOVE(opponentRight, MOVE_HYPNOSIS, target: playerLeft); MOVE(playerRight, MOVE_HYPNOSIS, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SPIT_UP || move == MOVE_LAST_RESORT) + { + TURN { MOVE(playerLeft, MOVE_STOCKPILE); MOVE(opponentLeft, MOVE_STOCKPILE); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } else + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + switch (GetMoveEffect(move)) + { + case EFFECT_TWO_TURNS_ATTACK: + case EFFECT_SEMI_INVULNERABLE: + case EFFECT_SOLAR_BEAM: + case EFFECT_SKY_DROP: + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { ; } + break; + case EFFECT_FUTURE_SIGHT: + TURN { ; } + TURN { ; } + break; + case EFFECT_BIDE: + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + break; + default: + break; + } + } SCENE { + if (GetMoveEffect(move) != EFFECT_FUTURE_SIGHT) + { + HP_BAR(opponentRight, captureDamage: &damage1); + HP_BAR(playerRight, captureDamage: &damage2); + } + else + { + HP_BAR(playerRight, captureDamage: &damage2); + HP_BAR(opponentRight, captureDamage: &damage1); + } + } THEN { + if (IsMoveSheerForceBoosted(move)) { + if (!(damage1 > damage2)) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); + EXPECT_GT(damage1, damage2); + } else { + if (damage1 != damage2) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_EQ(damage2, damage1); + } } } -DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost 4") + +DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen8)") { s16 damage1, damage2; u32 move = 0; - for (u32 j = 4; j < MOVES_COUNT; j += 4) + for (u32 j = MOVE_DYNAMAX_CANNON; j < MOVES_COUNT_GEN8; j++) { if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) PARAMETRIZE { move = j; } @@ -929,9 +1305,120 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to HP_BAR(opponentRight, captureDamage: &damage1); } } THEN { - if (IsMoveSheerForceBoosted(move)) + if (IsMoveSheerForceBoosted(move)) { + if (!(damage1 > damage2)) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_GT(damage1, damage2); + } else { + if (damage1 != damage2) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); + EXPECT_EQ(damage2, damage1); + } + } +} + +// Last test should always go up to MOVES_COUNT to catch users moves +DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen9)") +{ + s16 damage1, damage2; + u32 move = 0; + for (u32 j = MOVE_TERA_BLAST; j < MOVES_COUNT; j++) + { + if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) + PARAMETRIZE { move = j; } + } + GIVEN { + PLAYER(SPECIES_STEELIX) { Ability(ABILITY_SHEER_FORCE); Item(ITEM_BLUK_BERRY); } + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_STEELIX) { Ability(ABILITY_STURDY); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + } WHEN { + if (move == MOVE_ALLURING_VOICE || move == MOVE_BURNING_JEALOUSY) // Alluring Voice requires the target to boost stats to have an effect + TURN { MOVE(opponentRight, MOVE_AGILITY); MOVE(playerRight, MOVE_AGILITY); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_UPPER_HAND) // Upper Hand requires the target to be using a damaging priority move + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); MOVE(playerRight, move, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_COUNTER || move == MOVE_UPPER_HAND) + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); + MOVE(playerRight, MOVE_QUICK_ATTACK, target: opponentLeft); + MOVE(playerLeft, move, target: opponentRight); + MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_MIRROR_COAT || move == MOVE_METAL_BURST) + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_SUCKER_PUNCH || move == MOVE_THUNDERCLAP) + TURN { MOVE(opponentRight, MOVE_SCRATCH, target: playerLeft); MOVE(playerRight, MOVE_SCRATCH, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_DREAM_EATER) + { + TURN { MOVE(playerLeft, MOVE_HYPNOSIS, target: opponentRight); MOVE(opponentLeft, MOVE_HYPNOSIS, target: playerRight); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SNORE) + { + TURN { MOVE(opponentRight, MOVE_HYPNOSIS, target: playerLeft); MOVE(playerRight, MOVE_HYPNOSIS, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SPIT_UP || move == MOVE_LAST_RESORT) + { + TURN { MOVE(playerLeft, MOVE_STOCKPILE); MOVE(opponentLeft, MOVE_STOCKPILE); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + switch (GetMoveEffect(move)) + { + case EFFECT_TWO_TURNS_ATTACK: + case EFFECT_SEMI_INVULNERABLE: + case EFFECT_SOLAR_BEAM: + case EFFECT_SKY_DROP: + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { ; } + break; + case EFFECT_FUTURE_SIGHT: + TURN { ; } + TURN { ; } + break; + case EFFECT_BIDE: + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + break; + default: + break; + } + } SCENE { + if (GetMoveEffect(move) != EFFECT_FUTURE_SIGHT) + { + HP_BAR(opponentRight, captureDamage: &damage1); + HP_BAR(playerRight, captureDamage: &damage2); + } else + { + HP_BAR(playerRight, captureDamage: &damage2); + HP_BAR(opponentRight, captureDamage: &damage1); + } + } THEN { + if (IsMoveSheerForceBoosted(move)) { + if (!(damage1 > damage2)) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); + EXPECT_GT(damage1, damage2); + } else { + if (damage1 != damage2) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_EQ(damage2, damage1); + } + } +} + +AI_SINGLE_BATTLE_TEST("AI sees Sheer Force skips additional effects") +{ + u16 ability, expectedMove, move; + + PARAMETRIZE { ability = ABILITY_ROUGH_SKIN; move = MOVE_KARATE_CHOP; expectedMove = MOVE_POWER_UP_PUNCH; } + PARAMETRIZE { ability = ABILITY_ROUGH_SKIN; move = MOVE_BRICK_BREAK; expectedMove = MOVE_POWER_UP_PUNCH; } + PARAMETRIZE { ability = ABILITY_SHEER_FORCE; move = MOVE_BRICK_BREAK; expectedMove = MOVE_BRICK_BREAK; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_DRUDDIGON) { Ability(ability); Moves(MOVE_POWER_UP_PUNCH, move); } + } WHEN { + TURN { EXPECT_MOVE(opponent, expectedMove); } } } diff --git a/test/battle/ability/shield_dust.c b/test/battle/ability/shield_dust.c index da6bbf87df92..2fc4f51d5c30 100644 --- a/test/battle/ability/shield_dust.c +++ b/test/battle/ability/shield_dust.c @@ -36,7 +36,7 @@ SINGLE_BATTLE_TEST("Shield Dust blocks secondary effects") MESSAGE("The opposing Vivillon was prevented from healing!"); } } THEN { // Can't find good way to test trapping - EXPECT(!(opponent->status2 & STATUS2_ESCAPE_PREVENTION)); + EXPECT(!opponent->volatiles.escapePrevention); } } @@ -78,8 +78,8 @@ SINGLE_BATTLE_TEST("Shield Dust does not block primary effects") } } THEN { // Can't find good way to test trapping if (move == MOVE_JAW_LOCK) { - EXPECT(opponent->status2 & STATUS2_ESCAPE_PREVENTION); - EXPECT(player->status2 & STATUS2_ESCAPE_PREVENTION); + EXPECT(opponent->volatiles.escapePrevention); + EXPECT(player->volatiles.escapePrevention); } } } @@ -88,12 +88,12 @@ SINGLE_BATTLE_TEST("Shield Dust does not block self-targeting effects, primary o { u16 move; PARAMETRIZE { move = MOVE_POWER_UP_PUNCH; } - PARAMETRIZE { move = MOVE_RAPID_SPIN; } + PARAMETRIZE { move = MOVE_FLAME_CHARGE; } PARAMETRIZE { move = MOVE_LEAF_STORM; } PARAMETRIZE { move = MOVE_METEOR_ASSAULT; } GIVEN { - ASSUME(GetMoveEffect(MOVE_RAPID_SPIN) == EFFECT_RAPID_SPIN); + ASSUME(MoveHasAdditionalEffectSelf(MOVE_FLAME_CHARGE, MOVE_EFFECT_SPD_PLUS_1) == TRUE); ASSUME(MoveHasAdditionalEffectSelf(MOVE_POWER_UP_PUNCH, MOVE_EFFECT_ATK_PLUS_1) == TRUE); ASSUME(MoveHasAdditionalEffectSelf(MOVE_LEAF_STORM, MOVE_EFFECT_SP_ATK_MINUS_2) == TRUE); ASSUME(MoveHasAdditionalEffectSelf(MOVE_METEOR_ASSAULT, MOVE_EFFECT_RECHARGE) == TRUE); @@ -110,7 +110,7 @@ SINGLE_BATTLE_TEST("Shield Dust does not block self-targeting effects, primary o switch (move) { case MOVE_POWER_UP_PUNCH: - case MOVE_RAPID_SPIN: + case MOVE_FLAME_CHARGE: case MOVE_LEAF_STORM: ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); break; @@ -188,3 +188,31 @@ SINGLE_BATTLE_TEST("Shield Dust does not prevent ability stat changes") MESSAGE("Vivillon's Speed fell!"); } } + +AI_SINGLE_BATTLE_TEST("AI will score secondary effects against shield dust correctly") +{ + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + GIVEN { + PLAYER(SPECIES_DUSTOX){ Ability(ABILITY_SHIELD_DUST); Moves(MOVE_GUST); } + OPPONENT(SPECIES_SUNFLORA){ Ability(ABILITY_EARLY_BIRD); Moves(MOVE_MYSTICAL_FIRE, MOVE_FIERY_DANCE); } + } WHEN { + TURN { + MOVE(player, MOVE_GUST); + EXPECT_MOVE(opponent, MOVE_FIERY_DANCE); + } + } +} + +AI_SINGLE_BATTLE_TEST("AI will score secondary effects against shield dust correctly when it has Mold Breaker") +{ + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + GIVEN { + PLAYER(SPECIES_DUSTOX){ Ability(ABILITY_SHIELD_DUST); Moves(MOVE_GUST); } + OPPONENT(SPECIES_SUNFLORA){ Ability(ABILITY_MOLD_BREAKER); Moves(MOVE_MYSTICAL_FIRE, MOVE_FIERY_DANCE); } + } WHEN { + TURN { + MOVE(player, MOVE_GUST); + EXPECT_MOVE(opponent, MOVE_MYSTICAL_FIRE); + } + } +} diff --git a/test/battle/ability/shields_down.c b/test/battle/ability/shields_down.c index f9def2991dbd..554e67b0d844 100644 --- a/test/battle/ability/shields_down.c +++ b/test/battle/ability/shields_down.c @@ -1,28 +1,30 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Minior Meteor transforms into Minior Core on switch-in if it has 1/2 or less health") +SINGLE_BATTLE_TEST("Minior Core doesn't transform into Minior Meteor on switch-in if it has 1/2 or less health") { GIVEN { PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET) { HP(1); } - OPPONENT(SPECIES_MINIOR_METEOR) { Ability(ABILITY_SHIELDS_DOWN); HP(1); } + OPPONENT(SPECIES_MINIOR_CORE) { Ability(ABILITY_SHIELDS_DOWN); HP(50); MaxHP(100); } } WHEN { TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); } } SCENE { - ABILITY_POPUP(opponent, ABILITY_SHIELDS_DOWN); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, opponent); + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_SHIELDS_DOWN); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, opponent); + } } THEN { EXPECT_EQ(opponent->species, SPECIES_MINIOR_CORE); } } -SINGLE_BATTLE_TEST("Minior Core transforms into Minior Meteor on switch-in if it more then 1/2 health") +SINGLE_BATTLE_TEST("Minior Core transforms into Minior Meteor on switch-in if it has more than 1/2 health") { GIVEN { PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET) { HP(1); } - OPPONENT(SPECIES_MINIOR_CORE) { Ability(ABILITY_SHIELDS_DOWN); } + OPPONENT(SPECIES_MINIOR_CORE) { Ability(ABILITY_SHIELDS_DOWN); HP(51); MaxHP(101); } } WHEN { TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); } } SCENE { @@ -32,3 +34,44 @@ SINGLE_BATTLE_TEST("Minior Core transforms into Minior Meteor on switch-in if it EXPECT_EQ(opponent->species, SPECIES_MINIOR_METEOR); } } + +SINGLE_BATTLE_TEST("Minior Core transforms into Minior Meteor on battle start if it has more than 1/2 health") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_MINIOR_CORE) { Ability(ABILITY_SHIELDS_DOWN); HP(51); MaxHP(101); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_SHIELDS_DOWN); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->species, SPECIES_MINIOR_METEOR); + } +} + +SINGLE_BATTLE_TEST("Shields Down protects Minior Meteor from status conditions") +{ + u32 species, hp; + PARAMETRIZE { species = SPECIES_MINIOR_METEOR; hp = 300; } + PARAMETRIZE { species = SPECIES_MINIOR_CORE; hp = 100; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_WILL_O_WISP) == MOVE_EFFECT_BURN); + PLAYER(SPECIES_WYNAUT); + OPPONENT(species) { Ability(ABILITY_SHIELDS_DOWN); HP(hp); MaxHP(300); } + } WHEN { + TURN { MOVE(player, MOVE_WILL_O_WISP); } + } SCENE { + if (species == SPECIES_MINIOR_METEOR) + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_WILL_O_WISP, player); + else + ANIMATION(ANIM_TYPE_MOVE, MOVE_WILL_O_WISP, player); + } THEN { + if (species == SPECIES_MINIOR_METEOR) + EXPECT_EQ(opponent->status1, STATUS1_NONE); + else + EXPECT(opponent->status1 & STATUS1_BURN); + } +} diff --git a/test/battle/ability/slush_rush.c b/test/battle/ability/slush_rush.c index d7508c2cb4d0..76509db019be 100644 --- a/test/battle/ability/slush_rush.c +++ b/test/battle/ability/slush_rush.c @@ -52,8 +52,9 @@ SINGLE_BATTLE_TEST("Slush Rush doesn't double speed if Cloud Nine/Air Lock is on SINGLE_BATTLE_TEST("Slush Rush doesn't prevent non-Ice types from taking damage in Hail") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ICE); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ICE); + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_CETITAN) { Ability(ABILITY_SLUSH_RUSH); } } WHEN { diff --git a/test/battle/ability/snow_warning.c b/test/battle/ability/snow_warning.c index 17f18814b884..bffee14e4972 100644 --- a/test/battle/ability/snow_warning.c +++ b/test/battle/ability/snow_warning.c @@ -1,24 +1,30 @@ #include "global.h" #include "test/battle.h" -#if B_SNOW_WARNING < GEN_9 -SINGLE_BATTLE_TEST("Snow Warning summons hail") -#elif B_SNOW_WARNING >= GEN_9 -SINGLE_BATTLE_TEST("Snow Warning summons snow") -#endif +SINGLE_BATTLE_TEST("Snow Warning summons hail (Gen4-8)") { GIVEN { + WITH_CONFIG(CONFIG_SNOW_WARNING, GEN_8); PLAYER(SPECIES_ABOMASNOW) { Ability(ABILITY_SNOW_WARNING); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN {} } SCENE { - #if B_SNOW_WARNING < GEN_9 MESSAGE("It started to hail!"); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HAIL_CONTINUES); - #elif B_SNOW_WARNING >= GEN_9 + } +} + +SINGLE_BATTLE_TEST("Snow Warning summons snow (Gen9+)") +{ + GIVEN { + WITH_CONFIG(CONFIG_SNOW_WARNING, GEN_9); + PLAYER(SPECIES_ABOMASNOW) { Ability(ABILITY_SNOW_WARNING); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN {} + } SCENE { MESSAGE("It started to snow!"); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SNOW_CONTINUES); - #endif } } diff --git a/test/battle/ability/solid_rock.c b/test/battle/ability/solid_rock.c new file mode 100644 index 000000000000..d25fca625900 --- /dev/null +++ b/test/battle/ability/solid_rock.c @@ -0,0 +1,25 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Solid Rock reduces damage to Super Effective moves by 0.75", s16 damage) +{ + enum Ability ability; + PARAMETRIZE { ability = ABILITY_STURDY; } + PARAMETRIZE { ability = ABILITY_SOLID_ROCK; } + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_CARRACOSTA].types[0] == TYPE_WATER); + ASSUME(gSpeciesInfo[SPECIES_CARRACOSTA].types[1] == TYPE_ROCK); + ASSUME(GetMoveType(MOVE_CLOSE_COMBAT) == TYPE_FIGHTING); + ASSUME(gTypeEffectivenessTable[TYPE_FIGHTING][TYPE_ROCK] > UQ_4_12(1.0)); + ASSUME(gTypeEffectivenessTable[TYPE_FIGHTING][TYPE_WATER] == UQ_4_12(1.0)); + PLAYER(SPECIES_CARRACOSTA) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_CLOSE_COMBAT); } + } SCENE { + HP_BAR(player, captureDamage: &results[i].damage); + MESSAGE("It's super effective!"); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(0.75), results[1].damage); + } +} diff --git a/test/battle/ability/soul_heart.c b/test/battle/ability/soul_heart.c index 393fbb6c203a..6f20acb53b0c 100644 --- a/test/battle/ability/soul_heart.c +++ b/test/battle/ability/soul_heart.c @@ -1,4 +1,23 @@ #include "global.h" #include "test/battle.h" +SINGLE_BATTLE_TEST("Soul Heart boosts Sp. Atk after opponent uses Memento") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_MEMENTO) == EFFECT_MEMENTO); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_MAGEARNA) { Ability(ABILITY_SOUL_HEART); } + } WHEN { + TURN { MOVE(player, MOVE_MEMENTO); SEND_OUT(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Wobbuffet fainted!"); + ABILITY_POPUP(opponent, ABILITY_SOUL_HEART); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_SPATK], DEFAULT_STAT_STAGE - 1); // -2 from Memento, +1 from Soul Heart + } +} + TO_DO_BATTLE_TEST("TODO: Write Soul Heart (Ability) test titles") diff --git a/test/battle/ability/soundproof.c b/test/battle/ability/soundproof.c index a7135942d159..6af6231cc2c8 100644 --- a/test/battle/ability/soundproof.c +++ b/test/battle/ability/soundproof.c @@ -1,4 +1,20 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Soundproof (Ability) test titles") +SINGLE_BATTLE_TEST("Soundproof makes sound moves fail against the ability user") +{ + GIVEN { + ASSUME(IsSoundMove(MOVE_BOOMBURST)); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_EXPLOUD) { Ability(ABILITY_SOUNDPROOF); } + } WHEN { + TURN { MOVE(player, MOVE_BOOMBURST); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_SOUNDPROOF); + MESSAGE("The opposing Exploud's Soundproof blocks Boomburst!"); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BOOMBURST, player); + HP_BAR(opponent); + } + } +} diff --git a/test/battle/ability/stalwart.c b/test/battle/ability/stalwart.c index 22debe74cd99..3cca8e58add3 100644 --- a/test/battle/ability/stalwart.c +++ b/test/battle/ability/stalwart.c @@ -20,10 +20,14 @@ DOUBLE_BATTLE_TEST("Stalwart ignores redirection from Follow-Me") DOUBLE_BATTLE_TEST("Stalwart stops Lightning Rod and Storm Drain from redirecting moves") { - u32 ability, species; - PARAMETRIZE { ability = ABILITY_STORM_DRAIN; species = SPECIES_LUMINEON; } - PARAMETRIZE { ability = ABILITY_LIGHTNING_ROD; species = SPECIES_RAICHU; } + enum Ability ability; + u32 species, config; + PARAMETRIZE { ability = ABILITY_STORM_DRAIN; species = SPECIES_LUMINEON; config = GEN_4; } + PARAMETRIZE { ability = ABILITY_STORM_DRAIN; species = SPECIES_LUMINEON; config = GEN_5; } + PARAMETRIZE { ability = ABILITY_LIGHTNING_ROD; species = SPECIES_RAICHU; config = GEN_4; } + PARAMETRIZE { ability = ABILITY_LIGHTNING_ROD; species = SPECIES_RAICHU; config = GEN_5; } GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, config); ASSUME(GetMoveType(MOVE_SPARK) == TYPE_ELECTRIC); ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_STALWART); } @@ -38,15 +42,14 @@ DOUBLE_BATTLE_TEST("Stalwart stops Lightning Rod and Storm Drain from redirectin MOVE(playerLeft, MOVE_WATER_GUN, target: opponentRight); } } SCENE { - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5) { - HP_BAR(opponentRight); + HP_BAR(opponentRight); + if (config >= GEN_5) { NONE_OF { ABILITY_POPUP(opponentLeft, ability); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); MESSAGE("The opposing Raichu's Sp. Atk rose!"); } } else { - HP_BAR(opponentRight); NONE_OF { HP_BAR(opponentLeft); } diff --git a/test/battle/ability/stamina.c b/test/battle/ability/stamina.c index e9823b7068c1..39113fd15ad3 100644 --- a/test/battle/ability/stamina.c +++ b/test/battle/ability/stamina.c @@ -49,7 +49,7 @@ SINGLE_BATTLE_TEST("Stamina raises Defense by 1 when hit by a move") DOUBLE_BATTLE_TEST("Stamina activates correctly for every battler with the ability when hit by a multi target move") { - u16 abilityLeft, abilityRight; + enum Ability abilityLeft, abilityRight; PARAMETRIZE {abilityLeft = ABILITY_NONE, abilityRight = ABILITY_STAMINA; } PARAMETRIZE {abilityLeft = ABILITY_STAMINA, abilityRight = ABILITY_NONE; } diff --git a/test/battle/ability/steadfast.c b/test/battle/ability/steadfast.c index fc35e94278e1..2d6fb5d90166 100644 --- a/test/battle/ability/steadfast.c +++ b/test/battle/ability/steadfast.c @@ -1,4 +1,56 @@ #include "global.h" #include "test/battle.h" +SINGLE_BATTLE_TEST("Steadfast boosts Speed when the user attempts to move but is flinched") +{ + GIVEN { + ASSUME(MoveHasAdditionalEffectWithChance(MOVE_FAKE_OUT, MOVE_EFFECT_FLINCH, 100)); + PLAYER(SPECIES_LUCARIO) { Ability(ABILITY_STEADFAST); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_FAKE_OUT); MOVE(player, MOVE_CELEBRATE); } + } SCENE { + ABILITY_POPUP(player, ABILITY_STEADFAST); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Steadfast doesn't activate if the user wasn't flinched") +{ + GIVEN { + ASSUME(MoveHasAdditionalEffectWithChance(MOVE_FAKE_OUT, MOVE_EFFECT_FLINCH, 100)); + ASSUME(GetItemHoldEffect(ITEM_COVERT_CLOAK) == HOLD_EFFECT_COVERT_CLOAK); + PLAYER(SPECIES_LUCARIO) { Ability(ABILITY_STEADFAST); Item(ITEM_COVERT_CLOAK); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_FAKE_OUT); MOVE(player, MOVE_CELEBRATE); } + } SCENE { + NOT ABILITY_POPUP(player, ABILITY_STEADFAST); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); + } +} + +DOUBLE_BATTLE_TEST("Steadfast doesn't activate if the user has already moved") +{ + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_BITE, MOVE_EFFECT_FLINCH)); + ASSUME(GetMoveEffect(MOVE_INSTRUCT) == EFFECT_INSTRUCT); + PLAYER(SPECIES_LUCARIO) { Ability(ABILITY_STEADFAST); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SWORDS_DANCE); MOVE(opponentLeft, MOVE_BITE, target: playerLeft); MOVE(playerRight, MOVE_INSTRUCT, target: playerLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, playerLeft); + NOT ABILITY_POPUP(playerLeft, ABILITY_STEADFAST); + } THEN { + EXPECT_EQ(playerLeft->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); + } +} + TO_DO_BATTLE_TEST("TODO: Write Steadfast (Ability) test titles") diff --git a/test/battle/ability/steelworker.c b/test/battle/ability/steelworker.c index eaf36165f6dc..b4fa720cdcf5 100644 --- a/test/battle/ability/steelworker.c +++ b/test/battle/ability/steelworker.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Steelworker increases Steel-type move damage", s16 damage) { u32 move; - u16 ability; + enum Ability ability; PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_KLUTZ; } PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_STEELWORKER; } diff --git a/test/battle/ability/sticky_hold.c b/test/battle/ability/sticky_hold.c index 708c691c801b..d6aee1ee5123 100644 --- a/test/battle/ability/sticky_hold.c +++ b/test/battle/ability/sticky_hold.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Sticky Hold prevents item theft") { GIVEN { - ASSUME(MoveHasAdditionalEffect(MOVE_THIEF, MOVE_EFFECT_STEAL_ITEM)); + ASSUME(GetMoveEffect(MOVE_THIEF) == EFFECT_STEAL_ITEM); PLAYER(SPECIES_URSALUNA) { Item(ITEM_NONE); } OPPONENT(SPECIES_GASTRODON) { Ability(ABILITY_STICKY_HOLD); Item(ITEM_LIFE_ORB); } } WHEN { diff --git a/test/battle/ability/storm_drain.c b/test/battle/ability/storm_drain.c index 962317b10858..c1cf5c890b71 100644 --- a/test/battle/ability/storm_drain.c +++ b/test/battle/ability/storm_drain.c @@ -1,16 +1,20 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Storm Drain absorbs Water-type moves and increases the Sp. Attack [Gen5+]") +SINGLE_BATTLE_TEST("Storm Drain absorbs Water-type moves and increases the Sp. Attack (Gen5+)") { + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, config); ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GASTRODON_EAST) { Ability(ABILITY_STORM_DRAIN); } } WHEN { TURN { MOVE(player, MOVE_WATER_GUN); MOVE(opponent, MOVE_CELEBRATE); } } SCENE { - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5) { + if (config >= GEN_5) { NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, player); HP_BAR(opponent); @@ -33,7 +37,11 @@ SINGLE_BATTLE_TEST("Storm Drain absorbs Water-type moves and increases the Sp. A DOUBLE_BATTLE_TEST("Storm Drain forces single-target Water-type moves to target the PokΓ©mon with this Ability.") { + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, config); ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -47,7 +55,7 @@ DOUBLE_BATTLE_TEST("Storm Drain forces single-target Water-type moves to target MOVE(opponentRight, MOVE_CELEBRATE); } } SCENE { - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5) { + if (config >= GEN_5) { NONE_OF { HP_BAR(opponentLeft); HP_BAR(opponentRight); diff --git a/test/battle/ability/sturdy.c b/test/battle/ability/sturdy.c index 5ba7e16ea8e8..7087de3a020f 100644 --- a/test/battle/ability/sturdy.c +++ b/test/battle/ability/sturdy.c @@ -18,18 +18,37 @@ SINGLE_BATTLE_TEST("Sturdy prevents OHKO moves") } } -SINGLE_BATTLE_TEST("Sturdy prevents OHKOs") +SINGLE_BATTLE_TEST("Sturdy prevents OHKOs (Gen5+)") { + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { + WITH_CONFIG(CONFIG_STURDY, config); PLAYER(SPECIES_GEODUDE) { Ability(ABILITY_STURDY); MaxHP(100); HP(100); } + PLAYER(SPECIES_GEODUDE); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(opponent, MOVE_SEISMIC_TOSS); } + TURN { + MOVE(opponent, MOVE_SEISMIC_TOSS); + if (config < GEN_5) { + SEND_OUT(player, 1); + } + } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_SEISMIC_TOSS, opponent); - HP_BAR(player, hp: 1); - ABILITY_POPUP(player, ABILITY_STURDY); - MESSAGE("Geodude endured the hit using Sturdy!"); + if (config >= GEN_5) { + HP_BAR(player, hp: 1); + ABILITY_POPUP(player, ABILITY_STURDY); + MESSAGE("Geodude endured the hit using Sturdy!"); + } else { + HP_BAR(player, hp: 0); + NONE_OF { + ABILITY_POPUP(player, ABILITY_STURDY); + MESSAGE("Geodude endured the hit using Sturdy!"); + } + SEND_IN_MESSAGE("Geodude"); + } } } diff --git a/test/battle/ability/super_luck.c b/test/battle/ability/super_luck.c index faaf366747db..16dfc081a98e 100644 --- a/test/battle/ability/super_luck.c +++ b/test/battle/ability/super_luck.c @@ -10,8 +10,8 @@ SINGLE_BATTLE_TEST("Super Luck increases the critical hit ratio by 1 stage") PARAMETRIZE { genConfig = j; passes = 1; trials = 8; } // 12.5% PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - ASSUME(gSpeciesInfo[SPECIES_TOGEPI].baseSpeed == 20); - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + ASSUME(GetSpeciesBaseSpeed(SPECIES_TOGEPI) == 20); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); PLAYER(SPECIES_TOGEPI) { Ability(ABILITY_SUPER_LUCK); }; OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/supersweet_syrup.c b/test/battle/ability/supersweet_syrup.c index 4ff8c462ba7a..cd819eda723b 100644 --- a/test/battle/ability/supersweet_syrup.c +++ b/test/battle/ability/supersweet_syrup.c @@ -56,11 +56,21 @@ SINGLE_BATTLE_TEST("Supersweet Syrup can not further lower opponents evasion if TURN { MOVE(opponent, MOVE_SWEET_SCENT); } TURN { MOVE(opponent, MOVE_SWEET_SCENT); } TURN { MOVE(opponent, MOVE_SWEET_SCENT); } + if (GetMoveEffect(MOVE_SWEET_SCENT) == EFFECT_EVASION_DOWN) { + TURN { MOVE(opponent, MOVE_SWEET_SCENT); } + TURN { MOVE(opponent, MOVE_SWEET_SCENT); } + TURN { MOVE(opponent, MOVE_SWEET_SCENT); } + } TURN { SWITCH(opponent, 1); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_SWEET_SCENT, opponent); ANIMATION(ANIM_TYPE_MOVE, MOVE_SWEET_SCENT, opponent); ANIMATION(ANIM_TYPE_MOVE, MOVE_SWEET_SCENT, opponent); + if (GetMoveEffect(MOVE_SWEET_SCENT) == EFFECT_EVASION_DOWN) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWEET_SCENT, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWEET_SCENT, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWEET_SCENT, opponent); + } ABILITY_POPUP(opponent, ABILITY_SUPERSWEET_SYRUP); NONE_OF { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); diff --git a/test/battle/ability/swarm.c b/test/battle/ability/swarm.c index a70c1ffb5544..ce94ae22e21a 100644 --- a/test/battle/ability/swarm.c +++ b/test/battle/ability/swarm.c @@ -10,9 +10,9 @@ SINGLE_BATTLE_TEST("Swarm boosts Bug-type moves in a pinch", s16 damage) ASSUME(GetMoveType(MOVE_BUG_BITE) == TYPE_BUG); ASSUME(GetMovePower(MOVE_BUG_BITE) == 60); ASSUME(GetMoveCategory(MOVE_BUG_BITE) == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gSpeciesInfo[SPECIES_LEDYBA].types[0] == TYPE_BUG); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_LEDYBA, 0) == TYPE_BUG); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) == TYPE_PSYCHIC); PLAYER(SPECIES_LEDYBA) { Ability(ABILITY_SWARM); MaxHP(99); HP(hp); Attack(45); } OPPONENT(SPECIES_WOBBUFFET) { Defense(121); } } WHEN { diff --git a/test/battle/ability/sweet_veil.c b/test/battle/ability/sweet_veil.c index 56431055c62d..956058620382 100644 --- a/test/battle/ability/sweet_veil.c +++ b/test/battle/ability/sweet_veil.c @@ -17,7 +17,7 @@ DOUBLE_BATTLE_TEST("Sweet Veil prevents Sleep on partner - right target") } WHEN { TURN { MOVE(playerLeft, MOVE_HYPNOSIS, target: opponentRight); } } SCENE { - MESSAGE("Wobbuffet used Hypnosis!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPNOSIS, playerLeft); ABILITY_POPUP(opponentLeft, ABILITY_SWEET_VEIL); NOT STATUS_ICON(opponentRight, sleep: TRUE); } @@ -33,7 +33,27 @@ DOUBLE_BATTLE_TEST("Sweet Veil prevents Sleep on partner - left target") } WHEN { TURN { MOVE(playerLeft, MOVE_HYPNOSIS, target: opponentLeft); } } SCENE { - MESSAGE("Wobbuffet used Hypnosis!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPNOSIS, playerLeft); + ABILITY_POPUP(opponentRight, ABILITY_SWEET_VEIL); + NOT STATUS_ICON(opponentLeft, sleep: TRUE); + } +} + +DOUBLE_BATTLE_TEST("Sweet Veil prevents Yawn activation") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_BOUNSWEET) { Ability(ABILITY_SWEET_VEIL); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_YAWN, target: opponentLeft); } + TURN { SWITCH(opponentRight, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_YAWN, playerLeft); + + // Turn 2 ABILITY_POPUP(opponentRight, ABILITY_SWEET_VEIL); NOT STATUS_ICON(opponentLeft, sleep: TRUE); } diff --git a/test/battle/ability/sword_of_ruin.c b/test/battle/ability/sword_of_ruin.c index 395cd3fd68e5..a891f7d5a711 100644 --- a/test/battle/ability/sword_of_ruin.c +++ b/test/battle/ability/sword_of_ruin.c @@ -73,3 +73,118 @@ SINGLE_BATTLE_TEST("Sword of Ruin's message displays correctly after all battler MESSAGE("The opposing Chien-Pao's Sword of Ruin weakened the Defense of all surrounding PokΓ©mon!"); } } + +DOUBLE_BATTLE_TEST("Sword of Ruin increases damage taken by special moves in Wonder Room", s16 damage) +{ + bool32 useWonderRoom; + u32 move; + + PARAMETRIZE { useWonderRoom = FALSE; move = MOVE_SCRATCH; } + PARAMETRIZE { useWonderRoom = FALSE; move = MOVE_ROUND; } + PARAMETRIZE { useWonderRoom = TRUE; move = MOVE_SCRATCH; } + PARAMETRIZE { useWonderRoom = TRUE; move = MOVE_ROUND; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_WONDER_ROOM) == EFFECT_WONDER_ROOM); + ASSUME(GetMoveCategory(MOVE_ROUND) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveEffect(MOVE_ROUND) != EFFECT_PSYSHOCK); + PLAYER(SPECIES_CHIEN_PAO) { Ability(ABILITY_SWORD_OF_RUIN); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (useWonderRoom) + TURN { MOVE(opponentLeft, MOVE_WONDER_ROOM); MOVE(playerRight, move, target: opponentLeft); } + else + TURN { MOVE(playerRight, move, target: opponentLeft); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_SWORD_OF_RUIN); + MESSAGE("Chien-Pao's Sword of Ruin weakened the Defense of all surrounding PokΓ©mon!"); + ANIMATION(ANIM_TYPE_MOVE, move, playerRight); + HP_BAR(opponentLeft, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_LT(results[2].damage, results[0].damage); // In Wonder Room, physical move deals less damage + EXPECT_GT(results[3].damage, results[1].damage); // In Wonder Room, special move deals more damage + } +} + +SINGLE_BATTLE_TEST("Sword of Ruin doesn't activate when dragged out by Mold Breaker attacker") +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_MOLD_BREAKER; } + PARAMETRIZE { ability = ABILITY_SAND_RUSH; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_DRAGON_TAIL) == EFFECT_HIT_SWITCH_TARGET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_CHIEN_PAO) { Ability(ABILITY_SWORD_OF_RUIN); } + OPPONENT(SPECIES_EXCADRILL) { Ability(ability); } + } WHEN { + TURN { MOVE(opponent, MOVE_DRAGON_TAIL); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_TAIL, opponent); + if (ability == ABILITY_MOLD_BREAKER) + { + NONE_OF { + ABILITY_POPUP(player, ABILITY_SWORD_OF_RUIN); + MESSAGE("Chien-Pao's Sword of Ruin weakened the Defense of all surrounding PokΓ©mon!"); + } + } + else + { + ABILITY_POPUP(player, ABILITY_SWORD_OF_RUIN); + MESSAGE("Chien-Pao's Sword of Ruin weakened the Defense of all surrounding PokΓ©mon!"); + } + } +} + +DOUBLE_BATTLE_TEST("Sword of Ruin's Defense reduction is not ignored by Mold Breaker", s16 damage) +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_MOLD_BREAKER; } + PARAMETRIZE { ability = ABILITY_SAND_RUSH; } + + GIVEN { + PLAYER(SPECIES_CHIEN_PAO) { Ability(ABILITY_SWORD_OF_RUIN); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_EXCADRILL) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerRight); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_SWORD_OF_RUIN); + MESSAGE("Chien-Pao's Sword of Ruin weakened the Defense of all surrounding PokΓ©mon!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + HP_BAR(playerRight, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} + +DOUBLE_BATTLE_TEST("Sword of Ruin's Defense reduction is ignored by Gastro Acid", s16 damage) +{ + u32 move; + + PARAMETRIZE { move = MOVE_GASTRO_ACID; } + PARAMETRIZE { move = MOVE_CELEBRATE; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_GASTRO_ACID) == EFFECT_GASTRO_ACID); + PLAYER(SPECIES_CHIEN_PAO) { Ability(ABILITY_SWORD_OF_RUIN); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentRight, move, target: playerLeft); MOVE(opponentLeft, MOVE_SCRATCH, target: playerRight); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_SWORD_OF_RUIN); + MESSAGE("Chien-Pao's Sword of Ruin weakened the Defense of all surrounding PokΓ©mon!"); + ANIMATION(ANIM_TYPE_MOVE, move, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + HP_BAR(playerRight, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_LT(results[0].damage, results[1].damage); + } +} diff --git a/test/battle/ability/symbiosis.c b/test/battle/ability/symbiosis.c index 932008d9d7c8..44e7c5f1bd8e 100644 --- a/test/battle/ability/symbiosis.c +++ b/test/battle/ability/symbiosis.c @@ -132,3 +132,49 @@ DOUBLE_BATTLE_TEST("Symbiosis transfers its item to an ally after it consumes a EXPECT_EQ(playerRight->item, ITEM_NONE); } } + +DOUBLE_BATTLE_TEST("Symbiosis transfers its item after Gem consumption and move execution (Gen7+)") +{ + GIVEN { + ASSUME(GetItemHoldEffect(ITEM_NORMAL_GEM) == HOLD_EFFECT_GEMS); + WITH_CONFIG(CONFIG_SYMBIOSIS_GEMS, GEN_7); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); } + PLAYER(SPECIES_ORANGURU) { Ability(ABILITY_SYMBIOSIS); Item(ITEM_TOXIC_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SCRATCH, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); + MESSAGE("The Normal Gem strengthened Wobbuffet's power!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerLeft); + ABILITY_POPUP(playerRight, ABILITY_SYMBIOSIS); + STATUS_ICON(playerLeft, STATUS1_TOXIC_POISON); + } THEN { + EXPECT_EQ(playerLeft->item, ITEM_TOXIC_ORB); + EXPECT_EQ(playerRight->item, ITEM_NONE); + } +} + +DOUBLE_BATTLE_TEST("Symbiosis transfers its item after Gem consumption, but before move execution (Gen6)") +{ + GIVEN { + ASSUME(GetItemHoldEffect(ITEM_NORMAL_GEM) == HOLD_EFFECT_GEMS); + WITH_CONFIG(CONFIG_SYMBIOSIS_GEMS, GEN_6); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); } + PLAYER(SPECIES_ORANGURU) { Ability(ABILITY_SYMBIOSIS); Item(ITEM_TOXIC_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SCRATCH, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); + MESSAGE("The Normal Gem strengthened Wobbuffet's power!"); + ABILITY_POPUP(playerRight, ABILITY_SYMBIOSIS); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerLeft); + STATUS_ICON(playerLeft, STATUS1_TOXIC_POISON); + } THEN { + EXPECT_EQ(playerLeft->item, ITEM_TOXIC_ORB); + EXPECT_EQ(playerRight->item, ITEM_NONE); + } +} diff --git a/test/battle/ability/synchronize.c b/test/battle/ability/synchronize.c index e150e2950e30..8604814fab0a 100644 --- a/test/battle/ability/synchronize.c +++ b/test/battle/ability/synchronize.c @@ -3,11 +3,13 @@ SINGLE_BATTLE_TEST("Synchronize will mirror back non volatile status back at opposing mon") { - + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); - ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); + WITH_CONFIG(CONFIG_SYNCHRONIZE_TOXIC, config); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ABRA) { Ability(ABILITY_SYNCHRONIZE); } } WHEN { @@ -18,13 +20,17 @@ SINGLE_BATTLE_TEST("Synchronize will mirror back non volatile status back at opp STATUS_ICON(opponent, badPoison: TRUE); ABILITY_POPUP(opponent, ABILITY_SYNCHRONIZE); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, player); - STATUS_ICON(player, badPoison: TRUE); + if (config >= GEN_5) + STATUS_ICON(player, badPoison: TRUE); + else + STATUS_ICON(player, poison: TRUE); } } SINGLE_BATTLE_TEST("Synchronize will still show up the ability pop up even if it fails") { GIVEN { + WITH_CONFIG(CONFIG_PARALYZE_ELECTRIC, GEN_6); ASSUME(MoveMakesContact(MOVE_TACKLE)); PLAYER(SPECIES_PIKACHU) { Ability(ABILITY_STATIC); } OPPONENT(SPECIES_ABRA) { Ability(ABILITY_SYNCHRONIZE); } diff --git a/test/battle/ability/tangling_hair.c b/test/battle/ability/tangling_hair.c index 13a0f27cb022..fdae4de06dc3 100644 --- a/test/battle/ability/tangling_hair.c +++ b/test/battle/ability/tangling_hair.c @@ -8,7 +8,6 @@ ASSUMPTIONS ASSUME(MoveMakesContact(MOVE_SCRATCH) == TRUE); } - SINGLE_BATTLE_TEST("Tangling Hair drops opposing mon's speed if ability user got hit by a contact move") { u32 move; @@ -85,3 +84,30 @@ SINGLE_BATTLE_TEST("Tangling Hair does not activate on confusion damage") } } } + +SINGLE_BATTLE_TEST("Tangling Hair does not trigger on Clear Body") +{ + GIVEN { + PLAYER(SPECIES_DUGTRIO) { Ability(ABILITY_TANGLING_HAIR); } + OPPONENT(SPECIES_BELDUM) { Ability(ABILITY_CLEAR_BODY); }; + } WHEN { + TURN { MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + NOT ABILITY_POPUP(player, ABILITY_TANGLING_HAIR); + } +} + +SINGLE_BATTLE_TEST("Tangling Hair will trigger if move is boosted by Sheer Force") +{ + ASSUME(MoveIsAffectedBySheerForce(MOVE_POISON_JAB)); + GIVEN { + PLAYER(SPECIES_DUGTRIO) { Ability(ABILITY_TANGLING_HAIR); } + OPPONENT(SPECIES_NIDOKING) { Ability(ABILITY_SHEER_FORCE); }; + } WHEN { + TURN { MOVE(opponent, MOVE_POISON_JAB); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POISON_JAB, opponent); + ABILITY_POPUP(player, ABILITY_TANGLING_HAIR); + } +} diff --git a/test/battle/ability/teraform_zero.c b/test/battle/ability/teraform_zero.c index 96186f20473a..f6620d662532 100644 --- a/test/battle/ability/teraform_zero.c +++ b/test/battle/ability/teraform_zero.c @@ -39,11 +39,12 @@ DOUBLE_BATTLE_TEST("Teraform Zero can be supressed") SINGLE_BATTLE_TEST("Teraform Zero can be replaced") { GIVEN { - ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_WORRY_SEED); + ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_OVERWRITE_ABILITY); ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); PLAYER(SPECIES_TERAPAGOS); OPPONENT(SPECIES_WHIMSICOTT) { Ability(ABILITY_PRANKSTER); } } WHEN { + TURN { MOVE(opponent, MOVE_POUND); } TURN { MOVE(opponent, MOVE_WORRY_SEED); MOVE(player, MOVE_REST, gimmick: GIMMICK_TERA); } } SCENE { MESSAGE("The opposing Whimsicott used Worry Seed!"); diff --git a/test/battle/ability/toxic_boost.c b/test/battle/ability/toxic_boost.c index 85960c5b0204..35a233ec2339 100644 --- a/test/battle/ability/toxic_boost.c +++ b/test/battle/ability/toxic_boost.c @@ -1,4 +1,23 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Toxic Boost (Ability) test titles") +SINGLE_BATTLE_TEST("Toxic Boost increases Attack by 50% when the PokΓ©mon is poisoned", s16 damage) +{ + u32 status1; + PARAMETRIZE { status1 = STATUS1_NONE; } + PARAMETRIZE { status1 = STATUS1_POISON; } + PARAMETRIZE { status1 = STATUS1_TOXIC_POISON; } + GIVEN { + ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_ZANGOOSE) { Ability(ABILITY_TOXIC_BOOST); Status1(status1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[2].damage); + } +} diff --git a/test/battle/ability/toxic_debris.c b/test/battle/ability/toxic_debris.c index 61e128e98554..46618499055f 100644 --- a/test/battle/ability/toxic_debris.c +++ b/test/battle/ability/toxic_debris.c @@ -120,3 +120,23 @@ SINGLE_BATTLE_TEST("Air Balloon is popped after Toxic Debris activates") MESSAGE("Glimmora's Air Balloon popped!"); } } + +DOUBLE_BATTLE_TEST("Toxic Debris sets Toxic Spikes on the opposing side even when hit by an ally") +{ + struct BattlePokemon *user = NULL; + + PARAMETRIZE{ user = opponentLeft; } + PARAMETRIZE{ user = opponentRight; } + PARAMETRIZE{ user = playerRight; } + GIVEN { + PLAYER(SPECIES_GLIMMORA) { Ability(ABILITY_TOXIC_DEBRIS); } + PLAYER(SPECIES_WYNAUT) { } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT) { } + } WHEN { + TURN { MOVE(user, MOVE_SCRATCH, target: playerLeft); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_TOXIC_DEBRIS); + MESSAGE("Poison spikes were scattered on the ground all around the opposing team!"); + } +} diff --git a/test/battle/ability/trace.c b/test/battle/ability/trace.c index 6dbd9bda2669..71d5035084ce 100644 --- a/test/battle/ability/trace.c +++ b/test/battle/ability/trace.c @@ -46,7 +46,7 @@ SINGLE_BATTLE_TEST("Trace copies opponents ability on switch-in even if opponent DOUBLE_BATTLE_TEST("Trace copies opponents ability randomly") { - u16 ability1, ability2; + enum Ability ability1, ability2; PARAMETRIZE { ability1 = ABILITY_SPEED_BOOST; ability2 = ABILITY_BLAZE;} PARAMETRIZE { ability1 = ABILITY_BLAZE; ability2 = ABILITY_SPEED_BOOST; } diff --git a/test/battle/ability/transistor.c b/test/battle/ability/transistor.c index 8b8f098d52df..e57043a5c2e1 100644 --- a/test/battle/ability/transistor.c +++ b/test/battle/ability/transistor.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Transistor increases Electric-type attack / special attack", s16 damage) { u32 move; - u16 ability; + enum Ability ability; PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_KLUTZ; } PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_TRANSISTOR; } @@ -38,7 +38,7 @@ SINGLE_BATTLE_TEST("Transistor increases Electric-type attack / special attack", SINGLE_BATTLE_TEST("Transistor is blocked by neutralizing gas", s16 damage) { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_NEUTRALIZING_GAS; } PARAMETRIZE { ability = ABILITY_LEVITATE; } diff --git a/test/battle/ability/unburden.c b/test/battle/ability/unburden.c index 0ddce0f22787..4498bb492214 100644 --- a/test/battle/ability/unburden.c +++ b/test/battle/ability/unburden.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Unburden doubles speed once user uses item") { GIVEN { - ASSUME(GetItemHoldEffect(ITEM_GRASSY_SEED) == HOLD_EFFECT_SEEDS); + ASSUME(GetItemHoldEffect(ITEM_GRASSY_SEED) == HOLD_EFFECT_TERRAIN_SEED); ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); PLAYER(SPECIES_DRIFBLIM) { Ability(ABILITY_UNBURDEN); Item(ITEM_GRASSY_SEED); Speed(5); } OPPONENT(SPECIES_WOBBUFFET) { Speed(7); } diff --git a/test/battle/ability/unnerve.c b/test/battle/ability/unnerve.c index 9a8972eb5c4f..a1eabbcf5a34 100644 --- a/test/battle/ability/unnerve.c +++ b/test/battle/ability/unnerve.c @@ -5,7 +5,7 @@ SINGLE_BATTLE_TEST("Unnerve prevents opposing PokΓ©mon from eating their own berries") { u16 mon; - u16 ability; + enum Ability ability; PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; } PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; } GIVEN { @@ -24,7 +24,7 @@ SINGLE_BATTLE_TEST("Unnerve prevents opposing PokΓ©mon from eating their own ber SINGLE_BATTLE_TEST("Unnerve doesn't prevent opposing PokΓ©mon from using Natural Gift") { u16 mon; - u16 ability; + enum Ability ability; PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; } PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; } GIVEN { @@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Unnerve doesn't prevent opposing PokΓ©mon from using Natural SINGLE_BATTLE_TEST("Unnerve prints the correct string (player)") { u16 mon; - u16 ability; + enum Ability ability; PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; } PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; } GIVEN { @@ -59,7 +59,7 @@ SINGLE_BATTLE_TEST("Unnerve prints the correct string (player)") SINGLE_BATTLE_TEST("Unnerve prints the correct string (opponent)") { u16 mon; - u16 ability; + enum Ability ability; PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; } PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; } GIVEN { @@ -76,7 +76,7 @@ SINGLE_BATTLE_TEST("Unnerve prints the correct string (opponent)") SINGLE_BATTLE_TEST("Unnerve activates only once per switch-in") { u16 mon; - u16 ability; + enum Ability ability; PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; } PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; } GIVEN { @@ -99,3 +99,28 @@ SINGLE_BATTLE_TEST("Unnerve activates only once per switch-in") } } + +DOUBLE_BATTLE_TEST("Unnerve stops applying on death but applies on revive") +{ + u16 mon; + u16 ability; + PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE;} + PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; } + GIVEN { + ASSUME(gItemsInfo[ITEM_RAWST_BERRY].holdEffect == HOLD_EFFECT_CURE_BRN); + ASSUME(gItemsInfo[ITEM_REVIVE].battleUsage == EFFECT_ITEM_REVIVE); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(mon) { Ability(ability); HP(1); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_RAWST_BERRY); Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WYNAUT) { Item(ITEM_RAWST_BERRY); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerRight); } + TURN { USE_ITEM(playerLeft, ITEM_REVIVE, partyIndex: 1); SKIP_TURN(playerRight); MOVE(opponentLeft, MOVE_WILL_O_WISP, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponentRight); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight); + } + +} diff --git a/test/battle/ability/vessel_of_ruin.c b/test/battle/ability/vessel_of_ruin.c index 30c7520c36af..1a075db8cf58 100644 --- a/test/battle/ability/vessel_of_ruin.c +++ b/test/battle/ability/vessel_of_ruin.c @@ -73,3 +73,76 @@ SINGLE_BATTLE_TEST("Vessel of Ruin's message displays correctly after all battle MESSAGE("The opposing Ting-Lu's Vessel of Ruin weakened the Sp. Atk of all surrounding PokΓ©mon!"); } } + +DOUBLE_BATTLE_TEST("Vessel of Ruin does not reduce Sp. Atk if Neutralizing Gas is on the field") +{ + s16 damage[2]; + + GIVEN { + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_TING_LU) { Ability(ABILITY_VESSEL_OF_RUIN); } + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_WATER_GUN, target: opponentLeft); + } + TURN { + SWITCH(opponentRight, 2); + MOVE(playerLeft, MOVE_WATER_GUN, target: opponentLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[1]); + } THEN { + EXPECT_MUL_EQ(damage[0], Q_4_12(1.33), damage[1]); + } +} + +SINGLE_BATTLE_TEST("Vessel of Ruin is still active if removed by Mold Breaker + Entrainment") +{ + s16 damage[2]; + + GIVEN { + PLAYER(SPECIES_TING_LU) { Ability(ABILITY_VESSEL_OF_RUIN); } + OPPONENT(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); } + } WHEN { + TURN { MOVE(opponent, MOVE_WATER_GUN); } + TURN { MOVE(opponent, MOVE_ENTRAINMENT); } + TURN { MOVE(opponent, MOVE_WATER_GUN); } + } SCENE { + ABILITY_POPUP(player, ABILITY_VESSEL_OF_RUIN); + MESSAGE("Ting-Lu's Vessel of Ruin weakened the Sp. Atk of all surrounding PokΓ©mon!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, opponent); + HP_BAR(player, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENTRAINMENT, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, opponent); + HP_BAR(player, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + } +} + +DOUBLE_BATTLE_TEST("Vessel of Ruin is active if removed by Mold Breaker Entrainment and Sword of Ruin is active after obtaining it") +{ + GIVEN { + PLAYER(SPECIES_TING_LU) { Ability(ABILITY_VESSEL_OF_RUIN); } + PLAYER(SPECIES_CHIEN_PAO) { Ability(ABILITY_SWORD_OF_RUIN); } + OPPONENT(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_ENTRAINMENT, target: playerLeft); + MOVE(opponentRight, MOVE_SKILL_SWAP, target: playerLeft); + MOVE(playerRight, MOVE_SKILL_SWAP, target: playerLeft); + } + } THEN { + bool32 isVesselOfRuinActive = gBattleMons[B_POSITION_PLAYER_LEFT].volatiles.vesselOfRuin; + bool32 isSwordOfRuinActive = gBattleMons[B_POSITION_PLAYER_LEFT].volatiles.swordOfRuin; + EXPECT_EQ(isVesselOfRuinActive, TRUE); + EXPECT_EQ(isSwordOfRuinActive, TRUE); + } +} diff --git a/test/battle/ability/volt_absorb.c b/test/battle/ability/volt_absorb.c index 5d88cb95e4d4..becc76fd1344 100644 --- a/test/battle/ability/volt_absorb.c +++ b/test/battle/ability/volt_absorb.c @@ -61,7 +61,7 @@ SINGLE_BATTLE_TEST("Volt Absorb is only triggered once on multi strike moves") } } -DOUBLE_BATTLE_TEST("Volt Absorb does not stop Electric Typed Explosion from damaging other pokemon") // Fixed issue #1961 +DOUBLE_BATTLE_TEST("Volt Absorb does not stop Electric Typed Explosion from damaging other PokΓ©mon") // Fixed issue #1961 { s16 damage1, damage2; GIVEN { diff --git a/test/battle/ability/water_bubble.c b/test/battle/ability/water_bubble.c index d140dac04048..1d1d3956d42c 100644 --- a/test/battle/ability/water_bubble.c +++ b/test/battle/ability/water_bubble.c @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Water Bubble prevents burn from Will-o-Wisp") TURN { MOVE(opponent, MOVE_WILL_O_WISP); } } SCENE { ABILITY_POPUP(player, ABILITY_WATER_BUBBLE); - MESSAGE("Dewpider's Water Bubble prevents burns!"); + MESSAGE("It doesn't affect Dewpider…"); NONE_OF { ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, player); STATUS_ICON(player, burn: TRUE); diff --git a/test/battle/ability/water_compaction.c b/test/battle/ability/water_compaction.c index e4e32e27135c..8e7751e37660 100644 --- a/test/battle/ability/water_compaction.c +++ b/test/battle/ability/water_compaction.c @@ -43,7 +43,7 @@ SINGLE_BATTLE_TEST("Water Compaction raises Defense 2 stages on each hit of a mu SINGLE_BATTLE_TEST("Water Compaction does not affect damage taken from Water type moves", s16 damage) { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_SAND_VEIL; } PARAMETRIZE { ability = ABILITY_WATER_COMPACTION; } GIVEN { diff --git a/test/battle/ability/weak_armor.c b/test/battle/ability/weak_armor.c index 6d661dfa7ce0..b8a9337d6722 100644 --- a/test/battle/ability/weak_armor.c +++ b/test/battle/ability/weak_armor.c @@ -7,17 +7,18 @@ ASSUMPTIONS ASSUME(!IsBattleMoveStatus(MOVE_GUST)); ASSUME(GetMoveCategory(MOVE_GUST) == DAMAGE_CATEGORY_SPECIAL); ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(B_WEAK_ARMOR_SPEED >= GEN_7); } -SINGLE_BATTLE_TEST("Weak Armor lowers Defense by 1 and boosts Speed by 2 when hit by a physical attack") +SINGLE_BATTLE_TEST("Weak Armor lowers Defense by 1 and boosts Speed by 1 (Gen5-6) or 2 (Gen7+) when hit by a physical attack") { - u16 move; + u16 move, gen; - PARAMETRIZE { move = MOVE_SCRATCH; } - PARAMETRIZE { move = MOVE_GUST; } + PARAMETRIZE { move = MOVE_SCRATCH; gen = GEN_6; } + PARAMETRIZE { move = MOVE_SCRATCH; gen = GEN_7; } + PARAMETRIZE { move = MOVE_GUST; gen = GEN_7; } GIVEN { + WITH_CONFIG(CONFIG_WEAK_ARMOR_SPEED, gen); PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -28,20 +29,19 @@ SINGLE_BATTLE_TEST("Weak Armor lowers Defense by 1 and boosts Speed by 2 when hi if (move == MOVE_SCRATCH) { ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Slugma's Weak Armor lowered its Defense!"); - MESSAGE("Slugma's Weak Armor raised its Speed!"); } else { NONE_OF { ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Slugma's Weak Armor lowered its Defense!"); - MESSAGE("Slugma's Weak Armor raised its Speed!"); } } } THEN { if (move == MOVE_SCRATCH) { EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE - 1); - EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 2); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + (gen == GEN_7 ? 2 : 1)); + } else { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); } } } @@ -69,7 +69,7 @@ SINGLE_BATTLE_TEST("Weak Armor does not trigger when brought in by Dragon Tail a ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Slugma's Weak Armor lowered its Defense!"); - MESSAGE("Slugma's Weak Armor raised its Speed!"); + MESSAGE("Slugma's Weak Armor sharply raised its Speed!"); } } THEN { EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE); @@ -77,9 +77,14 @@ SINGLE_BATTLE_TEST("Weak Armor does not trigger when brought in by Dragon Tail a } } -SINGLE_BATTLE_TEST("Weak Armor still lowers boosts Speed if Defense can't go any lower") +SINGLE_BATTLE_TEST("Weak Armor still boosts Speed if Defense can't go any lower") { + u16 gen; + + PARAMETRIZE { gen = GEN_6; } + PARAMETRIZE { gen = GEN_7; } GIVEN { + WITH_CONFIG(CONFIG_WEAK_ARMOR_SPEED, gen); PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -97,10 +102,14 @@ SINGLE_BATTLE_TEST("Weak Armor still lowers boosts Speed if Defense can't go any } MESSAGE("Slugma's Defense won't go any lower!"); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Slugma's Weak Armor raised its Speed!"); + if (gen == GEN_6) + MESSAGE("Slugma's Weak Armor raised its Speed!"); + else + MESSAGE("Slugma's Weak Armor sharply raised its Speed!"); + } THEN { EXPECT_EQ(player->statStages[STAT_DEF], MIN_STAT_STAGE); - EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 2); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + (gen == GEN_7 ? 2 : 1)); } } @@ -122,7 +131,7 @@ SINGLE_BATTLE_TEST("Weak Armor still lowers Defense if Speed can't go any higher MESSAGE("Slugma's Weak Armor lowered its Defense!"); NONE_OF { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Slugma's Weak Armor raised its Speed!"); + MESSAGE("Slugma's Weak Armor sharply raised its Speed!"); } MESSAGE("Slugma's Speed won't go any higher!"); } THEN { @@ -135,6 +144,7 @@ SINGLE_BATTLE_TEST("Weak Armor doesn't interrupt multi hit moves if Defense can' { u32 j; GIVEN { + WITH_CONFIG(CONFIG_WEAK_ARMOR_SPEED, GEN_7); PLAYER(SPECIES_MAGCARGO) { Ability(ABILITY_WEAK_ARMOR); Defense(999); } OPPONENT(SPECIES_CLOYSTER) { Ability(ABILITY_SKILL_LINK); } } WHEN { @@ -147,12 +157,12 @@ SINGLE_BATTLE_TEST("Weak Armor doesn't interrupt multi hit moves if Defense can' ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, opponent); ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); MESSAGE("Magcargo's Weak Armor lowered its Defense!"); - MESSAGE("Magcargo's Weak Armor raised its Speed!"); + MESSAGE("Magcargo's Weak Armor sharply raised its Speed!"); } ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, opponent); ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); MESSAGE("Magcargo's Defense won't go any lower!"); - MESSAGE("Magcargo's Weak Armor raised its Speed!"); + MESSAGE("Magcargo's Weak Armor sharply raised its Speed!"); for (j = 0; j < 2; j++) { ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, opponent); @@ -173,6 +183,7 @@ SINGLE_BATTLE_TEST("Weak Armor doesn't interrupt multi hit moves if Speed can't { u32 j; GIVEN { + WITH_CONFIG(CONFIG_WEAK_ARMOR_SPEED, GEN_7); PLAYER(SPECIES_MAGCARGO) { Ability(ABILITY_WEAK_ARMOR); Defense(999); } OPPONENT(SPECIES_CLOYSTER) { Ability(ABILITY_SKILL_LINK); } } WHEN { @@ -183,7 +194,7 @@ SINGLE_BATTLE_TEST("Weak Armor doesn't interrupt multi hit moves if Speed can't ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, opponent); ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); MESSAGE("Magcargo's Weak Armor lowered its Defense!"); - MESSAGE("Magcargo's Weak Armor raised its Speed!"); + MESSAGE("Magcargo's Weak Armor sharply raised its Speed!"); for (j = 0; j < 4; j++) { ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, opponent); diff --git a/test/battle/ability/wind_power.c b/test/battle/ability/wind_power.c index 279d51f6236e..c78df3419070 100644 --- a/test/battle/ability/wind_power.c +++ b/test/battle/ability/wind_power.c @@ -3,9 +3,10 @@ ASSUMPTIONS { - ASSUME(!IsBattleMoveStatus(MOVE_THUNDERBOLT)); - ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); + ASSUME(!IsBattleMoveStatus(MOVE_NUZZLE)); + ASSUME(GetMoveType(MOVE_NUZZLE) == TYPE_ELECTRIC); ASSUME(!IsBattleMoveStatus(MOVE_SCRATCH)); + ASSUME(!IsWindMove(MOVE_SCRATCH)); ASSUME(!IsBattleMoveStatus(MOVE_AIR_CUTTER)); ASSUME(GetMoveTarget(MOVE_AIR_CUTTER) == MOVE_TARGET_BOTH); ASSUME(IsWindMove(MOVE_AIR_CUTTER)); @@ -25,12 +26,12 @@ SINGLE_BATTLE_TEST("Wind Power sets up Charge for player when hit by a wind move GIVEN { PLAYER(SPECIES_WATTREL) { Ability(ABILITY_WIND_POWER); Speed(10); } - OPPONENT(SPECIES_WOBBUFFET) {Ability(ABILITY_LIMBER); Speed(5) ;} // Limber, so it doesn't get paralyzed. + OPPONENT(SPECIES_PERSIAN) {Ability(ABILITY_LIMBER); Speed(5) ;} // Limber, so it doesn't get paralyzed. } WHEN { - TURN { MOVE(player, MOVE_THUNDERBOLT), MOVE(opponent, move); } - TURN { MOVE(player, MOVE_THUNDERBOLT), MOVE(opponent, move); } + TURN { MOVE(player, MOVE_NUZZLE), MOVE(opponent, move); } + TURN { MOVE(player, MOVE_NUZZLE), MOVE(opponent, move); } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_NUZZLE, player); HP_BAR(opponent, captureDamage: &dmgBefore); ANIMATION(ANIM_TYPE_MOVE, move, opponent); @@ -40,7 +41,7 @@ SINGLE_BATTLE_TEST("Wind Power sets up Charge for player when hit by a wind move MESSAGE("Being hit by Air Cutter charged Wattrel with power!"); } - ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_NUZZLE, player); HP_BAR(opponent, captureDamage: &dmgAfter); ANIMATION(ANIM_TYPE_MOVE, move, opponent); @@ -69,13 +70,13 @@ SINGLE_BATTLE_TEST("Wind Power sets up Charge for opponent when hit by a wind mo PARAMETRIZE {move = MOVE_AIR_CUTTER; } GIVEN { - PLAYER(SPECIES_WOBBUFFET) {Ability(ABILITY_LIMBER); Speed(5) ;} // Limber, so it doesn't get paralyzed. + PLAYER(SPECIES_PERSIAN) {Ability(ABILITY_LIMBER); Speed(5) ;} // Limber, so it doesn't get paralyzed. OPPONENT(SPECIES_WATTREL) { Ability(ABILITY_WIND_POWER); Speed(10); } } WHEN { - TURN { MOVE(opponent, MOVE_THUNDERBOLT), MOVE(player, move); } - TURN { MOVE(opponent, MOVE_THUNDERBOLT), MOVE(player, move); } + TURN { MOVE(opponent, MOVE_NUZZLE), MOVE(player, move); } + TURN { MOVE(opponent, MOVE_NUZZLE), MOVE(player, move); } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_NUZZLE, opponent); HP_BAR(player, captureDamage: &dmgBefore); ANIMATION(ANIM_TYPE_MOVE, move, player); @@ -85,7 +86,7 @@ SINGLE_BATTLE_TEST("Wind Power sets up Charge for opponent when hit by a wind mo MESSAGE("Being hit by Air Cutter charged the opposing Wattrel with power!"); } - ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_NUZZLE, opponent); HP_BAR(player, captureDamage: &dmgAfter); ANIMATION(ANIM_TYPE_MOVE, move, player); @@ -105,9 +106,47 @@ SINGLE_BATTLE_TEST("Wind Power sets up Charge for opponent when hit by a wind mo } } +SINGLE_BATTLE_TEST("Wind Power sets up Charge for only one attack when hit by a wind move") +{ + s16 dmgCharged, dmgAfter; + u16 move; + + PARAMETRIZE {move = MOVE_SCRATCH; } + PARAMETRIZE {move = MOVE_AIR_CUTTER; } + + GIVEN { + PLAYER(SPECIES_WATTREL) { Ability(ABILITY_WIND_POWER); Speed(5); } + OPPONENT(SPECIES_PERSIAN) {Ability(ABILITY_LIMBER); Speed(10) ;} // Limber, so it doesn't get paralyzed. + } WHEN { + TURN { MOVE(opponent, move); MOVE(player, MOVE_NUZZLE); } + TURN { MOVE(player, MOVE_NUZZLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + HP_BAR(player); + if (move == MOVE_AIR_CUTTER) { + ABILITY_POPUP(player, ABILITY_WIND_POWER); + MESSAGE("Being hit by Air Cutter charged Wattrel with power!"); + } + + ANIMATION(ANIM_TYPE_MOVE, MOVE_NUZZLE, player); + HP_BAR(opponent, captureDamage: &dmgCharged); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_NUZZLE, player); + HP_BAR(opponent, captureDamage: &dmgAfter); + } + THEN { + if (move == MOVE_AIR_CUTTER) { + EXPECT_MUL_EQ(dmgAfter, Q_4_12(2.0), dmgCharged); + } + else { + EXPECT_EQ(dmgAfter, dmgCharged); + } + } +} + DOUBLE_BATTLE_TEST("Wind Power activates correctly for every battler with the ability when hit by a 2/3 target move") { - u16 abilityLeft, abilityRight; + enum Ability abilityLeft, abilityRight; PARAMETRIZE {abilityLeft = ABILITY_NONE, abilityRight = ABILITY_WIND_POWER;} PARAMETRIZE {abilityLeft = ABILITY_WIND_POWER, abilityRight = ABILITY_NONE; } @@ -116,8 +155,8 @@ DOUBLE_BATTLE_TEST("Wind Power activates correctly for every battler with the ab GIVEN { PLAYER(SPECIES_WATTREL) { Ability(abilityLeft); Speed(10); } PLAYER(SPECIES_WATTREL) { Ability(abilityRight); Speed(5); } - OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_LIMBER); Speed(20); } - OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_LIMBER); Speed(15); } + OPPONENT(SPECIES_PERSIAN) { Ability(ABILITY_LIMBER); Speed(20); } + OPPONENT(SPECIES_PERSIAN) { Ability(ABILITY_LIMBER); Speed(15); } } WHEN { TURN { MOVE(opponentLeft, MOVE_AIR_CUTTER); MOVE(opponentRight, MOVE_AIR_CUTTER);} } SCENE { @@ -148,7 +187,7 @@ DOUBLE_BATTLE_TEST("Wind Power activates correctly for every battler with the ab DOUBLE_BATTLE_TEST("Wind Power activates correctly for every battler with the ability when hit by a 3 target move") { - u16 abilityLeft, abilityRight; + enum Ability abilityLeft, abilityRight; PARAMETRIZE {abilityLeft = ABILITY_NONE, abilityRight = ABILITY_WIND_POWER; } PARAMETRIZE {abilityLeft = ABILITY_WIND_POWER, abilityRight = ABILITY_NONE; } @@ -157,8 +196,8 @@ DOUBLE_BATTLE_TEST("Wind Power activates correctly for every battler with the ab GIVEN { PLAYER(SPECIES_WATTREL) { Ability(abilityLeft); Speed(10); } PLAYER(SPECIES_WATTREL) { Ability(abilityRight); Speed(5); } - OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_LIMBER); Speed(20); } - OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_LIMBER); Speed(15); } + OPPONENT(SPECIES_PERSIAN) { Ability(ABILITY_LIMBER); Speed(20); } + OPPONENT(SPECIES_PERSIAN) { Ability(ABILITY_LIMBER); Speed(15); } } WHEN { TURN { MOVE(opponentLeft, MOVE_PETAL_BLIZZARD);} } SCENE { diff --git a/test/battle/ability/zen_mode.c b/test/battle/ability/zen_mode.c index a3e82a2b2be5..1e73961cdabc 100644 --- a/test/battle/ability/zen_mode.c +++ b/test/battle/ability/zen_mode.c @@ -8,8 +8,8 @@ SINGLE_BATTLE_TEST("Zen Mode switches Darmanitan's form when HP is half or less PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_GALAR_STANDARD; zenSpecies = SPECIES_DARMANITAN_GALAR_ZEN; } GIVEN { - ASSUME(gSpeciesInfo[standardSpecies].baseHP == 105); - ASSUME(gSpeciesInfo[zenSpecies].baseHP == 105); + ASSUME(GetSpeciesBaseHP(standardSpecies) == 105); + ASSUME(GetSpeciesBaseHP(zenSpecies) == 105); PLAYER(standardSpecies) { Ability(ABILITY_ZEN_MODE); @@ -37,8 +37,8 @@ SINGLE_BATTLE_TEST("Zen Mode switches Darmanitan's form when HP is half or less PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_GALAR_STANDARD; zenSpecies = SPECIES_DARMANITAN_GALAR_ZEN; } GIVEN { - ASSUME(gSpeciesInfo[standardSpecies].baseHP == 105); - ASSUME(gSpeciesInfo[zenSpecies].baseHP == 105); + ASSUME(GetSpeciesBaseHP(standardSpecies) == 105); + ASSUME(GetSpeciesBaseHP(zenSpecies) == 105); PLAYER(standardSpecies) { Ability(ABILITY_ZEN_MODE); @@ -65,8 +65,8 @@ SINGLE_BATTLE_TEST("Zen Mode switches Darmanitan's form when HP is healed above PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_GALAR_STANDARD; zenSpecies = SPECIES_DARMANITAN_GALAR_ZEN; } GIVEN { - ASSUME(gSpeciesInfo[standardSpecies].baseHP == 105); - ASSUME(gSpeciesInfo[zenSpecies].baseHP == 105); + ASSUME(GetSpeciesBaseHP(standardSpecies) == 105); + ASSUME(GetSpeciesBaseHP(zenSpecies) == 105); PLAYER(standardSpecies) { Ability(ABILITY_ZEN_MODE); diff --git a/test/battle/ability/zero_to_hero.c b/test/battle/ability/zero_to_hero.c index dcac9b854092..7df3f077029a 100644 --- a/test/battle/ability/zero_to_hero.c +++ b/test/battle/ability/zero_to_hero.c @@ -84,8 +84,8 @@ SINGLE_BATTLE_TEST("Gastro Acid, Worry Seed, and Simple Beam fail if the target GIVEN { ASSUME(GetMoveEffect(MOVE_GASTRO_ACID) == EFFECT_GASTRO_ACID); - ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_WORRY_SEED); - ASSUME(GetMoveEffect(MOVE_SIMPLE_BEAM) == EFFECT_SIMPLE_BEAM); + ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_OVERWRITE_ABILITY); + ASSUME(GetMoveEffect(MOVE_SIMPLE_BEAM) == EFFECT_OVERWRITE_ABILITY); PLAYER(SPECIES_PALAFIN_ZERO) { Ability(ABILITY_ZERO_TO_HERO); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index 249e686c1657..0cb4a9737514 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -10,6 +10,7 @@ AI_SINGLE_BATTLE_TEST("AI prefers Bubble over Water Gun if it's slower") PARAMETRIZE { speedPlayer = 10; speedAi = 200; } GIVEN { + ASSUME(GetMovePower(MOVE_WATER_GUN) == GetMovePower(MOVE_BUBBLE)); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_SCIZOR) { Speed(speedPlayer); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_WATER_GUN, MOVE_BUBBLE); Speed(speedAi); } @@ -29,11 +30,12 @@ AI_SINGLE_BATTLE_TEST("AI prefers Bubble over Water Gun if it's slower") AI_SINGLE_BATTLE_TEST("AI prefers Water Gun over Bubble if it knows that foe has Contrary") { - u32 abilityAI; + enum Ability abilityAI; PARAMETRIZE { abilityAI = ABILITY_MOXIE; } PARAMETRIZE { abilityAI = ABILITY_MOLD_BREAKER; } // Mold Breaker ignores Contrary. GIVEN { + ASSUME(GetMovePower(MOVE_BUBBLE) == GetMovePower(MOVE_WATER_GUN)); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_SHUCKLE) { Ability(ABILITY_CONTRARY); } OPPONENT(SPECIES_PINSIR) { Moves(MOVE_WATER_GUN, MOVE_BUBBLE); Ability(abilityAI); } @@ -52,7 +54,8 @@ AI_SINGLE_BATTLE_TEST("AI prefers Water Gun over Bubble if it knows that foe has AI_SINGLE_BATTLE_TEST("AI prefers moves with better accuracy, but only if they both require the same number of hits to ko") { u16 move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE; - u16 hp, expectedMove, turns, abilityAtk, expectedMove2; + u16 hp, expectedMove, turns, expectedMove2; + enum Ability abilityAtk; abilityAtk = ABILITY_NONE; expectedMove2 = MOVE_NONE; @@ -136,7 +139,8 @@ AI_SINGLE_BATTLE_TEST("AI prefers moves which deal more damage instead of moves { u8 turns = 0; u16 move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE; - u16 expectedMove, abilityAtk, abilityDef; + u16 expectedMove; + enum Ability abilityAtk, abilityDef; abilityAtk = ABILITY_NONE; @@ -150,6 +154,7 @@ AI_SINGLE_BATTLE_TEST("AI prefers moves which deal more damage instead of moves ASSUME(GetMoveCategory(MOVE_SCALD) == DAMAGE_CATEGORY_SPECIAL); ASSUME(GetMoveCategory(MOVE_POISON_JAB) == DAMAGE_CATEGORY_PHYSICAL); ASSUME(GetMoveCategory(MOVE_WATER_GUN) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetSpeciesBaseAttack(SPECIES_NIDOQUEEN) == 92); // Gen 5's 82 Base Attack causes the test to fail AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_TYPHLOSION) { Ability(abilityDef); } PLAYER(SPECIES_WOBBUFFET); @@ -204,6 +209,9 @@ AI_SINGLE_BATTLE_TEST("AI prefers a weaker move over a one with a downside effec GIVEN { ASSUME(GetMoveCategory(MOVE_FLAMETHROWER) == DAMAGE_CATEGORY_SPECIAL); // Added because Typhlosion has to KO Wobbuffet ASSUME(GetMoveCategory(MOVE_OVERHEAT) == DAMAGE_CATEGORY_SPECIAL); // Added because Typhlosion has to KO Wobbuffet + // With Gen 5 data, it chooses Overheat instead + ASSUME(GetMovePower(MOVE_FLAMETHROWER) == 90); // In Gen 5, it's 95 + ASSUME(GetMovePower(MOVE_OVERHEAT) == 130); // In Gen 5, it's 140. AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { HP(hp); } PLAYER(SPECIES_WOBBUFFET); @@ -258,7 +266,8 @@ AI_SINGLE_BATTLE_TEST("AI chooses the safest option to faint the target, taking { u16 move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE; u16 expectedMove, expectedMove2 = MOVE_NONE; - u16 abilityAtk = ABILITY_NONE, holdItemAtk = ITEM_NONE; + enum Ability abilityAtk = ABILITY_NONE; + u32 holdItemAtk = ITEM_NONE; // Psychic is not very effective, but always hits. Solarbeam requires a charging turn, Double Edge has recoil and Focus Blast can miss; PARAMETRIZE { abilityAtk = ABILITY_STURDY; move1 = MOVE_FOCUS_BLAST; move2 = MOVE_SOLAR_BEAM; move3 = MOVE_PSYCHIC; move4 = MOVE_DOUBLE_EDGE; expectedMove = MOVE_PSYCHIC; } @@ -295,7 +304,8 @@ AI_SINGLE_BATTLE_TEST("AI chooses the safest option to faint the target, taking { u16 move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE; u16 expectedMove, expectedMove2 = MOVE_NONE; - u16 abilityAtk = ABILITY_NONE, holdItemAtk = ITEM_NONE; + enum Ability abilityAtk = ABILITY_NONE; + u32 holdItemAtk = ITEM_NONE; // Fiery Dance and Skull Bash are chosen because user is holding Power Herb PARAMETRIZE { abilityAtk = ABILITY_STURDY; holdItemAtk = ITEM_POWER_HERB; move1 = MOVE_FOCUS_BLAST; move2 = MOVE_SKULL_BASH; move3 = MOVE_FIERY_DANCE; move4 = MOVE_DOUBLE_EDGE; @@ -322,7 +332,7 @@ AI_SINGLE_BATTLE_TEST("AI chooses the safest option to faint the target, taking AI_SINGLE_BATTLE_TEST("AI won't use Solar Beam if there is no Sun up or the user is not holding Power Herb") { - u16 abilityAtk = ABILITY_NONE; + enum Ability abilityAtk = ABILITY_NONE; u16 holdItemAtk = ITEM_NONE; PARAMETRIZE { abilityAtk = ABILITY_DROUGHT; } @@ -332,6 +342,7 @@ AI_SINGLE_BATTLE_TEST("AI won't use Solar Beam if there is no Sun up or the user GIVEN { ASSUME(GetMoveCategory(MOVE_SOLAR_BEAM) == DAMAGE_CATEGORY_SPECIAL); ASSUME(GetMoveCategory(MOVE_GRASS_PLEDGE) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMovePower(MOVE_GRASS_PLEDGE) == 80); // Gen 5's 50 power causes the test to fail AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { HP(211); } PLAYER(SPECIES_WOBBUFFET); @@ -442,7 +453,7 @@ AI_SINGLE_BATTLE_TEST("First Impression is preferred on the first turn of the sp AI_SINGLE_BATTLE_TEST("First Impression is not chosen if it's blocked by certain abilities") { u16 species; - u16 ability; + enum Ability ability; PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; } PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; } @@ -509,7 +520,7 @@ AI_SINGLE_BATTLE_TEST("AI will choose Thunderbolt then Surf 2/3 times if the opp AI_SINGLE_BATTLE_TEST("AI will choose Scratch over Power-up Punch with Contrary") { - u32 ability; + enum Ability ability; PARAMETRIZE {ability = ABILITY_SUCTION_CUPS; } PARAMETRIZE {ability = ABILITY_CONTRARY; } @@ -518,8 +529,8 @@ AI_SINGLE_BATTLE_TEST("AI will choose Scratch over Power-up Punch with Contrary" ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL); ASSUME(GetMovePower(MOVE_POWER_UP_PUNCH) == 40); ASSUME(GetMoveType(MOVE_POWER_UP_PUNCH) == TYPE_FIGHTING); - ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[0] == TYPE_WATER); - ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[1] == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_SQUIRTLE, 0) == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_SQUIRTLE, 1) == TYPE_WATER); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_SQUIRTLE) { }; OPPONENT(SPECIES_MALAMAR) { Ability(ability); Moves(MOVE_SCRATCH, MOVE_POWER_UP_PUNCH); } @@ -535,7 +546,7 @@ AI_SINGLE_BATTLE_TEST("AI will choose Scratch over Power-up Punch with Contrary" AI_SINGLE_BATTLE_TEST("AI will choose Superpower over Outrage with Contrary") { - u32 ability; + enum Ability ability; PARAMETRIZE {ability = ABILITY_SUCTION_CUPS; } PARAMETRIZE {ability = ABILITY_CONTRARY; } @@ -544,8 +555,8 @@ AI_SINGLE_BATTLE_TEST("AI will choose Superpower over Outrage with Contrary") ASSUME(GetMoveType(MOVE_SUPERPOWER) == TYPE_FIGHTING); ASSUME(GetMovePower(MOVE_OUTRAGE) == 120); ASSUME(GetMoveType(MOVE_OUTRAGE) == TYPE_DRAGON); - ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[0] == TYPE_WATER); - ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[1] == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_SQUIRTLE, 0) == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_SQUIRTLE, 1) == TYPE_WATER); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_SQUIRTLE) { }; OPPONENT(SPECIES_MALAMAR) { Ability(ability); Moves(MOVE_OUTRAGE, MOVE_SUPERPOWER); } @@ -561,7 +572,7 @@ AI_SINGLE_BATTLE_TEST("AI will choose Superpower over Outrage with Contrary") AI_SINGLE_BATTLE_TEST("AI calculates guaranteed criticals and detects critical immunity") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_SWIFT_SWIM; } PARAMETRIZE { ability = ABILITY_SHELL_ARMOR; } @@ -638,7 +649,8 @@ AI_SINGLE_BATTLE_TEST("AI uses a guaranteed KO move instead of the move with the AI_SINGLE_BATTLE_TEST("AI stays choice locked into moves in spite of the player's ability disabling them") { - u32 playerMon, ability, aiMove; + u32 playerMon, aiMove; + enum Ability ability; PARAMETRIZE { ability = ABILITY_DAZZLING; playerMon = SPECIES_BRUXISH; aiMove = MOVE_QUICK_ATTACK; } PARAMETRIZE { ability = ABILITY_QUEENLY_MAJESTY; playerMon = SPECIES_TSAREENA; aiMove = MOVE_QUICK_ATTACK; } PARAMETRIZE { ability = ABILITY_ARMOR_TAIL; playerMon = SPECIES_FARIGIRAF; aiMove = MOVE_QUICK_ATTACK; } @@ -661,17 +673,16 @@ AI_SINGLE_BATTLE_TEST("AI stays choice locked into moves in spite of the player' } } -AI_SINGLE_BATTLE_TEST("AI won't use Sucker Punch if it expects a move of the same priority bracket and the opponent is faster") +AI_SINGLE_BATTLE_TEST("AI won't use Sucker Punch if it expects a status move a percentage of the time") { + PASSES_RANDOMLY(SUCKER_PUNCH_CHANCE, 100, RNG_AI_SUCKER_PUNCH); GIVEN { - ASSUME(GetMovePriority(MOVE_QUICK_ATTACK) == 1); - ASSUME(GetMovePriority(MOVE_SUCKER_PUNCH) == 1); - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_WOBBUFFET) { Speed(300); Moves(MOVE_QUICK_ATTACK); } - OPPONENT(SPECIES_WOBBUFFET) { Speed(100); Moves(MOVE_SUCKER_PUNCH, MOVE_SCRATCH); } + ASSUME(GetMoveEffect(MOVE_SUCKER_PUNCH) == EFFECT_SUCKER_PUNCH); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_GROWL, MOVE_SCRATCH); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SUCKER_PUNCH, MOVE_SCRATCH); } } WHEN { - TURN { MOVE(player, MOVE_QUICK_ATTACK); EXPECT_MOVE(opponent, MOVE_SUCKER_PUNCH); } - TURN { MOVE(player, MOVE_QUICK_ATTACK); EXPECT_MOVE(opponent, MOVE_SCRATCH); } + TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_SUCKER_PUNCH); } } } @@ -688,10 +699,11 @@ AI_SINGLE_BATTLE_TEST("AI won't use thawing moves if target is frozen unless it PARAMETRIZE { status = STATUS1_FROSTBITE; aiMove = MOVE_EMBER; aiFlags = AI_FLAG_CHECK_BAD_MOVE; } GIVEN { + WITH_CONFIG(CONFIG_BURN_HIT_THAW, GEN_6); // In Gen 5, non-Fire burning moves didn't cause thawing ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); ASSUME(GetMoveCategory(MOVE_WATER_GUN) == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_SCALD].thawsUser == TRUE); + ASSUME(MoveThawsUser(MOVE_SCALD) == TRUE); AI_FLAGS(aiFlags | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE); Status1(status); } OPPONENT(SPECIES_VULPIX) { Moves(MOVE_TACKLE, aiMove); } @@ -834,6 +846,7 @@ AI_DOUBLE_BATTLE_TEST("AI sees opposing drain ability") ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); ASSUME(GetMoveType(MOVE_RAZOR_LEAF) != TYPE_ELECTRIC); ASSUME(GetMoveType(MOVE_METAL_CLAW) != TYPE_ELECTRIC); + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_RAICHU) { Ability(ABILITY_LIGHTNING_ROD); Moves(MOVE_CELEBRATE); } PLAYER(SPECIES_KRABBY) { Ability(ABILITY_VOLT_ABSORB); Moves(MOVE_CELEBRATE); } @@ -848,7 +861,7 @@ AI_DOUBLE_BATTLE_TEST("AI sees opposing drain ability") AI_SINGLE_BATTLE_TEST("AI will not set up Weather if it wont have any affect") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CLOUD_NINE; } PARAMETRIZE { ability = ABILITY_DAMP; } @@ -865,3 +878,163 @@ AI_SINGLE_BATTLE_TEST("AI will not set up Weather if it wont have any affect") TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_RAIN_DANCE); } } } + +AI_SINGLE_BATTLE_TEST("Move scoring comparison properly awards bonus point to best OHKO move") +{ + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_THUNDER, MOVE_EFFECT_PARALYSIS)); + ASSUME(GetMoveAdditionalEffectCount(MOVE_WATER_SPOUT) == 0); + ASSUME(GetMoveAdditionalEffectCount(MOVE_WATER_GUN) == 0); + ASSUME(GetMoveAdditionalEffectCount(MOVE_ORIGIN_PULSE) == 0); + ASSUME(GetMoveAccuracy(MOVE_WATER_SPOUT) > GetMoveAccuracy(MOVE_THUNDER)); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY); + PLAYER(SPECIES_WAILORD) { Level(50); } + OPPONENT(SPECIES_WAILORD) { Moves(MOVE_THUNDER, MOVE_WATER_SPOUT, MOVE_WATER_GUN, MOVE_SURF); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_WATER_SPOUT); } + } +} + +AI_SINGLE_BATTLE_TEST("AI will stop setting up at +4") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE, MOVE_IRON_DEFENSE); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_IRON_DEFENSE); } + TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_IRON_DEFENSE); } + TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_TACKLE); } + } +} + +AI_SINGLE_BATTLE_TEST("Move scoring comparison properly awards bonus point to best OHKO move") +{ + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_THUNDER, MOVE_EFFECT_PARALYSIS)); + ASSUME(GetMoveAdditionalEffectCount(MOVE_WATER_SPOUT) == 0); + ASSUME(GetMoveAdditionalEffectCount(MOVE_WATER_GUN) == 0); + ASSUME(GetMoveAdditionalEffectCount(MOVE_ORIGIN_PULSE) == 0); + ASSUME(GetMoveAccuracy(MOVE_WATER_SPOUT) > GetMoveAccuracy(MOVE_THUNDER)); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY); + PLAYER(SPECIES_WAILORD) { Level(50); } + OPPONENT(SPECIES_WAILORD) { Moves(MOVE_THUNDER, MOVE_WATER_SPOUT, MOVE_WATER_GUN, MOVE_SURF); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_WATER_SPOUT); } + } +} + +AI_SINGLE_BATTLE_TEST("AI will see Magnitude damage") +{ + PASSES_RANDOMLY(SHOULD_SWITCH_HASBADODDS_PERCENTAGE, 100, RNG_AI_SWITCH_HASBADODDS); + GIVEN { + ASSUME(GetMoveEffect(MOVE_MAGNITUDE) == EFFECT_MAGNITUDE); + ASSUME(GetMoveType(MOVE_MAGNITUDE) == TYPE_GROUND); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_GEODUDE) { Level(15); Moves(MOVE_DEFENSE_CURL, MOVE_MAGNITUDE); } + OPPONENT(SPECIES_TYRUNT) { Level(13); Moves(MOVE_BITE, MOVE_THUNDER_FANG, MOVE_ROCK_TOMB); } + OPPONENT(SPECIES_ZUBAT) { Level(14); Moves(MOVE_TACKLE); } + } WHEN { + TURN { MOVE(player, MOVE_MAGNITUDE); EXPECT_SWITCH(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI will prefer resisted move over failing move") +{ + GIVEN { + WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY); + PLAYER(SPECIES_ROSELIA) { Moves(MOVE_ABSORB); }; + OPPONENT(SPECIES_GLOOM) { Moves(MOVE_MEGA_DRAIN, MOVE_STUN_SPORE, MOVE_LEECH_SEED, MOVE_SYNTHESIS); } + } WHEN { + TURN { MOVE(player, MOVE_ABSORB); EXPECT_MOVE(opponent, MOVE_MEGA_DRAIN);} + } +} + +AI_SINGLE_BATTLE_TEST("AI won't setup if it can KO through Sturdy effect") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_SKARMORY) { Ability(ABILITY_STURDY); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_MOLTRES) { Moves(MOVE_FIRE_BLAST, MOVE_AGILITY); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_FIRE_BLAST); } + } +} + +AI_SINGLE_BATTLE_TEST("AI won't setup if otherwise good scenario is changed by the presence of priority") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_FLOATZEL) { Speed(2); Moves(MOVE_AQUA_JET, MOVE_SURF); } + OPPONENT(SPECIES_DONPHAN) { Speed(5); Moves(MOVE_BULK_UP, MOVE_EARTHQUAKE); } + } WHEN { + TURN { MOVE(player, MOVE_SURF); EXPECT_MOVE(opponent, MOVE_EARTHQUAKE); } + } +} + +AI_SINGLE_BATTLE_TEST("AI will use Recovery move if it outheals your damage and outspeeds") +{ + PASSES_RANDOMLY(100, 100, RNG_AI_SHOULD_RECOVER); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_LINOONE) { Speed(2); Moves(MOVE_HEADBUTT); } + OPPONENT(SPECIES_GASTRODON) { Speed(5); Moves(MOVE_SCALD, MOVE_RECOVER); HP(1); } + } WHEN { + TURN { MOVE(player, MOVE_HEADBUTT); EXPECT_MOVE(opponent, MOVE_RECOVER); } + } +} + +AI_SINGLE_BATTLE_TEST("AI will use recovery move if it outheals your damage and is outsped") +{ + u32 aiMove = MOVE_NONE; + PASSES_RANDOMLY(100, 100, RNG_AI_SHOULD_RECOVER); + PARAMETRIZE{ aiMove = MOVE_RECOVER; } + PARAMETRIZE{ aiMove = MOVE_STRENGTH_SAP; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_LINOONE) { Speed(5); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_GASTRODON) { Speed(2); Moves(MOVE_SCALD, aiMove); HP(200); MaxHP(400); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, aiMove); } + } +} + +AI_SINGLE_BATTLE_TEST("AI will use recovery move if is in no immediate danger beneath an HP threshold") +{ + PASSES_RANDOMLY(SHOULD_RECOVER_CHANCE, 100, RNG_AI_SHOULD_RECOVER); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_LINOONE) { Speed(2); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_GASTRODON) { Speed(5); Moves(MOVE_SCALD, MOVE_RECOVER); HP(200); MaxHP(400); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_RECOVER); } + } +} + +AI_SINGLE_BATTLE_TEST("AI has a chance to prioritize last chance priority damage over slow KO") +{ + PASSES_RANDOMLY(PRIORITIZE_LAST_CHANCE_CHANCE, 100, RNG_AI_PRIORITIZE_LAST_CHANCE); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_CAMERUPT) { Speed(2); Moves(MOVE_FLAMETHROWER, MOVE_CELEBRATE); } + OPPONENT(SPECIES_FLOATZEL) { Level(90); Speed(1); HP(1); Moves(MOVE_WAVE_CRASH, MOVE_AQUA_JET); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_AQUA_JET); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI won't be confused by player's previous priority moves when evaluating KOs") +{ + PASSES_RANDOMLY(100, 100); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_BEAUTIFLY) { Speed(1); Moves(MOVE_DETECT, MOVE_SCRATCH); } + PLAYER(SPECIES_MASQUERAIN) { Speed(10); Moves(MOVE_DETECT, MOVE_SCRATCH); } + OPPONENT(SPECIES_CRADILY) { Speed(5); Moves(MOVE_POWER_GEM); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(4); Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_DETECT); MOVE(playerRight, MOVE_DETECT); EXPECT_MOVE(opponentLeft, MOVE_POWER_GEM, target:playerLeft); EXPECT_MOVE(opponentRight, MOVE_CELEBRATE); } + TURN { MOVE(playerLeft, MOVE_DETECT); MOVE(playerRight, MOVE_DETECT); EXPECT_MOVE(opponentLeft, MOVE_POWER_GEM, target:playerLeft); EXPECT_MOVE(opponentRight, MOVE_CELEBRATE); } + } +} diff --git a/test/battle/ai/ai_assume_stab.c b/test/battle/ai/ai_assume_stab.c new file mode 100644 index 000000000000..6147229ae728 --- /dev/null +++ b/test/battle/ai/ai_assume_stab.c @@ -0,0 +1,85 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_ai_util.h" + +AI_SINGLE_BATTLE_TEST("AI_FLAG_ASSUME_STAB sees the player's STAB moves") +{ + u32 aiFlag = 0; + PARAMETRIZE { aiFlag = AI_FLAG_ASSUME_STAB; } + PARAMETRIZE { aiFlag = AI_FLAG_OMNISCIENT; } + PARAMETRIZE { aiFlag = 0; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | aiFlag); + PLAYER(SPECIES_TYPHLOSION) { Speed(5); Moves(MOVE_TACKLE, MOVE_FLAMETHROWER); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(1); Moves(MOVE_TACKLE); Level(1); } + OPPONENT(SPECIES_SCIZOR) { Speed(4); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_BLISSEY) { Speed(4); Moves(MOVE_TACKLE); } + } WHEN { + if (aiFlag == AI_FLAG_ASSUME_STAB || aiFlag == AI_FLAG_OMNISCIENT) + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_TACKLE); EXPECT_SEND_OUT(opponent, 2); } + else + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_TACKLE); EXPECT_SEND_OUT(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_ASSUME_STAB does not see the player's non-STAB moves") +{ + u32 aiFlag = 0; + PARAMETRIZE { aiFlag = AI_FLAG_ASSUME_STAB; } + PARAMETRIZE { aiFlag = AI_FLAG_OMNISCIENT; } + PARAMETRIZE { aiFlag = 0; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | aiFlag); + PLAYER(SPECIES_GOREBYSS) { Speed(5); Moves(MOVE_TACKLE, MOVE_FLAMETHROWER); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(1); Moves(MOVE_TACKLE); Level(1); } + OPPONENT(SPECIES_SCIZOR) { Speed(4); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_BLISSEY) { Speed(4); Moves(MOVE_TACKLE); } + } WHEN { + if (aiFlag == AI_FLAG_OMNISCIENT) + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_TACKLE); EXPECT_SEND_OUT(opponent, 2); } + else + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_TACKLE); EXPECT_SEND_OUT(opponent, 1); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI correctly records assumed STAB moves") +{ + u32 aiFlag = 0; + // Not checking Omniscient here because it doesn't change the battle history + PARAMETRIZE { aiFlag = AI_FLAG_ASSUME_STAB; } + PARAMETRIZE { aiFlag = 0; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiFlag); + PLAYER(SPECIES_TYPHLOSION) { Moves(MOVE_TACKLE, MOVE_FLAMETHROWER, MOVE_SMOG); } + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE, MOVE_HEADBUTT, MOVE_THUNDERBOLT); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE, target:opponentLeft); MOVE(playerRight, MOVE_THUNDERBOLT, target:opponentRight); } + } THEN { + if (aiFlag == AI_FLAG_ASSUME_STAB) + { + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][0], MOVE_TACKLE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][1], MOVE_FLAMETHROWER); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][2], MOVE_NONE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][3], MOVE_NONE); + + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][0], MOVE_TACKLE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][1], MOVE_HEADBUTT); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][2], MOVE_THUNDERBOLT); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][3], MOVE_NONE); + } + else if (aiFlag == 0) + { + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][0], MOVE_TACKLE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][1], MOVE_NONE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][2], MOVE_NONE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][3], MOVE_NONE); + + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][0], MOVE_NONE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][1], MOVE_NONE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][2], MOVE_THUNDERBOLT); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][3], MOVE_NONE); + } + } +} diff --git a/test/battle/ai/ai_assume_status_moves.c b/test/battle/ai/ai_assume_status_moves.c new file mode 100644 index 000000000000..8fbaf011014f --- /dev/null +++ b/test/battle/ai/ai_assume_status_moves.c @@ -0,0 +1,49 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_ai_util.h" + +AI_DOUBLE_BATTLE_TEST("AI_FLAG_ASSUME_STATUS_MOVES correctly records assumed status moves") +{ + PASSES_RANDOMLY(ASSUME_STATUS_HIGH_ODDS, 100, RNG_AI_ASSUME_STATUS_HIGH_ODDS); + PASSES_RANDOMLY(ASSUME_STATUS_MEDIUM_ODDS, 100, RNG_AI_ASSUME_STATUS_MEDIUM_ODDS); + PASSES_RANDOMLY(ASSUME_STATUS_LOW_ODDS, 100, RNG_AI_ASSUME_STATUS_LOW_ODDS); + PASSES_RANDOMLY(ASSUME_ALL_STATUS_ODDS, 100, RNG_AI_ASSUME_ALL_STATUS); + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_ASSUME_STATUS_MOVES); + PLAYER(SPECIES_TYPHLOSION) { Moves(MOVE_TACKLE, MOVE_COURT_CHANGE, MOVE_FAKE_OUT); } + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_HAIL, MOVE_SHED_TAIL, MOVE_THUNDERBOLT); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE, target:opponentLeft); MOVE(playerRight, MOVE_THUNDERBOLT, target:opponentRight); } + } THEN { + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][0], MOVE_TACKLE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][1], MOVE_COURT_CHANGE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][2], MOVE_FAKE_OUT); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][3], MOVE_NONE); + + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][0], MOVE_HAIL); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][1], MOVE_SHED_TAIL); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][2], MOVE_THUNDERBOLT); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][3], MOVE_NONE); + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_ASSUME_STATUS_MOVES changes behavior") +{ + if (ASSUME_STATUS_MOVES_HAS_TUNING) + PASSES_RANDOMLY(ASSUME_STATUS_MEDIUM_ODDS, 100, RNG_AI_ASSUME_STATUS_MEDIUM_ODDS); + else + PASSES_RANDOMLY(ASSUME_ALL_STATUS_ODDS, 100, RNG_AI_ASSUME_ALL_STATUS); + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_ASSUME_STATUS_MOVES); + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_REST, MOVE_HEADBUTT); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_WORRY_SEED, MOVE_HEADBUTT); } + } WHEN { + TURN { MOVE(player, MOVE_HEADBUTT); EXPECT_MOVE(opponent, MOVE_WORRY_SEED); } + } +} + + diff --git a/test/battle/ai/ai_calc_best_move_score.c b/test/battle/ai/ai_calc_best_move_score.c index a4a13c283ff2..7fcf0ced2494 100644 --- a/test/battle/ai/ai_calc_best_move_score.c +++ b/test/battle/ai/ai_calc_best_move_score.c @@ -11,7 +11,8 @@ AI_SINGLE_BATTLE_TEST("AI will not further increase Attack / Sp. Atk stat if it GIVEN { ASSUME(GetMovePower(MOVE_SKY_UPPERCUT) == 85); - ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY); + ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP + || GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY); ASSUME(GetMoveEffect(MOVE_CALM_MIND) == EFFECT_CALM_MIND); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_COMBUSKEN) { Speed(15); Moves(MOVE_SKY_UPPERCUT, MOVE_CELEBRATE); }; @@ -31,7 +32,8 @@ AI_SINGLE_BATTLE_TEST("AI will not further increase Attack / Sp. Atk stat if it GIVEN { ASSUME(GetMovePower(MOVE_SKY_UPPERCUT) == 85); - ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY); + ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP + || GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY); ASSUME(GetMoveEffect(MOVE_CALM_MIND) == EFFECT_CALM_MIND); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_COMBUSKEN) { Speed(20); Moves(MOVE_DOUBLE_KICK, MOVE_CELEBRATE); }; @@ -63,7 +65,8 @@ AI_SINGLE_BATTLE_TEST("AI will not waste a turn setting up if it knows target ca GIVEN { ASSUME(GetMovePower(MOVE_SKY_UPPERCUT) == 85); - ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY); + ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP + || GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY); ASSUME(GetMoveEffect(MOVE_CALM_MIND) == EFFECT_CALM_MIND); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_COMBUSKEN) { Speed(15); Moves(MOVE_SKY_UPPERCUT, MOVE_DOUBLE_KICK, MOVE_FLAME_WHEEL, MOVE_CELEBRATE); }; @@ -109,3 +112,37 @@ AI_SINGLE_BATTLE_TEST("AI will select Throat Chop if the sound move is the best TURN { EXPECT_MOVE(opponent, MOVE_THROAT_CHOP); MOVE(player, MOVE_HYPER_VOICE);} } } + +AI_SINGLE_BATTLE_TEST("HasMoveThatChangesKOThreshold - AI should not see self-targeted speed drops as preventing setup moves in 2hko cases") +{ + u16 move; + PARAMETRIZE { move = MOVE_EARTHQUAKE; } + PARAMETRIZE { move = MOVE_BULLDOZE; } + GIVEN { + ASSUME(MoveHasAdditionalEffectSelf(MOVE_HAMMER_ARM, MOVE_EFFECT_SPD_MINUS_1) == TRUE); + ASSUME(MoveHasAdditionalEffect(MOVE_BULLDOZE, MOVE_EFFECT_SPD_MINUS_1) == TRUE); + ASSUME(GetMoveEffect(MOVE_NASTY_PLOT) == EFFECT_SPECIAL_ATTACK_UP_2); + ASSUME(GetMovePower(MOVE_EARTHQUAKE) == 100); + ASSUME(GetMovePower(MOVE_HAMMER_ARM) == 100); + ASSUME(GetMovePower(MOVE_BULLDOZE) == 60); + ASSUME(GetMovePower(MOVE_AURA_SPHERE) == 80); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_RHYDON) { Level(100); Nature(NATURE_ADAMANT); Item(ITEM_EVIOLITE); Speed(1); Ability(ABILITY_LIGHTNING_ROD); Moves(MOVE_HAMMER_ARM, move); } + OPPONENT(SPECIES_GRIMMSNARL) { Level(100); Nature(NATURE_JOLLY); Ability(ABILITY_INFILTRATOR); Speed(2); HP(300); Moves(MOVE_NASTY_PLOT, MOVE_AURA_SPHERE); } + } WHEN { + TURN { MOVE(player, MOVE_HAMMER_ARM); EXPECT_MOVE(opponent, move == MOVE_EARTHQUAKE ? MOVE_NASTY_PLOT : MOVE_AURA_SPHERE); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_IsMoveEffectInPlus - AI should not see secondary effect of Sheer Force boosted moves as beneficial") +{ + GIVEN { + ASSUME(GetMovePower(MOVE_PSYCHIC) == 90); + ASSUME(MoveHasAdditionalEffect(MOVE_PSYCHIC, MOVE_EFFECT_SP_DEF_MINUS_1) == TRUE); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_STEELIX) { Level(100); Nature(NATURE_SASSY); Item(ITEM_STEELIXITE); Ability(ABILITY_STURDY); Speed(58); Moves(MOVE_GYRO_BALL); } + OPPONENT(SPECIES_BRAVIARY_HISUI) { Level(100); Nature(NATURE_TIMID); Ability(ABILITY_SHEER_FORCE); Speed(251); Moves(MOVE_PSYCHIC, MOVE_NIGHT_SHADE); } + } WHEN { + TURN { MOVE(player, MOVE_GYRO_BALL); SCORE_EQ_VAL(opponent, MOVE_PSYCHIC, 101); SCORE_EQ_VAL(opponent, MOVE_NIGHT_SHADE, 101); } + } +} diff --git a/test/battle/ai/ai_check_viability.c b/test/battle/ai/ai_check_viability.c index f80597f476b1..5ec4161a1763 100644 --- a/test/battle/ai/ai_check_viability.c +++ b/test/battle/ai/ai_check_viability.c @@ -1,6 +1,9 @@ +#include "constants/battle_ai.h" +#include "constants/moves.h" #include "global.h" #include "test/battle.h" #include "battle_ai_util.h" +#include "test/test.h" ASSUMPTIONS { @@ -15,6 +18,7 @@ AI_SINGLE_BATTLE_TEST("AI sees increased base power of Facade") PARAMETRIZE { status1 = STATUS1_BURN; expectedMove = MOVE_FACADE; } GIVEN { + WITH_CONFIG(CONFIG_BURN_FACADE_DMG, GEN_6); ASSUME(GetMoveEffect(MOVE_FACADE) == EFFECT_FACADE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { HP(60); } @@ -159,6 +163,7 @@ AI_SINGLE_BATTLE_TEST("AI can choose Counter or Mirror Coat if the predicted mov ASSUME(GetMoveEffect(MOVE_MIRROR_COAT) == EFFECT_MIRROR_COAT); ASSUME(GetMoveCategory(MOVE_STRENGTH) == DAMAGE_CATEGORY_PHYSICAL); ASSUME(GetMoveCategory(MOVE_POWER_GEM) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMovePower(MOVE_POWER_GEM) == 80); // Gen 5's 70 power causes the test to fail AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { HP(102); Speed(100); Moves(opponentMove, MOVE_STRENGTH); } @@ -173,7 +178,7 @@ AI_SINGLE_BATTLE_TEST("AI can choose Counter or Mirror Coat if the predicted mov AI_SINGLE_BATTLE_TEST("AI chooses moves with secondary effect that have a 100% chance to trigger") { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_NONE; } PARAMETRIZE { ability = ABILITY_SERENE_GRACE; } @@ -194,32 +199,66 @@ AI_SINGLE_BATTLE_TEST("AI chooses moves with secondary effect that have a 100% c AI_DOUBLE_BATTLE_TEST("AI chooses moves that cure self or partner") { - u32 status1_0, status1_1, partnerAbility; + u32 status1_0, status1_1, partnerAbility, move; + + PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_NONE; + move = MOVE_HEAL_BELL; partnerAbility = ABILITY_SCRAPPY; } + PARAMETRIZE { status1_0 = STATUS1_TOXIC_POISON; status1_1 = STATUS1_NONE; + move = MOVE_HEAL_BELL; partnerAbility = ABILITY_SCRAPPY; } + PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_PARALYSIS; + move = MOVE_HEAL_BELL; partnerAbility = ABILITY_SCRAPPY; } + PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_PARALYSIS; + move = MOVE_HEAL_BELL; partnerAbility = ABILITY_SOUNDPROOF; } + + PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_NONE; + move = MOVE_REFRESH; partnerAbility = ABILITY_SCRAPPY; } + PARAMETRIZE { status1_0 = STATUS1_TOXIC_POISON; status1_1 = STATUS1_NONE; + move = MOVE_REFRESH; partnerAbility = ABILITY_SCRAPPY; } - PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_NONE; partnerAbility = ABILITY_SCRAPPY; } - PARAMETRIZE { status1_0 = STATUS1_TOXIC_POISON; status1_1 = STATUS1_NONE; partnerAbility = ABILITY_SCRAPPY; } - PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_PARALYSIS; partnerAbility = ABILITY_SCRAPPY; } - PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_PARALYSIS; partnerAbility = ABILITY_SOUNDPROOF; } GIVEN { ASSUME(GetMoveEffect(MOVE_HEAL_BELL) == EFFECT_HEAL_BELL); - WITH_CONFIG(GEN_CONFIG_HEAL_BELL_SOUNDPROOF, GEN_8); + WITH_CONFIG(CONFIG_HEAL_BELL_SOUNDPROOF, GEN_8); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_REGIROCK) { Moves(MOVE_ROCK_SLIDE, MOVE_HEAL_BELL, MOVE_ACID); Status1(status1_0); } + OPPONENT(SPECIES_REGIROCK) { Moves(MOVE_ROCK_SLIDE, move, MOVE_ACID); Status1(status1_0); } OPPONENT(SPECIES_EXPLOUD) { Status1(status1_1); Ability(partnerAbility); } } WHEN { if (status1_0 != STATUS1_NONE || (status1_1 != STATUS1_NONE && partnerAbility != ABILITY_SOUNDPROOF)) - TURN { EXPECT_MOVE(opponentLeft, MOVE_HEAL_BELL); } + TURN { EXPECT_MOVE(opponentLeft, move); } else TURN { EXPECT_MOVE(opponentLeft, MOVE_ROCK_SLIDE); } } } +AI_DOUBLE_BATTLE_TEST("AI uses Refresh only when curing status is worthwhile") +{ + u32 status1; + enum Ability ability; + u32 expectedMove; + + PARAMETRIZE { status1 = STATUS1_BURN; ability = ABILITY_GUTS; expectedMove = MOVE_ROCK_SLIDE; } + PARAMETRIZE { status1 = STATUS1_BURN; ability = ABILITY_PRESSURE; expectedMove = MOVE_REFRESH; } + PARAMETRIZE { status1 = STATUS1_TOXIC_POISON; ability = ABILITY_POISON_HEAL; expectedMove = MOVE_ROCK_SLIDE; } + PARAMETRIZE { status1 = STATUS1_TOXIC_POISON; ability = ABILITY_SCRAPPY; expectedMove = MOVE_REFRESH; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_REFRESH) == EFFECT_REFRESH); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_REGIROCK) { Moves(MOVE_ROCK_SLIDE, MOVE_REFRESH); Status1(status1); Ability(ability); } + OPPONENT(SPECIES_EXPLOUD) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, expectedMove); } + } +} + AI_SINGLE_BATTLE_TEST("AI chooses moves that cure inactive party members") { - u32 status, ability, config; + u32 status, config; + enum Ability ability; PARAMETRIZE { status = STATUS1_TOXIC_POISON; ability = ABILITY_SCRAPPY; } PARAMETRIZE { status = STATUS1_NONE; ability = ABILITY_SCRAPPY; } @@ -228,7 +267,7 @@ AI_SINGLE_BATTLE_TEST("AI chooses moves that cure inactive party members") GIVEN { ASSUME(GetMoveEffect(MOVE_HEAL_BELL) == EFFECT_HEAL_BELL); - WITH_CONFIG(GEN_CONFIG_HEAL_BELL_SOUNDPROOF, config); + WITH_CONFIG(CONFIG_HEAL_BELL_SOUNDPROOF, config); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_REGIROCK) { Moves(MOVE_BODY_PRESS, MOVE_HEAL_BELL); } @@ -253,3 +292,194 @@ AI_SINGLE_BATTLE_TEST("AI prioritizes Pursuit if it would KO opponent") TURN { SWITCH(player, 1); EXPECT_MOVE(opponent, MOVE_PURSUIT); SEND_OUT(player, 1); } } } + +AI_SINGLE_BATTLE_TEST("AI uses Quick Guard against Quick Attack when opponent would die of poison") +{ + GIVEN { + PLAYER(SPECIES_ZUBAT) { Moves(MOVE_QUICK_ATTACK); Status1(STATUS1_TOXIC_POISON); } + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_PREDICT_MOVE); + OPPONENT(SPECIES_RATTATA) { Moves(MOVE_QUICK_GUARD, MOVE_TACKLE); } + } WHEN { + TURN { MOVE(player, MOVE_QUICK_ATTACK); EXPECT_MOVE(opponent, MOVE_QUICK_GUARD); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Wide Guard against Earthquake when opponent would die of poison") +{ + GIVEN { + PLAYER(SPECIES_ZUBAT) { Moves(MOVE_EARTHQUAKE); Status1(STATUS1_TOXIC_POISON); } + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_PREDICT_MOVE); + OPPONENT(SPECIES_RATTATA) { Moves(MOVE_WIDE_GUARD, MOVE_TACKLE); } + } WHEN { + TURN { MOVE(player, MOVE_EARTHQUAKE); EXPECT_MOVE(opponent, MOVE_WIDE_GUARD); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Worry Seed against Rest") +{ + u32 move; + u64 aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT; + + PARAMETRIZE { move = MOVE_REST; } + PARAMETRIZE { move = MOVE_EXTREME_SPEED; } + PARAMETRIZE { move = MOVE_REST; aiFlags |= AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; } + PARAMETRIZE { move = MOVE_EXTREME_SPEED; aiFlags |= AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; } + GIVEN { + AI_FLAGS(aiFlags); + PLAYER(SPECIES_ZIGZAGOON) { Moves(move, MOVE_SLEEP_TALK, MOVE_HEADBUTT); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_WORRY_SEED, MOVE_HEADBUTT); } + } WHEN { + if (move == MOVE_REST) + TURN { MOVE(player, MOVE_HEADBUTT); EXPECT_MOVE(opponent, MOVE_WORRY_SEED); } + else + TURN { MOVE(player, MOVE_HEADBUTT); NOT_EXPECT_MOVE(opponent, MOVE_WORRY_SEED); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Simple Beam against Contrary Leaf Storm") +{ + enum Ability ability, move; + PARAMETRIZE { ability = ABILITY_CONTRARY; move = MOVE_LEAF_STORM; } + PARAMETRIZE { ability = ABILITY_CONTRARY; move = MOVE_CHARGE_BEAM; } + PARAMETRIZE { ability = ABILITY_OVERGROW; move = MOVE_CHARGE_BEAM; } + + GIVEN { + PLAYER(SPECIES_SERPERIOR) { Moves(move); Ability(ability); } + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); + OPPONENT(SPECIES_SWOOBAT) { Moves(MOVE_GUST, MOVE_SIMPLE_BEAM); } + } WHEN { + if (ability == ABILITY_CONTRARY && move == MOVE_LEAF_STORM) + TURN { MOVE(player, move); EXPECT_MOVE(opponent, MOVE_SIMPLE_BEAM); } + else + TURN { MOVE(player, move); NOT_EXPECT_MOVE(opponent, MOVE_SIMPLE_BEAM); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Skill Swap against Poison Heal") +{ + u8 status; + u64 aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT; + PARAMETRIZE { status = STATUS1_POISON; } + PARAMETRIZE { status = STATUS1_POISON; aiFlags |= AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; } + PARAMETRIZE { status = STATUS1_TOXIC_POISON; } + PARAMETRIZE { status = STATUS1_TOXIC_POISON; aiFlags |= AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; } + + GIVEN { + PLAYER(SPECIES_SHROOMISH) { Ability(ABILITY_POISON_HEAL); Status1(status); } + AI_FLAGS(aiFlags); + OPPONENT(SPECIES_SPINDA) { Moves(MOVE_SKILL_SWAP, MOVE_HEADBUTT); } + } WHEN { + if (status == STATUS1_TOXIC_POISON) + TURN { EXPECT_MOVE(opponent, MOVE_SKILL_SWAP); } + else + TURN { NOT_EXPECT_MOVE(opponent, MOVE_SKILL_SWAP); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Trick Room (singles)") +{ + u32 speed; + PARAMETRIZE { speed = 10; } + PARAMETRIZE { speed = 20; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Speed(11); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(speed); Moves(MOVE_TACKLE, MOVE_TRICK_ROOM); } + } WHEN { + if (speed == 10) + TURN { EXPECT_MOVE(opponent, MOVE_TRICK_ROOM); } + else + TURN { NOT_EXPECT_MOVE(opponent, MOVE_TRICK_ROOM); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Quick Guard against Quick Attack when opponent would take poison damage") +{ + PASSES_RANDOMLY(PREDICT_MOVE_CHANCE, 100, RNG_AI_PREDICT_MOVE); + GIVEN { + PLAYER(SPECIES_RATTATA) { Moves(MOVE_QUICK_ATTACK); Status1(STATUS1_TOXIC_POISON); } + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_PREDICT_MOVE); + OPPONENT(SPECIES_RATTATA) { Moves(MOVE_QUICK_GUARD, MOVE_TACKLE); } + } WHEN { + TURN { MOVE(player, MOVE_QUICK_ATTACK); EXPECT_MOVE(opponent, MOVE_QUICK_GUARD); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Wide Guard against Earthquake when opponent would take poison damage") +{ + PASSES_RANDOMLY(PREDICT_MOVE_CHANCE, 100, RNG_AI_PREDICT_MOVE); + GIVEN { + PLAYER(SPECIES_RATTATA) { Moves(MOVE_EARTHQUAKE); Status1(STATUS1_TOXIC_POISON); } + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_PREDICT_MOVE); + OPPONENT(SPECIES_RATTATA) { Moves(MOVE_WIDE_GUARD, MOVE_TACKLE); } + } WHEN { + TURN { MOVE(player, MOVE_EARTHQUAKE); EXPECT_MOVE(opponent, MOVE_WIDE_GUARD); } + } +} + +AI_SINGLE_BATTLE_TEST("AI sees Shield Dust immunity to additional effects") +{ + enum Ability ability; + PARAMETRIZE { ability = ABILITY_SHIELD_DUST; } + PARAMETRIZE { ability = ABILITY_TINTED_LENS; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_VENOMOTH) { Ability(ability); Moves(MOVE_CELEBRATE, MOVE_POUND); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CHILLING_WATER, MOVE_BRINE); } + } WHEN { + if (ability == ABILITY_SHIELD_DUST) + TURN { EXPECT_MOVE(opponent, MOVE_BRINE); } + else + TURN { EXPECT_MOVE(opponent, MOVE_CHILLING_WATER); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI sees type-changing moves as the correct type") +{ + u32 species, fieldStatus, ability; + u64 aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; + + PARAMETRIZE { fieldStatus = MOVE_RAIN_DANCE; species = SPECIES_PRIMARINA; ability = ABILITY_NONE; } + PARAMETRIZE { fieldStatus = MOVE_RAIN_DANCE; species = SPECIES_PRIMARINA; ability = ABILITY_LIQUID_VOICE; } + PARAMETRIZE { fieldStatus = MOVE_ELECTRIC_TERRAIN; species = SPECIES_GEODUDE_ALOLA; ability = ABILITY_GALVANIZE; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + fieldStatus = MOVE_RAIN_DANCE; species = SPECIES_PRIMARINA; ability = ABILITY_NONE; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + fieldStatus = MOVE_RAIN_DANCE; species = SPECIES_PRIMARINA; ability = ABILITY_LIQUID_VOICE; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + fieldStatus = MOVE_ELECTRIC_TERRAIN; species = SPECIES_GEODUDE_ALOLA; ability = ABILITY_GALVANIZE; } + + GIVEN { + AI_FLAGS(aiFlags); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(fieldStatus, MOVE_RETURN, MOVE_TAUNT); } + OPPONENT(species) { Ability(ability); Moves(MOVE_HYPER_VOICE); } + } WHEN { + if (ability != ABILITY_NONE) + TURN { EXPECT_MOVE(opponentLeft, fieldStatus); } + else + TURN { NOT_EXPECT_MOVE(opponentLeft, fieldStatus); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Sparkling Aria to cure an enemy with Guts") +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_GUTS; } + PARAMETRIZE { ability = ABILITY_BULLETPROOF; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_URSALUNA) { Ability(ability); Moves(MOVE_HEADLONG_RUSH, MOVE_CELEBRATE); Status1(STATUS1_BURN); } + OPPONENT(SPECIES_PRIMARINA) { Moves(MOVE_SPARKLING_ARIA, MOVE_SCALD); } + } WHEN { + if (ability == ABILITY_GUTS) + TURN { EXPECT_MOVE(opponent, MOVE_SPARKLING_ARIA); } + else + TURN { EXPECT_MOVE(opponent, MOVE_SCALD); } + } +} diff --git a/test/battle/ai/ai_choice.c b/test/battle/ai/ai_choice.c index fc3706ca290c..e8d3a8e42a51 100644 --- a/test/battle/ai/ai_choice.c +++ b/test/battle/ai/ai_choice.c @@ -10,7 +10,8 @@ ASSUMPTIONS AI_SINGLE_BATTLE_TEST("Choiced PokΓ©mon switch out after using a status move once") { - u32 j, ability = ABILITY_NONE, heldItem = ITEM_NONE; + u32 j, heldItem = ITEM_NONE; + enum Ability ability = ABILITY_NONE; static const u32 choiceItems[] = { ITEM_CHOICE_SPECS, @@ -46,7 +47,7 @@ AI_SINGLE_BATTLE_TEST("Choiced PokΓ©mon switch out after using a status move onc AI_SINGLE_BATTLE_TEST("Choiced PokΓ©mon only consider their own status moves when determining if they should switch") { - GIVEN + GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_RISKY | AI_FLAG_SMART_SWITCHING | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_MON_CHOICES); PLAYER(SPECIES_ZIGZAGOON) { Speed(4); Moves(MOVE_TAIL_WHIP, MOVE_SCRATCH); } @@ -61,7 +62,8 @@ AI_SINGLE_BATTLE_TEST("Choiced PokΓ©mon only consider their own status moves whe AI_SINGLE_BATTLE_TEST("Choiced PokΓ©mon won't use stat boosting moves") { // Moves defined by MOVE_TARGET_USER (with exceptions?) - u32 j, ability = ABILITY_NONE, heldItem = ITEM_NONE; + u32 j, heldItem = ITEM_NONE; + enum Ability ability = ABILITY_NONE; static const u32 choiceItems[] = { ITEM_CHOICE_SPECS, @@ -93,8 +95,8 @@ AI_SINGLE_BATTLE_TEST("Choiced PokΓ©mon won't use stat boosting moves") AI_SINGLE_BATTLE_TEST("Choiced PokΓ©mon won't use status move if they are the only party member") { - u32 j, ability = ABILITY_NONE, isAlive = 0, heldItem = ITEM_NONE; - + u32 j, isAlive = 0, heldItem = ITEM_NONE; + enum Ability ability = ABILITY_NONE; static const u32 choiceItems[] = { ITEM_CHOICE_SPECS, ITEM_CHOICE_BAND, @@ -128,8 +130,8 @@ AI_SINGLE_BATTLE_TEST("Choiced PokΓ©mon won't use status move if they are the on AI_SINGLE_BATTLE_TEST("Choiced PokΓ©mon won't use status move if they don't have a good switchin") { - u32 j, ability = ABILITY_NONE, move = MOVE_NONE, species = SPECIES_NONE, heldItem = ITEM_NONE; - + u32 j, move = MOVE_NONE, species = SPECIES_NONE, heldItem = ITEM_NONE; + enum Ability ability = ABILITY_NONE; static const u32 choiceItems[] = { ITEM_CHOICE_SPECS, ITEM_CHOICE_BAND, @@ -199,7 +201,7 @@ AI_SINGLE_BATTLE_TEST("Choiced PokΓ©mon won't use status move if they are trappe AI_SINGLE_BATTLE_TEST("Choiced PokΓ©mon will switch if locked into a move the player is immune to") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_GASTLY].types[0] == TYPE_GHOST); + ASSUME(GetSpeciesType(SPECIES_GASTLY, 0) == TYPE_GHOST); ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER); ASSUME(GetMoveType(MOVE_BODY_SLAM) == TYPE_NORMAL); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); @@ -217,7 +219,7 @@ AI_SINGLE_BATTLE_TEST("Choiced PokΓ©mon will only see choiced moves when conside { PASSES_RANDOMLY(SHOULD_SWITCH_HASBADODDS_PERCENTAGE, 100, RNG_AI_SWITCH_HASBADODDS); GIVEN { - ASSUME(gSpeciesInfo[SPECIES_GASTLY].types[0] == TYPE_GHOST); + ASSUME(GetSpeciesType(SPECIES_GASTLY, 0) == TYPE_GHOST); ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER); ASSUME(GetMoveType(MOVE_BODY_SLAM) == TYPE_NORMAL); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES); @@ -235,7 +237,7 @@ AI_SINGLE_BATTLE_TEST("Choiced PokΓ©mon will only see choiced moves when conside { PASSES_RANDOMLY(SHOULD_SWITCH_ABSORBS_MOVE_PERCENTAGE, 100, RNG_AI_SWITCH_ABSORBING); GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SANDSHREW].types[0] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_SANDSHREW, 0) == TYPE_GROUND); ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL); ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); diff --git a/test/battle/ai/ai_double_ace.c b/test/battle/ai/ai_double_ace.c index ce8c484b4a25..38b7d1dcd898 100644 --- a/test/battle/ai/ai_double_ace.c +++ b/test/battle/ai/ai_double_ace.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); ASSUME(GetMoveType(MOVE_CRUNCH) == TYPE_DARK); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) == TYPE_PSYCHIC); } AI_DOUBLE_BATTLE_TEST("AI_FLAG_DOUBLE_ACE_POKEMON: U-Turn won't send out any of the Ace Mons if other options exist") @@ -76,7 +76,7 @@ AI_DOUBLE_BATTLE_TEST("AI_FLAG_DOUBLE_ACE_POKEMON: U-Turn will send out an Ace M AI_DOUBLE_BATTLE_TEST("AI_FLAG_DOUBLE_ACE_POKEMON: Ace mons won't be switched in even if they are the best candidates") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_GENGAR].types[0] == TYPE_GHOST); + ASSUME(GetSpeciesType(SPECIES_GENGAR, 0) == TYPE_GHOST); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_SMART_SWITCHING | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_DOUBLE_ACE_POKEMON); PLAYER(SPECIES_GENGAR) { Level(10); } @@ -94,3 +94,35 @@ AI_DOUBLE_BATTLE_TEST("AI_FLAG_DOUBLE_ACE_POKEMON: Ace mons won't be switched in TURN { EXPECT_SWITCH(opponentLeft, 2); } } } + +AI_DOUBLE_BATTLE_TEST("AI_FLAG_DOUBLE_ACE_POKEMON: sends out Ace mons when no other options remain mid-battle") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_SMART_SWITCHING | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_DOUBLE_ACE_POKEMON); + + PLAYER(SPECIES_WOBBUFFET) { Level(50); Speed(200); Moves(MOVE_THUNDERBOLT, MOVE_CELEBRATE); SpAttack(200); } + PLAYER(SPECIES_WOBBUFFET) { Level(50); Speed(150); Moves(MOVE_THUNDERBOLT, MOVE_CELEBRATE); SpAttack(200); } + + OPPONENT(SPECIES_ZIGZAGOON) { Level(5); HP(1); Speed(1); Moves(MOVE_SPLASH); } + OPPONENT(SPECIES_POOCHYENA) { Level(5); HP(1); Speed(1); Moves(MOVE_SPLASH); } + + // Aces + OPPONENT(SPECIES_MIGHTYENA) { Level(50); Speed(10); Moves(MOVE_CRUNCH); } + OPPONENT(SPECIES_GENGAR) { Level(50); Speed(10); Moves(MOVE_SPLASH); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_THUNDERBOLT, target: opponentLeft); + MOVE(playerRight, MOVE_CELEBRATE); + EXPECT_MOVE(opponentLeft, MOVE_SPLASH); + EXPECT_MOVE(opponentRight, MOVE_SPLASH); + EXPECT_SEND_OUT(opponentLeft, 3); + } + TURN { + MOVE(playerLeft, MOVE_CELEBRATE); + MOVE(playerRight, MOVE_THUNDERBOLT, target: opponentRight); + EXPECT_MOVE(opponentLeft, MOVE_SPLASH); + EXPECT_MOVE(opponentRight, MOVE_SPLASH); + EXPECT_SEND_OUT(opponentRight, 2); + } + } +} diff --git a/test/battle/ai/ai_doubles.c b/test/battle/ai/ai_doubles.c index 5edc271fff26..746789cf5ebc 100644 --- a/test/battle/ai/ai_doubles.c +++ b/test/battle/ai/ai_doubles.c @@ -56,6 +56,88 @@ AI_DOUBLE_BATTLE_TEST("AI will not use Helping Hand if partner does not have any } } +AI_DOUBLE_BATTLE_TEST("AI skips Trick/Bestow when items are missing or target already holds one") +{ + u16 move = MOVE_NONE, atkItem = ITEM_NONE, targetItem = ITEM_NONE; + + PARAMETRIZE { move = MOVE_TRICK; atkItem = ITEM_NONE; targetItem = ITEM_NONE; } + PARAMETRIZE { move = MOVE_BESTOW; atkItem = ITEM_NONE; targetItem = ITEM_NONE; } + PARAMETRIZE { move = MOVE_BESTOW; atkItem = ITEM_ORAN_BERRY; targetItem = ITEM_LEFTOVERS; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET) { Item(targetItem); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_SCRATCH); Item(atkItem); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE); } + } WHEN { + TURN { NOT_EXPECT_MOVE(opponentLeft, move); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI skips Trick/Bestow with unexchangeable items") +{ + u16 move = MOVE_NONE, atkItem = ITEM_NONE, targetItem = ITEM_NONE; + + PARAMETRIZE { move = MOVE_TRICK; atkItem = ITEM_ORANGE_MAIL; targetItem = ITEM_NONE; } + PARAMETRIZE { move = MOVE_TRICK; atkItem = ITEM_ORAN_BERRY; targetItem = ITEM_ORANGE_MAIL; } + PARAMETRIZE { move = MOVE_BESTOW; atkItem = ITEM_ORANGE_MAIL; targetItem = ITEM_NONE; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET) { Item(targetItem); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_SCRATCH); Item(atkItem); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE); } + } WHEN { + TURN { NOT_EXPECT_MOVE(opponentLeft, move); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI skips Trick/Bestow around Sticky Hold") +{ + u16 move = MOVE_NONE, atkItem = ITEM_ORAN_BERRY, targetItem = ITEM_NONE; + enum Ability atkAbility = ABILITY_PRESSURE, targetAbility = ABILITY_PRESSURE; + + PARAMETRIZE { move = MOVE_TRICK; atkAbility = ABILITY_STICKY_HOLD; targetAbility = ABILITY_PRESSURE; targetItem = ITEM_LEFTOVERS; } + PARAMETRIZE { move = MOVE_TRICK; atkAbility = ABILITY_PRESSURE; targetAbility = ABILITY_STICKY_HOLD; targetItem = ITEM_LEFTOVERS; } + PARAMETRIZE { move = MOVE_BESTOW; atkAbility = ABILITY_STICKY_HOLD; targetAbility = ABILITY_PRESSURE; targetItem = ITEM_NONE; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET) { Ability(targetAbility); Item(targetItem); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Ability(atkAbility); Item(atkItem); Moves(move, MOVE_SCRATCH); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE); } + } WHEN { + TURN { NOT_EXPECT_MOVE(opponentLeft, move); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI skips Trick/Bestow if the target has a Substitute") +{ + ASSUME(GetMoveEffect(MOVE_SUBSTITUTE) == EFFECT_SUBSTITUTE); + + u16 move = MOVE_NONE, atkItem = ITEM_NONE, targetItem = ITEM_NONE; + + PARAMETRIZE { move = MOVE_TRICK; atkItem = ITEM_ORAN_BERRY; targetItem = ITEM_LEFTOVERS; } + PARAMETRIZE { move = MOVE_BESTOW; atkItem = ITEM_ORAN_BERRY; targetItem = ITEM_NONE; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_SUBSTITUTE, MOVE_CELEBRATE); Item(targetItem); Speed(20); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); Speed(20); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_SCRATCH); Item(atkItem); Speed(1); Attack(1); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); Speed(1); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_SUBSTITUTE); + MOVE(playerRight, MOVE_CELEBRATE); + } + TURN { NOT_EXPECT_MOVE(opponentLeft, move); } + } +} + AI_DOUBLE_BATTLE_TEST("AI will not use a status move if partner already chose Helping Hand") { s32 j; @@ -69,13 +151,14 @@ AI_DOUBLE_BATTLE_TEST("AI will not use a status move if partner already chose He } GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HELPING_HAND); } - OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH, statusMove); } + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, statusMove, MOVE_WATER_GUN); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, statusMove, MOVE_WATER_GUN); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HELPING_HAND, MOVE_EXPLOSION); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH, statusMove, MOVE_WATER_GUN); } } WHEN { - TURN { NOT_EXPECT_MOVE(opponentRight, statusMove); + TURN { EXPECT_MOVE(opponentLeft, MOVE_HELPING_HAND); + NOT_EXPECT_MOVE(opponentRight, statusMove); SCORE_LT_VAL(opponentRight, statusMove, AI_SCORE_DEFAULT, target:playerLeft); SCORE_LT_VAL(opponentRight, statusMove, AI_SCORE_DEFAULT, target:playerRight); SCORE_LT_VAL(opponentRight, statusMove, AI_SCORE_DEFAULT, target:opponentLeft); @@ -85,6 +168,85 @@ AI_DOUBLE_BATTLE_TEST("AI will not use a status move if partner already chose He } } +TO_DO_BATTLE_TEST("AI understands Instruct") + +TO_DO_BATTLE_TEST("AI understands Quick Guard") +TO_DO_BATTLE_TEST("AI understands Wide Guard") + +AI_DOUBLE_BATTLE_TEST("AI won't use the same nondamaging move as its partner for no reason") +{ + u32 move; + PARAMETRIZE { move = MOVE_AROMATHERAPY; } + PARAMETRIZE { move = MOVE_ELECTRIC_TERRAIN; } + PARAMETRIZE { move = MOVE_FOLLOW_ME; } + PARAMETRIZE { move = MOVE_GRASSY_TERRAIN; } + PARAMETRIZE { move = MOVE_GRAVITY; } + PARAMETRIZE { move = MOVE_HAIL; } + PARAMETRIZE { move = MOVE_HEAL_BELL; } + PARAMETRIZE { move = MOVE_LIGHT_SCREEN; } + PARAMETRIZE { move = MOVE_LUCKY_CHANT; } + PARAMETRIZE { move = MOVE_MAGIC_ROOM; } + PARAMETRIZE { move = MOVE_MISTY_TERRAIN; } + PARAMETRIZE { move = MOVE_MUD_SPORT; } + PARAMETRIZE { move = MOVE_PSYCHIC_TERRAIN; } + PARAMETRIZE { move = MOVE_RAIN_DANCE; } + PARAMETRIZE { move = MOVE_REFLECT; } + PARAMETRIZE { move = MOVE_SAFEGUARD; } + PARAMETRIZE { move = MOVE_SANDSTORM; } + PARAMETRIZE { move = MOVE_SNOWSCAPE; } + PARAMETRIZE { move = MOVE_SPOTLIGHT; } + PARAMETRIZE { move = MOVE_STEALTH_ROCK; } + PARAMETRIZE { move = MOVE_SUNNY_DAY; } + PARAMETRIZE { move = MOVE_TAILWIND; } + PARAMETRIZE { move = MOVE_TEETER_DANCE; } + PARAMETRIZE { move = MOVE_TRICK_ROOM; } + PARAMETRIZE { move = MOVE_WATER_SPORT; } + PARAMETRIZE { move = MOVE_COURT_CHANGE; } + PARAMETRIZE { move = MOVE_PERISH_SONG; } + PARAMETRIZE { move = MOVE_STICKY_WEB; } + PARAMETRIZE { move = MOVE_TEATIME; } + PARAMETRIZE { move = MOVE_WONDER_ROOM; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_TACKLE); Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_TACKLE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_TACKLE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_TACKLE); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, move); EXPECT_MOVE(opponentRight, MOVE_TACKLE); } + } +} + +AI_DOUBLE_BATTLE_TEST("Heal Bell and Jungle Healing skip curing a partner that benefits from burn") +{ + u32 move; + + PARAMETRIZE { move = MOVE_HEAL_BELL; } + PARAMETRIZE { move = MOVE_JUNGLE_HEALING; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_HEAL_BELL) == EFFECT_HEAL_BELL); + ASSUME(GetMoveEffect(MOVE_JUNGLE_HEALING) == EFFECT_JUNGLE_HEALING); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_MEMENTO); Speed(1); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_MEMENTO); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_SCRATCH); Speed(20); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_GUTS); Moves(MOVE_TACKLE); Status1(STATUS1_BURN); MaxHP(200); HP(200); Speed(10); } + } WHEN { + TURN { + NOT_EXPECT_MOVE(opponentLeft, move); + EXPECT_MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); + EXPECT_MOVE(opponentRight, MOVE_TACKLE, target: playerLeft); + MOVE(playerLeft, MOVE_MEMENTO); + MOVE(playerRight, MOVE_MEMENTO); + } + } +} + AI_DOUBLE_BATTLE_TEST("AI will not choose Earthquake if it damages the partner without a positive effect") { ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); @@ -132,7 +294,8 @@ AI_DOUBLE_BATTLE_TEST("AI will choose Bulldoze if it triggers its ally's ability ASSUME(GetMoveType(MOVE_BULLDOZE) == TYPE_GROUND); ASSUME(MoveHasAdditionalEffect(MOVE_BULLDOZE, MOVE_EFFECT_SPD_MINUS_1)); - u32 species, ability, currentHP; + u32 species, currentHP; + enum Ability ability; PARAMETRIZE { species = SPECIES_KINGAMBIT; ability = ABILITY_DEFIANT; currentHP = 400; } PARAMETRIZE { species = SPECIES_SHUCKLE; ability = ABILITY_CONTRARY; currentHP = 400; } @@ -159,7 +322,7 @@ AI_DOUBLE_BATTLE_TEST("AI will choose Beat Up on an ally with Justified if it wi ASSUME(GetMoveEffect(MOVE_BEAT_UP) == EFFECT_BEAT_UP); ASSUME(GetMoveType(MOVE_BEAT_UP) == TYPE_DARK); - u32 defAbility, atkAbility, currentHP; + enum Ability defAbility, atkAbility, currentHP; PARAMETRIZE { defAbility = ABILITY_FLASH_FIRE; atkAbility = ABILITY_SCRAPPY; currentHP = 400; } PARAMETRIZE { defAbility = ABILITY_JUSTIFIED; atkAbility = ABILITY_SCRAPPY; currentHP = 400; } @@ -283,7 +446,7 @@ AI_DOUBLE_BATTLE_TEST("AI will trigger its ally's Weakness Policy") } } -AI_DOUBLE_BATTLE_TEST("AI will only explode and kill everything on the field with Risky or Will Suicide") +AI_DOUBLE_BATTLE_TEST("AI will only explode and kill everything on the field with Risky or Will Suicide (doubles)") { ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); @@ -308,6 +471,36 @@ AI_DOUBLE_BATTLE_TEST("AI will only explode and kill everything on the field wit } } +AI_DOUBLE_BATTLE_TEST("Battler 3 has Battler 1 AI flags set correctly (doubles)") +{ + ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + + u32 aiFlags; + u32 battler; + + PARAMETRIZE { aiFlags = 0; battler = 1; } + PARAMETRIZE { aiFlags = 0; battler = 3; } + PARAMETRIZE { aiFlags = AI_FLAG_RISKY; battler = 3; } + PARAMETRIZE { aiFlags = AI_FLAG_RISKY; battler = 1; } + PARAMETRIZE { aiFlags = AI_FLAG_WILL_SUICIDE; battler = 1; } + PARAMETRIZE { aiFlags = AI_FLAG_WILL_SUICIDE; battler = 3; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + BATTLER_AI_FLAGS(battler, aiFlags); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_VOLTORB) { Moves(MOVE_EXPLOSION, MOVE_ELECTRO_BALL); HP(1); } + OPPONENT(SPECIES_ELECTRODE) { Moves(MOVE_EXPLOSION, MOVE_ELECTRO_BALL); HP(1); } + } WHEN { + if (aiFlags == 0 || battler == 3) + TURN { EXPECT_MOVE(opponentLeft, MOVE_ELECTRO_BALL, target: playerLeft); EXPECT_MOVE(opponentRight, MOVE_ELECTRO_BALL, target: playerLeft); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_EXPLOSION, target: playerLeft); EXPECT_MOVE(opponentRight, MOVE_EXPLOSION); } + } +} + AI_DOUBLE_BATTLE_TEST("AI sees corresponding absorbing abilities on partners") { ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); @@ -319,7 +512,8 @@ AI_DOUBLE_BATTLE_TEST("AI sees corresponding absorbing abilities on partners") ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); - u32 ability, move, species; + enum Ability ability; + u32 move, species; PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; move = MOVE_DISCHARGE; } PARAMETRIZE { species = SPECIES_PIKACHU; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; } @@ -348,40 +542,33 @@ AI_DOUBLE_BATTLE_TEST("AI sees corresponding absorbing abilities on partners") } } -AI_DOUBLE_BATTLE_TEST("AI knows if redirection abilities provide immunity to allies") +AI_DOUBLE_BATTLE_TEST("AI treats an ally's redirection ability appropriately") { - KNOWN_FAILING; - ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); - ASSUME(GetMoveType(MOVE_DISCHARGE) == TYPE_ELECTRIC); - ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); - ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER); - - u32 ability, move, species, config; + u32 ability, move, species, config, expectedMove; - PARAMETRIZE { species = SPECIES_SEAKING; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; config = GEN_4; } - PARAMETRIZE { species = SPECIES_SEAKING; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; config = GEN_5; } - PARAMETRIZE { species = SPECIES_SHELLOS; ability = ABILITY_STORM_DRAIN; move = MOVE_SURF; config = GEN_4; } - PARAMETRIZE { species = SPECIES_SHELLOS; ability = ABILITY_STORM_DRAIN; move = MOVE_SURF; config = GEN_5; } + PARAMETRIZE { species = SPECIES_SEAKING; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; config = GEN_4; expectedMove = MOVE_HEADBUTT; } + PARAMETRIZE { species = SPECIES_SHELLOS; ability = ABILITY_STORM_DRAIN; move = MOVE_SURF; config = GEN_4; expectedMove = MOVE_HEADBUTT; } + PARAMETRIZE { species = SPECIES_SEAKING; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; config = GEN_5; expectedMove = MOVE_DISCHARGE; } + PARAMETRIZE { species = SPECIES_SHELLOS; ability = ABILITY_STORM_DRAIN; move = MOVE_SURF; config = GEN_5; expectedMove = MOVE_SURF; } GIVEN { ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveType(MOVE_DISCHARGE) == TYPE_ELECTRIC); + ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE); - WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, config); - PLAYER(SPECIES_ZIGZAGOON); - PLAYER(SPECIES_ZIGZAGOON); - OPPONENT(SPECIES_SLAKING) { Moves(move, MOVE_SCRATCH); } + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, config); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_HEADBUTT); } OPPONENT(species) { HP(1); Ability(ability); Moves(MOVE_ROUND); } } WHEN { - if (config == GEN_5) - TURN { EXPECT_MOVE(opponentLeft, move); } - else - TURN { EXPECT_MOVE(opponentLeft, MOVE_SCRATCH); } + TURN { EXPECT_MOVE(opponentLeft, expectedMove); } } } AI_DOUBLE_BATTLE_TEST("AI recognizes Volt Absorb received from Trace") { - KNOWN_FAILING; // MGriffin's PR that switched two turn charging moves in AI tests broke this test, waiting on a fix GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_MAGNETON); @@ -389,7 +576,7 @@ AI_DOUBLE_BATTLE_TEST("AI recognizes Volt Absorb received from Trace") OPPONENT(SPECIES_JOLTEON) { Ability(ABILITY_VOLT_ABSORB); Moves(MOVE_THUNDER_WAVE, MOVE_THUNDERSHOCK, MOVE_WATER_GUN); } OPPONENT(SPECIES_JOLTEON) { Ability(ABILITY_VOLT_ABSORB); Moves(MOVE_THUNDER_WAVE, MOVE_THUNDERSHOCK, MOVE_WATER_GUN); } } WHEN { - TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_THUNDERSHOCK); NOT_EXPECT_MOVE(opponentLeft, MOVE_THUNDER_WAVE); NOT_EXPECT_MOVE(opponentRight, MOVE_THUNDER_WAVE); } + TURN { NOT_EXPECT_MOVES(opponentLeft, MOVE_THUNDERSHOCK, MOVE_THUNDER_WAVE); NOT_EXPECT_MOVE(opponentRight, MOVE_THUNDER_WAVE); } } THEN { EXPECT(gAiLogicData->abilities[B_POSITION_PLAYER_RIGHT] == ABILITY_VOLT_ABSORB); } @@ -410,3 +597,284 @@ AI_DOUBLE_BATTLE_TEST("AI prioritizes Skill Swapping Contrary to allied mons tha } } +// Sandstorm is omitted on purpose. +// Tornadus is currently not willing to set up Sandstorm for its ally, but the actual purpose of this test is to demonstrate that Tornadus or Whimsicott will perform standard VGC openers. +// Rain Dance, Sunny Day, and Snowscape are the actually important ones; setting up a good Sandstorm test + functionality is less important and will be done in later PRs. +AI_DOUBLE_BATTLE_TEST("AI sets up weather for its ally") +{ + u32 goodWeather, badWeather, weatherTrigger; + u64 aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; + + PARAMETRIZE { goodWeather = MOVE_SUNNY_DAY; badWeather = MOVE_RAIN_DANCE; weatherTrigger = MOVE_SOLAR_BEAM; } + PARAMETRIZE { goodWeather = MOVE_RAIN_DANCE; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_THUNDER; } + PARAMETRIZE { goodWeather = MOVE_HAIL; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; } + PARAMETRIZE { goodWeather = MOVE_SNOWSCAPE; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; } + PARAMETRIZE { goodWeather = MOVE_SANDSTORM; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_SHORE_UP; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + goodWeather = MOVE_SUNNY_DAY; badWeather = MOVE_RAIN_DANCE; weatherTrigger = MOVE_SOLAR_BEAM; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + goodWeather = MOVE_RAIN_DANCE; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_THUNDER; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + goodWeather = MOVE_HAIL; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + goodWeather = MOVE_SNOWSCAPE; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + goodWeather = MOVE_SANDSTORM; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_SHORE_UP; } + + GIVEN { + AI_FLAGS(aiFlags); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_TORNADUS) { Item(ITEM_SAFETY_GOGGLES); Ability(ABILITY_PRANKSTER); Moves(goodWeather, badWeather, MOVE_RETURN, MOVE_TAUNT); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SAFETY_GOGGLES); Moves(weatherTrigger, MOVE_EARTH_POWER); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, goodWeather); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI sets up terrain for its ally") +{ + u32 goodTerrain, badTerrain, terrainTrigger; + u64 aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; + + PARAMETRIZE { goodTerrain = MOVE_ELECTRIC_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_RISING_VOLTAGE; } + PARAMETRIZE { goodTerrain = MOVE_GRASSY_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_GRASSY_GLIDE; } + PARAMETRIZE { goodTerrain = MOVE_MISTY_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_MISTY_EXPLOSION; } + PARAMETRIZE { goodTerrain = MOVE_PSYCHIC_TERRAIN; badTerrain = MOVE_ELECTRIC_TERRAIN; terrainTrigger = MOVE_EXPANDING_FORCE; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + goodTerrain = MOVE_ELECTRIC_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_RISING_VOLTAGE; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + goodTerrain = MOVE_GRASSY_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_GRASSY_GLIDE; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + goodTerrain = MOVE_MISTY_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_MISTY_EXPLOSION; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + goodTerrain = MOVE_PSYCHIC_TERRAIN; badTerrain = MOVE_ELECTRIC_TERRAIN; terrainTrigger = MOVE_EXPANDING_FORCE; } + + GIVEN { + AI_FLAGS(aiFlags); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(goodTerrain, badTerrain, MOVE_RETURN, MOVE_TAUNT); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(terrainTrigger, MOVE_EARTH_POWER); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, goodTerrain); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI uses After You to set up Trick Room") +{ + u32 move; + + PARAMETRIZE { move = MOVE_TRICK_ROOM; } + PARAMETRIZE { move = MOVE_MOONBLAST; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_AFTER_YOU) == EFFECT_AFTER_YOU); + ASSUME(GetMoveEffect(MOVE_TRICK_ROOM) == EFFECT_TRICK_ROOM); + ASSUME(IsHealingMove(MOVE_DRAINING_KISS)); // Doesn't have the Healing Move flag in Gen 5 + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE); + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + OPPONENT(SPECIES_COMFEY) { Ability(ABILITY_TRIAGE); Speed(5); Moves(MOVE_AFTER_YOU, MOVE_DRAINING_KISS); } + OPPONENT(SPECIES_CLEFAIRY) { Speed(3); Moves(move, MOVE_PSYCHIC); } + } WHEN { + if (move == MOVE_TRICK_ROOM) + TURN { EXPECT_MOVE(opponentLeft, MOVE_AFTER_YOU, target:opponentRight); EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } + else + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_AFTER_YOU); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI uses Trick Room intelligently") +{ + u32 move, ability, speed; + + PARAMETRIZE { move = MOVE_DRAINING_KISS; ability = ABILITY_SYNCHRONIZE; speed = 4; } + PARAMETRIZE { move = MOVE_DAZZLING_GLEAM; ability = ABILITY_SYNCHRONIZE; speed = 4; } + PARAMETRIZE { move = MOVE_DRAINING_KISS; ability = ABILITY_PSYCHIC_SURGE; speed = 4; } + PARAMETRIZE { move = MOVE_DRAINING_KISS; ability = ABILITY_SYNCHRONIZE; speed = 2; } + PARAMETRIZE { move = MOVE_DAZZLING_GLEAM; ability = ABILITY_SYNCHRONIZE; speed = 2; } + PARAMETRIZE { move = MOVE_DRAINING_KISS; ability = ABILITY_PSYCHIC_SURGE; speed = 2; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_AFTER_YOU) == EFFECT_AFTER_YOU); + ASSUME(GetMoveEffect(MOVE_TRICK_ROOM) == EFFECT_TRICK_ROOM); + ASSUME(IsHealingMove(MOVE_DRAINING_KISS)); // Doesn't have the Healing Move flag in Gen 5 + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE); + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + PLAYER(SPECIES_WOBBUFFET) { Speed(speed); } + OPPONENT(SPECIES_COMFEY) { Ability(ABILITY_TRIAGE); Speed(5); Moves(move); } + OPPONENT(SPECIES_INDEEDEE) { Ability(ability); Speed(3); Moves(MOVE_TRICK_ROOM, MOVE_PSYCHIC); } + } WHEN { + if (move == MOVE_DRAINING_KISS && ability != ABILITY_PSYCHIC_SURGE && speed > 3) + TURN { EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } + else + TURN { NOT_EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI uses Trick Room with both battlers on the turn it expires in line with the double Trick Room config") +{ + PASSES_RANDOMLY(DOUBLE_TRICK_ROOM_ON_LAST_TURN_CHANCE, 100, RNG_AI_REFRESH_TRICK_ROOM_ON_LAST_TURN); + GIVEN { + ASSUME(GetMoveEffect(MOVE_TRICK_ROOM) == EFFECT_TRICK_ROOM); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE); + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + PLAYER(SPECIES_WOBBUFFET) { Speed(3); } + OPPONENT(SPECIES_WYNAUT) { Moves(MOVE_TRICK_ROOM, MOVE_PSYCHIC); Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_TRICK_ROOM, MOVE_PSYCHIC); Speed(1); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); NOT_EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); NOT_EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); NOT_EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); NOT_EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } + TURN { EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI uses Helping Hand if it's about to die") +{ + u32 hp; + + PARAMETRIZE { hp = 1; } + PARAMETRIZE { hp = 500; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_HELPING_HAND) == EFFECT_HELPING_HAND); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { HP(hp); Moves(MOVE_HELPING_HAND, MOVE_MUDDY_WATER); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_MUDDY_WATER); } + } WHEN { + if (hp == 1) + TURN { EXPECT_MOVE(opponentLeft, MOVE_HELPING_HAND); } + else + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_HELPING_HAND); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI uses Helping Hand if the ally does notably more damage") +{ + + KNOWN_FAILING; // Failure was masked by test runner issues + GIVEN { + ASSUME(GetMoveEffect(MOVE_HELPING_HAND) == EFFECT_HELPING_HAND); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HELPING_HAND, MOVE_MUD_SLAP); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_MUDDY_WATER); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_HELPING_HAND); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI does not use Helping Hand on Good as Gold ally") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_HELPING_HAND) == EFFECT_HELPING_HAND); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HELPING_HAND, MOVE_MUD_SLAP); } + OPPONENT(SPECIES_GHOLDENGO) { Ability(ABILITY_GOOD_AS_GOLD); Moves(MOVE_MUDDY_WATER); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_MUD_SLAP); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI uses Tailwind") +{ + u32 speed1, speed2, speed3, speed4; + + PARAMETRIZE { speed1 = 20; speed2 = 20; speed3 = 20; speed4 = 20; } + PARAMETRIZE { speed1 = 20; speed2 = 20; speed3 = 5; speed4 = 5; } + PARAMETRIZE { speed1 = 20; speed2 = 20; speed3 = 15; speed4 = 15; } + PARAMETRIZE { speed1 = 1; speed2 = 1; speed3 = 5; speed4 = 5; } + PARAMETRIZE { speed1 = 1; speed2 = 20; speed3 = 15; speed4 = 15; } + PARAMETRIZE { speed1 = 1; speed2 = 20; speed3 = 20; speed4 = 15; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_AFTER_YOU) == EFFECT_AFTER_YOU); + ASSUME(GetMoveEffect(MOVE_TRICK_ROOM) == EFFECT_TRICK_ROOM); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE); + PLAYER(SPECIES_WOBBUFFET) { Speed(speed1); } + PLAYER(SPECIES_WOBBUFFET) { Speed(speed2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(speed3); Moves(MOVE_TAILWIND, MOVE_HEADBUTT); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(speed4); Moves(MOVE_TAILWIND, MOVE_HEADBUTT); } + } WHEN { + if (speed3 > 10) + TURN { EXPECT_MOVE(opponentLeft, MOVE_TAILWIND); } + else + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_TAILWIND); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI uses Guard Split to improve its stats") +{ + + u32 player, opponent; + + PARAMETRIZE { player = SPECIES_SHUCKLE; opponent = SPECIES_PHEROMOSA; } + PARAMETRIZE { player = SPECIES_PHEROMOSA; opponent = SPECIES_SHUCKLE; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_GUARD_SPLIT) == EFFECT_GUARD_SPLIT); + ASSUME(gSpeciesInfo[SPECIES_PHEROMOSA].baseDefense < gSpeciesInfo[SPECIES_WOBBUFFET].baseDefense); + ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseDefense < gSpeciesInfo[SPECIES_SHUCKLE].baseDefense); + ASSUME(gSpeciesInfo[SPECIES_PHEROMOSA].baseSpDefense < gSpeciesInfo[SPECIES_WOBBUFFET].baseSpDefense); + ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseSpDefense < gSpeciesInfo[SPECIES_SHUCKLE].baseSpDefense); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE); + PLAYER(player); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_GUARD_SPLIT, MOVE_NIGHT_SHADE); } + OPPONENT(opponent); + } WHEN { + if (player == SPECIES_SHUCKLE) + TURN { EXPECT_MOVE(opponentLeft, MOVE_GUARD_SPLIT, target:playerLeft); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_GUARD_SPLIT, target:opponentRight); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI uses Power Split to improve its stats") +{ + + u32 player, opponent; + + PARAMETRIZE { player = SPECIES_SHUCKLE; opponent = SPECIES_PHEROMOSA; } + PARAMETRIZE { player = SPECIES_PHEROMOSA; opponent = SPECIES_SHUCKLE; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_POWER_SPLIT) == EFFECT_POWER_SPLIT); + ASSUME(gSpeciesInfo[SPECIES_PHEROMOSA].baseAttack > gSpeciesInfo[SPECIES_WOBBUFFET].baseAttack); + ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseAttack > gSpeciesInfo[SPECIES_SHUCKLE].baseAttack); + ASSUME(gSpeciesInfo[SPECIES_PHEROMOSA].baseSpAttack > gSpeciesInfo[SPECIES_WOBBUFFET].baseSpAttack); + ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseSpAttack > gSpeciesInfo[SPECIES_SHUCKLE].baseSpAttack); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE); + PLAYER(player); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POWER_SPLIT, MOVE_TACKLE, MOVE_ROUND); } + OPPONENT(opponent) { Moves(MOVE_TACKLE, MOVE_ROUND); } + } WHEN { + if (player == SPECIES_PHEROMOSA) + TURN { EXPECT_MOVE(opponentLeft, MOVE_POWER_SPLIT, target:playerLeft); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_POWER_SPLIT, target:opponentRight); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI prefers to Fake Out the opponent vulnerable to flinching.") +{ + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_ZUBAT) { Ability(ABILITY_INNER_FOCUS); } + PLAYER(SPECIES_BRAIXEN) { Ability(ABILITY_BLAZE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_FAKE_OUT, MOVE_BRANCH_POKE, MOVE_ROCK_SMASH); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_FAKE_OUT, target:playerRight); } + } +} diff --git a/test/battle/ai/ai_flag_attacks_partner.c b/test/battle/ai/ai_flag_attacks_partner.c new file mode 100644 index 000000000000..4f2533fa5b44 --- /dev/null +++ b/test/battle/ai/ai_flag_attacks_partner.c @@ -0,0 +1,78 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_ai_util.h" + +AI_DOUBLE_BATTLE_TEST("AI_FLAG_ATTACKS_PARTNER is willing to kill either the partner or the player") +{ + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + + u32 move, level; + + PARAMETRIZE { move = MOVE_BRUTAL_SWING; level = 1; } + PARAMETRIZE { move = MOVE_MIGHTY_CLEAVE; level = 1; } + PARAMETRIZE { move = MOVE_BRUTAL_SWING; level = 100; } + PARAMETRIZE { move = MOVE_MIGHTY_CLEAVE; level = 100; } + PARAMETRIZE { move = MOVE_BRUTAL_SWING; level = 50; } + PARAMETRIZE { move = MOVE_MIGHTY_CLEAVE; level = 50; } + + GIVEN { + ASSUME(GetMovePower(MOVE_OVERDRIVE) == 80); + ASSUME(GetMovePower(MOVE_BRUTAL_SWING) == 60); + ASSUME(GetMovePower(MOVE_MIGHTY_CLEAVE) == 95); + ASSUME(gSpeciesInfo[SPECIES_ZIGZAGOON].baseAttack == gSpeciesInfo[SPECIES_ZIGZAGOON].baseSpAttack); + ASSUME(gSpeciesInfo[SPECIES_ZIGZAGOON].baseDefense == gSpeciesInfo[SPECIES_ZIGZAGOON].baseSpDefense); + ASSUME(gSpeciesInfo[SPECIES_ZIGZAGOON].baseHP == 38); + ASSUME(gSpeciesInfo[SPECIES_ZIGZAGOON].baseAttack == 30); + ASSUME(gSpeciesInfo[SPECIES_ZIGZAGOON].baseDefense == 41); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_ATTACKS_PARTNER); + PLAYER(SPECIES_ZIGZAGOON) { Level(50); } + PLAYER(SPECIES_ZIGZAGOON) { Level(16); } + OPPONENT(SPECIES_ZIGZAGOON) { Level(50); Moves(move, MOVE_OVERDRIVE, MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Level(level); Moves(MOVE_CELEBRATE); } + } WHEN { + TURN + { + if (move == MOVE_MIGHTY_CLEAVE) + { + if (level == 1) + EXPECT_MOVE(opponentLeft, move, target: opponentRight); + else + EXPECT_MOVE(opponentLeft, move, target: playerRight); + } + else + { + if (level == 1 || AI_FLAG_ATTACKS_PARTNER_FOCUSES_PARTNER) + EXPECT_MOVE(opponentLeft, move); + else + EXPECT_MOVE(opponentLeft, MOVE_OVERDRIVE); + } + } + } +} + +AI_DOUBLE_BATTLE_TEST("AI_FLAG_ATTACKS_PARTNER steps on its ally's weather") +{ + u32 weather1, move1, weather2, move2; + + PARAMETRIZE { weather1 = MOVE_SUNNY_DAY; move1 = MOVE_SOLAR_BEAM; weather2 = MOVE_RAIN_DANCE; move2 = MOVE_THUNDER; } + PARAMETRIZE { weather1 = MOVE_RAIN_DANCE; move1 = MOVE_THUNDER; weather2 = MOVE_SUNNY_DAY; move2 = MOVE_SOLAR_BEAM; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_ATTACKS_PARTNER); + PLAYER(SPECIES_WOBBUFFET) { Speed(50); } + PLAYER(SPECIES_WOBBUFFET) { Speed(50); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(75); Moves(weather1, move1, MOVE_HEADBUTT); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); Moves(weather2, move2, MOVE_HEADBUTT); } + } WHEN { + TURN + { + EXPECT_MOVE(opponentLeft, weather1); + EXPECT_MOVE(opponentRight, weather2); + } + TURN + { + EXPECT_MOVE(opponentLeft, move1); + EXPECT_MOVE(opponentRight, weather2); + } + } +} diff --git a/test/battle/ai/ai_flag_predict_move.c b/test/battle/ai/ai_flag_predict_move.c index 97a7c12afa7d..6a8554b73469 100644 --- a/test/battle/ai/ai_flag_predict_move.c +++ b/test/battle/ai/ai_flag_predict_move.c @@ -27,3 +27,18 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_MOVE: AI will still attack you when it sh TURN { MOVE(player, MOVE_SURF); EXPECT_MOVE(opponent, MOVE_LEAF_BLADE); } } } + +AI_SINGLE_BATTLE_TEST("AI won't use Sucker Punch if it expects a move of the same priority bracket and the opponent is faster") +{ + PASSES_RANDOMLY(PREDICT_MOVE_CHANCE, 100, RNG_AI_PREDICT_MOVE); + GIVEN { + ASSUME(GetMovePriority(MOVE_QUICK_ATTACK) == 1); + ASSUME(GetMovePriority(MOVE_SUCKER_PUNCH) == 1); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_PREDICT_MOVE); + PLAYER(SPECIES_WOBBUFFET) { Speed(300); Moves(MOVE_QUICK_ATTACK); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); Moves(MOVE_SUCKER_PUNCH, MOVE_SCRATCH); } + } WHEN { + TURN { MOVE(player, MOVE_QUICK_ATTACK); EXPECT_MOVE(opponent, MOVE_SCRATCH); } + TURN { MOVE(player, MOVE_QUICK_ATTACK); EXPECT_MOVE(opponent, MOVE_SCRATCH); } + } +} diff --git a/test/battle/ai/ai_flag_predict_switch.c b/test/battle/ai/ai_flag_predict_switch.c index b64dea488c1b..6f484b6378b3 100644 --- a/test/battle/ai/ai_flag_predict_switch.c +++ b/test/battle/ai/ai_flag_predict_switch.c @@ -59,7 +59,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH: Considers ShouldSwitch and GetMos // Switching in trapper is an advanced feature of ShouldSwitch that requires GetMostSuitableMonToSwitchInto to also return a specific mon; this passing means the AI can use both in prediction PASSES_RANDOMLY(5, 10, RNG_AI_PREDICT_SWITCH); GIVEN { - ASSUME(B_POWDER_GRASS >= GEN_6); + WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PREDICT_SWITCH | AI_FLAG_PREDICT_INCOMING_MON); PLAYER(SPECIES_SKARMORY) { Moves(MOVE_SCRATCH); } PLAYER(SPECIES_DUGTRIO) { Ability(ABILITY_ARENA_TRAP); Moves(MOVE_ACROBATICS); } diff --git a/test/battle/ai/ai_flag_risky.c b/test/battle/ai/ai_flag_risky.c index 5a2e224d48fa..befefb814b58 100644 --- a/test/battle/ai/ai_flag_risky.c +++ b/test/battle/ai/ai_flag_risky.c @@ -10,8 +10,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_RISKY: AI will blindly Mirror Coat against specia GIVEN { ASSUME(GetMoveEffect(MOVE_MIRROR_COAT) == EFFECT_MIRROR_COAT); - ASSUME(gSpeciesInfo[SPECIES_GROVYLE].baseSpAttack == 85); - ASSUME(gSpeciesInfo[SPECIES_GROVYLE].baseAttack == 65); + ASSUME(GetSpeciesBaseSpAttack(SPECIES_GROVYLE) == 85); + ASSUME(GetSpeciesBaseAttack(SPECIES_GROVYLE) == 65); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiRiskyFlag); PLAYER(SPECIES_GROVYLE) { Level(20); Moves(MOVE_ENERGY_BALL); } OPPONENT(SPECIES_CASTFORM) { Level(20); Moves(MOVE_SCRATCH, MOVE_MIRROR_COAT); } @@ -29,8 +29,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_RISKY: AI will blindly Counter against physical a GIVEN { ASSUME(GetMoveEffect(MOVE_COUNTER) == EFFECT_COUNTER); - ASSUME(gSpeciesInfo[SPECIES_MARSHTOMP].baseAttack == 85); - ASSUME(gSpeciesInfo[SPECIES_MARSHTOMP].baseSpAttack == 60); + ASSUME(GetSpeciesBaseAttack(SPECIES_MARSHTOMP) == 85); + ASSUME(GetSpeciesBaseSpAttack(SPECIES_MARSHTOMP) == 60); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiRiskyFlag); PLAYER(SPECIES_MARSHTOMP) { Level(20); Moves(MOVE_WATERFALL); } OPPONENT(SPECIES_CASTFORM) { Level(20); Moves(MOVE_SCRATCH, MOVE_COUNTER); } @@ -64,13 +64,14 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_RISKY: Mid-battle switches prioritize offensive o PARAMETRIZE { aiRiskyFlag = AI_FLAG_RISKY; } GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | aiRiskyFlag); + ASSUME(P_UPDATED_STATS >= GEN_7); // Swellow's 50 Sp.Atk in Gen 6 instead of the current 75 causes the AI to switch to Electrode + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT | aiRiskyFlag); PLAYER(SPECIES_SWELLOW) { Level(30); Moves(MOVE_WING_ATTACK, MOVE_BOOMBURST); Speed(5); } OPPONENT(SPECIES_PONYTA) { Level(1); Moves(MOVE_NONE); Speed(4); } // Forces switchout OPPONENT(SPECIES_ARON) { Level(30); Moves(MOVE_HEADBUTT); Speed(4); SpDefense(41); } // Mid battle, AI sends out Aron OPPONENT(SPECIES_ELECTRODE) { Level(30); Moves(MOVE_CHARGE_BEAM); Speed(6); Ability(ABILITY_STATIC); } } WHEN { - TURN { MOVE(player, MOVE_WING_ATTACK); EXPECT_SWITCH(opponent, aiRiskyFlag? 2 : 1); } + TURN { MOVE(player, MOVE_WING_ATTACK); EXPECT_SWITCH(opponent, aiRiskyFlag? 2 : 1); } } } diff --git a/test/battle/ai/ai_multi.c b/test/battle/ai/ai_multi.c new file mode 100644 index 000000000000..b46573b4cad6 --- /dev/null +++ b/test/battle/ai/ai_multi.c @@ -0,0 +1,224 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_ai_util.h" + +AI_MULTI_BATTLE_TEST("AI will only explode and kill everything on the field with Risky or Will Suicide (multi)") +{ + ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + + u32 aiFlags; + u32 battler; + + PARAMETRIZE { aiFlags = 0; battler = 1; } + PARAMETRIZE { aiFlags = 0; battler = 3; } + PARAMETRIZE { aiFlags = AI_FLAG_RISKY; battler = 1; } + PARAMETRIZE { aiFlags = AI_FLAG_RISKY; battler = 3; } + PARAMETRIZE { aiFlags = AI_FLAG_WILL_SUICIDE; battler = 1; } + PARAMETRIZE { aiFlags = AI_FLAG_WILL_SUICIDE; battler = 3; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + BATTLER_AI_FLAGS(battler, aiFlags); + MULTI_PLAYER(SPECIES_WOBBUFFET) { HP(1); } + MULTI_PARTNER(SPECIES_WOBBUFFET) { HP(1); } + MULTI_OPPONENT_A(SPECIES_ELECTRODE) { Moves(MOVE_EXPLOSION, MOVE_ELECTRO_BALL); HP(1); } + MULTI_OPPONENT_B(SPECIES_VOLTORB) { Moves(MOVE_EXPLOSION, MOVE_ELECTRO_BALL); HP(1); } + } WHEN { + if (aiFlags == 0) + TURN { EXPECT_MOVE(opponentLeft, MOVE_ELECTRO_BALL, target: playerLeft); EXPECT_MOVE(opponentRight, MOVE_ELECTRO_BALL, target: playerLeft); } + else + TURN { EXPECT_MOVE(&gBattleMons[BATTLE_PARTNER(battler)], MOVE_ELECTRO_BALL, target: playerLeft); EXPECT_MOVE(&gBattleMons[battler], MOVE_EXPLOSION); } + } +} + +AI_ONE_VS_TWO_BATTLE_TEST("AI will only explode and kill everything on the field with Risky or Will Suicide (1v2)") +{ + ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + + u32 aiFlags; + u32 battler; + + PARAMETRIZE { aiFlags = 0; battler = 1; } + PARAMETRIZE { aiFlags = 0; battler = 3; } + PARAMETRIZE { aiFlags = AI_FLAG_RISKY; battler = 3; } + PARAMETRIZE { aiFlags = AI_FLAG_RISKY; battler = 1; } + PARAMETRIZE { aiFlags = AI_FLAG_WILL_SUICIDE; battler = 1; } + PARAMETRIZE { aiFlags = AI_FLAG_WILL_SUICIDE; battler = 3; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + BATTLER_AI_FLAGS(battler, aiFlags); + MULTI_PLAYER(SPECIES_WOBBUFFET) { HP(1); } + MULTI_PLAYER(SPECIES_WOBBUFFET) { HP(1); } + MULTI_OPPONENT_A(SPECIES_ELECTRODE) { Moves(MOVE_EXPLOSION, MOVE_ELECTRO_BALL); HP(1); } + MULTI_OPPONENT_B(SPECIES_VOLTORB) { Moves(MOVE_EXPLOSION, MOVE_ELECTRO_BALL); HP(1); } + } WHEN { + if (aiFlags == 0) + TURN { EXPECT_MOVE(opponentLeft, MOVE_ELECTRO_BALL, target: playerLeft); EXPECT_MOVE(opponentRight, MOVE_ELECTRO_BALL, target: playerLeft); } + else + TURN { EXPECT_MOVE(&gBattleMons[BATTLE_PARTNER(battler)], MOVE_ELECTRO_BALL, target: playerLeft); EXPECT_MOVE(&gBattleMons[battler], MOVE_EXPLOSION); } + } +} + +// Used to test EXPECT_MOVE only on partner +AI_MULTI_BATTLE_TEST("AI partner makes sensible move selections in battle (multi)") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + MULTI_PLAYER(SPECIES_HAUNTER); + MULTI_PLAYER(SPECIES_RATTATA); + // No moves to damage opponents. + MULTI_PARTNER(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL, MOVE_AURA_SPHERE); } + MULTI_OPPONENT_A(SPECIES_RATTATA) { Moves(MOVE_CELEBRATE); HP(1); } + MULTI_OPPONENT_B(SPECIES_KANGASKHAN) { Moves(MOVE_CELEBRATE); } + + } WHEN { + TURN { MOVE(playerLeft, MOVE_AURA_SPHERE, target:opponentRight); EXPECT_MOVE(playerRight, MOVE_AURA_SPHERE, target:opponentLeft); }; + } +} + +// Used to test EXPECT_MOVE only on partner +AI_TWO_VS_ONE_BATTLE_TEST("AI partner makes sensible move selections in battle (2v1)") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + MULTI_PLAYER(SPECIES_HAUNTER); + MULTI_PLAYER(SPECIES_RATTATA); + // No moves to damage opponents. + MULTI_PARTNER(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL, MOVE_AURA_SPHERE); } + MULTI_OPPONENT_A(SPECIES_RATTATA) { Moves(MOVE_CELEBRATE); HP(1); } + MULTI_OPPONENT_A(SPECIES_KANGASKHAN) { Moves(MOVE_CELEBRATE); } + + } WHEN { + TURN { MOVE(playerLeft, MOVE_AURA_SPHERE, target:opponentRight); EXPECT_MOVE(playerRight, MOVE_AURA_SPHERE, target:opponentLeft); }; + } +} + +AI_TWO_VS_ONE_BATTLE_TEST("Battler 3 has Battler 1 AI flags set correctly (2v1)") +{ + ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + + u32 aiFlags; + u32 battler; + + PARAMETRIZE { aiFlags = 0; battler = 1; } + PARAMETRIZE { aiFlags = 0; battler = 3; } + PARAMETRIZE { aiFlags = AI_FLAG_RISKY; battler = 1; } + PARAMETRIZE { aiFlags = AI_FLAG_RISKY; battler = 3; } + PARAMETRIZE { aiFlags = AI_FLAG_WILL_SUICIDE; battler = 1; } + PARAMETRIZE { aiFlags = AI_FLAG_WILL_SUICIDE; battler = 3; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + BATTLER_AI_FLAGS(battler, aiFlags); + MULTI_PLAYER(SPECIES_WOBBUFFET) { HP(1); } + MULTI_PARTNER(SPECIES_WOBBUFFET) { HP(1); } + MULTI_OPPONENT_A(SPECIES_VOLTORB) { Moves(MOVE_EXPLOSION, MOVE_ELECTRO_BALL); HP(1); } + MULTI_OPPONENT_A(SPECIES_ELECTRODE) { Moves(MOVE_EXPLOSION, MOVE_ELECTRO_BALL); HP(1); } + } WHEN { + if (aiFlags == 0 || battler == 3) + TURN { EXPECT_MOVE(opponentLeft, MOVE_ELECTRO_BALL, target: playerLeft); EXPECT_MOVE(opponentRight, MOVE_ELECTRO_BALL, target: playerLeft); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_EXPLOSION, target: playerLeft); EXPECT_MOVE(opponentRight, MOVE_EXPLOSION); } + } +} + +AI_MULTI_BATTLE_TEST("Partner will not steal your pokemon when running out") +{ + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PARTNER(SPECIES_WYNAUT) { Moves(MOVE_MEMENTO); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN {EXPECT_MOVE(playerRight, MOVE_MEMENTO, target:opponentLeft);} + TURN {} + } THEN { + EXPECT_EQ(gAbsentBattlerFlags, (1u << GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT))); + } +} + +AI_MULTI_BATTLE_TEST("Partner will not steal your pokemon to delay using their ace") +{ + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + BATTLER_AI_FLAGS(B_POSITION_PLAYER_RIGHT, AI_FLAG_ACE_POKEMON); + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PARTNER(SPECIES_WYNAUT) { Moves(MOVE_MEMENTO); } + MULTI_PARTNER(SPECIES_METAGROSS) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN {EXPECT_MOVE(playerRight, MOVE_MEMENTO, target:opponentLeft);} + TURN {} + } THEN { + EXPECT_EQ(SPECIES_METAGROSS, playerRight->species); + } +} + +AI_MULTI_BATTLE_TEST("AI opponents do not steal their partner pokemon in multi battle to delay using their ace") +{ + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + BATTLER_AI_FLAGS(B_POSITION_OPPONENT_LEFT, AI_FLAG_ACE_POKEMON); + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PARTNER(SPECIES_WOBBUFFET) { } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); HP(1);} + MULTI_OPPONENT_A(SPECIES_VENUSAUR) { Moves(MOVE_GIGA_DRAIN); } + MULTI_OPPONENT_B(SPECIES_WYNAUT) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN {MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); } + TURN {MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); } + } THEN { + EXPECT_EQ(SPECIES_VENUSAUR, opponentLeft->species); + } +} + +AI_MULTI_BATTLE_TEST("AI opponents do not steal their partner pokemon in multi battle when forced out") +{ + u32 item, move; + PARAMETRIZE {item = ITEM_EJECT_BUTTON; move = MOVE_TACKLE;} + PARAMETRIZE {item = ITEM_EJECT_PACK; move = MOVE_TAIL_WHIP;} + PARAMETRIZE {item = ITEM_NONE; move = MOVE_ROAR;} + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + BATTLER_AI_FLAGS(B_POSITION_OPPONENT_LEFT, AI_FLAG_ACE_POKEMON); + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PARTNER(SPECIES_WOBBUFFET) { } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); Item(item);} + MULTI_OPPONENT_A(SPECIES_VENUSAUR) { Moves(MOVE_GIGA_DRAIN); } + MULTI_OPPONENT_B(SPECIES_WYNAUT) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN {MOVE(playerLeft, move, target: opponentLeft); } + } THEN { + EXPECT_EQ(SPECIES_VENUSAUR, opponentLeft->species); + } +} + +AI_MULTI_BATTLE_TEST("AI opponents do not steal their partner pokemon in multi battle when forced out 2") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + BATTLER_AI_FLAGS(B_POSITION_OPPONENT_LEFT, AI_FLAG_ACE_POKEMON); + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PARTNER(SPECIES_WOBBUFFET) { } + MULTI_OPPONENT_A(SPECIES_GOLISOPOD) { Moves(MOVE_CELEBRATE); HP(101); MaxHP(200); Ability(ABILITY_EMERGENCY_EXIT);} + MULTI_OPPONENT_A(SPECIES_VENUSAUR) { Moves(MOVE_GIGA_DRAIN); } + MULTI_OPPONENT_B(SPECIES_WYNAUT) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN {MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); } + } THEN { + EXPECT_EQ(SPECIES_VENUSAUR, opponentLeft->species); + } +} diff --git a/test/battle/ai/ai_smart_tera.c b/test/battle/ai/ai_smart_tera.c new file mode 100644 index 000000000000..7bed476b43cd --- /dev/null +++ b/test/battle/ai/ai_smart_tera.c @@ -0,0 +1,71 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_ai_util.h" + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI will tera if it enables a ko") +{ + GIVEN { + ASSUME(GetMovePower(MOVE_SEED_BOMB) == 80); + ASSUME(GetMovePower(MOVE_AQUA_TAIL) == 90); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_TERA); + PLAYER(SPECIES_WOBBUFFET) { HP(47); Speed(100); } + PLAYER(SPECIES_WOBBUFFET) { Speed(100); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(1); Moves(MOVE_AQUA_TAIL, MOVE_SEED_BOMB); TeraType(TYPE_GRASS); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); TeraType(TYPE_FIRE); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_SEED_BOMB, gimmick: GIMMICK_TERA); SEND_OUT(player, 1); } + } SCENE { + MESSAGE("The opposing Wobbuffet terastallized into the Grass type!"); + MESSAGE("Wobbuffet fainted!"); + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI will not tera if it gets outsped and ko'd") +{ + GIVEN { + ASSUME(GetMovePower(MOVE_SEED_BOMB) == 80); + ASSUME(GetMovePower(MOVE_FLAMETHROWER) == 90); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_TERA | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET) { HP(47); Speed(100); Moves(MOVE_FLAMETHROWER, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Speed(100); } + OPPONENT(SPECIES_WOBBUFFET) { HP(60); Speed(1); Moves(MOVE_SEED_BOMB); TeraType(TYPE_GRASS); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); TeraType(TYPE_FIRE); } + } WHEN { + TURN { } + } SCENE { + NOT MESSAGE("The opposing Wobbuffet terastallized into the Grass type!"); + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI will not tera if it gets ko'd by priority") +{ + GIVEN { + ASSUME(GetMovePower(MOVE_SEED_BOMB) == 80); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_TERA | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET) { HP(47); Speed(1); Moves(MOVE_QUICK_ATTACK, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Speed(100); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); Moves(MOVE_SEED_BOMB, MOVE_AQUA_TAIL); TeraType(TYPE_GRASS); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); TeraType(TYPE_FIRE); } + } WHEN { + TURN { } + } SCENE { + NOT MESSAGE("The opposing Wobbuffet terastallized into the Grass type!"); + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI might tera if it gets saved from a ko") +{ + PASSES_RANDOMLY(90, 100, RNG_AI_CONSERVE_TERA); + GIVEN { + ASSUME(GetMovePower(MOVE_SEED_BOMB) == 80); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_TERA | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET) { HP(47); Speed(100); Moves(MOVE_SEED_BOMB); } + PLAYER(SPECIES_WOBBUFFET) { Speed(100); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); HP(30); Moves(MOVE_SEED_BOMB); TeraType(TYPE_FIRE); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); TeraType(TYPE_FIRE); } + } WHEN { + TURN { MOVE(player, MOVE_SEED_BOMB); } + } SCENE { + MESSAGE("The opposing Wobbuffet terastallized into the Fire type!"); + } +} diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 41a480135d7d..91098f28a367 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -40,7 +40,29 @@ AI_SINGLE_BATTLE_TEST("AI switches if Perish Song is about to kill") } } -AI_DOUBLE_BATTLE_TEST("AI will not try to switch for the same pokemon for 2 spots in a double battle (all bad moves)") +AI_SINGLE_BATTLE_TEST("AI sees on-field player ability correctly and does not see previous PokΓ©mon's ability after player uses a pivot move when choosing a post-KO switch") +{ + u32 testAbility; + PARAMETRIZE { testAbility = ABILITY_WATER_ABSORB; } + PARAMETRIZE { testAbility = ABILITY_VOLT_ABSORB; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_PIKACHU) {Level(100); Moves(MOVE_VOLT_SWITCH, MOVE_SPARKLY_SWIRL); Ability(ABILITY_LIGHTNING_ROD); }; + PLAYER(SPECIES_LANTURN) {Level(44); Moves(MOVE_SCALD); Ability(testAbility); }; + OPPONENT(SPECIES_SOBBLE) {Level(44); Moves(MOVE_SCRATCH); } + OPPONENT(SPECIES_BOMBIRDIER) {Level(42); Moves(MOVE_ROCK_SLIDE); } + OPPONENT(SPECIES_IRON_THORNS) {Level(43); Moves(MOVE_SUPERCELL_SLAM, MOVE_ICE_PUNCH); } + } WHEN { + TURN { + MOVE(player, MOVE_VOLT_SWITCH); + SEND_OUT(player, 1); + EXPECT_MOVE(opponent, MOVE_SCRATCH); + testAbility == ABILITY_WATER_ABSORB ? EXPECT_SEND_OUT(opponent, 2) : EXPECT_SEND_OUT(opponent, 1); + } + } +} + +AI_DOUBLE_BATTLE_TEST("AI will not try to switch for the same PokΓ©mon for 2 spots in a double battle (all bad moves)") { u32 flags; @@ -69,6 +91,250 @@ AI_DOUBLE_BATTLE_TEST("AI will not try to switch for the same pokemon for 2 spot } } +// Used to test EXPECT_SWITCH only on partner +AI_MULTI_BATTLE_TEST("AI partner will not switch mid-turn into a player PokΓ©mon (multi)") +{ + u32 flags; + + PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE {flags = 0; } + + PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + MULTI_PLAYER(SPECIES_HAUNTER); + MULTI_PLAYER(SPECIES_RATTATA); + // No moves to damage opponents. + MULTI_PARTNER(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL); } + MULTI_PARTNER(SPECIES_GASTLY) { Moves(MOVE_LICK); } + MULTI_PARTNER(SPECIES_RATICATE) { Moves(MOVE_HEADBUTT); } + MULTI_OPPONENT_A(SPECIES_RATTATA) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_B(SPECIES_KANGASKHAN) { Moves(MOVE_CELEBRATE); } + + } WHEN { + TURN { EXPECT_SWITCH(playerRight, 5); }; + } SCENE { + MESSAGE(AI_PARTNER_NAME " withdrew Gengar!"); + MESSAGE(AI_PARTNER_NAME " sent out Raticate!"); + NONE_OF { + MESSAGE(AI_PARTNER_NAME " withdrew Gengar!"); + MESSAGE(AI_PARTNER_NAME " sent out Rattata!"); + } + } +} + +// Used to test EXPECT_SWITCH only on partner +AI_TWO_VS_ONE_BATTLE_TEST("AI partner will not switch mid-turn into a player PokΓ©mon (2v1)") +{ + u32 flags; + + PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE {flags = 0; } + + PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + MULTI_PLAYER(SPECIES_HAUNTER); + MULTI_PLAYER(SPECIES_RATTATA); + // No moves to damage opponents. + MULTI_PARTNER(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL); } + MULTI_PARTNER(SPECIES_GASTLY) { Moves(MOVE_LICK); } + MULTI_PARTNER(SPECIES_RATICATE) { Moves(MOVE_HEADBUTT); } + MULTI_OPPONENT_A(SPECIES_RATTATA) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_A(SPECIES_KANGASKHAN) { Moves(MOVE_CELEBRATE); } + + } WHEN { + TURN { EXPECT_SWITCH(playerRight, 5); }; + } SCENE { + MESSAGE(AI_PARTNER_NAME " withdrew Gengar!"); + MESSAGE(AI_PARTNER_NAME " sent out Raticate!"); + NONE_OF { + MESSAGE(AI_PARTNER_NAME " withdrew Gengar!"); + MESSAGE(AI_PARTNER_NAME " sent out Rattata!"); + } + } +} + +// Used to test EXPECT_SEND_OUT only on partner +AI_MULTI_BATTLE_TEST("AI partner will not switch into a player PokΓ©mon after fainting (multi)") +{ + u32 flags; + + PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE {flags = 0; } + + PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + MULTI_PLAYER(SPECIES_GENGAR); + MULTI_PLAYER(SPECIES_RATTATA); + // No moves to damage opponents. + MULTI_PARTNER(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); HP(1); } + MULTI_PARTNER(SPECIES_GASTLY); + MULTI_PARTNER(SPECIES_HAUNTER); + MULTI_OPPONENT_A(SPECIES_TRAPINCH) { Ability(ABILITY_ARENA_TRAP); Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_B(SPECIES_VIBRAVA) { Moves(MOVE_CELEBRATE); } + + } WHEN { + TURN { EXPECT_MOVE(playerRight, MOVE_CELEBRATE); EXPECT_SEND_OUT(playerRight, 5); }; + } SCENE { + MESSAGE(AI_PARTNER_NAME " sent out Haunter!"); + NONE_OF { + MESSAGE(AI_PARTNER_NAME " sent out Rattata!"); + } + } +} + +// Used to test EXPECT_SEND_OUT only on partner +AI_TWO_VS_ONE_BATTLE_TEST("AI partner will not switch into a player PokΓ©mon after fainting (2v1)") +{ + u32 flags; + + PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE {flags = 0; } + + PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + MULTI_PLAYER(SPECIES_GENGAR); + MULTI_PLAYER(SPECIES_RATTATA); + // No moves to damage opponents. + MULTI_PARTNER(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); HP(1); } + MULTI_PARTNER(SPECIES_GASTLY); + MULTI_PARTNER(SPECIES_HAUNTER); + MULTI_OPPONENT_A(SPECIES_TRAPINCH) { Ability(ABILITY_ARENA_TRAP); Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_A(SPECIES_VIBRAVA) { Moves(MOVE_CELEBRATE); } + + } WHEN { + TURN { EXPECT_MOVE(playerRight, MOVE_CELEBRATE); EXPECT_SEND_OUT(playerRight, 5); }; + } SCENE { + MESSAGE(AI_PARTNER_NAME " sent out Haunter!"); + NONE_OF { + MESSAGE(AI_PARTNER_NAME " sent out Rattata!"); + } + } +} + +// Used to test EXPECT_SWITCH, EXPECT_SEND_OUT, and EXPECT_MOVE on partner +AI_MULTI_BATTLE_TEST("AI partner will not switch into a player PokΓ©mon (multi)") +{ + u32 flags; + + PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE {flags = 0; } + + PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + MULTI_PLAYER(SPECIES_HAUNTER); + MULTI_PLAYER(SPECIES_RATTATA); + // No moves to damage opponents. + MULTI_PARTNER(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL); } + MULTI_PARTNER(SPECIES_RATICATE) { Moves(MOVE_HEADBUTT); HP(1); } + MULTI_OPPONENT_A(SPECIES_RATTATA) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_B(SPECIES_KANGASKHAN) { Moves(MOVE_CELEBRATE); } + + } WHEN { + TURN { MOVE(playerLeft, MOVE_AURA_SPHERE, target:playerRight); EXPECT_SWITCH(playerRight, 4); EXPECT_SEND_OUT(playerRight, 3); }; + TURN { EXPECT_MOVE(playerRight, MOVE_SHADOW_BALL, target:opponentLeft); }; + } SCENE { + MESSAGE(AI_PARTNER_NAME " sent out Raticate!"); + NONE_OF { + MESSAGE(AI_PARTNER_NAME " sent out Rattata!"); + } + } +} + +// Used to test EXPECT_SWITCH, EXPECT_SEND_OUT, and EXPECT_MOVE on partner +AI_TWO_VS_ONE_BATTLE_TEST("AI partner will not switch into a player PokΓ©mon (2v1)") +{ + u32 flags; + + PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE {flags = 0; } + + PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + MULTI_PLAYER(SPECIES_HAUNTER); + MULTI_PLAYER(SPECIES_RATTATA); + // No moves to damage opponents. + MULTI_PARTNER(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL); } + MULTI_PARTNER(SPECIES_RATICATE) { Moves(MOVE_HEADBUTT); HP(1); } + MULTI_OPPONENT_A(SPECIES_RATTATA) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_A(SPECIES_KANGASKHAN) { Moves(MOVE_CELEBRATE); } + + } WHEN { + TURN { MOVE(playerLeft, MOVE_AURA_SPHERE, target:playerRight); EXPECT_SWITCH(playerRight, 4); EXPECT_SEND_OUT(playerRight, 3); }; + TURN { EXPECT_MOVE(playerRight, MOVE_SHADOW_BALL, target:opponentLeft); }; + } SCENE { + MESSAGE(AI_PARTNER_NAME " sent out Raticate!"); + NONE_OF { + MESSAGE(AI_PARTNER_NAME " sent out Rattata!"); + } + } +} + +AI_TWO_VS_ONE_BATTLE_TEST("AI will not try to switch for the same pokemon for 2 spots in a 2v1 battle (all bad moves)") +{ + u32 flags; + + PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE {flags = 0; } + + PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + MULTI_PLAYER(SPECIES_RATTATA); + MULTI_PLAYER(SPECIES_RATTATA); + MULTI_PARTNER(SPECIES_KANGASKHAN); + // No moves to damage player. + MULTI_OPPONENT_A(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL); } + MULTI_OPPONENT_A(SPECIES_HAUNTER) { Moves(MOVE_SHADOW_BALL); } + MULTI_OPPONENT_A(SPECIES_GASTLY) { Moves(MOVE_LICK); } + MULTI_OPPONENT_A(SPECIES_RATICATE) { Moves(MOVE_HEADBUTT); } + } WHEN { + TURN { EXPECT_SWITCH(opponentLeft, 3); }; + } SCENE { + MESSAGE(AI_TRAINER_NAME " withdrew Gengar!"); + MESSAGE(AI_TRAINER_NAME " sent out Raticate!"); + NONE_OF { + MESSAGE(AI_TRAINER_NAME " withdrew Haunter!"); + MESSAGE(AI_TRAINER_NAME " sent out Raticate!"); + } + } +} + +AI_ONE_VS_TWO_BATTLE_TEST("AI will not switch into a partner PokΓ©mon in a 1v2 battle (all bad moves)") +{ + u32 flags; + + PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE {flags = 0; } + + PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + MULTI_PLAYER(SPECIES_RATTATA); + MULTI_PLAYER(SPECIES_KANGASKHAN); + // No moves to damage player. + MULTI_OPPONENT_A(SPECIES_HAUNTER) { Moves(MOVE_SHADOW_BALL); } + MULTI_OPPONENT_B(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL); } + MULTI_OPPONENT_B(SPECIES_GASTLY) { Moves(MOVE_LICK); } + MULTI_OPPONENT_B(SPECIES_RATICATE) { Moves(MOVE_HEADBUTT); } + + } WHEN { + TURN { EXPECT_SWITCH(opponentRight, 5); }; + } SCENE { + MESSAGE(AI_TRAINER_2_NAME " withdrew Gengar!"); + MESSAGE(AI_TRAINER_2_NAME " sent out Raticate!"); + NONE_OF { + MESSAGE(AI_TRAINER_NAME " withdrew Haunter!"); + MESSAGE(AI_TRAINER_NAME " sent out Raticate!"); + } + } +} + AI_SINGLE_BATTLE_TEST("AI will switch out if it has no move that affects the player") { PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); @@ -85,7 +351,7 @@ AI_SINGLE_BATTLE_TEST("AI will switch out if it has no move that affects the pla AI_SINGLE_BATTLE_TEST("When AI switches out due to having no move that affects the player, AI will send in a mon that can hit the player, even if not ideal") { GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL, MOVE_CELEBRATE); } OPPONENT(SPECIES_ABRA) { Moves(MOVE_TACKLE); } OPPONENT(SPECIES_ABRA) { Moves(MOVE_TACKLE); } @@ -93,12 +359,12 @@ AI_SINGLE_BATTLE_TEST("When AI switches out due to having no move that affects t OPPONENT(SPECIES_ABRA) { Moves(MOVE_TACKLE); } OPPONENT(SPECIES_ABRA) { Moves(MOVE_TACKLE); } } WHEN { - TURN { MOVE(player, MOVE_SHADOW_BALL); EXPECT_SWITCH(opponent, 2); EXPECT_SEND_OUT(opponent, 4); } + TURN { MOVE(player, MOVE_SHADOW_BALL); EXPECT_SWITCH(opponent, 2); EXPECT_SEND_OUT(opponent, 0);} TURN { MOVE(player, MOVE_SHADOW_BALL); EXPECT_MOVE(opponent, MOVE_TACKLE); } } } -AI_DOUBLE_BATTLE_TEST("AI will not try to switch for the same pokemon for 2 spots in a double battle (Wonder Guard)") +AI_DOUBLE_BATTLE_TEST("AI will not try to switch for the same PokΓ©mon for 2 spots in a double battle (Wonder Guard)") { PASSES_RANDOMLY(SHOULD_SWITCH_WONDER_GUARD_PERCENTAGE, 100, RNG_AI_SWITCH_WONDER_GUARD); GIVEN { @@ -139,7 +405,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Switch effect moves will send ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); ASSUME(GetMoveEffect(MOVE_CHILLY_RECEPTION) == EFFECT_CHILLY_RECEPTION); ASSUME(GetMoveEffect(MOVE_SHED_TAIL) == EFFECT_SHED_TAIL); - WITH_CONFIG(GEN_CONFIG_TELEPORT_BEHAVIOR, GEN_8); + WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_8); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_ACE_POKEMON); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Moves(aiMove); } @@ -314,7 +580,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Mid-battle switches prioritize AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Mid-battle switches prioritize defensive options") { GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_SWELLOW) { Level(30); Moves(MOVE_WING_ATTACK, MOVE_BOOMBURST); Speed(5); SpAttack(50); } OPPONENT(SPECIES_PONYTA) { Level(1); Moves(MOVE_NONE); Speed(4); } // Forces switchout OPPONENT(SPECIES_ARON) { Level(30); Moves(MOVE_IRON_HEAD); Speed(4); SpDefense(50); } // Mid battle, AI sends out Aron @@ -373,7 +639,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Mid-battle switches prioritize GIVEN { ASSUME(gItemsInfo[ITEM_EJECT_PACK].holdEffect == HOLD_EFFECT_EJECT_PACK); ASSUME(MoveHasAdditionalEffectSelf(MOVE_OVERHEAT, MOVE_EFFECT_SP_ATK_MINUS_2) == TRUE); - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_SWELLOW) { Level(30); Moves(MOVE_WING_ATTACK, MOVE_BOOMBURST); Speed(5); SpAttack(50); } OPPONENT(SPECIES_PONYTA) { Level(1); Item(ITEM_EJECT_PACK); Moves(MOVE_OVERHEAT); Speed(6); } // Forces switchout OPPONENT(SPECIES_ARON) { Level(30); Moves(MOVE_IRON_HEAD); Speed(4); SpDefense(50); } @@ -388,7 +654,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Mid-battle switches prioritize GIVEN { ASSUME(gItemsInfo[ITEM_EJECT_PACK].holdEffect == HOLD_EFFECT_EJECT_PACK); ASSUME(MoveHasAdditionalEffectSelf(MOVE_OVERHEAT, MOVE_EFFECT_SP_ATK_MINUS_2) == TRUE); - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_STARAPTOR) { Level(30); Ability(ABILITY_INTIMIDATE); Moves(MOVE_WING_ATTACK, MOVE_BOOMBURST); Speed(5); SpAttack(50); } OPPONENT(SPECIES_PONYTA) { Level(1); Item(ITEM_EJECT_PACK); Moves(MOVE_OVERHEAT); Speed(6); } // Forces switchout OPPONENT(SPECIES_ARON) { Level(30); Moves(MOVE_IRON_HEAD); Speed(4); SpDefense(50); } @@ -478,8 +744,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch in trapping mon m PARAMETRIZE { aiSmartSwitchingFlag = AI_FLAG_SMART_SWITCHING; } PASSES_RANDOMLY(SHOULD_SWITCH_TRAPPER_PERCENTAGE, 100, RNG_AI_SWITCH_TRAPPER); GIVEN { - ASSUME(gSpeciesInfo[SPECIES_GOLURK].types[0] == TYPE_GROUND); - ASSUME(gSpeciesInfo[SPECIES_GOLURK].types[1] == TYPE_GHOST); + ASSUME(GetSpeciesType(SPECIES_GOLURK, 0) == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_GOLURK, 1) == TYPE_GHOST); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartSwitchingFlag); PLAYER(SPECIES_ELECTRODE) { Speed(4); Moves(MOVE_THUNDERBOLT, MOVE_AURA_SPHERE, MOVE_PROTECT); } PLAYER(SPECIES_WOBBUFFET) { Speed(1); }; @@ -500,7 +766,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI will switch in trapping mon PARAMETRIZE { aiSmartMonChoicesFlag = 0; } // No trapping behaviour PARAMETRIZE { aiSmartMonChoicesFlag = AI_FLAG_SMART_MON_CHOICES; } // Traps with mid battle switches GIVEN { - ASSUME(gSpeciesInfo[SPECIES_MAWILE].types[0] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_MAWILE, 0) == TYPE_STEEL); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartMonChoicesFlag); PLAYER(SPECIES_MAWILE) { Speed(2); Moves(MOVE_PROTECT, MOVE_SCRATCH); } PLAYER(SPECIES_WOBBUFFET) { Speed(1); } @@ -521,7 +787,7 @@ AI_SINGLE_BATTLE_TEST("AI won't use trapping behaviour if player only has 1 mon PARAMETRIZE { aiSmartMonChoicesFlag = 0; } // No trapping behaviour PARAMETRIZE { aiSmartMonChoicesFlag = AI_FLAG_SMART_MON_CHOICES; } // Traps with mid battle switches GIVEN { - ASSUME(gSpeciesInfo[SPECIES_MAWILE].types[0] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_MAWILE, 0) == TYPE_STEEL); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartMonChoicesFlag); PLAYER(SPECIES_MAWILE) { Speed(2); Moves(MOVE_PROTECT, MOVE_SCRATCH); } OPPONENT(SPECIES_SNORLAX) { Speed(3); Moves(MOVE_SELF_DESTRUCT); } @@ -550,9 +816,9 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if mon would { PASSES_RANDOMLY(SHOULD_SWITCH_HASBADODDS_PERCENTAGE, 100, RNG_AI_SWITCH_HASBADODDS); GIVEN { - ASSUME(gSpeciesInfo[SPECIES_RHYDON].types[0] == TYPE_GROUND); - ASSUME(gSpeciesInfo[SPECIES_PELIPPER].types[0] == TYPE_WATER); - ASSUME(gSpeciesInfo[SPECIES_PELIPPER].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_RHYDON, 0) == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_PELIPPER, 0) == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_PELIPPER, 1) == TYPE_FLYING); ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); @@ -569,11 +835,11 @@ AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if it can't deal damage to { PASSES_RANDOMLY(SHOULD_SWITCH_WONDER_GUARD_PERCENTAGE, 100, RNG_AI_SWITCH_WONDER_GUARD); GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[0] == TYPE_BUG); - ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[1] == TYPE_GHOST); - ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[0] == ABILITY_WONDER_GUARD); - ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[1] == ABILITY_NONE); - ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[2] == ABILITY_NONE); + ASSUME(GetSpeciesType(SPECIES_SHEDINJA, 0) == TYPE_BUG); + ASSUME(GetSpeciesType(SPECIES_SHEDINJA, 1) == TYPE_GHOST); + ASSUME(GetSpeciesAbility(SPECIES_SHEDINJA, 0) == ABILITY_WONDER_GUARD); + ASSUME(GetSpeciesAbility(SPECIES_SHEDINJA, 1) == ABILITY_NONE); + ASSUME(GetSpeciesAbility(SPECIES_SHEDINJA, 2) == ABILITY_NONE); ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL); ASSUME(GetMoveType(MOVE_SHADOW_BALL) == TYPE_GHOST); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); @@ -589,11 +855,11 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it can't d { PASSES_RANDOMLY(SHOULD_SWITCH_WONDER_GUARD_PERCENTAGE, 100, RNG_AI_SWITCH_WONDER_GUARD); GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[0] == TYPE_BUG); - ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[1] == TYPE_GHOST); - ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[0] == ABILITY_WONDER_GUARD); - ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[1] == ABILITY_NONE); - ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[2] == ABILITY_NONE); + ASSUME(GetSpeciesType(SPECIES_SHEDINJA, 0) == TYPE_BUG); + ASSUME(GetSpeciesType(SPECIES_SHEDINJA, 1) == TYPE_GHOST); + ASSUME(GetSpeciesAbility(SPECIES_SHEDINJA, 0) == ABILITY_WONDER_GUARD); + ASSUME(GetSpeciesAbility(SPECIES_SHEDINJA, 1) == ABILITY_NONE); + ASSUME(GetSpeciesAbility(SPECIES_SHEDINJA, 2) == ABILITY_NONE); ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL); ASSUME(GetMoveType(MOVE_SHADOW_BALL) == TYPE_GHOST); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); @@ -614,6 +880,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee GIVEN { ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); + ASSUME(GetMovePower(MOVE_AURA_SPHERE) == 80); // Gen 5's 90 power causes too much damage AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH, MOVE_CELEBRATE, MOVE_TOXIC, MOVE_AURA_SPHERE); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH); } @@ -714,7 +981,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will not switch out if it has PARAMETRIZE { hp = 10; } GIVEN { ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_SLAKOTH) { Moves(MOVE_SCRATCH, MOVE_YAWN); } OPPONENT(SPECIES_SLAKOTH) { Moves(MOVE_SCRATCH); HP(hp); MaxHP(30); } OPPONENT(SPECIES_SLAKOTH) { Level(1); Moves(MOVE_HEADBUTT); } @@ -748,15 +1015,15 @@ AI_DOUBLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee } } -AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's mon is semi-invulnerable and it has an absorber") +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's mon is semi-invulnerable and it has a good switchin") { PASSES_RANDOMLY(SHOULD_SWITCH_FREE_TURN_PERCENTAGE, 100, RNG_AI_SWITCH_FREE_TURN); GIVEN { ASSUME(GetMoveType(MOVE_DIVE) == TYPE_WATER); - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); - PLAYER(SPECIES_LUVDISC) { Moves(MOVE_DIVE); } + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES); + PLAYER(SPECIES_LUVDISC) { Level(1); Moves(MOVE_DIVE); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH); } - OPPONENT(SPECIES_MANTINE) { Moves(MOVE_SCRATCH); Ability(ABILITY_WATER_ABSORB); } + OPPONENT(SPECIES_PIKACHU) { Moves(MOVE_THUNDERBOLT); } } WHEN { TURN { MOVE(player, MOVE_DIVE) ; EXPECT_MOVE(opponent, MOVE_SCRATCH); } TURN { SKIP_TURN(player); EXPECT_SWITCH(opponent, 1); } @@ -810,7 +1077,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's m AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's mon is charging and it has a good switchin immunity (ability)") { - PASSES_RANDOMLY(SHOULD_SWITCH_FREE_TURN_PERCENTAGE, 100, RNG_AI_SWITCH_FREE_TURN); + PASSES_RANDOMLY(SHOULD_SWITCH_ABSORBS_MOVE_PERCENTAGE, 100, RNG_AI_SWITCH_ABSORBING); GIVEN { ASSUME(GetMoveType(MOVE_DIG) == TYPE_GROUND); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); @@ -825,7 +1092,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's m AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has an absorber") { - u32 aiMon; u32 move; u32 absorbingAbility; + u32 aiMon; u32 move; + enum Ability absorbingAbility; PARAMETRIZE { aiMon = SPECIES_NINETALES; absorbingAbility = ABILITY_FLASH_FIRE; move = MOVE_FLAMETHROWER;} PARAMETRIZE { aiMon = SPECIES_MANTINE; absorbingAbility = ABILITY_WATER_ABSORB; move = MOVE_SURF;} PARAMETRIZE { aiMon = SPECIES_TOXICROAK; absorbingAbility = ABILITY_DRY_SKIN; move = MOVE_SURF;} @@ -839,9 +1107,9 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has an PARAMETRIZE { aiMon = SPECIES_BRONZONG; absorbingAbility = ABILITY_LEVITATE; move = MOVE_EARTHQUAKE;} PARAMETRIZE { aiMon = SPECIES_ELECTRODE; absorbingAbility = ABILITY_SOUNDPROOF; move = MOVE_HYPER_VOICE;} PARAMETRIZE { aiMon = SPECIES_CHESNAUGHT; absorbingAbility = ABILITY_BULLETPROOF; move = MOVE_SLUDGE_BOMB;} - PARAMETRIZE { aiMon = SPECIES_SHIFTRY; absorbingAbility = ABILITY_WIND_RIDER; move = MOVE_HURRICANE;} + PARAMETRIZE { aiMon = SPECIES_BRAMBLEGHAST; absorbingAbility = ABILITY_WIND_RIDER; move = MOVE_HURRICANE;} GIVEN { - ASSUME(B_REDIRECT_ABILITY_IMMUNITY >= GEN_5); + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_ZIGZAGOON) { Moves(move); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH); } @@ -917,6 +1185,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will stay in if Encore'd into { GIVEN { ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); + ASSUME(GetSpeciesType(SPECIES_AZURILL, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_AZURILL, 1) == TYPE_FAIRY); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_AZURILL) { Moves(MOVE_SCRATCH, MOVE_ENCORE); } OPPONENT(SPECIES_ODDISH) { Moves(MOVE_ACID); } @@ -929,7 +1199,22 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will stay in if Encore'd into AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if Encore'd into neutral move with good switchin 50% of the time") { - KNOWN_FAILING; // AI still switches even if ShouldSwitch is set to immediately return FALSE, something external seems to be triggering this + PASSES_RANDOMLY(SHOULD_SWITCH_ENCORE_DAMAGE_PERCENTAGE, 100, RNG_AI_SWITCH_ENCORE); + GIVEN { + WITH_CONFIG(CONFIG_ENCORE_TARGET, GEN_3); + ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); + PLAYER(SPECIES_AZURILL) { Moves(MOVE_SCRATCH, MOVE_ENCORE); } + OPPONENT(SPECIES_ODDISH) { Moves(MOVE_SCRATCH); } + OPPONENT(SPECIES_ARON) { Moves(MOVE_METAL_CLAW); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_SCRATCH); MOVE(player, MOVE_ENCORE); } + TURN { MOVE(player, MOVE_SCRATCH); EXPECT_SWITCH(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if Encore'd into neutral move with good switchin 50% of the time (Gen 5+)") +{ PASSES_RANDOMLY(SHOULD_SWITCH_ENCORE_DAMAGE_PERCENTAGE, 100, RNG_AI_SWITCH_ENCORE); GIVEN { ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); @@ -1034,8 +1319,8 @@ AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch into mon with good type matchup AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI correctly handles abilities when scoring moves") { GIVEN { - ASSUME(B_PRANKSTER_DARK_TYPES >= GEN_7); - ASSUME(gSpeciesInfo[SPECIES_GRENINJA].types[1] == TYPE_DARK); + WITH_CONFIG(CONFIG_PRANKSTER_DARK_TYPES, GEN_7); + ASSUME(GetSpeciesType(SPECIES_GRENINJA, 1) == TYPE_DARK); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_MON_CHOICES); PLAYER(SPECIES_GRENINJA) { Moves(MOVE_WATER_GUN); } OPPONENT(SPECIES_WHIMSICOTT) { Ability(ABILITY_PRANKSTER); Moves(MOVE_LEECH_SEED, MOVE_STUN_SPORE, MOVE_ABSORB); } @@ -1143,7 +1428,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if all moves ASSUME(GetMoveEffect(MOVE_POLTERGEIST) == EFFECT_POLTERGEIST); ASSUME(GetMoveType(MOVE_SCALD) == TYPE_WATER); ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); - ASSUME(gSpeciesInfo[SPECIES_MANTINE].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_MANTINE, 1) == TYPE_FLYING); ASSUME(GetItemHoldEffect(ITEM_WATER_GEM) == HOLD_EFFECT_GEMS); ASSUME(GetItemSecondaryId(ITEM_WATER_GEM) == TYPE_WATER); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_OMNISCIENT); @@ -1156,6 +1441,24 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if all moves } } +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if all moves deal zero damage (absorbing ability)") +{ + PASSES_RANDOMLY(SHOULD_SWITCH_ALL_SCORES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_SCORES_BAD); + GIVEN { + ASSUME(GetMoveType(MOVE_THUNDER_PUNCH) == TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_FAKE_OUT) == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_RETURN) == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_DRAIN_PUNCH) == TYPE_FIGHTING); + ASSUME(gSpeciesInfo[SPECIES_MAROWAK_ALOLA].types[1] == TYPE_GHOST); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_MAROWAK_ALOLA) { Ability(ABILITY_LIGHTNING_ROD); Moves(MOVE_SHADOW_BONE); } + OPPONENT(SPECIES_LOPUNNY) { Moves(MOVE_FAKE_OUT, MOVE_RETURN, MOVE_DRAIN_PUNCH, MOVE_THUNDER_PUNCH); Ability(ABILITY_LIMBER); } + OPPONENT(SPECIES_CHANDELURE) { Moves(MOVE_SHADOW_BALL); } + } WHEN { + TURN { MOVE(player, MOVE_SHADOW_BONE); EXPECT_SWITCH(opponent, 1); } + } +} + AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if Palafin-Zero isn't transformed yet") { GIVEN { @@ -1238,3 +1541,186 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI won't send out defensive mon TURN { MOVE(player, MOVE_WATER_PULSE); EXPECT_MOVE(opponent, MOVE_BULLDOZE); } } } + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI considers 0 hits to KO as losing a 1v1") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_JOLTEON) { Level(100); Ability(ABILITY_VOLT_ABSORB); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Level(1); HP(1); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_TANGELA) { Level(100); Moves(MOVE_THUNDERBOLT); } + OPPONENT(SPECIES_TANGELA) { Level(100); Moves(MOVE_GIGA_DRAIN); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); EXPECT_SEND_OUT(opponent, 2); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI sees Echoed Voice damage correctly") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Speed(5); Moves(MOVE_SCRATCH, MOVE_ECHOED_VOICE); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(4); Level(55); Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_DRAPION) { Speed(4); SpDefense(25); Moves(MOVE_WICKED_BLOW); Ability(ABILITY_SNIPER); } + OPPONENT(SPECIES_GASTLY) { Speed(4); Level(1); Moves(MOVE_TACKLE); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_CELEBRATE); EXPECT_SEND_OUT(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_SMART_MON_CHOICES: AI sees its own weather setting ability when considering switchin candidates") +{ + enum Ability ability = ABILITY_NONE; + PARAMETRIZE { ability = ABILITY_WATER_ABSORB; } + PARAMETRIZE { ability = ABILITY_DRIZZLE; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_ZIGZAGOON) { Speed(2); Moves(MOVE_SCRATCH); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(1); Level(1); Moves(MOVE_SCRATCH); } + OPPONENT(SPECIES_POLITOED) { Speed(5); Ability(ability); Moves(MOVE_BUBBLE_BEAM); } + OPPONENT(SPECIES_CONKELDURR) { Speed(1); Ability(ABILITY_GUTS); Moves(MOVE_SUPERPOWER); } + } WHEN { + if (ability == ABILITY_DRIZZLE) + TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_SCRATCH); EXPECT_SEND_OUT(opponent, 1); } + else + TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_SCRATCH); EXPECT_SEND_OUT(opponent, 2); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI will properly consider immunities when determining switchin type matchup") +{ + GIVEN { + ASSUME(GetSpeciesType(SPECIES_WHIMSICOTT, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_WHIMSICOTT, 1) == TYPE_FAIRY); // Gen 5's pure Grass type makes the test fail + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_POLIWRATH) { Moves(MOVE_WATER_GUN, MOVE_KARATE_CHOP); } + OPPONENT(SPECIES_ZIGZAGOON) { Level(1); Moves(MOVE_SCRATCH); } + OPPONENT(SPECIES_CERULEDGE) { Moves(MOVE_SPARK); } + OPPONENT(SPECIES_WHIMSICOTT) { Moves(MOVE_MEGA_DRAIN); } + } WHEN { + TURN { MOVE(player, MOVE_KARATE_CHOP); EXPECT_MOVE(opponent, MOVE_SCRATCH); EXPECT_SEND_OUT(opponent, 2); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI will properly consider immunities when determining switchin type matchup (Doubles)") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_POLIWRATH) { Moves(MOVE_WATER_GUN, MOVE_KARATE_CHOP); } + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_ZIGZAGOON) { Level(1); Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_ZIGZAGOON) { Level(1); Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_CERULEDGE) { Moves(MOVE_SPARK); } + OPPONENT(SPECIES_WHIMSICOTT) { Moves(MOVE_MEGA_DRAIN); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_KARATE_CHOP, target:opponentLeft); MOVE(playerRight, MOVE_CELEBRATE); EXPECT_MOVE(opponentLeft, MOVE_CELEBRATE); EXPECT_MOVE(opponentRight, MOVE_CELEBRATE); EXPECT_SEND_OUT(opponentLeft, 3); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI won't switch out due to bad odds if it can OHKO with a priority move") +{ + PASSES_RANDOMLY(100, 100, RNG_AI_SWITCH_HASBADODDS); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + OPPONENT(SPECIES_CETODDLE) { Level(14); HP(30); Speed(1); Moves(MOVE_ICE_FANG, MOVE_ROCK_SMASH, MOVE_BULLDOZE, MOVE_ICE_SHARD); } + OPPONENT(SPECIES_SPHEAL) { Level(14); Speed(1); Ability(ABILITY_THICK_FAT); Moves(MOVE_ICY_WIND, MOVE_BRINE, MOVE_HIDDEN_POWER, MOVE_SIGNAL_BEAM); } + PLAYER(SPECIES_LITTEN) { Level(15); HP(1); Speed(2); Ability(ABILITY_BLAZE); Moves(MOVE_FIRE_FANG, MOVE_EMBER, MOVE_LICK, MOVE_FAKE_OUT); } + } WHEN { + TURN { MOVE(player, MOVE_FIRE_FANG); EXPECT_MOVE(opponent, MOVE_ICE_SHARD); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI will consider player's priority when evaluating switchin candidates") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + OPPONENT(SPECIES_ZIGZAGOON) { Speed(1); HP(1); Moves(MOVE_HEADBUTT); } + OPPONENT(SPECIES_ANNIHILAPE) { Speed(5); Moves(MOVE_DRAIN_PUNCH); } + OPPONENT(SPECIES_GENGAR) { Speed(10); Moves(MOVE_FOCUS_BLAST); } + PLAYER(SPECIES_KINGAMBIT) { Speed(2); Moves(MOVE_SUCKER_PUNCH, MOVE_KNOCK_OFF); } + } WHEN { + TURN { MOVE(player, MOVE_KNOCK_OFF); EXPECT_MOVE(opponent, MOVE_HEADBUTT); EXPECT_SEND_OUT(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will consider player's priority when evaluating Bad Odds 1v1") +{ + PASSES_RANDOMLY(SHOULD_SWITCH_HASBADODDS_PERCENTAGE, 100, RNG_AI_SWITCH_HASBADODDS); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + OPPONENT(SPECIES_GENGAR) { Speed(10); Moves(MOVE_FOCUS_BLAST); } + OPPONENT(SPECIES_SCRAFTY) { Speed(5); Moves(MOVE_DRAIN_PUNCH); } + PLAYER(SPECIES_KINGAMBIT) { Speed(2); Moves(MOVE_SUCKER_PUNCH, MOVE_KNOCK_OFF); } + } WHEN { + TURN { MOVE(player, MOVE_KNOCK_OFF); EXPECT_SWITCH(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will consider Hidden Power when triggering absorbing switches") +{ + PASSES_RANDOMLY(SHOULD_SWITCH_ABSORBS_HIDDEN_POWER_PERCENTAGE, 100, RNG_AI_SWITCH_ABSORBING_HIDDEN_POWER); + GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_HIDDEN_POWER); HPIV(31); AttackIV(30); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(30); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH); } + OPPONENT(SPECIES_NINETALES) { Moves(MOVE_SCRATCH); Ability(ABILITY_FLASH_FIRE); } + } WHEN { + TURN { MOVE(player, MOVE_HIDDEN_POWER); EXPECT_MOVE(opponent, MOVE_SCRATCH); } + TURN { MOVE(player, MOVE_HIDDEN_POWER); EXPECT_SWITCH(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: Fake Out style moves won't confuse choiced AI into thinking it does no damage") +{ + + GIVEN { + ASSUME(gItemsInfo[ITEM_CHOICE_SCARF].holdEffect == HOLD_EFFECT_CHOICE_SCARF); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES); + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_FAKE_OUT, MOVE_SCRATCH); } + OPPONENT(SPECIES_INFERNAPE) { Item(ITEM_CHOICE_SCARF); Moves(MOVE_CLOSE_COMBAT); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH); } + } WHEN { + TURN { MOVE(player, MOVE_FAKE_OUT); EXPECT_MOVE(opponent, MOVE_CLOSE_COMBAT); } + TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_CLOSE_COMBAT); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI will consider choice-locked player priority when determining which mon to send out") +{ + u32 item; + PARAMETRIZE { item = ITEM_NONE; } + PARAMETRIZE { item = ITEM_CHOICE_BAND; } + GIVEN { + ASSUME(gItemsInfo[ITEM_CHOICE_BAND].holdEffect == HOLD_EFFECT_CHOICE_BAND); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_LYCANROC) { Speed(5); Moves(MOVE_ACCELEROCK, MOVE_MIGHTY_CLEAVE); Item(item); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(4); HP(1); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_DECIDUEYE_HISUI) { Speed(4); Moves(MOVE_LEAF_BLADE); } + OPPONENT(SPECIES_PHEROMOSA) { Speed(6); HP(1); Moves(MOVE_EARTHQUAKE); } + } WHEN { + TURN { MOVE(player, MOVE_MIGHTY_CLEAVE); EXPECT_MOVE(opponent, MOVE_TACKLE); item == ITEM_NONE ? EXPECT_SEND_OUT(opponent, 1) : EXPECT_SEND_OUT(opponent, 2); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI considers both meeting and exceeding KO thresholds correctly") +{ + u32 hp; + PARAMETRIZE { hp = 40; } + PARAMETRIZE { hp = 80; } + PARAMETRIZE { hp = 79; } + PARAMETRIZE { hp = 81; } + GIVEN { + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_ZIGZAGOON) { Speed(5); HP(hp); Moves(MOVE_PROTECT, MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(6); Moves(MOVE_EXPLOSION); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(6); Moves(MOVE_DRAGON_RAGE); } + OPPONENT(SPECIES_BELDUM) { Speed(4); Moves(MOVE_TACKLE); } + } WHEN { + TURN { MOVE(player, MOVE_PROTECT); EXPECT_MOVE(opponent, MOVE_EXPLOSION); hp > 80 ? EXPECT_SEND_OUT(opponent, 2) : EXPECT_SEND_OUT(opponent, 1); } + } +} diff --git a/test/battle/ai/ai_trytofaint.c b/test/battle/ai/ai_trytofaint.c index a1a23efdec04..50ab376503da 100644 --- a/test/battle/ai/ai_trytofaint.c +++ b/test/battle/ai/ai_trytofaint.c @@ -59,3 +59,17 @@ AI_SINGLE_BATTLE_TEST("AI sees Loaded Dice damage increase from multi hit moves" MESSAGE("Wobbuffet fainted!"); } } + +AI_SINGLE_BATTLE_TEST("AI sees Parental Bond killing through sturdy") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY); + PLAYER(SPECIES_MAGNEZONE){Level(64); Ability(ABILITY_STURDY); Moves(MOVE_TACKLE, MOVE_LIGHT_SCREEN); } + OPPONENT(SPECIES_KANGASKHAN_MEGA){Level(64); Moves(MOVE_DRAIN_PUNCH, MOVE_TAUNT); } + } WHEN { + TURN{ MOVE(player, MOVE_TACKLE); + EXPECT_MOVE(opponent, MOVE_DRAIN_PUNCH); // AI should see drain punch as a kill due to multi hit, outscoring taunt + } + } +} + diff --git a/test/battle/ai/can_use_all_moves.c b/test/battle/ai/can_use_all_moves.c new file mode 100644 index 000000000000..d7ea827f39b8 --- /dev/null +++ b/test/battle/ai/can_use_all_moves.c @@ -0,0 +1,706 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_ai_util.h" + +// All tests here compare the move to Splash, a move that does nothing and scores 90: the same as Thundershock on a ground type. +// The switch case for effects skips moves that have been human reviewed in three categories: something is wrong in some way; the move is equivalent to Splash for a good reason but a test is not known to exist; a test is known to exist. +// Jump to "TODO: AI HANDLING" and "TODO: AI TESTS" +// In many cases, AI handling exists but is likely insufficient in some way. + +AI_DOUBLE_BATTLE_TEST("AI uses Final Gambit") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, MOVE_FINAL_GAMBIT); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_FINAL_GAMBIT); SEND_OUT(playerLeft, 2); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI uses Guillotine") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, MOVE_GUILLOTINE); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_GUILLOTINE); SEND_OUT(playerLeft, 2); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI uses Sheer Cold") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, MOVE_SHEER_COLD); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_SHEER_COLD); SEND_OUT(playerLeft, 2); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI can use all moves, 1-100") +{ + u32 moveStart = 0; + u32 moveCap = 100; + + if (moveCap > MOVES_COUNT) + moveCap = MOVES_COUNT - 1; + + s32 j; + u32 move = MOVE_NONE; + + enum BattleMoveEffects effect; + + for (j = moveStart + 1; j <= moveCap; j++) + { + effect = GetMoveEffect(j); + + // Stat raising effects are not meant to be used when you have only Splash. + if (IsStatRaisingEffect(effect)) + continue; + + switch (effect) + { + //TODO: AI HANDLING + case EFFECT_OHKO: // Guillotine is crashing the test entirely. + case EFFECT_MIST: + case EFFECT_TELEPORT: + + //TODO: AI TESTS + case EFFECT_RESTORE_HP: + case EFFECT_MIMIC: + case EFFECT_DISABLE: + + // tests exist elsewhere + + // Skipped on purpose. + case EFFECT_PROTECT: + case EFFECT_NON_VOLATILE_STATUS: + case EFFECT_DO_NOTHING: + case EFFECT_HOLD_HANDS: + case EFFECT_CELEBRATE: + case EFFECT_HAPPY_HOUR: + break; + default: + PARAMETRIZE { move = j; } + } + } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, move); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI can use all moves, 101-200") +{ + u32 moveStart = 100; + u32 moveCap = 200; + + if (moveCap > MOVES_COUNT) + moveCap = MOVES_COUNT - 1; + + s32 j; + u32 move = MOVE_NONE; + + enum BattleMoveEffects effect; + + for (j = moveStart + 1; j <= moveCap; j++) + { + effect = GetMoveEffect(j); + + // Stat raising effects are not meant to be used when you have only Splash. + if (IsStatRaisingEffect(effect)) + continue; + + switch (effect) + { + //TODO: AI HANDLING + case EFFECT_LIGHT_SCREEN: + case EFFECT_REFLECT: + case EFFECT_BIDE: + case EFFECT_NIGHTMARE: + case EFFECT_SNORE: + case EFFECT_SKETCH: + case EFFECT_BELLY_DRUM: + case EFFECT_DESTINY_BOND: + case EFFECT_MIRROR_MOVE: + case EFFECT_REST: + case EFFECT_SUBSTITUTE: + + //TODO: AI TESTS + case EFFECT_RESTORE_HP: + case EFFECT_MIMIC: + case EFFECT_SOFTBOILED: + case EFFECT_DREAM_EATER: + case EFFECT_CONVERSION: + case EFFECT_PERISH_SONG: + case EFFECT_FOCUS_ENERGY: + case EFFECT_SPITE: + + // tests exist elsewhere + case EFFECT_HAZE: + + // Skipped on purpose. + case EFFECT_PROTECT: + case EFFECT_NON_VOLATILE_STATUS: + case EFFECT_DO_NOTHING: + case EFFECT_HOLD_HANDS: + case EFFECT_CELEBRATE: + case EFFECT_HAPPY_HOUR: + break; + default: + PARAMETRIZE { move = j; } + } + } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, move); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI can use all moves, 201-300") +{ + u32 moveStart = 200; + u32 moveCap = 300; + + if (moveCap > MOVES_COUNT) + moveCap = MOVES_COUNT - 1; + + s32 j; + u32 move = MOVE_NONE; + + enum BattleMoveEffects effect; + + for (j = moveStart + 1; j <= moveCap; j++) + { + effect = GetMoveEffect(j); + + // Stat raising effects are not meant to be used when you have only Splash. + if (IsStatRaisingEffect(effect)) + continue; + + switch (effect) + { + //TODO: AI HANDLING + case EFFECT_SLEEP_TALK: // logic exists but does not account for Rest correctly + case EFFECT_SAFEGUARD: // logic exists but does not account for Rest correctly + case EFFECT_FOLLOW_ME: + case EFFECT_SNATCH: + case EFFECT_GRUDGE: + case EFFECT_CAMOUFLAGE: + case EFFECT_IMPRISON: + case EFFECT_INGRAIN: + case EFFECT_MAGIC_COAT: + case EFFECT_MUD_SPORT: + + //TODO: AI TESTS + case EFFECT_RESTORE_HP: + case EFFECT_SOFTBOILED: + case EFFECT_ENDURE: + case EFFECT_BATON_PASS: + case EFFECT_ENCORE: + case EFFECT_MORNING_SUN: + case EFFECT_MOONLIGHT: + case EFFECT_SYNTHESIS: + case EFFECT_SPIT_UP: + case EFFECT_SWALLOW: + case EFFECT_WISH: + case EFFECT_RECYCLE: + + // tests exist elsewhere + case EFFECT_HEAL_BELL: + case EFFECT_SUNNY_DAY: + case EFFECT_RAIN_DANCE: + #if B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_SNOW + case EFFECT_SNOWSCAPE: + #else + case EFFECT_HAIL: + #endif + case EFFECT_ROLE_PLAY: + case EFFECT_REFRESH: + + // Skipped on purpose. + case EFFECT_PROTECT: + case EFFECT_NON_VOLATILE_STATUS: + case EFFECT_SANDSTORM: + case EFFECT_DO_NOTHING: + case EFFECT_HOLD_HANDS: + case EFFECT_CELEBRATE: + case EFFECT_HAPPY_HOUR: + break; + default: + PARAMETRIZE { move = j; } + } + } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, move); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI can use all moves, 301-400") +{ + u32 moveStart = 300; + u32 moveCap = 400; + + if (moveCap > MOVES_COUNT) + moveCap = MOVES_COUNT - 1; + + s32 j; + u32 move = MOVE_NONE; + + enum BattleMoveEffects effect; + + for (j = moveStart + 1; j <= moveCap; j++) + { + effect = GetMoveEffect(j); + + // Stat raising effects are not meant to be used when you have only Splash. + if (IsStatRaisingEffect(effect)) + continue; + + switch (effect) + { + //TODO: AI HANDLING + case EFFECT_SHEER_COLD: // Guillotine is crashing the test entirely. + case EFFECT_WATER_SPORT: + case EFFECT_LUCKY_CHANT: + case EFFECT_ME_FIRST: + case EFFECT_PSYCHO_SHIFT: + case EFFECT_COPYCAT: + case EFFECT_LAST_RESORT: + case EFFECT_AQUA_RING: + case EFFECT_HEALING_WISH: + case EFFECT_LUNAR_DANCE: + + //TODO: AI TESTS + case EFFECT_RESTORE_HP: + case EFFECT_ROOST: + case EFFECT_GUARD_SWAP: + case EFFECT_POWER_SWAP: + case EFFECT_HEART_SWAP: + case EFFECT_TAILWIND: + case EFFECT_POWER_TRICK: + case EFFECT_MAGNET_RISE: + + // tests exist elsewhere + case EFFECT_GRAVITY: + case EFFECT_HEAL_BELL: + case EFFECT_ATTACK_UP_USER_ALLY: + + // Skipped on purpose. + case EFFECT_PROTECT: + case EFFECT_NON_VOLATILE_STATUS: + case EFFECT_DO_NOTHING: + case EFFECT_HOLD_HANDS: + case EFFECT_CELEBRATE: + case EFFECT_HAPPY_HOUR: + break; + default: + PARAMETRIZE { move = j; } + } + } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, move); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI can use all moves, 401-500") +{ + u32 moveStart = 400; + u32 moveCap = 500; + + if (moveCap > MOVES_COUNT) + moveCap = MOVES_COUNT - 1; + + s32 j; + u32 move = MOVE_NONE; + + enum BattleMoveEffects effect; + + for (j = moveStart + 1; j <= moveCap; j++) + { + effect = GetMoveEffect(j); + + // Stat raising effects are not meant to be used when you have only Splash. + if (IsStatRaisingEffect(effect)) + continue; + + switch (effect) + { + //TODO: AI HANDLING + case EFFECT_HEALING_WISH: + case EFFECT_LUNAR_DANCE: + case EFFECT_WONDER_ROOM: + case EFFECT_FOLLOW_ME: + case EFFECT_MAGIC_ROOM: + case EFFECT_AFTER_YOU: + + //TODO: AI TESTS + case EFFECT_RESTORE_HP: + case EFFECT_CAPTIVATE: + case EFFECT_DARK_VOID: // Gen 4-6's case is not being handled + + // tests exist elsewhere + case EFFECT_TRICK_ROOM: + case EFFECT_GUARD_SPLIT: + case EFFECT_POWER_SPLIT: + + // Skipped on purpose. + case EFFECT_PROTECT: + case EFFECT_NON_VOLATILE_STATUS: + case EFFECT_DO_NOTHING: + case EFFECT_HOLD_HANDS: + case EFFECT_CELEBRATE: + case EFFECT_HAPPY_HOUR: + break; + default: + PARAMETRIZE { move = j; } + } + } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, move); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI can use all moves, 501-600") +{ + u32 moveStart = 515; + u32 moveCap = 600; + + if (moveCap > MOVES_COUNT) + moveCap = MOVES_COUNT - 1; + + s32 j; + u32 move = MOVE_NONE; + + enum BattleMoveEffects effect; + + for (j = moveStart + 1; j <= moveCap; j++) + { + effect = GetMoveEffect(j); + + // Stat raising effects are not meant to be used when you have only Splash. + if (IsStatRaisingEffect(effect)) + continue; + + switch (effect) + { + case EFFECT_FINAL_GAMBIT: + //TODO: AI HANDLING + case EFFECT_ALLY_SWITCH: + case EFFECT_QUASH: + case EFFECT_REFLECT_TYPE: + case EFFECT_SKY_DROP: + case EFFECT_MAT_BLOCK: + case EFFECT_ION_DELUGE: + case EFFECT_AROMATIC_MIST: + case EFFECT_POWDER: + case EFFECT_ELECTRIFY: + + //TODO: AI TESTS + case EFFECT_RESTORE_HP: + case EFFECT_HEAL_PULSE: + case EFFECT_BELCH: + case EFFECT_TOPSY_TURVY: + case EFFECT_FAIRY_LOCK: + + // tests exist elsewhere + case EFFECT_FLOWER_SHIELD: + case EFFECT_ROTOTILLER: + case EFFECT_GRASSY_TERRAIN: + case EFFECT_MISTY_TERRAIN: + + // Skipped on purpose. + case EFFECT_PROTECT: + case EFFECT_NON_VOLATILE_STATUS: + case EFFECT_DO_NOTHING: + case EFFECT_HOLD_HANDS: + case EFFECT_CELEBRATE: + case EFFECT_HAPPY_HOUR: + break; + default: + PARAMETRIZE { move = j; } + } + } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, move); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI can use all moves, 601-700") +{ + u32 moveStart = 600; + u32 moveCap = 700; + + if (moveCap > MOVES_COUNT) + moveCap = MOVES_COUNT - 1; + + s32 j; + u32 move = MOVE_NONE; + + enum BattleMoveEffects effect; + + for (j = moveStart + 1; j <= moveCap; j++) + { + effect = GetMoveEffect(j); + + // Stat raising effects are not meant to be used when you have only Splash. + if (IsStatRaisingEffect(effect)) + continue; + + switch (effect) + { + //TODO: AI HANDLING + case EFFECT_FAIL_IF_NOT_ARG_TYPE: + case EFFECT_STUFF_CHEEKS: + case EFFECT_NO_RETREAT: + case EFFECT_TEATIME: + + //TODO: AI TESTS + case EFFECT_RESTORE_HP: + case EFFECT_SHORE_UP: + case EFFECT_HEAL_PULSE: + case EFFECT_LASER_FOCUS: + case EFFECT_PURIFY: + case EFFECT_INSTRUCT: + case EFFECT_SOAK: + + // tests exist elsewhere + case EFFECT_ELECTRIC_TERRAIN: + case EFFECT_PSYCHIC_TERRAIN: + case EFFECT_AURORA_VEIL: + case EFFECT_GEAR_UP: + case EFFECT_MAGNETIC_FLUX: + + // Skipped on purpose. + case EFFECT_PROTECT: + case EFFECT_NON_VOLATILE_STATUS: + case EFFECT_DO_NOTHING: + case EFFECT_HOLD_HANDS: + case EFFECT_CELEBRATE: + case EFFECT_HAPPY_HOUR: + break; + default: + PARAMETRIZE { move = j; } + } + } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, move); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI can use all moves, 701-800") +{ + u32 moveStart = 700; + u32 moveCap = 800; + + if (moveCap > MOVES_COUNT) + moveCap = MOVES_COUNT - 1; + + s32 j; + u32 move = MOVE_NONE; + + enum BattleMoveEffects effect; + + for (j = moveStart + 1; j <= moveCap; j++) + { + effect = GetMoveEffect(j); + + // Stat raising effects are not meant to be used when you have only Splash. + if (IsStatRaisingEffect(effect)) + continue; + + switch (effect) + { + //TODO: AI HANDLING + case EFFECT_CLANGOROUS_SOUL: + case EFFECT_POLTERGEIST: + case EFFECT_COACHING: + case EFFECT_REVIVAL_BLESSING: + case EFFECT_FILLET_AWAY: + + //TODO: AI TESTS + case EFFECT_RESTORE_HP: + case EFFECT_STEEL_ROLLER: + case EFFECT_JUNGLE_HEALING: + case EFFECT_POWER_TRICK: + case EFFECT_TAKE_HEART: + + // tests exist elsewhere + case EFFECT_COURT_CHANGE: + case EFFECT_DOODLE: + case EFFECT_LIFE_DEW: + + // Skipped on purpose. + case EFFECT_PROTECT: + case EFFECT_NON_VOLATILE_STATUS: + case EFFECT_DO_NOTHING: + case EFFECT_HOLD_HANDS: + case EFFECT_CELEBRATE: + case EFFECT_HAPPY_HOUR: + break; + default: + PARAMETRIZE { move = j; } + } + } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, move); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI can use all moves, 801-900") +{ + u32 moveStart = 800; + u32 moveCap = 900; + + if (moveCap > MOVES_COUNT) + moveCap = MOVES_COUNT - 1; + + s32 j; + u32 move = MOVE_NONE; + + enum BattleMoveEffects effect; + + for (j = moveStart + 1; j <= moveCap; j++) + { + effect = GetMoveEffect(j); + + // Stat raising effects are not meant to be used when you have only Splash. + if (IsStatRaisingEffect(effect)) + continue; + + switch (effect) + { + //TODO: AI HANDLING + case EFFECT_SHED_TAIL: + case EFFECT_FAIL_IF_NOT_ARG_TYPE: + + //TODO: AI TESTS + case EFFECT_CHILLY_RECEPTION: + case EFFECT_TIDY_UP: + + // tests exist elsewhere + case EFFECT_SNOWSCAPE: + case EFFECT_DRAGON_CHEER: + + // Skipped on purpose. + case EFFECT_PROTECT: + case EFFECT_NON_VOLATILE_STATUS: + case EFFECT_DO_NOTHING: + case EFFECT_HOLD_HANDS: + case EFFECT_CELEBRATE: + case EFFECT_HAPPY_HOUR: + break; + default: + PARAMETRIZE { move = j; } + } + } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, move); } + } +} diff --git a/test/battle/ai/check_bad_move.c b/test/battle/ai/check_bad_move.c index 79b960ec6066..c5a34f0df4f5 100644 --- a/test/battle/ai/check_bad_move.c +++ b/test/battle/ai/check_bad_move.c @@ -4,7 +4,8 @@ AI_SINGLE_BATTLE_TEST("AI will not try to lower opposing stats if target is protected by it's ability") { - u16 ability, species, move; + enum Ability ability; + u32 species, move; PARAMETRIZE { ability = ABILITY_SPEED_BOOST; species = SPECIES_TORCHIC; move = MOVE_SCARY_FACE; } PARAMETRIZE { ability = ABILITY_HYPER_CUTTER; species = SPECIES_KRABBY; move = MOVE_GROWL; } @@ -15,6 +16,7 @@ AI_SINGLE_BATTLE_TEST("AI will not try to lower opposing stats if target is prot PARAMETRIZE { ability = ABILITY_CLEAR_BODY; species = SPECIES_BELDUM; move = MOVE_NOBLE_ROAR; } GIVEN { + WITH_CONFIG(CONFIG_ILLUMINATE_EFFECT, GEN_9); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_OMNISCIENT); PLAYER(species) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, move); } diff --git a/test/battle/ai/gimmick_dynamax.c b/test/battle/ai/gimmick_dynamax.c new file mode 100644 index 000000000000..99e6157c9466 --- /dev/null +++ b/test/battle/ai/gimmick_dynamax.c @@ -0,0 +1,65 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_ai_util.h" + +AI_SINGLE_BATTLE_TEST("AI uses Dynamax") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH); DynamaxLevel(10); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_SCRATCH, gimmick: GIMMICK_DYNAMAX); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Dynamax -- Max Moves are scored based on max move effects, not base effects") +{ + KNOWN_FAILING; + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH, MOVE_EXPLOSION); DynamaxLevel(10); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_EXPLOSION, gimmick: GIMMICK_DYNAMAX); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Dynamax -- AI does not dynamax before using a utility move") +{ + KNOWN_FAILING; + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_FAKE_OUT); DynamaxLevel(10); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_FAKE_OUT, gimmick: GIMMICK_NONE); } + } +} + +AI_TWO_VS_ONE_BATTLE_TEST("AI only Dynamaxes once per trainer in 2v1 multi battles") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + MULTI_PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH); } + MULTI_PARTNER(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH); DynamaxLevel(10); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH); DynamaxLevel(10); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_SPLASH); + MOVE(playerRight, MOVE_SPLASH); + EXPECT_MOVE(opponentLeft, MOVE_SPLASH, gimmick: GIMMICK_DYNAMAX); + EXPECT_MOVE(opponentRight, MOVE_SPLASH, gimmick: GIMMICK_NONE); + } + TURN { + MOVE(playerLeft, MOVE_SPLASH); + MOVE(playerRight, MOVE_SPLASH); + EXPECT_MOVE(opponentLeft, MOVE_SPLASH, gimmick: GIMMICK_NONE); + EXPECT_MOVE(opponentRight, MOVE_SPLASH, gimmick: GIMMICK_NONE); + } + } +} + +// Copycatting an ally's Max Guard rendition of Trick Room was a notable strategy. +TO_DO_BATTLE_TEST("TODO: AI uses Dynamax -- AI uses Copycat against a Dynamaxed Pokemon intelligently") diff --git a/test/battle/ai/gimmick_mega.c b/test/battle/ai/gimmick_mega.c new file mode 100644 index 000000000000..ef94223122e5 --- /dev/null +++ b/test/battle/ai/gimmick_mega.c @@ -0,0 +1,19 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_ai_util.h" + +AI_SINGLE_BATTLE_TEST("AI uses Mega Evolution") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_VENUSAUR) { Item(ITEM_VENUSAURITE); Moves(MOVE_SLUDGE_BOMB); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_SLUDGE_BOMB, gimmick: GIMMICK_MEGA); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, opponent); + } THEN { + EXPECT_EQ(opponent->species, SPECIES_VENUSAUR_MEGA); + } +} + diff --git a/test/battle/ai/gimmick_z_move.c b/test/battle/ai/gimmick_z_move.c new file mode 100644 index 000000000000..b6432987b776 --- /dev/null +++ b/test/battle/ai/gimmick_z_move.c @@ -0,0 +1,213 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_ai_util.h" +#include "constants/battle_z_move_effects.h" + +AI_SINGLE_BATTLE_TEST("AI uses Z-moves.") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Moves(MOVE_QUICK_ATTACK); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_QUICK_ATTACK, gimmick: GIMMICK_Z_MOVE); } + } +} + +AI_SINGLE_BATTLE_TEST("AI does not use damaging Z-moves if the player would faint anyway.") +{ + u32 currentHP; + PARAMETRIZE { currentHP = 1; } + PARAMETRIZE { currentHP = 500; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); + PLAYER(SPECIES_WOBBUFFET) { HP(currentHP); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Moves(MOVE_QUICK_ATTACK); } + } WHEN { + if (currentHP != 1) + TURN { EXPECT_MOVE(opponent, MOVE_QUICK_ATTACK, gimmick: GIMMICK_Z_MOVE); } + else + TURN { EXPECT_MOVE(opponent, MOVE_QUICK_ATTACK, gimmick: GIMMICK_NONE); } + } +} +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Extreme Evoboost") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_EEVEE) { Item(ITEM_EEVIUM_Z); Moves(MOVE_POUND, MOVE_LAST_RESORT); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_LAST_RESORT, gimmick: GIMMICK_Z_MOVE); } + TURN { EXPECT_MOVE(opponent, MOVE_POUND, gimmick: GIMMICK_NONE); + SCORE_LT_VAL(opponent, MOVE_LAST_RESORT, AI_SCORE_DEFAULT); } + TURN { EXPECT_MOVE(opponent, MOVE_LAST_RESORT, gimmick: GIMMICK_NONE); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves to bypass move limitations") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Moves(MOVE_POUND, MOVE_LAST_RESORT); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_LAST_RESORT, gimmick: GIMMICK_Z_MOVE); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- 10,000,000 Volt Thunderbolt") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_PIKACHU_PARTNER) { Item(ITEM_PIKASHUNIUM_Z); Moves(MOVE_THUNDERBOLT); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_THUNDERBOLT, gimmick: GIMMICK_Z_MOVE); } + } +} +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Conversion") +{ + enum Ability ability; + PARAMETRIZE { ability = ABILITY_NONE; } + PARAMETRIZE { ability = ABILITY_OPPORTUNIST; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + ASSUME(GetMoveType(MOVE_CONVERSION) == TYPE_NORMAL); + PLAYER(SPECIES_WOBBUFFET) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Ability(ABILITY_ADAPTABILITY); Moves(MOVE_THUNDERBOLT, MOVE_CONVERSION); } + } WHEN { + if (ability == ABILITY_OPPORTUNIST) + TURN { EXPECT_MOVE(opponent, MOVE_CONVERSION, gimmick: GIMMICK_NONE); } + else + TURN { EXPECT_MOVE(opponent, MOVE_CONVERSION, gimmick: GIMMICK_Z_MOVE); } + } +} + + +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Destiny Bond is not used in singles") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_GHOSTIUM_Z); Moves(MOVE_DESTINY_BOND); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_DESTINY_BOND, gimmick: GIMMICK_NONE); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI uses Z-Moves -- Z-Destiny Bond is used when about to die") +{ + u32 currentHP; + PARAMETRIZE { currentHP = 1; } + PARAMETRIZE { currentHP = 500; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_POUND); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { HP(currentHP); Item(ITEM_GHOSTIUM_Z); Moves(MOVE_DESTINY_BOND); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (currentHP == 1) + TURN { EXPECT_MOVE(opponentLeft, MOVE_DESTINY_BOND, gimmick: GIMMICK_Z_MOVE); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_DESTINY_BOND, gimmick: GIMMICK_NONE); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Detect") +{ + u32 move; + PARAMETRIZE { move = MOVE_THUNDERBOLT; } + PARAMETRIZE { move = MOVE_CLOSE_COMBAT; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_PREDICT_MOVE ); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_FAKE_OUT); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FIGHTINIUM_Z); Moves(MOVE_DETECT, move); } + } WHEN { + if (move == MOVE_CLOSE_COMBAT) + TURN { EXPECT_MOVE(opponent, MOVE_DETECT, gimmick: GIMMICK_NONE); } + else + TURN { EXPECT_MOVE(opponent, MOVE_DETECT, gimmick: GIMMICK_Z_MOVE); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Happy Hour") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Moves(MOVE_POUND, MOVE_HAPPY_HOUR); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_HAPPY_HOUR, gimmick: GIMMICK_Z_MOVE); + SCORE_GT_VAL(opponent, MOVE_HAPPY_HOUR, AI_SCORE_DEFAULT); } + TURN { EXPECT_MOVE(opponent, MOVE_POUND, gimmick: GIMMICK_NONE); + SCORE_EQ_VAL(opponent, MOVE_HAPPY_HOUR, 90); } + } +} + +TO_DO_BATTLE_TEST("TODO: AI uses Z-Moves -- Z-Haze") + +TO_DO_BATTLE_TEST("TODO: AI uses Z-Moves -- Z-Mirror Move") + +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Nature Power") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_PREDICT_MOVE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Moves(MOVE_NATURE_POWER, MOVE_HEADBUTT); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_NATURE_POWER, gimmick: GIMMICK_Z_MOVE); } + } +} + +// Requires handling for Wish passing/Healing Wish/other ways to determine what pokemon to heal via switching into. +TO_DO_BATTLE_TEST("TODO: AI uses Z-Moves -- Z-Parting Shot") + +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Splash") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Moves(MOVE_POUND, MOVE_SPLASH); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_SPLASH, gimmick: GIMMICK_Z_MOVE); + SCORE_GT_VAL(opponent, MOVE_SPLASH, AI_SCORE_DEFAULT); } + TURN { EXPECT_MOVE(opponent, MOVE_POUND, gimmick: GIMMICK_NONE); + SCORE_EQ_VAL(opponent, MOVE_SPLASH, 90); } + } +} + +TO_DO_BATTLE_TEST("TODO: AI uses Z-Moves -- Z-Tailwind") + +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Transform") +{ + u32 currentHP, move; + PARAMETRIZE { currentHP = 1; move = MOVE_HEADBUTT; } + PARAMETRIZE { currentHP = 1; move = MOVE_THUNDERBOLT; } + PARAMETRIZE { currentHP = 500; move = MOVE_HEADBUTT; } + PARAMETRIZE { currentHP = 500; move = MOVE_THUNDERBOLT; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET) { Moves(move, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { HP(currentHP); Item(ITEM_NORMALIUM_Z); Moves(MOVE_TRANSFORM); } + } WHEN { + if (currentHP == 1 || move == MOVE_THUNDERBOLT) + TURN { EXPECT_MOVE(opponent, MOVE_TRANSFORM, gimmick: GIMMICK_Z_MOVE); } + else + TURN { EXPECT_MOVE(opponent, MOVE_TRANSFORM, gimmick: GIMMICK_NONE); } + } +} + +TO_DO_BATTLE_TEST("TODO: AI uses Z-Moves -- Z-Trick Room") + + diff --git a/test/battle/badge_boost.c b/test/battle/badge_boost.c new file mode 100644 index 000000000000..b03168d476de --- /dev/null +++ b/test/battle/badge_boost.c @@ -0,0 +1,166 @@ +#include "global.h" +#include "event_data.h" +#include "test/battle.h" + +WILD_BATTLE_TEST("Badge boost: B_FLAG_BADGE_BOOST_ATTACK boost Attack", s16 dmg) +{ + u32 badge = 0; + u32 genConfig = 0; + for (u32 gen = GEN_1; gen <= GEN_LATEST; gen++) + { + PARAMETRIZE{badge = FALSE; genConfig = gen;} + PARAMETRIZE{badge = TRUE; genConfig = gen;} + } + GIVEN { + if (badge) + FlagSet(B_FLAG_BADGE_BOOST_ATTACK); + else + FlagClear(B_FLAG_BADGE_BOOST_ATTACK); + WITH_CONFIG(CONFIG_BADGE_BOOST, genConfig); + PLAYER(SPECIES_WOBBUFFET) {} + OPPONENT(SPECIES_WOBBUFFET) {} + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + HP_BAR(opponent, captureDamage: &results[i].dmg); + } FINALLY { + for (u32 gen = GEN_1; gen <= GEN_LATEST; gen++) + { + if (gen <= GEN_3) + EXPECT_GT(results[2 * gen + 1].dmg, results[2 * gen].dmg); + else + EXPECT_EQ(results[2 * gen + 1].dmg, results[2 * gen].dmg); + } + } +} + +WILD_BATTLE_TEST("Badge boost: B_FLAG_BADGE_BOOST_SPATK boost Special Attack", s16 dmg) +{ + u32 badge = 0; + u32 genConfig = 0; + for (u32 gen = GEN_1; gen <= GEN_LATEST; gen++) + { + PARAMETRIZE{badge = FALSE; genConfig = gen;} + PARAMETRIZE{badge = TRUE; genConfig = gen;} + } + GIVEN { + if (badge) + FlagSet(B_FLAG_BADGE_BOOST_SPATK); + else + FlagClear(B_FLAG_BADGE_BOOST_SPATK); + WITH_CONFIG(CONFIG_BADGE_BOOST, genConfig); + PLAYER(SPECIES_WOBBUFFET) {} + OPPONENT(SPECIES_WOBBUFFET) {} + } WHEN { + TURN { MOVE(player, MOVE_THUNDER_SHOCK); } + } SCENE { + HP_BAR(opponent, captureDamage: &results[i].dmg); + } FINALLY { + for (u32 gen = GEN_1; gen <= GEN_LATEST; gen++) + { + if (gen <= GEN_3) + EXPECT_GT(results[2 * gen + 1].dmg, results[2 * gen].dmg); + else + EXPECT_EQ(results[2 * gen + 1].dmg, results[2 * gen].dmg); + } + } +} + +WILD_BATTLE_TEST("Badge boost: B_FLAG_BADGE_BOOST_DEFENSE boost Defense", s16 dmg) +{ + u32 badge = 0; + u32 genConfig = 0; + for (u32 gen = GEN_1; gen <= GEN_LATEST; gen++) + { + PARAMETRIZE{badge = FALSE; genConfig = gen;} + PARAMETRIZE{badge = TRUE; genConfig = gen;} + } + + GIVEN { + if (badge) + FlagSet(B_FLAG_BADGE_BOOST_DEFENSE); + else + FlagClear(B_FLAG_BADGE_BOOST_DEFENSE); + WITH_CONFIG(CONFIG_BADGE_BOOST, genConfig); + PLAYER(SPECIES_WOBBUFFET) {} + OPPONENT(SPECIES_WOBBUFFET) {} + } WHEN { + TURN { MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + HP_BAR(player, captureDamage: &results[i].dmg); + } FINALLY { + for (u32 gen = GEN_1; gen <= GEN_LATEST; gen++) + { + if (gen <= GEN_3) + EXPECT_LT(results[2 * gen + 1].dmg, results[2 * gen].dmg); + else + EXPECT_EQ(results[2 * gen + 1].dmg, results[2 * gen].dmg); + } + } +} + +WILD_BATTLE_TEST("Badge boost: B_FLAG_BADGE_BOOST_SPDEF boost Special Defense", s16 dmg) +{ + u32 badge = 0; + u32 genConfig = 0; + for (u32 gen = GEN_1; gen <= GEN_LATEST; gen++) + { + PARAMETRIZE{badge = FALSE; genConfig = gen;} + PARAMETRIZE{badge = TRUE; genConfig = gen;} + } + + GIVEN { + if (badge) + FlagSet(B_FLAG_BADGE_BOOST_SPDEF); + else + FlagClear(B_FLAG_BADGE_BOOST_SPDEF); + WITH_CONFIG(CONFIG_BADGE_BOOST, genConfig); + PLAYER(SPECIES_WOBBUFFET) {} + OPPONENT(SPECIES_WOBBUFFET) {} + } WHEN { + TURN { MOVE(opponent, MOVE_THUNDER_SHOCK); } + } SCENE { + HP_BAR(player, captureDamage: &results[i].dmg); + } FINALLY { + for (u32 gen = GEN_1; gen <= GEN_LATEST; gen++) + { + if (gen <= GEN_3) + EXPECT_LT(results[2 * gen + 1].dmg, results[2 * gen].dmg); + else + EXPECT_EQ(results[2 * gen + 1].dmg, results[2 * gen].dmg); + } + } +} + +WILD_BATTLE_TEST("Badge boost: B_FLAG_BADGE_BOOST_SPEED boost Speed", s16 dmg) +{ + u32 badge = 0; + u32 genConfig = 0; + for (u32 gen = GEN_1; gen <= GEN_LATEST; gen++) + { + PARAMETRIZE{badge = FALSE; genConfig = gen;} + PARAMETRIZE{badge = TRUE; genConfig = gen;} + } + GIVEN { + if (badge) + FlagSet(B_FLAG_BADGE_BOOST_SPEED); + else + FlagClear(B_FLAG_BADGE_BOOST_SPEED); + WITH_CONFIG(CONFIG_BADGE_BOOST, genConfig); + PLAYER(SPECIES_WOBBUFFET) { Speed(100); HP(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(101); HP(1); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); MOVE(opponent, MOVE_SCRATCH);} + } THEN { + if (badge && genConfig <= GEN_3) + { + EXPECT_EQ(opponent->hp, 0); + EXPECT_EQ(player->hp, 1); + } + else + { + EXPECT_EQ(opponent->hp, 1); + EXPECT_EQ(player->hp, 0); + } + } +} diff --git a/test/battle/crit_chance.c b/test/battle/crit_chance.c index 0bc88418457c..8e1c9cf682ec 100644 --- a/test/battle/crit_chance.c +++ b/test/battle/crit_chance.c @@ -13,8 +13,8 @@ SINGLE_BATTLE_TEST("Critical hits without modifiers occur at different rates by PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseSpeed == 33); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); + ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -35,7 +35,7 @@ SINGLE_BATTLE_TEST("Crit Chance: Raising critical hit rate to 3 guarantees a cri PARAMETRIZE { genConfig = j; passes = 1, trials = 1; } // 100% PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_SLASH) == 1); ASSUME(gItemsInfo[ITEM_SCOPE_LENS].holdEffect == HOLD_EFFECT_SCOPE_LENS); PLAYER(SPECIES_TOGEKISS) { Ability(ABILITY_SUPER_LUCK); Item(ITEM_SCOPE_LENS); }; diff --git a/test/battle/damage_formula.c b/test/battle/damage_formula.c index 067972551018..b62ed36ad927 100644 --- a/test/battle/damage_formula.c +++ b/test/battle/damage_formula.c @@ -41,7 +41,7 @@ SINGLE_BATTLE_TEST("Damage calculation matches Gen5+") } } -SINGLE_BATTLE_TEST("Damage calculation matches Gen5+ (Muscle Band, crit)") +SINGLE_BATTLE_TEST("Damage calculation matches Gen6+ (Muscle Band, crit)") { s16 dmg; s16 expectedDamage; @@ -62,6 +62,7 @@ SINGLE_BATTLE_TEST("Damage calculation matches Gen5+ (Muscle Band, crit)") PARAMETRIZE { expectedDamage = 276; } PARAMETRIZE { expectedDamage = 268; } GIVEN { + WITH_CONFIG(CONFIG_CRIT_MULTIPLIER, GEN_6); ASSUME(GetMoveCategory(MOVE_ICE_FANG) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_GLACEON) { Level(75); Attack(123); Item(ITEM_MUSCLE_BAND); } OPPONENT(SPECIES_GARCHOMP) { Defense(163); } @@ -101,6 +102,7 @@ SINGLE_BATTLE_TEST("Damage calculation matches Gen5+ (Marshadow vs Mawile)") PARAMETRIZE { expectedDamage = 123; } GIVEN { ASSUME(GetMoveCategory(MOVE_SPECTRAL_THIEF) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(B_UPDATED_TYPE_MATCHUPS >= GEN_6); // Steel resists Ghost in Gen2-5 PLAYER(SPECIES_MARSHADOW) { Level(100); Attack(286); } OPPONENT(SPECIES_MAWILE) { Level(100); Defense(226); HP(241); } } WHEN { @@ -117,7 +119,7 @@ SINGLE_BATTLE_TEST("Damage calculation matches Gen5+ (Marshadow vs Mawile)") } } -DOUBLE_BATTLE_TEST("A spread move will do correct damage to the second mon if the first target faints from first hit of the spread move") +DOUBLE_BATTLE_TEST("A spread move will do correct damage to the second mon if the first target faints from first hit of the spread move (double battle)") { s16 damage[6]; GIVEN { @@ -151,6 +153,108 @@ DOUBLE_BATTLE_TEST("A spread move will do correct damage to the second mon if th } } +MULTI_BATTLE_TEST("A spread move will do correct damage to the second mon if the first target faints from first hit of the spread move (multibattle)") +{ + s16 damage[6]; + GIVEN { + MULTI_PLAYER(SPECIES_REGIROCK); + MULTI_PARTNER(SPECIES_REGIROCK); + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { HP(200); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_ROCK_SLIDE); } + TURN { MOVE(playerLeft, MOVE_ROCK_SLIDE); MOVE(playerRight, MOVE_ROCK_SLIDE); } + TURN { MOVE(playerLeft, MOVE_ROCK_SLIDE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[0]); + HP_BAR(opponentRight, captureDamage: &damage[1]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[2]); + HP_BAR(opponentRight, captureDamage: &damage[3]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerRight); + HP_BAR(opponentRight, captureDamage: &damage[4]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentRight, captureDamage: &damage[5]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + EXPECT_EQ(damage[1], damage[3]); + EXPECT_MUL_EQ(damage[5], UQ_4_12(0.75), damage[3]); + EXPECT_EQ(damage[4], damage[5]); + } +} + +TWO_VS_ONE_BATTLE_TEST("A spread move will do correct damage to the second mon if the first target faints from first hit of the spread move (2v1)") +{ + s16 damage[6]; + GIVEN { + MULTI_PLAYER(SPECIES_REGIROCK); + MULTI_PARTNER(SPECIES_REGIROCK); + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { HP(200); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_ROCK_SLIDE); } + TURN { MOVE(playerLeft, MOVE_ROCK_SLIDE); MOVE(playerRight, MOVE_ROCK_SLIDE); } + TURN { MOVE(playerLeft, MOVE_ROCK_SLIDE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[0]); + HP_BAR(opponentRight, captureDamage: &damage[1]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[2]); + HP_BAR(opponentRight, captureDamage: &damage[3]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerRight); + HP_BAR(opponentRight, captureDamage: &damage[4]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentRight, captureDamage: &damage[5]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + EXPECT_EQ(damage[1], damage[3]); + EXPECT_MUL_EQ(damage[5], UQ_4_12(0.75), damage[3]); + EXPECT_EQ(damage[4], damage[5]); + } +} + +ONE_VS_TWO_BATTLE_TEST("A spread move will do correct damage to the second mon if the first target faints from first hit of the spread move (1v2)") +{ + s16 damage[6]; + GIVEN { + MULTI_PLAYER(SPECIES_REGIROCK); + MULTI_PLAYER(SPECIES_REGIROCK); + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { HP(200); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_ROCK_SLIDE); } + TURN { MOVE(playerLeft, MOVE_ROCK_SLIDE); MOVE(playerRight, MOVE_ROCK_SLIDE); } + TURN { MOVE(playerLeft, MOVE_ROCK_SLIDE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[0]); + HP_BAR(opponentRight, captureDamage: &damage[1]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[2]); + HP_BAR(opponentRight, captureDamage: &damage[3]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerRight); + HP_BAR(opponentRight, captureDamage: &damage[4]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentRight, captureDamage: &damage[5]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + EXPECT_EQ(damage[1], damage[3]); + EXPECT_MUL_EQ(damage[5], UQ_4_12(0.75), damage[3]); + EXPECT_EQ(damage[4], damage[5]); + } +} + SINGLE_BATTLE_TEST("Punching Glove vs Muscle Band Damage calculation") { s16 dmgPlayer, dmgOpponent; @@ -196,6 +300,7 @@ SINGLE_BATTLE_TEST("Gem boosted Damage calculation") { s16 dmg; s16 expectedDamage; +#if I_GEM_BOOST_POWER >= GEN_6 PARAMETRIZE { expectedDamage = 240; } PARAMETRIZE { expectedDamage = 237; } PARAMETRIZE { expectedDamage = 234; } @@ -212,6 +317,25 @@ SINGLE_BATTLE_TEST("Gem boosted Damage calculation") PARAMETRIZE { expectedDamage = 208; } PARAMETRIZE { expectedDamage = 205; } PARAMETRIZE { expectedDamage = 204; } +#else + KNOWN_FAILING; + PARAMETRIZE { expectedDamage = 273; } + PARAMETRIZE { expectedDamage = 270; } + PARAMETRIZE { expectedDamage = 267; } + PARAMETRIZE { expectedDamage = 264; } + PARAMETRIZE { expectedDamage = 261; } + PARAMETRIZE { expectedDamage = 258; } + PARAMETRIZE { expectedDamage = 256; } + PARAMETRIZE { expectedDamage = 253; } + PARAMETRIZE { expectedDamage = 250; } + PARAMETRIZE { expectedDamage = 247; } + PARAMETRIZE { expectedDamage = 244; } + PARAMETRIZE { expectedDamage = 241; } + PARAMETRIZE { expectedDamage = 240; } + PARAMETRIZE { expectedDamage = 237; } + PARAMETRIZE { expectedDamage = 234; } + PARAMETRIZE { expectedDamage = 231; } +#endif GIVEN { PLAYER(SPECIES_MAKUHITA) { Item(ITEM_FIGHTING_GEM); } OPPONENT(SPECIES_MAKUHITA); @@ -231,23 +355,36 @@ SINGLE_BATTLE_TEST("Gem boosted Damage calculation") #define NUM_DAMAGE_SPREADS (DMG_ROLL_PERCENT_HI - DMG_ROLL_PERCENT_LO) + 1 -static const s16 sThunderShockTransistorSpread[] = { 54, 55, 56, 57, 57, 58, 59, 60, 60, 60, 61, 62, 63, 63, 64, 65 }; +static const s16 sThunderShockTransistorSpreadGen9[] = { 54, 55, 56, 57, 57, 58, 59, 60, 60, 60, 61, 62, 63, 63, 64, 65 }; +static const s16 sThunderShockTransistorSpreadGen8[] = { 63, 64, 65, 66, 66, 67, 68, 69, 69, 70, 71, 72, 72, 73, 74, 75 }; static const s16 sThunderShockRegularSpread[] = { 42, 42, 43, 43, 44, 45, 45, 45, 46, 46, 47, 48, 48, 48, 49, 50 }; -static const s16 sWildChargeTransistorSpread[] = { 123, 124, 126, 127, 129, 130, 132, 133, 135, 136, 138, 139, 141, 142, 144, 145 }; +static const s16 sWildChargeTransistorSpreadGen9[] = { 123, 124, 126, 127, 129, 130, 132, 133, 135, 136, 138, 139, 141, 142, 144, 145 }; +static const s16 sWildChargeTransistorSpreadGen8[] = { 141, 143, 145, 147, 148, 150, 151, 153, 155, 156, 158, 160, 162, 163, 165, 167 }; static const s16 sWildChargeRegularSpread[] = { 94, 96, 96, 98, 99, 100, 101, 102, 103, 105, 105, 107, 108, 109, 110, 111 }; DOUBLE_BATTLE_TEST("Transistor Damage calculation", s16 damage) { s16 expectedDamageTransistorSpec = 0, expectedDamageRegularPhys = 0, expectedDamageRegularSpec = 0, expectedDamageTransistorPhys = 0; s16 damagePlayerLeft, damagePlayerRight, damageOpponentLeft, damageOpponentRight; + u32 gen = 0; + for (u32 spread = 0; spread < 16; ++spread) { + PARAMETRIZE { gen = GEN_9, + expectedDamageTransistorSpec = sThunderShockTransistorSpreadGen9[spread], + expectedDamageRegularSpec = sThunderShockRegularSpread[spread]; + expectedDamageTransistorPhys = sWildChargeTransistorSpreadGen9[spread], + expectedDamageRegularPhys = sWildChargeRegularSpread[spread]; + } + } for (u32 spread = 0; spread < 16; ++spread) { - PARAMETRIZE { expectedDamageTransistorSpec = sThunderShockTransistorSpread[spread], + PARAMETRIZE { gen = GEN_8, + expectedDamageTransistorSpec = sThunderShockTransistorSpreadGen8[spread], expectedDamageRegularSpec = sThunderShockRegularSpread[spread], - expectedDamageTransistorPhys = sWildChargeTransistorSpread[spread], + expectedDamageTransistorPhys = sWildChargeTransistorSpreadGen8[spread], expectedDamageRegularPhys = sWildChargeRegularSpread[spread]; } } GIVEN { + WITH_CONFIG(CONFIG_TRANSISTOR_BOOST, gen); ASSUME(GetMoveType(MOVE_WILD_CHARGE) == TYPE_ELECTRIC); ASSUME(GetMoveType(MOVE_THUNDER_SHOCK) == TYPE_ELECTRIC); ASSUME(GetMoveCategory(MOVE_WILD_CHARGE) == DAMAGE_CATEGORY_PHYSICAL); @@ -260,10 +397,10 @@ DOUBLE_BATTLE_TEST("Transistor Damage calculation", s16 damage) OPPONENT(SPECIES_REGIELEKI) { Ability(ABILITY_TRANSISTOR); } } WHEN { TURN { - MOVE(playerLeft, MOVE_THUNDER_SHOCK, target: opponentLeft, WITH_RNG(RNG_DAMAGE_MODIFIER, 15 - i)); - MOVE(playerRight, MOVE_THUNDER_SHOCK, target: opponentRight, WITH_RNG(RNG_DAMAGE_MODIFIER, 15 - i)); - MOVE(opponentLeft, MOVE_WILD_CHARGE, target: playerLeft, WITH_RNG(RNG_DAMAGE_MODIFIER, 15 - i)); - MOVE(opponentRight, MOVE_WILD_CHARGE, target: playerRight, WITH_RNG(RNG_DAMAGE_MODIFIER, 15 - i)); + MOVE(playerLeft, MOVE_THUNDER_SHOCK, target: opponentLeft, WITH_RNG(RNG_DAMAGE_MODIFIER, 15 - (i % 16))); + MOVE(playerRight, MOVE_THUNDER_SHOCK, target: opponentRight, WITH_RNG(RNG_DAMAGE_MODIFIER, 15 - (i % 16))); + MOVE(opponentLeft, MOVE_WILD_CHARGE, target: playerLeft, WITH_RNG(RNG_DAMAGE_MODIFIER, 15 - (i % 16))); + MOVE(opponentRight, MOVE_WILD_CHARGE, target: playerRight, WITH_RNG(RNG_DAMAGE_MODIFIER, 15 - (i % 16))); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDER_SHOCK, playerLeft); diff --git a/test/battle/defrost.c b/test/battle/defrost.c index 3d456d6673b5..a226a49f1eb1 100644 --- a/test/battle/defrost.c +++ b/test/battle/defrost.c @@ -16,3 +16,17 @@ DOUBLE_BATTLE_TEST("Defrost: A fire type spread move will thaw both targets") STATUS_ICON(opponentRight, freeze: FALSE); } } + +SINGLE_BATTLE_TEST("Defrost: Scald does not thaw targets if user is asleep") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_FROSTBITE); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP_TURN(3)); } + } WHEN { + TURN { MOVE(opponent, MOVE_SCALD); MOVE(player, MOVE_CELEBRATE); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALD, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + HP_BAR(player); + } +} diff --git a/test/battle/end_turn_effects.c b/test/battle/end_turn_effects.c index 51aa1e79bf02..931f792efed8 100644 --- a/test/battle/end_turn_effects.c +++ b/test/battle/end_turn_effects.c @@ -1,7 +1,7 @@ #include "global.h" #include "test/battle.h" -DOUBLE_BATTLE_TEST("End Turn Effects: First Event Block is executed correctly") +DOUBLE_BATTLE_TEST("End Turn Effects: First Event Block is executed correctly (double battle)") { s16 healed; s16 damage; @@ -29,3 +29,113 @@ DOUBLE_BATTLE_TEST("End Turn Effects: First Event Block is executed correctly") } } +DOUBLE_BATTLE_TEST("End Turn Effects: Effects are applied by Speed Order") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT) { MaxHP(200); HP(100); Speed(3); } + PLAYER(SPECIES_RILLABOOM) { MaxHP(200); HP(100); Speed(1); Ability(ABILITY_GRASSY_SURGE); } + OPPONENT(SPECIES_MEWTWO) { MaxHP(200); HP(100); Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(200); HP(100); Speed(4); } + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_FAKE_OUT, target: playerLeft); + MOVE(playerRight, MOVE_FAKE_OUT, target: opponentRight); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FAKE_OUT, opponentLeft); + HP_BAR(playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FAKE_OUT, playerRight); + HP_BAR(opponentRight); + + HP_BAR(opponentRight); + HP_BAR(playerLeft); + HP_BAR(opponentLeft); + HP_BAR(playerRight); + } +} + +MULTI_BATTLE_TEST("End Turn Effects: First Event Block is executed correctly (multibattle)") +{ + s16 healed; + s16 damage; + + GIVEN { + MULTI_PLAYER(SPECIES_WYNAUT) { HP(100); Speed(1); } + MULTI_PARTNER(SPECIES_EKANS) { HP(100); Ability(ABILITY_SHED_SKIN); Status1(STATUS1_BURN); Speed(2); } + MULTI_OPPONENT_A(SPECIES_WYNAUT) { HP(100); Item(ITEM_LEFTOVERS); Speed(3); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { HP(100); Item(ITEM_BLACK_SLUDGE); Speed(4); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_GRASSY_TERRAIN); } + } SCENE { + MESSAGE("The opposing Wobbuffet is healed by the grassy terrain!"); + HP_BAR(opponentRight, captureDamage: &healed); + HP_BAR(opponentRight, captureDamage: &damage); + MESSAGE("The opposing Wobbuffet was hurt by the Black Sludge!"); + MESSAGE("The opposing Wynaut is healed by the grassy terrain!"); + MESSAGE("The opposing Wynaut restored a little HP using its Leftovers!"); + MESSAGE("Ekans is healed by the grassy terrain!"); + MESSAGE("Ekans's Shed Skin cured its burn problem!"); + MESSAGE("Wynaut is healed by the grassy terrain!"); + } THEN { + EXPECT_GT(0, healed); + EXPECT_GT(damage, 0); + } +} + + +TWO_VS_ONE_BATTLE_TEST("End Turn Effects: First Event Block is executed correctly (2v1)") +{ + s16 healed; + s16 damage; + + GIVEN { + MULTI_PLAYER(SPECIES_WYNAUT) { HP(100); Speed(1);} + MULTI_PARTNER(SPECIES_EKANS) { HP(100); Ability(ABILITY_SHED_SKIN); Status1(STATUS1_BURN); Speed(2); } + MULTI_OPPONENT_A(SPECIES_WYNAUT) { HP(100); Item(ITEM_LEFTOVERS); Speed(3); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { HP(100); Item(ITEM_BLACK_SLUDGE); Speed(4); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_GRASSY_TERRAIN); } + } SCENE { + MESSAGE("The opposing Wobbuffet is healed by the grassy terrain!"); + HP_BAR(opponentRight, captureDamage: &healed); + HP_BAR(opponentRight, captureDamage: &damage); + MESSAGE("The opposing Wobbuffet was hurt by the Black Sludge!"); + MESSAGE("The opposing Wynaut is healed by the grassy terrain!"); + MESSAGE("The opposing Wynaut restored a little HP using its Leftovers!"); + MESSAGE("Ekans is healed by the grassy terrain!"); + MESSAGE("Ekans's Shed Skin cured its burn problem!"); + MESSAGE("Wynaut is healed by the grassy terrain!"); + } THEN { + EXPECT_GT(0, healed); + EXPECT_GT(damage, 0); + } +} + + +ONE_VS_TWO_BATTLE_TEST("End Turn Effects: First Event Block is executed correctly (1v2)") +{ + s16 healed; + s16 damage; + + GIVEN { + MULTI_PLAYER(SPECIES_WYNAUT) { HP(100); Speed(1);} + MULTI_PLAYER(SPECIES_EKANS) { HP(100); Ability(ABILITY_SHED_SKIN); Status1(STATUS1_BURN); Speed(2); } + MULTI_OPPONENT_A(SPECIES_WYNAUT) { HP(100); Item(ITEM_LEFTOVERS); Speed(3); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { HP(100); Item(ITEM_BLACK_SLUDGE); Speed(4); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_GRASSY_TERRAIN); } + } SCENE { + MESSAGE("The opposing Wobbuffet is healed by the grassy terrain!"); + HP_BAR(opponentRight, captureDamage: &healed); + HP_BAR(opponentRight, captureDamage: &damage); + MESSAGE("The opposing Wobbuffet was hurt by the Black Sludge!"); + MESSAGE("The opposing Wynaut is healed by the grassy terrain!"); + MESSAGE("The opposing Wynaut restored a little HP using its Leftovers!"); + MESSAGE("Ekans is healed by the grassy terrain!"); + MESSAGE("Ekans's Shed Skin cured its burn problem!"); + MESSAGE("Wynaut is healed by the grassy terrain!"); + } THEN { + EXPECT_GT(0, healed); + EXPECT_GT(damage, 0); + } +} diff --git a/test/battle/exp.c b/test/battle/exp.c index 12c9c1e9bdae..c22b7fa2f55f 100644 --- a/test/battle/exp.c +++ b/test/battle/exp.c @@ -1,16 +1,17 @@ #include "global.h" #include "test/battle.h" -#if B_EXP_CATCH >= GEN_6 - -WILD_BATTLE_TEST("Pokemon gain exp after catching a Pokemon") +WILD_BATTLE_TEST("Pokemon gain experience after catching a Pokemon (Gen6+)") { u8 level = 0; + u32 config = 0; - PARAMETRIZE { level = 50; } - PARAMETRIZE { level = MAX_LEVEL; } + PARAMETRIZE { level = MAX_LEVEL; config = GEN_5; } + PARAMETRIZE { level = 50; config = GEN_5; } + PARAMETRIZE { level = 50; config = GEN_6; } GIVEN { + WITH_CONFIG(CONFIG_EXP_CATCH, config); PLAYER(SPECIES_WOBBUFFET) { Level(level); } OPPONENT(SPECIES_CATERPIE) { HP(1); } } WHEN { @@ -18,14 +19,14 @@ WILD_BATTLE_TEST("Pokemon gain exp after catching a Pokemon") } SCENE { MESSAGE("You used Ultra Ball!"); ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_BALL_THROW, player); - if (level != MAX_LEVEL) { + if (level != MAX_LEVEL && config >= GEN_6) { EXPERIENCE_BAR(player); + } else { + NOT EXPERIENCE_BAR(player); } } } -#endif // B_EXP_CATCH - WILD_BATTLE_TEST("Higher leveled Pokemon give more exp", s32 exp) { u8 level = 0; diff --git a/test/battle/form_change/battle_after_move.c b/test/battle/form_change/battle_after_move.c new file mode 100644 index 000000000000..2dc9d95a15eb --- /dev/null +++ b/test/battle/form_change/battle_after_move.c @@ -0,0 +1,131 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Relic Song transforms Meloetta if used successfully") +{ + GIVEN { + PLAYER(SPECIES_MELOETTA_ARIA); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_RELIC_SONG); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); + HP_BAR(opponent); + MESSAGE("Meloetta transformed!"); + } THEN { + EXPECT_EQ(player->species, SPECIES_MELOETTA_PIROUETTE); + } +} + +SINGLE_BATTLE_TEST("Relic Song does not transform Pokemon other than Meloetta") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_RELIC_SONG); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); + HP_BAR(opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player); + MESSAGE("Wobbuffet transformed!"); + } + } THEN { + EXPECT_EQ(player->species, SPECIES_WOBBUFFET); + } +} + +SINGLE_BATTLE_TEST("Relic Song transforms Meloetta twice if used successfully") +{ + GIVEN { + PLAYER(SPECIES_MELOETTA_ARIA); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_RELIC_SONG); } + TURN { MOVE(player, MOVE_RELIC_SONG); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); + HP_BAR(opponent); + MESSAGE("Meloetta transformed!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); + HP_BAR(opponent); + MESSAGE("Meloetta transformed!"); + } THEN { + EXPECT_EQ(player->species, SPECIES_MELOETTA_ARIA); + } +} + +SINGLE_BATTLE_TEST("Relic Song transformation is the last thing that happens after it hits") +{ + GIVEN { + PLAYER(SPECIES_MELOETTA_ARIA); + OPPONENT(SPECIES_GOSSIFLEUR) { HP(1); Ability(ABILITY_COTTON_DOWN); } + } WHEN { + TURN { MOVE(player, MOVE_RELIC_SONG); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); + HP_BAR(opponent); + MESSAGE("The opposing Gossifleur fainted!"); + ABILITY_POPUP(opponent, ABILITY_COTTON_DOWN); + MESSAGE("Meloetta's Speed fell!"); + MESSAGE("Meloetta transformed!"); + } THEN { + EXPECT_EQ(player->species, SPECIES_MELOETTA_PIROUETTE); + } +} + +DOUBLE_BATTLE_TEST("Relic Song transforms once Meloetta in a double battle") +{ + GIVEN { + PLAYER(SPECIES_MELOETTA_ARIA); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_RELIC_SONG); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, playerLeft); + HP_BAR(opponentLeft); + HP_BAR(opponentRight); + MESSAGE("Meloetta transformed!"); + } THEN { + EXPECT_EQ(playerLeft->species, SPECIES_MELOETTA_PIROUETTE); + } +} + +SINGLE_BATTLE_TEST("Relic Song loses the form-changing effect with Sheer Force") +{ + GIVEN { + PLAYER(SPECIES_MELOETTA_ARIA); + OPPONENT(SPECIES_NIDOKING) { Ability(ABILITY_SHEER_FORCE); } + } WHEN { + TURN { MOVE(opponent, MOVE_SKILL_SWAP); MOVE(player, MOVE_RELIC_SONG); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); + HP_BAR(opponent); + NOT MESSAGE("Meloetta transformed!"); + } THEN { + EXPECT_EQ(player->species, SPECIES_MELOETTA_ARIA); + } +} + +SINGLE_BATTLE_TEST("Relic Song transforms Meloetta after Magician was activated") +{ + GIVEN { + PLAYER(SPECIES_MELOETTA_ARIA); + OPPONENT(SPECIES_DELPHOX) { Ability(ABILITY_MAGICIAN); Item(ITEM_POTION); } + } WHEN { + TURN { MOVE(opponent, MOVE_SKILL_SWAP); MOVE(player, MOVE_RELIC_SONG); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); + HP_BAR(opponent); + ABILITY_POPUP(player, ABILITY_MAGICIAN); + MESSAGE("Meloetta stole the opposing Delphox's Potion!"); + MESSAGE("Meloetta transformed!"); + } THEN { + EXPECT_EQ(player->species, SPECIES_MELOETTA_PIROUETTE); + } +} diff --git a/test/battle/form_change/faint.c b/test/battle/form_change/faint.c index dffabb44de1c..316ecca0bf7e 100644 --- a/test/battle/form_change/faint.c +++ b/test/battle/form_change/faint.c @@ -1,18 +1,57 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Aegislash reverts to Shield Form upon fainting") +SINGLE_BATTLE_TEST("Aegislash reverts to Shield Form upon fainting (start as Shield)") { GIVEN { PLAYER(SPECIES_AEGISLASH_SHIELD) { HP(1); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); MOVE(opponent, MOVE_GUST); SEND_OUT(player, 1); } + } SCENE { + MESSAGE("The opposing Wobbuffet used Gust!"); + MESSAGE("Aegislash fainted!"); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_AEGISLASH_SHIELD); + } +} + +SINGLE_BATTLE_TEST("Aegislash reverts to Shield Form upon fainting (start as Blade)") +{ + GIVEN { + PLAYER(SPECIES_AEGISLASH_BLADE) { HP(1); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_GUST); SEND_OUT(player, 1); } } SCENE { MESSAGE("The opposing Wobbuffet used Gust!"); MESSAGE("Aegislash fainted!"); } THEN { - EXPECT_EQ(GetMonData(&PLAYER_PARTY[0], MON_DATA_SPECIES), SPECIES_AEGISLASH_SHIELD); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_AEGISLASH_SHIELD); + } +} + +DOUBLE_BATTLE_TEST("Causing a Forecast or Flower Gift PokΓ©mon to faint should not cause a message") // issue 7795 +{ + u32 species; + PARAMETRIZE { species = SPECIES_CASTFORM; } + PARAMETRIZE { species = SPECIES_CHERRIM; } + GIVEN { + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_VULPIX) { Ability(ABILITY_DROUGHT); } + OPPONENT(species) { HP(1); } + } WHEN { + TURN { MOVE(playerRight, MOVE_GYRO_BALL, target: opponentRight); } + } SCENE { + if (species == SPECIES_CASTFORM) { + MESSAGE("The opposing Castform fainted!"); + NOT MESSAGE("The opposing Castform transformed!"); + } else { + MESSAGE("The opposing Cherrim fainted!"); + NOT MESSAGE("The opposing Cherrim transformed!"); + } } } diff --git a/test/battle/form_change/mega_evolution.c b/test/battle/form_change/mega_evolution.c index 3d9d9cf5079b..af16b779b57c 100644 --- a/test/battle/form_change/mega_evolution.c +++ b/test/battle/form_change/mega_evolution.c @@ -71,14 +71,30 @@ SINGLE_BATTLE_TEST("Rayquaza can Mega Evolve knowing Dragon Ascent") } } -SINGLE_BATTLE_TEST("Mega Evolution affects turn order") +SINGLE_BATTLE_TEST("Mega Evolution doesn't affect turn order (Gen6)") { GIVEN { - ASSUME(B_MEGA_EVO_TURN_ORDER >= GEN_7); - PLAYER(SPECIES_GARDEVOIR) { Item(ITEM_GARDEVOIRITE); Speed(105); } - OPPONENT(SPECIES_WOBBUFFET) { Speed(106); } + WITH_CONFIG(CONFIG_MEGA_EVO_TURN_ORDER, GEN_6); + PLAYER(SPECIES_GARDEVOIR) { Item(ITEM_GARDEVOIRITE); } + OPPONENT(SPECIES_WOBBUFFET) {} } WHEN { - TURN { MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); } + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); } + } SCENE { + MESSAGE("The opposing Wobbuffet used Celebrate!"); + MESSAGE("Gardevoir used Celebrate!"); + } THEN { + ASSUME(player->speed == 205); + } +} + +SINGLE_BATTLE_TEST("Mega Evolution affects turn order (Gen7+)") +{ + GIVEN { + WITH_CONFIG(CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); + PLAYER(SPECIES_GARDEVOIR) { Item(ITEM_GARDEVOIRITE);} + OPPONENT(SPECIES_WOBBUFFET) {} + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); } } SCENE { MESSAGE("Gardevoir used Celebrate!"); MESSAGE("The opposing Wobbuffet used Celebrate!"); @@ -90,9 +106,9 @@ SINGLE_BATTLE_TEST("Mega Evolution affects turn order") SINGLE_BATTLE_TEST("Abilities replaced by Mega Evolution do not affect turn order") { GIVEN { - ASSUME(B_MEGA_EVO_TURN_ORDER >= GEN_7); - ASSUME(gSpeciesInfo[SPECIES_SABLEYE_MEGA].abilities[0] != ABILITY_STALL - && gSpeciesInfo[SPECIES_SABLEYE_MEGA].abilities[1] != ABILITY_STALL); + WITH_CONFIG(CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); + ASSUME(GetSpeciesAbility(SPECIES_SABLEYE_MEGA, 0) != ABILITY_STALL + && GetSpeciesAbility(SPECIES_SABLEYE_MEGA, 1) != ABILITY_STALL); PLAYER(SPECIES_SABLEYE) { Item(ITEM_SABLENITE); Ability(ABILITY_STALL); Speed(105); } OPPONENT(SPECIES_WOBBUFFET) { Speed(44); } } WHEN { @@ -101,7 +117,7 @@ SINGLE_BATTLE_TEST("Abilities replaced by Mega Evolution do not affect turn orde MESSAGE("Sableye used Celebrate!"); MESSAGE("The opposing Wobbuffet used Celebrate!"); } THEN { - ASSUME(player->speed == 45); + ASSUME(player->speed == 105); } } @@ -158,9 +174,9 @@ SINGLE_BATTLE_TEST("Mega Evolved Pokemon do not change abilities after fainting" { GIVEN { ASSUME(MoveMakesContact(MOVE_CRUNCH) == TRUE); - ASSUME(gSpeciesInfo[SPECIES_GARCHOMP_MEGA].abilities[0] != ABILITY_ROUGH_SKIN); - ASSUME(gSpeciesInfo[SPECIES_GARCHOMP_MEGA].abilities[1] != ABILITY_ROUGH_SKIN); - ASSUME(gSpeciesInfo[SPECIES_GARCHOMP_MEGA].abilities[2] != ABILITY_ROUGH_SKIN); + ASSUME(GetSpeciesAbility(SPECIES_GARCHOMP_MEGA, 0) != ABILITY_ROUGH_SKIN); + ASSUME(GetSpeciesAbility(SPECIES_GARCHOMP_MEGA, 1) != ABILITY_ROUGH_SKIN); + ASSUME(GetSpeciesAbility(SPECIES_GARCHOMP_MEGA, 2) != ABILITY_ROUGH_SKIN); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GARCHOMP) { Ability(ABILITY_ROUGH_SKIN); Item(ITEM_GARCHOMPITE); HP(1); } } WHEN { diff --git a/test/battle/form_change/ultra_burst.c b/test/battle/form_change/ultra_burst.c index 640db3f881ab..183f61ec873d 100644 --- a/test/battle/form_change/ultra_burst.c +++ b/test/battle/form_change/ultra_burst.c @@ -58,11 +58,11 @@ DOUBLE_BATTLE_TEST("Ultra Burst's order is determined by Speed - player faster") SINGLE_BATTLE_TEST("Ultra Burst affects turn order") { GIVEN { - ASSUME(B_MEGA_EVO_TURN_ORDER >= GEN_7); - PLAYER(SPECIES_NECROZMA_DUSK_MANE) { Item(ITEM_ULTRANECROZIUM_Z); Speed(105); } - OPPONENT(SPECIES_WOBBUFFET) { Speed(106); } + WITH_CONFIG(CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); + PLAYER(SPECIES_NECROZMA_DUSK_MANE) { Item(ITEM_ULTRANECROZIUM_Z);} + OPPONENT(SPECIES_WOBBUFFET) {} } WHEN { - TURN { MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_ULTRA_BURST); } + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_ULTRA_BURST); } } SCENE { MESSAGE("Necrozma used Celebrate!"); MESSAGE("The opposing Wobbuffet used Celebrate!"); diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index a929c8206805..25a0d5d08e38 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -239,8 +239,8 @@ SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon are affected by Grudge") } SCENE { MESSAGE("The opposing Wobbuffet used Grudge!"); MESSAGE("Wobbuffet used Max Strike!"); - MESSAGE("Wobbuffet's Scratch lost all its PP due to the grudge!"); MESSAGE("The opposing Wobbuffet fainted!"); + MESSAGE("Wobbuffet's Scratch lost all its PP due to the grudge!"); } } @@ -423,7 +423,7 @@ SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon that changes forms does not gain { u16 capturedHP, finalHP; GIVEN { - WITH_CONFIG(GEN_CONFIG_BATTLE_BOND, GEN_8); + WITH_CONFIG(CONFIG_BATTLE_BOND, GEN_8); PLAYER(SPECIES_GRENINJA_BATTLE_BOND) { Ability(ABILITY_BATTLE_BOND); HP(100); Speed(100); } OPPONENT(SPECIES_CATERPIE) { HP(1); Speed(1000); } OPPONENT(SPECIES_WOBBUFFET) { Speed(10); } @@ -601,7 +601,7 @@ SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon cannot use Max Guard while holdin // Almost anything that calculates damage based on HP has been changed to non-Dynamax HP. // This includes Leftovers, Life Orb, Heal Pulse, Rocky Helmet, Sandstorm, etc. etc. -// There are some redundant cases (i.e Substitute) that can never be used by a Dynamaxed pokemon. +// There are some redundant cases (i.e Substitute) that can never be used by a Dynamaxed PokΓ©mon. // Anything that is conditional based off max HP still uses gBattleMons[battler].maxHP. // Below are some tests, but very far from all encompassing: @@ -630,7 +630,7 @@ SINGLE_BATTLE_TEST("Dynamax: Super Fang uses a Pokemon's non-Dynamax HP", s16 da PARAMETRIZE { dynamax = GIMMICK_NONE; } PARAMETRIZE { dynamax = GIMMICK_DYNAMAX; } GIVEN { - ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_SUPER_FANG); + ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_FIXED_PERCENT_DAMAGE); PLAYER(SPECIES_WOBBUFFET) { Speed(50); } OPPONENT(SPECIES_WOBBUFFET) { Speed(100); } } WHEN { @@ -838,7 +838,11 @@ SINGLE_BATTLE_TEST("Dynamax: Max Geyser sets up heavy rain") } } +#if B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_SNOW +SINGLE_BATTLE_TEST("Dynamax: Max Hailstorm sets up snow") +#else SINGLE_BATTLE_TEST("Dynamax: Max Hailstorm sets up hail") +#endif { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_MAX_HAILSTORM, MOVE_EFFECT_HAIL)); @@ -848,9 +852,15 @@ SINGLE_BATTLE_TEST("Dynamax: Max Hailstorm sets up hail") TURN { MOVE(player, MOVE_POWDER_SNOW, gimmick: GIMMICK_DYNAMAX); MOVE(opponent, MOVE_CELEBRATE); } } SCENE { MESSAGE("Wobbuffet used Max Hailstorm!"); +#if B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_SNOW + MESSAGE("It started to snow!"); + MESSAGE("The opposing Wobbuffet used Celebrate!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SNOW_CONTINUES); +#else MESSAGE("It started to hail!"); MESSAGE("The opposing Wobbuffet used Celebrate!"); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HAIL_CONTINUES); +#endif } } @@ -875,7 +885,7 @@ SINGLE_BATTLE_TEST("Dynamax: Max Overgrowth sets up Grassy Terrain") s32 maxHP = 490; // Because of recalculated stats upon Dynamaxing GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_MAX_OVERGROWTH, MOVE_EFFECT_GRASSY_TERRAIN)); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseHP == 190); + ASSUME(GetSpeciesBaseHP(SPECIES_WOBBUFFET) == 190); OPPONENT(SPECIES_WOBBUFFET) { MaxHP(maxHP); HP(maxHP / 2); }; PLAYER(SPECIES_WOBBUFFET) { MaxHP(maxHP); HP(maxHP / 2); }; } WHEN { @@ -903,7 +913,7 @@ SINGLE_BATTLE_TEST("Dynamax: Max Mindstorm sets up Psychic Terrain") } SCENE { MESSAGE("The opposing Wobbuffet used Extreme Speed!"); MESSAGE("Wobbuffet used Max Mindstorm!"); - MESSAGE("The opposing Wobbuffet cannot use Extreme Speed!"); + MESSAGE("Wobbuffet is protected by the Psychic Terrain!"); MESSAGE("Wobbuffet used Max Mindstorm!"); } } @@ -961,6 +971,7 @@ SINGLE_BATTLE_TEST("Dynamax: G-Max Stonesurge sets up Stealth Rocks") SINGLE_BATTLE_TEST("Dynamax: G-Max Steelsurge sets up sharp steel") { GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, GEN_6); ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_STEELSURGE, MOVE_EFFECT_STEELSURGE)); PLAYER(SPECIES_COPPERAJAH) { GigantamaxFactor(TRUE); } OPPONENT(SPECIES_WOBBUFFET); @@ -1018,11 +1029,11 @@ DOUBLE_BATTLE_TEST("Dynamax: G-Max Volt Crash paralyzes both opponents") } SCENE { MESSAGE("Pikachu used G-Max Volt Crash!"); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, opponentLeft); - STATUS_ICON(opponentLeft, paralysis: TRUE); MESSAGE("The opposing Wobbuffet is paralyzed, so it may be unable to move!"); + STATUS_ICON(opponentLeft, paralysis: TRUE); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, opponentRight); - STATUS_ICON(opponentRight, paralysis: TRUE); MESSAGE("The opposing Wynaut is paralyzed, so it may be unable to move!"); + STATUS_ICON(opponentRight, paralysis: TRUE); } } @@ -1048,22 +1059,22 @@ DOUBLE_BATTLE_TEST("Dynamax: G-Max Stun Shock paralyzes or poisons both opponent // opponent left ANIMATION(ANIM_TYPE_STATUS, statusAnim, opponentLeft); if (statusAnim == B_ANIM_STATUS_PSN) { - STATUS_ICON(opponentLeft, poison: TRUE); MESSAGE("The opposing Wobbuffet was poisoned!"); + STATUS_ICON(opponentLeft, poison: TRUE); } else { - STATUS_ICON(opponentLeft, paralysis: TRUE); MESSAGE("The opposing Wobbuffet is paralyzed, so it may be unable to move!"); + STATUS_ICON(opponentLeft, paralysis: TRUE); } // opponent right ANIMATION(ANIM_TYPE_STATUS, statusAnim, opponentRight); if (statusAnim == B_ANIM_STATUS_PSN) { - STATUS_ICON(opponentRight, poison: TRUE); MESSAGE("The opposing Wynaut was poisoned!"); + STATUS_ICON(opponentRight, poison: TRUE); } else { - STATUS_ICON(opponentRight, paralysis: TRUE); MESSAGE("The opposing Wynaut is paralyzed, so it may be unable to move!"); + STATUS_ICON(opponentRight, paralysis: TRUE); } } } @@ -1118,30 +1129,30 @@ DOUBLE_BATTLE_TEST("Dynamax: G-Max Befuddle paralyzes, poisons, or sleeps both o // opponent left ANIMATION(ANIM_TYPE_STATUS, statusAnim, opponentLeft); if (statusAnim == B_ANIM_STATUS_PSN) { - STATUS_ICON(opponentLeft, poison: TRUE); MESSAGE("The opposing Wobbuffet was poisoned!"); + STATUS_ICON(opponentLeft, poison: TRUE); } else if (statusAnim == B_ANIM_STATUS_PRZ) { - STATUS_ICON(opponentLeft, paralysis: TRUE); MESSAGE("The opposing Wobbuffet is paralyzed, so it may be unable to move!"); + STATUS_ICON(opponentLeft, paralysis: TRUE); } else { - STATUS_ICON(opponentLeft, sleep: TRUE); MESSAGE("The opposing Wobbuffet fell asleep!"); + STATUS_ICON(opponentLeft, sleep: TRUE); } // opponent right ANIMATION(ANIM_TYPE_STATUS, statusAnim, opponentRight); if (statusAnim == B_ANIM_STATUS_PSN) { - STATUS_ICON(opponentRight, poison: TRUE); MESSAGE("The opposing Wobbuffet was poisoned!"); + STATUS_ICON(opponentRight, poison: TRUE); } else if (statusAnim == B_ANIM_STATUS_PRZ) { - STATUS_ICON(opponentRight, paralysis: TRUE); MESSAGE("The opposing Wobbuffet is paralyzed, so it may be unable to move!"); + STATUS_ICON(opponentRight, paralysis: TRUE); } else { - STATUS_ICON(opponentRight, sleep: TRUE); MESSAGE("The opposing Wobbuffet fell asleep!"); + STATUS_ICON(opponentRight, sleep: TRUE); } } } @@ -1221,7 +1232,7 @@ DOUBLE_BATTLE_TEST("Dynamax: G-Max Terror traps both opponents") MESSAGE("The opposing Wobbuffet can no longer escape!"); MESSAGE("The opposing Wobbuffet can no longer escape!"); } THEN { // Can't find good way to test trapping - EXPECT(opponentLeft->status2 & STATUS2_ESCAPE_PREVENTION); + EXPECT(opponentLeft->volatiles.escapePrevention); } } @@ -1238,7 +1249,7 @@ SINGLE_BATTLE_TEST("Dynamax: Baton Pass passes G-Max Terror's escape prevention ANIMATION(ANIM_TYPE_MOVE, MOVE_G_MAX_TERROR, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_BATON_PASS, opponent); } THEN { - EXPECT(opponent->status2 & STATUS2_ESCAPE_PREVENTION); + EXPECT(opponent->volatiles.escapePrevention); } } @@ -1454,7 +1465,7 @@ DOUBLE_BATTLE_TEST("Dynamax: G-Max Chi Strike boosts allies' crit chance by 1 st { u32 j; GIVEN { - ASSUME(B_CRIT_CHANCE >= GEN_6); + WITH_CONFIG(CONFIG_CRIT_CHANCE, GEN_6); ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_CHI_STRIKE, MOVE_EFFECT_CRIT_PLUS_SIDE)); PLAYER(SPECIES_MACHAMP) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_MACHOP); @@ -1598,17 +1609,18 @@ SINGLE_BATTLE_TEST("Dynamax: Max Attacks prints a message when hitting into Max SINGLE_BATTLE_TEST("Dynamax: Max Moves don't bypass absorbing abilities") { - u32 move, ability, species; - PARAMETRIZE { move = MOVE_SPARK; ability = ABILITY_VOLT_ABSORB; species = SPECIES_LANTURN; } - PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_WATER_ABSORB; species = SPECIES_LANTURN; } - PARAMETRIZE { move = MOVE_EMBER; ability = ABILITY_FLASH_FIRE; species = SPECIES_HEATRAN; } - PARAMETRIZE { move = MOVE_SPARK; ability = ABILITY_LIGHTNING_ROD; species = SPECIES_PIKACHU; } - PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_STORM_DRAIN; species = SPECIES_GASTRODON; } - PARAMETRIZE { move = MOVE_EMBER; ability = ABILITY_WELL_BAKED_BODY; species = SPECIES_DACHSBUN; } - PARAMETRIZE { move = MOVE_SPARK; ability = ABILITY_MOTOR_DRIVE; species = SPECIES_ELECTIVIRE; } - PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_DRY_SKIN; species = SPECIES_PARASECT; } - PARAMETRIZE { move = MOVE_MUD_BOMB; ability = ABILITY_EARTH_EATER; species = SPECIES_ORTHWORM; } - PARAMETRIZE { move = MOVE_VINE_WHIP; ability = ABILITY_SAP_SIPPER; species = SPECIES_MILTANK; } + u32 move, species; + enum Ability ability; + PARAMETRIZE { move = MOVE_SPARK; ability = ABILITY_VOLT_ABSORB; species = SPECIES_LANTURN; } + PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_WATER_ABSORB; species = SPECIES_LANTURN; } + PARAMETRIZE { move = MOVE_EMBER; ability = ABILITY_FLASH_FIRE; species = SPECIES_HEATRAN; } + PARAMETRIZE { move = MOVE_SPARK; ability = ABILITY_LIGHTNING_ROD; species = SPECIES_PIKACHU; } + PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_STORM_DRAIN; species = SPECIES_GASTRODON; } + PARAMETRIZE { move = MOVE_EMBER; ability = ABILITY_WELL_BAKED_BODY; species = SPECIES_DACHSBUN; } + PARAMETRIZE { move = MOVE_SPARK; ability = ABILITY_MOTOR_DRIVE; species = SPECIES_ELECTIVIRE; } + PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_DRY_SKIN; species = SPECIES_PARASECT; } + PARAMETRIZE { move = MOVE_MUD_BOMB; ability = ABILITY_EARTH_EATER; species = SPECIES_ORTHWORM; } + PARAMETRIZE { move = MOVE_VINE_WHIP; ability = ABILITY_SAP_SIPPER; species = SPECIES_MILTANK; } GIVEN { ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); @@ -1616,6 +1628,7 @@ SINGLE_BATTLE_TEST("Dynamax: Max Moves don't bypass absorbing abilities") ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); ASSUME(GetMoveType(MOVE_MUD_BOMB) == TYPE_GROUND); ASSUME(GetMoveType(MOVE_VINE_WHIP) == TYPE_GRASS); + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species) { Ability(ability); } } WHEN { @@ -1648,15 +1661,85 @@ SINGLE_BATTLE_TEST("Dynamax: Dynamax is reverted before switch out") } } -SINGLE_BATTLE_TEST("Dynamax: Destiny Bond fails if a dynamaxed battler is present on field") +SINGLE_BATTLE_TEST("Dynamax: max move against semi-invulnerable target prints the correct message") { GIVEN { - ASSUME(GetMoveEffect(MOVE_DESTINY_BOND) == EFFECT_DESTINY_BOND); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET) {Speed(1);}; + OPPONENT(SPECIES_WOBBUFFET) {Speed(2);}; } WHEN { - TURN { MOVE(opponent, MOVE_DESTINY_BOND); MOVE(player, MOVE_SCRATCH, gimmick: GIMMICK_DYNAMAX); } + TURN { MOVE(player, MOVE_SCRATCH, gimmick: GIMMICK_DYNAMAX); MOVE(opponent, MOVE_FLY); } } SCENE { - MESSAGE("The move was blocked by the power of Dynamax!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_DYNAMAX_GROWTH, player); + MESSAGE("Wobbuffet used Max Strike!"); + MESSAGE("The opposing Wobbuffet avoided the attack!"); + } +} + +DOUBLE_BATTLE_TEST("Dynamax stat lowering moves don't make stat-changing abilities apply to partner") +{ + u32 move, stat, ability; + move = 0; stat = 0; ability = 0; + u32 abilityList[] = {ABILITY_COMPETITIVE, ABILITY_DEFIANT, ABILITY_CONTRARY, ABILITY_SIMPLE}; + for (u32 j = 0; j < 4; j++) + { + PARAMETRIZE { move = MOVE_SCRATCH; stat = STAT_SPEED; ability = abilityList[j]; } + PARAMETRIZE { move = MOVE_FURY_CUTTER; stat = STAT_SPATK; ability = abilityList[j]; } + PARAMETRIZE { move = MOVE_LICK; stat = STAT_DEF; ability = abilityList[j]; ;} + PARAMETRIZE { move = MOVE_DRAGON_CLAW; stat = STAT_ATK; ability = abilityList[j]; } + PARAMETRIZE { move = MOVE_CRUNCH; stat = STAT_SPDEF; ability = abilityList[j]; } + } + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_STRIKE, MOVE_EFFECT_LOWER_SPEED_SIDE)); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_FLUTTERBY, MOVE_EFFECT_LOWER_SP_ATK_SIDE)); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_PHANTASM, MOVE_EFFECT_LOWER_DEFENSE_SIDE)); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_WYRMWIND, MOVE_EFFECT_LOWER_ATTACK_SIDE)); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_DARKNESS, MOVE_EFFECT_LOWER_SP_DEF_SIDE)); + PLAYER(SPECIES_WOBBUFFET) { } + PLAYER(SPECIES_WOBBUFFET) { } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_SHADOW_TAG); } + } WHEN { + TURN { MOVE(playerLeft, move, target: opponentLeft, gimmick: GIMMICK_DYNAMAX);} + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + } THEN { + EXPECT_EQ(opponentRight->statStages[stat], DEFAULT_STAT_STAGE - 1); } } + +DOUBLE_BATTLE_TEST("Dynamax stat raising moves don't make stat-changing abilities apply to partner") +{ + u32 move, stat, ability; + move = 0; stat = 0; ability = 0; + u32 abilityList[] = {ABILITY_CONTRARY, ABILITY_SIMPLE}; + for (u32 j = 0; j < 2; j++) + { + PARAMETRIZE { move = MOVE_PECK; stat = STAT_SPEED; ability = abilityList[j]; } + PARAMETRIZE { move = MOVE_POISON_JAB; stat = STAT_SPATK; ability = abilityList[j]; } + PARAMETRIZE { move = MOVE_BULLET_PUNCH; stat = STAT_DEF; ability = abilityList[j]; ;} + PARAMETRIZE { move = MOVE_DOUBLE_KICK; stat = STAT_ATK; ability = abilityList[j]; } + PARAMETRIZE { move = MOVE_MUD_SLAP; stat = STAT_SPDEF; ability = abilityList[j]; } + } + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_STRIKE, MOVE_EFFECT_LOWER_SPEED_SIDE)); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_FLUTTERBY, MOVE_EFFECT_LOWER_SP_ATK_SIDE)); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_PHANTASM, MOVE_EFFECT_LOWER_DEFENSE_SIDE)); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_WYRMWIND, MOVE_EFFECT_LOWER_ATTACK_SIDE)); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_DARKNESS, MOVE_EFFECT_LOWER_SP_DEF_SIDE)); + PLAYER(SPECIES_WOBBUFFET) { Ability(ability); } + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_SHADOW_TAG); } + OPPONENT(SPECIES_WOBBUFFET) {} + OPPONENT(SPECIES_WOBBUFFET) {} + } WHEN { + TURN { MOVE(playerLeft, move, target: opponentLeft, gimmick: GIMMICK_DYNAMAX);} + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + } THEN { + EXPECT_EQ(playerRight->statStages[stat], DEFAULT_STAT_STAGE + 1); + } +} + +TO_DO_BATTLE_TEST("Dynamax: Contrary inverts stat-lowering Max Moves, without showing a message") +TO_DO_BATTLE_TEST("Dynamax: Contrary inverts stat-increasing Max Moves, without showing a message") diff --git a/test/battle/gimmick/terastal.c b/test/battle/gimmick/terastal.c index 7ce10a594281..2379df58dc4c 100644 --- a/test/battle/gimmick/terastal.c +++ b/test/battle/gimmick/terastal.c @@ -327,33 +327,6 @@ SINGLE_BATTLE_TEST("(TERA) Reflect Type fails if used by a Terastallized Pokemon } } -SINGLE_BATTLE_TEST("(TERA) Conversion fails if used by a Terastallized Pokemon") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_PSYCHIC); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_CONVERSION, gimmick: GIMMICK_TERA); } - } SCENE { - MESSAGE("Wobbuffet used Conversion!"); - MESSAGE("But it failed!"); - } -} - -SINGLE_BATTLE_TEST("(TERA) Conversion2 fails if used by a Terastallized Pokemon") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_PSYCHIC); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, MOVE_SCRATCH); } - TURN { MOVE(player, MOVE_CONVERSION_2, gimmick: GIMMICK_TERA); } - } SCENE { - MESSAGE("Wobbuffet used Conversion 2!"); - MESSAGE("But it failed!"); - } -} - SINGLE_BATTLE_TEST("(TERA) Reflect Type copies a Terastallized Pokemon's Tera Type") { GIVEN { @@ -385,7 +358,7 @@ SINGLE_BATTLE_TEST("(TERA) Synchronoise uses a Terastallized Pokemon's Tera Type } SCENE { // turn 1 MESSAGE("The opposing Wobbuffet used Synchronoise!"); - MESSAGE("It won't have any effect on Wobbuffet!"); + MESSAGE("It doesn't affect Wobbuffet…"); // turn 2 MESSAGE("The opposing Wobbuffet used Synchronoise!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_SYNCHRONOISE, opponent); @@ -420,8 +393,8 @@ SINGLE_BATTLE_TEST("(TERA) Double Shock does not remove the user's Electric type TURN { MOVE(player, MOVE_DOUBLE_SHOCK); MOVE(opponent, MOVE_RECOVER); } TURN { MOVE(player, MOVE_DOUBLE_SHOCK, gimmick: GIMMICK_TERA); MOVE(opponent, MOVE_RECOVER); } TURN { MOVE(player, MOVE_DOUBLE_SHOCK); MOVE(opponent, MOVE_RECOVER); } - TURN { SWITCH(player, 1); MOVE(opponent, MOVE_RECOVER); } - TURN { SWITCH(player, 0); MOVE(opponent, MOVE_RECOVER); } + TURN { SWITCH(player, 1); } + TURN { SWITCH(player, 0); } TURN { MOVE(player, MOVE_DOUBLE_SHOCK); MOVE(opponent, MOVE_RECOVER); } TURN { MOVE(player, MOVE_DOUBLE_SHOCK); } } SCENE { @@ -506,26 +479,6 @@ SINGLE_BATTLE_TEST("(TERA) Revelation Dance uses a Stellar-type Pokemon's base t } } -#if B_UPDATED_CONVERSION_2 < GEN_5 -SINGLE_BATTLE_TEST("(TERA) Conversion2 fails if last hit by a Stellar-type move") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_STELLAR); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_TERA_BLAST, gimmick: GIMMICK_TERA); } - TURN { MOVE(opponent, MOVE_CONVERSION_2); } - } SCENE { - // turn 1 - MESSAGE("Wobbuffet used Tera Blast!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_TERA_BLAST, player); - // turn 2 - MESSAGE("The opposing Wobbuffet used Conversion 2!"); - MESSAGE("But it failed!"); - } -} -#endif - SINGLE_BATTLE_TEST("(TERA) Roost does not remove Flying-type ground immunity when Terastallized into the Stellar type") { GIVEN { @@ -606,14 +559,14 @@ SINGLE_BATTLE_TEST("(TERA) Terastallizing into the Stellar type boosts all moves s16 damage[4]; GIVEN { ASSUME(GetMovePower(MOVE_MEGA_DRAIN) == 40); - ASSUME(GetMovePower(MOVE_BUBBLE) == 40); + ASSUME(GetMovePower(MOVE_WATER_GUN) == 40); PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_STELLAR); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_MEGA_DRAIN); } TURN { MOVE(player, MOVE_MEGA_DRAIN, gimmick: GIMMICK_TERA); } TURN { MOVE(player, MOVE_MEGA_DRAIN); } - TURN { MOVE(player, MOVE_BUBBLE); } + TURN { MOVE(player, MOVE_WATER_GUN); } } SCENE { // turn 1 MESSAGE("Wobbuffet used Mega Drain!"); @@ -628,8 +581,8 @@ SINGLE_BATTLE_TEST("(TERA) Terastallizing into the Stellar type boosts all moves ANIMATION(ANIM_TYPE_MOVE, MOVE_MEGA_DRAIN, player); HP_BAR(opponent, captureDamage: &damage[2]); // turn 4 - MESSAGE("Wobbuffet used Bubble!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_BUBBLE, player); + MESSAGE("Wobbuffet used Water Gun!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, player); HP_BAR(opponent, captureDamage: &damage[3]); } THEN { // The jump from 40 BP to 72 BP (60 * 1.2x) is a 1.8x boost. @@ -639,17 +592,21 @@ SINGLE_BATTLE_TEST("(TERA) Terastallizing into the Stellar type boosts all moves } } -SINGLE_BATTLE_TEST("(TERA) Protean cannot change the type of a Terastallized Pokemon") +SINGLE_BATTLE_TEST("(TERA) Protean/Libero cannot change the type of a Terastallized Pokemon") { + u32 ability, species; + PARAMETRIZE { ability = ABILITY_PROTEAN; species = SPECIES_GRENINJA; } + PARAMETRIZE { ability = ABILITY_LIBERO; species = SPECIES_RABOOT; } GIVEN { - PLAYER(SPECIES_GRENINJA) { Ability(ABILITY_PROTEAN); TeraType(TYPE_GRASS); } + PLAYER(species) { Ability(ability); TeraType(TYPE_GRASS); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_BUBBLE, gimmick: GIMMICK_TERA); MOVE(opponent, MOVE_EMBER); } } SCENE { - MESSAGE("Greninja used Bubble!"); - MESSAGE("The opposing Wobbuffet used Ember!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BUBBLE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, opponent); MESSAGE("It's super effective!"); } } @@ -755,7 +712,7 @@ SINGLE_BATTLE_TEST("(TERA) Terapagos retains its base defensive profile when Ter } } -SINGLE_BATTLE_TEST("(TERA) Illusion breaks if the pokemon Terastallizes when illusioned as a mon that changes forms by Terastallizing") +SINGLE_BATTLE_TEST("(TERA) Illusion breaks if the PokΓ©mon Terastallizes when illusioned as a mon that changes forms by Terastallizing") { u32 species; PARAMETRIZE { species = SPECIES_TERAPAGOS; } @@ -791,19 +748,16 @@ SINGLE_BATTLE_TEST("(TERA) Illusion doesn't break upon Terastallizing when illus } } -/* -// This test freezes the emulator -SINGLE_BATTLE_TEST("(TERA) Transformed pokemon can't Terastalize") +SINGLE_BATTLE_TEST("(TERA) Transformed PokΓ©mon can't Terastalize") { GIVEN { - PLAYER(SPECIES_DITTO); - OPPONENT(SPECIES_TERAPAGOS) { Moves(MOVE_CELEBRATE); } + PLAYER(SPECIES_DITTO) { Moves(MOVE_TRANSFORM, MOVE_CELEBRATE); } + OPPONENT(SPECIES_TERAPAGOS) { Moves(MOVE_TRANSFORM, MOVE_CELEBRATE); } } WHEN { TURN { MOVE(player, MOVE_TRANSFORM); } TURN { MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); } } } -*/ SINGLE_BATTLE_TEST("(TERA) Pokemon with Tera forms change upon Terastallizing") { @@ -825,7 +779,7 @@ SINGLE_BATTLE_TEST("(TERA) Pokemon with Tera forms change upon Terastallizing") SINGLE_BATTLE_TEST("(TERA) All type indicators function correctly") { - u32 type; + enum Type type; PARAMETRIZE { type = TYPE_NONE; } PARAMETRIZE { type = TYPE_NORMAL; } PARAMETRIZE { type = TYPE_FIGHTING; } @@ -857,7 +811,7 @@ SINGLE_BATTLE_TEST("(TERA) All type indicators function correctly") SINGLE_BATTLE_TEST("(TERA) All type indicators function correctly - Opponent") { - u32 type; + enum Type type; PARAMETRIZE { type = TYPE_NONE; } PARAMETRIZE { type = TYPE_NORMAL; } PARAMETRIZE { type = TYPE_FIGHTING; } diff --git a/test/battle/gimmick/zmove.c b/test/battle/gimmick/zmove.c index fd5635d3fca3..74f4ea3675ba 100644 --- a/test/battle/gimmick/zmove.c +++ b/test/battle/gimmick/zmove.c @@ -6,9 +6,10 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Moves do not retain priority") { GIVEN { + WITH_CONFIG(CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); // TODO: Decouple this config from other gimmicks ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } - OPPONENT(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } } WHEN { TURN { MOVE(opponent, MOVE_SCRATCH); MOVE(player, MOVE_QUICK_ATTACK, gimmick: GIMMICK_Z_MOVE); } @@ -23,7 +24,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Moves are not affected by -ate abilities") { GIVEN { ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_SWELLOW].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_SWELLOW, 1) == TYPE_FLYING); PLAYER(SPECIES_AURORUS) { Ability(ABILITY_REFRIGERATE); Item(ITEM_NORMALIUM_Z); } OPPONENT(SPECIES_SWELLOW); } WHEN { @@ -114,10 +115,16 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_ALL_STATS_UP raises all of a battler's sta } } -SINGLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_BOOST_CRITS raises a battler's critical hit ratio") +SINGLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_BOOST_CRITS raises a battler's critical hit ratio by 2 stages") { - PASSES_RANDOMLY(1, 2, RNG_CRITICAL_HIT); + u32 genConfig = 0, chance; + for (u32 j = GEN_1; j <= GEN_5; j++) + PARAMETRIZE { genConfig = j; chance = 4; } // 25% + for (u32 j = GEN_6; j <= GEN_9; j++) + PARAMETRIZE { genConfig = j; chance = 2; } // 50% + PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); ASSUME(GetMoveType(MOVE_FORESIGHT) == TYPE_NORMAL); ASSUME(GetMoveZEffect(MOVE_FORESIGHT) == Z_EFFECT_BOOST_CRITS); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } @@ -182,9 +189,9 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_CURSE activates Z_EFFECT_RECOVER_HP or Z_E PARAMETRIZE { species = SPECIES_DUSCLOPS; } GIVEN { ASSUME(GetMoveType(MOVE_CURSE) == TYPE_GHOST); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_GHOST); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_GHOST); - ASSUME(gSpeciesInfo[SPECIES_DUSCLOPS].types[0] == TYPE_GHOST); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_GHOST); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_GHOST); + ASSUME(GetSpeciesType(SPECIES_DUSCLOPS, 0) == TYPE_GHOST); ASSUME(GetMoveZEffect(MOVE_CURSE) == Z_EFFECT_CURSE); PLAYER(species) { Item(ITEM_GHOSTIUM_Z); HP(1); } OPPONENT(SPECIES_WOBBUFFET); @@ -526,9 +533,9 @@ SINGLE_BATTLE_TEST("(Z-MOVE) 10,000,000 Volt Thunderbolt has an increased critic PARAMETRIZE { genConfig = j; chance = 2; } PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_10_000_000_VOLT_THUNDERBOLT) == 2); - ASSUME(gSpeciesInfo[SPECIES_PIKACHU_PARTNER].baseSpeed == 90); + ASSUME(GetSpeciesBaseSpeed(SPECIES_PIKACHU_PARTNER) == 90); PLAYER(SPECIES_PIKACHU_PARTNER) { Item(ITEM_PIKASHUNIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -578,7 +585,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Extreme Evoboost boosts all the user's stats by two SINGLE_BATTLE_TEST("(Z-MOVE) Genesis Supernova sets up psychic terrain") { GIVEN { - ASSUME(GetMoveEffect(MOVE_GENESIS_SUPERNOVA) == EFFECT_HIT_SET_REMOVE_TERRAIN); + ASSUME(MoveHasAdditionalEffect(MOVE_GENESIS_SUPERNOVA, MOVE_EFFECT_PSYCHIC_TERRAIN)); PLAYER(SPECIES_MEW) { Item(ITEM_MEWNIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -588,14 +595,14 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Genesis Supernova sets up psychic terrain") ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_GENESIS_SUPERNOVA, player); NOT { ANIMATION(ANIM_TYPE_MOVE, MOVE_QUICK_ATTACK, player); } - MESSAGE("Mew cannot use Quick Attack!"); + MESSAGE("The opposing Wobbuffet is protected by the Psychic Terrain!"); } } SINGLE_BATTLE_TEST("(Z-MOVE) Splintered Stormshards removes terrain") { GIVEN { - ASSUME(GetMoveEffect(MOVE_SPLINTERED_STORMSHARDS) == EFFECT_HIT_SET_REMOVE_TERRAIN); + ASSUME(GetMoveEffect(MOVE_SPLINTERED_STORMSHARDS) == EFFECT_ICE_SPINNER); PLAYER(SPECIES_LYCANROC_DUSK) { Item(ITEM_LYCANIUM_Z); } OPPONENT(SPECIES_TAPU_LELE) { Ability(ABILITY_PSYCHIC_SURGE); HP(1000); MaxHP(1000); } } WHEN { @@ -630,10 +637,10 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Clangorous Soulblaze boosts all the user's stats by } } -SINGLE_BATTLE_TEST("(Z-MOVE) Guardian of Alola deals 75\% of the target's current HP") +SINGLE_BATTLE_TEST("(Z-MOVE) Guardian of Alola deals 75% of the target's current HP") { GIVEN { - ASSUME(GetMoveEffect(MOVE_GUARDIAN_OF_ALOLA) == EFFECT_GUARDIAN_OF_ALOLA); + ASSUME(GetMoveEffect(MOVE_GUARDIAN_OF_ALOLA) == EFFECT_FIXED_PERCENT_DAMAGE); PLAYER(SPECIES_TAPU_FINI) { Item(ITEM_TAPUNIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -679,3 +686,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Revelation Dance always transforms into Breakneck ANIMATION(ANIM_TYPE_MOVE, MOVE_BREAKNECK_BLITZ, player); } } + +TO_DO_BATTLE_TEST("(Z-MOVE) Stat changes from status Z-Moves are not inverted by Contrary") +TO_DO_BATTLE_TEST("(Z-MOVE) Stat changes from Extreme Evoboost are inverted by Contrary") +TO_DO_BATTLE_TEST("(Z-MOVE) Stat changes from Clangorous Soulblaze are inverted by Contrary") diff --git a/test/battle/hazards.c b/test/battle/hazards.c new file mode 100644 index 000000000000..ea0aef70e5d4 --- /dev/null +++ b/test/battle/hazards.c @@ -0,0 +1,173 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Hazards are applied based on order of set up") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_GRIMER); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_TOXIC_SPIKES); } + TURN { MOVE(opponent, MOVE_STEALTH_ROCK); } + TURN { MOVE(opponent, MOVE_STICKY_WEB); } + TURN { MOVE(opponent, MOVE_SPIKES); } + TURN { MOVE(opponent, MOVE_STEALTH_ROCK); SWITCH(player, 1); } + TURN { MOVE(opponent, MOVE_STEALTH_ROCK); SWITCH(player, 2); } + TURN { MOVE(opponent, MOVE_STEALTH_ROCK); SWITCH(player, 0); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, opponent); + MESSAGE("Wobbuffet was poisoned!"); + MESSAGE("Pointed stones dug into Wobbuffet!"); + MESSAGE("Wobbuffet was caught in a sticky web!"); + MESSAGE("Wobbuffet was hurt by the spikes!"); + MESSAGE("The poison spikes disappeared from the ground around your team!"); + MESSAGE("Pointed stones dug into Wynaut!"); + MESSAGE("Wynaut was caught in a sticky web!"); + MESSAGE("Wynaut was hurt by the spikes!"); + } THEN { + EXPECT_EQ(gBattleStruct->hazardsQueue[0][0], HAZARDS_STEALTH_ROCK); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][1], HAZARDS_STICKY_WEB); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][2], HAZARDS_SPIKES); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][3], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][4], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][5], HAZARDS_NONE); + } +} + +SINGLE_BATTLE_TEST("Hazards are applied correctly after a battler faints") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_FINAL_GAMBIT) == EFFECT_FINAL_GAMBIT); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_STEALTH_ROCK); + MOVE(player, MOVE_FINAL_GAMBIT); + SEND_OUT(player, 1); + SEND_OUT(player, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FINAL_GAMBIT, player); + MESSAGE("Wynaut fainted!"); + MESSAGE("Pointed stones dug into Wobbuffet!"); + MESSAGE("Wobbuffet fainted!"); + MESSAGE("Pointed stones dug into Wynaut!"); + } +} + +SINGLE_BATTLE_TEST("Toxic Spikes can be removed after fainting to other hazards") +{ + KNOWN_FAILING; // tryfaintmon changes something that doesn't allow other switch-in effects on the battler + + GIVEN { + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_GRIMER) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_STEALTH_ROCK); } + TURN { MOVE(opponent, MOVE_TOXIC_SPIKES); } + TURN { MOVE(opponent, MOVE_STICKY_WEB); } + TURN { MOVE(opponent, MOVE_SPIKES); } + TURN { MOVE(opponent, MOVE_STEALTH_ROCK); SWITCH(player, 1); SEND_OUT(player, 0); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, opponent); + MESSAGE("Pointed stones dug into Grimer!"); + MESSAGE("Grimer fainted!"); + MESSAGE("The poison spikes disappeared from the ground around your team!"); + NONE_OF { + MESSAGE("Grimer was caught in a sticky web!"); + MESSAGE("Grimer was hurt by the spikes!"); + } + } THEN { + EXPECT_EQ(gBattleStruct->hazardsQueue[0][0], HAZARDS_STEALTH_ROCK); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][1], HAZARDS_STICKY_WEB); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][2], HAZARDS_SPIKES); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][3], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][4], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][5], HAZARDS_NONE); + } +} + +SINGLE_BATTLE_TEST("Hazards can trigger Emergency Exit and other hazards don't activate") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_GOLISOPOD) { HP(105); MaxHP(200); Ability(ABILITY_EMERGENCY_EXIT); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_STEALTH_ROCK); } + TURN { MOVE(opponent, MOVE_TOXIC_SPIKES); } + TURN { MOVE(opponent, MOVE_STICKY_WEB); } + TURN { MOVE(opponent, MOVE_SPIKES); } + TURN { MOVE(opponent, MOVE_STEALTH_ROCK); SWITCH(player, 1); SEND_OUT(player, 0); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, opponent); + MESSAGE("Pointed stones dug into Golisopod!"); + ABILITY_POPUP(player, ABILITY_EMERGENCY_EXIT); + NONE_OF { + MESSAGE("Golisopod was poisoned!"); + MESSAGE("Golisopod was caught in a sticky web!"); + MESSAGE("Golisopod was hurt by the spikes!"); + } + MESSAGE("Pointed stones dug into Wobbuffet!"); + MESSAGE("Wobbuffet was poisoned!"); + MESSAGE("Wobbuffet was caught in a sticky web!"); + MESSAGE("Wobbuffet was hurt by the spikes!"); + NOT MESSAGE("Pointed stones dug into Wobbuffet!"); // Because the previous switch in effects instruction is still kept + } +} + +DOUBLE_BATTLE_TEST("Hazards can trigger Emergency Exit and hazards still activate for other battlers") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_FINAL_GAMBIT) == EFFECT_FINAL_GAMBIT); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_GOLISOPOD) { HP(105); MaxHP(200); Ability(ABILITY_EMERGENCY_EXIT); } + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_STEALTH_ROCK); MOVE(opponentRight, MOVE_TOXIC_SPIKES); } + TURN { MOVE(opponentLeft, MOVE_STICKY_WEB); MOVE(opponentRight, MOVE_SPIKES); } + TURN { MOVE(playerLeft, MOVE_FINAL_GAMBIT, target: opponentRight); + MOVE(playerRight, MOVE_FINAL_GAMBIT, target: opponentRight); + SEND_OUT(playerLeft, 2); + SEND_OUT(playerRight, 3); + SEND_OUT(playerLeft, 4); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, opponentRight); + MESSAGE("Pointed stones dug into Golisopod!"); + ABILITY_POPUP(playerLeft, ABILITY_EMERGENCY_EXIT); + NONE_OF { + MESSAGE("Golisopod was poisoned!"); + MESSAGE("Golisopod was caught in a sticky web!"); + MESSAGE("Golisopod was hurt by the spikes!"); + } + MESSAGE("Pointed stones dug into Wobbuffet!"); + MESSAGE("Wobbuffet was poisoned!"); + MESSAGE("Wobbuffet was caught in a sticky web!"); + MESSAGE("Wobbuffet was hurt by the spikes!"); + MESSAGE("Pointed stones dug into Wynaut!"); + MESSAGE("Wynaut was poisoned!"); + MESSAGE("Wynaut was caught in a sticky web!"); + MESSAGE("Wynaut was hurt by the spikes!"); + } +} diff --git a/test/battle/hold_effect/ability_shield.c b/test/battle/hold_effect/ability_shield.c index 3159d0d8a469..9f98ea98ef43 100644 --- a/test/battle/hold_effect/ability_shield.c +++ b/test/battle/hold_effect/ability_shield.c @@ -6,7 +6,7 @@ ASSUMPTIONS ASSUME(gItemsInfo[ITEM_ABILITY_SHIELD].holdEffect == HOLD_EFFECT_ABILITY_SHIELD); } -SINGLE_BATTLE_TEST("Ability Shield prevents Neutralizing Gas") +SINGLE_BATTLE_TEST("Ability Shield protects against Neutralizing Gas") { u32 item; @@ -22,18 +22,20 @@ SINGLE_BATTLE_TEST("Ability Shield prevents Neutralizing Gas") ABILITY_POPUP(opponent, ABILITY_NEUTRALIZING_GAS); MESSAGE("Neutralizing gas filled the area!"); if (item == ITEM_ABILITY_SHIELD) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Torkoal's Ability is protected by the effects of its Ability Shield!"); ABILITY_POPUP(player, ABILITY_DROUGHT); - MESSAGE("Torkoal's Drought intensified the sun's rays!"); } else { NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Torkoal's Ability is protected by the effects of its Ability Shield!"); ABILITY_POPUP(player, ABILITY_DROUGHT); - MESSAGE("Torkoal's Drought intensified the sun's rays!"); } } } } -SINGLE_BATTLE_TEST("Ability Shield protects against Mold Breaker") +SINGLE_BATTLE_TEST("Ability Shield protects against Mold Breaker (no message)") { u32 item; @@ -41,22 +43,27 @@ SINGLE_BATTLE_TEST("Ability Shield protects against Mold Breaker") PARAMETRIZE { item = ITEM_NONE; } GIVEN { - PLAYER(SPECIES_SHEDINJA) { Ability(ABILITY_WONDER_GUARD); Item(item); } - OPPONENT(SPECIES_TINKATON) { Ability(ABILITY_MOLD_BREAKER); } + ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); + PLAYER(SPECIES_FLYGON) { Ability(ABILITY_LEVITATE); Item(item); } + OPPONENT(SPECIES_EXCADRILL) { Ability(ABILITY_MOLD_BREAKER); } } WHEN { - TURN { MOVE(opponent, MOVE_GIGATON_HAMMER); } + TURN { MOVE(opponent, MOVE_EARTHQUAKE); } } SCENE { if (item == ITEM_ABILITY_SHIELD) { NONE_OF { - MESSAGE("Shedinja fainted!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Flygon's Ability is protected by the effects of its Ability Shield!"); + HP_BAR(player); } + ABILITY_POPUP(player, ABILITY_LEVITATE); } else { - MESSAGE("Shedinja fainted!"); + HP_BAR(player); + NOT ABILITY_POPUP(player, ABILITY_LEVITATE); } } } -SINGLE_BATTLE_TEST("Ability Shield protects against Mycelium Might") +SINGLE_BATTLE_TEST("Ability Shield protects against Mycelium Might (no message)") { u32 item; @@ -64,17 +71,22 @@ SINGLE_BATTLE_TEST("Ability Shield protects against Mycelium Might") PARAMETRIZE { item = ITEM_NONE; } GIVEN { + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_VIGOROTH) { Ability(ABILITY_VITAL_SPIRIT); Item(item); } OPPONENT(SPECIES_TOEDSCOOL) { Ability(ABILITY_MYCELIUM_MIGHT); } } WHEN { - TURN { MOVE(opponent, MOVE_SPORE); MOVE(player, MOVE_SPORE); } + TURN { MOVE(opponent, MOVE_SPORE); } } SCENE { if (item == ITEM_ABILITY_SHIELD) { NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponent); STATUS_ICON(player, sleep: TRUE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Vigoroth's Ability is protected by the effects of its Ability Shield!"); } + ABILITY_POPUP(player, ABILITY_VITAL_SPIRIT); } else { ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponent); STATUS_ICON(player, sleep: TRUE); @@ -82,7 +94,7 @@ SINGLE_BATTLE_TEST("Ability Shield protects against Mycelium Might") } } -SINGLE_BATTLE_TEST("Ability Shield protects against Sunsteel Strike") +SINGLE_BATTLE_TEST("Ability Shield protects against Sunsteel Strike (no message)") { u32 item; @@ -90,6 +102,7 @@ SINGLE_BATTLE_TEST("Ability Shield protects against Sunsteel Strike") PARAMETRIZE { item = ITEM_NONE; } GIVEN { + ASSUME(MoveIgnoresTargetAbility(MOVE_SUNSTEEL_STRIKE)); PLAYER(SPECIES_SHEDINJA) { Ability(ABILITY_WONDER_GUARD); Item(item); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -97,10 +110,96 @@ SINGLE_BATTLE_TEST("Ability Shield protects against Sunsteel Strike") } SCENE { if (item == ITEM_ABILITY_SHIELD) { NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Shedinja's Ability is protected by the effects of its Ability Shield!"); MESSAGE("Shedinja fainted!"); } + ABILITY_POPUP(player, ABILITY_WONDER_GUARD); } else { MESSAGE("Shedinja fainted!"); + NOT ABILITY_POPUP(player, ABILITY_WONDER_GUARD); + } + } +} + +SINGLE_BATTLE_TEST("Ability Shield protects the user's ability from being suppressed by Gastro Acid") +{ + u32 item; + + PARAMETRIZE { item = ITEM_ABILITY_SHIELD; } + PARAMETRIZE { item = ITEM_NONE; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_GASTRO_ACID) == EFFECT_GASTRO_ACID); + PLAYER(SPECIES_BLAZIKEN) { Ability(ABILITY_SPEED_BOOST); Item(item); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_GASTRO_ACID); } + } SCENE { + if (item == ITEM_ABILITY_SHIELD) { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_GASTRO_ACID, opponent); + ABILITY_POPUP(player, ABILITY_SPEED_BOOST); + } else { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GASTRO_ACID, opponent); + NOT ABILITY_POPUP(player, ABILITY_SPEED_BOOST); + } + } +} + +SINGLE_BATTLE_TEST("Ability Shield protects against Skill Swap") +{ + u32 item; + + PARAMETRIZE { item = ITEM_ABILITY_SHIELD; } + PARAMETRIZE { item = ITEM_NONE; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); + PLAYER(SPECIES_GYARADOS) { Ability(ABILITY_INTIMIDATE); Item(item); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SKILL_SWAP); } + } SCENE { + if (item == ITEM_ABILITY_SHIELD) { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, opponent); + ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); + } + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Gyarados's Ability is protected by the effects of its Ability Shield!"); + } else { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, opponent); + ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); } } } + +SINGLE_BATTLE_TEST("Ability Shield protects against Skill Swap even if user has Klutz") +{ + u32 item; + + PARAMETRIZE { item = ITEM_ABILITY_SHIELD; } + PARAMETRIZE { item = ITEM_NONE; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); + PLAYER(SPECIES_LOPUNNY) { Ability(ABILITY_KLUTZ); Item(item); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SKILL_SWAP); } + } SCENE { + if (item == ITEM_ABILITY_SHIELD) { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Lopunny's Ability is protected by the effects of its Ability Shield!"); + } else { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, opponent); + } + } +} + +// These currently do not activate, but probably should do held item animation + message +TO_DO_BATTLE_TEST("Ability Shield prevents the user's Trace from changing its ability"); +TO_DO_BATTLE_TEST("Ability Shield prevents the user's Receiver from changing its ability"); +TO_DO_BATTLE_TEST("Ability Shield protects against Wandering Spirit"); +TO_DO_BATTLE_TEST("Ability Shield protects against Mummy/Lingering Aroma"); diff --git a/test/battle/hold_effect/absorb_bulb.c b/test/battle/hold_effect/absorb_bulb.c new file mode 100644 index 000000000000..63daaae02efc --- /dev/null +++ b/test/battle/hold_effect/absorb_bulb.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Absorb Bulb (Hold Effect) test titles") diff --git a/test/battle/hold_effect/adamant_orb.c b/test/battle/hold_effect/adamant_orb.c new file mode 100644 index 000000000000..3120e543354a --- /dev/null +++ b/test/battle/hold_effect/adamant_orb.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Adamant Orb (Hold Effect) test titles") diff --git a/test/battle/hold_effect/adrenaline_orb.c b/test/battle/hold_effect/adrenaline_orb.c new file mode 100644 index 000000000000..595539203ef1 --- /dev/null +++ b/test/battle/hold_effect/adrenaline_orb.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Adrenaline Orb (Hold Effect) test titles") diff --git a/test/battle/hold_effect/air_balloon.c b/test/battle/hold_effect/air_balloon.c index 17872d89b83a..ad0fb457a81f 100644 --- a/test/battle/hold_effect/air_balloon.c +++ b/test/battle/hold_effect/air_balloon.c @@ -102,17 +102,14 @@ SINGLE_BATTLE_TEST("Air Balloon pops before it can be stolen with Magician") } } -SINGLE_BATTLE_TEST("Air Balloon pops before it can be stolen with Thief or Covet") +SINGLE_BATTLE_TEST("Air Balloon pops before it can be stolen by Thief") { - u32 move; - PARAMETRIZE { move = MOVE_THIEF; } - PARAMETRIZE { move = MOVE_COVET; } GIVEN { - ASSUME(MoveHasAdditionalEffect(move, MOVE_EFFECT_STEAL_ITEM) == TRUE); + ASSUME(GetMoveEffect(MOVE_THIEF) == EFFECT_STEAL_ITEM); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); }; OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(opponent, move); } + TURN { MOVE(opponent, MOVE_THIEF); } } SCENE { MESSAGE("Wobbuffet floats in the air with its Air Balloon!"); MESSAGE("Wobbuffet's Air Balloon popped!"); diff --git a/test/battle/hold_effect/assault_vest.c b/test/battle/hold_effect/assault_vest.c new file mode 100644 index 000000000000..815a9fddcf15 --- /dev/null +++ b/test/battle/hold_effect/assault_vest.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Assault Vest (Hold Effect) test titles") diff --git a/test/battle/hold_effect/attack_up.c b/test/battle/hold_effect/attack_up.c index 2030faf782f2..e9efef9ad541 100644 --- a/test/battle/hold_effect/attack_up.c +++ b/test/battle/hold_effect/attack_up.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_LIECHI_BERRY].holdEffect == HOLD_EFFECT_ATTACK_UP); - ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); } SINGLE_BATTLE_TEST("Liechi Berry raises the holder's Attack by one stage when HP drops to 1/4 or below") diff --git a/test/battle/hold_effect/berserk_gene.c b/test/battle/hold_effect/berserk_gene.c index 640198c992db..c7b9ba093348 100644 --- a/test/battle/hold_effect/berserk_gene.c +++ b/test/battle/hold_effect/berserk_gene.c @@ -213,11 +213,11 @@ SINGLE_BATTLE_TEST("Berserk Gene causes infinite confusion") // check if bit is TURN {} } SCENE { } THEN { - EXPECT(gStatuses4[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)] & STATUS4_INFINITE_CONFUSION); + EXPECT(gBattleMons[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)].volatiles.infiniteConfusion); } } -SINGLE_BATTLE_TEST("Berserk Gene causes confusion timer to not tick down", u32 status2) +SINGLE_BATTLE_TEST("Berserk Gene causes confusion timer to not tick down", u32 confusionTurns) { u32 turns; PARAMETRIZE { turns = 1; } @@ -231,9 +231,9 @@ SINGLE_BATTLE_TEST("Berserk Gene causes confusion timer to not tick down", u32 s TURN {} } } THEN { - results[i].status2 = player->status2; + results[i].confusionTurns = player->volatiles.confusionTurns; } FINALLY { - EXPECT_EQ(results[0].status2, results[1].status2); + EXPECT_EQ(results[0].confusionTurns, results[1].confusionTurns); } } @@ -252,3 +252,54 @@ SINGLE_BATTLE_TEST("Berserk Gene does not cause an infinite loop") MESSAGE("Using Berserk Gene, the Attack of the opposing Wobbuffet sharply rose!"); } } + +SINGLE_BATTLE_TEST("Berserker Gene confusion can be healed with bag items") +{ + u16 item; + PARAMETRIZE { item = ITEM_FULL_HEAL; } + PARAMETRIZE { item = ITEM_HEAL_POWDER; } + PARAMETRIZE { item = ITEM_PEWTER_CRUNCHIES; } + PARAMETRIZE { item = ITEM_LAVA_COOKIE; } + PARAMETRIZE { item = ITEM_RAGE_CANDY_BAR; } + PARAMETRIZE { item = ITEM_OLD_GATEAU; } + PARAMETRIZE { item = ITEM_CASTELIACONE; } + PARAMETRIZE { item = ITEM_LUMIOSE_GALETTE; } + PARAMETRIZE { item = ITEM_SHALOUR_SABLE; } + PARAMETRIZE { item = ITEM_BIG_MALASADA; } + PARAMETRIZE { item = ITEM_JUBILIFE_MUFFIN; } + GIVEN { + ASSUME(gItemsInfo[item].battleUsage == EFFECT_ITEM_CURE_STATUS); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_BERSERK_GENE);}; + OPPONENT(SPECIES_GENGAR); + } WHEN { + TURN { USE_ITEM(player, item, partyIndex: 0); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_CONFUSION, player); + MESSAGE("Wobbuffet had its status healed!"); + } THEN { + EXPECT(player->volatiles.infiniteConfusion == 0); + } +} + +SINGLE_BATTLE_TEST("Berserker Gene confusion can be healed with used held items") +{ + u16 item; + PARAMETRIZE { item = ITEM_PERSIM_BERRY; } + PARAMETRIZE { item = ITEM_LUM_BERRY; } + + GIVEN { + ASSUME(gItemsInfo[ITEM_PERSIM_BERRY].holdEffect == HOLD_EFFECT_CURE_CONFUSION); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_BERSERK_GENE);}; + OPPONENT(SPECIES_WOBBUFFET) { Item(item);}; + } WHEN { + TURN { MOVE(player, MOVE_COVET, WITH_RNG(RNG_CONFUSION, FALSE)); } + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_CONFUSION, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + } THEN { + EXPECT(player->volatiles.infiniteConfusion == 0); + } +} diff --git a/test/battle/hold_effect/big_root.c b/test/battle/hold_effect/big_root.c index 41dd09adc07b..3d2256ea34d4 100644 --- a/test/battle/hold_effect/big_root.c +++ b/test/battle/hold_effect/big_root.c @@ -14,7 +14,7 @@ SINGLE_BATTLE_TEST("Big Root increases healing from absorbing moves", s16 damage PARAMETRIZE { item = ITEM_BIG_ROOT; } GIVEN { - PLAYER(SPECIES_WOBBUFFET) { HP(200); Item(item); } + PLAYER(SPECIES_XURKITREE) { HP(200); Item(item); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_ABSORB); } @@ -24,7 +24,7 @@ SINGLE_BATTLE_TEST("Big Root increases healing from absorbing moves", s16 damage HP_BAR(player, captureDamage: &results[i].heal); } FINALLY { EXPECT_EQ(results[0].damage, results[1].damage); // Damage is unaffected - EXPECT_MUL_EQ(results[1].heal, Q_4_12(5234 / 4096), results[0].heal); + EXPECT_MUL_EQ(results[0].heal, Q_4_12(1.3), results[1].heal); } } @@ -65,7 +65,7 @@ SINGLE_BATTLE_TEST("Big Root increases damage from absorbing Liquid Ooze", s16 d PARAMETRIZE { item = ITEM_BIG_ROOT; } GIVEN { - PLAYER(SPECIES_WOBBUFFET) { HP(200); Item(item); } + PLAYER(SPECIES_XURKITREE) { HP(200); Item(item); } OPPONENT(SPECIES_TENTACOOL) { Ability(ABILITY_LIQUID_OOZE); } } WHEN { TURN { MOVE(player, MOVE_ABSORB); } @@ -73,6 +73,6 @@ SINGLE_BATTLE_TEST("Big Root increases damage from absorbing Liquid Ooze", s16 d ANIMATION(ANIM_TYPE_MOVE, MOVE_ABSORB, player); HP_BAR(player, captureDamage: &results[i].damage); } FINALLY { - EXPECT_MUL_EQ(results[1].damage, Q_4_12(5234 / 4096), results[0].damage); + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.3), results[1].damage); } } diff --git a/test/battle/hold_effect/binding_band.c b/test/battle/hold_effect/binding_band.c new file mode 100644 index 000000000000..315ac7a7af7d --- /dev/null +++ b/test/battle/hold_effect/binding_band.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Binding Band (Hold Effect) test titles") diff --git a/test/battle/hold_effect/black_sludge.c b/test/battle/hold_effect/black_sludge.c new file mode 100644 index 000000000000..9d7d845c5860 --- /dev/null +++ b/test/battle/hold_effect/black_sludge.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Black Sludge (Hold Effect) test titles") diff --git a/test/battle/hold_effect/booster_energy.c b/test/battle/hold_effect/booster_energy.c index f6f44a272cd8..f98675a1e92b 100644 --- a/test/battle/hold_effect/booster_energy.c +++ b/test/battle/hold_effect/booster_energy.c @@ -38,6 +38,7 @@ SINGLE_BATTLE_TEST("Booster Energy will activate Quark Drive after Electric Terr SINGLE_BATTLE_TEST("Booster Energy will activate Protosynthesis after harsh sunlight ends") { GIVEN { + WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); PLAYER(SPECIES_RAGING_BOLT) { Attack(100); Defense(100); Speed(100); SpAttack(110); SpDefense(100); Ability(ABILITY_PROTOSYNTHESIS); Item(ITEM_BOOSTER_ENERGY); } OPPONENT(SPECIES_TORKOAL) { Speed(100); Ability(ABILITY_DROUGHT); }; } WHEN { @@ -64,6 +65,29 @@ SINGLE_BATTLE_TEST("Booster Energy will activate Protosynthesis after harsh sunl } } +SINGLE_BATTLE_TEST("Booster Energy's Protosynthesis boost is preserved when weather changes") +{ + GIVEN { + PLAYER(SPECIES_RAGING_BOLT) { Attack(110); Defense(100); Speed(100); SpAttack(100); SpDefense(100); Ability(ABILITY_PROTOSYNTHESIS); Item(ITEM_BOOSTER_ENERGY); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); Moves(MOVE_SUNNY_DAY, MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(opponent, MOVE_SUNNY_DAY); } + TURN { } + TURN { } + TURN { } + TURN { } + TURN { } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Raging Bolt used its Booster Energy to activate Protosynthesis!"); + MESSAGE("Raging Bolt's Attack was heightened!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, opponent); + MESSAGE("The sunlight faded."); + } THEN { + EXPECT(gDisableStructs[B_POSITION_PLAYER_LEFT].paradoxBoostedStat == STAT_ATK); + } +} + SINGLE_BATTLE_TEST("Booster Energy activates Protosynthesis and increases highest stat") { u32 attack, defense, speed, spAttack, spDefense; @@ -130,10 +154,33 @@ SINGLE_BATTLE_TEST("Booster Energy activates Quark Drive and increases highest s } } +SINGLE_BATTLE_TEST("Booster Energy's Quark Drive boost is preserved when terrain changes") +{ + GIVEN { + PLAYER(SPECIES_IRON_MOTH) { Attack(110); Defense(100); Speed(100); SpAttack(100); SpDefense(100); Ability(ABILITY_QUARK_DRIVE); Item(ITEM_BOOSTER_ENERGY); Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); Moves(MOVE_GRASSY_TERRAIN, MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(opponent, MOVE_GRASSY_TERRAIN); } + TURN { } + TURN { } + TURN { } + TURN { } + TURN { } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Iron Moth used its Booster Energy to activate Quark Drive!"); + MESSAGE("Iron Moth's Attack was heightened!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRASSY_TERRAIN, opponent); + MESSAGE("The grass disappeared from the battlefield."); + } THEN { + EXPECT(gDisableStructs[B_POSITION_PLAYER_LEFT].paradoxBoostedStat == STAT_ATK); + } +} + SINGLE_BATTLE_TEST("Booster Energy increases special attack by 30% if it is the highest stat", s16 damage) { u32 species; - u32 ability; + enum Ability ability; u32 item; PARAMETRIZE { species = SPECIES_RAGING_BOLT; ability = ABILITY_PROTOSYNTHESIS; item = ITEM_NONE; } @@ -159,7 +206,7 @@ SINGLE_BATTLE_TEST("Booster Energy increases special attack by 30% if it is the SINGLE_BATTLE_TEST("Booster Energy increases special defense by 30% if it is the highest stat", s16 damage) { u32 species; - u32 ability; + enum Ability ability; u32 item; PARAMETRIZE { species = SPECIES_RAGING_BOLT; ability = ABILITY_PROTOSYNTHESIS; item = ITEM_NONE; } @@ -234,3 +281,53 @@ DOUBLE_BATTLE_TEST("Booster Energy triggers correctly for all battlers if multip ABILITY_POPUP(opponentLeft, ABILITY_PROTOSYNTHESIS); } } + +DOUBLE_BATTLE_TEST("Booster Energy activates on any terrain") +{ + GIVEN { + PLAYER(SPECIES_IRON_MOTH) { Speed(110); Ability(ABILITY_QUARK_DRIVE); Item(ITEM_BOOSTER_ENERGY); } + PLAYER(SPECIES_WOBBUFFET) { Speed(80); } + OPPONENT(SPECIES_TAPU_BULU) { Speed(100); Ability(ABILITY_GRASSY_SURGE); } + OPPONENT(SPECIES_TAPU_KOKO) { Speed(10); Ability(ABILITY_ELECTRIC_SURGE); }; + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponentLeft, ABILITY_GRASSY_SURGE); + ABILITY_POPUP(playerLeft, ABILITY_QUARK_DRIVE); + ABILITY_POPUP(opponentRight, ABILITY_ELECTRIC_SURGE); + } +} + +DOUBLE_BATTLE_TEST("Booster Energy activates on air locked sun") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_RAGING_BOLT) { Ability(ABILITY_PROTOSYNTHESIS); Item(ITEM_BOOSTER_ENERGY); } + OPPONENT(SPECIES_PSYDUCK) { Ability(ABILITY_CLOUD_NINE); } + OPPONENT(SPECIES_TORKOAL) { Ability(ABILITY_DROUGHT); }; + } WHEN { + TURN { SWITCH(playerLeft, 2); } + } SCENE { + ABILITY_POPUP(opponentLeft, ABILITY_CLOUD_NINE); + ABILITY_POPUP(opponentRight, ABILITY_DROUGHT); + ABILITY_POPUP(playerLeft, ABILITY_PROTOSYNTHESIS); + } +} + +DOUBLE_BATTLE_TEST("Booster Energy will not activate on terrain if user has Protosynthesis instead of Quark Drive") +{ + GIVEN { + PLAYER(SPECIES_RAGING_BOLT) { Speed(110); Ability(ABILITY_PROTOSYNTHESIS); Item(ITEM_BOOSTER_ENERGY); } + PLAYER(SPECIES_WOBBUFFET) { Speed(80); } + OPPONENT(SPECIES_TAPU_BULU) { Speed(100); Ability(ABILITY_GRASSY_SURGE); } + OPPONENT(SPECIES_TAPU_KOKO) { Speed(10); Ability(ABILITY_ELECTRIC_SURGE); }; + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponentLeft, ABILITY_GRASSY_SURGE); + NOT ABILITY_POPUP(playerLeft, ABILITY_PROTOSYNTHESIS); + ABILITY_POPUP(opponentRight, ABILITY_ELECTRIC_SURGE); + ABILITY_POPUP(playerLeft, ABILITY_PROTOSYNTHESIS); // Activation after all terrains + } +} diff --git a/test/battle/hold_effect/can_always_run.c b/test/battle/hold_effect/can_always_run.c new file mode 100644 index 000000000000..cb5fa5cfb5e0 --- /dev/null +++ b/test/battle/hold_effect/can_always_run.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Smoke Ball (Hold Effect) test titles") diff --git a/test/battle/hold_effect/cell_battery.c b/test/battle/hold_effect/cell_battery.c new file mode 100644 index 000000000000..ed17597a1fd2 --- /dev/null +++ b/test/battle/hold_effect/cell_battery.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Cell Battery (Hold Effect) test titles") diff --git a/test/battle/hold_effect/choice_band.c b/test/battle/hold_effect/choice_band.c new file mode 100644 index 000000000000..f082befaf637 --- /dev/null +++ b/test/battle/hold_effect/choice_band.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Choice Band (Hold Effect) test titles") diff --git a/test/battle/hold_effect/choice_scarf.c b/test/battle/hold_effect/choice_scarf.c new file mode 100644 index 000000000000..7eff5a8e0aa0 --- /dev/null +++ b/test/battle/hold_effect/choice_scarf.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Choice Scarf (Hold Effect) test titles") diff --git a/test/battle/hold_effect/choice_specs.c b/test/battle/hold_effect/choice_specs.c new file mode 100644 index 000000000000..7eff5a8e0aa0 --- /dev/null +++ b/test/battle/hold_effect/choice_specs.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Choice Scarf (Hold Effect) test titles") diff --git a/test/battle/hold_effect/confuse_bitter.c b/test/battle/hold_effect/confuse_bitter.c new file mode 100644 index 000000000000..f2faae1ec7e0 --- /dev/null +++ b/test/battle/hold_effect/confuse_bitter.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Aguav Berry (Hold Effect) test titles") diff --git a/test/battle/hold_effect/confuse_dry.c b/test/battle/hold_effect/confuse_dry.c new file mode 100644 index 000000000000..bbd462f6b65c --- /dev/null +++ b/test/battle/hold_effect/confuse_dry.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Wiki Berry (Hold Effect) test titles") diff --git a/test/battle/hold_effect/confuse_sour.c b/test/battle/hold_effect/confuse_sour.c new file mode 100644 index 000000000000..0d87fab14eb6 --- /dev/null +++ b/test/battle/hold_effect/confuse_sour.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Iapapa Berry (Hold Effect) test titles") diff --git a/test/battle/hold_effect/confuse_spicy.c b/test/battle/hold_effect/confuse_spicy.c new file mode 100644 index 000000000000..527002347803 --- /dev/null +++ b/test/battle/hold_effect/confuse_spicy.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Figy Berry (Hold Effect) test titles") diff --git a/test/battle/hold_effect/confuse_sweet.c b/test/battle/hold_effect/confuse_sweet.c new file mode 100644 index 000000000000..46907373c1b4 --- /dev/null +++ b/test/battle/hold_effect/confuse_sweet.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Mago Berry (Hold Effect) test titles") diff --git a/test/battle/hold_effect/covert_cloak.c b/test/battle/hold_effect/covert_cloak.c index 90593e7cc544..64f75703ccd1 100644 --- a/test/battle/hold_effect/covert_cloak.c +++ b/test/battle/hold_effect/covert_cloak.c @@ -41,7 +41,7 @@ SINGLE_BATTLE_TEST("Covert Cloak blocks secondary effects") MESSAGE("The opposing Wobbuffet was prevented from healing!"); } } THEN { // Can't find good way to test trapping - EXPECT(!(opponent->status2 & STATUS2_ESCAPE_PREVENTION)); + EXPECT(!opponent->volatiles.escapePrevention); } } @@ -82,8 +82,8 @@ SINGLE_BATTLE_TEST("Covert Cloak does not block primary effects") } } THEN { // Can't find good way to test trapping if (move == MOVE_JAW_LOCK) { - EXPECT(opponent->status2 & STATUS2_ESCAPE_PREVENTION); - EXPECT(player->status2 & STATUS2_ESCAPE_PREVENTION); + EXPECT(opponent->volatiles.escapePrevention); + EXPECT(player->volatiles.escapePrevention); } } } @@ -92,12 +92,12 @@ SINGLE_BATTLE_TEST("Covert Cloak does not block self-targeting effects, primary { u16 move; PARAMETRIZE { move = MOVE_POWER_UP_PUNCH; } - PARAMETRIZE { move = MOVE_RAPID_SPIN; } + PARAMETRIZE { move = MOVE_FLAME_CHARGE; } PARAMETRIZE { move = MOVE_LEAF_STORM; } PARAMETRIZE { move = MOVE_METEOR_ASSAULT; } GIVEN { - ASSUME(GetMoveEffect(MOVE_RAPID_SPIN) == EFFECT_RAPID_SPIN); + ASSUME(MoveHasAdditionalEffectSelf(MOVE_FLAME_CHARGE, MOVE_EFFECT_SPD_PLUS_1) == TRUE); ASSUME(MoveHasAdditionalEffectSelf(MOVE_POWER_UP_PUNCH, MOVE_EFFECT_ATK_PLUS_1) == TRUE); ASSUME(MoveHasAdditionalEffectSelf(MOVE_LEAF_STORM, MOVE_EFFECT_SP_ATK_MINUS_2) == TRUE); ASSUME(MoveHasAdditionalEffectSelf(MOVE_METEOR_ASSAULT, MOVE_EFFECT_RECHARGE) == TRUE); @@ -113,7 +113,7 @@ SINGLE_BATTLE_TEST("Covert Cloak does not block self-targeting effects, primary HP_BAR(opponent); switch (move) { case MOVE_POWER_UP_PUNCH: - case MOVE_RAPID_SPIN: + case MOVE_FLAME_CHARGE: case MOVE_LEAF_STORM: ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); break; diff --git a/test/battle/hold_effect/critical_hit_up.c b/test/battle/hold_effect/critical_hit_up.c deleted file mode 100644 index e571d392476a..000000000000 --- a/test/battle/hold_effect/critical_hit_up.c +++ /dev/null @@ -1,73 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(gItemsInfo[ITEM_LANSAT_BERRY].holdEffect == HOLD_EFFECT_CRITICAL_UP); - ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); -} - -SINGLE_BATTLE_TEST("Lansat Berry raises the holder's critical-hit-ratio by two stages when HP drops to 1/4 or below") -{ - u32 move; - - PARAMETRIZE { move = MOVE_SCRATCH; } - PARAMETRIZE { move = MOVE_DRAGON_RAGE; } - - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { MaxHP(160); HP(80); Item(ITEM_LANSAT_BERRY); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, move); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, move, opponent); - if (move == MOVE_SCRATCH) { - NONE_OF { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("Wobbuffet used the Lansat Berry to get pumped!"); - } - } else { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("Wobbuffet used the Lansat Berry to get pumped!"); - } - } -} - -SINGLE_BATTLE_TEST("Lansat Berry raises the holder's critical-hit-ratio by two stages when HP drops to 1/2 or below") -{ - GIVEN { - PLAYER(SPECIES_BELLSPROUT) { MaxHP(80); HP(80); Ability(ABILITY_GLUTTONY); Item(ITEM_LANSAT_BERRY); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, MOVE_DRAGON_RAGE); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_RAGE, opponent); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("Bellsprout used the Lansat Berry to get pumped!"); - } -} - -SINGLE_BATTLE_TEST("Lansat Berry raises the holder's critical-hit-ratio by 2 stages") -{ - u32 genConfig = 0, chance; - for (u32 j = GEN_1; j <= GEN_5; j++) - PARAMETRIZE { genConfig = j; chance = 4; } // 25% - for (u32 j = GEN_6; j <= GEN_9; j++) - PARAMETRIZE { genConfig = j; chance = 2; } // 50% - PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); - GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); - ASSUME(GetMoveCriticalHitStage(MOVE_SCRATCH) == 0); - PLAYER(SPECIES_WOBBUFFET) { MaxHP(160); HP(80); Item(ITEM_LANSAT_BERRY); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, MOVE_DRAGON_RAGE); MOVE(player, MOVE_SCRATCH); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_RAGE, opponent); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("Wobbuffet used the Lansat Berry to get pumped!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); - MESSAGE("A critical hit!"); - } -} diff --git a/test/battle/hold_effect/critical_up.c b/test/battle/hold_effect/critical_up.c new file mode 100644 index 000000000000..163d8f1c271b --- /dev/null +++ b/test/battle/hold_effect/critical_up.c @@ -0,0 +1,73 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_LANSAT_BERRY].holdEffect == HOLD_EFFECT_CRITICAL_UP); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); +} + +SINGLE_BATTLE_TEST("Lansat Berry raises the holder's critical-hit-ratio by two stages when HP drops to 1/4 or below") +{ + u32 move; + + PARAMETRIZE { move = MOVE_SCRATCH; } + PARAMETRIZE { move = MOVE_DRAGON_RAGE; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { MaxHP(160); HP(80); Item(ITEM_LANSAT_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + if (move == MOVE_SCRATCH) { + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wobbuffet used the Lansat Berry to get pumped!"); + } + } else { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wobbuffet used the Lansat Berry to get pumped!"); + } + } +} + +SINGLE_BATTLE_TEST("Lansat Berry raises the holder's critical-hit-ratio by two stages when HP drops to 1/2 or below") +{ + GIVEN { + PLAYER(SPECIES_BELLSPROUT) { MaxHP(80); HP(80); Ability(ABILITY_GLUTTONY); Item(ITEM_LANSAT_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_DRAGON_RAGE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_RAGE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Bellsprout used the Lansat Berry to get pumped!"); + } +} + +SINGLE_BATTLE_TEST("Lansat Berry raises the holder's critical-hit-ratio by 2 stages") +{ + u32 genConfig = 0, chance; + for (u32 j = GEN_1; j <= GEN_5; j++) + PARAMETRIZE { genConfig = j; chance = 4; } // 25% + for (u32 j = GEN_6; j <= GEN_9; j++) + PARAMETRIZE { genConfig = j; chance = 2; } // 50% + PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); + GIVEN { + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); + ASSUME(GetMoveCriticalHitStage(MOVE_SCRATCH) == 0); + PLAYER(SPECIES_WOBBUFFET) { MaxHP(160); HP(80); Item(ITEM_LANSAT_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_DRAGON_RAGE); MOVE(player, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_RAGE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wobbuffet used the Lansat Berry to get pumped!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + MESSAGE("A critical hit!"); + } +} diff --git a/test/battle/hold_effect/cure_brn.c b/test/battle/hold_effect/cure_brn.c new file mode 100644 index 000000000000..5c5971a759e7 --- /dev/null +++ b/test/battle/hold_effect/cure_brn.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + + // Tests for Rawst Berry are handled in test/battle/hold_effect/cure_status.c diff --git a/test/battle/hold_effect/cure_confusion.c b/test/battle/hold_effect/cure_confusion.c new file mode 100644 index 000000000000..297d01113cd9 --- /dev/null +++ b/test/battle/hold_effect/cure_confusion.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + + // Tests for Persim Berry are handled in test/battle/hold_effect/cure_status.c diff --git a/test/battle/hold_effect/cure_frz.c b/test/battle/hold_effect/cure_frz.c new file mode 100644 index 000000000000..b70b0dd9253e --- /dev/null +++ b/test/battle/hold_effect/cure_frz.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + + // Tests for Aspear Berry are handled in test/battle/hold_effect/cure_status.c diff --git a/test/battle/hold_effect/cure_par.c b/test/battle/hold_effect/cure_par.c new file mode 100644 index 000000000000..07f771f7c9ca --- /dev/null +++ b/test/battle/hold_effect/cure_par.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + + // Tests for Cheri Berry are handled in test/battle/hold_effect/cure_status.c diff --git a/test/battle/hold_effect/cure_psn.c b/test/battle/hold_effect/cure_psn.c new file mode 100644 index 000000000000..3be395ac8b0a --- /dev/null +++ b/test/battle/hold_effect/cure_psn.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + + // Tests for Pecha Berry are handled in test/battle/hold_effect/cure_status.c diff --git a/test/battle/hold_effect/cure_slp.c b/test/battle/hold_effect/cure_slp.c new file mode 100644 index 000000000000..aeb464c78461 --- /dev/null +++ b/test/battle/hold_effect/cure_slp.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + + // Tests for Chesto Berry are handled in test/battle/hold_effect/cure_status.c diff --git a/test/battle/hold_effect/cure_status.c b/test/battle/hold_effect/cure_status.c index 133eeafb415a..4a5d354a108f 100644 --- a/test/battle/hold_effect/cure_status.c +++ b/test/battle/hold_effect/cure_status.c @@ -87,7 +87,7 @@ SINGLE_BATTLE_TEST("Aspear and Lum Berries cure freeze or frostbite") TURN { MOVE(player, MOVE_ICE_PUNCH); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_ICE_PUNCH, player); - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRZ, opponent); + ANIMATION(ANIM_TYPE_STATUS, (B_USE_FROSTBITE ? B_ANIM_STATUS_FRB : B_ANIM_STATUS_FRZ), opponent); FREEZE_OR_FROSTBURN_STATUS(opponent, TRUE); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); FREEZE_OR_FROSTBURN_STATUS(opponent, FALSE); @@ -116,6 +116,8 @@ SINGLE_BATTLE_TEST("Chesto and Lum Berries cure sleep") } } +TO_DO_BATTLE_TEST("Chesto and Lum Berries don't trigger if the holder has Comatose") + SINGLE_BATTLE_TEST("Cheri and Lum Berries cure paralysis") { u16 item; @@ -158,7 +160,7 @@ SINGLE_BATTLE_TEST("Perism and Lum Berries cure confusion") } } -SINGLE_BATTLE_TEST("Berry hold effect cures status if a pokemon enters a battle") +SINGLE_BATTLE_TEST("Berry hold effect cures status if a PokΓ©mon enters a battle") { u16 status; u16 item; @@ -289,6 +291,31 @@ DOUBLE_BATTLE_TEST("Lum Berry correctly cures all battlers if multiple fainted t EXPECT_EQ(playerLeft->status1, STATUS1_NONE); EXPECT_EQ(playerRight->status1, STATUS1_NONE); EXPECT_EQ(opponentLeft->status1, STATUS1_NONE); + } +} + +SINGLE_BATTLE_TEST("Lum Berry properly cures a battler affected by a non-volatiles status and confusion") +{ + u32 status; + PARAMETRIZE { status = STATUS1_BURN;} + PARAMETRIZE { status = STATUS1_FREEZE;} + PARAMETRIZE { status = STATUS1_PARALYSIS;} + PARAMETRIZE { status = STATUS1_POISON;} + PARAMETRIZE { status = STATUS1_TOXIC_POISON;} + PARAMETRIZE { status = STATUS1_SLEEP;} + GIVEN { + ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); + PLAYER(SPECIES_WOBBUFFET) { Status1(status); Speed(1);}; + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LUM_BERRY); Speed(2);}; + } WHEN { + TURN { MOVE(opponent, MOVE_CONFUSE_RAY); MOVE(player, MOVE_CELEBRATE, WITH_RNG(RNG_FROZEN, 0));} + TURN { MOVE(opponent, MOVE_SWITCHEROO);} + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wobbuffet's Lum Berry normalized its status!"); + } THEN { + EXPECT_EQ(player->status1, STATUS1_NONE); + EXPECT(player->volatiles.confusionTurns == 0); } } diff --git a/test/battle/hold_effect/damp_rock.c b/test/battle/hold_effect/damp_rock.c new file mode 100644 index 000000000000..a41ea6719d3e --- /dev/null +++ b/test/battle/hold_effect/damp_rock.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Damp Rock (Hold Effect) test titles") diff --git a/test/battle/hold_effect/deep_sea_scale.c b/test/battle/hold_effect/deep_sea_scale.c new file mode 100644 index 000000000000..991a7db5c5c2 --- /dev/null +++ b/test/battle/hold_effect/deep_sea_scale.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Deep Sea Scale (Hold Effect) test titles") diff --git a/test/battle/hold_effect/deep_sea_tooth.c b/test/battle/hold_effect/deep_sea_tooth.c new file mode 100644 index 000000000000..54003e718503 --- /dev/null +++ b/test/battle/hold_effect/deep_sea_tooth.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Deep Sea Tooth (Hold Effect) test titles") diff --git a/test/battle/hold_effect/defense_up.c b/test/battle/hold_effect/defense_up.c index cf1ea04b4057..a29f75b1e53e 100644 --- a/test/battle/hold_effect/defense_up.c +++ b/test/battle/hold_effect/defense_up.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_GANLON_BERRY].holdEffect == HOLD_EFFECT_DEFENSE_UP); - ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); } SINGLE_BATTLE_TEST("Ganlon Berry raises the holder's Defense by one stage when HP drops to 1/4 or below") diff --git a/test/battle/hold_effect/destiny_knot.c b/test/battle/hold_effect/destiny_knot.c new file mode 100644 index 000000000000..7c0fabff5d18 --- /dev/null +++ b/test/battle/hold_effect/destiny_knot.c @@ -0,0 +1,80 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_DESTINY_KNOT].holdEffect == HOLD_EFFECT_DESTINY_KNOT); +} + +SINGLE_BATTLE_TEST("Destiny Knot infatuates back when holder is targeted") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); } + OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); Item(ITEM_DESTINY_KNOT); } + } WHEN { + TURN { MOVE(player, MOVE_ATTRACT); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + MESSAGE("Wobbuffet fell in love because of the Destiny Knot!"); + } THEN { + EXPECT(player->volatiles.infatuation); + } +} + +SINGLE_BATTLE_TEST("Destiny Knot infatuates back when holder is attacking") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); Item(ITEM_DESTINY_KNOT);} + OPPONENT(SPECIES_CLEFAIRY) { Gender(MON_FEMALE); Ability(ABILITY_CUTE_CHARM);} + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("The opposing Clefairy fell in love because of the Destiny Knot!"); + } THEN { + EXPECT(opponent->volatiles.infatuation); + } +} + + +SINGLE_BATTLE_TEST("Destiny Knot procs but fails if the target is already infatuated") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); } + OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); Item(ITEM_DESTINY_KNOT); } + } WHEN { + TURN { MOVE(opponent, MOVE_ATTRACT); MOVE(player, MOVE_ATTRACT, WITH_RNG(RNG_INFATUATION, FALSE)); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + MESSAGE("But it failed!"); + } +} + +SINGLE_BATTLE_TEST("Destiny Knot procs but fails if the target is oblivious") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); Ability(ABILITY_OBLIVIOUS); } + OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); Item(ITEM_DESTINY_KNOT); } + } WHEN { + TURN { MOVE(player, MOVE_ATTRACT); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + ABILITY_POPUP(player, ABILITY_OBLIVIOUS); + } THEN { + EXPECT(!player->volatiles.infatuation); + } +} + +SINGLE_BATTLE_TEST("Destiny Knot procs but fails if the target is already infatuated (cute charm)") +{ + GIVEN { + PLAYER(SPECIES_CLEFAIRY) { Gender(MON_MALE); Ability(ABILITY_CUTE_CHARM);} + OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); Item(ITEM_DESTINY_KNOT); } + } WHEN { + TURN { MOVE(opponent, MOVE_ATTRACT);} + TURN { MOVE(opponent, MOVE_TACKLE);} + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + MESSAGE("But it failed!"); + } +} diff --git a/test/battle/hold_effect/double_prize.c b/test/battle/hold_effect/double_prize.c new file mode 100644 index 000000000000..929a9aced3e1 --- /dev/null +++ b/test/battle/hold_effect/double_prize.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Amulet Coin (Hold Effect) test titles") diff --git a/test/battle/hold_effect/drive.c b/test/battle/hold_effect/drive.c new file mode 100644 index 000000000000..e09ec3ba02e6 --- /dev/null +++ b/test/battle/hold_effect/drive.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Douse, Shock, Burn and Chill Drive (Hold Effect) test titles") diff --git a/test/battle/hold_effect/eject_button.c b/test/battle/hold_effect/eject_button.c index 9dd73833a5d2..681858605b00 100644 --- a/test/battle/hold_effect/eject_button.c +++ b/test/battle/hold_effect/eject_button.c @@ -232,3 +232,21 @@ DOUBLE_BATTLE_TEST("Eject Button activation will not trigger an attack from the } } } + +SINGLE_BATTLE_TEST("Eject Button activates after Wandring Spirit") +{ + GIVEN { + PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_YAMASK_GALAR) { Item(ITEM_EJECT_BUTTON); Ability(ABILITY_WANDERING_SPIRIT); } + } WHEN { + TURN { + SWITCH(opponent, 1); + MOVE(player, MOVE_DRAGON_CLAW); + SEND_OUT(opponent, 0); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_CLAW, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + } +} diff --git a/test/battle/hold_effect/eject_pack.c b/test/battle/hold_effect/eject_pack.c index f33a59de21f1..836f3d0fd115 100644 --- a/test/battle/hold_effect/eject_pack.c +++ b/test/battle/hold_effect/eject_pack.c @@ -21,7 +21,7 @@ SINGLE_BATTLE_TEST("Eject Pack does not cause the new PokΓ©mon to lose HP due to ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); MESSAGE("Wobbuffet is switched out with the Eject Pack!"); SEND_IN_MESSAGE("Wynaut"); - NOT MESSAGE("Wynaut was hurt by its Life Orb!"); + NOT HP_BAR(player); ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); } } @@ -239,3 +239,125 @@ DOUBLE_BATTLE_TEST("Eject Pack: Only the fastest Eject Pack will activate after } } } + +DOUBLE_BATTLE_TEST("Eject Pack: Only the fastest Eject Pack will activate after intimidate (switch in after fainting)") +{ + u32 speed; + + PARAMETRIZE { speed = 1; } + PARAMETRIZE { speed = 11; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(10); Item(ITEM_EJECT_PACK); } + PLAYER(SPECIES_WYNAUT) { Speed(speed); Item(ITEM_EJECT_PACK); } + PLAYER(SPECIES_WOBBUFFET) { Speed(3); } + OPPONENT(SPECIES_WYNAUT) { HP(1); Speed(4); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_EKANS) { Speed(6); Ability(ABILITY_INTIMIDATE); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_POUND, target: opponentLeft); + SEND_OUT(opponentLeft, 2); + if (speed == 11) + SEND_OUT(playerRight, 2); + else + SEND_OUT(playerLeft, 2); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + if (speed == 11) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerRight); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); + } else { + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); + } + } +} + +DOUBLE_BATTLE_TEST("Eject Pack: Only the fastest Eject Pack will activate after intimidate (switch in after 2 mons fainted)") +{ + u32 speed; + + PARAMETRIZE { speed = 1; } + PARAMETRIZE { speed = 11; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(10); Item(ITEM_EJECT_PACK); } + PLAYER(SPECIES_WYNAUT) { Speed(speed); Item(ITEM_EJECT_PACK); } + PLAYER(SPECIES_WOBBUFFET) { Speed(1); } + OPPONENT(SPECIES_WYNAUT) { HP(1); Speed(4); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WYNAUT) { Speed(4); } + OPPONENT(SPECIES_EKANS) { Speed(6); Ability(ABILITY_INTIMIDATE); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_HYPER_VOICE); + SEND_OUT(opponentLeft, 3); + SEND_OUT(opponentRight, 2); + if (speed == 11) + SEND_OUT(playerRight, 2); + else + SEND_OUT(playerLeft, 2); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + if (speed == 11) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerRight); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); + } else { + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); + } + } +} + +SINGLE_BATTLE_TEST("Eject Pack does not activate if mon is switched in due to Eject Button") +{ + GIVEN { + PLAYER(SPECIES_DUGTRIO) { Ability(ABILITY_ARENA_TRAP); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_EJECT_BUTTON); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_EJECT_PACK); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(player, MOVE_BULLDOZE); + SEND_OUT(opponent, 1); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLDOZE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + MESSAGE("The opposing Wobbuffet is switched out with the Eject Button!"); + MESSAGE("2 sent out Wobbuffet!"); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + } +} + +DOUBLE_BATTLE_TEST("Eject Pack will trigger on the fastest mon at the end of the turn") +{ + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_SYRUP_BOMB, MOVE_EFFECT_SYRUP_BOMB) == TRUE); + PLAYER(SPECIES_WOBBUFFET) { Speed(1); Item(ITEM_EJECT_PACK); } + PLAYER(SPECIES_WYNAUT) { Speed(10); Item(ITEM_EJECT_PACK); } + PLAYER(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WYNAUT) { Speed(4); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(3); } + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_SYRUP_BOMB, target: playerLeft); + MOVE(opponentRight, MOVE_SYRUP_BOMB, target: playerRight); + SEND_OUT(playerRight, 2); + } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SYRUP_BOMB_SPEED_DROP, playerRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SYRUP_BOMB_SPEED_DROP, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerRight); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); + } +} diff --git a/test/battle/hold_effect/evasion_up.c b/test/battle/hold_effect/evasion_up.c new file mode 100644 index 000000000000..3ed7b66be8a0 --- /dev/null +++ b/test/battle/hold_effect/evasion_up.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Bright Powder (Hold Effect) test titles") diff --git a/test/battle/hold_effect/eviolite.c b/test/battle/hold_effect/eviolite.c new file mode 100644 index 000000000000..1aa0622e431c --- /dev/null +++ b/test/battle/hold_effect/eviolite.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Eviolite (Hold Effect) test titles") diff --git a/test/battle/hold_effect/exp_share.c b/test/battle/hold_effect/exp_share.c new file mode 100644 index 000000000000..3f25ef796812 --- /dev/null +++ b/test/battle/hold_effect/exp_share.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Exp. Share (Hold Effect) test titles") diff --git a/test/battle/hold_effect/expert_belt.c b/test/battle/hold_effect/expert_belt.c new file mode 100644 index 000000000000..6391046335cc --- /dev/null +++ b/test/battle/hold_effect/expert_belt.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Expert Belt (Hold Effect) test titles") diff --git a/test/battle/hold_effect/flame_orb.c b/test/battle/hold_effect/flame_orb.c new file mode 100644 index 000000000000..b715ab1a269d --- /dev/null +++ b/test/battle/hold_effect/flame_orb.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Flame Orb (Hold Effect) test titles") diff --git a/test/battle/hold_effect/flinch.c b/test/battle/hold_effect/flinch.c new file mode 100644 index 000000000000..9d396391fcc2 --- /dev/null +++ b/test/battle/hold_effect/flinch.c @@ -0,0 +1,36 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_KINGS_ROCK].holdEffect == HOLD_EFFECT_FLINCH); +} + +SINGLE_BATTLE_TEST("Kings Rock holder will flinch the target 10% of the time") +{ + PASSES_RANDOMLY(10, 100, RNG_HOLD_EFFECT_FLINCH); + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_KINGS_ROCK); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + MESSAGE("The opposing Wobbuffet flinched and couldn't move!"); + } +} + +SINGLE_BATTLE_TEST("Kings Rock does not increase flinch chance of a move that has the flinch effect") +{ + PASSES_RANDOMLY(30, 100, RNG_SECONDARY_EFFECT); + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_HEADBUTT, MOVE_EFFECT_FLINCH)); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_KINGS_ROCK); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_HEADBUTT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEADBUTT, player); + MESSAGE("The opposing Wobbuffet flinched and couldn't move!"); + } +} diff --git a/test/battle/hold_effect/float_stone.c b/test/battle/hold_effect/float_stone.c new file mode 100644 index 000000000000..f677c413694f --- /dev/null +++ b/test/battle/hold_effect/float_stone.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Float Stone (Hold Effect) test titles") diff --git a/test/battle/hold_effect/focus_band.c b/test/battle/hold_effect/focus_band.c new file mode 100644 index 000000000000..0dddca16b9d5 --- /dev/null +++ b/test/battle/hold_effect/focus_band.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Focus Band (Hold Effect) test titles") diff --git a/test/battle/hold_effect/focus_sash.c b/test/battle/hold_effect/focus_sash.c new file mode 100644 index 000000000000..a66da4ff29fb --- /dev/null +++ b/test/battle/hold_effect/focus_sash.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Focus Sash (Hold Effect) test titles") diff --git a/test/battle/hold_effect/friendship_up.c b/test/battle/hold_effect/friendship_up.c new file mode 100644 index 000000000000..9eb6408b0dfe --- /dev/null +++ b/test/battle/hold_effect/friendship_up.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Soothe Bell (Hold Effect) test titles") diff --git a/test/battle/hold_effect/gems.c b/test/battle/hold_effect/gems.c index 52c85d7fb533..b597beeab72f 100644 --- a/test/battle/hold_effect/gems.c +++ b/test/battle/hold_effect/gems.c @@ -26,13 +26,40 @@ SINGLE_BATTLE_TEST("Gem is consumed when it corresponds to the type of a move") } } +SINGLE_BATTLE_TEST("Gem is not consumed when using Struggle", s16 damage) +{ + u32 item = 0; + + PARAMETRIZE { item = ITEM_NONE; } + PARAMETRIZE { item = ITEM_NORMAL_GEM; } + + GIVEN { + if (item != ITEM_NONE) { + ASSUME(GetItemHoldEffect(item) == HOLD_EFFECT_GEMS); + ASSUME(GetItemSecondaryId(item) == GetMoveType(MOVE_STRUGGLE)); + } + PLAYER(SPECIES_WOBBUFFET) { Item(item); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_STRUGGLE); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("The Normal Gem strengthened Wobbuffet's power!"); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_STRUGGLE, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} + SINGLE_BATTLE_TEST("Gem boost is only applied once") { s16 boostedHit; s16 normalHit; GIVEN { - ASSUME(I_GEM_BOOST_POWER >= GEN_6); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); }; OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -46,7 +73,10 @@ SINGLE_BATTLE_TEST("Gem boost is only applied once") ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); HP_BAR(opponent, captureDamage: &normalHit); } THEN { - EXPECT_MUL_EQ(normalHit, Q_4_12(1.3), boostedHit); + if (I_GEM_BOOST_POWER >= GEN_6) + EXPECT_MUL_EQ(normalHit, Q_4_12(1.3), boostedHit); + else + EXPECT_MUL_EQ(normalHit, Q_4_12(1.5), boostedHit); } } diff --git a/test/battle/hold_effect/grip_claw.c b/test/battle/hold_effect/grip_claw.c new file mode 100644 index 000000000000..b334597bbc8d --- /dev/null +++ b/test/battle/hold_effect/grip_claw.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Grip Claw (Hold Effect) test titles") diff --git a/test/battle/hold_effect/griseous_orb.c b/test/battle/hold_effect/griseous_orb.c new file mode 100644 index 000000000000..f904b5ec6807 --- /dev/null +++ b/test/battle/hold_effect/griseous_orb.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Griseous Orb (Hold Effect) test titles") diff --git a/test/battle/hold_effect/heat_rock.c b/test/battle/hold_effect/heat_rock.c new file mode 100644 index 000000000000..f297a89c8cf8 --- /dev/null +++ b/test/battle/hold_effect/heat_rock.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Heat Rock (Hold Effect) test titles") diff --git a/test/battle/hold_effect/heavy_duty_boots.c b/test/battle/hold_effect/heavy_duty_boots.c new file mode 100644 index 000000000000..060280cbc288 --- /dev/null +++ b/test/battle/hold_effect/heavy_duty_boots.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Heavy Duty Boots (Hold Effect) test titles") diff --git a/test/battle/hold_effect/icy_rock.c b/test/battle/hold_effect/icy_rock.c new file mode 100644 index 000000000000..9ad50b807a13 --- /dev/null +++ b/test/battle/hold_effect/icy_rock.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Icy Rock (Hold Effect) test titles") diff --git a/test/battle/hold_effect/iron_ball.c b/test/battle/hold_effect/iron_ball.c index 134c47d9af2d..90c370e8f3db 100644 --- a/test/battle/hold_effect/iron_ball.c +++ b/test/battle/hold_effect/iron_ball.c @@ -5,17 +5,24 @@ ASSUMPTIONS{ ASSUME(gItemsInfo[ITEM_IRON_BALL].holdEffect == HOLD_EFFECT_IRON_BALL); } -SINGLE_BATTLE_TEST("Ground-type moves do neutral damage to non-grounded Flying types holding Iron Ball regardless of other typings") //gen5+ only +SINGLE_BATTLE_TEST("Ground-type moves do neutral damage to non-grounded Flying types holding Iron Ball regardless of other typings (Gen5+)") { - ASSUME(B_IRON_BALL >= GEN_5); + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { + WITH_CONFIG(CONFIG_IRON_BALL, config); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SKARMORY) { Item(ITEM_IRON_BALL); }; } WHEN { TURN { MOVE(player, MOVE_EARTHQUAKE); }; } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, player); - NONE_OF { + if (config >= GEN_5) { + NONE_OF { + MESSAGE("It's super effective!"); + } + } else { MESSAGE("It's super effective!"); } } diff --git a/test/battle/hold_effect/jaboca_berry.c b/test/battle/hold_effect/jaboca_berry.c index 29658c7fe1c0..a23cd90bb941 100644 --- a/test/battle/hold_effect/jaboca_berry.c +++ b/test/battle/hold_effect/jaboca_berry.c @@ -42,7 +42,6 @@ SINGLE_BATTLE_TEST("Jaboca Berry causes the attacker to lose 1/8 of its max HP i SINGLE_BATTLE_TEST("Jaboca Berry triggers before Bug Bite can steal it") { - KNOWN_FAILING; GIVEN { ASSUME(GetMoveCategory(MOVE_BUG_BITE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WYNAUT); diff --git a/test/battle/hold_effect/kee_berry.c b/test/battle/hold_effect/kee_berry.c index c63da8684148..d37a132be494 100644 --- a/test/battle/hold_effect/kee_berry.c +++ b/test/battle/hold_effect/kee_berry.c @@ -89,3 +89,19 @@ DOUBLE_BATTLE_TEST("Kee Berry doesn't trigger if partner was hit") EXPECT(opponentRight->item == ITEM_KEE_BERRY); } } + +SINGLE_BATTLE_TEST("Kee Berry doesn't trigger if the move was boosted by Sheer Force") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_KEE_BERRY); } + OPPONENT(SPECIES_NIDOKING) { Ability(ABILITY_SHEER_FORCE); } + } WHEN { + TURN { MOVE(opponent, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, opponent); + HP_BAR(player); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE); + } +} \ No newline at end of file diff --git a/test/battle/hold_effect/lagging_tail.c b/test/battle/hold_effect/lagging_tail.c new file mode 100644 index 000000000000..13312034e1ae --- /dev/null +++ b/test/battle/hold_effect/lagging_tail.c @@ -0,0 +1,31 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_LAGGING_TAIL].holdEffect == HOLD_EFFECT_LAGGING_TAIL); +} + +DOUBLE_BATTLE_TEST("Lagging Tail priority bracket will not change if the item is removed is changed mid-turn") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(100); Item(ITEM_LAGGING_TAIL); } + PLAYER(SPECIES_WYNAUT) { Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(30); Item(ITEM_BERRY_JUICE); } + OPPONENT(SPECIES_WYNAUT) { Speed(20); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_TRICK, target: playerLeft); } + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRICK, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + + // Turn 2 + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); // Now last because of Tricking Lagging Tail onto itself + } +} diff --git a/test/battle/hold_effect/leek.c b/test/battle/hold_effect/leek.c index 7ff6610279aa..025686485c91 100644 --- a/test/battle/hold_effect/leek.c +++ b/test/battle/hold_effect/leek.c @@ -20,10 +20,10 @@ SINGLE_BATTLE_TEST("Leek increases critical hit ratio by 2 stages for the Farfet } PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); - ASSUME(gSpeciesInfo[SPECIES_FARFETCHD].baseSpeed == 60); - ASSUME(gSpeciesInfo[SPECIES_FARFETCHD_GALAR].baseSpeed == 55); - ASSUME(gSpeciesInfo[SPECIES_SIRFETCHD].baseSpeed == 65); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); + ASSUME(GetSpeciesBaseSpeed(SPECIES_FARFETCHD) == 60); + ASSUME(GetSpeciesBaseSpeed(SPECIES_FARFETCHD_GALAR) == 55); + ASSUME(GetSpeciesBaseSpeed(SPECIES_SIRFETCHD) == 65); ASSUME(gItemsInfo[ITEM_LEEK].holdEffect == HOLD_EFFECT_LEEK); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species) { Item(ITEM_LEEK); } diff --git a/test/battle/hold_effect/life_orb.c b/test/battle/hold_effect/life_orb.c index 7f4fcc2ccfc0..39891ca53bde 100644 --- a/test/battle/hold_effect/life_orb.c +++ b/test/battle/hold_effect/life_orb.c @@ -1,6 +1,11 @@ #include "global.h" #include "test/battle.h" +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_LIFE_ORB].holdEffect == HOLD_EFFECT_LIFE_ORB); +} + SINGLE_BATTLE_TEST("Life Orb activates when users attack is succesful") { GIVEN { @@ -31,6 +36,24 @@ SINGLE_BATTLE_TEST("Life Orb activates if it hits a Substitute") } } +SINGLE_BATTLE_TEST("Life Orb does not activate if using status move on a Substitute") +{ + GIVEN { + ASSUME(MoveIgnoresSubstitute(MOVE_GROWL)); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LIFE_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_GROWL); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBSTITUTE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GROWL, player); + NONE_OF { + HP_BAR(player); + MESSAGE("Wobbuffet was hurt by the Life Orb!"); + } + } +} + SINGLE_BATTLE_TEST("Life Orb does not activate if using a status move") { GIVEN { @@ -64,3 +87,73 @@ SINGLE_BATTLE_TEST("Life Orb doesn't cause any HP loss if user is unable to atta } } } + +SINGLE_BATTLE_TEST("Life Orb does not activate if on a confusion hit") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LIFE_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_CONFUSE_RAY); MOVE(player, MOVE_POUND, WITH_RNG(RNG_CONFUSION, TRUE)); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, opponent); + HP_BAR(player); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, player); + HP_BAR(opponent); + HP_BAR(player); + MESSAGE("Wobbuffet was hurt by the Life Orb!"); + } + } +} + +SINGLE_BATTLE_TEST("Life Orb does not activate if move was absorbed by target") +{ + GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LIFE_ORB); } + OPPONENT(SPECIES_RAICHU) { Ability(ABILITY_LIGHTNING_ROD); } + } WHEN { + TURN { MOVE(player, MOVE_SHOCK_WAVE); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHOCK_WAVE, player); + HP_BAR(opponent); + HP_BAR(player); + MESSAGE("Wobbuffet was hurt by the Life Orb!"); + } + } +} + +SINGLE_BATTLE_TEST("Life Orb activates if move connected but no damage was dealt") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LIFE_ORB); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + } WHEN { + TURN { MOVE(player, MOVE_FALSE_SWIPE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FALSE_SWIPE, player); + HP_BAR(player); + MESSAGE("Wobbuffet was hurt by the Life Orb!"); + } +} + +SINGLE_BATTLE_TEST("Life Orb does not activate on a charge turn") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LIFE_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_FLY); } + TURN { SKIP_TURN(player); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLY, player); + NONE_OF { + HP_BAR(player); + MESSAGE("Wobbuffet was hurt by the Life Orb!"); + } + HP_BAR(opponent); + HP_BAR(player); // Lief Orb + } +} diff --git a/test/battle/hold_effect/light_ball.c b/test/battle/hold_effect/light_ball.c new file mode 100644 index 000000000000..c35dd75343df --- /dev/null +++ b/test/battle/hold_effect/light_ball.c @@ -0,0 +1,99 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetItemHoldEffect(ITEM_LIGHT_BALL) == HOLD_EFFECT_LIGHT_BALL); +} + +static const u32 speciesToCheck[] = { + SPECIES_PICHU, + SPECIES_PIKACHU, + SPECIES_PIKACHU_COSPLAY, + SPECIES_PIKACHU_ROCK_STAR, + SPECIES_PIKACHU_BELLE, + SPECIES_PIKACHU_POP_STAR, + SPECIES_PIKACHU_PHD, + SPECIES_PIKACHU_LIBRE, + SPECIES_PIKACHU_ORIGINAL, + SPECIES_PIKACHU_HOENN, + SPECIES_PIKACHU_SINNOH, + SPECIES_PIKACHU_UNOVA, + SPECIES_PIKACHU_KALOS, + SPECIES_PIKACHU_ALOLA, + SPECIES_PIKACHU_PARTNER, + SPECIES_PIKACHU_WORLD, + SPECIES_PIKACHU_GMAX, +}; + +SINGLE_BATTLE_TEST("Light Ball doubles Pikachu's Special Attack", s16 damage) +{ + u32 species = 0, item = 0; + + for (u32 j = 0; j < ARRAY_COUNT(speciesToCheck); j++) { + PARAMETRIZE { item = ITEM_NONE; species = speciesToCheck[j]; } + PARAMETRIZE { item = ITEM_LIGHT_BALL; species = speciesToCheck[j]; } + } + + GIVEN { + ASSUME(GetMoveCategory(MOVE_THUNDERSHOCK) == DAMAGE_CATEGORY_SPECIAL); + if (species == SPECIES_PIKACHU_GMAX) { + PLAYER(SPECIES_PIKACHU) { Item(item); GigantamaxFactor(TRUE); } + } else { + PLAYER(species) { Item(item); } + } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (species == SPECIES_PIKACHU_GMAX) { + TURN { MOVE(player, MOVE_THUNDERSHOCK, gimmick: GIMMICK_DYNAMAX); } + } else { + TURN { MOVE(player, MOVE_THUNDERSHOCK); } + } + } SCENE { + HP_BAR(opponent, captureDamage: &results[i].damage); + } THEN { + if (i == 1) { // First check to avoid boosting other species + EXPECT_EQ(results[i - 1].damage, results[i].damage); + } else if (i % 2 == 1) { // Every 2nd test afterwards + EXPECT_MUL_EQ(results[i - 1].damage, Q_4_12(2.0), results[i].damage); + } + } +} + +SINGLE_BATTLE_TEST("Light Ball doubles Pikachu's Attack (Gen4+)", s16 damage) +{ + u32 species = 0, item = 0, config = 0; + + for (u32 j = 0; j < ARRAY_COUNT(speciesToCheck); j++) { + PARAMETRIZE { item = ITEM_NONE; config = GEN_3; species = speciesToCheck[j]; } + PARAMETRIZE { item = ITEM_LIGHT_BALL; config = GEN_3; species = speciesToCheck[j]; } + PARAMETRIZE { item = ITEM_LIGHT_BALL; config = GEN_4; species = speciesToCheck[j]; } + } + + GIVEN { + WITH_CONFIG(CONFIG_LIGHT_BALL_ATTACK_BOOST, config); + ASSUME(GetMoveCategory(MOVE_SPARK) == DAMAGE_CATEGORY_PHYSICAL); + if (species == SPECIES_PIKACHU_GMAX) { + PLAYER(SPECIES_PIKACHU) { Item(item); GigantamaxFactor(TRUE); } + } else { + PLAYER(species) { Item(item); } + } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (species == SPECIES_PIKACHU_GMAX) { + TURN { MOVE(player, MOVE_SPARK, gimmick: GIMMICK_DYNAMAX); } + } else { + TURN { MOVE(player, MOVE_SPARK); } + } + } SCENE { + HP_BAR(opponent, captureDamage: &results[i].damage); + } THEN { + if (i == 2) { // First check to avoid boosting other species + EXPECT_EQ(results[i - 2].damage, results[i].damage); // No item vs Light Ball + EXPECT_EQ(results[i - 1].damage, results[i].damage); // Gen 3 vs Gen 4 + } else if (i % 3 == 2) { // Every 3rd test afterwards + EXPECT_MUL_EQ(results[i - 2].damage, Q_4_12(2.0), results[i].damage); // No item vs Light Ball + EXPECT_MUL_EQ(results[i - 1].damage, Q_4_12(2.0), results[i].damage); // Gen 3 vs Gen 4 + } + } +} diff --git a/test/battle/hold_effect/light_clay.c b/test/battle/hold_effect/light_clay.c new file mode 100644 index 000000000000..cb258ef88514 --- /dev/null +++ b/test/battle/hold_effect/light_clay.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Light Clay (Hold Effect) test titles") diff --git a/test/battle/hold_effect/loaded_dice.c b/test/battle/hold_effect/loaded_dice.c new file mode 100644 index 000000000000..f5c220818a8b --- /dev/null +++ b/test/battle/hold_effect/loaded_dice.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Loaded Dice (Hold Effect) test titles") diff --git a/test/battle/hold_effect/luck_punch.c b/test/battle/hold_effect/luck_punch.c deleted file mode 100644 index 02faaed6a83f..000000000000 --- a/test/battle/hold_effect/luck_punch.c +++ /dev/null @@ -1,25 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -SINGLE_BATTLE_TEST("Lucky Punch increases critical hit ratio by 2 stages for Chansey") -{ - u32 genConfig, passes, trials; - PARAMETRIZE { genConfig = GEN_1; passes = 25; trials = 32; } // ~78.1% with Chansey's base speed - for (u32 j = GEN_2; j <= GEN_5; j++) - PARAMETRIZE { genConfig = j; passes = 1; trials = 4; } // 25% - for (u32 j = GEN_6; j <= GEN_9; j++) - PARAMETRIZE { genConfig = j; passes = 1; trials = 2; } // 50% - PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); - GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); - ASSUME(gItemsInfo[ITEM_LUCKY_PUNCH].holdEffect == HOLD_EFFECT_LUCKY_PUNCH); - ASSUME(gSpeciesInfo[SPECIES_CHANSEY].baseSpeed == 50); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_CHANSEY) { Item(ITEM_LUCKY_PUNCH); } - } WHEN { - TURN { MOVE(opponent, MOVE_SCRATCH); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); - MESSAGE("A critical hit!"); - } -} diff --git a/test/battle/hold_effect/lucky_egg.c b/test/battle/hold_effect/lucky_egg.c new file mode 100644 index 000000000000..3016adeb4383 --- /dev/null +++ b/test/battle/hold_effect/lucky_egg.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Lucky Egg (Hold Effect) test titles") diff --git a/test/battle/hold_effect/lucky_punch.c b/test/battle/hold_effect/lucky_punch.c new file mode 100644 index 000000000000..bbc379d9772e --- /dev/null +++ b/test/battle/hold_effect/lucky_punch.c @@ -0,0 +1,25 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Lucky Punch increases critical hit ratio by 2 stages for Chansey") +{ + u32 genConfig, passes, trials; + PARAMETRIZE { genConfig = GEN_1; passes = 25; trials = 32; } // ~78.1% with Chansey's base speed + for (u32 j = GEN_2; j <= GEN_5; j++) + PARAMETRIZE { genConfig = j; passes = 1; trials = 4; } // 25% + for (u32 j = GEN_6; j <= GEN_9; j++) + PARAMETRIZE { genConfig = j; passes = 1; trials = 2; } // 50% + PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); + GIVEN { + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); + ASSUME(gItemsInfo[ITEM_LUCKY_PUNCH].holdEffect == HOLD_EFFECT_LUCKY_PUNCH); + ASSUME(GetSpeciesBaseSpeed(SPECIES_CHANSEY) == 50); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_CHANSEY) { Item(ITEM_LUCKY_PUNCH); } + } WHEN { + TURN { MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + MESSAGE("A critical hit!"); + } +} diff --git a/test/battle/hold_effect/luminous_moss.c b/test/battle/hold_effect/luminous_moss.c new file mode 100644 index 000000000000..c49bf04e0391 --- /dev/null +++ b/test/battle/hold_effect/luminous_moss.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Luminous Moss (Hold Effect) test titles") diff --git a/test/battle/hold_effect/lustrous_orb.c b/test/battle/hold_effect/lustrous_orb.c new file mode 100644 index 000000000000..e8bcdf3f3118 --- /dev/null +++ b/test/battle/hold_effect/lustrous_orb.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Lustrous Orb (Hold Effect) test titles") diff --git a/test/battle/hold_effect/macho_brace.c b/test/battle/hold_effect/macho_brace.c new file mode 100644 index 000000000000..2186a41f783a --- /dev/null +++ b/test/battle/hold_effect/macho_brace.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Macho Brace (Hold Effect) test titles") diff --git a/test/battle/hold_effect/maranga_berry.c b/test/battle/hold_effect/maranga_berry.c index 22b72ba201ff..785e040ca4c0 100644 --- a/test/battle/hold_effect/maranga_berry.c +++ b/test/battle/hold_effect/maranga_berry.c @@ -89,3 +89,19 @@ DOUBLE_BATTLE_TEST("Maranga Berry doesn't trigger if partner was hit") EXPECT(opponentRight->item == ITEM_MARANGA_BERRY); } } + +SINGLE_BATTLE_TEST("Maranga Berry doesn't trigger if the move was boosted by Sheer Force") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_MARANGA_BERRY); } + OPPONENT(SPECIES_NIDOKING) { Ability(ABILITY_SHEER_FORCE); } + } WHEN { + TURN { MOVE(opponent, MOVE_FIRE_PUNCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PUNCH, opponent); + HP_BAR(player); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE); + } +} diff --git a/test/battle/hold_effect/mega_stone.c b/test/battle/hold_effect/mega_stone.c new file mode 100644 index 000000000000..a1100ed8ea38 --- /dev/null +++ b/test/battle/hold_effect/mega_stone.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Mega Stone (Hold Effect) test titles") diff --git a/test/battle/hold_effect/memory.c b/test/battle/hold_effect/memory.c new file mode 100644 index 000000000000..290f534e4a58 --- /dev/null +++ b/test/battle/hold_effect/memory.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Memories (Hold Effect) test titles") diff --git a/test/battle/hold_effect/mental_herb.c b/test/battle/hold_effect/mental_herb.c new file mode 100644 index 000000000000..7eeaba2ff7f5 --- /dev/null +++ b/test/battle/hold_effect/mental_herb.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Mental Herb (Hold Effect) test titles") diff --git a/test/battle/hold_effect/metal_powder.c b/test/battle/hold_effect/metal_powder.c new file mode 100644 index 000000000000..2f716541a2a0 --- /dev/null +++ b/test/battle/hold_effect/metal_powder.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Metal Powder (Hold Effect) test titles") diff --git a/test/battle/hold_effect/micle_berry.c b/test/battle/hold_effect/micle_berry.c index 47e0b8e53baf..24d3ef1cd61f 100644 --- a/test/battle/hold_effect/micle_berry.c +++ b/test/battle/hold_effect/micle_berry.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_MICLE_BERRY].holdEffect == HOLD_EFFECT_MICLE_BERRY); - ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); } SINGLE_BATTLE_TEST("Micle Berry raises the holder's accuracy by 1.2 when HP drops to 1/4 or below") diff --git a/test/battle/hold_effect/muscle_band.c b/test/battle/hold_effect/muscle_band.c new file mode 100644 index 000000000000..7bac7c9c879e --- /dev/null +++ b/test/battle/hold_effect/muscle_band.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Muscle Band (Hold Effect) test titles") diff --git a/test/battle/hold_effect/plate.c b/test/battle/hold_effect/plate.c new file mode 100644 index 000000000000..92573659c7a7 --- /dev/null +++ b/test/battle/hold_effect/plate.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Plates (Hold Effect) test titles") diff --git a/test/battle/hold_effect/power_herb.c b/test/battle/hold_effect/power_herb.c new file mode 100644 index 000000000000..c74585178154 --- /dev/null +++ b/test/battle/hold_effect/power_herb.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Power Herb (Hold Effect) test titles") diff --git a/test/battle/hold_effect/power_item.c b/test/battle/hold_effect/power_item.c new file mode 100644 index 000000000000..240d09a67f63 --- /dev/null +++ b/test/battle/hold_effect/power_item.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Power Items (Hold Effect) test titles") diff --git a/test/battle/hold_effect/prevent_evolve.c b/test/battle/hold_effect/prevent_evolve.c new file mode 100644 index 000000000000..1043454368aa --- /dev/null +++ b/test/battle/hold_effect/prevent_evolve.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Everstone (Hold Effect) test titles") diff --git a/test/battle/hold_effect/primal_orb.c b/test/battle/hold_effect/primal_orb.c new file mode 100644 index 000000000000..42955a736568 --- /dev/null +++ b/test/battle/hold_effect/primal_orb.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Red/Blue Orb (Hold Effect) test titles") diff --git a/test/battle/hold_effect/protective_pads.c b/test/battle/hold_effect/protective_pads.c index e04f30ac9b6f..6f8d068d06be 100644 --- a/test/battle/hold_effect/protective_pads.c +++ b/test/battle/hold_effect/protective_pads.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Protective Pads protected moves still make direct contact", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_KLUTZ; } PARAMETRIZE { ability = ABILITY_FLUFFY; } GIVEN { diff --git a/test/battle/hold_effect/punching_glove.c b/test/battle/hold_effect/punching_glove.c new file mode 100644 index 000000000000..d8e05a991367 --- /dev/null +++ b/test/battle/hold_effect/punching_glove.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Punching Glove (Hold Effect) test titles") diff --git a/test/battle/hold_effect/quick_powder.c b/test/battle/hold_effect/quick_powder.c new file mode 100644 index 000000000000..7e2968784382 --- /dev/null +++ b/test/battle/hold_effect/quick_powder.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Quick Powder (Hold Effect) test titles") diff --git a/test/battle/hold_effect/red_card.c b/test/battle/hold_effect/red_card.c index f71ba513301c..6b5e08c450a4 100644 --- a/test/battle/hold_effect/red_card.c +++ b/test/battle/hold_effect/red_card.c @@ -170,7 +170,7 @@ SINGLE_BATTLE_TEST("Red Card does not activate if stolen by a move") bool32 activate; PARAMETRIZE { item = ITEM_NONE; activate = FALSE; } PARAMETRIZE { item = ITEM_POTION; activate = TRUE; } - ASSUME(MoveHasAdditionalEffect(MOVE_THIEF, MOVE_EFFECT_STEAL_ITEM) == TRUE); + ASSUME(GetMoveEffect(MOVE_THIEF) == EFFECT_STEAL_ITEM); GIVEN { PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_RED_CARD); } @@ -455,7 +455,7 @@ SINGLE_BATTLE_TEST("Red Card does not cause the dragged out mon to lose hp due t ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); MESSAGE("The opposing Wobbuffet held up its Red Card against Wobbuffet!"); MESSAGE("Wynaut was dragged out!"); - NOT MESSAGE("Wynaut was hurt by its Life Orb!"); + NOT HP_BAR(player); } } diff --git a/test/battle/hold_effect/repel.c b/test/battle/hold_effect/repel.c new file mode 100644 index 000000000000..adfca5c483f5 --- /dev/null +++ b/test/battle/hold_effect/repel.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Cleanse Tag (Hold Effect) test titles") diff --git a/test/battle/hold_effect/resist_berry.c b/test/battle/hold_effect/resist_berry.c new file mode 100644 index 000000000000..b13ca356657d --- /dev/null +++ b/test/battle/hold_effect/resist_berry.c @@ -0,0 +1,145 @@ +#include "global.h" +#include "test/battle.h" + +static const u16 sMoveItemTable[][4] = +{ + { TYPE_NORMAL, MOVE_SCRATCH, ITEM_CHILAN_BERRY, SPECIES_WOBBUFFET }, + { TYPE_FIGHTING, MOVE_KARATE_CHOP, ITEM_CHOPLE_BERRY, SPECIES_RAMPARDOS }, + { TYPE_FLYING, MOVE_WING_ATTACK, ITEM_COBA_BERRY, SPECIES_HARIYAMA }, + { TYPE_POISON, MOVE_POISON_STING, ITEM_KEBIA_BERRY, SPECIES_GOGOAT }, + { TYPE_GROUND, MOVE_MUD_SHOT, ITEM_SHUCA_BERRY, SPECIES_RAMPARDOS }, + { TYPE_ROCK, MOVE_ROCK_THROW, ITEM_CHARTI_BERRY, SPECIES_CORVISQUIRE }, + { TYPE_BUG, MOVE_BUG_BITE, ITEM_TANGA_BERRY, SPECIES_WOBBUFFET }, + { TYPE_GHOST, MOVE_SHADOW_PUNCH, ITEM_KASIB_BERRY, SPECIES_WOBBUFFET }, + { TYPE_STEEL, MOVE_METAL_CLAW, ITEM_BABIRI_BERRY, SPECIES_RAMPARDOS }, + { TYPE_FIRE, MOVE_EMBER, ITEM_OCCA_BERRY, SPECIES_GOGOAT }, + { TYPE_WATER, MOVE_WATER_GUN, ITEM_PASSHO_BERRY, SPECIES_RAMPARDOS }, + { TYPE_GRASS, MOVE_VINE_WHIP, ITEM_RINDO_BERRY, SPECIES_RAMPARDOS }, + { TYPE_ELECTRIC, MOVE_THUNDER_SHOCK, ITEM_WACAN_BERRY, SPECIES_CORVISQUIRE }, + { TYPE_PSYCHIC, MOVE_CONFUSION, ITEM_PAYAPA_BERRY, SPECIES_HARIYAMA }, + { TYPE_ICE, MOVE_AURORA_BEAM, ITEM_YACHE_BERRY, SPECIES_DRAGONAIR }, + { TYPE_DRAGON, MOVE_DRAGON_BREATH, ITEM_HABAN_BERRY, SPECIES_DRAGONAIR }, + { TYPE_DARK, MOVE_BITE, ITEM_COLBUR_BERRY, SPECIES_WOBBUFFET }, + { TYPE_FAIRY, MOVE_DISARMING_VOICE, ITEM_ROSELI_BERRY, SPECIES_DRAGONAIR }, +}; + +SINGLE_BATTLE_TEST("Weakness berries decrease the base power of moves by half", s16 damage) +{ + u32 move = 0, item = 0, defender = 0; + enum Type type = TYPE_NONE; + + for (u32 j = 0; j < ARRAY_COUNT(sMoveItemTable); j++) + { + PARAMETRIZE { type = sMoveItemTable[j][0]; move = sMoveItemTable[j][1]; defender = sMoveItemTable[j][3]; item = ITEM_NONE; } + PARAMETRIZE { type = sMoveItemTable[j][0]; move = sMoveItemTable[j][1]; defender = sMoveItemTable[j][3]; item = sMoveItemTable[j][2]; } + } + + GIVEN { + ASSUME(GetMovePower(move) > 0); + ASSUME(GetMoveType(move) == type); + ASSUME(GetSpeciesType(defender, 0) == GetSpeciesType(defender, 1)); + if (type != TYPE_NORMAL) { + ASSUME(gTypeEffectivenessTable[type][GetSpeciesType(defender, 0)] > UQ_4_12(1.0)); + } + if (item != ITEM_NONE) { + ASSUME(GetItemHoldEffect(item) == HOLD_EFFECT_RESIST_BERRY); + ASSUME(GetItemHoldEffectParam(item) == type); + } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(defender) { Item(item); } + } WHEN { + TURN { MOVE(player, move); } + } SCENE { + if (1 == i % 2) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + } + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + for (u32 j = 0; j < ARRAY_COUNT(sMoveItemTable); j++) { + EXPECT_MUL_EQ(results[j*2].damage, Q_4_12(0.5), results[(j*2)+1].damage); + } + } +} + +SINGLE_BATTLE_TEST("Weakness berries do not activate unless a move is super effective", s16 damage) +{ + u32 move = 0, item = 0, defender = 0; + enum Type type = TYPE_NONE; + + for (u32 j = 0; j < ARRAY_COUNT(sMoveItemTable); j++) + { + if (TYPE_NORMAL == type) + { + // ITEM_CHILAN_BERRY activates without a weakness + } + else if (TYPE_FAIRY == type) + { + PARAMETRIZE { type = sMoveItemTable[j][0]; move = sMoveItemTable[j][1]; item = sMoveItemTable[j][2]; defender = SPECIES_WOBBUFFET; } + } + else + { + PARAMETRIZE { type = sMoveItemTable[j][0]; move = sMoveItemTable[j][1]; item = sMoveItemTable[j][2]; defender = SPECIES_SABLEYE; } + } + } + + GIVEN { + ASSUME(GetMovePower(move) > 0); + ASSUME(uq4_12_multiply(gTypeEffectivenessTable[type][GetSpeciesType(defender, 0)], + gTypeEffectivenessTable[type][GetSpeciesType(defender, 1)]) <= UQ_4_12(1.0)); + ASSUME(GetItemHoldEffect(item) == HOLD_EFFECT_RESIST_BERRY); + ASSUME(GetItemHoldEffectParam(item) == type); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(defender) { Item(item); } + } WHEN { + TURN { MOVE(player, move); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + } +} + +SINGLE_BATTLE_TEST("Weakness berries do not decrease the power of Struggle", s16 damage) +{ + u32 item = 0; + + PARAMETRIZE { item = ITEM_NONE; } + PARAMETRIZE { item = ITEM_CHILAN_BERRY; } + + GIVEN { + if (item != ITEM_NONE) { + ASSUME(GetItemHoldEffect(item) == HOLD_EFFECT_RESIST_BERRY); + ASSUME(GetItemHoldEffectParam(item) == TYPE_NORMAL); + } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(item); } + } WHEN { + TURN { MOVE(player, MOVE_STRUGGLE); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + MESSAGE("The Chilan Berry weakened the damage to the opposing Wobbuffet!"); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_STRUGGLE, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} + +SINGLE_BATTLE_TEST("Weakness berries do not activate if Disguise blocks the damage") +{ + GIVEN { + ASSUME(GetItemHoldEffect(ITEM_BABIRI_BERRY) == HOLD_EFFECT_RESIST_BERRY); + ASSUME(GetItemHoldEffectParam(ITEM_BABIRI_BERRY) == TYPE_STEEL); + ASSUME(GetMoveType(MOVE_METAL_CLAW) == TYPE_STEEL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_MIMIKYU) { Item(ITEM_BABIRI_BERRY); Ability(ABILITY_DISGUISE); } + } WHEN { + TURN { MOVE(player, MOVE_METAL_CLAW); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + MESSAGE("The Babiri Berry weakened the damage to the opposing Mimikyu!"); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_METAL_CLAW, player); + } +} diff --git a/test/battle/hold_effect/restore_hp.c b/test/battle/hold_effect/restore_hp.c index 9db149c02364..ef96ead7e4b1 100644 --- a/test/battle/hold_effect/restore_hp.c +++ b/test/battle/hold_effect/restore_hp.c @@ -63,20 +63,3 @@ DOUBLE_BATTLE_TEST("Restore HP Item effects do not miss timing after a recoil mo ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); } } - -#if B_HP_BERRIES <= GEN_3 -SINGLE_BATTLE_TEST("Restore HP Berry triggers only during the end turn") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WYNAUT) { MaxHP(100); HP(51); Item(ITEM_ORAN_BERRY); } - } WHEN { - TURN { MOVE(player, MOVE_TACKLE); } - TURN {} - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); - ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); - } -} -#endif diff --git a/test/battle/hold_effect/restore_pct_hp.c b/test/battle/hold_effect/restore_pct_hp.c new file mode 100644 index 000000000000..ac0db5938092 --- /dev/null +++ b/test/battle/hold_effect/restore_pct_hp.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + + // Tests for Sitrus Berry are handled in test/battle/hold_effect/restore_hp.c diff --git a/test/battle/hold_effect/restore_pp.c b/test/battle/hold_effect/restore_pp.c new file mode 100644 index 000000000000..c3810652a46d --- /dev/null +++ b/test/battle/hold_effect/restore_pp.c @@ -0,0 +1,23 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_LEPPA_BERRY].holdEffect == HOLD_EFFECT_RESTORE_PP); +} + +SINGLE_BATTLE_TEST("Restore PP berry activates immediately on switch in") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LEPPA_BERRY); MovesWithPP({MOVE_SCRATCH, 0}, {MOVE_CELEBRATE, 20}); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponent, MOVE_POUND); MOVE(player, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + } THEN { + EXPECT(player->item == ITEM_NONE); + } +} diff --git a/test/battle/hold_effect/restore_stats.c b/test/battle/hold_effect/restore_stats.c deleted file mode 100644 index 7f48a05f135c..000000000000 --- a/test/battle/hold_effect/restore_stats.c +++ /dev/null @@ -1,237 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(gItemsInfo[ITEM_WHITE_HERB].holdEffect == HOLD_EFFECT_WHITE_HERB); -} - -SINGLE_BATTLE_TEST("White Herb restores stats when they're lowered") -{ - GIVEN { - ASSUME(GetMoveEffect(MOVE_LEER) == EFFECT_DEFENSE_DOWN); - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_WHITE_HERB); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, MOVE_LEER); } - } SCENE { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("Wobbuffet returned its stats to normal using its White Herb!"); - } THEN { - EXPECT(player->item == ITEM_NONE); - EXPECT(player->statStages[STAT_DEF] = DEFAULT_STAT_STAGE); - } -} - -SINGLE_BATTLE_TEST("White Herb restores stats after Attack was lowered by Intimidate in singles") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_WHITE_HERB); } - OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } - } WHEN { - TURN { ; } - } SCENE { - ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("Wobbuffet returned its stats to normal using its White Herb!"); - } THEN { - EXPECT(player->item == ITEM_NONE); - EXPECT(player->statStages[STAT_DEF] = DEFAULT_STAT_STAGE); - } -} - -DOUBLE_BATTLE_TEST("White Herb restores stats after Attack was lowered by Intimidate in doubles") -{ - GIVEN { - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_WHITE_HERB); } - OPPONENT(SPECIES_WYNAUT) { Item(ITEM_WHITE_HERB); } - PLAYER(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } - PLAYER(SPECIES_WOBBUFFET); - } WHEN { - TURN { ; } - } SCENE { - ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); - - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentLeft); - MESSAGE("The opposing Wobbuffet returned its stats to normal using its White Herb!"); - - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight); - MESSAGE("The opposing Wynaut returned its stats to normal using its White Herb!"); - } THEN { - EXPECT(opponentLeft->item == ITEM_NONE); - EXPECT(opponentLeft->statStages[STAT_DEF] = DEFAULT_STAT_STAGE); - EXPECT(opponentRight->item == ITEM_NONE); - EXPECT(opponentRight->statStages[STAT_DEF] = DEFAULT_STAT_STAGE); - } -} - -SINGLE_BATTLE_TEST("White Herb restores stats after Attack was lowered by Intimidate while switching in") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_WHITE_HERB); } - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } - } WHEN { - TURN { SWITCH(opponent, 1); MOVE(player, MOVE_CLOSE_COMBAT); } - } SCENE { - ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("Wobbuffet returned its stats to normal using its White Herb!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_CLOSE_COMBAT, player); - NONE_OF { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("Wobbuffet returned its stats to normal using its White Herb!"); - } - } THEN { - EXPECT(player->item == ITEM_NONE); - EXPECT(player->statStages[STAT_DEF] = DEFAULT_STAT_STAGE - 1); - EXPECT(player->statStages[STAT_SPDEF] = DEFAULT_STAT_STAGE - 1); - } -} - -SINGLE_BATTLE_TEST("White Herb restores stats after all hits of a multi hit move happened") -{ - u16 species; - u16 ability; - - PARAMETRIZE { species = SPECIES_SLIGGOO_HISUI; ability = ABILITY_GOOEY; } - PARAMETRIZE { species = SPECIES_DUGTRIO_ALOLA; ability = ABILITY_TANGLING_HAIR; } - - GIVEN { - ASSUME(GetMoveStrikeCount(MOVE_DUAL_WINGBEAT) == 2); - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_WHITE_HERB); } - OPPONENT(species) { Ability(ability); } - } WHEN { - TURN { MOVE(player, MOVE_DUAL_WINGBEAT); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_DUAL_WINGBEAT, player); - ABILITY_POPUP(opponent, ability); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Wobbuffet's Speed fell!"); - ABILITY_POPUP(opponent, ability); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Wobbuffet's Speed fell!"); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("Wobbuffet returned its stats to normal using its White Herb!"); - } THEN { - EXPECT(player->item == ITEM_NONE); - EXPECT(player->statStages[STAT_SPEED] = DEFAULT_STAT_STAGE); - } -} - -SINGLE_BATTLE_TEST("White Herb wont have time to activate if it is knocked off or stolen by Thief") -{ - u16 move; - - PARAMETRIZE { move = MOVE_THIEF; } - PARAMETRIZE { move = MOVE_KNOCK_OFF; } - - GIVEN { - ASSUME(MoveHasAdditionalEffect(MOVE_THIEF, MOVE_EFFECT_STEAL_ITEM) == TRUE); - ASSUME(GetMoveEffect(MOVE_KNOCK_OFF) == EFFECT_KNOCK_OFF); - PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); Item(ITEM_WHITE_HERB); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, move); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, move, opponent); - if (move == MOVE_THIEF) { - MESSAGE("The opposing Wobbuffet stole Slugma's White Herb!"); - } - ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Slugma's Weak Armor lowered its Defense!"); - MESSAGE("Slugma's Weak Armor raised its Speed!"); - if (move == MOVE_KNOCK_OFF) { - MESSAGE("The opposing Wobbuffet knocked off Slugma's White Herb!"); - } - NONE_OF { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("Wobbuffet returned its stats to normal using its White Herb!"); - } - } THEN { - EXPECT(player->statStages[STAT_DEF] = DEFAULT_STAT_STAGE - 1); - EXPECT(player->statStages[STAT_SPEED] = DEFAULT_STAT_STAGE + 1); - } -} - -SINGLE_BATTLE_TEST("White Herb wont have time to activate if Magician steals it") -{ - GIVEN { - PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); Item(ITEM_WHITE_HERB); } - OPPONENT(SPECIES_FENNEKIN) { Ability(ABILITY_MAGICIAN); } - } WHEN { - TURN { MOVE(opponent, MOVE_SCRATCH); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); - ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Slugma's Weak Armor lowered its Defense!"); - MESSAGE("Slugma's Weak Armor raised its Speed!"); - ABILITY_POPUP(opponent, ABILITY_MAGICIAN); - MESSAGE("The opposing Fennekin stole Slugma's White Herb!"); - NONE_OF { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("Wobbuffet returned its stats to normal using its White Herb!"); - } - } THEN { - EXPECT(player->statStages[STAT_DEF] = DEFAULT_STAT_STAGE - 1); - EXPECT(player->statStages[STAT_SPEED] = DEFAULT_STAT_STAGE + 1); - } -} - -SINGLE_BATTLE_TEST("White Herb has correct interactions with Intimidate triggered Defiant and Competitive") -{ - u16 species; - u16 ability; - - PARAMETRIZE { species = SPECIES_IGGLYBUFF; ability = ABILITY_COMPETITIVE; } - PARAMETRIZE { species = SPECIES_MANKEY; ability = ABILITY_DEFIANT; } - - GIVEN { - PLAYER(species) { Ability(ability); Item(ITEM_WHITE_HERB); } - OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } - } WHEN { - TURN { ; } - } SCENE { - ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); - ABILITY_POPUP(player, ability); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - // Defiant activates first, so White Herb doesn't have a chance to trigger. - if (ability == ABILITY_COMPETITIVE) { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("Igglybuff returned its stats to normal using its White Herb!"); - } - } THEN { - if (ability == ABILITY_COMPETITIVE) { - EXPECT(player->item == ITEM_NONE); - EXPECT(player->statStages[STAT_ATK] = DEFAULT_STAT_STAGE); - EXPECT(player->statStages[STAT_SPATK] = DEFAULT_STAT_STAGE + 2); - } else { - EXPECT(player->statStages[STAT_ATK] = DEFAULT_STAT_STAGE + 1); - } - } -} - -DOUBLE_BATTLE_TEST("White Herb is correctly displayed") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WYNAUT) { Item(ITEM_WHITE_HERB); } - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WYNAUT); - } WHEN { - TURN { MOVE(playerRight, MOVE_SUPERPOWER, target: opponentRight); } - } SCENE { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerRight); - MESSAGE("Wynaut returned its stats to normal using its White Herb!"); - } THEN { - EXPECT(playerLeft->item == ITEM_NONE); - EXPECT(playerLeft->statStages[STAT_DEF] = DEFAULT_STAT_STAGE); - } -} diff --git a/test/battle/hold_effect/ring_target.c b/test/battle/hold_effect/ring_target.c new file mode 100644 index 000000000000..1074bb0dc7a4 --- /dev/null +++ b/test/battle/hold_effect/ring_target.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Ring Target (Hold Effect) test titles") diff --git a/test/battle/hold_effect/rocky_helmet.c b/test/battle/hold_effect/rocky_helmet.c new file mode 100644 index 000000000000..bc52f44b87fc --- /dev/null +++ b/test/battle/hold_effect/rocky_helmet.c @@ -0,0 +1,25 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetItemHoldEffect(ITEM_ROCKY_HELMET) == HOLD_EFFECT_ROCKY_HELMET); + ASSUME(MoveMakesContact(MOVE_SCRATCH)); + ASSUME(MoveMakesContact(MOVE_SHADOW_SNEAK)); +} + +SINGLE_BATTLE_TEST("Rocky Helmet damages attacker even if damage is blocked by Disguise") +{ + GIVEN { + PLAYER(SPECIES_MIMIKYU) { Item(ITEM_ROCKY_HELMET); Ability(ABILITY_DISGUISE); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SHADOW_SNEAK); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHADOW_SNEAK, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + HP_BAR(opponent); + } +} + +TO_DO_BATTLE_TEST("TODO: Write Rocky Helmet (Hold Effect) test titles") diff --git a/test/battle/hold_effect/safety_goggles.c b/test/battle/hold_effect/safety_goggles.c index e2d329bcf603..ec90b251b3a8 100644 --- a/test/battle/hold_effect/safety_goggles.c +++ b/test/battle/hold_effect/safety_goggles.c @@ -44,4 +44,34 @@ SINGLE_BATTLE_TEST("Safety Goggles blocks damage from Sandstorm") } } -TO_DO_BATTLE_TEST("Safety Goggles blocks Effect Spore's effect"); +SINGLE_BATTLE_TEST("Safety Goggles blocks Effect Spore's effect") +{ + KNOWN_FAILING; + PASSES_RANDOMLY(100, 100, RNG_EFFECT_SPORE); + GIVEN { + WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_5); // Setting it to Gen 6 causes it to pass + ASSUME(MoveMakesContact(MOVE_SCRATCH)); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SAFETY_GOGGLES); } + OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_EFFECT_SPORE); + + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, player); + MESSAGE("Wobbuffet was poisoned by the opposing Breloom's Effect Spore!"); + STATUS_ICON(player, poison: TRUE); + + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, player); + MESSAGE("The opposing Breloom's Effect Spore paralyzed Wobbuffet, so it may be unable to move!"); + STATUS_ICON(player, paralysis: TRUE); + + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); + MESSAGE("The opposing Breloom's Effect Spore made Wobbuffet sleep!"); + STATUS_ICON(player, sleep: TRUE); + } + } +} diff --git a/test/battle/hold_effect/scope_lens.c b/test/battle/hold_effect/scope_lens.c index f5b616ecea6a..2a073900a758 100644 --- a/test/battle/hold_effect/scope_lens.c +++ b/test/battle/hold_effect/scope_lens.c @@ -9,9 +9,9 @@ SINGLE_BATTLE_TEST("Scope Lens increases the critical hit ratio by 1 stage") PARAMETRIZE { genConfig = j; passes = 1; trials = 8; } // 12.5% PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); ASSUME(gItemsInfo[ITEM_SCOPE_LENS].holdEffect == HOLD_EFFECT_SCOPE_LENS); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseSpeed == 33); + ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SCOPE_LENS); }; OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/hold_effect/seeds.c b/test/battle/hold_effect/seeds.c deleted file mode 100644 index 35b89c00858c..000000000000 --- a/test/battle/hold_effect/seeds.c +++ /dev/null @@ -1,197 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(gItemsInfo[ITEM_ELECTRIC_SEED].holdEffect == HOLD_EFFECT_SEEDS); - ASSUME(gItemsInfo[ITEM_ELECTRIC_SEED].holdEffectParam == HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN); - ASSUME(gItemsInfo[ITEM_GRASSY_SEED].holdEffect == HOLD_EFFECT_SEEDS); - ASSUME(gItemsInfo[ITEM_GRASSY_SEED].holdEffectParam == HOLD_EFFECT_PARAM_GRASSY_TERRAIN); - ASSUME(gItemsInfo[ITEM_MISTY_SEED].holdEffect == HOLD_EFFECT_SEEDS); - ASSUME(gItemsInfo[ITEM_MISTY_SEED].holdEffectParam == HOLD_EFFECT_PARAM_MISTY_TERRAIN); - ASSUME(gItemsInfo[ITEM_PSYCHIC_SEED].holdEffect == HOLD_EFFECT_SEEDS); - ASSUME(gItemsInfo[ITEM_PSYCHIC_SEED].holdEffectParam == HOLD_EFFECT_PARAM_PSYCHIC_TERRAIN); - -} - -SINGLE_BATTLE_TEST("Electric Seed raises the holder's Defense on Electric Terrain") -{ - u32 ability, item; - PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_NONE; } - PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_ELECTRIC_SEED; } - PARAMETRIZE { ability = ABILITY_ELECTRIC_SURGE; item = ITEM_NONE; } - PARAMETRIZE { ability = ABILITY_ELECTRIC_SURGE; item = ITEM_ELECTRIC_SEED; } - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_ELECTRIC_SEED); } - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_ELECTRIC_SEED); } - OPPONENT(SPECIES_TAPU_KOKO) { Ability(ability); Item(item); } - } WHEN { - if (ability == ABILITY_TELEPATHY) - TURN { MOVE(player, MOVE_ELECTRIC_TERRAIN); } - TURN { SWITCH(player, 1); } - } SCENE { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Using Electric Seed, the Defense of Wobbuffet rose!"); - if (item == ITEM_ELECTRIC_SEED) { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); - MESSAGE("Using Electric Seed, the Defense of the opposing Tapu Koko rose!"); - } - SWITCH_OUT_MESSAGE("Wobbuffet"); - SEND_IN_MESSAGE("Wobbuffet"); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Using Electric Seed, the Defense of Wobbuffet rose!"); - } THEN { - EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); - } -} - -SINGLE_BATTLE_TEST("Grassy Seed raises the holder's Defense on Grassy Terrain") -{ - u32 ability, item; - PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_NONE; } - PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_GRASSY_SEED; } - PARAMETRIZE { ability = ABILITY_GRASSY_SURGE; item = ITEM_NONE; } - PARAMETRIZE { ability = ABILITY_GRASSY_SURGE; item = ITEM_GRASSY_SEED; } - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_GRASSY_SEED); } - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_GRASSY_SEED); } - OPPONENT(SPECIES_TAPU_BULU) { Ability(ability); Item(item); } - } WHEN { - if (ability == ABILITY_TELEPATHY) - TURN { MOVE(player, MOVE_GRASSY_TERRAIN); } - TURN { SWITCH(player, 1); } - } SCENE { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Using Grassy Seed, the Defense of Wobbuffet rose!"); - if (item == ITEM_GRASSY_SEED) { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); - MESSAGE("Using Grassy Seed, the Defense of the opposing Tapu Bulu rose!"); - } - SWITCH_OUT_MESSAGE("Wobbuffet"); - SEND_IN_MESSAGE("Wobbuffet"); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Using Grassy Seed, the Defense of Wobbuffet rose!"); - } THEN { - EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); - } -} - -SINGLE_BATTLE_TEST("Misty Seed raises the holder's Sp. Defense on Misty Terrain") -{ - u32 ability, item; - PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_NONE; } - PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_MISTY_SEED; } - PARAMETRIZE { ability = ABILITY_MISTY_SURGE; item = ITEM_NONE; } - PARAMETRIZE { ability = ABILITY_MISTY_SURGE; item = ITEM_MISTY_SEED; } - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_MISTY_SEED); } - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_MISTY_SEED); } - OPPONENT(SPECIES_TAPU_FINI) { Ability(ability); Item(item); } - } WHEN { - if (ability == ABILITY_TELEPATHY) - TURN { MOVE(player, MOVE_MISTY_TERRAIN); } - TURN { SWITCH(player, 1); } - } SCENE { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Using Misty Seed, the Sp. Def of Wobbuffet rose!"); - if (item == ITEM_MISTY_SEED) { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); - MESSAGE("Using Misty Seed, the Sp. Def of the opposing Tapu Fini rose!"); - } - SWITCH_OUT_MESSAGE("Wobbuffet"); - SEND_IN_MESSAGE("Wobbuffet"); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Using Misty Seed, the Sp. Def of Wobbuffet rose!"); - } THEN { - EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE + 1); - } -} - -SINGLE_BATTLE_TEST("Psychic Seed raises the holder's Sp. Defense on Psychic Terrain") -{ - u32 ability, item; - PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_NONE; } - PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_PSYCHIC_SEED; } - PARAMETRIZE { ability = ABILITY_PSYCHIC_SURGE; item = ITEM_NONE; } - PARAMETRIZE { ability = ABILITY_PSYCHIC_SURGE; item = ITEM_PSYCHIC_SEED; } - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_PSYCHIC_SEED); } - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_PSYCHIC_SEED); } - OPPONENT(SPECIES_TAPU_LELE) { Ability(ability); Item(item); } - } WHEN { - if (ability == ABILITY_TELEPATHY) - TURN { MOVE(player, MOVE_PSYCHIC_TERRAIN); } - TURN { SWITCH(player, 1); } - } SCENE { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Using Psychic Seed, the Sp. Def of Wobbuffet rose!"); - if (item == ITEM_PSYCHIC_SEED) { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); - MESSAGE("Using Psychic Seed, the Sp. Def of the opposing Tapu Lele rose!"); - } - SWITCH_OUT_MESSAGE("Wobbuffet"); - SEND_IN_MESSAGE("Wobbuffet"); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Using Psychic Seed, the Sp. Def of Wobbuffet rose!"); - } THEN { - EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE + 1); - } -} - -SINGLE_BATTLE_TEST("Seeds get consumed in Terrain even if holder is not affected by Terrain") -{ - u32 species, ability, item; - PARAMETRIZE { species = SPECIES_TAPU_KOKO; ability = ABILITY_ELECTRIC_SURGE; item = ITEM_ELECTRIC_SEED; } - PARAMETRIZE { species = SPECIES_TAPU_BULU; ability = ABILITY_GRASSY_SURGE; item = ITEM_GRASSY_SEED; } - PARAMETRIZE { species = SPECIES_TAPU_FINI; ability = ABILITY_MISTY_SURGE; item = ITEM_MISTY_SEED; } - PARAMETRIZE { species = SPECIES_TAPU_LELE; ability = ABILITY_PSYCHIC_SURGE; item = ITEM_PSYCHIC_SEED; } - GIVEN { - ASSUME(gSpeciesInfo[SPECIES_PIDGEY].types[0] == TYPE_FLYING || gSpeciesInfo[SPECIES_PIDGEY].types[1] == TYPE_FLYING); - PLAYER(SPECIES_PIDGEY) { Item(item); } - OPPONENT(species) { Ability(ability); } - } WHEN { - TURN { } - } SCENE { - ABILITY_POPUP(opponent, ability); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - } THEN { - EXPECT_EQ(player->item, ITEM_NONE); - } -} - -SINGLE_BATTLE_TEST("Electric Seed is consumed on Electric Terrain before other abilities change the terrain") -{ - GIVEN { - PLAYER(SPECIES_TAPU_BULU) { Ability(ABILITY_GRASSY_SURGE); Item(ITEM_ELECTRIC_SEED); Speed(5); } - OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); Item(ITEM_ELECTRIC_SEED); Speed(10); } - } WHEN { - TURN { } - } SCENE { - ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); - MESSAGE("Using Electric Seed, the Defense of the opposing Tapu Koko rose!"); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Using Electric Seed, the Defense of Tapu Bulu rose!"); - ABILITY_POPUP(player, ABILITY_GRASSY_SURGE); - } -} - -SINGLE_BATTLE_TEST("Electric Seed doesn't activate on existing Electric Terrain before user's ability changes the terrain") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_TAPU_BULU) { Ability(ABILITY_GRASSY_SURGE); Item(ITEM_ELECTRIC_SEED); } - OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); } - } WHEN { - TURN { SWITCH(player, 1); } - } SCENE { - ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); - SWITCH_OUT_MESSAGE("Wobbuffet"); - SEND_IN_MESSAGE("Tapu Bulu"); - NONE_OF { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Using Electric Seed, the Defense of Tapu Bulu rose!"); - } - ABILITY_POPUP(player, ABILITY_GRASSY_SURGE); - } -} diff --git a/test/battle/hold_effect/shed_shell.c b/test/battle/hold_effect/shed_shell.c new file mode 100644 index 000000000000..93c3fb0e5336 --- /dev/null +++ b/test/battle/hold_effect/shed_shell.c @@ -0,0 +1,67 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_SHED_SHELL].holdEffect == HOLD_EFFECT_SHED_SHELL); +}; + +SINGLE_BATTLE_TEST("Shed Shell allows switching out even when trapped by Mean Look") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SHED_SHELL); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_GASTLY); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_MEAN_LOOK); } + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MEAN_LOOK, opponent); + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Wynaut"); + } +} + +SINGLE_BATTLE_TEST("Shed Shell allows switching out even when trapped by Shadow Tag") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SHED_SHELL); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_SHADOW_TAG); } + } WHEN { + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Wynaut"); + } +} + +SINGLE_BATTLE_TEST("Shed Shell allows switching out even when trapped by Arena Trap") +{ + GIVEN { + PLAYER(SPECIES_DIGLETT) { Item(ITEM_SHED_SHELL); } // Grounded + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_DIGLETT) { Ability(ABILITY_ARENA_TRAP); } + } WHEN { + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + SWITCH_OUT_MESSAGE("Diglett"); + SEND_IN_MESSAGE("Wynaut"); + } +} + +SINGLE_BATTLE_TEST("Shed Shell does not allow Teleport when trapped") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_TELEPORT) == EFFECT_TELEPORT); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SHED_SHELL); Moves(MOVE_TELEPORT, MOVE_SPLASH, MOVE_CELEBRATE); } + OPPONENT(SPECIES_GASTLY); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_MEAN_LOOK); } + TURN { MOVE(player, MOVE_TELEPORT); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MEAN_LOOK, opponent); + MESSAGE("Wobbuffet used Teleport!"); + MESSAGE("But it failed!"); + } +} diff --git a/test/battle/hold_effect/shell_bell.c b/test/battle/hold_effect/shell_bell.c index 33fbc0558bf7..82f1b0b1845e 100644 --- a/test/battle/hold_effect/shell_bell.c +++ b/test/battle/hold_effect/shell_bell.c @@ -252,8 +252,8 @@ SINGLE_BATTLE_TEST("Shell Bell restores 1/8 HP at move end, one strike") hpGainActual = min(maxHp - hp, hpGainFromDamage); GIVEN { - ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); PLAYER(SPECIES_WOBBUFFET) { MaxHP(maxHp); HP(hp); Item(ITEM_SHELL_BELL); } OPPONENT(SPECIES_WOBBUFFET) { MaxHP(maxHp); HP(opponentHp); } } WHEN { diff --git a/test/battle/hold_effect/smooth_rock.c b/test/battle/hold_effect/smooth_rock.c new file mode 100644 index 000000000000..f782e1238116 --- /dev/null +++ b/test/battle/hold_effect/smooth_rock.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Smooth Rock (Hold Effect) test titles") diff --git a/test/battle/hold_effect/snowball.c b/test/battle/hold_effect/snowball.c new file mode 100644 index 000000000000..7037e1c59da4 --- /dev/null +++ b/test/battle/hold_effect/snowball.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Snowball (Hold Effect) test titles") diff --git a/test/battle/hold_effect/soul_dew.c b/test/battle/hold_effect/soul_dew.c new file mode 100644 index 000000000000..b1ad8a9aa0f2 --- /dev/null +++ b/test/battle/hold_effect/soul_dew.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Soul Dew (Hold Effect) test titles") diff --git a/test/battle/hold_effect/sp_attack_up.c b/test/battle/hold_effect/sp_attack_up.c new file mode 100644 index 000000000000..f4256a533581 --- /dev/null +++ b/test/battle/hold_effect/sp_attack_up.c @@ -0,0 +1,70 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_PETAYA_BERRY].holdEffect == HOLD_EFFECT_SP_ATTACK_UP); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); +} + +SINGLE_BATTLE_TEST("Petaya Berry raises the holder's Sp. Atk by one stage when HP drops to 1/4 or below") +{ + u32 move; + + PARAMETRIZE { move = MOVE_SCRATCH; } + PARAMETRIZE { move = MOVE_DRAGON_RAGE; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { MaxHP(160); HP(80); Item(ITEM_PETAYA_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + if (move == MOVE_SCRATCH) { + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Using Petaya Berry, the Sp. Atk of Wobbuffet rose!"); + } + } else { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Using Petaya Berry, the Sp. Atk of Wobbuffet rose!"); + } + } THEN { + if (move == MOVE_DRAGON_RAGE) + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Petaya Berry raises Sp. Atk by one stage when HP drops to 1/2 or below if holder has Gluttony") +{ + GIVEN { + PLAYER(SPECIES_BELLSPROUT) { MaxHP(80); HP(80); Ability(ABILITY_GLUTTONY); Item(ITEM_PETAYA_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_DRAGON_RAGE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_RAGE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Using Petaya Berry, the Sp. Atk of Bellsprout rose!"); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Petaya Berry raises Sp. Atk by one stage when HP drops to 1/4 or below if holder has Ripen") +{ + GIVEN { + PLAYER(SPECIES_APPLIN) { MaxHP(160); HP(80); Ability(ABILITY_RIPEN); Item(ITEM_PETAYA_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_DRAGON_RAGE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_RAGE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Using Petaya Berry, the Sp. Atk of Applin sharply rose!"); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 2); + } +} diff --git a/test/battle/hold_effect/sp_defense_up.c b/test/battle/hold_effect/sp_defense_up.c new file mode 100644 index 000000000000..e7d8f9a170c8 --- /dev/null +++ b/test/battle/hold_effect/sp_defense_up.c @@ -0,0 +1,70 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_APICOT_BERRY].holdEffect == HOLD_EFFECT_SP_DEFENSE_UP); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); +} + +SINGLE_BATTLE_TEST("Apicot Berry raises the holder's Sp. Def by one stage when HP drops to 1/4 or below") +{ + u32 move; + + PARAMETRIZE { move = MOVE_SCRATCH; } + PARAMETRIZE { move = MOVE_DRAGON_RAGE; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { MaxHP(160); HP(80); Item(ITEM_APICOT_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + if (move == MOVE_SCRATCH) { + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Using Apicot Berry, the Sp. Def of Wobbuffet rose!"); + } + } else { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Using Apicot Berry, the Sp. Def of Wobbuffet rose!"); + } + } THEN { + if (move == MOVE_DRAGON_RAGE) + EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Apicot Berry raises Sp. Def by one stage when HP drops to 1/2 or below if holder has Gluttony") +{ + GIVEN { + PLAYER(SPECIES_BELLSPROUT) { MaxHP(80); HP(80); Ability(ABILITY_GLUTTONY); Item(ITEM_APICOT_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_DRAGON_RAGE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_RAGE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Using Apicot Berry, the Sp. Def of Bellsprout rose!"); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Apicot Berry raises Sp. Def by one stage when HP drops to 1/4 or below if holder has Ripen") +{ + GIVEN { + PLAYER(SPECIES_APPLIN) { MaxHP(160); HP(80); Ability(ABILITY_RIPEN); Item(ITEM_APICOT_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_DRAGON_RAGE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_RAGE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Using Apicot Berry, the Sp. Def of Applin sharply rose!"); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE + 2); + } +} diff --git a/test/battle/hold_effect/special_attack_up.c b/test/battle/hold_effect/special_attack_up.c deleted file mode 100644 index 148b7abf1b80..000000000000 --- a/test/battle/hold_effect/special_attack_up.c +++ /dev/null @@ -1,70 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(gItemsInfo[ITEM_PETAYA_BERRY].holdEffect == HOLD_EFFECT_SP_ATTACK_UP); - ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); -} - -SINGLE_BATTLE_TEST("Petaya Berry raises the holder's Sp. Atk by one stage when HP drops to 1/4 or below") -{ - u32 move; - - PARAMETRIZE { move = MOVE_SCRATCH; } - PARAMETRIZE { move = MOVE_DRAGON_RAGE; } - - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { MaxHP(160); HP(80); Item(ITEM_PETAYA_BERRY); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, move); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, move, opponent); - if (move == MOVE_SCRATCH) { - NONE_OF { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("Using Petaya Berry, the Sp. Atk of Wobbuffet rose!"); - } - } else { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("Using Petaya Berry, the Sp. Atk of Wobbuffet rose!"); - } - } THEN { - if (move == MOVE_DRAGON_RAGE) - EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); - } -} - -SINGLE_BATTLE_TEST("Petaya Berry raises Sp. Atk by one stage when HP drops to 1/2 or below if holder has Gluttony") -{ - GIVEN { - PLAYER(SPECIES_BELLSPROUT) { MaxHP(80); HP(80); Ability(ABILITY_GLUTTONY); Item(ITEM_PETAYA_BERRY); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, MOVE_DRAGON_RAGE); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_RAGE, opponent); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("Using Petaya Berry, the Sp. Atk of Bellsprout rose!"); - } THEN { - EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); - } -} - -SINGLE_BATTLE_TEST("Petaya Berry raises Sp. Atk by one stage when HP drops to 1/4 or below if holder has Ripen") -{ - GIVEN { - PLAYER(SPECIES_APPLIN) { MaxHP(160); HP(80); Ability(ABILITY_RIPEN); Item(ITEM_PETAYA_BERRY); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, MOVE_DRAGON_RAGE); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_RAGE, opponent); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("Using Petaya Berry, the Sp. Atk of Applin sharply rose!"); - } THEN { - EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 2); - } -} diff --git a/test/battle/hold_effect/special_defense_up.c b/test/battle/hold_effect/special_defense_up.c deleted file mode 100644 index 266f95450352..000000000000 --- a/test/battle/hold_effect/special_defense_up.c +++ /dev/null @@ -1,70 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(gItemsInfo[ITEM_APICOT_BERRY].holdEffect == HOLD_EFFECT_SP_DEFENSE_UP); - ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); -} - -SINGLE_BATTLE_TEST("Apicot Berry raises the holder's Sp. Def by one stage when HP drops to 1/4 or below") -{ - u32 move; - - PARAMETRIZE { move = MOVE_SCRATCH; } - PARAMETRIZE { move = MOVE_DRAGON_RAGE; } - - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { MaxHP(160); HP(80); Item(ITEM_APICOT_BERRY); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, move); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, move, opponent); - if (move == MOVE_SCRATCH) { - NONE_OF { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("Using Apicot Berry, the Sp. Def of Wobbuffet rose!"); - } - } else { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("Using Apicot Berry, the Sp. Def of Wobbuffet rose!"); - } - } THEN { - if (move == MOVE_DRAGON_RAGE) - EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE + 1); - } -} - -SINGLE_BATTLE_TEST("Apicot Berry raises Sp. Def by one stage when HP drops to 1/2 or below if holder has Gluttony") -{ - GIVEN { - PLAYER(SPECIES_BELLSPROUT) { MaxHP(80); HP(80); Ability(ABILITY_GLUTTONY); Item(ITEM_APICOT_BERRY); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, MOVE_DRAGON_RAGE); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_RAGE, opponent); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("Using Apicot Berry, the Sp. Def of Bellsprout rose!"); - } THEN { - EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE + 1); - } -} - -SINGLE_BATTLE_TEST("Apicot Berry raises Sp. Def by one stage when HP drops to 1/4 or below if holder has Ripen") -{ - GIVEN { - PLAYER(SPECIES_APPLIN) { MaxHP(160); HP(80); Ability(ABILITY_RIPEN); Item(ITEM_APICOT_BERRY); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, MOVE_DRAGON_RAGE); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_RAGE, opponent); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("Using Apicot Berry, the Sp. Def of Applin sharply rose!"); - } THEN { - EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE + 2); - } -} diff --git a/test/battle/hold_effect/speed_up.c b/test/battle/hold_effect/speed_up.c index 7fb24295d47d..b1725597a9b6 100644 --- a/test/battle/hold_effect/speed_up.c +++ b/test/battle/hold_effect/speed_up.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_SALAC_BERRY].holdEffect == HOLD_EFFECT_SPEED_UP); - ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); } SINGLE_BATTLE_TEST("Salac Berry raises the holder's Speed by one stage when HP drops to 1/4 or below") diff --git a/test/battle/hold_effect/sticky_barb.c b/test/battle/hold_effect/sticky_barb.c new file mode 100644 index 000000000000..59c1e1227052 --- /dev/null +++ b/test/battle/hold_effect/sticky_barb.c @@ -0,0 +1,51 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetItemHoldEffect(ITEM_STICKY_BARB) == HOLD_EFFECT_STICKY_BARB); +} + +SINGLE_BATTLE_TEST("Sticky Barb hurts its holder at the end of the turn") +{ + s16 damage; + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_STICKY_BARB); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { } + } SCENE { + HP_BAR(player, captureDamage: &damage); + } THEN { + EXPECT_EQ(damage, player->maxHP / 8); + } +} + +SINGLE_BATTLE_TEST("Sticky Barb gets transferred if its holder is hit by a contact move") +{ + u32 move; + PARAMETRIZE { move = MOVE_SCRATCH; } + PARAMETRIZE { move = MOVE_GROWL; } + PARAMETRIZE { move = MOVE_HYPER_VOICE; } + GIVEN { + ASSUME(MoveMakesContact(MOVE_SCRATCH)); + ASSUME(!MoveMakesContact(MOVE_GROWL)); + ASSUME(!MoveMakesContact(MOVE_HYPER_VOICE)); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_STICKY_BARB); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + if (MoveMakesContact(move)) + { + MESSAGE("The Sticky Barb attached itself to the opposing Wobbuffet!"); + MESSAGE("The opposing Wobbuffet was hurt by the Sticky Barb!"); + } + else + { + NOT MESSAGE("The Sticky Barb attached itself to the opposing Wobbuffet!"); + MESSAGE("Wobbuffet was hurt by the Sticky Barb!"); + } + } +} diff --git a/test/battle/hold_effect/terrain_extender.c b/test/battle/hold_effect/terrain_extender.c new file mode 100644 index 000000000000..cce69d42aa50 --- /dev/null +++ b/test/battle/hold_effect/terrain_extender.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Terrain Extender (Hold Effect) test titles") diff --git a/test/battle/hold_effect/terrain_seed.c b/test/battle/hold_effect/terrain_seed.c new file mode 100644 index 000000000000..b54dd54f5b45 --- /dev/null +++ b/test/battle/hold_effect/terrain_seed.c @@ -0,0 +1,202 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_ELECTRIC_SEED].holdEffect == HOLD_EFFECT_TERRAIN_SEED); + ASSUME(gItemsInfo[ITEM_ELECTRIC_SEED].holdEffectParam == HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN); + ASSUME(gItemsInfo[ITEM_GRASSY_SEED].holdEffect == HOLD_EFFECT_TERRAIN_SEED); + ASSUME(gItemsInfo[ITEM_GRASSY_SEED].holdEffectParam == HOLD_EFFECT_PARAM_GRASSY_TERRAIN); + ASSUME(gItemsInfo[ITEM_MISTY_SEED].holdEffect == HOLD_EFFECT_TERRAIN_SEED); + ASSUME(gItemsInfo[ITEM_MISTY_SEED].holdEffectParam == HOLD_EFFECT_PARAM_MISTY_TERRAIN); + ASSUME(gItemsInfo[ITEM_PSYCHIC_SEED].holdEffect == HOLD_EFFECT_TERRAIN_SEED); + ASSUME(gItemsInfo[ITEM_PSYCHIC_SEED].holdEffectParam == HOLD_EFFECT_PARAM_PSYCHIC_TERRAIN); + +} + +SINGLE_BATTLE_TEST("Electric Seed raises the holder's Defense on Electric Terrain") +{ + enum Ability ability; + u32 item; + PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_NONE; } + PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_ELECTRIC_SEED; } + PARAMETRIZE { ability = ABILITY_ELECTRIC_SURGE; item = ITEM_NONE; } + PARAMETRIZE { ability = ABILITY_ELECTRIC_SURGE; item = ITEM_ELECTRIC_SEED; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_ELECTRIC_SEED); } + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_ELECTRIC_SEED); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ability); Item(item); } + } WHEN { + if (ability == ABILITY_TELEPATHY) + TURN { MOVE(player, MOVE_ELECTRIC_TERRAIN); } + TURN { SWITCH(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Using Electric Seed, the Defense of Wobbuffet rose!"); + if (item == ITEM_ELECTRIC_SEED) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Using Electric Seed, the Defense of the opposing Tapu Koko rose!"); + } + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Wobbuffet"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Using Electric Seed, the Defense of Wobbuffet rose!"); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Grassy Seed raises the holder's Defense on Grassy Terrain") +{ + enum Ability ability; + u32 item; + PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_NONE; } + PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_GRASSY_SEED; } + PARAMETRIZE { ability = ABILITY_GRASSY_SURGE; item = ITEM_NONE; } + PARAMETRIZE { ability = ABILITY_GRASSY_SURGE; item = ITEM_GRASSY_SEED; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_GRASSY_SEED); } + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_GRASSY_SEED); } + OPPONENT(SPECIES_TAPU_BULU) { Ability(ability); Item(item); } + } WHEN { + if (ability == ABILITY_TELEPATHY) + TURN { MOVE(player, MOVE_GRASSY_TERRAIN); } + TURN { SWITCH(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Using Grassy Seed, the Defense of Wobbuffet rose!"); + if (item == ITEM_GRASSY_SEED) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Using Grassy Seed, the Defense of the opposing Tapu Bulu rose!"); + } + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Wobbuffet"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Using Grassy Seed, the Defense of Wobbuffet rose!"); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Misty Seed raises the holder's Sp. Defense on Misty Terrain") +{ + enum Ability ability; + u32 item; + PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_NONE; } + PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_MISTY_SEED; } + PARAMETRIZE { ability = ABILITY_MISTY_SURGE; item = ITEM_NONE; } + PARAMETRIZE { ability = ABILITY_MISTY_SURGE; item = ITEM_MISTY_SEED; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_MISTY_SEED); } + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_MISTY_SEED); } + OPPONENT(SPECIES_TAPU_FINI) { Ability(ability); Item(item); } + } WHEN { + if (ability == ABILITY_TELEPATHY) + TURN { MOVE(player, MOVE_MISTY_TERRAIN); } + TURN { SWITCH(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Using Misty Seed, the Sp. Def of Wobbuffet rose!"); + if (item == ITEM_MISTY_SEED) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Using Misty Seed, the Sp. Def of the opposing Tapu Fini rose!"); + } + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Wobbuffet"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Using Misty Seed, the Sp. Def of Wobbuffet rose!"); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Psychic Seed raises the holder's Sp. Defense on Psychic Terrain") +{ + enum Ability ability; + u32 item; + PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_NONE; } + PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_PSYCHIC_SEED; } + PARAMETRIZE { ability = ABILITY_PSYCHIC_SURGE; item = ITEM_NONE; } + PARAMETRIZE { ability = ABILITY_PSYCHIC_SURGE; item = ITEM_PSYCHIC_SEED; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_PSYCHIC_SEED); } + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_PSYCHIC_SEED); } + OPPONENT(SPECIES_TAPU_LELE) { Ability(ability); Item(item); } + } WHEN { + if (ability == ABILITY_TELEPATHY) + TURN { MOVE(player, MOVE_PSYCHIC_TERRAIN); } + TURN { SWITCH(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Using Psychic Seed, the Sp. Def of Wobbuffet rose!"); + if (item == ITEM_PSYCHIC_SEED) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Using Psychic Seed, the Sp. Def of the opposing Tapu Lele rose!"); + } + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Wobbuffet"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Using Psychic Seed, the Sp. Def of Wobbuffet rose!"); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Seeds get consumed in Terrain even if holder is not affected by Terrain") +{ + u32 species, item; + enum Ability ability; + PARAMETRIZE { species = SPECIES_TAPU_KOKO; ability = ABILITY_ELECTRIC_SURGE; item = ITEM_ELECTRIC_SEED; } + PARAMETRIZE { species = SPECIES_TAPU_BULU; ability = ABILITY_GRASSY_SURGE; item = ITEM_GRASSY_SEED; } + PARAMETRIZE { species = SPECIES_TAPU_FINI; ability = ABILITY_MISTY_SURGE; item = ITEM_MISTY_SEED; } + PARAMETRIZE { species = SPECIES_TAPU_LELE; ability = ABILITY_PSYCHIC_SURGE; item = ITEM_PSYCHIC_SEED; } + GIVEN { + ASSUME(GetSpeciesType(SPECIES_PIDGEY, 0) == TYPE_FLYING || GetSpeciesType(SPECIES_PIDGEY, 1) == TYPE_FLYING); + PLAYER(SPECIES_PIDGEY) { Item(item); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ability); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Electric Seed is consumed on Electric Terrain before other abilities change the terrain") +{ + GIVEN { + PLAYER(SPECIES_TAPU_BULU) { Ability(ABILITY_GRASSY_SURGE); Item(ITEM_ELECTRIC_SEED); Speed(5); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); Item(ITEM_ELECTRIC_SEED); Speed(10); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Using Electric Seed, the Defense of the opposing Tapu Koko rose!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Using Electric Seed, the Defense of Tapu Bulu rose!"); + ABILITY_POPUP(player, ABILITY_GRASSY_SURGE); + } +} + +SINGLE_BATTLE_TEST("Electric Seed doesn't activate on existing Electric Terrain before user's ability changes the terrain") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_TAPU_BULU) { Ability(ABILITY_GRASSY_SURGE); Item(ITEM_ELECTRIC_SEED); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); } + } WHEN { + TURN { SWITCH(player, 1); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Tapu Bulu"); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Using Electric Seed, the Defense of Tapu Bulu rose!"); + } + ABILITY_POPUP(player, ABILITY_GRASSY_SURGE); + } +} diff --git a/test/battle/hold_effect/thick_club.c b/test/battle/hold_effect/thick_club.c new file mode 100644 index 000000000000..9fe2040394e5 --- /dev/null +++ b/test/battle/hold_effect/thick_club.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Thick Club (Hold Effect) test titles") diff --git a/test/battle/hold_effect/throat_spray.c b/test/battle/hold_effect/throat_spray.c index 67e596c277a8..a8e6cc5c1000 100644 --- a/test/battle/hold_effect/throat_spray.c +++ b/test/battle/hold_effect/throat_spray.c @@ -88,3 +88,32 @@ SINGLE_BATTLE_TEST("Throat Spray does not activate if move fails") } } } + +SINGLE_BATTLE_TEST("Throat Spray does not activate if user flinches") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_THROAT_SPRAY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_FAKE_OUT); MOVE(player, MOVE_HYPER_VOICE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FAKE_OUT, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + } + } +} + +SINGLE_BATTLE_TEST("Throat Spray is not blocked by Sheer Force") +{ + GIVEN { + PLAYER(SPECIES_NIDOKING) { Ability(ABILITY_SHEER_FORCE); Item(ITEM_THROAT_SPRAY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BUG_BUZZ); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BUG_BUZZ, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + } +} diff --git a/test/battle/hold_effect/toxic_orb.c b/test/battle/hold_effect/toxic_orb.c new file mode 100644 index 000000000000..115259cd0cd8 --- /dev/null +++ b/test/battle/hold_effect/toxic_orb.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Toxic Orb (Hold Effect) test titles") diff --git a/test/battle/hold_effect/type_power.c b/test/battle/hold_effect/type_power.c index 5afe2a39c83e..c03d2487d573 100644 --- a/test/battle/hold_effect/type_power.c +++ b/test/battle/hold_effect/type_power.c @@ -53,3 +53,27 @@ SINGLE_BATTLE_TEST("Type-enhancing items increase the base power of moves by 20% } } } + +SINGLE_BATTLE_TEST("Type-enhancing items do not increase the power of Struggle", s16 damage) +{ + u32 item = 0; + + PARAMETRIZE { item = ITEM_NONE; } + PARAMETRIZE { item = ITEM_SILK_SCARF; } + + GIVEN { + if (item != ITEM_NONE) { + ASSUME(GetItemHoldEffect(item) == HOLD_EFFECT_TYPE_POWER); + ASSUME(GetItemSecondaryId(item) == GetMoveType(MOVE_STRUGGLE)); + } + PLAYER(SPECIES_WOBBUFFET) { Item(item); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_STRUGGLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STRUGGLE, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} diff --git a/test/battle/hold_effect/weakness_policy.c b/test/battle/hold_effect/weakness_policy.c new file mode 100644 index 000000000000..d080e9ad650a --- /dev/null +++ b/test/battle/hold_effect/weakness_policy.c @@ -0,0 +1,31 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetItemHoldEffect(ITEM_WEAKNESS_POLICY) == HOLD_EFFECT_WEAKNESS_POLICY); +} + +SINGLE_BATTLE_TEST("Weakness Policy does not activate if Disguise blocks the damage") +{ + u32 species; + + PARAMETRIZE { species = SPECIES_MIMIKYU_BUSTED; } + PARAMETRIZE { species = SPECIES_MIMIKYU_DISGUISED; } + + GIVEN { + ASSUME(GetMoveType(MOVE_METAL_CLAW) == TYPE_STEEL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(species) { Item(ITEM_WEAKNESS_POLICY); Ability(ABILITY_DISGUISE); } + } WHEN { + TURN { MOVE(player, MOVE_METAL_CLAW); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_METAL_CLAW, player); + if (species == SPECIES_MIMIKYU_BUSTED) + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + else + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + } +} + +TO_DO_BATTLE_TEST("TODO: Write Weakness Policy (Hold Effect) test titles") diff --git a/test/battle/hold_effect/white_herb.c b/test/battle/hold_effect/white_herb.c new file mode 100644 index 000000000000..4a8f020023d1 --- /dev/null +++ b/test/battle/hold_effect/white_herb.c @@ -0,0 +1,236 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_WHITE_HERB].holdEffect == HOLD_EFFECT_WHITE_HERB); +} + +SINGLE_BATTLE_TEST("White Herb restores stats when they're lowered") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_LEER) == EFFECT_DEFENSE_DOWN); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_WHITE_HERB); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_LEER); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wobbuffet returned its stats to normal using its White Herb!"); + } THEN { + EXPECT(player->item == ITEM_NONE); + EXPECT(player->statStages[STAT_DEF] = DEFAULT_STAT_STAGE); + } +} + +SINGLE_BATTLE_TEST("White Herb restores stats after Attack was lowered by Intimidate in singles") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_WHITE_HERB); } + OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } + } WHEN { + TURN { ; } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wobbuffet returned its stats to normal using its White Herb!"); + } THEN { + EXPECT(player->item == ITEM_NONE); + EXPECT(player->statStages[STAT_DEF] = DEFAULT_STAT_STAGE); + } +} + +DOUBLE_BATTLE_TEST("White Herb restores stats after Attack was lowered by Intimidate in doubles") +{ + GIVEN { + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_WHITE_HERB); } + OPPONENT(SPECIES_WYNAUT) { Item(ITEM_WHITE_HERB); } + PLAYER(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } + PLAYER(SPECIES_WOBBUFFET); + } WHEN { + TURN { ; } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); + + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentLeft); + MESSAGE("The opposing Wobbuffet returned its stats to normal using its White Herb!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight); + MESSAGE("The opposing Wynaut returned its stats to normal using its White Herb!"); + } THEN { + EXPECT(opponentLeft->item == ITEM_NONE); + EXPECT(opponentLeft->statStages[STAT_DEF] = DEFAULT_STAT_STAGE); + EXPECT(opponentRight->item == ITEM_NONE); + EXPECT(opponentRight->statStages[STAT_DEF] = DEFAULT_STAT_STAGE); + } +} + +SINGLE_BATTLE_TEST("White Herb restores stats after Attack was lowered by Intimidate while switching in") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_WHITE_HERB); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } + } WHEN { + TURN { SWITCH(opponent, 1); MOVE(player, MOVE_CLOSE_COMBAT); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wobbuffet returned its stats to normal using its White Herb!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CLOSE_COMBAT, player); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wobbuffet returned its stats to normal using its White Herb!"); + } + } THEN { + EXPECT(player->item == ITEM_NONE); + EXPECT(player->statStages[STAT_DEF] = DEFAULT_STAT_STAGE - 1); + EXPECT(player->statStages[STAT_SPDEF] = DEFAULT_STAT_STAGE - 1); + } +} + +SINGLE_BATTLE_TEST("White Herb restores stats after all hits of a multi hit move happened") +{ + u16 species; + enum Ability ability; + + PARAMETRIZE { species = SPECIES_SLIGGOO_HISUI; ability = ABILITY_GOOEY; } + PARAMETRIZE { species = SPECIES_DUGTRIO_ALOLA; ability = ABILITY_TANGLING_HAIR; } + + GIVEN { + ASSUME(GetMoveStrikeCount(MOVE_DUAL_WINGBEAT) == 2); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_WHITE_HERB); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_DUAL_WINGBEAT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DUAL_WINGBEAT, player); + ABILITY_POPUP(opponent, ability); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Wobbuffet's Speed fell!"); + ABILITY_POPUP(opponent, ability); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Wobbuffet's Speed fell!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wobbuffet returned its stats to normal using its White Herb!"); + } THEN { + EXPECT(player->item == ITEM_NONE); + EXPECT(player->statStages[STAT_SPEED] = DEFAULT_STAT_STAGE); + } +} + +SINGLE_BATTLE_TEST("White Herb wont have time to activate if it is knocked off or stolen by Thief") +{ + u16 move; + + PARAMETRIZE { move = MOVE_THIEF; } + PARAMETRIZE { move = MOVE_KNOCK_OFF; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_KNOCK_OFF) == EFFECT_KNOCK_OFF); + ASSUME(GetMoveEffect(MOVE_THIEF) == EFFECT_STEAL_ITEM); + PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); Item(ITEM_WHITE_HERB); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Slugma's Weak Armor lowered its Defense!"); + MESSAGE("Slugma's Weak Armor sharply raised its Speed!"); + if (move == MOVE_KNOCK_OFF) { + MESSAGE("The opposing Wobbuffet knocked off Slugma's White Herb!"); + } else if (move == MOVE_THIEF) { + MESSAGE("The opposing Wobbuffet stole Slugma's White Herb!"); + } + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wobbuffet returned its stats to normal using its White Herb!"); + } + } THEN { + EXPECT(player->statStages[STAT_DEF] = DEFAULT_STAT_STAGE - 1); + EXPECT(player->statStages[STAT_SPEED] = DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("White Herb wont have time to activate if Magician steals it") +{ + GIVEN { + PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); Item(ITEM_WHITE_HERB); } + OPPONENT(SPECIES_FENNEKIN) { Ability(ABILITY_MAGICIAN); } + } WHEN { + TURN { MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Slugma's Weak Armor lowered its Defense!"); + MESSAGE("Slugma's Weak Armor sharply raised its Speed!"); + ABILITY_POPUP(opponent, ABILITY_MAGICIAN); + MESSAGE("The opposing Fennekin stole Slugma's White Herb!"); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wobbuffet returned its stats to normal using its White Herb!"); + } + } THEN { + EXPECT(player->statStages[STAT_DEF] = DEFAULT_STAT_STAGE - 1); + EXPECT(player->statStages[STAT_SPEED] = DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("White Herb has correct interactions with Intimidate triggered Defiant and Competitive") +{ + u16 species; + enum Ability ability; + + PARAMETRIZE { species = SPECIES_IGGLYBUFF; ability = ABILITY_COMPETITIVE; } + PARAMETRIZE { species = SPECIES_MANKEY; ability = ABILITY_DEFIANT; } + + GIVEN { + PLAYER(species) { Ability(ability); Item(ITEM_WHITE_HERB); } + OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } + } WHEN { + TURN { ; } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); + ABILITY_POPUP(player, ability); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + // Defiant activates first, so White Herb doesn't have a chance to trigger. + if (ability == ABILITY_COMPETITIVE) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Igglybuff returned its stats to normal using its White Herb!"); + } + } THEN { + if (ability == ABILITY_COMPETITIVE) { + EXPECT(player->item == ITEM_NONE); + EXPECT(player->statStages[STAT_ATK] = DEFAULT_STAT_STAGE); + EXPECT(player->statStages[STAT_SPATK] = DEFAULT_STAT_STAGE + 2); + } else { + EXPECT(player->statStages[STAT_ATK] = DEFAULT_STAT_STAGE + 1); + } + } +} + +DOUBLE_BATTLE_TEST("White Herb is correctly displayed") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT) { Item(ITEM_WHITE_HERB); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerRight, MOVE_SUPERPOWER, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerRight); + MESSAGE("Wynaut returned its stats to normal using its White Herb!"); + } THEN { + EXPECT(playerLeft->item == ITEM_NONE); + EXPECT(playerLeft->statStages[STAT_DEF] = DEFAULT_STAT_STAGE); + } +} diff --git a/test/battle/hold_effect/wide_lens.c b/test/battle/hold_effect/wide_lens.c new file mode 100644 index 000000000000..bcf49f559c7b --- /dev/null +++ b/test/battle/hold_effect/wide_lens.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Wide Lens (Hold Effect) test titles") diff --git a/test/battle/hold_effect/wise_glasses.c b/test/battle/hold_effect/wise_glasses.c new file mode 100644 index 000000000000..6df63c91717b --- /dev/null +++ b/test/battle/hold_effect/wise_glasses.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Wise Glasses (Hold Effect) test titles") diff --git a/test/battle/hold_effect/z_crystal.c b/test/battle/hold_effect/z_crystal.c new file mode 100644 index 000000000000..3c38b538dd24 --- /dev/null +++ b/test/battle/hold_effect/z_crystal.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +// Tests for Z-Crystals handled in test/battle/gimmick/zmove.c diff --git a/test/battle/hold_effect/zoom_lens.c b/test/battle/hold_effect/zoom_lens.c new file mode 100644 index 000000000000..6eded0dcb2ea --- /dev/null +++ b/test/battle/hold_effect/zoom_lens.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Zoom Lens (Hold Effect) test titles") diff --git a/test/battle/item_effect/cure_status.c b/test/battle/item_effect/cure_status.c index 6f7d403c43ef..79490b48dc3b 100644 --- a/test/battle/item_effect/cure_status.c +++ b/test/battle/item_effect/cure_status.c @@ -31,6 +31,29 @@ SINGLE_BATTLE_TEST("Antidote heals a battler from being poisoned") } } +DOUBLE_BATTLE_TEST("Antidote heals a battler from being poisoned (doubles)") +{ + u32 index; + struct BattlePokemon *user = NULL; + struct BattlePokemon *target = NULL; + PARAMETRIZE { index = 0; user = playerRight; target = playerLeft;} + PARAMETRIZE { index = 1; user = playerLeft; target = playerRight;} + PARAMETRIZE { index = 0; user = playerLeft; target = playerLeft;} + PARAMETRIZE { index = 1; user = playerRight; target = playerRight; } + + GIVEN { + ASSUME(gItemsInfo[ITEM_ANTIDOTE].battleUsage == EFFECT_ITEM_CURE_STATUS); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WYNAUT) { } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { USE_ITEM(user, ITEM_ANTIDOTE, partyIndex: index); } + } THEN { + EXPECT_EQ(target->status1, STATUS1_NONE); + } +} + SINGLE_BATTLE_TEST("Antidote heals a battler from being badly poisoned") { GIVEN { @@ -135,6 +158,43 @@ SINGLE_BATTLE_TEST("Full Heal heals a battler from any primary status") } } +DOUBLE_BATTLE_TEST("Full Heal heals a battler from any primary status (doubles)") +{ + u32 statusParameters[7] = + { + STATUS1_SLEEP, + STATUS1_POISON, + STATUS1_BURN, + STATUS1_FREEZE, + STATUS1_PARALYSIS, + STATUS1_TOXIC_POISON, + STATUS1_FROSTBITE + }; + + u16 status = 0; + u32 index = 0; + struct BattlePokemon *user = NULL; + struct BattlePokemon *target = NULL; + for (u32 j = 0; j < 7; j++) + { + PARAMETRIZE {status = statusParameters[j]; user = playerRight; target = playerLeft; index = 0;} + PARAMETRIZE {status = statusParameters[j]; user = playerLeft; target = playerRight; index = 1;} + PARAMETRIZE {status = statusParameters[j]; user = playerLeft; target = playerLeft; index = 0;} + PARAMETRIZE {status = statusParameters[j]; user = playerRight; target = playerRight; index = 1;} + } + GIVEN { + ASSUME(gItemsInfo[ITEM_FULL_HEAL].battleUsage == EFFECT_ITEM_CURE_STATUS); + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { USE_ITEM(user, ITEM_FULL_HEAL, partyIndex: index); } + } THEN { + EXPECT_EQ(target->status1, STATUS1_NONE); + } +} + SINGLE_BATTLE_TEST("Heal Powder heals a battler from any primary status") { u16 status; @@ -158,6 +218,43 @@ SINGLE_BATTLE_TEST("Heal Powder heals a battler from any primary status") } } +DOUBLE_BATTLE_TEST("Heal Powder heals a battler from any primary status (doubles)") +{ + u32 statusParameters[7] = + { + STATUS1_SLEEP, + STATUS1_POISON, + STATUS1_BURN, + STATUS1_FREEZE, + STATUS1_PARALYSIS, + STATUS1_TOXIC_POISON, + STATUS1_FROSTBITE + }; + + u16 status = 0; + u32 index = 0; + struct BattlePokemon *user = NULL; + struct BattlePokemon *target = NULL; + for (u32 j = 0; j < 7; j++) + { + PARAMETRIZE {status = statusParameters[j]; user = playerRight; target = playerLeft; index = 0;} + PARAMETRIZE {status = statusParameters[j]; user = playerLeft; target = playerRight; index = 1;} + PARAMETRIZE {status = statusParameters[j]; user = playerLeft; target = playerLeft; index = 0;} + PARAMETRIZE {status = statusParameters[j]; user = playerRight; target = playerRight; index = 1;} + } + GIVEN { + ASSUME(gItemsInfo[ITEM_HEAL_POWDER].battleUsage == EFFECT_ITEM_CURE_STATUS); + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { USE_ITEM(user, ITEM_HEAL_POWDER, partyIndex: index); } + } THEN { + EXPECT_EQ(target->status1, STATUS1_NONE); + } +} + SINGLE_BATTLE_TEST("Pewter Crunchies heals a battler from any primary status") { u16 status; @@ -389,6 +486,6 @@ SINGLE_BATTLE_TEST("Full Heal, Heal Powder and Local Specialties heal a battler } SCENE { MESSAGE("Wobbuffet had its status healed!"); } THEN { - EXPECT_EQ(player->status2, STATUS1_NONE); // because we dont have STATUS2_NONE + EXPECT(player->volatiles.confusionTurns == 0); } } diff --git a/test/battle/item_effect/dire_hit.c b/test/battle/item_effect/dire_hit.c index 10b9a28a6026..27f62e7d076c 100644 --- a/test/battle/item_effect/dire_hit.c +++ b/test/battle/item_effect/dire_hit.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Dire Hit increases a battler's critical hit chance by 2 stag PARAMETRIZE { genConfig = j; chance = 2; } // 50% PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); ASSUME(gItemsInfo[ITEM_DIRE_HIT].battleUsage == EFFECT_ITEM_SET_FOCUS_ENERGY); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/item_effect/heal_and_cure_status.c b/test/battle/item_effect/heal_and_cure_status.c index 99507df3cdc1..d85f11b33d7c 100644 --- a/test/battle/item_effect/heal_and_cure_status.c +++ b/test/battle/item_effect/heal_and_cure_status.c @@ -43,8 +43,8 @@ SINGLE_BATTLE_TEST("Full Restore restores a party members HP and cures any prima PARAMETRIZE { status = STATUS1_SLEEP; } PARAMETRIZE { status = STATUS1_NONE; } GIVEN { - PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(300); Status1(status); } - PLAYER(SPECIES_WYNAUT) { HP(1); MaxHP(300); Status1(status); } + PLAYER(SPECIES_WOBBUFFET) { HP(100); MaxHP(300); Status1(status); } + PLAYER(SPECIES_WYNAUT) { HP(100); MaxHP(300); Status1(status); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { USE_ITEM(player, ITEM_FULL_RESTORE, partyIndex: 1); } diff --git a/test/battle/item_effect/increase_stat.c b/test/battle/item_effect/increase_stat.c index 3f162ea82835..227a638c6a83 100644 --- a/test/battle/item_effect/increase_stat.c +++ b/test/battle/item_effect/increase_stat.c @@ -1,5 +1,7 @@ #include "global.h" +#include "overworld.h" #include "test/battle.h" +#include "constants/item_effects.h" SINGLE_BATTLE_TEST("X Attack sharply raises battler's Attack stat", s16 damage) { @@ -257,3 +259,48 @@ SINGLE_BATTLE_TEST("Max Mushrooms raises battler's Speed stat", s16 damage) } } } + +SINGLE_BATTLE_TEST("Using X items in battle raises Friendship", s16 damage) +{ + u32 startingFriendship; + u8 metLocation = GetCurrentRegionMapSectionId() + 1; + + PARAMETRIZE { startingFriendship = 0; } + PARAMETRIZE { startingFriendship = X_ITEM_MAX_FRIENDSHIP; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Friendship(startingFriendship); }; + // Set met location to currentMapSec + 1 to avoid getting the friendship boost + // from being met in the current map section + SetMonData(&PLAYER_PARTY[0], MON_DATA_MET_LOCATION, &metLocation); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { USE_ITEM(player, ITEM_X_ACCURACY); MOVE(opponent, MOVE_CELEBRATE); } + } THEN { + if (startingFriendship == X_ITEM_MAX_FRIENDSHIP) + EXPECT_EQ(player->friendship, X_ITEM_MAX_FRIENDSHIP); + else + EXPECT_EQ(player->friendship, X_ITEM_FRIENDSHIP_INCREASE); + } +} + +SINGLE_BATTLE_TEST("Using X items in battle where Pokemon was met raises Friendship with a bonus", s16 damage) +{ + u32 startingFriendship; + u8 metLocation = GetCurrentRegionMapSectionId(); + + PARAMETRIZE { startingFriendship = 0; } + PARAMETRIZE { startingFriendship = X_ITEM_MAX_FRIENDSHIP; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Friendship(startingFriendship); }; + // Set met location to currentMapSec to get the friendship boost + SetMonData(&PLAYER_PARTY[0], MON_DATA_MET_LOCATION, &metLocation); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { USE_ITEM(player, ITEM_X_ACCURACY); MOVE(opponent, MOVE_CELEBRATE); } + } THEN { + if (startingFriendship == X_ITEM_MAX_FRIENDSHIP) + EXPECT_EQ(player->friendship, X_ITEM_MAX_FRIENDSHIP); + else + EXPECT_EQ(player->friendship, (ITEM_FRIENDSHIP_MAPSEC_BONUS + X_ITEM_FRIENDSHIP_INCREASE)); + } +} diff --git a/test/battle/item_effect/poke_flute.c b/test/battle/item_effect/poke_flute.c new file mode 100644 index 000000000000..c9aebed5d389 --- /dev/null +++ b/test/battle/item_effect/poke_flute.c @@ -0,0 +1,43 @@ +#include "global.h" +#include "test/battle.h" +#include "constants/item_effects.h" + +DOUBLE_BATTLE_TEST("Poke Flute heals all battlers from being asleep") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_POKE_FLUTE].battleUsage == EFFECT_ITEM_USE_POKE_FLUTE); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); } + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); } + } WHEN { + TURN { USE_ITEM(playerLeft, ITEM_POKE_FLUTE, partyIndex: 0); } + } SCENE { + MESSAGE("The PokΓ©mon hearing the flute awoke!"); + } THEN { + EXPECT_EQ(playerLeft->status1, STATUS1_NONE); + EXPECT_EQ(playerRight->status1, STATUS1_NONE); + EXPECT_EQ(opponentLeft->status1, STATUS1_NONE); + EXPECT_EQ(opponentRight->status1, STATUS1_NONE); + } +} + +DOUBLE_BATTLE_TEST("Poke Flute does not heal battlers with Soundproof from being asleep") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_POKE_FLUTE].battleUsage == EFFECT_ITEM_USE_POKE_FLUTE); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); } + PLAYER(SPECIES_EXPLOUD) { Ability(ABILITY_SOUNDPROOF); Status1(STATUS1_SLEEP); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); } + OPPONENT(SPECIES_EXPLOUD) { Ability(ABILITY_SOUNDPROOF); Status1(STATUS1_SLEEP); } + } WHEN { + TURN { USE_ITEM(playerLeft, ITEM_POKE_FLUTE, partyIndex: 0); } + } SCENE { + MESSAGE("The PokΓ©mon hearing the flute awoke!"); + } THEN { + EXPECT_EQ(playerLeft->status1, STATUS1_NONE); + EXPECT_NE(playerRight->status1, STATUS1_NONE); + EXPECT_EQ(opponentLeft->status1, STATUS1_NONE); + EXPECT_NE(opponentRight->status1, STATUS1_NONE); + } +} diff --git a/test/battle/item_effect/revive.c b/test/battle/item_effect/revive.c index 9ff693fc3030..df866edf0ee3 100644 --- a/test/battle/item_effect/revive.c +++ b/test/battle/item_effect/revive.c @@ -99,4 +99,128 @@ DOUBLE_BATTLE_TEST("Revive works for a partner in a double battle") } } +DOUBLE_BATTLE_TEST("Revive can trigger switch-in abilities") +{ + GIVEN { + PLAYER(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); HP(1); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); } + TURN { USE_ITEM(playerRight, ITEM_REVIVE, partyIndex: 0); SKIP_TURN(playerLeft); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + } THEN { + EXPECT_EQ(opponentLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 2); + EXPECT_EQ(opponentRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 2); + } +} + +DOUBLE_BATTLE_TEST("Revive does reset abilities") +{ + GIVEN { + PLAYER(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); HP(1); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentRight, MOVE_WORRY_SEED, target: playerLeft); MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); } + TURN { USE_ITEM(playerRight, ITEM_REVIVE, partyIndex: 0); SKIP_TURN(playerLeft); MOVE(opponentRight, MOVE_SPORE, target: playerLeft);} + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + } THEN { + EXPECT_EQ(opponentLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 2); + EXPECT_EQ(opponentRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 2); + } +} + +DOUBLE_BATTLE_TEST("Revive does not grant a mon its pre-death status condition") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT) { Status1(STATUS1_SLEEP); HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerRight); } + TURN { USE_ITEM(playerLeft, ITEM_REVIVE, partyIndex: 1); SKIP_TURN(playerRight); } + } THEN { + EXPECT_EQ(opponentRight->status1, 0); + } +} + +DOUBLE_BATTLE_TEST("Revive does not grant a mon its pre-death stat change") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerRight, MOVE_SWORDS_DANCE); MOVE(opponentLeft, MOVE_SCRATCH, target: playerRight); } + TURN { USE_ITEM(playerLeft, ITEM_REVIVE, partyIndex: 1); SKIP_TURN(playerRight); } + } THEN { + EXPECT_EQ(playerRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + } +} + +DOUBLE_BATTLE_TEST("Revive does not grant a mon its pre-death types") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_POOCHYENA); + } WHEN { + TURN { MOVE(playerRight, MOVE_REFLECT_TYPE, target: opponentRight); MOVE(opponentLeft, MOVE_PSYSHOCK, target: playerRight); MOVE(opponentRight, MOVE_SCRATCH, target: playerRight); } + TURN { USE_ITEM(playerLeft, ITEM_MAX_REVIVE, partyIndex: 1); SKIP_TURN(playerRight); MOVE(opponentLeft, MOVE_PSYCHIC, target: playerRight);} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_REFLECT_TYPE, playerRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYSHOCK, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYCHIC, opponentLeft); + } THEN { + EXPECT_LT(playerRight->hp, playerRight->maxHP); + } +} + +DOUBLE_BATTLE_TEST("Revive force revived pokemon to replace absent battler immediately", s16 damage) +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_INTIMIDATE; } + PARAMETRIZE { ability = ABILITY_SHED_SKIN; } + + GIVEN { + PLAYER(SPECIES_WYNAUT) { HP(1); } + PLAYER(SPECIES_WOBBUFFET) { }; + PLAYER(SPECIES_ARBOK) { Ability(ability); HP(0) ;} ; + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft);} + TURN { USE_ITEM(playerRight, ITEM_REVIVE, partyIndex: 2); SKIP_TURN(playerLeft); MOVE(opponentRight, MOVE_SCRATCH, target: playerRight); } + } SCENE { + if (ability == ABILITY_INTIMIDATE) + { + ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentRight); + HP_BAR(playerRight, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); + } +} + TO_DO_BATTLE_TEST("Revive won't restore a battler's HP if it hasn't fainted") diff --git a/test/battle/move.c b/test/battle/move.c index 541dc3812c82..f77e61aaf872 100644 --- a/test/battle/move.c +++ b/test/battle/move.c @@ -87,9 +87,9 @@ DOUBLE_BATTLE_TEST("Turn order is determined randomly if priority and Speed tie GIVEN { ASSUME(GetMoveEffect(MOVE_ENDEAVOR) == EFFECT_ENDEAVOR); - ASSUME(GetMoveEffect(MOVE_LIFE_DEW) == EFFECT_JUNGLE_HEALING); + ASSUME(GetMoveEffect(MOVE_LIFE_DEW) == EFFECT_LIFE_DEW); ASSUME(GetMoveEffect(MOVE_CRUSH_GRIP) == EFFECT_POWER_BASED_ON_TARGET_HP); - ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_SUPER_FANG); + ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_FIXED_PERCENT_DAMAGE); PLAYER(SPECIES_WOBBUFFET) { MaxHP(480); HP(360); Defense(100); Speed(1); } PLAYER(SPECIES_WYNAUT) { Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { Attack(100); Speed(1); } @@ -142,7 +142,7 @@ SINGLE_BATTLE_TEST("Critical hits deal 100% (Gen 1-5) or 50% (Gen 6+) more damag PARAMETRIZE { criticalHit = TRUE; genConfig = GEN_5; } PARAMETRIZE { criticalHit = TRUE; genConfig = GEN_6; } GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_MULTIPLIER, genConfig); + WITH_CONFIG(CONFIG_CRIT_MULTIPLIER, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -212,6 +212,50 @@ DOUBLE_BATTLE_TEST("Moves fail if they target the partner but they faint before } } +MULTI_BATTLE_TEST("Ally switch fails when used by either side in a multibattle") +{ + GIVEN { + MULTI_PLAYER(SPECIES_WOBBUFFET); + MULTI_PARTNER(SPECIES_WOBBUFFET); + MULTI_OPPONENT_A(SPECIES_WOBBUFFET); + MULTI_OPPONENT_B(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_ALLY_SWITCH); MOVE(playerRight, MOVE_ALLY_SWITCH); MOVE(opponentLeft, MOVE_ALLY_SWITCH); MOVE(opponentRight, MOVE_ALLY_SWITCH); } + } SCENE { + NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, playerLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, playerRight); ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, opponentLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, opponentRight); } + } +} + +TWO_VS_ONE_BATTLE_TEST("Ally switch can only be used by the opponent in a 2v1 battle") +{ + GIVEN { + MULTI_PLAYER(SPECIES_WOBBUFFET); + MULTI_PARTNER(SPECIES_WOBBUFFET); + MULTI_OPPONENT_A(SPECIES_WOBBUFFET); + MULTI_OPPONENT_A(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_ALLY_SWITCH); MOVE(playerRight, MOVE_ALLY_SWITCH); MOVE(opponentLeft, MOVE_ALLY_SWITCH); } + } SCENE { + { ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, opponentLeft); } + NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, playerLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, playerRight); } + } +} + +ONE_VS_TWO_BATTLE_TEST("Ally switch can only be used by the player in a 1v2 battle") +{ + GIVEN { + MULTI_PLAYER(SPECIES_WOBBUFFET); + MULTI_PLAYER(SPECIES_WOBBUFFET); + MULTI_OPPONENT_A(SPECIES_WOBBUFFET); + MULTI_OPPONENT_B(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_ALLY_SWITCH); MOVE(opponentLeft, MOVE_ALLY_SWITCH); MOVE(opponentRight, MOVE_ALLY_SWITCH); } + } SCENE { + { ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, playerLeft); } + NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, opponentLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, opponentRight); } + } +} + DOUBLE_BATTLE_TEST("Moves do not fail if an alive partner is the target") { GIVEN { @@ -226,7 +270,7 @@ DOUBLE_BATTLE_TEST("Moves do not fail if an alive partner is the target") } } -DOUBLE_BATTLE_TEST("Moves fail if they target into a pokemon that was fainted by the previous move") +DOUBLE_BATTLE_TEST("Moves fail if they target into a PokΓ©mon that was fainted by the previous move") { GIVEN { ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH); diff --git a/test/battle/move_animations/all_anims.c b/test/battle/move_animations/all_anims.c index 778b407937e5..c30f1c3a1374 100644 --- a/test/battle/move_animations/all_anims.c +++ b/test/battle/move_animations/all_anims.c @@ -9,44 +9,45 @@ #define ANIM_TEST_END_MOVE MOVES_COUNT-1 // Last move to test -static void ParametrizeMovesAndSpecies(u32 j, u32 *pMove, u32 *pSpecies) +static void ParametrizeMovesAndSpecies(u32 j, u32 *pMove, u32 *pSpecies, u32 variation) { - if (gMovesInfo[j].effect == EFFECT_DARK_VOID) // User needs to be Darkrai + enum BattleMoveEffects effect = GetMoveEffect(j); + if (effect == EFFECT_DARK_VOID) // User needs to be Darkrai { *pMove = j; *pSpecies = SPECIES_DARKRAI; } - else if (gMovesInfo[j].effect == EFFECT_HYPERSPACE_FURY) // User needs to be Hoopa Unbound + else if (effect == EFFECT_HYPERSPACE_FURY) // User needs to be Hoopa Unbound { *pMove = j; *pSpecies = SPECIES_HOOPA_UNBOUND; } - else if (gMovesInfo[j].effect == EFFECT_AURA_WHEEL) // User needs to be Morpeko + else if (effect == EFFECT_AURA_WHEEL) // User needs to be Morpeko { *pMove = j; *pSpecies = SPECIES_MORPEKO_FULL_BELLY; } - else if (gMovesInfo[j].effect == EFFECT_ROTOTILLER || gMovesInfo[j].effect == EFFECT_FLOWER_SHIELD) // User needs to be Grass-type + else if (effect == EFFECT_ROTOTILLER || effect == EFFECT_FLOWER_SHIELD) // User needs to be Grass-type { *pMove = j; *pSpecies = SPECIES_TANGELA; } - else if (gMovesInfo[j].effect == EFFECT_FAIL_IF_NOT_ARG_TYPE && gMovesInfo[j].argument.type == TYPE_FIRE) // User needs to be Fire-type + else if (effect == EFFECT_FAIL_IF_NOT_ARG_TYPE && GetMoveArgType(j) == TYPE_FIRE) // User needs to be Fire-type { *pMove = j; *pSpecies = SPECIES_FLAREON; } - else if (gMovesInfo[j].effect == EFFECT_FAIL_IF_NOT_ARG_TYPE && gMovesInfo[j].argument.type == TYPE_ELECTRIC) // User needs to be Electric-type + else if (effect == EFFECT_FAIL_IF_NOT_ARG_TYPE && GetMoveArgType(j) == TYPE_ELECTRIC) // User needs to be Electric-type { *pMove = j; *pSpecies = SPECIES_JOLTEON; } - else if (gMovesInfo[j].effect == EFFECT_MAGNETIC_FLUX || gMovesInfo[j].effect == EFFECT_GEAR_UP) // User needs to have Plus + else if (effect == EFFECT_MAGNETIC_FLUX || effect == EFFECT_GEAR_UP) // User needs to have Plus { *pMove = j; *pSpecies = SPECIES_KLINKLANG; } - else if (gMovesInfo[j].effect == EFFECT_PLACEHOLDER) // Ignore placeholder *pMoves + else if (effect == EFFECT_PLACEHOLDER) // Ignore placeholder *pMoves { *pMove = MOVE_POUND; *pSpecies = SPECIES_WOBBUFFET; @@ -58,117 +59,251 @@ static void ParametrizeMovesAndSpecies(u32 j, u32 *pMove, u32 *pSpecies) } } +static u32 ParametrizeFriendship(u32 move, u32 variation) +{ + if (gMovesInfo[move].effect == EFFECT_FRUSTRATION + || gMovesInfo[move].effect == EFFECT_RETURN + ) + { + if (variation == 0) + return 1; + else if (variation == 1) + return 61; + else if (variation == 2) + return 101; + else if (variation == 3) + return 201; + } + return 0; +} + +static u32 GetParametrizedHP(u32 move, u32 variation) +{ + if (gMovesInfo[move].effect == EFFECT_POWER_BASED_ON_USER_HP && variation > 0) + { + if (variation == 1) + return 6000; + else if (variation == 2) + return 4000; + else if (variation == 3) + return 2000; + } + return 9997; +} + +static u32 GetParametrizedItem(u32 move, u32 variation) +{ + if ((move == MOVE_TECHNO_BLAST) && variation > 0) + { + if (variation == 1) + return ITEM_DOUSE_DRIVE; + else if (variation == 2) + return ITEM_SHOCK_DRIVE; + else if (variation == 3) + return ITEM_BURN_DRIVE; + else if (variation == 4) + return ITEM_CHILL_DRIVE; + } + return ITEM_ORAN_BERRY; +} + +static u32 GetParametrizedLevel(u32 move, u32 variation) +{ + if (gMovesInfo[move].effect == EFFECT_LEVEL_DAMAGE && variation > 0) + { + if (variation == 1) + return 50; + else if (variation == 2) + return 20; + } + return 100; +} + +static bool32 GetParametrizedShinyness(u32 move, u32 variation) +{ + if ((gMovesInfo[move].effect == EFFECT_DRAGON_DARTS && variation == 2) + || (move == MOVE_SYRUP_BOMB && variation == 1) + ) + return TRUE; + return FALSE; +} + static bool32 TargetHasToMove(u32 move) // Opponent needs to hit the player first { - if (gMovesInfo[move].effect == EFFECT_COUNTER - || gMovesInfo[move].effect == EFFECT_MIRROR_MOVE - || gMovesInfo[move].effect == EFFECT_CONVERSION_2 - || gMovesInfo[move].effect == EFFECT_MIRROR_COAT - || gMovesInfo[move].effect == EFFECT_METAL_BURST - || gMovesInfo[move].effect == EFFECT_COPYCAT - || gMovesInfo[move].effect == EFFECT_SUCKER_PUNCH - || gMovesInfo[move].effect == EFFECT_INSTRUCT) + enum BattleMoveEffects effect = GetMoveEffect(move); + if (effect == EFFECT_COUNTER + || effect == EFFECT_MIRROR_MOVE + || effect == EFFECT_CONVERSION_2 + || effect == EFFECT_MIRROR_COAT + || effect == EFFECT_METAL_BURST + || effect == EFFECT_COPYCAT + || effect == EFFECT_SUCKER_PUNCH + || effect == EFFECT_INSTRUCT) return TRUE; return FALSE; } static bool32 AttackerHasToSwitch(u32 move) // User needs to send out a different team member { - if (gMovesInfo[move].effect == EFFECT_TELEPORT - || gMovesInfo[move].effect == EFFECT_EXPLOSION - || gMovesInfo[move].effect == EFFECT_BATON_PASS - || gMovesInfo[move].effect == EFFECT_MEMENTO - || gMovesInfo[move].effect == EFFECT_HEALING_WISH - || gMovesInfo[move].effect == EFFECT_HIT_ESCAPE - || gMovesInfo[move].effect == EFFECT_FINAL_GAMBIT - || gMovesInfo[move].effect == EFFECT_PARTING_SHOT - || gMovesInfo[move].effect == EFFECT_SHED_TAIL - || gMovesInfo[move].effect == EFFECT_CHILLY_RECEPTION) + enum BattleMoveEffects effect = GetMoveEffect(move); + if (effect == EFFECT_TELEPORT + || effect == EFFECT_EXPLOSION + || effect == EFFECT_MISTY_EXPLOSION + || effect == EFFECT_BATON_PASS + || effect == EFFECT_MEMENTO + || effect == EFFECT_HEALING_WISH + || effect == EFFECT_LUNAR_DANCE + || effect == EFFECT_HIT_ESCAPE + || effect == EFFECT_FINAL_GAMBIT + || effect == EFFECT_PARTING_SHOT + || effect == EFFECT_SHED_TAIL + || effect == EFFECT_CHILLY_RECEPTION) return TRUE; return FALSE; } static bool32 UserHasToGoFirst(u32 move) // Player needs to go first { - if (gMovesInfo[move].effect == EFFECT_PROTECT - || gMovesInfo[move].effect == EFFECT_ENDURE - || gMovesInfo[move].effect == EFFECT_FOLLOW_ME - || gMovesInfo[move].effect == EFFECT_MAGIC_COAT - || gMovesInfo[move].effect == EFFECT_ME_FIRST - || gMovesInfo[move].effect == EFFECT_QUASH - || gMovesInfo[move].effect == EFFECT_MAT_BLOCK - || gMovesInfo[move].effect == EFFECT_ELECTRIFY - || gMovesInfo[move].effect == EFFECT_SHELL_TRAP) + enum BattleMoveEffects effect = GetMoveEffect(move); + if (effect == EFFECT_PROTECT + || effect == EFFECT_ENDURE + || effect == EFFECT_FOLLOW_ME + || effect == EFFECT_MAGIC_COAT + || effect == EFFECT_ME_FIRST + || effect == EFFECT_QUASH + || effect == EFFECT_MAT_BLOCK + || effect == EFFECT_ELECTRIFY + || effect == EFFECT_SHELL_TRAP) return TRUE; return FALSE; } -static void WhenSingles(u32 move, struct BattlePokemon *attacker, struct BattlePokemon *defender) +static u32 GetVariationsNumber(u32 move, bool8 isDouble) +{ + u32 variationsNumber; + + if (gMovesInfo[move].effect == EFFECT_WEATHER_BALL + || gMovesInfo[move].effect == EFFECT_TERRAIN_PULSE + || move == MOVE_TECHNO_BLAST) + variationsNumber = 5; + else if (gMovesInfo[move].effect == EFFECT_FRUSTRATION + || gMovesInfo[move].effect == EFFECT_RETURN + || gMovesInfo[move].effect == EFFECT_IVY_CUDGEL + || move == MOVE_WATER_SPOUT) //we don't use the effect because other moves with the water spout effect don't have animation variations + variationsNumber = 4; + else if (gMovesInfo[move].effect == EFFECT_SPIT_UP + || gMovesInfo[move].effect == EFFECT_SWALLOW + || gMovesInfo[move].effect == EFFECT_DRAGON_DARTS + || move == MOVE_SEISMIC_TOSS) + variationsNumber = 3; + else if (gMovesInfo[move].effect == EFFECT_CURSE + || gMovesInfo[move].effect == EFFECT_PRESENT + || gMovesInfo[move].effect == EFFECT_SHELL_SIDE_ARM + || gMovesInfo[move].effect == EFFECT_FICKLE_BEAM + || gMovesInfo[move].effect == EFFECT_MAGNITUDE + || (isDouble && gMovesInfo[move].effect == EFFECT_TERA_STARSTORM) + || move == MOVE_SYRUP_BOMB) + variationsNumber = 2; + else + variationsNumber = 1; + return variationsNumber; +} +static void WhenSingles(u32 move, struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 variation) { + enum BattleMoveEffects effect = GetMoveEffect(move); // Setup turn - if (gMovesInfo[move].effect == EFFECT_SNORE - || gMovesInfo[move].effect == EFFECT_SLEEP_TALK) + if (effect == EFFECT_SNORE + || effect == EFFECT_SLEEP_TALK) { // attacker needs to be asleep TURN { MOVE(attacker, MOVE_REST); } } - else if (gMovesInfo[move].effect == EFFECT_SPIT_UP - || gMovesInfo[move].effect == EFFECT_SWALLOW) + else if (effect == EFFECT_SPIT_UP + || effect == EFFECT_SWALLOW) { // attacker needs to have used Stockpile - TURN { MOVE(attacker, MOVE_STOCKPILE); } + for (u32 i = 0; i <= variation; i++) + { + TURN { MOVE(attacker, MOVE_STOCKPILE); } + } } - else if ((gMovesInfo[move].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS && gMovesInfo[move].argument.status == STATUS1_PARALYSIS)) + else if ((effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS && GetMoveEffectArg_Status(move) == STATUS1_PARALYSIS)) { // defender needs to be paralyzed TURN { MOVE(attacker, MOVE_THUNDER_WAVE); } } - else if (gMovesInfo[move].effect == EFFECT_RECYCLE - || gMovesInfo[move].effect == EFFECT_BELCH) + else if (effect == EFFECT_RECYCLE + || effect == EFFECT_BELCH) { // attacker needs to have eaten its Berry TURN { MOVE(attacker, MOVE_STUFF_CHEEKS); } } - else if (gMovesInfo[move].effect == EFFECT_REFRESH - || gMovesInfo[move].effect == EFFECT_PSYCHO_SHIFT) + else if (effect == EFFECT_REFRESH + || effect == EFFECT_PSYCHO_SHIFT) { // attacker needs to be paralyzed TURN { MOVE(defender, MOVE_THUNDER_WAVE); } } - else if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) + else if (effect == EFFECT_LAST_RESORT) { // attacker needs to have used all other moves TURN { MOVE(attacker, MOVE_POUND); } } - else if (gMovesInfo[move].effect == EFFECT_DREAM_EATER - || gMovesInfo[move].effect == EFFECT_NIGHTMARE) + else if (effect == EFFECT_DREAM_EATER + || effect == EFFECT_NIGHTMARE) { // defender needs to be asleep TURN { MOVE(defender, MOVE_REST); } } - else if (gMovesInfo[move].effect == EFFECT_VENOM_DRENCH - || gMovesInfo[move].effect == EFFECT_PURIFY) + else if (effect == EFFECT_VENOM_DRENCH + || effect == EFFECT_PURIFY) { // defender needs to be poisoned TURN { MOVE(attacker, MOVE_POISON_POWDER); } } - else if (gMovesInfo[move].effect == EFFECT_TOPSY_TURVY) + else if (effect == EFFECT_TOPSY_TURVY) { // defender needs to have its stats buffed TURN { MOVE(defender, MOVE_SWORDS_DANCE); } } - else if (gMovesInfo[move].effect == EFFECT_AURORA_VEIL) + else if (effect == EFFECT_AURORA_VEIL) { // Has to be hailing TURN { MOVE(attacker, MOVE_HAIL); } } - else if (gMovesInfo[move].effect == EFFECT_HIT_SET_REMOVE_TERRAIN && gMovesInfo[move].argument.moveProperty == ARG_TRY_REMOVE_TERRAIN_FAIL) + else if (effect == EFFECT_STEEL_ROLLER) { // Needs a terrain TURN { MOVE(attacker, MOVE_ELECTRIC_TERRAIN); } } + else if (gMovesInfo[move].effect == EFFECT_WEATHER_BALL && variation > 0) + { + if (variation == 1) + TURN { MOVE(attacker, MOVE_SUNNY_DAY); } + else if (variation == 2) + TURN { MOVE(attacker, MOVE_RAIN_DANCE); } + else if (variation == 3) + TURN { MOVE(attacker, MOVE_SANDSTORM); } + else + TURN { MOVE(attacker, MOVE_HAIL); } + } + else if (gMovesInfo[move].effect == EFFECT_TERRAIN_PULSE && variation > 0) + { + if (variation == 1) + TURN { MOVE(attacker, MOVE_ELECTRIC_TERRAIN); } + else if (variation == 2) + TURN { MOVE(attacker, MOVE_GRASSY_TERRAIN); } + else if (variation == 3) + TURN { MOVE(attacker, MOVE_PSYCHIC_TERRAIN); } + else if (variation == 4) + TURN { MOVE(attacker, MOVE_MISTY_TERRAIN); } + } + else if (gBattleMoveEffects[gMovesInfo[move].effect].twoTurnEffect) + { + TURN { MOVE(attacker, move); } + } // Effective turn TURN { if (TargetHasToMove(move)) { - MOVE(defender, gMovesInfo[move].effect == EFFECT_MIRROR_COAT ? MOVE_SWIFT : MOVE_POUND); + MOVE(defender, effect == EFFECT_MIRROR_COAT ? MOVE_SWIFT : MOVE_POUND); MOVE(attacker, move); } - else if (gMovesInfo[move].effect == EFFECT_SNATCH) + else if (effect == EFFECT_SNATCH) { // defender needs to steal the defender's buffing move MOVE(attacker, move); MOVE(defender, MOVE_SWORDS_DANCE); } - else if (gMovesInfo[move].effect == EFFECT_OHKO) + else if (effect == EFFECT_OHKO || effect == EFFECT_SHEER_COLD) { // defender needs to send out a different team member MOVE(attacker, move); SEND_OUT(defender, 1); @@ -183,46 +318,97 @@ static void WhenSingles(u32 move, struct BattlePokemon *attacker, struct BattleP MOVE(attacker, move); MOVE(defender, MOVE_POUND); } - else if (gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING) + else if (effect == EFFECT_REVIVAL_BLESSING) { // attacker selects party member MOVE(attacker, move, partyIndex: 1); MOVE(defender, MOVE_HELPING_HAND); } - else if (gMovesInfo[move].effect == EFFECT_UPPER_HAND) + else if (effect == EFFECT_UPPER_HAND) { // defender needs to choose priority move MOVE(attacker, move); MOVE(defender, MOVE_QUICK_ATTACK); } - else if (gMovesInfo[move].effect == EFFECT_ACUPRESSURE) + else if (effect == EFFECT_ACUPRESSURE) { MOVE(attacker, move, target: attacker); } + else if (gBattleMoveEffects[gMovesInfo[move].effect].twoTurnEffect) + { + MOVE(defender, MOVE_HELPING_HAND); + SKIP_TURN(attacker); + } + else if (gMovesInfo[move].effect == EFFECT_PRESENT) + { + if (variation == 0) + MOVE(attacker, move, WITH_RNG(RNG_PRESENT, 1)); + else if (variation == 1) + MOVE(attacker, move, WITH_RNG(RNG_PRESENT, 254)); + } + else if (gMovesInfo[move].effect == EFFECT_MAGNITUDE) + { + if (variation == 0) + MOVE(attacker, move, WITH_RNG(RNG_MAGNITUDE, 50)); + else if (variation == 1) + MOVE(attacker, move, WITH_RNG(RNG_MAGNITUDE, 99)); + } + else if (gMovesInfo[move].effect == EFFECT_FICKLE_BEAM) + { + if (variation == 0) + MOVE(attacker, move, WITH_RNG(RNG_FICKLE_BEAM, FALSE)); + else if (variation == 1) + MOVE(attacker, move, WITH_RNG(RNG_FICKLE_BEAM, TRUE)); + } + else if (gMovesInfo[move].effect == EFFECT_SHELL_SIDE_ARM) + { + if (variation == 0) + MOVE(attacker, move, WITH_RNG(RNG_SHELL_SIDE_ARM, FALSE)); + else if (variation == 1) + MOVE(attacker, move, WITH_RNG(RNG_SHELL_SIDE_ARM, TRUE)); + } else { // All other moves MOVE(defender, MOVE_HELPING_HAND); // Helping Hand, so there's no anim on the defender's side. MOVE(attacker, move); } } + if (gMovesInfo[move].effect == EFFECT_WISH) + { + TURN {}; + } + else if (gMovesInfo[move].effect == EFFECT_FUTURE_SIGHT) + { + TURN {}; + TURN {}; + } + else if (gMovesInfo[move].effect == EFFECT_ROLLOUT) + { + TURN {MOVE(attacker, move);}; + TURN {MOVE(attacker, move);}; + TURN {MOVE(attacker, move);}; + TURN {MOVE(attacker, move);}; + TURN {MOVE(attacker, MOVE_HELPING_HAND);}; + } } static void SceneSingles(u32 move, struct BattlePokemon *mon) { - if (gMovesInfo[move].effect == EFFECT_FOLLOW_ME - || gMovesInfo[move].effect == EFFECT_HELPING_HAND - || gMovesInfo[move].effect == EFFECT_AFTER_YOU - || gMovesInfo[move].effect == EFFECT_ALLY_SWITCH - || gMovesInfo[move].effect == EFFECT_AROMATIC_MIST + enum BattleMoveEffects effect = GetMoveEffect(move); + if (effect == EFFECT_FOLLOW_ME + || effect == EFFECT_HELPING_HAND + || effect == EFFECT_AFTER_YOU + || effect == EFFECT_ALLY_SWITCH + || effect == EFFECT_AROMATIC_MIST || move == MOVE_HOLD_HANDS // Hack here because it shares its effect with Splash and Celebrate - || gMovesInfo[move].effect == EFFECT_COACHING - || gMovesInfo[move].effect == EFFECT_DRAGON_CHEER) + || effect == EFFECT_COACHING + || effect == EFFECT_DRAGON_CHEER) { // Moves that fail in Single Battles } - else if (gMovesInfo[move].effect == EFFECT_MIRROR_MOVE) // Copy the opponent's move + else if (effect == EFFECT_MIRROR_MOVE) // Copy the opponent's move { ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, mon); } - else if (gMovesInfo[move].effect == EFFECT_NATURE_POWER) // Recorded battles always use BATTLE_TERRAIN_BUILDING + else if (effect == EFFECT_NATURE_POWER) // Recorded battles always use BATTLE_ENVIRONMENT_BUILDING { ANIMATION(ANIM_TYPE_MOVE, B_NATURE_POWER_MOVES >= GEN_4 ? MOVE_TRI_ATTACK : MOVE_SWIFT, mon); } @@ -232,72 +418,102 @@ static void SceneSingles(u32 move, struct BattlePokemon *mon) } } -static void DoublesWhen(u32 move, struct BattlePokemon *attacker, struct BattlePokemon *target, struct BattlePokemon *ignore1, struct BattlePokemon *ignore2) +static void DoublesWhen(u32 move, struct BattlePokemon *attacker, struct BattlePokemon *target, struct BattlePokemon *ignore1, struct BattlePokemon *ignore2, u32 variation) { + enum BattleMoveEffects effect = GetMoveEffect(move); // Setup turn - if (gMovesInfo[move].effect == EFFECT_SNORE - || gMovesInfo[move].effect == EFFECT_SLEEP_TALK) + if (effect == EFFECT_SNORE + || effect == EFFECT_SLEEP_TALK) { // Player needs to be asleep TURN { MOVE(attacker, MOVE_REST); } } - else if (gMovesInfo[move].effect == EFFECT_SPIT_UP - || gMovesInfo[move].effect == EFFECT_SWALLOW) + else if (effect == EFFECT_SPIT_UP + || effect == EFFECT_SWALLOW) { // Player needs to have used Stockpile - TURN { MOVE(attacker, MOVE_STOCKPILE); } + for (u32 i = 0; i <= variation; i++) + { + TURN { MOVE(attacker, MOVE_STOCKPILE); } + } } - else if ((gMovesInfo[move].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS && gMovesInfo[move].argument.status == STATUS1_PARALYSIS)) + else if ((effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS && GetMoveEffectArg_Status(move) == STATUS1_PARALYSIS)) { // Opponent needs to be paralyzed TURN { MOVE(attacker, MOVE_THUNDER_WAVE, target: target); } } - else if (gMovesInfo[move].effect == EFFECT_RECYCLE - || gMovesInfo[move].effect == EFFECT_BELCH) + else if (effect == EFFECT_RECYCLE + || effect == EFFECT_BELCH) { // Player needs to have eaten its Berry TURN { MOVE(attacker, MOVE_STUFF_CHEEKS); } } - else if (gMovesInfo[move].effect == EFFECT_REFRESH - || gMovesInfo[move].effect == EFFECT_PSYCHO_SHIFT) + else if (effect == EFFECT_REFRESH + || effect == EFFECT_PSYCHO_SHIFT) { // Player needs to be paralyzed TURN { MOVE(target, MOVE_THUNDER_WAVE, target: attacker); } } - else if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) + else if (effect == EFFECT_LAST_RESORT) { // Player needs to have used all other moves TURN { MOVE(attacker, MOVE_POUND, target: target); } } - else if (gMovesInfo[move].effect == EFFECT_DREAM_EATER - || gMovesInfo[move].effect == EFFECT_NIGHTMARE) + else if (effect == EFFECT_DREAM_EATER + || effect == EFFECT_NIGHTMARE) { // Opponent needs to be asleep TURN { MOVE(target, MOVE_REST); } } - else if (gMovesInfo[move].effect == EFFECT_VENOM_DRENCH - || gMovesInfo[move].effect == EFFECT_PURIFY) + else if (effect == EFFECT_VENOM_DRENCH + || effect == EFFECT_PURIFY) { // Opponent needs to be poisoned TURN { MOVE(attacker, MOVE_POISON_POWDER, target: target); } } - else if (gMovesInfo[move].effect == EFFECT_TOPSY_TURVY) + else if (effect == EFFECT_TOPSY_TURVY) { // Opponent needs to have its stats buffed TURN { MOVE(target, MOVE_SWORDS_DANCE); } } - else if (gMovesInfo[move].effect == EFFECT_AURORA_VEIL) + else if (effect == EFFECT_AURORA_VEIL) { // Has to be hailing TURN { MOVE(attacker, MOVE_HAIL); } } - else if (gMovesInfo[move].effect == EFFECT_HIT_SET_REMOVE_TERRAIN && gMovesInfo[move].argument.moveProperty == ARG_TRY_REMOVE_TERRAIN_FAIL) + else if (effect == EFFECT_STEEL_ROLLER) { // Needs a terrain TURN { MOVE(attacker, MOVE_ELECTRIC_TERRAIN); } } + else if (gMovesInfo[move].effect == EFFECT_WEATHER_BALL && variation > 0) + { + if (variation == 1) + TURN { MOVE(attacker, MOVE_SUNNY_DAY); } + else if (variation == 2) + TURN { MOVE(attacker, MOVE_RAIN_DANCE); } + else if (variation == 3) + TURN { MOVE(attacker, MOVE_SANDSTORM); } + else + TURN { MOVE(attacker, MOVE_HAIL); } + } + else if (gMovesInfo[move].effect == EFFECT_TERRAIN_PULSE && variation > 0) + { + if (variation == 1) + TURN { MOVE(attacker, MOVE_ELECTRIC_TERRAIN); } + else if (variation == 2) + TURN { MOVE(attacker, MOVE_GRASSY_TERRAIN); } + else if (variation == 3) + TURN { MOVE(attacker, MOVE_PSYCHIC_TERRAIN); } + else if (variation == 4) + TURN { MOVE(attacker, MOVE_MISTY_TERRAIN); } + } + else if (gBattleMoveEffects[gMovesInfo[move].effect].twoTurnEffect) + { + TURN { MOVE(attacker, move, target: target); } + } // Effective turn TURN { if (TargetHasToMove(move)) { // Opponent needs to hit the player first - MOVE(target, gMovesInfo[move].effect == EFFECT_MIRROR_COAT ? MOVE_SWIFT : MOVE_POUND, target: attacker); + MOVE(target, effect == EFFECT_MIRROR_COAT ? MOVE_SWIFT : MOVE_POUND, target: attacker); MOVE(attacker, move, target: target); } - else if (gMovesInfo[move].effect == EFFECT_SNATCH) + else if (effect == EFFECT_SNATCH) { // Opponent needs to steal the opponent's buffing move MOVE(attacker, move, target: target); MOVE(target, MOVE_SWORDS_DANCE); } - else if (gMovesInfo[move].effect == EFFECT_OHKO) + else if (effect == EFFECT_OHKO || effect == EFFECT_SHEER_COLD) { // Opponent needs to send out a different team member MOVE(attacker, move, target: target); SEND_OUT(target, 2); @@ -312,49 +528,100 @@ static void DoublesWhen(u32 move, struct BattlePokemon *attacker, struct BattleP MOVE(attacker, move, target: target); MOVE(target, MOVE_POUND, target: attacker); } - else if (gMovesInfo[move].effect == EFFECT_AFTER_YOU) + else if (effect == EFFECT_AFTER_YOU) { // Player goes first, opponent third MOVE(attacker, move, target: target); MOVE(ignore1, MOVE_CELEBRATE); MOVE(target, MOVE_POUND, target: attacker); MOVE(ignore2, MOVE_CELEBRATE); } - else if (gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING) + else if (effect == EFFECT_REVIVAL_BLESSING) { // Player selects party member MOVE(attacker, move, partyIndex: 2); MOVE(target, MOVE_LAST_RESORT, target: attacker); // Last Resort, so there's no anim on the opponent's side. } - else if (gMovesInfo[move].effect == EFFECT_UPPER_HAND) + else if (effect == EFFECT_UPPER_HAND) { // Opponent needs to choose priority move MOVE(attacker, move, target: target); MOVE(target, MOVE_QUICK_ATTACK, target: attacker); } + else if (gBattleMoveEffects[gMovesInfo[move].effect].twoTurnEffect) + { + MOVE(target, MOVE_LAST_RESORT, target: attacker); + SKIP_TURN(attacker); + } + else if (gMovesInfo[move].effect == EFFECT_PRESENT) + { + if (variation == 0) + MOVE(attacker, move, target: target, WITH_RNG(RNG_PRESENT, 1)); + else if (variation == 1) + MOVE(attacker, move, target: target, WITH_RNG(RNG_PRESENT, 254)); + } + else if (gMovesInfo[move].effect == EFFECT_MAGNITUDE) + { + if (variation == 0) + MOVE(attacker, move, WITH_RNG(RNG_MAGNITUDE, 50)); + else if (variation == 1) + MOVE(attacker, move, WITH_RNG(RNG_MAGNITUDE, 99)); + } + else if (gMovesInfo[move].effect == EFFECT_FICKLE_BEAM) + { + if (variation == 0) + MOVE(attacker, move, target: target, WITH_RNG(RNG_FICKLE_BEAM, FALSE)); + else if (variation == 1) + MOVE(attacker, move, target: target, WITH_RNG(RNG_FICKLE_BEAM, TRUE)); + } + else if (gMovesInfo[move].effect == EFFECT_SHELL_SIDE_ARM) + { + if (variation == 0) + MOVE(attacker, move, target: target, WITH_RNG(RNG_SHELL_SIDE_ARM, FALSE)); + else if (variation == 1) + MOVE(attacker, move, target: target, WITH_RNG(RNG_SHELL_SIDE_ARM, TRUE)); + } else { // All other moves MOVE(target, MOVE_LAST_RESORT, target: attacker); // Last Resort, so there's no anim on the opponent's side. MOVE(attacker, move, target: target); } - if (gMovesInfo[move].effect != EFFECT_AFTER_YOU) + if (effect != EFFECT_AFTER_YOU) { // Actions for the remaining battlers MOVE(ignore1, MOVE_CELEBRATE); MOVE(ignore2, MOVE_CELEBRATE); } } + if (gMovesInfo[move].effect == EFFECT_WISH) + { + TURN {}; + } + else if (gMovesInfo[move].effect == EFFECT_FUTURE_SIGHT) + { + TURN {}; + TURN {}; + } + else if (gMovesInfo[move].effect == EFFECT_ROLLOUT) + { + TURN {MOVE(attacker, move, target: target);}; + TURN {MOVE(attacker, move, target: target);}; + TURN {MOVE(attacker, move, target: target);}; + TURN {MOVE(attacker, move, target: target);}; + TURN {MOVE(attacker, MOVE_LAST_RESORT, target: attacker);}; + } } static void DoublesScene(u32 move, struct BattlePokemon *attacker) { - if (gMovesInfo[move].effect == EFFECT_MAGNETIC_FLUX || gMovesInfo[move].effect == EFFECT_GEAR_UP) // For some reason, Magnetic Flux and Gear Up are failing in Double Battles here + enum BattleMoveEffects effect = GetMoveEffect(move); + if (effect == EFFECT_MAGNETIC_FLUX || effect == EFFECT_GEAR_UP) // For some reason, Magnetic Flux and Gear Up are failing in Double Battles here { // Moves that fail in Double Battles } - else if (gMovesInfo[move].effect == EFFECT_MIRROR_MOVE) + else if (effect == EFFECT_MIRROR_MOVE) { // Copy the opponent's move ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, attacker); } - else if (gMovesInfo[move].effect == EFFECT_NATURE_POWER) - { // Recorded battles always use BATTLE_TERRAIN_BUILDING + else if (effect == EFFECT_NATURE_POWER) + { // Recorded battles always use BATTLE_ENVIRONMENT_BUILDING ANIMATION(ANIM_TYPE_MOVE, B_NATURE_POWER_MOVES >= GEN_4 ? MOVE_TRI_ATTACK : MOVE_SWIFT, attacker); } else @@ -371,82 +638,104 @@ static void DoublesScene(u32 move, struct BattlePokemon *attacker) SINGLE_BATTLE_TEST("Move Animations don't leak when used - Singles (player to opponent)") { u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 k = 0, variation = 0, variationsNumber; + u32 friendship = 0, tempFriendship; u32 tempMove, tempSpecies; FORCE_MOVE_ANIM(TRUE); for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); - PARAMETRIZE { move = tempMove; species = tempSpecies; } + variationsNumber = GetVariationsNumber(j, FALSE); + for (k = 0; k < variationsNumber; k++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); + tempFriendship = ParametrizeFriendship(j, k); + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + } } GIVEN { PLAYER(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) + if (GetMoveEffect(move) != EFFECT_BESTOW) Item(ITEM_ORAN_BERRY); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } } WHEN { - WhenSingles(move, player, opponent); + WhenSingles(move, player, opponent, variation); } SCENE { SceneSingles(move, player); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } SINGLE_BATTLE_TEST("Move Animations don't leak when used - Singles (opponent to player)") { u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 k = 0, variation = 0, variationsNumber; + u32 friendship = 0, tempFriendship; u32 tempMove, tempSpecies; FORCE_MOVE_ANIM(TRUE); for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); - PARAMETRIZE { move = tempMove; species = tempSpecies; } + variationsNumber = GetVariationsNumber(j, FALSE); + for (k = 0; k < variationsNumber; k++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); + tempFriendship = ParametrizeFriendship(j, k); + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + } } GIVEN { OPPONENT(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) + if (GetMoveEffect(move) != EFFECT_BESTOW) Item(ITEM_ORAN_BERRY); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } } WHEN { - WhenSingles(move, opponent, player); + WhenSingles(move, opponent, player, variation); } SCENE { SceneSingles(move, opponent); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft to opponentLeft)") { u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 k = 0, variation = 0, variationsNumber; + u32 friendship = 0, tempFriendship; u32 tempMove, tempSpecies; FORCE_MOVE_ANIM(TRUE); struct BattlePokemon *attacker = playerLeft; @@ -454,57 +743,70 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t struct BattlePokemon *ignore1 = playerRight; struct BattlePokemon *ignore2 = opponentRight; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); - PARAMETRIZE { move = tempMove; species = tempSpecies; } + variationsNumber = GetVariationsNumber(j, TRUE); + for (k = 0; k < variationsNumber; k++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); + tempFriendship = ParametrizeFriendship(j, k); + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + } } GIVEN { PLAYER(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } PLAYER(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) + if (GetMoveEffect(move) != EFFECT_BESTOW) Item(ITEM_ORAN_BERRY); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) + if (GetMoveEffect(move) != EFFECT_BESTOW) Item(ITEM_ORAN_BERRY); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } } WHEN { - DoublesWhen(move, attacker, target, ignore1, ignore2); + DoublesWhen(move, attacker, target, ignore1, ignore2, variation); } SCENE { DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft to playerLeft)") { u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 k = 0, variation = 0, variationsNumber; + u32 friendship = 0, tempFriendship; u32 tempMove, tempSpecies; FORCE_MOVE_ANIM(TRUE); struct BattlePokemon *attacker = opponentLeft; @@ -512,58 +814,71 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft struct BattlePokemon *ignore1 = opponentRight; struct BattlePokemon *ignore2 = playerRight; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); - PARAMETRIZE { move = tempMove; species = tempSpecies; } + variationsNumber = GetVariationsNumber(j, TRUE); + for (k = 0; k < variationsNumber; k++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); + tempFriendship = ParametrizeFriendship(j, k); + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + } } GIVEN { OPPONENT(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } OPPONENT(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } } WHEN { - DoublesWhen(move, attacker, target, ignore1, ignore2); + DoublesWhen(move, attacker, target, ignore1, ignore2, variation); } SCENE { DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft to opponentRight)") { u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 k = 0, variation = 0, variationsNumber; + u32 friendship = 0, tempFriendship; u32 tempMove, tempSpecies; FORCE_MOVE_ANIM(TRUE); struct BattlePokemon *attacker = playerLeft; @@ -571,58 +886,71 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t struct BattlePokemon *ignore1 = playerRight; struct BattlePokemon *ignore2 = opponentLeft; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); - PARAMETRIZE { move = tempMove; species = tempSpecies; } + variationsNumber = GetVariationsNumber(j, TRUE); + for (k = 0; k < variationsNumber; k++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); + tempFriendship = ParametrizeFriendship(j, k); + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + } } GIVEN { PLAYER(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } PLAYER(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } } WHEN { - DoublesWhen(move, attacker, target, ignore1, ignore2); + DoublesWhen(move, attacker, target, ignore1, ignore2, variation); } SCENE { DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRight to playerLeft)") { u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 k = 0, variation = 0, variationsNumber; + u32 friendship = 0, tempFriendship; u32 tempMove, tempSpecies; FORCE_MOVE_ANIM(TRUE); struct BattlePokemon *attacker = opponentRight; @@ -630,58 +958,71 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh struct BattlePokemon *ignore1 = opponentLeft; struct BattlePokemon *ignore2 = playerRight; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); - PARAMETRIZE { move = tempMove; species = tempSpecies; } + variationsNumber = GetVariationsNumber(j, TRUE); + for (k = 0; k < variationsNumber; k++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); + tempFriendship = ParametrizeFriendship(j, k); + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + } } GIVEN { OPPONENT(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } OPPONENT(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } } WHEN { - DoublesWhen(move, attacker, target, ignore1, ignore2); + DoublesWhen(move, attacker, target, ignore1, ignore2, variation); } SCENE { DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight to opponentLeft)") { u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 k = 0, variation = 0, variationsNumber; + u32 friendship = 0, tempFriendship; u32 tempMove, tempSpecies; FORCE_MOVE_ANIM(TRUE); struct BattlePokemon *attacker = playerRight; @@ -689,58 +1030,71 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight struct BattlePokemon *ignore1 = playerLeft; struct BattlePokemon *ignore2 = opponentRight; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); - PARAMETRIZE { move = tempMove; species = tempSpecies; } + variationsNumber = GetVariationsNumber(j, TRUE); + for (k = 0; k < variationsNumber; k++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); + tempFriendship = ParametrizeFriendship(j, k); + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + } } GIVEN { PLAYER(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } PLAYER(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } } WHEN { - DoublesWhen(move, attacker, target, ignore1, ignore2); + DoublesWhen(move, attacker, target, ignore1, ignore2, variation); } SCENE { DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft to playerRight)") { u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 k = 0, variation = 0, variationsNumber; + u32 friendship = 0, tempFriendship; u32 tempMove, tempSpecies; FORCE_MOVE_ANIM(TRUE); struct BattlePokemon *attacker = opponentLeft; @@ -748,58 +1102,71 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft struct BattlePokemon *ignore1 = playerLeft; struct BattlePokemon *ignore2 = opponentRight; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); - PARAMETRIZE { move = tempMove; species = tempSpecies; } + variationsNumber = GetVariationsNumber(j, TRUE); + for (k = 0; k < variationsNumber; k++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); + tempFriendship = ParametrizeFriendship(j, k); + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + } } GIVEN { OPPONENT(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } OPPONENT(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } } WHEN { - DoublesWhen(move, attacker, target, ignore1, ignore2); + DoublesWhen(move, attacker, target, ignore1, ignore2, variation); } SCENE { DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight to opponentRight)") { u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 k = 0, variation = 0, variationsNumber; + u32 friendship = 0, tempFriendship; u32 tempMove, tempSpecies; FORCE_MOVE_ANIM(TRUE); struct BattlePokemon *attacker = playerRight; @@ -807,58 +1174,71 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight struct BattlePokemon *ignore1 = playerLeft; struct BattlePokemon *ignore2 = opponentLeft; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); - PARAMETRIZE { move = tempMove; species = tempSpecies; } + variationsNumber = GetVariationsNumber(j, TRUE); + for (k = 0; k < variationsNumber; k++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); + tempFriendship = ParametrizeFriendship(j, k); + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + } } GIVEN { PLAYER(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } PLAYER(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } } WHEN { - DoublesWhen(move, attacker, target, ignore1, ignore2); + DoublesWhen(move, attacker, target, ignore1, ignore2, variation); } SCENE { DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRight to playerRight)") { u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 k = 0, variation = 0, variationsNumber; + u32 friendship = 0, tempFriendship; u32 tempMove, tempSpecies; FORCE_MOVE_ANIM(TRUE); struct BattlePokemon *attacker = opponentRight; @@ -866,52 +1246,63 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh struct BattlePokemon *ignore1 = playerLeft; struct BattlePokemon *ignore2 = opponentLeft; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); - PARAMETRIZE { move = tempMove; species = tempSpecies; } + variationsNumber = GetVariationsNumber(j, TRUE); + for (k = 0; k < variationsNumber; k++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); + tempFriendship = ParametrizeFriendship(j, k); + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + } } GIVEN { OPPONENT(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } OPPONENT(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } } WHEN { - DoublesWhen(move, attacker, target, ignore1, ignore2); + DoublesWhen(move, attacker, target, ignore1, ignore2, variation); } SCENE { DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -926,7 +1317,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t struct BattlePokemon *ignore1 = opponentRight; struct BattlePokemon *ignore2 = opponentLeft; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, 0); PARAMETRIZE { move = tempMove; species = tempSpecies; } } GIVEN { @@ -934,7 +1325,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); if (attacker == opponentLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); } } @@ -942,23 +1333,23 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); if (attacker == opponentRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); } } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } @@ -970,7 +1361,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t } THEN { FORCE_MOVE_ANIM(FALSE); if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); } } @@ -985,7 +1376,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight struct BattlePokemon *ignore1 = opponentRight; struct BattlePokemon *ignore2 = opponentLeft; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, 0); PARAMETRIZE { move = tempMove; species = tempSpecies; } } GIVEN { @@ -993,7 +1384,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); if (attacker == opponentLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); } } @@ -1001,23 +1392,23 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); if (attacker == opponentRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); } } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } @@ -1029,7 +1420,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight } THEN { FORCE_MOVE_ANIM(FALSE); if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); } } @@ -1044,7 +1435,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentleft struct BattlePokemon *ignore1 = playerLeft; struct BattlePokemon *ignore2 = playerRight; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, 0); PARAMETRIZE { move = tempMove; species = tempSpecies; } } GIVEN { @@ -1052,7 +1443,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentleft HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); if (attacker == opponentLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); } } @@ -1060,23 +1451,23 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentleft HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); if (attacker == opponentRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); } } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } @@ -1088,7 +1479,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentleft } THEN { FORCE_MOVE_ANIM(FALSE); if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); } } @@ -1103,7 +1494,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh struct BattlePokemon *ignore1 = playerLeft; struct BattlePokemon *ignore2 = playerRight; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, 0); PARAMETRIZE { move = tempMove; species = tempSpecies; } } GIVEN { @@ -1111,7 +1502,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); if (attacker == opponentLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); } } @@ -1119,23 +1510,23 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); if (attacker == opponentRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); } } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } @@ -1147,12 +1538,71 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh } THEN { FORCE_MOVE_ANIM(FALSE); if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); } } */ +SINGLE_BATTLE_TEST("Move Animations occur before their stat change animations - Singles (player to opponent)") +{ + u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 k = 0, variation = 0, variationsNumber; + u32 friendship = 0, tempFriendship; + u32 tempMove, tempSpecies; + FORCE_MOVE_ANIM(TRUE); + for (; j <= ANIM_TEST_END_MOVE; j++) { + variationsNumber = GetVariationsNumber(j, FALSE); + for (k = 0; k < variationsNumber; k++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); + tempFriendship = ParametrizeFriendship(j, k); + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + } + } + GIVEN { + PLAYER(species) { + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); + if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); + } + PLAYER(SPECIES_WOBBUFFET) { + Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + } + OPPONENT(SPECIES_WOBBUFFET) { + Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); + if (GetMoveEffect(move) != EFFECT_BESTOW) + Item(ITEM_ORAN_BERRY); + } + OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } + } WHEN { + WhenSingles(move, player, opponent, variation); + } SCENE { + if (!(GetMoveEffect(move) == EFFECT_RECYCLE + || GetMoveEffect(move) == EFFECT_BELCH + || GetMoveEffect(move) == EFFECT_SPIT_UP + || GetMoveEffect(move) == EFFECT_SWALLOW + || GetMoveEffect(move) == EFFECT_TOPSY_TURVY)) // require a move that boosts stats before using this move + { + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } + } + SceneSingles(move, player); + } THEN { + FORCE_MOVE_ANIM(FALSE); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); + EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); + } +} + // Z-Moves #define Z_MOVE_PARAMETERS PARAMETRIZE { zmove = MOVE_BREAKNECK_BLITZ; species = SPECIES_WOBBUFFET; move = MOVE_TACKLE; item = ITEM_NORMALIUM_Z; } \ PARAMETRIZE { zmove = MOVE_INFERNO_OVERDRIVE; species = SPECIES_WOBBUFFET; move = MOVE_EMBER; item = ITEM_FIRIUM_Z; } \ @@ -1215,9 +1665,10 @@ SINGLE_BATTLE_TEST("Z-Moves don't leak when used - Singles (player to opponent)" ANIMATION(ANIM_TYPE_MOVE, zmove, player); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1244,9 +1695,10 @@ SINGLE_BATTLE_TEST("Z-Moves don't leak when used - Singles (opponent to player)" ANIMATION(ANIM_TYPE_MOVE, zmove, opponent); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1275,9 +1727,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (playerLeft to oppone ANIMATION(ANIM_TYPE_MOVE, zmove, playerLeft); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1306,9 +1759,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (playerLeft to oppone ANIMATION(ANIM_TYPE_MOVE, zmove, playerLeft); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1337,9 +1791,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (playerRight to oppon ANIMATION(ANIM_TYPE_MOVE, zmove, playerRight); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1368,9 +1823,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (playerRight to oppon ANIMATION(ANIM_TYPE_MOVE, zmove, playerRight); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1399,9 +1855,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (opponentLeft to play ANIMATION(ANIM_TYPE_MOVE, zmove, opponentLeft); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1430,9 +1887,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (opponentLeft to play ANIMATION(ANIM_TYPE_MOVE, zmove, opponentLeft); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1461,9 +1919,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (opponentRight to pla ANIMATION(ANIM_TYPE_MOVE, zmove, opponentRight); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1492,12 +1951,280 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (opponentRight to pla ANIMATION(ANIM_TYPE_MOVE, zmove, opponentRight); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } // Max Moves +// Tera Blast and all type variants +#define TERA_BLAST_PARAMETERS PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_NORMAL; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_FIGHTING; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_FLYING; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_POISON; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_GROUND; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_ROCK; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_BUG; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_GHOST; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_STEEL; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_WATER; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_FIRE; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_GRASS; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_ELECTRIC; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_PSYCHIC; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_ICE; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_DRAGON; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_DARK; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_FAIRY; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_STELLAR; } + +SINGLE_BATTLE_TEST("Tera Blast doesn't leak when used - Singles (player to opponent)") +{ + FORCE_MOVE_ANIM(TRUE); + u32 species, move, type; + TERA_BLAST_PARAMETERS; + GIVEN { + PLAYER(species) { TeraType(type); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); } + } WHEN { + TURN { MOVE(player, move, gimmick: GIMMICK_TERA); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, player); + ANIMATION(ANIM_TYPE_MOVE, move, player); + } THEN { + FORCE_MOVE_ANIM(FALSE); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); + EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); + } +} + +SINGLE_BATTLE_TEST("Tera Blast doesn't leak when used - Singles (opponent to player)") +{ + FORCE_MOVE_ANIM(TRUE); + u32 species, move, type; + TERA_BLAST_PARAMETERS; + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); } + OPPONENT(species) { TeraType(type); } + } WHEN { + TURN { MOVE(opponent, move, gimmick: GIMMICK_TERA); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, opponent); + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + } THEN { + FORCE_MOVE_ANIM(FALSE); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); + EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); + } +} + +DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (playerLeft to opponentLeft)") +{ + FORCE_MOVE_ANIM(TRUE); + u32 species, move, type; + TERA_BLAST_PARAMETERS; + GIVEN { + PLAYER(species) { TeraType(type); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); } + OPPONENT(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); } + } WHEN { + TURN { MOVE(playerLeft, move, gimmick: GIMMICK_TERA, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); + } THEN { + FORCE_MOVE_ANIM(FALSE); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); + EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); + } +} + +DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (playerLeft to opponentRight)") +{ + FORCE_MOVE_ANIM(TRUE); + u32 species, move, type; + TERA_BLAST_PARAMETERS; + GIVEN { + PLAYER(species) { TeraType(type); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); } + OPPONENT(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); } + } WHEN { + TURN { MOVE(playerLeft, move, gimmick: GIMMICK_TERA, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); + } THEN { + FORCE_MOVE_ANIM(FALSE); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); + EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); + } +} + +DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (playerRight to opponentLeft)") +{ + FORCE_MOVE_ANIM(TRUE); + u32 species, move, type; + TERA_BLAST_PARAMETERS; + GIVEN { + PLAYER(SPECIES_WYNAUT); + PLAYER(species) { TeraType(type); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); } + OPPONENT(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); } + } WHEN { + TURN { MOVE(playerRight, move, gimmick: GIMMICK_TERA, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, playerRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, playerRight); + ANIMATION(ANIM_TYPE_MOVE, move, playerRight); + } THEN { + FORCE_MOVE_ANIM(FALSE); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); + EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); + } +} + +DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (playerRight to opponentRight)") +{ + FORCE_MOVE_ANIM(TRUE); + u32 species, move, type; + TERA_BLAST_PARAMETERS; + GIVEN { + PLAYER(SPECIES_WYNAUT); + PLAYER(species) { TeraType(type); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); } + OPPONENT(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); } + } WHEN { + TURN { MOVE(playerRight, move, gimmick: GIMMICK_TERA, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, playerRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, playerRight); + ANIMATION(ANIM_TYPE_MOVE, move, playerRight); + } THEN { + FORCE_MOVE_ANIM(FALSE); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); + EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); + } +} + +DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (opponentLeft to playerLeft)") +{ + FORCE_MOVE_ANIM(TRUE); + u32 species, move, type; + TERA_BLAST_PARAMETERS; + GIVEN { + PLAYER(species) { Item(ITEM_FOCUS_SASH); } + PLAYER(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); } + OPPONENT(SPECIES_WOBBUFFET) { TeraType(type); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, move, gimmick: GIMMICK_TERA, target: playerLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, move, opponentLeft); + } THEN { + FORCE_MOVE_ANIM(FALSE); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); + EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); + } +} + +DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (opponentLeft to playerRight)") +{ + FORCE_MOVE_ANIM(TRUE); + u32 species, move, type; + TERA_BLAST_PARAMETERS; + GIVEN { + PLAYER(species) { Item(ITEM_FOCUS_SASH); } + PLAYER(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); } + OPPONENT(SPECIES_WOBBUFFET) { TeraType(type); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, move, gimmick: GIMMICK_TERA, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, move, opponentLeft); + } THEN { + FORCE_MOVE_ANIM(FALSE); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); + EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); + } +} + +DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (opponentRight to playerLeft)") +{ + FORCE_MOVE_ANIM(TRUE); + u32 species, move, type; + TERA_BLAST_PARAMETERS; + GIVEN { + PLAYER(species) { Item(ITEM_FOCUS_SASH); } + PLAYER(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT) { TeraType(type); } + } WHEN { + TURN { MOVE(opponentRight, move, gimmick: GIMMICK_TERA, target: playerLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, opponentRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, move, opponentRight); + } THEN { + FORCE_MOVE_ANIM(FALSE); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); + EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); + } +} + +DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (opponentRight to playerRight)") +{ + FORCE_MOVE_ANIM(TRUE); + u32 species, move, type; + TERA_BLAST_PARAMETERS; + GIVEN { + PLAYER(species) { Item(ITEM_FOCUS_SASH); } + PLAYER(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT) { TeraType(type); } + } WHEN { + TURN { MOVE(opponentRight, move, gimmick: GIMMICK_TERA, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, opponentRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, move, opponentRight); + } THEN { + FORCE_MOVE_ANIM(FALSE); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); + EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); + } +} + #endif diff --git a/test/battle/move_effect/absorb.c b/test/battle/move_effect/absorb.c index 456c888cd483..922d16fa0c6c 100644 --- a/test/battle/move_effect/absorb.c +++ b/test/battle/move_effect/absorb.c @@ -104,3 +104,31 @@ SINGLE_BATTLE_TEST("Absorb does not drain any HP if user flinched") } TO_DO_BATTLE_TEST("Absorb recovers 50% of the damage dealt to a Substitute"); + +SINGLE_BATTLE_TEST("Absorb does not drain any HP if user does 0 damage") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + } WHEN { + TURN { MOVE(opponent, MOVE_ENDURE); MOVE(player, MOVE_ABSORB); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENDURE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ABSORB, player); + NOT MESSAGE("The opposing Wobbuffet had its energy drained!"); + } +} + +SINGLE_BATTLE_TEST("Absorb does not drain any HP if the move is blocked by Disguise") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_MIMIKYU) { Ability(ABILITY_DISGUISE); } + } WHEN { + TURN { MOVE(player, MOVE_ABSORB); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ABSORB, player); + } THEN { + EXPECT_EQ(player->hp, 1); + } +} diff --git a/test/battle/move_effect/acrobatics.c b/test/battle/move_effect/acrobatics.c index 809b77f9487c..916580d90b08 100644 --- a/test/battle/move_effect/acrobatics.c +++ b/test/battle/move_effect/acrobatics.c @@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Acrobatics doubles in power if the user has no held item", s } SCENE { HP_BAR(player, captureDamage: &results[i].damage); } FINALLY { - EXPECT_MUL_EQ(results[0].damage, Q_4_12(2), results[1].damage); + EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.0), results[1].damage); } } @@ -30,7 +30,6 @@ SINGLE_BATTLE_TEST("Acrobatics still doubles in power when Flying Gem is consume PARAMETRIZE { heldItem = ITEM_NONE; } PARAMETRIZE { heldItem = ITEM_FLYING_GEM; } GIVEN { - ASSUME(I_GEM_BOOST_POWER >= GEN_6); ASSUME(gItemsInfo[ITEM_FLYING_GEM].holdEffect == HOLD_EFFECT_GEMS); ASSUME(gItemsInfo[ITEM_FLYING_GEM].secondaryId == TYPE_FLYING); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/after_you.c b/test/battle/move_effect/after_you.c index 42eb0f3ff9a1..91742f45952e 100644 --- a/test/battle/move_effect/after_you.c +++ b/test/battle/move_effect/after_you.c @@ -52,7 +52,7 @@ DOUBLE_BATTLE_TEST("After You does nothing if the target has already moved") } } -DOUBLE_BATTLE_TEST("After You calculates correct turn order if only one pokemon is left on the opposing side") +DOUBLE_BATTLE_TEST("After You calculates correct turn order if only one PokΓ©mon is left on the opposing side") { GIVEN { PLAYER(SPECIES_GRENINJA) { Speed(120); } @@ -86,10 +86,35 @@ DOUBLE_BATTLE_TEST("After You calculates correct turn order if only one pokemon } } +DOUBLE_BATTLE_TEST("After You fails if the turn order remains the same after After You (Gen5-7)") +{ + GIVEN { + WITH_CONFIG(CONFIG_AFTER_YOU_TURN_ORDER, GEN_7); + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + PLAYER(SPECIES_WYNAUT) { Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WYNAUT) { Speed(3); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_CELEBRATE); + MOVE(playerRight, MOVE_CELEBRATE); + MOVE(opponentLeft, MOVE_CELEBRATE); + MOVE(opponentRight, MOVE_AFTER_YOU, target: opponentLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + MESSAGE("The opposing Wynaut used After You!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_AFTER_YOU, opponentRight); + MESSAGE("But it failed!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + } +} + DOUBLE_BATTLE_TEST("After You doesn't fail if the turn order remains the same after After You (Gen8+)") { GIVEN { - ASSUME(B_AFTER_YOU_TURN_ORDER >= GEN_8); + WITH_CONFIG(CONFIG_AFTER_YOU_TURN_ORDER, GEN_8); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } PLAYER(SPECIES_WYNAUT) { Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } diff --git a/test/battle/move_effect/ally_switch.c b/test/battle/move_effect/ally_switch.c index 1c28e51a9bfb..9b0117afe138 100644 --- a/test/battle/move_effect/ally_switch.c +++ b/test/battle/move_effect/ally_switch.c @@ -90,9 +90,9 @@ DOUBLE_BATTLE_TEST("Ally Switch does not redirect the target of Snipe Shot") } } -DOUBLE_BATTLE_TEST("Ally Switch does not redirect moves done by pokemon with Stalwart and Propeller Tail") +DOUBLE_BATTLE_TEST("Ally Switch does not redirect moves done by PokΓ©mon with Stalwart and Propeller Tail") { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_STALWART; } PARAMETRIZE { ability = ABILITY_PROPELLER_TAIL; } PARAMETRIZE { ability = ABILITY_TELEPATHY; } @@ -170,7 +170,7 @@ DOUBLE_BATTLE_TEST("Ally Switch - move fails if the target was ally which change DOUBLE_BATTLE_TEST("Ally Switch doesn't make self-targeting status moves fail") { GIVEN { - ASSUME(gMovesInfo[MOVE_HARDEN].target == MOVE_TARGET_USER); + ASSUME(GetMoveTarget(MOVE_HARDEN) == MOVE_TARGET_USER); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); @@ -185,10 +185,25 @@ DOUBLE_BATTLE_TEST("Ally Switch doesn't make self-targeting status moves fail") } } -DOUBLE_BATTLE_TEST("Ally Switch increases the Protect-like moves counter") +DOUBLE_BATTLE_TEST("Ally Switch doesn't increase the Protect-like moves counter (Gen5-8)") { GIVEN { - ASSUME(B_ALLY_SWITCH_FAIL_CHANCE >= GEN_9); + WITH_CONFIG(CONFIG_ALLY_SWITCH_FAIL_CHANCE, GEN_8); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_ALLY_SWITCH); } + } THEN { + EXPECT(gDisableStructs[B_POSITION_PLAYER_RIGHT].protectUses == 0); + } +} + +DOUBLE_BATTLE_TEST("Ally Switch increases the Protect-like moves counter (Gen9+)") +{ + GIVEN { + WITH_CONFIG(CONFIG_ALLY_SWITCH_FAIL_CHANCE, GEN_9); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -311,5 +326,85 @@ DOUBLE_BATTLE_TEST("Ally Switch swaps Illusion data") } } +DOUBLE_BATTLE_TEST("Ally switch updates last used moves for Mimic") +{ + GIVEN { + PLAYER(SPECIES_XATU) { Speed(100); } + PLAYER(SPECIES_RIOLU) { Speed(150); } + OPPONENT(SPECIES_FEAROW) { Speed(20); } + OPPONENT(SPECIES_ARON) { Speed(30); } + } WHEN { + TURN { MOVE(playerRight, MOVE_FAKE_OUT, target: opponentRight); MOVE(playerLeft, MOVE_ALLY_SWITCH); + MOVE(opponentLeft, MOVE_MIMIC, target: playerLeft); + } + } SCENE { + MESSAGE("Riolu used Fake Out!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FAKE_OUT, playerRight); + MESSAGE("Xatu used Ally Switch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, playerLeft); + MESSAGE("Xatu and Riolu switched places!"); + MESSAGE("The opposing Fearow used Mimic!"); + MESSAGE("The opposing Fearow learned Fake Out!"); + } +} + +DOUBLE_BATTLE_TEST("Ally Switch does not update leech seed battler") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_SOLOSIS); + OPPONENT(SPECIES_BULBASAUR) { HP(50); MaxHP(100); } + OPPONENT(SPECIES_RALTS) { HP(50); MaxHP(100); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_LEECH_SEED, target: playerLeft); } + TURN { MOVE(opponentRight, MOVE_ALLY_SWITCH); } + TURN { ; } + } SCENE { + // turn 1 + MESSAGE("The opposing Bulbasaur used Leech Seed!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_LEECH_SEED, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_LEECH_SEED_DRAIN, playerLeft); + HP_BAR(playerLeft); + HP_BAR(opponentLeft); + + MESSAGE("The opposing Ralts used Ally Switch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, opponentRight); + MESSAGE("The opposing Ralts and the opposing Bulbasaur switched places!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_LEECH_SEED_DRAIN, playerLeft); + HP_BAR(playerLeft); + HP_BAR(opponentLeft); // Ralts now gets hp gain + } THEN { + EXPECT_GT(opponentLeft->hp, 50); + EXPECT_GT(opponentRight->hp, 50); + } +} + +DOUBLE_BATTLE_TEST("Ally Switch updates attract battler") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(100); Gender(MON_MALE); } + PLAYER(SPECIES_SOLOSIS) { Speed(50); } + OPPONENT(SPECIES_CLEFAIRY) { Speed(20); Gender(MON_FEMALE); Ability(ABILITY_CUTE_CHARM); } + OPPONENT(SPECIES_RALTS) { Speed(30); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); } + TURN { MOVE(opponentRight, MOVE_ALLY_SWITCH); } + TURN { ; } + } SCENE { + // turn 1 + MESSAGE("Wobbuffet used Tackle!"); + HP_BAR(opponentLeft); + ABILITY_POPUP(opponentLeft, ABILITY_CUTE_CHARM); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_INFATUATION, playerLeft); + MESSAGE("The opposing Clefairy's Cute Charm infatuated Wobbuffet!"); + // turn 2 + MESSAGE("The opposing Ralts used Ally Switch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, opponentRight); + MESSAGE("The opposing Ralts and the opposing Clefairy switched places!"); + // turn 3 + MESSAGE("Wobbuffet is in love with the opposing Clefairy!"); // tracks attract battler + } +} + // Triple Battles required to test //TO_DO_BATTLE_TEST("Ally Switch fails if the user is in the middle of the field in a Triple Battle"); diff --git a/test/battle/move_effect/assist.c b/test/battle/move_effect/assist.c index 6036de8e8c9c..3a380ef125a1 100644 --- a/test/battle/move_effect/assist.c +++ b/test/battle/move_effect/assist.c @@ -17,6 +17,7 @@ TO_DO_BATTLE_TEST("Assist cannot call a Mimicked move (Gen4 only)"); TO_DO_BATTLE_TEST("Assist can call a Mimicked move but not the original Mimic (Gen5+)"); TO_DO_BATTLE_TEST("Assist can call moves in unhatched Eggs (Gen5 only)"); TO_DO_BATTLE_TEST("Assist can be used by wild PokΓ©mon in Wild Double Battles, even if the partner faints"); +TO_DO_BATTLE_TEST("Assist called move does not get boosted by Normalize"); SINGLE_BATTLE_TEST("Assist fails if there are no valid moves to choose from") { @@ -32,3 +33,27 @@ SINGLE_BATTLE_TEST("Assist fails if there are no valid moves to choose from") MESSAGE("But it failed!"); } } + +SINGLE_BATTLE_TEST("Assisted move triggers correct weakness berry") +{ + u16 item; + PARAMETRIZE { item = ITEM_CHILAN_BERRY; } + PARAMETRIZE { item = ITEM_PASSHO_BERRY; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_ASSIST, MOVE_NONE, MOVE_NONE, MOVE_NONE); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_SURF, MOVE_NONE, MOVE_NONE, MOVE_NONE); } + OPPONENT(SPECIES_ARON) { Item(item); } + } WHEN { + TURN { MOVE(player, MOVE_ASSIST); } + } SCENE { + MESSAGE("Wobbuffet used Assist!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ASSIST, player); + MESSAGE("Wobbuffet used Surf!"); + if (item == ITEM_PASSHO_BERRY) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + } else { + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_SURF, player); + } +} diff --git a/test/battle/move_effect/assurance.c b/test/battle/move_effect/assurance.c index e6cbf72b9f46..488740ec8f12 100644 --- a/test/battle/move_effect/assurance.c +++ b/test/battle/move_effect/assurance.c @@ -1,8 +1,62 @@ #include "global.h" #include "test/battle.h" +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_ASSURANCE) == EFFECT_ASSURANCE); +} + +DOUBLE_BATTLE_TEST("Assurance doubles in power if False Swipe connected but didn't do any damage") +{ + s16 hits[2]; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_ASSURANCE, target: playerRight); } + TURN { + MOVE(opponentLeft, MOVE_FALSE_SWIPE, target: playerLeft); + MOVE(playerLeft, MOVE_RECOVER); + MOVE(opponentRight, MOVE_ASSURANCE, target: playerLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ASSURANCE, opponentLeft); + HP_BAR(playerRight, captureDamage: &hits[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FALSE_SWIPE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ASSURANCE, opponentRight); + HP_BAR(playerLeft, captureDamage: &hits[1]); + } THEN { + EXPECT_MUL_EQ(hits[0], Q_4_12(2.0), hits[1]); + } +} + +SINGLE_BATTLE_TEST("Assurance doubles in power if the target has been damaged in the same turn - Life Orb") +{ + s16 hits[2]; + + GIVEN { + ASSUME(gItemsInfo[ITEM_LIFE_ORB].holdEffect == HOLD_EFFECT_LIFE_ORB); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LIFE_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_ASSURANCE); } + TURN { MOVE(player, MOVE_POUND); MOVE(opponent, MOVE_ASSURANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ASSURANCE, opponent); + HP_BAR(player, captureDamage: &hits[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, player); + MESSAGE("Wobbuffet was hurt by the Life Orb!"); + HP_BAR(player, captureDamage: &hits[1]); + } THEN { + EXPECT_MUL_EQ(hits[0], Q_4_12(2.0), hits[1]); + } +} + TO_DO_BATTLE_TEST("Assurance doubles in power if the target has been damaged in the same turn - Recoil"); -TO_DO_BATTLE_TEST("Assurance doubles in power if the target has been damaged in the same turn - Life Orb"); TO_DO_BATTLE_TEST("Assurance doubles in power if the target has been damaged in the same turn - Crash"); TO_DO_BATTLE_TEST("Assurance doubles in power if the target has been damaged in the same turn - Confusion"); TO_DO_BATTLE_TEST("Assurance doubles in power if the target has been damaged in the same turn - Rocky Helmet"); + diff --git a/test/battle/move_effect/attack_up_user_ally.c b/test/battle/move_effect/attack_up_user_ally.c index ed3fedb2616d..767e9fdef7f9 100644 --- a/test/battle/move_effect/attack_up_user_ally.c +++ b/test/battle/move_effect/attack_up_user_ally.c @@ -1,17 +1,14 @@ #include "global.h" #include "test/battle.h" -ASSUMPTIONS -{ - ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY); -} - SINGLE_BATTLE_TEST("Howl raises user's Attack by 1 stage", s16 damage) { bool32 raiseAttack; PARAMETRIZE { raiseAttack = FALSE; } PARAMETRIZE { raiseAttack = TRUE; } GIVEN { + ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP + || GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY); ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -37,6 +34,7 @@ DOUBLE_BATTLE_TEST("Howl raises user's and partner's Attack by 1 stage", s16 dam PARAMETRIZE { raiseAttack = FALSE; } PARAMETRIZE { raiseAttack = TRUE; } GIVEN { + ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY); ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET) { Speed(15); } PLAYER(SPECIES_WYNAUT) { Speed(10); } @@ -69,6 +67,7 @@ DOUBLE_BATTLE_TEST("Howl does not work on partner if it has Soundproof") s16 damage[2]; GIVEN { + ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY); ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET) { Speed(15); } PLAYER(SPECIES_VOLTORB) { Speed(10); Ability(ABILITY_SOUNDPROOF); } diff --git a/test/battle/move_effect/attract.c b/test/battle/move_effect/attract.c index be3048335864..2964b7b611fd 100644 --- a/test/battle/move_effect/attract.c +++ b/test/battle/move_effect/attract.c @@ -19,7 +19,7 @@ SINGLE_BATTLE_TEST("Attract causes the target to become infatuated with the user ANIMATION(ANIM_TYPE_MOVE, MOVE_ATTRACT, player); MESSAGE("The opposing Nidoking fell in love!"); } THEN { - EXPECT(opponent->status2 & STATUS2_INFATUATION); + EXPECT(opponent->volatiles.infatuation); } } @@ -35,7 +35,7 @@ SINGLE_BATTLE_TEST("Attract ignores type immunity") ANIMATION(ANIM_TYPE_MOVE, MOVE_ATTRACT, player); MESSAGE("The opposing Misdreavus fell in love!"); } THEN { - EXPECT(opponent->status2 & STATUS2_INFATUATION); + EXPECT(opponent->volatiles.infatuation); } } @@ -51,7 +51,7 @@ SINGLE_BATTLE_TEST("Attract bypasses Substitute") ANIMATION(ANIM_TYPE_MOVE, MOVE_ATTRACT, player); MESSAGE("The opposing Nidoking fell in love!"); } THEN { - EXPECT(opponent->status2 & STATUS2_INFATUATION); + EXPECT(opponent->volatiles.infatuation); } } @@ -69,7 +69,7 @@ SINGLE_BATTLE_TEST("Attract fails if the target is already infatuated") MESSAGE("Nidoqueen used Attract!"); MESSAGE("But it failed!"); } THEN { - EXPECT(opponent->status2 & STATUS2_INFATUATION); + EXPECT(opponent->volatiles.infatuation); } } @@ -84,7 +84,7 @@ SINGLE_BATTLE_TEST("Attract fails when used on a PokΓ©mon of the same gender") MESSAGE("Nidoqueen used Attract!"); MESSAGE("But it failed!"); } THEN { - EXPECT(!(opponent->status2 & STATUS2_INFATUATION)); + EXPECT(!(opponent->volatiles.infatuation)); } } @@ -100,6 +100,6 @@ SINGLE_BATTLE_TEST("Attract fails when used on a genderless PokΓ©mon") MESSAGE("Nidoqueen used Attract!"); MESSAGE("But it failed!"); } THEN { - EXPECT(!(opponent->status2 & STATUS2_INFATUATION)); + EXPECT(!(opponent->volatiles.infatuation)); } } diff --git a/test/battle/move_effect/aurora_veil.c b/test/battle/move_effect/aurora_veil.c index b57c85df0626..1b480ad1ed63 100644 --- a/test/battle/move_effect/aurora_veil.c +++ b/test/battle/move_effect/aurora_veil.c @@ -25,6 +25,35 @@ SINGLE_BATTLE_TEST("Aurora Veil can only be used in Hail and Snow") } } +SINGLE_BATTLE_TEST("Aurora Veil will prevent Protean activation if it fails due to no Snow/Hail") +{ + GIVEN { + PLAYER(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_AURORA_VEIL); } + } SCENE { + MESSAGE("But it failed!"); + NOT ABILITY_POPUP(player, ABILITY_PROTEAN); + } +} + +SINGLE_BATTLE_TEST("Aurora Veil wont prevent Protean activation when it fails due to being set up already") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SNOWSCAPE); MOVE(player, MOVE_AURORA_VEIL); } + TURN { SWITCH(player, 1); } + TURN { MOVE(player, MOVE_AURORA_VEIL); } + } SCENE { + ABILITY_POPUP(player, ABILITY_PROTEAN); + MESSAGE("But it failed!"); + } +} + TO_DO_BATTLE_TEST("Aurora Veil reduces damage done to the user by half in singles") TO_DO_BATTLE_TEST("Aurora Veil reduces damage done to the user by roughly a third in doubles") TO_DO_BATTLE_TEST("Aurora Veil's damage reduction is ignored by Critical Hits") diff --git a/test/battle/move_effect/baddy_bad.c b/test/battle/move_effect/baddy_bad.c deleted file mode 100644 index e2ee4a6d8462..000000000000 --- a/test/battle/move_effect/baddy_bad.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -TO_DO_BATTLE_TEST("Baddy Bad sets up Reflect, reducing physical damage"); -TO_DO_BATTLE_TEST("Baddy Bad's Reflect lasts for 5 turns"); -TO_DO_BATTLE_TEST("Baddy Bad can still damage the target when Reflect is already set up"); diff --git a/test/battle/move_effect/baton_pass.c b/test/battle/move_effect/baton_pass.c index cb6530ae898f..5cb1ac4c05ad 100644 --- a/test/battle/move_effect/baton_pass.c +++ b/test/battle/move_effect/baton_pass.c @@ -37,7 +37,7 @@ TO_DO_BATTLE_TEST("Baton Pass doesn't pass ability changes"); // // Move these to the corresponding effect files. // -TO_DO_BATTLE_TEST("Baton Pass passes confusion status"); // test/battle/status2/confusion.c +TO_DO_BATTLE_TEST("Baton Pass passes confusion status"); // test/battle/volatiles/confusion.c TO_DO_BATTLE_TEST("Baton Pass passes Fairy lock's escape prevention effect"); // test/battle/move_effect/fairy_lock.c TO_DO_BATTLE_TEST("Baton Pass passes Focus Energy's effect"); // test/battle/move_effect/focus_energy.c diff --git a/test/battle/move_effect/beak_blast.c b/test/battle/move_effect/beak_blast.c index 75796de13a69..6e94a908e5b3 100644 --- a/test/battle/move_effect/beak_blast.c +++ b/test/battle/move_effect/beak_blast.c @@ -33,7 +33,7 @@ DOUBLE_BATTLE_TEST("Beak Blast's charging message is shown before other moves ar } } -DOUBLE_BATTLE_TEST("Beak Blast burns all who make contact with the pokemon") +DOUBLE_BATTLE_TEST("Beak Blast burns all who make contact with the PokΓ©mon") { GIVEN { ASSUME(GetMovePriority(MOVE_BEAK_BLAST) < 0); @@ -86,7 +86,7 @@ SINGLE_BATTLE_TEST("Beak Blast burns only when contact moves are used") PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, MOVE_BEAK_BLAST); MOVE(opponent, move); } + TURN { MOVE(opponent, move); MOVE(player, MOVE_BEAK_BLAST); } TURN {} } SCENE { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_BEAK_BLAST_SETUP, player); @@ -112,6 +112,35 @@ SINGLE_BATTLE_TEST("Beak Blast burns only when contact moves are used") } } +SINGLE_BATTLE_TEST("Beak Blast doesn't burn fire types") +{ + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE || gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE); + PLAYER(SPECIES_ARCANINE); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); MOVE(opponent, MOVE_BEAK_BLAST); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + NOT STATUS_ICON(player, burn: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAK_BLAST, opponent); + } +} + +SINGLE_BATTLE_TEST("Beak Blast doesn't burn after being used") +{ + GIVEN { + ASSUME(GetMovePriority(MOVE_COUNTER) < GetMovePriority(MOVE_BEAK_BLAST)); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_BEAK_BLAST); MOVE(player, MOVE_COUNTER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAK_BLAST, opponent); + NOT STATUS_ICON(player, burn: TRUE); + } +} + TO_DO_BATTLE_TEST("Beak Blast's charging message is shown regardless if it would've missed"); TO_DO_BATTLE_TEST("Beak Blast fails if it's forced by Encore after choosing a different move"); TO_DO_BATTLE_TEST("Bulletproof is immune to Beak Blast but not to the burn it causes"); diff --git a/test/battle/move_effect/beat_up.c b/test/battle/move_effect/beat_up.c index 5e1136053127..719772c38cc4 100644 --- a/test/battle/move_effect/beat_up.c +++ b/test/battle/move_effect/beat_up.c @@ -1,31 +1,395 @@ #include "global.h" #include "test/battle.h" -// General -TO_DO_BATTLE_TEST("Beat Up hits the target for each non-fainted, non-statused member in the party"); -TO_DO_BATTLE_TEST("Beat Up's strikes have each an independent chance of a critical hit"); - -// B_BEAT_UP Gen2-4 -TO_DO_BATTLE_TEST("Beat Up lists each party member's name"); -TO_DO_BATTLE_TEST("Beat Up's damage is typeless"); -TO_DO_BATTLE_TEST("Beat Up's damage doesn't consider STAB"); -TO_DO_BATTLE_TEST("Beat Up's last strike-only can trigger King's Rock"); -TO_DO_BATTLE_TEST("Beat Up's base power is the same for each strike"); -TO_DO_BATTLE_TEST("Beat Up's damage is determined by each striking PokΓ©mon's base attack and level and the target's defense"); -TO_DO_BATTLE_TEST("Beat Up ignores stat stage changes"); //eg. Swords Dance -TO_DO_BATTLE_TEST("Beat Up ignores Huge Power"); -TO_DO_BATTLE_TEST("Beat Up ignores Choice Band"); - -// B_BEAT_UP Gen5+ -TO_DO_BATTLE_TEST("Beat Up doesn't list party member's name"); -TO_DO_BATTLE_TEST("Beat Up's damage is Dark-typed"); -TO_DO_BATTLE_TEST("Beat Up's damage receives STAB"); -TO_DO_BATTLE_TEST("Beat Up's can trigger King's Rock on all strikes"); -TO_DO_BATTLE_TEST("Beat Up's base power is determined by each striking PokΓ©mon"); -TO_DO_BATTLE_TEST("Beat Up's damage is determined by the user's attack and the target's defense"); -TO_DO_BATTLE_TEST("Beat Up's damage considers stat stage changes"); //eg. Swords Dance -TO_DO_BATTLE_TEST("Beat Up's damage considers Huge Power"); -TO_DO_BATTLE_TEST("Beat Up's damage considers Choice Band"); - +// TODO: Beat Up's strikes have each an independent chance of a critical hit // Unconfirmed by Bulbapedia // - Technician interacion + +SINGLE_BATTLE_TEST("Beat Up hits the target for each non-fainted, non-statused member in the party") +{ + u32 gen; + PARAMETRIZE { gen = GEN_3; } + PARAMETRIZE { gen = GEN_5; } + + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, gen); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_PICHU) + PLAYER(SPECIES_PIKACHU) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_RAICHU) + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + MESSAGE("The PokΓ©mon was hit 4 time(s)!"); + } THEN { + if (gen == GEN_5) { + EXPECT_EQ(gBattleStruct->beatUpSpecies[0], SPECIES_WOBBUFFET); + EXPECT_EQ(gBattleStruct->beatUpSpecies[1], SPECIES_WYNAUT); + EXPECT_EQ(gBattleStruct->beatUpSpecies[2], SPECIES_PICHU); + EXPECT_EQ(gBattleStruct->beatUpSpecies[3], SPECIES_RAICHU); + } + else { + EXPECT_EQ(gBattleStruct->beatUpSpecies[0], 0); + EXPECT_EQ(gBattleStruct->beatUpSpecies[1], 1); + EXPECT_EQ(gBattleStruct->beatUpSpecies[2], 2); + EXPECT_EQ(gBattleStruct->beatUpSpecies[3], 4); + } + } +} + +SINGLE_BATTLE_TEST("Beat Up doesn't consider Comatose as a status") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_KOMALA) { Ability(ABILITY_COMATOSE); } + PLAYER(SPECIES_WYNAUT) { HP(0); } + PLAYER(SPECIES_WYNAUT) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WYNAUT) { Status1(STATUS1_SLEEP); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + MESSAGE("The PokΓ©mon was hit 2 time(s)!"); + } +} + +SINGLE_BATTLE_TEST("Beat Up doesn't list party member's name (Gen5+)") +{ + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_5); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + NONE_OF { + MESSAGE("Wobbuffet's attack!"); + MESSAGE("Wynaut's attack!"); + } + MESSAGE("The PokΓ©mon was hit 2 time(s)!"); + } +} + +SINGLE_BATTLE_TEST("Beat Up's damage is Dark-typed (Gen5+)", s16 damage) +{ + bool32 targetIsFairy; + PARAMETRIZE { targetIsFairy = FALSE; } + PARAMETRIZE { targetIsFairy = TRUE; } + + ASSUME(GetMoveType(MOVE_BEAT_UP) == TYPE_DARK); + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_5); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(targetIsFairy ? SPECIES_SYLVEON : SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } THEN { + if (targetIsFairy) + EXPECT_LT(results[i].damage, results[0].damage); + } +} + +SINGLE_BATTLE_TEST("Beat Up's base power is determined by each striking PokΓ©mon (Gen5+)") +{ + s16 firstHit, secondHit; + + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_5); + PLAYER(SPECIES_SHUCKLE); + PLAYER(SPECIES_DEOXYS_ATTACK); + PLAYER(SPECIES_WYNAUT) { HP(0); } + PLAYER(SPECIES_WYNAUT) { HP(0); } + PLAYER(SPECIES_WYNAUT) { HP(0); } + OPPONENT(SPECIES_BLISSEY); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &firstHit); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &secondHit); + } THEN { + EXPECT_LT(firstHit, secondHit); + } +} + +SINGLE_BATTLE_TEST("Beat Up's damage considers stat stage changes (Gen5+)", s16 damage) +{ + bool32 boosted; + PARAMETRIZE { boosted = FALSE; } + PARAMETRIZE { boosted = TRUE; } + + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_5); + PLAYER(SPECIES_UMBREON); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { if (boosted) { MOVE(player, MOVE_SWORDS_DANCE); } else { MOVE(player, MOVE_CELEBRATE); } } + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + if (boosted) + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } THEN { + if (boosted) + EXPECT_GT(results[i].damage, results[0].damage); + } +} + +SINGLE_BATTLE_TEST("Beat Up's damage considers Huge Power and Choice Band (Gen5+)", s16 damage) +{ + u16 ability; + u16 item; + + PARAMETRIZE { ability = ABILITY_THICK_FAT; item = ITEM_NONE; } + PARAMETRIZE { ability = ABILITY_HUGE_POWER; item = ITEM_NONE; } + PARAMETRIZE { ability = ABILITY_THICK_FAT; item = ITEM_CHOICE_BAND; } + + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_5); + PLAYER(SPECIES_AZUMARILL) { Ability(ability); Item(item); Moves(MOVE_BEAT_UP); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } THEN { + if (i == 1) + EXPECT_GT(results[i].damage, results[0].damage); + if (i == 2) + EXPECT_GT(results[i].damage, results[0].damage); + } +} + +SINGLE_BATTLE_TEST("Beat Up lists each party member's name") +{ + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WYNAUT) { HP(0); } + PLAYER(SPECIES_WYNAUT) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_PIKACHU); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + MESSAGE("Wobbuffet's attack!"); + MESSAGE("Wynaut's attack!"); + NOT MESSAGE("Wynaut's attack!"); + MESSAGE("Pikachu's attack!"); + } +} + +SINGLE_BATTLE_TEST("Beat Up's damage is typeless", s16 damage) +{ + u16 defender = SPECIES_WOBBUFFET; + u16 type1, type2; + + PARAMETRIZE { defender = SPECIES_BLISSEY; } // Normal + PARAMETRIZE { defender = SPECIES_MACHAMP; } // Fighting + PARAMETRIZE { defender = SPECIES_TORNADUS; } // Flying + PARAMETRIZE { defender = SPECIES_GRIMER; } // Poison + PARAMETRIZE { defender = SPECIES_SANDSHREW; } // Ground + PARAMETRIZE { defender = SPECIES_NOSEPASS; } // Rock + PARAMETRIZE { defender = SPECIES_CATERPIE; } // Bug + PARAMETRIZE { defender = SPECIES_DUSKULL; } // Ghost + PARAMETRIZE { defender = SPECIES_REGISTEEL; } // Steel + PARAMETRIZE { defender = SPECIES_CHIMCHAR; } // Fire + PARAMETRIZE { defender = SPECIES_WARTORTLE; } // Water + PARAMETRIZE { defender = SPECIES_TANGELA; } // Grass + PARAMETRIZE { defender = SPECIES_PIKACHU; } // Electric + PARAMETRIZE { defender = SPECIES_ABRA; } // Psychic + PARAMETRIZE { defender = SPECIES_SNORUNT; } // Ice + PARAMETRIZE { defender = SPECIES_BAGON; } // Dragon + PARAMETRIZE { defender = SPECIES_UMBREON; } // Dark + PARAMETRIZE { defender = SPECIES_SYLVEON; } // Fairy + + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + type1 = GetSpeciesType(defender, 0); + type2 = GetSpeciesType(defender, 1); + ASSUME(type2 == type1 || type2 == TYPE_MYSTERY); // Ensure monotype targets + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(defender); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + NONE_OF { + MESSAGE("It's super effective!"); + MESSAGE("It's not very effective..."); + MESSAGE("It doesn't affect"); + } + } THEN { + EXPECT_GT(results[i].damage, 0); + } +} + +SINGLE_BATTLE_TEST("Beat Up's damage doesn't consider STAB") +{ + s16 damage; + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + damage = 0; + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT) { HP(0); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + HP_BAR(opponent, captureDamage: &damage); + } THEN { + // Raw damage: baseAtk 33 * basePower 1 * levelFactor ((100 * 2 / 5) + 2 = 42) = 1386 + // Divide by baseDef 58 -> 23 (floor); 23/50 + 2 = 2; + u16 expected = 2; + EXPECT_EQ(damage, expected); + } +} + +SINGLE_BATTLE_TEST("Beat Up's base power is the same for each strike") +{ + s16 firstHit, secondHit; + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + firstHit = 0; + secondHit = 0; + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WYNAUT) { HP(0); } + PLAYER(SPECIES_WYNAUT) { HP(0); } + PLAYER(SPECIES_WYNAUT) { HP(0); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &firstHit); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &secondHit); + } THEN { + EXPECT_EQ(firstHit, secondHit); + } +} + +SINGLE_BATTLE_TEST("Beat Up's damage is determined by each striking PokΓ©mon's base attack and level and the target's defense") +{ + s16 shuckleHit, deoxysHit; + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + shuckleHit = 0; + deoxysHit = 0; + PLAYER(SPECIES_SHUCKLE); + PLAYER(SPECIES_DEOXYS_ATTACK); + PLAYER(SPECIES_WYNAUT) { HP(0); } + PLAYER(SPECIES_WYNAUT) { HP(0); } + PLAYER(SPECIES_WYNAUT) { HP(0); } + OPPONENT(SPECIES_BLISSEY); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &shuckleHit); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &deoxysHit); + } THEN { + // Shuckle: baseAtk 10 * basePower 1 * levelFactor 42 = 420; / baseDef 10 -> 42; 42/50 + 2 = 2 + u16 shuckleDmg = 2; + // Deoxys-A: baseAtk 180 * basePower 1 * levelFactor 42 = 7560; / baseDef 10 -> 756; 756/50 + 2 = 17 + u16 deoxysDmg = 17; + EXPECT_EQ(shuckleHit, shuckleDmg); + EXPECT_EQ(deoxysHit, deoxysDmg); + EXPECT_LT(shuckleHit, deoxysHit); + } +} + +SINGLE_BATTLE_TEST("Beat Up ignores stat stage changes", s16 damage) +{ + bool32 boosted; + PARAMETRIZE { boosted = FALSE; } + PARAMETRIZE { boosted = TRUE; } + + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { if (boosted) { MOVE(player, MOVE_SWORDS_DANCE); } else { MOVE(player, MOVE_CELEBRATE); } } + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + if (boosted) + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } THEN { + if (boosted) + EXPECT_EQ(results[i].damage, results[0].damage); + } +} + +SINGLE_BATTLE_TEST("Beat Up ignores Huge Power", s16 damage) +{ + u16 ability; + + PARAMETRIZE { ability = ABILITY_THICK_FAT; } + PARAMETRIZE { ability = ABILITY_HUGE_POWER; } + + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + PLAYER(SPECIES_AZUMARILL) { Ability(ability); Moves(MOVE_BEAT_UP); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } THEN { + if (ability == ABILITY_HUGE_POWER) + EXPECT_EQ(results[i].damage, results[0].damage); + } +} + +SINGLE_BATTLE_TEST("Beat Up ignores Choice Band", s16 damage) +{ + u16 item; + + PARAMETRIZE { item = ITEM_NONE; } + PARAMETRIZE { item = ITEM_CHOICE_BAND; } + + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + PLAYER(SPECIES_URSARING) { Item(item); Moves(MOVE_BEAT_UP); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } THEN { + if (item == ITEM_CHOICE_BAND) + EXPECT_EQ(results[i].damage, results[0].damage); + } +} diff --git a/test/battle/move_effect/belly_drum.c b/test/battle/move_effect/belly_drum.c index 1580487ccab3..194ee5b9d052 100644 --- a/test/battle/move_effect/belly_drum.c +++ b/test/battle/move_effect/belly_drum.c @@ -130,6 +130,89 @@ SINGLE_BATTLE_TEST("Belly Drum minimizes the user's Attack stat with Contrary", } } -TO_DO_BATTLE_TEST("Belly Drum maximizes the user's Attack stat, even when below 0"); -TO_DO_BATTLE_TEST("Belly Drum fails if the user's Attack is already at +6, even with Contrary"); -TO_DO_BATTLE_TEST("Belly Drum deducts HP if the user has contrary and is at -6"); +SINGLE_BATTLE_TEST("Belly Drum maximizes the user's Attack stat, even when below 0", s16 damage) +{ + bool32 raiseAttack; + PARAMETRIZE { raiseAttack = FALSE; } + PARAMETRIZE { raiseAttack = TRUE; } + GIVEN { + ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (raiseAttack) TURN { MOVE(opponent, MOVE_GROWL); MOVE(player, MOVE_BELLY_DRUM); } + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + if (raiseAttack) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BELLY_DRUM, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Wobbuffet cut its own HP and maximized its Attack!"); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } THEN { + if (raiseAttack) EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 6); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(4), results[1].damage); + } +} + +SINGLE_BATTLE_TEST("Belly Drum fails if the user's Attack is already at +6, even with Contrary") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_CHARM) == EFFECT_ATTACK_DOWN_2); + PLAYER(SPECIES_SERPERIOR) { Ability(ABILITY_CONTRARY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_CHARM); } + TURN { MOVE(opponent, MOVE_CHARM); } + TURN { MOVE(opponent, MOVE_CHARM); } + TURN { MOVE(player, MOVE_BELLY_DRUM); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Serperior's Attack sharply rose!"); + + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Serperior's Attack sharply rose!"); + + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Serperior's Attack sharply rose!"); + + MESSAGE("But it failed!"); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BELLY_DRUM, player); + HP_BAR(player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } + } +} + +SINGLE_BATTLE_TEST("Belly Drum deducts HP if the user has Contrary and is at -6") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2); + PLAYER(SPECIES_SERPERIOR) { Ability(ABILITY_CONTRARY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SWORDS_DANCE); } + TURN { MOVE(player, MOVE_SWORDS_DANCE); } + TURN { MOVE(player, MOVE_SWORDS_DANCE); } + TURN { MOVE(player, MOVE_BELLY_DRUM); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Serperior's Attack harshly fell!"); + + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Serperior's Attack harshly fell!"); + + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Serperior's Attack harshly fell!"); + + NOT MESSAGE("But it failed!"); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_BELLY_DRUM, player); + s32 maxHP = GetMonData(&PLAYER_PARTY[0], MON_DATA_MAX_HP); + HP_BAR(player, hp: maxHP / 2); + MESSAGE("Serperior cut its own HP and maximized its Attack!"); + } +} diff --git a/test/battle/move_effect/bestow.c b/test/battle/move_effect/bestow.c index 4ca86119b6cd..9d7bc9ca5c72 100644 --- a/test/battle/move_effect/bestow.c +++ b/test/battle/move_effect/bestow.c @@ -92,6 +92,21 @@ SINGLE_BATTLE_TEST("Bestow fails if the user's held item is a Z-Crystal") } } +SINGLE_BATTLE_TEST("Bestow fails if the user has Sticky Hold") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_STICKY_HOLD); Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BESTOW); } + } SCENE { + MESSAGE("But it failed!"); + } THEN { + EXPECT(player->item == ITEM_SITRUS_BERRY); + EXPECT(opponent->item == ITEM_NONE); + } +} + SINGLE_BATTLE_TEST("Bestow fails if the target is behind a Substitute (Gen 6+)") { GIVEN { @@ -130,4 +145,3 @@ SINGLE_BATTLE_TEST("Bestow fails if the user's held item changes its form") EXPECT(opponent->item == ITEM_NONE); } } - diff --git a/test/battle/move_effect/bolt_beak.c b/test/battle/move_effect/bolt_beak.c index fdd95da700ae..f7c11858da0c 100644 --- a/test/battle/move_effect/bolt_beak.c +++ b/test/battle/move_effect/bolt_beak.c @@ -1,5 +1,51 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Bolt Beak's base power is doubled if it attacks before the target"); -TO_DO_BATTLE_TEST("Bolt Beak's base power is doubled the target switches out"); +SINGLE_BATTLE_TEST("Bolt Beak's base power is doubled if it attacks before the target", s16 damage) +{ + u32 speed; + PARAMETRIZE { speed = 1; } + PARAMETRIZE { speed = 3; } + GIVEN { + ASSUME(GetMoveEffect(MOVE_BOLT_BEAK) == EFFECT_BOLT_BEAK); + PLAYER(SPECIES_DRACOZOLT) { Speed(speed); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + } WHEN { + TURN { MOVE(player, MOVE_BOLT_BEAK); } + } SCENE { + if (speed == 1) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_BOLT_BEAK, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + if (speed == 3) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + } + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.0), results[1].damage); + } +} + +SINGLE_BATTLE_TEST("Bolt Beak's base power is doubled the target switches out", s16 damage) +{ + bool32 switchOut; + PARAMETRIZE { switchOut = FALSE; } + PARAMETRIZE { switchOut = TRUE; } + GIVEN { + ASSUME(GetMoveEffect(MOVE_BOLT_BEAK) == EFFECT_BOLT_BEAK); + PLAYER(SPECIES_DRACOZOLT) { Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + } WHEN { + TURN { + MOVE(player, MOVE_BOLT_BEAK); + if (switchOut) + SWITCH(opponent, 1); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BOLT_BEAK, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.0), results[1].damage); + } +} diff --git a/test/battle/move_effect/brine.c b/test/battle/move_effect/brine.c index 916525785939..5f1504437ddd 100644 --- a/test/battle/move_effect/brine.c +++ b/test/battle/move_effect/brine.c @@ -1,4 +1,25 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Brine's power doubles if the target is at 50% or below max HP"); +SINGLE_BATTLE_TEST("Brine's power doubles if the target is at 50% or below max HP", s16 damage) +{ + bool32 halfHP; + PARAMETRIZE { halfHP = FALSE; } + PARAMETRIZE { halfHP = TRUE; } + GIVEN { + ASSUME(GetMoveEffect(MOVE_BRINE) == EFFECT_BRINE); + PLAYER(SPECIES_SQUIRTLE); + OPPONENT(SPECIES_BLISSEY){ + if (halfHP) { + HP((GetMonData(&OPPONENT_PARTY[0], MON_DATA_MAX_HP) / 2) - 1); + } + } + } WHEN { + TURN { MOVE(player, MOVE_BRINE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BRINE, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.0), results[1].damage); + } +} diff --git a/test/battle/move_effect/captivate.c b/test/battle/move_effect/captivate.c index 224e6bef074d..27790b8461a7 100644 --- a/test/battle/move_effect/captivate.c +++ b/test/battle/move_effect/captivate.c @@ -92,7 +92,7 @@ SINGLE_BATTLE_TEST("Attract fails when used by a genderless PokΓ©mon") MESSAGE("Starmie used Attract!"); MESSAGE("But it failed!"); } THEN { - EXPECT(!(opponent->status2 & STATUS2_INFATUATION)); + EXPECT(!(opponent->volatiles.infatuation)); } } @@ -107,6 +107,6 @@ SINGLE_BATTLE_TEST("Attract fails if both the user and the target are genderless MESSAGE("Starmie used Attract!"); MESSAGE("But it failed!"); } THEN { - EXPECT(!(opponent->status2 & STATUS2_INFATUATION)); + EXPECT(!(opponent->volatiles.infatuation)); } } diff --git a/test/battle/move_effect/ceaseless_edge.c b/test/battle/move_effect/ceaseless_edge.c new file mode 100644 index 000000000000..288045945fbc --- /dev/null +++ b/test/battle/move_effect/ceaseless_edge.c @@ -0,0 +1,96 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_CEASELESS_EDGE) == EFFECT_CEASELESS_EDGE); +} + +SINGLE_BATTLE_TEST("Ceaseless Edge sets up hazards after hitting the target") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CEASELESS_EDGE); } + TURN { SWITCH(opponent, 1); } + } SCENE { + s32 maxHP = GetMonData(&OPPONENT_PARTY[1], MON_DATA_MAX_HP); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CEASELESS_EDGE, player); + HP_BAR(opponent); + MESSAGE("Spikes were scattered on the ground all around the opposing team!"); + MESSAGE("2 sent out Wobbuffet!"); + HP_BAR(opponent, damage: maxHP / 8); + MESSAGE("The opposing Wobbuffet was hurt by the spikes!"); + } +} + +SINGLE_BATTLE_TEST("Ceaseless Edge can set up to 3 layers of Spikes") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(player, MOVE_CEASELESS_EDGE); } + TURN { MOVE(player, MOVE_CEASELESS_EDGE); } + TURN { MOVE(player, MOVE_CEASELESS_EDGE); } + TURN { MOVE(player, MOVE_CEASELESS_EDGE); } + TURN { SWITCH(opponent, 1); } + } SCENE { + s32 maxHP = GetMonData(&OPPONENT_PARTY[1], MON_DATA_MAX_HP); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_CEASELESS_EDGE, player); + HP_BAR(opponent); + MESSAGE("Spikes were scattered on the ground all around the opposing team!"); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_CEASELESS_EDGE, player); + HP_BAR(opponent); + MESSAGE("Spikes were scattered on the ground all around the opposing team!"); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_CEASELESS_EDGE, player); + HP_BAR(opponent); + MESSAGE("Spikes were scattered on the ground all around the opposing team!"); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_CEASELESS_EDGE, player); + HP_BAR(opponent); + NOT MESSAGE("Spikes were scattered on the ground all around the opposing team!"); + + MESSAGE("2 sent out Wynaut!"); + HP_BAR(opponent, damage: maxHP / 4); + MESSAGE("The opposing Wynaut was hurt by the spikes!"); + } +} + +SINGLE_BATTLE_TEST("Ceaseless Edge fails to set up hazards if user faints") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ROCKY_HELMET); } + } WHEN { + TURN { MOVE(player, MOVE_CEASELESS_EDGE); SEND_OUT(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CEASELESS_EDGE, player); + HP_BAR(player); + MESSAGE("Wobbuffet was hurt by the opposing Wobbuffet's Rocky Helmet!"); + NOT MESSAGE("Spikes were scattered on the ground all around the opposing team!"); + } +} + +SINGLE_BATTLE_TEST("Ceaseless Edge does not set up hazards if target was not hit") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_PROTECT); MOVE(player, MOVE_CEASELESS_EDGE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PROTECT, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CEASELESS_EDGE, player); + MESSAGE("Spikes were scattered on the ground all around the opposing team!"); + } + } +} diff --git a/test/battle/move_effect/celebrate.c b/test/battle/move_effect/celebrate.c new file mode 100644 index 000000000000..f5719f571894 --- /dev/null +++ b/test/battle/move_effect/celebrate.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Celebrate (Move Effect) test titles") diff --git a/test/battle/move_effect/charge.c b/test/battle/move_effect/charge.c index 35f491254d57..48b77d8bdc6c 100644 --- a/test/battle/move_effect/charge.c +++ b/test/battle/move_effect/charge.c @@ -75,7 +75,8 @@ SINGLE_BATTLE_TEST("Charge's effect is removed if the user fails using an Electr SINGLE_BATTLE_TEST("Charge's effect does not stack with Electromorphosis or Wind Power") { - u32 species, ability; + u32 species; + enum Ability ability; s16 damage[2]; PARAMETRIZE { species = SPECIES_WATTREL; ability = ABILITY_WIND_POWER; } @@ -130,7 +131,7 @@ SINGLE_BATTLE_TEST("Charge's effect is removed regardless if the next move is El } } -SINGLE_BATTLE_TEST("Charge will not expire if it flinches twice in a row") +SINGLE_BATTLE_TEST("Charge will expire if user flinches while using an electric move") { s16 damage[2]; GIVEN { @@ -150,9 +151,6 @@ SINGLE_BATTLE_TEST("Charge will not expire if it flinches twice in a row") ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); HP_BAR(opponent, captureDamage: &damage[1]); } THEN { - if (B_CHARGE < GEN_9) - EXPECT_EQ(damage[0], damage[1]); - else - EXPECT_MUL_EQ(damage[0], Q_4_12(2.0), damage[1]); + EXPECT_EQ(damage[0], damage[1]); } } diff --git a/test/battle/move_effect/chloroblast.c b/test/battle/move_effect/chloroblast.c index 6452736478c6..d60449324f69 100644 --- a/test/battle/move_effect/chloroblast.c +++ b/test/battle/move_effect/chloroblast.c @@ -137,9 +137,14 @@ SINGLE_BATTLE_TEST("Chloroblast is not affected by Reckless", s16 damage) u32 move; PARAMETRIZE { move = MOVE_CHLOROBLAST; } - PARAMETRIZE { move = MOVE_FRENZY_PLANT; } + if (B_UPDATED_MOVE_DATA >= GEN_9) { + PARAMETRIZE { move = MOVE_FRENZY_PLANT; } // 150 power + } else { + PARAMETRIZE { move = MOVE_SEED_FLARE; } // 120 power + } GIVEN { + ASSUME(GetMovePower(MOVE_CHLOROBLAST) == GetMovePower(move)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/clangorous_soul.c b/test/battle/move_effect/clangorous_soul.c index 17e57d7dd595..a1a7ffa42aac 100644 --- a/test/battle/move_effect/clangorous_soul.c +++ b/test/battle/move_effect/clangorous_soul.c @@ -1,11 +1,52 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Clangorous Soul raises the user's Attack by 1 stage"); -TO_DO_BATTLE_TEST("Clangorous Soul raises the user's Defense by 1 stage"); -TO_DO_BATTLE_TEST("Clangorous Soul raises the user's Sp. Attack by 1 stage"); -TO_DO_BATTLE_TEST("Clangorous Soul raises the user's Sp. Defense by 1 stage"); -TO_DO_BATTLE_TEST("Clangorous Soul raises the user's Speed by 1 stage"); -TO_DO_BATTLE_TEST("Clangorous Soul cuts the user's HP by 1/3"); +SINGLE_BATTLE_TEST("Clangorous Soul cuts the user's HP by 1/3") +{ + s16 dmg; + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(300); MaxHP(300); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CLANGOROUS_SOUL); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CLANGOROUS_SOUL, player); + HP_BAR(player, captureDamage: &dmg); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(gBattleMons[0].maxHP / 3, dmg); + } +} + +SINGLE_BATTLE_TEST("Clangorous Soul raises the user's Atk, Def, Sp. Atk. Sp. Def and Speed by 1 stage") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(300); MaxHP(300); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CLANGOROUS_SOUL); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CLANGOROUS_SOUL, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Clangorous Soul fails if the user's HP is less or equal than 1/3") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(100); MaxHP(300); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CLANGOROUS_SOUL); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CLANGOROUS_SOUL, player); + } +} + TO_DO_BATTLE_TEST("Clangorous Soul fails if Attack, Defense, Sp. Attack, Sp. Defense and Speed are all maxed out"); -TO_DO_BATTLE_TEST("Clangorous Soul fails if the user's HP is less or equal than 1/3"); diff --git a/test/battle/move_effect/coaching.c b/test/battle/move_effect/coaching.c index 7245f8854bd8..642727de51ce 100644 --- a/test/battle/move_effect/coaching.c +++ b/test/battle/move_effect/coaching.c @@ -117,3 +117,23 @@ DOUBLE_BATTLE_TEST("Coaching fails if there's no ally") MESSAGE("But it failed!"); } } + +AI_DOUBLE_BATTLE_TEST("AI uses Coaching") +{ + u32 move; + PARAMETRIZE { move = MOVE_HEADBUTT; } + PARAMETRIZE { move = MOVE_DAZZLING_GLEAM; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_COACHING, MOVE_POUND); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(move); } + } WHEN { + if (move == MOVE_HEADBUTT) + TURN { EXPECT_MOVE(opponentLeft, MOVE_COACHING); } + else + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_COACHING); } + } +} diff --git a/test/battle/move_effect/coil.c b/test/battle/move_effect/coil.c index ce9e8629a86d..7d56702989b0 100644 --- a/test/battle/move_effect/coil.c +++ b/test/battle/move_effect/coil.c @@ -1,6 +1,24 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Coil raises the user's Attack by 1 stage"); -TO_DO_BATTLE_TEST("Coil raises the user's Defense by 1 stage"); -TO_DO_BATTLE_TEST("Coil raises the user's Accuracy by 1 stage"); +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_COIL) == EFFECT_COIL); +} + +SINGLE_BATTLE_TEST("Coil increases the user's Attack, Defense and Accuracy by 1 stage each") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_COIL); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_COIL, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_ACC], DEFAULT_STAT_STAGE + 1); + } +} diff --git a/test/battle/move_effect/conversion.c b/test/battle/move_effect/conversion.c index ac863cf2b257..165d274a506b 100644 --- a/test/battle/move_effect/conversion.c +++ b/test/battle/move_effect/conversion.c @@ -8,3 +8,16 @@ TO_DO_BATTLE_TEST("Conversion fails if all the user's moves share types with the TO_DO_BATTLE_TEST("Conversion changes the user's types to the one in the user's first slot (Gen 6+)"); TO_DO_BATTLE_TEST("Conversion can read the user's first move slot even if that move cannot be selected (Gen 6+)"); //Eg. Disable TO_DO_BATTLE_TEST("Conversion can change the user's types to Conversion's type"); + +SINGLE_BATTLE_TEST("(TERA) Conversion fails if used by a Terastallized Pokemon") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_PSYCHIC); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CONVERSION, gimmick: GIMMICK_TERA); } + } SCENE { + MESSAGE("Wobbuffet used Conversion!"); + MESSAGE("But it failed!"); + } +} diff --git a/test/battle/move_effect/conversion_2.c b/test/battle/move_effect/conversion_2.c index acd21125c3eb..169243019b5f 100644 --- a/test/battle/move_effect/conversion_2.c +++ b/test/battle/move_effect/conversion_2.c @@ -3,10 +3,10 @@ TO_DO_BATTLE_TEST("Conversion 2's type change considers Inverse Battles"); -#if B_UPDATED_CONVERSION_2 < GEN_5 -SINGLE_BATTLE_TEST("Conversion 2 randomly changes the type of the user to a type that resists the last move that hit the user (Gen 3-4)") +SINGLE_BATTLE_TEST("Conversion 2 randomly changes the type of the user to a type that resists the last move that hit the user (Gen 1-4)") { GIVEN { + WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_4); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -16,15 +16,16 @@ SINGLE_BATTLE_TEST("Conversion 2 randomly changes the type of the user to a type MESSAGE("Wobbuffet used Ominous Wind!"); // turn 1 ONE_OF { - MESSAGE("The opposing Wobbuffet transformed into the Normal type!"); - MESSAGE("The opposing Wobbuffet transformed into the Dark type!"); + MESSAGE("The opposing Wobbuffet transformed into the Normal type!"); + MESSAGE("The opposing Wobbuffet transformed into the Dark type!"); } } } -SINGLE_BATTLE_TEST("Conversion 2's type change considers Struggle to be Normal type (Gen 3-4)") +SINGLE_BATTLE_TEST("Conversion 2's type change considers Struggle to be Normal type (Gen 1-4)") { GIVEN { + WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_4); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -35,18 +36,17 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers Struggle to be Normal t MESSAGE("The opposing Wobbuffet used Struggle!"); // turn 2 ONE_OF { - MESSAGE("Wobbuffet transformed into the Steel type!"); - MESSAGE("Wobbuffet transformed into the Rock type!"); - MESSAGE("Wobbuffet transformed into the Ghost type!"); + MESSAGE("Wobbuffet transformed into the Steel type!"); + MESSAGE("Wobbuffet transformed into the Rock type!"); + MESSAGE("Wobbuffet transformed into the Ghost type!"); } } } -#endif -#if B_UPDATED_CONVERSION_2 >= GEN_5 SINGLE_BATTLE_TEST("Conversion 2 randomly changes the type of the user to a type that resists the last used target's move (Gen 5+)") { GIVEN { + WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -56,8 +56,8 @@ SINGLE_BATTLE_TEST("Conversion 2 randomly changes the type of the user to a type MESSAGE("Wobbuffet used Ominous Wind!"); // turn 1 ONE_OF { - MESSAGE("The opposing Wobbuffet transformed into the Normal type!"); - MESSAGE("The opposing Wobbuffet transformed into the Dark type!"); + MESSAGE("The opposing Wobbuffet transformed into the Normal type!"); + MESSAGE("The opposing Wobbuffet transformed into the Dark type!"); } } } @@ -65,6 +65,7 @@ SINGLE_BATTLE_TEST("Conversion 2 randomly changes the type of the user to a type SINGLE_BATTLE_TEST("Conversion 2's type change considers status moves (Gen 5+)") { GIVEN { + WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -75,8 +76,8 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers status moves (Gen 5+)") MESSAGE("The opposing Wobbuffet used Curse!"); // turn 2 ONE_OF { - MESSAGE("Wobbuffet transformed into the Normal type!"); - MESSAGE("Wobbuffet transformed into the Dark type!"); + MESSAGE("Wobbuffet transformed into the Normal type!"); + MESSAGE("Wobbuffet transformed into the Dark type!"); } } } @@ -84,6 +85,7 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers status moves (Gen 5+)") SINGLE_BATTLE_TEST("Conversion 2's type change considers the type of moves called by other moves") { GIVEN { + WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -94,8 +96,8 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers the type of moves calle MESSAGE("The opposing Wobbuffet used Mirror Move!"); // turn 2 ONE_OF { - MESSAGE("Wobbuffet transformed into the Normal type!"); - MESSAGE("Wobbuffet transformed into the Dark type!"); + MESSAGE("Wobbuffet transformed into the Normal type!"); + MESSAGE("Wobbuffet transformed into the Dark type!"); } } } @@ -103,6 +105,7 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers the type of moves calle SINGLE_BATTLE_TEST("Conversion 2's type change considers dynamic type moves") { GIVEN { + WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -113,10 +116,10 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers dynamic type moves") MESSAGE("The opposing Wobbuffet used Weather Ball!"); // turn 2 ONE_OF { - MESSAGE("Wobbuffet transformed into the Steel type!"); - MESSAGE("Wobbuffet transformed into the Fire type!"); - MESSAGE("Wobbuffet transformed into the Water type!"); - MESSAGE("Wobbuffet transformed into the Ice type!"); + MESSAGE("Wobbuffet transformed into the Steel type!"); + MESSAGE("Wobbuffet transformed into the Fire type!"); + MESSAGE("Wobbuffet transformed into the Water type!"); + MESSAGE("Wobbuffet transformed into the Ice type!"); } } } @@ -124,6 +127,7 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers dynamic type moves") SINGLE_BATTLE_TEST("Conversion 2's type change considers move types changed by Normalize and Electrify") { GIVEN { + WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_5); PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_NORMALIZE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -136,17 +140,17 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers move types changed by N MESSAGE("The opposing Wobbuffet used Pound!"); // turn 2 ONE_OF { - MESSAGE("Wobbuffet transformed into the Ground type!"); - MESSAGE("Wobbuffet transformed into the Dragon type!"); - MESSAGE("Wobbuffet transformed into the Grass type!"); - MESSAGE("Wobbuffet transformed into the Electric type!"); + MESSAGE("Wobbuffet transformed into the Ground type!"); + MESSAGE("Wobbuffet transformed into the Dragon type!"); + MESSAGE("Wobbuffet transformed into the Grass type!"); + MESSAGE("Wobbuffet transformed into the Electric type!"); } // turn 3 MESSAGE("Wobbuffet used Water Gun!"); ONE_OF { - MESSAGE("The opposing Wobbuffet transformed into the Steel type!"); - MESSAGE("The opposing Wobbuffet transformed into the Rock type!"); - MESSAGE("The opposing Wobbuffet transformed into the Ghost type!"); + MESSAGE("The opposing Wobbuffet transformed into the Steel type!"); + MESSAGE("The opposing Wobbuffet transformed into the Rock type!"); + MESSAGE("The opposing Wobbuffet transformed into the Ghost type!"); } } } @@ -154,6 +158,7 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers move types changed by N SINGLE_BATTLE_TEST("Conversion 2's type change fails targeting Struggle (Gen 5+)") { GIVEN { + WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -171,6 +176,7 @@ SINGLE_BATTLE_TEST("Conversion 2's type change fails targeting Struggle (Gen 5+) SINGLE_BATTLE_TEST("Conversion 2 fails if the move used is of typeless damage (Gen 5+)") { GIVEN { + WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ENTEI); } WHEN { @@ -187,7 +193,6 @@ SINGLE_BATTLE_TEST("Conversion 2 fails if the move used is of typeless damage (G MESSAGE("But it failed!"); } } -#endif SINGLE_BATTLE_TEST("Conversion 2 fails if the targeted move is Stellar Type") { @@ -205,3 +210,35 @@ SINGLE_BATTLE_TEST("Conversion 2 fails if the targeted move is Stellar Type") MESSAGE("But it failed!"); } } + +SINGLE_BATTLE_TEST("Conversion 2 fails if used by a Terastallized Pokemon") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_PSYCHIC); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_CONVERSION_2, gimmick: GIMMICK_TERA); } + } SCENE { + MESSAGE("Wobbuffet used Conversion 2!"); + MESSAGE("But it failed!"); + } +} + +SINGLE_BATTLE_TEST("Conversion 2 fails if last hit by a Stellar-type move (Gen 1-4)") +{ + GIVEN { + WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_4); + PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_STELLAR); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TERA_BLAST, gimmick: GIMMICK_TERA); MOVE(opponent, MOVE_CONVERSION_2); } + } SCENE { + // turn 1 + MESSAGE("Wobbuffet used Tera Blast!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TERA_BLAST, player); + // turn 2 + MESSAGE("The opposing Wobbuffet used Conversion 2!"); + MESSAGE("But it failed!"); + } +} diff --git a/test/battle/move_effect/copycat.c b/test/battle/move_effect/copycat.c index cdc164cd0fee..d834564b1384 100644 --- a/test/battle/move_effect/copycat.c +++ b/test/battle/move_effect/copycat.c @@ -21,9 +21,31 @@ TO_DO_BATTLE_TEST("Copycat ignores the recharging turn of recharging moves (Gen TO_DO_BATTLE_TEST("Copycat can copy Bide on all turns"); TO_DO_BATTLE_TEST("Copycat copies moves called by other calling moves instead of the calling move (Gen 5+)"); +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_COPYCAT) == EFFECT_COPYCAT); +} + +SINGLE_BATTLE_TEST("Copycat deducts power points from itself, not the copied move") +{ + ASSUME(GetMovePP(MOVE_COPYCAT) == 20); + ASSUME(GetMovePP(MOVE_POUND) == 35); + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_COPYCAT); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND); } + } WHEN { + TURN { MOVE(opponent, MOVE_POUND); MOVE(player, MOVE_COPYCAT); } + } SCENE { + } THEN { + EXPECT_EQ(opponent->pp[0], 34); + EXPECT_EQ(player->pp[0], 19); + } +} + DOUBLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can have their base moves copied by Copycat") { GIVEN { + WITH_CONFIG(CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); // TODO: Decouple this config from other gimmicks PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/counter.c b/test/battle/move_effect/counter.c index d45e75b47892..7fc9fb4b9f2d 100644 --- a/test/battle/move_effect/counter.c +++ b/test/battle/move_effect/counter.c @@ -1,6 +1,12 @@ #include "global.h" #include "test/battle.h" +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_COUNTER) == EFFECT_COUNTER); + ASSUME(GetMoveCategory(MOVE_POUND) == DAMAGE_CATEGORY_PHYSICAL); +} + SINGLE_BATTLE_TEST("Counter is not affected by Protect effects") { u32 move; @@ -38,9 +44,128 @@ SINGLE_BATTLE_TEST("Counter is not affected by Protect effects") } } -TO_DO_BATTLE_TEST("Counter will do twice as much damage received from the opponent"); -TO_DO_BATTLE_TEST("Counter cannot affect ally PokΓ©mon"); -TO_DO_BATTLE_TEST("Counter hits the last opponent that hit the user"); //Doubles +SINGLE_BATTLE_TEST("Counter will do twice as much damage received from the opponent") +{ + s16 normalDmg; + s16 counterDmg; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_POUND); MOVE(player, MOVE_COUNTER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponent); + HP_BAR(player, captureDamage: &normalDmg); + ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, player); + HP_BAR(opponent, captureDamage: &counterDmg); + } THEN { + EXPECT_MUL_EQ(normalDmg, Q_4_12(2.0), counterDmg); + } +} + +DOUBLE_BATTLE_TEST("Counter cannot affect ally PokΓ©mon") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(playerLeft, MOVE_POUND, target: playerRight); + MOVE(playerRight, MOVE_COUNTER, target: playerLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, playerLeft); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, playerRight); + } +} + +DOUBLE_BATTLE_TEST("Counter hits the last opponent that hit the user") +{ + s16 normalDmg; + s16 counterDmg; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_POUND, target: playerLeft); + MOVE(opponentRight, MOVE_SLAM, target: playerLeft); + MOVE(playerLeft, MOVE_COUNTER); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SLAM, opponentRight); + HP_BAR(playerLeft, captureDamage: &normalDmg); + ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, playerLeft); + HP_BAR(opponentRight, captureDamage: &counterDmg); + } THEN { + EXPECT_MUL_EQ(normalDmg, Q_4_12(2.0), counterDmg); + } +} + +DOUBLE_BATTLE_TEST("Counter respects Follow me") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(opponentRight, MOVE_FOLLOW_ME); + MOVE(opponentLeft, MOVE_POUND, target: playerLeft); + MOVE(playerLeft, MOVE_COUNTER, target: opponentLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOLLOW_ME, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, playerLeft); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Counter fails if mon that damaged Counter user is no longer on the field (Gen 1-4)") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); }; + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_POUND, target: playerLeft); + MOVE(playerRight, MOVE_POUND, target: opponentLeft); + MOVE(playerLeft, MOVE_COUNTER, target: opponentLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, playerRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, playerLeft); + } +} + +SINGLE_BATTLE_TEST("Counter deals 1 damage when the attack received is blocked by Disguise") +{ + s16 counterDmg; + GIVEN { + ASSUME(GetMoveCategory(MOVE_SHADOW_SNEAK) == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_MIMIKYU) { Ability(ABILITY_DISGUISE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SHADOW_SNEAK); MOVE(player, MOVE_COUNTER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHADOW_SNEAK, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, player); + HP_BAR(opponent, captureDamage: &counterDmg); + } THEN { + EXPECT_EQ(counterDmg, 1); + } +} // Gen 1 TO_DO_BATTLE_TEST("Counter can only counter Normal and Fighting-type moves (Gen 1)"); diff --git a/test/battle/move_effect/court_change.c b/test/battle/move_effect/court_change.c index 41381df18c05..5ebe4c70f672 100644 --- a/test/battle/move_effect/court_change.c +++ b/test/battle/move_effect/court_change.c @@ -29,16 +29,16 @@ DOUBLE_BATTLE_TEST("Court Change swaps entry hazards used by the opponent") MESSAGE("Wynaut swapped the battle effects affecting each side of the field!"); SEND_IN_MESSAGE("Wynaut"); NONE_OF { - MESSAGE("Wynaut was hurt by the spikes!"); + MESSAGE("Wynaut was caught in a sticky web!"); MESSAGE("Pointed stones dug into Wynaut!"); + MESSAGE("Wynaut was hurt by the spikes!"); MESSAGE("Wynaut was poisoned!"); - MESSAGE("Wynaut was caught in a sticky web!"); } MESSAGE("2 sent out Wobbuffet!"); - MESSAGE("The opposing Wobbuffet was hurt by the spikes!"); + MESSAGE("The opposing Wobbuffet was caught in a sticky web!"); MESSAGE("Pointed stones dug into the opposing Wobbuffet!"); + MESSAGE("The opposing Wobbuffet was hurt by the spikes!"); MESSAGE("The opposing Wobbuffet was poisoned!"); - MESSAGE("The opposing Wobbuffet was caught in a sticky web!"); } } @@ -64,16 +64,16 @@ DOUBLE_BATTLE_TEST("Court Change swaps entry hazards used by the player") MESSAGE("The opposing Wynaut used Court Change!"); MESSAGE("The opposing Wynaut swapped the battle effects affecting each side of the field!"); SEND_IN_MESSAGE("Wobbuffet"); - MESSAGE("Wobbuffet was hurt by the spikes!"); + MESSAGE("Wobbuffet was caught in a sticky web!"); MESSAGE("Pointed stones dug into Wobbuffet!"); + MESSAGE("Wobbuffet was hurt by the spikes!"); MESSAGE("Wobbuffet was poisoned!"); - MESSAGE("Wobbuffet was caught in a sticky web!"); MESSAGE("2 sent out Wynaut!"); NONE_OF { - MESSAGE("The opposing Wynaut was hurt by the spikes!"); + MESSAGE("The opposing Wynaut was caught in a sticky web!"); MESSAGE("Pointed stones dug into the opposing Wynaut!"); + MESSAGE("The opposing Wynaut was hurt by the spikes!"); MESSAGE("The opposing Wynaut was poisoned!"); - MESSAGE("The opposing Wynaut was caught in a sticky web!"); } } } @@ -81,6 +81,7 @@ DOUBLE_BATTLE_TEST("Court Change swaps entry hazards used by the player") DOUBLE_BATTLE_TEST("Court Change used by the player swaps Mist, Safeguard, Aurora Veil, Reflect, Light Screen, Tailwind") { GIVEN { + WITH_CONFIG(CONFIG_TAILWIND_TURNS, GEN_5); PLAYER(SPECIES_WYNAUT); PLAYER(SPECIES_WYNAUT); PLAYER(SPECIES_WYNAUT); @@ -119,6 +120,7 @@ DOUBLE_BATTLE_TEST("Court Change used by the player swaps Mist, Safeguard, Auror DOUBLE_BATTLE_TEST("Court Change used by the opponent swaps Mist, Safeguard, Aurora Veil, Reflect, Light Screen, Tailwind") { GIVEN { + WITH_CONFIG(CONFIG_TAILWIND_TURNS, GEN_5); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -217,3 +219,34 @@ DOUBLE_BATTLE_TEST("Court Change used by the player swaps G-Max Vine Lash, G-Max } } } + +AI_SINGLE_BATTLE_TEST("AI uses Court Change") +{ + u32 move; + + PARAMETRIZE { move = MOVE_HEADBUTT; } + PARAMETRIZE { move = MOVE_REFLECT; } + PARAMETRIZE { move = MOVE_LIGHT_SCREEN; } + PARAMETRIZE { move = MOVE_SAFEGUARD; } + PARAMETRIZE { move = MOVE_SPIKES; } + PARAMETRIZE { move = MOVE_STEALTH_ROCK; } + PARAMETRIZE { move = MOVE_TOXIC_SPIKES; } + PARAMETRIZE { move = MOVE_TAILWIND; } + PARAMETRIZE { move = MOVE_STICKY_WEB; } + PARAMETRIZE { move = MOVE_MIST; } + PARAMETRIZE { move = MOVE_LUCKY_CHANT; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_ZIGZAGOON) { Moves(move, MOVE_CELEBRATE); } + PLAYER(SPECIES_ZIGZAGOON) { Moves(move, MOVE_CELEBRATE); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_COURT_CHANGE, MOVE_HEADBUTT); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_COURT_CHANGE, MOVE_HEADBUTT); } + } WHEN { + TURN { MOVE(player, move); EXPECT_MOVE(opponent, MOVE_HEADBUTT); } + if (move == MOVE_HEADBUTT) + TURN { MOVE(player, MOVE_CELEBRATE); NOT_EXPECT_MOVE(opponent, MOVE_COURT_CHANGE); } + else + TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_COURT_CHANGE); } + } +} diff --git a/test/battle/move_effect/curse.c b/test/battle/move_effect/curse.c index bb1de42fbac1..355972e74e86 100644 --- a/test/battle/move_effect/curse.c +++ b/test/battle/move_effect/curse.c @@ -37,16 +37,19 @@ SINGLE_BATTLE_TEST("Curse cuts the user's HP in half when used by Ghost-types") } } -SINGLE_BATTLE_TEST("Curse applies to the user if used with Protean") +SINGLE_BATTLE_TEST("Curse applies to the user if used with Protean/Libero") { + u32 ability, species; + PARAMETRIZE { ability = ABILITY_PROTEAN; species = SPECIES_KECLEON; } + PARAMETRIZE { ability = ABILITY_LIBERO; species = SPECIES_RABOOT; } GIVEN { - PLAYER(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); } + PLAYER(species) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_CURSE, target: player); } } SCENE { s32 playerMaxHP = GetMonData(&PLAYER_PARTY[0], MON_DATA_MAX_HP); - ABILITY_POPUP(player, ABILITY_PROTEAN); + ABILITY_POPUP(player, ability); ANIMATION(ANIM_TYPE_MOVE, MOVE_CURSE, player); HP_BAR(player, damage: playerMaxHP / 2); HP_BAR(player, damage: playerMaxHP / 4); diff --git a/test/battle/move_effect/decorate.c b/test/battle/move_effect/decorate.c index 5eef9dc305c7..ac2bb6105bb3 100644 --- a/test/battle/move_effect/decorate.c +++ b/test/battle/move_effect/decorate.c @@ -1,5 +1,23 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Decorate raises the target's Attack by 2 stages"); -TO_DO_BATTLE_TEST("Decorate raises the target's Sp. Attack by 2 stages"); +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_DECORATE) == EFFECT_DECORATE); +} + +SINGLE_BATTLE_TEST("Decorate raises the target's Attack and Sp. Attack by 2 stages each") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_DECORATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DECORATE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + EXPECT_EQ(opponent->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 2); + } +} diff --git a/test/battle/move_effect/defog.c b/test/battle/move_effect/defog.c index d4c6650c72dc..f2fa558e13c6 100644 --- a/test/battle/move_effect/defog.c +++ b/test/battle/move_effect/defog.c @@ -31,28 +31,142 @@ SINGLE_BATTLE_TEST("Defog lowers evasiveness by 1 stage") ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, player); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); MESSAGE("The opposing Wobbuffet's evasiveness fell!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_EVASION], DEFAULT_STAT_STAGE - 1); } } -SINGLE_BATTLE_TEST("Defog does not lower evasiveness if target behind Substitute") +SINGLE_BATTLE_TEST("Defog fails if target has minimum evasion stat change") { GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) {Ability(ABILITY_SIMPLE);}; + } WHEN { + TURN { MOVE(player, MOVE_DEFOG); } + TURN { MOVE(player, MOVE_DEFOG); } + TURN { MOVE(player, MOVE_DEFOG); } + TURN { MOVE(player, MOVE_DEFOG); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("The opposing Wobbuffet's evasiveness harshly fell!"); + MESSAGE("But it failed!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_EVASION], DEFAULT_STAT_STAGE - 6); + } +} + +SINGLE_BATTLE_TEST("Defog lowers evasiveness of target behind Substitute (Gen4)") +{ + GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, GEN_4); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } } WHEN { TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_DEFOG); } } SCENE { MESSAGE("The opposing Wobbuffet used Substitute!"); + NOT MESSAGE("But it failed!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("The opposing Wobbuffet's evasiveness fell!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_EVASION], DEFAULT_STAT_STAGE - 1); + } +} + +SINGLE_BATTLE_TEST("Defog fails if target has minimum evasion stat change behind Substitute (Gen4)") +{ + GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, GEN_4); + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); Ability(ABILITY_SIMPLE);} + } WHEN { + TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_DEFOG); } + TURN { MOVE(player, MOVE_DEFOG); } + TURN { MOVE(player, MOVE_DEFOG); } + TURN { MOVE(player, MOVE_DEFOG); } + } SCENE { + MESSAGE("The opposing Wobbuffet used Substitute!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("The opposing Wobbuffet's evasiveness harshly fell!"); MESSAGE("But it failed!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_EVASION], DEFAULT_STAT_STAGE - 6); + } +} + +SINGLE_BATTLE_TEST("Defog does not lower evasiveness if target behind Substitute (Gen5+)") +{ + u32 move; + + PARAMETRIZE { move = MOVE_LIGHT_SCREEN; } + PARAMETRIZE { move = MOVE_CELEBRATE; } + + GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, GEN_5); + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + } WHEN { + TURN { MOVE(opponent, move); } + TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_DEFOG); } + } SCENE { + MESSAGE("The opposing Wobbuffet used Substitute!"); + if (move == MOVE_CELEBRATE) + { + MESSAGE("But it failed!"); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("The opposing Wobbuffet's evasiveness fell!"); + } + } + else + { + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("The opposing Wobbuffet's evasiveness fell!"); + } + } + } THEN { + EXPECT_EQ(opponent->statStages[STAT_EVASION], DEFAULT_STAT_STAGE); + } +} + +DOUBLE_BATTLE_TEST("Defog doesn't remove Reflect or Light Screen from the user's side", s16 damagePhysical, s16 damageSpecial) +{ + u16 move; + + PARAMETRIZE { move = MOVE_DEFOG; } + PARAMETRIZE { move = MOVE_CELEBRATE; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + PLAYER(SPECIES_WOBBUFFET) { Speed(3); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_REFLECT); MOVE(playerRight, MOVE_LIGHT_SCREEN); } + TURN { MOVE(playerLeft, move, target: opponentLeft); } + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); MOVE(opponentRight, MOVE_GUST, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_REFLECT, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_LIGHT_SCREEN, playerRight); + ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); NONE_OF { - ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, player); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); - MESSAGE("The opposing Wobbuffet's evasiveness fell!"); + MESSAGE("Your team's Reflect wore off!"); + MESSAGE("Your team's Light Screen wore off!"); } + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + HP_BAR(playerLeft, captureDamage: &results[i].damagePhysical); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GUST, opponentRight); + HP_BAR(playerRight, captureDamage: &results[i].damageSpecial); + } FINALLY { + EXPECT_EQ(results[1].damagePhysical, results[0].damagePhysical); + EXPECT_EQ(results[1].damageSpecial, results[0].damageSpecial); } } -TO_DO_BATTLE_TEST("Defog doesn't remove Reflect or Light Screen from the user's side"); DOUBLE_BATTLE_TEST("Defog removes Reflect and Light Screen from target's side", s16 damagePhysical, s16 damageSpecial) { u16 move; @@ -76,9 +190,9 @@ DOUBLE_BATTLE_TEST("Defog removes Reflect and Light Screen from target's side", MESSAGE("The opposing team's Reflect wore off!"); MESSAGE("The opposing team's Light Screen wore off!"); } - MESSAGE("Wobbuffet used Scratch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerLeft); HP_BAR(opponentLeft, captureDamage: &results[i].damagePhysical); - MESSAGE("Wobbuffet used Gust!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GUST, playerRight); HP_BAR(opponentRight, captureDamage: &results[i].damageSpecial); } FINALLY { EXPECT_MUL_EQ(results[1].damagePhysical, Q_4_12(1.5), results[0].damagePhysical); @@ -86,7 +200,38 @@ DOUBLE_BATTLE_TEST("Defog removes Reflect and Light Screen from target's side", } } -TO_DO_BATTLE_TEST("Defog doesn't remove Mist or Safeguard from the user's side"); +DOUBLE_BATTLE_TEST("Defog doesn't remove Mist or Safeguard from the user's side") +{ + u16 move; + + PARAMETRIZE { move = MOVE_DEFOG; } + PARAMETRIZE { move = MOVE_CELEBRATE; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + PLAYER(SPECIES_WOBBUFFET) { Speed(3); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_MIST); MOVE(playerRight, MOVE_SAFEGUARD); } + TURN { MOVE(playerLeft, move, target: opponentLeft); } + TURN { MOVE(opponentLeft, MOVE_SCREECH, target: playerLeft); MOVE(opponentRight, MOVE_TOXIC, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIST, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SAFEGUARD, playerRight); + ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); + NONE_OF { + MESSAGE("Your team's Mist wore off!"); + MESSAGE("Your team's Safeguard wore off!"); + } + MESSAGE("The opposing Wobbuffet used Screech!"); + MESSAGE("Wobbuffet is protected by the mist!"); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("The opposing Wobbuffet used Toxic!"); + MESSAGE("Wobbuffet is protected by Safeguard!"); + NOT STATUS_ICON(playerRight, badPoison: TRUE); + } +} + DOUBLE_BATTLE_TEST("Defog removes Mist and Safeguard from target's side") { u16 move; @@ -114,8 +259,7 @@ DOUBLE_BATTLE_TEST("Defog removes Mist and Safeguard from target's side") if (move == MOVE_DEFOG) { ANIMATION(ANIM_TYPE_MOVE, MOVE_SCREECH, playerLeft); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); - } - else { + } else { MESSAGE("The opposing Wobbuffet is protected by the mist!"); NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); } @@ -123,23 +267,73 @@ DOUBLE_BATTLE_TEST("Defog removes Mist and Safeguard from target's side") if (move == MOVE_DEFOG) { ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC, playerRight); STATUS_ICON(opponentRight, badPoison: TRUE); - } - else { + } else { MESSAGE("The opposing Wobbuffet is protected by Safeguard!"); NOT STATUS_ICON(opponentRight, badPoison: TRUE); } } } -TO_DO_BATTLE_TEST("Defog removes Stealth Rock and Sticky Web from target's side"); -TO_DO_BATTLE_TEST("Defog doesn't remove Stealth Rock or Sticky Web from user's side (Gen 4-5)"); -DOUBLE_BATTLE_TEST("Defog removes Stealth Rock and Sticky Web from user's side (Gen 6+)") +DOUBLE_BATTLE_TEST("Defog removes Stealth Rock and Sticky Web from target's side") { - u16 move; + u32 move; - PARAMETRIZE { move = MOVE_DEFOG; } PARAMETRIZE { move = MOVE_CELEBRATE; } + PARAMETRIZE { move = MOVE_DEFOG; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + PLAYER(SPECIES_WOBBUFFET) { Speed(3); } + PLAYER(SPECIES_WOBBUFFET) { Speed(3); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_STEALTH_ROCK); MOVE(opponentRight, MOVE_STICKY_WEB); } + TURN { MOVE(opponentLeft, move, target: playerLeft); } + TURN { SWITCH(playerLeft, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, move, opponentLeft); + if (move == MOVE_DEFOG) { + MESSAGE("The sticky web has disappeared from the ground around your team!"); + MESSAGE("The pointed stones disappeared from around your team!"); + } + // Switch happens + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Wobbuffet"); + if (move != MOVE_DEFOG) { + HP_BAR(playerLeft); + MESSAGE("Pointed stones dug into Wobbuffet!"); + MESSAGE("Wobbuffet was caught in a sticky web!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("Wobbuffet's Speed fell!"); + } else { + NONE_OF { + HP_BAR(playerLeft); + MESSAGE("Pointed stones dug into Wobbuffet!"); + MESSAGE("Wobbuffet was caught in a sticky web!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("Wobbuffet's Speed fell!"); + } + } + } THEN { + if (move != MOVE_DEFOG) { + EXPECT_EQ(playerLeft->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + } else { + EXPECT_EQ(playerLeft->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); + } + } +} + +DOUBLE_BATTLE_TEST("Defog removes Stealth Rock and Sticky Web from user's side (Gen 6+)") +{ + u32 move, config; + + PARAMETRIZE { move = MOVE_CELEBRATE; config = GEN_5; } + PARAMETRIZE { move = MOVE_DEFOG; config = GEN_5; } + PARAMETRIZE { move = MOVE_DEFOG; config = GEN_6; } GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } PLAYER(SPECIES_WOBBUFFET) { Speed(3); } PLAYER(SPECIES_WOBBUFFET) { Speed(3); } @@ -153,21 +347,20 @@ DOUBLE_BATTLE_TEST("Defog removes Stealth Rock and Sticky Web from user's side ( ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponentLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, opponentRight); ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); - if (move == MOVE_DEFOG && B_DEFOG_EFFECT_CLEARING >= GEN_6) { - MESSAGE("The pointed stones disappeared from around your team!"); + if (move == MOVE_DEFOG && config >= GEN_6) { MESSAGE("The sticky web has disappeared from the ground around your team!"); + MESSAGE("The pointed stones disappeared from around your team!"); } // Switch happens SWITCH_OUT_MESSAGE("Wobbuffet"); SEND_IN_MESSAGE("Wobbuffet"); - if (move != MOVE_DEFOG || B_DEFOG_EFFECT_CLEARING <= GEN_5) { + if (move != MOVE_DEFOG || config <= GEN_5) { HP_BAR(playerLeft); MESSAGE("Pointed stones dug into Wobbuffet!"); MESSAGE("Wobbuffet was caught in a sticky web!"); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); MESSAGE("Wobbuffet's Speed fell!"); - } - else { + } else { NONE_OF { HP_BAR(playerLeft); MESSAGE("Pointed stones dug into Wobbuffet!"); @@ -176,18 +369,55 @@ DOUBLE_BATTLE_TEST("Defog removes Stealth Rock and Sticky Web from user's side ( MESSAGE("Wobbuffet's Speed fell!"); } } + } THEN { + if (move != MOVE_DEFOG || config <= GEN_5) { + EXPECT_EQ(playerLeft->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + } else { + EXPECT_EQ(playerLeft->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); + } } } -TO_DO_BATTLE_TEST("Defog removes Spikes from target's side"); -TO_DO_BATTLE_TEST("Defog doesn't remove Spikes from user's side (Gen 4-5)"); -SINGLE_BATTLE_TEST("Defog removes Spikes from user's side (Gen 6+)") +SINGLE_BATTLE_TEST("Defog removes Spikes from target's side") { - u16 move; + u32 move; - PARAMETRIZE { move = MOVE_DEFOG; } PARAMETRIZE { move = MOVE_CELEBRATE; } + PARAMETRIZE { move = MOVE_DEFOG; } GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + } WHEN { + TURN { MOVE(player, MOVE_SPIKES); } + TURN { MOVE(player, move); } + TURN { SWITCH(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, player); + ANIMATION(ANIM_TYPE_MOVE, move, player); + if (move == MOVE_DEFOG) { + MESSAGE("The spikes disappeared from the ground around the opposing team!"); + NONE_OF { + HP_BAR(opponent); + MESSAGE("The opposing Wobbuffet was hurt by the spikes!"); + } + } else { + NOT MESSAGE("The spikes disappeared from the ground around the opposing team!"); + HP_BAR(opponent); + MESSAGE("The opposing Wobbuffet was hurt by the spikes!"); + } + } +} + +SINGLE_BATTLE_TEST("Defog removes Spikes from user's side (Gen 6+)") +{ + u32 move, config; + + PARAMETRIZE { move = MOVE_CELEBRATE; config = GEN_5; } + PARAMETRIZE { move = MOVE_DEFOG; config = GEN_5; } + PARAMETRIZE { move = MOVE_DEFOG; config = GEN_6; } + GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); PLAYER(SPECIES_WOBBUFFET) { Speed(2); } PLAYER(SPECIES_WOBBUFFET) { Speed(2); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } @@ -197,16 +427,15 @@ SINGLE_BATTLE_TEST("Defog removes Spikes from user's side (Gen 6+)") } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, opponent); ANIMATION(ANIM_TYPE_MOVE, move, player); - if (move == MOVE_DEFOG && B_DEFOG_EFFECT_CLEARING >= GEN_6) + if (move == MOVE_DEFOG && config >= GEN_6) MESSAGE("The spikes disappeared from the ground around your team!"); // Switch happens SWITCH_OUT_MESSAGE("Wobbuffet"); SEND_IN_MESSAGE("Wobbuffet"); - if (move != MOVE_DEFOG || B_DEFOG_EFFECT_CLEARING <= GEN_5) { + if (move != MOVE_DEFOG || config <= GEN_5) { HP_BAR(player); MESSAGE("Wobbuffet was hurt by the spikes!"); - } - else { + } else { NONE_OF { HP_BAR(player); MESSAGE("Wobbuffet was hurt by the spikes!"); @@ -215,16 +444,20 @@ SINGLE_BATTLE_TEST("Defog removes Spikes from user's side (Gen 6+)") } } -TO_DO_BATTLE_TEST("Defog doesn't remove terrain (Gen 4-7)"); SINGLE_BATTLE_TEST("Defog removes terrain (Gen 8+)") { - u16 move; + u32 move, config; - PARAMETRIZE { move = MOVE_PSYCHIC_TERRAIN; } - PARAMETRIZE { move = MOVE_ELECTRIC_TERRAIN; } - PARAMETRIZE { move = MOVE_MISTY_TERRAIN; } - PARAMETRIZE { move = MOVE_GRASSY_TERRAIN; } + PARAMETRIZE { move = MOVE_PSYCHIC_TERRAIN; config = GEN_7; } + PARAMETRIZE { move = MOVE_ELECTRIC_TERRAIN; config = GEN_7; } + PARAMETRIZE { move = MOVE_MISTY_TERRAIN; config = GEN_7; } + PARAMETRIZE { move = MOVE_GRASSY_TERRAIN; config = GEN_7; } + PARAMETRIZE { move = MOVE_PSYCHIC_TERRAIN; config = GEN_8; } + PARAMETRIZE { move = MOVE_ELECTRIC_TERRAIN; config = GEN_8; } + PARAMETRIZE { move = MOVE_MISTY_TERRAIN; config = GEN_8; } + PARAMETRIZE { move = MOVE_GRASSY_TERRAIN; config = GEN_8; } GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); PLAYER(SPECIES_WOBBUFFET) { Speed(50); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } } WHEN { @@ -232,7 +465,7 @@ SINGLE_BATTLE_TEST("Defog removes terrain (Gen 8+)") } SCENE { ANIMATION(ANIM_TYPE_MOVE, move, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, opponent); - if (B_DEFOG_EFFECT_CLEARING >= GEN_8) { + if (config >= GEN_8) { if (move == MOVE_PSYCHIC_TERRAIN) { MESSAGE("The weirdness disappeared from the battlefield!"); } @@ -258,15 +491,50 @@ SINGLE_BATTLE_TEST("Defog removes terrain (Gen 8+)") } } -TO_DO_BATTLE_TEST("Defog removes Toxic Spikes from target's side"); -TO_DO_BATTLE_TEST("Defog doesn't remove Toxic Spikes from user's side (Gen 4-5)"); -SINGLE_BATTLE_TEST("Defog removes Toxic Spikes from user's side (Gen 6+)") +SINGLE_BATTLE_TEST("Defog removes Toxic Spikes from target's side") { - u16 move; + u32 move; - PARAMETRIZE { move = MOVE_DEFOG; } PARAMETRIZE { move = MOVE_CELEBRATE; } + PARAMETRIZE { move = MOVE_DEFOG; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + } WHEN { + TURN { MOVE(player, MOVE_TOXIC_SPIKES); } + TURN { MOVE(player, move); } + TURN { SWITCH(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, player); + ANIMATION(ANIM_TYPE_MOVE, move, player); + if (move == MOVE_DEFOG) + MESSAGE("The poison spikes disappeared from the ground around the opposing team!"); + // Switch happens + MESSAGE("2 sent out Wobbuffet!"); + if (move != MOVE_DEFOG) { + MESSAGE("The opposing Wobbuffet was poisoned!"); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + STATUS_ICON(opponent, poison: TRUE); + } else { + NONE_OF { + MESSAGE("The opposing Wobbuffet was poisoned!"); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + STATUS_ICON(opponent, poison: TRUE); + } + } + } +} + +SINGLE_BATTLE_TEST("Defog removes Toxic Spikes from user's side (Gen 6+)") +{ + u32 move, config; + + PARAMETRIZE { move = MOVE_CELEBRATE; config = GEN_5; } + PARAMETRIZE { move = MOVE_DEFOG; config = GEN_5; } + PARAMETRIZE { move = MOVE_DEFOG; config = GEN_6; } GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); PLAYER(SPECIES_WOBBUFFET) { Speed(5); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } @@ -276,16 +544,15 @@ SINGLE_BATTLE_TEST("Defog removes Toxic Spikes from user's side (Gen 6+)") } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, player); ANIMATION(ANIM_TYPE_MOVE, move, opponent); - if (move == MOVE_DEFOG && B_DEFOG_EFFECT_CLEARING >= GEN_6) + if (move == MOVE_DEFOG && config >= GEN_6) MESSAGE("The poison spikes disappeared from the ground around the opposing team!"); // Switch happens MESSAGE("2 sent out Wobbuffet!"); - if (move != MOVE_DEFOG || B_DEFOG_EFFECT_CLEARING <= GEN_5) { + if (move != MOVE_DEFOG || config <= GEN_5) { MESSAGE("The opposing Wobbuffet was poisoned!"); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); STATUS_ICON(opponent, poison: TRUE); - } - else { + } else { NONE_OF { MESSAGE("The opposing Wobbuffet was poisoned!"); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); @@ -295,7 +562,47 @@ SINGLE_BATTLE_TEST("Defog removes Toxic Spikes from user's side (Gen 6+)") } } -TO_DO_BATTLE_TEST("Defog doesn't remove Aurora Veil from the user's side"); +DOUBLE_BATTLE_TEST("Defog doesn't remove Aurora Veil from the user's side", s16 damagePhysical, s16 damageSpecial) +{ + u16 move; + + PARAMETRIZE { move = MOVE_DEFOG; } + PARAMETRIZE { move = MOVE_CELEBRATE; } + GIVEN { + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); + PLAYER(SPECIES_GLALIE) { Speed(4); } + PLAYER(SPECIES_GLALIE) { Speed(3); } + OPPONENT(SPECIES_GLALIE) { Speed(2); } + OPPONENT(SPECIES_GLALIE) { Speed(1); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_HAIL); MOVE(playerRight, MOVE_AURORA_VEIL); } + TURN { MOVE(playerLeft, move, target: opponentLeft); } + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); MOVE(opponentRight, MOVE_GUST, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HAIL, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_AURORA_VEIL, playerRight); + ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); + if (move == MOVE_DEFOG) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + MESSAGE("The opposing Glalie's evasiveness fell!"); + } + NOT MESSAGE("Your team's Aurora Veil wore off!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + HP_BAR(playerLeft, captureDamage: &results[i].damagePhysical); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GUST, opponentRight); + HP_BAR(playerRight, captureDamage: &results[i].damageSpecial); + } THEN { + if (move == MOVE_DEFOG) + EXPECT_EQ(opponentLeft->statStages[STAT_EVASION], DEFAULT_STAT_STAGE - 1); + else + EXPECT_EQ(opponentLeft->statStages[STAT_EVASION], DEFAULT_STAT_STAGE); + } FINALLY { + EXPECT_EQ(results[1].damagePhysical, results[0].damagePhysical); + EXPECT_EQ(results[1].damageSpecial, results[0].damageSpecial); + } +} + DOUBLE_BATTLE_TEST("Defog removes Aurora Veil from target's side", s16 damagePhysical, s16 damageSpecial) { u16 move; @@ -304,7 +611,7 @@ DOUBLE_BATTLE_TEST("Defog removes Aurora Veil from target's side", s16 damagePhy PARAMETRIZE { move = MOVE_CELEBRATE; } GIVEN { ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); - ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); PLAYER(SPECIES_GLALIE) { Speed(4); } PLAYER(SPECIES_GLALIE) { Speed(3); } OPPONENT(SPECIES_GLALIE) { Speed(2); } @@ -322,10 +629,15 @@ DOUBLE_BATTLE_TEST("Defog removes Aurora Veil from target's side", s16 damagePhy MESSAGE("Glalie's evasiveness fell!"); MESSAGE("Your team's Aurora Veil wore off!"); } - MESSAGE("The opposing Glalie used Scratch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); HP_BAR(playerLeft, captureDamage: &results[i].damagePhysical); - MESSAGE("The opposing Glalie used Gust!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GUST, opponentRight); HP_BAR(playerRight, captureDamage: &results[i].damageSpecial); + } THEN { + if (move == MOVE_DEFOG) + EXPECT_EQ(playerLeft->statStages[STAT_EVASION], DEFAULT_STAT_STAGE - 1); + else + EXPECT_EQ(playerLeft->statStages[STAT_EVASION], DEFAULT_STAT_STAGE); } FINALLY { EXPECT_MUL_EQ(results[1].damagePhysical, Q_4_12(1.5), results[0].damagePhysical); EXPECT_MUL_EQ(results[1].damageSpecial, Q_4_12(1.5), results[0].damageSpecial); @@ -334,9 +646,13 @@ DOUBLE_BATTLE_TEST("Defog removes Aurora Veil from target's side", s16 damagePhy DOUBLE_BATTLE_TEST("Defog removes everything it can") { + u32 config; + PARAMETRIZE { config = GEN_5; } + PARAMETRIZE { config = GEN_6; } GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); - ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); PLAYER(SPECIES_GLALIE) { Speed(4); } PLAYER(SPECIES_GLALIE) { Speed(3); } PLAYER(SPECIES_GLALIE) { Speed(12); } @@ -363,24 +679,56 @@ DOUBLE_BATTLE_TEST("Defog removes everything it can") MESSAGE("Your team's Aurora Veil wore off!"); MESSAGE("Your team's Safeguard wore off!"); - if (B_DEFOG_EFFECT_CLEARING >= GEN_6) { + if (config == GEN_6) { MESSAGE("The spikes disappeared from the ground around your team!"); - MESSAGE("The pointed stones disappeared from around your team!"); - MESSAGE("The poison spikes disappeared from the ground around your team!"); MESSAGE("The sticky web has disappeared from the ground around your team!"); + MESSAGE("The poison spikes disappeared from the ground around your team!"); + MESSAGE("The pointed stones disappeared from around your team!"); // Opponent side MESSAGE("The spikes disappeared from the ground around the opposing team!"); - MESSAGE("The pointed stones disappeared from around the opposing team!"); - MESSAGE("The poison spikes disappeared from the ground around the opposing team!"); MESSAGE("The sticky web has disappeared from the ground around the opposing team!"); + MESSAGE("The poison spikes disappeared from the ground around the opposing team!"); + MESSAGE("The pointed stones disappeared from around the opposing team!"); + } + } THEN { + if (config == GEN_6) { + EXPECT_EQ(gBattleStruct->hazardsQueue[0][0], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][1], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][2], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][3], HAZARDS_NONE); + } else { + EXPECT_EQ(gBattleStruct->hazardsQueue[0][0], HAZARDS_STICKY_WEB); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][1], HAZARDS_SPIKES); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][2], HAZARDS_STEALTH_ROCK); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][3], HAZARDS_TOXIC_SPIKES); } + EXPECT_EQ(gBattleStruct->hazardsQueue[0][4], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][5], HAZARDS_NONE); + + if (config == GEN_6) { + EXPECT_EQ(gBattleStruct->hazardsQueue[1][0], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[1][1], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[1][2], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[1][3], HAZARDS_NONE); + } else { + EXPECT_EQ(gBattleStruct->hazardsQueue[1][0], HAZARDS_STICKY_WEB); + EXPECT_EQ(gBattleStruct->hazardsQueue[1][1], HAZARDS_SPIKES); + EXPECT_EQ(gBattleStruct->hazardsQueue[1][2], HAZARDS_TOXIC_SPIKES); + EXPECT_EQ(gBattleStruct->hazardsQueue[1][3], HAZARDS_STEALTH_ROCK); + } + EXPECT_EQ(gBattleStruct->hazardsQueue[1][4], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[1][5], HAZARDS_NONE); } } -SINGLE_BATTLE_TEST("Defog is used on the correct side if opposing mon is behind a substitute with Screen up") +SINGLE_BATTLE_TEST("Defog is used on the correct side if opposing mon is behind a Substitute with Screen up") { + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -391,7 +739,11 @@ SINGLE_BATTLE_TEST("Defog is used on the correct side if opposing mon is behind ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBSTITUTE, opponent); MESSAGE("Wobbuffet used Defog!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, player); - MESSAGE("The opposing Wobbuffet's evasiveness fell!"); MESSAGE("The opposing team's Light Screen wore off!"); + } THEN { + if (config >= GEN_5) + EXPECT_EQ(opponent->statStages[STAT_EVASION], DEFAULT_STAT_STAGE); + else + EXPECT_EQ(opponent->statStages[STAT_EVASION], DEFAULT_STAT_STAGE - 1); } } diff --git a/test/battle/move_effect/destiny_bond.c b/test/battle/move_effect/destiny_bond.c index 0713a4858a57..ff532fa0d78e 100644 --- a/test/battle/move_effect/destiny_bond.c +++ b/test/battle/move_effect/destiny_bond.c @@ -1,7 +1,7 @@ #include "global.h" #include "test/battle.h" -ASSUMPTIONS +ASSUMPTIONS { ASSUME(GetMoveEffect(MOVE_DESTINY_BOND) == EFFECT_DESTINY_BOND); } @@ -10,21 +10,45 @@ SINGLE_BATTLE_TEST("Destiny Bond faints the opposing mon if it fainted from the { GIVEN { PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, MOVE_DESTINY_BOND); MOVE(opponent, MOVE_SCRATCH); } + TURN { + MOVE(player, MOVE_DESTINY_BOND); + MOVE(opponent, MOVE_SCRATCH); + SEND_OUT(player, 1); + } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_DESTINY_BOND, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + MESSAGE("Wobbuffet fainted!"); MESSAGE("Wobbuffet took its attacker down with it!"); MESSAGE("The opposing Wobbuffet fainted!"); } } -SINGLE_BATTLE_TEST("Destiny Bond fails if used sequentially in Gen 7+") +SINGLE_BATTLE_TEST("Destiny Bond doesn't fail if used sequentially (Gen2-6)") { GIVEN { - ASSUME(B_DESTINY_BOND_FAIL >= GEN_7); + WITH_CONFIG(CONFIG_DESTINY_BOND_FAIL, GEN_6); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(player, MOVE_DESTINY_BOND); } + TURN { MOVE(player, MOVE_DESTINY_BOND); SWITCH(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DESTINY_BOND, player); + MESSAGE("2 sent out Zigzagoon!"); + NOT { MESSAGE("But it failed!"); } + ANIMATION(ANIM_TYPE_MOVE, MOVE_DESTINY_BOND, player); + } +} + +SINGLE_BATTLE_TEST("Destiny Bond fails if used sequentially (Gen7+)") +{ + GIVEN { + WITH_CONFIG(CONFIG_DESTINY_BOND_FAIL, GEN_7); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); @@ -39,10 +63,10 @@ SINGLE_BATTLE_TEST("Destiny Bond fails if used sequentially in Gen 7+") } } -SINGLE_BATTLE_TEST("Destiny Bond does not fail if used repeatedly separated by other moves in Gen 7+") +SINGLE_BATTLE_TEST("Destiny Bond does not fail if used repeatedly separated by other moves (Gen7+)") { GIVEN { - ASSUME(B_DESTINY_BOND_FAIL >= GEN_7); + WITH_CONFIG(CONFIG_DESTINY_BOND_FAIL, GEN_7); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); @@ -58,10 +82,10 @@ SINGLE_BATTLE_TEST("Destiny Bond does not fail if used repeatedly separated by o } } -SINGLE_BATTLE_TEST("Destiny Bond does not fail if used after failing in Gen 7+") +SINGLE_BATTLE_TEST("Destiny Bond does not fail if used after failing (Gen7+)") { GIVEN { - ASSUME(B_DESTINY_BOND_FAIL >= GEN_7); + WITH_CONFIG(CONFIG_DESTINY_BOND_FAIL, GEN_7); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); @@ -108,4 +132,3 @@ TO_DO_BATTLE_TEST("Destiny Bond's effect can trigger on the next turn if the use TO_DO_BATTLE_TEST("Destiny Bond can be used multiple times in a row (Gen 2-6)"); TO_DO_BATTLE_TEST("Destiny Bond always fails if it was successfully used the previous turn (Gen 7+)"); TO_DO_BATTLE_TEST("Destiny Bond cannot be used in Raids"); - diff --git a/test/battle/move_effect/doodle.c b/test/battle/move_effect/doodle.c index af144ecee593..3484dac6a051 100644 --- a/test/battle/move_effect/doodle.c +++ b/test/battle/move_effect/doodle.c @@ -84,7 +84,8 @@ DOUBLE_BATTLE_TEST("Doodle fails if partner has a banned Ability") DOUBLE_BATTLE_TEST("Doodle fails if ally's ability can't be suppressed") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } PARAMETRIZE { species = SPECIES_DARMANITAN; ability = ABILITY_ZEN_MODE; } diff --git a/test/battle/move_effect/double_power_on_arg_status.c b/test/battle/move_effect/double_power_on_arg_status.c index d733d04c4fed..14bfdb57affe 100644 --- a/test/battle/move_effect/double_power_on_arg_status.c +++ b/test/battle/move_effect/double_power_on_arg_status.c @@ -29,6 +29,8 @@ SINGLE_BATTLE_TEST("Hex deals double damage to foes with a status", s16 damage) } } +TO_DO_BATTLE_TEST("Hex deals double damage to PokΓ©mon with Comatose") + SINGLE_BATTLE_TEST("Venoshock's power doubles if the target is poisoned/badly poisoned", s16 damage) { u32 status1; diff --git a/test/battle/move_effect/dragon_cheer.c b/test/battle/move_effect/dragon_cheer.c index 53125f042f82..01458bdc11e7 100644 --- a/test/battle/move_effect/dragon_cheer.c +++ b/test/battle/move_effect/dragon_cheer.c @@ -28,7 +28,7 @@ DOUBLE_BATTLE_TEST("Dragon Cheer increases critical hit ratio by 1 on non-Dragon } PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_SCRATCH) == 0); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -62,9 +62,9 @@ DOUBLE_BATTLE_TEST("Dragon Cheer increases critical hit ratio by 2 on Dragon typ } PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_SCRATCH) == 0); - ASSUME(gSpeciesInfo[SPECIES_DRATINI].baseSpeed == 50); + ASSUME(GetSpeciesBaseSpeed(SPECIES_DRATINI) == 50); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_DRATINI); OPPONENT(SPECIES_WOBBUFFET); @@ -103,3 +103,29 @@ DOUBLE_BATTLE_TEST("Dragon Cheer fails if critical hit stage was already increas } TO_DO_BATTLE_TEST("Baton Pass passes Dragon Cheer's effect"); + +AI_DOUBLE_BATTLE_TEST("AI uses Dragon Cheer") +{ + u32 species; + PARAMETRIZE { species = SPECIES_DRATINI; } + PARAMETRIZE { species = SPECIES_WOBBUFFET; } + + GIVEN { + ASSUME(GetSpeciesType(SPECIES_DRATINI, 0) == TYPE_DRAGON); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_DRAGON); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_DRAGON); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + OPPONENT(species) { Moves(MOVE_DRAGON_CHEER, MOVE_POUND); } + OPPONENT(species) { Moves(MOVE_DRAGON_CHEER, MOVE_POUND); } + } WHEN { + if (species == SPECIES_DRATINI) + TURN { EXPECT_MOVE(opponentLeft, MOVE_DRAGON_CHEER); } + else + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_DRAGON_CHEER); } + } +} + + + diff --git a/test/battle/move_effect/dragon_dance.c b/test/battle/move_effect/dragon_dance.c index 52587cc09840..0d0cb6a4bc80 100644 --- a/test/battle/move_effect/dragon_dance.c +++ b/test/battle/move_effect/dragon_dance.c @@ -1,4 +1,23 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Dragon Dance increases Attack and Speed by one stage each"); +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_DRAGON_DANCE) == EFFECT_DRAGON_DANCE); +} + +SINGLE_BATTLE_TEST("Dragon Dance increases the user's Attack and Speed by 1 stage each") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_DRAGON_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 1); + } +} diff --git a/test/battle/move_effect/dragon_darts.c b/test/battle/move_effect/dragon_darts.c index 1d94968a0920..97694909fec6 100644 --- a/test/battle/move_effect/dragon_darts.c +++ b/test/battle/move_effect/dragon_darts.c @@ -4,7 +4,6 @@ ASSUMPTIONS { ASSUME(GetMoveEffect(MOVE_DRAGON_DARTS) == EFFECT_DRAGON_DARTS); - ASSUME(gSpeciesInfo[SPECIES_CLEFAIRY].types[0] == TYPE_FAIRY || gSpeciesInfo[SPECIES_CLEFAIRY].types[1] == TYPE_FAIRY); } SINGLE_BATTLE_TEST("Dragon Darts strikes twice") @@ -72,13 +71,13 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes an opponent twice if the other one is F struct BattlePokemon *chosenTarget = NULL; struct BattlePokemon *finalTarget = NULL; u32 speciesLeft, speciesRight; - PARAMETRIZE { chosenTarget = opponentLeft; finalTarget = opponentRight; speciesLeft = SPECIES_CLEFAIRY; speciesRight = SPECIES_WOBBUFFET; } - PARAMETRIZE { chosenTarget = opponentRight; finalTarget = opponentRight; speciesLeft = SPECIES_CLEFAIRY; speciesRight = SPECIES_WOBBUFFET; } - PARAMETRIZE { chosenTarget = opponentLeft; finalTarget = opponentLeft; speciesLeft = SPECIES_WOBBUFFET; speciesRight = SPECIES_CLEFAIRY; } - PARAMETRIZE { chosenTarget = opponentRight; finalTarget = opponentLeft; speciesLeft = SPECIES_WOBBUFFET; speciesRight = SPECIES_CLEFAIRY; } + PARAMETRIZE { chosenTarget = opponentLeft; finalTarget = opponentRight; speciesLeft = SPECIES_FIDOUGH; speciesRight = SPECIES_WOBBUFFET; } + PARAMETRIZE { chosenTarget = opponentRight; finalTarget = opponentRight; speciesLeft = SPECIES_FIDOUGH; speciesRight = SPECIES_WOBBUFFET; } + PARAMETRIZE { chosenTarget = opponentLeft; finalTarget = opponentLeft; speciesLeft = SPECIES_WOBBUFFET; speciesRight = SPECIES_FIDOUGH; } + PARAMETRIZE { chosenTarget = opponentRight; finalTarget = opponentLeft; speciesLeft = SPECIES_WOBBUFFET; speciesRight = SPECIES_FIDOUGH; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_CLEFAIRY].types[0] == TYPE_FAIRY || gSpeciesInfo[SPECIES_CLEFAIRY].types[1] == TYPE_FAIRY); + ASSUME(GetSpeciesType(SPECIES_FIDOUGH, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_FIDOUGH, 1) == TYPE_FAIRY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(speciesLeft); @@ -98,7 +97,7 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes an opponent twice if electrified and th { struct BattlePokemon *chosenTarget = NULL; struct BattlePokemon *finalTarget = NULL; - u32 abilityLeft, abilityRight; + enum Ability abilityLeft, abilityRight; PARAMETRIZE { chosenTarget = opponentLeft; finalTarget = opponentLeft; abilityLeft = ABILITY_WATER_ABSORB; abilityRight = ABILITY_VOLT_ABSORB; } PARAMETRIZE { chosenTarget = opponentRight; finalTarget = opponentLeft; abilityLeft = ABILITY_WATER_ABSORB; abilityRight = ABILITY_VOLT_ABSORB; } PARAMETRIZE { chosenTarget = opponentLeft; finalTarget = opponentRight; abilityLeft = ABILITY_VOLT_ABSORB; abilityRight = ABILITY_WATER_ABSORB; } @@ -124,7 +123,7 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes an opponent twice if electrified and th { struct BattlePokemon *chosenTarget = NULL; struct BattlePokemon *finalTarget = NULL; - u32 abilityLeft, abilityRight; + enum Ability abilityLeft, abilityRight; PARAMETRIZE { chosenTarget = opponentLeft; finalTarget = opponentLeft; abilityLeft = ABILITY_VITAL_SPIRIT; abilityRight = ABILITY_MOTOR_DRIVE; } PARAMETRIZE { chosenTarget = opponentRight; finalTarget = opponentLeft; abilityLeft = ABILITY_VITAL_SPIRIT; abilityRight = ABILITY_MOTOR_DRIVE; } PARAMETRIZE { chosenTarget = opponentLeft; finalTarget = opponentRight; abilityLeft = ABILITY_MOTOR_DRIVE; abilityRight = ABILITY_VITAL_SPIRIT; } @@ -257,7 +256,6 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes right ally twice if one strike misses") DOUBLE_BATTLE_TEST("Dragon Darts strikes will be both redirected to Follow Me user") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_CLEFAIRY].types[0] == TYPE_FAIRY || gSpeciesInfo[SPECIES_CLEFAIRY].types[1] == TYPE_FAIRY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -273,14 +271,14 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes will be both redirected to Follow Me us } } -DOUBLE_BATTLE_TEST("Dragon Darts fails to strike any target if under a fairy type follow me user") +DOUBLE_BATTLE_TEST("Dragon Darts fails to strike any target if under a Fairy-type follow me user") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_CLEFAIRY].types[0] == TYPE_FAIRY || gSpeciesInfo[SPECIES_CLEFAIRY].types[1] == TYPE_FAIRY); + ASSUME(GetSpeciesType(SPECIES_FIDOUGH, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_FIDOUGH, 1) == TYPE_FAIRY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_CLEFAIRY); + OPPONENT(SPECIES_FIDOUGH); } WHEN { TURN { MOVE(opponentRight, MOVE_FOLLOW_ME); MOVE(playerLeft, MOVE_DRAGON_DARTS, target: opponentLeft); } } SCENE { @@ -295,7 +293,6 @@ DOUBLE_BATTLE_TEST("Dragon Darts fails to strike any target if under a fairy typ DOUBLE_BATTLE_TEST("Dragon Darts fails to strike the second target if first target fainted and follow me was active") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_CLEFAIRY].types[0] == TYPE_FAIRY || gSpeciesInfo[SPECIES_CLEFAIRY].types[1] == TYPE_FAIRY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/dream_eater.c b/test/battle/move_effect/dream_eater.c index caa365a17a62..183a513b79b8 100644 --- a/test/battle/move_effect/dream_eater.c +++ b/test/battle/move_effect/dream_eater.c @@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Dream Eater fails on awake targets") TURN { MOVE(player, MOVE_DREAM_EATER); } } SCENE { MESSAGE("Wobbuffet used Dream Eater!"); - MESSAGE("The opposing Wobbuffet wasn't affected!"); + MESSAGE("It doesn't affect the opposing Wobbuffet…"); } } @@ -88,7 +88,7 @@ SINGLE_BATTLE_TEST("Dream Eater fails if the target is behind a Substitute (Gen TURN { MOVE(opponent, MOVE_DREAM_EATER); } } SCENE { MESSAGE("The opposing Wobbuffet used Dream Eater!"); - MESSAGE("Wobbuffet wasn't affected!"); + MESSAGE("It doesn't affect Wobbuffet…"); } } #else @@ -96,6 +96,7 @@ SINGLE_BATTLE_TEST("Dream Eater works if the target is behind a Substitute (Gen { s16 damage; s16 healed; + KNOWN_FAILING; GIVEN { ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); ASSUME(GetMoveEffect(MOVE_SUBSTITUTE) == EFFECT_SUBSTITUTE); diff --git a/test/battle/move_effect/echoed_voice.c b/test/battle/move_effect/echoed_voice.c index 3c362704548b..29a2b6e48733 100644 --- a/test/battle/move_effect/echoed_voice.c +++ b/test/battle/move_effect/echoed_voice.c @@ -1,7 +1,169 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Echoed Voice's power is multiplied for every consecutive turn used, capped at 5"); -TO_DO_BATTLE_TEST("Echoed Voice's power is reset when using a different move"); -TO_DO_BATTLE_TEST("Echoed Voice's power is increased even if it misses"); -TO_DO_BATTLE_TEST("Echoed Voice's power is increased even if it's blocked by Protect"); +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_ECHOED_VOICE) == EFFECT_ECHOED_VOICE); +} + +SINGLE_BATTLE_TEST("Echoed Voice's power is multiplied for every consecutive turn used, capped at 5") +{ + s16 damage[6]; + + GIVEN { + ASSUME(GetMoveEffect(MOVE_SOFT_BOILED) == EFFECT_SOFTBOILED); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_BLISSEY); + } WHEN { + TURN { MOVE(player, MOVE_ECHOED_VOICE); } + TURN { MOVE(player, MOVE_ECHOED_VOICE); } + TURN { MOVE(player, MOVE_ECHOED_VOICE); MOVE(opponent, MOVE_SOFT_BOILED); } + TURN { MOVE(player, MOVE_ECHOED_VOICE); } + TURN { MOVE(player, MOVE_ECHOED_VOICE); MOVE(opponent, MOVE_SOFT_BOILED); } + TURN { MOVE(player, MOVE_ECHOED_VOICE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ECHOED_VOICE, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ECHOED_VOICE, player); + HP_BAR(opponent, captureDamage: &damage[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ECHOED_VOICE, player); + HP_BAR(opponent, captureDamage: &damage[2]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ECHOED_VOICE, player); + HP_BAR(opponent, captureDamage: &damage[3]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ECHOED_VOICE, player); + HP_BAR(opponent, captureDamage: &damage[4]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ECHOED_VOICE, player); + HP_BAR(opponent, captureDamage: &damage[5]); + } THEN { + EXPECT_MUL_EQ(damage[0], UQ_4_12(2.0), damage[1]); + EXPECT_MUL_EQ(damage[0], UQ_4_12(3.0), damage[2]); + EXPECT_MUL_EQ(damage[0], UQ_4_12(4.0), damage[3]); + EXPECT_MUL_EQ(damage[0], UQ_4_12(5.0), damage[4]); + EXPECT_EQ(damage[4], damage[5]); + } +} + +SINGLE_BATTLE_TEST("Echoed Voice's power increases even if used by another battler") +{ + s16 damage[2]; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_ECHOED_VOICE); } + TURN { MOVE(player, MOVE_ECHOED_VOICE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ECHOED_VOICE, opponent); + HP_BAR(player, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ECHOED_VOICE, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_MUL_EQ(damage[0], UQ_4_12(2.0), damage[1]); + } +} + +SINGLE_BATTLE_TEST("Echoed Voice's power does not change until the end of the turn") +{ + s16 damage[3]; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_ECHOED_VOICE); MOVE(opponent, MOVE_ECHOED_VOICE); } + TURN { MOVE(player, MOVE_ECHOED_VOICE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ECHOED_VOICE, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ECHOED_VOICE, opponent); + HP_BAR(player, captureDamage: &damage[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ECHOED_VOICE, player); + HP_BAR(opponent, captureDamage: &damage[2]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + EXPECT_MUL_EQ(damage[0], UQ_4_12(2.0), damage[2]); + } +} + +SINGLE_BATTLE_TEST("Echoed Voice's power increase is reset when no battler uses it successfully during a turn") +{ + s16 damage[3]; + + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_BITE, MOVE_EFFECT_FLINCH)); + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(10); } + } WHEN { + TURN { MOVE(opponent, MOVE_ECHOED_VOICE); } + TURN { MOVE(player, MOVE_ECHOED_VOICE); } + TURN { MOVE(opponent, MOVE_BITE); MOVE(player, MOVE_ECHOED_VOICE); } + TURN { MOVE(player, MOVE_ECHOED_VOICE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ECHOED_VOICE, opponent); + HP_BAR(player, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ECHOED_VOICE, player); + HP_BAR(opponent, captureDamage: &damage[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, opponent); + MESSAGE("Wobbuffet flinched and couldn't move!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ECHOED_VOICE, player); + HP_BAR(opponent, captureDamage: &damage[2]); + } THEN { + EXPECT_EQ(damage[0], damage[2]); + EXPECT_NE(damage[1], damage[2]); + } +} + +SINGLE_BATTLE_TEST("Echoed Voice's power is increased even if it misses") +{ + s16 damage[3]; + + GIVEN { + ASSUME(GetMoveEffect(MOVE_SAND_ATTACK) == EFFECT_ACCURACY_DOWN); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_ECHOED_VOICE); } + TURN { MOVE(player, MOVE_ECHOED_VOICE); MOVE(opponent, MOVE_SAND_ATTACK); } + TURN { MOVE(player, MOVE_ECHOED_VOICE, hit: FALSE); } + TURN { MOVE(player, MOVE_ECHOED_VOICE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ECHOED_VOICE, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ECHOED_VOICE, player); + HP_BAR(opponent, captureDamage: &damage[1]); + MESSAGE("Wobbuffet's attack missed!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ECHOED_VOICE, player); + HP_BAR(opponent, captureDamage: &damage[2]); + } THEN { + EXPECT_MUL_EQ(damage[0], UQ_4_12(2.0), damage[1]); + EXPECT_MUL_EQ(damage[0], UQ_4_12(4.0), damage[2]); + } +} + +SINGLE_BATTLE_TEST("Echoed Voice's power is increased even if it's blocked by Protect") +{ + s16 damage[3]; + + GIVEN { + ASSUME(GetMoveEffect(MOVE_PROTECT) == EFFECT_PROTECT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_ECHOED_VOICE); } + TURN { MOVE(player, MOVE_ECHOED_VOICE); } + TURN { MOVE(player, MOVE_ECHOED_VOICE); MOVE(opponent, MOVE_PROTECT); } + TURN { MOVE(player, MOVE_ECHOED_VOICE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ECHOED_VOICE, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ECHOED_VOICE, player); + HP_BAR(opponent, captureDamage: &damage[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PROTECT, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ECHOED_VOICE, player); + HP_BAR(opponent, captureDamage: &damage[2]); + } THEN { + EXPECT_MUL_EQ(damage[0], UQ_4_12(2.0), damage[1]); + EXPECT_MUL_EQ(damage[0], UQ_4_12(4.0), damage[2]); + } +} diff --git a/test/battle/move_effect/electrify.c b/test/battle/move_effect/electrify.c index dbb6862fb622..0bbf58e01eab 100644 --- a/test/battle/move_effect/electrify.c +++ b/test/battle/move_effect/electrify.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Electrify makes the target's move Electric-type for the remainder of the turn (single move)") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_SANDSLASH, 0) == TYPE_GROUND || GetSpeciesType(SPECIES_SANDSLASH, 1) == TYPE_GROUND); ASSUME(GetMoveType(MOVE_SCRATCH) != TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SANDSLASH); @@ -19,7 +19,7 @@ SINGLE_BATTLE_TEST("Electrify makes the target's move Electric-type for the rema DOUBLE_BATTLE_TEST("Electrify makes the target's move Electric-type for the remainder of the turn (double move)") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_SANDSLASH, 0) == TYPE_GROUND || GetSpeciesType(SPECIES_SANDSLASH, 1) == TYPE_GROUND); ASSUME(GetMoveType(MOVE_SCRATCH) != TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); @@ -39,7 +39,7 @@ SINGLE_BATTLE_TEST("Electrify can change status moves to Electric-type") { KNOWN_FAILING; GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_SANDSLASH, 0) == TYPE_GROUND || GetSpeciesType(SPECIES_SANDSLASH, 1) == TYPE_GROUND); ASSUME(GetMoveCategory(MOVE_LEER) == DAMAGE_CATEGORY_STATUS); ASSUME(GetMoveType(MOVE_LEER) != TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); @@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Electrify can change status moves to Electric-type") SINGLE_BATTLE_TEST("Electrify changes the type of foreseen moves when hitting its target") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_SANDSLASH, 0) == TYPE_GROUND || GetSpeciesType(SPECIES_SANDSLASH, 1) == TYPE_GROUND); ASSUME(GetMoveEffect(MOVE_FUTURE_SIGHT) == EFFECT_FUTURE_SIGHT); ASSUME(GetMoveType(MOVE_FUTURE_SIGHT) != TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/embargo.c b/test/battle/move_effect/embargo.c index 3e86b60b0b10..41c456d9ac90 100644 --- a/test/battle/move_effect/embargo.c +++ b/test/battle/move_effect/embargo.c @@ -77,7 +77,7 @@ WILD_BATTLE_TEST("Embargo doesn't block held item effects that affect effort val PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_POWER_WEIGHT); } OPPONENT(SPECIES_CATERPIE) { HP(1); } ASSUME(gItemsInfo[ITEM_POWER_WEIGHT].holdEffect == HOLD_EFFECT_POWER_ITEM); - ASSUME(gItemsInfo[ITEM_POWER_WEIGHT].holdEffectParam == 8); + ASSUME(gItemsInfo[ITEM_POWER_WEIGHT].holdEffectParam != 0); ASSUME(gItemsInfo[ITEM_POWER_WEIGHT].secondaryId == STAT_HP); ASSUME(gSpeciesInfo[SPECIES_CATERPIE].evYield_HP == 1); } WHEN { @@ -114,28 +114,32 @@ SINGLE_BATTLE_TEST("Embargo negates a held item's Speed reduction") } } -WILD_BATTLE_TEST("Embargo doesn't block held item effects that affect friendship") -{ - u32 initialFriendship; - u32 finalFriendship; +// This is a useful test, but under the current circumstances, we can't actually test this without modifying +// X_ITEM_FRIENDSHIP_INCREASE. Since HOLD_EFFECT_FRIENDSHIP_UP applies a 1.5x modifier, and the stock +// Friendship increase is 1, the held item effect actually does not affect the Friendship gained. +// +// WILD_BATTLE_TEST("Embargo doesn't block held item effects that affect friendship") +// { +// u32 initialFriendship; +// u32 finalFriendship; - KNOWN_FAILING; // PokΓ©mon are currently not obtaining Friendship for using items in battle. - GIVEN { - ASSUME(gItemsInfo[ITEM_X_ACCURACY].battleUsage == EFFECT_ITEM_INCREASE_STAT); - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SOOTHE_BELL); }; - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { USE_ITEM(player, ITEM_X_ACCURACY); } - TURN { MOVE(player, MOVE_SING); } - } SCENE { - MESSAGE("Wobbuffet used Sing!"); - MESSAGE("Wild Wobbuffet fell asleep!"); - } THEN { - initialFriendship = GetMonData(&PLAYER_PARTY[0], MON_DATA_FRIENDSHIP); - finalFriendship = GetMonData(&gPlayerParty[0], MON_DATA_FRIENDSHIP); - EXPECT_EQ(finalFriendship, initialFriendship + 2); - } -} +// KNOWN_FAILING; // PokΓ©mon are currently not obtaining Friendship for using items in battle. +// GIVEN { +// ASSUME(gItemsInfo[ITEM_X_ACCURACY].battleUsage == EFFECT_ITEM_INCREASE_STAT); +// PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SOOTHE_BELL); }; +// OPPONENT(SPECIES_WOBBUFFET); +// } WHEN { +// TURN { USE_ITEM(player, ITEM_X_ACCURACY); } +// TURN { MOVE(player, MOVE_SING); } +// } SCENE { +// MESSAGE("Wobbuffet used Sing!"); +// MESSAGE("Wild Wobbuffet fell asleep!"); +// } THEN { +// initialFriendship = GetMonData(&PLAYER_PARTY[0], MON_DATA_FRIENDSHIP); +// finalFriendship = GetMonData(&gPlayerParty[0], MON_DATA_FRIENDSHIP); +// EXPECT_EQ(finalFriendship, initialFriendship + 2); +// } +// } SINGLE_BATTLE_TEST("Embargo doesn't block a held item's form-changing effect, but it does block its other effects", s16 damage) { diff --git a/test/battle/move_effect/encore.c b/test/battle/move_effect/encore.c index e2a08f7d75fc..094191f66588 100644 --- a/test/battle/move_effect/encore.c +++ b/test/battle/move_effect/encore.c @@ -14,6 +14,7 @@ SINGLE_BATTLE_TEST("Encore forces consecutive move uses for 3 turns: Encore used PARAMETRIZE { encoreUser = opponent; encoreTarget = player; speedPlayer = 10; speedOpponent = 20; } PARAMETRIZE { encoreUser = player; encoreTarget = opponent; speedPlayer = 20; speedOpponent = 10; } GIVEN { + WITH_CONFIG(CONFIG_ENCORE_TARGET, GEN_3); PLAYER(SPECIES_WOBBUFFET) { Speed(speedPlayer); } OPPONENT(SPECIES_WOBBUFFET) { Speed(speedOpponent); } } WHEN { @@ -41,6 +42,7 @@ SINGLE_BATTLE_TEST("Encore forces consecutive move uses for 3 turns for player: PARAMETRIZE { encoreUser = opponent; encoreTarget = player; speedPlayer = 20; speedOpponent = 10; } PARAMETRIZE { encoreUser = player; encoreTarget = opponent; speedPlayer = 10; speedOpponent = 20; } GIVEN { + WITH_CONFIG(CONFIG_ENCORE_TARGET, GEN_3); PLAYER(SPECIES_WOBBUFFET) { Speed(speedPlayer); } OPPONENT(SPECIES_WOBBUFFET) { Speed(speedOpponent); } } WHEN { diff --git a/test/battle/move_effect/endure.c b/test/battle/move_effect/endure.c index 54013211620d..2d66bc41ef3b 100644 --- a/test/battle/move_effect/endure.c +++ b/test/battle/move_effect/endure.c @@ -1,13 +1,17 @@ #include "global.h" #include "test/battle.h" +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_ENDURE) == EFFECT_ENDURE); +} + TO_DO_BATTLE_TEST("Endure allows the user to survive any attack with 1 HP left"); SINGLE_BATTLE_TEST("Endure does not prevent multiple hits and stat changes occur at the end of the turn") { GIVEN { ASSUME(GetMoveEffect(MOVE_SCALE_SHOT) == EFFECT_MULTI_HIT); - ASSUME(GetMoveEffect(MOVE_ENDURE) == EFFECT_ENDURE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { HP(1); } } WHEN { @@ -27,6 +31,50 @@ SINGLE_BATTLE_TEST("Endure does not prevent multiple hits and stat changes occur } } +DOUBLE_BATTLE_TEST("Endure is not transferred to a mon that is switched in due to Eject Button") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT) { HP(1); Item(ITEM_EJECT_BUTTON); } + OPPONENT(SPECIES_SQUIRTLE) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(opponentRight, MOVE_ENDURE); + MOVE(playerLeft, MOVE_POUND, target: opponentRight); + SEND_OUT(opponentRight, 2); + MOVE(playerRight, MOVE_POUND, target: opponentRight); + SEND_OUT(opponentRight, 3); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENDURE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, playerLeft); + MESSAGE("The opposing Wynaut endured the hit!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, playerRight); + NOT MESSAGE("The opposing Squirtle endured the hit!"); + } +} + +SINGLE_BATTLE_TEST("Endure only lasts for one turn") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + } WHEN { + TURN { MOVE(opponent, MOVE_ENDURE); MOVE(player, MOVE_POUND); } + TURN { MOVE(player, MOVE_POUND); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENDURE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, player); + MESSAGE("The opposing Wobbuffet endured the hit!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, player); + NOT MESSAGE("The opposing Wobbuffet endured the hit!"); + } +} + TO_DO_BATTLE_TEST("Endure's success rate decreases for every consecutively used turn"); TO_DO_BATTLE_TEST("Endure uses the same counter as Protect"); TO_DO_BATTLE_TEST("Endure doesn't trigger effects that require damage to be done to the PokΓ©mon (Gen 2-4)"); // Eg. Rough Skin diff --git a/test/battle/move_effect/entrainment.c b/test/battle/move_effect/entrainment.c index fd47937f04ce..ac6050bbe0a0 100644 --- a/test/battle/move_effect/entrainment.c +++ b/test/battle/move_effect/entrainment.c @@ -58,4 +58,19 @@ SINGLE_BATTLE_TEST("Entrainment fails if the target's ability has cantBeOverwrit } } +SINGLE_BATTLE_TEST("Entrainment causes primal weather to revert") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } + OPPONENT(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + } WHEN { + TURN { MOVE(player, MOVE_ENTRAINMENT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENTRAINMENT, player); + MESSAGE("The extremely harsh sunlight faded!"); + } THEN { + EXPECT(opponent->ability == ABILITY_TELEPATHY); + } +} + TO_DO_BATTLE_TEST("Entrainment fails on Dynamaxed PokΓ©mon"); diff --git a/test/battle/move_effect/explosion.c b/test/battle/move_effect/explosion.c index 52eec1a8e266..818517179699 100644 --- a/test/battle/move_effect/explosion.c +++ b/test/battle/move_effect/explosion.c @@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Explosion causes the user to faint even if it has no effect" { GIVEN { ASSUME(GetMoveType(MOVE_EXPLOSION) == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_GASTLY].types[0] == TYPE_GHOST); + ASSUME(GetSpeciesType(SPECIES_GASTLY, 0) == TYPE_GHOST); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GASTLY); } WHEN { diff --git a/test/battle/move_effect/facade.c b/test/battle/move_effect/facade.c index cc1e21e34f25..2ed337cd1c13 100644 --- a/test/battle/move_effect/facade.c +++ b/test/battle/move_effect/facade.c @@ -1,4 +1,6 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Facade (Move Effect) test titles") +TO_DO_BATTLE_TEST("Facade doubles in power when the user is Paralyzed and Poisoned") +TO_DO_BATTLE_TEST("Facade does not ignore burn's attack-halving effect, cancelling out its power (Gen3-5)") +TO_DO_BATTLE_TEST("Facade ignores burn's attack-halving effect, making it double in power (Gen3-5)") diff --git a/test/battle/move_effect/fail_if_not_arg_type.c b/test/battle/move_effect/fail_if_not_arg_type.c index 368c3410c0f8..9714c15752b1 100644 --- a/test/battle/move_effect/fail_if_not_arg_type.c +++ b/test/battle/move_effect/fail_if_not_arg_type.c @@ -6,8 +6,8 @@ SINGLE_BATTLE_TEST("Burn Up user loses its Fire-type") GIVEN { ASSUME(GetMoveEffect(MOVE_BURN_UP) == EFFECT_FAIL_IF_NOT_ARG_TYPE); ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) == TRUE); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_FIRE || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_CYNDAQUIL].types[0] == TYPE_FIRE || gSpeciesInfo[SPECIES_CYNDAQUIL].types[1] == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_FIRE || GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_CYNDAQUIL, 0) == TYPE_FIRE || GetSpeciesType(SPECIES_CYNDAQUIL, 1) == TYPE_FIRE); PLAYER(SPECIES_CYNDAQUIL); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -26,25 +26,48 @@ SINGLE_BATTLE_TEST("Burn Up fails if the user isn't a Fire-type") GIVEN { ASSUME(GetMoveEffect(MOVE_BURN_UP) == EFFECT_FAIL_IF_NOT_ARG_TYPE); ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) == TRUE); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_FIRE || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_FIRE || GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_FIRE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_BURN_UP); } } SCENE { - NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_BURN_UP, player); } MESSAGE("Wobbuffet used Burn Up!"); + NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_BURN_UP, player); } MESSAGE("But it failed!"); } } +TO_DO_BATTLE_TEST("Burn Up doesn't thaw the user if it fails due to the user not being Fire-type") + +SINGLE_BATTLE_TEST("Burn Up fails if the user has Protean/Libero and is not a Fire-type") +{ + GIVEN { + WITH_CONFIG(CONFIG_PROTEAN_LIBERO, GEN_6); + PLAYER(SPECIES_REGIROCK); + OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_BURN_UP); } + } SCENE { + MESSAGE("The opposing Kecleon used Burn Up!"); + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_PROTEAN); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BURN_UP, player); + } + MESSAGE("But it failed!"); + } +} + +TO_DO_BATTLE_TEST("(TERA) Burn Up user does not lose their Fire type if they've Terastallized into Fire type") + SINGLE_BATTLE_TEST("Burn Up user loses its Fire-type if enemy faints") { GIVEN { ASSUME(GetMoveEffect(MOVE_BURN_UP) == EFFECT_FAIL_IF_NOT_ARG_TYPE); ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) == TRUE); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_FIRE || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_CYNDAQUIL].types[0] == TYPE_FIRE || gSpeciesInfo[SPECIES_CYNDAQUIL].types[1] == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_FIRE || GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_CYNDAQUIL, 0) == TYPE_FIRE || GetSpeciesType(SPECIES_CYNDAQUIL, 1) == TYPE_FIRE); PLAYER(SPECIES_CYNDAQUIL); OPPONENT(SPECIES_WOBBUFFET) { HP(1); } } WHEN { @@ -61,8 +84,8 @@ SINGLE_BATTLE_TEST("Double Shock user loses its Electric-type") GIVEN { ASSUME(GetMoveEffect(MOVE_DOUBLE_SHOCK) == EFFECT_FAIL_IF_NOT_ARG_TYPE); ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_DOUBLE_SHOCK, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_ELECTRIC) == TRUE); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ELECTRIC || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ELECTRIC); - ASSUME(gSpeciesInfo[SPECIES_PIKACHU].types[0] == TYPE_ELECTRIC || gSpeciesInfo[SPECIES_PIKACHU].types[1] == TYPE_ELECTRIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ELECTRIC || GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ELECTRIC); + ASSUME(GetSpeciesType(SPECIES_PIKACHU, 0) == TYPE_ELECTRIC || GetSpeciesType(SPECIES_PIKACHU, 1) == TYPE_ELECTRIC); PLAYER(SPECIES_PIKACHU); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -81,7 +104,7 @@ SINGLE_BATTLE_TEST("Double Shock fails if the user isn't an Electric-type") GIVEN { ASSUME(GetMoveEffect(MOVE_DOUBLE_SHOCK) == EFFECT_FAIL_IF_NOT_ARG_TYPE); ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_DOUBLE_SHOCK, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_ELECTRIC) == TRUE); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ELECTRIC || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ELECTRIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ELECTRIC || GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -98,8 +121,8 @@ SINGLE_BATTLE_TEST("Double Shock user loses its Electric-type if enemy faints") GIVEN { ASSUME(GetMoveEffect(MOVE_DOUBLE_SHOCK) == EFFECT_FAIL_IF_NOT_ARG_TYPE); ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_DOUBLE_SHOCK, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_ELECTRIC) == TRUE); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ELECTRIC || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ELECTRIC); - ASSUME(gSpeciesInfo[SPECIES_PIKACHU].types[0] == TYPE_ELECTRIC || gSpeciesInfo[SPECIES_PIKACHU].types[1] == TYPE_ELECTRIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ELECTRIC || GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ELECTRIC); + ASSUME(GetSpeciesType(SPECIES_PIKACHU, 0) == TYPE_ELECTRIC || GetSpeciesType(SPECIES_PIKACHU, 1) == TYPE_ELECTRIC); PLAYER(SPECIES_PIKACHU); OPPONENT(SPECIES_WOBBUFFET) { HP(1); } } WHEN { diff --git a/test/battle/move_effect/fairy_lock.c b/test/battle/move_effect/fairy_lock.c index a42aa6aa4803..e2a941d7e747 100644 --- a/test/battle/move_effect/fairy_lock.c +++ b/test/battle/move_effect/fairy_lock.c @@ -1,4 +1,9 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Fairy Lock (Move Effect) test titles") +TO_DO_BATTLE_TEST("Fairy Lock prevents all PokΓ©mon from switching out on their next turn") +TO_DO_BATTLE_TEST("Fairy Lock does not prevent switch out via Dragon Tail") +TO_DO_BATTLE_TEST("Fairy Lock does not prevent switch out via Whirlwind") +TO_DO_BATTLE_TEST("Fairy Lock does not prevent switch out via Eject Button") +TO_DO_BATTLE_TEST("Fairy Lock does not prevent switch out via Red Card") +TO_DO_BATTLE_TEST("Fairy Lock prevents a PokΓ©mon from switching out on the following turn after replacing a fainted mon") diff --git a/test/battle/move_effect/false_swipe.c b/test/battle/move_effect/false_swipe.c index da2cbf6a2163..3e844040678e 100644 --- a/test/battle/move_effect/false_swipe.c +++ b/test/battle/move_effect/false_swipe.c @@ -1,4 +1,6 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write False Swipe (Move Effect) test titles") +TO_DO_BATTLE_TEST("False Swipe always leaves the target with at least 1 HP") +TO_DO_BATTLE_TEST("False Swipe still hits the target if it has 1 HP") // Test with Rocky Helmet or something +TO_DO_BATTLE_TEST("False Swipe does not reduce its damage when hitting a substitute") diff --git a/test/battle/move_effect/fell_stinger.c b/test/battle/move_effect/fell_stinger.c index 994cba345798..8d395080fe7c 100644 --- a/test/battle/move_effect/fell_stinger.c +++ b/test/battle/move_effect/fell_stinger.c @@ -1,7 +1,7 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Fell Stinger raises user's Attack by 3 stages if it faints target") +SINGLE_BATTLE_TEST("Fell Stinger raises user's Attack by 2 stages (Gen6) or 3 stages (Gen7+) if it faints target") { u32 config; @@ -9,7 +9,7 @@ SINGLE_BATTLE_TEST("Fell Stinger raises user's Attack by 3 stages if it faints t PARAMETRIZE { config = GEN_6; } GIVEN { - WITH_CONFIG(GEN_CONFIG_FELL_STINGER_STAT_RAISE, config); + WITH_CONFIG(CONFIG_FELL_STINGER_STAT_RAISE, config); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_FELL_STINGER); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/fickle_beam.c b/test/battle/move_effect/fickle_beam.c index 0313823aa95c..8554a29dacfd 100644 --- a/test/battle/move_effect/fickle_beam.c +++ b/test/battle/move_effect/fickle_beam.c @@ -12,15 +12,14 @@ SINGLE_BATTLE_TEST("Fickle Beam deals double damage 30% of the time") PASSES_RANDOMLY(30, 100, RNG_FICKLE_BEAM); GIVEN { - ASSUME(GetMovePower(MOVE_POWER_GEM) == 80); - ASSUME(GetMovePower(MOVE_FICKLE_BEAM) == 80); + ASSUME(GetMovePower(MOVE_DAZZLING_GLEAM) == GetMovePower(MOVE_FICKLE_BEAM)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, MOVE_POWER_GEM); } + TURN { MOVE(player, MOVE_DAZZLING_GLEAM); } TURN { MOVE(player, MOVE_FICKLE_BEAM); } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_POWER_GEM, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DAZZLING_GLEAM, player); HP_BAR(opponent, captureDamage: &damage[0]); ANIMATION(ANIM_TYPE_MOVE, MOVE_FICKLE_BEAM, player); HP_BAR(opponent, captureDamage: &damage[1]); diff --git a/test/battle/move_effect/fillet_away.c b/test/battle/move_effect/fillet_away.c index f9b679bfe5bf..70f180a7003b 100644 --- a/test/battle/move_effect/fillet_away.c +++ b/test/battle/move_effect/fillet_away.c @@ -72,3 +72,5 @@ SINGLE_BATTLE_TEST("Fillet Away's HP cost doesn't trigger effects that trigger o NOT MESSAGE("Wobbuffet's Air Balloon popped!"); } } + +TO_DO_BATTLE_TEST("Fillet Away fails if the user's Attack, Sp. Atk and Speed are all maxed out") diff --git a/test/battle/move_effect/final_gambit.c b/test/battle/move_effect/final_gambit.c index be815abf5ad2..020e415f0a49 100644 --- a/test/battle/move_effect/final_gambit.c +++ b/test/battle/move_effect/final_gambit.c @@ -1,4 +1,88 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Final Gambit (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_FINAL_GAMBIT) == EFFECT_FINAL_GAMBIT); +} + +SINGLE_BATTLE_TEST("Final Gambit faints user and target") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(player, MOVE_FINAL_GAMBIT); SEND_OUT(player, 1); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FINAL_GAMBIT, player); + HP_BAR(opponent); + HP_BAR(player); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HP), 0); + EXPECT_EQ(GetMonData(&gEnemyParty[0], MON_DATA_HP), 0); + } +} + +SINGLE_BATTLE_TEST("Final Gambit does not faint user if target protects") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_PROTECT); MOVE(player, MOVE_FINAL_GAMBIT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PROTECT, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FINAL_GAMBIT, player); + } THEN { + EXPECT_NE(GetMonData(&gPlayerParty[0], MON_DATA_HP), 0); + EXPECT_NE(GetMonData(&gEnemyParty[0], MON_DATA_HP), 0); + } +} + +SINGLE_BATTLE_TEST("Final Gambit does not faint user if attacker fails to attack") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_CONFUSE_RAY); MOVE(player, MOVE_FINAL_GAMBIT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FINAL_GAMBIT, player); + } THEN { + EXPECT_NE(GetMonData(&gPlayerParty[0], MON_DATA_HP), 0); + EXPECT_NE(GetMonData(&gEnemyParty[0], MON_DATA_HP), 0); + } +} + +SINGLE_BATTLE_TEST("Final Gambit does not faint user if target is immune") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_GASTLY); + } WHEN { + TURN { MOVE(player, MOVE_FINAL_GAMBIT); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FINAL_GAMBIT, player); + } THEN { + EXPECT_NE(GetMonData(&gPlayerParty[0], MON_DATA_HP), 0); + EXPECT_NE(GetMonData(&gEnemyParty[0], MON_DATA_HP), 0); + } +} + +TO_DO_BATTLE_TEST("Final Gambit faints the user, and the target receives damage equal to the user's HP") // User should faint before the target +TO_DO_BATTLE_TEST("Final Gambit doesn't faint the user if it misses") +TO_DO_BATTLE_TEST("Final Gambit doesn't faint the user if the target is immune") +TO_DO_BATTLE_TEST("Final Gambit doesn't faint the user if the target is protected") +TO_DO_BATTLE_TEST("Final Gambit doesn't trigger the user's Focus Band") +TO_DO_BATTLE_TEST("Final Gambit doesn't trigger the user's Focus Sash") +TO_DO_BATTLE_TEST("Final Gambit doesn't trigger the user's Sturdy") +TO_DO_BATTLE_TEST("Final Gambit triggers the target's Focus Band") +TO_DO_BATTLE_TEST("Final Gambit triggers the target's Focus Sash") +TO_DO_BATTLE_TEST("Final Gambit triggers the target's Sturdy") +TO_DO_BATTLE_TEST("Final Gambit triggers the target's Endure") +TO_DO_BATTLE_TEST("Final Gambit fails in Max Raids") +TO_DO_BATTLE_TEST("Final Gambit fails in Tera Raids") diff --git a/test/battle/move_effect/first_turn_only.c b/test/battle/move_effect/first_turn_only.c index b26245a3d991..045a84f899be 100644 --- a/test/battle/move_effect/first_turn_only.c +++ b/test/battle/move_effect/first_turn_only.c @@ -1,4 +1,8 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Fake Out/First Impression (Move Effect) test titles") +TO_DO_BATTLE_TEST("Fake Out can only be used on the user's first turn") +TO_DO_BATTLE_TEST("Fake Out fails if it's called via Instruct") + +TO_DO_BATTLE_TEST("First Impression can only be used on the user's first turn") +TO_DO_BATTLE_TEST("First Impression fails if it's called via Instruct") diff --git a/test/battle/move_effect/fixed_damage_arg.c b/test/battle/move_effect/fixed_damage_arg.c deleted file mode 100644 index 8cb298707253..000000000000 --- a/test/battle/move_effect/fixed_damage_arg.c +++ /dev/null @@ -1,41 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(GetMoveEffect(MOVE_SONIC_BOOM) == EFFECT_FIXED_DAMAGE_ARG); -} - -SINGLE_BATTLE_TEST("Sonic Boom deals fixed damage", s16 damage) -{ - u16 mon; - PARAMETRIZE { mon = SPECIES_RATTATA; } - PARAMETRIZE { mon = SPECIES_ARON; } - - GIVEN { - ASSUME(GetMoveFixedDamage(MOVE_SONIC_BOOM) == 20); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(mon); - } WHEN { - TURN { MOVE(player, MOVE_SONIC_BOOM); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SONIC_BOOM, player); - HP_BAR(opponent, captureDamage: &results[i].damage); - } FINALLY { - EXPECT(results[0].damage == 20); - EXPECT(results[1].damage == 20); - } -} - -SINGLE_BATTLE_TEST("Sonic Boom doesn't affect ghost types") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_GASTLY); - } WHEN { - TURN { MOVE(player, MOVE_SONIC_BOOM); } - } SCENE { - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SONIC_BOOM, player); - MESSAGE("It doesn't affect the opposing Gastly…"); - } -} diff --git a/test/battle/move_effect/fixed_hp_damage.c b/test/battle/move_effect/fixed_hp_damage.c new file mode 100644 index 000000000000..02942ba7c785 --- /dev/null +++ b/test/battle/move_effect/fixed_hp_damage.c @@ -0,0 +1,43 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_SONIC_BOOM) == EFFECT_FIXED_HP_DAMAGE); +} + +SINGLE_BATTLE_TEST("Sonic Boom deals fixed damage", s16 damage) +{ + u16 mon; + PARAMETRIZE { mon = SPECIES_RATTATA; } + PARAMETRIZE { mon = SPECIES_ARON; } + + GIVEN { + ASSUME(GetMoveFixedHPDamage(MOVE_SONIC_BOOM) == 20); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(mon); + } WHEN { + TURN { MOVE(player, MOVE_SONIC_BOOM); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SONIC_BOOM, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT(results[0].damage == 20); + EXPECT(results[1].damage == 20); + } +} + +TO_DO_BATTLE_TEST("Sonic Boom affects ghost types (Gen1)") + +SINGLE_BATTLE_TEST("Sonic Boom doesn't affect ghost types (Gen2+)") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_GASTLY); + } WHEN { + TURN { MOVE(player, MOVE_SONIC_BOOM); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SONIC_BOOM, player); + MESSAGE("It doesn't affect the opposing Gastly…"); + } +} diff --git a/test/battle/move_effect/fixed_percent_damage.c b/test/battle/move_effect/fixed_percent_damage.c new file mode 100644 index 000000000000..408139b98ea3 --- /dev/null +++ b/test/battle/move_effect/fixed_percent_damage.c @@ -0,0 +1,9 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Super Fang does 50% damage to the target's current HP") +TO_DO_BATTLE_TEST("Super Fang always deals at least 1 HP of damage") +TO_DO_BATTLE_TEST("Super Fang is unaffected by type immunities (Gen 1)") +TO_DO_BATTLE_TEST("Super Fang doesn't hit Ghost-type PokΓ©mon (Gen 2+)") + +TO_DO_BATTLE_TEST("Guardian of Alola does 75% damage to the target's current HP") diff --git a/test/battle/move_effect/flail.c b/test/battle/move_effect/flail.c index af5544d9b4d3..e1ba1a2e5e80 100644 --- a/test/battle/move_effect/flail.c +++ b/test/battle/move_effect/flail.c @@ -1,4 +1,21 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Flail (Move Effect) test titles") +TO_DO_BATTLE_TEST("Flail has 20 power when HP is greater or equal than 68.8% (Gen2-3)") +TO_DO_BATTLE_TEST("Flail has 20 power when HP is greater or equal than 67.2% (Gen4+)") +TO_DO_BATTLE_TEST("Flail has 40 power when HP is greater or equal than 35.4% (Gen2-3)") +TO_DO_BATTLE_TEST("Flail has 40 power when HP is greater or equal than 34.4% (Gen4+)") +TO_DO_BATTLE_TEST("Flail has 80 power when HP is greater or equal than 20.8% (Gen2-3)") +TO_DO_BATTLE_TEST("Flail has 80 power when HP is greater or equal than 20.3% (Gen4+)") +TO_DO_BATTLE_TEST("Flail has 100 power when HP is greater or equal than 10.4% (Gen2-3)") +TO_DO_BATTLE_TEST("Flail has 100 power when HP is greater or equal than 9.4% (Gen4+)") +TO_DO_BATTLE_TEST("Flail has 150 power when HP is greater or equal than 4.2% (Gen2-3)") +TO_DO_BATTLE_TEST("Flail has 150 power when HP is greater or equal than 3.1% (Gen4+)") +TO_DO_BATTLE_TEST("Flail has 200 power when HP is less than 4.2% (Gen2-3)") +TO_DO_BATTLE_TEST("Flail has 200 power when HP is less than 3.1% (Gen4+)") + +TO_DO_BATTLE_TEST("Flail cannot get a Critical Hit (Gen2)") +TO_DO_BATTLE_TEST("Flail can get a Critical Hit (Gen3+)") + +TO_DO_BATTLE_TEST("Flail's damage doesn't vary by a random factor (Gen2)") +TO_DO_BATTLE_TEST("Flail's damage varies by a random factor (Gen3+)") diff --git a/test/battle/move_effect/flatter.c b/test/battle/move_effect/flatter.c index 7effb09329be..ce798e555ca6 100644 --- a/test/battle/move_effect/flatter.c +++ b/test/battle/move_effect/flatter.c @@ -1,4 +1,29 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Flatter (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_FLATTER) == EFFECT_FLATTER); +} + +SINGLE_BATTLE_TEST("Flatter increases the target's Sp. Attack by 1 stage and confuses them") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_FLATTER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLATTER, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + EXPECT(opponent->volatiles.confusionTurns > 0); + } +} + +TO_DO_BATTLE_TEST("Flatter raises the target's Sp. Atk even if they're already confused") +TO_DO_BATTLE_TEST("Flatter raises the target's Sp. Atk even when protected by Safeguard") +TO_DO_BATTLE_TEST("Flatter raises the target's Sp. Atk even when protected Own Tempo") +TO_DO_BATTLE_TEST("Flatter confuses the target even when they have their Sp. Atk maxed") +TO_DO_BATTLE_TEST("Flatter confuses the target even when at -6 Sp. Atk and has Contrary") diff --git a/test/battle/move_effect/fling.c b/test/battle/move_effect/fling.c index b98020474b6d..012485abe85a 100644 --- a/test/battle/move_effect/fling.c +++ b/test/battle/move_effect/fling.c @@ -6,7 +6,7 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING); } -SINGLE_BATTLE_TEST("Fling fails if pokemon holds no item") +SINGLE_BATTLE_TEST("Fling fails if PokΓ©mon holds no item") { u16 item; @@ -29,7 +29,7 @@ SINGLE_BATTLE_TEST("Fling fails if pokemon holds no item") } } -SINGLE_BATTLE_TEST("Fling fails if pokemon is under the effects of Embargo or Magic Room") +SINGLE_BATTLE_TEST("Fling fails if PokΓ©mon is under the effects of Embargo or Magic Room") { u16 move; @@ -56,22 +56,24 @@ SINGLE_BATTLE_TEST("Fling fails if pokemon is under the effects of Embargo or Ma } } -SINGLE_BATTLE_TEST("Fling fails for pokemon with Klutz ability") +SINGLE_BATTLE_TEST("Fling fails for PokΓ©mon with Klutz ability (Gen5+)") { - u16 ability; + enum Ability ability; + u32 config; - PARAMETRIZE {ability = ABILITY_KLUTZ; } - PARAMETRIZE {ability = ABILITY_RUN_AWAY; } + PARAMETRIZE { ability = ABILITY_RUN_AWAY; config = GEN_4; } + PARAMETRIZE { ability = ABILITY_KLUTZ; config = GEN_4; } + PARAMETRIZE { ability = ABILITY_KLUTZ; config = GEN_5; } GIVEN { - ASSUME(B_KLUTZ_FLING_INTERACTION >= GEN_5); + WITH_CONFIG(CONFIG_KLUTZ_FLING_INTERACTION, config); PLAYER(SPECIES_BUNEARY) { Item(ITEM_RAZOR_CLAW); Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_FLING); } } SCENE { MESSAGE("Buneary used Fling!"); - if (ability != ABILITY_KLUTZ) { + if (ability != ABILITY_KLUTZ || config == GEN_4) { ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); HP_BAR(opponent); } else { @@ -80,6 +82,36 @@ SINGLE_BATTLE_TEST("Fling fails for pokemon with Klutz ability") } } +SINGLE_BATTLE_TEST("Fling fails if the item changes the PokΓ©mon's form") +{ + GIVEN { + PLAYER(SPECIES_GIRATINA_ORIGIN) { Item(ITEM_GRISEOUS_CORE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_FLING); } + } SCENE { + MESSAGE("But it failed!"); + } THEN { + EXPECT(player->item == ITEM_GRISEOUS_CORE); + } +} + +SINGLE_BATTLE_TEST("Fling works if the item changes a PokΓ©mon's form but not the one holding it") +{ + GIVEN { + PLAYER(SPECIES_VENUSAUR) { Item(ITEM_BLASTOISINITE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_FLING); } + } SCENE { + NOT MESSAGE("But it failed!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); + HP_BAR(opponent); + } THEN { + EXPECT(player->item == ITEM_NONE); + } +} + SINGLE_BATTLE_TEST("Fling's thrown item can be regained with Recycle") { GIVEN { @@ -150,7 +182,24 @@ SINGLE_BATTLE_TEST("Fling - Item is lost when target protects itself") } } -SINGLE_BATTLE_TEST("Fling doesn't consume the item if pokemon is asleep/frozen/paralyzed") +SINGLE_BATTLE_TEST("Fling - Item does not get blocked by Unnerve if it isn't a berry") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_TAUNT) == EFFECT_TAUNT); + PLAYER(SPECIES_CALYREX) { Item(ITEM_MENTAL_HERB); Ability(ABILITY_UNNERVE); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ORAN_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_TAUNT); MOVE(opponent, MOVE_SCRATCH); } + TURN { MOVE(player, MOVE_FLING); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TAUNT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); + HP_BAR(opponent); + MESSAGE("The opposing Wobbuffet's Taunt wore off!"); + } +} + +SINGLE_BATTLE_TEST("Fling doesn't consume the item if PokΓ©mon is asleep/frozen/paralyzed") { u32 status; u16 item; @@ -446,12 +495,56 @@ SINGLE_BATTLE_TEST("Fling deals damage based on items fling power") PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_VENUSAURITE); } OPPONENT(SPECIES_REGIROCK); } WHEN { - TURN { MOVE(player, MOVE_CRUNCH); } TURN { MOVE(player, MOVE_FLING); } + TURN { MOVE(player, MOVE_CRUNCH); } } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); + HP_BAR(opponent, captureDamage: &damage[0]); ANIMATION(ANIM_TYPE_MOVE, MOVE_CRUNCH, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + } +} + +SINGLE_BATTLE_TEST("Fling deals damage based on a TM's move power") +{ + s16 damage[2]; + + GIVEN { + ASSUME(GetMovePower(MOVE_EARTHQUAKE) == GetMovePower(MOVE_EGG_BOMB)); + ASSUME(!IsSpeciesOfType(SPECIES_WOBBUFFET, TYPE_DARK)); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_TM_EARTHQUAKE); } + OPPONENT(SPECIES_HIPPOWDON); + } WHEN { + TURN { MOVE(player, MOVE_FLING); } + TURN { MOVE(player, MOVE_EGG_BOMB); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EGG_BOMB, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + } +} + +SINGLE_BATTLE_TEST("Fling deals damage based on a TM's move power") +{ + s16 damage[2]; + + GIVEN { + ASSUME(GetMovePower(MOVE_EARTHQUAKE) == GetMovePower(MOVE_EGG_BOMB)); + ASSUME(!IsSpeciesOfType(SPECIES_WOBBUFFET, TYPE_DARK)); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_TM_EARTHQUAKE); } + OPPONENT(SPECIES_HIPPOWDON); + } WHEN { + TURN { MOVE(player, MOVE_FLING); } + TURN { MOVE(player, MOVE_EGG_BOMB); } + } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EGG_BOMB, player); HP_BAR(opponent, captureDamage: &damage[1]); } THEN { EXPECT_EQ(damage[0], damage[1]); diff --git a/test/battle/move_effect/flower_shield.c b/test/battle/move_effect/flower_shield.c index 784cce99f2c5..4a7216385569 100644 --- a/test/battle/move_effect/flower_shield.c +++ b/test/battle/move_effect/flower_shield.c @@ -6,13 +6,13 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_FLOWER_SHIELD) == EFFECT_FLOWER_SHIELD); } -DOUBLE_BATTLE_TEST("Flower Shield raises the defense of all grass type pokemon") +DOUBLE_BATTLE_TEST("Flower Shield raises the defense of all Grass-type PokΓ©mon") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_TANGROWTH].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_SUNKERN].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_SUNFLORA].types[0] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_TANGROWTH, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_SUNKERN, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_SUNFLORA, 0) == TYPE_GRASS); PLAYER(SPECIES_TANGELA); PLAYER(SPECIES_TANGROWTH); OPPONENT(SPECIES_SUNKERN); @@ -35,3 +35,55 @@ DOUBLE_BATTLE_TEST("Flower Shield raises the defense of all grass type pokemon") MESSAGE("The opposing Sunflora's Defense rose!"); } } + +SINGLE_BATTLE_TEST("Flower Shield fails if there's no Grass-type PokΓ©mon on the field") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_FLOWER_SHIELD); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FLOWER_SHIELD, player); + } +} + +DOUBLE_BATTLE_TEST("Flower Shield doesn't affect Grass-type PokΓ©mon that are in a semi-invulnerable position") +{ + GIVEN { + PLAYER(SPECIES_BULBASAUR); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_BULBASAUR); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_FLY, target: playerLeft); + MOVE(playerLeft, MOVE_FLOWER_SHIELD); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLY, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLOWER_SHIELD, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + } + } +} + +AI_DOUBLE_BATTLE_TEST("AI uses Flower Shield") +{ + GIVEN { + ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_GRASS); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + OPPONENT(SPECIES_TANGELA) { Moves(MOVE_FLOWER_SHIELD, MOVE_POUND); } + OPPONENT(SPECIES_TANGELA); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_FLOWER_SHIELD); } + } +} diff --git a/test/battle/move_effect/focus_energy.c b/test/battle/move_effect/focus_energy.c index 8ecb3ccb47c1..363e6bd5630e 100644 --- a/test/battle/move_effect/focus_energy.c +++ b/test/battle/move_effect/focus_energy.c @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Focus Energy increases the user's critical hit ratio by 1 st u32 genConfig = 0, chance = 0; for (u32 j = GEN_1; j <= GEN_9; j++) { PARAMETRIZE { genConfig = j; useFocusEnergy = FALSE; chance = j >= GEN_7 ? 24 : 16; } // ~4.16%/6.25% with Wobbuffet's base speed - PARAMETRIZE { genConfig = j; useFocusEnergy = TRUE; + PARAMETRIZE { genConfig = j; useFocusEnergy = TRUE; if (j >= GEN_6) chance = 2; // 50% / 25% else if (j >= GEN_3) @@ -23,9 +23,9 @@ SINGLE_BATTLE_TEST("Focus Energy increases the user's critical hit ratio by 1 st } PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); - WITH_CONFIG(GEN_CONFIG_FOCUS_ENERGY_CRIT_RATIO, genConfig); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseSpeed == 33); + WITH_CONFIG(CONFIG_CRIT_CHANCE, (genConfig == GEN_1)? GEN_2 : genConfig); + WITH_CONFIG(CONFIG_FOCUS_ENERGY_CRIT_RATIO, genConfig); + ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -39,3 +39,33 @@ SINGLE_BATTLE_TEST("Focus Energy increases the user's critical hit ratio by 1 st MESSAGE("A critical hit!"); } } + +SINGLE_BATTLE_TEST("Focus Energy multiplies crit chance by 4 with gen 1 crit chance") +{ + bool32 useFocusEnergy = 0; + u32 genConfig = 0, chance = 0; + for (u32 j = GEN_1; j <= GEN_9; j++) { + PARAMETRIZE { genConfig = j; useFocusEnergy = FALSE; chance = 16;} + PARAMETRIZE { genConfig = j; useFocusEnergy = TRUE; chance = 4;} + } + PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); + GIVEN { + WITH_CONFIG(CONFIG_CRIT_CHANCE, GEN_1); + WITH_CONFIG(CONFIG_FOCUS_ENERGY_CRIT_RATIO, genConfig); + ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (useFocusEnergy) + TURN { MOVE(player, MOVE_FOCUS_ENERGY); } + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + if (useFocusEnergy) + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_ENERGY, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + MESSAGE("A critical hit!"); + } +} + +TO_DO_BATTLE_TEST("Focus Energy fails if critical hit stage was already increased by Dragon Cheer") +TO_DO_BATTLE_TEST("Baton Pass passes Focus Energy's effect"); diff --git a/test/battle/move_effect/focus_punch.c b/test/battle/move_effect/focus_punch.c index 7696831dab59..35f26ae9eec9 100644 --- a/test/battle/move_effect/focus_punch.c +++ b/test/battle/move_effect/focus_punch.c @@ -75,6 +75,18 @@ DOUBLE_BATTLE_TEST("Focus Punch activation is based on Speed") } } +TO_DO_BATTLE_TEST("Focus Punch activates when the user's Substitute is hit"); +TO_DO_BATTLE_TEST("Focus Punch activates when the user is hit by a status move"); +TO_DO_BATTLE_TEST("Focus Punch uses PP when losing focus (Gen 3-4)"); +TO_DO_BATTLE_TEST("Focus Punch doesn't use PP when losing focus (Gen 5+)"); +TO_DO_BATTLE_TEST("Focus Punch losing focus is considered as the last move used (Gen 3-4)"); //Eg. Encore +TO_DO_BATTLE_TEST("Focus Punch losing focus is not considered as the last move used (Gen 5+)"); //Eg. Encore +TO_DO_BATTLE_TEST("Focus Punch's initial message is not considered as using the move for Zoom Lens"); +TO_DO_BATTLE_TEST("Focus Punch's initial message is not shown if the user selected a different move and was Encored into using Focus Punch"); +TO_DO_BATTLE_TEST("Focus Punch will use the selected move's priority when being Encored into Focus Punch"); +TO_DO_BATTLE_TEST("Focus Punch will lose focus if damaged when used by selecting a different move and being Encored (Gen 3-4)"); +TO_DO_BATTLE_TEST("Focus Punch will NOT lose focus if damaged when used by selecting a different move and being Encored (Gen 5+)"); + AI_SINGLE_BATTLE_TEST("AI won't use Focus Punch if it predicts a damaging move") { GIVEN { @@ -106,8 +118,11 @@ AI_SINGLE_BATTLE_TEST("AI won't use status moves if the player's best attacking GIVEN { ASSUME(GetMoveEffect(MOVE_FOCUS_PUNCH) == EFFECT_FOCUS_PUNCH); ASSUME(GetMoveCategory(MOVE_SWORDS_DANCE) == DAMAGE_CATEGORY_STATUS); + // If Clefable is Normal-type, it will always use Play Rough. + ASSUME(GetSpeciesType(SPECIES_CLEFABLE, 0) == TYPE_FAIRY); + ASSUME(GetSpeciesType(SPECIES_CLEFABLE, 1) == TYPE_FAIRY); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); - PLAYER(SPECIES_SNORLAX) { Moves(MOVE_FOCUS_PUNCH, MOVE_TACKLE); } + PLAYER(SPECIES_SNORLAX) { Moves(MOVE_FOCUS_PUNCH, MOVE_POUND); } OPPONENT(SPECIES_CLEFABLE) { Moves(MOVE_PLAY_ROUGH, MOVE_SWORDS_DANCE); } } WHEN { TURN { MOVE(player, MOVE_FOCUS_PUNCH); EXPECT_MOVE(opponent, MOVE_PLAY_ROUGH); } diff --git a/test/battle/move_effect/follow_me.c b/test/battle/move_effect/follow_me.c index 89591b8c6e8a..1acf193864b5 100644 --- a/test/battle/move_effect/follow_me.c +++ b/test/battle/move_effect/follow_me.c @@ -34,6 +34,19 @@ DOUBLE_BATTLE_TEST("Follow Me redirects single target moves used by opponents to } } +TO_DO_BATTLE_TEST("Follow Me doesn't redirect opponent moves that can't affect opponents") //Eg. Helping Hand +TO_DO_BATTLE_TEST("Follow Me no longer redirects if the center of attention faints mid-turn") +TO_DO_BATTLE_TEST("Follow Me can only redirect charging moves on the turn that they would hit") +TO_DO_BATTLE_TEST("Follow Me can only redirect Future Sight/Doom Desire on the turn they were selected (Gen3-5)") +TO_DO_BATTLE_TEST("Follow Me does not redirect Future Sight/Doom Desire (Gen 6+)") +TO_DO_BATTLE_TEST("Follow Me draws Electric/Water moves even if there's a PokΓ©mon with Lightning Rod/Storm Drain") +TO_DO_BATTLE_TEST("Follow Me prioritizes the first PokΓ©mon that used it") // There can be 2 centers of attention. If the first is gone, the 2nd is used +//TO_DO_BATTLE_TEST("Triples: Follow Me can only draw non-adjacent moves if they use a long-range move") +TO_DO_BATTLE_TEST("Follow Me can be used in Single Battles (Gen3-SwSh)") +TO_DO_BATTLE_TEST("Follow Me fails in Single Battles (BDSP+)") +TO_DO_BATTLE_TEST("Follow Me cannot redirect Sky Drop") +TO_DO_BATTLE_TEST("Follow Me does not draw attack when the user is being Sky-Dropped") + DOUBLE_BATTLE_TEST("Spotlight redirects single target moves used by the opposing side to Spotlight's target") { struct BattlePokemon *moveTarget = NULL; diff --git a/test/battle/move_effect/foresight.c b/test/battle/move_effect/foresight.c index 082e2d6fa42f..59209030d0b9 100644 --- a/test/battle/move_effect/foresight.c +++ b/test/battle/move_effect/foresight.c @@ -1,4 +1,14 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Foresight (Move Effect) test titles") +TO_DO_BATTLE_TEST("Foresight removes Ghost's type immunity to Normal and Fighting types") +TO_DO_BATTLE_TEST("Foresight causes accuracy/evasion stat changes only between the user/target when the user's accuracy stage is less than the target's evasion stage (Gen 2)") +TO_DO_BATTLE_TEST("Foresight causes all moves against the target to ignore evasion stat changes (Gen 3)") +TO_DO_BATTLE_TEST("Foresight causes all moves against the target to ignore only positive evasion stat changes (Gen 4+)") // Eg. Doesn't ignore Sweet Scent +TO_DO_BATTLE_TEST("Foresight doesn't cause moves used against the target to always hit (Gen 2-3)") +TO_DO_BATTLE_TEST("Foresight causes moves used against the target to always hit (Gen 4+)") +TO_DO_BATTLE_TEST("Foresight does not make moves hit semi-invulnerable targets") +TO_DO_BATTLE_TEST("Foresight fails if the target is already under its effect (Gen 2 and Gen5+)") +TO_DO_BATTLE_TEST("Foresight doesn't fail if the target is already under its effect (Gen 3-4)") +TO_DO_BATTLE_TEST("Baton Pass passes Foresight's effect (Gen 2)"); +TO_DO_BATTLE_TEST("Baton Pass doesn't pass Foresight's effect (Gen 3+)"); diff --git a/test/battle/move_effect/foul_play.c b/test/battle/move_effect/foul_play.c index 7df04201ef4e..58af6bc4f0ad 100644 --- a/test/battle/move_effect/foul_play.c +++ b/test/battle/move_effect/foul_play.c @@ -6,7 +6,7 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_FOUL_PLAY) == EFFECT_FOUL_PLAY); } -SINGLE_BATTLE_TEST("Foul Play uses physical attack stat of target", s16 damage) +SINGLE_BATTLE_TEST("Foul Play uses the target's Attack stat and stat stages of target", s16 damage) { u32 move; @@ -27,3 +27,7 @@ SINGLE_BATTLE_TEST("Foul Play uses physical attack stat of target", s16 damage) EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.0), results[1].damage); } } + +TO_DO_BATTLE_TEST("Foul Play uses the user's attack modifiers - Held Item") +TO_DO_BATTLE_TEST("Foul Play uses the user's attack modifiers - Ability") +TO_DO_BATTLE_TEST("Foul Play uses the user's attack modifiers - Burn") diff --git a/test/battle/move_effect/frustration.c b/test/battle/move_effect/frustration.c index eb994c50768a..bc9682a954aa 100644 --- a/test/battle/move_effect/frustration.c +++ b/test/battle/move_effect/frustration.c @@ -1,4 +1,6 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Frustration (Move Effect) test titles") +TO_DO_BATTLE_TEST("Frustration's power increases the lower friendship of the user is") +TO_DO_BATTLE_TEST("Frustration does 0 damage at max Friendship (Gen2)") +TO_DO_BATTLE_TEST("Frustration does 1 damage at max Friendship (Gen3+)") diff --git a/test/battle/move_effect/fury_cutter.c b/test/battle/move_effect/fury_cutter.c index 10d9d8a64ed0..74362c631692 100644 --- a/test/battle/move_effect/fury_cutter.c +++ b/test/battle/move_effect/fury_cutter.c @@ -6,7 +6,7 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_FURY_CUTTER) == EFFECT_FURY_CUTTER); } -SINGLE_BATTLE_TEST("Fury Cutter power doubles with each use, up to 160 power") +SINGLE_BATTLE_TEST("Fury Cutter's power doubles with each use, up to 160 power") { s16 damage[6]; int turn; @@ -37,6 +37,10 @@ SINGLE_BATTLE_TEST("Fury Cutter power doubles with each use, up to 160 power") } } +TO_DO_BATTLE_TEST("Fury Cutter's power is reset if the user misses") +TO_DO_BATTLE_TEST("Fury Cutter's power is reset if the user is switched out") +TO_DO_BATTLE_TEST("Fury Cutter's power is reset if the trainer uses an item") + SINGLE_BATTLE_TEST("Fury Cutter counter is the same for both hits of Parental Bond") { s16 damage[4]; diff --git a/test/battle/move_effect/fusion_combo.c b/test/battle/move_effect/fusion_combo.c index 7561536b11d1..30c4508a00ad 100644 --- a/test/battle/move_effect/fusion_combo.c +++ b/test/battle/move_effect/fusion_combo.c @@ -1,4 +1,6 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Fusion Flare/Bolt (Move Effect) test titles") +TO_DO_BATTLE_TEST("Fusion Flare and Fusion Bolt double in power if the other move was immediately used in the same turn") +TO_DO_BATTLE_TEST("Fusion Flare and Fusion Bolt do not double in power if there was a move used in-between the two of them") +TO_DO_BATTLE_TEST("Fusion Flare and Fusion Bolt double in power if used by the same PokΓ©mon in the same turn") // Use Instruct to replicate this diff --git a/test/battle/move_effect/future_sight.c b/test/battle/move_effect/future_sight.c index 3995e8479fb3..ee424c9bd917 100644 --- a/test/battle/move_effect/future_sight.c +++ b/test/battle/move_effect/future_sight.c @@ -1,10 +1,18 @@ #include "global.h" #include "test/battle.h" +#if B_UPDATED_MOVE_DATA >= GEN_6 + #define FUTURE_SIGHT_EQUIVALENT MOVE_SEED_FLARE /* 120 power */ +#elif B_UPDATED_MOVE_DATA >= GEN_5 + #define FUTURE_SIGHT_EQUIVALENT MOVE_DYNAMAX_CANNON /* 100 power */ +#else + #define FUTURE_SIGHT_EQUIVALENT MOVE_EXTRASENSORY /* 80 power */ +#endif + ASSUMPTIONS { - ASSUME(GetMovePower(MOVE_SEED_FLARE) == GetMovePower(MOVE_FUTURE_SIGHT)); - ASSUME(GetMoveCategory(MOVE_SEED_FLARE) == GetMoveCategory(MOVE_FUTURE_SIGHT)); + ASSUME(GetMovePower(FUTURE_SIGHT_EQUIVALENT) == GetMovePower(MOVE_FUTURE_SIGHT)); + ASSUME(GetMoveCategory(FUTURE_SIGHT_EQUIVALENT) == GetMoveCategory(MOVE_FUTURE_SIGHT)); ASSUME(GetMoveEffect(MOVE_FUTURE_SIGHT) == EFFECT_FUTURE_SIGHT); ASSUME(GetMovePower(MOVE_FUTURE_SIGHT) > 0); } @@ -23,13 +31,13 @@ SINGLE_BATTLE_TEST("Future Sight uses Sp. Atk stat of the original user without PLAYER(SPECIES_RAICHU) { Item(item); } OPPONENT(SPECIES_REGICE); } WHEN { - TURN { MOVE(player, MOVE_SEED_FLARE, WITH_RNG(RNG_SECONDARY_EFFECT, FALSE)); } + TURN { MOVE(player, FUTURE_SIGHT_EQUIVALENT, WITH_RNG(RNG_SECONDARY_EFFECT, FALSE)); } TURN { MOVE(player, MOVE_FUTURE_SIGHT); } TURN { SWITCH(player, 1); } TURN { } TURN { } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SEED_FLARE, player); + ANIMATION(ANIM_TYPE_MOVE, FUTURE_SIGHT_EQUIVALENT, player); HP_BAR(opponent, captureDamage: &seedFlareDmg); ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, player); MESSAGE("The opposing Regice took the Future Sight attack!"); @@ -49,24 +57,25 @@ SINGLE_BATTLE_TEST("Future Sight is not boosted by Life Orb is original user if PLAYER(SPECIES_RAICHU) { Item(ITEM_LIFE_ORB); } OPPONENT(SPECIES_REGICE); } WHEN { - TURN { MOVE(player, MOVE_SEED_FLARE, WITH_RNG(RNG_SECONDARY_EFFECT, FALSE)); } + TURN { MOVE(player, FUTURE_SIGHT_EQUIVALENT, WITH_RNG(RNG_SECONDARY_EFFECT, FALSE)); } TURN { MOVE(player, MOVE_FUTURE_SIGHT); } TURN { SWITCH(player, 1); } TURN { } TURN { } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SEED_FLARE, player); + ANIMATION(ANIM_TYPE_MOVE, FUTURE_SIGHT_EQUIVALENT, player); HP_BAR(opponent, captureDamage: &seedFlareDmg); ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, player); MESSAGE("The opposing Regice took the Future Sight attack!"); HP_BAR(opponent, captureDamage: &futureSightDmg); - NOT MESSAGE("Raichu was hurt by its Life Orb!"); + NOT HP_BAR(player); } THEN { EXPECT_EQ(seedFlareDmg, futureSightDmg); } } -SINGLE_BATTLE_TEST("Future Sight receives STAB from party mon") +TO_DO_BATTLE_TEST("Future Sight does not receive STAB from party mon (Gen 2-4)") +SINGLE_BATTLE_TEST("Future Sight receives STAB from party mon (Gen 5+)") { s16 seedFlareDmg; s16 futureSightDmg; @@ -76,13 +85,13 @@ SINGLE_BATTLE_TEST("Future Sight receives STAB from party mon") PLAYER(SPECIES_RAICHU); OPPONENT(SPECIES_REGICE); } WHEN { - TURN { MOVE(player, MOVE_SEED_FLARE, WITH_RNG(RNG_SECONDARY_EFFECT, FALSE)); } + TURN { MOVE(player, FUTURE_SIGHT_EQUIVALENT, WITH_RNG(RNG_SECONDARY_EFFECT, FALSE)); } TURN { MOVE(player, MOVE_FUTURE_SIGHT); } TURN { SWITCH(player, 1); } TURN { } TURN { } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SEED_FLARE, player); + ANIMATION(ANIM_TYPE_MOVE, FUTURE_SIGHT_EQUIVALENT, player); HP_BAR(opponent, captureDamage: &seedFlareDmg); ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, player); HP_BAR(opponent, captureDamage: &futureSightDmg); @@ -91,20 +100,21 @@ SINGLE_BATTLE_TEST("Future Sight receives STAB from party mon") } } -SINGLE_BATTLE_TEST("Future Sight is affected by type effectiveness") +TO_DO_BATTLE_TEST("Future Sight is not affected by type effectiveness (Gen 2-4)") +SINGLE_BATTLE_TEST("Future Sight is affected by type effectiveness (Gen 5+)") { GIVEN { PLAYER(SPECIES_PIKACHU); PLAYER(SPECIES_RAICHU); OPPONENT(SPECIES_HOUNDOOM); } WHEN { - TURN { MOVE(player, MOVE_SEED_FLARE, WITH_RNG(RNG_SECONDARY_EFFECT, FALSE)); } + TURN { MOVE(player, FUTURE_SIGHT_EQUIVALENT, WITH_RNG(RNG_SECONDARY_EFFECT, FALSE)); } TURN { MOVE(player, MOVE_FUTURE_SIGHT); } TURN { SWITCH(player, 1); } TURN { } TURN { } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SEED_FLARE, player); + ANIMATION(ANIM_TYPE_MOVE, FUTURE_SIGHT_EQUIVALENT, player); HP_BAR(opponent); ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, player); MESSAGE("The opposing Houndoom took the Future Sight attack!"); @@ -113,6 +123,9 @@ SINGLE_BATTLE_TEST("Future Sight is affected by type effectiveness") } } +TO_DO_BATTLE_TEST("Future Sight ignores Wonder Guard (Gen 2-4)") +TO_DO_BATTLE_TEST("Future Sight doesn't ignore Wonder Guard (Gen 5+)") + SINGLE_BATTLE_TEST("Future Sight will miss timing if target faints before it is about to get hit") { GIVEN { diff --git a/test/battle/move_effect/gastro_acid.c b/test/battle/move_effect/gastro_acid.c index 8cb0a7d4af90..1bbc8c0d5b32 100644 --- a/test/battle/move_effect/gastro_acid.c +++ b/test/battle/move_effect/gastro_acid.c @@ -8,7 +8,8 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Gastro Acid fails if target has a banned ability") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; } diff --git a/test/battle/move_effect/gear_up.c b/test/battle/move_effect/gear_up.c index 03aba9a39582..8689d6d268a4 100644 --- a/test/battle/move_effect/gear_up.c +++ b/test/battle/move_effect/gear_up.c @@ -1,4 +1,17 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Gear Up (Move Effect) test titles") +TO_DO_BATTLE_TEST("Gear Up increases the Attack and Sp. Attack of the user and allies if they have Plus or Minus") + +AI_DOUBLE_BATTLE_TEST("AI uses Gear Up") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + OPPONENT(SPECIES_KLINKLANG) { Ability(ABILITY_PLUS); Moves(MOVE_GEAR_UP, MOVE_WATER_GUN, MOVE_POUND); } + OPPONENT(SPECIES_KLINKLANG) { Ability(ABILITY_PLUS); Moves(MOVE_GEAR_UP, MOVE_WATER_GUN, MOVE_POUND); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_GEAR_UP); } + } +} diff --git a/test/battle/move_effect/geomancy.c b/test/battle/move_effect/geomancy.c index f5b113a4524a..934e5e2f0a2b 100644 --- a/test/battle/move_effect/geomancy.c +++ b/test/battle/move_effect/geomancy.c @@ -1,4 +1,6 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Geomancy (Move Effect) test titles") +TO_DO_BATTLE_TEST("Geomancy takes 2 turns to increase Sp. Atk, Sp. Def and Speed by 2 stages"); +TO_DO_BATTLE_TEST("Geomancy only takes 1 turn when holding Power Herb") +TO_DO_BATTLE_TEST("Geomancy fails on the second turn if the user falls for Taunt while charging") diff --git a/test/battle/move_effect/glaive_rush.c b/test/battle/move_effect/glaive_rush.c index faf1f96664af..ff949a57cd90 100644 --- a/test/battle/move_effect/glaive_rush.c +++ b/test/battle/move_effect/glaive_rush.c @@ -96,8 +96,8 @@ SINGLE_BATTLE_TEST("Glaive Rush doesn't affect the user if the effect is blocked { u32 species; - PARAMETRIZE { species = SPECIES_CLEFAIRY; } - PARAMETRIZE { species = SPECIES_SHELLOS; } // Closest mon in both Defense and Sp. Defense + PARAMETRIZE { species = SPECIES_FIDOUGH; } + PARAMETRIZE { species = SPECIES_MAGNEMITE; } // Closest mon in both Defense and Sp. Defense GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -105,7 +105,7 @@ SINGLE_BATTLE_TEST("Glaive Rush doesn't affect the user if the effect is blocked } WHEN { TURN { MOVE(player, MOVE_GLAIVE_RUSH); MOVE(opponent, MOVE_SCRATCH); } } SCENE { - if (species == SPECIES_CLEFAIRY) + if (species == SPECIES_FIDOUGH) NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_GLAIVE_RUSH, player); else ANIMATION(ANIM_TYPE_MOVE, MOVE_GLAIVE_RUSH, player); diff --git a/test/battle/move_effect/grassy_glide.c b/test/battle/move_effect/grassy_glide.c index 00219fb1ddf4..64e330097091 100644 --- a/test/battle/move_effect/grassy_glide.c +++ b/test/battle/move_effect/grassy_glide.c @@ -1,4 +1,5 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Grassy Glide (Move Effect) test titles") +TO_DO_BATTLE_TEST("Grassy Glide's priority increases by 1 when the user is affected by Grassy Terrain") +TO_DO_BATTLE_TEST("Dynamax: Grassy Glide's priority doesn't increase for the Max Move it becomes") diff --git a/test/battle/move_effect/grassy_terrain.c b/test/battle/move_effect/grassy_terrain.c index 8b1895928b7f..2b5e166bfd41 100644 --- a/test/battle/move_effect/grassy_terrain.c +++ b/test/battle/move_effect/grassy_terrain.c @@ -81,7 +81,7 @@ SINGLE_BATTLE_TEST("Grassy Terrain lasts for 5 turns") } } -SINGLE_BATTLE_TEST("Grassy Terrain heals the pokemon on the field for the duration of the terrain, including last turn") +SINGLE_BATTLE_TEST("Grassy Terrain heals the PokΓ©mon on the field for the duration of the terrain, including last turn") { GIVEN { PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/grav_apple.c b/test/battle/move_effect/grav_apple.c index 7ce2dd26c70a..f2c3099fdc30 100644 --- a/test/battle/move_effect/grav_apple.c +++ b/test/battle/move_effect/grav_apple.c @@ -1,4 +1,5 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Grav Apple (Move Effect) test titles") +TO_DO_BATTLE_TEST("Grav Apple lowers the target's Defense by 1 stage") +TO_DO_BATTLE_TEST("Grav Apple's power increases by 50% under Gravity's effect") diff --git a/test/battle/move_effect/gravity.c b/test/battle/move_effect/gravity.c index baac7a53eaf8..001505bae03f 100644 --- a/test/battle/move_effect/gravity.c +++ b/test/battle/move_effect/gravity.c @@ -6,7 +6,11 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_GRAVITY) == EFFECT_GRAVITY); } -DOUBLE_BATTLE_TEST("Gravity cancels fly and sky drop if they are in the air") +TO_DO_BATTLE_TEST("Gravity causes certain moves to fail") // Fly, Jump Kick, High Jump Kick, Splash, Bounce, Magnet Rise, Telekinesis, Sky Drop, Flying Press, Floaty Fall +TO_DO_BATTLE_TEST("Gravity increases accuracy of all moves by 5/3 (~1.67)") +TO_DO_BATTLE_TEST("Gravity causes all battlers to become grounded") + +DOUBLE_BATTLE_TEST("Gravity cancels Fly and Sky Drop if they are in the air") { u8 visibility; GIVEN { @@ -45,3 +49,35 @@ DOUBLE_BATTLE_TEST("Gravity cancels fly and sky drop if they are in the air") EXPECT_EQ(gLastMoves[0], MOVE_GRAVITY); } } + +AI_DOUBLE_BATTLE_TEST("AI uses Gravity") +{ + u32 move, friendItem, foeItem; + u64 aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; + + PARAMETRIZE { move = MOVE_THUNDER; friendItem = ITEM_NONE; foeItem = ITEM_NONE; } + PARAMETRIZE { move = MOVE_HEADBUTT; friendItem = ITEM_AIR_BALLOON; foeItem = ITEM_NONE; } + PARAMETRIZE { move = MOVE_HEADBUTT; friendItem = ITEM_AIR_BALLOON; foeItem = ITEM_AIR_BALLOON; } + PARAMETRIZE { move = MOVE_HEADBUTT; friendItem = ITEM_NONE; foeItem = ITEM_AIR_BALLOON; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + move = MOVE_THUNDER; friendItem = ITEM_NONE; foeItem = ITEM_NONE; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + move = MOVE_HEADBUTT; friendItem = ITEM_AIR_BALLOON; foeItem = ITEM_NONE; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + move = MOVE_HEADBUTT; friendItem = ITEM_AIR_BALLOON; foeItem = ITEM_AIR_BALLOON; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + move = MOVE_HEADBUTT; friendItem = ITEM_NONE; foeItem = ITEM_AIR_BALLOON; } + + GIVEN { + AI_FLAGS(aiFlags); + PLAYER(SPECIES_WOBBUFFET) { Item(foeItem); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_GRAVITY, MOVE_HEADBUTT, MOVE_TAUNT); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_EARTH_POWER); Item(friendItem); } + } WHEN { + if (move == MOVE_THUNDER || (foeItem == ITEM_AIR_BALLOON && friendItem != ITEM_AIR_BALLOON)) + TURN { EXPECT_MOVE(opponentLeft, MOVE_GRAVITY); } + else + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_GRAVITY); } + } +} diff --git a/test/battle/move_effect/growth.c b/test/battle/move_effect/growth.c index 7b53f56cfc4f..a9dda9cfd571 100644 --- a/test/battle/move_effect/growth.c +++ b/test/battle/move_effect/growth.c @@ -1,4 +1,6 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Growth (Move Effect) test titles") +TO_DO_BATTLE_TEST("Growth increases Sp. Atk and Sp. Def by 1 stage (Gen 1)") // Equivalent to raising Special +TO_DO_BATTLE_TEST("Growth increases Sp. Atk by 1 stage (Gen 2-4)") +TO_DO_BATTLE_TEST("Growth increases Attack and Sp. Atk by 1 stage or 2 stages under Sun (Gen 5+)") diff --git a/test/battle/move_effect/grudge.c b/test/battle/move_effect/grudge.c index f0e0e53b6af0..2b74a3b05abb 100644 --- a/test/battle/move_effect/grudge.c +++ b/test/battle/move_effect/grudge.c @@ -1,4 +1,61 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Grudge (Move Effect) test titles") +SINGLE_BATTLE_TEST("Grudge depletes all PP of the move that fainted the target") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, MOVE_POUND, MOVE_SURF); }; + } WHEN { + TURN { + MOVE(player, MOVE_GRUDGE); + MOVE(opponent, MOVE_SCRATCH); + SEND_OUT(player, 1); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRUDGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + MESSAGE("Wobbuffet fainted!"); + } THEN { + EXPECT_GT(opponent->pp[0], 0); + EXPECT_EQ(opponent->pp[1], 0); + EXPECT_GT(opponent->pp[2], 0); + EXPECT_GT(opponent->pp[3], 0); + } +} + +SINGLE_BATTLE_TEST("Grudge does not deplete PP of a Z-Move") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Moves(MOVE_CELEBRATE, MOVE_SCRATCH, MOVE_POUND, MOVE_SURF); }; + } WHEN { + TURN { + MOVE(player, MOVE_GRUDGE); + MOVE(opponent, MOVE_SCRATCH, gimmick: GIMMICK_Z_MOVE); + SEND_OUT(player, 1); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRUDGE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BREAKNECK_BLITZ, opponent); + MESSAGE("Wobbuffet fainted!"); + } THEN { + EXPECT_GT(opponent->pp[0], 0); + EXPECT_GT(opponent->pp[1], 0); + EXPECT_GT(opponent->pp[2], 0); + EXPECT_GT(opponent->pp[3], 0); + } +} + +TO_DO_BATTLE_TEST("Grudge depletes all PP from a Max Move's base move") +TO_DO_BATTLE_TEST("Grudge does not activate for Struggle") +TO_DO_BATTLE_TEST("Grudge's effect disappears if the user takes a new turn - Move"); +TO_DO_BATTLE_TEST("Grudge's effect disappears if the user takes a new turn - Sleep"); +TO_DO_BATTLE_TEST("Grudge's effect disappears if the user takes a new turn - Paralysis"); +TO_DO_BATTLE_TEST("Grudge's effect disappears if the user takes a new turn - Flinching"); +TO_DO_BATTLE_TEST("Grudge's effect doesn't trigger on indirect damage - Sandstorm"); +TO_DO_BATTLE_TEST("Grudge's effect doesn't trigger on indirect damage - Leech Seed"); +TO_DO_BATTLE_TEST("Grudge's effect doesn't trigger on indirect damage - Future Sight"); diff --git a/test/battle/move_effect/guard_split.c b/test/battle/move_effect/guard_split.c index d7572c1431f8..15b14c59d236 100644 --- a/test/battle/move_effect/guard_split.c +++ b/test/battle/move_effect/guard_split.c @@ -20,3 +20,7 @@ SINGLE_BATTLE_TEST("Guard Split averages users and targets Def and Sp. Def stats EXPECT_EQ(player->spDefense, opponent->spDefense); } } + +TO_DO_BATTLE_TEST("Stat stages use Guard Split's altered stats") +TO_DO_BATTLE_TEST("Assault Vest uses Guard Split's altered stats") +TO_DO_BATTLE_TEST("Eviolite uses Guard Split's altered stats") diff --git a/test/battle/move_effect/guard_swap.c b/test/battle/move_effect/guard_swap.c index f0e0e53b6af0..d4be4dbd9364 100644 --- a/test/battle/move_effect/guard_swap.c +++ b/test/battle/move_effect/guard_swap.c @@ -1,4 +1,4 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Grudge (Move Effect) test titles") +TO_DO_BATTLE_TEST("Guard Swap switches the user's Defense and Sp. Def stat stages with the target") diff --git a/test/battle/move_effect/guardian_of_alola.c b/test/battle/move_effect/guardian_of_alola.c deleted file mode 100644 index fe332363630f..000000000000 --- a/test/battle/move_effect/guardian_of_alola.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -TO_DO_BATTLE_TEST("TODO: Write Guardian of Alola (Move Effect) test titles") diff --git a/test/battle/move_effect/haze.c b/test/battle/move_effect/haze.c index 81a30d579681..3f530834fe5c 100644 --- a/test/battle/move_effect/haze.c +++ b/test/battle/move_effect/haze.c @@ -30,3 +30,6 @@ SINGLE_BATTLE_TEST("Haze resets stat changes", s16 damage) EXPECT_EQ(results[0].damage, results[1].damage); } } + +TO_DO_BATTLE_TEST("Haze resets Focus Energy (Gen 1 and 4)") +TO_DO_BATTLE_TEST("Haze doesn't reset Focus Energy (Gen 2-3 and 5+)") diff --git a/test/battle/move_effect/heal_bell.c b/test/battle/move_effect/heal_bell.c index 67bdfda1b80e..e2ca05206a45 100644 --- a/test/battle/move_effect/heal_bell.c +++ b/test/battle/move_effect/heal_bell.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_HEAL_BELL].effect == EFFECT_HEAL_BELL); - ASSUME(gMovesInfo[MOVE_AROMATHERAPY].effect == EFFECT_HEAL_BELL); + ASSUME(GetMoveEffect(MOVE_HEAL_BELL) == EFFECT_HEAL_BELL); + ASSUME(GetMoveEffect(MOVE_AROMATHERAPY) == EFFECT_HEAL_BELL); ASSUME(MoveHasAdditionalEffect(MOVE_SPARKLY_SWIRL, MOVE_EFFECT_AROMATHERAPY)); } @@ -86,7 +86,8 @@ DOUBLE_BATTLE_TEST("Heal Bell/Aromatherapy cures the entire party of the user fr DOUBLE_BATTLE_TEST("Heal Bell does not cure Soundproof partners (Gen 4, Gen 6+)") { - u32 ability, config; + enum Ability ability; + u32 config; PARAMETRIZE { ability = ABILITY_SCRAPPY; config = GEN_4; } PARAMETRIZE { ability = ABILITY_SOUNDPROOF; config = GEN_4; } @@ -95,7 +96,7 @@ DOUBLE_BATTLE_TEST("Heal Bell does not cure Soundproof partners (Gen 4, Gen 6+)" GIVEN { ASSUME(IsSoundMove(MOVE_HEAL_BELL)); - WITH_CONFIG(GEN_CONFIG_HEAL_BELL_SOUNDPROOF, config); + WITH_CONFIG(CONFIG_HEAL_BELL_SOUNDPROOF, config); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_EXPLOUD) { Ability(ability); Status1(STATUS1_POISON); } OPPONENT(SPECIES_WYNAUT); @@ -114,7 +115,8 @@ DOUBLE_BATTLE_TEST("Heal Bell does not cure Soundproof partners (Gen 4, Gen 6+)" SINGLE_BATTLE_TEST("Heal Bell cures inactive Soundproof Pokemon (Gen5+)") { - u32 config, ability; + u32 config; + enum Ability ability; PARAMETRIZE { config = GEN_4, ability = ABILITY_SCRAPPY; } PARAMETRIZE { config = GEN_4, ability = ABILITY_SOUNDPROOF; } @@ -122,7 +124,7 @@ SINGLE_BATTLE_TEST("Heal Bell cures inactive Soundproof Pokemon (Gen5+)") GIVEN { ASSUME(IsSoundMove(MOVE_HEAL_BELL)); - WITH_CONFIG(GEN_CONFIG_HEAL_BELL_SOUNDPROOF, config); + WITH_CONFIG(CONFIG_HEAL_BELL_SOUNDPROOF, config); PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } PLAYER(SPECIES_EXPLOUD) { Ability(ability); Status1(STATUS1_POISON); } OPPONENT(SPECIES_WYNAUT); @@ -150,7 +152,7 @@ SINGLE_BATTLE_TEST("Heal Bell cures a Soundproof user (Gen5, Gen8+)") PARAMETRIZE { config = GEN_8; } GIVEN { ASSUME(IsSoundMove(MOVE_HEAL_BELL)); - WITH_CONFIG(GEN_CONFIG_HEAL_BELL_SOUNDPROOF, config); + WITH_CONFIG(CONFIG_HEAL_BELL_SOUNDPROOF, config); PLAYER(SPECIES_EXPLOUD) { Ability(ABILITY_SOUNDPROOF); Status1(STATUS1_POISON); } OPPONENT(SPECIES_WYNAUT); } WHEN { @@ -164,3 +166,53 @@ SINGLE_BATTLE_TEST("Heal Bell cures a Soundproof user (Gen5, Gen8+)") } } } + +DOUBLE_BATTLE_TEST("Aromatherapy cure Soundproof battlers regardless of config") +{ + u32 ability, config; + + PARAMETRIZE { ability = ABILITY_SOUNDPROOF; config = GEN_4; } + PARAMETRIZE { ability = ABILITY_SOUNDPROOF; config = GEN_5; } + PARAMETRIZE { ability = ABILITY_SOUNDPROOF; config = GEN_6; } + PARAMETRIZE { ability = ABILITY_SOUNDPROOF; config = GEN_8; } + + GIVEN { + ASSUME(!IsSoundMove(MOVE_AROMATHERAPY)); + WITH_CONFIG(CONFIG_HEAL_BELL_SOUNDPROOF, config); + PLAYER(SPECIES_WOBBUFFET) { Ability(ability); Status1(STATUS1_POISON); }; + PLAYER(SPECIES_EXPLOUD) { Ability(ability); Status1(STATUS1_POISON); } + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_AROMATHERAPY, target: playerLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_AROMATHERAPY, playerLeft); + NONE_OF { + MESSAGE("Exploud was hurt by its poisoning!"); + MESSAGE("Wobbuffet was hurt by its poisoning!"); + } + } +} + +SINGLE_BATTLE_TEST("Aromatherapy cures inactive Soundproof Pokemon regardless of config") +{ + u32 config, ability; + + PARAMETRIZE { config = GEN_4, ability = ABILITY_SOUNDPROOF; } + PARAMETRIZE { config = GEN_5, ability = ABILITY_SOUNDPROOF; } + + GIVEN { + ASSUME(!IsSoundMove(MOVE_AROMATHERAPY)); + WITH_CONFIG(CONFIG_HEAL_BELL_SOUNDPROOF, config); + PLAYER(SPECIES_WOBBUFFET) { } + PLAYER(SPECIES_EXPLOUD) { Ability(ability); Status1(STATUS1_POISON); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(player, MOVE_AROMATHERAPY, target: player); } + TURN { SWITCH(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_AROMATHERAPY, player); + SEND_IN_MESSAGE("Exploud"); + NOT MESSAGE("Exploud was hurt by its poisoning!"); + } +} diff --git a/test/battle/move_effect/heal_pulse.c b/test/battle/move_effect/heal_pulse.c index 7c46cbf3448a..c383b7268225 100644 --- a/test/battle/move_effect/heal_pulse.c +++ b/test/battle/move_effect/heal_pulse.c @@ -86,6 +86,7 @@ SINGLE_BATTLE_TEST("Heal Pulse is blocked by Substitute") SINGLE_BATTLE_TEST("Floral Healing heals the target by 2/3rd of it's maxHP if Grassy Terrain is on the field") { GIVEN { + ASSUME(GetMoveEffect(MOVE_FLORAL_HEALING) == EFFECT_HEAL_PULSE); ASSUME(GetMoveEffectArg_MoveProperty(MOVE_FLORAL_HEALING) == MOVE_EFFECT_FLORAL_HEALING); ASSUME(GetMoveEffect(MOVE_GRASSY_TERRAIN) == EFFECT_GRASSY_TERRAIN); PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(1); } diff --git a/test/battle/move_effect/healing_wish.c b/test/battle/move_effect/healing_wish.c index a29b04367cb1..ca78fd049ef4 100644 --- a/test/battle/move_effect/healing_wish.c +++ b/test/battle/move_effect/healing_wish.c @@ -4,15 +4,19 @@ ASSUMPTIONS { ASSUME(GetMoveEffect(MOVE_HEALING_WISH) == EFFECT_HEALING_WISH); - ASSUME(GetMoveEffect(MOVE_LUNAR_DANCE) == EFFECT_HEALING_WISH); } -SINGLE_BATTLE_TEST("Healing Wish causes the user to faint and fully heals the replacement") +SINGLE_BATTLE_TEST("Healing Wish causes the user to faint and heals the replacement's HP and status (singles)") { GIVEN { - ASSUME(B_HEALING_WISH_SWITCH >= GEN_5); + WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_7); + ASSUME(GetMovePP(MOVE_SCRATCH) == 35); + ASSUME(GetMovePP(MOVE_WATER_GUN) == 25); + ASSUME(GetMovePP(MOVE_LEAFAGE) == 40); + ASSUME(GetMovePP(MOVE_EMBER) == 25); PLAYER(SPECIES_GARDEVOIR); - PLAYER(SPECIES_WYNAUT) { HP(1); MaxHP(100); Status1(STATUS1_POISON); } + PLAYER(SPECIES_WYNAUT) { HP(1); MaxHP(100); Status1(STATUS1_POISON); + MovesWithPP({MOVE_SCRATCH, 5}, {MOVE_WATER_GUN, 5}, {MOVE_LEAFAGE, 5}, {MOVE_EMBER, 0}); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_HEALING_WISH); SEND_OUT(player, 1); } @@ -24,54 +28,117 @@ SINGLE_BATTLE_TEST("Healing Wish causes the user to faint and fully heals the re HP_BAR(player, hp: 100); STATUS_ICON(player, none: TRUE); MESSAGE("Wynaut regained health!"); + } THEN { + EXPECT_EQ(player->hp, 100); + EXPECT_EQ(player->status1, 0); + // PP not healed + EXPECT_EQ(player->pp[0], 5); + EXPECT_EQ(player->pp[1], 5); + EXPECT_EQ(player->pp[2], 5); + EXPECT_EQ(player->pp[3], 0); } } -DOUBLE_BATTLE_TEST("Lunar Dance causes the user to faint and fully heals the replacement in a double battle") +DOUBLE_BATTLE_TEST("Healing Wish causes the user to faint and heals the replacement's HP and status (doubles)") { GIVEN { - ASSUME(B_HEALING_WISH_SWITCH >= GEN_5); + WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_7); + ASSUME(GetMovePP(MOVE_SCRATCH) == 35); + ASSUME(GetMovePP(MOVE_WATER_GUN) == 25); + ASSUME(GetMovePP(MOVE_LEAFAGE) == 40); + ASSUME(GetMovePP(MOVE_EMBER) == 25); PLAYER(SPECIES_GARDEVOIR) { Speed(300); } PLAYER(SPECIES_WOBBUFFET) { Speed(50); } - PLAYER(SPECIES_WYNAUT) { HP(99); MaxHP(100); Status1(STATUS1_BURN); Speed(50); } + PLAYER(SPECIES_WYNAUT) { HP(1); MaxHP(100); Status1(STATUS1_BURN); Speed(50); + MovesWithPP({MOVE_SCRATCH, 5}, {MOVE_WATER_GUN, 5}, {MOVE_LEAFAGE, 5}, {MOVE_EMBER, 0}); } OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } } WHEN { - TURN { MOVE(playerLeft, MOVE_LUNAR_DANCE); SEND_OUT(playerLeft, 2); } + TURN { MOVE(playerLeft, MOVE_HEALING_WISH); SEND_OUT(playerLeft, 2); } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_LUNAR_DANCE, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEALING_WISH, playerLeft); HP_BAR(playerLeft, hp: 0); MESSAGE("Gardevoir fainted!"); - MESSAGE("Wynaut became cloaked in mystical moonlight!"); + MESSAGE("The healing wish came true for Wynaut!"); HP_BAR(playerLeft, hp: 100); STATUS_ICON(playerLeft, none: TRUE); MESSAGE("Wynaut regained health!"); + } THEN { + EXPECT_EQ(playerLeft->hp, 100); + EXPECT_EQ(playerLeft->status1, 0); + // PP not healed + EXPECT_EQ(playerLeft->pp[0], 5); + EXPECT_EQ(playerLeft->pp[1], 5); + EXPECT_EQ(playerLeft->pp[2], 5); + EXPECT_EQ(playerLeft->pp[3], 0); + } +} + +SINGLE_BATTLE_TEST("Healing Wish effect activates even if the the switched PokΓ©mon can't be healed (Gen4-7)") +{ + GIVEN { + WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_7); + PLAYER(SPECIES_GARDEVOIR) { Speed(300); } + PLAYER(SPECIES_NINJASK) { Speed(400); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } + } WHEN { + TURN { MOVE(player, MOVE_HEALING_WISH); SEND_OUT(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEALING_WISH, player); + HP_BAR(player, hp: 0); + MESSAGE("Gardevoir fainted!"); + MESSAGE("The healing wish came true for Ninjask!"); + MESSAGE("Ninjask regained health!"); } } -SINGLE_BATTLE_TEST("Healing Wish effect activates only if the switched pokemon can be healed") +SINGLE_BATTLE_TEST("Healing Wish effect activates only if the switched PokΓ©mon can be healed (Gen8+)") { + u32 switchTo; + PARAMETRIZE { switchTo = 2; } + PARAMETRIZE { switchTo = 3; } + PARAMETRIZE { switchTo = 4; } GIVEN { - ASSUME(B_HEALING_WISH_SWITCH >= GEN_8); + WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_8); PLAYER(SPECIES_GARDEVOIR) { Speed(300); } PLAYER(SPECIES_NINJASK) { Speed(400); } - PLAYER(SPECIES_WYNAUT) { HP(50); MaxHP(100); Status1(STATUS1_PARALYSIS); Speed(50); } + PLAYER(SPECIES_WYNAUT) { HP(50); MaxHP(100); Speed(50); } + PLAYER(SPECIES_WYNAUT) { Status1(STATUS1_PARALYSIS); Speed(50); } + PLAYER(SPECIES_WYNAUT) { MovesWithPP({MOVE_SCRATCH, 5}); Speed(50); } OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } } WHEN { TURN { MOVE(player, MOVE_HEALING_WISH); SEND_OUT(player, 1); } - TURN { MOVE(player, MOVE_U_TURN); SEND_OUT(player, 2); } + TURN { MOVE(player, MOVE_U_TURN); SEND_OUT(player, switchTo); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_HEALING_WISH, player); HP_BAR(player, hp: 0); MESSAGE("Gardevoir fainted!"); NONE_OF { - MESSAGE("The healing wish came true for Wynaut!"); - MESSAGE("Wynaut's HP was restored."); + MESSAGE("The healing wish came true for Ninjask!"); + MESSAGE("Ninjask regained health!"); } ANIMATION(ANIM_TYPE_MOVE, MOVE_U_TURN, player); - MESSAGE("The healing wish came true for Wynaut!"); - HP_BAR(player, hp: 100); - STATUS_ICON(player, none: TRUE); - MESSAGE("Wynaut regained health!"); + if (switchTo == 2) { + MESSAGE("The healing wish came true for Wynaut!"); + HP_BAR(player, hp: 100); + MESSAGE("Wynaut regained health!"); + } else if (switchTo == 3) { + MESSAGE("The healing wish came true for Wynaut!"); + STATUS_ICON(player, none: TRUE); + MESSAGE("Wynaut regained health!"); + } else { + NONE_OF { + MESSAGE("The healing wish came true for Wynaut!"); + MESSAGE("Wynaut regained health!"); + } + } + } THEN { + if (switchTo == 2) { + EXPECT_EQ(player->hp, 100); + } else if (switchTo == 3) { + EXPECT_EQ(player->status1, 0); + } else if (switchTo == 4) { + EXPECT_EQ(player->pp[0], 5); // Did NOT heal PP + } } } diff --git a/test/battle/move_effect/helping_hand.c b/test/battle/move_effect/helping_hand.c index 81d64e113d1e..6d4d6e0eb520 100644 --- a/test/battle/move_effect/helping_hand.c +++ b/test/battle/move_effect/helping_hand.c @@ -1,4 +1,125 @@ #include "global.h" #include "test/battle.h" +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_HELPING_HAND) == EFFECT_HELPING_HAND); +} + +SINGLE_BATTLE_TEST("Helping Hand fails in a Single Battle") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_HELPING_HAND); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_HELPING_HAND, player); + MESSAGE("But it failed!"); + } +} + +DOUBLE_BATTLE_TEST("Helping Hand fails if ally already acted") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_HELPING_HAND, target: playerRight); MOVE(playerRight, MOVE_HELPING_HAND, target: playerLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HELPING_HAND, playerLeft); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_HELPING_HAND, playerRight); + } +} + +DOUBLE_BATTLE_TEST("Helping Hand boosts the power of attacking moves by 50%", s16 damage) +{ + bool32 useHelpingHand; + + PARAMETRIZE { useHelpingHand = FALSE; } + PARAMETRIZE { useHelpingHand = TRUE; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (useHelpingHand) + TURN { MOVE(playerRight, MOVE_HELPING_HAND, target: playerLeft); MOVE(playerLeft, MOVE_SCRATCH, target: opponentLeft); } + else + TURN { MOVE(playerLeft, MOVE_SCRATCH, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerLeft); + HP_BAR(opponentLeft, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); + } +} + +DOUBLE_BATTLE_TEST("Helping Hand still boosts moves used due to Instruct", s16 damage) +{ + bool32 useHelpingHand; + + PARAMETRIZE { useHelpingHand = FALSE; } + PARAMETRIZE { useHelpingHand = TRUE; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_INSTRUCT) == EFFECT_INSTRUCT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (useHelpingHand) + { + TURN { MOVE(playerRight, MOVE_HELPING_HAND, target: playerLeft); + MOVE(playerLeft, MOVE_SCRATCH, target: opponentLeft); + MOVE(opponentLeft, MOVE_INSTRUCT, target: playerLeft); } + } + else + { + TURN { MOVE(playerLeft, MOVE_SCRATCH, target: opponentLeft); + MOVE(opponentLeft, MOVE_INSTRUCT, target: playerLeft); } + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_INSTRUCT, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerLeft); + HP_BAR(opponentLeft, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); + } +} + +DOUBLE_BATTLE_TEST("Helping Hand boosts the power of attacking moves by 125% if Instructed into using it again", s16 damage) +{ + bool32 useHelpingHandTwice; + + PARAMETRIZE { useHelpingHandTwice = FALSE; } + PARAMETRIZE { useHelpingHandTwice = TRUE; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_INSTRUCT) == EFFECT_INSTRUCT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (useHelpingHandTwice) + TURN { MOVE(playerRight, MOVE_HELPING_HAND, target: playerLeft); + MOVE(opponentLeft, MOVE_INSTRUCT, target: playerRight); + MOVE(playerLeft, MOVE_SCRATCH, target: opponentLeft); } + else + TURN { MOVE(playerLeft, MOVE_SCRATCH, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerLeft); + HP_BAR(opponentLeft, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.25), results[1].damage); + } +} + TO_DO_BATTLE_TEST("TODO: Write Helping Hand (Move Effect) test titles") diff --git a/test/battle/move_effect/hidden_power.c b/test/battle/move_effect/hidden_power.c index 124d78c96ab7..9ac88e687f59 100644 --- a/test/battle/move_effect/hidden_power.c +++ b/test/battle/move_effect/hidden_power.c @@ -31,7 +31,8 @@ ASSUMPTIONS // IV combinations sourced from https://www.smogon.com/forums/threads/hidden-power-iv-combinations.78083/ SINGLE_BATTLE_TEST("Hidden Power's type is determined by IVs") { - u32 type, j, foeType, foeSpecies, foeItem; + enum Type type, foeType, j; + u32 foeSpecies, foeItem; u32 hp, atk, def, spAtk, spDef, speed; bool32 hidden; @@ -111,8 +112,8 @@ SINGLE_BATTLE_TEST("Hidden Power's type is determined by IVs") GIVEN { if (hidden) { ASSUME(gTypeEffectivenessTable[type][foeType] == UQ_4_12(2.0)); // Foe's Type resists - ASSUME(gSpeciesInfo[foeSpecies].types[0] == gSpeciesInfo[foeSpecies].types[1]); // Foe's pure type - ASSUME(gSpeciesInfo[foeSpecies].types[0] == foeType); // Foe is the super-effective type + ASSUME(GetSpeciesType(foeSpecies, 0) == GetSpeciesType(foeSpecies, 1)); // Foe's pure type + ASSUME(GetSpeciesType(foeSpecies, 0) == foeType); // Foe is the super-effective type ASSUME(GetItemHoldEffect(foeItem) == HOLD_EFFECT_RESIST_BERRY); // Item is resist berry ASSUME(GetItemHoldEffectParam(foeItem) == type); // Resist berry of type PLAYER(SPECIES_DUNSPARCE) { HPIV(hp); AttackIV(atk); DefenseIV(def); SpAttackIV(spAtk); SpDefenseIV(spDef); SpeedIV(speed); } diff --git a/test/battle/move_effect/hit_escape.c b/test/battle/move_effect/hit_escape.c index a268f991b489..f587d078a032 100644 --- a/test/battle/move_effect/hit_escape.c +++ b/test/battle/move_effect/hit_escape.c @@ -113,7 +113,7 @@ SINGLE_BATTLE_TEST("Hit Escape: U-turn switches the user out after Ice Face acti } } -SINGLE_BATTLE_TEST("Hit Escape: Held items are consumed immediately after a mon switched in by U-turn and Intimidate activates after it: player side") +SINGLE_BATTLE_TEST("Hit Escape: Held items are consumed immediately after a mon switched in by U-turn: player side") { GIVEN { PLAYER(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); }; @@ -126,7 +126,6 @@ SINGLE_BATTLE_TEST("Hit Escape: Held items are consumed immediately after a mon ABILITY_POPUP(player, ABILITY_ELECTRIC_SURGE); ANIMATION(ANIM_TYPE_MOVE, MOVE_U_TURN, player); HP_BAR(opponent); - ABILITY_POPUP(player, ABILITY_INTIMIDATE); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("2 sent out Wynaut!"); @@ -136,7 +135,7 @@ SINGLE_BATTLE_TEST("Hit Escape: Held items are consumed immediately after a mon } } -SINGLE_BATTLE_TEST("Hit Escape: Held items are consumed immediately after a mon switched in by U-turn and Intimidate activates after it: opposing side") +SINGLE_BATTLE_TEST("Hit Escape: Held items are consumed immediately after a mon switched in by U-turn: opposing side") { GIVEN { PLAYER(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); }; @@ -149,7 +148,6 @@ SINGLE_BATTLE_TEST("Hit Escape: Held items are consumed immediately after a mon ABILITY_POPUP(player, ABILITY_ELECTRIC_SURGE); ANIMATION(ANIM_TYPE_MOVE, MOVE_U_TURN, player); HP_BAR(opponent); - ABILITY_POPUP(player, ABILITY_INTIMIDATE); MESSAGE("2 sent out Wynaut!"); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); @@ -159,7 +157,7 @@ SINGLE_BATTLE_TEST("Hit Escape: Held items are consumed immediately after a mon } } -SINGLE_BATTLE_TEST("Hit Escape: Electric Seed boost is received by the right pokemon after U-turn and Intimidate") +SINGLE_BATTLE_TEST("Hit Escape: Electric Seed boost is received by the right PokΓ©mon after U-turn and Intimidate") { GIVEN { PLAYER(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); }; diff --git a/test/battle/move_effect/hit_set_remove_terrain.c b/test/battle/move_effect/hit_set_remove_terrain.c deleted file mode 100644 index 9b9180d6e4a1..000000000000 --- a/test/battle/move_effect/hit_set_remove_terrain.c +++ /dev/null @@ -1,126 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(GetMoveEffect(MOVE_ELECTRIC_TERRAIN) == EFFECT_ELECTRIC_TERRAIN); - ASSUME(GetMoveEffect(MOVE_PSYCHIC_TERRAIN) == EFFECT_PSYCHIC_TERRAIN); - ASSUME(GetMoveEffect(MOVE_GRASSY_TERRAIN) == EFFECT_GRASSY_TERRAIN); - ASSUME(GetMoveEffect(MOVE_MISTY_TERRAIN) == EFFECT_MISTY_TERRAIN); - ASSUME(GetMoveEffect(MOVE_STEEL_ROLLER) == EFFECT_HIT_SET_REMOVE_TERRAIN); - ASSUME(GetMoveEffect(MOVE_ICE_SPINNER) == EFFECT_HIT_SET_REMOVE_TERRAIN); -} - -SINGLE_BATTLE_TEST("Steel Roller and Ice Spinner can remove a terrain from the field") -{ - u32 j; - static const u16 terrainMoves[] = - { - MOVE_ELECTRIC_TERRAIN, - MOVE_PSYCHIC_TERRAIN, - MOVE_GRASSY_TERRAIN, - MOVE_MISTY_TERRAIN, - }; - - u16 terrainMove = MOVE_NONE; - u16 removeTerrainMove = MOVE_NONE; - - for (j = 0; j < ARRAY_COUNT(terrainMoves); j++) - { - PARAMETRIZE { removeTerrainMove = MOVE_STEEL_ROLLER; terrainMove = terrainMoves[j]; } - PARAMETRIZE { removeTerrainMove = MOVE_ICE_SPINNER; terrainMove = terrainMoves[j]; } - } - - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, terrainMove); MOVE(player, removeTerrainMove); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, terrainMove, opponent); - ANIMATION(ANIM_TYPE_MOVE, removeTerrainMove, player); - switch (terrainMove) - { - case MOVE_ELECTRIC_TERRAIN: - MESSAGE("The electricity disappeared from the battlefield."); - break; - case MOVE_PSYCHIC_TERRAIN: - MESSAGE("The weirdness disappeared from the battlefield!"); - break; - case MOVE_GRASSY_TERRAIN: - MESSAGE("The grass disappeared from the battlefield."); - break; - case MOVE_MISTY_TERRAIN: - MESSAGE("The mist disappeared from the battlefield."); - break; - } - } -} - -SINGLE_BATTLE_TEST("Steel Roller fails if there is no terrain on the field") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_STEEL_ROLLER); } - } SCENE { - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_STEEL_ROLLER, player); - MESSAGE("But it failed!"); - } -} - -SINGLE_BATTLE_TEST("Ice Spinner doesn't fail if there is no terrain on the field") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_ICE_SPINNER); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_ICE_SPINNER, player); - NOT MESSAGE("But it failed!"); - } -} - -AI_SINGLE_BATTLE_TEST("AI will not choose Steel Roller if it might fail") -{ - u32 move; - - PARAMETRIZE { move = MOVE_ELECTRIC_TERRAIN; } - PARAMETRIZE { move = MOVE_NONE; } - - GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_STEEL_ROLLER, MOVE_ICE_SHARD); } - } WHEN { - if (move == MOVE_ELECTRIC_TERRAIN) { - TURN { MOVE(player, MOVE_ELECTRIC_TERRAIN); EXPECT_MOVE(opponent, MOVE_ICE_SHARD); } - TURN { EXPECT_MOVE(opponent, MOVE_STEEL_ROLLER); } - } else { - TURN { EXPECT_MOVE(opponent, MOVE_ICE_SHARD); } - } - } -} - -AI_SINGLE_BATTLE_TEST("AI will can choose Ice Spinner regardless if there is a terrain or not") -{ - u32 move; - - PARAMETRIZE { move = MOVE_ELECTRIC_TERRAIN; } - PARAMETRIZE { move = MOVE_NONE; } - - GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_ICE_SPINNER, MOVE_ICE_SHARD); } - } WHEN { - if (move == MOVE_ELECTRIC_TERRAIN) { - TURN { MOVE(player, MOVE_ELECTRIC_TERRAIN); EXPECT_MOVE(opponent, MOVE_ICE_SPINNER); } - TURN { EXPECT_MOVE(opponent, MOVE_ICE_SPINNER); } - } else { - TURN { EXPECT_MOVE(opponent, MOVE_ICE_SPINNER); } - } - } -} diff --git a/test/battle/move_effect/hit_switch_target.c b/test/battle/move_effect/hit_switch_target.c index e0d6548ec3c6..7287e8010a5e 100644 --- a/test/battle/move_effect/hit_switch_target.c +++ b/test/battle/move_effect/hit_switch_target.c @@ -43,7 +43,7 @@ DOUBLE_BATTLE_TEST("Dragon Tail switches the target with a random non-battler, n } } -SINGLE_BATTLE_TEST("Dragon Tail does not fail if no replacements") +SINGLE_BATTLE_TEST("Dragon Tail fails if no replacements") { GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -56,7 +56,7 @@ SINGLE_BATTLE_TEST("Dragon Tail does not fail if no replacements") } } -SINGLE_BATTLE_TEST("Dragon Tail does not fail if replacements fainted") +SINGLE_BATTLE_TEST("Dragon Tail fails if replacements fainted") { GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -145,7 +145,7 @@ SINGLE_BATTLE_TEST("Dragon Tail switches target out and incoming mon has Levitat GIVEN { ASSUME(GetMoveEffect(MOVE_TOXIC_SPIKES) == EFFECT_TOXIC_SPIKES); ASSUME(GetMoveEffect(MOVE_SPIKES) == EFFECT_SPIKES); - ASSUME(gSpeciesInfo[SPECIES_WEEZING].types[0] == TYPE_POISON || gSpeciesInfo[SPECIES_WEEZING].types[1] == TYPE_POISON); + ASSUME(GetSpeciesType(SPECIES_WEEZING, 0) == TYPE_POISON || GetSpeciesType(SPECIES_WEEZING, 1) == TYPE_POISON); PLAYER(SPECIES_PANCHAM) { Ability(ABILITY_MOLD_BREAKER); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WEEZING) { Ability(ABILITY_LEVITATE); } @@ -159,8 +159,8 @@ SINGLE_BATTLE_TEST("Dragon Tail switches target out and incoming mon has Levitat ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_TAIL, player); HP_BAR(opponent); MESSAGE("The opposing Weezing was dragged out!"); - HP_BAR(opponent); - NOT STATUS_ICON(opponent, poison: TRUE); MESSAGE("The poison spikes disappeared from the ground around the opposing team!"); + NOT STATUS_ICON(opponent, poison: TRUE); + HP_BAR(opponent); } } diff --git a/test/battle/move_effect/ice_spinner.c b/test/battle/move_effect/ice_spinner.c new file mode 100644 index 000000000000..c04f16b880c0 --- /dev/null +++ b/test/battle/move_effect/ice_spinner.c @@ -0,0 +1,125 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_ICE_SPINNER) == EFFECT_ICE_SPINNER); +} + +SINGLE_BATTLE_TEST("Ice Spinner and Steel Roller remove a terrain from field") +{ + u32 j; + static const u16 terrainMoves[] = + { + MOVE_ELECTRIC_TERRAIN, + MOVE_PSYCHIC_TERRAIN, + MOVE_GRASSY_TERRAIN, + MOVE_MISTY_TERRAIN, + }; + + u16 terrainMove = MOVE_NONE; + u16 removeTerrainMove = MOVE_NONE; + + for (j = 0; j < ARRAY_COUNT(terrainMoves); j++) + { + PARAMETRIZE { removeTerrainMove = MOVE_STEEL_ROLLER; terrainMove = terrainMoves[j]; } + PARAMETRIZE { removeTerrainMove = MOVE_ICE_SPINNER; terrainMove = terrainMoves[j]; } + } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_ELECTRIC_TERRAIN) == EFFECT_ELECTRIC_TERRAIN); + ASSUME(GetMoveEffect(MOVE_PSYCHIC_TERRAIN) == EFFECT_PSYCHIC_TERRAIN); + ASSUME(GetMoveEffect(MOVE_GRASSY_TERRAIN) == EFFECT_GRASSY_TERRAIN); + ASSUME(GetMoveEffect(MOVE_MISTY_TERRAIN) == EFFECT_MISTY_TERRAIN); + ASSUME(GetMoveEffect(MOVE_STEEL_ROLLER) == EFFECT_STEEL_ROLLER); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, terrainMove); MOVE(player, removeTerrainMove); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, terrainMove, opponent); + ANIMATION(ANIM_TYPE_MOVE, removeTerrainMove, player); + switch (terrainMove) + { + case MOVE_ELECTRIC_TERRAIN: + MESSAGE("The electricity disappeared from the battlefield."); + break; + case MOVE_PSYCHIC_TERRAIN: + MESSAGE("The weirdness disappeared from the battlefield!"); + break; + case MOVE_GRASSY_TERRAIN: + MESSAGE("The grass disappeared from the battlefield."); + break; + case MOVE_MISTY_TERRAIN: + MESSAGE("The mist disappeared from the battlefield."); + break; + } + } +} + +SINGLE_BATTLE_TEST("Ice Spinner fails to remove terrain if user faints during attack execution") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LIFE_ORB); HP(1); } + } WHEN { + TURN { MOVE(player, MOVE_ELECTRIC_TERRAIN); MOVE(opponent, MOVE_ICE_SPINNER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIC_TERRAIN, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ICE_SPINNER, opponent); + NOT MESSAGE("The electricity disappeared from the battlefield."); + } +} + +SINGLE_BATTLE_TEST("Ice Spinner will not be remove Terrain if user is switched out due to Red Card") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_RED_CARD); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(player, MOVE_ELECTRIC_TERRAIN); MOVE(opponent, MOVE_ICE_SPINNER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIC_TERRAIN, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ICE_SPINNER, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + NOT MESSAGE("The electricity disappeared from the battlefield."); + } +} + +SINGLE_BATTLE_TEST("Ice Spinner doesn't fail if there is no terrain on the field") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_ICE_SPINNER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ICE_SPINNER, player); + NONE_OF { + MESSAGE("But it failed!"); + MESSAGE("Mist swirled around the battlefield!"); + } + } +} + +AI_SINGLE_BATTLE_TEST("Ice Spinner can be chosen by AI regardless if there is a terrain or not") +{ + u32 move; + + PARAMETRIZE { move = MOVE_ELECTRIC_TERRAIN; } + PARAMETRIZE { move = MOVE_NONE; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_ICE_SPINNER, MOVE_ICE_SHARD); } + } WHEN { + if (move == MOVE_ELECTRIC_TERRAIN) { + TURN { MOVE(player, MOVE_ELECTRIC_TERRAIN); EXPECT_MOVE(opponent, MOVE_ICE_SPINNER); } + TURN { EXPECT_MOVE(opponent, MOVE_ICE_SPINNER); } + } else { + TURN { EXPECT_MOVE(opponent, MOVE_ICE_SPINNER); } + } + } +} diff --git a/test/battle/move_effect/instruct.c b/test/battle/move_effect/instruct.c index 03a39fe154c8..be6e55799005 100644 --- a/test/battle/move_effect/instruct.c +++ b/test/battle/move_effect/instruct.c @@ -6,6 +6,21 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_INSTRUCT) == EFFECT_INSTRUCT); } +SINGLE_BATTLE_TEST("Instruct causes the target to use its last used move again") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH, MOVE_POUND, MOVE_SCRATCH, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); MOVE(opponent, MOVE_INSTRUCT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_INSTRUCT, opponent); + MESSAGE("Wobbuffet followed the opposing Wynaut's instructions!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + } +} + DOUBLE_BATTLE_TEST("Instruct fails if target hasn't made a move") { GIVEN { @@ -224,6 +239,7 @@ DOUBLE_BATTLE_TEST("Instructed move will be redirected and absorbed by Lightning PARAMETRIZE { moveTarget = opponentLeft; } PARAMETRIZE { moveTarget = opponentRight; } GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_PIKACHU) { Ability(ABILITY_LIGHTNING_ROD); } @@ -280,6 +296,7 @@ DOUBLE_BATTLE_TEST("Instructed move will be redirected by Rage Powder after inst PARAMETRIZE { moveTarget = opponentLeft; } PARAMETRIZE { moveTarget = opponentRight; } GIVEN { + WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); ASSUME(GetMoveEffect(MOVE_RAGE_POWDER) == EFFECT_FOLLOW_ME); ASSUME(IsPowderMove(MOVE_RAGE_POWDER) == TRUE); ASSUME(GetMoveEffect(MOVE_SOAK) == EFFECT_SOAK); diff --git a/test/battle/move_effect/ion_deluge.c b/test/battle/move_effect/ion_deluge.c index b806f9d8e170..4f74c6db72b6 100644 --- a/test/battle/move_effect/ion_deluge.c +++ b/test/battle/move_effect/ion_deluge.c @@ -27,7 +27,7 @@ WILD_BATTLE_TEST("Ion Deluge works the same way as always when used by a mon wit WILD_BATTLE_TEST("Ion Deluge works the same way as always when used by a mon with Lightning Rod / Motor Drive") { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_LIGHTNING_ROD; } PARAMETRIZE { ability = ABILITY_MOTOR_DRIVE; } diff --git a/test/battle/move_effect/knock_off.c b/test/battle/move_effect/knock_off.c index 626e0cde28ef..eb0874d7bfc6 100644 --- a/test/battle/move_effect/knock_off.c +++ b/test/battle/move_effect/knock_off.c @@ -6,6 +6,33 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_KNOCK_OFF) == EFFECT_KNOCK_OFF); } +WILD_BATTLE_TEST("Knock Off does not remove item when used by Wild Pokemon (Gen 5+)") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LEFTOVERS); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_EVIOLITE); } + } WHEN { + TURN { MOVE(opponent, MOVE_KNOCK_OFF); } + TURN { MOVE(player, MOVE_KNOCK_OFF); } + } SCENE { + // Turn 1 + ANIMATION(ANIM_TYPE_MOVE, MOVE_KNOCK_OFF, opponent); + if (B_KNOCK_OFF_REMOVAL >= GEN_5) + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_KNOCKOFF, player); + else + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_KNOCKOFF, player); + // Turn 2 + ANIMATION(ANIM_TYPE_MOVE, MOVE_KNOCK_OFF, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_KNOCKOFF, opponent); + } THEN { + EXPECT(player->item == ITEM_LEFTOVERS); + if (B_KNOCK_OFF_REMOVAL >= GEN_5) + EXPECT(opponent->item == ITEM_NONE); + else + EXPECT(opponent->item == ITEM_EVIOLITE); + } +} + SINGLE_BATTLE_TEST("Knock Off knocks a healing berry before it has the chance to activate") { GIVEN { @@ -99,6 +126,22 @@ SINGLE_BATTLE_TEST("Knock Off does not remove items through Substitute") } } +SINGLE_BATTLE_TEST("Knock Off does not remove items through Substitute even if it breaks it") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(4); HP(4); Item(ITEM_LEFTOVERS); }; + } WHEN { + TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_KNOCK_OFF); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_KNOCK_OFF, player); + MESSAGE("The opposing Wobbuffet's substitute faded!"); + NOT { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_KNOCKOFF); } + } THEN { + EXPECT(opponent->item == ITEM_LEFTOVERS); + } +} + SINGLE_BATTLE_TEST("Knock Off does not remove items through Protect") { GIVEN { @@ -120,7 +163,7 @@ SINGLE_BATTLE_TEST("Knock Off does not remove items if target is immune") { GIVEN { ASSUME(GetMoveEffect(MOVE_ELECTRIFY) == EFFECT_ELECTRIFY); - ASSUME(gSpeciesInfo[SPECIES_DONPHAN].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_DONPHAN].types[1] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_DONPHAN, 0) == TYPE_GROUND || GetSpeciesType(SPECIES_DONPHAN, 1) == TYPE_GROUND); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_DONPHAN) { Item(ITEM_LEFTOVERS); }; } WHEN { @@ -229,18 +272,6 @@ DOUBLE_BATTLE_TEST("Knock Off does not trigger the opposing ally's Symbiosis") } } -SINGLE_BATTLE_TEST("Knock Off doesn't knock off items from Pokemon behind substitutes") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_POKE_BALL); } - } WHEN { - TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_KNOCK_OFF); } - } SCENE { - NOT MESSAGE("Wobbuffet knocked off the opposing Wobbuffet's PokΓ© Ball!"); - } -} - SINGLE_BATTLE_TEST("Knock Off does knock off Mega Stones from Pokemon that don't actually use them") { GIVEN { @@ -360,3 +391,49 @@ SINGLE_BATTLE_TEST("Knock Off doesn't knock off begin-battle form-change hold it NOT MESSAGE("Wobbuffet knocked off the opposing Zamazenta's Rusted Shield!"); } } + +SINGLE_BATTLE_TEST("Knock Off does not activate if user faints") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ROCKY_HELMET); } + } WHEN { + TURN { MOVE(player, MOVE_KNOCK_OFF); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_KNOCK_OFF, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + MESSAGE("Wobbuffet was hurt by the opposing Wobbuffet's Rocky Helmet!"); + MESSAGE("Wobbuffet fainted!"); + } THEN { + EXPECT(opponent->item == ITEM_ROCKY_HELMET); + } +} + +SINGLE_BATTLE_TEST("Knock Off doesn't remove item if it's prevented by Sticky Hold") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_MUK) { MaxHP(100); HP(51); Item(ITEM_ORAN_BERRY); Ability(ABILITY_STICKY_HOLD); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_KNOCK_OFF); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_STICKY_HOLD); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + } +} + +SINGLE_BATTLE_TEST("Knock Off does not activate if the item was previously consumed") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); } + } WHEN { + TURN { MOVE(player, MOVE_KNOCK_OFF); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_KNOCK_OFF, player); + MESSAGE("The opposing Wobbuffet's Air Balloon popped!"); + NOT MESSAGE("Wobbuffet knocked off the opposing Wobbuffet's Air Balloon!"); + } THEN { + EXPECT(opponent->item == ITEM_NONE); + } +} diff --git a/test/battle/move_effect/lash_out.c b/test/battle/move_effect/lash_out.c index dd8e9eb0e9cf..ed9465e9151e 100644 --- a/test/battle/move_effect/lash_out.c +++ b/test/battle/move_effect/lash_out.c @@ -1,4 +1,188 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Lash Out (Move Effect) test titles") +SINGLE_BATTLE_TEST("Lash Out damage is boosted if the user's stats are dropped the turn it is used") +{ + s16 damage[2]; + u32 move = MOVE_NONE; + + PARAMETRIZE { move = MOVE_TACKLE; } + PARAMETRIZE { move = MOVE_GROWL; } + PARAMETRIZE { move = MOVE_LEER; } + PARAMETRIZE { move = MOVE_STRING_SHOT; } + PARAMETRIZE { move = MOVE_CONFIDE; } + PARAMETRIZE { move = MOVE_SAND_ATTACK; } + PARAMETRIZE { move = MOVE_SWEET_SCENT; } + PARAMETRIZE { move = MOVE_CHARM; } + PARAMETRIZE { move = MOVE_SCREECH; } + PARAMETRIZE { move = MOVE_SCARY_FACE; } + PARAMETRIZE { move = MOVE_CAPTIVATE; } + PARAMETRIZE { move = MOVE_EERIE_IMPULSE; } + PARAMETRIZE { move = MOVE_FAKE_TEARS; } + PARAMETRIZE { move = MOVE_NOBLE_ROAR; } + PARAMETRIZE { move = MOVE_LUNGE; } + PARAMETRIZE { move = MOVE_FIRE_LASH; } + PARAMETRIZE { move = MOVE_BULLDOZE; } + PARAMETRIZE { move = MOVE_MYSTICAL_FIRE; } + PARAMETRIZE { move = MOVE_BUG_BUZZ; } + + GIVEN { + PLAYER(SPECIES_GRIMMSNARL) { Gender(MON_MALE); Speed(1); Moves(MOVE_LASH_OUT); } + OPPONENT(SPECIES_GOLEM) { Gender(MON_FEMALE); Speed(2); Moves(move, MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(player, MOVE_LASH_OUT); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_LASH_OUT); MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_LASH_OUT, player); + HP_BAR(opponent, captureDamage: &damage[0]); + + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_LASH_OUT, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + if (move == MOVE_TACKLE || move == MOVE_CHARM) + EXPECT_EQ(damage[0], damage[1]); + else if (move == MOVE_GROWL || move == MOVE_LUNGE || move == MOVE_NOBLE_ROAR) + EXPECT_MUL_EQ(damage[0], UQ_4_12(1.33), damage[1]); + else + EXPECT_MUL_EQ(damage[0], UQ_4_12(2.00), damage[1]); + } +} + +SINGLE_BATTLE_TEST("Lash Out damage is only boosted on the turn that Intimidate switches in") +{ + s16 damage[3] = {0}; + u32 move = MOVE_NONE; + + PARAMETRIZE { move = MOVE_LASH_OUT; } + PARAMETRIZE { move = MOVE_SPLASH; } + + GIVEN { + PLAYER(SPECIES_GRIMMSNARL) { Moves(move, MOVE_CELEBRATE, MOVE_LASH_OUT); } + OPPONENT(SPECIES_INCINEROAR) { Ability(ABILITY_BLAZE); Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_INCINEROAR) { Ability(ABILITY_INTIMIDATE); Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(player, MOVE_LASH_OUT); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, move); SWITCH(opponent, 1); } + TURN { MOVE(player, MOVE_LASH_OUT); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LASH_OUT, player); + HP_BAR(opponent, captureDamage: &damage[0]); + + ANIMATION(ANIM_TYPE_MOVE, move, player); + if (move == MOVE_LASH_OUT) + HP_BAR(opponent, captureDamage: &damage[1]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_LASH_OUT, player); + HP_BAR(opponent, captureDamage: &damage[2]); + } THEN { + EXPECT_EQ(damage[0], damage[2]); + EXPECT_MUL_EQ(damage[0], (move == MOVE_LASH_OUT ? UQ_4_12(1.33) : UQ_4_12(0.00)), damage[1]); + } +} + +SINGLE_BATTLE_TEST("Lash Out damage is boosted on turn 1 by switch in abilities") +{ + s16 damage[2] = {0}; + u32 species = SPECIES_NONE, ability = ABILITY_NONE; + + PARAMETRIZE { species = SPECIES_INCINEROAR, ability = ABILITY_BLAZE; } + PARAMETRIZE { species = SPECIES_INCINEROAR, ability = ABILITY_INTIMIDATE; } + PARAMETRIZE { species = SPECIES_HYDRAPPLE, ability = ABILITY_REGENERATOR; } + PARAMETRIZE { species = SPECIES_HYDRAPPLE, ability = ABILITY_SUPERSWEET_SYRUP; } + + GIVEN { + PLAYER(SPECIES_GRIMMSNARL) { Moves(MOVE_LASH_OUT); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_LASH_OUT); } + TURN { MOVE(player, MOVE_LASH_OUT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LASH_OUT, player); + HP_BAR(opponent, captureDamage: &damage[0]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_LASH_OUT, player); + HP_BAR(opponent, captureDamage: &damage[1]); + + } THEN { + if (ability == ABILITY_INTIMIDATE) + EXPECT_MUL_EQ(damage[0], UQ_4_12(1.33) , damage[1]); + else if (ability == ABILITY_SUPERSWEET_SYRUP) + EXPECT_MUL_EQ(damage[0], UQ_4_12(2.00) , damage[1]); + else + EXPECT_EQ(damage[0], damage[1]); + } +} + +DOUBLE_BATTLE_TEST("Lash Out damage is boosted by Cotton Down activation in doubles") +{ + s16 damage[2] = {0}; + enum Ability ability = ABILITY_NONE; + + PARAMETRIZE { ability = ABILITY_REGENERATOR; } + PARAMETRIZE { ability = ABILITY_COTTON_DOWN; } + + GIVEN { + PLAYER(SPECIES_GRIMMSNARL) { Speed(1); Moves(MOVE_LASH_OUT); } + PLAYER(SPECIES_RATTATA) { Speed(2); Moves(MOVE_TACKLE, MOVE_CELEBRATE); } + OPPONENT(SPECIES_ELDEGOSS) { Speed(3); Ability(ability); } + OPPONENT(SPECIES_GOLEM) { Speed(4); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_LASH_OUT, target:opponentRight); MOVE(playerRight, MOVE_TACKLE, target:opponentLeft); } + TURN { MOVE(playerLeft, MOVE_LASH_OUT, target:opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_LASH_OUT, playerLeft); + HP_BAR(opponentRight, captureDamage: &damage[0]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_LASH_OUT, playerLeft); + HP_BAR(opponentRight, captureDamage: &damage[1]); + + } THEN { + if (ability == ABILITY_COTTON_DOWN) + EXPECT_MUL_EQ(damage[0], UQ_4_12(2.00) , damage[1]); + else + EXPECT_EQ(damage[0], damage[1]); + } +} + +DOUBLE_BATTLE_TEST("Lash Out damage is not boosted by Treasure of Ruin ability activation in doubles") +{ + s16 damage[2] = {0}; + u32 species = SPECIES_NONE, ability = ABILITY_NONE; + + PARAMETRIZE { species = SPECIES_KANGASKHAN, ability = ABILITY_INNER_FOCUS; } + PARAMETRIZE { species = SPECIES_HYDRAPPLE, ability = ABILITY_SUPERSWEET_SYRUP; } + PARAMETRIZE { species = SPECIES_WO_CHIEN, ability = ABILITY_TABLETS_OF_RUIN; } + PARAMETRIZE { species = SPECIES_CHIEN_PAO, ability = ABILITY_SWORD_OF_RUIN; } + PARAMETRIZE { species = SPECIES_TING_LU, ability = ABILITY_VESSEL_OF_RUIN; } + PARAMETRIZE { species = SPECIES_CHI_YU, ability = ABILITY_BEADS_OF_RUIN; } + + GIVEN { + PLAYER(SPECIES_GRIMMSNARL) { Moves(MOVE_LASH_OUT); } + PLAYER(SPECIES_RATTATA); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_GOLEM); + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_LASH_OUT, target:opponentRight); } + TURN { MOVE(playerLeft, MOVE_LASH_OUT, target:opponentRight); SWITCH(opponentLeft, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LASH_OUT, playerLeft); + HP_BAR(opponentRight, captureDamage: &damage[0]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_LASH_OUT, playerLeft); + HP_BAR(opponentRight, captureDamage: &damage[1]); + + } THEN { + if (ability == ABILITY_SUPERSWEET_SYRUP) + EXPECT_MUL_EQ(damage[0], UQ_4_12(2.00) , damage[1]); + else if (ability == ABILITY_TABLETS_OF_RUIN) + EXPECT_MUL_EQ(damage[0], UQ_4_12(0.75) , damage[1]); + else if (ability == ABILITY_SWORD_OF_RUIN) + EXPECT_MUL_EQ(damage[0], UQ_4_12(1.33) , damage[1]); + else + EXPECT_EQ(damage[0], damage[1]); + } +} diff --git a/test/battle/move_effect/last_resort.c b/test/battle/move_effect/last_resort.c index c0b2380f27e5..089a72330435 100644 --- a/test/battle/move_effect/last_resort.c +++ b/test/battle/move_effect/last_resort.c @@ -114,3 +114,43 @@ SINGLE_BATTLE_TEST("Last Resort works with Sleep Talk") HP_BAR(opponent); } } + +AI_SINGLE_BATTLE_TEST("AI uses Last Resort - 2 moves") +{ + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_LAST_RESORT, MOVE_SCRATCH); } + } WHEN { + TURN { NOT_EXPECT_MOVE(opponent, MOVE_LAST_RESORT); } + TURN { EXPECT_MOVE(opponent, MOVE_LAST_RESORT); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Last Resort - 3 moves") +{ + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { MovesWithPP({MOVE_LAST_RESORT, 5}, {MOVE_QUICK_ATTACK, 1}, {MOVE_SCRATCH, 35}); } + } WHEN { + TURN { NOT_EXPECT_MOVE(opponent, MOVE_LAST_RESORT); } + TURN { NOT_EXPECT_MOVE(opponent, MOVE_LAST_RESORT); } + TURN { EXPECT_MOVE(opponent, MOVE_LAST_RESORT); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Last Resort - 4 moves") +{ + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { MovesWithPP({MOVE_LAST_RESORT, 5}, {MOVE_QUICK_ATTACK, 1}, {MOVE_SCRATCH, 1}, {MOVE_GUST, 35}); } + } WHEN { + TURN { NOT_EXPECT_MOVE(opponent, MOVE_LAST_RESORT); } + TURN { NOT_EXPECT_MOVE(opponent, MOVE_LAST_RESORT); } + TURN { NOT_EXPECT_MOVE(opponent, MOVE_LAST_RESORT); } + TURN { EXPECT_MOVE(opponent, MOVE_LAST_RESORT); } + } +} + diff --git a/test/battle/move_effect/last_respects.c b/test/battle/move_effect/last_respects.c index 6ef4c73c2d81..1e0ddaed28b1 100644 --- a/test/battle/move_effect/last_respects.c +++ b/test/battle/move_effect/last_respects.c @@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("Last Respects power is multiplied by the amount of fainted m PARAMETRIZE { faintCount = 1; } PARAMETRIZE { faintCount = 2; } GIVEN { - PLAYER(SPECIES_GOLEM); // Not Wobbuffet to omit type effectiveness + PLAYER(SPECIES_HITMONLEE); // Not Wobbuffet to omit type effectiveness PLAYER(SPECIES_GEODUDE); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LEPPA_BERRY); Moves(MOVE_RECYCLE, MOVE_NONE, MOVE_NONE, MOVE_NONE); } } WHEN { @@ -44,7 +44,7 @@ SINGLE_BATTLE_TEST("Last Respects power is multiplied by the amount of fainted m PARAMETRIZE { faintCount = 2; } GIVEN { PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LEPPA_BERRY); Moves(MOVE_RECYCLE, MOVE_NONE, MOVE_NONE, MOVE_NONE); } - OPPONENT(SPECIES_GOLEM); // Not Wobbuffet to omit type effectiveness + OPPONENT(SPECIES_HITMONLEE); // Not Wobbuffet to omit type effectiveness OPPONENT(SPECIES_GEODUDE); } WHEN { for (j = 0; j < faintCount; j++) diff --git a/test/battle/move_effect/leech_seed.c b/test/battle/move_effect/leech_seed.c index 56da50a12bc2..2d5fd3476621 100644 --- a/test/battle/move_effect/leech_seed.c +++ b/test/battle/move_effect/leech_seed.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Leech Seed doesn't affect Grass-type PokΓ©mon") { PASSES_RANDOMLY(90, 100, RNG_ACCURACY); GIVEN { - ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_ODDISH); } WHEN { @@ -66,11 +66,11 @@ DOUBLE_BATTLE_TEST("Leech Seed will drain HP based on speed of the drained mon") OPPONENT(SPECIES_WYNAUT) { Speed(3); } OPPONENT(SPECIES_WOBBUFFET) { Speed(4); } } WHEN { - TURN { - MOVE(playerLeft, MOVE_LEECH_SEED, target: opponentLeft); - MOVE(playerRight, MOVE_LEECH_SEED, target: opponentRight); - MOVE(opponentLeft, MOVE_LEECH_SEED, target: playerLeft); - MOVE(opponentRight, MOVE_LEECH_SEED, target: playerRight); + TURN { + MOVE(playerLeft, MOVE_LEECH_SEED, target: opponentLeft); + MOVE(playerRight, MOVE_LEECH_SEED, target: opponentRight); + MOVE(opponentLeft, MOVE_LEECH_SEED, target: playerLeft); + MOVE(opponentRight, MOVE_LEECH_SEED, target: playerRight); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_LEECH_SEED, opponentRight); @@ -88,6 +88,24 @@ DOUBLE_BATTLE_TEST("Leech Seed will drain HP based on speed of the drained mon") } } +SINGLE_BATTLE_TEST("Leech Seeded recovers health through Substitute") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUBSTITUTE); } + TURN { MOVE(player, MOVE_LEECH_SEED); } + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBSTITUTE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_LEECH_SEED, player); + HP_BAR(player); + HP_BAR(opponent); + HP_BAR(player); + } +} + TO_DO_BATTLE_TEST("Leech Seed doesn't affect already seeded targets") TO_DO_BATTLE_TEST("Leech Seed's effect is paused until a new battler replaces the original user's position") // Faint, can't be replaced, then revived. TO_DO_BATTLE_TEST("Leech Seed's effect pause still prevents it from being seeded again") diff --git a/test/battle/move_effect/life_dew.c b/test/battle/move_effect/life_dew.c new file mode 100644 index 000000000000..1969f3454c91 --- /dev/null +++ b/test/battle/move_effect/life_dew.c @@ -0,0 +1,113 @@ +#include "global.h" +#include "test/battle.h" + +DOUBLE_BATTLE_TEST("Life Dew fails if user and partner are both at full hp") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_LIFE_DEW); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_LIFE_DEW, playerLeft); + MESSAGE("But it failed!"); + } +} + +DOUBLE_BATTLE_TEST("Life Dew recovers 25% of hp for both user and partner") +{ + s16 healing[2]; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WYNAUT) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_LIFE_DEW); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LIFE_DEW, playerLeft); + HP_BAR(playerLeft, captureDamage: &healing[0]); + MESSAGE("Wobbuffet's HP was restored."); + HP_BAR(playerRight, captureDamage: &healing[1]); + MESSAGE("Wynaut's HP was restored."); + } THEN { + EXPECT_EQ(playerLeft->maxHP / 4, -healing[0]); + EXPECT_EQ(playerRight->maxHP / 4, -healing[1]); + } +} + +SINGLE_BATTLE_TEST("Life Dew works in singles on user") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_LIFE_DEW); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LIFE_DEW, player); + HP_BAR(player); + NOT HP_BAR(opponent); + } +} + +DOUBLE_BATTLE_TEST("Life Dew only works on user if partner is at full hp") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_LIFE_DEW); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LIFE_DEW, playerLeft); + HP_BAR(playerLeft); + NOT HP_BAR(playerRight); + } +} + +DOUBLE_BATTLE_TEST("Life Dew only works on partner if user is at full hp") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_LIFE_DEW); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LIFE_DEW, playerLeft); + NOT HP_BAR(playerLeft); + HP_BAR(playerRight); + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Life Dew if it outheals your damage and outspeeds (singles)") +{ + PASSES_RANDOMLY(100, 100, RNG_AI_SHOULD_RECOVER); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Speed(2); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); Moves(MOVE_SCALD, MOVE_LIFE_DEW); HP(1); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_LIFE_DEW); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI uses Life Dew if it outheals your damage and outspeeds (doubles)") +{ + PASSES_RANDOMLY(100, 100, RNG_AI_SHOULD_RECOVER); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Speed(2); Moves(MOVE_TACKLE); } + PLAYER(SPECIES_WOBBUFFET) { Speed(2); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); Moves(MOVE_SCALD, MOVE_LIFE_DEW); HP(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); Moves(MOVE_SCALD); HP(1); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE); MOVE(playerRight, MOVE_TACKLE); EXPECT_MOVE(opponentLeft, MOVE_LIFE_DEW); } + } +} + diff --git a/test/battle/move_effect/lunar_dance.c b/test/battle/move_effect/lunar_dance.c new file mode 100644 index 000000000000..4714516b1fdc --- /dev/null +++ b/test/battle/move_effect/lunar_dance.c @@ -0,0 +1,137 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_LUNAR_DANCE) == EFFECT_LUNAR_DANCE); +} + +SINGLE_BATTLE_TEST("Lunar Dance causes the user to faint and heals the replacement's HP, PP and status (singles)") +{ + GIVEN { + WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_7); + ASSUME(GetMovePP(MOVE_SCRATCH) == 35); + ASSUME(GetMovePP(MOVE_WATER_GUN) == 25); + ASSUME(GetMovePP(MOVE_LEAFAGE) == 40); + ASSUME(GetMovePP(MOVE_EMBER) == 25); + PLAYER(SPECIES_GARDEVOIR); + PLAYER(SPECIES_WYNAUT) { HP(1); MaxHP(100); Status1(STATUS1_POISON); + MovesWithPP({MOVE_SCRATCH, 5}, {MOVE_WATER_GUN, 5}, {MOVE_LEAFAGE, 5}, {MOVE_EMBER, 0}); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_LUNAR_DANCE); SEND_OUT(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LUNAR_DANCE, player); + HP_BAR(player, hp: 0); + MESSAGE("Gardevoir fainted!"); + MESSAGE("Wynaut became cloaked in mystical moonlight!"); + HP_BAR(player, hp: 100); + STATUS_ICON(player, none: TRUE); + MESSAGE("Wynaut regained health!"); + } THEN { + EXPECT_EQ(player->hp, 100); + EXPECT_EQ(player->status1, 0); + // PP not healed + EXPECT_EQ(player->pp[0], 35); + EXPECT_EQ(player->pp[1], 25); + EXPECT_EQ(player->pp[2], 40); + EXPECT_EQ(player->pp[3], 25); + } +} + +DOUBLE_BATTLE_TEST("Lunar Dance causes the user to faint and heals the replacement's HP, PP and status (doubles)") +{ + GIVEN { + WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_7); + ASSUME(GetMovePP(MOVE_SCRATCH) == 35); + ASSUME(GetMovePP(MOVE_WATER_GUN) == 25); + ASSUME(GetMovePP(MOVE_LEAFAGE) == 40); + ASSUME(GetMovePP(MOVE_EMBER) == 25); + PLAYER(SPECIES_GARDEVOIR) { Speed(300); } + PLAYER(SPECIES_WOBBUFFET) { Speed(50); } + PLAYER(SPECIES_WYNAUT) { HP(1); MaxHP(100); Status1(STATUS1_BURN); Speed(50); + MovesWithPP({MOVE_SCRATCH, 5}, {MOVE_WATER_GUN, 5}, {MOVE_LEAFAGE, 5}, {MOVE_EMBER, 0}); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_LUNAR_DANCE); SEND_OUT(playerLeft, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LUNAR_DANCE, playerLeft); + HP_BAR(playerLeft, hp: 0); + MESSAGE("Gardevoir fainted!"); + MESSAGE("Wynaut became cloaked in mystical moonlight!"); + HP_BAR(playerLeft, hp: 100); + STATUS_ICON(playerLeft, none: TRUE); + MESSAGE("Wynaut regained health!"); + } THEN { + EXPECT_EQ(playerLeft->hp, 100); + EXPECT_EQ(playerLeft->status1, 0); + EXPECT_EQ(playerLeft->pp[0], 35); + EXPECT_EQ(playerLeft->pp[1], 25); + EXPECT_EQ(playerLeft->pp[2], 40); + EXPECT_EQ(playerLeft->pp[3], 25); + } +} + +SINGLE_BATTLE_TEST("Lunar Dance effect activates even if the the switched PokΓ©mon can't be healed (Gen4-7)") +{ + GIVEN { + WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_7); + PLAYER(SPECIES_GARDEVOIR) { Speed(300); } + PLAYER(SPECIES_NINJASK) { Speed(400); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } + } WHEN { + TURN { MOVE(player, MOVE_LUNAR_DANCE); SEND_OUT(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LUNAR_DANCE, player); + HP_BAR(player, hp: 0); + MESSAGE("Gardevoir fainted!"); + MESSAGE("Ninjask became cloaked in mystical moonlight!"); + MESSAGE("Ninjask regained health!"); + } +} + +SINGLE_BATTLE_TEST("Lunar Dance effect activates only if the switched PokΓ©mon can be healed (Gen8+)") +{ + u32 switchTo; + PARAMETRIZE { switchTo = 2; } + PARAMETRIZE { switchTo = 3; } + PARAMETRIZE { switchTo = 4; } + GIVEN { + ASSUME(GetMovePP(MOVE_SCRATCH) == 35); + WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_8); + PLAYER(SPECIES_GARDEVOIR) { Speed(300); } + PLAYER(SPECIES_NINJASK) { Speed(400); } + PLAYER(SPECIES_WYNAUT) { HP(50); MaxHP(100); Speed(50); } + PLAYER(SPECIES_WYNAUT) { Status1(STATUS1_PARALYSIS); Speed(50); } + PLAYER(SPECIES_WYNAUT) { MovesWithPP({MOVE_SCRATCH, 5}); Speed(50); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } + } WHEN { + TURN { MOVE(player, MOVE_LUNAR_DANCE); SEND_OUT(player, 1); } + TURN { MOVE(player, MOVE_U_TURN); SEND_OUT(player, switchTo); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LUNAR_DANCE, player); + HP_BAR(player, hp: 0); + MESSAGE("Gardevoir fainted!"); + NONE_OF { + MESSAGE("Ninjask became cloaked in mystical moonlight!"); + MESSAGE("Ninjask regained health!"); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_U_TURN, player); + MESSAGE("Wynaut became cloaked in mystical moonlight!"); + if (switchTo == 2) { + HP_BAR(player, hp: 100); + } else if (switchTo == 3) { + STATUS_ICON(player, none: TRUE); + } + MESSAGE("Wynaut regained health!"); + } THEN { + if (switchTo == 2) { + EXPECT_EQ(player->hp, 100); + } else if (switchTo == 3) { + EXPECT_EQ(player->status1, 0); + } else if (switchTo == 4) { + EXPECT_EQ(player->pp[0], 35); + } + } +} diff --git a/test/battle/move_effect/magic_coat.c b/test/battle/move_effect/magic_coat.c index 50ed79e194db..05e53b5e12c6 100644 --- a/test/battle/move_effect/magic_coat.c +++ b/test/battle/move_effect/magic_coat.c @@ -32,3 +32,68 @@ SINGLE_BATTLE_TEST("Magic Coat prints the correct message when bouncing back a m STATUS_ICON(opponent, sleep: TRUE); } } + +SINGLE_BATTLE_TEST("Magic Coat fails if user moves last") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_MAGIC_COAT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_MAGIC_COAT, player); + } +} + +DOUBLE_BATTLE_TEST("Magic Coat fails when the only slower battler is a fainted ally") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } + PLAYER(SPECIES_WYNAUT) { HP(1); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(20); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerRight); } + TURN { + MOVE(opponentLeft, MOVE_CELEBRATE); + MOVE(opponentRight, MOVE_CELEBRATE); + MOVE(playerLeft, MOVE_MAGIC_COAT); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + MESSAGE("Wynaut fainted!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_MAGIC_COAT, playerLeft); + } +} + +DOUBLE_BATTLE_TEST("Magic Coat reflects hazards regardless of the user's position") +{ + struct BattlePokemon *coatUser = NULL; + PARAMETRIZE { coatUser = playerLeft; } + PARAMETRIZE { coatUser = playerRight; } + ASSUME(GetMoveEffect(MOVE_SPIKES) == EFFECT_SPIKES); + ASSUME(GetMoveEffect(MOVE_STEALTH_ROCK) == EFFECT_STEALTH_ROCK); + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(coatUser, MOVE_MAGIC_COAT); MOVE(opponentRight, MOVE_STEALTH_ROCK); MOVE(opponentLeft, MOVE_SPIKES); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MAGIC_COAT, coatUser); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, opponentLeft); + } + } THEN { + EXPECT(!IsHazardOnSide(B_SIDE_PLAYER, HAZARDS_STEALTH_ROCK)); + EXPECT(!IsHazardOnSide(B_SIDE_PLAYER, HAZARDS_SPIKES)); + EXPECT(IsHazardOnSide(B_SIDE_OPPONENT, HAZARDS_STEALTH_ROCK)); + EXPECT(IsHazardOnSide(B_SIDE_OPPONENT, HAZARDS_SPIKES)); + } +} diff --git a/test/battle/move_effect/magic_room.c b/test/battle/move_effect/magic_room.c index b1be6ac5bc4a..02953f533d3a 100644 --- a/test/battle/move_effect/magic_room.c +++ b/test/battle/move_effect/magic_room.c @@ -10,8 +10,8 @@ DOUBLE_BATTLE_TEST("Magic Room prevents item hold effects") { GIVEN { ASSUME(gItemsInfo[ITEM_BERRY_JUICE].holdEffect == HOLD_EFFECT_RESTORE_HP); - ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(60); Item(ITEM_BERRY_JUICE); } PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(60); Item(ITEM_BERRY_JUICE); } @@ -35,3 +35,44 @@ DOUBLE_BATTLE_TEST("Magic Room prevents item hold effects") ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight); } } + +SINGLE_BATTLE_TEST("Magic Room: An item that can activate will activate once Magic Room is over") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_WHITE_HERB); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_MAGIC_ROOM); MOVE(opponent, MOVE_GROWL); } + TURN {} + TURN {} + TURN {} + TURN {} + TURN {} + } SCENE { + // Turn 1 + ANIMATION(ANIM_TYPE_MOVE, MOVE_MAGIC_ROOM, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GROWL, opponent); + // Turn 2 + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + // Turn 3 + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + // Turn 4 + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + // Turn 5 + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + } + + MESSAGE("Magic Room wore off, and held items' effects returned to normal!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + } +} + +TO_DO_BATTLE_TEST("TODO: Write Magic Room (Move Effect) test titles") diff --git a/test/battle/move_effect/magnet_rise.c b/test/battle/move_effect/magnet_rise.c index 9fde0046fd56..7e50bb24cb18 100644 --- a/test/battle/move_effect/magnet_rise.c +++ b/test/battle/move_effect/magnet_rise.c @@ -1,4 +1,57 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Magic Room (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_MAGNET_RISE) == EFFECT_MAGNET_RISE); +} + +SINGLE_BATTLE_TEST("Magnet Rise rises the user into the air, avoiding Ground-type attacks") +{ + GIVEN { + ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(player, MOVE_MAGNET_RISE); MOVE(opponent, MOVE_EARTHQUAKE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MAGNET_RISE, player); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, opponent); + HP_BAR(player); + } + } +} + +SINGLE_BATTLE_TEST("Magnet Rise fails if the user is Rooted") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_INGRAIN) == EFFECT_INGRAIN); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(player, MOVE_INGRAIN); } + TURN { MOVE(player, MOVE_MAGNET_RISE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_INGRAIN, player); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_MAGNET_RISE, player); + } +} + +SINGLE_BATTLE_TEST("Magnet Rise fails if the user is Grounded by Smack Down") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SMACK_DOWN) == EFFECT_SMACK_DOWN); + ASSUME(gSpeciesInfo[SPECIES_XATU].types[0] == TYPE_FLYING || gSpeciesInfo[SPECIES_XATU].types[1] == TYPE_FLYING); + PLAYER(SPECIES_XATU); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponent, MOVE_SMACK_DOWN); MOVE(player, MOVE_MAGNET_RISE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SMACK_DOWN, opponent); + MESSAGE("Xatu fell straight down!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_MAGNET_RISE, player); + } +} + +TO_DO_BATTLE_TEST("TODO: Write Magnet Rise (Move Effect) test titles") diff --git a/test/battle/move_effect/magnetic_flux.c b/test/battle/move_effect/magnetic_flux.c index f574db0089b5..6a23d2082f9b 100644 --- a/test/battle/move_effect/magnetic_flux.c +++ b/test/battle/move_effect/magnetic_flux.c @@ -2,3 +2,16 @@ #include "test/battle.h" TO_DO_BATTLE_TEST("TODO: Write Magnetic Flux (Move Effect) test titles") + +AI_DOUBLE_BATTLE_TEST("AI uses Magnetic Flux") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + OPPONENT(SPECIES_KLINK) { Ability(ABILITY_PLUS); Moves(MOVE_MAGNETIC_FLUX, MOVE_POUND); } + OPPONENT(SPECIES_KLINK) { Ability(ABILITY_PLUS); Moves(MOVE_MAGNETIC_FLUX, MOVE_POUND); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_MAGNETIC_FLUX); } + } +} diff --git a/test/battle/move_effect/max_move.c b/test/battle/move_effect/max_move.c index 41c2a4e32cea..38924f1d3383 100644 --- a/test/battle/move_effect/max_move.c +++ b/test/battle/move_effect/max_move.c @@ -1,4 +1,4 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Max Moves (Move Effect) test titles") +// Tested in the dynamax.c test file diff --git a/test/battle/move_effect/me_first.c b/test/battle/move_effect/me_first.c index f351c1a4982c..51f673ae5f32 100644 --- a/test/battle/move_effect/me_first.c +++ b/test/battle/move_effect/me_first.c @@ -1,6 +1,11 @@ #include "global.h" #include "test/battle.h" +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_ME_FIRST) == EFFECT_ME_FIRST); +} + SINGLE_BATTLE_TEST("Me First copies the move from the target and increases it's power by 1.5", s16 damage) { u32 move; @@ -77,4 +82,21 @@ SINGLE_BATTLE_TEST("Me First can be selected if users holds Assault Vest") } } +SINGLE_BATTLE_TEST("Me Frist deducts power points from itself, not the copied move") +{ + ASSUME(GetMovePP(MOVE_ME_FIRST) == 20); + ASSUME(GetMovePP(MOVE_POUND) == 35); + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(100); Moves(MOVE_ME_FIRST); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); Moves(MOVE_POUND); } + } WHEN { + TURN { MOVE(player, MOVE_ME_FIRST); MOVE(opponent, MOVE_POUND); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ME_FIRST, player); + } THEN { + EXPECT_EQ(opponent->pp[0], 34); + EXPECT_EQ(player->pp[0], 19); + } +} + // TO_DO_BATTLE_TEST: Not everything has been tested diff --git a/test/battle/move_effect/metronome.c b/test/battle/move_effect/metronome.c index 3bb178e2f2e9..7415594a640d 100644 --- a/test/battle/move_effect/metronome.c +++ b/test/battle/move_effect/metronome.c @@ -25,8 +25,9 @@ SINGLE_BATTLE_TEST("Metronome picks a random move") SINGLE_BATTLE_TEST("Metronome's called powder move fails against Grass Types") { GIVEN { + WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); ASSUME(IsPowderMove(MOVE_POISON_POWDER)); - ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS); ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_POISON_POWDER) == MOVE_EFFECT_POISON); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/minimize.c b/test/battle/move_effect/minimize.c index f0196936a522..b6730fca9be8 100644 --- a/test/battle/move_effect/minimize.c +++ b/test/battle/move_effect/minimize.c @@ -1,4 +1,29 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Minimize (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_MINIMIZE) == EFFECT_MINIMIZE); +} + +SINGLE_BATTLE_TEST("Minimize increases the user's Evasion by 2 stages (Gen5+) or 1 stage (Gen1-4)") +{ + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } + + GIVEN { + WITH_CONFIG(CONFIG_MINIMIZE_EVASION, config); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_MINIMIZE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MINIMIZE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_EVASION], DEFAULT_STAT_STAGE + (config >= GEN_5 ? 2 : 1)); + } +} + +// Minimize's flag tests are handled in tests/battle/move_flags/minimize_double_damage.c diff --git a/test/battle/move_effect/mirror_coat.c b/test/battle/move_effect/mirror_coat.c index 2a3d6ef2500b..6de1c03c29d1 100644 --- a/test/battle/move_effect/mirror_coat.c +++ b/test/battle/move_effect/mirror_coat.c @@ -1,4 +1,131 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Mirror Coat (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_MIRROR_COAT) == EFFECT_MIRROR_COAT); + ASSUME(GetMoveCategory(MOVE_ROUND) == DAMAGE_CATEGORY_SPECIAL); +} + +SINGLE_BATTLE_TEST("Mirror Coat will do twice as much damage received from the opponent") +{ + s16 normalDmg; + s16 mirrorCoatDmg; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_ROUND); MOVE(player, MOVE_MIRROR_COAT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponent); + HP_BAR(player, captureDamage: &normalDmg); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIRROR_COAT, player); + HP_BAR(opponent, captureDamage: &mirrorCoatDmg); + } THEN { + EXPECT_MUL_EQ(normalDmg, Q_4_12(2.0), mirrorCoatDmg); + } +} + +DOUBLE_BATTLE_TEST("Mirror Coat cannot affect ally PokΓ©mon") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(playerLeft, MOVE_ROUND, target: playerRight); + MOVE(playerRight, MOVE_MIRROR_COAT, target: playerLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, playerLeft); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_MIRROR_COAT, playerRight); + } +} + +DOUBLE_BATTLE_TEST("Mirror Coat hits the last opponent that hit the user") +{ + s16 normalDmg; + s16 mirrorCoatDmg; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_ROUND, target: playerLeft); + MOVE(opponentRight, MOVE_ROUND, target: playerLeft); + MOVE(playerLeft, MOVE_MIRROR_COAT); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentRight); + HP_BAR(playerLeft, captureDamage: &normalDmg); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIRROR_COAT, playerLeft); + HP_BAR(opponentRight, captureDamage: &mirrorCoatDmg); + } THEN { + EXPECT_MUL_EQ(normalDmg, Q_4_12(2.0), mirrorCoatDmg); + } +} + +DOUBLE_BATTLE_TEST("Mirror Coat respects Follow Me") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(opponentRight, MOVE_FOLLOW_ME); + MOVE(opponentLeft, MOVE_ROUND, target: playerLeft); + MOVE(playerLeft, MOVE_MIRROR_COAT, target: opponentLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOLLOW_ME, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIRROR_COAT, playerLeft); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Mirror Coat fails if mon that damaged Mirror Coat user is no longer on the field (Gen 1-4)") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); }; + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_ROUND, target: playerLeft); + MOVE(playerRight, MOVE_ROUND, target: opponentLeft); + MOVE(playerLeft, MOVE_MIRROR_COAT, target: opponentLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, playerRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_MIRROR_COAT, playerLeft); + } +} + +SINGLE_BATTLE_TEST("Mirror Coat deals 1 damage when the attack received is blocked by Disguise") +{ + s16 mirrorCoatDmg; + GIVEN { + ASSUME(GetMoveCategory(MOVE_HEX) == DAMAGE_CATEGORY_SPECIAL); + PLAYER(SPECIES_MIMIKYU) { Ability(ABILITY_DISGUISE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_HEX); MOVE(player, MOVE_MIRROR_COAT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEX, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIRROR_COAT, player); + HP_BAR(opponent, captureDamage: &mirrorCoatDmg); + } THEN { + EXPECT_EQ(mirrorCoatDmg, 1); + } +} diff --git a/test/battle/move_effect/mirror_move.c b/test/battle/move_effect/mirror_move.c index 905fb32d3113..c07dc6b84ec6 100644 --- a/test/battle/move_effect/mirror_move.c +++ b/test/battle/move_effect/mirror_move.c @@ -32,7 +32,7 @@ SINGLE_BATTLE_TEST("Mirror Move fails if no move was used before") TURN { MOVE(player, MOVE_MIRROR_MOVE); MOVE(opponent, MOVE_SCRATCH); } } SCENE { MESSAGE("Wobbuffet used Mirror Move!"); - MESSAGE("The Mirror Move failed!"); + MESSAGE("But it failed!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); HP_BAR(player); } @@ -41,8 +41,9 @@ SINGLE_BATTLE_TEST("Mirror Move fails if no move was used before") SINGLE_BATTLE_TEST("Mirror Move's called powder move fails against Grass Types") { GIVEN { + WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); ASSUME(IsPowderMove(MOVE_STUN_SPORE)); - ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS); ASSUME(GetMoveEffect(MOVE_STUN_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_STUN_SPORE) == MOVE_EFFECT_PARALYSIS); PLAYER(SPECIES_ODDISH); diff --git a/test/battle/move_effect/mist.c b/test/battle/move_effect/mist.c index 332d82a6f98b..dedf84cebcaf 100644 --- a/test/battle/move_effect/mist.c +++ b/test/battle/move_effect/mist.c @@ -2,3 +2,5 @@ #include "test/battle.h" TO_DO_BATTLE_TEST("TODO: Write Mist (Move Effect) test titles") + +TO_DO_BATTLE_TEST("Mist's protection considers Contrary") // Eg. If a move would reduce stats due to Contrary, it will be protected by Mist. diff --git a/test/battle/move_effect/misty_explosion.c b/test/battle/move_effect/misty_explosion.c new file mode 100644 index 000000000000..b7e0ede90280 --- /dev/null +++ b/test/battle/move_effect/misty_explosion.c @@ -0,0 +1,93 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_MISTY_EXPLOSION) == EFFECT_MISTY_EXPLOSION); +} + +TO_DO_BATTLE_TEST("Misty Explosion increases in power by 50% when affected by Misty Terrain") + +SINGLE_BATTLE_TEST("Misty Explosion causes the user to faint") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_MISTY_EXPLOSION); } + } SCENE { + HP_BAR(player, hp: 0); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MISTY_EXPLOSION, player); + MESSAGE("Wobbuffet fainted!"); + } +} + +SINGLE_BATTLE_TEST("Misty Explosion causes the user & the target to faint") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_MISTY_EXPLOSION); } + } SCENE { + HP_BAR(player, hp: 0); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MISTY_EXPLOSION, player); + HP_BAR(opponent, hp: 0); + MESSAGE("The opposing Wobbuffet fainted!"); + MESSAGE("Wobbuffet fainted!"); + } +} + +SINGLE_BATTLE_TEST("Misty Explosion causes the user to faint even if it misses") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_MISTY_EXPLOSION, hit: FALSE); } + } SCENE { + HP_BAR(player, hp: 0); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MISTY_EXPLOSION, player); + MESSAGE("Wobbuffet fainted!"); + } +} + +DOUBLE_BATTLE_TEST("Misty Explosion causes everyone to faint in a double battle") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT) { HP(1); } + OPPONENT(SPECIES_ABRA) { HP(1); } + OPPONENT(SPECIES_KADABRA) { HP(1); } + OPPONENT(SPECIES_KADABRA); + } WHEN { + TURN { MOVE(playerLeft, MOVE_MISTY_EXPLOSION); } + } SCENE { + HP_BAR(playerLeft, hp: 0); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MISTY_EXPLOSION, playerLeft); + HP_BAR(opponentLeft, hp: 0); + HP_BAR(playerRight, hp: 0); + HP_BAR(opponentRight, hp: 0); + MESSAGE("The opposing Abra fainted!"); + MESSAGE("Wynaut fainted!"); + MESSAGE("The opposing Kadabra fainted!"); + MESSAGE("Wobbuffet fainted!"); + } +} + +SINGLE_BATTLE_TEST("Misty Explosion does not trigger Destiny Bond") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_DESTINY_BOND); MOVE(opponent, MOVE_MISTY_EXPLOSION);} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DESTINY_BOND, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MISTY_EXPLOSION, opponent); + HP_BAR(player); + NOT HP_BAR(opponent); + } +} diff --git a/test/battle/move_effect/misty_terrain.c b/test/battle/move_effect/misty_terrain.c index b96f0c650d9f..cd9a92eb3767 100644 --- a/test/battle/move_effect/misty_terrain.c +++ b/test/battle/move_effect/misty_terrain.c @@ -87,3 +87,16 @@ SINGLE_BATTLE_TEST("Misty Terrain lasts for 5 turns") MESSAGE("The mist disappeared from the battlefield."); } } + +SINGLE_BATTLE_TEST("Misty Terrain will fail if there is one already on the field") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_MISTY_TERRAIN); MOVE(opponent, MOVE_MISTY_TERRAIN); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MISTY_TERRAIN, player); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_MISTY_TERRAIN, opponent); + } +} diff --git a/test/battle/move_effect/moonlight.c b/test/battle/move_effect/moonlight.c index 34baa31b14e7..428227b66c8c 100644 --- a/test/battle/move_effect/moonlight.c +++ b/test/battle/move_effect/moonlight.c @@ -6,9 +6,10 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_MOONLIGHT) == EFFECT_MOONLIGHT); } -SINGLE_BATTLE_TEST("Moonlight recovers 1/2 of the user's max HP") +SINGLE_BATTLE_TEST("Moonlight recovers 1/2 of the user's max HP (Gen3+)") { GIVEN { + WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(200); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -18,9 +19,10 @@ SINGLE_BATTLE_TEST("Moonlight recovers 1/2 of the user's max HP") } } -SINGLE_BATTLE_TEST("Moonlight recovers 2/3 of the user's max HP in Sunlight") +SINGLE_BATTLE_TEST("Moonlight recovers 2/3 of the user's max HP in Sunlight (Gen3+)") { GIVEN { + WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(300); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -30,7 +32,7 @@ SINGLE_BATTLE_TEST("Moonlight recovers 2/3 of the user's max HP in Sunlight") } } -SINGLE_BATTLE_TEST("Moonlight recovers 1/4 of the user's max HP in Rain, Sandstorm, Hail, and Snow") +SINGLE_BATTLE_TEST("Moonlight recovers 1/4 of the user's max HP in Rain, Sandstorm, Hail, and Snow (Gen3+)") { u32 move; PARAMETRIZE { move = MOVE_RAIN_DANCE; } @@ -38,6 +40,7 @@ SINGLE_BATTLE_TEST("Moonlight recovers 1/4 of the user's max HP in Rain, Sandsto PARAMETRIZE { move = MOVE_HAIL; } PARAMETRIZE { move = MOVE_SNOWSCAPE; } GIVEN { + WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -46,3 +49,15 @@ SINGLE_BATTLE_TEST("Moonlight recovers 1/4 of the user's max HP in Rain, Sandsto HP_BAR(player, damage: -(400 / 4)); } } + +TO_DO_BATTLE_TEST("TODO: Moonlight recovers 1/4 of the user's max HP while it is not night or evening (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Moonlight recovers 1/2 of the user's max HP in Sunlight while it is not night or evening (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Moonlight recovers 1/8 of the user's max HP in Rain, Sandstorm, Hail, and Snow while it is not night or evening (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Moonlight recovers 2/4 of the user's max HP while it is night or evening (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Moonlight recovers 2/2 of the user's max HP in Sunlight while it is night or evening (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Moonlight recovers 2/8 of the user's max HP in Rain, Sandstorm, Hail, and Snow while it is night or evening (Gen2)") diff --git a/test/battle/move_effect/morning_sun.c b/test/battle/move_effect/morning_sun.c index 64fb1b044ba5..10d69ae568ea 100644 --- a/test/battle/move_effect/morning_sun.c +++ b/test/battle/move_effect/morning_sun.c @@ -6,9 +6,10 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_MORNING_SUN) == EFFECT_MORNING_SUN); } -SINGLE_BATTLE_TEST("Morning Sun recovers 1/2 of the user's max HP") +SINGLE_BATTLE_TEST("Morning Sun recovers 1/2 of the user's max HP (Gen3+)") { GIVEN { + WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(200); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -18,9 +19,10 @@ SINGLE_BATTLE_TEST("Morning Sun recovers 1/2 of the user's max HP") } } -SINGLE_BATTLE_TEST("Morning Sun recovers 2/3 of the user's max HP in Sunlight") +SINGLE_BATTLE_TEST("Morning Sun recovers 2/3 of the user's max HP in Sunlight (Gen3+)") { GIVEN { + WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(300); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -30,7 +32,7 @@ SINGLE_BATTLE_TEST("Morning Sun recovers 2/3 of the user's max HP in Sunlight") } } -SINGLE_BATTLE_TEST("Morning Sun recovers 1/4 of the user's max HP in Rain, Sandstorm, Hail, and Snow") +SINGLE_BATTLE_TEST("Morning Sun recovers 1/4 of the user's max HP in Rain, Sandstorm, Hail, and Snow (Gen3+)") { u32 move; PARAMETRIZE { move = MOVE_RAIN_DANCE; } @@ -38,6 +40,7 @@ SINGLE_BATTLE_TEST("Morning Sun recovers 1/4 of the user's max HP in Rain, Sands PARAMETRIZE { move = MOVE_HAIL; } PARAMETRIZE { move = MOVE_SNOWSCAPE; } GIVEN { + WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -46,3 +49,15 @@ SINGLE_BATTLE_TEST("Morning Sun recovers 1/4 of the user's max HP in Rain, Sands HP_BAR(player, damage: -(400 / 4)); } } + +TO_DO_BATTLE_TEST("TODO: Morning Sun recovers 1/4 of the user's max HP while it is not morning (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Morning Sun recovers 1/2 of the user's max HP in Sunlight while it is not morning (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Morning Sun recovers 1/8 of the user's max HP in Rain, Sandstorm, Hail, and Snow while it is not morning (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Morning Sun recovers 2/4 of the user's max HP while it is morning (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Morning Sun recovers 2/2 of the user's max HP in Sunlight while it is morning (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Morning Sun recovers 2/8 of the user's max HP in Rain, Sandstorm, Hail, and Snow while it is morning (Gen2)") diff --git a/test/battle/move_effect/mud_sport.c b/test/battle/move_effect/mud_sport.c index 143bbe14472e..ff483699b477 100644 --- a/test/battle/move_effect/mud_sport.c +++ b/test/battle/move_effect/mud_sport.c @@ -2,3 +2,33 @@ #include "test/battle.h" TO_DO_BATTLE_TEST("TODO: Write Mud Sport (Move Effect) test titles") + +SINGLE_BATTLE_TEST("Mud Sport reduces the damage of Electric Type moves by 67% (Gen5+)") +{ + s16 playerDmg[2]; + s16 opponentDmg[2]; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SHOCK_WAVE); MOVE(opponent, MOVE_SHOCK_WAVE); } + TURN { MOVE(player, MOVE_MUD_SPORT); } + TURN { MOVE(player, MOVE_SHOCK_WAVE); MOVE(opponent, MOVE_SHOCK_WAVE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHOCK_WAVE, player); + HP_BAR(opponent, captureDamage: &opponentDmg[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHOCK_WAVE, opponent); + HP_BAR(player, captureDamage: &playerDmg[0]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_MUD_SPORT, player); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHOCK_WAVE, player); + HP_BAR(opponent, captureDamage: &opponentDmg[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHOCK_WAVE, opponent); + HP_BAR(player, captureDamage: &playerDmg[1]); + + } THEN { + EXPECT_MUL_EQ(opponentDmg[0], Q_4_12(0.33), opponentDmg[1]); + EXPECT_MUL_EQ(playerDmg[0], Q_4_12(0.33), playerDmg[1]); + } +} diff --git a/test/battle/move_effect/multi_hit.c b/test/battle/move_effect/multi_hit.c index c257ddd3b24f..594094385bfa 100644 --- a/test/battle/move_effect/multi_hit.c +++ b/test/battle/move_effect/multi_hit.c @@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Multi hit Moves hit twice 37.5/35% of the time") PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -53,7 +53,7 @@ SINGLE_BATTLE_TEST("Multi hit Moves hit thrice 37.5/35% of the time") PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -74,7 +74,7 @@ SINGLE_BATTLE_TEST("Multi hit Moves hit four times 12.5/15% of the time") PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -96,7 +96,7 @@ SINGLE_BATTLE_TEST("Multi hit Moves hit five times 12.5/15% of the time") PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -177,14 +177,14 @@ SINGLE_BATTLE_TEST("Scale Shot is immune to Fairy types and will end the move co GIVEN { ASSUME(GetMoveEffect(MOVE_SCALE_SHOT) == EFFECT_MULTI_HIT); ASSUME(GetMoveType(MOVE_SCALE_SHOT) == TYPE_DRAGON); - ASSUME(gSpeciesInfo[SPECIES_CLEFAIRY].types[0] == TYPE_FAIRY || gSpeciesInfo[SPECIES_CLEFAIRY].types[1] == TYPE_FAIRY); + ASSUME(GetSpeciesType(SPECIES_FIDOUGH, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_FIDOUGH, 1) == TYPE_FAIRY); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_CLEFAIRY) { HP(1); } + OPPONENT(SPECIES_FIDOUGH) { HP(1); } } WHEN { TURN { MOVE(player, MOVE_SCALE_SHOT); } } SCENE { NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player); - MESSAGE("It doesn't affect the opposing Clefairy…"); + MESSAGE("It doesn't affect the opposing Fidough…"); } } diff --git a/test/battle/move_effect/natural_gift.c b/test/battle/move_effect/natural_gift.c index dd9b0bd466f6..ab483db1da4e 100644 --- a/test/battle/move_effect/natural_gift.c +++ b/test/battle/move_effect/natural_gift.c @@ -1,4 +1,65 @@ #include "global.h" #include "test/battle.h" +SINGLE_BATTLE_TEST("Natural Gift removes berry if move fails due to an immunity") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_PECHA_BERRY); } + OPPONENT(SPECIES_PHANPY); + } WHEN { + TURN { MOVE(player, MOVE_NATURAL_GIFT); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_NATURAL_GIFT, player); + } THEN { + EXPECT(player->item == ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Natural Gift does not remove berry if user is ejected out") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_PECHA_BERRY); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_RED_CARD); } + } WHEN { + TURN { MOVE(player, MOVE_NATURAL_GIFT); } + TURN { SWITCH(player, 0); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_NATURAL_GIFT, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + } THEN { + EXPECT(player->item == ITEM_PECHA_BERRY); + } +} + +SINGLE_BATTLE_TEST("Natural Gift does not remove berry if user is unable to use a move") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_PECHA_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_THUNDER_WAVE); MOVE(player, MOVE_NATURAL_GIFT, WITH_RNG(RNG_PARALYSIS, FALSE)); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDER_WAVE, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_NATURAL_GIFT, player); + } THEN { + EXPECT(player->item == ITEM_PECHA_BERRY); + } +} + +SINGLE_BATTLE_TEST("Natural Gift removes the berry if user missed") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_PECHA_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SAND_ATTACK); MOVE(player, MOVE_NATURAL_GIFT, hit: FALSE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SAND_ATTACK, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_NATURAL_GIFT, player); + } THEN { + EXPECT(player->item == ITEM_NONE); + } +} + TO_DO_BATTLE_TEST("TODO: Write Natural Gift (Move Effect) test titles") diff --git a/test/battle/move_effect/nature_power.c b/test/battle/move_effect/nature_power.c index 1e9692f88d87..53aa68442d9c 100644 --- a/test/battle/move_effect/nature_power.c +++ b/test/battle/move_effect/nature_power.c @@ -1,4 +1,27 @@ #include "global.h" #include "test/battle.h" +#include "battle_environment.h" -TO_DO_BATTLE_TEST("TODO: Write Nature Power (Move Effect) test titles") +//TO_DO_BATTLE_TEST("TODO: Write Nature Power (Move Effect) test titles") + +SINGLE_BATTLE_TEST("Nature power plays a move correctly in any background") +{ + u32 environment = 0; + u32 move = MOVE_TRI_ATTACK; + for (u32 j = 0; j < BATTLE_ENVIRONMENT_COUNT; j++) + { + PARAMETRIZE {environment = i;} + } + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + Environment(environment); + if (gBattleEnvironmentInfo[environment].naturePower) + move = gBattleEnvironmentInfo[environment].naturePower; + } WHEN { + TURN { MOVE(player, MOVE_NATURE_POWER); } + } SCENE { + NOT MESSAGE("Nature Power turned into Nature Power!"); + ANIMATION(ANIM_TYPE_MOVE, move, player); + } +} diff --git a/test/battle/move_effect/nightmare.c b/test/battle/move_effect/nightmare.c index c243664f2dc0..4cf051ba7d6d 100644 --- a/test/battle/move_effect/nightmare.c +++ b/test/battle/move_effect/nightmare.c @@ -2,3 +2,5 @@ #include "test/battle.h" TO_DO_BATTLE_TEST("TODO: Write Nightmare (Move Effect) test titles") + +TO_DO_BATTLE_TEST("Nightmare affects PokΓ©mon with Comatose") diff --git a/test/battle/move_effect/no_retreat.c b/test/battle/move_effect/no_retreat.c index bf2a15dfbf11..fa944ab77618 100644 --- a/test/battle/move_effect/no_retreat.c +++ b/test/battle/move_effect/no_retreat.c @@ -2,3 +2,60 @@ #include "test/battle.h" TO_DO_BATTLE_TEST("TODO: Write No Retreat (Move Effect) test titles") + +SINGLE_BATTLE_TEST("No Retreat raises user's Atk/Def/Sp.Atk/Sp.Def/Speed unless No Retreat was already used by user") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_NO_RETREAT); } + TURN { MOVE(player, MOVE_NO_RETREAT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_NO_RETREAT, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_NO_RETREAT, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 1); + bool32 escapePrevention = gBattleMons[0].volatiles.escapePrevention; + EXPECT_EQ(escapePrevention, TRUE); + } +} + +// Question: If No Retreat is used is the mon blocking the switch out changed? +SINGLE_BATTLE_TEST("No Retreat won't fail if user is prevented from escaping") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_MEAN_LOOK); MOVE(player, MOVE_NO_RETREAT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MEAN_LOOK, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_NO_RETREAT, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } +} + +SINGLE_BATTLE_TEST("No Retreat won't activate Protean if it fails due to already being used by the user") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); } + } WHEN { + TURN { MOVE(player, MOVE_NO_RETREAT); MOVE(opponent, MOVE_SKILL_SWAP); } + TURN { MOVE(player, MOVE_NO_RETREAT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_NO_RETREAT, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_NO_RETREAT, player); + ABILITY_POPUP(player, ABILITY_PROTEAN); + } + } +} diff --git a/test/battle/move_effect/noble_roar.c b/test/battle/move_effect/noble_roar.c index 4fd182b84d6f..f683619b4f5b 100644 --- a/test/battle/move_effect/noble_roar.c +++ b/test/battle/move_effect/noble_roar.c @@ -1,4 +1,23 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Noble Roar (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_NOBLE_ROAR) == EFFECT_NOBLE_ROAR); +} + +SINGLE_BATTLE_TEST("Noble Roar reduces the target's Attack and Sp. Attack by 1 stage each") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_NOBLE_ROAR); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_NOBLE_ROAR, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(opponent->statStages[STAT_SPATK], DEFAULT_STAT_STAGE - 1); + } +} diff --git a/test/battle/move_effect/octolock.c b/test/battle/move_effect/octolock.c index e93f6f29cb4d..b98c17908d5e 100644 --- a/test/battle/move_effect/octolock.c +++ b/test/battle/move_effect/octolock.c @@ -21,7 +21,7 @@ SINGLE_BATTLE_TEST("Octolock decreases Defense and Sp. Def by at the end of the SINGLE_BATTLE_TEST("Octolock reduction is prevented by Clear Body, White Smoke and Full Metal Body") { u32 species; - u32 ability; + enum Ability ability; PARAMETRIZE { species = SPECIES_BELDUM; ability = ABILITY_CLEAR_BODY; } PARAMETRIZE { species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; } @@ -78,10 +78,10 @@ SINGLE_BATTLE_TEST("Octolock Defense reduction is prevented by Big Pecks") } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_OCTOLOCK, player); MESSAGE("The opposing Pidgey can no longer escape because of Octolock!"); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); NOT MESSAGE("The opposing Pidgey's Defense fell!"); ABILITY_POPUP(opponent, ABILITY_BIG_PECKS); MESSAGE("The opposing Pidgey's Big Pecks prevents Defense loss!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); MESSAGE("The opposing Pidgey's Sp. Def fell!"); } } @@ -145,10 +145,37 @@ SINGLE_BATTLE_TEST("Octolock triggers Defiant for both stat reductions") ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); MESSAGE("The opposing Bisharp's Defense fell!"); ABILITY_POPUP(opponent, ABILITY_DEFIANT); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); MESSAGE("The opposing Bisharp's Attack sharply rose!"); - NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); MESSAGE("The opposing Bisharp's Sp. Def fell!"); ABILITY_POPUP(opponent, ABILITY_DEFIANT); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); MESSAGE("The opposing Bisharp's Attack sharply rose!"); } } + +SINGLE_BATTLE_TEST("Octolock ends after user that set the lock switches out") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_OCTOLOCK); } + TURN { SWITCH(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_OCTOLOCK, player); + MESSAGE("The opposing Wobbuffet can no longer escape because of Octolock!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("The opposing Wobbuffet's Defense fell!"); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("The opposing Wobbuffet's Sp. Def fell!"); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("The opposing Wobbuffet's Defense fell!"); + MESSAGE("The opposing Wobbuffet's Sp. Def fell!"); + } + + } +} diff --git a/test/battle/move_effect/ohko.c b/test/battle/move_effect/ohko.c index 415f36e752b6..81847a1ba570 100644 --- a/test/battle/move_effect/ohko.c +++ b/test/battle/move_effect/ohko.c @@ -3,36 +3,33 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_SHEER_COLD) == EFFECT_OHKO); + ASSUME(GetMoveEffect(MOVE_FISSURE) == EFFECT_OHKO); } -SINGLE_BATTLE_TEST("Sheer Cold doesn't affect Ice-type PokΓ©mon") +SINGLE_BATTLE_TEST("OHKO moves can hit semi-invulnerable mons when the user has No-Guard") { GIVEN { - ASSUME(B_SHEER_COLD_IMMUNITY >= GEN_7); - ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE); - PLAYER(SPECIES_WYNAUT); - OPPONENT(SPECIES_GLALIE); + ASSUME(GetItemHoldEffect(ITEM_FOCUS_SASH) == HOLD_EFFECT_FOCUS_SASH); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_NO_GUARD); } + OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, MOVE_SHEER_COLD); } + TURN { MOVE(opponent, MOVE_FLY); } + TURN { MOVE(player, MOVE_FISSURE); } } SCENE { - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, player); - MESSAGE("It doesn't affect the opposing Glalie…"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FISSURE, player); + HP_BAR(opponent, hp: 0); } } -SINGLE_BATTLE_TEST("OHKO moves can hit semi-invulnerable mons when the user has No-Guard") +SINGLE_BATTLE_TEST("OHKO moves can not hit semi-invulnerable") { GIVEN { - ASSUME(GetItemHoldEffect(ITEM_FOCUS_SASH) == HOLD_EFFECT_FOCUS_SASH); - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_NO_GUARD); } + PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(opponent, MOVE_FLY); } - TURN { MOVE(player, MOVE_SHEER_COLD); } + TURN { MOVE(opponent, MOVE_FLY); MOVE(player, MOVE_FISSURE); } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, player); - HP_BAR(opponent, hp: 0); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FISSURE, player); } } @@ -42,9 +39,9 @@ SINGLE_BATTLE_TEST("OHKO moves can can be endured by Focus Sash") PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); } } WHEN { - TURN { MOVE(player, MOVE_SHEER_COLD); } + TURN { MOVE(player, MOVE_FISSURE); } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FISSURE, player); HP_BAR(opponent, hp: 1); MESSAGE("The opposing Wobbuffet hung on using its Focus Sash!"); } @@ -56,15 +53,36 @@ SINGLE_BATTLE_TEST("OHKO moves can can be endured by Sturdy") PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GEODUDE) { Ability(ABILITY_STURDY); } } WHEN { - TURN { MOVE(player, MOVE_SHEER_COLD); } + TURN { MOVE(player, MOVE_FISSURE); } } SCENE { - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, player); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FISSURE, player); ABILITY_POPUP(opponent, ABILITY_STURDY); - MESSAGE("The opposing Geodude was protected by Sturdy!"); } } -TO_DO_BATTLE_TEST("Fissure faints the target, skipping regular damage calculations") -TO_DO_BATTLE_TEST("Fissure always fails if the target has a higher level than the user") -TO_DO_BATTLE_TEST("Fissure's accuracy increases by 1% for every level the user has over the target") -TO_DO_BATTLE_TEST("Fissure's ignores non-stage accuracy modifiers") // Gravity, Wide Lens, Compound Eyes +SINGLE_BATTLE_TEST("OHKO moves always fails if the target has a higher level than the user") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Level(1); } + OPPONENT(SPECIES_WOBBUFFET) { Level(2); } + } WHEN { + TURN { MOVE(player, MOVE_FISSURE); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FISSURE, player); + } +} + +SINGLE_BATTLE_TEST("OHKO moves fail if target protects") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_PROTECT); MOVE(player, MOVE_FISSURE); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FISSURE, player); + } +} +TO_DO_BATTLE_TEST("OHKO moves faints the target, skipping regular damage calculations") +TO_DO_BATTLE_TEST("OHKO moves's accuracy increases by 1% for every level the user has over the target") +TO_DO_BATTLE_TEST("OHKO moves's ignores non-stage accuracy modifiers") // Gravity, Wide Lens, Compound Eyes diff --git a/test/battle/move_effect/overwrite_ability.c b/test/battle/move_effect/overwrite_ability.c new file mode 100644 index 000000000000..e4be2b0667d2 --- /dev/null +++ b/test/battle/move_effect/overwrite_ability.c @@ -0,0 +1,150 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Simple Beam replaces target's ability with Simple") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SIMPLE_BEAM) == EFFECT_OVERWRITE_ABILITY); + ASSUME(GetMoveOverwriteAbility(MOVE_SIMPLE_BEAM) == ABILITY_SIMPLE); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } + OPPONENT(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } + }WHEN { + TURN { MOVE(player, MOVE_SIMPLE_BEAM); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, player); + ABILITY_POPUP(opponent, ABILITY_BLAZE); + } THEN { + EXPECT_EQ(opponent->ability, ABILITY_SIMPLE); + } +} + +DOUBLE_BATTLE_TEST("Simple Beam fails if the target already has Simple") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SIMPLE_BEAM) == EFFECT_OVERWRITE_ABILITY); + ASSUME(GetMoveOverwriteAbility(MOVE_SIMPLE_BEAM) == ABILITY_SIMPLE); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } + PLAYER(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } + OPPONENT(SPECIES_BULBASAUR) { Ability(ABILITY_OVERGROW); } + OPPONENT(SPECIES_SQUIRTLE) { Ability(ABILITY_TORRENT); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_SIMPLE_BEAM, target: opponentLeft); MOVE(playerRight, MOVE_SIMPLE_BEAM, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_OVERGROW); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, playerRight); + ABILITY_POPUP(opponentLeft, ABILITY_SIMPLE); + } + } THEN { + EXPECT_EQ(opponentLeft->ability, ABILITY_SIMPLE); + } +} + +SINGLE_BATTLE_TEST("Simple Beam fails if target has an ability that can't be overwritten") +{ + u32 species; + enum Ability ability; + + PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } + PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; } + PARAMETRIZE { species = SPECIES_MINIOR; ability = ABILITY_SHIELDS_DOWN; } + PARAMETRIZE { species = SPECIES_WISHIWASHI; ability = ABILITY_SCHOOLING; } + PARAMETRIZE { species = SPECIES_MIMIKYU; ability = ABILITY_DISGUISE; } + PARAMETRIZE { species = SPECIES_GRENINJA_BATTLE_BOND; ability = ABILITY_BATTLE_BOND; } + PARAMETRIZE { species = SPECIES_ZYGARDE; ability = ABILITY_POWER_CONSTRUCT; } + PARAMETRIZE { species = SPECIES_KOMALA; ability = ABILITY_COMATOSE; } + PARAMETRIZE { species = SPECIES_SILVALLY; ability = ABILITY_RKS_SYSTEM; } + PARAMETRIZE { species = SPECIES_CRAMORANT; ability = ABILITY_GULP_MISSILE; } + PARAMETRIZE { species = SPECIES_EISCUE; ability = ABILITY_ICE_FACE; } + PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; } + PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; } + PARAMETRIZE { species = SPECIES_PALAFIN_ZERO; ability = ABILITY_ZERO_TO_HERO; } + PARAMETRIZE { species = SPECIES_TATSUGIRI; ability = ABILITY_COMMANDER; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_SIMPLE_BEAM) == EFFECT_OVERWRITE_ABILITY); + ASSUME(GetMoveOverwriteAbility(MOVE_SIMPLE_BEAM) == ABILITY_SIMPLE); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_SIMPLE_BEAM); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, player); + MESSAGE("But it failed!"); + } +} + +SINGLE_BATTLE_TEST("Worry Seed replaces target's ability with Insomnia") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_OVERWRITE_ABILITY); + ASSUME(GetMoveOverwriteAbility(MOVE_WORRY_SEED) == ABILITY_INSOMNIA); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } + OPPONENT(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } + }WHEN { + TURN { MOVE(player, MOVE_WORRY_SEED); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, player); + ABILITY_POPUP(opponent, ABILITY_BLAZE); + } THEN { + EXPECT_EQ(opponent->ability, ABILITY_INSOMNIA); + } +} + +DOUBLE_BATTLE_TEST("Worry Seed fails if the target already has Insomnia") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_OVERWRITE_ABILITY); + ASSUME(GetMoveOverwriteAbility(MOVE_WORRY_SEED) == ABILITY_INSOMNIA); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } + PLAYER(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } + OPPONENT(SPECIES_BULBASAUR) { Ability(ABILITY_OVERGROW); } + OPPONENT(SPECIES_SQUIRTLE) { Ability(ABILITY_TORRENT); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_WORRY_SEED, target: opponentLeft); MOVE(playerRight, MOVE_WORRY_SEED, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_OVERGROW); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, playerRight); + ABILITY_POPUP(opponentLeft, ABILITY_INSOMNIA); + } + } THEN { + EXPECT_EQ(opponentLeft->ability, ABILITY_INSOMNIA); + } +} + +SINGLE_BATTLE_TEST("Worry Seed fails if target has an ability that can't be overwritten") +{ + u32 species; + enum Ability ability; + + PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } + PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; } + PARAMETRIZE { species = SPECIES_MINIOR; ability = ABILITY_SHIELDS_DOWN; } + PARAMETRIZE { species = SPECIES_WISHIWASHI; ability = ABILITY_SCHOOLING; } + PARAMETRIZE { species = SPECIES_MIMIKYU; ability = ABILITY_DISGUISE; } + PARAMETRIZE { species = SPECIES_GRENINJA_BATTLE_BOND; ability = ABILITY_BATTLE_BOND; } + PARAMETRIZE { species = SPECIES_ZYGARDE; ability = ABILITY_POWER_CONSTRUCT; } + PARAMETRIZE { species = SPECIES_KOMALA; ability = ABILITY_COMATOSE; } + PARAMETRIZE { species = SPECIES_SILVALLY; ability = ABILITY_RKS_SYSTEM; } + PARAMETRIZE { species = SPECIES_CRAMORANT; ability = ABILITY_GULP_MISSILE; } + PARAMETRIZE { species = SPECIES_EISCUE; ability = ABILITY_ICE_FACE; } + PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; } + PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; } + PARAMETRIZE { species = SPECIES_PALAFIN_ZERO; ability = ABILITY_ZERO_TO_HERO; } + PARAMETRIZE { species = SPECIES_TATSUGIRI; ability = ABILITY_COMMANDER; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_OVERWRITE_ABILITY); + ASSUME(GetMoveOverwriteAbility(MOVE_WORRY_SEED) == ABILITY_INSOMNIA); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_WORRY_SEED); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, player); + MESSAGE("But it failed!"); + } +} diff --git a/test/battle/move_effect/pledge.c b/test/battle/move_effect/pledge.c index a7935450b6c3..f2607b4ff762 100644 --- a/test/battle/move_effect/pledge.c +++ b/test/battle/move_effect/pledge.c @@ -910,6 +910,7 @@ DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move - Storm Drain") { GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); PLAYER(SPECIES_GASTRODON) { Ability(ABILITY_STORM_DRAIN); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/powder.c b/test/battle/move_effect/powder.c index aca96693de56..2bcfc58da823 100644 --- a/test/battle/move_effect/powder.c +++ b/test/battle/move_effect/powder.c @@ -80,10 +80,27 @@ SINGLE_BATTLE_TEST("Powder doesn't damage target if it has Magic Guard") } } -SINGLE_BATTLE_TEST("Powder doesn't damage target under heavy rain") +SINGLE_BATTLE_TEST("Powder damages the target under heavy rain (Gen 6)") { GIVEN { - ASSUME(B_POWDER_RAIN >= GEN_7); + WITH_CONFIG(CONFIG_POWDER_RAIN, GEN_6); + PLAYER(SPECIES_KYOGRE_PRIMAL) { Ability(ABILITY_PRIMORDIAL_SEA); } + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(player); + } THEN { + EXPECT_LT(player->hp, player->maxHP); + } +} + +SINGLE_BATTLE_TEST("Powder doesn't damage target under heavy rain (Gen 7+)") +{ + GIVEN { + WITH_CONFIG(CONFIG_POWDER_RAIN, GEN_7); PLAYER(SPECIES_KYOGRE_PRIMAL) { Ability(ABILITY_PRIMORDIAL_SEA); } OPPONENT(SPECIES_VIVILLON); } WHEN { @@ -92,7 +109,7 @@ SINGLE_BATTLE_TEST("Powder doesn't damage target under heavy rain") ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); - HP_BAR(opponent); + HP_BAR(player); } } THEN { EXPECT_EQ(player->maxHP, player->hp); @@ -132,10 +149,11 @@ DOUBLE_BATTLE_TEST("Powder fails if target is already affected by Powder") } } -SINGLE_BATTLE_TEST("Powder fails if the target is Grass type") +SINGLE_BATTLE_TEST("Powder fails if the target is Grass type (Gen6+)") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_VENUSAUR].types[0] == TYPE_GRASS || gSpeciesInfo[SPECIES_VENUSAUR].types[1] == TYPE_GRASS); + WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); + ASSUME(GetSpeciesType(SPECIES_VENUSAUR, 0) == TYPE_GRASS || GetSpeciesType(SPECIES_VENUSAUR, 1) == TYPE_GRASS); PLAYER(SPECIES_VENUSAUR); OPPONENT(SPECIES_VIVILLON); } WHEN { @@ -147,9 +165,10 @@ SINGLE_BATTLE_TEST("Powder fails if the target is Grass type") } } -SINGLE_BATTLE_TEST("Powder fails if the target has Overcoat") +SINGLE_BATTLE_TEST("Powder fails if the target has Overcoat (Gen6+)") { GIVEN { + WITH_CONFIG(CONFIG_POWDER_OVERCOAT, GEN_6); PLAYER(SPECIES_FORRETRESS) { Ability(ABILITY_OVERCOAT); } OPPONENT(SPECIES_VIVILLON); } WHEN { @@ -204,17 +223,20 @@ DOUBLE_BATTLE_TEST("Powder still blocks the target's Fire type moves even if it } } -SINGLE_BATTLE_TEST("Powder prevents Protean from changing its user to Fire type") +SINGLE_BATTLE_TEST("Powder prevents Protean/Libero from changing its user to Fire type") { + u32 ability, species; + PARAMETRIZE { ability = ABILITY_PROTEAN; species = SPECIES_GRENINJA; } + PARAMETRIZE { ability = ABILITY_LIBERO; species = SPECIES_RABOOT; } GIVEN { - PLAYER(SPECIES_GRENINJA) { Ability(ABILITY_PROTEAN); } + PLAYER(species) { Ability(ability); } OPPONENT(SPECIES_VIVILLON); } WHEN { TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_EMBER); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); NONE_OF { - ABILITY_POPUP(player, ABILITY_PROTEAN); + ABILITY_POPUP(player, ability); ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); HP_BAR(opponent); } diff --git a/test/battle/move_effect/protect.c b/test/battle/move_effect/protect.c index e0c32e52675f..05b238fe0ed9 100644 --- a/test/battle/move_effect/protect.c +++ b/test/battle/move_effect/protect.c @@ -162,7 +162,7 @@ SINGLE_BATTLE_TEST("Protect: Spiky Shield does 1/8 dmg of max hp of attackers ma } } -SINGLE_BATTLE_TEST("Protect: Baneful Bunker poisons pokemon for moves making contact") +SINGLE_BATTLE_TEST("Protect: Baneful Bunker poisons PokΓ©mon for moves making contact") { u16 usedMove = MOVE_NONE; @@ -194,7 +194,27 @@ SINGLE_BATTLE_TEST("Protect: Baneful Bunker poisons pokemon for moves making con } } -SINGLE_BATTLE_TEST("Protect: Burning Bulwark burns pokemon for moves making contact") +SINGLE_BATTLE_TEST("Protect: Baneful Bunker can't poison PokΓ©mon if they are already statused") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_WILL_O_WISP); } + TURN { MOVE(opponent, MOVE_BANEFUL_BUNKER); MOVE(player, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WILL_O_WISP, opponent); + STATUS_ICON(player, STATUS1_BURN); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BANEFUL_BUNKER, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + HP_BAR(opponent); + STATUS_ICON(player, STATUS1_POISON); + } + } +} + +SINGLE_BATTLE_TEST("Protect: Burning Bulwark burns PokΓ©mon for moves making contact") { u16 usedMove = MOVE_NONE; @@ -226,6 +246,26 @@ SINGLE_BATTLE_TEST("Protect: Burning Bulwark burns pokemon for moves making cont } } +SINGLE_BATTLE_TEST("Protect: Burning Bulwark can't burn PokΓ©mon if they are already statused") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_TOXIC); } + TURN { MOVE(opponent, MOVE_BURNING_BULWARK); MOVE(player, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC, opponent); + STATUS_ICON(player, STATUS1_TOXIC_POISON); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BURNING_BULWARK, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + HP_BAR(opponent); + STATUS_ICON(player, STATUS1_BURN); + } + } +} + SINGLE_BATTLE_TEST("Protect: Recoil damage is not applied if target was protected") { u32 j, k; @@ -316,6 +356,42 @@ SINGLE_BATTLE_TEST("Protect: Multi-hit moves don't hit a protected target and fa } } +SINGLE_BATTLE_TEST("Protect fails if user moves last") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_PROTECT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_PROTECT, player); + } +} + +DOUBLE_BATTLE_TEST("Protect fails when the only slower battler is a fainted ally") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } + PLAYER(SPECIES_WYNAUT) { HP(1); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(20); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerRight); } + TURN { + MOVE(opponentLeft, MOVE_CELEBRATE); + MOVE(opponentRight, MOVE_CELEBRATE); + MOVE(playerLeft, MOVE_PROTECT); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + MESSAGE("Wynaut fainted!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_PROTECT, playerLeft); + } +} + DOUBLE_BATTLE_TEST("Protect: Wide Guard protects self and ally from multi-target moves") { u16 move = MOVE_NONE; @@ -358,12 +434,15 @@ DOUBLE_BATTLE_TEST("Protect: Wide Guard protects self and ally from multi-target } } -DOUBLE_BATTLE_TEST("Protect: Wide Guard can not fail on consecutive turns") +DOUBLE_BATTLE_TEST("Protect: Wide Guard can not fail on consecutive turns (Gen6+)") { - u8 turns; + u32 turns, config, passes; - PASSES_RANDOMLY(2, 2); + PARAMETRIZE { config = GEN_5; passes = 0; } + PARAMETRIZE { config = GEN_6; passes = 2; } + PASSES_RANDOMLY(passes, 2); GIVEN { + WITH_CONFIG(CONFIG_WIDE_GUARD, config); ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -391,8 +470,8 @@ DOUBLE_BATTLE_TEST("Protect: Quick Guard protects self and ally from priority mo u16 move = MOVE_NONE; struct BattlePokemon *targetOpponent = NULL; - PARAMETRIZE { move = MOVE_SCRATCH; targetOpponent = opponentLeft; } - PARAMETRIZE { move = MOVE_SCRATCH; targetOpponent = opponentRight; } + PARAMETRIZE { move = MOVE_SCRATCH; targetOpponent = opponentLeft; } + PARAMETRIZE { move = MOVE_SCRATCH; targetOpponent = opponentRight; } PARAMETRIZE { move = MOVE_QUICK_ATTACK; targetOpponent = opponentLeft; } PARAMETRIZE { move = MOVE_QUICK_ATTACK; targetOpponent = opponentRight; } @@ -421,12 +500,15 @@ DOUBLE_BATTLE_TEST("Protect: Quick Guard protects self and ally from priority mo } } -DOUBLE_BATTLE_TEST("Protect: Quick Guard can not fail on consecutive turns") +DOUBLE_BATTLE_TEST("Protect: Quick Guard can not fail on consecutive turns (Gen6+)") { - u8 turns; + u32 turns, config, passes; - PASSES_RANDOMLY(2, 2); + PARAMETRIZE { config = GEN_5; passes = 0; } + PARAMETRIZE { config = GEN_6; passes = 2; } + PASSES_RANDOMLY(passes, 2); GIVEN { + WITH_CONFIG(CONFIG_QUICK_GUARD, config); ASSUME(GetMovePriority(MOVE_QUICK_ATTACK) == 1); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -537,10 +619,10 @@ DOUBLE_BATTLE_TEST("Crafty Shield protects self and ally from Confide and Decora DOUBLE_BATTLE_TEST("Crafty Shield does not protect against moves that target all battlers") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_TANGROWTH].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_SUNKERN].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_SUNFLORA].types[0] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_TANGROWTH, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_SUNKERN, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_SUNFLORA, 0) == TYPE_GRASS); PLAYER(SPECIES_TANGELA); PLAYER(SPECIES_TANGROWTH); OPPONENT(SPECIES_SUNKERN); @@ -618,3 +700,75 @@ SINGLE_BATTLE_TEST("Protect: Quick Guard, Wide Guard and Crafty Shield don't red EXPECT_EQ(results[4].damage, results[5].damage); } } + +SINGLE_BATTLE_TEST("Protect: Protective Pads protects from secondary effects") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_PROTECTIVE_PADS); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_BURNING_BULWARK); MOVE(player, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BURNING_BULWARK, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + HP_BAR(opponent); + STATUS_ICON(player, STATUS1_BURN); + } + } +} + +DOUBLE_BATTLE_TEST("Protect is not transferred to a mon that is switched in due to Eject Button") +{ + GIVEN { + PLAYER(SPECIES_URSHIFU) { Ability(ABILITY_UNSEEN_FIST); }; + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT) { Item(ITEM_EJECT_BUTTON); } + OPPONENT(SPECIES_SQUIRTLE); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(opponentRight, MOVE_PROTECT); + MOVE(playerLeft, MOVE_POUND, target: opponentRight); + SEND_OUT(opponentRight, 2); + MOVE(playerRight, MOVE_POUND, target: opponentRight); + SEND_OUT(opponentRight, 3); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PROTECT, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, playerRight); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Wide Guard is still activate even if user is switched out due to Eject Button") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT) { Item(ITEM_EJECT_BUTTON); } + OPPONENT(SPECIES_SQUIRTLE); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(opponentRight, MOVE_WIDE_GUARD); + MOVE(playerLeft, MOVE_POUND, target: opponentRight); + SEND_OUT(opponentRight, 2); + MOVE(playerRight, MOVE_HYPER_VOICE, target: opponentRight); + SEND_OUT(opponentRight, 3); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WIDE_GUARD, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerRight); + HP_BAR(opponentLeft); + HP_BAR(opponentRight); + } + } +} diff --git a/test/battle/move_effect/psychic_terrain.c b/test/battle/move_effect/psychic_terrain.c index b85653a0bef0..36f4841ef176 100644 --- a/test/battle/move_effect/psychic_terrain.c +++ b/test/battle/move_effect/psychic_terrain.c @@ -11,7 +11,7 @@ SINGLE_BATTLE_TEST("Psychic Terrain protects grounded battlers from priority mov TURN { MOVE(player, MOVE_QUICK_ATTACK); MOVE(opponent, MOVE_QUICK_ATTACK); } } SCENE { MESSAGE("Claydol used Psychic Terrain!"); - MESSAGE("Claydol cannot use Quick Attack!"); + MESSAGE("The opposing Wobbuffet is protected by the Psychic Terrain!"); NOT { HP_BAR(opponent); } MESSAGE("The opposing Wobbuffet used Quick Attack!"); HP_BAR(player); @@ -41,7 +41,7 @@ SINGLE_BATTLE_TEST("Psychic Terrain increases power of Psychic-type moves by 30/ } } -SINGLE_BATTLE_TEST("Psychic Terrain doesn't block priority moves that target the user") +SINGLE_BATTLE_TEST("Psychic Terrain doesn't blocks priority moves that target the user") { GIVEN { PLAYER(SPECIES_SABLEYE) { Ability(ABILITY_PRANKSTER); HP(1); } @@ -114,6 +114,40 @@ SINGLE_BATTLE_TEST("Psychic Terrain doesn't block priority field moves") } } +SINGLE_BATTLE_TEST("Psychic Terrain doesn't block priority moves against semi-invulnerable targets") +{ + u32 move = 0, shouldWork = 0; + PARAMETRIZE { move = MOVE_SOLAR_BEAM; shouldWork = FALSE;} + PARAMETRIZE { move = MOVE_FLY; shouldWork = TRUE;} + GIVEN { + WITH_CONFIG(CONFIG_TOXIC_NEVER_MISS, GEN_6); + ASSUME(IsSpeciesOfType(SPECIES_SHROODLE, TYPE_POISON)); + PLAYER(SPECIES_SHROODLE) { Ability(ABILITY_PRANKSTER); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_PSYCHIC_TERRAIN); MOVE(opponent,move);} + TURN { MOVE(player, MOVE_TOXIC); SKIP_TURN(opponent);} + } SCENE { + if (shouldWork) + { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + } + else + { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + } + } + } THEN { + if (shouldWork) + EXPECT(opponent->status1 & STATUS1_TOXIC_POISON); + else + EXPECT(!(opponent->status1 & STATUS1_TOXIC_POISON)); + } +} + SINGLE_BATTLE_TEST("Psychic Terrain lasts for 5 turns") { GIVEN { @@ -142,3 +176,37 @@ SINGLE_BATTLE_TEST("Psychic Terrain lasts for 5 turns") MESSAGE("The weirdness disappeared from the battlefield!"); } } + +DOUBLE_BATTLE_TEST("Psychic Terrain protects grounded battlers from priority moves in doubles - Left") +{ + GIVEN { + PLAYER(SPECIES_CLAYDOL) { Ability(ABILITY_LEVITATE); } + PLAYER(SPECIES_TAPU_LELE) { Ability(ABILITY_PSYCHIC_SURGE); } + OPPONENT(SPECIES_VOLBEAT) { Ability(ABILITY_PRANKSTER); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_COTTON_SPORE); } + } SCENE { + ABILITY_POPUP(playerRight, ABILITY_PSYCHIC_SURGE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_COTTON_SPORE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + } +} + +DOUBLE_BATTLE_TEST("Psychic Terrain protects grounded battlers from priority moves in doubles - Right") +{ + GIVEN { + PLAYER(SPECIES_TAPU_LELE) { Ability(ABILITY_PSYCHIC_SURGE); } + PLAYER(SPECIES_CLAYDOL) { Ability(ABILITY_LEVITATE); } + OPPONENT(SPECIES_VOLBEAT) { Ability(ABILITY_PRANKSTER); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_COTTON_SPORE); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_PSYCHIC_SURGE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_COTTON_SPORE, opponentLeft); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + } +} diff --git a/test/battle/move_effect/purify.c b/test/battle/move_effect/purify.c index 134c96119ff8..425d0a99a9a5 100644 --- a/test/battle/move_effect/purify.c +++ b/test/battle/move_effect/purify.c @@ -1,4 +1,66 @@ #include "global.h" #include "test/battle.h" +AI_DOUBLE_BATTLE_TEST("AI uses Purify") +{ + u32 status1; + + PARAMETRIZE { status1 = STATUS1_NONE; } + PARAMETRIZE { status1 = STATUS1_FREEZE; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HEADBUTT, MOVE_PURIFY); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(status1); Moves(MOVE_HEADBUTT); } + } WHEN { + if (status1 == STATUS1_NONE) + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_PURIFY); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_PURIFY, target: opponentRight); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Purify to heal an enemy with Guts") +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_GUTS; } + PARAMETRIZE { ability = ABILITY_BULLETPROOF; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_URSALUNA) { Ability(ability); Moves(MOVE_HEADLONG_RUSH, MOVE_CELEBRATE); Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HEADBUTT, MOVE_PURIFY); } + } WHEN { + if (ability == ABILITY_GUTS) + TURN { EXPECT_MOVE(opponent, MOVE_PURIFY); } + else + TURN { NOT_EXPECT_MOVE(opponent, MOVE_PURIFY); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI does not use Purify to heal an ally with Guts") +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_GUTS; } + PARAMETRIZE { ability = ABILITY_BULLETPROOF; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HEADBUTT, MOVE_PURIFY); } + OPPONENT(SPECIES_URSALUNA) { Ability(ability); Moves(MOVE_HEADLONG_RUSH); Status1(STATUS1_BURN); } + } WHEN { + if (ability == ABILITY_GUTS) + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_PURIFY); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_PURIFY, target: opponentRight); } + } +} + TO_DO_BATTLE_TEST("TODO: Write Purify (Move Effect) test titles") +TO_DO_BATTLE_TEST("Purify doesn't heal HP if the target has Comatose") diff --git a/test/battle/move_effect/pursuit.c b/test/battle/move_effect/pursuit.c index b18aa74b09b6..cc8c0a72b848 100644 --- a/test/battle/move_effect/pursuit.c +++ b/test/battle/move_effect/pursuit.c @@ -51,6 +51,7 @@ DOUBLE_BATTLE_TEST("Pursuit doesn't attack a foe using Teleport / Baton Pass to PARAMETRIZE { move = MOVE_TELEPORT; } PARAMETRIZE { move = MOVE_BATON_PASS; } GIVEN { + WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_8); ASSUME(GetMoveEffect(MOVE_QUASH) == EFFECT_QUASH); ASSUME(GetMoveEffect(MOVE_TELEPORT) == EFFECT_TELEPORT); ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); diff --git a/test/battle/move_effect/quash.c b/test/battle/move_effect/quash.c index 1d2f89230c11..0fc2fbd25d36 100644 --- a/test/battle/move_effect/quash.c +++ b/test/battle/move_effect/quash.c @@ -26,7 +26,7 @@ DOUBLE_BATTLE_TEST("Quash-affected target will move last in the priority bracket DOUBLE_BATTLE_TEST("Quash is not affected by dynamic speed") { GIVEN { - ASSUME(B_RECALC_TURN_AFTER_ACTIONS >= GEN_8); + WITH_CONFIG(CONFIG_RECALC_TURN_AFTER_ACTIONS, GEN_8); ASSUME(GetMoveEffect(MOVE_TAILWIND) == EFFECT_TAILWIND); PLAYER(SPECIES_VOLBEAT) { Speed(10); Ability(ABILITY_PRANKSTER); } PLAYER(SPECIES_WOBBUFFET) { Speed(30); } @@ -44,7 +44,7 @@ DOUBLE_BATTLE_TEST("Quash is not affected by dynamic speed") } } -DOUBLE_BATTLE_TEST("Quash calculates correct turn order if only one pokemon is left on the opposing side") +DOUBLE_BATTLE_TEST("Quash calculates correct turn order if only one PokΓ©mon is left on the opposing side") { GIVEN { PLAYER(SPECIES_GRENINJA) { Speed(120); } @@ -112,7 +112,7 @@ DOUBLE_BATTLE_TEST("Quash-affected targets move from fastest to slowest (Gen 8+) DOUBLE_BATTLE_TEST("Quash-affected mon that acted early via After You is not affected by dynamic speed") { GIVEN { - ASSUME(B_RECALC_TURN_AFTER_ACTIONS >= GEN_8); + WITH_CONFIG(CONFIG_RECALC_TURN_AFTER_ACTIONS, GEN_8); ASSUME(GetMoveEffect(MOVE_TAILWIND) == EFFECT_TAILWIND); ASSUME(GetMoveEffect(MOVE_AFTER_YOU) == EFFECT_AFTER_YOU); PLAYER(SPECIES_VOLBEAT) { Speed(20); Ability(ABILITY_PRANKSTER); } diff --git a/test/battle/move_effect/quiver_dance.c b/test/battle/move_effect/quiver_dance.c index 5a7ff5b944bf..b317d398780a 100644 --- a/test/battle/move_effect/quiver_dance.c +++ b/test/battle/move_effect/quiver_dance.c @@ -1,4 +1,24 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Quiver Dance (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_QUIVER_DANCE) == EFFECT_QUIVER_DANCE); +} + +SINGLE_BATTLE_TEST("Quiver Dance increases the user's Sp. Attack, Sp. Defense and Speed by 1 stage each") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_QUIVER_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_QUIVER_DANCE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 1); + } +} diff --git a/test/battle/move_effect/rage_fist.c b/test/battle/move_effect/rage_fist.c index e803a05a9db9..7a0b6bc3220f 100644 --- a/test/battle/move_effect/rage_fist.c +++ b/test/battle/move_effect/rage_fist.c @@ -249,7 +249,7 @@ SINGLE_BATTLE_TEST("Rage Fist base power is not increased if move had no affect" } } -SINGLE_BATTLE_TEST("Rage Fist base power is increased if Disguise breaks") +SINGLE_BATTLE_TEST("Rage Fist base power is increased if Disguise breaks (Gen7)") { s16 timesGotHit[2]; u16 species = SPECIES_NONE; @@ -258,6 +258,34 @@ SINGLE_BATTLE_TEST("Rage Fist base power is increased if Disguise breaks") PARAMETRIZE { species = SPECIES_MIMIKYU_TOTEM_DISGUISED; } GIVEN { + WITH_CONFIG(CONFIG_DISGUISE_HP_LOSS, GEN_7); + PLAYER(species) { Ability(ABILITY_DISGUISE); } + OPPONENT(SPECIES_REGIROCK); + } WHEN { + TURN { MOVE(player, MOVE_RAGE_FIST); MOVE(opponent, MOVE_ROCK_THROW); } + TURN { MOVE(player, MOVE_RAGE_FIST); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE_FIST, player); + HP_BAR(opponent, captureDamage: ×GotHit[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_THROW, opponent); + ABILITY_POPUP(player, ABILITY_DISGUISE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE_FIST, player); + HP_BAR(opponent, captureDamage: ×GotHit[1]); + } THEN { + EXPECT_MUL_EQ(timesGotHit[0], Q_4_12(2.0), timesGotHit[1]); + } +} + +SINGLE_BATTLE_TEST("Rage Fist base power is increased if Disguise breaks (Gen8+)") +{ + s16 timesGotHit[2]; + u16 species = SPECIES_NONE; + + PARAMETRIZE { species = SPECIES_MIMIKYU_DISGUISED; } + PARAMETRIZE { species = SPECIES_MIMIKYU_TOTEM_DISGUISED; } + + GIVEN { + WITH_CONFIG(CONFIG_DISGUISE_HP_LOSS, GEN_8); PLAYER(species) { Ability(ABILITY_DISGUISE); } OPPONENT(SPECIES_REGIROCK); } WHEN { @@ -342,3 +370,28 @@ SINGLE_BATTLE_TEST("Rage Fist doesn't get increased power if Substitute is hit") EXPECT_EQ(timesGotHit[0], timesGotHit[1]); } } + +SINGLE_BATTLE_TEST("Rage Fist counter will be updated correctly after absorb move") +{ + s16 timesGotHit[2]; + + GIVEN { + ASSUME(GetMoveEffect(MOVE_GIGA_DRAIN) == EFFECT_ABSORB); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_RAGE_FIST); MOVE(opponent, MOVE_GIGA_DRAIN); } + TURN { MOVE(player, MOVE_RAGE_FIST); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE_FIST, player); + HP_BAR(opponent, captureDamage: ×GotHit[0]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_GIGA_DRAIN, opponent); + HP_BAR(player); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE_FIST, player); + HP_BAR(opponent, captureDamage: ×GotHit[1]); + } THEN { + EXPECT_MUL_EQ(timesGotHit[0], Q_4_12(2.0), timesGotHit[1]); + } +} diff --git a/test/battle/move_effect/rain_always_hit.c b/test/battle/move_effect/rain_always_hit.c deleted file mode 100644 index 3bed952a373c..000000000000 --- a/test/battle/move_effect/rain_always_hit.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -TO_DO_BATTLE_TEST("TODO: Write Bleakwind/Wildbolt/Sandsear Storm (Move Effect) test titles") diff --git a/test/battle/move_effect/rapid_spin.c b/test/battle/move_effect/rapid_spin.c index 9d142bf32eea..852b4d69a784 100644 --- a/test/battle/move_effect/rapid_spin.c +++ b/test/battle/move_effect/rapid_spin.c @@ -63,3 +63,32 @@ SINGLE_BATTLE_TEST("Rapid Spin: Mortal Spin blows away Wrap, hazards and poisons MESSAGE("Wobbuffet blew away Stealth Rock!"); } } + +SINGLE_BATTLE_TEST("Rapid Spin blows away all hazards") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_RAPID_SPIN) == EFFECT_RAPID_SPIN); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_STEALTH_ROCK); } + TURN { MOVE(opponent, MOVE_STICKY_WEB); } + TURN { MOVE(opponent, MOVE_TOXIC_SPIKES); } + TURN { MOVE(opponent, MOVE_SPIKES); MOVE(player, MOVE_RAPID_SPIN); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAPID_SPIN, player); + + MESSAGE("Wobbuffet blew away Spikes!"); + MESSAGE("Wobbuffet blew away Sticky Web!"); + MESSAGE("Wobbuffet blew away Toxic Spikes!"); + MESSAGE("Wobbuffet blew away Stealth Rock!"); + } THEN { + EXPECT_EQ(gBattleStruct->hazardsQueue[0][0], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][1], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][2], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][3], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][4], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][5], HAZARDS_NONE); + } +} diff --git a/test/battle/move_effect/recoil.c b/test/battle/move_effect/recoil.c new file mode 100644 index 000000000000..60bf17435a2b --- /dev/null +++ b/test/battle/move_effect/recoil.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Take Down (Move Effect) test titles") diff --git a/test/battle/move_effect/recoil_hp_25.c b/test/battle/move_effect/recoil_hp_25.c deleted file mode 100644 index 9abb1bcfd049..000000000000 --- a/test/battle/move_effect/recoil_hp_25.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -TO_DO_BATTLE_TEST("TODO: Write Struggle (Move Effect) test titles") diff --git a/test/battle/move_effect/recoil_if_miss.c b/test/battle/move_effect/recoil_if_miss.c index a5dbfef1786d..7f62f2065e04 100644 --- a/test/battle/move_effect/recoil_if_miss.c +++ b/test/battle/move_effect/recoil_if_miss.c @@ -41,7 +41,7 @@ SINGLE_BATTLE_TEST("Recoil if miss: Jump Kick has 50% recoil on protect") SINGLE_BATTLE_TEST("Recoil if miss: Jump Kick has no recoil if no target") { GIVEN { - ASSUME(B_HEALING_WISH_SWITCH >= GEN_5); + WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); @@ -134,7 +134,7 @@ SINGLE_BATTLE_TEST("Recoil if miss: Supercell Slam causes recoil if it is absorb SINGLE_BATTLE_TEST("Recoil if miss: Disguise doesn't prevent crash damage from Jump Kick into ghost types") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_EARLY_BIRD; } PARAMETRIZE { ability = ABILITY_SCRAPPY; } @@ -154,4 +154,3 @@ SINGLE_BATTLE_TEST("Recoil if miss: Disguise doesn't prevent crash damage from J } } } - diff --git a/test/battle/move_effect/reflect_type.c b/test/battle/move_effect/reflect_type.c index ae2b7cc3fedf..7b94aee34e83 100644 --- a/test/battle/move_effect/reflect_type.c +++ b/test/battle/move_effect/reflect_type.c @@ -86,10 +86,10 @@ SINGLE_BATTLE_TEST("Reflect Type does not affect any of Silvally's forms") SINGLE_BATTLE_TEST("Reflect Type fails if the target has no types") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[0] == TYPE_WATER); - ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[1] == TYPE_FIGHTING); + ASSUME(GetSpeciesType(SPECIES_ARCANINE, 0) == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_ARCANINE, 1) == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_POLIWRATH, 0) == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_POLIWRATH, 1) == TYPE_FIGHTING); PLAYER(SPECIES_ARCANINE); OPPONENT(SPECIES_POLIWRATH); } WHEN { @@ -107,10 +107,10 @@ SINGLE_BATTLE_TEST("Reflect Type fails if the target has no types") SINGLE_BATTLE_TEST("Reflect Type copies a target's dual types") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[0] == TYPE_WATER); - ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[1] == TYPE_FIGHTING); + ASSUME(GetSpeciesType(SPECIES_ARCANINE, 0) == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_ARCANINE, 1) == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_POLIWRATH, 0) == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_POLIWRATH, 1) == TYPE_FIGHTING); PLAYER(SPECIES_ARCANINE); OPPONENT(SPECIES_POLIWRATH); } WHEN { @@ -129,10 +129,10 @@ SINGLE_BATTLE_TEST("Reflect Type copies a target's dual types") SINGLE_BATTLE_TEST("Reflect Type copies a target's pure type") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_SUDOWOODO].types[0] == TYPE_ROCK); - ASSUME(gSpeciesInfo[SPECIES_SUDOWOODO].types[1] == TYPE_ROCK); + ASSUME(GetSpeciesType(SPECIES_ARCANINE, 0) == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_ARCANINE, 1) == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_SUDOWOODO, 0) == TYPE_ROCK); + ASSUME(GetSpeciesType(SPECIES_SUDOWOODO, 1) == TYPE_ROCK); PLAYER(SPECIES_ARCANINE); OPPONENT(SPECIES_SUDOWOODO); } WHEN { @@ -151,10 +151,10 @@ SINGLE_BATTLE_TEST("Reflect Type copies a target's pure type") SINGLE_BATTLE_TEST("Reflect Type defaults to Normal type for the user's 1st and 2nd types if the target only has a 3rd type") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_ARCANINE, 0) == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_ARCANINE, 1) == TYPE_FIRE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ARCANINE); } WHEN { @@ -202,8 +202,8 @@ SINGLE_BATTLE_TEST("Reflect Type fails if the user is Terastallized") SINGLE_BATTLE_TEST("Reflect Type succeeds against a Terastallized target and copies its Tera type") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[0] != TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[1] != TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_POLIWRATH, 0) != TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_POLIWRATH, 1) != TYPE_NORMAL); PLAYER(SPECIES_ARCANINE) { TeraType(TYPE_NORMAL); } OPPONENT(SPECIES_POLIWRATH); } WHEN { diff --git a/test/battle/move_effect/relic_song.c b/test/battle/move_effect/relic_song.c deleted file mode 100644 index f1e7fae92fdc..000000000000 --- a/test/battle/move_effect/relic_song.c +++ /dev/null @@ -1,199 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(GetMoveEffect(MOVE_RELIC_SONG) == EFFECT_RELIC_SONG); - ASSUME(MoveHasAdditionalEffect(MOVE_RELIC_SONG, MOVE_EFFECT_SLEEP) == TRUE); -} - -SINGLE_BATTLE_TEST("Relic Song has a 10% chance to put the target to sleep") -{ - PASSES_RANDOMLY(10, 100, RNG_SECONDARY_EFFECT); - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_RELIC_SONG); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); - HP_BAR(opponent); - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); - STATUS_ICON(opponent, sleep: TRUE); - } -} - -SINGLE_BATTLE_TEST("Relic Song is prevented by Soundproof") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_VOLTORB) { Ability(ABILITY_SOUNDPROOF); } - } WHEN { - TURN { MOVE(player, MOVE_RELIC_SONG); } - } SCENE { - ABILITY_POPUP(opponent, ABILITY_SOUNDPROOF); - MESSAGE("The opposing Voltorb's Soundproof blocks Relic Song!"); - NONE_OF { - ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); - HP_BAR(opponent); - } - } -} - -SINGLE_BATTLE_TEST("Relic Song will become a Water-type move when used by a PokΓ©mon with the Ability Liquid Voice") -{ - GIVEN { - PLAYER(SPECIES_VULPIX); - OPPONENT(SPECIES_POPPLIO) { Ability(ABILITY_LIQUID_VOICE); } - } WHEN { - TURN { MOVE(opponent, MOVE_RELIC_SONG); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, opponent); - HP_BAR(player); - MESSAGE("It's super effective!"); - } -} - -SINGLE_BATTLE_TEST("Relic Song is blocked by Throat Chop") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, MOVE_THROAT_CHOP); MOVE(player, MOVE_RELIC_SONG); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_THROAT_CHOP, opponent); - HP_BAR(player); - MESSAGE("The effects of Throat Chop prevent Wobbuffet from using certain moves!"); - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); - } -} - -SINGLE_BATTLE_TEST("Relic Song transforms Meloetta if used successfully") -{ - GIVEN { - PLAYER(SPECIES_MELOETTA_ARIA); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_RELIC_SONG); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); - HP_BAR(opponent); - MESSAGE("Meloetta transformed!"); - } THEN { - EXPECT_EQ(player->species, SPECIES_MELOETTA_PIROUETTE); - } -} - -SINGLE_BATTLE_TEST("Relic Song does not transform Pokemon other than Meloetta") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_RELIC_SONG); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); - HP_BAR(opponent); - NONE_OF { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player); - MESSAGE("Wobbuffet transformed!"); - } - } THEN { - EXPECT_EQ(player->species, SPECIES_WOBBUFFET); - } -} - -SINGLE_BATTLE_TEST("Relic Song transforms Meloetta twice if used successfully") -{ - GIVEN { - PLAYER(SPECIES_MELOETTA_ARIA); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_RELIC_SONG); } - TURN { MOVE(player, MOVE_RELIC_SONG); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); - HP_BAR(opponent); - MESSAGE("Meloetta transformed!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); - HP_BAR(opponent); - MESSAGE("Meloetta transformed!"); - } THEN { - EXPECT_EQ(player->species, SPECIES_MELOETTA_ARIA); - } -} - -SINGLE_BATTLE_TEST("Relic Song transformation is the last thing that happens after it hits") -{ - GIVEN { - PLAYER(SPECIES_MELOETTA_ARIA); - OPPONENT(SPECIES_GOSSIFLEUR) { HP(1); Ability(ABILITY_COTTON_DOWN); } - } WHEN { - TURN { MOVE(player, MOVE_RELIC_SONG); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); - HP_BAR(opponent); - MESSAGE("The opposing Gossifleur fainted!"); - ABILITY_POPUP(opponent, ABILITY_COTTON_DOWN); - MESSAGE("Meloetta's Speed fell!"); - MESSAGE("Meloetta transformed!"); - } THEN { - EXPECT_EQ(player->species, SPECIES_MELOETTA_PIROUETTE); - } -} - -DOUBLE_BATTLE_TEST("Relic Song transforms once Meloetta in a double battle") -{ - GIVEN { - PLAYER(SPECIES_MELOETTA_ARIA); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(playerLeft, MOVE_RELIC_SONG); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, playerLeft); - HP_BAR(opponentLeft); - HP_BAR(opponentRight); - MESSAGE("Meloetta transformed!"); - } THEN { - EXPECT_EQ(playerLeft->species, SPECIES_MELOETTA_PIROUETTE); - } -} - -SINGLE_BATTLE_TEST("Relic Song loses the form-changing effect with Sheer Force") -{ - GIVEN { - PLAYER(SPECIES_MELOETTA_ARIA); - OPPONENT(SPECIES_NIDOKING) { Ability(ABILITY_SHEER_FORCE); } - } WHEN { - TURN { MOVE(opponent, MOVE_SKILL_SWAP); MOVE(player, MOVE_RELIC_SONG); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, opponent); - ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); - HP_BAR(opponent); - NOT MESSAGE("Meloetta transformed!"); - } THEN { - EXPECT_EQ(player->species, SPECIES_MELOETTA_ARIA); - } -} - -SINGLE_BATTLE_TEST("Relic Song transforms Meloetta after Magician was activated") -{ - GIVEN { - PLAYER(SPECIES_MELOETTA_ARIA); - OPPONENT(SPECIES_DELPHOX) { Ability(ABILITY_MAGICIAN); Item(ITEM_POTION); } - } WHEN { - TURN { MOVE(opponent, MOVE_SKILL_SWAP); MOVE(player, MOVE_RELIC_SONG); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, opponent); - ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); - HP_BAR(opponent); - ABILITY_POPUP(player, ABILITY_MAGICIAN); - MESSAGE("Meloetta stole the opposing Delphox's Potion!"); - MESSAGE("Meloetta transformed!"); - } THEN { - EXPECT_EQ(player->species, SPECIES_MELOETTA_PIROUETTE); - } -} diff --git a/test/battle/move_effect/rest.c b/test/battle/move_effect/rest.c index 4d0d85b56013..af1fb19c8c13 100644 --- a/test/battle/move_effect/rest.c +++ b/test/battle/move_effect/rest.c @@ -1,4 +1,105 @@ #include "global.h" #include "test/battle.h" +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); +} + +SINGLE_BATTLE_TEST("Rest causes the user to fall asleep and restores HP to full") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(300); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_REST); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_REST, player); + } THEN { + EXPECT(player->status1 & STATUS1_SLEEP); + EXPECT_EQ(player->hp, player->maxHP); + } +} + +SINGLE_BATTLE_TEST("Rest fails if the user is at full HP") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(300); MaxHP(300); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_REST); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_REST, player); + } THEN { + EXPECT(!(player->status1 & STATUS1_SLEEP)); + } +} + +SINGLE_BATTLE_TEST("Rest fails if the user is protected by Shields Down") +{ + GIVEN { + PLAYER(SPECIES_MINIOR_METEOR) { Ability(ABILITY_SHIELDS_DOWN); HP(299); MaxHP(300); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_REST); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_REST, player); + } THEN { + EXPECT(!(player->status1 & STATUS1_SLEEP)); + } +} + +SINGLE_BATTLE_TEST("Rest fails if the user is protected by Electric/Misty Terrain") +{ + u32 move; + PARAMETRIZE { move = MOVE_ELECTRIC_TERRAIN; } + PARAMETRIZE { move = MOVE_MISTY_TERRAIN; } + GIVEN { + ASSUME(GetMoveEffect(MOVE_ELECTRIC_TERRAIN) == EFFECT_ELECTRIC_TERRAIN); + ASSUME(GetMoveEffect(MOVE_MISTY_TERRAIN) == EFFECT_MISTY_TERRAIN); + ASSUME(GetSpeciesType(SPECIES_WYNAUT, 0) != TYPE_FLYING && GetSpeciesType(SPECIES_WYNAUT, 1) != TYPE_FLYING); + PLAYER(SPECIES_WYNAUT) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, move); MOVE(player, MOVE_REST); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_REST, player); + } THEN { + EXPECT(!(player->status1 & STATUS1_SLEEP)); + } +} + +SINGLE_BATTLE_TEST("Rest doesn't fail if the user is protected by Safeguard") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SAFEGUARD) == EFFECT_SAFEGUARD); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SAFEGUARD); } + TURN { MOVE(player, MOVE_REST); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_REST, player); + } THEN { + EXPECT(player->status1 & STATUS1_SLEEP); + } +} + +DOUBLE_BATTLE_TEST("Rest doesn't fail if the user is protected by Flower Veil") +{ + GIVEN { + ASSUME(GetSpeciesType(SPECIES_CHIKORITA, 0) == TYPE_GRASS || GetSpeciesType(SPECIES_CHIKORITA, 1) == TYPE_GRASS); + PLAYER(SPECIES_CHIKORITA) { HP(1); } + PLAYER(SPECIES_FLORGES) { Ability(ABILITY_FLOWER_VEIL); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_REST); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_REST, playerLeft); + } THEN { + EXPECT(playerLeft->status1 & STATUS1_SLEEP); + } +} + TO_DO_BATTLE_TEST("TODO: Write Rest (Move Effect) test titles") diff --git a/test/battle/move_effect/retaliate.c b/test/battle/move_effect/retaliate.c index 47b1c3325d0c..850340858c4b 100644 --- a/test/battle/move_effect/retaliate.c +++ b/test/battle/move_effect/retaliate.c @@ -21,7 +21,7 @@ SINGLE_BATTLE_TEST("Retaliate doubles in base power the turn after an ally faint HP_BAR(opponent, captureDamage: &damage[0]); HP_BAR(opponent, captureDamage: &damage[1]); } THEN { - EXPECT_MUL_EQ(damage[1], Q_4_12(2), damage[0]); + EXPECT_MUL_EQ(damage[1], Q_4_12(2.0), damage[0]); } } @@ -40,7 +40,7 @@ SINGLE_BATTLE_TEST("Retaliate doubles in base power the turn after an ally faint HP_BAR(player, captureDamage: &damage[0]); HP_BAR(player, captureDamage: &damage[1]); } THEN { - EXPECT_MUL_EQ(damage[1], Q_4_12(2), damage[0]); + EXPECT_MUL_EQ(damage[1], Q_4_12(2.0), damage[0]); } } @@ -92,7 +92,7 @@ DOUBLE_BATTLE_TEST("Retaliate works with passive damage") HP_BAR(opponentRight, captureDamage: &damage[0]); HP_BAR(opponentRight, captureDamage: &damage[1]); } THEN { - EXPECT_MUL_EQ(damage[1], Q_4_12(2), damage[0]); + EXPECT_MUL_EQ(damage[1], Q_4_12(2.0), damage[0]); } } @@ -115,7 +115,7 @@ SINGLE_BATTLE_TEST("Retaliate works with Perish Song") HP_BAR(opponent, captureDamage: &damage[0]); HP_BAR(opponent, captureDamage: &damage[1]); } THEN { - EXPECT_MUL_EQ(damage[1], Q_4_12(2), damage[0]); + EXPECT_MUL_EQ(damage[1], Q_4_12(2.0), damage[0]); } } @@ -135,6 +135,6 @@ SINGLE_BATTLE_TEST("Retaliate works with self-inflicted fainting") HP_BAR(opponent, captureDamage: &damage[0]); HP_BAR(opponent, captureDamage: &damage[1]); } THEN { - EXPECT_MUL_EQ(damage[1], Q_4_12(2), damage[0]); + EXPECT_MUL_EQ(damage[1], Q_4_12(2.0), damage[0]); } } diff --git a/test/battle/move_effect/return.c b/test/battle/move_effect/return.c index 50945ca556d1..2727b1b46e09 100644 --- a/test/battle/move_effect/return.c +++ b/test/battle/move_effect/return.c @@ -1,4 +1,46 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Return (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_RETURN) == EFFECT_RETURN); +} + +SINGLE_BATTLE_TEST("Return's power increases the higher friendship of the user is", s16 damage) +{ + u32 friendship; + PARAMETRIZE { friendship = 0; } + PARAMETRIZE { friendship = 100; } + PARAMETRIZE { friendship = 200; } + PARAMETRIZE { friendship = 255; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Friendship(friendship); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_RETURN); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RETURN, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } THEN { + if (i > 0) + EXPECT_GT(results[i].damage, results[i-1].damage); + } +} + +TO_DO_BATTLE_TEST("Return does 0 damage at min Friendship (Gen2)") + +SINGLE_BATTLE_TEST("Return does 1 damage at min Friendship (Gen3+)") +{ + s16 damage; + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Friendship(0); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_RETURN); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RETURN, player); + HP_BAR(opponent, captureDamage: &damage); + } THEN { + EXPECT_EQ(damage, 1); + } +} diff --git a/test/battle/move_effect/revenge.c b/test/battle/move_effect/revenge.c index 980bca9e3353..1b5c79d00a90 100644 --- a/test/battle/move_effect/revenge.c +++ b/test/battle/move_effect/revenge.c @@ -1,4 +1,69 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Revenge (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_REVENGE) == EFFECT_REVENGE); +} + +SINGLE_BATTLE_TEST("Revenge doubles in power if False Swipe connected but didn't do any damage") +{ + s16 hits[3]; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_REVENGE); } + TURN { MOVE(opponent, MOVE_FALSE_SWIPE); MOVE(player, MOVE_REVENGE); } + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_REVENGE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVENGE, player); + HP_BAR(opponent, captureDamage: &hits[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FALSE_SWIPE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVENGE, player); + HP_BAR(opponent, captureDamage: &hits[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVENGE, player); + HP_BAR(opponent, captureDamage: &hits[2]); + } THEN { + EXPECT_MUL_EQ(hits[0], Q_4_12(2.0), hits[1]); + EXPECT_EQ(hits[0], hits[2]); + } +} + +DOUBLE_BATTLE_TEST("Revenge doesn't double in power if user was not hit by target in doubles") +{ + s16 hits[3]; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_REVENGE, target: playerRight); } + TURN { + MOVE(playerRight, MOVE_POUND, target: opponentRight); + MOVE(opponentLeft, MOVE_REVENGE, target: playerRight); + } + TURN { + MOVE(playerRight, MOVE_POUND, target: opponentLeft); + MOVE(opponentLeft, MOVE_REVENGE, target: playerRight); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVENGE, opponentLeft); + HP_BAR(playerRight, captureDamage: &hits[0]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVENGE, opponentLeft); + HP_BAR(playerRight, captureDamage: &hits[1]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVENGE, opponentLeft); + HP_BAR(playerRight, captureDamage: &hits[2]); + } THEN { + EXPECT_EQ(hits[0], hits[1]); + EXPECT_MUL_EQ(hits[1], Q_4_12(2.0), hits[2]); + } +} diff --git a/test/battle/move_effect/revival_blessing.c b/test/battle/move_effect/revival_blessing.c index f1a0ad74bc65..eeb90d202dc1 100644 --- a/test/battle/move_effect/revival_blessing.c +++ b/test/battle/move_effect/revival_blessing.c @@ -49,29 +49,36 @@ SINGLE_BATTLE_TEST("Revival Blessing fails if no party members are fainted") } } -DOUBLE_BATTLE_TEST("Revival Blessing cannot revive a partner's party member") +// Can only be tested through AI test, else test fails due to trying to force illegal action +AI_MULTI_BATTLE_TEST("Revival Blessing cannot revive a partner's party member") { - KNOWN_FAILING; struct BattlePokemon *user = NULL; - gBattleTypeFlags |= BATTLE_TYPE_TWO_OPPONENTS; - PARAMETRIZE { user = opponentLeft; } - PARAMETRIZE { user = opponentRight; } + u32 move1, move2, move3; + PARAMETRIZE { user = opponentLeft, move1 = MOVE_REVIVAL_BLESSING, move2 = MOVE_CELEBRATE, move3 = MOVE_CELEBRATE; } + PARAMETRIZE { user = playerRight, move1 = MOVE_CELEBRATE, move2 = MOVE_REVIVAL_BLESSING, move3 = MOVE_CELEBRATE; } + PARAMETRIZE { user = opponentRight, move1 = MOVE_CELEBRATE, move2 = MOVE_CELEBRATE, move3 = MOVE_REVIVAL_BLESSING; } GIVEN { - ASSUME((gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) != FALSE); - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WYNAUT); - OPPONENT(SPECIES_WYNAUT) { HP(0); } - OPPONENT(SPECIES_WYNAUT); + MULTI_PLAYER(SPECIES_CLEFABLE); + MULTI_PLAYER(SPECIES_CLEFABLE) { HP(0); } + MULTI_PLAYER(SPECIES_CLEFABLE); + MULTI_PARTNER(SPECIES_CLEFAIRY) { Moves(move2); } + MULTI_PARTNER(SPECIES_CLEFAIRY); + MULTI_PARTNER(SPECIES_CLEFAIRY); + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(move1); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET); + MULTI_OPPONENT_A(SPECIES_WOBBUFFET); + MULTI_OPPONENT_B(SPECIES_WYNAUT) { Moves(move3); } + MULTI_OPPONENT_B(SPECIES_WYNAUT) { HP(0); } + MULTI_OPPONENT_B(SPECIES_WYNAUT); } WHEN { - TURN { MOVE(user, MOVE_REVIVAL_BLESSING, partyIndex:4); } + TURN { EXPECT_MOVE(playerRight, move2); } // EXPECT_MOVE makes battler2 AI-controlled } SCENE { if (user == opponentLeft) { MESSAGE("The opposing Wobbuffet used Revival Blessing!"); MESSAGE("But it failed!"); + } else if (user == playerRight) { + MESSAGE("Clefairy used Revival Blessing!"); + MESSAGE("But it failed!"); } else { MESSAGE("The opposing Wynaut used Revival Blessing!"); MESSAGE("Wynaut was revived and is ready to fight again!"); diff --git a/test/battle/move_effect/roar.c b/test/battle/move_effect/roar.c index 5b1230f2531a..5c46e0cdf4c9 100644 --- a/test/battle/move_effect/roar.c +++ b/test/battle/move_effect/roar.c @@ -20,6 +20,8 @@ SINGLE_BATTLE_TEST("Roar switches the target with a random non-fainted replaceme } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_ROAR, player); MESSAGE("The opposing Bulbasaur was dragged out!"); + } THEN { + EXPECT_EQ(gLastUsedMove, MOVE_ROAR); } } diff --git a/test/battle/move_effect/role_play.c b/test/battle/move_effect/role_play.c index d2d937f7d121..ebd56bce2c1a 100644 --- a/test/battle/move_effect/role_play.c +++ b/test/battle/move_effect/role_play.c @@ -19,7 +19,7 @@ SINGLE_BATTLE_TEST("Role Play copies target's ability") } THEN { EXPECT_EQ(player->ability, ABILITY_BLAZE); EXPECT_EQ(opponent->ability, ABILITY_BLAZE); - } + } } DOUBLE_BATTLE_TEST("Role Play copies target's current ability even if it changed during that turn") @@ -50,7 +50,8 @@ DOUBLE_BATTLE_TEST("Role Play copies target's current ability even if it changed SINGLE_BATTLE_TEST("Role Play and Doodle fail if target's ability can't be copied'") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_SHEDINJA; ability = ABILITY_WONDER_GUARD; } PARAMETRIZE { species = SPECIES_CASTFORM; ability = ABILITY_FORECAST; } @@ -90,10 +91,12 @@ SINGLE_BATTLE_TEST("Role Play and Doodle fail if target's ability can't be copie SINGLE_BATTLE_TEST("Role Play fails if user's ability can't be suppressed") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } - PARAMETRIZE { species = SPECIES_DARMANITAN; ability = ABILITY_ZEN_MODE; } + if (B_UPDATED_ABILITY_DATA >= GEN_7) + PARAMETRIZE { species = SPECIES_DARMANITAN; ability = ABILITY_ZEN_MODE; } PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; } PARAMETRIZE { species = SPECIES_MINIOR; ability = ABILITY_SHIELDS_DOWN; } PARAMETRIZE { species = SPECIES_WISHIWASHI; ability = ABILITY_SCHOOLING; } diff --git a/test/battle/move_effect/roost.c b/test/battle/move_effect/roost.c index 51d9499bd19c..8748508c9b2e 100644 --- a/test/battle/move_effect/roost.c +++ b/test/battle/move_effect/roost.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(GetMoveEffect(MOVE_ROOST) == EFFECT_ROOST); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_FLYING); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_FLYING); // One attack of each type to verify typelessness ASSUME(GetMoveType(MOVE_POUND) == TYPE_NORMAL); ASSUME(GetMoveType(MOVE_KARATE_CHOP) == TYPE_FIGHTING); @@ -85,8 +85,8 @@ SINGLE_BATTLE_TEST("Roost recovers 50% of the user's Max HP") SINGLE_BATTLE_TEST("Roost suppresses the user's Flying-typing this turn, then restores it at the end of the turn") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SKARMORY].types[0] == TYPE_STEEL); - ASSUME(gSpeciesInfo[SPECIES_SKARMORY].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_SKARMORY, 0) == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_SKARMORY, 1) == TYPE_FLYING); PLAYER(SPECIES_SKARMORY) { HP(50); MaxHP(100); Ability(ABILITY_STURDY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -131,8 +131,8 @@ SINGLE_BATTLE_TEST("Roost, if used by a Flying/Flying type, treats the user as a PARAMETRIZE { damagingMove = MOVE_DISARMING_VOICE; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_TORNADUS].types[0] == TYPE_FLYING); - ASSUME(gSpeciesInfo[SPECIES_TORNADUS].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_TORNADUS, 0) == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_TORNADUS, 1) == TYPE_FLYING); PLAYER(SPECIES_TORNADUS) { HP(50); MaxHP(100); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -199,8 +199,8 @@ SINGLE_BATTLE_TEST("Roost, if used by a Mystery/Flying type, treats the user as PARAMETRIZE { damagingMove = MOVE_DISARMING_VOICE; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_MOLTRES].types[0] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_MOLTRES].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_MOLTRES, 0) == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_MOLTRES, 1) == TYPE_FLYING); PLAYER(SPECIES_MOLTRES) { HP(300); MaxHP(400); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -228,8 +228,8 @@ SINGLE_BATTLE_TEST("Roost, if used by a Mystery/Flying type, treats the user as DOUBLE_BATTLE_TEST("Roost suppresses the user's not-yet-aquired Flying-type this turn") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_KECLEON].types[0] != TYPE_FLYING); - ASSUME(gSpeciesInfo[SPECIES_KECLEON].types[1] != TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_KECLEON, 0) != TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_KECLEON, 1) != TYPE_FLYING); PLAYER(SPECIES_KECLEON) { Speed(40); HP(150); Ability(ABILITY_COLOR_CHANGE); } PLAYER(SPECIES_WOBBUFFET) { Speed(10); } OPPONENT(SPECIES_PIDGEY) { Speed(30); } @@ -255,7 +255,7 @@ DOUBLE_BATTLE_TEST("Roost suppresses the user's not-yet-aquired Flying-type this SINGLE_BATTLE_TEST("Roost prevents a Flying-type user from being protected by Delta Stream") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_RAYQUAZA].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_RAYQUAZA, 1) == TYPE_FLYING); PLAYER(SPECIES_RAYQUAZA) { HP(1); Ability(ABILITY_DELTA_STREAM); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -272,8 +272,8 @@ SINGLE_BATTLE_TEST("Roost prevents a Flying-type user from being protected by De SINGLE_BATTLE_TEST("Roost does not undo other type-changing effects at the end of the turn") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SWELLOW].types[0] == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_SWELLOW].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_SWELLOW, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_SWELLOW, 1) == TYPE_FLYING); PLAYER(SPECIES_SWELLOW) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -296,8 +296,8 @@ SINGLE_BATTLE_TEST("Roost does not undo other type-changing effects at the end o SINGLE_BATTLE_TEST("Roost's effect is lifted after Grassy Terrain's healing") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SWELLOW].types[0] == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_SWELLOW].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_SWELLOW, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_SWELLOW, 1) == TYPE_FLYING); PLAYER(SPECIES_SWELLOW) { HP(1); Ability(ABILITY_GRASSY_SURGE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -315,10 +315,10 @@ SINGLE_BATTLE_TEST("Roost's effect is lifted after Grassy Terrain's healing") SINGLE_BATTLE_TEST("Roost's suppression prevents Reflect Type from copying any Flying typing") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SWELLOW].types[0] == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_SWELLOW].types[1] == TYPE_FLYING); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_SWELLOW, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_SWELLOW, 1) == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) == TYPE_PSYCHIC); PLAYER(SPECIES_SWELLOW) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/rototiller.c b/test/battle/move_effect/rototiller.c index 34b62a26660b..b86228a3f1aa 100644 --- a/test/battle/move_effect/rototiller.c +++ b/test/battle/move_effect/rototiller.c @@ -9,8 +9,8 @@ ASSUMPTIONS DOUBLE_BATTLE_TEST("Rototiller boosts Attack and Special Attack of all Grass types on the field") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_SNIVY].types[0] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_SNIVY, 0) == TYPE_GRASS); PLAYER(SPECIES_TANGELA); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SNIVY); @@ -38,8 +38,8 @@ DOUBLE_BATTLE_TEST("Rototiller boosts Attack and Special Attack of all Grass typ SINGLE_BATTLE_TEST("Rototiller fails if there are no valid targets") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_GRASS); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -51,10 +51,10 @@ SINGLE_BATTLE_TEST("Rototiller fails if there are no valid targets") } } -SINGLE_BATTLE_TEST("Rototiller doesn't affect pokemon that are semi-invulnerable") +SINGLE_BATTLE_TEST("Rototiller doesn't affect PokΓ©mon that are semi-invulnerable") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS); ASSUME(GetMoveEffect(MOVE_DIG) == EFFECT_SEMI_INVULNERABLE); PLAYER(SPECIES_TANGELA); OPPONENT(SPECIES_TANGELA); @@ -76,9 +76,9 @@ SINGLE_BATTLE_TEST("Rototiller doesn't affect pokemon that are semi-invulnerable SINGLE_BATTLE_TEST("Rototiller fails if the only valid target is semi-invulnerable") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_GRASS); ASSUME(GetMoveEffect(MOVE_DIG) == EFFECT_SEMI_INVULNERABLE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_TANGELA); @@ -96,3 +96,19 @@ SINGLE_BATTLE_TEST("Rototiller fails if the only valid target is semi-invulnerab EXPECT_EQ(opponent->statStages[STAT_SPATK], DEFAULT_STAT_STAGE); } } + +AI_DOUBLE_BATTLE_TEST("AI uses Rototiller") +{ + GIVEN { + ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_GRASS); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + OPPONENT(SPECIES_TANGELA) { Moves(MOVE_ROTOTILLER, MOVE_POUND); } + OPPONENT(SPECIES_TANGELA); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_ROTOTILLER); } + } +} diff --git a/test/battle/move_effect/round.c b/test/battle/move_effect/round.c index 0bac324b0fee..985822d46d84 100644 --- a/test/battle/move_effect/round.c +++ b/test/battle/move_effect/round.c @@ -94,7 +94,7 @@ DOUBLE_BATTLE_TEST("Round still preserves the turn order outside of the other Ro } } -DOUBLE_BATTLE_TEST("Round causes opposing pokemon to use Round immediately") +DOUBLE_BATTLE_TEST("Round causes opposing PokΓ©mon to use Round immediately") { GIVEN { ASSUME(gItemsInfo[ITEM_LAGGING_TAIL].holdEffect == HOLD_EFFECT_LAGGING_TAIL); diff --git a/test/battle/move_effect/semi_invulnerable.c b/test/battle/move_effect/semi_invulnerable.c index 331413121c14..66086ca458cc 100644 --- a/test/battle/move_effect/semi_invulnerable.c +++ b/test/battle/move_effect/semi_invulnerable.c @@ -4,17 +4,17 @@ ASSUMPTIONS { ASSUME(GetMoveEffect(MOVE_FLY) == EFFECT_SEMI_INVULNERABLE); - ASSUME(GetMoveTwoTurnAttackStatus(MOVE_FLY) == STATUS3_ON_AIR); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_FLY) == STATE_ON_AIR); ASSUME(GetMoveEffect(MOVE_DIG) == EFFECT_SEMI_INVULNERABLE); - ASSUME(GetMoveTwoTurnAttackStatus(MOVE_DIG) == STATUS3_UNDERGROUND); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_DIG) == STATE_UNDERGROUND); ASSUME(GetMoveEffect(MOVE_BOUNCE) == EFFECT_SEMI_INVULNERABLE); - ASSUME(GetMoveTwoTurnAttackStatus(MOVE_BOUNCE) == STATUS3_ON_AIR); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_BOUNCE) == STATE_ON_AIR); ASSUME(GetMoveEffect(MOVE_DIVE) == EFFECT_SEMI_INVULNERABLE); - ASSUME(GetMoveTwoTurnAttackStatus(MOVE_DIVE) == STATUS3_UNDERWATER); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_DIVE) == STATE_UNDERWATER); ASSUME(GetMoveEffect(MOVE_PHANTOM_FORCE) == EFFECT_SEMI_INVULNERABLE); - ASSUME(GetMoveTwoTurnAttackStatus(MOVE_PHANTOM_FORCE) == STATUS3_PHANTOM_FORCE); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_PHANTOM_FORCE) == STATE_PHANTOM_FORCE); ASSUME(GetMoveEffect(MOVE_SHADOW_FORCE) == EFFECT_SEMI_INVULNERABLE); - ASSUME(GetMoveTwoTurnAttackStatus(MOVE_SHADOW_FORCE) == STATUS3_PHANTOM_FORCE); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_SHADOW_FORCE) == STATE_PHANTOM_FORCE); } SINGLE_BATTLE_TEST("Semi-invulnerable moves make the user semi-invulnerable turn 1, then strike turn 2") diff --git a/test/battle/move_effect/shed_tail.c b/test/battle/move_effect/shed_tail.c index 4ce05c3f8cc2..ba284f0c0dd3 100644 --- a/test/battle/move_effect/shed_tail.c +++ b/test/battle/move_effect/shed_tail.c @@ -57,7 +57,7 @@ SINGLE_BATTLE_TEST("Shed Tail's HP cost can trigger a berry before the user swit } } -SINGLE_BATTLE_TEST("Shed Tail fails if there are no usable pokemon left") +SINGLE_BATTLE_TEST("Shed Tail fails if there are no usable PokΓ©mon left") { GIVEN { PLAYER(SPECIES_WOBBUFFET) @@ -110,8 +110,8 @@ SINGLE_BATTLE_TEST("Shed Tail creates a Substitute with 1/4 of user maximum heal PARAMETRIZE { hp = 164; } GIVEN { - ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); - ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); PLAYER(SPECIES_BULBASAUR) { MaxHP(hp); } PLAYER(SPECIES_BULBASAUR); OPPONENT(SPECIES_CHARMANDER); diff --git a/test/battle/move_effect/sheer_cold.c b/test/battle/move_effect/sheer_cold.c new file mode 100644 index 000000000000..c0b076f448aa --- /dev/null +++ b/test/battle/move_effect/sheer_cold.c @@ -0,0 +1,86 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_SHEER_COLD) == EFFECT_SHEER_COLD); +} + +SINGLE_BATTLE_TEST("Sheer Cold doesn't affect Ice-type PokΓ©mon (Gen3-6)") +{ + GIVEN { + WITH_CONFIG(CONFIG_SHEER_COLD_IMMUNITY, GEN_6); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_GLALIE); + } WHEN { + TURN { MOVE(player, MOVE_SHEER_COLD); } + } SCENE { + NOT MESSAGE("It doesn't affect the opposing Glalie…"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, player); + HP_BAR(opponent, hp: 0); + } +} + +SINGLE_BATTLE_TEST("Sheer Cold doesn't affect Ice-type PokΓ©mon (Gen7+)") +{ + GIVEN { + WITH_CONFIG(CONFIG_SHEER_COLD_IMMUNITY, GEN_7); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_GLALIE); + } WHEN { + TURN { MOVE(player, MOVE_SHEER_COLD); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, player); + MESSAGE("It doesn't affect the opposing Glalie…"); + } +} + +SINGLE_BATTLE_TEST("Sheer Cold can hit semi-invulnerable mons when the user has No-Guard") +{ + GIVEN { + ASSUME(GetItemHoldEffect(ITEM_FOCUS_SASH) == HOLD_EFFECT_FOCUS_SASH); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_NO_GUARD); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_FLY); } + TURN { MOVE(player, MOVE_SHEER_COLD); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, player); + HP_BAR(opponent, hp: 0); + } +} + +SINGLE_BATTLE_TEST("Sheer Cold can be endured by Focus Sash") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); } + } WHEN { + TURN { MOVE(player, MOVE_SHEER_COLD); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, player); + HP_BAR(opponent, hp: 1); + MESSAGE("The opposing Wobbuffet hung on using its Focus Sash!"); + } +} + +SINGLE_BATTLE_TEST("Sheer Cold can be endured by Sturdy") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_GEODUDE) { Ability(ABILITY_STURDY); } + } WHEN { + TURN { MOVE(player, MOVE_SHEER_COLD); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, player); + ABILITY_POPUP(opponent, ABILITY_STURDY); + } +} + +TO_DO_BATTLE_TEST("Sheer Cold faints the target, skipping regular damage calculations") +TO_DO_BATTLE_TEST("Sheer Cold always fails if the target has a higher level than the user") +TO_DO_BATTLE_TEST("Sheer Cold's accuracy increases by 1% for every level the user has over the target") +TO_DO_BATTLE_TEST("Sheer Cold's accuracy decreasaes by 10% if the user is not Ice type") +TO_DO_BATTLE_TEST("Sheer Cold's ignores non-stage accuracy modifiers") // Gravity, Wide Lens, Compound Eyes diff --git a/test/battle/move_effect/shell_trap.c b/test/battle/move_effect/shell_trap.c index 435c79a65202..f3f0068d6f6d 100644 --- a/test/battle/move_effect/shell_trap.c +++ b/test/battle/move_effect/shell_trap.c @@ -198,3 +198,84 @@ DOUBLE_BATTLE_TEST("Shell Trap targets correctly if one of the opponents has fai ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); } } + +SINGLE_BATTLE_TEST("Shell Trap activates if user is hit with a physical move but does no damage") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_FALSE_SWIPE) == EFFECT_FALSE_SWIPE); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SHELL_TRAP); MOVE(opponent, MOVE_FALSE_SWIPE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SHELL_TRAP_SETUP, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FALSE_SWIPE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHELL_TRAP, player); + HP_BAR(opponent); + } +} + +SINGLE_BATTLE_TEST("Encore fails if target has active Shell Trap waiting") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_SHELL_TRAP); MOVE(opponent, MOVE_ENCORE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + MESSAGE("Wobbuffet set a shell trap!"); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENCORE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHELL_TRAP, player); + } + } +} + +SINGLE_BATTLE_TEST("Shell Trap fails if an other -3 or lower priority Move is used") +{ + GIVEN { + ASSUME(GetMovePriority(MOVE_DRAGON_TAIL) <= -3); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(player, MOVE_SHELL_TRAP); + MOVE(opponent, MOVE_DRAGON_TAIL); + } + } SCENE { + MESSAGE("Wobbuffet set a shell trap!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_TAIL, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SHELL_TRAP, player); + } +} + +DOUBLE_BATTLE_TEST("Shell Trap does not trigger when hit into Substitute") +{ + GIVEN { + ASSUME(GetMoveCategory(MOVE_DOUBLE_EDGE) == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_SNORLAX); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SUBSTITUTE); } + TURN { + MOVE(playerLeft, MOVE_SHELL_TRAP); + MOVE(opponentLeft, MOVE_DOUBLE_EDGE, target: playerLeft); + MOVE(opponentRight, MOVE_SCRATCH, target: playerLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBSTITUTE, playerLeft); + MESSAGE("Wynaut set a shell trap!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_EDGE, opponentLeft); + MESSAGE("Wynaut's substitute faded!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SHELL_TRAP, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHELL_TRAP, playerLeft); + } +} diff --git a/test/battle/move_effect/shift_gear.c b/test/battle/move_effect/shift_gear.c index 990e815cb3f0..a480eaa9493a 100644 --- a/test/battle/move_effect/shift_gear.c +++ b/test/battle/move_effect/shift_gear.c @@ -1,4 +1,23 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Shift Gear (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_SHIFT_GEAR) == EFFECT_SHIFT_GEAR); +} + +SINGLE_BATTLE_TEST("Shift Gear increases the user's Speed by 2 stages and Attack by 1 stage") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SHIFT_GEAR); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHIFT_GEAR, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 2); + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + } +} diff --git a/test/battle/move_effect/simple_beam.c b/test/battle/move_effect/simple_beam.c deleted file mode 100644 index 4250c8ce45d6..000000000000 --- a/test/battle/move_effect/simple_beam.c +++ /dev/null @@ -1,74 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(GetMoveEffect(MOVE_SIMPLE_BEAM) == EFFECT_SIMPLE_BEAM); -} - -SINGLE_BATTLE_TEST("Simple Beam replaces target's ability with Simple") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } - OPPONENT(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } - }WHEN { - TURN { MOVE(player, MOVE_SIMPLE_BEAM); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, player); - ABILITY_POPUP(opponent, ABILITY_BLAZE); - } THEN { - EXPECT_EQ(opponent->ability, ABILITY_SIMPLE); - } -} - -DOUBLE_BATTLE_TEST("Simple Beam fails if the target already has Simple") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } - PLAYER(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } - OPPONENT(SPECIES_BULBASAUR) { Ability(ABILITY_OVERGROW); } - OPPONENT(SPECIES_SQUIRTLE) { Ability(ABILITY_TORRENT); } - } WHEN { - TURN { MOVE(playerLeft, MOVE_SIMPLE_BEAM, target: opponentLeft); MOVE(playerRight, MOVE_SIMPLE_BEAM, target: opponentLeft); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, playerLeft); - ABILITY_POPUP(opponentLeft, ABILITY_OVERGROW); - NONE_OF { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, playerRight); - ABILITY_POPUP(opponentLeft, ABILITY_SIMPLE); - } - } THEN { - EXPECT_EQ(opponentLeft->ability, ABILITY_SIMPLE); - } -} - -SINGLE_BATTLE_TEST("Simple Beam fails if target has an ability that can't be overwritten") -{ - u32 species, ability; - - PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } - PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; } - PARAMETRIZE { species = SPECIES_MINIOR; ability = ABILITY_SHIELDS_DOWN; } - PARAMETRIZE { species = SPECIES_WISHIWASHI; ability = ABILITY_SCHOOLING; } - PARAMETRIZE { species = SPECIES_MIMIKYU; ability = ABILITY_DISGUISE; } - PARAMETRIZE { species = SPECIES_GRENINJA_BATTLE_BOND; ability = ABILITY_BATTLE_BOND; } - PARAMETRIZE { species = SPECIES_ZYGARDE; ability = ABILITY_POWER_CONSTRUCT; } - PARAMETRIZE { species = SPECIES_KOMALA; ability = ABILITY_COMATOSE; } - PARAMETRIZE { species = SPECIES_SILVALLY; ability = ABILITY_RKS_SYSTEM; } - PARAMETRIZE { species = SPECIES_CRAMORANT; ability = ABILITY_GULP_MISSILE; } - PARAMETRIZE { species = SPECIES_EISCUE; ability = ABILITY_ICE_FACE; } - PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; } - PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; } - PARAMETRIZE { species = SPECIES_PALAFIN_ZERO; ability = ABILITY_ZERO_TO_HERO; } - PARAMETRIZE { species = SPECIES_TATSUGIRI; ability = ABILITY_COMMANDER; } - - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } - OPPONENT(species) { Ability(ability); } - } WHEN { - TURN { MOVE(player, MOVE_SIMPLE_BEAM); } - } SCENE { - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, player); - MESSAGE("But it failed!"); - } -} diff --git a/test/battle/move_effect/sketch.c b/test/battle/move_effect/sketch.c new file mode 100644 index 000000000000..e78aaa93af96 --- /dev/null +++ b/test/battle/move_effect/sketch.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Sketch (Move Effect) test titles") diff --git a/test/battle/move_effect/skill_swap.c b/test/battle/move_effect/skill_swap.c index c3c2ca91f4f0..59b023f5faad 100644 --- a/test/battle/move_effect/skill_swap.c +++ b/test/battle/move_effect/skill_swap.c @@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Skill Swap swaps user and target's abilities") } THEN { EXPECT_EQ(player->ability, ABILITY_BLAZE); EXPECT_EQ(opponent->ability, ABILITY_TELEPATHY); - } + } } DOUBLE_BATTLE_TEST("Skill Swap only swaps user's ability with target's ability") @@ -67,7 +67,8 @@ DOUBLE_BATTLE_TEST("Skill Swap doesn't display ability popups when swapping with SINGLE_BATTLE_TEST("Skill Swap fails if user or target has an ability that can't be swapped") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_SHEDINJA; ability = ABILITY_WONDER_GUARD; } PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } diff --git a/test/battle/move_effect/sky_drop.c b/test/battle/move_effect/sky_drop.c index c2a1e104e1d1..b3bc6739af5e 100644 --- a/test/battle/move_effect/sky_drop.c +++ b/test/battle/move_effect/sky_drop.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Sky Drop does no damage to Flying type PokΓ©mon") { GIVEN { ASSUME(gSpeciesInfo[SPECIES_PIDGEY].weight < 2000); - ASSUME(gSpeciesInfo[SPECIES_PIDGEY].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_PIDGEY, 1) == TYPE_FLYING); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIDGEY); } WHEN { @@ -122,3 +122,16 @@ SINGLE_BATTLE_TEST("Sky Drop stops the confusion count until the target is dropp ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_CONFUSION, player); } } + +SINGLE_BATTLE_TEST("Sky Drop fails if the targe is in a semi-invulnerable state") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_FLY); MOVE(player, MOVE_SKY_DROP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLY, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SKY_DROP, player); + } +} diff --git a/test/battle/move_effect/sleep_talk.c b/test/battle/move_effect/sleep_talk.c index 1f53530c46e2..6980954714bd 100644 --- a/test/battle/move_effect/sleep_talk.c +++ b/test/battle/move_effect/sleep_talk.c @@ -113,6 +113,7 @@ DOUBLE_BATTLE_TEST("Sleep Talk calls move and that move may be redirected by Lig { PASSES_RANDOMLY(1, 2, RNG_RANDOM_TARGET); GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); ASSUME(GetMoveType(MOVE_SPARK) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); Moves(MOVE_SLEEP_TALK, MOVE_SPARK, MOVE_FLY, MOVE_DIG); } PLAYER(SPECIES_WOBBUFFET); @@ -132,6 +133,7 @@ DOUBLE_BATTLE_TEST("Sleep Talk calls move and that move may be redirected by Sto { PASSES_RANDOMLY(1, 2, RNG_RANDOM_TARGET); GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); Moves(MOVE_SLEEP_TALK, MOVE_WATER_GUN, MOVE_FLY, MOVE_DIG); } PLAYER(SPECIES_WOBBUFFET); @@ -146,3 +148,42 @@ DOUBLE_BATTLE_TEST("Sleep Talk calls move and that move may be redirected by Sto ABILITY_POPUP(opponentRight, ABILITY_STORM_DRAIN); } } + +SINGLE_BATTLE_TEST("Sleep Talk calls move and that move correctly ignores ability if it should") +{ + u32 species; + enum Ability ability; + + PARAMETRIZE { species = SPECIES_KINGLER; ability = ABILITY_SHELL_ARMOR; } + PARAMETRIZE { species = SPECIES_ARMALDO; ability = ABILITY_BATTLE_ARMOR; } + + GIVEN { + ASSUME(MoveIgnoresTargetAbility(MOVE_SUNSTEEL_STRIKE)); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); Moves(MOVE_SLEEP_TALK, MOVE_SUNSTEEL_STRIKE); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_SLEEP_TALK, criticalHit: TRUE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SLEEP_TALK, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNSTEEL_STRIKE, player); + MESSAGE("A critical hit!"); + } +} + +SINGLE_BATTLE_TEST("Sleep Talk deducts power points from itself, not the called move") +{ + ASSUME(GetMovePP(MOVE_SLEEP_TALK) == 10); + ASSUME(GetMovePP(MOVE_POUND) == 35); + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); Moves(MOVE_SLEEP_TALK, MOVE_POUND); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SLEEP_TALK); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SLEEP_TALK, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, player); + } THEN { + EXPECT_EQ(player->pp[0], 9); + EXPECT_EQ(player->pp[1], 35); + } +} diff --git a/test/battle/move_effect/snatch.c b/test/battle/move_effect/snatch.c index f8e289183754..42fb79b2a0b6 100644 --- a/test/battle/move_effect/snatch.c +++ b/test/battle/move_effect/snatch.c @@ -1,4 +1,64 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Snatch (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_SNATCH) == EFFECT_SNATCH); + ASSUME(MoveCanBeSnatched(MOVE_SWORDS_DANCE)); +} + +SINGLE_BATTLE_TEST("Snatch steals stat-boosting moves from the opponent") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(10); } + OPPONENT(SPECIES_WYNAUT) { Speed(5); } + } WHEN { + TURN { MOVE(player, MOVE_SNATCH); MOVE(opponent, MOVE_SWORDS_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SNATCH, player); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + } +} + +SINGLE_BATTLE_TEST("Snatch fails if user moves last") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_SNATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SNATCH, player); + } +} + +DOUBLE_BATTLE_TEST("Snatch fails when the only slower battler is a fainted ally") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } + PLAYER(SPECIES_WYNAUT) { HP(1); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(20); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerRight); } + TURN { + MOVE(opponentLeft, MOVE_CELEBRATE); + MOVE(opponentRight, MOVE_CELEBRATE); + MOVE(playerLeft, MOVE_SNATCH); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + MESSAGE("Wynaut fainted!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SNATCH, playerLeft); + } +} + +TO_DO_BATTLE_TEST("Snatch does not steal moves that cannot be snatched"); +TO_DO_BATTLE_TEST("Snatch can steal healing moves"); diff --git a/test/battle/move_effect/soak.c b/test/battle/move_effect/soak.c index 156e1f9558e7..307b4802db34 100644 --- a/test/battle/move_effect/soak.c +++ b/test/battle/move_effect/soak.c @@ -1,4 +1,45 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Soak (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_SOAK) == EFFECT_SOAK); + ASSUME(GetMoveEffect(MOVE_MAGIC_POWDER) == EFFECT_SOAK); +} + +TO_DO_BATTLE_TEST("Soak/Magic Powder changes the target's type to pure Water/Psychic"); + +SINGLE_BATTLE_TEST("Soak/Magic Powder's type change is overwitten if the target changes form") +{ + u32 move; + PARAMETRIZE { move = MOVE_SOAK; } + PARAMETRIZE { move = MOVE_MAGIC_POWDER; } + GIVEN { + ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL); + PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, move); } + TURN { MOVE(opponent, MOVE_SCRATCH); } + TURN { MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + // Turn 1 + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + switch (move) { + case MOVE_SOAK: MESSAGE("Mimikyu transformed into the Water type!"); break; + case MOVE_MAGIC_POWDER: MESSAGE("Mimikyu transformed into the Psychic type!"); break; + } + // Turn 2 + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + NOT MESSAGE("It doesn't affect Mimikyu…"); + ABILITY_POPUP(player, ABILITY_DISGUISE); + // Turn 3 + MESSAGE("It doesn't affect Mimikyu…"); + } +} + +TO_DO_BATTLE_TEST("Soak/Magic Powder's type change overritten if the target transforms"); +TO_DO_BATTLE_TEST("(TERA) Soak/Magic Powder's type change overritten if the target Terastalizes"); +TO_DO_BATTLE_TEST("Soak/Magic Powder fails if the target is behind a Substitute"); +TO_DO_BATTLE_TEST("Soak/Magic Powder fails if the target is already Water/Psychic"); +TO_DO_BATTLE_TEST("Soak/Magic Powder fails if the target has Multitype or RKS System"); diff --git a/test/battle/move_effect/solar_beam.c b/test/battle/move_effect/solar_beam.c index 309d950c5096..6113b5c4acd3 100644 --- a/test/battle/move_effect/solar_beam.c +++ b/test/battle/move_effect/solar_beam.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Solar Beam does not need a charging turn if Sun is up") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_DROUGHT; } PARAMETRIZE { ability = ABILITY_WHITE_SMOKE; } diff --git a/test/battle/move_effect/special_attack_down_2.c b/test/battle/move_effect/special_attack_down_2.c index b62d4b52ac70..7ea5204431b0 100644 --- a/test/battle/move_effect/special_attack_down_2.c +++ b/test/battle/move_effect/special_attack_down_2.c @@ -1,4 +1,22 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Eerie Impulse (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_EERIE_IMPULSE) == EFFECT_SPECIAL_ATTACK_DOWN_2); +} + +SINGLE_BATTLE_TEST("Eerie Impulse reduces the target's Sp. Attack by 2 stages") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_EERIE_IMPULSE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EERIE_IMPULSE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_SPATK], DEFAULT_STAT_STAGE - 2); + } +} diff --git a/test/battle/move_effect/special_attack_up_2.c b/test/battle/move_effect/special_attack_up_2.c index c4bf38d6aa77..c87b3fea0bba 100644 --- a/test/battle/move_effect/special_attack_up_2.c +++ b/test/battle/move_effect/special_attack_up_2.c @@ -1,4 +1,22 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Nasty Plot (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_NASTY_PLOT) == EFFECT_SPECIAL_ATTACK_UP_2); +} + +SINGLE_BATTLE_TEST("Nasty Plot increases the user's Sp. Attack by 2 stages") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_NASTY_PLOT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_NASTY_PLOT, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 2); + } +} diff --git a/test/battle/move_effect/special_defense_down_2.c b/test/battle/move_effect/special_defense_down_2.c index 5fff5bdd7b7e..4740d3e5e2fa 100644 --- a/test/battle/move_effect/special_defense_down_2.c +++ b/test/battle/move_effect/special_defense_down_2.c @@ -1,4 +1,22 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Fake Tears/Metal Sound (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_FAKE_TEARS) == EFFECT_SPECIAL_DEFENSE_DOWN_2); +} + +SINGLE_BATTLE_TEST("Fake Tears reduces the target's Sp. Defense by 2 stages") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_FAKE_TEARS); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FAKE_TEARS, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE - 2); + } +} diff --git a/test/battle/move_effect/special_defense_up_2.c b/test/battle/move_effect/special_defense_up_2.c index 168566345232..9da91d8d076e 100644 --- a/test/battle/move_effect/special_defense_up_2.c +++ b/test/battle/move_effect/special_defense_up_2.c @@ -1,4 +1,22 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Amnesia (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_AMNESIA) == EFFECT_SPECIAL_DEFENSE_UP_2); +} + +SINGLE_BATTLE_TEST("Amnesia increases the user's Sp. Defense by 2 stages") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_AMNESIA); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_AMNESIA, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE + 2); + } +} diff --git a/test/battle/move_effect/speed_down.c b/test/battle/move_effect/speed_down.c index a3b5e26be889..88d62f2f387a 100644 --- a/test/battle/move_effect/speed_down.c +++ b/test/battle/move_effect/speed_down.c @@ -3,13 +3,14 @@ DOUBLE_BATTLE_TEST("Speed Down: Cotton Spore does not fail if it is blocked by one target") { - u32 abilityOne, abilityTwo; + enum Ability abilityOne, abilityTwo; PARAMETRIZE { abilityOne = ABILITY_OVERCOAT; abilityTwo = ABILITY_SKILL_LINK; } PARAMETRIZE { abilityOne = ABILITY_SKILL_LINK; abilityTwo = ABILITY_OVERCOAT; } GIVEN { ASSUME(GetMoveEffect(MOVE_COTTON_SPORE) == EFFECT_SPEED_DOWN_2); + ASSUME(GetMoveTarget(MOVE_COTTON_SPORE) == MOVE_TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SHELLDER) { Ability(abilityOne); } diff --git a/test/battle/move_effect/speed_down_2.c b/test/battle/move_effect/speed_down_2.c index e3b95e3fe9d0..2b350b625270 100644 --- a/test/battle/move_effect/speed_down_2.c +++ b/test/battle/move_effect/speed_down_2.c @@ -1,4 +1,22 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Scary Face/Cotton Spore (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_SCARY_FACE) == EFFECT_SPEED_DOWN_2); +} + +SINGLE_BATTLE_TEST("Scary Face reduces the target's Speed by 2 stages") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SCARY_FACE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCARY_FACE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 2); + } +} diff --git a/test/battle/move_effect/speed_swap.c b/test/battle/move_effect/speed_swap.c index b5f9aaebaf13..3405d510ca81 100644 --- a/test/battle/move_effect/speed_swap.c +++ b/test/battle/move_effect/speed_swap.c @@ -24,12 +24,13 @@ SINGLE_BATTLE_TEST("Speed Swap swaps user and target's speed stats") } THEN { EXPECT_EQ(player->speed, 10); EXPECT_EQ(opponent->speed, 6); - } + } } SINGLE_BATTLE_TEST("Speed Swap doesn't swap user and target's speed modifiers") { - u32 species, ability, move; + u32 species, move; + enum Ability ability; PARAMETRIZE { species = SPECIES_WOBBUFFET; ability = ABILITY_TELEPATHY; move = MOVE_ROCK_POLISH; } // x2.0 PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_SWIFT_SWIM; move = MOVE_RAIN_DANCE; } // x2.0 GIVEN { @@ -54,5 +55,5 @@ SINGLE_BATTLE_TEST("Speed Swap doesn't swap user and target's speed modifiers") EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); EXPECT_EQ(opponent->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 2); } - } + } } diff --git a/test/battle/move_effect/speed_up_2.c b/test/battle/move_effect/speed_up_2.c index 720255549849..bba7fb88b1de 100644 --- a/test/battle/move_effect/speed_up_2.c +++ b/test/battle/move_effect/speed_up_2.c @@ -1,4 +1,22 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Agility/Rock Polish (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_AGILITY) == EFFECT_SPEED_UP_2); +} + +SINGLE_BATTLE_TEST("Agility increases the user's Speed by 2 stages") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_AGILITY); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_AGILITY, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 2); + } +} diff --git a/test/battle/move_effect/spicy_extract.c b/test/battle/move_effect/spicy_extract.c index 7cf9eacb3212..6dc2a7742769 100644 --- a/test/battle/move_effect/spicy_extract.c +++ b/test/battle/move_effect/spicy_extract.c @@ -27,7 +27,7 @@ SINGLE_BATTLE_TEST("Spicy Extract raises target's Attack by 2 stages and lowers SINGLE_BATTLE_TEST("Spicy Extract is prevented by target's ability if it's Attack stat is maxed out") { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CLEAR_BODY; } PARAMETRIZE { ability = ABILITY_LIGHT_METAL; } @@ -189,7 +189,7 @@ AI_DOUBLE_BATTLE_TEST("Spicy Extract user will use it if partner holds Clear Amu AI_DOUBLE_BATTLE_TEST("Spicy Extract user will not choose the move if it does not benefit partner") { u32 species; - u32 ability; + enum Ability ability; PARAMETRIZE { species = SPECIES_GHOLDENGO; ability = ABILITY_GOOD_AS_GOLD; } PARAMETRIZE { species = SPECIES_SNIVY; ability = ABILITY_CONTRARY; } diff --git a/test/battle/move_effect/spikes.c b/test/battle/move_effect/spikes.c index 187b9ce7acf3..4b458f5c68e6 100644 --- a/test/battle/move_effect/spikes.c +++ b/test/battle/move_effect/spikes.c @@ -94,13 +94,13 @@ SINGLE_BATTLE_TEST("Spikes do not damage airborne Pokemon") u32 move2 = MOVE_CELEBRATE; bool32 airborne; - ASSUME(gSpeciesInfo[SPECIES_PIDGEY].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_PIDGEY, 1) == TYPE_FLYING); PARAMETRIZE { species = SPECIES_PIDGEY; airborne = TRUE; } PARAMETRIZE { species = SPECIES_PIDGEY; item = ITEM_IRON_BALL; airborne = FALSE; } PARAMETRIZE { species = SPECIES_PIDGEY; move1 = MOVE_GRAVITY; airborne = FALSE; } PARAMETRIZE { species = SPECIES_PIDGEY; move1 = MOVE_INGRAIN; airborne = FALSE; } - ASSUME(gSpeciesInfo[SPECIES_UNOWN].abilities[0] == ABILITY_LEVITATE); + ASSUME(GetSpeciesAbility(SPECIES_UNOWN, 0) == ABILITY_LEVITATE); PARAMETRIZE { species = SPECIES_UNOWN; airborne = TRUE; } PARAMETRIZE { species = SPECIES_UNOWN; item = ITEM_IRON_BALL; airborne = FALSE; } PARAMETRIZE { species = SPECIES_UNOWN; move1 = MOVE_GRAVITY; airborne = FALSE; } @@ -133,3 +133,30 @@ SINGLE_BATTLE_TEST("Spikes do not damage airborne Pokemon") } } } + +SINGLE_BATTLE_TEST("Toxic Spikes: Only three layers can be set up") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SPIKES); } + TURN { MOVE(opponent, MOVE_SPIKES); } + TURN { MOVE(opponent, MOVE_SPIKES); } + TURN { MOVE(opponent, MOVE_SPIKES); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, opponent); + } THEN { + EXPECT_EQ(gBattleStruct->hazardsQueue[0][0], HAZARDS_SPIKES); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][1], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][2], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][3], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][4], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][5], HAZARDS_NONE); + u32 spikesAmount = gSideTimers[0].spikesAmount; + EXPECT_EQ(spikesAmount, 3); + } +} diff --git a/test/battle/move_effect/steal_item.c b/test/battle/move_effect/steal_item.c new file mode 100644 index 000000000000..1259cf4599bf --- /dev/null +++ b/test/battle/move_effect/steal_item.c @@ -0,0 +1,187 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_THIEF == EFFECT_STEAL_ITEM)); + ASSUME(GetMoveEffect(MOVE_COVET == EFFECT_STEAL_ITEM)); +} + +SINGLE_BATTLE_TEST("Thief and Covet steal target's held item") +{ + u32 move; + PARAMETRIZE { move = MOVE_THIEF; } + PARAMETRIZE { move = MOVE_COVET; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_HYPER_POTION); } + } WHEN { + TURN { MOVE(player, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_STEAL, opponent); + } THEN { + EXPECT_EQ(player->item, ITEM_HYPER_POTION); + EXPECT_EQ(opponent->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Thief and Covet steal player's held item if opponent is a trainer") +{ + u32 move; + PARAMETRIZE { move = MOVE_THIEF; } + PARAMETRIZE { move = MOVE_COVET; } + GIVEN { + ASSUME(B_TRAINERS_KNOCK_OFF_ITEMS == TRUE); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_HYPER_POTION); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + HP_BAR(player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_STEAL, player); + } THEN { + EXPECT_EQ(opponent->item, ITEM_HYPER_POTION); + EXPECT_EQ(player->item, ITEM_NONE); + } +} + +WILD_BATTLE_TEST("Thief and Covet don't steal player's held item if opponent is a wild mon") +{ + u32 move; + PARAMETRIZE { move = MOVE_THIEF; } + PARAMETRIZE { move = MOVE_COVET; } + GIVEN { + ASSUME(B_TRAINERS_KNOCK_OFF_ITEMS == TRUE); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_HYPER_POTION); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + HP_BAR(player); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_STEAL, player); + } THEN { + EXPECT_EQ(player->item, ITEM_HYPER_POTION); + EXPECT_EQ(opponent->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Thief and Covet don't steal target's held item if user is holding an item") +{ + u32 move; + PARAMETRIZE { move = MOVE_THIEF; } + PARAMETRIZE { move = MOVE_COVET; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_POTION); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_HYPER_POTION); } + } WHEN { + TURN { MOVE(player, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_STEAL, opponent); + } THEN { + EXPECT_EQ(player->item, ITEM_POTION); + EXPECT_EQ(opponent->item, ITEM_HYPER_POTION); + } +} + +SINGLE_BATTLE_TEST("Thief and Covet don't steal target's held item if target has no item") +{ + u32 move; + PARAMETRIZE { move = MOVE_THIEF; } + PARAMETRIZE { move = MOVE_COVET; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_STEAL, opponent); + } +} + +// Test can't currently verify if the item is sent to Bag +WILD_BATTLE_TEST("Thief and Covet steal target's held item and it's added to Bag in wild battles (Gen 9+)") +{ + u32 move; + PARAMETRIZE { move = MOVE_THIEF; } + PARAMETRIZE { move = MOVE_COVET; } + GIVEN { + WITH_CONFIG(CONFIG_STEAL_WILD_ITEMS, GEN_9); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_HYPER_POTION); } + } WHEN { + TURN { MOVE(player, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_STEAL, opponent); + } THEN { + EXPECT_EQ(player->item, ITEM_NONE); + EXPECT_EQ(opponent->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Thief and Covet can't steal target's held item if user faints before") +{ + u32 move; + PARAMETRIZE { move = MOVE_THIEF; } + PARAMETRIZE { move = MOVE_COVET; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ROCKY_HELMET); } + } WHEN { + TURN { MOVE(player, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_STEAL, opponent); + } THEN { + EXPECT_EQ(player->item, ITEM_NONE); + EXPECT_EQ(opponent->item, ITEM_ROCKY_HELMET); + } +} + +SINGLE_BATTLE_TEST("Thief and Covet: Berries that activate on HP thresholds are stolen before they can activate") +{ + u32 move; + PARAMETRIZE { move = MOVE_THIEF; } + PARAMETRIZE { move = MOVE_COVET; } + + GIVEN { + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(200); HP(101); Item(ITEM_ORAN_BERRY); } + } WHEN { + TURN { MOVE(player, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_STEAL, opponent); + } +} + +SINGLE_BATTLE_TEST("Thief and Covet: Berries that activate on a Status activate before the item can be stolen") +{ + u32 move; + PARAMETRIZE { move = MOVE_THIEF; } + PARAMETRIZE { move = MOVE_COVET; } + + GIVEN { + PLAYER(SPECIES_TOXICROAK) { Ability(ABILITY_POISON_TOUCH); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LUM_BERRY); } + } WHEN { + TURN { MOVE(player, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, player); + ABILITY_POPUP(player, ABILITY_POISON_TOUCH); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_STEAL, opponent); + } +} diff --git a/test/battle/move_effect/stealth_rock.c b/test/battle/move_effect/stealth_rock.c index ccd0ea496bb4..1ea6bea23b73 100644 --- a/test/battle/move_effect/stealth_rock.c +++ b/test/battle/move_effect/stealth_rock.c @@ -31,7 +31,7 @@ SINGLE_BATTLE_TEST("Stealth Rock damage on switch in based on typing") } } -SINGLE_BATTLE_TEST("Stealth Rock damages the correct pokemon when Eject Button is triggered") +SINGLE_BATTLE_TEST("Stealth Rock damages the correct PokΓ©mon when Eject Button is triggered") { GIVEN { PLAYER(SPECIES_METAPOD) { Item(ITEM_EJECT_BUTTON); } @@ -53,7 +53,7 @@ SINGLE_BATTLE_TEST("Stealth Rock damages the correct pokemon when Eject Button i } } -DOUBLE_BATTLE_TEST("Stealth Rock damages the correct pokemon when Eject Button is triggered in double battle") +DOUBLE_BATTLE_TEST("Stealth Rock damages the correct PokΓ©mon when Eject Button is triggered in double battle") { GIVEN { PLAYER(SPECIES_METAPOD) { Item(ITEM_EJECT_BUTTON); } diff --git a/test/battle/move_effect/steel_roller.c b/test/battle/move_effect/steel_roller.c new file mode 100644 index 000000000000..4b658a612445 --- /dev/null +++ b/test/battle/move_effect/steel_roller.c @@ -0,0 +1,75 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_STEEL_ROLLER) == EFFECT_STEEL_ROLLER); +} + +// Covered in ice_spinner.c +// SINGLE_BATTLE_TEST("Ice Spinner and Steel Roller remove a terrain from field") + +SINGLE_BATTLE_TEST("Steel Roller removes Terrain even if user faints during attack execution") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LIFE_ORB); HP(1); } + } WHEN { + TURN { MOVE(player, MOVE_ELECTRIC_TERRAIN); MOVE(opponent, MOVE_STEEL_ROLLER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIC_TERRAIN, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STEEL_ROLLER, opponent); + MESSAGE("The electricity disappeared from the battlefield."); + } +} + +SINGLE_BATTLE_TEST("Steel Roller removes Terrain if user is switched out due to Red Card") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_RED_CARD); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(player, MOVE_ELECTRIC_TERRAIN); MOVE(opponent, MOVE_STEEL_ROLLER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIC_TERRAIN, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STEEL_ROLLER, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("The electricity disappeared from the battlefield."); + } +} + +SINGLE_BATTLE_TEST("Steel Roller will fail if there is no Terrain") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_STEEL_ROLLER); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_STEEL_ROLLER, opponent); + MESSAGE("The opposing Wobbuffet used Steel Roller!"); + MESSAGE("But it failed!"); + } +} + +AI_SINGLE_BATTLE_TEST("Steel Roller wont be chosen by AI if there is no terrain on the field") +{ + u32 move; + + PARAMETRIZE { move = MOVE_ELECTRIC_TERRAIN; } + PARAMETRIZE { move = MOVE_NONE; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_STEEL_ROLLER, MOVE_ICE_SHARD); } + } WHEN { + if (move == MOVE_ELECTRIC_TERRAIN) { + TURN { MOVE(player, MOVE_ELECTRIC_TERRAIN); EXPECT_MOVE(opponent, MOVE_ICE_SHARD); } + TURN { EXPECT_MOVE(opponent, MOVE_STEEL_ROLLER); } + } else { + TURN { EXPECT_MOVE(opponent, MOVE_ICE_SHARD); } + } + } +} diff --git a/test/battle/move_effect/stockpile.c b/test/battle/move_effect/stockpile.c index 907643a1bd23..e18c97fc57eb 100644 --- a/test/battle/move_effect/stockpile.c +++ b/test/battle/move_effect/stockpile.c @@ -30,7 +30,7 @@ SINGLE_BATTLE_TEST("Stockpile's count can go up only to 3") MESSAGE("Wobbuffet stockpiled 3!"); NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_STOCKPILE, player); - MESSAGE("Wobbuffet can't stockpile any more!"); + MESSAGE("But it failed!"); } } @@ -49,9 +49,9 @@ SINGLE_BATTLE_TEST("Spit Up and Swallow don't work if used without Stockpile") } SCENE { NOT ANIMATION(ANIM_TYPE_MOVE, move, player); if (move == MOVE_SWALLOW) - MESSAGE("But it failed to swallow a thing!"); + MESSAGE("But it failed!"); else - MESSAGE("But it failed to spit up a thing!"); + MESSAGE("But it failed!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_STOCKPILE, player); MESSAGE("Wobbuffet stockpiled 1!"); diff --git a/test/battle/move_effect/stomping_tantrum.c b/test/battle/move_effect/stomping_tantrum.c index 95d93e07e6a7..06b29334d79f 100644 --- a/test/battle/move_effect/stomping_tantrum.c +++ b/test/battle/move_effect/stomping_tantrum.c @@ -90,6 +90,31 @@ SINGLE_BATTLE_TEST("Stomping Tantrum will not deal double damage if target prote } } +SINGLE_BATTLE_TEST("Stomping Tantrum will deal double damage if user failed a Protect") +{ + s16 damage[2]; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_STOMPING_TANTRUM); } + TURN { MOVE(player, MOVE_PROTECT); } + TURN { MOVE(player, MOVE_PROTECT, WITH_RNG(RNG_PROTECT_FAIL, USHRT_MAX)); } + TURN { MOVE(player, MOVE_STOMPING_TANTRUM); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STOMPING_TANTRUM, player); + HP_BAR(opponent, captureDamage: &damage[0]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_PROTECT, player); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_PROTECT, player); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_STOMPING_TANTRUM, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_MUL_EQ(damage[0], Q_4_12(2.0), damage[1]); + } +} + SINGLE_BATTLE_TEST("Stomping Tantrum will not deal double if it missed") { s16 damage[2]; diff --git a/test/battle/move_effect/stone_axe.c b/test/battle/move_effect/stone_axe.c new file mode 100644 index 000000000000..d65798d18b27 --- /dev/null +++ b/test/battle/move_effect/stone_axe.c @@ -0,0 +1,94 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_STONE_AXE) == EFFECT_STONE_AXE); +} + +SINGLE_BATTLE_TEST("Stone Axe sets up hazards after hitting the target") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_STONE_AXE); } + TURN { SWITCH(opponent, 1); } + } SCENE { + s32 maxHP = GetMonData(&OPPONENT_PARTY[1], MON_DATA_MAX_HP); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_AXE, player); + HP_BAR(opponent); + MESSAGE("Pointed stones float in the air around the opposing team!"); + MESSAGE("2 sent out Wobbuffet!"); + HP_BAR(opponent, damage: maxHP / 8); + MESSAGE("Pointed stones dug into the opposing Wobbuffet!"); + } +} + +SINGLE_BATTLE_TEST("Stone Axe can set up pointed stones only once") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(player, MOVE_STONE_AXE); } + TURN { MOVE(player, MOVE_STONE_AXE); } + TURN { MOVE(player, MOVE_STONE_AXE); } + TURN { MOVE(player, MOVE_STONE_AXE); } + TURN { SWITCH(opponent, 1); } + } SCENE { + s32 maxHP = GetMonData(&OPPONENT_PARTY[1], MON_DATA_MAX_HP); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_AXE, player); + HP_BAR(opponent); + MESSAGE("Pointed stones float in the air around the opposing team!"); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_AXE, player); + HP_BAR(opponent); + NOT MESSAGE("Pointed stones float in the air around the opposing team!"); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_AXE, player); + HP_BAR(opponent); + NOT MESSAGE("Pointed stones float in the air around the opposing team!"); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_AXE, player); + HP_BAR(opponent); + NOT MESSAGE("Pointed stones float in the air around the opposing team!"); + + MESSAGE("2 sent out Wynaut!"); + HP_BAR(opponent, damage: maxHP / 8); + MESSAGE("Pointed stones dug into the opposing Wynaut!"); + } +} + +SINGLE_BATTLE_TEST("Stone Axe sets up hazards after any ability activation") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_SKARMORY) { Ability(ABILITY_WEAK_ARMOR); } + } WHEN { + TURN { MOVE(player, MOVE_STONE_AXE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_AXE, player); + ABILITY_POPUP(opponent, ABILITY_WEAK_ARMOR); + MESSAGE("Pointed stones float in the air around the opposing team!"); + } +} + +SINGLE_BATTLE_TEST("Stone Axe fails to set up hazards if user faints") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ROCKY_HELMET); } + } WHEN { + TURN { MOVE(player, MOVE_STONE_AXE); SEND_OUT(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_AXE, player); + HP_BAR(player); + MESSAGE("Wobbuffet was hurt by the opposing Wobbuffet's Rocky Helmet!"); + NOT MESSAGE("Pointed stones float in the air around the opposing team!"); + } +} diff --git a/test/battle/move_effect/strength_sap.c b/test/battle/move_effect/strength_sap.c index c38048ba8f2c..675d5090eeea 100644 --- a/test/battle/move_effect/strength_sap.c +++ b/test/battle/move_effect/strength_sap.c @@ -141,6 +141,8 @@ SINGLE_BATTLE_TEST("Strength Sap fails if target is at -6 Atk") } } +TO_DO_BATTLE_TEST("Strength Sap doesn't fail if target has Contrary and is at +6 Atk, restoring HP based on +5 Atk") + SINGLE_BATTLE_TEST("Strength Sap restores more HP if Big Root is held", s16 hp) { u32 item; diff --git a/test/battle/move_effect/struggle.c b/test/battle/move_effect/struggle.c new file mode 100644 index 000000000000..5bf9de6207a7 --- /dev/null +++ b/test/battle/move_effect/struggle.c @@ -0,0 +1,75 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Struggle deals recoil 1/4 of damage dealt (Gen 2-3)") + +SINGLE_BATTLE_TEST("Struggle deals recoil 1/4 of user's hp (Gen 4+)") +{ + ASSUME(GetMoveEffect(MOVE_STRUGGLE) == EFFECT_STRUGGLE); + + s16 recoil; + u32 atkStat = 0; + u32 hpStat = 0; + + PARAMETRIZE { atkStat = 100; hpStat = 200; } + PARAMETRIZE { atkStat = 50; hpStat = 200; } + PARAMETRIZE { atkStat = 100; hpStat = 300; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { MaxHP(hpStat); HP(hpStat); Attack(atkStat); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_STRUGGLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STRUGGLE, player); + HP_BAR(player, captureDamage: &recoil); + } THEN { + EXPECT_MUL_EQ(hpStat, Q_4_12(0.25), recoil); + } +} + +SINGLE_BATTLE_TEST("Struggle can hit ghost types") +{ + ASSUME(GetSpeciesType(SPECIES_DRIFBLIM, 0) == TYPE_GHOST); + + s16 damage; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_DRIFBLIM); + } WHEN { + TURN { MOVE(player, MOVE_STRUGGLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STRUGGLE, player); + HP_BAR(opponent, captureDamage: &damage); + } THEN { + EXPECT_NE(0, damage); + } +} + +SINGLE_BATTLE_TEST("Struggle does not receive normal-type STAB") +{ + // Compare with Cut, which does receive normal-type STAB + ASSUME(GetSpeciesType(SPECIES_ZANGOOSE, 0) == GetMoveType(MOVE_STRUGGLE)); + ASSUME(GetMovePower(MOVE_CUT) == GetMovePower(MOVE_STRUGGLE)); + ASSUME(GetMoveCategory(MOVE_CUT) == GetMoveCategory(MOVE_STRUGGLE)); + ASSUME(GetMoveType(MOVE_CUT) == GetMoveType(MOVE_STRUGGLE)); + + s16 cutDamage; + s16 struggleDamage; + + GIVEN { + PLAYER(SPECIES_ZANGOOSE); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CUT); } + TURN { MOVE(player, MOVE_STRUGGLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CUT, player); + HP_BAR(opponent, captureDamage: &cutDamage); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STRUGGLE, player); + HP_BAR(opponent, captureDamage: &struggleDamage); + } THEN { + EXPECT_MUL_EQ(struggleDamage, Q_4_12(1.5), cutDamage); + } +} diff --git a/test/battle/move_effect/stuff_cheeks.c b/test/battle/move_effect/stuff_cheeks.c index 9e6a34c3068d..b8dda1d8b6b5 100644 --- a/test/battle/move_effect/stuff_cheeks.c +++ b/test/battle/move_effect/stuff_cheeks.c @@ -103,3 +103,16 @@ SINGLE_BATTLE_TEST("Stuff Cheeks fails if the user's berry is removed before the MESSAGE("But it failed!"); } } + +AI_SINGLE_BATTLE_TEST("AI uses Stuff Cheeks") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_STUFF_CHEEKS) == EFFECT_STUFF_CHEEKS); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_HEADBUTT); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_HEADBUTT); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LIECHI_BERRY); Moves(MOVE_HEADBUTT, MOVE_STUFF_CHEEKS); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_STUFF_CHEEKS); } + } +} diff --git a/test/battle/move_effect/substitute.c b/test/battle/move_effect/substitute.c index e94767b6605f..ce174ec02596 100644 --- a/test/battle/move_effect/substitute.c +++ b/test/battle/move_effect/substitute.c @@ -69,4 +69,111 @@ SINGLE_BATTLE_TEST("Substitute's HP cost doesn't trigger effects that trigger on } } +SINGLE_BATTLE_TEST("Substitute hits are detected by SUB_HIT") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUBSTITUTE); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + SUB_HIT(player); + } +} + +SINGLE_BATTLE_TEST("Substitute hits are detected by SUB_HIT, break TRUE") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Level(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUBSTITUTE); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + SUB_HIT(player, subBreak: TRUE); + } +} + +SINGLE_BATTLE_TEST("Substitute hits are detected by SUB_HIT, break FALSE") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Level(100); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUBSTITUTE); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + SUB_HIT(player, subBreak: FALSE); + } +} + +SINGLE_BATTLE_TEST("Substitute hits are detected by SUB_HIT, records damage") +{ + u16 damage; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUBSTITUTE); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + SUB_HIT(player, captureDamage: &damage); + } THEN { + EXPECT_GT(damage, 0); + } +} + +SINGLE_BATTLE_TEST("Substitute hits are detected by SUB_HIT, records damage, break FALSE") +{ + u16 damage; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUBSTITUTE); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + SUB_HIT(player, captureDamage: &damage, subBreak: FALSE); + } THEN { + EXPECT_GT(damage, 0); + } +} + +SINGLE_BATTLE_TEST("Substitute hits are detected by SUB_HIT, records damage, break TRUE") +{ + u16 damage; + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Level(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUBSTITUTE); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + SUB_HIT(player, captureDamage: &damage, subBreak: TRUE); + } THEN { + EXPECT_GT(damage, 0); + } +} + +SINGLE_BATTLE_TEST("Substitute hits are detected by SUB_HIT, break TRUE, failing") +{ + KNOWN_FAILING; // For testing purposes + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Level(100); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUBSTITUTE); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + SUB_HIT(player, subBreak: TRUE); + } +} + +SINGLE_BATTLE_TEST("Substitute hits are detected by SUB_HIT, break FALSE, failing") +{ + KNOWN_FAILING; // For testing purposes + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Level(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUBSTITUTE); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + SUB_HIT(player, subBreak: FALSE); + } +} + TO_DO_BATTLE_TEST("Baton Pass passes Substitutes"); diff --git a/test/battle/move_effect/sucker_punch.c b/test/battle/move_effect/sucker_punch.c index 40ba135b6ac9..0fd227360787 100644 --- a/test/battle/move_effect/sucker_punch.c +++ b/test/battle/move_effect/sucker_punch.c @@ -51,3 +51,22 @@ SINGLE_BATTLE_TEST("Sucker Punch doesn't hit targets that has already moved") } } } + +DOUBLE_BATTLE_TEST("Sucker Punch fails if the target has attempted to act even if previously successful") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_INSTRUCT) == EFFECT_INSTRUCT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); MOVE(playerLeft, MOVE_SUCKER_PUNCH, target: opponentLeft); MOVE(playerRight, MOVE_INSTRUCT, target: playerLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUCKER_PUNCH, playerLeft); + HP_BAR(opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_INSTRUCT, playerRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SUCKER_PUNCH, playerLeft); + } +} diff --git a/test/battle/move_effect/super_fang.c b/test/battle/move_effect/super_fang.c deleted file mode 100644 index 33e162395dd0..000000000000 --- a/test/battle/move_effect/super_fang.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -TO_DO_BATTLE_TEST("TODO: Write Super Fang (Move Effect) test titles") diff --git a/test/battle/move_effect/swagger.c b/test/battle/move_effect/swagger.c index 5845d4292fc6..fad4a39c5c2d 100644 --- a/test/battle/move_effect/swagger.c +++ b/test/battle/move_effect/swagger.c @@ -1,4 +1,30 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Swagger (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_SWAGGER) == EFFECT_SWAGGER); +} + +SINGLE_BATTLE_TEST("Swagger increases the target's Attack by 2 stages and confuses them") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SWAGGER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWAGGER, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + EXPECT(opponent->volatiles.confusionTurns > 0); + } +} + +TO_DO_BATTLE_TEST("Swagger raises the target's Attack even if they're already confused") +TO_DO_BATTLE_TEST("Swagger raises the target's Attack even when protected by Safeguard") +TO_DO_BATTLE_TEST("Swagger raises the target's Attack even when protected Own Tempo") +TO_DO_BATTLE_TEST("Swagger doesn't confuse the target when they have their Attack maxed (Gen2)") +TO_DO_BATTLE_TEST("Swagger confuses the target even when they have their Attack maxed (Gen3+)") +TO_DO_BATTLE_TEST("Swagger confuses the target even when at -6 Attack and has Contrary") diff --git a/test/battle/move_effect/synchronoise.c b/test/battle/move_effect/synchronoise.c index 9b68ccc63af3..45b4f125eadf 100644 --- a/test/battle/move_effect/synchronoise.c +++ b/test/battle/move_effect/synchronoise.c @@ -1,4 +1,74 @@ #include "global.h" #include "test/battle.h" +DOUBLE_BATTLE_TEST("Synchronoise hits all Pokemon that share a type with the attacker") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SYNCHRONOISE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SYNCHRONOISE, playerLeft); + HP_BAR(opponentLeft); + HP_BAR(playerRight); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Synchronoise will fail if there is no corresponding typing on the field") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_BULBASAUR); + OPPONENT(SPECIES_BULBASAUR); + OPPONENT(SPECIES_BULBASAUR); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SYNCHRONOISE); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SYNCHRONOISE, playerLeft); + MESSAGE("Wobbuffet used Synchronoise!"); + MESSAGE("It doesn't affect the opposing Bulbasaur…"); + MESSAGE("It doesn't affect Bulbasaur…"); + MESSAGE("It doesn't affect the opposing Bulbasaur…"); + NOT MESSAGE("But it failed!"); + } +} + +DOUBLE_BATTLE_TEST("Synchronoise will hit if there is at least one target") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_BULBASAUR); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_BULBASAUR); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SYNCHRONOISE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SYNCHRONOISE, playerLeft); + HP_BAR(opponentLeft); + NONE_OF { + HP_BAR(playerRight); + HP_BAR(opponentRight); + MESSAGE("But it failed!"); + } + } +} + +DOUBLE_BATTLE_TEST("Synchronoise will fail if the corresponding typing mon protects") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_BULBASAUR); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_BULBASAUR); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_PROTECT); MOVE(playerLeft, MOVE_SYNCHRONOISE); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SYNCHRONOISE, playerLeft); + } +} + TO_DO_BATTLE_TEST("TODO: Write Synchronoise (Move Effect) test titles") diff --git a/test/battle/move_effect/synthesis.c b/test/battle/move_effect/synthesis.c index 6799bd28705a..a33b58692796 100644 --- a/test/battle/move_effect/synthesis.c +++ b/test/battle/move_effect/synthesis.c @@ -6,9 +6,10 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_SYNTHESIS) == EFFECT_SYNTHESIS); } -SINGLE_BATTLE_TEST("Synthesis recovers 1/2 of the user's max HP") +SINGLE_BATTLE_TEST("Synthesis recovers 1/2 of the user's max HP (Gen3+)") { GIVEN { + WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(200); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -18,9 +19,10 @@ SINGLE_BATTLE_TEST("Synthesis recovers 1/2 of the user's max HP") } } -SINGLE_BATTLE_TEST("Synthesis recovers 2/3 of the user's max HP in Sunlight") +SINGLE_BATTLE_TEST("Synthesis recovers 2/3 of the user's max HP in Sunlight (Gen3+)") { GIVEN { + WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(300); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -30,7 +32,7 @@ SINGLE_BATTLE_TEST("Synthesis recovers 2/3 of the user's max HP in Sunlight") } } -SINGLE_BATTLE_TEST("Synthesis recovers 1/4 of the user's max HP in Rain, Sandstorm, Hail, and Snow") +SINGLE_BATTLE_TEST("Synthesis recovers 1/4 of the user's max HP in Rain, Sandstorm, Hail, and Snow (Gen3+)") { u32 move; PARAMETRIZE { move = MOVE_RAIN_DANCE; } @@ -38,6 +40,7 @@ SINGLE_BATTLE_TEST("Synthesis recovers 1/4 of the user's max HP in Rain, Sandsto PARAMETRIZE { move = MOVE_HAIL; } PARAMETRIZE { move = MOVE_SNOWSCAPE; } GIVEN { + WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -46,3 +49,28 @@ SINGLE_BATTLE_TEST("Synthesis recovers 1/4 of the user's max HP in Rain, Sandsto HP_BAR(player, damage: -(400 / 4)); } } + +SINGLE_BATTLE_TEST("Synthesis recovers regular amount in sandstorm if holding utility umbrella") +{ + u32 item; + PARAMETRIZE { item = ITEM_LIFE_ORB; } + PARAMETRIZE { item = ITEM_UTILITY_UMBRELLA; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); Item(item); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SANDSTORM); MOVE(player, MOVE_SYNTHESIS); } + } SCENE { + if (item != ITEM_UTILITY_UMBRELLA) + HP_BAR(player, damage: -(400 / 4)); + else + HP_BAR(player, damage: -(400 / 2)); + } +} + +TO_DO_BATTLE_TEST("TODO: Synthesis recovers 1/4 of the user's max HP while it is not day (Gen2)") +TO_DO_BATTLE_TEST("TODO: Synthesis recovers 1/2 of the user's max HP in Sunlight while it is not day (Gen2)") +TO_DO_BATTLE_TEST("TODO: Synthesis recovers 1/8 of the user's max HP in Rain, Sandstorm, Hail, and Snow while it is not day (Gen2)") +TO_DO_BATTLE_TEST("TODO: Synthesis recovers 2/4 of the user's max HP while it is day (Gen2)") +TO_DO_BATTLE_TEST("TODO: Synthesis recovers 2/2 of the user's max HP in Sunlight while it is day (Gen2)") +TO_DO_BATTLE_TEST("TODO: Synthesis recovers 2/8 of the user's max HP in Rain, Sandstorm, Hail, and Snow while it is day (Gen2)") diff --git a/test/battle/move_effect/tailwind.c b/test/battle/move_effect/tailwind.c index f105c9612ab6..d22f36d285a3 100644 --- a/test/battle/move_effect/tailwind.c +++ b/test/battle/move_effect/tailwind.c @@ -6,10 +6,13 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_TAILWIND) == EFFECT_TAILWIND); } -SINGLE_BATTLE_TEST("Tailwind applies for 4 turns") +SINGLE_BATTLE_TEST("Tailwind applies for 3 turns (Gen4) or 4 turns (Gen5+)") { + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { - ASSUME(B_TAILWIND_TURNS >= GEN_5); + WITH_CONFIG(CONFIG_TAILWIND_TURNS, config); PLAYER(SPECIES_WOBBUFFET) { Speed(10); } OPPONENT(SPECIES_WOBBUFFET) { Speed(15); } } WHEN { @@ -28,18 +31,38 @@ SINGLE_BATTLE_TEST("Tailwind applies for 4 turns") MESSAGE("Wobbuffet used Celebrate!"); MESSAGE("The opposing Wobbuffet used Celebrate!"); - MESSAGE("Wobbuffet used Celebrate!"); - MESSAGE("The opposing Wobbuffet used Celebrate!"); + if (config >= GEN_5) { + MESSAGE("Wobbuffet used Celebrate!"); + MESSAGE("The opposing Wobbuffet used Celebrate!"); + } MESSAGE("The opposing Wobbuffet used Celebrate!"); MESSAGE("Wobbuffet used Celebrate!"); } } -DOUBLE_BATTLE_TEST("Tailwind affects partner on first turn") +DOUBLE_BATTLE_TEST("Tailwind doesn't affect the partner on the same turn it's used (Gen4-7)") +{ + GIVEN { + WITH_CONFIG(CONFIG_RECALC_TURN_AFTER_ACTIONS, GEN_7); + PLAYER(SPECIES_WOBBUFFET) { Speed(20); } + PLAYER(SPECIES_WYNAUT) { Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(15); } + OPPONENT(SPECIES_WYNAUT) { Speed(14); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_TAILWIND); } + } SCENE { + MESSAGE("Wobbuffet used Tailwind!"); + MESSAGE("The opposing Wobbuffet used Celebrate!"); + MESSAGE("The opposing Wynaut used Celebrate!"); + MESSAGE("Wynaut used Celebrate!"); + } +} + +DOUBLE_BATTLE_TEST("Tailwind affects the partner on the same turn it's used (Gen8+)") { GIVEN { - ASSUME(B_RECALC_TURN_AFTER_ACTIONS); + WITH_CONFIG(CONFIG_RECALC_TURN_AFTER_ACTIONS, GEN_8); PLAYER(SPECIES_WOBBUFFET) { Speed(20); } PLAYER(SPECIES_WYNAUT) { Speed(10); } OPPONENT(SPECIES_WOBBUFFET) { Speed(15); } diff --git a/test/battle/move_effect/tar_shot.c b/test/battle/move_effect/tar_shot.c index f2aac4e55221..01fd72018f6b 100644 --- a/test/battle/move_effect/tar_shot.c +++ b/test/battle/move_effect/tar_shot.c @@ -14,10 +14,10 @@ SINGLE_BATTLE_TEST("Tar Shot doubles the effectiveness of Fire-type moves used o PARAMETRIZE { species = SPECIES_WOBBUFFET; } PARAMETRIZE { species = SPECIES_OMASTAR; } // Dual type with double resists - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_OMASTAR].types[0] == TYPE_ROCK); - ASSUME(gSpeciesInfo[SPECIES_OMASTAR].types[1] == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_OMASTAR, 0) == TYPE_ROCK); + ASSUME(GetSpeciesType(SPECIES_OMASTAR, 1) == TYPE_WATER); ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); GIVEN { diff --git a/test/battle/move_effect/teatime.c b/test/battle/move_effect/teatime.c index fc4ad2219872..b5935d0cde1b 100644 --- a/test/battle/move_effect/teatime.c +++ b/test/battle/move_effect/teatime.c @@ -205,6 +205,7 @@ SINGLE_BATTLE_TEST("Teatime triggers Lightning Rod if it has been affected by El PARAMETRIZE { move = MOVE_PLASMA_FISTS; item = ITEM_NONE; } GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); PLAYER(SPECIES_PIKACHU) { Ability(ABILITY_LIGHTNING_ROD); Item(item); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LIECHI_BERRY); } } WHEN { diff --git a/test/battle/move_effect/teleport.c b/test/battle/move_effect/teleport.c index f77dffc658fe..c3b5b53519ad 100644 --- a/test/battle/move_effect/teleport.c +++ b/test/battle/move_effect/teleport.c @@ -6,9 +6,10 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_TELEPORT) == EFFECT_TELEPORT); } -SINGLE_BATTLE_TEST("Teleport fails when there is no pokemon to switch in") +SINGLE_BATTLE_TEST("Teleport fails to switch out when there is no PokΓ©mon to switch in (Gen 8+)") { GIVEN { + WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_8); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -18,9 +19,10 @@ SINGLE_BATTLE_TEST("Teleport fails when there is no pokemon to switch in") } } -SINGLE_BATTLE_TEST("Teleport fails when there no alive pokemon left") +SINGLE_BATTLE_TEST("Teleport fails to switch out the user when there no alive PokΓ©mon left (Gen 8+)") { GIVEN { + WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_8); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT) { HP(0); } @@ -31,9 +33,29 @@ SINGLE_BATTLE_TEST("Teleport fails when there no alive pokemon left") } } -SINGLE_BATTLE_TEST("Teleport forces the pokemon to switch out") +SINGLE_BATTLE_TEST("Teleport fails in Trainer Battles (Gen 1-7)") { GIVEN { + WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_7); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponent, MOVE_TELEPORT); } + } SCENE { + MESSAGE("The opposing Wobbuffet used Teleport!"); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TELEPORT, opponent); + MESSAGE("2 sent out Wynaut!"); + } + MESSAGE("But it failed!"); + } +} + +SINGLE_BATTLE_TEST("Teleport forces the PokΓ©mon to switch out in Trainer Battles (Gen 8+)") +{ + GIVEN { + WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_8); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); @@ -48,6 +70,7 @@ SINGLE_BATTLE_TEST("Teleport forces the pokemon to switch out") SINGLE_BATTLE_TEST("Teleport does not fail if the user is trapped") { GIVEN { + WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_8); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); diff --git a/test/battle/move_effect/tera_blast.c b/test/battle/move_effect/tera_blast.c index 63e7a776b9a1..1e041dda97fb 100644 --- a/test/battle/move_effect/tera_blast.c +++ b/test/battle/move_effect/tera_blast.c @@ -24,7 +24,7 @@ SINGLE_BATTLE_TEST("Tera Blast changes from Normal-type to the user's Tera Type" SINGLE_BATTLE_TEST("Tera Blast has correct effectiveness for every Tera Type") { u32 species; - u32 type; + enum Type type; PARAMETRIZE { species = SPECIES_CHIKORITA; type = TYPE_FLYING; } PARAMETRIZE { species = SPECIES_CHIKORITA; type = TYPE_POISON; } @@ -46,20 +46,20 @@ SINGLE_BATTLE_TEST("Tera Blast has correct effectiveness for every Tera Type") PARAMETRIZE { species = SPECIES_ABRA; type = TYPE_DARK; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_CHIKORITA].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_CHIKORITA].types[1] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_CYNDAQUIL].types[0] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_CYNDAQUIL].types[1] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_GASTLY].types[0] == TYPE_GHOST); - ASSUME(gSpeciesInfo[SPECIES_GASTLY].types[1] == TYPE_POISON); - ASSUME(gSpeciesInfo[SPECIES_TOTODILE].types[0] == TYPE_WATER); - ASSUME(gSpeciesInfo[SPECIES_TOTODILE].types[1] == TYPE_WATER); - ASSUME(gSpeciesInfo[SPECIES_DRATINI].types[0] == TYPE_DRAGON); - ASSUME(gSpeciesInfo[SPECIES_DRATINI].types[1] == TYPE_DRAGON); - ASSUME(gSpeciesInfo[SPECIES_SNEASEL].types[0] == TYPE_DARK); - ASSUME(gSpeciesInfo[SPECIES_SNEASEL].types[1] == TYPE_ICE); - ASSUME(gSpeciesInfo[SPECIES_ABRA].types[0] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_ABRA].types[1] == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_CHIKORITA, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_CHIKORITA, 1) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_CYNDAQUIL, 0) == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_CYNDAQUIL, 1) == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_GASTLY, 0) == TYPE_GHOST); + ASSUME(GetSpeciesType(SPECIES_GASTLY, 1) == TYPE_POISON); + ASSUME(GetSpeciesType(SPECIES_TOTODILE, 0) == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_TOTODILE, 1) == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_DRATINI, 0) == TYPE_DRAGON); + ASSUME(GetSpeciesType(SPECIES_DRATINI, 1) == TYPE_DRAGON); + ASSUME(GetSpeciesType(SPECIES_SNEASEL, 0) == TYPE_DARK); + ASSUME(GetSpeciesType(SPECIES_SNEASEL, 1) == TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_ABRA, 0) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_ABRA, 1) == TYPE_PSYCHIC); PLAYER(SPECIES_WOBBUFFET) { TeraType(type); } OPPONENT(species); } WHEN { diff --git a/test/battle/move_effect/tera_starstorm.c b/test/battle/move_effect/tera_starstorm.c index c1d8794576cf..c3d2d7ef3a40 100644 --- a/test/battle/move_effect/tera_starstorm.c +++ b/test/battle/move_effect/tera_starstorm.c @@ -67,7 +67,7 @@ SINGLE_BATTLE_TEST("Tera Starstorm remains Normal-type if used by Pokemon other { GIVEN { ASSUME(GetMoveType(MOVE_TERA_STARSTORM) == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_MISDREAVUS].types[0] == TYPE_GHOST); + ASSUME(GetSpeciesType(SPECIES_MISDREAVUS, 0) == TYPE_GHOST); PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_STELLAR); } OPPONENT(SPECIES_MISDREAVUS); } WHEN { diff --git a/test/battle/move_effect/tickle.c b/test/battle/move_effect/tickle.c index b5f5a56d6938..3a878868fd78 100644 --- a/test/battle/move_effect/tickle.c +++ b/test/battle/move_effect/tickle.c @@ -1,4 +1,23 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Tickle (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_TICKLE) == EFFECT_TICKLE); +} + +SINGLE_BATTLE_TEST("Tickle reduces the target's Attack and Defense by 1 stage each") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TICKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TICKLE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(opponent->statStages[STAT_DEF], DEFAULT_STAT_STAGE - 1); + } +} diff --git a/test/battle/move_effect/tidy_up.c b/test/battle/move_effect/tidy_up.c index 842c186ab098..61468e8cea5a 100644 --- a/test/battle/move_effect/tidy_up.c +++ b/test/battle/move_effect/tidy_up.c @@ -43,9 +43,9 @@ SINGLE_BATTLE_TEST("Tidy Up removes hazards and raises Stats") MESSAGE("Wobbuffet used Tidy Up!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_TIDY_UP, player); MESSAGE("The spikes disappeared from the ground around your team!"); - MESSAGE("The pointed stones disappeared from around your team!"); - MESSAGE("The poison spikes disappeared from the ground around your team!"); MESSAGE("The sticky web has disappeared from the ground around your team!"); + MESSAGE("The poison spikes disappeared from the ground around your team!"); + MESSAGE("The pointed stones disappeared from around your team!"); MESSAGE("Tidying up complete!"); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Wobbuffet's Attack rose!"); diff --git a/test/battle/move_effect/toxic.c b/test/battle/move_effect/toxic.c index c25b4fc64057..55e09b24eb65 100644 --- a/test/battle/move_effect/toxic.c +++ b/test/battle/move_effect/toxic.c @@ -43,15 +43,17 @@ SINGLE_BATTLE_TEST("Toxic can't bad poison a poison or steel type") } } -SINGLE_BATTLE_TEST("Toxic cannot miss if used by a Poison-type") +SINGLE_BATTLE_TEST("Toxic cannot miss if used by a Poison-type (Gen6+)") { - u32 species; + u32 species, gen; bool32 hit; - PARAMETRIZE { species = SPECIES_WOBBUFFET; hit = FALSE; } - PARAMETRIZE { species = SPECIES_NIDORAN_M; hit = TRUE; } + PARAMETRIZE { species = SPECIES_WOBBUFFET; hit = FALSE; gen = GEN_5; } + PARAMETRIZE { species = SPECIES_NIDORAN_M; hit = FALSE; gen = GEN_5; } + PARAMETRIZE { species = SPECIES_WOBBUFFET; hit = FALSE; gen = GEN_6; } + PARAMETRIZE { species = SPECIES_NIDORAN_M; hit = TRUE; gen = GEN_6; } GIVEN { - ASSUME(B_TOXIC_NEVER_MISS >= GEN_6); - ASSUME(gSpeciesInfo[SPECIES_NIDORAN_M].types[0] == TYPE_POISON); + WITH_CONFIG(CONFIG_TOXIC_NEVER_MISS, gen); + ASSUME(GetSpeciesType(SPECIES_NIDORAN_M, 0) == TYPE_POISON); PLAYER(species); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -73,7 +75,8 @@ SINGLE_BATTLE_TEST("Toxic cannot miss if used by a Poison-type") AI_SINGLE_BATTLE_TEST("AI avoids toxic when it can not poison target") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_SNORLAX; ability = ABILITY_IMMUNITY; } PARAMETRIZE { species = SPECIES_KOMALA; ability = ABILITY_COMATOSE; } diff --git a/test/battle/move_effect/toxic_spikes.c b/test/battle/move_effect/toxic_spikes.c index 5452f66a8b98..3d21c0693b58 100644 --- a/test/battle/move_effect/toxic_spikes.c +++ b/test/battle/move_effect/toxic_spikes.c @@ -97,13 +97,13 @@ SINGLE_BATTLE_TEST("Toxic Spikes do not poison airborne Pokemon") u32 move2 = MOVE_CELEBRATE; bool32 airborne; - ASSUME(gSpeciesInfo[SPECIES_PIDGEY].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_PIDGEY, 1) == TYPE_FLYING); PARAMETRIZE { species = SPECIES_PIDGEY; airborne = TRUE; } PARAMETRIZE { species = SPECIES_PIDGEY; item = ITEM_IRON_BALL; airborne = FALSE; } PARAMETRIZE { species = SPECIES_PIDGEY; move1 = MOVE_GRAVITY; airborne = FALSE; } PARAMETRIZE { species = SPECIES_PIDGEY; move1 = MOVE_INGRAIN; airborne = FALSE; } - ASSUME(gSpeciesInfo[SPECIES_UNOWN].abilities[0] == ABILITY_LEVITATE); + ASSUME(GetSpeciesAbility(SPECIES_UNOWN, 0) == ABILITY_LEVITATE); PARAMETRIZE { species = SPECIES_UNOWN; airborne = TRUE; } PARAMETRIZE { species = SPECIES_UNOWN; item = ITEM_IRON_BALL; airborne = FALSE; } PARAMETRIZE { species = SPECIES_UNOWN; move1 = MOVE_GRAVITY; airborne = FALSE; } @@ -139,7 +139,7 @@ SINGLE_BATTLE_TEST("Toxic Spikes do not poison airborne Pokemon") SINGLE_BATTLE_TEST("Toxic Spikes do not affect Steel-types") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_STEELIX].types[0] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_STEELIX, 0) == TYPE_STEEL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_STEELIX); @@ -163,9 +163,9 @@ SINGLE_BATTLE_TEST("Toxic Spikes are removed by grounded Poison-type PokΓ©mon on PARAMETRIZE { species = SPECIES_ZUBAT; move = MOVE_GRAVITY; grounded = TRUE; } PARAMETRIZE { species = SPECIES_ZUBAT; move = MOVE_INGRAIN; grounded = TRUE; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_EKANS].types[0] == TYPE_POISON); - ASSUME(gSpeciesInfo[SPECIES_ZUBAT].types[0] == TYPE_POISON); - ASSUME(gSpeciesInfo[SPECIES_ZUBAT].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_EKANS, 0) == TYPE_POISON); + ASSUME(GetSpeciesType(SPECIES_ZUBAT, 0) == TYPE_POISON); + ASSUME(GetSpeciesType(SPECIES_ZUBAT, 1) == TYPE_FLYING); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(species) { Item(item); } @@ -190,7 +190,7 @@ SINGLE_BATTLE_TEST("Toxic Spikes are removed by grounded Poison-type PokΓ©mon on SINGLE_BATTLE_TEST("Toxic Spikes are not removed by Poison-type PokΓ©mon affected by Magnet Rise on switch in") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_EKANS].types[0] == TYPE_POISON); + ASSUME(GetSpeciesType(SPECIES_EKANS, 0) == TYPE_POISON); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_EKANS); @@ -266,3 +266,28 @@ SINGLE_BATTLE_TEST("Toxic Spikes print bad poison for 2 layers") MESSAGE("The opposing Wynaut was badly poisoned!"); } } + +SINGLE_BATTLE_TEST("Toxic Spikes: Only two layers can be set up") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_TOXIC_SPIKES); } + TURN { MOVE(opponent, MOVE_TOXIC_SPIKES); } + TURN { MOVE(opponent, MOVE_TOXIC_SPIKES); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, opponent); + } THEN { + EXPECT_EQ(gBattleStruct->hazardsQueue[0][0], HAZARDS_TOXIC_SPIKES); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][1], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][2], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][3], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][4], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][5], HAZARDS_NONE); + u32 toxicSpikesAmount = gSideTimers[0].toxicSpikesAmount; + EXPECT_EQ(toxicSpikesAmount, 2); + } +} diff --git a/test/battle/move_effect/trick.c b/test/battle/move_effect/trick.c index 3aa26af67abe..b7a75cd18857 100644 --- a/test/battle/move_effect/trick.c +++ b/test/battle/move_effect/trick.c @@ -1,4 +1,185 @@ #include "global.h" #include "test/battle.h" +#include "mail.h" -TO_DO_BATTLE_TEST("TODO: Write Trick (Move Effect) test titles") +SINGLE_BATTLE_TEST("Trick swaps held items") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LUM_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_TRICK); } + } THEN { + EXPECT(player->item == ITEM_LUM_BERRY); + EXPECT(opponent->item == ITEM_SITRUS_BERRY); + } +} + +SINGLE_BATTLE_TEST("Trick succeeds if only the user has an item") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TRICK); } + } THEN { + EXPECT(player->item == ITEM_NONE); + EXPECT(opponent->item == ITEM_SITRUS_BERRY); + } +} + +SINGLE_BATTLE_TEST("Trick succeeds if only the target has an item") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LUM_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_TRICK); } + } THEN { + EXPECT(player->item == ITEM_LUM_BERRY); + EXPECT(opponent->item == ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Trick fails if both battlers have no held item") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TRICK); } + } SCENE { + MESSAGE("But it failed!"); + } THEN { + EXPECT(player->item == ITEM_NONE); + EXPECT(opponent->item == ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Trick fails if either item is Mail") +{ + u16 atkItem = ITEM_NONE, defItem = ITEM_NONE; + + ASSUME(ItemIsMail(ITEM_ORANGE_MAIL)); + PARAMETRIZE { atkItem = ITEM_ORANGE_MAIL; defItem = ITEM_NONE; } + PARAMETRIZE { atkItem = ITEM_ORAN_BERRY; defItem = ITEM_ORANGE_MAIL; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(atkItem); } + OPPONENT(SPECIES_WOBBUFFET) { Item(defItem); } + } WHEN { + TURN { MOVE(player, MOVE_TRICK); } + } SCENE { + MESSAGE("But it failed!"); + } THEN { + EXPECT(player->item == atkItem); + EXPECT(opponent->item == defItem); + } +} + +SINGLE_BATTLE_TEST("Trick fails if either item is a Z-Crystal") +{ + u16 atkItem = ITEM_NONE, defItem = ITEM_NONE; + + ASSUME(GetItemHoldEffect(ITEM_FIGHTINIUM_Z) == HOLD_EFFECT_Z_CRYSTAL); + PARAMETRIZE { atkItem = ITEM_FIGHTINIUM_Z; defItem = ITEM_NONE; } + PARAMETRIZE { atkItem = ITEM_SITRUS_BERRY; defItem = ITEM_FIGHTINIUM_Z; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(atkItem); } + OPPONENT(SPECIES_WOBBUFFET) { Item(defItem); } + } WHEN { + TURN { MOVE(player, MOVE_TRICK); } + } SCENE { + MESSAGE("But it failed!"); + } THEN { + EXPECT(player->item == atkItem); + EXPECT(opponent->item == defItem); + } +} + +SINGLE_BATTLE_TEST("Trick fails if either battler holds a Mega Stone") +{ + u16 atkItem = ITEM_NONE, defItem = ITEM_NONE; + u16 atkSpecies = SPECIES_WOBBUFFET, defSpecies = SPECIES_WOBBUFFET; + + PARAMETRIZE { atkSpecies = SPECIES_BLAZIKEN; atkItem = ITEM_BLAZIKENITE; defSpecies = SPECIES_WOBBUFFET; defItem = ITEM_SITRUS_BERRY; } + PARAMETRIZE { atkSpecies = SPECIES_WOBBUFFET; atkItem = ITEM_SITRUS_BERRY; defSpecies = SPECIES_BLAZIKEN; defItem = ITEM_BLAZIKENITE; } + + GIVEN { + PLAYER(atkSpecies) { Item(atkItem); } + OPPONENT(defSpecies) { Item(defItem); } + } WHEN { + TURN { MOVE(player, MOVE_TRICK); } + } SCENE { + MESSAGE("But it failed!"); + } THEN { + EXPECT(player->item == atkItem); + EXPECT(opponent->item == defItem); + } +} + +SINGLE_BATTLE_TEST("Trick fails if an item changes the holder's form") +{ + u16 atkItem = ITEM_NONE, defItem = ITEM_NONE; + + PARAMETRIZE { atkItem = ITEM_GRISEOUS_CORE; defItem = ITEM_SITRUS_BERRY; } + PARAMETRIZE { atkItem = ITEM_SITRUS_BERRY; defItem = ITEM_GRISEOUS_CORE; } + + GIVEN { + PLAYER(SPECIES_GIRATINA_ORIGIN) { Item(atkItem); } + OPPONENT(SPECIES_WOBBUFFET) { Item(defItem); } + } WHEN { + TURN { MOVE(player, MOVE_TRICK); } + } SCENE { + MESSAGE("But it failed!"); + } THEN { + EXPECT(player->item == atkItem); + EXPECT(opponent->item == defItem); + } +} + +SINGLE_BATTLE_TEST("Trick fails if the user has Sticky Hold") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_STICKY_HOLD); Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LUM_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_TRICK); } + } SCENE { + MESSAGE("But it failed!"); + } THEN { + EXPECT(player->item == ITEM_SITRUS_BERRY); + EXPECT(opponent->item == ITEM_LUM_BERRY); + } +} + +SINGLE_BATTLE_TEST("Trick fails against Sticky Hold") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_STICKY_HOLD); Item(ITEM_LUM_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_TRICK); } + } SCENE { + MESSAGE("The opposing Wobbuffet's Sticky Hold made Trick ineffective!"); + } THEN { + EXPECT(player->item == ITEM_SITRUS_BERRY); + EXPECT(opponent->item == ITEM_LUM_BERRY); + } +} + +SINGLE_BATTLE_TEST("Trick fails if the target is behind a Substitute") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); Speed(50); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LUM_BERRY); Speed(100); } + } WHEN { + TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_TRICK); } + } SCENE { + MESSAGE("But it failed!"); + } THEN { + EXPECT(player->item == ITEM_SITRUS_BERRY); + EXPECT(opponent->item == ITEM_LUM_BERRY); + } +} diff --git a/test/battle/move_effect/two_turns_attack.c b/test/battle/move_effect/two_turns_attack.c index 4dd79ade46c2..661a45c11054 100644 --- a/test/battle/move_effect/two_turns_attack.c +++ b/test/battle/move_effect/two_turns_attack.c @@ -67,6 +67,36 @@ SINGLE_BATTLE_TEST("Razor Wind doesn't need to charge with Power Herb") } } +DOUBLE_BATTLE_TEST("Razor Wind successfully KOs both opponents") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_POWER_HERB); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WYNAUT) { HP(1); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_RAZOR_WIND); } + } SCENE { + if (B_UPDATED_MOVE_DATA >= GEN_5) { + NOT MESSAGE("Wobbuffet whipped up a whirlwind!"); + MESSAGE("Wobbuffet used Razor Wind!"); + } else + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAZOR_WIND, playerLeft); + if (B_UPDATED_MOVE_DATA < GEN_5) + MESSAGE("Wobbuffet whipped up a whirlwind!"); + else + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAZOR_WIND, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); + MESSAGE("Wobbuffet became fully charged due to its Power Herb!"); + if (B_UPDATED_MOVE_DATA < GEN_5) + MESSAGE("Wobbuffet used Razor Wind!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAZOR_WIND, playerLeft); + HP_BAR(opponentLeft); + MESSAGE("The opposing Wobbuffet fainted!"); + MESSAGE("The opposing Wynaut fainted!"); + } +} + SINGLE_BATTLE_TEST("Skull Bash needs a charging turn") { GIVEN { diff --git a/test/battle/move_effect/two_typed_move.c b/test/battle/move_effect/two_typed_move.c index 43c3515739c4..7372222e83bf 100644 --- a/test/battle/move_effect/two_typed_move.c +++ b/test/battle/move_effect/two_typed_move.c @@ -1,4 +1,12 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Flying Press (Move Effect) test titles") +TO_DO_BATTLE_TEST("Flying Press does both Fighting and Flying-type for type effectiveness") +TO_DO_BATTLE_TEST("Flying-type PokΓ©mon don't receive STAB on Flying Press") +TO_DO_BATTLE_TEST("Sky Plate doesn't boost Flying Press' power") // Check Fist Plate for comparison +TO_DO_BATTLE_TEST("Sharp Beak doesn't boost Flying Press' power") // Check Black Belt for comparison +TO_DO_BATTLE_TEST("Flying Gem doesn't trigger when using Flying Press") // Check Fighting Gem for comparison +TO_DO_BATTLE_TEST("Coba Berry doesn't trigger when the user is attacked by Flying Press") +TO_DO_BATTLE_TEST("Flying Press triggers Chople Berry, even when it wouldn't be super effective with regular Fighting-type moves") +TO_DO_BATTLE_TEST("Flying Press under Electrify does both Electric and Flying-type for type effectiveness") // Check Electric 1/4 effectiveness +TO_DO_BATTLE_TEST("Flying Press under Normalize does both Normal and Flying-type for type effectiveness") // Check Rock/Steel 1/4 effectiveness diff --git a/test/battle/move_effect/upper_hand.c b/test/battle/move_effect/upper_hand.c index ae63fc956931..59d6057521fa 100644 --- a/test/battle/move_effect/upper_hand.c +++ b/test/battle/move_effect/upper_hand.c @@ -68,6 +68,7 @@ SINGLE_BATTLE_TEST("Upper Hand succeeds if the target's move is boosted in prior GIVEN { ASSUME(GetMoveCategory(MOVE_DRAINING_KISS) == DAMAGE_CATEGORY_SPECIAL); ASSUME(GetMovePriority(MOVE_DRAINING_KISS) == 0); + ASSUME(IsHealingMove(MOVE_DRAINING_KISS)); // Doesn't have the Healing Move flag in Gen 5 PLAYER(SPECIES_MIENSHAO) { Speed(10); } OPPONENT(SPECIES_COMFEY) { Speed(5); Ability(ABILITY_TRIAGE); } } WHEN { @@ -85,6 +86,7 @@ SINGLE_BATTLE_TEST("Upper Hand fails if the target moves first") GIVEN { ASSUME(GetMoveCategory(MOVE_DRAINING_KISS) == DAMAGE_CATEGORY_SPECIAL); ASSUME(GetMovePriority(MOVE_DRAINING_KISS) == 0); + ASSUME(IsHealingMove(MOVE_DRAINING_KISS)); // Doesn't have the Healing Move flag in Gen 5 PLAYER(SPECIES_MIENSHAO) { Speed(5); } OPPONENT(SPECIES_COMFEY) { Speed(10); Ability(ABILITY_TRIAGE); } } WHEN { @@ -132,3 +134,42 @@ AI_SINGLE_BATTLE_TEST("AI won't use Upper Hand unless it has seen a priority mov TURN { MOVE(player, move); EXPECT_MOVE(opponent, move == MOVE_QUICK_ATTACK ? MOVE_UPPER_HAND : MOVE_KARATE_CHOP); } } } + +DOUBLE_BATTLE_TEST("Upper Hand fails if the target has attempted to act even if previously successful") +{ + GIVEN { + ASSUME(GetMoveCategory(MOVE_EXTREME_SPEED) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMovePriority(MOVE_EXTREME_SPEED) == 2); + ASSUME(GetMoveEffect(MOVE_INSTRUCT) == EFFECT_INSTRUCT); + PLAYER(SPECIES_MIENSHAO); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_EXTREME_SPEED, target: playerLeft); MOVE(playerLeft, MOVE_UPPER_HAND, target: opponentLeft); MOVE(playerRight, MOVE_INSTRUCT, target: playerLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_UPPER_HAND, playerLeft); + HP_BAR(opponentLeft); + MESSAGE("The opposing Wobbuffet flinched and couldn't move!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_EXTREME_SPEED, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_INSTRUCT, playerRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_UPPER_HAND, playerLeft); + } +} + +SINGLE_BATTLE_TEST("Upper Hand failing will prevent Protean activation") +{ + GIVEN { + WITH_CONFIG(CONFIG_PROTEAN_LIBERO, GEN_6); + PLAYER(SPECIES_REGIROCK); + OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_UPPER_HAND); } + } SCENE { + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_PROTEAN); + ANIMATION(ANIM_TYPE_MOVE, MOVE_UPPER_HAND, player); + } + } +} diff --git a/test/battle/move_effect/uproar.c b/test/battle/move_effect/uproar.c index cbe17ce066c3..93f8be9c5bb6 100644 --- a/test/battle/move_effect/uproar.c +++ b/test/battle/move_effect/uproar.c @@ -6,7 +6,7 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_UPROAR) == EFFECT_UPROAR); } -DOUBLE_BATTLE_TEST("Uproar status causes sleeping pokemon to wake up during an attack") +DOUBLE_BATTLE_TEST("Uproar status causes sleeping PokΓ©mon to wake up during an attack") { PASSES_RANDOMLY(1, 2, RNG_RANDOM_TARGET); // test fails if we target soundproof mon GIVEN { @@ -27,3 +27,17 @@ DOUBLE_BATTLE_TEST("Uproar status causes sleeping pokemon to wake up during an a ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); } } + +SINGLE_BATTLE_TEST("Uproar wakes up other pokemon on field") +{ + GIVEN { + ASSUME(B_UPROAR_TURNS >= GEN_5); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_UPROAR); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_UPROAR, opponent); + MESSAGE("The uproar woke Wobbuffet!"); + } +} diff --git a/test/battle/move_effect/victory_dance.c b/test/battle/move_effect/victory_dance.c index cd1d89242822..83fff322e337 100644 --- a/test/battle/move_effect/victory_dance.c +++ b/test/battle/move_effect/victory_dance.c @@ -1,4 +1,24 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Victory Dance (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_VICTORY_DANCE) == EFFECT_VICTORY_DANCE); +} + +SINGLE_BATTLE_TEST("Victory Dance increases the user's Attack, Defense and Speed by 1 stage each") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_VICTORY_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_VICTORY_DANCE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 1); + } +} diff --git a/test/battle/move_effect/water_sport.c b/test/battle/move_effect/water_sport.c index f7521c1fcc00..cf4ec929c34e 100644 --- a/test/battle/move_effect/water_sport.c +++ b/test/battle/move_effect/water_sport.c @@ -2,3 +2,33 @@ #include "test/battle.h" TO_DO_BATTLE_TEST("TODO: Write Water Sport (Move Effect) test titles") + +SINGLE_BATTLE_TEST("Water Sport reduces the damage of Fire Type moves by 67% (Gen5+)") +{ + s16 playerDmg[2]; + s16 opponentDmg[2]; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_FIRE_PLEDGE); MOVE(opponent, MOVE_FIRE_PLEDGE); } + TURN { MOVE(player, MOVE_WATER_SPORT); } + TURN { MOVE(player, MOVE_FIRE_PLEDGE); MOVE(opponent, MOVE_FIRE_PLEDGE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, player); + HP_BAR(opponent, captureDamage: &opponentDmg[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, opponent); + HP_BAR(player, captureDamage: &playerDmg[0]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_SPORT, player); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, player); + HP_BAR(opponent, captureDamage: &opponentDmg[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, opponent); + HP_BAR(player, captureDamage: &playerDmg[1]); + + } THEN { + EXPECT_MUL_EQ(opponentDmg[0], Q_4_12(0.33), opponentDmg[1]); + EXPECT_MUL_EQ(playerDmg[0], Q_4_12(0.33), playerDmg[1]); + } +} diff --git a/test/battle/move_effect/wish.c b/test/battle/move_effect/wish.c index 8fa384212330..a901ce0bbf75 100644 --- a/test/battle/move_effect/wish.c +++ b/test/battle/move_effect/wish.c @@ -6,9 +6,13 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_WISH) == EFFECT_WISH); } -SINGLE_BATTLE_TEST("Wish restores 50% of max player HP") +SINGLE_BATTLE_TEST("Wish restores 50% of the user's HP when not switching") { + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { + WITH_CONFIG(CONFIG_WISH_HP_SOURCE, config); PLAYER(SPECIES_WYNAUT) { HP(50); MaxHP(100); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -18,11 +22,51 @@ SINGLE_BATTLE_TEST("Wish restores 50% of max player HP") ANIMATION(ANIM_TYPE_MOVE, MOVE_WISH, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); MESSAGE("Wynaut's wish came true!"); - HP_BAR(player, hp: 100); + HP_BAR(player, damage: -50); MESSAGE("Wynaut's HP was restored."); } } +SINGLE_BATTLE_TEST("Wish restores 50% of the user's HP when switching (Gen5+)") +{ + GIVEN { + WITH_CONFIG(CONFIG_WISH_HP_SOURCE, GEN_5); + PLAYER(SPECIES_WYNAUT) { HP(50); MaxHP(100); } + PLAYER(SPECIES_WOBBUFFET) { HP(100); MaxHP(200); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_WISH); } + TURN { SWITCH(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WISH, player); + SWITCH_OUT_MESSAGE("Wynaut"); + SEND_IN_MESSAGE("Wobbuffet"); + MESSAGE("Wynaut's wish came true!"); + HP_BAR(player, damage: -50); + MESSAGE("Wobbuffet's HP was restored."); + } +} + +SINGLE_BATTLE_TEST("Wish restores 50% of the recipient's HP when switching (Gen3-4)") +{ + GIVEN { + WITH_CONFIG(CONFIG_WISH_HP_SOURCE, GEN_4); + PLAYER(SPECIES_WYNAUT) { HP(50); MaxHP(100); } + PLAYER(SPECIES_WOBBUFFET) { HP(100); MaxHP(200); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_WISH); } + TURN { SWITCH(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WISH, player); + SWITCH_OUT_MESSAGE("Wynaut"); + SEND_IN_MESSAGE("Wobbuffet"); + MESSAGE("Wynaut's wish came true!"); + HP_BAR(player, damage: -100); + MESSAGE("Wobbuffet's HP was restored."); + } +} + SINGLE_BATTLE_TEST("Wish heals the user at the end of the next turn") { GIVEN { @@ -60,5 +104,3 @@ SINGLE_BATTLE_TEST("Wish is blocked by Heal Block") NOT HP_BAR(player); } } - -TO_DO_BATTLE_TEST("TODO: Write Wish (Move Effect) test titles") diff --git a/test/battle/move_effect/worry_seed.c b/test/battle/move_effect/worry_seed.c deleted file mode 100644 index c4b18b7cabd2..000000000000 --- a/test/battle/move_effect/worry_seed.c +++ /dev/null @@ -1,74 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_WORRY_SEED); -} - -SINGLE_BATTLE_TEST("Worry Seed replaces target's ability with Insomnia") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } - OPPONENT(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } - }WHEN { - TURN { MOVE(player, MOVE_WORRY_SEED); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, player); - ABILITY_POPUP(opponent, ABILITY_BLAZE); - } THEN { - EXPECT_EQ(opponent->ability, ABILITY_INSOMNIA); - } -} - -DOUBLE_BATTLE_TEST("Worry Seed fails if the target already has Insomnia") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } - PLAYER(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } - OPPONENT(SPECIES_BULBASAUR) { Ability(ABILITY_OVERGROW); } - OPPONENT(SPECIES_SQUIRTLE) { Ability(ABILITY_TORRENT); } - } WHEN { - TURN { MOVE(playerLeft, MOVE_WORRY_SEED, target: opponentLeft); MOVE(playerRight, MOVE_WORRY_SEED, target: opponentLeft); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, playerLeft); - ABILITY_POPUP(opponentLeft, ABILITY_OVERGROW); - NONE_OF { - ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, playerRight); - ABILITY_POPUP(opponentLeft, ABILITY_INSOMNIA); - } - } THEN { - EXPECT_EQ(opponentLeft->ability, ABILITY_INSOMNIA); - } -} - -SINGLE_BATTLE_TEST("Worry Seed fails if target has an ability that can't be overwritten") -{ - u32 species, ability; - - PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } - PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; } - PARAMETRIZE { species = SPECIES_MINIOR; ability = ABILITY_SHIELDS_DOWN; } - PARAMETRIZE { species = SPECIES_WISHIWASHI; ability = ABILITY_SCHOOLING; } - PARAMETRIZE { species = SPECIES_MIMIKYU; ability = ABILITY_DISGUISE; } - PARAMETRIZE { species = SPECIES_GRENINJA_BATTLE_BOND; ability = ABILITY_BATTLE_BOND; } - PARAMETRIZE { species = SPECIES_ZYGARDE; ability = ABILITY_POWER_CONSTRUCT; } - PARAMETRIZE { species = SPECIES_KOMALA; ability = ABILITY_COMATOSE; } - PARAMETRIZE { species = SPECIES_SILVALLY; ability = ABILITY_RKS_SYSTEM; } - PARAMETRIZE { species = SPECIES_CRAMORANT; ability = ABILITY_GULP_MISSILE; } - PARAMETRIZE { species = SPECIES_EISCUE; ability = ABILITY_ICE_FACE; } - PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; } - PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; } - PARAMETRIZE { species = SPECIES_PALAFIN_ZERO; ability = ABILITY_ZERO_TO_HERO; } - PARAMETRIZE { species = SPECIES_TATSUGIRI; ability = ABILITY_COMMANDER; } - - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } - OPPONENT(species) { Ability(ability); } - } WHEN { - TURN { MOVE(player, MOVE_WORRY_SEED); } - } SCENE { - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, player); - MESSAGE("But it failed!"); - } -} diff --git a/test/battle/move_effect_secondary/bug_bite.c b/test/battle/move_effect_secondary/bug_bite.c index 70e0966caaee..e6df81dc7049 100644 --- a/test/battle/move_effect_secondary/bug_bite.c +++ b/test/battle/move_effect_secondary/bug_bite.c @@ -36,7 +36,7 @@ SINGLE_BATTLE_TEST("Bug Bite eats the target's berry and immediately gains its e PLAYER(SPECIES_WOBBUFFET) { HP(399); MaxHP(400); Status1(status1); Moves(MOVE_SLEEP_TALK, MOVE_BUG_BITE); } OPPONENT(SPECIES_WOBBUFFET) { Item(item); } } WHEN { - // Chesto Berry can only be applied if the pokemon is asleep and uses Sleep Talk. + // Chesto Berry can only be applied if the PokΓ©mon is asleep and uses Sleep Talk. if (item == ITEM_CHESTO_BERRY) { TURN { MOVE(player, MOVE_SLEEP_TALK); } } else { diff --git a/test/battle/move_effect_secondary/burn.c b/test/battle/move_effect_secondary/burn.c index 0bc979f08ec7..ee258633891e 100644 --- a/test/battle/move_effect_secondary/burn.c +++ b/test/battle/move_effect_secondary/burn.c @@ -24,7 +24,7 @@ SINGLE_BATTLE_TEST("Ember inflicts burn") SINGLE_BATTLE_TEST("Ember cannot burn a Fire-type PokΓ©mon") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_CHARMANDER].types[0] == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_CHARMANDER, 0) == TYPE_FIRE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_CHARMANDER); } WHEN { @@ -109,7 +109,7 @@ SINGLE_BATTLE_TEST("Scald shouldn't burn a Water-type PokΓ©mon") #endif { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[0] == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_SQUIRTLE, 0) == TYPE_WATER); ASSUME(MoveHasAdditionalEffect(MOVE_SCALD, MOVE_EFFECT_BURN) == TRUE); ASSUME(GetMoveType(MOVE_SCALD) == TYPE_WATER); PLAYER(SPECIES_SQUIRTLE); diff --git a/test/battle/move_effect_secondary/clear_smog.c b/test/battle/move_effect_secondary/clear_smog.c new file mode 100644 index 000000000000..f8d7b0eb2fdb --- /dev/null +++ b/test/battle/move_effect_secondary/clear_smog.c @@ -0,0 +1,19 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Clear Smog removes stat changes even if it did no damage") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SWORDS_DANCE); } + TURN { MOVE(player, MOVE_ENDURE); MOVE(opponent, MOVE_CLEAR_SMOG); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENDURE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CLEAR_SMOG, opponent); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + } +} diff --git a/test/battle/move_effect_secondary/dire_claw.c b/test/battle/move_effect_secondary/dire_claw.c index 35c6e73d94b3..e45b8e394744 100644 --- a/test/battle/move_effect_secondary/dire_claw.c +++ b/test/battle/move_effect_secondary/dire_claw.c @@ -38,11 +38,10 @@ SINGLE_BATTLE_TEST("Dire Claw cannot poison/paralyze poison/electric types respe u8 statusAnim; u16 species; u32 rng; - #if B_PARALYZE_ELECTRIC >= GEN_6 PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = MOVE_EFFECT_PARALYSIS; species = SPECIES_RAICHU; } - #endif // B_PARALYZE_ELECTRIC PARAMETRIZE { statusAnim = B_ANIM_STATUS_PSN; rng = MOVE_EFFECT_POISON; species = SPECIES_ARBOK; } GIVEN { + WITH_CONFIG(CONFIG_PARALYZE_ELECTRIC, GEN_6); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species); } WHEN { @@ -62,18 +61,16 @@ SINGLE_BATTLE_TEST("Dire Claw cannot poison/paralyze poison/electric types respe } } -SINGLE_BATTLE_TEST("Dire Claw cannot poison/paralyze/cause to fall asleep pokemon with abilities preventing respective statuses") +SINGLE_BATTLE_TEST("Dire Claw cannot poison/paralyze/cause to fall asleep PokΓ©mon with abilities preventing respective statuses") { u8 statusAnim; - u16 species, ability; + u16 species; + enum Ability ability; u32 rng; - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5) - PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = MOVE_EFFECT_PARALYSIS; species = SPECIES_RAICHU; ability = ABILITY_LIGHTNING_ROD; } - PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = MOVE_EFFECT_PARALYSIS; species = SPECIES_JOLTEON; ability = ABILITY_VOLT_ABSORB; } - PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = MOVE_EFFECT_PARALYSIS; species = SPECIES_ELECTIVIRE; ability = ABILITY_MOTOR_DRIVE; } - PARAMETRIZE { statusAnim = B_ANIM_STATUS_PSN; rng = MOVE_EFFECT_POISON; species = SPECIES_ZANGOOSE; ability = ABILITY_IMMUNITY; } - PARAMETRIZE { statusAnim = B_ANIM_STATUS_SLP; rng = MOVE_EFFECT_SLEEP; species = SPECIES_VIGOROTH; ability = ABILITY_VITAL_SPIRIT; } - PARAMETRIZE { statusAnim = B_ANIM_STATUS_SLP; rng = MOVE_EFFECT_SLEEP; species = SPECIES_HYPNO; ability = ABILITY_INSOMNIA; } + PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = MOVE_EFFECT_PARALYSIS; species = SPECIES_PERSIAN; ability = ABILITY_LIMBER; } + PARAMETRIZE { statusAnim = B_ANIM_STATUS_PSN; rng = MOVE_EFFECT_POISON; species = SPECIES_ZANGOOSE; ability = ABILITY_IMMUNITY; } + PARAMETRIZE { statusAnim = B_ANIM_STATUS_SLP; rng = MOVE_EFFECT_SLEEP; species = SPECIES_VIGOROTH; ability = ABILITY_VITAL_SPIRIT; } + PARAMETRIZE { statusAnim = B_ANIM_STATUS_SLP; rng = MOVE_EFFECT_SLEEP; species = SPECIES_HYPNO; ability = ABILITY_INSOMNIA; } GIVEN { PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect_secondary/flame_burst.c b/test/battle/move_effect_secondary/flame_burst.c index df0199e11607..494a7bf9c08a 100644 --- a/test/battle/move_effect_secondary/flame_burst.c +++ b/test/battle/move_effect_secondary/flame_burst.c @@ -22,3 +22,35 @@ DOUBLE_BATTLE_TEST("Flame Burst Substitute") NOT MESSAGE("The substitute took damage for the opposing Wynaut!"); } } + +DOUBLE_BATTLE_TEST("Flame Burst doesn't crash, opponent to player") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentRight, MOVE_FLAME_BURST, target: playerLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLAME_BURST, opponentRight); + HP_BAR(playerRight); + MESSAGE("Wobbuffet fainted!"); + } +} + +DOUBLE_BATTLE_TEST("Flame Burst doesn't crash, player to opponent") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WYNAUT) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_FLAME_BURST, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLAME_BURST, playerLeft); + HP_BAR(opponentRight); + MESSAGE("The opposing Wynaut fainted!"); + } +} diff --git a/test/battle/move_effect_secondary/flinch.c b/test/battle/move_effect_secondary/flinch.c index 517c87cba9c9..41c1910b4f44 100644 --- a/test/battle/move_effect_secondary/flinch.c +++ b/test/battle/move_effect_secondary/flinch.c @@ -69,3 +69,17 @@ SINGLE_BATTLE_TEST("Protect always works when used after flinching") NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_HEADBUTT, opponent); } } + +SINGLE_BATTLE_TEST("Headbutt flinches 30% of the time") +{ + PASSES_RANDOMLY(30, 100, RNG_SECONDARY_EFFECT); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_HEADBUTT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEADBUTT, player); + MESSAGE("The opposing Wobbuffet flinched and couldn't move!"); + } +} diff --git a/test/battle/move_effect_secondary/freeze.c b/test/battle/move_effect_secondary/freeze.c index 645c134a8103..352845766dc0 100644 --- a/test/battle/move_effect_secondary/freeze.c +++ b/test/battle/move_effect_secondary/freeze.c @@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Powder Snow inflicts freeze") } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER_SNOW, player); HP_BAR(opponent); - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRZ, opponent); + ANIMATION(ANIM_TYPE_STATUS, (B_USE_FROSTBITE ? B_ANIM_STATUS_FRB : B_ANIM_STATUS_FRZ), opponent); FREEZE_OR_FROSTBURN_STATUS(opponent, TRUE); } } @@ -32,7 +32,7 @@ SINGLE_BATTLE_TEST("Powder Snow cannot freeze an Ice-type PokΓ©mon") #endif { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SNORUNT].types[0] == TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_SNORUNT, 0) == TYPE_ICE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SNORUNT); } WHEN { @@ -74,7 +74,7 @@ SINGLE_BATTLE_TEST("Freezing Glare shouldn't freeze Psychic-types") #endif { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_ARTICUNO_GALAR].types[0] == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_ARTICUNO_GALAR, 0) == TYPE_PSYCHIC); ASSUME(MoveHasAdditionalEffect(MOVE_FREEZING_GLARE, MOVE_EFFECT_FREEZE_OR_FROSTBITE) == TRUE); ASSUME(GetMoveType(MOVE_FREEZING_GLARE) == TYPE_PSYCHIC); PLAYER(SPECIES_ARTICUNO_GALAR); @@ -85,11 +85,11 @@ SINGLE_BATTLE_TEST("Freezing Glare shouldn't freeze Psychic-types") ANIMATION(ANIM_TYPE_MOVE, MOVE_FREEZING_GLARE, player); HP_BAR(opponent); #if B_STATUS_TYPE_IMMUNITY > GEN_1 - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRZ, opponent); + ANIMATION(ANIM_TYPE_STATUS, (B_USE_FROSTBITE ? B_ANIM_STATUS_FRB : B_ANIM_STATUS_FRZ), opponent); FREEZE_OR_FROSTBURN_STATUS(opponent, TRUE); #else NONE_OF { - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRZ, opponent); + ANIMATION(ANIM_TYPE_STATUS, (B_USE_FROSTBITE ? B_ANIM_STATUS_FRB : B_ANIM_STATUS_FRZ), opponent); FREEZE_OR_FROSTBURN_STATUS(opponent, TRUE); } #endif diff --git a/test/battle/move_effect_secondary/ion_deluge.c b/test/battle/move_effect_secondary/ion_deluge.c index 99683d2a923b..21d37de407ff 100644 --- a/test/battle/move_effect_secondary/ion_deluge.c +++ b/test/battle/move_effect_secondary/ion_deluge.c @@ -50,7 +50,7 @@ SINGLE_BATTLE_TEST("Plasma Fists turns normal moves into electric for the remain SINGLE_BATTLE_TEST("Plasma Fists does not set up Ion Deluge if it does not connect") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_PHANPY].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_PHANPY].types[1] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_PHANPY, 0) == TYPE_GROUND || GetSpeciesType(SPECIES_PHANPY, 1) == TYPE_GROUND); PLAYER(SPECIES_KRABBY); OPPONENT(SPECIES_PHANPY); } WHEN { diff --git a/test/battle/move_effect_secondary/order_up.c b/test/battle/move_effect_secondary/order_up.c index ec6f1c51b533..bfabd6e3e360 100644 --- a/test/battle/move_effect_secondary/order_up.c +++ b/test/battle/move_effect_secondary/order_up.c @@ -140,7 +140,7 @@ DOUBLE_BATTLE_TEST("Order Up is boosted by Sheer Force without removing the stat DOUBLE_BATTLE_TEST("Order Up is always boosted by Sheer Force", s16 damage) { u32 move; - u32 ability; + enum Ability ability; PARAMETRIZE(move = MOVE_CELEBRATE, ability = ABILITY_STORM_DRAIN); PARAMETRIZE(move = MOVE_ENTRAINMENT, ability = ABILITY_STORM_DRAIN); PARAMETRIZE(move = MOVE_ENTRAINMENT, ability = ABILITY_COMMANDER); diff --git a/test/battle/move_effect_secondary/paralysis.c b/test/battle/move_effect_secondary/paralysis.c index 711ca11ee8ac..121d7ac6e9e8 100644 --- a/test/battle/move_effect_secondary/paralysis.c +++ b/test/battle/move_effect_secondary/paralysis.c @@ -21,19 +21,27 @@ SINGLE_BATTLE_TEST("Thunder Shock inflicts paralysis") } } -SINGLE_BATTLE_TEST("Thunder Shock cannot paralyze an Electric-type") +SINGLE_BATTLE_TEST("Thunder Shock cannot paralyze an Electric-type (Gen6+)") { + u32 gen = 0; + PARAMETRIZE { gen = GEN_5; } + PARAMETRIZE { gen = GEN_6; } GIVEN { - ASSUME(B_PARALYZE_ELECTRIC >= GEN_6); - ASSUME(gSpeciesInfo[SPECIES_PIKACHU].types[0] == TYPE_ELECTRIC); + WITH_CONFIG(CONFIG_PARALYZE_ELECTRIC, gen); + ASSUME(GetSpeciesType(SPECIES_PIKACHU, 0) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIKACHU); } WHEN { - TURN { MOVE(player, MOVE_THUNDER_SHOCK); } + TURN { MOVE(player, MOVE_THUNDER_SHOCK, secondaryEffect: TRUE); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDER_SHOCK, player); HP_BAR(opponent); - NONE_OF { + if (gen == GEN_6) { + NONE_OF { + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, opponent); + STATUS_ICON(opponent, paralysis: TRUE); + } + } else { ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, opponent); STATUS_ICON(opponent, paralysis: TRUE); } @@ -47,7 +55,7 @@ SINGLE_BATTLE_TEST("Body Slam shouldn't paralyze Normal-types") #endif { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_TAUROS].types[0] == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_TAUROS, 0) == TYPE_NORMAL); ASSUME(MoveHasAdditionalEffect(MOVE_BODY_SLAM, MOVE_EFFECT_PARALYSIS) == TRUE); ASSUME(GetMoveType(MOVE_BODY_SLAM) == TYPE_NORMAL); PLAYER(SPECIES_TAUROS); diff --git a/test/battle/move_effect_secondary/pay_day.c b/test/battle/move_effect_secondary/pay_day.c index 3b0544a909e6..fc77e862e2c6 100644 --- a/test/battle/move_effect_secondary/pay_day.c +++ b/test/battle/move_effect_secondary/pay_day.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(MoveHasAdditionalEffect(MOVE_PAY_DAY, MOVE_EFFECT_PAYDAY)); + ASSUME(MoveHasAdditionalEffectWithChance(MOVE_PAY_DAY, MOVE_EFFECT_PAYDAY, 0) == TRUE); } SINGLE_BATTLE_TEST("Pay Day Scatters coins around after it hits - singles") diff --git a/test/battle/move_effect_secondary/poison.c b/test/battle/move_effect_secondary/poison.c index 63b2816bfdf2..e201ec83b98b 100644 --- a/test/battle/move_effect_secondary/poison.c +++ b/test/battle/move_effect_secondary/poison.c @@ -25,8 +25,8 @@ SINGLE_BATTLE_TEST("Poison cannot be inflicted on Poison and Steel-type PokΓ©mon PARAMETRIZE { mon = SPECIES_REGISTEEL; } GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_TWINEEDLE, MOVE_EFFECT_POISON) == TRUE); - ASSUME(gSpeciesInfo[SPECIES_NIDORAN_M].types[0] == TYPE_POISON); - ASSUME(gSpeciesInfo[SPECIES_REGISTEEL].types[0] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_NIDORAN_M, 0) == TYPE_POISON); + ASSUME(GetSpeciesType(SPECIES_REGISTEEL, 0) == TYPE_STEEL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(mon); } WHEN { diff --git a/test/battle/move_effect_secondary/recharge.c b/test/battle/move_effect_secondary/recharge.c new file mode 100644 index 000000000000..914608367550 --- /dev/null +++ b/test/battle/move_effect_secondary/recharge.c @@ -0,0 +1,52 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(MoveHasAdditionalEffectSelf(MOVE_METEOR_ASSAULT, MOVE_EFFECT_RECHARGE) == TRUE); +} + +SINGLE_BATTLE_TEST("Recharge moves make the user unable to attack for exactly one turn") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { } + OPPONENT(SPECIES_WOBBUFFET) { } + } WHEN { + TURN { MOVE(player, MOVE_METEOR_ASSAULT);} + TURN { SKIP_TURN(player);} + TURN { MOVE(player, MOVE_TACKLE);} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_METEOR_ASSAULT, player); + MESSAGE("Wobbuffet must recharge!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + } +} + +SINGLE_BATTLE_TEST("Recharge moves don't timeout when all battlers are recharging") +{ + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { } + OPPONENT(SPECIES_WOBBUFFET) { } + } WHEN { + TURN { MOVE(player, MOVE_METEOR_ASSAULT); MOVE(opponent, MOVE_METEOR_ASSAULT);} + } +} + +DOUBLE_BATTLE_TEST("Recharge moves don't timeout when all battlers are recharging (doubles") +{ + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { } + PLAYER(SPECIES_WYNAUT) { } + OPPONENT(SPECIES_WOBBUFFET) { } + OPPONENT(SPECIES_WYNAUT) { } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_METEOR_ASSAULT, target: opponentLeft); + MOVE(playerRight, MOVE_METEOR_ASSAULT, target: opponentRight); + MOVE(opponentLeft, MOVE_METEOR_ASSAULT, target: playerLeft); + MOVE(opponentRight, MOVE_METEOR_ASSAULT, target: playerRight); + } + } +} diff --git a/test/battle/move_effect_secondary/recoil_hp_25.c b/test/battle/move_effect_secondary/recoil_hp_25.c new file mode 100644 index 000000000000..834b55aacee4 --- /dev/null +++ b/test/battle/move_effect_secondary/recoil_hp_25.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Struggle (Secondary Move Effect) test titles") diff --git a/test/battle/move_effect_secondary/reflect.c b/test/battle/move_effect_secondary/reflect.c index 0b1dbf7fd30f..d0ada07926fe 100644 --- a/test/battle/move_effect_secondary/reflect.c +++ b/test/battle/move_effect_secondary/reflect.c @@ -21,8 +21,7 @@ SINGLE_BATTLE_TEST("Baddy Bad sets up Reflect when it was succesful") MOVE(player, MOVE_BADDY_BAD, hit: moveSuccess); } } SCENE { - if (moveSuccess == TRUE) - { + if (moveSuccess == TRUE) { ANIMATION(ANIM_TYPE_MOVE, MOVE_BADDY_BAD, player); MESSAGE("Reflect made your team stronger against physical moves!"); } else { @@ -33,3 +32,5 @@ SINGLE_BATTLE_TEST("Baddy Bad sets up Reflect when it was succesful") } } } + +TO_DO_BATTLE_TEST("Baddy Bad can still damage the target when Reflect is already set up"); diff --git a/test/battle/move_effect_secondary/remove_status.c b/test/battle/move_effect_secondary/remove_status.c index 0ff3d0f78c69..f1219d7ed02f 100644 --- a/test/battle/move_effect_secondary/remove_status.c +++ b/test/battle/move_effect_secondary/remove_status.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Smelling Salts does not cure paralyzed pokemons behind substitutes or get increased power") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_INNER_FOCUS; } PARAMETRIZE { ability = ABILITY_INFILTRATOR; } GIVEN { @@ -62,7 +62,7 @@ SINGLE_BATTLE_TEST("Smelling Salts get incread power vs. paralyzed targets") SINGLE_BATTLE_TEST("Wake-Up Slap does not cure paralyzed pokemons behind substitutes or get increased power") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_INNER_FOCUS; } PARAMETRIZE { ability = ABILITY_INFILTRATOR; } GIVEN { @@ -113,9 +113,12 @@ SINGLE_BATTLE_TEST("Wake-Up Slap gets increased power against sleeping targets") } } +TO_DO_BATTLE_TEST("Wake-Up Slap gets increased power against PokΓ©mon with Comatose") + DOUBLE_BATTLE_TEST("Sparkling Aria cures burns from all Pokemon on the field and behind substitutes") { GIVEN { + ASSUME(MoveIgnoresSubstitute(MOVE_SPARKLING_ARIA)); ASSUME(MoveHasAdditionalEffect(MOVE_SPARKLING_ARIA, MOVE_EFFECT_REMOVE_STATUS) == TRUE); ASSUME(GetMoveEffectArg_Status(MOVE_SPARKLING_ARIA) == STATUS1_BURN); PLAYER(SPECIES_PRIMARINA); diff --git a/test/battle/move_effect_secondary/salt_cure.c b/test/battle/move_effect_secondary/salt_cure.c index 94e3ead5cc76..e304d2d44740 100644 --- a/test/battle/move_effect_secondary/salt_cure.c +++ b/test/battle/move_effect_secondary/salt_cure.c @@ -132,3 +132,19 @@ SINGLE_BATTLE_TEST("If Salt Cure faints the target, messages will be applied in MESSAGE("The opposing Wobbuffet fainted!"); } } + +DOUBLE_BATTLE_TEST("Salt Cure works in double battles") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SALT_CURE, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SALT_CURE, playerLeft); + HP_BAR(opponentLeft); + HP_BAR(opponentLeft); + } +} diff --git a/test/battle/move_effect_secondary/smack_down.c b/test/battle/move_effect_secondary/smack_down.c index c0d0e55eca0c..f31d291dd293 100644 --- a/test/battle/move_effect_secondary/smack_down.c +++ b/test/battle/move_effect_secondary/smack_down.c @@ -47,8 +47,8 @@ SINGLE_BATTLE_TEST("Smack Down does not ground target if target is immune") { GIVEN { ASSUME(GetMoveEffect(MOVE_ELECTRIFY) == EFFECT_ELECTRIFY); - ASSUME(gSpeciesInfo[SPECIES_GLISCOR].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_GLISCOR].types[1] == TYPE_GROUND); - ASSUME(gSpeciesInfo[SPECIES_GLISCOR].types[0] == TYPE_FLYING || gSpeciesInfo[SPECIES_GLISCOR].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_GLISCOR, 0) == TYPE_GROUND || GetSpeciesType(SPECIES_GLISCOR, 1) == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_GLISCOR, 0) == TYPE_FLYING || GetSpeciesType(SPECIES_GLISCOR, 1) == TYPE_FLYING); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GLISCOR); } WHEN { diff --git a/test/battle/move_effect_secondary/spikes.c b/test/battle/move_effect_secondary/spikes.c deleted file mode 100644 index 1aa2630fd796..000000000000 --- a/test/battle/move_effect_secondary/spikes.c +++ /dev/null @@ -1,64 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(MoveHasAdditionalEffect(MOVE_CEASELESS_EDGE, MOVE_EFFECT_SPIKES) == TRUE); -} - -SINGLE_BATTLE_TEST("Ceaseless Edge sets up hazards after hitting the target") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_CEASELESS_EDGE); } - TURN { SWITCH(opponent, 1); } - } SCENE { - s32 maxHP = GetMonData(&OPPONENT_PARTY[1], MON_DATA_MAX_HP); - ANIMATION(ANIM_TYPE_MOVE, MOVE_CEASELESS_EDGE, player); - HP_BAR(opponent); - MESSAGE("Spikes were scattered on the ground all around the opposing team!"); - MESSAGE("2 sent out Wobbuffet!"); - HP_BAR(opponent, damage: maxHP / 8); - MESSAGE("The opposing Wobbuffet was hurt by the spikes!"); - } -} - -SINGLE_BATTLE_TEST("Ceaseless Edge can set up to 3 layers of Spikes") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WYNAUT); - } WHEN { - TURN { MOVE(player, MOVE_CEASELESS_EDGE); } - TURN { MOVE(player, MOVE_CEASELESS_EDGE); } - TURN { MOVE(player, MOVE_CEASELESS_EDGE); } - TURN { MOVE(player, MOVE_CEASELESS_EDGE); } - TURN { SWITCH(opponent, 1); } - } SCENE { - s32 maxHP = GetMonData(&OPPONENT_PARTY[1], MON_DATA_MAX_HP); - - ANIMATION(ANIM_TYPE_MOVE, MOVE_CEASELESS_EDGE, player); - HP_BAR(opponent); - MESSAGE("Spikes were scattered on the ground all around the opposing team!"); - - ANIMATION(ANIM_TYPE_MOVE, MOVE_CEASELESS_EDGE, player); - HP_BAR(opponent); - MESSAGE("Spikes were scattered on the ground all around the opposing team!"); - - ANIMATION(ANIM_TYPE_MOVE, MOVE_CEASELESS_EDGE, player); - HP_BAR(opponent); - MESSAGE("Spikes were scattered on the ground all around the opposing team!"); - - ANIMATION(ANIM_TYPE_MOVE, MOVE_CEASELESS_EDGE, player); - HP_BAR(opponent); - NOT MESSAGE("Spikes were scattered on the ground all around the opposing team!"); - - MESSAGE("2 sent out Wynaut!"); - HP_BAR(opponent, damage: maxHP / 4); - MESSAGE("The opposing Wynaut was hurt by the spikes!"); - } -} diff --git a/test/battle/move_effect_secondary/steal_item.c b/test/battle/move_effect_secondary/steal_item.c deleted file mode 100644 index 8a4ae931d299..000000000000 --- a/test/battle/move_effect_secondary/steal_item.c +++ /dev/null @@ -1,129 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(MoveHasAdditionalEffect(MOVE_THIEF, MOVE_EFFECT_STEAL_ITEM) == TRUE); - ASSUME(MoveHasAdditionalEffect(MOVE_COVET, MOVE_EFFECT_STEAL_ITEM) == TRUE); -} - -SINGLE_BATTLE_TEST("Thief and Covet steal target's held item") -{ - u32 move; - PARAMETRIZE { move = MOVE_THIEF; } - PARAMETRIZE { move = MOVE_COVET; } - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_HYPER_POTION); } - } WHEN { - TURN { MOVE(player, move); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, move, player); - HP_BAR(opponent); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_STEAL, opponent); - } THEN { - EXPECT_EQ(player->item, ITEM_HYPER_POTION); - EXPECT_EQ(opponent->item, ITEM_NONE); - } -} - -SINGLE_BATTLE_TEST("Thief and Covet steal player's held item if opponent is a trainer") -{ - u32 move; - PARAMETRIZE { move = MOVE_THIEF; } - PARAMETRIZE { move = MOVE_COVET; } - GIVEN { - ASSUME(B_TRAINERS_KNOCK_OFF_ITEMS == TRUE); - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_HYPER_POTION); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, move); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, move, opponent); - HP_BAR(player); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_STEAL, player); - } THEN { - EXPECT_EQ(opponent->item, ITEM_HYPER_POTION); - EXPECT_EQ(player->item, ITEM_NONE); - } -} - -WILD_BATTLE_TEST("Thief and Covet don't steal player's held item if opponent is a wild mon") -{ - u32 move; - PARAMETRIZE { move = MOVE_THIEF; } - PARAMETRIZE { move = MOVE_COVET; } - GIVEN { - ASSUME(B_TRAINERS_KNOCK_OFF_ITEMS == TRUE); - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_HYPER_POTION); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, move); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, move, opponent); - HP_BAR(player); - NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_STEAL, player); - } THEN { - EXPECT_EQ(player->item, ITEM_HYPER_POTION); - EXPECT_EQ(opponent->item, ITEM_NONE); - } -} - -SINGLE_BATTLE_TEST("Thief and Covet don't steal target's held item if user is holding an item") -{ - u32 move; - PARAMETRIZE { move = MOVE_THIEF; } - PARAMETRIZE { move = MOVE_COVET; } - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_POTION); } - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_HYPER_POTION); } - } WHEN { - TURN { MOVE(player, move); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, move, player); - HP_BAR(opponent); - NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_STEAL, opponent); - } THEN { - EXPECT_EQ(player->item, ITEM_POTION); - EXPECT_EQ(opponent->item, ITEM_HYPER_POTION); - } -} - -SINGLE_BATTLE_TEST("Thief and Covet don't steal target's held item if target has no item") -{ - u32 move; - PARAMETRIZE { move = MOVE_THIEF; } - PARAMETRIZE { move = MOVE_COVET; } - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, move); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, move, player); - HP_BAR(opponent); - NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_STEAL, opponent); - } -} - -// Test can't currently verify if the item is sent to Bag -WILD_BATTLE_TEST("Thief and Covet steal target's held item and it's added to Bag in wild battles (Gen 9)") -{ - u32 move; - PARAMETRIZE { move = MOVE_THIEF; } - PARAMETRIZE { move = MOVE_COVET; } - GIVEN { - ASSUME(B_STEAL_WILD_ITEMS >= GEN_9); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_HYPER_POTION); } - } WHEN { - TURN { MOVE(player, move); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, move, player); - HP_BAR(opponent); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_STEAL, opponent); - } THEN { - EXPECT_EQ(player->item, ITEM_NONE); - EXPECT_EQ(opponent->item, ITEM_NONE); - } -} diff --git a/test/battle/move_effect_secondary/stealth_rock.c b/test/battle/move_effect_secondary/stealth_rock.c index e9101b659145..026db13e7acd 100644 --- a/test/battle/move_effect_secondary/stealth_rock.c +++ b/test/battle/move_effect_secondary/stealth_rock.c @@ -3,63 +3,19 @@ ASSUMPTIONS { - ASSUME(MoveHasAdditionalEffect(MOVE_STONE_AXE, MOVE_EFFECT_STEALTH_ROCK) == TRUE); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_STONESURGE, MOVE_EFFECT_STEALTH_ROCK)); } -SINGLE_BATTLE_TEST("Stone Axe sets up hazards after hitting the target") +SINGLE_BATTLE_TEST("Steath Rock: Rock from G-Max Stonesurge are set up before any ability activation") { GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); + PLAYER(SPECIES_DREDNAW) { GigantamaxFactor(TRUE); } + OPPONENT(SPECIES_SKARMORY) { Ability(ABILITY_WEAK_ARMOR); } } WHEN { - TURN { MOVE(player, MOVE_STONE_AXE); } - TURN { SWITCH(opponent, 1); } + TURN { MOVE(player, MOVE_WATERFALL, gimmick: GIMMICK_DYNAMAX); } } SCENE { - s32 maxHP = GetMonData(&OPPONENT_PARTY[1], MON_DATA_MAX_HP); - ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_AXE, player); - HP_BAR(opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_G_MAX_STONESURGE, player); MESSAGE("Pointed stones float in the air around the opposing team!"); - MESSAGE("2 sent out Wobbuffet!"); - HP_BAR(opponent, damage: maxHP / 8); - MESSAGE("Pointed stones dug into the opposing Wobbuffet!"); + ABILITY_POPUP(opponent, ABILITY_WEAK_ARMOR); } } - -SINGLE_BATTLE_TEST("Stone Axe can set up pointed stones only once") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WYNAUT); - } WHEN { - TURN { MOVE(player, MOVE_STONE_AXE); } - TURN { MOVE(player, MOVE_STONE_AXE); } - TURN { MOVE(player, MOVE_STONE_AXE); } - TURN { MOVE(player, MOVE_STONE_AXE); } - TURN { SWITCH(opponent, 1); } - } SCENE { - s32 maxHP = GetMonData(&OPPONENT_PARTY[1], MON_DATA_MAX_HP); - - ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_AXE, player); - HP_BAR(opponent); - MESSAGE("Pointed stones float in the air around the opposing team!"); - - ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_AXE, player); - HP_BAR(opponent); - NOT MESSAGE("Pointed stones float in the air around the opposing team!"); - - ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_AXE, player); - HP_BAR(opponent); - NOT MESSAGE("Pointed stones float in the air around the opposing team!"); - - ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_AXE, player); - HP_BAR(opponent); - NOT MESSAGE("Pointed stones float in the air around the opposing team!"); - - MESSAGE("2 sent out Wynaut!"); - HP_BAR(opponent, damage: maxHP / 8); - MESSAGE("Pointed stones dug into the opposing Wynaut!"); - } -} - diff --git a/test/battle/move_effect_secondary/syrup_bomb.c b/test/battle/move_effect_secondary/syrup_bomb.c index 3bb52b6d7061..4cf217206963 100644 --- a/test/battle/move_effect_secondary/syrup_bomb.c +++ b/test/battle/move_effect_secondary/syrup_bomb.c @@ -74,7 +74,7 @@ SINGLE_BATTLE_TEST("Syrup Bomb is prevented by Bulletproof") SINGLE_BATTLE_TEST("Sticky Syrup speed reduction is prevented by Clear Body, White Smoke or Full Metal Body") { u32 species; - u32 ability; + enum Ability ability; PARAMETRIZE { species = SPECIES_BELDUM; ability = ABILITY_CLEAR_BODY; } PARAMETRIZE { species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; } diff --git a/test/battle/move_effect_secondary/thrash.c b/test/battle/move_effect_secondary/thrash.c index 83a49554d741..e7f573d1edc8 100644 --- a/test/battle/move_effect_secondary/thrash.c +++ b/test/battle/move_effect_secondary/thrash.c @@ -114,6 +114,6 @@ SINGLE_BATTLE_TEST("Petal Dance does not lock mons that copy the move with Dance ANIMATION(ANIM_TYPE_MOVE, MOVE_PETAL_DANCE, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_PETAL_DANCE, opponent); // How do you actually test locking? - EXPECT(!(opponent->status2 & STATUS2_MULTIPLETURNS)); + EXPECT(!(opponent->volatiles.multipleTurns)); } } diff --git a/test/battle/move_effect_secondary/trap_both.c b/test/battle/move_effect_secondary/trap_both.c index ec06b25c305c..76d572dad984 100644 --- a/test/battle/move_effect_secondary/trap_both.c +++ b/test/battle/move_effect_secondary/trap_both.c @@ -17,7 +17,7 @@ SINGLE_BATTLE_TEST("Jaw Lock traps both opponents") ANIMATION(ANIM_TYPE_MOVE, MOVE_JAW_LOCK, player); MESSAGE("Neither PokΓ©mon can run away!"); } THEN { // Can't find good way to test trapping - EXPECT(opponent->status2 & STATUS2_ESCAPE_PREVENTION); - EXPECT(player->status2 & STATUS2_ESCAPE_PREVENTION); + EXPECT(opponent->volatiles.escapePrevention); + EXPECT(player->volatiles.escapePrevention); } } diff --git a/test/battle/move_effect_secondary/tri_attack.c b/test/battle/move_effect_secondary/tri_attack.c index e84573dcdf5b..308e3914fde9 100644 --- a/test/battle/move_effect_secondary/tri_attack.c +++ b/test/battle/move_effect_secondary/tri_attack.c @@ -15,7 +15,7 @@ SINGLE_BATTLE_TEST("Tri Attack can inflict paralysis, burn or freeze") u8 statusAnim; PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; } PARAMETRIZE { statusAnim = B_ANIM_STATUS_BRN; } - PARAMETRIZE { statusAnim = B_ANIM_STATUS_FRZ; } + PARAMETRIZE { statusAnim = (B_USE_FROSTBITE ? B_ANIM_STATUS_FRB : B_ANIM_STATUS_FRZ); } PASSES_RANDOMLY(1, 3, RNG_TRI_ATTACK); GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -29,7 +29,7 @@ SINGLE_BATTLE_TEST("Tri Attack can inflict paralysis, burn or freeze") ANIMATION(ANIM_TYPE_STATUS, statusAnim, opponent); if (statusAnim == B_ANIM_STATUS_BRN) { STATUS_ICON(opponent, burn: TRUE); - } else if (statusAnim == B_ANIM_STATUS_FRZ) { + } else if (statusAnim == (B_USE_FROSTBITE ? B_ANIM_STATUS_FRB : B_ANIM_STATUS_FRZ)) { FREEZE_OR_FROSTBURN_STATUS(opponent, TRUE); } else if (statusAnim == B_ANIM_STATUS_PRZ) { STATUS_ICON(opponent, paralysis: TRUE); @@ -46,12 +46,11 @@ SINGLE_BATTLE_TEST("Tri Attack cannot paralyze/burn/freeze electric/fire/ice typ u8 statusAnim; u16 species; u32 rng; - #if B_PARALYZE_ELECTRIC >= GEN_6 PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = MOVE_EFFECT_PARALYSIS; species = SPECIES_RAICHU; } - #endif // B_PARALYZE_ELECTRIC PARAMETRIZE { statusAnim = B_ANIM_STATUS_BRN; rng = MOVE_EFFECT_BURN; species = SPECIES_ARCANINE; } PARAMETRIZE { statusAnim = B_ANIM_STATUS_FRZ; rng = MOVE_EFFECT_FREEZE_OR_FROSTBITE; species = SPECIES_GLALIE; } GIVEN { + WITH_CONFIG(CONFIG_PARALYZE_ELECTRIC, GEN_6); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species); } WHEN { @@ -74,13 +73,14 @@ SINGLE_BATTLE_TEST("Tri Attack cannot paralyze/burn/freeze electric/fire/ice typ } #if B_USE_FROSTBITE == TRUE -SINGLE_BATTLE_TEST("Tri Attack cannot paralyze/burn/frostbite pokemon with abilities preventing respective statuses") +SINGLE_BATTLE_TEST("Tri Attack cannot paralyze/burn/frostbite PokΓ©mon with abilities preventing respective statuses") #else -SINGLE_BATTLE_TEST("Tri Attack cannot paralyze/burn/freeze pokemon with abilities preventing respective statuses") +SINGLE_BATTLE_TEST("Tri Attack cannot paralyze/burn/freeze PokΓ©mon with abilities preventing respective statuses") #endif { u8 statusAnim; - u16 species, ability; + u16 species; + enum Ability ability; u32 rng; PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = MOVE_EFFECT_PARALYSIS; species = SPECIES_PERSIAN; ability = ABILITY_LIMBER; } PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = MOVE_EFFECT_PARALYSIS; species = SPECIES_KOMALA; ability = ABILITY_COMATOSE; } diff --git a/test/battle/move_effect_secondary/will_o_wisp.c b/test/battle/move_effect_secondary/will_o_wisp.c deleted file mode 100644 index 08b1bd6c69e7..000000000000 --- a/test/battle/move_effect_secondary/will_o_wisp.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -TO_DO_BATTLE_TEST("TODO: Write Will-O-Wisp (Move Effect) test titles") diff --git a/test/battle/move_effect_secondary/wrap.c b/test/battle/move_effect_secondary/wrap.c new file mode 100644 index 000000000000..dc05bbe288ec --- /dev/null +++ b/test/battle/move_effect_secondary/wrap.c @@ -0,0 +1,86 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(MoveHasAdditionalEffect(MOVE_WRAP, MOVE_EFFECT_WRAP)); +} + +SINGLE_BATTLE_TEST("Wrap can damage the wrapped mon for 5 turns 50% of the time") +{ + PASSES_RANDOMLY(50, 100, RNG_WRAP); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_WRAP); } + TURN {} + TURN {} + TURN {} + TURN {} + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WRAP, player); + HP_BAR(opponent); // Direct damage + + HP_BAR(opponent); // Residual Damage + HP_BAR(opponent); // Residual Damage + HP_BAR(opponent); // Residual Damage + HP_BAR(opponent); // Residual Damage + HP_BAR(opponent); // Residual Damage + NOT HP_BAR(opponent); // Residual Damage + } +} + +SINGLE_BATTLE_TEST("Wrap can damage the wrapped mon for 4 turns 50% of the time") +{ + PASSES_RANDOMLY(50, 100, RNG_WRAP); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_WRAP); } + TURN {} + TURN {} + TURN {} + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WRAP, player); + HP_BAR(opponent); // Direct damage + + HP_BAR(opponent); // Residual Damage + HP_BAR(opponent); // Residual Damage + HP_BAR(opponent); // Residual Damage + HP_BAR(opponent); // Residual Damage + NOT HP_BAR(opponent); // Residual Damage + } +} + +SINGLE_BATTLE_TEST("Wrap can damage the wrapped mon 7 turns while holding a Grip Claw") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_GRIP_CLAW); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_WRAP); } + TURN {} + TURN {} + TURN {} + TURN {} + TURN {} + TURN {} + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WRAP, player); + HP_BAR(opponent); // Direct damage + + HP_BAR(opponent); // Residual Damage + HP_BAR(opponent); // Residual Damage + HP_BAR(opponent); // Residual Damage + HP_BAR(opponent); // Residual Damage + HP_BAR(opponent); // Residual Damage + HP_BAR(opponent); // Residual Damage + HP_BAR(opponent); // Residual Damage + NOT HP_BAR(opponent); // Residual Damage + } +} diff --git a/test/battle/move_effects_combined/flinch_status.c b/test/battle/move_effects_combined/flinch_status.c index 75c9461880da..0d371707260d 100644 --- a/test/battle/move_effects_combined/flinch_status.c +++ b/test/battle/move_effects_combined/flinch_status.c @@ -32,7 +32,7 @@ SINGLE_BATTLE_TEST("Thunder, Ice and Fire Fang inflict status 10% of the time") ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, opponent); STATUS_ICON(opponent, paralysis: TRUE); } if (move == MOVE_ICE_FANG) { - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRZ, opponent); + ANIMATION(ANIM_TYPE_STATUS, (B_USE_FROSTBITE ? B_ANIM_STATUS_FRB : B_ANIM_STATUS_FRZ), opponent); FREEZE_OR_FROSTBURN_STATUS(opponent, TRUE); } if (move == MOVE_FIRE_FANG) { ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponent); diff --git a/test/battle/move_effects_combined/hurricane.c b/test/battle/move_effects_combined/hurricane.c index 91a3435cf4dd..96773ce585bd 100644 --- a/test/battle/move_effects_combined/hurricane.c +++ b/test/battle/move_effects_combined/hurricane.c @@ -41,9 +41,9 @@ SINGLE_BATTLE_TEST("Hurricane can hit airborne targets (Fly, Bounce)") PARAMETRIZE { move = MOVE_BOUNCE; } GIVEN { ASSUME(GetMoveEffect(MOVE_FLY) == EFFECT_SEMI_INVULNERABLE); - ASSUME(GetMoveTwoTurnAttackStatus(MOVE_FLY) == STATUS3_ON_AIR); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_FLY) == STATE_ON_AIR); ASSUME(GetMoveEffect(MOVE_BOUNCE) == EFFECT_SEMI_INVULNERABLE); - ASSUME(GetMoveTwoTurnAttackStatus(MOVE_BOUNCE) == STATUS3_ON_AIR); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_BOUNCE) == STATE_ON_AIR); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Moves(move); } } WHEN { @@ -59,7 +59,7 @@ DOUBLE_BATTLE_TEST("Hurricane can hit airborne targets (Sky Drop)") { GIVEN { ASSUME(GetMoveEffect(MOVE_SKY_DROP) == EFFECT_SKY_DROP); - ASSUME(GetMoveTwoTurnAttackStatus(MOVE_SKY_DROP) == STATUS3_ON_AIR); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_SKY_DROP) == STATE_ON_AIR); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effects_combined/make_it_rain.c b/test/battle/move_effects_combined/make_it_rain.c index e0e00015a489..655a34f8bebd 100644 --- a/test/battle/move_effects_combined/make_it_rain.c +++ b/test/battle/move_effects_combined/make_it_rain.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(MoveHasAdditionalEffect(MOVE_MAKE_IT_RAIN, MOVE_EFFECT_PAYDAY)); + ASSUME(MoveHasAdditionalEffectWithChance(MOVE_MAKE_IT_RAIN, MOVE_EFFECT_PAYDAY, 0) == TRUE); ASSUME(MoveHasAdditionalEffectSelf(MOVE_MAKE_IT_RAIN, MOVE_EFFECT_SP_ATK_MINUS_1)); } diff --git a/test/battle/move_effect/mind_blown.c b/test/battle/move_effects_combined/mind_blown.c similarity index 98% rename from test/battle/move_effect/mind_blown.c rename to test/battle/move_effects_combined/mind_blown.c index 0a3419877773..79ce35d126f7 100644 --- a/test/battle/move_effect/mind_blown.c +++ b/test/battle/move_effects_combined/mind_blown.c @@ -3,7 +3,8 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_MIND_BLOWN) == EFFECT_MIND_BLOWN); + ASSUME(GetMoveEffect(MOVE_MIND_BLOWN) == EFFECT_MAX_HP_50_RECOIL); + ASSUME(IsMoveDampBanned(MOVE_MIND_BLOWN)); } SINGLE_BATTLE_TEST("Mind Blown makes the user lose 1/2 of its Max HP") diff --git a/test/battle/move_effects_combined/relic_song.c b/test/battle/move_effects_combined/relic_song.c new file mode 100644 index 000000000000..dec92f069e79 --- /dev/null +++ b/test/battle/move_effects_combined/relic_song.c @@ -0,0 +1,69 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(MoveHasAdditionalEffect(MOVE_RELIC_SONG, MOVE_EFFECT_SLEEP) == TRUE); +} + +SINGLE_BATTLE_TEST("Relic Song has a 10% chance to put the target to sleep") +{ + PASSES_RANDOMLY(10, 100, RNG_SECONDARY_EFFECT); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_RELIC_SONG); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + STATUS_ICON(opponent, sleep: TRUE); + } +} + +SINGLE_BATTLE_TEST("Relic Song is prevented by Soundproof") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_VOLTORB) { Ability(ABILITY_SOUNDPROOF); } + } WHEN { + TURN { MOVE(player, MOVE_RELIC_SONG); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_SOUNDPROOF); + MESSAGE("The opposing Voltorb's Soundproof blocks Relic Song!"); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); + HP_BAR(opponent); + } + } +} + +SINGLE_BATTLE_TEST("Relic Song will become a Water-type move when used by a PokΓ©mon with the Ability Liquid Voice") +{ + GIVEN { + PLAYER(SPECIES_VULPIX); + OPPONENT(SPECIES_POPPLIO) { Ability(ABILITY_LIQUID_VOICE); } + } WHEN { + TURN { MOVE(opponent, MOVE_RELIC_SONG); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, opponent); + HP_BAR(player); + MESSAGE("It's super effective!"); + } +} + +SINGLE_BATTLE_TEST("Relic Song is blocked by Throat Chop") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_THROAT_CHOP); MOVE(player, MOVE_RELIC_SONG); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_THROAT_CHOP, opponent); + HP_BAR(player); + MESSAGE("The effects of Throat Chop prevent Wobbuffet from using certain moves!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); + } +} diff --git a/test/battle/move_effects_combined/toxic_thread.c b/test/battle/move_effects_combined/toxic_thread.c new file mode 100644 index 000000000000..ec27f4636588 --- /dev/null +++ b/test/battle/move_effects_combined/toxic_thread.c @@ -0,0 +1,165 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_TOXIC_THREAD) == EFFECT_TOXIC_THREAD); +} + +SINGLE_BATTLE_TEST("Toxic Thread both reduces speed and inflicts Poison") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TOXIC_THREAD); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_THREAD, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + STATUS_ICON(opponent, poison: TRUE); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + } +} + +SINGLE_BATTLE_TEST("Toxic Thread still inflicts Poison if speed can't go lower") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SCARY_FACE) == EFFECT_SPEED_DOWN_2); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SCARY_FACE); } + TURN { MOVE(player, MOVE_SCARY_FACE); } + TURN { MOVE(player, MOVE_SCARY_FACE); } + TURN { MOVE(player, MOVE_TOXIC_THREAD); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCARY_FACE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCARY_FACE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCARY_FACE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_THREAD, player); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + STATUS_ICON(opponent, poison: TRUE); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 6); + } +} + +SINGLE_BATTLE_TEST("Toxic Thread still inflicts Poison if speed can't be lowered") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_REGICE) { Ability(ABILITY_CLEAR_BODY); } + } WHEN { + TURN { MOVE(player, MOVE_TOXIC_THREAD); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_THREAD, player); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + STATUS_ICON(opponent, poison: TRUE); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); + } +} + +SINGLE_BATTLE_TEST("Toxic Thread still lowers speed if the target can't be Poisoned") +{ + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_BRONZOR].types[0] == TYPE_STEEL || gSpeciesInfo[SPECIES_BRONZOR].types[1] == TYPE_STEEL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_BRONZOR); + } WHEN { + TURN { MOVE(player, MOVE_TOXIC_THREAD); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_THREAD, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + NOT ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + } +} + +SINGLE_BATTLE_TEST("Toxic Thread still lowers speed if the target is already Poisoned") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_POISON_POWDER) == MOVE_EFFECT_POISON); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_POISON_POWDER); } + TURN { MOVE(player, MOVE_TOXIC_THREAD); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POISON_POWDER, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + STATUS_ICON(opponent, poison: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_THREAD, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + } +} + +SINGLE_BATTLE_TEST("Toxic Thread fails if speed can't be lowered and status can't be inflicted") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_POISON_POWDER) == MOVE_EFFECT_POISON); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SCARY_FACE); } + TURN { MOVE(player, MOVE_SCARY_FACE); } + TURN { MOVE(player, MOVE_SCARY_FACE); } + TURN { MOVE(player, MOVE_POISON_POWDER); } + TURN { MOVE(player, MOVE_TOXIC_THREAD); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCARY_FACE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCARY_FACE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCARY_FACE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POISON_POWDER, player); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_THREAD, player); + } +} + +SINGLE_BATTLE_TEST("Toxic Thread fails if speed can't be lowered due to Clear Body and status can't be inflicted") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_POISON_POWDER) == MOVE_EFFECT_POISON); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_REGICE) { Ability(ABILITY_CLEAR_BODY); } + } WHEN { + TURN { MOVE(player, MOVE_POISON_POWDER); } + TURN { MOVE(player, MOVE_TOXIC_THREAD); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POISON_POWDER, player); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_THREAD, player); + } +} + +SINGLE_BATTLE_TEST("Toxic Thread fails if speed can't be lowered and target is a poison type") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_POISON_POWDER) == MOVE_EFFECT_POISON); + ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_POISON || gSpeciesInfo[SPECIES_ODDISH].types[1] == TYPE_POISON); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ODDISH); + } WHEN { + TURN { MOVE(player, MOVE_SCARY_FACE); } + TURN { MOVE(player, MOVE_SCARY_FACE); } + TURN { MOVE(player, MOVE_SCARY_FACE); } + TURN { MOVE(player, MOVE_TOXIC_THREAD); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCARY_FACE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCARY_FACE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCARY_FACE, player); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_THREAD, player); + } +} diff --git a/test/battle/move_effects_combined/triple_arrows.c b/test/battle/move_effects_combined/triple_arrows.c index 70414e51c4ac..f9e0e550b8a3 100644 --- a/test/battle/move_effects_combined/triple_arrows.c +++ b/test/battle/move_effects_combined/triple_arrows.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Triple Arrows may lower Defense by one stage") { - u32 ability; + enum Ability ability; u32 chance; PARAMETRIZE { ability = ABILITY_HUSTLE; chance = 50; } PARAMETRIZE { ability = ABILITY_SERENE_GRACE; chance = 100; } @@ -28,7 +28,7 @@ SINGLE_BATTLE_TEST("Triple Arrows may lower Defense by one stage") SINGLE_BATTLE_TEST("Triple Arrows makes the foe flinch 30% of the time") { - u32 ability; + enum Ability ability; u32 chance; PARAMETRIZE { ability = ABILITY_HUSTLE; chance = 30; } PARAMETRIZE { ability = ABILITY_SERENE_GRACE; chance = 60; } @@ -54,7 +54,7 @@ SINGLE_BATTLE_TEST("Triple Arrows has an increased critical hit ratio") } PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_TRIPLE_ARROWS) == 1); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_flags/always_hits_in_rain.c b/test/battle/move_flags/always_hits_in_rain.c index c4c5b5138b91..4703052716a9 100644 --- a/test/battle/move_flags/always_hits_in_rain.c +++ b/test/battle/move_flags/always_hits_in_rain.c @@ -1,15 +1,21 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Thunder bypasses accuracy checks in Rain") +SINGLE_BATTLE_TEST("Thunder and Bleakwind/Wildbolt/Sandsear Storm bypass accuracy checks in Rain") { + u32 move; + PARAMETRIZE { move = MOVE_THUNDER; } + PARAMETRIZE { move = MOVE_BLEAKWIND_STORM; } + PARAMETRIZE { move = MOVE_WILDBOLT_STORM; } + PARAMETRIZE { move = MOVE_SANDSEAR_STORM; } PASSES_RANDOMLY(100, 100, RNG_ACCURACY); GIVEN { - ASSUME(MoveAlwaysHitsInRain(MOVE_THUNDER) == TRUE); + ASSUME(GetMoveAccuracy(move) < 100 && GetMoveAccuracy(move) > 0); + ASSUME(MoveAlwaysHitsInRain(move) == TRUE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(opponent, MOVE_RAIN_DANCE); MOVE(player, MOVE_THUNDER); } + TURN { MOVE(opponent, MOVE_RAIN_DANCE); MOVE(player, move); } } SCENE { NONE_OF { MESSAGE("Wobbuffet's attack missed!"); } } diff --git a/test/battle/move_flags/cant_use_twice.c b/test/battle/move_flags/cant_use_twice.c index cba5596d267d..1945a2b19866 100644 --- a/test/battle/move_flags/cant_use_twice.c +++ b/test/battle/move_flags/cant_use_twice.c @@ -32,6 +32,7 @@ SINGLE_BATTLE_TEST("Moves with the cantUseTwice flag strike again if fast encore PARAMETRIZE { move = MOVE_GIGATON_HAMMER; } PARAMETRIZE { move = MOVE_BLOOD_MOON; } GIVEN { + WITH_CONFIG(CONFIG_ENCORE_TARGET, GEN_3); ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_flags/critical_hit_stage.c b/test/battle/move_flags/critical_hit_stage.c index 02999e9a8aa4..0712d49acee4 100644 --- a/test/battle/move_flags/critical_hit_stage.c +++ b/test/battle/move_flags/critical_hit_stage.c @@ -11,9 +11,9 @@ SINGLE_BATTLE_TEST("criticalHitStage set to 1 increases critical hits occur at a } PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_SLASH) == 1); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseSpeed == 33); + ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_flags/ignores_target_ability.c b/test/battle/move_flags/ignores_target_ability.c index 25e0f9a20fb8..4a533e7a0835 100644 --- a/test/battle/move_flags/ignores_target_ability.c +++ b/test/battle/move_flags/ignores_target_ability.c @@ -10,7 +10,8 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("ignoresTargetAbility moves do not ignore the attacker's own ability", s16 damage) { - u32 ability, move; + enum Ability ability; + u32 move; PARAMETRIZE { move = MOVE_SUNSTEEL_STRIKE; ability = ABILITY_MAGIC_GUARD; } PARAMETRIZE { move = MOVE_SUNSTEEL_STRIKE; ability = ABILITY_UNAWARE; } @@ -47,7 +48,8 @@ SINGLE_BATTLE_TEST("ignoresTargetAbility moves do not ignore the attacker's own SINGLE_BATTLE_TEST("ignoresTargetAbility moves do ignore target's abilities", s16 damage) { - u32 ability, move; + enum Ability ability; + u32 move; PARAMETRIZE { move = MOVE_SUNSTEEL_STRIKE; ability = ABILITY_INNER_FOCUS; } PARAMETRIZE { move = MOVE_SUNSTEEL_STRIKE; ability = ABILITY_MULTISCALE; } @@ -76,7 +78,7 @@ SINGLE_BATTLE_TEST("ignoresTargetAbility moves do ignore target's abilities", s1 SINGLE_BATTLE_TEST("ignoresTargetAbility allows PokΓ©mon with Battle Armor and Shell Armor to receive critical hits") { u32 species; - u32 ability; + enum Ability ability; PARAMETRIZE { species = SPECIES_KINGLER; ability = ABILITY_SHELL_ARMOR; } PARAMETRIZE { species = SPECIES_ARMALDO; ability = ABILITY_BATTLE_ARMOR; } diff --git a/test/battle/move_flags/powder.c b/test/battle/move_flags/powder.c index 04920f79f303..bb109a252e81 100644 --- a/test/battle/move_flags/powder.c +++ b/test/battle/move_flags/powder.c @@ -1,17 +1,26 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Powder moves are blocked by Grass-type PokΓ©mon") +SINGLE_BATTLE_TEST("Powder moves are blocked by Grass-type PokΓ©mon (Gen6+)") { + u32 gen = 0; + PARAMETRIZE { gen = GEN_5; } + PARAMETRIZE { gen = GEN_6; } GIVEN { + WITH_CONFIG(CONFIG_POWDER_GRASS, gen); ASSUME(IsPowderMove(MOVE_STUN_SPORE)); - ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_ODDISH); } WHEN { TURN { MOVE(player, MOVE_STUN_SPORE); } } SCENE { - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_STUN_SPORE, player); - MESSAGE("It doesn't affect the opposing Oddish…"); + if (gen == GEN_6) { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_STUN_SPORE, player); + MESSAGE("It doesn't affect the opposing Oddish…"); + } else { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STUN_SPORE, player); + NOT MESSAGE("It doesn't affect the opposing Oddish…"); + } } } diff --git a/test/battle/move_flags/recoil.c b/test/battle/move_flags/recoil.c index 42b8b1a76b8c..7a71187c828a 100644 --- a/test/battle/move_flags/recoil.c +++ b/test/battle/move_flags/recoil.c @@ -102,3 +102,38 @@ SINGLE_BATTLE_TEST("Recoil: Flare Blitz is absorbed by Flash Fire and no recoil } } } + +SINGLE_BATTLE_TEST("Recoil: The correct amount of recoil damage is dealt after targets recovery berry proc") +{ + s16 directDamage; + s16 recoilDamage; + + GIVEN { + ASSUME(GetMoveRecoil(MOVE_TAKE_DOWN) == 25); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); }; + } WHEN { + TURN { MOVE(player, MOVE_TAKE_DOWN); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TAKE_DOWN, player); + HP_BAR(opponent, captureDamage: &directDamage); + HP_BAR(player, captureDamage: &recoilDamage); + } THEN { + EXPECT_MUL_EQ(directDamage, UQ_4_12(0.25), recoilDamage); + } +} + +SINGLE_BATTLE_TEST("Recoil: No recoil is taken if the move is blocked by Disguise") +{ + GIVEN { + ASSUME(GetMoveRecoil(MOVE_FLARE_BLITZ) > 0); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_MIMIKYU) { Ability(ABILITY_DISGUISE); } + } WHEN { + TURN { MOVE(player, MOVE_FLARE_BLITZ); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLARE_BLITZ, player); + } THEN { + EXPECT_EQ(player->hp, player->maxHP); + } +} diff --git a/test/battle/sleep_clause.c b/test/battle/sleep_clause.c index c2c74314e5d6..085bd05fda67 100644 --- a/test/battle/sleep_clause.c +++ b/test/battle/sleep_clause.c @@ -690,7 +690,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo ASSUME(GetMoveEffect(MOVE_UPROAR) == EFFECT_UPROAR); PLAYER(SPECIES_ZIGZAGOON); PLAYER(SPECIES_ZIGZAGOON); - PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_CELEBRATE); } OPPONENT(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); } WHEN { @@ -1035,7 +1035,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is woken up by gaining the ability Insomnia / Vital Spirit") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_VITAL_SPIRIT; } PARAMETRIZE { ability = ABILITY_INSOMNIA; } GIVEN { @@ -1072,9 +1072,10 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is sent out, has Trace, and Traces Insomnia / Vital spirit") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_VITAL_SPIRIT; } PARAMETRIZE { ability = ABILITY_INSOMNIA; } + GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); @@ -1109,7 +1110,7 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is sent out and transforms into a mon with Insomnia / Vital spirit") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_VITAL_SPIRIT; } PARAMETRIZE { ability = ABILITY_INSOMNIA; } KNOWN_FAILING; // Sleep Clause parts work, but Imposter seems broken with battle messages / targeting. Issue #5565 https://github.com/rh-hideout/pokeemerald-expansion/issues/5565 @@ -1403,7 +1404,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Waking up after Rest doesn't deactivate sleep SINGLE_BATTLE_TEST("Sleep Clause: Suppressing and then sleeping Vital Spirit / Insomnia and switching back in deactivates sleep clause") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_VITAL_SPIRIT; } PARAMETRIZE { ability = ABILITY_INSOMNIA; } GIVEN { @@ -1434,7 +1435,7 @@ SINGLE_BATTLE_TEST("Sleep Clause: Suppressing and then sleeping Vital Spirit / I SINGLE_BATTLE_TEST("Sleep Clause: Mold Breaker PokΓ©mon sleeping Vital Spirit / Insomnia activates sleep clause") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_VITAL_SPIRIT; } PARAMETRIZE { ability = ABILITY_INSOMNIA; } GIVEN { @@ -1771,6 +1772,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep Clause does not prevent sleeping your pa DOUBLE_BATTLE_TEST("Sleep Clause: Sleep moves used after being Encore'd are prevented when sleep clause is active") { GIVEN { + WITH_CONFIG(CONFIG_ENCORE_TARGET, GEN_3); FLAG_SET(B_FLAG_SLEEP_CLAUSE); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); diff --git a/test/battle/spread_moves.c b/test/battle/spread_moves.c index 869d5bbebb4a..68b9f40273d1 100644 --- a/test/battle/spread_moves.c +++ b/test/battle/spread_moves.c @@ -83,7 +83,7 @@ DOUBLE_BATTLE_TEST("Spread Moves: A spread move attack will activate both resist } } -DOUBLE_BATTLE_TEST("Spread Moves: If a spread move attack will activate a resist berries on one pokemon, only the damage for that mon will be reduced") +DOUBLE_BATTLE_TEST("Spread Moves: If a spread move attack will activate a resist berries on one PokΓ©mon, only the damage for that mon will be reduced") { s16 opponentLeftDmg[2]; s16 opponentRightDmg[2]; @@ -172,6 +172,7 @@ DOUBLE_BATTLE_TEST("Spread Moves: A spread move attack will be weakened by stron DOUBLE_BATTLE_TEST("Spread Moves: AOE move vs Disguise, Volt Absorb (right) and Lightning Rod (left)") { GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_DISCHARGE) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); @@ -188,9 +189,10 @@ DOUBLE_BATTLE_TEST("Spread Moves: AOE move vs Disguise, Volt Absorb (right) and } } -DOUBLE_BATTLE_TEST("Spread Moves: AOE move vs Disguise, Volt Absorb (left) and Lightning Rod (reft)") +DOUBLE_BATTLE_TEST("Spread Moves: AOE move vs Disguise, Volt Absorb (left) and Lightning Rod (right)") { GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_DISCHARGE) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); @@ -433,3 +435,23 @@ DOUBLE_BATTLE_TEST("Spread Moves: Unless move hits every target user will not in MESSAGE("It's super effective on the opposing Torkoal and Torkoal!"); } } + +DOUBLE_BATTLE_TEST("Spread Moves: Focus Sash activates correctly") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT) { HP(2); MaxHP(2); Item(ITEM_FOCUS_SASH); } + OPPONENT(SPECIES_WOBBUFFET) { HP(2); MaxHP(2); Item(ITEM_FOCUS_SASH); } + OPPONENT(SPECIES_WYNAUT) { HP(2); MaxHP(2); Item(ITEM_FOCUS_SASH); } + } WHEN { + TURN { MOVE(playerRight, MOVE_HYPER_VOICE); MOVE(playerLeft, MOVE_EXPLOSION); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerRight); + MESSAGE("The opposing Wynaut hung on using its Focus Sash!"); + MESSAGE("The opposing Wobbuffet hung on using its Focus Sash!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, playerLeft); + MESSAGE("The opposing Wobbuffet fainted!"); + MESSAGE("Wynaut hung on using its Focus Sash!"); + MESSAGE("The opposing Wynaut fainted!"); + } +} diff --git a/test/battle/starting_status/terrain.c b/test/battle/starting_status/terrain.c index ab31bbbb9634..3d84dba00061 100644 --- a/test/battle/starting_status/terrain.c +++ b/test/battle/starting_status/terrain.c @@ -29,19 +29,20 @@ SINGLE_BATTLE_TEST("B_VAR_STARTING_STATUS starts a chosen terrain at the beginni TURN { ; } TURN { ; } } SCENE { - switch (terrain) { - case STARTING_STATUS_GRASSY_TERRAIN: - MESSAGE("Grass grew to cover the battlefield!"); - break; - case STARTING_STATUS_PSYCHIC_TERRAIN: - MESSAGE("The battlefield got weird!"); - break; - case STARTING_STATUS_MISTY_TERRAIN: - MESSAGE("Mist swirled around the battlefield!"); - break; - case STARTING_STATUS_ELECTRIC_TERRAIN: - MESSAGE("An electric current is running across the battlefield!"); - break; + switch (terrain) + { + case STARTING_STATUS_GRASSY_TERRAIN: + MESSAGE("The battlefield is covered with grass!"); + break; + case STARTING_STATUS_PSYCHIC_TERRAIN: + MESSAGE("The battlefield seems weird!"); + break; + case STARTING_STATUS_MISTY_TERRAIN: + MESSAGE("Mist swirls around the battlefield!"); + break; + case STARTING_STATUS_ELECTRIC_TERRAIN: + MESSAGE("An electric current is running across the battlefield!"); + break; } ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_RESTORE_BG); NONE_OF { diff --git a/test/battle/status1/burn.c b/test/battle/status1/burn.c index 689338cce8a5..33eae7bd85f9 100644 --- a/test/battle/status1/burn.c +++ b/test/battle/status1/burn.c @@ -7,10 +7,13 @@ ASSUMPTIONS ASSUME(GetMoveNonVolatileStatus(MOVE_WILL_O_WISP) == MOVE_EFFECT_BURN); } -SINGLE_BATTLE_TEST("Burn deals 1/16th (Gen7+) or 1/8th damage per turn") +SINGLE_BATTLE_TEST("Burn deals 1/8th damage (Gen1-6) or 1/16th (Gen7+) per turn") { - u32 j; + u32 j, config, value; + PARAMETRIZE { config = GEN_7; value = 16; } + PARAMETRIZE { config = GEN_6; value = 8; } GIVEN { + WITH_CONFIG(CONFIG_BURN_DAMAGE, config); PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -19,7 +22,7 @@ SINGLE_BATTLE_TEST("Burn deals 1/16th (Gen7+) or 1/8th damage per turn") } SCENE { s32 maxHP = GetMonData(&PLAYER_PARTY[0], MON_DATA_MAX_HP); for (j = 0; j < 4; j++) - HP_BAR(player, damage: maxHP / ((B_BURN_DAMAGE >= GEN_7) ? 16 : 8)); + HP_BAR(player, damage: maxHP / value); } } @@ -74,7 +77,8 @@ SINGLE_BATTLE_TEST("Will-O-Wisp can't burn a fire type") AI_SINGLE_BATTLE_TEST("AI avoids Will-o-Wisp when it can not burn target") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_BUIZEL; ability = ABILITY_WATER_VEIL; } PARAMETRIZE { species = SPECIES_DEWPIDER; ability = ABILITY_WATER_BUBBLE; } diff --git a/test/battle/status1/frostbite.c b/test/battle/status1/frostbite.c index f45508f800b9..9ae86a873817 100644 --- a/test/battle/status1/frostbite.c +++ b/test/battle/status1/frostbite.c @@ -23,20 +23,25 @@ SINGLE_BATTLE_TEST("Frostbite reduces the special attack by 50 percent") } THEN { EXPECT_EQ(reducedDamage * 2, normaleDamage); } } -SINGLE_BATTLE_TEST("Frostbite deals 1/16th (Gen7+) or 1/8th damage to affected pokemon") +SINGLE_BATTLE_TEST("Frostbite deals 1/8th damage (Gen1-6) or 1/16th (Gen7+) per turn") { s16 frostbiteDamage; - + u32 config, value; + PARAMETRIZE { config = GEN_7; value = 16; } + PARAMETRIZE { config = GEN_6; value = 8; } GIVEN { + WITH_CONFIG(CONFIG_BURN_DAMAGE, config); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_FROSTBITE); } } WHEN { TURN {} } SCENE { MESSAGE("The opposing Wobbuffet was hurt by its frostbite!"); - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRZ, opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRB, opponent); HP_BAR(opponent, captureDamage: &frostbiteDamage); - } THEN { EXPECT_EQ(frostbiteDamage, opponent->maxHP / ((B_BURN_DAMAGE >= GEN_7) ? 16 : 8)); } + } THEN { + EXPECT_EQ(frostbiteDamage, opponent->maxHP / value); + } } SINGLE_BATTLE_TEST("Frostbite is healed if hit with a thawing move") @@ -86,11 +91,11 @@ SINGLE_BATTLE_TEST("Frostbite is healed when the user uses a thawing move") HP_BAR(opponent); if (move == MOVE_EMBER) { MESSAGE("Wobbuffet was hurt by its frostbite!"); - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRZ, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRB, player); } else { NONE_OF { MESSAGE("Wobbuffet was hurt by its frostbite!"); - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRZ, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRB, player); } } } diff --git a/test/battle/status1/paralysis.c b/test/battle/status1/paralysis.c index 64ed27f3615c..fa78387af779 100644 --- a/test/battle/status1/paralysis.c +++ b/test/battle/status1/paralysis.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Paralysis reduces Speed by 50% (Gen 7+) or 75% (Gen 1-6)") PARAMETRIZE { playerSpeed = 98; playerFirst = FALSE; genConfig = GEN_7; } PARAMETRIZE { playerSpeed = 102; playerFirst = TRUE; genConfig = GEN_7; } GIVEN { - WITH_CONFIG(GEN_CONFIG_PARALYSIS_SPEED, genConfig); + WITH_CONFIG(CONFIG_PARALYSIS_SPEED, genConfig); PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_PARALYSIS); Speed(playerSpeed); } OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } } WHEN { @@ -47,7 +47,8 @@ SINGLE_BATTLE_TEST("Paralysis has a 25% chance of skipping the turn") AI_SINGLE_BATTLE_TEST("AI avoids Thunder Wave when it can not paralyse target") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_HITMONLEE; ability = ABILITY_LIMBER; } PARAMETRIZE { species = SPECIES_KOMALA; ability = ABILITY_COMATOSE; } @@ -55,6 +56,7 @@ AI_SINGLE_BATTLE_TEST("AI avoids Thunder Wave when it can not paralyse target") PARAMETRIZE { species = SPECIES_PIKACHU; ability = ABILITY_STATIC; } GIVEN { + WITH_CONFIG(CONFIG_PARALYZE_ELECTRIC, GEN_6); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); PLAYER(species) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_THUNDER_WAVE); } @@ -63,17 +65,43 @@ AI_SINGLE_BATTLE_TEST("AI avoids Thunder Wave when it can not paralyse target") } } -SINGLE_BATTLE_TEST("Thunder Wave doesn't affect Electric types in Gen6+") +SINGLE_BATTLE_TEST("Thunder Wave doesn't affect Electric types (Gen6+)") { + u32 gen = 0; + PARAMETRIZE { gen = GEN_5; } + PARAMETRIZE { gen = GEN_6; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_PIKACHU].types[0] == TYPE_ELECTRIC); - ASSUME(B_PARALYZE_ELECTRIC >= GEN_6); + WITH_CONFIG(CONFIG_PARALYZE_ELECTRIC, gen); + ASSUME(GetSpeciesType(SPECIES_PIKACHU, 0) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIKACHU); } WHEN { TURN { MOVE(player, MOVE_THUNDER_WAVE); } } SCENE { MESSAGE("Wobbuffet used Thunder Wave!"); - MESSAGE("It doesn't affect the opposing Pikachu…"); + if (gen == GEN_6) { + NONE_OF { + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, opponent); + STATUS_ICON(opponent, paralysis: TRUE); + } + MESSAGE("It doesn't affect the opposing Pikachu…"); + } else { + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, opponent); + STATUS_ICON(opponent, paralysis: TRUE); + } + } +} + +SINGLE_BATTLE_TEST("Thunder Wave doesn't print an effectiveness message") +{ + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_PIDGEY].types[1] == TYPE_FLYING); + PLAYER(SPECIES_PIDGEY); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_THUNDER_WAVE); } + } SCENE { + MESSAGE("The opposing Wobbuffet used Thunder Wave!"); + NOT MESSAGE("It's super effective!"); } } diff --git a/test/battle/status1/poison.c b/test/battle/status1/poison.c index 0a749ea96d16..97b87825906e 100644 --- a/test/battle/status1/poison.c +++ b/test/battle/status1/poison.c @@ -27,7 +27,6 @@ SINGLE_BATTLE_TEST("Poison can't bad poison a poison or steel type") GIVEN { ASSUME(GetMoveEffect(MOVE_POISON_GAS) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_POISON_GAS) == MOVE_EFFECT_POISON); - ASSUME(GetMoveNonVolatileStatus(MOVE_POISON_GAS) == MOVE_EFFECT_POISON); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species); } WHEN { diff --git a/test/battle/status1/sleep.c b/test/battle/status1/sleep.c index 401c0d0bcd82..5cb60668b9d3 100644 --- a/test/battle/status1/sleep.c +++ b/test/battle/status1/sleep.c @@ -22,11 +22,25 @@ SINGLE_BATTLE_TEST("Sleep prevents the battler from using a move") } } -SINGLE_BATTLE_TEST("Sleep: Spore doesn't affect grass types (Gen 6+)") +SINGLE_BATTLE_TEST("Sleep: Spore affects grass types (Gen1-5)") { GIVEN { + WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_5); + ASSUME(IsPowderMove(MOVE_SPORE)); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_CHIKORITA); + } WHEN { + TURN { MOVE(player, MOVE_SPORE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + } +} + +SINGLE_BATTLE_TEST("Sleep: Spore doesn't affect grass types (Gen6+)") +{ + GIVEN { + WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); ASSUME(IsPowderMove(MOVE_SPORE)); - ASSUME(B_POWDER_GRASS >= GEN_6); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_CHIKORITA); } WHEN { @@ -38,7 +52,8 @@ SINGLE_BATTLE_TEST("Sleep: Spore doesn't affect grass types (Gen 6+)") AI_SINGLE_BATTLE_TEST("AI avoids hypnosis when it can not put target to sleep") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_HOOTHOOT; ability = ABILITY_INSOMNIA; } PARAMETRIZE { species = SPECIES_MANKEY; ability = ABILITY_VITAL_SPIRIT; } diff --git a/test/battle/switch_in_abilities.c b/test/battle/switch_in_abilities.c index c8a8c54dd3d9..4d125ddce8ca 100644 --- a/test/battle/switch_in_abilities.c +++ b/test/battle/switch_in_abilities.c @@ -126,3 +126,124 @@ DOUBLE_BATTLE_TEST("Switch-in abilities trigger in Speed Order after post-KO swi } } } + +MULTI_BATTLE_TEST("Switch-in abilities trigger in Speed Order after post-KO switch - multibattle") +{ + u32 spdPlayer1, spdPlayer2, spdOpponent1, spdOpponent2; + + PARAMETRIZE { spdPlayer1 = 5; spdPlayer2 = 4; spdOpponent1 = 3; spdOpponent2 = 2; } + PARAMETRIZE { spdPlayer1 = 2; spdPlayer2 = 3; spdOpponent1 = 4; spdOpponent2 = 5; } + PARAMETRIZE { spdPlayer1 = 4; spdPlayer2 = 3; spdOpponent1 = 5; spdOpponent2 = 2; } + + GIVEN { + MULTI_PLAYER(SPECIES_WOBBUFFET) { HP(1); Speed(1); } + MULTI_PLAYER(SPECIES_TYRANITAR) { Speed(spdPlayer1); Ability(ABILITY_SAND_STREAM); } + MULTI_PARTNER(SPECIES_WOBBUFFET) { HP(1); Speed(1); } + MULTI_PARTNER(SPECIES_GYARADOS) { Speed(spdPlayer2); Ability(ABILITY_INTIMIDATE); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { HP(1); Speed(1); } + MULTI_OPPONENT_A(SPECIES_WEEZING_GALAR) { Speed(spdOpponent1); Ability(ABILITY_MISTY_SURGE); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { HP(1); Speed(1); } + MULTI_OPPONENT_B(SPECIES_VULPIX_ALOLA) { Speed(spdOpponent2); Ability(ABILITY_SNOW_WARNING); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_EXPLOSION); SEND_OUT(playerLeft, 1); SEND_OUT(opponentLeft, 1); SEND_OUT(playerRight, 4); SEND_OUT(opponentRight, 4); } + TURN { ; } + } SCENE { + MESSAGE("Wobbuffet used Explosion!"); + if (spdPlayer1 == 5) { + ABILITY_POPUP(playerLeft, ABILITY_SAND_STREAM); + ABILITY_POPUP(playerRight, ABILITY_INTIMIDATE); + ABILITY_POPUP(opponentLeft, ABILITY_MISTY_SURGE); + ABILITY_POPUP(opponentRight, ABILITY_SNOW_WARNING); + } else if (spdOpponent2 == 5) { + ABILITY_POPUP(opponentRight, ABILITY_SNOW_WARNING); + ABILITY_POPUP(opponentLeft, ABILITY_MISTY_SURGE); + ABILITY_POPUP(playerRight, ABILITY_INTIMIDATE); + ABILITY_POPUP(playerLeft, ABILITY_SAND_STREAM); + } else { + ABILITY_POPUP(opponentLeft, ABILITY_MISTY_SURGE); + ABILITY_POPUP(playerLeft, ABILITY_SAND_STREAM); + ABILITY_POPUP(playerRight, ABILITY_INTIMIDATE); + ABILITY_POPUP(opponentRight, ABILITY_SNOW_WARNING); + } + } +} + +TWO_VS_ONE_BATTLE_TEST("Switch-in abilities trigger in Speed Order after post-KO switch - 2v1") +{ + u32 spdPlayer1, spdPlayer2, spdOpponent1, spdOpponent2; + + PARAMETRIZE { spdPlayer1 = 5; spdPlayer2 = 4; spdOpponent1 = 3; spdOpponent2 = 2; } + PARAMETRIZE { spdPlayer1 = 2; spdPlayer2 = 3; spdOpponent1 = 4; spdOpponent2 = 5; } + PARAMETRIZE { spdPlayer1 = 4; spdPlayer2 = 3; spdOpponent1 = 5; spdOpponent2 = 2; } + + GIVEN { + MULTI_PLAYER(SPECIES_WOBBUFFET) { HP(1); Speed(1); } + MULTI_PLAYER(SPECIES_TYRANITAR) { Speed(spdPlayer1); Ability(ABILITY_SAND_STREAM); } + MULTI_PARTNER(SPECIES_WYNAUT) { HP(1); Speed(1); } + MULTI_PARTNER(SPECIES_GYARADOS) { Speed(spdPlayer2); Ability(ABILITY_INTIMIDATE); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { HP(1); Speed(1); } + MULTI_OPPONENT_A(SPECIES_WYNAUT) { HP(1); Speed(1); } + MULTI_OPPONENT_A(SPECIES_WEEZING_GALAR) { Speed(spdOpponent1); Ability(ABILITY_MISTY_SURGE); } + MULTI_OPPONENT_A(SPECIES_VULPIX_ALOLA) { Speed(spdOpponent2); Ability(ABILITY_SNOW_WARNING); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_EXPLOSION); SEND_OUT(playerLeft, 1); SEND_OUT(opponentLeft, 2); SEND_OUT(playerRight, 4); SEND_OUT(opponentRight, 3); } + } SCENE { + MESSAGE("Wobbuffet used Explosion!"); + if (spdPlayer1 == 5) { + ABILITY_POPUP(playerLeft, ABILITY_SAND_STREAM); + ABILITY_POPUP(playerRight, ABILITY_INTIMIDATE); + ABILITY_POPUP(opponentLeft, ABILITY_MISTY_SURGE); + ABILITY_POPUP(opponentRight, ABILITY_SNOW_WARNING); + } else if (spdOpponent2 == 5) { + ABILITY_POPUP(opponentRight, ABILITY_SNOW_WARNING); + ABILITY_POPUP(opponentLeft, ABILITY_MISTY_SURGE); + ABILITY_POPUP(playerRight, ABILITY_INTIMIDATE); + ABILITY_POPUP(playerLeft, ABILITY_SAND_STREAM); + } else { + ABILITY_POPUP(opponentLeft, ABILITY_MISTY_SURGE); + ABILITY_POPUP(playerLeft, ABILITY_SAND_STREAM); + ABILITY_POPUP(playerRight, ABILITY_INTIMIDATE); + ABILITY_POPUP(opponentRight, ABILITY_SNOW_WARNING); + } + } +} + +ONE_VS_TWO_BATTLE_TEST("Switch-in abilities trigger in Speed Order after post-KO switch - 1v2") +{ + u32 spdPlayer1, spdPlayer2, spdOpponent1, spdOpponent2; + + PARAMETRIZE { spdPlayer1 = 5; spdPlayer2 = 4; spdOpponent1 = 3; spdOpponent2 = 2; } + PARAMETRIZE { spdPlayer1 = 2; spdPlayer2 = 3; spdOpponent1 = 4; spdOpponent2 = 5; } + PARAMETRIZE { spdPlayer1 = 4; spdPlayer2 = 3; spdOpponent1 = 5; spdOpponent2 = 2; } + + GIVEN { + MULTI_PLAYER(SPECIES_WOBBUFFET) { HP(1); Speed(1); } + MULTI_PLAYER(SPECIES_WYNAUT) { HP(1); Speed(1); } + MULTI_PLAYER(SPECIES_TYRANITAR) { Speed(spdPlayer1); Ability(ABILITY_SAND_STREAM); } + MULTI_PLAYER(SPECIES_GYARADOS) { Speed(spdPlayer2); Ability(ABILITY_INTIMIDATE); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { HP(1); Speed(1); } + MULTI_OPPONENT_A(SPECIES_WEEZING_GALAR) { Speed(spdOpponent1); Ability(ABILITY_MISTY_SURGE); } + MULTI_OPPONENT_B(SPECIES_WYNAUT) { HP(1); Speed(1); } + MULTI_OPPONENT_B(SPECIES_VULPIX_ALOLA) { Speed(spdOpponent2); Ability(ABILITY_SNOW_WARNING); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_EXPLOSION); SEND_OUT(playerLeft, 2); SEND_OUT(opponentLeft, 1); SEND_OUT(playerRight, 3); SEND_OUT(opponentRight, 4); } + } SCENE { + MESSAGE("Wobbuffet used Explosion!"); + if (spdPlayer1 == 5) { + ABILITY_POPUP(playerLeft, ABILITY_SAND_STREAM); + ABILITY_POPUP(playerRight, ABILITY_INTIMIDATE); + ABILITY_POPUP(opponentLeft, ABILITY_MISTY_SURGE); + ABILITY_POPUP(opponentRight, ABILITY_SNOW_WARNING); + } else if (spdOpponent2 == 5) { + ABILITY_POPUP(opponentRight, ABILITY_SNOW_WARNING); + ABILITY_POPUP(opponentLeft, ABILITY_MISTY_SURGE); + ABILITY_POPUP(playerRight, ABILITY_INTIMIDATE); + ABILITY_POPUP(playerLeft, ABILITY_SAND_STREAM); + } else { + ABILITY_POPUP(opponentLeft, ABILITY_MISTY_SURGE); + ABILITY_POPUP(playerLeft, ABILITY_SAND_STREAM); + ABILITY_POPUP(playerRight, ABILITY_INTIMIDATE); + ABILITY_POPUP(opponentRight, ABILITY_SNOW_WARNING); + } + } +} diff --git a/test/battle/test_runner_features.c b/test/battle/test_runner_features.c index 6b84c4fc2d66..2c6d73abcc97 100644 --- a/test/battle/test_runner_features.c +++ b/test/battle/test_runner_features.c @@ -4,8 +4,8 @@ ASSUMPTIONS { int i; for (i = 0; i < NUM_ABILITY_SLOTS; i++) { - ASSUME(gSpeciesInfo[SPECIES_KADABRA].abilities[i] != ABILITY_QUARK_DRIVE); - ASSUME(gSpeciesInfo[SPECIES_ALAKAZAM].abilities[i] != ABILITY_ELECTRIC_SURGE); + ASSUME(GetSpeciesAbility(SPECIES_KADABRA, i) != ABILITY_QUARK_DRIVE); + ASSUME(GetSpeciesAbility(SPECIES_ALAKAZAM, i) != ABILITY_ELECTRIC_SURGE); } } @@ -25,3 +25,58 @@ SINGLE_BATTLE_TEST("Forced abilities activate on switch-in") MESSAGE("Kadabra's Sp. Atk was heightened!"); } } + +SINGLE_BATTLE_TEST("Setting level doesn't overwrite set stats") +{ + u32 level = 0; + + PARAMETRIZE{level = 1;} + PARAMETRIZE{level = 10;} + PARAMETRIZE{level = 50;} + PARAMETRIZE{level = 99;} + GIVEN { + PLAYER(SPECIES_WOBBUFFET) {HP(5); MaxHP(10); Attack(10); Defense(10); Speed(10); SpAttack(10); SpDefense(10); Level(level); }; + OPPONENT(SPECIES_WOBBUFFET) {Speed(1);} + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE);} + } THEN { + EXPECT_EQ(player->hp, 5); + EXPECT_EQ(player->maxHP, 10); + EXPECT_EQ(player->attack, 10); + EXPECT_EQ(player->defense, 10); + EXPECT_EQ(player->speed, 10); + EXPECT_EQ(player->spAttack, 10); + EXPECT_EQ(player->spDefense, 10); + } +} + +SINGLE_BATTLE_TEST("Changing forms doesn't overwrite set stats (not HP)") +{ + GIVEN { + PLAYER(SPECIES_DIANCIE) {Attack(10); Defense(10); Speed(10); SpAttack(10); SpDefense(10); Item(ITEM_DIANCITE);} + OPPONENT(SPECIES_WOBBUFFET) {Speed(1);} + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, player); + } THEN { + EXPECT_EQ(player->attack, 10); + EXPECT_EQ(player->defense, 10); + EXPECT_EQ(player->speed, 10); + EXPECT_EQ(player->spAttack, 10); + EXPECT_EQ(player->spDefense, 10); + } +} + +SINGLE_BATTLE_TEST("Changing forms doesn't overwrite set stats (HP)") +{ + GIVEN { + PLAYER(SPECIES_TERAPAGOS) {HP(5); MaxHP(10); TeraType(TYPE_STELLAR);} + OPPONENT(SPECIES_WOBBUFFET) {} + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); MOVE(opponent, MOVE_CELEBRATE);} + } THEN { + EXPECT_EQ(player->hp, 5); + EXPECT_EQ(player->maxHP, 10); + } +} diff --git a/test/battle/trainer_control.c b/test/battle/trainer_control.c index b42c89196cea..1821cebcb5e0 100644 --- a/test/battle/trainer_control.c +++ b/test/battle/trainer_control.c @@ -169,6 +169,7 @@ static const struct Trainer sTestTrainer2 = TEST("Trainer Class Balls apply to the entire party") { + ASSUME(B_TRAINER_CLASS_POKE_BALLS >= GEN_8); u32 j; struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon)); CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainer2, TRUE, BATTLE_TYPE_TRAINER); @@ -187,6 +188,7 @@ TEST("Difficulty default to Normal is the trainer doesn't have a member for the CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[GetTrainerDifficultyLevelTest(currTrainer)][currTrainer], TRUE, BATTLE_TYPE_TRAINER); EXPECT(GetMonData(&testParty[0], MON_DATA_SPECIES) == SPECIES_MEWTWO); Free(testParty); + SetCurrentDifficultyLevel(DIFFICULTY_NORMAL); } TEST("Difficulty changes which party if used for NPCs if defined for the difficulty (EASY)") @@ -198,6 +200,7 @@ TEST("Difficulty changes which party if used for NPCs if defined for the difficu EXPECT(GetMonData(&testParty[0], MON_DATA_SPECIES) == SPECIES_METAPOD); EXPECT(GetMonData(&testParty[0], MON_DATA_LEVEL) == 1); Free(testParty); + SetCurrentDifficultyLevel(DIFFICULTY_NORMAL); } TEST("Difficulty changes which party if used for NPCs if defined for the difficulty (HARD)") @@ -209,6 +212,7 @@ TEST("Difficulty changes which party if used for NPCs if defined for the difficu EXPECT(GetMonData(&testParty[0], MON_DATA_SPECIES) == SPECIES_ARCEUS); EXPECT(GetMonData(&testParty[0], MON_DATA_LEVEL) == 99); Free(testParty); + SetCurrentDifficultyLevel(DIFFICULTY_NORMAL); } TEST("Difficulty changes which party if used for NPCs if defined for the difficulty (NORMAL)") diff --git a/test/battle/trainer_control.h b/test/battle/trainer_control.h deleted file mode 100644 index 482e7a0a6e09..000000000000 --- a/test/battle/trainer_control.h +++ /dev/null @@ -1,792 +0,0 @@ -// -// DO NOT MODIFY THIS FILE! It is auto-generated from test/battle/trainer_control.party -// -// If you want to modify this file set COMPETITIVE_PARTY_SYNTAX to FALSE -// in include/config/general.h and remove this notice. -// Use sed -i '/^#line/d' 'test/battle/trainer_control.h' to remove #line markers. -// - -#line 1 "test/battle/trainer_control.party" - -#line 1 - [DIFFICULTY_NORMAL][0] = - { -#line 2 - .trainerName = _("Test1"), -#line 3 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 4 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 6 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 7 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9 - .nickname = COMPOUND_STRING("Bubbles"), -#line 9 - .species = SPECIES_WOBBUFFET, -#line 9 - .gender = TRAINER_MON_FEMALE, -#line 9 - .heldItem = ITEM_ASSAULT_VEST, -#line 14 - .ev = TRAINER_PARTY_EVS(252, 0, 0, 252, 4, 0), -#line 13 - .iv = TRAINER_PARTY_IVS(25, 26, 27, 28, 29, 30), -#line 12 - .ability = ABILITY_TELEPATHY, -#line 11 - .lvl = 67, -#line 17 - .ball = ITEM_MASTER_BALL, -#line 15 - .friendship = 42, -#line 10 - .nature = NATURE_HASTY, -#line 16 - .isShiny = TRUE, -#line 18 - .dynamaxLevel = 5, - .shouldUseDynamax = TRUE, - .moves = { -#line 19 - MOVE_AIR_SLASH, - MOVE_BARRIER, - MOVE_SOLAR_BEAM, - MOVE_EXPLOSION, - }, - }, - { -#line 24 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 27 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 26 - .ability = ABILITY_SHADOW_TAG, -#line 25 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 29 - .species = SPECIES_WYNAUT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 31 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 30 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 33 -#line 40 - [DIFFICULTY_NORMAL][1] = - { -#line 34 - .trainerName = _("Test2"), -#line 35 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 36 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 38 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 39 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 42 - .species = SPECIES_MEWTWO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 44 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 43 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 45 -#line 52 - [DIFFICULTY_NORMAL][2] = - { -#line 46 - .trainerName = _("Test2"), -#line 47 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 48 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 50 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 51 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 54 - .species = SPECIES_MEWTWO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 56 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 55 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 57 -#line 64 - [DIFFICULTY_EASY][2] = - { -#line 58 - .trainerName = _("Test2"), -#line 59 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 60 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 62 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 63 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 66 - .species = SPECIES_METAPOD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 68 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 67 - .lvl = 1, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 69 -#line 76 - [DIFFICULTY_HARD][2] = - { -#line 70 - .trainerName = _("Test2"), -#line 71 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 72 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 74 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 75 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 78 - .species = SPECIES_ARCEUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 80 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 79 - .lvl = 99, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 81 - [DIFFICULTY_NORMAL][3] = - { -#line 82 - .trainerName = _("Test3"), -#line 83 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 84 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 86 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 87 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 88 - .partySize = 1, - .poolSize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 90 - .species = SPECIES_WYNAUT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 91 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 91 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 92 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 93 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 93 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 94 - .species = SPECIES_EEVEE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 95 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 95 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 96 - .species = SPECIES_MEW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 97 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 97 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 98 - [DIFFICULTY_NORMAL][4] = - { -#line 99 - .trainerName = _("Test4"), -#line 100 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 101 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 103 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 104 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 105 - .partySize = 3, - .poolSize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 107 - .species = SPECIES_WYNAUT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 108 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 108 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 109 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 111 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 111 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 110 - .tags = MON_POOL_TAG_LEAD, - }, - { -#line 112 - .species = SPECIES_EEVEE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 114 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 114 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 113 - .tags = MON_POOL_TAG_ACE, - }, - { -#line 115 - .species = SPECIES_MEW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 116 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 116 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 117 - .species = SPECIES_ODDISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 119 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 119 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 118 - .tags = MON_POOL_TAG_ACE, - }, - { -#line 120 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 122 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 122 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 121 - .tags = MON_POOL_TAG_LEAD, - }, - }, - }, -#line 123 - [DIFFICULTY_NORMAL][5] = - { -#line 124 - .trainerName = _("Test5"), -#line 125 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 126 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 128 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 129 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 131 - .poolRuleIndex = POOL_RULESET_WEATHER_DOUBLES, -#line 130 - .partySize = 3, - .poolSize = 10, - .party = (const struct TrainerMon[]) - { - { -#line 133 - .species = SPECIES_WYNAUT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 135 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 135 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 134 - .tags = MON_POOL_TAG_LEAD, - }, - { -#line 136 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 138 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 138 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 137 - .tags = MON_POOL_TAG_LEAD, - }, - { -#line 139 - .species = SPECIES_VULPIX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 141 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 141 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 140 - .tags = MON_POOL_TAG_LEAD | MON_POOL_TAG_WEATHER_SETTER, - }, - { -#line 142 - .species = SPECIES_BULBASAUR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 144 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 144 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 143 - .tags = MON_POOL_TAG_LEAD | MON_POOL_TAG_WEATHER_ABUSER, - }, - { -#line 145 - .species = SPECIES_TORKOAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 147 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 147 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 146 - .tags = MON_POOL_TAG_LEAD | MON_POOL_TAG_WEATHER_SETTER, - }, - { -#line 148 - .species = SPECIES_CHERRIM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 150 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 150 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 149 - .tags = MON_POOL_TAG_LEAD | MON_POOL_TAG_WEATHER_ABUSER, - }, - { -#line 151 - .species = SPECIES_MEW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 153 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 153 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 152 - .tags = MON_POOL_TAG_LEAD, - }, - { -#line 154 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 156 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 156 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 155 - .tags = MON_POOL_TAG_LEAD, - }, - { -#line 157 - .species = SPECIES_ODDISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 158 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 158 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 159 - .species = SPECIES_EEVEE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 160 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 160 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 161 - [DIFFICULTY_NORMAL][6] = - { -#line 162 - .trainerName = _("Test6"), -#line 163 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 164 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 166 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 167 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 169 - .poolRuleIndex = POOL_RULESET_BASIC, -#line 168 - .partySize = 2, - .poolSize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 171 - .species = SPECIES_WYNAUT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 173 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 173 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 172 - .tags = MON_POOL_TAG_LEAD, - }, - { -#line 174 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 176 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 176 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 175 - .tags = MON_POOL_TAG_LEAD, - }, - { -#line 177 - .species = SPECIES_EEVEE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 179 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 179 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 178 - .tags = MON_POOL_TAG_LEAD, - }, - }, - }, -#line 180 - [DIFFICULTY_NORMAL][7] = - { -#line 181 - .trainerName = _("Test1"), -#line 182 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 183 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 185 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 186 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 188 - .poolRuleIndex = POOL_RULESET_BASIC, -#line 189 - .poolPruneIndex = POOL_PRUNE_TEST, -#line 187 - .partySize = 2, - .poolSize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 191 - .species = SPECIES_WYNAUT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 192 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 192 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 193 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 195 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 195 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 194 - .tags = MON_POOL_TAG_LEAD, - }, - { -#line 196 - .species = SPECIES_EEVEE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 197 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 197 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 198 - [DIFFICULTY_NORMAL][8] = - { -#line 199 - .trainerName = _("Test1"), -#line 200 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 201 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 203 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 204 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 206 - .poolRuleIndex = POOL_RULESET_BASIC, -#line 207 - .poolPickIndex = POOL_PICK_LOWEST, -#line 205 - .partySize = 2, - .poolSize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 209 - .species = SPECIES_WYNAUT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 211 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 211 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 210 - .tags = MON_POOL_TAG_ACE, - }, - { -#line 212 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 213 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 213 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 214 - .species = SPECIES_EEVEE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 216 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 216 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 215 - .tags = MON_POOL_TAG_LEAD, - }, - }, - }, -#line 217 - [DIFFICULTY_NORMAL][9] = - { -#line 218 - .trainerName = _("Test9"), -#line 219 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 220 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 222 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 223 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 224 - .partySize = 2, - .poolSize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 226 - .species = SPECIES_WYNAUT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 227 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 227 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 228 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 229 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 229 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 230 - [DIFFICULTY_NORMAL][10] = - { -#line 231 - .trainerName = _("Test10"), -#line 232 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 233 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 235 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 236 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 237 - .partySize = 2, - .poolSize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 239 - .species = SPECIES_WYNAUT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 240 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 240 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 241 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 242 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 242 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, diff --git a/test/battle/trainer_slides.c b/test/battle/trainer_slides.c index e8a0999048a6..972e359f87b4 100644 --- a/test/battle/trainer_slides.c +++ b/test/battle/trainer_slides.c @@ -59,7 +59,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First STAB Hit") gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE; GIVEN { - ASSUME((GetMoveType(MOVE_VINE_WHIP)) == gSpeciesInfo[SPECIES_BULBASAUR].types[0]); + ASSUME((GetMoveType(MOVE_VINE_WHIP)) == GetSpeciesType(SPECIES_BULBASAUR, 0)); PLAYER(SPECIES_BULBASAUR); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -77,8 +77,8 @@ SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First Super Effective Hit") GIVEN { ASSUME(GetMoveType(MOVE_BITE) == TYPE_DARK); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -109,8 +109,8 @@ SINGLE_BATTLE_TEST("Trainer Slide: Enemy Mon Unaffected") { gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_ENEMY_MON_UNAFFECTED; GIVEN { - ASSUME(B_SHEER_COLD_IMMUNITY >= GEN_7); - ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE); + WITH_CONFIG(CONFIG_SHEER_COLD_IMMUNITY, GEN_7); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_GLALIE); } WHEN { @@ -141,8 +141,8 @@ SINGLE_BATTLE_TEST("Trainer Slide: Last Half Hp") { gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_LAST_HALF_HP; GIVEN { - ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_SUPER_FANG); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseHP == 190); + ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_FIXED_PERCENT_DAMAGE); + ASSUME(GetSpeciesBaseHP(SPECIES_WOBBUFFET) == 190); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/status2/confusion.c b/test/battle/volatiles/confusion.c similarity index 93% rename from test/battle/status2/confusion.c rename to test/battle/volatiles/confusion.c index 66ab92484206..540abbd5a63f 100644 --- a/test/battle/status2/confusion.c +++ b/test/battle/volatiles/confusion.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Confusion adds a 50/33% chance to hit self with 40 power") PARAMETRIZE { genConfig = GEN_7; pctChance = 33; } PASSES_RANDOMLY(pctChance, 100, RNG_CONFUSION); GIVEN { - WITH_CONFIG(GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CONFUSION_SELF_DMG_CHANCE, genConfig); ASSUME(GetMovePower(MOVE_SCRATCH) == 40); PLAYER(SPECIES_WOBBUFFET) { Speed(1); }; OPPONENT(SPECIES_WOBBUFFET) { Speed(2); }; @@ -38,7 +38,7 @@ SINGLE_BATTLE_TEST("Confusion self hit does not consume Gems") PARAMETRIZE { genConfig = GEN_7; pctChance = 33; } PASSES_RANDOMLY(pctChance, 100, RNG_CONFUSION); GIVEN { - WITH_CONFIG(GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CONFUSION_SELF_DMG_CHANCE, genConfig); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); }; OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/weather/hail.c b/test/battle/weather/hail.c index df5a34469c20..3a0dd53026ff 100644 --- a/test/battle/weather/hail.c +++ b/test/battle/weather/hail.c @@ -5,9 +5,9 @@ ASSUMPTIONS { ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ICE && gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ICE); - ASSUME(gSpeciesInfo[SPECIES_WYNAUT].types[0] != TYPE_ICE && gSpeciesInfo[SPECIES_WYNAUT].types[1] != TYPE_ICE); - ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE || gSpeciesInfo[SPECIES_GLALIE].types[1] == TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ICE && GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_WYNAUT, 0) != TYPE_ICE && GetSpeciesType(SPECIES_WYNAUT, 1) != TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE || GetSpeciesType(SPECIES_GLALIE, 1) == TYPE_ICE); } SINGLE_BATTLE_TEST("Hail deals 1/16 damage per turn") @@ -28,7 +28,7 @@ SINGLE_BATTLE_TEST("Hail deals 1/16 damage per turn") SINGLE_BATTLE_TEST("Hail damage does not affect Ice-type PokΓ©mon") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GLALIE); } WHEN { @@ -94,8 +94,8 @@ SINGLE_BATTLE_TEST("Hail damage rounds properly when maxHP < 16") SINGLE_BATTLE_TEST("Hail doesn't do damage when weather is negated") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ICE); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ICE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GOLDUCK) { Ability(ABILITY_CLOUD_NINE); } } WHEN { diff --git a/test/battle/weather/sandstorm.c b/test/battle/weather/sandstorm.c index 2ff06975979b..78dc0ecdce1c 100644 --- a/test/battle/weather/sandstorm.c +++ b/test/battle/weather/sandstorm.c @@ -17,12 +17,14 @@ SINGLE_BATTLE_TEST("Sandstorm deals 1/16 damage per turn") } THEN { EXPECT_EQ(sandstormDamage, opponent->maxHP / 16); } } -SINGLE_BATTLE_TEST("Sandstorm multiplies the special defense of Rock-types by 1.5x", s16 damage) +SINGLE_BATTLE_TEST("Sandstorm multiplies the special defense of Rock-types by 1.5x (Gen4+)", s16 damage) { - u16 move; - PARAMETRIZE { move = MOVE_SANDSTORM; } - PARAMETRIZE { move = MOVE_CELEBRATE; } + u32 move, config; + PARAMETRIZE { move = MOVE_CELEBRATE; config = GEN_3; } + PARAMETRIZE { move = MOVE_SANDSTORM; config = GEN_3; } + PARAMETRIZE { move = MOVE_SANDSTORM; config = GEN_4; } GIVEN { + WITH_CONFIG(CONFIG_SANDSTORM_SPDEF_BOOST, config); ASSUME(GetMoveCategory(MOVE_SWIFT) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET) ; OPPONENT(SPECIES_NOSEPASS); @@ -32,7 +34,8 @@ SINGLE_BATTLE_TEST("Sandstorm multiplies the special defense of Rock-types by 1. } SCENE { HP_BAR(opponent, captureDamage: &results[i].damage); } FINALLY { - EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); + EXPECT_MUL_EQ(results[2].damage, Q_4_12(1.5), results[0].damage); + EXPECT_MUL_EQ(results[2].damage, Q_4_12(1.5), results[1].damage); } } @@ -43,9 +46,9 @@ SINGLE_BATTLE_TEST("Sandstorm damage does not hurt Ground, Rock, and Steel-type PARAMETRIZE { mon = SPECIES_NOSEPASS; } PARAMETRIZE { mon = SPECIES_REGISTEEL; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND); - ASSUME(gSpeciesInfo[SPECIES_NOSEPASS].types[0] == TYPE_ROCK); - ASSUME(gSpeciesInfo[SPECIES_REGISTEEL].types[0] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_SANDSLASH, 0) == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_NOSEPASS, 0) == TYPE_ROCK); + ASSUME(GetSpeciesType(SPECIES_REGISTEEL, 0) == TYPE_STEEL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(mon); } WHEN { @@ -97,8 +100,8 @@ SINGLE_BATTLE_TEST("Sandstorm damage rounds properly when maxHP < 16") SINGLE_BATTLE_TEST("Sandstorm doesn't do damage when weather is negated") { - u32 type1 = gSpeciesInfo[SPECIES_STOUTLAND].types[0]; - u32 type2 = gSpeciesInfo[SPECIES_STOUTLAND].types[1]; + enum Type type1 = GetSpeciesType(SPECIES_STOUTLAND, 0); + enum Type type2 = GetSpeciesType(SPECIES_STOUTLAND, 1); GIVEN { ASSUME(type1 != TYPE_ROCK && type2 != TYPE_ROCK); ASSUME(type1 != TYPE_GROUND && type2 != TYPE_GROUND); diff --git a/test/battle/weather/snow.c b/test/battle/weather/snow.c index 844a6840e312..c8e0a4fbc3ec 100644 --- a/test/battle/weather/snow.c +++ b/test/battle/weather/snow.c @@ -5,8 +5,8 @@ ASSUMPTIONS { ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ICE && gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ICE); - ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE || gSpeciesInfo[SPECIES_GLALIE].types[1] == TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ICE && GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE || GetSpeciesType(SPECIES_GLALIE, 1) == TYPE_ICE); ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); } diff --git a/test/battle/weather/strong_winds.c b/test/battle/weather/strong_winds.c new file mode 100644 index 000000000000..26b0a51d0d88 --- /dev/null +++ b/test/battle/weather/strong_winds.c @@ -0,0 +1,17 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Strong winds remove Flying-type weaknesses of all battlers") // Electric, Ice, Rock +TO_DO_BATTLE_TEST("Strong winds remove Flying-type weaknesses of all battlers - Inverse Battle") // Bug, Fighting, Grass +TO_DO_BATTLE_TEST("Strong winds don't affect Stealth Rock's damage") +TO_DO_BATTLE_TEST("Strong winds makes Sunny Day fail") +TO_DO_BATTLE_TEST("Strong winds makes Rain Dance fail") +TO_DO_BATTLE_TEST("Strong winds makes Sandstorm fail") +TO_DO_BATTLE_TEST("Strong winds makes Hail fail") +TO_DO_BATTLE_TEST("Strong winds makes Snowscape fail") // Extrapolation +TO_DO_BATTLE_TEST("Strong winds makes Drought fail to activate") +TO_DO_BATTLE_TEST("Strong winds makes Drizzle fail to activate") +TO_DO_BATTLE_TEST("Strong winds makes Sand Stream fail to activate") +TO_DO_BATTLE_TEST("Strong winds makes Snow Warning fail to activate") +TO_DO_BATTLE_TEST("Strong winds can be replaced by Desolate Land") +TO_DO_BATTLE_TEST("Strong winds can be replaced by Primordial Sea") diff --git a/test/compression/complex_battle_sprite.png b/test/compression/complex_battle_sprite.png new file mode 100644 index 000000000000..e6cc875e50a6 Binary files /dev/null and b/test/compression/complex_battle_sprite.png differ diff --git a/test/compression/gossifleur.png b/test/compression/gossifleur.png new file mode 100644 index 000000000000..a9d84f1c9a17 Binary files /dev/null and b/test/compression/gossifleur.png differ diff --git a/test/compression/large_mode_0.png b/test/compression/large_mode_0.png new file mode 100644 index 000000000000..9d4c57fcde4f Binary files /dev/null and b/test/compression/large_mode_0.png differ diff --git a/test/compression/large_mode_1.png b/test/compression/large_mode_1.png new file mode 100644 index 000000000000..9d4c57fcde4f Binary files /dev/null and b/test/compression/large_mode_1.png differ diff --git a/test/compression/large_mode_2.png b/test/compression/large_mode_2.png new file mode 100644 index 000000000000..9d4c57fcde4f Binary files /dev/null and b/test/compression/large_mode_2.png differ diff --git a/test/compression/large_mode_3.png b/test/compression/large_mode_3.png new file mode 100644 index 000000000000..df9f920ba5e3 Binary files /dev/null and b/test/compression/large_mode_3.png differ diff --git a/test/compression/large_mode_4.png b/test/compression/large_mode_4.png new file mode 100644 index 000000000000..df9f920ba5e3 Binary files /dev/null and b/test/compression/large_mode_4.png differ diff --git a/test/compression/large_mode_5.png b/test/compression/large_mode_5.png new file mode 100644 index 000000000000..df9f920ba5e3 Binary files /dev/null and b/test/compression/large_mode_5.png differ diff --git a/test/compression/ledian.png b/test/compression/ledian.png new file mode 100644 index 000000000000..f5fa8dec90e3 Binary files /dev/null and b/test/compression/ledian.png differ diff --git a/test/compression/medium_mode_0.png b/test/compression/medium_mode_0.png new file mode 100644 index 000000000000..3a4ba289c9ff Binary files /dev/null and b/test/compression/medium_mode_0.png differ diff --git a/test/compression/medium_mode_1.png b/test/compression/medium_mode_1.png new file mode 100644 index 000000000000..87d5d41ea559 Binary files /dev/null and b/test/compression/medium_mode_1.png differ diff --git a/test/compression/medium_mode_2.png b/test/compression/medium_mode_2.png new file mode 100644 index 000000000000..893bcee52a5b Binary files /dev/null and b/test/compression/medium_mode_2.png differ diff --git a/test/compression/medium_mode_3.png b/test/compression/medium_mode_3.png new file mode 100644 index 000000000000..f3f5871b4d0c Binary files /dev/null and b/test/compression/medium_mode_3.png differ diff --git a/test/compression/medium_mode_4.png b/test/compression/medium_mode_4.png new file mode 100644 index 000000000000..f3f5871b4d0c Binary files /dev/null and b/test/compression/medium_mode_4.png differ diff --git a/test/compression/medium_mode_5.png b/test/compression/medium_mode_5.png new file mode 100644 index 000000000000..4b8cb700cca5 Binary files /dev/null and b/test/compression/medium_mode_5.png differ diff --git a/test/compression/mr_mime.png b/test/compression/mr_mime.png new file mode 100644 index 000000000000..c4db5e51ec73 Binary files /dev/null and b/test/compression/mr_mime.png differ diff --git a/test/compression/secondary_tileset.png b/test/compression/secondary_tileset.png new file mode 100644 index 000000000000..00d6d94a4ef2 Binary files /dev/null and b/test/compression/secondary_tileset.png differ diff --git a/test/compression/simple_battle_sprite.png b/test/compression/simple_battle_sprite.png new file mode 100644 index 000000000000..631ab8f09449 Binary files /dev/null and b/test/compression/simple_battle_sprite.png differ diff --git a/test/compression/small_bubbles.png b/test/compression/small_bubbles.png new file mode 100644 index 000000000000..9547b39faf1a Binary files /dev/null and b/test/compression/small_bubbles.png differ diff --git a/test/compression/small_mode_0.png b/test/compression/small_mode_0.png new file mode 100644 index 000000000000..15cffcc857e8 Binary files /dev/null and b/test/compression/small_mode_0.png differ diff --git a/test/compression/small_mode_1.png b/test/compression/small_mode_1.png new file mode 100644 index 000000000000..76eb7c9a8f23 Binary files /dev/null and b/test/compression/small_mode_1.png differ diff --git a/test/compression/small_mode_2.png b/test/compression/small_mode_2.png new file mode 100644 index 000000000000..fd24e0621924 Binary files /dev/null and b/test/compression/small_mode_2.png differ diff --git a/test/compression/small_mode_3.png b/test/compression/small_mode_3.png new file mode 100644 index 000000000000..d0d7c927549b Binary files /dev/null and b/test/compression/small_mode_3.png differ diff --git a/test/compression/small_mode_4.png b/test/compression/small_mode_4.png new file mode 100644 index 000000000000..d0d7c927549b Binary files /dev/null and b/test/compression/small_mode_4.png differ diff --git a/test/compression/small_mode_5.png b/test/compression/small_mode_5.png new file mode 100644 index 000000000000..1d79d0608c66 Binary files /dev/null and b/test/compression/small_mode_5.png differ diff --git a/test/compression/smol.c b/test/compression/smol.c new file mode 100644 index 000000000000..8416519863fb --- /dev/null +++ b/test/compression/smol.c @@ -0,0 +1,6341 @@ +#include "global.h" +#include "decompress.h" +#include "main.h" +#include "malloc.h" +#include "random.h" +#include "sprite.h" +#include "test/test.h" +#include "config/test.h" +#include "config/general.h" + +#define ENABLE_ALL_COMPRESSION_TESTS FALSE + +#ifdef NDEBUG +void CycleCountStart(); +u32 CycleCountEnd(); +#endif + +enum +{ + COMPRESSION_SMOL, + COMPRESSION_FASTSMOL, + COMPRESSION_LZ, + COMPRESSION_FASTLZ, + COMPRESSION_SMOL_TILEMAP, +}; + +static bool32 DecompressImgPrintResults(const u32 *img, const u32 *orgImg, const char *imgName, s32 mode, s32 size) +{ + u32 imageSize = GetDecompressedDataSize(img); + u32 *compBuffer = Alloc(imageSize); +#ifndef NDEBUG + if (T_COMPRESSION_SHOULD_PRINT) + CycleCountStart(); +#endif + if (mode == COMPRESSION_FASTLZ) + FastLZ77UnCompWram(img, compBuffer); + else if (mode == COMPRESSION_LZ) + LZ77UnCompWram(img, compBuffer); + else + DecompressDataWithHeaderWram(img, compBuffer); + +#ifndef NDEBUG + if (T_COMPRESSION_SHOULD_PRINT) + { + s32 timeTaken = CycleCountEnd(); + const char *compModeStr; + if (mode == COMPRESSION_SMOL) + compModeStr = "Smol"; + else if (mode == COMPRESSION_FASTSMOL) + compModeStr = "fastSmol"; + else if (mode == COMPRESSION_LZ) + compModeStr = "LZ"; + else if (mode == COMPRESSION_SMOL_TILEMAP) + compModeStr = "smolTilemap"; + else + compModeStr = "fastLZ"; + + DebugPrintf("Time %s %s: %d Size: %d", imgName, compModeStr, timeTaken, size); + } +#endif + + bool32 areEqual = TRUE; + for (u32 i = 0; i < imageSize/4; i++) + { + if (orgImg[i] != compBuffer[i]) + { + areEqual = FALSE; + break; + } + } + + Free(compBuffer); + + return areEqual; +} + +static bool32 DecompressImgPrintResultsVram(const u32 *img, const u32 *orgImg, const char *imgName, s32 mode, s32 size) +{ + u32 imageSize = GetDecompressedDataSize(img); + u32 *compBuffer = (u32 *)VRAM; +#ifndef NDEBUG + if (T_COMPRESSION_SHOULD_PRINT) + CycleCountStart(); +#endif + if (mode == COMPRESSION_FASTLZ) + FastLZ77UnCompWram(img, compBuffer); // There is no Vram version of this + else if (mode == COMPRESSION_LZ) + LZ77UnCompVram(img, compBuffer); + else + DecompressDataWithHeaderVram(img, compBuffer); + +#ifndef NDEBUG + if (T_COMPRESSION_SHOULD_PRINT) + { + s32 timeTaken = CycleCountEnd(); + const char *compModeStr; + if (mode == COMPRESSION_SMOL) + compModeStr = "Smol"; + else if (mode == COMPRESSION_FASTSMOL) + compModeStr = "fastSmol"; + else if (mode == COMPRESSION_LZ) + compModeStr = "LZ"; + else if (mode == COMPRESSION_SMOL_TILEMAP) + compModeStr = "smolTilemap"; + else + compModeStr = "fastLZ"; + + DebugPrintf("Time %s %s: %d Size: %d", imgName, compModeStr, timeTaken, size); + } +#endif + + bool32 areEqual = TRUE; + for (u32 i = 0; i < imageSize/4; i++) + { + if (orgImg[i] != compBuffer[i]) + { + areEqual = FALSE; + break; + } + } + + return areEqual; +} + +static bool32 DecompressTilemapPrintResults(const u32 *tilemap, const u16 *orgTilemap, const char *tilemapName, s32 mode, s32 size) +{ + u32 tilemapSize = GetDecompressedDataSize(tilemap); + u16 *compBuffer = Alloc(tilemapSize); +#ifndef NDEBUG + if (T_COMPRESSION_SHOULD_PRINT) + CycleCountStart(); +#endif + if (mode == COMPRESSION_FASTLZ) + FastLZ77UnCompWram(tilemap, compBuffer); + else if (mode == COMPRESSION_LZ) + LZ77UnCompWram(tilemap, compBuffer); + else + DecompressDataWithHeaderWram(tilemap, compBuffer); + +#ifndef NDEBUG + if (T_COMPRESSION_SHOULD_PRINT) + { + s32 timeTaken = CycleCountEnd(); + const char *compModeStr; + if (mode == COMPRESSION_SMOL) + compModeStr = "Smol"; + else if (mode == COMPRESSION_FASTSMOL) + compModeStr = "fastSmol"; + else if (mode == COMPRESSION_LZ) + compModeStr = "LZ"; + else if (mode == COMPRESSION_SMOL_TILEMAP) + compModeStr = "smolTilemap"; + else + compModeStr = "fastLZ"; + + DebugPrintf("Time %s %s: %d Size: %d", tilemapName, compModeStr, timeTaken, size); + } +#endif + + bool32 areEqual = TRUE; + for (u32 i = 0; i < tilemapSize/2; i++) + { + if (orgTilemap[i] != compBuffer[i]) + { + areEqual = FALSE; + break; + } + } + + Free(compBuffer); + + return areEqual; +} + +static bool32 DecompressTilemapPrintResultsVram(const u32 *tilemap, const u16 *orgTilemap, const char *tilemapName, s32 mode, s32 size) +{ + u32 tilemapSize = GetDecompressedDataSize(tilemap); + u16 *compBuffer = (u16 *)VRAM; +#ifndef NDEBUG + if (T_COMPRESSION_SHOULD_PRINT) + CycleCountStart(); +#endif + if (mode == COMPRESSION_FASTLZ) + FastLZ77UnCompWram(tilemap, compBuffer); + else if (mode == COMPRESSION_LZ) + LZ77UnCompVram(tilemap, compBuffer); + else + DecompressDataWithHeaderVram(tilemap, compBuffer); + +#ifndef NDEBUG + if (T_COMPRESSION_SHOULD_PRINT) + { + s32 timeTaken = CycleCountEnd(); + const char *compModeStr; + if (mode == COMPRESSION_SMOL) + compModeStr = "Smol"; + else if (mode == COMPRESSION_FASTSMOL) + compModeStr = "fastSmol"; + else if (mode == COMPRESSION_LZ) + compModeStr = "LZ"; + else if (mode == COMPRESSION_SMOL_TILEMAP) + compModeStr = "smolTilemap"; + else + compModeStr = "fastLZ"; + + DebugPrintf("Time %s %s: %d Size: %d", tilemapName, compModeStr, timeTaken, size); + } +#endif + + bool32 areEqual = TRUE; + for (u32 i = 0; i < tilemapSize/2; i++) + { + if (orgTilemap[i] != compBuffer[i]) + { + areEqual = FALSE; + break; + } + } + + return areEqual; +} + +TEST("Compression test: tileset smol VRAM") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/tilesetTest.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/tilesetTest.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResultsVram(compFile, origFile, "Tileset", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: tileset smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/tilesetTest.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/tilesetTest.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Tileset", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: tileset LZ") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/tilesetTest.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/tilesetTest.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Tileset", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: tileset fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/tilesetTest.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/tilesetTest.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Tileset", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: tileset fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/tilesetTest.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/tilesetTest.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Tileset", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: simple battle sprite smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/simple_battle_sprite.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/simple_battle_sprite.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "simple battle sprite", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: simple battle sprite LZ") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/simple_battle_sprite.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/simple_battle_sprite.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "simple battle sprite", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: simple battle sprite fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/simple_battle_sprite.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/simple_battle_sprite.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "simple battle sprite", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: simple battle sprite fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/simple_battle_sprite.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/simple_battle_sprite.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "simple battle sprite", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: complex battle sprite smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/complex_battle_sprite.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/complex_battle_sprite.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "complex battle sprite", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: complex battle sprite LZ") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/complex_battle_sprite.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/complex_battle_sprite.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "complex battle sprite", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: complex battle sprite fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/complex_battle_sprite.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/complex_battle_sprite.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "complex battle sprite", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: complex battle sprite fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/complex_battle_sprite.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/complex_battle_sprite.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "complex battle sprite", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Gossifleur Smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/gossifleur.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/gossifleur.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Gossifleur", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Gossifleur LZ") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/gossifleur.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/gossifleur.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Gossifleur", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Gossifleur fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/gossifleur.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/gossifleur.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Gossifleur", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Gossifleur fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/gossifleur.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/gossifleur.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Gossifleur", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Ledian Smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/ledian.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/ledian.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ledian", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Ledian LZ") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/ledian.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/ledian.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ledian", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Ledian fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/ledian.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/ledian.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ledian", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Ledian fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/ledian.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/ledian.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ledian", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Mr. Mime Smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/mr_mime.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/mr_mime.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Mr. Mime", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Mr. Mime LZ") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/mr_mime.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/mr_mime.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Mr. Mime", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Mr. Mime fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/mr_mime.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/mr_mime.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Mr. Mime", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Mr. Mime fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/mr_mime.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/mr_mime.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Mr. Mime", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: bubbles Smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/small_bubbles.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/small_bubbles.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "bubbles", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: bubbles LZ") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/small_bubbles.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/small_bubbles.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "bubbles", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: bubbles fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/small_bubbles.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/small_bubbles.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "bubbles", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: bubbles fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/small_bubbles.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/small_bubbles.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "bubbles", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: small mode 0 smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/small_mode_0.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/small_mode_0.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "small mode 0", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: small mode 0 lz") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/small_mode_0.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/small_mode_0.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "small mode 0", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: medium mode 0 smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/medium_mode_0.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/medium_mode_0.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "medium mode 0", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: medium mode 0 lz") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/medium_mode_0.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/medium_mode_0.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "medium mode 0", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: large mode 0 smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/large_mode_0.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/large_mode_0.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "large mode 0", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: large mode 0 lz") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/large_mode_0.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/large_mode_0.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "large mode 0", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: small mode 1 smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/small_mode_1.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/small_mode_1.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "small mode 1", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: small mode 1 lz") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/small_mode_1.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/small_mode_1.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "small mode 1", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: medium mode 1 smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/medium_mode_1.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/medium_mode_1.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "medium mode 1", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: medium mode 1 lz") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/medium_mode_1.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/medium_mode_1.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "medium mode 1", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: large mode 1 smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/large_mode_1.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/large_mode_1.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "large mode 1", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: large mode 1 lz") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/large_mode_1.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/large_mode_1.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "large mode 1", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: small mode 2 smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/small_mode_2.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/small_mode_2.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "small mode 2", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: small mode 2 lz") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/small_mode_2.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/small_mode_2.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "small mode 2", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: medium mode 2 smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/medium_mode_2.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/medium_mode_2.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "medium mode 2", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: medium mode 2 lz") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/medium_mode_2.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/medium_mode_2.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "medium mode 2", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: large mode 2 smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/large_mode_2.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/large_mode_2.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "large mode 2", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: large mode 2 lz") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/large_mode_2.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/large_mode_2.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "large mode 2", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: small mode 3 smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/small_mode_3.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/small_mode_3.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "small mode 3", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: small mode 3 lz") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/small_mode_3.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/small_mode_3.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "small mode 3", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: medium mode 3 smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/medium_mode_3.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/medium_mode_3.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "medium mode 3", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: medium mode 3 lz") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/medium_mode_3.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/medium_mode_3.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "medium mode 3", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: large mode 3 smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/large_mode_3.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/large_mode_3.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "large mode 3", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: large mode 3 lz") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/large_mode_3.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/large_mode_3.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "large mode 3", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: small mode 4 smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/small_mode_4.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/small_mode_4.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "small mode 4", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: small mode 4 lz") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/small_mode_4.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/small_mode_4.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "small mode 4", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: medium mode 4 smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/medium_mode_4.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/medium_mode_4.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "medium mode 4", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: medium mode 4 lz") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/medium_mode_4.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/medium_mode_4.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "medium mode 4", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: large mode 4 smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/large_mode_4.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/large_mode_4.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "large mode 4", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: large mode 4 lz") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/large_mode_4.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/large_mode_4.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "large mode 4", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: small mode 5 smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/small_mode_5.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/small_mode_5.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "small mode 5", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: small mode 5 lz") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/small_mode_5.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/small_mode_5.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "small mode 5", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: medium mode 5 smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/medium_mode_5.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/medium_mode_5.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "medium mode 5", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: medium mode 5 lz") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/medium_mode_5.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/medium_mode_5.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "medium mode 5", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: large mode 5 smol") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/large_mode_5.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/large_mode_5.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "large mode 5", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: large mode 5 lz") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/large_mode_5.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/large_mode_5.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "large mode 5", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 63 1") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_63_1.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_63_1.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 62 2") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_62_2.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_62_2.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 61 3") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_61_3.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_61_3.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 60 4") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_60_4.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_60_4.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 59 5") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_59_5.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_59_5.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 58 6") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_58_6.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_58_6.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 57 7") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_57_7.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_57_7.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 56 8") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_56_8.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_56_8.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 55 9") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_55_9.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_55_9.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 54 10") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_54_10.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_54_10.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 53 11") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_53_11.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_53_11.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 52 12") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_52_12.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_52_12.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 51 13") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_51_13.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_51_13.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 50 14") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_50_14.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_50_14.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 49 15") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_49_15.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_49_15.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 48 16") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_48_16.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_48_16.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 47 17") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_47_17.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_47_17.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 46 18") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_46_18.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_46_18.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 45 19") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_45_19.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_45_19.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 44 20") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_44_20.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_44_20.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 43 21") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_43_21.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_43_21.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 42 22") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_42_22.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_42_22.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 41 23") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_41_23.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_41_23.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 40 24") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_40_24.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_40_24.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 39 25") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_39_25.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_39_25.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 38 26") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_38_26.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_38_26.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 37 27") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_37_27.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_37_27.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 36 28") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_36_28.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_36_28.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 35 29") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_35_29.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_35_29.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 34 30") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_34_30.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_34_30.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 33 31") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_33_31.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_33_31.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: table generation 32 32") +{ + static const u32 origFile[] = INCBIN_U32("test/compression/table_32_32.4bpp"); + static const u32 compFile[] = INCBIN_U32("test/compression/table_32_32.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +#if ENABLE_ALL_COMPRESSION_TESTS +TEST("Compression test: Bulbasaur Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/bulbasaur/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/bulbasaur/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Bulbasaur", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Bulbasaur LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/bulbasaur/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/bulbasaur/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Bulbasaur", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Bulbasaur fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/bulbasaur/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/bulbasaur/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Bulbasaur", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Bulbasaur fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/bulbasaur/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/bulbasaur/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Bulbasaur", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Ivysaur Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/ivysaur/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/ivysaur/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ivysaur", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Ivysaur LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/ivysaur/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/ivysaur/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ivysaur", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Ivysaur fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/ivysaur/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/ivysaur/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ivysaur", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Ivysaur fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/ivysaur/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/ivysaur/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ivysaur", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Venusaur Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/venusaur/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/venusaur/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Venusaur", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Venusaur LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/venusaur/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/venusaur/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Venusaur", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Venusaur fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/venusaur/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/venusaur/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Venusaur", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Venusaur fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/venusaur/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/venusaur/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Venusaur", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Charmander Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/charmander/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/charmander/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Charmander", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Charmander LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/charmander/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/charmander/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Charmander", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Charmander fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/charmander/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/charmander/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Charmander", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Charmander fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/charmander/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/charmander/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Charmander", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Charmeleon Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/charmeleon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/charmeleon/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Charmeleon", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Charmeleon LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/charmeleon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/charmeleon/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Charmeleon", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Charmeleon fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/charmeleon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/charmeleon/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Charmeleon", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Charmeleon fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/charmeleon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/charmeleon/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Charmeleon", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Charizard Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/charizard/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/charizard/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Charizard", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Charizard LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/charizard/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/charizard/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Charizard", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Charizard fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/charizard/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/charizard/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Charizard", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Charizard fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/charizard/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/charizard/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Charizard", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Squirtle Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/squirtle/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/squirtle/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Squirtle", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Squirtle LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/squirtle/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/squirtle/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Squirtle", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Squirtle fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/squirtle/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/squirtle/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Squirtle", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Squirtle fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/squirtle/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/squirtle/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Squirtle", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Wartortle Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/wartortle/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/wartortle/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Wartortle", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Wartortle LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/wartortle/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/wartortle/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Wartortle", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Wartortle fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/wartortle/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/wartortle/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Wartortle", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Wartortle fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/wartortle/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/wartortle/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Wartortle", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Blastoise Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/blastoise/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/blastoise/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Blastoise", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Blastoise LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/blastoise/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/blastoise/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Blastoise", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Blastoise fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/blastoise/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/blastoise/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Blastoise", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Blastoise fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/blastoise/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/blastoise/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Blastoise", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Caterpie Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/caterpie/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/caterpie/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Caterpie", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Caterpie LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/caterpie/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/caterpie/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Caterpie", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Caterpie fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/caterpie/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/caterpie/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Caterpie", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Caterpie fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/caterpie/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/caterpie/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Caterpie", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Metapod Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/metapod/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/metapod/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Metapod", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Metapod LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/metapod/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/metapod/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Metapod", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Metapod fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/metapod/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/metapod/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Metapod", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Metapod fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/metapod/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/metapod/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Metapod", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Butterfree Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/butterfree/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/butterfree/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Butterfree", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Butterfree LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/butterfree/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/butterfree/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Butterfree", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Butterfree fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/butterfree/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/butterfree/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Butterfree", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Butterfree fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/butterfree/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/butterfree/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Butterfree", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Weedle Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/weedle/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/weedle/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Weedle", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Weedle LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/weedle/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/weedle/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Weedle", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Weedle fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/weedle/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/weedle/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Weedle", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Weedle fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/weedle/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/weedle/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Weedle", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Kakuna Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kakuna/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kakuna/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kakuna", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Kakuna LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kakuna/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kakuna/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kakuna", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Kakuna fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kakuna/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kakuna/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kakuna", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Kakuna fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kakuna/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kakuna/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kakuna", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Beedrill Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/beedrill/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/beedrill/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Beedrill", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Beedrill LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/beedrill/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/beedrill/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Beedrill", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Beedrill fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/beedrill/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/beedrill/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Beedrill", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Beedrill fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/beedrill/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/beedrill/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Beedrill", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Pidgey Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/pidgey/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/pidgey/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Pidgey", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Pidgey LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/pidgey/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/pidgey/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Pidgey", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Pidgey fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/pidgey/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/pidgey/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Pidgey", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Pidgey fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/pidgey/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/pidgey/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Pidgey", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Pidgeotto Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/pidgeotto/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/pidgeotto/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Pidgeotto", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Pidgeotto LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/pidgeotto/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/pidgeotto/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Pidgeotto", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Pidgeotto fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/pidgeotto/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/pidgeotto/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Pidgeotto", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Pidgeotto fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/pidgeotto/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/pidgeotto/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Pidgeotto", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Pidgeot Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/pidgeot/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/pidgeot/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Pidgeot", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Pidgeot LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/pidgeot/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/pidgeot/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Pidgeot", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Pidgeot fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/pidgeot/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/pidgeot/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Pidgeot", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Pidgeot fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/pidgeot/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/pidgeot/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Pidgeot", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Rattata Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/rattata/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/rattata/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Rattata", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Rattata LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/rattata/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/rattata/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Rattata", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Rattata fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/rattata/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/rattata/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Rattata", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Rattata fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/rattata/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/rattata/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Rattata", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Raticate Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/raticate/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/raticate/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Raticate", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Raticate LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/raticate/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/raticate/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Raticate", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Raticate fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/raticate/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/raticate/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Raticate", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Raticate fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/raticate/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/raticate/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Raticate", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Spearow Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/spearow/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/spearow/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Spearow", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Spearow LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/spearow/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/spearow/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Spearow", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Spearow fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/spearow/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/spearow/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Spearow", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Spearow fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/spearow/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/spearow/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Spearow", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Fearow Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/fearow/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/fearow/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Fearow", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Fearow LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/fearow/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/fearow/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Fearow", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Fearow fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/fearow/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/fearow/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Fearow", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Fearow fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/fearow/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/fearow/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Fearow", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Ekans Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/ekans/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/ekans/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ekans", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Ekans LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/ekans/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/ekans/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ekans", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Ekans fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/ekans/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/ekans/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ekans", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Ekans fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/ekans/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/ekans/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ekans", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Arbok Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/arbok/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/arbok/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Arbok", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Arbok LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/arbok/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/arbok/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Arbok", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Arbok fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/arbok/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/arbok/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Arbok", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Arbok fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/arbok/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/arbok/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Arbok", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Pikachu Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/pikachu/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/pikachu/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Pikachu", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Pikachu LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/pikachu/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/pikachu/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Pikachu", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Pikachu fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/pikachu/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/pikachu/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Pikachu", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Pikachu fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/pikachu/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/pikachu/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Pikachu", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Raichu Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/raichu/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/raichu/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Raichu", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Raichu LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/raichu/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/raichu/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Raichu", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Raichu fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/raichu/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/raichu/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Raichu", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Raichu fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/raichu/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/raichu/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Raichu", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Sandshrew Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/sandshrew/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/sandshrew/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Sandshrew", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Sandshrew LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/sandshrew/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/sandshrew/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Sandshrew", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Sandshrew fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/sandshrew/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/sandshrew/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Sandshrew", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Sandshrew fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/sandshrew/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/sandshrew/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Sandshrew", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Sandslash Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/sandslash/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/sandslash/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Sandslash", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Sandslash LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/sandslash/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/sandslash/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Sandslash", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Sandslash fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/sandslash/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/sandslash/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Sandslash", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Sandslash fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/sandslash/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/sandslash/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Sandslash", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Nidorina Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/nidorina/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/nidorina/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Nidorina", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Nidorina LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/nidorina/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/nidorina/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Nidorina", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Nidorina fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/nidorina/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/nidorina/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Nidorina", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Nidorina fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/nidorina/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/nidorina/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Nidorina", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Nidoqueen Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/nidoqueen/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/nidoqueen/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Nidoqueen", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Nidoqueen LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/nidoqueen/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/nidoqueen/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Nidoqueen", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Nidoqueen fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/nidoqueen/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/nidoqueen/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Nidoqueen", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Nidoqueen fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/nidoqueen/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/nidoqueen/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Nidoqueen", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Nidorino Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/nidorino/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/nidorino/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Nidorino", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Nidorino LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/nidorino/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/nidorino/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Nidorino", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Nidorino fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/nidorino/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/nidorino/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Nidorino", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Nidorino fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/nidorino/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/nidorino/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Nidorino", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Nidoking Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/nidoking/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/nidoking/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Nidoking", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Nidoking LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/nidoking/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/nidoking/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Nidoking", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Nidoking fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/nidoking/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/nidoking/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Nidoking", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Nidoking fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/nidoking/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/nidoking/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Nidoking", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Clefairy Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/clefairy/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/clefairy/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Clefairy", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Clefairy LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/clefairy/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/clefairy/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Clefairy", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Clefairy fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/clefairy/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/clefairy/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Clefairy", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Clefairy fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/clefairy/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/clefairy/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Clefairy", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Clefable Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/clefable/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/clefable/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Clefable", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Clefable LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/clefable/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/clefable/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Clefable", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Clefable fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/clefable/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/clefable/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Clefable", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Clefable fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/clefable/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/clefable/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Clefable", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Vulpix Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/vulpix/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/vulpix/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Vulpix", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Vulpix LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/vulpix/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/vulpix/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Vulpix", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Vulpix fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/vulpix/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/vulpix/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Vulpix", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Vulpix fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/vulpix/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/vulpix/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Vulpix", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Ninetales Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/ninetales/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/ninetales/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ninetales", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Ninetales LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/ninetales/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/ninetales/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ninetales", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Ninetales fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/ninetales/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/ninetales/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ninetales", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Ninetales fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/ninetales/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/ninetales/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ninetales", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Jigglypuff Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/jigglypuff/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/jigglypuff/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Jigglypuff", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Jigglypuff LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/jigglypuff/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/jigglypuff/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Jigglypuff", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Jigglypuff fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/jigglypuff/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/jigglypuff/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Jigglypuff", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Jigglypuff fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/jigglypuff/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/jigglypuff/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Jigglypuff", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Wigglytuff Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/wigglytuff/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/wigglytuff/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Wigglytuff", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Wigglytuff LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/wigglytuff/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/wigglytuff/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Wigglytuff", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Wigglytuff fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/wigglytuff/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/wigglytuff/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Wigglytuff", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Wigglytuff fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/wigglytuff/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/wigglytuff/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Wigglytuff", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Zubat Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/zubat/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/zubat/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Zubat", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Zubat LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/zubat/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/zubat/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Zubat", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Zubat fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/zubat/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/zubat/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Zubat", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Zubat fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/zubat/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/zubat/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Zubat", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Golbat Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/golbat/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/golbat/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Golbat", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Golbat LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/golbat/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/golbat/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Golbat", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Golbat fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/golbat/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/golbat/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Golbat", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Golbat fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/golbat/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/golbat/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Golbat", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Oddish Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/oddish/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/oddish/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Oddish", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Oddish LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/oddish/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/oddish/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Oddish", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Oddish fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/oddish/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/oddish/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Oddish", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Oddish fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/oddish/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/oddish/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Oddish", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Gloom Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/gloom/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/gloom/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Gloom", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Gloom LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/gloom/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/gloom/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Gloom", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Gloom fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/gloom/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/gloom/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Gloom", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Gloom fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/gloom/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/gloom/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Gloom", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Vileplume Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/vileplume/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/vileplume/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Vileplume", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Vileplume LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/vileplume/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/vileplume/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Vileplume", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Vileplume fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/vileplume/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/vileplume/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Vileplume", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Vileplume fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/vileplume/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/vileplume/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Vileplume", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Paras Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/paras/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/paras/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Paras", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Paras LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/paras/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/paras/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Paras", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Paras fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/paras/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/paras/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Paras", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Paras fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/paras/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/paras/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Paras", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Parasect Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/parasect/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/parasect/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Parasect", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Parasect LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/parasect/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/parasect/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Parasect", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Parasect fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/parasect/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/parasect/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Parasect", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Parasect fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/parasect/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/parasect/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Parasect", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Venonat Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/venonat/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/venonat/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Venonat", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Venonat LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/venonat/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/venonat/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Venonat", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Venonat fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/venonat/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/venonat/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Venonat", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Venonat fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/venonat/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/venonat/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Venonat", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Venomoth Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/venomoth/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/venomoth/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Venomoth", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Venomoth LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/venomoth/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/venomoth/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Venomoth", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Venomoth fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/venomoth/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/venomoth/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Venomoth", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Venomoth fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/venomoth/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/venomoth/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Venomoth", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Diglett Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/diglett/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/diglett/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Diglett", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Diglett LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/diglett/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/diglett/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Diglett", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Diglett fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/diglett/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/diglett/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Diglett", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Diglett fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/diglett/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/diglett/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Diglett", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Dugtrio Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dugtrio/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dugtrio/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dugtrio", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Dugtrio LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dugtrio/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dugtrio/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dugtrio", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Dugtrio fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dugtrio/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dugtrio/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dugtrio", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Dugtrio fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dugtrio/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dugtrio/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dugtrio", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Meowth Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/meowth/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/meowth/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Meowth", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Meowth LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/meowth/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/meowth/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Meowth", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Meowth fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/meowth/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/meowth/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Meowth", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Meowth fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/meowth/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/meowth/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Meowth", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Persian Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/persian/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/persian/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Persian", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Persian LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/persian/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/persian/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Persian", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Persian fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/persian/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/persian/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Persian", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Persian fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/persian/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/persian/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Persian", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Psyduck Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/psyduck/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/psyduck/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Psyduck", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Psyduck LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/psyduck/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/psyduck/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Psyduck", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Psyduck fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/psyduck/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/psyduck/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Psyduck", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Psyduck fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/psyduck/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/psyduck/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Psyduck", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Golduck Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/golduck/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/golduck/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Golduck", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Golduck LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/golduck/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/golduck/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Golduck", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Golduck fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/golduck/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/golduck/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Golduck", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Golduck fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/golduck/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/golduck/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Golduck", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Mankey Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/mankey/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/mankey/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Mankey", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Mankey LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/mankey/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/mankey/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Mankey", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Mankey fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/mankey/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/mankey/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Mankey", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Mankey fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/mankey/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/mankey/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Mankey", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Primeape Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/primeape/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/primeape/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Primeape", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Primeape LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/primeape/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/primeape/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Primeape", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Primeape fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/primeape/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/primeape/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Primeape", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Primeape fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/primeape/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/primeape/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Primeape", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Growlithe Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/growlithe/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/growlithe/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Growlithe", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Growlithe LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/growlithe/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/growlithe/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Growlithe", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Growlithe fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/growlithe/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/growlithe/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Growlithe", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Growlithe fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/growlithe/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/growlithe/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Growlithe", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Arcanine Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/arcanine/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/arcanine/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Arcanine", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Arcanine LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/arcanine/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/arcanine/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Arcanine", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Arcanine fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/arcanine/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/arcanine/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Arcanine", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Arcanine fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/arcanine/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/arcanine/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Arcanine", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Poliwag Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/poliwag/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/poliwag/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Poliwag", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Poliwag LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/poliwag/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/poliwag/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Poliwag", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Poliwag fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/poliwag/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/poliwag/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Poliwag", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Poliwag fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/poliwag/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/poliwag/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Poliwag", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Poliwhirl Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/poliwhirl/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/poliwhirl/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Poliwhirl", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Poliwhirl LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/poliwhirl/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/poliwhirl/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Poliwhirl", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Poliwhirl fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/poliwhirl/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/poliwhirl/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Poliwhirl", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Poliwhirl fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/poliwhirl/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/poliwhirl/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Poliwhirl", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Poliwrath Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/poliwrath/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/poliwrath/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Poliwrath", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Poliwrath LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/poliwrath/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/poliwrath/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Poliwrath", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Poliwrath fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/poliwrath/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/poliwrath/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Poliwrath", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Poliwrath fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/poliwrath/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/poliwrath/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Poliwrath", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Abra Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/abra/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/abra/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Abra", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Abra LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/abra/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/abra/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Abra", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Abra fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/abra/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/abra/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Abra", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Abra fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/abra/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/abra/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Abra", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Kadabra Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kadabra/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kadabra/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kadabra", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Kadabra LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kadabra/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kadabra/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kadabra", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Kadabra fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kadabra/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kadabra/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kadabra", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Kadabra fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kadabra/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kadabra/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kadabra", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Alakazam Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/alakazam/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/alakazam/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Alakazam", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Alakazam LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/alakazam/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/alakazam/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Alakazam", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Alakazam fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/alakazam/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/alakazam/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Alakazam", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Alakazam fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/alakazam/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/alakazam/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Alakazam", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Machop Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/machop/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/machop/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Machop", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Machop LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/machop/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/machop/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Machop", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Machop fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/machop/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/machop/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Machop", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Machop fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/machop/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/machop/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Machop", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Machoke Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/machoke/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/machoke/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Machoke", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Machoke LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/machoke/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/machoke/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Machoke", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Machoke fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/machoke/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/machoke/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Machoke", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Machoke fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/machoke/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/machoke/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Machoke", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Machamp Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/machamp/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/machamp/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Machamp", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Machamp LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/machamp/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/machamp/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Machamp", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Machamp fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/machamp/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/machamp/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Machamp", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Machamp fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/machamp/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/machamp/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Machamp", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Bellsprout Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/bellsprout/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/bellsprout/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Bellsprout", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Bellsprout LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/bellsprout/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/bellsprout/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Bellsprout", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Bellsprout fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/bellsprout/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/bellsprout/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Bellsprout", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Bellsprout fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/bellsprout/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/bellsprout/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Bellsprout", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Weepinbell Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/weepinbell/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/weepinbell/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Weepinbell", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Weepinbell LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/weepinbell/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/weepinbell/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Weepinbell", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Weepinbell fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/weepinbell/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/weepinbell/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Weepinbell", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Weepinbell fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/weepinbell/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/weepinbell/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Weepinbell", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Victreebel Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/victreebel/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/victreebel/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Victreebel", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Victreebel LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/victreebel/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/victreebel/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Victreebel", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Victreebel fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/victreebel/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/victreebel/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Victreebel", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Victreebel fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/victreebel/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/victreebel/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Victreebel", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Tentacool Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/tentacool/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/tentacool/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Tentacool", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Tentacool LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/tentacool/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/tentacool/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Tentacool", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Tentacool fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/tentacool/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/tentacool/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Tentacool", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Tentacool fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/tentacool/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/tentacool/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Tentacool", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Tentacruel Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/tentacruel/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/tentacruel/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Tentacruel", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Tentacruel LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/tentacruel/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/tentacruel/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Tentacruel", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Tentacruel fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/tentacruel/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/tentacruel/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Tentacruel", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Tentacruel fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/tentacruel/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/tentacruel/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Tentacruel", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Geodude Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/geodude/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/geodude/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Geodude", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Geodude LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/geodude/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/geodude/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Geodude", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Geodude fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/geodude/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/geodude/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Geodude", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Geodude fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/geodude/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/geodude/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Geodude", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Graveler Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/graveler/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/graveler/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Graveler", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Graveler LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/graveler/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/graveler/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Graveler", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Graveler fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/graveler/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/graveler/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Graveler", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Graveler fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/graveler/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/graveler/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Graveler", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Golem Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/golem/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/golem/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Golem", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Golem LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/golem/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/golem/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Golem", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Golem fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/golem/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/golem/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Golem", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Golem fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/golem/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/golem/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Golem", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Ponyta Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/ponyta/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/ponyta/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ponyta", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Ponyta LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/ponyta/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/ponyta/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ponyta", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Ponyta fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/ponyta/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/ponyta/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ponyta", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Ponyta fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/ponyta/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/ponyta/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ponyta", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Rapidash Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/rapidash/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/rapidash/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Rapidash", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Rapidash LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/rapidash/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/rapidash/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Rapidash", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Rapidash fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/rapidash/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/rapidash/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Rapidash", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Rapidash fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/rapidash/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/rapidash/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Rapidash", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Slowpoke Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/slowpoke/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/slowpoke/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Slowpoke", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Slowpoke LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/slowpoke/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/slowpoke/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Slowpoke", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Slowpoke fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/slowpoke/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/slowpoke/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Slowpoke", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Slowpoke fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/slowpoke/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/slowpoke/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Slowpoke", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Slowbro Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/slowbro/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/slowbro/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Slowbro", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Slowbro LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/slowbro/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/slowbro/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Slowbro", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Slowbro fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/slowbro/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/slowbro/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Slowbro", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Slowbro fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/slowbro/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/slowbro/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Slowbro", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Magnemite Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/magnemite/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/magnemite/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Magnemite", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Magnemite LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/magnemite/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/magnemite/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Magnemite", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Magnemite fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/magnemite/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/magnemite/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Magnemite", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Magnemite fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/magnemite/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/magnemite/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Magnemite", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Magneton Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/magneton/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/magneton/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Magneton", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Magneton LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/magneton/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/magneton/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Magneton", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Magneton fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/magneton/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/magneton/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Magneton", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Magneton fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/magneton/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/magneton/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Magneton", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Doduo Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/doduo/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/doduo/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Doduo", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Doduo LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/doduo/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/doduo/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Doduo", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Doduo fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/doduo/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/doduo/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Doduo", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Doduo fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/doduo/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/doduo/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Doduo", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Dodrio Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dodrio/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dodrio/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dodrio", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Dodrio LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dodrio/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dodrio/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dodrio", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Dodrio fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dodrio/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dodrio/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dodrio", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Dodrio fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dodrio/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dodrio/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dodrio", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Seel Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/seel/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/seel/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Seel", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Seel LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/seel/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/seel/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Seel", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Seel fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/seel/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/seel/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Seel", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Seel fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/seel/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/seel/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Seel", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Dewgong Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dewgong/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dewgong/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dewgong", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Dewgong LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dewgong/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dewgong/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dewgong", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Dewgong fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dewgong/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dewgong/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dewgong", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Dewgong fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dewgong/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dewgong/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dewgong", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Grimer Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/grimer/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/grimer/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Grimer", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Grimer LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/grimer/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/grimer/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Grimer", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Grimer fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/grimer/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/grimer/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Grimer", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Grimer fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/grimer/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/grimer/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Grimer", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Muk Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/muk/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/muk/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Muk", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Muk LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/muk/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/muk/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Muk", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Muk fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/muk/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/muk/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Muk", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Muk fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/muk/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/muk/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Muk", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Shellder Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/shellder/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/shellder/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Shellder", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Shellder LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/shellder/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/shellder/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Shellder", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Shellder fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/shellder/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/shellder/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Shellder", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Shellder fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/shellder/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/shellder/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Shellder", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Cloyster Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/cloyster/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/cloyster/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Cloyster", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Cloyster LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/cloyster/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/cloyster/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Cloyster", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Cloyster fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/cloyster/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/cloyster/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Cloyster", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Cloyster fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/cloyster/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/cloyster/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Cloyster", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Gastly Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/gastly/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/gastly/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Gastly", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Gastly LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/gastly/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/gastly/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Gastly", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Gastly fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/gastly/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/gastly/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Gastly", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Gastly fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/gastly/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/gastly/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Gastly", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Haunter Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/haunter/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/haunter/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Haunter", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Haunter LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/haunter/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/haunter/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Haunter", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Haunter fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/haunter/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/haunter/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Haunter", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Haunter fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/haunter/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/haunter/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Haunter", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Gengar Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/gengar/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/gengar/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Gengar", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Gengar LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/gengar/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/gengar/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Gengar", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Gengar fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/gengar/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/gengar/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Gengar", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Gengar fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/gengar/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/gengar/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Gengar", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Onix Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/onix/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/onix/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Onix", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Onix LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/onix/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/onix/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Onix", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Onix fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/onix/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/onix/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Onix", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Onix fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/onix/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/onix/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Onix", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Drowzee Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/drowzee/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/drowzee/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Drowzee", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Drowzee LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/drowzee/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/drowzee/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Drowzee", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Drowzee fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/drowzee/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/drowzee/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Drowzee", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Drowzee fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/drowzee/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/drowzee/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Drowzee", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Hypno Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/hypno/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/hypno/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Hypno", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Hypno LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/hypno/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/hypno/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Hypno", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Hypno fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/hypno/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/hypno/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Hypno", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Hypno fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/hypno/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/hypno/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Hypno", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Krabby Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/krabby/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/krabby/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Krabby", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Krabby LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/krabby/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/krabby/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Krabby", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Krabby fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/krabby/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/krabby/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Krabby", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Krabby fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/krabby/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/krabby/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Krabby", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Kingler Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kingler/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kingler/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kingler", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Kingler LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kingler/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kingler/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kingler", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Kingler fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kingler/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kingler/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kingler", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Kingler fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kingler/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kingler/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kingler", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Voltorb Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/voltorb/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/voltorb/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Voltorb", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Voltorb LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/voltorb/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/voltorb/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Voltorb", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Voltorb fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/voltorb/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/voltorb/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Voltorb", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Voltorb fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/voltorb/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/voltorb/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Voltorb", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Electrode Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/electrode/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/electrode/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Electrode", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Electrode LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/electrode/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/electrode/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Electrode", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Electrode fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/electrode/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/electrode/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Electrode", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Electrode fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/electrode/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/electrode/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Electrode", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Exeggcute Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/exeggcute/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/exeggcute/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Exeggcute", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Exeggcute LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/exeggcute/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/exeggcute/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Exeggcute", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Exeggcute fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/exeggcute/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/exeggcute/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Exeggcute", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Exeggcute fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/exeggcute/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/exeggcute/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Exeggcute", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Exeggutor Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/exeggutor/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/exeggutor/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Exeggutor", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Exeggutor LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/exeggutor/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/exeggutor/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Exeggutor", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Exeggutor fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/exeggutor/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/exeggutor/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Exeggutor", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Exeggutor fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/exeggutor/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/exeggutor/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Exeggutor", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Cubone Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/cubone/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/cubone/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Cubone", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Cubone LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/cubone/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/cubone/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Cubone", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Cubone fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/cubone/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/cubone/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Cubone", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Cubone fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/cubone/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/cubone/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Cubone", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Marowak Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/marowak/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/marowak/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Marowak", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Marowak LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/marowak/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/marowak/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Marowak", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Marowak fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/marowak/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/marowak/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Marowak", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Marowak fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/marowak/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/marowak/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Marowak", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Hitmonlee Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/hitmonlee/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/hitmonlee/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Hitmonlee", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Hitmonlee LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/hitmonlee/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/hitmonlee/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Hitmonlee", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Hitmonlee fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/hitmonlee/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/hitmonlee/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Hitmonlee", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Hitmonlee fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/hitmonlee/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/hitmonlee/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Hitmonlee", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Hitmonchan Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/hitmonchan/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/hitmonchan/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Hitmonchan", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Hitmonchan LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/hitmonchan/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/hitmonchan/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Hitmonchan", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Hitmonchan fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/hitmonchan/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/hitmonchan/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Hitmonchan", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Hitmonchan fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/hitmonchan/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/hitmonchan/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Hitmonchan", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Lickitung Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/lickitung/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/lickitung/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Lickitung", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Lickitung LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/lickitung/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/lickitung/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Lickitung", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Lickitung fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/lickitung/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/lickitung/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Lickitung", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Lickitung fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/lickitung/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/lickitung/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Lickitung", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Koffing Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/koffing/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/koffing/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Koffing", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Koffing LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/koffing/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/koffing/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Koffing", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Koffing fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/koffing/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/koffing/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Koffing", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Koffing fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/koffing/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/koffing/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Koffing", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Weezing Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/weezing/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/weezing/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Weezing", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Weezing LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/weezing/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/weezing/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Weezing", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Weezing fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/weezing/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/weezing/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Weezing", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Weezing fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/weezing/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/weezing/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Weezing", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Rhyhorn Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/rhyhorn/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/rhyhorn/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Rhyhorn", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Rhyhorn LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/rhyhorn/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/rhyhorn/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Rhyhorn", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Rhyhorn fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/rhyhorn/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/rhyhorn/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Rhyhorn", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Rhyhorn fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/rhyhorn/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/rhyhorn/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Rhyhorn", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Rhydon Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/rhydon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/rhydon/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Rhydon", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Rhydon LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/rhydon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/rhydon/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Rhydon", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Rhydon fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/rhydon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/rhydon/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Rhydon", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Rhydon fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/rhydon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/rhydon/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Rhydon", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Chansey Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/chansey/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/chansey/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Chansey", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Chansey LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/chansey/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/chansey/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Chansey", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Chansey fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/chansey/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/chansey/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Chansey", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Chansey fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/chansey/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/chansey/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Chansey", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Tangela Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/tangela/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/tangela/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Tangela", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Tangela LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/tangela/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/tangela/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Tangela", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Tangela fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/tangela/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/tangela/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Tangela", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Tangela fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/tangela/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/tangela/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Tangela", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Kangaskhan Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kangaskhan/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kangaskhan/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kangaskhan", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Kangaskhan LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kangaskhan/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kangaskhan/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kangaskhan", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Kangaskhan fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kangaskhan/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kangaskhan/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kangaskhan", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Kangaskhan fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kangaskhan/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kangaskhan/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kangaskhan", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Horsea Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/horsea/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/horsea/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Horsea", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Horsea LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/horsea/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/horsea/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Horsea", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Horsea fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/horsea/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/horsea/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Horsea", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Horsea fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/horsea/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/horsea/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Horsea", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Seadra Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/seadra/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/seadra/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Seadra", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Seadra LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/seadra/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/seadra/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Seadra", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Seadra fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/seadra/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/seadra/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Seadra", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Seadra fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/seadra/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/seadra/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Seadra", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Goldeen Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/goldeen/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/goldeen/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Goldeen", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Goldeen LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/goldeen/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/goldeen/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Goldeen", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Goldeen fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/goldeen/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/goldeen/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Goldeen", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Goldeen fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/goldeen/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/goldeen/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Goldeen", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Seaking Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/seaking/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/seaking/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Seaking", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Seaking LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/seaking/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/seaking/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Seaking", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Seaking fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/seaking/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/seaking/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Seaking", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Seaking fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/seaking/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/seaking/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Seaking", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Staryu Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/staryu/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/staryu/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Staryu", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Staryu LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/staryu/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/staryu/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Staryu", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Staryu fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/staryu/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/staryu/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Staryu", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Staryu fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/staryu/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/staryu/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Staryu", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Starmie Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/starmie/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/starmie/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Starmie", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Starmie LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/starmie/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/starmie/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Starmie", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Starmie fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/starmie/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/starmie/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Starmie", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Starmie fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/starmie/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/starmie/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Starmie", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Scyther Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/scyther/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/scyther/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Scyther", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Scyther LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/scyther/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/scyther/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Scyther", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Scyther fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/scyther/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/scyther/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Scyther", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Scyther fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/scyther/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/scyther/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Scyther", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Jynx Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/jynx/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/jynx/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Jynx", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Jynx LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/jynx/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/jynx/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Jynx", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Jynx fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/jynx/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/jynx/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Jynx", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Jynx fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/jynx/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/jynx/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Jynx", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Electabuzz Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/electabuzz/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/electabuzz/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Electabuzz", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Electabuzz LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/electabuzz/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/electabuzz/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Electabuzz", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Electabuzz fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/electabuzz/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/electabuzz/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Electabuzz", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Electabuzz fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/electabuzz/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/electabuzz/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Electabuzz", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Magmar Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/magmar/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/magmar/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Magmar", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Magmar LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/magmar/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/magmar/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Magmar", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Magmar fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/magmar/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/magmar/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Magmar", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Magmar fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/magmar/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/magmar/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Magmar", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Pinsir Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/pinsir/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/pinsir/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Pinsir", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Pinsir LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/pinsir/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/pinsir/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Pinsir", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Pinsir fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/pinsir/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/pinsir/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Pinsir", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Pinsir fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/pinsir/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/pinsir/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Pinsir", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Tauros Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/tauros/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/tauros/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Tauros", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Tauros LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/tauros/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/tauros/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Tauros", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Tauros fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/tauros/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/tauros/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Tauros", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Tauros fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/tauros/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/tauros/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Tauros", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Magikarp Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/magikarp/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/magikarp/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Magikarp", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Magikarp LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/magikarp/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/magikarp/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Magikarp", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Magikarp fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/magikarp/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/magikarp/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Magikarp", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Magikarp fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/magikarp/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/magikarp/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Magikarp", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Gyarados Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/gyarados/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/gyarados/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Gyarados", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Gyarados LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/gyarados/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/gyarados/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Gyarados", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Gyarados fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/gyarados/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/gyarados/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Gyarados", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Gyarados fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/gyarados/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/gyarados/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Gyarados", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Lapras Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/lapras/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/lapras/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Lapras", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Lapras LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/lapras/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/lapras/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Lapras", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Lapras fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/lapras/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/lapras/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Lapras", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Lapras fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/lapras/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/lapras/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Lapras", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Ditto Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/ditto/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/ditto/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ditto", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Ditto LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/ditto/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/ditto/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ditto", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Ditto fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/ditto/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/ditto/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ditto", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Ditto fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/ditto/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/ditto/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Ditto", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Eevee Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/eevee/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/eevee/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Eevee", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Eevee LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/eevee/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/eevee/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Eevee", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Eevee fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/eevee/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/eevee/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Eevee", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Eevee fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/eevee/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/eevee/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Eevee", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Vaporeon Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/vaporeon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/vaporeon/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Vaporeon", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Vaporeon LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/vaporeon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/vaporeon/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Vaporeon", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Vaporeon fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/vaporeon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/vaporeon/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Vaporeon", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Vaporeon fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/vaporeon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/vaporeon/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Vaporeon", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Jolteon Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/jolteon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/jolteon/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Jolteon", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Jolteon LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/jolteon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/jolteon/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Jolteon", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Jolteon fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/jolteon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/jolteon/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Jolteon", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Jolteon fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/jolteon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/jolteon/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Jolteon", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Flareon Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/flareon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/flareon/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Flareon", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Flareon LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/flareon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/flareon/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Flareon", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Flareon fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/flareon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/flareon/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Flareon", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Flareon fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/flareon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/flareon/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Flareon", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Porygon Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/porygon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/porygon/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Porygon", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Porygon LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/porygon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/porygon/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Porygon", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Porygon fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/porygon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/porygon/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Porygon", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Porygon fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/porygon/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/porygon/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Porygon", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Omanyte Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/omanyte/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/omanyte/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Omanyte", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Omanyte LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/omanyte/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/omanyte/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Omanyte", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Omanyte fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/omanyte/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/omanyte/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Omanyte", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Omanyte fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/omanyte/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/omanyte/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Omanyte", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Omastar Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/omastar/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/omastar/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Omastar", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Omastar LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/omastar/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/omastar/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Omastar", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Omastar fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/omastar/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/omastar/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Omastar", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Omastar fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/omastar/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/omastar/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Omastar", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Kabuto Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kabuto/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kabuto/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kabuto", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Kabuto LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kabuto/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kabuto/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kabuto", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Kabuto fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kabuto/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kabuto/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kabuto", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Kabuto fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kabuto/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kabuto/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kabuto", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Kabutops Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kabutops/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kabutops/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kabutops", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Kabutops LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kabutops/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kabutops/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kabutops", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Kabutops fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kabutops/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kabutops/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kabutops", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Kabutops fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/kabutops/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/kabutops/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Kabutops", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Aerodactyl Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/aerodactyl/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/aerodactyl/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Aerodactyl", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Aerodactyl LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/aerodactyl/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/aerodactyl/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Aerodactyl", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Aerodactyl fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/aerodactyl/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/aerodactyl/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Aerodactyl", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Aerodactyl fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/aerodactyl/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/aerodactyl/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Aerodactyl", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Snorlax Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/snorlax/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/snorlax/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Snorlax", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Snorlax LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/snorlax/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/snorlax/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Snorlax", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Snorlax fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/snorlax/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/snorlax/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Snorlax", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Snorlax fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/snorlax/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/snorlax/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Snorlax", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Articuno Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/articuno/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/articuno/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Articuno", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Articuno LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/articuno/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/articuno/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Articuno", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Articuno fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/articuno/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/articuno/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Articuno", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Articuno fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/articuno/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/articuno/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Articuno", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Zapdos Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/zapdos/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/zapdos/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Zapdos", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Zapdos LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/zapdos/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/zapdos/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Zapdos", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Zapdos fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/zapdos/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/zapdos/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Zapdos", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Zapdos fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/zapdos/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/zapdos/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Zapdos", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Moltres Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/moltres/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/moltres/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Moltres", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Moltres LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/moltres/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/moltres/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Moltres", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Moltres fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/moltres/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/moltres/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Moltres", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Moltres fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/moltres/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/moltres/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Moltres", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Dratini Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dratini/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dratini/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dratini", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Dratini LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dratini/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dratini/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dratini", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Dratini fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dratini/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dratini/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dratini", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Dratini fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dratini/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dratini/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dratini", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Dragonair Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dragonair/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dragonair/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dragonair", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Dragonair LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dragonair/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dragonair/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dragonair", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Dragonair fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dragonair/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dragonair/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dragonair", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Dragonair fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dragonair/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dragonair/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dragonair", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Dragonite Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dragonite/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dragonite/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dragonite", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Dragonite LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dragonite/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dragonite/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dragonite", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Dragonite fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dragonite/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dragonite/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dragonite", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Dragonite fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/dragonite/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/dragonite/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Dragonite", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Mewtwo Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/mewtwo/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/mewtwo/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Mewtwo", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Mewtwo LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/mewtwo/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/mewtwo/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Mewtwo", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Mewtwo fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/mewtwo/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/mewtwo/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Mewtwo", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Mewtwo fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/mewtwo/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/mewtwo/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Mewtwo", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +TEST("Compression test: Mew Smol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/mew/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/mew/anim_front.4bpp.smol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Mew", COMPRESSION_SMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Mew LZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/mew/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/mew/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Mew", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Mew fastLZ") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/mew/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/mew/anim_front.4bpp.lz"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Mew", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: Mew fastSmol") +{ + static const u32 origFile[] = INCBIN_U32("graphics/pokemon/mew/anim_front.4bpp"); + static const u32 compFile[] = INCBIN_U32("graphics/pokemon/mew/anim_front.4bpp.fastSmol"); + + bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Mew", COMPRESSION_FASTSMOL, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +#endif // ENABLE_ALL_COMPRESSION_TESTS + +TEST("Compression test: tilemap small smolTM") +{ + static const u16 origFile[] = INCBIN_U16("test/compression/tilemap.bin"); + static const u32 compFile[] = INCBIN_U32("test/compression/tilemap.bin.smolTM"); + + bool32 areEqual = DecompressTilemapPrintResults(compFile, origFile, "Tilemap", COMPRESSION_SMOL_TILEMAP, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: tilemap small LZ") +{ + static const u16 origFile[] = INCBIN_U16("test/compression/tilemap.bin"); + static const u32 compFile[] = INCBIN_U32("test/compression/tilemap.bin.lz"); + + bool32 areEqual = DecompressTilemapPrintResults(compFile, origFile, "Tilemap", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: tilemap small fastLZ") +{ + static const u16 origFile[] = INCBIN_U16("test/compression/tilemap.bin"); + static const u32 compFile[] = INCBIN_U32("test/compression/tilemap.bin.lz"); + + bool32 areEqual = DecompressTilemapPrintResults(compFile, origFile, "Tilemap", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: tilemap large smolTM") +{ + static const u16 origFile[] = INCBIN_U16("test/compression/tilemapLarge.bin"); + static const u32 compFile[] = INCBIN_U32("test/compression/tilemapLarge.bin.smolTM"); + + bool32 areEqual = DecompressTilemapPrintResults(compFile, origFile, "Tilemap", COMPRESSION_SMOL_TILEMAP, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: tilemap large LZ") +{ + static const u16 origFile[] = INCBIN_U16("test/compression/tilemapLarge.bin"); + static const u32 compFile[] = INCBIN_U32("test/compression/tilemapLarge.bin.lz"); + + bool32 areEqual = DecompressTilemapPrintResults(compFile, origFile, "Tilemap", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: tilemap large fastLZ") +{ + static const u16 origFile[] = INCBIN_U16("test/compression/tilemapLarge.bin"); + static const u32 compFile[] = INCBIN_U32("test/compression/tilemapLarge.bin.lz"); + + bool32 areEqual = DecompressTilemapPrintResults(compFile, origFile, "Tilemap", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: tilemap small smolTM VRAM") +{ + static const u16 origFile[] = INCBIN_U16("test/compression/tilemap.bin"); + static const u32 compFile[] = INCBIN_U32("test/compression/tilemap.bin.smolTM"); + + bool32 areEqual = DecompressTilemapPrintResultsVram(compFile, origFile, "Tilemap", COMPRESSION_SMOL_TILEMAP, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: tilemap small LZ VRAM") +{ + static const u16 origFile[] = INCBIN_U16("test/compression/tilemap.bin"); + static const u32 compFile[] = INCBIN_U32("test/compression/tilemap.bin.lz"); + + bool32 areEqual = DecompressTilemapPrintResultsVram(compFile, origFile, "Tilemap", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +// The fastLZ function for this doesn't exist +/* +TEST("Compression test: tilemap small fastLZ VRAM") +{ + static const u16 origFile[] = INCBIN_U16("test/compression/tilemap.bin"); + static const u32 compFile[] = INCBIN_U32("test/compression/tilemap.bin.lz"); + + bool32 areEqual = DecompressTilemapPrintResultsVram(compFile, origFile, "Tilemap", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +*/ + +TEST("Compression test: tilemap large smolTM VRAM") +{ + static const u16 origFile[] = INCBIN_U16("test/compression/tilemapLarge.bin"); + static const u32 compFile[] = INCBIN_U32("test/compression/tilemapLarge.bin.smolTM"); + + bool32 areEqual = DecompressTilemapPrintResultsVram(compFile, origFile, "Tilemap", COMPRESSION_SMOL_TILEMAP, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +TEST("Compression test: tilemap large LZ VRAM") +{ + static const u16 origFile[] = INCBIN_U16("test/compression/tilemapLarge.bin"); + static const u32 compFile[] = INCBIN_U32("test/compression/tilemapLarge.bin.lz"); + + bool32 areEqual = DecompressTilemapPrintResultsVram(compFile, origFile, "Tilemap", COMPRESSION_LZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} + +// The fastLZ function for this doesn't exist +/* +TEST("Compression test: tilemap large fastLZ VRAM") +{ + static const u16 origFile[] = INCBIN_U16("test/compression/tilemapLarge.bin"); + static const u32 compFile[] = INCBIN_U32("test/compression/tilemapLarge.bin.lz"); + + bool32 areEqual = DecompressTilemapPrintResultsVram(compFile, origFile, "Tilemap", COMPRESSION_FASTLZ, sizeof(compFile)); + EXPECT_EQ(areEqual, TRUE); +} +*/ diff --git a/test/compression/table_32_32.png b/test/compression/table_32_32.png new file mode 100644 index 000000000000..4b5722c91033 Binary files /dev/null and b/test/compression/table_32_32.png differ diff --git a/test/compression/table_33_31.png b/test/compression/table_33_31.png new file mode 100644 index 000000000000..f21075b1f0a8 Binary files /dev/null and b/test/compression/table_33_31.png differ diff --git a/test/compression/table_34_30.png b/test/compression/table_34_30.png new file mode 100644 index 000000000000..53f81842b2b8 Binary files /dev/null and b/test/compression/table_34_30.png differ diff --git a/test/compression/table_35_29.png b/test/compression/table_35_29.png new file mode 100644 index 000000000000..0a60fcc7c264 Binary files /dev/null and b/test/compression/table_35_29.png differ diff --git a/test/compression/table_36_28.png b/test/compression/table_36_28.png new file mode 100644 index 000000000000..3dd266ca96e0 Binary files /dev/null and b/test/compression/table_36_28.png differ diff --git a/test/compression/table_37_27.png b/test/compression/table_37_27.png new file mode 100644 index 000000000000..651d7c3899f6 Binary files /dev/null and b/test/compression/table_37_27.png differ diff --git a/test/compression/table_38_26.png b/test/compression/table_38_26.png new file mode 100644 index 000000000000..0cbf8e0a0ad4 Binary files /dev/null and b/test/compression/table_38_26.png differ diff --git a/test/compression/table_39_25.png b/test/compression/table_39_25.png new file mode 100644 index 000000000000..c91994abcd30 Binary files /dev/null and b/test/compression/table_39_25.png differ diff --git a/test/compression/table_40_24.png b/test/compression/table_40_24.png new file mode 100644 index 000000000000..0f2b192610e4 Binary files /dev/null and b/test/compression/table_40_24.png differ diff --git a/test/compression/table_41_23.png b/test/compression/table_41_23.png new file mode 100644 index 000000000000..15cc2eac49c8 Binary files /dev/null and b/test/compression/table_41_23.png differ diff --git a/test/compression/table_42_22.png b/test/compression/table_42_22.png new file mode 100644 index 000000000000..d59f48b7fb38 Binary files /dev/null and b/test/compression/table_42_22.png differ diff --git a/test/compression/table_43_21.png b/test/compression/table_43_21.png new file mode 100644 index 000000000000..df7aeea81530 Binary files /dev/null and b/test/compression/table_43_21.png differ diff --git a/test/compression/table_44_20.png b/test/compression/table_44_20.png new file mode 100644 index 000000000000..354132253626 Binary files /dev/null and b/test/compression/table_44_20.png differ diff --git a/test/compression/table_45_19.png b/test/compression/table_45_19.png new file mode 100644 index 000000000000..2f6eeff3cc95 Binary files /dev/null and b/test/compression/table_45_19.png differ diff --git a/test/compression/table_46_18.png b/test/compression/table_46_18.png new file mode 100644 index 000000000000..c39bdf757c64 Binary files /dev/null and b/test/compression/table_46_18.png differ diff --git a/test/compression/table_47_17.png b/test/compression/table_47_17.png new file mode 100644 index 000000000000..792f053dc8c0 Binary files /dev/null and b/test/compression/table_47_17.png differ diff --git a/test/compression/table_48_16.png b/test/compression/table_48_16.png new file mode 100644 index 000000000000..d88f3794cfa6 Binary files /dev/null and b/test/compression/table_48_16.png differ diff --git a/test/compression/table_49_15.png b/test/compression/table_49_15.png new file mode 100644 index 000000000000..59114553276e Binary files /dev/null and b/test/compression/table_49_15.png differ diff --git a/test/compression/table_50_14.png b/test/compression/table_50_14.png new file mode 100644 index 000000000000..a773629b05a5 Binary files /dev/null and b/test/compression/table_50_14.png differ diff --git a/test/compression/table_51_13.png b/test/compression/table_51_13.png new file mode 100644 index 000000000000..edece0a3e87d Binary files /dev/null and b/test/compression/table_51_13.png differ diff --git a/test/compression/table_52_12.png b/test/compression/table_52_12.png new file mode 100644 index 000000000000..686ffb10835c Binary files /dev/null and b/test/compression/table_52_12.png differ diff --git a/test/compression/table_53_11.png b/test/compression/table_53_11.png new file mode 100644 index 000000000000..9fce27e88fd4 Binary files /dev/null and b/test/compression/table_53_11.png differ diff --git a/test/compression/table_54_10.png b/test/compression/table_54_10.png new file mode 100644 index 000000000000..ce94bc41eabe Binary files /dev/null and b/test/compression/table_54_10.png differ diff --git a/test/compression/table_55_9.png b/test/compression/table_55_9.png new file mode 100644 index 000000000000..30665e3e1458 Binary files /dev/null and b/test/compression/table_55_9.png differ diff --git a/test/compression/table_56_8.png b/test/compression/table_56_8.png new file mode 100644 index 000000000000..1d9da97dde56 Binary files /dev/null and b/test/compression/table_56_8.png differ diff --git a/test/compression/table_57_7.png b/test/compression/table_57_7.png new file mode 100644 index 000000000000..9c58b336779a Binary files /dev/null and b/test/compression/table_57_7.png differ diff --git a/test/compression/table_58_6.png b/test/compression/table_58_6.png new file mode 100644 index 000000000000..c3d836142242 Binary files /dev/null and b/test/compression/table_58_6.png differ diff --git a/test/compression/table_59_5.png b/test/compression/table_59_5.png new file mode 100644 index 000000000000..d7a283ced33c Binary files /dev/null and b/test/compression/table_59_5.png differ diff --git a/test/compression/table_60_4.png b/test/compression/table_60_4.png new file mode 100644 index 000000000000..cdbbee03db80 Binary files /dev/null and b/test/compression/table_60_4.png differ diff --git a/test/compression/table_61_3.png b/test/compression/table_61_3.png new file mode 100644 index 000000000000..2e420c5f7f84 Binary files /dev/null and b/test/compression/table_61_3.png differ diff --git a/test/compression/table_62_2.png b/test/compression/table_62_2.png new file mode 100644 index 000000000000..9965e96be792 Binary files /dev/null and b/test/compression/table_62_2.png differ diff --git a/test/compression/table_63_1.png b/test/compression/table_63_1.png new file mode 100644 index 000000000000..6f4be88870cb Binary files /dev/null and b/test/compression/table_63_1.png differ diff --git a/test/compression/tilemap.bin b/test/compression/tilemap.bin new file mode 100644 index 000000000000..1800bff4dc9d Binary files /dev/null and b/test/compression/tilemap.bin differ diff --git a/test/compression/tilemapLarge.bin b/test/compression/tilemapLarge.bin new file mode 100644 index 000000000000..d102290e4cbc Binary files /dev/null and b/test/compression/tilemapLarge.bin differ diff --git a/test/compression/tilesetTest.png b/test/compression/tilesetTest.png new file mode 100644 index 000000000000..17426ab80e8f Binary files /dev/null and b/test/compression/tilesetTest.png differ diff --git a/test/daycare.c b/test/daycare.c index 1f142f115495..37927370307c 100644 --- a/test/daycare.c +++ b/test/daycare.c @@ -51,7 +51,10 @@ TEST("(Daycare) PokΓ©mon can breed with Ditto if they don't belong to the Ditto ZeroPlayerPartyMons(); for (j = 1; j < NUM_SPECIES; j++) - PARAMETRIZE { parentSpecies = j; } + { + if (IsSpeciesEnabled(j)) + PARAMETRIZE { parentSpecies = j; } + } VarSet(VAR_TEMP_C, parentSpecies); RUN_OVERWORLD_SCRIPT( givemon SPECIES_DITTO, 100; givemon VAR_TEMP_C, 100; diff --git a/test/pokemon.c b/test/pokemon.c index ac57314f9c19..c902e56e45f6 100644 --- a/test/pokemon.c +++ b/test/pokemon.c @@ -4,6 +4,8 @@ #include "pokemon.h" #include "test/overworld_script.h" #include "test/test.h" +#include "constants/characters.h" +#include "constants/move_relearner.h" TEST("Nature independent from Hidden Nature") { @@ -24,18 +26,20 @@ TEST("Nature independent from Hidden Nature") TEST("Terastallization type defaults to primary or secondary type") { - u32 i, teraType; + u32 i; + enum Type teraType; struct Pokemon mon; for (i = 0; i < 128; i++) PARAMETRIZE {} CreateMon(&mon, SPECIES_PIDGEY, 100, 0, FALSE, 0, OT_ID_PRESET, 0); teraType = GetMonData(&mon, MON_DATA_TERA_TYPE); - EXPECT(teraType == gSpeciesInfo[SPECIES_PIDGEY].types[0] - || teraType == gSpeciesInfo[SPECIES_PIDGEY].types[1]); + EXPECT(teraType == GetSpeciesType(SPECIES_PIDGEY, 0) + || teraType == GetSpeciesType(SPECIES_PIDGEY, 1)); } TEST("Terastallization type can be set to any type except TYPE_NONE") { - u32 i, teraType; + u32 i; + enum Type teraType; struct Pokemon mon; for (i = 1; i < NUMBER_OF_MON_TYPES; i++) { @@ -48,7 +52,8 @@ TEST("Terastallization type can be set to any type except TYPE_NONE") TEST("Terastallization type is reset to the default types when setting Tera Type back to TYPE_NONE") { - u32 i, teraType, typeNone; + u32 i; + enum Type teraType, typeNone; struct Pokemon mon; for (i = 1; i < NUMBER_OF_MON_TYPES; i++) { @@ -61,8 +66,8 @@ TEST("Terastallization type is reset to the default types when setting Tera Type typeNone = GetTeraTypeFromPersonality(&mon); SetMonData(&mon, MON_DATA_TERA_TYPE, &typeNone); typeNone = GetMonData(&mon, MON_DATA_TERA_TYPE); - EXPECT(typeNone == gSpeciesInfo[SPECIES_PIDGEY].types[0] - || typeNone == gSpeciesInfo[SPECIES_PIDGEY].types[1]); + EXPECT(typeNone == GetSpeciesType(SPECIES_PIDGEY, 0) + || typeNone == GetSpeciesType(SPECIES_PIDGEY, 1)); } TEST("Shininess independent from PID and OTID") @@ -287,7 +292,7 @@ TEST("givemon [moves]") ZeroPlayerPartyMons(); RUN_OVERWORLD_SCRIPT( - givemon SPECIES_WOBBUFFET, 100, move1=MOVE_SCRATCH, move2=MOVE_SPLASH, move3=MOVE_NONE, move4=MOVE_NONE; + givemon SPECIES_WOBBUFFET, 100, move1=MOVE_SCRATCH, move2=MOVE_SPLASH, move3=MOVE_NONE; ); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_WOBBUFFET); @@ -303,7 +308,7 @@ TEST("givemon [all]") ZeroPlayerPartyMons(); RUN_OVERWORLD_SCRIPT( - givemon SPECIES_WOBBUFFET, 100, item=ITEM_LEFTOVERS, ball=ITEM_MASTER_BALL, nature=NATURE_BOLD, abilityNum=2, gender=MON_MALE, hpEv=1, atkEv=2, defEv=3, speedEv=4, spAtkEv=5, spDefEv=6, hpIv=7, atkIv=8, defIv=9, speedIv=10, spAtkIv=11, spDefIv=12, move1=MOVE_SCRATCH, move2=MOVE_SPLASH, move3=MOVE_CELEBRATE, move4=MOVE_EXPLOSION, isShiny=TRUE, gmaxFactor=TRUE, teraType=TYPE_FIRE, dmaxLevel=7; + givemon SPECIES_WOBBUFFET, 100, item=ITEM_LEFTOVERS, ball=ITEM_MASTER_BALL, nature=NATURE_BOLD, abilityNum=2, gender=MON_MALE, hpEv=1, atkEv=2, defEv=3, speedEv=4, spAtkEv=5, spDefEv=6, hpIv=7, atkIv=8, defIv=9, speedIv=10, spAtkIv=11, spDefIv=12, move1=MOVE_SCRATCH, move2=MOVE_SPLASH, move3=MOVE_CELEBRATE, move4=MOVE_EXPLOSION, shinyMode=SHINY_MODE_ALWAYS, gmaxFactor=TRUE, teraType=TYPE_FIRE, dmaxLevel=7; ); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_WOBBUFFET); @@ -311,7 +316,7 @@ TEST("givemon [all]") EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HELD_ITEM), ITEM_LEFTOVERS); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_POKEBALL), BALL_MASTER); EXPECT_EQ(GetNature(&gPlayerParty[0]), NATURE_BOLD); - EXPECT_EQ(GetMonAbility(&gPlayerParty[0]), gSpeciesInfo[SPECIES_WOBBUFFET].abilities[2]); + EXPECT_EQ(GetMonAbility(&gPlayerParty[0]), GetSpeciesAbility(SPECIES_WOBBUFFET, 2)); EXPECT_EQ(GetMonGender(&gPlayerParty[0]), MON_MALE); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HP_EV), 1); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_ATK_EV), 2); @@ -362,13 +367,13 @@ TEST("givemon [vars]") VarSet(VAR_TEMP_6, MOVE_SPLASH); VarSet(VAR_TEMP_7, MOVE_CELEBRATE); VarSet(VAR_TEMP_8, MOVE_EXPLOSION); - VarSet(VAR_TEMP_9, TRUE); + VarSet(VAR_TEMP_9, SHINY_MODE_ALWAYS); VarSet(VAR_TEMP_A, TRUE); VarSet(VAR_TEMP_B, TYPE_FIRE); VarSet(VAR_TEMP_E, 7); RUN_OVERWORLD_SCRIPT( - givemon VAR_TEMP_C, VAR_TEMP_D, item=VAR_0x8000, ball=VAR_0x8001, nature=VAR_0x8002, abilityNum=VAR_0x8003, gender=VAR_0x8004, hpEv=VAR_0x8005, atkEv=VAR_0x8006, defEv=VAR_0x8007, speedEv=VAR_0x8008, spAtkEv=VAR_0x8009, spDefEv=VAR_0x800A, hpIv=VAR_0x800B, atkIv=VAR_TEMP_0, defIv=VAR_TEMP_1, speedIv=VAR_TEMP_2, spAtkIv=VAR_TEMP_3, spDefIv=VAR_TEMP_4, move1=VAR_TEMP_5, move2=VAR_TEMP_6, move3=VAR_TEMP_7, move4=VAR_TEMP_8, isShiny=VAR_TEMP_9, gmaxFactor=VAR_TEMP_A, teraType=VAR_TEMP_B, dmaxLevel=VAR_TEMP_E; + givemon VAR_TEMP_C, VAR_TEMP_D, item=VAR_0x8000, ball=VAR_0x8001, nature=VAR_0x8002, abilityNum=VAR_0x8003, gender=VAR_0x8004, hpEv=VAR_0x8005, atkEv=VAR_0x8006, defEv=VAR_0x8007, speedEv=VAR_0x8008, spAtkEv=VAR_0x8009, spDefEv=VAR_0x800A, hpIv=VAR_0x800B, atkIv=VAR_TEMP_0, defIv=VAR_TEMP_1, speedIv=VAR_TEMP_2, spAtkIv=VAR_TEMP_3, spDefIv=VAR_TEMP_4, move1=VAR_TEMP_5, move2=VAR_TEMP_6, move3=VAR_TEMP_7, move4=VAR_TEMP_8, shinyMode=VAR_TEMP_9, gmaxFactor=VAR_TEMP_A, teraType=VAR_TEMP_B, dmaxLevel=VAR_TEMP_E; ); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_WOBBUFFET); @@ -376,7 +381,7 @@ TEST("givemon [vars]") EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HELD_ITEM), ITEM_LEFTOVERS); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_POKEBALL), BALL_MASTER); EXPECT_EQ(GetNature(&gPlayerParty[0]), NATURE_BOLD); - EXPECT_EQ(GetMonAbility(&gPlayerParty[0]), gSpeciesInfo[SPECIES_WOBBUFFET].abilities[2]); + EXPECT_EQ(GetMonAbility(&gPlayerParty[0]), GetSpeciesAbility(SPECIES_WOBBUFFET, 2)); EXPECT_EQ(GetMonGender(&gPlayerParty[0]), MON_MALE); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HP_EV), 1); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_ATK_EV), 2); @@ -450,3 +455,143 @@ TEST("PokΓ©mon level up learnsets fit within MAX_LEVEL_UP_MOVES and MAX_RELEARNE EXPECT_LT(count, MAX_LEVEL_UP_MOVES); EXPECT_LT(count, MAX_RELEARNER_MOVES - 1); // - 1 because at least one move is already known } + +TEST("Optimised GetMonData") +{ + CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 5, 0, FALSE, 0, OT_ID_PRESET, 0x12345678); + u32 exp = 0x123456; + SetMonData(&gPlayerParty[0], MON_DATA_EXP, &exp); + struct Benchmark optimised, + vanilla = (struct Benchmark) { .ticks = 137 }; // From prior testing + u32 expGet = 0; + BENCHMARK(&optimised) { expGet = GetMonData(&gPlayerParty[0], MON_DATA_EXP); } + EXPECT_EQ(exp, expGet); + EXPECT_FASTER(optimised, vanilla); +} + +TEST("Optimised SetMonData") +{ + CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 5, 0, FALSE, 0, OT_ID_PRESET, 0x12345678); + u32 exp = 0x123456; + struct Benchmark optimised, + vanilla = (struct Benchmark) { .ticks = 205 }; // From prior testing + BENCHMARK(&optimised) { SetMonData(&gPlayerParty[0], MON_DATA_EXP, &exp); } + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_BAD_EGG), FALSE); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_EXP), exp); + EXPECT_FASTER(optimised, vanilla); +} + +//Sanity check for a CalculateMonStats refactor (could be deleted or improved) +TEST("CalculateMonStats") +{ + ZeroPlayerPartyMons(); + + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_WOBBUFFET, 100, item=ITEM_LEFTOVERS, ball=ITEM_MASTER_BALL, nature=NATURE_BOLD, abilityNum=2, gender=MON_MALE, hpEv=1, atkEv=2, defEv=3, speedEv=4, spAtkEv=5, spDefEv=6, hpIv=7, atkIv=8, defIv=9, speedIv=10, spAtkIv=11, spDefIv=12, move1=MOVE_SCRATCH, move2=MOVE_SPLASH, move3=MOVE_CELEBRATE, move4=MOVE_EXPLOSION, shinyMode=SHINY_MODE_ALWAYS, gmaxFactor=TRUE, teraType=TYPE_FIRE, dmaxLevel=7; + ); + + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_MAX_HP), 497); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_ATK), 71); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_DEF), 143); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPEED), 82); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPATK), 83); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPDEF), 134); + +} + +TEST("BoxPokemon encryption works") +{ + u32 raw[20] = + { + 990384375, + 2948624514, + 3907508686, + 14410461, + 35316705, + 3907508686, + 64742109, + 718729, + 3102307966, + 2160206402, + 49956971, + 2495766612, + 1424318580, + 273408756, + 2371630199, + 2708871082, + 3059937332, + 2529190026, + 2290634828, + 2870614922 + }; + + struct Pokemon mon; + BoxMonToMon((struct BoxPokemon *)&raw, &mon); + + EXPECT_EQ(GetMonData(&mon, MON_DATA_SANITY_IS_BAD_EGG), 0); + EXPECT_EQ(GetMonData(&mon, MON_DATA_SPECIES), SPECIES_TORCHIC); + EXPECT_EQ(GetMonData(&mon, MON_DATA_MARKINGS), 3); + const u8 *actualNickname = COMPOUND_STRING("Testing mon"); + u8 nickname[12]; + GetMonData(&mon, MON_DATA_NICKNAME, nickname); + u32 charIndex = 0; + while (actualNickname[charIndex] != EOS) + { + EXPECT_EQ(actualNickname[charIndex], nickname[charIndex]); + charIndex++; + } + EXPECT_EQ(GetNature(&mon), NATURE_HARDY); + EXPECT_EQ(GetMonData(&mon, MON_DATA_HIDDEN_NATURE), NATURE_ADAMANT); + EXPECT_EQ(GetMonData(&mon, MON_DATA_HP_LOST), 10); + EXPECT_EQ(GetMonData(&mon, MON_DATA_HELD_ITEM), ITEM_ORAN_BERRY); + EXPECT_EQ(GetMonData(&mon, MON_DATA_MOVE1), MOVE_TACKLE); + EXPECT_EQ(GetMonData(&mon, MON_DATA_MOVE2), MOVE_SCRATCH); + EXPECT_EQ(GetMonData(&mon, MON_DATA_MOVE3), MOVE_POUND); + EXPECT_EQ(GetMonData(&mon, MON_DATA_MOVE4), MOVE_GROWL); + EXPECT_EQ(GetMonData(&mon, MON_DATA_PP1), 1); + EXPECT_EQ(GetMonData(&mon, MON_DATA_PP2), 2); + EXPECT_EQ(GetMonData(&mon, MON_DATA_PP3), 3); + EXPECT_EQ(GetMonData(&mon, MON_DATA_PP4), 4); + EXPECT_EQ(GetMonData(&mon, MON_DATA_PP_BONUSES), 255); + EXPECT_EQ(GetMonData(&mon, MON_DATA_COOL), 10); + EXPECT_EQ(GetMonData(&mon, MON_DATA_BEAUTY), 20); + EXPECT_EQ(GetMonData(&mon, MON_DATA_CUTE), 30); + EXPECT_EQ(GetMonData(&mon, MON_DATA_SMART), 40); + EXPECT_EQ(GetMonData(&mon, MON_DATA_TOUGH), 50); + EXPECT_EQ(GetMonData(&mon, MON_DATA_SHEEN), 150); + EXPECT_EQ(GetMonData(&mon, MON_DATA_EXP), 12345); + EXPECT_EQ(GetMonData(&mon, MON_DATA_MET_LEVEL), 20); + EXPECT_EQ(GetMonData(&mon, MON_DATA_HP_EV), 11); + EXPECT_EQ(GetMonData(&mon, MON_DATA_ATK_EV), 22); + EXPECT_EQ(GetMonData(&mon, MON_DATA_DEF_EV), 33); + EXPECT_EQ(GetMonData(&mon, MON_DATA_SPEED_EV), 44); + EXPECT_EQ(GetMonData(&mon, MON_DATA_SPATK_EV), 55); + EXPECT_EQ(GetMonData(&mon, MON_DATA_SPDEF_EV), 66); + EXPECT_EQ(GetMonData(&mon, MON_DATA_FRIENDSHIP), 123); + EXPECT_EQ(GetMonData(&mon, MON_DATA_POKERUS), 2); + EXPECT_EQ(GetMonData(&mon, MON_DATA_POKEBALL), BALL_FRIEND); + EXPECT_EQ(GetMonData(&mon, MON_DATA_HP_IV), 31); + EXPECT_EQ(GetMonData(&mon, MON_DATA_ATK_IV), 30); + EXPECT_EQ(GetMonData(&mon, MON_DATA_DEF_IV), 29); + EXPECT_EQ(GetMonData(&mon, MON_DATA_SPEED_IV), 28); + EXPECT_EQ(GetMonData(&mon, MON_DATA_SPATK_IV), 27); + EXPECT_EQ(GetMonData(&mon, MON_DATA_SPDEF_IV), 26); + EXPECT_EQ(GetMonData(&mon, MON_DATA_CUTE_RIBBON), 1); + EXPECT_EQ(GetMonData(&mon, MON_DATA_BEAUTY_RIBBON), 0); + EXPECT_EQ(GetMonData(&mon, MON_DATA_TOUGH_RIBBON), 1); + EXPECT_EQ(GetMonData(&mon, MON_DATA_SMART_RIBBON), 0); + EXPECT_EQ(GetMonData(&mon, MON_DATA_CHAMPION_RIBBON), 1); + EXPECT_EQ(GetMonData(&mon, MON_DATA_VICTORY_RIBBON), 1); + EXPECT_EQ(GetMonData(&mon, MON_DATA_EFFORT_RIBBON), 1); + EXPECT_EQ(GetMonData(&mon, MON_DATA_LAND_RIBBON), 1); + EXPECT_EQ(GetMonData(&mon, MON_DATA_COUNTRY_RIBBON), 1); + EXPECT_EQ(GetMonData(&mon, MON_DATA_EARTH_RIBBON), 1); + EXPECT_EQ(GetMonData(&mon, MON_DATA_HYPER_TRAINED_HP), 1); + EXPECT_EQ(GetMonData(&mon, MON_DATA_HYPER_TRAINED_ATK), 1); + EXPECT_EQ(GetMonData(&mon, MON_DATA_HYPER_TRAINED_DEF), 1); + EXPECT_EQ(GetMonData(&mon, MON_DATA_HYPER_TRAINED_SPEED), 1); + EXPECT_EQ(GetMonData(&mon, MON_DATA_HYPER_TRAINED_SPATK), 1); + EXPECT_EQ(GetMonData(&mon, MON_DATA_HYPER_TRAINED_SPDEF), 1); + EXPECT_EQ(GetMonData(&mon, MON_DATA_DYNAMAX_LEVEL), 3); + EXPECT_EQ(GetMonData(&mon, MON_DATA_OT_GENDER), 0); +} diff --git a/test/save.c b/test/save.c new file mode 100644 index 000000000000..4e3000a794bf --- /dev/null +++ b/test/save.c @@ -0,0 +1,35 @@ +#include "global.h" +#include "pokemon_storage_system.h" +#include "test/test.h" + +// If you would like to ensure save compatibility, update the values below with those for your hack. You can find these through the debug menu. +// Please note that this simple check is not 100% foolproof, but should be able to catch most unintended shifts. +#define T_SAVEBLOCK1_SIZE 15568 +#define T_SAVEBLOCK2_SIZE 3884 +#define T_SAVEBLOCK3_SIZE 4 +#define T_POKEMONSTORAGE_SIZE 34144 + +TEST("SaveBlock1 is backwards compatible") +{ + EXPECT_EQ(sizeof(struct SaveBlock1), T_SAVEBLOCK1_SIZE); +} + +TEST("SaveBlock2 is backwards compatible") +{ + EXPECT_EQ(sizeof(struct SaveBlock2), T_SAVEBLOCK2_SIZE); +} + +TEST("SaveBlock3 is backwards compatible") +{ + EXPECT_EQ(sizeof(struct SaveBlock3), T_SAVEBLOCK3_SIZE); +} + +TEST("PokemonStorage is backwards compatible") +{ + EXPECT_EQ(sizeof(struct PokemonStorage), T_POKEMONSTORAGE_SIZE); +} + +#undef T_SAVEBLOCK1_SIZE +#undef T_SAVEBLOCK2_SIZE +#undef T_SAVEBLOCK3_SIZE +#undef T_POKEMONSTORAGE_SIZE diff --git a/test/script.c b/test/script.c index 5f185d72cf7b..cf21124c9512 100644 --- a/test/script.c +++ b/test/script.c @@ -3,6 +3,7 @@ #include "test/overworld_script.h" #include "script.h" #include "constants/decorations.h" +#include "constants/field_move.h" #include "constants/moves.h" TEST("Script_HasNoEffect control flow") @@ -46,7 +47,7 @@ TEST("Script_HasNoEffect variables") checkpcitem ITEM_POTION, 1; checkdecorspace DECOR_SNORLAX_DOLL; checkdecor DECOR_SNORLAX_DOLL; - checkpartymove MOVE_CELEBRATE; + checkfieldmove 0, TRUE; // doesn't work with enums currently random 2; checkmoney 5000; getpokenewsactive POKENEWS_LILYCOVE; diff --git a/test/species.c b/test/species.c index 06351f179ea7..c4d91e60e572 100644 --- a/test/species.c +++ b/test/species.c @@ -106,7 +106,7 @@ TEST("No species has two evolutions that use the evolution tracker") for (i = 0; i < NUM_SPECIES; i++) { - if (GetSpeciesEvolutions(i) != NULL) PARAMETRIZE { species = i; } + if (IsSpeciesEnabled(i) && GetSpeciesEvolutions(i) != NULL) PARAMETRIZE { species = i; } } evolutionTrackerEvolutions = 0; diff --git a/test/test_runner.c b/test/test_runner.c index a1460365e066..ef12e8d5f173 100644 --- a/test/test_runner.c +++ b/test/test_runner.c @@ -1,4 +1,5 @@ #include +#include "fake_rtc.h" #include "global.h" #include "gpu_regs.h" #include "load_save.h" @@ -9,6 +10,7 @@ #include "constants/characters.h" #include "test_runner.h" #include "test/test.h" +#include "test/battle.h" #define TIMEOUT_SECONDS 60 @@ -22,10 +24,7 @@ enum { CURRENT_TEST_STATE_RUN, }; -__attribute__((section(".persistent"))) static struct { - u32 address:28; - u32 state:1; -} sCurrentTest = {0}; +__attribute__((section(".persistent"))) struct PersistentTestRunnerState gPersistentTestRunnerState = {0}; void TestRunner_Battle(const struct Test *); @@ -37,6 +36,25 @@ static void Intr_Timer2(void); extern const struct Test __start_tests[]; extern const struct Test __stop_tests[]; +static enum TestFilterMode DetectFilterMode(const char *pattern) +{ + size_t n = strlen(pattern); + if (n > 2 && pattern[n-2] == '.' && pattern[n-1] == 'c') + return TEST_FILTER_MODE_FILENAME_EXACT; + else if (pattern[0] == '*') // TODO: Support '*pattern*'. + return TEST_FILTER_MODE_TEST_NAME_INFIX; + else + return TEST_FILTER_MODE_TEST_NAME_PREFIX; +} + +static bool32 ExactMatch(const char *pattern, const char *string) +{ + if (string == NULL) + return TRUE; + + return strcmp(pattern, string) == 0; +} + static bool32 PrefixMatch(const char *pattern, const char *string) { if (string == NULL) @@ -53,6 +71,14 @@ static bool32 PrefixMatch(const char *pattern, const char *string) } } +static bool32 InfixMatch(const char *pattern, const char *string) +{ + if (string == NULL) + return TRUE; + + return strstr(string, &pattern[1]) != NULL; +} + enum { STATE_INIT, @@ -160,6 +186,13 @@ void TestRunner_CheckMemory(void) } } +static void ClearSaveBlocks(void) +{ + ClearSav1(); + ClearSav2(); + ClearSav3(); +} + void CB2_TestRunner(void) { top: @@ -174,25 +207,24 @@ void CB2_TestRunner(void) return; } + gTestRunnerState.filterMode = DetectFilterMode(gTestRunnerArgv); + MoveSaveBlocks_ResetHeap(); - ClearSav1(); - ClearSav2(); - ClearSav3(); gIntrTable[7] = Intr_Timer2; - gSaveBlock2Ptr->optionsBattleStyle = OPTIONS_BATTLE_STYLE_SET; - // The current test restarted the ROM (e.g. by jumping to NULL). - if (sCurrentTest.address != 0) + if (gPersistentTestRunnerState.address != 0) { + ClearSaveBlocks(); gTestRunnerState.test = __start_tests; - while ((uintptr_t)gTestRunnerState.test != sCurrentTest.address) + while ((uintptr_t)gTestRunnerState.test != gPersistentTestRunnerState.address) { AssignCostToRunner(); gTestRunnerState.test++; } - if (sCurrentTest.state == CURRENT_TEST_STATE_ESTIMATE) + + if (gPersistentTestRunnerState.state == CURRENT_TEST_STATE_ESTIMATE) { u32 runner = MinCostProcess(); gTestRunnerState.processCosts[runner] += 1; @@ -208,9 +240,14 @@ void CB2_TestRunner(void) } else { + // Cost must be assigned to the test that crashed, otherwise tests will be desynched + AssignCostToRunner(); gTestRunnerState.state = STATE_REPORT_RESULT; gTestRunnerState.result = TEST_RESULT_CRASH; } + + if (gPersistentTestRunnerState.expectCrash) + gTestRunnerState.expectedResult = TEST_RESULT_CRASH; } else { @@ -223,6 +260,7 @@ void CB2_TestRunner(void) break; case STATE_ASSIGN_TEST: + ClearSaveBlocks(); while (1) { if (gTestRunnerState.test == __stop_tests) @@ -230,11 +268,17 @@ void CB2_TestRunner(void) gTestRunnerState.state = STATE_EXIT; return; } - if (gTestRunnerState.test->runner != &gAssumptionsRunner - && !PrefixMatch(gTestRunnerArgv, gTestRunnerState.test->name)) - ++gTestRunnerState.test; - else - break; + if (gTestRunnerState.test->runner != &gAssumptionsRunner) + { + if ((gTestRunnerState.filterMode == TEST_FILTER_MODE_TEST_NAME_PREFIX && !PrefixMatch(gTestRunnerArgv, gTestRunnerState.test->name)) + || (gTestRunnerState.filterMode == TEST_FILTER_MODE_TEST_NAME_INFIX && !InfixMatch(gTestRunnerArgv, gTestRunnerState.test->name)) + || (gTestRunnerState.filterMode == TEST_FILTER_MODE_FILENAME_EXACT && !ExactMatch(gTestRunnerArgv, gTestRunnerState.test->filename))) + { + ++gTestRunnerState.test; + continue; + } + } + break; } Test_MgbaPrintf(":N%s", gTestRunnerState.test->name); @@ -252,8 +296,8 @@ void CB2_TestRunner(void) REG_TM2CNT_L = UINT16_MAX - (274 * 60); // Approx. 1 second. REG_TM2CNT_H = TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_1024CLK; - sCurrentTest.address = (uintptr_t)gTestRunnerState.test; - sCurrentTest.state = CURRENT_TEST_STATE_ESTIMATE; + gPersistentTestRunnerState.address = (uintptr_t)gTestRunnerState.test; + gPersistentTestRunnerState.state = CURRENT_TEST_STATE_ESTIMATE; // If AssignCostToRunner fails, we want to report the failure. gTestRunnerState.state = STATE_REPORT_RESULT; @@ -266,7 +310,8 @@ void CB2_TestRunner(void) case STATE_RUN_TEST: gTestRunnerState.state = STATE_REPORT_RESULT; - sCurrentTest.state = CURRENT_TEST_STATE_RUN; + gPersistentTestRunnerState.state = CURRENT_TEST_STATE_RUN; + gPersistentTestRunnerState.expectCrash = FALSE; SeedRng(0); SeedRng2(0); if (gTestRunnerState.test->runner->setUp) @@ -407,6 +452,11 @@ void CB2_TestRunner(void) case STATE_EXIT: MgbaExit_(gTestRunnerState.exitCode); break; + default: + MgbaOpen_(); + Test_MgbaPrintf("\e[31mInvalid TestRunner state, exiting\e[0m"); + gTestRunnerState.exitCode = 1; + gTestRunnerState.state = STATE_EXIT; } if (gMain.callback2 == CB2_TestRunner) @@ -423,9 +473,17 @@ void Test_ExpectLeaks(bool32 expectLeaks) gTestRunnerState.expectLeaks = expectLeaks; } +void Test_ExpectCrash(bool32 expectCrash) +{ + gPersistentTestRunnerState.expectCrash = expectCrash; + if (expectCrash) + Test_ExpectedResult(TEST_RESULT_CRASH); +} + static void FunctionTest_SetUp(void *data) { (void)data; + ClearRiggedRng(); gFunctionTestRunnerState = AllocZeroed(sizeof(*gFunctionTestRunnerState)); SeedRng(0); } @@ -457,12 +515,84 @@ static bool32 FunctionTest_CheckProgress(void *data) return madeProgress; } +static u32 FunctionTest_RandomUniform(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reject)(u32), void *caller) +{ + //rigged + for (u32 i = 0; i < RIGGED_RNG_COUNT; i++) + { + if (gFunctionTestRunnerState->rngList[i].tag == tag) + { + if (reject && reject(gFunctionTestRunnerState->rngList[i].value)) + Test_ExitWithResult(TEST_RESULT_INVALID, SourceLine(0), ":LWITH_RNG specified a rejected value (%d)", gFunctionTestRunnerState->rngList[i].value); + return gFunctionTestRunnerState->rngList[i].value; + } + } + //trials + /* + if (tag == STATE->rngTag) + return RandomUniformTrials(tag, lo, hi, reject); + */ + + //default + return RandomUniformDefaultValue(tag, lo, hi, reject, caller); +} + +static u32 FunctionTest_RandomWeightedArray(enum RandomTag tag, u32 sum, u32 n, const u8 *weights, void *caller) +{ + //rigged + for (u32 i = 0; i < RIGGED_RNG_COUNT; i++) + { + if (gFunctionTestRunnerState->rngList[i].tag == tag) + return gFunctionTestRunnerState->rngList[i].value; + } + + //trials + /* + if (tag == STATE->rngTag) + return RandomWeightedArrayTrials(tag, sum, n, weights); + */ + + //default + return RandomWeightedArrayDefaultValue(tag, n, weights, caller); +} + +static const void* FunctionTest_RandomElementArray(enum RandomTag tag, const void *array, size_t size, size_t count, void *caller) +{ + //rigged + for (u32 i = 0; i < RIGGED_RNG_COUNT; i++) + { + if (gFunctionTestRunnerState->rngList[i].tag == tag) + { + u32 element = 0; + for (u32 index = 0; index < count; index++) + { + memcpy(&element, (const u8 *)array + size * index, size); + if (element == gFunctionTestRunnerState->rngList[i].value) + return (const u8 *)array + size * index; + } + Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":L%s: RandomElement illegal value requested: %d", gTestRunnerState.test->filename, gFunctionTestRunnerState->rngList[i].value); + } + } + + //trials + /* + if (tag == STATE->rngTag) + return RandomElementTrials(tag, array, size, count); + */ + + //default + return RandomElementArrayDefaultValue(tag, array, size, count, caller); +} + const struct TestRunner gFunctionTestRunner = { .setUp = FunctionTest_SetUp, .run = FunctionTest_Run, .tearDown = FunctionTest_TearDown, .checkProgress = FunctionTest_CheckProgress, + .randomUniform = FunctionTest_RandomUniform, + .randomWeightedArray = FunctionTest_RandomWeightedArray, + .randomElementArray = FunctionTest_RandomElementArray, }; static void Assumptions_Run(void *data) @@ -770,3 +900,102 @@ u32 SourceLineOffset(u32 sourceLine) else return sourceLine - test->sourceLine; } + +u32 RandomUniform(enum RandomTag tag, u32 lo, u32 hi) +{ + void *caller = __builtin_extract_return_addr(__builtin_return_address(0)); + if (gTestRunnerState.test->runner->randomUniform) + return gTestRunnerState.test->runner->randomUniform(tag, lo, hi, NULL, caller); + else + return RandomUniformDefault(tag, lo, hi); +} + +u32 RandomUniformExcept(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reject)(u32)) +{ + void *caller = __builtin_extract_return_addr(__builtin_return_address(0)); + if (gTestRunnerState.test->runner->randomUniform) + return gTestRunnerState.test->runner->randomUniform(tag, lo, hi, reject, caller); + else + return RandomUniformExceptDefault(tag, lo, hi, reject); +} + +u32 RandomWeightedArray(enum RandomTag tag, u32 sum, u32 n, const u8 *weights) +{ + void *caller = __builtin_extract_return_addr(__builtin_return_address(0)); + if (gTestRunnerState.test->runner->randomWeightedArray) + return gTestRunnerState.test->runner->randomWeightedArray(tag, sum, n, weights, caller); + else + return RandomWeightedArrayDefault(tag, sum, n, weights); +} + +const void *RandomElementArray(enum RandomTag tag, const void *array, size_t size, size_t count) +{ + void *caller = __builtin_extract_return_addr(__builtin_return_address(0)); + if (gTestRunnerState.test->runner->randomElementArray) + return gTestRunnerState.test->runner->randomElementArray(tag, array, size, count, caller); + else + return RandomElementArrayDefault(tag, array, size, count); +} + +u32 RandomUniformDefaultValue(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reject)(u32), void *caller) +{ + u32 default_ = hi; + if (reject) + { + while (reject(default_)) + { + if (default_ == lo) + Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":LRandomUniformExcept called from %p with tag %d rejected all values", caller, tag); + default_--; + } + } + return default_; +} + +u32 RandomWeightedArrayDefaultValue(enum RandomTag tag, u32 n, const u8 *weights, void *caller) +{ + while (weights[n-1] == 0) + { + if (n == 1) + Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":LRandomWeightedArray called from %p with tag %d and all zero weights", caller, tag); + n--; + } + return n-1; +} + +const void *RandomElementArrayDefaultValue(enum RandomTag tag, const void *array, size_t size, size_t count, void *caller) +{ + return (const u8 *)array + size * (count - 1); +} + +void ClearRiggedRng(void) +{ + struct RiggedRNG zeroRng = {.tag = RNG_NONE, .value = 0}; + for (u32 i = 0; i < RIGGED_RNG_COUNT; i++) + memcpy(&gFunctionTestRunnerState->rngList[i], &zeroRng, sizeof(zeroRng)); +} + +void SetupRiggedRng(u32 sourceLine, enum RandomTag randomTag, u32 value) +{ + struct RiggedRNG rng = {.tag = randomTag, .value = value}; + u32 i; + for (i = 0; i < RIGGED_RNG_COUNT; i++) + { + if (gFunctionTestRunnerState->rngList[i].tag == randomTag) + { + memcpy(&gFunctionTestRunnerState->rngList[i], &rng, sizeof(rng)); + break; + } + else if (gFunctionTestRunnerState->rngList[i].tag > RNG_NONE) + { + continue; + } + else + { + memcpy(&gFunctionTestRunnerState->rngList[i], &rng, sizeof(rng)); + break; + } + } + if (i == RIGGED_RNG_COUNT) + Test_ExitWithResult(TEST_RESULT_FAIL, __LINE__, ":L%s:%d: Too many rigged RNGs to set up", gTestRunnerState.test->filename, sourceLine); +} diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index 20271a588d2d..9bc28363d4c1 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -3,6 +3,7 @@ #include "battle_ai_util.h" #include "battle_anim.h" #include "battle_controllers.h" +#include "battle_setup.h" #include "battle_gimmick.h" #include "battle_z_move.h" #include "event_data.h" @@ -10,16 +11,19 @@ #include "item_menu.h" #include "main.h" #include "malloc.h" +#include "party_menu.h" #include "random.h" #include "test/battle.h" #include "window.h" #include "constants/characters.h" #include "constants/trainers.h" +#include "constants/abilities.h" #if defined(__INTELLISENSE__) #undef TestRunner_Battle_RecordAbilityPopUp #undef TestRunner_Battle_RecordAnimation #undef TestRunner_Battle_RecordHP +#undef TestRunner_Battle_RecordSubHit #undef TestRunner_Battle_RecordMessage #undef TestRunner_Battle_RecordStatus1 #undef TestRunner_Battle_AfterLastTurn @@ -75,7 +79,7 @@ NAKED static void InvokeSingleTestFunctionWithStack(void *results, u32 i, struct .pool"); } -NAKED static void InvokeDoubleTestFunctionWithStack(void *results, u32 i, struct BattlePokemon *playerLeft, struct BattlePokemon *opponentLeft, struct BattlePokemon *playerRight, struct BattlePokemon *opponentRight, SingleBattleTestFunction function, void *stack) +NAKED static void InvokeDoubleTestFunctionWithStack(void *results, u32 i, struct BattlePokemon *playerLeft, struct BattlePokemon *opponentLeft, struct BattlePokemon *playerRight, struct BattlePokemon *opponentRight, DoubleBattleTestFunction function, void *stack) { asm("push {r4-r7,lr}\n\ ldr r4, [sp, #28] @ function\n\ @@ -99,6 +103,78 @@ NAKED static void InvokeDoubleTestFunctionWithStack(void *results, u32 i, struct .pool"); } +NAKED static void InvokeMultiTestFunctionWithStack(void *results, u32 i, struct BattlePokemon *playerLeft, struct BattlePokemon *opponentLeft, struct BattlePokemon *playerRight, struct BattlePokemon *opponentRight, MultiBattleTestFunction function, void *stack) +{ + asm("push {r4-r7,lr}\n\ + ldr r4, [sp, #28] @ function\n\ + ldr r5, [sp, #32] @ stack\n\ + mov r6, sp\n\ + mov sp, r5\n\ + push {r6}\n\ + add r6, #20\n\ + ldmia r6, {r6, r7} @ playerRight, opponentRight\n\ + push {r6, r7}\n\ + ldr r6, =MultiRestoreSP + 1\n\ + mov lr, r6\n\ + bx r4\n\ + MultiRestoreSP:\n\ + add sp, #8\n\ + pop {r0}\n\ + mov sp, r0\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool"); +} + +NAKED static void InvokeTwoVsOneTestFunctionWithStack(void *results, u32 i, struct BattlePokemon *playerLeft, struct BattlePokemon *opponentLeft, struct BattlePokemon *playerRight, struct BattlePokemon *opponentRight, TwoVsOneBattleTestFunction function, void *stack) +{ + asm("push {r4-r7,lr}\n\ + ldr r4, [sp, #28] @ function\n\ + ldr r5, [sp, #32] @ stack\n\ + mov r6, sp\n\ + mov sp, r5\n\ + push {r6}\n\ + add r6, #20\n\ + ldmia r6, {r6, r7} @ playerRight, opponentRight\n\ + push {r6, r7}\n\ + ldr r6, =TwoVsOneRestoreSP + 1\n\ + mov lr, r6\n\ + bx r4\n\ + TwoVsOneRestoreSP:\n\ + add sp, #8\n\ + pop {r0}\n\ + mov sp, r0\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool"); +} + +NAKED static void InvokeOneVsTwoTestFunctionWithStack(void *results, u32 i, struct BattlePokemon *playerLeft, struct BattlePokemon *opponentLeft, struct BattlePokemon *playerRight, struct BattlePokemon *opponentRight, OneVsTwoBattleTestFunction function, void *stack) +{ + asm("push {r4-r7,lr}\n\ + ldr r4, [sp, #28] @ function\n\ + ldr r5, [sp, #32] @ stack\n\ + mov r6, sp\n\ + mov sp, r5\n\ + push {r6}\n\ + add r6, #20\n\ + ldmia r6, {r6, r7} @ playerRight, opponentRight\n\ + push {r6, r7}\n\ + ldr r6, =OneVsTwoRestoreSP + 1\n\ + mov lr, r6\n\ + bx r4\n\ + OneVsTwoRestoreSP:\n\ + add sp, #8\n\ + pop {r0}\n\ + mov sp, r0\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool"); +} + // Calls test->function, but pointing its stack at DATA.stack so that // local variables are live after the function returns (and so can be // referenced by HP_BAR, or the next call, etc). @@ -117,7 +193,19 @@ static void InvokeTestFunction(const struct BattleTest *test) break; case BATTLE_TEST_DOUBLES: case BATTLE_TEST_AI_DOUBLES: - InvokeDoubleTestFunctionWithStack(STATE->results, STATE->runParameter, &gBattleMons[B_POSITION_PLAYER_LEFT], &gBattleMons[B_POSITION_OPPONENT_LEFT], &gBattleMons[B_POSITION_PLAYER_RIGHT], &gBattleMons[B_POSITION_OPPONENT_RIGHT], test->function.singles, &DATA.stack[BATTLE_TEST_STACK_SIZE]); + InvokeDoubleTestFunctionWithStack(STATE->results, STATE->runParameter, &gBattleMons[B_POSITION_PLAYER_LEFT], &gBattleMons[B_POSITION_OPPONENT_LEFT], &gBattleMons[B_POSITION_PLAYER_RIGHT], &gBattleMons[B_POSITION_OPPONENT_RIGHT], test->function.doubles, &DATA.stack[BATTLE_TEST_STACK_SIZE]); + break; + case BATTLE_TEST_MULTI: + case BATTLE_TEST_AI_MULTI: + InvokeMultiTestFunctionWithStack(STATE->results, STATE->runParameter, &gBattleMons[B_POSITION_PLAYER_LEFT], &gBattleMons[B_POSITION_OPPONENT_LEFT], &gBattleMons[B_POSITION_PLAYER_RIGHT], &gBattleMons[B_POSITION_OPPONENT_RIGHT], test->function.multi, &DATA.stack[BATTLE_TEST_STACK_SIZE]); + break; + case BATTLE_TEST_TWO_VS_ONE: + case BATTLE_TEST_AI_TWO_VS_ONE: + InvokeTwoVsOneTestFunctionWithStack(STATE->results, STATE->runParameter, &gBattleMons[B_POSITION_PLAYER_LEFT], &gBattleMons[B_POSITION_OPPONENT_LEFT], &gBattleMons[B_POSITION_PLAYER_RIGHT], &gBattleMons[B_POSITION_OPPONENT_RIGHT], test->function.two_vs_one, &DATA.stack[BATTLE_TEST_STACK_SIZE]); + break; + case BATTLE_TEST_ONE_VS_TWO: + case BATTLE_TEST_AI_ONE_VS_TWO: + InvokeOneVsTwoTestFunctionWithStack(STATE->results, STATE->runParameter, &gBattleMons[B_POSITION_PLAYER_LEFT], &gBattleMons[B_POSITION_OPPONENT_LEFT], &gBattleMons[B_POSITION_PLAYER_RIGHT], &gBattleMons[B_POSITION_OPPONENT_RIGHT], test->function.one_vs_two, &DATA.stack[BATTLE_TEST_STACK_SIZE]); break; } } @@ -134,6 +222,9 @@ static bool32 IsAITest(void) { case BATTLE_TEST_AI_SINGLES: case BATTLE_TEST_AI_DOUBLES: + case BATTLE_TEST_AI_MULTI: + case BATTLE_TEST_AI_TWO_VS_ONE: + case BATTLE_TEST_AI_ONE_VS_TWO: return TRUE; } return FALSE; @@ -178,6 +269,12 @@ static void BattleTest_SetUp(void *data) break; case BATTLE_TEST_DOUBLES: case BATTLE_TEST_AI_DOUBLES: + case BATTLE_TEST_MULTI: + case BATTLE_TEST_AI_MULTI: + case BATTLE_TEST_TWO_VS_ONE: + case BATTLE_TEST_AI_TWO_VS_ONE: + case BATTLE_TEST_ONE_VS_TWO: + case BATTLE_TEST_AI_ONE_VS_TWO: STATE->battlersCount = 4; break; } @@ -262,26 +359,97 @@ static void BattleTest_Run(void *data) { case BATTLE_TEST_WILD: DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER; + for (i = 0; i < STATE->battlersCount; i++) + DATA.currentMonIndexes[i] = i / 2; break; case BATTLE_TEST_AI_SINGLES: DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER; DATA.recordedBattle.opponentA = TRAINER_LEAF; DATA.hasAI = TRUE; + for (i = 0; i < STATE->battlersCount; i++) + DATA.currentMonIndexes[i] = i / 2; break; case BATTLE_TEST_AI_DOUBLES: DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE; DATA.recordedBattle.opponentA = TRAINER_LEAF; + DATA.recordedBattle.opponentB = TRAINER_NONE; + DATA.hasAI = TRUE; + for (i = 0; i < STATE->battlersCount; i++) + DATA.currentMonIndexes[i] = i / 2; + break; + case BATTLE_TEST_AI_MULTI: + DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS; + DATA.recordedBattle.partnerId = TRAINER_PARTNER(PARTNER_STEVEN); + DATA.recordedBattle.opponentA = TRAINER_LEAF; + DATA.recordedBattle.opponentB = TRAINER_RED; + DATA.hasAI = TRUE; + DATA.currentMonIndexes[0] = 0; // Player first mon + DATA.currentMonIndexes[1] = 0; // Opponent A first mon + DATA.currentMonIndexes[2] = 3; // Player partner first mon + DATA.currentMonIndexes[3] = 3; // Opponent B first mon + break; + case BATTLE_TEST_AI_TWO_VS_ONE: + DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI; + DATA.recordedBattle.partnerId = TRAINER_PARTNER(PARTNER_STEVEN); + DATA.recordedBattle.opponentA = TRAINER_LEAF; + DATA.recordedBattle.opponentB = 0xFFFF; + DATA.currentMonIndexes[0] = 0; // Player first mon + DATA.currentMonIndexes[1] = 0; // Opponent first mon + DATA.currentMonIndexes[2] = 3; // Player partner first mon + DATA.currentMonIndexes[3] = 1; // Opponent second mon + DATA.hasAI = TRUE; + break; + case BATTLE_TEST_AI_ONE_VS_TWO: + DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS; + DATA.recordedBattle.opponentA = TRAINER_LEAF; DATA.recordedBattle.opponentB = TRAINER_RED; + DATA.currentMonIndexes[0] = 0; // Player first mon + DATA.currentMonIndexes[1] = 0; // Opponent A first mon + DATA.currentMonIndexes[2] = 1; // Player second mon + DATA.currentMonIndexes[3] = 3; // Opponent B first mon DATA.hasAI = TRUE; break; case BATTLE_TEST_SINGLES: DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_RECORDED_IS_MASTER | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_TRAINER; DATA.recordedBattle.opponentA = TRAINER_LINK_OPPONENT; + for (i = 0; i < STATE->battlersCount; i++) + DATA.currentMonIndexes[i] = i / 2; break; case BATTLE_TEST_DOUBLES: DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_RECORDED_IS_MASTER | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE; DATA.recordedBattle.opponentA = TRAINER_LINK_OPPONENT; + DATA.recordedBattle.opponentB = TRAINER_NONE; + for (i = 0; i < STATE->battlersCount; i++) + DATA.currentMonIndexes[i] = i / 2; + break; + case BATTLE_TEST_MULTI: + DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_RECORDED_IS_MASTER | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_TRAINER | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS; + DATA.recordedBattle.partnerId = TRAINER_PARTNER(PARTNER_STEVEN); + DATA.recordedBattle.opponentA = TRAINER_LINK_OPPONENT; DATA.recordedBattle.opponentB = TRAINER_LINK_OPPONENT; + DATA.currentMonIndexes[0] = 0; // Player first mon + DATA.currentMonIndexes[1] = 0; // Opponent A first mon + DATA.currentMonIndexes[2] = 3; // Player partner first mon + DATA.currentMonIndexes[3] = 3; // Opponent B first mon + break; + case BATTLE_TEST_TWO_VS_ONE: + DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_RECORDED_IS_MASTER | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_TRAINER | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI; + DATA.recordedBattle.partnerId = TRAINER_PARTNER(PARTNER_STEVEN); + DATA.recordedBattle.opponentA = TRAINER_LINK_OPPONENT; + DATA.recordedBattle.opponentB = 0xFFFF; + DATA.currentMonIndexes[0] = 0; // Player first mon + DATA.currentMonIndexes[1] = 0; // Opponent first mon + DATA.currentMonIndexes[2] = 3; // Player partner first mon + DATA.currentMonIndexes[3] = 1; // Opponent second mon + break; + case BATTLE_TEST_ONE_VS_TWO: + DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_RECORDED_IS_MASTER | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS; + DATA.recordedBattle.opponentA = TRAINER_LINK_OPPONENT; + DATA.recordedBattle.opponentB = TRAINER_LINK_OPPONENT; + DATA.currentMonIndexes[0] = 0; // Player first mon + DATA.currentMonIndexes[1] = 0; // Opponent A first mon + DATA.currentMonIndexes[2] = 1; // Player second mon + DATA.currentMonIndexes[3] = 3; // Opponent B first mon break; } @@ -293,9 +461,6 @@ static void BattleTest_Run(void *data) DATA.recordedBattle.playersBattlers[i] = i; } - for (i = 0; i < STATE->battlersCount; i++) - DATA.currentMonIndexes[i] = i / 2; - STATE->runRandomly = TRUE; STATE->runGiven = TRUE; STATE->runWhen = TRUE; @@ -325,10 +490,46 @@ static void BattleTest_Run(void *data) if (DATA.hasExplicitSpeeds) { - // TODO: If a battler is taking the default action maybe it - // should not require an explicit speed? - if (DATA.explicitSpeeds[B_SIDE_PLAYER] != (1 << DATA.playerPartySize) - 1 - || DATA.explicitSpeeds[B_SIDE_OPPONENT] != (1 << DATA.opponentPartySize) - 1) + u8 revisedPlayerExplicitSpeeds = 0; + u8 revisedPartnerExplicitSpeeds = 0; + u8 revisedOpponentAExplicitSpeeds = 0; + u8 revisedOpponentBExplicitSpeeds = 0; + + for (i = 0; i < 3; i++) + { + if(GetMonData(&DATA.recordedBattle.playerParty[i], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + revisedPlayerExplicitSpeeds |= 1 << i; + } + for (i = 3; i < PARTY_SIZE; i++) + { + if(GetMonData(&DATA.recordedBattle.playerParty[i], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + { + if(DATA.currentPosition == B_POSITION_PLAYER_LEFT) + revisedPlayerExplicitSpeeds |= 1 << i; + else + revisedPartnerExplicitSpeeds |= 1 << i; + } + } + + for (i = 0; i < 3; i++) + { + if(GetMonData(&DATA.recordedBattle.opponentParty[i], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + revisedOpponentAExplicitSpeeds |= 1 << i; + } + for (i = 3; i < PARTY_SIZE; i++) + { + if(GetMonData(&DATA.recordedBattle.opponentParty[i], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + { + if(DATA.currentPosition == B_POSITION_OPPONENT_LEFT) + revisedOpponentAExplicitSpeeds |= 1 << i; + else + revisedOpponentBExplicitSpeeds |= 1 << i; + } + } + + if (((DATA.explicitSpeeds[B_POSITION_PLAYER_LEFT] + DATA.explicitSpeeds[B_POSITION_PLAYER_RIGHT]) != (revisedPlayerExplicitSpeeds + revisedPartnerExplicitSpeeds) + || (DATA.explicitSpeeds[B_POSITION_OPPONENT_LEFT] + DATA.explicitSpeeds[B_POSITION_OPPONENT_RIGHT]) != (revisedOpponentAExplicitSpeeds + revisedOpponentBExplicitSpeeds))) + { Test_ExitWithResult(TEST_RESULT_INVALID, SourceLine(0), ":LSpeed required for all PLAYERs and OPPONENTs"); } @@ -354,121 +555,126 @@ static void BattleTest_Run(void *data) PrintTestName(); } -u32 RandomUniform(enum RandomTag tag, u32 lo, u32 hi) +u32 RandomUniformTrials(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reject)(u32), void *caller) { - const struct BattlerTurn *turn = NULL; - - if (gCurrentTurnActionNumber < gBattlersCount) - { - u32 battlerId = gBattlerByTurnOrder[gCurrentTurnActionNumber]; - turn = &DATA.battleRecordTurns[gBattleResults.battleTurnCounter][battlerId]; - if (turn && turn->rng.tag == tag) - return turn->rng.value; - } - - if (tag == STATE->rngTag) + STATE->didRunRandomly = TRUE; + if (STATE->trials == 1) { - STATE->didRunRandomly = TRUE; - u32 n = hi - lo + 1; - if (STATE->trials == 1) + u32 n = 0, i; + if (reject) { + for (i = lo; i <= hi; i++) + if (!reject(i)) + n++; STATE->trials = n; - PrintTestName(); - } - else if (STATE->trials != n) - { - Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":LRandomUniform called from %p with tag %d and inconsistent trials %d and %d", __builtin_extract_return_addr(__builtin_return_address(0)), tag, STATE->trials, n); } - STATE->trialRatio = Q_4_12(1) / STATE->trials; + else + STATE->trials = hi - lo + 1; + PrintTestName(); + } + STATE->trialRatio = Q_4_12(1) / STATE->trials; + + if (!reject) + { + if (STATE->trials != (hi - lo + 1)) + Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":LRandomUniform called from %p with tag %d and inconsistent trials %d and %d", caller, tag, STATE->trials, hi - lo + 1); return STATE->runTrial + lo; } - return hi; + while (reject(STATE->runTrial + lo + STATE->rngTrialOffset)) + { + if (STATE->runTrial + lo + STATE->rngTrialOffset > hi) + Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":LRandomUniformExcept called from %p with tag %d and inconsistent reject", caller, tag); + STATE->rngTrialOffset++; + } + + return STATE->runTrial + lo + STATE->rngTrialOffset; + } -u32 RandomUniformExcept(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reject)(u32)) +u32 RandomWeightedArrayTrials(enum RandomTag tag, u32 sum, u32 n, const u8 *weights, void *caller) { - const struct BattlerTurn *turn = NULL; - u32 default_; - - if (gCurrentTurnActionNumber < gBattlersCount) + //Detect inconsistent sum + u32 weightSum = 0; + if (STATE->runTrial == 0) { - u32 battlerId = gBattlerByTurnOrder[gCurrentTurnActionNumber]; - turn = &DATA.battleRecordTurns[gBattleResults.battleTurnCounter][battlerId]; - if (turn && turn->rng.tag == tag) - { - if (reject(turn->rng.value)) - Test_ExitWithResult(TEST_RESULT_INVALID, SourceLine(0), ":LWITH_RNG specified a rejected value (%d)", turn->rng.value); - return turn->rng.value; - } + for (u32 i = 0; i < n; i++) + weightSum += weights[i]; + if (weightSum != sum) + Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":LRandomWeighted called from %p has weights not matching its sum", caller); } - if (tag == STATE->rngTag) + STATE->didRunRandomly = TRUE; + if (STATE->trials == 1) { - STATE->didRunRandomly = TRUE; - if (STATE->trials == 1) - { - u32 n = 0, i; - for (i = lo; i <= hi; i++) - if (!reject(i)) - n++; - STATE->trials = n; - PrintTestName(); - } - STATE->trialRatio = Q_4_12(1) / STATE->trials; + STATE->trials = n; + PrintTestName(); + } + else if (STATE->trials != n) + { + Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":LRandomWeighted called from %p with tag %d and inconsistent trials %d and %d", caller, tag, STATE->trials, n); + } - while (reject(STATE->runTrial + lo + STATE->rngTrialOffset)) - { - if (STATE->runTrial + lo + STATE->rngTrialOffset > hi) - Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":LRandomUniformExcept called from %p with tag %d and inconsistent reject", __builtin_extract_return_addr(__builtin_return_address(0)), tag); - STATE->rngTrialOffset++; - } + STATE->trialRatio = Q_4_12(weights[STATE->runTrial]) / sum; + return STATE->runTrial; +} - return STATE->runTrial + lo + STATE->rngTrialOffset; +const void *RandomElementArrayTrials(enum RandomTag tag, const void *array, size_t size, size_t count, void *caller) +{ + STATE->didRunRandomly = TRUE; + if (STATE->trials == 1) + { + STATE->trials = count; + PrintTestName(); } - - default_ = hi; - while (reject(default_)) + else if (STATE->trials != count) { - if (default_ == lo) - Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":LRandomUniformExcept called from %p with tag %d rejected all values", __builtin_extract_return_addr(__builtin_return_address(0)), tag); - default_--; + Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":LRandomElement called from %p with tag %d and inconsistent trials %d and %d", caller, tag, STATE->trials, count); } - return default_; + STATE->trialRatio = Q_4_12(1) / count; + return (const u8 *)array + size * STATE->runTrial; } -u32 RandomWeightedArray(enum RandomTag tag, u32 sum, u32 n, const u8 *weights) +static u32 BattleTest_RandomUniform(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reject)(u32), void *caller) { + //rigged const struct BattlerTurn *turn = NULL; - - if (sum == 0) - Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":LRandomWeightedArray called with zero sum"); - if (gCurrentTurnActionNumber < gBattlersCount) { u32 battlerId = gBattlerByTurnOrder[gCurrentTurnActionNumber]; turn = &DATA.battleRecordTurns[gBattleResults.battleTurnCounter][battlerId]; if (turn && turn->rng.tag == tag) + { + if (reject && reject(turn->rng.value)) + Test_ExitWithResult(TEST_RESULT_INVALID, SourceLine(0), ":LWITH_RNG specified a rejected value (%d)", turn->rng.value); return turn->rng.value; + } } + //trials + if (tag && tag == STATE->rngTag) + return RandomUniformTrials(tag, lo, hi, reject, caller); - if (tag == STATE->rngTag) + //default + return RandomUniformDefaultValue(tag, lo, hi, reject, caller); +} + +static u32 BattleTest_RandomWeightedArray(enum RandomTag tag, u32 sum, u32 n, const u8 *weights, void *caller) +{ + //rigged + const struct BattlerTurn *turn = NULL; + if (gCurrentTurnActionNumber < gBattlersCount || tag == RNG_SHELL_SIDE_ARM) { - STATE->didRunRandomly = TRUE; - if (STATE->trials == 1) - { - STATE->trials = n; - PrintTestName(); - } - else if (STATE->trials != n) - { - Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":LRandomWeighted called from %p with tag %d and inconsistent trials %d and %d", __builtin_extract_return_addr(__builtin_return_address(0)), tag, STATE->trials, n); - } - // TODO: Detect inconsistent sum. - STATE->trialRatio = Q_4_12(weights[STATE->runTrial]) / sum; - return STATE->runTrial; + u32 battlerId = gBattlerByTurnOrder[gCurrentTurnActionNumber]; + turn = &DATA.battleRecordTurns[gBattleResults.battleTurnCounter][battlerId]; + if (turn && turn->rng.tag == tag) + return turn->rng.value; } + //trials + if (tag && tag == STATE->rngTag) + return RandomWeightedArrayTrials(tag, sum, n, weights, caller); + + //default switch (tag) { case RNG_ACCURACY: @@ -493,21 +699,14 @@ u32 RandomWeightedArray(enum RandomTag tag, u32 sum, u32 n, const u8 *weights) return TRUE; default: - while (weights[n-1] == 0) - { - if (n == 1) - Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":LRandomWeightedArray called from %p with tag %d and all zero weights", __builtin_extract_return_addr(__builtin_return_address(0)), tag); - n--; - } - return n-1; + return RandomWeightedArrayDefaultValue(tag, n, weights, caller); } } -const void *RandomElementArray(enum RandomTag tag, const void *array, size_t size, size_t count) +static const void *BattleTest_RandomElementArray(enum RandomTag tag, const void *array, size_t size, size_t count, void *caller) { + //rigged const struct BattlerTurn *turn = NULL; - u32 index = count-1; - if (gCurrentTurnActionNumber < gBattlersCount) { u32 battlerId = gBattlerByTurnOrder[gCurrentTurnActionNumber]; @@ -515,36 +714,26 @@ const void *RandomElementArray(enum RandomTag tag, const void *array, size_t siz if (turn && turn->rng.tag == tag) { u32 element = 0; - for (index = 0; index < count; index++) + for (u32 index = 0; index < count; index++) { memcpy(&element, (const u8 *)array + size * index, size); if (element == turn->rng.value) return (const u8 *)array + size * index; } - // TODO: Incorporate the line number. Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":L%s: RandomElement illegal value requested: %d", gTestRunnerState.test->filename, turn->rng.value); } } - if (tag == STATE->rngTag) - { - STATE->didRunRandomly = TRUE; - if (STATE->trials == 1) - { - STATE->trials = count; - PrintTestName(); - } - else if (STATE->trials != count) - { - Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":LRandomElement called from %p with tag %d and inconsistent trials %d and %d", __builtin_extract_return_addr(__builtin_return_address(0)), tag, STATE->trials, count); - } - STATE->trialRatio = Q_4_12(1) / count; - return (const u8 *)array + size * STATE->runTrial; - } - return (const u8 *)array + size * index; + + //trials + if (tag && tag == STATE->rngTag) + return RandomElementArrayTrials(tag, array, size, count, caller); + + //default + return RandomElementArrayDefaultValue(tag, array, size, count, caller); } -static s32 TryAbilityPopUp(s32 i, s32 n, u32 battlerId, u32 ability) +static s32 TryAbilityPopUp(s32 i, s32 n, u32 battlerId, enum Ability ability) { struct QueuedAbilityEvent *event; s32 iMax = i + n; @@ -562,7 +751,7 @@ static s32 TryAbilityPopUp(s32 i, s32 n, u32 battlerId, u32 ability) return -1; } -void TestRunner_Battle_RecordAbilityPopUp(u32 battlerId, u32 ability) +void TestRunner_Battle_RecordAbilityPopUp(u32 battlerId, enum Ability ability) { s32 queuedEvent; s32 match; @@ -758,6 +947,85 @@ void TestRunner_Battle_RecordHP(u32 battlerId, u32 oldHP, u32 newHP) } } +static s32 TrySubHit(s32 i, s32 n, u32 battlerId, u32 damage, bool32 broke) +{ + struct QueuedSubHitEvent *event; + s32 iMax = i + n; + for (; i < iMax; i++) + { + if (DATA.queuedEvents[i].type != QUEUED_SUB_HIT_EVENT) + continue; + + event = &DATA.queuedEvents[i].as.subHit; + + if (event->battlerId == battlerId) + { + if (event->checkBreak) + { + if (event->breakSub && !broke) + return -1; + else if (!event->breakSub && broke) + return -1; + } + + if (event->address <= 0xFFFF) + { + event->address = damage; + return i; + } + else + { + *(u16 *)(u32)(event->address) = damage; + return i; + } + } + } + return -1; +} + +void TestRunner_Battle_RecordSubHit(u32 battlerId, u32 damage, bool32 broke) +{ + s32 queuedEvent; + s32 match; + struct QueuedEvent *event; + + if (DATA.trial.queuedEvent == DATA.queuedEventsCount) + return; + + event = &DATA.queuedEvents[DATA.trial.queuedEvent]; + switch (event->groupType) + { + case QUEUE_GROUP_NONE: + case QUEUE_GROUP_ONE_OF: + if (TrySubHit(DATA.trial.queuedEvent, event->groupSize, battlerId, damage, broke) != -1) + DATA.trial.queuedEvent += event->groupSize; + break; + case QUEUE_GROUP_NONE_OF: + queuedEvent = DATA.trial.queuedEvent; + do + { + if ((match = TrySubHit(queuedEvent, event->groupSize, battlerId, damage, broke)) != -1) + { + const char *filename = gTestRunnerState.test->filename; + u32 line = SourceLine(DATA.queuedEvents[match].sourceLineOffset); + Test_ExitWithResult(TEST_RESULT_FAIL, line, ":L%s:%d: Matched SUB_HIT", filename, line); + } + + queuedEvent += event->groupSize; + if (queuedEvent == DATA.queuedEventsCount) + break; + + event = &DATA.queuedEvents[queuedEvent]; + if (event->groupType == QUEUE_GROUP_NONE_OF) + continue; + + if (TrySubHit(queuedEvent, event->groupSize, battlerId, damage, broke) != -1) + DATA.trial.queuedEvent = queuedEvent + event->groupSize; + } while (FALSE); + break; + } +} + static const char *const sBattleActionNames[] = { [B_ACTION_USE_MOVE] = "MOVE", @@ -765,6 +1033,16 @@ static const char *const sBattleActionNames[] = [B_ACTION_SWITCH] = "SWITCH", }; +static const char *const sGimmickIdentifiers[GIMMICKS_COUNT] = +{ + [GIMMICK_NONE] = "N/A", + [GIMMICK_MEGA] = "Mega Evolution", + [GIMMICK_ULTRA_BURST] = "Ultra Burst", + [GIMMICK_Z_MOVE] = "Z-Move", + [GIMMICK_DYNAMAX] = "Dynamax", + [GIMMICK_TERA] = "Terastallize", +}; + static u32 CountAiExpectMoves(struct ExpectedAIAction *expectedAction, u32 battlerId, bool32 printLog) { u32 i, countExpected = 0; @@ -780,7 +1058,7 @@ static u32 CountAiExpectMoves(struct ExpectedAIAction *expectedAction, u32 battl return countExpected; } -void TestRunner_Battle_CheckChosenMove(u32 battlerId, u32 moveId, u32 target) +void TestRunner_Battle_CheckChosenMove(u32 battlerId, u32 moveId, u32 target, enum Gimmick gimmick) { const char *filename = gTestRunnerState.test->filename; u32 id = DATA.trial.aiActionsPlayed[battlerId]; @@ -802,6 +1080,9 @@ void TestRunner_Battle_CheckChosenMove(u32 battlerId, u32 moveId, u32 target) if (expectedAction->explicitTarget && expectedAction->target != target) Test_ExitWithResult(TEST_RESULT_FAIL, SourceLine(0), ":L%s:%d: Expected target %s, got %s", filename, expectedAction->sourceLine, BattlerIdentifier(expectedAction->target), BattlerIdentifier(target)); + if (expectedAction->gimmick != GIMMICKS_COUNT && expectedAction->gimmick != gimmick) + Test_ExitWithResult(TEST_RESULT_FAIL, SourceLine(0), ":L%s:%d: Expected gimmick %s, got %s", filename, expectedAction->sourceLine, sGimmickIdentifiers[expectedAction->gimmick], sGimmickIdentifiers[gimmick]); + for (i = 0; i < MAX_MON_MOVES; i++) { if ((1u << i) & expectedAction->moveSlots) @@ -1304,6 +1585,7 @@ static const char *const sEventTypeMacros[] = [QUEUED_ABILITY_POPUP_EVENT] = "ABILITY_POPUP", [QUEUED_ANIMATION_EVENT] = "ANIMATION", [QUEUED_HP_EVENT] = "HP_BAR", + [QUEUED_SUB_HIT_EVENT] = "SUB_HIT", [QUEUED_EXP_EVENT] = "EXPERIENCE_BAR", [QUEUED_MESSAGE_EVENT] = "MESSAGE", [QUEUED_STATUS_EVENT] = "STATUS_ICON", @@ -1341,6 +1623,11 @@ void TestRunner_Battle_AfterLastTurn(void) static void TearDownBattle(void) { + // Zero out the parties, data in them could potentially carry over + ZeroPlayerPartyMons(); + ZeroEnemyPartyMons(); + SetCurrentDifficultyLevel(DIFFICULTY_NORMAL); + FreeMonSpritesGfx(); FreeBattleSpritesData(); FreeBattleResources(); @@ -1491,14 +1778,24 @@ void RNGSeed_(u32 sourceLine, rng_value_t seed) void AIFlags_(u32 sourceLine, u64 flags) { - INVALID_IF(!IsAITest(), "AI_FLAGS is usable only in AI_SINGLE_BATTLE_TEST & AI_DOUBLE_BATTLE_TEST"); - DATA.recordedBattle.AI_scripts = flags; + INVALID_IF(!IsAITest(), "AI_FLAGS is usable only in AI_SINGLE_BATTLE_TEST, AI_DOUBLE_BATTLE_TEST, AI_MULTI_BATTLE_TEST, and AI_TWO_VS_ONE_TEST"); + for (u32 i = 0; i < MAX_BATTLERS_COUNT; i++) + { + DATA.recordedBattle.AI_scripts[i] = flags; + } + DATA.hasAI = TRUE; +} + +void BattlerAIFlags_(u32 sourceLine, u32 battler, u64 flags) +{ + INVALID_IF(!IsAITest(), "AI_FLAGS is usable only in AI_SINGLE_BATTLE_TEST, AI_DOUBLE_BATTLE_TEST, AI_MULTI_BATTLE_TEST, and AI_TWO_VS_ONE_TEST"); + DATA.recordedBattle.AI_scripts[battler] |= flags; DATA.hasAI = TRUE; } void AILogScores(u32 sourceLine) { - INVALID_IF(!IsAITest(), "AI_LOG is usable only in AI_SINGLE_BATTLE_TEST & AI_DOUBLE_BATTLE_TEST"); + INVALID_IF(!IsAITest(), "AI_LOG is usable only in AI_SINGLE_BATTLE_TEST, AI_DOUBLE_BATTLE_TEST, AI_MULTI_BATTLE_TEST, and AI_TWO_VS_ONE_TEST"); DATA.logAI = TRUE; } @@ -1510,6 +1807,9 @@ const struct TestRunner gBattleTestRunner = .tearDown = BattleTest_TearDown, .checkProgress = BattleTest_CheckProgress, .handleExitWithResult = BattleTest_HandleExitWithResult, + .randomUniform = BattleTest_RandomUniform, + .randomWeightedArray = BattleTest_RandomWeightedArray, + .randomElementArray = BattleTest_RandomElementArray, }; void SetFlagForTest(u32 sourceLine, u16 flagId) @@ -1519,10 +1819,10 @@ void SetFlagForTest(u32 sourceLine, u16 flagId) FlagSet(flagId); } -void TestSetConfig(u32 sourceLine, enum GenConfigTag configTag, u32 value) +void TestSetConfig(u32 sourceLine, enum ConfigTag configTag, u32 value) { INVALID_IF(!STATE->runGiven, "WITH_CONFIG outside of GIVEN"); - SetGenConfig(configTag, value); + SetConfig(configTag, value); } void ClearFlagAfterTest(void) @@ -1534,14 +1834,14 @@ void ClearFlagAfterTest(void) } } -void OpenPokemon(u32 sourceLine, u32 side, u32 species) +void OpenPokemon(u32 sourceLine, enum BattlerPosition position, u32 species) { s32 i, data; u8 *partySize; struct Pokemon *party; INVALID_IF(species >= SPECIES_EGG, "Invalid species: %d", species); ASSUMPTION_FAIL_IF(!IsSpeciesEnabled(species), "Species disabled: %d", species); - if (side == B_SIDE_PLAYER) + if ((position & BIT_SIDE) == B_SIDE_PLAYER) { partySize = &DATA.playerPartySize; party = DATA.recordedBattle.playerParty; @@ -1552,7 +1852,7 @@ void OpenPokemon(u32 sourceLine, u32 side, u32 species) party = DATA.recordedBattle.opponentParty; } INVALID_IF(*partySize >= PARTY_SIZE, "Too many Pokemon in party"); - DATA.currentSide = side; + DATA.currentPosition = position; DATA.currentPartyIndex = *partySize; DATA.currentMon = &party[DATA.currentPartyIndex]; DATA.gender = 0xFF; // Male @@ -1572,6 +1872,65 @@ void OpenPokemon(u32 sourceLine, u32 side, u32 species) } } +void OpenPokemonMulti(u32 sourceLine, enum BattlerPosition position, u32 species) +{ + + s32 i, data; + u8 *partySize; + struct Pokemon *party; + INVALID_IF(species >= SPECIES_EGG, "Invalid species: %d", species); + ASSUMPTION_FAIL_IF(!IsSpeciesEnabled(species), "Species disabled: %d", species); + if (position == B_POSITION_PLAYER_LEFT) // MULTI_PLAYER + { + partySize = &DATA.playerPartySize; + party = DATA.recordedBattle.playerParty; + } + else if (position == B_POSITION_PLAYER_RIGHT) // MULTI_PARTNER + { + partySize = &DATA.playerPartySize; + if ((*partySize == 0) || (*partySize == 1) || (*partySize == 2)) + *partySize = 3; + party = DATA.recordedBattle.playerParty; + } + else if (position == B_POSITION_OPPONENT_LEFT) // MULTI_OPPONENT_A + { + partySize = &DATA.opponentPartySize; + party = DATA.recordedBattle.opponentParty; + } + else // MULTI_OPPONENT_B + { + partySize = &DATA.opponentPartySize; + if ((*partySize == 0) || (*partySize == 1) || (*partySize == 2)) + *partySize = 3; + party = DATA.recordedBattle.opponentParty; + } + INVALID_IF(*partySize >= PARTY_SIZE, "Too many Pokemon in party"); + DATA.currentPosition = position; + DATA.currentPartyIndex = *partySize; + DATA.currentMon = &party[DATA.currentPartyIndex]; + DATA.gender = 0xFF; // Male + DATA.nature = NATURE_HARDY; + DATA.isShiny = FALSE; + (*partySize)++; + + CreateMon(DATA.currentMon, species, 100, 0, TRUE, 0, OT_ID_PRESET, 0); + // Reset move IDs, but force PP to be non-zero. This is a safeguard against test species that only learn 1 move having test moves with 0 PP + for (i = 0; i < MAX_MON_MOVES; i++) + { + data = MOVE_NONE; + SetMonData(DATA.currentMon, MON_DATA_MOVE1 + i, &data); + data = 0x7F; // Max PP possible + SetMonData(DATA.currentMon, MON_DATA_PP1 + i, &data); + } + data = 0; + if (B_FRIENDSHIP_BOOST) + { + // This way, we avoid the boost affecting tests unless explicitly stated. + SetMonData(DATA.currentMon, MON_DATA_FRIENDSHIP, &data); + CalculateMonStats(DATA.currentMon); + } +} + // (sNaturePersonalities[i] % NUM_NATURES) == i // (sNaturePersonalities[i] & 0xFF) == 0 // NOTE: Using 25 << 8 rather than 0 << 8 to prevent shiny females. @@ -1597,21 +1956,32 @@ void ClosePokemon(u32 sourceLine) { s32 i; u32 data; - INVALID_IF(DATA.hasExplicitSpeeds && !(DATA.explicitSpeeds[DATA.currentSide] & (1 << DATA.currentPartyIndex)), "Speed required"); + INVALID_IF(DATA.hasExplicitSpeeds && !(DATA.explicitSpeeds[DATA.currentPosition] & (1 << DATA.currentPartyIndex)), "Speed required"); for (i = 0; i < STATE->battlersCount; i++) { - if ((i & BIT_SIDE) == DATA.currentSide + if (i == DATA.currentPosition && DATA.currentMonIndexes[i] == DATA.currentPartyIndex) { INVALID_IF(GetMonData(DATA.currentMon, MON_DATA_HP) == 0, "Battlers cannot be fainted"); } } - data = FALSE; - SetMonData(DATA.currentMon, MON_DATA_IS_SHINY, &data); UpdateMonPersonality(&DATA.currentMon->box, GenerateNature(DATA.nature, DATA.gender % NUM_NATURES) | DATA.gender); + data = DATA.isShiny; + SetMonData(DATA.currentMon, MON_DATA_IS_SHINY, &data); DATA.currentMon = NULL; } +static void SetGimmick(u32 sourceLine, u32 side, u32 partyIndex, enum Gimmick gimmick) +{ + enum Gimmick currentGimmick = DATA.chosenGimmick[side][partyIndex]; + if (!((currentGimmick == GIMMICK_ULTRA_BURST && gimmick == GIMMICK_Z_MOVE) + || (currentGimmick == GIMMICK_Z_MOVE && gimmick == GIMMICK_ULTRA_BURST))) + { + INVALID_IF(currentGimmick != GIMMICK_NONE && currentGimmick != gimmick, "Cannot set %s because %s already set", sGimmickIdentifiers[gimmick], sGimmickIdentifiers[currentGimmick]); + } + DATA.chosenGimmick[side][partyIndex] = gimmick; +} + void Gender_(u32 sourceLine, u32 gender) { const struct SpeciesInfo *info; @@ -1640,7 +2010,7 @@ void Nature_(u32 sourceLine, u32 nature) DATA.nature = nature; } -void Ability_(u32 sourceLine, u32 ability) +void Ability_(u32 sourceLine, enum Ability ability) { s32 i; u32 species; @@ -1660,7 +2030,7 @@ void Ability_(u32 sourceLine, u32 ability) // Store forced ability to be set when the battle starts if invalid. if (i == NUM_ABILITY_SLOTS) { - DATA.forcedAbilities[DATA.currentSide][DATA.currentPartyIndex] = ability; + DATA.forcedAbilities[DATA.currentPosition][DATA.currentPartyIndex] = ability; } } @@ -1672,7 +2042,9 @@ void Level_(u32 sourceLine, u32 level) INVALID_IF(level == 0 || level > MAX_LEVEL, "Illegal level: %d", level); SetMonData(DATA.currentMon, MON_DATA_LEVEL, &level); SetMonData(DATA.currentMon, MON_DATA_EXP, &gExperienceTables[gSpeciesInfo[species].growthRate][level]); + gMain.inBattle = TRUE; CalculateMonStats(DATA.currentMon); + gMain.inBattle = FALSE; } void MaxHP_(u32 sourceLine, u32 maxHP) @@ -1680,6 +2052,8 @@ void MaxHP_(u32 sourceLine, u32 maxHP) INVALID_IF(!DATA.currentMon, "MaxHP outside of PLAYER/OPPONENT"); INVALID_IF(maxHP == 0, "Illegal max HP: %d", maxHP); SetMonData(DATA.currentMon, MON_DATA_MAX_HP, &maxHP); + bool32 hyperTrainingFlag = TRUE; + SetMonData(DATA.currentMon, MON_DATA_HYPER_TRAINED_HP, &hyperTrainingFlag); } void HP_(u32 sourceLine, u32 hp) @@ -1695,6 +2069,8 @@ void Attack_(u32 sourceLine, u32 attack) INVALID_IF(!DATA.currentMon, "Attack outside of PLAYER/OPPONENT"); INVALID_IF(attack == 0, "Illegal attack: %d", attack); SetMonData(DATA.currentMon, MON_DATA_ATK, &attack); + bool32 hyperTrainingFlag = TRUE; + SetMonData(DATA.currentMon, MON_DATA_HYPER_TRAINED_ATK, &hyperTrainingFlag); } void Defense_(u32 sourceLine, u32 defense) @@ -1702,6 +2078,8 @@ void Defense_(u32 sourceLine, u32 defense) INVALID_IF(!DATA.currentMon, "Defense outside of PLAYER/OPPONENT"); INVALID_IF(defense == 0, "Illegal defense: %d", defense); SetMonData(DATA.currentMon, MON_DATA_DEF, &defense); + bool32 hyperTrainingFlag = TRUE; + SetMonData(DATA.currentMon, MON_DATA_HYPER_TRAINED_DEF, &hyperTrainingFlag); } void SpAttack_(u32 sourceLine, u32 spAttack) @@ -1709,6 +2087,8 @@ void SpAttack_(u32 sourceLine, u32 spAttack) INVALID_IF(!DATA.currentMon, "SpAttack outside of PLAYER/OPPONENT"); INVALID_IF(spAttack == 0, "Illegal special attack: %d", spAttack); SetMonData(DATA.currentMon, MON_DATA_SPATK, &spAttack); + bool32 hyperTrainingFlag = TRUE; + SetMonData(DATA.currentMon, MON_DATA_HYPER_TRAINED_SPATK, &hyperTrainingFlag); } void SpDefense_(u32 sourceLine, u32 spDefense) @@ -1716,6 +2096,8 @@ void SpDefense_(u32 sourceLine, u32 spDefense) INVALID_IF(!DATA.currentMon, "SpDefense outside of PLAYER/OPPONENT"); INVALID_IF(spDefense == 0, "Illegal special defense: %d", spDefense); SetMonData(DATA.currentMon, MON_DATA_SPDEF, &spDefense); + bool32 hyperTrainingFlag = TRUE; + SetMonData(DATA.currentMon, MON_DATA_HYPER_TRAINED_SPDEF, &hyperTrainingFlag); } void Speed_(u32 sourceLine, u32 speed) @@ -1723,8 +2105,10 @@ void Speed_(u32 sourceLine, u32 speed) INVALID_IF(!DATA.currentMon, "Speed outside of PLAYER/OPPONENT"); INVALID_IF(speed == 0, "Illegal speed: %d", speed); SetMonData(DATA.currentMon, MON_DATA_SPEED, &speed); + bool32 hyperTrainingFlag = TRUE; + SetMonData(DATA.currentMon, MON_DATA_HYPER_TRAINED_SPEED, &hyperTrainingFlag); DATA.hasExplicitSpeeds = TRUE; - DATA.explicitSpeeds[DATA.currentSide] |= 1 << DATA.currentPartyIndex; + DATA.explicitSpeeds[DATA.currentPosition] |= 1 << DATA.currentPartyIndex; } void HPIV_(u32 sourceLine, u32 hpIV) @@ -1774,6 +2158,17 @@ void Item_(u32 sourceLine, u32 item) INVALID_IF(!DATA.currentMon, "Item outside of PLAYER/OPPONENT"); INVALID_IF(item >= ITEMS_COUNT, "Illegal item: %d", item); SetMonData(DATA.currentMon, MON_DATA_HELD_ITEM, &item); + switch (GetItemHoldEffect(item)) + { + case HOLD_EFFECT_MEGA_STONE: + SetGimmick(sourceLine, DATA.currentPosition, DATA.currentPartyIndex, GIMMICK_MEGA); + break; + case HOLD_EFFECT_Z_CRYSTAL: + SetGimmick(sourceLine, DATA.currentPosition, DATA.currentPartyIndex, GIMMICK_Z_MOVE); + break; + default: + break; + } } void Moves_(u32 sourceLine, u16 moves[MAX_MON_MOVES]) @@ -1789,7 +2184,7 @@ void Moves_(u32 sourceLine, u16 moves[MAX_MON_MOVES]) u32 pp = GetMovePP(moves[i]); SetMonData(DATA.currentMon, MON_DATA_PP1 + i, &pp); } - DATA.explicitMoves[DATA.currentSide] |= 1 << DATA.currentPartyIndex; + DATA.explicitMoves[DATA.currentPosition] |= 1 << DATA.currentPartyIndex; } void MovesWithPP_(u32 sourceLine, struct moveWithPP moveWithPP[MAX_MON_MOVES]) @@ -1804,7 +2199,7 @@ void MovesWithPP_(u32 sourceLine, struct moveWithPP moveWithPP[MAX_MON_MOVES]) SetMonData(DATA.currentMon, MON_DATA_MOVE1 + i, &moveWithPP[i].moveId); SetMonData(DATA.currentMon, MON_DATA_PP1 + i, &moveWithPP[i].pp); } - DATA.explicitMoves[DATA.currentSide] |= 1 << DATA.currentPartyIndex; + DATA.explicitMoves[DATA.currentPosition] |= 1 << DATA.currentPartyIndex; } void Friendship_(u32 sourceLine, u32 friendship) @@ -1830,18 +2225,21 @@ void DynamaxLevel_(u32 sourceLine, u32 dynamaxLevel) { INVALID_IF(!DATA.currentMon, "DynamaxLevel outside of PLAYER/OPPONENT"); SetMonData(DATA.currentMon, MON_DATA_DYNAMAX_LEVEL, &dynamaxLevel); + SetGimmick(sourceLine, DATA.currentPosition, DATA.currentPartyIndex, GIMMICK_DYNAMAX); } void GigantamaxFactor_(u32 sourceLine, bool32 gigantamaxFactor) { INVALID_IF(!DATA.currentMon, "GigantamaxFactor outside of PLAYER/OPPONENT"); SetMonData(DATA.currentMon, MON_DATA_GIGANTAMAX_FACTOR, &gigantamaxFactor); + SetGimmick(sourceLine, DATA.currentPosition, DATA.currentPartyIndex, GIMMICK_DYNAMAX); } -void TeraType_(u32 sourceLine, u32 teraType) +void TeraType_(u32 sourceLine, enum Type teraType) { INVALID_IF(!DATA.currentMon, "TeraType outside of PLAYER/OPPONENT"); SetMonData(DATA.currentMon, MON_DATA_TERA_TYPE, &teraType); + SetGimmick(sourceLine, DATA.currentPosition, DATA.currentPartyIndex, GIMMICK_TERA); } void Shadow_(u32 sourceLine, bool32 isShadow) @@ -1850,6 +2248,19 @@ void Shadow_(u32 sourceLine, bool32 isShadow) SetMonData(DATA.currentMon, MON_DATA_IS_SHADOW, &isShadow); } +void Shiny_(u32 sourceLine, bool32 isShiny) +{ + INVALID_IF(!DATA.currentMon, "Shiny outside of PLAYER/OPPONENT"); + DATA.isShiny = isShiny; +} + +void Environment_(u32 sourceLine, u32 environment) +{ + INVALID_IF(DATA.forcedEnvironment, "Environment is already set"); + INVALID_IF(environment >= BATTLE_ENVIRONMENT_COUNT, "Illegal environment: %d", environment); + DATA.forcedEnvironment = environment + 1; +} + static const char *const sBattlerIdentifiersSingles[] = { "player", @@ -1875,6 +2286,12 @@ static const char *BattlerIdentifier(s32 battlerId) return sBattlerIdentifiersSingles[battlerId]; case BATTLE_TEST_DOUBLES: case BATTLE_TEST_AI_DOUBLES: + case BATTLE_TEST_MULTI: + case BATTLE_TEST_AI_MULTI: + case BATTLE_TEST_TWO_VS_ONE: + case BATTLE_TEST_AI_TWO_VS_ONE: + case BATTLE_TEST_ONE_VS_TWO: + case BATTLE_TEST_AI_ONE_VS_TWO: return sBattlerIdentifiersDoubles[battlerId]; } return ""; @@ -2015,10 +2432,10 @@ void CloseTurn(u32 sourceLine) for (i = 0; i < STATE->battlersCount; i++) { if (!(DATA.actionBattlers & (1 << i))) - { - if (IsAITest() && (i & BIT_SIDE) == B_SIDE_OPPONENT) // If Move was not specified, allow any move used. + { // Multi test partner trainers want setting to RecordedPartner controller if no move set in this case. + if (IsAITest() && (i & BIT_SIDE) == B_SIDE_OPPONENT) // If Move was not specified, allow any move used. SetAiActionToPass(sourceLine, i); - else + else Move(sourceLine, &gBattleMons[i], (struct MoveContext) { move: MOVE_CELEBRATE, explicitMove: TRUE }); } } @@ -2029,7 +2446,7 @@ void CloseTurn(u32 sourceLine) static struct Pokemon *CurrentMon(s32 battlerId) { struct Pokemon *party; - if ((battlerId & BIT_SIDE) == B_SIDE_PLAYER) + if (battlerId == B_POSITION_PLAYER_LEFT || battlerId == B_POSITION_PLAYER_RIGHT) party = DATA.recordedBattle.playerParty; else party = DATA.recordedBattle.opponentParty; @@ -2105,9 +2522,10 @@ void MoveGetIdAndSlot(s32 battlerId, struct MoveContext *ctx, u32 *moveId, u32 * INVALID_IF(DATA.explicitMoves[battlerId & BIT_SIDE] & (1 << DATA.currentMonIndexes[battlerId]), "Missing explicit %S", GetMoveName(ctx->move)); SetMonData(mon, MON_DATA_MOVE1 + i, &ctx->move); u32 pp = GetMovePP(ctx->move); - SetMonData(DATA.currentMon, MON_DATA_PP1 + i, &pp); + SetMonData(mon, MON_DATA_PP1 + i, &pp); *moveSlot = i; *moveId = ctx->move; + INVALID_IF(GetMovePP(ctx->move) == 0, "%S has 0 PP!", GetMoveName(ctx->move)); break; } } @@ -2127,7 +2545,7 @@ void MoveGetIdAndSlot(s32 battlerId, struct MoveContext *ctx, u32 *moveId, u32 * if (ctx->explicitGimmick && ctx->gimmick != GIMMICK_NONE) { u32 item = GetMonData(mon, MON_DATA_HELD_ITEM); - enum ItemHoldEffect holdEffect = GetItemHoldEffect(item); + enum HoldEffect holdEffect = GetItemHoldEffect(item); u32 species = GetMonData(mon, MON_DATA_SPECIES); u32 side = battlerId & BIT_SIDE; @@ -2142,11 +2560,7 @@ void MoveGetIdAndSlot(s32 battlerId, struct MoveContext *ctx, u32 *moveId, u32 * INVALID_IF(ctx->gimmick != GIMMICK_Z_MOVE && ctx->gimmick != GIMMICK_ULTRA_BURST && holdEffect == HOLD_EFFECT_Z_CRYSTAL, "Cannot use another gimmick while holding a Z-Crystal"); // Check multiple gimmick use. - INVALID_IF(DATA.chosenGimmick[side][DATA.currentMonIndexes[battlerId]] != GIMMICK_NONE - && !(DATA.chosenGimmick[side][DATA.currentMonIndexes[battlerId]] == GIMMICK_ULTRA_BURST - && ctx->gimmick == GIMMICK_Z_MOVE), "Cannot use multiple gimmicks on the same battler"); - - DATA.chosenGimmick[side][DATA.currentMonIndexes[battlerId]] = ctx->gimmick; + SetGimmick(sourceLine, side, DATA.currentMonIndexes[battlerId], ctx->gimmick); *moveSlot |= RET_GIMMICK; } } @@ -2213,6 +2627,17 @@ void Move(u32 sourceLine, struct BattlePokemon *battler, struct MoveContext ctx) if (ctx.explicitRNG) DATA.battleRecordTurns[DATA.turns][battlerId].rng = ctx.rng; + u32 shellSideArmCount = 0; + for (u32 i = 0; i < STATE->battlersCount; i++) + { + if (DATA.battleRecordTurns[DATA.turns][i].rng.tag == RNG_SHELL_SIDE_ARM) + { + shellSideArmCount++; + if (shellSideArmCount > 1) + Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":L Tried to use fixed RNG for multiple Shell Side Arm moves in the same turn"); + } + } + if (!(DATA.actionBattlers & (1 << battlerId))) { PushBattlerAction(sourceLine, battlerId, RECORDED_ACTION_TYPE, B_ACTION_USE_MOVE); @@ -2259,17 +2684,18 @@ static void TryMarkExpectMove(u32 sourceLine, struct BattlePokemon *battler, str s32 target; INVALID_IF(DATA.turnState == TURN_CLOSED, "EXPECT_MOVE outside TURN"); - INVALID_IF(!IsAITest(), "EXPECT_MOVE is usable only in AI_SINGLE_BATTLE_TEST & AI_DOUBLE_BATTLE_TEST"); + INVALID_IF(!IsAITest(), "EXPECT_MOVE is usable only in AI_SINGLE_BATTLE_TEST, AI_DOUBLE_BATTLE_TEST, AI_MULTI_BATTLE_TEST, and AI_TWO_VS_ONE_TEST"); MoveGetIdAndSlot(battlerId, ctx, &moveId, &moveSlot, sourceLine); target = MoveGetTarget(battlerId, moveId, ctx, sourceLine); id = DATA.expectedAiActionIndex[battlerId]; DATA.expectedAiActions[battlerId][id].type = B_ACTION_USE_MOVE; - DATA.expectedAiActions[battlerId][id].moveSlots |= 1 << moveSlot; + DATA.expectedAiActions[battlerId][id].moveSlots |= 1 << (moveSlot & ~RET_GIMMICK); DATA.expectedAiActions[battlerId][id].target = target; DATA.expectedAiActions[battlerId][id].explicitTarget = ctx->explicitTarget; DATA.expectedAiActions[battlerId][id].sourceLine = sourceLine; DATA.expectedAiActions[battlerId][id].actionSet = TRUE; + DATA.expectedAiActions[battlerId][id].gimmick = ctx->explicitGimmick ? ctx->gimmick : GIMMICKS_COUNT; if (ctx->explicitNotExpected) DATA.expectedAiActions[battlerId][id].notMove = ctx->notExpected; @@ -2289,7 +2715,7 @@ void ExpectSendOut(u32 sourceLine, struct BattlePokemon *battler, u32 partyIndex s32 i, id; s32 battlerId = battler - gBattleMons; INVALID_IF(DATA.turnState == TURN_CLOSED, "EXPECT_SEND_OUT outside TURN"); - INVALID_IF(!IsAITest(), "EXPECT_SEND_OUT is usable only in AI_SINGLE_BATTLE_TEST & AI_DOUBLE_BATTLE_TEST"); + INVALID_IF(!IsAITest(), "EXPECT_SEND_OUT is usable only in AI_SINGLE_BATTLE_TEST, AI_DOUBLE_BATTLE_TEST, AI_MULTI_BATTLE_TEST, AI_TWO_VS_ONE_TEST, and AI_ONE_VS_TWO_TEST"); INVALID_IF(partyIndex >= ((battlerId & BIT_SIDE) == B_SIDE_PLAYER ? DATA.playerPartySize : DATA.opponentPartySize), "EXPECT_SEND_OUT to invalid party index"); for (i = 0; i < STATE->battlersCount; i++) { @@ -2297,8 +2723,9 @@ void ExpectSendOut(u32 sourceLine, struct BattlePokemon *battler, u32 partyIndex INVALID_IF(DATA.currentMonIndexes[i] == partyIndex, "EXPECT_SEND_OUT to battler"); } if (!(DATA.actionBattlers & (1 << battlerId))) - { - if (IsAITest() && (battlerId & BIT_SIDE) == B_SIDE_OPPONENT) // If Move was not specified, allow any move used. + { // Multi test partner trainers want setting to PlayerPartner controller even if no move set in this case. + if (IsAITest() && (((battlerId & BIT_SIDE) == B_SIDE_OPPONENT) // If Move was not specified, allow any move used. + || (IsMultibattleTest() && battlerId == B_POSITION_PLAYER_RIGHT))) SetAiActionToPass(sourceLine, battlerId); else Move(sourceLine, battler, (struct MoveContext) { move: MOVE_CELEBRATE, explicitMove: TRUE }); @@ -2341,7 +2768,7 @@ void Score(u32 sourceLine, struct BattlePokemon *battler, u32 cmp, bool32 toValu s32 battlerId = battler - gBattleMons; s32 turn = DATA.turns; - INVALID_IF(!IsAITest(), "SCORE_%s%s is usable only in AI_SINGLE_BATTLE_TEST & AI_DOUBLE_BATTLE_TEST", sCmpToStringTable[cmp], (toValue == TRUE) ? "_VAL" : ""); + INVALID_IF(!IsAITest(), "SCORE_%s%s is usable only in AI_SINGLE_BATTLE_TEST, AI_DOUBLE_BATTLE_TEST, AI_MULTI_BATTLE_TEST, & AI_TWO_VS_ONE_TEST", sCmpToStringTable[cmp], (toValue == TRUE) ? "_VAL" : ""); for (i = 0; i < MAX_AI_SCORE_COMPARISION_PER_TURN; i++) { @@ -2425,7 +2852,7 @@ void ExpectSwitch(u32 sourceLine, struct BattlePokemon *battler, u32 partyIndex) s32 i, id; s32 battlerId = battler - gBattleMons; INVALID_IF(DATA.turnState == TURN_CLOSED, "EXPECT_SWITCH outside TURN"); - INVALID_IF(!IsAITest(), "EXPECT_SWITCH is usable only in AI_SINGLE_BATTLE_TEST & AI_DOUBLE_BATTLE_TEST"); + INVALID_IF(!IsAITest(), "EXPECT_SWITCH is usable only in AI_SINGLE_BATTLE_TEST, AI_DOUBLE_BATTLE_TEST, AI_MULTI_BATTLE_TEST, AI_TWO_VS_ONE_TEST, and AI_ONE_VS_TWO_TEST"); INVALID_IF(DATA.actionBattlers & (1 << battlerId), "Multiple battler actions"); INVALID_IF(partyIndex >= ((battlerId & BIT_SIDE) == B_SIDE_PLAYER ? DATA.playerPartySize : DATA.opponentPartySize), "EXPECT_SWITCH to invalid party index"); @@ -2499,6 +2926,9 @@ void UseItem(u32 sourceLine, struct BattlePokemon *battler, struct ItemContext c { i = 0; } + + if (ctx.explicitRNG) + DATA.battleRecordTurns[DATA.turns][battlerId].rng = ctx.rng; PushBattlerAction(sourceLine, battlerId, RECORDED_ACTION_TYPE, B_ACTION_USE_ITEM); PushBattlerAction(sourceLine, battlerId, RECORDED_ITEM_ID, (ctx.itemId >> 8) & 0xFF); PushBattlerAction(sourceLine, battlerId, RECORDED_ITEM_ID, ctx.itemId & 0xFF); @@ -2544,7 +2974,6 @@ void CloseQueueGroup(u32 sourceLine) void QueueAbility(u32 sourceLine, struct BattlePokemon *battler, struct AbilityEventContext ctx) { -#if B_ABILITY_POP_UP s32 battlerId = battler - gBattleMons; INVALID_IF(!STATE->runScene, "ABILITY_POPUP outside of SCENE"); if (DATA.queuedEventsCount == MAX_QUEUED_EVENTS) @@ -2559,7 +2988,6 @@ void QueueAbility(u32 sourceLine, struct BattlePokemon *battler, struct AbilityE .ability = ctx.ability, }}, }; -#endif } void QueueAnimation(u32 sourceLine, u32 type, u32 id, struct AnimationEventContext ctx) @@ -2648,6 +3076,46 @@ void QueueHP(u32 sourceLine, struct BattlePokemon *battler, struct HPEventContex }; } +void QueueSubHit(u32 sourceLine, struct BattlePokemon *battler, struct SubHitEventContext ctx) +{ + s32 battlerId = battler - gBattleMons; + bool32 breakSub = FALSE; + bool32 checkBreak = FALSE; + uintptr_t address; + + INVALID_IF(!STATE->runScene, "SUB_HIT outside of SCENE"); + if (DATA.queuedEventsCount == MAX_QUEUED_EVENTS) + Test_ExitWithResult(TEST_RESULT_ERROR, sourceLine, ":L%s:%d: SUB_HIT exceeds MAX_QUEUED_EVENTS", gTestRunnerState.test->filename, sourceLine); + + address = 0; + if (ctx.explicitCaptureDamage) + { + INVALID_IF(ctx.captureDamage == NULL, "captureDamage is NULL"); + *ctx.captureDamage = 0; + address = (uintptr_t)ctx.captureDamage; + } + + if (ctx.explicitSubBreak) + { + checkBreak = TRUE; + if (ctx.subBreak) + breakSub = TRUE; + } + + DATA.queuedEvents[DATA.queuedEventsCount++] = (struct QueuedEvent) { + .type = QUEUED_SUB_HIT_EVENT, + .sourceLineOffset = SourceLineOffset(sourceLine), + .groupType = QUEUE_GROUP_NONE, + .groupSize = 1, + .as = { .subHit = { + .battlerId = battlerId, + .checkBreak = checkBreak, + .breakSub = breakSub, + .address = address, + }}, + }; +} + void QueueExp(u32 sourceLine, struct BattlePokemon *battler, struct ExpEventContext ctx) { s32 battlerId = battler - gBattleMons; @@ -2756,6 +3224,11 @@ u32 TestRunner_Battle_GetForcedAbility(u32 side, u32 partyIndex) return DATA.forcedAbilities[side][partyIndex]; } +u32 TestRunner_Battle_GetForcedEnvironment(void) +{ + return DATA.forcedEnvironment; +} + u32 TestRunner_Battle_GetChosenGimmick(u32 side, u32 partyIndex) { return DATA.chosenGimmick[side][partyIndex]; diff --git a/test/test_test_runner.c b/test/test_test_runner.c new file mode 100644 index 000000000000..670be2767403 --- /dev/null +++ b/test/test_test_runner.c @@ -0,0 +1,9 @@ +#include "global.h" +#include "test/test.h" + +TEST("Tests resume after CRASH") +{ + KNOWN_CRASHING; + void (*f)(void) = NULL; + f(); +} diff --git a/test/text.c b/test/text.c index e2eed3af93ef..05e9ca1ffd0b 100644 --- a/test/text.c +++ b/test/text.c @@ -499,7 +499,7 @@ TEST("Ability names fit on Pokemon Summary Screen") { u32 i; const u32 fontId = FONT_NORMAL, widthPx = 144; - u32 ability = ABILITY_NONE; + enum Ability ability = ABILITY_NONE; for (i = 1; i < ABILITIES_COUNT; i++) { PARAMETRIZE_LABEL("%S", gAbilitiesInfo[i].name) { ability = i; } @@ -511,7 +511,7 @@ TEST("Ability names fit on Ability Pop-Up") { u32 i; const u32 fontId = FONT_SMALL_NARROWER, widthPx = 76; - u32 ability = ABILITY_NONE; + enum Ability ability = ABILITY_NONE; for (i = 1; i < ABILITIES_COUNT; i++) { PARAMETRIZE_LABEL("%S", gAbilitiesInfo[i].name) { ability = i; } @@ -523,7 +523,7 @@ TEST("Ability descriptions fit on Pokemon Summary Screen") { u32 i; const u32 fontId = FONT_NORMAL, widthPx = 146; - u32 ability = ABILITY_NONE; + enum Ability ability = ABILITY_NONE; for (i = 1; i < ABILITIES_COUNT; i++) { PARAMETRIZE_LABEL("%S", gAbilitiesInfo[i].description) { ability = i; } @@ -535,7 +535,7 @@ TEST("Type names fit on Battle Screen") { u32 i; const u32 fontId = FONT_NARROWER, widthPx = 39; - u32 type = TYPE_NORMAL; + enum Type type = TYPE_NORMAL; for (i = 0; i < NUMBER_OF_MON_TYPES; i++) { PARAMETRIZE_LABEL("%S", gTypesInfo[i].name) { type = i; } @@ -547,7 +547,7 @@ TEST("Type names fit on Pokedex Search Screen") { u32 i; const u32 fontId = FONT_NARROWER, widthPx = 38; - u32 type = TYPE_NORMAL; + enum Type type = TYPE_NORMAL; for (i = 0; i < NUMBER_OF_MON_TYPES; i++) { PARAMETRIZE_LABEL("%S", gTypesInfo[i].name) { type = i; } @@ -570,9 +570,9 @@ TEST("Battle strings fit on the battle message window") s32 sixDigitNines = 999999; // 36 pixels. u8 nickname[POKEMON_NAME_LENGTH + 1] = _("MMMMMMMMMMMM"); // 72 pixels. u32 longMoveID = MOVE_NATURES_MADNESS; // 89 pixels. - u32 longAbilityID = ABILITY_SUPERSWEET_SYRUP; // 91 pixels. + enum Ability longAbilityID = ABILITY_SUPERSWEET_SYRUP; // 91 pixels. u32 longStatName = STAT_EVASION; // 40 pixels. - u32 longTypeName = TYPE_ELECTRIC; // 43 pixels. + enum Type longTypeName = TYPE_ELECTRIC; // 43 pixels. u32 longSpeciesName = SPECIES_SANDY_SHOCKS; // 47 pixels. u32 longItemName = ITEM_UNREMARKABLE_TEACUP; // 73 pixels. u8 boxName[9] = _("MMMMMMMM"); // 54 pixels. @@ -663,8 +663,6 @@ TEST("Battle strings fit on the battle message window") break; // Buffer Move name to B_BUFF1 case STRINGID_PKMNLEARNEDMOVE2: - case STRINGID_TEAMSTOPPEDWORKING: // Unused - case STRINGID_FOESTOPPEDWORKING: // Unused case STRINGID_PKMNHURTBY: case STRINGID_PKMNFREEDFROM: case STRINGID_PKMNMOVEWASDISABLED: @@ -675,16 +673,16 @@ TEST("Battle strings fit on the battle message window") case STRINGID_PKMNSXWOREOFF: case STRINGID_BUFFERENDS: case STRINGID_FOREWARNACTIVATES: - case STRINGID_CUSEDBODYDISABLED: + case STRINGID_CURSEDBODYDISABLED: case STRINGID_CURRENTMOVECANTSELECT: case STRINGID_TARGETISHURTBYSALTCURE: PREPARE_MOVE_BUFFER(gBattleTextBuff1, longMoveID); break; // Buffer "999999" to B_BUFF1 case STRINGID_PLAYERGOTMONEY: - case STRINGID_PLAYERWHITEOUT2: + case STRINGID_PLAYERWHITEOUT2_TRAINER: case STRINGID_PLAYERPICKEDUPMONEY: - case STRINGID_PLAYERPAIDPRIZEMONEY: + case STRINGID_PLAYERWHITEOUT2_WILD: PREPARE_WORD_NUMBER_BUFFER(gBattleTextBuff1, 6, sixDigitNines); break; // Buffer "99" to B_BUFF1 @@ -715,8 +713,6 @@ TEST("Battle strings fit on the battle message window") case STRINGID_ATTACKERABILITYSTATRAISE: case STRINGID_TARGETABILITYSTATLOWER: case STRINGID_SCRIPTINGABILITYSTATRAISE: - case STRINGID_BATTLERABILITYRAISEDSTAT: - case STRINGID_ABILITYRAISEDSTATDRASTICALLY: case STRINGID_STATWASHEIGHTENED: StringCopy(gBattleTextBuff1, gStatNamesTable[longStatName]); break; @@ -758,7 +754,6 @@ TEST("Battle strings fit on the battle message window") case STRINGID_PKMNCURIOUSABOUTX: case STRINGID_PKMNENTHRALLEDBYX: case STRINGID_PKMNIGNOREDX: - case STRINGID_PREVENTEDFROMWORKING: case STRINGID_PKMNOBTAINEDX: case STRINGID_ABOUTTOUSEPOLTERGEIST: PREPARE_ITEM_BUFFER(gBattleTextBuff1, longItemName); diff --git a/tools/aif2pcm/.gitignore b/tools/aif2pcm/.gitignore deleted file mode 100644 index 31531797e7d7..000000000000 --- a/tools/aif2pcm/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -aif2pcm - diff --git a/tools/aif2pcm/Makefile b/tools/aif2pcm/Makefile deleted file mode 100644 index dd48a87597af..000000000000 --- a/tools/aif2pcm/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -CC ?= gcc - -CFLAGS = -Wall -Wextra -Wno-switch -Werror -std=c11 -O2 - -LIBS = -lm - -SRCS = main.c extended.c - -ifeq ($(OS),Windows_NT) -EXE := .exe -else -EXE := -endif - -.PHONY: all clean - -all: aif2pcm$(EXE) - @: - -aif2pcm$(EXE): $(SRCS) - $(CC) $(CFLAGS) $(SRCS) -o $@ $(LDFLAGS) $(LIBS) - -clean: - $(RM) aif2pcm aif2pcm.exe diff --git a/tools/aif2pcm/extended.c b/tools/aif2pcm/extended.c deleted file mode 100644 index 94449164bdf6..000000000000 --- a/tools/aif2pcm/extended.c +++ /dev/null @@ -1,172 +0,0 @@ -/* $Id: extended.c,v 1.8 2006/12/23 11:17:49 toad32767 Exp $ */ -/*- - * Copyright (c) 2005, 2006 by Marco Trillo - * - * Permission is hereby granted, free of charge, to any - * person obtaining a copy of this software and associated - * documentation files (the "Software"), to deal in the - * Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the - * Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice - * shall be included in all copies or substantial portions of - * the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY - * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE - * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR - * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS - * OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include -#include -#include - -/* - * Infinite & NAN values - * for non-IEEE systems - */ -#ifndef HUGE_VAL -#ifdef HUGE -#define INFINITE_VALUE HUGE -#define NAN_VALUE HUGE -#endif -#else -#define INFINITE_VALUE HUGE_VAL -#define NAN_VALUE HUGE_VAL -#endif - -/* - * IEEE 754 Extended Precision - * - * Implementation here is the 80-bit extended precision - * format of Motorola 68881, Motorola 68882 and Motorola - * 68040 FPUs, as well as Intel 80x87 FPUs. - * - * See: - * http://www.freescale.com/files/32bit/doc/fact_sheet/BR509.pdf - */ -/* - * Exponent range: [-16383,16383] - * Precision for mantissa: 64 bits with no hidden bit - * Bias: 16383 - */ - -/* - * Write IEEE Extended Precision Numbers - */ -void -ieee754_write_extended(double in, uint8_t* out) -{ - int sgn, exp, shift; - double fraction, t; - unsigned int lexp, hexp; - unsigned long low, high; - - if (in == 0.0) { - memset(out, 0, 10); - return; - } - if (in < 0.0) { - in = fabs(in); - sgn = 1; - } else - sgn = 0; - - fraction = frexp(in, &exp); - - if (exp == 0 || exp > 16384) { - if (exp > 16384) /* infinite value */ - low = high = 0; - else { - low = 0x80000000; - high = 0; - } - exp = 32767; - goto done; - } - fraction = ldexp(fraction, 32); - t = floor(fraction); - low = (unsigned long) t; - fraction -= t; - t = floor(ldexp(fraction, 32)); - high = (unsigned long) t; - - /* Convert exponents < -16382 to -16382 (then they will be - * stored as -16383) */ - if (exp < -16382) { - shift = 0 - exp - 16382; - high >>= shift; - high |= (low << (32 - shift)); - low >>= shift; - exp = -16382; - } - exp += 16383 - 1; /* bias */ - -done: - lexp = ((unsigned int) exp) >> 8; - hexp = ((unsigned int) exp) & 0xFF; - - /* big endian */ - out[0] = ((uint8_t) sgn) << 7; - out[0] |= (uint8_t) lexp; - out[1] = (uint8_t) hexp; - out[2] = (uint8_t) (low >> 24); - out[3] = (uint8_t) ((low >> 16) & 0xFF); - out[4] = (uint8_t) ((low >> 8) & 0xFF); - out[5] = (uint8_t) (low & 0xFF); - out[6] = (uint8_t) (high >> 24); - out[7] = (uint8_t) ((high >> 16) & 0xFF); - out[8] = (uint8_t) ((high >> 8) & 0xFF); - out[9] = (uint8_t) (high & 0xFF); - - return; -} - - -/* - * Read IEEE Extended Precision Numbers - */ -double -ieee754_read_extended(uint8_t* in) -{ - int sgn, exp; - unsigned long low, high; - double out; - - /* Extract the components from the big endian buffer */ - sgn = (int) (in[0] >> 7); - exp = ((int) (in[0] & 0x7F) << 8) | ((int) in[1]); - low = (((unsigned long) in[2]) << 24) - | (((unsigned long) in[3]) << 16) - | (((unsigned long) in[4]) << 8) | (unsigned long) in[5]; - high = (((unsigned long) in[6]) << 24) - | (((unsigned long) in[7]) << 16) - | (((unsigned long) in[8]) << 8) | (unsigned long) in[9]; - - if (exp == 0 && low == 0 && high == 0) - return (sgn ? -0.0 : 0.0); - - switch (exp) { - case 32767: - if (low == 0 && high == 0) - return (sgn ? -INFINITE_VALUE : INFINITE_VALUE); - else - return (sgn ? -NAN_VALUE : NAN_VALUE); - default: - exp -= 16383; /* unbias exponent */ - - } - - out = ldexp((double) low, -31 + exp); - out += ldexp((double) high, -63 + exp); - - return (sgn ? -out : out); -} diff --git a/tools/aif2pcm/main.c b/tools/aif2pcm/main.c deleted file mode 100644 index 0824b92da8c3..000000000000 --- a/tools/aif2pcm/main.c +++ /dev/null @@ -1,945 +0,0 @@ -// Copyright(c) 2016 huderlem -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#include -#include -#include -#include -#include -#include - -/* extended.c */ -void ieee754_write_extended (double, uint8_t*); -double ieee754_read_extended (uint8_t*); - -#ifdef _MSC_VER - -#define FATAL_ERROR(format, ...) \ -do \ -{ \ - fprintf(stderr, format, __VA_ARGS__); \ - exit(1); \ -} while (0) - -#else - -#define FATAL_ERROR(format, ...) \ -do \ -{ \ - fprintf(stderr, format, ##__VA_ARGS__); \ - exit(1); \ -} while (0) - -#endif // _MSC_VER - -typedef struct { - unsigned long num_samples; - union { - uint8_t *samples8; - uint16_t *samples16; - }; - uint8_t midi_note; - uint8_t sample_size; - bool has_loop; - unsigned long loop_offset; - double sample_rate; - unsigned long real_num_samples; -} AifData; - -struct Bytes { - unsigned long length; - uint8_t *data; -}; - -struct Marker { - unsigned short id; - unsigned long position; - // don't care about the name -}; - -struct Bytes *read_bytearray(const char *filename) -{ - struct Bytes *bytes = malloc(sizeof(struct Bytes)); - FILE *f = fopen(filename, "rb"); - if (!f) - { - FATAL_ERROR("Failed to open '%s' for reading!\n", filename); - } - fseek(f, 0, SEEK_END); - bytes->length = ftell(f); - fseek(f, 0, SEEK_SET); - bytes->data = malloc(bytes->length); - unsigned long read = fread(bytes->data, bytes->length, 1, f); - fclose(f); - if (read <= 0) - { - FATAL_ERROR("Failed to read data from '%s'!\n", filename); - } - return bytes; -} - -void write_bytearray(const char *filename, struct Bytes *bytes) -{ - FILE *f = fopen(filename, "wb"); - if (!f) - { - FATAL_ERROR("Failed to open '%s' for writing!\n", filename); - } - fwrite(bytes->data, bytes->length, 1, f); - fclose(f); -} - -void free_bytearray(struct Bytes *bytes) -{ - free(bytes->data); - free(bytes); -} - -char *get_file_extension(char *filename) -{ - char *index = strrchr(filename, '.'); - if (!index || index == filename) - { - return NULL; - } - return index + 1; -} - -char *new_file_extension(char *filename, char *ext) -{ - char *index = strrchr(filename, '.'); - if (!index || index == filename) - { - index = filename + strlen(filename); - } - int length = index - filename; - char *new_filename = malloc(length + 1 + strlen(ext) + 1); - if (new_filename) - { - strcpy(new_filename, filename); - new_filename[length] = '.'; - strcpy(new_filename + length + 1, ext); - } - return new_filename; -} - -void read_aif(struct Bytes *aif, AifData *aif_data) -{ - aif_data->has_loop = false; - aif_data->num_samples = 0; - - unsigned long pos = 0; - char chunk_name[5]; chunk_name[4] = '\0'; - char chunk_type[5]; chunk_type[4] = '\0'; - - // Check for FORM Chunk - memcpy(chunk_name, &aif->data[pos], 4); - pos += 4; - if (strcmp(chunk_name, "FORM") != 0) - { - FATAL_ERROR("Input .aif file has invalid header Chunk '%s'!\n", chunk_name); - } - - // Read size of whole file. - unsigned long whole_chunk_size = aif->data[pos++] << 24; - whole_chunk_size |= (aif->data[pos++] << 16); - whole_chunk_size |= (aif->data[pos++] << 8); - whole_chunk_size |= (uint8_t)aif->data[pos++]; - - unsigned long expected_whole_chunk_size = aif->length - 8; - if (whole_chunk_size != expected_whole_chunk_size) - { - FATAL_ERROR("FORM Chunk ckSize '%lu' doesn't match actual size '%lu'!\n", whole_chunk_size, expected_whole_chunk_size); - } - - // Check for AIFF Form Type - memcpy(chunk_type, &aif->data[pos], 4); - pos += 4; - if (strcmp(chunk_type, "AIFF") != 0) - { - FATAL_ERROR("FORM Type is '%s', but it must be AIFF!", chunk_type); - } - - struct Marker *markers = NULL; - unsigned short num_markers = 0, loop_start = 0, loop_end = 0; - unsigned long num_sample_frames = 0; - - // Read all the Chunks to populate the AifData struct. - while ((pos + 8) < aif->length) - { - // Read Chunk id - memcpy(chunk_name, &aif->data[pos], 4); - pos += 4; - - unsigned long chunk_size = (aif->data[pos++] << 24); - chunk_size |= (aif->data[pos++] << 16); - chunk_size |= (aif->data[pos++] << 8); - chunk_size |= aif->data[pos++]; - - if ((pos + chunk_size) > aif->length) - { - FATAL_ERROR("%s chunk at 0x%lx reached end of file before finishing\n", chunk_name, pos); - } - - if (strcmp(chunk_name, "COMM") == 0) - { - short num_channels = (aif->data[pos++] << 8); - num_channels |= (uint8_t)aif->data[pos++]; - if (num_channels != 1) - { - FATAL_ERROR("numChannels (%d) in the COMM Chunk must be 1!\n", num_channels); - } - - num_sample_frames = (aif->data[pos++] << 24); - num_sample_frames |= (aif->data[pos++] << 16); - num_sample_frames |= (aif->data[pos++] << 8); - num_sample_frames |= (uint8_t)aif->data[pos++]; - - aif_data->sample_size = (aif->data[pos++] << 8); - aif_data->sample_size |= (uint8_t)aif->data[pos++]; - if (aif_data->sample_size != 8 && aif_data->sample_size != 16) - { - FATAL_ERROR("sampleSize (%d) in the COMM Chunk must be 8 or 16!\n", aif_data->sample_size); - } - - double sample_rate = ieee754_read_extended((uint8_t*)(aif->data + pos)); - pos += 10; - - aif_data->sample_rate = sample_rate; - - if (aif_data->num_samples == 0) - { - aif_data->num_samples = num_sample_frames; - } - } - else if (strcmp(chunk_name, "MARK") == 0) - { - num_markers = (aif->data[pos++] << 8); - num_markers |= (uint8_t)aif->data[pos++]; - - if (markers) - { - FATAL_ERROR("More than one MARK Chunk in file!\n"); - } - - markers = calloc(num_markers, sizeof(struct Marker)); - - // Read each marker. - for (int i = 0; i < num_markers; i++) - { - unsigned short marker_id = (aif->data[pos++] << 8); - marker_id |= (uint8_t)aif->data[pos++]; - - unsigned long marker_position = (aif->data[pos++] << 24); - marker_position |= (aif->data[pos++] << 16); - marker_position |= (aif->data[pos++] << 8); - marker_position |= (uint8_t)aif->data[pos++]; - - // Marker name is a Pascal-style string. - uint8_t marker_name_size = aif->data[pos++]; - // We don't actually need the marker name for anything anymore. - /*char *marker_name = (char *)malloc((marker_name_size + 1) * sizeof(char)); - memcpy(marker_name, &aif->data[pos], marker_name_size); - marker_name[marker_name_size] = '\0';*/ - pos += marker_name_size + !(marker_name_size & 1); - - markers[i].id = marker_id; - markers[i].position = marker_position; - } - } - else if (strcmp(chunk_name, "INST") == 0) - { - uint8_t midi_note = (uint8_t)aif->data[pos++]; - - aif_data->midi_note = midi_note; - - // Skip over data we don't need. - pos += 7; - - unsigned short loop_type = (aif->data[pos++] << 8); - loop_type |= (uint8_t)aif->data[pos++]; - - if (loop_type) - { - loop_start = (aif->data[pos++] << 8); - loop_start |= (uint8_t)aif->data[pos++]; - - loop_end = (aif->data[pos++] << 8); - loop_end |= (uint8_t)aif->data[pos++]; - } - else - { - // Skip NoLooping sustain loop. - pos += 4; - } - - // Skip release loop, we don't need it. - pos += 6; - } - else if (strcmp(chunk_name, "SSND") == 0) - { - // Skip offset and blockSize - pos += 8; - - unsigned long num_samples = chunk_size - 8; - if (aif_data->sample_size == 8) - { - uint8_t *sample_data = (uint8_t *)malloc(num_samples * sizeof(uint8_t)); - memcpy(sample_data, &aif->data[pos], num_samples); - - aif_data->samples8 = sample_data; - aif_data->real_num_samples = num_samples; - } - else - { - uint16_t *sample_data = (uint16_t *)malloc(num_samples * sizeof(uint16_t)); - uint16_t *sample_data_swapped = (uint16_t *)malloc(num_samples * sizeof(uint16_t)); - memcpy(sample_data, &aif->data[pos], num_samples); - for (long unsigned i = 0; i < num_samples; i++) - { - sample_data_swapped[i] = __builtin_bswap16(sample_data[i]); - } - - aif_data->samples16 = sample_data_swapped; - aif_data->real_num_samples = num_samples; - free(sample_data); - } - pos += chunk_size - 8; - } - else - { - // Skip over unsupported chunks. - pos += chunk_size; - } - } - - if (markers) - { - // Resolve loop points. - struct Marker *cur_marker = markers; - - // Grab loop start point. - for (int i = 0; i < num_markers; i++, cur_marker++) - { - if (cur_marker->id == loop_start) - { - aif_data->loop_offset = cur_marker->position; - aif_data->has_loop = true; - break; - } - } - - cur_marker = markers; - - // Grab loop end point. - for (int i = 0; i < num_markers; i++, cur_marker++) - { - if (cur_marker->id == loop_end) - { - if (cur_marker->position < aif_data->loop_offset) { - aif_data->loop_offset = cur_marker->position; - aif_data->has_loop = true; - } - aif_data->num_samples = cur_marker->position; - break; - } - } - - free(markers); - } -} - -// This is a table of deltas between sample values in compressed PCM data. -const int gDeltaEncodingTable[] = { - 0, 1, 4, 9, 16, 25, 36, 49, - -64, -49, -36, -25, -16, -9, -4, -1, -}; - -#define POSITIVE_DELTAS_START 0 -#define POSITIVE_DELTAS_END 8 - -#define NEGATIVE_DELTAS_START 8 -#define NEGATIVE_DELTAS_END 16 - -struct Bytes *delta_decompress(struct Bytes *delta, unsigned int expected_length) -{ - struct Bytes *pcm = malloc(sizeof(struct Bytes)); - pcm->length = expected_length; - pcm->data = malloc(pcm->length + 0x40); - - uint8_t hi, lo; - unsigned int i = 0; - unsigned int j = 0; - int k; - int8_t base; - while (i < delta->length) - { - base = (int8_t)delta->data[i++]; - pcm->data[j++] = (uint8_t)base; - if (i >= delta->length) - { - break; - } - if (j >= pcm->length) - { - break; - } - lo = delta->data[i] & 0xf; - base += gDeltaEncodingTable[lo]; - pcm->data[j++] = base; - i++; - if (i >= delta->length) - { - break; - } - if (j >= pcm->length) - { - break; - } - for (k = 0; k < 31; k++) - { - hi = (delta->data[i] >> 4) & 0xf; - base += gDeltaEncodingTable[hi]; - pcm->data[j++] = base; - if (j >= pcm->length) - { - break; - } - lo = delta->data[i] & 0xf; - base += gDeltaEncodingTable[lo]; - pcm->data[j++] = base; - i++; - if (i >= delta->length) - { - break; - } - if (j >= pcm->length) - { - break; - } - } - if (j >= pcm->length) - { - break; - } - } - - pcm->length = j; - return pcm; -} - -#define U8_TO_S8(value) ((value) < 128 ? (value) : (value) - 256) -#define ABS(value) ((value) >= 0 ? (value) : -(value)) - -int get_delta_index(uint8_t sample, uint8_t prev_sample) -{ - int best_error = INT_MAX; - int best_index = -1; - int delta_table_start_index; - int delta_table_end_index; - int sample_signed = U8_TO_S8(sample); - int prev_sample_signed = U8_TO_S8(prev_sample); - - // if we're going up (or equal), only choose positive deltas - if (prev_sample_signed <= sample_signed) { - delta_table_start_index = POSITIVE_DELTAS_START; - delta_table_end_index = POSITIVE_DELTAS_END; - } else { - delta_table_start_index = NEGATIVE_DELTAS_START; - delta_table_end_index = NEGATIVE_DELTAS_END; - } - - for (int i = delta_table_start_index; i < delta_table_end_index; i++) - { - uint8_t new_sample = prev_sample + gDeltaEncodingTable[i]; - int new_sample_signed = U8_TO_S8(new_sample); - int error = ABS(new_sample_signed - sample_signed); - - if (error < best_error) - { - best_error = error; - best_index = i; - } - } - - return best_index; -} - -struct Bytes *delta_compress(struct Bytes *pcm) -{ - struct Bytes *delta = malloc(sizeof(struct Bytes)); - // estimate the length so we can malloc - int num_blocks = pcm->length / 64; - delta->length = num_blocks * 33; - - int extra = pcm->length % 64; - if (extra) - { - delta->length += 1; - extra -= 1; - } - if (extra) - { - delta->length += 1; - extra -= 1; - } - if (extra) - { - delta->length += (extra + 1) / 2; - } - - delta->data = malloc(delta->length + 33); - - unsigned int i = 0; - unsigned int j = 0; - int k; - uint8_t base; - int delta_index; - - while (i < pcm->length) - { - base = pcm->data[i++]; - delta->data[j++] = base; - - if (i >= pcm->length) - { - break; - } - delta_index = get_delta_index(pcm->data[i++], base); - base += gDeltaEncodingTable[delta_index]; - delta->data[j++] = delta_index; - - for (k = 0; k < 31; k++) - { - if (i >= pcm->length) - { - break; - } - delta_index = get_delta_index(pcm->data[i++], base); - base += gDeltaEncodingTable[delta_index]; - delta->data[j] = (delta_index << 4); - - if (i >= pcm->length) - { - break; - } - delta_index = get_delta_index(pcm->data[i++], base); - base += gDeltaEncodingTable[delta_index]; - delta->data[j++] |= delta_index; - } - } - - delta->length = j; - - return delta; -} - -#define STORE_U32_LE(dest, value) \ -do { \ - *(dest) = (value) & 0xff; \ - *((dest) + 1) = ((value) >> 8) & 0xff; \ - *((dest) + 2) = ((value) >> 16) & 0xff; \ - *((dest) + 3) = ((value) >> 24) & 0xff; \ -} while (0) - -#define LOAD_U32_LE(var, src) \ -do { \ - (var) = *(src); \ - (var) |= (*((src) + 1) << 8); \ - (var) |= (*((src) + 2) << 16); \ - (var) |= (*((src) + 3) << 24); \ -} while (0) - -// Reads an .aif file and produces a .pcm file containing an array of 8-bit samples. -void aif2pcm(const char *aif_filename, const char *pcm_filename, bool compress) -{ - struct Bytes *aif = read_bytearray(aif_filename); - AifData aif_data = {0}; - read_aif(aif, &aif_data); - - // Convert 16-bit to 8-bit if necessary - if (aif_data.sample_size == 16) - { - aif_data.real_num_samples /= 2; - uint8_t *converted_samples = malloc(aif_data.real_num_samples * sizeof(uint8_t)); - for (unsigned long i = 0; i < aif_data.real_num_samples; i++) - { - converted_samples[i] = aif_data.samples16[i] >> 8; - } - free(aif_data.samples16); - aif_data.samples8 = converted_samples; - } - - int header_size = 0x10; - struct Bytes *pcm; - struct Bytes output = {0,0}; - - if (compress) - { - struct Bytes *input = malloc(sizeof(struct Bytes)); - input->data = aif_data.samples8; - input->length = aif_data.real_num_samples; - pcm = delta_compress(input); - free(input); - } - else - { - pcm = malloc(sizeof(struct Bytes)); - pcm->data = aif_data.samples8; - pcm->length = aif_data.real_num_samples; - } - output.length = header_size + pcm->length; - output.data = malloc(output.length); - - uint32_t pitch_adjust = (uint32_t)(aif_data.sample_rate * 1024); - uint32_t loop_offset = (uint32_t)(aif_data.loop_offset); - uint32_t adjusted_num_samples = (uint32_t)(aif_data.num_samples - 1); - uint32_t flags = 0; - if (aif_data.has_loop) flags |= 0x40000000; - if (compress) flags |= 1; - STORE_U32_LE(output.data + 0, flags); - STORE_U32_LE(output.data + 4, pitch_adjust); - STORE_U32_LE(output.data + 8, loop_offset); - STORE_U32_LE(output.data + 12, adjusted_num_samples); - memcpy(&output.data[header_size], pcm->data, pcm->length); - write_bytearray(pcm_filename, &output); - - free(aif->data); - free(aif); - free(pcm); - free(output.data); - free(aif_data.samples8); -} - -// Reads a .pcm file containing an array of 8-bit samples and produces an .aif file. -// See http://www-mmsp.ece.mcgill.ca/documents/audioformats/aiff/Docs/AIFF-1.3.pdf for .aif file specification. -void pcm2aif(const char *pcm_filename, const char *aif_filename, uint32_t base_note) -{ - struct Bytes *pcm = read_bytearray(pcm_filename); - - AifData *aif_data = malloc(sizeof(AifData)); - - uint32_t flags; - LOAD_U32_LE(flags, pcm->data + 0); - aif_data->has_loop = flags & 0x40000000; - bool compressed = flags & 1; - - uint32_t pitch_adjust; - LOAD_U32_LE(pitch_adjust, pcm->data + 4); - aif_data->sample_rate = pitch_adjust / 1024.0; - - LOAD_U32_LE(aif_data->loop_offset, pcm->data + 8); - LOAD_U32_LE(aif_data->num_samples, pcm->data + 12); - aif_data->num_samples += 1; - - if (compressed) - { - struct Bytes *delta = pcm; - uint8_t *pcm_data = pcm->data; - delta->length -= 0x10; - delta->data += 0x10; - pcm = delta_decompress(delta, aif_data->num_samples); - free(pcm_data); - free(delta); - } - else - { - pcm->length -= 0x10; - pcm->data += 0x10; - } - - aif_data->samples8 = malloc(pcm->length); - memcpy(aif_data->samples8, pcm->data, pcm->length); - - struct Bytes *aif = malloc(sizeof(struct Bytes)); - aif->length = 54 + 60 + pcm->length; - aif->data = malloc(aif->length); - - long pos = 0; - - // First, write the FORM header chunk. - // FORM Chunk ckID - aif->data[pos++] = 'F'; - aif->data[pos++] = 'O'; - aif->data[pos++] = 'R'; - aif->data[pos++] = 'M'; - - // FORM Chunk ckSize - unsigned long form_size = pos; - unsigned long data_size = aif->length - 8; - aif->data[pos++] = ((data_size >> 24) & 0xFF); - aif->data[pos++] = ((data_size >> 16) & 0xFF); - aif->data[pos++] = ((data_size >> 8) & 0xFF); - aif->data[pos++] = (data_size & 0xFF); - - // FORM Chunk formType - aif->data[pos++] = 'A'; - aif->data[pos++] = 'I'; - aif->data[pos++] = 'F'; - aif->data[pos++] = 'F'; - - // Next, write the Common Chunk - // Common Chunk ckID - aif->data[pos++] = 'C'; - aif->data[pos++] = 'O'; - aif->data[pos++] = 'M'; - aif->data[pos++] = 'M'; - - // Common Chunk ckSize - aif->data[pos++] = 0; - aif->data[pos++] = 0; - aif->data[pos++] = 0; - aif->data[pos++] = 18; - - // Common Chunk numChannels - aif->data[pos++] = 0; - aif->data[pos++] = 1; // 1 channel - - // Common Chunk numSampleFrames - aif->data[pos++] = ((aif_data->num_samples >> 24) & 0xFF); - aif->data[pos++] = ((aif_data->num_samples >> 16) & 0xFF); - aif->data[pos++] = ((aif_data->num_samples >> 8) & 0xFF); - aif->data[pos++] = (aif_data->num_samples & 0xFF); - - // Common Chunk sampleSize - aif->data[pos++] = 0; - aif->data[pos++] = 8; // 8 bits per sample - - // Common Chunk sampleRate - //double sample_rate = pitch_adjust / 1024.0; - uint8_t sample_rate_buffer[10]; - ieee754_write_extended(aif_data->sample_rate, sample_rate_buffer); - for (int i = 0; i < 10; i++) - { - aif->data[pos++] = sample_rate_buffer[i]; - } - - if (aif_data->has_loop) - { - - // Marker Chunk ckID - aif->data[pos++] = 'M'; - aif->data[pos++] = 'A'; - aif->data[pos++] = 'R'; - aif->data[pos++] = 'K'; - - // Marker Chunk ckSize - aif->data[pos++] = 0; - aif->data[pos++] = 0; - aif->data[pos++] = 0; - aif->data[pos++] = 12 + (aif_data->has_loop ? 12 : 0); - - // Marker Chunk numMarkers - aif->data[pos++] = 0; - aif->data[pos++] = (aif_data->has_loop ? 2 : 1); - - // Marker loop start - aif->data[pos++] = 0; - aif->data[pos++] = 1; // id = 1 - - long loop_start = aif_data->loop_offset; - aif->data[pos++] = ((loop_start >> 24) & 0xFF); - aif->data[pos++] = ((loop_start >> 16) & 0xFF); - aif->data[pos++] = ((loop_start >> 8) & 0xFF); - aif->data[pos++] = (loop_start & 0xFF); // position - - aif->data[pos++] = 5; // pascal-style string length - aif->data[pos++] = 'S'; - aif->data[pos++] = 'T'; - aif->data[pos++] = 'A'; - aif->data[pos++] = 'R'; - aif->data[pos++] = 'T'; // markerName - - // Marker loop end - aif->data[pos++] = 0; - aif->data[pos++] = (aif_data->has_loop ? 2 : 1); // id = 2 - - long loop_end = aif_data->num_samples; - aif->data[pos++] = ((loop_end >> 24) & 0xFF); - aif->data[pos++] = ((loop_end >> 16) & 0xFF); - aif->data[pos++] = ((loop_end >> 8) & 0xFF); - aif->data[pos++] = (loop_end & 0xFF); // position - - aif->data[pos++] = 3; // pascal-style string length - aif->data[pos++] = 'E'; - aif->data[pos++] = 'N'; - aif->data[pos++] = 'D'; - } - - // Instrument Chunk ckID - aif->data[pos++] = 'I'; - aif->data[pos++] = 'N'; - aif->data[pos++] = 'S'; - aif->data[pos++] = 'T'; - - // Instrument Chunk ckSize - aif->data[pos++] = 0; - aif->data[pos++] = 0; - aif->data[pos++] = 0; - aif->data[pos++] = 20; - - aif->data[pos++] = base_note; // baseNote - aif->data[pos++] = 0; // detune - aif->data[pos++] = 0; // lowNote - aif->data[pos++] = 127; // highNote - aif->data[pos++] = 1; // lowVelocity - aif->data[pos++] = 127; // highVelocity - aif->data[pos++] = 0; // gain (hi) - aif->data[pos++] = 0; // gain (lo) - - // Instrument Chunk sustainLoop - aif->data[pos++] = 0; - aif->data[pos++] = 1; // playMode = ForwardLooping - - aif->data[pos++] = 0; - aif->data[pos++] = 1; // beginLoop marker id - - aif->data[pos++] = 0; - aif->data[pos++] = 2; // endLoop marker id - - // Instrument Chunk releaseLoop - aif->data[pos++] = 0; - aif->data[pos++] = 1; // playMode = ForwardLooping - - aif->data[pos++] = 0; - aif->data[pos++] = 1; // beginLoop marker id - - aif->data[pos++] = 0; - aif->data[pos++] = 2; // endLoop marker id - - // Finally, write the Sound Data Chunk - // Sound Data Chunk ckID - aif->data[pos++] = 'S'; - aif->data[pos++] = 'S'; - aif->data[pos++] = 'N'; - aif->data[pos++] = 'D'; - - // Sound Data Chunk ckSize - unsigned long sound_data_size = pcm->length + 8; - aif->data[pos++] = ((sound_data_size >> 24) & 0xFF); - aif->data[pos++] = ((sound_data_size >> 16) & 0xFF); - aif->data[pos++] = ((sound_data_size >> 8) & 0xFF); - aif->data[pos++] = (sound_data_size & 0xFF); - - // Sound Data Chunk offset - aif->data[pos++] = 0; - aif->data[pos++] = 0; - aif->data[pos++] = 0; - aif->data[pos++] = 0; - - // Sound Data Chunk blockSize - aif->data[pos++] = 0; - aif->data[pos++] = 0; - aif->data[pos++] = 0; - aif->data[pos++] = 0; - - // Sound Data Chunk soundData - for (unsigned int i = 0; i < aif_data->loop_offset; i++) - { - aif->data[pos++] = aif_data->samples8[i]; - } - - int j = 0; - for (unsigned int i = aif_data->loop_offset; i < pcm->length; i++) - { - int pcm_index = aif_data->loop_offset + (j++ % (pcm->length - aif_data->loop_offset)); - aif->data[pos++] = aif_data->samples8[pcm_index]; - } - - aif->length = pos; - - // Go back and rewrite ckSize - data_size = aif->length - 8; - aif->data[form_size + 0] = ((data_size >> 24) & 0xFF); - aif->data[form_size + 1] = ((data_size >> 16) & 0xFF); - aif->data[form_size + 2] = ((data_size >> 8) & 0xFF); - aif->data[form_size + 3] = (data_size & 0xFF); - - write_bytearray(aif_filename, aif); - - free(aif->data); - free(aif); -} - -void usage(void) -{ - fprintf(stderr, "Usage: aif2pcm bin_file [aif_file]\n"); - fprintf(stderr, " aif2pcm aif_file [bin_file] [--compress]\n"); -} - -int main(int argc, char **argv) -{ - if (argc < 2) - { - usage(); - exit(1); - } - - char *input_file = argv[1]; - char *extension = get_file_extension(input_file); - char *output_file; - bool compressed = false; - - if (argc > 3) - { - for (int i = 3; i < argc; i++) - { - if (strcmp(argv[i], "--compress") == 0) - { - compressed = true; - } - } - } - - if (strcmp(extension, "aif") == 0 || strcmp(extension, "aiff") == 0) - { - if (argc >= 3) - { - output_file = argv[2]; - aif2pcm(input_file, output_file, compressed); - } - else - { - output_file = new_file_extension(input_file, "bin"); - aif2pcm(input_file, output_file, compressed); - free(output_file); - } - } - else if (strcmp(extension, "bin") == 0) - { - if (argc >= 3) - { - output_file = argv[2]; - pcm2aif(input_file, output_file, 60); - } - else - { - output_file = new_file_extension(input_file, "aif"); - pcm2aif(input_file, output_file, 60); - free(output_file); - } - } - else - { - FATAL_ERROR("Input file must be .aif or .bin: '%s'\n", input_file); - } - - return 0; -} diff --git a/tools/compresSmol/Makefile b/tools/compresSmol/Makefile new file mode 100644 index 000000000000..e4799483f71a --- /dev/null +++ b/tools/compresSmol/Makefile @@ -0,0 +1,31 @@ +CXX ?= g++ + +CXXFLAGS := -Werror -std=c++17 -O2 + +INCLUDES := -I . + +SRCS := compresSmol.cpp compressAlgo.cpp tANS.cpp +TILEMAP_SRCS := mainTiles.cpp compressSmolTiles.cpp tANS.cpp compressAlgo.cpp + +HEADERS := compressAlgo.h tANS.h +TILEMAP_HEADERS := compressSmolTiles.h tANS.h compressAlgo.h + +ifeq ($(OS),Windows_NT) +EXE := .exe +else +EXE := +endif + +.PHONY: all clean + +all: compresSmol$(EXE) compresSmolTilemap$(EXE) + @: + +compresSmol$(EXE): $(SRCS) $(HEADERS) + $(CXX) $(CXXFLAGS) $(INCLUDES) $(SRCS) -o $@ $(LDFLAGS) + +compresSmolTilemap$(EXE): $(TILEMAP_SRCS) $(TILEMAP_HEADERS) + $(CXX) $(CXXFLAGS) $(TILEMAP_INCLUDES) $(TILEMAP_SRCS) -o $@ $(LDFLAGS) + +clean: + $(RM) compresSmol compresSmol.exe compresSmolTilemap compresSmolTilemap.exe diff --git a/tools/compresSmol/compresSmol.cpp b/tools/compresSmol/compresSmol.cpp new file mode 100644 index 000000000000..1f7d2b1cb360 --- /dev/null +++ b/tools/compresSmol/compresSmol.cpp @@ -0,0 +1,172 @@ +#include +#include +#include +#include +#include +#include +#include "fileDispatcher.h" +#include "compressAlgo.h" + +struct ThingCount { + size_t number = 0; + size_t count = 1; +}; + +bool isNumber(std::string input) +{ + return input.find_first_not_of("0123456789") == std::string::npos; +} + +enum Option { + WRITE, + FRAME_WRITE, + DECODE, + USAGE, +}; + +int main(int argc, char *argv[]) +{ + Option option = USAGE; + bool printUsage = false; + std::string input; + std::string output; + InputSettings settings(true, true, true); + + if (argc > 1) + { + std::string argument = argv[1]; + if (argument.compare("-w") == 0) + option = WRITE; + else if (argument.compare("-fw") == 0) + option = FRAME_WRITE; + else if (argument.compare("-d") == 0) + option = DECODE; + } + switch (option) + { + case FRAME_WRITE: + // Not implemented yet + fprintf(stderr, "Frame writing isn't implemented yet\n"); + settings.useFrames = true; + option = WRITE; + return 1; + case WRITE: + if (argc > 3) + { + input = argv[2]; + output = argv[3]; + if (argc > 6) + { + std::string setting1 = argv[4]; + std::string setting2 = argv[5]; + std::string setting3 = argv[6]; + if (setting1.compare("true") == 0) + settings.canEncodeLO = true; + else if (setting1.compare("false") == 0) + settings.canEncodeLO = false; + else + fprintf(stderr, "Unrecognized setting1 \"%s\", defaulting to \"true\"\n", setting1.c_str()); + if (setting2.compare("true") == 0) + settings.canEncodeSyms = true; + else if (setting2.compare("false") == 0) + settings.canEncodeSyms = false; + else + fprintf(stderr, "Unrecognized setting2 \"%s\", defaulting to \"true\"\n", setting2.c_str()); + if (setting3.compare("true") == 0) + settings.canDeltaSyms = true; + else if (setting3.compare("false") == 0) + settings.canDeltaSyms = false; + else + fprintf(stderr, "Unrecognized setting3 \"%s\", defaulting to \"true\"\n", setting3.c_str()); + } + } + else + { + printUsage = true; + } + break; + case DECODE: + if (argc > 3) + { + input = argv[2]; + output = argv[3]; + } + else + { + printUsage = true; + } + break; + case USAGE: + printUsage = true; + break; + } + if (printUsage) + { + printf("Usage:\n\ + %s -w \"path/to/some/file.4bpp\" \"path/to/some/file.4bpp.smol\"\ + Compresses the first argument and writes the result to the second argument.\n\ + These modes can also be appended with 4 true/false statements that control the following settings of the compression:\n\ + - If the compression instructions can be tANS encoded.\n\ + - If the raw symbols in the compression can be tANS encoded.\n\ + - If the compression instructions can be delta encoded.\n\ + - If the raw symbols in the compression ca be delta encoded.\n\ + %s -d \"path/to/some/file.4bpp.smol\" \"path/to/some/file.4bpp\"\n\ + Decompresses the first argument and writes it to the second argument.", argv[0], argv[0]); + + return 0; + } + + if (option == WRITE) + { + if (std::filesystem::exists(input)) + { + CompressedImage image; + if (settings.useFrames) + image = processImageFrames(input, settings); + else + image = processImage(input, settings); + if (image.isValid) + { + std::ofstream fileOut(output.c_str(), std::ios::out | std::ios::binary); + fileOut.write(reinterpret_cast(image.writeVec.data()), image.writeVec.size()*4); + fileOut.close(); + } + else + { + fprintf(stderr, "Failed to compress image %s\n", image.fileName.c_str()); + } + } + else + { + fprintf(stderr, "Input file %s doesn't exist\n", input.c_str()); + } + } + if (option == DECODE) + { + if (std::filesystem::exists(input)) + { + std::vector inData; + if (!readFileAsUInt(input, &inData)) + { + return 0; + } + std::vector image4bpp; + readRawDataVecs(&inData, &image4bpp); + std::vector charVec(image4bpp.size()*2); + for (size_t i = 0; i < image4bpp.size(); i++) + { + charVec[2*i] = image4bpp[i] & 0xff; + charVec[2*i + 1] = (image4bpp[i] >> 8) & 0xff; + } + std::ofstream fileOut(output.c_str(), std::ios::out | std::ios::binary); + std::copy(charVec.begin(), charVec.end(), std::ostreambuf_iterator(fileOut)); + fileOut.close(); + } + else + { + fprintf(stderr, "Input file %s doesn't exist\n", input.c_str()); + } + } + + return 0; +} diff --git a/tools/compresSmol/compressAlgo.cpp b/tools/compresSmol/compressAlgo.cpp new file mode 100644 index 000000000000..36d4cbfadd9f --- /dev/null +++ b/tools/compresSmol/compressAlgo.cpp @@ -0,0 +1,1331 @@ +#include "compressAlgo.h" + +ShortCopy::ShortCopy(size_t index, size_t length, size_t offset, unsigned short firstSymbol) +{ + this->index = index; + this->length = length; + this->offset = offset; + this->firstSymbol = firstSymbol; +} + +bool getShortCopies(std::vector *pInput, size_t minLength, std::vector *pShortCopies) +{ + size_t iteration = 0; + std::vector checkVec(pInput->size()); + for (size_t i = 0; i < checkVec.size(); i++) + checkVec[i] = ' '; + for (size_t startIndex = 1; startIndex < pInput->size(); startIndex++) + { + size_t longestLength = 0; + size_t longestOffset; + for (size_t searchOffset = 1; searchOffset <= startIndex && searchOffset < 32767; searchOffset++) + { + size_t currLength = 0; + while (startIndex + currLength < pInput->size() + && (*pInput)[startIndex + currLength] == (*pInput)[startIndex + currLength - searchOffset]) + currLength++; + + if (currLength > longestLength) + { + longestLength = currLength; + longestOffset = searchOffset; + } + } + + if (longestLength > 32767) + longestLength = 32767; + if (longestLength >= minLength) + { + // Handle non-copies + if (startIndex > 0) + checkVec[startIndex - 1] = 'X'; + + for (size_t i = 0; i < longestLength; i++) + { + checkVec[startIndex + i] = 'X'; + } + for (size_t i = 0; i < startIndex - 1; i++) + { + if (checkVec[i] == ' ') + { + size_t extraIndex = i; + checkVec[extraIndex] = 'O'; + size_t extraLength = 1; + while (checkVec[extraIndex + extraLength] == ' ') + { + checkVec[extraIndex + extraLength] = 'O'; + extraLength++; + } + pShortCopies->push_back(ShortCopy(extraIndex, extraLength, 0, 0)); + break; + } + } + + pShortCopies->push_back(ShortCopy(startIndex, longestLength, longestOffset, (*pInput)[startIndex - 1])); + startIndex += longestLength; + } + } + + // Handle trailing characters + if (checkVec.back() == ' ') + { + size_t index = 0; + if (pShortCopies->size() > 0) + { + index = pShortCopies->back().index + pShortCopies->back().length; + size_t length = checkVec.size() - index; + pShortCopies->push_back(ShortCopy(index, length, 0, 0)); + } + else + { + pShortCopies->push_back(ShortCopy(0, checkVec.size(), 0, 0)); + } + } + + return verifyShortCopies(pShortCopies, pInput); +} + +bool verifyShortCopies(std::vector *pCopies, std::vector *pImage) +{ + size_t totalLength = 0; + for (ShortCopy copy : (*pCopies)) + { + totalLength += copy.length; + if (copy.offset != 0) + { + totalLength++; + } + + if (copy.offset != 0) + { + if (copy.firstSymbol != (*pImage)[copy.index - 1]) + return false; + + for (size_t i = 0; i < copy.length; i++) + { + if ((*pImage)[copy.index + i] != (*pImage)[copy.index + i - copy.offset]) + return false; + } + } + } + if (totalLength != pImage->size()) + return false; + + return true; +} + +bool getShortInstructions(std::vector *pCopies, std::vector *pInstructions, std::vector *pInput) +{ + for (ShortCopy copy : (*pCopies)) + { + ShortCompressionInstruction currInstruction; + currInstruction.index = copy.index; + currInstruction.offset = copy.offset; + currInstruction.length = copy.length; + currInstruction.firstSymbol = copy.firstSymbol; + currInstruction.buildBytes(pInput); + pInstructions->push_back(currInstruction); + } + return true; +} + +void getLosFromInstructions(std::vector *pInstructions, std::vector *pOutput) +{ + for (ShortCompressionInstruction instruction : (*pInstructions)) + { + for (unsigned char uc : instruction.loBytes) + pOutput->push_back(uc); + } +} + +void getSymsFromInstructions(std::vector *pInstructions, std::vector *pOutput) +{ + for (ShortCompressionInstruction instruction : (*pInstructions)) + { + for (unsigned short us : instruction.symShorts) + pOutput->push_back(us); + } +} + +void ShortCompressionInstruction::buildBytes(std::vector *pInput) +{ + if (offset != 0) + { + // Current pattern either exists earlier in the image + // or it's a long run of the same value + size_t currLength = length; + loBytes.push_back(currLength & LO_LOW_BITS_MASK); + currLength = currLength >> LO_NUM_LOW_BITS; + if (currLength != 0) + { + loBytes[loBytes.size() - 1] += LO_CONTINUE_BIT; + loBytes.push_back(currLength & BYTE_MASK); + } + size_t currOffset = offset; + loBytes.push_back(currOffset & LO_LOW_BITS_MASK); + currOffset = currOffset >> LO_NUM_LOW_BITS; + if (currOffset != 0) + { + loBytes[loBytes.size() - 1] += LO_CONTINUE_BIT; + loBytes.push_back(currOffset & BYTE_MASK); + } + symShorts.push_back(firstSymbol); + } + else + { + // The current pattern doesn't exist earlier in the image + // it has to be written section by section + // Set LENGTH parameter to 0, and use OFFSET parameter as length + loBytes.push_back(0); + size_t currLength = length; + loBytes.push_back(currLength & LO_LOW_BITS_MASK); + currLength = currLength >> LO_NUM_LOW_BITS; + if (currLength != 0) + { + loBytes[loBytes.size() - 1] += LO_CONTINUE_BIT; + loBytes.push_back(currLength & BYTE_MASK); + } + for (size_t i = 0; i < length; i++) + { + symShorts.push_back((*pInput)[index + i]); + } + } +} + +bool verifyBytesShort(std::vector *pLoVec, std::vector *pSymVec, std::vector *pImage) +{ + std::vector decodedImage; + size_t loIndex = 0; + size_t symIndex = 0; + while (loIndex < pLoVec->size()) + { + size_t currLength = 0; + size_t currOffset = 0; + currLength += (*pLoVec)[loIndex] & LO_LOW_BITS_MASK; + loIndex++; + if (((*pLoVec)[loIndex-1] & LO_CONTINUE_BIT) == LO_CONTINUE_BIT) + { + currLength += (*pLoVec)[loIndex] << LO_NUM_LOW_BITS; + loIndex++; + } + currOffset += (*pLoVec)[loIndex] & LO_LOW_BITS_MASK; + loIndex++; + if (((*pLoVec)[loIndex-1] & LO_CONTINUE_BIT) == LO_CONTINUE_BIT) + { + currOffset += (*pLoVec)[loIndex] << LO_NUM_LOW_BITS; + loIndex++; + } + if (currLength != 0) + { + decodedImage.push_back((*pSymVec)[symIndex]); + symIndex++; + for (size_t i = 0; i < currLength; i++) + decodedImage.push_back(decodedImage[decodedImage.size() - currOffset]); + } + else + { + for (size_t i = 0; i < currOffset; i++) + { + decodedImage.push_back((*pSymVec)[symIndex]); + symIndex++; + } + } + } + return true; +} + +bool compareVectorsShort(std::vector *pVec1, std::vector *pVec2) +{ + if (pVec1->size() != pVec2->size()) + return false; + for (size_t i = 0; i < pVec1->size(); i++) + if ((*pVec1)[i] != (*pVec2)[i]) + return false; + return true; +} + +bool isModeLoEncoded(CompressionMode mode) +{ + if (mode == ENCODE_LO + || mode == ENCODE_BOTH + || mode == ENCODE_BOTH_DELTA_SYMS) + return true; + return false; +} + +bool isModeSymEncoded(CompressionMode mode) +{ + if (mode == ENCODE_SYMS + || mode == ENCODE_DELTA_SYMS + || mode == ENCODE_BOTH + || mode == ENCODE_BOTH_DELTA_SYMS) + return true; + return false; +} + +bool isModeSymDelta(CompressionMode mode) +{ + if (mode == ENCODE_DELTA_SYMS + || mode == ENCODE_BOTH_DELTA_SYMS) + return true; + return false; +} + +std::vector getNormalizedCounts(std::vector *input) +{ + std::vector tempVec(16); + for (size_t i = 0; i < input->size(); i++) + tempVec[i] = (*input)[i]; + tempVec = normalizeCounts(tempVec, TANS_TABLE_SIZE); + bool shouldAdjust = false; + for (int i = 0; i < 16; i++) + if (tempVec[i] == TANS_TABLE_SIZE) + { + shouldAdjust = true; + tempVec[i]--; + } + if (shouldAdjust) + for (size_t i = 0; i < 16; i++) + if (tempVec[i] == 0) + { + tempVec[i]++; + break; + } + std::vector returnVec(16); + for (size_t i = 0; i < 16; i++) + returnVec[i] = tempVec[i]; + return returnVec; +} + +std::vector getFreqWriteInts(std::vector input) +{ + std::vector returnVec(3); + for (size_t i = 0; i < 5; i++) + { + unsigned int val1 = input[i]; + unsigned int val2 = input[5 + i]; + unsigned int val3 = input[10 + i]; + val1 = val1 << (i*6); + val2 = val2 << (i*6); + val3 = val3 << (i*6); + returnVec[0] += val1; + returnVec[1] += val2; + returnVec[2] += val3; + } + unsigned int lastVal = input[15]; + returnVec[0] += (lastVal & 0x3) << 30; + returnVec[1] += (lastVal & 0xc) << 28; + returnVec[2] += (lastVal & 0x30) << 26; + return returnVec; +} + +std::vector getTestFreqs(std::vector freqs, std::string name) +{ + if (name.find("test/compression/table_") == std::string::npos) + return freqs; + if (name.find("table_63_1") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 63; + freqs[1] = 1; + } + if (name.find("table_62_2") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 62; + freqs[1] = 2; + } + if (name.find("table_61_3") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 61; + freqs[1] = 3; + } + if (name.find("table_60_4") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 60; + freqs[1] = 4; + } + if (name.find("table_59_5") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 59; + freqs[1] = 5; + } + if (name.find("table_58_6") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 58; + freqs[1] = 6; + } + if (name.find("table_57_7") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 57; + freqs[1] = 7; + } + if (name.find("table_56_8") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 56; + freqs[1] = 8; + } + if (name.find("table_55_9") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 55; + freqs[1] = 9; + } + if (name.find("table_54_10") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 54; + freqs[1] = 10; + } + if (name.find("table_53_11") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 53; + freqs[1] = 11; + } + if (name.find("table_52_12") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 52; + freqs[1] = 12; + } + if (name.find("table_51_13") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 51; + freqs[1] = 13; + } + if (name.find("table_50_14") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 50; + freqs[1] = 14; + } + if (name.find("table_49_15") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 49; + freqs[1] = 15; + } + if (name.find("table_48_16") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 48; + freqs[1] = 16; + } + if (name.find("table_47_17") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 47; + freqs[1] = 17; + } + if (name.find("table_46_18") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 46; + freqs[1] = 18; + } + if (name.find("table_45_19") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 45; + freqs[1] = 19; + } + if (name.find("table_44_20") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 44; + freqs[1] = 20; + } + if (name.find("table_43_21") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 43; + freqs[1] = 21; + } + if (name.find("table_42_22") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 42; + freqs[1] = 22; + } + if (name.find("table_41_23") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 41; + freqs[1] = 23; + } + if (name.find("table_40_24") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 40; + freqs[1] = 24; + } + if (name.find("table_39_25") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 39; + freqs[1] = 25; + } + if (name.find("table_38_26") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 38; + freqs[1] = 26; + } + if (name.find("table_37_27") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 37; + freqs[1] = 27; + } + if (name.find("table_36_28") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 36; + freqs[1] = 28; + } + if (name.find("table_35_29") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 35; + freqs[1] = 29; + } + if (name.find("table_34_30") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 34; + freqs[1] = 30; + } + if (name.find("table_33_31") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 33; + freqs[1] = 31; + } + if (name.find("table_32_32") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 32; + freqs[1] = 32; + } + return freqs; +} + +void deltaEncode(std::vector *buffer, int length) +{ + unsigned char last = 0; + for (int i = 0; i < length; i++) + { + unsigned char current =(*buffer)[i]; + (*buffer)[i] = (current-last) & 0xf; + last = current; + } +} + +void deltaDecode(std::vector *buffer, int length) +{ + unsigned char last = 0; + for (int i = 0; i < length; i++) + { + unsigned char delta =(*buffer)[i]; + (*buffer)[i] = (delta+last) & 0xf; + last = (*buffer)[i]; + } +} + +int findInitialState(EncodeCol *encodeCol, unsigned char firstSymbol) +{ + for (size_t i = 0; i < encodeCol->symbols.size(); i++) + { + if (encodeCol->symbols[i].symbol == firstSymbol) + return encodeCol->symbols[i].nextState; + } + return -1; +} + +size_t decodeNibbles(std::vector decodeTable, std::vector *bits, int *currState, std::vector *nibbleVec, size_t currBitIndex, size_t numNibbles, bool lastThing) +{ + for (size_t i = 0; i < numNibbles; i++) + { + (*nibbleVec)[i] = decodeTable[*currState].symbol; + + if (i + 1 == nibbleVec->size() && lastThing) + return currBitIndex; + + int currK = decodeTable[*currState].k; + int nextState = decodeTable[*currState].y << currK; + for (size_t j = 0; j < currK; j++) + { + nextState += (*bits)[currBitIndex] << j; + currBitIndex++; + } + *currState = nextState - TANS_TABLE_SIZE; + } + return currBitIndex; +} + +std::vector getNewHeaders(CompressionMode mode, size_t imageSize, size_t symLength, int initialState, size_t bitstreamSize, size_t loLength) +{ + if (initialState == -1) + initialState = 0; + std::vector returnVec(2); + + returnVec[0] += (unsigned int)mode; // 4 bits + returnVec[0] += (imageSize/IMAGE_SIZE_MODIFIER) << IMAGE_SIZE_OFFSET; // 14 bits + returnVec[0] += (symLength) << SYM_SIZE_OFFSET; // 14 bits + // 32 total + + returnVec[1] += initialState; // 6 bits + returnVec[1] += bitstreamSize << BITSTREAM_SIZE_OFFSET; // 13 bits + returnVec[1] += loLength << LO_SIZE_OFFSET; // 13 bits + // 32 total + + return returnVec; +} + +bool fillCompressVec(std::vector *pLoVec, std::vector *pSymVec, CompressionMode mode, size_t imageBytes, std::string name, CompressedImage *pOutput) +{ + bool loEncoded = isModeLoEncoded(mode); + bool symEncoded = isModeSymEncoded(mode); + bool symDelta = isModeSymDelta(mode); + + std::vector loNibbles(2 * pLoVec->size()); + std::vector symNibbles(4 * pSymVec->size()); + std::vector loDecode; + std::vector symDecode; + std::vector symbols = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; + + if (loEncoded) + { + for (size_t i = 0; i < pLoVec->size(); i++) + { + loNibbles[2*i] = (*pLoVec)[i] & 0xf; + loNibbles[2*i + 1] = ((*pLoVec)[i] >> 4) & 0xf; + } + std::vector loCounts(16); + for (unsigned char uc : loNibbles) + loCounts[uc]++; + std::vector loFreqs = getNormalizedCounts(&loCounts); + std::vector freqs = getFreqWriteInts(loFreqs); + pOutput->loFreqs[0] = freqs[0]; + pOutput->loFreqs[1] = freqs[1]; + pOutput->loFreqs[2] = freqs[2]; + loDecode = createDecodingTable(symbols, loFreqs); + } + + if (symEncoded) + { + for (size_t i = 0; i < pSymVec->size(); i++) + { + for (size_t j = 0; j < 4; j++) + symNibbles[4*i + j] = ((*pSymVec)[i] >> (4*j)) & 0xf; + } + std::vector symCounts(16); + if (symDelta) + deltaEncode(&symNibbles, symNibbles.size()); + for (unsigned char uc : symNibbles) + symCounts[uc]++; + std::vector symFreqs = getNormalizedCounts(&symCounts); + symFreqs = getTestFreqs(symFreqs, name); + std::vector freqs = getFreqWriteInts(symFreqs); + pOutput->symFreqs[0] = freqs[0]; + pOutput->symFreqs[1] = freqs[1]; + pOutput->symFreqs[2] = freqs[2]; + symDecode = createDecodingTable(symbols, symFreqs); + } + + int currState = -1; + std::vector bitstream; + if (symEncoded) + { + std::vector reversedVec; + for (size_t i = 0; i < symNibbles.size(); i++) + reversedVec.push_back(symNibbles[symNibbles.size() - i - 1]); + std::vector symEncode = createEncodingTable(symDecode, symbols); + size_t startIndex = 0; + if (currState == -1) + { + currState = findInitialState(&symEncode[0], reversedVec[0]) - TANS_TABLE_SIZE; + startIndex = 1; + } + for (size_t i = startIndex; i < reversedVec.size(); i++) + currState = encodeSingleSymbol(symEncode[currState], reversedVec[i], &bitstream) - TANS_TABLE_SIZE; + } + + if (loEncoded) + { + std::vector reversedVec; + for (size_t i = 0; i < loNibbles.size(); i++) + reversedVec.push_back(loNibbles[loNibbles.size() - i - 1]); + std::vector loEncode = createEncodingTable(loDecode, symbols); + size_t startIndex = 0; + if (currState == -1) + { + currState = findInitialState(&loEncode[0], reversedVec[0]) - TANS_TABLE_SIZE; + startIndex = 1; + } + for (size_t i = startIndex; i < reversedVec.size(); i++) + currState = encodeSingleSymbol(loEncode[currState], reversedVec[i], &bitstream) - TANS_TABLE_SIZE; + } + + std::vector reversedBitstream(bitstream.size()); + for (size_t i = 0; i < bitstream.size(); i++) + reversedBitstream[reversedBitstream.size() - 1 - i] = bitstream[i]; + bitstream = reversedBitstream; + std::vector checkBits = bitstream; + int checkState = currState; + size_t currBitIndex = 0; + + if (loEncoded) + { + bool lastThing = !symEncoded; + std::vector checkLoNibbles(loNibbles.size()); + currBitIndex = decodeNibbles(loDecode, &checkBits, &checkState, &checkLoNibbles, currBitIndex, loNibbles.size(), lastThing); + for (size_t i = 0; i < loNibbles.size(); i++) + { + if (loNibbles[i] != checkLoNibbles[i]) + { + fprintf(stderr, "LO Mismatch\n"); + break; + } + } + } + + if (symEncoded) + { + std::vector checkSymNibbles(symNibbles.size()); + currBitIndex = decodeNibbles(symDecode, &checkBits, &checkState, &checkSymNibbles, currBitIndex, symNibbles.size(), true); + for (size_t i = 0; i < symNibbles.size(); i++) + { + if (symNibbles[i] != checkSymNibbles[i]) + { + fprintf(stderr, "Symbol Mismatch\n"); + break; + } + } + } + + std::vector tANSbits; + unsigned int currInt = 0; + for (size_t i = 0; i < bitstream.size(); i++) + { + currInt += bitstream[i] << (i%32); + if ((i+1) % 32 == 0) + { + tANSbits.push_back(currInt); + currInt = 0; + } + } + if (bitstream.size() % 32 != 0) + tANSbits.push_back(currInt); + + pOutput->headers = getNewHeaders(mode, imageBytes, pSymVec->size(), currState, tANSbits.size(), pLoVec->size()); + pOutput->tANSbits = tANSbits; + pOutput->symVec = *pSymVec; + pOutput->loVec = *pLoVec; + pOutput->initialState = currState; + return true; +} + +bool verifyCompressionShort(CompressedImage *pInput, std::vector *pImage) +{ + std::vector decodedImage = decodeImageShort(pInput); + return compareVectorsShort(&decodedImage, pImage); +} + +std::vector decodeImageShort(CompressedImage *pInput) +{ + DataVecs dataVecs = decodeDataVectorsNew(pInput); + return decodeBytesShort(&dataVecs.loVec, &dataVecs.symVec); +} + +std::vector decodeBytesShort(std::vector *pLoVec, std::vector *pSymVec) +{ + std::vector decodedImage; + size_t loIndex = 0; + size_t symIndex = 0; + while (loIndex < pLoVec->size()) + { + size_t currLength = 0; + size_t currOffset = 0; + currLength += (*pLoVec)[loIndex] & LO_LOW_BITS_MASK; + loIndex++; + if (((*pLoVec)[loIndex-1] & LO_CONTINUE_BIT) == LO_CONTINUE_BIT) + { + currLength += (*pLoVec)[loIndex] << LO_NUM_LOW_BITS; + loIndex++; + } + currOffset += (*pLoVec)[loIndex] & LO_LOW_BITS_MASK; + loIndex++; + if (((*pLoVec)[loIndex-1] & LO_CONTINUE_BIT) == LO_CONTINUE_BIT) + { + currOffset += (*pLoVec)[loIndex] << LO_NUM_LOW_BITS; + loIndex++; + } + if (currLength != 0) + { + decodedImage.push_back((*pSymVec)[symIndex]); + symIndex++; + for (size_t i = 0; i < currLength; i++) + decodedImage.push_back(decodedImage[decodedImage.size() - currOffset]); + } + else + { + for (size_t i = 0; i < currOffset; i++) + { + decodedImage.push_back((*pSymVec)[symIndex]); + symIndex++; + } + } + } + return decodedImage; +} + +DataVecs decodeDataVectorsNew(CompressedImage *pInput) +{ + CompressedImage headerValues; + readNewHeader(&pInput->headers, &headerValues); + size_t loSize = headerValues.loSize; + size_t symSize = headerValues.symSize; + CompressionMode mode = headerValues.mode; + bool loEncoded = isModeLoEncoded(mode); + bool symEncoded = isModeSymEncoded(mode); + bool symDelta = isModeSymDelta(mode); + std::vector symbols = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; + std::vector loDecode; + std::vector symDecode; + + std::vector loVec(loSize); + std::vector symVec(symSize); + std::vector loNibbles(loSize*2); + std::vector symNibbles(symSize*4); + + if (loEncoded) + { + std::vector loFreqs = unpackFrequencies(&pInput->loFreqs[0]); + loDecode = createDecodingTable(symbols, loFreqs); + } + if (symEncoded) + { + std::vector symFreqs = unpackFrequencies(&pInput->symFreqs[0]); + symDecode = createDecodingTable(symbols, symFreqs); + } + + std::vector allBits(pInput->tANSbits.size()*32); + size_t currIndex = 0; + for (unsigned int ui : pInput->tANSbits) + for (size_t i = 0; i < 32; i++) + { + unsigned int currVal = (ui >> i) & 0x1; + allBits[currIndex] = currVal; + currIndex++; + } + + if (!symEncoded) + for (size_t i = 0; i < symSize; i++) + symVec[i] = pInput->symVec[i]; + if (!loEncoded) + for (size_t i = 0; i < loSize; i++) + loVec[i] = pInput->loVec[i]; + + size_t bitIndex = 0; + int currState = pInput->initialState; + if (loEncoded) + { + bitIndex = decodeNibbles(loDecode, &allBits, &currState, &loNibbles, bitIndex, loSize*2, !symEncoded); + } + if (loEncoded) + for (size_t i = 0; i < loVec.size(); i++) + loVec[i] = loNibbles[2*i] + (loNibbles[2*i + 1] << 4); + + if (symEncoded) + { + bitIndex = decodeNibbles(symDecode, &allBits, &currState, &symNibbles, bitIndex, symSize*4, true); + if (symDelta) + deltaDecode(&symNibbles, symNibbles.size()); + } + if (symEncoded) + for (size_t i = 0; i < symVec.size(); i++) + for (size_t j = 0; j < 4; j++) + symVec[i] += (unsigned short)symNibbles[i*4 + j] << (j*4); + + DataVecs returnData; + returnData.loVec = loVec; + returnData.symVec = symVec; + return returnData; +} + +void readNewHeader(std::vector *pInput, CompressedImage *pOutput) +{ + std::vector headers(2); + headers[0] = (*pInput)[0]; + headers[1] = (*pInput)[1]; + pOutput->mode = (CompressionMode)(headers[0] & MODE_MASK); + pOutput->rawNumBytes = ((headers[0] >> IMAGE_SIZE_OFFSET) & IMAGE_SIZE_MASK) * IMAGE_SIZE_MODIFIER; + pOutput->symSize = ((headers[0] >> SYM_SIZE_OFFSET) & SYM_SIZE_MASK); + + pOutput->initialState = headers[1] & INITIAL_STATE_MASK; + pOutput->bitreamSize = (headers[1] >> BITSTREAM_SIZE_OFFSET) & BITSTREAM_SIZE_MASK; + pOutput->loSize = (headers[1] >> LO_SIZE_OFFSET) & LO_SIZE_MASK; + pOutput->headers = headers; +} + +std::vector unpackFrequencies(unsigned int pInts[3]) +{ + std::vector returnVec; + int freq15 = 0; + for (size_t i = 0; i < 3; i++) + { + for (size_t j = 0; j < 5; j++) + { + int currVal = (pInts[i] >> (6*j)) & 0x3f; + returnVec.push_back(currVal); + } + freq15 += ((pInts[i] >> 30) & 0x3) << (2*i); + } + returnVec.push_back(freq15); + return returnVec; +} + +void getUIntVecFromData(CompressedImage *pImage, std::vector *pOutput) +{ + CompressedImage otherImage; + readNewHeader(&pImage->headers, &otherImage); + pOutput->push_back(pImage->headers[0]); + pOutput->push_back(pImage->headers[1]); + if (isModeLoEncoded(otherImage.mode)) + for (size_t i = 0; i < 3; i++) + pOutput->push_back(pImage->loFreqs[i]); + if (isModeSymEncoded(otherImage.mode)) + for (size_t i = 0; i < 3; i++) + pOutput->push_back(pImage->symFreqs[i]); + if (isModeLoEncoded(otherImage.mode) || isModeSymEncoded(otherImage.mode)) + for (unsigned int ui : pImage->tANSbits) + pOutput->push_back(ui); + unsigned int currInt = 0; + unsigned int currOffset = 0; + if (!isModeSymEncoded(otherImage.mode)) + { + for (size_t i = 0; i < pImage->symVec.size(); i++) + { + currInt += pImage->symVec[i] << (8*(currOffset % 4)); + currOffset += 2; + if (currOffset % 4 == 0) + { + pOutput->push_back(currInt); + currInt = 0; + } + } + } + if (!isModeLoEncoded(otherImage.mode)) + { + for (size_t i = 0; i < pImage->loVec.size(); i++) + { + currInt += 0; + currInt += pImage->loVec[i] << (8*(currOffset % 4)); + currOffset++; + if (currOffset % 4 == 0) + { + pOutput->push_back(currInt); + currInt = 0; + } + } + } + if (currOffset % 4 != 0) + pOutput->push_back(currInt); +} + +void readRawDataVecs(std::vector *pInput, std::vector *pOutput) +{ + CompressedImage readImage; + readNewHeader(pInput, &readImage); + bool loEncoded = isModeLoEncoded(readImage.mode); + bool symEncoded = isModeSymEncoded(readImage.mode); + bool symDelta = isModeSymDelta(readImage.mode); + size_t readIndex = 2; + std::vector tANSbits; + std::vector allBits; + std::vector symVec(readImage.symSize); + std::vector loVec(readImage.loSize); + std::vector symDecode(TANS_TABLE_SIZE); + std::vector loDecode(TANS_TABLE_SIZE); + int currState = readImage.initialState; + if (loEncoded) + { + for (size_t i = 0; i < 3; i++) + readImage.loFreqs[i] = (*pInput)[readIndex + i]; + readIndex += 3; + std::vector loFreqs = unpackFrequencies(&readImage.loFreqs[0]); + size_t currCol = 0; + for (size_t i = 0; i < 16; i++) + { + for (size_t j = 0; j < loFreqs[i]; j++) + { + loDecode[currCol].state = TANS_TABLE_SIZE + currCol; + loDecode[currCol].symbol = i; + loDecode[currCol].y = loFreqs[i] + j; + int currK = 0; + while ((loDecode[currCol].y << currK) < TANS_TABLE_SIZE) + currK++; + loDecode[currCol].k = currK; + currCol++; + } + } + } + if (symEncoded) + { + for (size_t i = 0; i < 3; i++) + readImage.symFreqs[i] = (*pInput)[readIndex + i]; + readIndex += 3; + std::vector symFreqs = unpackFrequencies(&readImage.symFreqs[0]); + size_t currCol = 0; + for (size_t i = 0; i < 16; i++) + { + for (size_t j = 0; j < symFreqs[i]; j++) + { + symDecode[currCol].state = TANS_TABLE_SIZE + currCol; + symDecode[currCol].symbol = i; + symDecode[currCol].y = symFreqs[i] + j; + int currK = 0; + while ((symDecode[currCol].y << currK) < TANS_TABLE_SIZE) + currK++; + symDecode[currCol].k = currK; + currCol++; + } + } + } + if (loEncoded || symEncoded) + { + tANSbits.resize(readImage.bitreamSize); + for (size_t i = 0; i < readImage.bitreamSize; i++) + tANSbits[i] = (*pInput)[readIndex + i]; + readIndex += readImage.bitreamSize; + allBits.resize(tANSbits.size()*32); + size_t currIndex = 0; + for (unsigned int ui : tANSbits) + { + for (size_t i = 0; i < 32; i++) + { + unsigned int currVal = (ui >> i) & 0x1; + allBits[currIndex] = currVal; + currIndex++; + } + } + } + bool leftOverValues = false; + if (!symEncoded) + { + for (size_t i = 0; i < readImage.symSize; i++) + { + symVec[i] = ((*pInput)[readIndex] >> (16*(i%2))) & 0xffff; + if ((i+1) % 2 == 0) + { + readIndex++; + leftOverValues = false; + } + else + { + leftOverValues = true; + } + } + } + if (!loEncoded) + { + size_t offsetMod = 0; + if (leftOverValues) + offsetMod = 2; + for (size_t i = 0; i < readImage.loSize; i++) + { + loVec[i] = ((*pInput)[readIndex] >> (8*((i%4) + offsetMod))) & 0xff; + if ((i+offsetMod+1) % 4 == 0) + readIndex++; + } + } + size_t bitIndex = 0; + if (loEncoded) + { + std::vector loNibbles(readImage.loSize*2); + bitIndex = decodeNibbles(loDecode, &allBits, &currState, &loNibbles, bitIndex, readImage.loSize*2, !symEncoded); + for (size_t i = 0; i < readImage.loSize; i++) + loVec[i] = loNibbles[2*i] + (loNibbles[2*i + 1] << 4); + } + if (symEncoded) + { + std::vector symNibbles(readImage.symSize*4); + bitIndex = decodeNibbles(symDecode, &allBits, &currState, &symNibbles, bitIndex, readImage.symSize*4, true); + if (symDelta) + deltaDecode(&symNibbles, symNibbles.size()); + for (size_t i = 0; i < readImage.symSize; i++) + for (size_t j = 0; j < 4; j++) + symVec[i] += (unsigned short)symNibbles[i*4 + j] << (4*j); + } + *pOutput = decodeBytesShort(&loVec, &symVec); +} + +InputSettings::InputSettings() {} + +InputSettings::InputSettings(bool canEncodeLO, bool canEncodeSyms, bool canDeltaSyms) +{ + this->canEncodeLO = canEncodeLO; + this->canEncodeSyms = canEncodeSyms; + this->canDeltaSyms = canDeltaSyms; +} + +bool readFileAsUC(std::string filePath, std::vector *pFileData) +{ + std::ifstream iStream; + iStream.open(filePath.c_str(), std::ios::binary); + if (!iStream.is_open()) + { + fprintf(stderr, "Error: Couldn't open %s for reading bytes\n", filePath.c_str()); + return false; + } + + iStream.ignore( std::numeric_limits::max() ); + std::streamsize size = iStream.gcount(); + iStream.clear(); + iStream.seekg( 0, std::ios_base::beg ); + pFileData->resize(size); + iStream.read((char *)(pFileData->data()), size); + iStream.close(); + return true; +} + +bool readFileAsUInt(std::string filePath, std::vector *pFileData) +{ + std::ifstream iStream; + iStream.open(filePath.c_str(), std::ios::binary); + if (!iStream.is_open()) + { + fprintf(stderr, "Error: Couldn't open %s for reading bytes\n", filePath.c_str()); + return false; + } + + iStream.ignore( std::numeric_limits::max() ); + std::streamsize size = iStream.gcount(); + iStream.clear(); + iStream.seekg( 0, std::ios_base::beg ); + pFileData->resize(size/4); + iStream.read((char *)(pFileData->data()), size); + iStream.close(); + return true; +} + +CompressedImage processImage(std::string fileName, InputSettings settings) +{ + CompressedImage image; + std::vector input; + if (!readFileAsUC(fileName, &input)) + { + fprintf(stderr, "Compression failure\n"); + return image; + } + if (!processImageData(&input, &image, settings, fileName)) + { + fprintf(stderr, "Fail\n"); + } + return image; +} + +// Not implemented yet +CompressedImage processImageFrames(std::string fileName, InputSettings settings) +{ + CompressedImage image; + return image; +} + +bool processImageData(std::vector *pInput, CompressedImage *pImage, InputSettings settings, std::string fileName) +{ + CompressionMode someMode; + bool hasImage = false; + bool byteFail = false; + bool copyFail = false; + bool compressionFail = false; + bool uIntConversionFail = false; + + std::vector usBase(pInput->size() / 2); + memcpy(usBase.data(), pInput->data(), pInput->size()); + + std::vector bestLO; + std::vector bestSym; + std::vector bestInstructions; + + for (size_t minCodeLength = 2; minCodeLength <= 15; minCodeLength++) + { + std::vector shortCopies; + if (!getShortCopies(&usBase, minCodeLength, &shortCopies)) + { + copyFail = true; + printf("ERROR: %zu\n", minCodeLength); + continue; + } + + std::vector shortInstructions; + if (!getShortInstructions(&shortCopies, &shortInstructions, &usBase)) + { + printf("ERROR\n"); + return false; + } + + std::vector loVec; + std::vector symVec; + getLosFromInstructions(&shortInstructions, &loVec); + getSymsFromInstructions(&shortInstructions, &symVec); + if (!verifyBytesShort(&loVec, &symVec, &usBase)) + { + byteFail = true; + printf("Byte veri\n"); + continue; + } + + CompressionMode mode = BASE_ONLY; + std::vector modesToUse = {BASE_ONLY, ENCODE_SYMS, ENCODE_DELTA_SYMS, ENCODE_LO, ENCODE_BOTH, ENCODE_BOTH_DELTA_SYMS}; + if (fileName.find("test/compression/") != std::string::npos) + { + if (fileName.find("mode_0.4bpp") != std::string::npos) + modesToUse = {BASE_ONLY}; + else if (fileName.find("mode_1.4bpp") != std::string::npos) + modesToUse = {ENCODE_SYMS}; + else if (fileName.find("mode_2.4bpp") != std::string::npos) + modesToUse = {ENCODE_DELTA_SYMS}; + else if (fileName.find("mode_3.4bpp") != std::string::npos) + modesToUse = {ENCODE_LO}; + else if (fileName.find("mode_4.4bpp") != std::string::npos) + modesToUse = {ENCODE_BOTH}; + else if (fileName.find("mode_5.4bpp") != std::string::npos) + modesToUse = {ENCODE_BOTH_DELTA_SYMS}; + else if (fileName.find("test/compression/table_") != std::string::npos) + modesToUse = {ENCODE_SYMS}; + + if (modesToUse.size() == 1) + { + settings.canDeltaSyms = true; + settings.canEncodeLO = true; + settings.canEncodeSyms = true; + } + } + for (CompressionMode currMode : modesToUse) + { + CompressedImage currImg; + mode = currMode; + if (!settings.canDeltaSyms + && (mode == ENCODE_DELTA_SYMS + || mode == ENCODE_BOTH_DELTA_SYMS)) + continue; + if (!settings.canEncodeLO + && (mode == ENCODE_LO + || mode == ENCODE_BOTH + || mode == ENCODE_BOTH_DELTA_SYMS)) + continue; + if (!settings.canEncodeSyms + && (mode == ENCODE_SYMS + || mode == ENCODE_BOTH + || mode == ENCODE_DELTA_SYMS + || mode == ENCODE_BOTH_DELTA_SYMS)) + continue; + if (!fillCompressVec(&loVec, &symVec, mode, pInput->size(), fileName, &currImg)) + { + printf("ERROR\n"); + } + + if (!verifyCompressionShort(&currImg, &usBase)) + { + compressionFail = true; + printf("ERROR\n"); + continue; + } + std::vector uiVec; + getUIntVecFromData(&currImg, &uiVec); + std::vector decodedImage; + readRawDataVecs(&uiVec, &decodedImage); + if (!compareVectorsShort(&decodedImage, &usBase)) + { + uIntConversionFail = true; + printf("ERROR\n"); + continue; + } + currImg.compressedSize = uiVec.size() * 4; + if (!hasImage) + { + bestLO = loVec; + bestSym = symVec; + bestInstructions = shortInstructions; + *pImage = currImg; + hasImage = true; + pImage->writeVec = uiVec; + someMode = mode; + } + else if (currImg.compressedSize < pImage->compressedSize) + { + bestLO = loVec; + bestSym = symVec; + bestInstructions = shortInstructions; + *pImage = currImg; + hasImage = true; + pImage->writeVec = uiVec; + someMode = mode; + } + } + } + pImage->mode = someMode; + pImage->fileName = fileName; + pImage->rawNumBytes = pInput->size(); + if (hasImage) + { + pImage->isValid = true; + } + else + { + fprintf(stderr, "Failed to compress image %s\nErrors: ", fileName.c_str()); + if (copyFail) + fprintf(stderr, "CopyProcessing "); + if (byteFail) + fprintf(stderr, "ByteConversion "); + if (compressionFail) + fprintf(stderr, "Compression "); + if (uIntConversionFail) + fprintf(stderr, "uIntConversion "); + printf("\n"); + } + + return true; +} diff --git a/tools/compresSmol/compressAlgo.h b/tools/compresSmol/compressAlgo.h new file mode 100644 index 000000000000..6c2ff9373e42 --- /dev/null +++ b/tools/compresSmol/compressAlgo.h @@ -0,0 +1,147 @@ +#ifndef COMPRES_SMOL +#define COMPRES_SMOL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "fileDispatcher.h" +#include "tANS.h" + +#define OVERWORLD_16X16 256 +#define OVERWORLD_32X32 1024 + +#define TANS_TABLE_SIZE 64 +#define LO_CONTINUE_BIT 0x80 +#define LO_LOW_BITS_MASK 0x7f +#define LO_NUM_LOW_BITS 0x7 +#define BYTE_MASK 0xff +#define SHORT_MASK 0xffff +#define NIBBLE_MASK 0xf +#define NUM_SHORT_BITS 0xf +#define LENGTH_MOD_MASK 0xf +#define INITIAL_STATE_MASK 0x3f +#define MODE_MASK 0x1f +#define IMAGE_SIZE_MASK 0x3fff +#define IMAGE_SIZE_OFFSET 4 +#define SYM_SIZE_MASK 0x3fff +#define SYM_SIZE_OFFSET 18 +#define BITSTREAM_SIZE_MASK 0x1fff +#define BITSTREAM_SIZE_OFFSET 6 +#define LO_SIZE_MASK 0x1fff +#define LO_SIZE_OFFSET 19 + +#define IMAGE_SIZE_MODIFIER 4 + +enum CompressionMode { + LZ77 = 0, + BASE_ONLY = 1, + ENCODE_SYMS = 2, + ENCODE_DELTA_SYMS = 3, + ENCODE_LO = 4, + ENCODE_BOTH = 5, + ENCODE_BOTH_DELTA_SYMS = 6, + IS_FRAME_CONTAINER = 7, + IS_TILEMAP = 8, +}; + +struct ShortCopy { + size_t index; + size_t length; + size_t offset; + unsigned short firstSymbol; + ShortCopy(size_t index, size_t length, size_t offset, unsigned short firstSymbol); +}; + +struct ShortCompressionInstruction { + size_t length; + size_t offset; + size_t index; + unsigned short firstSymbol; + std::vector loBytes; + std::vector symShorts; + void buildBytes(std::vector *pInput); +}; + +struct CompressedImage { + std::string fileName; + CompressionMode mode; + size_t lzSize; + size_t loSize; + size_t symSize; + size_t bitreamSize = 0; + size_t rawNumBytes; + int initialState; + std::vector headers; + unsigned int loFreqs[3]; + unsigned int symFreqs[3]; + size_t compressedSize; + bool isValid = false; + std::vector writeVec; + std::vector tANSbits; + std::vector otherBits; + std::vector symVec; + std::vector loVec; +}; + +struct InputSettings { + bool canEncodeLO = true; + bool canEncodeSyms = true; + bool canDeltaSyms = true; + bool useFrames = false; + InputSettings(); + InputSettings(bool canEncodeLO, bool canEncodeSyms, bool canDeltaSyms); +}; + +struct DataVecs { + std::vector loVec; + std::vector symVec; +}; + +CompressedImage processImage(std::string fileName, InputSettings settings); +CompressedImage processImageFrames(std::string fileName, InputSettings settings); +bool processImageData(std::vector *pInput, CompressedImage *pImage, InputSettings settings, std::string fileName); + +bool readFileAsUInt(std::string filePath, std::vector *pFileData); + +bool getShortCopies(std::vector *pInput, size_t minLength, std::vector *pShortCopies); +bool verifyShortCopies(std::vector *pCopies, std::vector *pImage); + +std::vector getNormalizedCounts(std::vector input); +std::vector getFreqWriteInts(std::vector input); +std::vector getNewHeaders(CompressionMode mode, size_t imageSize, size_t symLength, int initialState, size_t bitstreamSize, size_t loLength); +int findInitialState(EncodeCol *encodeCol, unsigned char firstSymbol); + +bool fillCompressVec(std::vector *pLoVec, std::vector *pSymVec, CompressionMode mode, size_t imageBytes, std::string name, CompressedImage *pOutput); + +bool getShortInstructions(std::vector *pCopies, std::vector *pInstructions, std::vector *pInput); +void getLosFromInstructions(std::vector *pInstructions, std::vector *pOutput); +void getSymsFromInstructions(std::vector *pInstructions, std::vector *pOutput); +std::vector unpackFrequencies(unsigned int pInts[3]); +void readNewHeader(std::vector *pInput, CompressedImage *pOutput); +void getUIntVecFromData(CompressedImage *pImage, std::vector *pOutput); + +std::vector decodeBytesShort(std::vector *pLoVec, std::vector *pSymVec); +std::vector decodeImageShort(CompressedImage *pInput); +DataVecs decodeDataVectorsNew(CompressedImage *pInput); +bool compareVectorsShort(std::vector *pVec1, std::vector *pVec2); + +bool verifyCompressionShort(CompressedImage *pInput, std::vector *pImage); + +bool verifyBytesShort(std::vector *pLoVec, std::vector *pSymVec, std::vector *pImage); +void readRawDataVecs(std::vector *pInput, std::vector *pOutput); + +bool isModeLoEncoded(CompressionMode mode); +bool isModeSymEncoded(CompressionMode mode); +bool isModeSymDelta(CompressionMode mode); + +void deltaEncode(std::vector *buffer, int length); +void deltaDecode(std::vector *buffer, int length); + +std::vector getTestFreqs(std::vector freqs, std::string name); + +#endif diff --git a/tools/compresSmol/compressSmolTiles.cpp b/tools/compresSmol/compressSmolTiles.cpp new file mode 100644 index 000000000000..b4a7ff0fcf4f --- /dev/null +++ b/tools/compresSmol/compressSmolTiles.cpp @@ -0,0 +1,268 @@ +#include "compressSmolTiles.h" +#include + +std::vector readFileAsUS(std::string filePath) +{ + std::ifstream iStream; + iStream.open(filePath.c_str(), std::ios::binary); + if (!iStream.is_open()) + { + fprintf(stderr, "Error: Couldn't open %s for reading bytes\n", filePath.c_str()); + return std::vector(0); + } + iStream.ignore( std::numeric_limits::max() ); + std::streamsize size = iStream.gcount(); + iStream.clear(); + iStream.seekg( 0, std::ios_base::beg ); + std::vector ucVec(size); + iStream.read((char*)(&ucVec[0]), size); + iStream.close(); + unsigned short *pUInt = reinterpret_cast(ucVec.data()); + std::vector returnVec; + for (size_t i = 0; i < ucVec.size()/2; i++) + returnVec.push_back(pUInt[i]); + return returnVec; +} + +void deltaEncodeTileNums(std::vector *pTileNums) +{ + unsigned short prevVal = 0; + for (size_t i = 0; i < pTileNums->size(); i++) + { + unsigned short current = (*pTileNums)[i]; + (*pTileNums)[i] = (current - prevVal); + prevVal = current; + } +} + +CompressionResult compressTileset(std::string fileName) +{ + CompressionResult result; + result.tilemapSize = 0; + std::vector tiles = readFileAsUS(fileName); + std::vector origTiles = tiles; + if (tiles.size() == 0) + return result; + result.tilemapSize = tiles.size()*2; + deltaEncodeTileNums(&tiles); + result.vecs = compressVector(&tiles); + result.header = getHeader(result); + result.writeVec = getWriteVecs(result); + if (!verifyTileCompression(result.writeVec, origTiles)) + { + fprintf(stderr, "Tilemap verification failed for %s\n", fileName.c_str()); + result.failed = true; + } + return result; +} + +void deltaDecodeTileNums(std::vector *pTileNums) +{ + unsigned short prevVal = 0; + for (size_t i = 0; i < pTileNums->size(); i++) + { + unsigned short delta = (*pTileNums)[i]; + (*pTileNums)[i] = (delta + prevVal); + prevVal = (*pTileNums)[i]; + } +} + +std::vector decompressVector(std::vector *pVec) +{ + std::vector returnVec; + for (size_t i = 0; i < pVec->size(); i+=3) + { + unsigned short length = (*pVec)[i]; + unsigned short offset = (*pVec)[i + 1]; + if (length != 0) + { + returnVec.push_back((*pVec)[i + 2]); + for (size_t j = 0; j < length; j++) + returnVec.push_back(returnVec[returnVec.size() - offset]); + } + else + { + returnVec.push_back((*pVec)[i + 2]); + } + } + return returnVec; +} + +CompressVectors compressVector(std::vector *pVec) +{ + CompressVectors vecs; + std::vector shortCopies; + getShortCopies(pVec, 2, &shortCopies); + if (!verifyShortCopies(&shortCopies, pVec)) + { + fprintf(stderr, "Error getting tile-number compression\n"); + return vecs; + } + std::vector shortInstructions; + getShortInstructions(&shortCopies, &shortInstructions, pVec); + std::vector loVec; + getLosFromInstructions(&shortInstructions, &loVec); + std::vector symVec; + getSymsFromInstructions(&shortInstructions, &symVec); + + if (!verifyBytesShort(&loVec, &symVec, pVec)) + { + fprintf(stderr, "Error verifying tile-number compression\n"); + return vecs; + } + vecs.loVec = loVec; + vecs.symVec = symVec; + + return vecs; +} + +size_t getTotalSize(std::vector *input) +{ + size_t totalSize = 0; + for (size_t i = 0; i < 3; i++) + { + if ((*input)[i].loVec.size() == 0) + return 0; + if ((*input)[i].symVec.size() == 0) + return 0; + totalSize += (*input)[i].loVec.size(); + totalSize += (*input)[i].symVec.size(); + } + return totalSize; +} + +TileHeader getHeader(CompressionResult compression) +{ + TileHeader header; + header.mode = IS_TILEMAP; + header.tilemapSize = compression.tilemapSize; + header.symbolSize = compression.vecs.symVec.size(); + header.loSize = compression.vecs.loVec.size(); + header.header[0] = header.mode; + header.header[0] |= header.tilemapSize << 4; + header.header[0] |= header.symbolSize << 18; + header.header[1] = header.loSize; + return header; +} + +std::vector getWriteVecs(CompressionResult compression) +{ + std::vector returnVec; + returnVec.push_back(compression.header.header[0]); + returnVec.push_back(compression.header.header[1]); + unsigned int tempInt = 0; + bool containsData = false; + for (size_t i = 0; i < compression.header.symbolSize; i++) + { + unsigned int currData = compression.vecs.symVec[i]; + if (containsData) + currData = currData << 16; + tempInt += currData; + containsData = true; + if ((i+1) % 2 == 0) + { + returnVec.push_back(tempInt); + tempInt = 0; + containsData = false; + } + } + if (containsData) + returnVec.push_back(tempInt); + containsData = false; + tempInt = 0; + size_t totalLOs = compression.header.loSize; + for (size_t i = 0; i < totalLOs; i++) + { + unsigned int currData = compression.vecs.loVec[i] << (8*(i % 4)); + tempInt += currData; + containsData = true; + if ((i+1) % 4 == 0) + { + returnVec.push_back(tempInt); + tempInt = 0; + containsData = false; + } + } + if (containsData) + { + returnVec.push_back(tempInt); + } + return returnVec; +} + +TileHeader readTileHeader(unsigned int *data) +{ + TileHeader header; + header.mode = (CompressionMode)(data[0] & 0xf); + header.tilemapSize = (data[0] >> 4) & 0x3fff; + header.symbolSize = (data[0] >> 18) & 0x3fff; + header.loSize = data[1]; + return header; +} + +bool verifyTileCompression(std::vector compression, std::vector input) +{ + TileHeader header = readTileHeader(compression.data()); + std::vector tileNumbers; + std::vector symVec; + std::vector loVec; + for (size_t i = 2; i < compression.size(); i++) + { + symVec.push_back(compression[i] & 0xffff); + symVec.push_back(compression[i] >> 16); + loVec.push_back(compression[i] & 0xff); + loVec.push_back((compression[i] >> 8) & 0xff); + loVec.push_back((compression[i] >> 16) & 0xff); + loVec.push_back((compression[i] >> 24) & 0xff); + } + size_t loCount = 0; + size_t symIndex = 0; + size_t loStartIndex = header.symbolSize*2 + (header.symbolSize % 2) * 2; + while (loCount < header.loSize) + { + size_t currLength = loVec[loStartIndex + loCount]; + loCount++; + if (currLength & LO_CONTINUE_BIT) + { + currLength -= LO_CONTINUE_BIT; + currLength += loVec[loStartIndex + loCount] << 7; + loCount++; + } + size_t currOffset = loVec[loStartIndex + loCount]; + loCount++; + if (currOffset & LO_CONTINUE_BIT) + { + currOffset -= LO_CONTINUE_BIT; + currOffset += loVec[loStartIndex + loCount] << 7; + loCount++; + } + if (currLength != 0) + { + tileNumbers.push_back(symVec[symIndex]); + symIndex++; + for (size_t i = 0; i < currLength; i++) + { + tileNumbers.push_back(tileNumbers[tileNumbers.size() - currOffset]); + } + } + else + { + for (size_t i = 0; i < currOffset; i++) + { + tileNumbers.push_back(symVec[symIndex]); + symIndex++; + } + } + } + + deltaDecodeTileNums(&tileNumbers); + if (tileNumbers.size() != input.size()) + return false; + std::vector fullVec; + for (size_t i = 0; i < tileNumbers.size(); i++) + fullVec.push_back(tileNumbers[i]); + for (size_t i = 0; i < fullVec.size(); i++) + if (fullVec[i] != input[i]) + return false; + return true; +} diff --git a/tools/compresSmol/compressSmolTiles.h b/tools/compresSmol/compressSmolTiles.h new file mode 100644 index 000000000000..1585baad86ad --- /dev/null +++ b/tools/compresSmol/compressSmolTiles.h @@ -0,0 +1,62 @@ +#include +#include +#include +#include +#include +#include +#include "compressAlgo.h" + +// LO size 1, 964, 11 bits +// LO size 2, 198, 9 bits +// LO size 3, 286, 10 bits +// 4 bits mode +// tilemap size 14 bits +// symbol size 14 bits + +struct VecSizes +{ + size_t tileSize; + size_t flipSize; + size_t palSize; +}; + +struct TileHeader +{ + CompressionMode mode; + unsigned int tilemapSize; + unsigned int symbolSize; + unsigned int loSize; + unsigned int header[2]; +}; + +struct CompressVectors +{ + std::vector loVec; + std::vector symVec; +}; + +struct CompressionResult +{ + size_t tilemapSize; + size_t compressedSize = 0; + CompressVectors vecs; + TileHeader header; + std::vector writeVec; + bool failed = false; +}; + +std::vector readFileAsUS(std::string filePath); + +CompressionResult compressTileset(std::string fileName); +void deltaEncodeTileNums(std::vector *pTileNums); +void deltaDecodeTileNums(std::vector *pTileNums); + +CompressVectors compressVector(std::vector *pVec); +std::vector refineCompression(std::vector *pVec); +std::vector decompressVector(std::vector *pVec); +size_t getTotalSize(std::vector *input); +TileHeader getHeader(CompressionResult compression); +TileHeader readTileHeader(unsigned int *data); +std::vector getWriteVecs(CompressionResult compression); + +bool verifyTileCompression(std::vector compression, std::vector input); diff --git a/tools/compresSmol/fileDispatcher.cpp b/tools/compresSmol/fileDispatcher.cpp new file mode 100644 index 000000000000..099dbad9bbd7 --- /dev/null +++ b/tools/compresSmol/fileDispatcher.cpp @@ -0,0 +1,45 @@ +#include "fileDispatcher.h" + +FileDispatcher::FileDispatcher(std::filesystem::path inPath) +{ + setFilePath(inPath); +} + +void FileDispatcher::setFilePath(std::filesystem::path inPath) +{ + filePath = inPath; +} + +bool FileDispatcher::initFileList() +{ + std::string fileName; + for (const std::filesystem::directory_entry &dirEntry : std::filesystem::recursive_directory_iterator(filePath)) + { + if (dirEntry.is_regular_file()) + { + fileName = dirEntry.path().string(); + if (fileName.find(".4bpp.lz") == std::string::npos) + continue; + } + else + { + continue; + } + fileList.push_back(fileName); + } + + if (fileList.size() == 0) + return false; + else + return true; +} + +std::string FileDispatcher::requestFileName() +{ + if (currentIndex >= fileList.size()) + return ""; + std::string returnString = fileList[currentIndex]; + std::cout << "Dispatching index " << currentIndex << ": " << returnString << "\n"; + currentIndex++; + return returnString; +} diff --git a/tools/compresSmol/fileDispatcher.h b/tools/compresSmol/fileDispatcher.h new file mode 100644 index 000000000000..b9cc549203c2 --- /dev/null +++ b/tools/compresSmol/fileDispatcher.h @@ -0,0 +1,22 @@ +#ifndef FILE_DISPATCHER +#define FILE_DISPATCHER +#include +#include +#include +#include +#include +#include + +class FileDispatcher { + std::vector fileList; + int currentIndex = 0; + std::mutex requestMutex; + std::filesystem::path filePath; +public: + FileDispatcher(); + FileDispatcher(std::filesystem::path inPath); + void setFilePath(std::filesystem::path inPath); + bool initFileList(); + std::string requestFileName(); +}; +#endif diff --git a/tools/compresSmol/mainTiles.cpp b/tools/compresSmol/mainTiles.cpp new file mode 100644 index 000000000000..29626ceae3b7 --- /dev/null +++ b/tools/compresSmol/mainTiles.cpp @@ -0,0 +1,75 @@ +#include +#include +#include +#include +#include +#include "compressSmolTiles.h" + +int main(int argc, char *argv[]) +{ + if (argc == 3) + { + std::string inputName = argv[1]; + std::string outputName = argv[2]; + CompressionResult compression = compressTileset(inputName); + if (compression.failed) + return 1; + std::ofstream fileOut(outputName, std::ios::out | std::ios::binary); + fileOut.write(reinterpret_cast(compression.writeVec.data()), compression.writeVec.size()*4); + fileOut.close(); + return 0; + } + /* + else if (argc == 2) + { + std::filesystem::path filePath = argv[1]; + std::string fileName; + std::vector fileList; + for (const std::filesystem::directory_entry &dirEntry : std::filesystem::recursive_directory_iterator(filePath)) + { + if (dirEntry.is_regular_file()) + { + fileName = dirEntry.path().string(); + if (fileName.find(".bin.lz") == std::string::npos) + continue; + } + else + { + continue; + } + fileList.push_back(fileName); + } + size_t totalSize = 0; + size_t lzSize = 0; + size_t rawSize = 0; + for (std::string fullName : fileList) + { + std::string baseName = fullName; + baseName.pop_back(); + baseName.pop_back(); + baseName.pop_back(); + CompressionResult compressedTilemap = compressTileset(baseName); + size_t currSize = 0; + currSize += compressedTilemap.writeVec.size() * 4; + if (currSize !=0) + { + totalSize += currSize; + lzSize += getFileSize(fullName); + rawSize += getFileSize(baseName); + } + else + { + printf("%s\n", baseName.c_str()); + } + } + printf("Raw size: %zu\n", rawSize); + printf("LZ size: %zu\n", lzSize); + printf("New size: %zu\n", totalSize); + return 0; + } + */ + else + { + return 0; + } +} diff --git a/tools/compresSmol/tANS.cpp b/tools/compresSmol/tANS.cpp new file mode 100644 index 000000000000..36d84cabab46 --- /dev/null +++ b/tools/compresSmol/tANS.cpp @@ -0,0 +1,320 @@ +#include "tANS.h" +#include + +std::vector createDecodingTable(std::vector symbols, std::vector frequencies) +{ + std::vector table(TANS_TABLE_SIZE); + size_t currCol = 0; + for (size_t i = 0; i < 16; i++) + { + for (size_t j = 0; j < frequencies[i]; j++) + { + //printf("%zu %zu\n", table.size(), currCol); + table[currCol].state = TANS_TABLE_SIZE + currCol; + table[currCol].symbol = symbols[i]; + table[currCol].y = frequencies[i] + j; + int currK = 0; + while ((table[currCol].y << currK) < TANS_TABLE_SIZE) + currK++; + table[currCol].k = currK; + currCol++; + } + } + return table; +} + +std::vector createEncodingTable(std::vector decodeTable, std::vector symbols) +{ + std::vector encodeTable(decodeTable.size()); + for (int i = 0; i < decodeTable.size(); i++) + { + encodeTable[i].state = decodeTable.size() + i; + } + std::vector encodeHelpers; + + // Build the encoding helper tables, one per symbol + for (unsigned char symbol : symbols) + { + EncodeHelper newHelper; + newHelper.symbol = symbol; + encodeHelpers.push_back(newHelper); + } + + for (DecodeCol dCol : decodeTable) + { + unsigned char currSymbol = dCol.symbol; + int symbolIndex = 0; + while (encodeHelpers[symbolIndex].symbol != currSymbol) + { + symbolIndex++; + } + encodeHelpers[symbolIndex].states.push_back(dCol.state); + encodeHelpers[symbolIndex].yVals.push_back(dCol.y); + encodeHelpers[symbolIndex].kVals.push_back(dCol.k); + encodeHelpers[symbolIndex].yPrimVals.push_back(dCol.y << dCol.k); + } + // Build the encoding table, one column per state in decoding table + for (int helperNum = 0; helperNum < encodeHelpers.size(); helperNum++) + { + for (int i = 0; i < encodeHelpers[helperNum].states.size(); i++) + { + EncodeSymbolData currSymbol; + currSymbol.symbol = encodeHelpers[helperNum].symbol; + currSymbol.streamValue = 0; + currSymbol.numBits = encodeHelpers[helperNum].kVals[i]; + currSymbol.nextState = encodeHelpers[helperNum].states[i]; + int currIndex = encodeHelpers[helperNum].yPrimVals[i]-encodeTable.size(); + encodeTable[currIndex].symbols.push_back(currSymbol); + int limit = std::pow(2, currSymbol.numBits); + for (int j = 1; j < limit; j++) + { + currSymbol.streamValue++; + encodeTable[currIndex + j].symbols.push_back(currSymbol); + } + } + } + + return encodeTable; +} + +EncodedData encodeData(std::vector input, std::vector encodingTable) +{ + EncodedData data; + int state; + // Reverse the input, since ANS operates in FILO mode + std::vector reverseInput(input.size()); + for (int i = 0; i < input.size(); i++) + { + reverseInput[input.size() - 1 - i] = input[i]; + } + // Encode the string + int currentOffsetState = 0; + for (int i = 0; i < reverseInput.size(); i++) + { + unsigned char currChar = reverseInput[i]; + // Find correct encoding instruction for the symbol + for (EncodeSymbolData eSymbols : encodingTable[currentOffsetState].symbols) + { + if (eSymbols.symbol == currChar) + { + // Encode the symbol + state = eSymbols.nextState; + if (i == 0) + break; + int streamValue = eSymbols.streamValue; + int compVal = 1; + for (int numBit = eSymbols.numBits-1; numBit >= 0; numBit--) + { + unsigned char currBit = (streamValue >> numBit) & compVal; + data.bitStream.push_back(currBit); + } + break; + } + } + currentOffsetState = state - encodingTable.size(); + } + data.initialState = state; + + return data; +} + +int encodeSingleSymbol(EncodeCol currEncodeCol, unsigned char symbol, std::vector *bitstream) +{ + int newState; + for (EncodeSymbolData eSymbols : currEncodeCol.symbols) + { + if (eSymbols.symbol == symbol) + { + newState = eSymbols.nextState; + int streamValue = eSymbols.streamValue; + int compVal = 1; + for (int numBit = eSymbols.numBits-1; numBit >= 0; numBit--) + { + unsigned char currBit = (streamValue >> numBit) & compVal; + bitstream->push_back(currBit); + } + break; + } + } + return newState; +} + +std::vector decodeData(EncodedData *data, std::vector decodeTable, int numChars) +{ + unsigned int tableSize = decodeTable.size(); + unsigned int state = data->initialState; + std::vector returnVec(numChars); + returnVec[0] = decodeTable[state-tableSize].symbol; + for (int i = 1; i < numChars; i++) + { + unsigned int currY = decodeTable[state-tableSize].y; + unsigned int currK = decodeTable[state-tableSize].k; + unsigned int streamValue = 0; + // Horrible way of reading a value from the bitstream + for (int j = 0; j < currK; j++) + { + unsigned int tempVal; + bool val = data->bitStream.back(); + data->bitStream.pop_back(); + if (val) + tempVal = 1; + else + tempVal = 0; + streamValue += (tempVal << j); + } + // Calculate the next state and retrieve the symbol for that state + state = (currY << currK) + streamValue; + returnVec[i] = decodeTable[state-tableSize].symbol; + } + data->initialState = state; + return returnVec; +} + +std::vector normalizeCounts(std::vector counts, int tableSize) +{ + return normalizeCounts(counts, tableSize, false); +} +std::vector normalizeCounts(std::vector counts, int tableSize, bool fillZeros) +{ + int totalCount = 0; + for (int count : counts) + { + totalCount += count; + } + if (totalCount < tableSize) + { + for (int i = 0; i < counts.size(); i++) + { + counts[i] *= (int)ceil((float)tableSize/(float)totalCount); + } + } + if (fillZeros) + for (int i = 0; i < counts.size(); i++) + if (counts[i] == 0) + counts[i] = 1; + + totalCount = 0; + for (int count : counts) + { + totalCount += count; + } + + bool shouldContinue = true; + std::vector normCounts(counts.size()); + while (shouldContinue) + { + int smallestCount; + int smallestIndex; + int firstIndex; + int largestCount = 0; + for (int i = 0; i < counts.size(); i++) + { + if (counts[i] != 0) + { + firstIndex = i; + smallestIndex = i; + smallestCount = counts[i]; + break; + } + } + for (int i = firstIndex; i < counts.size(); i++) + { + if (counts[i] < smallestCount && counts[i] != 0) + { + smallestCount = counts[i]; + smallestIndex = i; + } + if (counts[i] > largestCount) + { + largestCount = counts[i]; + } + } + if (largestCount == 0) + { + shouldContinue = false; + } + else + { + float frac = float(smallestCount)/float(totalCount); + int newCount = std::round(frac*float(tableSize)); + if (newCount == 0 and counts[smallestIndex] != 0) + { + newCount = 1; + } + normCounts[smallestIndex] = newCount; + tableSize -= newCount; + totalCount -= smallestCount; + counts[smallestIndex] = 0; + } + } + return normCounts; +} + +void printEncodeTable(std::vector encodeTable, std::vector symbols) +{ + printf(" x: "); + for (int i = 0; i < encodeTable.size(); i++) + { + printf("%3zu ", i+encodeTable.size()); + } + printf("\n"); + for (int i = 0; i < symbols.size(); i++) + { + printf("%3hhu s: ", symbols[i]); + for (int k = 0; k < encodeTable.size(); k++) + { + printf("%3i ", encodeTable[k].symbols[i].nextState); + } + printf("\n"); + printf("%3hhu b: ", symbols[i]); + for (int k = 0; k < encodeTable.size(); k++) + { + printf("%3i ", encodeTable[k].symbols[i].streamValue); + } + printf("\n"); + printf("%3hhu k: ", symbols[i]); + for (int k = 0; k < encodeTable.size(); k++) + { + printf("%3i ", encodeTable[k].symbols[i].numBits); + } + printf("\n"); + } +} + +void printDecodeTable(std::vector decodeTable) +{ + printf("State: "); + for (DecodeCol currCol : decodeTable) + printf("%3i ", currCol.state); + printf("\n"); + printf(" Sym: "); + for (DecodeCol currCol : decodeTable) + printf("%3hhu ", currCol.symbol); + printf("\n"); + printf(" Y: "); + for (DecodeCol currCol : decodeTable) + printf("%3i ", currCol.y); + printf("\n"); + printf(" K: "); + for (DecodeCol currCol : decodeTable) + printf("%3i ", currCol.k); + printf("\n"); +} + +int getFileSize(std::string filePath) +{ + std::ifstream iStream; + iStream.open(filePath.c_str(), std::ios::binary); + if (!iStream.is_open()) + { + fprintf(stderr, "Error: Couldn't open %s for reading file size\n", filePath.c_str()); + return 0; + } + iStream.ignore( std::numeric_limits::max() ); + std::streamsize size = iStream.gcount(); + int returnSize = size; + iStream.clear(); + iStream.seekg( 0, std::ios_base::beg ); + iStream.close(); + return returnSize; +} diff --git a/tools/compresSmol/tANS.h b/tools/compresSmol/tANS.h new file mode 100644 index 000000000000..a85e068098c1 --- /dev/null +++ b/tools/compresSmol/tANS.h @@ -0,0 +1,63 @@ +#ifndef TANS_H +#define TANS_H +#include +#include +#include +#include +#include +#include +#include +#include + +#define TANS_TABLE_SIZE 64 + +struct DecodeCol { + int state; + unsigned char symbol; + int y; + int k; +}; + +struct EncodeHelper { + unsigned char symbol; + std::vector states; + std::vector yVals; + std::vector kVals; + std::vector yPrimVals; + int currentRepeat = 0; + int currentIndex = 0; +}; + +struct EncodeSymbolData { + unsigned char symbol; + int nextState; + int streamValue; + int numBits; +}; +struct EncodeCol { + int state; + std::vector symbols; +}; + +struct EncodedData { + int initialState; + std::vector bitStream; +}; + +std::vector createDecodingTable(std::vector symbols, std::vector frequencies); + +std::vector createEncodingTable(std::vector decodeTable, std::vector symbols); + +EncodedData encodeData(std::vector input, std::vector encodingTable); +std::vector decodeData(EncodedData *data, std::vector decodeTable, int numChars); + +std::vector normalizeCounts(std::vector counts, int tableSize); +std::vector normalizeCounts(std::vector counts, int tableSize, bool fillZeros); + +void printEncodeTable(std::vector encodeTable, std::vector symbols); +void printDecodeTable(std::vector decodeTable); + +int getFileSize(std::string filePath); +int encodeSingleSymbol(EncodeCol currEncodeCol, unsigned char symbol, std::vector *bitstream); + +#endif diff --git a/tools/gbagfx/main.c b/tools/gbagfx/main.c index bb1691c59a2e..6502b87d6be7 100644 --- a/tools/gbagfx/main.c +++ b/tools/gbagfx/main.c @@ -333,6 +333,9 @@ void HandleJascToGbaPaletteCommand(char *inputPath, char *outputPath, int argc, if (numColors < 1) FATAL_ERROR("Number of colors must be positive.\n"); + + if (numColors > 255) + FATAL_ERROR("Number of colors must be less than 256.\n"); } else { diff --git a/tools/learnset_helpers/make_teachables.py b/tools/learnset_helpers/make_teachables.py index 6f3b186b686f..a0e94124f79a 100644 --- a/tools/learnset_helpers/make_teachables.py +++ b/tools/learnset_helpers/make_teachables.py @@ -150,6 +150,7 @@ def create_tutor_moves_array(tutors: list[str]) -> None: header = dedent("""\ // DO NOT MODIFY THIS FILE! It is auto-generated by tools/learnset_helpers/make_teachables.py // Set the config P_TUTOR_MOVES_ARRAY in include/config/pokemon.h to TRUE to enable this array! + // Also need by tutor moves relearner! const u16 gTutorMoves[] = { """) diff --git a/tools/learnset_helpers/porymoves_files/sv.json b/tools/learnset_helpers/porymoves_files/sv.json index b6f43b8d0792..f4fd675c34bb 100644 --- a/tools/learnset_helpers/porymoves_files/sv.json +++ b/tools/learnset_helpers/porymoves_files/sv.json @@ -208,7 +208,12 @@ "MOVE_DOUBLE_EDGE", "MOVE_CURSE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_CURSE", + "MOVE_INGRAIN", + "MOVE_PETAL_DANCE", + "MOVE_TOXIC" + ], "TutorMoves": [] }, "VENUSAUR": { @@ -331,7 +336,12 @@ "MOVE_PETAL_BLIZZARD", "MOVE_CURSE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_CURSE", + "MOVE_INGRAIN", + "MOVE_PETAL_DANCE", + "MOVE_TOXIC" + ], "TutorMoves": [] }, "CHARMANDER": { @@ -901,7 +911,17 @@ "MOVE_WHIRLPOOL", "MOVE_MUDDY_WATER" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", + "MOVE_FAKE_OUT", + "MOVE_FLAIL", + "MOVE_LIFE_DEW", + "MOVE_MIRROR_COAT", + "MOVE_MIST", + "MOVE_WATER_SPOUT", + "MOVE_YAWN" + ], "TutorMoves": [] }, "BLASTOISE": { @@ -1023,7 +1043,17 @@ "MOVE_WHIRLPOOL", "MOVE_MUDDY_WATER" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", + "MOVE_FAKE_OUT", + "MOVE_FLAIL", + "MOVE_LIFE_DEW", + "MOVE_MIRROR_COAT", + "MOVE_MIST", + "MOVE_WATER_SPOUT", + "MOVE_YAWN" + ], "TutorMoves": [] }, "CATERPIE": { @@ -3203,7 +3233,17 @@ "MOVE_GRASSY_GLIDE", "MOVE_PETAL_BLIZZARD" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_AFTER_YOU", + "MOVE_FLAIL", + "MOVE_INGRAIN", + "MOVE_LEECH_SEED", + "MOVE_RAZOR_LEAF", + "MOVE_STRENGTH_SAP", + "MOVE_SYNTHESIS", + "MOVE_TEETER_DANCE", + "MOVE_TICKLE" + ], "TutorMoves": [] }, "VILEPLUME": { @@ -3308,7 +3348,17 @@ "MOVE_PETAL_BLIZZARD", "MOVE_SLUDGE_WAVE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_AFTER_YOU", + "MOVE_FLAIL", + "MOVE_INGRAIN", + "MOVE_LEECH_SEED", + "MOVE_RAZOR_LEAF", + "MOVE_STRENGTH_SAP", + "MOVE_SYNTHESIS", + "MOVE_TEETER_DANCE", + "MOVE_TICKLE" + ], "TutorMoves": [] }, "PARAS": { @@ -3880,7 +3930,6 @@ "MOVE_NASTY_PLOT", "MOVE_THUNDER", "MOVE_TERA_BLAST", - "MOVE_SAND_TOMB", "MOVE_SPITE", "MOVE_KNOCK_OFF", "MOVE_LASH_OUT", @@ -5761,7 +5810,17 @@ "MOVE_SKITTER_SMACK", "MOVE_THROAT_CHOP" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_ACUPRESSURE", + "MOVE_AQUA_RING", + "MOVE_AURORA_BEAM", + "MOVE_CONFUSE_RAY", + "MOVE_HAZE", + "MOVE_KNOCK_OFF", + "MOVE_MIRROR_COAT", + "MOVE_RAPID_SPIN", + "MOVE_TICKLE" + ], "TutorMoves": [] }, "GEODUDE": { @@ -6846,7 +6905,12 @@ "MOVE_FEATHER_DANCE", "MOVE_THROAT_CHOP" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_ASSURANCE", + "MOVE_FLAIL", + "MOVE_SKY_ATTACK", + "MOVE_WHIRLWIND" + ], "TutorMoves": [] }, "SEEL": { @@ -7094,7 +7158,18 @@ "MOVE_CURSE", "MOVE_ALLURING_VOICE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_BELCH", + "MOVE_DISABLE", + "MOVE_ENTRAINMENT", + "MOVE_FAKE_OUT", + "MOVE_HORN_DRILL", + "MOVE_LICK", + "MOVE_PERISH_SONG", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_SWALLOW" + ], "TutorMoves": [] }, "GRIMER": { @@ -8764,7 +8839,16 @@ "MOVE_CURSE", "MOVE_PSYCHIC_NOISE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_BLOCK", + "MOVE_CURSE", + "MOVE_INGRAIN", + "MOVE_MOONLIGHT", + "MOVE_POISON_POWDER", + "MOVE_SLEEP_POWDER", + "MOVE_STUN_SPORE" + ], "TutorMoves": [] }, "CUBONE": { @@ -8905,7 +8989,15 @@ "MOVE_THROAT_CHOP", "MOVE_UPPER_HAND" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_BULLET_PUNCH", + "MOVE_COUNTER", + "MOVE_FEINT", + "MOVE_HIGH_JUMP_KICK", + "MOVE_MACH_PUNCH", + "MOVE_RAPID_SPIN", + "MOVE_VACUUM_WAVE" + ], "TutorMoves": [] }, "HITMONCHAN": { @@ -9043,7 +9135,15 @@ "MOVE_THROAT_CHOP", "MOVE_UPPER_HAND" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_BULLET_PUNCH", + "MOVE_COUNTER", + "MOVE_FEINT", + "MOVE_HIGH_JUMP_KICK", + "MOVE_MACH_PUNCH", + "MOVE_RAPID_SPIN", + "MOVE_VACUUM_WAVE" + ], "TutorMoves": [] }, "LICKITUNG": { @@ -9549,7 +9649,14 @@ "MOVE_BREAKING_SWIPE", "MOVE_CURSE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DRAGON_RUSH", + "MOVE_GUARD_SPLIT", + "MOVE_METAL_BURST", + "MOVE_ROCK_POLISH" + ], "TutorMoves": [] }, "CHANSEY": { @@ -9906,7 +10013,13 @@ "MOVE_WHIRLPOOL", "MOVE_MUDDY_WATER" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_AURORA_BEAM", + "MOVE_CLEAR_SMOG", + "MOVE_DISABLE", + "MOVE_FLAIL", + "MOVE_SPLASH" + ], "TutorMoves": [] }, "GOLDEEN": { @@ -10170,7 +10283,14 @@ "MOVE_ELECTROWEB", "MOVE_METAL_SOUND" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_CROSS_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_FEINT", + "MOVE_FOCUS_PUNCH", + "MOVE_FOLLOW_ME", + "MOVE_HAMMER_ARM" + ], "TutorMoves": [] }, "MAGMAR": { @@ -10285,7 +10405,15 @@ "MOVE_SCORCHING_SANDS", "MOVE_CURSE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_BELCH", + "MOVE_BELLY_DRUM", + "MOVE_CROSS_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_FOCUS_PUNCH", + "MOVE_FOLLOW_ME", + "MOVE_MACH_PUNCH" + ], "TutorMoves": [] }, "PINSIR": { @@ -13002,7 +13130,14 @@ "MOVE_DOUBLE_EDGE", "MOVE_CURSE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_COUNTER", + "MOVE_FLAIL", + "MOVE_HEAL_PULSE", + "MOVE_INGRAIN", + "MOVE_VINE_WHIP" + ], "TutorMoves": [] }, "MEGANIUM": { @@ -13122,7 +13257,14 @@ "MOVE_PETAL_BLIZZARD", "MOVE_CURSE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_COUNTER", + "MOVE_FLAIL", + "MOVE_HEAL_PULSE", + "MOVE_INGRAIN", + "MOVE_VINE_WHIP" + ], "TutorMoves": [] }, "CYNDAQUIL": { @@ -13726,7 +13868,13 @@ "MOVE_BREAKING_SWIPE", "MOVE_CURSE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_JET", + "MOVE_BLOCK", + "MOVE_COUNTER", + "MOVE_FLATTER" + ], "TutorMoves": [] }, "FERALIGATR": { @@ -13862,7 +14010,13 @@ "MOVE_BREAKING_SWIPE", "MOVE_CURSE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_JET", + "MOVE_BLOCK", + "MOVE_COUNTER", + "MOVE_FLATTER" + ], "TutorMoves": [] }, "SENTRET": { @@ -14857,7 +15011,13 @@ "MOVE_ELECTROWEB", "MOVE_CURSE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_MIST", + "MOVE_PSYBEAM", + "MOVE_SOAK", + "MOVE_SUCKER_PUNCH", + "MOVE_WATER_PULSE" + ], "TutorMoves": [] }, "PICHU": { @@ -15641,7 +15801,17 @@ "MOVE_PETAL_BLIZZARD", "MOVE_TRIPLE_AXEL" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_AFTER_YOU", + "MOVE_FLAIL", + "MOVE_INGRAIN", + "MOVE_LEECH_SEED", + "MOVE_RAZOR_LEAF", + "MOVE_STRENGTH_SAP", + "MOVE_SYNTHESIS", + "MOVE_TEETER_DANCE", + "MOVE_TICKLE" + ], "TutorMoves": [] }, "MARILL": { @@ -19016,7 +19186,13 @@ "MOVE_TEMPER_FLARE", "MOVE_CURSE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_COUNTER", + "MOVE_MIMIC", + "MOVE_PRESENT", + "MOVE_RETALIATE", + "MOVE_SNORE" + ], "TutorMoves": [] }, "QWILFISH": { @@ -20901,7 +21077,13 @@ "MOVE_MUDDY_WATER", "MOVE_BREAKING_SWIPE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_AURORA_BEAM", + "MOVE_CLEAR_SMOG", + "MOVE_DISABLE", + "MOVE_FLAIL", + "MOVE_SPLASH" + ], "TutorMoves": [] }, "PHANPY": { @@ -21573,7 +21755,15 @@ "MOVE_COACHING", "MOVE_UPPER_HAND" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_BULLET_PUNCH", + "MOVE_COUNTER", + "MOVE_FEINT", + "MOVE_HIGH_JUMP_KICK", + "MOVE_MACH_PUNCH", + "MOVE_RAPID_SPIN", + "MOVE_VACUUM_WAVE" + ], "TutorMoves": [] }, "SMOOCHUM": { @@ -23304,7 +23494,16 @@ "MOVE_BREAKING_SWIPE", "MOVE_UPPER_HAND" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_ABSORB", + "MOVE_DOUBLE_KICK", + "MOVE_DRAGON_BREATH", + "MOVE_LEECH_SEED", + "MOVE_NIGHT_SLASH", + "MOVE_SLASH", + "MOVE_SYNTHESIS", + "MOVE_WORRY_SEED" + ], "TutorMoves": [] }, "SCEPTILE": { @@ -23456,7 +23655,16 @@ "MOVE_DRAGON_CHEER", "MOVE_UPPER_HAND" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_ABSORB", + "MOVE_DOUBLE_KICK", + "MOVE_DRAGON_BREATH", + "MOVE_LEECH_SEED", + "MOVE_NIGHT_SLASH", + "MOVE_SLASH", + "MOVE_SYNTHESIS", + "MOVE_WORRY_SEED" + ], "TutorMoves": [] }, "TORCHIC": { @@ -23698,7 +23906,14 @@ "MOVE_FEATHER_DANCE", "MOVE_CURSE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_COUNTER", + "MOVE_CRUSH_CLAW", + "MOVE_FEINT", + "MOVE_LAST_RESORT", + "MOVE_NIGHT_SLASH", + "MOVE_PECK" + ], "TutorMoves": [] }, "BLAZIKEN": { @@ -23853,7 +24068,14 @@ "MOVE_CURSE", "MOVE_UPPER_HAND" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_COUNTER", + "MOVE_CRUSH_CLAW", + "MOVE_FEINT", + "MOVE_LAST_RESORT", + "MOVE_NIGHT_SLASH", + "MOVE_PECK" + ], "TutorMoves": [] }, "MUDKIP": { @@ -24090,7 +24312,19 @@ "MOVE_SLUDGE_WAVE", "MOVE_CURSE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_BITE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_MIRROR_COAT", + "MOVE_MUD_SLAP", + "MOVE_SLUDGE", + "MOVE_STOMP", + "MOVE_WIDE_GUARD", + "MOVE_YAWN" + ], "TutorMoves": [] }, "SWAMPERT": { @@ -24238,7 +24472,19 @@ "MOVE_CURSE", "MOVE_HARD_PRESS" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_BITE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_MIRROR_COAT", + "MOVE_MUD_SLAP", + "MOVE_SLUDGE", + "MOVE_STOMP", + "MOVE_WIDE_GUARD", + "MOVE_YAWN" + ], "TutorMoves": [] }, "POOCHYENA": { @@ -27938,6 +28184,10 @@ }, "PLUSLE": { "LevelMoves": [ + { + "Level": 1, + "Move": "MOVE_NUZZLE" + }, { "Level": 1, "Move": "MOVE_QUICK_ATTACK" @@ -28067,6 +28317,10 @@ }, "MINUN": { "LevelMoves": [ + { + "Level": 1, + "Move": "MOVE_NUZZLE" + }, { "Level": 1, "Move": "MOVE_QUICK_ATTACK" @@ -29650,7 +29904,15 @@ "MOVE_SCORCHING_SANDS", "MOVE_THROAT_CHOP" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_BUG_BITE", + "MOVE_FEINT", + "MOVE_FIRST_IMPRESSION", + "MOVE_FLAIL", + "MOVE_FURY_CUTTER", + "MOVE_GUST", + "MOVE_QUICK_ATTACK" + ], "TutorMoves": [] }, "FLYGON": { @@ -29817,7 +30079,15 @@ "MOVE_ALLURING_VOICE", "MOVE_PSYCHIC_NOISE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_BUG_BITE", + "MOVE_FEINT", + "MOVE_FIRST_IMPRESSION", + "MOVE_FLAIL", + "MOVE_FURY_CUTTER", + "MOVE_GUST", + "MOVE_QUICK_ATTACK" + ], "TutorMoves": [] }, "CACNEA": { @@ -30092,7 +30362,16 @@ "MOVE_THROAT_CHOP", "MOVE_CURSE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_ACID", + "MOVE_BELCH", + "MOVE_BLOCK", + "MOVE_COUNTER", + "MOVE_DISABLE", + "MOVE_FELL_STINGER", + "MOVE_SWITCHEROO", + "MOVE_TEETER_DANCE" + ], "TutorMoves": [] }, "SWABLU": { @@ -36598,7 +36877,12 @@ "MOVE_CURSE", "MOVE_DRAGON_CHEER" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_HAMMER_ARM", + "MOVE_STOMP", + "MOVE_THRASH", + "MOVE_WHIRLWIND" + ], "TutorMoves": [] }, "SHIELDON": { @@ -36828,7 +37112,14 @@ "MOVE_CURSE", "MOVE_HARD_PRESS" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_COUNTER", + "MOVE_FISSURE", + "MOVE_FOCUS_ENERGY", + "MOVE_GUARD_SPLIT", + "MOVE_HEADBUTT", + "MOVE_SCREECH" + ], "TutorMoves": [] }, "BURMY": { @@ -39739,8 +40030,7 @@ "MOVE_CROSS_CHOP", "MOVE_DETECT", "MOVE_HI_JUMP_KICK", - "MOVE_HOWL", - "MOVE_HIGH_JUMP_KICK" + "MOVE_HOWL" ], "TutorMoves": [] }, @@ -41332,7 +41622,14 @@ "MOVE_BREAKING_SWIPE", "MOVE_CURSE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DRAGON_RUSH", + "MOVE_GUARD_SPLIT", + "MOVE_METAL_BURST", + "MOVE_ROCK_POLISH" + ], "TutorMoves": [] }, "TANGROWTH": { @@ -41463,7 +41760,14 @@ "MOVE_ELECTROWEB", "MOVE_METAL_SOUND" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_CROSS_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_FEINT", + "MOVE_FOCUS_PUNCH", + "MOVE_FOLLOW_ME", + "MOVE_HAMMER_ARM" + ], "TutorMoves": [] }, "MAGMORTAR": { @@ -41587,7 +41891,15 @@ "MOVE_SCORCHING_SANDS", "MOVE_CURSE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_BELCH", + "MOVE_BELLY_DRUM", + "MOVE_CROSS_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_FOCUS_PUNCH", + "MOVE_FOLLOW_ME", + "MOVE_MACH_PUNCH" + ], "TutorMoves": [] }, "TOGEKISS": { @@ -45225,7 +45537,15 @@ "MOVE_DOUBLE_EDGE", "MOVE_PETAL_BLIZZARD" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_GLARE", + "MOVE_IRON_TAIL", + "MOVE_MEAN_LOOK", + "MOVE_MIRROR_COAT", + "MOVE_SWEET_SCENT", + "MOVE_SYNTHESIS", + "MOVE_TWISTER" + ], "TutorMoves": [] }, "SERPERIOR": { @@ -45332,7 +45652,15 @@ "MOVE_PETAL_BLIZZARD", "MOVE_BREAKING_SWIPE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_GLARE", + "MOVE_IRON_TAIL", + "MOVE_MEAN_LOOK", + "MOVE_MIRROR_COAT", + "MOVE_SWEET_SCENT", + "MOVE_SYNTHESIS", + "MOVE_TWISTER" + ], "TutorMoves": [] }, "TEPIG": { @@ -45576,7 +45904,12 @@ "MOVE_COACHING", "MOVE_CURSE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_SUCKER_PUNCH", + "MOVE_SUPERPOWER", + "MOVE_THRASH", + "MOVE_YAWN" + ], "TutorMoves": [] }, "EMBOAR": { @@ -45720,7 +46053,12 @@ "MOVE_CURSE", "MOVE_HARD_PRESS" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_SUCKER_PUNCH", + "MOVE_SUPERPOWER", + "MOVE_THRASH", + "MOVE_YAWN" + ], "TutorMoves": [] }, "OSHAWOTT": { @@ -46408,7 +46746,12 @@ "MOVE_SUPERCELL_SLAM", "MOVE_ELECTROWEB" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_DOUBLE_KICK", + "MOVE_FEINT", + "MOVE_SAND_ATTACK", + "MOVE_SCREECH" + ], "TutorMoves": [] }, "ROGGENROLA": { @@ -46664,7 +47007,10 @@ "MOVE_METAL_SOUND", "MOVE_CURSE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_METAL_SOUND", + "MOVE_SLASH" + ], "TutorMoves": [] }, "AUDINO": { @@ -47592,7 +47938,13 @@ "MOVE_GRASSY_GLIDE", "MOVE_ENDEAVOR" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_BEAT_UP", + "MOVE_MEMENTO", + "MOVE_SWITCHEROO", + "MOVE_TICKLE", + "MOVE_WORRY_SEED" + ], "TutorMoves": [] }, "PETILIL": { @@ -48628,7 +48980,12 @@ "MOVE_CURSE", "MOVE_UPPER_HAND" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_COUNTER", + "MOVE_DETECT", + "MOVE_FAKE_OUT", + "MOVE_QUICK_GUARD" + ], "TutorMoves": [] }, "SIGILYPH": { @@ -49172,7 +49529,13 @@ "MOVE_TRIPLE_AXEL", "MOVE_ALLURING_VOICE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_AQUA_TAIL", + "MOVE_FLAIL", + "MOVE_KNOCK_OFF", + "MOVE_TAIL_WHIP", + "MOVE_TIDY_UP" + ], "TutorMoves": [] }, "GOTHITA": { @@ -49746,7 +50109,11 @@ "MOVE_FUTURE_SIGHT", "MOVE_EXPANDING_FORCE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_ACID_ARMOR", + "MOVE_ASTONISH", + "MOVE_CONFUSE_RAY" + ], "TutorMoves": [] }, "REUNICLUS": { @@ -49875,7 +50242,11 @@ "MOVE_EXPANDING_FORCE", "MOVE_PSYCHIC_NOISE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_ACID_ARMOR", + "MOVE_ASTONISH", + "MOVE_CONFUSE_RAY" + ], "TutorMoves": [] }, "DUCKLETT": { @@ -50878,7 +51249,13 @@ "MOVE_SKITTER_SMACK", "MOVE_THROAT_CHOP" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_DOUBLE_TEAM", + "MOVE_INFESTATION", + "MOVE_LUNGE", + "MOVE_POISON_STING", + "MOVE_STRUGGLE_BUG" + ], "TutorMoves": [] }, "FERROSEED": { @@ -58260,7 +58637,10 @@ "MOVE_ALLURING_VOICE", "MOVE_PSYCHIC_NOISE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_TICKLE", + "MOVE_YAWN" + ], "TutorMoves": [] }, "HONEDGE": { @@ -58546,7 +58926,11 @@ "MOVE_THROAT_CHOP", "MOVE_PSYCHIC_NOISE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_ACUPRESSURE", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE" + ], "TutorMoves": [] }, "BINACLE": { @@ -60731,7 +61115,8 @@ ], "EggMoves": [ "MOVE_DEFOG", - "MOVE_DRAGON_RUSH" + "MOVE_DRAGON_RUSH", + "MOVE_SWITCHEROO" ], "TutorMoves": [] }, @@ -61732,7 +62117,11 @@ "MOVE_ENDEAVOR", "MOVE_TEMPER_FLARE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_FAKE_OUT", + "MOVE_PARTING_SHOT", + "MOVE_POWER_TRIP" + ], "TutorMoves": [] }, "INCINEROAR": { @@ -61879,7 +62268,11 @@ "MOVE_SCORCHING_SANDS", "MOVE_THROAT_CHOP" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_FAKE_OUT", + "MOVE_PARTING_SHOT", + "MOVE_POWER_TRIP" + ], "TutorMoves": [] }, "POPPLIO": { @@ -62080,7 +62473,11 @@ "MOVE_WHIRLPOOL", "MOVE_TRIPLE_AXEL" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_AQUA_RING", + "MOVE_LIFE_DEW", + "MOVE_PERISH_SONG" + ], "TutorMoves": [] }, "PRIMARINA": { @@ -62202,7 +62599,11 @@ "MOVE_ALLURING_VOICE", "MOVE_PSYCHIC_NOISE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_AQUA_RING", + "MOVE_LIFE_DEW", + "MOVE_PERISH_SONG" + ], "TutorMoves": [] }, "PIKIPEK": { @@ -62398,7 +62799,11 @@ "MOVE_ENDEAVOR", "MOVE_FEATHER_DANCE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_BOOMBURST", + "MOVE_GUNK_SHOT", + "MOVE_SKY_ATTACK" + ], "TutorMoves": [] }, "TOUCANNON": { @@ -62512,7 +62917,11 @@ "MOVE_FEATHER_DANCE", "MOVE_THROAT_CHOP" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_BOOMBURST", + "MOVE_GUNK_SHOT", + "MOVE_SKY_ATTACK" + ], "TutorMoves": [] }, "YUNGOOS": { @@ -63845,6 +64254,7 @@ "EggMoves": [ "MOVE_ENDEAVOR", "MOVE_LAST_RESORT", + "MOVE_SUCKER_PUNCH", "MOVE_THRASH" ], "TutorMoves": [] @@ -64464,7 +64874,12 @@ "MOVE_ENDEAVOR", "MOVE_SKITTER_SMACK" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_POWER_SPLIT", + "MOVE_SPIT_UP", + "MOVE_STICKY_WEB", + "MOVE_STOCKPILE" + ], "TutorMoves": [] }, "FOMANTIS": { @@ -64664,6 +65079,7 @@ ], "EggMoves": [ "MOVE_DEFOG", + "MOVE_SUPERPOWER", "MOVE_WORRY_SEED" ], "TutorMoves": [] @@ -67859,8 +68275,7 @@ "MOVE_HI_JUMP_KICK", "MOVE_SAND_ATTACK", "MOVE_SUCKER_PUNCH", - "MOVE_SUPER_FANG", - "MOVE_HIGH_JUMP_KICK" + "MOVE_SUPER_FANG" ], "TutorMoves": [] }, @@ -69922,6 +70337,10 @@ }, "CRAMORANT": { "LevelMoves": [ + { + "Level": 1, + "Move": "MOVE_BELCH" + }, { "Level": 1, "Move": "MOVE_PECK" @@ -71591,7 +72010,10 @@ "MOVE_ENDEAVOR", "MOVE_ALLURING_VOICE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_BABY_DOLL_EYES", + "MOVE_LAST_RESORT" + ], "TutorMoves": [] }, "FALINKS": { @@ -88260,7 +88682,11 @@ "MOVE_HARD_PRESS", "MOVE_DRAGON_CHEER" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_MIRROR_COAT", + "MOVE_NIGHT_SLASH", + "MOVE_SLASH" + ], "TutorMoves": [] }, "HYDRAPPLE": { @@ -88388,7 +88814,12 @@ "MOVE_CURSE", "MOVE_DRAGON_CHEER" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_DEFENSE_CURL", + "MOVE_RECYCLE", + "MOVE_ROLLOUT", + "MOVE_SUCKER_PUNCH" + ], "TutorMoves": [] }, "GOUGING_FIRE": { @@ -96509,7 +96940,10 @@ "MOVE_ALLURING_VOICE", "MOVE_PSYCHIC_NOISE" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_TICKLE", + "MOVE_YAWN" + ], "TutorMoves": [] }, "HOOPA_UNBOUND": { @@ -96779,6 +97213,7 @@ "EggMoves": [ "MOVE_ENDEAVOR", "MOVE_LAST_RESORT", + "MOVE_SUCKER_PUNCH", "MOVE_THRASH" ], "TutorMoves": [] @@ -96928,7 +97363,12 @@ "MOVE_ENDEAVOR", "MOVE_THROAT_CHOP" ], - "EggMoves": [], + "EggMoves": [ + "MOVE_ENDEAVOR", + "MOVE_LAST_RESORT", + "MOVE_SUCKER_PUNCH", + "MOVE_THRASH" + ], "TutorMoves": [] }, "TOXTRICITY_LOW_KEY": { @@ -98005,8 +98445,54 @@ } ], "PreEvoMoves": [], - "TMMoves": [], - "EggMoves": [], + "TMMoves": [ + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CHILLING_WATER", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_GIGA_IMPACT", + "MOVE_HELPING_HAND", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_HEAD", + "MOVE_LASH_OUT", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_ZEN_HEADBUTT" + ], + "EggMoves": [ + "MOVE_ENDEAVOR", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STUFF_CHEEKS", + "MOVE_SWALLOW" + ], "TutorMoves": [] } } \ No newline at end of file diff --git a/tools/learnset_helpers/porymoves_files/za.json b/tools/learnset_helpers/porymoves_files/za.json new file mode 100644 index 000000000000..cda070084f1e --- /dev/null +++ b/tools/learnset_helpers/porymoves_files/za.json @@ -0,0 +1,19086 @@ +{ + "BULBASAUR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "3", + "Move": "MOVE_VINE_WHIP" + }, + { + "Level": "6", + "Move": "MOVE_GROWTH" + }, + { + "Level": "9", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "12", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "15", + "Move": "MOVE_POISON_POWDER" + }, + { + "Level": "15", + "Move": "MOVE_SLEEP_POWDER" + }, + { + "Level": "25", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "30", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "35", + "Move": "MOVE_SYNTHESIS" + }, + { + "Level": "40", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "42", + "Move": "MOVE_SLUDGE_WAVE" + }, + { + "Level": "45", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "55", + "Move": "MOVE_SOLAR_BEAM" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_GIGA_DRAIN", + "MOVE_LIGHT_SCREEN", + "MOVE_PROTECT", + "MOVE_SAFEGUARD", + "MOVE_SLUDGE_BOMB", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TOXIC", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "IVYSAUR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "3", + "Move": "MOVE_VINE_WHIP" + }, + { + "Level": "6", + "Move": "MOVE_GROWTH" + }, + { + "Level": "9", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "12", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "15", + "Move": "MOVE_POISON_POWDER" + }, + { + "Level": "15", + "Move": "MOVE_SLEEP_POWDER" + }, + { + "Level": "25", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "30", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "35", + "Move": "MOVE_SYNTHESIS" + }, + { + "Level": "40", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "42", + "Move": "MOVE_SLUDGE_WAVE" + }, + { + "Level": "45", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "55", + "Move": "MOVE_SOLAR_BEAM" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_GIGA_DRAIN", + "MOVE_LIGHT_SCREEN", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_SAFEGUARD", + "MOVE_SLUDGE_BOMB", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TOXIC", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "VENUSAUR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "3", + "Move": "MOVE_VINE_WHIP" + }, + { + "Level": "6", + "Move": "MOVE_GROWTH" + }, + { + "Level": "9", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "12", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "15", + "Move": "MOVE_POISON_POWDER" + }, + { + "Level": "15", + "Move": "MOVE_SLEEP_POWDER" + }, + { + "Level": "25", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "30", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "35", + "Move": "MOVE_SYNTHESIS" + }, + { + "Level": "40", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "42", + "Move": "MOVE_SLUDGE_WAVE" + }, + { + "Level": "45", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "55", + "Move": "MOVE_SOLAR_BEAM" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_LIGHT_SCREEN", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_SAFEGUARD", + "MOVE_SLUDGE_BOMB", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TOXIC", + "MOVE_WORK_UP" + ], + "TutorMoves": [ + "MOVE_POWER_WHIP" + ], + "EggMoves": [] + }, + "CHARMANDER": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "4", + "Move": "MOVE_EMBER" + }, + { + "Level": "8", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "12", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "17", + "Move": "MOVE_FIRE_FANG" + }, + { + "Level": "20", + "Move": "MOVE_FIRE_SPIN" + }, + { + "Level": "24", + "Move": "MOVE_SLASH" + }, + { + "Level": "30", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "42", + "Move": "MOVE_DRAGON_RUSH" + }, + { + "Level": "54", + "Move": "MOVE_FLARE_BLITZ" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_HEAT_WAVE", + "MOVE_IRON_TAIL", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_THUNDER_PUNCH", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "CHARMELEON": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "4", + "Move": "MOVE_EMBER" + }, + { + "Level": "8", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "12", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "17", + "Move": "MOVE_FIRE_FANG" + }, + { + "Level": "20", + "Move": "MOVE_FIRE_SPIN" + }, + { + "Level": "24", + "Move": "MOVE_SLASH" + }, + { + "Level": "30", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "42", + "Move": "MOVE_DRAGON_RUSH" + }, + { + "Level": "54", + "Move": "MOVE_FLARE_BLITZ" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_HEAT_WAVE", + "MOVE_IRON_TAIL", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_THUNDER_PUNCH", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "CHARIZARD": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_DRAGON_CLAW" + }, + { + "Level": "4", + "Move": "MOVE_EMBER" + }, + { + "Level": "8", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "12", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "17", + "Move": "MOVE_FIRE_FANG" + }, + { + "Level": "20", + "Move": "MOVE_FIRE_SPIN" + }, + { + "Level": "24", + "Move": "MOVE_SLASH" + }, + { + "Level": "30", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "42", + "Move": "MOVE_DRAGON_RUSH" + }, + { + "Level": "54", + "Move": "MOVE_FLARE_BLITZ" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FIRE_PUNCH", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_WAVE", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_THUNDER_PUNCH", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [ + "MOVE_AIR_SLASH", + "MOVE_FIRE_BLAST" + ], + "EggMoves": [] + }, + "SQUIRTLE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "3", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "12", + "Move": "MOVE_BITE" + }, + { + "Level": "15", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "20", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "30", + "Move": "MOVE_AQUA_RING" + }, + { + "Level": "35", + "Move": "MOVE_AQUA_JET" + }, + { + "Level": "40", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "45", + "Move": "MOVE_LIQUIDATION" + } + ], + "TMMoves": [ + "MOVE_AURA_SPHERE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAGON_PULSE", + "MOVE_ENDURE", + "MOVE_FLIP_TURN", + "MOVE_HEADBUTT", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_ROCK_TOMB", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "WARTORTLE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "3", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "12", + "Move": "MOVE_BITE" + }, + { + "Level": "15", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "20", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "30", + "Move": "MOVE_AQUA_RING" + }, + { + "Level": "35", + "Move": "MOVE_AQUA_JET" + }, + { + "Level": "40", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "45", + "Move": "MOVE_LIQUIDATION" + } + ], + "TMMoves": [ + "MOVE_AURA_SPHERE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAGON_PULSE", + "MOVE_ENDURE", + "MOVE_FLIP_TURN", + "MOVE_HEADBUTT", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_ROCK_TOMB", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "BLASTOISE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "3", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "12", + "Move": "MOVE_BITE" + }, + { + "Level": "15", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "20", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "30", + "Move": "MOVE_AQUA_RING" + }, + { + "Level": "35", + "Move": "MOVE_AQUA_JET" + }, + { + "Level": "40", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "45", + "Move": "MOVE_LIQUIDATION" + } + ], + "TMMoves": [ + "MOVE_AURA_SPHERE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_MUD_SHOT", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_FLASH_CANNON", + "MOVE_HYDRO_PUMP" + ], + "EggMoves": [] + }, + "WEEDLE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_POISON_STING" + }, + { + "Level": "1", + "Move": "MOVE_STRING_SHOT" + } + ], + "TMMoves": [ + "MOVE_ELECTROWEB" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "KAKUNA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_POISON_STING" + }, + { + "Level": "1", + "Move": "MOVE_STRING_SHOT" + }, + { + "Level": "7", + "Move": "MOVE_HARDEN" + } + ], + "TMMoves": [ + "MOVE_ELECTROWEB", + "MOVE_IRON_DEFENSE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "BEEDRILL": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_POISON_STING" + }, + { + "Level": "1", + "Move": "MOVE_STRING_SHOT" + }, + { + "Level": "7", + "Move": "MOVE_HARDEN" + }, + { + "Level": "15", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "20", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "25", + "Move": "MOVE_X_SCISSOR" + }, + { + "Level": "27", + "Move": "MOVE_BUG_BUZZ" + }, + { + "Level": "29", + "Move": "MOVE_TOXIC_SPIKES" + }, + { + "Level": "33", + "Move": "MOVE_LUNGE" + }, + { + "Level": "35", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "40", + "Move": "MOVE_DRILL_RUN" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BRICK_BREAK", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_ROCK_SMASH", + "MOVE_SLUDGE_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TOXIC", + "MOVE_U_TURN" + ], + "TutorMoves": [ + "MOVE_PIN_MISSILE" + ], + "EggMoves": [] + }, + "PIDGEY": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "9", + "Move": "MOVE_GUST" + }, + { + "Level": "13", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "17", + "Move": "MOVE_TWISTER" + }, + { + "Level": "21", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "25", + "Move": "MOVE_WHIRLWIND" + }, + { + "Level": "29", + "Move": "MOVE_AGILITY" + }, + { + "Level": "33", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "40", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "45", + "Move": "MOVE_HURRICANE" + }, + { + "Level": "50", + "Move": "MOVE_BRAVE_BIRD" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FLY", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_SUBSTITUTE", + "MOVE_U_TURN", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "PIDGEOTTO": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "9", + "Move": "MOVE_GUST" + }, + { + "Level": "13", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "17", + "Move": "MOVE_TWISTER" + }, + { + "Level": "21", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "25", + "Move": "MOVE_WHIRLWIND" + }, + { + "Level": "29", + "Move": "MOVE_AGILITY" + }, + { + "Level": "33", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "40", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "45", + "Move": "MOVE_HURRICANE" + }, + { + "Level": "50", + "Move": "MOVE_BRAVE_BIRD" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FLY", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_SUBSTITUTE", + "MOVE_U_TURN", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "PIDGEOT": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "9", + "Move": "MOVE_GUST" + }, + { + "Level": "13", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "17", + "Move": "MOVE_TWISTER" + }, + { + "Level": "21", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "25", + "Move": "MOVE_WHIRLWIND" + }, + { + "Level": "29", + "Move": "MOVE_AGILITY" + }, + { + "Level": "33", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "40", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "45", + "Move": "MOVE_HURRICANE" + }, + { + "Level": "50", + "Move": "MOVE_BRAVE_BIRD" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FLY", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HYPER_BEAM", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_SUBSTITUTE", + "MOVE_U_TURN", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "EKANS": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "4", + "Move": "MOVE_POISON_STING" + }, + { + "Level": "9", + "Move": "MOVE_BITE" + }, + { + "Level": "12", + "Move": "MOVE_GLARE" + }, + { + "Level": "15", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "17", + "Move": "MOVE_SCREECH" + }, + { + "Level": "25", + "Move": "MOVE_TOXIC" + }, + { + "Level": "33", + "Move": "MOVE_LEECH_LIFE" + }, + { + "Level": "36", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "41", + "Move": "MOVE_HAZE" + }, + { + "Level": "49", + "Move": "MOVE_GUNK_SHOT" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FIRE_FANG", + "MOVE_GIGA_DRAIN", + "MOVE_ICE_FANG", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SLUDGE_BOMB", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER_FANG" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "ARBOK": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "4", + "Move": "MOVE_POISON_STING" + }, + { + "Level": "9", + "Move": "MOVE_BITE" + }, + { + "Level": "12", + "Move": "MOVE_GLARE" + }, + { + "Level": "15", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "17", + "Move": "MOVE_SCREECH" + }, + { + "Level": "25", + "Move": "MOVE_TOXIC" + }, + { + "Level": "33", + "Move": "MOVE_LEECH_LIFE" + }, + { + "Level": "36", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "41", + "Move": "MOVE_HAZE" + }, + { + "Level": "49", + "Move": "MOVE_GUNK_SHOT" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FIRE_FANG", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SLUDGE_BOMB", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER_FANG" + ], + "TutorMoves": [ + "MOVE_CRUNCH" + ], + "EggMoves": [] + }, + "PIKACHU": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_THUNDER_SHOCK" + }, + { + "Level": "1", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "4", + "Move": "MOVE_THUNDER_WAVE" + }, + { + "Level": "12", + "Move": "MOVE_NUZZLE" + }, + { + "Level": "16", + "Move": "MOVE_SPARK" + }, + { + "Level": "20", + "Move": "MOVE_CHARM" + }, + { + "Level": "25", + "Move": "MOVE_THUNDERBOLT" + }, + { + "Level": "30", + "Move": "MOVE_CHARGE" + }, + { + "Level": "35", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "40", + "Move": "MOVE_THUNDER" + }, + { + "Level": "99", + "Move": "MOVE_VOLT_TACKLE" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_IRON_TAIL", + "MOVE_NASTY_PLOT", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_THUNDER_PUNCH", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "RAICHU": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_THUNDER_SHOCK" + }, + { + "Level": "1", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "4", + "Move": "MOVE_THUNDER_WAVE" + }, + { + "Level": "12", + "Move": "MOVE_NUZZLE" + }, + { + "Level": "16", + "Move": "MOVE_SPARK" + }, + { + "Level": "20", + "Move": "MOVE_CHARM" + }, + { + "Level": "25", + "Move": "MOVE_THUNDERBOLT" + }, + { + "Level": "30", + "Move": "MOVE_CHARGE" + }, + { + "Level": "35", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "40", + "Move": "MOVE_THUNDER" + }, + { + "Level": "99", + "Move": "MOVE_VOLT_TACKLE" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_NASTY_PLOT", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "TutorMoves": [ + "MOVE_EERIE_IMPULSE", + "MOVE_THUNDER_PUNCH" + ], + "EggMoves": [] + }, + "RAICHU_ALOLA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_THUNDER_SHOCK" + }, + { + "Level": "1", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "4", + "Move": "MOVE_THUNDER_WAVE" + }, + { + "Level": "12", + "Move": "MOVE_NUZZLE" + }, + { + "Level": "16", + "Move": "MOVE_SPARK" + }, + { + "Level": "20", + "Move": "MOVE_CHARM" + }, + { + "Level": "25", + "Move": "MOVE_THUNDERBOLT" + }, + { + "Level": "30", + "Move": "MOVE_CHARGE" + }, + { + "Level": "35", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "40", + "Move": "MOVE_THUNDER" + }, + { + "Level": "99", + "Move": "MOVE_VOLT_TACKLE" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_NASTY_PLOT", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_THUNDER_PUNCH", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "TutorMoves": [ + "MOVE_EERIE_IMPULSE", + "MOVE_PSYCHIC" + ], + "EggMoves": [] + }, + "CLEFAIRY": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_SPLASH" + }, + { + "Level": "5", + "Move": "MOVE_FAIRY_WIND" + }, + { + "Level": "8", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "13", + "Move": "MOVE_CHARM" + }, + { + "Level": "16", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "18", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "20", + "Move": "MOVE_METRONOME" + }, + { + "Level": "22", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "24", + "Move": "MOVE_MOONLIGHT" + }, + { + "Level": "28", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "32", + "Move": "MOVE_DAZZLING_GLEAM" + }, + { + "Level": "42", + "Move": "MOVE_MYSTICAL_FIRE" + }, + { + "Level": "48", + "Move": "MOVE_MOONBLAST" + }, + { + "Level": "55", + "Move": "MOVE_DOUBLE_EDGE" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "CLEFABLE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_SPLASH" + }, + { + "Level": "5", + "Move": "MOVE_FAIRY_WIND" + }, + { + "Level": "8", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "13", + "Move": "MOVE_CHARM" + }, + { + "Level": "16", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "18", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "20", + "Move": "MOVE_METRONOME" + }, + { + "Level": "22", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "24", + "Move": "MOVE_MOONLIGHT" + }, + { + "Level": "28", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "32", + "Move": "MOVE_DAZZLING_GLEAM" + }, + { + "Level": "42", + "Move": "MOVE_MYSTICAL_FIRE" + }, + { + "Level": "48", + "Move": "MOVE_MOONBLAST" + }, + { + "Level": "52", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "55", + "Move": "MOVE_DOUBLE_EDGE" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "ABRA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TELEPORT" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FIRE_PUNCH", + "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_REFLECT", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "KADABRA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "1", + "Move": "MOVE_TELEPORT" + }, + { + "Level": "10", + "Move": "MOVE_REFLECT" + }, + { + "Level": "20", + "Move": "MOVE_PSYCHO_CUT" + }, + { + "Level": "25", + "Move": "MOVE_RECOVER" + }, + { + "Level": "30", + "Move": "MOVE_PSYSHOCK" + }, + { + "Level": "35", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "40", + "Move": "MOVE_SAFEGUARD" + }, + { + "Level": "45", + "Move": "MOVE_FUTURE_SIGHT" + }, + { + "Level": "50", + "Move": "MOVE_CALM_MIND" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FIRE_PUNCH", + "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_PROTECT", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_CONFUSION" + ], + "EggMoves": [] + }, + "ALAKAZAM": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "1", + "Move": "MOVE_TELEPORT" + }, + { + "Level": "10", + "Move": "MOVE_REFLECT" + }, + { + "Level": "20", + "Move": "MOVE_PSYCHO_CUT" + }, + { + "Level": "25", + "Move": "MOVE_RECOVER" + }, + { + "Level": "30", + "Move": "MOVE_PSYSHOCK" + }, + { + "Level": "35", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "40", + "Move": "MOVE_SAFEGUARD" + }, + { + "Level": "45", + "Move": "MOVE_FUTURE_SIGHT" + }, + { + "Level": "50", + "Move": "MOVE_CALM_MIND" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_NASTY_PLOT", + "MOVE_PROTECT", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_CONFUSION" + ], + "EggMoves": [] + }, + "MACHOP": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "4", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "12", + "Move": "MOVE_POWER_UP_PUNCH" + }, + { + "Level": "14", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "16", + "Move": "MOVE_BULLET_PUNCH" + }, + { + "Level": "18", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "20", + "Move": "MOVE_BULK_UP" + }, + { + "Level": "25", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "30", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "36", + "Move": "MOVE_DETECT" + }, + { + "Level": "44", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "54", + "Move": "MOVE_DYNAMIC_PUNCH" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_CLOSE_COMBAT", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_BLAST", + "MOVE_ICE_PUNCH", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER_PUNCH", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MACHOKE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "4", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "12", + "Move": "MOVE_POWER_UP_PUNCH" + }, + { + "Level": "14", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "16", + "Move": "MOVE_BULLET_PUNCH" + }, + { + "Level": "18", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "20", + "Move": "MOVE_BULK_UP" + }, + { + "Level": "25", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "30", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "36", + "Move": "MOVE_DETECT" + }, + { + "Level": "44", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "54", + "Move": "MOVE_DYNAMIC_PUNCH" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_CLOSE_COMBAT", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_BLAST", + "MOVE_ICE_PUNCH", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER_PUNCH", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MACHAMP": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "4", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "12", + "Move": "MOVE_POWER_UP_PUNCH" + }, + { + "Level": "14", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "16", + "Move": "MOVE_BULLET_PUNCH" + }, + { + "Level": "18", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "20", + "Move": "MOVE_BULK_UP" + }, + { + "Level": "25", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "30", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "36", + "Move": "MOVE_DETECT" + }, + { + "Level": "40", + "Move": "MOVE_HEAVY_SLAM" + }, + { + "Level": "44", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "54", + "Move": "MOVE_DYNAMIC_PUNCH" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_CLOSE_COMBAT", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER_PUNCH", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "BELLSPROUT": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_VINE_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_GROWTH" + }, + { + "Level": "8", + "Move": "MOVE_INFESTATION" + }, + { + "Level": "10", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "13", + "Move": "MOVE_SLEEP_POWDER" + }, + { + "Level": "15", + "Move": "MOVE_POISON_POWDER" + }, + { + "Level": "17", + "Move": "MOVE_STUN_SPORE" + }, + { + "Level": "19", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "23", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "26", + "Move": "MOVE_TOXIC_SPIKES" + }, + { + "Level": "30", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "33", + "Move": "MOVE_LEECH_LIFE" + }, + { + "Level": "40", + "Move": "MOVE_SLUDGE_WAVE" + }, + { + "Level": "44", + "Move": "MOVE_POWER_WHIP" + }, + { + "Level": "48", + "Move": "MOVE_LEAF_STORM" + } + ], + "TMMoves": [ + "MOVE_BULLET_SEED", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_GIGA_DRAIN", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TOXIC" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "WEEPINBELL": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_VINE_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_GROWTH" + }, + { + "Level": "8", + "Move": "MOVE_INFESTATION" + }, + { + "Level": "10", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "13", + "Move": "MOVE_SLEEP_POWDER" + }, + { + "Level": "15", + "Move": "MOVE_POISON_POWDER" + }, + { + "Level": "17", + "Move": "MOVE_STUN_SPORE" + }, + { + "Level": "19", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "23", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "26", + "Move": "MOVE_TOXIC_SPIKES" + }, + { + "Level": "30", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "33", + "Move": "MOVE_LEECH_LIFE" + }, + { + "Level": "40", + "Move": "MOVE_SLUDGE_WAVE" + }, + { + "Level": "44", + "Move": "MOVE_POWER_WHIP" + }, + { + "Level": "48", + "Move": "MOVE_LEAF_STORM" + } + ], + "TMMoves": [ + "MOVE_BULLET_SEED", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_GIGA_DRAIN", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TOXIC" + ], + "TutorMoves": [ + "MOVE_LUNGE" + ], + "EggMoves": [] + }, + "VICTREEBEL": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_VINE_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_GROWTH" + }, + { + "Level": "1", + "Move": "MOVE_LUNGE" + }, + { + "Level": "8", + "Move": "MOVE_INFESTATION" + }, + { + "Level": "10", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "13", + "Move": "MOVE_SLEEP_POWDER" + }, + { + "Level": "15", + "Move": "MOVE_POISON_POWDER" + }, + { + "Level": "17", + "Move": "MOVE_STUN_SPORE" + }, + { + "Level": "19", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "23", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "26", + "Move": "MOVE_TOXIC_SPIKES" + }, + { + "Level": "30", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "33", + "Move": "MOVE_LEECH_LIFE" + }, + { + "Level": "40", + "Move": "MOVE_SLUDGE_WAVE" + }, + { + "Level": "44", + "Move": "MOVE_POWER_WHIP" + }, + { + "Level": "48", + "Move": "MOVE_LEAF_STORM" + } + ], + "TMMoves": [ + "MOVE_BULLET_SEED", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TOXIC" + ], + "TutorMoves": [ + "MOVE_SLUDGE_BOMB" + ], + "EggMoves": [] + }, + "SLOWPOKE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "1", + "Move": "MOVE_CURSE" + }, + { + "Level": "3", + "Move": "MOVE_GROWL" + }, + { + "Level": "6", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "14", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "18", + "Move": "MOVE_WATER_PULSE" + }, + { + "Level": "21", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "24", + "Move": "MOVE_ZEN_HEADBUTT" + }, + { + "Level": "27", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "36", + "Move": "MOVE_SURF" + }, + { + "Level": "42", + "Move": "MOVE_PSYCHIC" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_PSYSHOCK", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER_WAVE", + "MOVE_WATERFALL", + "MOVE_WHIRLPOOL" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SLOWBRO": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "1", + "Move": "MOVE_CURSE" + }, + { + "Level": "3", + "Move": "MOVE_GROWL" + }, + { + "Level": "6", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "14", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "18", + "Move": "MOVE_WATER_PULSE" + }, + { + "Level": "21", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "24", + "Move": "MOVE_ZEN_HEADBUTT" + }, + { + "Level": "27", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "36", + "Move": "MOVE_SURF" + }, + { + "Level": "42", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "45", + "Move": "MOVE_FUTURE_SIGHT" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HEAL_BLOCK", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_METRONOME", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYSHOCK", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER_WAVE", + "MOVE_WATERFALL", + "MOVE_WHIRLPOOL" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SLOWBRO_GALAR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "1", + "Move": "MOVE_CURSE" + }, + { + "Level": "3", + "Move": "MOVE_GROWL" + }, + { + "Level": "6", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "14", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "18", + "Move": "MOVE_WATER_PULSE" + }, + { + "Level": "21", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "24", + "Move": "MOVE_ZEN_HEADBUTT" + }, + { + "Level": "27", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "33", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "36", + "Move": "MOVE_SURF" + }, + { + "Level": "40", + "Move": "MOVE_SLUDGE_BOMB" + }, + { + "Level": "42", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "45", + "Move": "MOVE_FUTURE_SIGHT" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HEAL_BLOCK", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_METRONOME", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_PROTECT", + "MOVE_PSYSHOCK", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_WATERFALL", + "MOVE_WHIRLPOOL" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GASTLY": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "1", + "Move": "MOVE_LICK" + }, + { + "Level": "4", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "8", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "12", + "Move": "MOVE_SHADOW_SNEAK" + }, + { + "Level": "20", + "Move": "MOVE_CURSE" + }, + { + "Level": "24", + "Move": "MOVE_HAZE" + }, + { + "Level": "28", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "36", + "Move": "MOVE_DARK_PULSE" + }, + { + "Level": "40", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "50", + "Move": "MOVE_PERISH_SONG" + } + ], + "TMMoves": [ + "MOVE_DAZZLING_GLEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_GIGA_DRAIN", + "MOVE_GUNK_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_SELF_DESTRUCT", + "MOVE_SLUDGE_BOMB", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "HAUNTER": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "1", + "Move": "MOVE_LICK" + }, + { + "Level": "4", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "8", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "12", + "Move": "MOVE_SHADOW_SNEAK" + }, + { + "Level": "16", + "Move": "MOVE_SHADOW_CLAW" + }, + { + "Level": "20", + "Move": "MOVE_CURSE" + }, + { + "Level": "24", + "Move": "MOVE_HAZE" + }, + { + "Level": "28", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "36", + "Move": "MOVE_DARK_PULSE" + }, + { + "Level": "40", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "48", + "Move": "MOVE_SLUDGE_WAVE" + }, + { + "Level": "50", + "Move": "MOVE_PERISH_SONG" + }, + { + "Level": "55", + "Move": "MOVE_PHANTOM_FORCE" + } + ], + "TMMoves": [ + "MOVE_DAZZLING_GLEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FIRE_PUNCH", + "MOVE_GIGA_DRAIN", + "MOVE_GUNK_SHOT", + "MOVE_ICE_PUNCH", + "MOVE_METRONOME", + "MOVE_NASTY_PLOT", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_SELF_DESTRUCT", + "MOVE_SLUDGE_BOMB", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GENGAR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "1", + "Move": "MOVE_LICK" + }, + { + "Level": "4", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "8", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "12", + "Move": "MOVE_SHADOW_SNEAK" + }, + { + "Level": "16", + "Move": "MOVE_SHADOW_CLAW" + }, + { + "Level": "20", + "Move": "MOVE_CURSE" + }, + { + "Level": "24", + "Move": "MOVE_HAZE" + }, + { + "Level": "28", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "36", + "Move": "MOVE_DARK_PULSE" + }, + { + "Level": "40", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "48", + "Move": "MOVE_SLUDGE_WAVE" + }, + { + "Level": "50", + "Move": "MOVE_PERISH_SONG" + }, + { + "Level": "55", + "Move": "MOVE_PHANTOM_FORCE" + } + ], + "TMMoves": [ + "MOVE_DAZZLING_GLEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_METRONOME", + "MOVE_NASTY_PLOT", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_SELF_DESTRUCT", + "MOVE_SLUDGE_BOMB", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "ONIX": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "12", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "16", + "Move": "MOVE_CURSE" + }, + { + "Level": "20", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "22", + "Move": "MOVE_BREAKING_SWIPE" + }, + { + "Level": "24", + "Move": "MOVE_SCREECH" + }, + { + "Level": "28", + "Move": "MOVE_SAND_TOMB" + }, + { + "Level": "32", + "Move": "MOVE_STEALTH_ROCK" + }, + { + "Level": "44", + "Move": "MOVE_DIG" + }, + { + "Level": "48", + "Move": "MOVE_IRON_TAIL" + }, + { + "Level": "52", + "Move": "MOVE_STONE_EDGE" + }, + { + "Level": "56", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "62", + "Move": "MOVE_HEAD_SMASH" + } + ], + "TMMoves": [ + "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_IRON_HEAD", + "MOVE_PROTECT", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_TOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "KANGASKHAN": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "4", + "Move": "MOVE_GROWL" + }, + { + "Level": "12", + "Move": "MOVE_BITE" + }, + { + "Level": "20", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "24", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "32", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "36", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "40", + "Move": "MOVE_ENDURE" + }, + { + "Level": "48", + "Move": "MOVE_OUTRAGE" + }, + { + "Level": "54", + "Move": "MOVE_DYNAMIC_PUNCH" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "STARYU": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "4", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "8", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "12", + "Move": "MOVE_AQUA_JET" + }, + { + "Level": "16", + "Move": "MOVE_SWIFT" + }, + { + "Level": "20", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "24", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "32", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "36", + "Move": "MOVE_POWER_GEM" + }, + { + "Level": "40", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "44", + "Move": "MOVE_SURF" + }, + { + "Level": "48", + "Move": "MOVE_RECOVER" + }, + { + "Level": "56", + "Move": "MOVE_HYDRO_PUMP" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_DAZZLING_GLEAM", + "MOVE_ENDURE", + "MOVE_FLASH_CANNON", + "MOVE_FLIP_TURN", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_SAFEGUARD", + "MOVE_SELF_DESTRUCT", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "STARMIE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "4", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "8", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "12", + "Move": "MOVE_AQUA_JET" + }, + { + "Level": "16", + "Move": "MOVE_SWIFT" + }, + { + "Level": "20", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "24", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "32", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "36", + "Move": "MOVE_POWER_GEM" + }, + { + "Level": "40", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "42", + "Move": "MOVE_LIQUIDATION" + }, + { + "Level": "44", + "Move": "MOVE_SURF" + }, + { + "Level": "48", + "Move": "MOVE_RECOVER" + }, + { + "Level": "56", + "Move": "MOVE_HYDRO_PUMP" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BLIZZARD", + "MOVE_BULK_UP", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_FLASH_CANNON", + "MOVE_FLIP_TURN", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_PROTECT", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_SAFEGUARD", + "MOVE_SELF_DESTRUCT", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SCYTHER": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "12", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "16", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "20", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "24", + "Move": "MOVE_SLASH" + }, + { + "Level": "28", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "32", + "Move": "MOVE_X_SCISSOR" + }, + { + "Level": "34", + "Move": "MOVE_BUG_BUZZ" + }, + { + "Level": "36", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "42", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "46", + "Move": "MOVE_LUNGE" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BRICK_BREAK", + "MOVE_CLOSE_COMBAT", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_NIGHT_SLASH", + "MOVE_PROTECT", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_U_TURN" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "PINSIR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "4", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "8", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "16", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "20", + "Move": "MOVE_DETECT" + }, + { + "Level": "24", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "32", + "Move": "MOVE_X_SCISSOR" + }, + { + "Level": "36", + "Move": "MOVE_LUNGE" + }, + { + "Level": "40", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "50", + "Move": "MOVE_CLOSE_COMBAT" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MAGIKARP": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_SPLASH" + }, + { + "Level": "15", + "Move": "MOVE_TACKLE" + } + ], + "TMMoves": [ + "MOVE_HYDRO_PUMP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GYARADOS": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_SPLASH" + }, + { + "Level": "1", + "Move": "MOVE_TWISTER" + }, + { + "Level": "24", + "Move": "MOVE_WATERFALL" + }, + { + "Level": "30", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "33", + "Move": "MOVE_IRON_HEAD" + }, + { + "Level": "40", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "44", + "Move": "MOVE_HURRICANE" + }, + { + "Level": "45", + "Move": "MOVE_DRAGON_RUSH" + }, + { + "Level": "50", + "Move": "MOVE_HYDRO_PUMP" + }, + { + "Level": "55", + "Move": "MOVE_HYPER_BEAM" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_GIGA_IMPACT", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_WATER_PULSE" + ], + "TutorMoves": [ + "MOVE_BITE", + "MOVE_WATER_GUN", + "MOVE_WHIRLPOOL" + ], + "EggMoves": [] + }, + "EEVEE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "10", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "15", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "20", + "Move": "MOVE_SWIFT" + }, + { + "Level": "25", + "Move": "MOVE_BITE" + }, + { + "Level": "30", + "Move": "MOVE_WISH" + }, + { + "Level": "40", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "45", + "Move": "MOVE_CHARM" + }, + { + "Level": "50", + "Move": "MOVE_DOUBLE_EDGE" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "VAPOREON": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "10", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "15", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "20", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "25", + "Move": "MOVE_HAZE" + }, + { + "Level": "30", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "35", + "Move": "MOVE_AQUA_RING" + }, + { + "Level": "40", + "Move": "MOVE_SURF" + }, + { + "Level": "45", + "Move": "MOVE_ACID_ARMOR" + }, + { + "Level": "50", + "Move": "MOVE_HYDRO_PUMP" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FLIP_TURN", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_IRON_TAIL", + "MOVE_LIQUIDATION", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "TutorMoves": [ + "MOVE_CHARM", + "MOVE_DOUBLE_EDGE", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_WATER_GUN", + "MOVE_WISH" + ], + "EggMoves": [] + }, + "JOLTEON": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "10", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "15", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "20", + "Move": "MOVE_THUNDER_WAVE" + }, + { + "Level": "25", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "30", + "Move": "MOVE_THUNDER_FANG" + }, + { + "Level": "35", + "Move": "MOVE_PIN_MISSILE" + }, + { + "Level": "40", + "Move": "MOVE_THUNDERBOLT" + }, + { + "Level": "45", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "50", + "Move": "MOVE_THUNDER" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "TutorMoves": [ + "MOVE_CHARM", + "MOVE_DOUBLE_EDGE", + "MOVE_EERIE_IMPULSE", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_THUNDER_SHOCK", + "MOVE_WISH" + ], + "EggMoves": [] + }, + "FLAREON": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "10", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "15", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "20", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "25", + "Move": "MOVE_FLAME_WHEEL" + }, + { + "Level": "30", + "Move": "MOVE_FIRE_SPIN" + }, + { + "Level": "35", + "Move": "MOVE_FIRE_FANG" + }, + { + "Level": "40", + "Move": "MOVE_LAVA_PLUME" + }, + { + "Level": "50", + "Move": "MOVE_FLARE_BLITZ" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [ + "MOVE_CHARM", + "MOVE_DOUBLE_EDGE", + "MOVE_EMBER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_WISH" + ], + "EggMoves": [] + }, + "AERODACTYL": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "1", + "Move": "MOVE_STEEL_WING" + }, + { + "Level": "5", + "Move": "MOVE_SUPERSONIC" + }, + { + "Level": "10", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "15", + "Move": "MOVE_ROCK_BLAST" + }, + { + "Level": "20", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "25", + "Move": "MOVE_ROAR" + }, + { + "Level": "30", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "35", + "Move": "MOVE_IRON_HEAD" + }, + { + "Level": "40", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "45", + "Move": "MOVE_STONE_EDGE" + }, + { + "Level": "55", + "Move": "MOVE_HYPER_BEAM" + }, + { + "Level": "60", + "Move": "MOVE_GIGA_IMPACT" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FLAMETHROWER", + "MOVE_FLY", + "MOVE_HEAT_WAVE", + "MOVE_HURRICANE", + "MOVE_ICE_FANG", + "MOVE_IRON_TAIL", + "MOVE_PROTECT", + "MOVE_ROCK_TOMB", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THUNDER_FANG", + "MOVE_WHIRLWIND" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "DRATINI": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "5", + "Move": "MOVE_TWISTER" + }, + { + "Level": "10", + "Move": "MOVE_THUNDER_WAVE" + }, + { + "Level": "15", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "20", + "Move": "MOVE_BREAKING_SWIPE" + }, + { + "Level": "25", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "30", + "Move": "MOVE_DRAGON_RUSH" + }, + { + "Level": "40", + "Move": "MOVE_SAFEGUARD" + }, + { + "Level": "50", + "Move": "MOVE_EXTREME_SPEED" + }, + { + "Level": "55", + "Move": "MOVE_OUTRAGE" + }, + { + "Level": "60", + "Move": "MOVE_HYPER_BEAM" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BLIZZARD", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_PULSE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_GIGA_IMPACT", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_IRON_HEAD", + "MOVE_LIGHT_SCREEN", + "MOVE_PROTECT", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "DRAGONAIR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "5", + "Move": "MOVE_TWISTER" + }, + { + "Level": "10", + "Move": "MOVE_THUNDER_WAVE" + }, + { + "Level": "15", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "20", + "Move": "MOVE_BREAKING_SWIPE" + }, + { + "Level": "25", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "30", + "Move": "MOVE_DRAGON_RUSH" + }, + { + "Level": "40", + "Move": "MOVE_SAFEGUARD" + }, + { + "Level": "50", + "Move": "MOVE_EXTREME_SPEED" + }, + { + "Level": "55", + "Move": "MOVE_OUTRAGE" + }, + { + "Level": "60", + "Move": "MOVE_HYPER_BEAM" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BLIZZARD", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_PULSE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_GIGA_IMPACT", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_IRON_HEAD", + "MOVE_LIGHT_SCREEN", + "MOVE_PROTECT", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "DRAGONITE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "5", + "Move": "MOVE_TWISTER" + }, + { + "Level": "10", + "Move": "MOVE_THUNDER_WAVE" + }, + { + "Level": "15", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "20", + "Move": "MOVE_BREAKING_SWIPE" + }, + { + "Level": "25", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "30", + "Move": "MOVE_DRAGON_RUSH" + }, + { + "Level": "40", + "Move": "MOVE_SAFEGUARD" + }, + { + "Level": "50", + "Move": "MOVE_EXTREME_SPEED" + }, + { + "Level": "55", + "Move": "MOVE_OUTRAGE" + }, + { + "Level": "60", + "Move": "MOVE_HYPER_BEAM" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_WAVE", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_HEAD", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WHIRLWIND" + ], + "TutorMoves": [ + "MOVE_FIRE_PUNCH", + "MOVE_HURRICANE", + "MOVE_THUNDER_PUNCH", + "MOVE_WING_ATTACK" + ], + "EggMoves": [] + }, + "MEWTWO": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "1", + "Move": "MOVE_SWIFT" + }, + { + "Level": "12", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "16", + "Move": "MOVE_PSYCHO_CUT" + }, + { + "Level": "24", + "Move": "MOVE_SAFEGUARD" + }, + { + "Level": "32", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "40", + "Move": "MOVE_AURA_SPHERE" + }, + { + "Level": "48", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "64", + "Move": "MOVE_MIST" + }, + { + "Level": "72", + "Move": "MOVE_PSYSTRIKE" + }, + { + "Level": "80", + "Move": "MOVE_RECOVER" + }, + { + "Level": "88", + "Move": "MOVE_FUTURE_SIGHT" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CALM_MIND", + "MOVE_DARK_PULSE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HEAL_BLOCK", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_NASTY_PLOT", + "MOVE_POISON_JAB", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SOLAR_BEAM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "CHIKORITA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "6", + "Move": "MOVE_LEAFAGE" + }, + { + "Level": "9", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "12", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "14", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "22", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "27", + "Move": "MOVE_REFLECT" + }, + { + "Level": "36", + "Move": "MOVE_SAFEGUARD" + }, + { + "Level": "40", + "Move": "MOVE_SYNTHESIS" + }, + { + "Level": "45", + "Move": "MOVE_SOLAR_BEAM" + }, + { + "Level": "50", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "56", + "Move": "MOVE_LEAF_STORM" + } + ], + "TMMoves": [ + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_HEADBUTT", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_PROTECT", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "BAYLEEF": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "6", + "Move": "MOVE_LEAFAGE" + }, + { + "Level": "9", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "12", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "14", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "22", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "27", + "Move": "MOVE_REFLECT" + }, + { + "Level": "36", + "Move": "MOVE_SAFEGUARD" + }, + { + "Level": "40", + "Move": "MOVE_SYNTHESIS" + }, + { + "Level": "45", + "Move": "MOVE_SOLAR_BEAM" + }, + { + "Level": "50", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "56", + "Move": "MOVE_LEAF_STORM" + } + ], + "TMMoves": [ + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_HEADBUTT", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_PROTECT", + "MOVE_ROCK_SMASH", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_WORK_UP" + ], + "TutorMoves": [ + "MOVE_GIGA_DRAIN" + ], + "EggMoves": [] + }, + "MEGANIUM": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "6", + "Move": "MOVE_LEAFAGE" + }, + { + "Level": "9", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "12", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "14", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "22", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "27", + "Move": "MOVE_REFLECT" + }, + { + "Level": "36", + "Move": "MOVE_SAFEGUARD" + }, + { + "Level": "40", + "Move": "MOVE_SYNTHESIS" + }, + { + "Level": "45", + "Move": "MOVE_SOLAR_BEAM" + }, + { + "Level": "50", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "56", + "Move": "MOVE_LEAF_STORM" + } + ], + "TMMoves": [ + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_ROCK_SMASH", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_WORK_UP" + ], + "TutorMoves": [ + "MOVE_GIGA_DRAIN", + "MOVE_LEAF_BLADE" + ], + "EggMoves": [] + }, + "TOTODILE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "6", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "10", + "Move": "MOVE_BITE" + }, + { + "Level": "15", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "21", + "Move": "MOVE_AQUA_JET" + }, + { + "Level": "26", + "Move": "MOVE_BREAKING_SWIPE" + }, + { + "Level": "35", + "Move": "MOVE_SCREECH" + }, + { + "Level": "40", + "Move": "MOVE_LIQUIDATION" + }, + { + "Level": "50", + "Move": "MOVE_HYDRO_PUMP" + }, + { + "Level": "56", + "Move": "MOVE_OUTRAGE" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CLAW", + "MOVE_ENDURE", + "MOVE_FLIP_TURN", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICY_WIND", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWORDS_DANCE", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "CROCONAW": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "6", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "10", + "Move": "MOVE_BITE" + }, + { + "Level": "15", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "21", + "Move": "MOVE_AQUA_JET" + }, + { + "Level": "26", + "Move": "MOVE_BREAKING_SWIPE" + }, + { + "Level": "35", + "Move": "MOVE_SCREECH" + }, + { + "Level": "40", + "Move": "MOVE_LIQUIDATION" + }, + { + "Level": "50", + "Move": "MOVE_HYDRO_PUMP" + }, + { + "Level": "56", + "Move": "MOVE_OUTRAGE" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CLAW", + "MOVE_ENDURE", + "MOVE_FLIP_TURN", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICY_WIND", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWORDS_DANCE", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "TutorMoves": [ + "MOVE_SLASH" + ], + "EggMoves": [] + }, + "FERALIGATR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_SLASH" + }, + { + "Level": "6", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "10", + "Move": "MOVE_BITE" + }, + { + "Level": "15", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "21", + "Move": "MOVE_AQUA_JET" + }, + { + "Level": "26", + "Move": "MOVE_BREAKING_SWIPE" + }, + { + "Level": "35", + "Move": "MOVE_SCREECH" + }, + { + "Level": "40", + "Move": "MOVE_LIQUIDATION" + }, + { + "Level": "50", + "Move": "MOVE_HYDRO_PUMP" + }, + { + "Level": "56", + "Move": "MOVE_OUTRAGE" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CLAW", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FLIP_TURN", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICY_WIND", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWORDS_DANCE", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "TutorMoves": [ + "MOVE_CRUNCH" + ], + "EggMoves": [] + }, + "SPINARAK": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_POISON_STING" + }, + { + "Level": "1", + "Move": "MOVE_STRING_SHOT" + }, + { + "Level": "5", + "Move": "MOVE_ABSORB" + }, + { + "Level": "8", + "Move": "MOVE_INFESTATION" + }, + { + "Level": "12", + "Move": "MOVE_SHADOW_SNEAK" + }, + { + "Level": "16", + "Move": "MOVE_X_SCISSOR" + }, + { + "Level": "21", + "Move": "MOVE_SCREECH" + }, + { + "Level": "24", + "Move": "MOVE_STICKY_WEB" + }, + { + "Level": "27", + "Move": "MOVE_PIN_MISSILE" + }, + { + "Level": "30", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "33", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "35", + "Move": "MOVE_BUG_BUZZ" + }, + { + "Level": "37", + "Move": "MOVE_LEECH_LIFE" + }, + { + "Level": "40", + "Move": "MOVE_LUNGE" + }, + { + "Level": "44", + "Move": "MOVE_MEGAHORN" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_DIG", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_GIGA_DRAIN", + "MOVE_HEADBUTT", + "MOVE_KNOCK_OFF", + "MOVE_PROTECT", + "MOVE_SLUDGE_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "ARIADOS": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_POISON_STING" + }, + { + "Level": "1", + "Move": "MOVE_STRING_SHOT" + }, + { + "Level": "1", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "5", + "Move": "MOVE_ABSORB" + }, + { + "Level": "8", + "Move": "MOVE_INFESTATION" + }, + { + "Level": "12", + "Move": "MOVE_SHADOW_SNEAK" + }, + { + "Level": "16", + "Move": "MOVE_X_SCISSOR" + }, + { + "Level": "21", + "Move": "MOVE_SCREECH" + }, + { + "Level": "24", + "Move": "MOVE_STICKY_WEB" + }, + { + "Level": "27", + "Move": "MOVE_PIN_MISSILE" + }, + { + "Level": "30", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "33", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "35", + "Move": "MOVE_BUG_BUZZ" + }, + { + "Level": "37", + "Move": "MOVE_LEECH_LIFE" + }, + { + "Level": "40", + "Move": "MOVE_LUNGE" + }, + { + "Level": "44", + "Move": "MOVE_MEGAHORN" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_DIG", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", + "MOVE_KNOCK_OFF", + "MOVE_PROTECT", + "MOVE_SLUDGE_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES" + ], + "TutorMoves": [ + "MOVE_SWORDS_DANCE" + ], + "EggMoves": [] + }, + "PICHU": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_THUNDER_SHOCK" + }, + { + "Level": "1", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "4", + "Move": "MOVE_THUNDER_WAVE" + }, + { + "Level": "12", + "Move": "MOVE_NUZZLE" + }, + { + "Level": "16", + "Move": "MOVE_SPARK" + }, + { + "Level": "20", + "Move": "MOVE_CHARM" + }, + { + "Level": "25", + "Move": "MOVE_THUNDERBOLT" + }, + { + "Level": "30", + "Move": "MOVE_CHARGE" + }, + { + "Level": "35", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "40", + "Move": "MOVE_THUNDER" + }, + { + "Level": "99", + "Move": "MOVE_VOLT_TACKLE" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_IRON_TAIL", + "MOVE_NASTY_PLOT", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_THUNDER_PUNCH", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "CLEFFA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_SPLASH" + }, + { + "Level": "5", + "Move": "MOVE_FAIRY_WIND" + }, + { + "Level": "8", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "13", + "Move": "MOVE_CHARM" + }, + { + "Level": "16", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "18", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "20", + "Move": "MOVE_METRONOME" + }, + { + "Level": "22", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "24", + "Move": "MOVE_MOONLIGHT" + }, + { + "Level": "28", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "42", + "Move": "MOVE_MYSTICAL_FIRE" + }, + { + "Level": "48", + "Move": "MOVE_MOONBLAST" + }, + { + "Level": "55", + "Move": "MOVE_DOUBLE_EDGE" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_HEADBUTT", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MAREEP": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "4", + "Move": "MOVE_THUNDER_SHOCK" + }, + { + "Level": "8", + "Move": "MOVE_THUNDER_WAVE" + }, + { + "Level": "15", + "Move": "MOVE_CHARGE" + }, + { + "Level": "17", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "28", + "Move": "MOVE_COTTON_GUARD" + }, + { + "Level": "32", + "Move": "MOVE_POWER_GEM" + }, + { + "Level": "36", + "Move": "MOVE_THUNDERBOLT" + }, + { + "Level": "40", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "45", + "Move": "MOVE_THUNDER" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "FLAAFFY": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "4", + "Move": "MOVE_THUNDER_SHOCK" + }, + { + "Level": "8", + "Move": "MOVE_THUNDER_WAVE" + }, + { + "Level": "15", + "Move": "MOVE_CHARGE" + }, + { + "Level": "17", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "28", + "Move": "MOVE_COTTON_GUARD" + }, + { + "Level": "32", + "Move": "MOVE_POWER_GEM" + }, + { + "Level": "36", + "Move": "MOVE_THUNDERBOLT" + }, + { + "Level": "40", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "45", + "Move": "MOVE_THUNDER" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_FIRE_PUNCH", + "MOVE_ICE_PUNCH", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_ROAR", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "AMPHAROS": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "4", + "Move": "MOVE_THUNDER_SHOCK" + }, + { + "Level": "8", + "Move": "MOVE_THUNDER_WAVE" + }, + { + "Level": "15", + "Move": "MOVE_CHARGE" + }, + { + "Level": "17", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "28", + "Move": "MOVE_COTTON_GUARD" + }, + { + "Level": "32", + "Move": "MOVE_POWER_GEM" + }, + { + "Level": "36", + "Move": "MOVE_THUNDERBOLT" + }, + { + "Level": "40", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "42", + "Move": "MOVE_BREAKING_SWIPE" + }, + { + "Level": "45", + "Move": "MOVE_THUNDER" + }, + { + "Level": "50", + "Move": "MOVE_ZAP_CANNON" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAGON_PULSE", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_ROAR", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "TutorMoves": [ + "MOVE_EERIE_IMPULSE", + "MOVE_THUNDER_PUNCH" + ], + "EggMoves": [] + }, + "ESPEON": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "10", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "15", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "25", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "30", + "Move": "MOVE_MORNING_SUN" + }, + { + "Level": "35", + "Move": "MOVE_HEAL_BLOCK" + }, + { + "Level": "40", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "45", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "55", + "Move": "MOVE_FUTURE_SIGHT" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_ROAR", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER_WAVE" + ], + "TutorMoves": [ + "MOVE_CHARM", + "MOVE_CONFUSION", + "MOVE_DOUBLE_EDGE", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_WISH" + ], + "EggMoves": [] + }, + "UMBREON": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "10", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "15", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "20", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "30", + "Move": "MOVE_MOONLIGHT" + }, + { + "Level": "35", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "40", + "Move": "MOVE_DARK_PULSE" + }, + { + "Level": "45", + "Move": "MOVE_SCREECH" + }, + { + "Level": "50", + "Move": "MOVE_CRUNCH" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_REFLECT", + "MOVE_ROAR", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC" + ], + "TutorMoves": [ + "MOVE_CHARM", + "MOVE_DOUBLE_EDGE", + "MOVE_SNARL", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_WISH" + ], + "EggMoves": [] + }, + "SLOWKING": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_CURSE" + }, + { + "Level": "1", + "Move": "MOVE_POWER_GEM" + }, + { + "Level": "1", + "Move": "MOVE_NASTY_PLOT" + }, + { + "Level": "3", + "Move": "MOVE_GROWL" + }, + { + "Level": "6", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "14", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "18", + "Move": "MOVE_WATER_PULSE" + }, + { + "Level": "21", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "24", + "Move": "MOVE_ZEN_HEADBUTT" + }, + { + "Level": "27", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "36", + "Move": "MOVE_SURF" + }, + { + "Level": "42", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "45", + "Move": "MOVE_FUTURE_SIGHT" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HEAL_BLOCK", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_METRONOME", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER_WAVE", + "MOVE_WATERFALL", + "MOVE_WHIRLPOOL" + ], + "TutorMoves": [ + "MOVE_CONFUSION" + ], + "EggMoves": [] + }, + "SLOWKING_GALAR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_CURSE" + }, + { + "Level": "1", + "Move": "MOVE_POWER_GEM" + }, + { + "Level": "1", + "Move": "MOVE_NASTY_PLOT" + }, + { + "Level": "3", + "Move": "MOVE_GROWL" + }, + { + "Level": "6", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "14", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "18", + "Move": "MOVE_WATER_PULSE" + }, + { + "Level": "21", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "24", + "Move": "MOVE_ZEN_HEADBUTT" + }, + { + "Level": "27", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "36", + "Move": "MOVE_SURF" + }, + { + "Level": "36", + "Move": "MOVE_SLUDGE_WAVE" + }, + { + "Level": "42", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "45", + "Move": "MOVE_FUTURE_SIGHT" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HEAL_BLOCK", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_METRONOME", + "MOVE_MUD_SHOT", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYSHOCK", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SLUDGE_BOMB", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC_SPIKES", + "MOVE_WATERFALL", + "MOVE_WHIRLPOOL" + ], + "TutorMoves": [ + "MOVE_CONFUSION", + "MOVE_TOXIC" + ], + "EggMoves": [] + }, + "STEELIX": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "1", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "12", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "16", + "Move": "MOVE_CURSE" + }, + { + "Level": "20", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "22", + "Move": "MOVE_BREAKING_SWIPE" + }, + { + "Level": "24", + "Move": "MOVE_SCREECH" + }, + { + "Level": "28", + "Move": "MOVE_SAND_TOMB" + }, + { + "Level": "32", + "Move": "MOVE_STEALTH_ROCK" + }, + { + "Level": "36", + "Move": "MOVE_HEAVY_SLAM" + }, + { + "Level": "44", + "Move": "MOVE_DIG" + }, + { + "Level": "52", + "Move": "MOVE_STONE_EDGE" + }, + { + "Level": "56", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "62", + "Move": "MOVE_HEAD_SMASH" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_DARK_PULSE", + "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FIRE_FANG", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_PROTECT", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_TOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THUNDER_FANG" + ], + "TutorMoves": [ + "MOVE_IRON_TAIL" + ], + "EggMoves": [] + }, + "SCIZOR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "12", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "16", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "18", + "Move": "MOVE_STEEL_WING" + }, + { + "Level": "20", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "24", + "Move": "MOVE_SLASH" + }, + { + "Level": "28", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "32", + "Move": "MOVE_X_SCISSOR" + }, + { + "Level": "34", + "Move": "MOVE_BUG_BUZZ" + }, + { + "Level": "36", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "40", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "42", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "46", + "Move": "MOVE_LUNGE" + }, + { + "Level": "48", + "Move": "MOVE_IRON_HEAD" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BRICK_BREAK", + "MOVE_CLOSE_COMBAT", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_NIGHT_SLASH", + "MOVE_PROTECT", + "MOVE_SAFEGUARD", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_U_TURN" + ], + "TutorMoves": [ + "MOVE_BULLET_PUNCH" + ], + "EggMoves": [] + }, + "HERACROSS": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "5", + "Move": "MOVE_ENDURE" + }, + { + "Level": "10", + "Move": "MOVE_PIN_MISSILE" + }, + { + "Level": "13", + "Move": "MOVE_DETECT" + }, + { + "Level": "15", + "Move": "MOVE_AERIAL_ACE" + }, + { + "Level": "20", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "24", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "28", + "Move": "MOVE_ROCK_BLAST" + }, + { + "Level": "30", + "Move": "MOVE_BUG_BUZZ" + }, + { + "Level": "32", + "Move": "MOVE_LUNGE" + }, + { + "Level": "38", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "45", + "Move": "MOVE_MEGAHORN" + }, + { + "Level": "50", + "Move": "MOVE_CLOSE_COMBAT" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_MUD_SHOT", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SPIKES", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "DELIBIRD": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_PECK" + }, + { + "Level": "15", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "18", + "Move": "MOVE_AERIAL_ACE" + }, + { + "Level": "25", + "Move": "MOVE_ICE_SHARD" + }, + { + "Level": "28", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "32", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "35", + "Move": "MOVE_ICE_PUNCH" + }, + { + "Level": "37", + "Move": "MOVE_FREEZE_DRY" + }, + { + "Level": "40", + "Move": "MOVE_BLIZZARD" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_ENDURE", + "MOVE_FLY", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_PROTECT", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_WATER_PULSE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SKARMORY": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_PECK" + }, + { + "Level": "12", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "16", + "Move": "MOVE_SAND_TOMB" + }, + { + "Level": "20", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "24", + "Move": "MOVE_SLASH" + }, + { + "Level": "28", + "Move": "MOVE_STEEL_WING" + }, + { + "Level": "34", + "Move": "MOVE_NIGHT_SLASH" + }, + { + "Level": "38", + "Move": "MOVE_DRILL_RUN" + }, + { + "Level": "42", + "Move": "MOVE_METAL_SOUND" + }, + { + "Level": "46", + "Move": "MOVE_SPIKES" + }, + { + "Level": "50", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "56", + "Move": "MOVE_BRAVE_BIRD" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FLASH_CANNON", + "MOVE_FLY", + "MOVE_GIGA_IMPACT", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_WHIRLWIND", + "MOVE_X_SCISSOR" + ], + "TutorMoves": [ + "MOVE_AIR_SLASH" + ], + "EggMoves": [] + }, + "HOUNDOUR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_EMBER" + }, + { + "Level": "6", + "Move": "MOVE_TACKLE" + }, + { + "Level": "13", + "Move": "MOVE_ROAR" + }, + { + "Level": "16", + "Move": "MOVE_BITE" + }, + { + "Level": "24", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "28", + "Move": "MOVE_FIRE_FANG" + }, + { + "Level": "44", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "49", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "52", + "Move": "MOVE_NASTY_PLOT" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLARE_BLITZ", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HYPER_VOICE", + "MOVE_MUD_SHOT", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_SHADOW_BALL", + "MOVE_SLUDGE_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "HOUNDOOM": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_EMBER" + }, + { + "Level": "1", + "Move": "MOVE_NASTY_PLOT" + }, + { + "Level": "6", + "Move": "MOVE_TACKLE" + }, + { + "Level": "13", + "Move": "MOVE_ROAR" + }, + { + "Level": "16", + "Move": "MOVE_BITE" + }, + { + "Level": "21", + "Move": "MOVE_SNARL" + }, + { + "Level": "24", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "28", + "Move": "MOVE_FIRE_FANG" + }, + { + "Level": "34", + "Move": "MOVE_DARK_PULSE" + }, + { + "Level": "44", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "49", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "55", + "Move": "MOVE_OVERHEAT" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLARE_BLITZ", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_SHADOW_BALL", + "MOVE_SLUDGE_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "LARVITAR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "3", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "9", + "Move": "MOVE_BITE" + }, + { + "Level": "12", + "Move": "MOVE_SAND_TOMB" + }, + { + "Level": "15", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "21", + "Move": "MOVE_SCREECH" + }, + { + "Level": "27", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "33", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "37", + "Move": "MOVE_STONE_EDGE" + }, + { + "Level": "40", + "Move": "MOVE_ROCK_BLAST" + }, + { + "Level": "48", + "Move": "MOVE_HYPER_BEAM" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_MUD_SHOT", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_ROCK_TOMB", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "PUPITAR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "3", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "9", + "Move": "MOVE_BITE" + }, + { + "Level": "12", + "Move": "MOVE_SAND_TOMB" + }, + { + "Level": "15", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "21", + "Move": "MOVE_SCREECH" + }, + { + "Level": "27", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "33", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "37", + "Move": "MOVE_STONE_EDGE" + }, + { + "Level": "40", + "Move": "MOVE_ROCK_BLAST" + }, + { + "Level": "48", + "Move": "MOVE_HYPER_BEAM" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_IRON_HEAD", + "MOVE_MUD_SHOT", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_ROCK_TOMB", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT" + ], + "TutorMoves": [ + "MOVE_IRON_DEFENSE" + ], + "EggMoves": [] + }, + "TYRANITAR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "3", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "9", + "Move": "MOVE_BITE" + }, + { + "Level": "12", + "Move": "MOVE_SAND_TOMB" + }, + { + "Level": "15", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "21", + "Move": "MOVE_SCREECH" + }, + { + "Level": "27", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "33", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "37", + "Move": "MOVE_STONE_EDGE" + }, + { + "Level": "40", + "Move": "MOVE_ROCK_BLAST" + }, + { + "Level": "48", + "Move": "MOVE_HYPER_BEAM" + }, + { + "Level": "53", + "Move": "MOVE_HEAVY_SLAM" + }, + { + "Level": "56", + "Move": "MOVE_GIGA_IMPACT" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_HEADBUTT", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_MUD_SHOT", + "MOVE_OUTRAGE", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE" + ], + "TutorMoves": [ + "MOVE_DARK_PULSE", + "MOVE_IRON_DEFENSE" + ], + "EggMoves": [] + }, + "RALTS": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "6", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "9", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "12", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "15", + "Move": "MOVE_TELEPORT" + }, + { + "Level": "18", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "20", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "24", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "28", + "Move": "MOVE_CHARM" + }, + { + "Level": "30", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "35", + "Move": "MOVE_CALM_MIND" + }, + { + "Level": "38", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "44", + "Move": "MOVE_MYSTICAL_FIRE" + }, + { + "Level": "58", + "Move": "MOVE_FUTURE_SIGHT" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_ENDURE", + "MOVE_FIRE_PUNCH", + "MOVE_HYPER_VOICE", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_PROTECT", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "KIRLIA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "6", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "9", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "12", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "15", + "Move": "MOVE_TELEPORT" + }, + { + "Level": "18", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "20", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "24", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "28", + "Move": "MOVE_CHARM" + }, + { + "Level": "30", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "35", + "Move": "MOVE_CALM_MIND" + }, + { + "Level": "38", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "44", + "Move": "MOVE_MYSTICAL_FIRE" + }, + { + "Level": "58", + "Move": "MOVE_FUTURE_SIGHT" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_ENDURE", + "MOVE_FIRE_PUNCH", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_PROTECT", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GARDEVOIR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "6", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "9", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "12", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "15", + "Move": "MOVE_TELEPORT" + }, + { + "Level": "18", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "20", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "24", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "28", + "Move": "MOVE_CHARM" + }, + { + "Level": "30", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "32", + "Move": "MOVE_WISH" + }, + { + "Level": "35", + "Move": "MOVE_CALM_MIND" + }, + { + "Level": "38", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "44", + "Move": "MOVE_MYSTICAL_FIRE" + }, + { + "Level": "49", + "Move": "MOVE_MOONBLAST" + }, + { + "Level": "58", + "Move": "MOVE_FUTURE_SIGHT" + } + ], + "TMMoves": [ + "MOVE_AURA_SPHERE", + "MOVE_BODY_SLAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_PROTECT", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_DAZZLING_GLEAM" + ], + "EggMoves": [] + }, + "SABLEYE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "9", + "Move": "MOVE_SHADOW_SNEAK" + }, + { + "Level": "15", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "18", + "Move": "MOVE_DETECT" + }, + { + "Level": "20", + "Move": "MOVE_SHADOW_CLAW" + }, + { + "Level": "22", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "25", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "28", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "33", + "Move": "MOVE_NIGHT_SLASH" + }, + { + "Level": "39", + "Move": "MOVE_POWER_GEM" + }, + { + "Level": "42", + "Move": "MOVE_ZEN_HEADBUTT" + }, + { + "Level": "45", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "50", + "Move": "MOVE_RECOVER" + }, + { + "Level": "53", + "Move": "MOVE_PARTING_SHOT" + }, + { + "Level": "56", + "Move": "MOVE_PHANTOM_FORCE" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CALM_MIND", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FIRE_PUNCH", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_REFLECT", + "MOVE_ROCK_TOMB", + "MOVE_SAFEGUARD", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_WILL_O_WISP", + "MOVE_X_SCISSOR" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MAWILE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "1", + "Move": "MOVE_FAIRY_WIND" + }, + { + "Level": "5", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "16", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "20", + "Move": "MOVE_CHARM" + }, + { + "Level": "22", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "24", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "28", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "36", + "Move": "MOVE_IRON_HEAD" + }, + { + "Level": "40", + "Move": "MOVE_TAUNT" + }, + { + "Level": "48", + "Move": "MOVE_PLAY_ROUGH" + }, + { + "Level": "55", + "Move": "MOVE_DYNAMIC_PUNCH" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FLAMETHROWER", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_BALL", + "MOVE_SLUDGE_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "ARON": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_SCREECH" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "4", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "8", + "Move": "MOVE_ROCK_TOMB" + }, + { + "Level": "12", + "Move": "MOVE_ROAR" + }, + { + "Level": "16", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "20", + "Move": "MOVE_PROTECT" + }, + { + "Level": "24", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "28", + "Move": "MOVE_IRON_HEAD" + }, + { + "Level": "33", + "Move": "MOVE_METAL_SOUND" + }, + { + "Level": "36", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "44", + "Move": "MOVE_IRON_TAIL" + }, + { + "Level": "48", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "52", + "Move": "MOVE_HEAVY_SLAM" + }, + { + "Level": "56", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "66", + "Move": "MOVE_HEAD_SMASH" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_MUD_SHOT", + "MOVE_SHADOW_CLAW", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "LAIRON": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_SCREECH" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "4", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "8", + "Move": "MOVE_ROCK_TOMB" + }, + { + "Level": "12", + "Move": "MOVE_ROAR" + }, + { + "Level": "16", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "20", + "Move": "MOVE_PROTECT" + }, + { + "Level": "24", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "28", + "Move": "MOVE_IRON_HEAD" + }, + { + "Level": "33", + "Move": "MOVE_METAL_SOUND" + }, + { + "Level": "36", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "44", + "Move": "MOVE_IRON_TAIL" + }, + { + "Level": "48", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "52", + "Move": "MOVE_HEAVY_SLAM" + }, + { + "Level": "56", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "66", + "Move": "MOVE_HEAD_SMASH" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_MUD_SHOT", + "MOVE_SHADOW_CLAW", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "AGGRON": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_SCREECH" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "4", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "8", + "Move": "MOVE_ROCK_TOMB" + }, + { + "Level": "12", + "Move": "MOVE_ROAR" + }, + { + "Level": "16", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "20", + "Move": "MOVE_PROTECT" + }, + { + "Level": "24", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "28", + "Move": "MOVE_IRON_HEAD" + }, + { + "Level": "33", + "Move": "MOVE_METAL_SOUND" + }, + { + "Level": "36", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "44", + "Move": "MOVE_IRON_TAIL" + }, + { + "Level": "48", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "52", + "Move": "MOVE_HEAVY_SLAM" + }, + { + "Level": "56", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "66", + "Move": "MOVE_HEAD_SMASH" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_MUD_SHOT", + "MOVE_OUTRAGE", + "MOVE_SHADOW_CLAW", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_WHIRLPOOL" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MEDITITE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "1", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "9", + "Move": "MOVE_DETECT" + }, + { + "Level": "12", + "Move": "MOVE_ENDURE" + }, + { + "Level": "14", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "16", + "Move": "MOVE_BULLET_PUNCH" + }, + { + "Level": "20", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "23", + "Move": "MOVE_CALM_MIND" + }, + { + "Level": "25", + "Move": "MOVE_ZEN_HEADBUTT" + }, + { + "Level": "30", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "41", + "Move": "MOVE_RECOVER" + }, + { + "Level": "52", + "Move": "MOVE_DYNAMIC_PUNCH" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CLOSE_COMBAT", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_ICE_PUNCH", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THUNDER_PUNCH" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MEDICHAM": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "1", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "9", + "Move": "MOVE_DETECT" + }, + { + "Level": "12", + "Move": "MOVE_ENDURE" + }, + { + "Level": "14", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "16", + "Move": "MOVE_BULLET_PUNCH" + }, + { + "Level": "20", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "23", + "Move": "MOVE_CALM_MIND" + }, + { + "Level": "25", + "Move": "MOVE_ZEN_HEADBUTT" + }, + { + "Level": "30", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "34", + "Move": "MOVE_AGILITY" + }, + { + "Level": "41", + "Move": "MOVE_RECOVER" + }, + { + "Level": "52", + "Move": "MOVE_DYNAMIC_PUNCH" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CLOSE_COMBAT", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT" + ], + "TutorMoves": [ + "MOVE_FIRE_PUNCH", + "MOVE_ICE_PUNCH", + "MOVE_THUNDER_PUNCH" + ], + "EggMoves": [] + }, + "ELECTRIKE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "8", + "Move": "MOVE_THUNDER_SHOCK" + }, + { + "Level": "12", + "Move": "MOVE_THUNDER_WAVE" + }, + { + "Level": "16", + "Move": "MOVE_SPARK" + }, + { + "Level": "20", + "Move": "MOVE_BITE" + }, + { + "Level": "22", + "Move": "MOVE_EERIE_IMPULSE" + }, + { + "Level": "24", + "Move": "MOVE_THUNDER_FANG" + }, + { + "Level": "28", + "Move": "MOVE_ROAR" + }, + { + "Level": "30", + "Move": "MOVE_SNARL" + }, + { + "Level": "36", + "Move": "MOVE_CHARGE" + }, + { + "Level": "40", + "Move": "MOVE_THUNDERBOLT" + }, + { + "Level": "44", + "Move": "MOVE_WILD_CHARGE" + }, + { + "Level": "50", + "Move": "MOVE_THUNDER" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DISCHARGE", + "MOVE_ENDURE", + "MOVE_FIRE_FANG", + "MOVE_FLAMETHROWER", + "MOVE_HEADBUTT", + "MOVE_ICE_FANG", + "MOVE_LIGHT_SCREEN", + "MOVE_PROTECT", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_VOLT_SWITCH" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MANECTRIC": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "1", + "Move": "MOVE_FIRE_FANG" + }, + { + "Level": "8", + "Move": "MOVE_THUNDER_SHOCK" + }, + { + "Level": "12", + "Move": "MOVE_THUNDER_WAVE" + }, + { + "Level": "16", + "Move": "MOVE_SPARK" + }, + { + "Level": "20", + "Move": "MOVE_BITE" + }, + { + "Level": "22", + "Move": "MOVE_EERIE_IMPULSE" + }, + { + "Level": "24", + "Move": "MOVE_THUNDER_FANG" + }, + { + "Level": "28", + "Move": "MOVE_ROAR" + }, + { + "Level": "30", + "Move": "MOVE_SNARL" + }, + { + "Level": "36", + "Move": "MOVE_CHARGE" + }, + { + "Level": "40", + "Move": "MOVE_THUNDERBOLT" + }, + { + "Level": "44", + "Move": "MOVE_WILD_CHARGE" + }, + { + "Level": "50", + "Move": "MOVE_THUNDER" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DISCHARGE", + "MOVE_ENDURE", + "MOVE_FLAMETHROWER", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_LIGHT_SCREEN", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_VOLT_SWITCH" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "ROSELIA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_ABSORB" + }, + { + "Level": "1", + "Move": "MOVE_GROWTH" + }, + { + "Level": "1", + "Move": "MOVE_STUN_SPORE" + }, + { + "Level": "1", + "Move": "MOVE_CHARM" + }, + { + "Level": "5", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "8", + "Move": "MOVE_PIN_MISSILE" + }, + { + "Level": "10", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "15", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "18", + "Move": "MOVE_SLEEP_POWDER" + }, + { + "Level": "22", + "Move": "MOVE_TOXIC_SPIKES" + }, + { + "Level": "30", + "Move": "MOVE_GIGA_DRAIN" + }, + { + "Level": "33", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "37", + "Move": "MOVE_SYNTHESIS" + }, + { + "Level": "44", + "Move": "MOVE_TOXIC" + }, + { + "Level": "55", + "Move": "MOVE_LEAF_STORM" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_DAZZLING_GLEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_SHADOW_BALL", + "MOVE_SLUDGE_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE" + ], + "TutorMoves": [ + "MOVE_POISON_STING" + ], + "EggMoves": [] + }, + "CARVANHA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_AQUA_JET" + }, + { + "Level": "8", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "16", + "Move": "MOVE_BITE" + }, + { + "Level": "20", + "Move": "MOVE_FLIP_TURN" + }, + { + "Level": "24", + "Move": "MOVE_SCREECH" + }, + { + "Level": "32", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "40", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "44", + "Move": "MOVE_LIQUIDATION" + }, + { + "Level": "51", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "54", + "Move": "MOVE_DOUBLE_EDGE" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BLIZZARD", + "MOVE_DARK_PULSE", + "MOVE_ENDURE", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICY_WIND", + "MOVE_PROTECT", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_WATERFALL", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SHARPEDO": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_NIGHT_SLASH" + }, + { + "Level": "1", + "Move": "MOVE_AQUA_JET" + }, + { + "Level": "8", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "16", + "Move": "MOVE_BITE" + }, + { + "Level": "20", + "Move": "MOVE_FLIP_TURN" + }, + { + "Level": "24", + "Move": "MOVE_SCREECH" + }, + { + "Level": "32", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "36", + "Move": "MOVE_AGILITY" + }, + { + "Level": "40", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "44", + "Move": "MOVE_LIQUIDATION" + }, + { + "Level": "51", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "54", + "Move": "MOVE_DOUBLE_EDGE" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_CLOSE_COMBAT", + "MOVE_DARK_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_GIGA_IMPACT", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICY_WIND", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_ROCK_TOMB", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_WATERFALL", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_SLASH" + ], + "EggMoves": [] + }, + "NUMEL": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "5", + "Move": "MOVE_EMBER" + }, + { + "Level": "8", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "12", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "19", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "22", + "Move": "MOVE_LAVA_PLUME" + }, + { + "Level": "26", + "Move": "MOVE_EARTH_POWER" + }, + { + "Level": "29", + "Move": "MOVE_CURSE" + }, + { + "Level": "31", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "40", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "46", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "51", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "55", + "Move": "MOVE_HEAT_CRASH" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLARE_BLITZ", + "MOVE_FLASH_CANNON", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_IRON_HEAD", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "CAMERUPT": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "5", + "Move": "MOVE_EMBER" + }, + { + "Level": "8", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "12", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "19", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "22", + "Move": "MOVE_LAVA_PLUME" + }, + { + "Level": "26", + "Move": "MOVE_EARTH_POWER" + }, + { + "Level": "29", + "Move": "MOVE_CURSE" + }, + { + "Level": "31", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "40", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "46", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "51", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "55", + "Move": "MOVE_HEAT_CRASH" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLARE_BLITZ", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_TOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_ROCK_SLIDE" + ], + "EggMoves": [] + }, + "SWABLU": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_PECK" + }, + { + "Level": "4", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "8", + "Move": "MOVE_MIST" + }, + { + "Level": "20", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "24", + "Move": "MOVE_SAFEGUARD" + }, + { + "Level": "32", + "Move": "MOVE_COTTON_GUARD" + }, + { + "Level": "35", + "Move": "MOVE_TWISTER" + }, + { + "Level": "37", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "40", + "Move": "MOVE_MOONBLAST" + }, + { + "Level": "44", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "50", + "Move": "MOVE_BRAVE_BIRD" + }, + { + "Level": "55", + "Move": "MOVE_DRAGON_RUSH" + }, + { + "Level": "60", + "Move": "MOVE_PERISH_SONG" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_DAZZLING_GLEAM", + "MOVE_DRAGON_PULSE", + "MOVE_ENDURE", + "MOVE_FLY", + "MOVE_HEAT_WAVE", + "MOVE_HURRICANE", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_OUTRAGE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "ALTARIA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_PECK" + }, + { + "Level": "4", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "8", + "Move": "MOVE_MIST" + }, + { + "Level": "20", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "24", + "Move": "MOVE_SAFEGUARD" + }, + { + "Level": "32", + "Move": "MOVE_COTTON_GUARD" + }, + { + "Level": "35", + "Move": "MOVE_TWISTER" + }, + { + "Level": "37", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "40", + "Move": "MOVE_MOONBLAST" + }, + { + "Level": "44", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "50", + "Move": "MOVE_BRAVE_BIRD" + }, + { + "Level": "55", + "Move": "MOVE_DRAGON_RUSH" + }, + { + "Level": "60", + "Move": "MOVE_PERISH_SONG" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CLAW", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLY", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_WAVE", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_OUTRAGE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [ + "MOVE_DRAGON_PULSE" + ], + "EggMoves": [] + }, + "SHUPPET": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_SCREECH" + }, + { + "Level": "1", + "Move": "MOVE_LICK" + }, + { + "Level": "8", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "12", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "16", + "Move": "MOVE_WILL_O_WISP" + }, + { + "Level": "19", + "Move": "MOVE_SHADOW_SNEAK" + }, + { + "Level": "23", + "Move": "MOVE_SHADOW_CLAW" + }, + { + "Level": "26", + "Move": "MOVE_CURSE" + }, + { + "Level": "30", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "34", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "42", + "Move": "MOVE_PHANTOM_FORCE" + }, + { + "Level": "48", + "Move": "MOVE_GUNK_SHOT" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_ENDURE", + "MOVE_HEADBUTT", + "MOVE_METRONOME", + "MOVE_NASTY_PLOT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "BANETTE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_SCREECH" + }, + { + "Level": "1", + "Move": "MOVE_LICK" + }, + { + "Level": "1", + "Move": "MOVE_SLASH" + }, + { + "Level": "8", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "12", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "16", + "Move": "MOVE_WILL_O_WISP" + }, + { + "Level": "19", + "Move": "MOVE_SHADOW_SNEAK" + }, + { + "Level": "23", + "Move": "MOVE_SHADOW_CLAW" + }, + { + "Level": "26", + "Move": "MOVE_CURSE" + }, + { + "Level": "30", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "34", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "42", + "Move": "MOVE_PHANTOM_FORCE" + }, + { + "Level": "48", + "Move": "MOVE_GUNK_SHOT" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_ENDURE", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_METRONOME", + "MOVE_NASTY_PLOT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "ABSOL": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "10", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "15", + "Move": "MOVE_DETECT" + }, + { + "Level": "20", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "23", + "Move": "MOVE_SLASH" + }, + { + "Level": "27", + "Move": "MOVE_NIGHT_SLASH" + }, + { + "Level": "32", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "36", + "Move": "MOVE_TAUNT" + }, + { + "Level": "40", + "Move": "MOVE_SHADOW_CLAW" + }, + { + "Level": "43", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "46", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "48", + "Move": "MOVE_FUTURE_SIGHT" + }, + { + "Level": "54", + "Move": "MOVE_PERISH_SONG" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_BALL", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_WILL_O_WISP", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SNORUNT": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "10", + "Move": "MOVE_ICE_SHARD" + }, + { + "Level": "15", + "Move": "MOVE_PROTECT" + }, + { + "Level": "20", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "25", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "30", + "Move": "MOVE_ICE_FANG" + }, + { + "Level": "35", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "40", + "Move": "MOVE_ICICLE_CRASH" + }, + { + "Level": "45", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "50", + "Move": "MOVE_BLIZZARD" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_ENDURE", + "MOVE_ICE_BEAM", + "MOVE_LIGHT_SCREEN", + "MOVE_SHADOW_BALL", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_WATER_PULSE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GLALIE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "10", + "Move": "MOVE_ICE_SHARD" + }, + { + "Level": "15", + "Move": "MOVE_PROTECT" + }, + { + "Level": "20", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "25", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "30", + "Move": "MOVE_ICE_FANG" + }, + { + "Level": "35", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "40", + "Move": "MOVE_ICICLE_CRASH" + }, + { + "Level": "45", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "50", + "Move": "MOVE_BLIZZARD" + }, + { + "Level": "55", + "Move": "MOVE_EXPLOSION" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_DARK_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_IRON_HEAD", + "MOVE_LIGHT_SCREEN", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_WATER_PULSE" + ], + "TutorMoves": [ + "MOVE_FREEZE_DRY" + ], + "EggMoves": [] + }, + "BAGON": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "1", + "Move": "MOVE_EMBER" + }, + { + "Level": "10", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "15", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "25", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "30", + "Move": "MOVE_DRAGON_CLAW" + }, + { + "Level": "35", + "Move": "MOVE_ZEN_HEADBUTT" + }, + { + "Level": "40", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "45", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "50", + "Move": "MOVE_OUTRAGE" + }, + { + "Level": "55", + "Move": "MOVE_DOUBLE_EDGE" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_PULSE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_VOICE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER_FANG" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SHELGON": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "1", + "Move": "MOVE_EMBER" + }, + { + "Level": "10", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "15", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "25", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "30", + "Move": "MOVE_DRAGON_CLAW" + }, + { + "Level": "35", + "Move": "MOVE_ZEN_HEADBUTT" + }, + { + "Level": "40", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "45", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "50", + "Move": "MOVE_OUTRAGE" + }, + { + "Level": "55", + "Move": "MOVE_DOUBLE_EDGE" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_PULSE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_VOICE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER_FANG" + ], + "TutorMoves": [ + "MOVE_PROTECT" + ], + "EggMoves": [] + }, + "SALAMENCE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "1", + "Move": "MOVE_EMBER" + }, + { + "Level": "1", + "Move": "MOVE_PROTECT" + }, + { + "Level": "10", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "15", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "25", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "30", + "Move": "MOVE_DRAGON_CLAW" + }, + { + "Level": "35", + "Move": "MOVE_ZEN_HEADBUTT" + }, + { + "Level": "40", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "45", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "50", + "Move": "MOVE_OUTRAGE" + }, + { + "Level": "55", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "60", + "Move": "MOVE_AIR_SLASH" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_GIGA_IMPACT", + "MOVE_HURRICANE", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER_FANG" + ], + "TutorMoves": [ + "MOVE_FLY" + ], + "EggMoves": [] + }, + "BELDUM": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_HEADBUTT", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "METANG": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_BULLET_PUNCH" + }, + { + "Level": "6", + "Move": "MOVE_ZEN_HEADBUTT" + }, + { + "Level": "18", + "Move": "MOVE_FLASH_CANNON" + }, + { + "Level": "26", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "34", + "Move": "MOVE_PSYCHO_CUT" + }, + { + "Level": "42", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "50", + "Move": "MOVE_IRON_HEAD" + }, + { + "Level": "54", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "58", + "Move": "MOVE_HYPER_BEAM" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_HEADBUTT", + "MOVE_ICE_PUNCH", + "MOVE_LIGHT_SCREEN", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SLUDGE_BOMB", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER_PUNCH" + ], + "TutorMoves": [ + "MOVE_CONFUSION", + "MOVE_METAL_CLAW" + ], + "EggMoves": [] + }, + "METAGROSS": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "1", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "1", + "Move": "MOVE_BULLET_PUNCH" + }, + { + "Level": "6", + "Move": "MOVE_ZEN_HEADBUTT" + }, + { + "Level": "18", + "Move": "MOVE_FLASH_CANNON" + }, + { + "Level": "26", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "34", + "Move": "MOVE_PSYCHO_CUT" + }, + { + "Level": "42", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "46", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "50", + "Move": "MOVE_IRON_HEAD" + }, + { + "Level": "54", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "58", + "Move": "MOVE_HYPER_BEAM" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SLUDGE_BOMB", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER_PUNCH" + ], + "TutorMoves": [ + "MOVE_EXPLOSION", + "MOVE_HEAVY_SLAM" + ], + "EggMoves": [] + }, + "BUDEW": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_ABSORB" + }, + { + "Level": "1", + "Move": "MOVE_GROWTH" + }, + { + "Level": "1", + "Move": "MOVE_STUN_SPORE" + }, + { + "Level": "1", + "Move": "MOVE_CHARM" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_DAZZLING_GLEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_SHADOW_BALL", + "MOVE_SLUDGE_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "ROSERADE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_ABSORB" + }, + { + "Level": "1", + "Move": "MOVE_GROWTH" + }, + { + "Level": "1", + "Move": "MOVE_STUN_SPORE" + }, + { + "Level": "1", + "Move": "MOVE_CHARM" + }, + { + "Level": "5", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "8", + "Move": "MOVE_PIN_MISSILE" + }, + { + "Level": "10", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "15", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "18", + "Move": "MOVE_SLEEP_POWDER" + }, + { + "Level": "22", + "Move": "MOVE_TOXIC_SPIKES" + }, + { + "Level": "30", + "Move": "MOVE_GIGA_DRAIN" + }, + { + "Level": "34", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "37", + "Move": "MOVE_SYNTHESIS" + }, + { + "Level": "44", + "Move": "MOVE_TOXIC" + }, + { + "Level": "55", + "Move": "MOVE_LEAF_STORM" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_DAZZLING_GLEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_SHADOW_BALL", + "MOVE_SLUDGE_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE" + ], + "TutorMoves": [ + "MOVE_POISON_STING" + ], + "EggMoves": [] + }, + "BUNEARY": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_SPLASH" + }, + { + "Level": "14", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "16", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "20", + "Move": "MOVE_AGILITY" + }, + { + "Level": "24", + "Move": "MOVE_CHARM" + }, + { + "Level": "28", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "32", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "42", + "Move": "MOVE_COTTON_GUARD" + }, + { + "Level": "48", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "52", + "Move": "MOVE_DYNAMIC_PUNCH" + } + ], + "TMMoves": [ + "MOVE_CLOSE_COMBAT", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FIRE_PUNCH", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_SHADOW_BALL", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "LOPUNNY": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_SPLASH" + }, + { + "Level": "6", + "Move": "MOVE_POWER_UP_PUNCH" + }, + { + "Level": "9", + "Move": "MOVE_MACH_PUNCH" + }, + { + "Level": "12", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "14", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "16", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "20", + "Move": "MOVE_AGILITY" + }, + { + "Level": "24", + "Move": "MOVE_CHARM" + }, + { + "Level": "28", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "32", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "36", + "Move": "MOVE_IRON_TAIL" + }, + { + "Level": "42", + "Move": "MOVE_COTTON_GUARD" + }, + { + "Level": "48", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "52", + "Move": "MOVE_DYNAMIC_PUNCH" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_CLOSE_COMBAT", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_SHADOW_BALL", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_U_TURN", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GIBLE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_SAND_TOMB" + }, + { + "Level": "12", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "18", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "25", + "Move": "MOVE_BITE" + }, + { + "Level": "30", + "Move": "MOVE_SLASH" + }, + { + "Level": "36", + "Move": "MOVE_DRAGON_CLAW" + }, + { + "Level": "42", + "Move": "MOVE_DIG" + }, + { + "Level": "54", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "60", + "Move": "MOVE_DRAGON_RUSH" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FLAMETHROWER", + "MOVE_IRON_HEAD", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_THUNDER_FANG" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GABITE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_SAND_TOMB" + }, + { + "Level": "12", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "18", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "25", + "Move": "MOVE_BITE" + }, + { + "Level": "30", + "Move": "MOVE_SLASH" + }, + { + "Level": "36", + "Move": "MOVE_DRAGON_CLAW" + }, + { + "Level": "42", + "Move": "MOVE_DIG" + }, + { + "Level": "54", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "60", + "Move": "MOVE_DRAGON_RUSH" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CRUNCH", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FLAMETHROWER", + "MOVE_IRON_HEAD", + "MOVE_OUTRAGE", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_THUNDER_FANG" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GARCHOMP": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_SAND_TOMB" + }, + { + "Level": "12", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "18", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "25", + "Move": "MOVE_BITE" + }, + { + "Level": "30", + "Move": "MOVE_SLASH" + }, + { + "Level": "36", + "Move": "MOVE_DRAGON_CLAW" + }, + { + "Level": "42", + "Move": "MOVE_DIG" + }, + { + "Level": "54", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "60", + "Move": "MOVE_DRAGON_RUSH" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FLAMETHROWER", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LIQUIDATION", + "MOVE_OUTRAGE", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_THUNDER_FANG" + ], + "TutorMoves": [ + "MOVE_CRUNCH" + ], + "EggMoves": [] + }, + "RIOLU": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "1", + "Move": "MOVE_ENDURE" + }, + { + "Level": "1", + "Move": "MOVE_BULLET_PUNCH" + }, + { + "Level": "8", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "16", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "20", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "24", + "Move": "MOVE_SCREECH" + }, + { + "Level": "24", + "Move": "MOVE_DETECT" + }, + { + "Level": "28", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "35", + "Move": "MOVE_SWORDS_DANCE" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CLOSE_COMBAT", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_FOCUS_BLAST", + "MOVE_ICE_PUNCH", + "MOVE_NASTY_PLOT", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER_PUNCH", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "LUCARIO": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "1", + "Move": "MOVE_PROTECT" + }, + { + "Level": "1", + "Move": "MOVE_ENDURE" + }, + { + "Level": "1", + "Move": "MOVE_BULLET_PUNCH" + }, + { + "Level": "8", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "16", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "20", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "24", + "Move": "MOVE_SCREECH" + }, + { + "Level": "25", + "Move": "MOVE_AURA_SPHERE" + }, + { + "Level": "28", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "32", + "Move": "MOVE_METAL_SOUND" + }, + { + "Level": "35", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "38", + "Move": "MOVE_DRAGON_PULSE" + }, + { + "Level": "45", + "Move": "MOVE_EXTREME_SPEED" + }, + { + "Level": "54", + "Move": "MOVE_CLOSE_COMBAT" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CALM_MIND", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_TAIL", + "MOVE_METRONOME", + "MOVE_NASTY_PLOT", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PSYCHIC", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER_PUNCH", + "MOVE_WATER_PULSE", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_DETECT" + ], + "EggMoves": [] + }, + "HIPPOPOTAS": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "4", + "Move": "MOVE_BITE" + }, + { + "Level": "8", + "Move": "MOVE_CURSE" + }, + { + "Level": "12", + "Move": "MOVE_SAND_TOMB" + }, + { + "Level": "16", + "Move": "MOVE_DIG" + }, + { + "Level": "20", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "24", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "28", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "32", + "Move": "MOVE_ROAR" + }, + { + "Level": "40", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "44", + "Move": "MOVE_DOUBLE_EDGE" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FIRE_FANG", + "MOVE_ICE_FANG", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER_FANG", + "MOVE_WHIRLWIND" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "HIPPOWDON": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "12", + "Move": "MOVE_SAND_TOMB" + }, + { + "Level": "16", + "Move": "MOVE_DIG" + }, + { + "Level": "20", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "24", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "28", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "32", + "Move": "MOVE_ROAR" + }, + { + "Level": "36", + "Move": "MOVE_HEAVY_SLAM" + }, + { + "Level": "40", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "44", + "Move": "MOVE_DOUBLE_EDGE" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_CURSE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FIRE_FANG", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_IRON_HEAD", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER_FANG", + "MOVE_WHIRLWIND" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SNOVER": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_LEAFAGE" + }, + { + "Level": "10", + "Move": "MOVE_MIST" + }, + { + "Level": "15", + "Move": "MOVE_ICE_SHARD" + }, + { + "Level": "20", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "25", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "30", + "Move": "MOVE_GROWTH" + }, + { + "Level": "35", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "41", + "Move": "MOVE_WOOD_HAMMER" + }, + { + "Level": "45", + "Move": "MOVE_BLIZZARD" + }, + { + "Level": "53", + "Move": "MOVE_LEAF_STORM" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_GIGA_DRAIN", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_MAGICAL_LEAF", + "MOVE_PROTECT", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_WATER_PULSE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "ABOMASNOW": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_LEAFAGE" + }, + { + "Level": "10", + "Move": "MOVE_MIST" + }, + { + "Level": "15", + "Move": "MOVE_ICE_SHARD" + }, + { + "Level": "20", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "25", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "30", + "Move": "MOVE_GROWTH" + }, + { + "Level": "35", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "41", + "Move": "MOVE_WOOD_HAMMER" + }, + { + "Level": "45", + "Move": "MOVE_BLIZZARD" + }, + { + "Level": "53", + "Move": "MOVE_LEAF_STORM" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLET_SEED", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_MAGICAL_LEAF", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_WATER_PULSE" + ], + "TutorMoves": [ + "MOVE_ICE_PUNCH" + ], + "EggMoves": [] + }, + "LEAFEON": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "10", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "15", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "20", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "25", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "30", + "Move": "MOVE_SYNTHESIS" + }, + { + "Level": "35", + "Move": "MOVE_LEAF_BLADE" + }, + { + "Level": "40", + "Move": "MOVE_GIGA_DRAIN" + }, + { + "Level": "45", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "50", + "Move": "MOVE_LEAF_STORM" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_CALM_MIND", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_SHADOW_BALL", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_X_SCISSOR" + ], + "TutorMoves": [ + "MOVE_CHARM", + "MOVE_DOUBLE_EDGE", + "MOVE_RAZOR_LEAF", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_WISH" + ], + "EggMoves": [] + }, + "GLACEON": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "10", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "15", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "18", + "Move": "MOVE_MIST" + }, + { + "Level": "23", + "Move": "MOVE_ICE_SHARD" + }, + { + "Level": "27", + "Move": "MOVE_ICE_FANG" + }, + { + "Level": "36", + "Move": "MOVE_ICE_BEAM" + }, + { + "Level": "40", + "Move": "MOVE_FREEZE_DRY" + }, + { + "Level": "50", + "Move": "MOVE_BLIZZARD" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT" + ], + "TutorMoves": [ + "MOVE_CHARM", + "MOVE_DOUBLE_EDGE", + "MOVE_ICY_WIND", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_WISH" + ], + "EggMoves": [] + }, + "GALLADE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "1", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "1", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "6", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "15", + "Move": "MOVE_TELEPORT" + }, + { + "Level": "18", + "Move": "MOVE_AERIAL_ACE" + }, + { + "Level": "28", + "Move": "MOVE_PROTECT" + }, + { + "Level": "30", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "35", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "42", + "Move": "MOVE_PSYCHO_CUT" + }, + { + "Level": "50", + "Move": "MOVE_LEAF_BLADE" + }, + { + "Level": "58", + "Move": "MOVE_CLOSE_COMBAT" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_AURA_SPHERE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_DAZZLING_GLEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FIRE_PUNCH", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_ROCK_TOMB", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_WILL_O_WISP", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFUSE_RAY", + "MOVE_DRAINING_KISS", + "MOVE_FUTURE_SIGHT", + "MOVE_MAGICAL_LEAF", + "MOVE_MYSTICAL_FIRE", + "MOVE_NIGHT_SLASH", + "MOVE_PSYCHIC", + "MOVE_SLASH" + ], + "EggMoves": [] + }, + "FROSLASS": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "1", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "10", + "Move": "MOVE_ICE_SHARD" + }, + { + "Level": "15", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "20", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "25", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "30", + "Move": "MOVE_HAZE" + }, + { + "Level": "35", + "Move": "MOVE_ICE_BEAM" + }, + { + "Level": "40", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "45", + "Move": "MOVE_WILL_O_WISP" + }, + { + "Level": "50", + "Move": "MOVE_BLIZZARD" + }, + { + "Level": "55", + "Move": "MOVE_PHANTOM_FORCE" + }, + { + "Level": "60", + "Move": "MOVE_CURSE" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_ENDURE", + "MOVE_GIGA_IMPACT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_LIGHT_SCREEN", + "MOVE_NASTY_PLOT", + "MOVE_PSYCHIC", + "MOVE_REFLECT", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_WATER_PULSE" + ], + "TutorMoves": [ + "MOVE_CRUNCH", + "MOVE_DRAINING_KISS", + "MOVE_ICE_FANG", + "MOVE_ICICLE_CRASH", + "MOVE_PROTECT" + ], + "EggMoves": [] + }, + "TEPIG": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "6", + "Move": "MOVE_EMBER" + }, + { + "Level": "10", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "13", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "15", + "Move": "MOVE_FLAME_WHEEL" + }, + { + "Level": "20", + "Move": "MOVE_FIRE_SPIN" + }, + { + "Level": "24", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "29", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "32", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "50", + "Move": "MOVE_FLARE_BLITZ" + }, + { + "Level": "56", + "Move": "MOVE_HEAD_SMASH" + } + ], + "TMMoves": [ + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "PIGNITE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "6", + "Move": "MOVE_EMBER" + }, + { + "Level": "10", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "13", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "15", + "Move": "MOVE_FLAME_WHEEL" + }, + { + "Level": "20", + "Move": "MOVE_FIRE_SPIN" + }, + { + "Level": "24", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "29", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "32", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "36", + "Move": "MOVE_BULK_UP" + }, + { + "Level": "50", + "Move": "MOVE_FLARE_BLITZ" + }, + { + "Level": "56", + "Move": "MOVE_HEAD_SMASH" + } + ], + "TMMoves": [ + "MOVE_BRICK_BREAK", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_KNOCK_OFF", + "MOVE_OVERHEAT", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_POWER_UP_PUNCH" + ], + "EggMoves": [] + }, + "EMBOAR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "6", + "Move": "MOVE_EMBER" + }, + { + "Level": "10", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "13", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "15", + "Move": "MOVE_FLAME_WHEEL" + }, + { + "Level": "20", + "Move": "MOVE_FIRE_SPIN" + }, + { + "Level": "24", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "29", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "32", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "36", + "Move": "MOVE_BULK_UP" + }, + { + "Level": "45", + "Move": "MOVE_CLOSE_COMBAT" + }, + { + "Level": "50", + "Move": "MOVE_FLARE_BLITZ" + }, + { + "Level": "56", + "Move": "MOVE_HEAD_SMASH" + } + ], + "TMMoves": [ + "MOVE_BRICK_BREAK", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_OVERHEAT", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THUNDER_PUNCH", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_HEAT_CRASH", + "MOVE_POWER_UP_PUNCH" + ], + "EggMoves": [] + }, + "PATRAT": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "3", + "Move": "MOVE_LEER" + }, + { + "Level": "6", + "Move": "MOVE_BITE" + }, + { + "Level": "11", + "Move": "MOVE_DETECT" + }, + { + "Level": "16", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "18", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "21", + "Move": "MOVE_SUPER_FANG" + }, + { + "Level": "26", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "28", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "33", + "Move": "MOVE_NASTY_PLOT" + } + ], + "TMMoves": [ + "MOVE_BULLET_SEED", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_GUNK_SHOT", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "WATCHOG": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "3", + "Move": "MOVE_LEER" + }, + { + "Level": "6", + "Move": "MOVE_BITE" + }, + { + "Level": "11", + "Move": "MOVE_DETECT" + }, + { + "Level": "16", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "18", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "21", + "Move": "MOVE_SUPER_FANG" + }, + { + "Level": "26", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "28", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "33", + "Move": "MOVE_NASTY_PLOT" + }, + { + "Level": "40", + "Move": "MOVE_IRON_TAIL" + }, + { + "Level": "46", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "50", + "Move": "MOVE_DOUBLE_EDGE" + } + ], + "TMMoves": [ + "MOVE_BULLET_SEED", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_LIGHT_SCREEN", + "MOVE_MUD_SHOT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_ROCK_SMASH", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_CONFUSE_RAY" + ], + "EggMoves": [] + }, + "PANSAGE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "1", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "4", + "Move": "MOVE_LEER" + }, + { + "Level": "7", + "Move": "MOVE_LICK" + }, + { + "Level": "10", + "Move": "MOVE_VINE_WHIP" + }, + { + "Level": "16", + "Move": "MOVE_BULLET_SEED" + }, + { + "Level": "19", + "Move": "MOVE_BITE" + }, + { + "Level": "22", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "28", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "32", + "Move": "MOVE_LEAF_STORM" + }, + { + "Level": "36", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "43", + "Move": "MOVE_FOCUS_BLAST" + } + ], + "TMMoves": [ + "MOVE_BRICK_BREAK", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_GIGA_DRAIN", + "MOVE_GUNK_SHOT", + "MOVE_IRON_TAIL", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_TOXIC" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SIMISAGE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "1", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "4", + "Move": "MOVE_LEER" + }, + { + "Level": "7", + "Move": "MOVE_LICK" + }, + { + "Level": "10", + "Move": "MOVE_VINE_WHIP" + }, + { + "Level": "16", + "Move": "MOVE_BULLET_SEED" + }, + { + "Level": "19", + "Move": "MOVE_BITE" + }, + { + "Level": "22", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "28", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "32", + "Move": "MOVE_LEAF_STORM" + }, + { + "Level": "36", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "43", + "Move": "MOVE_FOCUS_BLAST" + } + ], + "TMMoves": [ + "MOVE_BRICK_BREAK", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_TOXIC" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "PANSEAR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_FIRE_SPIN" + }, + { + "Level": "1", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "4", + "Move": "MOVE_LEER" + }, + { + "Level": "7", + "Move": "MOVE_LICK" + }, + { + "Level": "10", + "Move": "MOVE_EMBER" + }, + { + "Level": "16", + "Move": "MOVE_FLAME_WHEEL" + }, + { + "Level": "19", + "Move": "MOVE_BITE" + }, + { + "Level": "25", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "28", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "32", + "Move": "MOVE_FIRE_BLAST" + }, + { + "Level": "36", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "43", + "Move": "MOVE_FOCUS_BLAST" + } + ], + "TMMoves": [ + "MOVE_BRICK_BREAK", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLARE_BLITZ", + "MOVE_GUNK_SHOT", + "MOVE_HEAT_WAVE", + "MOVE_IRON_TAIL", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_OVERHEAT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SIMISEAR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_FIRE_SPIN" + }, + { + "Level": "1", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "4", + "Move": "MOVE_LEER" + }, + { + "Level": "7", + "Move": "MOVE_LICK" + }, + { + "Level": "10", + "Move": "MOVE_EMBER" + }, + { + "Level": "16", + "Move": "MOVE_FLAME_WHEEL" + }, + { + "Level": "19", + "Move": "MOVE_BITE" + }, + { + "Level": "25", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "28", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "32", + "Move": "MOVE_FIRE_BLAST" + }, + { + "Level": "36", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "43", + "Move": "MOVE_FOCUS_BLAST" + } + ], + "TMMoves": [ + "MOVE_BRICK_BREAK", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLARE_BLITZ", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HEAT_WAVE", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_OVERHEAT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "PANPOUR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_AQUA_RING" + }, + { + "Level": "1", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "4", + "Move": "MOVE_LEER" + }, + { + "Level": "7", + "Move": "MOVE_LICK" + }, + { + "Level": "10", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "16", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "19", + "Move": "MOVE_BITE" + }, + { + "Level": "25", + "Move": "MOVE_TAUNT" + }, + { + "Level": "28", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "32", + "Move": "MOVE_HYDRO_PUMP" + }, + { + "Level": "36", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "43", + "Move": "MOVE_FOCUS_BLAST" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FLIP_TURN", + "MOVE_GUNK_SHOT", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_WATERFALL" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SIMIPOUR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_AQUA_RING" + }, + { + "Level": "1", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "4", + "Move": "MOVE_LEER" + }, + { + "Level": "7", + "Move": "MOVE_LICK" + }, + { + "Level": "10", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "16", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "19", + "Move": "MOVE_BITE" + }, + { + "Level": "25", + "Move": "MOVE_TAUNT" + }, + { + "Level": "28", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "32", + "Move": "MOVE_HYDRO_PUMP" + }, + { + "Level": "36", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "43", + "Move": "MOVE_FOCUS_BLAST" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FLIP_TURN", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIQUIDATION", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_WATERFALL" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "DRILBUR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "7", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "13", + "Move": "MOVE_SAND_TOMB" + }, + { + "Level": "18", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "24", + "Move": "MOVE_SLASH" + }, + { + "Level": "28", + "Move": "MOVE_DIG" + }, + { + "Level": "32", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "36", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "40", + "Move": "MOVE_DRILL_RUN" + }, + { + "Level": "46", + "Move": "MOVE_EARTHQUAKE" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BRICK_BREAK", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_IRON_DEFENSE", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SLUDGE_BOMB", + "MOVE_SUBSTITUTE", + "MOVE_X_SCISSOR" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "EXCADRILL": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "7", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "13", + "Move": "MOVE_SAND_TOMB" + }, + { + "Level": "16", + "Move": "MOVE_ROCK_BLAST" + }, + { + "Level": "18", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "24", + "Move": "MOVE_SLASH" + }, + { + "Level": "26", + "Move": "MOVE_X_SCISSOR" + }, + { + "Level": "28", + "Move": "MOVE_DIG" + }, + { + "Level": "32", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "36", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "40", + "Move": "MOVE_DRILL_RUN" + }, + { + "Level": "46", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "50", + "Move": "MOVE_MEGAHORN" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BRICK_BREAK", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SLUDGE_BOMB", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE" + ], + "TutorMoves": [ + "MOVE_METAL_SOUND" + ], + "EggMoves": [] + }, + "AUDINO": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "4", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "8", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "16", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "20", + "Move": "MOVE_ZEN_HEADBUTT" + }, + { + "Level": "24", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "32", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "36", + "Move": "MOVE_WISH" + }, + { + "Level": "40", + "Move": "MOVE_HYPER_VOICE" + }, + { + "Level": "48", + "Move": "MOVE_DOUBLE_EDGE" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "VENIPEDE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_POISON_STING" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "4", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "8", + "Move": "MOVE_PROTECT" + }, + { + "Level": "12", + "Move": "MOVE_INFESTATION" + }, + { + "Level": "16", + "Move": "MOVE_SCREECH" + }, + { + "Level": "20", + "Move": "MOVE_PIN_MISSILE" + }, + { + "Level": "24", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "28", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "36", + "Move": "MOVE_TOXIC" + }, + { + "Level": "48", + "Move": "MOVE_AGILITY" + }, + { + "Level": "52", + "Move": "MOVE_DOUBLE_EDGE" + } + ], + "TMMoves": [ + "MOVE_ENDURE", + "MOVE_IRON_DEFENSE", + "MOVE_ROCK_TOMB", + "MOVE_SLUDGE_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_TOXIC_SPIKES" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "WHIRLIPEDE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_POISON_STING" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "4", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "8", + "Move": "MOVE_PROTECT" + }, + { + "Level": "12", + "Move": "MOVE_INFESTATION" + }, + { + "Level": "16", + "Move": "MOVE_SCREECH" + }, + { + "Level": "20", + "Move": "MOVE_PIN_MISSILE" + }, + { + "Level": "24", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "28", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "36", + "Move": "MOVE_TOXIC" + }, + { + "Level": "48", + "Move": "MOVE_AGILITY" + }, + { + "Level": "52", + "Move": "MOVE_DOUBLE_EDGE" + } + ], + "TMMoves": [ + "MOVE_ENDURE", + "MOVE_IRON_DEFENSE", + "MOVE_ROCK_TOMB", + "MOVE_SLUDGE_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_TOXIC_SPIKES" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SCOLIPEDE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_POISON_STING" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "4", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "8", + "Move": "MOVE_PROTECT" + }, + { + "Level": "12", + "Move": "MOVE_INFESTATION" + }, + { + "Level": "16", + "Move": "MOVE_SCREECH" + }, + { + "Level": "20", + "Move": "MOVE_PIN_MISSILE" + }, + { + "Level": "24", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "28", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "36", + "Move": "MOVE_TOXIC" + }, + { + "Level": "40", + "Move": "MOVE_IRON_TAIL" + }, + { + "Level": "44", + "Move": "MOVE_X_SCISSOR" + }, + { + "Level": "48", + "Move": "MOVE_AGILITY" + }, + { + "Level": "52", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "56", + "Move": "MOVE_MEGAHORN" + } + ], + "TMMoves": [ + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HYPER_BEAM", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SLUDGE_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TOXIC_SPIKES", + "MOVE_U_TURN" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SANDILE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "9", + "Move": "MOVE_SAND_TOMB" + }, + { + "Level": "15", + "Move": "MOVE_BITE" + }, + { + "Level": "21", + "Move": "MOVE_DIG" + }, + { + "Level": "24", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "27", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "36", + "Move": "MOVE_IRON_TAIL" + }, + { + "Level": "42", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "50", + "Move": "MOVE_DOUBLE_EDGE" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_DARK_PULSE", + "MOVE_DRAGON_CLAW", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FIRE_FANG", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SLUDGE_BOMB", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THUNDER_FANG" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "KROKOROK": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "9", + "Move": "MOVE_SAND_TOMB" + }, + { + "Level": "15", + "Move": "MOVE_BITE" + }, + { + "Level": "21", + "Move": "MOVE_DIG" + }, + { + "Level": "24", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "27", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "36", + "Move": "MOVE_IRON_TAIL" + }, + { + "Level": "42", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "50", + "Move": "MOVE_DOUBLE_EDGE" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DRAGON_CLAW", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FIRE_FANG", + "MOVE_KNOCK_OFF", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SLUDGE_BOMB", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THUNDER_FANG" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "KROOKODILE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "9", + "Move": "MOVE_SAND_TOMB" + }, + { + "Level": "15", + "Move": "MOVE_BITE" + }, + { + "Level": "21", + "Move": "MOVE_DIG" + }, + { + "Level": "24", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "27", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "36", + "Move": "MOVE_IRON_TAIL" + }, + { + "Level": "42", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "50", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "58", + "Move": "MOVE_OUTRAGE" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CLOSE_COMBAT", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DRAGON_CLAW", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FIRE_FANG", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SLUDGE_BOMB", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THUNDER_FANG" + ], + "TutorMoves": [ + "MOVE_BREAKING_SWIPE" + ], + "EggMoves": [] + }, + "SCRAGGY": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "8", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "12", + "Move": "MOVE_POWER_UP_PUNCH" + }, + { + "Level": "16", + "Move": "MOVE_ROCK_TOMB" + }, + { + "Level": "20", + "Move": "MOVE_PROTECT" + }, + { + "Level": "26", + "Move": "MOVE_PARTING_SHOT" + }, + { + "Level": "32", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "35", + "Move": "MOVE_DETECT" + }, + { + "Level": "40", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "44", + "Move": "MOVE_IRON_TAIL" + }, + { + "Level": "48", + "Move": "MOVE_DYNAMIC_PUNCH" + }, + { + "Level": "52", + "Move": "MOVE_HEAD_SMASH" + } + ], + "TMMoves": [ + "MOVE_BULK_UP", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_ENDURE", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_POISON_JAB", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_SLUDGE_BOMB", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THUNDER_PUNCH", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SCRAFTY": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "8", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "12", + "Move": "MOVE_POWER_UP_PUNCH" + }, + { + "Level": "16", + "Move": "MOVE_ROCK_TOMB" + }, + { + "Level": "20", + "Move": "MOVE_PROTECT" + }, + { + "Level": "26", + "Move": "MOVE_PARTING_SHOT" + }, + { + "Level": "32", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "35", + "Move": "MOVE_DETECT" + }, + { + "Level": "40", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "44", + "Move": "MOVE_IRON_TAIL" + }, + { + "Level": "48", + "Move": "MOVE_DYNAMIC_PUNCH" + }, + { + "Level": "52", + "Move": "MOVE_HEAD_SMASH" + } + ], + "TMMoves": [ + "MOVE_BULK_UP", + "MOVE_CLOSE_COMBAT", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_ENDURE", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_METRONOME", + "MOVE_OUTRAGE", + "MOVE_POISON_JAB", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_SLUDGE_BOMB", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_THUNDER_PUNCH", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "TRUBBISH": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "1", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "9", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "12", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "15", + "Move": "MOVE_TOXIC_SPIKES" + }, + { + "Level": "18", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "20", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "24", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "27", + "Move": "MOVE_SLUDGE_BOMB" + }, + { + "Level": "30", + "Move": "MOVE_TOXIC" + }, + { + "Level": "34", + "Move": "MOVE_SELF_DESTRUCT" + }, + { + "Level": "39", + "Move": "MOVE_SLUDGE_WAVE" + }, + { + "Level": "44", + "Move": "MOVE_GUNK_SHOT" + }, + { + "Level": "53", + "Move": "MOVE_EXPLOSION" + } + ], + "TMMoves": [ + "MOVE_BULLET_SEED", + "MOVE_DARK_PULSE", + "MOVE_ENDURE", + "MOVE_GIGA_DRAIN", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_ROCK_BLAST", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GARBODOR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "1", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "1", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "9", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "12", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "15", + "Move": "MOVE_TOXIC_SPIKES" + }, + { + "Level": "18", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "20", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "24", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "27", + "Move": "MOVE_SLUDGE_BOMB" + }, + { + "Level": "30", + "Move": "MOVE_TOXIC" + }, + { + "Level": "34", + "Move": "MOVE_SELF_DESTRUCT" + }, + { + "Level": "39", + "Move": "MOVE_SLUDGE_WAVE" + }, + { + "Level": "44", + "Move": "MOVE_GUNK_SHOT" + }, + { + "Level": "53", + "Move": "MOVE_EXPLOSION" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_DARK_PULSE", + "MOVE_ENDURE", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_ROCK_BLAST", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_THUNDERBOLT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "VANILLITE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "4", + "Move": "MOVE_TAUNT" + }, + { + "Level": "8", + "Move": "MOVE_MIST" + }, + { + "Level": "12", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "20", + "Move": "MOVE_SELF_DESTRUCT" + }, + { + "Level": "24", + "Move": "MOVE_ICICLE_CRASH" + }, + { + "Level": "32", + "Move": "MOVE_ACID_ARMOR" + }, + { + "Level": "35", + "Move": "MOVE_ICE_BEAM" + }, + { + "Level": "46", + "Move": "MOVE_EXPLOSION" + }, + { + "Level": "58", + "Move": "MOVE_BLIZZARD" + } + ], + "TMMoves": [ + "MOVE_ENDURE", + "MOVE_FLASH_CANNON", + "MOVE_HYPER_VOICE", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_PROTECT", + "MOVE_SUBSTITUTE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "VANILLISH": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "4", + "Move": "MOVE_TAUNT" + }, + { + "Level": "8", + "Move": "MOVE_MIST" + }, + { + "Level": "12", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "20", + "Move": "MOVE_SELF_DESTRUCT" + }, + { + "Level": "24", + "Move": "MOVE_ICICLE_CRASH" + }, + { + "Level": "32", + "Move": "MOVE_ACID_ARMOR" + }, + { + "Level": "35", + "Move": "MOVE_ICE_BEAM" + }, + { + "Level": "46", + "Move": "MOVE_EXPLOSION" + }, + { + "Level": "58", + "Move": "MOVE_BLIZZARD" + } + ], + "TMMoves": [ + "MOVE_ENDURE", + "MOVE_FLASH_CANNON", + "MOVE_HYPER_VOICE", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_PROTECT", + "MOVE_SUBSTITUTE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "VANILLUXE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "1", + "Move": "MOVE_FREEZE_DRY" + }, + { + "Level": "4", + "Move": "MOVE_TAUNT" + }, + { + "Level": "8", + "Move": "MOVE_MIST" + }, + { + "Level": "12", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "20", + "Move": "MOVE_SELF_DESTRUCT" + }, + { + "Level": "24", + "Move": "MOVE_ICICLE_CRASH" + }, + { + "Level": "32", + "Move": "MOVE_ACID_ARMOR" + }, + { + "Level": "35", + "Move": "MOVE_ICE_BEAM" + }, + { + "Level": "46", + "Move": "MOVE_EXPLOSION" + }, + { + "Level": "58", + "Move": "MOVE_BLIZZARD" + } + ], + "TMMoves": [ + "MOVE_ENDURE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_PROTECT", + "MOVE_SUBSTITUTE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "EMOLGA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_NUZZLE" + }, + { + "Level": "5", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "7", + "Move": "MOVE_CHARM" + }, + { + "Level": "10", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "15", + "Move": "MOVE_THUNDER_SHOCK" + }, + { + "Level": "20", + "Move": "MOVE_CHARGE" + }, + { + "Level": "22", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "25", + "Move": "MOVE_EERIE_IMPULSE" + }, + { + "Level": "29", + "Move": "MOVE_SPARK" + }, + { + "Level": "35", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "40", + "Move": "MOVE_VOLT_SWITCH" + }, + { + "Level": "44", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "52", + "Move": "MOVE_DISCHARGE" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_IRON_TAIL", + "MOVE_PROTECT", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_U_TURN", + "MOVE_WILD_CHARGE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "TYNAMO": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_THUNDER_WAVE" + }, + { + "Level": "1", + "Move": "MOVE_SPARK" + } + ], + "TMMoves": [ + "MOVE_PROTECT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "EELEKTRIK": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_THUNDER_WAVE" + }, + { + "Level": "1", + "Move": "MOVE_SPARK" + }, + { + "Level": "18", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "29", + "Move": "MOVE_DISCHARGE" + }, + { + "Level": "33", + "Move": "MOVE_EERIE_IMPULSE" + }, + { + "Level": "39", + "Move": "MOVE_CHARGE" + }, + { + "Level": "44", + "Move": "MOVE_THUNDERBOLT" + }, + { + "Level": "46", + "Move": "MOVE_WILD_CHARGE" + }, + { + "Level": "48", + "Move": "MOVE_ZAP_CANNON" + }, + { + "Level": "50", + "Move": "MOVE_SUPER_FANG" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_ENDURE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_DRAIN", + "MOVE_LIGHT_SCREEN", + "MOVE_PROTECT", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER", + "MOVE_THUNDER_FANG", + "MOVE_U_TURN", + "MOVE_VOLT_SWITCH" + ], + "TutorMoves": [ + "MOVE_CRUNCH" + ], + "EggMoves": [] + }, + "EELEKTROSS": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_SPARK" + }, + { + "Level": "1", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "18", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "21", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "29", + "Move": "MOVE_DISCHARGE" + }, + { + "Level": "33", + "Move": "MOVE_EERIE_IMPULSE" + }, + { + "Level": "36", + "Move": "MOVE_LIQUIDATION" + }, + { + "Level": "39", + "Move": "MOVE_CHARGE" + }, + { + "Level": "44", + "Move": "MOVE_THUNDERBOLT" + }, + { + "Level": "46", + "Move": "MOVE_WILD_CHARGE" + }, + { + "Level": "48", + "Move": "MOVE_ZAP_CANNON" + }, + { + "Level": "50", + "Move": "MOVE_SUPER_FANG" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CLOSE_COMBAT", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_LIGHT_SCREEN", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_U_TURN", + "MOVE_VOLT_SWITCH", + "MOVE_WATERFALL", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "LITWICK": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_EMBER" + }, + { + "Level": "1", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "10", + "Move": "MOVE_HAZE" + }, + { + "Level": "12", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "16", + "Move": "MOVE_ACID_ARMOR" + }, + { + "Level": "20", + "Move": "MOVE_WILL_O_WISP" + }, + { + "Level": "24", + "Move": "MOVE_FIRE_SPIN" + }, + { + "Level": "28", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "32", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "38", + "Move": "MOVE_FLAME_WHEEL" + }, + { + "Level": "44", + "Move": "MOVE_CURSE" + }, + { + "Level": "48", + "Move": "MOVE_HEAL_BLOCK" + }, + { + "Level": "52", + "Move": "MOVE_OVERHEAT" + } + ], + "TMMoves": [ + "MOVE_CALM_MIND", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FIRE_BLAST", + "MOVE_HEAT_WAVE", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_SAFEGUARD", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "LAMPENT": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_EMBER" + }, + { + "Level": "1", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "10", + "Move": "MOVE_HAZE" + }, + { + "Level": "12", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "16", + "Move": "MOVE_ACID_ARMOR" + }, + { + "Level": "20", + "Move": "MOVE_WILL_O_WISP" + }, + { + "Level": "24", + "Move": "MOVE_FIRE_SPIN" + }, + { + "Level": "28", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "32", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "38", + "Move": "MOVE_FLAME_WHEEL" + }, + { + "Level": "44", + "Move": "MOVE_CURSE" + }, + { + "Level": "48", + "Move": "MOVE_HEAL_BLOCK" + }, + { + "Level": "52", + "Move": "MOVE_OVERHEAT" + } + ], + "TMMoves": [ + "MOVE_CALM_MIND", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FIRE_BLAST", + "MOVE_HEAT_WAVE", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_SAFEGUARD", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "CHANDELURE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_EMBER" + }, + { + "Level": "1", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "10", + "Move": "MOVE_HAZE" + }, + { + "Level": "12", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "16", + "Move": "MOVE_ACID_ARMOR" + }, + { + "Level": "20", + "Move": "MOVE_WILL_O_WISP" + }, + { + "Level": "24", + "Move": "MOVE_FIRE_SPIN" + }, + { + "Level": "28", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "32", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "38", + "Move": "MOVE_FLAME_WHEEL" + }, + { + "Level": "44", + "Move": "MOVE_CURSE" + }, + { + "Level": "48", + "Move": "MOVE_HEAL_BLOCK" + }, + { + "Level": "52", + "Move": "MOVE_OVERHEAT" + } + ], + "TMMoves": [ + "MOVE_CALM_MIND", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FIRE_BLAST", + "MOVE_FLARE_BLITZ", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_WAVE", + "MOVE_HYPER_BEAM", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_SAFEGUARD", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "STUNFISK": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "1", + "Move": "MOVE_THUNDER_SHOCK" + }, + { + "Level": "5", + "Move": "MOVE_ENDURE" + }, + { + "Level": "10", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "15", + "Move": "MOVE_ROCK_TOMB" + }, + { + "Level": "20", + "Move": "MOVE_CHARGE" + }, + { + "Level": "25", + "Move": "MOVE_SPARK" + }, + { + "Level": "30", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "35", + "Move": "MOVE_DISCHARGE" + }, + { + "Level": "40", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "45", + "Move": "MOVE_EERIE_IMPULSE" + }, + { + "Level": "50", + "Move": "MOVE_SLUDGE_WAVE" + } + ], + "TMMoves": [ + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_EARTH_POWER", + "MOVE_ELECTROWEB", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_SLUDGE_BOMB", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "STUNFISK_GALAR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "1", + "Move": "MOVE_SCREECH" + }, + { + "Level": "1", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "5", + "Move": "MOVE_ENDURE" + }, + { + "Level": "10", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "15", + "Move": "MOVE_ROCK_TOMB" + }, + { + "Level": "20", + "Move": "MOVE_METAL_SOUND" + }, + { + "Level": "25", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "30", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "35", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "40", + "Move": "MOVE_SLUDGE_WAVE" + }, + { + "Level": "45", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "50", + "Move": "MOVE_STEALTH_ROCK" + } + ], + "TMMoves": [ + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_EARTH_POWER", + "MOVE_FLASH_CANNON", + "MOVE_ICE_FANG", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_SLUDGE_BOMB", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "CHESPIN": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_VINE_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "5", + "Move": "MOVE_GROWTH" + }, + { + "Level": "8", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "11", + "Move": "MOVE_BITE" + }, + { + "Level": "15", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "18", + "Move": "MOVE_PIN_MISSILE" + }, + { + "Level": "27", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "35", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "42", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "48", + "Move": "MOVE_WOOD_HAMMER" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_GIGA_DRAIN", + "MOVE_HEADBUTT", + "MOVE_IRON_HEAD", + "MOVE_MUD_SHOT", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER_PUNCH", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "QUILLADIN": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_VINE_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "5", + "Move": "MOVE_GROWTH" + }, + { + "Level": "8", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "11", + "Move": "MOVE_BITE" + }, + { + "Level": "15", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "18", + "Move": "MOVE_PIN_MISSILE" + }, + { + "Level": "27", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "35", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "42", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "48", + "Move": "MOVE_WOOD_HAMMER" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_GIGA_DRAIN", + "MOVE_HEADBUTT", + "MOVE_IRON_HEAD", + "MOVE_MUD_SHOT", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER_PUNCH", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "CHESNAUGHT": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_VINE_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "5", + "Move": "MOVE_GROWTH" + }, + { + "Level": "8", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "11", + "Move": "MOVE_BITE" + }, + { + "Level": "15", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "18", + "Move": "MOVE_PIN_MISSILE" + }, + { + "Level": "27", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "35", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "38", + "Move": "MOVE_BULK_UP" + }, + { + "Level": "42", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "45", + "Move": "MOVE_CLOSE_COMBAT" + }, + { + "Level": "48", + "Move": "MOVE_WOOD_HAMMER" + }, + { + "Level": "55", + "Move": "MOVE_GIGA_IMPACT" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAGON_CLAW", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_GIGA_DRAIN", + "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_MUD_SHOT", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_THUNDER_PUNCH", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_SPIKY_SHIELD" + ], + "EggMoves": [] + }, + "FENNEKIN": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "5", + "Move": "MOVE_EMBER" + }, + { + "Level": "14", + "Move": "MOVE_CHARM" + }, + { + "Level": "17", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "20", + "Move": "MOVE_FIRE_SPIN" + }, + { + "Level": "25", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "31", + "Move": "MOVE_PSYSHOCK" + }, + { + "Level": "35", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "38", + "Move": "MOVE_WILL_O_WISP" + }, + { + "Level": "41", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "54", + "Move": "MOVE_FIRE_BLAST" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_CALM_MIND", + "MOVE_ENDURE", + "MOVE_FLARE_BLITZ", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "BRAIXEN": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "5", + "Move": "MOVE_EMBER" + }, + { + "Level": "14", + "Move": "MOVE_CHARM" + }, + { + "Level": "17", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "20", + "Move": "MOVE_FIRE_SPIN" + }, + { + "Level": "25", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "31", + "Move": "MOVE_PSYSHOCK" + }, + { + "Level": "35", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "38", + "Move": "MOVE_WILL_O_WISP" + }, + { + "Level": "41", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "46", + "Move": "MOVE_AGILITY" + }, + { + "Level": "54", + "Move": "MOVE_FIRE_BLAST" + } + ], + "TMMoves": [ + "MOVE_CALM_MIND", + "MOVE_ENDURE", + "MOVE_FIRE_PUNCH", + "MOVE_FLARE_BLITZ", + "MOVE_HEAT_WAVE", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER_PUNCH" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "DELPHOX": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "5", + "Move": "MOVE_EMBER" + }, + { + "Level": "14", + "Move": "MOVE_CHARM" + }, + { + "Level": "17", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "20", + "Move": "MOVE_FIRE_SPIN" + }, + { + "Level": "25", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "31", + "Move": "MOVE_PSYSHOCK" + }, + { + "Level": "35", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "38", + "Move": "MOVE_WILL_O_WISP" + }, + { + "Level": "41", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "46", + "Move": "MOVE_AGILITY" + }, + { + "Level": "54", + "Move": "MOVE_FIRE_BLAST" + } + ], + "TMMoves": [ + "MOVE_CALM_MIND", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FIRE_PUNCH", + "MOVE_FLARE_BLITZ", + "MOVE_FOCUS_BLAST", + "MOVE_HEAL_BLOCK", + "MOVE_HEAT_WAVE", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_METRONOME", + "MOVE_NASTY_PLOT", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_SAFEGUARD", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER_PUNCH", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_FUTURE_SIGHT", + "MOVE_MYSTICAL_FIRE", + "MOVE_SHADOW_BALL" + ], + "EggMoves": [] + }, + "FROAKIE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "5", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "8", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "10", + "Move": "MOVE_LICK" + }, + { + "Level": "14", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "18", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "35", + "Move": "MOVE_SUBSTITUTE" + }, + { + "Level": "38", + "Move": "MOVE_NIGHT_SLASH" + }, + { + "Level": "43", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "51", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "57", + "Move": "MOVE_HYDRO_PUMP" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BLIZZARD", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LIQUIDATION", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SPIKES", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_TOXIC_SPIKES", + "MOVE_U_TURN", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "FROGADIER": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "5", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "8", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "10", + "Move": "MOVE_LICK" + }, + { + "Level": "14", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "18", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "23", + "Move": "MOVE_AERIAL_ACE" + }, + { + "Level": "28", + "Move": "MOVE_SHADOW_SNEAK" + }, + { + "Level": "35", + "Move": "MOVE_SUBSTITUTE" + }, + { + "Level": "38", + "Move": "MOVE_NIGHT_SLASH" + }, + { + "Level": "43", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "51", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "57", + "Move": "MOVE_HYDRO_PUMP" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FLIP_TURN", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_LIQUIDATION", + "MOVE_NASTY_PLOT", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SPIKES", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_TOXIC_SPIKES", + "MOVE_U_TURN", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GRENINJA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "5", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "8", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "10", + "Move": "MOVE_LICK" + }, + { + "Level": "14", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "18", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "23", + "Move": "MOVE_AERIAL_ACE" + }, + { + "Level": "28", + "Move": "MOVE_SHADOW_SNEAK" + }, + { + "Level": "35", + "Move": "MOVE_SUBSTITUTE" + }, + { + "Level": "38", + "Move": "MOVE_NIGHT_SLASH" + }, + { + "Level": "43", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "51", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "57", + "Move": "MOVE_HYDRO_PUMP" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FLIP_TURN", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_LIQUIDATION", + "MOVE_NASTY_PLOT", + "MOVE_PROTECT", + "MOVE_PSYSHOCK", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SPIKES", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_TOXIC_SPIKES", + "MOVE_U_TURN", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE" + ], + "TutorMoves": [ + "MOVE_WATER_SHURIKEN" + ], + "EggMoves": [] + }, + "BUNNELBY": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "7", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "14", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "24", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "28", + "Move": "MOVE_DIG" + }, + { + "Level": "32", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "36", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "40", + "Move": "MOVE_SUPER_FANG" + }, + { + "Level": "44", + "Move": "MOVE_EARTHQUAKE" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_HEADBUTT", + "MOVE_IRON_HEAD", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SLUDGE_BOMB", + "MOVE_SPIKES", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWORDS_DANCE", + "MOVE_U_TURN", + "MOVE_WILD_CHARGE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "DIGGERSBY": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "7", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "14", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "24", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "28", + "Move": "MOVE_DIG" + }, + { + "Level": "32", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "36", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "40", + "Move": "MOVE_SUPER_FANG" + }, + { + "Level": "44", + "Move": "MOVE_EARTHQUAKE" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FIRE_PUNCH", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_HEAD", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SLUDGE_BOMB", + "MOVE_SPIKES", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWORDS_DANCE", + "MOVE_THUNDER_PUNCH", + "MOVE_U_TURN", + "MOVE_WILD_CHARGE" + ], + "TutorMoves": [ + "MOVE_BULLDOZE" + ], + "EggMoves": [] + }, + "FLETCHLING": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_PECK" + }, + { + "Level": "8", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "12", + "Move": "MOVE_EMBER" + }, + { + "Level": "16", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "20", + "Move": "MOVE_WHIRLWIND" + }, + { + "Level": "25", + "Move": "MOVE_FLAME_WHEEL" + }, + { + "Level": "30", + "Move": "MOVE_STEEL_WING" + }, + { + "Level": "35", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "40", + "Move": "MOVE_AGILITY" + }, + { + "Level": "45", + "Move": "MOVE_FLARE_BLITZ" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FLY", + "MOVE_HEAT_WAVE", + "MOVE_HURRICANE", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_U_TURN", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "FLETCHINDER": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_PECK" + }, + { + "Level": "8", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "12", + "Move": "MOVE_EMBER" + }, + { + "Level": "16", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "20", + "Move": "MOVE_WHIRLWIND" + }, + { + "Level": "25", + "Move": "MOVE_FLAME_WHEEL" + }, + { + "Level": "30", + "Move": "MOVE_STEEL_WING" + }, + { + "Level": "35", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "40", + "Move": "MOVE_AGILITY" + }, + { + "Level": "45", + "Move": "MOVE_FLARE_BLITZ" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLY", + "MOVE_HEAT_WAVE", + "MOVE_HURRICANE", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_U_TURN", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [ + "MOVE_WING_ATTACK" + ], + "EggMoves": [] + }, + "TALONFLAME": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_PECK" + }, + { + "Level": "8", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "12", + "Move": "MOVE_EMBER" + }, + { + "Level": "16", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "20", + "Move": "MOVE_WHIRLWIND" + }, + { + "Level": "25", + "Move": "MOVE_FLAME_WHEEL" + }, + { + "Level": "30", + "Move": "MOVE_STEEL_WING" + }, + { + "Level": "35", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "40", + "Move": "MOVE_AGILITY" + }, + { + "Level": "45", + "Move": "MOVE_FLARE_BLITZ" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BULK_UP", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLY", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_WAVE", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_U_TURN", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [ + "MOVE_BRAVE_BIRD" + ], + "EggMoves": [] + }, + "SCATTERBUG": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_STRING_SHOT" + }, + { + "Level": "7", + "Move": "MOVE_STUN_SPORE" + } + ], + "TMMoves": [ + "MOVE_PROTECT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SPEWPA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_POISON_POWDER" + }, + { + "Level": "1", + "Move": "MOVE_STRING_SHOT" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "7", + "Move": "MOVE_STUN_SPORE" + }, + { + "Level": "10", + "Move": "MOVE_INFESTATION" + } + ], + "TMMoves": [ + "MOVE_IRON_DEFENSE" + ], + "TutorMoves": [ + "MOVE_PROTECT" + ], + "EggMoves": [] + }, + "VIVILLON": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_POISON_POWDER" + }, + { + "Level": "1", + "Move": "MOVE_STUN_SPORE" + }, + { + "Level": "1", + "Move": "MOVE_SLEEP_POWDER" + }, + { + "Level": "10", + "Move": "MOVE_INFESTATION" + }, + { + "Level": "12", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "15", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "17", + "Move": "MOVE_SUPERSONIC" + }, + { + "Level": "21", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "25", + "Move": "MOVE_U_TURN" + }, + { + "Level": "28", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "35", + "Move": "MOVE_BUG_BUZZ" + }, + { + "Level": "40", + "Move": "MOVE_SAFEGUARD" + }, + { + "Level": "40", + "Move": "MOVE_HURRICANE" + }, + { + "Level": "45", + "Move": "MOVE_WHIRLWIND" + } + ], + "TMMoves": [ + "MOVE_DAZZLING_GLEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_PSYCHIC", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT" + ], + "TutorMoves": [ + "MOVE_GUST", + "MOVE_HARDEN", + "MOVE_PROTECT", + "MOVE_STRING_SHOT", + "MOVE_TACKLE" + ], + "EggMoves": [] + }, + "LITLEO": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "5", + "Move": "MOVE_EMBER" + }, + { + "Level": "6", + "Move": "MOVE_ROAR" + }, + { + "Level": "8", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "11", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "16", + "Move": "MOVE_SNARL" + }, + { + "Level": "20", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "23", + "Move": "MOVE_FIRE_FANG" + }, + { + "Level": "28", + "Move": "MOVE_EARTH_POWER" + }, + { + "Level": "32", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "36", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "42", + "Move": "MOVE_HYPER_VOICE" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLARE_BLITZ", + "MOVE_HEAT_WAVE", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THUNDER_FANG", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "PYROAR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_EMBER" + }, + { + "Level": "6", + "Move": "MOVE_ROAR" + }, + { + "Level": "8", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "11", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "16", + "Move": "MOVE_SNARL" + }, + { + "Level": "20", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "23", + "Move": "MOVE_FIRE_FANG" + }, + { + "Level": "28", + "Move": "MOVE_EARTH_POWER" + }, + { + "Level": "32", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "36", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "42", + "Move": "MOVE_HYPER_VOICE" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLARE_BLITZ", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_WAVE", + "MOVE_PROTECT", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THUNDER_FANG", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [ + "MOVE_HYPER_BEAM", + "MOVE_OVERHEAT" + ], + "EggMoves": [] + }, + "FLAB\u00c9B\u00c9": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_VINE_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "6", + "Move": "MOVE_FAIRY_WIND" + }, + { + "Level": "10", + "Move": "MOVE_SAFEGUARD" + }, + { + "Level": "15", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "18", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "20", + "Move": "MOVE_WISH" + }, + { + "Level": "22", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "26", + "Move": "MOVE_CHARM" + }, + { + "Level": "33", + "Move": "MOVE_SYNTHESIS" + }, + { + "Level": "40", + "Move": "MOVE_ENERGY_BALL" + }, + { + "Level": "54", + "Move": "MOVE_SOLAR_BEAM" + } + ], + "TMMoves": [ + "MOVE_CALM_MIND", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_GIGA_DRAIN", + "MOVE_LIGHT_SCREEN", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "FLOETTE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_VINE_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_FAIRY_WIND" + }, + { + "Level": "10", + "Move": "MOVE_SAFEGUARD" + }, + { + "Level": "15", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "18", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "20", + "Move": "MOVE_WISH" + }, + { + "Level": "22", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "26", + "Move": "MOVE_CHARM" + }, + { + "Level": "33", + "Move": "MOVE_SYNTHESIS" + }, + { + "Level": "40", + "Move": "MOVE_ENERGY_BALL" + }, + { + "Level": "54", + "Move": "MOVE_SOLAR_BEAM" + } + ], + "TMMoves": [ + "MOVE_CALM_MIND", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_GIGA_DRAIN", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT" + ], + "TutorMoves": [ + "MOVE_MOONBLAST" + ], + "EggMoves": [] + }, + "FLOETTE_ETERNAL": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_VINE_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_FAIRY_WIND" + }, + { + "Level": "10", + "Move": "MOVE_SAFEGUARD" + }, + { + "Level": "15", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "18", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "20", + "Move": "MOVE_WISH" + }, + { + "Level": "22", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "26", + "Move": "MOVE_CHARM" + }, + { + "Level": "33", + "Move": "MOVE_SYNTHESIS" + }, + { + "Level": "40", + "Move": "MOVE_ENERGY_BALL" + }, + { + "Level": "50", + "Move": "MOVE_LIGHT_OF_RUIN" + }, + { + "Level": "54", + "Move": "MOVE_SOLAR_BEAM" + } + ], + "TMMoves": [ + "MOVE_CALM_MIND", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_GIGA_DRAIN", + "MOVE_HYPER_BEAM", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT" + ], + "TutorMoves": [ + "MOVE_MOONBLAST" + ], + "EggMoves": [] + }, + "FLORGES": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_VINE_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_FAIRY_WIND" + }, + { + "Level": "1", + "Move": "MOVE_MOONBLAST" + }, + { + "Level": "10", + "Move": "MOVE_SAFEGUARD" + }, + { + "Level": "15", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "18", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "20", + "Move": "MOVE_WISH" + }, + { + "Level": "22", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "26", + "Move": "MOVE_CHARM" + }, + { + "Level": "33", + "Move": "MOVE_SYNTHESIS" + }, + { + "Level": "40", + "Move": "MOVE_ENERGY_BALL" + }, + { + "Level": "54", + "Move": "MOVE_SOLAR_BEAM" + } + ], + "TMMoves": [ + "MOVE_CALM_MIND", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_GIGA_DRAIN", + "MOVE_HYPER_BEAM", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT" + ], + "TutorMoves": [ + "MOVE_DISARMING_VOICE" + ], + "EggMoves": [] + }, + "SKIDDO": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWTH" + }, + { + "Level": "7", + "Move": "MOVE_VINE_WHIP" + }, + { + "Level": "9", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "12", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "13", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "16", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "20", + "Move": "MOVE_SYNTHESIS" + }, + { + "Level": "22", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "26", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "34", + "Move": "MOVE_HORN_LEECH" + }, + { + "Level": "38", + "Move": "MOVE_BULK_UP" + }, + { + "Level": "42", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "45", + "Move": "MOVE_LEAF_BLADE" + }, + { + "Level": "50", + "Move": "MOVE_MEGAHORN" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLET_SEED", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_GIGA_DRAIN", + "MOVE_LEAF_STORM", + "MOVE_MAGICAL_LEAF", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_WILD_CHARGE", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GOGOAT": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWTH" + }, + { + "Level": "7", + "Move": "MOVE_VINE_WHIP" + }, + { + "Level": "9", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "12", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "13", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "16", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "20", + "Move": "MOVE_SYNTHESIS" + }, + { + "Level": "22", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "26", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "34", + "Move": "MOVE_HORN_LEECH" + }, + { + "Level": "38", + "Move": "MOVE_BULK_UP" + }, + { + "Level": "42", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "45", + "Move": "MOVE_LEAF_BLADE" + }, + { + "Level": "50", + "Move": "MOVE_MEGAHORN" + }, + { + "Level": "55", + "Move": "MOVE_EARTHQUAKE" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLET_SEED", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_LEAF_STORM", + "MOVE_MAGICAL_LEAF", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_WILD_CHARGE", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_AERIAL_ACE" + ], + "EggMoves": [] + }, + "PANCHAM": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "8", + "Move": "MOVE_TAUNT" + }, + { + "Level": "15", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "20", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "24", + "Move": "MOVE_SLASH" + }, + { + "Level": "28", + "Move": "MOVE_DETECT" + }, + { + "Level": "30", + "Move": "MOVE_PARTING_SHOT" + }, + { + "Level": "34", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "44", + "Move": "MOVE_BODY_SLAM" + } + ], + "TMMoves": [ + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FIRE_PUNCH", + "MOVE_HYPER_VOICE", + "MOVE_ICE_PUNCH", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SLUDGE_BOMB", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWORDS_DANCE", + "MOVE_THUNDER_PUNCH" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "PANGORO": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_TAUNT" + }, + { + "Level": "1", + "Move": "MOVE_BULLET_PUNCH" + }, + { + "Level": "15", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "20", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "24", + "Move": "MOVE_SLASH" + }, + { + "Level": "28", + "Move": "MOVE_DETECT" + }, + { + "Level": "30", + "Move": "MOVE_PARTING_SHOT" + }, + { + "Level": "34", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "38", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "44", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "50", + "Move": "MOVE_OUTRAGE" + }, + { + "Level": "54", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "58", + "Move": "MOVE_CLOSE_COMBAT" + } + ], + "TMMoves": [ + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DRAGON_CLAW", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_PUNCH", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SLUDGE_BOMB", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWORDS_DANCE", + "MOVE_THUNDER_PUNCH", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_NIGHT_SLASH" + ], + "EggMoves": [] + }, + "FURFROU": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "8", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "13", + "Move": "MOVE_BITE" + }, + { + "Level": "16", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "20", + "Move": "MOVE_ROAR" + }, + { + "Level": "22", + "Move": "MOVE_COTTON_GUARD" + }, + { + "Level": "25", + "Move": "MOVE_CHARM" + }, + { + "Level": "28", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "30", + "Move": "MOVE_SNARL" + }, + { + "Level": "36", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "43", + "Move": "MOVE_HYPER_VOICE" + } + ], + "TMMoves": [ + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FIRE_FANG", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_IRON_TAIL", + "MOVE_PROTECT", + "MOVE_ROCK_SMASH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_WAVE", + "MOVE_U_TURN", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "ESPURR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "6", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "9", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "13", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "15", + "Move": "MOVE_SWIFT" + }, + { + "Level": "21", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "30", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "30", + "Move": "MOVE_REFLECT" + }, + { + "Level": "36", + "Move": "MOVE_PSYSHOCK" + } + ], + "TMMoves": [ + "MOVE_CALM_MIND", + "MOVE_DARK_PULSE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_NASTY_PLOT", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MEOWSTIC_M": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "6", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "9", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "13", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "15", + "Move": "MOVE_SWIFT" + }, + { + "Level": "18", + "Move": "MOVE_CHARM" + }, + { + "Level": "21", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "30", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "30", + "Move": "MOVE_REFLECT" + }, + { + "Level": "36", + "Move": "MOVE_PSYSHOCK" + }, + { + "Level": "44", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "46", + "Move": "MOVE_HEAL_BLOCK" + }, + { + "Level": "50", + "Move": "MOVE_WISH" + } + ], + "TMMoves": [ + "MOVE_CALM_MIND", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_NASTY_PLOT", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC_SPIKES", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MEOWSTIC_F": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "1", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "9", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "13", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "15", + "Move": "MOVE_SWIFT" + }, + { + "Level": "21", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "24", + "Move": "MOVE_DARK_PULSE" + }, + { + "Level": "30", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "30", + "Move": "MOVE_REFLECT" + }, + { + "Level": "36", + "Move": "MOVE_PSYSHOCK" + }, + { + "Level": "40", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "44", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "50", + "Move": "MOVE_FUTURE_SIGHT" + } + ], + "TMMoves": [ + "MOVE_CALM_MIND", + "MOVE_DIG", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_NASTY_PLOT", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_SAFEGUARD", + "MOVE_SUBSTITUTE", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_WATER_PULSE", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "HONEDGE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_SCREECH" + }, + { + "Level": "4", + "Move": "MOVE_SHADOW_SNEAK" + }, + { + "Level": "12", + "Move": "MOVE_AERIAL_ACE" + }, + { + "Level": "16", + "Move": "MOVE_METAL_SOUND" + }, + { + "Level": "20", + "Move": "MOVE_SLASH" + }, + { + "Level": "22", + "Move": "MOVE_PSYCHO_CUT" + }, + { + "Level": "24", + "Move": "MOVE_SHADOW_CLAW" + }, + { + "Level": "32", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "38", + "Move": "MOVE_IRON_HEAD" + }, + { + "Level": "44", + "Move": "MOVE_SWORDS_DANCE" + } + ], + "TMMoves": [ + "MOVE_BRICK_BREAK", + "MOVE_CLOSE_COMBAT", + "MOVE_FLASH_CANNON", + "MOVE_HEADBUTT", + "MOVE_NIGHT_SLASH", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_SUBSTITUTE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "DOUBLADE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_SCREECH" + }, + { + "Level": "4", + "Move": "MOVE_SHADOW_SNEAK" + }, + { + "Level": "12", + "Move": "MOVE_AERIAL_ACE" + }, + { + "Level": "16", + "Move": "MOVE_METAL_SOUND" + }, + { + "Level": "20", + "Move": "MOVE_SLASH" + }, + { + "Level": "22", + "Move": "MOVE_PSYCHO_CUT" + }, + { + "Level": "24", + "Move": "MOVE_SHADOW_CLAW" + }, + { + "Level": "32", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "38", + "Move": "MOVE_IRON_HEAD" + }, + { + "Level": "44", + "Move": "MOVE_SWORDS_DANCE" + } + ], + "TMMoves": [ + "MOVE_BRICK_BREAK", + "MOVE_CLOSE_COMBAT", + "MOVE_ENDURE", + "MOVE_FLASH_CANNON", + "MOVE_HEADBUTT", + "MOVE_NIGHT_SLASH", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_SUBSTITUTE", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "AEGISLASH": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_SCREECH" + }, + { + "Level": "4", + "Move": "MOVE_SHADOW_SNEAK" + }, + { + "Level": "12", + "Move": "MOVE_AERIAL_ACE" + }, + { + "Level": "16", + "Move": "MOVE_METAL_SOUND" + }, + { + "Level": "20", + "Move": "MOVE_SLASH" + }, + { + "Level": "22", + "Move": "MOVE_PSYCHO_CUT" + }, + { + "Level": "24", + "Move": "MOVE_SHADOW_CLAW" + }, + { + "Level": "32", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "38", + "Move": "MOVE_IRON_HEAD" + }, + { + "Level": "44", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "50", + "Move": "MOVE_HEAD_SMASH" + } + ], + "TMMoves": [ + "MOVE_BRICK_BREAK", + "MOVE_CLOSE_COMBAT", + "MOVE_ENDURE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", + "MOVE_NIGHT_SLASH", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_KINGS_SHIELD" + ], + "EggMoves": [] + }, + "SPRITZEE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_FAIRY_WIND" + }, + { + "Level": "8", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "10", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "15", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "22", + "Move": "MOVE_WISH" + }, + { + "Level": "24", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "27", + "Move": "MOVE_DAZZLING_GLEAM" + }, + { + "Level": "30", + "Move": "MOVE_CHARM" + }, + { + "Level": "33", + "Move": "MOVE_CALM_MIND" + }, + { + "Level": "36", + "Move": "MOVE_MOONBLAST" + }, + { + "Level": "40", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "44", + "Move": "MOVE_HEAL_BLOCK" + }, + { + "Level": "48", + "Move": "MOVE_HYPNOSIS" + } + ], + "TMMoves": [ + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FLASH_CANNON", + "MOVE_LIGHT_SCREEN", + "MOVE_NASTY_PLOT", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_SUBSTITUTE", + "MOVE_THUNDERBOLT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "AROMATISSE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_FAIRY_WIND" + }, + { + "Level": "8", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "10", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "15", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "22", + "Move": "MOVE_WISH" + }, + { + "Level": "24", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "27", + "Move": "MOVE_DAZZLING_GLEAM" + }, + { + "Level": "30", + "Move": "MOVE_CHARM" + }, + { + "Level": "33", + "Move": "MOVE_CALM_MIND" + }, + { + "Level": "36", + "Move": "MOVE_MOONBLAST" + }, + { + "Level": "40", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "44", + "Move": "MOVE_HEAL_BLOCK" + }, + { + "Level": "48", + "Move": "MOVE_HYPNOSIS" + } + ], + "TMMoves": [ + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_NASTY_PLOT", + "MOVE_PROTECT", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_SUBSTITUTE", + "MOVE_THUNDERBOLT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SWIRLIX": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_CHARM" + }, + { + "Level": "6", + "Move": "MOVE_FAIRY_WIND" + }, + { + "Level": "12", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "15", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "18", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "21", + "Move": "MOVE_STRING_SHOT" + }, + { + "Level": "24", + "Move": "MOVE_COTTON_GUARD" + }, + { + "Level": "27", + "Move": "MOVE_ENERGY_BALL" + }, + { + "Level": "32", + "Move": "MOVE_WISH" + }, + { + "Level": "36", + "Move": "MOVE_PLAY_ROUGH" + }, + { + "Level": "40", + "Move": "MOVE_STICKY_WEB" + } + ], + "TMMoves": [ + "MOVE_CALM_MIND", + "MOVE_DAZZLING_GLEAM", + "MOVE_ENDURE", + "MOVE_FLAMETHROWER", + "MOVE_LIGHT_SCREEN", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_SAFEGUARD", + "MOVE_SELF_DESTRUCT", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWORDS_DANCE", + "MOVE_THUNDERBOLT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SLURPUFF": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_CHARM" + }, + { + "Level": "6", + "Move": "MOVE_FAIRY_WIND" + }, + { + "Level": "12", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "15", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "18", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "21", + "Move": "MOVE_STRING_SHOT" + }, + { + "Level": "24", + "Move": "MOVE_COTTON_GUARD" + }, + { + "Level": "27", + "Move": "MOVE_ENERGY_BALL" + }, + { + "Level": "32", + "Move": "MOVE_WISH" + }, + { + "Level": "36", + "Move": "MOVE_PLAY_ROUGH" + }, + { + "Level": "40", + "Move": "MOVE_STICKY_WEB" + } + ], + "TMMoves": [ + "MOVE_CALM_MIND", + "MOVE_DAZZLING_GLEAM", + "MOVE_ENDURE", + "MOVE_FLAMETHROWER", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_SAFEGUARD", + "MOVE_SELF_DESTRUCT", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWORDS_DANCE", + "MOVE_THUNDERBOLT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "INKAY": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_PECK" + }, + { + "Level": "3", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "6", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "14", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "15", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "21", + "Move": "MOVE_SLASH" + }, + { + "Level": "24", + "Move": "MOVE_NIGHT_SLASH" + }, + { + "Level": "33", + "Move": "MOVE_PSYCHO_CUT" + }, + { + "Level": "37", + "Move": "MOVE_PSYSHOCK" + }, + { + "Level": "42", + "Move": "MOVE_TOPSY_TURVY" + }, + { + "Level": "54", + "Move": "MOVE_CLOSE_COMBAT" + } + ], + "TMMoves": [ + "MOVE_CALM_MIND", + "MOVE_DARK_PULSE", + "MOVE_ENDURE", + "MOVE_FLAMETHROWER", + "MOVE_FUTURE_SIGHT", + "MOVE_HEADBUTT", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_NASTY_PLOT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THUNDERBOLT", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MALAMAR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_PECK" + }, + { + "Level": "3", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "6", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "14", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "15", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "21", + "Move": "MOVE_SLASH" + }, + { + "Level": "24", + "Move": "MOVE_NIGHT_SLASH" + }, + { + "Level": "33", + "Move": "MOVE_PSYCHO_CUT" + }, + { + "Level": "37", + "Move": "MOVE_PSYSHOCK" + }, + { + "Level": "42", + "Move": "MOVE_TOPSY_TURVY" + }, + { + "Level": "54", + "Move": "MOVE_CLOSE_COMBAT" + } + ], + "TMMoves": [ + "MOVE_BULK_UP", + "MOVE_CALM_MIND", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FLAMETHROWER", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_NASTY_PLOT", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THUNDERBOLT", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "BINACLE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "1", + "Move": "MOVE_SCREECH" + }, + { + "Level": "9", + "Move": "MOVE_INFESTATION" + }, + { + "Level": "12", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "14", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "16", + "Move": "MOVE_ROCK_BLAST" + }, + { + "Level": "18", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "23", + "Move": "MOVE_SLASH" + }, + { + "Level": "35", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "40", + "Move": "MOVE_NIGHT_SLASH" + }, + { + "Level": "45", + "Move": "MOVE_LIQUIDATION" + }, + { + "Level": "50", + "Move": "MOVE_STONE_EDGE" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_ICE_BEAM", + "MOVE_MUD_SHOT", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_CLAW", + "MOVE_SLUDGE_BOMB", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_WATERFALL", + "MOVE_X_SCISSOR" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "BARBARACLE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "1", + "Move": "MOVE_SCREECH" + }, + { + "Level": "9", + "Move": "MOVE_INFESTATION" + }, + { + "Level": "12", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "14", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "16", + "Move": "MOVE_ROCK_BLAST" + }, + { + "Level": "18", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "23", + "Move": "MOVE_SLASH" + }, + { + "Level": "35", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "40", + "Move": "MOVE_NIGHT_SLASH" + }, + { + "Level": "43", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "45", + "Move": "MOVE_LIQUIDATION" + }, + { + "Level": "50", + "Move": "MOVE_STONE_EDGE" + }, + { + "Level": "54", + "Move": "MOVE_CLOSE_COMBAT" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BULK_UP", + "MOVE_DIG", + "MOVE_DRAGON_CLAW", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_MUD_SHOT", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_CLAW", + "MOVE_SLUDGE_BOMB", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_WATERFALL", + "MOVE_X_SCISSOR" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SKRELP": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "1", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "5", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "10", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "15", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "22", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "25", + "Move": "MOVE_TOXIC" + }, + { + "Level": "30", + "Move": "MOVE_WATER_PULSE" + }, + { + "Level": "32", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "36", + "Move": "MOVE_DRAGON_PULSE" + }, + { + "Level": "40", + "Move": "MOVE_SLUDGE_BOMB" + }, + { + "Level": "46", + "Move": "MOVE_HYDRO_PUMP" + }, + { + "Level": "52", + "Move": "MOVE_SLUDGE_WAVE" + } + ], + "TMMoves": [ + "MOVE_ENDURE", + "MOVE_FLIP_TURN", + "MOVE_GUNK_SHOT", + "MOVE_LIQUIDATION", + "MOVE_OUTRAGE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC_SPIKES", + "MOVE_WATERFALL" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "DRAGALGE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "1", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "5", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "10", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "15", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "22", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "25", + "Move": "MOVE_TOXIC" + }, + { + "Level": "30", + "Move": "MOVE_WATER_PULSE" + }, + { + "Level": "32", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "36", + "Move": "MOVE_DRAGON_PULSE" + }, + { + "Level": "40", + "Move": "MOVE_SLUDGE_BOMB" + }, + { + "Level": "46", + "Move": "MOVE_HYDRO_PUMP" + }, + { + "Level": "52", + "Move": "MOVE_SLUDGE_WAVE" + } + ], + "TMMoves": [ + "MOVE_DRACO_METEOR", + "MOVE_ENDURE", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_BLAST", + "MOVE_GUNK_SHOT", + "MOVE_HYPER_BEAM", + "MOVE_LIQUIDATION", + "MOVE_OUTRAGE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC_SPIKES", + "MOVE_WATERFALL" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "CLAUNCHER": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "1", + "Move": "MOVE_SPLASH" + }, + { + "Level": "10", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "13", + "Move": "MOVE_AQUA_JET" + }, + { + "Level": "16", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "24", + "Move": "MOVE_WATER_PULSE" + }, + { + "Level": "30", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "34", + "Move": "MOVE_AURA_SPHERE" + }, + { + "Level": "40", + "Move": "MOVE_DARK_PULSE" + }, + { + "Level": "45", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "48", + "Move": "MOVE_DRAGON_PULSE" + }, + { + "Level": "52", + "Move": "MOVE_HYDRO_PUMP" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_ENDURE", + "MOVE_FLASH_CANNON", + "MOVE_FLIP_TURN", + "MOVE_ICE_BEAM", + "MOVE_LIQUIDATION", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_U_TURN", + "MOVE_WATERFALL" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "CLAWITZER": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "1", + "Move": "MOVE_SPLASH" + }, + { + "Level": "10", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "13", + "Move": "MOVE_AQUA_JET" + }, + { + "Level": "16", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "24", + "Move": "MOVE_WATER_PULSE" + }, + { + "Level": "30", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "34", + "Move": "MOVE_AURA_SPHERE" + }, + { + "Level": "40", + "Move": "MOVE_DARK_PULSE" + }, + { + "Level": "45", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "48", + "Move": "MOVE_DRAGON_PULSE" + }, + { + "Level": "52", + "Move": "MOVE_HYDRO_PUMP" + }, + { + "Level": "55", + "Move": "MOVE_FOCUS_BLAST" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_ENDURE", + "MOVE_FLASH_CANNON", + "MOVE_FLIP_TURN", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_LIQUIDATION", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_U_TURN", + "MOVE_WATERFALL" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "HELIOPTILE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_THUNDER_SHOCK" + }, + { + "Level": "1", + "Move": "MOVE_THUNDER_WAVE" + }, + { + "Level": "12", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "15", + "Move": "MOVE_SWIFT" + }, + { + "Level": "20", + "Move": "MOVE_PARABOLIC_CHARGE" + }, + { + "Level": "24", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "28", + "Move": "MOVE_VOLT_SWITCH" + }, + { + "Level": "30", + "Move": "MOVE_BREAKING_SWIPE" + }, + { + "Level": "32", + "Move": "MOVE_MORNING_SUN" + }, + { + "Level": "36", + "Move": "MOVE_THUNDERBOLT" + }, + { + "Level": "42", + "Move": "MOVE_CHARGE" + }, + { + "Level": "50", + "Move": "MOVE_THUNDER" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_LIGHT_SCREEN", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_U_TURN", + "MOVE_WILD_CHARGE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "HELIOLISK": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_THUNDER_SHOCK" + }, + { + "Level": "1", + "Move": "MOVE_THUNDER_WAVE" + }, + { + "Level": "12", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "15", + "Move": "MOVE_SWIFT" + }, + { + "Level": "20", + "Move": "MOVE_PARABOLIC_CHARGE" + }, + { + "Level": "24", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "28", + "Move": "MOVE_VOLT_SWITCH" + }, + { + "Level": "30", + "Move": "MOVE_BREAKING_SWIPE" + }, + { + "Level": "32", + "Move": "MOVE_MORNING_SUN" + }, + { + "Level": "36", + "Move": "MOVE_THUNDERBOLT" + }, + { + "Level": "42", + "Move": "MOVE_CHARGE" + }, + { + "Level": "50", + "Move": "MOVE_THUNDER" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DRAGON_PULSE", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_THUNDER_PUNCH", + "MOVE_U_TURN", + "MOVE_WILD_CHARGE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "TYRUNT": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "4", + "Move": "MOVE_ROAR" + }, + { + "Level": "8", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "12", + "Move": "MOVE_CHARM" + }, + { + "Level": "16", + "Move": "MOVE_BITE" + }, + { + "Level": "24", + "Move": "MOVE_ROCK_BLAST" + }, + { + "Level": "28", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "32", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "36", + "Move": "MOVE_DRAGON_CLAW" + }, + { + "Level": "44", + "Move": "MOVE_EARTHQUAKE" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CLOSE_COMBAT", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_PULSE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FIRE_FANG", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_OUTRAGE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_ROCK_TOMB", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER_FANG", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "TYRANTRUM": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_BREAKING_SWIPE" + }, + { + "Level": "4", + "Move": "MOVE_ROAR" + }, + { + "Level": "8", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "12", + "Move": "MOVE_CHARM" + }, + { + "Level": "16", + "Move": "MOVE_BITE" + }, + { + "Level": "24", + "Move": "MOVE_ROCK_BLAST" + }, + { + "Level": "28", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "32", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "36", + "Move": "MOVE_DRAGON_CLAW" + }, + { + "Level": "44", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "52", + "Move": "MOVE_GIGA_IMPACT" + }, + { + "Level": "58", + "Move": "MOVE_HEAD_SMASH" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CLOSE_COMBAT", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_PULSE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FIRE_FANG", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_OUTRAGE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_ROCK_TOMB", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER_FANG", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "AMAURA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "10", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "12", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "16", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "20", + "Move": "MOVE_MIST" + }, + { + "Level": "24", + "Move": "MOVE_ROCK_BLAST" + }, + { + "Level": "28", + "Move": "MOVE_THUNDER_WAVE" + }, + { + "Level": "36", + "Move": "MOVE_FREEZE_DRY" + }, + { + "Level": "40", + "Move": "MOVE_ICE_BEAM" + }, + { + "Level": "44", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "52", + "Move": "MOVE_BLIZZARD" + }, + { + "Level": "56", + "Move": "MOVE_HYPER_BEAM" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_DARK_PULSE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FLASH_CANNON", + "MOVE_HYPER_VOICE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SAFEGUARD", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_THUNDERBOLT", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "AURORUS": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "10", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "12", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "16", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "20", + "Move": "MOVE_MIST" + }, + { + "Level": "24", + "Move": "MOVE_ROCK_BLAST" + }, + { + "Level": "28", + "Move": "MOVE_THUNDER_WAVE" + }, + { + "Level": "36", + "Move": "MOVE_FREEZE_DRY" + }, + { + "Level": "40", + "Move": "MOVE_ICE_BEAM" + }, + { + "Level": "44", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "52", + "Move": "MOVE_BLIZZARD" + }, + { + "Level": "56", + "Move": "MOVE_HYPER_BEAM" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_DARK_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_VOICE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SAFEGUARD", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SYLVEON": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "10", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "15", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "25", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "30", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "35", + "Move": "MOVE_DAZZLING_GLEAM" + }, + { + "Level": "40", + "Move": "MOVE_HYPER_VOICE" + }, + { + "Level": "45", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "50", + "Move": "MOVE_MOONBLAST" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_ROAR", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT" + ], + "TutorMoves": [ + "MOVE_CHARM", + "MOVE_DOUBLE_EDGE", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_WISH" + ], + "EggMoves": [] + }, + "HAWLUCHA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "4", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "8", + "Move": "MOVE_DETECT" + }, + { + "Level": "12", + "Move": "MOVE_AERIAL_ACE" + }, + { + "Level": "20", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "24", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "26", + "Move": "MOVE_LUNGE" + }, + { + "Level": "28", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "32", + "Move": "MOVE_TAUNT" + }, + { + "Level": "36", + "Move": "MOVE_FLYING_PRESS" + }, + { + "Level": "40", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "44", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "52", + "Move": "MOVE_BRAVE_BIRD" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_BULK_UP", + "MOVE_CLOSE_COMBAT", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FIRE_PUNCH", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER_PUNCH", + "MOVE_U_TURN", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "DEDENNE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_THUNDER_SHOCK" + }, + { + "Level": "1", + "Move": "MOVE_NUZZLE" + }, + { + "Level": "5", + "Move": "MOVE_CHARGE" + }, + { + "Level": "10", + "Move": "MOVE_CHARM" + }, + { + "Level": "15", + "Move": "MOVE_PARABOLIC_CHARGE" + }, + { + "Level": "20", + "Move": "MOVE_EERIE_IMPULSE" + }, + { + "Level": "25", + "Move": "MOVE_VOLT_SWITCH" + }, + { + "Level": "30", + "Move": "MOVE_PLAY_ROUGH" + }, + { + "Level": "35", + "Move": "MOVE_THUNDERBOLT" + }, + { + "Level": "40", + "Move": "MOVE_SUPER_FANG" + }, + { + "Level": "50", + "Move": "MOVE_THUNDER" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_ENDURE", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_LIGHT_SCREEN", + "MOVE_PROTECT", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_U_TURN", + "MOVE_WILD_CHARGE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "CARBINK": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "12", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "15", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "23", + "Move": "MOVE_DAZZLING_GLEAM" + }, + { + "Level": "25", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "28", + "Move": "MOVE_POWER_GEM" + }, + { + "Level": "30", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "32", + "Move": "MOVE_FLASH_CANNON" + }, + { + "Level": "35", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "38", + "Move": "MOVE_STEALTH_ROCK" + }, + { + "Level": "45", + "Move": "MOVE_MOONBLAST" + }, + { + "Level": "52", + "Move": "MOVE_STONE_EDGE" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_REFLECT", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_TOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GOOMY": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_ABSORB" + }, + { + "Level": "5", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "8", + "Move": "MOVE_CHARM" + }, + { + "Level": "10", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "15", + "Move": "MOVE_PROTECT" + }, + { + "Level": "18", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "25", + "Move": "MOVE_WATER_PULSE" + }, + { + "Level": "30", + "Move": "MOVE_DRAGON_PULSE" + }, + { + "Level": "35", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "41", + "Move": "MOVE_CURSE" + }, + { + "Level": "45", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "56", + "Move": "MOVE_SURF" + } + ], + "TMMoves": [ + "MOVE_DRACO_METEOR", + "MOVE_ENDURE", + "MOVE_OUTRAGE", + "MOVE_ROCK_SLIDE", + "MOVE_SLUDGE_BOMB", + "MOVE_SUBSTITUTE", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SLIGGOO": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_ABSORB" + }, + { + "Level": "1", + "Move": "MOVE_ACID_ARMOR" + }, + { + "Level": "5", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "8", + "Move": "MOVE_CHARM" + }, + { + "Level": "10", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "15", + "Move": "MOVE_PROTECT" + }, + { + "Level": "18", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "25", + "Move": "MOVE_WATER_PULSE" + }, + { + "Level": "30", + "Move": "MOVE_DRAGON_PULSE" + }, + { + "Level": "35", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "41", + "Move": "MOVE_CURSE" + }, + { + "Level": "45", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "56", + "Move": "MOVE_SURF" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_DRACO_METEOR", + "MOVE_ENDURE", + "MOVE_ICE_BEAM", + "MOVE_OUTRAGE", + "MOVE_ROCK_SLIDE", + "MOVE_SLUDGE_BOMB", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SLIGGOO_HISUI": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_ABSORB" + }, + { + "Level": "1", + "Move": "MOVE_ACID_ARMOR" + }, + { + "Level": "5", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "8", + "Move": "MOVE_CHARM" + }, + { + "Level": "10", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "15", + "Move": "MOVE_PROTECT" + }, + { + "Level": "18", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "25", + "Move": "MOVE_WATER_PULSE" + }, + { + "Level": "30", + "Move": "MOVE_DRAGON_PULSE" + }, + { + "Level": "35", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "41", + "Move": "MOVE_CURSE" + }, + { + "Level": "45", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "56", + "Move": "MOVE_SURF" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_DRACO_METEOR", + "MOVE_ENDURE", + "MOVE_ICE_BEAM", + "MOVE_IRON_HEAD", + "MOVE_OUTRAGE", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SLUDGE_BOMB", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC" + ], + "TutorMoves": [ + "MOVE_IRON_DEFENSE" + ], + "EggMoves": [] + }, + "GOODRA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_ABSORB" + }, + { + "Level": "1", + "Move": "MOVE_ACID_ARMOR" + }, + { + "Level": "1", + "Move": "MOVE_BREAKING_SWIPE" + }, + { + "Level": "5", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "8", + "Move": "MOVE_CHARM" + }, + { + "Level": "10", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "15", + "Move": "MOVE_PROTECT" + }, + { + "Level": "18", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "25", + "Move": "MOVE_WATER_PULSE" + }, + { + "Level": "30", + "Move": "MOVE_DRAGON_PULSE" + }, + { + "Level": "35", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "41", + "Move": "MOVE_CURSE" + }, + { + "Level": "45", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "56", + "Move": "MOVE_SURF" + }, + { + "Level": "58", + "Move": "MOVE_POWER_WHIP" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BULLDOZE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CLAW", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_KNOCK_OFF", + "MOVE_OUTRAGE", + "MOVE_ROCK_SLIDE", + "MOVE_SLUDGE_BOMB", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GOODRA_HISUI": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_ABSORB" + }, + { + "Level": "1", + "Move": "MOVE_ACID_ARMOR" + }, + { + "Level": "1", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "5", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "8", + "Move": "MOVE_CHARM" + }, + { + "Level": "10", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "15", + "Move": "MOVE_PROTECT" + }, + { + "Level": "18", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "25", + "Move": "MOVE_WATER_PULSE" + }, + { + "Level": "30", + "Move": "MOVE_DRAGON_PULSE" + }, + { + "Level": "35", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "41", + "Move": "MOVE_CURSE" + }, + { + "Level": "44", + "Move": "MOVE_IRON_TAIL" + }, + { + "Level": "45", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "55", + "Move": "MOVE_HEAVY_SLAM" + }, + { + "Level": "56", + "Move": "MOVE_SURF" + }, + { + "Level": "58", + "Move": "MOVE_SLUDGE_WAVE" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BULLDOZE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CLAW", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_OUTRAGE", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SLUDGE_BOMB", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC" + ], + "TutorMoves": [ + "MOVE_BREAKING_SWIPE" + ], + "EggMoves": [] + }, + "KLEFKI": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "8", + "Move": "MOVE_FAIRY_WIND" + }, + { + "Level": "13", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "20", + "Move": "MOVE_METAL_SOUND" + }, + { + "Level": "24", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "36", + "Move": "MOVE_FLASH_CANNON" + }, + { + "Level": "40", + "Move": "MOVE_PLAY_ROUGH" + }, + { + "Level": "44", + "Move": "MOVE_DAZZLING_GLEAM" + }, + { + "Level": "52", + "Move": "MOVE_HEAL_BLOCK" + } + ], + "TMMoves": [ + "MOVE_CALM_MIND", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER_WAVE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "PHANTUMP": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "8", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "12", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "16", + "Move": "MOVE_WILL_O_WISP" + }, + { + "Level": "24", + "Move": "MOVE_GROWTH" + }, + { + "Level": "28", + "Move": "MOVE_HORN_LEECH" + }, + { + "Level": "32", + "Move": "MOVE_FORESTS_CURSE" + }, + { + "Level": "36", + "Move": "MOVE_PHANTOM_FORCE" + }, + { + "Level": "44", + "Move": "MOVE_WOOD_HAMMER" + }, + { + "Level": "50", + "Move": "MOVE_CURSE" + } + ], + "TMMoves": [ + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_GIGA_DRAIN", + "MOVE_HEAL_BLOCK", + "MOVE_MAGICAL_LEAF", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "TREVENANT": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "8", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "12", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "16", + "Move": "MOVE_WILL_O_WISP" + }, + { + "Level": "24", + "Move": "MOVE_GROWTH" + }, + { + "Level": "28", + "Move": "MOVE_HORN_LEECH" + }, + { + "Level": "30", + "Move": "MOVE_SHADOW_CLAW" + }, + { + "Level": "32", + "Move": "MOVE_FORESTS_CURSE" + }, + { + "Level": "36", + "Move": "MOVE_PHANTOM_FORCE" + }, + { + "Level": "44", + "Move": "MOVE_WOOD_HAMMER" + }, + { + "Level": "50", + "Move": "MOVE_CURSE" + } + ], + "TMMoves": [ + "MOVE_CALM_MIND", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_MAGICAL_LEAF", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_X_SCISSOR" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "PUMPKABOO": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TRICK_OR_TREAT" + }, + { + "Level": "4", + "Move": "MOVE_SHADOW_SNEAK" + }, + { + "Level": "8", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "12", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "16", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "20", + "Move": "MOVE_BULLET_SEED" + }, + { + "Level": "24", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "27", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "36", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "40", + "Move": "MOVE_MYSTICAL_FIRE" + }, + { + "Level": "46", + "Move": "MOVE_POWER_WHIP" + } + ], + "TMMoves": [ + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_GIGA_DRAIN", + "MOVE_LIGHT_SCREEN", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_ROCK_SLIDE", + "MOVE_SAFEGUARD", + "MOVE_SELF_DESTRUCT", + "MOVE_SLUDGE_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GOURGEIST": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_TRICK_OR_TREAT" + }, + { + "Level": "1", + "Move": "MOVE_MOONBLAST" + }, + { + "Level": "4", + "Move": "MOVE_SHADOW_SNEAK" + }, + { + "Level": "8", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "12", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "16", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "20", + "Move": "MOVE_BULLET_SEED" + }, + { + "Level": "24", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "27", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "36", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "40", + "Move": "MOVE_MYSTICAL_FIRE" + }, + { + "Level": "44", + "Move": "MOVE_PHANTOM_FORCE" + }, + { + "Level": "46", + "Move": "MOVE_POWER_WHIP" + }, + { + "Level": "52", + "Move": "MOVE_EXPLOSION" + } + ], + "TMMoves": [ + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_LIGHT_SCREEN", + "MOVE_NASTY_PLOT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_ROCK_SLIDE", + "MOVE_SAFEGUARD", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_CLAW", + "MOVE_SLUDGE_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "BERGMITE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "3", + "Move": "MOVE_TACKLE" + }, + { + "Level": "9", + "Move": "MOVE_CURSE" + }, + { + "Level": "12", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "15", + "Move": "MOVE_PROTECT" + }, + { + "Level": "21", + "Move": "MOVE_BITE" + }, + { + "Level": "24", + "Move": "MOVE_ICE_FANG" + }, + { + "Level": "27", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "30", + "Move": "MOVE_RECOVER" + }, + { + "Level": "33", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "36", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "42", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "54", + "Move": "MOVE_BLIZZARD" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_ENDURE", + "MOVE_ICE_BEAM", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "AVALUGG": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "1", + "Move": "MOVE_HEAVY_SLAM" + }, + { + "Level": "3", + "Move": "MOVE_TACKLE" + }, + { + "Level": "9", + "Move": "MOVE_CURSE" + }, + { + "Level": "12", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "15", + "Move": "MOVE_PROTECT" + }, + { + "Level": "21", + "Move": "MOVE_BITE" + }, + { + "Level": "24", + "Move": "MOVE_ICE_FANG" + }, + { + "Level": "27", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "30", + "Move": "MOVE_RECOVER" + }, + { + "Level": "33", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "36", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "39", + "Move": "MOVE_ICICLE_CRASH" + }, + { + "Level": "42", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "54", + "Move": "MOVE_BLIZZARD" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SURF" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "AVALUGG_HISUI": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "1", + "Move": "MOVE_HEAVY_SLAM" + }, + { + "Level": "3", + "Move": "MOVE_TACKLE" + }, + { + "Level": "9", + "Move": "MOVE_CURSE" + }, + { + "Level": "12", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "15", + "Move": "MOVE_PROTECT" + }, + { + "Level": "21", + "Move": "MOVE_BITE" + }, + { + "Level": "24", + "Move": "MOVE_ICE_FANG" + }, + { + "Level": "27", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "30", + "Move": "MOVE_RECOVER" + }, + { + "Level": "33", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "36", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "39", + "Move": "MOVE_ROCK_BLAST" + }, + { + "Level": "42", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "46", + "Move": "MOVE_STONE_EDGE" + }, + { + "Level": "48", + "Move": "MOVE_IRON_HEAD" + }, + { + "Level": "54", + "Move": "MOVE_BLIZZARD" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SURF" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "NOIBAT": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_ABSORB" + }, + { + "Level": "4", + "Move": "MOVE_GUST" + }, + { + "Level": "8", + "Move": "MOVE_SUPERSONIC" + }, + { + "Level": "12", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "16", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "20", + "Move": "MOVE_BITE" + }, + { + "Level": "24", + "Move": "MOVE_LEECH_LIFE" + }, + { + "Level": "28", + "Move": "MOVE_WHIRLWIND" + }, + { + "Level": "32", + "Move": "MOVE_SUPER_FANG" + }, + { + "Level": "36", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "40", + "Move": "MOVE_SCREECH" + }, + { + "Level": "44", + "Move": "MOVE_HURRICANE" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BRICK_BREAK", + "MOVE_DARK_PULSE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_ENDURE", + "MOVE_FLY", + "MOVE_HEAT_WAVE", + "MOVE_HYPER_VOICE", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_U_TURN", + "MOVE_WILD_CHARGE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "NOIVERN": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_ABSORB" + }, + { + "Level": "1", + "Move": "MOVE_MOONLIGHT" + }, + { + "Level": "4", + "Move": "MOVE_GUST" + }, + { + "Level": "8", + "Move": "MOVE_SUPERSONIC" + }, + { + "Level": "12", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "16", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "20", + "Move": "MOVE_BITE" + }, + { + "Level": "24", + "Move": "MOVE_LEECH_LIFE" + }, + { + "Level": "28", + "Move": "MOVE_WHIRLWIND" + }, + { + "Level": "32", + "Move": "MOVE_SUPER_FANG" + }, + { + "Level": "36", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "40", + "Move": "MOVE_SCREECH" + }, + { + "Level": "44", + "Move": "MOVE_HURRICANE" + }, + { + "Level": "52", + "Move": "MOVE_BOOMBURST" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_DARK_PULSE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CLAW", + "MOVE_ENDURE", + "MOVE_FLAMETHROWER", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_WAVE", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_U_TURN", + "MOVE_WATER_PULSE", + "MOVE_WILD_CHARGE" + ], + "TutorMoves": [ + "MOVE_DRAGON_PULSE" + ], + "EggMoves": [] + }, + "XERNEAS": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "5", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "20", + "Move": "MOVE_NIGHT_SLASH" + }, + { + "Level": "35", + "Move": "MOVE_HORN_LEECH" + }, + { + "Level": "50", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "55", + "Move": "MOVE_GEOMANCY" + }, + { + "Level": "60", + "Move": "MOVE_MOONBLAST" + }, + { + "Level": "70", + "Move": "MOVE_MEGAHORN" + }, + { + "Level": "75", + "Move": "MOVE_CLOSE_COMBAT" + }, + { + "Level": "80", + "Move": "MOVE_OUTRAGE" + }, + { + "Level": "85", + "Move": "MOVE_GIGA_IMPACT" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_DAZZLING_GLEAM", + "MOVE_ENDURE", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_BLAST", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "YVELTAL": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_GUST" + }, + { + "Level": "1", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "5", + "Move": "MOVE_TAUNT" + }, + { + "Level": "10", + "Move": "MOVE_SNARL" + }, + { + "Level": "35", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "40", + "Move": "MOVE_DARK_PULSE" + }, + { + "Level": "45", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "55", + "Move": "MOVE_OBLIVION_WING" + }, + { + "Level": "60", + "Move": "MOVE_PHANTOM_FORCE" + }, + { + "Level": "65", + "Move": "MOVE_DRAGON_RUSH" + }, + { + "Level": "70", + "Move": "MOVE_HURRICANE" + }, + { + "Level": "75", + "Move": "MOVE_FOCUS_BLAST" + }, + { + "Level": "85", + "Move": "MOVE_HYPER_BEAM" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_DRAGON_CLAW", + "MOVE_ENDURE", + "MOVE_FLY", + "MOVE_GIGA_IMPACT", + "MOVE_HEAL_BLOCK", + "MOVE_HEAT_WAVE", + "MOVE_HYPER_VOICE", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_U_TURN", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "ZYGARDE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "1", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "1", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "1", + "Move": "MOVE_THOUSAND_ARROWS" + }, + { + "Level": "1", + "Move": "MOVE_THOUSAND_WAVES" + }, + { + "Level": "1", + "Move": "MOVE_LANDS_WRATH" + }, + { + "Level": "1", + "Move": "MOVE_CORE_ENFORCER" + }, + { + "Level": "8", + "Move": "MOVE_HAZE" + }, + { + "Level": "16", + "Move": "MOVE_DIG" + }, + { + "Level": "24", + "Move": "MOVE_SAFEGUARD" + }, + { + "Level": "32", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "40", + "Move": "MOVE_DRAGON_PULSE" + }, + { + "Level": "44", + "Move": "MOVE_BREAKING_SWIPE" + }, + { + "Level": "56", + "Move": "MOVE_GLARE" + }, + { + "Level": "60", + "Move": "MOVE_SLUDGE_WAVE" + }, + { + "Level": "70", + "Move": "MOVE_EXTREME_SPEED" + }, + { + "Level": "80", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "88", + "Move": "MOVE_OUTRAGE" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_DRACO_METEOR", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_HEAD", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "DIANCIE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "1", + "Move": "MOVE_DIAMOND_STORM" + }, + { + "Level": "7", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "14", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "21", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "33", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "42", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "44", + "Move": "MOVE_POWER_GEM" + }, + { + "Level": "46", + "Move": "MOVE_STEALTH_ROCK" + }, + { + "Level": "50", + "Move": "MOVE_STONE_EDGE" + }, + { + "Level": "54", + "Move": "MOVE_MOONBLAST" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_DAZZLING_GLEAM", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_METRONOME", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_ROCK_TOMB", + "MOVE_SAFEGUARD", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "HOOPA_CONFINED": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "15", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "19", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "22", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "35", + "Move": "MOVE_PHANTOM_FORCE" + }, + { + "Level": "38", + "Move": "MOVE_ZEN_HEADBUTT" + }, + { + "Level": "42", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "45", + "Move": "MOVE_NASTY_PLOT" + }, + { + "Level": "52", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "60", + "Move": "MOVE_HYPERSPACE_HOLE" + } + ], + "TMMoves": [ + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_DARK_PULSE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_ROCK_TOMB", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "HOOPA_UNBOUND": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "15", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "19", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "22", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "35", + "Move": "MOVE_PHANTOM_FORCE" + }, + { + "Level": "38", + "Move": "MOVE_ZEN_HEADBUTT" + }, + { + "Level": "42", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "45", + "Move": "MOVE_NASTY_PLOT" + }, + { + "Level": "52", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "60", + "Move": "MOVE_HYPERSPACE_FURY" + } + ], + "TMMoves": [ + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_DARK_PULSE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_ROCK_TOMB", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "VOLCANION": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "1", + "Move": "MOVE_FIRE_SPIN" + }, + { + "Level": "1", + "Move": "MOVE_STEAM_ERUPTION" + }, + { + "Level": "6", + "Move": "MOVE_LEER" + }, + { + "Level": "18", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "24", + "Move": "MOVE_WATER_PULSE" + }, + { + "Level": "30", + "Move": "MOVE_HEAT_CRASH" + }, + { + "Level": "33", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "40", + "Move": "MOVE_MIST" + }, + { + "Level": "40", + "Move": "MOVE_HAZE" + }, + { + "Level": "42", + "Move": "MOVE_HEAVY_SLAM" + }, + { + "Level": "46", + "Move": "MOVE_HYDRO_PUMP" + }, + { + "Level": "50", + "Move": "MOVE_FLARE_BLITZ" + }, + { + "Level": "54", + "Move": "MOVE_OVERHEAT" + }, + { + "Level": "60", + "Move": "MOVE_EXPLOSION" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FLAMETHROWER", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_WAVE", + "MOVE_HYPER_BEAM", + "MOVE_LIQUIDATION", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SLUDGE_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THUNDER_FANG", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "DRAMPA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_TWISTER" + }, + { + "Level": "5", + "Move": "MOVE_PROTECT" + }, + { + "Level": "10", + "Move": "MOVE_GLARE" + }, + { + "Level": "15", + "Move": "MOVE_SAFEGUARD" + }, + { + "Level": "20", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "25", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "28", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "32", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "35", + "Move": "MOVE_DRAGON_PULSE" + }, + { + "Level": "40", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "44", + "Move": "MOVE_FLY" + }, + { + "Level": "50", + "Move": "MOVE_HYPER_VOICE" + }, + { + "Level": "54", + "Move": "MOVE_OUTRAGE" + }, + { + "Level": "56", + "Move": "MOVE_DRAGON_RUSH" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_CALM_MIND", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CLAW", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_WAVE", + "MOVE_HURRICANE", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_PLAY_ROUGH", + "MOVE_ROCK_SLIDE", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_WHIRLWIND", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "FALINKS": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_PROTECT" + }, + { + "Level": "5", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "10", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "15", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "20", + "Move": "MOVE_BULK_UP" + }, + { + "Level": "25", + "Move": "MOVE_ENDURE" + }, + { + "Level": "32", + "Move": "MOVE_IRON_HEAD" + }, + { + "Level": "36", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "40", + "Move": "MOVE_NO_RETREAT" + }, + { + "Level": "43", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "48", + "Move": "MOVE_CLOSE_COMBAT" + }, + { + "Level": "52", + "Move": "MOVE_MEGAHORN" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_KNOCK_OFF", + "MOVE_POISON_JAB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + } +} \ No newline at end of file diff --git a/tools/mapjson/mapjson.cpp b/tools/mapjson/mapjson.cpp index 4dd036dc1926..936c2a52863c 100644 --- a/tools/mapjson/mapjson.cpp +++ b/tools/mapjson/mapjson.cpp @@ -530,12 +530,14 @@ string generate_map_constants_text(string groups_filepath, Json groups_data) { text << "//\n// DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/map_groups.json\n//\n\n"; + text << "enum\n{\n"; + int group_num = 0; vector map_count_vec; //DEBUG for (auto &group : groups_data["group_order"].array_items()) { string groupName = json_to_string(group); - text << "// " << groupName << "\n"; + text << " // " << groupName << "\n"; vector map_ids; size_t max_length = 0; @@ -556,8 +558,8 @@ string generate_map_constants_text(string groups_filepath, Json groups_data) { int map_id_num = 0; for (string map_id : map_ids) { - text << "#define " << map_id << string((max_length - map_id.length() + 1), ' ') - << "(" << map_id_num++ << " | (" << group_num << " << 8))\n"; + text << " " << map_id << string(max_length - map_id.length(), ' ') + << " = (" << map_id_num++ << " | (" << group_num << " << 8)),\n"; } text << "\n"; @@ -565,6 +567,8 @@ string generate_map_constants_text(string groups_filepath, Json groups_data) { map_count_vec.push_back(map_count); //DEBUG } + text << "};\n\n"; + text << "#define MAP_GROUPS_COUNT " << group_num << "\n\n"; text << get_include_guard_end(guard_name); diff --git a/tools/mid2agb/agb.cpp b/tools/mid2agb/agb.cpp index 3bc4f601ac6b..ab8943637322 100644 --- a/tools/mid2agb/agb.cpp +++ b/tools/mid2agb/agb.cpp @@ -46,7 +46,7 @@ static int s_memaccParam2; void PrintAgbHeader() { std::fprintf(g_outputFile, "\t.include \"MPlayDef.s\"\n\n"); - std::fprintf(g_outputFile, "\t.equ\t%s_grp, voicegroup%03u\n", g_asmLabel.c_str(), g_voiceGroup); + std::fprintf(g_outputFile, "\t.equ\t%s_grp, voicegroup%s\n", g_asmLabel.c_str(), g_voiceGroup.c_str()); std::fprintf(g_outputFile, "\t.equ\t%s_pri, %u\n", g_asmLabel.c_str(), g_priority); if (g_reverb >= 0) diff --git a/tools/mid2agb/main.cpp b/tools/mid2agb/main.cpp index ea2b294ac861..ca5a3da8a7d7 100644 --- a/tools/mid2agb/main.cpp +++ b/tools/mid2agb/main.cpp @@ -35,7 +35,7 @@ FILE* g_outputFile = nullptr; std::string g_asmLabel; int g_masterVolume = 127; -int g_voiceGroup = 0; +std::string g_voiceGroup = "_dummy"; int g_priority = 0; int g_reverb = -1; int g_clocksPerBeat = 1; @@ -52,7 +52,7 @@ bool g_compressionEnabled = true; "\n" "options -L??? label for assembler (default:output_file)\n" " -V??? master volume (default:127)\n" - " -G??? voice group number (default:0)\n" + " -G??? voice group label (default:_dummy)\n" " -P??? priority (default:0)\n" " -R??? reverb (default:off)\n" " -X 48 clocks/beat (default:24 clocks/beat)\n" @@ -149,7 +149,7 @@ int main(int argc, char** argv) arg = GetArgument(argc, argv, i); if (arg == nullptr) PrintUsage(); - g_voiceGroup = std::stoi(arg); + g_voiceGroup = arg; break; case 'L': arg = GetArgument(argc, argv, i); diff --git a/tools/mid2agb/main.h b/tools/mid2agb/main.h index 6e71e73fd4f1..76443e5db952 100644 --- a/tools/mid2agb/main.h +++ b/tools/mid2agb/main.h @@ -29,7 +29,7 @@ extern FILE* g_outputFile; extern std::string g_asmLabel; extern int g_masterVolume; -extern int g_voiceGroup; +extern std::string g_voiceGroup; extern int g_priority; extern int g_reverb; extern int g_clocksPerBeat; diff --git a/tools/misc/make_scr_cmd_constants.py b/tools/misc/make_scr_cmd_constants.py new file mode 100644 index 000000000000..d158dfcf8a31 --- /dev/null +++ b/tools/misc/make_scr_cmd_constants.py @@ -0,0 +1,25 @@ +import re + +SCR_CMD_PAT = re.compile(r"\tscript_cmd_table_entry (\w+)\s+\w+,\s+[\w=]+\s+@( 0x[0-9a-f]+)") + +def main(): + output = [ + "//", + "// DO NOT MODIFY THIS FILE! It is auto-generated by tools/misc/make_scr_cmd_constants.py", + "//", + "#ifndef GUARD_SCR_CMD_CONSTANTS_H", + "#define GUARD_SCR_CMD_CONSTANTS_H\n", + ] + + with open("data/script_cmd_table.inc", "r") as f: + for line in f.readlines(): + if match := re.match(SCR_CMD_PAT, line): + new_line = "#define " + match.group(1) + match.group(2) + output.append(new_line) + + output.append("\n#endif // GUARD_SCR_CMD_CONSTANTS_H\n") + with open("include/constants/script_commands.h", "w+") as f: + f.write('\n'.join(output)) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/tools/preproc/asm_file.cpp b/tools/preproc/asm_file.cpp index 66667935a1f1..6cfc4cbdb3de 100644 --- a/tools/preproc/asm_file.cpp +++ b/tools/preproc/asm_file.cpp @@ -517,8 +517,53 @@ bool AsmFile::ParseEnum() long fallbackPosition = m_pos; std::string headerFilename = ""; - long currentHeaderLine = SkipWhitespaceAndEol(); - std::string enumName = ReadIdentifier(); + long currentHeaderLine = 0; + std::string enumName; + while (true) + { + currentHeaderLine += SkipWhitespaceAndEol(); + std::string identifier = ReadIdentifier(); + if (identifier == "__attribute__") + { + if (m_pos + 1 >= m_size + || m_buffer[m_pos] != '(' + || m_buffer[m_pos + 1] != '(') + { + m_pos = fallbackPosition - 4; + return false; + } + + m_pos += 2; + int parens = 2; + while (true) + { + char c = m_buffer[m_pos++]; + if (c == '\n') + currentHeaderLine++; + + if (c == '(') + { + parens++; + } + else if (c == ')') + { + parens--; + if (parens == 0) + break; + } + else if (parens < 2 || m_pos == m_size) + { + m_pos = fallbackPosition - 4; + return false; + } + } + } + else + { + enumName = identifier; + break; + } + } currentHeaderLine += SkipWhitespaceAndEol(); std::string enumBase = "0"; long enumCounter = 0; @@ -575,6 +620,10 @@ bool AsmFile::ParseEnum() } enumCounter = 0; } + // HACK(#7394): Make the definitions global so that C 'asm' + // statements are able to reference them (if they happen to + // be available in an assembled object file). + std::printf(".global %s; ", currentIdentName.c_str()); std::printf(".equiv %s, (%s) + %ld\n", currentIdentName.c_str(), enumBase.c_str(), enumCounter); enumCounter++; symbolCount++; @@ -584,7 +633,11 @@ bool AsmFile::ParseEnum() RaiseError("%s:%ld: empty enum is invalid", headerFilename.c_str(), currentHeaderLine); } - if (m_buffer[m_pos] != ',') + if (m_buffer[m_pos] == '#') + { + currentHeaderLine = ParseLineSkipInEnum(); + } + else if (m_buffer[m_pos] != ',') { currentHeaderLine += SkipWhitespaceAndEol(); if (m_buffer[m_pos++] == '}' && m_buffer[m_pos++] == ';') @@ -679,7 +732,7 @@ void AsmFile::RaiseWarning(const char* format, ...) int AsmFile::SkipWhitespaceAndEol() { int newlines = 0; - while (m_buffer[m_pos] == '\t' || m_buffer[m_pos] == ' ' || m_buffer[m_pos] == '\n') + while (m_buffer[m_pos] == '\t' || m_buffer[m_pos] == ' ' || m_buffer[m_pos] == '\r' || m_buffer[m_pos] == '\n') { if (m_buffer[m_pos] == '\n') newlines++; @@ -688,6 +741,50 @@ int AsmFile::SkipWhitespaceAndEol() return newlines; } +int AsmFile::ParseLineSkipInEnum(void) +{ + m_pos++; + while (m_buffer[m_pos] == ' ' || m_buffer[m_pos] == '\t') + m_pos++; + + if (!IsAsciiDigit(m_buffer[m_pos])) + RaiseError("malformatted line indicator found inside `enum`, expected line number"); + + unsigned n = 0; + int digit = 0; + while ((digit = ConvertDigit(m_buffer[m_pos++], 10)) != -1) + n = 10 * n + digit; + + while (m_buffer[m_pos] == ' ' || m_buffer[m_pos] == '\t') + m_pos++; + + if (m_buffer[m_pos++] != '"') + RaiseError("malformatted line indicator found before `enum`, expected filename"); + + while (m_buffer[m_pos] != '"') + { + unsigned char c = m_buffer[m_pos++]; + + if (c == 0) + { + if (m_pos >= m_size) + RaiseError("unexpected EOF in line indicator"); + else + RaiseError("unexpected null character in line indicator"); + } + + if (!IsAsciiPrintable(c)) + RaiseError("unexpected character '\\x%02X' in line indicator", c); + + if (c == '\\') + { + c = m_buffer[m_pos]; + RaiseError("unexpected escape '\\%c' in line indicator", c); + } + } + return n - 1; +} + // returns the last line indicator and its corresponding file name without modifying the token index int AsmFile::FindLastLineNumber(std::string& filename) { diff --git a/tools/preproc/asm_file.h b/tools/preproc/asm_file.h index 33e6ce5c49c1..9cab32a97fb9 100644 --- a/tools/preproc/asm_file.h +++ b/tools/preproc/asm_file.h @@ -73,6 +73,7 @@ class AsmFile void VerifyStringLength(int length); int SkipWhitespaceAndEol(); int FindLastLineNumber(std::string& filename); + int ParseLineSkipInEnum(void); std::string ReadIdentifier(); long ReadInteger(std::string filename, long line); }; diff --git a/tools/preproc/c_file.cpp b/tools/preproc/c_file.cpp index 4b40d18bc828..f6138124397b 100644 --- a/tools/preproc/c_file.cpp +++ b/tools/preproc/c_file.cpp @@ -353,7 +353,7 @@ void CFile::TryConvertIncbin() // INCBIN_COMP; include *compressed* version of file if (incbinType == 7) - path = path.append(".lz"); + path = path.append(".smol"); m_pos++; diff --git a/tools/preproc/preproc.cpp b/tools/preproc/preproc.cpp index 20c2de51b635..ac9496d7016e 100644 --- a/tools/preproc/preproc.cpp +++ b/tools/preproc/preproc.cpp @@ -26,6 +26,11 @@ #include "c_file.h" #include "charmap.h" +#ifdef _WIN32 +#include +#include +#endif + static void UsageAndExit(const char *program); Charmap* g_charmap; @@ -179,6 +184,11 @@ int main(int argc, char **argv) g_charmap = new Charmap(charmap); +#ifdef _WIN32 + // On Windows, piping from stdout can break newlines. Treat stdout as binary stream to avoid this. + _setmode(_fileno(stdout), _O_BINARY); +#endif + const char* extension = GetFileExtension(source); if (!extension) diff --git a/tools/scaninc/c_file.cpp b/tools/scaninc/c_file.cpp index a978b9a50660..d34b1aa2353f 100644 --- a/tools/scaninc/c_file.cpp +++ b/tools/scaninc/c_file.cpp @@ -257,7 +257,7 @@ void CFile::CheckIncbin() // INCBIN_COMP; include *compressed* version of file if (incbinType == 6) - path = path.append(".lz"); + path = path.append(".smol"); SkipWhitespace(); diff --git a/tools/trainerproc/main.c b/tools/trainerproc/main.c index 478f35dd3d53..c3a39dc5a1de 100644 --- a/tools/trainerproc/main.c +++ b/tools/trainerproc/main.c @@ -149,6 +149,15 @@ struct Trainer struct String pool_prune; int pool_prune_line; + + struct String copy_pool; + int copy_pool_line; + + struct String macro; + int macro_line; + + struct String back_pic; + int back_pic_line; }; static bool is_empty_string(struct String s) @@ -169,7 +178,7 @@ static bool is_literal_string(struct String s1, const char *s2) } } -static bool starts_with(struct String s, const char *prefix) +static bool __attribute__((unused)) starts_with(struct String s, const char *prefix) { int n = strlen(prefix); return strncmp((const char *)s.string, prefix, n) == 0; @@ -1280,14 +1289,35 @@ static bool parse_trainer(struct Parser *p, const struct Parsed *parsed, struct trainer->pool_prune_line = value.location.line; trainer->pool_prune = token_string(&value); } + else if (is_literal_token(&key, "Copy Pool")) + { + if (trainer->copy_pool_line) + any_error = !set_show_parse_error(p, key.location, "duplicate 'Copy Pool'"); + trainer->copy_pool_line = value.location.line; + trainer->copy_pool = token_string(&value); + } + else if (is_literal_token(&key, "Macro")) + { + if (trainer->macro_line) + any_error = !set_show_parse_error(p, key.location, "duplicate 'Macro'"); + trainer->macro_line = value.location.line; + trainer->macro = token_string(&value); + } + else if (is_literal_token(&key, "Back Pic")) + { + if (trainer->back_pic_line) + any_error = !set_show_parse_error(p, key.location, "duplicate 'Back Pic'"); + trainer->back_pic_line = value.location.line; + trainer->back_pic = token_string(&value); + } else { any_error = !set_show_parse_error(p, key.location, "expected one of 'Name', 'Class', 'Pic', 'Gender', 'Music', 'Items', 'Battle Type', 'Difficulty', 'Party Size', 'Pool Rules', 'Pool Pick Functions', 'Pool Prune' or 'AI'"); } } - if (!trainer->pic_line) + if (!trainer->pic_line && !trainer->macro_line) any_error = !set_show_parse_error(p, p->location, "expected 'Pic' before Pokemon"); - if (!trainer->name_line) + if (!trainer->name_line && !trainer->macro_line) any_error = !set_show_parse_error(p, p->location, "expected 'Name' before Pokemon"); if (!match_empty_line(p)) { @@ -1307,7 +1337,7 @@ static bool parse_trainer(struct Parser *p, const struct Parsed *parsed, struct while (match_empty_line(p)) {} if (!parse_pokemon_header(p, &nickname, &species, &gender, &item)) { - if (i > 0 || ends_with(trainer->id, "_NONE")) + if (i > 0 || ends_with(trainer->id, "_NONE") || !is_empty_string(trainer->copy_pool)) break; if (!p->error) set_parse_error(p, p->location, "expected nickname or species"); @@ -1321,6 +1351,12 @@ static bool parse_trainer(struct Parser *p, const struct Parsed *parsed, struct } trainer->pokemon_n++; + if (!is_empty_string(trainer->copy_pool)) + { + set_show_parse_error(p, p->location, "trainer is set to copy mons from other trainer, but defines their own party"); + } + + pokemon->nickname = token_string(&nickname); pokemon->species = token_string(&species); if (is_empty_token(&gender)) @@ -1519,7 +1555,7 @@ static bool parse_trainer(struct Parser *p, const struct Parsed *parsed, struct } } - if (trainer->party_size_line && trainer->party_size > trainer->pokemon_n) + if (trainer->party_size_line && trainer->party_size > trainer->pokemon_n && is_empty_string(trainer->copy_pool)) { set_show_parse_error(p, p->location, "partySize larger than supplied pool"); } @@ -1707,9 +1743,7 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par fprintf(f, "//\n"); fprintf(f, "// DO NOT MODIFY THIS FILE! It is auto-generated from %s\n", parsed->source->path); fprintf(f, "//\n"); - fprintf(f, "// If you want to modify this file set COMPETITIVE_PARTY_SYNTAX to FALSE\n"); - fprintf(f, "// in include/config/general.h and remove this notice.\n"); - fprintf(f, "// Use sed -i '/^#line/d' '%s' to remove #line markers.\n", output_path); + fprintf(f, "// If you want to modify this file see expansion PR #7154\n"); fprintf(f, "//\n"); fprintf(f, "\n"); @@ -1752,10 +1786,7 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par { fprintf(f, "#line %d\n", trainer->pic_line); fprintf(f, " .trainerPic = "); - if (starts_with(trainer->id, "PARTNER_")) - fprint_constant(f, "TRAINER_BACK_PIC", trainer->pic); - else - fprint_constant(f, "TRAINER_PIC", trainer->pic); + fprint_constant(f, "TRAINER_PIC", trainer->pic); fprintf(f, ",\n"); } @@ -1853,21 +1884,55 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par fprintf(f, ",\n"); } + if (!is_empty_string(trainer->copy_pool)) + { + fprintf(f, "#line %d\n", trainer->copy_pool_line); + fprintf(f, " .overrideTrainer = "); + fprint_string(f, trainer->copy_pool); + fprintf(f, ",\n"); + } + if (!is_empty_string(trainer->back_pic)) + { + fprintf(f, "#line %d\n", trainer->back_pic_line); + fprintf(f, " .trainerBackPic = "); + fprint_constant(f, "TRAINER_BACK_PIC", trainer->back_pic); + fprintf(f, ",\n"); + } + else // defaults to front pic in absence of defined back pic + { + fprintf(f, "#line %d\n", trainer->back_pic_line); + fprintf(f, " .trainerBackPic = "); + fprint_constant(f, "TRAINER_PIC", trainer->pic); + fprintf(f, ",\n"); + } + + if (trainer->macro_line) + { + fprintf(f, "#line %d\n", trainer->macro_line); + fprintf(f, " "); + fprint_string(f, trainer->macro); + fprintf(f, "\n"); + } + if (trainer->party_size_line) { fprintf(f, "#line %d\n", trainer->party_size_line); fprintf(f, " .partySize = %d,\n", trainer->party_size); - fprintf(f, " .poolSize = %d,\n", trainer->pokemon_n); - fprintf(f, " .party = (const struct TrainerMon[])\n"); - fprintf(f, " {\n"); + if (is_empty_string(trainer->copy_pool)) + { + fprintf(f, " .poolSize = %d,\n", trainer->pokemon_n); + fprintf(f, " .party = (const struct TrainerMon[])\n"); + fprintf(f, " {\n"); + } } - else + else if (is_empty_string(trainer->copy_pool)) { fprintf(f, " .partySize = %d,\n", trainer->pokemon_n); fprintf(f, " .party = (const struct TrainerMon[])\n"); fprintf(f, " {\n"); } - for (int j = 0; j < trainer->pokemon_n; j++) + + for (int j = 0; j < trainer->pokemon_n && is_empty_string(trainer->copy_pool); j++) { struct Pokemon *pokemon = &trainer->pokemon[j]; fprintf(f, " {\n"); @@ -2030,7 +2095,8 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par fprintf(f, " },\n"); } - fprintf(f, " },\n"); + if (is_empty_string(trainer->copy_pool)) + fprintf(f, " },\n"); fprintf(f, " },\n"); } } diff --git a/tools/wav2agb/.gitignore b/tools/wav2agb/.gitignore new file mode 100644 index 000000000000..271540565632 --- /dev/null +++ b/tools/wav2agb/.gitignore @@ -0,0 +1,10 @@ +*.o +*.exe +*.s +*.gba +*.sdf + +wav2agb +Debug +Release +.vs diff --git a/tools/aif2pcm/LICENSE b/tools/wav2agb/LICENSE similarity index 77% rename from tools/aif2pcm/LICENSE rename to tools/wav2agb/LICENSE index 966b92bd69fd..d52bf8ee6726 100644 --- a/tools/aif2pcm/LICENSE +++ b/tools/wav2agb/LICENSE @@ -1,5 +1,6 @@ -Copyright (c) 2016 huderlem -Copyright (c) 2005, 2006 by Marco Trillo +The MIT License (MIT) + +Copyright (c) 2016 ipatix Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -8,13 +9,13 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/tools/wav2agb/Makefile b/tools/wav2agb/Makefile new file mode 100644 index 000000000000..a121730e953c --- /dev/null +++ b/tools/wav2agb/Makefile @@ -0,0 +1,33 @@ +GIT_VERSION := $(shell git describe --abbrev=7 --dirty --always --tags) + +CXX = g++ +STRIP = strip +CXXFLAGS = -Wall -Wextra -Wconversion -std=c++17 -O2 -g -DGIT_VERSION=\"$(GIT_VERSION)\" +EXE := +ifeq ($(OS),Windows_NT) + EXE := .exe +endif +BINARY = wav2agb$(EXE) + +SRC_FILES = $(wildcard *.cpp) +OBJ_FILES = $(SRC_FILES:.cpp=.o) + +LDFLAGS := + +ifneq (,$(RELEASE)) + LDFLAGS += -static + CXXFLAGS += -flto +endif + +.PHONY: clean clean +all: $(BINARY) + +clean: + rm -f $(OBJ_FILES) $(BINARY) + +$(BINARY): $(OBJ_FILES) + $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $^ + if [ $(RELEASE)x != x ]; then strip -s $@; fi + +%.o: %.cpp + $(CXX) -c -o $@ $< $(CXXFLAGS) diff --git a/tools/wav2agb/README.md b/tools/wav2agb/README.md new file mode 100644 index 000000000000..86f266023192 --- /dev/null +++ b/tools/wav2agb/README.md @@ -0,0 +1,29 @@ +# wav2agb +"wav2agb" is a tool to convert standard .wav files to GBA compatible .s or .bin files. Intended to convert .wav files for the use with the mp2k/m4a sound driver. + +This copy has been slightly modified from [ipatix's original implementation](https://github.com/ipatix/wav2agb) in the following ways: +1. Support outputting `.bin` files with a command line option `-b, --binary`. (The original only supports outputting `.s` assembly files.) +2. Support reading an override "pitch" value from a custom `agbp` RIFF chunk. + - This is needed to properly match some samples, due to float-point rounding errors when attempting to infer the pitch/sample rate from the .wav file's sample rate. + - If the custom `agbp` chunk isn't present, it will simply use the .wav's sample rate to calculate this "pitch" value. +3. Optionally omits trailing padding from compressed output. + +Usage: +``` +Usage: wav2agb [options] [] + +Options: +-s, --symbol | symbol name for wave header (default: file name) +-l, --lookahead | DPCM compression lookahead 1..8 (default: 3) +-c, --compress | compress output with DPCM +-f, --fast-compress | compress output with DPCM fast +--no-pad | omit trailing padding in compressed output +-b, --binary | output raw binary instead of assembly +--loop-start | override loop start (integer) +--loop-end | override loop end (integer) +--tune | override tuning (float) +--key | override midi key (int) +--rate | override base samplerate (int) +``` + +Flag -c enables compression (only supported by Pokemon Games) diff --git a/tools/wav2agb/converter.cpp b/tools/wav2agb/converter.cpp new file mode 100644 index 000000000000..c96135c14956 --- /dev/null +++ b/tools/wav2agb/converter.cpp @@ -0,0 +1,462 @@ +#include "converter.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "wav_file.h" + +static void agb_out(std::ofstream& ofs, const char *msg, ...) { + char buf[256]; + va_list args; + va_start(args, msg); + vsnprintf(buf, sizeof(buf), msg, args); + va_end(args); + ofs << buf; +} + +static void data_write(std::ofstream& ofs, uint32_t& block_pos, int data, bool hex) { + if (block_pos++ == 0) { + if (hex) + agb_out(ofs, "\n .byte 0x%02X", data); + else + agb_out(ofs, "\n .byte %4d", data); + } else { + if (hex) + agb_out(ofs, ", 0x%02X", data); + else + agb_out(ofs, ", %4d", data); + } + block_pos %= 16; +} + +static void bin_write_u8(std::vector& data, uint8_t value) { + data.push_back(value); +} + +static void bin_write_u32_le(std::vector& data, uint32_t value) { + data.push_back(static_cast(value & 0xFF)); + data.push_back(static_cast((value >> 8) & 0xFF)); + data.push_back(static_cast((value >> 16) & 0xFF)); + data.push_back(static_cast((value >> 24) & 0xFF)); +} + +template +const T& clamp(const T& v, const T& lo, const T& hi) { + return (v < lo) ? lo : (hi < v) ? hi : v; +} + +static void convert_uncompressed(wav_file& wf, std::ofstream& ofs) +{ + int loop_sample = 0; + + uint32_t block_pos = 0; + + for (size_t i = 0; i < wf.loopEnd; i++) { + double ds; + wf.readData(i, &ds, 1); + // TODO apply dither noise + int s = clamp(static_cast(floor(ds * 128.0)), -128, 127); + + if (wf.loopEnabled && i == wf.loopStart) + loop_sample = s; + + data_write(ofs, block_pos, s, false); + } + + data_write(ofs, block_pos, loop_sample, false); +} + +static void convert_uncompressed_bin(wav_file& wf, std::vector& data) +{ + for (size_t i = 0; i < wf.loopEnd; i++) { + double ds; + wf.readData(i, &ds, 1); + // TODO apply dither noise + int s = clamp(static_cast(floor(ds * 128.0)), -128, 127); + + bin_write_u8(data, static_cast(s)); + } + + // Align to 4 bytes. + while (data.size() % 4 != 0) { + bin_write_u8(data, 0); + } +} + +static uint32_t wav_loop_start; +static bool wav_loop_start_override = false; +static uint32_t wav_loop_end; +static bool wav_loop_end_override = false; +static double wav_tune; +static bool wav_tune_override = false; +static uint8_t wav_key; +static bool wav_key_override = false; +static uint32_t wav_rate; +static bool wav_rate_override = false; + +static bool dpcm_verbose = false; +static bool dpcm_lookahead_fast = false; +static bool dpcm_include_padding = true; +static size_t dpcm_enc_lookahead = 3; +static const size_t DPCM_BLK_SIZE = 0x40; +static const std::vector dpcmLookupTable = { + 0, 1, 4, 9, 16, 25, 36, 49, -64, -49, -36, -25, -16, -9, -4, -1 +}; +static const std::vector dpcmIndexTable = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 +}; +static const std::vector> dpcmFastLookupTable = { + {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, + {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, + {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, + {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, + {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, + {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, + {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, + {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, + {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, + {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, + {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, + {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, {8}, + {8, 9}, {8, 9}, {8, 9}, {8, 9}, {8, 9}, {8, 9}, {8, 9}, {8, 9}, {8, 9}, {8, 9}, {8, 9}, {8, 9}, {8, 9}, {8, 9}, {9, 10}, {9, 10}, + {9, 10}, {9, 10}, {9, 10}, {9, 10}, {9, 10}, {9, 10}, {9, 10}, {9, 10}, {9, 10}, {9, 10}, {9, 10}, {10, 11}, {10, 11}, {10, 11}, {10, 11}, {10, 11}, + {10, 11}, {10, 11}, {10, 11}, {10, 11}, {10, 11}, {10, 11}, {11, 12}, {11, 12}, {11, 12}, {11, 12}, {11, 12}, {11, 12}, {11, 12}, {11, 12}, {11, 12}, {12, 13}, + {12, 13}, {12, 13}, {12, 13}, {12, 13}, {12, 13}, {12, 13}, {13, 14}, {13, 14}, {13, 14}, {13, 14}, {13, 14}, {14, 15}, {14, 15}, {14, 15}, {0, 15}, {0, 1, 15}, + {1, 0}, {1, 2}, {1, 2}, {2, 1}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {3, 2}, {3, 4}, {3, 4}, {3, 4}, {3, 4}, {3, 4}, {3, 4}, {4, 3}, + {4, 5}, {4, 5}, {4, 5}, {4, 5}, {4, 5}, {4, 5}, {4, 5}, {4, 5}, {5, 4}, {5, 6}, {5, 6}, {5, 6}, {5, 6}, {5, 6}, {5, 6}, {5, 6}, + {5, 6}, {5, 6}, {5, 6}, {6, 5}, {6, 7}, {6, 7}, {6, 7}, {6, 7}, {6, 7}, {6, 7}, {6, 7}, {6, 7}, {6, 7}, {6, 7}, {6, 7}, {6, 7}, + {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, + {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, + {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, + {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, + {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, + {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, + {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, + {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, + {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, + {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, + {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, + {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, + {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7}, {7} +}; + +static int squared(int x) { return x * x; } + +static void dpcm_lookahead( + int& minimumError, size_t& minimumErrorIndex, + const double *sampleBuf, const size_t lookahead, const int prevLevel) +{ + if (lookahead == 0) { + minimumError = 0; + return; + } + + minimumError = std::numeric_limits::max(); + minimumErrorIndex = dpcmLookupTable.size(); + const int s = clamp(static_cast(floor(sampleBuf[0] * 128.0)), -128, 127); + const std::vector indexCandicateSet = dpcm_lookahead_fast? dpcmFastLookupTable[s - prevLevel + 255]: dpcmIndexTable; + + for (auto i : indexCandicateSet) { + int newLevel = prevLevel + dpcmLookupTable[i]; + + int recMinimumError; + size_t recMinimumErrorIndex; + + // TODO apply dither noise + int errorEstimation = squared(s - newLevel); + if (errorEstimation >= minimumError) + continue; + + dpcm_lookahead(recMinimumError, recMinimumErrorIndex, + sampleBuf + 1, lookahead - 1, newLevel); + + // TODO weigh the error squared + int error = squared(s - newLevel) + recMinimumError; + if (error < minimumError) { + if (newLevel <= 127 && newLevel >= -128) { + minimumError = error; + minimumErrorIndex = i; + } + } + } +} + +static double calculate_snr(const std::vector& uncompressedData, const std::vector& decompressedData) +{ + int sum_son = 0; + int sum_mum = 0; + + assert(uncompressedData.size() == decompressedData.size()); + + for (size_t i = 0; i < uncompressedData.size(); i++) { + const int s = clamp(static_cast(floor(uncompressedData[i] * 128.0)), -128, 127) + 128; + sum_son += s * s; + const int sub = decompressedData[i] + 128 - s; + sum_mum += sub * sub; + } + + if (sum_mum == 0) { + return 100; + } + + return 10 * std::log10((double)sum_son / sum_mum); +} + +template +static void convert_dpcm_impl(wav_file& wf, InitialSampleWriter writeInitialSample, CompressedDataWriter writeCompressedData) +{ + int minimumError; + size_t minimumErrorIndex; + + std::vector uncompressedData; + std::vector decompressedData; + + const auto startTime = std::chrono::high_resolution_clock::now(); + + for (size_t i = 0; i < wf.loopEnd; i += DPCM_BLK_SIZE) { + double ds[DPCM_BLK_SIZE]; + size_t samples_in_block = std::min(DPCM_BLK_SIZE, wf.loopEnd - i); + wf.readData(i, ds, samples_in_block); + // Pad remaining samples in block with zeros if needed + for (size_t j = samples_in_block; j < DPCM_BLK_SIZE; j++) { + ds[j] = 0.0; + } + if (dpcm_verbose) { + uncompressedData.insert(uncompressedData.end(), std::begin(ds), std::end(ds)); + } + // TODO apply dither noise + int s = clamp(static_cast(floor(ds[0] * 128.0)), -128, 127); + + writeInitialSample(s); + if (dpcm_verbose) { + decompressedData.push_back(s); + } + + size_t innerLoopCount = 1; + size_t samples_to_process = dpcm_include_padding ? DPCM_BLK_SIZE : samples_in_block; + uint8_t outData = 0; + size_t sampleBufReadLen; + + goto initial_loop_enter; + + do { + if (innerLoopCount >= samples_to_process) + break; + sampleBufReadLen = std::min(dpcm_enc_lookahead, DPCM_BLK_SIZE - innerLoopCount); + dpcm_lookahead( + minimumError, minimumErrorIndex, + &ds[innerLoopCount], sampleBufReadLen, s); + outData = static_cast((minimumErrorIndex & 0xF) << 4); + s += dpcmLookupTable[minimumErrorIndex]; + if (dpcm_verbose) { + decompressedData.push_back(s); + } + innerLoopCount += 1; +initial_loop_enter: + if (innerLoopCount >= samples_to_process) + break; + sampleBufReadLen = std::min(dpcm_enc_lookahead, DPCM_BLK_SIZE - innerLoopCount); + dpcm_lookahead( + minimumError, minimumErrorIndex, + &ds[innerLoopCount], sampleBufReadLen, s); + outData |= static_cast(minimumErrorIndex & 0xF); + s += dpcmLookupTable[minimumErrorIndex]; + innerLoopCount += 1; + if (dpcm_verbose) { + decompressedData.push_back(s); + } + writeCompressedData(outData); + } while (innerLoopCount < DPCM_BLK_SIZE); + } + + const auto endTime = std::chrono::high_resolution_clock::now(); + + if (dpcm_verbose) { + const auto dur = std::chrono::duration_cast(endTime - startTime); + const double durSecs = static_cast(dur.count()) / 1000000000.0; + printf("SNR: %.2fdB, run time: %.2fs\n", calculate_snr(uncompressedData, decompressedData), durSecs); + } +} + +static void convert_dpcm(wav_file& wf, std::ofstream& ofs) +{ + uint32_t block_pos = 0; + convert_dpcm_impl(wf, + [&](int s) { data_write(ofs, block_pos, s, false); }, + [&](uint8_t outData) { data_write(ofs, block_pos, outData, true); }); +} + +static void convert_dpcm_bin(wav_file& wf, std::vector& data) +{ + convert_dpcm_impl(wf, + [&](int s) { bin_write_u8(data, static_cast(s)); }, + [&](uint8_t outData) { bin_write_u8(data, outData); }); +} + +void enable_dpcm_verbose() +{ + dpcm_verbose = true; +} + +void enable_dpcm_lookahead_fast() +{ + dpcm_lookahead_fast = true; +} + +void disable_dpcm_padding() +{ + dpcm_include_padding = false; +} + +void set_dpcm_lookahead(size_t lookahead) +{ + dpcm_enc_lookahead = clamp(lookahead, 1, 8); +} + +void set_wav_loop_start(uint32_t start) +{ + wav_loop_start = start; + wav_loop_start_override = true; +} + +void set_wav_loop_end(uint32_t end) +{ + wav_loop_end = end; + wav_loop_end_override = true; +} + +void set_wav_tune(double tune) +{ + wav_tune = tune; + wav_tune_override = true; +} + +void set_wav_key(uint8_t key) +{ + wav_key = key; + wav_key_override = true; +} + +void set_wav_rate(uint32_t rate) +{ + wav_rate = rate; + wav_rate_override = true; +} + +void convert(const std::string& wav_file_str, const std::string& out_file_str, + const std::string& sym, cmp_type ct, out_type ot) +{ + wav_file wf(wav_file_str); + + // check command line overrides + if (wav_loop_start_override) { + wf.loopStart = std::min(wav_loop_start, wf.loopEnd); + wf.loopEnabled = true; + } + if (wav_loop_end_override) { + wf.loopEnd = std::min(wav_loop_end, wf.loopEnd); + } + if (wav_tune_override) { + wf.tuning = wav_tune; + } + if (wav_key_override) { + wf.midiKey = wav_key; + } + if (wav_rate_override) { + wf.sampleRate = wav_rate; + } + + uint8_t fmt; + if (ct == cmp_type::none) + fmt = 0; + else if (ct == cmp_type::dpcm) + fmt = 1; + else + throw std::runtime_error("convert: invalid compression type"); + + double pitch; + if (wf.midiKey == 60 && wf.tuning == 0.0) { + pitch = wf.sampleRate; + } else { + pitch = wf.sampleRate * pow(2.0, (60.0 - wf.midiKey) / 12.0 + wf.tuning / 1200.0); + } + + uint32_t pitch_value; + if (wf.agbPitch != 0) { + pitch_value = wf.agbPitch; + } else { + pitch_value = static_cast(pitch * 1024.0); + } + + if (ot == out_type::binary) { + // Binary output mode + std::vector bin_data; + + // Write header (16 bytes) + // Bytes 0-3: flags (format in bit 0, loop in bit 30) + uint32_t flags = fmt; + if (wf.loopEnabled) + flags |= 0x40000000; + bin_write_u32_le(bin_data, flags); + + // Bytes 4-7: pitch + bin_write_u32_le(bin_data, pitch_value); + + // Bytes 8-11: loop start + bin_write_u32_le(bin_data, wf.loopStart); + + // Bytes 12-15: loop end + // wf.loopEnd is the exclusive end position; binary format expects (end - 1) + bin_write_u32_le(bin_data, wf.loopEnd > 0 ? wf.loopEnd - 1 : 0); + + // Write sample data + if (ct == cmp_type::none) + convert_uncompressed_bin(wf, bin_data); + else if (ct == cmp_type::dpcm) + convert_dpcm_bin(wf, bin_data); + else + throw std::runtime_error("convert: invalid compression type"); + + // Write binary file + std::ofstream fout(out_file_str, std::ios::out | std::ios::binary); + if (!fout.is_open()) { + perror("ofstream"); + throw std::runtime_error("unable to open output file"); + } + fout.write(reinterpret_cast(bin_data.data()), bin_data.size()); + fout.close(); + } else { + // Assembly output mode + std::ofstream fout(out_file_str, std::ios::out); + if (!fout.is_open()) { + perror("ofstream"); + throw std::runtime_error("unable to open output file"); + } + + agb_out(fout, " .section .rodata\n"); + agb_out(fout, " .global %s\n", sym.c_str()); + agb_out(fout, " .align 2\n\n%s:\n\n", sym.c_str()); + + agb_out(fout, " .byte 0x%X, 0x0, 0x0, 0x%X\n", fmt, wf.loopEnabled ? 0x40 : 0x0); + agb_out(fout, " .word 0x%08X @ Mid-C ~%f\n", pitch_value, pitch); + agb_out(fout, " .word %u, %u\n", wf.loopStart, wf.loopEnd); + + if (ct == cmp_type::none) + convert_uncompressed(wf, fout); + else if (ct == cmp_type::dpcm) + convert_dpcm(wf, fout); + else + throw std::runtime_error("convert: invalid compression type"); + + agb_out(fout, "\n\n .end\n"); + fout.close(); + } +} diff --git a/tools/wav2agb/converter.h b/tools/wav2agb/converter.h new file mode 100644 index 000000000000..df59ebe2d120 --- /dev/null +++ b/tools/wav2agb/converter.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include +#include + +enum class cmp_type { + none, dpcm +}; + +enum class out_type { + assembly, binary +}; + +void enable_dpcm_verbose(); +void enable_dpcm_lookahead_fast(); +void disable_dpcm_padding(); +void set_dpcm_lookahead(size_t lookahead); +void set_wav_loop_start(uint32_t start); +void set_wav_loop_end(uint32_t end); +void set_wav_tune(double tune); +void set_wav_key(uint8_t key); +void set_wav_rate(uint32_t rate); + +void convert(const std::string&, const std::string&, + const std::string& sym, cmp_type ct, out_type ot); diff --git a/tools/wav2agb/test_fast_compress.sh b/tools/wav2agb/test_fast_compress.sh new file mode 100644 index 000000000000..3ef56b4d910f --- /dev/null +++ b/tools/wav2agb/test_fast_compress.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +for l in $(seq 1 8) +do + echo lookahead="$l": + wav2agb "$1" -c -l "$l" --verbose + echo lookahead="$l" fast: + wav2agb "$1" -f -l "$l" --verbose +done diff --git a/tools/wav2agb/wav2agb.cpp b/tools/wav2agb/wav2agb.cpp new file mode 100644 index 000000000000..be018abad674 --- /dev/null +++ b/tools/wav2agb/wav2agb.cpp @@ -0,0 +1,213 @@ +#include +#include +#include +#include +#include + +#include + +#include "converter.h" + +static void usage() { + fprintf(stderr, "wav2agb\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Usage: wav2agb [options] []\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Options:\n"); + fprintf(stderr, "-s, --symbol | symbol name for wave header (default: file name)\n"); + fprintf(stderr, "-l, --lookahead | DPCM compression lookahead 1..8 (default: 3)\n"); + fprintf(stderr, "-c, --compress | compress output with DPCM\n"); + fprintf(stderr, "-f, --fast-compress | compress output with DPCM fast\n"); + fprintf(stderr, "--no-pad | omit trailing padding in compressed output\n"); + fprintf(stderr, "-b, --binary | output raw binary instead of assembly\n"); + fprintf(stderr, "--loop-start | override loop start (integer)\n"); + fprintf(stderr, "--loop-end | override loop end (integer)\n"); + fprintf(stderr, "--tune | override tuning (float)\n"); + fprintf(stderr, "--key | override midi key (int)\n"); + fprintf(stderr, "--rate | override base samplerate (int)\n"); + exit(1); +} + +static void version() { + printf("wav2agb v1.1 (c) 2019 ipatix\n"); + exit(0); +} + +static void die(const char *msg, ...) { + va_list args; + va_start(args, msg); + vfprintf(stderr, msg, args); + va_end(args); + exit(1); +} + +static void fix_str(std::string& str) { + // replaces all characters that are not alphanumerical + for (size_t i = 0; i < str.size(); i++) { + if (str[i] >= 'a' && str[i] <= 'z') + continue; + if (str[i] >= 'A' && str[i] <= 'Z') + continue; + if (str[i] >= '0' && str[i] <= '9' && i > 0) + continue; + str[i] = '_'; + } +} + +static char path_seperators[] = { + '/', +#ifdef _WIN32 + '\\', +#endif + '\0' +}; + +static std::string filename_without_ext(const std::string& str) { + size_t last_path_seperator = 0; + char *sep = path_seperators; + while (*sep) { + size_t pos = str.find_last_of(*sep); + if (pos != std::string::npos) + last_path_seperator = std::max(pos, last_path_seperator); + sep += 1; + } + size_t file_ext_dot_pos = str.find_last_of('.'); + if (file_ext_dot_pos == std::string::npos) + return std::string(str); + assert(file_ext_dot_pos != last_path_seperator); + if (file_ext_dot_pos > last_path_seperator) + return str.substr(0, file_ext_dot_pos); + return std::string(str); +} + +static std::string filename_without_dir(const std::string& str) { + size_t last_path_seperator = 0; + bool path_seperator_found = false; + char *sep = path_seperators; + while (*sep) { + size_t pos = str.find_last_of(*sep); + if (pos != std::string::npos) { + last_path_seperator = std::max(pos, last_path_seperator); + path_seperator_found = true; + } + sep += 1; + } + if (str.size() > 0 && path_seperator_found) { + return str.substr(last_path_seperator + 1); + } else { + return std::string(str); + } +} + +static cmp_type arg_compress = cmp_type::none; +static out_type arg_output_type = out_type::assembly; +static std::string arg_sym; +static bool arg_input_file_read = false; +static bool arg_output_file_read = false; +static std::string arg_input_file; +static std::string arg_output_file; + +int main(int argc, char *argv[]) { + try { + if (argc == 1) + usage(); + + for (int i = 1; i < argc; i++) { + std::string st(argv[i]); + if (st == "-s" || st == "--symbol") { + if (++i >= argc) + die("-s: missing symbol name\n"); + arg_sym = argv[i]; + fix_str(arg_sym); + } else if (st == "-c" || st == "--compress") { + arg_compress = cmp_type::dpcm; + } else if (st == "-f" || st == "--compress-fast") { + arg_compress = cmp_type::dpcm; + enable_dpcm_lookahead_fast(); + } else if (st == "--no-pad") { + disable_dpcm_padding(); + } else if (st == "-b" || st == "--binary") { + arg_output_type = out_type::binary; + } else if (st == "--verbose") { + enable_dpcm_verbose(); + } else if (st == "-l" || st == "--lookahead") { + if (++i >= argc) + die("-l: missing parameter"); + set_dpcm_lookahead(std::stoul(argv[i], nullptr, 10)); + } else if (st == "--version") { + version(); + } else if (st == "--loop-start") { + if (++i >= argc) + die("--loop-start: missing parameter"); + uint32_t start = static_cast(std::stoul(argv[i], nullptr, 10)); + set_wav_loop_start(start); + } else if (st == "--loop-end") { + if (++i >= argc) + die("--loop-end: missing parameter"); + uint32_t end = static_cast(std::stoul(argv[i], nullptr, 10)); + set_wav_loop_end(end); + } else if (st == "--tune") { + if (++i >= argc) + die("--tune: missing parameter"); + double tune = std::stod(argv[i], nullptr); + set_wav_tune(tune); + } else if (st == "--key") { + if (++i >= argc) + die("--key: missing parameter"); + int key = std::stoi(argv[i], nullptr, 10); + if (key < 0) key = 0; + if (key > 127) key = 127; + set_wav_key(static_cast(key)); + } else if (st == "--rate") { + if (++i >= argc) + die("--rate: missing parameter"); + uint32_t rate = static_cast(std::stoul(argv[i], nullptr, 10)); + set_wav_rate(rate); + } else { + if (st == "--") { + if (++i >= argc) + die("--: missing file name\n"); + } + if (!arg_input_file_read) { + arg_input_file = argv[i]; + if (arg_input_file.size() < 1) + die("empty input file name\n"); + arg_input_file_read = true; + } else if (!arg_output_file_read) { + arg_output_file = argv[i]; + if (arg_output_file.size() < 1) + die("empty output file name\n"); + arg_output_file_read = true; + } else { + die("Too many files specified\n"); + } + } + } + + // check arguments + if (!arg_input_file_read) { + die("No input file specified\n"); + } + + if (!arg_output_file_read) { + // create output file name if none is provided + if (arg_output_type == out_type::binary) { + arg_output_file = filename_without_ext(arg_input_file) + ".bin"; + } else { + arg_output_file = filename_without_ext(arg_input_file) + ".s"; + } + arg_output_file_read = true; + } + + if (arg_sym.size() == 0) { + arg_sym = filename_without_dir(filename_without_ext(arg_output_file)); + fix_str(arg_sym); + } + + convert(arg_input_file, arg_output_file, arg_sym, arg_compress, arg_output_type); + return 0; + } catch (const std::exception& e) { + fprintf(stderr, "std lib error:\n%s\n", e.what()); + } + return 1; +} diff --git a/tools/wav2agb/wav_file.cpp b/tools/wav2agb/wav_file.cpp new file mode 100644 index 000000000000..4b242c5c009d --- /dev/null +++ b/tools/wav2agb/wav_file.cpp @@ -0,0 +1,287 @@ +#include "wav_file.h" + +#include +#include +#include +#include + +static uint32_t read_u32(std::ifstream& ifs) +{ + uint8_t lenBytes[4]; + ifs.read(reinterpret_cast(lenBytes), sizeof(lenBytes)); + uint32_t retval = lenBytes[0] | (lenBytes[1] << 8) | (lenBytes[2] << 16) | (lenBytes[3] << 24); + return retval; +} + +//static uint16_t read_u16(std::ifstream& ifs) +//{ +// uint8_t lenBytes[2]; +// ifs.read(reinterpret_cast(lenBytes), sizeof(lenBytes)); +// uint16_t retval = uint16_t(lenBytes[0] | (lenBytes[1] << 8)); +// return retval; +//} + +static std::string read_str(std::ifstream& ifs, size_t len) +{ + std::vector buf(len); + ifs.read(buf.data(), buf.size()); + return std::string(buf.data(), buf.size()); +} + +static std::vector read_arr(std::ifstream& ifs, size_t len) +{ + std::vector buf(len); + ifs.read(reinterpret_cast(buf.data()), buf.size()); + return buf; +} + +static uint16_t arr_u16(const std::vector& arr, size_t pos) +{ + uint16_t val = uint16_t(arr.at(pos) | (arr.at(pos + 1) << 8)); + return val; +} + +static uint32_t arr_u32(const std::vector& arr, size_t pos) +{ + uint32_t val = uint32_t(arr.at(pos) | (arr.at(pos + 1) << 8) | + (arr.at(pos + 2) << 16) | (arr.at(pos + 3) << 24)); + return val; +} + +static const size_t loadChunkSize = 2048; + +uint32_t wav_file::fmt_size() const +{ + if (fmt == format_type::u8) + return 1; + else if (fmt == format_type::s16) + return 2; + else if (fmt == format_type::s24) + return 3; + else if (fmt == format_type::s32) + return 4; + else if (fmt == format_type::f32) + return 4; + else if (fmt == format_type::f64) + return 8; + else + throw std::runtime_error("INTERNAL ERROR: invalid format type"); +} + +wav_file::wav_file(const std::string& path) : loadBuffer(loadChunkSize) +{ + ifs.exceptions(std::ios::badbit | std::ios::eofbit); + ifs.open(path, std::ios::binary); + if (!ifs.good()) + throw std::runtime_error("failed to open file: " + path + ", reason: " + strerror(errno)); + if (!ifs.is_open()) + throw std::runtime_error("failed to open file: " + path + ", reason: " + strerror(errno)); + + ifs.seekg(0, ifs.end); + std::streampos len = ifs.tellg(); + ifs.seekg(0, ifs.beg); + + std::string chunkId = read_str(ifs, 4); + if (chunkId != "RIFF") + throw std::runtime_error("RIFF ID invalid"); + uint32_t mainChunkLen = read_u32(ifs); + if (mainChunkLen + 8 != len) + throw std::runtime_error("RIFF chunk len (=" + + std::to_string(mainChunkLen) + + ") doesn't match file len (=" + + std::to_string(len) + + ")"); + std::string riffType = read_str(ifs, 4); + if (riffType != "WAVE") + throw std::runtime_error("WAVE ID invalid"); + + bool dataChunkFound = false; + bool fmtChunkFound = false; + // search all chunks + std::streampos curPos; + while ((curPos = ifs.tellg()) + std::streampos(8) <= len) { + chunkId = read_str(ifs, 4); + uint32_t chunkLen = read_u32(ifs); + if (curPos + std::streampos(8) + std::streampos(chunkLen) > len) + throw std::runtime_error("ERROR: chunk goes beyond end of file: offset=" + std::to_string(curPos)); + + if (chunkId == "fmt ") { + fmtChunkFound = true; + std::vector fmtChunk = read_arr(ifs, chunkLen); + uint16_t fmtTag = arr_u16(fmtChunk, 0); + uint16_t numChannels = arr_u16(fmtChunk, 2); + if (numChannels != 1) + throw std::runtime_error("ERROR: input file is NOT mono"); + this->sampleRate = arr_u32(fmtChunk, 4); + uint16_t block_align = arr_u16(fmtChunk, 12); + uint16_t bits_per_sample = arr_u16(fmtChunk, 14); + if (fmtTag == 1) { + // integer + if (block_align == 1 && bits_per_sample == 8) + this->fmt = format_type::u8; + else if (block_align == 2 && bits_per_sample == 16) + this->fmt = format_type::s16; + else if (block_align == 3 && bits_per_sample == 24) + this->fmt = format_type::s24; + else if (block_align == 4 && bits_per_sample == 32) + this->fmt = format_type::s32; + else + throw std::runtime_error("ERROR: unsupported integer format combination"); + } else if (fmtTag == 3) { + // float + if (block_align == 4 && bits_per_sample == 32) + this->fmt = format_type::f32; + else if (block_align == 8 && bits_per_sample == 64) + this->fmt = format_type::f64; + else + throw std::runtime_error("ERROR: unsupported float format combination"); + } else { + throw std::runtime_error("ERROR: unsupported format code: " + std::to_string(fmtTag)); + } + } else if (chunkId == "data") { + dataChunkFound = true; + dataChunkPos = ifs.tellg(); + dataChunkEndPos = dataChunkPos + std::streampos(chunkLen); + ifs.seekg(chunkLen, ifs.cur); + } else if (chunkId == "smpl") { + std::vector smplChunk = read_arr(ifs, chunkLen); + uint32_t midiUnityNote = arr_u32(smplChunk, 12); + this->midiKey = static_cast(std::min(midiUnityNote, 127u)); + uint32_t midiPitchFraction = arr_u32(smplChunk, 16); + // the values below convert the uint32_t range to 0.0 to 100.0 range + this->tuning = static_cast(midiPitchFraction) / (4294967296.0 * 100.0); + uint32_t numLoops = arr_u32(smplChunk, 28); + if (numLoops > 1) + throw std::runtime_error("ERROR: too many loops in smpl chunk"); + if (numLoops == 1) { + uint32_t loopType = arr_u32(smplChunk, 36 + 4); + if (loopType != 0) + throw std::runtime_error("ERROR: loop type not supported: " + std::to_string(loopType)); + this->loopStart = arr_u32(smplChunk, 36 + 8); + // sampler chunks tell the last sample to be played (so including rather than excluding), thus +1 + this->loopEnd = arr_u32(smplChunk, 36 + 12) + 1; + this->loopEnabled = true; + } + } else if (chunkId == "agbp") { + // Custom chunk: exact GBA pitch value (sample_rate * 1024) + // This allows perfect round-trip conversion without period-based precision loss + std::vector agbpChunk = read_arr(ifs, chunkLen); + if (chunkLen >= 4) { + this->agbPitch = arr_u32(agbpChunk, 0); + } + } else { + //fprintf(stderr, "WARNING: ignoring unknown chunk type: <%s>\n", chunkId.c_str()); + ifs.seekg(chunkLen, ifs.cur); + } + + /* https://en.wikipedia.org/wiki/Resource_Interchange_File_Format#Explanation + * If chunk size is odd, skip the pad byte */ + if ((chunkLen % 2) == 1) + ifs.seekg(1, ifs.cur); + } + + if (!fmtChunkFound) + throw std::runtime_error("ERROR: fmt chunk not found"); + if (!dataChunkFound) + throw std::runtime_error("ERROR: data chunk not found"); + + uint32_t numSamples = static_cast(dataChunkEndPos - dataChunkPos) / fmt_size(); + this->loopEnd = std::min(this->loopEnd, numSamples); +} + +wav_file::~wav_file() +{ + ifs.close(); +} + +void wav_file::readData(size_t location, double *data, size_t len) +{ + while (len-- > 0) { + if (loadedChunk != location - (location % loadChunkSize)) { + loadedChunk = location - (location % loadChunkSize); + + std::streampos blockpos = this->dataChunkPos + std::streampos(loadedChunk * fmt_size()); + std::streampos endblockpos = this->dataChunkEndPos; + size_t actualChunkSize = std::min(loadChunkSize, static_cast(endblockpos - blockpos) / fmt_size()); + + if (actualChunkSize == 0) { + std::fill(loadBuffer.begin(), loadBuffer.end(), 0.0); + goto load_sample; + } + + ifs.seekg(blockpos, ifs.beg); + std::vector ld(actualChunkSize * fmt_size()); + ifs.read(reinterpret_cast(ld.data()), ld.size()); + + if (fmt == format_type::u8) { + for (size_t i = 0; i < actualChunkSize; i++) { + loadBuffer[i] = (double(ld[i]) - 128.0) / 128.0; + } + } else if (fmt == format_type::s16) { + for (size_t i = 0; i < actualChunkSize; i++) { + int32_t s = + (ld[i * fmt_size() + 0] << 0) | + (ld[i * fmt_size() + 1] << 8); + s <<= 16; + s >>= 16; + loadBuffer[i] = double(s) / 32768.0; + } + } else if (fmt == format_type::s24) { + for (size_t i = 0; i < actualChunkSize; i++) { + int32_t s = + (ld[i * fmt_size() + 0] << 0) | + (ld[i * fmt_size() + 1] << 8) | + (ld[i * fmt_size() + 2] << 16); + s <<= 8; + s >>= 8; + loadBuffer[i] = double(s) / 8388608.0; + } + } else if (fmt == format_type::s32) { + for (size_t i = 0; i < actualChunkSize; i++) { + int32_t s = + (ld[i * fmt_size() + 0] << 0) | + (ld[i * fmt_size() + 1] << 8) | + (ld[i * fmt_size() + 2] << 16) | + (ld[i * fmt_size() + 3] << 24); + loadBuffer[i] = double(s) / 2147483648.0; + } + } else if (fmt == format_type::f32) { + for (size_t i = 0; i < actualChunkSize; i++) { + union { + uint32_t s; + float f; + } u; + u.s = + (ld[i * fmt_size() + 0] << 0) | + (ld[i * fmt_size() + 1] << 8) | + (ld[i * fmt_size() + 2] << 16) | + (ld[i * fmt_size() + 3] << 24); + loadBuffer[i] = u.f; + } + } else if (fmt == format_type::f64) { + for (size_t i = 0; i < actualChunkSize; i++) { + union { + uint64_t s; + double d; + } u; + u.s = + (uint64_t(ld[i * fmt_size() + 0]) << 0) | + (uint64_t(ld[i * fmt_size() + 1]) << 8) | + (uint64_t(ld[i * fmt_size() + 2]) << 16) | + (uint64_t(ld[i * fmt_size() + 3]) << 24) | + (uint64_t(ld[i * fmt_size() + 4]) << 32) | + (uint64_t(ld[i * fmt_size() + 5]) << 40) | + (uint64_t(ld[i * fmt_size() + 6]) << 48) | + (uint64_t(ld[i * fmt_size() + 7]) << 56); + loadBuffer[i] = u.d; + } + } + for (size_t i = actualChunkSize; i < loadChunkSize; i++) { + loadBuffer[i] = 0.0; + } + } +load_sample: + *data++ = loadBuffer[location % loadChunkSize]; + location++; + } +} diff --git a/tools/wav2agb/wav_file.h b/tools/wav2agb/wav_file.h new file mode 100644 index 000000000000..b88da4eeb65e --- /dev/null +++ b/tools/wav2agb/wav_file.h @@ -0,0 +1,38 @@ +#pragma once + +#include +#include +#include +#include +#include + +#define WAV_INVALID_VAL 0xFFFFFFFFu + +class wav_file { +public: + wav_file(const std::string& path); + ~wav_file(); + + void readData(size_t location, double *data, size_t len); +private: + std::ifstream ifs; + std::streampos dataChunkPos; + std::streampos dataChunkEndPos; + size_t loadedChunk = WAV_INVALID_VAL; + + std::vector loadBuffer; + size_t loadBufferBlock = std::numeric_limits::max(); + enum class format_type { + u8, s16, s24, s32, + f32, f64, + } fmt; + uint32_t fmt_size() const; +public: + uint32_t loopStart = 0; // samples + uint32_t loopEnd = std::numeric_limits::max(); // samples + bool loopEnabled = false; + double tuning = 0.0; // cents + uint8_t midiKey = 60; + uint32_t sampleRate; + uint32_t agbPitch = 0; // optional: exact GBA pitch value from 'agbp' chunk (0 = not present) +}; diff --git a/tools/wild_encounters/wild_encounters_to_header.py b/tools/wild_encounters/wild_encounters_to_header.py index 5de52fbea92c..2fca4623e77a 100644 --- a/tools/wild_encounters/wild_encounters_to_header.py +++ b/tools/wild_encounters/wild_encounters_to_header.py @@ -1,722 +1,277 @@ import json import re -import os - - -IS_ENABLED = False -DEXNAV_ENABLED = False - -# C string vars -define = "#define" -ENCOUNTER_CHANCE = "ENCOUNTER_CHANCE" -SLOT = "SLOT" -TOTAL = "TOTAL" -NULL = "NULL" -UNDEFINED = "UNDEFINED" -MAP_UNDEFINED = "MAP_UNDEFINED" - -# encounter group header types, filled out programmatically -MON_HEADERS = [] - -# mon encounter group types -fieldData = [] -fieldInfoStrings = [] -fieldStrings = [] - -# time of day encounter data -TIME_DEFAULT = "" -TIME_DEFAULT_LABEL = "TIME_OF_DAY_DEFAULT" -TIME_DEFAULT_INDEX = 0 -TIMES_OF_DAY_COUNT = TIME_DEFAULT_INDEX + 1 - -# struct building blocks -baseStruct = "const struct WildPokemon" -structLabel = "" -structMonType = "" -structTime = "" -structMap = "" - -structInfo = "Info" -structHeader = "Header" -structArrayAssign = "[] =" - -baseStructLabel = "" -baseStructContent = [] -infoStructString = "" -infoStructRate = 0 -infoStructContent = [] -headerStructLabel = "" -headerStructContent = {} -headerStructTable = {} -headerIndex = 0 - -# map header data variables -hLabel = "" -hForMaps = True -headersArray = [headerIndex] - -# debug output control -mainSwitch = True -printWarningAndInclude = mainSwitch -printEncounterHeaders = mainSwitch -printEncounterRateMacros = mainSwitch -printEncounterStructsInfoString = mainSwitch -printEncounterStructs = mainSwitch - - -class TimeOfDay(): - def __init__(self): - self.vals = [] - self.lvals = [] - self.fvals = [] - self.count = 0 - - def __len__(self): - return self.count - - # for debugging purposes - def __str__(self): - return str([self.vals, self.lvals, self.fvals, self.count]) - - def add(self, val): - self.vals.append(val) - self.lvals.append(val.lower()) - self.fvals.append(GetTimeLabelFromString(val).capitalize()) - self.count += 1 - - def indexOf(self, val): - tempArr = [self.vals, self.lvals, self.fvals] - - for tvals in tempArr: - i = 0 - for time in tvals: - if val in time: - return i - - i += 1 - # return -1 here so it returns a consistent type and can be checked against < 0 - return -1 - - -def ImportWildEncounterFile(): - # make sure we're in the right directory before anything else - if not os.path.exists("Makefile"): - print("Please run this script from the project's root folder.") - quit() - - global MON_HEADERS - - global TIME_OF_DAY - TIME_OF_DAY = SetupUserTimeEnum(TimeOfDay()) - - global IS_ENABLED - global TIMES_OF_DAY_COUNT - if IsConfigEnabled(): - IS_ENABLED = True - TIMES_OF_DAY_COUNT = len(TIME_OF_DAY) - - global DEXNAV_ENABLED - DEXNAV_ENABLED = IsDexnavEnabled() - - global fieldInfoStrings - global fieldStrings - global structLabel - global structMonType - global structTime - global structMap - global baseStructLabel - global baseStructContent - global infoStructString - global infoStructRate - global headerStructLabel - global headerStructContent - global hLabel - global headersArray - global encounterTotalCount - global encounterCount - global headerIndex - global fieldData - global tabStr - tabStr = " " - - wFile = open("src/data/wild_encounters.json") - wData = json.load(wFile) - - encounterTotalCount = [] - encounterCount = [] - groupCount = 0 - while groupCount < len(wData["wild_encounter_groups"]): - encounterTotalCount.append(0) - encounterCount.append(0) - groupCount += 1 - - for data in wData["wild_encounter_groups"]: - wEncounters = wData["wild_encounter_groups"][headerIndex]["encounters"] - headerSuffix = structHeader + "s" - - if data["label"]: - hLabel = wData["wild_encounter_groups"][headerIndex]["label"] - if headerSuffix in hLabel: - hLabel = hLabel[:len(hLabel) - len(headerSuffix)] - MON_HEADERS.append(hLabel) - - if data["for_maps"]: - hForMaps = wData["wild_encounter_groups"][headerIndex]["for_maps"] - - if headerIndex == 0: - wFields = wData["wild_encounter_groups"][headerIndex]["fields"] - fieldCounter = 0 - for field in wFields: - if not CheckFieldDataDupes(field["type"]): - AddFieldData(fieldCounter, field["type"], field["encounter_rates"]) - - if "groups" in field: - fieldData[fieldCounter]["groups"] = field["groups"] - - """ - hidden mons need a special bit of logic since they're not in the vanilla - wild_encounters.json file, but the code expects them to be there - """ - hidden_mons = "hidden_mons" - if (fieldCounter == len(wFields) - 1) and not CheckFieldDataDupes(hidden_mons): - hidden_dummy_rates = [1, 0] - AddFieldData(fieldCounter + 1, hidden_mons, hidden_dummy_rates) - - fieldCounter += 1 - - if printWarningAndInclude: - PrintGeneratedWarningText() - print('#include "rtc.h"') - print("\n") - - PrintEncounterRateMacros() - - for encounter in wEncounters: - if "map" in encounter: - structMap = encounter["map"] - else: - structMap = encounter["base_label"] - - structLabel = encounter["base_label"] - - if encounterTotalCount[headerIndex] != len(wEncounters): - encounterTotalCount[headerIndex] = len(wEncounters) - - encounterCount[headerIndex] += 1 - headersArray = [] - - structTime = TIME_DEFAULT_INDEX - if IS_ENABLED: - timeCounter = 0 - while timeCounter < TIMES_OF_DAY_COUNT: - tempfTime = f"_{TIME_OF_DAY.fvals[timeCounter]}" - tempTime = TIME_OF_DAY.vals[timeCounter] - if tempfTime in structLabel or tempTime in structLabel: - structTime = timeCounter - - timeCounter += 1 - - fieldCounter = 0 - fieldInfoStrings = [] - while fieldCounter < len(fieldData): - fieldInfoStrings.append("") - fieldStrings.append("") - fieldCounter += 1 - - fieldCounter = 0 - while fieldCounter < len(fieldData): - for areaTable in encounter: - if fieldData[fieldCounter]["name"] in areaTable: - structMonType = fieldData[fieldCounter]["pascalName"] - if f"_{TIME_OF_DAY.fvals[structTime]}" in structLabel: - fieldInfoStrings[fieldCounter] = f"{structLabel}_{structMonType}{structInfo}" - fieldStrings[fieldCounter] = f"{structLabel}_{structMonType}" - else: - fieldInfoStrings[fieldCounter] = f"{structLabel}_{TIME_OF_DAY.fvals[structTime]}_{structMonType}{structInfo}" - fieldStrings[fieldCounter] = f"{structLabel}_{TIME_OF_DAY.fvals[structTime]}_{structMonType}" - else: - structMonType = "" - continue - - baseStructContent = [] - for group in encounter[areaTable]: - if "mons" in group: - for mon in encounter[areaTable][group]: - baseStructContent.append(list(mon.values())) - - if "encounter_rate" in group: - infoStructRate = encounter[areaTable][group] - - baseStructLabel = f"{baseStruct} {fieldStrings[fieldCounter]}{structArrayAssign}" - if printEncounterStructs: - print() - print(baseStructLabel) - print("{") - PrintStructContent(baseStructContent) - print("};") - - if printEncounterStructsInfoString: - infoStructString = f"{baseStruct}{structInfo} {fieldInfoStrings[fieldCounter]} = {{ {infoStructRate}, {fieldStrings[fieldCounter]} }};" - print(infoStructString) - - fieldCounter += 1 - AssembleMonHeaderContent() - headerIndex += 1 - PrintWildMonHeadersContent() - - -def PrintStructContent(contentList): - for monList in contentList: - print(f"{tabStr}{{ {monList[0]}, {monList[1]}, {monList[2]} }},") - return - - -def GetStructLabelWithoutTime(label): - labelLength = len(label) - timeLength = 0 - - if not IS_ENABLED: - return label - - timeCounter = 0 - while timeCounter < TIMES_OF_DAY_COUNT: - tempTime = TIME_OF_DAY.fvals[timeCounter] - if tempTime in label: - timeLength = len(tempTime) - return label[:(labelLength - (timeLength + 1))] - - timeCounter += 1 - return label - - -def GetStructTimeWithoutLabel(label): - if not IS_ENABLED: - return TIME_DEFAULT_INDEX - - timeCounter = 0 - while timeCounter < TIMES_OF_DAY_COUNT: - tempTime = f"_{TIME_OF_DAY.fvals[timeCounter]}" - if tempTime in label: - return timeCounter - - timeCounter += 1 - return TIME_DEFAULT_INDEX - - -def AssembleMonHeaderContent(): - SetupMonInfoVars() - - tempHeaderLabel = GetWildMonHeadersLabel() - tempHeaderTimeIndex = GetStructTimeWithoutLabel(structLabel) - structLabelNoTime = GetStructLabelWithoutTime(structLabel) - - if tempHeaderLabel not in headerStructTable: - headerStructTable[tempHeaderLabel] = {} - headerStructTable[tempHeaderLabel]["groupNum"] = headerIndex - - if structLabelNoTime not in headerStructTable[tempHeaderLabel]: - headerStructTable[tempHeaderLabel][structLabelNoTime] = {} - headerStructTable[tempHeaderLabel][structLabelNoTime]["headerType"] = GetWildMonHeadersLabel() - headerStructTable[tempHeaderLabel][structLabelNoTime]["mapGroup"] = structMap - headerStructTable[tempHeaderLabel][structLabelNoTime]["mapNum"] = structMap - headerStructTable[tempHeaderLabel][structLabelNoTime]["encounterTotalCount"] = encounterTotalCount[headerIndex] - headerStructTable[tempHeaderLabel][structLabelNoTime]["encounter_types"] = [] - - timeCounter = 0 - while timeCounter < TIMES_OF_DAY_COUNT: - headerStructTable[tempHeaderLabel][structLabelNoTime]["encounter_types"].append([]) - timeCounter += 1 - - fieldCounter = 0 - while fieldCounter < len(fieldData): - headerStructTable[tempHeaderLabel][structLabelNoTime]["encounter_types"][tempHeaderTimeIndex].append(fieldInfoStrings[fieldCounter]) - fieldCounter += 1 - - -def SetupMonInfoVars(): - i = 0 - while i < len(fieldData): - fieldData[i]["infoStringBase"] = "." + fieldData[i]["snakeName"] + structInfo - if CheckEmpty(fieldInfoStrings[i]): - fieldInfoStrings[i] = NULL - else: - fieldInfoStrings[i] = "&" + fieldInfoStrings[i] - - i += 1 - - -def PrintWildMonHeadersContent(): - groupCount = 0 - for group in headerStructTable: - labelCount = 0 - for label in headerStructTable[group]: - if label != "groupNum": - if labelCount == 0: - PrintEncounterHeaders("\n") - PrintEncounterHeaders(headerStructTable[group][label]["headerType"]) - - PrintEncounterHeaders(tabStr + "{") - - for stat in headerStructTable[group][label]: - mapData = headerStructTable[group][label][stat] - - if stat == "mapGroup": - PrintEncounterHeaders(f"{TabStr(2)}.mapGroup = {GetMapGroupEnum(mapData)},") - elif stat == "mapNum": - PrintEncounterHeaders(f"{TabStr(2)}.mapNum = {GetMapGroupEnum(mapData, labelCount + 1)},") - - if type(headerStructTable[group][label][stat]) == list: - PrintEncounterHeaders(f"{TabStr(2)}.encounterTypes =") - PrintEncounterHeaders(TabStr(2) + "{") - - timeCounter = 0 - while timeCounter < TIMES_OF_DAY_COUNT: - monInfo = headerStructTable[group][label][stat][timeCounter] - PrintEncounterHeaders(f"{TabStr(3)}[{TIME_OF_DAY.vals[timeCounter]}] = ") - - infoIndex = 0 - while infoIndex < len(fieldData): - if infoIndex == 0: - PrintEncounterHeaders(TabStr(3) + "{") - - if len(monInfo) == 0: - PrintEncounterHeaders(f"{TabStr(4)}{GetIMonInfoStringFromIndex(infoIndex)} = NULL,") - else: - PrintEncounterHeaders(f"{TabStr(4)}{GetIMonInfoStringFromIndex(infoIndex)} = {monInfo[infoIndex]},") - - if infoIndex == len(fieldData) - 1: - PrintEncounterHeaders(TabStr(3) + "},") - - infoIndex += 1 - timeCounter += 1 - PrintEncounterHeaders(TabStr(2) + "},") - PrintEncounterHeaders(tabStr + "},") - - if labelCount + 1 == headerStructTable[group][label]["encounterTotalCount"]: - PrintEncounterHeaders(tabStr + "{") - PrintEncounterHeaders(f"{TabStr(2)}.mapGroup = {GetMapGroupEnum(MAP_UNDEFINED)},") - PrintEncounterHeaders(f"{TabStr(2)}.mapNum = {GetMapGroupEnum(MAP_UNDEFINED, labelCount + 1)},") - - nullCount = 0 - while nullCount < TIMES_OF_DAY_COUNT: - if nullCount == 0: - PrintEncounterHeaders(f"{TabStr(2)}.encounterTypes =") - PrintEncounterHeaders(TabStr(2)+ "{") - - PrintEncounterHeaders(f"{TabStr(3)}[{TIME_OF_DAY.vals[nullCount]}] = ") - - nullIndex = 0 - while nullIndex <= len(fieldData) - 1: - if nullIndex == 0: - PrintEncounterHeaders(TabStr(3) + "{") - - PrintEncounterHeaders(f"{TabStr(4)}{GetIMonInfoStringFromIndex(nullIndex)} = NULL,") - - if nullIndex == len(fieldData) - 1: - PrintEncounterHeaders(TabStr(3) + "},") - - nullIndex += 1 - nullCount += 1 - PrintEncounterHeaders(TabStr(2) + "},") - PrintEncounterHeaders(tabStr + "},") - labelCount += 1 - groupCount += 1 - PrintEncounterHeaders("};") - - -def GetWildMonHeadersLabel(): - return f"{baseStruct}{structHeader} {MON_HEADERS[headerIndex]}{structHeader}s{structArrayAssign}" + "\n{" - - -def PrintEncounterHeaders(content): - if printEncounterHeaders: - print(content) - - -def PrintEncounterRateMacros(): - if not printEncounterRateMacros: - return - - fieldCounter = 0 - while fieldCounter < len(fieldData): - tempName = fieldData[fieldCounter]["name"].upper() - if "groups" not in fieldData[fieldCounter]: - rateCount = 0 - if fieldData[fieldCounter]["encounter_rates"]: - for percent in fieldData[fieldCounter]["encounter_rates"]: - if not DEXNAV_ENABLED and tempName == "HIDDEN_MONS": - break - - if rateCount == 0: - print(f"{define} {ENCOUNTER_CHANCE}_{tempName}_{SLOT}_{rateCount} {percent}") - else: - print( - f"{define} {ENCOUNTER_CHANCE}_{tempName}_{SLOT}_{rateCount} {ENCOUNTER_CHANCE}_{tempName}_{SLOT}_{rateCount - 1} + {percent}" - ) - - if rateCount + 1 == len(fieldData[fieldCounter]["encounter_rates"]): - print( - f"{define} {ENCOUNTER_CHANCE}_{tempName}_{TOTAL} ({ENCOUNTER_CHANCE}_{tempName}_{SLOT}_{rateCount})" - ) - - rateCount += 1 - else: - rates = fieldData[fieldCounter]["encounter_rates"] - groups = fieldData[fieldCounter]["groups"] - - for method in groups: - method_indices = groups[method] - if not method_indices: - continue - for i, methodPercentIndex in enumerate(method_indices): - if methodPercentIndex < 0 or methodPercentIndex >= len(rates): - print(f"#error Invalid fishing encounter rate index {methodPercentIndex} for {method.upper()}") +class Config: + def __init__(self, config_file_name, rtc_constants_file_name, encounters_json_data): + self.times_of_day = None + self.mon_types = None + self.time_encounters = None + self.disable_time_fallback = None + self.time_fallback = None + + self.ParseTimeEnum(rtc_constants_file_name) + if self.times_of_day == None: + raise Exception(f"Failed to parse 'enum TimeOfDay' in '{rtc_constants_file_name}'") + + self.ParseMonTypes(encounters_json_data) + if self.mon_types == None: + raise Exception("No fields defined in 'wild_encounters.json'") + + with open(config_file_name, 'r') as config_file: + lines = config_file.readlines() + for line in lines: + self.ParseTimeConfig(line) + + if self.time_encounters == None: + raise Exception("OW_TIME_OF_DAY_ENCOUNTERS not defined.") + if self.disable_time_fallback == None: + raise Exception("OW_TIME_OF_DAY_DISABLE_FALLBACK not defined.") + if self.time_fallback == None: + raise Exception("OW_TIME_OF_DAY_FALLBACK not defined.") + + def ParseTimeEnum(self, rtc_constants_file_name): + with open(rtc_constants_file_name, 'r') as rtc_constants_file: + DEFAULT_TIME_PAT = re.compile(r"enum\s+TimeOfDay\s*\{(?P[\s*\w+,\=\d*]+)\s*\}\s*\;") + file = rtc_constants_file.read() + + m = DEFAULT_TIME_PAT.search(file) + if m: + txt = m.group('rtc_val') + values = re.findall(r'TIME_\w+', txt) + self.times_of_day = {} + for value in values: + self.times_of_day[value] = value.title().replace("Time_", "").replace("_", "") + + def ParseMonTypes(self, encounters_json_data): + for group in encounters_json_data["wild_encounter_groups"]: + if "fields" in group: + for field in group["fields"]: + field_type = field["type"] + if not self.mon_types: + self.mon_types = [] + self.mon_types.append(field_type) + + def ParseTimeConfig(self, line): + m = re.search(r'#define OW_TIME_OF_DAY_ENCOUNTERS\s+(\w+)', line) + if m: + self.time_encounters = m.group(1) == "TRUE" + + m = re.search(r'#define OW_TIME_OF_DAY_DISABLE_FALLBACK\s+(\w+)', line) + if m: + self.disable_time_fallback = m.group(1) == "TRUE" + + m = re.search(r'#define OW_TIME_OF_DAY_FALLBACK\s+(\w+)', line) + if m: + self.time_fallback = m.group(1) + + +class WildEncounterAssembler: + def __init__(self, output_file, json_data, config): + self.output_file = output_file + self.json_data = json_data + self.config = config + + def WriteLine(self, line="", indents = 0): + self.output_file.write(4 * indents * " " + line + "\n") + + def WriteHeader(self): + self.WriteLine("//") + self.WriteLine("// DO NOT MODIFY THIS FILE! It is auto-generated by tools/wild_encounters/wild_encounters_to_header.py") + self.WriteLine("//") + self.output_file.write("\n\n") + + def WriteMacro(self, macro, value): + self.output_file.write("#define " + macro + " " + value + "\n") + + def WriteMacros(self): + wild_encounter_groups = self.json_data["wild_encounter_groups"] + for wild_encounter_group in wild_encounter_groups: + if "fields" in wild_encounter_group: + fields = wild_encounter_group["fields"] + for field in fields: + field_type = field["type"] + macro_base = "ENCOUNTER_CHANCE_" + field_type.upper() + previous_group = None + previous_macro = None + encounter_rates = field["encounter_rates"] + + group_name_mapping = len(encounter_rates) * [""] + if "groups" in field: + groups = field["groups"] + for group_name, indices in groups.items(): + for index in indices: + group_name_mapping[index] = "_" + group_name.upper() + + for idx, rate in enumerate(encounter_rates): + macro_name = macro_base + group_name_mapping[idx] + "_SLOT_" + str(idx) + macro_value = str(rate) + if previous_group == group_name_mapping[idx]: + macro_value = "(" + previous_macro + " + " + macro_value + ")" + elif idx > 0: + macro_total_name = macro_base + group_name_mapping[idx - 1] + "_TOTAL" + self.WriteMacro(macro_total_name, "(" + previous_macro + ")") + self.WriteMacro(macro_name, macro_value) + previous_group = group_name_mapping[idx] + previous_macro = macro_name + if idx == len(encounter_rates) - 1: + macro_total_name = macro_base + group_name_mapping[idx] + "_TOTAL" + self.WriteMacro(macro_total_name, "(" + previous_macro + ")") + macro_total_name = macro_base + group_name_mapping[-1] + "_TOTAL" + self.WriteLine() + + def WriteMonInfos(self, name, mons, encounter_rate): + info_name = name + "Info" + self.WriteLine(f"const struct WildPokemon {name}[] =") + self.WriteLine("{") + for mon in mons: + species = mon["species"] + min_level = 2 if "min_level" not in mon else mon["min_level"] + max_level = 100 if "max_level" not in mon else mon["max_level"] + self.WriteLine(f"{{ {min_level}, {max_level}, {species} }},", 1) + + self.WriteLine("};") + self.WriteLine() + self.WriteLine(f"const struct WildPokemonInfo {info_name} = {{ {encounter_rate}, {name} }};") + self.WriteLine() + + def WriteTerminator(self): + self.WriteLine("{", 1) + self.WriteLine(".mapGroup = MAP_GROUP(MAP_UNDEFINED),", 2) + self.WriteLine(".mapNum = MAP_NUM(MAP_UNDEFINED),", 2) + self.WriteLine(".encounterTypes =", 2) + self.WriteLine("{", 2) + for time in self.config.times_of_day: + if not self.config.time_encounters and time != self.config.time_fallback: + continue + self.WriteLine(f"[{time}] =", 3) + self.WriteLine("{", 3) + for mon_type in self.config.mon_types: + member_name = mon_type.title().replace("_", "") + member_name = member_name[0].lower() + member_name[1:] + "Info" + self.WriteLine(f".{member_name} = NULL,", 4) + self.WriteLine("},", 3) + self.WriteLine("},", 2) + self.WriteLine("},", 1) + + def WritePokemonHeaders(self, headers): + label = headers["label"] + self.WriteLine(f"const struct WildPokemonHeader {label}[] =") + self.WriteLine("{") + for shared_label in headers["data"]: + self.WriteLine() + map_data = headers["data"][shared_label] + encounter_data = map_data + map_group = map_data["mapGroup"] + map_num = map_data["mapNum"] + version = "EMERALD" + if "FireRed" in shared_label: + version = "FIRERED" + elif "LeafGreen" in shared_label: + version = "LEAFGREEN" + + self.WriteLine(f"#ifdef {version}") + + self.WriteLine("{", 1) + self.WriteLine(f".mapGroup = {map_group},", 2) + self.WriteLine(f".mapNum = {map_num},", 2) + self.WriteLine(".encounterTypes =", 2) + self.WriteLine("{", 2) + for time in self.config.times_of_day: + if not self.config.time_encounters and time != self.config.time_fallback: + continue + self.WriteLine(f"[{time}] =", 3) + self.WriteLine("{", 3) + for mon_type in self.config.mon_types: + member_name = mon_type.title().replace("_", "") + member_name = member_name[0].lower() + member_name[1:] + "Info" + value = "NULL" + if time in encounter_data and mon_type in encounter_data[time]: + value = encounter_data[time][mon_type] + if value != "NULL": + value = "&" + value + self.WriteLine(f".{member_name} = {value},", 4) + + self.WriteLine("},", 3) + + self.WriteLine("},", 2) + self.WriteLine("},", 1) + self.WriteLine(f"#endif") + self.WriteTerminator() + self.WriteLine("};") + + + def WriteEncounters(self): + wild_encounter_groups = self.json_data["wild_encounter_groups"] + for wild_encounter_group in wild_encounter_groups: + headers = {} + headers["label"] = wild_encounter_group["label"] + headers["data"] = {} + for_maps = False + map_num_counter = 1 + if "for_maps" in wild_encounter_group: + for_maps = wild_encounter_group["for_maps"] + encounters = wild_encounter_group["encounters"] + + for map_encounters in encounters: + map_group = "0" + map_num = str(map_num_counter) + if for_maps: + map_name = map_encounters["map"] + map_group = f"MAP_GROUP({map_name})" + map_num = f"MAP_NUM({map_name})" + map_num_counter += 1 + base_label = map_encounters["base_label"] + shared_label = base_label + time = self.config.time_fallback + + for time_ident in self.config.times_of_day: + if self.config.times_of_day[time_ident] in base_label: + time = time_ident + shared_label = shared_label.replace('_' + self.config.times_of_day[time_ident], '') + + if shared_label not in headers["data"]: + headers["data"][shared_label] = {} + if time not in headers["data"][shared_label]: + headers["data"][shared_label][time] = {} + headers["data"][shared_label]["mapGroup"] = map_group + headers["data"][shared_label]["mapNum"] = map_num + + version = "EMERALD" + if "FireRed" in shared_label: + version = "FIRERED" + elif "LeafGreen" in shared_label: + version = "LEAFGREEN" + self.WriteLine(f"#ifdef {version}") + for mon_type in self.config.mon_types: + if mon_type not in map_encounters: + headers["data"][shared_label][mon_type] = "NULL" continue - rate_value = rates[methodPercentIndex] - if i == 0: - print(f"{define} {ENCOUNTER_CHANCE}_{tempName}_{method.upper()}_{SLOT}_{methodPercentIndex} {rate_value}") - else: - previous_method_index = method_indices[i - 1] - print(f"{define} {ENCOUNTER_CHANCE}_{tempName}_{method.upper()}_{SLOT}_{methodPercentIndex} {ENCOUNTER_CHANCE}_{tempName}_{method.upper()}_{SLOT}_{previous_method_index} + {rate_value}") - - if i == len(method_indices) - 1: - print(f"{define} {ENCOUNTER_CHANCE}_{tempName}_{method.upper()}_{TOTAL} ({ENCOUNTER_CHANCE}_{tempName}_{method.upper()}_{SLOT}_{methodPercentIndex})") - - fieldCounter += 1 - print() - - -def GetTimeLabelFromString(string): - time = "TIME" - time_ = "TIME_" - - if string == "TIMES_OF_DAY_COUNT": - return string - - if time_ in string.upper(): - return string[len(time_):len(string)] - elif time in string.upper(): - return string[len(time):len(string)] - return string - - -def GetIMonInfoStringFromIndex(index): - return fieldData[index]["infoStringBase"] - - -def GetMapGroupEnum(string, index = 0): - if "MAP_" in string and index == 0: - return "MAP_GROUP(" + string + ")" - elif "MAP_" in string and index != 0: - return "MAP_NUM(" + string + ")" - return index - - -""" -get copied lhea :^ ) -- next four functions copied almost verbatim from @lhearachel's python scripts in tools/learnset_helpers -""" -def PrintGeneratedWarningText(): - print("//") - print("// DO NOT MODIFY THIS FILE! It is auto-generated by tools/wild_encounters/wild_encounters_to_header.py") - print("//") - print("\n") - - -def IsConfigEnabled(): - CONFIG_ENABLED_PAT = re.compile(r"#define OW_TIME_OF_DAY_ENCOUNTERS\s+(?P[^ ]*)") - - with open("./include/config/overworld.h", "r") as overworld_config_file: - config_overworld = overworld_config_file.read() - config_setting = CONFIG_ENABLED_PAT.search(config_overworld) - return config_setting is not None and config_setting.group("cfg_val") in ("TRUE", "1") - - -def IsDexnavEnabled(): - CONFIG_ENABLED_PAT = re.compile(r"#define DEXNAV_ENABLED\s+(?P[^ ]*)") - - with open("./include/config/dexnav.h", "r") as overworld_config_file: - config_overworld = overworld_config_file.read() - config_setting = CONFIG_ENABLED_PAT.search(config_overworld) - return config_setting is not None and config_setting.group("cfg_val") in ("TRUE", "1") - + mons_entry = map_encounters[mon_type] + encounter_rate = mons_entry["encounter_rate"] + mons = mons_entry["mons"] -def GetTimeEnum(): - DEFAULT_TIME_PAT = re.compile(r"enum\s+TimeOfDay\s*\{(?P[\s*\w+,\=\d*]+)\s*\}\s*\;") + mon_array_name = base_label + "_" + mon_type.title().replace("_", "") + self.WriteMonInfos(mon_array_name, mons, encounter_rate) + headers["data"][shared_label][time][mon_type] = mon_array_name + "Info" + self.WriteLine(f"#endif") - with open("./include/constants/rtc.h", "r") as rtc_include_file: - include_rtc = rtc_include_file.read() - include_enum = DEFAULT_TIME_PAT.search(include_rtc) - return include_enum.group("rtc_val") + self.WritePokemonHeaders(headers) -def CheckEmpty(string): - return string == "" or string.isspace() or string == "\n" +def ConvertToHeaderFile(json_data): + with open('src/data/wild_encounters.h', 'w') as output_file: + config = Config('include/config/overworld.h', 'include/constants/rtc.h', json_data) + assembler = WildEncounterAssembler(output_file, json_data, config) + assembler.WriteHeader() + assembler.WriteMacros() + assembler.WriteEncounters() - -def SetupUserTimeEnum(timeOfDay): - enum_string = GetTimeEnum() - enum_string = enum_string.split(",") - - # check for extra element from trailing comma - if CheckEmpty(enum_string[-1]): - enum_string.pop(-1) - - # we don't need the `TIMES_OF_DAY_COUNT` value, so - 1 from the value of len(enum_string) - strCount = 0 - while strCount < len(enum_string) - 1: - tempStr = enum_string[strCount].strip("\n ") - - """ - we need to ignore any value assignments, as the times will need to correspond - with the elements in the array. - """ - if "=" in tempStr: - tempStr = tempStr[0:tempStr.index("=")] - tempStr = tempStr.strip(" ") - - #double check we didn't catch any empty values - if not CheckEmpty(enum_string[strCount]): - timeOfDay.add(tempStr) - - strCount += 1 - return timeOfDay - - -def TabStr(amount): - return tabStr * amount - - -def GetPascalCase(string): - stringArray = string.split("_") - pascalString = "" - - for string in stringArray: - pascalString += string.capitalize() - return pascalString - - -def GetSnakeCase(string): - stringArray = string.split("_") - snakeString = "" - - i = 0 - for string in stringArray: - if i == 0: - snakeString += string - else: - snakeString += string.capitalize() - - i += 1 - return snakeString - - -def CheckFieldDataDupes(name): - for field in fieldData: - if field["name"] == name: - return True - return False - - -def AddFieldData(index, fieldType, fieldRates): - fieldData.append({}) - fieldData[index]["name"] = fieldType - fieldData[index]["pascalName"] = GetPascalCase(fieldType) - fieldData[index]["snakeName"] = GetSnakeCase(fieldType) - fieldData[index]["encounter_rates"] = fieldRates +def main(): + with open('src/data/wild_encounters.json', 'r') as json_file: + json_data = json.load(json_file) + ConvertToHeaderFile(json_data) -def main(): - pass - - -if __name__ == "__main__": - ImportWildEncounterFile() - - -""" -!!!! EXAMPLE OUTPUT !!!! -- when OW_TIME_OF DAY_ENCOUNTERS is FALSE in configoverworld.h - -#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_0 20 -#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_1 ENCOUNTER_CHANCE_LAND_MONS_SLOT_0 + 20 -#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_2 ENCOUNTER_CHANCE_LAND_MONS_SLOT_1 + 10 -#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_3 ENCOUNTER_CHANCE_LAND_MONS_SLOT_2 + 10 -#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_4 ENCOUNTER_CHANCE_LAND_MONS_SLOT_3 + 10 -#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_5 ENCOUNTER_CHANCE_LAND_MONS_SLOT_4 + 10 -#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_6 ENCOUNTER_CHANCE_LAND_MONS_SLOT_5 + 5 -#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_7 ENCOUNTER_CHANCE_LAND_MONS_SLOT_6 + 5 -#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_8 ENCOUNTER_CHANCE_LAND_MONS_SLOT_7 + 4 -#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_9 ENCOUNTER_CHANCE_LAND_MONS_SLOT_8 + 4 -#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_10 ENCOUNTER_CHANCE_LAND_MONS_SLOT_9 + 1 -#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_11 ENCOUNTER_CHANCE_LAND_MONS_SLOT_10 + 1 -#define ENCOUNTER_CHANCE_LAND_MONS_TOTAL (ENCOUNTER_CHANCE_LAND_MONS_SLOT_11) -#define ENCOUNTER_CHANCE_WATER_MONS_SLOT_0 60 -#define ENCOUNTER_CHANCE_WATER_MONS_SLOT_1 ENCOUNTER_CHANCE_WATER_MONS_SLOT_0 + 30 -#define ENCOUNTER_CHANCE_WATER_MONS_SLOT_2 ENCOUNTER_CHANCE_WATER_MONS_SLOT_1 + 5 -#define ENCOUNTER_CHANCE_WATER_MONS_SLOT_3 ENCOUNTER_CHANCE_WATER_MONS_SLOT_2 + 4 -#define ENCOUNTER_CHANCE_WATER_MONS_SLOT_4 ENCOUNTER_CHANCE_WATER_MONS_SLOT_3 + 1 -#define ENCOUNTER_CHANCE_WATER_MONS_TOTAL (ENCOUNTER_CHANCE_WATER_MONS_SLOT_4) -#define ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_0 60 -#define ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_1 ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_0 + 30 -#define ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_2 ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_1 + 5 -#define ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_3 ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_2 + 4 -#define ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_4 ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_3 + 1 -#define ENCOUNTER_CHANCE_ROCK_SMASH_MONS_TOTAL (ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_4) -#define ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_2 60 -#define ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_3 ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_2 + 20 -#define ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_4 ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_3 + 20 -#define ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_TOTAL (ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_4) -#define ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_SLOT_0 70 -#define ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_SLOT_1 ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_SLOT_0 + 30 -#define ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_TOTAL (ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_SLOT_1) -#define ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_5 40 -#define ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_6 ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_5 + 40 -#define ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_7 ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_6 + 15 -#define ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_8 ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_7 + 4 -#define ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_9 ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_8 + 1 -#define ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_TOTAL (ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_9) - -- if DEXNAV_ENABLED is TRUE -- these macros are 1 and 0, respectively if hidden_mons isn't in the encounter - rate list at the top of wild_encounters.json -#define ENCOUNTER_CHANCE_HIDDEN_MONS_SLOT_0 1 -#define ENCOUNTER_CHANCE_HIDDEN_MONS_SLOT_1 ENCOUNTER_CHANCE_HIDDEN_MONS_SLOT_0 + 0 -#define ENCOUNTER_CHANCE_HIDDEN_MONS_TOTAL (ENCOUNTER_CHANCE_HIDDEN_MONS_SLOT_1) - -const struct WildPokemon gRoute101_LandMons_Day[] = -{ - { 2, 2, SPECIES_WURMPLE }, - { 2, 2, SPECIES_POOCHYENA }, - { 2, 2, SPECIES_WURMPLE }, - { 3, 3, SPECIES_WURMPLE }, - { 3, 3, SPECIES_POOCHYENA }, - { 3, 3, SPECIES_POOCHYENA }, - { 3, 3, SPECIES_WURMPLE }, - { 3, 3, SPECIES_POOCHYENA }, - { 2, 2, SPECIES_ZIGZAGOON }, - { 2, 2, SPECIES_ZIGZAGOON }, - { 3, 3, SPECIES_ZIGZAGOON }, - { 3, 3, SPECIES_ZIGZAGOON }, -}; - -const struct WildPokemonInfo gRoute101_Day_LandMonsInfo= { 20, gRoute101_Day_LandMons }; -const struct WildPokemonHeader gWildMonHeaders[] = -{ - { - .mapGroup = MAP(ROUTE101), - .mapNum = MAP_NUM(ROUTE101), - .encounterTypes = - [OW_TIME_OF_DAY_DEFAULT] = - { - .landMonsInfo = &gRoute101_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - .hiddenMonsInfo = NULL, - } - }, -} -""" +if __name__ == '__main__': + main() diff --git a/trainer_rules.mk b/trainer_rules.mk new file mode 100644 index 000000000000..c5df373a1e46 --- /dev/null +++ b/trainer_rules.mk @@ -0,0 +1,10 @@ +# party files are run through trainerproc, which is a tool that converts party data to an output file +# matching the current trainer .h formatting + +AUTO_GEN_TARGETS += src/data/trainers.h +AUTO_GEN_TARGETS += src/data/battle_partners.h +AUTO_GEN_TARGETS += test/battle/trainer_control.h +AUTO_GEN_TARGETS += src/data/debug_trainers.h + +%.h: %.party + $(CPP) $(CPPFLAGS) -traditional-cpp - < $< | $(TRAINERPROC) -o $@ -i $< -